[
  {
    "path": ".acrolinx-config.edn",
    "content": "{:allowed-branchname-matches [\"main\" \"master\" \"release-.*\"]\n :allowed-filename-matches [\"articles\" \"includes\" \"javascript\"]}\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto\n\n# Explicitly declare text files you want to always be normalized and converted\n# to native line endings on checkout.\n*.c text\n*.h text\n\n# Include Markdown in the GitHub language breakdown statistics\n*.md linguist-detectable\n\n# Denote all files that are truly binary and should not be modified.\n*.gif   binary\n*.ico   binary\n*.jpg   binary\n*.png   binary\n\n# Declare files that will always have CRLF line endings on checkout.\n*.sln text eol=crlf\n"
  },
  {
    "path": ".github/copilot-instructions.md",
    "content": "---\nms.author: johalexander\nms.date: 09/05/2025\ntitle: Copilot Instructions\napplyTo: \"articles/**/*.md\"\n---\n\n# Copilot Instructions\n\nThis file provides central guidance for Copilot in this repository.\n\nThe Azure Developer Experiences documentation repository contains Microsoft's technical\ndocumentation for application development using Microsoft Azure that publishes to Microsoft Learn. This is a documentation-only repository using Microsoft's OpenPublishing platform with DocFX for building content.\n\n\n\n## Referenced Instruction Files\n\n- [.github/instructions/rust-instructions.md](.github/instructions/rust-instructions.md)\n- [.github/instructions/azd-schema-instructions.md](.github/instructions/azd-schema-instructions.md)\n- [.github/instructions/java-instructions.md](.github/instructions/java-instructions.md)\n- [.github/instructions/java-sample-guidelines.md](.github/instructions/java-sample-guidelines.md)\n\n## Disclosure\n\nFor any Markdown files generated by AI, always disclose that they were created with the assistance of AI. Add the following frontmatter key/value pair:\n\n```markdown\nai-usage: ai-generated\n```\n\n## Writing Style\n\nFollow [Microsoft Writing Style Guide](https://learn.microsoft.com/en-us/style-guide/welcome/) with these specifics:\n\n### Voice and Tone\n\n- Active voice, second person addressing reader directly.\n- Conversational tone with contractions.\n- Present tense for instructions/descriptions.\n- Imperative mood for instructions (\"Call the method\" not \"You should call the method\").\n- Use \"might\" instead of \"may\" for possibility.\n- Use \"can\" instead of \"may\" for permissible actions.\n- Avoid \"we\"/\"our\" referring to documentation authors or product teams.\n\n### Structure and Format\n\n- Sentence case headings (no gerunds in titles).\n- Be concise, break up long sentences.\n- Oxford comma in lists.\n- Use bullets for unordered lists.\n- Number all ordered list items as \"1.\" (not sequential numbering like \"1.\", \"2.\", \"3.\", etc.)\n- Ordered and unordered lists should use complete sentences with proper punctuation, ending with a period if it's more than three words.\n- Avoid \"etc.\" or \"and so on\" - provide complete lists or use \"for example\".\n- Use \"for example\" instead of \"e.g.\".\n- Use \"that is\" instead of \"i.e.\".\n- No consecutive headings without content between them.\n\n### Formatting Conventions\n\n- **Bold** for UI elements.\n- `Code style` for file names, folders, custom types, non-localizable text.\n- Raw URLs in angle brackets.\n- Use relative links for files in this repo.\n- Remove `https://learn.microsoft.com/en-us` from learn.microsoft.com links.\n\n## File Naming\n\nNew Markdown files: lowercase with hyphens, omit filler words (the, a, etc.).\n\n## General Guidance\n\n- Always check for and follow the latest instructions in `.github/instructions/`.\n- Do not change the meaning of the original content unless explicitly instructed.\n\n---\n\n_Note: Add new instruction files to `.github/instructions/` and reference them under Referenced Instruction Files as needed._\n"
  },
  {
    "path": ".github/instructions/azd-schema-instructions.md",
    "content": "---\napplyTo: \"articles/azure-developer-cli/azd-schema.md\"\n---\n\n# azure.yaml schema documentation conventions\n\nThis instruction file defines the structure and conventions for the `azd-schema.md` reference page. Follow these rules when updating the page to ensure incremental, non-destructive edits.\n\n## Source of truth\n\nThe JSON schema published at <https://aka.ms/azure.yaml.json> (source: `https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json`) is the single source of truth. All property names, types, descriptions, enum values, and defaults in the documentation must match the schema.\n\nA local copy is kept at `articles/azure-developer-cli/source-schema.json` to serve as a baseline for diffing against newer versions.\n\n## Update workflow\n\n1. Fetch the latest schema from `https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json`.\n1. Diff it against the local `articles/azure-developer-cli/source-schema.json` to identify changes (added properties, removed enum values, updated descriptions, new definitions).\n1. Apply only the corresponding targeted edits to `azd-schema.md`. Don't regenerate the entire file.\n1. Replace `source-schema.json` with the fetched version so it stays current for future diffs.\n1. Preserve all existing structure, heading hierarchy, and section ordering.\n\n## Page structure (do not reorder)\n\n1. Frontmatter (YAML)\n1. H1: title\n1. Intro paragraph with template link and schema link\n1. `## Sample` — introductory YAML examples\n1. `## Top-level properties` — summary table with anchor links\n1. One `## {propertyName}` section per top-level property, in the order they appear in the schema's `properties` object: `name`, `resourceGroup`, `metadata`, `infra`, `services`, `resources`, `pipeline`, `hooks`, `requiredVersions`, `state`, `platform`, `workflows`, `cloud`\n1. Within `## services`, include `#### docker` and `#### k8s` subsections for the shared Docker and AKS definitions (from the schema's `definitions` section). These are service-level properties nested under `### Service properties`, not top-level.\n1. Include footer and `## Next steps`\n\n## Section template\n\nEvery property section follows this exact pattern:\n\n````markdown\n## `{propertyName}`\n\n_(type, required/optional)_ {Description from schema, verbatim or minimally adapted for grammar.}\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `{childProp}` | Y/N/Conditional | {type} | {Description}. Default: `{value}`. Allowed values: `a`, `b`. |\n\n> [!NOTE]\n> {Conditional constraint note, if applicable.}\n\n### {Sub-section for nested objects}\n\n{Same table pattern.}\n\n### {propertyName} samples (if examples exist)\n\n```yaml\n{YAML example}\n```\n````\n\n## Table conventions\n\n- Column order: Property, Required, Type, Description.\n- Use `Y`, `N`, or `Conditional` in the Required column.\n- Include `Default: {value}.` at the end of the description when a default exists.\n- Include `Allowed values: {comma-separated list}.` at the end of the description when an enum exists.\n- Use `array of strings` for `{ \"type\": \"array\", \"items\": { \"type\": \"string\" } }`.\n- Use `object` for complex nested types, with a \"See [link](#anchor)\" reference.\n- Don't add a Type column entry for `$ref` — resolve the reference and document inline or link to the definition section.\n\n## Description conventions\n\n- Use schema `description` text verbatim when possible.\n- Adapt only for grammar (for example, sentence fragments become complete sentences).\n- Replace \"e.g.\" with \"for example\" and \"i.e.\" with \"that is\".\n- Don't paraphrase or rewrite descriptions that are already clear.\n- Use \"can't\" not \"cannot\", contractions per Microsoft style guide.\n\n## Conditional schema (allOf/if/then) conventions\n\n- Document constraints as `> [!NOTE]` blocks below the relevant table.\n- For host-type applicability, use the \"Host types\" matrix table.\n- For resource-type applicability, use the \"Resource types\" table with a link to sub-sections.\n- State constraints in plain language: \"When `host` is `containerapp`, you must provide either `image` or `project`, but not both.\"\n\n## YAML examples\n\n- Include one YAML code block per section, showing the property in context.\n- Use realistic but generic values (not placeholder `xxx`).\n- Keep examples minimal — show the property being documented plus necessary parent structure.\n- Use `yaml` as the code fence language.\n\n## What NOT to change during updates\n\n- Frontmatter fields other than `ms.date` (update the date on each edit).\n- The intro paragraph and Sample section (unless the schema `title` or `description` changes).\n- Section ordering.\n- The `## Next steps` section.\n- Cross-reference links to other docs (for example, `azd-extensibility.md`).\n"
  },
  {
    "path": ".github/instructions/java-instructions.md",
    "content": "---\nms.author: karler\nms.date: 03/31/2026\ntitle: Copilot Instructions for Java on Azure\ndescription: \"Central instructions for Copilot tasks for Java on Azure content.\"\napplyTo: \"articles/java/**/*.md\"\n---\n\n# Copilot instructions for all Java language content\n\nUse the following instructions when creating, editing, or reviewing articles that include the Java programming language.\n\n## Product and feature naming\n\n- **GitHub Copilot modernization** is the correct product name (lowercase \"modernization\"). The old name \"GitHub Copilot app modernization\" is deprecated. The folder `articles/github-copilot-app-modernization` retains \"app\" for URL stability, but all content must use the current name.\n- **Spring Cloud Azure** is the product name for the Spring integration libraries documented in `articles/java/spring-framework`. Don't confuse with \"Spring Cloud\" (a third-party product unrelated to Azure).\n- **Azure SDK for Java** is the full name on first reference. Subsequent references can use \"the SDK\" or \"the Java SDK\" when unambiguous.\n- **Microsoft Build of OpenJDK** is the full product name for Microsoft's JDK distribution.\n\n## JDK version guidance\n\n- Target **Java 21** (current LTS) as the recommended baseline for new content.\n- Don't introduce Java 8 or Java 11 as prerequisites in new articles unless specifically required by the service or scenario.\n- When an article must reference older Java versions, note the relevant end-of-support timelines and recommend upgrading.\n- Java 25 is the current latest release. New content should prefer Java 21 LTS but can target Java 25 where appropriate.\n- For PRs that update articles targeting pre-Java 21 versions, suggest considering an update to Java 21+ but don't block the PR on it.\n- Every article with Java prerequisites must explicitly list the minimum Java version in the **Prerequisites** section (for example, \"Java 21 or later\"). Don't assume the reader will infer the version from other context.\n\n## Authentication and identity\n\n- Prefer `DefaultAzureCredential` over other credential types unless the article specifically covers an alternative authentication flow.\n- Prefer Azure Identity over connection strings, keys, or other non-identity-based authentication.\n- Use Azure Key Vault for secrets management rather than hardcoding or environment variables where feasible.\n\n## Spring Boot version guidance\n\n- Target **Spring Boot 3.x** (current latest) for new content. Spring Boot 3.x requires Java 17+, which aligns with the Java 21 baseline.\n- Don't introduce Spring Boot 2.7.x in new articles — it reached end of OSS support in November 2023. When an existing article references Spring Boot 2.7.x, note the end-of-support status and suggest upgrading.\n- For PRs that update Spring Boot 2.7.x articles, suggest considering an update to Spring Boot 3.x but don't block the PR on it.\n- When an article targets a specific Spring Boot version, document the minimum Java version in the **Prerequisites** section:\n\n  | Spring Boot | Minimum Java | Recommended |\n  | --- | --- | --- |\n  | 3.2.x, 3.1.x, 3.0.x | Java 17 | Java 17 or 21 |\n  | 2.7.x (end-of-life) | Java 8 | Java 11 or 17 |\n\n## Spring Cloud Azure conventions\n\n- Spring Cloud Azure packages use the group ID `com.azure.spring`.\n- Starter artifact IDs follow the pattern `spring-cloud-azure-starter-<service>`, for example `spring-cloud-azure-starter-storage-blob`.\n- Always reference the Spring Cloud Azure BOM (`spring-cloud-azure-dependencies`) for dependency management rather than specifying individual library versions.\n\n## Code samples\n\n- When reviewing or creating Java code samples, also follow guidelines in [java-sample-guidelines.md](java-sample-guidelines.md).\n\n## Metadata\n\n- The `title` metadata value in YAML front matter uses **title capitalization** (capitalize principal words). This is distinct from content headings (H1–H6), which use **sentence capitalization** per Learn style guide.\n- Ensure `ms.custom` includes `devx-track-java` for all Java articles.\n- AI-related Java articles (content *about* AI) should have `ms.update-cycle: 180-days`, except in `articles/github-copilot-app-modernization/` where this value is inherited from `articles/docfx.json`.\n\n## AI-usage metadata\n\n- `ai-usage: ai-generated` — for articles or code entirely produced by AI.\n- `ai-usage: ai-assisted` — for articles or code where AI contributed but a human made key decisions (for example, an AI-generated Java version of a human-written JavaScript sample).\n- When reviewing PRs, if new content lacks an `ai-usage` value and appears to contain AI-generated or AI-assisted content, flag its absence so the author can choose the appropriate value.\n- An existing `ai-generated` value should not be downgraded to `ai-assisted` unless the article has been substantially rewritten by a human.\n"
  },
  {
    "path": ".github/instructions/java-sample-guidelines.md",
    "content": "---\nms.author: karler\nms.date: 03/31/2026\ntitle: Java Sample and Snippet Guidelines\ndescription: \"Guidelines for reviewing and creating Java code samples in Azure documentation.\"\napplyTo: \"articles/java/**/*.md\"\n---\n\n# Java sample and snippet guidelines\n\nUse these guidelines when reviewing or creating Java code samples, sample repo READMEs, and documentation articles. These guidelines are designed to be portable across contexts — the same guidance applies whether you're creating a Java sample, writing the sample's README, or authoring the Learn documentation that references it.\n\n## Audience and context\n\nThese guidelines apply differently depending on the output context:\n\n- **Sample repo README**: The audience is experienced Java developers who prefer minimal ceremony. A README should provide concise, complete setup instructions without exploratory discussion. Readers may discover the repo independently and follow the README instead of the corresponding documentation article.\n- **Documentation article (Learn)**: The audience is the same experienced developers, but the article provides more context, explanation, and exploration of the code. The article may walk through key code highlights, explain architectural decisions, and offer variations.\n- **PR review**: When reviewing others' Java contributions, provide rationales with suggestions. Distinguish between blocking issues (bugs, credential leaks) and best-practice suggestions.\n\nWhen generating a Java version of an existing sample in another language, these guidelines steer all three outputs: the Java code itself, the sample repo README, and the documentation article.\n\n## Shell and command conventions\n\n- Java on Azure content assumes readers are using Bash. Use `bash` as the fenced code block language label for shell commands. This implicitly supports other Bash-compatible shells (zsh, Git Bash on Windows, etc.).\n- Exception: when a code block contains any Azure CLI commands (`az ...`), use `azurecli` as the language label instead. This is an org-wide guideline for proper syntax highlighting of Azure CLI, even if the same block also contains non-CLI Bash lines.\n- Avoid PowerShell-specific syntax in command snippets. If a command must differ across shells, provide only the Bash version.\n\n## Project naming conventions\n\n- Use `com.example.<subject>` for `groupId` and package names in documentation samples. The `com.example` domain is [IANA-reserved](https://www.rfc-editor.org/rfc/rfc2606) specifically for examples, so it signals \"sample code\" unambiguously. The `<subject>` groups related samples (for example, all Azure AI Search samples could share `com.example.search`).\n- Align the Java package name to the `groupId`. For example, if `groupId` is `com.example.search`, source files should be under `src/main/java/com/example/search/` with `package com.example.search;`.\n- The `artifactId` should describe the sample concisely — for example, `vector-search-quickstart`, `rag-chatbot`, `ai-search-tutorial`. Using the article type (quickstart, tutorial, etc.) is fine when it applies, but isn't mandatory.\n- Don't use Azure SDK namespaces like `com.azure.*` for sample project coordinates. Reserve `com.azure` for actual SDK packages — using it in samples could mislead readers into thinking the sample is an official package.\n\n## Dependencies and build configuration\n\n- Use the latest non-beta versions for all dependencies in `pom.xml`. Beta SDK dependencies may be rejected or removed by content owners and can break without notice.\n- Don't use beta Azure SDK dependencies in shipped samples. If a feature requires a beta SDK, note the beta status prominently and plan to update when GA is available.\n- Keep `pom.xml` dependencies minimal. Don't add libraries that aren't used in the sample. Every additional dependency increases maintenance burden and potential version conflicts.\n- Prefer built-in JDK functionality over third-party libraries when the built-in approach is reasonable. For example, prefer `java.net.http.HttpClient` over Apache HttpClient, and prefer `SearchDocument` (dynamic map) over typed POJOs with Jackson annotations when full type safety isn't needed. When required functionality isn't built into the JDK or available through existing Azure SDK dependencies, use the most common third-party library for the task (for example, Jackson for JSON parsing). Always use the latest stable version for security and compatibility.\n- Use the Azure SDK BOM (`azure-sdk-bom`) for Azure dependency version management rather than specifying individual versions.\n- For Spring Cloud Azure projects, use the Spring Cloud Azure BOM (`spring-cloud-azure-dependencies`).\n- For single-entry-point samples, configuring `mainClass` in `exec-maven-plugin` is acceptable — it simplifies run commands to just `mvn exec:java`. For multi-entry-point samples, omit the plugin configuration and specify the entry point on each command: `mvn exec:java \"-Dexec.mainClass=...\"`. Don't configure a \"default\" entry point in multi-entry-point samples — it privileges one scenario over others.\n- Don't use interactive menus or prompts for scenario selection within a sample. Use separate entry points or command-line arguments — interactive menus add complexity, can't be scripted, and make article instructions harder to write.\n- Include `slf4j-nop` as a dependency to suppress SLF4J logging noise in console output. This keeps the actual program output clean and allows article output snippets to accurately reflect what the user sees.\n- Use standard Maven project layout (`src/main/java` for sources, `src/main/resources` for resources). Don't override `<sourceDirectory>` in the POM to use non-standard paths — it confuses IDE auto-detection and breaks developer expectations.\n- Add brief comments in `pom.xml` describing the purpose of each dependency, especially for dependencies whose purpose isn't obvious from the artifact name. For example, `<!-- Suppress noisy SDK logging -->` on `slf4j-nop` is helpful.\n\n## Repository hygiene\n\n- Never commit Java build artifacts. Include a `.gitignore` with at least the following Java-specific entries:\n\n  ```gitignore\n  target/\n  *.class\n  *.jar\n  .idea/\n  *.iml\n  ```\n\n  Non-Java content owners using AI to generate Java samples may not be familiar with Java build output conventions.\n\n- Java source files and shell scripts should use LF line endings. Include a `.gitattributes` file in the sample root with `*.java text eol=lf` and `*.sh text eol=lf` to prevent CRLF issues when contributors use Windows.\n\n## Configuration and secrets\n\n- Use `application.properties` for non-sensitive configuration (endpoints, index names, resource names).\n- Use environment variables for sensitive configuration (connection strings, keys, secrets).\n- Use `export` for all environment variables that Java code reads via `System.getenv`. The inline Bash pattern (`VAR=x command`) is valid but fragile across platforms, unfamiliar to many readers, and may not work reliably on all shells (particularly zsh on macOS). Using `export` also ensures variables persist across multiple shell windows and subsequent commands.\n- Use `System.getenv` to read environment variables. Don't use `.env` files with third-party libraries like `dotenv-java` — it adds an unnecessary dependency and introduces a non-standard configuration pattern for Azure documentation.\n- When a multi-language sample uses `azd up` (Azure Developer CLI) to provision resources and generate a `.env` file, the Java setup instructions should direct the reader to source the `.env` file into the shell environment rather than reading it in Java code. Use `set -a && source .env && set +a` — the `set -a` ensures variables are exported to child processes (including the Maven JVM), so `System.getenv` works without any code changes or additional dependencies. This approach is more robust than `export $(grep -v '^#' .env | xargs)`, which breaks on values with spaces, special characters, or empty values. In a **README**, this is typically a single step; in a **documentation article**, briefly explain what `set -a` does for readers unfamiliar with the idiom.\n- Don't hardcode service endpoints or resource names in Java source code. Always externalize them to `application.properties` or environment variables so readers can substitute their own values.\n- In `application.properties` files committed to repos, always use placeholder notation: `azure.search.endpoint=https://<your-search-service-name>.search.windows.net`. Never commit real Azure endpoints or credentials.\n\n## Code style and formatting\n\n- Use 4-space indentation for block nesting. For continuation lines (long method chains, wrapped parameter lists), 8-space (double) indentation is acceptable and is standard Java convention — it visually distinguishes continuations from new nested blocks.\n- Aim to keep lines short enough that the code block doesn't show a horizontal scrollbar. Around 80 characters is a good target, but it's a soft guideline. If one or two lines slightly exceed 80 characters, that's fine — avoid awkward splits where a long line breaks just before 80 characters leaving a very short continuation. Either keep it on one slightly longer line, or split earlier so both lines are balanced.\n- Target Java 21+ syntax conventions for new content: prefer text blocks (triple-quote `\"\"\"` for multi-line strings), `var` for local type inference when the type is obvious, records for simple data carriers, and pattern matching. Actively use these features — targeting Java 21 but writing Java 8-style code misses the pedagogical opportunity to demonstrate modern Java. Older content targeting earlier Java versions is acceptable on a case-by-case basis — if a PR updates an article that targets a pre-21 version, flag it as a suggestion to consider updating to Java 21+, but don't block the PR on it.\n- Follow standard Java naming conventions: `camelCase` for variables and methods, `PascalCase` for classes and interfaces.\n- Use descriptive, self-documenting names for methods and variables. Avoid abbreviations or cryptic naming.\n- Place `main` methods at the bottom of class definitions — they are typically thin wrappers and serve infrastructural rather than pedagogical purposes.\n- Add `System.exit(0)` at the end of `main` to avoid thread persistence warnings.\n- Avoid Unicode emoji in console output. Some terminals, CI environments, and log viewers don't render them correctly. Use plain text labels or simple ASCII formatting instead.\n\n## Code comments\n\n- Prefer self-documenting method and variable names over comments. Add code comments only for non-obvious logic, disambiguation, or security-relevant patterns.\n- Note security-relevant patterns in code comments so readers understand why the code exists — for example, why a field name is validated before interpolation into a query.\n- Javadoc comments on public methods and decorative section separators (such as `// ── Section ───`) are author's discretion. Don't flag them in reviews unless they are misleading, incorrect, or stale.\n- Don't add comments that merely restate the code (such as `// Create a Cosmos client` above `createCosmosClient()`).\n\n## Error handling\n\n- Let exceptions propagate naturally in sample code. An uncaught exception with a stack trace on the command line is more informative for the reader than a caught-and-logged exception, and avoids the visual noise of production-style try/catch blocks.\n- Use `try-with-resources` for `Closeable` resources (SDK clients, streams, connections). This is idiomatic Java, costs no extra lines, and prevents resource leaks.\n- If you do catch exceptions, never swallow them silently (`catch (Exception e) {}`). But in most sample code, catching is unnecessary — the target audience is experienced Java developers who will add their own error handling in production.\n- For sensitive operations (credential handling, irreversible actions like data deletion), a brief code comment noting potential failure modes is appropriate. Full try/catch blocks are not.\n\n## Security and input validation\n\n- When building queries from user input or environment variables, validate or parameterize inputs. Never interpolate raw strings into SQL or query expressions.\n- Note security-relevant patterns in code comments so readers understand the rationale — for example, why a field name is validated before being interpolated into a Cosmos DB SQL query. This is especially important because readers may copy code patterns without understanding the security implications.\n- Don't implement custom cryptographic operations or roll-your-own security measures in samples. For authentication and authorization, use established SDK patterns like `DefaultAzureCredential`.\n\n## Azure SDK patterns\n\n- Use the builder pattern for creating Azure SDK clients: `new <ServiceName>ClientBuilder()...buildClient()`.\n- Close or manage lifecycle of async clients appropriately.\n- Prefer synchronous clients in samples unless the article specifically covers async patterns or reactive programming.\n\n## Output formatting\n\n- Prefer `System.out.printf()` with `%n` for line terminators when formatting output with embedded variables. `System.out.println()` with simple trailing concatenation (such as `\"Connected to: \" + name`) is acceptable when there's a single variable at the end — don't enforce `printf` everywhere.\n- When displaying document fields that might be null, use a fallback to avoid printing the literal string \"null\" in console output: `document.get(\"Field\") != null ? document.get(\"Field\") : \"N/A\"`. Article output snippets should show clean, reader-friendly results.\n- Consider printing a diagnostic echo at startup showing the configured endpoint and resource names. This helps readers verify their configuration is correct and makes article output snippets more informative.\n- Isolate large data (embedding vectors, bulk document arrays, test datasets) into dedicated classes or `static final` constants. This keeps `main()` methods and pedagogical code readable.\n\n## Imports\n\n- Show required imports in the first code block of a sample. Don't force readers to guess the import statements.\n- For inline snippets (not full samples), imports can be omitted if the fully qualified class name is used or the context is clear.\n\n## Project setup for copy-paste-run\n\nThis pattern is primarily used in documentation articles where the reader creates project files step by step.\n\n- Provide instructions where the user creates the folder structure, adds the `pom.xml` file with full provided contents, and adds individual code files.\n- Don't use the `mvn archetype:generate` command, which produces a simple project that requires editing and confuses the setup narrative.\n- After adding the `pom.xml` and before any source files exist, direct the user to run `mvn dependency:resolve` to verify that dependencies are available. This validates the POM without attempting to compile nonexistent source.\n- After adding a new class file with its own `main` method, direct the user to run: `mvn compile exec:java \"-Dexec.mainClass=<full.class.Name>\"` (for example, `com.example.search.CreateIndex`). Quote the full `-D` argument rather than just the value — `\"-Dexec.mainClass=...\"` is more reliable across shells (bash, zsh, PowerShell) than `-Dexec.mainClass=\"...\"`.\n\n## Project setup for clone-and-explore\n\nThis pattern applies to both sample repo READMEs and documentation articles, with differences in detail level.\n\n- Direct the user to clone the sample repo and navigate to the project folder.\n- After the user configures `application.properties` (or environment variables, or sources the `.env` file), direct them to run `mvn compile` as a setup verification step. This catches configuration errors (typos in endpoints, missing properties) early, before the reader invests time in individual scenarios.\n- **In a README**: keep the run commands concise — `mvn exec:java \"-Dexec.mainClass=...\"` is sufficient after the upfront `mvn compile`, since the audience is expected to understand that recompilation is needed if they modify the code.\n- **In a documentation article**: use `mvn compile exec:java \"-Dexec.mainClass=...\"` for each run command. Including `compile` costs essentially nothing (Maven's incremental compilation skips unchanged sources) and ensures that readers who experiment by modifying the code get a fresh build when they copy-paste the run command.\n- For experienced Java developers, consider listing dependencies as a concise bulleted list (name + version) rather than showing the full `pom.xml` XML. The full POM is appropriate when build properties or plugin configuration need explanation.\n- Don't use `mvn clean dependency:copy-dependencies` for setup. The `dependency:copy-dependencies` goal copies JARs to `target/dependency/`, which isn't used by `exec:java` and is an unusual Maven idiom. Use `mvn compile` instead — it's a better smoke test that validates both dependencies and source.\n\n## Sample structure and architecture\n\n### Aligning to multi-language coverage\n\n- When creating Java coverage for an article that already has samples in other languages, structurally align to the existing coverage: same files, same class names, same variable names, same method decomposition — but following Java conventions and making practical exceptions for idiomatic Java and language-specific structural requirements.\n\n### New Java samples (no existing parallel coverage)\n\n- Avoid monolithic classes and methods. Strive for a reasonable balance of DRY encapsulation and snippet readability.\n- Encapsulate the key features for pedagogical illustration in well-named, self-documenting methods with well-named, self-documenting variables. These methods should focus on the pedagogy and be suitable for displaying in their entirety as documentation snippets.\n- Encapsulate basic infrastructural parts of the sample (parts that don't need to appear in the article) in separate methods and, where appropriate, separate classes.\n- For samples that cover multiple parallel feature usage scenarios, use separate classes with their own `main` method entry points, each referenced via `mvn compile exec:java`. These separate classes can share a single utility class for infrastructure concerns such as reading environment variables.\n\n### Clone-and-explore pattern\n\n- When articles instruct readers to clone a sample repo and then discuss highlights, structure the sample so that pedagogically important code is in self-contained, well-named methods that can be shown as complete snippets in the article. Infrastructure and boilerplate should be in separate methods or classes that the article doesn't need to display.\n\n## README and documentation conventions\n\n- Every fenced code block in a README or documentation article should be copy-paste-able as-is for at least one complete scenario, or require only minimal modification such as replacing placeholders. Don't combine multiple alternative commands in a single code block — separate them into distinct blocks with explanatory text.\n- In READMEs, prerequisite links are optional but helpful. In documentation articles, prerequisite items should always link to the relevant setup instructions.\n\n## PR review guidance\n\nWhen reviewing Java samples in pull requests, provide rationales with suggestions so the PR author can make informed decisions. These guidelines are suggestions, not blockers — the PR author or content owner has final say.\n\n- **Distinguish between blocking issues and suggestions.** Blocking: real bugs, credential leaks, broken code. Suggestion: style improvements, dependency preferences, structural patterns.\n- **Provide context for suggestions.** For example: \"Consider using `System.getenv` instead of `dotenv-java` — it avoids a third-party dependency and follows the Azure documentation convention for Java samples.\"\n- **Respect existing sample alignment.** If the PR creates a Java version of an existing sample in another language, the structural alignment to that sample takes priority over these guidelines. Only flag divergences that would cause functional issues or significantly harm readability.\n- **For unfamiliar PRs** (where you don't know if the sample is generated from an existing one or is new), note that your suggestions are based on Java documentation best practices and that the author should consider them in context.\n"
  },
  {
    "path": ".github/instructions/mcp-instructions-managed-lustre.md",
    "content": "# =============================================================================\n# MANAGED LUSTRE SERVICE-SPECIFIC INSTRUCTIONS\n# =============================================================================\n# These instructions apply ONLY to Managed Lustre example prompts.\n# They are based on PR review feedback from the Azure Managed Lustre team.\n# Source: https://github.com/MicrosoftDocs/azure-dev-docs-pr/pull/8353\n# =============================================================================\n\n## TERMINOLOGY REQUIREMENTS\n\n### Use \"job\" for import, auto-import, and auto-export entities\nThe Managed Lustre service refers to import, auto-import, and auto-export operations as \"jobs\". Avoid using \"configuration\", \"settings\", or \"task\" for these entities in example prompts or documentation.\n\n- ✅ CORRECT: \"Get the auto-import jobs for filesystem 'LustreFs01' in resource group 'rg-storage-prod'\"\n- ✅ CORRECT: \"Cancel the auto-export job named 'archiveJob' on filesystem 'TrainingDataFs'\"\n- ✅ CORRECT: \"Get the import jobs for filesystem 'LustreFs01' in resource group 'rg-storage-prod'\"\n- ❌ WRONG: \"Get the auto-import settings for filesystem 'LustreFs01' in resource group 'rg-storage-prod'\"\n- ❌ WRONG: \"Show me the blob auto-import configuration for filesystem 'archiveLustre'\"\n\n### Use \"auto-import\", \"auto-export\", and \"import\" consistently\n- Use \"auto-import\" and \"auto-export\" (with dash, no space) for jobs that continuously sync data, matching official documentation and command names.\n- Use \"import job\" (no auto-) for one-time/manual jobs that sync data from blob storage to Lustre filesystem.\n- Do not use \"autoimport\", \"autoexport\", or \"manual import\"—use the official forms.\n- When describing manual jobs, use \"manual import job\" for clarity.\n\n- ✅ CORRECT: \"Create an auto-import job for filesystem 'ProjectDataFS'\"\n- ✅ CORRECT: \"Create an import job for filesystem 'ProjectDataFS'\"\n- ✅ CORRECT: \"Create a manual import job for filesystem 'ProjectDataFS'\"\n- ✅ CORRECT: \"The auto-export job syncs data to blob storage\"\n- ❌ WRONG: \"Create an autoimport job for filesystem 'ProjectDataFS'\"\n- ❌ WRONG: \"Create a manual job for filesystem 'ProjectDataFS'\"\n- ❌ WRONG: \"The autoexport job syncs data\"\n\n### Use lowercase \"filesystem\" and \"resource group\" in prompts\nUse lowercase for \"filesystem\" and \"resource group\" when referring to these entities in example prompts.\n\n- ✅ CORRECT: \"filesystem 'LustreFs01' in resource group 'rg-storage-prod'\"\n- ❌ WRONG: \"Filesystem 'LustreFs01' in Resource Group 'rg-storage-prod'\"\n\n## SERVICE-SPECIFIC DISTINCTIONS\n\n### Manual import, auto-import, and auto-export jobs sync data between Lustre filesystem and blob storage\n- Manual import jobs perform a one-time sync from the linked blob storage container to the Lustre filesystem.\n- Auto-import jobs continuously sync data from the linked blob storage container to the Lustre filesystem.\n- Auto-export jobs continuously sync data from the Lustre filesystem to the linked blob storage container.\n\n### Conflict resolution modes for auto-import jobs\nThe conflict resolution mode parameter controls how conflicts are handled during auto-import jobs. Allowed values and behavior:\n\n- `Fail`: Stops immediately on conflict.\n- `Skip`: Skips the conflict (default).\n- `OverwriteIfDirty`: Deletes and re-imports if conflicting type, dirty, or currently released.\n- `OverwriteAlways`: Extends `OverwriteIfDirty` to include releasing restored but not dirty files.\n\nBoth conflict resolution mode and auto-import prefixes are optional parameters with defaults.\n\n### Auto-import prefixes and auto-export prefix usage\n- Auto-import jobs support multiple prefixes (up to 100) to specify blob paths or prefixes to import.\n- Manual import jobs also support multiple prefixes.\n- Auto-export jobs support only one prefix.\n- Default prefix is `/`.\n\n### Administrative status and enable deletions parameters for auto-import jobs\n- `Admin status`: `Enable` (default) or `Disable` to activate or deactivate the job.\n- `Enable deletions`: Boolean, only affects overwrite-dirty mode, default is `false`.\n\n### Maximum errors parameter for auto-import jobs\n- Specifies the number of tolerated non-conflict errors before the job fails.\n- `-1` means infinite tolerance.\n- `0` means exit immediately on any error.\n\n## NAMING CONVENTIONS\n\n### Use meaningful example names related to HPC and training workloads\n- Use resource group names like `rg-training`, `rg-managedlustre-prod`, `rg-hpc-environment`.\n- Use filesystem names like `TrainingDataFs`, `LustreFs01`, `AnalyticsLustreFS`, `ProjectDataFS`.\n\n## ALIGNMENT WITH OFFICIAL DOCUMENTATION AND AZURE MCP COMMANDS\n\n- Always document and retain all tools and commands listed in the Azure MCP commands file and official documentation, including file system management tools (such as get, delete, create, update, etc.) and job-based tools (import job, manual import job, auto-import job, auto-export job).\n- Do not remove tools from the documentation unless they are officially deprecated and removed from the Azure MCP commands file and published documentation.\n- Example prompt structure and terminology should match the published articles:\n  - <https://learn.microsoft.com/en-us/azure/azure-managed-lustre/blob-integration>\n  - <https://learn.microsoft.com/en-us/azure/azure-managed-lustre/create-import-job>\n  - <https://learn.microsoft.com/en-us/azure/azure-managed-lustre/auto-import>\n  - <https://learn.microsoft.com/en-us/azure/azure-managed-lustre/export-with-archive-jobs>\n  - <https://learn.microsoft.com/en-us/azure/azure-managed-lustre/auto-export>\n- Command names and prompt language should match the Azure MCP commands file:\n  - <https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/docs/azmcp-commands.md#azure-managed-lustre>\n"
  },
  {
    "path": ".github/instructions/mcp-instructions.md",
    "content": "# Azure MCP Server Tool Example Prompt Validation Instructions\n\n## Purpose\n\nValidate and fix example prompts in Azure MCP Server tool documentation to ensure all required parameters are explicitly present. This ensures users see complete, working examples that can be used as-is.\n\n## Core Principles\n\n1. **Only fix prompts missing required parameters** - Do not reformat, rephrase, or change prompts that already contain all required parameters\n2. **Preserve original intent** - Keep the prompt's purpose and optional parameters intact\n3. **Add minimal changes** - Only add what is strictly required according to the parameter table\n4. **Use explicit values** - Add specific placeholder values, not generic phrases like \"my database\" or \"my resource\"\n5. **Check conditional requirements** - Some tools require \"one of\" multiple parameters (e.g., Cluster URI OR Cluster name + Subscription)\n\n## Validation Process\n\nFor each tool in a documentation file:\n\n1. **Read the parameter table** - Identify which parameters are marked as \"Required\" vs \"Optional\"\n2. **Check each example prompt** - Verify that every required parameter is explicitly present\n3. **Fix only missing required parameters** - Add them with appropriate placeholder values\n4. **Leave compliant prompts unchanged** - Do not modify prompts that already have all required parameters\n5. **Change the ms.date** field** - Update it to the current date after making changes\n\n## Parameter Detection Rules\n\nThese rules help determine whether a required parameter is already included in an example prompt. A parameter is considered **satisfied/included** when it meets the criteria below.\n\n### Common Azure Parameters\n\n- **Resource group**: Included if the prompt mentions `resource group 'name'` or `in resource group`\n- **Subscription**: Included if the prompt mentions subscription ID, subscription name, or \"my subscription\"\n- **Location/Region**: Included if the prompt mentions Azure region names (eastus, westus, centralus, etc.)\n- **Resource name** (Server, Database, Account, etc.): Included if explicitly named with quotes or clear identifier\n\n### Service-Specific Parameters\n\n- **Endpoint/URL**: Included if the prompt contains `https://` or `http://` URL pattern\n- **File/Path**: Included if the prompt mentions filename with extension (`.wav`, `.txt`, `.csv`) or path pattern (`./`, `C:\\`)\n- **Query**: Included if the prompt contains explicit SQL/KQL query text in quotes or after \"query\" keyword\n  - For SQL: `SELECT`, `INSERT`, `UPDATE`, `DELETE` statements\n  - For KQL: Kusto syntax like `TableName | where ...` or predefined query names like `recent`, `errors`\n- **Text**: Included if the prompt contains quoted string content\n- **Namespace**: Included if the prompt mentions namespace name (e.g., Service Bus, Event Hubs)\n- **User**: Included if the prompt mentions username or \"with user 'name'\"\n- **Model**: Included if the prompt mentions model name (e.g., 'gpt-4', 'text-embedding-ada-002')\n\n### Conditional Parameters\n\nSome tools have \"one of\" requirements:\n- **Azure Data Explorer**: Requires (Cluster URI) OR (Cluster name + Subscription + Resource group)\n- **Azure Virtual Desktop**: Requires (Host pool name) OR (Host pool resource ID)\n\nWhen conditional parameters are present, verify at least ONE complete option is provided.\n\n## Placeholder Value Conventions\n\nUse specific, realistic placeholders instead of generic references:\n\n- **Endpoint**: `'https://myservice.cognitiveservices.azure.com/'`\n- **File paths**: `'./sample-audio.wav'`, `'./output.txt'`, `'C:/data/file.csv'`\n- **Resource group**: `'prod-rg'`, `'dev-rg'`, `'monitoring-rg'`, `'database-rg'`\n- **Server/Account names**: `'prod-mysql-server'`, `'mystorageaccount'`, `'analytics-server'`\n- **Database/Container**: `'salesdb'`, `'inventory'`, `'mycontainer'`\n- **User**: `'dbadmin'`, `'appuser'`, `'developer'`\n- **Query**: Full explicit query text, e.g., `'SELECT * FROM users WHERE id = 1'` or `'Logs | take 10'`\n- **Region**: `'eastus'`, `'westus2'`, `'centralus'`\n- **Subscription ID**: `'/subscriptions/abc123...'` (full ARM resource ID format)\n- **Namespace**: `'app-messaging'`, `'messaging-hub'`, `'retail-messaging'`\n- **Resource ID**: Full ARM format: `'/subscriptions/abc123/resourceGroups/rg/providers/Microsoft.Service/type/name'`\n\n## Common Fixes by Service\n\n### Database Services (MySQL, PostgreSQL, SQL)\n- Ensure Server, Database, User, Resource group are present\n- For queries, include explicit SQL query text\n\n### Azure Monitor / Log Analytics\n- Ensure Workspace, Resource group are present for workspace operations\n- For queries, include explicit KQL query text, Table name\n- For metrics, include Resource name, Metric namespace, Metrics\n\n### Azure Storage\n- Ensure Account is present for all operations\n- Container required for blob operations\n\n### Messaging Services (Service Bus, Event Hubs, Event Grid)\n- Ensure Namespace is always present\n- For topics/subscriptions, ensure Topic name is present\n- For Event Grid, include explicit JSON Data for send operations\n\n### Azure Data Explorer\n- Ensure Query includes explicit KQL query text\n- Check conditional parameters: Cluster URI OR (Cluster + Subscription + Resource group)\n\n### Azure Functions\n- Ensure explicit query text is present when mentioning \"query\"\n\n## Examples of Correct Fixes\n\n### Before (Missing Required Parameter):\n```\n\"Show tables in my workspace\"\n```\nRequired: Resource group, Workspace\n\n### After (Fixed):\n```\n\"Show tables in workspace 'centralmonitoring' in resource group 'monitoring-rg'\"\n```\n\n### Before (Missing Query Text):\n```\n\"Query errors from last hour in workspace 'my-workspace' in resource group 'my-resource-group'\"\n```\nRequired: Resource group, Workspace, Table, Query\n\n### After (Fixed):\n```\n\"Query table 'AzureDiagnostics' with query 'AzureDiagnostics | where Level == \\\"Error\\\" | take 100' in workspace 'app-monitoring' in resource group 'monitoring-rg' for last 1 hour\"\n```\n\n## What NOT to Do\n\n❌ **Don't** reformat prompts that already have required parameters\n❌ **Don't** change parameter values that are already present\n❌ **Don't** add optional parameters unless they were in the original prompt\n❌ **Don't** change the prompt's purpose or workflow\n❌ **Don't** use escape characters for single quotes in SQL queries (use plain single quotes)\n❌ **Don't** use generic placeholders like \"my resource\" or \"my database\"\n\n## Workflow\n\n1. Open the tool documentation file\n2. For each tool section:\n   - Read the parameter table to identify required vs optional parameters\n   - Check each example prompt\n   - If prompt is missing required parameters, add them with explicit placeholder values\n   - If prompt has all required parameters, leave it unchanged\n3. Use `multi_replace_string_in_file` for efficient batch edits\n4. Verify changes preserve the original prompt intent"
  },
  {
    "path": ".github/instructions/rust-instructions.md",
    "content": "---\nms.author: diberry\nms.date: 09/02/2025\ntitle: Copilot Instructions for Rust on Azure\ndescription: \"Central instructions for Copilot tasks for Rust on Azure. References detailed instructions in .github/instructions.\"\napplyTo: \"articles/rust/*.md\"\n---\n\n# Copilot instructions for all Rust language content\n\nUse the following instructions when creating, editing, or reviewing articles which include the Rust programming language.\n\n## Governing reference material\n\nConsider the following resources for governing the use of documentation about Rust:\n\n- [Azure SDK Rust guidelines](https://azure.github.io/azure-sdk/rust_introduction.html)\n\n## Instructions specific to Azure SDK for Rust\n\n- When referring to the Azure SDK for Rust:\n    - For the title, description, H1 and first instance, use the full name \"Azure SDK for Rust crates\". \n    - For subsequent references, you may use \"Azure crates\".\n- When generating SDK code:\n    - Prefer Azure Identity over keys or other authentication mechanisms.\n    - Prefer `AzureDeveloperCliCredential` over other credential types. \n    - Prefer to use the Azure Key Vault secrets service and its associated crate `azure_security_keyvault_secrets`. This crate was created by the SDK platform team, so it is most idiomatic of the Azure SDK for Rust crates."
  },
  {
    "path": ".github/policies/resourceManagement.yml",
    "content": "id: \nname: GitOps.PullRequestIssueManagement\ndescription: GitOps.PullRequestIssueManagement primitive\nowner: \nresource: repository\ndisabled: false\nwhere: \nconfiguration:\n  resourceManagementConfiguration:\n    scheduledSearches:\n    - description: \n      frequencies:\n      - hourly:\n          hour: 6\n      filters:\n      - isIssue\n      - isOpen\n      - hasLabel:\n          label: 'Needs: author feedback'\n      - hasLabel:\n          label: 'Status: no recent activity'\n      - noActivitySince:\n          days: 3\n      actions:\n      - closeIssue\n    - description: \n      frequencies:\n      - hourly:\n          hour: 6\n      filters:\n      - isIssue\n      - isOpen\n      - hasLabel:\n          label: 'Needs: author feedback'\n      - noActivitySince:\n          days: 4\n      - isNotLabeledWith:\n          label: 'Status: no recent activity'\n      actions:\n      - addLabel:\n          label: 'Status: no recent activity'\n      - addReply:\n          reply: This issue has been automatically marked as stale because it has been marked as requiring author feedback but has not had any activity for **4 days**. It will be closed if no further activity occurs **within 3 days of this comment**.\n    - description: \n      frequencies:\n      - hourly:\n          hour: 6\n      filters:\n      - isIssue\n      - isOpen\n      - hasLabel:\n          label: duplicate\n      - noActivitySince:\n          days: 1\n      actions:\n      - addReply:\n          reply: This issue has been marked as duplicate and has not had any activity for **1 day**. It will be closed for housekeeping purposes.\n      - closeIssue\n    eventResponderTasks:\n    - if:\n      - payloadType: Issue_Comment\n      - isAction:\n          action: Created\n      - isActivitySender:\n          issueAuthor: True\n      - hasLabel:\n          label: 'Needs: author feedback'\n      - isOpen\n      then:\n      - addLabel:\n          label: 'Needs: attention :wave:'\n      - removeLabel:\n          label: 'Needs: author feedback'\n      description: \n    - if:\n      - payloadType: Issues\n      - not:\n          isAction:\n            action: Closed\n      - hasLabel:\n          label: 'Status: no recent activity'\n      then:\n      - removeLabel:\n          label: 'Status: no recent activity'\n      description: \n    - if:\n      - payloadType: Issue_Comment\n      - hasLabel:\n          label: 'Status: no recent activity'\n      then:\n      - removeLabel:\n          label: 'Status: no recent activity'\n      description: \n    - if:\n      - payloadType: Pull_Request\n      then:\n      - inPrLabel:\n          label: 'Status: In PR'\n      description: \n    - if:\n      - payloadType: Issue_Comment\n      - commentContains:\n          pattern: '#please-close'\n          isRegex: False\n      then:\n      - closeIssue\n      description: \n    - if:\n      - payloadType: Issues\n      - isAction:\n          action: Opened\n      - and:\n        - bodyContains:\n            pattern: javascript\n            isRegex: False\n        - or:\n          - bodyContains:\n              pattern: typescript\n              isRegex: False\n      then:\n      - assignTo:\n          users:\n          - diberry\n      - addLabel:\n          label: javascript\n      - assignTo:\n          users:\n          - diberry\n      description: \n    - if:\n      - payloadType: Issues\n      - isAction:\n          action: Opened\n      - bodyContains:\n          pattern: /java/\n          isRegex: False\n      then:\n      - addLabel:\n          label: java\n      - assignTo:\n          users:\n          - karlerickson\n      description: \n    - if:\n      - payloadType: Issues\n      - isAction:\n          action: Opened\n      - bodyContains:\n          pattern: /python/\n          isRegex: False\n      then:\n      - addLabel:\n          label: python\n      - assignTo: {}\n      description: \n    - if:\n      - payloadType: Issues\n      - isAction:\n          action: Opened\n      - bodyContains:\n          pattern: /ansible/\n          isRegex: False\n      then:\n      - addLabel:\n          label: ansible\n      - assignTo:\n          users:\n          - 'TomArcherMsft '\n      description: \n    - if:\n      - payloadType: Issues\n      - isAction:\n          action: Opened\n      - titleContains:\n          pattern: /jenkins/\n          isRegex: False\n      then:\n      - addLabel:\n          label: jenkins\n      - assignTo:\n          users:\n          - TomArcherMsft\n      description: \n    - if:\n      - payloadType: Issues\n      - isAction:\n          action: Opened\n      - bodyContains:\n          pattern: /terraform/\n          isRegex: False\n      then:\n      - addLabel:\n          label: terraform\n      - assignTo:\n          users:\n          - TomArcherMsft\n      description: \n    - if:\n      - payloadType: Issues\n      - isAction:\n          action: Opened\n      - bodyContains:\n          pattern: /azure-cli/\n          isRegex: False\n      then:\n      - addLabel:\n          label: azure-cli\n      - assignTo:\n          users:\n          - 'dbradish-microsoft '\n      description: \nonFailure: \nonSuccess: \n"
  },
  {
    "path": ".github/rust-instructions.md",
    "content": "---\nms.author: diberry\nms.date: 09/02/2025\ntitle: Copilot Instructions for Rust on Azure\ndescription: \"Central instructions for Copilot tasks for Rust on Azure. References detailed instructions in .github/instructions.\"\napplyTo: \"articles/rust/**/*.md\"\n---\n\n# Copilot instructions for all Rust language content\n\nUse the following instructions when creating, editing, or reviewing articles which include the Rust programming language.\n\n## Governing reference material\n\nConsider the following resources for governing the use of documentation about Rust:\n\n- [Azure SDK Rust guidelines](https://azure.github.io/azure-sdk/rust_introduction.html)\n\n## Instructions specific to Azure SDK for Rust\n\n- When referring to the Azure SDK for Rust:\n    - For the title, description, H1 and first instance, use the full name \"Azure SDK for Rust crates\". \n    - For subsequent references, you may use \"Azure crates\".\n- When generating SDK code:\n    - Prefer Azure Identity over keys or other authentication mechanisms.\n    - Prefer `AzureDeveloperCliCredential` over other credential types. \n    - Prefer to use the Azure Key Vault secrets service and its associated crate `azure_security_keyvault_secrets`. This crate was created by the SDK platform team, so it is most idiomatic of the Azure SDK for Rust crates.\n- When linking to reference documentation on docs.rs:\n    - All links must include the `/latest` route after the crate name.\n    - Format: `https://docs.rs/{crate_name}/latest/{crate_name}/`\n    - Example: For the `azure_core` crate, use `https://docs.rs/azure_core/latest/azure_core/`"
  },
  {
    "path": ".gitignore",
    "content": "log/\nobj/\n_site/\n.optemp/\n_themes*/\n_repo.*/\n.vs/\n.vscode/\n.idea\n.ionide/\n.openpublishing.buildcore.ps1.vscode/\n*.DS_Store\n*.lnk\n\n# Squad state (belongs in squad repo, not content repo)\n.squad/\n"
  },
  {
    "path": ".openpublishing.publish.config.json",
    "content": "{\n  \"docsets_to_publish\": [\n    {\n      \"docset_name\": \"azure-dev-docs\",\n      \"build_source_folder\": \"articles\",\n      \"build_output_subfolder\": \"developer\",\n      \"locale\": \"en-us\",\n      \"monikers\": [],\n      \"moniker_ranges\": [],\n      \"open_to_public_contributors\": true,\n      \"type_mapping\": {\n        \"ZonePivotGroups\": \"Toc\",\n        \"Conceptual\": \"Content\",\n        \"Tutorial\": \"Content\"\n      },\n      \"build_entry_point\": \"docs\",\n      \"template_folder\": \"_themes\"\n    }\n  ],\n  \"notification_subscribers\": [\n    \"brendm@microsoft.com\",\n    \"karler@microsoft.com\",\n    \"susanpotter@microsoft.com\",\n    \"diberry@microsoft.com\"\n  ],\n  \"sync_notification_subscribers\": [\n    \"karler@microsoft.com\",\n    \"susanpotter@microsoft.com\"\n  ],\n  \"branches_to_filter\": [],\n  \"git_repository_url_open_to_public_contributors\": \"https://github.com/MicrosoftDocs/azure-dev-docs\",\n  \"git_repository_branch_open_to_public_contributors\": \"main\",\n  \"skip_source_output_uploading\": false,\n  \"need_preview_pull_request\": true,\n  \"contribution_branch_mappings\": {},\n  \"dependent_repositories\": [\n    {\n      \"path_to_root\": \"terraform_samples\",\n      \"url\": \"https://github.com/azure/terraform\",\n      \"branch\": \"master\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"_themes\",\n      \"url\": \"https://github.com/Microsoft/templates.docs.msft\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"_themes.pdf\",\n      \"url\": \"https://github.com/Microsoft/templates.docs.msft.pdf\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"azure-sdk-for-rust-docs\",\n      \"url\": \"https://github.com/Azure-Samples/azure-sdk-for-rust-docs\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"azure-sdk-for-rust-permalink\",\n      \"url\": \"https://github.com/Azure/azure-sdk-for-rust\",\n      \"branch\": \"5c7ded236f81f87b568557312ce7bbd17dbd549c\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"azure-sdk-for-js-docs\",\n      \"url\": \"https://github.com/Azure-Samples/azure-sdk-for-js-docs\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"azure-typescript-e2e-apps\",\n      \"url\": \"https://github.com/Azure-Samples/azure-typescript-e2e-apps\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"azure-typescript-langchainjs\",\n      \"url\": \"https://github.com/Azure-Samples/azure-typescript-langchainjs\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"node-essentials\",\n      \"url\": \"https://github.com/MicrosoftDocs/node-essentials\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },    \n    {\n      \"path_to_root\": \"js-e2e-azure-function-upload-file\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-azure-function-upload-file\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-azure-resource-management-functions\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-azure-resource-management-functions\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-browser-file-upload-storage-blob\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-browser-file-upload-storage-blob\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"ts-e2e-browser-file-upload-storage-blob\",\n      \"url\": \"https://github.com/Azure-Samples/ts-e2e-browser-file-upload-storage-blob\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },    \n    {\n      \"path_to_root\": \"js-e2e-vm\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-vm\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-client-cognitive-services\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-client-cognitive-services\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-client-azure-login-button\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-client-azure-login-button\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-express-server-cognitive-services\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-express-server-cognitive-services\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-express-mongodb-main\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-express-mongodb\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-express-mongodb-keyvault\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-express-mongodb\",\n      \"branch\": \"keyvault\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-web-app-server-auth\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-web-app-server-auth\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-azure-function-graphql-hello\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-azure-function-graphql-hello\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-azure-function-graphql-crud-operations\",\n      \"url\": \"https://github.com/Azure-Samples/js-e2e-azure-function-graphql-crud-operations\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-graphql-cosmosdb-static-web-app\",\n      \"url\": \"https://github.com/azure-samples/js-e2e-graphql-cosmosdb-static-web-app\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"js-e2e-graphql-nextjs-triviagame\",\n      \"url\": \"https://github.com/azure-samples/js-e2e-graphql-nextjs-triviagame\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"python-sdk-docs-examples\",\n      \"url\": \"https://github.com/MicrosoftDocs/python-sdk-docs-examples\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"python-docs-flask-minimal\",\n      \"url\": \"https://github.com/Azure-Samples/python-docs-flask-minimal\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"python-sample-vscode-flask-tutorial\",\n      \"url\": \"https://github.com/microsoft/python-sample-vscode-flask-tutorial\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"python-integrated-authentication\",\n      \"url\": \"https://github.com/Azure-Samples/python-integrated-authentication\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"msdocs-python-flask-webapp-quickstart\",\n      \"url\": \"https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"msdocs-python-django-webapp-quickstart\",\n      \"url\": \"https://github.com/Azure-Samples/msdocs-python-django-webapp-quickstart\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"msdocs-nodejs-mongodb-azure-sample-app\",\n      \"url\": \"https://github.com/Azure-Samples/msdocs-nodejs-mongodb-azure-sample-app\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },    \n    {\n      \"path_to_root\": \"msdocs-django-postgresql-sample-app\",\n      \"url\": \"https://github.com/Azure-Samples/msdocs-django-postgresql-sample-app\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"msdocs-python-etl-serverless\",\n      \"url\": \"https://github.com/Azure-Samples/msdocs-python-etl-serverless\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },    \n    {\n      \"path_to_root\": \"articles/reusable-content\",\n      \"url\": \"https://github.com/MicrosoftDocs/reusable-content\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"msdocs-python-fastapi-webapp-quickstart\",\n      \"url\": \"https://github.com/Azure-Samples/msdocs-python-fastapi-webapp-quickstart\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    },\n    {\n      \"path_to_root\": \"dotnet-docs\",\n      \"url\": \"https://github.com/dotnet/docs\",\n      \"branch\": \"main\",\n      \"branch_mapping\": {}\n    }\n  ],\n  \"branch_target_mapping\": {\n    \"live\": [\n      \"Publish\",\n      \"PDF\",\n      \"Pdf\"\n    ],\n    \"main\": [\n      \"Publish\",\n      \"PDF\"\n    ]\n  },\n  \"need_generate_pdf_url_template\": true,\n  \"targets\": {\n    \"pdf\": {\n      \"template_folder\": \"_themes.pdf\"\n    }\n  },\n  \"docs_build_engine\": {\n    \"name\": \"docfx_v3\"\n  },\n    \"redirection_files\": [\n        \"articles/java/.openpublishing.redirection.java.json\"\n    ]\n}\n"
  },
  {
    "path": ".openpublishing.redirection.json",
    "content": "{\n  \"redirections\": [\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/overview.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/overview\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/howto/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/howto/data-sync.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/data-sync\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/howto/client/cordova.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/client/cordova\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/howto/client/dotnet-v4.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/client/dotnet-v4\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/howto/client/dotnet.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/client/dotnet\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/howto/server/dotnet-core.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/server/dotnet-core\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/howto/server/dotnet-framework.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/server/dotnet-framework\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/howto/server/nodejs.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/howto/server/nodejs\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/avalonia/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/avalonia/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/avalonia/index.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/avalonia/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/avalonia/offline.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/avalonia/offline\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/cordova/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/cordova/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/cordova/index.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/cordova/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/cordova/offline.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/cordova/offline\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/maui/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/maui/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/maui/index.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/maui/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/maui/offline.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/maui/offline\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/uno/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uno/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/uno/index.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uno/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/uno/offline.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uno/offline\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/uwp/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uwp/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/uwp/index.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uwp/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/uwp/offline.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/uwp/offline\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/winui/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/winui/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/winui/index.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/winui/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/winui/offline.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/winui/offline\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/wpf/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/wpf/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/wpf/index.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/wpf/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/wpf/offline.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/wpf/offline\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/index.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/offline.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-android/offline\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/index.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/offline.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-forms/offline\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/index.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/offline.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-mobile-apps/quickstarts/xamarin-ios/offline\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/index.yml\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/index\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/choose-mobile-framework.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/choose-mobile-framework\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/mobile-cloud-development-stages.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/mobile-cloud-development-stages\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/authentication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/authentication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/data-storage.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/data-storage\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-storage.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-storage\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-content-delivery-network.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-content-delivery-network\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/serverless-compute.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/serverless-compute\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/real-time-communication.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/real-time-communication\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/code-hosting-services.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/code-hosting-services\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/devops.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/devops\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/continuous-integration.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/continuous-integration\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/test-mobile-apps.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/test-mobile-apps\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/continuous-delivery.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/continuous-delivery\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/analytics.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/analytics\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/diagnostics.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/diagnostics\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/push-notifications.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/push-notifications\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/notification-hubs-backend-service-xamarin-forms.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/notification-hubs-backend-service-xamarin-forms\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/notification-hubs-backend-service-react-native.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/notification-hubs-backend-service-react-native\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/notification-hubs-backend-service-flutter.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/notification-hubs-backend-service-flutter\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/cognitive-services.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/cognitive-services\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-maps.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-maps\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/mobile-apps/azure-search.md\",\n      \"redirect_url\": \"/previous-versions/azure/developer/mobile-apps/azure-search\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/javascript/sdk/authentication/azure-hosted-apps.md\",\n      \"redirect_url\": \"/azure/developer/javascript/sdk/authentication/system-assigned-managed-identity\"\n    },\n    {\n      \"source_path\": \"articles/javascript/core/what-is-azure-for-javascript-development.md\",\n      \"redirect_url\": \"/azure/developer/javascript/what-is-azure-for-javascript-development\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/javascript/core/use-azure-sdk.md\",\n      \"redirect_url\": \"/azure/developer/javascript/sdk/use-azure-sdk\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/convert-text-to-speech-cognitive-services.md\",\n      \"redirect_url\": \"/azure/developer/javascript/\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/static-web-app-image-analysis.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-web-app\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/create-static-web-app.md\",\n      \"redirect_url\": \"/azure/static-web-apps/\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli.md\",\n      \"redirect_url\": \"/azure/static-web-apps/add-api\",\n      \"redirect_document_id\": false\n    },{\n      \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-resource-group-management.md\",\n      \"redirect_url\": \"/azure/developer/javascript\",\n      \"redirect_document_id\": false\n  },    \n    {\n      \"source_path\": \"articles/javascript/how-to/with-authentication/getting-started.md\",\n      \"redirect_url\": \"/azure/developer/javascript\",\n      \"redirect_document_id\": false\n  },\n  {\n    \"source_path\": \"articles/javascript/tutorial/run-nodejs-virtual-machine.md\",\n    \"redirect_url\": \"/azure/virtual-machines/linux/quick-create-cli\",\n    \"redirect_document_id\": false\n},\n    {\n      \"source_path\": \"articles/javascript/how-to/with-visual-studio-code/create-azure-database.md\",\n      \"redirect_url\": \"/azure/developer/javascript\",\n      \"redirect_document_id\": false\n  },\n    {\n        \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-developer-solutions.md\",\n        \"redirect_url\": \"/azure/developer/javascript\",\n        \"redirect_document_id\": false\n    },\n    {\n        \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-developer-tools.md\",\n        \"redirect_url\": \"/azure/developer/javascript\",\n        \"redirect_document_id\": false\n    },\n    {\n        \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-get-started.md\",\n        \"redirect_url\": \"/azure/developer/javascript\",\n        \"redirect_document_id\": false\n    },\n    {\n        \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-infrastructure.md\",\n        \"redirect_url\": \"/azure/developer/javascript\",\n        \"redirect_document_id\": false\n    },\n    {\n        \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-run-codespaces.md\",\n        \"redirect_url\": \"/azure/developer/javascript\",\n        \"redirect_document_id\": false\n    },\n    {\n        \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-serverless-api-migration.md\",\n        \"redirect_url\": \"/azure/developer/javascript\",\n        \"redirect_document_id\": false\n    },\n    {\n        \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-serverless-api.md\",\n        \"redirect_url\": \"/azure/developer/javascript\",\n        \"redirect_document_id\": false\n    },\n    {\n        \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-test-api-solution.md\",\n        \"redirect_url\": \"/azure/developer/javascript\",\n        \"redirect_document_id\": false\n    },\n    {\n        \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-user-authentication.md\",\n        \"redirect_url\": \"/azure/developer/javascript\",\n        \"redirect_document_id\": false\n    },\n    {\n        \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-user-scenarios.md\",\n        \"redirect_url\": \"/azure/developer/javascript\",\n        \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/configure-web-app-settings.md\",\n      \"redirect_url\": \"/azure/developer/javascript\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/select-hosting-service.md\",\n      \"redirect_url\": \"/azure/developer/intro/hosting-apps-on-azure\"\n    },\n    {\n      \"source_path\": \"articles/javascript/azure-ai-for-javascript-developers.md\",\n      \"redirect_url\": \"/azure/javascript/ai/azure-ai-for-javascript-developers\"\n    },\n    {\n      \"source_path\": \"articles/javascript/chat-app-with-separate-front-back-end.md\",\n      \"redirect_url\": \"/azure/javascript/ai/chat-app-with-separate-front-back-end\"\n    },\n    {\n      \"source_path\": \"articles/javascript/get-started-app-chat-assistants-function-calling.md\",\n      \"redirect_url\": \"/azure/javascript/ai/get-started-app-chat-assistants-function-calling\"\n    },\n    {\n      \"source_path\": \"articles/javascript/get-started-app-chat-evaluations.md\",\n      \"redirect_url\": \"/azure/javascript/ai/get-started-app-chat-evaluations\"\n    },\n    {\n      \"source_path\": \"articles/javascript/get-started-app-chat-scaling-with-azure-api-management.md\",\n      \"redirect_url\": \"/azure/javascript/ai/get-started-app-chat-scaling-with-azure-api-management\"\n    },    \n    {\n      \"source_path\": \"articles/javascript/get-started-app-chat-scaling-with-azure-container-apps.md\",\n      \"redirect_url\": \"/azure/javascript/ai/get-started-app-chat-scaling-with-azure-container-apps\"\n    },\n    {\n      \"source_path\": \"articles/javascript/get-started-app-chat-template-langchainjs.md\",\n      \"redirect_url\": \"/azure/javascript/ai/get-started-app-chat-template-langchainjs\"\n    },   \n    {\n      \"source_path\": \"articles/javascript/get-started-app-chat-template.md\",\n      \"redirect_url\": \"/azure/virtual-machines\"\n    },     \n    {\n      \"source_path\": \"articles/javascript/openai-cli.md\",\n      \"redirect_url\": \"/azure/ai-services/openai\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-visual-studio-code/containerize-local-project.md\",\n      \"redirect_url\": \"https://code.visualstudio.com/docs/containers/quickstart-node\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-azure-sdk/create-manage-virtual-machine.md\",\n      \"redirect_url\": \"/azure/developer/javascript/\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/azure-function-cosmos-db-mongo-api.md\",\n      \"redirect_url\": \"/azure/azure-functions/functions-add-output-binding-cosmos-db-vs-code?pivots=programming-language-javascript\"\n    },\n    {\n      \"source_path\": \"articles/javascript/end-to-end/contoso-real-estate-test-ui-solution.md\",\n      \"redirect_url\": \"/azure/developer/javascript/end-to-end/contoso-real-estate-test-api-solution\"\n    },\n    {\n      \"source_path\": \"articles/javascript/core/automate-tasks-with-azure-cli.md\",\n      \"redirect_url\": \"/cli/azure/azure-cli-learn-bash\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-azure-sdk/stop-start-virtual-machine.md\",\n      \"redirect_url\": \"/cli/azure/vm\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-azure-sdk/list-resource-operation-history.md\",\n      \"redirect_url\": \"/cli/azure/monitor\"\n    },      \n    {\n      \"source_path\":\"articles/javascript/how-to/add-custom-domain-to-web-app.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-secure-domain-certificate\"\n    },\n    {\n      \"source_path\":\"articles/javascript/how-to/with-azure-cli/create-container-registry-resource.md\",\n      \"redirect_url\": \"/azure/container-registry/container-registry-get-started-azure-cli\"\n    },\n    {\n      \"source_path\":\"articles/javascript/how-to/with-authentication/static-web-app-with-api/add-mongodb-database-to-api.md\",\n      \"redirect_url\": \"/azure/active-directory-b2c/enable-authentication-react-spa-app\"\n    },\n    {\n      \"source_path\":\"articles/javascript/how-to/with-authentication/static-web-app-with-api/configure-source-code-for-msal.md\",\n      \"redirect_url\": \"/azure/active-directory-b2c/enable-authentication-react-spa-app\"\n    },\n    {\n      \"source_path\":\"articles/javascript/how-to/with-authentication/static-web-app-with-api/deploy-static-web-app-to-azure.md\",\n      \"redirect_url\": \"/azure/active-directory-b2c/enable-authentication-react-spa-app\"\n    }, \n    {\n      \"source_path\":\"articles/javascript/how-to/with-authentication/static-web-app-with-api/introduction.md\",\n      \"redirect_url\": \"/azure/active-directory-b2c/enable-authentication-react-spa-app\"\n    },\n    {\n      \"source_path\":\"articles/javascript/how-to/with-authentication/static-web-app-with-api/register-application-with-identity.md\",\n      \"redirect_url\": \"/azure/active-directory-b2c/enable-authentication-react-spa-app\"\n    },\n    {\n      \"source_path\":\"articles/javascript/how-to/with-authentication/register-application-with-identity.md\",\n      \"redirect_url\": \"/azure/active-directory-b2c/enable-authentication-react-spa-app\"\n    },\n    {\n      \"source_path\":\"articles/javascript/how-to/with-web-app/use-secret-environment-variables.md\",\n      \"redirect_url\": \"/azure/cosmos-db/store-credentials-key-vault\"\n    },\n    {\n      \"source_path\":\"articles/javascript/database-developer-guide.md\",\n      \"redirect_url\": \"https://azure.microsoft.com/product-categories/databases/\"\n    },\n    {\n      \"source_path\":\"articles/javascript/composable-cloud-contoso-real-estate.md\",\n      \"redirect_url\": \"/azure/developer/javascript/end-to-end/contoso-real-estate-get-started\"\n    },\n    { \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-01.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode\" \n    },\n    { \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-02.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode\" \n    },\n    { \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-03.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode\" \n    },\n    { \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-04.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode\" \n    },\n    { \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-05.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode\" \n    },\n    { \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-06.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode\" \n    },\n    { \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-07.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode\" \n    },                              \n    { \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-08.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-custom-container?tabs=node&pivots=container-linux-vscode\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/introduction.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/create-github-repo.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/create-react-app.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli\" \n    },      \n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/create-static-web-app.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli\" \n    }, \n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/create-function-api-app.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli\" \n    },       \n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/connect-client-to-api.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/add-authentication.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli\" \n    },      \n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-with-swa-cli/clean-up-swa-auth-resources.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/static-web-app-with-swa-cli\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-resource-group-management/add-delete-functions-redeploy.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-resource-group-management/clean-up-resources.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-resource-group-management/create-function-app.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-resource-group-management/deploy-azure-function-with-visual-studio-code.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-resource-group-management/view-query-application-logs.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-resource-group-management/introduction.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management\" \n    },      \n    { \"source_path\": \"articles/lab/index.yml\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/lab/quickstart-python-flask.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/lab/quickstart-python-flask-minimized.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/lab/quickstart-python-flask-multipage.yml\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/lab/tool-tip-metrics.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \n      \"source_path\": \"articles/javascript/tutorial/nodejs-virtual-machine-vm/introduction.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/run-nodejs-virtual-machine\" \n    },\n    { \n      \"source_path\": \"articles/javascript/tutorial/nodejs-virtual-machine-vm/create-azure-monitoring-application-insights-web-resource.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/run-nodejs-virtual-machine\" \n    },\n    { \n      \"source_path\": \"articles/javascript/tutorial/nodejs-virtual-machine-vm/create-linux-virtual-machine-azure-cli.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/run-nodejs-virtual-machine\" \n    },\n    { \n      \"source_path\": \"articles/javascript/tutorial/nodejs-virtual-machine-vm/connect-linux-virtual-machine-ssh.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/run-nodejs-virtual-machine\" \n    },\n    { \n      \"source_path\": \"articles/javascript/tutorial/nodejs-virtual-machine-vm/azure-monitor-application-insights-nodejs-expressjs-code.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/run-nodejs-virtual-machine\" \n    },      \n    { \n      \"source_path\": \"articles/javascript/tutorial/nodejs-virtual-machine-vm/azure-monitor-application-insights-logs.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/run-nodejs-virtual-machine\" \n    },\n    { \n      \"source_path\": \"articles/javascript/tutorial/nodejs-virtual-machine-vm/clean-up-resources.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/run-nodejs-virtual-machine\" \n    },\n    { \n      \"source_path\": \"articles/javascript/whats-new-developer-advocacy.md\",\n      \"redirect_url\": \"/azure/developer/javascript\" \n    },\n    { \n      \"source_path\": \"articles/javascript/whats-new-docs.md\",\n      \"redirect_url\": \"/azure/developer/javascript\" \n    },          \n    { \n      \"source_path\": \"articles/javascript/how-to/with-database/getting-started.md\",\n      \"redirect_url\": \"/azure/developer/javascript/database-developer-guide\" \n    },\n    { \n      \"source_path\": \"articles/javascript/how-to/with-database/use-azure-cache-for-redis-db.md\",\n      \"redirect_url\": \"/azure/developer/javascript/database-developer-guide\" \n    },\n    { \n      \"source_path\": \"articles/javascript/how-to/with-database/use-cassandra-as-cosmos-db.md\",\n      \"redirect_url\": \"/azure/developer/javascript/database-developer-guide\" \n    },\n    { \n      \"source_path\": \"articles/javascript/how-to/with-database/use-mongodb-as-cosmosdb.md\",\n      \"redirect_url\": \"/azure/developer/javascript/database-developer-guide\" \n    },\n    { \n      \"source_path\": \"articles/javascript/how-to/with-database/use-mysql-mariadb.md\",\n      \"redirect_url\": \"/azure/developer/javascript/database-developer-guide\" \n    },\n    { \n      \"source_path\": \"articles/javascript/how-to/with-database/use-postgresql-db.md\",\n      \"redirect_url\": \"/azure/developer/javascript/database-developer-guide\" \n    },\n    { \n      \"source_path\": \"articles/javascript/how-to/with-database/use-sql-api-as-cosmos-db.md\",\n      \"redirect_url\": \"/azure/developer/javascript/database-developer-guide\" \n    },      \n    { \n      \"source_path\": \"articles/javascript/how-to/common-javascript-tasks.md\",\n      \"redirect_url\": \"/azure/developer/javascript/core/use-azure-sdk\" \n    },\n    { \"source_path\": \"articles/javascript/core/nodejs-sdk-azure-authenticate.md\",\n      \"redirect_url\": \"/azure/developer/javascript/sdk/authentication/local-development-environment-service-principal\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/graphql/get-started.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/graphql/static-web-app-graphql/introduction.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/graphql/static-web-app-graphql/graphql-basics.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/graphql/static-web-app-graphql/local-development.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/graphql/static-web-app-graphql/create-configure-cosmos-db.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/graphql/static-web-app-graphql/remote-deployment.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },      \n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-nextjs-graphql/getting-started.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },\n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-nextjs-graphql/create-database-upload-data.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },      \n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-nextjs-graphql/create-translator-resource.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },      \n    { \"source_path\": \"articles/javascript/how-to/with-web-app/static-web-app-nextjs-graphql/deploy-trivia-game.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },    \n    { \"source_path\": \"articles/javascript/how-to/with-web-app/graphql/azure-function-hello-world.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },    \n    { \"source_path\": \"articles/javascript/how-to/with-web-app/graphql/azure-function-crud-mutation.md\",\n      \"redirect_url\": \"/azure/developer/javascript/graphql-developer-guide\" \n    },    \n    {\n      \"source_path\": \"articles/javascript/how-to/with-web-app/add-authentication-to-web-app.md\",\n      \"redirect_url\": \"/azure/app-service/scenario-secure-app-authentication-app-service-as-user\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-serverless-node-01.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-serverless-node-install.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-serverless-node-02.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-serverless-node-create-local.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-serverless-node-03.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-serverless-node-test-local.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-serverless-node-04.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-serverless-node-deploy-hosting.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-serverless-node-05.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-serverless-node-remove-resource.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },      \n    {\n      \"source_path\": \"articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-create-local.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-database-integration.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    }, \n    {\n      \"source_path\": \"articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-deploy-hosting.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    }, \n    {\n      \"source_path\": \"articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-install.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },      \n    {\n      \"source_path\": \"articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-remove-resource.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },  \n    {\n      \"source_path\": \"articles/javascript/tutorial/vscode-function-app-http-trigger/tutorial-vscode-serverless-node-test-local.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/azure-function-cosmos-db-mongo-api\"\n    },  \n    {              \n      \"source_path\": \"articles/javascript/how-to/with-azure-cli/create-postgresql-server-resource.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-database/use-postgresql-db\"\n    },       \n    {\n      \"source_path\": \"articles/javascript/how-to/with-azure-cli/create-mysql-db.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-database/use-mysql-mariadb?tabs=MySQL\"\n    },      \n    {\n      \"source_path\": \"articles/javascript/how-to/with-azure-cli/create-mariadb.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-database/use-mysql-mariadb?tabs=MySQL\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-azure-cli/create-cosmos-sql-api-resource.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-database/use-sql-api-as-cosmos-db\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-azure-cli/create-cassandra-db.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-database/use-cassandra-as-cosmos-db\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-azure-cli/create-cache-for-redis-db.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-database/use-azure-cache-for-redis-db\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-azure-cli/create-mongodb-cosmosdb.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-database/use-mongodb-as-cosmosdb?tabs=azure-cli%2Cmongodb\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-azure-cli/configure-app-service-custom-domain-name.md\",\n      \"redirect_url\": \"/azure/app-service/app-service-web-tutorial-custom-domain\"\n    },      \n    {\n      \"source_path\": \"articles/javascript/tutorial/deploy-deno-app-azure-app-service-azure-cli.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/nodejs-virtual-machine-vm/introduction\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/static-web-app/introduction.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-web-app\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/static-web-app/application-architecture.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-web-app\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/static-web-app/run-the-react-cognitive-services-image-analyzer-app-locally.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-web-app\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/static-web-app/create-computer-vision-resource-use-in-code.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-web-app\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/static-web-app/create-static-web-app-visual-studio-code-extension.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-web-app\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/static-web-app/add-computer-vision-react-app.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-web-app\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/static-web-app/clean-up-resources.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-web-app\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-database/use-mariadb.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-database/use-mysql-mariadb\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-database/use-mysql-db.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-database/use-mysql-mariadb\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-resource-group-management/view-and-query-application-logs.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management/view-query-application-logs\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-resource-group-management/create-function-app-for-resource-groups.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-web-app/azure-function-resource-group-management/create-function-app\"\n    },      \n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-06.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-04#make-change-and-deploy-to-azure-app-service-from-local-git\"\n    },    \n    {\n      \"source_path\": \"articles/javascript/how-to/deploy-containers.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/deploy-web-app\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/integrate-database.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/with-database/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/core/node-sdk-azure-authenticate.md\",\n      \"redirect_url\": \"/azure/developer/javascript/core/nodejs-sdk-azure-authenticate\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-01.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-02.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-03.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },    \n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-04.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/client/get-started.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-web-app\"\n    },    \n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-05.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-static-website-node/tutorial-vscode-static-website-node-06.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },     \n    {\n      \"source_path\": \"articles/javascript/core/node-sdk-azure-authenticate-principal.md\",\n      \"redirect_url\": \"/azure/developer/javascript/core/nodejs-sdk-azure-authenticate\"\n    },\n    {\n      \"source_path\": \"articles/javascript/concepts/identity-authentication-users.md\",\n      \"redirect_url\": \"/azure/developer/javascript/core/nodejs-sdk-azure-authenticate\"\n    },  \n    {\n      \"source_path\": \"articles/javascript/how-to/with-sdk/set-up-development-environment.md\",\n      \"redirect_url\": \"/azure/developer/javascript/core/nodejs-sdk-azure-authenticate\"\n    },  \n    \n    {\n      \"source_path\": \"articles/javascript/how-to/create-static-site.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-web-app\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/develop-nodejs-on-azure.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deploy-nodejs-mongodb-app-service-from-visual-studio-code\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-cli-node-01.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-01\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-cli-node-02.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-02\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-cli-node-03.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-03\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-cli-node-04.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-04\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-cli-node-06.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-06\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-cli-node-05.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-05\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-cli-node-07.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-07\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-docker-node-01.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-01\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-docker-node-02.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-02\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-docker-node-03.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-03\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-docker-node-04.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-04\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-docker-node-05.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-05\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-docker-node-06.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-06\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-docker-node-07.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-07\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-docker-node-08.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/tutorial-vscode-docker-node/tutorial-vscode-docker-node-08\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-static-website-node-01.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-static-website-node-02.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-static-website-node-03.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-static-website-node-04.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-static-website-node-05.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-static-website-node-06.md\",\n      \"redirect_url\": \"/azure/static-web-apps/getting-started\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-app-service-node-01.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-app-service-node-02.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-app-service-node-03.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-app-service-node-04.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-vscode-azure-app-service-node-05.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/deno-visual-studio-code-azure-app-service.yml\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deploy-deno-app-azure-app-service-azure-cli\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/browser-file-upload.yml\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/browser-file-upload-azure-storage-blob\"\n    },    \n    {\n      \"source_path\": \"articles/javascript/tutorial/web-app-mongodb.yml\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deploy-nodejs-mongodb-app-service-from-visual-studio-code\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-visual-studio-code-azure-app-service-deno-04.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deno-visual-studio-code-azure-app-service?preview=tutorialFeedback\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-visual-studio-code-azure-app-service-deno-03.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deno-visual-studio-code-azure-app-service?preview=tutorialFeedback\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-visual-studio-code-azure-app-service-deno-02.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deno-visual-studio-code-azure-app-service?preview=tutorialFeedback\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-visual-studio-code-azure-app-service-deno-01.md\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/deno-visual-studio-code-azure-app-service?preview=tutorialFeedback\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-sdk-logging.md\",\n      \"redirect_url\": \"/azure/developer/javascript/logging\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/node-sdk-logging.md\",\n      \"redirect_url\": \"/azure/developer/javascript/logging\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-sdk-azure-authenticate.md\",\n      \"redirect_url\": \"/azure/developer/javascript/core/node-sdk-azure-authenticate\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-sdk-azure-authenticate-principal.md\",\n      \"redirect_url\": \"/azure/developer/javascript/core/node-sdk-azure-authenticate-principal\"\n    },\n    {\n      \"source_path\": \"articles/javascript/configure-local-development-environment.md\",\n      \"redirect_url\": \"/azure/developer/javascript/core/configure-local-development-environment\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-visualstudiocode-browser-file-upload-feedback.yml\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/browser-file-upload?preview=tutorialFeedback\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial-visualstudiocode-azure-app-service-mongodb/tutorial-azure-web-app-mongodb-feedback.yml\",\n      \"redirect_url\": \"/azure/developer/javascript/tutorial/web-app-mongodb?preview=tutorialFeedback\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-howto-create-static-site-jamstack.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/create-static-site\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-howto-deploy-containers.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/deploy-containers\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-howto-deploy-web-app.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/deploy-web-app\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-howto-e2e.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/develop-nodejs-on-azure\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-howto-integrate-databases.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/integrate-database\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-howto-write-serverless-code.md\",\n      \"redirect_url\": \"/azure/developer/javascript/how-to/develop-serverless-apps\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-sdk-azure-install.md\",\n      \"redirect_url\": \"/javascript/api/?view=azure-node-latest\"\n    },\n    {\n      \"source_path\": \"articles/javascript/overview.md\",\n      \"redirect_url\": \"/azure/developer/javascript\"\n    },\n    {\n      \"source_path\": \"articles/javascript/retired/overview.md\",\n      \"redirect_url\": \"/azure/developer/javascript\"\n    },\n    {\n      \"source_path\": \"articles/javascript/retired/node-sdk-azure-get-started.md\",\n      \"redirect_url\": \"/azure/developer/javascript\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-samples-services-appservice.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs&products=azure-functions%2Cazure-app-service%2Cazure-logic-apps\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-samples-services-web-and-mobile.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs&products=azure-functions%2Cazure-app-service%2Cazure-logic-apps\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-samples-billing.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-samples-services-compute.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-samples-services-database.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs&products=azure-cosmos-db%2Cazure-sql-database\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-samples-services-iot.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs&products=azure-iot-hub%2Cazure-iot-edge%2Cazure-iot-central\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-samples-services-security-and-identity.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs&products=azure-active-directory%2Cazure-key-vault\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-samples-services-storage.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs&products=azure-storage\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-tutorials-services-databases.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs&products=azure-cosmos-db%2Cazure-sql-database\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-tutorials-services-enterprise.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs&products=azure-iot-hub%2Cazure-iot-edge%2Cazure-iot-central\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-tutorials-services-messaging-and-iot.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs&products=azure-iot-hub%2Cazure-iot-edge%2Cazure-iot-central\"\n    },\n    {\n      \"source_path\": \"articles/javascript/node-tutorials-services-storage.md\",\n      \"redirect_url\": \"/samples/browse/?languages=javascript%2Cnodejs&products=azure-storage\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-07.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-05.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-04.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-03.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-02.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/tutorial-vscode-azure-cli-node/tutorial-vscode-azure-cli-node-01.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/deploy-nodejs-mongodb-app-service-from-visual-studio-code.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli\"\n    },\n    {\n      \"source_path\": \"articles/javascript/tutorial/deploy-nodejs-azure-app-service-with-visual-studio-code.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli\"\n    },      \n    {\n      \"source_path\": \"articles/javascript/tutorial/single-page-application-azure-login-button-sdk-msal.md\",\n      \"redirect_url\": \"/azure/active-directory/develop/tutorial-v2-react\"\n    },      \n    {\n      \"source_path\": \"articles/python/sdk-library-api-reference.md\",\n      \"redirect_url\": \"/python/api/overview/azure/\"\n    },\n    {\n      \"source_path\": \"articles/python/sdk/index.yml\",\n      \"redirect_url\": \"/azure/developer/python/sdk/azure-sdk-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-serverless-cloud-etl-01.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-deploy-azure-cloud-python-etl-01-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-serverless-cloud-etl-02.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-deploy-azure-cloud-python-etl-01-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-serverless-cloud-etl-03.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-deploy-azure-cloud-python-etl-01-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-serverless-cloud-etl-04.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-deploy-azure-cloud-python-etl-01-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-serverless-cloud-etl-05.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-deploy-azure-cloud-python-etl-01-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/how-to-assign-role-permissions.md\",\n      \"redirect_url\": \"/azure/role-based-access-control/role-assignments-steps\"\n    },\n    {\n      \"source_path\": \"articles/python/sdk.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/azure-sdk-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-sql-database-samples.md\",\n      \"redirect_url\": \"/samples/browse/?languages=python&products=azure-cosmos-db%2Cazure-sql-database\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-virtual-machine-samples.md\",\n      \"redirect_url\": \"/samples/browse/?languages=python&products=azure-virtual-machines\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-web-apps-samples.md\",\n      \"redirect_url\": \"/samples/browse/?languages=python&products=azure-functions%2Cazure-app-service%2Cazure-logic-apps\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-release-notes.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-overview\"\n    },    \n    {\n      \"source_path\": \"articles/python/python-sdk-azure-tools.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-tools\"\n    },\n    {\n      \"source_path\": \"articles/python/python-azure-tools.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-tools\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-authenticate.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-authenticate\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-get-started.yml\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-multi-cloud.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-sovereign-domain\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-multi-cloud.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-sovereign-domain\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-operation-config.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-library-usage-patterns#optional-arguments-for-client-objects-and-methods\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-operation-config.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-library-usage-patterns#optional-arguments-for-client-objects-and-methods\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-overview.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-install.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-install\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-samples-list-images.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-samples-list-images\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-samples-logic-app-workflow.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-samples-logic-app-workflow\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-samples-managed-disks.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-samples-managed-disks\"\n    },\n    {\n      \"source_path\": \"articles/python/python-sdk-azure-samples-monitor-vms.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-samples-monitor-vms\"\n    },\n    {\n      \"source_path\": \"articles/python/quickstarts-messaging.md\",\n      \"redirect_url\": \"/azure/developer/python/quickstarts-messaging-iot\"\n    },\n    {\n      \"source_path\": \"articles/python/quickstarts-security-integration.md\",\n      \"redirect_url\": \"/azure/developer/python/quickstarts-identity-security\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-samples-monitor-vms.md\",\n      \"redirect_url\": \"/azure/developer/python/azure-sdk-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-vs-code-serverless-python-01.md\",\n      \"redirect_url\": \"/azure/azure-functions/create-first-function-vs-code-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-vs-code-serverless-python-02.md\",\n      \"redirect_url\": \"/azure/azure-functions/create-first-function-vs-code-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-vs-code-serverless-python-03.md\",\n      \"redirect_url\": \"/azure/azure-functions/create-first-function-vs-code-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-vs-code-serverless-python-04.md\",\n      \"redirect_url\": \"/azure/azure-functions/create-first-function-vs-code-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-vs-code-serverless-python-05.md\",\n      \"redirect_url\": \"/azure/azure-functions/create-first-function-vs-code-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-vs-code-serverless-python-06.md\",\n      \"redirect_url\": \"/azure/azure-functions/create-first-function-vs-code-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-vs-code-serverless-python-07.md\",\n      \"redirect_url\": \"/azure/azure-functions/create-first-function-vs-code-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-vs-code-serverless-python-08.md\",\n      \"redirect_url\": \"/azure/azure-functions/create-first-function-vs-code-python\"\n    },\n    {\n      \"source_path\": \"articles/python/cloud-azure-terminology.md\",\n      \"redirect_url\": \"/azure/azure-glossary-cloud-terminology\"\n    },    \n    {\n      \"source_path\": \"articles/go/azure-sdk-go-auth-aad-samples.md\",\n      \"redirect_url\": \"/azure/developer/go/azure-sdk-auth-aad-samples\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-go-authorization.md\",\n      \"redirect_url\": \"/azure/developer/go/azure-sdk-authorization\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-go-compute-networking-samples.md\",\n      \"redirect_url\": \"/azure/developer/go/azure-sdk-compute-networking-samples\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-go-containers-samples.md\",\n      \"redirect_url\": \"/azure/developer/go/azure-sdk-containers-samples\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-go-install.md\",\n      \"redirect_url\": \"/azure/developer/go/azure-sdk-install\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-go-qs-vm.md\",\n      \"redirect_url\": \"/azure/developer/go/azure-sdk-qs-vm\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-go-sql-database-samples.md\",\n      \"redirect_url\": \"/azure/developer/go/azure-sdk-sql-database-samples\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-go-tools.md\",\n      \"redirect_url\": \"/azure/developer/go/azure-sdk-tools\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-go-compute-network-samples.md\",\n      \"redirect_url\": \"/azure/developer/go/azure-sdk-compute-network-samples\"\n    },\n    {\n      \"source_path\": \"articles/ansible/cloudshell-run-playbook.md\",\n      \"redirect_url\": \"/azure/developer/ansible/getting-started-cloud-shell\"\n    },\n    {\n      \"source_path\": \"articles/ansible/key-vault-configure-vm-security.md\",\n      \"redirect_url\": \"/azure/developer/ansible/key-vault-configure-secrets\"\n    },\n    {\n      \"source_path\": \"articles/terraform/install-configure.md\",\n      \"redirect_url\": \"/azure/developer/terraform/getting-started-cloud-shell\"\n    },\n    {\n      \"source_path\": \"articles/terraform/create-a-base-template-using-yeoman.md\",\n      \"redirect_url\": \"/azure/developer/terraform/create-base-template-using-yeoman\"\n    },\n    {\n      \"source_path\": \"articles/terraform/getting-started-cloud-shell.md\",\n      \"redirect_url\": \"/azure/developer/terraform/get-started-cloud-shell\"\n    },\n    {\n      \"source_path\": \"articles/jenkins/azure-dev-spaces-and-aks.md\",\n      \"redirect_url\": \"/azure/developer/jenkins\"\n    },\n    {\n      \"source_path\": \"articles/jenkins/deploy-from-github-to-azure-app-service.md\",\n      \"redirect_url\": \"/azure/developer/jenkins/deploy-to-azure-app-service-using-azure-cli\"\n    },\n    {\n      \"source_path\": \"articles/jenkins/deploy-to-azure-app-service-using-plugin.md\",\n      \"redirect_url\": \"/azure/developer/jenkins/deploy-to-azure-app-service-using-azure-cli\"\n    },\n    {\n      \"source_path\": \"articles/jenkins/deploy-to-aks-using-blue-green-deployment-pattern.md\",\n      \"redirect_url\": \"/azure/developer/jenkins/deploy-from-github-to-aks\"\n    },\n    {\n      \"source_path\": \"articles/jenkins/deploy-to-azure-spring-cloud-using-azure-cli.md\",\n      \"redirect_url\": \"/azure/developer/jenkins/deploy-to-azure-spring-apps-using-azure-cli\"\n    },\n    {\n      \"source_path\": \"articles/terraform/get-started-cloud-shell.md\",\n      \"redirect_url\": \"/azure/developer/terraform/get-started-cloud-shell-bash\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-auth-aad-samples.md\",\n      \"redirect_url\": \"/azure/developer/go/azure-sdk-authentication\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-compute-networking-samples.md\",\n      \"redirect_url\": \"/azure/developer/go/management-libraries\"\n    },\n    {\n      \"source_path\": \"articles/go/manage-resource-groups.md\",\n      \"redirect_url\": \"/azure/developer/go/control-plane\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-qs-vm.md\",\n      \"redirect_url\": \"/azure/developer/go/control-plane\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-containers-samples.md\",\n      \"redirect_url\": \"/azure/developer/go/data-plane\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-sql-database-samples.md\",\n      \"redirect_url\": \"/azure/developer/go/data-plane\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-tools.md\",\n      \"redirect_url\": \"/azure/developer/go/configure-visual-studio-code\"\n    },\n    {\n      \"source_path\": \"articles/terraform/application-gateway-quickstart.md\",\n      \"redirect_url\": \"/azure/developer/terraform/deploy-application-gateway-v2\"\n    },\n    {\n      \"source_path\": \"articles/developer/python/tutorial-python-postgresql-app-portal.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-python-postgresql-app\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-authenticate.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/authentication-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-authenticate-development-environments.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/authentication-local-development-dev-accounts\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-authenticate-hosted-applications.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/authentication-azure-hosted-apps\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-authenticate-service-principals.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/authentication-on-premises-apps\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-configure-proxy.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/azure-sdk-configure-proxy\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-example-database.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/examples/azure-sdk-example-database\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-example-list-resource-groups.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/examples/azure-sdk-example-list-resource-groups\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-example-resource-group.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/examples/azure-sdk-example-resource-group\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-example-storage.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/examples/azure-sdk-example-storage\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-example-storage-use.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/examples/azure-sdk-example-storage-use\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-example-virtual-machines.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/examples/azure-sdk-example-virtual-machines\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-example-web-app.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/examples/azure-sdk-example-web-app\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-install.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/azure-sdk-install\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-library-package-index.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/azure-sdk-library-package-index\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-library-usage-patterns.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/azure-sdk-library-usage-patterns\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-logging.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/azure-sdk-logging\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-overview.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/azure-sdk-overview\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-samples-managed-disks.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/examples/azure-sdk-samples-managed-disks\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-sdk-sovereign-domain.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/azure-sdk-sovereign-domain\"\n    },\n    {\n      \"source_path\": \"articles/python/azure-tools.md\",\n      \"redirect_url\": \"/azure/developer/python/configure-local-development-environment\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-app-service-on-linux-01.md\",\n      \"redirect_url\": \"/azure/developer/python/configure-python-web-app-local-environment\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-app-service-on-linux-02.md\",\n      \"redirect_url\": \"/azure/developer/python/configure-python-web-app-local-environment\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-app-service-on-linux-03.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-app-service-on-linux-04.md\",\n      \"redirect_url\": \"/azure/developer/python/configure-python-web-app-on-app-service\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-app-service-on-linux-05.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-app-service-on-linux-06.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-app-service-on-linux-07.md\",\n      \"redirect_url\": \"/azure/app-service/quickstart-python\"\n    },\n    {\n      \"source_path\": \"articles/azure-cli/choose-the-right-azure-command-line-tool.md\",\n      \"redirect_url\": \"/cli/azure/choose-the-right-azure-command-line-tool\"\n    },\n    {\n      \"source_path\": \"articles/terraform/create-linux-virtual-machine-with-infrastructure.md\",\n      \"redirect_url\": \"/azure/virtual-machines/linux/quick-create-terraform\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-containers-01.md\",\n      \"redirect_url\": \"/azure/developer/python/containers-in-azure-overview-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-containers-02.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-containerize-deploy-python-web-app-azure-03\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-containers-03.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-containerize-deploy-python-web-app-azure-04\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-containers-04.md\",\n      \"redirect_url\": \"/azure/developer/python/containers-in-azure-overview-python\"\n    },\n    {\n      \"source_path\": \"articles/python/tutorial-deploy-containers-05.md\",\n      \"redirect_url\": \"/azure/developer/python/containers-in-azure-overview-python\"\n    },\n    {\n      \"source_path\": \"articles/python/how-to-create-static-sites.md\",\n      \"redirect_url\": \"/azure/developer/python/index\"\n    },\n    {\n      \"source_path\":\"articles/python/how-to-manage-service-principals.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/authentication-local-development-service-principal\"\n    },\n    {\n      \"source_path\":\"articles/terraform/get-started-powershell.md\",\n      \"redirect_url\": \"/azure/developer/terraform/get-started-windows-powershell\"\n    },\n    {\n      \"source_path\":\"articles/github/github-variable-substitution.md\",\n      \"redirect_url\": \"/azure/developer/github/\"\n    },\n    {\n      \"source_path\":\"articles/github/github-key-vault.md\",\n      \"redirect_url\": \"/azure/developer/github/\"\n    },\n    {\n      \"source_path\":\"articles/python/tutorial-python-managed-identity-01.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli\"\n    },\n    {\n      \"source_path\":\"articles/python/tutorial-python-managed-identity-02.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli\"\n    },\n    {\n      \"source_path\":\"articles/python/tutorial-python-managed-identity-03.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli\"\n    },\n    {\n      \"source_path\":\"articles/python/tutorial-python-managed-identity-04.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli\"\n    },\n    {\n      \"source_path\":\"articles/python/tutorial-python-managed-identity-05.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli\"\n    },\n    {\n      \"source_path\":\"articles/python/tutorial-python-managed-identity-06.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli\"\n    },\n    {\n      \"source_path\":\"articles/python/tutorial-python-managed-identity-07.md\",\n      \"redirect_url\": \"/azure/developer/python/tutorial-python-managed-identity-user-assigned-cli\"\n    },\n    {\n      \"source_path\":\"articles/terraform/create-k8s-cluster-with-tf-and-aks.md\",\n      \"redirect_url\": \"/azure/aks/learn/quick-kubernetes-deploy-terraform\"\n    },\n    {\n      \"source_path\":\"articles/terraform/quick-kubernetes-deploy-terraform.md\",\n      \"redirect_url\": \"/azure/aks/learn/quick-kubernetes-deploy-terraform\"\n    },\n    { \n      \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-file-upload.md\",\n      \"redirect_url\": \"/azure/storage/blobs/blob-upload-function-trigger-javascript\"\n    },\n    { \n      \"source_path\": \"articles/javascript/how-to/with-web-app/azure-function-file-upload-v3.md\",\n      \"redirect_url\": \"/azure/storage/blobs/blob-upload-function-trigger-javascript\"\n    },\n    {\n      \"source_path\":\"articles/terraform/create-vm-cluster-with-infrastructure.md\",\n      \"redirect_url\": \"/azure/virtual-machines/linux/quick-cluster-create-terraform\"\n    },\n    {\n      \"source_path\":\"articles/terraform/create-vm-cluster-module.md\",\n      \"redirect_url\": \"/azure/virtual-machines/windows/quick-cluster-create-terraform\"\n    },\n    { \"source_path\": \"articles/python/tutorial-deploy-azure-cloud-python-etl-01-overview.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/python/tutorial-deploy-azure-cloud-python-etl-02-get-data.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/python/tutorial-deploy-azure-cloud-python-etl-03-process-data.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/python/tutorial-deploy-azure-cloud-python-etl-04-deploy-solution.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/python/cloud-development-overview.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/python/cloud-development-provisioning.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/python/cloud-development-flow.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    { \"source_path\": \"articles/python/configure-local-development-environment.md\",\n      \"redirect_url\": \"/azure/developer/python\" \n    },\n    {\n      \"source_path\":\"articles/terraform/create-attestation-provider.md\",\n      \"redirect_url\": \"/azure/attestation/quickstart-terraform\"\n    },\n    {\n      \"source_path\":\"articles/terraform/create-k8s-cluster-with-aks-applicationgateway-ingress.md\",\n      \"redirect_url\": \"/azure/aks/create-k8s-cluster-with-aks-application-gateway-ingress\"\n    },\n    {\n      \"source_path\":\"articles/terraform/deploy-application-gateway-v2.md\",\n      \"redirect_url\": \"/azure/application-gateway/quick-create-terraform\"\n    },\n    {\n      \"source_path\":\"articles/terraform/create-base-template-using-yeoman.md\",\n      \"redirect_url\": \"/azure/developer/terraform\"\n    },\n    {\n      \"source_path\":\"articles/python/quickstarts-cognitive-services.md\",\n      \"redirect_url\": \"/azure/python/quickstarts-ai-services\"        \n    },\n    {\n      \"source_path\":\"articles/javascript/how-to/with-web-app/deploy-msal-sdk-authentication-expressjs.md\",\n      \"redirect_url\": \"/entra/identity-platform/quickstart-web-app-nodejs-msal-sign-in\"        \n    },\n    {\n      \"source_path\":\"articles/javascript/core/install-nodejs-develop-azure-sdk-project.md\",\n      \"redirect_url\": \"/azure/developer/javascript/core/configure-local-development-environment\"        \n\n    },\n    {\n      \"source_path\": \"articles/ansible/configure-in-docker-container.md\",\n      \"redirect_url\": \"/azure/developer/ansible\"\n    },\n    {\n      \"source_path\": \"articles/intro/azure-ai-for-developers.md\",\n      \"redirect_url\": \"/azure/developer/ai/azure-ai-for-developers\"\n    },\n    {\n      \"source_path\": \"articles/javascript/how-to/with-visual-studio-code/install-run-debug-nodejs.md\",\n      \"redirect_url\": \"/azure/app-service/tutorial-nodejs-mongodb-app\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-install.md\",\n      \"redirect_url\": \"/azure/developer/go/\"\n    },\n    {\n      \"source_path\": \"articles/python/sdk/authentication-additional-methods.md\",\n      \"redirect_url\": \"/azure/python/sdk/authentication/additional-methods\"\n    },\n    {\n      \"source_path\": \"articles/python/sdk/authentication-azure-hosted-apps.md\",\n      \"redirect_url\": \"/azure/python/sdk/authentication/azure-hosted-apps\"\n    },\n    {\n      \"source_path\": \"articles/python/sdk/authentication-local-development-dev-accounts.md\",\n      \"redirect_url\": \"/azure/python/sdk/authentication/local-development-dev-accounts\"\n    },\n    {\n      \"source_path\": \"articles/python/sdk/authentication-local-development-service-principal.md\",\n      \"redirect_url\": \"/azure/python/sdk/authentication/local-development-service-principal\"\n    },\n    {\n      \"source_path\": \"articles/python/sdk/authentication-on-premises-apps.md\",\n      \"redirect_url\": \"/azure/python/sdk/authentication/on-premises-apps\"\n    },\n    {\n      \"source_path\": \"articles/python/sdk/authentication-overview.md\",\n      \"redirect_url\": \"/azure/python/sdk/authentication/overview\"\n    },\n    {\n      \"source_path\": \"articles/ai/passwordless-connections.md\",\n      \"redirect_url\": \"/azure/developer/ai/keyless-connections\"\n    },\n    {\n      \"source_path\": \"articles/terraform/provider-version-history-azurerm.md\",\n      \"redirect_url\": \"/azure/developer/terraform/provider-version-history-azurerm-4-0-0-to-current\"\n    },\n    {\n      \"source_path\": \"articles/ansible/solution-template-deploy.md\",\n      \"redirect_url\": \"/azure/developer/ansible/\"\n    },\n    {\n      \"source_path\": \"articles/terraform/test-modules-using-terratest.md\",\n      \"redirect_url\": \"/azure/developer/terraform\"\n    },\n    {\n      \"source_path\": \"articles/go/sdk/authentication-overview.md\",\n      \"redirect_url\": \"/azure/developer/go/sdk/authentication/authentication-overview\"\n    },    \n    {\n      \"source_path\": \"articles/go/azure-sdk-authentication.md\",\n      \"redirect_url\": \"/azure/developer/go/sdk/authentication/authentication-overview\"\n    },    \n    {\n      \"source_path\": \"articles/go/azure-sdk-authorization.md\",\n      \"redirect_url\": \"/azure/developer/go/sdk/authentication/authentication-overview\"\n    },    \n    {\n      \"source_path\": \"articles/go/azure-sdk-authentication-managed-identity.md\",\n      \"redirect_url\": \"/azure/developer/go/sdk/authentication/system-assigned-managed-identity\"\n    },\n    {\n      \"source_path\": \"articles/go/sdk/authentication/authentication-azure-hosted-apps.md\",\n      \"redirect_url\": \"/azure/developer/go/sdk/authentication/system-assigned-managed-identity\"\n    },\n    {\n      \"source_path\": \"articles/go/azure-sdk-authentication-service-principal.md\",\n      \"redirect_url\": \"/azure/developer/go/sdk/authentication/local-development-service-principal\"\n    },\n    {\n      \"source_path\": \"articles/javascript/sdk/credential-chains.md\",\n      \"redirect_url\": \"/azure/developer/javascript/sdk/authentication/credential-chains\"\n    },\n    {\n      \"source_path\": \"articles/azure-developer-cli/debug.md\",\n      \"redirect_url\": \"/azure/developer/azure-developer-cli/get-started\"\n    },\n    {\n      \"source_path\": \"articles/azure-developer-cli/faq.yml\",\n      \"redirect_url\": \"/azure/developer/azure-developer-cli/provisioning-deployment-faq\"\n    },\n    {\n      \"source_path\": \"articles/ansible/aks-configure-kubenet-networking.md\",\n      \"redirect_url\": \"/azure/developer/ansible/aks-configure-cni-networking\"\n    },\n    {\n      \"source_path\": \"articles/ai/get-started-multi-agents.md\",\n      \"redirect_url\": \"/azure/developer/ai/azure-ai-for-developers\"\n    },\n        {\n      \"source_path\": \"articles/javascript/ai/get-started-app-chat-scaling-with-azure-api-management.md\",\n      \"redirect_url\": \"/azure/developer/javascript/ai/azure-ai-for-javascript-developers\"\n    },\n    {\n      \"source_path\": \"articles/terraform/azure-terraform-resource-provider/resource-provider-overview.md\",\n      \"redirect_url\": \"/azure/developer/terraform/azure-export-for-terraform/resource-provider-overview\"\n    },\n    {\n      \"source_path\": \"articles/terraform/azure-terraform-resource-provider/get-started-export-resources-portal.md\",\n      \"redirect_url\": \"/azure/developer/terraform/azure-export-for-terraform/get-started-export-resources-portal\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/azure-cli-extension.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/index\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/key-vault-key.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-key-vault\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/kusto.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-data-explorer\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/ai-search.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-ai-search\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/azure-aks.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-kubernetes\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/storage.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-storage\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/postgresql.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-database-postgresql\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/service-bus.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-service-bus\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/azure-cache-for-redis.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-redis\"\n     },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/azure-communications.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-communication\"\n    },\n    {\n      \"source_path\": \"articles/github-copilot-azure/quickstart-deploy-existing-app.md\",\n      \"redirect_url\": \"/azure/developer/github-copilot-azure/quickstart-deploy-app-agent-mode\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/monitor.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-monitor\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/cosmos-db.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-cosmos-db\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/azure-developer-cli.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-cli\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/azure-storage-sync.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-file-sync\"\n    },\n    {\n      \"source_path\": \"articles/github-copilot-azure/quickstart-build-deploy-applications.md\",\n      \"redirect_url\": \"/azure/developer/github-copilot-azure/quickstart-deploy-app-agent-mode\"\n    },\n    {\n      \"source_path\": \"articles/github-copilot-azure/optimize-examples.md\",\n      \"redirect_url\": \"/azure/developer/github-copilot-azure/introduction\"\n    },\n        {\n      \"source_path\": \"articles/chef/client-install-from-azure-portal.md\",\n      \"redirect_url\": \"https://docs.chef.io/azure_chef_cli/\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/chef/habitat-overview.md\",\n      \"redirect_url\": \"https://docs.chef.io/azure_chef_cli/\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/chef/index.yml\",\n      \"redirect_url\": \"https://docs.chef.io/azure_chef_cli/\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/chef/inspec-overview.md\",\n      \"redirect_url\": \"https://docs.chef.io/azure_chef_cli/\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/chef/overview.md\",\n      \"redirect_url\": \"https://docs.chef.io/azure_chef_cli/\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/chef/windows-vm-configure.md\",\n      \"redirect_url\": \"https://docs.chef.io/azure_chef_cli/\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/python/sdk/authentication/azure-hosted-apps.md\",\n      \"redirect_url\": \"/azure/developer/python/sdk/authentication/system-assigned-managed-identity\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/azure-ai-best-practices.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-best-practices\"\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/azure-health-resource.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-resource-health\",\n      \"redirect_document_id\": false\n    },\n    {\n      \"source_path\": \"articles/azure-mcp-server/tools/azure-virtual-machines.md\",\n      \"redirect_url\": \"/azure/developer/azure-mcp-server/tools/azure-compute\",\n      \"redirect_document_id\": false\n    }\n  ]\n}\n"
  },
  {
    "path": ".whatsnew.json",
    "content": "{\n    \"$schema\": \"https://github.com/dotnet/docs-tools/blob/main/WhatsNew.Infrastructure/Configuration/reposettings.schema.json\",\n    \"repositoryName\": \"azure-dev-docs-pr\",\n    \"repositoryOwner\": \"MicrosoftDocs\",\n    \"docSetProductName\": \"Azure developer documentation\",\n    \"rootDirectory\": \"articles/\",\n    \"docLinkSettings\": {\n        \"linkFormat\": \"relative\",\n        \"relativeLinkPrefix\": \"./\"\n    },\n    \"repositoryUrl\": \"https://github.com/MicrosoftDocs/azure-dev-docs-pr\",\n    \"branches\": [\n        {\n            \"name\": \"main\",\n            \"isDefault\": true\n        }\n    ],\n    \"inclusionCriteria\": { \"minAdditionsToFile\": 40 },\n    \"areas\": [\n        {\n            \"names\": [\"ai\"],\n            \"heading\": \"AI apps using Azure services\"\n        },\n        {\n            \"names\": [\"ansible\"],\n            \"heading\": \"Ansible on Azure\"\n        },\n        {\n            \"names\": [\"github\"],\n            \"heading\": \"Azure and GitHub integration\"\n        },\n        {\n            \"names\": [\"azure-developer-cli\"],\n            \"heading\": \"Azure Developer CLI (azd)\"\n        },\n        {\n            \"names\": [\"cpp\"],\n            \"heading\": \"Azure for C++\"\n        },\n        {\n            \"names\": [\"go\"],\n            \"heading\": \"Azure for Go\"\n        },\n        {\n            \"names\": [\"javascript\"],\n            \"heading\": \"Azure for JavaScript\"\n        },\n        {\n            \"names\": [\"java\"],\n            \"heading\": \"Azure for Java\"\n        },\n        {\n            \"names\": [\"python\"],\n            \"heading\": \"Azure for Python\"\n        },\n        {\n            \"names\": [\"rust\"],\n            \"heading\": \"Azure for Rust\"\n        },\n        {\n            \"names\": [\"azure-mcp-server\"],\n            \"heading\": \"Azure MCP Server\"\n        },\n        {\n            \"names\": [\"dev-tunnels\"],\n            \"heading\": \"Dev tunnels\"\n        },\n        {\n            \"names\": [\"github-copilot-app-modernization\"],\n            \"heading\": \"GitHub Copilot Modernization\"\n        },\n        {\n            \"names\": [\"github-copilot-azure\"],\n            \"heading\": \"GitHub Copilot for Azure\"\n        },\n        {\n            \"names\": [\"iac\"],\n            \"heading\": \"Infrastructure as Code\"\n        },\n        {\n            \"names\": [\"intro\"],\n            \"heading\": \"Introduction to Azure for developers\"\n        },\n        {\n            \"names\": [\"jenkins\"],\n            \"heading\": \"Jenkins on Azure\"\n        },\n        {\n            \"names\": [\"terraform\"],\n            \"heading\": \"Terraform on Azure\"\n        },\n        {\n            \"names\": [\"typespec\"],\n            \"heading\": \"TypeSpec\"\n        }\n    ]\n}"
  },
  {
    "path": "CODEOWNERS",
    "content": "# Testing the new code owners feature in GitHub. Please contact Cory Fowler if you have questions.\n\n# Global owner\n* @Susan-Potter\n\n# Config\n/articles/docfx.json @KarlErickson @Susan-Potter\n/.openpublishing.publish.config.json @KarlErickson @Susan-Potter\n/CODEOWNERS @KarlErickson @Susan-Potter\n\n# AI\n\n/articles/ai/ @ms-johnalex\n\n# Intro\n/articles/intro/ @Susan-Potter\n\n# DevEx\n/articles/python/ @PatAltimore\n/articles/go/ @PatAltimore\n/articles/cpp/ @ronniegeraghty @antkmsft @PatAltimore\n/articles/rust/ @ronniegeraghty @heaths @diberry\n/articles/javascript/ @diberry\n/articles/java/ @KarlErickson\n/articles/github-copilot-app-modernization/ @KarlErickson\n\n# Tools\n/articles/azure-developer-cli/ @alexwolfmsft @kristenwomack\n/articles/typespec/ @diberry\n/articles/azure-mcp-server/ @diberry @sandeep-sen\n/articles/azure-mcp-server/get-started @diberry @sandeep-sen @alexwolfmsft\n\n# Azure SDK authentication topics\n/articles/go/sdk/authentication/            @scottaddie @chlowell\n/articles/java/sdk/authentication/          @scottaddie @g2vinay @anannya03\n/articles/javascript/sdk/authentication/    @scottaddie @KarishmaGhiya @minhanh-phan @maorleger\n/articles/python/sdk/authentication/        @scottaddie @pvaneck @xiangyan99\n/articles/python/sdk/authorization/         @scottaddie @pvaneck @xiangyan99\n/articles/cpp/sdk/authentication/           @scottaddie @antkmsft @ronniegeraghty\n/articles/rust/sdk/authentication/          @scottaddie @ronniegeraghty @chlowell @heaths"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments."
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Microsoft Azure Documentation\n\nThank you for taking the time to contribute to the Microsoft Azure documentation.\n\nThis guide covers some general topics related to contribution and refers to our [contributor guide](https://learn.microsoft.com/contribute) for more detailed explanations when required.\n\n## Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\n\nFor more information, see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## How can I contribute?\n\nThere are many ways to contribute to the documentation. Review the following sections to find out which one is right for you.\n\n### Reporting bugs and suggesting enhancements\n\nPlease use the Feedback tool at the bottom of any article to submit bugs and suggestions.\n\n![Feedback Tool](media/feedback-tool.png)\n\n### Editing in GitHub\n\nFollow the guidance for [Quick edits to existing documents](https://learn.microsoft.com/contribute/#quick-edits-to-documentation) in our contributor guide.\n\n### Pull requests\n\nReview the guidance for [pull requests](https://learn.microsoft.com/contribute/how-to-write-workflows-major#pull-request-processing) and the contribution workflow in our contributor guide.\n"
  },
  {
    "path": "LICENSE",
    "content": "Attribution 4.0 International\n\n=======================================================================\n\nCreative Commons Corporation (\"Creative Commons\") is not a law firm and\ndoes not provide legal services or legal advice. Distribution of\nCreative Commons public licenses does not create a lawyer-client or\nother relationship. Creative Commons makes its licenses and related\ninformation available on an \"as-is\" basis. Creative Commons gives no\nwarranties regarding its licenses, any material licensed under their\nterms and conditions, or any related information. Creative Commons\ndisclaims all liability for damages resulting from their use to the\nfullest extent possible.\n\nUsing Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and\nconditions that creators and other rights holders may use to share\noriginal works of authorship and other material subject to copyright\nand certain other rights specified in the public license below. The\nfollowing considerations are for informational purposes only, are not\nexhaustive, and do not form part of our licenses.\n\n     Considerations for licensors: Our public licenses are\n     intended for use by those authorized to give the public\n     permission to use material in ways otherwise restricted by\n     copyright and certain other rights. Our licenses are\n     irrevocable. Licensors should read and understand the terms\n     and conditions of the license they choose before applying it.\n     Licensors should also secure all rights necessary before\n     applying our licenses so that the public can reuse the\n     material as expected. Licensors should clearly mark any\n     material not subject to the license. This includes other CC-\n     licensed material, or material used under an exception or\n     limitation to copyright. More considerations for licensors:\n\twiki.creativecommons.org/Considerations_for_licensors\n\n     Considerations for the public: By using one of our public\n     licenses, a licensor grants the public permission to use the\n     licensed material under specified terms and conditions. If\n     the licensor's permission is not necessary for any reason--for\n     example, because of any applicable exception or limitation to\n     copyright--then that use is not regulated by the license. Our\n     licenses grant only permissions under copyright and certain\n     other rights that a licensor has authority to grant. Use of\n     the licensed material may still be restricted for other\n     reasons, including because others have copyright or other\n     rights in the material. A licensor may make special requests,\n     such as asking that all changes be marked or described.\n     Although not required by our licenses, you are encouraged to\n     respect those requests where reasonable. More_considerations\n     for the public: \n\twiki.creativecommons.org/Considerations_for_licensees\n\n=======================================================================\n\nCreative Commons Attribution 4.0 International Public License\n\nBy exercising the Licensed Rights (defined below), You accept and agree\nto be bound by the terms and conditions of this Creative Commons\nAttribution 4.0 International Public License (\"Public License\"). To the\nextent this Public License may be interpreted as a contract, You are\ngranted the Licensed Rights in consideration of Your acceptance of\nthese terms and conditions, and the Licensor grants You such rights in\nconsideration of benefits the Licensor receives from making the\nLicensed Material available under these terms and conditions.\n\n\nSection 1 -- Definitions.\n\n  a. Adapted Material means material subject to Copyright and Similar\n     Rights that is derived from or based upon the Licensed Material\n     and in which the Licensed Material is translated, altered,\n     arranged, transformed, or otherwise modified in a manner requiring\n     permission under the Copyright and Similar Rights held by the\n     Licensor. For purposes of this Public License, where the Licensed\n     Material is a musical work, performance, or sound recording,\n     Adapted Material is always produced where the Licensed Material is\n     synched in timed relation with a moving image.\n\n  b. Adapter's License means the license You apply to Your Copyright\n     and Similar Rights in Your contributions to Adapted Material in\n     accordance with the terms and conditions of this Public License.\n\n  c. Copyright and Similar Rights means copyright and/or similar rights\n     closely related to copyright including, without limitation,\n     performance, broadcast, sound recording, and Sui Generis Database\n     Rights, without regard to how the rights are labeled or\n     categorized. For purposes of this Public License, the rights\n     specified in Section 2(b)(1)-(2) are not Copyright and Similar\n     Rights.\n\n  d. Effective Technological Measures means those measures that, in the\n     absence of proper authority, may not be circumvented under laws\n     fulfilling obligations under Article 11 of the WIPO Copyright\n     Treaty adopted on December 20, 1996, and/or similar international\n     agreements.\n\n  e. Exceptions and Limitations means fair use, fair dealing, and/or\n     any other exception or limitation to Copyright and Similar Rights\n     that applies to Your use of the Licensed Material.\n\n  f. Licensed Material means the artistic or literary work, database,\n     or other material to which the Licensor applied this Public\n     License.\n\n  g. Licensed Rights means the rights granted to You subject to the\n     terms and conditions of this Public License, which are limited to\n     all Copyright and Similar Rights that apply to Your use of the\n     Licensed Material and that the Licensor has authority to license.\n\n  h. Licensor means the individual(s) or entity(ies) granting rights\n     under this Public License.\n\n  i. Share means to provide material to the public by any means or\n     process that requires permission under the Licensed Rights, such\n     as reproduction, public display, public performance, distribution,\n     dissemination, communication, or importation, and to make material\n     available to the public including in ways that members of the\n     public may access the material from a place and at a time\n     individually chosen by them.\n\n  j. Sui Generis Database Rights means rights other than copyright\n     resulting from Directive 96/9/EC of the European Parliament and of\n     the Council of 11 March 1996 on the legal protection of databases,\n     as amended and/or succeeded, as well as other essentially\n     equivalent rights anywhere in the world.\n\n  k. You means the individual or entity exercising the Licensed Rights\n     under this Public License. Your has a corresponding meaning.\n\n\nSection 2 -- Scope.\n\n  a. License grant.\n\n       1. Subject to the terms and conditions of this Public License,\n          the Licensor hereby grants You a worldwide, royalty-free,\n          non-sublicensable, non-exclusive, irrevocable license to\n          exercise the Licensed Rights in the Licensed Material to:\n\n            a. reproduce and Share the Licensed Material, in whole or\n               in part; and\n\n            b. produce, reproduce, and Share Adapted Material.\n\n       2. Exceptions and Limitations. For the avoidance of doubt, where\n          Exceptions and Limitations apply to Your use, this Public\n          License does not apply, and You do not need to comply with\n          its terms and conditions.\n\n       3. Term. The term of this Public License is specified in Section\n          6(a).\n\n       4. Media and formats; technical modifications allowed. The\n          Licensor authorizes You to exercise the Licensed Rights in\n          all media and formats whether now known or hereafter created,\n          and to make technical modifications necessary to do so. The\n          Licensor waives and/or agrees not to assert any right or\n          authority to forbid You from making technical modifications\n          necessary to exercise the Licensed Rights, including\n          technical modifications necessary to circumvent Effective\n          Technological Measures. For purposes of this Public License,\n          simply making modifications authorized by this Section 2(a)\n          (4) never produces Adapted Material.\n\n       5. Downstream recipients.\n\n            a. Offer from the Licensor -- Licensed Material. Every\n               recipient of the Licensed Material automatically\n               receives an offer from the Licensor to exercise the\n               Licensed Rights under the terms and conditions of this\n               Public License.\n\n            b. No downstream restrictions. You may not offer or impose\n               any additional or different terms or conditions on, or\n               apply any Effective Technological Measures to, the\n               Licensed Material if doing so restricts exercise of the\n               Licensed Rights by any recipient of the Licensed\n               Material.\n\n       6. No endorsement. Nothing in this Public License constitutes or\n          may be construed as permission to assert or imply that You\n          are, or that Your use of the Licensed Material is, connected\n          with, or sponsored, endorsed, or granted official status by,\n          the Licensor or others designated to receive attribution as\n          provided in Section 3(a)(1)(A)(i).\n\n  b. Other rights.\n\n       1. Moral rights, such as the right of integrity, are not\n          licensed under this Public License, nor are publicity,\n          privacy, and/or other similar personality rights; however, to\n          the extent possible, the Licensor waives and/or agrees not to\n          assert any such rights held by the Licensor to the limited\n          extent necessary to allow You to exercise the Licensed\n          Rights, but not otherwise.\n\n       2. Patent and trademark rights are not licensed under this\n          Public License.\n\n       3. To the extent possible, the Licensor waives any right to\n          collect royalties from You for the exercise of the Licensed\n          Rights, whether directly or through a collecting society\n          under any voluntary or waivable statutory or compulsory\n          licensing scheme. In all other cases the Licensor expressly\n          reserves any right to collect such royalties.\n\n\nSection 3 -- License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the\nfollowing conditions.\n\n  a. Attribution.\n\n       1. If You Share the Licensed Material (including in modified\n          form), You must:\n\n            a. retain the following if it is supplied by the Licensor\n               with the Licensed Material:\n\n                 i. identification of the creator(s) of the Licensed\n                    Material and any others designated to receive\n                    attribution, in any reasonable manner requested by\n                    the Licensor (including by pseudonym if\n                    designated);\n\n                ii. a copyright notice;\n\n               iii. a notice that refers to this Public License;\n\n                iv. a notice that refers to the disclaimer of\n                    warranties;\n\n                 v. a URI or hyperlink to the Licensed Material to the\n                    extent reasonably practicable;\n\n            b. indicate if You modified the Licensed Material and\n               retain an indication of any previous modifications; and\n\n            c. indicate the Licensed Material is licensed under this\n               Public License, and include the text of, or the URI or\n               hyperlink to, this Public License.\n\n       2. You may satisfy the conditions in Section 3(a)(1) in any\n          reasonable manner based on the medium, means, and context in\n          which You Share the Licensed Material. For example, it may be\n          reasonable to satisfy the conditions by providing a URI or\n          hyperlink to a resource that includes the required\n          information.\n\n       3. If requested by the Licensor, You must remove any of the\n          information required by Section 3(a)(1)(A) to the extent\n          reasonably practicable.\n\n       4. If You Share Adapted Material You produce, the Adapter's\n          License You apply must not prevent recipients of the Adapted\n          Material from complying with this Public License.\n\n\nSection 4 -- Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that\napply to Your use of the Licensed Material:\n\n  a. for the avoidance of doubt, Section 2(a)(1) grants You the right\n     to extract, reuse, reproduce, and Share all or a substantial\n     portion of the contents of the database;\n\n  b. if You include all or a substantial portion of the database\n     contents in a database in which You have Sui Generis Database\n     Rights, then the database in which You have Sui Generis Database\n     Rights (but not its individual contents) is Adapted Material; and\n\n  c. You must comply with the conditions in Section 3(a) if You Share\n     all or a substantial portion of the contents of the database.\n\nFor the avoidance of doubt, this Section 4 supplements and does not\nreplace Your obligations under this Public License where the Licensed\nRights include other Copyright and Similar Rights.\n\n\nSection 5 -- Disclaimer of Warranties and Limitation of Liability.\n\n  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE\n     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS\n     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF\n     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,\n     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,\n     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR\n     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,\n     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT\n     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT\n     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.\n\n  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE\n     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,\n     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,\n     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,\n     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR\n     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN\n     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR\n     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR\n     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.\n\n  c. The disclaimer of warranties and limitation of liability provided\n     above shall be interpreted in a manner that, to the extent\n     possible, most closely approximates an absolute disclaimer and\n     waiver of all liability.\n\n\nSection 6 -- Term and Termination.\n\n  a. This Public License applies for the term of the Copyright and\n     Similar Rights licensed here. However, if You fail to comply with\n     this Public License, then Your rights under this Public License\n     terminate automatically.\n\n  b. Where Your right to use the Licensed Material has terminated under\n     Section 6(a), it reinstates:\n\n       1. automatically as of the date the violation is cured, provided\n          it is cured within 30 days of Your discovery of the\n          violation; or\n\n       2. upon express reinstatement by the Licensor.\n\n     For the avoidance of doubt, this Section 6(b) does not affect any\n     right the Licensor may have to seek remedies for Your violations\n     of this Public License.\n\n  c. For the avoidance of doubt, the Licensor may also offer the\n     Licensed Material under separate terms or conditions or stop\n     distributing the Licensed Material at any time; however, doing so\n     will not terminate this Public License.\n\n  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public\n     License.\n\n\nSection 7 -- Other Terms and Conditions.\n\n  a. The Licensor shall not be bound by any additional or different\n     terms or conditions communicated by You unless expressly agreed.\n\n  b. Any arrangements, understandings, or agreements regarding the\n     Licensed Material not stated herein are separate from and\n     independent of the terms and conditions of this Public License.\n\n\nSection 8 -- Interpretation.\n\n  a. For the avoidance of doubt, this Public License does not, and\n     shall not be interpreted to, reduce, limit, restrict, or impose\n     conditions on any use of the Licensed Material that could lawfully\n     be made without permission under this Public License.\n\n  b. To the extent possible, if any provision of this Public License is\n     deemed unenforceable, it shall be automatically reformed to the\n     minimum extent necessary to make it enforceable. If the provision\n     cannot be reformed, it shall be severed from this Public License\n     without affecting the enforceability of the remaining terms and\n     conditions.\n\n  c. No term or condition of this Public License will be waived and no\n     failure to comply consented to unless expressly agreed to by the\n     Licensor.\n\n  d. Nothing in this Public License constitutes or may be interpreted\n     as a limitation upon, or waiver of, any privileges and immunities\n     that apply to the Licensor or You, including from the legal\n     processes of any jurisdiction or authority.\n\n\n=======================================================================\n\nCreative Commons is not a party to its public\nlicenses. Notwithstanding, Creative Commons may elect to apply one of\nits public licenses to material it publishes and in those instances\nwill be considered the “Licensor.” The text of the Creative Commons\npublic licenses is dedicated to the public domain under the CC0 Public\nDomain Dedication. Except for the limited purpose of indicating that\nmaterial is shared under a Creative Commons public license or as\notherwise permitted by the Creative Commons policies published at\ncreativecommons.org/policies, Creative Commons does not authorize the\nuse of the trademark \"Creative Commons\" or any other trademark or logo\nof Creative Commons without its prior written consent including,\nwithout limitation, in connection with any unauthorized modifications\nto any of its public licenses or any other arrangements,\nunderstandings, or agreements concerning use of licensed material. For\nthe avoidance of doubt, this paragraph does not form part of the\npublic licenses.\n\nCreative Commons may be contacted at creativecommons.org."
  },
  {
    "path": "LICENSE-CODE",
    "content": "The MIT License (MIT)\nCopyright (c) Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to deal in the Software without restriction, \nincluding without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, \nand/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, \nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT \nNOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. \nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, \nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE \nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# Microsoft Azure Documentation\n\nWelcome to the open-source [documentation](/azure) of [Microsoft Azure](https://azure.microsoft.com). Please review this README file to understand how you can assist in contributing to the Microsoft Azure documentation.\n\n## Getting Started\n\nContributing to open source is more than just providing updates, it's also about letting us know when there is an issue. Read our [Contributing guidance](CONTRIBUTING.md) to find out more.\n\n### Prerequisites\n\nYou've decided to contribute, that's great! To contribute to the documentation, you need a few tools.\n\n#### GitHub\n\nContributing to the documentation requires a GitHub account. If you don't have an account, follow the instructions for [GitHub account setup](https://learn.microsoft.com/contribute/get-started-setup-github) from our contributor guide.\n\n#### Tools\n\nTo install necessary tools, follow the instructions for [Install content authoring tools](https://learn.microsoft.com/contribute/get-started-setup-tools) from our contributor guide.\n\n## License\n\nPlease refer to [LICENSE](LICENSE), [LICENSE-CODE](LICENSE-CODE) and [ThirdPartyNotices](ThirdPartyNotices) for all Licensing information.\n\n## Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information, see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.8 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "ThirdPartyNotices",
    "content": "##Legal Notices\nMicrosoft and any contributors grant you a license to the Microsoft documentation and other content\nin this repository under the [Creative Commons Attribution 4.0 International Public License](https://creativecommons.org/licenses/by/4.0/legalcode),\nsee the [LICENSE](LICENSE) file, and grant you a license to any code in the repository under the [MIT License](https://opensource.org/licenses/MIT), see the\n[LICENSE-CODE](LICENSE-CODE) file.\n\nMicrosoft, Windows, Microsoft Azure and/or other Microsoft products and services referenced in the documentation\nmay be either trademarks or registered trademarks of Microsoft in the United States and/or other countries.\nThe licenses for this project do not grant you rights to use any Microsoft names, logos, or trademarks.\nMicrosoft's general trademark guidelines can be found at http://go.microsoft.com/fwlink/?LinkID=254653.\n\nPrivacy information can be found at https://privacy.microsoft.com/en-us/\n\nMicrosoft and any contributors reserve all others rights, whether under their respective copyrights, patents,\nor trademarks, whether by implication, estoppel or otherwise."
  },
  {
    "path": "articles/ai/TOC.yml",
    "content": "items:\n- name: Develop AI apps using Azure services\n  href: index.yml\n  items:\n    - name: Overview\n      href: azure-ai-for-developers.md\n    - name: Concepts\n      items:\n      - name: Generative AI concepts and introduction\n        items: \n          - name: Introduction to generative AI\n            href: introduction-build-generative-ai-solutions.md      \n          - name: Concepts and considerations\n            href: gen-ai-concepts-considerations-developers.md\n          - name: Augment LLMs with RAG and fine-tuning\n            href: augment-llm-rag-fine-tuning.md\n          - name: Advanced RAG\n            href: advanced-retrieval-augmented-generation.md\n      - name: Security concepts\n        items: \n          - name: Security planning for LLM-based applications\n            href: /ai/playbook/technology-guidance/generative-ai/mlops-in-openai/security/security-plan-llm-application?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json     \n    - name: How-tos\n      items:\n        - name: Extract entities using Azure OpenAI Structured Outputs Mode\n          href: how-to/extract-entities-using-structured-outputs.md\n        - name: Switch between OpenAI and Azure OpenAI endpoints\n          href: how-to/switching-endpoints.md\n        - name: Security\n          items: \n            - name: Use Azure OpenAI without keys\n              href: keyless-connections.md\n            - name: Use Azure AI Search without keys\n              href: /azure/search/keyless-connections?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n    - name: AI app design\n      items:\n        - name: AI agent orchestration patterns\n          href: /azure/architecture/ai-ml/guide/ai-agent-design-patterns?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: Design your AI app to support foundation model life cycles\n          href: /azure/architecture/ai-ml/guide/manage-foundation-models-lifecycle?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n    - name: Agents with Model Context Protocol (MCP)\n      items:\n        - name: Build Agents using Model Context Protocol on Azure\n          href: intro-agents-mcp.md\n        - name: Build a TypeScript MCP server using Azure Container Apps servers\n          href: build-mcp-server-ts.md\n        - name: Create OpenAI-powered agents using MCP\n          href: build-openai-mcp-server-dotnet.md\n        - name: Build AI agent tools using remote MCP with Azure Functions\n          href: https://techcommunity.microsoft.com/blog/appsonazureblog/build-ai-agent-tools-using-remote-mcp-with-azure-functions/4401059\n        - name: Host Remote MCP Servers in Azure App Service\n          href: https://techcommunity.microsoft.com/blog/appsonazureblog/host-remote-mcp-servers-in-azure-app-service/4405082\n    - name: Discover and try new models\n      items:\n        - name: Develop reasoning apps with DeepSeek models on Microsoft Foundry using the OpenAI SDK\n          href: how-to/use-reasoning-model-inference.md\n        - name: Get started with DeepSeek-R1 reasoning model\n          href: /azure/ai-foundry/model-inference/tutorials/get-started-deepseek-r1?tabs=python     \n\n    - name: AI app templates\n      items:\n        - name: Overview\n          href: intelligent-app-templates.md \n        - name: Secure your AI App with keyless authentication\n          href: get-started-securing-your-ai-app.md\n        - name: Chat with your data\n          items:\n            - name: Python\n              items:\n                - name: Get started with the chat app template\n                  href: ../python/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n                - name: Get started with multimodal vision in a chat app\n                  href: get-started-app-chat-vision.md\n            - name: JavaScript\n              items:\n                - name: Get started with the chat app template\n                  href: ../javascript/ai/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n                - name: Serverless AI chat with RAG using LangChain.js\n                  href: ../javascript/ai/get-started-app-chat-template-langchainjs.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n                - name: Serverless Azure OpenAI Assistants with function calling\n                  href: ../javascript/ai/get-started-app-chat-assistants-function-calling.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Java\n              href: ../java/ai/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: .NET\n              href: /dotnet/ai/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: Evaluate the chat app\n          items:\n            - name: Python\n              href: ../python/get-started-app-chat-evaluations.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: JavaScript\n              href: ../javascript/ai/get-started-app-chat-evaluations.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: Load balance the chat app\n          items:\n            - name: Load balance with Azure Container Apps\n              items:\n                - name: Python\n                  href: ../python/get-started-app-chat-scaling-with-azure-container-apps.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n                - name: JavaScript\n                  href: ../javascript/ai/get-started-app-chat-scaling-with-azure-container-apps.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n                - name: Java\n                  href: ../java/ai/get-started-app-chat-scaling-with-azure-container-apps.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n                - name: .NET\n                  href: /dotnet/ai/get-started-app-chat-scaling-with-azure-container-apps?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Load balance with Azure API Management\n              items:\n                - name: Python\n                  href: ../python/get-started-app-chat-scaling-with-azure-api-management.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: Load test the Python chat app with Locust\n          href: ../python/get-started-app-chat-app-load-test-locust.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: Configure document security for the Python chat app\n          href: ../python/get-started-app-chat-document-security-trim.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: Redeploy the Python chat app with private endpoints\n          href: ../python/get-started-app-chat-private-endpoint.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: Connect a JavaScript frontend and Python backend\n          href: ../javascript/ai/chat-app-with-separate-front-back-end.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n    - name: Resources\n      items:\n        - name: Resources for all languages\n          href: resources-overview.md\n        - name: Python\n          items:\n            - name: Python resources\n              href: ../python/azure-ai-for-python-developers.md?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Get started generating text using Azure OpenAI Service\n              href: /azure/ai-services/openai/quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json          \n            - name: Get started using chat completions with Azure OpenAI Service\n              href: /azure/ai-services/openai/chatgpt-quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Chat with Azure OpenAI models using your own data\n              href: /azure/ai-services/openai/use-your-data-quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Get started using Azure OpenAI Assistants\n              href: /azure/ai-services/openai/assistants-quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Use images in your AI chats\n              href: /azure/ai-services/openai/gpt-v-quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Generate images with Azure OpenAI Service\n              href: /azure/ai-services/openai/dall-e-quickstart?pivots=programming-language-python&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: JavaScript\n          items:\n            - name: JavaScript resources\n              href: ../javascript/ai/azure-ai-for-javascript-developers.md?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Get started using chat completions with Azure OpenAI Service\n              href: /azure/ai-services/openai/chatgpt-quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Chat with Azure OpenAI models using your own data\n              href: /azure/ai-services/openai/use-your-data-quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Get started using Azure OpenAI Assistants\n              href: /azure/ai-services/openai/assistants-quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Use images in your AI chats\n              href: /azure/ai-services/openai/gpt-v-quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Get started generating text using Azure OpenAI Service\n              href: /azure/ai-services/openai/quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Generate images with Azure OpenAI Service\n              href: /azure/ai-services/openai/dall-e-quickstart?pivots=programming-language-javascript&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: Java\n          items:\n            - name: Java resources\n              href: ../java/ai/azure-ai-for-java-developers.md?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Get started using chat completions with Azure OpenAI Service\n              href: /azure/ai-services/openai/chatgpt-quickstart?pivots=programming-language-java&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Get started using GPT-35-Turbo and GPT-4 with Azure OpenAI Service in IntelliJ\n              href: ../java/toolkit-for-intellij/chatgpt-intellij.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Chat with Azure OpenAI models using your own data\n              href: /azure/ai-services/openai/use-your-data-quickstart?pivots=programming-language-spring&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Get started using Azure OpenAI Assistants\n              href: /azure/ai-services/openai/assistants-quickstart?pivots=programming-language-java&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Use images in your AI chats\n              href: /azure/ai-services/openai/gpt-v-quickstart?pivots=programming-language-java&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Get started generating text using Azure OpenAI Service\n              href: /azure/ai-services/openai/quickstart?pivots=programming-language-java&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Generate images with Azure OpenAI Service\n              href: /azure/ai-services/openai/dall-e-quickstart?pivots=programming-language-java&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: .NET\n          items:\n            - name: AI for .NET docs center\n              href: /dotnet/ai\n            - name: Overview\n              href: /dotnet/ai/get-started/dotnet-ai-overview?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Learning resources and samples\n              href: /dotnet/ai/azure-ai-for-dotnet-developers?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Build a chat app\n              href: /dotnet/ai/quickstarts/get-started-azure-openai?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Create a chat app that uses your data\n              href: /dotnet/ai/quickstarts/quickstart-ai-chat-with-data?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Summarize text\n              href: /dotnet/ai/quickstarts/quickstart-openai-summarize-text?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Generate images\n              href: /dotnet/ai/quickstarts/quickstart-openai-generate-images?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n            - name: Implement RAG using vector search\n              href: /dotnet/ai/tutorials/tutorial-ai-vector-search?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n        - name: Go\n          href: ../go/azure-ai-for-go-developers.md?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n"
  },
  {
    "path": "articles/ai/advanced-retrieval-augmented-generation.md",
    "content": "---\ntitle: Build Advanced Retrieval-Augmented Generation Systems\ndescription: As a developer, learn about real-world considerations and patterns for retrieval-augmented generation (RAG)-based chat systems.\nms.date: 01/30/2026\nms.topic: how-to\nms.custom: build-2024-intelligent-apps\nms.subservice: intelligent-apps\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As an AI app developer, I want to learn about real-world considerations and patterns for retrieval-augmented generation (RAG)-based chat systems.\n---\n\n# Build advanced retrieval-augmented generation systems\n\nThis article explains retrieval-augmented generation (RAG) and what developers need to build a production-ready RAG solution.\n\nTo learn about two ways to build a \"chat over your data\" app—one of the top generative AI use cases for businesses—see [Augment LLMs with RAG or fine-tuning](./augment-llm-rag-fine-tuning.md).\n\nThe following diagram shows the main steps of RAG:\n\n:::image type=\"content\" source=\"./media/naive-rag-inference-pipeline-highres.png\" border=\"false\" alt-text=\"Diagram that depicts a simple RAG flow, with boxes representing steps or processes and arrows connecting each box.\" :::\n\nThis process is called _naive RAG_. It helps you understand the basic parts and roles in a RAG-based chat system.\n\nReal-world RAG systems need more preprocessing and post-processing to handle articles, queries, and responses. The next diagram shows a more realistic setup, called _advanced RAG_:\n\n:::image type=\"content\" source=\"./media/advanced-rag-inference-pipeline-highres.png\" border=\"false\" alt-text=\"Diagram that depicts the advanced RAG flow of logic as a series of boxes with arrows between them.\" :::\n\nThis article gives you a simple framework to understand the main phases in a real-world RAG-based chat system:\n\n- Ingestion phase\n- Inference pipeline phase\n- Evaluation phase\n\n## Ingestion\n\nIngestion means saving your organization's documents so you can quickly find answers for users. The main challenge is to find and use the parts of documents that best match each question. Most systems use vector embeddings and cosine similarity search to match questions to content. You get better results when you understand the content type (like patterns and format) and organize your data well in the vector database.\n\nWhen setting up ingestion, focus on these steps:\n\n- Content preprocessing and extraction\n- Chunking strategy\n- Chunking organization\n- Update strategy\n\n### Content preprocessing and extraction\n\nThe first step in the ingestion phase is to preprocess and extract the content from your documents. This step is crucial because it ensures that the text is clean, structured, and ready for indexing and retrieval.\n\nClean and accurate content makes a RAG-based chat system work better. Start by looking at the shape and style of the documents you want to index. Do they follow a set pattern, like documentation? If not, what questions could these documents answer?\n\nAt a minimum, set up your ingestion pipeline to:\n\n- Standardize text formats\n- Handle special characters\n- Remove unrelated or old content\n- Track different versions of content\n- Handle content with tabs, images, or tables\n- Extract metadata\n\nSome of this information, like metadata, can help during retrieval and evaluation if you keep it with the document in the vector database. You can also combine it with the text chunk to improve the chunk's vector embedding.\n\n### Chunking strategy\n\nAs a developer, decide how to break up large documents into smaller chunks. Chunking helps send the most relevant content to the LLM so it can answer user questions better. Also, think about how you'll use the chunks after you get them. Try out common industry methods and test your chunking strategy in your organization.\n\nWhen chunking, think about:\n\n- **Chunk size optimization**: Pick the best chunk size and how to split it—by section, paragraph, or sentence.\n- **Overlapping and sliding window chunks**: Decide if chunks should be separate or overlap. You can also use a sliding window approach.\n- **Small2Big**: If you split by sentence, organize the content so you can find nearby sentences or the full paragraph. Giving this extra context to the LLM can help it answer better. For more, see the next section.\n\n### Chunking organization\n\nIn a RAG system, how you organize your data in the vector database makes it easier and faster to find the right information. Here are some ways to set up your indexes and searches:\n\n- **Hierarchical indexes**: Use layers of indexes. A top-level summary index quickly finds a small set of likely chunks. A second-level index points to the exact data. This setup speeds up searches by narrowing down the options before looking in detail.\n- **Specialized indexes**: Pick indexes that fit your data. For example, use graph-based indexes if your chunks connect to each other, like in citation networks or knowledge graphs. Use relational databases if your data is in tables, and filter with SQL queries.\n- **Hybrid indexes**: Combine different indexing methods. For example, use a summary index first, then a graph-based index to explore connections between chunks.\n\n### Alignment optimization\n\nMake retrieved chunks more relevant and accurate by matching them to the types of questions they answer. One way is to create a sample question for each chunk that shows what question it answers best. This approach helps in several ways:\n\n- **Improved matching**: During retrieval, the system compares the user’s question to these sample questions to find the best chunk. This technique improves the relevance of the results.\n- **Training data for machine learning models**: These question-chunk pairs help train the machine learning models in the RAG system. The models learn which chunks answer which types of questions.\n- **Direct query handling**: If a user’s question matches a sample question, the system can quickly find and use the right chunk, speeding up the response.\n\nEach chunk’s sample question acts as a label that guides the retrieval algorithm. The search becomes more focused and aware of context. This method works well when chunks cover many different topics or types of information.\n\n### Update strategies\n\nIf your organization updates documents often, you need to keep your database current so the retriever can always find the latest information. The _retriever component_ is the part of the system that searches the vector database and returns results. Here are some ways to keep your vector database up to date:\n\n- **Incremental updates**:\n  - **Regular intervals**: Set updates to run on a schedule (like daily or weekly) based on how often documents change. This action keeps the database fresh.\n  - **Trigger-based updates**: Set up automatic updates when someone adds or changes a document. The system reindexes only the affected parts.\n\n- **Partial updates**:\n  - **Selective reindexing**: Update only the parts of the database that changed, not the whole thing. This technique saves time and resources, especially for large datasets.\n  - **Delta encoding**: Store just the changes between old and new documents, which reduces the amount of data to process.\n\n- **Versioning**:\n  - **Snapshotting**: Save versions of your document set at different times. This action lets you go back or restore earlier versions if needed.\n  - **Document version control**: Use a version control system to track changes and keep a history of your documents.\n\n- **Real-time updates**:\n  - **Stream processing**: Use stream processing to update the vector database in real time as documents change.\n  - **Live querying**: Use live queries to get up-to-date answers, sometimes mixing live data with cached results for speed.\n\n- **Optimization techniques**:\n  - **Batch processing**: Group changes and apply them together to save resources and reduce overhead.\n  - **Hybrid approaches**: Mix different strategies:\n    - Use incremental updates for small changes.\n    - Use full reindexing for significant updates.\n    - Track and document major changes to your data.\n\nPick the update strategy or mix that fits your needs. Think about:\n\n- Document corpus size\n- Update frequency\n- Real-time data needs\n- Available resources\n\nReview these factors for your application. Each method has trade-offs in complexity, cost, and how quickly updates show up.\n\n## Inference pipeline\n\nYour articles are now chunked, vectorized, and stored in a vector database. Next, focus on getting the best answers from your system.\n\nTo get accurate and fast results, think about these key questions:\n\n- Is the user's question clear and likely to get the right answer?\n- Does the question break any company rules?\n- Can you rewrite the question to help the system find better matches?\n- Do the results from the database match the question?\n- Should you change the results before sending them to the LLM to make sure the answer is relevant?\n- Does the LLM's answer fully address the user's question?\n- Does the answer follow your organization's rules?\n\nThe whole inference pipeline works in real time. There’s no single right way to set up your preprocessing and post-processing steps. You use a mix of code and LLM calls. One of the biggest trade-offs is balancing accuracy and compliance with cost and speed.\n\nLet’s look at strategies for each stage of the inference pipeline.\n\n### Query preprocessing steps\n\nQuery preprocessing starts right after the user sends a question:\n\n:::image type=\"content\" source=\"./media/advanced-rag-query-processing-steps-highres.png\" border=\"false\" alt-text=\"Diagram that repeats the advanced RAG steps, with emphasis on the box labeled query processing steps.\" :::\n\nThese steps help make sure the user’s question fits your system and is ready to find the best article chunks using cosine similarity or \"nearest neighbor\" search.\n\n**Policy check**: Use logic to spot and remove or flag unwanted content, like personal data, bad language, or attempts to break safety rules (called \"jailbreaking\").\n\n**Query rewriting**: Change the question if needed—expand acronyms, remove slang, or rephrase it to focus on bigger ideas (step-back prompting).\n\nA special version of step-back prompting is _Hypothetical Document Embeddings (HyDE)_. HyDE has the LLM answer the question, makes an embedding from that answer, and then searches the vector database with it.\n\n### Subqueries\n\nSubqueries break a long or complex question into smaller, easier questions. The system answers each small question, then combines the answers.\n\nFor example, if someone asks, \"Who made more important contributions to modern physics, Albert Einstein or Niels Bohr?\" you can split it into:\n\n- **Subquery 1**: \"What did Albert Einstein contribute to modern physics?\"\n- **Subquery 2**: \"What did Niels Bohr contribute to modern physics?\"\n\nThe answers might include:\n\n- For Einstein: the theory of relativity, the photoelectric effect, and _E=mc^2_.\n- For Bohr: the hydrogen atom model, work on quantum mechanics, and the principle of complementarity.\n\nYou can then ask follow-up questions:\n\n- **Subquery 3**: \"How did Einstein's theories change modern physics?\"\n- **Subquery 4**: \"How did Bohr's theories change modern physics?\"\n\nThese follow-ups look at each scientist’s effect, like:\n\n- How Einstein’s work led to new ideas in cosmology and quantum theory\n- How Bohr’s work helped us understand atoms and quantum mechanics\n\nThe system combines the answers to give a full response to the original question. This method makes complex questions easier to answer by breaking them into clear, smaller parts.\n\n### Query router\n\nSometimes, your content lives in several databases or search systems. In these cases, use a query router. A _query router_ picks the best database or index to answer each question.\n\nA query router works after the user asks a question but before the system searches for answers.\n\nHere’s how a query router works:\n\n1. **Query analysis**: The LLM or another tool looks at the question to figure out what kind of answer is needed.\n1. **Index selection**: The router picks one or more indexes that fit the question. Some indexes are better for facts, others for opinions or special topics.\n1. **Query dispatch**: The router sends the question to the chosen index or indexes.\n1. **Results aggregation**: The system collects and combines the answers from the indexes.\n1. **Answer generation**: The system creates a clear answer using the information it found.\n\nUse different indexes or search engines for:\n\n- **Data type specialization**: Some indexes focus on news, others on academic papers, or on special databases like medical or legal info.\n- **Query type optimization**: Some indexes are fast for simple facts (like dates), while others handle complex or expert questions.\n- **Algorithmic differences**: Different search engines use different methods, like vector search, keyword search, or advanced semantic search.\n\nFor example, in a medical advice system, you might have:\n\n- A research paper index for technical details\n- A case study index for real-world examples\n- A general health index for basic questions\n\nIf someone asks about the effects of a new drug, the router sends the question to the research paper index. If the question is about common symptoms, it uses the general health index for a simple answer.\n\n### Post-retrieval processing steps\n\nPost-retrieval processing happens after the system finds content chunks in the vector database:\n\n:::image type=\"content\" source=\"./media/advanced-rag-post-retrieval-processing-steps-highres.png\" border=\"false\"  alt-text=\"Diagram that repeats the advanced RAG steps, with emphasis on the box labeled post-retrieval processing steps.\" :::\n\nNext, check if these chunks are useful for the LLM prompt before sending them to the LLM.\n\nKeep these things in mind:\n\n- Extra information can hide the most important details.\n- Irrelevant information can make the answer worse.\n\nWatch out for the _needle in a haystack_ problem: LLMs often pay more attention to the start and end of a prompt than the middle.\n\nAlso, remember the LLM’s maximum context window and the number of tokens needed for long prompts, especially at scale.\n\nTo handle these issues, use a post-retrieval processing pipeline with steps like:\n\n- **Filtering results**: Only keep chunks that match the query. Ignore the rest when building the LLM prompt.\n- **Re-ranking**: Put the most relevant chunks at the beginning and end of the prompt.\n- **Prompt compression**: Use a small, cheap model to summarize and combine chunks into a single prompt before sending it to the LLM.\n\n### Post-completion processing steps\n\nPost-completion processing happens after the user’s question and all content chunks go to the LLM:\n\n:::image type=\"content\" source=\"./media/advanced-rag-post-completion-processing-steps-highres.png\" border=\"false\" alt-text=\"Diagram that repeats the advanced RAG steps, with emphasis on the box labeled post-completion processing steps.\" :::\n\nAfter the LLM gives an answer, check its accuracy. A post-completion processing pipeline can include:\n\n- **Fact check**: Look for statements in the answer that claim to be facts, then check if they’re true. If a fact check fails, you can ask the LLM again or show an error message.\n- **Policy check**: Make sure the answer doesn’t include harmful content for the user or your organization.\n\n## Evaluation\n\nEvaluating a system like this is more complex than running regular unit or integration tests. Think about these questions:\n\n- Are users happy with the answers?\n- Are the answers accurate?\n- How do you collect user feedback? \n- Are there rules about what data you can collect?\n- Can you see every step the system took when answers are wrong?\n- Do you keep detailed logs for root cause analysis?\n- How do you update the system without making things worse?\n\n### Capturing and acting on feedback from users\n\nWork with your organization's privacy team to design feedback capture tools, system data, and logging for forensics and root cause analysis of a query session.\n\nThe next step is to build an _assessment pipeline_. An assessment pipeline makes it easier and faster to review feedback and find out why the AI gave certain answers. Check every response to see how the AI produced it, if the right content chunks were used, and how the documents were split up.\n\nAlso, look for extra preprocessing or post-processing steps that could improve results. This close review often finds content gaps, especially when no good documentation exists for a user's question.\n\nYou need an assessment pipeline to handle these tasks at scale. A good pipeline uses custom tools to measure answer quality. It helps you see why the AI gave a specific answer, which documents it used, and how well the inference pipeline worked.\n\n### Golden dataset\n\nOne way to check how well a RAG chat system works is to use a golden dataset. A _golden dataset_ is a set of questions with approved answers, helpful metadata (like topic and question type), links to source documents, and different ways users might ask the same thing.\n\nA golden dataset shows the \"best case scenario.\" Developers use it to see how well the system works and to run tests when they add new features or updates.\n\n### Assessing harm\n  \nHarms modeling helps you spot possible risks in a product and plan ways to reduce them.\n\nA harms assessment tool should include these key features:\n\n- **Stakeholder identification**: Helps you list and group everyone affected by the technology, including direct users, people affected indirectly, future generations, and even the environment.\n- **Harm categories and descriptions**: Lists possible harms, like privacy loss, emotional distress, or economic harm. Guides you through examples and helps you think about both expected and unexpected problems.\n- **Severity and probability assessments**: Helps you judge how serious and likely each harm is, so you can decide what to fix first. You can use data to support your choices.\n- **Mitigation strategies**: Suggests ways to reduce risks, like changing the system design, add safeguards, or use other technology.\n- **Feedback mechanisms**: Lets you collect feedback from stakeholders so you can keep improving the process as you learn more.\n- **Documentation and reporting**: Makes it easy to create reports that show what you found and what you did to reduce risks.\n\nThese features help you find and fix risks, and they also help you build more ethical and responsible AI by thinking about all possible impacts from the start.\n\nFor more information, see these articles:\n\n- [Foundations of assessing harm](/azure/architecture/guide/responsible-innovation/harms-modeling/)\n- [Types of harm](/azure/architecture/guide/responsible-innovation/harms-modeling/type-of-harm)\n\n### Testing and verifying the safeguards\n\n_Red-teaming_ is key—it means to act like an attacker to find weak spots in the system. This step is especially important to stop jailbreaking. For tips on planning and managing red teaming for responsible AI, see [Planning red teaming for large language models (LLMs) and their applications](/azure/ai-foundry/openai/concepts/red-teaming?view=foundry&preserve-view=true).\n\nDevelopers should test RAG system safeguards in different scenarios to make sure they work. This step makes the system stronger and also helps fine-tune responses to follow ethical standards and rules.\n\n## Final considerations for application design\n\nHere are some key things to remember from this article that can help you design your app:\n\n- Generative AI unpredictability\n- User prompt changes and their effect on time and cost\n- Parallel LLM requests for faster performance\n\nTo build a generative AI app, check out [Get started with chat by using your own data sample for Python](/azure/developer/python/get-started-app-chat-template?tabs=github-codespaces). The tutorial is also available for [.NET](/dotnet/ai/get-started-app-chat-template?tabs=github-codespaces), [Java](/azure/developer/java/ai/get-started-app-chat-template?tabs=github-codespaces), and [JavaScript](/azure/developer/javascript/get-started-app-chat-template?tabs=github-codespaces).\n"
  },
  {
    "path": "articles/ai/augment-llm-rag-fine-tuning.md",
    "content": "---\ntitle: Augment LLMs with RAGs or Fine-Tuning\ndescription: Get a conceptual introduction to creating retrieval-augmented generation (RAG)-based chat systems, with an emphasis on integration, optimization, and ethical considerations for delivering contextually relevant responses.\nms.date: 01/30/2026\nms.topic: concept-article\nms.custom: build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\nms.subservice: intelligent-apps\n---\n\n# Augment large language models with retrieval-augmented generation or fine-tuning\n\nThis article explains how large language models (LLMs) can use extra data to provide better answers. By default, an LLM only knows what it learned during training. You can add real-time or private data to make it more useful.\n\nThere are two main ways to add this extra data:\n\n- **Retrieval-augmented generation (RAG)**: Uses semantic search and contextual priming to find and add helpful information before the model answers. Learn more in [Key concepts and considerations for building generative AI solutions](./gen-ai-concepts-considerations-developers.md).\n- **Fine-tuning**: Retrains the LLM on a smaller, specific dataset so it gets better at certain tasks or topics.\n\nThe next sections break down both methods.\n\n## Understanding RAG\n\nRAG enables the key \"chat over my data\" scenario. In this scenario, an organization has a potentially large corpus of textual content, like documents, documentation, and other proprietary data. It uses this corpus as the basis for answers to user prompts.\n\nRAG lets you build chatbots or agents that answer questions using your own documents. Here's how it works:\n\n1. Store your documents (or parts of them, called *chunks*) in a database\n2. Create an *embedding* for each chunk; a list of numbers that describe it\n3. When someone asks a question, the system finds similar chunks\n4. Send the relevant chunks along with the question to the LLM to create an answer\n\n### Creating an index of vectorized documents\n\nStart by building a vector data store. This store holds the embeddings for each document or chunk. The following diagram shows the main steps to create a vectorized index of your documents.\n\n:::image type=\"content\" source=\"./media/vector-embedding-pipeline-highres.png\" border=\"false\" alt-text=\"Diagram that depicts the different stages of document ingestion in a RAG-based chat system.\" :::\n\nThe diagram shows a *data pipeline*. This pipeline brings in data, processes it, and manages it for the system. It also prepares the data for storage in the vector database and makes sure it’s in the right format for the LLM.\n\nEmbeddings drive the whole process. An embedding is a set of numbers that represents the meaning of words, sentences, or documents so a machine learning model can use them.\n\nOne way to create an embedding is to send your content to the Azure OpenAI Embeddings API. The API returns a vector—a list of numbers. Each number describes something about the content, like its topic, meaning, grammar, or style.\n\n- Topic matter\n- Semantic meaning\n- Syntax and grammar\n- Word and phrase usage\n- Contextual relationships\n- Style or tone\n\nAll these numbers together show where the content sits in a multi-dimensional space. Imagine a 3D graph, but with hundreds or thousands of dimensions. Computers can work with this kind of space, even if we can’t draw it.\n\nThe [Tutorial: Explore Azure OpenAI in Microsoft Foundry Models embeddings and document search](/azure/ai-foundry/openai/tutorials/embeddings?view=foundry&tabs=command-line&pivots=programming-language-python&preserve-view=true) provides a guide on how to use the Azure OpenAI Embeddings API to create embeddings for your documents.\n\n#### Storing the vector and content\n\nThe next step involves storing the vector and the content (or a pointer to the content's location) and other metadata in a vector database. A vector database is like any other type of database, but with two key differences:\n\n- Vector databases use a vector as an index to search for data\n- Vector databases often use nearest neighbor algorithms, which can employ *cosine similarity* as a distance metric to find vectors that most closely match the search criteria\n\nWith the corpus of documents stored in a vector database, developers can build a *retriever component* to retrieve documents that match the user's query. The system uses this data to supply the LLM with what it needs to answer the user's query.\n\n### Answering queries by using your documents\n\nA RAG system first uses semantic search to find articles that might be helpful to the LLM when it composes an answer. The next step involves sending the matching articles with the user's original prompt to the LLM to compose an answer.\n\nThe following diagram depicts a simple RAG implementation (sometimes called *naive RAG*):\n\n:::image type=\"content\" source=\"./media/naive-rag-inference-pipeline-highres.png\" border=\"false\" alt-text=\"Diagram that depicts a simple RAG flow.\" :::\n\nIn the diagram, a user submits a query. First, the system turns the user's prompt into an embedding. Then, it searches the vector database to find the documents or chunks that are most similar to the prompt.\n\n*Cosine similarity* measures how close two vectors are by looking at the angle between them. A value near 1 means the vectors are very similar; a value near -1 means they’re very different. This approach helps the system find documents with similar content.\n\n*Nearest neighbor algorithms* find the vectors that are closest to a given point. The *k-nearest neighbors (KNN) algorithm* looks for the top *k* closest matches. Systems like recommendation engines often use KNN and cosine similarity together to find the best matches for a user’s needs.\n\nAfter the search, send the best matching content and the user’s prompt to the LLM so it can generate a more relevant response.\n\n### Challenges and considerations\n\nA RAG system comes with its own challenges:\n\n- **Data privacy**: Handle user data responsibly, especially when retrieving or processing information from outside sources.\n- **Computational requirements**: Expect both retrieval and generation steps to use significant computing resources.\n- **Accuracy and relevance**: Focus on delivering accurate, relevant responses and watch for bias in your data or models.\n\nDevelopers need to address these challenges to build RAG systems that are efficient, ethical, and valuable.\n\nTo learn more about building production-ready RAG systems, see [Build advanced retrieval-augmented generation systems](advanced-retrieval-augmented-generation.md).\n\nWant to try building a generative AI solution? Start with [Get started with the chat using your own data sample for Python](/azure/developer/python/get-started-app-chat-template?tabs=github-codespaces). Tutorials are also available for [.NET](/dotnet/ai/get-started-app-chat-template?tabs=github-codespaces), [Java](/azure/developer/java/ai/get-started-app-chat-template?tabs=github-codespaces), and [JavaScript](/azure/developer/javascript/ai/get-started-app-chat-template?tabs=github-codespaces).\n\n## Fine-tuning a model\n\nFine-tuning retrains an LLM on a smaller, domain-specific dataset after its initial training on a large, general dataset.\n\nDuring pretraining, LLMs learn language structure, context, and general patterns from broad data. Fine-tuning teaches the model with new, focused data so it can perform better on specific tasks or topics. As it learns, the model updates its weights to handle the details of the new data.\n\n### Key benefits of fine-tuning\n\n- **Specialization**: Fine-tuning helps the model do better on specific tasks, like analyzing legal or medical documents or handling customer service.\n- **Efficiency**: Fine-tuning uses less data and fewer resources than training a model from scratch.\n- **Adaptability**: Fine-tuning lets the model learn new tasks or domains not covered in the original training.\n- **Improved performance**: Fine-tuning helps the model understand the language, style, or terminology of a new domain.\n- **Personalization**: Fine-tuning can make the model’s responses fit the needs or preferences of a user or organization.\n\n### Limitations and challenges\n\nFine-tuning also has some challenges:\n\n- **Data requirement**: You need a large, high-quality dataset for your specific task or domain.\n- **Risk of overfitting**: With a small dataset, the model might do well on training data but poorly on new data.\n- **Cost and resources**: Fine-tuning still needs computing power, especially for large models or datasets.\n- **Maintenance and updating**: You need to update fine-tuned models as your domain changes.\n- **Model drift**: Fine-tuning for a specific task can make the model less effective at general language tasks.\n\n\n\n[Customize a model through fine-tuning](/azure/ai-foundry/openai/how-to/fine-tuning?view=foundry&tabs=oai-sdk%2Cazure-openai&pivots=programming-language-studio&preserve-view=true) explains how to fine-tune a model.\n\n## Fine-tuning vs. RAG\n\nFine-tuning and RAG both help LLMs work better, but each fits different needs. Pick the right approach based on your goals, the data and compute you have, and whether you want the model to specialize or stay general.\n\n### When to choose fine-tuning\n\n- **Task-specific performance**: Pick fine-tuning when you need top results for a specific task and have enough domain data to avoid overfitting.\n- **Control over data**: Use fine-tuning if you have unique or proprietary data that’s very different from what the base model was pretrained on.\n- **Stable content**: Choose fine-tuning if your task doesn’t need constant updates with the latest information.\n\n### When to choose RAG\n\n- **Dynamic or changing content**: Use RAG when you need the most current information, like for news or recent events.\n- **Wide topic coverage**: Pick RAG if you want strong results across many topics, not just one area.\n- **Limited resources**: Go with RAG if you don’t have lots of data or compute for training, and the base model already does a good job.\n\n## Final thoughts for application design\n\nDecide between fine-tuning and RAG based on what your app needs. Fine-tuning is best for specialized tasks, while RAG gives you flexibility and up-to-date content for dynamic scenarios.\n"
  },
  {
    "path": "articles/ai/azure-ai-for-developers.md",
    "content": "---\ntitle: Overview of AI app development\ndescription: Overview article introducing the resources available in this content area, and how to get started integrating generative AI into applications.\nkeywords: ai, azure openai service\nms.service: azure\nms.topic: overview\nms.date: 11/25/2025\nms.custom: overview, devx-track-dotnet, devx-track-extended-java, devx-track-js, devx-track-python, build-2024-intelligent-apps\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\n---\n\n# Overview of AI app development\n\nThis documentation is designed for experienced developers who are new to building generative AI apps on Azure using Azure Services and their favorite programming language.\n\n## Introduction to generative AI for developers\n\nGenerative AI opens many new possibilities for applications. As a developer, it's important that you develop a mental model that maps how  the new terminology and technologies related to generative AI fit into what you already understand. The following series of articles show you how your current development experience applies to generative AI.\n\n* [Introduction to developing generative AI apps for experienced developers](./introduction-build-generative-ai-solutions.md)\n* [Important concepts and considerations for developers building generative AI solutions](./gen-ai-concepts-considerations-developers.md)\n* [Augmenting a Large Language Model with Retrieval-Augmented Generation and Fine-tuning](./augment-llm-rag-fine-tuning.md)\n* [Building advanced Retrieval-Augmented Generation systems](./advanced-retrieval-augmented-generation.md)\n\n## AI app design\n\nDesigning AI applications involves understanding user needs, selecting appropriate AI models, and integrating them effectively into your app architecture. The following resources provide guidance on best practices for designing AI-powered applications.\n\n* [AI agent orchestration patterns](/azure/architecture/ai-ml/guide/ai-agent-design-patterns?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n* [Design your AI app to support foundation model life cycles](/azure/architecture/ai-ml/guide/manage-foundation-models-lifecycle?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n\n## AI app templates\n\nAI app templates provide you with well-maintained, easy to deploy reference samples that provide a high-quality starting point for your AI apps.\n\nThere are two categories of AI app templates, **building blocks** and **end-to-end solutions**. Building blocks are smaller-scale samples that focus on specific scenarios and tasks. End-to-end solutions are comprehensive reference samples including documentation, source code, and deployment to allow you to take and extend for your own purposes.\n\nTo review a list of key templates available for each programming language, see [AI app templates](/azure/developer/ai/intelligent-app-templates). To browse all available templates, see the AI app templates on the [AI App Template gallery](https://azure.github.io/ai-app-templates/?tags=azureopenai).\n\nOne of the most popular templates is the chat with your data sample using Azure OpenAI and Azure AI Search.\n\n# [.NET](#tab/dotnet)\n\n* [Get started with the chat using your own data sample for .NET](/dotnet/ai/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n* [Source code](https://github.com/Azure-Samples/azure-search-openai-demo-csharp)\n\n# [Java](#tab/java)\n\n* [Get started with the chat using your own data sample for Java](/azure/developer/java/ai/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n* [Source code](https://github.com/Azure-Samples/azure-search-openai-demo-java)\n* [Video](https://aka.ms/azai/java/video)\n\n# [Python](#tab/python)\n\n* [Get started with the chat using your own data sample for Python](/azure/developer/python/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n* [Source code](https://github.com/Azure-Samples/azure-search-openai-demo)\n\n# [JavaScript](#tab/javascript)\n\n* [Get started with the chat using your own data sample for JavaScript](/azure/developer/javascript/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n* [Source code](https://github.com/Azure-Samples/azure-search-openai-javascript)\n* [Video (JavaScript frontend and Python backend)](https://aka.ms/azai/js.py/video)\n\n---\n\n## Agents and Model Context Protocol (MCP)\n\nFor developers interested in building more advanced AI applications, including agents that can interact with various services and APIs, we provide comprehensive resources and templates.\n\n* [Build Agents using Model Context Protocol on Azure](./intro-agents-mcp.md) - Learn how to build intelligent agents that can perform complex tasks by using the Model Context Protocol (MCP) on Azure.\n* [Build a TypeScript MCP server using Azure Container Apps servers](./build-mcp-server-ts.md) - A step-by-step guide to creating a TypeScript-based MCP server hosted on Azure Container Apps\n* [Create OpenAI-powered agents using MCP](./build-openai-mcp-server-dotnet.md) - A tutorial on building OpenAI-powered agents using MCP with .NET.\n\n## Authentication and security\n\nBuilding AI applications requires strong authentication and security to protect data and meet regulations. The following articles explain how to secure your AI apps on Azure.\n\n* [Security planning for LLM-based applications](/ai/playbook/technology-guidance/generative-ai/mlops-in-openai/security/security-plan-llm-application?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n\n* [Use Azure OpenAI without keys](./keyless-connections.md) \n\n* [Use Azure AI Search without keys](/azure/search/keyless-connections?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n\n## More resources by language\n\nEach language overview page links to popular articles, samples, documentation and more specific to your preferred programming language or platform.\n\n- [Python](../python/azure-ai-for-python-developers.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n- [JavaScript](../javascript/ai/azure-ai-for-javascript-developers.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n- [Java](../java/ai/azure-ai-for-java-developers.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n- [.NET](/dotnet/ai/azure-ai-for-dotnet-developers?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n"
  },
  {
    "path": "articles/ai/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: AI\n      tocHref: /azure\n      topicHref: /azure/developer/ai/index\n"
  },
  {
    "path": "articles/ai/build-mcp-server-ts.md",
    "content": "---\ntitle: \"Build a TypeScript MCP server using Azure Container Apps\"\ndescription: \"Learn how to build a remote TypeScript Model Context Protocol (MCP) server using Azure Container Apps.\"\nms.date: 09/12/2025\nms.topic: get-started \nms.subservice: intelligent-apps\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As an AI app developer, I want to learn how to build a TypeScript Model Context Protocol (MCP) server using Azure Container Apps.\n---\n\n# Build a TypeScript MCP server using Azure Container Apps\n\nThis article explains how to build a Model Context Protocol (MCP) server using Node.js and TypeScript. The server runs tools and services in a serverless environment. Use this structure as a starting point to create custom MCP servers.\n\n## Get to the code\n\nExplore the [TypeScript remote Model Context Protocol (MCP) server](https://github.com/Azure-Samples/mcp-container-ts) sample. It demonstrates how to use Node.js and TypeScript to build a remote MCP server and deploy it to Azure Container Apps.\n\nJump to the [code walkthrough section](#exploring-the-sample-code) to understand how this sample works.\n\n## Architectural overview\n\nThe following diagram shows the simple architecture of the sample app:\n:::image type=\"content\" source=\"./media/build-mcp-server-ts/simple-architecture-diagram.png\" lightbox=\"./media/build-mcp-server-ts/simple-architecture-diagram.png\" alt-text=\"Diagram showing architecture from Visual Studio Code hosting the agent and MCP client to MCP Server.\":::\n\nThe MCP server runs as a containerized app on Azure Container Apps (ACA). It uses a Node.js/TypeScript backend to provide tools to the MCP client through the Model Context Protocol. All tools work with a backend SQLite database.\n\n## Cost\n\nTo keep costs low, this sample uses basic or consumption pricing tiers for most resources. Adjust the tier as needed, and delete resources when you're done to avoid charges.\n\n## Prerequisites\n\n1. [Visual Studio Code](https://code.visualstudio.com/) - Latest version to support MCP Server development.\n1. [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) Visual Studio Code extension\n1. [GitHub Copilot Chat](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) Visual Studio Code extension\n1. [Azure Developer CLI (azd)](/azure/developer/azure-developer-cli/install-azd?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&pivots=os-windows)\n\nA [development container](https://containers.dev/) includes all the dependencies you need for this article. You can run it in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\nTo follow this article, make sure you meet these prerequisites:\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n- An Azure subscription – [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- Azure account permissions – Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [Role Based Access Control Administrator](/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview), [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator), or [Owner](/azure/role-based-access-control/built-in-roles#owner). If you don't have subscription-level permissions, you must be granted [RBAC](/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview) for an existing resource group and deploy to that group.\n  - Your Azure account also needs `Microsoft.Resources/deployments/write` permissions at the subscription level.\n- GitHub account\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n- An Azure subscription – [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- Azure account permissions – Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner)\n- [Azure Developer CLI](/azure/developer/azure-developer-cli)\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/) – make sure Docker Desktop is running\n- [Visual Studio Code](https://code.visualstudio.com/)\n- [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n---\n\n## Open development environment\n\nFollow these steps to set up a preconfigured development environment with all the required dependencies.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the interface. Use GitHub Codespaces for the simplest setup, as it comes with the necessary tools and dependencies preinstalled for this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\nUse the following steps to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/mcp-container-ts`](https://github.com/Azure-Samples/mcp-container-ts) GitHub repository.\n\n1. Right-click the following button and select _Open link in new window_. This action lets you have the development environment and the documentation open side by side.\n\n    [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/mcp-container-ts)\n\n1. On the **Create codespace** page, review and then select **Create new codespace**.\n\n1. Wait for the codespace to start. It might take a few minutes.\n\n1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\nYou do the rest of the tasks in this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code needs [Docker](https://docs.docker.com/) installed on your computer. The extension uses Docker to host the development container locally with the necessary tools and dependencies preinstalled for this article.\n\n1. Create a new local directory on your computer for the project.\n\n    ```shell\n    mkdir my-mcp-server\n    ```\n\n1. Navigate to the directory you created.\n\n    ```shell\n    cd my-mcp-server\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```shell\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```azdeveloper\n    azd init -t mcp-container-ts\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. You do the rest of the exercises in this development container.\n\n---\n\n> [!NOTE]\n> To run the MCP server locally:\n>    1. Set up your environment as described in the [Local environment setup](https://github.com/Azure-Samples/mcp-container-ts?tab=readme-ov-file#local-environment) section in the sample repository.\n>    1. Configure your MCP Server to use the local environment by following the instructions in the [Configure the MCP server in Visual Studio Code](https://github.com/Azure-Samples/mcp-container-ts?tab=readme-ov-file#test-your-mcp-server-with-desktop-mcp-clients) section in the sample repository.\n>    1. Skip to the [Use TODO MCP server tools in agent mode](#use-todo-mcp-server-tools-in-agent-mode) section to continue.\n\n## Deploy and run\n\nThe sample repository contains all the code and configuration files for the MCP server Azure deployment. The following steps walk you through the sample MCP server Azure deployment process.\n\n### Deploy to Azure\n\n> [!IMPORTANT]\n> Azure resources in this section start costing money immediately, even if you stop the command before it finishes.\n\n1. Run the following Azure Developer CLI command for Azure resource provisioning and source code deployment:\n\n    ```azdeveloper\n    azd up\n    ```\n\n1. Use the following table to answer the prompts:\n\n    |Prompt|Answer|\n    |--|--|\n    |Environment name|Keep it short and lowercase. Add your name or alias. For example, `my-mcp-server`. It's used as part of the resource group name.|\n    |Subscription|Select the subscription to create the resources in. |\n    |Location (for hosting)|Select a location near you from the list.|\n    |Location for the Azure OpenAI model|Select a location near you from the list. If the same location is available as your first location, select that.|\n\n1. Wait until the app is deployed. Deployment usually takes between 5 and 10 minutes to complete.\n\n1. Once the deployment is complete, you can access the MCP server using the URL provided in the output. The URL looks like this:\n\n```bash\nhttps://<env-name>.<container-id>.<region>.azurecontainerapps.io\n```\n\n1. Copy the URL to your clipboard. You'll need it in the next section.\n\n### Configure the MCP server in Visual Studio Code\n\nConfigure the MCP server in your local VS Code environment by adding the URL to the `mcp.json` file in the `.vscode` folder.\n\n1. Open the `mcp.json` file in the `.vscode` folder.\n\n1. Locate the `mcp-server-sse-remote` section in the file. It should look like this:\n\n    ```json\n        \"mcp-server-sse-remote\": {\n        \"type\": \"sse\",\n        \"url\": \"https://<container-id>.<location>.azurecontainerapps.io/sse\"\n    }\n    ```\n\n1. Replace the existing `url` value with the URL you copied in the previous step.\n\n1. Save the `mcp.json` file in the `.vscode` folder.\n\n### Use TODO MCP server tools in agent mode\n\nAfter modifying the MCP server, you can use the tools, it provides in agent mode. To use MCP tools in agent mode:\n\n1. Open the Chat view (`Ctrl+Alt+I`), and select Agent mode from the dropdown.\n\n1. Select the **Tools** button to view the list of available tools.\n      Optionally, select or deselect the tools you want to use. You can search tools by typing in the search box.\n\n1. Enter a prompt such as \"I need to send an email to my manager on Wednesday\" in the chat input box and notice how tools are automatically invoked as needed, as in the following screenshot:\n\n    :::image type=\"content\" source=\"./media/build-mcp-server-ts/mcp-server-tools-invocation.png\" lightbox=\"./media/build-mcp-server-ts/mcp-server-tools-invocation.png\"alt-text=\"Screenshot showing the MCP server tools invocation.\":::\n\n> [!NOTE]\n> By default, when a tool is invoked, you need to confirm the action before the tool runs. Otherwise, tools might run locally on your machine and might perform actions that modify files or data.\n\nUse the Continue button dropdown options to automatically confirm the specific tool for the current session, workspace, or all future invocations.\n\n## Exploring the sample code\n\nThis section provides an overview of the key files and code structure in the MCP server sample. The code is organized into several main components:\n\n- **`index.ts`**: The main entry point for the MCP server, which sets up the Express.js HTTP server and routing.\n- **`server.ts`**: The transport layer that manages Server-Sent Events (SSE) connections and MCP protocol handling.\n- **`tools.ts`**: Contains business logic and utility functions for the MCP server.\n- **`types.ts`**: Defines TypeScript types and interfaces used throughout the MCP server.\n\n### `index.ts` - How the server starts and accepts HTTP connections\n\nThe `index.ts` file is the main entry point for the MCP server. It initializes the server, sets up the Express.js HTTP server, and defines routing for Server-Sent Events (SSE) endpoints.\n\n#### Create the MCP server instance\n\nThe following code snippet initializes the MCP server using the `StreamableHTTPServer` class, which is a wrapper around the core MCP `Server` class. This class handles the transport layer for Server-Sent Events (SSE) and manages client connections.\n\n```typescript\nconst server = new StreamableHTTPServer(\n  new Server(\n    {\n      name: 'todo-http-server',\n      version: '1.0.0',\n    },\n    {\n      capabilities: {\n        tools: {},\n      },\n    }\n  )\n);\n```\n\n**Concepts**:\n\n- **Composition pattern**: `SSEPServer` wraps the low-level `Server` class\n- **Capabilities declaration**: Server announces it supports tools (but not resources/prompts)\n- **Naming convention**: Server name becomes part of MCP identification\n\n#### Set up Express routes\n\nThe following code snippet sets up the Express.js server to handle incoming HTTP requests for SSE connections and message handling:\n\n```typescript\nrouter.post('/messages', async (req: Request, res: Response) => {\n  await server.handlePostRequest(req, res);\n});\n\nrouter.get('/sse', async (req: Request, res: Response) => {\n  await server.handleGetRequest(req, res);\n});\n```\n\n**Concepts**:\n\n- **Two-endpoint pattern**: GET for establishing SSE connection, POST for sending messages\n- **Delegation pattern**: Express routes immediately delegate to `SSEPServer`\n\n#### Process lifecycle management\n\nThe following code snippet handles the server's lifecycle, including starting the server and gracefully shutting it down on termination signals:\n\n```typescript\nprocess.on('SIGINT', async () => {\n  log.error('Shutting down server...');\n  await server.close();\n  process.exit(0);\n});\n```\n\n**Concepts**:\n\n- **Graceful shutdown**: Proper cleanup on Ctrl+C\n- **Async cleanup**: Server close operation is asynchronous\n- **Resource management**: Important for SSE connections\n\n### Transport layer: `server.ts`\n\nThe `server.ts` file implements the transport layer for the MCP server, specifically handling Server-Sent Events (SSE) connections and routing MCP protocol messages.\n\n#### Set up an SSE client connection and create a transport\n\nThe `SSEPServer` class is the main transport layer for handling Server-Sent Events (SSE) in the MCP server. It uses the `SSEServerTransport` class to manage individual client connections. It manages multiple transports and their lifecycle.\n\n```typescript\nexport class SSEPServer {\n  server: Server;\n  transport: SSEServerTransport | null = null;\n  transports: Record<string, SSEServerTransport> = {};\n\n  constructor(server: Server) {\n    this.server = server;\n    this.setupServerRequestHandlers();\n  }\n}\n```\n\n**Concepts**:\n\n- **State management**: Tracks both current transport and all transports\n- **Session mapping**: `transports` object maps session IDs to transport instances\n- **Constructor delegation**: Immediately sets up request handlers\n\n#### SSE connection establishment (`handleGetRequest`)\n\nThe `handleGetRequest` method is responsible for establishing a new SSE connection when a client makes a GET request to the `/sse` endpoint.\n\n```typescript\nasync handleGetRequest(req: Request, res: Response) {\n  log.info(`GET ${req.originalUrl} (${req.ip})`);\n  try {\n    log.info(\"Connecting transport to server...\");\n    this.transport = new SSEServerTransport(\"/messages\", res);\n    TransportsCache.set(this.transport.sessionId, this.transport);\n\n    res.on(\"close\", () => {\n      if (this.transport) {\n        TransportsCache.delete(this.transport.sessionId);\n      }\n    });\n\n    await this.server.connect(this.transport);\n    log.success(\"Transport connected. Handling request...\");\n  } catch (error) {\n    // Error handling...\n  }\n}\n```\n\n**Concepts**:\n\n- **Transport creation**: New `SSEServerTransport` for each GET request\n- **Session management**: Autogenerated session ID stored in cache\n- **Event handlers**: Cleanup on connection close\n- **MCP connection**: `server.connect()` establishes protocol connection\n- **Async flow**: Connection setup is asynchronous with error boundaries\n\n#### Message processing (`handlePostRequest`)\n\nThe `handlePostRequest` method processes incoming POST requests to handle MCP messages sent by the client. It uses the session ID from the query parameters to find the correct transport instance.\n\n```typescript\nasync handlePostRequest(req: Request, res: Response) {\n  log.info(`POST ${req.originalUrl} (${req.ip}) - payload:`, req.body);\n\n  const sessionId = req.query.sessionId as string;\n  const transport = TransportsCache.get(sessionId);\n  if (transport) {\n    await transport.handlePostMessage(req, res, req.body);\n  } else {\n    log.error(\"Transport not initialized. Cannot handle POST request.\");\n    res.status(400).json(/* error response */);\n  }\n}\n```\n\n**Concepts**:\n\n- **Session lookup**: Uses `sessionId` query parameter to find transport\n- **Session validation**: Validates SSE connection first.\n- **Message delegation**: Transport handles actual message processing\n- **Error responses**: Proper HTTP error codes for missing sessions\n\n#### MCP Protocol Handler Setup (`setupServerRequestHandlers`)\n\nThe `setupServerRequestHandlers` method registers the following handlers for MCP protocol requests:\n\n- A handler for `ListToolsRequestSchema` that returns the list of available TODO tools.\n- A handler for `CallToolRequestSchema` that locates and executes the requested tool with the provided arguments.\n\nThis method uses [Zod schemas](https://zod.dev/?id=introduction) to define the expected request and response formats.\n\n```typescript\nprivate setupServerRequestHandlers() {\n  this.server.setRequestHandler(ListToolsRequestSchema, async (_request) => {\n    return {\n      tools: TodoTools,\n    };\n  });\n  \n  this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n    const { name, arguments: args } = request.params;\n    \n    const tool = TodoTools.find((tool) => tool.name === name);\n    if (!tool) {\n      return this.createJSONErrorResponse(`Tool \"${name}\" not found.`);\n    }\n    \n    const response = await tool.execute(args as any);\n    return { content: [{ type: \"text\", text: response }] };\n  });\n}\n```\n\n**Concepts**:\n\n- **Schema-Based Routing**: Uses Zod schemas for type-safe request handling\n- **Tool Discovery**: `ListToolsRequestSchema` returns static TodoTools array\n- **Tool Execution**: `CallToolRequestSchema` finds and executes tools\n- **Error Handling**: Graceful handling of unknown tools\n- **Response Format**: MCP-compliant response structure\n- **Type Safety**: TypeScript types ensure correct argument passing\n\n### Business logic: `tools.ts`\n\nThe `tools.ts` file defines the actual functionality available to MCP clients:\n\n- Tool metadata (name, description, schemas)\n- Input validation schemas\n- Tool execution logic\n- Integration with database layer \n\nThis MCP Server defines four TODO management tools:\n\n- `add_todo`: Creates a new TODO item\n- `complete_todo`: Marks a TODO item as completed\n- `delete_todo`: Deletes a TODO item\n- `list_todos`: Lists all TODO items\n- `update_todo_text`: Updates the text of an existing TODO item\n\n#### Tool Definition Pattern\n\nThe tools are defined as an array of objects, each representing a specific TODO operation. In the following code snippet, the `addTodo` tool is defined:\n\n```typescript\n{\n  name: \"addTodo\",\n  description: \"Add a new TODO item to the list...\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      text: { type: \"string\" },\n    },\n    required: [\"text\"],\n  },\n  outputSchema: { type: \"string\" },\n  async execute({ text }: { text: string }) {\n    const info = await addTodo(text);\n    return `Added TODO: ${text} (id: ${info.lastInsertRowid})`;\n  },\n}\n```\n\nEach tool definition has:\n\n- `name`: Unique identifier for the tool\n- `description`: Brief description of the tool's purpose\n- `inputSchema`: Zod schema defining the expected input format\n- `outputSchema`: Zod schema defining the expected output format\n- `execute`: Function implementing the tool's logic\n\nThese tool definitions are imported in `server.ts` and exposed through the `ListToolsRequestSchema` handler.\n\n**Concepts**:\n- **Modular Tool Design**: Each tool is a self-contained object\n- **JSON Schema Validation**: `inputSchema` defines expected parameters\n- **Type Safety**: TypeScript types match schema definitions\n- **Async Execution**: All tool executions are asynchronous\n- **Database Integration**: Calls imported database functions\n- **Human-Readable Responses**: Returns formatted strings, not raw data\n\n#### Tool Array Export\n\nThe tools are exported as a static array, making them easy to import and use in the server. Each tool is an object with its metadata and execution logic. This structure allows the MCP server to dynamically discover and execute tools based on client requests.\n\n```typescript\nexport const TodoTools = [\n  { /* addTodo */ },\n  { /* listTodos */ },\n  { /* completeTodo */ },\n  { /* deleteTodo */ },\n  { /* updateTodoText */ },\n];\n```\n\n**Concepts**:\n\n- **Static Registration**: Tools defined at module load time\n- **Array Structure**: Simple array makes tools easy to iterate\n- **Import/Export**: Clean separation from server logic\n\n#### Tool execution error handling\n\nEach tool's `execute` function handles errors smoothly and returns clear messages instead of throwing exceptions. This approach ensures the MCP server provides a seamless user experience.\n\nTools handle various error scenarios:\n\n```typescript\nasync execute({ id }: { id: number }) {\n  const info = await completeTodo(id);\n  if (info.changes === 0) {\n    return `TODO with id ${id} not found.`;\n  }\n  return `Marked TODO ${id} as completed.`;\n}\n```\n\n**Concepts**:\n\n- **Database Response Checking**: Uses `info.changes` to detect failures\n- **Graceful Degradation**: Returns descriptive error messages vs throwing\n- **User-Friendly Errors**: Messages suitable for AI interpretation\n\n### Data layer: `db.ts`\n\nThe `db.ts` file manages the SQLite database connection and handles CRUD operations for the TODO app. It uses the `better-sqlite3` library for synchronous database access.\n\n#### Database initialization\n\nThe database initializes by connecting to SQLite and creating tables if they don't exist. The following code snippet shows the initialization process:\n\n```typescript\nconst db = new Database(\":memory:\", {\n  verbose: log.info,\n});\n\ntry {\n  db.pragma(\"journal_mode = WAL\");\n  db.prepare(\n    `CREATE TABLE IF NOT EXISTS ${DB_NAME} (\n     id INTEGER PRIMARY KEY AUTOINCREMENT,\n     text TEXT NOT NULL,\n     completed INTEGER NOT NULL DEFAULT 0\n   )`\n  ).run();\n  log.success(`Database \"${DB_NAME}\" initialized.`);\n} catch (error) {\n  log.error(`Error initializing database \"${DB_NAME}\":`, { error });\n}\n```\n\n**Concepts**:\n\n- **In-Memory Database**: `:memory:` means data lost on restart (demo/testing only)\n- **WAL Mode**: Write-Ahead Logging for better performance\n- **Schema Definition**: Simple TODO table with autoincrement ID\n- **Error Handling**: Graceful handling of initialization failures\n- **Logging Integration**: Database operations are logged for debugging\n\n#### CRUD operation patterns\n\nThe `db.ts` file provides four main CRUD operations for managing TODO items:\n\n**Create operation**:\n\n```typescript\nexport async function addTodo(text: string) {\n  log.info(`Adding TODO: ${text}`);\n  const stmt = db.prepare(`INSERT INTO todos (text, completed) VALUES (?, 0)`);\n  return stmt.run(text);\n}\n```\n\n**Read operation**:\n\n```typescript\nexport async function listTodos() {\n  log.info(\"Listing all TODOs...\");\n  const todos = db.prepare(`SELECT id, text, completed FROM todos`).all() as Array<{\n    id: number;\n    text: string;\n    completed: number;\n  }>;\n  return todos.map(todo => ({\n    ...todo,\n    completed: Boolean(todo.completed),\n  }));\n}\n```\n\n**Update operation**:\n\n```typescript\nexport async function completeTodo(id: number) {\n  log.info(`Completing TODO with ID: ${id}`);\n  const stmt = db.prepare(`UPDATE todos SET completed = 1 WHERE id = ?`);\n  return stmt.run(id);\n}\n```\n\n**Delete operation**:\n\n```typescript\nexport async function deleteTodo(id: number) {\n  log.info(`Deleting TODO with ID: ${id}`);\n  const row = db.prepare(`SELECT text FROM todos WHERE id = ?`).get(id) as\n    | { text: string }\n    | undefined;\n  if (!row) {\n    log.error(`TODO with ID ${id} not found`);\n    return null;\n  }\n  db.prepare(`DELETE FROM todos WHERE id = ?`).run(id);\n  log.success(`TODO with ID ${id} deleted`);\n  return row;\n}\n```\n\n**Concepts**:\n\n- **Prepared Statements**: Protection against SQL injection\n- **Type Casting**: Explicit TypeScript types for query results\n- **Data Transformation**: Converting SQLite integers to booleans\n- **Atomic Operations**: Each function is a single database transaction\n- **Return Value Consistency**: Functions return operation metadata\n- **Defensive Programming**: Check-before-delete pattern\n\n#### Schema Design\n\nThe database schema is defined in the `db.ts` file using a simple SQL statement. The `todos` table has three fields:\n\n```sql\nCREATE TABLE todos (\n  id INTEGER PRIMARY KEY AUTOINCREMENT,  -- Unique identifier\n  text TEXT NOT NULL,                    -- TODO description  \n  completed INTEGER NOT NULL DEFAULT 0   -- Boolean as integer\n);\n```\n\n### Helper utilities: `helpers/` directory\n\nThe `helpers/` directory provides utility functions and classes for the server.\n\n#### Structured logging for debugging and monitoring: `helpers/logs.ts`\n\nThe `helpers/logs.ts` file provides a structured logging utility for the MCP server. It uses the `debug` library for logging and `chalk` for color-coded output in the console.\n\n```typescript\nexport const logger = (namespace: string) => {\n  const dbg = debug('mcp:' + namespace);\n  const log = (colorize: ChalkInstance, ...args: any[]) => {\n    const timestamp = new Date().toISOString();\n    const formattedArgs = [timestamp, ...args].map((arg) => {\n      if (typeof arg === 'object') {\n        return JSON.stringify(arg, null, 2);\n      }\n      return arg;\n    });\n    dbg(colorize(formattedArgs.join(' ')));\n  };\n\n  return {\n    info(...args: any[]) { log(chalk.cyan, ...args); },\n    success(...args: any[]) { log(chalk.green, ...args); },\n    warn(...args: any[]) { log(chalk.yellow, ...args); },\n    error(...args: any[]) { log(chalk.red, ...args); },\n  };\n};\n```\n\n#### Session management for SSE transports: `helpers/cache.ts`\n\nThe `helpers/cache.ts` file uses a `Map` to store SSE transports by session ID. This approach allows the server to quickly find and manage active connections.\n\n```typescript\nimport type { SSEServerTransport } from \"@modelcontextprotocol/sdk/server/sse\";\n\nexport const TransportsCache = new Map<string, SSEServerTransport>();\n```\n\n> [!NOTE]\n> The `TransportsCache` is a simple in-memory cache. In production, consider using a more robust solution like Redis or a database for session management.\n\n### Execution flow summary\n\nThe following diagram illustrates the complete request journey from the client to the MCP server and back, including tool execution and database operations:\n\n:::image type=\"content\" source=\"./media/build-mcp-server-ts/execution-flow-diagram.png\" lightbox=\"./media/build-mcp-server-ts/execution-flow-diagram.png\" alt-text=\"Diagram showing the complete request journey from the client to the MCP server and back.\":::\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDelete the GitHub Codespaces environment to maximize your free per-core hours.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's free storage and core hours, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Find your active Codespaces created from the [`Azure-Samples//mcp-container-ts`](https://github.com/Azure-Samples/mcp-container-ts) GitHub repository.\n\n1. Open the context menu for the codespace and select **Delete**.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nStop the running development container and return to Visual Studio Code in your local workspace.\n\nOpen the **Command Palette**, search for **Dev Containers**, and select **Dev Containers: Reopen Folder Locally**.\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. Free up space on your local machine by deleting the container instance, image, and volumes from Docker.\n\n---\n\n## Get help\n\nLog your issue to the repository's [Issues](https://github.com/Azure-Samples/mcp-container-ts/issues).\n\n## Related resources\n\n- [Introduction to Agents and the Model Context Protocol](intro-agents-mcp.md)\n- [Build a .NET OpenAI Agent using an MCP server on Azure Container Apps](build-openai-mcp-server-dotnet.md)"
  },
  {
    "path": "articles/ai/build-openai-mcp-server-dotnet.md",
    "content": "---\ntitle: Build a .NET OpenAI Agent using an MCP server on Azure Container Apps\ndescription: Learn how to build a .NET OpenAI Agent using an MCP server using Azure Container Apps.\nms.date: 09/12/2025\nms.topic: get-started \nms.subservice: intelligent-apps\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As an AI app developer, I want to learn how to build a .NET OpenAI Agent using an MCP server using Azure Container Apps.\n---\n\n# Build a .NET OpenAI Agent using an MCP server on Azure Container Apps\n\nThis article shows you how to build a Model Context Protocol (MCP) agent using .NET. In this sample, the MCP client (written in C#/.NET) connects to an MCP server (written in TypeScript) to manage a todo list. The client finds available tools from the server and sends them to an Azure OpenAI model. Users can then talk to the todo system using everyday language.\n\n## Get to the code\n\nCheck out the [OpenAI MCP Agent Building Block AI template](https://aka.ms/mcp/openai). This example shows how to build an OpenAI agent that uses an MCP client to consume an existing MCP server.\n\nJump to the [code walkthrough section](#explore-the-code) to understand how this sample works.\n\n## Architectural overview\n\nThe following diagram shows the simple architecture of the sample app:\n:::image type=\"content\" source=\"./media/build-openai-mcp-server-dotnet/simple-architecture-diagram.png\" lightbox=\"./media/build-openai-mcp-server-dotnet/simple-architecture-diagram.png\" alt-text=\"Diagram showing architecture from Visual Studio Code hosting the agent and MCP client to MCP Server.\":::\n\n- **MCP Client**: Connects to the MCP server and finds available tools\n- **Chat Client**: Works with Azure OpenAI to understand natural language\n- **Blazor UI**: Provides a web interface where users can chat\n- **Transport Layer**: Uses Server-Sent Events (SSE) to send messages in real-time\n- **Authentication**: Uses JWT tokens to keep the connection secure\n\nThe MCP server runs as a containerized app on Azure Container Apps (ACA). It uses a TypeScript backend to provide tools to the MCP client through the Model Context Protocol. All tools work with a backend SQLite database.\n\n> [!NOTE]\n> Visit [Build a TypeScript MCP server using Azure Container Apps](build-mcp-server-ts.md) to see the code walkthrough of the TypeScript MCP Server used in this article.\n\n## Cost\n\nTo keep costs low, this sample uses basic or consumption pricing tiers for most resources. Adjust the tier as needed, and delete resources when you're done to avoid charges.\n\n## Prerequisites\n\n- [Visual Studio Code](https://code.visualstudio.com/) - Latest version to support MCP Server development.\n- [.NET 9 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/9.0)\n- [C# Dev Kit for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) Visual Studio Code extension\n- [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) Visual Studio Code extension\n- [GitHub Copilot Chat](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) Visual Studio Code extension\n- [Azure Developer CLI (azd)](/azure/developer/azure-developer-cli/install-azd?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&pivots=os-windows)\n- [Microsoft Foundry for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.vscode-ai-foundry) extension\n- A deployed Foundry gpt-5-mini model\n\nA [development container](https://containers.dev/) includes all the dependencies you need for this article. You can run it in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\nTo follow this article, make sure you meet these prerequisites:\n\n### Deploy a Foundry gpt-5-mini model using the Foundry VS Code Extension\n\nDeploy a `gpt-5-mini` model using the Foundry Extension in Visual Studio Code using the following steps:\n\n#### Create a Foundry project and deploy the model\n\n- To create a Foundry project and deploy a `gpt-5-mini` model, follow the **Get Started** instructions in the [Work with the Microsoft Foundry for Visual Studio Code extension (Preview)](/azure/ai-foundry/how-to/develop/get-started-projects-vs-code#get-started) article.\n\n#### Create the OpenAI Model connection string\n\n1. Once the `gpt-5-mini` model is deployed, right-click the model in the Foundry extension and select **Copy API key** to copy the model's API key to your clipboard. \n\n1. Next, right-click the deployed `gpt-5-mini` model in the Foundry extension and select **Copy endpoint** to copy the model's endpoint to your clipboard, as shown in the following screenshot:\n\n    :::image type=\"content\" source=\"./media/build-openai-mcp-server-dotnet/copy-api-key-endpoint.png\" lightbox=\"./media/build-openai-mcp-server-dotnet/copy-api-key-endpoint.png\" alt-text=\"Screenshot showing the context menu for the deployed model with the Copy endpoint and Copy API key options highlighted.\":::\n\n\n1. Finally, create a connection string for the deployed `gpt-5-mini` model using the copied endpoint and API key in the following format:\n `Endpoint=<AZURE_OPENAI_ENDPOINT>;Key=<AZURE_OPENAI_API_KEY>`. You need this connection string later in the article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n- An Azure subscription – [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- Azure account permissions – Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [Role Based Access Control Administrator](/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview), [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator), or [Owner](/azure/role-based-access-control/built-in-roles#owner). If you don't have subscription-level permissions, you must be granted [RBAC](/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview) for an existing resource group and deploy to that group.\n  - Your Azure account also needs `Microsoft.Resources/deployments/write` permissions at the subscription level.\n- GitHub account\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n- An Azure subscription – [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- Azure account permissions – Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner)\n- [Azure Developer CLI](/azure/developer/azure-developer-cli)\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/) – make sure Docker Desktop is running\n- [Visual Studio Code](https://code.visualstudio.com/)\n- [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n---\n\n## Open development environment\n\nFollow these steps to set up a preconfigured development environment with all the required dependencies.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the interface. Use GitHub Codespaces for the simplest setup, as it comes with the necessary tools and dependencies preinstalled for this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\nUse the following steps to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/openai-mcp-agent-dotnet`](https://github.com/Azure-Samples/openai-mcp-agent-dotnet) GitHub repository.\n\n1. Right-click the following button and select _Open link in new window_. This action lets you have the development environment and the documentation open side by side.\n\n    [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/openai-mcp-agent-dotnet)\n\n1. On the **Create codespace** page, review and then select **Create new codespace**.\n\n1. Wait for the codespace to start. It might take a few minutes.\n\n1. Make sure that your deployed model name is `gpt-5-mini`. If your deployed model is different, update `src/McpTodo.ClientApp/appsettings.json` with the correct deployment name.\n\n    ```json\n    {\n      \"OpenAI\": {\n        // Make sure this is the right deployment name.\n        \"DeploymentName\": \"gpt-5-mini\"\n      }\n    }\n    ```\n\n1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen.\n\n    ```shell\n    azd auth login\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\nYou do the rest of the tasks in this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code needs [Docker](https://docs.docker.com/) installed on your computer. The extension uses Docker to host the development container locally with the necessary tools and dependencies preinstalled for this article.\n\n1. Create a new local directory on your computer for the project.\n\n    ```shell\n    mkdir my-mcp-agent\n    ```\n\n1. Navigate to the directory you created.\n\n    ```shell\n    cd my-mcp-agent\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```shell\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```shell\n    azd init -t openai-mcp-agent-dotnet\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n\n1. Make sure that your deployed model name is `gpt-5-mini`. If your deployed model is different, update `src/McpTodo.ClientApp/appsettings.json` with the correct deployment name.\n\n    ```json\n    {\n      \"OpenAI\": {\n        // Make sure this is the right deployment name.\n        \"DeploymentName\": \"gpt-5-mini\"\n      }\n    }\n    ```\n\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. You do the rest of the exercises in this development container.\n\n---\n\n> [!NOTE]\n> To run the MCP agent locally:\n>    1. Set up your environment as described in the [Getting started](https://github.com/Azure-Samples/openai-mcp-agent-dotnet?tab=readme-ov-file#getting-started) section in the sample repository.\n>    1. Install your MCP Server by following the instructions in the [Get MCP Server App](https://github.com/Azure-Samples/openai-mcp-agent-dotnet?tab=readme-ov-file#get-mcp-server-app) section in the sample repository.\n>    1. Run the MCP agent locally by following the instructions in the [Run locally](https://github.com/Azure-Samples/openai-mcp-agent-dotnet?tab=readme-ov-file#run-locally) section in the sample repository.\n>    1. Skip to the [Use the TODO MCP agent](#use-the-todo-mcp-agent) section to continue.\n\n## Deploy and run\n\nThe sample repository contains all the code and configuration files for the MCP agent Azure deployment. The following steps walk you through the sample MCP agent Azure deployment process.\n\n### Deploy to Azure\n\n> [!IMPORTANT]\n> Azure resources in this section start costing money immediately, even if you stop the command before it finishes.\n\n#### Set the JWT token\n\n- Set the JWT token for the MCP server by running the following command in the terminal at the bottom of the screen:\n\n    ```bash\n    # zsh/bash\n    ./scripts/set-jwttoken.sh\n    ```\n\n    ```powershell\n    # PowerShell\n    ./scripts/Set-JwtToken.ps1\n    ```\n\n#### Add JWT token to azd environment configuration\n\n1. Add the JWT token to azd environment configuration by running the following command in the terminal at the bottom of the screen:\n\n    ```bash\n    # zsh/bash\n    env_dir=\".azure/$(azd env get-value AZURE_ENV_NAME)\"\n    mkdir -p \"$env_dir\"\n    cat ./src/McpTodo.ServerApp/.env >> \"$env_dir/.env\"\n    ```\n\n    ```powershell\n    # PowerShell\n    $dotenv = Get-Content ./src/McpTodo.ServerApp/.env\n    $dotenv | Add-Content -Path ./.azure/$(azd env get-value AZURE_ENV_NAME)/.env -Encoding utf8 -Force\n    ```\n\n    > [!NOTE]\n    > By default, the MCP client app is protected by the ACA built-in authentication feature. You can turn off this feature before running `azd up` by setting:\n    >\n    >    ```bash\n    >    azd env set USE_LOGIN false\n    >    ```\n\n1. Run the following Azure Developer CLI command for Azure resource provisioning and source code deployment:\n\n    ```shell\n    azd up\n    ```\n\n1. Use the following table to answer the prompts:\n\n    |Prompt|Answer|\n    |--|--|\n    |Environment name|Use a short, lowercase name. Add your name or alias. For example, `my-mcp-agent`. The environment name becomes part of the resource group name.|\n    |Subscription|Choose the subscription where you want to create resources.|\n    |Location (for hosting)|Pick the model deployment location from the list.|\n    |OpenAI Connection string|Paste the connection string for the OpenAI model you created earlier in the [Create the OpenAI Model connection string](#create-the-openai-model-connection-string) section.|\n\n1. App deployment takes 5 to 10 minutes.\n\n1. After deployment finishes, you can access the MCP agent using the URL in the output. The URL looks like this:\n\n    ```bash\n    https://<env-name>.<container-id>.<region>.azurecontainerapps.io\n    ```\n\n1. Open the URL in a web browser to use the MCP agent.\n\n### Use the TODO MCP agent\n\nAfter the MCP agent is running, you can use the tools it provides in agent mode. To use MCP tools in agent mode:\n\n1. Navigate to the client app URL and sign in to the app.\n\n    > [!NOTE]\n    > if you set the `USE_LOGIN` value to `false`, you might not be asked to sign in.\n\n1. Enter a prompt such as \"I need to send an email to my manager on Wednesday\" in the chat input box and notice how tools are automatically invoked as needed.\n\n1. The MCP agent uses the tools provided by the MCP server to fulfill the request and return a response in the chat interface.\n\n1. Experiment with other prompts like:\n\n    ```text\n    Give me a list of to dos.\n    Set \"meeting at 1pm\".\n    Give me a list of to dos.\n    Mark #1 as completed.\n    Delete #1 from the to-do list.\n    ```\n\n## Explore the code\n\nThe sample repository contains all the code and configuration files for the MCP agent Azure deployment. The following sections walk you through the key components of the MCP agent code.\n\n### MCP Client configuration and setup\n\nThe application sets up the MCP client in `Program.cs`. This configuration defines how to connect and what options to use. The code uses several advanced patterns including .NET Aspire integration and service defaults:\n\n```csharp\nbuilder.Services.AddSingleton<IMcpClient>(sp =>\n{\n    var config = sp.GetRequiredService<IConfiguration>();\n    var loggerFactory = sp.GetRequiredService<ILoggerFactory>();\n\n    var uri = new Uri(config[\"McpServers:TodoList\"]!);\n\n    var clientTransportOptions = new SseClientTransportOptions()\n    {\n        Endpoint = new Uri($\"{uri.AbsoluteUri.TrimEnd('/')}/mcp\"),\n        AdditionalHeaders = new Dictionary<string, string>\n        {\n            { \"Authorization\", $\"Bearer {config[\"McpServers:JWT:Token\"]!}\" }\n        }\n    };\n    var clientTransport = new SseClientTransport(clientTransportOptions, loggerFactory);\n\n    var clientOptions = new McpClientOptions()\n    {\n        ClientInfo = new Implementation()\n        {\n            Name = \"MCP Todo Client\",\n            Version = \"1.0.0\",\n        }\n    };\n\n    return McpClientFactory.CreateAsync(clientTransport, clientOptions, loggerFactory).GetAwaiter().GetResult();\n});\n```\n\n**Key implementation details:**\n\n- **Transport Configuration**: `SseClientTransportOptions` supports both Server-Sent Events (SSE) and streamable HTTP transport. The transport method depends on the endpoint URL - endpoints ending with `/sse` use Server-Sent Events, while endpoints ending with `/mcp` use streamable HTTP. This approach enables real-time communication between client and server\n- **Authentication Headers**: JWT tokens go in the `AdditionalHeaders` to keep server communication secure\n- **Client Information**: `McpClientOptions` tells the server the client's name and version\n- **Factory Pattern**: `McpClientFactory.CreateAsync()` connects and completes the protocol handshake\n\n#### .NET Aspire service defaults integration\n\nThe application uses .NET Aspire's service defaults pattern for cross-cutting concerns:\n\n```csharp\n// McpTodo.ServiceDefaults/Extensions.cs\npublic static TBuilder AddServiceDefaults<TBuilder>(this TBuilder builder) where TBuilder : IHostApplicationBuilder\n{\n    builder.ConfigureOpenTelemetry();\n    builder.AddDefaultHealthChecks();\n    builder.Services.AddServiceDiscovery();\n    \n    builder.Services.ConfigureHttpClientDefaults(http =>\n    {\n        // Turn on resilience by default\n        http.AddStandardResilienceHandler();\n        // Turn on service discovery by default\n        http.AddServiceDiscovery();\n    });\n    \n    return builder;\n}\n```\n\n**Service defaults benefits:**\n\n- **Composable Extension Methods**: The system uses a clean builder pattern to add shared features\n- **Standard Resilience Handlers**: The system adds built-in retry, circuit breaker, and timeout rules for you\n- **Service Discovery Integration**: The system finds services automatically in container environments\n- **OpenTelemetry by Default**: The system gets full monitoring without any setup work\n\nThe following diagram shows the relationship between cross-cutting concerns and application services:\n\n:::image type=\"content\" source=\"./media/build-openai-mcp-server-dotnet/dependency-injection-graph.png\" lightbox=\"./media/build-openai-mcp-server-dotnet/dependency-injection-graph.png\" alt-text=\"Diagram showing the relationship between cross-cutting concerns and application services.\":::\n\n#### Configuration URL Resolution\n\nThe sample includes sophisticated URL resolution for different environments:\n\n```csharp\n// AspireUrlParserExtensions.cs\npublic static Uri Resolve(this Uri uri, IConfiguration config)\n{\n    var absoluteUrl = uri.ToString();\n    if (absoluteUrl.StartsWith(\"https+http://\"))\n    {\n        var appname = absoluteUrl.Substring(\"https+http://\".Length).Split('/')[0];\n        var https = config[$\"services:{appname}:https:0\"]!;\n        var http = config[$\"services:{appname}:http:0\"]!;\n        \n        return string.IsNullOrWhiteSpace(https) ? new Uri(http) : new Uri(https);\n    }\n    // Handle other URL formats...\n}\n```\n\n**Configuration Management Features:**\n\n- **Service Discovery Abstraction**: The system handles development and production URLs cleanly\n- **Protocol Negotiation**: The system chooses HTTPS first, then falls back to HTTP  \n- **Configuration Convention**: The system uses standard .NET Aspire service setup patterns\n\n### Authentication Implementation\n\nThis sample uses JWT (JSON Web Token) authentication to secure the connection between the MCP client and server.\n\n  ```bash\n  dotnet user-secrets --project ./src/McpTodo.ClientApp set McpServers:JWT:Token \"$TOKEN\"\n  ```\n\n> [!NOTE]\n> The scripts created the `$TOKEN` variable automatically when you ran either the Bash (`set-jwttoken.sh`) or PowerShell (`Set-JwtToken.ps1`) script earlier in the **Deploy to Azure** section.\n> These scripts perform the following steps:\n> 1. Run `npm run generate-token` in the MCP server app to create a JWT token\n> 1. Parse the generated `.env` file to extract the JWT_TOKEN value\n> 1. Automatically store it in .NET user secrets for the MCPClient\n\nThe MCP client retrieves the JWT token from configuration and includes it in the HTTP headers for authentication when connecting to the MCP server:\n\n```csharp\nAdditionalHeaders = new Dictionary<string, string>\n{\n    { \"Authorization\", $\"Bearer {config[\"McpServers:JWT:Token\"]!}\" }\n}\n```\n\nThis approach ensures:\n\n- **Secure Communication**: The system only allows clients with valid tokens to connect to the MCP server\n- **Token-Based Authorization**: JWT tokens let the system verify users without storing session data\n- **Configuration Management**: The system stores sensitive tokens safely in user secrets during development\n\n#### Azure Container Apps Authentication Integration\n\nThe infrastructure shows advanced authentication patterns using [Azure Container Apps built-in authentication and authorization features (\"Easy Auth\")](/azure/container-apps/authentication):\n\n```bicep\n// containerapps-authconfigs.bicep\nresource containerappAuthConfig 'Microsoft.App/containerApps/authConfigs@2024-10-02-preview' = {\n  properties: {\n    identityProviders: {\n      azureActiveDirectory: {\n        enabled: true\n        registration: {\n          clientId: clientId\n          openIdIssuer: openIdIssuer\n        }\n      }\n    }\n    login: {\n      tokenStore: {\n        enabled: true\n        azureBlobStorage: {\n          blobContainerUri: '${storageAccount.properties.primaryEndpoints.blob}/token-store'\n          managedIdentityResourceId: userAssignedIdentity.id\n        }\n      }\n    }\n  }\n}\n```\n\n**Advanced Authentication Features:**\n\n- **Zero-Code Authentication**: Azure Container Apps provides built-in authentication\n- **Managed Identity for Storage**: The system stores tokens securely without connection strings\n- **Federated Identity Credentials**: The system enables workload identity for Kubernetes-style authentication\n\nThe following diagram shows the security handshake between components:\n\n:::image type=\"content\" source=\"./media/build-openai-mcp-server-dotnet/authentication-flow-sequence.png\" lightbox=\"./media/build-openai-mcp-server-dotnet/authentication-flow-sequence.png\" alt-text=\"Diagram showing the security handshake between components.\":::\n\n### Tool discovery and registration\n\nThe MCP client discovers available tools from the server during component initialization in `Chat.razor`:\n\n```csharp\nprotected override async Task OnInitializedAsync()\n{\n    messages.Add(new(ChatRole.System, SystemPrompt));\n    tools = await McpClient.ListToolsAsync();\n    chatOptions.Tools = [.. tools];\n}\n```\n\n**How Tool Discovery Works:**\n\n1. **Server Query**: `McpClient.ListToolsAsync()` sends a request to the MCP server to list available tools\n2. **Schema Retrieval**: The server sends back tool definitions with names, descriptions, and input schemas\n3. **Tool Registration**: The system registers tools with the `ChatOptions` object, making them available to the OpenAI client\n4. **Type Safety**: The `McpClientTool` class inherits from `AIFunction`, giving smooth integration with Microsoft.Extensions.AI\n\nThe following diagram shows how tool schemas are parsed and registered:\n\n:::image type=\"content\" source=\"./media/build-openai-mcp-server-dotnet/tool-discovery-flow.png\" lightbox=\"./media/build-openai-mcp-server-dotnet/tool-discovery-flow.png\" alt-text=\"Diagram showing the tool discovery and registration flow.\":::\n\n### OpenAI integration and function invocation\n\nThe chat client configuration demonstrates how MCP tools integrate with Azure OpenAI:\n\n```csharp\nvar chatClient = openAIClient.GetChatClient(config[\"OpenAI:DeploymentName\"]).AsIChatClient();\n\nbuilder.Services.AddChatClient(chatClient)\n                .UseFunctionInvocation()\n                .UseLogging();\n```\n\n**Integration benefits:**\n\n- **Automatic Function Calling**: The `.UseFunctionInvocation()` extension turns on automatic tool execution based on LLM decisions\n- **Easy Tool Access**: MCP tools work as built-in functions for the OpenAI model\n- **Response Processing**: The system automatically adds tool results to the conversation flow\n\n### Real-Time chat implementation\n\nThe chat interface in `Chat.razor` demonstrates streaming responses and tool execution with advanced Blazor patterns:\n\n```csharp\nprivate async Task AddUserMessageAsync(ChatMessage userMessage)\n{\n    CancelAnyCurrentResponse();\n\n    // Add the user message to the conversation\n    messages.Add(userMessage);\n    chatSuggestions?.Clear();\n    await chatInput!.FocusAsync();\n\n    // Stream and display a new response from the IChatClient\n    var responseText = new TextContent(\"\");\n    currentResponseMessage = new ChatMessage(ChatRole.Assistant, [responseText]);\n    currentResponseCancellation = new();\n    await foreach (var update in ChatClient.GetStreamingResponseAsync([.. messages], chatOptions, currentResponseCancellation.Token))\n    {\n        messages.AddMessages(update, filter: c => c is not TextContent);\n        responseText.Text += update.Text;\n        ChatMessageItem.NotifyChanged(currentResponseMessage);\n    }\n\n    // Store the final response in the conversation, and begin getting suggestions\n    messages.Add(currentResponseMessage!);\n    currentResponseMessage = null;\n    chatSuggestions?.Update(messages);\n}\n```\n\n**Streaming implementation features:**\n\n- **Real-Time Updates**: `GetStreamingResponseAsync()` sends response updates bit by bit\n- **Tool Execution**: The system processes function calls automatically during streaming\n- **UI Responsiveness**: `ChatMessageItem.NotifyChanged()` updates the UI in real-time\n- **Cancellation Support**: Users can cancel long-running operations\n\n#### Advanced Blazor UI patterns\n\nThe implementation uses advanced UI patterns for real-time updates:\n\n**Memory-Safe event handling:**\n\n```csharp\n// ChatMessageItem.razor\nprivate static readonly ConditionalWeakTable<ChatMessage, ChatMessageItem> SubscribersLookup = new();\n\npublic static void NotifyChanged(ChatMessage source)\n{\n    if (SubscribersLookup.TryGetValue(source, out var subscriber))\n    {\n        subscriber.StateHasChanged();\n    }\n}\n```\n\n**Custom web components integration:**\n\n```javascript\n// ChatMessageList.razor.js\nwindow.customElements.define('chat-messages', class ChatMessages extends HTMLElement {\n    connectedCallback() {\n        this._observer = new MutationObserver(mutations => this._scheduleAutoScroll(mutations));\n        this._observer.observe(this, { childList: true, attributes: true });\n    }\n    \n    _scheduleAutoScroll(mutations) {\n        // Debounce the calls and handle smart auto-scrolling\n        cancelAnimationFrame(this._nextAutoScroll);\n        this._nextAutoScroll = requestAnimationFrame(() => {\n            const addedUserMessage = mutations.some(m => \n                Array.from(m.addedNodes).some(n => \n                    n.parentElement === this && n.classList?.contains('user-message')));\n            // Smart scrolling logic...\n        });\n    }\n});\n```\n\n**Advanced state management:**\n\n```csharp\n// Chat.razor\nprivate void CancelAnyCurrentResponse()\n{\n    // If a response was cancelled while streaming, include it in the conversation so it's not lost\n    if (currentResponseMessage is not null)\n    {\n        messages.Add(currentResponseMessage);\n    }\n    \n    currentResponseCancellation?.Cancel();\n    currentResponseMessage = null;\n}\n```\n\n**Blazor UI benefits:**\n\n- **Hybrid Web Components**: The system combines Blazor Server with custom elements for better performance\n- **Memory-Safe Event Handling**: The system uses ConditionalWeakTable to prevent memory leaks\n- **Smart Auto-Scrolling**: The system provides user-friendly chat behavior with debouncing\n- **Graceful Cancellation**: The system saves partial work when users cancel operations\n\n### Request/response flow\n\nHere's how a typical user interaction flows through the system:\n\n1. **User Input**: The user types a message like \"Add 'Buy groceries' to my todo list\"\n2. **Message Processing**: The system adds the message to the conversation history\n3. **LLM Analysis**: Azure OpenAI analyzes the request and decides which tools to use\n4. **Tool Discovery**: The model finds the right MCP tool (for example, `addTodo`)\n5. **Tool Execution**: The MCP client calls the server with the needed parameters\n6. **Response Processing**: The system adds the server response to the conversation\n7. **UI Update**: The system shows the result to the user in real-time\n\nThe following diagram shows how messages flow from user input through OpenAI to tool execution and back to the user interface:\n\n:::image type=\"content\" source=\"./media/build-openai-mcp-server-dotnet/request-response-sequence.png\" lightbox=\"./media/build-openai-mcp-server-dotnet/request-response-sequence.png\" alt-text=\"Diagram showing the request/response flow.\":::\n\n\n#### Async Pattern Management\n\nThe application demonstrates sophisticated async patterns for background operations:\n\n```csharp\n// ChatSuggestions.razor\npublic void Update(IReadOnlyList<ChatMessage> messages)\n{\n    // Runs in the background and handles its own cancellation/errors\n    _ = UpdateSuggestionsAsync(messages);\n}\n\nprivate async Task UpdateSuggestionsAsync(IReadOnlyList<ChatMessage> messages)\n{\n    cancellation?.Cancel();\n    cancellation = new CancellationTokenSource();\n    \n    try\n    {\n        var response = await ChatClient.GetResponseAsync<string[]>(\n            [.. ReduceMessages(messages), new(ChatRole.User, Prompt)],\n            cancellationToken: cancellation.Token);\n        // Handle response...\n    }\n    catch (Exception ex) when (ex is not OperationCanceledException)\n    {\n        await DispatchExceptionAsync(ex);\n    }\n}\n```\n\n**Background Task Benefits:**\n\n- **Fire-and-Forget with Safety**: The system uses `_ =` pattern with proper exception handling\n- **Smart Context Reduction**: The system limits conversation history to prevent token overflow\n- **Smart Cancellation**: The system properly cleans up competing operations\n\n### Error handling and resilience\n\nThe implementation includes several resilience patterns:\n\n```csharp\nprivate void CancelAnyCurrentResponse()\n{\n    // If a response was cancelled while streaming, include it in the conversation so it's not lost\n    if (currentResponseMessage is not null)\n    {\n        messages.Add(currentResponseMessage);\n    }\n\n    currentResponseCancellation?.Cancel();\n    currentResponseMessage = null;\n}\n```\n\n**Resilience Features:**\n\n- **Graceful Cancellation**: The system saves in-progress responses when users cancel them\n- **Connection Recovery**: The SSE transport handles connection drops automatically\n- **State Management**: The UI state stays consistent during errors\n- **Logging Integration**: The system provides complete logging for debugging and monitoring\n\n#### Observability and health checks\n\nThe application includes sophisticated observability patterns:\n\n**Smart Health Check Configuration:**\n\n```csharp\n// Extensions.cs\npublic static WebApplication MapDefaultEndpoints(this WebApplication app)\n{\n    if (app.Environment.IsDevelopment())\n    {\n        // All health checks must pass for app to be considered ready\n        app.MapHealthChecks(HealthEndpointPath);\n        \n        // Only health checks tagged with \"live\" must pass for app to be considered alive\n        app.MapHealthChecks(AlivenessEndpointPath, new HealthCheckOptions\n        {\n            Predicate = r => r.Tags.Contains(\"live\")\n        });\n    }\n    return app;\n}\n```\n\n**OpenTelemetry with intelligent filtering:**\n\n```csharp\n// Extensions.cs\n.AddAspNetCoreInstrumentation(tracing =>\n    // Exclude health check requests from tracing\n    tracing.Filter = context =>\n        !context.Request.Path.StartsWithSegments(HealthEndpointPath)\n        && !context.Request.Path.StartsWithSegments(AlivenessEndpointPath)\n)\n```\n\n**Observability Benefits:**\n\n- **Environment-Aware Endpoints**: Security-conscious health check exposure\n- **Liveness vs Readiness**: Kubernetes-style health check patterns\n- **Telemetry Noise Reduction**: Filtering out routine health checks from traces\n\n### Configuration and environment setup\n\nThe application supports multiple environments through configuration:\n\n```csharp\nvar openAIClient = Constants.GitHubModelEndpoints.Contains(endpoint.TrimEnd('/'))\n                   ? new OpenAIClient(credential, openAIOptions)\n                   : new AzureOpenAIClient(new Uri(endpoint), credential);\n```\n\n**Configuration Options:**\n\n- **Azure OpenAI**: Production deployments typically use Azure OpenAI Service\n- **GitHub Models**: Development scenarios can use GitHub Models\n- **Local Development**: Support for local MCP server instances\n- **Container Deployment**: Azure Container Apps for production hosting\n\n\n## Clean up resources\n\nAfter you finish using the MCP agent, clean up the resources you created to avoid incurring unnecessary costs.\n\nTo clean up resources, follow these steps:\n\n- Delete the Azure resources created by the Azure Developer CLI by running the following command in the terminal at the bottom of the screen:\n\n    ```shell\n    azd down --purge --force\n    ```\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDelete the GitHub Codespaces environment to maximize your free per-core hours.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's free storage and core hours, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Find your active Codespaces created from the [`Azure-Samples/openai-mcp-agent-dotnet`](https://github.com/Azure-Samples/openai-mcp-agent-dotnet) GitHub repository.\n\n1. Open the context menu for the codespace and select **Delete**.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nStop the running development container and return to Visual Studio Code in your local workspace.\n\nOpen the **Command Palette**, search for **Dev Containers**, and select **Dev Containers: Reopen Folder Locally**.\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. Free up space on your local machine by deleting the container instance, image, and volumes from Docker.\n\n---\n\n## Get help\n\nLog your issue to the repository's [Issues](https://github.com/Azure-Samples/openai-mcp-agent-dotnet/issues).\n\n## Related resources\n\n- [Build a TypeScript MCP server using Azure Container Apps](build-mcp-server-ts.md)"
  },
  {
    "path": "articles/ai/gen-ai-concepts-considerations-developers.md",
    "content": "---\ntitle: Key concepts and considerations in generative AI\ndescription: Learn about the limitations of large language models (LLMs) and how to get the best results by modifying prompts, building an inference pipeline, and adjusting API call parameters.\nms.date: 01/30/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.collection: ce-skilling-ai-copilot\nms.subservice: intelligent-apps\n# CustomerIntent: As an AI app developer, I want to learn about the limitations and best practices for using LLMs in my applications.\n---\n\n# Key concepts and considerations for building generative AI solutions\n\nLarge language models (LLMs) are powerful, but they have limits. You need to know what LLMs can do by default and how to adjust them to get the best results for your generative AI apps. This article covers the main challenges with LLMs and shows simple ways to solve them and improve how you generate content, no matter what kind of generative AI features you build.\n\n## Engineering challenges when working with LLMs\n\nHere are the most significant challenges and limitations to keep in mind when you work with LLMs:\n\n- **Knowledge cutoff**: LLMs only know what they were trained on up to a certain date. Without external data connections, they can’t access real-time or private information.\n\n- **Hallucination**: LLMs might generate inaccurate or misleading information. The Groundedness detection feature in Microsoft Foundry helps you determine whether an LLM’s responses are based on the source materials you provide. Ungrounded responses  include information not supported by your data. Learn how to use groundedness detection in this [quickstart](/azure/ai-services/content-safety/quickstart-groundedness?tabs=python&pivots=programming-language-rest).\n\n- **Transparency**: You can’t always trace the source or accuracy of generated content, and there’s no built-in verification step.\n\n- **No domain-specific knowledge**: LLMs don’t know your internal or proprietary data unless you integrate it.\n\n- **Inability to learn from interactions**: LLMs don’t have memory or awareness of past interactions, so they can’t adapt or improve over time based on user feedback.\nTo overcome these challenges and get the best results, supplement the LLM’s knowledge with your own data and use validation tools.\n\n### Where LLMs get their information\n\nLLMs are trained on large datasets from books, articles, websites, and other sources. Their responses reflect patterns in this data, but anything that happened after the training cutoff isn’t included. Without external connections, LLMs can’t access real-time information or browse the internet, which can lead to outdated or incomplete answers.\n\n## Factors that affect how inference works\n\nWhen you use an LLM, it might look like the model remembers your whole conversation. In reality, each new prompt you send includes all your earlier prompts and the model’s replies. The LLM uses this full history as context to create the next answer. This running history is the _context window_.\n\nEach LLM has a maximum context window size, which changes by model and version. If your conversation goes over this limit, the model drops the oldest parts and ignores them in its answer.\n\nLonger context windows mean the model has to process more data, which can slow down things and cost more.\n\nThe context window size uses tokens, not words. Tokens are the smallest pieces of text the model can handle—these parts might be whole words, parts of words, or single characters, depending on the language and tokenizer.\n\nFor developers, token usage directly impacts:\n\n- The maximum amount of conversation history the model can consider (context window)\n- The cost of each prompt and completion, since billing is based on the number of tokens processed\n\n## What is tokenization?\n\n_Tokenization_ is the process of breaking text into tokens—the smallest units a model can process. Tokenization is essential for both training and inference with LLMs. Depending on the language and tokenizer, tokens might be whole words, subwords, or even single characters. Tokenization can be as simple as splitting by spaces and punctuation, or as complex as using algorithms that account for language structure and morphology.\n\nThe OpenAI [tokenizer](https://platform.openai.com/tokenizer) page explains tokenization in detail and includes a calculator to show how sentences are split into tokens.\n\nIn typical English text, one token is about four characters. On average, 100 tokens are roughly 75 words.\n\nFor developers, the following libraries help estimate token counts for prompts and completions, which is useful for managing context window limits and costs:\n- the [tiktoken](https://github.com/openai/tiktoken) library (Python and JavaScript)\n- the [Microsoft.ML.Tokenizers](https://www.nuget.org/packages/Microsoft.ML.Tokenizers/2.0.0-preview.1.25127.4#readme-body-tab) library (.NET)\n\n### Token usage affects billing\n\nEach Azure OpenAI API has a different billing methodology. For processing and generating text with the Responses or Chat Completions API, you're billed based on the number of tokens you submit as a prompt and the number of tokens that are generated as a result (completion).\n\nEach LLM model (for example, GPT-5.2, or GPT-5.2-mini) usually has a different price, which reflects the amount of computation required to process and generate tokens. Many times, price is presented as \"price per 1,000 tokens\" or \"price per 1 million tokens.\"\n\nThis pricing model has a significant effect on how you design the user interactions and the amount of preprocessing and post-processing you add.\n\n## System prompts vs. user prompts\n\nSo far, this article discussed _user prompts_. A _user prompt_ is what you send to the model and what the model replies to.\n\nOpenAI also added the _system prompt_ (or _custom instructions_). A system prompt is a set of rules you add to every chat. For example, you can tell the LLM to \"always answer in haiku form.\" After that, every answer will be a haiku.\n\nThis haiku example shows how you can change the LLM's answers by changing the prompt.\n\nWhy change the user's prompt? If you build a generative AI app for work, customers, or partners, you might want to add rules to limit what the model can answer.\n\nBut changing the user prompt is just one way to make text generation better.\n\n## Methods to improve the text generation experience for users \n\nTo improve text generation results, developers are limited to simply improving the prompt, and there are many prompt engineering techniques that can help. However, if you're building your own generative AI application, there are several ways to improve the text generation experience for users, and you might want to experiment with implementing all of them:\n\n- Programmatically modify the user prompts.\n- Implement an inference pipeline.\n- Retrieval-Augmented Generation (discussed in other articles).\n- Fine-tuning (discussed in other articles).\n\n### Programmatically modify user prompts\n\nTo add a system prompt to a user conversation, you don't use a special API. You just append instructions to the prompt as needed.\n\nBut you can use a few techniques to improve user prompts:\n\n- **Contextual priming**: Craft system prompts that explicitly set the context of the conversation within the domain. This approach involves providing a brief description or a set of instructions at the beginning of each interaction. The instructions guide AI to stay within the problem domain.\n- **Example-based guidance**: In the initial prompt, include examples of the types of questions and answers that are relevant to your domain. This approach helps AI understand what kind of responses to expect.\n\nYou can use any prompt-engineering technique. If you can accomplish it programmatically, you can improve the user prompt on their behalf.\n\nThe caveat to this approach is that the longer the prompt, the higher the cost for each call to the LLM. Even so, this approach is likely the least expensive approach that this article describes.\n\n### Implement an inference pipeline\n\nAfter you improve the user's prompt, the next step is to build an inference pipeline.\n\nAn _inference pipeline_ is a process that:\n1. Cleans up raw input (like text or images) \n1. Sends it to the model (preprocessing) \n1. Checks the model's answer to make sure it meets the user's needs before showing it (postprocessing).\n\nPreprocessing can include checking for keywords, scoring relevance, or changing the query to better fit your domain. For example, look at the user's first prompt. Ask the LLM if the prompt makes sense, follows your rules, is based on a correct idea, or needs rewriting to avoid bias. If the LLM finds problems, you can ask it to rewrite the prompt to get a better answer.\n\nPostprocessing can mean checking if the answer fits your domain and meets your standards. You might remove or flag answers that don't match your rules. For example, check the LLM's answer to see if it meets your quality and safety needs. You can ask the LLM to review its answer and change it if needed. Repeat this process until you get a good result.\n\nKeep in mind: every time you call an LLM in your inference pipeline, it takes longer to respond and costs more. You need to balance these trade-offs with your budget, speed, and how well your system works.\n\nFor information about the specific steps to take to build an inference pipeline, see [Build an advanced retrieval-augmented generation system](advanced-retrieval-augmented-generation.md).\n\n### Other factors that influence completions\n\nBeyond programmatically modifying the prompt, creating an inference pipeline, and other techniques, more details are discussed in [Augmenting a large-language model with retrieval-augmented generation and fine-tuning](augment-llm-rag-fine-tuning.md). Also, you can modify parameters when you make calls to the Azure OpenAI API.\n\nHere are some of the key parameters you can adjust to influence the model's output:\n\n- **`Temperature`**: Control the randomness of the output the model generates. At zero, the model becomes deterministic, consistently selecting the most likely next token from its training data. At a temperature of 1, the model balances between choosing high-probability tokens and introducing randomness into the output.\n\n- **`Max Tokens`**: Controls the maximum length of the response. Setting a higher or lower limit can affect the detail and scope of the generated content.\n\n- **`Top P` (nucleus sampling)**: Used with `Temperature` to control the randomness of the response. `Top P` limits AI to consider only the top percent of probability mass (`P`) when it generates each token. Lower values lead to text that is more focused and predictable. Higher values allow for more diversity.\n\n- **`Frequency Penalty`**: Decreases the likelihood of the model repeating the same line or phrase. Increasing this value helps avoid redundancy in the generated text.\n\n- **`Presence Penalty`**: Encourages the model to introduce new concepts and terms in the completion. `Presence Penalty` is useful for generating more diverse and creative outputs.\n\n- **`Stop Sequences`**: You can specify one or more sequences to instruct the API to stop generating more tokens. `Store Sequences` are useful for controlling the structure of the output, such as ending a completion at the end of a sentence or paragraph.\n\n- **`Logit Bias`**: Allows you to modify the likelihood of specified tokens appearing in the completion. `Logit Bias` can be used to guide the completion in a certain direction or to suppress specific content.\n\n## Microsoft Azure OpenAI safeguards\n\nIn addition to keeping the LLM's responses bound to specific subject matter or domains, you also likely are concerned about the kinds of questions your users are asking of the LLM. It's important to consider the kinds of answers it's generating.\n\nFirst, API calls to Microsoft Azure OpenAI Models in Microsoft Foundry automatically filter content that the API finds potentially offensive and reports this back to you in many filtering categories.\n\nYou can directly use the [Content Moderation API](/azure/ai-services/content-moderator/api-reference) directly to check any content for potentially harmful content.\n\nThen, you can use [Azure AI Content Safety](/azure/ai-services/content-safety/overview) to help with text moderation, image moderation, jailbreak risk detection, and protected material detection. This service combines a portal setup, configuration, and reporting experience with code you can add to your application to identify harmful content.\n\n## AI Agents\n\nAI agents are a new way to build generative AI apps that work on their own. They use LLMs to read and write text, and they can also connect to outside systems, APIs, and data sources.\nAI agents can manage complex tasks, make choices using real-time data, and learn from how people use them.\nFor more information about AI agents, see [Quickstart: Create a new agent](/azure/ai-foundry/agents/quickstart?view=foundry-classic&pivots=programming-language-python-azure&preserve-view=true).\n\n### Tool calling\n\nAI agents can use outside tools and APIs to get information, take action, or connect with other services. This feature lets them do more than just generate text and handle more complex tasks.\n\nFor example, an AI agent can get real-time weather updates from a weather API or pull details from a database based on what a user asks.\nFor more information about tool calling, see [Discover and manage tools in the Foundry tool catalog (preview)](/azure/ai-foundry/agents/concepts/tool-catalog?view=foundry&preserve-view=true).\n\n### Model Context Protocol (MCP)\n\nThe [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) lets apps provide capabilities and context to a large language model. A key feature of MCP is defining tools that AI agents use to complete tasks. MCP servers can run locally, but remote MCP servers are crucial for sharing tools at cloud scale. For more information: see [Build Agents using Model Context Protocol on Azure](intro-agents-mcp.md).\n\n## Final considerations for application design\n\nUnderstanding tokenization, pricing, context windows, and implementing programmatic improvements to enhance the users' text generation experience affects how you design your generative AI system.\n\nHere's a short list of things to consider and other takeaways from this article that might affect your application design decisions:\n\n- Evaluate the necessity of using the latest AI model against cost considerations. Models that are less expensive might suffice for your application's needs. Balance performance with budget constraints.\n- Consider optimizing the context window length to manage costs without significantly affecting the user experience. Trimming unnecessary parts of the conversation might reduce processing fees while maintaining quality interactions.\n- Assess how tokenization and the granularity of your inputs and outputs affect performance. Understanding how your chosen LLM handles tokenization can help you optimize the efficiency of your API calls, potentially reducing costs and improving response times.\n\nIf you want to start experimenting with building a generative AI solution immediately, we recommend that you take a look at [Get started with the chat by using your own data sample for Python](/azure/developer/python/get-started-app-chat-template?tabs=github-codespaces). The tutorial is also available in [.NET](/dotnet/ai/get-started-app-chat-template?tabs=github-codespaces), [Java](/azure/developer/java/ai/get-started-app-chat-template?tabs=github-codespaces), and [JavaScript](/azure/developer/javascript/get-started-app-chat-template?tabs=github-codespaces).\n"
  },
  {
    "path": "articles/ai/get-started-app-chat-vision.md",
    "content": "---\ntitle: \"Get started with multimodal chat apps using Azure OpenAI\"\ndescription: \"Learn how to effectively use Azure OpenAI multimodal models to generate responses to user messages and uploaded images. Easily deploy with Azure Developer CLI.\"\nms.date: 10/31/2025\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-python, devx-track-python-ai\nms.collection: ce-skilling-ai-copilot\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\n# CustomerIntent: As a developer new to Azure OpenAI, I want to learn how to use Azure OpenAI multimodal models to add uploaded images to the chat stream from a simple example.\n---\n# Get started with multimodal vision chat apps using Azure OpenAI\n\nThis article shows you how to use Azure OpenAI multimodal models to generate responses to user messages and uploaded images in a chat app. This chat app sample also includes all the infrastructure and configuration needed to provision Azure OpenAI resources and deploy the app to Azure Container Apps using the Azure Developer CLI.\n\nBy following the instructions in this article, you will:\n\n- Deploy an Azure Container chat app that uses managed identity for authentication.\n- Upload images to be used as part of the chat stream.\n- Chat with an Azure OpenAI multimodal Large Language Model (LLM) using the OpenAI library's Responses API.\n\nOnce you complete this article, you can start modifying the new project with your custom code.\n\n> [!NOTE]\n> This article uses one or more [AI app templates](./intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained, easy to deploy reference implementations that help to ensure a high-quality starting point for your AI apps.\n\n## Architectural overview\n\nA simple architecture of the chat app is shown in the following diagram:\n:::image type=\"content\" source=\"./media/get-started-app-chat-vision/simple-architecture-diagram.png\" lightbox=\"./media/get-started-securing-your-ai-app/simple-architecture-diagram.png\" alt-text=\"Diagram showing architecture from client to backend app.\":::\n\nThe chat app is running as an Azure Container App. The app uses managed identity via Microsoft Entra ID to authenticate with Azure OpenAI in production, instead of an API key. During development, the app supports multiple authentication methods including Azure Developer CLI credentials and API keys.\n\nThe application architecture relies on the following services and components:\n\n- [Azure OpenAI](/azure/ai-services/openai/) represents the AI provider that we send the user's queries to.\n- [Azure Container Apps](/azure/container-apps/) is the container environment where the application is hosted.\n- [Managed Identity](/entra/identity/managed-identities-azure-resources/) helps us ensure best-in-class security and eliminates the requirement for you as a developer to securely manage a secret.\n- [Bicep files](/azure/azure-resource-manager/bicep/) for provisioning Azure resources, including Azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics, and role-based access control (RBAC) roles.\n- A Python [Quart](https://quart.palletsprojects.com) app that uses the [`openai`](https://pypi.org/project/openai/) package to generate responses to user messages with uploaded image files.\n- A basic HTML/JavaScript frontend that streams responses from the backend using [JSON Lines](http://jsonlines.org/) over a [ReadableStream](https://developer.mozilla.org/docs/Web/API/ReadableStream).\n\n## Cost\n\nIn an attempt to keep pricing as low as possible in this sample, most resources use a basic or consumption pricing tier. Alter your tier level as needed based on your intended usage. To stop incurring charges, delete the resources when you're done with the article.\n\nLearn more about [cost in the sample repo](https://github.com/Azure-Samples/openai-chat-vision-quickstart#costs).\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\nTo use this article, you need to fulfill the following prerequisites:\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\n- Azure account permissions - Your Azure Account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n\n- GitHub account\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\n- Azure account permissions - Your Azure Account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n\n- [Azure Developer CLI](/azure/developer/azure-developer-cli)\n\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running\n\n- [Visual Studio Code](https://code.visualstudio.com/)\n\n- [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n---\n\n## Open development environment\n\nUse the following instructions to deploy a preconfigured development environment containing all required dependencies to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\nUse the following steps to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/openai-chat-vision-quickstart`](https://github.com/Azure-Samples/openai-chat-vision-quickstart) GitHub repository.\n\n1. Right-click on the following button, and select _Open link in new window_. This action allows you to have the development environment and the documentation available for review.\n\n    [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/openai-chat-vision-quickstart)\n\n1. On the **Create codespace** page, review and then select **Create new codespace**\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\nThe remaining tasks in this article take place in the context of this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n1. Create a new local directory on your computer for the project.\n\n    ```shell\n    mkdir my-chat-vision-app\n    ```\n\n1. Navigate to the directory you created.\n\n    ```shell\n    cd my-chat-vision-app\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```shell\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```azdeveloper\n    azd init -t openai-chat-vision-quickstart\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. The remaining exercises in this project take place in the context of this development container.\n\n---\n\n## Deploy and run\n\nThe sample repository contains all the code and configuration files for the chat app Azure deployment. The following steps walk you through the sample chat app Azure deployment process.\n\n### Deploy chat app to Azure\n\n> [!IMPORTANT]\n> To keep costs low, this sample uses basic or consumption pricing tiers for most resources. Adjust the tier as needed, and delete resources when you're done to avoid charges.\n\n1. Run the following Azure Developer CLI command for Azure resource provisioning and source code deployment:\n\n    ```azdeveloper\n    azd up\n    ```\n\n1. Use the following table to answer the prompts:\n\n    |Prompt|Answer|\n    |--|--|\n    |Environment name|Keep it short and lowercase. Add your name or alias. For example, `chat-vision`. It's used as part of the resource group name.|\n    |Subscription|Select the subscription to create the resources in. |\n    |Location (for hosting)|Select a location near you from the list.|\n    |Location for the Azure OpenAI model|Select a location near you from the list. If the same location is available as your first location, select that.|\n\n1. Wait until app is deployed. Deployment usually takes between 5 and 10 minutes to complete.\n\n### Use chat app to ask questions to the Large Language Model\n\n1. The terminal displays a URL after successful application deployment.\n\n1. Select that URL labeled `Deploying service web` to open the chat application in a browser.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-vision/chat-speech.png\" lightbox=\"./media/get-started-app-chat-vision/chat-speech.png\" alt-text=\"Screenshot showing an uploaded image, a question about the image, the AI's response, and the text box.\":::\n\n1. In the browser, upload an image by clicking on **Choose File** and selecting an image.\n1. Ask a question about the uploaded image such as \"What is the image about?\".\n\n1. The answer comes from Azure OpenAI and the result is displayed.\n\n## Exploring the sample code\n\nThis sample uses an Azure OpenAI multimodal model to generate responses to user messages and uploaded images.\n\n### Base64 Encoding the uploaded image in the frontend\n\nThe uploaded image needs to be Base64 encoded so that it can be used directly as a Data URI as part of the message.\n\nIn the sample, the following frontend code snippet in the `script`tag of the `src/quartapp/templates/index.html` file handles that functionality. The `toBase64` arrow function uses the `readAsDataURL` method of the`FileReader` to asynchronously read in the uploaded image file as a base64 encoded string.  \n\n```javascript\n    const toBase64 = file => new Promise((resolve, reject) => {\n        const reader = new FileReader();\n        reader.readAsDataURL(file);\n        reader.onload = () => resolve(reader.result);\n        reader.onerror = reject;\n    });\n```\n\nThe `toBase64` function is called by a listener on the form's `submit` event.\n\nThe `submit` event listener handles the complete chat interaction flow. When the user submits a message, the following flow occurs:\n\n1. Gets the uploaded image file (if present) and encodes as Base64\n1. Creates and displays the user's message in the chat, including the uploaded image\n1. Prepares an assistant message container with a \"Typing...\" indicator\n1. Adds the user's message to the message history array in Responses API format\n1. Sends a `fetch` POST request to the `/chat/stream` endpoint with the message history and context (including the Base64 encoded image and filename)\n1. Processes the streamed [JSON-lines response](https://jsonlines.org/) to display each text delta incrementally\n1. Handles any errors during streaming\n1. Adds a speech output button after receiving the complete response so users can hear the response\n1. Clears the input field and returns focus for the next message\n\n```javascript\nform.addEventListener(\"submit\", async function(e) {\n    e.preventDefault();\n\n    // Hide the no-messages-heading when a message is added\n    document.getElementById(\"no-messages-heading\").style.display = \"none\";\n\n    const file = document.getElementById(\"file\").files[0];\n    const fileData = file ? await toBase64(file) : null;\n\n    const message = messageInput.value;\n\n    const userTemplateClone = userTemplate.content.cloneNode(true);\n    userTemplateClone.querySelector(\".message-content\").innerText = message;\n    if (file) {\n        const img = document.createElement(\"img\");\n        img.src = fileData;\n        userTemplateClone.querySelector(\".message-file\").appendChild(img);\n    }\n    targetContainer.appendChild(userTemplateClone);\n\n    const assistantTemplateClone = assistantTemplate.content.cloneNode(true);\n    let messageDiv = assistantTemplateClone.querySelector(\".message-content\");\n    targetContainer.appendChild(assistantTemplateClone);\n\n    messages.push({\n        \"role\": \"user\",\n        \"content\": [{\"type\": \"input_text\", \"text\": message}]\n    });\n\n    try {\n        messageDiv.scrollIntoView();\n        const response = await fetch(\"/chat/stream\", {\n            method: \"POST\",\n            headers: {\"Content-Type\": \"application/json\"},\n            body: JSON.stringify({\n                messages: messages,\n                context: {\n                    file: fileData,\n                    file_name: file ? file.name : null\n                }\n            })\n        });\n\n        if (!response.ok || !response.body) {\n            throw new Error(`Request failed (${response.status})`);\n        }\n\n        let answer = \"\";\n        for await (const chunk of readNDJSONStream(response.body)) {\n            if (chunk.type === \"error\" || chunk.type === \"response.failed\") {\n                messageDiv.innerHTML = \"Error: \" + (chunk.error || \"Unknown error\");\n                break;\n            }\n            if (chunk.type === \"response.output_text.delta\") {\n                // Clear out the DIV if its the first answer chunk we've received\n                if (answer == \"\") {\n                    messageDiv.innerHTML = \"\";\n                }\n                answer += chunk.delta;\n                messageDiv.innerHTML = converter.makeHtml(answer);\n                messageDiv.scrollIntoView();\n            }\n        }\n\n        messages.push({\n            \"role\": \"assistant\",\n            \"content\": [{\"type\": \"output_text\", \"text\": answer}]\n        });\n\n        messageInput.value = \"\";\n\n        const speechOutput = document.createElement(\"speech-output-button\");\n        speechOutput.setAttribute(\"text\", answer);\n        messageDiv.appendChild(speechOutput);\n        messageInput.focus();\n    } catch (error) {\n        messageDiv.innerHTML = \"Error: \" + error;\n    }\n});\n```\n\n### Handling the image with the backend\n\nIn the `src\\quartapp\\chat.py` file, the backend code for image handling starts after configuring keyless authentication.\n\n> [!NOTE]\n> For more information on how to use keyless connections for authentication and authorization to Azure OpenAI, check out the [Get started with the Azure OpenAI security building block](get-started-securing-your-ai-app.md) Microsoft Learn article.\n\n#### Authentication configuration\n\nThe `configure_openai()` function sets up the OpenAI client before the app starts serving requests. It uses Quart's `@bp.before_app_serving` decorator to configure authentication based on environment variables. This flexible system lets developers work in different contexts without changing code.\n\n##### Authentication modes explained\n\n- **Local development** (`OPENAI_HOST=local`): Connects to a local OpenAI-compatible API service (like Ollama or LocalAI) without authentication. Use this mode for testing without internet or API costs.\n- **Azure OpenAI with API key** (`AZURE_OPENAI_KEY_FOR_CHATVISION` environment variable): Uses an API key for authentication. Avoid this mode in production because API keys require manual rotation and pose security risks if exposed. Use it for local testing inside a Docker container without Azure CLI credentials.\n- **Production with Managed Identity** (`RUNNING_IN_PRODUCTION=true`): Uses `ManagedIdentityCredential` to authenticate with Azure OpenAI through the container app's managed identity. This method is recommended for production because it removes the need to manage secrets. Azure Container Apps automatically provide the managed identity and grant permissions during deployment via Bicep.\n- **Development with Azure CLI** (default mode): Uses `AzureDeveloperCliCredential` to authenticate with Azure OpenAI using locally signed-in Azure CLI credentials. This mode simplifies local development without managing API keys.\n\n##### Key implementation details\n\n- The `get_bearer_token_provider()` function refreshes Azure credentials and uses them as bearer tokens.\n- The Azure OpenAI endpoint path ends with `/openai/v1/`, the generally available OpenAI-compatible endpoint for Microsoft Foundry Models.\n- The function is async, since Quart is an asynchronous web app framework. Quart lets request handlers be async, so while the app is awaiting slow LLM API responses, the server can keep handling other requests.\n\nHere's the complete authentication setup code from `chat.py`:\n\n```python\n@bp.before_app_serving\nasync def configure_openai():\n    bp.model_name = os.getenv(\"OPENAI_MODEL\", \"gpt-4o\")\n    openai_host = os.getenv(\"OPENAI_HOST\", \"azure\")\n\n    if openai_host == \"local\":\n        bp.openai_client = AsyncOpenAI(api_key=\"no-key-required\", base_url=os.getenv(\"LOCAL_OPENAI_ENDPOINT\"))\n        current_app.logger.info(\"Using local OpenAI-compatible API service with no key\")\n    elif os.getenv(\"AZURE_OPENAI_KEY_FOR_CHATVISION\"):\n        bp.openai_client = AsyncOpenAI(\n            base_url=os.environ[\"AZURE_OPENAI_ENDPOINT\"].rstrip(\"/\") + \"/openai/v1\",\n            api_key=os.getenv(\"AZURE_OPENAI_KEY_FOR_CHATVISION\"),\n        )\n        current_app.logger.info(\"Using Azure OpenAI with key\")\n    elif os.getenv(\"RUNNING_IN_PRODUCTION\"):\n        client_id = os.environ[\"AZURE_CLIENT_ID\"]\n        azure_credential = ManagedIdentityCredential(client_id=client_id)\n        token_provider = get_bearer_token_provider(azure_credential, \"https://cognitiveservices.azure.com/.default\")\n        bp.openai_client = AsyncOpenAI(\n            base_url=os.environ[\"AZURE_OPENAI_ENDPOINT\"].rstrip(\"/\") + \"/openai/v1\",\n            api_key=token_provider,\n        )\n        current_app.logger.info(\"Using Azure OpenAI with managed identity credential for client ID %s\", client_id)\n    else:\n        tenant_id = os.environ[\"AZURE_TENANT_ID\"]\n        azure_credential = AzureDeveloperCliCredential(tenant_id=tenant_id)\n        token_provider = get_bearer_token_provider(azure_credential, \"https://cognitiveservices.azure.com/.default\")\n        bp.openai_client = AsyncOpenAI(\n            base_url=os.environ[\"AZURE_OPENAI_ENDPOINT\"].rstrip(\"/\") + \"/openai/v1\",\n            api_key=token_provider,\n        )\n        current_app.logger.info(\"Using Azure OpenAI with az CLI credential for tenant ID: %s\", tenant_id)\n```\n\n#### Chat handler function\n\nThe `chat_handler()` function processes chat requests sent to the `/chat/stream` endpoint. It receives a POST request with a JSON payload.\n\nThe JSON payload includes:\n- **messages**: A list of conversation history. Each message has a `role` (\"user\" or \"assistant\") and `content` (an array of content parts using the [Responses API input format](https://platform.openai.com/docs/api-reference/responses)).\n- **context**: Extra data for processing, including:\n  - **file**: Base64-encoded image data (for example, `data:image/png;base64,...`).\n  - **file_name**: The uploaded image's original filename (useful for logging or identifying the image type).\n\nThe handler extracts the message history and image data. If no image is uploaded, the image value is `null`, and the code handles this case.\n\n```python\n@bp.post(\"/chat/stream\")\nasync def chat_handler():\n    request_json = await request.get_json()\n    request_messages = request_json[\"messages\"]\n    # Get the base64 encoded image from the request context\n    # This will be None if no image was uploaded\n    image = request_json[\"context\"][\"file\"]\n```\n\n### Building the input array for vision requests\n\nThe `response_stream()` function prepares the input array that is sent to the Azure OpenAI Responses API. The `@stream_with_context` decorator keeps the request context while streaming the response.\n\n#### Input preparation logic\n\n1. **Start with conversation history**: The function begins with `all_input`, which includes all previous messages except the most recent one (`request_messages[0:-1]`). Messages are already in Responses API format from the frontend.\n1. **Handle the current user message based on image presence**:\n   - **With image**: Append an `input_image` content part to the user's existing content array.\n   - **Without image**: Append the user's message as-is.\n\n```python\n    @stream_with_context\n    async def response_stream():\n        # This sends all messages, so API request may exceed token limits\n        all_input = list(request_messages[0:-1])\n\n        # Add the current user message, appending image if provided\n        if image:\n            user_content = request_messages[-1][\"content\"] + [{\"type\": \"input_image\", \"image_url\": image}]\n            all_input.append({\"role\": \"user\", \"content\": user_content})\n        else:\n            all_input.append(request_messages[-1])\n```\n\nNext, `bp.openai_client.responses.create` calls the Azure OpenAI Responses API and streams the response. The `store=False` parameter instructs the API to not store responses on the server, making the call stateless.\n\n```python\n        openai_stream = await bp.openai_client.responses.create(\n            model=bp.model_name,\n            input=all_input,\n            stream=True,\n            temperature=0.3,\n            store=False,\n        )\n```\n\nFinally, the response is streamed back to the client. The Responses API emits [many event types](https://platform.openai.com/docs/api-reference/responses-streaming), but only the `response.output_text.delta` event is needed for streaming generated text. Error events are logged and forwarded to the frontend.\n\n```python\n        try:\n            async for event in openai_stream:\n                if event.type == \"response.output_text.delta\":\n                    yield json.dumps({\"type\": event.type, \"delta\": event.delta}, ensure_ascii=False) + \"\\n\"\n                elif event.type in (\"response.failed\", \"error\"):\n                    current_app.logger.error(\"Responses API error: %s\", event)\n                    yield json.dumps({\"type\": event.type}, ensure_ascii=False) + \"\\n\"\n        except Exception as e:\n            current_app.logger.exception(\"Error in response stream\")\n            yield json.dumps({\"error\": str(e)}, ensure_ascii=False) + \"\\n\"\n\n    return Response(response_stream())\n```\n\n#### Frontend libraries and features\n\nThe frontend uses modern browser APIs and libraries to create an interactive chat experience. Developers can customize the interface or add features by understanding these components:\n\n1. **Speech Input/Output**: Custom web components use the browser's Speech APIs:\n\n   - **`<speech-input-button>`**: Converts speech to text using the Web Speech API's `SpeechRecognition`. It provides a microphone button that listens for voice input and emits a `speech-input-result` event with the transcribed text.\n   \n   - **`<speech-output-button>`**: Reads text aloud using the `SpeechSynthesis` API. It appears after each assistant response with a speaker icon, letting users hear the response.\n\n   **Why use browser APIs instead of Azure Speech Services?**\n   - No cost - runs entirely in the browser\n   - Instant response - no network latency\n   - Privacy - voice data stays on the user's device\n   - No need for extra Azure resources\n\n   These components are in `src/quartapp/static/speech-input.js` and `speech-output.js`.\n\n1. **Image Preview**: Displays the uploaded image in the chat before analysis submission for confirmation. The preview updates automatically when a file is selected.\n\n   ```javascript\n   fileInput.addEventListener(\"change\", async function() {\n       const file = fileInput.files[0];\n       if (file) {\n           const fileData = await toBase64(file);\n           imagePreview.src = fileData;\n           imagePreview.style.display = \"block\";\n       }\n   });\n   ```\n\n1. **Bootstrap 5 and Bootstrap Icons**: Provides responsive UI components and icons. The app uses the Cosmo theme from Bootswatch for a modern look.\n\n1. **Template-based Message Rendering**: Uses HTML `<template>` elements for reusable message layouts, ensuring consistent styling and structure.\n\n## Other sample resources to explore\n\nIn addition to the chat app sample, there are other resources in the repo to explore for further learning. Check out the following notebooks in the `notebooks` directory:\n\n|Notebook|Description|\n|--|--|\n|chat_pdf_images.ipynb|This notebook demonstrates how to convert PDF pages to images and send them to a vision model for inference.|\n|chat_vision.ipynb|This notebook is provided for manual experimentation with the vision model used in the app.|\n\n**Localized Content**: Spanish versions of the notebooks are in the `notebooks/Spanish/` directory, offering the same hands-on learning for Spanish-speaking developers. Both English and Spanish notebooks show:\n- How to call vision models directly for experimentation\n- How to convert PDF pages to images for analysis\n- How to adjust parameters and test prompts\n\n## Clean up resources\n\n### Clean up Azure resources\n\nThe Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\nTo delete the Azure resources and remove the source code, run the following Azure Developer CLI command:\n\n```azdeveloper\nazd down --purge\n```\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running Codespaces sourced from the [`Azure-Samples//openai-chat-vision-quickstart`](https://github.com/Azure-Samples/openai-chat-vision-quickstart) GitHub repository.\n\n1. Open the context menu for the codespace and select **Delete**.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nStop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\nOpen the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen Folder Locally**.\n\n:::image type=\"content\" source=\"./media/get-started-app-chat-vision/reopen-local-command-palette.png\" lightbox=\"./media/get-started-app-chat-vision/reopen-local-command-palette.png\" alt-text=\"Screenshot of the Command Palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. Free up space on your local machine by deleting the container instance, image, and volumes from Docker.\n\n---\n\n## Get help\n\nLog your issue to the repository's [Issues](https://github.com/Azure-Samples/openai-chat-vision-quickstart/issues).\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Get started with the chat using your own data sample for Python](../python/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n"
  },
  {
    "path": "articles/ai/get-started-securing-your-ai-app.md",
    "content": "---\ntitle: \"Get started with the Azure OpenAI security building blocks\"\ndescription: \"Learn how to effectively use keyless connections for authentication and authorization to Azure OpenAI with the Azure OpenAI security building blocks. Get started using a simple chat app sample implemented using Azure OpenAI Service using keyless authentication with Microsoft Entra ID. Easily deploy with Azure Developer CLI. This article uses the Azure AI Template chat quickstart sample.\"\nms.date: 01/30/2026\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-python, keyless-python, devx-track-js, devx-track-dotnet\nms.collection: ce-skilling-ai-copilot\nzone_pivot_group_filename: developer/intro/intro-zone-pivot-groups.yml\nzone_pivot_groups: intelligent-apps-languages-python-dotnet-typescript\n# CustomerIntent: As a developer new to Azure OpenAI, I want to learn how to use keyless connections to Azure OpenAI from a simple example so that I don't leak secrets.\n---\n# Get started with the Azure OpenAI security building block\n\nThis article shows you how to create and use the Azure OpenAI security building block sample. The purpose is to demonstrate Azure OpenAI account provisioning with role-based access control (RBAC) for keyless (Microsoft Entra ID) authentication to Azure OpenAI. This chat app sample also includes all the infrastructure and configuration needed to provision Azure OpenAI resources and deploy the app to Azure Container Apps using the Azure Developer CLI.\n\nBy following the instructions in this article, you will:\n\n- Deploy a secure chat app on Azure Container Apps.\n- Use managed identity for Azure OpenAI access.\n- Chat with an Azure OpenAI Large Language Model (LLM) using the OpenAI library.\n\nOnce you complete this article, you can start modifying the new project with your custom code and data.\n\n> [!NOTE]\n> This article uses one or more [AI app templates](./intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained, easy to deploy reference implementations that help to ensure a high-quality starting point for your AI apps.\n\n## Architectural overview\n\nA simple architecture of the chat app is shown in the following diagram:\n:::image type=\"content\" source=\"./media/get-started-securing-your-ai-app/simple-architecture-diagram.png\" lightbox=\"./media/get-started-securing-your-ai-app/simple-architecture-diagram.png\" alt-text=\"Diagram showing architecture from client to backend app.\":::\n\nThe chat app runs as an Azure Container App. The app uses managed identity via Microsoft Entra ID to authenticate with Azure OpenAI, instead of an API key. The chat app uses Azure OpenAI to generate responses to user messages.\n\nThe application architecture relies on the following services and components:\n\n- [Azure OpenAI](/azure/ai-services/openai/) represents the AI provider that we send the user's queries to.\n- [Azure Container Apps](/azure/container-apps/) is the container environment where the application is hosted.\n- [Managed Identity](/entra/identity/managed-identities-azure-resources/) helps us ensure best-in-class security and eliminates the requirement for you as a developer to securely manage a secret.\n- [Bicep files](/azure/azure-resource-manager/bicep/) for provisioning Azure resources, including Azure OpenAI, Azure Container Apps, Azure Container Registry, Azure Log Analytics, and RBAC roles.\n:::zone pivot=\"python\"\n- A Python [Quart](https://quart.palletsprojects.com/en/latest/) app that uses the [`openai`](https://pypi.org/project/openai/) package and the [Responses API](/azure/ai-services/openai/how-to/responses) to generate responses to user messages.\n- A basic HTML/JavaScript frontend that streams responses from the backend using [JSON Lines](http://jsonlines.org/) over a [ReadableStream](https://developer.mozilla.org/docs/Web/API/ReadableStream).\n\n:::zone-end\n\n:::zone pivot=\"dotnet\"\n\n- A Blazor web app that uses the [Azure.AI.OpenAI](https://www.nuget.org/packages/Azure.AI.OpenAI/) NuGet package to generate responses to user messages.\n\n:::zone-end\n\n:::zone pivot=\"typescript\"\n- A TypeScript web app that uses the [OpenAI](https://www.npmjs.com/package/openai) npm package to generate responses to user messages. \n:::zone-end\n\n## Cost\n\nIn an attempt to keep pricing as low as possible in this sample, most resources use a basic or consumption pricing tier. Alter your tier level as needed based on your intended usage. To stop incurring charges, delete the resources when you're done with the article.\n\n:::zone pivot=\"python\"\n\nLearn more about [cost in the sample repo](https://github.com/Azure-Samples/openai-chat-app-quickstart#costs).\n\n:::zone-end\n\n:::zone pivot=\"dotnet\"\n\nLearn more about [cost in the sample repo](https://github.com/Azure-Samples/openai-chat-app-quickstart-dotnet#costs).\n\n:::zone-end\n\n:::zone pivot=\"typescript\"\n\nLearn more about [cost in the sample repo](https://github.com/Azure-Samples/openai-chat-app-quickstart-javascript#costs).\n\n:::zone-end\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\nTo use this article, you need to fulfill the following prerequisites:\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\n- Azure account permissions - Your Azure Account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n\n- GitHub account\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\n- Azure account permissions - Your Azure Account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n\n- [Azure Developer CLI](/azure/developer/azure-developer-cli)\n\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running\n\n- [Visual Studio Code](https://code.visualstudio.com/)\n\n- [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n---\n\n## Open development environment\n\nUse the following instructions to deploy a preconfigured development environment containing all required dependencies to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with 2 core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n:::zone pivot=\"python\"\n\nUse the following steps to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/openai-chat-app-quickstart`](https://github.com/Azure-Samples/openai-chat-app-quickstart) GitHub repository.\n\n1. Right-click on the following button, and select _Open link in new window_. This action allows you to have the development environment and the documentation available for review.\n\n1. On the **Create codespace** page, review and then select **Create new codespace**\n\n    :::image type=\"content\" source=\"./media/get-started-securing-your-ai-app/github-create-codespace-python.png\" lightbox=\"./media/get-started-securing-your-ai-app/github-create-codespace-python.png\" alt-text=\"Screenshot of the confirmation screen before creating a new codespace.\":::\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\nThe remaining tasks in this article take place in the context of this development container.\n\n:::zone-end\n\n:::zone pivot=\"dotnet\"\n\nUse the following steps to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/openai-chat-app-quickstart-dotnet`](https://github.com/Azure-Samples/openai-chat-app-quickstart-dotnet) GitHub repository.\n\n1. Right-click on the following button, and select _Open link in new window_. This action allows you to have the development environment and the documentation available for review.\n\n1. On the **Create codespace** page, review and then select **Create codespace**\n\n    :::image type=\"content\" source=\"./media/get-started-securing-your-ai-app/github-create-codespace-dotnet.png\" lightbox=\"./media/get-started-securing-your-ai-app/github-create-codespace-dotnet.png\" alt-text=\"Screenshot of the confirmation screen before creating a new codespace.\":::\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\nThe remaining tasks in this article take place in the context of this development container.\n\n:::zone-end\n\n:::zone pivot=\"typescript\"\n\n[!INCLUDE [typescript open development environment](../javascript/ai/includes/get-started-securing-your-ai-app/open-development-environment.md)]\n\n:::zone-end\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n:::zone pivot=\"python\"\n\n1. Create a new local directory on your computer for the project.\n\n    ```shell\n    mkdir my-secure-chat-app\n    ```\n\n1. Navigate to the directory you created.\n\n    ```shell\n    cd my-secure-chat-app\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```shell\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```azdeveloper\n    azd init -t openai-chat-app-quickstart\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. The remaining exercises in this project take place in the context of this development container.\n\n:::zone-end\n\n:::zone pivot=\"dotnet\"\n\n1. Create a new local directory on your computer for the project.\n\n    ```shell\n    mkdir my-secure-chat-app\n    ```\n\n1. Navigate to the directory you created.\n\n    ```shell\n    cd my-secure-chat-app\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```shell\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```azdeveloper\n    azd init -t openai-chat-app-quickstart-dotnet\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. The remaining exercises in this project take place in the context of this development container.\n\n:::zone-end\n\n:::zone pivot=\"typescript\"\n\n[!INCLUDE [typescript visual studio setup](../javascript/ai/includes/get-started-securing-your-ai-app/visual-studio-code-setup.md)]\n\n:::zone-end\n---\n\n## Deploy and run\n\nThe sample repository contains all the code and configuration files for chat app Azure deployment. The following steps walk you through the sample chat app Azure deployment process.\n\n### Deploy chat app to Azure\n\n> [!IMPORTANT]\n> Azure resources created in this section incur immediate costs. These resources might accrue costs even if you interrupt the command before it's fully executed.\n\n1. Run the following Azure Developer CLI command for Azure resource provisioning and source code deployment:\n\n    ```azdeveloper\n    azd up\n    ```\n\n1. Use the following table to answer the prompts:\n\n    |Prompt|Answer|\n    |--|--|\n    |Environment name|Keep it short and lowercase. Add your name or alias. For example, `secure-chat`. It's used as part of the resource group name.|\n    |Subscription|Select the subscription to create the resources in. |\n    |Location (for hosting)|Select a location near you from the list.|\n    |Location for the OpenAI model|Select a location near you from the list. If the same location is available as your first location, select that.|\n\n1. Wait until app is deployed. Deployment usually takes between 5 and 10 minutes to complete.\n\n### Use chat app to ask questions to the Large Language Model\n\n1. The terminal displays a URL after successful application deployment.\n\n1. Select that URL labeled `Deploying service web` to open the chat application in a browser.\n\n    :::image type=\"content\" source=\"./media/get-started-securing-your-ai-app/browser-chat.png\" lightbox=\"./media/get-started-securing-your-ai-app/browser-chat.png\" alt-text=\"Screenshot of chat app in browser showing several suggestions for chat input and the chat text box to enter a question.\":::\n\n1. In the browser, enter a question such as \"Why is managed identity better than keys?\".\n\n1. The answer comes from Azure OpenAI and the result is displayed.\n\n:::zone pivot=\"python\"\n\n## Exploring the sample code\n\n While OpenAI and Azure OpenAI Service rely on a [common Python client library](https://github.com/openai/openai-python), small code changes are needed when using Azure OpenAI endpoints. Let's see how this sample configures keyless authentication with Microsoft Entra ID and communicates with Azure OpenAI.\n\n### Configure authentication with managed identity\n\nIn this sample, the `src/quartapp/chat.py` file begins with configuring keyless authentication.\n\nThe following snippet uses the [azure.identity.aio](/python/api/azure-identity/azure.identity.aio?view=azure-python&preserve-view=true) module to create an asynchronous Microsoft Entra authentication flow.\n\nThe following code snippet uses the `AZURE_CLIENT_ID` `azd` environment variable to create a [ManagedIdentityCredential](/python/api/azure-identity/azure.identity.aio.managedidentitycredential?view=azure-python&preserve-view=true) instance capable of authenticating via user-assigned managed identity.\n\n```Python\nuser_assigned_managed_identity_credential = ManagedIdentityCredential(client_id=os.getenv(\"AZURE_CLIENT_ID\")) \n```\n\n>[!NOTE]\n>The `azd` resource environment variables are provisioned during `azd` app deployment.\n\nThe following code snippet uses `AZURE_TENANT_ID` `azd` resource environment variable to create an [AzureDeveloperCliCredential](/python/api/azure-identity/azure.identity.aio.azuredeveloperclicredential?view=azure-python&preserve-view=true) instance capable of authenticating with the current Microsoft Entra tenant.\n\n```Python\nazure_dev_cli_credential = AzureDeveloperCliCredential(tenant_id=os.getenv(\"AZURE_TENANT_ID\"), process_timeout=60)  \n```\n\nThe Azure Identity client library provides _credentials_&mdash;public classes that implement the Azure Core library's [TokenCredential](/python/api/azure-core/azure.core.credentials.tokencredential) protocol. A credential represents a distinct authentication flow for acquiring an access token from Microsoft Entra ID. These credentials can be chained together to form an ordered sequence of authentication mechanisms to be attempted.\n\nThe following snippet creates a `ChainedTokenCredential` using a `ManagedIdentityCredential` and an `AzureDeveloperCliCredential`:\n\n- The `ManagedIdentityCredential` is used for Azure Functions, Azure App Service, and Azure Container Apps. A user-assigned managed identity is supported by passing the `client_id` to `ManagedIdentityCredential`.\n- The `AzureDeveloperCliCredential` is used for local development. It was set previously based on the Microsoft Entra tenant to use.\n\n```python\nazure_credential = ChainedTokenCredential(\n    user_assigned_managed_identity_credential,\n    azure_dev_cli_credential\n)\n\n```\n\n>[!TIP]\n>The order of the credentials is important, as the first valid Microsoft Entra access token is used. For more information, check out the [ChainedTokenCredential Overview](/azure/developer/python/sdk/authentication/credential-chains?tabs=dac#usage-guidance-for-defaultazurecredential) article.\n\nThe following code snippet gets the Azure OpenAI token provider based on the selected Azure credential.\nThis value is obtained by calling the [azure.identity.aio.get_bearer_token_provider](/python/api/azure-identity/azure.identity.aio?view=azure-python#azure-identity-aio-get-bearer-token-provider&preserve-view=true) with two arguments:\n\n- `azure_credential`: The `ChainedTokenCredential` instance created earlier to authenticate the request.\n\n- `https://cognitiveservices.azure.com/.default`: Required one or more bearer token scopes. In this case, the **Azure Cognitive Services** endpoint.\n\n```python\ntoken_provider = get_bearer_token_provider(\n    azure_credential, \"https://cognitiveservices.azure.com/.default\"\n)\n```\n\nThe following lines check for the required `AZURE_OPENAI_ENDPOINT` and `AZURE_OPENAI_CHAT_DEPLOYMENT`, two `azd` environment variables which are set during `azd` provisioning. An error is thrown if a value isn't present.\n\n```python\nopenai_endpoint = os.getenv(\"AZURE_OPENAI_ENDPOINT\")\nif not openai_endpoint:\n    raise ValueError(\"AZURE_OPENAI_ENDPOINT is required for Azure OpenAI\")\nif not os.getenv(\"AZURE_OPENAI_CHAT_DEPLOYMENT\"):\n    raise ValueError(\"AZURE_OPENAI_CHAT_DEPLOYMENT is required for Azure OpenAI\")\n```\n\nThis snippet initializes the OpenAI client against Azure's `/openai/v1/` endpoint, passing the token provider as the `api_key`. No `api_version` is needed with the v1 endpoint:\n\n```python\nbp.openai_client = AsyncOpenAI(\n    base_url=f\"{openai_endpoint.rstrip('/')}/openai/v1/\",\n    api_key=token_provider,\n)\n```\n\nThe following line sets the Azure OpenAI model deployment name for use in API calls:\n\n```python\nbp.openai_model = os.getenv(\"AZURE_OPENAI_CHAT_DEPLOYMENT\")\n```\n\n>[!NOTE]\n>OpenAI uses the `model` keyword argument to specify what model to use. Azure OpenAI has the concept of _unique model deployments_. When you use Azure OpenAI, `model` should refer to the _underlying deployment name_ chosen during Azure OpenAI model deployment.\n\nOnce this function completes, the client is properly configured and ready to interact with Azure OpenAI services.\n\n### Stream responses using the OpenAI Responses API\n\nThe `response_stream` handles the Responses API streaming call in the route. The frontend sends Responses-shaped `input` items directly, and the backend forwards them to `responses.stream()`:\n\n```python\nasync def response_stream():\n    try:\n        async with bp.openai_client.responses.stream(\n            model=bp.openai_model,\n            input=request_input,\n            store=False,\n        ) as openai_stream:\n            async for event in openai_stream:\n                yield json.dumps(event.model_dump(), ensure_ascii=False) + \"\\n\"\n    except Exception as e:\n        current_app.logger.exception(\"Responses stream failed\")\n        yield json.dumps({\"error\": str(e)}, ensure_ascii=False) + \"\\n\"\n```\n\n:::zone-end\n\n:::zone pivot=\"dotnet\"\n\n## Explore the sample code\n\n.NET applications rely on the [Azure.AI.OpenAI](https://www.nuget.org/packages/Azure.AI.OpenAI/) client library to communicate with Azure OpenAI services, which takes a dependency on the [OpenAI](https://www.nuget.org/packages/OpenAI/2.1.0-beta.1) library. The sample app configures keyless authentication using Microsoft Entra ID to communicate with Azure OpenAI.\n\n### Configure authentication and service registration\n\nIn this sample, keyless authentication is configured in the `program.cs` file. The following code snippet uses the `AZURE_CLIENT_ID` environment variable set by `azd` to create a [ManagedIdentityCredential](/dotnet/api/azure.identity.managedidentitycredential?view=azure-dotnet&preserve-view=true) instance capable of authenticating via user-assigned managed identity.\n\n```csharp\nvar userAssignedIdentityCredential = \n    new ManagedIdentityCredential(builder.Configuration.GetValue<string>(\"AZURE_CLIENT_ID\"));\n```\n\n>[!NOTE]\n>The `azd` resource environment variables are provisioned during `azd` app deployment.\n\nThe following code snippet uses the `AZURE_TENANT_ID` environment variable set by `azd` to create an [AzureDeveloperCliCredential](/python/api/azure-identity/azure.identity.aio.azuredeveloperclicredential?view=azure-python&preserve-view=true) instance capable of authenticating locally using the account signed-in to `azd`.\n\n```csharp\nvar azureDevCliCredential = new AzureDeveloperCliCredential(\n    new AzureDeveloperCliCredentialOptions()\n    { \n        TenantId = builder.Configuration.GetValue<string>(\"AZURE_TENANT_ID\") \n    });\n```\n\nThe Azure Identity client library provides credential classes that implement the Azure Core library's [TokenCredential](/python/api/azure-core/azure.core.credentials.tokencredential) protocol. A credential represents a distinct authentication flow for acquiring an access token from Microsoft Entra ID. These credentials can be chained together using `ChainedTokenCredential` to form an ordered sequence of authentication mechanisms to be attempted.\n\nThe following snippet registers the `AzureOpenAIClient` for dependency injection and creates a `ChainedTokenCredential` using a `ManagedIdentityCredential` and an `AzureDeveloperCliCredential`:\n\n- The `ManagedIdentityCredential` is used for Azure Functions, Azure App Service, and Azure Container Apps. A user-assigned managed identity is supported using the `AZURE_CLIENT_ID` that was provided to the `ManagedIdentityCredential`.\n- The `AzureDeveloperCliCredential` is used for local development. It was set previously based on the Microsoft Entra tenant to use.\n\n```csharp\nbuilder.Services.AddAzureClients(\n    clientBuilder => {\n        clientBuilder.AddClient<AzureOpenAIClient, AzureOpenAIClientOptions>((options, _, _)\n            => new AzureOpenAIClient(\n                new Uri(endpoint),\n                new ChainedTokenCredential(\n                    userAssignedIdentityCredential, azureDevCliCredential), options));\n    });\n```\n\n>[!TIP]\n>The order of the credentials is important, as the first valid Microsoft Entra access token is used. For more information, check out the [ChainedTokenCredential Overview](/azure/developer/python/sdk/authentication/credential-chains?tabs=dac#usage-guidance-for-defaultazurecredential) article.\n\n### Get chat completions using the Azure OpenAI client\n\nThe Blazor web app injects the registered `AzureOpenAIClient` at the top of the `Home.Razor` component:\n\n```csharp\n@inject AzureOpenAIClient azureOpenAIClient\n```\n\nWhen the user submits the form, the `AzureOpenAIClient` sends their prompt to the OpenAI model to generate a completion:\n\n```csharp\nChatClient chatClient = azureOpenAIClient.GetChatClient(\"gpt-4o-mini\");\n\nmessages.Add(new UserChatMessage(model.UserMessage));\n\nChatCompletion completion = await chatClient.CompleteChatAsync(messages);\n    messages.Add(new SystemChatMessage(completion.Content[0].Text));\n```\n\n:::zone-end\n\n:::zone pivot=\"typescript\"\n\n## Explore the sample code\n\n[!INCLUDE [typescript explore sample code](../javascript/ai/includes/get-started-securing-your-ai-app/explore-sample-code.md)]\n\n:::zone-end\n\n## Other security considerations\n\nThis article demonstrates how the sample uses `ChainedTokenCredential` for authenticating to the Azure OpenAI service.\n\nThe sample also has a [GitHub Action](https://github.com/microsoft/security-devops-action) that scans the infrastructure-as-code files and generates a report containing any detected issues. To ensure continued best practices in your own repository, we recommend that anyone creating solutions based on our templates ensure that the [GitHub secret scanning setting](https://docs.github.com/code-security/secret-scanning/introduction/about-secret-scanning) is enabled.\n\nConsider other security measures, such as:\n\n- [Restrict access to the appropriate set of app users using Microsoft Entra](/entra/identity-platform/howto-restrict-your-app-to-a-set-of-users).\n\n- Protecting the Azure Container Apps instance with a [firewall](/azure/container-apps/waf-app-gateway?tabs=default-domain) and/or [Virtual Network](/azure/container-apps/networking?tabs=workload-profiles-env%2Cazure-cli).\n\n## Clean up resources\n\n### Clean up Azure resources\n\nThe Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\nTo delete the Azure resources and remove the source code, run the following Azure Developer CLI command:\n\n```azdeveloper\nazd down --purge\n```\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n:::zone pivot=\"python\"\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running Codespaces sourced from the [`Azure-Samples/openai-chat-app-quickstart`](https://github.com/Azure-Samples/openai-chat-app-quickstart) GitHub repository.\n\n1. Open the context menu for the codespace and then select **Delete**.\n\n:::zone-end\n\n:::zone pivot=\"dotnet\"\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running Codespaces sourced from the [`Azure-Samples/openai-chat-app-quickstart-dotnet`](https://github.com/Azure-Samples/openai-chat-app-quickstart-dotnet) GitHub repository.\n\n1. Open the context menu for the codespace and then select **Delete**.\n\n:::zone-end\n\n:::zone pivot=\"typescript\"\n\n[!INCLUDE [typescript Clean up resources](../javascript/ai/includes/get-started-securing-your-ai-app/clean-up-resources.md)]\n\n:::zone-end\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\nOpen the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen Folder Locally**.\n\n:::image type=\"content\" source=\"./media/get-started-securing-your-ai-app/reopen-local-command-palette.png\" lightbox=\"./media/get-started-securing-your-ai-app/reopen-local-command-palette.png\" alt-text=\"Screenshot of the Command Palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> After Visual Studio Code stops the running development container, the container still exists in Docker in a stopped state. You can delete the container instance, container image, and volumes from Docker to free up more space on your local machine.\n\n---\n\n## Get help\n\n:::zone pivot=\"python\"\n\nIf your issue isn't addressed, log your issue to the repository's [Issues](https://github.com/Azure-Samples/openai-chat-app-quickstart/issues).\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Get started with the chat using your own data sample for Python](../python/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n\n:::zone-end\n\n:::zone pivot=\"dotnet\"\n\nIf your issue isn't addressed, log your issue to the repository's [Issues](https://github.com/Azure-Samples/openai-chat-app-quickstart-dotnet/issues).\n\n> [!div class=\"nextstepaction\"]\n> [Get started with the chat using your own data sample for .NET](/dotnet/ai/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)\n\n:::zone-end\n\n:::zone pivot=\"typescript\"\n\n[!INCLUDE [typescript get help](../javascript/ai/includes/get-started-securing-your-ai-app/get-help.md)]\n\n:::zone-end\n"
  },
  {
    "path": "articles/ai/how-to/extract-entities-using-structured-outputs.md",
    "content": "---\ntitle: \"Extract Entities Using Azure OpenAI Structured Outputs Mode\"\ndescription: \"Learn how to improve your Azure OpenAI model responses with structured outputs.\"\nms.date: 09/30/2025\nms.topic: how-to \nms.subservice: intelligent-apps\nms.custom: devx-track-python, devx-track-python-ai\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As an AI app developer, I want to learn how to use Azure OpenAI  structured outputs to improve my model responses from a simple example.\n---\n# Extract entities using Azure OpenAI structured outputs mode\n\nIn this article, you explore several examples to extract different types of entities. These examples demonstrate how to create an object schema and get a response from the Azure OpenAI model. It uses Python and the Azure OpenAI Structured Outputs Mode.\n\n> [!NOTE]\n> This article uses one or more [AI app templates](../intelligent-app-templates.md) for examples and guidance. AI app templates give you well-maintained, easy-to-deploy reference implementations, ensuring a high-quality starting point for your AI apps.\n\nThe sample provides everything you need. It includes the infrastructure and Python files to set up an Azure OpenAI `gpt-4o` model deployment. You can then use it to perform entity extraction with the Azure OpenAI structured outputs mode and the Python OpenAI SDK.\n\n## Get to the code\n\nExplore the [Azure OpenAI structured outputs](https://github.com/Azure-Samples/azure-openai-entity-extraction) sample this article is based on.\n\nJump to the [code walkthrough section](#explore-the-code-examples) to understand how each sample example works.\n\nBy following the instructions in this article, you will:\n\n- Deploy a model [from the list of models supported for structured outputs](/azure/ai-services/openai/how-to/structured-outputs?tabs=python-secure#supported-models).\n- Run the example Python files that use the [OpenAI Python package](https://pypi.org/project/openai/) and [Pydantic models](https://docs.pydantic.dev/) to make requests for structured outputs.\n\nStructured outputs in OpenAI make sure the AI model's responses follow a predefined [JSON Schema](https://json-schema.org/overview/what-is-jsonschema). This feature provides several key benefits by:\n\n- Making sure the responses match the defined schema, reducing errors and inconsistencies.\n- Helping turn unstructured data into well-defined, structured formats, making integration with other systems easier.\n- Reducing the need for post-processing, optimizing token usage and improving efficiency.\n\nStructured outputs are useful for function calling, extracting structured data, and building complex multi-step workflows.\n\nUse this same general approach for entity extraction across many file types, as long as they can be represented in either a text or image form.\n\n> [!NOTE]\n> Currently structured outputs aren't supported with:\n> - [Bring your own data](/azure/ai-services/openai/concepts/use-your-data) scenarios.\n> - [Assistants](/azure/ai-services/openai/how-to/assistant) or [Azure AI Agents Service](/azure/ai-services/agents/overview).\n> - `gpt-4o-audio-preview` and `gpt-4o-mini-audio-preview` version: `2024-12-17`.\n\n## Architectural diagram\n\n:::image type=\"content\" source=\"../media/get-started-structured-output/architecture-diagram.png\" lightbox=\"../media/get-started-structured-output/architecture-diagram.png\" alt-text=\"Diagram that shows Microsoft Entra managed identity connecting to Foundry Tools.\":::\n\n## Cost\n\nTo keep pricing as low as possible in this sample, most resources use a Basic or Consumption pricing tier. Alter your tier as needed based on your intended usage. To stop incurring charges, delete the resources when you're done with the article.\n\nLearn more about [cost in the sample repo](https://github.com/Azure-Samples/azure-openai-entity-extraction#costs).\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally by using Visual Studio Code.\n\nTo use this article, you need to fulfill the following prerequisites:\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n- An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- Azure account permissions. Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\n- Azure account permissions - Your Azure Account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n\n- [Azure Developer CLI](/azure/developer/azure-developer-cli)\n\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running\n\n- [Visual Studio Code](https://code.visualstudio.com/)\n\n- [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) \n\n---\n\n## Open a development environment\n\nFollow these instructions to set up a preconfigured development environment with all the required dependencies to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. Use GitHub Codespaces for the easiest development environment. It comes with the right developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\nUse the following steps to create a new GitHub codespace on the `main` branch of the [`Azure-Samples/azure-openai-entity-extraction`](https://github.com/Azure-Samples/azure-openai-entity-extraction) GitHub repository.\n\n1. Right-click the following button, and then select **Open link in new window**. This action makes the development environment and the documentation available for review.\n\n    [![Button that says Open in GitHub Codespaces.](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-openai-entity-extraction)\n\n1. On the **Create codespace** page, review the information, and then select **Create new codespace**.\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. In the terminal at the bottom of the screen, sign in to Azure by using the Azure Developer CLI:\n\n    ```azdeveloper\n    azd auth login --use-device-code\n    ```\n\n1. Open the URL in the terminal.\n1. Copy the code from the terminal and paste it into the URL you just opened. \n1. Follow the instructions to sign in to your Azure account.\n\nThe remaining tasks in this article take place in the context of this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n1. Create a new local directory on your computer for the project.\n\n    ```shell\n    mkdir my-structured-output-app\n    ```\n\n1. Navigate to the directory you created.\n\n    ```shell\n    cd my-structured-output-app\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```shell\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n\n1. Bring the GitHub repository to your local computer with the following Azure Developer CLI (AZD) command.\n\n    ```azdeveloper\n    azd init -t azure-openai-entity-extraction\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\nComplete the remaining exercises in this project within this development container.\n\n---\n\n## Deploy and run\n\nThe sample repository has all the code and configuration files for an Azure OpenAI gpt-4o model deployment. It also performs entity extraction using Structured Outputs mode and the Python `openai` SDK. Follow these steps to go through the sample Entity extraction example Azure deployment process:\n\n### Deploy entity extraction example to Azure\n\n1. Provision the OpenAI account:\n\n    ```shell\n    azd provision\n    ```\n\n1. Use the following table to answer each parameter:\n\n    |Parameter|Answer|\n    |--|--|\n    |Environment name|Keep it short and lowercase. Add your name or alias. For example, `struct-output`. It's used as part of the resource group name.|\n    |Subscription|Select the subscription to create the resources in. |\n    |Location for the OpenAI model|Select a location near you from the list.|\n\n    > [!NOTE]\n    > If you get an error or timeout during deployment, try changing the location. There might be availability constraints for the OpenAI resource. To change the location run:\n    >    ```shell\n    >    azd env set AZURE_LOCATION \"yournewlocationname\"\n    >    ```\n\n1. Wait until app is deployed. Deployment usually takes between 5 and 10 minutes to complete.\n\n### Run the entity extraction examples\n\nThe sample includes the following examples:\n\n| Example walkthrough | Example filename | Description |\n|---------------------|------------------|-------------|\n|[Example 1](#example-1-use-a-deployed-azure-openai-resource-to-extract-information-from-an-input-string) | `basic_azure.py` | A basic example that uses a deployed Azure OpenAI resource to extract information from an input string. |\n|[Example 2](#example-2-fetch-a-public-github-issue-using-the-github-api-and-then-extract-details)| `extract_github_issue.py` | This example fetches a public GitHub issue using the GitHub API and then extracts details. |\n|[Example 3](#example-3-fetch-a-public-readme-using-the-github-api-and-then-extract-details)| `extract_github_repo.py`| This example fetches a public README using the GitHub API and then extracts details. |\n|[Example 4](#example-4-parse-a-local-image-of-a-graph-and-extract-details-like-title-axis-and-legend)| `extract_image_graph.py`| This example parses a local image of a graph and extracts details like title, axis, legend. |\n|[Example 5](#example-5-parse-a-local-image-with-tables-and-extract-nested-tabular-data)| `extract_image_table.py`| This example parses a local image with tables and extracts nested tabular data. |\n|[Example 6](#example-6-parse-a-local-pdf-receipt-by-converting-to-markdown-and-then-extracting-order-details)| `extract_pdf_receipt.py` | This example parses a local PDF receipt using the `pymupdf` package to first convert it to Markdown and then extract order details. |\n|[Example 7](#example-7-parse-a-blog-post-and-extract-metadata)| `extract_webpage.py` | This example parses a blog post using the `BeautifulSoup` package, and extracts metadata (title, description, and tags.). |\n\nRun an example by either typing python `<example filename>.py` or clicking the Run button on the opened file.\n\n## Explore the code examples\n\nThis AI App Template contains several examples highlighting different structured output use cases. The next sections walk through the relevant code in each example.  \n\n### Example 1: Use a deployed Azure OpenAI resource to extract information from an input string\n\nThis example demonstrates how to use the Azure OpenAI service to extract structured information from a text input. It sets up Azure authentication, initializes the OpenAI client, defines a Pydantic model for the expected output, sends a request to the GPT model, and validates and prints the response. This approach ensures that the extracted information is well-structured and validated, making it easier to work with in downstream applications.\n\n#### Define the data model\n\nDefining a [Pydantic model](https://docs.pydantic.dev/latest/concepts/models/) ensures that the extracted information from the Azure OpenAI service is well-structured and validated. Pydantic models provide a clear schema for the expected output, which helps in:\n\n- Ensuring the extracted data matches the expected types and formats.\n- Reducing errors and inconsistencies by enforcing a predefined structure.\n- Making it easier to work with the extracted data in other applications by providing a clear and consistent data model.\n- Helping integrate with other systems by converting unstructured data into well-defined, structured formats.\n\n#### `CalendarEvent` model definition\n\nThe `CalendarEvent` model is a Pydantic model that defines the structure of the expected output from the GPT model.\n\n```python\nclass CalendarEvent(BaseModel):\n    name: str\n    date: str\n    participants: list[str]\n```\n\n- `name`: The event's name.\n- `date`: The event's date.\n- `participants`: A list of the event's participants.\n\n#### How `CalendarEvent` is used in the call to the model\n\nThe `CalendarEvent` model specifies the expected response format when sending a request to the GPT model. This approach makes sure the extracted information follows a specific schema.\n\nThe following code snippet sends a request to the GPT model using the `CalendarEvent` for the response:\n\n```python\ncompletion = client.beta.chat.completions.parse(\n    model=os.getenv(\"AZURE_OPENAI_GPT_DEPLOYMENT\"),\n    messages=[\n        {\"role\": \"system\", \"content\": \"Extract the event information.\"},\n        {\"role\": \"user\", \"content\": \"Alice and Bob are going to a science fair on Friday.\"},\n    ],\n    response_format=CalendarEvent,\n)\n```\n\n**client.beta.chat.completions.parse**: Sends a request to the GPT model to parse the input text and extract information.\n\n- **model**: The GPT model to use.\n- **messages**: A list of messages for the model. The system message gives instructions, and the user message has the image URL.\n- **response_format**: The expected response format using the `CalendarEvent` model.\n\n#### Parse and validate the response\n\nThe following code snippet handles the response from the GPT model. It first extracts the message from the response. Then, it checks if the model refused to process the request. If there's a refusal, it prints the refusal message. Otherwise, it prints the parsed response, which contains the structured information extracted. This approach ensures that the script can handle both successful and unsuccessful responses from the GPT model.\n\n```python\nmessage = completion.choices[0].message\nif (message.refusal):\n    rich.print(message.refusal)\nelse:\n    rich.print(message.parsed)\n```\n\n#### Why checking for refusal is important\n\n- **Error Handling**: The code checks if the GPT model refused to process the request. If it did, it prints the refusal message. This approach helps you (or the user) understand if the extraction was successful or if there were issues to address.\n\n- **Validation of Extracted Data**: The code prints the parsed response to show the extracted information in a readable format. This approach helps verify that the data matches the expected structure defined by the `CalendarEvent` model.\n\n#### View the response\n\nThe parsed response should be similar to the following snippet:\n\n```python\nCalendarEvent(name='Science Fair', date='Friday', participants=['Alice', 'Bob'])\n```\n\n### Example 2: Fetch a public GitHub issue using the GitHub API and then extract details\n\nThis example shows how to use the Azure OpenAI service to extract structured information from a GitHub issue. This walkthrough focuses only on the example code dealing with structured output.\n\n#### Define the `Issue` model\n\nThe `Issue` model is a Pydantic model that defines the structure of the expected output from the GPT model.\n\n```python\nclass Issue(BaseModel):\n    title: str\n    description: str = Field(..., description=\"A 1-2 sentence description of the project\")\n    type: IssueType\n    operating_system: str\n```\n\n- **title**: The issue's title.\n- **description**: A brief description of the issue.\n- **type**: The type of issue from the `IssueType` enumeration.\n- **operating_system**: The operating system related to the issue.\n\n#### `IssueType` Enumeration Definition\n\nThe `IssueType` Python class is an enumeration that defines possible values for the type of issue (for example, Bug Report, Feature, Documentation, Regression).\n\n```python\nclass IssueType(str, Enum):\n    BUGREPORT = \"Bug Report\"\n    FEATURE = \"Feature\"\n    DOCUMENTATION = \"Documentation\"\n    REGRESSION = \"Regression\"\n```\n\n#### Relationship between `Issue` and `IssueType`\n\nThe `Issue` model uses the `IssueType` enumeration to ensure that the `type` field contains only valid values. This relationship enforces consistency and validation in the extracted data.\n\n\n> [!NOTE]\n> While Example 1 focuses on a simple text input and uses a basic `CalendarEvent` Pydantic model, Example 2 introduces a more complex `Issue` model with enumerations for issue types. This approach ensures the extracted information follows specific types and values. It shows how to handle more detailed and varied data while keeping the structured output approach from Example 1.\n\n#### Fetch the GitHub Issue\n\nThe following code snippet fetches the issue from a specified GitHub repository.\n\n```python\nurl = \"https://api.github.com/repos/Azure-Samples/azure-search-openai-demo/issues/2231\"\nresponse = requests.get(url)\nif response.status_code != 200:\n    logging.error(f\"Failed to fetch issue: {response.status_code}\")\n    exit(1)\nissue_body = response.json()[\"body\"]\n```\n\n- **requests.get**: Sends a GET request to fetch the issue from the GitHub API.\n- **response.status_code**: Checks if the request was successful.\n- **issue_body**: Extracts the body of the issue from the JSON response.\n\n#### How `Issue` is used in the call to the model\n\nThe `Issue` model is used to specify the expected response format when sending a request to the GPT model. This approach makes sure the extracted information follows a specific schema.\n\n#### Send a request to the GPT model\n\n```python\ncompletion = client.beta.chat.completions.parse(\n    model=model_name,\n    messages=[\n        {\"role\": \"system\", \"content\": \"Extract the info from the GitHub issue markdown.\"},\n        {\"role\": \"user\", \"content\": issue_body},\n    ],\n    response_format=Issue,\n)\n```\n\n- **model**: The GPT model to use.\n- **messages**: A list of messages for the model. The system message gives instructions, and the user message has the image URL.\n- **response_format**: The expected response format using the `Issue` model.\n\n#### Parse and validate the response\n\nThe following code snippet handles the response from the GPT model. It first extracts the message from the response. Then, it checks if the model refused to process the request. If there's a refusal, it prints the refusal message. Otherwise, it prints the parsed response, which contains the structured information extracted. This approach ensures that the script can handle both successful and unsuccessful responses from the GPT model.\n\n```python\nmessage = completion.choices[0].message\nif (message.refusal):\n    print(message.refusal)\nelse:\n    print(message.parsed)\n```\n\n- **message**: Extracts the message from the first choice in the response.\n- **message.refusal**: Checks if the GPT model refused to process the request.\n- **print(message.refusal)**: Prints the refusal message if the model refused the request.\n- **print(message.parsed)**: Prints the parsed response if the extraction was successful.\n\n#### View the response\n\nThe parsed response should be similar to the following snippet:\n\n```python\nIssue(\n    title='Bug with groups metadata tag not updating in Azure Deployment',\n    description='After setting up the app with authentication and access control turned on, and running necessary scripts, the groups metadata tag does not update with group IDs.',\n    type=<IssueType.BUGREPORT: 'Bug Report'>,\n    operating_system='Windows 10'\n)\n```\n\n### Example 3: Fetch a public README using the GitHub API and then extract details\n\nThis example shows how to use the Azure OpenAI service to get structured information from a GitHub repository's README file. This walkthrough focuses only on the example code dealing with structured output.\n\n#### How `RepoOverview` uses the other defined models\n\nThe `RepoOverview` model uses the `Language`, `AzureService`, and `Framework` enumerations to define a structured and validated schema for the extracted information. This model is used in the call to the GPT model to ensure that the response adheres to the expected format, providing type safety, validation, and readability. The script then parses, validates, and prints the extracted information, making it easy to work with in downstream applications.\n\n#### `RepoOverview` model definition\n\nThe `RepoOverview` model is a Pydantic model that defines the structure of the expected output from the GPT model. It uses the other defined models (`Language`, `AzureService`, and `Framework`) to ensure that the extracted information adheres to specific enumerations and types.\n\n```python\nclass RepoOverview(BaseModel):\n    name: str\n    description: str = Field(..., description=\"A 1-2 sentence description of the project\")\n    languages: list[Language]\n    azure_services: list[AzureService]\n    frameworks: list[Framework]\n```\n\n- **name**: A string representing the name of the repository.\n- **description**: A string providing a brief description of the project.\n- **languages**: A list of `Language` enumeration values, representing the programming languages used in the project.\n- **azure_services**: A list of `AzureService` enumeration values, representing the Azure services used in the project.\n- **frameworks**: A list of `Framework` enumeration values, representing the frameworks used in the project.\n\n#### Enumerations used in `RepoOverview`\n\n- **Language**: Defines possible values for programming languages.\n\n  ```python\n  class Language(str, Enum):\n      JAVASCRIPT = \"JavaScript\"\n      PYTHON = \"Python\"\n      DOTNET = \".NET\"\n  ```\n\n- **AzureService**: Defines possible values for Azure services.\n\n  ```python\n  class AzureService(str, Enum):\n      AIFOUNDRY = \"Foundry\"\n      AISEARCH = \"AI Search\"\n      POSTGRESQL = \"PostgreSQL\"\n      COSMOSDB = \"CosmosDB\"\n      AZURESQL = \"Azure SQL\"\n  ```\n\n- **Framework**: Defines possible values for frameworks.\n\n  ```python\n  class Framework(str, Enum):\n      LANGCHAIN = \"Langchain\"\n      SEMANTICKERNEL = \"Semantic Kernel\"\n      LLAMAINDEX = \"Llamaindex\"\n      AUTOGEN = \"Autogen\"\n      SPRINGBOOT = \"Spring Boot\"\n      PROMPTY = \"Prompty\"\n  ```\n\n> [!NOTE]\n> Example 3 builds on Example 2 by introducing more complex models (`RepoOverview`) and enumerations (`Language`, `AzureService`, `Framework`) to ensure that the extracted information follows specific types and values. Example 3 shows how to handle more detailed and varied data while keeping the structured output approach from Example 2.\n\n#### How `RepoOverview` is used in the call to the model\n\nThe `RepoOverview` model specifies the expected response format when sending a request to the GPT model. This approach makes sure the extracted information follows a specific schema.\n\n- **model**: The GPT model to use.\n- **messages**: A list of messages for the model. The system message gives instructions, and the user message has the image URL.\n- **response_format**: The expected response format using the `RepoOverview` model.\n\n```python\ncompletion = client.beta.chat.completions.parse(\n    model=model_name,\n    messages=[\n        {\n            \"role\": \"system\",\n            \"content\": \"Extract the info from the GitHub issue markdown.\",\n        },\n        {\"role\": \"user\", \"content\": readme_content},\n    ],\n    response_format=RepoOverview,\n)\n```\n\n#### Parse and validate the response\n\nThe following code snippet handles the response from the GPT model. It first extracts the message from the response. Then, it checks if the model refused to process the request. If there's a refusal, it prints the refusal message. Otherwise, it prints the parsed response, which contains the structured information extracted. This approach ensures that the script can handle both successful and unsuccessful responses from the GPT model.\n\n```python\nmessage = completion.choices[0].message\nif (message.refusal):\n    print(message.refusal)\nelse:\n    print(message.parsed)\n```\n\n- **message**: Extracts the message from the first choice in the response.\n- **message.refusal**: Checks if the GPT model refused to process the request.\n- **print(message.refusal)**: Prints the refusal message if the model refused the request.\n- **print(message.parsed)**: Prints the parsed response if the extraction was successful.\n\n#### View the response\n\nThe parsed response should be similar to the following snippet:\n\n```python\nRepoOverview(\n    name='Job Finder Chatbot with RAG',\n    description='A chatbot application aimed at helping users find job opportunities and get relevant answers using Retrieval-Augmented Generation (RAG), leveraging Azure services for efficient search results.',\n    languages=[<Language.JAVASCRIPT: 'JavaScript'>],\n    azure_services=[<AzureService.AISTUDIO: 'AI Studio'>, <AzureService.AISEARCH: 'AI Search'>, <AzureService.POSTGRESQL: 'PostgreSQL'>],\n    frameworks=[<Framework.SPRINGBOOT: 'Spring Boot'>]\n)\n```\n\n### Example 4: Parse a local image of a graph and extract details like title, axis, and legend\n\nThis example shows how to use the Azure OpenAI service to get structured information from an image of a graph. The `Graph` model defines the expected output structure, making sure the data is well-structured and validated. The script converts the image to a base64-encoded URI, sends it to the GPT model, and checks the response against the `Graph` model. This approach ensures the information is reliable and easy to work with, providing type safety and readability.\n\n#### Define the `Graph` model\n\nThe `Graph` model is a Pydantic model that defines the structure of the expected output from the GPT model.\n\n```python\nclass Graph(BaseModel):\n    title: str\n    description: str = Field(..., description=\"1 sentence description of the graph\")\n    x_axis: str\n    y_axis: str\n    legend: list[str]\n```\n\n- **title**: A string that shows the title of the graph.\n- **description**: A string that gives a brief description of the graph.\n- **x_axis**: A string that shows the label of the x-axis.\n- **y_axis**: A string that shows the label of the y-axis.\n- **legend**: A list of strings that shows the legend entries of the graph.\n\n> [!NOTE]\n> Using images as input needs extra steps for encoding and specifying the content type, but the overall process is similar to using text for structured output.\n\n#### Prepare the image for input\n\nTo use an image as input for structured output, the script converts the image to a base64-encoded URI. This approach allows the image to be sent as part of the request to the GPT model.\n\n```python\ndef open_image_as_base64(filename):\n    with open(filename, \"rb\") as image_file:\n        image_data = image_file.read()\n    image_base64 = base64.b64encode(image_data).decode(\"utf-8\")\n    return f\"data:image/png;base64,{image_base64}\"\n\nimage_url = open_image_as_base64(\"example_graph_treecover.png\")\n```\n\n- **open_image_as_base64**: A function that reads an image file, encodes it in base64, and returns it as a data URI.\n- **image_url**: The base64-encoded URI of the image, used as input for the GPT model.\n\n> [!NOTE]\n> Example 4 builds on Example 3 by extending the concept of extracting structured information from text sources to extracting details from images. Example 4 shows how to handle visual data by converting a graph image to a base64-encoded URI and sending it to the GPT model. Example 4 introduces the `Graph` Pydantic model to make sure the extracted information from the image is well-structured and validated, similar to the approach used for text in Example 3.\n\n#### Send a request to the GPT model\n\nThe script sends a request to the GPT model to extract information from the image using structured outputs. The `Graph` model is specified as the expected response format. This approach makes sure the extracted information follows a specific schema.\n\n```python\ncompletion = client.beta.chat.completions.parse(\n    model=model_name,\n    messages=[\n        {\"role\": \"system\", \"content\": \"Extract the information from the graph\"},\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"image_url\": {\"url\": image_url}, \"type\": \"image_url\"},\n            ],\n        },\n    ],\n    response_format=Graph,\n)\n```\n\n- **model**: The GPT model to use.\n- **messages**: A list of messages for the model. The system message gives instructions, and the user message has the image URL.\n- **response_format**: The expected response format using the `Graph` model.\n\n#### Using images for input vs. using text\n\nUsing images as input for structured output differs from using text in several ways:\n\n- **Input Format**: Convert images to a base64-encoded URI before sending them to the GPT model, while text can be sent directly.\n- **Content Type**: You must specify the content type for images as `image_url`, while text is sent as plain text.\n- **Processing**: The GPT model processes images differently from text, extracting visual information and converting it into structured data based on the provided schema.\n\n#### Parse and validate the response\n\nThe following code snippet handles the response from the GPT model. It first extracts the message from the response. Then, it checks if the model refused to process the request. If there's a refusal, it prints the refusal message. Otherwise, it prints the parsed response, which contains the structured information extracted. This approach ensures that the script can handle both successful and unsuccessful responses from the GPT model.\n\n```python\nmessage = completion.choices[0].message\nif (message.refusal):\n    print(message.refusal)\nelse:\n    print(message.parsed)\n```\n\n- **message**: Extracts the message from the first choice in the response.\n- **message.refusal**: Checks if the GPT model refused to process the request.\n- **print(message.refusal)**: Prints the refusal message if the model refused the request.\n- **print(message.parsed)**: Prints the parsed response if the extraction was successful.\n\n#### View the response\n\nThe parsed response should be similar to the following snippet:\n\n```python\nGraph(\n    title='Global tree cover: annual loss',\n    description='This graph shows the annual loss of global tree cover by region from 2000 to 2020.',\n    x_axis='Year (2000-2020)',\n    y_axis='Thousand square kilometers/miles of tree cover lost',\n    legend=['Boreal', 'Temperate', 'Subtropical', 'Tropical']\n)\n```\n\n### Example 5: Parse a local image with tables and extract nested tabular data\n\nThis example shows how to use the Azure OpenAI service to extract structured information from an image of a table. The example converts the image to a base64-encoded URI, sends it to the GPT model, and validates the response against the `PlantInventory` model. The `Plant` and `PlantInventory` models define the expected output structure, ensuring that the extracted data is well-structured and validated.\n\n#### Define the `Plant` and `PlantInventory` models\n\nThe `Plant` and `PlantInventory` models are Pydantic models that define the structure of the expected output from the GPT model. This approach makes sure the extracted information follows a specific schema.\n\n- **Plant**: Represents individual plant entries with fields for species, common name, quantity, size, price, county, and notes.\n\n    ```python\n    class Plant(BaseModel):\n        species: str\n        common_name: str\n        quantity: int\n        size: str\n        price: float\n        county: str\n        notes: str\n    ```\n    \n    - **species**: The plant's species.\n    - **common_name**: The plant's common name.\n    - **quantity**: The number of plants.\n    - **size**: The plant's size.\n    - **price**: The plant's price.\n    - **county**: The county where the plant is located.\n    - **notes**: Any other notes about the plant.\n\n- **PlantInventory**: Represents the overall inventory, categorizing plants into lists of annuals, bulbs, and grasses.\n\n    ```python\n    class PlantInventory(BaseModel):\n        annuals: list[Plant]\n        bulbs: list[Plant]\n        grasses: list[Plant]\n    ```\n\n    - **annuals**: A list of `Plant` objects that are annuals.\n    - **bulbs**: A list of `Plant` objects that are bulbs.\n    - **grasses**: A list of `Plant` objects that are grasses.\n\n#### How `PlantInventory` uses the `Plant` model\n\nThe `PlantInventory` model groups multiple `Plant` objects into lists. Each category (annuals, bulbs, grasses) is a list of `Plant` objects. This structure helps the example organize and check the plant data.\n\n#### Prepare the image for input\n\nTo use an image as input, the following code snippet converts the image to a base64-encoded URI. This approach lets the image be sent in the request to the GPT model.\n\n```python\ndef open_image_as_base64(filename):\n    with open(filename, \"rb\") as image_file:\n        image_data = image_file.read()\n    image_base64 = base64.b64encode(image_data).decode(\"utf-8\")\n    return f\"data:image/png;base64,{image_base64}\"\n\nimage_url = open_image_as_base64(\"example_table_plants.png\")\n```\n\n- **open_image_as_base64**: A function that reads an image file, encodes it in base64, and returns it as a data URI.\n- **image_url**: The base64-encoded URI of the image, used as input for the GPT model.\n\n> [!NOTE]\n> Example 5 shows how to extract structured information from an image of a table. It introduces the `Plant` and `PlantInventory` Pydantic models to define the expected output structure, ensuring the extracted data is well-organized and validated. This approach shows how to handle more detailed and nested data while keeping the structured output method used in Example 4.\n\n#### Use the models in the call to the GPT model\n\nThe following code snippet sends a request to the GPT model to extract information from an image of a table using structured outputs. The `PlantInventory` model is specified as the expected response format, which ensures that the extracted data is structured according to the defined schema.\n\n#### Send a request to the GPT model\n\n```python\ncompletion = client.beta.chat.completions.parse(\n    model=model_name,\n    messages=[\n        {\"role\": \"system\", \"content\": \"Extract the information from the table\"},\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"image_url\": {\"url\": image_url}, \"type\": \"image_url\"},\n            ],\n        },\n    ],\n    response_format=PlantInventory,\n)\n```\n\n- **model**: The GPT model to use.\n- **messages**: A list of messages for the model. The system message gives instructions, and the user message has the image URL.\n- **response_format**: The expected response format using the `PlantInventory` model.\n\n#### Parse and validate the response\n\nThe following code snippet handles the response from the GPT model. It first extracts the message from the response. Then, it checks if the model refused to process the request. If there's a refusal, it prints the refusal message. Otherwise, it prints the parsed response, which contains the structured information extracted. This approach ensures that the script can handle both successful and unsuccessful responses from the GPT model.\n\n```python\nmessage = completion.choices[0].message\nif (message.refusal):\n    print(message.refusal)\nelse:\n    print(message.parsed)\n```\n\n- **message**: Extracts the message from the first choice in the response.\n- **message.refusal**: Checks if the GPT model refused to process the request.\n- **print(message.refusal)**: Prints the refusal message if the model refused the request.\n- **print(message.parsed)**: Prints the parsed response if the extraction was successful.\n\n#### View the response\n\nThe parsed response should be similar to the following snippet:\n\n```python\nPlantInventory(\n    annuals=[\n        Plant(species='Centromadia pungens', common_name='Common tarweed', quantity=8, size='4\"S', price=1.83, county='Unknown', notes='75% off sale'),\n        Plant(species='Epilobium densiflorum', common_name='Dense Spike-primrose', quantity=3, size='4\"S', price=3.65, county='San Mateo', notes='50% off sale'),\n        Plant(species='Eschscholzia caespitosa', common_name='Tufted Poppy', quantity=119, size='D-16S', price=3.6, county='Unknown', notes='50% off sale'),\n        Plant(species='Eschscholzia californica', common_name='California poppy', quantity=85, size='D-16S', price=3.6, county='Bay Area', notes='50% off sale'),\n        Plant(species=\"Eschscholzia californica 'Purple Gleam'\", common_name='Purple Gleam Poppy', quantity=2, size='D-16S', price=3.6, county='Unknown', notes='50% off sale'),\n        Plant(species='Eschscholzia californica var. maritima', common_name='Coastal California Poppy', quantity=137, size='D-16S', price=3.6, county='Unknown', notes='50% off sale'),\n        Plant(species='Madia elegans', common_name='Tarweed', quantity=6, size='4\"S', price=1.83, county='Unknown', notes='75% off sale'),\n        Plant(species='Menzelia lindleyi', common_name=\"Lindley's Blazing Star\", quantity=35, size='4\"S', price=3.65, county='Unknown', notes='50% off sale'),\n        Plant(species='Symphyotrichum subulatum', common_name='Slim marsh aster', quantity=10, size='D-16S', price=5.4, county='Contra Costa', notes='25% off sale'),\n        Plant(species='Trichostema lanceolatum', common_name='Vinegar weed', quantity=11, size='D-16S', price=5.4, county='Contra Costa', notes='25% off sale'),\n        Plant(species='Trichostema lanceolatum', common_name='Vinegar weed', quantity=20, size='D-16S', price=5.4, county='Stanislaus', notes='25% off sale')\n    ],\n    bulbs=[\n        Plant(species='Brodiaea californica', common_name='California brodiaea', quantity=31, size='D-16', price=7.3, county='Bay Area', notes=''),\n        Plant(species='Chlorogalum pomeridianum', common_name='Soap plant', quantity=20, size='1-Gal', price=15.7, county='E. Marin', notes=''),\n        Plant(species='Epipactis gigantea', common_name='Stream orchid', quantity=19, size='1-Gal', price=15.7, county='Unknown', notes=''),\n        Plant(species='Wyethia angustifolia', common_name='Narrowleaf mule ears', quantity=31, size='D-16', price=7.3, county='Marin', notes=''),\n        Plant(species='Wyethia angustifolia', common_name='Narrowleaf mule ears', quantity=43, size='D-16', price=7.3, county='Sonoma', notes=''),\n        Plant(species='Wyethia angustifolia', common_name='Narrowleaf mule ears', quantity=2, size='D-40', price=10.9, county='Sonoma', notes=''),\n        Plant(species='Wyethia mollis', common_name=\"Woolly Mule's Ear's\", quantity=2, size='D-40', price=10.9, county='Sonoma', notes='')\n    ],\n    grasses=[\n        Plant(species='Agrostis pallens', common_name='Thingrass', quantity=564, size='StubS', price=0.58, county='Unknown', notes='75% off sale'),\n        Plant(species='Anthoxanthum occidentale', common_name='Vanilla grass', quantity=146, size='Stub', price=2.3, county='Unknown', notes=''),\n        Plant(species='Bouteloua gracilis', common_name='Blue grama', quantity=111, size='StubS', price=1.15, county='Unknown', notes='50% off sale'),\n        Plant(species='Bouteloua gracilis', common_name='Blue grama', quantity=57, size='D-16S', price=5.4, county='Unknown', notes='25% off sale')\n    ]\n)\n```\n\n### Example 6: Parse a local PDF receipt by converting to Markdown and then extracting order details\n\nThis example shows how to use the Azure OpenAI service to extract structured information from a PDF receipt. The `Item` and `Receipt` models define the expected output structure, ensuring the data is well-structured and validated. The example converts the PDF to markdown text, sends it to the GPT model, and checks the response against the `Receipt` model. Using PDF files as input needs extra steps for content extraction and conversion, but the process is similar to using text for structured output.\n\n#### Extract from PDF files\n\nSimilar to using images as input, you extract the PDF as text. You can use a hosted service like [Azure Document Intelligence](/azure/ai-services/document-intelligence/overview) or a local Python package like [pymupdf](https://pymupdf.readthedocs.io/en/latest/pymupdf4llm/index.html#).\n\n#### Using PDF Files for input vs. using text\n\nUsing PDF files as input for structured output differs from using text in several ways:\n\n- **Input Format**: Convert PDF files to markdown text before sending them to the GPT model. Text can be sent directly.\n- **Content Extraction**: Extract and convert the PDF content to markdown text that the GPT model can process.\n- **Processing**: The GPT model processes the extracted text from the PDF and converts it into structured data based on the provided schema.\n\n#### Define the `Item` and `Receipt` models\n\nThe `Item` and `Receipt` models are Pydantic models that define the structure of the expected output from the GPT model. This approach makes sure the extracted information follows a specific schema.\n\n- **Item**: Represents individual items on the receipt with fields for product name, price, and quantity.\n\n    ```python\n    class Item(BaseModel):\n        product: str\n        price: float\n        quantity: int\n    ```\n\n    - **product**: The name of the product.\n    - **price**: The price of the product.\n    - **quantity**: The quantity of the product.\n\n- **Receipt**: Represents the overall receipt, including fields for total amount, shipping cost, payment method, a list of items, and the order number. The `Receipt` model uses the `Item` model to represent a structured receipt with detailed information about each item.\n\n    ```python\n    class Receipt(BaseModel):\n        total: float\n        shipping: float\n        payment_method: str\n        items: list[Item]\n        order_number: int\n    ```\n\n    - **total**: The total amount of the receipt.\n    - **shipping**: The shipping cost.\n    - **payment_method**: The payment method used.\n    - **items**: A list of `Item` objects on the receipt.\n    - **order_number**: The order number.\n\n> [!NOTE]\n> Example 6 builds on Example 5 by extending the concept of extracting structured information from images to handling PDF files. Example 6 shows an extra step converting the PDF file to markdown text as input to the GPT model, while keeping the structured output method used in Example 5.\n\n#### Use the models in the call to the GPT Model\n\nThe example sends a request to the GPT model to extract information from a PDF receipt using structured outputs. The `Receipt` model is specified as the expected response format, which ensures that the extracted data is structured according to the defined schema.\n\n```python\ncompletion = client.beta.chat.completions.parse(\n    model=model_name,\n    messages=[\n        {\"role\": \"system\", \"content\": \"Extract the information from the receipt\"},\n        {\"role\": \"user\", \"content\": md_text},\n    ],\n    response_format=Receipt,\n)\n```\n\n- **model**: The GPT model to use.\n- **messages**: A list of messages for the model. The system message gives instructions, and the user message has the image URL.\n- **response_format**: The expected response format using the `Receipt` model.\n\n#### Parse and validate the response\n\nThe following code snippet handles the response from the GPT model. It first extracts the message from the response. Then, it checks if the model refused to process the request. If there's a refusal, it prints the refusal message. Otherwise, it prints the parsed response, which contains the structured information extracted. This approach ensures that the script can handle both successful and unsuccessful responses from the GPT model.\n\n```python\nmessage = completion.choices[0].message\nif (message.refusal):\n    print(message.refusal)\nelse:\n    print(message.parsed)\n```\n\n- **message**: Extracts the message from the first choice in the response.\n- **message.refusal**: Checks if the GPT model refused to process the request.\n- **print(message.refusal)**: Prints the refusal message if the model refused the request.\n- **print(message.parsed)**: Prints the parsed response if the extraction was successful.\n\n#### View the response\n\nThe parsed response should be similar to the following snippet:\n\n```python\nReceipt(total=242.05, shipping=0.0, payment_method='Credit Card', items=[Item(product='Die Cut ID: 158484 • 3 × 3 • Lamination: Glossy • Shape: Contour', price=242.05, quantity=500)], order_number=43962)\n```\n\n### Example 7: Parse a blog post and extract metadata\n\nThis example shows how to use the Azure OpenAI service to extract structured information from a blog post. The `BlogPost` model defines the expected output structure, ensuring the extracted data is well-structured and validated. The example fetches the webpage, extracts the relevant content, sends it to the GPT model, and validates the response against the `BlogPost` model.\n\n#### Using web pages for input vs. using text\n\nUsing web pages as input for structured output differs from using text in several ways:\n\n- **Input Format**: Fetch and parse web pages to extract relevant content before sending them to the GPT model. Text can be sent directly.\n- **Content Extraction**: Extract and convert the webpage content to a text format that the GPT model can process.\n- **Processing**: The GPT model processes the extracted text from the webpage and converts it into structured data based on the provided schema.\n\n#### Define the `BlogPost` model\n\nThe `BlogPost` model is a Pydantic model that defines the structure of the expected output from the GPT model. This approach makes sure the extracted information follows a specific schema.\n\n```python\nclass BlogPost(BaseModel):\n    title: str\n    summary: str = Field(..., description=\"A 1-2 sentence summary of the blog post\")\n    tags: list[str] = Field(..., description=\"A list of tags for the blog post, like 'python' or 'openai'\")\n```\n\n- **title**: The blog post's title.\n- **summary**: A brief summary of the blog post.\n- **tags**: Tags associated with the blog post.\n\n#### Prepare the webpage for input\n\nTo use a webpage as input for structured output, the following code snippet fetches the webpage content and extracts the relevant parts (title and body) using the BeautifulSoup Python library. This process prepares the content of the webpage to be sent to the GPT model.\n\n```python\nurl = \"https://blog.pamelafox.org/2024/09/integrating-vision-into-rag-applications.html\"\nresponse = requests.get(url)\nif response.status_code != 200:\n    print(f\"Failed to fetch the page: {response.status_code}\")\n    exit(1)\nsoup = BeautifulSoup(response.content, \"html.parser\")\npost_title = soup.find(\"h3\", class_=\"post-title\")\npost_contents = soup.find(\"div\", class_=\"post-body\").get_text(strip=True)\n```\n\n- **requests.get**: Sends a GET request to fetch the webpage content.\n- **BeautifulSoup**: Parses the HTML content of the webpage.\n- **post_title**: Extracts the title of the blog post.\n- **post_contents**: Extracts the body of the blog post.\"\n\n> [!NOTE]\n> Example 7 builds on Example 6 by extending the concept of extracting structured information from PDFs to handling web pages. This approach shows how to handle web content by parsing the webpage with BeautifulSoup. Then the parsed content is sent to the GPT model and returns structured output as the `BlogPost` model.\n\n#### Use `BlogPost` in the call to the model\n\nThe following code snippet sends a request to the GPT model to extract information from the prepared web page text (`post_title` and `post_contents`) using structured outputs. The `BlogPost` model is specified as the expected response format, which ensures that the extracted data is structured according to the defined schema.\n\n```python\ncompletion = client.beta.chat.completions.parse(\n    model=model_name,\n    messages=[\n        {\"role\": \"system\", \"content\": \"Extract the information from the blog post\"},\n        {\"role\": \"user\", \"content\": f\"{post_title}\\n{post_contents}\"},\n    ],\n    response_format=BlogPost,\n)\n```\n\n- **model**: The GPT model to use.\n- **messages**: A list of messages for the model. The system message gives instructions, and the user message has the image URL.\n- **response_format**: The expected response format using the `BlogPost` model.\n\n#### Parse and validate the response\n\nThe following code snippet handles the response from the GPT model. It first extracts the message from the response. Then, it checks if the model refused to process the request. If there's a refusal, it prints the refusal message. Otherwise, it prints the parsed response, which contains the structured information extracted. This approach ensures that the script can handle both successful and unsuccessful responses from the GPT model.\n\n```python\nmessage = completion.choices[0].message\nif (message.refusal):\n    print(message.refusal)\nelse:\n    print(message.parsed)\n```\n\n- **message**: Extracts the message from the first choice in the response.\n- **message.refusal**: Checks if the GPT model refused to process the request.\n- **print(message.refusal)**: Prints the refusal message if the model refused the request.\n- **print(message.parsed)**: Prints the parsed response if the extraction was successful.\n\n#### View the response\n\nThe parsed response should be similar to the following snippet:\n\n```python\nBlogPost(\n    title='Integrating Vision into RAG Applications',\n    summary='This blog post discusses the integration of vision into Retrieval Augmented Generation (RAG) applications, allowing models to utilize image sources alongside text. It introduces multimodal LLMs and embedding models via Azure, demonstrating how these enable RAG to process both text and images, improving responses to queries that involve image data.',\n    tags=['RAG', 'LLM', 'Azure', 'AI', 'Multimodal', 'OpenAI', 'GPT-4', 'Machine Learning', 'Image Processing']\n)\n```\n\n## Clean up resources\n\n### Clean up Azure resources\n\nThe Azure resources that you created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\nTo delete the Azure resources and remove the source code, run the following Azure Developer CLI command:\n\n```azdeveloper\nazd down --purge\n```\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment helps you maximize the amount of free per-core-hours entitlement that you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign in to the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running codespace sourced from the [`Azure-Samples//azure-openai-entity-extraction`](https://github.com/Azure-Samples/azure-openai-entity-extraction) GitHub repository.\n\n1. Open the context menu for the codespace and select **Delete**.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nStop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\nOpen the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen Folder Locally**.\n\n> [!TIP]\n> After Visual Studio Code stops the running development container, the container still exists in Docker in a stopped state. You can delete the container instance, container image, and volumes from Docker to free up more space on your local machine.\n\n---\n\n## Get help\n\nLog your issue to the repository's [issues page](https://github.com/Azure-Samples/azure-openai-entity-extraction/issues).\n\n## Resources\n\n- [How to use structured outputs](/azure/ai-services/openai/how-to/structured-outputs?tabs=python-secure#supported-models)"
  },
  {
    "path": "articles/ai/how-to/switching-endpoints.md",
    "content": "---\ntitle: \"How to switch between OpenAI and Azure OpenAI endpoints\"\ndescription: \"Learn how to switch between OpenAI and Azure OpenAI endpoints in your application.\"\nms.date: 10/27/2025\nms.topic: how-to \nms.subservice: intelligent-apps\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.collection: ce-skilling-ai-copilot\nzone_pivot_group_filename: developer/intro/intro-zone-pivot-groups.yml\nzone_pivot_groups: intelligent-apps-languages\n---\n# How to switch between OpenAI and Azure OpenAI endpoints\n\nThis article shows you how to switch to the new unified OpenAI v1 chat completion endpoint. It covers the common changes and differences when you work with OpenAI and Azure OpenAI.\n\n:::zone pivot=\"python\"\nWhile OpenAI and Azure OpenAI rely on a [common Python client library](https://github.com/openai/openai-python), there were small changes you needed to make to your code in order to swap back and forth between the endpoints. The new unified OpenAI v1 chat completion endpoint eliminates the need for separate Azure-specific code paths.\n:::zone-end\n:::zone pivot=\"dotnet\"\n:::zone-end\n\n## Authentication\n\nWe recommend keyless authentication using Microsoft Entra ID. If that's not possible, use an API key and store it in Azure Key Vault. You can use an environment variable for testing outside of your Azure environments.\n\n### API key authentication\n\n:::zone pivot=\"python\"\n\n#### [OpenAI](#tab/openai)\n\n```python\nimport os\nfrom openai import OpenAI\n\nclient = OpenAI(\n    api_key=os.getenv(\"OPENAI_API_KEY\")\n)\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```python\nimport os\nfrom openai import OpenAI\n    \nclient = OpenAI(\n    api_key=os.getenv(\"AZURE_OPENAI_API_KEY\"),  \n    base_url=\"https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/\"\n)\n```\n\n---\n\n### Microsoft Entra authentication\n\nMicrosoft Entra authentication is only supported with Azure OpenAI resources. Complete the following steps:\n\n1. Install the Azure Identity client library:\n\n    ```python\n    pip install azure-identity\n    ```\n\n1. Configure the OpenAI client object as follows:\n\n    ```python\n    from azure.identity import DefaultAzureCredential, get_bearer_token_provider\n    from openai import OpenAI\n    \n    credential = DefaultAzureCredential()\n    token_provider = get_bearer_token_provider(\n        credential,\n        \"https://cognitiveservices.azure.com/.default\"\n    )\n    \n    client = OpenAI(\n        base_url = \"https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/\", \n        api_key = token_provider,\n    )\n    ```\n\n    > [!TIP]\n    > `DefaultAzureCredential` can be optimized for the environment in which your app runs. For more information, see [How to customize DefaultAzureCredential](/azure/developer/python/sdk/authentication/credential-chains#how-to-customize-defaultazurecredential).\n\n1. Assign the appropriate Azure role-based access control (RBAC) permissions. For more information, see [Azure role-based access control (RBAC)](/azure/ai-foundry/openai/how-to/role-based-access-control).\n\n    When running in Azure, assign roles to the managed identity used by the Azure host resource. When running in the local development environment, assign roles to the user running the app.\n\n:::zone-end\n:::zone pivot=\"dotnet\"\n\n#### [OpenAI](#tab/openai)\n\n```csharp\nusing OpenAI;\nusing System;\nusing System.ClientModel;\n\nstring apiKey = Environment.GetEnvironmentVariable(\"OPENAI_API_KEY\");\nOpenAIClient client = new(new ApiKeyCredential(apiKey));\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```csharp\nusing OpenAI;\nusing System;\nusing System.ClientModel;\n\n// code omitted for brevity\n\nOpenAIClientOptions clientOptions = new()\n{\n    Endpoint = new Uri($\"{resourceEndpoint}/openai/v1/\")\n};\n\nstring apiKey = Environment.GetEnvironmentVariable(\"AZURE_OPENAI_API_KEY\");\nOpenAIClient client = new(new ApiKeyCredential(apiKey), clientOptions);\n```\n\n---\n\n### Microsoft Entra authentication\n\nMicrosoft Entra authentication is only supported with Azure OpenAI resources. Complete the following steps:\n\n1. Install the Azure Identity client library:\n\n    ```dotnetcli\n    dotnet add package Azure.Identity\n    ```\n\n1. Configure the `OpenAIClient` object as follows:\n\n    ```csharp\n    using Azure.Identity;\n    using OpenAI;\n    using System;\n    using System.ClientModel.Primitives;\n    \n    // code omitted for brevity\n\n    DefaultAzureCredential credential = new();\n    BearerTokenPolicy tokenPolicy = new(credential, \"https://cognitiveservices.azure.com/.default\");\n    \n    OpenAIClientOptions clientOptions = new()\n    {\n        Endpoint = new Uri($\"{resourceEndpoint}/openai/v1/\")\n    };\n    \n    OpenAIClient client = new(tokenPolicy, clientOptions);\n    ```\n\n    > [!TIP]\n    > `DefaultAzureCredential` can be optimized for the environment in which your app runs. For more information, see [How to customize DefaultAzureCredential](/dotnet/azure/sdk/authentication/credential-chains?tabs=dac#how-to-customize-defaultazurecredential).\n\n1. Assign the appropriate Azure role-based access control (RBAC) permissions. For more information, see [Azure role-based access control (RBAC)](/azure/ai-foundry/openai/how-to/role-based-access-control).\n\n    When running in Azure, assign roles to the managed identity used by the Azure host resource. When running in the local development environment, assign roles to the user running the app.\n\n:::zone-end\n:::zone pivot=\"javascript\"\n\n#### [OpenAI](#tab/openai)\n\n```javascript\nimport { OpenAI } from \"openai\";\nimport \"dotenv/config\";\n\nconst apiKey = process.env[\"OPENAI_API_KEY\"];\n\nif (!endpoint) {\n  throw new Error(\"Please set the OPENAI_API_KEY environment variable.\");\n}\n\nconst client = new OpenAI({ apiKey });\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```javascript\nimport { OpenAI } from \"openai\";\nimport \"dotenv/config\";\n\nconst endpoint = process.env[\"AZURE_OPENAI_ENDPOINT\"];\n\nif (!endpoint) {\n  throw new Error(\"Please set the AZURE_OPENAI_ENDPOINT environment variable.\");\n}\n\nconst apiKey = process.env[\"AZURE_OPENAI_API_KEY\"];\n\nif (!apiKey) {\n  throw new Error(\"Please set the AZURE_OPENAI_API_KEY environment variable.\");\n}\n\nconst client = new OpenAI({ baseURL: endpoint + \"/openai/v1\", apiKey });\n```\n\n---\n\n### Microsoft Entra authentication\n\nMicrosoft Entra authentication is only supported with Azure OpenAI resources. Complete the following steps:\n\n1. Install the Azure Identity client library:\n\n    ```javascript\n    npm install @azure/identity\n    ```\n\n1. Configure the OpenAI client object as follows:\n\n    ```javascript\n    import { OpenAI } from \"openai\";\n    import { DefaultAzureCredential, getBearerTokenProvider } from \"@azure/identity\";\n    import \"dotenv/config\";\n    \n    const endpoint = process.env[\"AZURE_OPENAI_ENDPOINT\"];\n    \n    if (!endpoint) {\n      throw new Error(\"Please set the AZURE_OPENAI_ENDPOINT environment variable.\");\n    }\n    \n    const scope = \"https://cognitiveservices.azure.com/.default\";\n    const azureADTokenProvider = getBearerTokenProvider(new DefaultAzureCredential(), scope);\n    const client = new OpenAI({ baseURL: endpoint + \"/openai/v1\", apiKey: azureADTokenProvider });\n    ```\n\n    > [!TIP]\n    > `DefaultAzureCredential` can be optimized for the environment in which your app runs. For more information, see [How to customize DefaultAzureCredential](/azure/developer/javascript/sdk/authentication/credential-chains#how-to-customize-defaultazurecredential).\n\n1. Assign the appropriate Azure role-based access control (RBAC) permissions. For more information, see [Azure role-based access control (RBAC)](/azure/ai-foundry/openai/how-to/role-based-access-control).\n\n    When running in Azure, assign roles to the managed identity used by the Azure host resource. When running in the local development environment, assign roles to the user running the app.\n\n:::zone-end\n\n:::zone pivot=\"java\"\n\n#### [OpenAI](#tab/openai)\n\n```java\nimport com.openai.client.OpenAIClient;\nimport com.openai.client.okhttp.OpenAIOkHttpClient;\n\npublic class OpenAISample {\n\n    public static void main(String[] args) {\n        OpenAIClient openAIClient = OpenAIOkHttpClient.builder()\n                .apiKey(System.getenv(\"OPENAI_API_KEY\"))\n                .build();\n    }\n}\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```java\nimport com.openai.azure.credential.AzureApiKeyCredential;\nimport com.openai.client.OpenAIClient;\nimport com.openai.client.okhttp.OpenAIOkHttpClient;\n\npublic class AzureOpenAISample {\n\n    public static void main(String[] args) {\n        OpenAIClient azureOpenAIClient = OpenAIOkHttpClient.builder()\n                .baseUrl(System.getenv(\"AZURE_OPENAI_ENDPOINT\"))\n                .credential(AzureApiKeyCredential.create(System.getenv(\"AZURE_OPENAI_API_KEY\")))\n                .build();\n    }\n}\n```\n\n---\n\n### Microsoft Entra authentication\n\nMicrosoft Entra authentication is only supported with Azure OpenAI resources. Complete the following steps:\n\n1. Include the [azure-identity](https://mvnrepository.com/artifact/com.azure/azure-identity) dependency in your project.\n\n1. Configure the `OpenAIClient` object as follows:\n\n    ```java\n    import com.azure.identity.AuthenticationUtil;\n    import com.azure.identity.DefaultAzureCredential;\n    import com.azure.identity.DefaultAzureCredentialBuilder;\n    import com.openai.client.OpenAIClient;\n    import com.openai.client.okhttp.OpenAIOkHttpClient;\n    import com.openai.credential.BearerTokenCredential;\n    \n    import java.util.function.Supplier;\n    \n    public class AzureOpenAISample {\n    \n        public static void main(String[] args) {\n            DefaultAzureCredential tokenCredential = new DefaultAzureCredentialBuilder().build();\n            Supplier<String> bearerTokenSupplier = AuthenticationUtil.getBearerTokenSupplier(\n                    tokenCredential, \"https://cognitiveservices.azure.com/.default\");\n            OpenAIClient azureOpenAIClient = OpenAIOkHttpClient.builder()\n                    .fromEnv()\n                    // Set the Azure Entra ID\n                    .credential(BearerTokenCredential.create(bearerTokenSupplier))\n                    .build();\n        }\n    }\n    ```\n\n    > [!TIP]\n    > `DefaultAzureCredential` can be optimized for the environment in which your app runs. For more information, see [How to customize DefaultAzureCredential](/azure/developer/java/sdk/authentication/credential-chains#how-to-customize-defaultazurecredential).\n\n1. Assign the appropriate Azure role-based access control (RBAC) permissions. For more information, see [Azure role-based access control (RBAC)](/azure/ai-foundry/openai/how-to/role-based-access-control).\n\n    When running in Azure, assign roles to the managed identity used by the Azure host resource. When running in the local development environment, assign roles to the user running the app.\n\n:::zone-end\n\n:::zone pivot=\"golang\"\n\n#### [OpenAI](#tab/openai)\n\n```go\n// import (\n//    \"github.com/openai/openai-go/v3\"\n//    \"github.com/openai/openai-go/v3/option\"\n// )\n\nclient := openai.NewClient(\n    option.WithAPIKey(os.Getenv(\"OPENAI_API_KEY\")),\n)\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```go\n// import (\n//    \"github.com/openai/openai-go/v3\"\n//    \"github.com/openai/openai-go/v3/azure\"\n//    \"github.com/openai/openai-go/v3/option\"\n// )\n\nclient := openai.NewClient(\n    option.WithBaseURL(\"https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/\"),\n    azure.WithAPIKey(os.Getenv(\"AZURE_OPENAI_API_KEY\")),\n)\n```\n\n---\n\n### Microsoft Entra authentication\n\nMicrosoft Entra authentication is only supported with Azure OpenAI resources. Complete the following steps:\n\n1. Include the [azure-identity](https://mvnrepository.com/artifact/com.azure/azure-identity) dependency in your project.\n\n1. Configure the `OpenAIClient` object as follows:\n\n    ```go\n    // import (\n    //    \"github.com/openai/openai-go/v3\"\n    //    \"github.com/openai/openai-go/v3/azure\"\n    //    \"github.com/openai/openai-go/v3/option\"\n    // )\n    \n    client := openai.NewClient(\n        option.WithBaseURL(\"https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/\"),\n        azure.WithTokenCredential(cred),\n    )\n    ```\n\n    > [!TIP]\n    > `DefaultAzureCredential` can be optimized for the environment in which your app runs. For more information, see [How to customize DefaultAzureCredential](/azure/developer/go/sdk/authentication/credential-chains#how-to-customize-defaultazurecredential).\n\n1. Assign the appropriate Azure role-based access control (RBAC) permissions. For more information, see [Azure role-based access control (RBAC)](/azure/ai-foundry/openai/how-to/role-based-access-control).\n\n    When running in Azure, assign roles to the managed identity used by the Azure host resource. When running in the local development environment, assign roles to the user running the app.\n\n:::zone-end\n\n## Specify the model\n\n:::zone pivot=\"python\"\n\nOpenAI uses the `model` keyword argument to specify what model to use. Azure OpenAI has the concept of unique model [deployments](/azure/ai-foundry/openai/how-to/create-resource?pivots=web-portal#deploy-a-model). When you use Azure OpenAI, `model` should refer to the underlying deployment name you chose when you deployed the model.\n\n> [!IMPORTANT]\n> Azure OpenAI and OpenAI handle model names differently in API calls. OpenAI only needs the model name. Azure OpenAI always needs the deployment name, even when you use the model parameter. You must use the deployment name instead of the model name when you call Azure OpenAI APIs. Our documentation often shows deployment names that match model names to show which model works with each API endpoint. Choose any naming convention for deployment names that works best for you.\n\n#### [OpenAI](#tab/openai)\n\n```python\nresponse = client.responses.create(   \n    model=\"gpt-4.1-nano\", \n    input=\"This is a test.\"\n)\n\nchat_completion = client.chat.completions.create(\n    model=\"gpt-4o\", \n    messages=\"<messages>\"\n)\n\nembedding = client.embeddings.create(\n    model=\"text-embedding-3-large\", \n    input=\"<input>\"\n)\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```python\nresponse = client.responses.create(   \n    model=\"gpt-4.1-nano\", # Replace with your model deployment name \n    input=\"This is a test.\"\n)\n\nchat_completion = client.chat.completions.create(\n    model=\"gpt-4o\", # model = \"deployment_name\".\n    messages=\"<messages>\"\n)\n\nembedding = client.embeddings.create(\n    model=\"text-embedding-3-large\", # model = \"deployment_name\".\n    input=\"<input>\"\n)\n```\n\n---\n\n:::zone-end\n:::zone pivot=\"dotnet\"\n\nOpenAI uses the `model` parameter to specify what model to use. Azure OpenAI has the concept of unique model [deployments](/azure/ai-foundry/openai/how-to/create-resource?pivots=web-portal#deploy-a-model). When you use Azure OpenAI, `model` should refer to the underlying deployment name you chose when you deployed the model.\n\n> [!IMPORTANT]\n> Azure OpenAI and OpenAI handle model names differently in API calls. OpenAI only needs the model name. Azure OpenAI always needs the deployment name, even when you use the model parameter. You must use the deployment name instead of the model name when you call Azure OpenAI APIs. Our documentation often shows deployment names that match model names to show which model works with each API endpoint. Choose any naming convention for deployment names that works best for you.\n\n#### [OpenAI](#tab/openai)\n\n```csharp\nstring modelName = \"gpt-4.1-nano\";\nOpenAIResponseClient response = client.GetOpenAIResponseClient(modelName);\n\nmodelName = \"gpt-4o\";\nChatClient chatCompletion = client.GetChatClient(modelName);\n\nmodelName = \"text-embedding-3-large\";\nEmbeddingClient embedding = client.GetEmbeddingClient(modelName);\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```csharp\nstring deploymentName = \"my-gpt-4.1-nano-deployment\";\nOpenAIResponseClient response = client.GetOpenAIResponseClient(deploymentName);\n\ndeploymentName = \"my-gpt-4o-deployment\";\nChatClient chatCompletion = client.GetChatClient(deploymentName);\n\ndeploymentName = \"my-text-embedding-3-large-deployment\";\nEmbeddingClient embedding = client.GetEmbeddingClient(deploymentName);\n```\n\n---\n\n:::zone-end\n\n:::zone pivot=\"javascript\"\n\nOpenAI uses the `model` keyword argument to specify what model to use. Azure OpenAI has the concept of unique model [deployments](/azure/ai-foundry/openai/how-to/create-resource?pivots=web-portal#deploy-a-model). When you use Azure OpenAI, `model` should refer to the underlying deployment name you chose when you deployed the model.\n\n> [!IMPORTANT]\n> Azure OpenAI and OpenAI handle model names differently in API calls. OpenAI only needs the model name. Azure OpenAI always needs the deployment name, even when you use the model parameter. You must use the deployment name instead of the model name when you call Azure OpenAI APIs. Our documentation often shows deployment names that match model names to show which model works with each API endpoint. Choose any naming convention for deployment names that works best for you.\n\n#### [OpenAI](#tab/openai)\n\n```javascript\nconst response = await client.responses.create({\n  model: \"gpt-4.1-nano\",\n  input: \"This is a test\",\n});\n\nconst chatCompletions = await client.chat.completions.create({\n  model: \"gpt-4o\",\n  messages: [\"<messages>\"],\n});\n\nconst embeddings = await client.embeddings.create({\n  model: \"text-embedding-3-large\",\n  input: \"<input>\",\n});\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```javascript\nconst response = await client.responses.create({\n  model: \"gpt-4.1-nano\", // Replace with your model deployment name \n  input: \"This is a test\",\n});\n\nconst chatCompletions = await client.chat.completions.create({\n  model: \"gpt-4o\", // Replace with your model deployment name \n  messages: [\"<messages>\"],\n});\n\nconst embeddings = await client.embeddings.create({\n  model: \"text-embedding-3-large\", // Replace with your model deployment name\n  input: \"<input>\",\n});\n```\n\n---\n:::zone-end\n\n:::zone pivot=\"java\"\n\nOpenAI uses the `model` keyword argument to specify what model to use. Azure OpenAI has the concept of unique model [deployments](/azure/ai-foundry/openai/how-to/create-resource?pivots=web-portal#deploy-a-model). When you use Azure OpenAI, `model` should refer to the underlying deployment name you chose when you deployed the model.\n\n> [!IMPORTANT]\n> Azure OpenAI and OpenAI handle model names differently in API calls. OpenAI only needs the model name. Azure OpenAI always needs the deployment name, even when you use the model parameter. You must use the deployment name instead of the model name when you call Azure OpenAI APIs. Our documentation often shows deployment names that match model names to show which model works with each API endpoint. Choose any naming convention for deployment names that works best for you.\n\n#### [OpenAI](#tab/openai)\n\n```java\nResponseCreateParams responseCreateParams = ResponseCreateParams.builder()\n        .input(\"This is a test\")\n        .model(ChatModel.GPT_4_1_NANO)\n        .build();\n\nResponse response = client.responses().create(responseCreateParams);\n\nChatCompletionCreateParams chatCompletionCreateParams = ChatCompletionCreateParams.builder()\n        .model(ChatModel.GPT_4O)\n        .addUserMessage(\"<message>\")\n        .build();\n\nChatCompletion chatCompletion = client.chat().completions().create(chatCompletionCreateParams);\n\nEmbeddingCreateParams embeddingCreateParams = EmbeddingCreateParams.builder()\n        .input(\"<input>\")\n        .model(EmbeddingModel.TEXT_EMBEDDING_3_LARGE)\n        .build();\n\nCreateEmbeddingResponse createEmbeddingResponse = client.embeddings().create(embeddingCreateParams);\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```java\nResponseCreateParams responseCreateParams = ResponseCreateParams.builder()\n        .input(\"This is a test\")\n        .model(ChatModel.GPT_4_1_NANO) // Replace with your model deployment name \n        .build();\n\nResponse response = client.responses().create(responseCreateParams);\n\nChatCompletionCreateParams chatCompletionCreateParams = ChatCompletionCreateParams.builder()\n        .model(ChatModel.GPT_4O) // Replace with your model deployment name\n        .addUserMessage(\"<message>\")\n        .build();\n\nChatCompletion chatCompletion = client.chat().completions().create(chatCompletionCreateParams);\n\nEmbeddingCreateParams embeddingCreateParams = EmbeddingCreateParams.builder()\n        .input(\"<input>\")\n        .model(EmbeddingModel.TEXT_EMBEDDING_3_LARGE) // Replace with your model deployment name\n        .build();\n\nCreateEmbeddingResponse createEmbeddingResponse = client.embeddings().create(embeddingCreateParams);\n```\n\n---\n\n:::zone-end\n\n:::zone pivot=\"golang\"\n\nOpenAI uses the `Model` keyword argument to specify what model to use. Azure OpenAI has the concept of unique model [deployments](/azure/ai-foundry/openai/how-to/create-resource?pivots=web-portal#deploy-a-model). When you use Azure OpenAI, `Model` should refer to the underlying deployment name you chose when you deployed the model.\n\n> [!IMPORTANT]\n> Azure OpenAI and OpenAI handle model names differently in API calls. OpenAI only needs the model name. Azure OpenAI always needs the deployment name, even when you use the model parameter. You must use the deployment name instead of the model name when you call Azure OpenAI APIs. Our documentation often shows deployment names that match model names to show which model works with each API endpoint. Choose any naming convention for deployment names that works best for you.\n\n#### [OpenAI](#tab/openai)\n\n```go\nresp, err := client.Responses.New(context.TODO(), responses.ResponseNewParams{\n    Model: \"gpt-4.1-nano\", \n    Input: responses.ResponseNewParamsInputUnion{\n        OfString: openai.String(\"This is a test.\"),\n    },\n})\n\nresp, err := client.Chat.Completions.New(context.TODO(), openai.ChatCompletionNewParams{\n    Model: \"gpt-4o\", \n    Messages: []openai.ChatCompletionMessageParamUnion{\n        // messages\n    },\n})\n\nresp, err := client.Embeddings.New(context.TODO(), openai.EmbeddingNewParams{\n    Model: \"text-embedding-3-large\", \n    Input: openai.EmbeddingNewParamsInputUnion{\n        OfString: openai.String(\"<input>\"),\n    },\n})\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```go\nresp, err := client.Responses.New(context.TODO(), responses.ResponseNewParams{\n    Model: \"gpt-4.1-nano\", // Replace with your model deployment name\n    Input: responses.ResponseNewParamsInputUnion{\n        OfString: openai.String(\"This is a test.\"),\n    },\n})\n\nresp, err := client.Chat.Completions.New(context.TODO(), openai.ChatCompletionNewParams{\n    Model: \"gpt-4o\", // Model = \"deployment_name\"\n    Messages: []openai.ChatCompletionMessageParamUnion{\n        // messages\n    },\n})\n\nresp, err := client.Embeddings.New(context.TODO(), openai.EmbeddingNewParams{\n    Model: \"text-embedding-3-large\", // Model = \"deployment_name\"\n    Input: openai.EmbeddingNewParamsInputUnion{\n        OfString: openai.String(\"<input>\"),\n    },\n})\n```\n\n---\n\n:::zone-end\n\n## Azure OpenAI embeddings multiple input support\n\nOpenAI and Azure OpenAI currently support input arrays up to 2,048 input items for `text-embedding-ada-002`. Both require the max input token limit per API request to remain under 8,191 for this model.\n\n:::zone pivot=\"python\"\n\n#### [OpenAI](#tab/openai)\n\n```python\ninputs = [\"A\", \"B\", \"C\"] \n\nembedding = client.embeddings.create(\n    input=inputs,\n    model=\"text-embedding-3-large\"\n)\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```python\ninputs = [\"A\", \"B\", \"C\"] #max array size=2048\n\nembedding = client.embeddings.create(\n    input=inputs,\n    model=\"my-text-embedding-3-large-deployment\" # This must match the custom deployment name you chose for your model.\n    # engine=\"text-embedding-ada-002\"\n)\n```\n\n---\n\n:::zone-end\n:::zone pivot=\"dotnet\"\n\n#### [OpenAI](#tab/openai)\n\n```csharp\nstring[] inputs = [ \"A\", \"B\", \"C\" ];\n\nEmbeddingClient embedding = client.GetEmbeddingClient(\n    model: \"text-embedding-3-large\"\n).GenerateEmbedding(\n    input: inputs\n);\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```csharp\nstring[] inputs = [ \"A\", \"B\", \"C\" ]; //max array size=2048\n\nEmbeddingClient embedding = client.GetEmbeddingClient(\n    model: \"my-text-embedding-3-large-deployment\" // This must match the custom deployment name you chose for your model.\n    // engine:\"text-embedding-ada-002\"\n).GenerateEmbedding(\n    input: inputs\n);\n```\n\n---\n\n:::zone-end\n\n:::zone pivot=\"javascript\"\n\n#### [OpenAI](#tab/openai)\n\n```javascript\nconst embeddings = await client.embeddings.create({\n    model: \"text-embedding-3-large\",\n    inputs: [\"A\", \"B\", \"C\"],\n})\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```javascript\nconst embeddings = await client.embeddings.create({\n    model: \"text-embedding-3-large\",\n    inputs: [\"A\", \"B\", \"C\"],\n})\n```\n\n---\n\n:::zone-end\n\n:::zone pivot=\"java\"\n\n#### [OpenAI](#tab/openai)\n\n```java\nEmbeddingCreateParams embeddingCreateParams = EmbeddingCreateParams.builder()\n        .inputOfArrayOfStrings(List.of(\"A\", \"B\", \"C\"))\n        .model(EmbeddingModel.TEXT_EMBEDDING_3_LARGE)\n        .build();\n\nCreateEmbeddingResponse createEmbeddingResponse = client.embeddings().create(embeddingCreateParams);\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```java\nEmbeddingCreateParams embeddingCreateParams = EmbeddingCreateParams.builder()\n        .inputOfArrayOfStrings(List.of(\"A\", \"B\", \"C\"))\n        .model(EmbeddingModel.TEXT_EMBEDDING_3_LARGE)\n        .build();\n\nCreateEmbeddingResponse createEmbeddingResponse = client.embeddings().create(embeddingCreateParams);\n```\n\n---\n\n:::zone-end\n\n:::zone pivot=\"golang\"\n\n#### [OpenAI](#tab/openai)\n\n```go\nresp, err := client.Embeddings.New(context.TODO(), openai.EmbeddingNewParams{\n    Model: \"text-embedding-3-large\",\n    Input: openai.EmbeddingNewParamsInputUnion{\n        OfArrayOfStrings: []string{\"A\", \"B\", \"C\"},\n    },\n})\n```\n\n#### [Azure OpenAI](#tab/azure-openai)\n\n```go\nresp, err := client.Embeddings.New(context.TODO(), openai.EmbeddingNewParams{\n    Model: \"text-embedding-3-large\",\n    Input: openai.EmbeddingNewParamsInputUnion{\n        OfArrayOfStrings: []string{\"A\", \"B\", \"C\"},\n    },\n})\n```\n\n---\n\n:::zone-end\n"
  },
  {
    "path": "articles/ai/how-to/use-reasoning-model-inference.md",
    "content": "---\ntitle: \"Develop reasoning apps with DeepSeek models on Microsoft Foundry using the OpenAI SDK\"\ndescription: \"Learn how to use reasoning models like DeepSeek in Azure OpenAI with the OpenAI SDK for Python.\"\nms.date: 01/30/2026\nms.topic: how-to \nms.subservice: intelligent-apps\nms.custom: devx-track-python, devx-track-python-ai\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As an AI app developer, I want to learn how to use reasoning models like DeepSeek in Azure OpenAI using the OpenAI SDK for Python.\n---\n# Develop reasoning apps with DeepSeek models on Microsoft Foundry using the OpenAI SDK\n\nLearn how to use reasoning models like DeepSeek in Azure OpenAI with the OpenAI SDK for Python.\n\nThis article shows several best practices for integrating reasoning models:\n\n- **Keyless authentication**: Use managed identities or developer credentials instead of API keys.\n- **Asynchronous operations**: Use async features for better performance.\n- **Streaming responses**: Provide immediate feedback to users.\n- **Reasoning separation**: Separate reasoning steps from the final output.\n- **Resource management**: Clean up resources after use.\n\n## The DeepSeek building block\n\nExplore the [DeepSeek building block](https://github.com/Azure-Samples/deepseek-python) sample. It shows how to use the OpenAI client library to call the DeepSeek-R1 model and generate responses to user messages.\n\n## Architectural overview\n\nThe following diagram shows the simple architecture of the sample app:\n:::image type=\"content\" source=\"../media/use-reasoning-model-inference/simple-architecture-diagram.png\" lightbox=\"../media/use-reasoning-model-inference/simple-architecture-diagram.png\" alt-text=\"Diagram showing architecture from client to backend app.\":::\n\nThe chat app runs as an Azure Container App. The app uses managed identity with Microsoft Entra ID to authenticate with Azure OpenAI instead of an API key. The app uses Azure OpenAI to generate responses to user messages.\n\nThe app relies on these services and components:\n\n- A Python [Quart](https://quart.palletsprojects.com/en/latest/) app that uses the [OpenAI client library](https://pypi.org/project/openai/) package to generate responses to user messages\n- A basic HTML/JS frontend that streams responses from the backend using [JSON Lines](http://jsonlines.org/) over a [ReadableStream](https://developer.mozilla.org/docs/Web/API/ReadableStream)\n- [Bicep files](/azure/azure-resource-manager/bicep/) for provisioning Azure resources, including Foundry Tools, Azure Container Apps, Azure Container Registry, Azure Log Analytics, and RBAC roles.\n\n## Cost\n\nTo keep costs low, this sample uses basic or consumption pricing tiers for most resources. Adjust the tier as needed, and delete resources when you're done to avoid charges.\n\nLearn more about [cost in the sample repo](https://github.com/Azure-Samples/deepseek-python#costs).\n\n## Prerequisites\n\nA [development container](https://containers.dev/) includes all the dependencies you need for this article. You can run it in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\nTo follow this article, make sure you meet these prerequisites:\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n- An Azure subscription – [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- Azure account permissions – Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [Role Based Access Control Administrator](/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview), [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator), or [Owner](/azure/role-based-access-control/built-in-roles#owner). If you don't have subscription-level permissions, you must be granted [RBAC](/azure/role-based-access-control/built-in-roles#role-based-access-control-administrator-preview) for an existing resource group and deploy to that group.\n  - Your Azure account also needs `Microsoft.Resources/deployments/write` permissions at the subscription level.\n- GitHub account\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n- An Azure subscription – [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- Azure account permissions – Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner)\n- [Azure Developer CLI](/azure/developer/azure-developer-cli)\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/) – make sure Docker Desktop is running\n- [Visual Studio Code](https://code.visualstudio.com/)\n- [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n---\n\n## Open development environment\n\nFollow these steps to set up a preconfigured development environment with all the required dependencies.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the interface. Use GitHub Codespaces for the simplest setup, as it comes with the necessary tools and dependencies preinstalled for this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\nUse the following steps to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/deepseek-python`](https://github.com/Azure-Samples/deepseek-python) GitHub repository.\n\n1. Right-click the following button and select _Open link in new window_. This action lets you have the development environment and the documentation open side by side.\n\n    [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/deepseek-python)\n\n1. On the **Create codespace** page, review and then select **Create new codespace**\n\n1. Wait for the codespace to start. It might take a few minutes.\n\n1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\nYou do the rest of the tasks in this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code needs [Docker](https://docs.docker.com/) installed on your computer. The extension uses Docker to host the development container locally with the necessary tools and dependencies preinstalled for this article.\n\n1. Create a new local directory on your computer for the project.\n\n    ```shell\n    mkdir my-chat-app\n    ```\n\n1. Navigate to the directory you created.\n\n    ```shell\n    cd my-chat-app\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```shell\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```azdeveloper\n    azd init -t deepseek-python\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. You do the rest of the exercises in this development container.\n\n---\n\n## Deploy and run\n\nThe sample repository has all the code and configuration files you need to deploy the chat app to Azure. Follow these steps to deploy the chat app to Azure.\n\n### Deploy chat app to Azure\n\n> [!IMPORTANT]\n> Azure resources created in this section start costing money immediately. These resources might still incur costs even if you stop the command before it finishes.\n\n1. Run the following Azure Developer CLI command for Azure resource provisioning and source code deployment:\n\n    ```azdeveloper\n    azd up\n    ```\n\n1. Use the following table to answer the prompts:\n\n    |Prompt|Answer|\n    |--|--|\n    |Environment name|Keep it short and lowercase. Add your name or alias. For example, `chat-app`. It's used as part of the resource group name.|\n    |Subscription|Select the subscription to create the resources in. |\n    |Location (for hosting)|Select a location near you from the list.|\n    |Location for the DeepSeek model|Select a location near you from the list. If the same location is available as your first location, select that.|\n\n1. Wait for the app to deploy. Deployment usually takes 5 to 10 minutes.\n\n### Use chat app to ask questions to the large language model\n\n1. After deployment, the terminal shows a URL.\n\n1. Select the URL labeled `Deploying service web` to open the chat app in your browser.\n\n    :::image type=\"content\" source=\"../media/use-reasoning-model-inference/screenshot-chat-image.png\" lightbox=\"../media/use-reasoning-model-inference/screenshot-chat-image.png\" alt-text=\"Screenshot of chat app in browser with a question in the chat text box along with the response.\":::\n\n1. In the browser, ask a question about the uploaded image such as \"Who painted the Mona Lisa?\"\n\n1. Azure OpenAI provides the answer through model inference, and the result appears in the app.\n\n## Exploring the sample code\n\nOpenAI and Azure OpenAI Service both use the [common Python client library](https://github.com/openai/openai-python), but you need to make a few small code changes for Azure OpenAI endpoints. This sample uses a DeepSeek-R1 reasoning model to generate responses in a simple chat app.\n\n### Setup and authentication\n\nThe `src\\quartapp\\chat.py` file starts with setup and configuring keyless authentication.\n\n#### Infrastructure setup\n\nThe script uses **Quart**, an async web framework, to create a `Blueprint` named `chat`. This `Blueprint` defines the app's routes and manages its lifecycle hooks.\n\n```python\nbp = Blueprint(\"chat\", __name__, template_folder=\"templates\", static_folder=\"static\")\n```\n\nThe `Blueprint` defines the `/` and `/chat/stream` routes and the `@bp.before_app_serving` and `@bp.after_app_serving` lifecycle hooks.\n\n#### Initialization with keyless authentication\n\nThe following code snippet handles authentication.\n\n> [!NOTE]\n> The `@bp.before_app_serving` hook initializes the OpenAI client and handles **authentication**. This approach is critical for securely accessing Azure-hosted DeepSeek-R1 models.\n\nThe authentication strategy adapts to the environment:\n\n- **In production**: Uses **Managed Identity Credential** with an Azure client ID to avoid storing sensitive keys. This method is secure and scalable for cloud-native apps.\n- **In development**: Uses **Azure Developer CLI Credential** with an Azure tenant ID to simplify local testing by using the developer's Azure CLI sign-in session.\n\n```python\n@bp.before_app_serving\nasync def configure_openai():\n    if os.getenv(\"RUNNING_IN_PRODUCTION\"):\n        client_id = os.environ[\"AZURE_CLIENT_ID\"]\n        bp.azure_credential = ManagedIdentityCredential(client_id=client_id)\n    else:\n        tenant_id = os.environ[\"AZURE_TENANT_ID\"]\n        bp.azure_credential = AzureDeveloperCliCredential(tenant_id=tenant_id)\n```\n\nThis keyless authentication approach provides:\n\n- **Better security**: No API keys stored in code or environment variables.\n- **Easier management**: No need to rotate keys or manage secrets.\n- **Smooth transitions**: The same code works in both development and production.\n\n#### Token provider setup\n\nIn the following code snippet, the token provider creates a bearer token to authenticate requests to Azure OpenAI services. It automatically generates and refreshes these tokens using the configured credential.\n\n  ```python\n  bp.openai_token_provider = get_bearer_token_provider(\n      bp.azure_credential, \"https://cognitiveservices.azure.com/.default\"\n  )\n  ```\n\n#### Azure OpenAI client configuration\n\nThere are two possible clients, `AzureOpenAI` and `AsyncAzureOpenAI`. The following code snippet uses `AsyncAzureOpenAI` along with the asynchronous `Quart` framework for better performance with concurrent users:\n\n```python\nbp.openai_client = AsyncAzureOpenAI(\n    azure_endpoint=os.environ[\"AZURE_INFERENCE_ENDPOINT\"],\n    azure_ad_token_provider=openai_token_provider,\n    api_version=\"2024-10-21\",\n```\n\n- **base_url**: Points to the Azure-hosted DeepSeek inference endpoint\n- **api_key**: Uses a dynamically generated API key from the token provider.\n- **api-version**: Specifies the API version supporting DeepSeek models\n\n#### Model deployment name configuration\n\nThe following code snippet sets the DeepSeek model version by getting the deployment name from your environment configuration. It assigns the name to the `bp.model_deployment_name` variable, making it accessible throughout the app. This approach lets you change the model deployment without updating the code.\n\n```python\nbp.model_deployment_name = os.getenv(\"AZURE_DEEPSEEK_DEPLOYMENT\")\n```\n\n> [!NOTE]\n> In Azure OpenAI, you don't directly use model names like `gpt-4o` or `deepseek-r1`. Instead, you create **deployments**, which are named instances of models in your Azure OpenAI resource. This approach offers the following benefits:\n> - **Abstraction**: Keeps deployment names out of the code by using environment variables.\n> - **Flexibility**: Lets you switch between different DeepSeek deployments without changing the code.\n> - **Environment-specific configuration**: Allows using different deployments for development, testing, and production.\n> - **Resource management**: Each Azure deployment has its own quota, throttling, and monitoring.\n\n### Lifecycle management\n\nThe following code snippet prevents resource leaks by closing the asynchronous Azure OpenAI client when the application shuts down. The `@bp.after_app_serving` hook ensures proper cleanup of resources.\n\n```python\n@bp.after_app_serving\nasync def shutdown_openai():\n    await bp.openai_client.close()\n```\n\n### Chat handler streaming function\n\nThe `chat_handler()` function manages user interactions with the `DeepSeek-R1` model through the `chat/stream` route. It streams responses back to the client in real time and processes them. The function extracts messages from the JSON payload.\n\n#### Streaming implementation\n\n1. The `response_stream` function starts by accepting messages from the client.\n\n   - request_messages: The route expects a JSON payload containing user messages.\n\n   ```python\n   @bp.post(\"/chat/stream\")\n   async def chat_handler():\n      request_messages = (await request.get_json())[\"messages\"]\n   ```\n\n1. Next, the function streams responses from the OpenAI API. It combines system messages like \"You're a helpful assistant\" with user-provided messages.\n\n      ```python\n      @stream_with_context\n      async def response_stream():\n          all_messages = [\n              {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n          ] + request_messages\n      ```\n\n1. Next, the function creates a streaming chat completion request.\n\n    The `chat.completions.create` method sends the messages to the `DeepSeek-R1` model. The `stream=True` parameter enables real-time response streaming.\n\n    ```python\n      chat_coroutine = bp.openai_client.chat.completions.create(\n          model=bp.openai_model,\n          messages=all_messages,\n          stream=True,\n      )\n    ```\n\n1. The following code snippet processes streaming responses from the `DeepSeek-R1` model and handles errors. It iterates through updates, checks for valid choices, and sends each response chunk as JSON Lines. If an error occurs, it logs the error and sends a JSON error message to the client while continuing the stream.\n\n    ```python\n    try:\n        async for update in await chat_coroutine:\n            if update.choices:\n                yield update.choices[0].model_dump_json() + \"\\n\"\n        except Exception as e:\n            current_app.logger.error(e)\n            yield json.dumps({\"error\": str(e)}, ensure_ascii=False) + \"\\n\"\n    \n    return Response(response_stream())\n    ```\n\n### Reasoning content handling\n\nWhile traditional language models only provide final outputs, reasoning models like `DeepSeek-R1` show their intermediate reasoning steps. These steps make them useful for:\n\n- Solving complex problems\n- Performing mathematical calculations\n- Handling multi-step logical reasoning\n- Making transparent decisions\n\nThe `submit` event handler in `index.html` processes the streaming response on the frontend. This approach lets you access and display the model's reasoning steps alongside the final output.\n\nThe frontend uses a `ReadableStream` to process streaming responses from the backend. It separates reasoning content from regular content, showing reasoning in an expandable section, and the final answer in the main chat area.\n\n#### Step-by-step breakdown\n\n1. Initiate streaming request\n\n   This code snippet creates a connection between the JavaScript frontend and the Python backend, enabling DeepSeek-R1's Azure OpenAI integration with keyless authentication.\n\n    ```javascript\n    const response = await fetch(\"/chat/stream\", {\n        method: \"POST\",\n        headers: {\"Content-Type\": \"application/json\"},\n        body: JSON.stringify({messages: messages})\n    });\n    ```\n\n1. Initialize variables\n\n   The following code snippet initializes variables to store the answer and thoughts separately. This separation helps handle reasoning content effectively.\n\n   ```javascript\n   let answer = \"\";\n   let thoughts = \"\";    \n   ```\n\n1. Process each update\n\n   The following code snippet asynchronously iterates through chunks of the model's response.\n\n   ```javascript\n   for await (const event of readNDJSONStream(response.body)) {\n   ```\n\n1. Detect and route content type\n\n   The script checks if the event contains a `delta` field. If it does, it processes the content based on whether it's reasoning content or regular content.\n\n   ```javascript\n   if (!event.delta) {\n        continue;\n   }\n   if (event.delta.reasoning_content) {\n        thoughts += event.delta.reasoning_content;\n        if (thoughts.trim().length > 0) {\n            // Only show thoughts if they are more than just whitespace\n            messageDiv.querySelector(\".loading-bar\").style.display = \"none\";\n            messageDiv.querySelector(\".thoughts\").style.display = \"block\";\n            messageDiv.querySelector(\".thoughts-content\").innerHTML = converter.makeHtml(thoughts);\n        }\n    } else if (event.delta.content) {\n        messageDiv.querySelector(\".loading-bar\").style.display = \"none\";\n        answer += event.delta.content;\n        messageDiv.querySelector(\".answer-content\").innerHTML = converter.makeHtml(answer);\n    }\n   ```\n\n   - If the content type is `reasoning_content`, the content is added to `thoughts` and displayed in the `.thoughts-content` section.\n   - If the content type is `content`, the content is added to `answer` and displayed in the `.answer-content` section.\n   - The `.loading-bar` is hidden once content starts streaming, and the `.thoughts` section is displayed if there are any thoughts.\n  \n1. Error handling:\n\n   Errors are logged in the backend and returned to the client in JSON format.\n\n    ```python\n    except Exception as e:\n        current_app.logger.error(e)\n        yield json.dumps({\"error\": str(e)}, ensure_ascii=False) + \"\\n\"\n    ```\n  \n    This frontend code snippet displays the error message in the chat interface.\n\n    ```javascript\n    messageDiv.scrollIntoView();\n    if (event.error) {\n        messageDiv.innerHTML = \"Error: \" + event.error;\n    }\n    ```\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDelete the GitHub Codespaces environment to maximize your free per-core hours.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's free storage and core hours, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Find your active Codespaces created from the [`Azure-Samples//deepseek-python`](https://github.com/Azure-Samples/deepseek-python) GitHub repository.\n\n1. Open the context menu for the codespace and select **Delete**.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nStop the running development container and return to Visual Studio Code in your local workspace.\n\nOpen the **Command Palette**, search for **Dev Containers**, and select **Dev Containers: Reopen Folder Locally**.\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. Free up space on your local machine by deleting the container instance, image, and volumes from Docker.\n\n---\n\n## Get help\n\nLog your issue to the repository's [Issues](https://github.com/Azure-Samples/deepseek-python/issues).\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Get started with DeepSeek-R1 reasoning model in Azure AI model inference](/azure/ai-foundry/model-inference/tutorials/get-started-deepseek-r1?tabs=python)"
  },
  {
    "path": "articles/ai/includes/authenication-guidance-note.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 11/06/2024\nms.service: azure\n---\n> [!CAUTION]\n> Microsoft recommends that you use the most secure authentication flow available. The authentication flow described in this procedure requires a very high degree of trust in the application, and carries risks that are not present in other flows. You should only use this flow when other more secure flows, such as managed identities, aren't viable.\n"
  },
  {
    "path": "articles/ai/includes/azure-ai-for-developers-dotnet.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 05/16/2025\nms.author: rotabor\nauthor: bobtabor-msft\nms.service: azure\n---\n## Resources for Azure OpenAI in Microsoft Foundry Models\n\nAzure OpenAI in Microsoft Foundry Models provides REST API access to the powerful language models available in OpenAI. Azure OpenAI helps you adapt these models to accomplish specific tasks, such as content generation, summarization, image understanding, semantic search, and natural language to code translation. Access Azure OpenAI by using the REST APIs, the OpenAI SDK for Python, or via the [Microsoft Foundry portal](/azure/ai-studio/azure-openai-in-ai-studio).\n\n### Libraries\n\n|Link|Description|\n|---|---|\n|[OpenAI SDK for .NET](https://aka.ms/oai/net/sdk)|The OpenAI .NET library provides convenient access to the OpenAI REST API from .NET applications. It can connect to Azure OpenAI resources or to the non-Azure OpenAI inference endpoint, making it a great choice for even non-Azure OpenAI development.|\n|[OpenAI SDK Releases](https://azure.github.io/azure-sdk/?search=openai)|Links to all OpenAI SDK library packages, including links for .NET, Java, JavaScript and Go.|\n|[OpenAI NuGet package](https://www.nuget.org/packages/OpenAI)|The NuGet version of the  OpenAI client library for .NET.|\n\n### Samples\n\n|Link|Description|\n|---|---|\n|[.NET OpenAI MCP Agent](https://github.com/Azure-Samples/openai-mcp-agent-dotnet)|This sample is an MCP agent app written in .NET, using Azure OpenAI, with a remote MCP server written in TypeScript.|\n|[AI Travel Agents](https://github.com/Azure-Samples/azure-ai-travel-agents)|The **AI Travel Agents** is a robust enterprise application that leverages multiple AI agents to enhance travel agency operations. The application demonstrates how six AI agents collaborate to assist employees in handling customer queries, providing destination recommendations, and planning itineraries.|\n|[deepseek-dotnet](https://github.com/Azure-Samples/deepseek-dotnet)|This is a sample chat demo that showcases the capabilities of DeepSeek-R1.|\n|[Completions](https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/openai/Azure.AI.OpenAI/tests/Samples)|A collection of 10 samples that demonstrate how to use the Azure OpenAI client library for .NET to chat, stream replies, use your own data, transcribe/translate audio, generate images, etc.|\n|[OpenAI with Microsoft Entra ID Role based access control](/azure/ai-services/authentication?tabs=powershell#authenticate-with-azure-active-directory)|A look at authentication using Microsoft Entra ID.|\n|[OpenAI with Managed Identities](/azure/ai-services/openai/how-to/managed-identity)|An article with more complex security scenarios that require Azure role-based access control (Azure RBAC). This document covers how to authenticate to your OpenAI resource using Microsoft Entra ID.|\n|[More samples](https://github.com/Azure-Samples/openai-dotnet-samples/blob/main/README.md)|A collection of OpenAI samples written in .NET.|\n\n### Documentation\n\n|Link|Description|\n|---|---|\n|[Azure OpenAI Service Documentation](/azure/ai-services/openai/)|The hub page for Azure OpenAI Service documentation.|\n|[Overview of the .NET + AI ecosystem](/dotnet/ai/dotnet-ai-ecosystem)|Summary of the services and tools you might need to use in your applications, with links to learn more about each of them.|\n|[Switch from OpenAI to Azure OpenAI](/azure/developer/ai/how-to/switching-endpoints?tabs=openai&pivots=dotnet)|A guidance article on the small changes you need to make to your code, so you can swap back and forth between OpenAI and the Azure OpenAI Service.|\n[Microsoft Foundry Quickstart](/azure/ai-foundry/quickstarts/get-started-code?view=foundry&preserve-view=true&tabs=csharp)|The Microsoft Foundry SDK is available in multiple languages, including Python, Java, TypeScript, and C#.|\n|[Build an AI chat app with .NET](/dotnet/ai/quickstarts/build-chat-app?pivots=openai)|Create a conversational .NET console chat app using an OpenAI or Azure OpenAI model. |\n|[Connect to and prompt an AI model](/dotnet/ai/quickstarts/prompt-model?pivots=openai)|Create a .NET console chat app to connect to and prompt an OpenAI or Azure OpenAI model.|\n|[Build a .NET AI vector search app](/dotnet/ai/quickstarts/quickstart-ai-chat-with-data)|Create a .NET console app to perform semantic search on a vector store to find relevant results for the user's query.|\n|[Invoke .NET functions using an AI model](/dotnet/ai/quickstarts/use-function-calling?pivots=openai)|Create a .NET console AI chat app that connects to an AI model with local function calling enabled.|\n|[Generate images using OpenAI.Images.ImageClient](/dotnet/ai/quickstarts/generate-images?pivots=openai)|Use the OpenAI DALL-E AI model. to generate an image.|\n\n## Resources for other Foundry Tools\n\nIn addition to Azure OpenAI Service, there are many other Foundry Tools that help developers and organizations rapidly create intelligent, market-ready, and responsible applications with out-of-the-box and prebuilt customizable APIs and models. Example applications include natural language processing for conversations, search, monitoring, translation, speech, vision, and decision-making.\n\n### Samples\n\n|Link|Description|\n|---|---|\n|[Integrate Azure Speech in Foundry Tools into your apps with Speech SDK Samples](https://github.com/Azure-Samples/cognitive-services-speech-sdk)|A repo of samples for the Speech SDK. Links to samples for speech recognition, translation, speech synthesis, and more.|\n|[Azure Document Intelligence in Foundry Tools SDK](/azure/applied-ai-services/form-recognizer/sdk-preview)|Document Intelligence (formerly Form Recognizer) is a cloud service that uses machine learning to analyze text and structured data from documents. The Document Intelligence software development kit (SDK) is a set of libraries and tools that enable you to easily integrate Document Intelligence models and capabilities into your applications.|\n|[Extract structured data from forms, receipts, invoices, and cards using Form Recognizer in .NET](https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/formrecognizer/Azure.AI.FormRecognizer/samples/README.md#common-scenarios-samples-for-client-library-version-400)|A repo of samples for the Azure.AI.FormRecognizer client library.|\n|[Extract, classify, and understand text within documents using Text Analytics in .NET](https://aka.ms/azai/net/ta)|The client Library for Text Analytics. This is part of the [Azure Language in Foundry Tools](/azure/ai-services/language-service) service, which provides Natural Language Processing (NLP) features for understanding and analyzing text.|\n|[Document Translation in .NET](https://aka.ms/azai/net/translate/doc)|A quickstart article that details how to use Document Translation to translate a source document into a target language while preserving structure and text formatting.|\n|[Question Answering in .NET](https://aka.ms/azai/net/qna)|A quickstart article to get an answer (and confidence score) from a body of text that you send along with your question.|\n|[Conversational Language Understanding in .NET](https://aka.ms/azai/net/convo)|The client library for Conversational Language Understanding (CLU), a cloud-based conversational AI service, which can extract intents and entities in conversations and acts like an orchestrator to select the best candidate to analyze conversations to get best response from apps like Qna, Luis, and Conversation App.|\n|[Analyze images](/azure/ai-services/computer-vision/sdk/overview-sdk)|Sample code and setup documents for the Microsoft Azure AI Image Analysis SDK|\n\n\n### Documentation\n\n|AI service|Description|API reference|Quickstart|\n|---|---|---|---|\n|[Content Safety in Foundry Control Plane](/azure/ai-services/content-safety/)|A Foundry tool that detects unwanted content.|[Content Safety API reference](/dotnet/api/overview/azure/ai.contentsafety-readme?view=azure-dotnet&preserve-view=true)|[Quickstart](/azure/ai-services/content-safety/quickstart-text?tabs=visual-studio%2Cwindows&pivots=programming-language-csharp)|\n|[Document Intelligence](/azure/ai-services/document-intelligence/)|Turn documents into intelligent data-driven solutions.|[Document Intelligence API reference](/dotnet/api/overview/azure/ai.documentintelligence-readme)|[Quickstart](/azure/ai-services/document-intelligence/quickstarts/get-started-sdks-rest-api?view=doc-intel-4.0.0&pivots=programming-language-csharp&preserve-view=true)|\n|[Language](/azure/ai-services/language-service/)|Build apps with industry-leading natural language understanding capabilities.|[Language API reference](/dotnet/api/overview/azure/ai.textanalytics-readme?view=azure-dotnet&preserve-view=true)|[Quickstart](/azure/ai-services/language-service/text-analytics-for-health/quickstart?tabs=windows&pivots=programming-language-csharp)|\n|[Azure AI Search](/azure/search/)|Bring AI-powered cloud search to your applications.|[Azure AI Search API reference](/dotnet/api/overview/azure/search?view=azure-dotnet&preserve-view=true)|[Quickstart](/azure/search/search-get-started-text?tabs=dotnet&preserve-view=true)|\n|[Speech](/azure/ai-services/speech-service/)|Speech to text, text to speech, translation, and speaker recognition.|[Speech API reference](/dotnet/api/overview/azure/cognitiveservices/speech?view=azure-dotnet&preserve-view=true)|[Quickstart](/azure/ai-services/speech-service/get-started-speech-to-text?tabs=windows%2Cterminal&pivots=programming-language-csharp)|\n|[Azure Translator in Foundry Tools](/azure/ai-services/translator/)|Use AI-powered translation to translate more than 100 in-use, at-risk and endangered languages and dialects.|[Translation API reference](/dotnet/api/overview/azure/ai.translation.text-readme?view=azure-dotnet-preview&preserve-view=true)|[Quickstart](/azure/ai-services/translator/quickstart-text-sdk?pivots=programming-language-csharp&branch=main)|\n|[Azure Vision in Foundry Tools](/azure/ai-services/computer-vision/)|Analyze content in images and videos.|[Vision API reference](/dotnet/api/overview/azure/ai.vision.imageanalysis-readme)| [Quickstart](/azure/ai-services/computer-vision/quickstarts-sdk/image-analysis-client-library?tabs=windows%2Cvisual-studio&pivots=programming-language-csharp&branch=main)|\n\n## Training\n\n|Link|Description|\n|---|---|\n|[Generative AI for Beginners Workshop](https://github.com/microsoft/generative-ai-for-beginners/tree/main)|Learn the fundamentals of building Generative AI apps with our 18-lesson comprehensive course by Microsoft Cloud Advocates.|\n|[AI Agents for Beginners Workshop](https://github.com/microsoft/ai-agents-for-beginners)|Learn the fundamentals of building Generative AI agents with our 10-lesson comprehensive course by Microsoft Cloud Advocates.|\n|[Get started with Foundry Tools](/training/paths/get-started-azure-ai/)|Foundry Tools is a collection of services that are building blocks of AI functionality you can integrate into your applications. In this learning path, you'll learn how to provision, secure, monitor, and deploy Azure AI Services resources and use them to build intelligent solutions.|\n|[Microsoft Azure AI Fundamentals: Generative AI](/training/paths/introduction-generative-ai/)|Training path to help you understand how large language models form the foundation of generative AI: how Azure OpenAI Service provides access to the latest generative AI technology, how prompts and responses can be fine-tuned and how Microsoft's responsible AI principles drive ethical AI advancements.|\n|[Develop Generative AI solutions with Azure OpenAI Service](/training/paths/develop-ai-solutions-azure-openai/)|Azure OpenAI Service provides access to OpenAI's powerful large language models such as ChatGPT, GPT, Codex, and Embeddings models. This learning path teaches developers how to generate code, images, and text using the Azure OpenAI SDK and other Azure services.|\n\n## AI app templates\n\nAI app templates provide you with well-maintained, easy to deploy reference implementations that provide a high-quality starting point for your AI apps.\n\nThere are two categories of AI app templates, **building blocks** and **end-to-end solutions**. Building blocks are smaller-scale samples that focus on specific scenarios and tasks. End-to-end solutions are comprehensive reference samples including documentation, source code, and deployment to allow you to take and extend for your own purposes.\n\nTo review a list of key templates available for each programming language, see [AI app templates](/azure/developer/ai/intelligent-app-templates). To browse all available templates, see the AI app templates on the [AI App Template gallery](https://azure.github.io/ai-app-templates?tags=azureopenai&tags=dotnetCsharp).\n"
  },
  {
    "path": "articles/ai/includes/azure-ai-for-developers-go.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.author: rotabor\nauthor: bobtabor-msft\nms.service: azure\n---\n## Resources for Azure OpenAI in Microsoft Foundry Models\n\nAzure OpenAI in Microsoft Foundry Models provides REST API access to OpenAI's powerful language models. These models can be easily adapted to your specific task including but not limited to content generation, summarization, image understanding, semantic search, and natural language to code translation. Users can access the service through REST APIs, the OpenAI Node API Library, or via the [Microsoft Foundry portal](/azure/ai-studio/azure-openai-in-ai-studio).\n\n|Link|Description|\n|---|---|\n|[OpenAI SDK for Go](https://github.com/openai/openai-go)|The GitHub source version of the OpenAI SDK for Go.|\n|[Switch from OpenAI to Azure OpenAI](/azure/developer/ai/how-to/switching-endpoints?tabs=openai&pivots=pivots=golang)|Article with guidance on the small changes you need to make to your code in order to swap back and forth between OpenAI and the Azure OpenAI Service.|\n|[Package (pkg.go.dev)](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai)|The Go package version of Azure OpenAI client module for Go.|\n|[ChatCompletions](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai#example-package-GetChatCompletions)|A simple example demonstrating how to implement completions.|\n|[ChatCompletions using Tools](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai#example-package-GetChatCompletions_usingTools)|A simple example demonstrating how to implement completions using Functions.|\n|[Streaming Chat Completions](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai#example-package-ChatCompletionStream)|A simple example demonstrating how to implement streaming completions.|\n|[Image generation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai#example-package-CreateImage)|A simple example of implementing image generation.|\n|[Embeddings](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai#example-package-Embeddings)|A simple example demonstrating how to create embeddings.|\n|[Other examples](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai#pkg-examples)|The Go package version of documentation for the OpenAI client module for Go.|\n|[More guidance](/azure/ai-services/openai/)|The hub page for Azure OpenAI Service documentation.|\n\n## Secure your Azure AI resources\n\n|Link|Description|\n|---|---|\n|[OpenAI with Microsoft Entra ID Role based access control](/azure/cognitive-services/authentication?tabs=powershell#authenticate-with-azure-active-directory)|A look at authentication using Microsoft Entra ID.|\n|[OpenAI with Managed Identities](/azure/cognitive-services/openai/how-to/managed-identity)|An article detailing more complex security scenarios that require Azure role-based access control (Azure RBAC). This document covers how to authenticate to your OpenAI resource using Microsoft Entra ID.|\n\n## Speech/Vision\n\n|Link|Description|\n|---|---|\n|[Captioning and Call Center Transcription in Go](https://github.com/Azure-Samples/cognitive-services-speech-sdk/tree/master/scenarios)|A repo containing samples for captions and transcriptions in a call center scenario.|\n|[Integrate Speech into your apps with Speech SDK for Go](https://github.com/Microsoft/cognitive-services-speech-sdk-go)|The source for the Azure Cognitive Services Speech SDK.|\n\n## Language\n\n|Link|Description|\n|---|---|\n|[Extract, classify, and understand text within documents using Text Analytics in Go](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/services/cognitiveservices/v2.0/textanalytics)|The client library for Text Analytics, which is part of the Azure Cognitive Service for Language, a cloud-based service that provides Natural Language Processing (NLP) features for understanding and analyzing text.|\n|[Document Translation in Go](/azure/ai-services/translator/document-translation/quickstarts/document-translation-rest-api?pivots=programming-language-go)|A quickstart article showing how to use Document Translation to translate a source document into a target language while preserving structure and text formatting.|\n"
  },
  {
    "path": "articles/ai/includes/azure-ai-for-developers-java.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.author: rotabor\nauthor: bobtabor-msft\nms.service: azure\n---\n## Resources for Azure OpenAI in Microsoft Foundry Models\n\nAzure OpenAI in Microsoft Foundry Models provides REST API access to OpenAI's powerful language models. These models can be easily adapted to your specific task including but not limited to content generation, summarization, image understanding, semantic search, and natural language to code translation. Users can access the service through REST APIs, the OpenAI Node API Library, or via the [Microsoft Foundry portal](/azure/ai-studio/azure-openai-in-ai-studio).\n\n### Libraries and samples\n\n|Link|Description|\n|---|---|\n|[**langchain4j-azure-open-ai**](https://github.com/langchain4j/langchain4j/tree/main/langchain4j-azure-open-ai)|[Releases](https://central.sonatype.com/artifact/dev.langchain4j/langchain4j-azure-open-ai/versions) [Maven package](https://central.sonatype.com/artifact/dev.langchain4j/langchain4j-azure-open-ai)|\n|[**langchain4j-azure-ai-search**](https://github.com/langchain4j/langchain4j/tree/main/langchain4j-azure-ai-search)|[Releases](https://central.sonatype.com/artifact/dev.langchain4j/langchain4j-azure-ai-search/versions) [Maven](https://central.sonatype.com/artifact/dev.langchain4j/langchain4j-azure-ai-search)|\n|**langchain4j-document-loader-azure-storage-blob**|[Releases](https://central.sonatype.com/artifact/dev.langchain4j/langchain4j-document-loader-azure-storage-blob/versions) [Maven](https://central.sonatype.com/artifact/dev.langchain4j/langchain4j-document-loader-azure-storage-blob/overview)|\n|[More Samples](https://aka.ms/oai/java/samples)|The Azure OpenAI service samples are a set of self-contained Java programs that demonstrate interacting with Azure OpenAI service using the client library. Each sample focuses on a specific scenario and can be executed independently.|\n\n### Documentation\n\n|Link|Description|\n|---|---|\n|[Azure OpenAI Service Documentation](/azure/ai-services/openai/)|The hub page for Azure OpenAI Service documentation.|\n|[Quickstart: Get started generating text using Azure OpenAI Service](/azure/ai-services/openai/quickstart?pivots=programming-language-java)|A quick set of instructions to set up the services you need and code you must write to prompt a model using Java.|\n|[Work with chat completions models using Azure OpenAI in Microsoft Foundry Models](/azure/ai-foundry/openai/how-to/chatgpt?tabs=python-secure)|A quick set of instructions to set up the services you need and code you must write to prompt a model using Java.|\n|[Microsoft Foundry Quickstart](/azure/ai-foundry/quickstarts/get-started-code?view=foundry&preserve-view=true&tabs=java)|The Microsoft Foundry SDK is available in multiple languages, including Python, Java, TypeScript, and C#.|\n|[Switch from OpenAI to Azure OpenAI](/azure/developer/ai/how-to/switching-endpoints?tabs=openai&pivots=java)|Article with guidance on the small changes you need to make to your code in order to swap back and forth between OpenAI and the Azure OpenAI Service.|\n|[OpenAI with Microsoft Entra ID Role based access control](/azure/ai-services/authentication?tabs=powershell#authenticate-with-azure-active-directory)|An article that looks at authentication using Microsoft Entra ID.|\n|[OpenAI with Managed Identities](/azure/ai-services/openai/how-to/managed-identity)|An article detailing more complex security scenarios that require Azure role-based access control (Azure RBAC). This document covers how to authenticate to your OpenAI resource using Microsoft Entra ID.|\n|[Quickstart: Get started using GPT-35-Turbo and GPT-4 with Azure OpenAI Service in IntelliJ](/azure/developer/java/toolkit-for-intellij/chatgpt-intellij)|Similar to the first quickstart, but provides an example of system, assistant and user roles to tailor the content when asked certain questions using IntelliJ.|\n|[Quickstart: Generate images with Azure OpenAI in Microsoft Foundry Models](/azure/ai-foundry/openai/dall-e-quickstart?view=foundry&pivots=programming-language-java&tabs=command-line%2Cgpt-image-1%2Ckeyless%2Ctypescript-keyless&preserve-view=true)|Use this guide to get started generating images with the Azure OpenAI SDK for Java.|\n\n## Resources for other Foundry Tools\n\nIn addition to Azure OpenAI Service, there are many other Foundry Tools that help developers and organizations rapidly create intelligent, market-ready, and responsible applications with out-of-the-box and prebuilt customizable APIs and models. Example applications include natural language processing for conversations, search, monitoring, translation, speech, vision, and decision-making.\n\n### Samples\n\n|Link|Description|\n|---|---|\n|[Integrate Azure Speech in Foundry Tools into your apps with Speech SDK Samples](https://github.com/Azure-Samples/cognitive-services-speech-sdk)|A collection of samples for the Speech SDK. Links to samples for speech recognition, translation, speech synthesis, and more.|\n|[Extract structured data from forms, receipts, invoices, and cards using Form Recognizer in Java](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/formrecognizer/azure-ai-formrecognizer/src/samples/README.md#azure-form-recognizer-client-library-samples-for-java)|A collection of samples for the Azure.AI.FormRecognizer client library.|\n|[Extract, classify, and understand text within documents using Text Analytics in Java](/java/api/overview/azure/ai-textanalytics-readme?view=azure-java-stable&preserve-view=true)|The client Library for Text Analytics is part of the [Azure Language in Foundry Tools](/azure/ai-services/language-service) service, which provides Natural Language Processing (NLP) features for understanding and analyzing text.|\n|[Document Translation in Java](/azure/ai-services/translator/document-translation/quickstarts/document-translation-rest-api?pivots=programming-language-java)|A quickstart article that explains how to use Document Translation to translate a source document into a target language while preserving structure and text formatting.|\n|[Analyze images](/java/api/overview/azure/ai-vision-imageanalysis-readme?view=azure-java-stable&preserve-view=true)|Sample code and setup documents for the Microsoft Azure Image Analysis client library for Java|\n\n### Documentation\n\n|AI service|Description|API reference|Quickstart|\n|---|---|---|---|\n|[Content Safety in Foundry Control Plane](/azure/ai-services/content-safety/)|A Foundry tool that detects unwanted content.|[Content Safety API reference](/java/api/overview/azure/ai-contentsafety-readme)|[Quickstart](/azure/ai-services/content-safety/quickstart-text?tabs=visual-studio%2Cwindows&pivots=programming-language-java)|\n|[Azure Document Intelligence in Foundry Tools](/azure/ai-services/document-intelligence/)|Turn documents into intelligent data-driven solutions.|[Document Intelligence API reference](/java/api/overview/azure/ai-formrecognizer-readme)|[Quickstart](/azure/ai-services/document-intelligence/quickstarts/get-started-sdks-rest-api?pivots=programming-language-java)|\n|[Language](/azure/ai-services/language-service/)|Build apps with industry-leading natural language understanding capabilities.|[Language API reference](/java/api/overview/azure/ai-textanalytics-readme)|[Quickstart](/azure/ai-services/language-service/text-analytics-for-health/quickstart?tabs=windows&pivots=programming-language-java)|\n|[Azure AI Search](/azure/search/)|Bring AI-powered cloud search to your applications.|[Azure AI Search API reference](/java/api/overview/azure/search-documents-readme)|[Quickstart](/azure/search/search-get-started-text?tabs=java) |\n|[Speech](/azure/ai-services/speech-service/)|Speech to text, text to speech, translation, and speaker recognition.|[Speech API reference](/java/api/overview/azure/search-documents-readme)|[Quickstart](/azure/ai-services/speech-service/get-started-speech-to-text?tabs=windows%2Cterminal&pivots=programming-language-java)|\n|[Azure Translator in Foundry Tools](/azure/ai-services/translator/)|Use AI-powered translation to translate more than 100 in-use, at-risk and endangered languages and dialects.|[Translator API reference](/java/api/overview/azure/ai-translation-text-readme)|[Quickstart](/azure/ai-services/translator/quickstart-text-sdk?pivots=programming-language-java)|\n|[Azure Vision in Foundry Tools](/azure/ai-services/computer-vision/)|Analyze content in images and videos.|[Vision API reference](/azure/ai-services/computer-vision/quickstarts-sdk/image-analysis-client-library-40?pivots=programming-language-java&tabs=visual-studio%2Cwindows)|[Quickstart](/azure/ai-services/computer-vision/quickstarts-sdk/image-analysis-client-library?tabs=windows%2Cvisual-studio&pivots=programming-language-java)|\n\n## Training\n\n|Link|Description|\n|---|---|\n|[Generative AI for Beginners Workshop](https://github.com/microsoft/generative-ai-for-beginners/tree/main)|Learn the fundamentals of building Generative AI apps with our 18-lesson comprehensive course by Microsoft Cloud Advocates.|\n|[AI Agents for Beginners Workshop](https://github.com/microsoft/ai-agents-for-beginners)|Learn the fundamentals of building Generative AI agents with our 10-lesson comprehensive course by Microsoft Cloud Advocates.|\n|[Introduction to AI in Azure](/training/paths/introduction-to-ai-on-azure/)|Training path to help you understand core concepts related to artificial intelligence (AI), and the services in Microsoft Azure that can be used to create AI solutions.|\n|[Develop generative AI apps in Azure](/training/paths/create-custom-copilots-ai-studio/)|Generative Artificial Intelligence (AI) is becoming more accessible through comprehensive development platforms like Microsoft Foundry. Learn how to build generative AI applications that use language models to chat with your users.|\n\n## AI app templates\n\nAI app templates provide you with well-maintained, easy to deploy reference implementations that provide a high-quality starting point for your AI apps.\n\nThere are two categories of AI app templates, **building blocks** and **end-to-end solutions**. Building blocks are smaller-scale samples that focus on specific scenarios and tasks. End-to-end solutions are comprehensive reference samples including documentation, source code, and deployment to allow you to take and extend for your own purposes.\n\nTo review a list of key templates available for each programming language, see [AI app templates](/azure/developer/ai/intelligent-app-templates). To browse all available templates, see the AI app templates on the [AI App Template gallery](https://azure.github.io/ai-app-templates?tags=azureopenai&tags=java)."
  },
  {
    "path": "articles/ai/includes/azure-ai-for-developers-javascript.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 12/18/2025\nms.author: rotabor\nauthor: bobtabor-msft\nms.service: azure\n---\n\n## Resources for Azure OpenAI in Microsoft Foundry Models\n\nAzure OpenAI in Microsoft Foundry Models provides REST API access to OpenAI's powerful language models. These models can be easily adapted to your specific task including but not limited to content generation, summarization, image understanding, semantic search, and natural language to code translation. Users can access the service through REST APIs, the OpenAI Node API Library, or via the [Microsoft Foundry portal](/azure/ai-studio/azure-openai-in-ai-studio).\n\n### Libraries\n\n|Package|Source code|npm|\n|---|---|---|---|\n|**OpenAI Node API Library**|[Source code](https://github.com/openai/openai-node/blob/master/README.md)|[Package](https://www.npmjs.com/package/openai)|\n|**Azure OpenAI library for TypeScript**|[Source code](https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/openai/openai/README.md)|[Package](https://www.npmjs.com/package/@azure/openai)|\n\n### Samples\n\n|Link|Description|\n|---|---|\n|[AI Travel Agents](https://github.com/Azure-Samples/azure-ai-travel-agents)|The **AI Travel Agents** is a robust enterprise application that leverages multiple AI agents to enhance travel agency operations. The application demonstrates how six AI agents collaborate to assist employees in handling customer queries, providing destination recommendations, and planning itineraries.|\n|[Getting Started with Remote MCP Servers using Azure Container Apps (Node.js/TypeScript)](https://github.com/Azure-Samples/mcp-container-ts)|This quick start guide provides the basic building blocks to set up a remote Model Context Protocol (MCP) server using Azure Container Apps. The MCP server is built using Node.js and TypeScript, and it can be used to run various tools and services in a serverless environment.|\n|[DeepSeek on Azure](https://github.com/Azure-Samples/deepseek-azure-javascript)|Demonstrates how to use DeepSeek with JavaScript/TypeScript via the OpenAI Node.js client library or LangChain.js. DeepSeek excels at tasks requiring deep context understanding and complex reasoning. You may experience longer response times compared to other models, because it simulates a thought process (under the `<think>` tag) before providing an actual answer.|\n|[Completions](https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/openai/openai/samples/v2/javascript/completions.js)|A simple example demonstrating how to get completions for the provided prompt.|\n|[Streaming Chat Completions](https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/openai/openai/samples/v2/javascript/streamChatCompletions.js)|A simple example demonstrating how to use  streaming chat completions.|\n|[Switch from OpenAI to Azure OpenAI](/azure/developer/ai/how-to/switching-endpoints?tabs=openai&pivots=javascript)|Article with guidance on the small changes you need to make to your code in order to swap back and forth between OpenAI and the Azure OpenAI Service.|\n|[OpenAI with Microsoft Entra ID Role based access control](/azure/ai-services/authentication?tabs=powershell#authenticate-with-azure-active-directory)|A look at authentication using Microsoft Entra ID.|\n|[OpenAI with Managed Identities](/azure/ai-services/openai/how-to/managed-identity)|An article detailing more complex security scenarios require Azure role-based access control (Azure RBAC). This document covers how to authenticate to your OpenAI resource using Microsoft Entra ID.|\n|[LangChain.js with Azure OpenAI and Azure AI Search](https://github.com/Azure-Samples/azure-typescript-langchainjs)|Build an intelligent RAG agent with LangChain.js that evaluates whether questions can be answered using unstructured data in Azure AI Search, and delivers contextually relevant responses from that knowledge base when possible.|\n|[More samples](https://aka.ms/oai/js/samples)|OpenAI samples covering a range of scenarios.|\n\n### Documentation\n\n|Link|Description|\n|---|---|\n|[Azure OpenAI in Microsoft Foundry Models Documentation](/azure/ai-foundry/how-to/upgrade-azure-openai?&tabs=portal)|The Microsoft Foundry resource type offers a superset of capabilities compared to the Azure OpenAI resource type.|\n|[Work with chat completions models using Azure OpenAI in Microsoft Foundry Models](/azure/ai-foundry/openai/how-to/chatgpt?tabs=python-secure)|A quick set of instructions to set up the services you need and code you must write to prompt a model using JavaScript.|\n|[Quickstart: Getting started with the Azure OpenAI Responses API](/azure/ai-services/openai/chatgpt-quickstart?pivots=programming-language-javascript)|The Responses API is a new stateful API from Azure OpenAI. It brings together the best capabilities from the chat completions and assistants API in one unified experience.|\n|[Quickstart: Chat with Azure OpenAI using your own data](/azure/ai-services/openai/use-your-data-quickstart?pivots=programming-language-javascript)|Similar to the first quickstart, but this time you add your own data (like a PDF or other document).|\n|[Microsoft Foundry Quickstart](/azure/ai-foundry/quickstarts/get-started-code?view=foundry&preserve-view=true&tabs=typescript)|The Microsoft Foundry SDK is available in multiple languages, including Python, Java, TypeScript, and C#.|\n|[Quickstart: Use images in your AI chats](/azure/ai-services/openai/gpt-v-quickstart?pivots=programming-language-studio)|How to programmatically ask the model to describe the contents of an image.|\n|[Quickstart: Generate images with Azure OpenAI](/azure/ai-services/openai/dall-e-quickstart?pivots=programming-language-javascript)|Use this guide to get started generating images with the Azure OpenAI SDK for JavaScript.|\n\n## Resources for other Foundry Tools\n\nIn addition to Azure OpenAI in Microsoft Foundry Models, there are many other Foundry Tools that help developers and organizations rapidly create intelligent, market-ready, and responsible applications with out-of-the-box and prebuilt customizable APIs and models. Example applications include natural language processing for conversations, search, monitoring, translation, speech, vision, and decision-making.\n\n### Samples\n\n|Link|Description|\n|---|---|\n|[Integrate Azure Speech in Foundry Tools into your apps with Speech SDK Samples](https://github.com/Azure-Samples/cognitive-services-speech-sdk)|A collection of samples for the Speech SDK. Links to samples for speech recognition, translation, speech synthesis, and more.|\n|[Extract structured data from forms, receipts, invoices, and cards using Form Recognizer in JavaScript](https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/formrecognizer/ai-form-recognizer/samples/v5/javascript/README.md#azure-form-recognizer-client-library-samples-for-javascript)|A collection of samples for the Azure.AI.FormRecognizer client library.|\n|[Extract, classify, and understand text within documents using Text Analytics in JavaScript](/javascript/api/overview/azure/ai-text-analytics-readme?view=azure-node-latest&preserve-view=true)|The client Library for Text Analytics. This is part of the [Azure Language in Foundry Tools](/azure/ai-services/language-service) service, which provides Natural Language Processing (NLP) features for understanding and analyzing text.|\n|[Document Translation in JavaScript](/azure/ai-services/translator/document-translation/quickstarts/document-translation-rest-api?pivots=programming-language-javascript)|A quickstart article that uses Document Translation to translate a source document into a target language while preserving structure and text formatting.|\n|[Analyze images](/azure/ai-services/computer-vision/sdk/overview-sdk)|Sample code and setup documents for the Microsoft Azure AI Image Analysis SDK.|\n\n\n### Documentation\n\n|AI service|Description|API reference|Quickstart|\n|---|---|---|---|\n|[Content Safety in Foundry Control Plane](/azure/ai-services/content-safety/)|A Foundry tool that detects unwanted content.|[Content Safety API reference](/javascript/api/overview/azure/ai-content-safety-rest-readme)|[Quickstart](/azure/ai-services/content-safety/quickstart-text?tabs=visual-studio%2Cwindows&pivots=programming-language-javascript)|\n|[Azure Document Intelligence in Foundry Tools](/azure/ai-services/document-intelligence/)|Turn documents into intelligent data-driven solutions.|[Document Intelligence API reference](/javascript/api/overview/azure/ai-form-recognizer-readme)|[Quickstart](/azure/ai-services/document-intelligence/quickstarts/get-started-sdks-rest-api?pivots=programming-language-javascript)|\n|[Language](/azure/ai-services/language-service/)|Build apps with industry-leading natural language understanding capabilities.|[Text Analytics API reference](/javascript/api/overview/azure/ai-form-recognizer-readme)|[Quickstart](/azure/ai-services/language-service/text-analytics-for-health/quickstart?tabs=windows&pivots=programming-language-javascript)|\n|[Azure AI Search](/azure/search/)|Bring AI-powered cloud search to your applications.|[Azure AI Search API reference](/javascript/api/overview/azure/search-documents-readme)|[Quickstart](/azure/search/search-get-started-text?tabs=javascript)|\n|[Speech](/azure/ai-services/speech-service/)|Speech to text, text to speech, translation, and speaker recognition.|[Speech API reference](/javascript/api/overview/azure/microsoft-cognitiveservices-speech-sdk-readme)|[Quickstart](/azure/ai-services/speech-service/get-started-speech-to-text?tabs=windows%2Cterminal&pivots=programming-language-javascript)|\n|[Azure Translator in Foundry Tools](/azure/ai-services/translator/)|Use AI-powered translation to translate more than 100 in-use, at-risk and endangered languages and dialects.|[Translation API reference](/javascript/api/overview/azure/ai-translation-text-rest-readme)|[Quickstart](/azure/ai-services/translator/quickstart-text-sdk?pivots=programming-language-javascript)|\n|[Azure Vision in Foundry Tools](/azure/ai-services/computer-vision/)|Analyze content in images and videos.|[Image Analysis API reference](/javascript/api/overview/azure/ai-vision-image-analysis-rest-readme)|[Quickstart](/azure/ai-services/computer-vision/quickstarts-sdk/image-analysis-client-library?tabs=windows%2Cvisual-studio&pivots=programming-language-javascript)|\n\n## Training\n\n|Link|Description|\n|---|---|\n|[Generative AI for Beginners Workshop](https://github.com/microsoft/generative-ai-for-beginners/tree/main)|Learn the fundamentals of building Generative AI apps with our 18-lesson comprehensive course by Microsoft Cloud Advocates.|\n|[Generative AI for JavaScript developers](https://github.com/microsoft/generative-ai-with-javascript)|This covers the basics of generative AI and how to build AI applications using JavaScript, from local development to deployment on Azure, up to running and scaling your AI models. The [YouTube playlist of videos](https://www.youtube.com/playlist?list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk) includes a series of videos around 10 minutes long, each focusing on a specific topic.|\n|[AI Agents for Beginners Workshop](https://github.com/microsoft/ai-agents-for-beginners)|Learn the fundamentals of building Generative AI agents with our 10-lesson comprehensive course by Microsoft Cloud Advocates.|\n|[Get started with Foundry Tools](/training/paths/get-started-azure-ai/)|Foundry Tools is a collection of services that are building blocks of AI functionality you can integrate into your applications. In this learning path, you learn how to provision, secure, monitor, and deploy Foundry Tools resources and use them to build intelligent solutions.|\n|[Microsoft Azure AI Fundamentals: Generative AI](/training/paths/introduction-generative-ai/)|Training path to help you understand how large language models form the foundation of generative AI: how Azure OpenAI Service provides access to the latest generative AI technology, how prompts and responses can be fine-tuned and how Microsoft's responsible AI principles drive ethical AI advancements.|\n|[Develop Generative AI solutions with Azure OpenAI in Microsoft Foundry](/training/paths/develop-ai-solutions-azure-openai/)|Azure OpenAI in Microsoft Foundry provides access to OpenAI's powerful large language models such as ChatGPT, GPT, Codex, and Embeddings models. This learning path teaches developers how to generate code, images, and text using the OpenAI SDK and other Azure services.|\n|[Build AI apps with Azure Database for PostgreSQL](/training/paths/build-ai-apps-azure-database-postgresql/)|This learning path explores how the Azure AI and Azure Machine Learning Services integrations provided by the Azure AI extension for Azure Database for PostgreSQL - Flexible Server can enable you to build AI-powered apps.|\n|[Secure Azure OpenAI authentication and authorization](/training/modules/secure-azure-openai-authentication-authorization/)|Learn why you should use managed identity for Azure OpenAI authentication and how you can configure role based access controls to minimize necessary permissions.|\n|[Introduction to Azure OpenAI managed identity authentication with JavaScript](/training/modules/intro-azure-openai-managed-identity-auth-javascript/)|This module helps you understand how to use a managed identity in JavaScript apps that interact with Azure OpenAI Service.|\n\n## AI app templates\n\nAI app templates provide you with well-maintained, easy to deploy reference implementations that provide a high-quality starting point for your AI apps.\n\nThere are two categories of AI app templates, **building blocks** and **end-to-end solutions**. Building blocks are smaller-scale samples that focus on specific scenarios and tasks. End-to-end solutions are comprehensive reference samples including documentation, source code, and deployment to allow you to take and extend for your own purposes.\n\nTo review a list of key templates available for each programming language, see [AI app templates](/azure/developer/ai/intelligent-app-templates?pivots=javascript). To browse all available templates, see the AI app templates on the [AI App Template gallery](https://azure.github.io/ai-app-templates?tags=azureopenai&tags=javascript).\n"
  },
  {
    "path": "articles/ai/includes/azure-ai-for-developers-python.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/29/2026\nms.author: rotabor\nauthor: bobtabor-msft\nms.service: azure\n---\n## Resources for Azure OpenAI in Microsoft Foundry Models\n\nAzure OpenAI in Microsoft Foundry Models provides REST API access to the powerful language models available in OpenAI. Azure OpenAI helps you adapt these models to accomplish specific tasks, such as content generation, summarization, image understanding, semantic search, and natural language to code translation. Access Azure OpenAI by using the REST APIs, the OpenAI SDK for Python, or via the [Microsoft Foundry portal](/azure/ai-studio/azure-openai-in-ai-studio).\n\n### SDKs and libraries\n\n|Link|Description|\n|---|---|\n|[OpenAI SDK for Python](https://github.com/openai/openai-python/blob/main/README.md)|The GitHub source code version of the OpenAI Python library, which provides convenient access to the OpenAI API from applications written in the Python language.|\n|[OpenAI Python Package](https://pypi.org/project/openai/)|The PyPi version of the OpenAI Python library.|\n\n### Samples\n\n|Link|Description|\n|---|---|\n|[Streaming chat completions](https://github.com/openai/openai-cookbook/blob/main/examples/azure/chat.ipynb)|A notebook example that demonstrates how to get chat completions to work by using the Azure endpoints. The example focuses on chat completions, but also introduces other operations available with the API.|\n|[Azure embeddings](https://github.com/openai/openai-cookbook/blob/main/examples/azure/embeddings.ipynb)|A notebook example that demonstrates how to use embeddings with Azure endpoints. The example focuses on embeddings, but also introduces other operations available with the API.|\n\n### Documentation\n\n|Link|Description|\n|---|---|\n|[Switch from OpenAI to Azure OpenAI](/azure/developer/ai/how-to/switching-endpoints?tabs=openai&pivots=python)|A guidance article on the small changes you need to make to your code, so you can swap back and forth between OpenAI and the Azure OpenAI Service.|\n|[Quickstart: Get started generating text with Azure OpenAI Service](/azure/ai-services/openai/quickstart?tabs=command-line%2Cpython-new&pivots=programming-language-python)|A quickstart that demonstrates how to set up the services you need and write code to prompt a model by using Python.|\n|[Quickstart: Get started using GPT-35-Turbo and GPT-4 with Azure OpenAI Service](/azure/ai-services/openai/chatgpt-quickstart?tabs=command-line%2Cpython-new&pivots=programming-language-python)|A quickstart that demonstrates how to work with system, assistant, and user roles to tailor content in response to certain questions.|\n|[Quickstart: Chat with Azure OpenAI models by using your own data](/azure/ai-services/openai/use-your-data-quickstart?tabs=command-line%2Cpython-new&pivots=programming-language-python)|A quickstart that helps you add your own data, such as a PDF or other document.|\n|[Quickstart: Get started using Azure OpenAI Assistants (Preview)](/azure/ai-services/openai/assistants-quickstart?tabs=command-line%2Ctypescript&pivots=programming-language-python)|A quickstart that demonstrates how to instruct a model to use the built-in Python code interpreter to solve math problems step by step. This example provides a starting point to use your own AI assistants accessed through custom instructions.|\n|[Deploy model and generate text](/azure/ai-services/openai/quickstart?pivots=programming-language-python)|An article with minimal, straightforward detailed steps to deploy a model that can programmatically chat.|\n|[OpenAI with Microsoft Entra ID role-based access control](/azure/ai-services/authentication?tabs=powershell#authenticate-with-azure-active-directory)|A look at authentication by using Microsoft Entra ID and [Azure role-based access control](/azure/role-based-access-control/overview).|\n|[OpenAI with Azure AD-managed identities for Azure resources](/azure/ai-services/openai/how-to/managed-identity)|An article with more complex security scenarios that require Azure role-based access control. Explore how to authenticate to your OpenAI resource with Microsoft Entra ID.|\n|[Azure OpenAI in Microsoft Foundry Models samples](https://github.com/Azure-Samples/openai/blob/main/README.md)|A compilation of useful Azure OpenAI in Microsoft Foundry Models resources and code samples to help you get started and accelerate your technology adoption journey.|\n|[Quickstart: Use images in your AI chats](/azure/ai-services/openai/gpt-v-quickstart?tabs=image%2Ccommand-line&pivots=programming-language-python)|A quickstart that shows how to programmatically ask a model to describe the contents of an image.|\n|[Quickstart: Generate images with Azure OpenAI Service](/azure/ai-services/openai/dall-e-quickstart?tabs=dalle3%2Ccommand-line&pivots=programming-language-python)|A quickstart that demonstrates how to programmatically generate images by using Dall-E based on a prompt.|\n\n## Resources for other Foundry Tools\n\nIn addition to Azure OpenAI Service, there are many other Foundry Tools. Developers and organizations can rapidly create intelligent, market-ready, and responsible applications with out-of-the-box and prebuilt customizable APIs and models. Example applications include natural language processing for conversations, search, monitoring, translation, speech, vision, and decision-making.\n\n### Samples\n\n|Link|Description|\n|---|---|\n|[Integrate speech into your apps with Azure Speech in Foundry Tools SDK Samples](https://github.com/Azure-Samples/cognitive-services-speech-sdk)|Samples for the Azure Cognitive Services Speech SDK. Links to samples for speech recognition, translation, speech synthesis, and more.|\n|[Azure Document Intelligence in Foundry Tools SDK](/azure/ai-services/document-intelligence/versioning/sdk-overview-v4-0)|Document Intelligence (formerly Form Recognizer) is a cloud service that uses machine learning to analyze text and structured data from documents. The Document Intelligence software development kit (SDK) is a set of libraries and tools that enable you to easily integrate Document Intelligence models and capabilities into your applications.|\n|[Extract structured data from forms, receipts, invoices, and cards using Form Recognizer in Python](https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/formrecognizer/azure-ai-formrecognizer/samples/README.md#samples-for-azure-form-recognizer-client-library-for-python)|Samples for the Azure.AI.FormRecognizer client library.|\n|[Extract, classify, and understand text within documents using Text Analytics in Python](/python/api/overview/azure/ai-textanalytics-readme?view=azure-python&preserve-view=true)|The client Library for Text Analytics. These APIs are part of the [Azure Language in Foundry Tools](/azure/ai-services/language-service) service, which provides Natural Language Processing (NLP) features for understanding and analyzing text.|\n|[Document Translation in Python](/azure/ai-services/translator/document-translation/quickstarts/client-library-sdks?tabs=dotnet&pivots=programming-language-python)|A quickstart article that uses Document Translation to translate a source document into a target language while preserving structure and text formatting.|\n|[Question answering in Python](/azure/ai-services/language-service/question-answering/quickstart/sdk?tabs=windows&pivots=programming-language-python)|A quickstart article with steps to get an answer (and confidence score) from a body of text that you send along with your question.|\n|[Conversational Language Understanding in Python](/python/api/overview/azure/ai-language-conversations-readme?view=azure-python&preserve-view=true)|The client library for Conversational Language Understanding (CLU). CLU is a cloud-based conversational AI service that can extract intents and entities in conversations. CLU acts like an orchestrator to select the best candidate to analyze conversations to get the best response from apps like QnA, Luis, and Conversation App.|\n|[Analyze images](/azure/ai-services/computer-vision/sdk/overview-sdk)|Sample code and setup documents for the Microsoft Azure AI Image Analysis SDK.|\n|[Content Safety in Foundry Control Plane SDK for Python](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/contentsafety/azure-ai-contentsafety)|The SDK can help detect harmful user-generated and AI-generated content in applications and services. Content Safety includes text and image APIs that allow you to detect material that is harmful.|\n\n### Documentation\n\n|AI service|Description|API reference|Quickstart|\n|---|---|---|---|\n|[Content Safety](/azure/ai-services/content-safety/)|A Foundry tool that detects unwanted content.|[Content Safety API reference](/python/api/overview/azure/ai-contentsafety-readme)|[Quickstart](/azure/ai-services/content-safety/quickstart-text?tabs=visual-studio%2Cwindows&pivots=programming-language-python)|\n|[Document Intelligence](/azure/ai-services/document-intelligence/)|Turn documents into intelligent data-driven solutions.|[Document Intelligence API reference](/python/api/overview/azure/ai-formrecognizer-readme)|[Quickstart](/azure/ai-services/document-intelligence/quickstarts/get-started-sdks-rest-api?pivots=programming-language-python)|\n|[Language](/azure/ai-services/language-service/)|Build apps with industry-leading natural language understanding capabilities.|[Text Analytics API reference](/python/api/overview/azure/ai-textanalytics-readme)|[Quickstart](/azure/ai-services/language-service/text-analytics-for-health/quickstart?tabs=windows&pivots=programming-language-python)|\n|[Azure AI Search](/azure/search/)|Bring AI-powered cloud search to your applications.|[Azure AI Search API reference](/python/api/overview/azure/search)|[Quickstart](/azure/search/search-get-started-text?tabs=python)|\n|[Speech](/azure/ai-services/speech-service/)|Speech to text, text to speech, translation, and speaker recognition.|[Speech API reference](/python/api/overview/azure/cognitiveservices/speech)|[Quickstart](/azure/ai-services/speech-service/get-started-speech-to-text?tabs=windows%2Cterminal&pivots=programming-language-python)|\n|[Azure Translator in Foundry Tools](/azure/ai-services/translator/)|Use AI-powered translation to translate more than 100 in-use, at-risk and endangered languages and dialects.|[Translation API reference](/python/api/overview/azure/ai-translation-document-readme)|[Quickstart](/azure/ai-services/translator/quickstart-text-sdk?pivots=programming-language-python)|\n|[Azure Vision in Foundry Tools](/azure/ai-services/computer-vision/)|Analyze content in images and videos.|[Image Analysis API reference](/python/api/overview/azure/ai-vision-imageanalysis-readme)|[Quickstart](/azure/ai-services/computer-vision/quickstarts-sdk/image-analysis-client-library?tabs=windows%2Cvisual-studio&pivots=programming-language-python)|\n\n## Training\n\n|Link|Description|\n|---|---|\n|[Generative AI for beginners workshop](https://github.com/microsoft/generative-ai-for-beginners/tree/main)|Learn the fundamentals of building Generative AI apps with our 18-lesson comprehensive course by Microsoft Cloud Advocates.|\n|[Get started with Foundry Tools](/training/paths/get-started-azure-ai/)|Foundry Tools are building blocks of AI functionality you can integrate into your applications. Complete this learning path to explore how to provision, secure, monitor, and deploy Azure AI services resources and use them to build intelligent solutions.|\n|[Microsoft Azure AI Fundamentals: Generative AI](/training/paths/introduction-generative-ai/)|Complete this learning path to understand how large language models form the foundation of generative AI. Explore how Azure OpenAI Service provides access to the latest generative AI technology. Learn how Azure OpenAI prompts and responses can be fine-tuned and how Microsoft's responsible AI principles drive ethical AI advancements.|\n|[Develop Generative AI solutions with Azure OpenAI Service](/training/paths/develop-ai-solutions-azure-openai/)|Azure OpenAI Service provides access to OpenAI's powerful large language models such as ChatGPT, GPT, Codex, and Embeddings models. Complete this learning path for developers and explore how to generate code, images, and text by using the Azure OpenAI SDK and other Azure services.|\n|[Build AI apps with Azure Database for PostgreSQL](/training/paths/build-ai-apps-azure-database-postgresql/)|Complete this learning path to explore Azure AI and Azure Machine Learning Services integrations provided by the Azure AI extension for Azure Database for PostgreSQL - Flexible Server. Learn how these services can enable you to build AI-powered apps.|\n\n## AI application templates\n\nAI application templates supply you with well-maintained, easy to deploy reference implementations that provide a high-quality starting point for your AI apps.\n\nThere are two categories of AI app templates, **building blocks** and **end-to-end solutions**. Building blocks are smaller-scale samples that focus on specific scenarios and tasks. End-to-end solutions are comprehensive reference samples that include documentation, source code, and deployment features. You can build on the solutions and extend them for your own purposes.\n\n- To review a list of key templates available for each programming language, see [AI app templates](/azure/developer/ai/intelligent-app-templates?pivots=python).\n- To browse all available templates, see the AI app templates on the [Azure Developer CLI gallery](https://azure.github.io/awesome-azd/?tags=aicollection).\n"
  },
  {
    "path": "articles/ai/includes/evaluations-introduction.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.author: rotabor\nauthor: bobtabor-msft\nms.service: azure\n---\n\nThis article shows you how to evaluate a chat app's answers against a set of correct or ideal answers (known as ground truth). Whenever you change your chat application in a way that affects the answers, run an evaluation to compare the changes. This demo application offers tools that you can use today to make it easier to run evaluations.\n\nBy following the instructions in this article, you:\n\n- Use provided sample prompts tailored to the subject domain. These prompts are already in the repository.\n- Generate sample user questions and ground truth answers from your own documents.\n- Run evaluations by using a sample prompt with the generated user questions.\n- Review analysis of answers.\n\n> [!NOTE]\n> This article uses one or more [AI app templates](../intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained reference implementations that are easy to deploy. They help to ensure a high-quality starting point for your AI apps.\n\n## Architectural overview\n\nKey components of the architecture include:\n\n- **Azure-hosted chat app**: The chat app runs in Azure App Service.\n- **Microsoft AI Chat Protocol**: The protocol provides standardized API contracts across AI solutions and languages. The chat app conforms to the [Microsoft AI Chat Protocol](https://github.com/microsoft/ai-chat-protocol/), which allows the evaluations app to run against any chat app that conforms to the protocol.\n- **Azure AI Search**: The chat app uses Azure AI Search to store the data from your own documents.\n- **Sample questions generator**: The tool can generate many questions for each document along with the ground truth answer. The more questions there are, the longer the evaluations.\n- **Evaluator**: The tool runs sample questions and prompts against the chat app and returns the results.\n- **Review tool**: The tool reviews the results of the evaluations.\n- **Diff tool**: The tool compares the answers between evaluations.\n\nWhen you deploy this evaluation to Azure, the Azure OpenAI Service endpoint is created for the `GPT-4` model with its own [capacity](/azure/ai-services/openai/quotas-limits#regional-quota-limits). When you evaluate chat applications, it's important that the evaluator has its own Azure OpenAI resource by using `GPT-4` with its own capacity.\n"
  },
  {
    "path": "articles/ai/includes/evaluations-procedure.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.author: rotabor\nauthor: bobtabor-msft\nms.service: azure\n---\n\n## Open a development environment\n\nFollow these instructions to set up a preconfigured development environment with all the required dependencies to complete this article. Arrange your monitor workspace so that you can see this documentation and the development environment at the same time.\n\nThis article was tested with the `switzerlandnorth` region for the evaluation deployment.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. Use GitHub Codespaces for the easiest development environment. It comes with the right developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use GitHub Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Start the process to create a new GitHub codespace on the `main` branch of the [Azure-Samples/ai-rag-chat-evaluator](https://github.com/Azure-Samples/ai-rag-chat-evaluator) GitHub repository.\n1. To display the development environment and the documentation available at the same time, right-click the following button, and select **Open link in new window**.\n\n    [![Open in GitHub Codespaces.](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/ai-rag-chat-evaluator)\n\n1. On the **Create codespace** page, review the codespace configuration settings, and then select **Create new codespace**.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-evaluations/github-create-codespace.png\" alt-text=\"Screenshot that shows the confirmation screen before you create a new codespace.\":::\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. In the terminal at the bottom of the screen, sign in to Azure with the Azure Developer CLI:\n\n    ```bash\n    azd auth login --use-device-code\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\n1. Provision the required Azure resource, Azure OpenAI Service, for the evaluations app:\n\n    ```bash\n    azd up\n    ```\n\n    This `AZD` command doesn't deploy the evaluations app, but it does create the Azure OpenAI resource with a required `GPT-4` deployment to run the evaluations in the local development environment.\n\nThe remaining tasks in this article take place in the context of this development container.\n\nThe name of the GitHub repository appears in the search bar. This visual indicator helps you distinguish the evaluations app from the chat app. This `ai-rag-chat-evaluator` repo is referred to as the *evaluations app* in this article.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally by using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n1. Ensure that you have the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) installed in Visual Studio Code.\n\n    [![Open this project in Dev Containers.](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/Azure-Samples/ai-rag-chat-evaluator)\n\n1. In the terminal at the bottom of the screen, sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login --use-device-code\n    ```\n\n    Follow the instructions to authenticate with your Azure account.\n\n1. Provision the required Azure resource, Azure OpenAI, for the evaluations app.\n\n    ```bash\n    azd up\n    ```\n\nThe remaining exercises in this project take place in the context of this development container.\n\nThe name of the GitHub repository is shown in the bottom-left corner of Visual Studio Code. This visual indicator helps you distinguish the evaluations app from the chat app. This `ai-rag-chat-evaluator` repo is referred to as the evaluations app in this article.\n\n---\n\n## Prepare environment values and configuration information\n\nUpdate the environment values and configuration information with the information you gathered during [Prerequisites](#prerequisites) for the evaluations app.\n\n1. Create a `.env` file based on `.env.sample`.\n\n    ```bash\n    cp .env.sample .env\n    ```\n\n1. Run this command to get the required values for `AZURE_OPENAI_EVAL_DEPLOYMENT` and `AZURE_OPENAI_SERVICE` from your deployed resource group. Paste those values into the `.env` file.\n\n    ```shell\n    azd env get-value AZURE_OPENAI_EVAL_DEPLOYMENT\n    azd env get-value AZURE_OPENAI_SERVICE\n    ```\n\n1. Add the following values from the chat app for its Azure AI Search instance to the `.env` file, which you gathered in the [Prerequisites](#prerequisites) section.\n\n    ```bash\n    AZURE_SEARCH_SERVICE=\"<service-name>\"\n    AZURE_SEARCH_INDEX=\"<index-name>\"\n    ```\n\n### Use the Microsoft AI Chat Protocol for configuration information\n\nThe chat app and the evaluations app both implement the Microsoft AI Chat Protocol specification, an open-source, cloud, and language-agnostic AI endpoint API contract that's used for consumption and evaluation. When your client and middle-tier endpoints adhere to this API specification, you can consistently consume and run evaluations on your AI backends.\n\n1. Create a new file named `my_config.json` and copy the following content into it:\n\n    ```json\n    {\n        \"testdata_path\": \"my_input/qa.jsonl\",\n        \"results_dir\": \"my_results/experiment<TIMESTAMP>\",\n        \"target_url\": \"http://localhost:50505/chat\",\n        \"target_parameters\": {\n            \"overrides\": {\n                \"top\": 3,\n                \"temperature\": 0.3,\n                \"retrieval_mode\": \"hybrid\",\n                \"semantic_ranker\": false,\n                \"prompt_template\": \"<READFILE>my_input/prompt_refined.txt\",\n                \"seed\": 1\n            }\n        }\n    }\n    ```\n\n    The evaluation script creates the `my_results` folder.\n\n    The `overrides` object contains any configuration settings that are needed for the application. Each application defines its own set of settings properties.\n\n1. Use the following table to understand the meaning of the settings properties that are sent to the chat app.\n\n    |Settings property|Description|\n    |---|---|\n    |`semantic_ranker`|Whether to use [semantic ranker](/azure/search/semantic-search-overview#what-is-semantic-search), a model that reranks search results based on semantic similarity to the user's query. We disable it for this tutorial to reduce costs. |\n    |`retrieval_mode`|The retrieval mode to use. The default is `hybrid`.|\n    |`temperature`|The temperature setting for the model. The default is `0.3`.|\n    |`top`|The number of search results to return. The default is `3`.|\n    |`prompt_template`|An override of the prompt used to generate the answer based on the question and search results.|\n    |`seed`|The seed value for any calls to GPT models. Setting a seed results in more consistent results across evaluations.|\n\n1. Change the `target_url` value to the URI value of your chat app, which you gathered in the [Prerequisites](#prerequisites) section. The chat app must conform to the chat protocol. The URI has the following format: `https://CHAT-APP-URL/chat`. Make sure the protocol and the `chat` route are part of the URI.\n\n## Generate sample data\n\nTo evaluate new answers, they must be compared to a *ground truth* answer, which is the ideal answer for a particular question. Generate questions and answers from documents that are stored in Azure AI Search for the chat app.\n\n1. Copy the `example_input` folder into a new folder named `my_input`.\n\n1. In a terminal, run the following command to generate the sample data:\n\n    ```bash\n    python -m evaltools generate --output=my_input/qa.jsonl --persource=2 --numquestions=14\n    ```\n\nThe question-and-answer pairs are generated and stored in `my_input/qa.jsonl` (in [JSONL format](https://jsonlines.org/)) as input to the evaluator that's used in the next step. For a production evaluation, you would generate more question-and-answer pairs. More than 200 are generated for this dataset.\n\n> [!NOTE]\n> Only a few questions and answers are generated per source so that you can quickly complete this procedure. It isn't meant to be a production evaluation, which should have more questions and answers per source.\n\n## Run the first evaluation with a refined prompt\n\n1. Edit the `my_config.json` configuration file properties.\n\n    |Property|New value|\n    |--|--|\n    |`results_dir`|`my_results/experiment_refined`|\n    |`prompt_template`|`<READFILE>my_input/prompt_refined.txt`|\n\n    The refined prompt is specific about the subject domain.\n\n    ```txt\n    If there isn't enough information below, say you don't know. Do not generate answers that don't use the sources below. If asking a clarifying question to the user would help, ask the question.\n\n    Use clear and concise language and write in a confident yet friendly tone. In your answers, ensure the employee understands how your response connects to the information in the sources and include all citations necessary to help the employee validate the answer provided.\n    \n    For tabular information, return it as an html table. Do not return markdown format. If the question is not in English, answer in the language used in the question.\n    \n    Each source has a name followed by a colon and the actual information. Always include the source name for each fact you use in the response. Use square brackets to reference the source, e.g. [info1.txt]. Don't combine sources, list each source separately, e.g. [info1.txt][info2.pdf].\n    ```\n\n1. In a terminal, run the following command to run the evaluation:\n\n    ````bash\n    python -m evaltools evaluate --config=my_config.json --numquestions=14\n    ````\n\n     This script created a new experiment folder in `my_results/` with the evaluation. The folder contains the results of the evaluation.\n\n    | File name | Description |\n    |--|--|\n    | `config.json` | A copy of the configuration file used for the evaluation.|\n    | `evaluate_parameters.json` | The parameters used for the evaluation. Similar to `config.json` but includes other metadata like time stamp. |\n    | `eval_results.jsonl`| Each question and answer, along with the GPT metrics for each question-and-answer pair.|\n    | `summary.json`| The overall results, like the average GPT metrics.|\n\n## Run the second evaluation with a weak prompt\n\n1. Edit the `my_config.json` configuration file properties.\n\n    |Property|New value|\n    |--|--|\n    |`results_dir`|`my_results/experiment_weak`|\n    |`prompt_template`|`<READFILE>my_input/prompt_weak.txt`|\n\n    That weak prompt has no context about the subject domain.\n\n    ```txt\n    You are a helpful assistant.\n    ```\n\n1. In a terminal, run the following command to run the evaluation:\n\n    ````bash\n    python -m evaltools evaluate --config=my_config.json --numquestions=14\n    ````\n\n## Run the third evaluation with a specific temperature\n\nUse a prompt that allows for more creativity.\n\n1. Edit the `my_config.json` configuration file properties.\n\n    |Existing|Property|New value|\n    |--|--|--|\n    |Existing|`results_dir`|`my_results/experiment_ignoresources_temp09`|\n    |Existing|`prompt_template`|`<READFILE>my_input/prompt_ignoresources.txt`|\n    |New| `temperature` | `0.9`|\n\n    The default `temperature` is 0.7. The higher the temperature, the more creative the answers.\n\n    The `ignore` prompt is short.\n\n    ```text\n    Your job is to answer questions to the best of your ability. You will be given sources but you should IGNORE them. Be creative!\n    ```\n\n1. The configuration object should look like the following example, except that you replaced `results_dir` with your path:\n\n    ```json\n    {\n        \"testdata_path\": \"my_input/qa.jsonl\",\n        \"results_dir\": \"my_results/prompt_ignoresources_temp09\",\n        \"target_url\": \"https://YOUR-CHAT-APP/chat\",\n        \"target_parameters\": {\n            \"overrides\": {\n                \"temperature\": 0.9,\n                \"semantic_ranker\": false,\n                \"prompt_template\": \"<READFILE>my_input/prompt_ignoresources.txt\"\n            }\n        }\n    }\n    ```\n\n1. In a terminal, run the following command to run the evaluation:\n\n    ````bash\n    python -m evaltools evaluate --config=my_config.json --numquestions=14\n    ````\n\n## Review the evaluation results\n\nYou performed three evaluations based on different prompts and app settings. The results are stored in the `my_results` folder. Review how the results differ based on the settings.\n\n1. Use the review tool to see the results of the evaluations.\n\n    ```bash\n    python -m evaltools summary my_results\n    ```\n\n1. The results look _something_ like:\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-evaluations/evaluations-review-summary.png\" alt-text=\"Screenshot that shows the evaluations review tool showing the three evaluations.\":::\n\n    Each value is returned as a number and a percentage.\n\n1. Use the following table to understand the meaning of the values.\n\n    |Value|Description|\n    |--|--|\n    | Groundedness | Checks how well the model's responses are based on factual, verifiable information. A response is considered grounded if it's factually accurate and reflects reality.|\n    | Relevance | Measures how closely the model's responses align with the context or the prompt. A relevant response directly addresses the user's query or statement. |\n    | Coherence | Checks how logically consistent the model's responses are. A coherent response maintains a logical flow and doesn't contradict itself. |\n    | Citation | Indicates if the answer was returned in the format requested in the prompt.|\n    | Length | Measures the length of the response.|\n\n1. The results should indicate that all three evaluations had high relevance while the `experiment_ignoresources_temp09` had the lowest relevance.\n\n1. Select the folder to see the configuration for the evaluation.\n1. Enter <kbd>Ctrl</kbd> + <kbd>C</kbd> to exit the app and return to the terminal.\n\n## Compare the answers\n\nCompare the returned answers from the evaluations.\n\n1. Select two of the evaluations to compare, and then use the same review tool to compare the answers.\n\n    ```bash\n    python -m evaltools diff my_results/experiment_refined my_results/experiment_ignoresources_temp09\n    ```\n\n1. Review the results. Your results might vary.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-evaluations/evaluations-difference-between-evaluation-answers.png\" alt-text=\"Screenshot that shows comparison of evaluation answers between evaluations.\":::\n\n1. Enter <kbd>Ctrl</kbd> + <kbd>C</kbd> to exit the app and return to the terminal.\n\n## Suggestions for further evaluations\n\n* Edit the prompts in `my_input` to tailor the answers such as subject domain, length, and other factors.\n* Edit the `my_config.json` file to change the parameters such as `temperature`, and `semantic_ranker` and rerun experiments.\n* Compare different answers to understand how the prompt and question affect the answer quality.\n* Generate a separate set of questions and ground truth answers for each document in the Azure AI Search index. Then rerun the evaluations to see how the answers differ.\n* Alter the prompts to indicate shorter or longer answers by adding the requirement to the end of the prompt. An example is `Please answer in about 3 sentences.`\n\n## Clean up resources and dependencies\n\nThe following steps walk you through the process of cleaning up the resources you used.\n\n### Clean up Azure resources\n\nThe Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\nTo delete the Azure resources and remove the source code, run the following Azure Developer CLI command:\n\n```bash\nazd down --purge\n```\n\n### Clean up GitHub Codespaces and Visual Studio Code\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement that you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign in to the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running codespaces that are sourced from the [Azure-Samples/ai-rag-chat-evaluator](https://github.com/Azure-Samples/ai-rag-chat-evaluator) GitHub repository.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-evaluations/github-codespace-dashboard.png\" alt-text=\"Screenshot that shows all the running codespaces, including their status and templates.\":::\n\n1. Open the context menu for the codespace, and then select **Delete**.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-evaluations/github-codespace-delete.png\" alt-text=\"Screenshot that shows the context menu for a single codespace with the Delete option highlighted.\":::\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\n1. Open the **Command** palette, and search for the **Dev Containers** commands.\n\n1. Select **Dev Containers: Reopen Folder Locally**.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-evaluations/reopen-local-command-palette.png\" alt-text=\"Screenshot that shows the Command palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> After Visual Studio Code stops the running development container, the container still exists in Docker in a stopped state. You can delete the container instance, container image, and volumes from Docker to free up more space on your local machine.\n\n---\n\nReturn to the chat app article to clean up those resources.\n\n* [JavaScript](/azure/developer/javascript/get-started-app-chat-template#clean-up-resources)\n* [Python](/azure/developer/python/get-started-app-chat-template#clean-up-resources)\n\n## Related content\n\n* See the [evaluations repository](https://github.com/Azure-Samples/ai-rag-chat-evaluator).\n* See the [enterprise chat app GitHub repository](https://github.com/Azure-Samples/azure-search-openai-demo).\n* Build a [chat app with Azure OpenAI](https://aka.ms/azai/chat) best-practices solution architecture.\n* Learn about [access control in generative AI apps with Azure AI Search](https://techcommunity.microsoft.com/t5/azure-ai-services-blog/access-control-in-generative-ai-applications-with-azure/ba-p/3956408).\n* Build an [enterprise-ready Azure OpenAI solution with Azure API Management](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/build-an-enterprise-ready-azure-openai-solution-with-azure-api/bc-p/3935407).\n* See [Azure AI Search: Outperforming vector search with hybrid retrieval and ranking capabilities](https://techcommunity.microsoft.com/t5/azure-ai-services-blog/azure-cognitive-search-outperforming-vector-search-with-hybrid/ba-p/3929167).\n"
  },
  {
    "path": "articles/ai/includes/intelligent-app-building-blocks-dotnet.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 05/15/2024\nms.service: azure\n---\n\n| Building block | Description |\n|----------------|-------------|\n| [Load balance with Azure Container Apps](/dotnet/ai/get-started-app-chat-scaling-with-azure-container-apps?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) | Learn how to add load balancing to your application to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure Container Apps to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints. |\n\n\n<!-- \n\n### Secure resources with passwordless connections\n\nApplication requests to most Azure services must be authenticated with keys or [passwordless connections](../passwordless-connections.md). Developers must be diligent to never expose the keys in an unsecure location. Anyone who gains access to the key is able to authenticate to the service. Passwordless authentication offers improved management and security benefits over the account key because there's no key (or connection string) to store.\n\n### Load balance with Azure Container Apps \n\nLearn how to [add load balancing to your application](/dotnet/ai/get-started-app-chat-scaling-with-azure-container-apps) to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure Container Apps to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints.\n\n-->"
  },
  {
    "path": "articles/ai/includes/intelligent-app-building-blocks-java.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 05/15/2024\nms.service: azure\n---\n\n| Building block | Description |\n|----------------|-------------|\n| [Load balance with Azure Container Apps](../../java/ai/get-started-app-chat-scaling-with-azure-container-apps.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) | Learn how to add load balancing to your application to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure Container Apps to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints. |\n\n<!--\n\n### Secure resources with passwordless connections\n\nApplication requests to most Azure services must be authenticated with keys or [passwordless connections](../passwordless-connections.md). Developers must be diligent to never expose the keys in an unsecure location. Anyone who gains access to the key is able to authenticate to the service. Passwordless authentication offers improved management and security benefits over the account key because there's no key (or connection string) to store.\n\n### Load balance with Azure Container Apps \n\nLearn how to [add load balancing to your application](../../java/ai/get-started-app-chat-scaling-with-azure-container-apps.md) to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure Container Apps to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints.\n\n-->"
  },
  {
    "path": "articles/ai/includes/intelligent-app-building-blocks-javascript.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 05/15/2024\nms.service: azure\n---\n\n| Building block | Description |\n|----------------|-------------|\n| [Evaluate chat app answers](../../javascript/ai/get-started-app-chat-evaluations.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) | Learn how to evaluate a chat app's answers against a set of correct or ideal answers (known as ground truth). Whenever you change your chat application in a way which affects the answers, run an evaluation to compare the changes. This demo application offers tools you can use today to make it easier to run evaluations. |\n| [Load balance with Azure Container Apps](../../javascript/ai/get-started-app-chat-scaling-with-azure-container-apps.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) | Learn how to add load balancing to your application to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure Container Apps to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints. |\n| [Load balance with API Management](../../javascript/ai/get-started-app-chat-scaling-with-azure-api-management.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) | Learn how to add load balancing to your application to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure API Management to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints. |\n\n<!--\n\n### Secure resources with passwordless connections\n\nApplication requests to most Azure services must be authenticated with keys or [passwordless connections](../passwordless-connections.md). Developers must be diligent to never expose the keys in an unsecure location. Anyone who gains access to the key is able to authenticate to the service. Passwordless authentication offers improved management and security benefits over the account key because there's no key (or connection string) to store.\n\n### Load balance with Azure Container Apps \n\nLearn how to [add load balancing to your application](../javascript/ai/get-started-app-chat-scaling-with-azure-container-apps.md) to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure Container Apps to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints.\n\n### Load balance with Azure API Management\n\nLearn how to [add load balancing to your application](../../javascript/ai/get-started-app-chat-scaling-with-azure-api-management.md) to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure API Management to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints.\n\n### Evaluate \n\nLearn how to [evaluate a chat app's answers](../../javascript/ai/get-started-app-chat-evaluations.md) against a set of correct or ideal answers (known as ground truth). Whenever you change your chat application in a way which affects the answers, run an evaluation to compare the changes. This demo application offers tools you can use today to make it easier to run evaluations.\n\n-->\n"
  },
  {
    "path": "articles/ai/includes/intelligent-app-building-blocks-python.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 10/10/2024\nms.service: azure\n---\n\n| Building block | Description |\n|----------------|-------------|\n| [Configure document security for the chat app](../../python/get-started-app-chat-document-security-trim.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json)  |  When you build a chat application using the RAG pattern with your own data, make sure that each user receives an answer based on their permissions. An authorized user should have access to answers contained within the documents of the chat app. An unauthorized user shouldn't have access to answers from secured documents they don't have authorization to see. |\n| [Evaluate chat app answers](../../python/get-started-app-chat-evaluations.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) | Learn how to evaluate a chat app's answers against a set of correct or ideal answers (known as ground truth). Whenever you change your chat application in a way which affects the answers, run an evaluation to compare the changes. This demo application offers tools you can use today to make it easier to run evaluations. |\n| [Load balance with Azure Container Apps](../../python/get-started-app-chat-scaling-with-azure-container-apps.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) | Learn how to add load balancing to your application to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure Container Apps to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints. |\n| [Load balance with API Management](../../python/get-started-app-chat-scaling-with-azure-api-management.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) | Learn how to add load balancing to your application to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure API Management to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints. |\n| [Load test the Python chat app with Locust](../../python/get-started-app-chat-app-load-test-locust.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json) | Learn the process to perform load testing on a Python chat application using the RAG pattern with Locust, a popular open-source load testing tool. The primary objective of load testing is to ensure that the expected load on your chat application does not exceed the current Azure OpenAI Transactions Per Minute (TPM) quota. By simulating user behavior under heavy load, you can identify potential bottlenecks and scalability issues in your application. |\n| [Secure your AI App with keyless authentication](../../ai/get-started-securing-your-ai-app.md) | Learn the process to secure your Python Azure OpenAI chat application with keyless authentication. Application requests to most Azure services should be authenticated with keyless or passwordless connections.  Keyless authentication offers improved management and security benefits over the account key because there's no key (or connection string) to store. |\n\n<!--\n\n### Secure Azure resources with passwordless connections\n\nApplication requests to most Azure services must be authenticated with keys or [passwordless connections](../passwordless-connections.md). Developers must be diligent to never expose the keys in an unsecure location. Anyone who gains access to the key is able to authenticate to the service. Passwordless authentication offers improved management and security benefits over the account key because there's no key (or connection string) to store.\n\n### Add document security trimming to Azure AI Search\n\nWhen you build a chat application using the RAG pattern with your own data, make sure that each user receives an answer based on their permissions. Follow the process in this article to [add document access control to your chat app](../../python/get-started-app-chat-document-security-trim.md).\n\nAn authorized user should have access to answers contained within the documents of the chat app. An unauthorized user shouldn't have access to answers from secured documents they don't have authorization to see.\n\n### Evaluate chat app answers\n\nLearn how to [evaluate a chat app's answers](../../python/get-started-app-chat-evaluations.md) against a set of correct or ideal answers (known as ground truth). Whenever you change your chat application in a way which affects the answers, run an evaluation to compare the changes. This demo application offers tools you can use today to make it easier to run evaluations.\n\n### Load balance with Azure Container Apps \n\nLearn how to [add load balancing to your application](../../python/get-started-app-chat-scaling-with-azure-container-apps.md) to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure Container Apps to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints.\n\n### Load balance with Azure API Management\n\nLearn how to [add load balancing to your application](../../python/get-started-app-chat-scaling-with-azure-api-management.md) to extend the chat app beyond the Azure OpenAI token and model quota limits. This approach uses Azure API Management to create three Azure OpenAI endpoints, as well as a primary container to direct incoming traffic to one of the three endpoints.\n\n### Load test with Locust\n\nLearn the process to perform [load testing](../../python/get-started-app-chat-app-load-test-locust.md) on a Python chat application using the RAG pattern with Locust, a popular open-source load testing tool. The primary objective of load testing is to ensure that the expected load on your chat application does not exceed the current Azure OpenAI Transactions Per Minute (TPM) quota. By simulating user behavior under heavy load, you can identify potential bottlenecks and scalability issues in your application. This process is crucial for ensuring that your chat application remains responsive and reliable, even when faced with a high volume of user requests.\n\n-->"
  },
  {
    "path": "articles/ai/includes/intelligent-app-templates-dotnet.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/31/2024\nms.service: azure\n---\n\n### Chat with your data using Azure OpenAI and Azure AI Search with .NET\n\nThis template is a complete end-to-end solution demonstrating the Retrieval-Augmented Generation (RAG) pattern running in Azure. It uses Azure AI Search for retrieval and Azure OpenAI large language models to power ChatGPT-style and Q&A experiences.\n\nTo get started with this template, see [Get started with the chat using your own data sample for .NET](/dotnet/ai/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json). To access the source code and read in-depth details about the template, see the [azure-search-openai-demo-csharp](https://github.com/Azure-Samples/azure-search-openai-demo-csharp) GitHub repo.\n\n:::row:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-chat-dotnet.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-chat-dotnet.png\" alt-text=\"Diagram showing architecture from client to backend app for .NET.\":::\n   :::column-end:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/browser-app-chat-dotnet.png\" lightbox=\"../media/intelligent-app-templates/browser-app-chat-dotnet.png\" alt-text=\"Screenshot of .NET chat app in browser showing several suggestions for chat input and the chat text box to enter a question.\":::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Azure Container Apps<br>Azure Functions|Azure OpenAI<br>Azure Computer Vision<br>Azure Form Recognizer<br>Azure AI Search<br>Azure Storage|GPT 3.5 Turbo<br>GPT 4.0|\n\n\n### Contoso chat retail Copilot with .NET and Semantic Kernel\n\nThis template implements Contoso Outdoors, a conceptual store specializing in outdoor gear for hiking and camping enthusiasts. This virtual store enhances customer engagement and sales support through an intelligent chat agent. This agent is powered by the Retrieval Augmented Generation (RAG) pattern within the Microsoft Azure AI Stack, enriched with Semantic Kernel and Prompty support.\n\nTo access the source code and read in-depth details about the template, see the [contoso-chat-csharp-prompty](https://github.com/Azure-Samples/contoso-chat-csharp-prompty) GitHub repo.\n\n:::row:::\n   :::column span=\"\":::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-contoso-chat-csharp-prompty-dotnet.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-contoso-chat-csharp-prompty-dotnet.png\" alt-text=\"Diagram showing architecture from client to backend app for hiking app.\":::\n   :::column-end:::\n   :::column span=\"\":::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/browser-app-contoso-chat-csharp-prompty-dotnet.png\" lightbox=\"../media/intelligent-app-templates/browser-app-contoso-chat-csharp-prompty-dotnet.png\" alt-text=\"Screenshot of .NET hiking and camping enthusiast store.\":::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Azure Container Apps<br>|Azure OpenAI<br>Microsoft Entra ID<br>Azure Managed Identity<br>Azure Monitor<br>Azure AI Search<br>Microsoft Foundry<br>Azure SQL<br>Azure Storage|GPT 3.5 Turbo<br>GPT 4.0|\n\n\n### Process automation with speech to text and summarization with .NET and GPT 3.5 Turbo\n\nThis template is a process automation solution that receives issues reported by field and shop floor workers at a company called Contoso Manufacturing, a manufacturing company that makes car batteries. The issues are shared by the workers either live through microphone input or pre-recorded as audio files. The solution translates audio input from speech to text and then uses an LLM and Prompty or Promptflow to summarize the issue and return the results in a format specified by the solution.\n\nTo access the source code and read in-depth details about the template, see the [summarization-openai-csharp-prompty](https://github.com/Azure-Samples/summarization-openai-csharp-prompty) GitHub repo.\n\n:::row:::\n   :::column span=\"\":::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-summarization-dotnet.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-summarization-dotnet.png\" alt-text=\"Screenshot of .NET webapp with side chat for speech to text and summarization for Contoso Manufacturing.\":::\n   :::column-end:::\n   :::column span=\"\":::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Azure Container Apps|Speech to Text<br>Summarization<br>Azure OpenAI|GPT 3.5 Turbo|\n"
  },
  {
    "path": "articles/ai/includes/intelligent-app-templates-java.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 11/08/2024\nms.service: azure\n---\n\n\n### Chat with your data using Azure OpenAI and Azure AI Search with Java\n\nThis template is a complete end-to-end solution that demonstrates the Retrieval-Augmented Generation (RAG) pattern running in Azure. It uses Azure AI Search for retrieval and Azure OpenAI large language models to power ChatGPT-style and Q&A experiences.\n\nTo get started with this template, see [Get started with the chat using your own data sample for Java](../../java/ai/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json). To access the source code and read in-depth details about the template, see the [azure-search-openai-demo-java](https://github.com/Azure-Samples/azure-search-openai-demo-java) GitHub repo.\n\n\n:::row:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-chat-java.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-chat-java.png\" alt-text=\"Diagram showing architecture from client to backend app in Java.\":::\n   :::column-end:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/browser-app-chat-java.png\" lightbox=\"../media/intelligent-app-templates/browser-app-chat-java.png\" alt-text=\"Screenshot of Java chat app in browser showing several suggestions for chat input and the chat text box to enter a question.\":::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution                                                | Technologies                                                                                                                                     | AI models    |\n|-----------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|--------------|\n| Azure App Service<br>Azure Container Apps<br>Azure Kubernetes Service | Azure OpenAI<br>Azure AI Search<br>Azure Document Intelligence<br>Azure Storage<br>Azure App Insights<br> Azure Service Bus<br> Azure Event Grid | gpt-35-turbo |\n\n### Multi Agents Banking Assistant with Java and Semantic Kernel\n\nThis project is designed as a Proof of Concept (PoC) to explore the innovative realm of generative AI within the context of multi-agent architectures. By leveraging Java and Microsoft Semantic Kernel AI orchestration framework, our aim is to build a chat web app to demonstrate the feasibility and reliability of using generative AI agents to transform user experience from web clicks to natural language conversations while maximizing reuse of the existing workload data and APIs.\n\nThe core use case revolves around a banking personal assistant designed to revolutionize the way users interact with their bank account information, transaction history, and payment functionalities. Utilizing the power of generative AI within a multi-agent architecture, this assistant aims to provide a seamless, conversational interface through which users can effortlessly access and manage their financial data.\n\nInvoices samples are included in the data folder to make it easy to explore payments feature. The payment agent equipped with optical character recognition (OCR) tools (Azure Document Intelligence) leads the conversation with the user to extract the invoice data and initiate the payment process. Other account fake data - such as transactions, payment methods, and account balance - are also available to be queried by the user. All data and services are exposed as external REST APIs and consumed by the agents to provide the user with the requested information.\n\nTo access the source code and read in-depth details about the template, see the [agent-openai-java-banking-assistant](https://github.com/Azure-Samples/agent-openai-java-banking-assistant) GitHub repo.\n\n\n:::row:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-agent-java.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-agent-java.png\" alt-text=\"Diagram showing architecture for copilot app deployed side-by-side to business microservices.\":::\n   :::column-end:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/browser-app-agent-java.png\" lightbox=\"../media/intelligent-app-templates/browser-app-agent-java.png\" alt-text=\"Screenshot of Java personal banking assistant chat app in browser showing several suggestions for chat input and the chat text box to enter a question.\":::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies                                                                  | AI models             |\n|------------------------|-------------------------------------------------------------------------------|-----------------------|\n| Azure Container Apps   | Azure OpenAI<br>Azure Document Intelligence<br>Azure Storage<br>Azure Monitor | gpt-4o<br>gpt-4o-mini |\n"
  },
  {
    "path": "articles/ai/includes/intelligent-app-templates-javascript.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/31/2024\nms.service: azure\n---\n\n### Chat with your data using Azure OpenAI and Azure AI Search with JavaScript\n\nThis template is a complete end-to-end solution demonstrating the Retrieval-Augmented Generation (RAG) pattern running in Azure. It uses Azure AI Search for retrieval and Azure OpenAI large language models to power ChatGPT-style and Q&A experiences.\n\nTo get started with this template, see [Get started with the chat using your own data sample for JavaScript](../../javascript/ai/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json). To access the source code and read in-depth details about the template, see the [azure-search-openai-javascript](https://github.com/azure-samples/azure-search-openai-javascript) GitHub repo.\n\n:::row:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-chat-javascript.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-chat-javascript.png\" alt-text=\"Diagram showing architecture from client to backend app.\":::\n   :::column-end:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/browser-app-chat-javascript.png\" lightbox=\"../media/intelligent-app-templates/browser-app-chat-javascript.png\" alt-text=\"Screenshot of chat app in browser showing several suggestions for chat input and the chat text box to enter a question.\":::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Azure Container Apps<br>Azure Static Web Apps|Azure OpenAI<br>Azure AI Search<br>Azure Storage<br>Azure Monitor|text-embedding-ada-002|\n\n\n### Azure OpenAI chat frontend\n\nThis template is a minimal OpenAI chat web component that can be hooked to any backend implementation as a client.\n\nTo access the source code and read in-depth details about the template, see the [azure-openai-chat-frontend](https://github.com/Azure-Samples/azure-openai-chat-frontend) GitHub repo.\n\n:::image source=\"../media/intelligent-app-templates/chat-frontend-javascript-video.gif\" alt-text=\"Video demonstrating JavaScript chat frontend application.\":::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Azure Static Web Apps|Azure AI Search<br>Azure OpenAI|GPT 3.5 Turbo<br>GPT4|\n\n\n### Serverless AI chat with RAG using LangChain.js\n\nThe template is a serverless AI chatbot with Retrieval Augmented Generation using LangChain.js and Azure that uses a set of enterprise documents to generate responses to user queries. It uses a fictitious company called Contoso Real Estate, and the experience allows its customers to ask support questions about the usage of its products. The sample data includes a set of documents that describes its terms of service, privacy policy and a support guide.\n\nTo learn how to deploy and run this template, see [Get started with Serverless AI Chat with RAG using LangChain.js](../../javascript/ai/get-started-app-chat-template-langchainjs.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json). To access the source code and read in-depth details about the template, see the [serverless-chat-langchainjs](https://github.com/Azure-Samples/serverless-chat-langchainjs) GitHub repo.\n\nLearn [how to deploy and run](../../javascript/ai/get-started-app-chat-template-langchainjs.md)\nthis JavaScript [reference template](). \n\n:::row:::\n   :::column:::\n      :::image type=\"content\" source=\"../../javascript/media/get-started-app-chat-langchainjs/simple-architecture-diagram.png\" lightbox=\"../../javascript/media/get-started-app-chat-langchainjs/simple-architecture-diagram.png\" alt-text=\"Diagram showing architecture for serverless API using LangChainjs to integrate with Azure OpenAI Service and Azure AI Search.\":::\n   :::column-end:::\n   :::column:::\n      :::image type=\"content\" source=\"../../javascript/media/get-started-app-chat-langchainjs/demo.gif\" lightbox=\"../../javascript/media/get-started-app-chat-langchainjs/demo.gif\" alt-text=\"Browser video of demonstration of JavaScript chat app using RAG and Langchain.js\":::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Azure Static Web Apps<br>Azure Functions|Azure AI Search<br>Azure OpenAI<br>Azure Cosmos DB<br>Azure Storage<br>Azure Managed Identity|GPT4<br>Mistral<br>Ollama|\n\n<!--\n\n### Assistant API with Function Calling\n\nLearn [how to deploy and run](../../javascript/ai/get-started-app-chat-assistants-function-calling.md) this JavaScript [reference template](https://github.com/Azure-Samples/azure-openai-assistant-javascript). This application is a serverless Azure OpenAI Assistant Quick Start which implements an assistants app using JavaScript, Azure OpenAI Service assistants with function calling, and Azure Functions to get the latest stock price.\n\nhttps://review.learn.microsoft.com/en-us/azure/developer/javascript/media/get-started-app-chat-assistants-function-calling/azure-openai-assistant-diagram.png\n\n:::row:::\n   :::column:::\n      :::image type=\"content\" source=\"../../javascript/media/get-started-app-chat-assistants-function-calling/azure-openai-assistant-diagram.png\" lightbox=\"../../javascript/media/get-started-app-chat-assistants-function-calling/azure-openai-assistant-diagram.png\" alt-text=\"Diagram showing architecture for assistants API using LangChainjs to integrate with Azure OpenAI Service.\":::\n   :::column-end:::\n   :::column:::\n      :::image type=\"content\" source=\"../../javascript/media/get-started-app-chat-langchainjs/demo.gif\" lightbox=\"../../javascript/media/get-started-app-chat-langchainjs/demo.gif\" alt-text=\"Browser image of demonstration of JavaScript assistants chat app.\":::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Azure Static Web Apps<br>Azure Functions|Azure OpenAI<br>Azure Managed Identity|GPT 3.5 Turbo|\n\n-->"
  },
  {
    "path": "articles/ai/includes/intelligent-app-templates-python.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 5/16/2024\nms.service: azure\n---\n\n### Chat with your data using Azure OpenAI and Azure AI Search with Python\n\nThis template is a complete end-to-end solution demonstrating the Retrieval-Augmented Generation (RAG) pattern running in Azure. It uses Azure AI Search for retrieval and Azure OpenAI large language models to power ChatGPT-style and Question and Answer (Q&A) experiences.\n\nTo get started with this template, see [Get started with the chat using your own data sample for Python](../../python/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json). To access the source code and read in-depth details about the template, see the [azure-search-openai-demo](https://github.com/Azure-Samples/azure-search-openai-demo) GitHub repo.\n\n:::row:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-chat-python.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-chat-python.png\" alt-text=\"Screenshot of chat app in browser showing several suggestions for chat input and the chat text box to enter a question.\":::\n   :::column-end:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/browser-app-chat-python.png\" lightbox=\"../media/intelligent-app-templates/browser-app-chat-python.png\" alt-text=\"Diagram showing architecture from client to backend app.\":::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n| Azure Container Apps | Azure OpenAI<br>Azure AI Search<br>Azure Blob Storage<br>Azure Monitor<br>Azure Document Intelligence<br> | GPT 3.5 Turbo<br>GPT 4<br>GPT 4o<br>GPT 4o-mini |\n\n### Multi-Modal Creative Writing Copilot with DALL-E\n\nThis template is a creative writing multi-agent solution to help users write articles. It demonstrates how to create and work with AI agents driven by [Azure OpenAI](/azure/ai-services/openai/).\n\nIt includes:\n\n1. A Flask app that takes an article and instruction from a user.\n1. A research agent that uses the [Bing Search API](/bing/search-apis/bing-web-search) to research the article.\n1. A product agent that uses [Azure AI Search](/azure/search/) to do a semantic similarity search for related products from a vector store.\n1. A writer agent to combine the research and product information into a helpful article.\n1. An editor agent to refine the article presented to the user.\n\nTo access the source code and read in-depth details about the template, see the [agent-openai-python-prompty](https://github.com/Azure-Samples/agent-openai-python-prompty) GitHub repo.\n\n:::row:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-agent-openai-prompty-python.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-agent-openai-prompty-python.png\" alt-text=\"Architectural diagram of python multi-modal creative writing copilot application.\":::\n   :::column-end:::\n   :::column:::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Azure Container Registry<br>Azure Kubernetes<br>|Azure OpenAI<br>Bing Search<br>Azure Managed Identity<br>Azure Monitor<br>Azure AI Search<br>Microsoft Foundry|GPT 3.5 Turbo<br>GPT 4.0<br>DALL-E|\n\n### Contoso Chat Retail Copilot with Foundry\n\nThis template implements _Contoso Chat_ - a retail copilot solution for Contoso Outdoor that uses a _retrieval augmented generation_ design pattern to ground chatbot responses in the retailer's product and customer data. Customers can ask questions from the website in natural language, and get relevant responses with potential recommendations based on their purchase history - with responsible AI practices to ensure response quality and safety.\n\nThis template illustrates the end-to-end workflow (GenAIOps) for building a RAG-based copilot **code-first** with Azure AI and Prompty. By exploring and deploying this sample, learn to:\n\n1. Ideate and iterate rapidly on app prototypes using [Prompty](https://prompty.ai)\n1. Deploy and use [Azure OpenAI](/azure/ai-services/openai/concepts/models?tabs=python-secure%2Cglobal-standard%2Cstandard-chat-completions) models for chat, embeddings, and evaluation\n1. Use Azure AI Search (indexes) and Azure Cosmos DB (databases) for your data\n1. Evaluate chat responses for quality using AI-assisted evaluation flows\n1. Host the application as a FastAPI endpoint deployed to Azure Container Apps\n1. Provision and deploy the solution using the Azure Developer CLI\n1. Support Responsible AI practices with content safety & assessments\n\nTo access the source code and read in-depth details about the template, see the [contoso-chat](https://github.com/Azure-Samples/contoso-chat) GitHub repo.\n\n:::row:::\n   :::column span=\"\":::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-contoso-chat-python.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-contoso-chat-python.png\" alt-text=\"Diagram showing architecture from client to backend app for hiking app.\":::\n   :::column-end:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/browser-app-contoso-chat-retail-copilot-python.png\" lightbox=\"../media/intelligent-app-templates/browser-app-contoso-chat-retail-copilot-python.png\" alt-text=\"Screenshot of chat app with prompt flow in visual editor for Contoso chat retail copilot.\":::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Azure Container Apps<br>|Azure OpenAI<br>Azure AI Search<br>Foundry<br>Prompty<br>Azure Cosmos DB|GPT 3.5 Turbo<br>GPT 4.0<br>Managed Integration Runtime (MIR)|\n\n### Process automation with speech to text and summarization with Foundry\n\nThis template creates a web-based app that allows workers at a company called Contoso Manufacturing to report issues via text or speech. Audio input is translated to text and then summarized to highlight important information and the report is sent to the appropriate department.\n\nTo access the source code and read in-depth details about the template, see the [summarization-openai-python-promptflow](https://github.com/Azure-Samples/summarization-openai-python-promptflow) GitHub repo.\n\n:::row:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-speech-to-text-summarization-python.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-speech-to-text-summarization-python.png\" alt-text=\"Architectural diagram for process automation with speech-to-text and summarization with AI Studio for Python.\":::\n   :::column-end:::\n   :::column:::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Azure Container Apps|Foundry<br>Speech to Text Service<br>Prompty<br>Managed Integration Runtime (MIR)|GPT 3.5 Turbo|\n\n### Assistant API Analytics Copilot with Python and Foundry\n\nThis template is an Assistant API to chat with tabular data and perform analytics in natural language.\n\nTo access the source code and read in-depth details about the template, see the [assistant-data-openai-python-promptflow](https://github.com/Azure-Samples/assistant-data-openai-python-promptflow) GitHub repo.\n\n:::row:::\n   :::column:::\n      :::image type=\"content\" source=\"../media/intelligent-app-templates/architecture-diagram-assistant-data-openai-promptflow-python.png\" lightbox=\"../media/intelligent-app-templates/architecture-diagram-assistant-data-openai-promptflow-python.png\" alt-text=\"Architectural diagram for an Assistant API to chat with tabular data and perform analytics in natural language.\":::\n   :::column-end:::\n   :::column:::\n   :::column-end:::\n:::row-end:::\n\nThis template demonstrates the use of these features.\n\n| Azure hosting solution | Technologies | AI models |\n|--|--|--|\n|Machine Learning service|Azure AI Search<br>Foundry<br>Managed Integration Runtime (MIR)<br>Azure OpenAI|GPT 3.5 Turbo<br>GPT 4|\n"
  },
  {
    "path": "articles/ai/includes/redeploy-procedure-chat-azure-api-management.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 06/26/2025\nms.service: azure\n---\n\n## Redeploy the chat app with the load balancer endpoint\n\nThese examples are completed on the chat app sample.\n\n#### [Initial deployment](#tab/initial-deployment)\n\n1. Open the chat app sample's dev container by using one of the following choices.\n\n    |Language|GitHub Codespaces|Visual Studio Code|\n    |--|--|--|\n    |.NET|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo-csharp)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo-csharp)|\n    |JavaScript|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-javascript)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-javascript)|\n    |Python|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo)|\n\n1. Sign in to the Azure Developer CLI (`AZD`):\n\n    ```bash\n    azd auth login\n    ```\n\n    Finish the sign-in instructions.\n\n1. Create an `AZD` environment with a name such as `chat-app`:\n\n    ```bash\n    azd env new <name>\n    ```\n\n1. Add the following environment variable, which tells the chat app's backend to use a custom URL for the Azure OpenAI requests:\n\n    ```bash\n    azd env set OPENAI_HOST azure_custom\n    ```\n\n1. Add this environment variable to tell the chat app’s backend the custom URL for the Azure OpenAI request:\n\n    ```bash\n    azd env set AZURE_OPENAI_CUSTOM_URL <APIM_GATEWAY_URL>\n    ```\n\n1. Deploy the chat app:\n\n    ```bash\n    azd up\n    ```\n\n#### [Redeployment](#tab/redeployment)\n\n1. Reopen the chat app sample's dev container by using one of the following choices.\n\n    |Language|GitHub Codespaces|Visual Studio Code|\n    |--|--|--|\n    |.NET|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo-csharp)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo-csharp)|\n    |JavaScript|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-javascript)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-javascript)|\n    |Python|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo)|\n\n1. Add the following environment variable, which tells the chat app's backend to use a custom URL for the Azure OpenAI requests:\n\n    ```bash\n    azd env set OPENAI_HOST azure_custom\n    ```\n\n1. Add this environment variable to tell the chat app’s backend the custom URL for the Azure OpenAI request:\n\n    ```bash\n    azd env set set AZURE_OPENAI_CUSTOM_URL <APIM_GATEWAY_URL>\n    ```\n\n1. Deploy the chat app:\n\n    ```bash\n    azd up\n    ```\n\n    Wait until this process finishes before you continue.\n\n---\n"
  },
  {
    "path": "articles/ai/includes/redeploy-procedure-chat.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 06/26/2025\nms.service: azure\n---\n\n## Redeploy the chat app with the load balancer endpoint\n\nThese examples are completed on the chat app sample.\n\n#### [Initial deployment](#tab/initial-deployment)\n\n1. Open the chat app sample's dev container by using one of the following choices.\n\n    |Language|GitHub Codespaces|Visual Studio Code|\n    |--|--|--|\n    |.NET|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo-csharp)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo-csharp)|\n    |JavaScript|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-javascript)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-javascript)|\n    |Python|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo)|\n\n1. Sign in to the Azure Developer CLI (`AZD`):\n\n    ```bash\n    azd auth login\n    ```\n\n    Finish the sign-in instructions.\n\n1. Create an `AZD` environment with a name such as `chat-app`:\n\n    ```bash\n    azd env new <name>\n    ```\n\n1. Add the following environment variable, which tells the chat app's backend to use a custom URL for the Azure OpenAI requests:\n\n    ```bash\n    azd env set OPENAI_HOST azure_custom\n    ```\n\n1. Add the following environment variable. Substitute `<CONTAINER_APP_URL>` for the URL from the previous section. This action tells the chat app's backend what the value is of the custom URL for the Azure OpenAI request.\n\n    ```bash\n    azd env set AZURE_OPENAI_CUSTOM_URL <CONTAINER_APP_URL>\n    ```\n\n1. Deploy the chat app:\n\n    ```bash\n    azd up\n    ```\n\n#### [Redeployment](#tab/redeployment)\n\n1. Reopen the chat app sample's dev container by using one of the following choices.\n\n    |Language|GitHub Codespaces|Visual Studio Code|\n    |--|--|--|\n    |.NET|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo-csharp)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo-csharp)|\n    |JavaScript|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-javascript)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-javascript)|\n    |Python|[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo)|[![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/azure-samples/azure-search-openai-demo)|\n\n1. Add the following environment variable, which tells the chat app's backend to use a custom URL for the Azure OpenAI requests:\n\n    ```bash\n    azd env set OPENAI_HOST azure_custom\n    ```\n\n1. Add the following environment variable, which tells the chat app's backend what the value is of the custom URL for the Azure OpenAI request:\n\n    ```bash\n    azd env set CONTAINER_APP_URL <CONTAINER_APP_URL>\n    ```\n\n1. Deploy the chat app:\n\n    ```bash\n    azd up\n    ```\n    \n    Wait until this process finishes before you continue.\n\n---\n\nUse the chat app with the confidence that it scales across many users without running out of quota.\n"
  },
  {
    "path": "articles/ai/includes/scaling-load-balancer-capacity.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.service: azure\n---\n\n## Configure the TPM quota\n\nBy default, each of the Azure OpenAI Models in Microsoft Foundry instances in the load balancer is deployed with a capacity of 30,000 tokens per minute (TPM). You can use the chat app with the confidence that it scales across many users without running out of quota. Change this value when:\n\n* You get deployment capacity errors: Lower the value.\n* You need higher capacity: Raise the value.\n\n1. Use the following command to change the value:\n\n    ```bash\n    azd env set OPENAI_CAPACITY 50\n    ```\n\n1. Redeploy the load balancer:\n\n    ```bash\n    azd up\n    ```\n"
  },
  {
    "path": "articles/ai/includes/scaling-load-balancer-cleanup-azure-api-management.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.service: azure\n---\n\n## Clean up resources\n\nWhen you're finished with the chat app and the load balancer, clean up the resources. The Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\n### Clean up the chat app resources\n\nReturn to the chat app article to clean up those resources.\n\n* [.NET](/dotnet/ai/get-started-app-chat-template#clean-up-resources)\n* [JavaScript](/azure/developer/javascript/get-started-app-chat-template#clean-up-resources)\n* [Python](/azure/developer/python/get-started-app-chat-template#clean-up-resources)\n\n### Clean up the load balancer resources\n\nDelete the Azure resources and remove the source code:\n\n```bash\nazd down --purge --force\n```\n\nThe switches provide:\n\n* `purge`: Deleted resources are immediately purged. You can reuse the Azure OpenAI tokens per minute.\n* `force`: The deletion happens silently, without requiring user consent.\n\n### Clean up resources\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement that you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign in to the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running codespaces that are sourced from the [`azure-samples/openai-apim-lb`](https://github.com/azure-samples/openai-apim-lb) GitHub repository.\n\n    :::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-api-management/codespace-clean-up-repository.png\" alt-text=\"Screenshot that shows all the running codespaces including their status and templates.\":::\n\n1. Open the context menu for the GitHub Codespaces item, and then select **Delete**.\n\n    :::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-api-management/codespace-clean-up-repository-delete.png\" alt-text=\"Screenshot that shows the context menu for a single codespace with the Delete option highlighted.\":::\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\n1. Open the **Command** palette, and search for the **Dev Containers** commands.\n1. Select **Dev Containers: Reopen Folder Locally**.\n\n    :::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-api-management/reopen-local-command-palette.png\" alt-text=\"Screenshot that shows the Command palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. Free up space on your local machine by deleting the container instance, image, and volumes from Docker.\n\n---\n\n## Get help\n\nIf you have trouble deploying the Azure API Management load balancer, add your issue to the repository's [Issues](https://github.com/Azure-Samples/openai-apim-lb/issues) webpage.\n"
  },
  {
    "path": "articles/ai/includes/scaling-load-balancer-cleanup-azure-container-apps.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.service: azure\n---\n\n## Clean up resources\n\nWhen you're finished with the chat app and the load balancer, clean up the resources. The Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\n### Clean up chat app resources\n\nReturn to the chat app article to clean up the resources:\n\n* [.NET](/dotnet/ai/get-started-app-chat-template#clean-up-resources)\n* [JavaScript](/azure/developer/javascript/get-started-app-chat-template#clean-up-resources)\n* [Python](/azure/developer/python/get-started-app-chat-template#clean-up-resources)\n\n### Clean upload balancer resources\n\nDelete the Azure resources and remove the source code:\n\n```bash\nazd down --purge --force\n```\n\nThe switches provide:\n\n* `purge`: Deleted resources are immediately purged so that you can reuse the Azure OpenAI Models in Microsoft Foundry tokens per minute.\n* `force`: The deletion happens silently, without requiring user consent.\n\n### Clean up GitHub Codespaces and Visual Studio Code\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement that you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign in to the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running codespaces that are sourced from the [azure-samples/openai-aca-lb](https://github.com/azure-samples/openai-aca-lb) GitHub repository.\n\n    :::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-container-apps/codespace-clean-up-repository.png\" alt-text=\"Screenshot that shows all the running codespaces, including their status and templates.\":::\n\n1. Open the context menu for the codespace, and then select **Delete**.\n\n    :::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-container-apps/codespace-clean-up-repository-delete.png\" alt-text=\"Screenshot that shows the context menu for a single codespace with the Delete option highlighted.\":::\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\n1. Open the **Command** palette, and search for the **Dev Containers** commands.\n1. Select **Dev Containers: Reopen Folder Locally**.\n\n    :::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-container-apps/reopen-local-command-palette.png\" alt-text=\"Screenshot that shows the Command palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. Free up space on your local machine by deleting the container instance, image, and volumes from Docker.\n\n---\n\n## Get help\n\nIf you have trouble deploying the Azure Container Apps load balancer, add your issue to the repository's [Issues](https://github.com/Azure-Samples/openai-aca-lb/issues) webpage.\n"
  },
  {
    "path": "articles/ai/includes/scaling-load-balancer-introduction-azure-api-management.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.service: azure\n---\n\nLearn how to add enterprise-grade load balancing to your application to extend the chat app beyond the Azure OpenAI Models in Microsoft Foundry token and model quota limits. This approach uses Azure API Management to intelligently direct traffic between three Azure OpenAI resources.\n\nThis article requires you to deploy two separate samples:\n\n* Chat app:\n  * Wait to deploy the chat app until after the load balancer sample is deployed.\n  * If you already deployed the chat app once, change the environment variable to support a custom endpoint for the load balancer and redeploy it again.\n* Load balancer with Azure API Management.\n\n> [!NOTE]\n> This article uses one or more [AI app templates](../intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained reference implementations that are easy to deploy. They help to ensure a high-quality starting point for your AI apps.\n\n## Architecture for load balancing Azure OpenAI with Azure API Management\n\nBecause the Azure OpenAI Models in Microsoft Foundry have specific token and model quota limits, a chat app that uses a single Azure OpenAI resource is prone to have conversation failures because of those limits.\n\n:::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-api-management/chat-app-original-architecuture.png\" alt-text=\"Diagram that shows chat app architecture with an Azure OpenAI resource highlighted.\":::\n\nTo use the chat app without hitting those limits, use a load-balanced solution with API Management. This solution seamlessly exposes a single endpoint from API Management to your chat app server.\n\n:::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-api-management/chat-app-architecuture.png\" alt-text=\"Diagram that shows chat app architecture with Azure API Management in front of three Azure OpenAI resources.\":::\n\nThe API Management resource, as an API layer, sits in front of a set of Azure OpenAI resources. The API layer applies to two scenarios: normal and throttled. During a *normal scenario* where token and model quota is available, the Azure OpenAI resource returns a 200 back through the API layer and backend app server.\n\n:::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-api-management/intro-load-balance-normal-usage.png\" alt-text=\"Diagram that shows a normal scenario with three Azure OpenAI endpoint groups. The first group of two endpoints gets successful traffic. \":::\n\nWhen a resource is *throttled* because of quota limits, the API layer can retry a different Azure OpenAI resource immediately to fulfill the original chat app request.\n\n:::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-api-management/intro-load-balance-throttled-usage.png\" alt-text=\"Diagram that shows a throttling scenario with a 429 failing response code and a response header of how many seconds the client has to wait to retry.\":::\n"
  },
  {
    "path": "articles/ai/includes/scaling-load-balancer-introduction-azure-container-apps.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.service: azure\n---\n\nLearn how to add load balancing to your application to extend the chat app beyond the Azure OpenAI Models in Microsoft Foundry token and model quota limits. This approach uses Azure Container Apps to create three Azure OpenAI endpoints and a primary container to direct incoming traffic to one of the three endpoints.\n\nThis article requires you to deploy two separate samples:\n\n* Chat app\n    * If you haven't deployed the chat app yet, wait until after the load balancer sample is deployed.\n    * If you already deployed the chat app once, change the environment variable to support a custom endpoint for the load balancer and redeploy it again.\n    * The chat app is available in these languages:\n\n        * [.NET](/dotnet/ai/get-started-app-chat-template)\n        * [JavaScript](/azure/developer/javascript/get-started-app-chat-template)\n        * [Python](/azure/developer/python/get-started-app-chat-template)\n\n* Load balancer app\n\n> [!NOTE]\n> This article uses one or more [AI app templates](/azure/developer/ai/intelligent-app-templates) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained reference implementations that are easy to deploy. They help to ensure a high-quality starting point for your AI apps.\n\n## Architecture for load balancing Azure OpenAI with Azure Container Apps\n\nBecause the Azure OpenAI Models in Microsoft Foundry resource has specific token and model quota limits, a chat app that uses a single Azure OpenAI Models in Microsoft Foundry resource is prone to have conversation failures because of those limits.\n\n:::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-container-apps/chat-app-original-architecuture.png\" alt-text=\"Diagram that shows chat app architecture with the Azure OpenAI Models in Microsoft Foundry resource highlighted.\":::\n\nTo use the chat app without hitting those limits, use a load-balanced solution with Container Apps. This solution seamlessly exposes a single endpoint from Container Apps to your chat app server.\n\n:::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-container-apps/chat-app-architecuture.png\" alt-text=\"Diagram that shows chat app architecture with Azure Container Apps in front of three Azure OpenAI resources.\":::\n\nThe container app sits in front of a set of Azure OpenAI resources. The container app solves two scenarios: normal and throttled. During a *normal scenario* where token and model quota is available, the Azure OpenAI resource returns a 200 back through the container app and app server.\n\n:::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-container-apps/intro-load-balance-normal-usage.png\" alt-text=\"Diagram that shows a normal scenario. The normal scenario shows three Azure OpenAI endpoint groups with the first group of two endpoints getting successful traffic. \":::\n\nWhen a resource is in a *throttled scenario* because of quota limits, the container app can retry a different Azure OpenAI resource immediately to fulfill the original chat app request.\n\n:::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-container-apps/intro-load-balance-throttled-usage.png\" alt-text=\"Diagram that shows a throttling scenario with a 429 failing response code and a response header of how many seconds the client has to wait to retry.\":::\n"
  },
  {
    "path": "articles/ai/includes/scaling-load-balancer-logs-azure-container-apps.md",
    "content": "---\nms.topic: include\nms.date: 01/30/2026\nms.service: azure\nms.custom:\n  - overview\n  - sfi-image-nochange\n---\n\n\n## Stream logs to see the load balancer results\n\n1. In the [Azure portal](https://portal.azure.com), search your resource group.\n1. From the list of resources in the group, select the Azure Container Apps resource.\n1. Select **Monitoring** > **Log stream** to view the log.\n1. Use the chat app to generate traffic in the log.\n1. Look for the logs, which reference the Azure OpenAI resources. Each of the three resources has its numeric identity in the log comment that begins with `Proxying to https://openai3`, where `3` indicates the third Azure OpenAI resource.\n\n    :::image type=\"content\" source=\"../media/get-started-scaling-load-balancer-azure-container-apps/container-app-log-stream.png\" alt-text=\"Screenshot that shows Azure Container Apps streaming logs with two log lines highlighted to demonstrate the log comments. \":::\n\nWhen the load balancer receives status that the request exceeds quota, the load balancer automatically rotates to another resource.\n"
  },
  {
    "path": "articles/ai/includes/scaling-load-balancer-procedure-azure-api-management.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.service: azure\n---\n\n## Open the Azure API Management local balancer sample app\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n[![Open in GitHub Codespaces.](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/openai-aca-lb)\n\n> [!IMPORTANT]\n> All GitHub accounts can use GitHub Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally by using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n[![Screenshot that shows opening this project in Dev Containers.](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/Azure-Samples/openai-aca-lb)\n\n---\n\n## Deploy the Azure API Management load balancer\n\n1. To deploy the load balancer to Azure, sign in to the Azure Developer CLI (`AZD`):\n\n    ```bash\n    azd auth login\n    ```\n\n1. Finish the sign-in instructions.\n1. Deploy the load balancer app:\n\n    ```bash\n    azd up\n    ```\n\n    Select a subscription and region for the deployment. They don't have to be the same subscription and region as the chat app.\n\n1. Wait for the deployment to finish before you continue. This process might take up to 30 minutes.\n\n## Get the load balancer endpoint\n\nRun the following Bash command to see the environment variables from the deployment. You need this information later.\n\n```bash\nazd env get-values | grep APIM_GATEWAY_URL\n```\n"
  },
  {
    "path": "articles/ai/includes/scaling-load-balancer-procedure-azure-container-apps.md",
    "content": "---\nms.custom: overview\nms.topic: include\nms.date: 01/30/2026\nms.service: azure\n---\n\n## Open the Container Apps load balancer sample app\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n[![Open in GitHub Codespaces.](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/openai-aca-lb)\n\n> [!IMPORTANT]\n> All GitHub accounts can use GitHub Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally by using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n[![Open this project in Dev Containers.](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/Azure-Samples/openai-aca-lb)\n\n---\n\n## Deploy the Azure Container Apps load balancer\n\n1. Sign in to the Azure Developer CLI to provide authentication to the provisioning and deployment steps:\n\n    ```bash\n    azd auth login --use-device-code\n    ```\n\n1. Set an environment variable to use Azure CLI authentication to the post provision step:\n\n    ```bash\n    azd config set auth.useAzCliAuth \"true\"\n    ```\n\n1. Deploy the load balancer app:\n\n    ```bash\n    azd up\n    ```\n\n    Select a subscription and region for the deployment. They don't have to be the same subscription and region as the chat app.\n\n1. Wait for the deployment to finish before you continue.\n\n## Get the deployment endpoint\n\n1. Use the following command to display the deployed endpoint for the container app:\n\n    ```bash\n    azd env get-values\n    ```\n\n1. Copy the `CONTAINER_APP_URL` value. You use it in the next section.\n"
  },
  {
    "path": "articles/ai/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Develop AI apps using Azure services\nsummary: |\n  Build applications with generative AI capabilities on Azure.\n\nmetadata:\n  title: Develop AI apps using Azure services\n  description: Get started developing generative AI capabilities into your applications.\n  ms.date: 01/30/2026\n  ms.topic: landing-page\n  ms.subservice: intelligent-apps\n  ms.collection: collection\n\nlandingContent:\n  - title: Fundamentals of generative AI\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Introduction to generative AI\n            url: introduction-build-generative-ai-solutions.md\n          - text: Concepts and considerations\n            url: gen-ai-concepts-considerations-developers.md\n          - text: Augment LLMs with RAG And Fine-tuning\n            url: augment-llm-rag-fine-tuning.md\n          - text: Advanced Retrieval-Augmented Generation\n            url: advanced-retrieval-augmented-generation.md\n\n  - title: AI app templates\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: AI app templates overview\n            url: intelligent-app-templates.md\n      - linkListType: get-started\n        links:\n          - text: Chat with your data using Python\n            url: ../python/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n          - text: Chat with your data using JavaScript\n            url: ../javascript/ai/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n          - text: Chat with your data using Java\n            url: ../java/ai/get-started-app-chat-template.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n          - text: Chat with your data using .NET\n            url: /dotnet/ai/get-started-app-chat-template?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n\n  - title: AI app design\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: AI agent orchestration patterns\n            url: /azure/architecture/ai-ml/guide/ai-agent-design-patterns?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n          - text: Design your AI app to support foundation model life cycles\n            url: /azure/architecture/ai-ml/guide/manage-foundation-models-lifecycle?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n\n  - title: Agents with Model Context Protocol (MCP)\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Build Agents using Model Context Protocol on Azure\n            url: intro-agents-mcp.md  \n          - text: Build a TypeScript MCP server using Azure Container Apps \n            url: build-mcp-server-ts.md    \n          - text: Create OpenAI-powered agents using MCP\n            url: build-openai-mcp-server-dotnet.md\n          - text: Build AI agent tools using remote MCP with Azure Functions\n            url: https://techcommunity.microsoft.com/blog/appsonazureblog/build-ai-agent-tools-using-remote-mcp-with-azure-functions/4401059     \n          - text: Host Remote MCP Servers in Azure App Service\n            url: https://techcommunity.microsoft.com/blog/appsonazureblog/host-remote-mcp-servers-in-azure-app-service/4405082     \n  - title: Discover and try new models\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Develop reasoning apps with DeepSeek models on Microsoft Foundry using the OpenAI SDK\n            url: how-to/use-reasoning-model-inference.md\n      - linkListType: tutorial\n        links:\n          - text: Get started with DeepSeek-R1 reasoning model\n            url: /azure/ai-foundry/model-inference/tutorials/get-started-deepseek-r1?tabs=python\n  - title: AI app security\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Security planning for LLM-based applications\n            url: /ai/playbook/technology-guidance/generative-ai/mlops-in-openai/security/security-plan-llm-application?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json     \n      - linkListType: how-to-guide\n        links:\n          - text: Use Azure OpenAI without keys\n            url: keyless-connections.md\n          - text: Use Azure AI Search without keys\n            url: /azure/search/keyless-connections?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n      - linkListType: get-started\n        links:\n          - text: Secure your AI App with keyless authentication\n            url: get-started-securing-your-ai-app.md\n\n  - title: Resources by programming language\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Python\n            url: ../python/azure-ai-for-python-developers.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n          - text: JavaScript\n            url: ../javascript/ai/azure-ai-for-javascript-developers.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n          - text: Java\n            url: ../java/ai/azure-ai-for-java-developers.md?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n          - text: C# and .NET\n            url: /dotnet/ai/azure-ai-for-dotnet-developers?toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json\n          - text: Go\n            url: ../go/azure-ai-for-go-developers.md?&toc=/azure/developer/ai/toc.json&bc=/azure/developer/ai/breadcrumb/toc.json"
  },
  {
    "path": "articles/ai/intelligent-app-templates.md",
    "content": "---\ntitle: AI app templates\ndescription: This article describes the AI app templates provided as GitHub repositories to build, deploy, and extend on Azure.\nkeywords: ai, azure openai service\nms.service: azure\nms.topic: overview\nms.date: 09/02/2025\nms.custom: overview, devx-track-dotnet, devx-track-extended-java, devx-track-js, devx-track-python, build-2024-intelligent-apps\nzone_pivot_group_filename: developer/intro/intro-zone-pivot-groups.yml\nzone_pivot_groups: intelligent-apps-languages-top-four\n---\n\n# AI app templates\n\nThis section of the documentation introduces you to the *AI app templates* and related articles that use these templates to demonstrate how to perform key developer tasks. AI app templates provide you with well-maintained, easy to deploy reference implementations that help to ensure a high-quality starting point for your AI apps.\n\nThere are two categories of AI app templates, **building blocks** and **end-to-end solutions**. The following sections introduce some of the key templates in each category for the programming language you selected at the top of this article.\n\n:::zone pivot=\"dotnet\"\n\nTo browse a comprehensive list including these and other C# templates, see the AI app templates on the [AI App Template gallery](https://azure.github.io/ai-app-templates/?tags=dotnetCsharp).\n\n:::zone-end\n\n:::zone pivot=\"python\"\n\nTo browse a comprehensive list including these and other Python templates, see the AI app templates on the [AI App Template gallery](https://azure.github.io/ai-app-templates/?tags=python).\n\n:::zone-end\n\n:::zone pivot=\"java\"\n\nTo browse a comprehensive list including these and other Java templates, see the AI app templates on the [AI App Template gallery](https://azure.github.io/ai-app-templates/?tags=java).\n\n:::zone-end\n\n:::zone pivot=\"javascript\"\n\nTo browse a comprehensive list including these and other JavaScript / TypeScript templates, see the AI app templates on the [AI App Template gallery](https://azure.github.io/ai-app-templates/?tags=javascript&tags=typescript).\n\n:::zone-end\n\n## Building blocks\n\nBuilding blocks are smaller-scale samples that focus on specific scenarios and tasks. Most building blocks demonstrate functionality that uses the [end-to-end solution](#end-to-end-solutions) for a chat app that uses your own data.\n\n:::zone pivot=\"dotnet\"\n\n[!INCLUDE [//build 2024 templates](../ai/includes/intelligent-app-building-blocks-dotnet.md)]\n\n:::zone-end\n\n:::zone pivot=\"python\"\n\n[!INCLUDE [//build 2024 templates](../ai/includes/intelligent-app-building-blocks-python.md)]\n\n\n:::zone-end\n\n:::zone pivot=\"java\"\n\n[!INCLUDE [//build 2024 templates](../ai/includes/intelligent-app-building-blocks-java.md)]\n\n\n:::zone-end\n\n\n:::zone pivot=\"javascript\"\n\n[!INCLUDE [//build 2024 templates](../ai/includes/intelligent-app-building-blocks-javascript.md)]\n\n\n:::zone-end\n\n\n## End-to-end solutions\n\nEnd-to-end solutions are comprehensive reference samples including documentation, source code, and deployment to allow you to take and extend for your own purposes.\n\n:::zone pivot=\"dotnet\"\n\n[!INCLUDE [//build 2024 templates](../ai/includes/intelligent-app-templates-dotnet.md)]\n\n:::zone-end\n\n:::zone pivot=\"python\"\n\n[!INCLUDE [//build 2024 templates](../ai/includes/intelligent-app-templates-python.md)]\n\n\n:::zone-end\n\n:::zone pivot=\"java\"\n\n[!INCLUDE [//build 2024 templates](../ai/includes/intelligent-app-templates-java.md)]\n\n\n:::zone-end\n\n\n:::zone pivot=\"javascript\"\n\n[!INCLUDE [//build 2024 templates](../ai/includes/intelligent-app-templates-javascript.md)]\n\n\n:::zone-end\n"
  },
  {
    "path": "articles/ai/intro-agents-mcp.md",
    "content": "---\ntitle: \"Build Agents using Model Context Protocol on Azure\"\ndescription: \"This article explains how to build AI agents using the Model Context Protocol (MCP) on Azure to create intelligent, scalable applications.\"\nms.date: 09/04/2025\nms.topic: concept-article\nms.collection: ce-skilling-ai-copilot\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.subservice: intelligent-apps\n#CustomerIntent: As a developer, I want to understand how to build AI agents using Model Context Protocol so that I can leverage them in modern applications.\n---\n# Build Agents using Model Context Protocol on Azure\n\nThe [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) lets apps provide capabilities and context to a large language model. A key feature of MCP is defining tools that AI agents use to complete tasks. MCP servers can run locally, but remote MCP servers are crucial for sharing tools at cloud scale. The article aims to help developers understand these tools to create innovative solutions.\n\nDevelopers can use the MCP in two main ways:\n\n-\t**Consume existing MCP servers**: Most developers use existing MCP servers, like the [Azure MCP Server](../azure-mcp-server/index.yml), to build agentic functionality into intelligent apps.\n\n      Explore the [OpenAI MCP Agent Building Block AI template](https://aka.ms/mcp/openai), an example of consuming an existing MCP server. This template creates an MCP agent app in .NET that uses Azure OpenAI and connects to a remote MCP server written in TypeScript.\n\n      The following diagram shows a simple architecture of the OpenAI MCP Agent Building Block:\n      :::image type=\"content\" source=\"./media/intro-agents-mcp/openai-mcp-agent-building-block-diagram.png\" alt-text=\"Diagram showing architecture from MCP client to MCP server.\":::\n\n-\t**Develop your own MCP server**: Some developers create their own MCP servers to offer custom tools, resources, and prompts for specific needs.\n\n      Explore the [MCP Container App Building Block AI template](https://aka.ms/mcp/aca), an example of developing your own MCP server. This template sets up a remote Model Context Protocol (MCP) server using Azure Container Apps.\n\n      The following diagram shows a simple architecture of the MCP Container App Building Block:\n      :::image type=\"content\" source=\"./media/intro-agents-mcp/mcp-container-app-building-block-diagram.png\" alt-text=\"Diagram showing architecture of MCP server.\":::\n\n## Consume existing MCP servers\n\nMost developers consume existing MCP clients in an MCP Host and AI agents instead of developing MCP servers from scratch. Your application or GitHub Copilot Agent Mode is the host. The agent component is the part of the application that contains the AI intelligence, while the MCP client component is responsible for MCP server communication.\n\n### How MCP is integrated in your app\n\n- **Host Application**: The overall application (like VS Code, a web app, etc.)\n  - The host application is the environment where the MCP client and agent components run. Within the host, two key components interact:\n\n      - **Agent Component**: The part that contains the AI intelligence (like GitHub Copilot Agent Mode or a custom agent built with Azure AI Agent Service or another framework).\n        - This component is responsible for processing user requests and determining what external capabilities it needs.\n        - It can be a separate module or integrated into the host application.\n        - It might use AI models to interpret user input and generate responses.\n        - The agent component is responsible for managing the flow of information between the user and the MCP client component.\n\n      - **MCP Client Component**: The part that implements the MCP protocol.\n        - This component is responsible for managing the connection to the MCP server and handling the communication between the agent component and the server.\n        - The client can be a separate module or integrated into the host application.\n        - The client component is responsible for sending requests to the MCP server and receiving responses.\n\n## Develop your own MCP server\n\nSome developers create their own MCP servers to offer custom tools, resources, and prompts for specific needs. This allows for greater flexibility and control over the capabilities provided to AI agents.\n\n### How MCP servers are integrated in your app\n\n- **MCP Server**: The server that implements the Model Context Protocol\n  - The MCP server is responsible for providing tools, resources, and prompts to the agent component.\n  - It can be hosted on Azure or any other cloud platform, or even run locally.\n  - The server can be developed using various programming languages and frameworks, depending on the requirements and preferences of the developer.\n\nThere are two main scenarios for building your own MCP server:\n\n  -\tYou build MCP servers that use features from existing MCP servers. In this case, your server calls existing MCP Server tool commands directly.\n  \n    For example, you can build a custom Cosmos DB MCP server that uses tools from the Azure MCP Server. This scenario lets you create a new server that uses existing features and adds your own custom features.\n  \n  - You build a custom MCP server that offers its own tools, resources, and prompts for your specific needs. This scenario lets you create a custom experience for your users while still using AI.\n  \n    For example, you can build a custom MCP server that provides tools for managing an in-house inventory system. This server could have tools for searching, adding, and updating inventory items, and resources that give information about the inventory system.\n\n## Related resources\n\n- [Build a TypeScript MCP server using Azure Container Apps](build-mcp-server-ts.md)\n- [Build a .NET OpenAI Agent using an MCP server on Azure Container Apps](build-openai-mcp-server-dotnet.md)\n- [Model Context Protocol Documentation](https://modelcontextprotocol.io/)\n- [Azure MCP Server](..\\azure-mcp-server\\index.yml)\n- [Use MCP servers in VS Code (Preview)](https://code.visualstudio.com/docs/copilot/chat/mcp-servers)\n- [Use MCP servers in Visual Studio (Preview)](/visualstudio/ide/mcp-servers)\n"
  },
  {
    "path": "articles/ai/introduction-build-generative-ai-solutions.md",
    "content": "---\ntitle: Generative AI Applications for Developers\ndescription: Get a conceptual overview about integrating generative AI into applications, exploring its business benefits, operational fundamentals, and the potential of large language models (LLMs).\nms.date: 01/30/2026\nms.topic: concept-article\nms.custom: build-2024-intelligent-apps, ai-learning-hub\nms.subservice: intelligent-apps\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As an AI app developer, I want to learn about the limitations and best practices for using LLMs in my applications.\n---\n\n# Generative AI solutions for developers\n\nGenerative AI, powered by large language models (LLMs), brings new opportunities for developers and organizations. Services like Azure OpenAI make AI easy to use with simple APIs. Developers of all skill levels can add advanced AI features to their apps without needing special knowledge or hardware.\n\nAs a developer, you might wonder what your role is and where you fit in. Maybe you want to know which part of the \"AI stack\" to focus on, or what you can build with today's technology.\n\nTo answer these questions, start by building a mental model that connects new terms and technologies to what you already know. This approach helps you design and add generative AI features to your apps.\n\nIn this series, we show how your current software skills apply to generative AI. We also introduce key terms and concepts to help you start building your first generative AI solutions.\n\n## How businesses benefit from using generative AI\n\nTo see how your software skills fit with generative AI, first look at how businesses use it.\n\nBusinesses use generative AI to boost customer engagement, work more efficiently, and solve problems in creative ways. Adding generative AI to existing systems lets businesses improve their software. It can add features like personalized recommendations or smart agents that answer questions about a company or its products.\n\nCommon ways that generative AI helps businesses:\n\n- **Content generation**:\n  - Create text, code, images, and sound for marketing, sales, IT, and internal communications.\n\n- **Natural language processing**:\n  - Write or improve business messages.\n  - Let users chat with their data by asking questions based on company documents.\n  - Summarize, organize, and simplify large amounts of content.\n  - Use semantic search to find information without exact keywords.\n  - Translate content to reach more people.\n\n- **Data analysis**:\n  - Find trends in data and analyze markets.\n  - Model \"what if\" scenarios to help plan for changes.\n  - Review code to suggest improvements, fix bugs, and create documentation.\n\nAs a developer, you can make significant improvements by adding generative AI features to the software your organization uses.\n\n## How to build generative AI applications\n\nAlthough the LLM does the heavy lifting, you build systems that integrate, orchestrate, and monitor the results. There's much to learn, but you can apply the skills you already have, including how to:\n\n- Make calls to APIs by using REST, JSON, or language-specific software development kits (SDKs)\n- Orchestrate calls to APIs and perform business logic\n- Store to and retrieve from data stores\n- Integrate input and results into the user experience\n- Create APIs that can be called from LLMs\n\nDeveloping generative AI solutions build on your existing skills.\n\n## Developer tools and services\n\nMicrosoft builds tools, services, APIs, samples, and learning resources to help you start with generative AI. Each one covers a key part of building a generative AI solution. To use these resources well, make sure you:\n\n- Know the main functions, roles, and responsibilities for each type of generative AI feature. For example, in RAG-based chat systems, you need to understand the problem and its limits before you design a solution.\n- Learn about the APIs, services, and tools for each function or role. Once you know the problem, you can build it yourself with code, use low-code/no-code tools, or call existing services.\n- Explore your options, including code, low-code, and no-code solutions. You can build everything yourself, but sometimes it's faster and easier to combine different tools and approaches.\n\nThere’s no single right way to add generative AI features to your apps. You can choose from many tools and methods. Always weigh the pros and cons of each.\n\n## Start with the application layer\n\nYou don’t need to know everything about generative AI to get started. You likely already have the skills you need. Use APIs and your current knowledge to begin.\n\nYou don’t need to train your own LLM. Training an LLM takes too much time and money for most companies. Instead, use existing pretrained models like GPT-4o by making API calls to hosted services such as Azure OpenAI API. Adding generative AI features to your app is just like adding any other feature that uses an API.\n\nYou might want to learn how LLMs are trained or how they work. But fully understanding LLMs requires deep knowledge of data science and math, often at a graduate level.\n\nIf you have a computer science background, you know most app development happens at a higher layer in the technology stack. You might know a bit about each layer, but you probably focus on app development, using a specific language, platform, APIs, and tools.\n\nThe same idea applies to AI. You can learn the theory behind LLMs, but you should focus on building apps or creating patterns and processes for generative AI in your company.\n\nHere’s a simple view of the knowledge layers needed to add generative AI features to an app:\n\n:::image type=\"content\" source=\"./media/ai-stack-developers.png\" border=\"false\" alt-text=\"Diagram that depicts the layers of knowledge that are required to implement generative AI features in an application.\":::\n\nAt the lowest level, data scientists do research to improve AI using advanced math like statistics and probability.\n\nOne layer up, data scientists use theory to build LLMs. They create neural networks and train them to accept prompts and generate results (completions). The process of generating results from prompts is called inference. Data scientists decide how the neural network predicts the next word or pixel.\n\nBecause training and running models takes significant computing power, most models are trained and hosted in large datacenters. You can train or host a model on your own computer, but it’s slow. Dedicated GPUs make this training faster and more efficient.\n\nWhen models run in datacenters, you access them through REST APIs. SDKs often wrap these APIs to make them easier for developers. Other tools help with monitoring and other tasks.\n\nApp developers use these APIs to build business features.\n\nBeyond calling models, new patterns and processes help organizations build reliable generative AI features. For example, some patterns help make sure generated content meets ethical, safety, and privacy standards.\n\nIf you’re an app developer, consider focusing on these app layer topics:\n\n- APIs and SDKs: Learn what’s available and what each endpoint does.\n- Tools and services: Learn how to build the features needed for a production-ready generative AI solution.\n- Prompt engineering: Learn how to get the best results by asking or rephrasing questions.\n- Bottlenecks and scaling: Find where slowdowns happen and how to scale. Learn how to log and get application data without violating privacy.\n- LLM characteristics: Know the strengths, use cases, benchmarks, and differences between models and vendors. This knowledge helps you pick the right model for your needs.\n- Patterns and workflows: Stay up to date on the latest ways to build effective and reliable generative AI features in your apps.\n\n## Tools and services from Microsoft\n\nYou can use low-code and no-code generative AI tools and services from Microsoft to help you build some or all of your solution. Various Azure services can play pivotal roles. Each contributes to the efficiency, scalability, and robustness of the solution.\n\n### API and SDKs for a code-centric approach\n\nEvery generative AI solution uses an LLM. Azure OpenAI gives you all the features in models like GPT-4.\n\n|Product|Description|\n|---|---|\n|**Azure OpenAI**|A hosted service that gives you access to powerful language models like GPT-4. Use APIs to create embeddings, build chat features, and customize results to fit your needs.|\n\n### Execution environments\n\nYou need a service to run your business logic, presentation logic, or APIs for generative AI in your apps.\n\n|Product|Description|\n|---|---|\n|**Azure App Service (or other container-based cloud services)**|Host web interfaces or APIs for users to interact with your RAG chat system. Quickly develop, deploy, and scale agentic web apps. Host MCP servers or OpenAPI servers on App Service. Easily manage the front end of your system. See [Integrate AI into your Azure App Service applications](/azure/app-service/overview-ai-integration).|\n|**Azure Functions**|Use serverless compute for event-driven tasks in your RAG chat system. Trigger data retrieval, process user queries, or handle background tasks like syncing and cleanup. Build a modular, scalable back end.|\n\n### Low-code and no-code solutions\n\nSome of the logic that you need to implement your generative AI vision can be built quickly and be hosted reliably by using a low-code or no-code solution.\n\n|Product|Description|\n|---|---|\n|**Microsoft Foundry**| You can use [Microsoft Foundry](https://ai.azure.com?cid=learnDocs) to train, test, and deploy custom machine learning models to enhance a RAG chat system. For example, use Microsoft Foundry to customize response generation or to improve the relevance of retrieved information.|\n\n### Vector database\n\nSome generative AI solutions need to store and retrieve data to improve results. For example, a RAG-based chat system lets users chat with your company’s data. In this case, you need a vector database.\n\n|Product|Description|\n|---|---|\n|**[Azure AI Search](/azure/search/retrieval-augmented-generation-overview?tabs=docs)**|Search large datasets to find information for the language model. Use it for the retrieval part of a RAG system to make responses more relevant and useful.|\n|**[Azure Cosmos DB](/azure/cosmos-db/introduction)**|Store large amounts of structured and unstructured data for the RAG chat system. Fast read and write speeds help serve real-time data and store user interactions.|\n|**[Azure Cache for Redis](/azure/azure-cache-for-redis/cache-overview)**|Cache frequently used information to reduce delays and speed up the RAG chat system. Store session data, user preferences, and common queries.|\n|**[Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/generative-ai-overview)**|Store app data like logs, user profiles, and chat history. Its flexibility and scalability keep your data available and secure.|\n\nEach of these Azure services helps you build a scalable, efficient generative AI solution. They let you use the best of Azure’s cloud and AI features. For more information, see [Choosing a Vector Database](/azure/architecture/guide/technology-choices/vector-search).\n\n## Code-centric generative AI development by using the Azure OpenAI API\n\nThis section covers the Azure OpenAI API. You use a REST API to access LLM features. You can call these APIs from any modern programming language. Many languages have SDKs that make calling the API easier.\n\nHere's the list of Azure OpenAI REST API wrappers:\n\n- [Azure OpenAI client library for .NET](/dotnet/api/overview/azure/ai.openai-readme)\n- [Azure OpenAI client library for Java](/java/api/overview/azure/ai-openai-readme)\n- [Azure OpenAI client library for JavaScript](/javascript/api/overview/azure/openai-readme)\n- [Azure OpenAI client module for Go](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai)\n- Use the [OpenAI Python package](https://platform.openai.com/docs/api-reference) and change several options. Python doesn't offer an Azure-specific client library.\n\nIf there’s no SDK for your language or platform, make REST calls directly to the web APIs:\n\n- [Azure OpenAI in Foundry Models REST API](/azure/ai-services/openai/reference)\n\nMost developers know how to call web APIs.\n\nAzure OpenAI has [several APIs for different AI tasks](/azure/ai-foundry/openai/reference#api-specs). Here’s an overview of the main APIs:\n\n- **Chat Completions API**: Generate text, chat, and answer questions. Use it for chatbots, virtual assistants, summarization, writing, and translation. It also supports vision features (like uploading an image and asking questions).\n- **Content Moderation API**: Find and filter harmful or unsafe content in text. Use it to keep user interactions safe.\n- **Embeddings API**: Turn text into vectors for search, clustering, and finding similar content. Use it to capture the meaning and relationships in text.\n- **Image Generation API**: Create images and art from text prompts. Based on the DALL·E model.\n- **Speech to text REST API**: Convert speech to text or text to speech in many languages. Use it for voice commands and audio transcription.\n\nThis article focuses on text-based generative AI, like chat and summarization, but you can use these APIs for many types of media.\n\n## Get started developing with generative AI\n\nWhen you learn a new language, API, or technology, start with tutorials or training that show how to build small apps. Some developers prefer to learn by building their own small projects. Both ways work well.\n\nStart small, set simple goals, and build your skills step by step. Generative AI development is different from traditional software. In regular software, you get the same output for the same input every time. With generative AI, you get different answers for the same prompt, which brings new challenges.\n\nAs you begin, keep these tips in mind.\n\n### Tip 1: Be clear about your goal\n\n- Define the problem you want to solve. Generative AI can do many things, but you get better results if you know exactly what you want—like generating text, images, or code.\n- Know your audience. Tailor the AI’s output to match who uses it, whether they’re casual users or experts.\n\n### Tip 2: Use LLM strengths\n\n- Know the limits and biases of LLMs. They’re powerful but not perfect. Plan for their weaknesses.\n- Use LLMs for what they do best, like creating content, summarizing, or translating. Sometimes, another type of AI might be better for your needs.\n\n### Tip 3: Write good prompts\n\n- Learn prompt engineering. Try different prompts to see what works best. Be clear and specific.\n- Refine your prompts. The first iteration might not work. Use the results to improve your next prompt.\n\n## Build your first generative AI solution\n\nTo try building a generative AI solution, start with [Get started with chat by using your own data sample for Python](/azure/developer/python/get-started-app-chat-template?tabs=github-codespaces). You can also find tutorials for [.NET](/dotnet/ai/get-started-app-chat-template?tabs=github-codespaces), [Java](/azure/developer/java/ai/get-started-app-chat-template?tabs=github-codespaces), and [JavaScript](/azure/developer/javascript/get-started-app-chat-template?tabs=github-codespaces).\n\n## Final considerations for application design\n\nHere's a short list of things to consider and other takeaways from this article that might affect your application design decisions:\n\n- Define the problem space and audience clearly to align AI's capabilities with user expectations. Optimize the solution's effectiveness for the intended use case.\n- Use low-code/no-code platforms for rapid prototyping and development if they meet your project's requirements. Evaluate the trade-off between development speed and customizability. Try low-code and no-code tools for parts of your app to speed up development and let nontechnical team members help.\n"
  },
  {
    "path": "articles/ai/keyless-connections.md",
    "content": "---\ntitle: Use keyless connections with Azure OpenAI\ndescription: Use keyless connections for authentication and authorization to Azure OpenAI.\nms.topic: how-to\nms.date: 03/19/2026\nms.reviewer: scaddie\nms.custom: devx-track-extended-java, devx-track-js, devx-track-python, passwordless-dotnet, passwordless-java, passwordless-js, passwordless-python, passwordless-go, build-2024-intelligent-apps\n#customer intent: As a developer, I want to use keyless connections so that I don't leak secrets.\n---\n\n# Use Azure OpenAI without keys \n\nApplication requests to most Azure services must be authenticated with keys or [passwordless connections](https://aka.ms/delete-passwords). Developers must be diligent to never expose the keys in an unsecure location. Anyone who gains access to the key is able to authenticate to the service. Keyless authentication offers improved management and security benefits over the account key because there's no key (or connection string) to store.\n\nKeyless connections are enabled with the following steps:\n\n* Configure your authentication.\n* Set environment variables, as needed.\n* Use an Azure Identity library credential type to create an Azure OpenAI client object.\n\n## Authentication\n\nAuthentication to Microsoft Entra ID is required to use the Azure client libraries.\n\nAuthentication differs based on the environment in which the app is running:\n\n* [Local development](#authenticate-for-local-development)\n* [Azure](#authenticate-for-azure-hosted-environments)\n\n## Azure OpenAI Keyless Building Block\n\nUse the following link to explore the Azure OpenAI Keyless Building Block AI template. This template provisions an Azure OpenAI account with your user account RBAC role permission for keyless (Microsoft Entra) authentication to access the OpenAI API SDKs.\n\n> [!NOTE]\n> This article uses one or more [AI app templates](./intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained, easy to deploy reference implementations that help to ensure a high-quality starting point for your AI apps.\n\n### [.NET](#tab/csharp)\n\nExplore the .NET [End to end Azure OpenAI Keyless Authentication Building Block AI template](https://github.com/Azure-Samples/azure-openai-keyless-csharp).\n\n### [Go](#tab/go)\n\nExplore the Go [End to end Azure OpenAI Keyless Authentication Building Block AI template](https://github.com/Azure-Samples/azure-openai-keyless-go).\n\n### [Java](#tab/java)\n\nExplore the Java [End to end Azure OpenAI Keyless Authentication Building Block AI template](https://github.com/Azure-Samples/azure-openai-keyless-java).\n\n### [JavaScript](#tab/javascript)\n\nExplore the JavaScript [End to end Azure OpenAI Keyless Authentication Building Block AI template](https://github.com/Azure-Samples/azure-openai-keyless-js).\n\n### [Python](#tab/python)\n\nExplore the Python [End to end Azure OpenAI Keyless Authentication Building Block AI template](https://github.com/Azure-Samples/azure-openai-keyless-python).\n\n---\n\n### Authenticate for local development\n\n#### [.NET](#tab/csharp)\n\nSelect a tool for [authentication during local development](/dotnet/api/overview/azure/identity-readme#authenticate-the-client).\n\n> [!IMPORTANT]\n> For access to your Azure resources during local development, you must [sign-in to a local development tool](/dotnet/azure/sdk/authentication/local-development-dev-accounts#sign-in-to-azure-using-developer-tooling) using the Azure account you assigned the `Azure AI Developer` role to. For example, Visual Studio or the Azure CLI.\n\n#### [Go](#tab/go)\n\nSelect a tool for [authentication during local development](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/azidentity#authenticating-during-local-development).\n\n#### [Java](#tab/java)\n\nSelect a tool for [authentication during local development](/java/api/overview/azure/identity-readme#authenticate-the-client).\n\n#### [JavaScript](#tab/javascript)\n\nSelect a tool for [authentication during local development](/javascript/api/overview/azure/identity-readme#authenticate-the-client-in-development-environment).\n\n#### [Python](#tab/python)\n\nSelect a tool for [authentication during local development](/python/api/overview/azure/identity-readme#authenticate-during-local-development).\n\n---\n\n### Authenticate for Azure-hosted environments\n\n#### [.NET](#tab/csharp)\n\nLearn about how to manage the [DefaultAzureCredential](/dotnet/api/overview/azure/identity-readme#defaultazurecredential) for applications deployed to Azure.\n\n#### [Go](#tab/go)\n\nLearn about how to manage the [DefaultAzureCredential](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#readme-defaultazurecredential) for applications deployed to Azure.\n\n#### [Java](#tab/java)\n\nLearn about how to manage the [DefaultAzureCredential](/java/api/overview/azure/identity-readme#defaultazurecredential) for applications deployed to Azure.\n\n#### [JavaScript](#tab/javascript)\n\nLearn about how to manage the [DefaultAzureCredential](/javascript/api/overview/azure/identity-readme#defaultazurecredential) for applications deployed to Azure.\n\n#### [Python](#tab/python)\n\nLearn about how to manage the [DefaultAzureCredential](/python/api/overview/azure/identity-readme#defaultazurecredential) for applications deployed to Azure.\n\n---\n\n## Configure roles for authorization\n\n1. Find the [role](/azure/role-based-access-control/built-in-roles#ai--machine-learning) for your usage of Azure OpenAI. Depending on how you intend to set that role, you need either the name or ID. \n\n    |Role name|Role ID|\n    |--|--|\n    |For Azure CLI or Azure PowerShell, you can use role name. |For Bicep, you need the role ID.|\n\n1. Use the following table to select a role and ID. \n\n    |Use case|Role name|Role ID|\n    |--|--|--|\n    |Assistants|`Cognitive Services OpenAI Contributor`|`a001fd3d-188f-4b5d-821b-7da978bf7442`|\n    |Chat completions|`Cognitive Services OpenAI User`|`5e0bd9bd-7b93-4f28-af87-19fc36ad61bd`|\n\n1. Select an identity type to use.\n\n    * **Personal identity**: Your personal identity tied to your sign in to Azure.\n    * **Managed identity**: An identity managed by and created for use on Azure. For [managed identity](/entra/identity/managed-identities-azure-resources/how-manage-user-assigned-managed-identities?pivots=identity-mi-methods-azp#create-a-user-assigned-managed-identity), create a [user-assigned managed identity](/entra/identity/managed-identities-azure-resources/how-manage-user-assigned-managed-identities?pivots=identity-mi-methods-azp#create-a-user-assigned-managed-identity). When you create the managed identity, you need the `Client ID`, also known as the `app ID`.  \n\n1. To find your personal identity, use one of the following commands. Use the ID as the `<identity-id>` in the next step.\n\n    ### [Azure CLI](#tab/azure-cli)\n\n    For local development, to get your own identity ID, use the following command. You need to sign in with `az login` before using this command.\n\n    ```azurecli\n    az ad signed-in-user show \\\n        --query id -o tsv\n    ```\n\n    ### [Azure PowerShell](#tab/azure-powershell)\n\n    For local development, to get your own identity ID, use the following command. You need to sign in with `Connect-AzAccount` before using this command.\n\n    ```azurepowershell\n    (Get-AzContext).Account.ExtendedProperties.HomeAccountId.Split('.')[0]\n    ```\n\n    ### [Bicep](#tab/bicep)\n\n    The identity of the person or service running the deployment is set to the `principalId` parameter when using [Bicep](/azure/azure-resource-manager/bicep/) deployed with [Azure Developer CLI](/azure/developer/azure-developer-cli).\n\n    The following `main.parameters.json` variable is set to the identity running the process.\n\n    ```json\n    \"principalId\": {\n        \"value\": \"${AZURE_PRINCIPAL_ID}\"\n      },\n    ```\n\n    For use in Azure, specify a user-assigned managed identity as part of the Bicep deployment process. Create a user-assigned managed identity separate from the identity running the process.\n\n    ```bicep\n    resource userAssignedManagedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {\n      name: managedIdentityName\n      location: location\n    }\n    ```\n\n    ### [Azure portal](#tab/portal)\n\n    Use the steps found here: [find the user object ID](/partner-center/find-ids-and-domain-names#find-the-user-object-id) in the Azure portal.\n\n    ---\n\n1. Assign the role-based access control (RBAC) role to the identity for the resource group.  \n\n    ### [Azure CLI](#tab/azure-cli)\n\n    To grant your identity permissions to your resource through RBAC, assign a role using the Azure CLI command [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create).\n\n    ```azurecli\n    az role assignment create \\\n        --role \"Cognitive Services OpenAI User\" \\\n        --assignee \"<identity-id>\" \\\n        --scope \"/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>\"\n    ```\n\n    ### [Azure PowerShell](#tab/azure-powershell)\n\n    To grant your application permissions to your Azure OpenAI resource through RBAC, assign a role using the Azure PowerShell cmdlet [New-AzRoleAssignment](/powershell/module/az.resources/new-azroleassignment).\n\n    ```azurepowershell\n    New-AzRoleAssignment -ObjectId \"<identity-id>\" -RoleDefinitionName \"Cognitive Services OpenAI User\" -Scope \"/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>\"\n    ```\n\n    ### [Bicep](#tab/bicep)\n\n    Use the following Azure OpenAI Bicep template to create the resource and set the authentication for the `identityId`. Bicep requires the role ID. The `name` shown in this Bicep snippet isn't the Azure role; it's specific to the Bicep deployment. \n\n    ```bicep\n    // main.bicep\n    param environment string = 'production'\n\n    // USER ROLES\n    module openAiRoleUser 'core/security/role.bicep' = {\n        scope: openAiResourceGroup\n        name: 'openai-role-user'\n        params: {\n            principalId: (environment == 'development') ? principalId : userAssignedManagedIdentity \n            principalType: (environment == 'development') ? 'User' : 'ServicePrincipal'\n            roleDefinitionId: '5e0bd9bd-7b93-4f28-af87-19fc36ad61bd'\n        }\n    }\n    ```\n\n    The following generic Bicep is called from the `main.bicep` to create any role. \n\n    ```bicep\n    // core/security/role.bicep\n    metadata description = 'Creates a role assignment for an identity.'\n    param principalId string // passed in from main.bicep identityId\n\n    @allowed([\n        'Device'\n        'ForeignGroup'\n        'Group'\n        'ServicePrincipal'\n        'User'\n    ])\n    param principalType string = 'ServicePrincipal'\n    param roleDefinitionId string\n\n    resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = {\n        name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId)\n        properties: {\n            principalId: principalId\n            principalType: principalType\n            roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)\n        }\n    }\n    ```\n\n    ### [Azure portal](#tab/portal)\n\n    Use the steps found at [open the Add role assignment page](/azure/role-based-access-control/role-assignments-portal#step-2-open-the-add-role-assignment-page) in the Azure portal.\n\n    ---\n\n    Where applicable, replace `<identity-id>`, `<subscription-id>`, and `<resource-group-name>` with your actual values. \n\n## Configure environment variables\n\nTo connect to Azure OpenAI, your code needs to know your resource endpoint, and _might_ need other environment variables.\n\n1. Create an environment variable for your Azure OpenAI endpoint. \n\n    * `AZURE_OPENAI_ENDPOINT`: This URL is the access point for your Azure OpenAI resource.\n\n2. Create environment variables based on the location in which your app runs:\n\n    | Location | Identity| Description|\n    |--|--|--|\n    |Local|Personal|For local runtimes with your **personal identity**, [sign in](#authenticate-for-local-development) to create your credential with a tool.|\n    |Azure cloud|User-assigned managed identity|Create an `AZURE_CLIENT_ID` environment variable containing the client ID of the user-assigned managed identity to authenticate as.|\n\n## Install Azure Identity client library\n\nUse the following link to install the Azure Identity client library.\n\n### [.NET](#tab/csharp)\n\nInstall the .NET [Azure Identity client library](https://www.nuget.org/packages/Azure.Identity):\n\n```dotnetcli\ndotnet add package Azure.Identity\n```\n\n### [Go](#tab/go)\n\nInstall the Go [Azure Identity client library](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/azidentity):\n\n```bash\ngo get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity\n```\n\n### [Java](#tab/java)\n\nInstall the Java [Azure Identity client library](https://mvnrepository.com/artifact/com.azure/azure-identity) with the following POM file:\n\n```xml\n<dependencyManagement>\n    <dependencies>\n        <dependency>\n            <groupId>com.azure</groupId>\n            <artifactId>azure-identity</artifactId>\n            <version>1.18.2</version>\n            <type>pom</type>\n            <scope>import</scope>\n        </dependency>\n    </dependencies>\n</dependencyManagement>\n```\n\n### [JavaScript](#tab/javascript)\n\nInstall the JavaScript [Azure Identity client library](https://www.npmjs.com/package/@azure/identity):\n\n```console\nnpm install --save @azure/identity\n```\n\n### [Python](#tab/python)\n\nInstall the Python [Azure Identity client library](https://pypi.org/project/azure-identity/):\n\n```console\npip install azure-identity\n```\n\n---\n\n## Use DefaultAzureCredential\n\nThe Azure Identity library's `DefaultAzureCredential` allows the customer to run the same code in the local development environment and in the Azure Cloud.\n\n### [.NET](#tab/csharp)\n\nFor more information on `DefaultAzureCredential` for .NET, see the [`DefaultAzureCredential` overview](/dotnet/azure/sdk/authentication/credential-chains?tabs=dac#defaultazurecredential-overview).\n\nTake one of the following approaches to set the user-assigned managed identity's client ID:\n\n- Set environment variable `AZURE_CLIENT_ID`. The parameterless constructor of `DefaultAzureCredential` uses the value of this environment variable, if present.\n\n    ```csharp\n    using Azure;\n    using Azure.AI.OpenAI;\n    using Azure.Identity;\n    using System;\n    using static System.Environment;\n    \n    string endpoint = GetEnvironmentVariable(\"AZURE_OPENAI_ENDPOINT\");\n    \n    OpenAIClient client = new(new Uri(endpoint), new DefaultAzureCredential());\n    ```\n\n- Set property [ManagedIdentityClientId](/dotnet/api/azure.identity.defaultazurecredentialoptions.managedidentityclientid?view=azure-dotnet&preserve-view=true) on `DefaultAzureCredentialOptions`:\n\n    ```csharp\n    using Azure;\n    using Azure.AI.OpenAI;\n    using Azure.Identity;\n    using System;\n    using static System.Environment;\n    \n    string endpoint = GetEnvironmentVariable(\"AZURE_OPENAI_ENDPOINT\");\n    \n    var credential = new DefaultAzureCredential(\n        new DefaultAzureCredentialOptions\n        {\n            ManagedIdentityClientId = \"<user_assigned_client_id>\"\n        });\n    \n    OpenAIClient client = new(new Uri(endpoint), credential);\n    ```\n\n### [Go](#tab/go)\n\nFor more information on `DefaultAzureCredential` for Go, see the [`DefaultAzureCredential` overview](/azure/developer/go/sdk/authentication/credential-chains#defaultazurecredential-overview).\n\n```go\nimport (\n\t\"log\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n)\n\nfunc main() {\n\tdac, err := azidentity.NewDefaultAzureCredential(nil)\n\n\tif err != nil {\n\t\tlog.Fatalf(\"ERROR: %s\", err)\n\t}\n\n\tclient, err := azopenai.NewClient(os.Getenv(\"AZURE_OPENAI_ENDPOINT\"), dac, nil)\n\n\tif err != nil {\n\t\tlog.Fatalf(\"ERROR: %s\", err)\n\t}\n\n\t_ = client\n}\n```\n\n### [Java](#tab/java)\n\nFor more information on `DefaultAzureCredential` for Java,  see the [`DefaultAzureCredential` overview](/azure/developer/java/sdk/authentication/credential-chains#defaultazurecredential-overview).\n\nTake one of the following approaches to set the user-assigned managed identity's client ID:\n\n- Set environment variable `AZURE_CLIENT_ID`. The parameterless constructor of `DefaultAzureCredential` uses the value of this environment variable, if present.\n\n    ```java\n    import com.azure.identity.DefaultAzureCredentialBuilder;\n    import com.azure.ai.openai.OpenAIClient;\n    import com.azure.ai.openai.OpenAIClientBuilder;\n    \n    String endpoint = System.getenv(\"AZURE_OPENAI_ENDPOINT\");\n    \n    DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();\n    OpenAIClient client = new OpenAIClientBuilder()\n        .credential(credential)\n        .endpoint(endpoint)\n        .buildClient();\n    ```\n\n- Assign a specific user-assigned managed identity with `DefaultAzureCredential` by using the `DefaultAzureCredentialBuilder` to configure it with a client ID:\n\n    ```java\n    import com.azure.identity.DefaultAzureCredentialBuilder;\n    import com.azure.ai.openai.OpenAIClient;\n    import com.azure.ai.openai.OpenAIClientBuilder;\n    \n    String endpoint = System.getenv(\"AZURE_OPENAI_ENDPOINT\");\n    String userAssignedClientId = \"<your managed identity client ID>\";\n    \n    TokenCredential dacWithUserAssignedManagedIdentity\n         = new DefaultAzureCredentialBuilder().managedIdentityClientId(userAssignedClientId).build();\n    OpenAIClient client = new OpenAIClientBuilder()\n        .credential(dacWithUserAssignedManagedIdentity)\n        .endpoint(endpoint)\n        .buildClient();\n    ```\n\n### [JavaScript](#tab/javascript)\n\nFor more information on `DefaultAzureCredential` for JavaScript, see the [`DefaultAzureCredential` overview](/azure/developer/javascript/sdk/authentication/credential-chains#use-defaultazurecredential-for-flexibility).\n\nTake one of the following approaches to set the user-assigned managed identity's client ID:\n\n- Set environment variable `AZURE_CLIENT_ID`. The parameterless constructor of `DefaultAzureCredential` uses the value of this environment variable, if present.\n\n    ```javascript\n    import { DefaultAzureCredential, getBearerTokenProvider } from \"@azure/identity\";\n    import { AzureOpenAI } from \"openai\";\n    \n    const credential = new DefaultAzureCredential();\n    const scope = \"https://cognitiveservices.azure.com/.default\";\n    const azureADTokenProvider = getBearerTokenProvider(credential, scope);\n    \n    const endpoint = process.env[\"AZURE_OPENAI_ENDPOINT\"] || \"<endpoint>\";\n    const deployment = \"<your Azure OpenAI deployment name>\";\n    const apiVersion = \"2024-10-21\";\n    const options = { azureADTokenProvider, deployment, apiVersion, endpoint }\n    \n    const client = new AzureOpenAI(options);\n    ```\n\n- Assign a specific user-assigned managed identity with `DefaultAzureCredential` by using the `managedIdentityClientId` parameter to configure it with a client ID:\n\n    ```javascript\n    import { DefaultAzureCredential, getBearerTokenProvider } from \"@azure/identity\";\n    import { AzureOpenAI } from \"openai\";\n    \n    const managedIdentityClientId = \"<your managed identity client ID>\";\n    \n    const credential = new DefaultAzureCredential({\n          managedIdentityClientId: managedIdentityClientId,\n        });\n    const scope = \"https://cognitiveservices.azure.com/.default\";\n    const azureADTokenProvider = getBearerTokenProvider(credential, scope);\n    \n    const endpoint = process.env[\"AZURE_OPENAI_ENDPOINT\"] || \"<endpoint>\";\n    const deployment = \"<your Azure OpenAI deployment name>\";\n    const apiVersion = \"2024-10-21\";\n    const options = { azureADTokenProvider, deployment, apiVersion, endpoint }\n    \n    const client = new AzureOpenAI(options);\n    ```\n\n### [Python](#tab/python)\n\nFor more information on `DefaultAzureCredential` for Python, see the [`DefaultAzureCredential` overview](/azure/developer/python/sdk/authentication/credential-chains?tabs=dac#defaultazurecredential-overview).\n\nTake one of the following approaches to set the user-assigned managed identity's client ID:\n\n- Set environment variable `AZURE_CLIENT_ID`. The parameterless constructor of `DefaultAzureCredential` uses the value of this environment variable, if present.\n\n    ```python\n    import openai\n    from azure.identity import DefaultAzureCredential, get_bearer_token_provider\n    \n    token_provider = get_bearer_token_provider(DefaultAzureCredential(), \"https://cognitiveservices.azure.com/.default\")\n    \n    openai_client = openai.AzureOpenAI(\n        api_version=os.getenv(\"AZURE_OPENAI_VERSION\"),\n        azure_endpoint=os.getenv(\"AZURE_OPENAI_ENDPOINT\"),\n        azure_ad_token_provider=token_provider\n    )\n    ```\n\n- Assign a specific user-assigned managed identity with `DefaultAzureCredential` by using the `managed_identity_client_id` parameter to configure it with a client ID:\n\n    ```python\n    import openai\n    from azure.identity import DefaultAzureCredential, get_bearer_token_provider\n    \n    user_assigned_client_id = \"<your managed identity client ID>\"\n    \n    credential = DefaultAzureCredential(\n     managed_identity_client_id=user_assigned_client_id\n    )\n    \n    token_provider = get_bearer_token_provider(credential, \"https://cognitiveservices.azure.com/.default\")\n    \n    openai_client = openai.AzureOpenAI(\n        api_version=os.getenv(\"AZURE_OPENAI_VERSION\"),\n        azure_endpoint=os.getenv(\"AZURE_OPENAI_ENDPOINT\"),\n        azure_ad_token_provider=token_provider\n    )\n    \n    ```\n\n---\n\n## Resources\n\n* [Passwordless connections developer guide](/azure/developer/intro/passwordless-overview)\n"
  },
  {
    "path": "articles/ai/resources-overview.md",
    "content": "---\ntitle: Resources for developing AI apps\ndescription: Overview article introducing the resources available for developers who are getting started building AI apps.\nkeywords: ai, azure openai, microsoft foundry\nms.service: azure\nms.topic: overview\nms.update-cycle: 180-days\nms.date: 01/30/2026\nms.custom: overview, devx-track-dotnet, devx-track-extended-java, devx-track-go, devx-track-js, devx-track-python\nzone_pivot_group_filename: developer/intro/intro-zone-pivot-groups.json\nzone_pivot_groups: intelligent-apps-languages\n---\n\n# Resources for developing AI apps\n\nThis article provides the best learning resources for developers who are getting started building AI apps for each programming language. Resources include libraries and samples, documentation, training courses, and more.\n\n:::zone pivot=\"dotnet\"\n\n[!INCLUDE [azure-ai-for-developers-dotnet](./includes/azure-ai-for-developers-dotnet.md)]\n\n:::zone-end\n\n:::zone pivot=\"python\"\n\n[!INCLUDE [azure-ai-for-developers-python](./includes/azure-ai-for-developers-python.md)]\n\n:::zone-end\n\n:::zone pivot=\"javascript\"\n\n[!INCLUDE [azure-ai-for-developers-javascript](./includes/azure-ai-for-developers-javascript.md)]\n\n:::zone-end\n\n:::zone pivot=\"java\"\n\n[!INCLUDE [azure-ai-for-developers-java](./includes/azure-ai-for-developers-java.md)]\n\n:::zone-end\n\n:::zone pivot=\"golang\"\n\n[!INCLUDE [azure-ai-for-developers-go](./includes/azure-ai-for-developers-go.md)]\n\n:::zone-end\n"
  },
  {
    "path": "articles/ai-developer-tools/TOC.yml",
    "content": "items:\n- name: AI developer tools for Azure\n  href: index.yml\n  items:\n  - name: Overview\n    href: overview.md\n  - name: GitHub Copilot for Azure\n    items:\n    - name: Overview\n      href: ../github-copilot-azure/introduction.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Get started\n      href: ../github-copilot-azure/get-started.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Get support\n      href: ../github-copilot-azure/support.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Quickstarts\n      items:\n        - name: Deploy an existing app with agent mode\n          href: ../github-copilot-azure/quickstart-deploy-app-agent-mode.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Learn about Azure and your app\n      href: ../github-copilot-azure/learn-examples.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Design and develop your app\n      href: ../github-copilot-azure/design-develop-examples.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Deploy your app\n      href: ../github-copilot-azure/deploy-examples.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Troubleshooting your app\n      href: ../github-copilot-azure/troubleshoot-examples.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Advanced scenarios\n      expanded: true\n      items:\n        - name: Create Bicep files\n          href: ../github-copilot-azure/bicep-generate-edit.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Generate and deploy a Django / PostgreSQL app\n          href: ../github-copilot-azure/generate-deploy-django-postgresql.md?context=/azure/developer/ai-developer-tools/context/context\n  - name: Azure MCP Server\n    items:\n    - name: Overview\n      href: ../azure-mcp-server/overview.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Get started\n      expanded: true\n      items:\n        - name: Get started with Azure MCP Server\n          href: ../azure-mcp-server/get-started.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Code editors and tools\n          expanded: true\n          items:\n          - name: Visual Studio Code\n            href: ../azure-mcp-server/get-started/tools/visual-studio-code.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: Visual Studio\n            href: ../azure-mcp-server/get-started/tools/visual-studio.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: Eclipse\n            href: ../azure-mcp-server/get-started/tools/eclipse.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: Cursor\n            href: ../azure-mcp-server/get-started/tools/cursor.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: Windsurf\n            href: ../azure-mcp-server/get-started/tools/windsurf.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: IntelliJ\n            href: ../azure-mcp-server/get-started/tools/jet-brains.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: Cline\n            href: ../azure-mcp-server/get-started/tools/cline.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Languages and frameworks\n          expanded: true\n          items:\n          - name: Python\n            href: ../azure-mcp-server/get-started/languages/python.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: .NET\n            href: ../azure-mcp-server/get-started/languages/dotnet.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Concepts\n      href: ../azure-mcp-server/concepts.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: How to\n      expanded: true\n      items:\n        - name: Connect\n          expanded: true\n          items:\n          - name: GitHub Copilot coding agent\n            href: ../azure-mcp-server/how-to/github-copilot-coding-agent.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: GitHub Copilot CLI\n            href: ../azure-mcp-server/how-to/github-copilot-cli.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: GitHub Copilot SDK\n            href: ../azure-mcp-server/how-to/github-copilot-sdk.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: Azure MCP Server to sovereign clouds\n            href: ../azure-mcp-server/how-to/connect-sovereign-clouds.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Self-host\n      expanded: true\n      items:\n        - name: Azure Container Apps with Microsoft Foundry\n          href: ../azure-mcp-server/how-to/deploy-remote-mcp-server-microsoft-foundry.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Container Apps with Copilot Studio\n          href: ../azure-mcp-server/how-to/deploy-remote-mcp-server-copilot-studio.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Container Apps with on-behalf-of authentication\n          href: ../azure-mcp-server/how-to/deploy-remote-mcp-server-on-behalf-of.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Use with Azure services\n      expanded: true\n      items:\n        - name: Azure App Service\n          href: ../azure-mcp-server/services/azure-mcp-server-for-app-service.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Functions\n          href: ../azure-mcp-server/services/azure-mcp-server-for-functions.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Key Vault\n          href: ../azure-mcp-server/services/azure-mcp-server-for-key-vault.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Redis\n          href: ../azure-mcp-server/services/azure-mcp-server-for-redis.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure AI Search\n          href: ../azure-mcp-server/services/azure-mcp-server-for-search.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Speech in Foundry Tools\n          href: ../azure-mcp-server/services/azure-mcp-speech-foundry-tools.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Tools\n      expanded: true\n      items:\n        - name: Overview\n          href: ../azure-mcp-server/tools/index.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Best practices\n          items:\n          - name: Azure best practices\n            href: ../azure-mcp-server/tools/azure-best-practices.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: Azure Well-Architected Framework\n            href: ../azure-mcp-server/tools/azure-well-architected-framework.md?context=/azure/developer/ai-developer-tools/context/context\n          - name: Terraform best practices for Azure\n            href: ../azure-mcp-server/tools/azure-terraform-best-practices.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Advisor\n          href: ../azure-mcp-server/tools/azure-advisor.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Application Insights\n          href: ../azure-mcp-server/tools/application-insights.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Microsoft Foundry\n          href: ../azure-mcp-server/tools/azure-foundry.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure AI Search\n          href: ../azure-mcp-server/tools/azure-ai-search.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Speech in Foundry Tools\n          href: ../azure-mcp-server/tools/ai-services-speech.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure App Configuration\n          href: ../azure-mcp-server/tools/app-configuration.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure App Lens\n          href: ../azure-mcp-server/tools/azure-app-lens.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure App Service\n          href: ../azure-mcp-server/tools/azure-app-service.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Bicep schema\n          href: ../azure-mcp-server/tools/azure-bicep-schema.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure CLI\n          href: ../azure-mcp-server/tools/azure-cli.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Cloud Architect\n          href: ../azure-mcp-server/tools/azure-cloud-architect.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Communication Services\n          href: ../azure-mcp-server/tools/azure-communication.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Confidential Ledger\n          href: ../azure-mcp-server/tools/azure-confidential-ledger.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Compute\n          href: ../azure-mcp-server/tools/azure-compute.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Container Apps\n          href: ../azure-mcp-server/tools/azure-container-apps.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Container Registry\n          href: ../azure-mcp-server/tools/azure-container-registry.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Cosmos DB\n          href: ../azure-mcp-server/tools/azure-cosmos-db.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Data Explorer\n          href: ../azure-mcp-server/tools/azure-data-explorer.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Database for MySQL\n          href: ../azure-mcp-server/tools/azure-mysql.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Database for PostgreSQL\n          href: ../azure-mcp-server/tools/azure-database-postgresql.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Deploy\n          href: ../azure-mcp-server/tools/azure-deploy.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Developer CLI\n          href: ../azure-mcp-server/tools/azure-cli.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Event Grid\n          href: ../azure-mcp-server/tools/azure-event-grid.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Event Hubs\n          href: ../azure-mcp-server/tools/azure-event-hubs.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Files\n          href: ../azure-mcp-server/tools/azure-file-shares.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure File Sync\n          href: ../azure-mcp-server/tools/azure-file-sync.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Functions\n          href: ../azure-mcp-server/tools/azure-functions.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Key Vault\n          href: ../azure-mcp-server/tools/azure-key-vault.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Kubernetes Service\n          href: ../azure-mcp-server/tools/azure-kubernetes.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Load Testing\n          href: ../azure-mcp-server/tools/azure-load-testing.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Managed Grafana\n          href: ../azure-mcp-server/tools/azure-grafana.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Managed Lustre\n          href: ../azure-mcp-server/tools/azure-managed-lustre.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Marketplace\n          href: ../azure-mcp-server/tools/azure-marketplace.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure MCP tool\n          href: ../azure-mcp-server/tools/azure-mcp-tool.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Migrate\n          href: ../azure-mcp-server/tools/azure-migrate.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Monitor\n          href: ../azure-mcp-server/tools/azure-monitor.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Native ISV\n          href: ../azure-mcp-server/tools/azure-native-isv.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Policy\n          href: ../azure-mcp-server/tools/azure-policy.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Pricing\n          href: ../azure-mcp-server/tools/azure-pricing.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Quick Review CLI\n          href: ../azure-mcp-server/tools/azure-compliance-quick-review.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Quotas\n          href: ../azure-mcp-server/tools/azure-quotas.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure RBAC\n          href: ../azure-mcp-server/tools/azure-rbac.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Redis\n          href: ../azure-mcp-server/tools/azure-redis.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Resource Health\n          href: ../azure-mcp-server/tools/azure-resource-health.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Service Bus\n          href: ../azure-mcp-server/tools/azure-service-bus.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Service Fabric\n          href: ../azure-mcp-server/tools/azure-service-fabric.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure SignalR\n          href: ../azure-mcp-server/tools/azure-signalr.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure SQL\n          href: ../azure-mcp-server/tools/azure-sql.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Storage\n          href: ../azure-mcp-server/tools/azure-storage.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Virtual Desktop\n          href: ../azure-mcp-server/tools/azure-virtual-desktop.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Azure Virtual Machines\n          href: ../azure-mcp-server/tools/azure-compute.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Resource Group\n          href: ../azure-mcp-server/tools/resource-group.md?context=/azure/developer/ai-developer-tools/context/context\n        - name: Subscription\n          href: ../azure-mcp-server/tools/subscription.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Resources\n      items:\n      - name: Azure MCP Server GitHub repository\n        href: https://github.com/microsoft/mcp/tree/main/servers/Azure.Mcp.Server\n      - name: Model Context Protocol documentation\n        href: https://modelcontextprotocol.io/\n      - name: Authentication guidance\n        href: ../azure-mcp-server/overview.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Tool reference\n        href: ../azure-mcp-server/tools/index.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Troubleshooting\n        href: https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/TROUBLESHOOTING.md\n  - name: Azure Skills\n    items:\n    - name: Overview\n      href: ../azure-skills/overview.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Install and configure\n      href: ../azure-skills/install.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Quickstart\n      href: ../azure-skills/quickstart.md?context=/azure/developer/ai-developer-tools/context/context\n    - name: Skills reference\n      items:\n      - name: App Insights Instrumentation\n        href: ../azure-skills/skills/app-insights-instrumentation.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure AI Gateway\n        href: ../azure-skills/skills/azure-ai-gateway.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure AI Services\n        href: ../azure-skills/skills/azure-ai.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Cloud Migration\n        href: ../azure-skills/skills/azure-cloud-migrate.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Compliance\n        href: ../azure-skills/skills/azure-compliance.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Compute\n        href: ../azure-skills/skills/azure-compute.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Cost Optimization\n        href: ../azure-skills/skills/azure-cost.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Deploy\n        href: ../azure-skills/skills/azure-deploy.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Diagnostics\n        href: ../azure-skills/skills/azure-diagnostics.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Enterprise Infrastructure Planner\n        href: ../azure-skills/skills/azure-enterprise-infra-planner.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Hosted Copilot SDK\n        href: ../azure-skills/skills/azure-hosted-copilot-sdk.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Kubernetes\n        href: ../azure-skills/skills/azure-kubernetes.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Kusto (Data Explorer)\n        href: ../azure-skills/skills/azure-kusto.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Messaging\n        href: ../azure-skills/skills/azure-messaging.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Prepare\n        href: ../azure-skills/skills/azure-prepare.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Quotas\n        href: ../azure-skills/skills/azure-quotas.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure RBAC\n        href: ../azure-skills/skills/azure-rbac.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Resource Lookup\n        href: ../azure-skills/skills/azure-resource-lookup.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Resource Visualizer\n        href: ../azure-skills/skills/azure-resource-visualizer.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Storage\n        href: ../azure-skills/skills/azure-storage.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Upgrade\n        href: ../azure-skills/skills/azure-upgrade.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Azure Validate\n        href: ../azure-skills/skills/azure-validate.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Entra App Registration\n        href: ../azure-skills/skills/entra-app-registration.md?context=/azure/developer/ai-developer-tools/context/context\n      - name: Microsoft Foundry\n        href: ../azure-skills/skills/microsoft-foundry.md?context=/azure/developer/ai-developer-tools/context/context\n"
  },
  {
    "path": "articles/ai-developer-tools/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: AI developer tools\n      tocHref: /azure/developer/ai-developer-tools\n      topicHref: /azure/developer/ai-developer-tools/index\n      items:\n      - name: GitHub Copilot for Azure\n        tocHref: /azure/developer/github-copilot-azure\n        topicHref: /azure/developer/github-copilot-azure/index\n      - name: Azure MCP Server\n        tocHref: /azure/developer/azure-mcp-server\n        topicHref: /azure/developer/azure-mcp-server/index\n      - name: Azure Skills\n        tocHref: /azure/developer/azure-skills\n        topicHref: /azure/developer/azure-skills/index\n"
  },
  {
    "path": "articles/ai-developer-tools/context/context.yml",
    "content": "### YamlMime:ContextObject\nbrand: azure\nuhfHeaderId: azure\nbreadcrumb_path: ../breadcrumb/toc.yml\ntoc_rel: ../TOC.yml\n"
  },
  {
    "path": "articles/ai-developer-tools/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: AI developer tools for Azure documentation\nsummary: Explore AI-powered developer tools for Azure including the Azure MCP Server, GitHub Copilot MCP servers, and Azure Skills. Build intelligent workflows that connect AI agents to Azure services.\n\nmetadata:\n  title: AI developer tools for Azure documentation\n  description: Learn about AI-powered developer tools for Azure, including MCP servers, GitHub Copilot integrations, and Azure Skills for building agentic workflows.\n  ms.topic: landing-page\n  ms.date: 07/11/2025\n\nlandingContent:\n  - title: Azure Skills\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Overview\n            url: ../azure-skills/overview.md\n      - linkListType: get-started\n        links:\n          - text: Install and configure\n            url: ../azure-skills/install.md\n          - text: Quickstart\n            url: ../azure-skills/quickstart.md\n  - title: Azure MCP Server\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Overview\n            url: ../azure-mcp-server/overview.md\n      - linkListType: get-started\n        links:\n          - text: Get started with Azure MCP Server\n            url: ../azure-mcp-server/get-started.md\n      - linkListType: reference\n        links:\n          - text: Tools reference\n            url: ../azure-mcp-server/tools/index.md\n  - title: GitHub Copilot for Azure\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Overview\n            url: ../github-copilot-azure/introduction.md\n      - linkListType: get-started\n        links:\n          - text: Get started\n            url: ../github-copilot-azure/get-started.md\n          - text: Deploy with agent mode\n            url: ../github-copilot-azure/quickstart-deploy-app-agent-mode.md\n      - linkListType: learn\n        links:\n          - text: Learn about Azure and your app\n            url: ../github-copilot-azure/learn-examples.md\n"
  },
  {
    "path": "articles/ai-developer-tools/overview.md",
    "content": "---\ntitle: Azure AI developer tools overview\ndescription: The Azure AI developer tools help you build, deploy, and manage Azure applications with natural language through GitHub Copilot for Azure, Azure MCP Server, and Azure Skills.\nauthor: diberry\nms.author: diberry\nms.date: 04/02/2026\nms.topic: overview\nms.collection: ce-skilling-ai-copilot\nms.custom: build-2025\n---\n\n# Azure AI developer tools overview\n\nThe Azure AI developer tools are a collection of AI-powered tools that help you manage, deploy, and troubleshoot Azure resources by using natural language. The toolset includes GitHub Copilot for Azure, the Azure MCP Server, and Azure Skills. These tools work together across IDEs, terminals, and CI/CD pipelines.\n\n## Why use Azure AI developer tools?\n\nBuilding on Azure typically requires navigating portal UIs, reading documentation across multiple services, writing infrastructure-as-code templates, and debugging deployment issues. These tasks add friction before you write your first line of application code. This friction slows teams down and creates a steep learning curve, especially for developers new to Azure.\n\nThe Azure AI developer tools eliminate this friction by bringing Azure directly into your development workflow:\n\n- **Reduce context switching** - Ask questions about Azure services, manage resources, and deploy applications without leaving your IDE or terminal.\n- **Accelerate onboarding** - New team members can discover and use Azure services through natural language. They don't need to memorize CLI commands, portal navigation, or ARM/Bicep syntax.\n- **Enforce best practices automatically** - Azure Skills embed guardrails and proven patterns into every workflow. Deployments follow organizational standards without manual review checklists.\n- **Work where you already are** - Whether you use VS Code, Visual Studio, Cursor, IntelliJ, or a CLI, the Azure AI developer tools meet you in your existing environment.\n\n## Key tools\n\n| Tool | What it does | Best for |\n|---|---|---|\n| [GitHub Copilot for Azure](../github-copilot-azure/introduction.md) | Extension that surfaces Azure tools and skills through GitHub Copilot | Integrated IDE experience in VS Code or Visual Studio |\n| [Azure MCP Server](../azure-mcp-server/overview.md) | Standalone MCP server with 270+ tools across 50+ Azure services and Microsoft Entra ID authentication | Azure tools in any MCP-compatible client |\n| [Azure Skills](../azure-skills/overview.md) | Knowledge modules that provide end-to-end workflows with guardrails | Guided, best-practice Azure workflows |\n\n## Choose the right tool\n\nUse the following decision flow to determine which tool best fits your scenario.\n\n1. **Are you using VS Code or Visual Studio?**\n   - Yes → **[GitHub Copilot for Azure](../github-copilot-azure/introduction.md)** — Includes Azure MCP Server built-in.\n   - No → Continue to step 2.\n\n1. **Using another IDE (Cursor, IntelliJ, Windsurf)?**\n   - Yes → **[Azure MCP Server](../azure-mcp-server/overview.md)** — Install the standalone MCP server.\n   - No → Continue to step 3.\n\n1. **Want end-to-end workflows with guardrails?**\n   - Yes → **[Azure Skills](../azure-skills/overview.md)** — Available across multiple hosts including GitHub Copilot CLI, Claude Code, and VS Code.\n\n## Supported development environments\n\n| Environment | GitHub Copilot for Azure | Azure MCP Server | Azure Skills |\n|---|---|---|---|\n| VS Code | ✅ Extension + MCP Server | ✅ | ✅ |\n| Visual Studio 2022 | ✅ Built-in (with Azure Workload) | ✅ | ❌ |\n| Visual Studio 2026 | ✅ Built-in (with Azure Workload) | ✅ | ❌ |\n| Cursor | ❌ | ✅ | ✅ |\n| Windsurf | ❌ | ✅ | ✅ |\n| IntelliJ | ❌ | ✅ | ✅ |\n| GitHub Copilot CLI | ❌ | ✅ (via `/mcp add`) | ✅ |\n| Claude Code | ❌ | ✅ | ✅ |\n\n## Primary scenarios\n\nAll three tools — GitHub Copilot for Azure, Azure MCP Server, and Azure Skills — support most Azure development scenarios. The following table shows the recommended starting point for each scenario, but you can use any tool for any task.\n\n| Scenario | Example prompts |\n|---|---|\n| Learn about Azure services | \"What Azure services should I use with my app?\" |\n| Manage Azure resources | \"List all my storage accounts\" |\n| Deploy an application | \"Deploy my app to Azure\" |\n| Troubleshoot a failing app | \"Why is my app returning 500 errors?\" |\n| Query resources across subscriptions | \"Show me all VMs across my subscriptions\" |\n| Set up end-to-end deployment pipeline | \"Prepare and deploy my Node.js app to Azure\" |\n\n## Related content\n\n- [GitHub Copilot for Azure documentation](../github-copilot-azure/introduction.md)\n- [Azure MCP Server documentation](../azure-mcp-server/overview.md)\n- [Azure Skills documentation](../azure-skills/overview.md)\n"
  },
  {
    "path": "articles/ansible/aks-configure-clusters.md",
    "content": "---\ntitle: Tutorial - Configure Azure Kubernetes Service (AKS) clusters in Azure using Ansible\ndescription: Learn how to use Ansible to create and manage an Azure Kubernetes Service cluster in Azure\nkeywords: ansible, azure, devops, bash, cloudshell, playbook, aks, container, aks, kubernetes\nms.topic: tutorial\nms.date: 06/17/2020\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure Azure Kubernetes Service (AKS) clusters in Azure using Ansible\n\n[!INCLUDE [ansible-28-note.md](includes/ansible-28-note.md)]\n\n[!INCLUDE [open-source-devops-intro-aks.md](../includes/open-source-devops-intro-aks.md)]\n\nAKS can be configured to use [Microsoft Entra ID](/azure/active-directory/) for user authentication. Once configured, you use your Microsoft Entra authentication token to sign into the AKS cluster. The RBAC can be based on a user's identity or directory group membership.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create an AKS cluster\n> * Configure an AKS cluster\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [open-source-devops-prereqs-create-service-principal.md](../includes/open-source-devops-prereqs-create-service-principal.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create a managed AKS cluster\n\nThe sample playbook creates a resource group and an AKS cluster within the resource group.\n\nSave the following playbook as `azure_create_aks.yml`:\n\n```yml\n- name: Create Azure Kubernetes Service\n  hosts: localhost\n  connection: local\n  vars:\n    resource_group: myResourceGroup\n    location: eastus\n    aks_name: myAKSCluster\n    username: azureuser\n    ssh_key: \"your_ssh_key\"\n    client_id: \"your_client_id\"\n    client_secret: \"your_client_secret\"\n    aks_version: aks_version\n  tasks:\n  - name: Create resource group\n    azure_rm_resourcegroup:\n      name: \"{{ resource_group }}\"\n      location: \"{{ location }}\"\n  - name: Create a managed Azure Container Services (AKS) cluster\n    azure_rm_aks:\n      name: \"{{ aks_name }}\"\n      location: \"{{ location }}\"\n      resource_group: \"{{ resource_group }}\"\n      dns_prefix: \"{{ aks_name }}\"\n      kubernetes_version: \"{{aks_version}}\"\n      linux_profile:\n        admin_username: \"{{ username }}\"\n        ssh_key: \"{{ ssh_key }}\"\n      service_principal:\n        client_id: \"{{ client_id }}\"\n        client_secret: \"{{ client_secret }}\"\n      agent_pool_profiles:\n        - name: default\n          count: 2\n          vm_size: Standard_D2_v2\n      tags:\n        Environment: Production\n```\n\nBefore running the playbook, see the following notes:\n\n- The first section within `tasks` defines a resource group named `myResourceGroup` within the `eastus` location.\n- The second section within `tasks` defines an AKS cluster named `myAKSCluster` within the `myResourceGroup` resource group.\n- For the `your_ssh_key` placeholder, enter your RSA public key in the single-line format - starting with \"ssh-rsa\" (without the quotes).\n- For the `aks_version` placeholder, use the [az aks get-versions](/cli/azure/aks#az-aks-get-versions) command.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook azure_create_aks.yml\n```\n\nRunning the playbook shows results similar to the following output:\n\n```Output\nPLAY [Create AKS] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [Create resource group] \nchanged: [localhost]\n\nTASK [Create an Azure Container Services (AKS) cluster] \nchanged: [localhost]\n\nPLAY RECAP \nlocalhost                  : ok=3    changed=2    unreachable=0    failed=0\n```\n\n## Scale AKS nodes\n\nThe sample playbook in the previous section defines two nodes. You adjust the number of nodes by modifying the `count` value in the `agent_pool_profiles` block.\n\nSave the following playbook as `azure_configure_aks.yml`:\n\n```yml\n- name: Scale AKS cluster\n  hosts: localhost\n  connection: local\n  vars:\n    resource_group: myResourceGroup\n    location: eastus\n    aks_name: myAKSCluster\n    username: azureuser\n    ssh_key: \"your_ssh_key\"\n    client_id: \"your_client_id\"\n    client_secret: \"your_client_secret\"\n  tasks:\n  - name: Scaling an existed AKS cluster\n    azure_rm_aks:\n        name: \"{{ aks_name }}\"\n        location: \"{{ location }}\"\n        resource_group: \"{{ resource_group }}\"\n        dns_prefix: \"{{ aks_name }}\"\n        linux_profile:\n          admin_username: \"{{ username }}\"\n          ssh_key: \"{{ ssh_key }}\"\n        service_principal:\n          client_id: \"{{ client_id }}\"\n          client_secret: \"{{ client_secret }}\"\n        agent_pool_profiles:\n          - name: default\n            count: 3\n            vm_size: Standard_D2_v2\n```\n\nBefore running the playbook, see the following notes:\n\n- For the `your_ssh_key` placeholder, enter your RSA public key in the single-line format - starting with \"ssh-rsa\" (without the quotes).\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook azure_configure_aks.yml\n```\n\nRunning the playbook shows results similar to the following output:\n\n```Output\nPLAY [Scale AKS cluster] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [Scaling an existed AKS cluster] \nchanged: [localhost]\n\nPLAY RECAP \nlocalhost                  : ok=2    changed=1    unreachable=0    failed=0\n```\n\n## Delete a managed AKS cluster\n\nThe sample playbook deletes an AKS cluster.\n\nSave the following playbook as `azure_delete_aks.yml`:\n\n\n```yml\n- name: Delete a managed Azure Container Services (AKS) cluster\n  hosts: localhost\n  connection: local\n  vars:\n    resource_group: myResourceGroup\n    aks_name: myAKSCluster\n  tasks:\n  - name:\n    azure_rm_aks:\n      name: \"{{ aks_name }}\"\n      resource_group: \"{{ resource_group }}\"\n      state: absent\n  ```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook azure_delete_aks.yml\n```\n\nRunning the playbook shows results similar to the following output:\n\n```Output\nPLAY [Delete a managed Azure Container Services (AKS) cluster] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [azure_rm_aks] \n\nPLAY RECAP \nlocalhost                  : ok=2    changed=1    unreachable=0    failed=0\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Tutorial: Scale application in Azure Kubernetes Service (AKS)](/azure/aks/tutorial-kubernetes-scale)\n"
  },
  {
    "path": "articles/ansible/aks-configure-cni-networking.md",
    "content": "---\ntitle: Tutorial - Configure Azure CNI networking in Azure Kubernetes Service (AKS) using Ansible\ndescription: Learn how to use Ansible to configure Azure CNI networking in Azure Kubernetes Service (AKS) cluster\nkeywords: ansible, azure, devops, bash, cloudshell, playbook, aks, container, aks, kubernetes\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure Azure CNI networking in Azure Kubernetes Service (AKS) using Ansible\n\n[!INCLUDE [ansible-28-note.md](includes/ansible-28-note.md)]\n\n[!INCLUDE [open-source-devops-intro-aks.md](../includes/open-source-devops-intro-aks.md)]\n\nUsing AKS,  you can deploy a cluster using the following network models:\n\n- [Azure CNI networking](/azure/aks/configure-azure-cni) - AKS cluster is connected to existing virtual network (VNET) resources and configurations.\n\nFor more information about networking to your applications in AKS, see [Network concepts for applications in AKS](/azure/aks/concepts-network).\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create an AKS cluster\n> * Configure Azure CNI networking\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [open-source-devops-prereqs-create-service-principal.md](../includes/open-source-devops-prereqs-create-service-principal.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)] \n\n## Create a virtual network and subnet\n\nThe sample playbook code in this section is used to:\n\n- Create a virtual network\n- Create a subnet within the virtual network\n\nSave the following playbook as `vnet.yml`:\n\n```yml\n- name: Create vnet\n  azure_rm_virtualnetwork:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ name }}\"\n      address_prefixes_cidr:\n          - 10.0.0.0/8\n\n- name: Create subnet\n  azure_rm_subnet:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ name }}\"\n      address_prefix_cidr: 10.240.0.0/16\n      virtual_network_name: \"{{ name }}\"\n  register: subnet\n```\n\n## Create an AKS cluster in the virtual network\n\nThe sample playbook code in this section is used to:\n\n- Create an AKS cluster within a virtual network.\n\nSave the following playbook as `aks.yml`:\n\n```yml\n- name: List supported kubernetes version from Azure\n  azure_rm_aks_version:\n      location: \"{{ location }}\"\n  register: versions\n\n- name: Create AKS cluster within a VNet\n  azure_rm_aks:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ name }}\"\n      dns_prefix: \"{{ name }}\"\n      kubernetes_version: \"{{ versions.azure_aks_versions[-1] }}\"\n      agent_pool_profiles:\n        - count: 3\n          name: nodepool1\n          vm_size: Standard_D2_v2\n          vnet_subnet_id: \"{{ vnet_subnet_id }}\"\n      linux_profile:\n          admin_username: azureuser\n          ssh_key: \"{{ lookup('file', '~/.ssh/id_rsa.pub') }}\"\n      service_principal:\n          client_id: \"{{ lookup('ini', 'client_id section=default file=~/.azure/credentials') }}\"\n          client_secret: \"{{ lookup('ini', 'secret section=default file=~/.azure/credentials') }}\"\n      network_profile:\n          network_plugin: azure\n          docker_bridge_cidr: 172.17.0.1/16\n          dns_service_ip: 10.2.0.10\n          service_cidr: 10.2.0.0/24\n  register: aks\n```\n\nHere are some key notes to consider when working with the sample playbook:\n\n- Use the `azure_rm_aks_version` module to find the supported version.\n- The `vnet_subnet_id` is the subnet created in the previous section.\n- The playbook loads `ssh_key` from `~/.ssh/id_rsa.pub`. If you modify it, use the single-line format - starting with \"ssh-rsa\" (without the quotes).\n- The `client_id` and `client_secret` values are loaded from `~/.azure/credentials`, which is the default credential file. You can set these values to your service principal or load these values from environment variables:\n\n    ```yml\n    client_id: \"{{ lookup('env', 'AZURE_CLIENT_ID') }}\"\n    client_secret: \"{{ lookup('env', 'AZURE_SECRET') }}\"\n    ```\n\n## Run the sample playbook\n\nThe sample playbook code in this section is used to test various features shown throughout this tutorial.\n\nSave the following playbook as `aks-azure-cni.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: aksansibletest\n      name: aksansibletest\n      location: eastus\n  tasks:\n     - name: Ensure resource group exists\n       azure_rm_resourcegroup:\n           name: \"{{ resource_group }}\"\n           location: \"{{ location }}\"\n\n     - name: Create vnet\n       include_tasks: vnet.yml\n\n     - name: Create AKS\n       vars:\n           vnet_subnet_id: \"{{ subnet.state.id }}\"\n       include_tasks: aks.yml\n\n     - name: Show AKS cluster detail\n       debug:\n           var: aks\n```\n\nHere are some key notes to consider when working with the sample playbook:\n\n- Change the `aksansibletest` value to your resource group name.\n- Change the `aksansibletest` value to your AKS name.\n- Change the `eastus` value to your resource group location.\n\nRun the playbook using the ansible-playbook command:\n\n```bash\nansible-playbook aks-azure-cni.yml\n```\n\nAfter running the playbook, you see output similar to the following results:\n\n```Output\nPLAY [localhost] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [Ensure resource group exists] \nchanged: [localhost]\n\nTASK [Create vnet] \nincluded: /home/devops/aks-cni/vnet.yml for localhost\n\nTASK [Create vnet] \nchanged: [localhost]\n\nTASK [Create subnet] \nchanged: [localhost]\n\nTASK [Create AKS] \nincluded: /home/devops/aks-cni/aks.yml for localhost\n\nTASK [List supported kubernetes version from Azure] \n [WARNING]: Azure API profile latest does not define an entry for\nContainerServiceClient\n\nok: [localhost]\n\nTASK [Create AKS cluster with vnet] \nchanged: [localhost]\n\nTASK [Show AKS cluster detail] \nok: [localhost] => {\n    \"aks\": {\n        \"aad_profile\": {},\n        \"addon\": {},\n        \"agent_pool_profiles\": [\n            {\n                \"count\": 3,\n                \"name\": \"nodepool1\",\n                \"os_disk_size_gb\": 100,\n                \"os_type\": \"Linux\",\n                \"storage_profile\": \"ManagedDisks\",\n                \"vm_size\": \"Standard_D2_v2\",\n                \"vnet_subnet_id\": \"/subscriptions/BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB/resourceGroups/aksansibletest/providers/Microsoft.Network/virtualNetworks/aksansibletest/subnets/aksansibletest\"\n            }\n        ],\n        \"changed\": true,\n        \"dns_prefix\": \"aksansibletest\",\n        \"enable_rbac\": false,\n        \"failed\": false,\n        \"fqdn\": \"aksansibletest-0272707d.hcp.eastus.azmk8s.io\",\n        \"id\": \"/subscriptions/BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB/resourcegroups/aksansibletest/providers/Microsoft.ContainerService/managedClusters/aksansibletest\",\n        \"kube_config\": \"...\"\n        },\n        \"location\": \"eastus\",\n        \"name\": \"aksansibletest\",\n        \"network_profile\": {\n            \"dns_service_ip\": \"10.2.0.10\",\n            \"docker_bridge_cidr\": \"172.17.0.1/16\",\n            \"network_plugin\": \"azure\",\n            \"network_policy\": null,\n            \"pod_cidr\": null,\n            \"service_cidr\": \"10.2.0.0/24\"\n        },\n        \"node_resource_group\": \"MC_aksansibletest_aksansibletest_eastus\",\n        \"provisioning_state\": \"Succeeded\",\n        \"service_principal_profile\": {\n            \"client_id\": \"AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA\"\n        },\n        \"tags\": null,\n        \"type\": \"Microsoft.ContainerService/ManagedClusters\",\n        \"warnings\": [\n            \"Azure API profile latest does not define an entry for ContainerServiceClient\",\n            \"Azure API profile latest does not define an entry for ContainerServiceClient\"\n        ]\n    }\n}\n\nPLAY RECAP \nlocalhost                  : ok=9    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\n```\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Tutorial: Configure Microsoft Entra ID in AKS using Ansible](./aks-configure-rbac.md)\n"
  },
  {
    "path": "articles/ansible/aks-configure-rbac.md",
    "content": "---\ntitle: Tutorial - Configure role-based access control (RBAC) roles in Azure Kubernetes Service (AKS) using Ansible\ndescription: Learn how to use Ansible to configure RBAC in Azure Kubernetes Service(AKS) cluster\nkeywords: ansible, azure, devops, bash, cloudshell, playbook, aks, container, aks, kubernetes, azure active directory, rbac\nms.topic: tutorial\nms.date: 08/13/2024\nms.custom:\n  - devx-track-ansible\n  - sfi-image-nochange\n---\n\n# Tutorial: Configure role-based access control (RBAC) roles in Azure Kubernetes Service (AKS) using Ansible\n\n[!INCLUDE [ansible-28-note.md](includes/ansible-28-note.md)]\n\n[!INCLUDE [open-source-devops-intro-aks.md](../includes/open-source-devops-intro-aks.md)]\n\nAKS can be configured to use [Microsoft Entra ID](/azure/active-directory/) for user authentication. Once configured, you use your Microsoft Entra authentication token to sign into the AKS cluster. The RBAC can be based on a user's identity or directory group membership.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create a Microsoft Entra ID-enabled AKS cluster\n> * Configure an RBAC role in the cluster\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [open-source-devops-prereqs-create-service-principal.md](../includes/open-source-devops-prereqs-create-service-principal.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n- **Install the RedHat OpenShift library** - `pip install openshift`\n\n<a name='configure-azure-ad-for-aks-authentication'></a>\n\n## Configure Microsoft Entra ID for AKS authentication\n\nWhen configuring Microsoft Entra ID for AKS authentication, two Microsoft Entra applications are configured. This operation must be completed by an Azure tenant administrator. For more information, see [Integrate Microsoft Entra ID with AKS](/azure/aks/aad-integration#create-the-server-application). \n\nFrom the Azure tenant administrator, get the following values:\n\n- Server app secret\n- Server app ID\n- Client app ID \n- Tenant ID\n\nThese values are needed to run the sample playbook.  \n\n## Create an AKS cluster\n\nIn this section, you create an AKS with the [Microsoft Entra application](#configure-azure-ad-for-aks-authentication).\n\nHere are some key notes to consider when working with the sample playbook:\n\n- The playbook loads `ssh_key` from `~/.ssh/id_rsa.pub`. If you modify it, use the single-line format - starting with \"ssh-rsa\" (without the quotes).\n- The `client_id` and `client_secret` values are loaded from `~/.azure/credentials`, which is the default credential file. You can set these values to your service principal or load these values from environment variables:\n\n    ```yml\n    client_id: \"{{ lookup('env', 'AZURE_CLIENT_ID') }}\"\n    client_secret: \"{{ lookup('env', 'AZURE_SECRET') }}\"\n    ```\n\nSave the following playbook as `aks-create.yml`:\n\n```yml\n- name: Create resource group\n  azure_rm_resourcegroup:\n      name: \"{{ resource_group }}\"\n      location: \"{{ location }}\"\n\n- name: List supported kubernetes version from Azure\n  azure_rm_aksversion_facts:\n      location: \"{{ location }}\"\n  register: versions\n\n- name: Create AKS cluster with RBAC enabled\n  azure_rm_aks:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ name }}\"\n      dns_prefix: \"{{ name }}\"\n      enable_rbac: yes\n      kubernetes_version: \"{{ versions.azure_aks_versions[-1] }}\"\n      agent_pool_profiles:\n        - count: 3\n          name: nodepool1\n          vm_size: Standard_D2_v2\n      linux_profile:\n          admin_username: azureuser\n          ssh_key: \"{{ lookup('file', '~/.ssh/id_rsa.pub') }}\"\n      service_principal:\n          client_id: \"{{ lookup('ini', 'client_id section=default file=~/.azure/credentials') }}\"\n          client_secret: \"{{ lookup('ini', 'secret section=default file=~/.azure/credentials') }}\"\n      aad_profile:\n          client_app_id: \"{{ client_app_id }}\"\n          server_app_id: \"{{ server_app_id }}\"\n          server_app_secret: \"{{ server_app_secret }}\"\n          tenant_id: \"{{ app_tenant_id }}\"\n  register: aks\n\n- name: Save cluster user config\n  copy:\n      content: \"{{ aks.kube_config }}\"\n      dest: \"aks-{{ name }}-kubeconfig-user\"\n\n- name: Get admin config of AKS\n  azure_rm_aks_facts:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ name }}\"\n      show_kubeconfig: admin\n  register: aks\n\n- name: Save the kubeconfig\n  copy:\n      content: \"{{ aks.aks[0].kube_config }}\"\n      dest: \"aks-{{ name }}-kubeconfig\"\n```\n\n<a name='get-the-azure-ad-object-id'></a>\n\n## Get the Microsoft Entra Object ID\n\nTo create an RBAC binding, you first need to get the Microsoft Entra Object ID. \n\n1. Sign in to the [Azure portal](https://go.microsoft.com/fwlink/p/?LinkID=525040).\n\n1. In the search field at the top of the page, enter *Microsoft Entra ID*.\n\n1. Click `Enter`.\n\n1. In the **Manage** menu, select **Users**.\n\n1. In the name field, search for your account.\n\n1. In the **Name** column, select the link to your account.\n\n1. In the **Identity** section, copy the **Object ID**.\n\n## Create RBAC binding\n\nIn this section, you create a role binding or cluster role binding in AKS. \n\nSave the following playbook as `kube-role.yml`:\n\n```yml\napiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRoleBinding\nmetadata:\n  name: cluster-admins\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: cluster-admin\nsubjects:\n- apiGroup: rbac.authorization.k8s.io\n  kind: User\n  name: <your-aad-account>\n```\n\nReplace the `<your-aad-account>` placeholder with your Microsoft Entra tenant [Object ID](#get-the-azure-ad-object-id).\n\nSave the following playbook - that deploys your new role to AKS - as `aks-kube-deploy.yml`:\n\n```yml\n- name: Apply role to AKS\n  k8s:\n      src: kube-role.yml\n      kubeconfig: \"aks-{{ name }}-kubeconfig\"\n```\n\n## Run the sample playbook\n\nThis section lists the complete sample playbook that calls the tasks creating in this article. \n\nSave the following playbook as `aks-rbac.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: aksansibletest\n      name: aksansibletest\n      location: eastus\n  tasks:\n     - name: Ensure resource group exist\n       azure_rm_resourcegroup:\n           name: \"{{ resource_group }}\"\n           location: \"{{ location }}\"\n\n     - name: Create AKS\n       vars:\n           client_app_id: <client id>\n           server_app_id: <server id>\n           server_app_secret: <server secret>\n           app_tenant_id: <tenant id>\n       include_tasks: aks-create.yml\n\n     - name: Enable RBAC\n       include_tasks: aks-kube-deploy.yml\n```\n\nIn the `vars` section, replace the following placeholders with your Microsoft Entra information:\n\n- `<client id>`\n- `<server id>`\n- `<server secret>`\n- `<tenant id>`\n\nRun the complete playbook using the `ansible-playbook` command:\n\n```bash\nansible-playbook aks-rbac.yml\n```\n\n## Verify the results\n\nIn this section, you use kubectl list the nodes creating in this article.\n\nEnter the following command at a terminal prompt:\n\n```bash\nkubectl --kubeconfig aks-aksansibletest-kubeconfig-user get nodes\n```\n\nThe command will direct you to an authentication page. Sign in with your Azure account.\n\nOnce authenticated, kubectl lists the nodes in similar fashion to the following results:\n\n```txt\nTo sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXX to authenticate.\nNAME                       STATUS   ROLES   AGE   VERSION\naks-nodepool1-33413200-0   Ready    agent   49m   v1.12.6\naks-nodepool1-33413200-1   Ready    agent   49m   v1.12.6\naks-nodepool1-33413200-2   Ready    agent   49m   v1.12.6\n```\n\n## Clean up resources\n\nWhen no longer needed, delete the resources created in this article. \n\nSave the following code as `cleanup.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      name: aksansibletest\n      resource_group: aksansibletest\n  tasks:\n      - name: Clean up resource group\n        azure_rm_resourcegroup:\n            name: \"{{ resource_group }}\"\n            state: absent\n            force: yes\n      - name: Remove kubeconfig\n        file:\n            state: absent\n            path: \"aks-{{ name }}-kubeconfig\"\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook cleanup.yml\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Ansible on Azure](/azure/ansible/)\n"
  },
  {
    "path": "articles/ansible/application-gateway-configure.md",
    "content": "---\ntitle: Tutorial - Manage web traffic with Azure Application Gateway using Ansible\ndescription: Learn how to use Ansible to create and configure an Azure Application Gateway to manage web traffic\nkeywords: ansible, azure, devops, bash, playbook, application gateway, load balancer, web traffic\nms.topic: tutorial\nms.date: 09/14/2020\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Manage web traffic with Azure Application Gateway using Ansible\n\n[!INCLUDE [ansible-27-note.md](includes/ansible-27-note.md)]\n\n[Azure Application Gateway](/azure/application-gateway/overview) is a web traffic load balancer that enables you to manage traffic to your web applications. Based on the source IP address and port, traditional load balancers route traffic to a destination IP address and port. Application Gateway gives you a finer level of control where traffic can be routed based on the URL. For example, you could define that if `images` is URL's path, traffic is routed to a specific set of servers (known as a pool) configured for images.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Set up a network\n> * Create two Azure container instances with HTTPD images\n> * Create an application gateway that works with the Azure container instances in the server pool\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create a resource group\n\nThe playbook code in this section creates an Azure resource group. A resource group is a logical container in which Azure resources are configured.  \n\nSave the following playbook as `rg.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    location: eastus \n  tasks:\n    - name: Create a resource group\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n```\n\nBefore running the playbook, see the following notes:\n\n- The resource group name is `myResourceGroup`. This value is used throughout the tutorial.\n- The resource group is created in the `eastus` location.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook rg.yml\n```\n\n## Create network resources\n\nThe playbook code in this section creates a virtual network to enable the application gateway to communicate with other resources.\n\nSave the following playbook as `vnet_create.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    location: eastus \n    vnet_name: myVNet \n    subnet_name: myAGSubnet \n    publicip_name: myAGPublicIPAddress\n    publicip_domain: mydomain\n  tasks:\n    - name: Create a virtual network\n      azure_rm_virtualnetwork:\n        name: \"{{ vnet_name }}\"\n        resource_group: \"{{ resource_group }}\"\n        address_prefixes_cidr:\n            - 10.1.0.0/16\n            - 172.100.0.0/16\n        dns_servers:\n            - 127.0.0.1\n            - 127.0.0.2\n\n    - name: Create a subnet\n      azure_rm_subnet:\n        name: \"{{ subnet_name }}\"\n        virtual_network_name: \"{{ vnet_name }}\"\n        resource_group: \"{{ resource_group }}\"\n        address_prefix_cidr: 10.1.0.0/24\n\n    - name: Create a public IP address\n      azure_rm_publicipaddress:\n        resource_group: \"{{ resource_group }}\" \n        allocation_method: Dynamic\n        name: \"{{ publicip_name }}\"\n        domain_name_label: \"{{ publicip_domain }}\"\n```\n\nBefore running the playbook, see the following notes:\n\n* The `vars` section contains the values that are used to create the network resources. \n* You'll need to change these values for your specific environment.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook vnet_create.yml\n```\n\n## Create servers\n\nThe playbook code in this section creates two Azure container instances with HTTPD images to be used as web servers for the application gateway.  \n\nSave the following playbook as `aci_create.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    location: eastus \n    aci_1_name: myACI1\n    aci_2_name: myACI2\n  tasks:\n    - name: Create a container with httpd image \n      azure_rm_containerinstance:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ aci_1_name }}\"\n        os_type: linux\n        ip_address: public\n        location: \"{{ location }}\"\n        ports:\n          - 80\n        containers:\n          - name: mycontainer\n            image: httpd\n            memory: 1.5\n            ports:\n              - 80\n\n    - name: Create another container with httpd image \n      azure_rm_containerinstance:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ aci_2_name }}\"\n        os_type: linux\n        ip_address: public\n        location: \"{{ location }}\"\n        ports:\n          - 80\n        containers:\n          - name: mycontainer\n            image: httpd\n            memory: 1.5\n            ports:\n              - 80\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook aci_create.yml\n```\n\n## Create the application gateway\n\nThe playbook code in this section creates an application gateway named `myAppGateway`.  \n\nSave the following playbook as `appgw_create.yml`:\n\n```yml\n- hosts: localhost\n  connection: local\n  vars:\n    resource_group: myResourceGroup\n    vnet_name: myVNet\n    subnet_name: myAGSubnet\n    location: eastus\n    publicip_name: myAGPublicIPAddress\n    appgw_name: myAppGateway\n    aci_1_name: myACI1\n    aci_2_name: myACI2\n  tasks:\n    - name: Get info of Subnet\n      azure_rm_resource_facts:\n        api_version: '2018-08-01'\n        resource_group: \"{{ resource_group }}\"\n        provider: network\n        resource_type: virtualnetworks\n        resource_name: \"{{ vnet_name }}\"\n        subresource:\n          - type: subnets\n            name: \"{{ subnet_name }}\"\n      register: subnet\n\n    - name: Get info of backend server 1\n      azure_rm_resource_facts:\n        api_version: '2018-04-01'\n        resource_group: \"{{ resource_group }}\"\n        provider: containerinstance\n        resource_type: containergroups\n        resource_name: \"{{ aci_1_name }}\"\n      register: aci_1_output\n    - name: Get info of backend server 2\n      azure_rm_resource_facts:\n        api_version: '2018-04-01'\n        resource_group: \"{{ resource_group }}\"\n        provider: containerinstance\n        resource_type: containergroups\n        resource_name: \"{{ aci_2_name }}\"\n      register: aci_2_output\n\n    - name: Create instance of Application Gateway\n      azure_rm_appgateway:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ appgw_name }}\"\n        sku:\n          name: standard_v2\n          tier: standard_v2\n          capacity: 2\n        gateway_ip_configurations:\n          - subnet:\n              id: \"{{ subnet.response[0].id }}\"\n            name: appGatewayIP\n        frontend_ip_configurations:\n          - public_ip_address: \"{{ publicip_name }}\"\n            name: appGatewayFrontendIP\n        frontend_ports:\n          - port: 80\n            name: appGatewayFrontendPort\n        backend_address_pools:\n          - backend_addresses:\n              - ip_address: \"{{ aci_1_output.response[0].properties.ipAddress.ip }}\"\n              - ip_address: \"{{ aci_2_output.response[0].properties.ipAddress.ip }}\"\n            name: appGatewayBackendPool\n        backend_http_settings_collection:\n          - port: 80\n            protocol: http\n            cookie_based_affinity: enabled\n            name: appGatewayBackendHttpSettings\n        http_listeners:\n          - frontend_ip_configuration: appGatewayFrontendIP\n            frontend_port: appGatewayFrontendPort\n            name: appGatewayHttpListener\n        request_routing_rules:\n          - rule_type: Basic\n            backend_address_pool: appGatewayBackendPool\n            backend_http_settings: appGatewayBackendHttpSettings\n            http_listener: appGatewayHttpListener\n            name: rule1\n```\n\nBefore running the playbook, see the following notes:\n\n* `appGatewayIP` is defined in the `gateway_ip_configurations` block. A subnet reference is required for IP configuration of the gateway.\n* `appGatewayBackendPool` is defined in the `backend_address_pools` block. An application gateway must have at least one back-end address pool.\n* `appGatewayBackendHttpSettings` is defined in the `backend_http_settings_collection` block. It specifies that port 80 and an HTTP protocol are used for communication.\n* `appGatewayHttpListener` is defined in the `backend_http_settings_collection` block. It's the default listener associated with appGatewayBackendPool.\n* `appGatewayFrontendIP` is defined in the `frontend_ip_configurations` block. It assigns myAGPublicIPAddress to appGatewayHttpListener.\n* `rule1` is defined in the `request_routing_rules` block. It's the default routing rule associated with appGatewayHttpListener.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook appgw_create.yml\n```\n\nIt might take several minutes for the application gateway to be created.\n\n## Test the application gateway\n\n1. In the [Create a resource group](#create-a-resource-group) section, you specify a location. Note its value.\n\n1. In the [Create network resources](#create-network-resources) section, you specify the domain. Note its value.\n\n1. For the test URL by replacing the following pattern with the location and domain: `http://<domain>.<location>.cloudapp.azure.com`.\n\n1. Browse to the test URL.\n\n1. If you see the following page, the application gateway is working as expected.\n\n    ![Successful test of a working application gateway](media/application-gateway-configure/demo.png)\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Ansible on Azure](/azure/ansible/)\n"
  },
  {
    "path": "articles/ansible/azure-web-apps-configure.md",
    "content": "---\ntitle: Tutorial - Configure apps in Azure App Service using Ansible\ndescription: Learn how to create an app in Azure App Service with Java 8 and the Tomcat container runtime\nkeywords: ansible, azure, devops, bash, playbook, Azure App Service, Web App, Java\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible, devx-track-extended-java\n---\n\n# Tutorial: Configure apps in Azure App Service using Ansible\n\n[!INCLUDE [ansible-27-note.md](includes/ansible-27-note.md)]\n\n[!INCLUDE [open-source-devops-intro-app-service.md](../includes/open-source-devops-intro-app-service.md)]\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create an app in Azure App Service with Java 8 and the Tomcat container runtime\n> * Create an Azure Traffic Manager profile\n> * Define a Traffic Manager endpoint using the created app\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create a basic app service\n\nThe playbook code in this section defines the following resources:\n\n* Azure resource group within which the App Service plan and app are deployed\n* App service on Linux with Java 8 and the Tomcat container runtime\n\nSave the following playbook as `firstwebapp.yml`:\n\n```yml\n- hosts: localhost\n  connection: local\n  vars:\n    resource_group: myResourceGroup\n    webapp_name: myfirstWebApp\n    plan_name: myAppServicePlan\n    location: eastus\n  tasks:\n    - name: Create a resource group\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n\n    - name: Create App Service on Linux with Java Runtime\n      azure_rm_webapp:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ webapp_name }}\"\n        plan:\n          resource_group: \"{{ resource_group }}\"\n          name: \"{{ plan_name }}\"\n          is_linux: true\n          sku: S1\n          number_of_workers: 1\n        frameworks:\n          - name: \"java\"\n            version: \"8\"\n            settings:\n              java_container: tomcat\n              java_container_version: 8.5\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook firstwebapp.yml\n```\n\nAfter running the playbook, you see output similar to the following results:\n\n```Output\nPLAY [localhost] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [Create a resource group] \nchanged: [localhost]\n\nTASK [Create App Service on Linux with Java Runtime] \n [WARNING]: Azure API profile latest does not define an entry for WebSiteManagementClient\n\nchanged: [localhost]\n\nPLAY RECAP \nlocalhost                  : ok=3    changed=2    unreachable=0    failed=0\n```\n\n## Create an app and use Azure Traffic Manager\n\n[Azure Traffic Manager](/azure/app-service/web-sites-traffic-manager) enables you to control how requests from web clients are distributed to apps in Azure App Service. When App Service endpoints are added to an Azure Traffic Manager profile, Traffic Manager tracks the status of your App Service apps. Statuses include running, stopped, and deleted. Traffic Manager is used to decide which endpoints should receive the traffic.\n\nIn App Service, an app runs in an [App Service plan](/azure/app-service/overview-hosting-plans). An App Service plan defines a set of compute resources for an app to run. You can manage your App Service plan and web app in different groups.\n\nThe playbook code in this section defines the following resources:\n\n* Azure resource group within which the App Service plan is deployed\n* App Service plan\n* Azure resource group within which the app is deployed\n* App service on Linux with Java 8 and the Tomcat container runtime\n* Traffic Manager profile\n* Traffic Manager endpoint using the created app\n\nSave the following playbook as `webapp.yml`:\n\n```yml\n- hosts: localhost\n  connection: local\n  vars:\n    resource_group_webapp: myResourceGroupWebapp\n    resource_group: myResourceGroup\n    webapp_name: myLinuxWebApp\n    plan_name: myAppServicePlan\n    location: eastus\n    traffic_manager_profile_name: myTrafficManagerProfile\n    traffic_manager_endpoint_name: myTrafficManagerEndpoint\n\n  tasks:\n  - name: Create resource group\n    azure_rm_resourcegroup:\n        name: \"{{ resource_group_webapp }}\"\n        location: \"{{ location }}\"\n\n  - name: Create secondary resource group\n    azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n\n  - name: Create App Service Plan\n    azure_rm_appserviceplan:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ plan_name }}\"\n      location: \"{{ location }}\"\n      is_linux: true\n      sku: S1\n      number_of_workers: 1\n\n  - name: Create App Service on Linux with Java Runtime\n    azure_rm_webapp:\n        resource_group: \"{{ resource_group_webapp }}\"\n        name: \"{{ webapp_name }}\"\n        plan:\n          resource_group: \"{{ resource_group }}\"\n          name: \"{{ plan_name }}\"\n          is_linux: true\n          sku: S1\n          number_of_workers: 1\n        app_settings:\n          testkey: \"testvalue\"\n        frameworks:\n          - name: java\n            version: 8\n            settings:\n              java_container: \"Tomcat\"\n              java_container_version: \"8.5\"\n\n  - name: Get web app facts\n    azure_rm_webapp_facts:\n      resource_group: \"{{ resource_group_webapp }}\"\n      name: \"{{ webapp_name }}\"\n    register: webapp\n    \n  - name: Create Traffic Manager Profile\n    azure_rm_trafficmanagerprofile:\n      resource_group: \"{{ resource_group_webapp }}\"\n      name: \"{{ traffic_manager_profile_name }}\"\n      location: global\n      routing_method: performance\n      dns_config:\n        relative_name: \"{{ traffic_manager_profile_name }}\"\n        ttl:  60\n      monitor_config:\n        protocol: HTTPS\n        port: 80\n        path: '/'\n\n  - name: Add endpoint to traffic manager profile, using created web site\n    azure_rm_trafficmanagerendpoint:\n      resource_group: \"{{ resource_group_webapp }}\"\n      profile_name: \"{{ traffic_manager_profile_name }}\"\n      name: \"{{ traffic_manager_endpoint_name }}\"\n      type: azure_endpoints\n      location: \"{{ location }}\"\n      target_resource_id: \"{{ webapp.webapps[0].id }}\"\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook webapp.yml\n```\n\nAfter running the playbook, you see output similar to the following results:\n\n```Output\nPLAY [localhost] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [Create resource group] \nchanged: [localhost]\n\nTASK [Create resource group for app service plan] \nchanged: [localhost]\n\nTASK [Create App Service Plan] \n [WARNING]: Azure API profile latest does not define an entry for WebSiteManagementClient\n\nchanged: [localhost]\n\nTASK [Create App Service on Linux with Java Runtime] \nchanged: [localhost]\n\nTASK [Get web app facts] \nok: [localhost]\n\nTASK [Create Traffic Manager Profile] \n [WARNING]: Azure API profile latest does not define an entry for TrafficManagerManagementClient\n\nchanged: [localhost]\n\nTASK [Add endpoint to traffic manager profile, using the web site created above] \nchanged: [localhost]\n\nTASK [Get Traffic Manager Profile facts] \nok: [localhost]\n\nPLAY RECAP \nlocalhost                  : ok=9    changed=6    unreachable=0    failed=0\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Tutorial: Scale apps in Azure App Service using Ansible](/azure/ansible/ansible-scale-azure-web-apps)\n"
  },
  {
    "path": "articles/ansible/azure-web-apps-scale.md",
    "content": "---\ntitle: Tutorial - Scale apps in Azure App Service using Ansible\ndescription: Learn how to scale up an app in Azure App Service\nkeywords: ansible, azure, devops, bash, playbook, Azure App Service, Web App, scale, Java\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Scale apps in Azure App Service using Ansible\n\n[!INCLUDE [ansible-27-note.md](includes/ansible-27-note.md)]\n\n[!INCLUDE [open-source-devops-intro-app-service.md](../includes/open-source-devops-intro-app-service.md)]\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Get facts of an existing App Service plan\n> * Scale up the App Service plan to S2 with three workers\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n- **Azure App Service app** - If you don't have an Azure App Service app, [configure an app in Azure App Service using Ansible](azure-web-apps-configure.md).\n\n## Scale up an app\n\nThere are two workflows for scaling: *scale up* and *scale out*.\n\n**Scale up:** To scale up means to acquire more resources. These resources include CPU, memory, disk space, VMs, and more. You scale up an app by changing the pricing tier of the App Service plan to which the app belongs. \n**Scale out:** To scale out means to increase the number of VM instances that run your app. Depending on your App Service plan pricing tier, you can scale out to as many as 20 instances. [Autoscaling](/azure/azure-monitor/platform/autoscale-get-started) allows you to scale instance count automatically based on predefined rules and schedules.\n\nThe playbook code in this section defines following operation:\n\n* Get facts of an existing App Service plan\n* Update the App service plan to S2 with three workers\n\nSave the following playbook as `webapp_scaleup.yml`:\n\n```yml\n- hosts: localhost\n  connection: local\n  vars:\n    resource_group: myResourceGroup\n    plan_name: myAppServicePlan\n    location: eastus\n\n  tasks:\n  - name: Get facts of existing App service plan\n    azure_rm_appserviceplan_facts:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ plan_name }}\"\n    register: facts\n\n  - debug: \n      var: facts.appserviceplans[0].sku\n\n  - name: Scale up the App service plan\n    azure_rm_appserviceplan:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ plan_name }}\"\n      is_linux: true\n      sku: S2\n      number_of_workers: 3\n      \n  - name: Get facts\n    azure_rm_appserviceplan_facts:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ plan_name }}\"\n    register: facts\n\n  - debug: \n      var: facts.appserviceplans[0].sku\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook webapp_scaleup.yml\n```\n\nAfter running the playbook, you see output similar to the following results:\n\n```Output\nPLAY [localhost] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [Get facts of existing App service plan] \n [WARNING]: Azure API profile latest does not define an entry for WebSiteManagementClient\n\nok: [localhost]\n\nTASK [debug] \nok: [localhost] => {\n    \"facts.appserviceplans[0].sku\": {\n        \"capacity\": 1,\n        \"family\": \"S\",\n        \"name\": \"S1\",\n        \"size\": \"S1\",\n        \"tier\": \"Standard\"\n    }\n}\n\nTASK [Scale up the App service plan] \nchanged: [localhost]\n\nTASK [Get facts] \nok: [localhost]\n\nTASK [debug] \nok: [localhost] => {\n    \"facts.appserviceplans[0].sku\": {\n        \"capacity\": 3,\n        \"family\": \"S\",\n        \"name\": \"S2\",\n        \"size\": \"S2\",\n        \"tier\": \"Standard\"\n    }\n}\n\nPLAY RECAP \nlocalhost                  : ok=6    changed=1    unreachable=0    failed=0 \n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible/)"
  },
  {
    "path": "articles/ansible/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: Ansible\n      tocHref: /azure\n      topicHref: /azure/developer/ansible/index\n"
  },
  {
    "path": "articles/ansible/cache-for-redis-configure.md",
    "content": "---\ntitle: Tutorial - Configure caches in Azure Cache for Redis using Ansible\ndescription: Learn how to use Ansible to create, scale, reboot, and add a firewall rule to Azure Cache for Redis\nkeywords: ansible, azure, devops, bash, playbook, cache, redis\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure caches in Azure Cache for Redis using Ansible\n\n[!INCLUDE [ansible-29-note.md](includes/ansible-29-note.md)]\n\n[Azure Cache for Redis](/azure/azure-cache-for-redis/) is an open-source compatible service that allows you to build responsive apps by providing fast access to data. \n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create a cache\n> * Scale a cache\n> * Reboot a cache\n> * Add a firewall rule to a cache\n> * Delete a cache\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create a cache\n\nCreate an Azure Cache for Redis within a new resource group.\n\n```yml\n  - name: Create resource group\n    azure_rm_resourcegroup:\n      name: \"{{ resource_group }}\"\n      location: \"{{ location }}\"\n\n  - name: Create Azure Cache for Redis\n    azure_rm_rediscache:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n      sku:\n        name: basic\n        size: C1 \n```\n\nIt can take several minutes to provision a cache. The following code tells Ansible wait for the operation to complete:\n\n```yml\n  - name: Wait for Redis provisioning to complete\n    azure_rm_rediscache_info:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n    register: facts\n    until: \"{{ facts.rediscaches[0]['provisioning_state'] == 'Succeeded' }}\"\n    retries: 100\n    delay: 60\n```\n\nDuring the lengthy provisioning process, several \"error\" messages will be displayed. These messages can safely be ignored. The important message is the last message. In the following example, there are many error messages until the final (\"ok\") message.\n\n```Output\nFAILED - RETRYING: Get facts (100 retries left).\nFAILED - RETRYING: Get facts (99 retries left).\nFAILED - RETRYING: Get facts (98 retries left).\nFAILED - RETRYING: Get facts (97 retries left).\nFAILED - RETRYING: Get facts (96 retries left).\nFAILED - RETRYING: Get facts (95 retries left).\nFAILED - RETRYING: Get facts (94 retries left).\nFAILED - RETRYING: Get facts (93 retries left).\nFAILED - RETRYING: Get facts (92 retries left).\nFAILED - RETRYING: Get facts (91 retries left).\nok: [localhost]\n```\n\n## Scale the cache\n\nAzure Cache for Redis has different cache offerings depending on your app's needs. These cache options provide flexibility in the choice of cache size and features. If your app requirements change after the cache is created, you can scale the cache as needed. For more information about scaling, see [How to Scale Azure Cache for Redis](/azure/azure-cache-for-redis/cache-how-to-scale).\n\nThe following sample code scales the cache to **Standard**:\n\n```yml\n- name: Scale up Azure Cache for Redis\n    azure_rm_rediscache:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n      sku:\n        name: standard\n        size: C1\n```\n\nIt can take several minutes to scale a cache. The following code tells Ansible wait for the operation to complete:\n\n```yml\n  - name: Wait for Redis scaling up to complete\n    azure_rm_rediscache_info:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n    register: facts\n    until: \"{{ facts.rediscaches[0]['provisioning_state'] == 'Succeeded' }}\"\n    retries: 100\n    delay: 60\n```\n\nSimilar to the task to provision Azure Cache for Redis, output like the following message is normal:\n\n```output\n**FAILED - RETRYING: Get facts (100 retries left)** is normal.\n```\n\n## Reboot the cache\n\nThe following code reboots the cache created in previous sections.\n\n```yml\n  - name: Reboot Azure Cache for Redis\n    azure_rm_rediscache:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n      reboot:\n        reboot_type: all\n```\n\n### Add firewall rule\n\nThe following code adds a firewall rule to the cache:\n\n```yml\n  - name: Add Firewall rule\n    azure_rm_rediscachefirewallrule:\n      resource_group: \"{{ resource_group }}\"\n      cache_name: \"{{ redis_name }}\"\n      name: rule1\n      start_ip_address: 168.1.1.1\n      end_ip_address: 168.1.1.4\n```\n\n## Delete the cache\n\nThe following code deletes the cache:\n\n```yml\n  - name: Delete Azure Cache for Redis\n    azure_rm_rediscache:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n      state: absent\n```\n\n## Get the sample playbook\n\nThere are two ways to get the complete sample playbook:\n- [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/rediscache.yml) and save it to `rediscache.yml`.\n- Create a new file named `rediscache.yml` and copy following contents into it:\n\n```yml\n- name: Manage Azure Cache for Redis\n  hosts: localhost\n  connection: local\n  vars:\n    resource_group: \"{{ resource_group_name }}\"\n    redis_name: \"redis{{ resource_group_name }}\"\n    location: eastus2\n\n  roles:\n    - azure.azure_preview_modules\n\n  tasks:\n  - name: Create resource group\n    azure_rm_resourcegroup:\n      name: \"{{ resource_group }}\"\n      location: \"{{ location }}\"\n\n  - name: Create Azure Cache for Redis\n    azure_rm_rediscache:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n      sku:\n        name: basic\n        size: C1\n\n  - name: Wait for Redis provisioning to complete\n    azure_rm_rediscache_info:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n    register: facts\n    until: \"{{ facts.rediscaches[0]['provisioning_state'] == 'Succeeded' }}\"\n    retries: 100\n    delay: 60\n\n  - name: Scale up Azure Cache for Redis\n    azure_rm_rediscache:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n      sku:\n        name: standard\n        size: C1\n\n  - name: Wait for Redis scaling up to complete\n    azure_rm_rediscache_info:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n    register: facts\n    until: \"{{ facts.rediscaches[0]['provisioning_state'] == 'Succeeded' }}\"\n    retries: 100\n    delay: 60\n\n  - name: Reboot Azure Cache for Redis\n    azure_rm_rediscache:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n      reboot:\n        reboot_type: all\n\n  - name: Add Firewall rule\n    azure_rm_rediscachefirewallrule:\n      resource_group: \"{{ resource_group }}\"\n      cache_name: \"{{ redis_name }}\"\n      name: rule1\n      start_ip_address: 168.1.1.1\n      end_ip_address: 168.1.1.4\n\n  - name: Delete Azure Cache for Redis\n    azure_rm_rediscache:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ redis_name }}\"\n      state: absent\n```\n\n## Run the sample playbook\n\nIn this section, run the playbook to test various features shown in this article.\n\nIn the `vars` section, replace the `{{ resource_group_name }}` placeholder with the name of your resource group.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook rediscache.yml\n```\n\nThe output looks similar to the following results:\n\n```Output\nTASK [create resource group] \nTuesday 12 March 2019  16:21:07 +0800 (0:00:00.054)       0:00:01.503 \nok: [localhost]\n\nTASK [Create Azure Cache for Redis] \nTuesday 12 March 2019  16:21:09 +0800 (0:00:01.950)       0:00:03.454 \n [WARNING]: Azure API profile latest does not define an entry for RedisManagementClient\n\nchanged: [localhost]\n\nTASK [Dump host name] \nTuesday 12 March 2019  16:21:49 +0800 (0:00:40.125)       0:00:43.580 \nok: [localhost] =>\n  output['host_name']: redis0312.redis.cache.windows.net\n\nTASK [Get facts] \nTuesday 12 March 2019  16:21:49 +0800 (0:00:00.056)       0:00:43.636 \n [WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ facts.rediscaches[0]['provisioning_state'] == 'Succeeded' }}\n\nFAILED - RETRYING: Get facts (100 retries left).\nFAILED - RETRYING: Get facts (99 retries left).\nFAILED - RETRYING: Get facts (98 retries left).\nFAILED - RETRYING: Get facts (97 retries left).\nFAILED - RETRYING: Get facts (96 retries left).\nFAILED - RETRYING: Get facts (95 retries left).\nFAILED - RETRYING: Get facts (94 retries left).\nFAILED - RETRYING: Get facts (93 retries left).\nFAILED - RETRYING: Get facts (92 retries left).\nFAILED - RETRYING: Get facts (91 retries left).\nFAILED - RETRYING: Get facts (90 retries left).\nok: [localhost]\n\nTASK [Scale up Azure Cache for Redis] \nTuesday 12 March 2019  16:33:20 +0800 (0:11:31.296)       0:12:14.933 \nchanged: [localhost]\n\nTASK [Get facts] \nTuesday 12 March 2019  16:33:29 +0800 (0:00:09.164)       0:12:24.097 \n [WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ facts.rediscaches[0]['provisioning_state'] == 'Succeeded' }}\n\nFAILED - RETRYING: Get facts (100 retries left).\nFAILED - RETRYING: Get facts (99 retries left).\nFAILED - RETRYING: Get facts (98 retries left).\nFAILED - RETRYING: Get facts (97 retries left).\nFAILED - RETRYING: Get facts (96 retries left).\nFAILED - RETRYING: Get facts (95 retries left).\nFAILED - RETRYING: Get facts (94 retries left).\nFAILED - RETRYING: Get facts (93 retries left).\nFAILED - RETRYING: Get facts (92 retries left).\nFAILED - RETRYING: Get facts (91 retries left).\nok: [localhost]\n\nTASK [Reboot Azure Cache for Redis] \nTuesday 12 March 2019  16:43:57 +0800 (0:10:27.740)       0:22:51.838 \nok: [localhost]\n\nTASK [Add Firewall rule] \nTuesday 12 March 2019  16:44:02 +0800 (0:00:05.432)       0:22:57.271 \nchanged: [localhost]\n\nTASK [Delete Azure Cache for Redis] \nTuesday 12 March 2019  16:44:08 +0800 (0:00:05.137)       0:23:02.409 \nchanged: [localhost]\n\nPLAY RECAP \nlocalhost                  : ok=10   changed=4    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0\n\nTuesday 12 March 2019  16:44:14 +0800 (0:00:06.217)       0:23:08.626 \n\n```\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible/)"
  },
  {
    "path": "articles/ansible/cosmos-configure.md",
    "content": "---\ntitle: Tutorial - Configure Azure Cosmos DB accounts using Ansible\ndescription: Learn how to use Ansible to create and configure an Azure Cosmos DB\nkeywords: ansible, azure, devops, bash, playbook, cosmo db, database\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure Azure Cosmos DB accounts using Ansible\n\n[!INCLUDE [ansible-28-note.md](includes/ansible-28-note.md)]\n\n[Azure Cosmos DB](/azure/cosmos-db/) is a database service that supports several database types. These databases types include document, key-value, wide-column, and graph. Using Ansible, you can automate the deployment and configuration of resources in your environment.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create an account\n> * Retrieve the account keys\n> * Delete the account\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [open-source-devops-prereqs-create-service-principal.md](../includes/open-source-devops-prereqs-create-service-principal.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create a random postfix\n\nThe sample playbook snippet creates a random postfix. The postfix is used as part of the Azure Cosmos DB account name.\n\n```yml\n  - hosts: localhost\n    tasks:\n      - name: Prepare random postfix\n        set_fact:\n          rpfx: \"{{ 1000 | random }}\"\n        run_once: yes\n```\n\n## Create resource group \n\nThe sample playbook snippet creates an Azure resource group. A resource group is a logical container in which Azure resources are deployed and managed.\n\n```yml\n  - name: Create a resource group\n    azure_rm_resourcegroup:\n      name: \"{{ resource_group }}\"\n      location: \"{{ location }}\"\n```\n\n## Create virtual network and subnet\n\nThe following code creates a virtual network and subnet for the Azure Cosmos DB account:\n\n```yml\n  - name: Create virtual network\n    azure_rm_virtualnetwork:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vnet_name }}\"\n      address_prefixes_cidr:\n        - 10.1.0.0/16\n        - 172.100.0.0/16\n      dns_servers:\n        - 127.0.0.1\n        - 127.0.0.3\n\n  - name: Add subnet\n    azure_rm_subnet:\n      name: \"{{ subnet_name }}\"\n      virtual_network_name: \"{{ vnet_name }}\"\n      resource_group: \"{{ resource_group }}\"\n      address_prefix_cidr: \"10.1.0.0/24\"\n```\n\n## Create an Azure Cosmos DB account\n\nThe following code creates the Azure Cosmos DB account:\n\n```yml\n  - name: Create instance of Cosmos DB Account\n    azure_rm_cosmosdbaccount:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ cosmosdbaccount_name }}\"\n      location: eastus\n      kind: global_document_db\n      geo_rep_locations:\n        - name: eastus\n          failover_priority: 0\n        - name: westus\n          failover_priority: 1\n      database_account_offer_type: Standard\n      is_virtual_network_filter_enabled: yes\n      virtual_network_rules:\n        - subnet:\n            resource_group: \"{{ resource_group }}\"\n            virtual_network_name: \"{{ vnet_name }}\"\n            subnet_name: \"{{ subnet_name }}\"\n          ignore_missing_vnet_service_endpoint: yes\n      enable_automatic_failover: yes\n```\n\nThe account creation takes a few minutes to complete.\n\n## Retrieve the keys\n\nThe following code fetches the keys to use in your app.\n\n```yml\n  - name: Get Cosmos DB Account facts with keys\n    azure_rm_cosmosdbaccount_facts:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ cosmosdbaccount_name }}\"\n      retrieve_keys: all\n    register: output\n\n  - name: Display Cosmos DB Acccount facts output\n    debug:\n      var: output\n```\n\n## Delete the Azure Cosmos DB account\n\nFinally, the last snippet shows how to delete an Azure Cosmos DB account.\n\n```yml\n  - name: Delete instance of Cosmos DB Account\n    azure_rm_cosmosdbaccount:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ cosmosdbaccount_name }}\"\n      state: absent\n```\n\n## Get the sample playbook\n\nThere are two ways to get the complete sample playbook:\n- [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/cosmosdb_create.yml) and save it to `cosmosdb.yml`.\n- Create a new file named `cosmosdb.yml` and copy the following contents into it:\n\n```yml\n---\n- hosts: localhost\n  tasks:\n    - name: Prepare random postfix\n      set_fact:\n        rpfx: \"{{ 1000 | random }}\"\n      run_once: yes\n\n- hosts: localhost\n#  roles:\n#    - azure.azure_preview_modules\n  vars:\n    resource_group: \"{{ resource_group_name }}\"\n    location: eastus\n    vnet_name: myVirtualNetwork\n    subnet_name: mySubnet\n    cosmosdbaccount_name: cosmos{{ rpfx }}\n\n  tasks:\n    - name: Create a resource group\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n\n    - name: Create virtual network\n      azure_rm_virtualnetwork:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vnet_name }}\"\n        address_prefixes_cidr:\n          - 10.1.0.0/16\n          - 172.100.0.0/16\n        dns_servers:\n          - 127.0.0.1\n          - 127.0.0.3\n\n    - name: Add subnet\n      azure_rm_subnet:\n        name: \"{{ subnet_name }}\"\n        virtual_network_name: \"{{ vnet_name }}\"\n        resource_group: \"{{ resource_group }}\"\n        address_prefix_cidr: \"10.1.0.0/24\"\n\n    - name: Create instance of Cosmos DB Account\n      azure_rm_cosmosdbaccount:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ cosmosdbaccount_name }}\"\n        location: eastus\n        kind: global_document_db\n        geo_rep_locations:\n          - name: eastus\n            failover_priority: 0\n          - name: westus\n            failover_priority: 1\n        database_account_offer_type: Standard\n        is_virtual_network_filter_enabled: yes\n        virtual_network_rules:\n          - subnet:\n              resource_group: \"{{ resource_group }}\"\n              virtual_network_name: \"{{ vnet_name }}\"\n              subnet_name: \"{{ subnet_name }}\"\n            ignore_missing_vnet_service_endpoint: yes\n        enable_automatic_failover: yes\n\n    - name: Get Cosmos DB Account facts with keys\n      azure_rm_cosmosdbaccount_facts:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ cosmosdbaccount_name }}\"\n        retrieve_keys: all\n      register: output\n\n    - name: Display Cosmos DB Account facts output\n      debug:\n        var: output\n\n    - name: Delete instance of Cosmos DB Account\n      azure_rm_cosmosdbaccount:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ cosmosdbaccount_name }}\"\n        state: absent\n```\n\n## Run the sample playbook\n\nIn this section, run the playbook to test various features shown in this article.\n\nBefore running the playbook, make the following changes:\n- In the `vars` section, replace the `{{ resource_group_name }}` placeholder with the name of your resource group.\n- Ensure that the `cosmosdbaccount_name contains only lowercase characters and is globally unique.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook cosmosdb.yml\n```\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible/)\n"
  },
  {
    "path": "articles/ansible/create-ansible-service-principal.md",
    "content": "---\ntitle: Quickstart - Create an Azure service principal for Ansible\ndescription: In this quickstart, learn how to create an Azure Service Principal to authenticate to Azure.\nkeywords: ansible, azure, devops, bash, cloudshell, playbook, azure cli, azure powershell, powershell\nms.topic: quickstart\nms.date: 03/30/2022\nms.custom: devx-track-ansible, devx-track-azurecli, devx-track-azurepowershell, mode-portal\n---\n\n# Quickstart: Create an Azure service principal for Ansible\n\nIn this quickstart, you create an Azure service principal with AzureCLI or Azure PowerShell and authenticate to Azure from Ansible.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create an Azure service principal using the Azure CLI\n> * Create an Azure service principal using the Azure PowerShell\n> * Assign a role to the Azure service principal\n> * Get key information from the service principal\n> * Set environment variables so that Ansible can retrieve the service principal values\n> * Test the service principal\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation1.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation1.md)]\n\n## Create an Azure service principal\n\nAn Azure service principal gives you a dedicated account to manage Azure resources with Ansible.\n\nRun the following code to create an Azure service principal:\n\n# [Azure CLI](#tab/azure-cli)\n```azurecli-interactive\naz ad sp create-for-rbac --name ansible \\\n            --role Contributor \\\n            --scopes /subscriptions/<subscription_id>\n```\n\n>[!NOTE]\n>Store the password from the output in a secure location.\n\n# [Azure PowerShell](#tab/azurepowershell)\n\n```azurepowershell\n$password = '<Password>'\n\n$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential `\n-Property @{ StartDate=Get-Date; EndDate=Get-Date -Year 2024; Password=$password}\n\n$spSplat = @{\n    DisplayName = 'ansible'\n    PasswordCredential = $credentials\n}\n\n$sp = New-AzAdServicePrincipal @spSplat\n```\n\nReplace `'<Password>'` with your password.\n\n>[!NOTE]\n>Store the password in a secure location.\n\n---\n\n## Assign a role to the Azure service principal\n\nBy default service principals don't have the access necessary to manage resources in Azure.\n\nRun the following command to assign the **Contributor** role to the service principal:\n\n# [Azure CLI](#tab/azure-cli)\n```azurecli-interactive\naz role assignment create --assignee <appID> \\\n    --role Contributor \\\n    --scope /subscriptions/<subscription_id>\n```\n\nReplace `<appID>` with the value provided from the output of `az ad sp create-for-rbac` command.\n\n>[!NOTE]\n>To improve security, change the scope of the role assignment to a resource group instead of a subscription.\n\n# [Azure PowerShell](#tab/azurepowershell)\n\n```azurepowershell\n$subId = (Get-AzContext).Subscription.Id\n\n$roleAssignmentSplat = @{\n    ObjectId = $sp.id;\n    RoleDefinitionName = 'Contributor';\n    Scope = \"/subscriptions/$subId\"\n}\n\nNew-AzRoleAssignment @roleAssignmentSplat\n```\n\n>[!NOTE]\n>To improve security, change the scope of the role assignment to a resource group instead of a subscription.\n\n---\n\n## Get Azure service principal information\n\nTo authenticate to Azure with a service principal, you need the following information:\n\n* SubscriptionID\n* Service Principal ApplicationId\n* Service Principal password\n* TenantID\n\nRun the following commands to get the service principal information:\n\n# [Azure CLI](#tab/azure-cli)\n```azurecli-interactive\naz account show --query '{tenantId:tenantId,subscriptionid:id}';\n\naz ad sp list --display-name ansible --query '{clientId:[0].appId}'\n```\n# [Azure PowerShell](#tab/azurepowershell)\n\n```azurepowershell\n@{\n    subscriptionId = (Get-AzContext).Subscription.Id\n    clientid = (Get-AzADServicePrincipal -DisplayName 'ansible').ApplicationId.Guid\n    tenantid = (Get-AzContext).Tenant.Id\n}\n```\n\n---\n\n## Authenticate to Azure with the service principal\n\nRun the following commands to populate the required environment variables on the Ansible server:\n\n```bash\nexport AZURE_SUBSCRIPTION_ID=<SubscriptionID>\nexport AZURE_CLIENT_ID=<ApplicationId>\nexport AZURE_SECRET=<Password>\nexport AZURE_TENANT=<TenantID>\n```\n\nReplace `<SubscriptionID>`, `<ApplicationId>`, `<Password>`, and `<TenantID>` with the values of your service principal account.\n\n## Test service principal permissions\n\nRun the following command to create a new Azure resource group:\n\n```bash\nansible localhost -m azure_rm_resourcegroup -a \"name=<resource_group_name> location=<resource_group_location>\"\n```\n\nReplace `<resource_group_name>` and `<resource_group_location>` with your new resource group values.\n\n```Output\n[WARNING]: No inventory was parsed, only implicit localhost is available\nlocalhost | CHANGED => {\n    \"changed\": true,\n    \"contains_resources\": false,\n    \"state\": {\n        \"id\": \"/subscriptions/<subscriptionID>/resourceGroups/azcli-test\",\n        \"location\": \"eastus\",\n        \"name\": \"azcli-test\",\n        \"provisioning_state\": \"Succeeded\",\n        \"tags\": null\n    }\n}\n```\n\nRun the following command to delete the Azure resource group:\n\n```bash\nansible localhost -m azure_rm_resourcegroup -a \"name=<resource_group_name> state=absent force_delete_nonempty=yes\"\n```\n\nReplace `<resource_group_name>` with the name of your resource group.\n\n```Output\n[WARNING]: No inventory was parsed, only implicit localhost is available\nlocalhost | CHANGED => {\n    \"changed\": true,\n    \"contains_resources\": false,\n    \"state\": {\n        \"id\": \"/subscriptions/subscriptionID>/resourceGroups/azcli-test\",\n        \"location\": \"eastus\",\n        \"name\": \"azcli-test\",\n        \"provisioning_state\": \"Succeeded\",\n        \"status\": \"Deleted\",\n        \"tags\": null\n    }\n}\n\n```\n\n## Next steps\n\n* [Configure Linux virtual machines in Azure using Ansible](./vm-configure.md)\n"
  },
  {
    "path": "articles/ansible/devtest-labs-configure.md",
    "content": "---\ntitle: Tutorial - Configure labs in Azure DevTest Labs using Ansible\ndescription: Learn how to configure a lab in Azure DevTest Labs using Ansible\nkeywords: ansible, azure, devops, bash, playbook, devtest labs\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible, devx-track-arm-template\n---\n\n# Tutorial: Configure labs in Azure DevTest Labs using Ansible\n\n[!INCLUDE [ansible-28-note.md](includes/ansible-28-note.md)]\n\n[Azure DevTest Labs](/azure/lab-services/devtest-lab-overview) allows developers to automate the creation of VM environments for their apps. These environments can be configured for app developing, testing, and training. \n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create a lab\n> * Set the lab policies\n> * Set the lab schedules\n> * Create the lab virtual network\n> * Define an artifact source for the lab\n> * Create a VM within the lab\n> * List the lab's artifact sources and artifacts\n> * Get Azure Resource Manager information for the artifact sources\n> * Create the lab environment\n> * Create the lab image\n> * Delete the lab\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [open-source-devops-prereqs-create-service-principal.md](../includes/open-source-devops-prereqs-create-service-principal.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create resource group\n\nThe sample playbook snippet creates an Azure resource group. A resource group is a logical container in which Azure resources are deployed and managed.\n\n```yml\n  - name: Create a resource group\n    azure_rm_resourcegroup:\n      name: \"{{ resource_group }}\"\n      location: \"{{ location }}\"\n```\n\n## Create the lab\n\nThe next task creates the sample lab.\n\n```yml\n- name: Create the lab\n  azure_rm_devtestlab:\n    resource_group: \"{{ resource_group }}\"\n    name: \"{{ lab_name }}\"\n    location: \"{{ location }}\"\n    storage_type: standard\n    premium_data_disks: no\n  register: output_lab\n```\n\n## Set the lab policies\n\nYou can set up lab policy settings. The following values can be set:\n\n- `user_owned_lab_vm_count` is the number of VMs a user can own\n- `user_owned_lab_premium_vm_count` is the number of premium VMs a user can own\n- `lab_vm_count` is the maximum number of lab VMs\n- `lab_premium_vm_count` is the maximum number of lab premium VMs\n- `lab_vm_size` is the allowed lab VMs size(s)\n- `gallery_image` is the allowed gallery image(s)\n- `user_owned_lab_vm_count_in_subnet` is the maximum number of user's VMs in a subnet\n- `lab_target_cost` is the target cost of the lab\n\n```yml\n- name: Set the lab policies\n  azure_rm_devtestlabpolicy:\n    resource_group: \"{{ resource_group }}\"\n    lab_name: \"{{ lab_name }}\"\n    policy_set_name: myDtlPolicySet\n    name: myDtlPolicy\n    fact_name: user_owned_lab_vm_count\n    threshold: 5\n```\n\n## Set the lab schedules\n\nThe sample task in this section configures the lab schedule. \n\nIn the following code snippet, the `lab_vms_startup` value is used to specify the VM startup time. Likewise, setting the `lab_vms_shutdown` value establishes the lab VM shutdown time.\n\n```yml\n- name: Set the lab schedule\n  azure_rm_devtestlabschedule:\n    resource_group: \"{{ resource_group }}\"\n    lab_name: \"{{ lab_name }}\"\n    name: lab_vms_shutdown\n    time: \"1030\"\n    time_zone_id: \"UTC+12\"\n  register: output\n```\n\n## Create the lab virtual network\n\nThis following task creates the default lab virtual network.\n\n```yml\n- name: Create the lab virtual network\n  azure_rm_devtestlabvirtualnetwork:\n    resource_group: \"{{ resource_group }}\"\n    lab_name: \"{{ lab_name }}\"\n    name: \"{{ vn_name }}\"\n    location: \"{{ location }}\"\n    description: My lab virtual network\n  register: output\n```\n\n## Define an artifact source for the lab\n\nAn artifacts source is a properly structured GitHub repository that contains artifact definition and Azure Resource Manager templates. Every lab comes with predefined public artifacts. The follow tasks shows you how to create an artifact source for a lab.\n\n```yml\n- name: Define the lab artifacts source\n  azure_rm_devtestlabartifactsource:\n    resource_group: \"{{ resource_group }}\"\n    lab_name: \"{{ lab_name }}\"\n    name: \"{{ artifacts_name }}\"\n    uri: https://github.com/Azure/azure_preview_modules.git\n    source_type: github\n    folder_path: /tasks\n    security_token: \"{{ github_token }}\"\n```\n\n## Create a VM within the lab\n\nCreate a VM within the lab.\n\n```yml\n- name: Create a VM within the lab\n  azure_rm_devtestlabvirtualmachine:\n    resource_group: \"{{ resource_group }}\"\n    lab_name: \"{{ lab_name }}\"\n    name: \"{{ vm_name }}\"\n    notes: Virtual machine notes, just something....\n    os_type: linux\n    vm_size: Standard_A2_v2\n    user_name: dtladmin\n    password: ZSasfovobocu$$21!\n    lab_subnet:\n      virtual_network_name: \"{{ vn_name }}\"\n      name: \"{{ vn_name }}Subnet\"\n    disallow_public_ip_address: no\n    image:\n      offer: UbuntuServer\n      publisher: Canonical\n      sku: 16.04-LTS\n      os_type: Linux\n      version: latest\n    artifacts:\n      - source_name: \"{{ artifacts_name }}\"\n        source_path: \"/Artifacts/linux-install-mongodb\"\n    allow_claim: no\n    expiration_date: \"2029-02-22T01:49:12.117974Z\"\n```\n\n## List the lab's artifact sources and artifacts\n\nTo list all default and custom artifacts sources in the lab, use the following task:\n\n```yml\n- name: List the artifact sources\n  azure_rm_devtestlabartifactsource_facts:\n    resource_group: \"{{ resource_group }}\"\n    lab_name: \"{{ lab_name }}\"\n  register: output\n- debug:\n    var: output\n```\n\nThe following task lists all the artifacts:\n\n```yml\n- name: List the artifact facts\n  azure_rm_devtestlabartifact_facts:\n    resource_group: \"{{ resource_group }}\"\n    lab_name: \"{{ lab_name }}\"\n    artifact_source_name: public repo\n  register: output\n- debug:\n    var: output\n```\n\n## Get Azure Resource Manager information for the artifact sources\n\nTo list all the Azure Resource Manager templates in `public environment repository`, the predefined repository with templates:\n\n```yml\n- name: List the Azure Resource Manager template facts\n  azure_rm_devtestlabartifactsource_facts:\n    resource_group: \"{{ resource_group }}\"\n    lab_name: \"{{ lab_name }}\"\n  register: output\n- debug:\n    var: output\n```\n\nAnd the following task retrieves details of a specific Azure Resource Manager template from the repository:\n\n```yml\n- name: Get Azure Resource Manager template facts\n  azure_rm_devtestlabarmtemplate_facts:\n    resource_group: \"{{ resource_group }}\"\n    lab_name: \"{{ lab_name }}\"\n    artifact_source_name: \"public environment repo\"\n    name: ServiceFabric-LabCluster\n  register: output\n- debug:\n    var: output\n```\n\n## Create the lab environment\n\nThe following task creates the lab environment based on one of the templates from public environment repository.\n\n```yml\n- name: Create the lab environment\n      azure_rm_devtestlabenvironment:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        user_name: \"@me\"\n        name: myEnvironment\n        location: eastus\n        deployment_template: \"{{ output_lab.id }}/artifactSources/public environment repo/armTemplates/WebApp\"\n      register: output\n```\n\n## Create the lab image\n\nThe following task creates an image from a VM. The image allows you to create identical VMs.\n\n```yml\n- name: Create the lab image\n  azure_rm_devtestlabcustomimage:\n    resource_group: \"{{ resource_group }}\"\n    lab_name: \"{{ lab_name }}\"\n    name: myImage\n    source_vm: \"{{ output_vm.virtualmachines[0]['name'] }}\"\n    linux_os_state: non_deprovisioned\n```\n\n## Delete the lab\n\nTo delete the lab, use the following task:\n\n```yml\n- name: Delete the lab\n  azure_rm_devtestlab:\n    resource_group: \"{{ resource_group }}\"\n    name: \"{{ lab_name }}\"\n    state: absent\n  register: output\n- name: Assert the change was correctly reported\n  assert:\n    that:\n      - output.changed\n```\n\n## Get the sample playbook\n\nThere are two ways to get the complete sample playbook:\n- [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/devtestlab-create.yml) and save it to `devtestlab-create.yml`.\n- Create a new file named `devtestlab-create.yml` and copy the following contents into it:\n\n```yml\n---\n- hosts: localhost\n  #roles:\n  #  - azure.azure_preview_modules\n  vars:\n    resource_group: \"{{ resource_group_name }}\"\n    lab_name: myLab\n    vn_name: myLabVirtualNetwork\n    vm_name: myLabVm\n    artifacts_name: myArtifacts\n    github_token: \"{{ lookup('env','GITHUB_ACCESS_TOKEN') }}\"\n    location: eastus\n  tasks:\n    - name: Create a resource group\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n\n    - name: Create the lab\n      azure_rm_devtestlab:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ lab_name }}\"\n        location: eastus\n        storage_type: standard\n        premium_data_disks: no\n      register: output_lab\n\n    - name: Set the lab policies\n      azure_rm_devtestlabpolicy:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        policy_set_name: myDtlPolicySet\n        name: myDtlPolicy\n        fact_name: user_owned_lab_vm_count\n        threshold: 5\n\n    - name: Set the lab schedule\n      azure_rm_devtestlabschedule:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        name: lab_vms_shutdown\n        time: \"1030\"\n        time_zone_id: \"UTC+12\"\n      register: output\n\n    - name: Create the lab virtual network\n      azure_rm_devtestlabvirtualnetwork:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        name: \"{{ vn_name }}\"\n        location: eastus\n        description: My lab virtual network\n      register: output\n\n    - name: Define the lab artifacts source\n      azure_rm_devtestlabartifactsource:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        name: \"{{ artifacts_name }}\"\n        uri: https://github.com/Azure/azure_preview_modules.git\n        source_type: github\n        folder_path: /tasks\n        security_token: \"{{ github_token }}\"\n\n    - name:\n      set_fact:\n        artifact_source:\n          - source_name: \"{{ artifacts_name }}\"\n            source_path: \"/Artifacts/linux-install-mongodb\"\n      when: \"github_token | length > 0\"\n\n    - name:\n      set_fact:\n        artifact_source: null\n      when: \"github_token | length == 0\"\n\n    - name: Create a VM within the lab\n      azure_rm_devtestlabvirtualmachine:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        name: \"{{ vm_name }}\"\n        notes: Virtual machine notes, just something....\n        os_type: linux\n        vm_size: Standard_A2_v2\n        user_name: dtladmin\n        password: ZSasfovobocu$$21!\n        lab_subnet:\n          virtual_network_name: \"{{ vn_name }}\"\n          name: \"{{ vn_name }}Subnet\"\n        disallow_public_ip_address: no\n        image:\n          offer: UbuntuServer\n          publisher: Canonical\n          sku: 16.04-LTS\n          os_type: Linux\n          version: latest\n        artifacts:\n          - source_name: \"{{ artifacts_name }}\"\n            source_path: \"/Artifacts/linux-install-mongodb\"\n        allow_claim: no\n        expiration_date: \"2029-02-22T01:49:12.117974Z\"\n\n    - name: List the artifact sources\n      azure_rm_devtestlabartifactsource_facts:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n      register: output\n    - debug:\n        var: output\n\n    - name: List the artifact facts\n      azure_rm_devtestlabartifact_facts:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        artifact_source_name: public repo\n      register: output\n    - debug:\n        var: output\n\n    - name: List the Azure Resource Manager template facts\n      azure_rm_devtestlabarmtemplate_facts:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        artifact_source_name: \"public environment repo\"\n      register: output\n    - debug:\n        var: output\n\n    - name: Get Azure Resource Manager template facts\n      azure_rm_devtestlabarmtemplate_facts:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        artifact_source_name: \"public environment repo\"\n        name: ServiceFabric-LabCluster\n      register: output\n    - debug:\n        var: output\n\n    - name: Create the lab environment\n      azure_rm_devtestlabenvironment:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        user_name: \"@me\"\n        name: myEnvironment\n        location: eastus\n        deployment_template: \"{{ output_lab.id }}/artifactSources/public environment repo/armTemplates/WebApp\"\n\n    - name: Create the lab image\n      azure_rm_devtestlabcustomimage:\n        resource_group: \"{{ resource_group }}\"\n        lab_name: \"{{ lab_name }}\"\n        name: myImage\n        source_vm: \"{{ vm_name }}\"\n        linux_os_state: non_deprovisioned\n\n    - name: Delete the lab\n      azure_rm_devtestlab:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ lab_name }}\"\n        state: absent\n```\n\n## Run the playbook\n\nIn this section, run the playbook to test various features shown in this article.\n\nBefore running the playbook, make the following changes:\n- In the `vars` section, replace the `{{ resource_group_name }}` placeholder with the name of your resource group.\n- Store the GitHub token as an environment variable named `GITHUB_ACCESS_TOKEN`.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook devtestlab-create.yml\n```\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible/)\n"
  },
  {
    "path": "articles/ansible/dynamic-inventory-configure.md",
    "content": "---\ntitle: Tutorial - Configure dynamic inventories for Azure Virtual Machines using Ansible\ndescription: Learn how to populate your Ansible inventory dynamically from information in Azure\nkeywords: ansible, azure, devops, bash, cloudshell, dynamic inventory\nms.topic: tutorial\nms.date: 08/14/2024\nms.custom: devx-track-ansible, devx-track-azurecli, devx-track-azurepowershell, linux-related-content\n---\n\n# Tutorial: Configure dynamic inventories of your Azure resources using Ansible\n\n[!INCLUDE [ansible-28-note.md](includes/ansible-28-note.md)]\n\nThe [Ansible dynamic inventory](https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html) feature removes the burden of maintaining static inventory files.\n\nIn this tutorial, you use Azure's dynamic-inventory plug-in to populate your Ansible inventory.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Configure two test virtual machines.\n> * Add tags to Azure virtual machines\n> * Generate a dynamic inventory\n> * Use conditional and keyed groups to populate group memberships\n> * Run playbooks against groups within the dynamic inventory\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [open-source-devops-prereqs-create-service-principal.md](../includes/open-source-devops-prereqs-create-service-principal.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create Azure VMs\n\n1. Sign in to the [Azure portal](https://go.microsoft.com/fwlink/p/?LinkID=525040).\n\n1. Open [Cloud Shell](/azure/cloud-shell/overview).\n\n1. Create an Azure resource group to hold the virtual machines for this tutorial.\n\n    > [!IMPORTANT]\n    > The Azure resource group you create in this step must have a name that is entirely lower-case. Otherwise, the generation of the dynamic inventory will fail.\n\n    # [Azure CLI](#tab/azure-cli)\n    ```azurecli-interactive\n    az group create --resource-group ansible-inventory-test-rg --location eastus\n    ```\n    # [Azure PowerShell](#tab/azure-powershell)\n    \n    ```azurepowershell\n    New-AzResourceGroup -Name ansible-inventory-test-rg -Location eastus\n    ```\n    ---\n\n1. Create two Linux virtual machines on Azure using one of the following techniques:\n\n    - **Ansible playbook** - The article, [Create a basic Linux virtual machine in Azure with Ansible](./vm-configure.md) and [Create a basic Windows virtual machine in Azure with Ansible](./vm-configure-windows.md)  illustrates how to create a virtual machine from an Ansible playbook.\n\n    - **Azure CLI** - Issue each of the following commands in the Cloud Shell to create the two virtual machines:\n\n        # [Azure CLI](#tab/azure-cli)\n        ```azurecli-interactive\n        az vm create \\\n        --resource-group ansible-inventory-test-rg \\\n        --name win-vm \\\n        --image MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest \\\n        --admin-username azureuser \\\n        --admin-password <password>\n\n        az vm create \\\n        --resource-group ansible-inventory-test-rg \\\n        --name linux-vm \\\n        --image Ubuntu2204 \\\n        --admin-username azureuser \\\n        --admin-password <password>\n        ```\n\n\n        # [Azure PowerShell](#tab/azure-powershell)\n        \n        ```azurepowershell\n        $adminUsername = \"azureuser\"\n        $adminPassword = ConvertTo-SecureString <password> -AsPlainText -Force\n        $credential = New-Object System.Management.Automation.PSCredential ($adminUsername, $adminPassword);\n\n        New-AzVM `\n        -ResourceGroupName ansible-inventory-test-rg `\n        -Location eastus `\n        -Image MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest `\n        -Name win-vm `\n        -OpenPorts 3389 `\n        -Credential $credential\n\n        New-AzVM `\n        -ResourceGroupName ansible-inventory-test-rg `\n        -Location eastus `\n        -Image Ubuntu2204 `\n        -Name linux-vm `\n        -OpenPorts 22 `\n        -Credential $credential\n        ```\n        ---\n\n        Replace the `<password>` your password.\n\n## Add application role tags\n\nTags are used to organize and categorize Azure resources. Assigning the Azure VMs an application role allows you to use the tags as group names within the Azure dynamic inventory.\n\nRun the following commands to update the VM tags:\n\n# [Azure CLI](#tab/azure-cli)\n```azurecli-interactive\naz vm update \\\n--resource-group ansible-inventory-test-rg \\\n--name linux-vm \\\n--set tags.applicationRole='message-broker' \n\naz vm update \\\n--resource-group ansible-inventory-test-rg \\\n--name win-vm \\\n--set tags.applicationRole='web-server' \n```\n\n# [Azure PowerShell](#tab/azure-powershell)\n\n```azurepowershell\nGet-AzVM -Name win-vm -ResourceGroupName ansible-inventory-test-rg-pwsh | Update-AzVM -Tag @{\"applicationRole\"=\"web-server\"}\n\nGet-AzVM -Name linux-vm -ResourceGroupName ansible-inventory-test-rg-pwsh | Update-AzVM -Tag @{\"applicationRole\"=\"message-broker\"}\n```\n\n---\n\nLearn more about Azure tagging strategies at [Define your tagging strategy](/azure/cloud-adoption-framework/ready/azure-best-practices/resource-tagging).\n\n## Generate a dynamic inventory\n\nAnsible provides an [Azure dynamic-inventory plug-in](https://github.com/ansible/ansible/blob/stable-2.9/lib/ansible/plugins/inventory/azure_rm.py). \n\nThe following steps walk you through using the plug-in:\n\n1. Create a dynamic inventory named `myazure_rm.yml`\n\n    ```yml\n    plugin: azure_rm\n    include_vm_resource_groups:\n      - ansible-inventory-test-rg\n    auth_source: auto\n    ```\n\n    **Key point:**\n    * Ansible uses the inventory file name and extension to identify which inventory plug-in to use. To use the Azure dynamic inventory plug-in, the file must end with `azure_rm` and have an extension of either `yml` or `yaml`.\n\n1. Run the following command to query the VMs within the resource group:\n\n    ```bash\n    ansible-inventory -i myazure_rm.yml --graph\n    ```\n\n1. When you run the command, you see results similar to the following output:\n  \n    ```output\n    @all:\n      |--@ungrouped:\n      |  |--linux-vm_cdb4\n      |  |--win-vm_3211\n    ```\n\nBoth VMs belong to the `ungrouped` group, which is a child of the `all` group in the Ansible inventory.\n\n**Key point**:\n* By default the Azure dynamic inventory plug-in returns globally unique names. For this reason, the VM names may contain extra characters. You can disable that behavior by adding `plain_host_names: yes` to the dynamic inventory.\n\n## Find Azure VM hostvars\n\nRun the following command to view all the `hostvars`:\n\n```bash\nansible-inventory -i myazure_rm.yml --list\n```\n\n```output\n{\n    \"_meta\": {\n        \"hostvars\": {\n            \"linux-vm_cdb4\": {\n                \"ansible_host\": \"52.188.118.79\",\n                \"availability_zone\": null,\n                \"computer_name\": \"linux-vm\",\n                \"default_inventory_hostname\": \"linux-vm_cdb4\",\n                \"id\": \"/subscriptions/<subscriptionid>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/linux-vm\",\n                \"image\": {\n                    \"offer\": \"0001-com-ubuntu-server-jammy\",\n                    \"publisher\": \"Canonical\",\n                    \"sku\": \"22_04-lts-gen2\",\n                    \"version\": \"latest\"\n                },\n                ...,\n                \"tags\": {\n                    \"applicationRole\": \"message-broker\"\n                },\n                ...\n            },\n            \"win-vm_3211\": {\n                \"ansible_host\": \"52.188.112.110\",\n                \"availability_zone\": null,\n                \"computer_name\": \"win-vm\",\n                \"default_inventory_hostname\": \"win-vm_3211\",\n                \"id\": \"/subscriptions/<subscriptionid>/resourceGroups/ansible-inventory-test-rg/providers/Microsoft.Compute/virtualMachines/win-vm\",\n                \"image\": {\n                    \"offer\": \"WindowsServer\",\n                    \"publisher\": \"MicrosoftWindowsServer\",\n                    \"sku\": \"2019-Datacenter\",\n                    \"version\": \"latest\"\n                },\n                ...\n                \"tags\": {\n                    \"applicationRole\": \"web-server\"\n                },\n                ...\n            }\n        }\n    },\n    ...\n    }\n}\n```\n\nBy pulling information from Azure, the dynamic inventory populates the `hostvars` for each Azure VM. Those `hostvars` are then to determine the VM group memberships within the Ansible inventory.\n\n## Assign group membership with conditional_groups\n\nEach conditional group is made of two parts. The name of the group and the condition for adding a member to the group.\n\nUse the property `image.offer` to create conditional group membership for the _linux-vm_.\n\nOpen the `myazure_rm.yml` dynamic inventory and add the following `conditional_group`:\n\n```yml\nplugin: azure_rm\ninclude_vm_resource_groups:\n  - ansible-inventory-test-rg\nauth_source: auto\nconditional_groups:\n  linux: \"'ubuntu' in image.offer\"\n  windows: \"'WindowsServer' in image.offer\"\n```\n\nRun the `ansible-inventory` with the `--graph` option:\n\n```bash\nansible-inventory -i myazure_rm.yml --graph\n```\n\n```output\n@all:\n  |--@linux:\n  |  |--linux-vm_cdb4\n  |--@ungrouped:\n  |--@windows:\n  |  |--win-vm_3211\n```\n\nFrom the output, you can see the VMs are no longer associated with the `ungrouped` group. Instead, each VM is assigned to a new group created by the dynamic inventory.\n\n**Key point**:\n* Conditional groups allow you to name specific groups within your inventory and populate them using `hostvars`.\n\n## Assign group membership with keyed_groups\n\nKeyed groups assign group membership the same way conditional groups do, but when using a keyed group the group name is also dynamically populated.\n\nAdd the following keyed_group to the `myazure_rm.yml` dynamic inventory:\n\n```yml\nplugin: azure_rm\ninclude_vm_resource_groups:\n  - ansible-inventory-test-rg\nauth_source: auto\nconditional_groups:\n  linux: \"'ubuntu' in image.offer\"\n  windows: \"'WindowsServer' in image.offer\"\nkeyed_groups:\n - key: tags.applicationRole\n```\n\nRun the `ansible-inventory` with the `--graph` option:\n\n```bash\nansible-inventory -i myazure_rm.yml --graph\n```\n\n```output\n@all:\n  |--@_message_broker:\n  |  |--linux-vm_cdb4\n  |--@_web_server:\n  |  |--win-vm_3211\n  |--@linux:\n  |  |--linux-vm_cdb4\n  |--@ungrouped:\n  |--@windows:\n  |  |--win-vm_3211\n```\n\nFrom the output, you see two more groups `_message_broker` and `_web_server`. By using a keyed group, the `applicationRole` tag populates the group names and group memberships.\n\n**Key point**:\n* By default, keyed groups include a separator. To remove the separator, add `separator: \"\"` under the key property.\n\n## Run playbooks with group name patterns\n\nUse the groups created by the dynamic inventory to target subgroups.\n\n1. Create a playbook called `win_ping.yml` with the following contents:\n\n    ```yml\n    ---\n    - hosts: windows\n      gather_facts: false\n    \n      vars_prompt:\n        - name: username\n          prompt: \"Enter local username\"\n          private: false\n        - name: password\n          prompt: \"Enter password\"\n    \n      vars:\n        ansible_user: \"{{ username }}\"\n        ansible_password: \"{{ password }}\"\n        ansible_connection: winrm\n        ansible_winrm_transport: ntlm\n        ansible_winrm_server_cert_validation: ignore\n    \n      tasks:\n        - name: run win_ping\n          win_ping:\n    ```\n\n1. Run the `win_ping.yml` playbook.\n\n    ```bash\n    ansible-playbook win_ping.yml -i myazure_rm.yml\n    ```\n\n    When prompted, enter the `username` and `password` for the Azure Windows VM.\n\n    ```output\n    Enter local username: azureuser\n    Enter password:\n    \n    PLAY [windows] **************************************************************************************************************************************\n    \n    TASK [run win_ping] *********************************************************************************************************************************\n    ok: [win-vm_3211]\n    \n    PLAY RECAP ******************************************************************************************************************************************\n    win-vm_3211                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\n    ```\n\n    > [!IMPORTANT]\n    > If you get the error `winrm or requests is not installed: No module named 'winrm'`, install pywinrm with the following command: `pip install \"pywinrm>=0.3.0\"`\n\n1. Create a second playbook named `ping.yml` with the following contents:\n\n    ```yml\n    ---\n    - hosts: all\n      gather_facts: false\n    \n      vars_prompt:\n        - name: username\n          prompt: \"Enter ssh user\"\n        - name: password\n          prompt: \"Enter password for ssh user\"\n    \n      vars:\n        ansible_user: \"{{ username }}\"\n        ansible_password: \"{{ password }}\"\n        ansible_ssh_common_args: '-o StrictHostKeyChecking=no'\n    \n      tasks:\n        - name: run ping\n          ping:\n    ```\n\n1. Run the `ping.yml` playbook.\n\n    ```bash\n    ansible-playbook ping.yml -i myazure_rm.yml\n    ```\n\n    When prompted, enter the `username` and `password` for the Azure Linux VM.\n\n    ```output\n    Enter ssh username: azureuser\n    Enter password for ssh user:\n    \n    PLAY [linux] *******************************************************************************************************\n    \n    TASK [run ping] ****************************************************************************************************\n    ok: [linux-vm_cdb4]\n    \n    PLAY RECAP *********************************************************************************************************\n    linux-vm_cdb4              : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  \n    ```\n\n## Clean up resources\n\n# [Azure CLI](#tab/azure-cli)\n\n1. Run [az group delete](/cli/azure/group#az-group-delete) to delete the resource group. All resources within the resource group are deleted.\n\n    ```azurecli\n    az group delete --name <resource_group>\n    ```\n\n1. Verify that the resource group was deleted by using [az group show](/cli/azure/group#az-group-show).\n\n    ```azurecli\n    az group show --name <resource_group>\n    ```\n\n# [Azure PowerShell](#tab/azure-powershell)\n\n1. Run [Remove-AzResourceGroup](/powershell/module/az.resources/Remove-AzResourceGroup) to delete the resource group. All resources within the resource group are deleted.\n\n    ```azurepowershell\n    Remove-AzResourceGroup -Name <resource_group>\n    ```\n\n1. Verify that the resource group was deleted by using [Get-AzResourceGroup](/powershell/module/az.resources/Get-AzResourceGroup).\n\n    ```azurepowershell\n    Get-AzResourceGroup -Name <resource_group>\n    ```\n\n---\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Quickstart: Configure Linux virtual machines in Azure using Ansible](./vm-configure.md)\n"
  },
  {
    "path": "articles/ansible/getting-started-cloud-shell.md",
    "content": "---\ntitle: Get Started - Configure Ansible using Azure Cloud Shell\ndescription: Learn how to carry out various Ansible tasks with Bash in Azure Cloud Shell\nkeywords: ansible, azure, devops, bash, cloudshell, playbook, bash\nms.topic: quickstart\nms.date: 08/28/2021\nms.custom: devx-track-ansible, mode-portal\n---\n\n# Get Started: Configure Ansible using Azure Cloud Shell\n\n[!INCLUDE [annsible-intro.md](includes/ansible-intro.md)]\n\nThis article describes getting started with Ansible from the [Azure Cloud Shell](/azure/cloud-shell/overview) environment.\n\n## Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n- **Configure Azure Cloud Shell** - If you're new to Azure Cloud Shell, see [Quickstart for Bash in Azure Cloud Shell](/azure/cloud-shell/quickstart).\n\n[!INCLUDE [open-cloud-shell.md](../includes/open-cloud-shell.md)]\n\n## Automatic credential configuration\n\nWhen signed into the Cloud Shell, Ansible authenticates with Azure to manage infrastructure without any extra configuration.\n\nWhen working with multiple subscriptions, specify the subscription Ansible uses by exporting the `AZURE_SUBSCRIPTION_ID` environment variable.\n\nTo list all of your Azure subscriptions, run the following command:\n\n```azurecli-interactive\naz account list\n```\n\nUsing your Azure subscription ID, set the `AZURE_SUBSCRIPTION_ID` as follows:\n\n```console\nexport AZURE_SUBSCRIPTION_ID=<your-subscription-id>\n```\n\n## Test Ansible installation\n\nYou now have configured Ansible for use within Cloud Shell!\n\n[!INCLUDE [ansible-test-configuration.md](includes/ansible-test-configuration.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Quickstart: Configure virtual machine in Azure using Ansible](./vm-configure.md)\n"
  },
  {
    "path": "articles/ansible/hdinsight-configure.md",
    "content": "---\ntitle: Tutorial - Configure a cluster in Azure HDInsight using Ansible\ndescription: Learn how to use Ansible to configure, resize, and delete an Azure HDInsight cluster\nkeywords: ansible, azure, devops, bash, playbook, apache hadoop, hdinsight\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure a cluster in Azure HDInsight using Ansible\n\n[!INCLUDE [ansible-28-note.md](includes/ansible-28-note.md)]\n\n[Azure HDInsight](/azure/hdinsight/) is a Hadoop-based analytics service for processing data. HDInsight is an ETL (extract, transform, load) tool used to work with big data - either structured or unstructured. HDInsight supports several [cluster types](/azure/hdinsight/hadoop/apache-hadoop-introduction) where each type supports a different set of components. \n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create a storage account for HDInsight\n> * Configure a [HDInsight Spark cluster](/azure/hdinsight/spark/apache-spark-overview).\n> * Resize a cluster\n> * Delete a cluster\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)] \n\n## Create a random postfix\n\nThe playbook code in this section creates a random postfix to use as part of the Azure HDInsight cluster name.\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: \"{{ resource_group_name }}\"  \n  tasks:\n    - name: Prepare random prefix\n      set_fact:\n        rpfx: \"{{ resource_group | hash('md5') | truncate(7, True, '') }}{{ 1000 | random }}\"\n      run_once: yes\n```\n\n## Create resource group\n\nAn Azure resource group is a logical container in which Azure resources are deployed and managed.\n\nThe playbook code in this section creates a resource group.\n\n\n```yml\n  tasks:\n    - name: Create a resource group\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n```\n\n## Create a storage account and retrieve key\n\nAn Azure storage account is used as the default storage for the HDInsight cluster. \n\nThe playbook code in this section retrieves the key used to access the storage account.\n\n```yml\n- name: Create storage account\n  azure_rm_storageaccount:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ storage_account_name }}\"\n      account_type: Standard_LRS\n      location: eastus2\n\n- name: Get storage account keys\n  azure_rm_resource:\n    api_version: '2018-07-01'\n    method: POST\n    resource_group: \"{{ resource_group }}\"\n    provider: storage\n    resource_type: storageaccounts\n    resource_name: \"{{ storage_account_name }}\"\n    subresource:\n      - type: listkeys\n  register: storage_output\n\n- debug:\n    var: storage_output\n```\n\n## Create an HDInsight Spark cluster\n\nThe playbook code in this section creates the Azure HDInsight cluster.\n\n```yml\n- name: Create instance of Cluster\n  azure_rm_hdinsightcluster:\n    resource_group: \"{{ resource_group }}\"\n    name: \"{{ cluster_name }}\"\n    location: eastus2\n    cluster_version: 3.6\n    os_type: linux\n    tier: standard\n    cluster_definition:\n      kind: spark\n      gateway_rest_username: http-user\n      gateway_rest_password: MuABCPassword!!@123\n    storage_accounts:\n      - name: \"{{ storage_account_name }}.blob.core.windows.net\"\n        is_default: yes\n        container: \"{{ cluster_name }}\"\n        key: \"{{ storage_output['response']['keys'][0]['value'] }}\"\n    compute_profile_roles:\n      - name: headnode\n        target_instance_count: 1\n        vm_size: Standard_D3\n        linux_profile:\n          username: sshuser\n          password: MuABCPassword!!@123\n      - name: workernode\n        target_instance_count: 1\n        vm_size: Standard_D3\n        linux_profile:\n          username: sshuser\n          password: MuABCPassword!!@123\n      - name: zookeepernode\n        target_instance_count: 3\n        vm_size: Medium\n        linux_profile:\n          username: sshuser\n          password: MuABCPassword!!@123\n```\n\nThe instance creation can take several minutes to complete.\n\n## Resize the cluster\n\nAfter cluster creation, the only setting you can change is the number of worker nodes. \n\nThe playbook code in this section increments the number of worker nodes by updating `target_instance_count` within `workernode`.\n\n```yml\n- name: Resize cluster\n  azure_rm_hdinsightcluster:\n    resource_group: \"{{ resource_group }}\"\n    name: \"{{ cluster_name }}\"\n    location: eastus2\n    cluster_version: 3.6\n    os_type: linux\n    tier: standard\n    cluster_definition:\n      kind: spark\n      gateway_rest_username: http-user\n      gateway_rest_password: MuABCPassword!!@123\n    storage_accounts:\n      - name: \"{{ storage_account_name }}.blob.core.windows.net\"\n        is_default: yes\n        container: \"{{ cluster_name }}\"\n        key: \"{{ storage_output['response']['keys'][0]['value'] }}\"\n    compute_profile_roles:\n      - name: headnode\n        target_instance_count: 1\n        vm_size: Standard_D3\n        linux_profile:\n          username: sshuser\n          password: MuABCPassword!!@123\n      - name: workernode\n        target_instance_count: 2\n        vm_size: Standard_D3\n        linux_profile:\n          username: sshuser\n          password: MuABCPassword!!@123\n      - name: zookeepernode\n        target_instance_count: 3\n        vm_size: Medium\n        linux_profile:\n          username: sshuser\n          password: MuABCPassword!!@123\n    tags:\n      aaa: bbb\n  register: output\n```\n\n## Delete the cluster instance\n\nBilling for HDInsight clusters is prorated per minute. \n\nThe playbook code in this section deletes the cluster.\n\n```yml\n- name: Delete instance of Cluster\n  azure_rm_hdinsightcluster:\n    resource_group: \"{{ resource_group }}\"\n    name: \"{{ cluster_name }}\"\n    state: absent\n```\n\n## Get the sample playbook\n\nThere are two ways to get the complete sample playbook:\n- [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/hdinsight_create.yml) and save it to `hdinsight_create.yml`.\n- Create a new file named `hdinsight_create.yml` and copy the following contents into it:\n\n```yml\n---\n- hosts: localhost\n  vars:\n    resource_group: \"{{ resource_group_name }}\"\n  tasks:\n    - name: Prepare random prefix\n      set_fact:\n        rpfx: \"{{ resource_group | hash('md5') | truncate(7, True, '') }}{{ 1000 | random }}\"\n      run_once: yes\n\n- hosts: localhost\n  #roles:\n  #  - azure.azure_preview_modules\n  vars:\n    resource_group: \"{{ resource_group_name }}\"\n    location: eastus2\n    vnet_name: myVirtualNetwork\n    subnet_name: mySubnet\n    cluster_name: mycluster{{ rpfx }}\n    storage_account_name: mystorage{{ rpfx }}\n\n  tasks:\n    - name: Create a resource group\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n\n    - name: Create storage account\n      azure_rm_storageaccount:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ storage_account_name }}\"\n        account_type: Standard_LRS\n        location: \"{{ location }}\"\n\n    - name: Get storage account keys\n      azure_rm_resource:\n        api_version: '2018-07-01'\n        method: POST\n        resource_group: \"{{ resource_group }}\"\n        provider: storage\n        resource_type: storageaccounts\n        resource_name: \"{{ storage_account_name }}\"\n        subresource:\n          - type: listkeys\n      register: storage_output\n    - debug:\n        var: storage_output\n\n    - name: Create instance of Cluster\n      azure_rm_hdinsightcluster:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ cluster_name }}\"\n        location: \"{{ location }}\"\n        cluster_version: 3.6\n        os_type: linux\n        tier: standard\n        cluster_definition:\n          kind: spark\n          gateway_rest_username: http-user\n          gateway_rest_password: MuABCPassword!!@123 \n        storage_accounts:\n          - name: \"{{ storage_account_name }}.blob.core.windows.net\" \n            is_default: yes\n            container: \"{{ cluster_name }}\"\n            key: \"{{ storage_output['response']['keys'][0]['value'] }}\"\n        compute_profile_roles:\n          - name: headnode\n            target_instance_count: 1\n            vm_size: Standard_D3\n            linux_profile:\n              username: sshuser\n              password: MuABCPassword!!@123\n          - name: workernode\n            target_instance_count: 1\n            vm_size: Standard_D3\n            linux_profile:\n              username: sshuser\n              password: MuABCPassword!!@123\n          - name: zookeepernode\n            target_instance_count: 3\n            vm_size: Medium\n            linux_profile:\n              username: sshuser\n              password: MuABCPassword!!@123\n\n    - name: Resize cluster\n      azure_rm_hdinsightcluster:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ cluster_name }}\"\n        location: \"{{ location }}\"\n        cluster_version: 3.6\n        os_type: linux\n        tier: standard\n        cluster_definition:\n          kind: spark\n          gateway_rest_username: http-user\n          gateway_rest_password: MuABCPassword!!@123 \n        storage_accounts:\n          - name: \"{{ storage_account_name }}.blob.core.windows.net\"\n            is_default: yes\n            container: \"{{ cluster_name }}\"\n            key: \"{{ storage_output['response']['keys'][0]['value'] }}\"\n        compute_profile_roles:\n          - name: headnode\n            target_instance_count: 1\n            vm_size: Standard_D3\n            linux_profile:\n              username: sshuser\n              password: MuABCPassword!!@123\n          - name: workernode\n            target_instance_count: 2\n            vm_size: Standard_D3\n            linux_profile:\n              username: sshuser\n              password: MuABCPassword!!@123\n          - name: zookeepernode\n            target_instance_count: 3\n            vm_size: Medium\n            linux_profile:\n              username: sshuser\n              password: MuABCPassword!!@123\n        tags:\n          aaa: bbb\n      register: output\n    - debug:\n        var: output\n\n    - name: Assert the state has changed\n      assert:\n        that:\n          - output.changed\n\n    - name: Delete instance of Cluster\n      azure_rm_hdinsightcluster:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ cluster_name }}\"\n        state: absent\n```\n\n## Run the sample playbook\n\nIn this section, run the playbook to test various features shown in this article.\n\nBefore running the playbook, make the following changes:\n- In the `vars` section, replace the `{{ resource_group_name }}` placeholder with the name of your resource group.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook hdinsight.yml\n```\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible/)"
  },
  {
    "path": "articles/ansible/includes/ansible-210-note.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\n> [!Important]\n> Ansible 2.10 (or later) is required to run the sample playbooks in this article."
  },
  {
    "path": "articles/ansible/includes/ansible-27-note.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\n> [!Important]\n> Ansible 2.7 (or later) is required to run the sample playbooks in this article."
  },
  {
    "path": "articles/ansible/includes/ansible-28-note.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\n> [!Important]\n> Ansible 2.8 (or later) is required to run the sample playbooks in this article."
  },
  {
    "path": "articles/ansible/includes/ansible-29-note.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\n> [!Important]\n> Ansible 2.9 (or later) is required to run the sample playbooks in this article."
  },
  {
    "path": "articles/ansible/includes/ansible-configure-azure-collection.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\n- **Configure Azure collection**: Run the following command from a terminal window to install the Azure collection. If the Azure collection is already installed, the `--force` flag will update it to the most recent version.\n\n    ```bash\n    ansible-galaxy collection install azure.azcollection --force\n    ```\n"
  },
  {
    "path": "articles/ansible/includes/ansible-delete-resource-group.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\n#### [Ansible](#tab/ansible)\n\n1. Save the following code as `delete_rg.yml`.\n\n    ```yml\n    ---\n    - hosts: localhost\n      tasks:\n        - name: Deleting resource group - \"{{ name }}\"\n          azure_rm_resourcegroup:\n            name: \"{{ name }}\"\n            state: absent\n          register: rg\n        - debug:\n            var: rg\n    ```\n\n1. Run the playbook using the [ansible-playbook](https://docs.ansible.com/ansible/latest/user_guide/playbooks.html) command. Replace the placeholder with the name of the resource group to be deleted. All resources within the resource group will be deleted.\n\n    ```bash\n    ansible-playbook delete_rg.yml --extra-vars \"name=<resource_group>\"\n    ```\n\n    **Key points**:\n\n    - Because of the `register` variable and `debug` section of the playbook, the results display when the command finishes.\n    \n#### [Azure CLI](#tab/azure-cli)\n\n1. Run [az group delete](/cli/azure/group#az-group-delete) to delete the resource group. All resources within the resource group will be deleted.\n\n    ```azurecli\n    az group delete --name <resource_group>\n    ```\n\n1. Verify that the resource group was deleted by using [az group show](/cli/azure/group#az-group-show).\n\n    ```azurecli\n    az group show --name <resource_group>\n    ```\n\n#### [Azure PowerShell](#tab/azure-powershell)\n\n1. Run [Remove-AzResourceGroup](/powershell/module/az.resources/Remove-AzResourceGroup) to delete the resource group. All resources within the resource group will be deleted.\n\n    ```azurepowershell\n    Remove-AzResourceGroup -Name <resource_group>\n    ```\n\n1. Verify that the resource group was deleted by using [Get-AzResourceGroup](/powershell/module/az.resources/Get-AzResourceGroup).\n\n    ```azurepowershell\n    Get-AzResourceGroup -Name <resource_group>\n    ```\n\n---"
  },
  {
    "path": "articles/ansible/includes/ansible-intro.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\nGet started with [Ansible](https://www.ansible.com/) by configuring [Ansible on Azure](https://docs.ansible.com/ansible/latest/index.html) and creating a basic Azure resource group.\n\nAnsible is an open-source product that automates cloud provisioning, configuration management, and application deployments. Using Ansible you can provision virtual machines, containers, and network and complete cloud infrastructures. Also, Ansible allows you to automate the deployment and configuration of resources in your environment.\n"
  },
  {
    "path": "articles/ansible/includes/ansible-playbook.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\nRun [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html) to run the Ansible playbook.\n\n   ```bash\n   ansible-playbook main.yml\n   ```\n"
  },
  {
    "path": "articles/ansible/includes/ansible-prereqs-cloudshell-use-or-vm-creation1.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\n- **Install Ansible**: Do one of the following options:\n\n    - [Install](/azure/ansible/ansible-install-configure#install-ansible-on-an-azure-linux-virtual-machine) and [configure](/azure/ansible/ansible-install-configure#create-azure-credentials) Ansible on a Linux virtual machine\n    - [Configure Azure Cloud Shell](/azure/cloud-shell/quickstart)"
  },
  {
    "path": "articles/ansible/includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\n- **Install Ansible**: Do one of the following options:\n\n    - [Install](/azure/ansible/ansible-install-configure#install-ansible-on-an-azure-linux-virtual-machine) and [configure](/azure/ansible/ansible-install-configure#create-azure-credentials) Ansible on a Linux virtual machine \n    - [Configure Azure Cloud Shell](/azure/cloud-shell/quickstart) and - if you don't have access to a Linux virtual machine - [create a virtual machine with Ansible](/azure/ansible/ansible-create-vm)."
  },
  {
    "path": "articles/ansible/includes/ansible-prereqs-vm-scale-set.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\n- **Virtual machine scale set**: If you don't already have a scale set, you can [configure a scale set with Ansible](../vm-scale-set-configure.md)."
  },
  {
    "path": "articles/ansible/includes/ansible-service-principal.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\n## Create an Azure Service Principal\n\nRun the following commands to create an Azure Service Principal:\n\n# [Azure CLI](#tab/azure-cli)\n\n```azurecli\naz ad sp create-for-rbac --name <service-principal-name> \\\n        --role Contributor \\\n        --scopes /subscriptions/<subscription_id>\n```\n\nReplace `<service-principal-name>` with your service principal name.\n\n> [!Important]\n> Make note of the password value in the output, you won't be able to retrieve it afterwards.\n\n# [Azure PowerShell](#tab/azurepowershell)\n\n```azurepowershell\n$subId = '<subscriptionID>'\n$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{ StartDate=Get-Date; EndDate=Get-Date -Year 2024; Password='<Password>'};\n\n$params = @{\n    DisplayName = '<service-principal-name>'\n    PasswordCredential = $credentials\n}\n\n$sp = New-AzAdServicePrincipal @params\n\n$roleAssignmentSplat = @{\n    ObjectId = $sp.id\n    RoleDefinitionName = 'Contributor'\n    Scope = \"/subscriptions/$subId\"\n}\n\nNew-AzRoleAssignment @roleAssignmentSplat\n```\n\nReplace `<subscriptionID>` and `<Password>` and `<service-principal-name>` with the appropriate values.\n\n---\n"
  },
  {
    "path": "articles/ansible/includes/ansible-test-configuration.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 01/04/2022\nms.custom: devx-track-ansible\n---\n\nThis section shows how to create a test resource group within your new Ansible configuration. If you don't need to do that, you can skip this section.\n\n### Create an Azure resource group\n\n1. Save the following code as `create_rg.yml`.\n\n    ```yaml\n    ---\n    - hosts: localhost\n      connection: local\n      tasks:\n        - name: Creating resource group - \"{{ name }}\"\n          azure_rm_resourcegroup:\n            name: \"{{ name }}\"\n            location: \"{{ location }}\"\n          register: rg\n        - debug:\n            var: rg\n    ```\n\n1. Run the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html). Replace the placeholders with the name and location of the resource group to be created.\n\n    ```bash\n    ansible-playbook create_rg.yml --extra-vars \"name=<resource_group_name> location=<resource_group_location>\"\n    ```\n\n    **Key points**:\n\n    - Because of the `register` variable and `debug` section of the playbook, the results display when the command finishes.\n\n### Delete an Azure resource group\n\n[!INCLUDE [ansible-delete-resource-group.md](ansible-delete-resource-group.md)]\n"
  },
  {
    "path": "articles/ansible/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Ansible on Azure documentation\nsummary: Learn how to use Ansible to automate cloud provisioning, configuration management, and application deployments.\n\nmetadata:\n  title: Ansible on Azure documentation\n  description: Learn how to use Ansible to automate cloud provisioning, configuration management, and application deployments.\n  services: azure\n  ms.service: ansible\n  ms.topic: landing-page\n  author: TomArcherMsft\n  ms.author: tarcher\n  ms.date: 08/28/2021\n  ms.custom: devx-track-ansible\n\nlandingContent:\n  # Card\n  - title: About Ansible on Azure\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: About Ansible on Azure\n            url: overview.md\n      - linkListType: reference\n        links:\n          - text: Releases and features\n            url: module-version-matrix.md  \n          - text: All modules for Azure\n            url:  https://docs.ansible.com/ansible/2.9/modules/list_of_cloud_modules.html#azure\n\n  # Card\n  - title: Install and Configure Ansible\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Configure Ansible using Azure Cloud Shell\n            url: getting-started-cloud-shell.md\n          - text: Configure Ansible using Azure CLI\n            url: install-on-linux-vm.md\n      - linkListType: tutorial\n        links:\n          - text: Configure a dynamic inventory\n            url: dynamic-inventory-configure.md\n\n  # Card\n  - title: Manage Virtual Machines\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Create a Linux VM\n            url: vm-configure.md\n          - text: Manage a Linux VM\n            url: vm-manage.md\n          - text: Create a VM from a Shared Image Gallery\n            url: vm-configure-from-azure-shared-image-gallery.md\n          - text: Configure VM security using Azure Key Vault\n            url: ./key-vault-configure-secrets.md\n\n  # Card\n  - title: Manage Virtual Machine Scale Sets\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Configure virtual machine scale sets\n            url: vm-scale-set-configure.md\n          - text: Deploy applications to virtual machine scale sets\n            url: vm-scale-set-deploy-app.md\n          - text: Automatically scale virtual machine scale sets\n            url: vm-scale-set-auto-scale.md\n          - text: Update custom image\n            url: vm-scale-set-update-image.md\n          - text: Create a from Shared Image Gallery\n            url: vm-configure-from-azure-shared-image-gallery.md\n\n  # Card\n  - title: Manage Virtual Networks\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Configure peering\n            url: virtual-network-peering-configure.md\n          - text: Configure route tables\n            url: route-table-configure.md\n\n  # Card\n  - title: Manage AKS\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Configure AKS clusters\n            url: aks-configure-clusters.md\n          - text: Configure Azure CNI networking\n            url: aks-configure-cni-networking.md\n          - text: Configure RBAC roles in AKS cluster\n            url: aks-configure-rbac.md"
  },
  {
    "path": "articles/ansible/install-on-linux-vm.md",
    "content": "---\ntitle: Get Started - Configure Ansible on an Azure VM\ndescription: Learn how to install and configure Ansible on an Azure VM for managing Azure resources.\nkeywords: ansible, azure, devops, bash, cloudshell, playbook, azure cli, powershell, azure powershell\nms.topic: quickstart\nms.date: 08/14/2024\nms.custom: devx-track-ansible, devx-track-azurecli, devx-track-azurepowershell, mode-portal, linux-related-content\n---\n\n# Get Started: Configure Ansible on an Azure VM\n\nThis article shows how to install [Ansible](https://docs.ansible.com/) on an Ubuntu VM in Azure.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create a resource group\n> * Create an Ubuntu virtual machine\n> * Install Ansible on the virtual machine\n> * Connect to the virtual machine via SSH\n> * Configure Ansible on the virtual machine\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [open-source-devops-prereqs-create-sp.md](../includes/open-source-devops-prereqs-create-service-principal.md)]\n\n## Create a virtual machine\n\n1. Create an Azure resource group.\n\n    # [Azure CLI](#tab/azure-cli)\n\n    ```azurecli\n    az group create --name QuickstartAnsible-rg --location eastus\n    ```\n\n    You might need to replace the `--location` parameter with the appropriate value for your environment.\n\n    # [Azure PowerShell](#tab/azure-powershell)\n\n    ```azurepowershell\n    New-AzResourceGroup -Name QuickstartAnsible-rg -location eastus\n    ```\n\n    You might need to replace the `-location` parameter with the appropriate value for your environment.\n\n    ---\n\n1. Create the Azure virtual machine for Ansible.\n\n    # [Azure CLI](#tab/azure-cli)\n\n    ```azurecli\n    az vm create \\\n    --resource-group QuickstartAnsible-rg \\\n    --name QuickstartAnsible-vm \\\n    --image Ubuntu2204 \\\n    --admin-username azureuser \\\n    --admin-password <password>\n    ```\n\n    Replace the `<password>` your password.\n\n    # [Azure PowerShell](#tab/azure-powershell)\n\n    ```azurepowershell\n    $adminUsername = \"azureuser\"\n    $adminPassword = ConvertTo-SecureString <password> -AsPlainText -Force\n    $credential = New-Object System.Management.Automation.PSCredential ($adminUsername, $adminPassword);\n    \n    New-AzVM `\n    -ResourceGroupName QuickstartAnsible-rg `\n    -Location eastus `\n    -Image Ubuntu2204 `\n    -Name QuickstartAnsible-vm `\n    -OpenPorts 22 `\n    -Credential $credential\n    ```\n\n    Replace the `<password>` your password.\n\n1. Get the public Ip address of the Azure virtual machine.\n\n    # [Azure CLI](#tab/azure-cli)\n\n    ```azurecli\n    az vm show -d -g QuickstartAnsible-rg -n QuickstartAnsible-vm --query publicIps -o tsv\n    ```\n\n    # [Azure PowerShell](#tab/azure-powershell)\n\n    ```azurepowershell\n    (Get-AzVM -ResourceGroupName QuickstartAnsible-rg QuickstartAnsible-vm-pwsh | Get-AzPublicIpAddress).IpAddress\n    ```\n\n## Connect to your virtual machine via SSH\n\nUsing the SSH command, connect to your virtual machine's public IP address.\n\n```azurecli\nssh azureuser@<vm_ip_address>\n```\n\nReplace the `<vm_ip_address>` with the appropriate value returned in previous commands.\n\n## Install Ansible on the virtual machine\n\n### Ansible with azure.azcollection\n\nRun the following commands to configure Ansible on [Ubuntu](https://docs.ansible.com/ansible/latest/installation_guide/installation_distros.html#installing-ansible-on-ubuntu):\n\n```bash\n#!/bin/bash\n\nsudo apt update\n\nsudo apt install software-properties-common\n\nsudo add-apt-repository --yes --update ppa:ansible/ansible\n\nsudo apt install ansible\n\n# Install Ansible az collection for interacting with Azure. (optional)\nansible-galaxy collection install azure.azcollection --force \n\n# Install Ansible modules for Azure (optional)\nsudo pip3 install -r ~/.ansible/collections/ansible_collections/azure/azcollection/requirements.txt\n```\n\n**Key points**:\n* Ansible control node requires Python 2 (version 2.7) or Python 3 (versions 3.5 and higher) installed. Ansible 4.0.0 and ansible-core 2.11 has a soft dependency on Python 3.8, but functions with lower versions. However, Ansible 5.0.0 and ansible-core 2.12 will require 3.8 and newer.\n## Create Azure credentials\n\nTo configure the Ansible credentials, you need the following information:\n\n* Your Azure subscription ID and tenant ID\n* The service principal application ID and secret\n\nConfigure the Ansible credentials using one of the following techniques:\n\n- [Option 1: Create an Ansible credentials file](#file-credentials)\n- [Option 2: Define Ansible environment variables](#env-credentials)\n\n#### <span id=\"file-credentials\"/> Option 1: Create Ansible credentials file\n\nIn this section, you create a local credentials file to provide credentials to Ansible. For security reasons, credential files should only be used in development environments.\n\nFor more information about defining Ansible credentials, see [Providing Credentials to Azure Modules](https://docs.ansible.com/ansible/latest/scenario_guides/guides.html).\n\n1. Once you've successfully connected to the host virtual machine, create and open a file named `credentials`:\n\n    ```bash\n    mkdir ~/.azure\n    vi ~/.azure/credentials\n    ```\n\n1. Insert the following lines into the file. Replace the placeholders with the service principal values.\n\n    ```bash\n    [default]\n    subscription_id=<subscription_id>\n    client_id=<service_principal_app_id>\n    secret=<service_principal_password>\n    tenant=<service_principal_tenant_id>\n    ```\n\n1. Save and close the file.\n\n#### <span id=\"env-credentials\"/> Option 2: Define Ansible environment variables\n\nOn the host virtual machine, export the service principal values to configure your Ansible credentials.\n\n```bash\nexport AZURE_SUBSCRIPTION_ID=<subscription_id>\nexport AZURE_CLIENT_ID=<service_principal_app_id>\nexport AZURE_SECRET=<service_principal_password>\nexport AZURE_TENANT=<service_principal_tenant_id>\n```\n\n## Test Ansible installation\n\nYou now have a virtual machine with Ansible installed and configured!\n\nThis section shows how to create a test resource group within your new Ansible configuration. If you don't need to do that, you can skip this section.\n\n- [Option 1: Use an ad-hoc ansible command](#ad-hoc-command)\n- [Option 2: Write and run an Ansible playbook](#ansible-playbook)\n\n#### <span id=\"ad-hoc-command\"/> Option 1: Use an ad-hoc ansible command\n\nRun the following ad-hoc Ansible command to create a resource group:\n\n```bash\n\n#Ansible with azure.azcollection\nansible localhost -m azure.azcollection.azure_rm_resourcegroup -a \"name=<resource_group_name> location=<location>\"\n```\n\nReplace `<resource_group_name>` and `<location>` with your values.\n\n#### <span id=\"ansible-playbook\"/> Option 2: Write and run an Ansible playbook\n\n1. Save the following code as `create_rg.yml`.\n\n    Ansible with azure.azcollection\n\n    ```yml\n    - hosts: localhost\n      connection: local\n      collections:\n        - azure.azcollection\n      tasks:\n        - name: Creating resource group\n          azure_rm_resourcegroup:\n            name: \"<resource_group_name\"\n            location: \"<location>\"\n    ```\n\n    Replace `<resource_group_name>` and `<location>` with your values.\n\n1. Run the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html).\n\n    ```bash\n    ansible-playbook create_rg.yml\n    ```\n\nRead more about the [azure.azcollection](https://cloudblogs.microsoft.com/opensource/2020/04/28/announcing-azcollection-the-ansible-collection-for-azure/).\n\n### Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Ansible on Azure](./index.yml)\n"
  },
  {
    "path": "articles/ansible/key-vault-configure-secrets.md",
    "content": "---\ntitle: Use Azure Key Vault to store VM secrets with Ansible\ndescription: In this quickstart, learn how to store secrets in Azure Key Vault for VMs with Ansible.\nkeywords: ansible, azure, devops, bash, playbook, virtual machine\nms.topic: tutorial\nms.service: ansible\nms.date: 06/08/2021\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Use Azure Key Vault to store VM secrets with Ansible\n\nIn this quickstart, you'll create and retrieve secrets from Azure key vault with Ansible.\n\n[!INCLUDE [ansible-29-note.md](includes/ansible-29-note.md)]\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create an Azure key vault instance\n> * Create a secret store in Azure key vault\n> * Get secrets from Azure key vault with Ansible\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [open-source-devops-prereqs-create-sp.md](../includes/open-source-devops-prereqs-create-service-principal.md)]\n\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation1.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation1.md)]\n\n## Create an Azure key vault\n\nAnsible needs a resource group to deploy your resources in.\n\n1. Create an Ansible playbook named `create_kv.yml` add the following task to create a resource group:\n\n    ```yml\n    ---\n    - name: Create Azure key vault\n      hosts: localhost\n      connection: local\n      tasks:\n    \n      - name: Create resource group\n        azure_rm_resourcegroup:\n          name: ansible-kv-test-rg\n          location: eastus\n    ```\n\n1. Define the required variables for the tenant ID, service principal object ID, and vault name.\n\n    ```yml\n    ---\n    vars:\n      tenant_id: <tenantId>\n      object_id: <servicePrincipalObjectId>\n      vault_name: <vaultName>\n    ```\n\n    Replace `<tenantId>`, `<servicePrincipalObjectId>`, and `<vaultName>` with the appropriate values. The objectId is used to grant access to secrets within the key vault.\n\n    **key point**:\n    * Azure key vault names must be globally universally unique. The key vault and keys/secrets inside it are accessed via `https://{vault-name}.vault.azure.net` URI.\n\n1. Configure the Azure key vault instance by adding the `create_kv.yml` task.\n\n    ```yml\n    ---\n    - name: Create key vault instance\n      azure_rm_keyvault:\n        resource_group: ansible-kv-test-rg\n        vault_name: \"{{ vault_name }}\"\n        enabled_for_deployment: yes\n        vault_tenant: \"{{ tenant_id }}\"\n        sku:\n          name: standard\n        access_policies:\n          - tenant_id: \"{{ tenant_id }}\"\n            object_id: \"{{ object_id }}\"\n            secrets:\n              - get\n              - list\n              - set\n              - delete\n    ```\n\n1. Run the `create_kv.yml` playbook.\n\n    ```bash\n    ansible-playbook create_kv.yml\n    ```\n\n    ```output\n    PLAY [localhost] *******************************************************************************************************\n    \n    TASK [Gathering Facts] *************************************************************************************************\n    ok: [localhost]\n    \n    TASK [Create resource group] *******************************************************************************************\n    ok: [localhost]\n    \n    TASK [Create key vault instance] ************************************************************************************\n    ok: [localhost]\n    \n    PLAY RECAP *************************************************************************************************************\n    localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\n    ```\n\n## Complete create Azure key vault playbook\n\nThis section lists the entire sample Ansible playbook for creating an Azure key vault.\n\n```yaml\n- hosts: localhost\n  connection: local\n\n  vars:\n    tenant_id: <tenantId>\n    object_id: <servicePrincipalObjectId>\n    vault_name: <vaultName>\n\n  tasks:\n  - name: Create resource group \n    azure_rm_resourcegroup:\n      name: ansible-kv-test-rg\n      location: eastus\n\n  - name: Create instance of Key Vault\n    azure_rm_keyvault:\n      resource_group: ansible-kv-test-rg\n      vault_name: \"{{ vault_name }}\"\n      enabled_for_deployment: yes\n      vault_tenant: \"{{ tenant_id }}\"\n      sku:\n        name: standard\n      access_policies:\n        - tenant_id: \"{{ tenant_id }}\"\n          object_id: \"{{ object_id }}\"\n          secrets:\n            - get\n            - list\n            - set\n            - delete\n```\n\n## Create a secret in key vault\n\nBefore the secret can be created, you'll need the keyvault URI.\n\n1. Create another playbook named `create_kv_secret.yml`. Copy the following code into the playbook:\n\n    ```yml\n    ---\n    - hosts: localhost\n      connection: local\n    \n      tasks:\n    \n      - name: Get Key Vault by name\n        azure_rm_keyvault_info:\n          resource_group: ansible-kv-test-rg\n          name: <vaultName>\n        register: keyvault\n    \n      - name: set KeyVault uri fact\n        set_fact: keyvaulturi=\"{{ keyvault['keyvaults'][0]['vault_uri'] }}\"\n    \n      - name: Create a secret\n        azure_rm_keyvaultsecret:\n          secret_name: adminPassword\n          secret_value: <secretValue>\n          keyvault_uri: \"{{ keyvaulturi }}\"\n    ```\n\n    Replace `<vaultName>` with the name of your key vault name and `<secretValue>` with the value for the secret.\n\n    **Key point**:\n    * The `azure_rm_keyvault_info` and `set_facts` modules registers the key vault URI as a variable. That variable is then passed to the `azure_rm_keyvaultsecret` module to create the secret.\n\n1. Run the `create_kv_secret.yml` playbook.\n\n    ```bash\n    ansible-playbook create_kv_secret.yml\n    ```\n\n    ```output\n    PLAY [localhost] *******************************************************************************************************\n    \n    TASK [Gathering Facts] *************************************************************************************************\n    ok: [localhost]\n    \n    TASK [Get Key Vault by name] *******************************************************************************************\n    ok: [localhost]\n    \n    TASK [set KeyVault uri fact] *******************************************************************************************\n    ok: [localhost]\n    \n    TASK [Create a secret] *************************************************************************************************\n    ok: [localhost]\n    \n    PLAY RECAP *************************************************************************************************************\n    localhost                  : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0\n    ```\n\n## Get secrets from key vault\n\nSecrets stored in Azure key vault can be used to populate Ansible variables.\n\n1. Create a new playbook called `get_kv_secrets.yml` to retrieve key vault secrets with Ansible.\n\n    **Ansible 2.9 with azure_preview_modules**\n\n    ```yml\n    ---\n    - hosts: localhost\n      connection: local\n      roles: \n        -  { role: azure.azure_preview_modules }\n    \n      vars:\n        tenant_id: <tenantId>\n        vault_name: <vaultName>\n        secret_name: adminPassword\n        client_id: <servicePrincipalApplicationId>\n        client_secret: <servicePrincipalSecret>\n      \n      tasks:\n      - name: Get Key Vault by name\n        azure_rm_keyvault_info:\n          resource_group: ansible-kv-test-rg\n          name: \"{{ vault_name }}\"\n        register: keyvault\n    \n      - name: Set key vault URI fact\n        set_fact: keyvaulturi=\"{{ keyvault['keyvaults'][0]['vault_uri'] }}\"\n      \n      - name: Set key vault secret fact\n        set_fact: secretValue={{ lookup('azure_keyvault_secret',secret_name,vault_url=keyvaulturi, client_id=client_id, secret=client_secret, tenant_id=tenant_id) }}\n      \n      - name: Output key vault secret\n        debug:\n          msg: \"{{ secretValue }}\"\n    ```\n\n    Replace `<tenantId>`, `<vaultName>`, `<servicePrincipalApplicationId>`, and `<servicePrincipalSecret>` with the appropriate values.\n\n    To learn more about `azure_preview_modules`, see the [Ansible Galaxy](https://galaxy.ansible.com/Azure/azure_preview_modules) page.\n\n    **Ansible 2.10 with azure.azcollection**\n\n    ```yml\n    ---\n    - hosts: localhost\n      connection: local\n      collections:\n        - azure.azcollection\n      \n      vars:\n        vault_name: ansible-kv-test-01\n        secret_name: adminPassword\n    \n      tasks:\n    \n      - name: Get Key Vault by name\n        azure_rm_keyvault_info:\n          resource_group: ansible-kv-test-rg\n          name: \"{{ vault_name }}\"\n        register: keyvault\n    \n      - name: Set key vault URI fact\n        set_fact: keyvaulturi=\"{{ keyvault['keyvaults'][0]['vault_uri'] }}\"\n    \n      - name: Get secret value\n        azure_rm_keyvaultsecret_info:\n          vault_uri: \"{{ keyvaulturi }}\"\n          name: \"{{ secret_name }}\"\n        register: kvSecret\n    \n      - name: set secret fact\n        set_fact: secretValue=\"{{ kvSecret['secrets'][0]['secret'] }}\"\n    \n      - name: Output key vault secret\n        debug: \n          msg=\"{{ secretValue }}\"\n    ```\n\n    Replace `<vaultName>` with the appropriate value.\n\n    To learn more about `azcollection`, see [Ansible collection for Azure](https://galaxy.ansible.com/azure/azcollection).\n\n1. Run the `get-secret-value.yml` playbook.\n\n    ```bash\n    ansible-playbook get-secret-value.yml\n    ```\n\n    ```output\n    TASK [Output key vault secret] *************************************************\n    ok: [localhost] => {\n        \"msg\": \"<plainTextPassword>\"\n    }\n    ```\n\n    Confirm the output that replaced `<plainTextPassword>` is the plain text value of the secret previously created in Azure key vault.\n\n## Complete sample Ansible playbook\n\nThis section lists the entire sample Ansible playbook for configuring an Azure Windows VM using a key vault secret.\n\n```yml\n---\n- name: Create Azure VM\n  hosts: localhost\n  connection: local\n  gather_facts: false\n  collections:\n    - azure.azcollection\n\n  vars:\n    vault_uri: <key_vault_uri>\n    secret_name: <key_vault_secret_name>\n\n  tasks:\n\n  - name: Get latest version of a secret\n    azure_rm_keyvaultsecret_info:\n      vault_uri: \"{{ vault_uri }}\"\n      name: \"{{ secret_name }}\"\n    register: kvSecret\n\n  - name: Set secret fact\n    set_fact: secret_value=\"{{ kvSecret['secrets'][0]['secret'] }}\"\n\n  - name: Create resource group\n    azure_rm_resourcegroup:\n      name: myResourceGroup\n      location: eastus\n\n  - name: Create virtual network\n    azure_rm_virtualnetwork:\n      resource_group: myResourceGroup\n      name: vNet\n      address_prefixes: \"10.0.0.0/16\"\n\n  - name: Add subnet\n    azure_rm_subnet:\n      resource_group: myResourceGroup\n      name: subnet\n      address_prefix: \"10.0.1.0/24\"\n      virtual_network: vNet\n\n  - name: Create public IP address\n    azure_rm_publicipaddress:\n      resource_group: myResourceGroup\n      allocation_method: Static\n      name: pip\n    register: output_ip_address\n\n  - name: Output public IP\n    debug:\n      msg: \"The public IP is {{ output_ip_address.state.ip_address }}\"\n  \n  - name: Create Network Security Group\n    azure_rm_securitygroup:\n      resource_group: myResourceGroup\n      name: networkSecurityGroup\n      rules:\n        - name: 'allow_rdp'\n          protocol: Tcp\n          destination_port_range: 3389\n          access: Allow\n          priority: 1001\n          direction: Inbound\n\n  - name: Create a network interface\n    azure_rm_networkinterface:\n      name: nic\n      resource_group: myResourceGroup\n      virtual_network: vNet\n      subnet_name: subnet\n      security_group: networkSecurityGroup\n      ip_configurations:\n        - name: default\n          public_ip_address_name: pip\n          primary: True\n\n  - name: Create VM\n    azure_rm_virtualmachine:\n      resource_group: myResourceGroup\n      name: win-vm\n      vm_size: Standard_DS1_v2\n      admin_username: azureuser\n      admin_password: \"{{ secret_value }}\"\n      network_interfaces: nic\n      os_type: Windows\n      image:\n          offer: WindowsServer\n          publisher: MicrosoftWindowsServer\n          sku: 2019-Datacenter\n          version: latest\n    no_log: true\n```\n\nReplace `<key_vault_uri>` and `<key_vault_secret_name>` with the appropriate values.\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Ansible on Azure](./index.yml)\n"
  },
  {
    "path": "articles/ansible/module-version-matrix.md",
    "content": "---\ntitle: Ansible module and version matrix for Azure | Microsoft Docs\ndescription: Ansible module and version matrix for Azure\nkeywords: ansible, collect, matrix, version, azure, devops\nms.topic: reference\nms.date: 10/14/2019\nms.custom: devx-track-ansible\n---\n\n# Ansible module and version matrix\n\nAnsible includes a suite of modules for use in provisioning and configuring Azure resources. These resources include virtual machines, scale sets, networking services, and container services. This article lists the various Ansible modules for Azure and the Ansible versions in which they ship.\n\n## Ansible modules for Azure\n\nThe following modules can be executed directly on remote hosts or through playbooks.  \n\nThese modules are available from the Ansible official release and from the following Microsoft Azure Collection.\n\n> [!NOTE]\n> From Ansible 2.9 onwards, we renamed all *_facts modules to *_info to adhere to Ansible naming convention. The old and renamed modules are linked so apart from seeing a deprecation warning, all modules work as before.\n\n| Ansible module for Azure                   |  Ansible 2.4 |  Ansible 2.5 |  Ansible 2.6 | Ansible 2.7 | Ansible 2.8 | Ansible 2.9 | Azure Collection | \n|---------------------------------------------|--------------|--------------|-----------------------------|-------------------------------------|--------------|--------------|--------------|  \n| **Compute**                    |           |                          |                          |                            |           |           |           |\n| azure_rm_availabilityset                   | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_availabilityset_info              | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_batchaccount                       | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_deployment                         | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_deployment_info                   | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_functionapp                        | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_functionapp_info                  | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_gallery                            | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_gallery_info                       | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_galleryimage                       | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_galleryimage_info                  | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_galleryimageversion                | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_galleryimageversion_info           | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_image                              | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_image_info                        | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_resource                           | -            | -                           | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_resource_info                     | -            | -                           | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_resourcegroup                      | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_resourcegroup_info                | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_snapshot                           | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_virtualmachine                     | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_virtualmachine_info               | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_virtualmachineextension            | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_virtualmachineextension_info      | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_virtualmachineimage_info          | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_virtualmachinescaleset             | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_virtualmachinescaleset_info       | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_virtualmachinescalesetextension    | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_virtualmachinescalesetextension_info | -            | -                        | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_virtualmachinescalesetinstance     | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_virtualmachinescalesetinstance_info | -            | -                         | -            | -            | Yes          | Yes          | Yes          |\n| **Networking**                              |              |                             |              |              |              |              |              |\n| azure_rm_appgateway                         | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_applicationsecuritygroup           | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_applicationsecuritygroup_info     | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_cdnendpoint                        | -            | -                         | -          | -            | Yes          | Yes          | Yes          |\n| azure_rm_cdnendpoint_info                  | -            | -                         | -          | -            | Yes          | Yes          | Yes          |\n| azure_rm_cdnprofile                         | -            | -                         | -          | -            | Yes          | Yes          | Yes          |\n| azure_rm_cdnprofile_info                   | -            | -                         | -          | -            | Yes          | Yes          | Yes          |\n| azure_rm_dnsrecordset                       | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_dnsrecordset_info                 | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_dnszone                            | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_dnszone_info                      | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_firewall                           | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_firewall_info                      | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_loadbalancer                       | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_loadbalancer_info                 | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_networkinterface                   | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_networkinterface_info             | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_publicipaddress                    | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_publicipaddress_info              | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_route                              | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_routetable                         | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_routetable_info                   | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_securitygroup                      | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_securitygroup_info                 | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_subnet                             | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_subnet_info                       | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_trafficmanagerendpoint             | -            | -                         | -          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_trafficmanagerendpoint_info       | -            | -                         | -          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_trafficmanagerprofile              | -            | -                         | -          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_trafficmanagerprofile_info        | -            | -                         | -          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_virtualnetwork                     | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_virtualnetwork_info               | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_virtualnetworkgateway              | -            | -                         | -          | -            | Yes          | Yes          | Yes          |\n| azure_rm_virtualnetworkpeering              | -            | -                         | -          | -            | Yes          | Yes          | Yes          |\n| azure_rm_virtualnetworkpeering_info         | -            | -                         | -          | -            | -            | Yes          | Yes          |\n| **Storage**                    |           |                          |                          |                            |           |           |         |\n| azure_rm_manageddisk                        | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_manageddisk_info                  | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_storageaccount                     | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_storageaccount_info               | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_storageblob                        | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| **Web**                    |           |                          |                          |                             |           |           |           |\n| azure_rm_appserviceplan                     | -            | -                         | -          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_appserviceplan_info               | -            | -                         | -          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_webapp                             | -            | -                         | -          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_webapp_info                       | -            | -                         | -          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_webappslot                         | -            | -                         | -          | -            | Yes          | Yes          | Yes          |\n| **Containers**                    |           |                          |                          |                            |           |           |          |\n| azure_rm_acs                                | Yes          | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_aks                                | -            | -                           | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_aks_info                          | -            | -                           | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_aksversion_info                   | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_containerinstance                  | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_containerinstance_info            | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_containerregistry                  | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_containerregistry_info            | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_containerregistryreplication       | -            | -                           | -            | -            | -          | -          | Yes          |\n| azure_rm_containerregistryreplication_info  | -            | -                           | -            | -            | -          | -          | Yes          |\n| azure_rm_containerregistrywebhook           | -            | -                           | -            | -            | -          | -          | Yes          |\n| azure_rm_containerregistrywebhook_info      | -            | -                           | -            | -            | -          | -          | Yes          |\n| **Databases**                    |           |                          |                          |                             |           |           |          |\n| azure_rm_cosmosdbaccount                    | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_cosmosdbaccount_info              | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mariadbconfiguration               | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mariadbconfiguration_info         | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mariadbdatabase                    | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mariadbdatabase_info              | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mariadbfirewallrule                | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mariadbfirewallrule_info          | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mariadbserver                      | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mariadbserver_info                | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mysqlconfiguration                 | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mysqlconfiguration_info           | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mysqldatabase                      | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_mysqldatabase_info                | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_mysqlfirewallrule                  | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mysqlfirewallrule_info            | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_mysqlserver                        | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_mysqlserver_info                  | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_postgresqlconfiguration            | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_postgresqlconfiguration_info      | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_postgresqldatabase                 | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_postgresqldatabase_info           | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_postgresqlfirewallrule             | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_postgresqlfirewallrule_info       | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_postgresqlserver                   | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_postgresqlserver_info             | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_rediscache                         | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_rediscache_info                   | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_rediscachefirewallrule             | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_sqldatabase                        | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_sqldatabase_info                  | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_sqlfirewallrule                    | -            | -                           | -            | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_sqlfirewallrule_info              | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_sqlserver                          | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_sqlserver_info                    | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| **Analytics**                    |           |                          |                          |                             |           |           |          |\n| azure_rm_hdinsightcluster                   | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_hdinsightcluster_info              | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| **Integration**                    |           |                          |                          |                             |           |           |          |\n| azure_rm_servicebus                         | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_servicebus_info                   | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_servicebusqueue                    | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_servicebussaspolicy                | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_servicebustopic                    | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_servicebustopicsubscription        | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| **Security**                    |           |                          |                          |                             |           |           |           |\n| azure_rm_keyvault                           | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_keyvault_info                     | -            | -                           | -              | -          | Yes          | Yes          | Yes          |\n| azure_rm_keyvaultkey                        | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_keyvaultkey_info                   | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_keyvaultsecret                     | -            | Yes                         | Yes          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_roleassignment                     | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_roleassignment_info               | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_roledefinition                     | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_roledefinition_info               | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| **DevOps**               |           |                          |                          |                             |           |           |                  |\n| azure_rm_devtestlab                         | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlab_info                   | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabarmtemplate_info        | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabartifact_info           | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabartifactsource           | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabartifactsource_info     | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabcustomimage              | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabcustomimage_info         | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_devtestlabenvironment              | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabenvironment_info         | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_devtestlabpolicy                   | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabpolicy_info              | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_devtestlabschedule                 | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabschedule_info            | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| azure_rm_devtestlabvirtualmachine           | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabvirtualmachine_info | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabvirtualnetwork           | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_devtestlabvirtualnetwork_info     | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| **Azure Monitor**                           |              |                           |            |              |                 |           |              |\n| azure_rm_autoscale                          | -            | -                         | -          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_autoscale_info                    | -            | -                         | -          | Yes          | Yes          | Yes          | Yes          |\n| azure_rm_loganalyticsworkspace              | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_loganalyticsworkspace_info        | -            | -                           | -            | -            | Yes          | Yes          | Yes          |\n| azure_rm_monitorlogprofile                  | -            | -                           | -            | -            | -            | Yes          | Yes          |\n| **Management and Governance**     |              |                           |            |            |            |            |              |\n| azure_rm_automationaccount        | -            | -                         | -          | -          | -          | Yes        | Yes          |\n| azure_rm_automationaccount_info   | -            | -                         | -          | -          | -          | Yes        | Yes          |\n| azure_rm_lock                     | -            | -                         | -          | -          | -          | Yes        | Yes          |\n| azure_rm_lock_info                | -            | -                         | -          | -          | -          | Yes        | Yes          |\n| **Internet of Things**            |              |                           |            |            |            |            |              |\n| azure_rm_iotdevice                | -            | -                         | -          | -          | -          | Yes        | Yes          |\n| azure_rm_iotdevice_info           | -            | -                         | -          | -          | -          | Yes        | Yes          |\n| azure_rm_iotdevicemodule          | -            | -                         | -          | -          | -          | Yes        | Yes          |\n| azure_rm_iothub_info              | -            | -                         | -          | -          | -          | Yes        | Yes          |\n| azure_rm_iothub_info              | -            | -                         | -          | -          | -          | Yes        | Yes          |\n| azure_rm_iothubconsumergroup      | -            | -                         | -          | -          | -          | Yes        | Yes          |\n\n## Introduction to the Ansible Collection for Azure\n\nThe [Azure_preview_collection](https://galaxy.ansible.com/Azure/azure_preview_modules/) includes all the latest Azure modules. The updates and bug fixes are done in a more timely manner than the official Ansible release. If you use Ansible for Azure resource provisioning purposes, you're encouraged to install the `azure_preview_module` collection.\n\nThe `azure_preview_module` collection is released every three weeks.\n\n## Next steps\n\nFor more information about Ansible Collections, see [Using Collections](https://docs.ansible.com/ansible/latest/user_guide/collections_using.html). \n"
  },
  {
    "path": "articles/ansible/mysql-configure.md",
    "content": "---\ntitle: Tutorial - Configure databases in Azure Database for MySQL using Ansible\ndescription: Learn how to use Ansible to create and configure an Azure Database for MySQL server\nkeywords: ansible, azure, devops, bash, playbook, mysql, database\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure databases in Azure Database for MySQL using Ansible\n\n[!INCLUDE [ansible-27-note.md](includes/ansible-27-note.md)]\n\n[Azure Database for MySQL](/azure/mysql/overview) is a relational database service based on the MySQL Community Edition. Azure Database for MySQL enables you to manage MySQL databases in your web apps.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create a MySql server\n> * Create a MySql database\n> * Configure a firewall rule so that an external app can connect to your server\n> * Connect to your MySql server from the Azure Cloud Shell\n> * Query your available MySQL servers\n> * List all databases in your connected servers\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create a resource group\n\nThe playbook code in this section creates an Azure resource group. A resource group is a logical container in which Azure resources are deployed and managed.  \n\nSave the following playbook as `rg.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    location: eastus \n  tasks:\n    - name: Create a resource group\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n```\n\nBefore running the playbook, see the following notes:\n\n* A resource group named `myResourceGroup` is created.\n* The resource group is created in the `eastus` location:\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook rg.yml\n```\n\n## Create a MySQL server and database\n\nThe playbook code in this section creates a MySQL server and an Azure Database for MySQL instance. The new MySQL server is a Gen 5 Basic Purpose server with one vCore and is named `mysqlserveransible`. The database instance is named `mysqldbansible`.\n\nFor more information about pricing tiers, see [Azure Database for MySQL pricing tiers](/azure/mysql/concepts-pricing-tiers). \n\nSave the following playbook as `mysql_create.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    location: eastus\n    mysqlserver_name: mysqlserveransible\n    mysqldb_name: mysqldbansible\n    admin_username: mysqladmin\n    admin_password: <server_admin_password> \n  tasks:\n    - name: Create MySQL Server\n      azure_rm_mysqlserver:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ mysqlserver_name }}\"\n        sku:\n          name: B_Gen5_1\n          tier: Basic\n        location: \"{{ location }}\"\n        version: 5.6\n        enforce_ssl: True\n        admin_username: \"{{ admin_username }}\"\n        admin_password: \"{{ admin_password }}\"\n        storage_mb: 51200\n    - name: Create instance of MySQL Database\n      azure_rm_mysqldatabase:\n        resource_group: \"{{ resource_group }}\"\n        server_name: \"{{ mysqlserver_name }}\"\n        name: \"{{ mysqldb_name }}\"\n```\n\nBefore running the playbook, see the following notes:\n\n* In the `vars` section, the value of `mysqlserver_name` must be unique.\n* In the `vars` section, replace `<server_admin_password>` with a password.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook mysql_create.yml\n```\n\n## Configure a firewall rule\n\nA server-level firewall rule allows an external app to connect to your server through the Azure MySQL service firewall. Examples of external apps are the `mysql` command-line tool and the MySQL Workbench.\n\nThe playbook code in this section creates a firewall rule named `extenalaccess` that allows connections from any external IP address. \n\nSave the following playbook as `mysql_firewall.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    mysqlserver_name: mysqlserveransible\n  tasks:\n  - name: Open firewall to access MySQL Server from outside\n    azure_rm_resource:\n      api_version: '2017-12-01'\n      resource_group: \"{{ resource_group }}\"\n      provider: dbformysql\n      resource_type: servers\n      resource_name: \"{{ mysqlserver_name }}\"\n      subresource:\n        - type: firewallrules\n          name: externalaccess\n      body:\n        properties:\n          startIpAddress: \"0.0.0.0\"\n          endIpAddress: \"255.255.255.255\"\n```\n\nBefore running the playbook, see the following notes:\n\n* In the vars section, replace `startIpAddress` and `endIpAddress`. Use the range of IP addresses that correspond to the range from which you'll be connecting.\n* Connections to Azure Database for MySQL communicate over port 3306. If you try to connect from within a corporate network, outbound traffic over port 3306 might not be allowed. In that case, you can't connect to your server unless your IT department opens port 3306.\n* The playbook uses the `azure_rm_resource` module, which allows direct use of the REST API.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook mysql_firewall.yml\n```\n\n## Connect to the server\n\nIn this section, you use the Azure Cloud Shell to connect to the server you created previously.\n\n1. Open shell.azure.com by selecting below.\n\n   [![Embed launch](https://shell.azure.com/images/launchcloudshell.png \"Launch Azure Cloud Shell\")](https://shell.azure.com)\n\n1. Enter the following code:\n\n    ```sql\n    mysql -h mysqlserveransible.mysql.database.azure.com -u mysqladmin@mysqlserveransible -p\n    ```\n\n1. At the prompt, enter the following command to query the server status:\n\n    ```sql\n    mysql> status\n    ```\n    \n    If everything goes well, you see output similar to the following results:\n    \n    ```output\n    demo@Azure:~$ mysql -h mysqlserveransible.mysql.database.azure.com -u mysqladmin@mysqlserveransible -p\n    Enter password:\n    Welcome to the MySQL monitor.  Commands end with ; or \\g.\n    Your MySQL connection id is 65233\n    Server version: 5.6.39.0 MySQL Community Server (GPL)\n    \n    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.\n    \n    Oracle is a registered trademark of Oracle Corporation and/or its\n    affiliates. Other names may be trademarks of their respective\n    owners.\n    \n    Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n    \n    mysql> status\n    --------------\n    mysql  Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using  EditLine wrapper\n    \n    Connection id:          65233\n    Current database:\n    Current user:           mysqladmin@13.76.42.93\n    SSL:                    Cipher in use is AES256-SHA\n    Current pager:          stdout\n    Using outfile:          ''\n    Using delimiter:        ;\n    Server version:         5.6.39.0 MySQL Community Server (GPL)\n    Protocol version:       10\n    Connection:             mysqlserveransible.mysql.database.azure.com via TCP/IP\n    Server characterset:    latin1\n    Db     characterset:    latin1\n    Client characterset:    utf8\n    Conn.  characterset:    utf8\n    TCP port:               3306\n    Uptime:                 36 min 21 sec\n    \n    Threads: 5  Questions: 559  Slow queries: 0  Opens: 96  Flush tables: 3  Open tables: 10  Queries per second avg: 0.256\n    --------------\n    ```\n    \n## Query MySQL servers\n\nThe playbook code in this section queries MySQL servers in `myResourceGroup` and lists the databases on the found servers.\n\nSave the following playbook as `mysql_query.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    mysqlserver_name: mysqlserveransible\n  tasks:\n    - name: Query MySQL Servers in current resource group\n      azure_rm_mysqlserver_facts:\n        resource_group: \"{{ resource_group }}\"\n      register: mysqlserverfacts\n\n    - name: Dump MySQL Server facts\n      debug:\n        var: mysqlserverfacts\n\n    - name: Query MySQL Databases\n      azure_rm_mysqldatabase_facts:\n        resource_group: \"{{ resource_group }}\"\n        server_name: \"{{ mysqlserver_name }}\"\n      register: mysqldatabasefacts\n\n    - name: Dump MySQL Database Facts\n      debug:\n        var: mysqldatabasefacts\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook mysql_query.yml\n```\n\nAfter running the playbook, you see output similar to the following results:\n\n```json\n\"servers\": [\n    {\n        \"admin_username\": \"mysqladmin\",\n        \"enforce_ssl\": false,\n        \"fully_qualified_domain_name\": \"mysqlserveransible.mysql.database.azure.com\",\n        \"id\": \"/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/mysqlserveransible\",\n        \"location\": \"eastus\",\n        \"name\": \"mysqlserveransible\",\n        \"resource_group\": \"myResourceGroup\",\n        \"sku\": {\n            \"capacity\": 1,\n            \"family\": \"Gen5\",\n            \"name\": \"B_Gen5_1\",\n            \"tier\": \"Basic\"\n        },\n        \"storage_mb\": 5120,\n        \"user_visible_state\": \"Ready\",\n        \"version\": \"5.6\"\n    }\n]\n```\n\nYou also see the following output for the MySQL database:\n\n```json\n\"databases\": [\n    {\n        \"charset\": \"utf8\",\n        \"collation\": \"utf8_general_ci\",\n        \"name\": \"information_schema\",\n        \"resource_group\": \"myResourceGroup\",\n        \"server_name\": \"mysqlserveransible\"\n    },\n    {\n        \"charset\": \"latin1\",\n        \"collation\": \"latin1_swedish_ci\",\n        \"name\": \"mysql\",\n        \"resource_group\": \"myResourceGroup\",\n        \"server_name\": \"mysqlserveransibler\"\n    },\n    {\n        \"charset\": \"latin1\",\n        \"collation\": \"latin1_swedish_ci\",\n        \"name\": \"mysqldbansible\",\n        \"resource_group\": \"myResourceGroup\",\n        \"server_name\": \"mysqlserveransible\"\n    },\n    {\n        \"charset\": \"utf8\",\n        \"collation\": \"utf8_general_ci\",\n        \"name\": \"performance_schema\",\n        \"resource_group\": \"myResourceGroup\",\n        \"server_name\": \"mysqlserveransible\"\n    }\n]\n```\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible/)\n"
  },
  {
    "path": "articles/ansible/overview.md",
    "content": "---\ntitle: Using Ansible with Azure\ndescription: Introduction to using Ansible to automate cloud provisioning, configuration management, and application deployments.\nkeywords: ansible, azure, devops, overview, cloud provision, configuration management, application deployment, ansible modules, ansible playbooks\nms.topic: overview\nms.date: 05/10/2023\nms.custom: devx-track-ansible\nadobe-target: true\n---\n\n# Using Ansible with Azure\n\n[Ansible](https://www.ansible.com) is an open-source product that automates cloud provisioning, configuration management, and application deployments. Using Ansible you can provision virtual machines, containers, and network and complete cloud infrastructures. Also, Ansible allows you to automate the deployment and configuration of resources in your environment.\n\nThis article gives a basic overview of some of the benefits of using Ansible with Azure.\n\n## Ansible playbooks\n\n[Ansible playbooks](https://docs.ansible.com/ansible/latest/playbooks.html) allow you to direct Ansible to configure your environment. Playbooks are coded using YAML so as to be human-readable. The Tutorials section gives many examples of using playbooks to install and configure Azure resources. \n\n## Ansible modules\n\nAnsible includes a suite of [Ansible modules](https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html) that are run directly on remote hosts or via [playbooks](https://docs.ansible.com/ansible/latest/playbooks.html). Users can create their own modules. Modules are used to control system resources - such as services, packages, or files - or execute system commands.\n\nFor interacting with Azure services, Ansible includes a suite of [Ansible cloud modules](https://docs.ansible.com/ansible/2.9/modules/list_of_cloud_modules.html#azure). These modules enable you to create and orchestrate your infrastructure on Azure.\n\n## Migrate existing workload to Azure\n\nOnce you use Ansible to define your infrastructure, you can apply your application's playbook letting Azure automatically scale your environment as needed. \n\n## Automate cloud-native application in Azure\n\nAnsible enables you to automate cloud-native applications in Azure using Azure microservices such as [Azure Functions](https://azure.microsoft.com//services/functions/) and [Kubernetes on Azure](https://azure.microsoft.com/services/container-service/kubernetes/).  \n\n## Manage deployments with dynamic inventory\n\nUsing the Ansible [dynamic inventory](https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html) feature, you can pull inventory from Azure resources. You can then tag your existing Azure deployments and manage those tagged deployments through Ansible.\n\n## Ansible module and version matrix for Azure\n\nAnsible includes a suite of modules for use in provisioning and configuring Azure resources. These resources include virtual machines, scale sets, networking services, and container services. The [Ansible matrix](./module-version-matrix.md) lists the Ansible modules for Azure and the Ansible versions in which they ship.\n\n## Next steps\n\n- [Quickstart: Configure Ansible using Azure Cloud Shell](getting-started-cloud-shell.md)\n- [Quickstart: Configure Ansible using Azure CLI](install-on-linux-vm.md)\n"
  },
  {
    "path": "articles/ansible/route-table-configure.md",
    "content": "---\ntitle: Tutorial - Configure Azure route tables using Ansible\ndescription: Learn how to create, manage, and delete Azure route tables using Ansible. Also learn how to create and delete routes.\nkeywords: ansible, azure, devops, bash, playbook, networking, route, route table\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure Azure route tables using Ansible\n\n[!INCLUDE [ansible-27-note.md](includes/ansible-28-note.md)]\n\nAzure automatically routes traffic between Azure subnets, virtual networks, and on-premises networks. If you need more control over your environment's routing, you can create a [route table](/azure/virtual-network/virtual-networks-udr-overview). \n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> Create a route table\n> Create a virtual network and subnet\n> Associate a route table with a subnet\n> Disassociate a route table from a subnet\n> Create and delete routes\n> Query a route table\n> Delete a route table\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create a route table\n\nThe playbook code in this section creates a route table. For information on route-table limits, see [Azure limits](/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-resource-manager-virtual-networking-limits). \n\nSave the following playbook as `route_table_create.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    route_table_name: myRouteTable\n    resource_group: myResourceGroup\n  tasks:\n    - name: Create a route table\n      azure_rm_routetable:\n        name: \"{{ route_table_name }}\"\n        resource_group: \"{{ resource_group }}\"\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook route_table_create.yml\n```\n\n## Associate a route table to a subnet\n\nThe playbook code in this section:\n\n* Creates a virtual network\n* Creates a subnet within the virtual network\n* Associates a route table to the subnet\n\nRoute tables aren't associated to virtual networks. Rather, route tables are associated with the subnet of a virtual network.\n\nThe virtual network and route table must coexist in the same Azure location and subscription.\n\nSubnets and route tables have a one-to-many relationship. A subnet can be defined with no associated route table or one route table. Route tables can be associated with none, one, or many subnets. \n\nTraffic from the subnet is routed based on:\n\n- routes defined within route tables\n- [default routes](/azure/virtual-network/virtual-networks-udr-overview#default)\n- routes propagated from an on-premises network\n\nThe virtual network must be connected to an Azure virtual network gateway. The gateway can be ExpressRoute, or VPN if using BGP with a VPN gateway.\n\nSave the following playbook as `route_table_associate.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    subnet_name: mySubnet\n    virtual_network_name: myVirtualNetwork \n    route_table_name: myRouteTable\n    resource_group: myResourceGroup\n  tasks:\n    - name: Create virtual network\n      azure_rm_virtualnetwork:\n        name: \"{{ virtual_network_name }}\"\n        resource_group: \"{{ resource_group }}\"\n        address_prefixes_cidr:\n        - 10.1.0.0/16\n        - 172.100.0.0/16\n        dns_servers:\n        - 127.0.0.1\n        - 127.0.0.3\n    - name: Create a subnet with route table\n      azure_rm_subnet:\n        name: \"{{ subnet_name }}\"\n        virtual_network_name: \"{{ virtual_network_name }}\"\n        resource_group: \"{{ resource_group }}\"\n        address_prefix_cidr: \"10.1.0.0/24\"\n        route_table: \"{{ route_table_name }}\"\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook route_table_associate.yml\n```\n\n## Dissociate a route table from a subnet\n\nThe playbook code in this section dissociates a route table from a subnet.\n\nWhen dissociating a route table from a subnet, set the `route_table` for the subnet to `None`. \n\nSave the following playbook as `route_table_dissociate.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    subnet_name: mySubnet\n    virtual_network_name: myVirtualNetwork \n    resource_group: myResourceGroup\n  tasks:\n    - name: Dissociate a route table\n      azure_rm_subnet:\n        name: \"{{ subnet_name }}\"\n        virtual_network_name: \"{{ virtual_network_name }}\"\n        resource_group: \"{{ resource_group }}\"\n        address_prefix_cidr: \"10.1.0.0/24\"\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook route_table_dissociate.yml\n```\n\n## Create a route\n\nThe playbook code in this section a route within a route table. \n\nSave the following playbook as `route_create.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    route_name: myRoute\n    route_table_name: myRouteTable\n    resource_group: myResourceGroup\n  tasks:\n    - name: Create route\n      azure_rm_route:\n        name: \"{{ route_name }}\"\n        resource_group: \"{{ resource_group }}\"\n        next_hop_type: virtual_network_gateway\n        address_prefix: \"10.1.0.0/16\"\n        route_table_name: \"{{ route_table_name }}\"\n```\n\nBefore running the playbook, see the following notes:\n\n* `virtual_network_gateway` is defined as `next_hop_type`. For more information about how Azure selects routes, see [Routing overview](/azure/virtual-network/virtual-networks-udr-overview).\n* `address_prefix` is defined as `10.1.0.0/16`. The prefix can't be duplicated within the route table.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook route_create.yml\n```\n\n## Delete a route\n\nThe playbook code in this section deletes a route from a route table.\n\nSave the following playbook as `route_delete.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    route_name: myRoute\n    route_table_name: myRouteTable\n    resource_group: myResourceGroup\n  tasks:\n    - name: Remove route\n      azure_rm_route:\n        name: \"{{ route_name }}\"\n        resource_group: \"{{ resource_group }}\"\n        route_table_name: \"{{ route_table_name }}\"\n        state: absent\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook route_delete.yml\n```\n\n## Get route table information\n\nThe playbook code in this section uses the Ansible module `azure_rm_routetable_facts` to retrieve route table information.\n\nSave the following playbook as `route_table_facts.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    route_table_name: myRouteTable\n    resource_group: myResourceGroup\n  tasks: \n    - name: Get route table information\n      azure_rm_routetable_facts:\n         resource_group: \"{{ resource_group }}\"\n         name: \"{{ route_table_name }}\"\n      register: query\n    \n    - debug:\n         var: query.route_tables[0]\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook route_table_facts.yml\n```\n\n## Delete a route table\n\nThe playbook code in this section a route table.\n\nWhen a route table is deleted, all of its routes are also deleted.\n\nA route table can't be deleted if it's associated with a subnet. [Dissociate the route table from any subnets](#dissociate-a-route-table-from-a-subnet) before attempting to delete the route table. \n\nSave the following playbook as `route_table_delete.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    route_table_name: myRouteTable\n    resource_group: myResourceGroup\n  tasks:\n    - name: Create a route table\n      azure_rm_routetable:\n        name: \"{{ route_table_name }}\"\n        resource_group: \"{{ resource_group }}\"\n        state: absent\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook route_table_delete.yml\n```\n\n## Next steps\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible/)"
  },
  {
    "path": "articles/ansible/service-bus-queue-configure.md",
    "content": "---\ntitle: Tutorial - Configure queues in Azure Service Bus using Ansible\ndescription: Learn how to use Ansible to create an Azure Service Bus queue\nkeywords: ansible, azure, devops, bash, playbook, service bus, queue\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure queues in Azure Service Bus using Ansible\n\n[!INCLUDE [ansible-28-note.md](includes/ansible-28-note.md)]\n\n[!INCLUDE [open-source-devops-intro-servicebus.md](../includes/open-source-devops-intro-servicebus.md)]\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create a queue\n> * Create a SAS policy\n> * Retrieve namespace information\n> * Retrieve queue information\n> * Revoke the queue SAS policy\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create the Service Bus queue\n\nThe sample playbook code creates the following resources:\n- Azure resource group\n- Service Bus namespace within the resource group\n- Service Bus queue with the namespace\n\nSave the following playbook as `servicebus_queue.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      location: eastus\n      namespace: servicebustestns\n      queue: servicebustestqueue\n  tasks:\n    - name: Ensure resource group exist\n      azure_rm_resourcegroup:\n          name: \"{{ resource_group }}\"\n          location: \"{{ location }}\"\n    - name: Create a namespace\n      azure_rm_servicebus:\n          name: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n    - name: Create a queue\n      azure_rm_servicebusqueue:\n          name: \"{{ queue }}\"\n          namespace: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n      register: queue\n    - debug:\n          var: queue\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_queue.yml\n```\n\n## Create the SAS policy\n\nA [Shared Access Signature (SAS)](/azure/storage/common/storage-dotnet-shared-access-signature-part-1) is a claims-based authorization mechanism using tokens. \n\nThe sample playbook code creates two SAS policies for a Service Bus queue with different privileges.\n\nSave the following playbook as `servicebus_queue_policy.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      namespace: servicebustestns\n      queue: servicebustestqueue\n  tasks:\n    - name: Create a policy with send and listen privilege\n      azure_rm_servicebussaspolicy:\n          name: \"{{ queue }}-policy\"\n          queue: \"{{ queue }}\"\n          namespace: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n          rights: listen_send\n      register: policy\n    - debug:\n          var: policy\n```\n\nBefore running the playbook, see the following notes:\n- The `rights` value represents the privilege a user has with the queue. Specify one of the following values: `manage`, `listen`, `send`, or `listen_send`.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_queue_policy.yml\n```\n\n## Retrieve namespace information\n\nThe sample playbook code queries the namespace information.\n\nSave the following playbook as `servicebus_namespace_info.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      namespace: servicebustestns\n  tasks:\n    - name: Get a namespace's information\n      azure_rm_servicebus_facts:\n          type: namespace\n          name: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n          show_sas_policies: yes\n      register: ns\n    - debug:\n          var: ns\n```\n\nBefore running the playbook, see the following notes:\n- The `show_sas_policies` value indicates whether to show the SAS policies under the specified namespace. By default, the value is `False` to avoid additional network overhead.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_namespace_info.yml\n```\n\n## Retrieve queue information\n\nThe sample playbook code queries queue information. \n\nSave the following playbook as `servicebus_queue_info.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      namespace: servicebustestns\n      queue: servicebustestqueue\n  tasks:\n    - name: Get a queue's information\n      azure_rm_servicebus_facts:\n          type: queue\n          name: \"{{ queue }}\"\n          namespace: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n          show_sas_policies: yes\n      register: queue\n    - debug:\n          var: queue\n```\n\nBefore running the playbook, see the following notes:\n- The `show_sas_policies` value indicates whether to show the SAS policies under the specified queue. By default, this value is set to `False` to avoid additional network overhead.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_queue_info.yml\n```\n\n## Revoke the queue SAS policy\n\nThe sample playbook code deletes a queue SAS policy.\n\nSave the following playbook as `servicebus_queue_policy_delete.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      namespace: servicebustestns\n      queue: servicebustestqueue\n  tasks:\n    - name: Create a policy with send and listen privilege\n      azure_rm_servicebussaspolicy:\n          name: \"{{ queue }}-policy\"\n          queue: \"{{ queue }}\"\n          namespace: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n          state: absent\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_queue_policy_delete.yml\n```\n\n## Clean up resources\n\nWhen no longer needed, delete the resources created in this article. \n\nSave the following code as `cleanup.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      namespace: servicebustestns\n      queue: servicebustestqueue\n  tasks:\n    - name: Delete queue\n      azure_rm_servicebusqueue:\n          name: \"{{ queue }}\"\n          resource_group: \"{{ resource_group }}\"\n          namespace: \"{{ namespace }}\"\n          state: absent\n    - name: Delete namespace\n      azure_rm_servicebus:\n          name: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n          state: absent\n    - name: Delete resource group\n      azure_rm_resourcegroup:\n          name: \"{{ resource_group }}\"\n          state: absent\n          force_delete_nonempty: yes\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook cleanup.yml\n```\n\n## Next steps\n> [!div class=\"nextstepaction\"] \n> [Tutorial: Configure a topic in Azure Service Bus using Ansible](service-bus-topic-configure.md)"
  },
  {
    "path": "articles/ansible/service-bus-topic-configure.md",
    "content": "---\ntitle: Tutorial - Configure topics in Azure Service Bus using Ansible\ndescription: Learn how to use Ansible to create an Azure Service Bus topic\nkeywords: ansible, azure, devops, bash, playbook, service bus, topics, subscriptions\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure topics in Azure Service Bus using Ansible\n\n[!INCLUDE [ansible-28-note.md](includes/ansible-28-note.md)]\n\n[!INCLUDE [open-source-devops-intro-servicebus.md](../includes/open-source-devops-intro-servicebus.md)]\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create a topic\n> * Create a subscription\n> * Create a SAS policy\n> * Retrieve namespace information\n> * Retrieve topic and subscription information\n> * Revoke a SAS policy\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create the Service Bus topic\n\nThe sample playbook code creates the following resources:\n- Azure resource group\n- Service Bus namespace within the resource group\n- Service Bus topic with the namespace\n\nSave the following playbook as `servicebus_topic.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      location: eastus\n      namespace: servicebustestns\n      topic: servicebustesttopic\n  tasks:\n    - name: Ensure resource group exist\n      azure_rm_resourcegroup:\n          name: \"{{ resource_group }}\"\n          location: \"{{ location }}\"\n    - name: Create a namespace\n      azure_rm_servicebus:\n          name: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n    - name: Create a topic\n      azure_rm_servicebustopic:\n          name: \"{{ topic }}\"\n          namespace: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n      register: topic\n    - debug:\n          var: topic\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_topic.yml\n```\n\n## Create the subscription\n\nThe sample playbook code creates the subscription under a Service Bus topic. Azure Service Bus topics can have multiple subscriptions. A subscriber to a topic can receives a copy of each message sent to the topic. Subscriptions are named entities, which are durably created, but can optionally expire.\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      location: eastus\n      namespace: servicebustestns\n      topic: servicebustesttopic\n      subscription: servicebustestsubs\n  tasks:\n    - name: Create a subscription\n      azure_rm_servicebustopicsubscription:\n          name: \"{{ subscription }}\"\n          topic: \"{{ topic }}\"\n          namespace: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n      register: subs\n    - debug:\n          var: subs\n```\n\nSave the following playbook as `servicebus_subscription.yml`:\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_subscription.yml\n```\n\n## Create the SAS policy\n\nA [Shared Access Signature (SAS)](/azure/storage/common/storage-dotnet-shared-access-signature-part-1) is a claims-based authorization mechanism using tokens. \n\nThe sample playbook code creates two SAS policies for a Service Bus queue with different privileges.\n\nSave the following playbook as `servicebus_topic_policy.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      namespace: servicebustestns\n      topic: servicebustesttopic\n  tasks:\n    - name: Create a policy with send and listen privilege\n      azure_rm_servicebussaspolicy:\n          name: \"{{ topic }}-{{ item }}\"\n          topic: \"{{ topic }}\"\n          namespace: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n          rights: \"{{ item }}\"\n      with_items:\n        - send\n        - listen\n      register: policy\n    - debug:\n          var: policy\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_topic_policy.yml\n```\n\n## Retrieve namespace information\n\nThe sample playbook code queries the namespace information.\n\nSave the following playbook as `servicebus_namespace_info.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      namespace: servicebustestns\n  tasks:\n    - name: Get a namespace's information\n      azure_rm_servicebus_facts:\n          type: namespace\n          name: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n          show_sas_policies: yes\n      register: ns\n    - debug:\n          var: ns\n```\n\nBefore running the playbook, see the following notes:\n- The `show_sas_policies` value indicates whether to show the SAS policies under the specified namespace. By default, the value is `False` to avoid additional network overhead.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_namespace_info.yml\n```\n\n## Retrieve topic and subscription information\n\nThe sample playbook code queries for the following information:\n- Service Bus topic information\n- List of subscription details for the topic\n \nSave the following playbook as `servicebus_list.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      namespace: servicebustestns\n      topic: servicebustesttopic\n  tasks:\n    - name: Get a topic's information\n      azure_rm_servicebus_facts:\n          type: topic\n          name: \"{{ topic }}\"\n          namespace: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n          show_sas_policies: yes\n      register: topic_fact\n    - name: \"List subscriptions under topic {{ topic }}\"\n      azure_rm_servicebus_facts:\n          type: subscription\n          topic: \"{{ topic }}\"\n          namespace: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n      register: subs_fact\n    - debug:\n          var: \"{{ item }}\"\n      with_items:\n        - topic_fact.servicebuses[0]\n        - subs_fact.servicebuses\n```\n\nBefore running the playbook, see the following notes:\n- The `show_sas_policies` value indicates whether to show the SAS policies under the specified queue. By default, this value is set to `False` to avoid additional network overhead.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_list.yml\n```\n\n## Revoke the queue SAS policy\n\nThe sample playbook code deletes a queue SAS policy.\n\nSave the following playbook as `servicebus_queue_policy_delete.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      namespace: servicebustestns\n      topic: servicebustesttopic\n  tasks:\n    - name: Delete a policy\n      azure_rm_servicebussaspolicy:\n          name: \"{{ topic }}-policy\"\n          topic: \"{{ topic }}\"\n          namespace: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n          state: absent\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook servicebus_topic_policy_delete.yml\n```\n\n## Clean up resources\n\nWhen no longer needed, delete the resources created in this article. \n\nSave the following code as `cleanup.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n      resource_group: servicebustest\n      namespace: servicebustestns\n      topic: servicebustesttopic\n      subscription: servicebustestsubs\n  tasks:\n    - name: Delete subscription\n      azure_rm_servicebustopicsubscription:\n          name: \"{{ subscription }}\"\n          topic: \"{{ topic }}\"\n          resource_group: \"{{ resource_group }}\"\n          namespace: \"{{ namespace }}\"\n          state: absent\n    - name: Delete topic\n      azure_rm_servicebustopic:\n          name: \"{{ topic }}\"\n          resource_group: \"{{ resource_group }}\"\n          namespace: \"{{ namespace }}\"\n          state: absent\n    - name: Delete namespace\n      azure_rm_servicebus:\n          name: \"{{ namespace }}\"\n          resource_group: \"{{ resource_group }}\"\n          state: absent\n    - name: Delete resource group\n      azure_rm_resourcegroup:\n          name: \"{{ resource_group }}\"\n          state: absent\n          force_delete_nonempty: yes\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook cleanup.yml\n```\n\n## Next steps\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible/)"
  },
  {
    "path": "articles/ansible/toc.yml",
    "content": "- name: Ansible on Azure documentation\n  href: ./index.yml\n- name: Overview\n  items:\n  - name: About Ansible on Azure\n    href: overview.md\n- name: Get started\n  expanded: true\n  items:\n    - name: Configure Ansible using Azure Cloud Shell\n      href: getting-started-cloud-shell.md\n    - name: Configure Ansible on an Azure VM\n      href: install-on-linux-vm.md\n- name: Tutorials\n  items:\n  - name: Configure Ansible\n    items:\n    - name: Create Ansible service principal\n      href: create-ansible-service-principal.md\n  - name: Azure Application Gateway\n    items:\n    - name: Manage web traffic\n      href: application-gateway-configure.md\n  - name: Azure App Service\n    items:\n    - name: Configure apps\n      href: azure-web-apps-configure.md\n    - name: Scale apps\n      href: azure-web-apps-scale.md\n  - name: Azure DevTest Labs\n    items:\n    - name: Configure labs\n      href: devtest-labs-configure.md\n  - name: Azure Key Vault\n    items:\n    - name: Configure VM secrets with Azure Key Vault\n      href: key-vault-configure-secrets.md\n  - name: Azure Kubernetes Service (AKS)\n    items:\n    - name: Configure AKS clusters\n      href: aks-configure-clusters.md\n    - name: Configure Azure CNI networking\n      href: aks-configure-cni-networking.md\n    - name: Configure RBAC roles in AKS cluster\n      href: aks-configure-rbac.md\n  - name: Azure HDInsight\n    items:\n    - name: Configure clusters\n      href: hdinsight-configure.md\n  - name: Azure Service Bus\n    items:\n    - name: Configure queues\n      href: service-bus-queue-configure.md\n    - name: Configure topics\n      href: service-bus-topic-configure.md\n  - name: Database\n    items:\n    - name: Configure Azure Database for MySQL\n      href: mysql-configure.md\n    - name: Configure Azure Cosmos DB accounts\n      href: cosmos-configure.md\n    - name: Configure Azure Cache for Redis\n      href: cache-for-redis-configure.md\n  - name: Dynamic inventory\n    items:\n    - name: Manage your Azure resources\n      href: dynamic-inventory-configure.md\n  - name: Virtual machines\n    items:\n    - name: Configure Linux virtual machines\n      href: vm-configure.md\n    - name: Manage Linux virtual machines\n      href: vm-manage.md\n    - name: Configure Windows virtual machines\n      href: vm-configure-windows.md\n    - name: Create Shared Image Gallery\n      href: vm-configure-from-azure-shared-image-gallery.md\n    - name: Configure VM secrets with Azure Key Vault\n      href: key-vault-configure-secrets.md\n  - name: Virtual machine scale sets\n    items:\n    - name: Configure \n      href: vm-scale-set-configure.md\n    - name: Deploy \n      href: vm-scale-set-deploy-app.md\n    - name: Autoscale\n      href: vm-scale-set-auto-scale.md\n    - name: Update custom image\n      href: vm-scale-set-update-image.md\n    - name: Create Shared Image Gallery\n      href: vm-configure-from-azure-shared-image-gallery.md\n  - name: Virtual network\n    items:\n    - name: Configure peering\n      href: virtual-network-peering-configure.md\n    - name: Configure route tables\n      href: route-table-configure.md\n- name: Samples\n  items:\n  - name: Ansible labs for Azure\n    href: https://github.com/microsoft/ansiblelabs\n  - name: Ansible Azure playbook samples\n    href: https://github.com/Azure-Samples/ansible-playbooks\n- name: Reference\n  items:\n  - name: Playbook roles\n    items:\n    - name: azure_module\n      href: https://galaxy.ansible.com/Azure/azure_modules/\n    - name: azure_preview_module\n      href: https://galaxy.ansible.com/Azure/azure_preview_modules\n  - name: Releases and features\n    href: module-version-matrix.md\n  - name: All modules for Azure\n    href: https://docs.ansible.com/ansible/2.9/modules/list_of_cloud_modules.html#azure\n"
  },
  {
    "path": "articles/ansible/virtual-network-peering-configure.md",
    "content": "---\ntitle: Tutorial - Configure Azure virtual network peering using Ansible\ndescription: Learn how to use Ansible to connect virtual networks with virtual network peering.\nkeywords: ansible, azure, devops, bash, playbook, networking, peering\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure Azure virtual network peering using Ansible\n\n[!INCLUDE [ansible-28-note.md](includes/ansible-28-note.md)]\n\n[Virtual network (VNet) peering](/azure/virtual-network/virtual-network-peering-overview) allows you to seamlessly connect two Azure virtual networks. Once peered, the two virtual networks appear as one for connectivity purposes. \n\nTraffic is routed between VMs in the same virtual network through private IP addresses. Similarly, traffic between VMs in a peered virtual network is routed through the Microsoft backbone infrastructure. As a result, VMs in different virtual networks can communicate with each other.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create two virtual networks\n> * Peer the two virtual networks\n> * Delete the peering between the two networks\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Create two resource groups\n\nA resource group is a logical container in which Azure resources are deployed and managed.\n\nThe sample playbook code in this section is used to:\n\n- Create two resource groups \n\n```yml\n  - name: Create a resource group\n    azure_rm_resourcegroup:\n      name: \"{{ resource_group }}\"\n      location: \"{{ location }}\"\n  - name: Create secondary resource group\n    azure_rm_resourcegroup:\n      name: \"{{ resource_group_secondary }}\"\n      location: \"{{ location }}\"\n```\n\n## Create the first virtual network\n\nThe sample playbook code in this section is used to:\n\n- Create a virtual network\n- Create a subnet within the virtual network\n\n```yml\n  - name: Create first virtual network\n    azure_rm_virtualnetwork:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vnet_name1 }}\"\n      address_prefixes: \"10.0.0.0/16\"\n  - name: Add subnet\n    azure_rm_subnet:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vnet_name1 }}\"\n      address_prefix: \"10.0.0.0/24\"\n      virtual_network: \"{{ vnet_name1 }}\"\n```\n\n## Create the second virtual network\n\nThe sample playbook code in this section is used to:\n\n- Create a virtual network\n- Create a subnet within the virtual network\n\n```yml\n  - name: Create second virtual network\n    azure_rm_virtualnetwork:\n      resource_group: \"{{ resource_group_secondary }}\"\n      name: \"{{ vnet_name2 }}\"\n      address_prefixes: \"10.1.0.0/16\"\n  - name: Add subnet\n    azure_rm_subnet:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vnet_name2 }}\"\n      address_prefix: \"10.1.0.0/24\"\n      virtual_network: \"{{ vnet_name2 }}\"\n```\n\n## Peer the two virtual networks\n\nThe sample playbook code in this section is used to:\n\n- Initialize virtual-network peering\n- Peer two previously created virtual networks\n\n```yml\n  - name: Initial vnet peering\n    azure_rm_virtualnetworkpeering:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ peering_name }}\"\n      virtual_network: \"{{ vnet_name1 }}\"\n      remote_virtual_network:\n        resource_group: \"{{ resource_group_secondary }}\"\n        name: \"{{ vnet_name2 }}\"\n      allow_virtual_network_access: true\n      allow_forwarded_traffic: true\n\n  - name: Connect vnet peering\n    azure_rm_virtualnetworkpeering:\n      resource_group: \"{{ resource_group_secondary }}\"\n      name: \"{{ peering_name }}\"\n      virtual_network: \"{{ vnet_name2 }}\"\n      remote_virtual_network:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vnet_name1 }}\"\n      allow_virtual_network_access: true\n      allow_forwarded_traffic: true\n```\n\n## Delete the virtual network peering\n\nThe sample playbook code in this section is used to:\n\n- Delete the peering between the two previously created virtual networks\n\n```yml\n  - name: Delete vnet peering\n    azure_rm_virtualnetworkpeering:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ peering_name }}\"\n      virtual_network: \"{{ vnet_name1 }}\"\n      state: absent\n```\n\n## Get the sample playbook\n\nThere are two ways to get the complete sample playbook:\n\n- [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/vnet_peering.yml) and save it to `vnet_peering.yml`.\n- Create a new file named `vnet_peering.yml` and copy the following contents into it:\n\n```yml\n- hosts: localhost\n  tasks:\n    - name: Prepare random postfix\n      set_fact:\n        rpfx: \"{{ 1000 | random }}\"\n      run_once: yes\n\n- name: Connect virtual networks with virtual network peering\n  hosts: localhost\n  connection: local\n  vars:\n    resource_group: \"{{ resource_group_name }}\"\n    resource_group_secondary: \"{{ resource_group_name }}2\"\n    vnet_name1: \"myVnet{{ rpfx }}\"\n    vnet_name2: \"myVnet{{ rpfx }}2\"\n    peering_name: peer1\n    location: eastus2\n  tasks:\n  - name: Create a resource group\n    azure_rm_resourcegroup:\n      name: \"{{ resource_group }}\"\n      location: \"{{ location }}\"\n  - name: Create secondary resource group\n    azure_rm_resourcegroup:\n      name: \"{{ resource_group_secondary }}\"\n      location: \"{{ location }}\"\n  - name: Create first virtual network\n    azure_rm_virtualnetwork:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vnet_name1 }}\"\n      address_prefixes: \"10.0.0.0/16\"\n  - name: Add subnet\n    azure_rm_subnet:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vnet_name1 }}\"\n      address_prefix: \"10.0.0.0/24\"\n      virtual_network: \"{{ vnet_name1 }}\"\n  - name: Create second virtual network\n    azure_rm_virtualnetwork:\n      resource_group: \"{{ resource_group_secondary }}\"\n      name: \"{{ vnet_name2 }}\"\n      address_prefixes: \"10.1.0.0/16\"\n  - name: Add subnet\n    azure_rm_subnet:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vnet_name2 }}\"\n      address_prefix: \"10.1.0.0/24\"\n      virtual_network: \"{{ vnet_name2 }}\"\n  - name: Initial vnet peering\n    azure_rm_virtualnetworkpeering:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ peering_name }}\"\n      virtual_network: \"{{ vnet_name1 }}\"\n      remote_virtual_network:\n        resource_group: \"{{ resource_group_secondary }}\"\n        name: \"{{ vnet_name2 }}\"\n      allow_virtual_network_access: true\n      allow_forwarded_traffic: true\n\n  - name: Connect vnet peering\n    azure_rm_virtualnetworkpeering:\n      resource_group: \"{{ resource_group_secondary }}\"\n      name: \"{{ peering_name }}\"\n      virtual_network: \"{{ vnet_name2 }}\"\n      remote_virtual_network:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vnet_name1 }}\"\n      allow_virtual_network_access: true\n      allow_forwarded_traffic: true\n\n  - name: Delete vnet peering\n    azure_rm_virtualnetworkpeering:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ peering_name }}\"\n      virtual_network: \"{{ vnet_name1 }}\"\n      state: absent\n```\n\n## Run the sample playbook\n\nThe sample playbook code in this section is used to test various features shown throughout this tutorial.\n\nHere are some key notes to consider when working with the sample playbook:\n\n- In the `vars` section, replace the `{{ resource_group_name }}` placeholder with the name of your resource group.\n\nRun the playbook using the ansible-playbook command:\n\n```bash\nansible-playbook vnet_peering.yml\n```\n\nAfter running the playbook, you see output similar to the following results:\n\n```Output\nPLAY [localhost] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [Prepare random postfix] \nok: [localhost]\n\nPLAY [Connect virtual networks with virtual network peering] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [Create a resource group] \nchanged: [localhost]\n\nTASK [Create secondary resource group] \nchanged: [localhost]\n\nTASK [Create first virtual network] \nchanged: [localhost]\n\nTASK [Add subnet] \nchanged: [localhost]\n\nTASK [Create second virtual network] \nchanged: [localhost]\n\nTASK [Add subnet] \nchanged: [localhost]\n\nTASK [Initial vnet peering] \nchanged: [localhost]\n\nTASK [Connect vnet peering] \nchanged: [localhost]\n\nTASK [Delete vnet peering] \nchanged: [localhost]\n\nPLAY RECAP \nlocalhost                  : ok=12   changed=9    unreachable=0    failed=0    skipped=0   rescued=0    ignored=0\n```\n\n## Clean up resources\n\nWhen no longer needed, delete the resources created in this article. \t\n\nThe sample playbook code in this section is used to:\t\n\n- Delete the two resources groups created earlier\t\n\nSave the following playbook as `cleanup.yml`:\t\n\n```bash\t\n- hosts: localhost\t\n  vars:\t\n    resource_group: \"{{ resource_group_name-1 }}\"\t\n    resource_group_secondary: \"{{ resource_group_name-2 }}\"\t\n  tasks:\t\n    - name: Delete a resource group\t\n      azure_rm_resourcegroup:\t\n        name: \"{{ resource_group }}\"\t\n        force_delete_nonempty: yes\t\n        state: absent\t\n    - name: Delete a resource group\t\n      azure_rm_resourcegroup:\t\n        name: \"{{ resource_group_secondary }}\"\t\n        force_delete_nonempty: yes\t\n        state: absent\t\n```\t\n\nHere are some key notes to consider when working with the sample playbook:\t\n\n- Replace the `{{ resource_group_name-1 }}` placeholder with the name of the first resource group created.\t\n- Replace the `{{ resource_group_name-2 }}` placeholder with the name of the second resource group created.\t\n- All resources within the two specified resource groups will be deleted.\t\n\nRun the playbook using the ansible-playbook command:\t\n\n```bash\t\nansible-playbook cleanup.yml\t\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible/)"
  },
  {
    "path": "articles/ansible/vm-configure-from-azure-shared-image-gallery.md",
    "content": "---\ntitle: Tutorial - Create a VM or virtual machine scale set from the Azure Shared Image Gallery using Ansible\ndescription: Learn how to use Ansible to create VM or virtual machine scale set based on a generalized image in Shared Image Gallery.\nkeywords: ansible, azure, devops, bash, playbook, virtual machine, virtual machine scale set, shared image gallery\nms.topic: tutorial\nms.date: 10/14/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Create a VM or virtual machine scale set from the Azure Shared Image Gallery using Ansible\n\n[!INCLUDE [ansible-29-note.md](includes/ansible-29-note.md)]\n\n[Shared Image Gallery](/azure/virtual-machines/windows/shared-image-galleries) is a service that allows you to manage, share, and organize custom-managed images easily. This feature is beneficial for scenarios where many images are maintained and shared. Custom images can be shared across subscriptions and between Microsoft Entra tenants. Images can also be replicated to multiple regions for quicker deployment scaling.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Create a generalized VM and custom image\n> * Create a Shared Image Gallery\n> * Create a shared image and image version\n> * Create a VM using the generalized image\n> * Create a virtual machine scale set using the generalized image\n> * Get information about your Shared Image Gallery, image and version.\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Get the sample playbooks\n\nThere are two ways to get the complete set of sample playbooks:\n\n- [Download the SIG folder](https://github.com/Azure-Samples/ansible-playbooks/tree/master/SIG_generalized_image) and save it to your local machine.\n- Create a new file for each section and copy the sample playbook in it.\n\nThe `vars.yml` file contains the variables used by all sample playbooks for this tutorial. You can edit the file to provide unique names and values.\n\nThe first sample playbook `00-prerequisites.yml` creates what's necessary to complete this tutorial:\n- A resource group, which is a logical container in which Azure resources are deployed and managed.\n- A virtual network; subnet; public IP address and network interface card for the VM.\n- A source Virtual Machine, which is used for creating the generalized image.\n\n```yml\n- hosts: localhost\n  connection: local\n  vars_files:\n    - ./vars.yml\n\n  tasks:\n    - name: Create resource group if doesn't exist\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n    \n    - name: Create virtual network\n      azure_rm_virtualnetwork:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ virtual_network_name }}\"\n        address_prefixes: \"10.0.0.0/16\"\n\n    - name: Add subnet\n      azure_rm_subnet:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ subnet_name }}\"\n        address_prefix: \"10.0.1.0/24\"\n        virtual_network: \"{{ virtual_network_name }}\"\n\n    - name: Create public IP address\n      azure_rm_publicipaddress:\n        resource_group: \"{{ resource_group }}\"\n        allocation_method: Static\n        name: \"{{ ip_name }}\"\n\n    - name: Create virtual network interface cards for VM A and B\n      azure_rm_networkinterface:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ network_interface_name }}\"\n        virtual_network: \"{{ virtual_network_name }}\"\n        subnet: \"{{ subnet_name }}\"\n\n    - name: Create VM\n      azure_rm_virtualmachine:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ source_vm_name }}\"\n        admin_username: testuser\n        admin_password: \"Password1234!\"\n        vm_size: Standard_B1ms\n        network_interfaces: \"{{ network_interface_name }}\"\n        image:\n          offer: UbuntuServer\n          publisher: Canonical\n          sku: 16.04-LTS\n          version: latest\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook 00-prerequisites.yml\n```\n\nIn the [Azure portal](https://portal.azure.com), check the resource group you specified in `vars.yml` to see the new virtual machine and various resources you created.\n\n## Generalize the VM and create a custom image\n\nThe next playbook, `01a-create-generalized-image.yml`, generalizes the source VM created in previous step and then create a custom image based on it.\n\n```yml\n- hosts: localhost\n  connection: local\n  vars_files:\n    - ./vars.yml\n\n  tasks:\n    - name: Generalize VM\n      azure_rm_virtualmachine:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ source_vm_name }}\"\n        generalized: yes\n\n    - name: Create custom image\n      azure_rm_image:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ image_name }}\"\n        source: \"{{ source_vm_name }}\"\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook 01a-create-generalized-image.yml\n```\n\nCheck your resource group and make sure `testimagea` shows up.\n\n## Create the Shared Image Gallery\n\nThe image gallery is the repository for sharing and managing images. The sample playbook code in `02-create-shared-image-gallery.yml` creates a Shared Image Gallery in your resource group.\n\n```yml\n- hosts: localhost\n  connection: local\n  vars_files:\n    - ./vars.yml\n\n  tasks:\n    - name: Create shared image gallery\n      azure_rm_gallery:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ shared_gallery_name }}\"\n        location: \"{{ location }}\"\n        description: This is the gallery description.\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook 02-create-shared-image-gallery.yml\n```\n\nYou now see a new gallery, `myGallery`, in your resource group.\n\n## Create a shared image and image version\n\nThe next playbook, `03a-create-shared-image-generalized.yml` creates an image definition and an image version.\n\nImage definitions include the image type (Windows or Linux), release notes, and minimum and maximum memory requirements. Image version is the version of the image. Gallery, image definition, and image version help you organize images in logical groups. \n\n```yml\n- hosts: localhost\n  connection: local\n  vars_files:\n    - ./vars.yml\n\n  tasks:\n    - name: Create shared image\n      azure_rm_galleryimage:\n        resource_group: \"{{ resource_group }}\"\n        gallery_name: \"{{ shared_gallery_name }}\"\n        name: \"{{ shared_image_name }}\"\n        location: \"{{ location }}\"\n        os_type: linux\n        os_state: generalized\n        identifier:\n          publisher: myPublisherName\n          offer: myOfferName\n          sku: mySkuName\n        description: Image description\n    \n    - name: Create or update a simple gallery image version.\n      azure_rm_galleryimageversion:\n        resource_group: \"{{ resource_group }}\"\n        gallery_name: \"{{ shared_gallery_name }}\"\n        gallery_image_name: \"{{ shared_image_name }}\"\n        name: \"{{ shared_image_version }}\"\n        location: \"{{ location }}\"\n        publishing_profile:\n          end_of_life_date: \"2020-10-01t00:00:00+00:00\"\n          exclude_from_latest: yes\n          replica_count: 3\n          storage_account_type: Standard_LRS\n          target_regions:\n            - name: West US\n              regional_replica_count: 1\n            - name: East US\n              regional_replica_count: 2\n              storage_account_type: Standard_ZRS\n          managed_image:\n            name: \"{{ image_name }}\"\n            resource_group: \"{{ resource_group }}\"\n      register: output\n\n    - debug:\n        var: output\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook 03a-create-shared-image-generalized.yml\n```\n\nYour resource group now have an image definition and an image version for your gallery.\n\n## Create a VM based on the generalized image\n\nFinally, run `04a-create-vm-using-generalized-image.yml` to create a VM based on the generalized image you created in previous step.\n\n```yml\n- hosts: localhost\n  connection: local\n  vars_files:\n    - ./vars.yml\n\n  tasks:\n  - name: Create VM using shared image\n    azure_rm_virtualmachine:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vm_name }}\"\n      vm_size: Standard_DS1_v2\n      admin_username: adminUser\n      admin_password: PassWord01\n      managed_disk_type: Standard_LRS\n      image:\n        id: \"/subscriptions/{{ lookup('env', 'AZURE_SUBSCRIPTION_ID') }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Compute/galleries/{{ shared_gallery_name }}/images/{{ shared_image_name }}/versions/{{ shared_image_version }}\"\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook 04a-create-vm-using-generalized-image.yml\n```\n\n## Create a virtual machine scale sets based on the generalized image\n\nYou can also create a virtual machine scale set based on the generalized image. Run `05a-create-vmss-using-generalized-image.yml` to do so.\n\n```yml\n- hosts: localhost\n  connection: local\n  vars_files:\n    - ./vars.yml\n\n  tasks:\n  - name: Create a virtual machine scale set using a shared image\n    azure_rm_virtualmachinescaleset:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vmss_name }}\"\n      vm_size: Standard_DS1_v2\n      admin_username: adminUser\n      admin_password: PassWord01\n      capacity: 2\n      virtual_network_name: \"{{ virtual_network_name }}\"\n      upgrade_policy: Manual\n      subnet_name: \"{{ subnet_name }}\"\n      managed_disk_type: Standard_LRS\n      image:\n        id: \"/subscriptions/{{ lookup('env', 'AZURE_SUBSCRIPTION_ID') }}/resourceGroups/{{ resource_group }}/providers/Microsoft.Compute/galleries/{{ shared_gallery_name }}/images/{{ shared_image_name }}/versions/{{ shared_image_version }}\"\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook 05a-create-vmss-using-generalized-image.yml\n```\n\n## Get information about the gallery\n\nYou can get information about the gallery, image definition, and version by running `06-get-info.yml`.\n\n```yml\n- hosts: localhost\n  connection: local\n  vars_files:\n    - ./vars.yml\n\n  tasks:\n  - name: Get Shared Image Gallery information\n    azure_rm_gallery_info:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ shared_gallery_name }}\"\n  - name: Get shared image information\n    azure_rm_galleryimage_info:\n      resource_group: \"{{ resource_group }}\"\n      gallery_name: \"{{ shared_gallery_name }}\"\n      name: \"{{ shared_image_name }}\"\n  - name: Get Shared Image Gallery image version information\n    azure_rm_galleryimageversion_info:\n      resource_group: \"{{ resource_group }}\"\n      gallery_name: \"{{ shared_gallery_name }}\"\n      gallery_image_name: \"{{ shared_image_name }}\"\n      name: \"{{ shared_image_version }}\"\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook 06-get-info.yml\n```\n\n## Delete the shared image\n\nTo delete the gallery resources, refer to sample playbook `07-delete-gallery.yml`. Delete resources in reverse order. Start by deleting the image version. After you delete all of the image versions, you can delete the image definition. After you delete all image definitions, you can delete the gallery.\n\n```yml\n- hosts: localhost\n  connection: local\n  vars_files:\n    - ./vars.yml\n\n  tasks:\n  - name: Delete gallery image version.\n    azure_rm_galleryimageversion:\n      resource_group: \"{{ resource_group }}\"\n      gallery_name: \"{{ shared_gallery_name }}\"\n      gallery_image_name: \"{{ shared_image_name }}\"\n      name: \"{{ shared_image_version }}\"\n      state: absent\n\n  - name: Delete gallery image\n    azure_rm_galleryimage:\n      resource_group: \"{{ resource_group }}\"\n      gallery_name: \"{{ shared_gallery_name }}\"\n      name: \"{{ shared_image_name }}\"\n      state: absent\n\n  - name: Delete a simple gallery.\n    azure_rm_gallery:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ shared_gallery_name }}\"\n      state: absent\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook 07-delete-gallery.yml\n```\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible/)\n"
  },
  {
    "path": "articles/ansible/vm-configure-windows.md",
    "content": "---\ntitle: Create a Windows virtual machine in Azure using Ansible\ndescription: Learn how to create Windows virtual machine in Azure using Ansible.\nkeywords: ansible, azure, devops, bash, playbook, virtual machine\nms.topic: tutorial\nms.service: ansible\nms.date: 08/28/2021\nms.custom: devx-track-ansible\n---\n\n# Create a Windows virtual machine in Azure using Ansible\n\nThis article shows how to deploy a Windows Server 2019 VM in Azure with [Ansible](https://docs.ansible.com/).\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n\n> * Create a resource group\n> * Create a virtual network, public IP, network security group, and network interface\n> * Deploy a Windows Server virtual machine\n> * Connect to the virtual machine via WinRM\n> * Run an Ansible playbook to configure Windows IIS\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [open-source-devops-prereqs-create-sp.md](../includes/open-source-devops-prereqs-create-service-principal.md)]\n\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation1.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation1.md)]\n\n## Add WinRM Support to Ansible\n\nTo communicate over WinRM, Ansible control server needs the python package `pywinrm`.\n\nRun the following command on the Ansible server to install `pywinrm`:\n\n```bash\npip install \"pywinrm>=0.3.0\"\n```\n\nFor more information, see [Windows Remote Management for Ansible](https://docs.ansible.com/ansible/latest/user_guide/windows_winrm.html#windows-remote-management).\n\n## Create a resource group\n\nCreate an Ansible playbook named `azure_windows_vm.yml` and copy the following contents into the playbook:\n\n```yaml\n---\n- name: Create Azure VM\n  hosts: localhost\n  connection: local\n  tasks:\n\n  - name: Create resource group\n    azure_rm_resourcegroup:\n      name: myResourceGroup\n      location: eastus\n```\n\n**Key points:**\n\n- Setting `hosts` to _localhost_ and `connection` as `_local_` runs the playbook locally on the Ansible server.\n\n## Create the virtual network and subnet\n\nAdd the following tasks to the `azure_windows_vm.yml` Ansible playbook to create a virtual network:\n\n```yml\n  - name: Create virtual network\n    azure_rm_virtualnetwork:\n      resource_group: myResourceGroup\n      name: vNet\n      address_prefixes: \"10.0.0.0/16\"\n\n  - name: Add subnet\n    azure_rm_subnet:\n      resource_group: myResourceGroup\n      name: subnet\n      address_prefix: \"10.0.1.0/24\"\n      virtual_network: vNet\n```\n\n## Create a public IP address\n\nAdd the following tasks to the `azure_windows_vm.yml` playbook to create a public IP address:\n\n```yml\n  - name: Create public IP address\n    azure_rm_publicipaddress:\n      resource_group: myResourceGroup\n      allocation_method: Static\n      name: pip\n    register: output_ip_address\n\n  - name: Output public IP\n    debug:\n      msg: \"The public IP is {{ output_ip_address.state.ip_address }}\"\n```\n\n**Key points:**\n\n- Ansible `register` module is used to store the output from `azure_rm_publicipaddress` in a variable called `output_ip_address`. \n- The `debug` module is used to output the public IP address of the VM to the console.\n\n## Create network security group and NIC\n\nNetwork security group defines what traffic is allowed and not allowed to reach the VM.\n\nTo open the WinRM and HTTP ports, add the following tasks to the `azure_windows_vm.yml` Ansible playbook:\n\n```yml\n  - name: Create Network Security Group\n    azure_rm_securitygroup:\n      resource_group: myResourceGroup\n      name: networkSecurityGroup\n      rules:\n        - name: 'allow_rdp'\n          protocol: Tcp\n          destination_port_range: 3389\n          access: Allow\n          priority: 1001\n          direction: Inbound\n        - name: 'allow_web_traffic'\n          protocol: Tcp\n          destination_port_range:\n            - 80\n            - 443\n          access: Allow\n          priority: 1002\n          direction: Inbound\n        - name: 'allow_powershell_remoting'\n          protocol: Tcp\n          destination_port_range: \n            - 5985\n            - 5986\n          access: Allow\n          priority: 1003\n          direction: Inbound\n\n  - name: Create a network interface\n    azure_rm_networkinterface:\n      name: nic\n      resource_group: myResourceGroup\n      virtual_network: vNet\n      subnet_name: subnet\n      security_group: networkSecurityGroup\n      ip_configurations:\n        - name: default\n          public_ip_address_name: pip\n          primary: True\n```\n\n**Key points**:\n\n* A virtual network interface card connects your VM to its virtual network, public IP address, and security group.\n* The `azure_rm_securitygroup` creates an Azure network security group to allow WinRM traffic from the Ansible server to the remote host by allowing port `5985` and `5986`.\n\n### Create a virtual machine\n\nNext create a virtual machine that uses all the resources you've created in the previous sections of this article.\n\nAdd the following task to the `azure_windows_vm.yml` Ansible playbook:\n\n```yml\n  - name: Create VM\n    azure_rm_virtualmachine:\n      resource_group: myResourceGroup\n      name: win-vm\n      vm_size: Standard_DS1_v2\n      admin_username: azureuser\n      admin_password: \"{{ password }}\"\n      network_interfaces: nic\n      os_type: Windows\n      image:\n          offer: WindowsServer\n          publisher: MicrosoftWindowsServer\n          sku: 2019-Datacenter\n          version: latest\n    no_log: true\n```\n\nThe `admin_password` value of `{{ password }}` is an Ansible variable that contains the Windows VM password. To securely populate that variable, add a `var_prompts` entry to the beginning of the playbook.\n\n```yml\n- name: Create Azure VM\n  hosts: localhost\n  connection: local\n  vars_prompt:\n    - name: password\n      prompt: \"Enter local administrator password\"\n  tasks:\n```\n\n**Key points**:\n* Avoid storing sensitive data as plain text. Use `var_prompts` to populate variables at run time. Add `no_log: true` to prevent passwords from being log.\n\n## Configure the WinRM Listener\n\nAnsible uses PowerShell to connect and configure Windows remote hosts via WinRM.\n\nTo configure WinRM, add the following ext `azure_rm_virtualmachineextension`:\n\n```yml\n  - name: Create VM script extension to enable HTTPS WinRM listener\n    azure_rm_virtualmachineextension:\n      name: winrm-extension\n      resource_group: myResourceGroup\n      virtual_machine_name: win-vm\n      publisher: Microsoft.Compute\n      virtual_machine_extension_type: CustomScriptExtension\n      type_handler_version: '1.9'\n      settings: '{\"fileUris\": [\"https://raw.githubusercontent.com/ansible/ansible-documentation/devel/examples/scripts/ConfigureRemotingForAnsible.ps1\"],\"commandToExecute\": \"powershell -ExecutionPolicy Unrestricted -File ConfigureRemotingForAnsible.ps1\"}'\n      auto_upgrade_minor_version: true\n```\n\nAnsible can't connect to the VM until WinRM is fully configured.\n\nAdd the following tasks to your playbook to wait for the WinRM connection:\n\n```yml\n  - name: Get facts for one Public IP\n    azure_rm_publicipaddress_info:\n      resource_group: myResourceGroup\n      name: pip\n    register: publicipaddresses\n\n  - name: set public ip address fact\n    set_fact: publicipaddress=\"{{ publicipaddresses | json_query('publicipaddresses[0].ip_address')}}\"\n\n  - name: wait for the WinRM port to come online\n    wait_for:\n      port: 5986\n      host: '{{ publicipaddress }}'\n      timeout: 600\n```\n\n**Key points**:\n* The `azure_rm_virtualmachineextension` module allows you to run a PowerShell script locally on the Azure Windows. Running the `ConfigureRemotingForAnsible.ps1` PowerShell script configures WinRM by creating self-signed certificates and opening the necessary ports for Ansible to connect.\n* The `azure_rm_publicipaddress_info` module queries the public IP address from Azure then `set_fact` stores the output in a variable for the `wait_for` module to use.\n\n## Complete sample Ansible playbook\n\nThis section lists the entire sample Ansible playbook that you've built up over the course of this article.\n\n```yml\n---\n- name: Create Azure VM\n  hosts: localhost\n  connection: local\n  vars_prompt:\n    - name: password\n      prompt: \"Enter local administrator password\"\n  tasks:\n\n  - name: Create resource group\n    azure_rm_resourcegroup:\n      name: myResourceGroup\n      location: eastus\n\n  - name: Create virtual network\n    azure_rm_virtualnetwork:\n      resource_group: myResourceGroup\n      name: vNet\n      address_prefixes: \"10.0.0.0/16\"\n\n  - name: Add subnet\n    azure_rm_subnet:\n      resource_group: myResourceGroup\n      name: subnet\n      address_prefix: \"10.0.1.0/24\"\n      virtual_network: vNet\n\n  - name: Create public IP address\n    azure_rm_publicipaddress:\n      resource_group: myResourceGroup\n      allocation_method: Static\n      name: pip\n    register: output_ip_address\n\n  - name: Output public IP\n    debug:\n      msg: \"The public IP is {{ output_ip_address.state.ip_address }}\"\n  \n  - name: Create Network Security Group\n    azure_rm_securitygroup:\n      resource_group: myResourceGroup\n      name: networkSecurityGroup\n      rules:\n        - name: 'allow_rdp'\n          protocol: Tcp\n          destination_port_range: 3389\n          access: Allow\n          priority: 1001\n          direction: Inbound\n        - name: 'allow_web_traffic'\n          protocol: Tcp\n          destination_port_range:\n            - 80\n            - 443\n          access: Allow\n          priority: 1002\n          direction: Inbound\n        - name: 'allow_powershell_remoting'\n          protocol: Tcp\n          destination_port_range: \n            - 5985\n            - 5986\n          access: Allow\n          priority: 1003\n          direction: Inbound\n\n  - name: Create a network interface\n    azure_rm_networkinterface:\n      name: nic\n      resource_group: myResourceGroup\n      virtual_network: vNet\n      subnet_name: subnet\n      security_group: networkSecurityGroup\n      ip_configurations:\n        - name: default\n          public_ip_address_name: pip\n          primary: True\n\n  - name: Create VM\n    azure_rm_virtualmachine:\n      resource_group: myResourceGroup\n      name: win-vm\n      vm_size: Standard_DS1_v2\n      admin_username: azureuser\n      admin_password: \"{{ password }}\"\n      network_interfaces: nic\n      os_type: Windows\n      image:\n          offer: WindowsServer\n          publisher: MicrosoftWindowsServer\n          sku: 2019-Datacenter\n          version: latest\n    no_log: true\n\n  - name: Create VM script extension to enable HTTPS WinRM listener\n    azure_rm_virtualmachineextension:\n      name: winrm-extension\n      resource_group: myResourceGroup\n      virtual_machine_name: win-vm\n      publisher: Microsoft.Compute\n      virtual_machine_extension_type: CustomScriptExtension\n      type_handler_version: '1.9'\n      settings: '{\"fileUris\": [\"https://raw.githubusercontent.com/ansible/ansible-documentation/devel/examples/scripts/ConfigureRemotingForAnsible.ps1\"],\"commandToExecute\": \"powershell -ExecutionPolicy Unrestricted -File ConfigureRemotingForAnsible.ps1\"}'\n      auto_upgrade_minor_version: true\n\n  - name: Get facts for one Public IP\n    azure_rm_publicipaddress_info:\n      resource_group: myResourceGroup\n      name: pip\n    register: publicipaddresses\n\n  - name: set public ip address fact\n    set_fact: publicipaddress=\"{{ publicipaddresses | json_query('publicipaddresses[0].ip_address')}}\"\n\n  - name: wait for the WinRM port to come online\n    wait_for:\n      port: 5986\n      host: '{{ publicipaddress }}'\n      timeout: 600\n```\n\n## Connect to the Windows virtual machine\n\nCreate a new Ansible playbook named `connect_azure_windows_vm.yml` and copy the following contents into the playbook:\n\n```yml\n---\n- hosts: all\n  vars_prompt:\n    - name: ansible_password\n      prompt: \"Enter local administrator password\"\n  vars:\n    ansible_user: azureuser\n    ansible_connection: winrm\n    ansible_winrm_transport: ntlm\n    ansible_winrm_server_cert_validation: ignore\n  tasks:\n\n  - name: Test connection\n    win_ping:\n```\n\nRun the Ansible playbook.\n\n```bash\nansible-playbook connect_azure_windows_vm.yml -i <publicIPaddress>,\n```\n\nReplace `<publicIPaddress>` with your virtual machine's address.\n\n**Key points:**\n\n- Ansible's configuration determines how Ansible connects and authenticates to remote hosts. The variables you need to define to connect to a Windows host depend on your WinRM connection type and the authentication option you've chosen. For more information, see [Connecting to a Windows Host](https://www.ansible.com/blog/connecting-to-a-windows-host) and [Windows Authentication Options](https://docs.ansible.com/ansible/latest/user_guide/windows_winrm.html#authentication-options).\n- Adding a comma after the public IP address bypasses Ansible's inventory parser. This technique allows you to run playbooks without an inventory file.\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Ansible on Azure](./index.yml)\n"
  },
  {
    "path": "articles/ansible/vm-configure.md",
    "content": "---\ntitle: Create a Linux virtual machines in Azure using Ansible \ndescription: Learn how to create a Linux virtual machine in Azure using Ansible\nkeywords: ansible, azure, devops, virtual machine\nms.topic: tutorial\nms.date: 08/14/2024\nms.custom: devx-track-ansible, linux-related-content\n---\n\n# Create a Linux virtual machines in Azure using Ansible\n\nThis article presents a sample Ansible playbook for configuring a Linux virtual machine.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create a resource group\n> * Create a virtual network\n> * Create a public IP address\n> * Create a network security group\n> * Create a virtual network interface card\n> * Create a virtual machine\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-sub.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation1.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation1.md)]\n\n## 2. Create an SSH key pair\n\n1. Run the following command. When prompted, specify the files to be created in the following directory: `/home/azureuser/.ssh/authorized_keys`.\n\n    ```bash\n    ssh-keygen -m PEM -t rsa -b 4096\n    ```\n\n1. Copy the contents of the public key file. By default, the public key file is named `id_rsa.pub`. The value is a long string starting with \"ssh-rsa \". You'll need this value in the next step.\n    \n## 3. Implement the Ansible playbook\n\n1. Create a directory in which to test and run the sample Ansible code and make it the current directory.\n\n1. Create a file named `main.yml` and insert the following code. Replace the `<key_data>` placeholder with the public key value from the previous step.\n\n    ```yaml\n    - name: Create Azure VM\n      hosts: localhost\n      connection: local\n      tasks:\n      - name: Create resource group\n        azure_rm_resourcegroup:\n          name: myResourceGroup\n          location: eastus\n      - name: Create virtual network\n        azure_rm_virtualnetwork:\n          resource_group: myResourceGroup\n          name: myVnet\n          address_prefixes: \"10.0.0.0/16\"\n      - name: Add subnet\n        azure_rm_subnet:\n          resource_group: myResourceGroup\n          name: mySubnet\n          address_prefix: \"10.0.1.0/24\"\n          virtual_network: myVnet\n      - name: Create public IP address\n        azure_rm_publicipaddress:\n          resource_group: myResourceGroup\n          allocation_method: Static\n          name: myPublicIP\n        register: output_ip_address\n      - name: Public IP of VM\n        debug:\n          msg: \"The public IP is {{ output_ip_address.state.ip_address }}.\"\n      - name: Create Network Security Group that allows SSH\n        azure_rm_securitygroup:\n          resource_group: myResourceGroup\n          name: myNetworkSecurityGroup\n          rules:\n            - name: SSH\n              protocol: Tcp\n              destination_port_range: 22\n              access: Allow\n              priority: 1001\n              direction: Inbound\n      - name: Create virtual network interface card\n        azure_rm_networkinterface:\n          resource_group: myResourceGroup\n          name: myNIC\n          virtual_network: myVnet\n          subnet: mySubnet\n          public_ip_name: myPublicIP\n          security_group: myNetworkSecurityGroup\n      - name: Create VM\n        azure_rm_virtualmachine:\n          resource_group: myResourceGroup\n          name: myVM\n          vm_size: Standard_DS1_v2\n          admin_username: azureuser\n          ssh_password_enabled: false\n          ssh_public_keys:\n            - path: /home/azureuser/.ssh/authorized_keys\n              key_data: \"<key_data>\"\n          network_interfaces: myNIC\n          image:\n            offer: 0001-com-ubuntu-server-jammy\n            publisher: Canonical\n            sku: 22_04-lts\n            version: latest\n    ```\n\n## 4. Run the playbook\n\n[!INCLUDE [ansible-playbook.md](includes/ansible-playbook.md)]\n\n## 5. Verify the results\n\nRun [az vm list](/cli/azure/vm#az-vm-list) to verify the VM was created.\n\n  ```azurecli\n  az vm list -d -o table --query \"[?name=='myVM']\"\n  ```\n\n## 6. Connect to the VM\n\nRun the SSH command to connect to your new Linux VM. Replace the &lt;ip-address> placeholder with the IP address from the previous step.\n\n```bash\nssh azureuser@<ip_address> -i /home/azureuser/.ssh/authorized_keys/id_rsa\n```\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Manage a Linux virtual machine in Azure using Ansible](./vm-manage.md)\n"
  },
  {
    "path": "articles/ansible/vm-manage.md",
    "content": "---\ntitle: Manage Linux virtual machines in Azure using Ansible \ndescription: Learn how to manage a Linux virtual machine in Azure using Ansible\nkeywords: ansible, azure, devops, bash, cloudshell, playbook, bash\nms.topic: tutorial\nms.date: 08/28/2021\nms.custom: devx-track-ansible, linux-related-content\n---\n\n# Manage Linux virtual machines in Azure using Ansible\n\nAnsible allows you to automate the deployment and configuration of resources in your environment. In this article, you use an Ansible playbook to start and stop a Linux virtual machine. \n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-sub.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Stop a virtual machine\n\nIn this section, you use Ansible to deallocate (stop) an Azure virtual machine.\n\n1. Sign in to the [Azure portal](https://go.microsoft.com/fwlink/p/?LinkID=525040).\n\n1. Open [Cloud Shell](/azure/cloud-shell/overview).\n\n1. Create a file named `azure-vm-stop.yml`, and open it in the editor:\n\n    ```bash\n    code azure-vm-stop.yml\n    ```\n\n1. Paste the following sample code into the editor:\n\n    ```yaml\n    - name: Stop Azure VM\n      hosts: localhost\n      connection: local\n      tasks:\n        - name: Stop virtual machine\n          azure_rm_virtualmachine:\n            resource_group: {{ resource_group_name }}\n            name: {{ vm_name }}\n            allocated: no\n    ```\n\n1. Replace the `{{ resource_group_name }}` and `{{ vm_name }}` placeholders with your values.\n\n1. Save the file and exit the editor.\n\n1. Run the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n    ```bash\n    ansible-playbook azure-vm-stop.yml\n    ```\n\n1. After running the playbook, you see output similar to the following results:\n\n    ```bash\n    PLAY [Stop Azure VM] ********************************************************\n\n    TASK [Gathering Facts] ******************************************************\n    ok: [localhost]\n\n    TASK [Deallocate the Virtual Machine] ***************************************\n    changed: [localhost]\n\n    PLAY RECAP ******************************************************************\n    localhost                  : ok=2    changed=1    unreachable=0    failed=0\n    ```\n\n## Start a virtual machine\n\nIn this section, you use Ansible to start a deallocated (stopped) Azure virtual machine.\n\n1. Sign in to the [Azure portal](https://go.microsoft.com/fwlink/p/?LinkID=525040).\n\n1. Open [Cloud Shell](/azure/cloud-shell/overview).\n\n1. Create a file named `azure-vm-start.yml`, and open it in the editor:\n\n    ```bash\n    code azure-vm-start.yml\n    ```\n\n1. Paste the following sample code into the editor:\n\n    ```yaml\n    - name: Start Azure VM\n      hosts: localhost\n      connection: local\n      tasks:\n        - name: Start virtual machine\n          azure_rm_virtualmachine:\n            resource_group: {{ resource_group_name }}\n            name: {{ vm_name }}\n            started: yes\n    ```\n\n1. Replace the `{{ resource_group_name }}` and `{{ vm_name }}` placeholders with your values.\n\n1. Save the file and exit the editor.\n\n1. Run the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n    ```bash\n    ansible-playbook azure-vm-start.yml\n    ```\n\n1. After running the playbook, you see output similar to the following results:\n\n    ```bash\n    PLAY [Start Azure VM] ********************************************************\n\n    TASK [Gathering Facts] ******************************************************\n    ok: [localhost]\n\n    TASK [Start the Virtual Machine] ********************************************\n    changed: [localhost]\n\n    PLAY RECAP ******************************************************************\n    localhost                  : ok=2    changed=1    unreachable=0    failed=0\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Tutorial: Manage Azure dynamic inventories using Ansible](./dynamic-inventory-configure.md)\n"
  },
  {
    "path": "articles/ansible/vm-scale-set-auto-scale.md",
    "content": "---\ntitle: Tutorial - Autoscale virtual machine scale sets in Azure using Ansible \ndescription: Learn how to use Ansible to scale virtual machine scale sets with autoscale in Azure\nkeywords: ansible, azure, devops, bash, playbook, scale, autoscale, virtual machine, virtual machine scale set, vmss\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Autoscale virtual machine scale sets in Azure using Ansible\n\n[!INCLUDE [ansible-27-note.md](includes/ansible-27-note.md)]\n\n[!INCLUDE [open-source-devops-intro-vm-scale-set.md](../includes/open-source-devops-intro-vm-scale-set.md)]\n\nThe feature of automatically adjusting the number of VM instances is called [autoscale](/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-autoscale-overview). The benefit of autoscale is that it reduces the management overhead to monitor and optimize the performance of your application. Autoscale can be configured in response to demand or on a defined schedule. Using Ansible, you can specify the autoscale rules that define the acceptable performance for a positive customer experience.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Define an autoscale profile\n> * Autoscale based on a recurring schedule\n> * Autoscale based on app performance\n> * Retrieve autoscale settings information \n> * Disable an autoscale setting\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)] \n[!INCLUDE [ansible-prereqs-vm-scale-set.md](includes/ansible-prereqs-vm-scale-set.md)]\n\n## Autoscale based on a schedule\n\nTo enable autoscale on a scale set, you first define an autoscale profile. This profile defines the default, minimum, and maximum scale set capacity. These limits let you control cost by not continually creating VM instances, and balance acceptable performance with a minimum number of instances that remain in a scale-in event. \n\nAnsible allows you to scale your scale sets on a specific date or recurring schedule.\n\nThe playbook code in this section increases the number of VM instances to three at 10:00 every Monday.\n\nSave the following playbook as `vmss-auto-scale.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    vmss_name: myScaleSet\n    name: autoscalesetting\n  tasks: \n    - name: Create autoscaling\n      azure_rm_autoscale:\n         resource_group: \"{{ resource_group }}\"\n         name: \"{{ name }}\"\n         target:\n           namespace: \"Microsoft.Compute\"\n           types: \"virtualMachineScaleSets\"\n           name: \"{{ vmss_name }}\"\n         enabled: true\n         profiles:\n         - count: '3'\n           min_count: '3'\n           max_count: '3'\n           name: Auto created scale condition\n           recurrence_timezone: Pacific Standard Time\n           recurrence_frequency: Week\n           recurrence_days:\n              - Monday\n           recurrence_mins:\n              - '0'\n           recurrence_hours:\n              - '10'\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook vmss-auto-scale.yml\n```\n\n## Autoscale based on performance data\n\nIf your application demand increases, the load on the VM instances in your scale sets increases. If this increased load is consistent, rather than just a brief demand, you can configure autoscale rules to increase the number of VM instances in the scale set. When these VM instances are created and your applications are deployed, the scale set starts to distribute traffic to them through the load balancer. Ansible allows you to control what metrics to monitor, such as CPU usage, disk usage, and app-load time. You can scale in and scale out in scale sets based on performance metric thresholds, by a recurring schedule, or by a particular date. \n\nThe playbook code in this section checks the CPU workload for the previous 10 minutes at 18:00 every Monday. \n\nBased on the CPU percentage metrics, the playbook does one of the following actions:\n\n- Scales out the number of VM instances to four\n- Scales in the number of VM instances to one\n\nSave the following playbook as `vmss-auto-scale-metrics.yml`:\n\n```yml\n---\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    vmss_name: myScaleSet\n    name: autoscalesetting\n  tasks:\n  - name: Get facts of the resource group\n    azure_rm_resourcegroup_facts:\n      name: \"{{ resource_group }}\"\n    register: rg\n\n  - name: Get scale set resource uri\n    set_fact:\n      vmss_id: \"{{ rg.ansible_facts.azure_resourcegroups[0].id }}/providers/Microsoft.Compute/virtualMachineScaleSets/{{ vmss_name }}\"\n    \n  - name: Create autoscaling\n    azure_rm_autoscale:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ name }}\"\n      target: \"{{ vmss_id }}\"\n      enabled: true\n      profiles:\n      - count: '1'\n        max_count: '1'\n        min_count: '1'\n        name: 'This scale condition is executed when none of the other scale condition(s) match'\n        recurrence_days:\n          - Monday\n        recurrence_frequency: Week\n        recurrence_hours:\n          - 18\n        recurrence_mins:\n          - 0\n        recurrence_timezone: Pacific Standard Time\n      - count: '1'\n        min_count: '1'\n        max_count: '4'\n        name: Auto created scale condition\n        recurrence_days:\n          - Monday\n        recurrence_frequency: Week\n        recurrence_hours:\n          - 18\n        recurrence_mins:\n          - 0\n        recurrence_timezone: Pacific Standard Time\n        rules:\n          - cooldown: 5\n            direction: Increase\n            metric_name: Percentage CPU\n            metric_resource_uri: \"{{ vmss_id }}\"\n            operator: GreaterThan\n            statistic: Average\n            threshold: 70\n            time_aggregation: Average\n            time_grain: 1\n            time_window: 10\n            type: ChangeCount\n            value: '1'\n          - cooldown: 5\n            direction: Decrease\n            metric_name: Percentage CPU\n            metric_resource_uri: \"{{ vmss_id }}\"\n            operator: LessThan\n            statistic: Average\n            threshold: 30\n            time_aggregation: Average\n            time_grain: 1\n            time_window: 10\n            type: ChangeCount\n            value: '1'\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook vmss-auto-scale-metrics.yml\n```\n\n## Get autoscale settings information \n\nThe playbook code in this section uses the `azure_rm_autoscale_facts` module to retrieve the details of autoscale setting.\n\nSave the following playbook as `vmss-auto-scale-get-settings.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    name: autoscalesetting\n  tasks: \n    - name: Retrieve autoscale settings information\n      azure_rm_autoscale_facts:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ name }}\"\n      register: autoscale_query\n    \n    - debug:\n        var: autoscale_query.autoscales[0]\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook vmss-auto-scale-get-settings.yml\n```\n\n## Disable autoscale settings\n\nThere are two ways to disable autoscale settings. One way is to change the `enabled` key from `true` to `false`. The second way is to delete the setting.\n\nThe playbook code in this section deletes the autoscale setting. \n\nSave the following playbook as `vmss-auto-scale-delete-setting.yml`:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    name: autoscalesetting\n  tasks: \n    - name: Delete autoscaling\n      azure_rm_autoscale:\n         resource_group: \"{{ resource_group }}\"\n         name: \"{{ name }}\"\n         state: absent\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nvmss-auto-scale-delete-setting.yml\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Tutorial: Update custom image of Azure virtual machine scale sets using Ansible](./vm-scale-set-update-image.md)"
  },
  {
    "path": "articles/ansible/vm-scale-set-configure.md",
    "content": "---\ntitle: Tutorial - Configure virtual machine scale sets in Azure using Ansible\ndescription: Learn how to use Ansible to create and configure virtual machine scale sets in Azure\nkeywords: ansible, azure, devops, bash, playbook, virtual machine, virtual machine scale set, vmss\nms.topic: tutorial\nms.date: 04/30/2019\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Configure virtual machine scale sets in Azure using Ansible\n\n[!INCLUDE [ansible-29-note.md](includes/ansible-29-note.md)]\n\n[!INCLUDE [open-source-devops-intro-vm-scale-set.md](../includes/open-source-devops-intro-vm-scale-set.md)]\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Configure the resources for a VM\n> * Configure a scale set\n> * Scale the scale set by increasing it's VM instances \n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Configure a scale set\n\nThe playbook code in this section defines the following resources:\n\n* **Resource group** into which all of your resources will be deployed.\n* **Virtual network** in the 10.0.0.0/16 address space\n* **Subnet** within the virtual network\n* **Public IP address** that allows you to access resources across the Internet\n* **Network security group** that controls the flow of network traffic in and out of your scale set\n* **Load balancer** that distributes traffic across a set of defined VMs using load balancer rules\n* **Virtual machine scale set** that uses all the created resources\n\nThere are two ways to get the sample playbook:\n\n* [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/vmss/vmss-create.yml) and save the file as `vmss-create.yml`.\n\n* Create a new file named `vmss-create.yml`. Insert the following code into the new file:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    vmss_name: myvmscalesetname\n    vmss_lb_name: myScaleSetLb\n    location: eastus\n    admin_username: azureuser\n    admin_password: \"{{ admin_password }}\"\n\n  tasks:\n    - name: Create a resource group\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n    - name: Create virtual network\n      azure_rm_virtualnetwork:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vmss_name }}\"\n        address_prefixes: \"10.0.0.0/16\"\n    - name: Add subnet\n      azure_rm_subnet:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vmss_name }}\"\n        address_prefix: \"10.0.1.0/24\"\n        virtual_network: \"{{ vmss_name }}\"\n    - name: Create public IP address\n      azure_rm_publicipaddress:\n        resource_group: \"{{ resource_group }}\"\n        allocation_method: Static\n        name: \"{{ vmss_name }}\"\n    - name: Create Network Security Group that allows SSH\n      azure_rm_securitygroup:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vmss_name }}\"\n        rules:\n          - name: SSH\n            protocol: Tcp\n            destination_port_range: 22\n            access: Allow\n            priority: 1001\n            direction: Inbound\n\n    - name: Create a load balancer\n      azure_rm_loadbalancer:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vmss_name }}lb\"\n        location: \"{{ location }}\"\n        frontend_ip_configurations:\n          - name: \"{{ vmss_name }}front-config\"\n            public_ip_address: \"{{ vmss_name }}\"\n        backend_address_pools:\n          - name: \"{{ vmss_name }}backend-pool\"\n        probes:\n          - name: \"{{ vmss_name }}prob0\"\n            port: 8080\n            interval: 10\n            fail_count: 3\n        inbound_nat_pools:\n          - name: \"{{ vmss_name }}nat-pool\"\n            frontend_ip_configuration_name: \"{{ vmss_name }}front-config\"\n            protocol: Tcp\n            frontend_port_range_start: 50000\n            frontend_port_range_end: 50040\n            backend_port: 22\n        load_balancing_rules:\n          - name: \"{{ vmss_name }}lb-rules\"\n            frontend_ip_configuration: \"{{ vmss_name }}front-config\"\n            backend_address_pool: \"{{ vmss_name }}backend-pool\"\n            frontend_port: 80\n            backend_port: 8080\n            load_distribution: Default\n            probe: \"{{ vmss_name }}prob0\"\n\n    - name: Create VMSS\n      no_log: true\n      azure_rm_virtualmachinescaleset:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vmss_name }}\"\n        vm_size: Standard_DS1_v2\n        admin_username: \"{{ admin_username }}\"\n        admin_password: \"{{ admin_password }}\"\n        ssh_password_enabled: true\n        capacity: 2\n        virtual_network_name: \"{{ vmss_name }}\"\n        subnet_name: \"{{ vmss_name }}\"\n        upgrade_policy: Manual\n        tier: Standard\n        managed_disk_type: Standard_LRS\n        os_disk_caching: ReadWrite\n        image:\n          offer: UbuntuServer\n          publisher: Canonical\n          sku: 16.04-LTS\n          version: latest\n        load_balancer: \"{{ vmss_name }}lb\"\n        data_disks:\n          - lun: 0\n            disk_size_gb: 20\n            managed_disk_type: Standard_LRS\n            caching: ReadOnly\n          - lun: 1\n            disk_size_gb: 30\n            managed_disk_type: Standard_LRS\n            caching: ReadOnly\n\n```\n\nBefore running the playbook, see the following notes:\n\n* In the `vars` section, replace the `{{ admin_password }}` placeholder with your own password.\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook vmss-create.yml\n```\n\nAfter running the playbook, you see output similar to the following results:\n\n```Output\nPLAY [localhost] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [Create a resource group] \nchanged: [localhost]\n\nTASK [Create virtual network] \nchanged: [localhost]\n\nTASK [Add subnet] \nchanged: [localhost]\n\nTASK [Create public IP address] \nchanged: [localhost]\n\nTASK [Create Network Security Group that allows SSH] \nchanged: [localhost]\n\nTASK [Create a load balancer] \nchanged: [localhost]\n\nTASK [Create Scale Set] \nchanged: [localhost]\n\nPLAY RECAP \nlocalhost                  : ok=8    changed=7    unreachable=0    failed=0\n\n```\n\n## View the number of VM instances\n\nThe [configured scale set](#configure-a-scale-set) currently has two instances. The following steps are used to confirm that value:\n\n1. Sign in to the [Azure portal](https://go.microsoft.com/fwlink/p/?LinkID=525040).\n\n1. Navigate to the scale set you configured.\n\n1. You see the scale set name with the number of instances in parenthesis: `Standard_DS1_v2 (2 instances)`\n\n1. You can also verify the number of instances with the [Azure Cloud Shell](https://shell.azure.com/) by running the following command:\n\n    ```azurecli-interactive\n    az vmss show -n myScaleSet -g myResourceGroup --query '{\"capacity\":sku.capacity}' \n    ```\n\n    The results of running the Azure CLI command in Cloud Shell show that two instances exist:\n\n    ```bash\n    {\n      \"capacity\": 2,\n    }\n    ```\n\n## Scale out a scale set\n\nThe playbook code in this section retrieves information about the scale set and changes its capacity from two to three.\n\nThere are two ways to get the sample playbook:\n\n* [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/vmss/vmss-scale-out.yml) and save it to `vmss-scale-out.yml`.\n\n* Create a new file named `vmss-scale-out.yml`. Insert the following code into the new file:\n\n```yml\n---\n- hosts: localhost\n  gather_facts: false\n  \n  vars:\n    resource_group: myTestRG\n    vmss_name: myTestVMSS\n  \n  tasks:\n\n    - name: Get scaleset info\n      azure_rm_virtualmachine_scaleset_facts:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vmss_name }}\"\n        format: curated\n      register: output_scaleset\n\n    - name: set image fact\n      set_fact:\n        vmss_image: \"{{ output_scaleset.vmss[0].image }}\"\n\n    - name: Create VMSS\n      no_log: true\n      azure_rm_virtualmachinescaleset:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vmss_name }}\"\n        capacity: 3\n        image: \"{{ vmss_image }}\"\n```\n\nRun the playbook using [ansible-playbook](https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html)\n\n```bash\nansible-playbook vmss-scale-out.yml\n```\n\nAfter running the playbook, you see output similar to the following results:\n\n```Output\nPLAY [localhost] \n\nTASK [Gathering Facts] \nok: [localhost]\n\nTASK [Get scaleset info] \nok: [localhost]\n\nTASK [Set image fact] \nok: [localhost]\n\nTASK [Change VMSS capacity] \nchanged: [localhost]\n\nPLAY RECAP \nlocalhost                  : ok=3    changed=1    unreachable=0    failed=0\n```\n\n## Verify the results\n\nVerify your results of your work via the Azure portal:\n\n1. Sign in to the [Azure portal](https://go.microsoft.com/fwlink/p/?LinkID=525040).\n\n1. Navigate to the scale set you configured.\n\n1. You see the scale set name with the number of instances in parenthesis: `Standard_DS1_v2 (3 instances)`\n\n1. You can also verify the change with the [Azure Cloud Shell](https://shell.azure.com/) by running the following command:\n\n    ```azurecli-interactive\n    az vmss show -n myScaleSet -g myResourceGroup --query '{\"capacity\":sku.capacity}' \n    ```\n\n    The results of running the Azure CLI command in Cloud Shell show that three instances now exist: \n\n    ```bash\n    {\n      \"capacity\": 3,\n    }\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Tutorial: Deploy apps to virtual machine scale sets in Azure using Ansible](./vm-scale-set-deploy-app.md)\n"
  },
  {
    "path": "articles/ansible/vm-scale-set-deploy-app.md",
    "content": "---\ntitle: Tutorial - Deploy apps to virtual machine scale sets in Azure using Ansible\ndescription: Learn how to use Ansible to configure Azure virtual machine scale sets and deploy application on the scale set\nkeywords: ansible, azure, devops, bash, playbook, virtual machine, virtual machine scale set, vmss\nms.topic: tutorial\nms.date: 08/14/2024\nms.custom: devx-track-ansible\n---\n\n# Tutorial: Deploy apps to virtual machine scale sets in Azure using Ansible\n\n[!INCLUDE [ansible-27-note.md](includes/ansible-27-note.md)]\n\n[!INCLUDE [open-source-devops-intro-vm-scale-set.md](../includes/open-source-devops-intro-vm-scale-set.md)]\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Retrieve host information for a group of Azure VMs\n> * Clone and build the sample app\n> * Install the JRE (Java Runtime Environment) on a scale set\n> * Deploy the Java application to a scale set\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)] \n[!INCLUDE [ansible-prereqs-vm-scale-set.md](includes/ansible-prereqs-vm-scale-set.md)]\n- **git** - [git](https://git-scm.com) is used to download a Java sample used in this tutorial.\n- **Java SE Development Kit (JDK)** - The [JDK](../java/fundamentals/java-support-on-azure.md) is used to build the sample Java project.\n- **Apache Maven** - [Apache Maven](https://maven.apache.org/download.cgi) is used to build the sample Java project.\n\n## Get host information\n\nThe playbook code in this section retrieves host information for a group of virtual machines. The code gets the public IP addresses and load balancer within a specified resource group and creates a host group named `scalesethosts` in inventory.\n\nSave the following sample playbook as `get-hosts-tasks.yml`:\n\n  ```yml\n  - name: Get facts for all Public IPs within a resource groups\n    azure_rm_publicipaddress_info:\n      resource_group: \"{{ resource_group }}\"\n    register: output_ip_address\n\n  - name: Get loadbalancer info\n    azure_rm_loadbalancer_info:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ loadbalancer_name }}\"\n    register: output\n\n  - name: Add all hosts\n    add_host:\n      groups: scalesethosts\n      hostname: \"{{ output_ip_address.publicipaddresses[0].ip_address }}_{{ item.properties.frontendPort }}\"\n      ansible_host: \"{{ output_ip_address.publicipaddresses[0].ip_address }}\"\n      ansible_port: \"{{ item.properties.frontendPort }}\"\n      ansible_ssh_user: \"{{ admin_username }}\"\n      ansible_ssh_pass: \"{{ admin_password }}\"\n    with_items:\n      - \"{{ output.ansible_info.azure_loadbalancers[0].properties.inboundNatRules }}\"\n  ```\n\n## Prepare an application for deployment\n\nThe playbook code in this section uses `git` to clone a Java sample project from GitHub and builds the project. \n\nSave the following playbook as `app.yml`:\n\n  ```yml\n  - hosts: localhost\n    vars:\n      repo_url: https://github.com/spring-guides/gs-spring-boot.git\n      workspace: ~/src/helloworld\n\n    tasks:\n    - name: Git Clone sample app\n      git:\n        repo: \"{{ repo_url }}\"\n        dest: \"{{ workspace }}\"\n\n    - name: Build sample app\n      shell: mvn package chdir=\"{{ workspace }}/complete\"\n  ```\n\nRun the sample Ansible playbook with the following command:\n\n  ```bash\n  ansible-playbook app.yml\n  ```\n\nAfter running the playbook, you see output similar to the following results:\n\n  ```Output\n  PLAY [localhost] \n\n  TASK [Gathering Facts] \n  ok: [localhost]\n\n  TASK [Git Clone sample app] \n  changed: [localhost]\n\n  TASK [Build sample app] \n  changed: [localhost]\n\n  PLAY RECAP \n  localhost                  : ok=3    changed=2    unreachable=0    failed=0\n\n  ```\n\n## Deploy the application to a scale set\n\nThe playbook code in this section is used to:\n\n* Install the JRE on a host group named `saclesethosts`\n* Deploy the Java application to a host group named `saclesethosts`\n\nThere are two ways to get the sample playbook:\n\n* [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/vmss/vmss-setup-deploy.yml) and save it to `vmss-setup-deploy.yml`.\n\n* Create a new file named `vmss-setup-deploy.yml`. Insert the following code into the new file:\n\n```yml\n- hosts: localhost\n  vars:\n    resource_group: myResourceGroup\n    scaleset_name: myScaleSet\n    loadbalancer_name: myScaleSetLb\n    admin_username: azureuser\n    admin_password: \"{{ admin_password }}\"\n  tasks:\n  - include: get-hosts-tasks.yml\n\n- name: Install JRE on a scale set\n  hosts: scalesethosts\n  become: yes\n  vars:\n    workspace: ~/src/helloworld\n    admin_username: azureuser\n\n  tasks:\n  - name: Install JRE\n    apt:\n      name: default-jre\n      update_cache: yes\n\n  - name: Copy app to Azure VM\n    copy:\n      src: \"{{ workspace }}/complete/target/gs-spring-boot-0.1.0.jar\"\n      dest: \"/home/{{ admin_username }}/helloworld.jar\"\n      force: yes\n      mode: 0755\n\n  - name: Start the application\n    shell: java -jar \"/home/{{ admin_username }}/helloworld.jar\" >/dev/null 2>&1 &\n    async: 5000\n    poll: 0\n```\n\nBefore running the playbook, see the following notes:\n\n* In the `vars` section, replace the `{{ admin_password }}` placeholder with your own password.\n* To use the ssh connection type with passwords, install the sshpass program:\n\n    Ubuntu:\n\n    ```bash\n    apt-get install sshpass\n    ```\n\n* In some environments, you may see an error about using an SSH password instead of a key. If you do receive that error, you can disable host key checking by adding the following line to `/etc/ansible/ansible.cfg` or `~/.ansible.cfg`:\n\n    ```bash\n    [defaults]\n    host_key_checking = False\n    ```\n\nRun the playbook with the following command:\n\n  ```bash\n  ansible-playbook vmss-setup-deploy.yml\n  ```\n\nThe output from running the ansible-playbook command indicates that the sample Java application has been installed to the host group of the scale set:\n\n  ```Output\n  PLAY [localhost]\n\n  TASK [Gathering Facts]\n  ok: [localhost]\n\n  TASK [Get facts for all Public IPs within a resource groups]\n  ok: [localhost]\n\n  TASK [Get loadbalancer info]\n  ok: [localhost]\n\n  TASK [Add all hosts]\n  changed: [localhost] ...\n\n  PLAY [Install JRE on scale set]\n\n  TASK [Gathering Facts]\n  ok: [40.114.30.145_50000]\n  ok: [40.114.30.145_50003]\n\n  TASK [Copy app to Azure VM]\n  changed: [40.114.30.145_50003]\n  changed: [40.114.30.145_50000]\n\n  TASK [Start the application]\n  changed: [40.114.30.145_50000]\n  changed: [40.114.30.145_50003]\n\n  PLAY RECAP\n  40.114.30.145_50000        : ok=4    changed=3    unreachable=0    failed=0\n  40.114.30.145_50003        : ok=4    changed=3    unreachable=0    failed=0\n  localhost                  : ok=4    changed=1    unreachable=0    failed=0\n  ```\n\n## Verify the results\n\nVerify the results of your work by navigating to the URL of the load balancer for your scale set:\n\n![Java app running in a scale set in Azure.](media/vm-scale-set-deploy-app/demo.png)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Tutorial: Autoscale virtual machine scale sets in Azure using Ansible](./vm-scale-set-auto-scale.md)"
  },
  {
    "path": "articles/ansible/vm-scale-set-update-image.md",
    "content": "---\ntitle: Tutorial - Update the custom image of Azure virtual machine scale sets using Ansible\ndescription: Learn how to use Ansible to update virtual machine scale sets in Azure with custom image\nkeywords: ansible, azure, devops, bash, playbook, virtual machine, virtual machine scale set, vmss\nms.topic: tutorial\nms.date: 08/13/2024\nms.custom:\n  - devx-track-ansible\n  - sfi-image-nochange\n---\n\n# Tutorial: Update the custom image of Azure virtual machine scale sets using Ansible\n\n[!INCLUDE [ansible-27-note.md](includes/ansible-28-note.md)]\n\n[!INCLUDE [open-source-devops-intro-vm-scale-set.md](../includes/open-source-devops-intro-vm-scale-set.md)]\n\nAfter a VM is deployed, you configure the VM with the software your app needs. Instead of doing this configuration task for each VM, you can create a custom image. A custom image is a snapshot of an existing VM that includes any installed software. When you [configure a scale set](./vm-scale-set-configure.md), you specify the image to use for that scale set's VMs. By using a custom image, each VM instance is identically configured for your app. Sometimes, you may need to update your scale set's custom image. That task is the focus of this tutorial.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Configure two VMs with HTTPD\n> * Create a custom image from an existing VM\n> * Create a scale set from an image\n> * Update the custom image\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n[!INCLUDE [ansible-prereqs-cloudshell-use-or-vm-creation2.md](includes/ansible-prereqs-cloudshell-use-or-vm-creation2.md)]\n\n## Configure two VMs\n\nThe playbook code in this section creates two virtual machines with HTTPD installed on both. \n\nThe `index.html` page for each VM displays a test string:\n\n* First VM displays the value `Image A`\n* Second VM displays the value `Image B`\n\nThis string is meant to mimic configuring each VM with different software.\n\nThere are two ways to get the sample playbook:\n\n* [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/vmss_images/01-create-vms.yml) and save it to `create_vms.yml`.\n\n* Create a new file named `create_vms.yml`. Insert the following code into the new file.\n\n```yml\n- name: Create two VMs (A and B) with HTTPS\n  hosts: localhost\n  connection: local\n  vars:\n    vm_name: vmforimage\n    admin_username: testuser\n    admin_password: Pass123$$$abx!\n    location: eastus\n  tasks:\n  - name: Create a resource group\n    azure_rm_resourcegroup:\n      name: \"{{ resource_group }}\"\n      location: \"{{ location }}\"\n\n  - name: Create virtual network\n    azure_rm_virtualnetwork:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vm_name }}\"\n      address_prefixes: \"10.0.0.0/16\"\n\n  - name: Create subnets for VM A and B\n    azure_rm_subnet:\n      resource_group: \"{{ resource_group }}\"\n      virtual_network: \"{{ vm_name }}\"\n      name: \"{{ vm_name }}\"\n      address_prefix: \"10.0.1.0/24\"\n\n  - name: Create Network Security Group that allows HTTP\n    azure_rm_securitygroup:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vm_name }}\"\n      rules:\n        - name: HTTP\n          protocol: Tcp\n          destination_port_range: 80\n          access: Allow\n          priority: 1002\n          direction: Inbound\n\n  - name: Create public IP addresses for VM A and B\n    azure_rm_publicipaddress:\n      resource_group: \"{{ resource_group }}\"\n      allocation_method: Static\n      name: \"{{ vm_name }}_{{ item }}\"\n    loop:\n      - A\n      - B\n    register: pip_output\n\n  - name: Create virtual network interface cards for VM A and B\n    azure_rm_networkinterface:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vm_name }}_{{ item }}\"\n      virtual_network: \"{{ vm_name }}\"\n      subnet: \"{{ vm_name }}\"\n      public_ip_name: \"{{ vm_name }}_{{ item }}\"\n      security_group: \"{{ vm_name }}\"\n    loop:\n      - A\n      - B\n\n  - name: Create VM A and B\n    azure_rm_virtualmachine:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vm_name }}{{ item }}\"\n      admin_username: \"{{ admin_username }}\"\n      admin_password: \"{{ admin_password }}\"\n      vm_size: Standard_B1ms\n      network_interfaces: \"{{ vm_name }}_{{ item }}\"\n      image:\n        offer: UbuntuServer\n        publisher: Canonical\n        sku: 16.04-LTS\n        version: latest\n    loop:\n      - A\n      - B\n\n  - name: Create VM Extension\n    azure_rm_virtualmachineextension:\n      resource_group: \"{{ resource_group }}\"\n      name: testVMExtension\n      virtual_machine_name: \"{{ vm_name }}{{ item }}\"\n      publisher: Microsoft.Azure.Extensions\n      virtual_machine_extension_type: CustomScript\n      type_handler_version: 2.0\n      auto_upgrade_minor_version: true\n      settings: {\"commandToExecute\": \"sudo apt-get -y install apache2\"}\n    loop:\n      - A\n      - B\n\n  - name: Create VM Extension\n    azure_rm_virtualmachineextension:\n      resource_group: \"{{ resource_group }}\"\n      name: testVMExtension\n      virtual_machine_name: \"{{ vm_name }}{{ item }}\"\n      publisher: Microsoft.Azure.Extensions\n      virtual_machine_extension_type: CustomScript\n      type_handler_version: 2.0\n      auto_upgrade_minor_version: true\n      settings: {\"commandToExecute\": \"printf '<html><body><h1>Image {{ item }}</h1></body></html>' >> index.html; sudo cp index.html /var/www/html/\"}\n    loop:\n      - A\n      - B\n\n  - debug:\n      msg: \"Public IP Address A: {{ pip_output.results[0].state.ip_address }}\"\n\n  - debug:\n      msg: \"Public IP Address B: {{ pip_output.results[1].state.ip_address }}\"\n```\n\nRun the playbook using the `ansible-playbook` command, replacing `myrg` with your resource group name:\n\n```bash\nansible-playbook create-vms.yml --extra-vars \"resource_group=myrg\"\n```\n\nBecause of the `debug` sections of the playbook, the `ansible-playbook` command will print the IP address of each VM. Copy these IP addresses for later use.\n\n## Connect to the two VMs\n\nIn this section, you connect to each VM. As mentioned in the previous section, the strings `Image A` and `Image B` mimic having two distinct VMs with different configurations.\n\nUsing the IP addresses from the previous section, open a browser and connect to each VM.\n\n## Create images from each VM\n\nAt this point, you have two VMs with slightly different configurations (their `index.html` files).\n\nThe playbook code in this section creates a custom image for each VM:\n\n* `image_vmforimageA` - Custom image created for the VM that displays `Image A` on its home page.\n* `image_vmforimageB` - Custom image created for the VM that displays `Image B` on its home page.\n\nThere are two ways to get the sample playbook:\n\n* [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/vmss_images/02-capture-images.yml) and save it to `capture-images.yml`.\n\n* Create a new file named `capture-images.yml`. Insert the following code into the new file:\n\n```yml\n- name: Capture VM Images\n  hosts: localhost\n  connection: local\n  vars:\n    vm_name: vmforimage\n  tasks:\n\n  - name: Stop and generalize VMs\n    azure_rm_virtualmachine:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vm_name }}{{ item }}\"\n      generalized: yes\n    loop:\n      - A\n      - B\n\n  - name: Create an images from a VMs\n    azure_rm_image:\n      resource_group: \"{{ resource_group }}\"\n      name: \"image_{{ vm_name }}{{ item }}\"\n      source: \"{{ vm_name }}{{ item }}\"\n    loop:\n      - A\n      - B\n```\n\nRun the playbook using the `ansible-playbook` command, replacing `myrg` with your resource group name:\n\n```bash\nansible-playbook capture-images.yml --extra-vars \"resource_group=myrg\"\n```\n\n## Create scale set using Image A\n\nIn this section, a playbook is used to configure the following Azure resources:\n\n* Public IP address\n* Load balancer\n* Scale set that references `image_vmforimageA`\n\nThere are two ways to get the sample playbook:\n\n* [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/vmss_images/03-create-vmss.yml) and save it to `create-vmss.yml`.\n\n* Create a new file named `create-vmss.yml`. Insert the following code into the new file:\n\n```yml\n---\n- hosts: localhost\n  vars:\n    vmss_name: vmsstest\n    location: eastus\n    admin_username: vmssadmin\n    admin_password: User123!!!abc\n    vm_name: vmforimage\n    image_name: \"image_vmforimageA\"\n\n  tasks:\n\n    - name: Create public IP address\n      azure_rm_publicipaddress:\n        resource_group: \"{{ resource_group }}\"\n        allocation_method: Static\n        name: \"{{ vmss_name }}\"\n      register: pip_output\n\n    - name: Create a load balancer\n      azure_rm_loadbalancer:\n        name: \"{{ vmss_name }}lb\"\n        location: \"{{ location }}\"\n        resource_group: \"{{ resource_group }}\"\n        public_ip: \"{{ vmss_name }}\"\n        probe_protocol: Tcp\n        probe_port: 80\n        probe_interval: 10\n        probe_fail_count: 3\n        protocol: Tcp\n        load_distribution: Default\n        frontend_port: 80\n        backend_port: 80\n        idle_timeout: 4\n        natpool_frontend_port_start: 50000\n        natpool_frontend_port_end: 50040\n        natpool_backend_port: 22\n        natpool_protocol: Tcp\n\n    - name: Create a scale set\n      azure_rm_virtualmachinescaleset:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ vmss_name }}\"\n        vm_size: Standard_DS1_v2\n        admin_username: \"{{ admin_username }}\"\n        admin_password: \"{{ admin_password }}\"\n        ssh_password_enabled: true\n        capacity: 2\n        virtual_network_name: \"{{ vm_name }}\"\n        subnet_name: \"{{ vm_name }}\"\n        upgrade_policy: Manual\n        tier: Standard\n        managed_disk_type: Standard_LRS\n        os_disk_caching: ReadWrite\n        image:\n          name: \"{{ image_name }}\"\n          resource_group: \"{{ resource_group }}\"\n        load_balancer: \"{{ vmss_name }}lb\"\n\n    - debug:\n        msg: \"Scale set public IP address: {{ pip_output.state.ip_address }}\"\n```\n\nRun the playbook using the `ansible-playbook` command, replacing `myrg` with your resource group name:\n\n```bash\nansible-playbook create-vmss.yml --extra-vars \"resource_group=myrg\"\n```\n\nDue to the `debug` section of the playbook, the `ansible-playbook` command will print the IP address of the scale set. Copy this IP address for later use.\n\n## Connect to the scale set\n\nUsing the IP address from the previous section, connect to the scale set.\n\nAs mentioned in the previous section, the strings `Image A` and `Image B` mimic having two distinct VMs with different configurations.\n\nThe scale set references the custom image named `image_vmforimageA`. Custom image `image_vmforimageA` was created from the VM whose home page displays `Image A`.\n\nAs a result, you see a home page that displays `Image A`.\n\nLeave your browser window open as you continue to the next section.\n\n## Change custom image in scale set and upgrade instances\n\nThe playbook code in this section changes the scale set's image - from `image_vmforimageA` to `image_vmforimageB`. Also, all current virtual machines deployed by the scale set are updated.\n\nThere are two ways to get the sample playbook:\n\n* [Download the playbook](https://github.com/Azure-Samples/ansible-playbooks/blob/master/vmss_images/04-update-vmss-image.yml) and save it to `update-vmss-image.yml`.\n\n* Create a new file named `update-vmss-image.yml`. Insert the following code into the new file:\n\n```yml\n- name: Update scale set image reference\n  hosts: localhost\n  connection: local\n  vars:\n    vmss_name: vmsstest\n    image_name: image_vmforimageB\n    admin_username: vmssadmin\n    admin_password: User123!!!abc\n  tasks:\n\n  - name: Update scale set - second image\n    azure_rm_virtualmachinescaleset:\n      resource_group: \"{{ resource_group }}\"\n      name: \"{{ vmss_name }}\"\n      vm_size: Standard_DS1_v2\n      admin_username: \"{{ admin_username }}\"\n      admin_password: \"{{ admin_password }}\"\n      ssh_password_enabled: true\n      capacity: 3\n      virtual_network_name: \"{{ vmss_name }}\"\n      subnet_name: \"{{ vmss_name }}\"\n      upgrade_policy: Manual\n      tier: Standard\n      managed_disk_type: Standard_LRS\n      os_disk_caching: ReadWrite\n      image:\n        name: \"{{ image_name }}\"\n        resource_group: \"{{ resource_group }}\"\n      load_balancer: \"{{ vmss_name }}lb\"\n\n  - name: List all of the instances\n    azure_rm_virtualmachinescalesetinstance_facts:\n      resource_group: \"{{ resource_group }}\"\n      vmss_name: \"{{ vmss_name }}\"\n    register: instances\n\n  - debug:\n      var: instances\n\n  - name: manually upgrade all the instances \n    azure_rm_virtualmachinescalesetinstance:\n      resource_group: \"{{ resource_group }}\"\n      vmss_name: \"{{ vmss_name }}\"\n      instance_id: \"{{ item.instance_id }}\"\n      latest_model: yes\n    with_items: \"{{ instances.instances }}\"\n```\n\nRun the playbook using the `ansible-playbook` command, replacing `myrg` with your resource group name:\n\n```bash\nansible-playbook update-vmss-image.yml --extra-vars \"resource_group=myrg\"\n```\n\nReturn to the browser and refresh the page to see that the virtual machine's underlying custom image is updated.\n\n## Clean up resources\n\n[!INCLUDE [ansible-delete-resource-group.md](includes/ansible-delete-resource-group.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Ansible on Azure](/azure/ansible)"
  },
  {
    "path": "articles/azure-developer-cli/TOC.yml",
    "content": "- name: Azure Developer CLI\n  expanded: true\n  items:\n  - name: Azure Developer CLI overview\n    href: index.yml\n  - name: What is the Azure Developer CLI?\n    href: overview.md\n  - name: Get started\n    items:\n    - name: Install or update azd\n      href: install-azd.md\n    - name: Quickstarts\n      items: \n      - name: Deploy an azd template\n        href: get-started.md\n      - name: Explore and customize a template\n        href: quickstart-explore-templates.md\n    - name: Explore the template galleries\n      href: azd-template-galleries.md\n    - name: Supported languages and environments\n      href: supported-languages-environments.md\n  - name: Core concepts\n    items:\n    - name: Azure Developer CLI vs Azure CLI\n      href: azure-developer-cli-vs-azure-cli.md\n    - name: Explore the azd init workflow\n      href: azd-init-workflow.md\n    - name: Use GitHub Copilot with azd\n      href: azd-copilot-integration.md\n    - name: Explore the azd up workflow\n      href: azd-up-workflow.md\n    - name: Commands overview\n      href: azd-commands.md\n    - name: Templates overview\n      href: azd-templates.md\n    - name: Feature versioning and release strategy\n      href: feature-versioning.md\n  - name: Development workflows\n    items:\n    - name: Get started with template development\n      href: make-azd-compatible.md\n    - name: Use the compose feature\n      items:\n      - name: Compose feature overview\n        href: azd-compose.md\n      - name: Create a minimal template\n        href: compose-quickstart.md\n      - name: Generate Bicep files\n        href: compose-generate.md\n    - name: Build a template\n      items:\n      - name: Start with an existing template\n        href: start-with-existing-template.md\n      - name: Start with your app code\n        href: start-with-app-code.md\n      - name: Training - build and deploy azd templates\n        href: /training/paths/azure-developer-cli\n    - name: Work with extensions\n      items:\n      - name: Overview\n        href: extensions/overview.md\n      - name: Quickstart - Use the demo extension\n        href: extensions/quickstart-ai-extension.md\n      - name: Extensions\n        items:\n        - name: Copilot coding agent extension\n          href: extensions/copilot-coding-agent-extension.md\n        - name: Microsoft Foundry agent extension\n          href: extensions/azure-ai-foundry-extension.md\n  - name: Deployment and operations\n    items:\n      - name: CI/CD\n        items:\n          - name: Overview\n            href: configure-devops-pipeline.md\n          - name: Configure a GitHub Actions pipeline\n            href: pipeline-github-actions.md\n          - name: Configure an Azure DevOps pipeline\n            href: pipeline-azure-pipelines.md\n          - name: Create a custom pipeline definition file\n            href: pipeline-create-definition.md\n          - name: Advanced pipeline features\n            href: pipeline-advanced-features.md\n      - name: Monitoring and logging\n        items:\n        - name: Monitor your project\n          href: monitor-your-app.md\n      - name: Deployment configuration\n        items:\n        - name: Layered provisioning\n          href: layered-provisioning.md\n        - name: Remote build support\n          href: remote-builds.md\n        - name: Publishing workflows\n          href: publishing-workflows.md\n        - name: Azure App Service deployment slots\n          href: app-service-slots.md\n        - name: Docker support as a language\n          href: docker-language-support.md\n        - name: Metadata configuration\n          href: metadata.md\n        - name: Resource Group Scoped Deployments\n          href: resource-group-scoped-deployments.md\n        - name: Use third-party container registries\n          href: use-external-registry.md\n        - name: Azure deployment stacks integration\n          href: azure-deployment-stacks-integration.md\n        - name: Deploy to Microsoft Foundry online endpoints\n          href: azure-ai-ml-endpoints.md\n        - name: Configure service packaging ignore files\n          href: service-packaging-ignore-files.md\n        - name: Use Helm and Kustomize\n          href: helm-kustomize-support.md\n        - name: Remote Environment Support\n          href: remote-environments-support.md\n        - name: Azure Deployment Environments integration\n          href: ade-integration.md\n      - name: Environments\n        items:\n        - name: Overview\n          href: environments-overview.md\n        - name: Work with environments\n          href: work-with-environments.md\n        - name: Manage environment variables\n          href: manage-environment-variables.md\n        - name: Use environment secrets\n          href: environment-secrets.md\n        - name: Environment variables FAQ\n          href: environment-variables-faq.md\n      - name: Full stack\n        items:\n        - name: Full-stack deployment\n          href: full-stack-deployment.md\n        - name: Full-stack deployment templates\n          href: full-stack-templates.md\n      - name: Deploy to Azure Container Apps and Jobs\n        href: container-apps-workflows.md\n      - name: Use Terraform for infrastructure as code\n        href: use-terraform-for-azd.md\n      - name: .NET Aspire support\n        items:\n        - name: .NET Aspire integration and deployment\n          href: /dotnet/aspire/deployment/azure/aca-deployment-azd-in-depth?toc=/azure/developer/azure-developer-cli/toc.json&bc=/azure/developer/azure-developer-cli/breadcrumb/toc.json\n        - name: Deploy .NET Aspire apps using pipelines\n          href: /dotnet/aspire/deployment/azure/aca-deployment-github-actions?toc=/azure/developer/azure-developer-cli/toc.json&bc=/azure/developer/azure-developer-cli/breadcrumb/toc.json\n  - name: Configuration\n    items:\n    - name: Manage config settings\n      href: azd-config.md\n    - name: Customize workflows using command and event hooks\n      href: azd-extensibility.md\n    - name: Write hooks using programming languages\n      href: hooks-multi-language.md\n    - name: Custom prompts and parameters\n      href: custom-prompts.md\n    - name: Enable demo mode\n      href: demo-mode.md\n    - name: Configure template sources\n      href: configure-template-sources.md\n    - name: Use azd in sovereign clouds\n      href: sovereign-clouds.md\n    - name: Configure a proxy\n      href: configure-proxy.md\n  - name: Errors, troubleshooting, and FAQs\n    items:\n    - name: Provisioning and deployment errors FAQ\n      href: provisioning-deployment-faq.md\n    - name: Tooling and environment FAQ\n      href: tooling-environment-faq.md\n    - name: PowerShell guidance\n      href: powershell-guidance.md\n  - name: Reference and resources\n    items:\n    - name: Frequently asked questions (FAQ)\n      href: tooling-environment-faq.md\n    - name: azure.yaml schema\n      href: azd-schema.md\n    - name: Commands reference\n      href: reference.md\n    - name: CDN changes\n      href: content-delivery-network-changes.md\n  - name: Release notes and blog posts\n    items:\n    - name: All release notes and blog posts\n      href: https://devblogs.microsoft.com/azure-sdk/tag/azure-developer-cli/\n    - name: March 2026\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/\n    - name: February 2026\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-february-2026/\n    - name: January 2026\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-january-2026/\n    - name: December 2025\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-december-2025/\n    - name: November 2025\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-november-2025/\n    - name: October 2025\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-october-2025/\n    - name: August 2025\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-august-2025/\n    - name: July 2025\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-july-2025/\n    - name: June 2025\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-june-2025/\n    - name: May 2025\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-may-2025/\n    - name: April 2025\n      href: https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-april-2025/\n    \n"
  },
  {
    "path": "articles/azure-developer-cli/ade-integration.md",
    "content": "---\ntitle: Azure Developer CLI support for Azure Deployment Environments\ndescription: Learn how to integrate the Azure Developer CLI with Azure Deployment Environments\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.topic: reference\nms.custom: devx-track-azdevcli\nms.service: azure-dev-cli\n---\n\n# Azure Developer CLI support for Azure Deployment Environments\n\nThe Azure Developer CLI (azd) provides support for [Azure Deployment Environments](/azure/deployment-environments/overview-what-is-azure-deployment-environments). An Azure Deployment Environment (ADE) is a preconfigured collection of Azure resources deployed in predefined subscriptions. Azure governance is applied to those subscriptions based on the type of environment, such as sandbox, testing, staging, or production. With Azure Deployment Environments, your can enforce enterprise security policies and provide a curated set of predefined infrastructure as code (IaC) templates.\n\n## Prerequisites\n\nTo work with Azure Deployment Environments using `azd`, verify you completed the following prerequisites:\n\n* [Installed `azd` locally](/azure/developer/azure-developer-cli/install-azd) or have access to `azd` via Cloud Shell\n* [Created and configured an Azure Deployment Environment](/azure/deployment-environments/quickstart-create-and-configure-devcenter) with a dev center, project, and template catalog\n* [Configured environment types](/azure/deployment-environments/quickstart-create-access-environments) at the dev center level and project level\n* Ensure the developer has Deployment Environments User role on the project\n\n    > [!TIP]\n    > [Understanding key concepts](/azure/deployment-environments/concept-environments-key-concepts) about Azure Deployment Environments is essential for working with them via `azd`.\n\n## Enable Azure Deployment Environment support\n\nYou can configure `azd` to provision and deploy resources to your deployment environments using standard commands such as `azd up` or `azd provision`. To enable support for Azure Deployment Environments, run the following command:\n\n```bash\nazd config set platform.type devcenter\n```\n\nWhen `platform.type` is set to `devcenter`, all `azd` remote environment state and provisioning leverage new dev center components. This configuration also means that the `infra` folder in your local templates is ignored. Instead, `azd` uses one of the infrastructure templates defined in your dev center catalog for resource provisioning.\n\nYou can also disable dev center support via the following command:\n\n```bash\nazd config unset platform\n```\n\n## Work with Azure Deployment Environments\n\nWhen the dev center feature is enabled, the default behavior of some common `azd` commands changes to work with these remote environments. The dev center feature expands on functionality provided by standard `azd` [remote environment support](/azure/developer/azure-developer-cli/remote-environments-support).\n\n### azd init\n\nThe `azd init` command experience in dev center mode shows all the azd compatible ADE templates for selection from your configured catalog. During the init process, after `azd` clones down the template code, the `azure.yaml` file will automatically be updated to include a `platform` section with the selected configuration based on the template that was chosen. The configuration includes the dev center name, catalog, and environment definition.\n\n```bash\nazd init\n```\n\n### azd up\n\nThe `azd up` command packages, provisions, and deploys your application to Azure Deployment Environments. However, the provision stage of the `azd up` command uses the curated infrastructure-as-code templates in your remote dev center, while the deployment stage deploys the source code in your `azd` template. While dev center mode is enabled, `azd` ignores the `infra` folder in your local `azd` template and only provision resources using the dev center templates. The command will also prompt you for any necessary values, such as the Azure Deployment Environment project or environment type.\n\n```bash\nazd up\n```\n\n### azd template list\n\nThe `azd template list` command displays the available infrastructure templates in your dev center catalog, rather than showing templates from the default AZD Awesome gallery. [Catalogs](/azure/deployment-environments/concept-environments-key-concepts#catalogs) provide a set of curated and approved infrastructure-as-code templates your development teams can use to create environments.\n\n```bash\nazd template list\n```\n\n:::image type=\"content\" source=\"media/azure-deployment-environments/azure-dev-center-templates.png\" alt-text=\"A screenshot showing the updated template gallery.\":::\n\n### azd provision\n\nThe `azd provision` command creates new dev center environments. The command prompts you for any missing values, such as the environment type or project. When the command runs, it uses the associated infrastructure template to provision the correct set of Azure resources for that environment. While dev center mode is enabled, `azd` ignores the `infra` folder in your local `azd` template and only provision resources using the dev center templates.\n\n```bash\nazd provision\n```\n\n### azd env list\n\nThe `azd env list` command displays the same list of environments you would see in the developer portal.\n\n```bash\nazd env list\n```\n\n## Tagging resources for Azure Deployment Environments\n\n`azd` provisioning for Azure Deployment Environments relies on curated templates from the dev center catalog. Templates in the catalog may or may not assign tags to provisioned Azure resources for you to associate your app services with in the `azure.yaml` file. If the templates don't assign tags, you can address this issue in one of two ways:\n\n* Work with your dev center catalog administrator to ensure the provisioned Azure resources include tags to associate them with services defined in your `azure.yaml` file.\n* Specify the `resourceName` in your `azure.yaml` file instead of using tags:\n\n    ```yml\n    services:\n        api:\n            project: ./src/api\n            host: containerapp\n            language: js\n            resourceName: sample-api-containerapp\n        web:\n            project: ./src/web\n            host: containerapp\n            language: js\n            resourceName: sample-web-containerapp\n    ```\n\n## Configure dev center settings\n\nYou can define `azd` settings for your dev centers in multiple places. Settings are combined from these locations to create the final set of configurations in the following order of precedence:\n\n1. Environment variables\n2. Azd environment configuration\n3. Project configuration\n4. User configuration\n\n`azd` will automatically prompt you for any configuration values that are missing from these sources. Each of these configuration options is detailed in the following sections.\n\n### Environment variables\n\n`azd` discovers and uses the following environment variables:\n\n* AZURE_DEVCENTER_NAME\n* AZURE_DEVCENTER_PROJECT\n* AZURE_DEVCENTER_CATALOG\n* AZURE_DEVCENTER_ENVIRONMENT_DEFINITION\n* AZURE_DEVCENTER_ENVIRONMENT_TYPE\n* AZURE_DEVCENTER_ENVIRONMENT_USER\n\n### Define configurations\n\nDefine configurations for your dev centers at the `azd` environment scope in `.azure/<env>/config.json` file:\n\n```json\n{\n    \"platform\": {\n        \"config\": {\n            \"catalog\": \"SampleCatalog\",\n            \"environmentDefinition\": \"Todo\",\n            \"environmentType\": \"Dev\",\n            \"name\": \"sample-devcenter\",\n            \"Project\": \"SampleProject\"\n        }\n    }\n}\n```\n\n### Project scope\n\nDefine configurations for your dev centers at the `azd` project scope in the `platform` node of the `azure.yaml` file:\n\n```yaml\nname: todo-nodejs-mongo-aca\nmetadata:\n    template: todo-nodejs-mongo-aca@0.0.1-beta\nplatform:\n    type: devcenter\n    config:\n        catalog: SampleCatalog\n        environmentDefinition: Todo\n        name: sample-devcenter\n        project: SampleProject\nservices:\n    api:\n        project: ./src/api\n        host: containerapp\n        language: js\n    web:\n        project: ./src/web\n        host: containerapp\n        language: js\n```\n\n### User scope\n\nDefine configurations for your dev centers at the user scope in the `~/<user_profile>/.azd/config.json` file:\n\n```json\n{\n    \"platform\": {\n        \"config\": {\n            \"catalog\": \"SampleCatalog\",\n            \"environmentDefinition\": \"Todo\",\n            \"environmentType\": \"Dev\",\n            \"name\": \"sample-devcenter\",\n            \"Project\": \"SampleProject\"\n        }\n    }\n}\n```\n"
  },
  {
    "path": "articles/azure-developer-cli/app-service-slots.md",
    "content": "---\ntitle: Deploy to Azure App Service slots with Azure Developer CLI\ndescription: Learn how to use Azure Developer CLI to deploy to Azure App Service slots and swap slots for staging, promotion, or rollback. Get started today.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/01/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\nai-usage: ai-generated\n---\n\n# Deploy to Azure App Service deployment slots with Azure Developer CLI\n\nAzure Developer CLI (`azd`) supports Azure App Service deployment slots for apps hosted on App Service. You can define slots in your infrastructure, deploy code to a specific slot, and swap slots when you're ready to promote a release.\n\nUse this approach for staging, blue-green deployments, smoke testing, and rollbacks without adding custom deployment scripts.\n\n## Prerequisites\n\n- An `azd` project that deploys a service to Azure App Service.\n- Infrastructure-as-code that defines your App Service resources in Bicep.\n- An App Service plan on Standard (`S1`) tier or higher. Free, Shared, and Basic tiers don't support deployment slots.\n\n## Define a deployment slot in Bicep\n\nDefine your production site as usual, then add a `Microsoft.Web/sites/slots` resource for each slot you want `azd` to target.\n\n```bicep\nresource appServicePlan 'Microsoft.Web/serverfarms@2021-03-01' = {\n  name: 'my-appservice-plan'\n  location: resourceGroup().location\n  sku: {\n    name: 'S1'\n    tier: 'Standard'\n  }\n}\n\nresource webApp 'Microsoft.Web/sites@2021-03-01' = {\n  name: 'my-appservice'\n  location: resourceGroup().location\n  kind: 'app'\n  properties: {\n    serverFarmId: appServicePlan.id\n  }\n}\n\nresource stagingSlot 'Microsoft.Web/sites/slots@2021-03-01' = {\n  name: '${webApp.name}/staging'\n  location: webApp.location\n  properties: {}\n}\n```\n\nIf you use Azure Verified Modules (AVM), define the web app and deployment slot modules in the same deployment and pass the app name to the slot module.\n\n## Deploy to a slot with azd\n\nRun `azd up` or `azd provision` and `azd deploy` as usual.\n\n```bash\nazd up\n```\n\nOn the first deployment, `azd` deploys to the production site and any slots defined in your infrastructure. This first deployment establishes the same baseline across the main app and every slot.\n\nAfter the first deployment, `azd deploy` changes how it selects the deployment target when slots exist. `azd` doesn't continue deploying directly to the production app when slots are available. Instead, you deploy to a slot, validate the release, and then swap it into production.\n\n## How azd selects the deployment target\n\nWhen `azd deploy` runs for an App Service that has deployment slots, it selects the target by checking deployment history on the main app and then evaluating the available slots.\n\nThe behavior works as follows:\n\n- If no previous deployments exist, `azd` deploys to the main app and all slots.\n- If previous deployments exist and no slots exist, `azd` deploys to the main app only.\n- If previous deployments exist and exactly one slot exists, `azd` deploys to that slot only.\n- If previous deployments exist and two or more slots exist, `azd` uses the slot specified by an environment variable or prompts you to choose one.\n\n> [!IMPORTANT]\n> After the first deployment, `azd` doesn't deploy directly to the main App Service app when slots exist. This behavior is intentional and helps prevent accidental direct-to-production deployments. To update production, deploy to a slot and then swap the slot into production (`@main`).\n\n## Select a slot with an environment variable\n\nWhen your service has two or more slots after the first deployment, you can skip the interactive prompt by setting an environment variable for the service you want to deploy.\n\nUse the following format:\n\n`AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME`\n\nBuild the variable name from the service name in `azure.yaml` by using uppercase and replacing hyphens with underscores.\n\nFor example, if your service is named `my-api`, use `AZD_DEPLOY_MY_API_SLOT_NAME`.\n\n```bash\nazd env set AZD_DEPLOY_MY_API_SLOT_NAME staging\nazd deploy my-api\n```\n\nYou can store this value in your `azd` environment by using `azd env set`, or define it directly in your CI system before running `azd deploy`.\n\nIf your service has exactly one slot, `azd` ignores the environment variable because there is only one possible deployment target.\n\nIf your service has two or more slots and the environment variable isn't set, `azd` prompts you to choose a slot.\n\n## CI and noninteractive behavior\n\nWhen you run `azd deploy --no-prompt` or deploy from CI, slot selection behaves differently depending on how many slots are available:\n\n| Slots | Environment variable behavior | Result |\n| --- | --- | --- |\n| `0` | Not applicable. | `azd` deploys to the main app. |\n| `1` | Ignored. | `azd` deploys to the only slot. |\n| `2+` | Required to avoid prompting. | `azd` deploys to the specified slot, or fails if no slot can be selected. |\n\nIf you automate deployments for an App Service that has two or more slots, set `AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME` in the pipeline environment before running `azd deploy`.\n\n## Swap Azure App Service deployment slots\n\nUse the `azure.appservice` extension to swap slots after validation. If the extension isn't already installed, `azd` prompts you to install it the first time you run the command.\n\nRun the interactive experience:\n\n```bash\nazd appservice swap\n```\n\nIf only one nonproduction slot exists, `azd` skips the prompts and swaps directly with production.\n\nFor automation, specify the source and destination slots explicitly. Use `@main` to reference the production slot.\n\n```bash\nazd appservice swap --src staging --dst @main\nazd appservice swap --src @main --dst staging\nazd appservice swap --service myapi --src staging --dst @main\n```\n\nUse these patterns to support common release flows:\n\n- Promote a validated staging deployment to production with `--src staging --dst @main`.\n- Roll back by swapping production back into the staging slot with `--src @main --dst staging`.\n- Target a specific App Service-backed service in a multiservice `azd` project with `--service`.\n\nSwapping is the intended path for updating production after slots are configured. Use `azd deploy` to update a slot, then use `azd appservice swap` to promote that slot into production.\n\n## Recommended deployment slot workflow\n\n1. Define one or more App Service deployment slots in your Bicep templates.\n1. Provision the App Service resources by using `azd provision` or `azd up`.\n1. Let the first deployment establish a baseline on the main app and every slot.\n1. Deploy later application updates to a staging slot by setting `AZD_DEPLOY_<SERVICE_NAME>_SLOT_NAME` when you have two or more slots, or by selecting the slot when prompted.\n1. Validate the staged deployment.\n1. Run `azd appservice swap --src <slot> --dst @main` to promote the release.\n1. If needed, run the reverse swap to roll back.\n\n## Related content\n\n- [Azure Developer CLI commands overview](azd-commands.md)\n- [Azure Developer CLI reference](reference.md)\n- [Set up staging environments in Azure App Service](/azure/app-service/deploy-staging-slots)\n- [Deploy to Azure App Service deployment slots with azd](https://devblogs.microsoft.com/azure-sdk/azd-app-service-slot/)\n- [Azure Developer CLI (azd): One command to swap Azure App Service slots](https://devblogs.microsoft.com/azure-sdk/azd-appservice-swap/)\n"
  },
  {
    "path": "articles/azure-developer-cli/azd-commands.md",
    "content": "---\ntitle: Azure Developer CLI commands overview\ndescription: This article provides a conceptual overview of key concepts for Azure Developer CLI commands\nms.topic: concept-article\nms.date: 03/20/2026\n---\n\n# Azure Developer CLI commands overview\n\nThe Azure Developer CLI (`azd`) is designed to streamline the end-to-end developer workflow on Azure. `azd` provides high-level commands that act as abstractions to simplify common developer tasks such as project initialization, infrastructure provisioning, code deployment, and monitoring. `azd` commands are available in the terminal, an integrated development environment (IDE), or through CI/CD (continuous integration/continuous deployment) pipelines. In this article, you'll learn about the following:\n\n- Essential `azd` command concepts\n- How `azd` commands compare to other tools\n- The relationship between `azd` commands and templates\n- Common `azd` commands and which development tasks they accelerate\n\n> [!NOTE]\n> Visit the [Deploy an Azure Developer CLI template](/azure/developer/azure-developer-cli/get-started) quickstart to explore a sample `azd` command workflow in more detail.\n\n## Compare Azure Developer CLI commands\n\nThe emphasis on high-level development stages differentiates `azd` commands from other command-line tools such as the Azure CLI or Azure PowerShell. Whereas those tools provide numerous commands for granular control over individual Azure resources and configurations, `azd` provides fewer, broader commands to automate higher-level development tasks such as provisioning multiple resources or deploying multiple services at once.\n\nThe following table highlights the differences between a sample `azd` command and other Azure command-line tools. Note that the `azd provision` command performs numerous tasks at once, and does not have a direct equivalent in these other tools. Many Azure CLI or PowerShell commands would be required to accomplish the same task.\n\n| Tool                | Sample Command                                                                 | Outcome                                                                                   |\n|---------------------|------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|\n| Azure Developer CLI | `azd provision`                                                               | Provisions multiple Azure resources required for an app based on project resources and configurations, such as an Azure resource group, an Azure App Service web app and app service plan, an Azure Storage account, and an Azure Key Vault. |\n| Azure CLI           | `az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name myWebApp` | Provisions a new web app in the specified resource group and app service plan.            |\n| Azure PowerShell    | `New-AzWebApp -ResourceGroupName \"myResourceGroup\" -Name \"myWebApp\" -AppServicePlan \"myAppServicePlan\"` | Provisions a new web app in the specified resource group and app service plan.            |\n\n## Azure Developer CLI commands and templates\n\n`azd` commands are able to perform broader workflow tasks due in-part to their integration with the `azd` template system. [Azure Developer CLI templates](/azure/developer/azure-developer-cli/azd-templates) are code projects that adhere to `azd` structural conventions and include sample application code, infrastructure files, and configuration files. Most `azd` templates include the following:\n\n- **`.azure` folder** - Contains essential Azure configurations and environment variables, such as the location to deploy resources or other subscription information.\n- **`infra` folder** - Contains all of the Bicep or Terraform infrastructure-as-code files for the `azd` template.\n- **`src` folder** - Contains all of the deployable app source code.\n- **`azure.yaml` file** - A configuration file that defines one or more services in your project and maps them to Azure resources defined in the `infra` folder for deployment.\n\n:::image type=\"content\" source=\"media/make-azd-compatible/azd-template-structure.png\" alt-text=\"A screenshot showing an Azure Developer CLI template structure.\":::\n\nWithout `azd` commands, these templates are just standard code repositories. Essentially, `azd` templates serve as foundational blueprints, while CLI commands act as the engine driving deployment, management, and monitoring of your applications. `azd` commands use the assets in these templates to perform various tasks.\n\nUsing the preceding template as an example:\n\n- The `azd provision` command creates resources in Azure using the infrastructure-as-code files in the `infra` folder of a template.\n- The `azd deploy` command deploys an app or service defined in the `src` folder.\n\n> [!NOTE]\n> `azd` can also create and manage some Azure resources without the need to define infrastructure-as-code templates manually using the new [`azd compose`](/azure/developer/azure-developer-cli/azd-compose) feature, which is currently in alpha.\n\n## Explore common commands\n\nThe following sections provide an overview of some of the most common `azd` commands to provide examples of working with templates and different development tasks. \n\n> [!NOTE]\n> For a complete list of `azd` commands and their parameters, visit the [Azure Developer CLI reference](/azure/developer/azure-developer-cli/reference) page.\n\n### Initialize and run a template\n\n- **`azd init`**: Initializes an existing `azd` template or creates and initializes a new template. This command essentially sets up the necessary files and directories to start working with `azd`.\n- **`azd up`**: A convenience command to provision, package, and deploy all of your app resources in one command. This command is the equivalent of running `azd provision`, `azd package`, and `azd deploy` individually.\n\n### Infrastructure Provisioning\n\n- **`azd provision`**: Provisions the required Azure resources such as Azure Container App instances or Azure Storage accounts based on infrastructure-as-code templates or resources defined in `azure.yaml`.\n\n### Code Deployment\n\n- **`azd package`**: Packages the application's code to be deployed to Azure.\n- **`azd deploy`**: Deploys your application code to the resources created by the `azd provision` command.\n\n### Monitoring and Management\n\n- **`azd monitor`**: Provides insights into the health and performance of the deployed application\n\n### CI/CD Pipeline Configuration\n\n- **`azd pipeline config`**: Configures a CI/CD pipeline for the project. This command sets up continuous integration and continuous deployment pipelines to automate the build and deployment processes.\n\n### Environment Management\n\n- **`azd env list`**: Lists all the different environments (e.g., development, staging, production) that have been set up for the template.\n- **`azd env new`**: Creates a new environment with its own configuration and resources, allowing you to manage multiple environments for different stages of development.\n\n### Resource Cleanup\n\n- **`azd down`**: Deletes the Azure resources created by the template to clean up your environment and avoid unnecessary costs.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [What are Azure Developer CLI templates?](./azd-templates.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/azd-compose.md",
    "content": "---\ntitle: Azure Developer CLI compose feature overview\ndescription: Learn about the Azure Developer CLI compose feature\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/21/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, devx-track-bicep\n---\n\n# Get started with the Azure Developer CLI compose feature\n\nThe Azure Developer CLI (`azd`) composability (compose) feature enables you to progressively compose the Azure resources required for your app without manually writing Bicep code. Compose also uses [Azure Verified Modules (AVM)](https://aka.ms/avm) when possible, providing recommended practices using building blocks for Azure.\n\n## What is the compose feature?\n\nThe `azd` compose feature offers a new way to get started with `azd`. Before the compose feature, developers had two primary options to configure the Azure resources to provision and deploy an application:\n\n- Start with a [prebuilt template](/azure/developer/azure-developer-cli/azd-templates), which defines resources and services to be provisioned and deployed on Azure, and then customize. Browse templates in the [AI template gallery](https://azure.github.io/ai-app-templates) or the [community gallery](https://azure.github.io/awesome-azd/).\n- Start from an existing codebase by following the instructions in the [simplified init flow](/azure/developer/azure-developer-cli/start-with-app-code).\n\nAny further customization required the user to manually modify the Bicep files—until the introduction of the compose feature.\n\n## Project compatability with compose\n\nThe `azd` compose feature is designed for projects that don't already use infrastructure as code to manage Azure resources. As a result, compose does *not* support the following scenarios:\n\n- Projects that already have an `infra` folder for Azure resource creation (such as existing templates).\n- .NET Aspire projects, which use the Aspire app host file to manage resources.\n\n### Streamline resource creation with compose\n\nThe `azd` compose feature introduces a third option to add Azure resources to your apps. Developers use the `azd add` command to instruct `azd` to compose new Azure resources and update template configurations using minimal prompt workflows. This feature is useful for developers who want to avoid writing Bicep or using an existing template.\n\nRun the `azd add` command to start the compose workflow and add a new resource:\n\n```bash\nazd add\n```\n\nThis command begins a prompt-based workflow that allows you to select a new resource to create for your app:\n\n```output\n? What would you like to add?  [Use arrows to move, type to filter]\n> AI\n  Database\n  Host service\n  Key Vault\n  Messaging\n  Storage account\n  ~Existing resource\n```\n\nWhen you're finished adding resources with `azd add`, run `azd up` or `azd provision` to create the resources in Azure. `azd` manages resource creation internally until you [Generate Bicep files for the resources](compose-generate.md) for further customization.\n\nVisit the [Build a minimal template using the compose feature](compose-quickstart.md) article for a full walkthrough of this feature.\n\n### Services supported by the compose feature\n\nThe `azd compose` feature supports adding resources for the following Azure services:\n\n- AI\n  - Foundry Tools models and Microsoft Foundry\n  - Azure OpenAI with Microsoft Entra ID authentication\n  - Azure AI Search\n- Database\n  - Azure Cosmos DB\n  - Azure Cosmos DB for MongoDB\n  - Azure Cosmos DB for PostgreSQL\n  - Azure Cache for Redis\n  - Azure Database for MySQL\n- Host Service\n  - Azure Container Apps\n  - Azure App Service\n- Key Vault\n  - Azure Key Vault\n- Messaging\n  - Azure Service Bus\n  - Azure Event Hubs\n- Storage Account\n  - Azure Blob Storage\n\n ## Language Support\n - App Service:\n   - Python\n   - TypeScript\n   - JavaScript\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Compose quickstart](compose-quickstart.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/azd-config.md",
    "content": "---\ntitle: Explore azd config functionality\ndescription: Learn how to use the azd config command and related functionality\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, devx-track-bicep\n---\n\n# Explore Azure Developer CLI configuration\n\nThe Azure Developer CLI (`azd`) allows you to manage `azd` configurations using a set of `azd config` commands. These configuration settings include useful defaults such as your Azure subscription and location, as well as settings used by other `azd` commands or features. You can also get and set your own custom values and use them in scripts or custom functionality.\n\nIn this article, you learn:\n\n- Key concepts about Azure Developer CLI configuration\n- How to work with `azd config` commands\n- How `azd config` integrates with other `azd` features\n\n## Explore the Azure Developer CLI config file\n\nWhen you first install the Azure Developer CLI, a file named `config.json` is added in the following location:\n\n- `$HOME/.azd` on Linux and macOS\n- `%USERPROFILE%\\.azd` on Windows\n\n> [!TIP]\n> The configuration directory can be overridden by specifying a path in the `AZD_CONFIG_DIR` environment variable.\n\nThe settings in this file manage functionality such as:\n\n- The default Azure subscription or location to use when you provision or deploy resources\n- Which alpha features are enabled\n- Which template source locations are configured\n- Custom values set by the user for scripts or other purposes\n\nBy default, the `config.json` file contains only a few configurations for the default `azd` template source locations. As you use various features of the Azure Developer CLI, some values are populated in `config.json` automatically. For example, the first time you run the `azd up` command, the subscription and location you select for provisioning and deployment are stored in the `defaults` section of the file.\n\nA simple `config.json` file might resemble the following:\n\n```json\n{\n  \"defaults\": {\n    \"location\": \"eastus2\",\n    \"subscription\": \"your-subscription-id\"\n  },\n  \"template\": {\n    \"sources\": {\n      \"awesome-azd\": {\n        \"key\": \"awesome-azd\",\n        \"location\": \"https://aka.ms/awesome-azd/templates.json\",\n        \"name\": \"Awesome AZD\",\n        \"type\": \"awesome-azd\"\n      },\n      \"default\": {\n        \"key\": \"default\",\n        \"name\": \"default\"\n      }\n    }\n  }\n}\n```\n\n## Work with configuration commands\n\nThe Azure Developer CLI provides a set of commands to manage the settings in the `config.json` file manually:\n\n- `azd config get`: Get a configuration value.\n- `azd config list-alpha`: Display the list of available features in alpha stage.\n- `azd config reset`: Reset configuration to default.\n- `azd config set`: Set a configuration.\n- `azd config show`: Show all of the configuration values.\n- `azd config unset`: Unset a configuration.\n\nThese commands are explored more in the following sections. You can also visit the [Azure Developer CLI commands](/azure/developer/azure-developer-cli/reference) reference page to learn more about `azd` commands.\n\n### Display configurations\n\nView the current contents of the entire `config.json` file at any time by running the `azd config show` command:\n\n```azdeveloper\nazd config show\n```\n\nSample output:\n\n```json\n{\n  \"defaults\": {\n    \"location\": \"eastus2\",\n    \"subscription\": \"your-subscription-id\"\n  },\n  \"template\": {\n    \"sources\": {\n      \"awesome-azd\": {\n        \"key\": \"awesome-azd\",\n        \"location\": \"https://aka.ms/awesome-azd/templates.json\",\n        \"name\": \"Awesome AZD\",\n        \"type\": \"awesome-azd\"\n      },\n      \"default\": {\n        \"key\": \"default\",\n        \"name\": \"default\"\n      }\n    }\n  }\n}\n```\n\nDisplay a specific configuration value using the `azd config get <key>` command:\n\n```azdeveloper\nazd config get defaults\n```\n\nSample output:\n\n```json\n\"defaults\": {\n    \"location\": \"eastus2\",\n    \"subscription\": \"your-subscription-id\"\n}\n```\n\nEnabling or disabling alpha features is a common configuration task, so `azd` also includes a convenience command to view the current status of alpha features:\n\n```azdeveloper\nazd config list-alpha\n```\n\nSample output:\n\n```output\nName: aca.persistDomains\nDescription: Do not change custom domains when deploying Azure Container Apps.\nStatus: Off\n\nName: aca.persistIngressSessionAffinity\nDescription: Do not change Ingress Session Affinity when deploying Azure Container Apps.\nStatus: Off\n\nName: aks.helm\nDescription: Enable Helm support for AKS deployments.\nStatus: On\n\nName: aks.kustomize\nDescription: Enable Kustomize support for AKS deployments.\nStatus: Off\n\nName: azd.operations\nDescription: Extends provisioning providers with azd operations.\nStatus: Off\n\nName: compose\nDescription: Enable simplified app-centric modeling. Run `azd add` to add Azure components to your project.\nStatus: On\n\nName: deployment.stacks\nDescription: Enables Azure deployment stacks for ARM/Bicep based deployments.\nStatus: Off\n\nName: infraSynth\nDescription: Enable the `infra synth` command to write generated infrastructure to disk.\nStatus: Off\n```\n\n### Get and set configurations\n\nYou can get, set, or unset values in the `config.json` file using `azd config` commands. Some specific configurations are used by other `azd` features and commands, such as when enabling alpha features or setting template sources, but you can also set your own custom values.\n\n#### Manage configurations used by `azd`\n\nUse the `azd config set <key> <value>` command to add a configuration setting to the `config.json` file.\n\nFor example, to enable the `azd compose` alpha feature:\n\n```azdeveloper\nazd config set alpha.compose on\n```\n\n> [!NOTE]\n> Use `.` syntax to traverse JSON object structures when you get and set configuration values, such as in the case of `alpha.compose`.\n\nVerify the setting was enabled using the `azd config get <key>` command, such as the following:\n\n```azdeveloper\nazd config get alpha.compose\n```\n\nSample output:\n\n```json\n\"on\"\n```\n\nIn this scenario, you can also run `azd config get alpha` to view the entire JSON object in the `config.json` file:\n\n```azdeveloper\nazd config get alpha\n```\n\nSample output:\n\n```json\n{\n  \"compose\": \"on\"\n}\n```\n\n### Manage custom configurations\n\nYou can also set custom configuration values to use in `azd` hooks and customer scripts. These configuration values provide an alternative to using environment variables.\n\nTo set a custom configuration value:\n\n```azdeveloper\nazd config get customVal hello-world\n```\n\nGet the custom configuration value:\n\n```azdeveloper\nazd config get customVal\n```\n\nSample output:\n\n```json\nhello-world\n```\n\n### Reset configurations\n\nYou can reset the Azure Developer CLI `config.json` file back to its defaults using the `azd config reset` command, which deletes the contents of the file:\n\n```azdeveloper\nazd config reset\n```\n\nWhen you run `azd config show` after a reset, you will simply see an empty object:\n\n```json\n{}\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Create Azure Developer CLI templates overview](/azure/developer/azure-developer-cli/make-azd-compatible)\n"
  },
  {
    "path": "articles/azure-developer-cli/azd-copilot-integration.md",
    "content": "---\ntitle: Use GitHub Copilot with Azure Developer CLI\ndescription: Learn how to use GitHub Copilot with the Azure Developer CLI (azd) for AI-assisted project scaffolding and intelligent deployment error troubleshooting.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/20/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\nai-usage: ai-generated\n---\n\n# Use GitHub Copilot with Azure Developer CLI\n\nThe Azure Developer CLI (`azd`) integrates with GitHub Copilot to provide AI-assisted project scaffolding during `azd init` and intelligent error troubleshooting when commands fail.\n\nWhen you run `azd init`, `azd` presents a **Set up with GitHub Copilot (Preview)** option. If selected, Copilot analyzes your codebase and generates `azure.yaml`, infrastructure templates, and deployment configuration based on your code's language, framework, and dependencies. Copilot-powered init supports both new and existing projects.\n\nWhen an `azd` command fails, `azd` can use Copilot to analyze the error, suggest a fix, and optionally apply it automatically.\n\n## Prerequisites\n\nTo use these features, you need:\n\n- **azd 1.23.11 or later** — Run `azd version` to check, or `azd update` to get the latest.\n- **GitHub Copilot access** — An active GitHub Copilot subscription (Individual, Business, or Enterprise).\n- **GitHub CLI (`gh`)** — `azd` automatically checks and prompts for login if needed.\n- **GitHub CLI (`gh`)** — [Install the GitHub CLI](https://cli.github.com/). `azd` automatically checks for `gh` authentication and prompts for login if needed.\n## Scaffold a project with Copilot and `azd init`\n\nThe following example demonstrates how to use Copilot-powered init to scaffold an Express API project with a PostgreSQL dependency.\n\nBefore making any changes, the flow runs preflight checks. It verifies your git working directory is clean so no uncommitted work is at risk. It also prompts for Model Context Protocol (MCP) server tool consent upfront so you can review what tools Copilot accesses.\n\n1. Run `azd init` and select **Set up with GitHub Copilot (Preview)**:\n\n    ```bash\n    azd init\n    # Select: \"Set up with GitHub Copilot (Preview)\"\n    ```\n\n1. Copilot examines your project structure and detects the Express framework and PostgreSQL dependency from your project files.\n1. Copilot determines the appropriate `host` type (`containerapp`) and `language` (`js`) for the service.\n1. Copilot generates an `azure.yaml` with the correct service configuration.\n1. Copilot creates Bicep modules for Azure Container Apps and Azure Database for PostgreSQL based on the detected dependencies.\n1. Review and approve the generated files before they're written to disk.\n\nAfter scaffolding completes, provision and deploy the project by running `azd up` as usual:\n\n```bash\nazd up\n```\n\nFor more information about the `azd up` workflow, see [Explore the azd up workflow](azd-up-workflow.md).\n\n## AI-assisted error troubleshooting\n\nWhen an `azd` command fails, `azd` can use Copilot to analyze the error and suggest a fix. Copilot uses your project configuration and the error details to provide context-specific troubleshooting directly in your terminal. You can choose from several interactive options, configure a default behavior, or let Copilot auto-fix and retry.\n\n### Copilot troubleshooting options\n\nWhen a command fails, `azd` displays an interactive prompt with four options. Use the arrow keys to select an option and press **Enter**:\n\n- **Explain** — Get a plain-language explanation of what went wrong.\n- **Guidance** — Receive step-by-step instructions to fix the issue.\n- **Diagnose and Guide** — Get troubleshooting steps on what happened, why the error happened, and how to fix it. Let Copilot apply a fix (with your approval), then optionally retry the failed command.\n- **Skip** — Dismiss and handle the error manually.\n\n```text\n? How would you like to proceed?  [Use arrows to move, type to filter]\n> Explain\n  Guidance\n  Diagnose and Guide\n  Skip\n```\n\nCopilot uses your project configuration, the command that failed, and the error details to provide suggestions specific to your situation.\n\n### Set a default error handling behavior\n\nIf you prefer to use the same option consistently, set a default with `azd config` to skip the interactive prompt:\n\n```bash\nazd config set copilot.errorHandling.category troubleshoot\n```\n\nAvailable values for `copilot.errorHandling.category`:\n\n| Value | Behavior |\n| --- | --- |\n| `explain` | Automatically get a plain-language explanation. |\n| `guidance` | Automatically get step-by-step fix instructions. |\n| `troubleshoot` | Automatically diagnose and guide. |\n| `fix` | Automatically apply a fix. |\n| `skip` | Always skip Copilot troubleshooting. |\n\nYou can also enable auto-fix and retry, so Copilot applies the fix and reruns the failed command automatically:\n\n```bash\nazd config set copilot.errorHandling.fix allow\n```\n\nTo reset to the default interactive prompt, unset the config:\n\n```bash\nazd config unset copilot.errorHandling.category\n```\n\n### Common Azure deployment errors where Copilot helps\n\nThe following examples show common Azure deployment errors and how Copilot-assisted troubleshooting helps you resolve them.\n\n#### `MissingSubscriptionRegistration` — resource provider not registered\n\nA first-time deployment to a subscription often fails with:\n\n```\nERROR: deployment failed: MissingSubscriptionRegistration:\nThe subscription is not registered to use namespace 'Microsoft.App'.\n```\n\nAzure requires resource providers to be registered before you can create certain resource types. If this Container App deployment is the first deployment in a given subscription, `Microsoft.App` isn't registered yet. The **Troubleshoot** option can register the provider and rerun the deployment automatically.\n\n#### `SkuNotAvailable` / `OperationNotAllowed` — SKU or quota limits\n\nYou might encounter a SKU availability error:\n\n```\nERROR: deployment failed: SkuNotAvailable:\nThe requested VM size 'Standard_D2s_v3' is not available in location 'westus'.\n```\n\nOr a quota variant:\n\n```\nERROR: deployment failed: OperationNotAllowed:\nOperation results in exceeding quota limits of Core.\nMaximum allowed: 4, Current in use: 4, Additional requested: 2.\n```\n\nThese errors are common when a region is capacity-constrained or your subscription hits its vCPU limit. Copilot's **Explain** option clarifies which SKU or quota is blocked, and **Guidance** suggests alternative regions or Virtual Machine (VM) sizes that are available or shows you how to request a quota increase.\n\n#### `StorageAccountAlreadyTaken` — globally unique name collision\n\n```\nERROR: deployment failed: StorageAccountAlreadyTaken:\nThe storage account named 'myappstorage' is already taken.\n```\n\nStorage account names must be unique across all of Azure. Copilot suggests updating your Bicep parameter or `azure.yaml` environment variable with a unique name, often by appending your environment name or a random suffix, and then retrying the deployment.\n\n## Related content\n\n- [Install or update azd](install-azd.md)\n- [Explore the azd init workflow](azd-init-workflow.md)\n- [Manage config settings](azd-config.md)\n- [Troubleshoot the Azure Developer CLI](troubleshoot.md)\n- [Sign up for azd user research](https://aka.ms/azd-user-research-signup)\n\n[!INCLUDE [request-help](includes/request-help.md)]\n"
  },
  {
    "path": "articles/azure-developer-cli/azd-extensibility.md",
    "content": "---\ntitle: Customize your Azure Developer CLI workflows using command and event hooks\ndescription: Explores how to use Azure Developer CLI hooks to customize deployment pipelines\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.topic: reference\nms.custom: devx-track-azdevcli\nms.service: azure-dev-cli\n---\n\n# Customize your Azure Developer CLI workflows using command and event hooks\n\nHooks are `azd` extension points that automatically execute custom scripts before and after `azd` commands and service lifecycle events. Hooks follow a naming convention using *pre* and *post* prefixes on the matching `azd` command or service event name.\n\nFor example, you may want to run a custom script in the following scenarios:\n\n* Use the *prerestore* hook to customize dependency management.\n* Use the *predeploy* hook to verify external dependencies or custom configurations are in place before deploying your app.\n* Use the *postup* hook at the end of a workflow or pipeline to perform custom cleanup or logging.\n\n## Available hooks\n\nThe following `azd` command hooks are available:\n\n* `prerestore` and `postrestore`: Run before and after package dependencies are restored.\n* `preprovision` and `postprovision`: Run before and after Azure resources are created.\n* `prepackage` and `postpackage`: Run before and after the application is packaged.\n* `predeploy` and `postdeploy`: Run before and after the application code is deployed to Azure.\n* `prepublish` and `postpublish`: Run before and after the application is published.\n* `preup` and `postup`: Run before and after the combined deployment pipeline. `Up` is a shorthand command that runs `restore`, `provision`, and `deploy` sequentially.\n* `predown` and `postdown`: Run before and after the resources are removed.\n\nThe following service lifecycle event hooks are available:\n\n* `prerestore` and `postrestore`: Run before and after the service packages and dependencies are restored.\n* `prebuild` and `postbuild`: Run before and after the service source code or container is built.\n* `prepackage` and `postpackage`: Run before and after the app is packaged for deployment.\n* `predeploy` and `postdeploy`: Run before and after the service code is deployed to Azure.\n* `prepublish` and `postpublish`: Run before and after the service is published.\n\n## Hook configuration\n\nHooks are registered in your `azure.yaml` file at the root or within a specific service configuration. All types of hooks support the following configuration options:\n\n* `shell`: `sh` | `pwsh`\n  * *Note*: PowerShell 7 is required for `pwsh`.\n* `run`: Define an inline script or a path to a file.\n* `continueOnError`: When set will continue to execute even after a script error occurred during a command hook (default false).\n* `interactive`: When set will bind the running script to the console `stdin`, `stdout` & `stderr` (default false).\n* `windows`: Specifies that the nested configurations will only apply on windows OS. If this configuration option is excluded, the hook executes on all platforms.\n* `posix`: Specifies that the nested configurations will only apply to POSIX based OSes (Linux & MaxOS). If this configuration option is excluded, the hook executes on all platforms.\n\n## Hook examples\n\nThe following examples demonstrate different types of hook registrations and configurations.\n\n### Root command registration\n\nHooks can be configured to run for specific `azd` commands at the root of your `azure.yaml` file.\n\nThe project directory (where the `azure.yaml` file is located) is the default current working directory (`cwd`) for command hooks.\n\n```yml\nname: todo-nodejs-mongo\nmetadata:\n  template: todo-nodejs-mongo@0.0.1-beta\nhooks:\n  prerestore: # Example of an inline script. (shell is required for inline scripts)\n    shell: sh\n    run: echo 'Hello'\n  preprovision: # Example of external script (Relative path from project root)\n    run: ./hooks/preprovision.sh\nservices:\n  web:\n    project: ./src/web\n    dist: build\n    language: js\n    host: appservice\n  api:\n    project: ./src/api\n    language: js\n    host: appservice\n```\n\n### Service registration\n\nHooks can also be configured to run only for specific services defined in your `.yaml` file.\n\nThe service directory (same path as defined in the `project` property of the service configuration in the `azure.yaml` file) is the default `cwd` for service hooks.\n\n```yml\nname: todo-nodejs-mongo\nmetadata:\n  template: todo-nodejs-mongo@0.0.1-beta\nservices:\n  web:\n    project: ./src/web\n    dist: build\n    language: js\n    host: appservice\n  api:\n    project: ./src/api\n    language: js\n    host: appservice\n    hooks:\n      prerestore: # Example of an inline script. (shell is required for inline scripts)\n        shell: sh\n        run: echo 'Restoring API service...'\n      prepackage: # Example of external script (Relative path from service path)\n        run: ./hooks/prepackage.sh\n```\n\n### OS specific hooks\n\nOptionally, hooks can also be configured to run either on Windows or Posix (Linux & MaxOS). By default, if the Windows or Posix configurations are excluded the hook executes on all platforms.\n\n```yml\nname: todo-nodejs-mongo\nmetadata:\n  template: todo-nodejs-mongo@0.0.1-beta\nhooks:\n  prerestore: \n    posix: # Only runs on Posix environments\n      shell: sh\n      run: echo 'Hello'\n   windows: # Only runs on Windows environments\n     shell: pwsh\n     run: Write-Host \"Hello\"\nservices:\n  web:\n    project: ./src/web\n    dist: build\n    language: js\n    host: appservice\n  api:\n    project: ./src/api\n    language: js\n    host: appservice\n```\n\n### Multiple hooks per event\n\nYou can configure multiple hooks per event across different scopes, such as the root registration level or for a specific service:\n\n```yml\nname: example-project\nservices:\n    api:\n        project: src/api\n        host: containerapp\n        language: ts\n        hooks:\n            postprovision:\n                - shell: sh\n                  run: scripts/postprovision1.sh\n                - shell: sh\n                  run: scripts/postprovision2.sh\nhooks:\n    postprovision:\n        - shell: sh\n          run: scripts/postprovision1.sh\n        - shell: sh\n          run: scripts/postprovision2.sh\n```\n\n## Run hooks independently\n\nThe `azd hooks run` command allows you to execute hooks independently of their normal trigger events. This is useful for testing and debugging hooks without going through the entire workflow.\n\n```bash\nazd hooks run <hook-name>\n```\n\nReplace `<hook-name>` with the name of the hook you want to run (e.g., `preprovision`, `postdeploy`).\n\n### Advanced options\n\n```bash\n# Run a specific service hook\nazd hooks run postdeploy --service api\n\n# Force hooks to run for a specific platform\nazd hooks run preprovision --platform windows\n\n# Run hooks in a specific environment\nazd hooks run postup -e staging\n\n# Run hooks with all options combined\nazd hooks run predeploy --service frontend --platform posix -e production --interactive\n```\n\n## Configure interactive mode\n\nHooks run in interactive mode by default. Interactive hooks mode allows you to run hook scripts with direct console interaction, making it easier to debug, monitor, and interact with your hooks in real-time. You can explicitly set the `interactive` property in your hook configuration if you want to disable interactive mode for a specific hook:\n\n```yaml\nhooks:\n  postprovision:\n    shell: sh\n    run: ./scripts/setup-database.sh\n    interactive: false # Default is true\n```\n\nFor service-specific hooks:\n\n```yaml\nservices:\n  api:\n    project: ./src/api\n    language: js\n    host: appservice\n    hooks:\n      postdeploy:\n        shell: sh\n        run: ./scripts/post-deploy-verification.sh\n        interactive: false  # Override the default interactive mode\n```\n\n### Use environment variables with hooks\n\nHooks can get and set environment variables in the `.env` file using the `azd env get-values` and `azd set <key> <value>` commands. Hooks can also retrieve environment variables from your local environment using the `${YOUR_ENVIRONMENT VARIABLE}` syntax. `azd` automatically sets certain environment variables in the `.env` file when commands are run, such as `AZURE_ENV_NAME` and `AZURE_LOCATION`. Output parameters from the `main.bicep` file are also set in the `.env` file. The [manage environment variables](/azure/developer/azure-developer-cli/manage-environment-variables) page includes more information about environment variable workflows.\n\nHooks can get and set environment variables inline or through referenced scripts, as demonstrated in the following example:\n\n```yml\nname: azure-search-openai-demo\nmetadata:\n  template: azure-search-openai-demo@0.0.2-beta\nservices:\n  backend:\n    project: ./app/backend\n    language: py\n    host: appservice\nhooks:\n  postprovision:\n    windows: # Run referenced script that uses environment variables (script shown below)\n      shell: pwsh\n      run: ./scripts/prepdocs.ps1\n      interactive: true\n      continueOnError: false\n    posix:\n      shell: sh\n      run: ./scripts/prepdocs.sh\n      interactive: true\n      continueOnError: false\n  postdeploy: # Pull environment variable inline from local device and set in .env file\n      shell: sh\n      run: azd env set REACT_APP_WEB_BASE_URL ${SERVICE_WEB_ENDPOINT_URL}\n```\n\nThe referenced: `prepdocs.sh` script:\n\n```bash\necho \"Loading azd .env file from current environment\"\n\n# Use the `get-values` azd command to retrieve environment variables from the `.env` file\nwhile IFS='=' read -r key value; do\n    value=$(echo \"$value\" | sed 's/^\"//' | sed 's/\"$//')\n    export \"$key=$value\"\ndone <<EOF\n$(azd env get-values) \nEOF\n\necho 'Creating python virtual environment \"scripts/.venv\"'\npython3 -m venv scripts/.venv\n\necho 'Installing dependencies from \"requirements.txt\" into virtual environment'\n./scripts/.venv/bin/python -m pip install -r scripts/requirements.txt\n\necho 'Running \"prepdocs.py\"'\n./scripts/.venv/bin/python ./scripts/prepdocs.py './data/*' \n    --storageaccount \"$AZURE_STORAGE_ACCOUNT\"\n    --container \"$AZURE_STORAGE_CONTAINER\"\n    --searchservice \"$AZURE_SEARCH_SERVICE\"\n    --openaiservice \"$AZURE_OPENAI_SERVICE\"\n    --openaideployment \"$AZURE_OPENAI_EMB_DEPLOYMENT\"\n    --index \"$AZURE_SEARCH_INDEX\"\n    --formrecognizerservice \"$AZURE_FORMRECOGNIZER_SERVICE\"\n    --tenantid \"$AZURE_TENANT_ID\" -v\n```\n\n[!INCLUDE [request-help](includes/request-help.md)]\n"
  },
  {
    "path": "articles/azure-developer-cli/azd-init-workflow.md",
    "content": "---\ntitle: Explore the Azure Developer CLI init workflow\ndescription: Learn about the stages of the Azure Developer CLI project initialization process.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/15/2025\nms.service: azure-dev-cli\nms.topic: concept-article\nms.custom: devx-track-azdevcli\n---\n\n# Explore the Azure Developer CLI initialization workflows\n\nThe Azure Developer CLI (`azd`) provides a set of commands to streamline developing, provisioning, and deploying app on Azure. The `azd init` command helps you set up new or existing projects by generating the files and configurations needed to work with `azd`. This article explains the different initialization workflows available and how to select the best option for your development scenario.\n\n## Initialization workflows\n\nThe `azd init` command supports several workflows to prepare your app to work with `azd`:\n\n- **Scan current directory**: Analyzes an existing app codebase to generate appropriate `azd` configuration files and resources.\n- **Select a template**: Clones and initializes a template from an `azd` [template gallery](azd-template-galleries.md).\n- **Create a minimal project**: Initializes a basic `azure.yaml` file as a starting point for building your own `azd` template from scratch.\n\nChoose the approach that best fits your project. All of these flows are outlined in more detail in the [Create templates overview](make-azd-compatible.md) and related articles. The following sections provide a conceptual overview of each flow.\n\n### Scan current directory\n\nUse this workflow when you have an existing app codebase and want to prepare it for deployment to Azure using `azd`.\n\n1. Navigate to your project's root directory.\n2. Run the `azd init` command:\n\n    ```bash\n    azd init\n    ```\n\n3. Select **Scan current directory**. `azd` will:\n    - Scan your directory to determine the language or framework your app uses.\n    - Select an appropriate hosting platform, such as Azure Container Apps.\n    - Prompt you to add or remove discovered services if needed.\n\n    ```output\n    ? How do you want to initialize your app? Scan current directory\n\n      (✓) Done: Scanning app code in current directory\n    \n    Detected services:\n    \n      .NET\n      Detected in: src\n    \n    azd will generate the files necessary to host your app on Azure using Azure Container Apps.\n    \n    ? Select an option  [Use arrows to move, type to filter]\n    > Confirm and continue initializing my app\n      Remove a detected service\n      Add an undetected service\n    ```\n\n4. Select **Confirm and continue initializing my app** to complete the workflow. `azd` creates the following in your app directory:\n    - An `azure.yaml` file that defines your app services and maps them to hosting resources.\n    - A `.azure` folder to hold configuration settings such as your environment name.\n    - A `.gitignore` file configured for your app language and hosting platform.\n\n5. Optionally, run `azd up` to create the Azure Container Apps resources and deploy your app.\n\nYour app is now structured as an `azd` template you can continue to develop and expand with more Azure resources and services.\n\n### Select a template\n\nThis workflow lets you start with a prebuilt `azd` template that usually includes both application code and the necessary Azure infrastructure definitions.\n\n1. Run the `azd init` command:\n\n    ```bash\n    azd init\n    ```\n\n    > [!NOTE]\n    > You can also run `azd init` with the `--template` parameter to directly initialize a template by name and skip the workflow selection.\n\n2. Choose **Select a template**. `azd` displays a list of available templates from your configured template sources.\n\n    ```output\n    ? How do you want to initialize your app? Select a template\n    ? Select a project template:  [Use arrows to move, type to filter]\n    > Deploy Phoenix to Azure\n      (Arize-ai/phoenix-on-azure)\n    \n      API Center Reference Sample\n      (Azure-Samples/APICenter-Reference)\n    \n      Event Driven Java Application with Azure Service Bus on Azure Spring Apps\n      (Azure-Samples/ASA-Samples-Event-Driven-Application)\n    \n      Static React Web App with Java API and PostgreSQL\n      (Azure-Samples/ASA-Samples-Web-Application)\n    ```\n\n3. Type to filter the results and search for the `Hello AZD` template. Press Enter to clone and initialize the template.\n\n4. Optionally, run `azd up` to provision and deploy the template resources to Azure.\n\nYou can also use the initialized template as a starting point for further development.\n\n### Create a minimal project\n\nFor advanced users who want to start with a minimal setup and customize everything manually, this option provides just the essential configuration.\n\n1. Run the `azd init` command with the `--minimal` flag:\n\n   ```bash\n   azd init --minimal\n   ```\n\n2. When prompted, enter a name for your `azd` template and press Enter.\n\n    ```output\n    ? How do you want to initialize your app? Create a minimal project\n    ? What is the name of your project? (empty) hello-azd\n    ? What is the name of your project? hello-azd\n    \n    SUCCESS: Generated azure.yaml project file.\n    Run azd add to add new Azure components to your project.\n    ```\n\n    The `--minimal` flag creates only the following:\n\n    - A basic `azure.yaml` file with just the project name and schemaVersion\n    - A `.azure` directory for environment configuration\n    - A `.gitignore` file with appropriate entries for Azure Developer CLI\n\n    This streamlined initialization is ideal when you:\n\n    - Want to build your infrastructure from scratch\n    - Need to integrate `azd` with an existing complex project\n    - Plan to use the `azd add` command to incrementally build your architecture\n    - Prefer full control over your project structure\n\n3. After initialization, you can:\n   - Manually create your infrastructure files in an `infra` folder\n   - Use the `azd add` [compose feature](azd-compose.md) to start adding Azure resources to your app\n   - Customize your `azure.yaml` file to define your services and resources\n\n## Project and Azure resource naming\n\nWhen you initialize a new or existing project, the project name is set in `azure.yaml`. The project name acts as a prefix for Azure resource names created during the provisioning process. By adhering to the validation rules, you ensure that generated Azure resource names will also be valid.\n\nIn Bicep or Terraform templates, the project name is often used as a base for constructing resource names, combined with the environment name and other elements. For example:\n\n```bicep\nvar resourceToken = '${name}-${environmentName}'\n```\n\nWhere `name` refers to the project name and `environmentName` is the name of your `azd` environment.\n\n## Project name validation rules\n\nWhen using `azd init` to initialize a project or when creating a new project name in the `azure.yaml` file, the following validation rules are applied:\n\n| Rule | Description |\n|------|-------------|\n| Allowed characters | Project names can include lowercase letters, numbers, and hyphens only. |\n| Starting character | Project names must start with a letter. |\n| Ending character | Project names must not end with a hyphen. |\n| Length | Project names must be between 2 and 63 characters long. |\n| No consecutive hyphens | Project names cannot contain consecutive hyphens. |\n\nThese validation rules ensure that your project name will be compatible with the naming requirements of Azure resources and prevent service packaging failures during deployment.\n\n## Next steps\n\nAfter initializing your project with `azd init`, you can:\n\n- Modify the generated infrastructure files to customize your Azure resources.\n- Use `azd provision` to create the required resources in Azure.\n- Use `azd deploy` to deploy your application code to the provisioned resources.\n- Learn about the [Azure Developer CLI up workflow](azd-up-workflow.md) to combine provisioning and deployment in a single command.\n\n## Related content\n\n- [Azure Developer CLI commands](azd-commands.md)\n- [Azure.yaml schema reference](azd-schema.md)\n- [Azure Developer CLI templates](azd-templates.md)\n- [Template galleries](azd-template-galleries.md)"
  },
  {
    "path": "articles/azure-developer-cli/azd-schema.md",
    "content": "---\ntitle: Azure Developer CLI's azure.yaml schema\ndescription: Describes the schema for the Azure Developer CLI azure.yaml configuration file, including all top-level properties, services, resources, hooks, and more.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 05/05/2026\nms.topic: reference\nms.custom: devx-track-azdevcli\nms.service: azure-dev-cli\nai-usage: ai-generated\n---\n\n# Azure Developer CLI schema reference\n\nThe `azure.yaml` file is the configuration file for Azure Developer CLI (`azd`) projects. Place it in the root of your project to define the services, Azure resources, infrastructure, hooks, and CI/CD pipeline that make up your application. When you run commands like `azd up`, `azd provision`, or `azd deploy`, the CLI reads this file to understand your app's structure and how to deploy it to Azure.\n\nThis article is a complete reference for the [azure.yaml schema](https://aka.ms/azure.yaml.json). For getting started with `azd` templates, see [Azure Developer CLI templates overview](./azd-templates.md).\n\n## Sample\n\nThe following is a generic example of an `azure.yaml` file for an `azd` template. For a real-world example, see the [`azure.yaml`](https://github.com/Azure-Samples/todo-nodejs-mongo/blob/main/azure.yaml) from the [ToDo NodeJs Mongo template](https://github.com/Azure-Samples/todo-nodejs-mongo):\n\n```yaml\nname: yourApp\nmetadata:\n  template: yourApp@0.0.1-beta\nservices:\n  web:\n    project: ./src/web\n    dist: build\n    language: js\n    host: appservice\n  api:\n    project: ./src/api\n    language: js\n    host: appservice\n```\n\n## Top-level properties\n\n| Element Name | Required | Type | Description |\n| --- | --- | --- | --- |\n| [`name`](#name) | Y | string | The application name. Only lowercase letters, numbers, and hyphens (`-`) are allowed. The name must start and end with a letter or number. |\n| [`resourceGroup`](#resourcegroup) | N | string | Name of the Azure resource group. When specified, overrides the resource group name used for infrastructure provisioning. Supports environment variable substitution. |\n| [`metadata`](#metadata) | N | object | Metadata about the application template. |\n| [`infra`](#infra) | N | object | Provides additional configuration for Azure infrastructure provisioning. |\n| [`services`](#services) | N | object | Definition of services that comprise the application. |\n| [`resources`](#resources) | N | object | Definition of Azure resources used by the application. |\n| [`pipeline`](#pipeline) | N | object | Definition of continuous integration pipeline. |\n| [`hooks`](#hooks) | N | object | Command level hooks for `azd` commands. |\n| [`requiredVersions`](#requiredversions) | N | object | Provides additional configuration for required versions of `azd` and extensions. |\n| [`state`](#state) | N | object | Provides additional configuration for state management. |\n| [`platform`](#platform) | N | object | Provides additional configuration for platform-specific features such as Azure Dev Center. |\n| [`workflows`](#workflows) | N | object | Provides additional configuration for workflows such as overriding `azd up` behavior. |\n| [`cloud`](#cloud) | N | object | Provides additional configuration for deploying to sovereign clouds. The default cloud is `AzureCloud`. |\n\n## `name`\n\n_(string, required)_ The application name. Only lowercase letters, numbers, and hyphens (`-`) are allowed. The name must start and end with a letter or number. Minimum length: 2 characters.\n\n```yaml\nname: my-app\n```\n\n## `resourceGroup`\n\n_(string)_ Name of the Azure resource group. When specified, overrides the resource group name used for infrastructure provisioning. Supports environment variable substitution. Must be between 3 and 64 characters.\n\n```yaml\nresourceGroup: rg-my-app-${AZURE_ENV_NAME}\n```\n\n## `metadata`\n\n_(object)_ Metadata about the application template.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `template` | N | string | Identifier of the template from which the application was created. |\n\n```yaml\nmetadata:\n  template: todo-nodejs-mongo@0.0.1-beta\n```\n\n## `infra`\n\n_(object)_ Provides additional configuration for Azure infrastructure provisioning.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `provider` | N | string | The infrastructure provisioning provider used to provision the Azure resources for the application. Default: `bicep`. Allowed values: `bicep`, `terraform`. |\n| `path` | N | string | The relative folder path to the Azure provisioning templates for the specified provider. Default: `infra`. |\n| `module` | N | string | The name of the default module within the Azure provisioning templates. Default: `main`. |\n| `layers` | N | array | Layers for Azure infrastructure provisioning. See [`infra.layers`](#infralayers). |\n\n> [!NOTE]\n> When `layers` is specified with at least one item, the `path` and `module` properties can't be used. Use layer-specific `path` and `module` values instead.\n\n### `infra.layers`\n\n_(array of objects)_ Defines provisioning layers for Azure infrastructure. Each layer represents an independent unit of provisioning.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | Y | string | The name of the provisioning layer. |\n| `path` | Y | string | The relative folder path to the Azure provisioning templates for the specified provider. |\n| `module` | N | string | The name of the Azure provisioning module used when provisioning resources. Default: `main`. |\n| `dependsOn` | N | array of strings | Names of other layers this layer depends on. Use to declare hook-mediated dependencies (for example, when a `postprovision` hook in another layer writes an env var that this layer's bicepparam reads at provision time) that `azd`'s static analyzer can't infer from `.bicep` / `.bicepparam` / `.parameters.json` contents. |\n| `hooks` | N | object | Provisioning layer hooks. Supports `preprovision` and `postprovision` hooks. When specifying paths, they should be relative to the layer path. See [Hook definition](#hook-definition). |\n\n```yaml\ninfra:\n  provider: bicep\n  layers:\n    - name: core\n      path: ./infra/core\n    - name: services\n      path: ./infra/services\n      dependsOn:\n        - core\n      hooks:\n        postprovision:\n          shell: sh\n          run: ./scripts/post-provision.sh\n```\n\n### Terraform as IaC provider sample\n\nTo use Terraform instead of Bicep, set the `provider` to `terraform`. For more information, see [Use Terraform as an IaC provider](./use-terraform-for-azd.md).\n\n```yaml\nname: yourApp-terraform\nmetadata:\n  template: yourApp-terraform@0.0.1-beta\nservices:\n  web:\n    project: ./src/web\n    dist: build\n    language: js\n    host: appservice\n  api:\n    project: ./src/api\n    language: js\n    host: appservice\ninfra:\n  provider: terraform\n```\n\n## `services`\n\n_(object)_ Definition of services that comprise the application. Each key is a service name, and the value is a service configuration object.\n\n### Service properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `host` | Y | string | The type of Azure resource used for service implementation. See [Host types](#host-types). |\n| `project` | Conditional | string | Path to the service source code directory. Required for most host types. |\n| `image` | Conditional | string | The source image to be used for the container image instead of building from source. Supports environment variable substitution. Only valid for `containerapp` host. |\n| `language` | N | string | Service implementation language. Allowed values: `dotnet`, `csharp`, `fsharp`, `py`, `python`, `js`, `ts`, `java`, `docker`. |\n| `module` | N | string | Path of the infrastructure module used to deploy the service relative to the root infra folder. If omitted, the CLI assumes the module name is the same as the service name. |\n| `dist` | N | string | Relative path to service deployment artifacts. |\n| `resourceName` | N | string | Name of the Azure resource that implements the service. By default, the CLI discovers the Azure resource with tag `azd-service-name` set to the current service's name. Supports environment variable substitution. |\n| `resourceGroup` | N | string | Name of the Azure resource group that contains the resource. When specified, the CLI finds the Azure resource within the specified resource group. Supports environment variable substitution. |\n| `remoteBuild` | N | boolean | Whether to use remote build for function app deployment. Only valid when `host` is `function`. When set to `true`, the deployment package is built remotely using Oryx. Defaults to `true` for JavaScript, TypeScript, and Python function apps. |\n| `docker` | N | object | Docker configuration. Only applicable for container-based hosts. See [`docker`](#docker). |\n| `k8s` | N | object | AKS configuration options. Only valid when `host` is `aks`. See [`k8s`](#k8s). |\n| `config` | N | object | Extra configuration options for the service. |\n| `uses` | N | array | List of service names and resource names that this service depends on. |\n| `env` | N | object | A map of environment variable names to values. Supports environment variable substitution. |\n| `apiVersion` | N | string | Resource provider API version for deployments. Only valid when `host` is `containerapp`. |\n| `hooks` | N | object | Service level hooks. See [Service hooks](#service-hooks). |\n\n> [!TIP]\n> See [Service samples](#service-samples) for complete YAML examples of different service configurations.\n\n#### Host types\n\nThe `host` property determines the type of Azure resource used for service implementation and controls which other properties are valid.\n\n| Host value | Description | Requires `project` | Supports `image` | Supports `docker` | Supports `k8s` | Supports `env` | Supports `apiVersion` |\n| --- | --- | --- | --- | --- | --- | --- | --- |\n| `appservice` | Azure App Service | Y | N | N | N | N | N |\n| `containerapp` | Azure Container Apps | `project` or `image` (not both) | Y | Y | N | Y | Y |\n| `function` | Azure Functions | Y | N | N | N | N | N |\n| `staticwebapp` | Azure Static Web Apps | Y | N | N | N | N | N |\n| `springapp` | Azure Spring Apps | Y | N | N | N | N | N |\n| `aks` | Azure Kubernetes Service | N | N | Y | Y | N | N |\n| `ai.endpoint` | Azure AI online endpoint | Y | N | Y | N | N | N |\n| `azure.ai.agent` | Azure AI Agent | Y | N | Y | N | N | N |\n\n> [!NOTE]\n> `springapp` support requires opt-in to alpha features. For more information, see [Alpha features](./feature-versioning.md#alpha-features).\n\n> [!NOTE]\n> When `host` is `containerapp`, you must provide either `image` or `project`, but not both. If `image` is set, the container is deployed from the specified image. If `project` is set, the container image is built from source.\n\n#### `ai.endpoint` config\n\n_(object, required when `host` is `ai.endpoint`)_ Provides additional configuration for Azure AI online endpoint deployment.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `workspace` | N | string | The name of the AI Studio project workspace. When omitted, `azd` uses the value specified in the `AZUREAI_PROJECT_NAME` environment variable. Supports environment variable substitution. |\n| `flow` | N | object | The Azure AI Studio Prompt Flow configuration. When omitted, a prompt flow isn't created. See [AI component config](#ai-component-config). |\n| `environment` | N | object | The Azure AI Studio custom environment configuration. When omitted, a custom environment isn't created. See [AI component config](#ai-component-config). |\n| `model` | N | object | The Azure AI Studio model configuration. When omitted, a model isn't created. See [AI component config](#ai-component-config). |\n| `deployment` | Y | object | The Azure AI Studio online endpoint deployment configuration. A new online endpoint deployment is created and traffic is automatically shifted to the new deployment upon successful completion. See [AI deployment config](#ai-deployment-config). |\n\n> [!NOTE]\n> When `host` is `ai.endpoint`, both `project` and `config` are required. See [`ai.endpoint` config](#aiendpoint-config) for the required configuration properties.\n\n##### AI component config\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | N | string | Name of the AI component. When omitted, `azd` generates a name based on the component type and the service name. Supports environment variable substitution. |\n| `path` | Y | string | The path to the AI component configuration file or source code. |\n| `overrides` | N | object | A map of key value pairs used to override the AI component configuration. Supports environment variable substitution. |\n\n##### AI deployment config\n\nInherits all properties from [AI component config](#ai-component-config), plus:\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `environment` | N | object | A map of key/value pairs to set as environment variables for the deployment. Values support OS and `azd` environment variable substitution. |\n\n```yaml\nservices:\n  myendpoint:\n    project: ./src/endpoint\n    host: ai.endpoint\n    config:\n      workspace: my-ai-project\n      deployment:\n        path: ./deployment\n        environment:\n          MODEL_NAME: ${AZURE_OPENAI_MODEL}\n```\n\n#### `docker`\n\n_(object)_ Docker configuration for a service. Only applicable for hosts that support containers (`containerapp`, `aks`, `ai.endpoint`, `azure.ai.agent`).\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `path` | N | string | The path to the Dockerfile, relative to your service. Default: `./Dockerfile`. |\n| `context` | N | string | The docker build context. When specified, overrides the default context. Default: `.`. |\n| `platform` | N | string | The platform target. Default: `amd64`. |\n| `registry` | N | string | The container registry to push the image to. If omitted, defaults to the value of `AZURE_CONTAINER_REGISTRY_ENDPOINT` environment variable. Supports environment variable substitution. |\n| `image` | N | string | The name that is applied to the built container image. If omitted, defaults to `{appName}/{serviceName}-{environmentName}`. Supports environment variable substitution. |\n| `tag` | N | string | The tag that is applied to the built container image. If omitted, defaults to `azd-deploy-{unix time (seconds)}`. Supports environment variable substitution. |\n| `buildArgs` | N | array of strings | Build arguments to pass to the docker build command. |\n| `network` | N | string | The networking mode for RUN instructions during docker build. Passed as `--network` to docker build. For example, use `host` to allow the build container to access the host network. |\n| `remoteBuild` | N | boolean | Whether to build the image remotely. If set to `true`, the image is built remotely using the Azure Container Registry remote build feature. If the remote build fails, `azd` automatically falls back to building locally using Docker or Podman if available. |\n\n#### `k8s`\n\n_(object)_ Azure Kubernetes Service (AKS) configuration options. Only valid when `host` is `aks`.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `deploymentPath` | N | string | The relative path from the service path to the k8s deployment manifests. Default: `manifests`. |\n| `namespace` | N | string | The k8s namespace of the deployed resources. When specified, a new k8s namespace is created if it doesn't already exist. Default: project name. |\n| `deployment` | N | object | The k8s deployment configuration. See [Deployment config](#deployment-config). |\n| `service` | N | object | The k8s service configuration. See [Service config](#service-config). |\n| `ingress` | N | object | The k8s ingress configuration. See [Ingress config](#ingress-config). |\n| `helm` | N | object | The helm configuration. See [Helm config](#helm-config). |\n| `kustomize` | N | object | The kustomize configuration. See [Kustomize config](#kustomize-config). |\n\n##### Deployment config\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | N | string | The name of the k8s deployment resource to use during deployment. If not set, searches for a deployment resource in the same namespace that contains the service name. Default: service name. |\n\n##### Service config\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | N | string | The name of the k8s service resource to use as the default service endpoint. If not set, searches for a service resource in the same namespace that contains the service name. Default: service name. |\n\n##### Ingress config\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | N | string | The name of the k8s ingress resource to use as the default service endpoint. If not set, searches for an ingress resource in the same namespace that contains the service name. Default: service name. |\n| `relativePath` | N | string | The relative path to the service from the root of your ingress controller. When set, it's appended to the root of your ingress resource path. |\n\n##### Helm config\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `repositories` | N | array | The helm repositories to add. |\n| `releases` | N | array | The helm releases to install. |\n\n**`repositories` array items:**\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | Y | string | The name of the helm repository. |\n| `url` | Y | string | The URL of the helm repository. |\n\n**`releases` array items:**\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | Y | string | The name of the helm release. |\n| `chart` | Y | string | The name of the helm chart. |\n| `version` | N | string | The version of the helm chart. |\n| `namespace` | N | string | The k8s namespace to install the helm chart. Defaults to the service namespace. |\n| `values` | N | string | Relative path from service to a `values.yaml` to pass to the helm chart. |\n\n##### Kustomize config\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `dir` | N | string | The relative path to the kustomize directory. Supports environment variable substitution. |\n| `edits` | N | array of strings | The kustomize edits to apply before deployment. Supports environment variable substitution. |\n| `env` | N | object | Environment key/value pairs used to generate a `.env` file in the kustomize directory. Values support environment variable substitution. |\n\n#### Service hooks\n\nService level hooks execute during service lifecycle events. Hooks should match service event names prefixed with `pre` or `post`. When specifying paths, they should be relative to the service path. See [Customize your Azure Developer CLI workflows using command and event hooks](./azd-extensibility.md) for more details.\n\nSupported service hooks: `prerestore`, `postrestore`, `prebuild`, `postbuild`, `prepackage`, `postpackage`, `prepublish`, `postpublish`, `predeploy`, `postdeploy`.\n\nEach hook uses the [Hook definition](#hook-definition) format.\n\n#### Service samples\n\n##### Container Apps with Docker options\n\n```yaml\nservices:\n  api:\n    project: ./src/api\n    language: js\n    host: containerapp\n    docker:\n      path: ./Dockerfile\n      context: ../\n  web:\n    project: ./src/web\n    language: js\n    host: containerapp\n    docker:\n      remoteBuild: true\n```\n\n##### Container Apps from a prebuilt image\n\n```yaml\nservices:\n  api:\n    image: myregistry.azurecr.io/myapp:latest\n    host: containerapp\n```\n\n##### AKS with service level hooks\n\n```yaml\nservices:\n  web:\n    project: ./src/web\n    dist: build\n    language: js\n    host: aks\n    hooks:\n      postdeploy:\n        shell: sh\n        run: azd env set REACT_APP_WEB_BASE_URL ${SERVICE_WEB_ENDPOINT_URL}\n  api:\n    project: ./src/api\n    language: js\n    host: aks\n    k8s:\n      ingress:\n        relativePath: api\n    hooks:\n      postdeploy:\n        shell: sh\n        run: azd env set REACT_APP_API_BASE_URL ${SERVICE_API_ENDPOINT_URL}\n```\n\n## `resources`\n\n_(object)_ Definition of Azure resources used by the application. Each key is a resource name, and the value is a resource configuration object. Resources can be referenced by services through the `uses` property.\n\n### Common resource properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `type` | Y | string | The type of resource. See [Resource types](#resource-types). |\n| `uses` | N | array | Other resources that this resource depends on. |\n| `existing` | N | boolean | When set to `true`, this resource isn't created and instead is used for referencing purposes. Default: `false`. |\n\n> [!TIP]\n> See [Resources sample](#resources-sample) for a complete YAML example combining multiple resource types.\n\n### Resource types\n\nThe `type` property determines the kind of Azure resource and controls which additional properties are available.\n\n| Type value | Description | Additional properties |\n| --- | --- | --- |\n| `host.appservice` | Azure App Service web app | See [`host.appservice` properties](#hostappservice-properties). |\n| `host.containerapp` | Docker-based container app | See [`host.containerapp` properties](#hostcontainerapp-properties). |\n| `ai.openai.model` | A deployed, ready-to-use AI model | See [`ai.openai.model` properties](#aiopenaimodel-properties). |\n| `ai.project` | A Microsoft Foundry project with models | See [`ai.project` properties](#aiproject-properties). |\n| `ai.search` | Azure AI Search | See [`ai.search` properties](#aisearch-properties). |\n| `db.postgres` | Azure Database for PostgreSQL | No extra properties. |\n| `db.mysql` | Azure Database for MySQL | No extra properties. |\n| `db.redis` | Azure Cache for Redis | No extra properties. |\n| `db.mongo` | Azure Cosmos DB for MongoDB | No extra properties. |\n| `db.cosmos` | Azure Cosmos DB for NoSQL | See [`db.cosmos` properties](#dbcosmos-properties). |\n| `messaging.eventhubs` | Azure Event Hubs namespace | See [`messaging.eventhubs` properties](#messagingeventhubs-properties). |\n| `messaging.servicebus` | Azure Service Bus namespace | See [`messaging.servicebus` properties](#messagingservicebus-properties). |\n| `storage` | Azure Storage Account | See [`storage` properties](#storage-properties). |\n| `keyvault` | Azure Key Vault | See [`keyvault` properties](#keyvault-properties). |\n\n### `host.appservice` properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `port` | N | integer | Port that the web app listens on. Default: `80`. |\n| `runtime` | Y | object | The language runtime configuration. See below. |\n| `env` | N | array | Environment variables. Each item has `name` (required), `value`, and `secret` properties. Supports environment variable substitution. |\n| `startupCommand` | N | string | Startup command that runs as part of web app startup. |\n| `uses` | N | array of strings | Other resources that this resource uses. |\n\n**`runtime` object:**\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `stack` | Y | string | The language runtime stack. Allowed values: `node`, `python`. |\n| `version` | Y | string | The language runtime version. Format varies by stack (for example, `22-lts` for Node, `3.13` for Python). |\n\n```yaml\nresources:\n  web:\n    type: host.appservice\n    port: 8080\n    runtime:\n      stack: node\n      version: 22-lts\n    uses:\n      - db\n```\n\n### `host.containerapp` properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `port` | N | integer | Port that the container app listens on. Default: `80`. |\n| `env` | N | array | Environment variables. Each item has `name` (required), `value`, and `secret` properties. Supports environment variable substitution. |\n| `uses` | N | array of strings | Other resources that this resource uses. |\n\n### `ai.openai.model` properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `model` | Conditional | object | The underlying AI model. Required when `existing` is `false`. |\n| `existing` | N | boolean | When set to `true`, this resource isn't created and instead is used for referencing purposes. Default: `false`. |\n\n**`model` object:**\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | Y | string | The name of the AI model. |\n| `version` | Y | string | The version of the AI model. |\n\n```yaml\nresources:\n  chatModel:\n    type: ai.openai.model\n    model:\n      name: gpt-4o\n      version: \"2024-08-06\"\n```\n\n### `ai.project` properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `models` | N | array | The AI models to be deployed as part of the AI project. |\n| `existing` | N | boolean | When set to `true`, this resource isn't created and instead is used for referencing purposes. Default: `false`. |\n\n**`models` array items:**\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | Y | string | The name of the AI model. |\n| `version` | Y | string | The version of the AI model. |\n| `format` | Y | string | The format of the AI model (for example, `Microsoft`, `OpenAI`). |\n| `sku` | Y | object | The SKU configuration for the AI model. |\n\n**`sku` object:**\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | Y | string | The name of the SKU (for example, `GlobalStandard`). |\n| `usageName` | Y | string | The usage name of the SKU for billing purposes (for example, `OpenAI.GlobalStandard.gpt-4o-mini`). |\n| `capacity` | Y | integer | The capacity of the SKU. |\n\n### `ai.search` properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `existing` | N | boolean | When set to `true`, this resource isn't created and instead is used for referencing purposes. Default: `false`. |\n\n### `db.cosmos` properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `containers` | N | array | Containers to store data. Each container stores a collection of items. |\n\n**`containers` array items:**\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | Y | string | The name of the container. |\n| `partitionKeys` | Y | array | The partition key(s) used to distribute data across partitions. Maximum 3 keys. Default: `/id`. |\n\n### `messaging.eventhubs` properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `hubs` | N | array of strings | Hub names to create in the Event Hubs namespace. |\n| `existing` | N | boolean | When set to `true`, this resource isn't created and instead is used for referencing purposes. Default: `false`. |\n\n### `messaging.servicebus` properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `queues` | N | array of strings | Queue names to create in the Service Bus namespace. |\n| `topics` | N | array of strings | Topic names to create in the Service Bus namespace. |\n| `existing` | N | boolean | When set to `true`, this resource isn't created and instead is used for referencing purposes. Default: `false`. |\n\n### `storage` properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `containers` | N | array of strings | Azure Storage Account container names. |\n| `existing` | N | boolean | When set to `true`, this resource isn't created and instead is used for referencing purposes. Default: `false`. |\n\n### `keyvault` properties\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `existing` | N | boolean | When set to `true`, this resource isn't created and instead is used for referencing purposes. Default: `false`. |\n\n### Resources sample\n\n```yaml\nresources:\n  db:\n    type: db.postgres\n  cache:\n    type: db.redis\n  chatModel:\n    type: ai.openai.model\n    model:\n      name: gpt-4o\n      version: \"2024-08-06\"\n  web:\n    type: host.containerapp\n    port: 3100\n    uses:\n      - db\n      - chatModel\n```\n\n## `pipeline`\n\n_(object)_ Definition of continuous integration pipeline.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `provider` | N | string | The pipeline provider to be used for continuous integration. Default: `github`. Allowed values: `github`, `azdo`. |\n| `variables` | N | array of strings | List of `azd` environment variables to be used in the pipeline as variables. |\n| `secrets` | N | array of strings | List of `azd` environment variables to be used in the pipeline as secrets. |\n\n```yaml\npipeline:\n  provider: azdo\n  variables:\n    - CUSTOM_SETTING\n  secrets:\n    - API_KEY\n```\n\n## `hooks`\n\n_(object)_ Command level hooks. Hooks should match `azd` command names prefixed with `pre` or `post` depending on when the script should execute. When specifying paths, they should be relative to the project path. See [Customize your Azure Developer CLI workflows using command and event hooks](./azd-extensibility.md) for more details.\n\nSupported command hooks: `preprovision`, `postprovision`, `preinfracreate`, `postinfracreate`, `preinfradelete`, `postinfradelete`, `predown`, `postdown`, `preup`, `postup`, `prepackage`, `postpackage`, `prepublish`, `postpublish`, `predeploy`, `postdeploy`, `prerestore`, `postrestore`.\n\nEach hook uses the [Hook definition](#hook-definition) format.\n\n> [!TIP]\n> See [Hook samples](#hook-samples) for complete YAML examples including platform-specific hooks, typed executors, and multiple hooks per event.\n\n```yaml\nhooks:\n  preprovision:\n    shell: sh\n    run: ./scripts/setup.sh\n  postdeploy:\n    shell: sh\n    run: azd env set APP_URL ${SERVICE_WEB_ENDPOINT_URL}\n```\n\n### Hook definition\n\nA hook can be a single hook object or an array of hook objects. Each hook object has the following properties:\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `run` | Conditional | string | The inline script or relative path of your script. Required when specifying `shell`, `kind`, `dir`, `interactive`, `continueOnError`, `secrets`, or `config`. When specifying an inline script, you also must specify the `shell` to use. The shell is automatically inferred when using file paths. |\n| `shell` | N | string | Type of shell to execute scripts. Default: `sh`. Allowed values: `sh`, `pwsh`. |\n| `kind` | N | string | Executor kind for the hook script. When omitted, the kind is auto-detected from the file extension of the `run` path (for example, `.py` becomes `python`, `.ps1` becomes `pwsh`). Allowed values: `sh`, `pwsh`, `js`, `ts`, `python`, `dotnet`. |\n| `dir` | N | string | Working directory for hook execution. Used as the project root for dependency installation and as the working directory when running the script. Relative paths are resolved from the project or service root. When omitted, defaults to the directory containing the script file. |\n| `continueOnError` | N | boolean | Whether a script error halts the `azd` command. Default: `false`. |\n| `interactive` | N | boolean | Whether the script runs in interactive mode, binding to `stdin`, `stdout`, and `stderr` of the running console. Default: `false`. |\n| `windows` | N | object | When specified, overrides the hook configuration when executed in Windows environments. Uses the same hook object format. |\n| `posix` | N | object | When specified, overrides the hook configuration when executed in POSIX (Linux and macOS) environments. Uses the same hook object format. |\n| `secrets` | N | object | A map of `azd` environment variables to hook secrets. If a variable was set as a secret in the environment, the secret value is passed to the hook. |\n| `config` | N | object | Executor-specific configuration. The available properties depend on the `kind` value. See [Hook executor configuration](#hook-executor-configuration). |\n\n> [!NOTE]\n> When both `windows` and `posix` are specified, the `run`, `shell`, `kind`, `dir`, `interactive`, `continueOnError`, `secrets`, and `config` properties can't be used at the top level. Use the platform-specific objects instead.\n\n### Hook executor configuration\n\nThe `config` property accepts different properties depending on the `kind` value.\n\n#### JavaScript and TypeScript (`js`, `ts`) config\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `packageManager` | N | string | The package manager to use for dependency installation. Overrides auto-detection from lock files. Allowed values: `npm`, `pnpm`, `yarn`. |\n\n#### Python config\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `virtualEnvName` | N | string | The directory name for the Python virtual environment. Defaults to auto-detection (`.venv`, `venv`) or `{baseName}_env`. |\n\n#### .NET (`dotnet`) config\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `configuration` | N | string | The MSBuild configuration for building the hook script (for example, `Debug`, `Release`). |\n| `framework` | N | string | The target framework moniker for building and running the hook script (for example, `net8.0`, `net10.0`). |\n\n#### Shell (`sh`, `pwsh`) config\n\nShell executors don't currently support `config` properties.\n\n### Hook samples\n\n#### Platform-specific hooks\n\n```yaml\nhooks:\n  preprovision:\n    windows:\n      shell: pwsh\n      run: ./scripts/setup.ps1\n    posix:\n      shell: sh\n      run: ./scripts/setup.sh\n```\n\n#### Python hook with kind\n\n```yaml\nhooks:\n  postprovision:\n    kind: python\n    run: ./scripts/seed-data.py\n    dir: ./scripts\n    config:\n      virtualEnvName: .venv\n```\n\n#### Multiple hooks for a single event\n\n```yaml\nhooks:\n  postprovision:\n    - shell: sh\n      run: ./scripts/step1.sh\n    - shell: sh\n      run: ./scripts/step2.sh\n```\n\n## `requiredVersions`\n\n_(object)_ Provides additional configuration for required versions of `azd` and extensions.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `azd` | N | string | A range of supported versions of `azd` for this project. If the version of `azd` is outside this range, the project fails to load. Supports semver range syntax. |\n| `extensions` | N | object | A map of required extensions and version constraints for this project. Supports semver constraints. If the version is omitted, the latest version is installed. |\n\n```yaml\nrequiredVersions:\n  azd: \">= 0.6.0-beta.3\"\n  extensions:\n    azure.ai.agents: \">=1.0.0\"\n    my-extension: latest\n```\n\n## `state`\n\n_(object)_ Provides additional configuration for state management.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `remote` | N | object | Provides additional configuration for remote state management. See [`state.remote`](#stateremote). |\n\n### `state.remote`\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `backend` | Y | string | The remote state backend type. Default: `AzureBlobStorage`. Allowed values: `AzureBlobStorage`. |\n| `config` | Conditional | object | Backend-specific configuration. Required when `backend` is `AzureBlobStorage`. See [Azure Blob Storage config](#azure-blob-storage-config). |\n\n### Azure Blob Storage config\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `accountName` | Y | string | The Azure Storage account name. |\n| `containerName` | N | string | The Azure Storage container name. Defaults to the project name if not specified. |\n| `endpoint` | N | string | The Azure Storage endpoint. Default: `blob.core.windows.net`. |\n\n```yaml\nstate:\n  remote:\n    backend: AzureBlobStorage\n    config:\n      accountName: mystorageaccount\n      containerName: azd-state\n```\n\n## `platform`\n\n_(object)_ Provides additional configuration for platform-specific features such as Azure Dev Center.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `type` | Y | string | The platform type. Allowed values: `devcenter`. |\n| `config` | N | object | Platform-specific configuration. See [Dev Center config](#dev-center-config). |\n\n### Dev Center config\n\nAvailable when `type` is `devcenter`:\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | N | string | The name of the Azure Dev Center. Used as the default dev center for this project. |\n| `project` | N | string | The name of the Azure Dev Center project. |\n| `catalog` | N | string | The name of the Azure Dev Center catalog. |\n| `environmentDefinition` | N | string | The name of the Dev Center catalog environment definition. |\n| `environmentType` | N | string | The Dev Center project environment type used for the deployment environment. |\n\n```yaml\nplatform:\n  type: devcenter\n  config:\n    name: my-devcenter\n    project: my-project\n    catalog: my-catalog\n    environmentDefinition: my-env-def\n    environmentType: dev\n```\n\n## `workflows`\n\n_(object)_ Provides additional configuration for workflows such as overriding `azd up` behavior.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `up` | N | object or array | When specified, overrides the default behavior for the `azd up` workflow. |\n\n### Workflow steps\n\nThe `up` workflow accepts a `steps` array (or can be specified directly as an array). Each step runs an `azd` command.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `azd` | Y | string or object | The `azd` command to execute. Can be a string (for example, `provision`) or an object with an `args` array. |\n\n### Configure workflow step order\n\nThe following `azure.yaml` file changes the default behavior of `azd up` to move the `azd package` step after the `azd provision` step. Use this approach in scenarios where you need to know the URLs of resources during the build or packaging process.\n\n```yaml\nname: todo-nodejs-mongo\nmetadata:\n  template: todo-nodejs-mongo@0.0.1-beta\nworkflows:\n  up:\n    steps:\n      - azd: provision\n      - azd: package\n      - azd: deploy --all\n```\n\n## `cloud`\n\n_(object)_ Provides additional configuration for deploying to sovereign clouds such as Azure Government. The default cloud is `AzureCloud`.\n\n| Property | Required | Type | Description |\n| --- | --- | --- | --- |\n| `name` | N | string | The cloud environment name. Allowed values: `AzureCloud`, `AzureChinaCloud`, `AzureUSGovernment`. |\n\n```yaml\ncloud:\n  name: AzureUSGovernment\n```\n\n[!INCLUDE [request-help](includes/request-help.md)]\n\n## Next steps\n\n- [Customize workflows using command and event hooks](./azd-extensibility.md)\n- [Azure Developer CLI templates overview](./azd-templates.md)\n- [Use Terraform as an IaC provider](./use-terraform-for-azd.md)\n- [Manage environment variables](./manage-environment-variables.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/azd-template-galleries.md",
    "content": "---\ntitle: Explore Azure Developer CLI Template Galleries\ndescription: Learn about Azure Developer CLI templates and the available template galleries, including Awesome AZD and the AI Template Gallery.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/10/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Explore the Azure Developer CLI template galleries\n\nAzure Developer CLI (`azd`) templates simplify the process of building, provisioning, and deploying applications on Azure. This document explores what these templates are, their purpose, and the available galleries, including [Awesome AZD](#awesome-azd) and the [AI Template Gallery](#the-ai-app-templates-gallery).\n\n## What are Azure Developer CLI templates?\n\n[Azure Developer CLI templates](/azure/developer/azure-developer-cli/azd-templates) are standardized project structures that include application code, infrastructure as code (IaC) files, and deployment configurations. These templates are designed to help developers quickly set up and deploy full-stack applications on Azure. They provide a starting point for common application architectures and integrate seamlessly with Azure services.\n\nKey features of Azure Developer CLI templates:\n\n- Include infrastructure as code to create app resources like Azure App Service or Azure OpenAI\n- Define deployment configurations to package and deploy apps built with various languages\n- Enable simplified, automated workflows for provisioning resources and deploying applications\n- Provide starting points or architectural examples for building cloud-native apps\n\nFor more detailed information on `azd` templates, visit the [templates overview](/azure/developer/azure-developer-cli/azd-templates) page.\n\n## What are template galleries?\n\nTemplate galleries offer curated collections of reusable `azd` templates to help you get started with building and deploying applications on Azure. They provide developers with various ready-to-use templates for different use cases, such as web applications, AI-powered solutions, and microservices architectures.\n\nThese galleries help developers:\n\n- Quickly prototype and deploy applications\n- Explore sample architectures for specific scenarios\n- Learn best practices for Azure app development\n- Share and build on community-contributed templates\n\n## Explore the galleries\n\nYou can explore templates from different galleries using a local editor like Visual Studio Code, or directly in the browser with GitHub Codespaces. The following sections highlight two key galleries that showcase different types of templates for various use cases.\n\n### Awesome AZD\n\n[**Awesome AZD**](https://azure.github.io/awesome-azd/) is a community-driven collection of Azure Developer CLI templates, tools, and resources. It includes templates for various application types, contributed by both Microsoft and the developer community. The gallery is designed to showcase best practices and innovative use cases for `azd`.\n\n:::image type=\"content\" source=\"media/get-started/awesome-azd.png\" alt-text=\"A screenshot showing the home page of the Awesome AZD template gallery.\":::\n\nKey highlights of Awesome AZD:\n\n- Templates for web apps, APIs, microservices, and more\n- Community-contributed examples for real-world scenarios\n- Resources for extending and customizing Azure Developer CLI workflows\n\nTo learn more or contribute to the Awesome AZD gallery, visit the [Awesome AZD GitHub repository](https://github.com/Azure/awesome-azd).\n\n### The AI App Templates gallery\n\nThe [**AI App Templates**](https://azure.github.io/ai-app-templates/) gallery is a specialized collection of Azure Developer CLI templates focused on AI-powered applications. These templates help developers quickly build intelligent solutions by integrating with AI services in Azure such as Azure OpenAI and Microsoft Foundry.\n\n:::image type=\"content\" source=\"media/get-started/ai-template-gallery.png\" alt-text=\"A screenshot showing the home page of the AI App Template gallery.\":::\n\nKey highlights of the AI Template Gallery:\n\n- Templates for chatbots, recommendation systems, and other AI use cases.\n- Preconfigured infrastructure for integrating AI services in Azure.\n- Examples of how to use AI capabilities in cloud-native applications.\n\nThe AI Template Gallery simplifies the process of building and deploying AI-driven applications by providing ready-to-use templates and best practices.\n\n### Add your own custom template sources\n\nIn addition to using the predefined galleries, you can also [add your own template sources](/azure/developer/azure-developer-cli/configure-template-sources) to customize your development workflow. This allows you to create and share templates tailored to your specific needs or organization.\n\nTo add a custom template source:\n\n1. Create a repository containing your templates. Each template should follow the Azure Developer CLI template structure, including application code, infrastructure as code files, and deployment configurations.\n\n1. Use the `azd template` command to add your repository as a source. For example:\n\n   ```bash\n   azd template add --source <repository-url>\n   ```\n\n1. Once added, you can list and use your custom templates just like the predefined ones:\n\n   ```bash\n   azd template list\n   ```\n\nBy adding your own template sources, you can extend the capabilities of the Azure Developer CLI and streamline development for your team or projects.\n\n## Conclusion\n\nAzure Developer CLI template galleries, such as Awesome AZD and the AI Template Gallery, provide developers with powerful starting points for building and deploying applications on Azure. Whether you're creating a web app, exploring AI capabilities, or learning best practices, these galleries offer valuable resources to accelerate your development process.\n"
  },
  {
    "path": "articles/azure-developer-cli/azd-templates.md",
    "content": "---\ntitle: Azure Developer CLI templates\ndescription: Learn about what Azure Developer CLI templates are, how to work with them, and how to get started using them with your apps.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.topic: how-to\nms.custom: devx-track-azdevcli, build-2023\nms.service: azure-dev-cli\n---\n\n# Azure Developer CLI templates overview\n\nAzure Developer CLI (`azd`) templates are regular code repositories that include sample application code, as well as `azd` configuration and infrastructure files. `azd` templates enable you to provision Azure resources, deploy your application, configure CI/CD pipelines, and more. You can either create your own templates, or get started using an existing template from a template repository such as [Awesome AZD](https://azure.github.io/awesome-azd/). In this article, you'll learn about the following concepts:\n\n- How `azd` templates enable you to provision and deploy app resources\n- How `azd` templates are structured\n- How to decide whether to use an existing template or create one\n- Explore existing `azd` starter templates\n\n> [!VIDEO https://www.youtube.com/embed/KDgR-TXtOgM?si=rLzhrqC4M0o5d0BE]\n\n## Why use Azure Developer CLI templates?\n\nDevelopers often face many time consuming and challenging tasks when building properly architected and configured environment aware apps for the cloud. Teams must account for many different concerns in these environments, such as creating resources, applying configurations, setting up monitoring and logging, building CI/CD pipelines, and other tasks. `azd` templates reduce and streamline these responsibilities to help the developer on their journey from local development to a successfully deployed app on Azure.\n\nFor example, suppose you work at a company that operates a ticket management and customer communication platform, which requires the following Azure resources:\n\n- Two App Service instances and an App Service Plan to host a front-end web app and back-end API\n- A Key Vault instance to store secure app secrets\n- A Cosmos DB database to permanently store app data\n- Azure Monitor resources such as Application Insights dashboards\n- A Service Bus to manage scalable messaging\n- CI/CD pipelines to ensure changes can be reliably deployed through an automated, repeatable process.\n\nRather than starting from the ground up, with `azd` you can leverage existing architecture templates to provision and deploy most of the resources for you. The development team can then focus on building the app and making smaller adjustments to the template architecture.\n\n## How Azure Developer CLI templates work\n\nAzure Developer CLI templates are designed to work with `azd` commands such as `azd init` and `azd up`. The templates include configuration and infrastructure-as-code (IaC) files that are used by the commands to perform tasks such as provisioning Azure resources and deploy the app code to them.\n\nFor example, a typical `azd` workflow using an existing template includes the following steps:\n\n1. Run the `azd init` command with the `--template` parameter to clone an existing template down from GitHub.\n\n    ```azdeveloper\n    azd init --template todo-nodejs-mongo\n    ```\n\n2. Run the `azd auth login` command to authenticate to your Azure subscription.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n3. Run the `azd up` command to provision and deploy the template resources to Azure. The `azd up` command leverages the configuration and infrastructure-as-code (IaC) files in your template to provision Azure resources and deploy your application to those resources.\n\n    ```azdeveloper\n    azd up\n    ```\n\n4. Once your environment is set up in Azure, you can locally modify the application features or Azure resource templates and then run `azd up` again to provision your changes.\n\n[!INCLUDE [azd-template-structure](includes/azd-template-structure.md)]\n\n## Start with an existing template or create your own\n\nThere are two main approaches to working with `azd` templates:\n\n- **Start with an existing `azd` template.**\n  - This is a good choice if you're just getting started with `azd` or if you're looking for a template to build off of for a new app with a similar architecture and frameworks.\n- **Convert an existing project to an `azd` template.**\n  - This is a good choice when you already have an existing app but you want to make it compatible with `azd` capabilities.\n\nThe following sections provide more information on these two options.\n\n### Start with an existing template\n\nA broad selection of `azd` templates is available on the [awesome-azd](https://azure.github.io/awesome-azd/) template gallery. These templates provide infrastructure and application code for various development scenarios, language frameworks, and Azure services. If you find a template that aligns with your local application stack or desired architecture, you can extend and replace the template code with your own\n\nFor example, the following `azd` templates provide starting points for common app architectures and frameworks:\n\n### [C#](#tab/csharp)\n\n| Template      | App host | Tech stack |\n| ----------- | ----------| ----------- |\n| [React Web App with C# API and MongoDB on Azure](https://github.com/Azure-Samples/todo-csharp-cosmos-sql) | [Azure App Service](/azure/app-service/) | [Azure Cosmos DB for NoSQL](/learn/modules/intro-to-azure-cosmos-db-core-api/), Bicep |\n| [React Web App with C# API and SQL Database on Azure](https://github.com/azure-samples/todo-csharp-sql) | [Azure App Service](/azure/app-service/) | [Azure SQL Database](/azure/azure-sql/database/sql-database-paas-overview), Bicep |\n| [Static React Web App + Functions with C# API and SQL Database on Azure](https://github.com/Azure-Samples/todo-csharp-sql-swa-func) | [Azure Static Web Apps](/azure/static-web-apps/), [Azure Functions](/azure/azure-functions/) | [Azure SQL Database](/azure/azure-sql/database/sql-database-paas-overview), Bicep |\n\n### [Java](#tab/java)\n\n| Template      | App host | Tech stack     | \n| ----------- | ----------| ----------- | \n| [React Web App with Java API and MongoDB on Azure](https://github.com/Azure-Samples/todo-java-mongo) | [Azure App Service](/azure/app-service/) | [Azure Cosmos DB API for Mongo](/azure/cosmos-db/mongodb/mongodb-introduction), Bicep | \n| [Containerized React Web App with Java API and MongoDB on Azure](https://github.com/Azure-Samples/todo-java-mongo-aca) | [Azure Container Apps](/azure/container-apps/overview) | [Azure Cosmos DB API for Mongo](/azure/cosmos-db/mongodb/mongodb-introduction), Bicep | \n\n### [Node.js](#tab/nodejs)\n\n| Template      | App host | Tech stack |\n| ----------- | ----------| ----------- |\n| [React Web App with Node.js API and MongoDB on Azure](https://github.com/azure-samples/todo-nodejs-mongo) | [Azure App Service](/azure/app-service/) | [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction), Bicep |  \n| [React Web App with Node.js API and MongoDB (Terraform) on Azure](https://github.com/azure-samples/todo-nodejs-mongo-terraform) | [Azure App Service](/azure/app-service/) | [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction), Terraform |  \n| [Containerized React Web App with Node.js API and MongoDB on Azure](https://github.com/azure-samples/todo-nodejs-mongo-aca) | [Azure Container Apps](/azure/container-apps/overview) | [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction), Bicep |\n| [Static React Web App + Functions with Node.js API and MongoDB on Azure](https://github.com/azure-samples/todo-nodejs-mongo-swa-func) | [Azure Static Web Apps](/azure/static-web-apps/), [Azure Functions](/azure/azure-functions/) | [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction), Bicep |\n| [Kubernetes React Web App with Node.js API and MongoDB on Azure](https://github.com/Azure-Samples/todo-nodejs-mongo-aks) |  [Azure Kubernetes Service](/azure/aks/) | [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction), Bicep\n\n### [Python](#tab/python)\n\n| Template      | App host | Tech stack |\n| ----------- | ----------| ----------- |\n| [React Web App with Python API and MongoDB on Azure](https://github.com/azure-samples/todo-python-mongo) | [Azure App Service](/azure/app-service/) | [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction), Bicep  |  \n| [React Web App with Python API and MongoDB (Terraform) on Azure](https://github.com/Azure-Samples/todo-python-mongo-terraform) | [Azure App Service](/azure/app-service/) | [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction), Terraform  |  \n| [Containerized React Web App with Python API and MongoDB on Azure](https://github.com/azure-samples/todo-python-mongo-aca) | [Azure Container Apps](/azure/container-apps/overview) |  [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction), Bicep |  \n| [Static React Web App + Functions with Python API and MongoDB on Azure](https://github.com/azure-samples/todo-python-mongo-swa-func) | [Azure Static Web Apps](/azure/static-web-apps/), [Azure Functions](/azure/azure-functions/) |  [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction), Bicep|\n\n### [Starter Templates (IaC only)](#tab/starter-IaC)\n| Template      | App host | Tech stack |\n| ----------- | ----------| ----------- |\n| [Bicep Starter](https://github.com/Azure-Samples/azd-starter-bicep) | - | Bicep, [dev container](https://containers.dev) configuration file, CI/CD pipeline definitions to test your app against your applications resources on Azure |  \n| [Terraform Starter](https://github.com/Azure-Samples/azd-starter-terraform) | - | Terraform [dev container](https://containers.dev) configuration file, CI/CD pipeline definitions to test your app against your applications resources on Azure |  \n\n---\n\n### Create a new `azd` template for your app\n\nYou can also convert an existing app into an `azd` template to enhance the repository with provisioning and deployment capabilities. This approach allows for the most control and produces a reusable solution for future development work on the app. The high level steps to create your own template are as follows:\n\n- Initialize the project template with `azd init`.\n- Create the Bicep or Terraform infrastructure as code files in the `infra` folder.\n- Update the `azure.yaml` file to tie the app services together with the Azure resources.\n- Provision & deploy with `azd up`.\n\nThe following resources provide more information about creating your own templates:\n\n- [Build your first Azure Developer CLI template](/training/modules/build-first-azd-template/)\n- [Make your project compatible with `azd` guide](/azure/developer/azure-developer-cli/make-azd-compatible)\n\n## Guidelines for using `azd` templates\n\nPlease note that each template that you use with Azure Developer CLI is licensed by its respective owner (which may or may not be Microsoft) under the agreement which accompanies the template. It is your responsibility to determine what license applies to any template you choose to use.\n\nMicrosoft is not responsible for any non-Microsoft templates and does not screen these templates for security, privacy, compatibility, or performance issues. The templates you use with Azure Developer CLI, including those provided from Microsoft, are not supported by any Microsoft support program or service. Any Microsoft-provided templates are provided AS IS without warranty of any kind.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Select and deploy a template](./get-started.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/azd-up-workflow.md",
    "content": "---\ntitle: Explore the Azure Developer CLI up workflow\ndescription: Learn about how the different stages of the Azure Developer CLI provisioning and deployment workflows\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/15/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Explore the `azd up` workflow\n\nThe Azure Developer CLI (`azd`) enables you to provision and deploy application resources on Azure with only a single command using `azd up`. This guide provides a detailed breakdown of `azd up` and how the different stages of this workflow command correlate to the structure of an `azd` template.\n\n## Follow along using a template\n\nThe sections ahead use examples from the [`hello-azd`](https://github.com/Azure-Samples/hello-azd) template to demonstrate various `azd` concepts and patterns. You can follow along by initializing the template on your local machine:\n\n```azdeveloper\nazd init -t hello-azd\n```\n\nFor more information about getting started with `azd` and the `hello-azd` template, visit the [Quickstart: Deploy an Azure Developer CLI template](get-started.md) article.\n\n## Essential concepts\n\nWhen working with an `azd` template, you can provision and deploy your app resources on Azure using the `azd up` command. Run the command from a terminal window that is open to your template folder:\n\n```azdeveloper\nazd up\n```\n\n`azd up` is designed so that you can repeatedly run the command as you develop your app, and the new changes are deployed incrementally. The command initiates a powerful workflow that essentially wraps three specific stages:\n\n1. **Packaging**: Prepares the application code and dependencies for deployment.\n2. **Provisioning**: Creates and configures the necessary Azure resources required by the app using infrastructure-as-code files.\n3. **Deployment**: Deploys the packaged application to the provisioned Azure resources.\n\nYou can also run each of these stages individually using their respective command, but `azd up` provides a convenience wrapper to streamline the overall process. Each stage plays a critical role in ensuring a smooth and automated deployment process. You can influence the `azd up` workflow stages using configurations in the template `azure.yaml` file. The following sections explore each stage in more detail.\n\n## The packaging stage\n\nThe packaging stage is the first step in the `azd up` workflow. During this stage:\n\n- The app code is prepared for deployment. Depending on the programming language the template app is built with, packaging can involve building or compiling the app, bundling dependencies, or creating deployment artifacts such as Docker images.\n- The `azd` template structure typically includes a `src` folder where the application code resides. Build scripts or configuration files (such as a Dockerfile) can influence how the application should be packaged.\n- The `azure.yaml` file contains configuration mappings that tell `azd` where your app code lives and which language it uses so `azd` can package it appropriately.\n- This stage ensures that the application is in a deployable state before moving to the next step.\n\nYou can run the packaging process on its own outside of `azd up` using the `azd package` command:\n\n```azdeveloper\nazd package\n```\n\n### Example packaging configurations\n\n`azd` can package apps built with different languages in different ways. For example, if your app uses a containerized approach, the `azd` template might include a `Dockerfile` in the app `src` directory. The packaging stage builds a Docker image for the app based on this file. These configurations are managed through the `azure.yaml` file.\n\nFor example, consider the following project structure and configurations of the `hello-azd` starter template:\n\n:::image type=\"content\" source=\"media/core-concepts/packaging-process.png\" alt-text=\"A screenshot showing the packaging stage of azd up.\":::\n\nIn the preceding image, the `azure.yaml` file:\n\n- Defines the code in the `src` directory as a C# app.\n- Specifies the location of a Dockerfile to use to build a container image of the app.\n\nWhen you run `azd up` (or `azd package`), the Azure Developer CLI uses this combination of configurations to build and package the app code in the `src` directory as a .NET container image. If a Dockerfile wasn't configured, `azd` could also package the .NET app using the standard .NET publishing process.\n\n## The provisioning stage\n\nThe provisioning stage creates and configures the required Azure resources for your app. For example, your app might require an Azure App Service instance to host the app itself, and an Azure Storage Account to hold uploaded files. The provisioning stage uses infrastructure-as-code (IaC) files included in the template to define the resources.\n\nSome key points to understand about the provisioning stage include:\n\n1. `azd` supports both Bicep and Terraform for infrastructure-as-code tasks.\n1. By default, infrastructure-as-code files are stored in the `infra` folder, but this location can be customized.\n1. `azd` searches for a `main.bicep` or `main.tf` file to act as the main orchestration file for the IaC process.\n\n:::image type=\"content\" source=\"media/core-concepts/provisioning-process.png\" alt-text=\"A screenshot showing the provisioning stage of azd up.\":::\n\nYou can also run the provisioning process on its own outside of `azd up` using the `azd provision` command:\n\n```azdeveloper\nazd provision\n```\n\n### Example provisioning configurations\n\nInside the `infra` folder, a `main.bicep` file generally defines the Azure resources that `azd` should create for the app. Consider the following snippet from `main.bicep` in the `hello-azd` starter template:\n\n```bicep\n// ...omitted code for other resource configurations\n\n// Create an Azure Cosmos DB account\nmodule cosmos 'app/cosmos.bicep' = {\n  name: 'cosmos'\n  scope: rg\n  params: {\n    userPrincipalId: principalId\n    managedIdentityId: identity.outputs.principalId\n  }\n}\n\n// Create a storage account\nmodule storage './core/storage/storage-account.bicep' = {\n  name: 'storage'\n  scope: rg\n  params: {\n    name: !empty(storageAccountName) ? storageAccountName : '${abbrs.storageStorageAccounts}${resourceToken}'\n    location: location\n    tags: tags\n    containers: [\n      { name: 'attachments' }\n    ]\n  }\n}\n\n// Container apps environment and registry\nmodule containerAppsEnv './core/host/container-apps.bicep' = {\n  name: 'container-apps'\n  scope: rg\n  params: {\n    name: 'app'\n    containerAppsEnvironmentName: !empty(containerAppsEnvName) ? containerAppsEnvName : '${abbrs.appManagedEnvironments}${resourceToken}'\n    containerRegistryName: !empty(containerRegistryName) ? containerRegistryName : '${abbrs.containerRegistryRegistries}${resourceToken}'\n    location: location\n  }\n}\n\n// ...omitted code for other resource configurations\n```\n\nUsing the preceding Bicep code, `azd` creates the following resources:\n\n- An Azure Cosmos DB instance to store data submitted through the app\n- An Azure Storage account to store uploaded images\n- An Azure Container App to host the app\n\n## The deployment stage\n\nThe deployment stage is the final step in the `azd up` workflow. During this stage:\n\n- The app artifacts created during the packaging stage are deployed to the provisioned Azure resources.\n- `azd` uses configuration files in the template, such as `azure.yaml`, to determine how to deploy the app.\n- Environment variables and connection strings are configured to ensure the app can interact with the provisioned resources.\n\nYou can also run the deployment process on its own outside of `azd up` using the `azd deploy` command:\n\n```azdeveloper\nazd deploy\n```\n\n### Example deployment configurations\n\nInside the `azure.yaml` file, you can specify which service in your project should be deployed to which Azure resource. For example, consider the following configurations for the `hello-azd` starter template:\n\n```yaml\nmetadata:\n  template: hello-azd-dotnet\nname: azd-starter\nservices:\n  aca:\n    project: ./src # The location of the service source code\n    language: csharp\n    host: containerapp # The provisioned resource to deploy the service to\n    docker:\n      path: ./Dockerfile\n```\n\nThe preceding code instructs `azd` to deploy the artifacts packaged from the code in the `src` folder to the `containerapp` that was created during the provisioning stage. You can also define multiple services and map each to a different host.\n\n## Conclusion\n\nThe `azd up` workflow streamlines the process of deploying applications to Azure by automating the packaging, provisioning, and deployment stages. Developers can ensure a consistent and efficient deployment process by adhering to the `azd` template structure. Whether you're deploying a simple web app or a complex microservices architecture, the `azd up` command simplifies the journey from code to cloud.\n"
  },
  {
    "path": "articles/azure-developer-cli/azd-zone-pivot-groups.yml",
    "content": "# YamlMime:ZonePivotGroups\ngroups:\n# Owner: tarcher\n- id: azd-languages-set\n  title: Programming languages\n  prompt: Choose a programming language\n  pivots:\n  - id: programming-language-nodejs\n    title: Node.js\n  - id: programming-language-python\n    title: Python\n  - id: programming-language-csharp\n    title: C#\n  - id: programming-language-java\n    title: Java\n- id: azd-devenv-set\n  title: Development environment\n  prompt: Choose a development environment\n  pivots:\n  - id: ide-vs-code\n    title: Visual Studio Code\n  - id: ide-vs\n    title: Visual Studio\n- id: make-azure-developer-cli-compatible-set\n  title: Starting point for making a project compatible with the Azure Developer CLI\n  prompt: Choose a starting point\n  pivots:\n  - id: azd-create\n    title: Create new template\n  - id: azd-convert\n    title: Convert a sample\n- id: azd-os-env-set\n  title: OS / Development Environment\n  prompt: Choose an OS (for local install) or development environment\n  pivots:\n  - id : os-windows\n    title: Windows\n  - id: os-linux\n    title: Linux\n  - id: os-mac\n    title: Mac\n  - id: env-dev-container \n    title: Dev Container\n"
  },
  {
    "path": "articles/azure-developer-cli/azure-ai-ml-endpoints.md",
    "content": "---\ntitle: Deploy to a Microsoft Foundry or Azure Machine Learning studio online endpoint using the Azure Developer CLI\ndescription: Learn how to deploy to a Microsoft Foundry or Azure Machine Learning studio online endpoint using the Azure Developer CLI.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/27/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Deploy to a Microsoft Foundry or Azure Machine Learning studio online endpoint\n\nThe Azure Developer CLI (`azd`) enables you to deploy to an [Azure Machine Learning studio](https://ml.azure.com) or [Microsoft Foundry](https://ai.azure.com) online endpoint. `azd` supports the following features, which are described in the sections ahead:\n\n* Custom environments\n  * Environments can be viewed in [Azure Machine Learning studio](https://ml.azure.com/) under the **Environments** section.\n* Custom models\n  * Models can be viewed in [Azure Machine Learning studio](https://ml.azure.com/) under the **Models** section.\n* Prompt flows\n  * Flows can be viewed in [Azure Machine Learning studio](https://ml.azure.com/) under the **Flows** section.\n  * Flows can be viewed in the [Microsoft Foundry portal](https://ai.azure.com/) under the **Flows** section.\n* Online deployments (within online endpoint)\n  * Deployments can be viewed in [Azure Machine Learning studio](https://ml.azure.com/) under the **Deployments** section.\n  * Deployments can be viewed in the [Microsoft Foundry portal](https://ai.azure.com/) under the **Deployments** section.\n\n## Prerequisites\n\nTo work with Microsoft Foundry or Azure Machine Learning studio online endpoints, you need:\n\n* [Azure Subscription](https://signup.azure.com/signup) with OpenAI access enabled\n* [AI Hub Resource](/azure/ai-studio/concepts/ai-resources)\n* [AI Project](/azure/ai-studio/how-to/create-projects)\n* [OpenAI Service](/azure/ai-services/openai/)\n* [Online Endpoint](/azure/machine-learning/concept-endpoints-online)\n* [AI Search Service](/azure/search/) (Optional, enabled by default)\n\nThe [Foundry Starter template](https://github.com/Azure-Samples/azd-aistudio-starter) can help create all the required infrastructure to get started with Foundry endpoints.\n\n## Configure the online endpoint\n\nConfigure support for online endpoints in the `services` section of the `azure.yaml` file:\n\n* Set the `host` value to `ai.endpoint`.\n* The `config` section for `ai.endpoint` supports the following configurations:\n  * **workspace**: The name of the Microsoft Foundry workspace. Supports `azd` environment variable substitutions and syntax.\n    * If not specified, `azd` looks for an environment variable with the name `AZUREAI_PROJECT_NAME`.\n  * **environment**: Optional custom configuration for ML environments. `azd` creates a new environment version from the referenced YAML file definition.\n  * **flow**: Optional custom configuration for flows. `azd` creates a new prompt flow from the specified file path.\n  * **model**: Optional custom configuration for ML models. `azd` creates a new model version from the referenced YAML file definition.\n  * **deployment**: **Required** configuration for online endpoint deployments. `azd` creates a new online deployment to the associated online endpoint from the referenced YAML file definition.\n\nConsider the following sample `azure.yaml` file that configures these features:\n\n```yaml\nname: contoso-chat\nmetadata:\n  template: contoso-chat@0.0.1-beta\nservices:\n  chat:\n    # Referenced new ai.endpoint host type\n    host: ai.endpoint\n    # New config flow for AI project configuration\n    config:\n      # The name of the Foundry workspace\n      workspace: ${AZUREAI_PROJECT_NAME}\n      # Optional: Path to custom ML environment manifest\n      environment:\n        path: deployment/docker/environment.yml\n      # Optional: Path to your prompt flow folder that contains the flow manifest\n      flow:\n        path: ./contoso-chat\n      # Optional: Path to custom model manifest\n      model:\n        path: deployment/chat-model.yaml\n        overrides:\n          \"properties.azureml.promptflow.source_flow_id\": ${AZUREAI_FLOW_NAME}\n      # Required: Path to deployment manifest\n      deployment:\n        path: deployment/chat-deployment.yaml\n        environment:\n          PRT_CONFIG_OVERRIDE: deployment.subscription_id=${AZURE_SUBSCRIPTION_ID},deployment.resource_group=${AZURE_RESOURCE_GROUP},deployment.workspace_name=${AZUREAI_PROJECT_NAME},deployment.endpoint_name=${AZUREAI_ENDPOINT_NAME},deployment.deployment_name=${AZUREAI_DEPLOYMENT_NAME}\n```\n\nThe `config.deployment` section is required and creates a new online deployment to the associated online endpoint from the referenced YAML file definition. This functionality handles the following:\n\n* Associated environment and model are referenced when available.\n* `azd` waits for the deployment to enter a terminal provisioning state.\n* On successful deployments, all traffic is shifted to the new deployment version.\n* All previous deployments are deleted to free up compute for future deployments.\n\n## Explore configuration options\n\nEach supported feature for AI/ML online endpoints supports customizations for your specific scenario using the options described in the following sections.\n\n### Flow\n\nThe `flow` configuration section is optional and supports the following values:\n\n* **name**: The name of the flow. Defaults to `<service-name>-flow-<timestamp>` if not specified.\n* **path**: The relative path to a folder that contains the flow manifest.\n* **overrides**: Any custom overrides to apply to the flow.\n\n    > [!NOTE]\n    > Each call to `azd deploy` creates a new timestamped flow.\n\n### Environment\n\nThe `environment` configuration section is optional and supports the following values:\n\n* **name**: The name of the custom environment. Defaults to `<service-name>-environment` if not specified.\n* **path**: The relative path to a custom [environment yaml manifest](/azure/machine-learning/reference-yaml-environment?view=azureml-api-2&preserve-view=true).\n* **overrides**: Any custom overrides to apply to the environment.\n\n    > [!NOTE]\n    > Each call to `azd deploy` creates a new environment version.\n\n### Model\n\nThe `model` configuration section is optional and supports the following values:\n\n* **name**: The name of the custom model. Defaults to `<service-name>-model` if not specified.\n* **path**: The relative path to a custom [model YAML manifest](/azure/machine-learning/reference-yaml-model?view=azureml-api-2&preserve-view=true).\n* **overrides**: Any custom overrides to apply to the model.\n\n    > [!NOTE]\n    > Each call to `azd deploy` creates a new model version.\n\n### Deployment\n\nThe `deployment` configuration section is **required** and supports the following values:\n\n* **name**: The name of the custom deployment. Defaults to `<service-name>-deployment` if not specified.\n* **path**: The relative path to a custom [deployment yaml manifest](/azure/machine-learning/reference-yaml-deployment-managed-online?view=azureml-api-2&preserve-view=true).\n* **environment**: A map of key value pairs to set environment variables for the deployment. Supports environment variable substitutions from OS/AZD environment variables using `${VAR_NAME}` syntax.\n* **overrides**: Any custom overrides to apply to the deployment.\n\n    > [!NOTE]\n    > Only supports managed online deployments.\n\n## AgentSchema and `agent.yaml`\n\n[AgentSchema](https://microsoft.github.io/AgentSchema/) is an open specification for defining AI agents in a code-first YAML format. An `agent.yaml` file describes an agent's configuration, including its model, instructions, tools, and connections. AgentSchema serves as a unified exchange format between Microsoft Copilot Studio, Microsoft Foundry, and other platforms.\n\nAgentSchema supports two primary formats:\n\n- **AgentDefinition** — A complete, concrete specification of an agent that can be executed directly. Use this format for single-purpose agents where all configuration values are known and fixed.\n- **AgentManifest** — A parameterized template for creating agents dynamically. Use this format for reusable agent patterns where values like model names, connections, or instructions are configured at runtime using `{{parameter}}` syntax.\n\n### Example `agent.yaml`\n\nThe following example shows an AgentDefinition for a customer support agent:\n\n```yaml\nkind: prompt\nname: customer-support\ndisplayName: \"Customer Support Agent\"\ndescription: \"Handles customer inquiries and support requests\"\n\nmodel: gpt-4o\n\ninstructions: |\n  You are a helpful customer support agent. Provide clear,\n  professional responses to customer inquiries.\n\ntools:\n  knowledge_base:\n    kind: function\n    description: \"Search company knowledge base\"\n    parameters:\n      query:\n        kind: string\n        description: \"Search query\"\n        required: true\n```\n\n### Using `agent.yaml` with `azd`\n\nThe `azure.yaml` schema supports the `azure.ai.agent` host type for deploying agents to Microsoft Foundry. When `host` is set to `azure.ai.agent`, `azd` uses the agent definition in your project to deploy and manage the agent. For more information, see the [azure.yaml schema reference](azd-schema.md).\n\nFor more information about AgentSchema, see the following resources:\n\n- [AgentSchema specification](https://microsoft.github.io/AgentSchema/)\n- [AgentSchema reference documentation](https://microsoft.github.io/AgentSchema/reference/)\n- [AgentManifest vs AgentDefinition guide](https://microsoft.github.io/AgentSchema/guides/example/)\n- [AgentSchema GitHub repository](https://github.com/microsoft/AgentSchema)\n\n## Related content\n\n- [azure.yaml schema reference](azd-schema.md)\n- [Azure Developer CLI templates overview](azd-templates.md)\n\n[!INCLUDE [request-help](includes/request-help.md)]\n"
  },
  {
    "path": "articles/azure-developer-cli/azure-deployment-stacks-integration.md",
    "content": "---\ntitle: Azure deployment stacks integration with the Azure Developer CLI\ndescription: How to use Azure deployment stacks with the Azure Developer CLI (azd)\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Azure deployment stacks integration with the Azure Developer CLI\n\nThe Azure Developer CLI (`azd`) supports [Azure deployment stacks](/azure/azure-resource-manager/bicep/deployment-stacks) for template deployments. An Azure deployment stack is a resource that enables you to manage a group of Azure resources as a single, cohesive unit. By using deployment stacks, you can gain additional control over the set of resources associated with your `azd` template and app.\n\nIn this article, you learn how to:\n\n- Enable Azure deployment stack support in `azd`.\n- Deploy `azd` templates using Azure deployment stacks.\n- Configure deployment stack behavior using `azd` configurations.\n\n## Enable Azure deployment stack support\n\nAzure deployment stacks support must be enabled via the `azd config` command:\n\n```bash\nazd config set alpha.deployment.stacks on\n```\n\n> [!NOTE]\n> Azure deployment stacks support is currently an alpha feature, which is why it must be enabled manually. However, deployment stacks will become the default deployment behavior of `azd` in a future release.\n> [Learn more about our versioning strategy.](./feature-versioning.md)\n\nVerify the feature was enabled successfully using the `azd config show` command:\n\n```bash\nazd config show\n```\n\n## Deploy a template using deployment stacks\n\nAfter you enable the deployment stacks feature, no further changes to your `azd` templates are required to leverage the default behavior of this feature. `azd` automatically wraps the provisioned template resources in an Azure deployment stack when you run `azd up`:\n\n```bash\nazd up\n```\n\n`azd` uses the scope defined in the `main.bicep` file of your template for the Azure deployment stack. For example, if your template is scoped to the subscription or resource group level, you can view the associated deployment stack in the Azure portal on the **Deployment stacks** page of the associated subscription or resource group page.\n\n:::image type=\"content\" source=\"media/deployment/subscription-deployment-stack.png\" alt-text=\"A screenshot showing a subscription level deployment stack in the Azure portal.\":::\n\nSelect the deployment stack to view the management pages for it:\n\n:::image type=\"content\" source=\"media/deployment/deployment-stack-details.png\" alt-text=\"A screenshot showing the deployment stack details.\":::\n\n## Delete a deployment stack\n\nBy default, you can delete a deployment stack and its associated resources using the standard `azd down` command:\n\n```bash\nazd down\n```\n\nThe exact behavior of `azd down` and deployment stacks is configured using the `azure.yaml` file.\n\n## Configure the deployment stack\n\n`azd` exposes various configuration settings through the `infra` section of the `azure.yaml` file to influence the behavior of the Azure deployment stack. These settings map to the standard options detailed in [Deployment stacks](/azure/azure-resource-manager/bicep/deployment-stacks) documentation. Consider the following `azure.yaml` example:\n\n```yml\nname: todo-nodejs-mongo-aca\nmetadata:\n  template: todo-nodejs-mongo-aca@0.0.1-beta\ninfra:\n  provider: bicep\n  deploymentStacks:\n    actionOnUnmanage:\n      resources: delete\n      resourceGroups: delete\n    denySettings:\n      mode: denyDelete\n      excludedActions:\n        - Microsoft.Resources/subscriptions/resourceGroups/delete\n      excludedResources:\n        - <your-resource-id-1>\n        - <your-resource-id-2>\n      excludedPrincipals:\n        - <your-targeted-principal-id-1>\n        - <your-targeted-principal-id-2>\n      applyToChildScopes: true\n# ...\n# Remaining file contents omitted\n# ...\n```\n\nIn the preceding example, the following options are defined in the `deploymentStacks` section:\n\n- **actionOnUnmanage**: When a deployment stack is deleted, the associated Azure resources are considered unmanaged. This setting determines how Azure will handle unmanaged resources. Possible values include:\n  - `delete` is the default value and destroys any resources managed by the deleted deployment stack.\n  - `detach` leaves resources in place but removes their association to the deleted deployment stack.\n- **denySettings**: A subsection that provides nuanced control over the resources of the deployment stack.\n  - **mode**: Determines high level restrictions on the deployment stack resources. Possible values include:\n    - `none` is the default value and allows the deployment stack resources to be deleted, or new resources to be added.\n    - `denyDelete` prevents any deployment stack resources from being deleted.\n    - `denyWriteAndDelete` prevents any deployment stack resources from being deleted and also prevents new resources from being added to the deployment stack.\n  - **excludedActions**: Lists the [Azure role-based access control (RBAC)](/azure/role-based-access-control/overview) actions that are not allowed on the deployment stack resources.\n  - **excludedResources**: Lists the resource IDs that are excluded from the `denySettings`.\n  - **excludedPrincipals**: Lists the service principal IDs that are excluded from the `denySettings`.\n  - **applyToChildScopes**: A boolean value that sets whether the deny settings apply to child resources of resources in the deployment stack. For example, a SQL Server resource has child database resources.\n\n> [!div class=\"nextstepaction\"]\n> [Azure Developer CLI FAQ](./tooling-environment-faq.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/azure-developer-cli-vs-azure-cli.md",
    "content": "---\ntitle: Azure Developer CLI vs Azure CLI Overview\ndescription: Understand the differences between the Azure Developer CLI and the Azure CLI\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/10/2025\nms.service: azure-dev-cli\nms.topic: concept-article\nms.custom: devx-track-azdevcli\n---\n\n# Azure Developer CLI vs Azure CLI overview\n\nAzure provides multiple command-line tools to help users interact with cloud services. Two of the most commonly used tools are the [Azure Developer CLI](/azure/developer/azure-developer-cli/overview) and the [Azure CLI](/cli/azure/what-is-azure-cli). While both options enable users to manage and deploy resources on Azure, they're designed for different audiences and use cases. The following sections provide an overview of each tool, highlight their differences, and offer comparisons to help you select the best tool for different situations.\n\n## What is the Azure Developer CLI?\n\nThe Azure Developer CLI (`azd`) is a developer-focused command-line tool designed to streamline the process of building, provisioning, deploying, and managing full-stack apps on Azure. Key features include:\n\n- High-level commands oriented around app lifecycle stages, such as provisioning and deployment\n- A template system to define infrastructure as code and deployment configurations for your app\n- Automated provisioning and deployment of app resources\n- Built-in CI/CD pipeline setup for GitHub Actions or Azure Pipelines\n- Galleries of starter app templates for common app architectures\n\n## What is the Azure CLI?\n\nThe Azure CLI (`az`) is a general-purpose command-line interface for managing Azure resources. It provides a comprehensive set of commands to create, configure, delete, and monitor resources programmatically or interactively. Key features include:\n\n- Granular administrative control over Azure resources\n- Support for scripting and task automation\n- Integration with a wide range of Azure services and tools\n- Resource management across many tenants, subscriptions, and environments\n\n## How are the tools different?\n\nWhile both the Azure Developer CLI and Azure CLI provide command-line interfaces for Azure, they serve different purposes and audiences:\n\n- **Azure Developer CLI**: Focuses on simplifying the developer experience by providing an opinionated workflow for building and deploying applications. It abstracts much of the complexity of resource management and is tailored for application-centric tasks.\n- **Azure CLI**: Offers granular control over Azure resources and is designed for a broader audience, including IT administrators, DevOps engineers, and developers. It provides flexibility for managing individual resources but requires knowledge of specific Azure services.\n\n### Compare commands\n\nYou can print the available commands for both CLI tools to visualize these differences. For example, run the Azure Developer CLI command `azd help` to view information about the tool and available commands:\n\n```output\nUsage\n  azd [command]\n\nCommands\n  Configure and develop your app\n    auth        : Authenticate with Azure.\n    config      : Manage azd configurations (ex: default Azure subscription, location).\n    hooks       : Develop, test and run hooks for an application. (Beta)\n    init        : Initialize a new application.\n    restore     : Restores the application's dependencies. (Beta)\n    template    : Find and view template details. (Beta)\n\n  Manage Azure resources and app deployments\n    deploy      : Deploy the application's code to Azure.\n    down        : Delete Azure resources for an application.\n    env         : Manage environments.\n    package     : Packages the application's code to be deployed to Azure. (Beta)\n    provision   : Provision the Azure resources for an application.\n    up          : Provision Azure resources, and deploy your project with a single command.\n\n  Monitor, test and release your app\n    monitor     : Monitor a deployed application. (Beta)\n    pipeline    : Manage and configure your deployment pipelines. (Beta)\n    show        : Display information about your app and its resources.\n```\n\nThe commands in the preceding output map to high level development workflow concerns, such as managing app deployments, app configuration, and monitoring.\n\nHowever, if you run the `az help` command for the Azure CLI, you see output that resembles the following output:\n\n```output\nGroup\n    az\n\nSubgroups:\n    account                       : Manage Azure subscription information.\n    acr                           : Manage private registries with Azure Container Registries.\n    ad                            : Manage Microsoft Entra ID (formerly known as Azure Active\n                                    Directory, Azure AD, AAD) entities needed for Azure role-based\n                                    access control (Azure RBAC) through Microsoft Graph API.\n    advisor                       : Manage Azure Advisor.\n    afd                           : Manage Azure Front Door Standard/Premium.\n    aks                           : Manage Azure Kubernetes Services.\n    ams                           : Manage Azure Media Services resources.\n    apim                          : Manage Azure API Management services.\n    appconfig                     : Manage App Configurations.\n    appservice                    : Manage App Service plans.\n    aro                           : Manage Azure Red Hat OpenShift clusters.\n    backup                        : Manage Azure Backups.\n    batch                         : Manage Azure Batch.\n    bicep                         : Bicep CLI command group.\n    billing                       : Manage Azure Billing.\n    bot                           : Manage Microsoft Azure Bot Service.\n    cache                         : Commands to manage CLI objects cached using the `--defer`\n    \n    (omitted for brevity...)\n```\n\nIn the preceding output, all of the commands focus on managing configurations for specific Azure resources, such as Azure Container Registries or Azure Billing services.\n\n### Compare features\n\nThe following table highlights the key differences between the Azure Developer CLI and the Azure CLI in more detail:\n\n| Functionality         | Azure Developer CLI (`azd`)                   | Azure CLI (`az`)                                    |\n|-------------------------|---------------------------------------------------------|----------------------------------------------------|\n| **Primary audience**   | Developers focused on building cloud-native apps       | Developers, IT admins, and DevOps engineers        |\n| **Primary use case**    | End-to-end app lifecycle management        | Azure resource administration & management  |\n| **Type of tasks**       | Provisioning and deploying app resources, CI/CD pipeline setup  | Resource administration and scripting |\n| **Command behavior**    | Opinionated, high-level commands for common workflows   | Flexible, low-level commands for granular control  |\n| **Template support**     | Includes predefined templates for common architectures | No templates; requires manual resource configuration |\n| **IaC support** | Native support for IaC tools like Bicep and Terraform | Requires separate IaC setup and integration        |\n| **CI/CD Integration**   | Automates pipeline setup for GitHub Actions or Azure Pipelines | No built-in CI/CD automation                       |\n\n### Compare use cases\n\nChoosing the right tool depends on your specific needs and the tasks you want to accomplish. Below are examples of scenarios where each tool excels to help you decide which one to use for your workflow.\n\n#### When to Use the Azure Developer CLI\n\nThe Azure Developer CLI is best suited for scenarios where you need to manage the end-to-end workflow for application development and deployment. Example use cases include:\n\n- Packaging, provisioning and deploying full-stack cloud-native apps in a portable, repeatable way\n- Quickly provisioning sample app architectures using predefined templates for rapid prototyping\n- Setting up CI/CD pipelines for GitHub Actions or Azure Pipelines with minimal effort\n\n#### When to Use the Azure CLI\n\nThe Azure CLI is ideal for scenarios that require granular control over individual Azure resources or advanced scripting capabilities. Example use cases include:\n\n- Creating, configuring, or deleting Azure resources\n- Automating resource management using custom scripts\n- Monitoring and troubleshooting Azure resources\n- Integrating resource management into broader DevOps workflows\n\nBy understanding these use cases, you can determine which tool is better suited for your specific needs or use both tools in combination to maximize efficiency.\n\n## Conclusion\n\nThe Azure Developer CLI and Azure CLI are complementary tools designed for different audiences and use cases. The Azure Developer CLI simplifies app packaging, provisioning, and deployment for developers, while the Azure CLI provides granular control for administrative tasks. Depending on your role and requirements, you can use one or both tools to achieve your goals on Azure.\n"
  },
  {
    "path": "articles/azure-developer-cli/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: Azure Developer CLI\n      tocHref: /azure\n      topicHref: /azure/developer/azure-developer-cli/index\n"
  },
  {
    "path": "articles/azure-developer-cli/compose-generate.md",
    "content": "---\ntitle: Generate Bicep from the azd compose feature\ndescription: Learn how to generate Bicep files from the azd compose feature to further customize your infrastructure\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/21/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, devx-track-bicep\n---\n\n# Generate Bicep using the compose feature\n\nThe Azure Developer CLI (`azd`) compose feature simplifies the process of building, deploying, and managing cloud applications. By using `azd compose`, you can define and manage the infrastructure and application code for your project in a unified way. This guide explains how to generate Bicep code from the `azd compose` feature, enabling you to customize your cloud infrastructure to meet your specific requirements.\n\n## How `azd compose` manages infrastructure state\n\nThe `azd compose` feature tracks your infrastructure state in-memory during the composition process. This approach allows you to iteratively define and refine your application and infrastructure without immediately generating files or modifying your project directory.\n\nWhen you run the `azd infra synth` command, the in-memory state is converted into Bicep files in the `infra` folder. At this point, the infrastructure state transitions from being managed in-memory to being represented as code, allowing for further customization.\n\n> [!TIP]\n> Use `azd compose` to quickly prototype your infrastructure before committing to file-based changes with `azd infra synth`.\n\n## Generate the Bicep code\n\nTo explore or customize the Bicep code used internally by `azd` to provision resources created by `azd add`, run the following command:\n\n```bash\nazd infra gen\n```\n\n> [!NOTE]\n> The `azd infra synth` command from earlier versions of `azd` is now an alias of azd `infra generate`, and will continue to work. However, a warning message will be displayed and the command might be removed in a future `azd` release.\n\nThis command generates the corresponding Bicep files in the `infra` folder of your app.\n\n## Managing updates with Bicep generation\n\nWhen you run the `azd infra gen` command, you exit the `azd compose` workflow and the simplified init process. From this point on, any changes you make to the generated Bicep files are no longer tracked by `azd compose`. If you modify the Bicep files and later run `azd infra gen` again, your manual changes will be overwritten by the newly generated code.\n\nHere's how a typical workflow might look:\n\n1. You use `azd add` to add new Azure resources to your project. These resources are managed internally by `azd`.\n2. Once you've finished adding resources, you run `azd infra gen` to generate Bicep files for those resources in the project's `infra` folder. At this stage, the resources are no longer managed by the `azd compose` workflow.\n3. You can now manually update the Bicep files as you continue developing your app.\n4. If you add more resources or run `azd infra gen` again, the contents of the `infra` folder will be regenerated, and any manual changes will be lost.\n\nFor this reason, the compose feature is best suited for the following scenarios:\n\n- Creating an initial set of Azure resources for your project, then managing further updates yourself by editing the Bicep files.\n- Managing your Azure resources entirely through the compose feature without running `azd infra gen`.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Create Azure Developer CLI templates overview](/azure/developer/azure-developer-cli/make-azd-compatible)\n"
  },
  {
    "path": "articles/azure-developer-cli/compose-quickstart.md",
    "content": "---\ntitle: Build a template using the Azure Developer CLI compose feature\ndescription: Learn how to build a minimal template using the Azure Developer CLI compose feature\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/22/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, devx-track-bicep\n---\n\n# Build a minimal template using the Azure Developer CLI compose feature\n\nThe Azure Developer CLI (`azd`) composability (compose) feature enables you to progressively compose the Azure resources required for your app without manually writing Bicep code. In this article, you learn how to work with the compose feature to build a minimal template. Visit the [`azd` compose overview](azd-compose.md) article for more conceptual information about this feature.\n\n> [!NOTE]\n> The `azd` compose feature is currently in alpha and shouldn't be used in production apps. Changes to alpha features in subsequent releases can result in breaking changes. Visit the [azd feature versioning and release strategy](/azure/developer/azure-developer-cli/feature-versioning) and [feature stages](https://github.com/Azure/azure-dev/blob/main/cli/azd/docs/feature-stages.md) pages for more information. Use the **Feedback** button on the upper right to share feedback about the `compose` feature and this article.\n\n## Work with the compose feature\n\nAccess `azd` compose features through the [`azd add`](/azure/developer/azure-developer-cli/reference#azd-add) command. The `azd add` command works with templates created using the following `azd init` workflows:\n\n- **Use code in the current directory** (for apps that target Azure Container Apps for hosting)\n- **Create a minimal project**\n\nTemplates initialized through the **Select a template** flow aren't currently supported. The `azd` compose feature manages infrastructure for you and isn't compatible with templates that have existing `infra` folder assets. Visit the [Generate the Bicep code](compose-generate.md) article and [template creation workflows](/azure/developer/azure-developer-cli/make-azd-compatible) page for more information.\n\nComplete the following steps to add new resources to your template without writing any code:\n\n1. In a terminal window, navigate to the root of your `azd` template.\n\n1. Run the `azd add` command to add a new resource and start the compose workflow:\n\n    ```bash\n    azd add\n    ```\n\n1. Select one of the supported resources to add to your app. For this example, select `Database`.\n\n    ```output\n    ? What would you like to add? [Use arrows to move, type to filter]\n    > AI\n      Database\n      Host service\n      Key Vault\n      Messaging\n      Storage account\n      ~Existing resource\n    ```\n\n1. For the type of database, select `PostgreSQL`.\n\n    ```output\n    ? Which type of database?  [Use arrows to move, type to filter]\n      MongoDB\n    > PostgreSQL\n      Redis\n    ```\n\n1. Enter a name for the new resource, such as `azddb`.\n\n    ```output\n    ? Input the name of the app database (PostgreSQL)\n    ```\n\n1. If your app contains services, `azd` prompts you to select the service that uses this resource.\n\n    ```output\n    ? Select the service(s) that uses this resource\n    > [✓]  webfrontend\n    ```\n\n1. `azd` generates a preview of the required changes to the `azure.yaml` file. Press **Enter** to accept and apply the changes.\n\n    ```output\n    Previewing changes to azure.yaml:\n    \n    +  azddata:\n    +      type: db.postgres\n    \n       webfrontend:\n           type: host.containerapp\n           uses:\n               - azddb\n    +          - azddata\n           port: 80\n    ```\n\n1. Run the `azd up` command to provision any changes made through the `azd add` command. In this example, `azd` provisions a PostgreSQL database in Azure.\n\n1. Run the `azd add` command again to add other resources, such as an OpenAI service.\n\n## Explore the azure.yaml file\n\n`azure.yaml` is the configuration file that `azd` uses to manage your app. `azd` manages the services and resources composed through the `azd add` command using the corresponding `services` and `resources` nodes. Consider the following example of an `azure.yaml` file updated entirely through `azd add`:\n\n```yml\nname: azdcomposesample\nmetadata:\n  template: azd-init@1.11.0\nservices:\n  webfrontend:\n    project: src\n    host: containerapp\n    language: dotnet\nresources:\n  webfrontend:\n    type: host.containerapp\n    port: 80\n    uses:\n      - azdsql\n      - azdchat\n  azdsql:\n    type: db.postgres\n  azdchat:\n    type: ai.openai.model\n    model:\n      name: gpt-4o\n      version: \"2024-08-06\"\n```\n\n- The `services` node declares:\n    - A deployment mapping named `webfrontend` between a .NET web app in the `src` directory and Azure Container Apps.\n- The `resources` node declares:\n    - An Azure container app and a matching dependency mapping named `webfrontend` between the hosted .NET container app and the database and AI service it depends on. The `uses` node maps the app to the other resources it depends on.\n    - An Azure Database for PostgreSQL resource named `azdsql`.\n    - An Azure OpenAI resource named `azdchat`.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Generate Bicep code using the compose feature](compose-generate.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/configure-devops-pipeline.md",
    "content": "---\ntitle: Explore Azure Developer CLI support for CI/CD pipelines\ndescription: Learn how work with GitHub Actions or Azure Pipelines using the Azure Developer CLI.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 05/12/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom:\n  - devx-track-azdevcli\n  - build-2023\n  - sfi-image-nochange\n  - sfi-ropc-nochange\n---\n\n# Explore Azure Developer CLI support for CI/CD pipelines\n\nThe Azure Developer CLI (`azd`) streamlines CI/CD setup with the [`azd pipeline config`](reference.md) command. This command uses pipeline definition files included in `azd` templates to automate provisioning and deployment pipelines for your app resources on Azure. By integrating templates and pipelines, `azd` enables a seamless CI/CD experience, allowing you to focus on development while ensuring consistent, reliable deployments.\n\n## Pipeline features\n\nWhen you run the `azd pipeline config` command, `azd` performs the following steps to set up a CI/CD pipeline:\n\n- **Authenticate with Azure**: Confirms you are logged in and have the required permissions.\n- **Select CI/CD platform**: Prompts you to choose between GitHub Actions or Azure Pipelines.\n- **Configure repository**: Guides you to connect to or create a repository.\n- **Set up service principal**: Automatically creates and configures a service principal for secure deployment.\n- **Configure authentication**:\n  - For GitHub: Sets up OpenID Connect (OIDC) or client credentials.\n  - For Azure Pipelines: Sets up client credentials and requests a Personal Access Token (PAT).\n- **Provision pipeline files**: Copies the appropriate pipeline definition files (`azure-dev.yml`) from the template to your repository.\n- **Set pipeline variables and secrets**: Configures required variables and secrets for deployment.\n- **Commit and push changes**: Commits and pushes the pipeline configuration to your repository.\n- **Trigger pipeline runs**: Creates or updates Azure resources and deploys your app.\n\n### Platform-specific details\n\nThe `azd pipeline config` command supports both GitHub Actions and Azure Pipelines, each with unique considerations:\n\n**GitHub Actions:**\n\n- Works with repositories hosted on GitHub.\n- Uses the `.github/workflows` directory for the `azure-dev.yml` configuration file.\n- Supports OpenID Connect (OIDC) for secure authentication by default.\n- Can use client credentials as an alternative authentication method.\n\n**Azure Pipelines:**\n\n- Works with repositories hosted in Azure Pipelines.\n- Uses the `.azuredevops/pipelines` or `.azdo/pipelines` directory for the `azure-dev.yml` configuration file.\n- Uses client credentials for authentication (OIDC not currently supported).\n- Requires a Personal Access Token (PAT) with specific scopes.\n- Supports protected main branches through pull request workflows.\n\n## Template integration\n\nAzure Developer CLI templates can include preconfigured CI/CD pipeline definition files (`azure-dev.yml`) compatible with the `azd pipeline config` command. When you clone a template, you can immediately run `azd pipeline config` to set up your CI/CD pipeline without creating configuration files from scratch.\n\n:::image type=\"content\" source=\"media/configure-devops-pipeline/pipeline-folder-structure.png\" alt-text=\"A screenshot showing a sample pipeline definition file.\":::\n\nTemplates can also include customized pipeline configurations with more variables, secrets, and environment-specific settings through the `azure.yaml` file, making it easy to adapt the pipeline to different project requirements.\n\n## Sample workflow\n\nA typical workflow for using `azd pipeline config` includes:\n\n1. Clone the desired `azd` template repository to your local machine.\n2. Run the `azd pipeline config` command and follow the prompts to set up your pipeline. The first run provisions required Azure resources and triggers a workflow to deploy your app.\n3. After the pipeline is created, commit and push any changes to the repository to trigger the deployment pipeline and update your app.\n4. Monitor pipeline execution on the CI/CD platform to ensure successful deployments or troubleshoot issues.\n\nExplore detailed workflows for each platform:\n\n- [Create a CI/CD pipeline using GitHub Actions](pipeline-github-actions.md)\n- [Create a CI/CD pipeline using Azure Pipelines](pipeline-azure-pipelines.md)\n\nLearn how to create your own pipeline definition files or explore advanced configurations:\n\n- [Create your own pipeline definition files](pipeline-create-definition.md)\n- [Explore advanced configurations](pipeline-advanced-features.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/configure-proxy.md",
    "content": "---\ntitle: Configure a proxy server for the Azure Developer CLI\ndescription: Learn how to configure the Azure Developer CLI (azd) and its dependent tools to work behind a corporate proxy server or firewall.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 12/19/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Configure a proxy server for the Azure Developer CLI\n\nIf your organization requires the use of a proxy server to access internet resources, you must configure the Azure Developer CLI (`azd`) to route traffic through that proxy.\n\n## Configure `azd` proxy settings\n\nSet the following environment variable to use a local proxy server:\n\n### PowerShell\n\n```powershell\n$env:HTTP_PROXY = \"http://proxy.example.com:8080\"\n$env:HTTPS_PROXY = \"http://proxy.example.com:8080\"\n$env:NO_PROXY = \"localhost,127.0.0.1\"\n```\n\n### Bash\n\n```bash\nexport HTTP_PROXY=\"http://proxy.example.com:8080\"\nexport HTTPS_PROXY=\"http://proxy.example.com:8080\"\nexport NO_PROXY=\"localhost,127.0.0.1\"\n```\n\n> [!NOTE]\n> Invalid environment variables values result in various HTTP related error messages when running azd commands.\n\n`azd` uses the Go `net/http` package. `DefaultTransport` is the default implementation of `Transport` and is used by `DefaultClient`. It establishes network connections as needed and caches them for reuse by subsequent calls. It uses HTTP proxies as directed by the environment variables `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` (uppercase or lowercase).\n\n## Next steps\n\n- [Troubleshoot](/azure/developer/azure-developer-cli/troubleshoot)\n- [Environment variables](/azure/developer/azure-developer-cli/manage-environment-variables)\n"
  },
  {
    "path": "articles/azure-developer-cli/configure-template-sources.md",
    "content": "---\ntitle: Configure template sources\ndescription: Learn how to configure the Azure Developer CLI to use different template sources\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Configure and consume template sources\n\nThe Azure Developer CLI is designed around a powerful template system that streamlines deploying and provisioning Azure resources. While developing with `azd`, you have the option to either build your own template, or choose from a configurable list of existing templates. In this article, you learn how to work with template lists and configure your local `azd` installation to support different template list sources.\n\n## Understand template sources\n\nAn `azd` template source points to a JSON configuration file that describes a list of available templates and their essential metadata, such as the name, description, and location of the template source code (usually a GitHub repo). When you enable a template source, the templates it defines are made available to `azd` through other commands. For example, the template source JSON snippet below defines two templates:\n\n```json\n[\n  {\n    \"name\": \"Starter - Bicep\",\n    \"description\": \"A starter template with Bicep as infrastructure provider\",\n    \"repositoryPath\": \"azd-starter-bicep\",\n    \"tags\": [\"bicep\"]\n  },\n  {\n    \"name\": \"Starter - Terraform\",\n    \"description\": \"A starter template with Terraform as infrastructure provider\",\n    \"repositoryPath\": \"azd-starter-terraform\",\n    \"tags\": [\"terraform\"]\n  }\n]\n```\n\nEach template entry in the JSON configuration file includes the following properties:\n\n- **name**: The display name of the template.\n- **description**: A brief summary of what the template does.\n- **repositoryPath**: The path to the template's source code, which can be:\n  - A fully qualified URI to a Git repository, like \"https://dev.azure.com/org/project/_git/repo\".\n  - \"{owner}/{repo}\" for GitHub repositories.\n  - \"{repo}\" for GitHub repositories under the Azure-Samples organization.\n- **tags**: Keywords that help users filter templates with `azd init --filter <tag>` and `azd template list --filter <tag>`.\n\nFor a full example, see [this JSON file](https://github.com/Azure/azure-dev/blob/main/cli/azd/resources/templates.json), which is the default template source included in `azd`.\n\n`azd` allows you to enable multiple template sources at a time. The following template source options are currently available to choose from:\n\n- **awesome-azd** - A list of the templates from the [Awesome AZD gallery](https://azure.github.io/awesome-azd) that is enabled by default.\n- **default** - A small set of curated templates to demonstrate different tech stacks.\n- **file** -  A local/network path that points to a template source JSON configuration file.\n- **url** - An HTTP(S) addressable path that points to a template source JSON configuration file.\n- **gh** - Points to a GitHub repository.\n- **ade** - Points to an Azure Deployment Environment template list. [Learn more about Azure Developer CLI support for Azure Deployment Environments](/azure/developer/azure-developer-cli/ade-integration).\n\n## Work with template sources\n\n`azd` provides several commands to configure template sources.\n\nUse the `azd template source list` command to list all currently configured template sources:\n\n```azdeveloper\nazd template source list\n```\n\nExample output with two configured template sources:\n\n```output\nKey          Name         Type         Location\n\nawesome-azd  Awesome AZD  awesome-azd  https://aka.ms/awesome-azd/templates.json\ndefault      Default      resource\n```\n\nUse the `azd template source add` command to add a new template source. This command accepts the following parameters:\n\n- **key**: The technical name of the template source.\n- **--type, -t**: The template source type - valid values are **file**, **url** and **gh** for GitHub.\n- **--location, -l**: The template source location, which should be a local network or HTTP(S) web URI.\n- **--name, -n**: The template source display name (optional, uses **key** if omitted).\n\n```azdeveloper\nazd template source add <key> --type <file-or-url-or-gh> --location <your-uri> --name <your-display-name>\n```\n\nUse the `azd template source remove` command to remove a template source:\n\n```azdeveloper\nazd template source remove <key>\n```\n\nUse the `azd config reset` command to reset the template configuration back to default settings:\n\n```azdeveloper\nazd config reset\n```\n\n## Work with template lists\n\nAfter you configure your template sources, use the `azd template list` command to list the available templates from those sources:\n\n```azdeveloper\nazd template list\n```\n\nFor example, a default installation of `azd` lists the following templates from the **awesome-azd** template source:\n\n```output\nName                                                         Source       Repository Path\n\nEvent Driven Java Application with Azure Service Bus         Awesome AZD  Azure-Samples/ASA-Samples-Event-Driven-Application\nStatic React Web App with Java API and PostgreSQL            Awesome AZD  Azure-Samples/ASA-Samples-Web-Application\nSAP CAP on Azure App Service Quickstart                      Awesome AZD  Azure-Samples/app-service-javascript-sap-cap-quickstart\nSAP Cloud SDK on Azure App Service Quickstart (TypeScript)   Awesome AZD  Azure-Samples/app-service-javascript-sap-cloud-sdk-quickstart\nJava Spring Apps with Azure OpenAI                           Awesome AZD  Azure-Samples/app-templates-java-openai-springapps\nWordPress with Azure Container Apps                          Awesome AZD  Azure-Samples/apptemplate-wordpress-on-ACA\nBicep template to bootstrap Azure Deployment Environments    Awesome AZD  Azure-Samples/azd-deployment-environments\nStarter - Bicep                                              Awesome AZD  Azure-Samples/azd-starter-bicep\nStarter - Terraform                                          Awesome AZD  Azure-Samples/azd-starter-terraform\n...\n# Additional templates omitted \n```\n\nInclude the `--source` flag to only list templates from a specific source:\n\n```azdeveloper\nazd template list --source <source-name>\n```\n\nTo initialize a template from the displayed list, run the `azd init` command and provide the repository path of the template:\n\n```azdeveloper\nazd init --template <path-value>\n```\n\n## Work with Azure Deployment Environments\n\nThe Azure Developer CLI (`azd`) also provides support for Azure Deployment Environments. An Azure Deployment Environment (ADE) is a preconfigured collection of Azure resources deployed in predefined subscriptions. Azure governance is applied to those subscriptions based on the type of environment, such as sandbox, testing, staging, or production. With Azure Deployment Environments, your can enforce enterprise security policies and provide a curated set of predefined infrastructure as code (IaC) templates.\n\nADE integration is beyond the scope of this article. Learn more about configuring `ade` support in the [Azure Developer CLI support for Azure Deployment Environments](/azure/developer/azure-developer-cli/ade-integration) documentation.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure Developer CLI support for Azure Deployment Environments](/azure/developer/azure-developer-cli/ade-integration)\n> [Template list command reference](/azure/developer/azure-developer-cli/reference#azd-template)\n"
  },
  {
    "path": "articles/azure-developer-cli/container-apps-workflows.md",
    "content": "---\ntitle: Deploying to Azure Container Apps and Container App Jobs\ndescription: Learn how to deploy container apps and container app jobs using image-based or revision-based deployment strategies with Azure Developer CLI (azd).\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 03/10/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Deploy to Azure Container Apps using the Azure Developer CLI\n\nThe Azure Developer CLI (`azd`) supports deploying both Azure Container Apps and Azure Container App Jobs. For Azure Container Apps, `azd` offers two deployment strategies:\n\n- **Image-based strategy**. Separates container app configuration updates from image deployments.\n- **Revision-based strategy**. Combines both into a single deployment and supports advanced rollout patterns.\n\nThe following sections explain both strategies, along with how to deploy Container App Jobs.\n\n## Image-based deployment strategy\n\nIn this strategy, the container app **configuration** is created and updated during `azd provision`, while the **container image** is updated during `azd deploy`.\n\n- The container app definition (resources, environment variables, health probes, and so on) resides in a **Bicep module** applied during provisioning.\n- Only the container image reference (`containers[0].image`) changes during deployment.\n\n### Revision behavior\n\nEach change to the app configuration or image triggers a new revision:\n\n| Step | Command | Applies changes to | Notes |\n|------|----------|--------------------|-------|\n| 1 | `azd provision` | Environment variables, resources, mounts, probes, load balancers | Creates a new revision |\n| 2 | `azd deploy` | Container image | Creates another revision |\n\nEach revision allocates additional replicas in the Container Apps environment, which might temporarily increase resource usage and cost.\n\n> [!NOTE]\n> Advanced rollout patterns, such as blue-green or canary, aren't supported in this strategy.\n\n### Configure image-based deployments\n\nTo ensure that `azd provision` updates an existing container app without overwriting the latest deployed image, perform an **upsert** operation. This pattern is implemented by the **AVM [`container-app-upsert`](https://github.com/Azure/bicep-registry-modules/tree/main/avm/ptn/azd/container-app-upsert)** module and consists of two steps:\n\n1. In your `main.parameters.json`, define a parameter that references the azd-provided variable `SERVICE_{NAME}_RESOURCE_EXISTS`. This variable gets set automatically by `azd` at provision time to indicate whether the resource already exists.\n\n    ```jsonc\n    {\n      \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#\",\n      \"contentVersion\": \"1.0.0.0\",\n      \"parameters\": {\n        \"environmentName\": {\n          \"value\": \"${AZURE_ENV_NAME}\"\n        },\n        \"location\": {\n          \"value\": \"${AZURE_LOCATION}\"\n        },\n        // ... other parameters\n        \"apiExists\": {\n          \"value\": \"${SERVICE_API_RESOURCE_EXISTS}\"\n        }\n      }\n    }\n    ```\n\n1. In your Bicep file, reference the `exists` parameter to control whether the container app should be created or updated. The [`container-app-upsert`](https://github.com/Azure/bicep-registry-modules/tree/main/avm/ptn/azd/container-app-upsert) module encapsulates this logic internally.\n\n    ```bicep\n    @description('Indicates whether the container app resource already exists.')\n    param apiExists bool\n    \n    module api 'br/public:avm/ptn/azd/container-app-upsert:0.1.2' = {\n      name: 'api'\n      params: {\n        name: 'my-api'\n        location: location\n        containerAppsEnvironmentName: containerAppsEnvironment.name\n        containerRegistryName: containerRegistry.name\n        imageName: !empty(apiImageName) ? apiImageName : ''\n        exists: apiExists\n        env: [\n          {\n            name: 'MONGODB_CONNECTION_STRING'\n            value: mongodb.outputs.connectionString\n          }\n        ]\n        targetPort: 3100\n      }\n    }\n    ```\n\n    This approach allows `azd provision` to **upsert** (update if exists, create if not) the container app resource safely without manual checks.\n\n    > [!TIP]\n    > Keep the `apiVersion` in `azure.yaml` aligned with the Bicep module's `apiVersion` for `Microsoft.App/containerApps` to avoid mismatches.\n\n## Revision-based deployment strategy\n\nIn this strategy, both the container app **definition** and **image** are deployed together during `azd deploy`.\n\n- The container app configuration resides in a **dedicated Bicep module** applied during deployment.\n- Changes to environment variables, images, resources, and load-balancing settings are rolled out as a **single revision**.\n\n    > [!TIP]\n    > This strategy supports blue-green, canary, and other advanced rollout patterns.\n\n### Configure revision-based deployments\n\n1. Define the container app deployment by creating an infra file for your service, such as `infra/api.bicep`. You can define your container app by using the **AVM-based module** or by defining the **resource directly**:\n\n    ### [AVM module](#tab/avm-module)\n\n    ```bicep\n    @description('Unique environment name used for resource naming.')\n    param environmentName string\n    \n    @description('Primary location for all resources.')\n    param location string\n    \n    param containerRegistryName string\n    param containerAppsEnvironmentName string\n    param imageName string\n    param identityId string\n    \n    resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' existing = {\n      name: containerRegistryName\n    }\n    \n    resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2022-03-01' existing = {\n      name: containerAppsEnvironmentName\n    }\n    \n    module api 'br/public:avm/res/app/container-app:0.8.0' = {\n      name: 'api'\n      params: {\n        name: 'api'\n        ingressTargetPort: 80\n        scaleMinReplicas: 1\n        scaleMaxReplicas: 10\n        containers: [\n          {\n            name: 'main'\n            image: imageName\n            resources: {\n              cpu: json('0.5')\n              memory: '1.0Gi'\n            }\n          }\n        ]\n        managedIdentities: {\n          systemAssigned: false\n          userAssignedResourceIds: [identityId]\n        }\n        registries: [\n          {\n            server: containerRegistry.properties.loginServer\n            identity: identityId\n          }\n        ]\n        environmentResourceId: containerAppsEnvironment.id\n        location: location\n        tags: {\n          'azd-env-name': environmentName\n          'azd-service-name': 'api'\n        }\n      }\n    }\n    ```\n\n    ### [Direct bicep resource](#tab/bicep-resource)\n\n    If you prefer not to use the AVM module, you can define the container app resource directly.\n\n    ```bicep\n    @description('Unique environment name used for resource naming.')\n    param environmentName string\n    \n    @description('Primary location for all resources.')\n    param location string\n    \n    param containerRegistryName string\n    param containerAppsEnvironmentName string\n    param imageName string\n    param identityId string\n    \n    resource containerRegistry 'Microsoft.ContainerRegistry/registries@2023-01-01-preview' existing = {\n      name: containerRegistryName\n    }\n    \n    resource containerAppsEnvironment 'Microsoft.App/managedEnvironments@2022-03-01' existing = {\n      name: containerAppsEnvironmentName\n    }\n    \n    resource api 'Microsoft.App/containerApps@2025-02-02-preview' = {\n      name: 'api'\n      location: location\n      tags: {\n        'azd-env-name': environmentName\n        'azd-service-name': 'api'\n      }\n      properties: {\n        environmentId: containerAppsEnvironment.id\n        configuration: {\n          ingress: {\n            external: true\n            targetPort: 8080\n            transport: 'http'\n          }\n          registries: [\n            {\n              server: containerRegistry.properties.loginServer\n              identity: identityId\n            }\n          ]\n          activeRevisionsMode: 'Single'\n        }\n        template: {\n          containers: [\n            {\n              image: imageName\n              name: 'main'\n              resources: {\n                cpu: json('0.5')\n                memory: '1.0Gi'\n              }\n            }\n          ]\n          scale: {\n            minReplicas: 1\n            maxReplicas: 10\n          }\n        }\n      }\n      identity: {\n        type: 'UserAssigned'\n        userAssignedIdentities: {\n          '${identityId}': {}\n        }\n      }\n    }\n    ```\n\n    ---\n\n2. Provide parameters at deploy time by creating a parameters file (e.g. `api.parameters.json`):\n\n    ```json\n    {\n      \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#\",\n      \"contentVersion\": \"1.0.0.0\",\n      \"parameters\": {\n        \"environmentName\": { \"value\": \"${AZURE_ENV_NAME}\" },\n        \"location\": { \"value\": \"${AZURE_LOCATION}\" },\n        \"containerRegistryName\": { \"value\": \"${AZURE_CONTAINER_REGISTRY_NAME}\" },\n        \"containerAppsEnvironmentName\": { \"value\": \"${AZURE_CONTAINER_ENVIRONMENT_NAME}\" },\n        \"imageName\": { \"value\": \"${SERVICE_API_IMAGE_NAME}\" },\n        \"identityId\": { \"value\": \"${SERVICE_API_IDENTITY_ID}\" }\n      }\n    }\n    ```\n\n    > [!NOTE]\n    > `SERVICE_API_IMAGE_NAME` is dynamically set during deploy and isn't part of the provision outputs.\n\n    When you run `azd deploy`, the container app revision is applied using the resource definition above.\n\n    > [!TIP]\n    > Pass any additional outputs from `azd provision` as parameters to `azd deploy` if your container app references other provisioned resources.\n\n### Comparison summary\n\n| Aspect | Image-based | Revision-based |\n|--------|-------------|---------------|\n| Update command | `azd provision` + `azd deploy` | `azd deploy` only |\n| Rollout type | Two revisions | Single revision |\n| Rollout control | Managed by `azd` | Configurable (blue-green, canary) |\n| Use case | Simple environments | Advanced deployments |\n| Container app definition location | Provision-time Bicep | Deploy-time Bicep |\n\n## Deploy Container App Jobs\n\nIn addition to Container Apps, `azd` supports deploying Azure Container App Jobs (`Microsoft.App/jobs`). Container App Jobs are designed for tasks that run to completion, such as batch processing, scheduled tasks, or event-driven work.\n\n> [!NOTE]\n> Container App Jobs use the same `host: containerapp` setting in `azure.yaml`. No new host type is required. The Bicep template determines whether `azd` provisions a Container App or a Container App Job based on the resource type you define.\n\n### How it works\n\nWhen `azd` discovers a job resource tagged with `azd-service-name`, it:\n\n1. Builds and pushes the Docker image to Azure Container Registry (same as Container Apps).\n1. Updates the job's container image by calling the Container App Jobs API instead of the Container Apps API.\n1. Returns empty endpoints, because jobs have no ingress.\n\n### Configure a Container App Job deployment\n\n1. Define the `azure.yaml` file for your job service. Use `host: containerapp` and `language: docker`:\n\n    ```yaml\n    name: myapp\n    services:\n      job:\n        host: containerapp\n        language: docker\n        project: ./src/job\n        docker:\n          path: ./Dockerfile\n          context: .\n    ```\n\n1. Create a Bicep module that provisions a `Microsoft.App/jobs` resource. Tag the resource with `azd-service-name` so `azd` can discover it. The parameters and existing resource references (container registry, managed environment, identity) follow the same pattern as the [Container Apps examples above](#revision-based-deployment-strategy):\n\n    ```bicep\n    resource job 'Microsoft.App/jobs@2025-02-02-preview' = {\n      name: 'job'\n      location: location\n      tags: {\n        'azd-env-name': environmentName\n        'azd-service-name': 'job'\n      }\n      properties: {\n        environmentId: containerAppsEnvironment.id\n        configuration: {\n          replicaTimeout: 300\n          replicaRetryLimit: 1\n          triggerType: 'Manual'\n          registries: [\n            {\n              server: containerRegistry.properties.loginServer\n              identity: identityId\n            }\n          ]\n        }\n        template: {\n          containers: [\n            {\n              image: imageName\n              name: 'main'\n              resources: {\n                cpu: json('0.5')\n                memory: '1.0Gi'\n              }\n            }\n          ]\n        }\n      }\n      identity: {\n        type: 'UserAssigned'\n        userAssignedIdentities: {\n          '${identityId}': {}\n        }\n      }\n    }\n    ```\n\n    > [!IMPORTANT]\n    > The `azd-service-name` tag value must match the service name in your `azure.yaml` file. This tag is how `azd` associates the provisioned resource with your service.\n\n1. Run `azd up` to provision and deploy. The CLI automatically detects that the tagged resource is a Container App Job and handles the deployment accordingly.\n\n### Key differences from Container Apps\n\n| Aspect | Container Apps | Container App Jobs |\n|--------|---------------|--------------------|\n| Resource type | `Microsoft.App/containerApps` | `Microsoft.App/jobs` |\n| Ingress/endpoints | Supports HTTP ingress | No ingress (empty endpoints) |\n| Execution model | Long-running services | Run-to-completion tasks |\n| Trigger types | Request-driven | Manual, scheduled, or event-driven |\n| Host setting in `azure.yaml` | `host: containerapp` | `host: containerapp` |\n\n## Additional resources\n\n- [Azure Container Apps overview](/azure/container-apps/overview)\n- [Azure Container Apps Jobs overview](/azure/container-apps/jobs)\n- [Azure Container Apps Bicep reference](/azure/templates/microsoft.app/containerapps)\n- [Azure Container App Jobs Bicep reference](/azure/templates/microsoft.app/jobs)\n- [.NET Aspire overview](/dotnet/aspire/get-started/aspire-overview)\n- [Todo application templates](https://github.com/Azure-Samples/todo-nodejs-mongo-aca) (uses image-based)\n"
  },
  {
    "path": "articles/azure-developer-cli/content-delivery-network-changes.md",
    "content": "---\ntitle: CDN changes impacting the Azure Developer CLI\ndescription: Information regarding critical Content Delivery Network (CDN) changes for azd due to the CDN provider changing from Edgio to Azure Front Door.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 07/22/2025\nms.topic: reference\nms.custom: devx-track-azdevcli\nms.service: azure-dev-cli\n---\n\n# CDN changes for the Azure Developer CLI installation endpoints\n\nThe Content Delivery Network (CDN) endpoint used to download and install `azd` is changing due to the [Azure CDN from Edgio retirement](/azure/cdn/edgio-retirement-faq) effective January 15, 2025. If you install `azd` using a script, it's recommended you use the latest install scripts hosted at `https://aka.ms/install-azd.ps1` and `https://aka.ms/install-azd.sh`. Customers who use this approach will not be impacted by the CDN change.\n\n> [!NOTE]\n> Hard coding the CDN hostname directly to reference install scripts isn't a supported scenario. If your logic depends on the hostname, then future changes to hostnames could result in a breaking change to your application.\n\n## Who is impacted by this change?\n\nYour application or system may be impacted and require updates due to the CDN change if you're using any of the following in your application:\n\n- The `azure/setup-azd@1.0.0` GitHub Action (and earlier versions)\n- Older downloaded versions of `install-azd.ps1` and `install-azd.sh` scripts\n  - The latest versions are available at `https://aka.ms/install-azd.ps1` and `https://aka.ms/install-azd.sh`\n- Any hardcoded references in your system to the older CDN endpoints\n\n## Recommended actions\n\nComplete or verify the following to ensure your system is compatible with the CDN changes:\n\n- Ensure you're using the [latest GitHub Action](https://github.com/marketplace/actions/setup-azd) (`v2`) for `azure/setup-azd` in your workflows.\n- Ensure you're using the latest [Azure DevOps task version](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.azd).\n- Ensure any custom install scripts reference the new host name. There's no change to file paths after the host name.\n\n## Additional information and resources\n\nFor more on this change, follow [the issue in the azd repository](https://github.com/Azure/azure-dev/issues/4661) or read the [FAQs on Microsoft Learn documentation](/azure/cdn/edgio-retirement-faq).\n\nIf you run into any problems or have suggestions, file an issue or start a discussion in the [Azure Developer CLI repository](https://github.com/Azure/azure-dev). You can also explore the [troubleshooting documentation](https://aka.ms/azd-troubleshoot).\n"
  },
  {
    "path": "articles/azure-developer-cli/custom-prompts.md",
    "content": "---\ntitle: Add custom prompts to your azd workflow\ndescription: Learn how to add custom prompts and parameters to the Azure Developer CLI (azd) provisioning flow using Bicep decorators and hooks.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/08/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\nai-usage: ai-generated\n---\n\n# Add custom prompts to your workflow\n\nBy default, `azd up` prompts for three things: environment name, subscription, and location. However, real projects often need extra input, such as an environment type, project owner, or team name. This article describes three approaches for adding custom prompts, from simplest to most flexible. You can mix and match all three approaches in the same template.\n\n## Option 1: Selection list with the @allowed decorator\n\nThe simplest way to add a custom prompt is to use the `@allowed` decorator on a Bicep parameter. When `azd` encounters a parameter with `@allowed` values and no value is provided, it displays an interactive selection list, similar to the built-in subscription and location pickers.\n\nAdd the decorated parameter to your `infra/main.bicep` file:\n\n```bicep\n@description('The environment type')\n@allowed([\n  'dev'\n  'staging'\n  'prod'\n])\nparam environmentType string\n```\n\nWhen you run `azd up`, `azd` automatically presents a pick list for this parameter. The user can navigate by using arrow keys and type to filter, just like the subscription picker.\n\nNo extra configuration is needed. Add the parameter to your Bicep file and `azd` handles the rest.\n\n> [!TIP]\n> Use the `@metadata` decorator with `azd.default` to highlight a default selection:\n>\n> ```bicep\n> @allowed(['dev', 'staging', 'prod'])\n> @metadata({\n>   azd: {\n>     default: 'dev'\n>   }\n> })\n> param environmentType string\n> ```\n>\n> For more decorator options, see [Work with Azure Developer CLI metadata for Bicep input parameters](metadata.md).\n\n## Option 2: Free-text input\n\nIf you need open-ended input instead of a fixed list, declare a parameter with no default value. When `azd` encounters a required parameter that has no default and no value in `main.parameters.json`, it prompts the user for free-text input.\n\nAdd the parameter to your `infra/main.bicep` file:\n\n```bicep\n@description('Who owns this project')\nparam projectOwner string\n```\n\nWhen you run `azd up`, the user types a value and presses Enter.\n\n## Option 3: Hooks for custom logic\n\nBicep decorators cover most scenarios, but sometimes you need more flexibility, such as dynamic lists from an API, conditional prompts, validation, or a custom menu-style UI. In these cases, use a `preprovision` hook to run a custom script before `azd provision`.\n\n### Understand the flow\n\nThe hook approach works through the following chain:\n\n1. A hook script runs and prompts the user with custom menus, validation, or other logic.\n1. The script stores values using `azd env set VARIABLE_NAME value`.\n1. Values persist in `.azure/<env>/.env`.\n1. `main.parameters.json` references the values as `${VARIABLE_NAME}`.\n1. Bicep receives them as regular parameters during provisioning.\n\n### Create the hook script\n\nCreate a hook script that prompts the user and stores the result. The following examples include an idempotency guard that skips the prompt on re-runs if a value is already set, and a `default` case that handles invalid input.\n\n#### [PowerShell](#tab/powershell)\n\nCreate a `hooks/preprovision.ps1` file:\n\n```powershell\nWrite-Host \"========================================\"\nWrite-Host \"  Custom Pre-Provision Configuration\"\nWrite-Host \"========================================\"\n\n# Skip prompt if value is already set\n$existingTeam = $null\n$output = azd env get-value CUSTOM_TEAM_NAME 2>&1\nif ($LASTEXITCODE -eq 0 -and $output) {\n    $existingTeam = $output.Trim()\n}\n\nif ($existingTeam) {\n    Write-Host \"Team name is already set to: $existingTeam\"\n    exit 0\n}\n\nWrite-Host \"Available teams:\"\nWrite-Host \"  1) platform-engineering\"\nWrite-Host \"  2) app-development\"\nWrite-Host \"  3) data-science\"\nWrite-Host \"  4) devops\"\nWrite-Host \"  5) Enter custom value\"\n\n$choice = Read-Host \"Select a team (1-5)\"\n$teamName = switch ($choice) {\n    \"1\" { \"platform-engineering\" }\n    \"2\" { \"app-development\" }\n    \"3\" { \"data-science\" }\n    \"4\" { \"devops\" }\n    \"5\" { Read-Host \"Enter custom team name\" }\n    default {\n        Write-Error \"Invalid selection: $choice\"\n        exit 1\n    }\n}\n\n# Store in azd environment\nazd env set CUSTOM_TEAM_NAME $teamName\nWrite-Host \"Team name set to: $teamName\"\n```\n\n#### [Bash](#tab/bash)\n\nCreate a `hooks/preprovision.sh` file:\n\n```bash\n#!/bin/sh\nset -e\n\necho \"========================================\"\necho \"  Custom Pre-Provision Configuration\"\necho \"========================================\"\n\n# Skip prompt if value is already set\nEXISTING_TEAM=\"\"\nif azd env get-value CUSTOM_TEAM_NAME >/dev/null 2>&1; then\n    EXISTING_TEAM=$(azd env get-value CUSTOM_TEAM_NAME 2>/dev/null)\nfi\n\nif [ -n \"$EXISTING_TEAM\" ]; then\n    echo \"Team name is already set to: $EXISTING_TEAM\"\n    exit 0\nfi\n\necho \"Available teams:\"\necho \"  1) platform-engineering\"\necho \"  2) app-development\"\necho \"  3) data-science\"\necho \"  4) devops\"\necho \"  5) Enter custom value\"\n\nprintf \"Select a team (1-5): \"\nread -r CHOICE\n\ncase $CHOICE in\n    1) TEAM_NAME=\"platform-engineering\" ;;\n    2) TEAM_NAME=\"app-development\" ;;\n    3) TEAM_NAME=\"data-science\" ;;\n    4) TEAM_NAME=\"devops\" ;;\n    5)\n        printf \"Enter custom team name: \"\n        read -r TEAM_NAME\n        ;;\n    *)\n        echo \"Invalid selection: $CHOICE\" >&2\n        exit 1\n        ;;\nesac\n\n# Store in azd environment\nazd env set CUSTOM_TEAM_NAME \"$TEAM_NAME\"\necho \"Team name set to: $TEAM_NAME\"\n```\n\n---\n\n### Map the variable to a Bicep parameter\n\nIn your `main.parameters.json` file, reference the environment variable:\n\n```json\n{\n  \"parameters\": {\n    \"customTeamName\": {\n      \"value\": \"${CUSTOM_TEAM_NAME}\"\n    }\n  }\n}\n```\n\nIn your `main.bicep` file, declare the parameter with a default so `azd` doesn't also prompt for it:\n\n```bicep\n@description('Team name - set by preprovision hook')\nparam customTeamName string = ''\n```\n\n### Enable the hook\n\nAdd the hook configuration to your `azure.yaml`:\n\n```yaml\nhooks:\n  preprovision:\n    windows:\n      shell: pwsh\n      run: hooks/preprovision.ps1\n      interactive: true\n    posix:\n      shell: sh\n      run: hooks/preprovision.sh\n      interactive: true\n```\n\nThe `interactive: true` setting binds the script to the console so it can read user input. For more information on hook configuration, see [Customize your Azure Developer CLI workflows using command and event hooks](azd-extensibility.md).\n\n## Choose the right approach\n\n| Scenario | Approach |\n|---|---|\n| Pick from a fixed list of values. | `@allowed` decorator (Option 1) |\n| Collect free-text input. | Parameter with no default (Option 2) |\n| Dynamic lists, API calls, or conditional logic. | Hook script (Option 3) |\n| Skip all prompts in CI/CD. | Pre-set values (see following section) |\n\n## Skip prompts in CI/CD\n\nAll three options support non-interactive mode. Pre-set values before running `azd` and pass `--no-prompt`:\n\n```bash\n# Set hook values\nazd env set CUSTOM_TEAM_NAME \"platform-engineering\"\n\n# Set Bicep parameter values\nazd env config set infra.parameters.environmentType \"prod\"\nazd env config set infra.parameters.projectOwner \"ci-bot\"\n\n# Run with no prompts\nazd up --subscription <subscription-id> --location eastus --no-prompt\n```\n\nIf a required value is missing, `azd` reports exactly which parameter is missing and shows the `azd env config set` command needed to fix it.\n\n## Related content\n\n- [Work with Azure Developer CLI metadata for Bicep input parameters](metadata.md)\n- [Customize your Azure Developer CLI workflows using command and event hooks](azd-extensibility.md)\n- [Work with Azure Developer CLI environment variables](manage-environment-variables.md)\n- [Bicep parameters and decorators](/azure/azure-resource-manager/bicep/parameters)\n- [Sample repo: azd-custom-parameters](https://github.com/jongio/azd-custom-parameters)\n"
  },
  {
    "path": "articles/azure-developer-cli/demo-mode.md",
    "content": "---\ntitle: Enable demo mode\ndescription: How to enable demo mode\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Enable Azure Developer CLI demo mode\n\nBy default, some Azure Developer CLI commands display Azure subscription IDs in the console output. This behavior is useful during development to monitor deployments and template behavior. However, `azd` also includes a demo mode to hide Azure subscription IDs for scenarios such as public presentations that use `azd` commands, screen sharing with other users, or any other situation where you want to keep your subscription IDs hidden.\n\n## Enable demo mode\n\nDemo mode behavior is based on the environment variable: `AZD_DEMO_MODE`. To enable demo mode, run:\n\n```bash\nexport AZD_DEMO_MODE=true\n```\n\nTo persist demo mode across reboots, you can also run:\n\n## [Bash](#tab/bash)\n\n```bash\nsetx AZD_DEMO_MODE true\n```\n\n## [PowerShell](#tab/powershell)\n\n```bash\n$env:AZD_DEMO_MODE=\"true\"\n```\n\n---\n\n> [!NOTE]\n> After setting the `AZD_DEMO_MODE` environment variables, you may need to close and reopen your terminal window to reload the variable and apply the changes.\n"
  },
  {
    "path": "articles/azure-developer-cli/docker-language-support.md",
    "content": "---\ntitle: \"Use Docker to deploy Go, Rust, and other languages with Azure Developer CLI\"\ndescription: \"Learn how to use Docker as a language in Azure Developer CLI (azd) to build and deploy Go, Rust, Ruby, and other containerized apps to Azure with full control over the build process.\"\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 06/04/2025\nms.topic: reference\nms.custom: devx-track-azdevcli\nms.service: azure-dev-cli\n---\n\n# Use Docker support to deploy containerized apps in any language\n\nThe Azure Developer CLI (`azd`) supports Docker as a language, allowing you to define services that are built and deployed using a Dockerfile. If your app is written in a language that `azd` doesn't have built-in support for — such as Go, Rust, Ruby, PHP, or Kotlin — you can use Docker as the language to build and deploy it to Azure. By specifying Docker as the language, you gain full control over the containerization process, making it ideal for:\n\n- **Go, Rust, Ruby, PHP, Kotlin**, and other languages without built-in `azd` support\n- Polyglot applications (for example, a service that uses both Python and Node.js)\n- Scenarios where you want to reduce local dependencies to run the template\n- Workloads with custom OS or runtime requirements\n- Migrating existing Docker-based projects to Azure\n\nFor example, if you have an app written in Go and want to deploy it to Azure Container Apps with `azd`, you can define a Dockerfile for your Go service and configure `azd` to use it.\n\n## Configure Docker as a language in azure.yaml\n\nTo use Docker for a Go app, Rust app, or any other service, set the `language` property to `docker` in your `azure.yaml` file and specify the path to your Dockerfile:\n\n```yaml\nservices:\n  myservice:\n    project: ./src/myservice\n    language: docker\n    docker:\n      path: ./Dockerfile\n```\n\nWith this configuration, `azd` uses the specified Dockerfile to build and deploy your service. This approach works for any language or runtime that can be containerized.\n\n## Example scenario\n\nThe [`hello-azd`](https://github.com/Azure-Samples/hello-azd) starter template demonstrates how to use Docker as a language in combination with remote builds. In the `azure.yaml` file, the template sets `language: docker` and specifies `remoteBuild: true`:\n\n```yml\nmetadata:\n  template: hello-azd-dotnet\nname: azd-starter\nservices:\n  web:\n    project: ./src\n    language: docker\n    host: containerapp\n    docker:\n      path: ./Dockerfile\n      remoteBuild: true\n```\n\nThis configuration allows users to run the template and build the container image in Azure Container Registry, even if they do not have .NET or Docker installed locally. The build process is handled entirely in the cloud, making it easy for developers to get started without setting up local dependencies or build tools.\n\nBy leveraging remote builds, the `hello-azd` template ensures a consistent and streamlined experience for all users, regardless of their local environment.\n\n## Next steps\n\n- [Use third-party container registries](/azure/developer/azure-developer-cli/use-external-registry)\n- [Remote environment support](/azure/developer/azure-developer-cli/remote-environments-support)\n- [Azure deployment stacks integration](/azure/developer/azure-developer-cli/azure-deployment-stacks-integration)"
  },
  {
    "path": "articles/azure-developer-cli/environment-secrets.md",
    "content": "---\ntitle: Use environment secrets with Azure Developer CLI\ndescription: Learn how to reference Azure Key Vault secrets within your Azure Developer CLI project environment for Bicep parameters, hooks, and CI/CD pipelines.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 03/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\nai-usage: ai-generated\n---\n\n# Use environment secrets with the Azure Developer CLI\n\nThe Azure Developer CLI (`azd`) supports referencing Azure Key Vault secrets within your project environment (the `.env` file). This provides a secure option for working with sensitive data in your `azd` projects. These secrets integrate with various `azd` features, such as hooks and CI/CD pipeline configurations.\n\n## Prerequisites\n\n- [Azure Developer CLI](/azure/developer/azure-developer-cli/install-azd) installed.\n- An [Azure Key Vault](/azure/key-vault/general/quick-create-portal) instance that you have access to, or permissions to create one.\n\n## Set a Key Vault secret\n\nTo set a Key Vault secret, run the `azd env set-secret <name>` command, where `<name>` is the key in the environment that references the Key Vault secret. After you set the secret, `azd` automatically retrieves the value from the Key Vault in the following scenarios.\n\n## Bicep parameters\n\nTo associate a Bicep parameter with the value of an Azure Key Vault secret, follow these steps:\n\n1. Annotate the Bicep parameter as secured by using the `@secure()` keyword.\n1. Create a mapping in the `main.parameters.json` file that links the Bicep parameter to the corresponding key name in the environment that references the Azure Key Vault secret.\n\n> [!NOTE]\n> Environment secrets aren't currently supported when you use Bicep parameter files (`.bicepparam`).\n\n### Example\n\nFrom an `azd` project, run `azd env set-secret MY_SECRET` and follow the prompts to either select an existing Azure Key Vault secret or create a new one. After the command completes, the key `MY_SECRET` holds a reference to a Key Vault secret. Add or select the Bicep parameter that you want to use the value with and designate it as secure:\n\n```bicep\n@secure()\nparam secureParameter string\n```\n\nCreate the mapping in the `main.parameters.json` file:\n\n```json\n{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n      \"secureParameter\": {\n        \"value\": \"${MY_SECRET}\"\n      }\n    }\n}\n```\n\nThe next time you run `azd up` or `azd provision`, `azd` uses the Azure Key Vault secret as the value for your parameter.\n\n## Hooks\n\n`azd` can automatically retrieve Azure Key Vault secrets when a hook runs. By default, when `azd` runs a hook, all key-value pairs from the project environment (the `.env` file) are set in the hook's environment. However, references to Key Vault secrets aren't automatically resolved to their corresponding secret values.\n\nTo resolve these references, follow these steps:\n\n1. Create a mapping from the key in the environment to a new key where the Key Vault secret is resolved.\n1. Use the `secrets` field in the hook definition to create this mapping.\n\n### Example\n\nFrom an `azd` project, run `azd env set-secret MY_SECRET` and follow the prompts to either select an existing Azure Key Vault secret or create a new one. After the command completes, the key `MY_SECRET` references a Key Vault secret. Create a hook definition appropriate for your operating system.\n\n#### [Linux](#tab/linux)\n\n```yaml\nhooks:\n  preprovision: \n    run: 'echo \".env value: $MY_SECRET \\nResolved secret: $SECRET_RESOLVE\"'\n    shell: sh\n    interactive: true\n    secrets:\n      SECRET_RESOLVE: MY_SECRET\n```\n\n#### [Windows](#tab/windows)\n\n```yaml\nhooks:\n  preprovision: \n    run: 'Write-Host \".env value: $env:MY_SECRET `nResolved secret: $env:SECRET_RESOLVE\"'\n    shell: pwsh\n    interactive: true\n    secrets:\n      SECRET_RESOLVE: MY_SECRET\n```\n\n---\n\nThe next time you run `azd provision`, the `preprovision` hook runs and resolves `MY_SECRET` into `SECRET_RESOLVE`.\n\n## Pipeline config\n\n`azd` simplifies the process of setting up continuous integration (CI) for your application. Whether you use GitHub or Azure DevOps, run `azd pipeline config` and follow the guided steps to configure CI/CD.\n\nAs part of the automatic configuration, `azd` creates secrets and variables for your CI/CD deployment workflow. You can also define your own variables and secrets using the `pipeline` configuration in `azure.yaml`. The names you define correspond to keys in your `azd` environment (`.env`). If a key holds a secret reference (`akvs`), `azd` applies different behavior depending on whether you add it as a variable or a secret:\n\n| Approach | CI/CD value stored | Secret rotation | Best for |\n|---|---|---|---|\n| `variables` | Key Vault *reference* (`akvs://...`) | Automatic — pipeline always reads latest value from Key Vault. | When the CI/CD service principal has Key Vault read access. |\n| `secrets` | Actual secret *value* | Manual — rerun `azd pipeline config` after rotation. | When you can't assign Key Vault read access to the service principal. |\n\n> [!NOTE]\n> When you use `variables`, `azd` attempts to assign a read-access role to the service principal used by the CI/CD workflow. If you don't have sufficient permissions to assign the read role for the Key Vault, the operation fails. Use `secrets` instead.\n\n### Example\n\nFrom an initialized `azd` project, run `azd env set-secret SECURE_KEY` and follow the prompts. After the command completes, `azd env get-values` shows the reference:\n\n```\nSECURE_KEY=\"akvs://faa080af-c1d8-40ad-9cce-000000000000/vivazqu-kv/SECURE-KEY-kv-secret\"\n```\n\nAdd `SECURE_KEY` to either the `variables` or `secrets` list in `azure.yaml`:\n\n#### [Variable (reference)](#tab/pipeline-variable)\n\n```yaml\n# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json\nname: your-project-name\npipeline:\n  variables:\n    - SECURE_KEY\n```\n\nWhen you run `azd pipeline config`, `SECURE_KEY` is set as a CI/CD variable with the Key Vault reference as its value. If `SECURE_KEY` is also mapped to a Bicep input parameter or a hook definition, `azd` automatically resolves the secret value at runtime.\n\n#### [Secret (resolved value)](#tab/pipeline-secret)\n\n```yaml\n# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json\nname: your-project-name\npipeline:\n  secrets:\n    - SECURE_KEY\n```\n\nWhen you run `azd pipeline config`, `SECURE_KEY` is set as a CI/CD secret with the actual Key Vault secret value.\n\n---\n"
  },
  {
    "path": "articles/azure-developer-cli/environment-variables-faq.md",
    "content": "---\ntitle: Environment variables FAQ\ndescription: Discover answers to frequently asked questions about environment variables\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Environment variables FAQ\n\nThis article answers frequently asked questions about working with environment variables and the Azure Developer CLI (`azd`).\n\n> [!TIP]\n> For a comprehensive guide on creating and managing environments in Azure Developer CLI, see [Work with environments in Azure Developer CLI](work-with-environments.md).\n\n### What are the differences between `azd` environment variables and system environment variables?\n\n`azd` environment variables are stored in the `.env` file in the `.azure/<environment name>` directory of your project and are separate from your system/OS environment variables. `azd` environment variables configure template provisioning and deployment tasks and are accessible using commands such as [`azd env`](/azure/developer/azure-developer-cli/reference#azd-env) or [`azd env get-values`](/azure/developer/azure-developer-cli/reference#azd-env-get-values).\n\n:::image type=\"content\" source=\"media/faq/environment-folders.png\" alt-text=\"A screenshot of the environment folder structure.\":::\n\nSystem environment variables are not directly accessible through `azd` commands and should be managed with custom shell or PowerShell scripts, generally using `azd` [hooks](/azure/developer/azure-developer-cli/azd-extensibility).\n\n### Can `azd` commands directly read and write system environment variables?\n\nNo, `azd` commands cannot read or write system environment variables. Commands such as [`azd env set`](/azure/developer/azure-developer-cli/reference#azd-env) or [`azd env get-values`](/azure/developer/azure-developer-cli/reference#azd-env-get-values) operate on values stored in the template `.env` file for a specific `azd` environment. `azd` environments are managed using subfolders in the `.azure/<environment name>` directory of your project template, which enables your template to have multiple environments. Environment subfolders hold configuration files such as `.env` that describe the environment.\n\nUse custom shell or PowerShell scripts with `azd` [hooks](/azure/developer/azure-developer-cli/azd-extensibility) to read or write system level environment variables.\n\n### What is the relationship between output variables set in the `main.bicep` file and `azd` environment variables?\n\nOutput variables set in the `main.bicep` file are automatically stored in the `.env` file of your `azd` template. Consider the following output variables in a `main.bicep` template infrastructure file:\n\n```json\noutput API_BASE_URL string = api.outputs.SERVICE_API_URI\noutput REACT_APP_WEB_BASE_URL string = web.outputs.SERVICE_WEB_URI\n```\n\nAfter a successful `azd up` or `azd provision`, `azd` writes these two variables to the `.env` file in the `.azure/<environment name>` directory of your project:\n\n```output\nAPI_BASE_URL=\"<example-api-url>\"\noutput REACT_APP_WEB_BASE_URL=\"<example-app-url>\"\n```\n\nYou can then access those variables from the `.env` file using [`azd env get-values`](/azure/developer/azure-developer-cli/reference#azd-env-get-values).\n\n### Which environment variables are set in the `.env` file by default?\n\nThe following environment variables are set in the `.env` file by default:\n\n| Name  | Description  | Example values  | When available  |\n|---------|---------|---------|---------|\n|`AZURE_ENV_NAME`     | The name of the environment in-use.       | `todo-app-dev`        | When an environment is created (after running azd init or azd env new, for example).        |\n|`AZURE_LOCATION`     | The location of the environment in-use.        |  `eastus2`        |  Right before an environment is provisioned for the first time.       |\n|`AZURE_PRINCIPAL_ID`     | The running user/service principal.       | `925cff12-ffff-4e9f-9580-8c06239dcaa4`        | Determined automatically during provisioning (ephemeral).        |\n|`AZURE_SUBSCRIPTION_ID`    | The targeted subscription.       |  `925cff12-ffff-4e9f-9580-8c06239dcaa4`       | Right before an environment is provisioned for the first time.\n|`SERVICE_<service>_IMAGE_NAME`     | The full name of the container image published to Azure Container Registry for container app services.        | `todoapp/web-dev:azdev-deploy-1664988805`        | After a successful publishing of a `containerapp` image        |\n\n### What is the recommended approach to retrieve `azd` environment variables from the `.env` file? Why would I need to do this?\n\nRetrieve `azd` environment variables using the [`azd env get-values`](/azure/developer/azure-developer-cli/reference#azd-env-get-values) command.\n\n```azdeveloper\nazd env get-values\n```\n\nCommon reasons to access `azd` environment variables include the following:\n\n- Perform additional configuration in hook scripts.\n- Expose the `.env` values from the template to the application code framework, such as Node.js or .NET.\n- Write the `.env` values to system environment variables.\n\n> [!TIP]\n> Use caution when setting system environment variables, as they can cause conflicts with other templates that share the same environment variable names.\n\n### How do I manually set a new `azd` environment variable?\n\nSet additional `azd` environment variables using the [`azd env set`](/azure/developer/azure-developer-cli/reference#azd-env-set) command, providing the key and value for your variable.\n\nCommon reasons to set `azd` environment variables include the following:\n\n- Access Azure resource information created during provisioning that is needed during deployment.\n- Override or change default `azd` environment variable values.\n- Provide additional custom configuration values for use in provisioning, deployment, or custom scripts.\n\n```azdeveloper\nazd env set MY_KEY MyValue\n```\n\n### How do I copy or write `azd` environment variables as system environment variables?\n\nIn some scenarios you may want to copy `azd` environment variables to another environment file or to your system environment for use by language frameworks. For example, you may want to use endpoint URLs from provisioned Azure services to connect to those services in your app code. Use custom scripts to retrieve `azd` environment variables and then set them as system environment variables. It's common to run these scripts as hooks during the `azd` lifecycle, as seen in the following example:\n\n> [!NOTE]\n> Use caution when copying `azd` environment variables to your local system or other operating environments. System environment variables with matching names can be picked up by `azd` and cause conflicts between different `azd` templates or different `azd` environments.\n\n```yml\npostprovision:\n    windows:\n        shell: pwsh\n        run: ./scripts/map-env-vars.ps1\n        interactive: false\n        continueOnError: false\n    posix:\n        shell: sh\n        run: ./scripts/map-env-vars.sh\n        interactive: false\n        continueOnError: false\n```\n\nThe referenced shell script for Linux retrieves the `azd` environment variables and exports them as system environment variables:\n\n```bash\necho \"Loading azd .env file from current environment...\"\n\nwhile IFS='=' read -r key value; do\n    value=$(echo \"$value\" | sed 's/^\"//' | sed 's/\"$//')\n    export \"$key=$value\"\ndone <<EOF\n$(azd env get-values)\nEOF\n```\n\nThe referenced PowerShell script for Windows retrieves the `azd` environment variables and exports them as system environment variables:\n\n```powershell\nWrite-Host \"Loading azd .env file from current environment\"\nforeach ($line in (& azd env get-values)) {\n    if ($line -match \"([^=]+)=(.*)\") {\n        $key = $matches[1]\n        $value = $matches[2] -replace '^\"|\"$'\n        [Environment]::SetEnvironmentVariable($key, $value)\n    }\n}\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Manage environment variables](manage-environment-variables.md)\n> [Customize workflows using command and event hooks](azd-extensibility.md)"
  },
  {
    "path": "articles/azure-developer-cli/environments-overview.md",
    "content": "---\ntitle: Azure Developer CLI Environments Overview\ndescription: Learn essential concepts about environments using Azure Developer CLI (azd).\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 08/04/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, build-2023\n---\n\n# Azure Developer CLI environments overview\n\nThe Azure Developer CLI (`azd`) lets you manage multiple deployment environments for your projects, to keep configurations separate for development, testing, and production. This article explains essential concepts about how you can use environments to manage your development and deployment process.\n\n## What are environments?\n\nAn environment in the Azure Developer CLI (`azd`) is a named set of configurations for a deployment of your app, such as dev, test, or prod. Different environments can be configured with different values. Environments serve several important purposes:\n\n- **Isolation**: Keep development, testing, and production deployments separate.\n- **Configuration management**: Maintain different settings for each environment.\n- **Collaboration**: Enable team members to work with their own environments.\n- **Resource organization**: Group and provision Azure resources by environment.\n- **Reproducibility**: Ensure consistent deployments across different stages.\n\nEach environment has its own Azure resource group and configuration settings. This environment isolation helps prevent changes in one environment from affecting others.\n\n## Environment structure and configuration\n\nAzure Developer CLI (`azd`) environments live in a directory structure within your project:\n\n```txt\n├── .azure                          [Created when you run azd init or azd up]\n│   ├── <environment-name-1>        [Directory for environment-specific configurations]\n│   │   ├── .env                    [Environment variables for this environment]\n│   │   └── config.json             [Additional configuration parameters for this environment]\n│   ├── <environment-name-2>        [Another environment]\n│   │   ├── .env                    \n│   │   └── config.json\n│   └── config.json                 [Global azd configuration]\n```\n\nThe key components of this structure are:\n\n- **`.azure` directory**: The root directory for all environment configurations. Excluded from source control by the `.gitignore` file by default.\n- **Environment-specific directories**: Directories named after your environments, such as `dev`, `test`, `prod`.\n- **`.env` file**: Contains environment-specific variables used by your application and during deployment.\n- **`config.json`**: Used to drive settings that influence `azd` command behavior and features. This file isn't intended to be used directly by end users.\n\n### Environment names\n\nEnvironment naming typically follows these patterns:\n\n- Team projects: `<project-name-[dev/int/prod]>`\n- Personal projects: `<personal-unique-alias-[dev/int/prod]>`\n\nThese naming conventions aren't enforced by `azd` and are configurable by the user.\n\n## Environment variables\n\nAzure Developer CLI [Environment variables](manage-environment-variables.md) provide a way to store configuration settings that influence and might vary between environments. When you run Azure Developer CLI commands, these variables are used to:\n\n- Configure your application settings, such as endpoints for Azure services.\n- Define infrastructure parameters to influence the provisioning process.\n\nThe `.env` file contains these variables in a standard format:\n\n```output\nAZURE_ENV_NAME=dev\nAZURE_LOCATION=eastus\nAZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000\nAZURE_RESOURCE_GROUP=rg-dev-12345\nSERVICE_WEB_HOSTNAME=web-dev-12345.azurewebsites.net\nSERVICE_API_HOSTNAME=api-dev-12345.azurewebsites.net\n```\n\nCommon environment variables include:\n\n| Variable | Description |\n|----------|-------------|\n| `AZURE_ENV_NAME` | Name of the current environment |\n| `AZURE_LOCATION` | Azure region where resources are deployed |\n| `AZURE_SUBSCRIPTION_ID` | ID of the Azure subscription used for this environment |\n| `AZURE_RESOURCE_GROUP` | Name of the resource group for this environment |\n\n> [!TIP]\n> For other common environment variables and service-specific examples, visit the [Environment variables](manage-environment-variables.md) documentation.\n\nWhen working with environment variables:\n\n- Avoid committing `.env` files to source control. If environment configuration needs to be persisted or shared, users should use [Remote environments](remote-environments-support.md).\n- Use consistent naming across environments.\n- Use the `azd env set` command to update variables safely.\n\n> [!WARNING]\n> Never store secrets in an Azure Developer CLI `.env` file. These files can easily be shared or copied into unauthorized locations, or checked into source control. Use services such as Azure Key Vault or Azure Role Based Access Control (RBAC) for protected or secretless solutions.\n\n## Compare other framework environments\n\nMany programming frameworks and tools such as Node.js, Django, or React use `.env` files for configuration. While Azure Developer CLI (`azd`) also uses `.env` files, there are important differences:\n\n| Concept | Azure Developer CLI `.env` | Framework `.env` Files |\n|--------|---------------------------|------------------------|\n| **Location** | Stored in `.azure/<environment-name>/.env` | Typically stored in project root directory |\n| **Environment Support** | Support for multiple user-defined environments (dev, test, prod) | Often require manual file switching or naming conventions (`.env.development`, `.env.production`) |\n| **Loading Mechanism** | Automatically loaded by `azd` commands | Usually require explicit loading in application code or build scripts |\n| **Integration** | Deeply integrated with Azure services and resource provisioning | General purpose configuration, not Azure-specific |\n| **Variable Management** | Managed via `azd env` commands | Typically edited manually or via custom scripts |\n\nWhile both serve similar purposes, Azure Developer CLI's `.env` approach adds structure and tooling designed for managing multiple deployment environments and Azure resources.\n\n> [!NOTE]\n> If your project already uses framework-specific `.env` files, you can keep both configuration systems without conflicts. `azd` environment variables override system environment variables of the same name for some operations.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Work with environments](work-with-environments.md)\n\n> [!div class=\"nextstepaction\"]\n> [Manage environment variables in Azure Developer CLI](manage-environment-variables.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/extensions/azure-ai-foundry-extension.md",
    "content": "---\ntitle: Use the Microsoft Foundry azd agent extension\ndescription: Learn about the Microsoft Foundry azd agent extension and how to scaffold, provision, and deploy an agent end to end.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 12/11/2025\nms.service: azure-dev-cli\nms.topic: tutorial\nms.custom: devx-track-azdevcli, devx-track-ai\nai-usage: ai-generated\n---\n\n# Deploy an agent to Microsoft Foundry with the Azure Developer CLI AI agent extension\n\nIn this article, you learn to use the Azure Developer CLI (`azd`) AI agent extension to set up and deploy an agent in Microsoft Foundry. The extension lets you scaffold and deploy agents from your terminal or editor, combining Foundry capabilities with `azd` lifecycle commands (`azd init`, `azd up`) for a consistent local to cloud workflow.\n\n## Key features\n\n- **Project scaffolding**: Set up complete agent projects (infrastructure as code templates, agent definitions, configuration) and start iterating immediately.\n- **Declarative configuration**: Define services, resources, and model deployments in an `azure.yaml` file for consistent environments.\n- **Unified provisioning and deployment**: Run `azd up` to build containers, push images, create resources, deploy models, and publish the agent in one step.\n- **Agent definition management**: Import agent definitions from catalogs, GitHub, or local paths; the CLI maps required parameters to environment variables.\n- **Secure by default**: Set up managed identities and baseline security automatically without handling credentials manually.\n- **Scalable model provisioning**: Specify model names, versions, and capacity; `azd` deploys them consistently across environments.\n\n## Prerequisites\n\n- The [Azure Developer CLI (`azd`) installed](/azure/developer/azure-developer-cli/install-azd) (version 1.21.3 or later) and authenticated `azd auth login`.\n    - The `azd ai agent` extension installed (`azd extension install azure.ai.agents`). If you don't have the extension installed, when you initialize the starter template or run `azd ai agent` the extension is installed automatically.\n- An [Azure subscription](https://azure.com/free) with permission to create resource groups and Microsoft Foundry resources.\n- The [Azure CLI installed](/cli/azure/install-azure-cli) for required operations.\n\n## Set up and deploy an agent\n\nComplete the following sections to provision and deploy an agent to Microsoft Foundry using the `azd` AI agent extension.\n\n### Initialize Foundry template\n\n1. Initialize a new project with the `azd-ai-starter-basic` template. In an empty folder, run:\n\n    ```bash\n    azd init -t Azure-Samples/azd-ai-starter-basic --location northcentralus\n    ```\n\n    > [!NOTE]\n    > Hosted agents is currently limited to the North Central US Azure region. Read more about [hosted agents regional availbility](/azure/ai-foundry/agents/concepts/hosted-agents) in the Microsoft Foundry documentation.\n\n1. When prompted, enter an environment name for the agent project (for example, \"my-analytics-agent\").\n\n    The `azd init` process:\n\n    - Clones the starter template files into your project\n    - Creates the directory structure with `infra/` (Infrastructure as Code files) and `src/` folders\n    - Generates an `azure.yaml` configuration file\n    - Sets up `.azure/<env>/.env` for environment-specific variables\n\n### Initialize the agent definition\n\nThe starter template provides the project structure, but you need to add a specific agent definition. Agent definitions describe your agent's behavior, tools, and capabilities. Find example definitions in the [Agent Framework repository](https://github.com/microsoft/agent-framework).\n\nUse your own agent definition or one from the catalog. Run the `azd ai agent init` command, with your own `<agent-definition-url>` value:\n\n```bash\nazd ai agent init -m <agent-definition-url>\n```\n\nFor example, use the following URL for a simple calculator agent:\n\n```bash\nazd ai agent init -m https://github.com/microsoft-foundry/foundry-samples/blob/main/samples/python/hosted-agents/langgraph/calculator-agent/agent.yaml\n```\n\nThe `azd ai agent init` command:\n\n- Downloads the agent definition YAML file into your project's `src/` directory\n- Analyzes the agent definition to understand its requirements\n- Updates `azure.yaml` with the corresponding services and configurations\n- Maps agent parameters to environment variables\n\n### Review the project structure\n\nThe initialized template includes these key files:\n\n```text\n├── .azure/                 # Environment-specific settings (.env)\n├── infra/                  # Bicep files for Azure infrastructure\n├── src/                    # Agent definition and code\n└── azure.yaml              # Project configuration\n```\n\nOpen `azure.yaml` to see how the agent project is set up:\n\n```yaml\nrequiredVersions:\n    extensions:\n        azure.ai.agents: latest\nservices:\n    CalculatorAgent:\n        project: src/CalculatorAgent\n        host: azure.ai.agent\n        language: docker\n        docker:\n            remoteBuild: true\n        config:\n            container:\n                resources:\n                    cpu: \"1\"\n                    memory: 2Gi\n                scale:\n                    maxReplicas: 3\n                    minReplicas: 1\n            deployments:\n                - model:\n                    format: OpenAI\n                    name: gpt-4o-mini\n                    version: \"2024-07-18\"\n                  name: gpt-4o-mini\n                  sku:\n                    capacity: 10\n                    name: GlobalStandard\ninfra:\n    provider: bicep\n    path: ./infra\n    module: main\n```\n\nThis declarative configuration defines your agent service and the Azure AI resources it needs, including model deployments.\n\n### Provision and deploy the agent\n\nRun `azd up` to deploy the resources and agent:\n\n```bash\nazd up\n```\n\nThe `azd up` command orchestrates the deployment workflow, from infrastructure to a live agent endpoint:\n\n- **Provision infrastructure**: Create the Microsoft Foundry account, project, and Azure resources defined in the Bicep files.\n      - Pre-provision hooks inspect the agents and their dependencies, models, and other resources, then populates environment variables so that Bicep knows what to provision, including:\n        - `AI_PROJECT_DEPLOYMENTS` (JSON): Specification of the models to deploy.\n        - `AI_PROJECT_CONNECTIONS` (JSON): Specification of the connections to create.\n        - `AI_PROJECT_DEPENDENT_RESOURCES` (JSON): Specification of the dependent resources.\n        - `ENABLE_HOSTED_AGENTS` (boolean): Whether hosted agents need to be provisioned (with an ACR and CapHost).\n- **Deploys models**: Provisions the model deployments specified in `azure.yaml` (for example, GPT-4o-mini with the configured capacity).\n- **Build and push the container**: If the agent has custom code, `azd` packages it into a container image and pushes it to the Azure Container Registry.\n- **Publish the agent**: Create an Agent Application in Microsoft Foundry and deploy the agent as a live, callable service.\n\nWhen `azd up` finishes, the output shows the Microsoft Foundry project endpoint, resource group and project names, and agent application details. The output also provides a direct link to the agent playground in the Microsoft Foundry portal.\n\n> [!NOTE]\n> For a new project, the provisioning and deployment process typically takes several minutes to complete.\n\n#### Identity and security\n\n`azd` automatically configures secure access patterns so you don't have to manage credentials manually:\n\n- **Managed identity**: Your agent uses the Foundry project's system-assigned managed identity to authenticate with other Azure resources.\n- **Role assignments**: `azd` grants required permissions automatically (for example, giving your agent access to Foundry Tools, storage, or databases).\n- **Endpoint security**: Agent endpoints use Microsoft Entra ID (Azure AD) authentication by default, so only authorized users or applications can call your agent.\n\nThese security configurations follow Azure best practices and work out of the box, so you start with a secure foundation.\n\n### Test the agent in Microsoft Foundry\n\n1. Open the [Microsoft Foundry portal](https://ai.azure.com).\n1. Navigate to the project set up by `azd` (the project name appears in the `azd up` output).\n1. Open the **Agents** section to see your deployed agent.\n1. Launch the agent in the playground and send a test query such as \"Summarize your capabilities.\"\n\nYou see the agent's response in the chat window.\n\n## Operate and troubleshoot agents with azd\n\nAfter deploying your agent, use the following `azd` commands to invoke, develop, monitor, and manage it.\n\n### Invoke the agent\n\nUse `azd ai agent invoke` to call your deployed agent remotely or locally. This command sends a message to the agent and returns its response.\n\n```bash\nazd ai agent invoke --message \"What is 12 multiplied by 8?\"\n```\n\n### Run the agent locally\n\nUse `azd ai agent run` to start a local development loop. This command runs your agent on your local machine, picks up changes immediately, and connects to the remote Azure resources defined in your `.azure/<environment-name>/.env` file.\n\n```bash\nazd ai agent run\n```\n\n### Stream real-time logs\n\nUse `azd ai agent monitor` with the `--follow` flag to tail live log output from your deployed agent. This is useful for observing agent behavior and diagnosing issues in real time.\n\n```bash\nazd ai agent monitor --follow\n```\n\n### Check agent health and status\n\nUse `azd ai agent show` to view the current health, deployment status, and endpoint information for your agent.\n\n```bash\nazd ai agent show\n```\n\n### Tear down all resources\n\nUse `azd down` to deprovision all Azure resources created by `azd up`. This removes the Microsoft Foundry account, project, model deployments, container registry, and any other infrastructure defined in your Bicep files.\n\n```bash\nazd down\n```\n\n> [!WARNING]\n> `azd down` permanently deletes all provisioned resources. Use this command with care in shared or production environments.\n\n## Advanced configuration\n\nYou can customize your projects to meet advanced requirements beyond the default workflow.\n\n### Customize model deployments\n\nThe `azure.yaml` file gives you control over which models you deploy. To add or change a model, edit the file:\n\n```yaml\nservices:\n    CalculatorAgent:\n        project: src/CalculatorAgent\n        host: azure.ai.agent\n        language: docker\n        docker:\n            remoteBuild: true\n        config:\n            container:\n                resources:\n                    cpu: \"1\"\n                    memory: 2Gi\n                scale:\n                    maxReplicas: 3\n                    minReplicas: 1\n            deployments:\n                - model:\n                    format: OpenAI\n                    name: gpt-4o-mini\n                    version: \"2024-07-18\"\n                  name: gpt-4o-mini\n                  sku:\n                    capacity: 10\n                    name: GlobalStandard\n```\n\nRun `azd up` to deploy the new model and update your project.\n\nThis sample configuration deploys multiple models so your agent can use a larger model for complex reasoning and a smaller one for simple queries.\n\n### Manage environment variables\n\nEnvironment variables that `azd` sets or uses:\n\n| Variable | Purpose |\n|----------|---------|\n| `AZURE_SUBSCRIPTION_ID` | Target subscription for resources. |\n| `AZURE_RESOURCE_GROUP` | Resource group hosting the AI project. |\n| `AZURE_LOCATION` | Azure region (must support chosen models). |\n| `AZURE_AI_ACCOUNT_NAME` | Microsoft Foundry account (hub). |\n| `AZURE_AI_PROJECT_NAME` | Project hosting the agent. |\n| `AZURE_AI_FOUNDRY_PROJECT_ENDPOINT` | Endpoint for agent management and runtime calls. |\n\nThese variables are stored in `.azure/<environment-name>/.env`. Customize them for each environment (dev, test, and prod).\n\n### Use multiple environments\n\n`azd` supports multiple named environments so you can maintain separate configurations for development, testing, and production without overwriting each other's settings.\n\nCreate a new environment with `azd env new`:\n\n```bash\nazd env new my-agent-prod\n```\n\nSwitch between existing environments with `azd env select`:\n\n```bash\nazd env select my-agent-dev\n```\n\nEach environment has its own `.azure/<environment-name>/.env` file that stores the environment variables listed in the table above. When you run `azd up` or `azd provision`, `azd` targets the currently selected environment. Use this pattern to deploy the same agent definition to different Azure subscriptions or regions.\n\n## Sample use cases and scenarios\n\nUse `azd` and the AI agent extension to accelerate various agent scenarios with Microsoft Foundry.\n\n### Build conversational assistants\n\nCreate agents that answer questions with context and connect to internal data.\n\n- Deploy variants for A/B testing\n- Add Azure AI Search for retrieval-augmented responses\n- Integrate business APIs through custom tools\n\n### Build data and insights agents\n\nDeliver summaries, calculations, and visualizations.\n\n- Connect to Azure SQL Database or Cosmos DB.\n- Use code interpreter tools for computation\n- Mix larger reasoning models with smaller cost efficient models\n\n### Orchestrate multiple agents\n\nCoordinate specialists for complex workflows.\n\n- Add a coordinator agent to route requests.\n- Define relationships declaratively in `azure.yaml`.\n- Scale agents independently based on load.\n\n### Standardize enterprise deployment\n\nDrive consistency across teams.\n\n- Publish reusable blueprints and templates\n- Apply consistent security, compliance, and monitoring\n- Automate provisioning and deployment in CI/CD with `azd provision` and `azd deploy`.\n\n## Explore the ecosystem\n\n- **Explore sample agents**: Browse the [Agent Framework repository](https://github.com/microsoft/agent-framework) for [.NET agents](https://github.com/microsoft/agent-framework/tree/main/dotnet/samples) and [Python agents](https://github.com/microsoft/agent-framework/tree/main/python/samples) and deploy them with `azd ai agent init`.\n- **Join the community**: Share experiences and ask questions in the [Azure Developer CLI GitHub discussions](https://github.com/Azure/azure-dev/discussions).\n- **Report issues and suggest features**: Give feedback and issues or feature suggestions in the [Azure/azure-dev repository](https://github.com/Azure/azure-dev/issues) and tag them with `ai-agent`.\n- **Review documentation**: Visit the [Microsoft Foundry documentation](/azure/ai-foundry/) for comprehensive guides on agent development.\n\n## Additional resources\n\n- [Install the Azure Developer CLI](/azure/developer/azure-developer-cli/install-azd)\n- [Azure Developer CLI documentation](/azure/developer/azure-developer-cli/)\n- [Microsoft Foundry documentation](/azure/ai-foundry/)\n- [Agent Framework repository (samples and tools)](https://github.com/microsoft/agent-framework)\n- [Azure Developer CLI GitHub repository](https://github.com/Azure/azure-dev)\n- [Foundry starter template](https://github.com/Azure-Samples/ai-foundry-starter-basic)\n"
  },
  {
    "path": "articles/azure-developer-cli/extensions/copilot-coding-agent-extension.md",
    "content": "---\ntitle: Quickstart - Enable Copilot Coding Agent Azure access with the azd extension\ndescription: Install and use the Azure Developer CLI coding agent extension to configure a GitHub Copilot Coding Agent with Azure managed identity access.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 10/21/2025\nms.service: azure-dev-cli\nms.topic: quickstart\nms.custom: devx-track-azdevcli\nai-usage: ai-generated\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Connect GitHub Copilot coding agent with Azure MCP Server using azd extensions\n\nUse the Azure Developer CLI (`azd`) coding agent extension (`azure.coding-agent`) to give GitHub Copilot coding agent secure and scoped Azure access with a managed identity. The extension creates the managed identity, configures the federated credential, and sets up the GitHub Actions workflow in your repository.\n\nSee [Extensions overview](overview.md) to learn how extensions add capabilities to `azd`.\n\n## Prerequisites\n\n- Install Azure Developer CLI (`azd`). See [installation instructions](https://github.com/Azure/azure-dev/blob/main/README.md#installupgrade-azure-developer-cli).\n- Azure subscription that lets you create resource groups and managed identities.\n- Local clone of the GitHub repository you enable for Copilot Coding Agent.\n- Repository permissions to:\n   - Update the `copilot` GitHub environment.\n   - Configure Copilot Coding Agent settings.\n   - Push changes to the `.github/workflows` folder.\n- At least one configured Git remote for the repository (required for federated credentials).\n\n## Install or upgrade the Copilot coding agent extension\n\n1. Install for the first time\n\n    ```azdeveloper\n    azd extension install azure.coding-agent\n    ```\n\n    Upgrade to the latest version\n\n    ```azdeveloper\n    azd extension upgrade azure.coding-agent\n    ```\n\n1. Verify it's installed:\n\n    ```azdeveloper\n    azd extension list --installed\n    ```\n\n    You should see `azure.coding-agent` in the list.\n\n## Use the Copilot coding agent extension\n\nThe Copilot coding agent extension automates configuring Azure access via a managed identity for the Copilot coding agent. You also need to perform a few manual steps to complete the setup.\n\n### Enable Azure access\n\n1. Inside the root of your local repository directory, run the following command:\n\n    ```azdeveloper\n    azd coding-agent config\n    ```\n\n1. Follow the on-screen prompts to complete the extension workflow.\n\n    During configuration, the extension:\n\n    - Creates (or reuses) a resource group.\n    - Creates an Azure managed identity.\n    - Assigns the Reader role to that identity scoped to the resource group.\n    - Establishes federated credentials linking the GitHub repository to the managed identity.\n    - Adds (or updates) a `copilot-setup-steps.yml` workflow and related assets.\n    - Guides you to finalize GitHub environment settings for the `copilot` environment.\n\n### Verify setup (optional)\n\n1. List the managed identity in the created (or updated) resource group:\n\n    ```azdeveloper\n    az identity list --resource-group <resource-group-name>\n    ```\n\n1. In GitHub, open the **Settings** > **Environments** > **copilot** environment, and confirm the federated credential entry referencing the managed identity (subject issuer should reflect GitHub).\n\n### Configure Azure MCP Server for the Copilot coding agent\n\n1. The `azd coding agent` extension creates a pull request for a branch with the new GitHub workflow file at `origin/azd-enable-copilot-coding-agent-with-azure`. If you want to use the Azure MCP Server connection in your `main` branch, merge this PR.\n\n    The pull request description and the extension output logs in the console both include a JSON configuration snippet you can use to configure Azure MCP Server for the Copilot coding agent:\n\n    ```json\n    {\n        \"mcpServers\": {\n            \"Azure\": {\n                \"type\": \"local\",\n                \"command\": \"npx\",\n                \"args\": [\n                    \"-y\",\n                    \"@azure/mcp@latest\",\n                    \"server\",\n                    \"start\"\n                ],\n                \"tools\": [\n                    \"*\"\n                ]\n            }\n        }\n    }\n    ```\n\n1. To configure the Azure MCP Server, go to the **Settings** page of your repository.\n1. Select **Copilot -> Coding agent** on the left navigation.\n1. Paste the JSON snippet from the PR into the **MCP configuration** box and select **Save MCP configuration**.\n\n    :::image type=\"content\" source=\"../media/extensions/configure-azure-mcp-server.png\" alt-text=\"A screenshot showing how to configure Azure MCP Server for the Copilot coding agent.\":::\n\n## Test the Copilot coding agent extension\n\n1. Navigate to your repository in GitHub.\n1. Select the **Open agents panels** icon on the top right navigation bar.\n1. In the flyout panel, select the repository and branch that you used for the `azd` command. If you merged the generated pull request into `main`, select `main`.\n1. Enter a prompt that specifically instructs the Copilot coding agent to use the Azure MCP Server you configured, such as:\n\n    ```output\n    Use the Azure MCP Server to list the resource groups in my subscription.\n    Do not traverse or analyze the repository at all. Use only the Azure MCP Server.\n    ```\n\n    Press Enter to run the prompt and instruct Copilot coding agent to create and run a new task.\n\n    > [!NOTE]\n    > You can also run Copilot coding agent tasks on a branch other than `main` by selecting that branch in the flyout panel.\n\n1. Select the task that appears at the bottom of the panel to navigate to the task details page.\n\n    :::image type=\"content\" source=\"../media/extensions/create-copilot-coding-agent-task.png\" alt-text=\"A screenshot showing how to create a new task for Copilot coding agent.\":::\n\n1. Scan through the output to see Copilot coding agent:\n\n    - Start the Azure MCP Server:\n\n        :::image type=\"content\" source=\"../media/extensions/start-azure-mcp-server.png\" alt-text=\"A screenshot showing Azure MCP Server starting.\":::\n\n    - Call various tools to gather information about your Azure resources:\n\n        :::image type=\"content\" source=\"../media/extensions/call-resource-group-tool.png\" alt-text=\"A screenshot showing the resource group tool being called.\":::\n\n    - Display the resource group in the final output:\n\n        :::image type=\"content\" source=\"../media/extensions/resource-groups-found.png\" alt-text=\"A screenshot showing the discovered resource groups.\":::\n\n### Configure permissions on the managed identity\n\nThe `azd coding agent` extension creates an Azure managed identity that the Azure MCP Server uses to access your resources. This setup enables you to assign different roles to the managed identity in order to control the capabilities and permissions of Azure MCP Server.\n\nBy default, the extension assigns only the `Reader` role to the resource group scope. Assign additional roles or widen the scope if the agent needs more capabilities. [See built-in roles](/azure/role-based-access-control/built-in-roles).\n\nFor example, to assign the `Contributor` role at the resource group scope:\n\n```azdeveloper\naz role assignment create --assignee <principal-id-or-client-id> --role Contributor --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>\n```\n\n## Troubleshooting\n\nThe following sections highlight common issues you can experience.\n\n### No git remotes configured\n\nAdd a remote so federated credentials can be generated:\n\n```azdeveloper\ngit remote add origin <https://github.com/<your-org>/<your-repo>.git>\ngit fetch origin\n```\n\n### Must have admin rights to Repository\n\nConfiguring a GitHub repository for the coding agent **requires** admin rights. Without these rights, you won't be able to update the Copilot environment to use managed identity credentials, or update the MCP configuration for the repository.\n\nIf you see this error, you'll need to elevate your rights.\n\n```output\n(!) An error occurred, see the readme for troubleshooting and prerequisites:\n    https://github.com/Azure/azure-dev/blob/main/cli/azd/extensions/azure.coding-agent/README.md\nError: failed to create GitHub environment copilot in repository owner/repository: exit code: 1, stdout: {\"message\":\"Must have admin rights to Repository.\",\"documentation_url\":\"https://docs.github.com/rest/deployments/environments#create-or-update-an-environment\",\"status\":\"403\"}, stderr: gh: Must have admin rights to Repository. (HTTP 403)\n```\n\n### Refresh token expired\n\nSign-in again:\n\n```azdeveloper\nazd auth login\n```\n\nAdd flags such as `--tenant-id <tenant-id>` or `--use-device-code` as needed.\n\n### Improve diagnostic output\n\nUse debug mode:\n\n```azdeveloper\nazd coding-agent config --debug\n```\n\nAll internal commands and their output print to the console.\n\n## Next steps\n\n- Expand identity permissions (only as needed) using role assignments\n- Integrate additional automation by extending the workflow in `.github/workflows/`\n- Explore other extension capabilities: [Extensions overview](overview.md)\n- [Review Azure RBAC concepts](/azure/role-based-access-control/role-assignments-cli)\n\n## Contributing\n\nTo contribute to Azure Developer CLI resources, see [the contributing guide](https://github.com/Azure/azure-dev/blob/main/cli/azd/CONTRIBUTING.md). Pull requests might require signing a Contributor License Agreement.\n\n## Code of conduct\n\nThis project follows the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\n"
  },
  {
    "path": "articles/azure-developer-cli/extensions/overview.md",
    "content": "---\ntitle: Azure Developer CLI (azd) extensions overview\ndescription: Learn what azd extensions are, why to use them, and how to enable, manage, and install extensions in the Azure Developer CLI.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 05/14/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, devx-track-bicep\n---\n\n# Azure Developer CLI extensions overview\n\nAzure Developer CLI (`azd`) extensions are modular components that extend the functionality of the Azure Developer CLI. They allow you to add new capabilities, automate workflows, and integrate with other services directly from the CLI. Extensions help you tailor `azd` to evolving team needs and Azure scenarios.\n\n> [!NOTE]\n> `azd` extensions are currently in beta.\n\n## Manage extension sources\n\nExtensions are distributed and managed through extension sources, making it easy to discover, install, and update them as your requirements grow.\n\n- Extension sources are file or URL based manifests that provide lists of available `azd` extensions.\n- Users can add custom extension sources that connect to private, local, or public registries.\n- Extension sources are an equivalent concept to NuGet or Node Package Manager (NPM) feeds and must adhere to the [official extension registry schema](https://github.com/Azure/azure-dev/blob/main/cli/azd/extensions/registry.schema.json).\n\n`azd` provides two extension source registries to help you get started with extensions:\n\n- The **official extension source registry** is preconfigured in `azd` and is hosted at [https://aka.ms/azd/extensions/registry](https://aka.ms/azd/extensions/registry).\n- The **development extension registry** can also be added to your `azd` configuration. This opt-in registry contains experimental extensions for internal testing that may or may not become official extensions.\n\nTo opt-in for the development registry run the following command:\n\n```bash\n# Add a new extension source name 'dev' to your `azd` configuration.\nazd extension source add -n dev -t url -l \"https://aka.ms/azd/extensions/registry/dev\"\n```\n\n> [!CAUTION]\n> Extensions hosted in the dev registry DO NOT contain signed binaries at the moment.\n\n### Extension source commands\n\nUse the following commands to manage extension sources for your `azd` installation.\n\n**List installed extension sources**\n\n```azdeveloper\nazd extension source list\n```\n\n**Add a new extension source**\n\n```azdeveloper\nazd extension source add -n <name> -t url -l <registry-url>\n```\n\n- `-l, --location`: The location of the extension source.\n- `-n, --name`: The name of the extension source.\n- `-t, --type`: The type of extension source. Supported types are file and url.\n\n**Remove an extension source**\n\n```azdeveloper\nazd extension source remove <name>\n```\n\n## Manage extensions\n\nOnce extensions are enabled and your extension sources are configured, you can install extensions to add new capabilities to `azd`. Visit the [Quickstart - use the AI extension](quickstart-ai-extension.md) article for an example of working with extensions.\n\n**List extensions**\n\n```azdeveloper\nazd extension list [flags]\n```\n\n- `--installed` Displays a list of installed extensions.\n- `--source` Only list extensions from the specified source.\n- `--tags` Allows filtering extensions by tags (AI, test)\n\n**Install an extension**\n\n```azdeveloper\nazd extension install <extension-names> [flags]\n```\n\nReplace `<extension-name>` with the name of the extension you want to install.\n\n- `-v, --version` Specifies the version constraint to apply when installing extensions.\n- `-s, --source` Specifies the extension source used for installations.\n\n**Upgrade an extension**\n\n```azdeveloper\nazd extension upgrade <extension-name>\n```\n\n- `--all` Upgrades all previously installed extensions when specified.\n- `-v, --version` Upgrades a specified extension using a version constraint, if provided.\n- `-s, --source` Specifies the extension source used for installations.\n\n**Uninstall an extension**\n\n```azdeveloper\nazd extension uninstall <extension-name>\n```\n\n- `--all` Removes all installed extensions when specified.\n\n## Use azd extensions in dev containers\n\n[!INCLUDE [extensions-dev-container](../includes/extensions-dev-container.md)]\n\n## Next steps\n\n- [Quickstart - use the AI extension](quickstart-ai-extension.md)\n- [Extension framework readme](https://github.com/Azure/azure-dev/blob/main/cli/azd/docs/extensions/extension-framework.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/extensions/quickstart-ai-extension.md",
    "content": "---\ntitle: Explore the demo extension\ndescription: Use the demo extension to explore Azure Developer CLI extension capabilities.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 05/27/2025\nms.service: azure-dev-cli\nms.topic: quickstart\nms.custom: devx-track-azdevcli, devx-track-bicep\n---\n\n# Quickstart: Explore the demo extension\n\nIn this Quickstart, you install the Azure Developer CLI (`azd`) demo extension and use it to explore `azd` extension framework capabilities. [Extensions](overview.md) provide a way to add new capabilities, automate workflows, and integrate other services with `azd`. The demo extension provides examples of how to implement various features in an extension, such as how to prompt the user for input or display information about the project.\n\n## Initialize the project\n\nTo follow the steps ahead, initialize the `hello-azd` starter template. You can also follow along using your own template.\n\n```azdeveloper\nazd init -t hello-azd\n```\n\n## Install the extension\n\nComplete the following steps to install the demo extension:\n\n1. Ensure that extensions are enabled in your `azd` configuration:\n\n    ```azdeveloper\n    azd config set alpha.extensions on\n    ```\n\n1. Install the demo extension from the official registry:\n\n    ```azdeveloper\n    azd extension install microsoft.azd.demo\n    ```\n\n1. Verify the extension is installed by listing your installed extensions:\n\n    ```azdeveloper\n    azd extension list --installed\n    ```\n\n## Use the demo extension workflow\n\nOnce installed, the demo extension adds new commands to `azd` you can use to explore examples of extension framework capabilities.\n\n1. Run the `azd demo` command to see a list of the available demo commands:\n\n    ```azdeveloper\n    azd demo\n    ```\n\n    The output should resemble the following:\n\n    ```output\n    Demonstrates AZD extension framework capabilities.\n    \n    Usage:\n      azd [command]\n    \n    Available Commands:\n      colors      Displays all ASCII colors with their standard and high-intensity variants.        \n      context     Get the context of the AZD project & environment.\n      listen      Starts the extension and listens for events.\n      prompt      Examples of prompting the user for input.\n      version     Prints the version of the application\n    \n    Flags:\n          --debug   Enable debug mode\n      -h, --help    help for azd\n    \n    Use \"azd [command] --help\" for more information about a command.\n    ```\n\n1. Run the `azd demo version` command to display the version of the app:\n\n    ```azdeveloper\n    azd demo version\n    ```\n\n    The output formatting should resemble the following:\n\n    ```output\n    Version: 0.2.0\n    Commit: 611d05a6f7190f3bda379e92b4ece6470584c6f0\n    Build Date: 2025-04-23T17:21:58Z\n    ```\n\n1. Run the `azd demo context` command to display the context of the `azd` project and environment:\n\n    ```azdeveloper\n    azd demo context\n    ```\n\n1. Run the `azd demo prompt` command to explore examples of how to prompt the user for input using an extension:\n\n    ```azdeveloper\n    azd demo prompt\n    ```\n\n    The first step of the workflow demonstrates how to filter a list:\n\n    ```output\n    ? Which Azure services do you use most with AZD?: Container Apps\n\n      Filter: Type to filter list\n    \n      > [✔] Container Apps\n        [ ] Functions\n        [ ] Static Web Apps\n        [ ] App Service\n        [ ] Cosmos DB\n        [ ] SQL Database\n        ...\n    ````\n\n    Select **Container Apps** and press Enter. Continue through the remaining prompts to see examples of other prompt options, such as boolean **Yes/No** or list selections.\n\n## Related content\n\n- [Extensions overview](overview.md)\n- [Extension framework readme](https://github.com/Azure/azure-dev/blob/main/cli/azd/docs/extensions/extension-framework.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/feature-versioning.md",
    "content": "---\ntitle: Azure Developer CLI versioning and feature release strategy\ndescription: Learn about the versioning and feature release strategy of the Azure Developer CLI\nkeywords: azure developer cli, azd\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 07/22/2025\nms.topic: how-to\nms.service: azure-dev-cli\nms.custom: devx-track-azdevcli\n---\n\n# Azure Developer CLI feature versioning and release strategy\n\nAzure Developer CLI (`azd`) features are introduced and supported using a phased approach. Features begin in the **alpha** stage and then advance to **beta** and **stable** after meeting various criteria. This article describes the definitions, expectations and advancement requirements for each phase. See a full list of each feature /command supported by `azd` and its current stage [on GitHub](https://github.com/Azure/azure-dev/blob/main/cli/azd/docs/feature-stages.md)\n\n## Alpha Features\n\nAll features start as **alpha** features (e.g., experimental). In this phase, the goal is to receive sufficient usage to get meaningful feedback around the feature's design, functionality and user experience. Alpha features can be enabled and managed using the [`azd config`](reference.md) command.\n\n> [!IMPORTANT]\n> **Alpha** features are only recommended for non-business-critical scenarios with caution as there is a small chance of incompatible changes in subsequent releases leading up to stable.\n\n### Definition\n\n* These features are under active development.\n* Features are hidden behind a feature flag, which interested users must explicitly opt into. \n* There are no guarantees about the long-term stability or support of experimental features.\n* No commitment that the feature is something the product team plans to advance to preview or stable stage (it's an experiment).\n\n### How to opt into alpha features\n\n1. To list available experimental features, run:\n\n    ```azdeveloper\n    azd config list-alpha\n    ```\n\n1. To enable a specific experimental feature, e.g. `resourceGroupDeployments` to support infrastructure deployments at resource group scope, run:\n\n    ```azdeveloper\n    azd config set alpha.resourceGroupDeployments on\n    ```\n\n1. To disable the `resourceGroupDeployments` feature, run:\n\n    ```azdeveloper\n    azd config set alpha.resourceGroupDeployments off\n    ```\n\n    For more information, visit the [azure-dev](https://github.com/Azure/azure-dev/blob/main/cli/azd/docs/alpha-features.md) GitHub repository.\n\n### Advancement criteria (how to reach beta)\n\n* The feature has been properly spec'd and approved by the product team.\n* The product team has formally signed off on advancing the feature to next phase.\n* The feature is documented and help text is available in the product.\n* Confirmation that the UX is successful via sufficient user feedback.\n\n## Beta Features\n\nThe goal of this phase is to improve the feature experience and advance beyond proof of concept.\n\n> [!IMPORTANT]\n> **Beta** features are only recommended for non-business-critical scenarios with caution as there is a small chance of incompatible changes in subsequent releases leading up to stable.\n\n### Definition\n\n* Unlike **alpha** features, a user doesn't need to take explicit action to use a **beta** feature.\n* Reduced number of breaking changes across releases for **beta** features as functionality matures updates are made based on customer feedback.\n* Breaking changes are documented with explanations regarding how to digest these breaks.\n* Beta commands are denoted as such (Beta) in azd product help.\n\n### Advancement criteria (how to reach stable)\n\n* The Product team has formally reviewed and signed off on feature advancement to next phase.\n* The feature is functionally complete and stable.\n* Feature has been thoroughly manually tested and has sufficient unit and integration tests to catch regressions and bugs.\n* Any remaining bugs are acceptable and nonblocking for users (e.g., UX improvements).\n* The product team has received signals that the UX is successful via sufficient user feedback.\n* The product team believes that the feature is truly adding value to the end-to-end UX.\n\n## Stable Features\n\n### Definition \n\n* The product team stand behind these features.\n* Breaking changes in these areas are unexpected.\n* The product team ensures that any breaking changes are rolled out in a way that minimizes impact.\n* Use in business-critical scenarios.\n\n[!INCLUDE [request-help](includes/request-help.md)]\n"
  },
  {
    "path": "articles/azure-developer-cli/full-stack-deployment.md",
    "content": "---\ntitle: Full-stack deployment with Azure Developer CLI\ndescription: Learn how to deploy full-stack applications with front-end and back-end services using Azure Developer CLI (azd). Discover deployment strategies and best practices.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/20/2026\nms.service: azure-dev-cli\nms.topic: concept-article\nms.custom: devx-track-azdevcli\nai-usage: ai-generated\n---\n\n# Full-stack deployment with Azure Developer CLI\n\nFull-stack applications that combine front-end and back-end services are a common pattern in modern web development. The Azure Developer CLI (`azd`) supports deploying full-stack applications where the front end and back end are hosted as separate services. This article explains how to deploy full-stack applications using `azd` and highlights strategies and benefits for effective deployment.\n\n## What is a full-stack deployment?\n\nA full-stack deployment with `azd` typically consists of:\n\n- **Front-end service**: A user-facing web application, often built with frameworks like React, Angular, Vue, or Blazor. The front end might be hosted as a static site or as a containerized application.\n- **Back-end service**: An API or service layer that handles business logic, data access, and integrations. The back end is typically hosted in containers or as serverless functions.\n- **Shared resources**: Databases, storage accounts, key vaults, and other Azure resources that both services might use.\n\nBy using `azd`, you can define both services in a single [`azure.yaml`](./azd-schema.md) file and provision them together using infrastructure as code ([Bicep](/azure/azure-resource-manager/bicep/overview) or [Terraform](/azure/developer/terraform/overview)).\n\n## Azure Developer CLI lifecycle\n\nThe Azure Developer CLI follows a structured workflow with distinct lifecycle events:\n\n:::image type=\"content\" source=\"./media/full-stack-deployment/full-stack-azd-lifecycle-light.png\" alt-text=\"Diagram showing the Azure Developer CLI lifecycle with package, provision, and deploy phases.\" :::\n\n1. **Package**: Build your application source code and prepare artifacts for deployment.\n1. **Provision**: Create or update Azure infrastructure resources by using Bicep or Terraform.\n1. **Deploy**: Deploy your packaged application code to the provisioned infrastructure.\n\nThe `azd up` command runs all three phases sequentially. You can also run each phase independently by using `azd package`, `azd provision`, and `azd deploy` for more granular control. Understanding this lifecycle is essential for managing dependencies between services, especially in full-stack deployments where timing and order matter.\n\nFor more information about the `azd` lifecycle and workflow customization, see [Explore the azd up workflow](./azd-up-workflow.md).\n\n## Infrastructure design considerations\n\nWhen designing a full-stack application with `azd`, choose the appropriate Azure hosting services for your front-end and back-end:\n\n| Service type | Hosting options | Use case |\n|-------------|----------------|----------|\n| Front-end | [Azure Static Web Apps](/azure/static-web-apps/), [Azure App Service](/azure/app-service/), [Azure Container Apps](/azure/container-apps/) | Static sites, SPAs, server-rendered apps |\n| Back-end | [Azure Container Apps](/azure/container-apps/), [Azure App Service](/azure/app-service/), [Azure Functions](/azure/azure-functions/), [Azure Kubernetes Service](/azure/aks/) | APIs, microservices, serverless functions |\n\nLearn more about [hosting applications on Azure](/azure/developer/intro/hosting-apps-on-azure).\n\n## Understand interdependency between front-end and back-end applications\n\nFull-stack deployments often encounter circular dependency challenges where each service needs information about the other before it can be fully configured. Understanding these interdependencies helps you design effective deployment workflows.\n\n:::image type=\"content\" source=\"./media/full-stack-deployment/full-stack-circular-dependency-light.png\" alt-text=\"Diagram illustrating circular dependency between front-end and back-end services in full-stack deployments.\" :::\n\n**Front-end needs back-end URL**: Your front-end application typically needs to know the back-end API endpoint URL at build time or runtime. However, the back-end service doesn't have a URL until it's deployed to Azure.\n\n**Back-end needs front-end URL**: Your back-end service might need the front-end URL to configure CORS policies, but the front-end doesn't have a URL until it's deployed.\n\n**Shared resource dependencies**: Both services might depend on shared resources like databases, key vaults, or storage accounts. These resources must be provisioned before either service can be configured to use them.\n\n**Environment-specific configuration**: Different environments (development, staging, production) require different endpoint URLs and configurations, but these values aren't known until provisioning completes.\n\n## Understand configuration strategies\n\nAzure Developer CLI handles these interdependencies through two approaches: \n- Deploy-time configuration: Resolve dependencies during provisioning and deployment\n- Runtime configuration: Defer dependency configuration to when the application runs \n\nThese approaches represent design decisions you make when building your application. You can use one strategy exclusively or combine both depending on your architecture and requirements.\n\n:::image type=\"content\" source=\"./media/full-stack-deployment/full-stack-deploy-strategies-light.png\" alt-text=\"Diagram comparing deploy-time versus runtime configuration strategies for full-stack deployments.\" :::\n\n### Deploy-time configuration\n\nDeploy-time configuration means that service connections and configurations are determined and locked in during the `azd provision` and `azd deploy` phases. By using this approach, you configure services with specific endpoint URLs, connection strings, and other dependency information before they start running. This configuration becomes part of the deployed service's environment, either as environment variables or in configuration files packaged with the deployment.\n\n**Infrastructure-first provisioning**: When you run `azd up` or `azd provision`, the infrastructure is created first. This step generates the necessary URLs and connection strings before deployment begins, ensuring dependent services have the information they need.\n\n**Output variables**: Bicep and Terraform can output values, like URLs and connection strings, after provisioning. These outputs become available as environment variables during the deployment phase, so you can configure services with the correct endpoints before they start.\n\n**Sequential deployment**: For complex scenarios, you might need to deploy services in a specific order. Use `azd` [hooks](./azd-extensibility.md) to control deployment sequence, ensuring that prerequisite services are running before dependent services are deployed.\n\n**Container upsert pattern**: Azure Verified Modules (AVM) provide container app patterns like `container-app-upsert` that work seamlessly with `azd`'s two-phase workflow. During provisioning, the infrastructure and initial container are created. During deployment, `azd` upserts the container image with updated environment variables that include values generated during provisioning, such as database connection strings or service URLs. This pattern resolves the chicken-and-egg problem by allowing the infrastructure to exist first, then updating the container configuration with all required dependency information.\n\n**Example workflow for a React front-end with a container API back-end**:\n\n1. Run `azd up`, which executes package, provision, and deploy phases sequentially.\n1. During provisioning, Bicep creates Azure Container Apps infrastructure using AVM `container-app-upsert` modules and outputs the back-end API URL.\n1. During deployment, `azd` automatically upserts both containers with the correct environment variables, including the API URL for the front-end.\n1. Both services start with the correct configuration. Future runs of `azd up` or `azd deploy` update the containers with any new configuration values.\n\n### Runtime configuration\n\nRuntime configuration enables applications to load configuration when the application runs instead of during deployment. This approach provides flexibility to update service endpoints, connection strings, and policies without redeploying your application.\n\n**Configuration sources**: Applications can load runtime configuration from two primary sources:\n\n- **Local configuration files**: Deploy a configuration file, such as `config.json`, alongside your application. The application loads this file at startup to get current endpoint URLs, authentication settings, and other configuration values. This approach works well for client-side frameworks like React, Angular, Vue, and Blazor WebAssembly that can fetch configuration when the application starts in the browser.\n\n- **Cloud configuration services**: Use [Azure App Configuration](/azure/azure-app-configuration/overview) or similar services to centrally manage configuration across all environments. Applications query the configuration service at startup or on-demand to retrieve current values. This approach is useful for microservices architectures where multiple services need coordinated configuration updates.\n\n**Benefits**: With either approach, configuration changes become available immediately without redeployment. Update the configuration file through your deployment pipeline, or change values in [Azure App Configuration](/azure/azure-app-configuration/overview) through the Azure portal. When the application restarts or refreshes its configuration, it picks up the new values. This pattern is especially useful for:\n\n- Front-end applications that need to discover back-end API URLs, authentication endpoints, and microservice locations\n- Back-end services that need to update CORS policies as front-end URLs change\n- Services that need different configuration across development, staging, and production environments\n\n**Example workflow for a React front-end discovering a back-end API**:\n\n1. Run `azd up` to provision infrastructure and deploy both services.\n1. A post-deploy hook generates a `config.json` file containing the back-end URL and uploads it to the front-end's storage location.\n1. The React app fetches `config.json` at startup to discover the API endpoint.\n1. To update the endpoint later, modify `config.json` without redeploying the front-end.\n\nThis approach doesn't work for statically generated sites where all content is pre-rendered at build time.\n\n## Plan your deployment workflow\n\nConsider these factors when designing your full-stack deployment:\n\n1. **Identify dependencies**: Map out which services need information from other services. For one-directional dependencies (such as an API depending on a database), the provisioning platform (Bicep or Terraform) handles the ordering automatically. For circular dependencies (such as front-end and back-end services that both need each other's URLs at startup), you must design coordination using deploy-time or runtime configuration strategies.\n1. **Provision before deploy**: Ensure all infrastructure exists before deploying application code. \n1. **Use environment variables**: Pass configuration between infrastructure and application layers by using [azd environment variables](./manage-environment-variables.md).\n1. **Design for multiple environments**: Plan how configuration differs across development, staging, and production environments.\n1. **Consider deployment order**: Some scenarios might require deploying services in a specific sequence.\n\n  The `azd up` command handles most deployment scenarios by automatically running provisioning followed by deployment in a single workflow. For standard single applications, this approach works well and requires minimal configuration. \n\n  For more complicated deployments, such as full stack with circular dependencies: \n\n  - **Configure service order**: In your [`azure.yaml`](./azd-schema.md) file, define services in the order you want them deployed. While `azd` deploys services in parallel by default, you can use [hooks](./azd-extensibility.md) to enforce sequential deployment when needed.\n\n  - **Customize workflow steps**: Override the default [`azd up`](./azd-commands.md) workflow by defining a custom `workflows` property in your [`azure.yaml`](./azd-schema.md) file. For example, you can change the default behavior to run provisioning before building your application source code:\n\n    ```yaml\n    name: todo-nodejs-mongo\n    metadata:\n      template: todo-nodejs-mongo@0.0.1-beta\n    workflows:\n      up: \n        steps:\n          - azd: provision\n          - azd: package\n          - azd: deploy\n    ```\n\n    This pattern is useful when your build process needs configuration values that are only available after provisioning completes.\n\n  - **Separate provision and deploy**: Instead of using [`azd up`](./azd-commands.md), run `azd provision` and `azd deploy` as separate commands. This separation is useful when you need to verify infrastructure configuration before deploying application code, or when troubleshooting deployment issues. You can provision infrastructure once, then deploy and redeploy application code multiple times without reprovisioning.\n\n  - **Customize with hooks**: Add pre and post [hooks](./azd-extensibility.md) in your [`azure.yaml`](./azd-schema.md) file to execute custom logic between provisioning and deployment phases. Use hooks to populate configuration files, validate environment state, or coordinate complex deployment sequences.\n\n## Best practices\n\nWhen building full-stack applications with `azd`, follow these best practices:\n\n1. **Map dependencies early**: Identify which services need information from other services during your design phase. Distinguish between one-directional dependencies that Bicep or Terraform handles automatically and circular dependencies that require deploy-time or runtime configuration strategies.\n1. **Choose the right configuration strategy**: Use deploy-time configuration when services need configuration locked in at deployment. Use runtime configuration when you need flexibility to update configuration without redeployment. Combine both strategies when appropriate.\n1. **Use Azure Verified Modules (AVM)**: Leverage [Azure Verified Modules](/azure/azure-resource-manager/bicep/modules#azure-verified-modules) Bicep modules like [`container-app-upsert`](https://github.com/Azure/bicep-registry-modules/tree/main/avm/ptn/azd/container-app-upsert) for container apps. These patterns work seamlessly with `azd`'s two-phase workflow to resolve circular dependencies.\n1. **Customize workflows when needed**: For simple deployments, use [`azd up`](./azd-commands.md) with default settings. For complex scenarios with circular dependencies, customize the `workflows` property in your [`azure.yaml`](./azd-schema.md) file to control the order of package, provision, and deploy steps.\n1. **Leverage runtime configuration**: For maximum flexibility across environments, use Azure App Configuration or local configuration files to manage service endpoints and settings that you can update without redeployment.\n1. **Test across environments**: Ensure your configuration strategy works correctly across development, staging, and production environments where service URLs and configurations differ.\n\n## Next steps\n\n- [Deploy to Azure Container Apps using the Azure Developer CLI](./container-apps-workflows.md)\n- [Full-stack deployment templates](./full-stack-templates.md)\n- [Azure Developer CLI templates overview](./azd-templates.md)\n- [Explore the azd up workflow](./azd-up-workflow.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/full-stack-templates.md",
    "content": "---\ntitle: Full-stack deployment templates for Azure Developer CLI\ndescription: Discover full-stack deployment templates for Azure Developer CLI (azd) that integrate front-end and back-end services. Start building your app today.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/20/2026\nms.service: azure-dev-cli\nms.topic: reference\nms.custom: devx-track-azdevcli\nai-usage: ai-generated\n---\n\n# Full-stack deployment templates for Azure Developer CLI\n\nThis article introduces full-stack deployment templates for Azure Developer CLI (azd). Use these templates to quickly deploy applications with front-end and back-end services on Azure.\n\n## What are full-stack templates?\n\nFull-stack templates include:\n\n- **Front-end**: A user-facing web application (React, Angular, Vue, Blazor, and so on)\n- **Back-end**: An API or service layer (Node.js, ASP.NET Core, Python, Java, Go)\n- **Infrastructure**: Bicep or Terraform files to provision Azure resources\n- **Configuration**: An `azure.yaml` file that ties everything together\n\nEach template in this list works with `azd` commands like `azd init`, `azd up`, and `azd deploy`.\n\n## How to use these templates\n\nTo get started with any of the templates listed, run:\n\n```azdeveloper\nazd init --template <template-repo-name>\nazd up\n```\n\nFor example, to use the React + Node.js + MongoDB template:\n\n```azdeveloper\nazd init --template todo-nodejs-mongo\nazd up\n```\n\n## JavaScript/TypeScript templates\n\n### [React](#tab/react)\n\n| Template | Front end | Back end | Database | IaC | AVM | Repository |\n|----------|-----------|----------|----------|-----|-----|------------|\n| React + Node.js + MongoDB | React on App Service | Node.js on App Service | Azure Cosmos DB (MongoDB) | Bicep | - | [todo-nodejs-mongo](https://github.com/Azure-Samples/todo-nodejs-mongo) |\n| React + Node.js + MongoDB (Container Apps) | React on Container Apps | Node.js on Container Apps | Azure Cosmos DB (MongoDB) | Bicep | ✅ | [todo-nodejs-mongo-aca](https://github.com/Azure-Samples/todo-nodejs-mongo-aca) |\n| React + Node.js + MongoDB (Terraform) | React on App Service | Node.js on App Service | Azure Cosmos DB (MongoDB) | Terraform | - | [todo-nodejs-mongo-terraform](https://github.com/Azure-Samples/todo-nodejs-mongo-terraform) |\n| React + Node.js + MongoDB (Static Web Apps) | React on Static Web Apps | Node.js on Azure Functions | Azure Cosmos DB (MongoDB) | Bicep | - | [todo-nodejs-mongo-swa-func](https://github.com/Azure-Samples/todo-nodejs-mongo-swa-func) |\n| React + Node.js + MongoDB (Kubernetes) | React on AKS | Node.js on AKS | Azure Cosmos DB (MongoDB) | Bicep | - | [todo-nodejs-mongo-aks](https://github.com/Azure-Samples/todo-nodejs-mongo-aks) |\n\n### [Angular](#tab/angular)\n\n| Template | Front end | Back end | Database | IaC | AVM | Repository |\n|----------|-----------|----------|----------|-----|-----|------------|\n| AI Travel Agents | Angular on Azure Container Apps | Multiple MCP servers (Python, Node.js, Java, .NET) on Azure Container Apps | Azure OpenAI, Azure Cosmos DB | Bicep | - | [azure-ai-travel-agents](https://github.com/Azure-Samples/azure-ai-travel-agents) |\n\n### [Vue](#tab/vue)\n\n| Template | Front end | Back end | Database | IaC | AVM | Repository |\n|----------|-----------|----------|----------|-----|-----|------------|\n| Weather App (Vue + Java Quarkus) | Vue.js on Azure Container Apps | Java (Quarkus) microservices on Azure Container Apps | Azure Database for PostgreSQL, Azure Database for MySQL | Bicep | - | [java-on-aca-quarkus](https://github.com/Azure-Samples/java-on-aca-quarkus) |\n\n---\n\n## .NET templates\n\n### [ASP.NET Core](#tab/aspnet)\n\n| Template | Front end | Back end | Database | IaC | AVM | Repository |\n|----------|-----------|----------|----------|-----|-----|------------|\n| React + C# + SQL Database | React on App Service | ASP.NET Core on App Service | Azure SQL Database | Bicep | - | [todo-csharp-sql](https://github.com/Azure-Samples/todo-csharp-sql) |\n| React + C# + Cosmos DB | React on App Service | ASP.NET Core on App Service | Azure Cosmos DB (NoSQL) | Bicep | - | [todo-csharp-cosmos-sql](https://github.com/Azure-Samples/todo-csharp-cosmos-sql) |\n| React + C# + SQL (Static Web Apps) | React on Static Web Apps | C# on Azure Functions | Azure SQL Database | Bicep | - | [todo-csharp-sql-swa-func](https://github.com/Azure-Samples/todo-csharp-sql-swa-func) |\n\n### [Blazor](#tab/blazor)\n\n| Template | Front end | Back end | Database | IaC | AVM | Repository |\n|----------|-----------|----------|----------|-----|-----|------------|\n| OpenAI MCP Agent (.NET) | Blazor (.NET) on Azure Container Apps | .NET MCP agent, TypeScript MCP server on Azure Container Apps | Azure OpenAI | Bicep | - | [openai-mcp-agent-dotnet](https://github.com/Azure-Samples/openai-mcp-agent-dotnet) |\n| Data API Builder + Cosmos DB | Blazor (.NET) on Azure Container Apps | Data API Builder container | Azure Cosmos DB for NoSQL | Bicep | - | [dab-azure-cosmos-db-nosql-quickstart](https://github.com/azure-samples/dab-azure-cosmos-db-nosql-quickstart) |\n| Cosmos DB Copilot | Blazor (.NET) on Azure App Service | .NET (Semantic Kernel, RAG, multitenant) | Azure Cosmos DB for NoSQL, Azure OpenAI | Bicep | - | [cosmosdb-nosql-copilot](https://github.com/AzureCosmosDB/cosmosdb-nosql-copilot) |\n\n### [.NET Aspire](#tab/aspire)\n\n| Template | Front end | Back end | Database | IaC | AVM | Repository |\n|----------|-----------|----------|----------|-----|-----|------------|\n| Aspire Empty App | None | None | None | - | - | [Aspire Empty App Docs](https://aspire.dev/get-started/aspire-sdk-templates/?dev-environment=aspire-cli#solution-templates) |\n| Aspire Starter App | Blazor (.NET) | ASP.NET Core Minimal API (.NET) | None | - | - | [Aspire Starter App Docs](https://aspire.dev/get-started/aspire-sdk-templates/?dev-environment=aspire-cli#solution-templates) |\n| Aspire Starter App (React) | React | ASP.NET Core Minimal API (.NET) | None | - | - | [Aspire Starter App Docs](https://aspire.dev/get-started/aspire-sdk-templates/?dev-environment=aspire-cli#solution-templates) |\n| Aspire Starter App (FastAPI + React) | React | FastAPI (Python) | None | - | - | [Aspire Starter App Docs](https://aspire.dev/get-started/aspire-sdk-templates/?dev-environment=aspire-cli#solution-templates) |\n\n---\n\n## Python templates\n\n| Template | Front end | Back end | Database | IaC | AVM | Repository |\n|----------|-----------|----------|----------|-----|-----|------------|\n| React + Python + MongoDB | React on App Service | Python (Flask/FastAPI) on App Service | Azure Cosmos DB (MongoDB) | Bicep | - | [todo-python-mongo](https://github.com/Azure-Samples/todo-python-mongo) |\n| React + Python + MongoDB (Container Apps) | React on Container Apps | Python on Container Apps | Azure Cosmos DB (MongoDB) | Bicep | ✅ | [todo-python-mongo-aca](https://github.com/Azure-Samples/todo-python-mongo-aca) |\n| React + Python + MongoDB (Terraform) | React on App Service | Python on App Service | Azure Cosmos DB (MongoDB) | Terraform | - | [todo-python-mongo-terraform](https://github.com/Azure-Samples/todo-python-mongo-terraform) |\n| React + Python + MongoDB (Static Web Apps) | React on Static Web Apps | Python on Azure Functions | Azure Cosmos DB (MongoDB) | Bicep | - | [todo-python-mongo-swa-func](https://github.com/Azure-Samples/todo-python-mongo-swa-func) |\n\n## Java templates\n\n| Template | Front end | Back end | Database | IaC | AVM | Repository |\n|----------|-----------|----------|----------|-----|-----|------------|\n| React + Java + MongoDB | React on App Service | Java (Spring Boot) on App Service | Azure Cosmos DB (MongoDB) | Bicep | - | [todo-java-mongo](https://github.com/Azure-Samples/todo-java-mongo) |\n| React + Java + MongoDB (Container Apps) | React on Container Apps | Java on Container Apps | Azure Cosmos DB (MongoDB) | Bicep | ✅ | [todo-java-mongo-aca](https://github.com/Azure-Samples/todo-java-mongo-aca) |\n\n## Contributing templates\n\nIf you have a full-stack template that you'd like to contribute, see the [Azure Samples contribution guide](https://github.com/Azure-Samples/.github/blob/main/README.md).\n\nYour template should:\n\n- Include both front-end and back-end services\n- Use Azure Verified Modules when possible\n- Follow the [azd template structure](./azd-templates.md)\n- Include a comprehensive README with setup instructions\n- Be listed in the [Awesome AZD](https://azure.github.io/awesome-azd/) gallery\n\n## Next steps\n\n- [Full-stack deployment with Azure Developer CLI](./full-stack-deployment.md)\n- [Azure Developer CLI templates overview](./azd-templates.md)\n- [Deploy to Azure Container Apps using the Azure Developer CLI](./container-apps-workflows.md)\n- [Explore the azd up workflow](./azd-up-workflow.md)\n- [Browse all templates on Awesome AZD](https://azure.github.io/awesome-azd/)\n"
  },
  {
    "path": "articles/azure-developer-cli/get-started.md",
    "content": "---\ntitle: Get started using Azure Developer CLI\ndescription: Learn how to get started with Azure Developer CLI with a template for Node.js.\nkeywords: azure developer cli, azd\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.topic: quickstart\nms.service: azure-dev-cli\nms.custom: devx-track-azdevcli, build-2023, devx-track-extended-java, devx-track-js, devx-track-python\nzone_pivot_group_filename: developer/azure-developer-cli/azd-zone-pivot-groups.json\nzone_pivot_groups: azd-languages-set\n---\n\n# Quickstart: Deploy an Azure Developer CLI template\n\nIn this quickstart, you'll learn how to provision and deploy app resources to Azure using an [Azure Developer CLI (`azd`) template](/azure/developer/azure-developer-cli/azd-templates) and only a few `azd` commands.  `azd` templates are standard code repositories that include your application source code, as well as `azd` configuration and infrastructure files to provision Azure resources. To learn more about `azd` templates and how they can accelerate your Azure provisioning and deployment process see [What are Azure Developer CLI templates?](/azure/developer/azure-developer-cli/azd-templates).\n\n## Select and deploy the template\n\nFor the steps ahead, you'll use the following template to provision and deploy an app on Azure:\n\n::: zone pivot=\"programming-language-nodejs\"\n[React Web App with Node.js API and MongoDB on Azure](https://github.com/azure-samples/todo-nodejs-mongo)\n::: zone-end\n\n::: zone pivot=\"programming-language-python\"\n[React Web App with Python API and MongoDB on Azure](https://github.com/azure-samples/todo-python-mongo)\n::: zone-end\n\n::: zone pivot=\"programming-language-csharp\"\n[React Web App with C# API and MongoDB on Azure](https://github.com/Azure-Samples/todo-csharp-cosmos-sql)\n::: zone-end\n\n::: zone pivot=\"programming-language-java\"\n[Containerized React Web App with Java API and MongoDB on Azure](https://github.com/azure-samples/todo-java-mongo-aca)\n::: zone-end\n\nYou can also select a template that matches your preferences from the [Awesome AZD](https://azure.github.io/awesome-azd/) template gallery site. Regardless of which template you use, you'll end up with the template code in your development environment and be able to run commands to build, redeploy, and monitor the app in Azure.\n\nSelect your preferred environment to continue:\n\n## [Local install](#tab/localinstall)\n\nA local development environment is a great choice for traditional development workflows. You'll clone the template repository down onto your device and run commands against a local installation of `azd`.\n\n### Prerequisites\n\n::: zone pivot=\"programming-language-nodejs\"\n\n- [Install the Azure Developer CLI](./install-azd.md).\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Node.js with npm (v 16.13.1 LTS)](https://nodejs.org/)\n- [Review the architecture diagram and the Azure resources you'll deploy in the Node.js template README](https://github.com/Azure-Samples/todo-nodejs-mongo/blob/main/README.md).\n\n::: zone-end\n\n::: zone pivot=\"programming-language-python\"\n\n- [Install the Azure Developer CLI](./install-azd.md).\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Python 3.8](https://www.python.org/downloads/)\n- [Node.js with npm (v 16.13.1 LTS)](https://nodejs.org/)\n- [Review the architecture diagram and the Azure resources you'll deploy in the Node.js template README](https://github.com/Azure-Samples/todo-python-mongo/blob/main/README.md).\n\n::: zone-end\n\n::: zone pivot=\"programming-language-csharp\"\n\n- [Install the Azure Developer CLI](./install-azd.md).\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [.NET 6.0](https://dotnet.microsoft.com/download/dotnet/6.0)\n- [Review the architecture diagram and the Azure resources you'll deploy in the Node.js template README](https://github.com/Azure-Samples/todo-csharp-cosmos-sql/blob/main/README.md).\n\n::: zone-end\n\n::: zone pivot=\"programming-language-java\"\n\n- [Install the Azure Developer CLI](./install-azd.md).\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [OpenJDK 17](/java/openjdk/download#openjdk-17)\n- [Docker](https://docs.docker.com/get-docker/).\n- [Review the architecture diagram and the Azure resources you'll deploy in the Java template README](https://github.com/Azure-Samples/todo-java-mongo-aca/blob/main/README.md).\n\n::: zone-end\n\n### Initialize the project\n\n1. In **File Explorer** or a terminal, create a new empty directory, and change into it.\n\n1. Run the `azd init` command and specify the template you want to use as a parameter:\n\n    ::: zone pivot=\"programming-language-nodejs\"\n  \n    ```azdeveloper\n    azd init --template todo-nodejs-mongo\n    ```\n  \n    ::: zone-end\n  \n    ::: zone pivot=\"programming-language-python\"\n  \n    ```azdeveloper\n    azd init --template todo-python-mongo\n    ```\n  \n    ::: zone-end\n  \n    ::: zone pivot=\"programming-language-csharp\"\n  \n    ```azdeveloper\n    azd init --template todo-csharp-cosmos-sql\n    ```\n  \n    ::: zone-end\n  \n    ::: zone pivot=\"programming-language-java\"\n  \n    ```azdeveloper\n    azd init --template todo-java-mongo-aca\n    ```\n  \n    ::: zone-end\n  \n    Enter an environment name when prompted, such as `azdquickstart`, which sets a naming prefix for the resource group that will be created to hold the Azure resources. [What is an Environment Name in `azd`?](./tooling-environment-faq.md#what-is-an-environment-name)\n  \n    After you specify the environment, `azd` clones the template project to your machine and initializes the project.\n\n### Provision and deploy the app resources\n\n1. Run the `azd auth login` command and `azd` launches a browser for you to complete the sign-in process.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. Run the `azd up` command:\n\n    ```azdeveloper\n    azd up\n    ```\n\n1. Once you are signed-in to Azure, you will be prompted for the following information:\n\n    | Parameter | Description |\n    | --------- | ----------- |\n    | `Azure Location`   | The Azure location where your resources will be deployed. |\n    | `Azure Subscription` | The Azure Subscription where your resources will be deployed. |\n  \n    Select your desired values and press enter. The `azd up` command handles the following tasks for you using the template configuration and infrastructure files:\n  \n    - Creates and configures all necessary Azure resources (`azd provision`), including:\n    - Access policies and roles for your account\n    - Service-to-service communication with Managed Identities\n    - Packages and deploys the code (`azd deploy`)\n\n    When the `azd up` command completes successfully, the CLI displays two links to view resources created:\n\n    - ToDo API app\n    - ToDo web app frontend\n\n    :::image type=\"content\" source=\"media/get-started/urls.png\" alt-text=\"Screenshot of command output listing endpoint URLs.\":::\n\n    > [!NOTE]\n    > You can call `azd up` as many times as you like to both provision and deploy updates to your application.\n    > The deployment may fail due to a resource being undeployable in the selected region. Because this is a quick start, it is safe to delete the `.azure` directory and try `azd up` again. When asked, select a different region. In a more advanced scenario you could selectively edit files within the `.azure` directory to change the region.\n\n## [Visual Studio Code](#tab/visual-studio-code)\n\nThe Azure Developer CLI provides a Visual Studio Code extension to streamline working with `azd` features. For example, you can use the command palette interface to run `azd` commands. You'll  need to install the Azure Developer CLI extension for Visual Studio Code to complete the steps ahead.\n\n### Install the Azure Developer CLI extension\n\n1. Open Visual Studio Code.\n\n1. From the **View** menu, select **Extensions**.\n\n1. In the search field, enter `Azure Developer CLI`.\n\n    :::image type=\"content\" source=\"media/get-started/install-extension.png\" alt-text=\"Screenshot of the extension installation.\":::\n\n1. Select **Install** and wait for the installation process to complete.\n\n### Initialize a new app\n\n1. Open an empty directory in Visual Studio Code.\n\n2. From the **View** menu, select **Command Palette...**.\n\n3. Search for the `Azure Developer CLI (azd): Initialize app (init)` command and press enter. The `azd up` command instructs `azd` to provision and deploy the app resources.\n\n    :::image type=\"content\" source=\"media/debug/cmd-init.png\" alt-text=\"Screenshot of the option to initialize a new app.\":::\n\n4. Choose the **Select a template** workflow.\n\n   :::image type=\"content\" source=\"media/debug/cmd-select-workflow.png\" alt-text=\"Screenshot of the option to select a workflow.\":::\n\n::: zone pivot=\"programming-language-nodejs\"\n5. Search for the [React Web App with Node.js API and MongoDB on Azure](https://github.com/azure-samples/todo-nodejs-mongo) template and press enter to select it.\n\n    Visual Studio Code clones down the `azd` template. The template includes infrastructure as code files in the `infra` folder and a sample app in the `src` folder. The infrastructure as code files provision the required resources on Azure required by the app when it is deployed.\n::: zone-end\n\n::: zone pivot=\"programming-language-python\"\n5. Search for the [React Web App with Python API and MongoDB on Azure](https://github.com/azure-samples/todo-python-mongo) template and press enter to select it.\n\n    Visual Studio Code clones down the `azd` template. The template includes infrastructure as code files in the `infra` folder and a sample app in the `src` folder. The infrastructure as code files provision the required resources on Azure required by the app when it is deployed.\n::: zone-end\n\n::: zone pivot=\"programming-language-csharp\"\n5. Search for the [React Web App with C# API and MongoDB on Azure](https://github.com/Azure-Samples/todo-csharp-cosmos-sql) template and press enter to select it.\n\n    Visual Studio Code clones down the `azd` template. The template includes infrastructure as code files in the `infra` folder and a sample app in the `src` folder. The infrastructure as code files provision the required resources on Azure required by the app when it is deployed.\n::: zone-end\n\n::: zone pivot=\"programming-language-java\"\n5. Search for the [Containerized React Web App with Java API and MongoDB on Azure](https://github.com/azure-samples/todo-java-mongo-aca) template and press enter to select it.awesome-azd.\n\n    Visual Studio Code clones down the `azd` template. The template includes infrastructure as code files in the `infra` folder and a sample app in the `src` folder. The infrastructure as code files provision the required resources on Azure required by the app when it is deployed.\n::: zone-end\n\n6. After the template is cloned, Visual Studio Code opens a terminal to prompt you for an environment name. Enter a short name of your choosing such as *azdvscode* and press enter.\n\n    ```output\n    Enter a new environment name: [? for help] azdvscode\n    ```\n\n    The environment name influences the naming of resources provisioned in Azure and creates a folder in the `.azure` template directory to store certain environment settings.\n\n### Provision and deploy the app resources\n\n1. Open the Command Palette and search for the `Azure Developer CLI (azd): Package, Provision and Deploy(up)` command and press enter. The `azd up` command instructs `azd` to provision and deploy the app resources.\n\n    Visual Studio Code opens a terminal window to display the progress of the provisioning and deployment process. `azd` uses the subscription and location settings you selected during the `init` process when deploying resources.\n\n    > [!NOTE]\n    > The provisioning and deployment process can take several minutes.\n\n1. When the deploy process complete, select the link in the output window provided by `azd` to launch your site in the browser.\n\n## [Codespaces](#tab/codespaces)\n\nCodespaces are a great option for developers who prefer to work in containerized cloud environments and avoid installing tools or dependencies locally.\n\n### Set up your Codespace\n\n::: zone pivot=\"programming-language-nodejs\"\n1. In your browser, navigate to the [React Web App with Node.js API and MongoDB on Azure](https://github.com/azure-samples/todo-nodejs-mongo) template (or select one from [Awesome AZD](https://azure.github.io/awesome-azd/))\n::: zone-end\n\n::: zone pivot=\"programming-language-python\"\n1. In your browser, navigate to the [React Web App with Python API and MongoDB on Azure](https://github.com/azure-samples/todo-python-mongo) template (or select one from [Awesome AZD](https://azure.github.io/awesome-azd/))\n::: zone-end\n\n::: zone pivot=\"programming-language-csharp\"\n1. In your browser, navigate to the [React Web App with C# API and MongoDB on Azure](https://github.com/Azure-Samples/todo-csharp-cosmos-sql) template (or select one from [Awesome AZD](https://azure.github.io/awesome-azd/))\n::: zone-end\n\n::: zone pivot=\"programming-language-java\"\n1. In your browser, navigate to the [Containerized React Web App with Java API and MongoDB on Azure](https://github.com/azure-samples/todo-java-mongo-aca) template (or select one from [Awesome AZD](https://azure.github.io/awesome-azd/))\n::: zone-end\n\n2. Above the file list, click **Use this template** > **Open in a Codespace**.\n\n  :::image type=\"content\" source=\"media/get-started/codespaces-template-dropdown.png\" alt-text=\"Screenshot demonstrating selecting the option to open a template in a Codespace via the GitHub repo UI.\":::\n\n  With Codespaces, all pre-requisites are installed for you, including the [`azd` Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.azure-dev).\n\n  :::image type=\"content\" source=\"media/get-started/codespaces-initial-set-up.png\" alt-text=\"Screenshot showing what your new Codespace will look like once initiated.\":::\n\n### Run the template\n\n1. Once your Codespace is created, right-click **azure.yaml** in the root directory. From the options, select **up (provision resources, and deploy code to Azure)**.\n\n    :::image type=\"content\" source=\"media/get-started/codespaces-up-command.png\" alt-text=\"Screenshot showing the azure.yaml menu option for running azd up.\":::\n\n1. When you run the `azd up` command, you'll be prompted to provide the following information and to sign in using a web browser and an authentication code:\n\n    :::image type=\"content\" source=\"media/get-started/codespaces-parameters.png\" alt-text=\"Screenshot showing the parameter prompts and the prompt to sign in using your browser.\":::\n\n    | Parameter | Description |\n    | --------- | ----------- |\n    | `Environment Name` | Prefix for the resource group that will be created to hold all Azure resources. [What is an Environment Name in `azd`?](./tooling-environment-faq.md#what-is-an-environment-name) You can always create a new environment with `azd env new`. |\n    | `Azure Location`   | The Azure location where your resources will be deployed. |\n    | `Azure Subscription` | The Azure Subscription where your resources will be deployed. |\n\n    This process may take some time to complete, as the `azd up` command handles the following tasks:\n\n    - Creates and configures all necessary Azure resources (`azd provision`).\n    - Configures access policies and roles for your account.\n    - Implements service-to-service communication with Managed Identities.\n    - Packages and deploys the code (`azd deploy`).\n\n    Once you've provided the necessary parameters and the `azd up` command completes, the CodeSpaces terminal displays two Azure portal links to view resources created:\n\n    - ToDo API app\n    - ToDo web app frontend\n\n    :::image type=\"content\" source=\"media/get-started/urls.png\" alt-text=\"Screenshot of command output listing endpoint URLs.\":::\n\n### What happened?\n\nUpon successful completion of the `azd up` command:\n\n- The [Azure resources referenced in the template's `README.md` file](https://github.com/Azure-Samples/todo-nodejs-mongo/blob/main/README.md) have been provisioned to the Azure subscription you specified after you ran `azd up`. You can now view those Azure resources via the [Azure portal](https://portal.azure.com).\n- The app has been built and deployed to Azure. Using the web app URL output from the `azd up` command, you can browse to the fully functional app.\n\n> [!NOTE]\n> - You can call `azd up` as many times as you like to both provision and deploy your application.\n> - Run and debug that requires launching a web browser is currently not support because of [known limitation with GitHub Codespaces](https://code.visualstudio.com/docs/remote/codespaces#_known-limitations-and-adaptations). For better experience, we recommend using Codespaces in Desktop.\n\n## [DevContainer](#tab/devcontainer)\n\nA [DevContainer](https://code.visualstudio.com/docs/remote/containers) is a Docker image that includes all of the prerequisites you need to work with the `azd` template on your local machine. They're a great choice for developers who prefer containerized environments that still run on a local device instead of a cloud service like GitHub Codespaces.\n\n### Prerequisites\n\n::: zone pivot=\"programming-language-nodejs\"\n\n- [Install the Azure Developer CLI](./install-azd.md).\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Review the architecture diagram and the Azure resources you'll deploy in the Node.js template README](https://github.com/Azure-Samples/todo-nodejs-mongo/blob/main/README.md).\n\n::: zone-end\n\n::: zone pivot=\"programming-language-python\"\n\n- [Install the Azure Developer CLI](./install-azd.md).\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Review the architecture diagram and the Azure resources you'll deploy in the Node.js template README](https://github.com/Azure-Samples/todo-nodejs-mongo/blob/main/README.md).\n\n::: zone-end\n\n::: zone pivot=\"programming-language-csharp\"\n\n- [Install the Azure Developer CLI](./install-azd.md).\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Review the architecture diagram and the Azure resources you'll deploy in the Node.js template README](https://github.com/Azure-Samples/todo-nodejs-mongo/blob/main/README.md).\n\n::: zone-end\n\n::: zone pivot=\"programming-language-java\"\n\n- [Install the Azure Developer CLI](./install-azd.md).\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Review the architecture diagram and the Azure resources you'll deploy in the Java template README](https://github.com/Azure-Samples/todo-java-mongo-aca/blob/main/README.md).\n\n::: zone-end\n\n### Initialize the project\n\n1. Open a terminal, create a new empty directory, and change into it.\n\n1. Run the following command to initialize the project:\n  \n    ::: zone pivot=\"programming-language-nodejs\"\n  \n    ```azdeveloper\n    azd init --template todo-nodejs-mongo\n    ```\n  \n    ::: zone-end\n\n    ::: zone pivot=\"programming-language-python\"\n  \n    ```azdeveloper\n    azd init --template todo-python-mongo\n    ```\n  \n    ::: zone-end\n\n    ::: zone pivot=\"programming-language-csharp\"\n  \n    ```azdeveloper\n    azd init --template todo-csharp-cosmos-sql\n    ```\n  \n    ::: zone-end\n\n    ::: zone pivot=\"programming-language-java\"\n  \n    ```azdeveloper\n    azd init --template todo-java-mongo-aca\n    ```\n  \n    ::: zone-end\n\n    When you run the `azd init` command, you'll be prompted to provide the following information:\n\n    | Parameter | Description |\n    | --------- | ----------- |\n    | `Environment Name` | Prefix for the resource group that will be created to hold all Azure resources. [What is an Environment Name in `azd`?](./tooling-environment-faq.md#what-is-an-environment-name) You can always create a new environment with `azd env new`. |\n\n### Open the DevContainer\n\n1. Open the project in VS Code.\n1. Press F1 and choose: `Remote-Containers: Rebuild and Reopen in Container`\n\n### Run `up` command\n\nRun the following command:\n\n```azdeveloper\nazd up\n```\n\nWhen you run the `azd up` command, you'll be prompted to provide the following information:\n\n| Parameter | Description |\n| --------- | ----------- |\n| `Azure Location`   | The Azure location where your resources will be deployed. |\n| `Azure Subscription` | The Azure Subscription where your resources will be deployed. |\n\nThe `azd up` command may take some time to run as it completes the following steps:\n\n- Creates and configures all necessary Azure resources (`azd provision`), including:\n  - Access policies and roles for your account\n  - Service-to-service communication with Managed Identities\n- Packages and deploys the code (`azd deploy`)\n\nOnce you've provided the necessary parameters and the `azd up` command completes, the CLI displays two Azure portal links to view resources created:\n\n- ToDo API app\n- ToDo web app frontend\n\n:::image type=\"content\" source=\"media/get-started/urls.png\" alt-text=\"Screenshot of command output listing endpoint URLs.\":::\n\n> [!NOTE]\n> You can run `azd up` as many times as you like to both provision and deploy your application to the same region and with the same configuration values you provided on the first run.\n\n---\n\n## Clean up resources\n\nWhen you no longer need the resources created in this article, run the following command to power down the app:\n\n```azdeveloper\nazd down\n```\n\nIf you want to redeploy to a different region, delete the `.azure` directory before running `azd up` again.  In a more advanced scenario you could selectively edit files within the `.azure` directory to change the region.\n\n[!INCLUDE [request-help](includes/request-help.md)]\n\n## Next steps\n\n- [Learn how to run and debug apps with `azd`.](debug.md)\n- [Troubleshoot common problems when using Azure Developer CLI (azd).](troubleshoot.md)\n- [Read the Azure Developer CLI frequently asked questions (FAQ).](tooling-environment-faq.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/helm-kustomize-support.md",
    "content": "---\ntitle: Helm and Kustomize support for Azure Developer CLI\ndescription: How to use helm and Kustomize integration with Azure Developer CLI\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom:\n  - devx-track-azdevcli\n  - sfi-image-nochange\n---\n\n# Helm and Kustomize support\n\nThe Azure Developer CLI provides support for Helm and Kustomize to improve the provisioning and deployment process to Azure Kubernetes Service (AKS). Helm and Kustomize are tools that help you configure and manage Kubernetes applications. In the sections ahead, you learn how to enable and customize support for these tools in your `azd` templates.\n\n## Enable Helm support\n\nTo enable Helm support, make sure you have the Helm CLI installed. Enable the `azd` helm feature flag by running the `azd config` command:\n\n```azurecli\nazd config set alpha.aks.helm on\n```\n\n## Helm configuration and deployment\n\n`azd` Helm support enables you to define a list of Helm charts to install for each `azd` service. Use the `helm` and `k8s` configuration sections in the `azure.yaml` file to define a list of helm repositories or releases to install.\n\n```yml\nname: todo-nodejs-mongo-aks\nmetadata:\n  template: todo-nodejs-mongo-aks@0.0.1-beta\nservices:\n  argocd:\n    host: aks\n    k8s:\n      namespace: argo\n      service:\n        name: argocd-server\n      helm:\n        repositories:\n          - name: argo\n            url: https://argoproj.github.io/argo-helm\n        releases:\n          - name: argocd\n            chart: argo/argo-cd\n            version: 5.51.4\n  jupyterhub:\n    host: aks\n    k8s:\n      namespace: jupyterhub\n      service:\n        name: proxy-public\n      helm:\n        repositories:\n          - name: jupyterhub\n            url: https://hub.jupyter.org/helm-chart/\n        releases:\n          - name: jupyterhub\n            chart: jupyterhub/jupyterhub\n            version: 3.1.0\n```\n\nThe `azd deploy` command handles the following tasks using the `helm` section:\n\n- Adds any referenced Helm repositories and/or updates them\n- Installs the referenced Helm charts\n- Waits for Helm release to transition to a deployed state\n- Lists relevant services and ingresses defined within the deployed resources\n\n:::image type=\"content\" source=\"media/k8s/helm-deploy-output.png\" alt-text=\"A screenshot of the Helm deployment output.\":::\n\n## Enable Kustomize support\n\nTo enable Kustomize support, make sure you have the Kustomize CLI installed. Enable the `azd` Kustomize feature flag using the `azd config` command:\n\n```azurecli\nazd config set alpha.aks.kustomize on\n```\n\n## Kustomize configuration and deployment\n\nThe Kustomize feature enables you to use Kustomize as part of Kubernetes deployments and provides the following features:\n\n- Supports `base` and `variant` configurations\n- `edits` that can be run before deployments\n- `configMapGenerator` with `azd` environments\n\nConfigure Kustomize features using the following `azure.yaml` sections:\n\n- `dir`: Relative path from the service to your Kustomize directory that contains a `kustomization.yaml` file.\n  - Supports environment variable substitution.\n- `edits`: Array of edit expressions that are applied before deployment\n  - Supports environment variable substitution\n- `env`: Map of key/value pairs generated before deployment\n  - Map values support environment variable substitution\n\n## Use cases\n\n`azd` supports the following Kustomize use cases.\n\n### Deploy K8s manifests\n\nThe following configuration performs a `kubectl apply -k <dir>` command that points to your manifests folder that contains a `kustomization.yaml`:\n\n```yml\n# azure.yaml\n\nname: todo-nodejs-mongo-aks\nmetadata:\n  template: todo-nodejs-mongo-aks@0.0.1-beta\nservices:\n  api:\n    project: ./src/api\n    language: js\n    host: aks\n    k8s:\n      kustomize:\n        dir: ./kustomize/base\n```\n\n### Use overlays to deploy to with different variants\n\nThis use case is typically used to have custom configurations for deploying to different stages or environments, such as `dev`, `test` and `prod`. In the following example, the user can specify the `${AZURE_ENV_NAME}` environment variable within the kustomize directory to automatically use the azd environments as your default overlay convention:\n\n```yml\n# azure.yaml\n\nname: todo-nodejs-mongo-aks\nmetadata:\n  template: todo-nodejs-mongo-aks@0.0.1-beta\nservices:\n  api:\n    project: ./src/api\n    language: js\n    host: aks\n    k8s:\n      kustomize:\n        dir: ./kustomize/overlays/${AZURE_ENV_NAME}\n```\n\n### Modify `kustomization.yaml` before deployment\n\nA common use case for modifying the `kustomization.yaml` is to modify the container [image names/versions](https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/images/) used as part of your deployment.\n\nThe following example specifies an `edits` configuration and sets any valid `kustomize edit ...` command. `azd` automatically interpolates any environment variables referenced within the `edit` command.\n\n```yml\n# azure.yaml\n\nname: todo-nodejs-mongo-aks\nmetadata:\n  template: todo-nodejs-mongo-aks@0.0.1-beta\nservices:\n  api:\n    project: ./src/api\n    language: js\n    host: aks\n    k8s:\n      kustomize:\n        dir: ./kustomize/overlays/${AZURE_ENV_NAME}\n        edits:\n          - set image todo-api=${SERVICE_API_IMAGE_NAME}\n```\n\n### Use `azd` environment variables within config maps\n\nConfig maps or secrets are critical in configuring your K8s clusters. Since [kustomize doesn't support any direct environment variable substitution](https://kubectl.docs.kubernetes.io/faq/kustomize/eschewedfeatures/#build-time-side-effects-from-cli-args-or-env-variables) we can use the kustomize `configMapGenerator` with a `.env` file.\n\nThe `kustomize` configuration section supports a `env` section where one or many key/value pairs can be defined. This configuration automatically generates a temporary `.env` file within your kustomization directory that can be used by a `configMapGenerator`.\n\nThe following configuration creates a `.env` with the specified key/value pairs.\n\n```yml\n# azure.yaml\n\nname: todo-nodejs-mongo-aks\nmetadata:\n  template: todo-nodejs-mongo-aks@0.0.1-beta\nservices:\n  api:\n    project: ./src/api\n    language: js\n    host: aks\n    k8s:\n      kustomize:\n        dir: ./kustomize/overlays/${AZURE_ENV_NAME}\n        edits:\n          - set image todo-api=${SERVICE_API_IMAGE_NAME}\n        env:\n          AZURE_AKS_IDENTITY_CLIENT_ID: ${AZURE_AKS_IDENTITY_CLIENT_ID}\n          AZURE_KEY_VAULT_ENDPOINT: ${AZURE_KEY_VAULT_ENDPOINT}\n          APPLICATIONINSIGHTS_CONNECTION_STRING: ${APPLICATIONINSIGHTS_CONNECTION_STRING}\n```\n\nThe `configMapGenerator` generates a K8s config map with the specified name and contains all the key/value pairs referenced within the `.env` file.\n\n```yml\n# kustomization.yaml\n\napiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\n\nresources:\n  - deployment.yaml\n  - service.yaml\n  - ingress.yaml\n\nconfigMapGenerator:\n  - name: todo-web-config\n    envs:\n      - .env\n```\n"
  },
  {
    "path": "articles/azure-developer-cli/hooks-multi-language.md",
    "content": "---\ntitle: Write azd hooks in Python, JavaScript, TypeScript, or .NET\ndescription: Learn how to write Azure Developer CLI hooks in Python, JavaScript, TypeScript, and .NET, with automatic dependency installation and environment management.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/22/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, devx-track-python, devx-track-js, devx-track-ts, devx-track-dotnet\nai-usage: ai-generated\n---\n\n# Write azd hooks in Python, JavaScript, TypeScript, or .NET\n\nThe Azure Developer CLI (`azd`) hook system supports **Python**, **JavaScript**, **TypeScript**, and **.NET** in addition to Bash and PowerShell. `azd` automatically detects the language from the file extension, manages dependencies, and runs the script with no extra configuration required.\n\nHooks let you run custom logic at key points in the `azd` lifecycle, such as before provisioning, after deployment, and more. For general information about hooks, including available hook events and configuration options, see [Customize workflows using command and event hooks](azd-extensibility.md).\n\n## Prerequisites\n\n- [Install azd](/azure/developer/azure-developer-cli/install-azd)\n- The runtime for your chosen language must be installed on your machine:\n  - **Python**: [Python 3.x](https://www.python.org/downloads/)\n  - **JavaScript/TypeScript**: [Node.js](https://nodejs.org/)\n  - **.NET**: [.NET SDK](https://dotnet.microsoft.com/download)\n\n## Language detection\n\nPoint a hook at a script file in `azure.yaml`, and `azd` infers the language from the file extension. If the extension is ambiguous or missing, specify the language explicitly with the `kind` field:\n\n```yaml\nhooks:\n  preprovision:\n    run: ./hooks/setup.py\n    kind: python    # explicit — overrides extension inference\n```\n\n## Python hooks\n\nTo write a Python hook, create a `.py` file and reference it in your `azure.yaml`. Place a `requirements.txt` or `pyproject.toml` in the same directory as the script or a parent directory. `azd` walks up the directory tree from the script location to find the nearest project file, creates a virtual environment, installs dependencies, and runs the script.\n\n### Example directory structure\n\n```\nhooks/\n├── setup.py\n└── requirements.txt\n```\n\n### Example configuration\n\n```yaml\nhooks:\n  preprovision:\n    run: ./hooks/setup.py\n```\n\n### Python-specific configuration\n\nUse the `config` block to override the default virtual environment name.\n\n```yaml\nhooks:\n  preprovision:\n    run: ./hooks/setup.py\n    config:\n      virtualEnvName: .venv   # override default naming\n```\n\n## JavaScript and TypeScript hooks\n\nTo write JavaScript or TypeScript hooks, create a `.js` or `.ts` file and reference it in your `azure.yaml`. Place a `package.json` in the same directory as your script or a parent directory. `azd` runs `npm install` (or the package manager specified in the `config` block) and executes the script. TypeScript scripts run via `npx tsx` with no compile step or `tsconfig.json` needed.\n\n### Example directory structure\n\n```\nhooks/\n├── seed.ts\n└── package.json\n```\n\n### Example configuration\n\n```yaml\nhooks:\n  postdeploy:\n    run: ./hooks/seed.ts\n```\n\n### JavaScript and TypeScript configuration\n\nUse the `config` block to specify a preferred package manager.\n\n```yaml\nhooks:\n  postdeploy:\n    run: ./hooks/seed.ts\n    config:\n      packageManager: pnpm    # npm | pnpm | yarn\n```\n\n## .NET hooks\n\nTwo modes are supported for .NET hooks:\n\n- **Project mode**: If a `.csproj`, `.fsproj`, or `.vbproj` exists in the same directory as the script or a parent directory, `azd` runs `dotnet restore` and `dotnet build` automatically.\n- **Single-file mode**: On .NET 10+, standalone `.cs` files run directly via `dotnet run script.cs` without a project file.\n\n### Example directory structure\n\n```\nhooks/\n├── migrate.cs\n└── migrate.csproj   # optional — omit for single-file mode on .NET 10+\n```\n\n### Example configuration\n\n```yaml\nhooks:\n  postprovision:\n    run: ./hooks/migrate.cs\n```\n\n### .NET-specific configuration\n\nSpecify the build configuration and target framework by using the `config` block:\n\n```yaml\nhooks:\n  postprovision:\n    run: ./hooks/migrate.cs\n    config:\n      configuration: Release  # Debug | Release\n      framework: net10.0      # target framework\n```\n\n## Override the working directory\n\nSet the working directory for a hook by using the `dir` field. This configuration is useful when the project root differs from the script location:\n\n```yaml\nhooks:\n  preprovision:\n    run: main.py\n    dir: hooks/preprovision\n```\n\n## Mix languages and formats\n\nUse different languages for different hooks in the same `azure.yaml` file. You can also combine multi-language hooks with platform-specific overrides:\n\n```yaml\nhooks:\n  preprovision:\n    run: ./hooks/setup.py\n\n  postdeploy:\n    run: ./hooks/seed.ts\n\n  postprovision:\n    run: ./hooks/migrate.cs\n\n  predeploy:\n    windows:\n      run: ./hooks/build.ps1\n    posix:\n      run: ./hooks/build.sh\n```\n\n## Related content\n\n- [Customize workflows using command and event hooks](azd-extensibility.md)\n- [Azure Developer CLI reference](reference.md)\n\n[!INCLUDE [request-help](includes/request-help.md)]\n"
  },
  {
    "path": "articles/azure-developer-cli/includes/add-cicd-support.md",
    "content": "## Add support for a CI/CD pipeline\n\nYou can also add support for CI/CD in your template using GitHub actions or Azure DevOps using the following steps:\n\n1. Add a `.github` folder for GitHub actions or a `.ado` folder for Azure DevOps to the root of your project.\n\n1. Add a workflow file into the new folder. The `azd` starter template provides a [Sample GitHub Actions workflow file](https://github.com/Azure-Samples/azd-starter-bicep/blob/main) and [Sample Azure DevOps Pipelines](https://github.com/Azure-Samples/azd-starter-bicep/blob/main) files for each platform that you can copy into your project and modify as needed.\n\n1. You may also need to update the `main.parameters.json` file in your `infra` folder with the required environment variables for your workflow to run."
  },
  {
    "path": "articles/azure-developer-cli/includes/add-dev-container-support.md",
    "content": "## Add support for dev containers\n\nYou can also make your template compatible with development containers and Codespaces. A dev container allows you to use a container as a full-featured development environment. It can be used to run an application, to separate tools, libraries, or runtimes needed for working with a codebase, and to aid in continuous integration and testing. Dev containers can be run locally or remotely, in a private or public cloud. (Source: [https://containers.dev/](https://containers.dev/))\n\nTo add support for dev containers:\n\n1. Create a .devcontainer folder at the root of your project.\n\n1. Create a `devcontainer.json` file inside of the `.devcontainer` folder with the desired configurations. The `azd` starter template provides a [sample `devcontainer.json`](https://github.com/Azure-Samples/azd-starter-bicep/blob/main/.devcontainer/devcontainer.json) file that you can copy into your project and modify as needed.\n\nRead more about [working with dev containers](https://code.visualstudio.com/docs/devcontainers/containers) on the Visual Studio Code documentation."
  },
  {
    "path": "articles/azure-developer-cli/includes/azd-install-dev-container.md",
    "content": "---\nauthor: alexwolfmsft\nms.service: azure-dev-cli\nms.topic: include\nms.date: 09/12/2022\nms.author: alexwolf\n---\n\nA [DevContainer](https://code.visualstudio.com/docs/remote/containers) is a Docker image that includes all of the prerequisites you need to run this app on your local machine. To get started, make sure you have the pre-requisites before choosing your azd template.\n\n## Pre-requisites\n\nBefore you get started using `azd`, ensure you have:\n\n- Installed:\n  - [Docker Desktop](https://aka.ms/azure-dev/docker-install) (other options coming soon.)\n  - [Remote - Containers VS Code Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)."
  },
  {
    "path": "articles/azure-developer-cli/includes/azd-install-local.md",
    "content": "---\nauthor: alexwolfmsft\nms.service: azure-dev-cli\nms.topic: include\nms.date: 01/11/2023\nms.author: alexwolf\n---\n\n## Pre-requisites\n\nBefore you get started using `azd`, ensure you have:\n\n- Installed:\n  - [Git](https://git-scm.com/)\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n## Install `azd`\n\n### [Windows](#tab/windows)\n\nRun the following script:\n\n```azdeveloper\npowershell -ex AllSigned -c \"Invoke-RestMethod 'https://aka.ms/install-azd.ps1' | Invoke-Expression\"\n```\n\n### [Linux/MacOS](#tab/linuxmac)\n\n```azdeveloper\ncurl -fsSL https://aka.ms/install-azd.sh | bash \n```\n\n> [!NOTE]\n> If you're on Apple Silicon, you might need to install the emulator. \n\n\n```emulator\nsoftwareupdate --install-rosetta\n```\n\n---\n\n## Install using MSI directly\n\nFor an advanced approach, you can install using the MSI directly. Download the MSI directly from [GitHub Releases](https://github.com/Azure/azure-dev/releases) and install the MSI via the following command:\n\n```cmd\nmsiexec.exe /i <msi-path> <optional parameters>\n```\n\nWhen installing using the MSI directly (instead of the [install script](#install-azd)) the MSI behavior can be modified by providing the following parameters to `msiexec.exe`.\n\n| Parameters | Value |\n| -------- | ----- |\n| `ALLUSERS` | `2`: Default. Install for current user (no privilege elevation required). <br/> `1`: Install for _all_ users (may require privilege elevation). |\n| `INSTALLDIR` | Installation path. <br/> `\"%LOCALAPPDATA%\\Programs\\Azure Dev CLI\"`: Default. <br/> `\"%PROGRAMFILES%\\Azure Dev CLI\"`: Default all users. |\n\nFor example, to install for all users in `c:\\all-users\\azd`, you can run a command similar to:\n\n```cmd\nmsiexec.exe /i <msi-path> ALLUSERS=1 INSTALLDIR=c:\\all-users\\azd\n```\n\n> [!NOTE]\n> The install script doesn't support installing versions of `azd` on Windows that **predate** the MSI. To manually update older versions of the Azure Developer CLI without MSI, see the [Install versions predating MSI section](#install-versions-predating-msi). \n\n## Install using package management tools\n\nA package manager assists developers and administrators with installing, updating, configuring, and removing software packages in a reliable way. You can install the Azure Developer CLI using the following popular package management tools:\n\n* Brew\n* Windows Package Manager\n\n### [Brew](#tab/brew)\n\n```bash\nbrew install azure/azd/azd\n```\n\n### [Winget](#tab/winget)\n\n```bash\nwinget install microsoft.azd\n```\n\n### [Chocolatey](#tab/chocolatey)\n\n```bash\nchoco install azd\n```\n\n---\n\n### Install DEB/RPM Packages\n\nThe Azure Developer CLI releases signed `.deb` and `.rpm` packages to [GitHub Releases](https://github.com/Azure/azure-dev/releases). To install, download the appropriate file from the GitHub release and run the appropriate command to install the package:\n\n### [.deb package](#tab/deb)\n\nYou can install the `.deb` package using `apt-get`:\n\n```bash \ncurl -fSL https://github.com/Azure/azure-dev/releases/download/azure-dev-cli_<version>/azd_<version>_amd64.deb -o azd_<version>_amd64.deb\napt update \napt install ./azd_<version>_amd64.deb -y\n```\n\n> [!NOTE]\n> You may need to use `sudo` when running `apt`.\n\n### [.rpm package](#tab/rpm)\n\nYou can install the `.rpm` package using `yum install`:\n\n```bash \ncurl -fSL https://github.com/Azure/azure-dev/releases/download/azure-dev-cli_<version>/azd-<version>-1.x86_64.rpm -o azd-<version>-1.x86_64.rpm\nyum install -y azd-<version>-1.x86_64.rpm \n```\n\n> [!NOTE]\n> You may need to use `sudo` when running `yum`.\n\n---\n\n## Uninstall `azd`\n\nTo uninstall the `azd`:\n\n### [Windows](#tab/windows)\n\nOnce you've installed the MSI versions, using the uninstall script to remove `azd` will leave some items behind on the machine. **Instead, for version 0.5.0-beta.1 and later:** \n\n1. Search for **Add or remove programs** in Windows.\n\n1. Locate **Azure Dev CLI** and select the three dots to expand the options menu.\n\n1. Select **Uninstall**.\n\n**For versions before 0.5.0-beta.1**, use the following uninstall script:\n\n```azdeveloper\npowershell -ex AllSigned -c \"Invoke-RestMethod 'https://aka.ms/uninstall-azd.ps1' | Invoke-Expression\"\n```\n\n### [Linux/MacOS](#tab/linuxmac)\n\n```azdeveloper\ncurl -fsSL https://aka.ms/uninstall-azd.sh | bash \n```\n\n---\n\n## Uninstall using a package manager\n\nIf you installed the Azure Developer CLI using a package manager, you can also uninstall it using the following commands:\n\n### [Brew](#tab/brew)\n\n```bash\nbrew uninstall azd\n```\n\n### [Winget](#tab/winget)\n\n```bash\nwinget uninstall microsoft.azd\n```\n\n### [Chocolatey](#tab/chocolatey)\n\n```bash\nchoco uninstall azd\n```\n\n---\n\n### Uninstall DEB/RPM Packages\n\nIf you installed the Azure Developer CLI using `.deb` or `.rpm` packages, you can also uninstall it using the following commands:\n\n### [.deb package](#tab/deb)\n\nUninstall the `.deb` package using `dpkg`:\n\n```bash \napt remove -y azd\n```\n\n> [!NOTE]\n> You may need to use `sudo` when running `dpkg`.\n\n### [.rpm package](#tab/rpm)\n\nUninstall the `.rpm` package using `yum remove`:\n\n```bash \nyum remove -y azd\n```\n\n> [!NOTE]\n> You may need to use `sudo` when running `yum`.\n\n---\n\n## Install versions predating MSI\n\nAs of version 0.5.0-beta.1, the PowerShell install script for Azure Developer CLI (`install-azd.ps1`) uses the published MSI file instead of installing from the .zip file. There is no change for users who want to use the script to install or upgrade. \n\nSince the install script doesn't support installing versions of `azd` on Windows that **predate** the MSI, you'll need to manually install older versions. \n\n1. Download the appropriate .zip file from the [Azure Developer CLI GitHub releases](https://github.com/Azure/azure-dev/releases). \n\n1. Extract the .zip file.\n1. Rename the `azd-windows-amd64.exe` to `azd.exe`\n1. Place `azd.exe` in the appropriate location.\n"
  },
  {
    "path": "articles/azure-developer-cli/includes/azd-preview.md",
    "content": "---\nms.prod: azure\nms.topic: include\nms.date: 08/01/2022\n---\n\n> [!IMPORTANT]\n> The `azd` preview features are available on a self-service, opt-in basis. Previews are provided \"as is\" and \"as available,\" and they're excluded from the service-level agreements and limited warranty. The `azd` previews are partially covered by customer support on a best-effort basis."
  },
  {
    "path": "articles/azure-developer-cli/includes/azd-template-structure-minimal.md",
    "content": "---\nms.prod: azure\nms.topic: include\nms.date: 08/01/2022\n---\n\n## Explore Azure Developer CLI template structure\n\n`azd` templates are standard code repositories with additional assets included. All `azd` templates share a similar file structure based on `azd` conventions:\n\n- **`infra` folder** - Contains all of the Bicep or Terraform infrastructure as code files for the `azd` template. `azd` executes these files to create the Azure resources required by your app.\n- **`src` folder** - Contains the app source code. `azd` packages and deploys the code based on configurations in `azure.yaml`.\n- **`azure.yaml` file** - A configuration file that maps source code folders in your project to Azure resources defined in the `infra` folder for deployment. For example, you might define an API service and a web front-end service in separate folders and map them to different Azure resources for deployment.\n- **`.azure` folder** - Contains essential Azure configurations, such as the location to deploy resources.\n\nFor example, most `azd` templates match the following folder structure:\n\n:::image type=\"content\" source=\"../media/make-azd-compatible/azd-template-structure.png\" alt-text=\"A screenshot showing an Azure Developer CLI template structure.\":::\n\nVisit the [Azure Developer CLI templates overview](../azd-templates.md) article for more details about `azd` template structure.\n"
  },
  {
    "path": "articles/azure-developer-cli/includes/azd-template-structure.md",
    "content": "---\nms.prod: azure\nms.topic: include\nms.date: 08/01/2022\n---\n\n## Explore Azure Developer CLI template structure\n\n`azd` templates are standard code repositories with some additional assets included. All `azd` templates share a similar file structure based on `azd` conventions:\n\n- **`infra` folder** - Contains all of the Bicep or Terraform infrastructure as code files for the `azd` template. `azd` executes these files to create the Azure resources required to host your app.\n- **`azure.yaml` file** - A configuration file that maps source code folders in your project to Azure resources defined in the `infra` folder for deployment. For example, you might define an API service and a web front-end service in separate folders and map them to different Azure resources for deployment.\n- **`.azure` folder** - Contains essential Azure configurations and environment variables, such as the location to deploy resources or other subscription information.\n- **`src` folder** - Contains all of the deployable app source code. Some `azd` templates exclude the `src` folder and only provide infrastructure assets so you can add your own application code.\n\nFor example, a common `azd` template might match the following folder structure:\n\n:::image type=\"content\" source=\"../media/make-azd-compatible/azd-template-structure.png\" alt-text=\"A screenshot showing an Azure Developer CLI template structure.\":::\n\n`azd` templates also optionally include one or more of the following folders:\n\n- **`.github` folder** - Holds the CI/CD workflow files for GitHub Actions, the default CI/CD provider for azd.\n- **`.azdo` folder** - If you decide to use Azure Pipelines for CI/CD, define the workflow configuration files in this folder.\n- **`.devcontainer` folder** - Allows you to set up a [Dev Container](https://code.visualstudio.com/docs/devcontainers/create-dev-container) environment for your application.\n"
  },
  {
    "path": "articles/azure-developer-cli/includes/configure-pipeline.md",
    "content": "## Configure the CI/CD pipeline\n\nIf your template includes support for GitHub Actions or Azure Pipelines, you can configure a CI/CD pipeline using the following steps:\n\n1. Run the following command to push updates to the repository. The GitHub Actions workflow is triggered because of the update.\n\n    ```bash\n    azd pipeline config    \n    ```\n\n1. Using your browser, go to the GitHub repository for your project.\n\n1. Select **Actions** to see the workflow running.\n\n## Clean up resources\n\nWhen you no longer need the resources created in this article, run the following command:\n\n``` azdeveloper\nazd down\n```"
  },
  {
    "path": "articles/azure-developer-cli/includes/convert-azd-use-code.md",
    "content": "1. You can follow the steps ahead using your own project. However, if you'd prefer to follow along using a sample application, clone the following starter repo to an empty directory on your computer:\n\n    ```bash\n    git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart\n    ```\n\n1. Open your command line tool of choice to the root directory of the project.\n\n1. Run the `azd init` command to initialize the template.\n\n    ```bash\n    azd init\n    ```\n\n1. When prompted, select the option to **Use code in the current directory**. `azd` analyzes the project and provides a summary of the detected services and recommended Azure hosting resources.\n\n1. Select **Confirm and continue initializing my app**. `azd` generates the following assets in the project root directory:\n\n    * An `azure.yaml` file with appropriate service definitions.\n    * An `infra` folder with infrastructure-as-code files to provision and deploy the project to Azure.\n    * A `.azure` folder with environment variables set in a `.env` file.\n\n    More details on this detection and generation process are provided later in the article.\n\n1. The generated files work as-is for the provided sample app and may for your own apps as well. If necessary, the generated files can be modified to fit your needs. For example, you may need to further modify the infrastructure-as-code files in the `infra` folder if your app relies on Azure resources beyond those that were identified by `azd`.\n\n1. Run the `azd up` command to provision and deploy your app to Azure.\n\n    ```bash\n    azd up\n    ```\n\n1. When prompted, select the desired subscription and location to begin the provisioning and deployment process.\n\n1. When the process completes, click the link in the `azd` output to open the app in the browser.\n\n## Explore the initialization steps\n\nWhen you select the **Use code in the current directory** workflow, the `azd init` command analyzes your project and autogenerates code based on what it discovers. The sections below explain the details of how this process works and which technologies are currently supported.\n\n### Detection\n\nThe `azd init` command detects project files for supported languages located in your project directory and subdirectories. `azd` will also scan package dependencies to gather information about the web frameworks or databases your app uses. If needed, you can manually add or edit the detected components as presented in the confirmation summary prompt.\n\nThe current detection logic is as follows:\n\n- Supported languages:\n    -  Python\n    - JavaScript/TypeScript\n    - .NET\n    - Java\n- Supported databases:\n    - MongoDB\n    - PostgreSQL\n- For Python and JavaScript/TypeScript, web frameworks and databases are automatically detected.\n- When a JavaScript/TypeScript project uses a front-end (or client-side) web framework, it is classified as a front-end service. If your service uses a front-end web framework that is currently undetected, you may select JQuery to provide equivalent front-end service classification and behavior.\n\n### Generation\n\nAfter you confirm the detected components, `azd init` generates the infrastructure-as-code files needed to deploy your application to Azure.\n\nThe generation logic is as follows:\n\n- Supported hosts:\n    - Azure Container Apps.\n- For databases, the supported mapping between database technology and service used:\n    - MongoDB: Azure CosmosDB API for MongoDB\n    - PostgreSQL: Azure Database for PostgreSQL flexible server\n    - Redis: Azure Container Apps Redis add-on\n- Services using databases will have environment variables that provide connection to the database pre-configured by default.\n- When both front-end and back-end services are detected, CORS configuration on the Azure host for back-end services will be updated to allow the default hosting domain of front-end services. This can be modified or removed as necessary in the Infrastructure as Code configuration files.\n\n## Add support for dev containers\n\nYou can also make your template compatible with development containers and Codespaces. A dev container allows you to use a container as a full-featured development environment. It can be used to run an application, to separate tools, libraries, or runtimes needed for working with a codebase, and to aid in continuous integration and testing. Dev containers can be run locally or remotely, in a private or public cloud. (Source: [https://containers.dev/](https://containers.dev/))\n\nTo add support for dev containers:\n\n1. Create a .devcontainer folder at the root of your project.\n\n1. Create a `devcontainer.json` file inside of the `.devcontainer` folder with the desired configurations. The `azd` starter template provides a [sample `devcontainer.json`](https://github.com/Azure-Samples/azd-starter-bicep/blob/main/.devcontainer/devcontainer.json) file that you can copy into your project and modify as needed.\n\nRead more about [working with dev containers](https://code.visualstudio.com/docs/devcontainers/containers) on the Visual Studio Code documentation.\n\n## Add support for a CI/CD pipeline\n\nYou can also add support for CI/CD in your template using GitHub actions or Azure DevOps using the following steps:\n\n1. Add a `.github` folder for GitHub actions or a `.ado` folder for Azure DevOps to the root of your project.\n\n1. Add a workflow file into the new folder. The `azd` starter template provides a [Sample GitHub Actions workflow file](https://github.com/Azure-Samples/azd-starter-bicep/blob/main/.github/workflows/azure-dev.yml) and [Sample Azure DevOps Pipelines](https://github.com/Azure-Samples/azd-starter-bicep/blob/main/.azdo/pipelines/azure-dev.yml) files for each platform that you can copy into your project and modify as needed.\n\n1. You may also need to update the `main.parameters.json` file in your `infra` folder with the required environment variables for your workflow to run.\n"
  },
  {
    "path": "articles/azure-developer-cli/includes/convert-azd-use-template.md",
    "content": "---\nms.custom: devx-track-bicep\n---\nThe **Select a template** workflow allows you to choose an existing `azd` template to use as a starting point. The contents of the selected template are added to the root directory of your project. Most templates provide the required set of `azd` files and folders, and some templates include complete infrastructure-as-code files to provision Azure resources for a chosen application stack. \n\nIn this example, you'll use the **Starter - Bicep** template, which includes the essential structure of an `azd` template and some useful boilerplate code to get started.\n\n1. To follow along with the steps ahead using an existing sample application, clone the following starter project to an empty directory on your computer:\n\n    ```bash\n    git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart\n    ```\n\n1. In your command line tool of choice, navigate to the root directory of the cloned project.\n\n1. Run the `azd init` command to initialize an `azd` template.\n\n    ```bash\n    azd init\n    ```\n\n1. When prompted, choose the option to **Select a template**.\n\n1. From the list of templates, select **Starter - Bicep**. You may need to scroll through the list using your keyboard arrow keys to find the template.\n\n1. When prompted, enter a short environment name, such as **testenv**.\n\n1. After you run `azd init`, the following assets are added to your project:\n\n    ```txt\n    ├── .azdo                                        [ Configures an Azure Pipeline ]\n    ├── .devcontainer                                [ For DevContainer ]\n    ├── .github                                      [ Configures a GitHub workflow ]\n    ├── .vscode                                      [ VS Code workspace configurations ]\n    ├── .azure                                       [ Stores Azure configurations and environment variables ]\n    ├── infra                                        [ Contains infrastructure as code files ]\n    │   ├── main.bicep/main.tf                       [ Main infrastructure file ]\n    │   ├── main.parameters.json/main.tfvars.json    [ Parameters file ]\n    │   └── core/modules                             [ Contains reusable Bicep/Terraform modules ]\n    └── azure.yaml                                   [ Describes the app and type of Azure resources]\n    ```\n\n## Update the Bicep files\n\nYour project now contains the core structure and assets of an `azd` template. However, to provision the Azure resources for your specific project, the Bicep files in the `infra` folder need to be updated. To host the sample application, you'll need the following resources:\n\n- An Azure App Service Plan\n- An Azure App Service running on Linux\n\n1. Open the top level project directory in your editor of choice, such as Visual Studio Code.\n\n1. Open the `main.bicep` file in your editor. This file contains useful boilerplate code to setup essential variables, parameters, and naming conventions. Beneath the comment block around line 50 that reads **`Add resources to be provisioned below`**, add the following Bicep:\n\n    ```bicep\n    // Creates an app service instance to host the app\n    module web './core/host/appservice.bicep' = {\n      name: 'web'\n      scope: rg\n      params: {\n        name: '${abbrs.webSitesAppService}web-${resourceToken}'\n        location: location\n        tags: union(tags, { 'azd-service-name': 'web' })\n        appServicePlanId: appServicePlan.outputs.id\n        runtimeName: 'python'\n        runtimeVersion: '3.8'\n        scmDoBuildDuringDeployment: true\n      }\n    }\n    \n    // Create an App Service Plan to group applications under the same payment plan and SKU\n    module appServicePlan './core/host/appserviceplan.bicep' = {\n      name: 'appserviceplan'\n      scope: rg\n      params: {\n        name: '${abbrs.webServerFarms}${resourceToken}'\n        location: location\n        tags: tags\n        sku: {\n          name: 'B1'\n        }\n      }\n    }\n    ```\n\n    > [!NOTE]\n    > - A unique string is generated based on subscription ID and used as a `${resourceToken}` variable. This token is appended to the name of all Azure resources created by azd. `azd` uses tags to identify resources so you can modify the names based on your organization's naming convention.\n    > - The `'azd-service-name': 'web'` tag on the app service is the value `azd` uses to identify deployment host. The value must be the same as what is defined for the service in the **azure.yaml** file.\n    \n## Update the azure.yaml file\n\nTo deploy the app, `azd` needs to know more about your app. The `azure.yaml` file is used to define the source code location, language, and the Azure hosting service for each service in your app. For full details, refer to [the azure.yaml schema](../azd-schema.md).\n\n1. Open the `azure.yaml` at the root of the project.\n\n1. Add the following lines to the bottom of the file:\n\n    ```yml\n    name: msdocs-python-flask-webapp-quickstart\n    services:\n      web:\n        project: .\n        language: py\n        host: appservice\n    ```\n\n## Provision and deploy the template\n\n1. Save all of your changes and run the following command to provision and deploy the app resources on Azure:\n\n    ```azdeveloper\n    azd up\n    ```\n\n1. When the command finishes, click the link in the command output to navigate to the deployed site.\n\nYour project is now compatible with Azure Developer CLI and can be used as a template!\n\n> [!NOTE]\n> `azd` also supports using [Buildpack](https://buildpacks.io/) for containerizing your apps by default. If your `azd` template targets Azure Container Apps or Azure Kubernetes Service but does not include a Docker file, `azd` automatically generates an image using Buildpack.\n"
  },
  {
    "path": "articles/azure-developer-cli/includes/debug-visual-studio.md",
    "content": "---\nauthor: alexwolfmsft\nms.service: azure-dev-cli\nms.topic: include\nms.date: 08/10/2022\nms.author: alexwolf\nms.custom: sfi-image-nochange\n---\n\nRun and debug apps built on your local machine using [Visual Studio](/visualstudio/azure) and Azure Developer CLI (`azd`). In this guide, you'll use the [React Web App with C# API and MongoDB on Azure](https://github.com/Azure-Samples/todo-csharp-cosmos-sql) template. You can apply the principles you learn in this article to any of the [Azure Developer CLI templates](../azd-templates.md).\n\n## Prerequisites\n\n- [Install azd](../install-azd.md)\n- [Run `azd` with the Node.js template](../get-started.md)\n- [.NET SDK 6.0](https://dotnet.microsoft.com/download/dotnet/6.0)\n\n## Install and enable the preview feature\n  \n1. Install [Visual Studio Preview](https://visualstudio.microsoft.com/vs/preview/) \n   \n   > [!NOTE]\n   > This is different from Visual Studio. If you have the non-preview version of Visual Studio, you still need to install this. \n\n1. Open Visual Studio Preview.\n\n1. From the **Tools** menu, select **Options** > **Preview Features**.\n\n1. Make sure **Integration with azd, the Azure Developer CLI** is enabled.\n\n   :::image type=\"content\" source=\"../media/debug/visual-studio-options.png\" alt-text=\"Screenshot of the Visual Studio option to turn on integration with the Azure Developer CLI.\":::\n\n## Open the API solution\n\n1. Open the `Todo.Api.sln` solution in the `/src/api` directory.  \n\n   If you've [enabled the `azd` integration feature](#prerequisites), the `azure.yaml` file is detected. Visual Studio automatically initializes the app model and runs `azd env refresh`.\n\n1. Expand **Connected Services** to see all the dependencies.  \n\n   While the web front-end running on Azure App Service isn't part of the API solution, it's detected and included under **Service Dependencies**\n\n   :::image type=\"content\" source=\"../media/debug/visual-studio-open-solution.png\" alt-text=\"Screenshot of the message indicating the Azure Developer CLI is initialized.\":::\n\n## Run and debug\n\n1. From your project's `src/api` directory, open `ListController.cs`.\n\n1. Set a breakpoint at line 20.\n\n   :::image type=\"content\" source=\"../media/debug/visual-studio-breakpoint.png\" alt-text=\"Screenshot of the breakpoint set in the sample code.\":::\n\n1. Press `<F5>`.\n\n1. Wait for the message indicating the web server is listening on port 3101.\n\n   :::image type=\"content\" source=\"../media/debug/visual-studio-run.png\" alt-text=\"Screenshot of the status bar message indicating the debugger is listening on port 3101.\":::\n\n1. In your preferred browser, enter the following address: `https://localhost:3101/lists`\n\n1. When the breakpoint you set earlier is hit, app execution will pause. At this point, you can perform standard debugging tasks, such as:\n   - Inspect variables\n   - Look at the call stack\n   - Set other breakpoints\n\n1. Press `<F5>` to continue running the app. \n\n   The sample app returns a list (or an empty list [] if you haven't launched the web front-end before):\n\n    ```\n    [{\"id\":\"fb9c1cb3811349b993421fc0e815c4c1\",\"name\":\"My List\",\"description\":null,\"createdDate\":\"2022-06-27T01:10:16.7721172+00:00\",\"updatedDate\":null}]\n    ```\n\n## Other `azd` integrations\n\n### Manage `azd` environment\n\nTo manage the `azd` environment:\n\n1. Select **...** in the upper-right corner of the **Service Dependencies** pane.\n1. Select one of the following options in the dropdown menu:\n\n   - Create a new environment\n   - Select and set a specific environment as the current active environment\n   - Deprovision an environment\n\n   :::image type=\"content\" source=\"../media/debug/visual-studio-manage-environment.png\" alt-text=\"Screenshot of the options to manage the Azure Developer CLI environment in Visual Studio.\":::\n\n### Provision environment resources\n\nYou can provision Azure resources to your environment.\n\n1. In **Connected Services**, click the icon at the top right to restore/provision environment resources.\n\n   :::image type=\"content\" source=\"../media/debug/visual-studio-provision.png\" alt-text=\"Screenshot of option to provision Azure Developer CLI environment resources in Visual Studio.\":::\n\n1. Confirm the environment name, subscription, and location.\n\n### Publish your app\n\nIf you make any updates, you can publish your app by doing the following steps:\n\n1. In the Solution Explorer, expand **Connected Services**.\n\n1. Select **Publish**.\n\n1. Select **Add a publish profile**.\n\n1. Select a **Target** of **Azure**, and select **Next**.\n\n1. Select **Azure Developer CLI Environment**, and select **Next**.\n\n   :::image type=\"content\" source=\"../media/debug/visual-studio-publish.png\" alt-text=\"Screenshot of message in Debug Console indicating debugger is listening on port 3100.\":::\n\n1. Select the environment.\n\n1. Select **Finish**.\n\n## Other resources\n\n- [Visual Studio Connected Service](/visualstudio/azure/overview-connected-services)\n- [Overview of Publish Tool in Visual Studio](/visualstudio/deployment/publish-overview)\n"
  },
  {
    "path": "articles/azure-developer-cli/includes/extensions-dev-container.md",
    "content": "---\nauthor: alexwolfmsft\nms.service: azure-dev-cli\nms.topic: include\nms.date: 03/23/2026\nms.author: alexwolf\n---\n\nThe `azd` Dev Container Feature supports an `extensions` option to automatically install a comma-separated list of `azd` extensions during the container build. Extensions installed this way are available as soon as the container starts, reducing manual setup and enabling `azd` commands to run with the required extensions already installed.\n\nTo auto-install extensions, add the `extensions` option to the `azd` feature entry in your `devcontainer.json` file:\n\n```json\n{\n    \"name\": \"Azure Developer CLI\",\n    \"image\": \"mcr.microsoft.com/devcontainers/python:3.10-bullseye\",\n    \"features\": {\n        \"ghcr.io/azure/azure-dev/azd:latest\": {\n            \"extensions\": \"my-ext-1,my-ext-2\"\n        }\n    }\n}\n```\n\nThe `extensions` value is a comma-separated list of `azd` extension names. Installation occurs during the container build, so the extensions are ready to use as soon as the container starts. After changing the extensions list, use the **Rebuild and Reopen in Dev Container** command in Visual Studio Code to rebuild the container with the updated extensions.\n\nLearn more about the [azd Dev Container Feature](https://github.com/Azure/azure-dev/tree/main/cli/azd/resources).\n"
  },
  {
    "path": "articles/azure-developer-cli/includes/request-help.md",
    "content": "## Request help\n\nFor information on how to file a bug, request help, or propose a new feature for the Azure Developer CLI, please visit the [troubleshooting and support](/azure/developer/azure-developer-cli/troubleshoot#create-a-github-issue-to-request-help) page.\n"
  },
  {
    "path": "articles/azure-developer-cli/includes/run-azd-bare-metal.md",
    "content": "---\nauthor: alexwolfmsft\nms.service: azure-dev-cli\nms.topic: include\nms.date: 08/05/2022\nms.author: alexwolf\n---\n\n## Run `azd up`\n\nRun the `azd up` command with the `--template` flag. \n\n```azdeveloper\nazd up --template <TEMPLATE>\n```\n\nThis single `azd up` command will:\n\n- Download code\n- Initialize your project (`azd init`)\n- Create and configure all necessary Azure resources (`azd provision`), including:\n  - Access policies and roles for your account\n  - Service-to-service communication with Managed Identities\n- Deploy the code (`azd deploy`)\n\n## Provide parameters\n\nWhen you run the `azd up` command, you'll be prompted to provide the following information:\n\n| Parameter | Description |\n| --------- | ----------- |\n| `Environment Name` | Prefix for the resource group that will be created to hold all Azure resources. [What is an Environment Name in `azd`?](../tooling-environment-faq.md#what-is-an-environment-name) |\n| `Azure Location`   | The Azure location where your resources will be deployed. |\n| `Azure Subscription` | The Azure Subscription where your resources will be deployed. |"
  },
  {
    "path": "articles/azure-developer-cli/includes/run-azd-dev-container.md",
    "content": "---\nauthor: alexwolfmsft\nms.service: azure-dev-cli\nms.topic: include\nms.date: 09/12/2022\nms.author: alexwolf\n---\n\n## Initialize your project\n\n1. Open your preferred terminal and create a new empty directory.\n1. Change into the new empty directory.\n1. Run the following command to initialize the project:\n\n   ```azdeveloper\n   azd init --template <TEMPLATE>\n   ```\n\n## Provide parameters\n\nWhen you run the `azd up` command, you'll be prompted to provide the following information:\n\n| Parameter | Description |\n| --------- | ----------- |\n| `Environment Name` | Prefix for the resource group that will be created to hold all Azure resources. [What is an Environment Name in `azd`?](../tooling-environment-faq.md#what-is-an-environment-name) |\n| `Azure Location`   | The Azure location where your resources will be deployed. |\n| `Azure Subscription` | The Azure Subscription where your resources will be deployed. |\n\n## Open DevContainer\n\n1. Open your project in Visual Studio Code.\n1. Press F1 and select `Remote-Containers: Rebuild and Reopen in Container`.\n\n## Run `azd up`\n\nIn the terminal, run the `azd up` command with the `--template` flag.\n\n```azdeveloper\nazd up --template <TEMPLATE>\n```\n\nFor DevContainer, the `azd up` command will:\n\n- Create and configure all necessary Azure resources (`azd provision`), including:\n  - Access policies and roles for your account\n  - Service-to-service communication with Managed Identities\n- Deploy the code (`azd deploy`)"
  },
  {
    "path": "articles/azure-developer-cli/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure Developer CLI (azd)\nsummary: |\n  The Azure Developer CLI (azd) is an open-source tool that accelerates your path from a local development environment to Azure. azd provides a set of developer-friendly commands that map to key stages in your workflow (code, build, deploy, monitor). The CLI allows you to work consistently in a repeatable way across the terminal, your editor/integrated development environment, GitHub Actions pipeline, and more.  \n\nmetadata:\n  title: Azure Developer CLI (azd)\n  description: Get started developing Azure apps using Azure Developer CLI (azd).\n  author: alexwolfmsft\n  ms.author: alexwolf\n  ms.date: 07/22/2025\n  ms.topic: landing-page\n  ms.collection: collection\n  ms.service: azure-dev-cli\n  ms.custom: devx-track-azdevcli, build-2023\nlandingContent:\n  - title:  Get started\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: What is Azure Developer CLI (azd)?\n            url: /azure/developer/azure-developer-cli/overview\n          - text: Install azd\n            url: /azure/developer/azure-developer-cli/install-azd\n          - text: Deploy an azd template\n            url: /azure/developer/azure-developer-cli/get-started\n          - text: Supported languages and environments\n            url: /azure/developer/azure-developer-cli/supported-languages-environments\n          - text: Training - Introduction to Azure Developer CLI\n            url: /training/modules/introduction-to-azure-developer-cli\n  - title: Work with templates\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Explore azd templates\n            url: /azure/developer/azure-developer-cli/azd-templates\n          - text: Visit the template gallery\n            url: https://azure.github.io/awesome-azd\n          - text: Make your project azd compatible\n            url: /azure/developer/azure-developer-cli/make-azd-compatible\n          - text: Training - Build and deploy azd templates\n            url: /training/paths/azure-developer-cli\n          - text: Configure deployment pipeline\n            url: configure-devops-pipeline.md\n  - title: Customization and configuration\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Manage environment variables\n            url: /azure/developer/azure-developer-cli/manage-environment-variables\n          - text: Use terraform with azd\n            url: /azure/developer/azure-developer-cli/use-terraform-for-azd\n          - text: Customize workflows using hooks\n            url: /azure/developer/azure-developer-cli/azd-extensibility\n          - text: Remote environment support\n            url: /azure/developer/azure-developer-cli/remote-environments-support\n          - text: Troubleshooting\n            url: /azure/developer/azure-developer-cli/troubleshoot\n  - title: Popular templates\n    linkLists:\n      - linkListType: sample\n        links:\n          - text: Visit the template gallery\n            url: https://azure.github.io/awesome-azd\n          - text: ToDo C# Azure Cosmos DB\n            url: https://github.com/Azure-Samples/todo-csharp-cosmos-sql\n          - text: ToDo C# Azure SQL Database\n            url: https://github.com/azure-samples/todo-csharp-sql\n          - text: ToDo Java Mongo \n            url: https://github.com/azure-samples/todo-java-mongo\n          - text: ToDo NodeJs MongoDB\n            url: https://github.com/azure-samples/todo-nodejs-mongo\n          - text: ToDo Python MongoDB\n            url: https://github.com/azure-samples/todo-python-mongo\n\n  - title: Video content\n    linkLists:\n      - linkListType: learn\n        links:\n          - text: Introducing the Azure Developer CLI - Azure Friday\n            url: https://www.youtube.com/watch?v=VTk-FhJyo7s\n          - text: Azure Developer CLI - GitHub Universe presentation\n            url: https://www.youtube.com/watch?v=9z3PiHSCcYs\n          - text: Azure Developer CLI YouTube playlist\n            url: https://www.youtube.com/watch?v=_MNndbEPvYQ&list=PLq8oMtzrBmrhdtmthuGO9pOHRUqD-BmWh&index=1\n          - text: Community standups\n            url: https://www.youtube.com/watch?v=uhFXxHnhJts\n  - title: Get help & provide feedback\n    linkLists:\n      - linkListType: how-to-guide \n        links:\n          - text: Troubleshoot & Get help\n            url: troubleshoot.md   \n          - text: Frequently asked questions (FAQ)\n            url: tooling-environment-faq.md   \n      - linkListType: reference\n        links:\n          - text: Azure Developer CLI Reference\n            url: reference.md\n"
  },
  {
    "path": "articles/azure-developer-cli/install-azd.md",
    "content": "---\ntitle: Install the Azure Developer CLI\ndescription: Install the Azure Developer CLI (azd) with all the prerequisites for your local environment.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.topic: how-to\nms.custom: devx-track-azdevcli, build-2023, linux-related-content\nms.service: azure-dev-cli\nzone_pivot_group_filename: developer/azure-developer-cli/azd-zone-pivot-groups.json\nzone_pivot_groups: azd-os-env-set\n---\n\n# Install or update the Azure Developer CLI\n\nWelcome to the Azure Developer CLI (`azd`)! Let's get started with installing and learning how to run `azd`.\n\nStart by selecting your development environment. For more information about the pros and cons of the different development environment choices, see [Azure Developer CLI (azd) supported environments](./supported-languages-environments.md#supported-development-environments).\n\nFor more advanced installation scenarios and instructions, see [Azure Developer CLI Installer Scripts](https://github.com/Azure/azure-dev/blob/main/cli/installer/README.md#advanced-installation-scenarios).\n\nNote: When you install `azd`, the following tools are installed within `azd` scope (meaning they aren't installed globally) and are removed if azd is uninstalled:\n\n- The [GitHub CLI](https://cli.github.com/)\n- The [Bicep CLI](/azure/azure-resource-manager/bicep/install)\n\n::: zone pivot=\"os-windows\"\n### [Windows Package Manager (winget)](#tab/winget-windows)\n### Install `azd`\n\n```powershell\nwinget install microsoft.azd\n```\n\n### Update `azd`\n\n```powershell\nwinget upgrade microsoft.azd\n```\n\n### Uninstall `azd`\n\n```powershell\nwinget uninstall microsoft.azd\n```\n\n### [Chocolatey](#tab/choco-windows)\n\n### Install `azd`\n\n```powershell\nchoco install azd\n```\n\n### Update `azd`\n\n```powershell\nchoco upgrade azd\n```\n\n### Uninstall `azd`\n\n```powershell\nchoco uninstall azd\n```\n\n### [Script](#tab/script-windows)\n\n### Install `azd`\n\nThe install script downloads and installs the MSI package on the machine with default parameters.\n\n```powershell\npowershell -ex AllSigned -c \"Invoke-RestMethod 'https://aka.ms/install-azd.ps1' | Invoke-Expression\"\n```\n\n### Update `azd`\n\n```powershell\npowershell -ex AllSigned -c \"Invoke-RestMethod 'https://aka.ms/install-azd.ps1' | Invoke-Expression\"\n```\n\n### Uninstall `azd`\n\nUsing the uninstall script to remove `azd` leaves some items behind on the machine. **Instead, for version 0.5.0-beta.1 and later:** \n\n1. Search for **Add or remove programs** in Windows.\n\n2. Locate **Azure Dev CLI** and select the three dots to expand the options menu.\n\n3. Select **Uninstall**.\n\n### [Arm64](#tab/arm64)\n\n> [!NOTE]\n> Support for Windows Arm64 is currently in Alpha. Visit the [Feature versioning and release strategy](/azure/developer/azure-developer-cli/feature-versioning) page for more information.\n\nThe Arm64 version of `azd` is available to download directly on the [GitHub release page](https://github.com/Azure/azure-dev/releases). Currently, there is no direct support for package manager installers or other channels.\n\n### Install `azd`\n\n> [!NOTE]\n> If your machine already has the Windows x86_64 version of `azd` installed, first uninstall the x86_64 version to prevent MSI upgrades or repairs from writing over the Arm64 executable.\n\n1. On the [GitHub release page](https://github.com/Azure/azure-dev/releases) page, download the latest `azd-windows-arm64-alpha.zip` file.\n\n1. Extract the `azd-windows-arm64-alpha.zip` file and copy the `azd-windows-amd64.exe` executable to the default `azd` location `C:\\Users\\<username>\\AppData\\Local\\Programs\\Azure Dev CLI` on your device.\n\n1. Add an entry to the `PATH` environment variable on your device to point to the extracted file at `C:\\Users\\<username>\\AppData\\Local\\Programs\\Azure Dev CLI\\azd-windows-amd64.exe`.\n\n### Update `azd`\n\n1. On the [GitHub release page](https://github.com/Azure/azure-dev/releases) page, download the latest `azd-windows-arm64-alpha.zip` file.\n\n1. Extract the `azd-windows-arm64-alpha.zip` file and copy the `azd-windows-amd64.exe` executable to the default `azd` location `C:\\Users\\<username>\\AppData\\Local\\Programs\\Azure Dev CLI` on your device to replace the existing executable.\n\n1. Verify you have a `PATH` environment variable on your device that points to the extracted file at `C:\\Users\\<username>\\AppData\\Local\\Programs\\Azure Dev CLI\\azd-windows-amd64.exe`.\n\n### Uninstall `azd`\n\n1. Remove the `azd-windows-amd64.exe` executable from the default `azd` location `C:\\Users\\<username>\\AppData\\Local\\Programs\\Azure Dev CLI` on your device. If you installed `azd` in a different location, you'll need to delete it from there.\n\n1. Remove the `PATH` environment variable you added to point to the `azd` install location.\n\n::: zone-end \n\n::: zone pivot=\"os-mac\"\n### [Homebrew (recommended)](#tab/brew-mac)\n\n> [!NOTE] \n> On Apple Silicon Macs (M1 and M2) `azd` requires Rosetta 2. If Rosetta 2 is not already installed run `softwareupdate --install-rosetta` from the terminal.\n>\n> The `azd` install process will automatically choose the correct binary for the architecture of your machine.\n\n### Install `azd`\n\n```bash\nbrew install azure/azd/azd\n```\n\nIf you're using `brew` to upgrade `azd` from a version not installed using `brew`, remove the existing version of `azd` using the uninstall script (if installed to the default location) or by deleting the `azd` binary manually. This will automatically install the correct version.\n\n### Update `azd`\n\n```bash\nbrew upgrade --cask azure/azd/azd\n```\n\n### Uninstall `azd`\n\n```bash\nbrew uninstall azd\n```\n\n### [Script](#tab/script-mac)\n\n> [!NOTE]\n> The `azd` install process will automatically choose the correct binary for the architecture of the machine.\n\nThe install script can be used to install the correct version of `azd` at the machine scope. \n\n```bash\ncurl -fsSL https://aka.ms/install-azd.sh | bash\n```\n\n### Update `azd`\n\n```bash\ncurl -fsSL https://aka.ms/install-azd.sh | bash\n```\n\n### Uninstall `azd`\n\n```bash\ncurl -fsSL https://aka.ms/uninstall-azd.sh | bash\n```\n\n::: zone-end\n\n::: zone pivot=\"os-linux\"\n\n### [Script](#tab/script-linux)\n\n### Install `azd`\n\n```bash\ncurl -fsSL https://aka.ms/install-azd.sh | bash\n```\n\n### Update `azd`\n\n```bash\ncurl -fsSL https://aka.ms/install-azd.sh | bash\n```\n\nWhen you install `azd`, the following tools are installed within `azd` scope (meaning they aren't installed globally) and are removed if azd is uninstalled:\n\n- The [Git CLI](https://cli.github.com/)\n- The [Bicep CLI](/azure/azure-resource-manager/bicep/install)\n\n### Uninstall `azd`\n\n```bash\ncurl -fsSL https://aka.ms/uninstall-azd.sh | bash\n```\n\n### [.deb package](#tab/deb-linux)\nThe Azure Developer CLI releases signed `.deb` and `.rpm` packages to [GitHub Releases](https://github.com/Azure/azure-dev/releases). To install or update, download the appropriate file from the GitHub release and run the appropriate command to install the package:**\n\n### Install or Update `.deb` package for `azd`\n\nYou can install the `.deb` package using `apt-get`:\n\n```bash \ncurl -fSL https://github.com/Azure/azure-dev/releases/download/azure-dev-cli_<version>/azd_<version>_amd64.deb -o azd_<version>_amd64.deb\napt update \napt install ./azd_<version>_amd64.deb -y\n```\n\n### Uninstall `.deb` package for `azd`\n\n```bash \napt remove -y azd\n```\n> [!NOTE]\n> You may need to use `sudo` when running `apt`.\n\n### [.rpm package](#tab/rpm-linux)\n\nThe Azure Developer CLI releases signed `.deb` and `.rpm` packages to [GitHub Releases](https://github.com/Azure/azure-dev/releases). To install, download the appropriate file from the GitHub release and run the appropriate command to install the package:**\n\n### Install `.rpm` package for `azd`\n\nYou can install the `.rpm` package using `yum install`:\n\n```bash \ncurl -fSL https://github.com/Azure/azure-dev/releases/download/azure-dev-cli_<version>/azd-<version>-1.x86_64.rpm -o azd-<version>-1.x86_64.rpm\nyum install -y azd-<version>-1.x86_64.rpm \n```\n\n### Uninstall `.rpm` package for `azd`\n\n```bash \nyum remove -y azd\n```\n\n> [!NOTE]\n> You may need to use `sudo` when running `yum`.\n\n::: zone-end\n\n::: zone pivot=\"env-dev-container\"\n\n## Prerequisites\n\nBefore you get started using `azd`, ensure you have:\n\n- Installed:\n  - [Docker Desktop](https://aka.ms/azure-dev/docker-install) (other options coming soon.)\n  - [Remote - Containers VS Code Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n## Install `azd` in a dev container\n\nA [dev container](https://code.visualstudio.com/docs/remote/containers) is a Docker image that includes all of the prerequisites you need to run an app on your local machine. Install `azd` as a feature in your dev container via the following steps:\n\n1. Add the `azd` feature to the `devcontainer.json` file in the `.devcontainer` folder at the root of your template.\n\n    ```json\n    {\n        \"name\": \"Azure Developer CLI\",\n        \"image\": \"mcr.microsoft.com/devcontainers/python:3.10-bullseye\",\n        \"features\": {\n            // See https://containers.dev/features for list of features\n            \"ghcr.io/devcontainers/features/docker-in-docker:2\": {\n            },\n            \"ghcr.io/azure/azure-dev/azd:latest\": {}\n        }\n        // Rest of file omitted...\n    } \n    ```\n\n1. Rebuild and run your dev container. In Visual Studio Code, use the [command palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette) to execute the **Rebuild and Reopen in Dev Container** command.\n\n### Auto-install azd extensions\n\n[!INCLUDE [extensions-dev-container](includes/extensions-dev-container.md)]\n\n::: zone-end\n\n## Verify your installation\n\nVerify your `azd` installation completed successfully by running the `azd version` command in a terminal:\n\n```azdeveloper\nazd version\n```\n\n`azd` prints the current version:\n\n```output\nazd version 1.9.5 (commit cd2b7af9995d358aab33c782614f801ac1997dde)\n```\n\n## Update the Azure Developer CLI\n\nYou can update `azd` using the built-in `azd update` command (Beta) or manually using the same method you used to install it.\n\n### Use `azd update` (Beta)\n\nThe `azd update` command detects how `azd` was originally installed and delegates to the appropriate update method automatically:\n\n| Install method | What `azd update` does |\n|---|---|\n| `winget` | Runs `winget upgrade Microsoft.Azd` |\n| `choco` | Runs `choco upgrade azd` |\n| Install script or MSI (Windows) | Runs `install-azd.ps1` with automatic backup and restore |\n| Install script (Linux/macOS) | Runs `install-azd.sh` |\n| Homebrew | Runs `brew upgrade --cask azure/azd/azd` |\n| `.deb` / `.rpm` package | Directly downloads and replaces the binary |\n\nRun the following command to update to the latest stable version:\n\n```azdeveloper\nazd update\n```\n\n> [!NOTE]\n> The `azd update` command is currently in Beta. Read more about alpha and beta feature support on the [feature versioning and release strategy](./feature-versioning.md) page.\n\n### Switch update channels\n\n`azd` supports two update channels: `stable` (default) and `daily`. Channel switching is supported for script-based installs and Homebrew. If you installed `azd` via `winget` or `choco`, daily builds aren't available through those package managers — `azd update` will show guidance to reinstall via script first.\n\nTo switch to the `daily` channel and update:\n\n```azdeveloper\nazd update --channel daily\n```\n\nTo switch back to the `stable` channel:\n\n```azdeveloper\nazd update --channel stable\n```\n\nWhen switching channels, `azd` prompts for confirmation before proceeding.\n\n### Use your package manager or install script\n\nYou can also update manually at any time using the same package manager or install script commands shown in the installation sections above. When `azd` is out of date, it displays a warning message with the applicable update command for your install method.\n\n[!INCLUDE [request-help](includes/request-help.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Quickstart - Select and deploy an azd template](./get-started.md)\n> [!div class=\"nextstepaction\"]\n> [What are Azure Developer CLI templates?](./azd-templates.md)\n> [!div class=\"nextstepaction\"]\n> [Azure Developer CLI FAQ](./tooling-environment-faq.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/layered-provisioning.md",
    "content": "---\ntitle: Layered provisioning with the Azure Developer CLI\ndescription: Learn how to use layered provisioning with the Azure Developer CLI (azd) to solve complex infrastructure dependency scenarios.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 02/12/2026\nms.service: azure-dev-cli\nms.topic: concept-article\nms.custom: devx-track-azdevcli\nai-usage: ai-generated\n---\n\n# Layered provisioning\n\nAzure Developer CLI (`azd`) supports layered provisioning, which you can use to define multiple provisioning layers in your `azure.yaml` file. Each layer points to its own set of Infrastructure as Code (IaC) templates. The CLI provisions layers sequentially in the order you define them. You can also provision or tear down individual layers independently.\n\nThis feature solves complex dependency scenarios where resources in one layer depend on resources from another layer. Instead of mixing IaC with imperative hook scripts, layered provisioning keeps everything declarative.\n\n> [!NOTE]\n> Layered provisioning is currently a beta feature.\n> [Learn more about the versioning strategy](./feature-versioning.md).\n\n## When to use layered provisioning\n\nUse layered provisioning when a single `azd provision` deployment can't handle all of your infrastructure needs in one step. Consider using layered provisioning when:\n\n- **Circular dependencies**: Some resources need to reference other resources that must be created first, such as a virtual network that must exist before a private endpoint can be configured.\n- **Foundational infrastructure differs from application infrastructure**: You manage shared networking, security, or identity resources separately from per-application resources.\n- **Independent lifecycle management is needed**: You update and tear down different infrastructure components at different times. For example, a networking layer might be long-lived, while an application layer is frequently redeployed.\n- **Monorepo projects with distinct infrastructure groups**: A single repository contains multiple independent services (such as an Event Hub, a Container App, and a Function App), each with its own infrastructure templates.\n\n## Configure layers in azure.yaml\n\nDefine layers under the `infra` section of your `azure.yaml` file. Each layer requires a `name` and a `path` pointing to the directory that contains the IaC templates for that layer.\n\n```yaml\nname: my-app\ninfra:\n  layers:\n    - name: networking\n      path: ./infra/networking\n    - name: application\n      path: ./infra/application\nservices:\n  api:\n    project: ./src/api\n    language: js\n    host: containerapp\n```\n\n> [!IMPORTANT]\n> **Layer processing order:** `azd provision` processes layers **top to bottom** in the order they're listed in `azure.yaml`. `azd down` processes layers in **reverse order** (bottom to top). Define your layers so that foundational resources appear first, followed by layers that depend on them. This order ensures you create dependencies before the resources that need them, and remove dependencies after those resources.\n\n### Layer properties\n\nEach layer supports the following properties:\n\n| Property | Required | Description |\n| -------- | -------- | ----------- |\n| `name` | Yes | A unique name for the layer. Use this name when targeting a specific layer with commands. |\n| `path` | Yes | The relative path to the directory containing the IaC templates for this layer. |\n| `module` | No | The name of the module within the layer's directory. Defaults to `main`. |\n| `provider` | No | The IaC provider for this layer (`bicep` or `terraform`). Inherits from the root `infra.provider` if you don't specify it. |\n\n> [!IMPORTANT]\n> When you define `infra.layers`, you can't declare other properties on the `infra` section (`path`, `module`, `deploymentStacks`) at the root level. You must specify all infrastructure configuration within each layer.\n\n### Directory structure\n\nA typical project using layered provisioning might have the following directory structure:\n\n```text\nmy-app/\n├── azure.yaml\n├── infra/\n│   ├── networking/\n│   │   └── main.bicep\n│   └── application/\n│       └── main.bicep\n└── src/\n    └── api/\n        └── ...\n```\n\nEach layer directory contains its own complete set of IaC templates, just as a standard `azd` project's `infra` directory would.\n\n## Provision and manage layers\n\nYou can provision all layers at once or target a specific layer by name. The following sections describe common commands for provisioning, tearing down, and refreshing layer state.\n\n### Provision all layers\n\nRun `azd provision` without arguments to provision all layers sequentially in the order they're defined in `azure.yaml`:\n\n```bash\nazd provision\n```\n\n`azd` processes each layer one at a time, ensuring the first layer completes before the second layer begins. This process guarantees that dependent resources exist before layers that reference them are deployed.\n\n### Provision a specific layer\n\nTo provision only a specific layer, pass the layer name as an argument:\n\n```bash\nazd provision networking\n```\n\nThis command deploys only the resources defined in the `networking` layer. Provisioning a specific layer is useful when:\n\n- You're iterating on a single layer during development.\n- You need to update one layer without redeploying others.\n- You're setting up a new layer on top of existing infrastructure.\n\n### Tear down all layers\n\nRun `azd down` without arguments to tear down resources from all layers. When multiple layers exist, `azd` processes them in **reverse order**, so dependent resources are removed before the foundational resources they depend on:\n\n```bash\nazd down\n```\n\n### Tear down a specific layer\n\nTo tear down only a specific layer, pass the layer name as an argument:\n\n```bash\nazd down application\n```\n\nThis command removes only the resources deployed by the `application` layer, leaving the other layers intact.\n\n### Refresh environment state\n\nYou can refresh the environment state from a specific layer by using the `--layer` flag with `azd env refresh`:\n\n```bash\nazd env refresh --layer networking\n```\n\nThis command updates the environment variables and outputs based on the most recent deployment of the specified layer.\n\n## Example: Monorepo with multiple services\n\nThe following example demonstrates layered provisioning for a monorepo that contains an Event Hub, a Container App running multiple containers, and an Azure Function App:\n\n```yaml\nname: logging-app\ninfra:\n  layers:\n    - name: eventhub\n      path: ./infra/eventhub\n    - name: aca\n      path: ./infra/aca\n    - name: functionapp\n      path: ./infra/functionapp\nservices:\n  functionapp:\n    resourceName: ${site_name}\n    language: dotnet\n    project: ./src/function/functionapp.csproj\n    host: appservice\n    resourceGroup: ${rg_name}\n```\n\nThe corresponding directory structure:\n\n```text\nlogging-app/\n├── azure.yaml\n├── infra/\n│   ├── eventhub/\n│   │   └── main.bicep\n│   ├── aca/\n│   │   └── main.bicep\n│   └── functionapp/\n│       └── main.bicep\n└── src/\n    └── function/\n        └── functionapp.csproj\n```\n\nWith this configuration, you can:\n\n1. Provision only the Event Hub infrastructure: `azd provision eventhub`\n1. Provision only the Container App infrastructure: `azd provision aca`\n1. Provision everything in order: `azd provision`\n1. Tear down only the Function App layer: `azd down functionapp`\n\n## Example: Base and application layers\n\nA common pattern separates shared or foundational infrastructure from per-application infrastructure:\n\n```yaml\nname: my-app\ninfra:\n  layers:\n    - name: base\n      path: ./infra/base\n    - name: app\n      path: ./infra/app\nservices:\n  web:\n    project: ./src/web\n    language: js\n    host: containerapp\n```\n\nThe `base` layer creates shared resources like networking, identity, and monitoring. The `app` layer creates the application-specific resources (such as a Container App environment and container apps) that reference the base resources.\n\nDuring development, you might provision the base layer once and iterate on the application layer:\n\n```bash\nazd provision base\nazd provision app\nazd provision app  # re-provision only the app layer after changes\n```\n\n## Example: Mixed IaC providers\n\nEach layer can use a different IaC provider. For example, you might use Bicep for networking and Terraform for the application layer:\n\n```yaml\nname: my-app\ninfra:\n  layers:\n    - name: networking\n      path: ./infra/networking\n      provider: bicep\n    - name: application\n      path: ./infra/application\n      provider: terraform\n```\n\n## Considerations and limitations\n\n- When provisioning all layers, `azd` processes them sequentially in the order you define.  Plan your layer order so that foundational resources are provisioned first.\n- When tearing down all layers, `azd` processes them in reverse order.\n  - If multiple layers deploy resources into the same Azure resource group and you use the default resource-group–based deletion behavior, shared resources may be deleted when running azd down.\n  - To allow independent tracking and deletion of layered infrastructure, enable deployment stacks using the command `azd config set alpha.deployment.stacks on`\nDeployment stacks allow azd to track resources per layer instead of relying solely on resource group deletion.\n- You can't use the `--preview` flag when provisioning multiple layers at once. Specify a `<layer>` name to use preview mode.\n- Layers operate independently in terms of IaC. To reference outputs from one layer in another layer, use environment variables that `azd` sets after each layer's deployment.\n- All standard `azd` provisioning features (deployment state caching, hooks, parameters, Bicep, or Terraform) work within each individual layer.\n  - Command-level hooks (for example, `preprovision`, `postprovision`) are invoked once per layer. When multiple layers are defined, hooks run for each layer in the order layers are processed.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [azure.yaml schema reference](./azd-schema.md)\n\n- [Feature versioning and release strategy](./feature-versioning.md)\n- [Manage environment variables](./manage-environment-variables.md)\n- [Customize workflows using command and event hooks](./azd-extensibility.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/make-azd-compatible.md",
    "content": "---\ntitle: Create Azure Developer CLI templates overview\ndescription: How to convert an app to an Azure developer enabled template.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, devx-track-bicep, build-2023\n---\n\n# Create Azure Developer CLI templates overview\n\nThe Azure Developer CLI (`azd`) utilizes [templates](azd-templates.md) to provision and deploy app resources to the cloud. Developers can add support for `azd` commands and features by converting their applications to templates. This article provides a contextual overview of the different options for building `azd` templates. Once you understand the concepts in this article, visit the following resources for more detailed implementation guides:\n\n- [Use an existing template for your app](start-with-existing-template.md).\n- [Create a template from your app code](start-with-app-code.md)\n- [Training - build and deploy `azd` templates](/training/paths/azure-developer-cli)\n\n> [!NOTE]\n> This article assumes a general understanding of `azd` templates. Visit the [template overview](azd-templates.md) doc for more information about templates.\n\n## Template creation concepts\n\nCreating an `azd` template requires adding specific configuration and infrastructure assets to your existing code base, or starting a new app from an existing template those same assets. Both workflows are explained in later sections. All `azd` templates share a similar file structure based around `azd` conventions. The following diagram gives a quick overview of the process to create an `azd` template:\n\n:::image type=\"content\" source=\"media/make-azd-compatible/workflow.png\" alt-text=\"Diagram of Azure Developer CLI template workflow.\":::\n\nEvery `azd` template requires the following minimum resources:\n\n- An `infra` folder that holds the infrastructure as code (Bicep or Terraform) files.\n- An `azure.yaml` configuration file that maps your application services to the provisioned infrastructure resources.\n\nOther optional directories are often included as well, such as a `.github` folder with assets to create a CI/CD pipeline. Visit the [template overview](azd-templates.md) doc for more information about templates.\n\nConsider the following sample app repository:\n\n:::image type=\"content\" source=\"media/make-azd-compatible/sample-app-structure.png\" alt-text=\"A screenshot showing the structure of the sample app.\":::\n\nAfter converting this sample app to an `azd` template, the same app repository contains the following:\n\n:::image type=\"content\" source=\"media/make-azd-compatible/azd-template-structure-complete.png\" alt-text=\"A screenshot showing the completed structure of the azd template.\":::\n\nThe original app resources are unchanged, but new assets were added that `azd` depends on for commands such as `azd up`:\n\n- An `infra` folder was added that includes Bicep files to create Azure resources.\n- An `azure.yaml` configuration file was added to map the app code in the `src` directory to the provision Azure resources.\n- A `.azure` folder was created to hold `azd` environment variables.\n- A `.github` folder (optional) was added to support CI/CD pipelines through GitHub actions.\n\n## Template creation workflows\n\nThe `azd init` command is used to initialize an `azd` template for provisioning and deploying the app resources on Azure. The command prompts you to choose between two different workflows to initialize a template that are outlined in the following sections - **Use code in the current directory** and **Use an existing template**.\n\nRun the `azd init` command in the root of the directory you'd like to convert to an `azd template`:\n\n```azdeveloper\nazd init\n```\n\n:::image type=\"content\" source=\"media/make-azd-compatible/azd-init.png\" alt-text=\"A screenshot showing the template init process.\":::\n\n### Use code in the current directory\n\nThis option instructs `azd` to analyze the code in your directory to identity which technologies it uses, such as the programming language, framework and database system. `azd` automatically generates template assets for you, such as the `azure.yaml` service definition file and the `infra` folder with infrastructure-as-code files. The generated assets are a starting point for additional modifications. Use this approach if you plan to use common Azure services supported by `azd` scaffolding features.\n\nVisit the [Start with your app code to create a template](start-with-app-code.md) tutorial for details on how to implement this approach and more information on which Azure resources support automatic detection and scaffolding.\n\n### Select a template\n\nSelect this option to use an existing template that defines many of your Azure resources and architectural goals as a starting point. `azd` will prompt you to select a starter template or another template from the [awesome-azd](https://azure.github.io/awesome-azd/) gallery. When you select a template, the assets of that template are added to your existing project directory to use as a starting point. Some templates include sample app code that you can replace with your own, while some (called \"starter templates\") are infrastructure only.\n\nUse the `azd init` command to pull down an existing template to an empty directory and use it as a starting point for your own app. If the template includes app source code, you can either build off of that code or replace the source code directory with your own.\n\nVisit the [Start with an existing template](start-with-existing-template.md) tutorial for details on how to implement this approach.\n\n## See also\n\n- [Use an existing template for your app](start-with-existing-template.md).\n- [Create a template from your app code](start-with-app-code.md)\n\n[!INCLUDE [request-help](includes/request-help.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure Developer CLI FAQ](./tooling-environment-faq.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/manage-environment-variables.md",
    "content": "---\ntitle: Work with Azure Developer CLI environment variables\ndescription: Learn how to manage and use environment variables in Azure Developer CLI (azd)\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 08/06/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Work with Azure Developer CLI environment variables\n\nThe Azure Developer CLI (`azd`) uses environment variables to store and manage configuration settings for deployment environments. These variables control how your application is provisioned, deployed, and runs in Azure. This article explains how environment variables work within `azd` environments and provides guidance on managing them effectively.\n\n## Understand environment variables\n\nIn the context of the Azure Developer CLI, environment variables are key-value pairs that are tied to specific named environments like *dev*, *test*, or *prod*. Each `azd` environment maintains its own set of environment variables, allowing you to configure different settings for different deployment targets.\n\nEnvironment variables in `azd` are stored in `.env` files within your environment folders in the `.azure` folder. They serve as inputs to:\n\n- Application deployment workflows\n- Configurations for Azure services and connections\n- Infrastructure provisioning via Bicep and Terraform\n\nUnlike traditional environment variables that exist at the operating system level, `azd` environment variables are scoped to specific environments within your project, providing isolation between different deployment targets.\n\nEnvironment variables provide several key benefits when working with `azd`:\n\n- **Environment isolation**: Keep configurations for development, testing, and production separate and distinct.\n- **Configuration consistency**: Ensure all team members use the same settings for a specific environment.\n- **Infrastructure as Code**: Define infrastructure parameterization through variables instead of hard-coded values.\n- **Deployment automation**: Enable CI/CD pipelines to deploy to different environments using the same codebase but different configurations.\n- **Simplified management**: Easily update settings across all services in an environment from a central location.\n\nEach `azd` environment has its own set of variables, allowing for environment-specific configurations while using the same application code and infrastructure templates.\n\n## Environment variables and .env files\n\nThe `azd` environment variables are stored in `.env` files within the environment-specific directories of your project. When you create an environment using `azd env new <name>`, a directory structure is created:\n\n```txt\n.azure/\n├── <environment-name>/\n│   ├── .env                   # Environment variables for this environment\n```\n\nThe `.env` file uses a standard format where each line represents a key-value pair:\n\n```txt\nKEY1=value1\nKEY2=value2\n```\n\n> [!TIP]\n> Visit the [Working with environments](work-with-environments.md) article for more information about `azd` environments.\n\nWhen you run commands such as `azd up`, `azd` automatically loads variables from the select environment's `.env` file.\n\nThese variables influence:\n\n- **Infrastructure provisioning**: Variables like `AZURE_LOCATION` and `AZURE_SUBSCRIPTION_ID` determine where and how resources are created.\n- **Deployment**: Variables like service endpoints control how your application connects to Azure services.\n- **Application configuration**: Variables can be passed to your application configuration to control its behavior.\n- **Resource naming**: Variables like `AZURE_RESOURCE_GROUP` influence resource naming patterns.\n\nThe `.env` file is also updated automatically by `azd` during operations like `azd init`, `azd provision`, and `azd deploy`, capturing outputs from your infrastructure templates and storing them for future use.\n\n## Set environment variables\n\nYou can use different methods to set `azd` environment variables, depending on the scenario.\n\n### Use CLI commands\n\nThe recommended way to set an environment variable is using the `azd env set` command, which includes checks to ensure valid values:\n\n```azdeveloper\nazd env set <key> <value>\n```\n\nFor example, to set a configuration value for your application:\n\n```azdeveloper\nazd env set API_TIMEOUT 5000\n```\n\nThe command adds or updates the variable in the `.env` file of the currently selected environment. You can also target a specific environment using the `--environment` flag:\n\n```azdeveloper\nazd env set API_TIMEOUT 5000 --environment prod\n```\n\nTo verify that your environment variable was set correctly:\n\n```azdeveloper\nazd env get-value API_TIMEOUT\n```\n\n### Output from Bicep\n\nA powerful feature of `azd` is its ability to automatically capture output parameters from your Bicep infrastructure templates as environment variables. For example, when you define an output parameter in your `main.bicep` file:\n\n```bicep\noutput API_ENDPOINT string = apiService.outputs.SERVICE_ENDPOINT_URL\n```\n\nAfter running `azd provision`, this output is automatically saved to the environment's `.env` file:\n\n```text\nAPI_ENDPOINT=https://api-dev-123456.azurewebsites.net\n```\n\nThis approach ensures that your application always has access to the most current resource information, such as:\n\n- Service endpoints and URLs\n- Resource names and identifiers\n\n## Get and use environment variables\n\nOnce set, you can access environment variables in several contexts.\n\n### CLI commands\n\nTo view all environment variables for the current environment:\n\n```azdeveloper\nazd env get-values\n```\n\nTo view the value of a specific variable:\n\n```azdeveloper\nazd env get-value API_ENDPOINT\n```\n\nFor machine-readable output (useful in scripts):\n\n```azdeveloper\nazd env get-values --output json\n```\n\n## Use environment variables in infrastructure files\n\nYou can use environment variables to customize your infrastructure templates. This is useful for naming, tagging, or configuring resources based on the current environment. `azd` also uses tags to locate resources in Azure for deployment and other tasks.\n\nConsider the following common flow:\n\n1. During `azd init`, `azd` sets these environment variables based on the user's response to prompts:\n\n    ```output\n    AZURE_ENV_NAME=myapp-dev\n    AZURE_LOCATION=eastus2\n    ```\n\n2. Reference those variables in `main.parameters.json` in the `infra` folder. `azd` substitutes the values during provisioning and passes the resolved parameters to Bicep:\n\n    ```json\n    {\n      \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#\",\n      \"contentVersion\": \"1.0.0.0\",\n      \"parameters\": {\n        \"name\": {\n          \"value\": \"${AZURE_ENV_NAME}\"\n        },\n        \"location\": {\n          \"value\": \"${AZURE_LOCATION}\"\n        }\n      }\n    }\n    ```\n\n3. Define matching parameters in your Bicep template:\n\n    ```bicep\n    @description('Name of the environment used to derive resource names and tags.')\n    param name string\n\n    @minLength(1)\n    @description('Primary Azure region for all resources.')\n    param location string\n    ```\n\n    `azd` supplies these Bicep parameters with the substituted values in `main.parameters.json`.\n\n4. Use the parameters for resource naming and tags to later identify which environment a resource belongs to:\n\n    ```bicep\n    var resourceToken = toLower(uniqueString(resourceGroup().id, name, location))\n\n    resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {\n      name: 'st${resourceToken}'\n      location: location\n      sku: {\n        name: 'Standard_LRS'\n      }\n      kind: 'StorageV2'\n      tags: {\n        Environment: name\n        Project: 'myproject'\n      }\n    }\n    ```\n\nThis pattern keeps your templates flexible, enables per-environment customization without code changes, and improves resource governance (naming, tagging, and discovery).\n\n> [!NOTE]\n> `azd` also relies on tagging to locate Azure resources during the deployment stage.\n\n### Hooks\n\n`azd` environment variables are automatically preloaded and available in [hooks](azd-extensibility.md) and custom scripts defined in your `azure.yaml` file, you can access environment variables using the following syntax:\n\n### [Bash](#tab/bash)\n\n```bash\n# Use the variables in your script\necho \"API endpoint: $API_ENDPOINT\"\necho \"Deploying to: $AZURE_LOCATION\"\n```\n\n### [PowerShell](#tab/powershell)\n\n```powershell\n# Use the variables in your script\nWrite-Host \"API endpoint: $API_ENDPOINT\"\nWrite-Host \"Deploying to: $AZURE_LOCATION\"\n```\n\n---\n\nYou can define hooks in your `azure.yaml` file to run these scripts at specific points in the `azd` lifecycle:\n\n```yaml\nhooks:\n  postprovision:\n    windows:\n      shell: pwsh\n      run: ./scripts/load-env-vars.ps1\n      interactive: false\n    posix:\n      shell: sh\n      run: ./scripts/load-env-vars.sh\n      interactive: false\n```\n\n> [!TIP]\n> Visit the [Customize workflows using hooks](azd-extensibility.md) article for more information about using hooks.\n\n## Remove or update variables\n\nTo remove a variable from your environment:\n\n```azdeveloper\nazd env unset VARIABLE_NAME\n```\n\nTo update an existing variable:\n\n```azdeveloper\nazd env set VARIABLE_NAME \"new-value\"\n```\n\nTo refresh your local environment variables from the current state of your Azure resources:\n\n```azdeveloper\nazd env refresh\n```\n\nRefreshing your environment is useful when:\n\n- You want to ensure your local `.env` file reflects the latest outputs from your infrastructure (like connection strings, endpoints, etc.).\n- You need to sync environment variables after a teammate updated the environment.\n\n## AZD vs OS environment variables\n\n`azd` environment variables and operating system environment variables serve different purposes and work in different ways:\n\n| Concept | Azure Developer CLI | Operating system |\n|---------|------------------------------------------|--------------------------|\n| Location | Stored in `.azure/<env-name>/.env` files | Set in your operating system environment |\n| Scope | Scoped to a specific named environment within a project | Global to your user session or system |\n| Management | Managed using `azd env` commands | Managed using OS-specific commands (`export`, `set`, etc.) |\n| Access | Loaded automatically by `azd` commands | Typically loaded explicitly in scripts or applications |\n| Target | Tied to Azure resources and deployments | General purpose system configuration |\n| Lifecycle | Persist between terminal sessions | May be temporary or persistent depending on how they're set |\n\n`azd` doesn't automatically read or write OS environment variables. However, you can interact with both types of variables using custom scripts.\n\n**Read `azd` environment variables and OS environment variables**:\n\n### [Bash](#tab/bash)\n\n```bash\n# Access OS environment variable\necho \"OS variable: $PATH\"\n\n# Access azd environment variable\necho \"AZD variable: $(azd env get-value MY_VARIABLE)\"\n```\n\n### [PowerShell](#tab/powershell)\n\n```powershell\n# Access OS environment variable\nWrite-Host \"OS variable: $env:PATH\"\n\n# Access azd environment variable\nWrite-Host \"AZD variable: $(azd env get-value MY_VARIABLE)\"\n```\n\n---\n\n**Write `azd` environment variables to OS or framework environment variables:**\n\n### [Bash](#tab/bash)\n\n```bash\n# Load all azd environment variables into the current shell session\nwhile IFS='=' read -r key value; do\n    value=$(echo \"$value\" | sed 's/^\"//' | sed 's/\"$//')\n    export \"$key=$value\"\ndone <<EOF\n$(azd env get-values)\nEOF\n```\n\n### [PowerShell](#tab/powershell)\n\n```powershell\n# Load all azd environment variables into the current PowerShell session\nforeach ($line in (& azd env get-values)) {\n    if ($line -match \"([^=]+)=(.*)\") {\n        $key = $matches[1]\n        $value = $matches[2] -replace '^\"|\"$'\n        $env:$key = $value\n    }\n}\n```\n\n---\n\n## Standard environment variables\n\n`azd` sets and uses several common environment variables across all environments:\n\n| Variable | Description | Example | When Set |\n|----------|-------------|---------|---------|\n| `AZURE_ENV_NAME` | Name of the current environment | `dev` | When environment is created |\n| `AZURE_LOCATION` | Azure region where resources are deployed | `eastus` | During first provisioning |\n| `AZURE_SUBSCRIPTION_ID` | ID of the Azure subscription used | `00000000-0000-0000-0000-000000000000` | During first provisioning |\n| `AZURE_RESOURCE_GROUP` | Name of the resource group | `rg-myapp-dev` | During provisioning |\n| `AZURE_PRINCIPAL_ID` | The running user/service principal ID | `00000000-0000-0000-0000-000000000000` | During provisioning |\n| `AZURE_PRINCIPAL_TYPE` | The type of a principal in the environment. | `1a2b3c` | During provisioning |\n| `AZURE_TENANT_ID` | ID of the Azure tenant used. | `00000000-0000-0000-0000-000000000000` | During provisioning |\n\n## Secrets and sensitive data considerations\n\nWhile environment variables are convenient for configuration, they require special handling for sensitive data:\n\n### Avoid storing secrets in .env files\n\n`.env` files are typically stored in plain text and can easily be:\n\n- Accidentally committed to source control\n- Shared or copied without proper protections\n- Viewed by anyone with access to the project files\n- Included in logs or error reports\n\n> [!WARNING]\n> Never store secrets in an Azure Developer CLI `.env` file. These files can easily be shared or copied into unauthorized locations, or checked into source control. Use services such as Azure Key Vault or Azure Role Based Access Control (RBAC) for protected or secretless solutions.\n\n### Alternatives for handling secrets\n\nFor sensitive data, consider these more secure approaches:\n\n- **Azure Key Vault references**: Store secrets in Azure Key Vault and reference them in your `.env` file:\n\n   ```azdeveloper\n   azd env set-secret <secret-value>\n   ```\n\n   This command creates a Key Vault secret and stores a reference to it in your `.env` file rather than the actual value.\n\n- **Managed identities**: Configure your Azure services to use managed identities instead of connection strings or access keys.\n- **Environment-specific security**: Apply stricter security controls to production environments than development ones.\n- **Just-in-time secrets**: Generate short-lived credentials during deployment rather than storing persistent secrets.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Work with environments in Azure Developer CLI](work-with-environments.md)\n> [Customize your Azure Developer CLI workflows using hooks](azd-extensibility.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/media/full-stack-deployment/full-stack-circular-dependency.mmd",
    "content": "%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#0078D4','primaryTextColor':'#fff','primaryBorderColor':'#003366','lineColor':'#8A8886','secondaryColor':'#CA5010','tertiaryColor':'#D2D0CE'}}}%%\ngraph TB\n    subgraph \"Circular Dependency Problem\"\n        FE[Front-end Application<br/>React/Angular/Vue]\n        BE[Back-end API<br/>Container App/App Service]\n        DB[(Database<br/>Cosmos DB/SQL)]\n        \n        FE -.->|\"Needs API URL<br/>❌ Not available until deployed\"| BE\n        BE -.->|\"Needs Front-end URL<br/>❌ Not available until deployed\"| FE\n        FE -->|\"Requires connection string\"| DB\n        BE -->|\"Requires connection string\"| DB\n    end\n    \n    subgraph \"Deployment Challenges\"\n        P1[\"❓ Which service deploys first?\"]\n        P2[\"❓ How to configure URLs?\"]\n        P3[\"❓ How to handle CORS?\"]\n    end\n    \n    style FE fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style BE fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style DB fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style P1 fill:#8A8886,stroke:#003366,stroke-width:2px,color:#fff\n    style P2 fill:#8A8886,stroke:#003366,stroke-width:2px,color:#fff\n    style P3 fill:#8A8886,stroke:#003366,stroke-width:2px,color:#fff\n"
  },
  {
    "path": "articles/azure-developer-cli/media/full-stack-deployment/full-stack-dependency-resolution.mmd",
    "content": "%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#0078D4','primaryTextColor':'#fff','primaryBorderColor':'#003366','lineColor':'#0078D4','secondaryColor':'#CA5010','tertiaryColor':'#D2D0CE'}}}%%\ngraph TB\n    subgraph \"Dependency Resolution Strategies\"\n        START[Full-stack Application] --> CHOICE{Choose Strategy}\n        \n        CHOICE -->|Immediate Resolution| IMM[Configure at Deployment]\n        CHOICE -->|Deferred Resolution| DEF[Configure at Runtime]\n        CHOICE -->|Combined| BOTH[Use Both Strategies]\n        \n        IMM --> IMM1[\"✓ Infrastructure-first provisioning<br/>✓ Bicep/Terraform output variables<br/>✓ Environment variables<br/>✓ Container upsert pattern\"]\n        \n        DEF --> DEF1[\"✓ Local config files config.json<br/>✓ Azure App Configuration<br/>✓ Runtime service discovery\"]\n        \n        BOTH --> BOTH1[\"✓ Infrastructure for base config<br/>✓ Runtime for flexible updates\"]\n    end\n    \n    subgraph \"Immediate: Locked at Deployment\"\n        IMM2[\"Configuration set during<br/>azd provision & deploy\"]\n        IMM3[\"Requires redeployment<br/>to change configuration\"]\n    end\n    \n    subgraph \"Deferred: Flexible Updates\"\n        DEF2[\"Configuration loaded<br/>at application startup\"]\n        DEF3[\"Update without<br/>redeployment\"]\n    end\n    \n    IMM1 --> IMM2\n    IMM2 --> IMM3\n    DEF1 --> DEF2\n    DEF2 --> DEF3\n    \n    style START fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style CHOICE fill:#FF8C00,stroke:#003366,stroke-width:3px,color:#fff\n    style IMM fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style DEF fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style BOTH fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style IMM1 fill:#CA5010,stroke:#003366,stroke-width:1px,color:#fff\n    style DEF1 fill:#CA5010,stroke:#003366,stroke-width:1px,color:#fff\n    style BOTH1 fill:#CA5010,stroke:#003366,stroke-width:1px,color:#fff\n    style IMM2 fill:#D2D0CE,stroke:#003366,stroke-width:2px,color:#000\n    style IMM3 fill:#605E5C,stroke:#003366,stroke-width:1px,color:#fff\n    style DEF2 fill:#D2D0CE,stroke:#003366,stroke-width:2px,color:#000\n    style DEF3 fill:#D2D0CE,stroke:#003366,stroke-width:2px,color:#000\n"
  },
  {
    "path": "articles/azure-developer-cli/media/full-stack-deployment/full-stack-deployment-lifecycle.mmd",
    "content": "%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#0078D4','primaryTextColor':'#fff','primaryBorderColor':'#003366','lineColor':'#0078D4','secondaryColor':'#CA5010','tertiaryColor':'#D2D0CE','background':'#fff','mainBkg':'#0078D4','secondBkg':'#CA5010','tertiaryBkg':'#D2D0CE'}}}%%\ngraph LR\n    subgraph \"Azure Developer CLI Lifecycle\"\n        A[azd up] --> B[Package Phase]\n        B --> C[Provision Phase]\n        C --> D[Deploy Phase]\n        D --> E[Application Running]\n        \n        B --> B1[\"Build source code<br/>Prepare artifacts\"]\n        C --> C1[\"Create Azure resources<br/>Generate URLs & connection strings<br/>Output variables\"]\n        D --> D1[\"Deploy packaged code<br/>Configure environment variables<br/>Start services\"]\n    end\n    \n    style A fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style B fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style C fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style D fill:#0078D4,stroke:#003366,stroke-width:2px,color:#fff\n    style E fill:#D2D0CE,stroke:#003366,stroke-width:2px,color:#000\n    style B1 fill:#CA5010,stroke:#003366,stroke-width:1px,color:#fff\n    style C1 fill:#CA5010,stroke:#003366,stroke-width:1px,color:#fff\n    style D1 fill:#CA5010,stroke:#003366,stroke-width:1px,color:#fff\n"
  },
  {
    "path": "articles/azure-developer-cli/metadata.md",
    "content": "---\ntitle: Work with Azure Developer CLI metadata for Bicep input parameters\ndescription: Learn how to improve the deployment experience by adding specific `azd` metadata to Bicep input parameters.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 09/16/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Work with Azure Developer CLI metadata for Bicep input parameters\n\nAzure Developer CLI (`azd`) supports Bicep templates with the `@metadata` decorator. Add metadata to Bicep input parameters to improve deployment with intelligent defaults, automatic value generation, and better parameter prompting.\n\n## Adding metadata\n\nInput parameters in Bicep support [@metadata](/azure/azure-resource-manager/bicep/parameters#metadata) as a schema-free object. Add `azd` metadata by including the `azd` field in the parameter metadata:\n\n```bicep\n@metadata({\n  azd: {}\n})\nparam someInput <param-type>\n```\n\nAzure Developer CLI metadata doesn't depend on the parameter's type, and you can add it to any parameter.\n\n## Supported metadata\n\nThe supported configuration fields for `azd` metadata are:\n\n  | Field | Description |\n  |-------|-------------|\n  | `type` | Defines how `azd` prompts for this parameter. For example, `location`. |\n  | `config` | Describes settings for some metadata types, like `generate`. |\n  | `default` | Defines a value for `azd` to highlight first during a select prompt. |\n  | `usageName` | Controls quota check for AI model location selection. |\n\nEach field is described in more detail in the following sections.\n\n### Type\n\nThis configuration defines how `azd` prompts for an input parameter. Supported types include:\n\n- **location**\n\n    Use the `location` type to tell `azd` that an input parameter handles an Azure location. When `azd` finds the `location` type in the metadata, it prompts for a value using the location selection list. For example:\n\n    ```bicep\n    @metadata({\n      azd: {\n        type: 'location'\n      }\n    })\n    param someInput string\n    ```\n\n    Prompt flow:\n\n    :::image type=\"content\" source=\"media/metadata/prompt-with-location-metadata.png\" alt-text=\"A screenshot showing a prompt for location with metadata.\":::\n\n    Combine the `location` type with the `default` field to control which location is highlighted first during the prompt flow. For example:\n\n    ```bicep\n    @metadata({\n      azd: {\n        type: 'location'\n        default: 'westus'\n      }\n    })\n    param someInput string\n    ```\n\n    Prompting flow:\n\n    :::image type=\"content\" source=\"media/metadata/prompt-with-location-default-metadata.png\" alt-text=\"A screenshot showing a prompt for location with metadata that includes a default value.\":::\n\n    The highlighted default option matches the `default` field from the metadata. This approach lets template authors recommend a location while users can confirm or change it. Setting a default value for the input parameter in Bicep skips the prompt flow and uses the default value without user confirmation.\n\n- **generate**\n\n    Use the `generate` type to tell `azd` to automatically create the value for the input parameter. This type is often used to generate passwords or unique identifiers:\n\n    ```bicep\n    @metadata({\n      azd: {\n        type: 'generate'\n        config: {\n          length: 10\n        }\n      }\n    })\n    param someInput string\n    ```\n\n    > [!NOTE]\n    > The `config` field is required with `type: 'generate'`.\n\n    When `azd` runs, it generates a 10-character value for the input parameter without prompting for input. See the [config](#config) section for options to configure auto-generation values.\n\n- **resourceGroup**\n\n    Use the `resourceGroup` type to tell `azd` to prompt for a resource group for this input:\n\n    ```bicep\n    @metadata({\n      azd: {\n        type: 'resourceGroup'\n      }\n    })\n    param someInput string\n    ```\n\n    Prompt flow:\n\n    :::image type=\"content\" source=\"media/metadata/prompt-with-resource-group.png\" alt-text=\"A screenshot showing a prompt with the resource group type.\":::\n\n### Config\n\nThe `config` object is required with the `generate` type. It controls auto-generation options. The following table describes the generate configuration options:\n\n| Field Name | Type | Description | Default |\n|------------|------|-------------|---------|\n| length | int | Total length of the generated value | 0 |\n| noLower | bool | If true, excludes lowercase letters. | false |\n| noUpper | bool | If true, excludes uppercase letters. | false |\n| noNumeric | bool | If true, excludes numbers. | false |\n| noSpecial | bool | If true, excludes special characters. | false |\n| minLower | int | Minimum number of lowercase letters required. | 0 |\n| minUpper | int | Minimum number of uppercase letters required. | 0 |\n| minNumeric | int | Minimum number of numbers required. | 0 |\n| minSpecial | int | Minimum number of special characters required. | 0 |\n\n> [!IMPORTANT]\n> The sum of all minimum requirements (MinLower + MinUpper + MinNumeric + MinSpecial) can't exceed the total Length. If any \"No-\" flag is true, set the corresponding \"Min-\" value to 0.\n\nFor example, generate a value with length 10, no special characters, and no numbers:\n\n```bicep\n@metadata({\n  azd: {\n    type: 'generate'\n    config: {\n      length: 10\n      noNumeric: true\n      noSpecial: true\n    }\n  }\n})\nparam someInput string\n```\n\n### Default\n\nDefines the initial value from a list to highlight. Combine it with the `location` type or apply it directly to an input with a defined list of options:\n\n```bicep\n@allowed(['foo', 'bar', 'baz'])\n@metadata({\n  azd: {\n    default: 'baz'\n  }\n})\nparam someInput string\n```\n\nThis example uses the `@allowed()` annotation from Bicep to define a list of supported values for the input parameter. When `azd` prompts for this input, it uses the list of allowed values. The `default` field in the metadata controls which option is set as the initial selection:\n\n:::image type=\"content\" source=\"media/metadata/prompt-with-default.png\" alt-text=\"A screenshot showing default during prompt from allowed values.\":::\n\n### UsageName\n\nThe `usageName` field filters the location list to only locations where a given AI SKU and capacity are available:\n\n```bicep\n@metadata({\n  azd: {\n    type: 'location'\n    usageName: [\n      'OpenAI.GlobalStandard.gpt-5-mini,10'\n    ]\n  }\n})\nparam someInput string\n```\n\nThis example makes `azd` show only Azure locations where the AI model `gpt-5-mini` has enough quota (capacity of at least 10).\n\nPrompt flow:\n\n:::image type=\"content\" source=\"media/metadata/prompt-with-usage-name.png\" alt-text=\"A screenshot showing setting usageName to prompt for AI location.\":::\n\n> [!NOTE]\n> `azd` returns an error if there isn't a location with enough quota."
  },
  {
    "path": "articles/azure-developer-cli/monitor-your-app.md",
    "content": "---\ntitle: Monitor your app using Azure Developer CLI\ndescription: Learn how to use Azure Developer CLI (azd) to monitor your app health.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, build-2023\n---\n\n# Monitor your app using Azure Developer CLI\n\nIn this article, you learn how to use Azure Developer CLI (`azd`) to monitor your app health.\n\nWhile we use the [React Web App with Node.js API and MongoDB on Azure](https://github.com/azure-samples/todo-nodejs-mongo) template for this guide, you can use any of the [Azure Developer CLI templates](./azd-templates.md).\n\n> [!NOTE]\n> The `azd monitor` command is still in beta. Read more about alpha and beta feature support on the [feature versioning and release strategy](/azure/developer/azure-developer-cli/feature-versioning) page.\n\n## Prerequisites\n\n- [Install the Azure Developer CLI](./install-azd.md)\n- [Run `azd init` and `azd up` for the Node.js template](./get-started.md)\n\n## Configure your environment\n\nCreate monitoring activity in the app before running the `azd monitor` commands:\n\n1. Open the ToDo app in your preferred code editor.\n\n1. Create a new list and add a couple of items.\n\n## Monitor the app\n\nTo help with monitoring apps, `azd` provides a `monitor` command to [launch various Application Insights dashboards](/azure/azure-monitor/app/overview-dashboard). Run the command with one of the following parameters in the project directory to monitor app health:\n\n| Application Insights dashboard | Command                  |\n|--------------------------------|--------------------------|\n| Main dashboard                 | `azd monitor --overview` |\n| Live metrics dashboard         | `azd monitor --live`     |\n| Logs dashboard                 | `azd monitor --logs`     |\n\n## Clean up resources\n\nWhen you no longer need the resources created in this article, run the `azd down` command to delete the resource group:\n\n```azdeveloper\nazd down\n```\n\n## See also\n\n- [Azure Monitor documentation](/azure/azure-monitor/)\n\n[!INCLUDE [request-help](includes/request-help.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Make your project Azure Developer CLI (azd) compatible](make-azd-compatible.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/overview.md",
    "content": "---\ntitle: What is the Azure Developer CLI?\ndescription: Overview of the features and capabilities of the Azure Developer CLI that helps developers be more productive when building and deploying apps to Azure.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: overview\nms.custom: devx-track-azdevcli, build-2023\n---\n\n# What is the Azure Developer CLI?\n\nBuilding and deploying cloud applications can be complex and time-consuming. Developers often face challenges such as setting up cloud infrastructure, configuring deployment pipelines, and ensuring best practices for security and scalability. Managing these tasks typically requires deep knowledge of Azure services, infrastructure as code, and DevOps processes, which can slow down development and increase the risk of errors.\n\nThe Azure Developer CLI (`azd`) is an open-source tool that accelerates provisioning and deploying app resources on Azure. `azd` provides best practice, developer-friendly commands that map to key stages in your development workflow, whether you're working in the terminal, an integrated development environment (IDE), or through CI/CD (continuous integration/continuous deployment) pipelines.\n\n `azd` uses [extensible blueprint templates](./azd-templates.md) that include everything you need to get an application up and running on Azure. These templates include:\n\n- Reusable infrastructure as code assets to provision cloud resources services using Bicep or Terraform.\n- Proof-of-concept or starter app code that can be customized or replaced with your own app code.\n- Configuration files to handle deploying your app to the provisioned resources.\n- Optionally, pipeline workflow files for GitHub Actions or Azure Pipelines to enable CI/CD integrations.\n\nYou can also [create your own template](./make-azd-compatible.md?pivots=azd-create) or find one to customize and expand on from the [Awesome AZD](./make-azd-compatible.md?pivots=azd-convert) gallery.\n\n## A sample `azd` workflow\n\nThe following steps demonstrate the basics of a common `azd` workflow. Visit the [installation](/azure/developer/azure-developer-cli/install-azd) and [quickstart](/azure/developer/azure-developer-cli/get-started) pages for more details on installing and getting started with `azd`.\n\nYou can install `azd` on common platforms using a single command:\n\n### [Windows](#tab/windows)\n\n```bash\nwinget install microsoft.azd\n```\n\n### [MacOS](#tab/mac)\n\n```bash\nbrew install azure/azd/azd\n```\n\n### [Linux](#tab/linux)\n\n```bash\ncurl -fsSL https://aka.ms/install-azd.sh | bash\n```\n\n---\n\nAfter you install `azd`, provision and deploy app resources to Azure in only a few steps:\n\n1. Select an [Azure Developer CLI template](./azd-templates.md#start-with-an-existing-template) such as the [`hello-azd`](https://github.com/Azure-Samples/hello-azd) demo template that contains the app resources you want to provision and deploy.\n1. Run the [`azd init`](./get-started.md) command to initialize the template:\n\n    ```azdeveloper\n    azd init -t hello-azd\n    ```\n\n1. Run the [`azd up`](./get-started.md) command to package, provision and deploy the app resources:\n\n    ```azdeveloper\n    azd up\n    ```\n\n1. Iterate on the application code and deploy changes as needed by running `azd deploy`.\n1. Update Azure resources by modifying the template's Infrastructure as Code (IaC) and then running `azd provision`.\n\n    > [!NOTE]\n    > Alternatively, you can also run `azd up` whenever you make a changes to your app code or infrastructure files, which handles both provisioning and deploying app resources. Visit the [reference page] for a complete list of `azd` commands.\n\n## Introductory video\n\nCheck out the following video for a demonstration of working with `azd`. More `azd` video content is available on the [Microsoft Developer](https://www.youtube.com/@MicrosoftDeveloper) YouTube channel.\n\n> [!VIDEO https://www.youtube.com/embed/f_HpDpEmWZ4?si=5Vf7BuRsO1hbsn0C]\n\n## Next steps\n\n- [View supported languages and environments](./supported-languages-environments.md)\n- [Install the Azure Developer CLI](./install-azd.md).\n- [Walk through the `azd` quickstart](./get-started.md) to see Azure Developer CLI in action.\n"
  },
  {
    "path": "articles/azure-developer-cli/pipeline-advanced-features.md",
    "content": "---\ntitle: Configure advanced features for Azure Pipelines with the Azure Developer CLI\ndescription: Learn how to configure advanced Azure Pipelines features using the Azure Developer CLI\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 05/12/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, build-2023\n---\n\n# Advanced pipeline features and configurations\n\nYou can extend the `azd pipeline config` command to support advanced scenarios and custom requirements, as described in the following sections.\n\n## Custom secrets and variables\n\nBy default, `azd` sets essential variables and secrets for your pipeline. For example, when you run `azd pipeline config`, it creates variables such as `subscription id`, `environment name`, and `region`. These variables are referenced in your pipeline definition:\n\n```yaml\nenv:\n   AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}\n   AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}\n   AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}\n   AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}\n   AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}\n```\n\nWhen the pipeline runs, `azd` retrieves these values from the environment and maps them to the pipeline variables and secrets. Depending on your template, you may want to control additional settings using environment variables. For example, you might set a `KEY_VAULT_NAME` environment variable to define the name of a Key Vault resource in your infrastructure.\n\nTo support custom variables and secrets, define them in your template's `azure.yaml` file. For example:\n\n```yaml\npipeline:\n  variables:\n    - KEY_VAULT_NAME\n    - STORAGE_NAME\n  secrets:\n    - CONNECTION_STRING\n```\n\nWith this configuration, `azd` checks if any of the listed variables or secrets have a value in the environment. It then creates the corresponding variable or secret in the pipeline, using the environment value.\n\nYou can reference these variables and secrets in your `azure-dev.yaml` pipeline definition:\n\n```yaml\n- name: Provision Infrastructure\n   run: azd provision --no-prompt\n   env:\n      KEY_VAULT_NAME: ${{ variables.KEY_VAULT_NAME }}\n      STORAGE_NAME: ${{ variables.STORAGE_NAME }}\n      CONNECTION_STRING: ${{ secrets.CONNECTION_STRING }}\n```\n\n> [!NOTE]\n> After updating the list of secrets or variables in `azure.yaml`, rerun `azd pipeline config` to update the pipeline values.\n\n## Infrastructure parameters\n\nConsider the following Bicep example:\n\n```bicep\n@secure()\nparam BlobStorageConnection string\n```\n\nIf the `BlobStorageConnection` parameter has no default value, `azd` prompts you for a value during setup. However, there is no interactive prompt during CI/CD runs. Instead, `azd` requests the value when you run `azd pipeline config`, saves it as a pipeline secret, and retrieves it automatically when the pipeline runs.\n\n`azd` uses a pipeline secret called `AZD_INITIAL_ENVIRONMENT_CONFIG` to store and provide required parameter values. Reference this secret in your pipeline definition:\n\n```yaml\n- name: Provision Infrastructure\n   run: azd provision --no-prompt\n   env:\n      AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}\n```\n\nWhen the pipeline runs, `azd` uses the secret to supply parameter values, eliminating the need for interactive prompts.\n\n> [!NOTE]\n> If you add a new parameter, rerun `azd pipeline config` to update the pipeline configuration.\n"
  },
  {
    "path": "articles/azure-developer-cli/pipeline-azure-pipelines.md",
    "content": "---\ntitle: Configure a pipeline using Azure Pipelines\ndescription: Learn how to create a pipeline and push updates using Azure Pipelines and the Azure Developer CLI\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 05/12/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, build-2023\n---\n\n# Create an Azure DevOps CI/CD pipeline using the Azure Developer CLI\n\nThis article shows how to use the Azure Developer CLI (`azd`) to create a CI/CD pipeline with Azure DevOps Pipelines (Azure Pipelines) for an `azd` template. The pipeline enables you to push updates to a code repository and have your changes automatically provisioned and deployed to your Azure environment.\n\n> [!NOTE]\n> The `azd pipeline config` command is in beta. For details, see the [feature versioning and release strategy](/azure/developer/azure-developer-cli/feature-versioning).\n\n## Prerequisites\n\n- [Install the Azure Developer CLI](install-azd.md).\n- [Visual Studio Code](https://code.visualstudio.com/download) installed.\n\n## Initialize the template\n\nThis example uses the [Hello-AZD](https://github.com/azure-samples/hello-azd) template, but you can follow these steps for any template that includes a pipeline definition file (found in the `.github` or `.azdo` folders).\n\n1. In an empty directory, initialize the `hello-azd` template:\n\n   ```azdeveloper\n   azd init -t hello-azd\n   ```\n\n1. When prompted, enter a name for the environment (for example, *hello-azd*).\n\n## Set up Azure Pipelines\n\n> [!NOTE]\n> If you're using Azure Pipelines for a Java template on Windows, see [the troubleshooting guide](./troubleshoot.md#azd-pipeline-config-using-azdo-for-java-templates-on-windows).\n\n### Create or use an Azure Pipelines organization\n\nTo use Azure Pipelines, you need an organization. Create one at https://dev.azure.com if you don't already have one.\n\n### Create a Personal Access Token (PAT)\n\nThe Azure Developer CLI requires a Personal Access Token (PAT) to configure Azure Pipelines. [Create a new PAT](/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate#create-a-pat) with the following scopes:\n\n- Agent Pools (read, manage)\n- Build (read and execute)\n- Code (full)\n- Project and team (read, write, and manage)\n- Release (read, write, execute, and manage)\n- Service Connections (read, query, and manage)\n\n### Configure the pipeline\n\n1. Run the following command to configure an Azure Pipelines project and repository with a deployment pipeline:\n\n   ```azdeveloper\n   azd pipeline config --provider azdo\n   ```\n\n   > [!NOTE]\n   > By default, `azd pipeline config` for Azure Pipelines uses client credentials. OIDC/federated credentials are not currently supported.\n   > [Learn more about OIDC support in `azd`.](./tooling-environment-faq.md#what-is-openid-connect-oidc-and-is-it-supported)\n\n1. Respond to the prompts:\n\n   - **Personal Access Token (PAT):**\n     - Paste your PAT.\n     - Optionally, export your PAT as a system environment variable to avoid repeated prompts:\n\n       ```azdeveloper\n       export AZURE_DEVOPS_EXT_PAT=<PAT>\n       ```\n\n   - **Azure Pipelines Organization Name:**\n     - Enter your organization name. This value is saved in the `.env` file for the current environment.\n\n   - **A remote named \"origin\" was not found. Would you like to configure one?**\n     - Yes\n\n   - **How would you like to configure your project?**\n     - Create a new Azure Pipelines Project\n\n   - **Enter the name for your new Azure Pipelines Project OR Hit enter to use this name: ( {default name} )**\n      - Select **Enter**, or create a unique project name.\n\n   - **Would you  like to commit and push your local changes to start the configured CI pipeline?**\n      - Yes\n\n1. To verify the build, go to your project in the Azure Pipelines portal (https://dev.azure.com).\n\n## Make and push a code change\n\n1. In the `/src/components/pages` directory, open `Home.razor`.\n2. Change the `Hello AZD!` header text to `Hello, pipeline!` and save the file.\n3. Create a branch and commit your change. The `main` branch is protected, so push your changes from a new branch and create a Pull Request in Azure Pipelines. The pull request triggers the pipeline and blocks merging if the pipeline fails.\n4. Approve and merge your pull request to start the pipeline again.\n\n   :::image type=\"content\" source=\"media/configure-devops-pipeline/commit-changes-to-github.png\" alt-text=\"Screenshot of steps required to make and commit change to test file.\":::\n\n5. In your browser, open your project's repository to see your commit and the Azure Pipeline run.\n\n   :::image type=\"content\" source=\"media/configure-devops-pipeline/azure-devops-pipeline-after-test-update.png\" alt-text=\"Screenshot of GitHub workflow running after test update.\":::\n\n6. Visit the web frontend URL to inspect the update.\n\n## Use `azd` as an Azure Pipelines task\n\nAdd [`azd` as an Azure Pipelines task](https://aka.ms/azd-azdo-task) to install `azd` in your pipeline. Add the following to `.azdo/pipelines/azure-dev.yml`:\n\n```yaml\ntrigger:\n  - main\n  - branch\n\npool:\n  vmImage: ubuntu-latest\n  # vmImage: windows-latest\n\nsteps:\n  - task: setup-azd@0\n    displayName: Install azd\n```\n\n---\n\n## Clean up resources\n\nWhen you no longer need the Azure resources created in this article, run:\n\n```azdeveloper\nazd down\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Monitor your app using Azure Developer CLI (azd)](monitor-your-app.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/pipeline-create-definition.md",
    "content": "---\ntitle: Create a custom pipeline definition file for GitHub Actions or Azure Pipelines\ndescription: Learn how to create a pipeline definition file for GitHub Actions or Azure Pipelines.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 05/12/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, build-2023\n---\n\n# Create a pipeline definition\n\nIf your `azd` template doesn't include a CI/CD pipeline definition file, you can create one to automate your application's build and deployment. A well-structured pipeline definition typically includes four main sections:\n\n- **Trigger**: Specifies events when the pipeline should run, such as code pushes to specific branches, pull requests, or manual triggers. Defining triggers ensures your pipeline runs automatically in response to development activities, enabling continuous integration and deployment.\n\n- **Permissions**: Specifies the access required for the pipeline to interact with resources securely. For example, grant permissions to read repository contents or request identity tokens. Correct permissions are essential for secure and successful deployments.\n\n- **Operating System or Pool**: Sets the environment for pipeline jobs, such as a specific virtual machine image (for example, `ubuntu-latest`) or an agent pool. Choosing the right environment ensures compatibility with your application's build and deployment requirements.\n\n- **Steps**: Lists the tasks the pipeline performs, such as checking out code, installing dependencies, building, provisioning infrastructure, and deploying to Azure. Each step should be clearly defined to automate the end-to-end deployment process.\n\nThe following examples show how to create a pipeline definition file and related configurations for GitHub Actions and Azure Pipelines.\n\n## [GitHub Actions](#tab/GitHub)\n\nTo run `azd` in GitHub Actions, configure the following settings:\n\n- Grant `id-token: write` and `contents: read` access scopes.\n- [Install the azd action](https://aka.ms/azd-gha), unless using a Docker image with `azd` preinstalled.\n\nUse this template as a starting point for your pipeline definition:\n\n```yaml\non:\n  workflow_dispatch:\n  push:\n    # Run when commits are pushed to mainline branch (main or master)\n    # Set this to the mainline branch you are using\n    branches:\n      - main\n      - master\n\n# Set this permission if you are using a Federated Credential.\npermissions:\n  id-token: write\n  contents: read\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    # azd build-in variables.\n    # This variables are always set by `azd pipeline config`\n    # You can set them as global env (apply to all steps) or you can add them to individual steps' environment\n    env:\n      AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}\n      AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}\n      AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}\n      AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}\n      AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}\n      ## Define the additional variables or secrets that are required globally (provision and deploy)\n      # ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}\n      # ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}      \n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      # using the install-azd action\n      - name: Install azd\n        uses: Azure/setup-azd@v1.0.0\n\n      # # If you want to use azd-daily build, or install it from a PR, you can remove previous step and\n      # # use the next one:\n      # - name: Install azd - daily or from PR\n      #  # Update this scrip based on the OS - pool of your pipeline. This example is for a linux pipeline installing daily build\n      #  run: curl -fsSL https://aka.ms/install-azd.sh | bash -s -- --version daily\n      #  shell: pwsh\n\n      # azd set up Federated Credential by default. You can remove this step if you are using Client Credentials\n      - name: Log in with Azure (Federated Credentials)\n        if: ${{ env.AZURE_CLIENT_ID != '' }}\n        run: |\n          azd auth login `\n            --client-id \"$Env:AZURE_CLIENT_ID\" `\n            --federated-credential-provider \"github\" `\n            --tenant-id \"$Env:AZURE_TENANT_ID\"\n        shell: pwsh\n\n      ## If you set up your pipeline with Client Credentials, remove previous step and uncomment this one\n      # - name: Log in with Azure (Client Credentials)\n      #   if: ${{ env.AZURE_CREDENTIALS != '' }}\n      #   run: |\n      #     $info = $Env:AZURE_CREDENTIALS | ConvertFrom-Json -AsHashtable;\n      #     Write-Host \"::add-mask::$($info.clientSecret)\"\n\n      #     azd auth login `\n      #       --client-id \"$($info.clientId)\" `\n      #       --client-secret \"$($info.clientSecret)\" `\n      #       --tenant-id \"$($info.tenantId)\"\n      #   shell: pwsh\n      #   env:\n      #     AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }}\n\n      - name: Provision Infrastructure\n        run: azd provision --no-prompt\n        env:\n         #  # uncomment this if you are using infrastructure parameters\n         #  AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}\n         ## Define the additional variables or secrets that are required only for provision \n         #  ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}\n         #  ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}\n\n      - name: Deploy Application\n        run: azd deploy --no-prompt\n        env:\n         ## Define the additional variables or secrets that are required only for deploy\n         #  ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}\n         #  ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}\n```\n\n## [Azure Pipelines](#tab/azdo)\n\nYou can use the following template as a starting point for your own pipeline definition:\n\n```yaml\n# Run when commits are pushed to mainline branch (main or master)\n# Set this to the mainline branch you are using\ntrigger:\n  - main\n  - master\n\npool:\n  vmImage: ubuntu-latest\n\nsteps:\n  - task: setup-azd@0 \n    displayName: Install azd\n\n  # If you can't use above task in your organization, you can remove it and uncomment below task to install azd\n  # The script can be changed to use azd-daily build or build from PR\n#   - task: Bash@3\n#     displayName: Install azd\n#     inputs:\n#       targetType: 'inline'\n#       script: |\n#         curl -fsSL https://aka.ms/install-azd.sh | bash\n\n  # azd delegate auth to az to use service connection with AzureCLI@2\n  - pwsh: |\n      azd config set auth.useAzCliAuth \"true\"\n    displayName: Configure AZD to Use AZ CLI Authentication.\n\n   - task: AzureCLI@2\n      displayName: Provision Infrastructure\n      inputs:\n         # azconnection is created by azd pipeline config\n         azureSubscription: azconnection\n         scriptType: bash\n         scriptLocation: inlineScript\n         inlineScript: |\n         azd provision --no-prompt\n      env:\n         # azd build-in variables.\n         AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)\n         AZURE_ENV_NAME: $(AZURE_ENV_NAME)\n         AZURE_LOCATION: $(AZURE_LOCATION)\n         # # uncomment this if you are using infrastructure parameters\n         # AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}\n         # # Define the additional variables or secrets that are required only for provision \n         # ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}\n         # ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}\n\n   - task: AzureCLI@2\n      displayName: Deploy Application\n      inputs:\n         azureSubscription: azconnection\n         scriptType: bash\n         scriptLocation: inlineScript\n         inlineScript: |\n         azd deploy --no-prompt\n      env:\n         # azd build-in variables.\n         AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)\n         AZURE_ENV_NAME: $(AZURE_ENV_NAME)\n         AZURE_LOCATION: $(AZURE_LOCATION)\n         # # Define the additional variables or secrets that are required only for deploy \n         # ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}\n         # ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}\n```\n\n[!INCLUDE [request-help](includes/request-help.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Monitor your app using Azure Developer CLI (azd)](monitor-your-app.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/pipeline-github-actions.md",
    "content": "---\ntitle: Configure a pipeline using GitHub Actions\ndescription: Learn how to create a pipeline and push updates using GitHub Actions and the Azure Developer CLI.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 07/29/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, build-2023\n---\n\n# Create a GitHub Actions CI/CD pipeline using the Azure Developer CLI\n\nIn this article, you'll learn how to use the Azure Developer CLI (`azd`) to create a GitHub Actions CI/CD pipeline for an `azd` template. This pipeline enables you to push template updates to a code repository and have your changes automatically provisioned and deployed to your Azure environment.\n\n> [!NOTE]\n> The `azd pipeline config` command is in beta. For details, see the [feature versioning and release strategy](/azure/developer/azure-developer-cli/feature-versioning).\n\n## Prerequisites\n\n- [Install the Azure Developer CLI](install-azd.md)\n- [Visual Studio Code](https://code.visualstudio.com/download) (optional, for editing files)\n- A GitHub account\n- An Azure subscription\n\n## Initialize the template\n\nThis example uses the [Hello-AZD](https://github.com/azure-samples/hello-azd) template, but you can follow these steps for any `azd` template that includes a pipeline definition file (typically found in the `.github` or `.azdo` folders).\n\n1. In an empty directory, initialize the `hello-azd` template:\n\n   ```azdeveloper\n   azd init -t hello-azd\n   ```\n\n1. When prompted, enter a name for the environment, such as *helloazd*.\n\n## Create a pipeline using GitHub Actions\n\nFollow these steps to create and configure a pipeline:\n\n1. In a terminal at the root of your template, run:\n\n   ```azdeveloper\n   azd pipeline config\n   ```\n\n1. When prompted to select a provider, choose **GitHub**.\n\n    ```output\n    ? Select a provider:  [Use arrows to move, type to filter]\n    > GitHub\n      Azure DevOps\n    ```\n\n1. Select your desired Azure subscription and region.\n\n1. When prompted to configure your remote repository, choose **Create a new private GitHub repository**. If you have an existing project you'd like to use, you can also choose **Select an existing GitHub project**.\n\n    ```azdeveloper\n    ? How would you like to configure your git remote to GitHub?  [Use arrows to move, type to filter]\n      Select an existing GitHub project\n    > Create a new private GitHub repository\n      Enter a remote URL directly\n    ```\n\n1. Enter a name for the new repository.\n\n1. When prompted to commit and push your local changes to start a new GitHub Actions run, enter `y`.\n\n1. Review the output in the terminal. The `azd pipeline config` command displays the GitHub repository name for your project.\n\n   > [!NOTE]\n   > By default, `azd pipeline config` configures [OpenID Connect (OIDC)](../github/connect-from-azure-openid-connect.md), also called **federated** credentials. To use client credentials instead, run `azd pipeline config --auth-type client-credentials`.\n   >\n   > OIDC/federated credentials are **not** supported for Terraform.\n   >\n   > [Learn more about OIDC support in `azd`.](./tooling-environment-faq.md#what-is-openid-connect-oidc-and-is-it-supported)\n\n1. In your browser, open the GitHub repository for your project.\n\n1. Select **Actions** to see the workflow running.\n\n   :::image type=\"content\" source=\"media/configure-devops-pipeline/github-workflow.png\" alt-text=\"Screenshot of GitHub workflow running.\":::\n\n## Test the pipeline with a code change\n\n1. In the project's `/src/components/pages` directory, open `Home.razor`.\n1. Locate the `Hello AZD!` header text near the top of the file.\n1. Change the text to `Hello, pipeline!`.\n1. Save the file.\n1. Commit and push your change. This action triggers the GitHub Actions pipeline to deploy the update.\n\n   :::image type=\"content\" source=\"media/configure-devops-pipeline/commit-changes-to-github.png\" alt-text=\"Screenshot of steps required to make and commit change to test file.\":::\n\n1. In your browser, open your project's GitHub repository to see:\n   - Your commit\n   - The commit from GitHub Actions setup\n\n   :::image type=\"content\" source=\"media/configure-devops-pipeline/committed-changes-in-github-repo.png\" alt-text=\"Screenshot of your committed change in GitHub.\":::\n\n1. Select **Actions** to see the test update reflected in the workflow.\n\n   :::image type=\"content\" source=\"media/configure-devops-pipeline/github-workflow-after-test-update.png\" alt-text=\"Screenshot of GitHub workflow running after test update.\":::\n\n1. To view the deployed update, visit the web frontend URL provided in the `azd` output.\n\n## Use `azd` as a GitHub Action\n\nYou can install `azd` as a GitHub Action using the [setup-azd action](https://github.com/Azure/setup-azd). To use it, add the following to your `.github/workflows/azure-dev.yml` file:\n\n```yml\non: [push]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Install azd\n        uses: Azure/setup-azd@v1.0.0\n```\n\n> [!NOTE]\n> Check the [setup-azd releases](https://github.com/Azure/setup-azd/releases) for the latest version number.\n\n## Clean up resources\n\nWhen you no longer need the Azure resources created in this article, run the following command:\n\n```azdeveloper\nazd down\n```\n\nThis command removes all Azure resources associated with your project.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Monitor your app using Azure Developer CLI (azd)](monitor-your-app.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/powershell-guidance.md",
    "content": "---\ntitle: Troubleshoot PowerShell issues with the Azure Developer CLI\ndescription: Troubleshoot PowerShell issues when running Azure Developer CLI templates that utilize hooks with PowerShell scripts\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 03/20/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, build-2023\n---\n\n# Troubleshoot PowerShell issues with Azure Developer CLI templates\n\nAzure Developer CLI (`azd`) templates often use [hooks](/azure/developer/azure-developer-cli/azd-extensibility) to execute custom scripts before and after `azd` lifecycle events, such as provisioning and deployment. Users can choose between Bash or PowerShell to write these custom scripts, depending on their preference and the environment they're working in. If you plan to use templates that rely on PowerShell to execute scripts, make sure you have [PowerShell 7.4 or higher installed](/powershell/scripting/install/installing-powershell) to avoid potential errors.\n\n## PowerShell considerations\n\nIf a template relies on PowerShell to execute hook scripts, you'll encounter an error when running commands like `azd up` if PowerShell version 7.x isn't installed. The Azure Developer CLI (`azd`) doesn't check for PowerShell installation before running commands; it only checks when executing a PowerShell hook script.\n\nTo avoid these errors:\n\n- Ensure PowerShell version 7.x is installed on your system\n- Verify whether the template relies on hook scripts before running `azd` commands.\n\n### Check your installed version of PowerShell\n\nWhen you open PowerShell, it should print out the current version by default. You can also manually check the installed version of PowerShell in any terminal window by running the following command:\n\n```bash\npwsh --version\n```\n\n### Check if PowerShell is a dependency\n\nBefore running commands like `azd up`, users should verify if their template includes PowerShell scripts by checking the `hooks` section of the `azure.yaml` file, which defines custom scripts to run at various stages of the workflow.\n\nConsider the following `azure.yaml` file that includes hooks:\n\n```yaml\nname: my-azure-project\nservices:\n  - name: my-service\n    hooks:\n  postprovision:\n    windows:\n      shell: pwsh\n      run: ./scripts/prepdocs.ps1\n```\n\nFor the `postprovision` hook, note that PowerShell is specified as the shell environment for the `prepdocs.ps1` script. This template would encounter an error during command workflows such as `azd up` or `azd provision` if PowerShell 7.x isn't installed on the device. When you see these types of PowerShell configurations in a template `azure.yaml` file, verify that PowerShell is installed on your device before running the template.\n\n### PowerShell version differences\n\nThere are a number of [differences between PowerShell 7.x and PowerShell 5.1](/powershell/scripting/whats-new/differences-from-windows-powershell) that are worth exploring, including the following:\n\n- PowerShell 7 is cross-platform (Windows, macOS, Linux), while PowerShell 5 is Windows-only.\n- PowerShell 7 is built on .NET Core, whereas PowerShell 5 is built on .NET Framework.\n- PowerShell 7 offers improved performance and faster startup.\n- PowerShell 7 includes new cmdlets, modules, operators, and other features.\n- PowerShell 7 is actively developed with regular updates, while PowerShell 5 receives only security updates and bug fixes.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Customize your Azure Developer CLI workflows using command event hooks](azd-extensibility.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/provisioning-deployment-faq.md",
    "content": "---\ntitle: Provisioning and deployment errors\ndescription: Discover answers to frequently asked questions about common errors and troubleshooting in the Azure Developer CLI.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 03/03/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Azure Developer CLI Errors FAQ\n\nThis article provides solutions for common errors you might encounter when using the Azure Developer CLI (`azd`).\n\n### Authorization failed for role assignment write\n\n**Error message:**\n`The template deployment failed with error: 'Authorization failed for template resource '<guid>' of type 'Microsoft.Authorization/roleAssignments'. The client '##Email##' with object id '<guid>' does not have permission to perform action 'Microsoft.Authorization/roleAssignments/write' at scope '<resourceId>'.'`\n\n**Cause:**\nYou don't have sufficient permissions to assign roles in the target Azure subscription or resource group. This is common when your user account has `Contributor` access but not `Owner` or `User Access Administrator` access. `Contributor` allows you to create resources but not to grant permissions (assign roles) to those resources.\n\n**Resolution:**\nEnsure your account has the **Owner** or **User Access Administrator** role on the subscription or resource group you're deploying to. If you can't be granted these roles, ask an administrator to perform the initial deployment or role assignments for you.\nFor more information, see [Azure built-in roles](/azure/role-based-access-control/built-in-roles).\n\n### Role assignment already exists\n\n**Error message:**\n`The role assignment already exists.`\n\n**Cause:**\nThis error occurs when the deployment attempts to create a role assignment that already exists on the resource. While Azure Resource Manager (ARM) deployments are idempotent, certain configurations or race conditions in templates can trigger this error when redeploying.\n\n**Resolution:**\nThis error is often intermittent or benign.\n\n1. **Retry the deployment:** Run `azd up` or `azd deploy` again.\n2. **Check Bicep templates:** If you maintain the template, ensure role assignments use valid `name` properties (often strictly deterministic GUIDs) to ensure idempotency. Use the [guid()](/azure/azure-resource-manager/bicep/bicep-functions-string#guid) Bicep function to generate deterministic names.\n\n### Tenant ID, principal ID, or scope not allowed to be updated\n\n**Error message:**\n`Tenant ID, application ID, principal ID, and scope are not allowed to be updated.`\n\n**Cause:**\nYou're attempting to redeploy a role assignment with properties that differ from the existing assignment. Role assignments are immutable; you can't change the principal ID (the user/app receiving the role) or the scope of an existing assignment ID.\n\n**Resolution:**\n1. **Verify parameters:** Ensure you aren't accidentally passing a different principal ID (for example, switching between a user and a service principal) for the same role assignment resource.\n2. **Clean up:** If you need to change the assignment, manually delete the conflicting role assignment in the [Azure portal](https://portal.azure.com) or via CLI using [az role assignment delete](/cli/azure/role/assignment#az-role-assignment-delete), then redeploy.\n\n### Region capacity or SKU unavailable\n\n**Error message:**\n`The region 'eastus2' currently does not have enough resources available to provision services with the SKU 'standard'.` (or 'basic')\n\n**Cause:**\nThe selected Azure region is temporarily out of capacity for the requested service SKU. This is currently common with AI services (like Azure OpenAI) in popular regions like `eastus2`.\n\n**Resolution:**\n1. **Change location:** Run `azd env set AZURE_LOCATION <new-region>` to switch to a region with better availability (for example, `swedencentral`, `westus3`, `francecentral`).\n2. **Check availability:** Use the [Azure Products by Region](https://azure.microsoft.com/explore/global-infrastructure/products-by-region/) page or run `az account list-locations` to check for regions where the service and SKU are available.\n\n### TPM quota exceeded for AI models\n\n**Error message:**\n`This operation require <amount> new capacity in quota Tokens Per Minute (thousands) - <model> - GlobalStandard, which is bigger than the current available capacity <available>.`\n\n**Cause:**\nYour subscription has reached its quota limit for Tokens Per Minute (TPM) for the specified Azure OpenAI model in the target region.\n\n**Resolution:**\n1. **Request Quota:** Request a quota increase via the [Azure AI Studio](https://ai.azure.com/) or Azure portal. For more information, see [Manage Azure OpenAI Service quota](/azure/ai-services/openai/how-to/quota).\n2. **Change Models/Region:** Switch to a region where you have unused quota or use a different model version that fits within your limits.\n\n### If-Match precondition failed\n\n**Error message:**\n`The specified precondition 'If-Match = \"\"&lt;guid&gt;\"\"' failed.`\n\n**Cause:**\nThis issue typically indicates a concurrency conflict. Two processes might be trying to update the same resource simultaneously, or your local state is out of sync with the cloud resource (stale ETag).\n\n**Resolution:**\nRetry the operation. If the error persists:\n1. Ensure no other deployments (CI/CD pipelines, other colleagues) are targeting the same environment simultaneously.\n2. If using Bicep, verify that your template correctly defines dependencies (`dependsOn`) to prevent parallel modifications to the same resource.\n\n### Cognitive Services account in state Accepted\n\n**Error message:**\n`Call to Microsoft.CognitiveServices/accounts failed. Error message: Account <resourceId> in state Accepted.`\n\n**Cause:**\nThis error is a timing issue where a dependent resource tries to interact with the Cognitive Services (Azure AI) account before it's fully provisioned and active.\n You can also add a [command hook](/azure/developer/azure-developer-cli/azd-extensibility) (for example, `postprovision`) in your `azure.yaml` to pause or check for resource readiness before proceeding.\n\n### Container app revision provision expired\n\n**Error message:**\n`Failed to provision revision for container app <appName>. Error details: Operation expired.`\n\n**Cause:**\nThe Azure Container App failed to start within the default timeout period. Common reasons include:\n*   The container image is too large and takes too long to pull.\n*   The application crashes on startup.\n*   The application takes too long to listen on the configured port.\n\n**Resolution:**\n1. **Check Logs:** View the container logs in the Azure portal (Log Stream) or using `azd monitor` to see if the app is crashing.\n1. **Review Configuration:** Ensure the `targetPort` in your configuration matches the port your app listens on. For more troubleshooting steps, see [Troubleshooting Azure Container Apps](/azure/container-apps/troubleshooting)\n1. **Check Logs:** View the container logs in the Azure portal (Log Stream) or using `azd monitor` to see if the app is crashing.\n1. **Review Configuration:** Ensure the `targetPort` in your configuration matches the port your app listens on.\n3. **Optimize Image:** Reduce the size of your container image to speed up pulling.\n"
  },
  {
    "path": "articles/azure-developer-cli/publishing-workflows.md",
    "content": "---\ntitle: How to use the azd publish command\ndescription: Learn how to use the azd publish command to build and push container images to a registry without deploying them immediately.\nai-usage: ai-generated\nauthor: alexwolfmsft\nms.author: alexwolf\nms.reviewer: alexwolf\nms.date: 01/22/2026\nms.service: azure-dev-cli\nms.topic: article\nms.custom: devx-track-azdevcli\n---\n\n# Azure Developer CLI publishing workflows\n\nThe `azd publish` command allows you to build and push container images to a container registry like Azure Container Registry or Docker Hub without immediately deploying them to an Azure resource.\n\nBy separating the build and push steps from the deploy step, you can implement more advanced deployment workflows, such as the \"build once, deploy everywhere\" pattern. This approach is useful for containerized applications targeting **Azure Container Apps** or **Azure Kubernetes Service (AKS)**.\n\n## Why use `azd publish`?\n\nIn a standard `azd` workflow, the `azd deploy` command performs three actions in sequence:\n\n1. **Build**: Builds your application code into a container image.\n1. **Push**: Pushes that image to a registry.\n1. **Deploy**: Updates your Azure hosting service (like Container Apps) to run the new image.\n\nWhile convenient for inner-loop development, this approach assumes that every deployment requires a new build. In production scenarios, you often want to:\n\n* **Build once, deploy everywhere**: Build a single artifact (image), test it in a development environment, and then promote that *exact same artifact* to production without rebuilding it.\n* **Centralize artifacts**: Use a single shared Azure Container Registry (ACR) to store images for all your environments.\n* **Improve security**: Ensure that only verified and tested images are deployed to production.\n\n`azd publish` enables these scenarios by handling only steps 1 and 2 (Build and Push). You can then use `azd deploy` with specific flags to handle step 3 (Deploy) using the prepublished image.\n\n## Key features\n\n* **Independent Publishing**: Publish images to a registry without triggering a deployment.\n* **Custom Targets**: Use the `--to` flag to specify exactly where the image should be pushed (`[registry/]repository[:tag]`), overriding default naming conventions.\n* **Third-Party Registry Support**: Push to external registries (like Docker Hub) in addition to Azure Container Registry.\n* **Hook Support**: Supports `prepublish` and `postpublish` hooks for custom automation.\n* **Service Targeting**: Currently supports services hosted on **Azure Container Apps** and **AKS**.\n\n## Usage\n\nTo build and publish the image for a specific service defined in your `azure.yaml`:\n\n```bash\nazd publish <service-name>\n```\n\nTo build and publish all services:\n\n```bash\nazd publish --all\n```\n\n### Parameters\n\n| Flag | Description |\n| :--- | :--- |\n| `--all` | Publishes all services defined in `azure.yaml`. |\n| `--from-package <image>` | Uses an existing local image or package instead of building from source. |\n| `--to <image-ref>` | Specifies the target image reference (for example, `<your-registry>.azurecr.io/my-app:v1`). Overrides default naming in `azure.yaml`. |\n\n### Examples\n\n**Publish a specific service to a custom tag:**\n\n```bash\nazd publish api-service --to <your-registry>.azurecr.io/api-service:v1.0.0\n```\n\n**Publish a local image to a remote registry:**\n\nIf you already built an image locally (for example: `local-api:dev`), you can tag and push it using `azd`:\n\n```bash\nazd publish api-service --from-package local-api:dev --to <your-registry>.azurecr.io/api-service:v1.0.0\n```\n\n## Scenario: Build once, deploy everywhere\n\nA common production workflow involves building an image once and promoting it through multiple environments such as Dev -> Test -> Prod. Achieve this using a combination of `azd publish` and `azd deploy`.\n\n1. **Publish the image**:\n\n   Build the code and push it to your shared registry.\n\n   ```bash\n   azd publish api-service --to <your-registry>.azurecr.io/my-app:v1.0.0\n   ```\n\n2. **Deploy to Development**:\n\n   Deploy the specific image version to the development environment. The `--from-package` flag tells `azd deploy` to skip the build/push steps and just update the service configuration.\n\n   ```bash\n   azd env select dev\n   azd deploy api-service --from-package <your-registry>.azurecr.io/my-app:v1.0.0\n   ```\n\n3. **Promote to Production**:\n\n   After testing in Dev, deploy the *same* image reference to the production environment.\n\n   ```bash\n   azd env select prod\n   azd deploy api-service --from-package <your-registry>.azurecr.io/my-app:v1.0.0\n   ```\n\n## Comparison with other commands\n\n| Command | Actions Performed | Best For |\n| :--- | :--- | :--- |\n| `azd publish` | Build -> Push | CI/CD pipelines, creating artifacts, \"Build once\" workflows. |\n| `azd publish --from-package` | Push only | pushes pre-built artifacts to environments. |\n| `azd deploy` | Build -> Push -> Deploy | Standard development iteration (inner loop). |\n| `azd deploy --from-package` | Deploy only | deploying pre-built/pre-published artifacts to environments. |\n| `azd up` | Provision -> Build -> Push -> Deploy | Getting started, initializing new environments from scratch. |\n\n> [!NOTE]\n> The default behavior of `azd up` remains unchanged. It still orchestrates the full end-to-end process. However, you can customize your workflows in `azure.yaml` to use `azd publish` if needed.\n\n## Configuration in `azure.yaml`\n\nConfigure default Docker settings for your services in `azure.yaml`. The `azd publish` command respects these settings unless overridden by flags like `--to`.\n\n```yaml\nname: my-app\nservices:\n  api:\n    project: ./src/api\n    host: containerapp\n    docker:\n      registry: 'docker.io/myusername' # Default registry\n      image: 'my-api'                  # Default image name\n      tag: 'latest'                    # Default tag\n```\n\nWith this configuration, running `azd publish api` would push to `docker.io/myusername/my-api:latest`.\n\n## Next steps\n\n* [azd deploy command reference](azd-commands.md)\n* [Use external container registries](use-external-registry.md)\n* [Configure GitHub Actions pipelines](pipeline-github-actions.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/quickstart-explore-templates.md",
    "content": "---\ntitle: Explore and customize an Azure Developer CLI Template\ndescription: Learn the basics of how to work with and customize Azure Developer CLI templates.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 04/14/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Explore and customize an Azure Developer CLI template\n\nIn this quickstart, you explore and customize an Azure Developer CLI template. The **hello-azd** template provides a simple starting point for building and deploying applications to Azure using the Azure Developer CLI (`azd`). This quickstart expands on the concepts demonstrated in the [Quickstart - Deploy an azd template](/azure/developer/azure-developer-cli/get-started) article.\n\n## Prerequisites\n\nTo complete this quickstart in your browser you'll need:\n\n- Access to GitHub Codespaces\n\nAlternatively, to complete this quickstart using local tooling:\n\n- [The Azure Developer CLI](/azure/developer/azure-developer-cli/install-azd) installed on your local machine\n- [Visual Studio Code](https://code.visualstudio.com/download) or your editor of choice\n- Docker desktop installed on your local machine\n\n\n[!INCLUDE [azd-template-structure-minimal](includes/azd-template-structure-minimal.md)]\n\n## Set up the sample template\n\n`hello-azd` is a sample template designed to showcase essential features of `azd` that you can deploy to Azure using a single command. The template provides a friendly UI with information about `azd` and a small demo tool that allows you to upload and view support tickets.\n\nThe template supports the following features:\n\n- Packages and deploys a containerized app to Azure Container Apps\n- Creates the Azure resources needed by the app, such as an Azure Cosmos DB database\n- Can automatically [Configure a CI/CD pipeline](configure-devops-pipeline.md) using the `azd pipeline config` command\n\nFollow these steps to set up the template:\n\n## [Codespaces](#tab/codespaces)\n\n1. Open the [hello-azd template repository](https://github.com/Azure-Samples/hello-azd) on GitHub.\n1. Select the **Code** button and then select **Codespaces**.\n1. Create a new Codespace to launch a fully configured development environment in your browser. You might need to wait a moment for the environment to initialize.\n1. After the Codespaces environment loads, initialize the `azd` template using the `azd init` command:\n\n    ```bash\n   azd init -t hello-azd\n   ```\n\n1. When prompted, enter a name for the `azd` environment, such as `helloazd`.\n\n## [Visual Studio Code](#tab/vs-code)\n\n1. In an empty directory on your local machine, clone and initialize the repository using the `azd init` command:\n\n   ```bash\n   azd init -t hello-azd\n   ```\n\n1. When prompted, enter a name for the `azd` environment, such as `helloazd`.\n\n1. Open the project folder in Visual Studio Code:\n\n   ```bash\n   code .\n   ```\n\n---\n\n## Explore the template\n\nWith the template open in your tool of choice, you can browse the folder structure to explore how `azd` templates work:\n\n1. Expand the `src` folder to view the source code of the app.\n    - The `hello-azd` template includes a containerized .NET app that provides a simple UI to learn about `azd` and manage sample ticket data. `azd` also supports other languages like JavaScript and Python.\n    - When you run `azd up`, the app is packaged as a container image and deployed to Azure Container Apps.\n\n1. Expand the `infra` folder to explore the infrastructure as code files.\n    - This template uses Bicep files (`.bicep`) to create Azure resources, but you can also use Terraform (`.tf`).\n    - The `main.bicep` file creates Azure resources by referencing other Bicep modules in the `infra` folder, such as an Azure Storage account:\n\n        ```bicep\n        // Omitted...\n\n        // Create a storage account\n        module storage './core/storage/storage-account.bicep' = {\n            name: 'storage'\n            scope: rg\n            params: {\n            name: !empty(storageAccountName) ? storageAccountName : '${abbrs.storageStorageAccounts}${resourceToken}'\n            location: location\n            tags: tags\n            containers: [\n                {\n                name: 'attachments'\n                }\n            ]\n            }\n        }\n\n        // Omitted...\n        ```\n\n1. At the root of the template, open the `azure.yaml` file to view essential template configurations:\n    - The template defines one service called `aca`.\n    - The `aca` service configuration instructs `azd` to package and deploy the source code in the `src` folder to the Azure Container App provisioned by the Bicep modules you explored previously.\n    - The `docker` configurations instruct `azd` to package and deploy the app as a container.\n\n        ```yml\n        metadata:\n          template: hello-azd-dotnet  # Specifies the template being used\n        name: azd-starter  # Name of the project\n        services:\n          aca:  # Define the Azure Container App service\n            project: ./src  # Path to the source code\n            language: csharp  # Programming language\n            host: containerapp  # Hosting service\n            docker:\n              path: ./Dockerfile  # Location of the Dockerfile\n        ```\n\n## Update the Template\n\nYou can make changes to the template to influence the deployed app and resources. In this example, you make two small changes to the app and explore the deployed results:\n\n- Update the app header welcome text to your own message\n- Update the created storage account so that it creates two blob containers instead of one\n\nTo make these changes, complete the following steps:\n\n1. In the `src > Components > Pages` folder, open the `Home.razor` component.\n1. Replace the *Hello, Azure Developer CLI!* header text at the top of the page with a different message, such as *Hello, customized template!* and save your changes.\n\n    ```razor\n    <MudText Typo=\"Typo.h2\" GutterBottom=\"true\">Hello, customized template!</MudText>\n    ```\n\n1. In the `infra` folder, open the `main.bicep` file.\n1. Locate the block of Bicep code around line 75 that creates a storage account and a blob container:\n\n    ```bicep\n    // Create a storage account\n    module storage './core/storage/storage-account.bicep' = {\n      name: 'storage'\n      scope: rg\n      params: {\n        name: !empty(storageAccountName) ? storageAccountName : '${abbrs.storageStorageAccounts}${resourceToken}'\n        location: location\n        tags: tags\n        containers: [\n          {\n            name: 'attachments'\n          }\n        ]\n      }\n    }\n    ```\n\n    Replace the code with the following snippet:\n\n    ```bicep\n    // Create a storage account\n    module storage './core/storage/storage-account.bicep' = {\n      name: 'storage'\n      scope: rg\n      params: {\n        name: !empty(storageAccountName) ? storageAccountName : '${abbrs.storageStorageAccounts}${resourceToken}'\n        location: location\n        tags: tags\n        containers: [\n          {\n            name: 'attachments'\n          },\n          {\n            name: 'archive'\n          }\n        ]\n      }\n    }\n\n## Run the Template\n\nAfter making your changes, use the `azd up` command to provision and deploy the app resources:\n\n1. Open a terminal in the project directory.\n\n1. To provision and deploy the template, run the `azd up` command:\n\n   ```azdeveloper\n   azd up\n   ```\n\n   This command will:\n\n   - Package the app for deployment\n   - Provision the required Azure resources\n   - Deploy your application with the updated changes\n   - Print the URL for the deployed application\n\n1. To see your updated application live, open the URL printed in the `azd` console output logs in your browser.\n\n    :::image type=\"content\" source=\"media/get-started/explore-templates-header.png\" alt-text=\"A screenshot showing the updated app header.\":::\n\n1. To view the two blob containers that were created, navigate to the created storage account in the Azure portal.\n\n    :::image type=\"content\" source=\"media/get-started/explore-templates-blob-container.png\" alt-text=\"A screenshot showing the created blob containers.\":::\n\n## Conclusion\n\nIn this quickstart, you explored the structure of the `hello-azd` template, customized its application and infrastructure, and deployed it to Azure using the Azure Developer CLI. For more advanced scenarios, explore other templates or dive deeper into the `azd` documentation.\n\n## Next steps\n\n- [What are Azure Developer CLI commands?](/azure/developer/azure-developer-cli/azd-commands)\n- [What are Azure Developer CLI templates?](/azure/developer/azure-developer-cli/azd-templates)\n- [Create Azure Developer CLI templates overview](/azure/developer/azure-developer-cli/make-azd-compatible)\n"
  },
  {
    "path": "articles/azure-developer-cli/reference.md",
    "content": "---\ntitle: Azure Developer CLI reference\ndescription: This article explains the syntax and parameters for the various Azure Developer CLI commands.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 05/09/2026\nms.service: azure-dev-cli\nms.topic: conceptual\nms.custom: devx-track-azdevcli\n---\n\n# Azure Developer CLI reference\n\nThis article explains the syntax and parameters for the various Azure Developer CLI commands.\n\n## azd\n\nThe Azure Developer CLI (`azd`) is an open-source tool that helps onboard and manage your project on Azure\n\n### Options\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n      --docs                 Opens the documentation for azd in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for azd.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd add](#azd-add): Add a component to your project.\n* [azd auth](#azd-auth): Authenticate with Azure.\n* [azd completion](#azd-completion): Generate shell completion scripts.\n* [azd config](#azd-config): Manage azd configurations (ex: default Azure subscription, location).\n* [azd copilot](#azd-copilot): Manage GitHub Copilot agent settings. (Preview)\n* [azd deploy](#azd-deploy): Deploy your project code to Azure.\n* [azd down](#azd-down): Delete your project's Azure resources.\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [azd extension](#azd-extension): Manage azd extensions.\n* [azd hooks](#azd-hooks): Develop, test and run hooks for a project.\n* [azd infra](#azd-infra): Manage your Infrastructure as Code (IaC).\n* [azd init](#azd-init): Initialize a new application.\n* [azd mcp](#azd-mcp): Manage Model Context Protocol (MCP) server. (Alpha)\n* [azd monitor](#azd-monitor): Monitor a deployed project.\n* [azd package](#azd-package): Packages the project's code to be deployed to Azure.\n* [azd pipeline](#azd-pipeline): Manage and configure your deployment pipelines.\n* [azd provision](#azd-provision): Provision Azure resources for your project.\n* [azd publish](#azd-publish): Publish a service to a container registry.\n* [azd restore](#azd-restore): Restores the project's dependencies.\n* [azd show](#azd-show): Display information about your project and its resources.\n* [azd template](#azd-template): Find and view template details.\n* [azd up](#azd-up): Provision and deploy your project to Azure with a single command.\n* [azd update](#azd-update): Updates azd to the latest version.\n* [azd version](#azd-version): Print the version number of Azure Developer CLI.\n\n## azd add\n\nAdd a component to your project.\n\n```azdeveloper\nazd add [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd add in your web browser.\n  -h, --help   Gets help for add.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd auth\n\nAuthenticate with Azure.\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd auth in your web browser.\n  -h, --help   Gets help for auth.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd auth login](#azd-auth-login): Log in to Azure.\n* [azd auth logout](#azd-auth-logout): Log out of Azure.\n* [azd auth status](#azd-auth-status): Show the current authentication status.\n* [Back to top](#azd)\n\n## azd auth login\n\nLog in to Azure.\n\n### Synopsis\n\nLog in to Azure.\n\nWhen run without any arguments, log in interactively using a browser. To log in using a device code, pass\n--use-device-code.\n\nTo log in as a service principal, pass --client-id and --tenant-id as well as one of: --client-secret,\n--client-certificate, or --federated-credential-provider.\n\nTo log in using a managed identity, pass --managed-identity, which will use the system assigned managed identity.\nTo use a user assigned managed identity, pass --client-id in addition to --managed-identity with the client id of\nthe user assigned managed identity you wish to use.\n\n\n```azdeveloper\nazd auth login [flags]\n```\n\n### Options\n\n```azdeveloper\n      --check-status                           Checks the log-in status instead of logging in.\n      --client-certificate string              The path to the client certificate for the service principal to authenticate with.\n      --client-id string                       The client id for the service principal to authenticate with.\n      --client-secret string                   The client secret for the service principal to authenticate with. Set to the empty string to read the value from the console.\n      --docs                                   Opens the documentation for azd auth login in your web browser.\n      --federated-credential-provider string   The provider to use to acquire a federated token to authenticate with. Supported values: github, azure-pipelines, oidc\n  -h, --help                                   Gets help for login.\n      --managed-identity                       Use a managed identity to authenticate.\n      --redirect-port int                      Choose the port to be used as part of the redirect URI during interactive login.\n      --tenant-id string                       The tenant id or domain name to authenticate with.\n      --use-device-code[=true]                 When true, log in by using a device code instead of a browser.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd auth](#azd-auth): Authenticate with Azure.\n* [Back to top](#azd)\n\n## azd auth logout\n\nLog out of Azure.\n\n### Synopsis\n\nLog out of Azure\n\n```azdeveloper\nazd auth logout [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd auth logout in your web browser.\n  -h, --help   Gets help for logout.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd auth](#azd-auth): Authenticate with Azure.\n* [Back to top](#azd)\n\n## azd auth status\n\nShow the current authentication status.\n\n### Synopsis\n\nDisplay whether you are logged in to Azure and the associated account information.\n\n```azdeveloper\nazd auth status [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd auth status in your web browser.\n  -h, --help   Gets help for status.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd auth](#azd-auth): Authenticate with Azure.\n* [Back to top](#azd)\n\n## azd completion\n\nGenerate shell completion scripts.\n\n### Synopsis\n\nGenerate shell completion scripts for azd.\n\nThe completion command allows you to generate autocompletion scripts for your shell,\ncurrently supports bash, zsh, fish and PowerShell.\n\nSee each sub-command's help for details on how to use the generated script.\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd completion in your web browser.\n  -h, --help   Gets help for completion.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd completion bash](#azd-completion-bash): Generate bash completion script.\n* [azd completion fig](#azd-completion-fig): Generate Fig autocomplete spec.\n* [azd completion fish](#azd-completion-fish): Generate fish completion script.\n* [azd completion powershell](#azd-completion-powershell): Generate PowerShell completion script.\n* [azd completion zsh](#azd-completion-zsh): Generate zsh completion script.\n* [Back to top](#azd)\n\n## azd completion bash\n\nGenerate bash completion script.\n\n```azdeveloper\nazd completion bash\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd completion bash in your web browser.\n  -h, --help   Gets help for bash.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd completion](#azd-completion): Generate shell completion scripts.\n* [Back to top](#azd)\n\n## azd completion fig\n\nGenerate Fig autocomplete spec.\n\n```azdeveloper\nazd completion fig\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd completion fig in your web browser.\n  -h, --help   Gets help for fig.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd completion](#azd-completion): Generate shell completion scripts.\n* [Back to top](#azd)\n\n## azd completion fish\n\nGenerate fish completion script.\n\n```azdeveloper\nazd completion fish\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd completion fish in your web browser.\n  -h, --help   Gets help for fish.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd completion](#azd-completion): Generate shell completion scripts.\n* [Back to top](#azd)\n\n## azd completion powershell\n\nGenerate PowerShell completion script.\n\n```azdeveloper\nazd completion powershell\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd completion powershell in your web browser.\n  -h, --help   Gets help for powershell.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd completion](#azd-completion): Generate shell completion scripts.\n* [Back to top](#azd)\n\n## azd completion zsh\n\nGenerate zsh completion script.\n\n```azdeveloper\nazd completion zsh\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd completion zsh in your web browser.\n  -h, --help   Gets help for zsh.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd completion](#azd-completion): Generate shell completion scripts.\n* [Back to top](#azd)\n\n## azd config\n\nManage azd configurations (ex: default Azure subscription, location).\n\n### Synopsis\n\nManage the Azure Developer CLI user configuration, which includes your default Azure subscription and location.\n\nAvailable since `azure-dev-cli_0.4.0-beta.1`.\n\nThe easiest way to configure `azd` for the first time is to run [`azd init`](#azd-init). The subscription and location you select will be stored in the `config.json` file located in the config directory. To configure `azd` anytime afterwards, you'll use [`azd config set`](#azd-config-set).\n\nThe default value of the config directory is: \n* $HOME/.azd on Linux and macOS\n* %USERPROFILE%\\.azd on Windows\n\n\nThe configuration directory can be overridden by specifying a path in the AZD_CONFIG_DIR environment variable.\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd config in your web browser.\n  -h, --help   Gets help for config.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd config get](#azd-config-get): Gets a configuration.\n* [azd config list-alpha](#azd-config-list-alpha): Display the list of available features in alpha stage.\n* [azd config options](#azd-config-options): List all available configuration settings.\n* [azd config reset](#azd-config-reset): Resets configuration to default.\n* [azd config set](#azd-config-set): Sets a configuration.\n* [azd config show](#azd-config-show): Show all the configuration values.\n* [azd config unset](#azd-config-unset): Unsets a configuration.\n* [Back to top](#azd)\n\n## azd config get\n\nGets a configuration.\n\n### Synopsis\n\nGets a configuration in the configuration path.\n\nThe default value of the config directory is:\n* `$HOME/.azd` on Linux and macOS\n* `%USERPROFILE%\\.azd` on Windows\n\nThe configuration directory can be overridden by specifying a path in the AZD_CONFIG_DIR environment variable.\n\n```azdeveloper\nazd config get <path> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd config get in your web browser.\n  -h, --help   Gets help for get.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd config](#azd-config): Manage azd configurations (ex: default Azure subscription, location).\n* [Back to top](#azd)\n\n## azd config list-alpha\n\nDisplay the list of available features in alpha stage.\n\n```azdeveloper\nazd config list-alpha [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd config list-alpha in your web browser.\n  -h, --help   Gets help for list-alpha.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd config](#azd-config): Manage azd configurations (ex: default Azure subscription, location).\n* [Back to top](#azd)\n\n## azd config options\n\nList all available configuration settings.\n\n### Synopsis\n\nList all possible configuration settings that can be set with azd, including descriptions and allowed values.\n\n```azdeveloper\nazd config options [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd config options in your web browser.\n  -h, --help   Gets help for options.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd config](#azd-config): Manage azd configurations (ex: default Azure subscription, location).\n* [Back to top](#azd)\n\n## azd config reset\n\nResets configuration to default.\n\n### Synopsis\n\nResets all configuration in the configuration path.\n\nThe default value of the config directory is:\n* `$HOME/.azd` on Linux and macOS\n* `%USERPROFILE%\\.azd` on Windows\n\nThe configuration directory can be overridden by specifying a path in the AZD_CONFIG_DIR environment variable to the default.\n\n```azdeveloper\nazd config reset [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs    Opens the documentation for azd config reset in your web browser.\n  -f, --force   Force reset without confirmation.\n  -h, --help    Gets help for reset.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd config](#azd-config): Manage azd configurations (ex: default Azure subscription, location).\n* [Back to top](#azd)\n\n## azd config set\n\nSets a configuration.\n\n### Synopsis\n\nSets a configuration in the configuration path.\n\nThe default value of the config directory is:\n* `$HOME/.azd` on Linux and macOS\n* `%USERPROFILE%\\.azd` on Windows\n\nThe configuration directory can be overridden by specifying a path in the AZD_CONFIG_DIR environment variable.\n\n```azdeveloper\nazd config set <path> <value> [flags]\n```\n\n### Examples\n\n```azdeveloper\nazd config set defaults.subscription <yourSubscriptionID>\nazd config set defaults.location eastus\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd config set in your web browser.\n  -h, --help   Gets help for set.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd config](#azd-config): Manage azd configurations (ex: default Azure subscription, location).\n* [Back to top](#azd)\n\n## azd config show\n\nShow all the configuration values.\n\n### Synopsis\n\nShow all configuration values in the configuration path.\n\nThe default value of the config directory is:\n* `$HOME/.azd` on Linux and macOS\n* `%USERPROFILE%\\.azd` on Windows\n\nThe configuration directory can be overridden by specifying a path in the AZD_CONFIG_DIR environment variable.\n\n```azdeveloper\nazd config show [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd config show in your web browser.\n  -h, --help   Gets help for show.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd config](#azd-config): Manage azd configurations (ex: default Azure subscription, location).\n* [Back to top](#azd)\n\n## azd config unset\n\nUnsets a configuration.\n\n### Synopsis\n\nRemoves a configuration in the configuration path.\n\nThe default value of the config directory is:\n* `$HOME/.azd` on Linux and macOS\n* `%USERPROFILE%\\.azd` on Windows\n\nThe configuration directory can be overridden by specifying a path in the AZD_CONFIG_DIR environment variable.\n\n```azdeveloper\nazd config unset <path> [flags]\n```\n\n### Examples\n\n```azdeveloper\nazd config unset defaults.location\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd config unset in your web browser.\n  -h, --help   Gets help for unset.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd config](#azd-config): Manage azd configurations (ex: default Azure subscription, location).\n* [Back to top](#azd)\n\n## azd copilot\n\nManage GitHub Copilot agent settings. (Preview)\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd copilot in your web browser.\n  -h, --help   Gets help for copilot.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd copilot consent](#azd-copilot-consent): Manage tool consent.\n* [Back to top](#azd)\n\n## azd copilot consent\n\nManage tool consent.\n\n### Synopsis\n\nManage consent rules for tool execution.\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd copilot consent in your web browser.\n  -h, --help   Gets help for consent.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd copilot](#azd-copilot): Manage GitHub Copilot agent settings. (Preview)\n* [azd copilot consent grant](#azd-copilot-consent-grant): Grant consent trust rules.\n* [azd copilot consent list](#azd-copilot-consent-list): List consent rules.\n* [azd copilot consent revoke](#azd-copilot-consent-revoke): Revoke consent rules.\n* [Back to top](#azd)\n\n## azd copilot consent grant\n\nGrant consent trust rules.\n\n### Synopsis\n\nGrant trust rules for tools and servers.\n\nThis command creates consent rules that allow tools to execute\nwithout prompting for permission. You can specify different permission\nlevels and scopes for the rules.\n\nExamples:\n**Grant always permission to all tools globally**\n  azd copilot consent grant --global --permission always\n\n**Grant project permission to a specific tool with read-only scope**\n  azd copilot consent grant --server my-server --tool my-tool --permission project --scope read-only\n\n```azdeveloper\nazd copilot consent grant [flags]\n```\n\n### Options\n\n```azdeveloper\n      --action string       Action type: 'all' or 'readonly' (default \"all\")\n      --docs                Opens the documentation for azd copilot consent grant in your web browser.\n      --global              Apply globally to all servers\n  -h, --help                Gets help for grant.\n      --operation string    Operation type: 'tool' or 'sampling' (default \"tool\")\n      --permission string   Permission: 'allow', 'deny', or 'prompt' (default \"allow\")\n      --scope string        Rule scope: 'global', or 'project' (default \"global\")\n      --server string       Server name\n      --tool string         Specific tool name (requires --server)\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd copilot consent](#azd-copilot-consent): Manage tool consent.\n* [Back to top](#azd)\n\n## azd copilot consent list\n\nList consent rules.\n\n### Synopsis\n\nList all consent rules for tools.\n\n```azdeveloper\nazd copilot consent list [flags]\n```\n\n### Options\n\n```azdeveloper\n      --action string       Action type to filter by (all, readonly)\n      --docs                Opens the documentation for azd copilot consent list in your web browser.\n  -h, --help                Gets help for list.\n      --operation string    Operation to filter by (tool, sampling)\n      --permission string   Permission to filter by (allow, deny, prompt)\n      --scope string        Consent scope to filter by (global, project). If not specified, lists rules from all scopes.\n      --target string       Specific target to operate on (server/tool format)\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd copilot consent](#azd-copilot-consent): Manage tool consent.\n* [Back to top](#azd)\n\n## azd copilot consent revoke\n\nRevoke consent rules.\n\n### Synopsis\n\nRevoke consent rules for tools.\n\n```azdeveloper\nazd copilot consent revoke [flags]\n```\n\n### Options\n\n```azdeveloper\n      --action string       Action type to filter by (all, readonly)\n      --docs                Opens the documentation for azd copilot consent revoke in your web browser.\n  -h, --help                Gets help for revoke.\n      --operation string    Operation to filter by (tool, sampling)\n      --permission string   Permission to filter by (allow, deny, prompt)\n      --scope string        Consent scope to filter by (global, project). If not specified, revokes rules from all scopes.\n      --target string       Specific target to operate on (server/tool format)\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd copilot consent](#azd-copilot-consent): Manage tool consent.\n* [Back to top](#azd)\n\n## azd deploy\n\nDeploy your project code to Azure.\n\n```azdeveloper\nazd deploy <service> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --all                   Deploys all services that are listed in azure.yaml\n      --docs                  Opens the documentation for azd deploy in your web browser.\n  -e, --environment string    The name of the environment to use.\n      --from-package string   Deploys the packaged service located at the provided path. Supports zipped file packages (file path) or container images (image tag).\n  -h, --help                  Gets help for deploy.\n      --timeout int           Maximum time in seconds for azd to wait for each service deployment. This stops azd from waiting but does not cancel the Azure-side deployment. (default: 1200) (default 1200)\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd down\n\nDelete your project's Azure resources.\n\n```azdeveloper\nazd down [<layer>] [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd down in your web browser.\n  -e, --environment string   The name of the environment to use.\n      --force                Does not require confirmation before it deletes resources.\n  -h, --help                 Gets help for down.\n      --purge                Does not require confirmation before it permanently deletes resources that are soft-deleted by default (for example, key vaults).\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd env\n\nManage environments (ex: default environment, environment variables).\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd env in your web browser.\n  -h, --help   Gets help for env.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env config](#azd-env-config): Manage environment configuration (ex: stored in .azure/{environment}/config.json).\n* [azd env get-value](#azd-env-get-value): Get specific environment value.\n* [azd env get-values](#azd-env-get-values): Get all environment values.\n* [azd env list](#azd-env-list): List environments.\n* [azd env new](#azd-env-new): Create a new environment and set it as the default.\n* [azd env refresh](#azd-env-refresh): Refresh environment values by using information from a previous infrastructure provision.\n* [azd env remove](#azd-env-remove): Remove an environment.\n* [azd env select](#azd-env-select): Set the default environment.\n* [azd env set](#azd-env-set): Set one or more environment values.\n* [azd env set-secret](#azd-env-set-secret): Set a name as a reference to a Key Vault secret in the environment.\n* [Back to top](#azd)\n\n## azd env config\n\nManage environment configuration (ex: stored in .azure/{environment}/config.json).\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd env config in your web browser.\n  -h, --help   Gets help for config.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [azd env config get](#azd-env-config-get): Gets a configuration value from the environment.\n* [azd env config set](#azd-env-config-set): Sets a configuration value in the environment.\n* [azd env config unset](#azd-env-config-unset): Unsets a configuration value in the environment.\n* [Back to top](#azd)\n\n## azd env config get\n\nGets a configuration value from the environment.\n\n### Synopsis\n\nGets a configuration value from the environment's config.json file.\n\n```azdeveloper\nazd env config get <path> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd env config get in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for get.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env config](#azd-env-config): Manage environment configuration (ex: stored in .azure/{environment}/config.json).\n* [Back to top](#azd)\n\n## azd env config set\n\nSets a configuration value in the environment.\n\n### Synopsis\n\nSets a configuration value in the environment's config.json file.\n\nValues are automatically parsed as JSON types when possible. Booleans (true/false),\nnumbers (42, 3.14), arrays ([...]), and objects ({...}) are stored with their native\nJSON types. Plain text values are stored as strings. To force a JSON-typed value to be\nstored as a string, wrap it in JSON quotes (e.g. '\"true\"' or '\"8080\"').\n\n```azdeveloper\nazd env config set <path> <value> [flags]\n```\n\n### Examples\n\n```azdeveloper\nazd env config set myapp.endpoint https://example.com\nazd env config set myapp.debug true\nazd env config set myapp.count 42\nazd env config set infra.parameters.tags '{\"env\":\"dev\"}'\nazd env config set myapp.port '\"8080\"'\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd env config set in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for set.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env config](#azd-env-config): Manage environment configuration (ex: stored in .azure/{environment}/config.json).\n* [Back to top](#azd)\n\n## azd env config unset\n\nUnsets a configuration value in the environment.\n\n### Synopsis\n\nRemoves a configuration value from the environment's config.json file.\n\n```azdeveloper\nazd env config unset <path> [flags]\n```\n\n### Examples\n\n```azdeveloper\nazd env config unset myapp.endpoint\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd env config unset in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for unset.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env config](#azd-env-config): Manage environment configuration (ex: stored in .azure/{environment}/config.json).\n* [Back to top](#azd)\n\n## azd env get-value\n\nGet specific environment value.\n\n```azdeveloper\nazd env get-value <keyName> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd env get-value in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for get-value.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [Back to top](#azd)\n\n## azd env get-values\n\nGet all environment values.\n\n```azdeveloper\nazd env get-values [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd env get-values in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for get-values.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [Back to top](#azd)\n\n## azd env list\n\nList environments.\n\n```azdeveloper\nazd env list [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd env list in your web browser.\n  -h, --help   Gets help for list.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [Back to top](#azd)\n\n## azd env new\n\nCreate a new environment and set it as the default.\n\n```azdeveloper\nazd env new <environment> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                  Opens the documentation for azd env new in your web browser.\n  -h, --help                  Gets help for new.\n  -l, --location string       Azure location for the new environment\n      --subscription string   ID of an Azure subscription to use for the new environment\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [Back to top](#azd)\n\n## azd env refresh\n\nRefresh environment values by using information from a previous infrastructure provision.\n\n```azdeveloper\nazd env refresh <environment> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd env refresh in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for refresh.\n      --hint string          Hint to help identify the environment to refresh\n      --layer string         Provisioning layer to refresh the environment from.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [Back to top](#azd)\n\n## azd env remove\n\nRemove an environment.\n\n```azdeveloper\nazd env remove <environment> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd env remove in your web browser.\n  -e, --environment string   The name of the environment to use.\n      --force                Skips confirmation before performing removal.\n  -h, --help                 Gets help for remove.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [Back to top](#azd)\n\n## azd env select\n\nSet the default environment.\n\n```azdeveloper\nazd env select [<environment>] [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd env select in your web browser.\n  -h, --help   Gets help for select.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [Back to top](#azd)\n\n## azd env set\n\nSet one or more environment values.\n\n### Synopsis\n\nSet one or more environment values using key-value pairs or by loading from a .env formatted file.\n\n```azdeveloper\nazd env set [<key> <value>] | [<key>=<value> ...] | [--file <filepath>] [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd env set in your web browser.\n  -e, --environment string   The name of the environment to use.\n      --file string          Path to .env formatted file to load environment values from.\n  -h, --help                 Gets help for set.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [Back to top](#azd)\n\n## azd env set-secret\n\nSet a name as a reference to a Key Vault secret in the environment.\n\n### Synopsis\n\nYou can either create a new Key Vault secret or select an existing one.\nThe provided name is the key for the .env file which holds the secret reference to the Key Vault secret.\n\n```azdeveloper\nazd env set-secret <name> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd env set-secret in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for set-secret.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd env](#azd-env): Manage environments (ex: default environment, environment variables).\n* [Back to top](#azd)\n\n## azd extension\n\nManage azd extensions.\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd extension in your web browser.\n  -h, --help   Gets help for extension.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension install](#azd-extension-install): Installs specified extensions.\n* [azd extension list](#azd-extension-list): List available extensions.\n* [azd extension show](#azd-extension-show): Show details for a specific extension.\n* [azd extension source](#azd-extension-source): View and manage extension sources\n* [azd extension uninstall](#azd-extension-uninstall): Uninstall specified extensions.\n* [azd extension upgrade](#azd-extension-upgrade): Upgrade installed extensions to the latest version.\n* [Back to top](#azd)\n\n## azd extension install\n\nInstalls specified extensions.\n\n```azdeveloper\nazd extension install <extension-id> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs             Opens the documentation for azd extension install in your web browser.\n  -f, --force            Force installation, including downgrades and reinstalls\n  -h, --help             Gets help for install.\n  -s, --source string    The extension source to use for installs\n  -v, --version string   The version of the extension to install\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension](#azd-extension): Manage azd extensions.\n* [Back to top](#azd)\n\n## azd extension list\n\nList available extensions.\n\n```azdeveloper\nazd extension list [--installed] [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs            Opens the documentation for azd extension list in your web browser.\n  -h, --help            Gets help for list.\n      --installed       List installed extensions\n      --source string   Filter extensions by source\n      --tags strings    Filter extensions by tags\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension](#azd-extension): Manage azd extensions.\n* [Back to top](#azd)\n\n## azd extension show\n\nShow details for a specific extension.\n\n```azdeveloper\nazd extension show <extension-id> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs            Opens the documentation for azd extension show in your web browser.\n  -h, --help            Gets help for show.\n  -s, --source string   The extension source to use.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension](#azd-extension): Manage azd extensions.\n* [Back to top](#azd)\n\n## azd extension source\n\nView and manage extension sources\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd extension source in your web browser.\n  -h, --help   Gets help for source.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension](#azd-extension): Manage azd extensions.\n* [azd extension source add](#azd-extension-source-add): Add an extension source with the specified name\n* [azd extension source list](#azd-extension-source-list): List extension sources\n* [azd extension source remove](#azd-extension-source-remove): Remove an extension source with the specified name\n* [azd extension source validate](#azd-extension-source-validate): Validate an extension source's registry.json file.\n* [Back to top](#azd)\n\n## azd extension source add\n\nAdd an extension source with the specified name\n\n```azdeveloper\nazd extension source add [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs              Opens the documentation for azd extension source add in your web browser.\n  -h, --help              Gets help for add.\n  -l, --location string   The location of the extension source\n  -n, --name string       The name of the extension source\n  -t, --type string       The type of the extension source. Supported types are 'file' and 'url'\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension source](#azd-extension-source): View and manage extension sources\n* [Back to top](#azd)\n\n## azd extension source list\n\nList extension sources\n\n```azdeveloper\nazd extension source list [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd extension source list in your web browser.\n  -h, --help   Gets help for list.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension source](#azd-extension-source): View and manage extension sources\n* [Back to top](#azd)\n\n## azd extension source remove\n\nRemove an extension source with the specified name\n\n```azdeveloper\nazd extension source remove <name> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd extension source remove in your web browser.\n  -h, --help   Gets help for remove.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension source](#azd-extension-source): View and manage extension sources\n* [Back to top](#azd)\n\n## azd extension source validate\n\nValidate an extension source's registry.json file.\n\n### Synopsis\n\nValidate an extension source's registry.json file.\n\nAccepts a source name (from 'azd extension source list'), a local file path,\nor a URL. Checks required fields, valid capabilities, semver version format,\nplatform artifact structure, and extension ID format.\n\n```azdeveloper\nazd extension source validate <name-or-path-or-url> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs     Opens the documentation for azd extension source validate in your web browser.\n  -h, --help     Gets help for validate.\n      --strict   Enable strict validation (require checksums)\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension source](#azd-extension-source): View and manage extension sources\n* [Back to top](#azd)\n\n## azd extension uninstall\n\nUninstall specified extensions.\n\n```azdeveloper\nazd extension uninstall [extension-id] [flags]\n```\n\n### Options\n\n```azdeveloper\n      --all    Uninstall all installed extensions\n      --docs   Opens the documentation for azd extension uninstall in your web browser.\n  -h, --help   Gets help for uninstall.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension](#azd-extension): Manage azd extensions.\n* [Back to top](#azd)\n\n## azd extension upgrade\n\nUpgrade installed extensions to the latest version.\n\n### Synopsis\n\nUpgrade one or more installed extensions.\n\nBy default, uses the stored registry source for each extension. If the stored\nsource is unavailable, falls back to the main (azd) registry. Extensions that\nwere installed from a non-main registry (e.g., dev) are automatically promoted\nto the main registry when a newer version is available there.\n\nUse --source to explicitly override the registry source for the upgrade. Use\n--all to upgrade all installed extensions in a single batch; failures in one\nextension do not prevent the remaining extensions from being upgraded.\n\nUse --output json for a structured report of all upgrade results.\n\n```azdeveloper\nazd extension upgrade [extension-id] [flags]\n```\n\n### Options\n\n```azdeveloper\n      --all              Upgrade all installed extensions\n      --docs             Opens the documentation for azd extension upgrade in your web browser.\n  -h, --help             Gets help for upgrade.\n  -s, --source string    The extension source to use for upgrades\n  -v, --version string   The version of the extension to upgrade to\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd extension](#azd-extension): Manage azd extensions.\n* [Back to top](#azd)\n\n## azd hooks\n\nDevelop, test and run hooks for a project.\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd hooks in your web browser.\n  -h, --help   Gets help for hooks.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd hooks run](#azd-hooks-run): Runs the specified hook for the project, provisioning layers, and services\n* [Back to top](#azd)\n\n## azd hooks run\n\nRuns the specified hook for the project, provisioning layers, and services\n\n```azdeveloper\nazd hooks run <name> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd hooks run in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for run.\n      --layer string         Only runs hooks for the specified provisioning layer.\n      --platform string      Forces hooks to run for the specified platform.\n      --service string       Only runs hooks for the specified service.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd hooks](#azd-hooks): Develop, test and run hooks for a project.\n* [Back to top](#azd)\n\n## azd infra\n\nManage your Infrastructure as Code (IaC).\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd infra in your web browser.\n  -h, --help   Gets help for infra.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd infra generate](#azd-infra-generate): Write IaC for your project to disk, allowing you to manually manage it.\n* [Back to top](#azd)\n\n## azd infra generate\n\nWrite IaC for your project to disk, allowing you to manually manage it.\n\n```azdeveloper\nazd infra generate [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd infra generate in your web browser.\n  -e, --environment string   The name of the environment to use.\n      --force                Overwrite any existing files without prompting\n  -h, --help                 Gets help for generate.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd infra](#azd-infra): Manage your Infrastructure as Code (IaC).\n* [Back to top](#azd)\n\n## azd init\n\nInitialize a new application.\n\n### Synopsis\n\nInitialize a new application.\n\nWhen used with --template, a new directory is created (named after the template)\nand the project is initialized inside it — similar to git clone.\nPass \".\" as the directory to initialize in the current directory instead.\n\n```azdeveloper\nazd init [flags]\n```\n\n### Options\n\n```azdeveloper\n  -b, --branch string         The template branch to initialize from. Must be used with a template argument (--template or -t).\n      --docs                  Opens the documentation for azd init in your web browser.\n  -e, --environment string    The name of the environment to use.\n  -f, --filter strings        The tag(s) used to filter template results. Supports comma-separated values.\n      --from-code             Initializes a new application from your existing code.\n  -h, --help                  Gets help for init.\n  -l, --location string       Azure location for the new environment\n  -m, --minimal               Initializes a minimal project.\n  -s, --subscription string   ID of an Azure subscription to use for the new environment\n  -t, --template string       Initializes a new application from a template. You can use a Full URI, <owner>/<repository>, <repository> if it's part of the azure-samples organization, or a local directory path (./dir, ../dir, or absolute path).\n      --up                    Provision and deploy to Azure after initializing the project from a template.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd mcp\n\nManage Model Context Protocol (MCP) server. (Alpha)\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd mcp in your web browser.\n  -h, --help   Gets help for mcp.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd mcp start](#azd-mcp-start): Starts the MCP server.\n* [Back to top](#azd)\n\n## azd mcp start\n\nStarts the MCP server.\n\n### Synopsis\n\nStarts the Model Context Protocol (MCP) server.\n\nThis command starts an MCP server that can be used by MCP clients to access\nazd functionality through the Model Context Protocol interface.\n\n```azdeveloper\nazd mcp start [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd mcp start in your web browser.\n  -h, --help   Gets help for start.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd mcp](#azd-mcp): Manage Model Context Protocol (MCP) server. (Alpha)\n* [Back to top](#azd)\n\n## azd monitor\n\nMonitor a deployed project.\n\n```azdeveloper\nazd monitor [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd monitor in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for monitor.\n      --live                 Open a browser to Application Insights Live Metrics. Live Metrics is currently not supported for Python apps.\n      --logs                 Open a browser to Application Insights Logs.\n      --overview             Open a browser to Application Insights Overview Dashboard.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd package\n\nPackages the project's code to be deployed to Azure.\n\n```azdeveloper\nazd package <service> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --all                  Packages all services that are listed in azure.yaml\n      --docs                 Opens the documentation for azd package in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for package.\n      --output-path string   File or folder path where the generated packages will be saved.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd pipeline\n\nManage and configure your deployment pipelines.\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd pipeline in your web browser.\n  -h, --help   Gets help for pipeline.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd pipeline config](#azd-pipeline-config): Configure your deployment pipeline to connect securely to Azure. (Beta)\n* [Back to top](#azd)\n\n## azd pipeline config\n\nConfigure your deployment pipeline to connect securely to Azure. (Beta)\n\n```azdeveloper\nazd pipeline config [flags]\n```\n\n### Options\n\n```azdeveloper\n  -m, --applicationServiceManagementReference string   Service Management Reference. References application or service contact information from a Service or Asset Management database. This value must be a Universally Unique Identifier (UUID). You can set this value globally by running azd config set pipeline.config.applicationServiceManagementReference <UUID>.\n      --auth-type string                               The authentication type used between the pipeline provider and Azure for deployment (Only valid for GitHub provider). Valid values: federated, client-credentials.\n      --docs                                           Opens the documentation for azd pipeline config in your web browser.\n  -e, --environment string                             The name of the environment to use.\n  -h, --help                                           Gets help for config.\n      --principal-id string                            The client id of the service principal to use to grant access to Azure resources as part of the pipeline.\n      --principal-name string                          The name of the service principal to use to grant access to Azure resources as part of the pipeline.\n      --principal-role stringArray                     The roles to assign to the service principal. By default the service principal will be granted the Contributor and User Access Administrator roles. (default [Contributor,User Access Administrator])\n      --provider string                                The pipeline provider to use (github for Github Actions and azdo for Azure Pipelines).\n      --remote-name string                             The name of the git remote to configure the pipeline to run on. (default \"origin\")\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd pipeline](#azd-pipeline): Manage and configure your deployment pipelines.\n* [Back to top](#azd)\n\n## azd provision\n\nProvision Azure resources for your project.\n\n```azdeveloper\nazd provision [<layer>] [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                  Opens the documentation for azd provision in your web browser.\n  -e, --environment string    The name of the environment to use.\n  -h, --help                  Gets help for provision.\n  -l, --location string       Azure location for the new environment\n      --no-state              (Bicep only) Forces a fresh deployment based on current Bicep template files, ignoring any stored deployment state.\n      --preview               Preview changes to Azure resources.\n      --subscription string   ID of an Azure subscription to use for the new environment\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd publish\n\nPublish a service to a container registry.\n\n```azdeveloper\nazd publish <service> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --all                   Publishes all services that are listed in azure.yaml\n      --docs                  Opens the documentation for azd publish in your web browser.\n  -e, --environment string    The name of the environment to use.\n      --from-package string   Publishes the service from a container image (image tag).\n  -h, --help                  Gets help for publish.\n      --to string             The target container image in the form '[registry/]repository[:tag]' to publish to.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd restore\n\nRestores the project's dependencies.\n\n```azdeveloper\nazd restore <service> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --all                  Restores all services that are listed in azure.yaml\n      --docs                 Opens the documentation for azd restore in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for restore.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd show\n\nDisplay information about your project and its resources.\n\n```azdeveloper\nazd show [resource-name|resource-id] [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                 Opens the documentation for azd show in your web browser.\n  -e, --environment string   The name of the environment to use.\n  -h, --help                 Gets help for show.\n      --show-secrets         Unmask secrets in output.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd template\n\nFind and view template details.\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd template in your web browser.\n  -h, --help   Gets help for template.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd template list](#azd-template-list): Show list of sample azd templates. (Beta)\n* [azd template show](#azd-template-show): Show details for a given template. (Beta)\n* [azd template source](#azd-template-source): View and manage template sources. (Beta)\n* [Back to top](#azd)\n\n## azd template list\n\nShow list of sample azd templates. (Beta)\n\n```azdeveloper\nazd template list [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs             Opens the documentation for azd template list in your web browser.\n  -f, --filter strings   The tag(s) used to filter template results. Supports comma-separated values.\n  -h, --help             Gets help for list.\n  -s, --source string    Filters templates by source.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd template](#azd-template): Find and view template details.\n* [Back to top](#azd)\n\n## azd template show\n\nShow details for a given template. (Beta)\n\n```azdeveloper\nazd template show <template> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd template show in your web browser.\n  -h, --help   Gets help for show.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd template](#azd-template): Find and view template details.\n* [Back to top](#azd)\n\n## azd template source\n\nView and manage template sources. (Beta)\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd template source in your web browser.\n  -h, --help   Gets help for source.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd template](#azd-template): Find and view template details.\n* [azd template source add](#azd-template-source-add): Adds an azd template source with the specified key. (Beta)\n* [azd template source list](#azd-template-source-list): Lists the configured azd template sources. (Beta)\n* [azd template source remove](#azd-template-source-remove): Removes the specified azd template source (Beta)\n* [Back to top](#azd)\n\n## azd template source add\n\nAdds an azd template source with the specified key. (Beta)\n\n### Synopsis\n\nThe key can be any value that uniquely identifies the template source, with well-known values being:\n   ・default: Default templates\n   ・awesome-azd: Templates from [https://aka.ms/awesome-azd](https://aka.ms/awesome-azd)\n\n```azdeveloper\nazd template source add <key> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs              Opens the documentation for azd template source add in your web browser.\n  -h, --help              Gets help for add.\n  -l, --location string   Location of the template source. Required when using type flag.\n  -n, --name string       Display name of the template source.\n  -t, --type string       Kind of the template source. Supported types are 'file', 'url' and 'gh'.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd template source](#azd-template-source): View and manage template sources. (Beta)\n* [Back to top](#azd)\n\n## azd template source list\n\nLists the configured azd template sources. (Beta)\n\n```azdeveloper\nazd template source list [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd template source list in your web browser.\n  -h, --help   Gets help for list.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd template source](#azd-template-source): View and manage template sources. (Beta)\n* [Back to top](#azd)\n\n## azd template source remove\n\nRemoves the specified azd template source (Beta)\n\n```azdeveloper\nazd template source remove <key> [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd template source remove in your web browser.\n  -h, --help   Gets help for remove.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [azd template source](#azd-template-source): View and manage template sources. (Beta)\n* [Back to top](#azd)\n\n## azd up\n\nProvision and deploy your project to Azure with a single command.\n\n```azdeveloper\nazd up [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs                  Opens the documentation for azd up in your web browser.\n  -e, --environment string    The name of the environment to use.\n  -h, --help                  Gets help for up.\n  -l, --location string       Azure location for the new environment\n      --subscription string   ID of an Azure subscription to use for the new environment\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string   Sets the current working directory.\n      --debug        Enables debugging and diagnostics logging.\n      --no-prompt    Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd update\n\nUpdates azd to the latest version.\n\n```azdeveloper\nazd update [flags]\n```\n\n### Options\n\n```azdeveloper\n      --channel string             Update channel: stable or daily.\n      --check-interval-hours int   Override the update check interval in hours.\n      --docs                       Opens the documentation for azd update in your web browser.\n  -h, --help                       Gets help for update.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n## azd version\n\nPrint the version number of Azure Developer CLI.\n\n```azdeveloper\nazd version [flags]\n```\n\n### Options\n\n```azdeveloper\n      --docs   Opens the documentation for azd version in your web browser.\n  -h, --help   Gets help for version.\n```\n\n### Options inherited from parent commands\n\n```azdeveloper\n  -C, --cwd string           Sets the current working directory.\n      --debug                Enables debugging and diagnostics logging.\n  -e, --environment string   The name of the environment to use.\n      --no-prompt            Runs without prompts. Uses existing values; fails if any required value or decision cannot be resolved automatically.\n```\n\n### See also\n\n* [Back to top](#azd)\n\n"
  },
  {
    "path": "articles/azure-developer-cli/remote-builds.md",
    "content": "---\ntitle: Learn how to use the remote builds feature of the Azure Developer CLI.\ndescription: Learn how to use remote builds with Azure Container Registries and the Azure Developer CLI.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 06/03/2025\nms.service: azure-dev-cli\nms.topic: concept-article\nms.custom: devx-track-azdevcli\n---\n\n# Remote builds support with Azure Container Registry\n\nRemote builds enable you to offload the process of building container images from your local development environment to a managed build service in the cloud. This is especially useful for large or complex builds, or when your local machine lacks the necessary resources or dependencies. The Azure Developer CLI (`azd`) supports remote builds through Azure Container Registry (ACR) when deploying to Azure Container Apps.\n\nAzure Container Registry supports remote builds by providing a secure, cloud-based environment where your source code and Dockerfiles can be built into container images. With ACR Tasks, you can automate image builds and deployments, ensuring consistency and scalability across your development and production environments.\n\nUsing remote builds in your Azure Developer CLI (azd) templates offers several benefits:\n\n- **Resource efficiency:** Offload compute-intensive builds to the cloud.\n- **Consistency:** Ensure builds are reproducible and isolated from local environment differences.\n- **Scalability:** Build multiple images in parallel without taxing your local machine.\n- **Security:** Keep sensitive build secrets and credentials in Azure, not on your local device.\n\n## Configure remote builds\n\nTo configure the Azure Developer CLI to use remote builds with Azure Container Registry, follow these steps:\n\n1. Update your infrastructure files:\n\n   - Ensure your infrastructure-as-code (IaC) templates (such as Bicep, ARM, or Terraform) provision an Azure Container Registry resource.\n   - Grant the necessary permissions for your build process to push and pull images from the registry.\n\n1. In your project’s `azure.yaml`, update the `docker` configuration to use remote builds:\n\n     ```yaml\n     services:\n       webapp:\n         project: ./src/webapp\n         language: js\n         host: containerapp\n         docker:\n           path: ./Dockerfile\n           remoteBuild: true\n     ```\n\n1. Run the `azd up` or `azd deploy` command. `azd` detects the remote build configuration and submits your build to the Azure Container Registry provisioned by the template.\n\n## Verify the remote build\n\nAfter the `azd up` workflow completes, verify the remote build run in the Azure portal:\n\n1. Navigate to the provisioned container registry.\n1. In the left navigation, select **Services > Repositories**.\n1. Select the repository from the list, and then select the most recent tag.\n\n    :::image type=\"content\" source=\"media/remote-builds/container-registry-repository.png\" alt-text=\"A screenshot of the container registry repository.\":::\n\n1. Select the Run ID to view the output logs for the container build process.\n\n    :::image type=\"content\" source=\"media/remote-builds/container-run-id.png\" alt-text=\"A screenshot showing the container build run.\":::\n\n    Browse the logs to view key build steps, such as the retrieval of Docker base images or source code compilation.\n\n## Next steps\n\n- [Use third-party container registries](/azure/developer/azure-developer-cli/use-external-registry)\n- [Remote environment support](/azure/developer/azure-developer-cli/remote-environments-support)\n- [Azure deployment stacks integration](/azure/developer/azure-developer-cli/azure-deployment-stacks-integration)\n"
  },
  {
    "path": "articles/azure-developer-cli/remote-environments-support.md",
    "content": "---\ntitle: Remote Environments Support\ndescription: How to use remote environments in `azd` via remote state\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: concept-article\nms.custom: devx-track-azdevcli\n---\n\n# Remote Environments Support\n\nTo use remote environments, enable remote state to ensure the environment state automatically persists to the configured remote store. Meaning any `azd` command automatically persists changes that write to your `azd` `.env` or `config.json` file.\n\n## Configure remote state\n\nRemote state for `azd` can be configured globally in `azd`'s `config.json` or by project within the `azure.yaml`. If remote state isn't set up, environment values and configuration continue to be stored locally.\n\nConfigure remote state within the `state.remote` element of `azd` configuration:\n\n- **backend**: The name of the backend type used for remote state\n- **config**: Map of key/value pairs unique to each remote state provider\n\n### Enable by project\n\n#### azure.yaml\n\n```yaml\nname: azd-project-name\nstate:\n  remote:\n    backend: AzureBlobStorage\n    config:\n      accountName: saazdremotestate\n      containerName: myproject # Defaults to project name if not specified\n```\n\n### Enable globally\n\n#### azd config.json\n\n```json\n{\n  \"state\": {\n    \"remote\": {\n      \"backend\": \"AzureBlobStorage\",\n      \"config\": {\n        \"accountName\": \"saazdremotestate\"\n      }\n    }\n  }\n}\n```\n\n## Supported Remote state backends\n\n### Azure Blob Storage\n\n`azd` writes `.env` and `config.json` files to an Azure storage blob container\n\n#### Configuration\n\n- **accountName**: Name of the Azure storage account\n- **containerName**: Name of the container within the storage account where configuration is stored. Defaults to the current azd project name if not specified\n- **endpoint**: Azure Endpoint used when configuring remote state. _Defaults to `core.windows.net`_\n\n## Remote state and `azd` commands\n\n### `azd env list`\n\nLists all local and remote environments available. For example:\n\n:::image type=\"content\" source=\"media/remote-environments-support/azd-env-list-exampleOutput.png\" alt-text=\"Example output of `azd env list` with remote environments.\":::\n\n### `azd env select`\n\nWhen selecting an environment that doesn't exist locally, the remote state is copied to a new local environment.\n\nFor example, consider the output from the previous `azd env list`. To copy the remote state, `dev` to your local environment you would run the following:\n\n```azdeveloper\nazd env select dev\n```\n"
  },
  {
    "path": "articles/azure-developer-cli/resource-group-scoped-deployments.md",
    "content": "---\ntitle: Resource Group Scoped Deployments\ndescription: How to deploy templates that target resource group scope instead of subscription scope with the Azure Developer CLI (azd)\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Resource Group Scoped Deployments\n\nAzure Developer CLI (`azd`) supports deployments at both the subscription and resource group scopes. By default, `azd` creates a resource group that contains the provisioned resources in the subscription you choose during the `azd up` workflow. However, `azd` also allows you to deploy to an existing resource group. When you choose an existing resource group, the scope of permissions needed to run `azd provision` is reduced from subscription level to the resource group level.\n\nIn this article, you learn how to modify templates to enable resource group scoped deployments.\n\n> [!NOTE]\n> Resource Group Scoped Deployment is currently a beta feature.\n> [Learn more about our versioning strategy.](./feature-versioning.md)\n\n## Modify the target scope of a template\n\n1. In `main.bicep` file of your `azd` template, change `targetScope`:\n\n    ```bicep\n    targetScope = 'resourceGroup'\n    ```\n\n1. Remove `scope: rg` from all the module references in `main.bicep`.\n\n1. Use resource group instead of subscription when you create a unique resource token in `main.bicep`, .\n\n    ```bicep\n    var resourceToken = toLower(uniqueString(resourceGroup().id, environmentName, location))\n    ```\n\n1. Remove the following section of code in `main.bicep` that organizes resources into a resource group.\n\n    ```bicep\n    // Organize resources in a resource group\n    resource rg 'Microsoft.Resources/resourceGroups@2021-04-01' = {\n        name: !empty(resourceGroupName) ? resourceGroupName : '${abbrs.resourcesResourceGroups}${environmentName}'\n        location: location\n        tags: tags\n    }\n    ```\n\n1. If applicable, in the `.azdo\\pipelines\\azure-dev.yml` and `.github\\workflows\\azure-dev.yml` files, add the Azure resource group environment variable to your tasks.\n\n    ```yml\n    AZURE_RESOURCE_GROUP: $(AZURE_RESOURCE_GROUP)\n    ```\n\n> [!NOTE]\n> For an example of these changes applied to the [React Web App with Node.js API and MongoDB on Azure template](https://github.com/Azure-Samples/todo-nodejs-mongo), see [this GitHub comparison](https://github.com/Azure-Samples/todo-nodejs-mongo/compare/main...ellismg:todo-nodejs-mongo:ellismg/move-to-rg-scope).\n\nTo set the resource group to deploy to manually, you can set `AZURE_RESOURCE_GROUP` in your [environment variables](./manage-environment-variables.md).\n\nAlternatively, if you do not have a resource group specified in your environment, `azd` prompts you to pick an existing resource group from your subscription or create a new one when you run `azd provision`.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure Developer CLI FAQ](./tooling-environment-faq.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/service-packaging-ignore-files.md",
    "content": "---\ntitle: Configure service packaging file inclusions and exclusions\ndescription: How to configure service packaging file inclusions and exclusions for Azure Developer CLI templates\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Configure service packaging file exclusions\n\nThe Azure Developer CLI (`azd`) allows you to add ignore files in your templates that specify files and directories to exclude from the deployment package for App Service and Function Apps. This feature provides granular control at the service level over which files are included in the packaging process.\n\n## Understand service packaging ignore files\n\nThere are two different types of ignore files you can use to influence the packaging process:\n\n- `.webappignore` influences packaging exclusions for Azure App Service deployments.\n- `.funcignore` influences  packaging exclusions for Azure Functions deployments.\n\nThese ignore files are applied based on the targeted deployment service, ensuring users can independently customize file exclusions when packaging for Azure App Service and Azure Functions. Both types of packaging ignore files follow these rules:\n\n- `.webappignore` or `.funcignore` files should be placed in the root folder of the relevant service in your `azd` template.\n- If a `.webappignore` or `.funcignore` file exists in a service directory, the packaging process follows its rules, allowing granular control over which files are included or excluded in the service's zip archive.\n- If no `.webappignore` or `.funcignore` file is present, default exclusions apply:\n  - Python: `__pycache__` and any `venv` files\n  - Node.js: `node_modules`\n- The syntax for the ignore files followed the standard [`gitignore` syntax](https://git-scm.com/docs/gitignore). For example, use the `!` symbol to revert an exclusion.\n\n## Exclusion examples\n\nIn your `azd` template, add a `.webappignore` or `.funcignore` file to the root folder of the service you intend to deploy to Azure App Service or Azure Functions. Update the content of those ignore files to include or exclude files using the following patterns:\n\n# [Node.js](#tab/nodejs)\n\nExclude a folder or a specific file:\n\n```text\nlogs/*\ntestfile.js\n```\n\nExclude folders or files that are ignored by default when the `.webappignore` or `.funcignore` file isn't present:\n\n```text\nnode_modules/\n```\n\n# [Python](#tab/python)\n\nExclude a folder or a specific file:\n\n```text\nlogs/*\ntestfile.py\n```\n\nExclude folders or files that are ignored by default when the `.webappignore` or `.funcignore` file isn't present:\n\n```text\n__pycache__/*\n.venv/*\n```\n\n---\n"
  },
  {
    "path": "articles/azure-developer-cli/source-schema.json",
    "content": "{\n    \"$schema\": \"https://json-schema.org/draft/2019-09/schema\",\n    \"$id\": \"https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json\",\n    \"title\": \"Azure Developer CLI configuration\",\n    \"description\": \"Configuration file for the Azure Developer CLI (azd)\",\n    \"type\": \"object\",\n    \"required\": [\n        \"name\"\n    ],\n    \"additionalProperties\": true,\n    \"properties\": {\n        \"name\": {\n            \"type\": \"string\",\n            \"minLength\": 2,\n            \"title\": \"Name of the application\",\n            \"pattern\": \"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\",\n            \"description\": \"The application name. Only lowercase letters, numbers, and hyphens (-) are allowed. The name must start and end with a letter or number.\"\n        },\n        \"resourceGroup\": {\n            \"type\": \"string\",\n            \"minLength\": 3,\n            \"maxLength\": 64,\n            \"title\": \"Name of the Azure resource group\",\n            \"description\": \"When specified will override the resource group name used for infrastructure provisioning. Supports environment variable substitution.\"\n        },\n        \"metadata\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"template\": {\n                    \"type\": \"string\",\n                    \"title\": \"Identifier of the template from which the application was created. Optional.\",\n                    \"examples\": [\n                        \"todo-nodejs-mongo@0.0.1-beta\"\n                    ]\n                }\n            }\n        },\n        \"infra\": {\n            \"type\": \"object\",\n            \"title\": \"The infrastructure configuration used for the application\",\n            \"description\": \"Optional. Provides additional configuration for Azure infrastructure provisioning.\",\n            \"additionalProperties\": true,\n            \"properties\": {\n                \"provider\": {\n                    \"type\": \"string\",\n                    \"title\": \"Type of infrastructure provisioning provider\",\n                    \"description\": \"Optional. The infrastructure provisioning provider used to provision the Azure resources for the application. (Default: bicep)\",\n                    \"enum\": [\n                        \"bicep\",\n                        \"terraform\"\n                    ]\n                },\n                \"path\": {\n                    \"type\": \"string\",\n                    \"title\": \"Path to the location that contains Azure provisioning templates\",\n                    \"description\": \"Optional. The relative folder path to the Azure provisioning templates for the specified provider. (Default: infra)\"\n                },\n                \"module\": {\n                    \"type\": \"string\",\n                    \"title\": \"Name of the default module within the Azure provisioning templates\",\n                    \"description\": \"Optional. The name of the Azure provisioning module used when provisioning resources. (Default: main)\"\n                },\n                \"layers\": {\n                    \"type\": \"array\",\n                    \"title\": \"Provisioning layers.\",\n                    \"description\": \"Optional. Layers for Azure infrastructure provisioning.\",\n                    \"uniqueItems\": true,\n                    \"items\": {\n                        \"type\": \"object\",\n                        \"title\": \"A provisioning layer.\",\n                        \"additionalProperties\": false,\n                        \"required\": [\n                            \"name\",\n                            \"path\"\n                        ],\n                        \"properties\": {\n                            \"name\": {\n                                \"type\": \"string\",\n                                \"title\": \"The name of the provisioning layer\",\n                                \"description\": \"The name of the provisioning layer\"\n                            },\n                            \"path\": {\n                                \"type\": \"string\",\n                                \"title\": \"Path to the location that contains Azure provisioning templates\",\n                                \"description\": \"The relative folder path to the Azure provisioning templates for the specified provider.\"\n                            },\n                            \"module\": {\n                                \"type\": \"string\",\n                                \"title\": \"Name of the default module within the Azure provisioning templates\",\n                                \"description\": \"Optional. The name of the Azure provisioning module used when provisioning resources. (Default: main)\"\n                            },\n                            \"dependsOn\": {\n                                \"type\": \"array\",\n                                \"title\": \"Layer names this layer must wait for\",\n                                \"description\": \"Optional. Names of other layers this layer depends on. Use to declare hook-mediated dependencies (for example, when a postprovision hook in another layer writes an env var that this layer's bicepparam reads at provision time) that azd's static analyzer cannot infer from .bicep / .bicepparam / .parameters.json contents.\",\n                                \"uniqueItems\": true,\n                                \"items\": {\n                                    \"type\": \"string\"\n                                }\n                            },\n                            \"hooks\": {\n                                \"type\": \"object\",\n                                \"title\": \"Provisioning layer hooks\",\n                                \"description\": \"Hooks should match `provision` event names prefixed with `pre` or `post` depending on when the script should execute. When specifying paths they should be relative to the layer path.\",\n                                \"additionalProperties\": false,\n                                \"properties\": {\n                                    \"preprovision\": {\n                                        \"title\": \"pre provision hook\",\n                                        \"description\": \"Runs before provisioning the layer\",\n                                        \"$ref\": \"#/definitions/hooks\"\n                                    },\n                                    \"postprovision\": {\n                                        \"title\": \"post provision hook\",\n                                        \"description\": \"Runs after provisioning the layer\",\n                                        \"$ref\": \"#/definitions/hooks\"\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            },\n            \"allOf\": [\n                {\n                    \"if\": {\n                        \"required\": [\n                            \"layers\"\n                        ],\n                        \"properties\": {\n                            \"layers\": {\n                                \"type\": \"array\",\n                                \"minItems\": 1\n                            }\n                        }\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"path\": false,\n                            \"module\": false\n                        }\n                    }\n                }\n            ]\n        },\n        \"services\": {\n            \"type\": \"object\",\n            \"title\": \"Definition of services that comprise the application\",\n            \"minProperties\": 1,\n            \"additionalProperties\": {\n                \"type\": \"object\",\n                \"additionalProperties\": true,\n                \"required\": [\n                    \"host\"\n                ],\n                \"properties\": {\n                    \"apiVersion\": {\n                        \"type\": \"string\",\n                        \"title\": \"Resource provider API version for deployments\",\n                        \"description\": \"Optional. The resource provider API version to use for the service. If not specified, the default SDK API version is used. Only valid when host is 'containerapp'.\"\n                    },\n                    \"resourceGroup\": {\n                        \"type\": \"string\",\n                        \"title\": \"Name of the Azure resource group that contains the resource\",\n                        \"description\": \"By default, the CLI will discover the Azure resource within the default resource group. When specified, the CLI will instead find the Azure resource within the specified resource group. Supports environment variable substitution.\"\n                    },\n                    \"resourceName\": {\n                        \"type\": \"string\",\n                        \"title\": \"Name of the Azure resource that implements the service\",\n                        \"description\": \"By default, the CLI will discover the Azure resource with tag 'azd-service-name' set to the current service's name. When specified, the CLI will instead find the Azure resource with the matching resource name. Supports environment variable substitution.\"\n                    },\n                    \"project\": {\n                        \"type\": \"string\",\n                        \"title\": \"Path to the service source code directory\"\n                    },\n                    \"image\": {\n                        \"type\": \"string\",\n                        \"title\": \"Optional. The source image to be used for the container image instead of building from source. Supports environment variable substitution.\",\n                        \"description\": \"If omitted, container image will be built from source specified in the 'project' property. Setting both 'project' and 'image' is invalid.\"\n                    },\n                    \"host\": {\n                        \"type\": \"string\",\n                        \"title\": \"Required. The type of Azure resource used for service implementation\",\n                        \"description\": \"The Azure service that will be used as the target for deployment operations for the service.\",\n                        \"examples\": [\n                            \"appservice\",\n                            \"containerapp\",\n                            \"function\",\n                            \"springapp\",\n                            \"staticwebapp\",\n                            \"aks\",\n                            \"ai.endpoint\",\n                            \"azure.ai.agent\"\n                        ]\n                    },\n                    \"language\": {\n                        \"type\": \"string\",\n                        \"title\": \"Service implementation language\",\n                        \"examples\": [\n                            \"dotnet\",\n                            \"csharp\",\n                            \"fsharp\",\n                            \"py\",\n                            \"python\",\n                            \"js\",\n                            \"ts\",\n                            \"java\",\n                            \"docker\"\n                        ]\n                    },\n                    \"module\": {\n                        \"type\": \"string\",\n                        \"title\": \"Path of the infrastructure module used to deploy the service relative to the root infra folder\",\n                        \"description\": \"If omitted, the CLI will assume the module name is the same as the service name.\"\n                    },\n                    \"dist\": {\n                        \"type\": \"string\",\n                        \"title\": \"Relative path to service deployment artifacts\"\n                    },\n                    \"remoteBuild\": {\n                        \"type\": \"boolean\",\n                        \"title\": \"Optional. Whether to use remote build for function app deployment\",\n                        \"description\": \"When set to true, the deployment package will be built remotely using Oryx. When set to false, the package is deployed as-is. If omitted, defaults to true for JavaScript, TypeScript, and Python function apps.\"\n                    },\n                    \"docker\": {\n                        \"$ref\": \"#/definitions/docker\"\n                    },\n                    \"k8s\": {\n                        \"$ref\": \"#/definitions/aksOptions\"\n                    },\n                    \"config\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": true\n                    },\n                    \"uses\": {\n                        \"type\": \"array\",\n                        \"title\": \"Dependencies on other services and resources\",\n                        \"description\": \"List of service names and resource names that this service depends on.\",\n                        \"items\": {\n                            \"type\": \"string\"\n                        }\n                    },\n                    \"env\": {\n                        \"type\": \"object\",\n                        \"title\": \"Environment variables for the service\",\n                        \"description\": \"Optional. A map of environment variable names to values. Supports environment variable substitution.\",\n                        \"additionalProperties\": {\n                            \"type\": \"string\"\n                        }\n                    },\n                    \"hooks\": {\n                        \"type\": \"object\",\n                        \"title\": \"Service level hooks\",\n                        \"description\": \"Hooks should match `service` event names prefixed with `pre` or `post` depending on when the script should execute. When specifying paths they should be relative to the service path.\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                            \"predeploy\": {\n                                \"title\": \"pre deploy hook\",\n                                \"description\": \"Runs before the service is deployed to Azure\",\n                                \"$ref\": \"#/definitions/hooks\"\n                            },\n                            \"postdeploy\": {\n                                \"title\": \"post deploy hook\",\n                                \"description\": \"Runs after the service is deployed to Azure\",\n                                \"$ref\": \"#/definitions/hooks\"\n                            },\n                            \"prerestore\": {\n                                \"title\": \"pre restore hook\",\n                                \"description\": \"Runs before the service dependencies are restored\",\n                                \"$ref\": \"#/definitions/hooks\"\n                            },\n                            \"postrestore\": {\n                                \"title\": \"post restore hook\",\n                                \"description\": \"Runs after the service dependencies are restored\",\n                                \"$ref\": \"#/definitions/hooks\"\n                            },\n                            \"prebuild\": {\n                                \"title\": \"pre build hook\",\n                                \"description\": \"Runs before the service is built\",\n                                \"$ref\": \"#/definitions/hooks\"\n                            },\n                            \"postbuild\": {\n                                \"title\": \"post build hook\",\n                                \"description\": \"Runs after the service is built\",\n                                \"$ref\": \"#/definitions/hooks\"\n                            },\n                            \"prepackage\": {\n                                \"title\": \"pre package hook\",\n                                \"description\": \"Runs before the service is deployment package is created\",\n                                \"$ref\": \"#/definitions/hooks\"\n                            },\n                            \"postpackage\": {\n                                \"title\": \"post package hook\",\n                                \"description\": \"Runs after the service is deployment package is created\",\n                                \"$ref\": \"#/definitions/hooks\"\n                            },\n                            \"prepublish\": {\n                                \"title\": \"pre publish hook\",\n                                \"description\": \"Runs before the service is published\",\n                                \"$ref\": \"#/definitions/hooks\"\n                            },\n                            \"postpublish\": {\n                                \"title\": \"post publish hook\",\n                                \"description\": \"Runs after the service is published\",\n                                \"$ref\": \"#/definitions/hooks\"\n                            }\n                        }\n                    }\n                },\n                \"allOf\": [\n                    {\n                        \"comment\": \"ContainerApp host - supports image OR project, docker config, and apiVersion\",\n                        \"if\": {\n                            \"properties\": {\n                                \"host\": { \"const\": \"containerapp\" }\n                            }\n                        },\n                        \"then\": {\n                            \"anyOf\": [\n                                {\n                                    \"required\": [\"image\"],\n                                    \"not\": { \"required\": [\"project\"] }\n                                },\n                                {\n                                    \"required\": [\"project\"],\n                                    \"not\": { \"required\": [\"image\"] }\n                                }\n                            ],\n                            \"properties\": {\n                                \"k8s\": false\n                            }\n                        }\n                    },\n                    {\n                        \"comment\": \"AKS host - project is optional, supports docker and k8s config\",\n                        \"if\": {\n                            \"properties\": {\n                                \"host\": { \"const\": \"aks\" }\n                            }\n                        },\n                        \"then\": {\n                            \"properties\": {\n                                \"image\": false,\n                                \"apiVersion\": false,\n                                \"env\": false\n                            }\n                        }\n                    },\n                    {\n                        \"comment\": \"AI Endpoint host - requires project and config, supports docker\",\n                        \"if\": {\n                            \"properties\": {\n                                \"host\": { \"const\": \"ai.endpoint\" }\n                            }\n                        },\n                        \"then\": {\n                            \"required\": [\"project\", \"config\"],\n                            \"properties\": {\n                                \"config\": {\n                                    \"$ref\": \"#/definitions/aiEndpointConfig\",\n                                    \"title\": \"The Azure AI endpoint configuration.\",\n                                    \"description\": \"Required. Provides additional configuration for Azure AI online endpoint deployment.\"\n                                },\n                                \"image\": false,\n                                \"k8s\": false,\n                                \"apiVersion\": false,\n                                \"env\": false\n                            }\n                        }\n                    },\n                    {\n                        \"comment\": \"Azure AI Agent host - requires project, supports docker and config\",\n                        \"if\": {\n                            \"properties\": {\n                                \"host\": { \"const\": \"azure.ai.agent\" }\n                            }\n                        },\n                        \"then\": {\n                            \"required\": [\"project\"],\n                            \"properties\": {\n                                \"config\": {\n                                    \"$ref\": \"https://raw.githubusercontent.com/Azure/azure-dev/refs/heads/main/cli/azd/extensions/azure.ai.agents/schemas/azure.ai.agent.json\",\n                                    \"title\": \"The Azure AI Agent configuration.\",\n                                    \"description\": \"Optional. Provides additional configuration for Azure AI Agent deployment.\"\n                                },\n                                \"image\": false,\n                                \"k8s\": false,\n                                \"apiVersion\": false,\n                                \"env\": false\n                            }\n                        }\n                    },\n                    {\n                        \"comment\": \"Traditional hosts - require project only, disable container-specific properties\",\n                        \"if\": {\n                            \"properties\": {\n                                \"host\": { \"enum\": [\"appservice\", \"function\", \"springapp\", \"staticwebapp\"] }\n                            }\n                        },\n                        \"then\": {\n                            \"required\": [\"project\"],\n                            \"properties\": {\n                                \"image\": false,\n                                \"docker\": false,\n                                \"k8s\": false,\n                                \"apiVersion\": false,\n                                \"env\": false\n                            }\n                        }\n                    },\n                    {\n                        \"comment\": \"remoteBuild is only valid for function host\",\n                        \"if\": {\n                            \"properties\": {\n                                \"host\": { \"not\": { \"const\": \"function\" } }\n                            }\n                        },\n                        \"then\": {\n                            \"properties\": {\n                                \"remoteBuild\": false\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"resources\": {\n            \"type\": \"object\",\n            \"additionalProperties\": {\n                \"type\": \"object\",\n                \"required\": [\n                    \"type\"\n                ],\n                \"properties\": {\n                    \"type\": {\n                        \"type\": \"string\",\n                        \"title\": \"Type of resource\",\n                        \"description\": \"The type of resource to be created. (Example: db.postgres)\",\n                        \"enum\": [\n                            \"db.postgres\",\n                            \"db.mysql\",\n                            \"db.redis\",\n                            \"db.mongo\",\n                            \"db.cosmos\",\n                            \"ai.openai.model\",\n                            \"ai.project\",\n                            \"ai.search\",\n                            \"host.containerapp\",\n                            \"host.appservice\",\n                            \"messaging.eventhubs\",\n                            \"messaging.servicebus\",\n                            \"storage\",\n                            \"keyvault\"\n                        ]\n                    },\n                    \"uses\": {\n                        \"type\": \"array\",\n                        \"title\": \"Other resources that this resource uses\",\n                        \"items\": {\n                            \"type\": \"string\"\n                        },\n                        \"uniqueItems\": true\n                    },\n                    \"existing\": {\n                        \"type\": \"boolean\",\n                        \"title\": \"An existing resource for referencing purposes\",\n                        \"description\": \"Optional. When set to true, this resource will not be created and instead be used for referencing purposes. (Default: false)\",\n                        \"default\": false\n                    }\n                },\n                \"allOf\": [\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"host.appservice\" } } }, \"then\": { \"$ref\": \"#/definitions/appServiceResource\" } },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"host.containerapp\" }}}, \"then\": { \"$ref\": \"#/definitions/containerAppResource\" } },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"ai.openai.model\" }}}, \"then\": { \"$ref\": \"#/definitions/aiModelResource\" } },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"ai.project\" }}}, \"then\": { \"$ref\": \"#/definitions/aiProjectResource\" } },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"ai.search\" }}}, \"then\": { \"$ref\": \"#/definitions/aiSearchResource\" } },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"db.postgres\"  }}}, \"then\": { \"$ref\": \"#/definitions/genericDbResource\"} },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"db.mysql\"  }}}, \"then\": { \"$ref\": \"#/definitions/genericDbResource\"} },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"db.redis\"  }}}, \"then\": { \"$ref\": \"#/definitions/genericDbResource\"} },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"db.mongo\"  }}}, \"then\": { \"$ref\": \"#/definitions/genericDbResource\"} },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"db.cosmos\" }}}, \"then\": { \"$ref\": \"#/definitions/cosmosDbResource\"} },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"messaging.eventhubs\" }}}, \"then\": { \"$ref\": \"#/definitions/eventHubsResource\" } },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"messaging.servicebus\" }}}, \"then\": { \"$ref\": \"#/definitions/serviceBusResource\" } },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"storage\"  }}}, \"then\": { \"$ref\": \"#/definitions/storageAccountResource\"} },\n                    { \"if\": { \"properties\": { \"type\": { \"const\": \"keyvault\" }}}, \"then\": { \"$ref\": \"#/definitions/keyVaultResource\"} }\n                ]\n            }\n        },\n        \"pipeline\": {\n            \"type\": \"object\",\n            \"title\": \"Definition of continuous integration pipeline\",\n            \"properties\": {\n                \"provider\": {\n                    \"type\": \"string\",\n                    \"title\": \"Type of pipeline provider\",\n                    \"description\": \"Optional. The pipeline provider to be used for continuous integration. (Default: github)\",\n                    \"enum\": [\n                        \"github\",\n                        \"azdo\"\n                    ]\n                },\n                \"variables\": {\n                    \"type\": \"array\",\n                    \"title\": \"Optional. List of azd environment variables to be used in the pipeline as variables.\",\n                    \"description\": \"If variable is found on azd environment, it is set as a variable for the pipeline.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    }\n                },\n                \"secrets\": {\n                    \"type\": \"array\",\n                    \"title\": \"Optional. List of azd environment variables to be used in the pipeline as secrets.\",\n                    \"description\": \"If variable is found on azd environment, it is set as a secret for the pipeline.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    }\n                }\n            }\n        },\n        \"hooks\": {\n            \"type\": \"object\",\n            \"title\": \"Command level hooks\",\n            \"description\": \"Hooks should match `azd` command names prefixed with `pre` or `post` depending on when the script should execute. When specifying paths they should be relative to the project path.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"preprovision\": {\n                    \"title\": \"pre provision hook\",\n                    \"description\": \"Runs before the `provision` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"postprovision\": {\n                    \"title\": \"post provision hook\",\n                    \"description\": \"Runs after the `provision` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"preinfracreate\": {\n                    \"title\": \"pre infra create hook\",\n                    \"description\": \"Runs before the `infra create` or `provision` commands\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"postinfracreate\": {\n                    \"title\": \"post infra create hook\",\n                    \"description\": \"Runs after the `infra create` or `provision` commands\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"preinfradelete\": {\n                    \"title\": \"pre infra delete hook\",\n                    \"description\": \"Runs before the `infra delete` or `down` commands\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"postinfradelete\": {\n                    \"title\": \"post infra delete hook\",\n                    \"description\": \"Runs after the `infra delete` or `down` commands\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"predown\": {\n                    \"title\": \"pre down hook\",\n                    \"description\": \"Runs before the `infra delete` or `down` commands\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"postdown\": {\n                    \"title\": \"post down hook\",\n                    \"description\": \"Runs after the `infra delete` or `down` commands\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"preup\": {\n                    \"title\": \"pre up hook\",\n                    \"description\": \"Runs before the `up` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"postup\": {\n                    \"title\": \"post up hook\",\n                    \"description\": \"Runs after the `up` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"prepackage\": {\n                    \"title\": \"pre package hook\",\n                    \"description\": \"Runs before the `package` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"postpackage\": {\n                    \"title\": \"post package hook\",\n                    \"description\": \"Runs after the `package` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"prepublish\": {\n                    \"title\": \"pre publish hook\",\n                    \"description\": \"Runs before the `publish` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"postpublish\": {\n                    \"title\": \"post publish hook\",\n                    \"description\": \"Runs after the `publish` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"predeploy\": {\n                    \"title\": \"pre deploy hook\",\n                    \"description\": \"Runs before the `deploy` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"postdeploy\": {\n                    \"title\": \"post deploy hook\",\n                    \"description\": \"Runs after the `deploy` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"prerestore\": {\n                    \"title\": \"pre restore hook\",\n                    \"description\": \"Runs before the `restore` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                },\n                \"postrestore\": {\n                    \"title\": \"post restore hook\",\n                    \"description\": \"Runs after the `restore` command\",\n                    \"$ref\": \"#/definitions/hooks\"\n                }\n            }\n        },\n        \"requiredVersions\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"description\": \"Optional. Provides additional configuration for required versions of `azd` and extensions.\",\n            \"properties\": {\n                \"azd\": {\n                    \"type\": \"string\",\n                    \"title\": \"A range of supported versions of `azd` for this project\",\n                    \"description\": \"A range of supported versions of `azd` for this project. If the version of `azd` is outside this range, the project will fail to load. Optional (allows all versions if absent).\",\n                    \"examples\": [\n                        \">= 0.6.0-beta.3\"\n                    ]\n                },\n                \"extensions\": {\n                    \"type\": \"object\",\n                    \"title\": \"A map of required extensions and version constraints for this project.\",\n                    \"description\": \"A map of required extensions and version constraints for this project. Supports semver constraints. If version is omitted the latest version will be installed.\",\n                    \"additionalProperties\": {\n                        \"type\": \"string\",\n                        \"examples\": [\n                            \"latest\",\n                            \">=1.0.0\",\n                            \"~2.0.0\",\n                            \"=3.1.2\",\n                            \">= 1.0.0 < 2.0.0\"\n                        ]\n                    }\n                }\n            }\n        },\n        \"state\": {\n            \"type\": \"object\",\n            \"title\": \"The state configuration used for the project.\",\n            \"description\": \"Optional. Provides additional configuration for state management.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"remote\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"title\": \"The remote state configuration.\",\n                    \"description\": \"Optional. Provides additional configuration for remote state management such as Azure Blob Storage.\",\n                    \"required\": [\n                        \"backend\"\n                    ],\n                    \"properties\": {\n                        \"backend\": {\n                            \"type\": \"string\",\n                            \"title\": \"The remote state backend type.\",\n                            \"description\": \"Optional. The remote state backend type. (Default: AzureBlobStorage)\",\n                            \"default\": \"AzureBlobStorage\",\n                            \"enum\": [\n                                \"AzureBlobStorage\"\n                            ]\n                        },\n                        \"config\": {\n                            \"type\": \"object\",\n                            \"additionalProperties\": true\n                        }\n                    },\n                    \"allOf\": [\n                        {\n                            \"if\": {\n                                \"properties\": {\n                                    \"backend\": {\n                                        \"const\": \"AzureBlobStorage\"\n                                    }\n                                }\n                            },\n                            \"then\": {\n                                \"required\": [\n                                    \"config\"\n                                ],\n                                \"properties\": {\n                                    \"config\": {\n                                        \"$ref\": \"#/definitions/azureBlobStorageConfig\"\n                                    }\n                                }\n                            }\n                        }\n                    ]\n                }\n            }\n        },\n        \"platform\": {\n            \"type\": \"object\",\n            \"title\": \"The platform configuration used for the project.\",\n            \"description\": \"Optional. Provides additional configuration for platform specific features such as Azure Dev Center.\",\n            \"additionalProperties\": false,\n            \"required\": [\n                \"type\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"The platform type.\",\n                    \"description\": \"Required. The platform type. (Example: devcenter)\",\n                    \"enum\": [\n                        \"devcenter\"\n                    ]\n                },\n                \"config\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": true\n                }\n            },\n            \"allOf\": [\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"type\": {\n                                \"const\": \"devcenter\"\n                            }\n                        }\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"config\": {\n                                \"$ref\": \"#/definitions/azureDevCenterConfig\"\n                            }\n                        }\n                    }\n                }\n            ]\n        },\n        \"workflows\": {\n            \"type\": \"object\",\n            \"title\": \"The workflows configuration used for the project.\",\n            \"description\": \"Optional. Provides additional configuration for workflows such as override azd up behavior.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"up\": {\n                    \"title\": \"The up workflow configuration\",\n                    \"description\": \"When specified will override the default behavior for the azd up workflow. Common use cases include changing the order of the provision, package and deploy commands.\",\n                    \"$ref\": \"#/definitions/workflow\"\n                }\n            }\n        },\n        \"cloud\": {\n            \"type\": \"object\",\n            \"title\": \"The cloud configuration used for the project.\",\n            \"description\": \"Optional. Provides additional configuration for deploying to sovereign clouds such as Azure Government. The default cloud is AzureCloud.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"name\": {\n                    \"enum\": [\n                        \"AzureCloud\",\n                        \"AzureChinaCloud\",\n                        \"AzureUSGovernment\"\n                    ]\n                }\n            }\n        }\n    },\n    \"definitions\": {\n        \"hooks\": {\n            \"anyOf\": [\n                {\n                    \"$ref\": \"#/definitions/hook\"\n                },\n                {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"object\",\n                        \"$ref\": \"#/definitions/hook\"\n                    }\n                }\n            ]\n        },\n        \"hook\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"shell\": {\n                    \"type\": \"string\",\n                    \"title\": \"Type of shell to execute scripts\",\n                    \"description\": \"Optional. The type of shell to use for the hook. (Default: sh)\",\n                    \"enum\": [\n                        \"sh\",\n                        \"pwsh\"\n                    ],\n                    \"default\": \"sh\"\n                },\n                \"kind\": {\n                    \"type\": \"string\",\n                    \"title\": \"Executor kind for the hook script\",\n                    \"description\": \"Optional. Specifies the executor kind used to run the hook script. When omitted, the kind is auto-detected from the file extension of the 'run' path (e.g. .py → python, .ps1 → pwsh). Shell kinds (sh, pwsh) use the existing shell runner; other kinds use a language-specific executor that handles dependency installation and runtime management.\",\n                    \"enum\": [\n                        \"sh\",\n                        \"pwsh\",\n                        \"js\",\n                        \"ts\",\n                        \"python\",\n                        \"dotnet\"\n                    ]\n                },\n                \"dir\": {\n                    \"type\": \"string\",\n                    \"title\": \"Working directory for hook execution\",\n                    \"description\": \"Optional. Specifies the working directory for hook execution. Used as the project root for dependency installation (e.g. pip install from requirements.txt) and as the working directory when running the script. Relative paths are resolved from the project or service root. When omitted, defaults to the directory containing the script file.\"\n                },\n                \"run\": {\n                    \"type\": \"string\",\n                    \"title\": \"Required. The inline script or relative path of your scripts from the project or service path\",\n                    \"description\": \"When specifying an inline script you also must specify the `shell` to use. This is automatically inferred when using paths.\"\n                },\n                \"continueOnError\": {\n                    \"type\": \"boolean\",\n                    \"default\": false,\n                    \"title\": \"Whether or not a script error will halt the azd command\",\n                    \"description\": \"Optional. When set to true will continue to run the command even after a script error has occurred. (Default: false)\"\n                },\n                \"interactive\": {\n                    \"type\": \"boolean\",\n                    \"default\": false,\n                    \"title\": \"Whether the script will run in interactive mode\",\n                    \"description\": \"Optional. When set to true will bind the script to stdin, stdout & stderr of the running console. (Default: false)\"\n                },\n                \"windows\": {\n                    \"title\": \"The hook configuration used for Windows environments\",\n                    \"description\": \"When specified overrides the hook configuration when executed in Windows environments\",\n                    \"default\": null,\n                    \"$ref\": \"#/definitions/hook\"\n                },\n                \"posix\": {\n                    \"title\": \"The hook configuration used for POSIX (Linux & MacOS) environments\",\n                    \"description\": \"When specified overrides the hook configuration when executed in POSIX environments\",\n                    \"default\": null,\n                    \"$ref\": \"#/definitions/hook\"\n                },\n                \"secrets\": {\n                    \"type\": \"object\",\n                    \"additionalProperties\": {\n                        \"type\": \"string\"\n                    },\n                    \"title\": \"Optional. Map of azd environment variables to hook secrets.\",\n                    \"description\": \"If variable was set as a secret in the environment, the secret value will be passed to the hook.\",\n                    \"examples\": [\n                        {\n                            \"WITH_SECRET_VALUE\": \"ENV_VAR_WITH_SECRET\"\n                        }\n                    ]\n                },\n                \"config\": {\n                    \"type\": \"object\",\n                    \"title\": \"Executor-specific configuration\",\n                    \"description\": \"Optional configuration specific to the hook executor kind.\"\n                }\n            },\n            \"allOf\": [\n                {\n                    \"if\": {\n                        \"allOf\": [\n                            {\n                                \"required\": [\n                                    \"windows\"\n                                ]\n                            },\n                            {\n                                \"required\": [\n                                    \"posix\"\n                                ]\n                            }\n                        ]\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"run\": false,\n                            \"shell\": false,\n                            \"kind\": false,\n                            \"dir\": false,\n                            \"interactive\": false,\n                            \"continueOnError\": false,\n                            \"secrets\": false,\n                            \"config\": false\n                        }\n                    }\n                },\n                {\n                    \"if\": {\n                        \"anyOf\": [\n                            {\n                                \"required\": [\n                                    \"interactive\"\n                                ]\n                            },\n                            {\n                                \"required\": [\n                                    \"continueOnError\"\n                                ]\n                            },\n                            {\n                                \"required\": [\n                                    \"secrets\"\n                                ]\n                            },\n                            {\n                                \"required\": [\n                                    \"shell\"\n                                ]\n                            },\n                            {\n                                \"required\": [\n                                    \"kind\"\n                                ]\n                            },\n                            {\n                                \"required\": [\n                                    \"dir\"\n                                ]\n                            },\n                            {\n                                \"required\": [\n                                    \"config\"\n                                ]\n                            }\n                        ]\n                    },\n                    \"then\": {\n                        \"required\": [\n                            \"run\"\n                        ]\n                    }\n                },\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"kind\": { \"enum\": [\"js\", \"ts\"] }\n                        },\n                        \"required\": [\"kind\"]\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"config\": {\n                                \"$ref\": \"#/definitions/jsHookConfig\"\n                            }\n                        }\n                    }\n                },\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"kind\": { \"const\": \"python\" }\n                        },\n                        \"required\": [\"kind\"]\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"config\": {\n                                \"$ref\": \"#/definitions/pythonHookConfig\"\n                            }\n                        }\n                    }\n                },\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"kind\": { \"const\": \"dotnet\" }\n                        },\n                        \"required\": [\"kind\"]\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"config\": {\n                                \"$ref\": \"#/definitions/dotnetHookConfig\"\n                            }\n                        }\n                    }\n                },\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"kind\": { \"enum\": [\"sh\", \"pwsh\"] }\n                        },\n                        \"required\": [\"kind\"]\n                    },\n                    \"then\": {\n                        \"properties\": {\n                            \"config\": {\n                                \"$ref\": \"#/definitions/emptyHookConfig\"\n                            }\n                        }\n                    }\n                }\n            ]\n        },\n        \"docker\": {\n            \"type\": \"object\",\n            \"description\": \"This is only applicable for hosts that support containers\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"path\": {\n                    \"type\": \"string\",\n                    \"title\": \"The path to the Dockerfile\",\n                    \"description\": \"Path to the Dockerfile is relative to your service\",\n                    \"default\": \"./Dockerfile\"\n                },\n                \"context\": {\n                    \"type\": \"string\",\n                    \"title\": \"The docker build context\",\n                    \"description\": \"When specified overrides the default context\",\n                    \"default\": \".\"\n                },\n                \"platform\": {\n                    \"type\": \"string\",\n                    \"title\": \"The platform target\",\n                    \"default\": \"amd64\"\n                },\n                \"registry\": {\n                    \"type\": \"string\",\n                    \"title\": \"Optional. The container registry to push the image to.\",\n                    \"description\": \"If omitted, will default to value of AZURE_CONTAINER_REGISTRY_ENDPOINT environment variable. Supports environment variable substitution.\"\n                },\n                \"image\": {\n                    \"type\": \"string\",\n                    \"title\": \"Optional. The name that will be applied to the built container image.\",\n                    \"description\": \"If omitted, will default to the '{appName}/{serviceName}-{environmentName}'. Supports environment variable substitution.\"\n                },\n                \"tag\": {\n                    \"type\": \"string\",\n                    \"title\": \"The tag that will be applied to the built container image.\",\n                    \"description\": \"If omitted, will default to 'azd-deploy-{unix time (seconds)}'. Supports environment variable substitution. For example, to generate unique tags for a given release: myapp/myimage:${DOCKER_IMAGE_TAG}\"\n                },\n                \"buildArgs\": {\n                    \"type\": \"array\",\n                    \"title\": \"Optional. Build arguments to pass to the docker build command\",\n                    \"description\": \"Build arguments to pass to the docker build command.\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    }\n                },\n                \"network\": {\n                    \"type\": \"string\",\n                    \"title\": \"Optional. The networking mode for RUN instructions during docker build\",\n                    \"description\": \"Sets the networking mode for RUN instructions during build. Passed as --network to docker build. For example, use 'host' to allow the build container to access the host network.\"\n                },\n                \"remoteBuild\": {\n                    \"type\": \"boolean\",\n                    \"title\": \"Optional. Whether to build the image remotely\",\n                    \"description\": \"If set to true, the image will be built remotely using the Azure Container Registry remote build feature. If the remote build fails, azd automatically falls back to building locally using Docker or Podman if available. If set to false, the image will be built locally.\"\n                }\n            }\n        },\n        \"aksOptions\": {\n            \"type\": \"object\",\n            \"title\": \"Optional. The Azure Kubernetes Service (AKS) configuration options\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"deploymentPath\": {\n                    \"type\": \"string\",\n                    \"title\": \"Optional. The relative path from the service path to the k8s deployment manifests. (Default: manifests)\",\n                    \"description\": \"When set it will override the default deployment path location for k8s deployment manifests.\",\n                    \"default\": \"manifests\"\n                },\n                \"namespace\": {\n                    \"type\": \"string\",\n                    \"title\": \"Optional. The k8s namespace of the deployed resources. (Default: Project name)\",\n                    \"description\": \"When specified a new k8s namespace will be created if it does not already exist\"\n                },\n                \"deployment\": {\n                    \"type\": \"object\",\n                    \"title\": \"Optional. The k8s deployment configuration\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                        \"name\": {\n                            \"type\": \"string\",\n                            \"title\": \"Optional. The name of the k8s deployment resource to use during deployment. (Default: Service name)\",\n                            \"description\": \"Used during deployment to ensure if the k8s deployment rollout has been completed. If not set will search for a deployment resource in the same namespace that contains the service name.\"\n                        }\n                    }\n                },\n                \"service\": {\n                    \"type\": \"object\",\n                    \"title\": \"Optional. The k8s service configuration\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                        \"name\": {\n                            \"type\": \"string\",\n                            \"title\": \"Optional. The name of the k8s service resource to use as the default service endpoint. (Default: Service name)\",\n                            \"description\": \"Used when determining endpoints for the default service resource. If not set will search for a deployment resource in the same namespace that contains the service name.\"\n                        }\n                    }\n                },\n                \"ingress\": {\n                    \"type\": \"object\",\n                    \"title\": \"Optional. The k8s ingress configuration\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                        \"name\": {\n                            \"type\": \"string\",\n                            \"title\": \"Optional. The name of the k8s ingress resource to use as the default service endpoint. (Default: Service name)\",\n                            \"description\": \"Used when determining endpoints for the default ingress resource. If not set will search for a deployment resource in the same namespace that contains the service name.\"\n                        },\n                        \"relativePath\": {\n                            \"type\": \"string\",\n                            \"title\": \"Optional. The relative path to the service from the root of your ingress controller.\",\n                            \"description\": \"When set will be appended to the root of your ingress resource path.\"\n                        }\n                    }\n                },\n                \"helm\": {\n                    \"type\": \"object\",\n                    \"title\": \"Optional. The helm configuration\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                        \"repositories\": {\n                            \"type\": \"array\",\n                            \"title\": \"Optional. The helm repositories to add\",\n                            \"description\": \"When set will add the helm repositories to the helm client.\",\n                            \"minItems\": 1,\n                            \"items\": {\n                                \"type\": \"object\",\n                                \"additionalProperties\": false,\n                                \"required\": [\n                                    \"name\",\n                                    \"url\"\n                                ],\n                                \"properties\": {\n                                    \"name\": {\n                                        \"type\": \"string\",\n                                        \"title\": \"The name of the helm repository\",\n                                        \"description\": \"The name of the helm repository to add.\"\n                                    },\n                                    \"url\": {\n                                        \"type\": \"string\",\n                                        \"title\": \"The url of the helm repository\",\n                                        \"description\": \"The url of the helm repository to add.\"\n                                    }\n                                }\n                            }\n                        },\n                        \"releases\": {\n                            \"type\": \"array\",\n                            \"title\": \"Optional. The helm releases to install\",\n                            \"description\": \"When set will install the helm releases to the k8s cluster.\",\n                            \"minItems\": 1,\n                            \"items\": {\n                                \"type\": \"object\",\n                                \"additionalProperties\": false,\n                                \"required\": [\n                                    \"name\",\n                                    \"chart\"\n                                ],\n                                \"properties\": {\n                                    \"name\": {\n                                        \"type\": \"string\",\n                                        \"title\": \"The name of the helm release\",\n                                        \"description\": \"The name of the helm release to install.\"\n                                    },\n                                    \"chart\": {\n                                        \"type\": \"string\",\n                                        \"title\": \"The name of the helm chart\",\n                                        \"description\": \"The name of the helm chart to install.\"\n                                    },\n                                    \"version\": {\n                                        \"type\": \"string\",\n                                        \"title\": \"The version of the helm chart\",\n                                        \"description\": \"The version of the helm chart to install.\"\n                                    },\n                                    \"namespace\": {\n                                        \"type\": \"string\",\n                                        \"title\": \"Optional. The k8s namespace to install the helm chart\",\n                                        \"description\": \"When set will install the helm chart to the specified namespace. Defaults to the service namespace.\"\n                                    },\n                                    \"values\": {\n                                        \"type\": \"string\",\n                                        \"title\": \"Optional. Relative path from service to a values.yaml to pass to the helm chart\",\n                                        \"description\": \"When set will pass the values to the helm chart.\"\n                                    }\n                                }\n                            }\n                        }\n                    }\n                },\n                \"kustomize\": {\n                    \"type\": \"object\",\n                    \"title\": \"Optional. The kustomize configuration\",\n                    \"additionalProperties\": false,\n                    \"properties\": {\n                        \"dir\": {\n                            \"type\": \"string\",\n                            \"title\": \"Optional. The relative path to the kustomize directory.\",\n                            \"description\": \"When set will use the kustomize directory to deploy to the k8s cluster. Supports environment variable substitution.\"\n                        },\n                        \"edits\": {\n                            \"type\": \"array\",\n                            \"title\": \"Optional. The kustomize edits to apply before deployment.\",\n                            \"description\": \"When set will apply the edits to the kustomize directory before deployment. Supports environment variable substitution.\",\n                            \"items\": {\n                                \"type\": \"string\"\n                            }\n                        },\n                        \"env\": {\n                            \"type\": \"object\",\n                            \"title\": \"Optional. The environment key/value pairs used to generate a .env file.\",\n                            \"description\": \"When set will generate a .env file in the kustomize directory. Values support environment variable substitution.\",\n                            \"additionalProperties\": {\n                                \"type\": [\n                                    \"string\",\n                                    \"boolean\",\n                                    \"number\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        \"azureBlobStorageConfig\": {\n            \"type\": \"object\",\n            \"title\": \"The Azure Blob Storage remote state backend configuration.\",\n            \"description\": \"Optional. Provides additional configuration for remote state management such as Azure Blob Storage.\",\n            \"additionalProperties\": false,\n            \"required\": [\n                \"accountName\"\n            ],\n            \"properties\": {\n                \"accountName\": {\n                    \"type\": \"string\",\n                    \"title\": \"The Azure Storage account name.\",\n                    \"description\": \"Required. The Azure Storage account name.\"\n                },\n                \"containerName\": {\n                    \"type\": \"string\",\n                    \"title\": \"The Azure Storage container name.\",\n                    \"description\": \"Optional. The Azure Storage container name. Defaults to project name if not specified.\"\n                },\n                \"endpoint\": {\n                    \"type\": \"string\",\n                    \"title\": \"The Azure Storage endpoint.\",\n                    \"description\": \"Optional. The Azure Storage endpoint. (Default: blob.core.windows.net)\"\n                }\n            }\n        },\n        \"azureDevCenterConfig\": {\n            \"type\": \"object\",\n            \"title\": \"The dev center configuration used for the project.\",\n            \"description\": \"Optional. Provides additional project configuration for Azure Dev Center integration.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"title\": \"The name of the Azure Dev Center\",\n                    \"description\": \"Optional. Used as the default dev center for this project.\"\n                },\n                \"project\": {\n                    \"type\": \"string\",\n                    \"title\": \"The name of the Azure Dev Center project.\",\n                    \"description\": \"Optional. Used as the default dev center project for this project.\"\n                },\n                \"catalog\": {\n                    \"type\": \"string\",\n                    \"title\": \"The name of the Azure Dev Center catalog.\",\n                    \"description\": \"Optional. Used as the default dev center catalog for this project.\"\n                },\n                \"environmentDefinition\": {\n                    \"type\": \"string\",\n                    \"title\": \"The name of the Dev Center catalog environment definition.\",\n                    \"description\": \"Optional. Used as the default dev center environment definition for this project.\"\n                },\n                \"environmentType\": {\n                    \"type\": \"string\",\n                    \"title\": \"The Dev Center project environment type used for the deployment environment.\",\n                    \"description\": \"Optional. Used as the default environment type for this project.\"\n                }\n            }\n        },\n        \"workflow\": {\n            \"anyOf\": [\n                {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\n                        \"steps\"\n                    ],\n                    \"properties\": {\n                        \"steps\": {\n                            \"type\": \"array\",\n                            \"title\": \"The steps to execute in the workflow\",\n                            \"description\": \"The steps to execute in the workflow. (Example: provision, package, deploy)\",\n                            \"minItems\": 1,\n                            \"items\": {\n                                \"type\": \"object\",\n                                \"$ref\": \"#/definitions/workflowStep\"\n                            }\n                        }\n                    }\n                },\n                {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"object\",\n                        \"$ref\": \"#/definitions/workflowStep\"\n                    }\n                }\n            ]\n        },\n        \"workflowStep\": {\n            \"properties\": {\n                \"azd\": {\n                    \"title\": \"The azd command command configuration\",\n                    \"description\": \"The azd command configuration to execute. (Example: up)\",\n                    \"$ref\": \"#/definitions/azdCommand\"\n                }\n            }\n        },\n        \"azdCommand\": {\n            \"anyOf\": [\n                {\n                    \"type\": \"string\",\n                    \"title\": \"The azd command to execute\",\n                    \"description\": \"The name and args of the azd command to execute. (Example: deploy --all)\"\n                },\n                {\n                    \"type\": \"object\",\n                    \"additionalProperties\": false,\n                    \"required\": [\n                        \"args\"\n                    ],\n                    \"properties\": {\n                        \"args\": {\n                            \"type\": \"array\",\n                            \"title\": \"The arguments or flags to pass to the azd command\",\n                            \"description\": \"The arguments to pass to the azd command. (Example: --all)\",\n                            \"minItems\": 1\n                        }\n                    }\n                }\n            ]\n        },\n        \"aiComponentConfig\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"name\": {\n                    \"type\": \"string\",\n                    \"title\": \"Name of the AI component.\",\n                    \"description\": \"Optional. When omitted azd will generate a name based on the component type and the service name. Supports environment variable substitution.\"\n                },\n                \"path\": {\n                    \"type\": \"string\",\n                    \"title\": \"Path to the AI component configuration file or path.\",\n                    \"description\": \"Required. The path to the AI component configuration file or path to the AI component source code.\"\n                },\n                \"overrides\": {\n                    \"type\": \"object\",\n                    \"title\": \"A map of key value pairs used to override the AI component configuration.\",\n                    \"description\": \"Optional. Supports environment variable substitution.\",\n                    \"additionalProperties\": {\n                        \"type\": \"string\"\n                    }\n                }\n            },\n            \"required\": [\n                \"path\"\n            ]\n        },\n        \"aiDeploymentConfig\": {\n            \"allOf\": [\n                {\n                    \"$ref\": \"#/definitions/aiComponentConfig\"\n                },\n                {\n                    \"type\": \"object\",\n                    \"properties\": {\n                        \"environment\": {\n                            \"type\": \"object\",\n                            \"title\": \"A map of key/value pairs to set as environment variables for the deployment.\",\n                            \"description\": \"Optional. Values support OS & azd environment variable substitution.\",\n                            \"additionalProperties\": {\n                                \"type\": \"string\"\n                            }\n                        }\n                    }\n                }\n            ]\n        },\n        \"aiEndpointConfig\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"workspace\": {\n                    \"type\": \"string\",\n                    \"title\": \"The name of the AI Studio project workspace.\",\n                    \"description\": \"Optional. When omitted azd will use the value specified in the 'AZUREAI_PROJECT_NAME' environment variable. Supports environment variable substitution.\"\n                },\n                \"flow\": {\n                    \"$ref\": \"#/definitions/aiComponentConfig\",\n                    \"title\": \"The Azure AI Studio Prompt Flow configuration.\",\n                    \"description\": \"Optional. When omitted a prompt flow will be not created.\"\n                },\n                \"environment\": {\n                    \"$ref\": \"#/definitions/aiComponentConfig\",\n                    \"title\": \"The Azure AI Studio custom environment configuration.\",\n                    \"description\": \"Optional. When omitted a custom environment will not be created.\"\n                },\n                \"model\": {\n                    \"$ref\": \"#/definitions/aiComponentConfig\",\n                    \"title\": \"The Azure AI Studio model configuration.\",\n                    \"description\": \"Optional. When omitted a model will not be created.\"\n                },\n                \"deployment\": {\n                    \"$ref\": \"#/definitions/aiDeploymentConfig\",\n                    \"title\": \"The Azure AI Studio online endpoint deployment configuration.\",\n                    \"description\": \"Required. A new online endpoint deployment will be created and traffic will automatically to shifted to the new deployment upon successful completion.\"\n                }\n            },\n            \"required\": [\n                \"deployment\"\n            ]\n        },\n        \"appServiceResource\": {\n            \"type\": \"object\",\n            \"description\": \"An Azure App Service web app.\",\n            \"additionalProperties\": false,\n            \"required\": [\n                \"port\",\n                \"runtime\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"host.appservice\"\n                },\n                \"uses\": {\n                    \"type\": \"array\",\n                    \"title\": \"Other resources that this resource uses\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"uniqueItems\": true\n                },\n                \"port\": {\n                    \"type\": \"integer\",\n                    \"title\": \"Port that the web app listens on\",\n                    \"description\": \"Optional. The port that the web app listens on. (Default: 80)\"\n                },\n                \"env\": {\n                    \"type\": \"array\",\n                    \"title\": \"Environment variables to set for the web app\",\n                    \"items\": {\n                        \"type\": \"object\",\n                        \"required\": [\n                            \"name\"\n                        ],\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                            \"name\": {\n                                \"type\": \"string\",\n                                \"title\": \"Name of the environment variable\"\n                            },\n                            \"value\": {\n                                \"type\": \"string\",\n                                \"title\": \"Value of the environment variable. Supports environment variable substitution.\"\n                            },\n                            \"secret\": {\n                                \"type\": \"string\",\n                                \"title\": \"Secret value of the environment variable. Supports environment variable substitution.\"\n                            }\n                        }\n                    }\n                },\n                \"runtime\": {\n                    \"type\": \"object\",\n                    \"title\": \"Runtime stack configuration\",\n                    \"description\": \"Required. The language runtime configuration for the App Service web app.\",\n                    \"required\": [\n                        \"stack\",\n                        \"version\"\n                    ],\n                    \"properties\": {\n                        \"stack\": {\n                            \"type\": \"string\",\n                            \"title\": \"Language runtime stack\",\n                            \"description\": \"Required. The language runtime stack.\",\n                            \"enum\": [\n                                \"node\",\n                                \"python\"\n                            ]\n                        },\n                        \"version\": {\n                            \"type\": \"string\",\n                            \"title\": \"Runtime stack version\",\n                            \"description\": \"Required. The language runtime version. Format varies by stack. (Example: '22-lts' for Node, '3.13' for Python)\"\n                        }\n                    }\n                },\n                \"startupCommand\": {\n                    \"type\": \"string\",\n                    \"title\": \"Startup command\",\n                    \"description\": \"Optional. Startup command that will be run as part of web app startup.\"\n                }\n            }\n        },\n        \"containerAppResource\": {\n            \"type\": \"object\",\n            \"description\": \"A Docker-based container app.\",\n            \"additionalProperties\": false,\n            \"required\": [\n                \"port\"\n            ],\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"host.containerapp\"\n                },\n                \"uses\": {\n                    \"type\": \"array\",\n                    \"title\": \"Other resources that this resource uses\",\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"uniqueItems\": true\n                },\n                \"port\": {\n                    \"type\": \"integer\",\n                    \"title\": \"Port that the container app listens on\",\n                    \"description\": \"Optional. The port that the container app listens on. (Default: 80)\"\n                },\n                \"env\": {\n                    \"type\": \"array\",\n                    \"title\": \"Environment variables to set for the container app\",\n                    \"items\": {\n                        \"type\": \"object\",\n                        \"required\": [\n                            \"name\"\n                        ],\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                            \"name\": {\n                                \"type\": \"string\",\n                                \"title\": \"Name of the environment variable\"\n                            },\n                            \"value\": {\n                                \"type\": \"string\",\n                                \"title\": \"Value of the environment variable. Supports environment variable substitution.\"\n                            },\n                            \"secret\": {\n                                \"type\": \"string\",\n                                \"title\": \"Secret value of the environment variable. Supports environment variable substitution.\"\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        \"aiModelResource\": {\n            \"type\": \"object\",\n            \"description\": \"A deployed, ready-to-use AI model.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"ai.openai.model\"\n                },\n                \"existing\": {\n                    \"type\": \"boolean\",\n                    \"title\": \"An existing resource for referencing purposes\",\n                    \"description\": \"Optional. When set to true, this resource will not be created and instead be used for referencing purposes. (Default: false)\",\n                    \"default\": false\n                },\n                \"model\": {\n                    \"type\": \"object\",\n                    \"description\": \"The underlying AI model.\",\n                    \"additionalProperties\": false,\n                    \"required\": [\n                        \"name\",\n                        \"version\"\n                    ],\n                    \"properties\": {\n                        \"name\": {\n                            \"type\": \"string\",\n                            \"title\": \"The name of the AI model.\",\n                            \"description\": \"Required. The name of the AI model.\"\n                        },\n                        \"version\": {\n                            \"type\": \"string\",\n                            \"title\": \"The version of the AI model.\",\n                            \"description\": \"Required. The version of the AI model.\"\n                        }\n                    }\n                }\n            },\n            \"allOf\": [\n                {\n                    \"if\": {\n                        \"properties\": {\n                            \"existing\": {\n                                \"const\": false\n                            }\n                        }\n                    },\n                    \"then\": {\n                        \"required\": [\n                            \"model\"\n                        ]\n                    }\n                }\n            ]\n        },\n        \"aiProjectResource\": {\n            \"type\": \"object\",\n            \"description\": \"A Microsoft Foundry project with models.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"ai.project\"\n                },\n                \"existing\": {\n                    \"type\": \"boolean\",\n                    \"title\": \"An existing resource for referencing purposes\",\n                    \"description\": \"Optional. When set to true, this resource will not be created and instead be used for referencing purposes. (Default: false)\",\n                    \"default\": false\n                },\n                \"models\": {\n                    \"type\": \"array\",\n                    \"title\": \"AI models to deploy\",\n                    \"description\": \"Optional. The AI models to be deployed as part of the AI project.\",\n                    \"minItems\": 1,\n                    \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"required\": [\"name\", \"version\", \"format\", \"sku\"],\n                        \"properties\": {\n                            \"name\": {\n                                \"type\": \"string\",\n                                \"title\": \"The name of the AI model.\",\n                                \"description\": \"Required. The name of the AI model.\"\n                            },\n                            \"version\": {\n                                \"type\": \"string\",\n                                \"title\": \"The version of the AI model.\",\n                                \"description\": \"Required. The version of the AI model.\"\n                            },\n                            \"format\": {\n                                \"type\": \"string\",\n                                \"title\": \"The format of the AI model.\",\n                                \"description\": \"Required. The format of the AI model. (Example: Microsoft, OpenAI)\"\n                            },\n                            \"sku\": {\n                                \"type\": \"object\",\n                                \"title\": \"The SKU configuration for the AI model.\",\n                                \"description\": \"Required. The SKU details for the AI model.\",\n                                \"additionalProperties\": false,\n                                \"required\": [\"name\", \"usageName\", \"capacity\"],\n                                \"properties\": {\n                                    \"name\": {\n                                        \"type\": \"string\",\n                                        \"title\": \"The name of the SKU.\",\n                                        \"description\": \"Required. The name of the SKU. (Example: GlobalStandard)\"\n                                    },\n                                    \"usageName\": {\n                                        \"type\": \"string\",\n                                        \"title\": \"The usage name of the SKU.\",\n                                        \"description\": \"Required. The usage name of the SKU for billing purposes. (Example: AIServices.GlobalStandard.MaaS, OpenAI.GlobalStandard.gpt-4o-mini)\"\n                                    },\n                                    \"capacity\": {\n                                        \"type\": \"integer\",\n                                        \"title\": \"The capacity of the SKU.\",\n                                        \"description\": \"Required. The capacity of the SKU.\"\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        \"aiSearchResource\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"ai.search\"\n                },\n                \"existing\": {\n                    \"type\": \"boolean\",\n                    \"title\": \"An existing resource for referencing purposes\",\n                    \"description\": \"Optional. When set to true, this resource will not be created and instead be used for referencing purposes. (Default: false)\",\n                    \"default\": false\n                }\n            }\n        },\n        \"genericDbResource\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"title\": \"Type of resource\",\n                    \"description\": \"The type of resource to be created. (Example: db.postgres)\",\n                    \"enum\": [\n                        \"db.postgres\",\n                        \"db.redis\",\n                        \"db.mysql\",\n                        \"db.mongo\"\n                    ]\n                }\n            }\n        },\n        \"cosmosDbResource\": {\n            \"type\": \"object\",\n            \"description\": \"A deployed, ready-to-use Azure Cosmos DB for NoSQL database.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"db.cosmos\"\n                },\n                \"containers\": {\n                    \"type\": \"array\",\n                    \"title\": \"Containers\",\n                    \"description\": \"Containers to be created to store data. Each container stores a collection of items.\",\n                    \"items\": {\n                        \"type\": \"object\",\n                        \"additionalProperties\": false,\n                        \"properties\": {\n                            \"name\": {\n                                \"type\": \"string\",\n                                \"title\": \"Container name.\",\n                                \"description\": \"Required. The name of the container.\"\n                            },\n                            \"partitionKeys\": {\n                                \"type\": \"array\",\n                                \"title\": \"Partition keys.\",\n                                \"description\": \"Required. The partition key(s) used to distribute data across partitions. The ordering of keys matters. By default, a single partition key '/id' is naturally a great choice for most applications.\",\n                                \"minLength\": 1,\n                                \"maxLength\": 3,\n                                \"items\": {\n                                    \"type\": \"string\"\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        \"eventHubsResource\": {\n            \"type\": \"object\",\n            \"description\": \"An Azure Event Hubs namespace.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"messaging.eventhubs\"\n                },\n                \"existing\": {\n                    \"type\": \"boolean\",\n                    \"title\": \"An existing resource for referencing purposes\",\n                    \"description\": \"Optional. When set to true, this resource will not be created and instead be used for referencing purposes. (Default: false)\",\n                    \"default\": false\n                },\n                \"hubs\": {\n                    \"type\": \"array\",\n                    \"title\": \"Hubs to create in the Event Hubs namespace\",\n                    \"additionalProperties\": false,\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"uniqueItems\": true\n                }\n            }\n        },\n        \"serviceBusResource\": {\n            \"type\": \"object\",\n            \"description\": \"An Azure Service Bus namespace.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"messaging.servicebus\"\n                },\n                \"existing\": {\n                    \"type\": \"boolean\",\n                    \"title\": \"An existing resource for referencing purposes\",\n                    \"description\": \"Optional. When set to true, this resource will not be created and instead be used for referencing purposes. (Default: false)\",\n                    \"default\": false\n                },\n                \"queues\": {\n                    \"type\": \"array\",\n                    \"title\": \"Queues to create in the Service Bus namespace\",\n                    \"additionalProperties\": false,\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"uniqueItems\": true\n                },\n                \"topics\": {\n                    \"type\": \"array\",\n                    \"title\": \"Topics to create in the Service Bus namespace\",\n                    \"additionalProperties\": false,\n                    \"items\": {\n                        \"type\": \"string\"\n                    },\n                    \"uniqueItems\": true\n                }\n            }\n        },\n        \"storageAccountResource\": {\n            \"type\": \"object\",\n            \"description\": \"A deployed, ready-to-use Azure Storage Account.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"storage\"\n                },\n                \"existing\": {\n                    \"type\": \"boolean\",\n                    \"title\": \"An existing resource for referencing purposes\",\n                    \"description\": \"Optional. When set to true, this resource will not be created and instead be used for referencing purposes. (Default: false)\",\n                    \"default\": false\n                },\n                \"containers\": {\n                    \"type\": \"array\",\n                    \"title\": \"Azure Storage Account container names.\",\n                    \"description\": \"The container names of Azure Storage Account.\",\n                    \"items\": {\n                        \"type\": \"string\",\n                        \"title\": \"Azure Storage Account container name\",\n                        \"description\": \"The container name of Azure Storage Account.\"\n                    }\n                }\n            }\n        },\n        \"keyVaultResource\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"type\": {\n                    \"type\": \"string\",\n                    \"const\": \"keyvault\"\n                },\n                \"existing\": {\n                    \"type\": \"boolean\",\n                    \"title\": \"An existing resource for referencing purposes\",\n                    \"description\": \"Optional. When set to true, this resource will not be created and instead be used for referencing purposes. (Default: false)\",\n                    \"default\": false\n                }\n            }\n        },\n        \"jsHookConfig\": {\n            \"type\": \"object\",\n            \"title\": \"JavaScript/TypeScript hook configuration\",\n            \"description\": \"Configuration options for JS and TS hook executors.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"packageManager\": {\n                    \"type\": \"string\",\n                    \"title\": \"Package manager\",\n                    \"description\": \"The package manager to use for dependency installation. Overrides auto-detection from lock files.\",\n                    \"enum\": [\"npm\", \"pnpm\", \"yarn\"]\n                }\n            }\n        },\n        \"pythonHookConfig\": {\n            \"type\": \"object\",\n            \"title\": \"Python hook configuration\",\n            \"description\": \"Configuration options for the Python hook executor.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"virtualEnvName\": {\n                    \"type\": \"string\",\n                    \"title\": \"Virtual environment name\",\n                    \"description\": \"The directory name for the Python virtual environment. Defaults to auto-detection (.venv, venv) or {baseName}_env.\"\n                }\n            }\n        },\n        \"dotnetHookConfig\": {\n            \"type\": \"object\",\n            \"title\": \".NET hook configuration\",\n            \"description\": \"Configuration options for the .NET hook executor.\",\n            \"additionalProperties\": false,\n            \"properties\": {\n                \"configuration\": {\n                    \"type\": \"string\",\n                    \"title\": \"Build configuration\",\n                    \"description\": \"The MSBuild configuration for building the hook script (e.g., Debug, Release).\"\n                },\n                \"framework\": {\n                    \"type\": \"string\",\n                    \"title\": \"Target framework\",\n                    \"description\": \"The target framework moniker for building and running the hook script (e.g., net8.0, net10.0).\"\n                }\n            }\n        },\n        \"emptyHookConfig\": {\n            \"type\": \"object\",\n            \"title\": \"Shell hook configuration\",\n            \"description\": \"Shell executors (sh, pwsh) do not currently support config properties.\",\n            \"additionalProperties\": false\n        }\n    }\n}\n"
  },
  {
    "path": "articles/azure-developer-cli/sovereign-clouds.md",
    "content": "---\ntitle: Use Azure Developer CLI in sovereign clouds\ndescription: Configure the Azure Developer CLI (azd) for use in sovereign clouds\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 07/22/2025\nms.topic: how-to\nms.service: azure-dev-cli\nms.custom: devx-track-terraform\n---\n\n# Use Azure Developer CLI in sovereign clouds\n\nThis guide explains how to configure the Azure Developer CLI to provision resources and deploy applications in different clouds.\n\nThe Azure Developer CLI supports the following clouds:\n\n* Azure Public (`AzureCloud`) default\n* Azure operated by 21Vianet Cloud (`AzureChinaCloud`)\n* Azure US Government (`AzureUSGovernment`)\n\nThe Azure Public cloud is the default and is used if no cloud is specified.\n\n## Authentication\n\nWhen switching between clouds, run `azd auth login` to authenticate with the set cloud.\n\nThe following example sets a sovereign cloud and runs `azd auth login` to authenticate with that cloud:\n\n```bash\nazd config set cloud.name AzureUSGovernment\nazd auth login\n```\n\n## Cloud configurations\n\nClouds can be configured at the user, project, or environment level. The order of configuration precedence is:\n\n1. **Environment configuration** is selected first\n1. If no cloud is configured in the environment, the **project configuration** (azure.yaml) is used\n1. If no cloud is set in the project configuration, the **user configuration** (`azd config set`) is used\n1. If no cloud is set in the user configuration, azd uses the public `AzureCloud`\n\n### Configure clouds with user settings (azd config set)\n\nSet the cloud for all `azd` operations using `azd config`\n\n```bash\nazd config set cloud.name AzureCloud\n```\n\n```bash\nazd config set cloud.name AzureChinaCloud\n```\n\n```bash\nazd config set cloud.name AzureUSGovernment\n```\n\n### Configure clouds in the project's azure.yaml file\n\nUse the `cloud` object to set the name of the cloud in the project's azure.yaml file.\n\n```yaml\nname: project-name\ncloud:\n  name: AzureCloud\n```\n\n```yaml\nname: project-name\ncloud:\n  name: AzureChinaCloud\n```\n\n```yaml\nname: project-name\ncloud:\n  name: AzureUSGovernment\n```\n\n### Configure clouds in an environment's config.json file\n\nConfigure cloud for specific environments by updating the environment configuration file in `.azure/<environment-name>/config.json`. This enables, for example, deployment in different clouds for different environments.\n\n```json\n{\n    \"cloud\": {\n        \"name\": \"AzureCloud\"\n    }\n}\n```\n\n```json\n{\n    \"cloud\": {\n        \"name\": \"AzureChinaCloud\"\n    }\n}\n```\n\n```json\n{\n    \"cloud\": {\n        \"name\": \"AzureUSGovernment\"\n    }\n}\n```\n\n## Supported commands and platforms\n\nSupported commands include\n\n* auth\n* config\n* deploy\n* down\n* env\n* provision\n* up\n* monitor\n* show\n\n`azd pipeline` isn't supported in Sovereign Clouds.\n\n`devcenter` platform isn't supported in Sovereign Clouds.\n\n## Deploying with Terraform\n\nWhen you deploy to a sovereign cloud using `azd` and Terraform, the `az` CLI must also be configured to use the desired cloud. See Terraform's [Authenticating using the Azure CLI](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/azure_cli) documentation.\n\nSet the environment variable `ARM_ENVIRONMENT` to the desired environment. Common values include:\n\n* `public` (default)\n* `usgovernment`\n* `china`\n\nSelect the appropriate cloud using the `az` CLI:\n\n```bash\naz cloud set --name AzureCloud\n```\n\n```bash\naz cloud set --name AzureChinaCloud\n```\n\n```bash\naz cloud set --name AzureUSGovernment\n```\n"
  },
  {
    "path": "articles/azure-developer-cli/start-with-app-code.md",
    "content": "---\ntitle: Add Azure Developer CLI support to your app using code in your app directory\ndescription: How to add Azure Developer CLI support to your app using code in your app directory\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, devx-track-bicep, build-2023\n---\n\n# Add Azure Developer CLI support to your app using code in your app directory\n\nThe Azure Developer CLI (`azd`) provides two different workflows to initialize a template to use with your app, which include:\n\n- **Use code in the current directory**: This approach analyzes your app and autogenerates supported infrastructure and configuration resources.\n- **Select a template**: This approach allows you to integrate an existing template with your app, or use an existing template as a starting point for a new app.\n\nBoth of these approaches are explored in the [Create Azure Developer CLI templates overview](make-azd-compatible.md) doc.\n\nIn this article, you learn how to add support for the Azure Developer CLI (`azd`) to your app through the **Use code in the current directory** approach. Visit the [Add `azd` support to your app using an existing template](start-with-existing-template.md) doc for more information on the alternative approach. You can also visit the [Training - build and deploy `azd` templates](/training/paths/azure-developer-cli) for more information on building `azd` templates.\n\n## Use code in the current directory\n\n1. You can follow the steps ahead using your own project. However, if you'd prefer to follow along using a sample application, clone the following starter repo to an empty directory on your computer:\n\n    ```bash\n    git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart\n    ```\n\n1. Open a terminal to the root directory of the project.\n\n1. Run the `azd init` command to initialize the template.\n\n    ```bash\n    azd init\n    ```\n\n1. When prompted, select the option to **Use code in the current directory**. `azd` analyzes the project and provides a summary of the detected services and recommended Azure hosting resources.\n\n1. Select **Confirm and continue initializing my app**. `azd` generates the following assets in the project root directory:\n\n    * An `azure.yaml` file with appropriate service definitions.\n    * An `infra` folder with infrastructure-as-code files to provision and deploy the project to Azure.\n    * A `.azure` folder with environment variables set in a `.env` file.\n\n    More details on this detection and generation process are provided later in the article.\n\n1. The generated files work as-is for the provided sample app and may for your own apps as well. If necessary, the generated files can be modified to fit your needs. For example, you may need to further modify the infrastructure-as-code files in the `infra` folder if your app relies on Azure resources beyond those that were identified by `azd`.\n\n1. Run the `azd up` command to provision and deploy your app to Azure.\n\n    ```bash\n    azd up\n    ```\n\n1. When prompted, select the desired subscription and location to begin the provisioning and deployment process.\n\n1. When the process completes, click the link in the `azd` output to open the app in the browser.\n\n## Explore the initialization steps\n\nWhen you select the **Use code in the current directory** workflow, the `azd init` command analyzes your project and autogenerates code based on what it discovers. The sections below explain the details of how this process works and which technologies are currently supported.\n\n### Detection\n\nThe `azd init` command detects project files for supported languages located in your project directory and subdirectories. `azd` also scans package dependencies to gather information about the web frameworks or databases your app uses. If needed, you can manually add or edit the detected components as presented in the confirmation summary prompt.\n\nThe current detection logic is as follows:\n\n- Supported languages:\n    -  Python\n    - JavaScript/TypeScript\n    - .NET\n    - Java\n- Supported databases:\n    - MongoDB\n    - PostgreSQL\n- For Python and JavaScript/TypeScript, web frameworks and databases are automatically detected.\n- When a JavaScript/TypeScript project uses a front-end (or client-side) web framework, it is classified as a front-end service. If your service uses a front-end web framework that is currently undetected, you may select JQuery to provide equivalent front-end service classification and behavior.\n\n### Generation\n\nAfter you confirm the detected components, `azd init` generates the infrastructure-as-code files needed to deploy your application to Azure.\n\nThe generation logic is as follows:\n\n- Supported hosts:\n    - Azure Container Apps.\n- For databases, the supported mapping between database technology and service used:\n    - MongoDB: Azure CosmosDB API for MongoDB\n    - PostgreSQL: Azure Database for PostgreSQL flexible server\n    - Redis: Azure Container Apps Redis add-on\n- Services using databases will have environment variables that provide connection to the database pre-configured by default.\n- When both front-end and back-end services are detected, CORS configuration on the Azure host for back-end services will be updated to allow the default hosting domain of front-end services. This can be modified or removed as necessary in the Infrastructure as Code configuration files.\n\n[!INCLUDE [add-dev-container-support](includes/add-dev-container-support.md)]\n\n[!INCLUDE [add-cicd-support](includes/add-cicd-support.md)]\n"
  },
  {
    "path": "articles/azure-developer-cli/start-with-existing-template.md",
    "content": "---\ntitle: Add Azure Developer CLI support to your app using an existing template\ndescription: How to add Azure Developer CLI support to your app using an existing template\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, devx-track-bicep, build-2023\n---\n\n# Add Azure Developer CLI support to your app using an existing template\n\nThe Azure Developer CLI (`azd`) provides two different workflows to initialize a template to use with your app, which include:\n\n- **Use code in the current directory**: This approach analyzes your app and autogenerates supported infrastructure and configuration resources.\n- **Select a template**: This approach allows you to integrate an existing template with your app, or use an existing template as a starting point for a new app.\n\nBoth of these approaches are explored in the [Create Azure Developer CLI templates overview](make-azd-compatible.md) doc.\n\nIn this article, you learn how to add support for the Azure Developer CLI (`azd`) to your app through the **Select a template** approach. Visit the [Add `azd` support to your app using an existing template](start-with-app-code.md) doc for more information on the alternative approach. You can also visit the [Training - build and deploy `azd` templates](/training/paths/azure-developer-cli) for more information on building `azd` templates.\n\n## Select a template for your app\n\nThe **Select a template** workflow of the `azd init` command allows you to choose an existing `azd` template to use as a starting point. The contents of the selected template are added to the root directory of your project. Most templates provide the required set of `azd` files and folders, and many include a complete set infrastructure-as-code files to provision Azure resources for a chosen application stack.\n\nIn this example, you'll use the **Starter - Bicep** template, which includes the essential structure of an `azd` template and some useful boilerplate code to get started. Starter templates are a great choice when you want to scaffold out the correct template structure and starting resources, but still author your own infrastructure files.\n\n1. To follow along with the steps ahead using an existing sample application, clone the following starter project to an empty directory on your computer:\n\n    ```bash\n    git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart\n    ```\n\n1. In your command line tool of choice, navigate to the root directory of the cloned project.\n\n1. Run the `azd init` command to initialize an `azd` template.\n\n    ```bash\n    azd init\n    ```\n\n1. When prompted, choose the option to **Select a template**.\n\n    :::image type=\"content\" source=\"media/make-azd-compatible/azd-init.png\" alt-text=\"A screenshot showing the select a template options.\":::\n\n1. From the list of templates, select **Starter - Bicep**. You can type the template name or use your keyboard arrow keys to find it.\n\n1. When prompted, enter a short environment name, such as **testenv**.\n\n1. After you run `azd init`, the following assets are added to your current directory:\n\n    ```txt\n    ├── .azdo                                        [ Configures an Azure Pipeline ]\n    ├── .devcontainer                                [ For DevContainer ]\n    ├── .github                                      [ Configures a GitHub workflow ]\n    ├── .vscode                                      [ VS Code workspace configurations ]\n    ├── .azure                                       [ Stores Azure configurations and environment variables ]\n    ├── infra                                        [ Contains infrastructure as code files ]\n    │   ├── main.bicep/main.tf                       [ Main infrastructure file ]\n    │   ├── main.parameters.json/main.tfvars.json    [ Parameters file ]\n    │   └── core/modules                             [ Contains reusable Bicep/Terraform modules ]\n    └── azure.yaml                                   [ Describes the app and type of Azure resources]\n    ```\n\n## Update the Bicep files\n\nYour project now contains the core structure and assets of an `azd` template. However, to provision the Azure resources for your specific project, the [Bicep](/azure/azure-resource-manager/bicep) files in the `infra` folder need to be updated. To host the sample application, you'll need to define the following resources using Bicep files:\n\n- An Azure App Service Plan\n- An Azure App Service running on Linux\n\n1. Open the root project directory in your editor of choice, such as Visual Studio Code.\n\n1. Open the `main.bicep` file in the `infra` folder using your editor. This file contains useful boilerplate code to setup essential variables, parameters, and naming conventions. Beneath the comment block around line 50 that reads **`Add resources to be provisioned below`**, add the following Bicep:\n\n    ```bicep\n    // Creates an app service instance to host the app\n    module web './core/host/appservice.bicep' = {\n      name: 'web'\n      scope: rg\n      params: {\n        name: '${abbrs.webSitesAppService}web-${resourceToken}'\n        location: location\n        tags: union(tags, { 'azd-service-name': 'web' })\n        appServicePlanId: appServicePlan.outputs.id\n        runtimeName: 'python'\n        runtimeVersion: '3.8'\n        scmDoBuildDuringDeployment: true\n      }\n    }\n    \n    // Create an App Service Plan to group applications under the same payment plan and SKU\n    module appServicePlan './core/host/appserviceplan.bicep' = {\n      name: 'appserviceplan'\n      scope: rg\n      params: {\n        name: '${abbrs.webServerFarms}${resourceToken}'\n        location: location\n        tags: tags\n        sku: {\n          name: 'B1'\n        }\n      }\n    }\n    ```\n\n    > [!NOTE]\n    > - A unique string is generated based on subscription ID and used as a `${resourceToken}` variable. This token is appended to the name of all Azure resources created by `azd`.\n    > - `azd` uses tags to identify resources so you can modify the names based on your organization's naming convention.\n    > - The `'azd-service-name': 'web'` tag on the app service is the value `azd` uses to identify deployment host. The value must be the same as what is defined for the service in the **azure.yaml** file.\n\n## Update the azure.yaml file\n\nTo deploy the app, `azd` needs to know more about your app. The `azure.yaml` file is used to define the source code location, language, and the Azure hosting service for each service in your app. For full details, refer to [the azure.yaml schema](azd-schema.md).\n\n1. Open the `azure.yaml` at the root of the project.\n\n1. Add the following lines to the bottom of the file:\n\n    ```yml\n    name: msdocs-python-flask-webapp-quickstart\n    services:\n      web:\n        project: .\n        language: py\n        host: appservice\n    ```\n\n## Provision and deploy the template\n\n1. Save all of your changes and run the following command to provision and deploy the app resources on Azure:\n\n    ```azdeveloper\n    azd up\n    ```\n\n1. When the command finishes, click the link in the command output to navigate to the deployed site.\n\nYour project is now compatible with Azure Developer CLI and can be used as a template.\n\n> [!NOTE]\n> `azd` also supports using [Buildpack](https://buildpacks.io/) for containerizing your apps by default. If your `azd` template targets Azure Container Apps or Azure Kubernetes Service but does not include a Docker file, `azd` automatically generates an image using Buildpack.\n"
  },
  {
    "path": "articles/azure-developer-cli/supported-languages-environments.md",
    "content": "---\ntitle: Supported languages and environments\ndescription: Details about the Azure Developer CLI's template structure and supported development environments, hosts, and programming languages.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: concept-article\nms.custom: devx-track-azdevcli\n---\n\n# Supported languages and environments\n\n## Supported development environments\n\nYou can run any `azd` template, in one of the following supported development environments:\n\n|Environment|Description|Pros|Cons|Feature Stage|\n|---|---|---|---|---|\n|**Local Machine via CLI**|**Not** in a container, dependencies are manually installed by you, and the project is run on your local machine.|You control all dependencies. You may already have some of the dependencies installed. You don't need Docker installed.|You have to manually install all dependencies.|Stable|\n|**Visual Studio Code**| [Run and debug `azd` templates](/azure/developer/azure-developer-cli/debug?pivots=ide-vs-code) using the [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.azure-dev). | You can work with `azd` using a code editor and extension system you may already be comfortable with. | Requires installing an extension. |Beta|\n|**Visual Studio**| [Run and debug `azd` templates](/azure/developer/azure-developer-cli/debug?pivots=ide-vs) using [Visual Studio (preview)](https://visualstudio.microsoft.com/vs/preview/).  | You can work with `azd` using an IDE you may already be comfortable with. | Requires installing a separate preview version of Visual Studio. |Alpha|\n|**[DevContainer / VS Code Remote - Containers](https://code.visualstudio.com/docs/remote/containers)**|**Container** with all dependencies installed and run on your local machine.|Other than VS Code, Docker, and the Remote Containers VS Code extension, all dependencies are installed for you in the DevContainer.| You need to clone the repository. The container initialization can take a long time.|Beta|\n|**[GitHub Codespaces](https://github.com/features/codespaces)** |**Container** with all dependencies installed and running on GitHub.com in the browser.|All dependencies are installed without cloning the code locally.| Run and debug that requires launching a web browser is currently not supported because of [known limitation with GitHub Codespaces](https://code.visualstudio.com/docs/remote/codespaces#_known-limitations-and-adaptations). |Beta|\n\n## Supported Azure compute services (host)\n\n`azd` supports several services for hosting your app. Services marked as **alpha** are experimental and need to be enabled manually with [`azd config`](./reference.md#azd-config) to use them. **beta** features may experience breaking changes. **stable** features are not expected to experience breaking changes.\n\nFor more information about each feature stage, see [feature versioning and release strategy](./feature-versioning.md). For a list of all features and their stages, see [Alpha, Beta, and Stable Feature Stages](https://github.com/Azure/azure-dev/blob/main/cli/azd/docs/feature-stages.md).\n\n| Azure compute service | Feature Stage |\n| --- | --- |\n| Azure App Service | Stable |\n| Azure Static Web Apps | Stable |\n| Azure Container Apps (including Container App Jobs) | Stable |\n| Azure Functions | Stable |\n| Azure Kubernetes Service | Beta (only for projects deployable via `kubectl apply -f`) |\n\n## Supported languages and frameworks\n\nCurrently supported languages and frameworks:\n\n| Language | Feature Stage |\n| -------- | -----------   |\n| Node.js  | Stable        |\n| Python   | Stable        |\n| .NET     | Stable        |\n| Java     | Stable        |\n\nFor more information about each feature stage, see [feature versioning and release strategy](./feature-versioning.md)\n\n## Next Steps\n- [Install the Azure Developer CLI](./install-azd.md).\n- [Walk through the `azd` quickstart](./get-started.md) to see Azure Developer CLI in action.\n"
  },
  {
    "path": "articles/azure-developer-cli/tooling-environment-faq.md",
    "content": "---\ntitle: Azure Developer CLI tooling and environment FAQ\ndescription: Get answers to commonly asked questions about Azure Developer CLI tooling and environments.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 03/03/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Azure Developer CLI tooling and environment FAQ\n\nThis article provides answers to frequently asked questions about the Azure Developer CLI (`azd`) tooling, commands, and environments.\n\n## General questions\n\nThe following section focuses on general `azd` tooling and environment questions.\n\n### How do I uninstall Azure Developer CLI?\n\nThere are different options for uninstalling `azd` depending on how you originally installed it. Visit the [installation page](/azure/developer/azure-developer-cli/install-azd) for details.\n\n### What's the difference between the Azure Developer CLI and the Azure CLI?\n\n[Azure Developer CLI](/azure/developer/azure-developer-cli/overview) (`azd`) and [Azure CLI](/cli/azure/what-is-azure-cli) (`az`) are both command-line tools, but they help you do different tasks.\n\n[`azd`](./index.yml) focuses on the high level developer workflow. Apart from provisioning/managing Azure resources, `azd` helps to stitch cloud components, local development configuration, and pipeline automation together into a complete solution.\n\nAzure CLI is a control plane tool for creating and administering Azure infrastructure such as virtual machines, virtual networks, and storage. The Azure CLI is designed around granular commands for specific administrative tasks.\n\nVisit [Azure Developer CLI vs Azure CLI](azure-developer-cli-vs-azure-cli.md) for more information.\n\n### What is an environment name?\n\nAzure Developer CLI uses an environment name to set the `AZURE_ENV_NAME` environment variable that's used by Azure Developer CLI templates. `AZURE_ENV_NAME` is also used to prefix the Azure resource group name. Because each environment has its own set of configurations, Azure Developer CLI stores all configuration files in environment directories.\n\n```txt\n├── .Azure                          [This directory displays after you run `azd init` or `azd up`]\n│   ├── <your environment1>         [A directory to store all environment-related configurations]\n│   │   ├── .env                    [Contains environment variables]\n│   │   └── main.parameters.json    [A parameter file]\n│   └── <your environment2>         [A directory to store all environment-related configurations]\n│   │   ├── .env                    [Contains environment variables]\n│   │   └── main.parameters.json    [A parameter file]\n│   └──config.json\n```\n\nFor more information on workflows, see [azd init](azd-init-workflow.md) and [azd up](azd-up-workflow.md).\n\n### Can I set up more than one environment?\n\nYes. You can set up a various environments (for example, dev, test, production). You can use [azd env](work-with-environments.md) to manage these environments.\n\n### Where is the environment configuration (.env) file stored?\n\nThe .env file path is `<your-project-directory-name>\\.azure\\<your-environment-name>\\.env`. For more information, see [Manage environment variables](manage-environment-variables.md).\n\n### How is the .env file used?\n\nIn Azure Developer CLI, the `azd` commands refer to the .env file for environment configuration. Commands such as [azd deploy](reference.md#azd-deploy) also update the .env file with, for example, the db connection string and the Azure Key Vault endpoint.\n\n### I have run `azd up` in Codespaces. Can I continue my work in a local development environment?\n\nYes. You can continue development work locally.\n\n1. Run `azd init -t <template repo>` to clone the template project to your local machine.\n2. To pull down the existing env created using Codespaces, run `azd env refresh`. Make sure you provide the same environment name, subscription and location as before.\n\n### How do I authenticate in Codespaces if device login has an issue?\n\nIf you experience issues with device code authentication in Codespaces (for example, recurring 2FA requests or errors), try the following workaround using VS Code Desktop:\n\n1. Open your Codespace in VS Code Desktop using one of these methods:\n    - Use the command palette (Ctrl+Shift+P on Windows or Cmd+Shift+P on MacOs) and select **Codespaces: Open in VS Code Desktop**.\n    - Click the bottom left corner of the Codespace in the browser and select **Open in VS Code Desktop**).\n2. In the VS Code Desktop terminal, run [azd auth login](reference.md#azd-auth-login) and complete the browser-based authentication.\n3. Once authenticated, close VS Code Desktop and return to your Codespace in the browser. The authentication state should persist.\n\n### How is the azure.yaml file used?\n\nThe [azure.yaml](azd-schema.md) file describes the apps and types of Azure resources that are included in the template.\n\n### What is the behavior of the `secretOrRandomPassword` function?\n\nThe `secretOrRandomPassword` function retrieves a secret from Azure Key Vault if parameters for the key vault name and secret are provided. If these parameters aren't provided or a secret can't be retrieved, the function returns a randomly generated password to use instead.\n\nThe following example demonstrates a common use case of the `secretOrRandomPassword` in a `main.parameters.json` file. The `${AZURE_KEY_VAULT_NAME}` and `sqlAdminPassword` variables are passed as parameters for the names of the Key Vault and secret. If the value can't be retrieved, a random password is generated instead.\n\n```json\n\"sqlAdminPassword\": {\n    \"value\": \"$(secretOrRandomPassword ${AZURE_KEY_VAULT_NAME} sqlAdminPassword)\"\n}\n```\n\nThe output of `secretOrRandomPassword` should also be saved to Key Vault using Bicep for future runs. Retrieving and reusing the same secrets across deploys can prevent errors or unintended behaviors that can surface when repeatedly generating new values. To create a Key Vault and store the generated secret in it, use the Bicep code below. You can view the full sample code for these modules in the [Azure Developer CLI GitHub repository](https://github.com/Azure/azure-dev/tree/main).\n\n```bicep\nmodule keyVault './core/security/keyvault.bicep' = {\nname: 'keyvault'\nscope: resourceGroup\nparams: {\n    name: '${take(prefix, 17)}-vault'\n    location: location\n    tags: tags\n    principalId: principalId\n}\n}\n\nmodule keyVaultSecrets './core/security/keyvault-secret.bicep' = {\nname: 'keyvault-secret-sqlAdminPassword'\nscope: resourceGroup\nparams: {\n    keyVaultName: keyVault.outputs.name\n    name: 'sqlAdminPassword'\n    secretValue: sqlAdminPassword\n}\n}]\n```\n\nThis Bicep setup enables the following workflow for managing your secrets:\n\n1. If the specified secret exists, it's retrieved from Key Vault using the `secretOrRandomPassword` function.\n2. If the secret doesn't exist, a Key Vault is created, and the randomly generated secret is stored inside of it.\n3. On future deploys, the `secretOrRandomPassword` method retrieves the stored secret now that it exists in Key Vault. The Key Vault won't be recreated if it already exists, but the same secret value will be stored again for the next run.\n\n### Can I use Azure Free Subscription?\n\nYes, but each Azure location can only have one deployment. If you've already used the selected Azure location, you'll see the deployment error:\n\n```text\nInvalidTemplateDeployment: The template deployment '<env_name>' isn't valid according to the validation procedure. The tracking ID is '<tracking_id>'. See inner errors for details.\n```\n\nYou can select a different Azure location to fix the issue.\n\n### My app hosted with Azure App Service is triggering a \"Deceptive site ahead\" warning. How can I fix it?\n\nThis might happen because of our method for naming resources.\n\nOur 'Azure Dev' authored templates allow for configuring the name of the resource. To do so, you can add an entry to the `main.parameters.json` in the `infra` folder. For example:\n\n```json\n\"webServiceName\": {\n    \"value\": \"my-unique-name\"\n}\n```\n\nThis entry creates a new resource named \"my-unique-name\" instead of a randomized value such as \"app-web-aj84u2adj\" the next time you provision your application. You can either manually remove the old resource group using the Azure portal or run `azd down` to remove all previous deployments. After removing the resources, run `azd provision` to create them again with the new name.\n\nThis name will need to be globally unique, otherwise you will receive an ARM error during `azd provision` when it tries to create the resource.\n\n### Can I work with multiple Azure tenants?\n\nYes. To authenticate with a specific tenant, use the `--tenant-id` parameter with the `azd auth login` command.\n\n```bash\nazd auth login --tenant-id <tenant-id>\n```\n\nAlternatively, if you want `azd` to have access to all your tenants, you can handle the Multi-Factor Authentication (MFA) challenges in the browser first:\n\n1. Open the [Azure Portal](https://portal.azure.com) in your browser.\n2. Switch to each of your tenants one by one. This action triggers any necessary MFA challenges and refreshes your tokens.\n3. Run `azd auth login` in your terminal. `azd` will use the browser's existing session and access tokens, which are now valid for all the tenants you visited.\n\n### Can I run `azd up` multiple times?\n\nYes. We use the [incremental deployment mode](/azure/azure-resource-manager/templates/deployment-modes). For more information, see [azd up](azd-up-workflow.md).\n\n## Provisioning\n\nThe following section focuses on the `azd` provisioning process.\n\n### Can I run `azd provision` multiple times?\n\nYes. We use the [incremental deployment mode](/azure/azure-resource-manager/templates/deployment-modes). For more information, see [azd provision](reference.md#azd-provision).\n\n### How does the `azd provision` command know what resources to provision?\n\nThe command uses [Bicep templates](/azure/azure-resource-manager/bicep/overview), which are found under `<your-project-directory-name>/infra` to provision Azure resources.\n\n### Where can I find what resources are provisioned in Azure?\n\nGo to https://portal.azure.com and then look for your resource group, which is `rg-<your-environment-name>`.\n\n### How do I find more information about Azure errors?\n\nWe use Bicep templates, which are found under `<your-project-directory-name>/infra`, to provision Azure resources. If there are issues, we include the error message in the CLI output.\n\nYou can also go to https://portal.azure.com and then look for your resource group, which is `rg-<your-environment-name>`. If any of the deployments fail, select the error link to get more information.\n\nFor other resources, see [Troubleshoot common Azure deployment errors - Azure Resource Manager](/azure/azure-resource-manager/troubleshooting/common-deployment-errors).\n\n### Is there a log file for `azd provision`?\n\nComing soon. This feature is planned for a future release.\n\n## Deployment\n\nThe following section focuses on the `azd` deployment process.\n\n### Can I run `azd deploy` multiple times?\n\nYes. See [azd deploy](reference.md#azd-deploy) for more information.\n\n### How does azd find the Azure resource to deploy my code to?\n\nDuring deploy, `azd` first discovers all the resource groups that make up your application by looking for groups tagged with `azd-env-name` and with a value that matches the name of your environment. Then, it enumerates all the resources in each of these resource groups, looking for a resource tagged with `azd-service-name` with a value that matches the name of your service from `azure.yaml`.\n\nWhile we recommend using tags on resources, you can also use the `resourceName` property in [azure.yaml](azd-schema.md) to provide an explicit resource name. In that case, the above logic isn't run.\n\n### How do I deploy specific services in my project while skipping others?\n\nWhen deploying your project, you can choose to deploy specific services either by specifying the service name in the command (i.e. `azd deploy api`) or by navigating to a subfolder that contains just the service(s) you want to deploy. When doing so, all other services will be listed as `- Skipped`.\n\nIf you don't want to skip any services, be sure to either run your command from the root folder or add the `--all` flag to your command.\n\n## Pipeline configuration\n\nThe following section focuses CI/CD pipeline configuration.\n\n### What is an Azure service principal?\n\nAn Azure service principal is an identity that's created for use with apps, hosted services, and automated tools to access Azure resources. This access is restricted by the roles that are assigned to the service principal, which gives you control over which resources can be accessed and at which level. For more information about authenticating from Azure to GitHub, see [Connect GitHub and Azure | Microsoft Docs](../github/connect-from-azure-secret.md).\n\n### Do I need to create an Azure service principal before I run `azd pipeline config`?\n\nNo. The [azd pipeline config](configure-devops-pipeline.md) command takes care of creating the Azure service principal and performing the necessary steps to store the secrets in your GitHub repo.\n\n### What are all the secrets stored in GitHub?\n\nThe command stores four secrets in GitHub: `AZURE_CREDENTIALS`, `AZURE_ENV_NAME`, `AZURE_LOCATION`, and `AZURE_SUBSCRIPTION_ID`. You can override the value of each secret by going to `https://github.com/<your-github-account>/<your-repo>/secrets/actions`.\n\n### What is OpenID Connect (OIDC), and is it supported?\n\nWith [OpenID Connect](https://docs.github.com/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect), your workflows can exchange short-lived tokens directly from Azure.\n\nWhile OIDC is supported as the default for GitHub Actions and Azure Pipeline (set as **federated**), it isn't supported for Azure DevOps or Terraform.\n\n- For Azure DevOps, explicitly calling out `--auth-type` as `federated` will result in an error.\n- For Terraform:\n  - If `--auth-type` isn't defined, it will fall back to `clientcredentials` and will result in a warning.\n  - If `--auth-type` is explicitly set to `federated`, it will result in an error.\n\n### How do I reset the Azure service principal that's stored in GitHub Actions?\n\nGo to `https://github.com/<your-github-account>/<your-repo>settings/secrets/actions`, and then update `AZURE_CREDENTIALS` by copying and pasting the entire JSON object for the new service principal. For example:\n\n```json\n{\n\"clientId\": \"<GUID>\",\n\"clientSecret\": \"<GUID>\",\n\"subscriptionId\": \"<GUID>\",\n\"tenantId\": \"<GUID>\",\n(...)\n}\n```\n\n### Where is the GitHub Actions file stored?\n\nThe GitHub Actions file path is `<your-project-directory-name>\\.github\\workflows\\azure-dev.yml`. For more information, see [Quickstart: Create a service principal and run a GitHub Action](pipeline-github-actions.md).\n\n### In the azure-dev.yml file, can I deploy just the code in the build step?\n\nYes. Replace `run: azd up --no-prompt` with `run: azd deploy --no-prompt`.\n\n### Where can I find the log for the GitHub Actions job that I triggered when I ran `azd pipeline config`?\n\nGo to `https://github.com/<your-github-account>/<your-repo>/actions`, and then refer to the log file in the workflow run.\n\n## Building a container application locally\n\n### Why am I unable to locally run the container app that I'm building?\n\nWhen building container applications locally, you need to run `azd auth login` in the container for the application to work with the `AzureDeveloperCliCredential`. Alternatively, you could configure your application to use a service principal instead of the `AzureDeveloperCliCredential`.\n"
  },
  {
    "path": "articles/azure-developer-cli/troubleshoot.md",
    "content": "---\ntitle: Troubleshoot Azure Developer CLI\ndescription: In this article, troubleshoot common problems that might occur when you're using Azure Developer CLI.\nauthor: alexwolfmsft\nms.author: alexwolf\nkeywords: azd, known issues, troubleshooting, azure developer cli\nms.topic: troubleshooting\nms.date: 05/22/2025\nms.service: azure-dev-cli\nms.custom: devx-track-azdevcli, devx-track-bicep, build-2023, devx-track-extended-java, devx-track-python\n# Customer intent: As a developer, I'm looking for solutions to common problems that occur when I'm using Azure Developer CLI.\n---\n\n# Troubleshoot Azure Developer CLI\n\nThis article provides solutions to common problems that might arise when you're using Azure Developer CLI (azd).\n\n## Get help and give feedback\n\nIf you're unable to find what you're looking for in this article or you want to provide feedback, you can post questions to [Azure Developer CLI Discussions](https://github.com/Azure/azure-dev/discussions).\n\nYou can also report bugs by opening GitHub Issues in the [Azure Developer CLI GitHub repository](https://github.com/Azure/azure-dev).\n\n## Using the `--debug` switch\n\nIf you encounter an unexpected issue while working with `azd`, rerun the command with the `--debug` switch to enable more debugging and diagnostic output. \n\n```bash\nazd up --debug\n```\n\nYou can also send the debugging output to a local text file for improved usability. This approach allows other monitoring systems to ingest the debugging and can also be useful when filing an issue on GitHub.\n\n> [!IMPORTANT]\n> Make sure to redact any sensitive information when submitting debug logs on GitHub or saving them to other diagnostics systems.\n\n```bash\nazd deploy --debug > \"<your-file-path>.txt\"\n```\n\n## The `.azure` directory\n\nAzure Developer CLI assumes that any directories that are stored in the `.azure` directory are Azure Developer CLI environments. Don't run Azure Developer CLI commands from the home directory of a user that has the Azure CLI installed.\n\n## Not logged in to Azure or token expired in Visual Studio\n\nAfter you run `azd init -t <template-name>` in Visual Studio, you get the following error: \"To access remote: this repository, you must reauthorize the OAuth Application `Visual Studio`.\"\n\n### Solution\n\nRun `azd auth login` to refresh the access token.\n\n## Updated Azure account permissions don't refresh in `azd`\n\n By default, `azd` caches your Azure credentials and permissions. If your Azure account is assigned new roles and permissions, or is added to more subscriptions, these changes may not be immediately reflected in `azd`. To solve this issue, log out and then log back in to `azd` using the following commands:\n\n```bash\nazd auth logout\n\nazd auth login\n```\n\nFollow the prompts from the `azd auth login` command to complete the sign-in process and update your cached credentials.\n\n## Cloud Shell limitations for `azd`\n\nThere are some limitations to running `azd` in Cloud Shell:\n\n### Docker support in Cloud Shell\n\nCloud Shell doesn't support running docker `build` or `run` commands  because the docker daemon isn't running. For more information, see [Cloud Shell Troubleshooting](/azure/cloud-shell/troubleshooting#you-cant-run-the-docker-daemon).\n\n### Cloud Shell timeout\n\nCloud Shell may time out during a long deployment or other long-running tasks. Make sure the session doesn't become idle. See [Cloud Shell Usage limits](/azure/cloud-shell/limitations#usage-limits).\n\n### Cloud Shell interface\n\nCloud Shell is primarily a command-line interface and has fewer features than an integrated development environment\nlike Visual Studio Code.\n\n### Cannot connect to the Docker daemon in Cloud Shell\n\nCloud Shell uses a container to host your shell environment, so tasks that require running the Docker daemon aren't allowed.\n\n## Install different version of azd in Cloud Shell\n\nIn some cases, it may be necessary to install a different version of `azd` than the version already in use in Cloud Shell. To do this in bash: \n\n1. Run `mkdir -p ~/bin` to ensure that the `~/bin` folder is present\n1. Run `mkdir -p ~/azd` to ensure that a local `~/azd` folder is present\n1. Run `curl -fsSL https://aka.ms/install-azd.sh | bash -s -- --install-folder ~/azd --symlink-folder ~/bin --version <version>` (`<version>` would be `stable` by default but a specific released version like `1.0.0` can also be specified).  \n\nOnce installed, the version of `azd` symbolically linked in `~/bin` takes precedence over the\nversion of `azd` symbolically linked in `/usr/local/bin`.\n\nTo revert to using the version of `azd` already installed on Cloud Shell in bash:\n\n1. Run `rm ~/bin/azd`\n1. Run `rm -rf ~/azd`\n\n### Solution\n\nUse another host to perform tasks that require the docker daemon. One option is to use docker-machine, as described in the [Cloud Shell troubleshooting](/azure/cloud-shell/troubleshooting#you-cant-run-the-docker-daemon) documentation.\n\n## Azure Bicep CLI requirement\n\n`azd up` and `azd provision` require the latest release of Azure Bicep CLI. You might get the following error message: \"Error: failed to compile bicep template: failed running Az PowerShell module bicep build: exit code: 1, stdout: , stderr: WARNING: A new Bicep release is available: v0.4.1272.\"\n\n### Solution\n\nPreviously, Bicep was a prerequisite for installing and using `azd `. `azd` now automatically installs Bicep within the local `azd` scope (not globally) and this issue should now be resolved. However, if you want to use a different version, you can set the environment variable: `AZD_BICEP_TOOL_PATH` to point to the location of the version you need.\n\n## `azd up` or `azd provision` fails\n\nThings can sometimes go awry with `azd up` or `azd provision`. Common errors include:\n* \"Can't provision certain resources in an Azure region because the region is out of capacity.\"\n* \"Relevant resource provider isn't present in that region.\"\n\nThe troubleshooting steps might differ, depending on the root cause.\n\n### Solution\n\n1. Go to the [Azure portal](https://portal.azure.com).\n\n1. Locate your resource group, which is rg-\\<your-environment-name>.\n\n1. Select **Deployments** to get more information.\n\n1. Verify that you specified an environment name that's the same as your environment name.\n\n1. Go to the **Actions** tab of the impacted GitHub repo and investigate the log file in the pipeline run for more information.\n\nFor other resources, see [Troubleshoot common Azure deployment errors - Azure Resource Manager](/azure/azure-resource-manager/troubleshooting/common-deployment-errors).\n\n## `azd init` requires `sudo`\n\nBefore `azd version = azure-dev-cli_0.2.0-beta.1`, `azd` would create an `.azd` folder with `drw-r--r--` access.\n\nThis causes an issue, as using this or any prior version on any Linux set-up (WSL, ssh-remote, devcontainer, etc.) already provides an `.azd` folder with read-only mode.\n\n### Solution\n\n1. Manually delete the already provided `.azd` folder:\n\n   ```bash\n   rm -r ~/.azd\n   ```\n\n1. Run `azd init` for `azd` to create the folder again with the right access levels.\n\n## `azd monitor` for development container\n\n`azd monitor` is currently not supported if you use a development container as your development environment.\n\n## Unable to authenticate in Codespaces environments\n\nIf you're experiencing authentication issues in Codespaces, make sure the template Dockerfile includes the `sudo apt-get update && sudo apt-get install xdg-utils` commands. The `xdg-utils` command opens a browser tab that allows you to sign-in.\n\n## Static Web Apps fail to deploy despite success message\n\nA known issue exists when deploying to Azure Static Web Apps in which the default `azd up` output may state the action was successful, but the changes weren't actually deployed. You can diagnose this problem by running the `azd up` command with the `--debug` flag enabled. In the output logs you may see the following message:\n\n```bash\nPreparing deployment. Please wait...\nAn unknown exception has occurred\n```\n\nYou're most likely to encounter this issue when `azd` is run from a GitHub action. As a workaround, after you build your site, copy `staticwebapp.config.json` into the build folder. You can automate this step this by using a prepackage or predeploy [command hook](/azure/developer/azure-developer-cli/azd-extensibility), which allows you to execute custom scripts at various points in the azd command workflows.\n\nThe product team is working to resolve this issue.\n\n## GitHub Actions error - \"Does not have secrets get permission on key vault\"\n\nSharing the same environment or resource group name when provisioning resources locally and in GitHub Actions can produce the error `Does not have secrets get permission on key vault..` from the Key Vault service. Key Vault doesn't support incremental permissions updates through Bicep, which effectively means the GitHub Actions workflow overwrites the Access Policy permissions of the local user.\n\nThe recommended solution to this issue is to use separate environment names for local development and GitHub Actions workflows. Read more about [using multiple environments](/azure/developer/azure-developer-cli/faq#what-is-an-environment-name) with the `azd env` command on the FAQ page.\n\n## Text-based browser support\n\nText-based browsers are currently not supported by `azd monitor`.\n\n## `azd pipeline config` using AzDo for Java templates on Windows\n\nYou may encounter a failure when running `azd pipeline config` with AzDo for Java templates on Windows. For example, you've:\n\n1. Run the following on Windows:\n\n   ```azdeveloper\n   azd init --template Azure-Samples/todo-java-mongo\n   azd pipeline config\n   ```\n\n1. Received the following error:\n\n   :::image type=\"content\" source=\"media/troubleshoot/error-pipeline.png\" alt-text=\"Screenshot showing the error received when running azd pipeline config with AzDo for Java on Windows.\":::\n\n\n### Solution\n\nThis is a known issue. While we address this issue, try the following command:\n\n```bash\ngit update-index --chmod=+x src/api/mvnw && git commit -m \"Fix executable bit permissions\" && git push\n```\n\n## `failed packaging service 'api': failed invoking action 'package', failed to run NPM script build, signal: segmentation fault` failure after upgrading `azd` on Apple Silicon (M1/M2)\n\nIn some situations, upgrading from the x86_64 version of `azd` to an ARM64 binary may result in failures for templates\nwhich have been built with the x86_64 version of `azd`. This is because the template uses a version of\n`v8-compile-cache` which may try to load bytecode built under x86_64 into an ARM64 process.\n\nTo fix this issue, upgrade the `v8-compile-cache` package in the affected project:\n\n1. Change directory to the service which failed (`src/api` in the case of `failed packaging service 'api'`)\n2. Run `npm upgrade v8-compile-cache`\n3. Change directory to the root of the repo and run the `azd` command (e.g. `azd package` or `azd up`) again\n\n## `azd pipeline config` failure due to Conditional Access Policy\n\nWhen running `azd pipeline config`, you may receive an error like the following:\n\n```azdeveloper\nERROR: failed to create or update service principal: failed retrieving application list, failed executing request: http call(https://login.microsoftonline.com/common/oauth2/v2.0/token)(POST) error: reply status code was 400:\n{\"error\":\"invalid_grant\",\"error_description\":\"AADSTS50005: User tried to log in to a device from a platform (Unknown) that's currently not supported through Conditional Access policy. Supported device platforms are: iOS, Android, Mac, and Windows flavors.\\r\\nTrace ID: 0000aaaa-11bb-cccc-dd22-eeeeee333333\\r\\nCorrelation ID: aaaa0000-bb11-2222-33cc-444444dddddd\\r\\nTimestamp: 2022-12-16 21:10:37Z\",\"error_codes\":[50005],\"timestamp\":\"2022-12-16 21:10:37Z\",\"trace_id\":\"0000aaaa-11bb-cccc-dd22-eeeeee333333\",\"correlation_id\":\"aaaa0000-bb11-2222-33cc-444444dddddd\"}\n```\n\nThis error is related to your Microsoft Entra tenant enablement of Conditional Access Policies. The specific policy requires that you're signed in into a supported device platform. \n\nYou may also be receiving this error due to being logged in using the device code mechanism, which prevents Microsoft Entra ID from detecting your device platform correctly.\n\n### Solution\nTo configure the workflow, you need to give GitHub permission to deploy to Azure on your behalf. Authorize GitHub by creating an Azure Service Principal stored in a GitHub secret named `AZURE_CREDENTIALS`. Select your Codespace host for steps:\n\n## [Browser](#tab/Browser)\n\n1. Make sure you're running on a device listed as supported, per the error message.\n2. Rerun `azd auth login` with the flag `--use-device-code=false` appended:\n\n   ```azdeveloper\n   azd auth login --use-device-code=false\n   ```\n3. You may receive an error with message `localhost refused to connect` after logging in. If so:\n   1. Copy the URL.\n   2. Run `curl '<pasted url>'` (URL in quotes) in a new Codespaces terminal.\n\n   In the original terminal, the login should now succeed.\n4. After logging in, rerun `azd pipeline config`.\n\n## [VS Code](#tab/VSCode)\n\n1. Make sure you're running on a device listed as supported, per the error message.\n2. Rerun `azd auth login` with the flag `--use-device-code=false` appended:\n\n   ```azdeveloper\n   azd auth login --use-device-code=false\n   ```\n3. After logging in, rerun `azd pipeline config`.\n\n---\n\n## Cached Dockerfile used instead of current Dockerfile\n\nWhen using `azd` in your local development environment with Docker, Docker may use the cached version of your Dockerfile instead of the current version. This results in the deployment using a container with incorrect information. \n\n### Solution\n\nTo configure your local Docker installation, which is used by Azure Developer CLI to build the container, you need to configure Docker with the following environment variables:\n\n```console\nDOCKER_BUILDKIT=1\nDOCKER_BUILD_ARGS=\"--no-cache\"\n```\n\nYou can change your `azd up` to include these settings: \n\n```console\nDOCKER_BUILDKIT=1 DOCKER_BUILD_ARGS=\"--no-cache\" azd up\n```\n\n## `azd pipeline config` support\n\n`azd pipeline config` is currently not supported in [DevContainers/VS Code Remote Containers](https://code.visualstudio.com/docs/devcontainers/containers).\n\n## Compose feature errors\n\nThe `azd` compose feature is only available for specific project types. If you try to use compose commands like `azd add` or `azd infra gen` in an unsupported context, you may encounter the following errors.\n\n### Incompatible project\n\nIf you see an `ERROR: incompatible project` message when running the `azd add` command, check the type of project you're working with. The `azd add` command is not supported for .NET Aspire projects or for `azd` templates that already have an `infra` folder defined. Attempting to use `azd add` with these project types will result in errors such as:\n\n* ERROR: incompatible project: found Aspire app host\n* ERROR: incompatible project: found infra directory and azure.yaml without resources\n\n    :::image type=\"content\" source=\"media/troubleshoot/incompatible-project-aspire.png\" alt-text=\"A screenshot showing the incompatible .NET Aspire project error.\":::\n\n    :::image type=\"content\" source=\"media/troubleshoot/incompatible-project-infra.png\" alt-text=\"A screenshot showing the incompatible project infrastructure error.\":::\n\n### Project does not contain infrastructure to generate\n\nThe error `ERROR: this project does not contain any infrastructure to generate` occurs when:\n\n* You run `azd infra gen` without any compose resources defined in your project.\n* In .NET Aspire projects, this error can also appear if `azd` cannot detect an Aspire App Host in the current directory.\n\nTo resolve this error, use `azd add` to add new resources before running `azd infra gen` or ensure your .NET Aspire project is structured correctly.\n\n:::image type=\"content\" source=\"media/troubleshoot/no-infrastructure-generate.png\" alt-text=\"A screenshot showing the infrastructure error.\":::\n\n## Error resolving Azure resource\n\nThe command `azd show <name>` might fail with the error: `ERROR: resolving '<name>': AZURE_RESOURCE_<NAME>_ID is not set as an output variable`. This could happen for a number of reasons:\n\n* The resource `<name>` does not exist in `azure.yaml` under the resources: node.\n* The resource `<name>` has not been provisioned yet.\n\n:::image type=\"content\" source=\"media/troubleshoot/error-resolving-azure-resource.png\" alt-text=\"A screenshot showing the azure resource error.\":::\n\n### Solution\n\nRun `azd up` to provision the resources. You may need to run `azd infra gen` first to generate the updated Bicep including the resource `<name>`, then run `azd up`.\n\n## Live metrics support for Python\n\nLive Metrics (`azd monitor --live`) is currently not supported for Python apps. For more information, see [Live Metrics: Monitor and diagnose with 1-second latency](/azure/azure-monitor/app/live-stream#get-started).\n\n## Create a GitHub issue to request help\n\n:::image type=\"content\" source=\"media/troubleshoot/github-logo.png\" alt-text=\"An image of the GitHub logo.\":::\n\nThe Azure Developer CLI and the [Azure Developer CLI Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.azure-dev) use [GitHub Issues](https://github.com/Azure/azure-dev/issues/new/choose) to track bugs and feature requests. Please search the [existing issues](https://github.com/Azure/azure-dev/issues) before filing new issues to avoid duplicates.\n\nFor help and questions about using this project, please look at our [wiki](https://github.com/Azure/azure-dev/wiki) for using Azure Developer CLI and our [CONTRIBUTING doc](https://github.com/Azure/azure-dev/blob/main/cli/azd/CONTRIBUTING.md) if you want to contribute.\n"
  },
  {
    "path": "articles/azure-developer-cli/use-external-registry.md",
    "content": "---\ntitle: Use third-party container registries\ndescription: How to use third-party container registries\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli\n---\n\n# Use third-party container registries\n\nAzure Developer CLI (`azd`) supports external third-party container registries for deployment. To use this feature, you need to manually authenticate to the external container registry before calling `azd` deploy.\n\n## Authentication\n\nRun `docker login` and authenticate to your external container registry. You may need to follow more setup or configuration steps for your specific registry provider.\n\n```azdeveloper\ndocker login <your-registry>\n```\n\n## Example scenarios\n\nYou can configure `azd` to push and pull images from an external container registry in the `azure.yaml` file of your template. Support for more container registries provides greater flexibility for your deployment workflows.\n\n### Pull from external container registry\n\nIn this example, during `azd` deploy the container is pulled from `docker.io/username/nginx:latest` and directly referenced by the container app service.\n\n```yml\nname: todo-nodejs-mongo-aca\nmetadata:\n  template: todo-nodejs-mongo-aca@0.0.1-beta\nservices:\n  nginx:\n    image: docker.io/<username>/nginx:latest\n    host: containerapp\n```\n\n> [!NOTE]\n> Your containerapp infra configuration must configure credentials when pulling containers from private container registries.\n\n### Pull, tag & push to external registry\n\nConsider an `azure.yaml` file with the following configuration:\n\n```yml\n# azure.yaml\n\nname: todo-nodejs-mongo-aca\nmetadata:\n  template: todo-nodejs-mongo-aca@0.0.1-beta\nservices:\n  nginx:\n    image: nginx\n    host: containerapp\n    docker:\n      registry: docker.io/<username>\n      image: nginx\n      tag: latest   \n```\n\nThe `azd deploy` command pulls the configured nginx image. In this case, it's a public image on docker hub, so `azd` retags the container/image and pushes it to the docker registry.\n\n### Build, tag & push to external registry on azd deploy\n\nConsider an `azure.yaml` file with the following configuration:\n\n```yml\n# azure.yaml\n\nname: todo-nodejs-mongo-aca\nmetadata:\n  template: todo-nodejs-mongo-aca@0.0.1-beta\nservices:\n  api:\n    project: ./src/api\n    host: containerapp\n    docker:\n      registry: docker.io/<username>\n      image: todo-api\n```\n\nThe `azd deploy` command builds the container, tags it and pushes it to the docker registry.\n"
  },
  {
    "path": "articles/azure-developer-cli/use-terraform-for-azd.md",
    "content": "---\ntitle: Use Terraform as an infrastructure as code tool for Azure Developer CLI\ndescription: How to use Terraform as an infrastructure as code tool for Azure Developer CLI (azd).\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 01/09/2026\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, devx-track-terraform, build-2023\n---\n\n# Use Terraform as an infrastructure as code tool for Azure Developer CLI\n\nAzure Developer CLI (`azd`) supports multiple infrastructures as code (IaC) providers, including:  \n\n- [Bicep](/azure/azure-resource-manager/bicep/overview?tabs=bicep)\n- [Terraform](../terraform/overview.md)\n\nBy default, `azd` assumes Bicep as the IaC provider. Refer to the [Comparing Terraform and Bicep](../terraform/comparing-terraform-and-bicep.md?tabs=comparing-bicep-terraform-integration-features) article for help with deciding which IaC provider is best for your project.\n\n> [!NOTE]\n> Terraform is still in beta. Read more about alpha and beta feature support on the [feature versioning and release strategy](/azure/developer/azure-developer-cli/feature-versioning) page\n\n\n## Pre-requisites\n\n- [Install and configure Terraform](../terraform/quickstart-configure.md)\n- [Install and log into Azure CLI (v 2.38.0+)](/cli/azure/install-azure-cli)\n- [Review the architecture diagram and the Azure resources you'll deploy in the Node.js or Python Terraform template](./azd-templates.md#start-with-an-existing-template).\n\n> [!NOTE]\n> While `azd` doesn't rely on an Azure CLI login, Terraform requires Azure CLI. Read more about this requirement from [Terraform's official documentation](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/azure_cli).\n\n## Configure Terraform as the IaC provider\n\n1. Open the [`azure.yaml` file](./azd-schema.md#infra) found in the root of your project and make sure you have the following lines to override the default, which is Bicep:\n\n    ```yaml\n    infra:\n      provider: terraform\n    ```\n\n1. Add all your `.tf` files to the `infra` directory found in the root of your project.\n1. Run `azd up`. \n\n> [!NOTE] \n> Check out these two azd templates with Terraform as IaC Provider: [Node.js and Terraform](https://github.com/Azure-Samples/todo-nodejs-mongo-terraform) and [Python and Terraform](https://github.com/Azure-Samples/todo-python-mongo-terraform). \n\n## `azd pipeline config` for Terraform\n\nTerraform stores state about your managed infrastructure and configuration. Because of this state file, you need to enable remote state **before** you run `azd pipeline config` to set up your deployment pipeline in GitHub.\n\nBy default, `azd` assumes the use of local state file. If you ran `azd up` before enabling remote state, you need to run `azd down` and switch to remote state file.\n\n## Local vs remote state\n\nTerraform uses persisted [state](https://www.terraform.io/language/state) data to keep track of the resources it manages. \n\nScenarios for enabling remote state:\n\n- To allow shared access to the state data, and allow multiple people work together on that collection of infrastructure resources\n- To avoid exposing sensitive information included in state file\n- To decrease the chance of inadvertent deletion because of storing state locally\n\n## Enable remote state\n\n1. Make sure you [configure a remote state storage account](../terraform/store-state-in-azure-storage.md).\n1. Add a new file called `provider.conf.json` in the `infra` folder.\n\n    ```json\n    {\n        \"storage_account_name\": \"${RS_STORAGE_ACCOUNT}\",\n        \"container_name\": \"${RS_CONTAINER_NAME}\",\n        \"key\": \"azd/azdremotetest.tfstate\",\n        \"resource_group_name\": \"${RS_RESOURCE_GROUP}\"\n    }\n    ```\n\n1. Update `provider.tf` found in the `infra` folder to set the backend to be remote\n\n    ```console\n    # Configure the Azure Provider\n    terraform {\n      required_version = \">= 1.1.7, < 2.0.0\"\n      backend \"azurerm\" {\n      }\n    ```\n\n1. Run `azd env set <key> <value>` to add configuration in the `.env` file. \nFor example: \n \n    ```azdeveloper\n    azd env set RS_STORAGE_ACCOUNT your_storage_account_name\n    azd env set RS_CONTAINER_NAME your_terraform_container_name\n    azd env set RS_RESOURCE_GROUP your_storage_account_resource_group\n    ```\n\n1. Run the next `azd` command as per your usual workflow. When remote state is detected, `azd` initializes Terraform with the configured backend configuration.\n\n1. To share the environment with teammates, make sure they run `azd env refresh -e <environmentName>` to refresh environment settings in the local system, and perform Step 4 to add configuration in the `.env` file.\n\n## See also\n\n- Learn more about Terraform's dependency on [Azure CLI](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/azure_cli). \n- For more on remote state, see [store Terraform state in Azure Storage](../terraform/store-state-in-azure-storage.md).\n- Template: [React Web App with Node.js API and MongoDB (Terraform) on Azure](https://github.com/Azure-Samples/todo-nodejs-mongo-terraform)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure Developer CLI FAQ](./tooling-environment-faq.md)\n"
  },
  {
    "path": "articles/azure-developer-cli/work-with-environments.md",
    "content": "---\ntitle: Work with Environments in Azure Developer CLI\ndescription: Learn how to create, manage, and switch between different environments using Azure Developer CLI (azd).\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 08/04/2025\nms.service: azure-dev-cli\nms.topic: how-to\nms.custom: devx-track-azdevcli, build-2023\n---\n\n# Work with Azure Developer CLI environments\n\nThe Azure Developer CLI (`azd`) helps you create and manage [Environments](environments-overview.md) with their own configurations, such as dev, test, and prod. This article shows how to create and manage environments, and how to use them with your Bicep infrastructure files.\n\n## Create environments\n\nCreate a new environment using the `azd env new` command:\n\n```azdeveloper\nazd env new <environment-name>\n```\n\nFor example, to create a development environment:\n\n```azdeveloper\nazd env new dev\n```\n\nWhen you run a command such as `azd up` or `azd deploy`, `azd` prompts you to select an Azure subscription and location for the new environment. Prompt settings are stored in the new environment `.env` or `config.json` files.\n\nYou can also specify subscription and location directly in the command:\n\n```azdeveloper\nazd env new prod --subscription \"My Production Subscription\" --location eastus2\n```\n\n## List environments\n\nTo see all available environments for your project, use:\n\n```azdeveloper\nazd env list\n```\n\nThis command displays all the environments you created, highlighting the current active environment:\n\n```output\nNAME      DEFAULT   LOCAL     REMOTE\ndev       true      true      false\ntest      false     true      false\nprod      false     true      false\n```\n\n## Switch between environments\n\nTo switch to a different environment, use the `azd env select` command:\n\n```azdeveloper\nazd env select <environment-name>\n```\n\nFor example, to switch to a production environment:\n\n```azdeveloper\nazd env select prod\n```\n\n> [!NOTE]\n> This command changes your active environment, which affects subsequent `azd` commands like `provision` or `deploy`.\n\n## Understand the default environment\n\nThe global configuration file `.azure/config.json` keeps track of your currently selected environment. When you run `azd init` and no environments exist yet, `azd` automatically creates your first environment and sets it as the default. If you already have one or more environments and run `azd env new <name>`, `azd` prompts you to choose whether to make the new environment the default. If you decline, the new environment is created but your current selection remains unchanged.\n\nYou can temporarily override the default environment for a single command by using the `--environment` flag. Using this flag doesn't change the default for future commands.\n\n## Refresh environment settings\n\nYou can refresh your local environment variables using the `azd env refresh` command. This command locates the most recent Azure deployment for your app, retrieves the environment variable values by name, and then updates your local `.env` file with those latest values for the select environment. For example, if you provisioned both a `dev` and `prod` version, and you currently have the `dev` environment selected, it retrieves the latest output from that deployment to populate the .env file.\n\n```azdeveloper\nazd env refresh\n```\n\n> [!NOTE]\n> The `azd env refresh` command doesn't redeploy resources. It only updates your local environment configuration to match the current state in Azure.\n\nRefreshing your environment is useful when:\n\n- You want to ensure your local `.env` file reflects the latest outputs from your infrastructure (like connection strings, endpoints, etc.).\n- You need to sync environment variables after a teammate updated the environment.\n\nIf other team members made changes to environment configurations, or if you made changes through the Azure portal, you can refresh your local environment settings with:\n\n## Run commands in specific environments\n\nYou can run many `azd` commands in a specific environment without changing your active environment by using the `--environment` or `-e` flag:\n\n```azdeveloper\nazd up --environment dev\n```\n\nThis command runs the `up` workflow (provision and deploy) in the `dev` environment without changing your active environment.\n\nAlternatively, you can first switch to your intended environment:\n\n```azdeveloper\nazd env select test\nazd up\n```\n\n> [!NOTE]\n> Teams should consider using CICD pipelines via the `azd pipeline config` command, rather than direct deployments using commands such as `azd up` or `azd provision`.\n\n## Delete environment resources\n\nTo delete the Azure resources for a specific environment, using the `azd down` command:\n\n```azdeveloper\nazd down <environment-name>\n```\n\n> [!NOTE]\n> It's currently not possible to delete or rename `azd` environments directly using commands. If you need to rename an environment:\n>\n> - Use `azd down` to delete the environment resources.\n> - Run `azd env new <new-name>` to create the new environment.\n> - Manually delete the old `.env` folder from `.azure`.\n\n## Use the environment name in infrastructure files\n\nYou can use the `AZURE_ENV_NAME` variable from your environment's `.env` file to customize your infrastructure deployments in Bicep. This is useful for naming, tagging, or configuring resources based on the current environment.\n\n> [!NOTE]\n> Visit the [Work with environment variables](manage-environment-variables.md) to learn more about how to use environment variables to configure your Azure Developer CLI projects.\n\n1. `azd` sets the `AZURE_ENV_NAME` environment variable when you initialize a project.\n\n    ```output\n    AZURE_ENV_NAME=dev\n    ```\n\n1. In your `main.parameters.json` file, reference the environment variable so `azd` substitutes its value:\n\n    ```json\n    {\n      \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#\",\n      \"contentVersion\": \"1.0.0.0\",\n      \"parameters\": {\n        \"environmentName\": {\n          \"value\": \"${AZURE_ENV_NAME}\"\n        }\n      }\n    }\n    ```\n\n    When you deploy with `azd`, the value from `.env` is passed to your Bicep file from `main.parameters.json`.\n\n1. In your Bicep template, define a parameter for the environment name:\n\n    ```bicep\n    param environmentName string\n    ```\n\n1. You can use the `environmentName` parameter to tag resources, making it easy to identify which environment a resource belongs to:\n\n    ```bicep\n    param environmentName string\n    \n    resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {\n      name: 'mystorage${uniqueString(resourceGroup().id)}'\n      location: resourceGroup().location\n      sku: {\n        name: 'Standard_LRS'\n      }\n      kind: 'StorageV2'\n      tags: {\n        Environment: environmentName\n        Project: 'myproject'\n      }\n    }\n    ```\n\nThis approach helps with resource management, cost tracking, and automation by associating each resource with its deployment environment.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Manage environment variables in Azure Developer CLI](manage-environment-variables.md)\n\n> [!div class=\"nextstepaction\"]\n> [Customize your Azure Developer CLI workflows using hooks](azd-extensibility.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/TOC.yml",
    "content": "- name: Azure MCP Server\n  href: index.yml\n\n- name: Overview\n  href: overview.md\n- name: Get started\n  expanded: true\n  items:\n    - name: Get started with Azure MCP Server\n      href: get-started.md\n    - name: Code editors and tools\n      expanded: true\n      items:\n      - name: Visual Studio Code\n        href: get-started/tools/visual-studio-code.md\n      - name: Visual Studio\n        href: get-started/tools/visual-studio.md\n      - name: Eclipse\n        href: get-started/tools/eclipse.md\n      - name: Cursor\n        href: get-started/tools/cursor.md\n      - name: Windsurf\n        href: get-started/tools/windsurf.md\n      - name: IntelliJ\n        href: get-started/tools/jet-brains.md\n      - name: Cline\n        href: get-started/tools/cline.md\n    - name: Languages and frameworks\n      expanded: true\n      items:\n      - name: Python\n        href: get-started/languages/python.md\n      - name: .NET\n        href: get-started/languages/dotnet.md\n- name: Concepts\n  href: concepts.md\n- name: How to\n  expanded: true\n  items:\n    - name: Connect\n      expanded: true\n      items:\n      - name: GitHub Copilot coding agent\n        href: how-to/github-copilot-coding-agent.md\n      - name: GitHub Copilot CLI\n        href: how-to/github-copilot-cli.md\n      - name: GitHub Copilot SDK\n        href: how-to/github-copilot-sdk.md\n      - name: Azure MCP Server to sovereign clouds\n        href: how-to/connect-sovereign-clouds.md\n- name: Self-host\n  expanded: true\n  items:\n    - name: Azure Container Apps with Microsoft Foundry\n      href: how-to/deploy-remote-mcp-server-microsoft-foundry.md\n    - name: Azure Container Apps with Copilot Studio\n      href: how-to/deploy-remote-mcp-server-copilot-studio.md\n    - name: Azure Container Apps with on-behalf-of authentication\n      href: how-to/deploy-remote-mcp-server-on-behalf-of.md\n- name: Use with Azure services\n  expanded: true\n  items:\n    - name: Azure App Service\n      href: services/azure-mcp-server-for-app-service.md\n    - name: Azure Functions\n      href: services/azure-mcp-server-for-functions.md\n    - name: Azure Key Vault\n      href: services/azure-mcp-server-for-key-vault.md\n    - name: Azure Redis\n      href: services/azure-mcp-server-for-redis.md\n    - name: Azure AI Search\n      href: services/azure-mcp-server-for-search.md\n    - name: Azure Speech in Foundry Tools\n      href: services/azure-mcp-speech-foundry-tools.md\n- name: Tools\n  expanded: true\n  items:\n    - name: Overview\n      href: tools/index.md\n    - name: Best practices\n      items: \n      - name: Azure best practices\n        href: tools/azure-best-practices.md\n      - name: Azure Well-Architected Framework\n        href: tools/azure-well-architected-framework.md\n      - name: Terraform best practices for Azure\n        href: tools/azure-terraform-best-practices.md\n    - name: Azure Advisor\n      href: tools/azure-advisor.md\n    - name: Application Insights\n      href: tools/application-insights.md\n    - name: Microsoft Foundry\n      href: tools/azure-foundry.md\n    - name: Azure AI Search\n      href: tools/azure-ai-search.md\n    - name: Azure Speech in Foundry Tools\n      href: tools/ai-services-speech.md\n    - name: Azure App Configuration\n      href: tools/app-configuration.md\n    - name: Azure App Lens\n      href: tools/azure-app-lens.md\n    - name: Azure App Service\n      href: tools/azure-app-service.md\n    - name: Azure Bicep schema\n      href: tools/azure-bicep-schema.md\n    - name: Azure CLI\n      href: tools/azure-cli.md\n    - name: Azure Cloud Architect\n      href: tools/azure-cloud-architect.md\n    - name: Azure Communication Services\n      href: tools/azure-communication.md\n    - name: Azure Confidential Ledger\n      href: tools/azure-confidential-ledger.md\n    - name: Azure Compute\n      href: tools/azure-compute.md\n    - name: Azure Container Apps\n      href: tools/azure-container-apps.md\n    - name: Azure Container Registry\n      href: tools/azure-container-registry.md\n    - name: Azure Cosmos DB\n      href: tools/azure-cosmos-db.md\n    - name: Azure Data Explorer\n      href: tools/azure-data-explorer.md\n    - name: Azure Database for MySQL\n      href: tools/azure-mysql.md\n    - name: Azure Database for PostgreSQL\n      href: tools/azure-database-postgresql.md\n    - name: Azure Deploy\n      href: tools/azure-deploy.md\n    - name: Azure Developer CLI\n      href: tools/azure-cli.md\n    - name: Azure Event Grid\n      href: tools/azure-event-grid.md\n    - name: Azure Event Hubs\n      href: tools/azure-event-hubs.md\n    - name: Azure Files\n      href: tools/azure-file-shares.md\n    - name: Azure File Sync\n      href: tools/azure-file-sync.md\n    - name: Azure Functions\n      href: tools/azure-functions.md\n    - name: Azure Key Vault\n      href: tools/azure-key-vault.md\n    - name: Azure Kubernetes Service\n      href: tools/azure-kubernetes.md\n    - name: Azure Load Testing\n      href: tools/azure-load-testing.md\n    - name: Azure Managed Grafana\n      href: tools/azure-grafana.md\n    - name: Azure Managed Lustre\n      href: tools/azure-managed-lustre.md\n    - name: Azure Marketplace\n      href: tools/azure-marketplace.md\n    - name: Azure MCP tool\n      href: tools/azure-mcp-tool.md\n    - name: Azure Migrate\n      href: tools/azure-migrate.md\n    - name: Azure Monitor\n      href: tools/azure-monitor.md\n    - name: Azure Native ISV\n      href: tools/azure-native-isv.md\n    - name: Azure Policy\n      href: tools/azure-policy.md\n    - name: Azure Pricing\n      href: tools/azure-pricing.md\n    - name: Azure Quick Review CLI\n      href: tools/azure-compliance-quick-review.md\n    - name: Azure Quotas\n      href: tools/azure-quotas.md\n    - name: Azure RBAC\n      href: tools/azure-rbac.md\n    - name: Azure Redis\n      href: tools/azure-redis.md    \n    - name: Azure Resource Health\n      href: tools/azure-resource-health.md\n    - name: Azure Service Bus\n      href: tools/azure-service-bus.md\n    - name: Azure Service Fabric\n      href: tools/azure-service-fabric.md\n    - name: Azure SignalR\n      href: tools/azure-signalr.md\n    - name: Azure SQL\n      href: tools/azure-sql.md\n    - name: Azure Storage\n      href: tools/azure-storage.md\n    - name: Azure Virtual Desktop\n      href: tools/azure-virtual-desktop.md\n    - name: Resource Group\n      href: tools/resource-group.md\n    - name: Subscription\n      href: tools/subscription.md\n\n- name: Resources\n  items:\n- name: Azure MCP Server GitHub repository\n  href: https://github.com/microsoft/mcp/tree/main/servers/Azure.Mcp.Server\n- name: Model Context Protocol documentation\n  href: https://modelcontextprotocol.io/\n- name: Authentication guidance\n  href: overview.md\n- name: Tool reference\n  href: tools/index.md\n- name: Troubleshooting\n  href: https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/TROUBLESHOOTING.md\n\n"
  },
  {
    "path": "articles/azure-mcp-server/azure-mcp-zone-pivot-groups.yml",
    "content": "# YamlMime:ZonePivotGroups\ngroups:\n- id: azure-mcp-server-tools-frameworks\n  title: Tool or framework\n  prompt: Choose a tool or framework\n  pivots:\n  - id: mcp-github-copilot\n    title: GitHub Copilot in Visual Studio Code\n  - id: mcp-csharp\n    title: .NET\n  - id: mcp-python\n    title: Python\n"
  },
  {
    "path": "articles/azure-mcp-server/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: Azure MCP Server\n      tocHref: /azure\n      topicHref: /azure/developer/azure-mcp-server/TOC\n"
  },
  {
    "path": "articles/azure-mcp-server/concepts.md",
    "content": "---\ntitle: Azure MCP Server concepts\ndescription: Learn key concepts for working with Azure MCP Server, including multi-service workflows, error handling, optimization, and common use cases.\nms.date: 01/26/2026\nms.topic: concept-article\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-generated\nms.custom: build-2025\n---\n\n# Azure MCP Server concepts\n\nThis article explains essential concepts for effectively using the Azure MCP Server, including how to work with multiple Azure services, handle errors, optimize performance, and apply common patterns for real-world scenarios.\n\n## Multi-service workflows\n\nThe Azure MCP Server can orchestrate operations across multiple Azure services in a single conversation or workflow. This capability enables you to chain operations across services like Azure Storage, Azure Cosmos DB, and Azure Key Vault without switching contexts.\n\n### Server modes for multi-service operations\n\nThe Azure MCP Server supports different modes that affect how tools are exposed and how you interact with multiple services:\n\n#### Namespace mode (default)\n\nNamespace mode groups tools by Azure service, exposing one tool per service namespace. This mode provides a balanced approach for multi-service workflows.\n\n```json\n{\n  \"mcpServers\": {\n    \"Azure MCP Server\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@azure/mcp@latest\", \"server\", \"start\"]\n    }\n  }\n}\n```\n\nWith namespace mode, you can make requests like:\n- \"List my storage accounts and then show me the containers in the first account\"\n- \"Get secrets from my key vault and use them to connect to my Cosmos DB database\"\n\n#### Consolidated mode (recommended for AI agents)\n\nConsolidated mode groups related operations into curated tools optimized for AI agents. This mode provides the best balance between functionality and usability.\n\n```json\n{\n  \"mcpServers\": {\n    \"Azure MCP Server\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@azure/mcp@latest\", \"server\", \"start\", \"--mode\", \"consolidated\"]\n    }\n  }\n}\n```\n\nConsolidated tools are named after user intents, for example `get_azure_databases_details`, making them more intuitive for natural language interactions.\n\nFor a complete list of available server modes and their configurations, see the [troubleshooting guide](https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/TROUBLESHOOTING.md#vs-code-only-shows-a-subset-of-tools-available).\n\n#### All mode\n\nThe `all` mode exposes 200+ individual tools separately. This mode is useful when you need granular control but can exceed tool limits in some clients.\n\n```json\n{\n  \"mcpServers\": {\n    \"Azure MCP Server\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@azure/mcp@latest\", \"server\", \"start\", \"--mode\", \"all\"]\n    }\n  }\n}\n```\n\n### Chaining operations across services\n\nYou can chain operations across multiple Azure services in a single conversation. For example, you can:\n\n1. Query Azure Key Vault for database credentials\n1. Use those credentials to connect to Azure Cosmos DB\n1. Query data from Cosmos DB\n1. Store results in Azure Storage\n\nExample prompts that chain operations across services include:\n- \"Get the database connection string from key vault 'my-vault', connect to the database, and list the collections\"\n- \"List all storage accounts in my subscription, then for each account show me the containers\"\n- \"Create a new storage container and upload the contents of my key vault secret to a blob\"\n\n### Filtering tools by service\n\nYou can configure the Azure MCP Server to expose only specific services using the `--namespace` option. This approach is useful for focused workflows or when working with multiple MCP server instances.\n\n```json\n{\n  \"mcpServers\": {\n    \"Azure Storage\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@azure/mcp@latest\", \"server\", \"start\", \"--namespace\", \"storage\"]\n    },\n    \"Azure KeyVault\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@azure/mcp@latest\", \"server\", \"start\", \"--namespace\", \"keyvault\"]\n    }\n  }\n}\n```\n\nThis configuration creates separate MCP server instances for Storage and Key Vault, allowing you to organize tools by domain or project requirements.\n\n## Error handling and retry logic\n\nThe Azure MCP Server handles various error scenarios that can occur when interacting with Azure services. Understanding these patterns helps you troubleshoot issues and build resilient workflows.\n\n### Authentication errors\n\nAuthentication is a common source of errors when working with Azure resources.\n\n#### 401 Unauthorized errors\n\nA 401 error indicates that the access token is invalid or missing. This error can occur when:\n\n- Local authorization (access keys) is disabled on the resource\n- The authentication token has expired\n- No valid credentials are available\n\n**Resolution approaches:**\n- Verify that you're authenticated to Azure using `az login` or your preferred authentication method\n- Check that the resource allows the authentication method you're using\n- For resources with access keys disabled, ensure you have appropriate Role-Based Access Control (RBAC) permissions\n\n#### 403 Forbidden errors\n\nA 403 error indicates that the authenticated user doesn't have sufficient permissions to access the requested resource.\n\n**Common causes:**\n- Missing RBAC permissions at the resource group or subscription level\n- Wrong subscription or tenant context\n- Using an unintended account when multiple accounts are signed in\n\n**Resolution approaches:**\n- Verify RBAC permissions are assigned at the correct scope\n- Specify the subscription and tenant explicitly in your prompts: \"List all my storage accounts in subscription `subscription-name`, located in tenant `tenant-name`\"\n- Set the `AZURE_MCP_ONLY_USE_BROKER_CREDENTIAL` environment variable to `true` to prompt for account selection\n\n### Network and firewall restrictions\n\nEnterprise environments often have network controls that can affect Azure MCP Server connectivity.\n\n**Required endpoints for authentication:**\n- `login.microsoftonline.com:443`\n- `login.windows.net:443`\n- `management.azure.com:443`\n- `graph.microsoft.com:443`\n\n**Resource-specific endpoints** depend on the Azure services you're using, for example:\n- Azure Storage: `*.blob.core.windows.net:443`\n- Azure Key Vault: `*.vault.azure.net:443`\n- Azure Cosmos DB: `*.documents.azure.com:443`\n\nIf you're behind a corporate proxy, configure proxy settings using environment variables:\n\n```bash\nexport HTTP_PROXY=http://proxy.company.com:8080\nexport HTTPS_PROXY=http://proxy.company.com:8080\nexport NO_PROXY=localhost,127.0.0.1\n```\n\n### Transient failures\n\nThe Azure MCP Server relies on Azure SDKs, which have built-in retry logic for transient failures. These SDKs automatically handle:\n\n- Network connectivity issues\n- Service throttling and rate limits\n- Temporary service unavailability\n\nThe retry policies use exponential backoff to avoid overwhelming services during high load or incident scenarios.\n\n### Error messages and diagnostics\n\nWhen errors occur, the Azure MCP Server provides detailed error messages to help you understand and resolve issues. For comprehensive troubleshooting guidance, see the [troubleshooting guide](https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/TROUBLESHOOTING.md).\n\n## Optimization tips\n\nOptimizing your Azure MCP Server configuration improves performance, reduces token usage, and enhances the user experience.\n\n### Managing tool counts\n\nSome MCP clients have limits on the number of tools they can handle. For example, Visual Studio Code Copilot has a 128-tool limit per request.\n\n#### Use consolidated mode\n\nConsolidated mode provides full functionality while staying well under client tool limits:\n\n```json\n{\n  \"mcpServers\": {\n    \"Azure MCP\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@azure/mcp@latest\", \"server\", \"start\", \"--mode\", \"consolidated\"]\n    }\n  }\n}\n```\n\nThis configuration exposes curated tools that group related operations, optimizing for both functionality and AI agent effectiveness.\n\n#### Use selective tool loading\n\nLoad only the tools you need for your specific workflow:\n\n```json\n{\n  \"mcpServers\": {\n    \"Azure Essentials\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@azure/mcp@latest\",\n        \"server\",\n        \"start\",\n        \"--tool\",\n        \"azmcp_subscription_list\",\n        \"--tool\",\n        \"azmcp_group_list\",\n        \"--tool\",\n        \"azmcp_storage_account_get\"\n      ]\n    }\n  }\n}\n```\n\n#### Use custom chat modes\n\nVisual Studio Code supports [custom chat modes](https://code.visualstudio.com/docs/copilot/chat/chat-modes#_custom-chat-modes) that let you configure different tool sets for different scenarios. This approach allows you to switch between tool configurations based on your current task while staying within client limits.\n\n### Token management\n\nEffective token management improves response times and reduces costs when using language models.\n\n#### Use specific prompts\n\nSpecific prompts reduce the number of tool calls and the amount of context needed:\n\n**Less effective:**\n- \"Tell me about my Azure resources\"\n\n**More effective:**\n- \"List storage accounts in subscription 'my-subscription' in resource group 'my-rg'\"\n- \"Show me the connection string for storage account 'mystorageaccount'\"\n\n#### Scope operations appropriately\n\nWhen possible, scope operations to specific resources or resource groups rather than querying entire subscriptions:\n\n**Less efficient:**\n- \"List all resources in my subscription and filter for storage accounts\"\n\n**More efficient:**\n- \"List storage accounts in resource group 'production-rg'\"\n\n### Batch operations\n\nThe Azure MCP Server supports batch operations for certain scenarios. When working with multiple resources:\n\n**Sequential operations:**\n```\nList storage accounts, then for each one show the containers\n```\n\n**Parallel operations when appropriate:**\n```\nGet details for storage accounts 'account1', 'account2', and 'account3'\n```\n\nThe Azure MCP Server and underlying Azure SDKs handle batching automatically when appropriate, optimizing network calls and reducing latency.\n\n### Caching and reuse\n\nThe Azure MCP Server maintains connection state during a session. To optimize performance:\n\n- Keep MCP server instances running rather than starting and stopping frequently\n- Reuse subscription and resource group information in subsequent queries\n- Cache resource details in your workflow when you need to reference them multiple times\n\n## Common use cases\n\nThe Azure MCP Server supports a wide range of real-world scenarios. This section provides examples of common patterns and workflows.\n\n### Deploying a new service\n\nWhen deploying a new Azure service, you can use the Azure MCP Server to automate infrastructure setup and configuration:\n\n1. **Create resource group and resources:**\n   ```\n   Create a resource group called 'webapp-prod' in East US, \n   then create a storage account called 'webappdata' in that resource group\n   ```\n\n1. **Configure resources:**\n   ```\n   Get the storage account connection string and store it as a secret \n   in key vault 'webapp-kv' with name 'StorageConnectionString'\n   ```\n\n1. **Verify deployment:**\n   ```\n   List all resources in resource group 'webapp-prod' \n   and verify that the storage account and key vault exist\n   ```\n\n### Debugging a live site issue\n\nThe Azure MCP Server can help you diagnose and troubleshoot production issues:\n\n1. **Check resource health:**\n   ```\n   Check the health status of App Service 'my-webapp' \n   and list any recent service health incidents\n   ```\n\n1. **Query logs:**\n   ```\n   Query Application Insights for exceptions in the last hour \n   from application 'my-webapp'\n   ```\n\n1. **Inspect configuration:**\n   ```\n   Get the application settings for App Service 'my-webapp' \n   and check if the database connection string is configured correctly\n   ```\n\n1. **Check dependencies:**\n   ```\n   List the databases in SQL server 'my-sql-server' \n   and verify connectivity to database 'my-database'\n   ```\n\n### Managing secrets and configuration\n\nA common pattern involves managing secrets and configuration across environments:\n\n1. **Audit secrets:**\n   ```\n   List all secrets in key vault 'production-kv' \n   and show me which ones are expiring in the next 30 days\n   ```\n\n1. **Rotate secrets:**\n   ```\n   Generate a new connection string for storage account 'mystore', \n   update the secret 'StorageConnection' in key vault 'production-kv', \n   and restart App Service 'my-webapp'\n   ```\n\n1. **Sync configuration:**\n   ```\n   Get all key-value pairs from App Configuration 'my-appconfig' \n   with label 'production' and compare them to the staging environment\n   ```\n\n### Data operations across services\n\nThe Azure MCP Server excels at coordinating data operations across multiple services:\n\n1. **Extract, Transform, Load (ETL):**\n   ```\n   Get data from Cosmos DB container 'raw-data', \n   transform it using the provided logic, \n   and upload the results to blob container 'processed-data' \n   in storage account 'analytics'\n   ```\n\n1. **Backup and archival:**\n   ```\n   Export all documents from Cosmos DB container 'transactions' \n   and create a snapshot in blob storage with timestamp\n   ```\n\n1. **Cross-service queries:**\n   ```\n   Query Azure Data Explorer for events where error count is greater than 100, \n   then lookup the associated user data from Cosmos DB\n   ```\n\n### Infrastructure audit and compliance\n\nUse the Azure MCP Server to audit infrastructure and verify compliance:\n\n1. **Security audit:**\n   ```\n   List all storage accounts in my subscription \n   and check which ones don't have firewall rules configured\n   ```\n\n1. **Cost analysis:**\n   ```\n   List all SQL databases in my subscription, \n   show their pricing tiers, \n   and identify candidates for downgrading\n   ```\n\n1. **Resource tagging:**\n   ```\n   List all resources in subscription 'production-sub' \n   without an 'Environment' tag and show their resource groups\n   ```\n\n### Development and testing workflows\n\nDevelopers can use the Azure MCP Server to streamline development workflows:\n\n1. **Environment setup:**\n   ```\n   Create a development environment with a storage account, \n   key vault, and App Service in resource group 'dev-environment'\n   ```\n\n1. **Test data management:**\n   ```\n   Copy data from production storage container 'data' \n   to development storage container 'test-data', \n   anonymizing sensitive fields\n   ```\n\n1. **Configuration management:**\n   ```\n   Compare App Service settings between 'staging-webapp' \n   and 'production-webapp' and highlight differences\n   ```\n\n## Related content\n\n- [Get started using the Azure MCP Server](get-started.md)\n- [Azure MCP Server tools](./tools/index.md)\n- [Authentication guidance](https://github.com/microsoft/mcp/blob/main/docs/Authentication.md)\n- [Troubleshooting guide](https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/TROUBLESHOOTING.md)\n- [Azure MCP Server repository](https://github.com/microsoft/mcp/tree/main/servers/Azure.Mcp.Server)\n"
  },
  {
    "path": "articles/azure-mcp-server/get-started/languages/dotnet.md",
    "content": "---\ntitle: Get started using the Azure MCP Server with .NET\ndescription: Learn how to connect to and consume Azure MCP Server operations with .NET\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 02/27/2026\nms.topic: get-started\nms.custom: build-2025\n---\n\n# Get started using the Azure MCP Server with .NET\n\n[!INCLUDE [get-started-intro](../../includes/get-started-intro.md)]\nIn this article, you learn how to complete the following tasks:\n\n- Install and authenticate to the Azure MCP Server\n- Connect to Azure MCP Server using a custom .NET client\n- Run prompts to test Azure MCP Server operations and manage Azure resources\n\n## Prerequisites\n\n- An [Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) with an active subscription\n- [.NET 9.0](https://dotnet.microsoft.com/en-us/download) or higher installed\n- [Node.js](https://nodejs.org/) LTS installed\n\n[!INCLUDE [permissions-note](../../includes/permissions-note.md)]\n\n[!INCLUDE [sign-in-local-development](../../includes/sign-in-local-development.md)]\n\n## Create the .NET host app\n\nComplete the following steps to create a .NET console app. The app connects to an AI model and acts as a host for an MCP client that connects to an Azure MCP Server.\n\n### Create the project\n\n1. Open a terminal to an empty folder where you want to create the project.\n1. Run the following command to create a new .NET console application:\n\n   ```console\n   dotnet new console -n MCPHostApp\n   ```\n\n1. Navigate into the newly created project folder:\n\n   ```console\n   cd MCPHostApp\n   ```\n\n1. Open the project folder in your editor of choice, such as Visual Studio Code:\n\n    ```console\n    code .\n    ```\n\n## Add the dependencies\n\n1. In the terminal, run the following commands to add the necessary NuGet packages:\n\n   ```console\n   dotnet add package Azure.AI.OpenAI --prerelease\n   dotnet add package Azure.Identity\n   dotnet add package Microsoft.Extensions.AI --prerelease\n   dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease\n   dotnet add package ModelContextProtocol --prerelease\n   ```\n\n1. Verify that the packages were added by checking the `MCPHostApp.csproj` file.\n\n1. Run the following command to build the project and ensure everything is set up correctly:\n\n   ```console\n   dotnet build\n   ```\n\n### Add the app code\n\nReplace the contents of `Program.cs` with the following code:\n\n```csharp\nusing Azure.AI.OpenAI;\nusing Azure.Identity;\nusing Microsoft.Extensions.AI;\nusing ModelContextProtocol.Client;\n\n// Create an IChatClient\nIChatClient client =\n    new ChatClientBuilder(\n        new AzureOpenAIClient(new Uri(\"<your-azure-openai-endpoint>\"), \n        new DefaultAzureCredential())\n        .GetChatClient(\"gpt-4o\").AsIChatClient())\n    .UseFunctionInvocation()\n    .Build();\n\n// Create the MCP client\nvar mcpClient = await McpClient.CreateAsync(\n    new StdioClientTransport(new()\n    {\n        Command = \"npx\",\n        Arguments = [\"-y\", \"@azure/mcp@latest\", \"server\", \"start\"],\n        Name = \"Azure MCP\",\n    }));\n\n// Get all available tools from the MCP server\nConsole.WriteLine(\"Available tools:\");\nvar tools = await mcpClient.ListToolsAsync();\nforeach (var tool in tools)\n{\n    Console.WriteLine($\"{tool}\");\n}\nConsole.WriteLine();\n\n// Conversational loop that can utilize the tools\nList<ChatMessage> messages = [];\nwhile (true)\n{\n    Console.Write(\"Prompt: \");\n    messages.Add(new(ChatRole.User, Console.ReadLine()));\n\n    List<ChatResponseUpdate> updates = [];\n    await foreach (var update in client\n        .GetStreamingResponseAsync(messages, new() { Tools = [.. tools] }))\n    {\n        Console.Write(update);\n        updates.Add(update);\n    }\n    Console.WriteLine();\n\n    messages.AddMessages(updates);\n}\n```\n\nThe preceding code accomplishes the following tasks:\n\n- Initializes an `IChatClient` abstraction using the [`Microsoft.Extensions.AI`](/dotnet/ai/microsoft-extensions-ai) libraries.\n- Creates an MCP client to interact with the Azure MCP Server using a standard I/O transport. The provided `npx` command and corresponding arguments download and start the Azure MCP Server.\n- Retrieves and displays a list of available tools from the MCP server, which is a standard MCP function.\n- Implements a conversational loop that processes user prompts and utilizes the tools for responses.\n\n## Run and test the app\n\nComplete the following steps to test your .NET host app:\n\n1. In a terminal window open to the root of your project, run the following command to start the app:\n\n   ```console\n   dotnet run\n   ```\n\n1. Once the app is running, enter the following test prompt:\n\n   ```\n   List all of the resource groups in my subscription\n   ```\n\n      The output for the previous prompt should resemble the following text:\n    \n      ```output\n      The following resource groups are available for your subscription:\n    \n      1. **DefaultResourceGroup-EUS** (Location: `eastus`)\n      2. **rg-testing** (Location: `centralus`)\n      3. **rg-azd** (Location: `eastus2`)\n      4. **msdocs-sample** (Location: `southcentralus`)\n      14. **ai-testing** (Location: `eastus2`)\n      \n      Let me know if you need further details or actions related to any of these resource groups!\n      ```\n\n1. Explore and test the Azure MCP operations using other relevant prompts, such as:\n\n    ```\n    List all of the storage accounts in my subscription\n    Get the available tables in my storage accounts\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Azure MCP Server tools](../../tools/index.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/get-started/languages/python.md",
    "content": "---\ntitle: Get started using the Azure MCP Server with Python\ndescription: Learn how to connect to and consume Azure MCP Server operations with Python\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 12/11/2025\nms.topic: get-started\nms.custom: build-2025\n---\n\n# Get started using the Azure MCP Server with Python\n\n[!INCLUDE [get-started-intro](../../includes/get-started-intro.md)]\n\nIn this article, you learn how to complete the following tasks:\n\n- Install and authenticate to the Azure MCP Server\n- Connect to Azure MCP Server using a custom Python client\n- Run prompts to test Azure MCP Server operations and manage Azure resources\n\n## Prerequisites\n\n- An [Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) with an active subscription\n- [Python 3.9 or higher](https://www.python.org/downloads/) installed\n- [Node.js](https://nodejs.org/) LTS installed\n\n[!INCLUDE [permissions-note](../../includes/permissions-note.md)]\n\n[!INCLUDE [sign-in-local-development](../../includes/sign-in-local-development.md)]\n\n## Create the Python app\n\nComplete the following steps to create a Python app (host app). The app connects to an AI model and acts as a host for an MCP client that connects to an Azure MCP Server (local process running the MCP protocol).\n\n### Create the project\n\n1. Open an empty folder inside your editor of choice.\n1. Create a new file named `requirements.txt` and add the following library dependencies:\n\n    ```output\n    mcp\n    azure-identity\n    openai\n    logging\n    ```\n\n1. In the same folder, create a new file named `.env` and add the following environment variables:\n\n    ```output\n    AZURE_OPENAI_ENDPOINT=<your-azure-openai-endpoint>\n    AZURE_OPENAI_MODEL=<your-model-deployment-name>\n    ```\n\n1. Create an empty file named `main.py` to hold the code for your app.\n\n### Create the environment and install dependencies\n\n1. Open a terminal in your new folder and create a Python virtual environment for the app:\n\n    ```console\n    python -m venv venv\n    ```\n\n1. Activate the virtual environment:\n\n    ```console\n    venv\\Scripts\\activate\n    ```\n\n1. Install the dependencies from `requirements.txt`:\n\n   ```console\n   pip install -r requirements.txt\n   ```\n\n### Add the app code\n\nUpdate the contents of `main.py` with the following code:\n\n```python\nfrom azure.identity import DefaultAzureCredential, get_bearer_token_provider\nfrom openai import AzureOpenAI\nfrom mcp import ClientSession, StdioServerParameters, types\nfrom mcp.client.stdio import stdio_client\nimport json, os, logging, asyncio\nfrom dotenv import load_dotenv\n\n# Setup logging and load environment variables\nlogger = logging.getLogger(__name__)\nload_dotenv()\n\n# Azure OpenAI configuration\nAZURE_OPENAI_ENDPOINT = os.getenv(\"AZURE_OPENAI_ENDPOINT\")\nAZURE_OPENAI_MODEL = os.getenv(\"AZURE_OPENAI_MODEL\", \"gpt-4o\")\n\n# Initialize Azure credentials\ntoken_provider = get_bearer_token_provider(\n    DefaultAzureCredential(), \"https://cognitiveservices.azure.com/.default\"\n)\n\nasync def run():\n    # Initialize Azure OpenAI client\n    client = AzureOpenAI(\n            azure_endpoint=AZURE_OPENAI_ENDPOINT, \n            api_version=\"2024-04-01-preview\", \n            azure_ad_token_provider=token_provider\n        )\n\n    # MCP client configurations\n    server_params = StdioServerParameters(\n        command=\"npx\",\n        args=[\"-y\", \"@azure/mcp@latest\", \"server\", \"start\"],\n        env=None\n    )\n\n    async with stdio_client(server_params) as (read, write):\n        async with ClientSession(read, write) as session:\n            await session.initialize()\n\n            # List available tools\n            tools = await session.list_tools()\n            for tool in tools.tools: print(tool.name)\n\n            # Format tools for Azure OpenAI\n            available_tools = [{\n                \"type\": \"function\",\n                \"function\": {\n                    \"name\": tool.name,\n                    \"description\": tool.description,\n                    \"parameters\": tool.inputSchema\n                }\n            } for tool in tools.tools]\n\n            # Start conversational loop\n            messages = []\n            while True:\n                try:\n                    user_input = input(\"\\nPrompt: \")\n                    messages.append({\"role\": \"user\", \"content\": user_input})\n\n                    # First API call with tool configuration\n                    response = client.chat.completions.create(\n                        model = AZURE_OPENAI_MODEL,\n                        messages = messages,\n                        tools = available_tools)\n\n                    # Process the model's response\n                    response_message = response.choices[0].message\n                    messages.append(response_message)\n\n                    # Handle function calls\n                    if response_message.tool_calls:\n                        for tool_call in response_message.tool_calls:\n                                function_args = json.loads(tool_call.function.arguments)\n                                result = await session.call_tool(tool_call.function.name, function_args)\n\n                                # Add the tool response to the messages\n                                messages.append({\n                                    \"tool_call_id\": tool_call.id,\n                                    \"role\": \"tool\",\n                                    \"name\": tool_call.function.name,\n                                    \"content\": result.content,\n                                })\n                    else:\n                        logger.info(\"No tool calls were made by the model\")\n\n                    # Get the final response from the model\n                    final_response = client.chat.completions.create(\n                        model = AZURE_OPENAI_MODEL,\n                        messages = messages,\n                        tools = available_tools)\n\n                    for item in final_response.choices:\n                        print(item.message.content)\n                except Exception as e:\n                    logger.error(f\"Error in conversation loop: {e}\")\n                    print(f\"An error occurred: {e}\")\n\nif __name__ == \"__main__\":\n    import asyncio\n    asyncio.run(run())\n```\n\nThe preceding code accomplishes the following tasks:\n\n- Sets up logging and loads environment variables from a `.env` file.\n- Configures Azure OpenAI client using `azure-identity` and `openai` libraries.\n- Initializes an MCP client to interact with the Azure MCP Server (local process) using a standard I/O transport.\n- Retrieves and displays a list of available tools (MCP-registered Azure operations) from the Azure MCP Server.\n- Implements a conversational loop to process user prompts, utilize tools, and handle tool calls.\n\n**Configuration parameters:**\n\n| Parameter | Description | Example |\n|-----------|-------------|----------|\n| `AZURE_OPENAI_ENDPOINT` | Your Azure OpenAI service endpoint | `https://your-resource.openai.azure.com/` |\n| `AZURE_OPENAI_MODEL` | Model deployment name | `gpt-4o` |\n| **Token scope** | Azure Cognitive Services OAuth scope | `https://cognitiveservices.azure.com/.default` |\n| **Authentication** | Uses `DefaultAzureCredential` (Azure CLI, managed identity, or other credential chain) | See [Azure Identity documentation](/python/api/azure-identity/azure.identity.defaultazurecredential) |\n| **Required RBAC** | Cognitive Services User role or equivalent on the Azure OpenAI resource | Assigned through Azure portal or CLI |\n\n\n## Run and test the app\n\nComplete the following steps to test your Python app:\n\n1. In a terminal window open to the root of your project, run the following command to start the app:\n\n   ```console\n   python main.py\n   ```\n\n   **Success verification**: The app should display a list of available Azure MCP Server tools, then show a `Prompt:` input.\n\n1. Once the app is running, enter the following test prompt:\n\n   ```\n   List all of the resource groups in my subscription\n   ```\n\n      The output for the previous prompt should resemble the following text:\n    \n      ```output\n      The following resource groups are available for your subscription:\n    \n      1. **DefaultResourceGroup-EUS** (Location: `eastus`)\n      2. **rg-testing** (Location: `centralus`)\n      3. **rg-azd** (Location: `eastus2`)\n      4. **msdocs-sample** (Location: `southcentralus`)\n      14. **ai-testing** (Location: `eastus2`)\n      \n      Let me know if you need further details or actions related to any of these resource groups!\n      ```\n\n1. Explore and test the Azure MCP operations using other relevant prompts, such as:\n\n    ```\n    List all of the storage accounts in my subscription\n    Get the available tables in my storage accounts\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Azure MCP Server tools](../../tools/index.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/get-started/tools/cline.md",
    "content": "---\ntitle: Get started using the Azure MCP Server with Cline\ndescription: Learn how to connect to and consume Azure MCP Server operations with Cline\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 02/27/2026\nms.topic: get-started\nms.custom: build-2025\n---\n\n# Get started with the Azure MCP Server in Cline\n\n[!INCLUDE [get-started-intro](../../includes/get-started-intro.md)]\n\nIn this article, you learn how to complete the following tasks:\n\n- Install and authenticate to the Azure MCP Server\n- Connect to Azure MCP Server using Cline's AI-powered assistant\n- Run prompts to test Azure MCP Server operations and interact with Azure resources\n\n## Prerequisites\n\n- An [Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) with an active subscription\n- [Cline](https://cline.bot/) installed\n- [Node.js](https://nodejs.org/) LTS installed\n\n## Install the Azure MCP Server\n\nTo install and configure the Azure MCP Server in Cline:\n\n1. Open the **Cline** panel in your editor.\n1. Select **Manage MCP Servers** to open the **MCP Servers** flyout, and then select the **Settings** icon.\n\n    :::image type=\"content\" source=\"../../media/cline-add-server.png\" alt-text=\"A screenshot showing how to add an MCP Server in Cline.\":::\n\n1. On the **MCP Servers** section of the panel, select **Configure MCP Servers** to open the `cline_mcp_settings.json` file for editing.\n1. Add the following configuration to the `mcpServers` JSON object:\n\n    ```json\n    \"Azure MCP Server\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@azure/mcp@latest\",\n        \"server\",\n        \"start\"\n      ]\n    }\n    ```\n\n    :::image type=\"content\" source=\"../../media/cline-configure-server.png\" alt-text=\"A screenshot showing how to configure an MCP Server in Cline.\":::\n\n1. Select **Done** to close the configuration panel and return to the chat interface.\n\n[!INCLUDE [authentication-guidance](../../includes/authentication-guidance.md)]\n\n## Use prompts to test the Azure MCP Server\n\n1. On the Cline chat panel, enter a prompt that utilizes Azure MCP Server capabilities, such as:\n\n    ```text\n    List my Azure storage accounts\n    ```\n\n1. If you're prompted to authenticate to Azure, run the suggested auth tool to sign-in through the browser.\n\n    > [!NOTE]\n    > Cline doesn't prompt you to sign in to Azure if you're already authenticated via other local tooling such as the Azure CLI.\n\n1. Cline prompts you to run a tool to retrieve the storage accounts, such as `storage account list`. Select **Run tool** to continue.\n\n    The output should resemble the following text:\n\n    ```output\n    The following resource groups are available for your subscription:\n\n    1. **DefaultResourceGroup-EUS** (Location: `eastus`)\n    2. **rg-testing** (Location: `centralus`)\n    3. **rg-azd** (Location: `eastus2`)\n    4. **msdocs-sample** (Location: `southcentralus`)\n    5. **ai-testing** (Location: `eastus2`)\n    \n    Let me know if you need further details or actions related to any of these resource groups!\n    ```\n\n1. Explore more Azure MCP operations using other relevant prompts, such as:\n\n    ```text\n    List all of the storage accounts in my subscription\n    Get the available tables in my storage accounts\n    Show me the configuration of my App Service instances\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Azure MCP Server tools](../../tools/index.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/get-started/tools/cursor.md",
    "content": "---\ntitle: Get started using the Azure MCP Server with Cursor\ndescription: Learn how to connect to and consume Azure MCP Server operations with Cursor\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 02/27/2026\nms.topic: get-started\nms.custom: build-2025\n---\n\n# Get started with the Azure MCP Server in Cursor\n\n[!INCLUDE [get-started-intro](../../includes/get-started-intro.md)]\n\nIn this article, you learn how to complete the following tasks:\n\n- Install and authenticate to the Azure MCP Server\n- Connect to Azure MCP Server using Cursor's AI-powered development environment\n- Run prompts to test Azure MCP Server operations and interact with Azure resources\n\n## Prerequisites\n\n- An [Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) with an active subscription\n- [Cursor](https://cursor.sh/) - The AI-powered code editor\n- [Node.js](https://nodejs.org/) LTS installed\n\n## Install the Azure MCP Server\n\nTo install and configure Azure MCP Server in Cursor:\n\n1. Navigate to **File > Preferences > Cursor Settings**\n1. Select **Tools & Integrations** from the left navigation.\n1. In the **MCP Tools** section of the page, select **New MCP Server** to open the `mcp.json` file for editing.\n\n    :::image type=\"content\" source=\"../../media/cursor-configure-mcp-server.png\" alt-text=\"A screenshot showing how to configure an MCP Server in Cursor.\":::\n\n1. Add the following configuration to the `mcpServers` JSON object:\n\n    ```json\n    \"Azure MCP Server\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@azure/mcp@latest\",\n        \"server\",\n        \"start\"\n      ]\n    }\n    ```\n\n[!INCLUDE [authentication-guidance](../../includes/authentication-guidance.md)]\n\n## Use prompts to test the Azure MCP Server\n\n1. Open Cursor's AI chat interface by pressing `Ctrl+L` or clicking the chat icon in the sidebar.\n2. Enter a prompt that utilizes Azure MCP Server capabilities, such as:\n\n    ```text\n    List my Azure storage accounts\n    ```\n\n3. If you're prompted to authenticate to Azure, run the suggested auth tool to sign-in through the browser.\n\n    > [!NOTE]\n    > Cursor doesn't prompt you to sign in to Azure if you're already authenticated via other local tooling such as the Azure CLI.\n\n4. Cursor prompts you to run a tool to retrieve the storage accounts, such as `storage account list`. Select **Run tool** to continue.\n\n    The output should resemble the following text:\n\n    ```output\n    The following resource groups are available for your subscription:\n\n    1. **DefaultResourceGroup-EUS** (Location: `eastus`)\n    2. **rg-testing** (Location: `centralus`)\n    3. **rg-azd** (Location: `eastus2`)\n    4. **msdocs-sample** (Location: `southcentralus`)\n    5. **ai-testing** (Location: `eastus2`)\n    \n    Let me know if you need further details or actions related to any of these resource groups!\n    ```\n\n5. Explore more Azure MCP operations using other relevant prompts, such as:\n\n    ```text\n    List all of the storage accounts in my subscription\n    Get the available tables in my storage accounts\n    Show me the configuration of my App Service instances\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Azure MCP Server tools](../../tools/index.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/get-started/tools/eclipse.md",
    "content": "---\ntitle: Get started using the Azure MCP Server with Eclipse\ndescription: Learn how to connect to and consume Azure MCP Server operations with Eclipse\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 02/27/2026\nms.topic: get-started\nms.custom: build-2025\n---\n\n# Get started with the Azure MCP Server in Eclipse\n\n[!INCLUDE [get-started-intro](../../includes/get-started-intro.md)]\n\nThis article covers:\n\n- Install and authenticate with Azure MCP Server\n- Connect to Azure MCP Server in Eclipse's AI development environment\n- Run prompts to test operations and interact with Azure resources\n\n## Prerequisites\n\n- [Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) with an active subscription\n- [Eclipse](https://www.eclipse.org/downloads/) - the AI-powered code editor\n- GitHub Copilot plugin\n\n[!INCLUDE [authentication-guidance](../../includes/authentication-guidance.md)]\n\n## Install Azure MCP Server\n\nInstall and configure Azure MCP Server in Eclipse:\n\n1. Go to **Help > Eclipse Marketplace**.\n1. Search for **Azure Toolkit** in the **Eclipse Marketplace** window.\n1. In the search results, select **Install** for Azure Toolkit.\n\n    :::image type=\"content\" source=\"../../media/eclipse-marketplace.png\" alt-text=\"Screenshot of the Eclipse Marketplace showing Azure Toolkit installation options.\":::\n\n    > [!NOTE]\n    > As part of the installation process, make sure both the **GitHub Copilot** and **GitHub Copilot – Nightly** plugins are updated to their latest versions.\n\n1. On the **Confirm Selected Features** window, check that **Azure MCP Server for Eclipse** is selected.\n1. Select **Confirm**, and wait for the plugin to install. Eclipse restarts when installation finishes.\n\n    :::image type=\"content\" source=\"../../media/eclipse-confirm-features.png\" alt-text=\"Screenshot of the Confirm Selected Features window with Azure MCP Server for Eclipse selected.\":::\n\n## Verify and test the Azure MCP Server\n\nAfter you install Azure Toolkit, approve Azure MCP Server registration in Copilot.\n\n1. In the Copilot chat pane, select the **Tools** icon and select **New MCP server found - approval needed**.\n\n    :::image type=\"content\" source=\"../../media/eclipse-tools-icon.png\" alt-text=\"Screenshot of Copilot chat pane Tools icon in Eclipse.\":::\n\n1. In the **Confirm MCP Server Registration** window, select the Azure MCP Server row and select **Approve**.\n\n    :::image type=\"content\" source=\"../../media/eclipse-confirm-registration.png\" alt-text=\"Screenshot of Confirm MCP Server Registration window with Azure MCP Server selected and Approve option.\":::\n\n1. In the Copilot chat pane, select the **Tools** icon again to open the preferences window.\n1. Check that Azure MCP Server for Eclipse shows in the **MCP Tools** section.\n\n    :::image type=\"content\" source=\"../../media/eclipse-mcp-tools.png\" alt-text=\"Screenshot of MCP Tools section showing Azure MCP Server for Eclipse listed.\":::\n\n\n## Use prompts to test the Azure MCP Server\n\n1. In the Copilot chat panel, enter a prompt that uses Azure MCP Server capabilities, such as the following.\n\n    ```text\n    List my Azure resource groups\n    ```\n\n    > [!NOTE]\n    > You can also ask Copilot to use Azure MCP Server tools directly with language like:\n    > *Use the Azure MCP Server to list my Azure resource groups.*\n\n1. When Eclipse prompts you to run the tool `azuremcp/group_list` to retrieve the resource groups, select **Continue**.\n\n    The output resembles the following text.\n\n    ```text\n    The following resource groups are available for your subscription:\n\n    1. **DefaultResourceGroup-EUS** (Location: `eastus`)\n    2. **rg-testing** (Location: `centralus`)\n    3. **rg-azd** (Location: `eastus2`)\n    4. **msdocs-sample** (Location: `southcentralus`)\n    5. **ai-testing** (Location: `eastus2`)\n    \n    Let me know if you need further details or actions related to any of these resource groups!\n    ```\n\n1. Explore more Azure MCP operations with prompts like the following.\n\n    ```text\n    List all storage accounts in my subscription\n    List available tables in my storage accounts\n    Show the configuration of my App Service instances\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure MCP Server tools](../../tools/index.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/get-started/tools/jet-brains.md",
    "content": "---\ntitle: Get started using the Azure MCP Server with IntelliJ\ndescription: Learn how to connect to and consume Azure MCP Server operations with IntelliJ\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 02/27/2026\nms.topic: get-started\n---\n\n# Get started with the Azure MCP Server in IntelliJ\n\n[!INCLUDE [get-started-intro](../../includes/get-started-intro.md)]\n\nIn this article, you learn how to complete the following tasks:\n\n- Install and authenticate to the Azure MCP Server\n- Connect to Azure MCP Server using IntelliJ's AI-powered tools\n- Run prompts to test Azure MCP Server operations and interact with Azure resources\n\n## Prerequisites\n\n- An [Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) with an active subscription\n- [IntelliJ](https://cursor.sh/) installed\n- [Node.js](https://nodejs.org/) LTS installed\n- [GitHub Copilot for IntelliJ](https://plugins.jetbrains.com/plugin/17718-github-copilot) extension installed\n\n## Install the Azure MCP Server\n\nTo install and configure Azure MCP Server in IntelliJ, choose one of the following options:\n\n### [Azure Toolkit for IntelliJ](#tab/azure-toolkit)\n\n1. Select the **IDE and Project Settings** gear icon, and then choose **Plugins..**.\n\n    :::image type=\"content\" source=\"../../media/jet-brains-install-plugins.png\" alt-text=\"A screenshot showing how to install plugins.\":::\n\n1. In the **Plugins** panel of the **Settings** dialog, search for *Azure ToolKit for IntelliJ*.\n1. Select the matching result, and then select **Install**.\n\n    :::image type=\"content\" source=\"../../media/jet-brains-install-azure-mcp-server.png\" alt-text=\"A screenshot showing how to install the Azure MCP Server plugin.\" lightbox=\"../../media/jet-brains-install-azure-mcp-server.png\":::\n\n    > [!NOTE]\n    > Azure MCP Server is only included with the Azure Toolkit for IntelliJ installation if you already have the [GitHub Copilot for IntelliJ](https://plugins.jetbrains.com/plugin/17718-github-copilot) plugin installed.\n\n### [Manual install](#tab/manual-install)\n\n1. Navigate to **File > Settings**.\n1. On the **Settings** dialog, select **Tools > AI Assistant > Model Context Protocol (MPC)**.\n1. Select the **+** icon to open the **New MCP Server** dialog.\n\n    :::image type=\"content\" source=\"../../media/jet-brains-configure-mcp-server.png\" alt-text=\"A screenshot showing how to configure an MCP Server in IntelliJ.\":::\n\n1. Enter the following values:\n    - **Name**: *Azure MCP Server*\n    - **Command**: *npx*\n    - **Arguments**: *-y @azure/mcp@latest server start*\n\n1. Leave the rest of the form fields blank, and select **OK** to close the dialog.\n\n---\n\n[!INCLUDE [authentication-guidance](../../includes/authentication-guidance.md)]\n\n## Use prompts to test the Azure MCP Server\n\n1. Select the **AI Chat** button on the right toolbar to open IntelliJ's AI assistant interface.\n1. Enter a prompt that utilizes Azure MCP Server capabilities, such as:\n\n    ```text\n    List my Azure storage accounts\n    ```\n\n1. IntelliJ prompts you to run a tool to retrieve the storage accounts, such as `storage account list`. Select **Run tool** to continue.\n\n    The output should resemble the following text:\n\n    ```output\n    The following resource groups are available for your subscription:\n\n    1. **DefaultResourceGroup-EUS** (Location: `eastus`)\n    2. **rg-testing** (Location: `centralus`)\n    3. **rg-azd** (Location: `eastus2`)\n    4. **msdocs-sample** (Location: `southcentralus`)\n    5. **ai-testing** (Location: `eastus2`)\n    \n    Let me know if you need further details or actions related to any of these resource groups!\n    ```\n\n1. Explore more Azure MCP operations using other relevant prompts, such as:\n\n    ```text\n    List all of the storage accounts in my subscription\n    Get the available tables in my storage accounts\n    Show me the configuration of my App Service instances\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Azure MCP Server tools](../../tools/index.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/get-started/tools/visual-studio-code.md",
    "content": "---\ntitle: Get started using the Azure MCP Server with Visual Studio Code\ndescription: Learn how to connect to and consume Azure MCP Server operations with Visual Studio Code\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 02/27/2026\nms.topic: get-started\nms.custom: build-2025\n---\n\n# Get started with the Azure MCP Server using Visual Studio Code\n\n[!INCLUDE [get-started-intro](../../includes/get-started-intro.md)]\n\nIn this article, you learn how to complete the following tasks:\n\n- Install and authenticate to the Azure MCP Server\n- Connect to Azure MCP Server using GitHub Copilot agent mode in Visual Studio Code\n- Run prompts to test Azure MCP Server operations and interact with Azure resources\n\n## Prerequisites\n\n- An [Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) with an active subscription\n- [Visual Studio Code](https://code.visualstudio.com/download)\n- [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) Visual Studio Code extension\n\n## Install the Azure MCP Server\n\nSelect one of the following options to install the Azure MCP Server in Visual Studio Code:\n\n## [Extension install](#tab/one-click)\n\n1. To install the [Azure MCP Server Extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), select the following link:\n\n    [![Install with NPX in Visual Studio Code](https://img.shields.io/badge/VS_Code-Install_Azure_MCP_Server-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](vscode:extension/ms-azuretools.vscode-azure-mcp-server)\n\n    > [!NOTE]\n    > Installing the Azure MCP Server as an extension ensures you receive the latest preview version and automatic updates.\n\n1. After you install the extension, open GitHub Copilot and select Agent Mode. To learn more about Agent Mode, visit the [Visual Studio Code Documentation](https://code.visualstudio.com/docs/copilot/chat/chat-agent-mode).\n1. Refresh the tools list to see Azure MCP Server as an available option:\n\n    :::image type=\"content\" source=\"../../media/github-copilot-integration.png\" alt-text=\"A screenshot showing Azure MCP Server as GitHub Copilot tool.\":::\n\n    > [!TIP]\n    > For an optimal Azure MCP Server experience, [install GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), which includes and uses the Azure MCP Server extension. GitHub Copilot for Azure streamlines your development workflow and enhances your productivity on the Azure platform.\n\n[!INCLUDE [authentication-guidance](../../includes/authentication-guidance.md)]\n\n## [Directory install](#tab/manual)\n\nYou can also manually install Azure MCP Server for a specific directory:\n\n1. Open an empty directory or an existing project directory in Visual Studio Code.\n1. At the root of the folder, create a `.vscode` folder if there isn't one already.\n1. Inside the `.vscode` folder, create a new file named `mcp.json` add the following JSON:\n\n    ```json\n    {\n      \"servers\": {\n        \"Azure MCP Server\": {\n          \"command\": \"npx\",\n          \"args\": [\n            \"-y\",\n            \"@azure/mcp@latest\",\n            \"server\",\n            \"start\"\n          ]\n        }\n      }\n    }\n    ```\n\n1. Save your changes to `mcp.json`.\n1. Open GitHub Copilot and select Agent Mode.\n1. Select the tools icon to view the available tools. Search for *Azure MCP Server* to filter the results.\n\n    :::image type=\"content\" source=\"../../media/github-copilot-integration.png\" alt-text=\"A screenshot showing Azure MCP Server as GitHub Copilot tool.\":::\n\n    To learn more about Agent Mode, visit the [Visual Studio Code Documentation](https://code.visualstudio.com/docs/copilot/chat/chat-agent-mode).\n\n---\n\n## Use prompts to test the Azure MCP Server\n\n1. Open GitHub Copilot and select Agent Mode.\n1. Enter a prompt that causes the agent to use Azure MCP Server tools, such as *List my Azure resource groups*.\n1. In order to authenticate Azure MCP Server, Copilot prompts you to sign-in to Azure using the browser.\n\n    > [!NOTE]\n    > Copilot won't prompt you to sign-in to Azure if you're already authenticated via other local tooling such as the Azure CLI.\n\n1. Copilot requests permission to run the necessary Azure MCP Server operation for your prompt. Select **Continue** or use the arrow to select a more specific behavior:\n    - **Current session** always runs the operation in the current GitHub Copilot Agent Mode session.\n    - **Current workspace** always runs the command for current Visual Studio Code workspace.\n    - **Always allow** sets the operation to always run for any GitHub Copilot Agent Mode session or any Visual Studio Code workspace.\n\n    :::image type=\"content\" source=\"../../media/run-command-prompt.png\" alt-text=\"A screenshot showing the options available to run Azure MCP Server operations.\":::\n\n    The output for the previous prompt should resemble the following text:\n\n    ```output\n    The following resource groups are available for your subscription:\n\n    1. **DefaultResourceGroup-EUS** (Location: `eastus`)\n    2. **rg-testing** (Location: `centralus`)\n    3. **rg-azd** (Location: `eastus2`)\n    4. **msdocs-sample** (Location: `southcentralus`)\n    14. **ai-testing** (Location: `eastus2`)\n    \n    Let me know if you need further details or actions related to any of these resource groups!\n    ```\n\n1. Explore and test the Azure MCP operations using other relevant prompts, such as:\n\n    ```\n    List all of the storage accounts in my subscription\n    Get the available tables in my storage accounts\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Azure MCP Server tools](../../tools/index.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/get-started/tools/visual-studio.md",
    "content": "---\ntitle: Get started using the Azure MCP Server with Visual Studio\ndescription: Learn how to connect to and consume Azure MCP Server operations with Visual Studio\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 02/27/2026\nms.topic: get-started\nms.custom: build-2025\nzone_pivot_group_filename: developer/pivots.yml\nzone_pivot_groups: pivot-visual-studio\n---\n\n# Get started with the Azure MCP Server using Visual Studio\n\n[!INCLUDE [get-started-intro](../../includes/get-started-intro.md)]\n\nIn this article, you learn how to complete the following tasks:\n\n- Install and authenticate to the Azure MCP Server.\n- Connect to Azure MCP Server using GitHub Copilot agent mode in Visual Studio.\n- Run prompts to test Azure MCP Server operations and interact with Azure resources.\n\n## Prerequisites\n\n- An [Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) with an active subscription\n- [Visual Studio](https://visualstudio.microsoft.com)\n- [.NET 10](https://dotnet.microsoft.com/download) OR [Node.js](https://nodejs.org/) LTS installed\n\n## Install the Azure MCP Server\n\n:::zone target=\"docs\" pivot=\"visual-studio-2022\"\n\nVisual Studio uses a file named `mcp.json` to check for MCP Server configurations, including configurations set up by other development environments. MCP server configurations are read from the following directories, in the following order:\n\n1. `%USERPROFILE%\\.mcp.json`: Serves as a global MCP server configuration for a specific user. Add an MCP server here to make it load for all Visual Studio solutions.\n1. `<SOLUTIONDIR>\\.vs\\mcp.json`: Specific to Visual Studio and only loads the specified MCP servers for a specific user, for the specified solution.\n1. `<SOLUTIONDIR>\\.mcp.json`: A solution-level MCP configuration that you can track in source control for a repo.\n1. `<SOLUTIONDIR>\\.vscode\\mcp.json`: Scoped to the repository/solution and typically not included in source control.\n1. `<SOLUTIONDIR>\\.cursor\\mcp.json`: Scoped to the repository/solution and typically not included in source control.\n\n> [!NOTE]\n> Some of these locations require .mcp.json while others require mcp.json.\n\nAzure MCP Server is available as a NuGet package or as an NPM package. The following options demonstrate two of the most common approaches to connect to Azure MCP Server from Visual Studio.\n\n> [!NOTE]\n> Alternatively, you can use the [GitHub Copilot for Azure](https://marketplace.visualstudio.com/items?itemName=github-copilot-azure.GitHubCopilotForAzure2022) extension to install Azure MCP\n\n## [Solution install](#tab/manual)\n\nComplete the following steps to install Azure MCP Server for a specific directory:\n\n1. Create a new file at the root of your solution named `.mcp.json`. Use Visual Studio to edit this file so that its JSON schema is automatically applied.\n1. Inside the `.mcp.json` file, add the following JSON for your preferred package:\n\n    NuGet:\n\n    ```json\n    {\n      \"servers\": {\n          \"Azure MCP Server\": {\n              \"command\": \"dnx\",\n              \"args\": [\n                  \"Azure.Mcp\",\n                  \"--source\",\n                  \"https://api.nuget.org/v3/index.json\",\n                  \"--yes\",\n                  \"--\",\n                  \"azmcp\",\n                  \"server\",\n                  \"start\"\n              ],\n              \"type\": \"stdio\"\n          }\n      }\n    }\n    ```\n\n    NPM:\n\n    ```json\n    {\n      \"servers\": {\n        \"Azure MCP Server\": {\n          \"command\": \"npx\",\n          \"args\": [\n            \"-y\",\n            \"@azure/mcp@latest\",\n            \"server\",\n            \"start\"\n          ]\n        }\n      }\n    }\n    ```\n\n1. Save your changes.\n1. Open GitHub Copilot and select Agent Mode.\n1. Select the tools icon to view the available tools. Search for *Azure MCP Server* to filter the results.\n\n## [Global install](#tab/one-click)\n\nComplete the following steps to globally add Azure MCP Server for all Visual Studio solutions for a specific user:\n\n1. Create a new file at `%USERPROFILE%\\.mcp.json`. Use Visual Studio to edit this file so that its JSON schema is automatically applied.\n1. Inside the `.mcp.json` file, add the following JSON for your preferred package:\n\n    NuGet:\n\n    ```json\n    {\n      \"servers\": {\n          \"Azure MCP Server\": {\n              \"command\": \"dnx\",\n              \"args\": [\n                  \"Azure.Mcp\",\n                  \"--source\",\n                  \"https://api.nuget.org/v3/index.json\",\n                  \"--yes\",\n                  \"--\",\n                  \"azmcp\",\n                  \"server\",\n                  \"start\"\n              ],\n              \"type\": \"stdio\"\n          }\n      }\n    }\n    ```\n\n    NPM:\n\n    ```json\n    {\n      \"servers\": {\n        \"Azure MCP Server\": {\n          \"command\": \"npx\",\n          \"args\": [\n            \"-y\",\n            \"@azure/mcp@latest\",\n            \"server\",\n            \"start\"\n          ]\n        }\n      }\n    }\n    ```\n\n1. Save your changes.\n1. Inside Visual Studio, Open GitHub Copilot and select Agent Mode.\n1. Select the tools icon to view the available tools. Search for *Azure MCP Server* to filter the results.\n\n---\n\n:::image type=\"content\" source=\"../../media/github-copilot-mcp-tools-visual-studio.png\" alt-text=\"A screenshot showing how to configure Azure MCP Server in Visual Studio.\":::\n\n:::zone-end\n\n:::zone target=\"docs\" pivot=\"visual-studio-2026\"\n\nVisual Studio 2026 includes Azure MCP Server tools with the Azure and AI development workload. To make them available:\n\n1. Open the Visual Studio Installer tool.\n1. Select **Modify** to view available workloads.\n1. On the **Workloads** tab, select **Azure and AI development**.\n1. On the **Installation details** panel, verify that **GitHub Copilot** is selected, which includes the following components:\n    - GitHub Copilot\n    - GitHub Copilot for Azure\n    - Azure MCP Server\n\n1. Select **Install while downloading** to complete the installation process.\n\n:::image type=\"content\" source=\"../../media/workload-install-copilot.png\" alt-text=\"A screenshot showing how to install Copilot using Visual Studio workloads.\" lightbox=\"../../media/workload-install-copilot.png\":::\n\n:::zone-end\n\n[!INCLUDE [authentication-guidance](../../includes/authentication-guidance.md)]\n\n## Use prompts to test the Azure MCP Server\n\n1. Open GitHub Copilot and select Agent Mode.\n1. Enter a prompt that causes the agent to use Azure MCP Server tools, such as *List my Azure resource groups*.\n1. In order to authenticate Azure MCP Server, Copilot prompts you to sign-in to Azure using the browser.\n\n    > [!NOTE]\n    > Copilot doesn't prompt you to sign-in to Azure if you're already authenticated via other local tooling such as the Azure CLI.\n\n1. Copilot requests permission to run the necessary Azure MCP Server operation for your prompt. Select **Allow this time** or use the arrow to select a more specific behavior:\n    - **Always allow** sets the operation to always run for any GitHub Copilot Agent Mode session or any Visual Studio Code workspace.\n    - **Allow in this session** always runs the operation in the current GitHub Copilot Agent Mode session.\n\n    :::image type=\"content\" source=\"../../media/github-copilot-run-command.png\" alt-text=\"A screenshot showing how to run Azure MCP Server tools in Visual Studio.\":::\n\n    The output for the previous prompt should resemble the following text:\n\n    ```output\n    The following resource groups are available for your subscription:\n    \n    1. **DefaultResourceGroup-EUS** (Location: `eastus`)\n    2. **rg-testing** (Location: `centralus`)\n    3. **rg-azd** (Location: `eastus2`)\n    4. **msdocs-sample** (Location: `southcentralus`)\n    5. **ai-testing** (Location: `eastus2`)\n    \n    Let me know if you need further details or actions related to any of these resource groups!\n    ```\n\n1. Explore and test the Azure MCP operations using other relevant prompts, such as:\n\n    ```\n    List all of the storage accounts in my subscription\n    Get the available tables in my storage accounts\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Azure MCP Server tools](../../tools/index.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/get-started/tools/windsurf.md",
    "content": "---\ntitle: Get started using the Azure MCP Server with Windsurf\ndescription: Learn how to connect to and consume Azure MCP Server operations with Windsurf\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 02/27/2026\nms.topic: get-started\nms.custom: build-2025\n---\n\n# Get started with the Azure MCP Server in Windsurf\n\n[!INCLUDE [get-started-intro](../../includes/get-started-intro.md)]\n\nIn this article, you learn how to complete the following tasks:\n\n- Install and authenticate to the Azure MCP Server\n- Connect to Azure MCP Server using Windsurf's AI-powered development environment\n- Run prompts to test Azure MCP Server operations and interact with Azure resources\n\n## Prerequisites\n\n- An [Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) with an active subscription\n- [Windsurf](https://codeium.com/windsurf) installed\n- [Node.js](https://nodejs.org/) LTS installed\n\n## Install the Azure MCP Server\n\nTo install and configure Azure MCP Server in Windsurf:\n\n1. Navigate to **File > Preferences > Windsurf Settings**.\n1. On the **Windsurf Settings** page, select **Manage MCPs**.\n\n    :::image type=\"content\" source=\"../../media/windsurf-configure-mcp-server.png\" alt-text=\"A screenshot showing how to configure an MCP Server in Windsurf.\":::\n\n1. On the **Manage MCP Servers** settings page, select **View raw config** at the top to open the `mcp_config.json` file for editing.\n1. The `mcp_config.json` file lets you manually install MCP Servers by adding a JSON configuration object. Update the `mcp_config.json` file to match the following:\n\n    ```json\n    {\n    \"mcpServers\": {\n          \"Azure MCP Server\": {\n            \"command\": \"npx\",\n            \"args\": [\n                \"-y\",\n                \"@azure/mcp@latest\",\n                \"server\",\n                \"start\"\n            ]\n        }\n        }\n    }\n    ```\n\n[!INCLUDE [authentication-guidance](../../includes/authentication-guidance.md)]\n\n## Use prompts to test the Azure MCP Server\n\n1. Open Windsurf's AI chat interface by pressing `Ctrl+L` or clicking the chat icon in the sidebar.\n2. Enter a prompt that utilizes Azure MCP Server capabilities, such as:\n\n    ```text\n    List my Azure storage accounts\n    ```\n\n3. If you're prompted to authenticate to Azure, run the suggested auth tool to sign-in through the browser.\n\n    > [!NOTE]\n    > Windsurf doesn't prompt you to sign in to Azure if you're already authenticated via other local tooling such as the Azure CLI.\n\n4. Windsurf prompts you to run a tool to retrieve the storage accounts, such as `storage account list`. Select **Run tool** to continue.\n\n    The output should resemble the following text:\n\n    ```output\n    The following resource groups are available for your subscription:\n\n    1. **DefaultResourceGroup-EUS** (Location: `eastus`)\n    2. **rg-testing** (Location: `centralus`)\n    3. **rg-azd** (Location: `eastus2`)\n    4. **msdocs-sample** (Location: `southcentralus`)\n    5. **ai-testing** (Location: `eastus2`)\n    \n    Let me know if you need further details or actions related to any of these resource groups!\n    ```\n\n5. Explore more Azure MCP operations using other relevant prompts, such as:\n\n    ```text\n    List all of the storage accounts in my subscription\n    Get the available tables in my storage accounts\n    Show me the configuration of my App Service instances\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Azure MCP Server tools](../../tools/index.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/get-started.md",
    "content": "---\ntitle: Get started with the Azure MCP Server\ndescription: Overview of the options for using the Azure MCP Server with tools and languages\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 03/27/2026\nms.topic: get-started\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.custom: build-2025\n---\n\n# Get started with the Azure MCP Server\n\nThe [Azure MCP Server](overview.md) enables AI-powered development tools to interact with Azure cloud services through the Model Context Protocol (MCP). It provides a unified way to manage Azure resources, deploy applications, and query cloud services directly from your development environment.\n\nConnect to Azure MCP Server using various tools, languages, and frameworks. Use it to manage Azure resources through natural language conversations, build automation scripts, or integrate Azure operations into your applications.\n\nExplore and contribute to the [Azure MCP Server on GitHub](https://github.com/microsoft/mcp/tree/main/servers/Azure.Mcp.Server).\n\n## Install Azure MCP Server using a package manager\n\nYou can optionally install Azure MCP Server directly using one of the supported package managers. Package manager installation offers several advantages, including centralized dependency management, CI/CD integration, support for headless environments, version control, and project portability.\n\n> [!NOTE]\n> You don't need to install the Azure MCP Server to use it. The approaches explained in the [Connect to Azure MCP Server](#connect-to-azure-mcp-server) section either include Azure MCP Server as part of their installation, or run Azure MCP Server directly via package manager commands.\n\nFor more information, see [Install with a package manager](https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/README.md#package-manager).\n\n- **NuGet**: [Azure.Mcp](https://www.nuget.org/packages/Azure.Mcp)\n- **NPM**: [@azure/mcp](https://www.npmjs.com/package/@azure/mcp)\n- **PyPI**: [msmcp-azure](https://pypi.org/project/msmcp-azure/)\n\n## Connect to Azure MCP Server\n\nYou can connect to Azure MCP Server using the following tools and programming frameworks.\n\n### Use a code editor\n\nAzure MCP Server works with AI-powered code editors and tools that support the Model Context Protocol. Learn how to get started:\n\n- [**Cline**](get-started/tools/cline.md)\n- [**Cursor**](get-started/tools/cursor.md)\n- [**IntelliJ**](get-started/tools/jet-brains.md)\n- [**Visual Studio**](get-started/tools/visual-studio.md)\n- [**Visual Studio Code**](get-started/tools/visual-studio-code.md)\n- [**Windsurf**](get-started/tools/windsurf.md)\n\n### Use GitHub Copilot tools\n\nConnect to Azure MCP Server using other tools and services, such as GitHub Copilot coding agent and Docker. Learn how to get started:\n\n- [**GitHub Copilot CLI**](how-to/github-copilot-cli.md)\n- [**GitHub Copilot SDK**](how-to/github-copilot-sdk.md)\n- [**GitHub Copilot coding agent**](/azure/developer/azure-mcp-server/how-to/github-copilot-coding-agent)\n\n### Use a Docker container\n\nFor easy deployment and isolation, you can [run the Azure MCP server as a Docker container](https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/README.md#docker).\n\n### Use programming languages & frameworks\n\nConnect to Azure MCP Server using programming languages and frameworks. This documentation currently provides guidance and examples for Python and .NET.\n\n#### Python\n\n[Get started with Azure MCP Server and Python](get-started/languages/python.md) to enhance your apps and workflows.\n\n- Use Python MCP client libraries to connect directly to Azure MCP Server.\n- Build automation scripts that manage Azure resources.\n- Integrate into web frameworks like Django, Flask, or FastAPI.\n- Incorporate Azure operations into data science workflows with Jupyter notebooks.\n\n#### .NET\n\n[Get started with Azure MCP Server and .NET](get-started/languages/dotnet.md) to enhance your apps and workflows.\n\n- Create console applications and command-line tools for Azure management.\n- Build ASP.NET Core web applications with integrated Azure capabilities.\n- Develop Azure Functions that leverage Azure MCP Server for resource management.\n- Create Windows desktop applications with Azure integration.\n\nThe Azure MCP Server provides flexibility to work with Azure in the way that best fits your development style and requirements, whether through interactive AI-powered editors or programmatic integration in your applications.\n"
  },
  {
    "path": "articles/azure-mcp-server/how-to/connect-sovereign-clouds.md",
    "content": "---\ntitle: Connect Azure MCP Server to sovereign clouds\ndescription: Learn how to configure Azure MCP Server for Azure operated by 21Vianet Cloud and Azure US Government.\nms.topic: how-to\nms.date: 03/24/2026\nai-usage: ai-generated\n---\n\n# Connect Azure MCP Server to sovereign clouds\n\nThis article shows you how to configure Azure MCP Server to authenticate against a sovereign cloud instead of the Azure public cloud. For example, use these steps when your subscription is in Azure US Government or Azure operated by 21Vianet Cloud (Azure in China), or when you need to provide a custom authority host. For more background about Azure sovereign cloud offerings, see [What are sovereign clouds?](/industry/sovereign-cloud/).\n\n## Prerequisites\n\n- Access to an Azure subscription in Azure US Government or Azure in China.\n- A client or local setup that can start Azure MCP Server. For setup options, see [Get started with the Azure MCP Server](../get-started.md).\n- At least one supported local authentication tool, such as [Azure CLI](/cli/azure/install-azure-cli), [Azure PowerShell](/powershell/azure/install-az-ps), or [Azure Developer CLI](../../azure-developer-cli/install-azd.md).\n\n## Supported sovereign clouds\n\nAzure MCP Server recognizes the following cloud names and maps them to the correct Microsoft Entra authority host.\n\n| Cloud | Authority host | Supported aliases |\n| --- | --- | --- |\n| Azure Public Cloud | `https://login.microsoftonline.com` | `AzureCloud`, `AzurePublicCloud`, `Public`, `AzurePublic` |\n| Azure US Government | `https://login.microsoftonline.us` | `AzureUSGovernment`, `USGov`, `AzureUSGovernmentCloud`, `USGovernment` |\n| Azure in China | `https://login.chinacloudapi.cn` | `AzureChinaCloud`, `China`, `AzureChina` |\n\nAliases are case-insensitive.\n\n## Configure the cloud for Azure MCP Server\n\nYou can set the cloud either in the server arguments or through configuration. If you specify the cloud in more than one place, Azure MCP Server resolves the value in this order.\n\n| Priority | Source | Setting |\n| --- | --- | --- |\n| 1 | Command line | `--cloud` |\n| 2 | .NET configuration providers | `AZURE_CLOUD`, `azure_cloud`, `cloud`, `Cloud` |\n| 3 | Environment variable fallback | `AZURE_CLOUD` |\n| Default | Fallback | `AzurePublicCloud` |\n\n### Configure using a server argument\n\nIf your MCP client starts Azure MCP Server for you, add `--cloud` to the server arguments.\n\n```json\n{\n  \"servers\": {\n    \"Azure MCP Server\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"@azure/mcp@latest\",\n        \"server\",\n        \"start\",\n        \"--cloud\",\n        \"AzureUSGovernment\"\n      ]\n    }\n  }\n}\n```\n\nReplace `AzureUSGovernment` with `AzureChinaCloud` when you connect to the Azure in China.\n\n### Configure using environment variables\n\nIf you start Azure MCP Server from a shell, or if your MCP client supports environment variables, set `AZURE_CLOUD` with the appropriate value before starting the server.\n\n#### [PowerShell](#tab/powershell)\n\n```powershell\n$env:AZURE_CLOUD = \"AzureUSGovernment\"\nazmcp server start\n```\n\n#### [Bash](#tab/bash)\n\n```bash\nexport AZURE_CLOUD=AzureUSGovernment\nazmcp server start\n```\n\n#### [Windows Command Prompt](#tab/cmd)\n\n```cmd\nset AZURE_CLOUD=AzureUSGovernment\nazmcp server start\n```\n\n---\n\n## Authenticate your local tools to the same cloud\n\nBefore you start Azure MCP Server, sign in to the same sovereign cloud in the local tools that Azure MCP Server can use for authentication.\n\n### [Azure CLI](#tab/azure-cli)\n\nUse Azure CLI when your workflow relies on `az login` or the Azure CLI credential.\n\n```bash\naz cloud set --name AzureUSGovernment\naz login\n```\n\nFor Azure in China, replace `AzureUSGovernment` with `AzureChinaCloud`.\n\n### [Azure PowerShell](#tab/azure-powershell)\n\nUse Azure PowerShell when your workflow relies on the Azure PowerShell credential.\n\n```powershell\nConnect-AzAccount -Environment AzureUSGovernment\n```\n\nFor Azure in China, replace `AzureUSGovernment` with `AzureChinaCloud`.\n\n### [Azure Developer CLI](#tab/azure-developer-cli)\n\nUse Azure Developer CLI when your workflow relies on `azd auth login` or Azure Developer CLI credentials.\n\n```bash\nazd config set cloud.name AzureUSGovernment\nazd auth login\n```\n\nFor Azure in China, replace `AzureUSGovernment` with `AzureChinaCloud`.\n\n---\n\n## Configure a self-hosted remote server\n\nIf you deploy Azure MCP Server as a remote MCP server, make sure the host environment is configured for the target sovereign cloud before you publish the endpoint.\n\nSet these environment variables on the host or container:\n\n- `AZURE_CLOUD`.\n- `AzureAd__ClientCredentials__0__TokenExchangeUrl`.\n\nIf you use one of the Microsoft-provided Azure Container Apps templates, this value is set for you. The template derives the correct value from the target cloud before it publishes the remote endpoint. For examples, see the [Foundry managed identity template](https://github.com/Azure-Samples/azmcp-foundry-aca-mi), the [Copilot Studio managed identity template](https://github.com/Azure-Samples/azmcp-copilot-studio-aca-mi), and the [on-behalf-of template](https://github.com/Azure-Samples/azmcp-obo-template).\n\nIf you configure the remote server manually, set `AzureAd__ClientCredentials__0__TokenExchangeUrl` to the token exchange audience for your cloud:\n\n| Cloud | Value |\n| --- | --- |\n| Azure Public Cloud | `api://AzureADTokenExchange` |\n| Azure US Government | `api://AzureADTokenExchangeUSGov` |\n| Azure in China | `api://AzureADTokenExchangeChina` |\n\nFor template-based deployments, review the upstream [Azure MCP Server azd templates](https://github.com/microsoft/mcp/tree/main/servers/Azure.Mcp.Server/azd-templates) if you want to confirm the generated host or container settings before you publish the remote endpoint.\n\n## Verify the connection\n\n1. Restart your MCP client after you change the cloud configuration.\n\n1. Run a simple prompt that requires Azure context, such as `List my resource groups`.\n\n1. If the request fails, verify that your local tools are authenticated to the same sovereign cloud and tenant as the Azure subscription you want to use.\n\n## Troubleshoot sovereign cloud configuration\n\nIf authentication or discovery fails, start with these checks.\n\n1. Verify the cloud configuration. Confirm that the cloud name or authority host is correct.\n\n1. Check local authentication. Make sure you authenticated the local toolchain to the correct cloud.\n\n1. Verify the tenant. Confirm that the tenant belongs to the sovereign cloud subscription you want to use. For example, run `az account show --query tenantId -o tsv`.\n\n1. Check network connectivity. Confirm that you can reach the correct authority host for your cloud.\n\n   - Azure US Government: `https://login.microsoftonline.us`\n   - Azure in China: `https://login.chinacloudapi.cn`\n\n1. For remote deployments, confirm that both `AZURE_CLOUD` and `AzureAd__ClientCredentials__0__TokenExchangeUrl` are set correctly.\n\n### Common error messages\n\nUse the following table to map common failures to likely causes.\n\n| Error | Likely cause | Resolution |\n| --- | --- | --- |\n| `Authentication failed` | Your local tool is still signed in to the wrong cloud, or not signed in at all. | Reauthenticate with the correct cloud by using `az login`, `Connect-AzAccount`, or `azd auth login`. |\n| `Cannot connect to authority host` | The cloud value or custom authority host URL is invalid, or the endpoint is unreachable. | Verify the cloud name, custom authority host, and network connectivity. |\n| `Invalid tenant` | The tenant doesn't match the sovereign cloud subscription. | Confirm the tenant ID and sign in again with the correct tenant and cloud. |\n| `The primary access token is from the wrong issuer` | The token was issued for a different tenant than the subscription expects. | Check the active tenant, then restart the client and Azure MCP Server after switching to the correct tenant. |\n\n### Verify the effective configuration\n\nIf the problem persists, start the server with debug logging and confirm that Azure MCP Server is using the expected authority host.\n\n```bash\nazmcp server start --cloud AzureUSGovernment --log-level Debug\n```\n\nThe debug output should show the authority host being used for authentication.\n\n### Additional checks for enterprise environments\n\nIf you work behind enterprise network controls, also verify the following items.\n\n- Firewall or proxy rules are not blocking outbound traffic to the sovereign cloud authority host and Azure Resource Manager endpoint.\n- The correct account is being selected when multiple credentials are available.\n- Private endpoint resources are reachable through VPN, ExpressRoute, or another approved network path.\n\nIf you still have problems, see the Azure MCP Server [troubleshooting guide](https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/TROUBLESHOOTING.md#sovereign-cloud-support).\n\n## Related content\n\n- [Get started with the Azure MCP Server](../get-started.md)\n- [Azure MCP Server overview](../overview.md)\n- [Deploy a self-hosted remote Azure MCP Server and connect to it using Copilot Studio](deploy-remote-mcp-server-copilot-studio.md)\n- [Deploy a self-hosted remote Azure MCP Server and connect to it using Microsoft Foundry](deploy-remote-mcp-server-microsoft-foundry.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/how-to/deploy-remote-mcp-server-copilot-studio.md",
    "content": "---\ntitle: Deploy the Azure MCP Server as a remote MCP server and connect using Copilot Studio\ndescription: Learn how to deploy the Azure MCP Server as a remote MCP server and connect using Copilot Studio\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 12/11/2025\nms.topic: how-to\nai-usage: ai-generated\n---\n\n# Deploy a self-hosted remote Azure MCP Server and connect to it using Copilot Studio\n\nDeploy the [Azure MCP Server](https://mcr.microsoft.com/product/azure-sdk/azure-mcp) over HTTPS as a self-hosted remote server. This setup lets AI agents in [Microsoft Foundry](https://azure.microsoft.com/products/ai-foundry) and [Microsoft Copilot Studio](https://www.microsoft.com/microsoft-copilot/microsoft-copilot-studio) can securely connect to and call MCP tools using the deployed Azure MCP Server to run Azure operations. This article focuses on the Copilot Studio connection scenario.\n\n## Prerequisites\n\n- Power Platform license that includes:\n  - Copilot Studio\n  - Power Apps\n- Azure subscription with **Owner** or **User Access Administrator** permissions\n- [Azure Developer CLI (azd)](/azure/developer/azure-developer-cli/install-azd)\n- The list of Azure MCP Server tool areas (namespaces) you wish to enable (see [azmcp-commands.md](https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/docs/azmcp-commands.md)). The reference template in this article uses the `storage` namespace.\n\n## Azure MCP Server template\n\nThis article uses the [Azure MCP Server - ACA with Copilot Studio agent](https://github.com/Azure-Samples/azmcp-copilot-studio-aca-mi) `azd` template to deploy the server to Azure Container Apps. The template enables storage tools and a managed identity for secure access to Azure Storage. The Azure Developer CLI (`azd`) is an open source tool that simplifies provisioning and deploying Azure resources and offers concise commands (`azd deploy`, `azd provision`) that map to key stages in your development workflow.\n\n## Deploy the Azure MCP server\n\nDeploy the Azure MCP server to Azure Container Apps:\n\n1. Clone and initialize the `azmcp-copilot-studio-aca-mi` template using `azd`.\n\n    ```bash\n    azd init -t azmcp-copilot-studio-aca-mi\n    ```\n\n    When prompted, enter an environment name.\n\n1. Run the template with the `azd up` command.\n\n    ```bash\n    azd up\n    ```\n\n    `azd` prompts you for the following:\n\n    - **Subscription**: Select the subscription for the provisioned resources (listed below).\n    - **Resource Group**: The resource group in which to create the resources. You can create a new resource group on demand during this step.\n\n`azd` uses the template files to provision the following resources and configurations:\n\n- **Azure Container App**: Runs the Azure MCP Server and provides the storage namespace.\n- **User-assigned managed identity**: A managed identity with the **Subscription Reader** role assigned to the container app and used by the Azure MCP server to make tool calls.\n- **Entra App Registration (Client)**: For the Power Apps custom connector to connect to the remote Azure MCP Server.\n- **Application Insights**: Provides telemetry and monitoring.\n\n### Deployment output and configuration\n\n1. After deployment completes, retrieve `azd` environment variables with the `azd env get-values` command.\n\n    ```bash\n    azd env get-values\n    ```\n\n    Example output:\n\n    ```text\n    AZURE_RESOURCE_GROUP=\"<your-resource-group-name>\"\n    AZURE_SUBSCRIPTION_ID=\"<your-subscription-id>\"\n    AZURE_TENANT_ID=\"<your-tenant-id>\"\n    CONTAINER_APP_NAME=\"<your-container-app-name>\"\n    CONTAINER_APP_URL=\"https://azure-mcp-storage-server.<your-container-app-name>.westus3.azurecontainerapps.io\"\n    ENTRA_APP_CLIENT_CLIENT_ID=\"<your-client-app-registration-client-id>\"\n    ENTRA_APP_SERVER_CLIENT_ID=\"<your-server-app-registration-client-id>\"\n    ```\n\n1. You also need to add the created API scope as one of the permissions of the client app registration. Go to the Azure portal and search for the client app registration using the `ENTRA_APP_CLIENT_CLIENT_ID` output value.\n1. Go to the API permissions blade and select **Add a permission**.\n1. In the My APIs tab, select the **Server app registration** and add the `Mcp.Tools.ReadWrite` scope.\n\n## Call tools from Copilot Studio agent\n\nThe Copilot Studio agent connects to MCP servers by using a custom connector.\n\n### Configure a custom connector\n\n1. Sign in to [Power Apps](https://make.powerapps.com) and select the environment to host the custom connector.\n1. Create a new custom connector using the **Create from blank** option. To learn more about custom connector configuration, see [create custom connector from scratch](/connectors/custom-connectors/define-blank).\n1. Complete the following sections for each step of the connector creation workflow.\n\n#### General\n\nOn the **General** step:\n\n- Provide a descriptive **Name** and **Description** for the custom connector.\n- Set **Scheme** to `HTTPS`.\n- Set **Host** to the `CONTAINER_APP_URL` value from the `azd` output.\n\n![Screenshot of the custom connector General tab showing name, description, scheme set to HTTPS, and host field populated with a container app URL.](../media/custom-connector-general.png)\n\n#### Security\n\nSkip the Security step for now and proceed to the **Definition** step.\n\n#### Definition\n\n1. Toggle **Swagger editor** to enter the editor view.\n1. In the editor view:\n\n    - Expose a POST method at the root path with a custom `x-ms-agentic-protocol: mcp-streamable-1.0` property. This property is required for the custom connector to interact with the API by using the MCP protocol.\n\n      > [!NOTE]\n      > See the [custom connector swagger example](https://github.com/Azure-Samples/azmcp-copilot-studio-aca-mi/blob/main/custom-connector-swagger-example.yaml) for a reference template.\n\n![Screenshot of Swagger editor with POST root method selected and custom x-ms-agentic-protocol property set to mcp-streamable-1.0 for MCP interaction.](../media/custom-connector-swagger-editor.png)\n\n#### Custom connector: Security \n\nReturn to the **Security** step to configure authentication:\n\n| Parameter | Value | Notes |\n|-----------|-------|-------|\n| **Authentication type** | OAuth 2.0 | Required |\n| **Identity provider** | Azure Active Directory | Required |\n| **Client ID** | `ENTRA_APP_CLIENT_CLIENT_ID` from azd output | Client app registration ID |\n| **Secret option** | Use client secret OR Use managed identity | See below for setup |\n| **Authorization URL** | `https://login.microsoftonline.com` | Default value |\n| **Tenant ID** | `AZURE_TENANT_ID` from azd output | Your Azure tenant ID |\n| **Resource URL** | `ENTRA_APP_SERVER_CLIENT_ID` from azd output | Server app registration client ID (not a URL) |\n| **On-behalf-of login** | Enabled | Required |\n| **Scope** | `<ENTRA_APP_SERVER_CLIENT_ID>/.default` | Format: `{server_client_id}/.default` |\n\n**Secret option setup**:\n- **If using client secret**: Create a client secret in the client app registration (Azure portal). Copy the secret value and paste it into the client secret field.\n- **If using managed identity**: Proceed with remaining steps until the custom connector is created.\n\n**Same-tenant requirement**: The client and server app registrations must be in the same tenant for simplified authentication. For cross-tenant scenarios, see [Known issues](#known-issues).\n\nSelect **Create connector** and wait for completion. After creation, the UI shows a redirect URL and, if selected, a managed identity.\n\n![Screenshot of Security step showing OAuth 2.0 with Azure Active Directory, client ID, secret option, tenant ID, resource URL, scope, and on-behalf-of login enabled.](../media/custom-connector-security.png)\n\n### App registration: Configure redirect URI and credentials\n\n1. In the Azure portal, add a redirect URI under the Web platform in the client app registration.\n\n    ![Screenshot of Azure portal app registration showing Web platform redirect URI entry being added for the custom connector authentication flow.](../media/client-app-redirect-uri.png)\n\n1. If you chose **Use managed identity** on the **Security** step, create a federated credential in the client app registration.\n    - Select **Other issuer** as the scenario.\n    - Copy the `issuer` and `subject` values from the custom connector into the credential fields.\n    - Provide a descriptive **Name** and **Description**, then select **Add**.\n\n    ![Screenshot of federated credential creation form showing issuer and subject values pasted from the custom connector plus name and description fields.](../media/client-app-client-credential.png)\n\n#### Test connection\n\n1. Open the custom connector, select **Edit**, and go to the **Test** step.\n1. Select any operation and choose **New connection**.\n1. Sign in with the user account you plan to use to access the MCP tools. You might see a dialog requesting consent or an admin approval prompt. If you are unsure, see [Known issues](#known-issues).\n\n    If sign-in succeeds, the UI shows the connection is created successfully. If you encounter an error during sign-in, see [Known issues](#known-issues) and troubleshoot with your tenant admin.\n\n    ![Screenshot of Test tab in custom connector showing successful connection status after user signs in with intended account.](../media/custom-connector-created-connection.png)\n\n### Call an Azure MCP tool in Copilot Studio test playground\n\n1. Sign in to [Copilot Studio](https://copilotstudio.microsoft.com) and select the environment to host the Copilot Studio agent. Create a new agent or use an existing one.\n1. Open the agent details and select the **Tools** tab.\n1. Select **Add a tool**.\n1. Search for your custom connector name and add it.\n1. After you add the custom connector, the Copilot Studio Agent attempts to list the tools from the MCP server. If successful, you see the available tool list under the connector.\n1. Select **Test** to start a test playground session.\n1. Prompt the agent to call an MCP tool, for example to list storage accounts in the subscription.\n\n    ![Screenshot of Copilot Studio agent Tools tab listing added custom connector and retrieved MCP tool list beneath it.](../media/copilot-studio-tools-tab.png)\n    ![Screenshot of Copilot Studio test playground session where agent returns results after invoking a listed MCP tool.](../media/copilot-studio-call-tools.png)\n\n## Clean up resources\n\nRun the following command to delete the Azure resources this template created when you don't need them.\n\n```bash\nazd down\n```\n\n> [!NOTE]\n> `azd` cannot delete the Entra app registrations created by this template. Delete the Entra app registrations by searching for the `ENTRA_APP_CLIENT_CLIENT_ID` and the `ENTRA_APP_SERVER_CLIENT_ID` values in the Azure portal and then delete the corresponding app registrations.\n\nDelete the Copilot Studio agent, Power Apps custom connector, and connection to clean up Power Platform resources.\n\n## Template structure\n\nThe `azd` template includes these Bicep modules:\n\n- **`main.bicep`** - Orchestrates deployment of all resources.\n- **`aca-storage-managed-identity.bicep`** - Creates a user-assigned managed identity.\n- **`aca-storage-subscription-role.bicep`** - Assigns an Azure RBAC role to the user-assigned managed identity. It defaults to the Subscription Reader role.\n- **`aca-infrastructure.bicep`** - Deploys the Container App hosting the Azure MCP Server.\n- **`entra-app.bicep`** - Creates Entra app registrations.\n- **`application-insights.bicep`** - Deploys Application Insights for telemetry and monitoring when enabled.\n\n## Known issues\n\n- **Single-tenant requirement**: The Power Apps custom connector doesn't support authenticating users from multiple tenants, so set the client app registration to accept only users from its tenant.\n- **Consent options**: During authentication, the user or a tenant admin grants the client app access to their data. Learn more in [application consent experience](/entra/identity-platform/application-consent-experience). You can give consent in several ways:\n  - A user can give consent during sign-in just for that user. Tenant security policy might block this.\n  - A tenant admin can give consent for all users in the tenant in the client app registration under the **API permissions** blade in Azure portal.\n  - Add the client app registration as a preauthorized client app in the server app registration under the **Expose an API** blade in Azure portal.\n- **Cross-tenant scenario**: If the client app registration and server app registration are in different tenants, you might see the following error when you try to create the connection:\n  - \"The app is trying to access a service 'server_app_registration_client_id'(server_app_registration_display_name) that your organization 'client_app_registration_tenant' lacks a service principal for.\" \n  - **Resolution**: A tenant admin of the client app registration must provision a service principal for the server app registration in that tenant:\n    ```bash\n    az ad sp create --id <server_app_registration_client_id>\n    ```\n  - After provisioning, create the connection again. The consent flow triggers.\n- If the Power Apps environment has a tenant isolation policy, it blocks data flow when the client or server app registrations are in different tenants. Learn how to add exception rules to allow this data flow in [cross tenant restrictions](/power-platform/admin/cross-tenant-restrictions).\n\n## Related content\n\n- [Deploy a remote Azure MCP Server and connect to it using Microsoft Foundry](deploy-remote-mcp-server-microsoft-foundry.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/how-to/deploy-remote-mcp-server-microsoft-foundry.md",
    "content": "---\ntitle: Deploy the Azure MCP Server as a remote MCP server and connect using Microsoft Foundry\ndescription: Learn how to deploy the Azure MCP Server as a remote MCP server and connect using Microsoft Foundry\nauthor: alexwolfmsft\nms.author: alexwolf\nms.date: 02/27/2026\nms.topic: how-to\nai-usage: ai-generated\n---\n\n# Deploy a self-hosted remote Azure MCP Server and connect to it using Microsoft Foundry\n\nDeploy the [Azure MCP Server](https://mcr.microsoft.com/product/azure-sdk/azure-mcp) as a self-hosted remote server over HTTPS. Agents in [Microsoft Foundry](https://azure.microsoft.com/products/ai-foundry) and [Microsoft Copilot Studio](https://www.microsoft.com/microsoft-copilot/microsoft-copilot-studio) can securely connect to and call MCP tools using the deployed Azure MCP Server to run Azure operations. This article focuses on the Microsoft Foundry connection scenario.\n\n## Prerequisites\n\n- Azure subscription with **Owner** or **User Access Administrator** access\n- [Azure Developer CLI (azd)](/azure/developer/azure-developer-cli/install-azd)\n- The list of Azure MCP Server tool areas (namespaces) you wish to enable (see [azmcp-commands.md](https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/docs/azmcp-commands.md)). The reference template in this article uses the `storage` namespace.\n- [Azure Storage account](/azure/storage/common/storage-account-create)\n- [Microsoft Foundry project](/azure/ai-foundry/how-to/create-projects?tabs=ai-foundry)\n\n## Azure MCP Server template\n\nUse the [Azure MCP Server - ACA with Managed Identity](https://github.com/Azure-Samples/azmcp-foundry-aca-mi) `azd` template to deploy Azure MCP Server to Azure Container Apps with storage tools and a managed identity for secure access to Azure Storage. The Azure Developer CLI (`azd`) is an open source tool that simplifies provisioning and deploying Azure resources and offers concise commands (`azd deploy`, `azd provision`) that map to key stages in your development workflow.\n\n## Deploy the Azure MCP server\n\nDeploy the Azure MCP server to Azure Container Apps:\n\n1. Clone and initialize the `azmcp-foundry-aca-mi` template with the `azd init` command.\n\n    ```bash\n    azd init -t azmcp-foundry-aca-mi\n    ```\n\n    When prompted, enter an environment name.\n\n1. Run the template with the `azd up` command.\n\n    ```bash\n    azd up\n    ```\n\n    `azd` prompts you for the following:\n\n    - **Subscription**: Select the subscription for the provisioned resources (listed below).\n    - **Project resource ID**: The Azure resource ID of the Microsoft Foundry project used for agent integration.\n    - **Storage Account resource ID**: The Azure resource ID of the storage account the MCP server accesses.\n    - **Resource group**: Create or select a resource group to store the provision resources.\n\n`azd` uses the template files to provision the following resources and configurations:\n\n- **Azure Container App**: Runs the Azure MCP server and provides the storage namespace.\n- **Microsoft Entra ID role assignments**: Assign roles to the Azure Container Apps managed identity for outbound authentication to the storage account you specify with the storage resource ID:\n  - Reader: Read-only access to storage account properties.\n  - Storage Blob Data Reader: Read-only access to blob data.\n- **Entra app registration**: Provides OAuth 2.0 authentication for clients like agents that have the `Mcp.Tools.ReadWrite.All` role. The template assigns this role to the managed identity of the Microsoft Foundry project you specify.\n- **Application Insights**: Provides telemetry and monitoring.\n\n### Deployment output\n\n1. After deployment finishes, retrieve the environment variables for the `azd` project using the `azd env get-values` command.\n\n    ```bash\n    azd env get-values\n    ```\n\n    Example output:\n\n    ```text\n    CONTAINER_APP_URL=\"https://azure-mcp-storage-server.<your-container-app-name>.eastus2.azurecontainerapps.io\"\n    ENTRA_APP_CLIENT_ID=\"<your-app-client-id>\"\n    ENTRA_APP_IDENTIFIER_URI=\"api://<your-app-client-id>\"\n    ENTRA_APP_OBJECT_ID=\"<your-app-object-id>\"\n    ENTRA_APP_ROLE_ID=\"<your-app-role-id>\"\n    ENTRA_APP_SERVICE_PRINCIPAL_ID=\"<your-app-service-principal-id>\"\n    ```\n\n1. Copy the `CONTAINER_APP_URL` and `ENTRA_APP_CLIENT_ID` values to use in the next section, or leave the terminal open for reference.\n\n## Use the Azure MCP server from Foundry agent\n\nAfter deployment, connect your Foundry agent to the Azure MCP Server running on Azure Container Apps. The agent authenticates using its managed identity to gain access to the configured Azure Storage tools.\n\n1. Go to your Foundry project at  https://ai.azure.com/nextgen.\n1. Select **Build → Create agent**.\n1. Select **+ Add** in the tools section.\n1. Select the **Custom** tab.\n1. Select **Model Context Protocol**, then select **Create**.\n\n    :::image type=\"content\" source=\"../media/azure-create-foundry-agent-mcp-tool.png\" alt-text=\"Screenshot of the Create agent page with Model Context Protocol selected to create an MCP connection.\":::\n\n    :::image type=\"content\" source=\"../media/azure-add-azure-foundry-mcp-connection.png\" alt-text=\"Screenshot of the connection form with fields for Remote MCP Server endpoint, authentication, audience, and Connect button to configure an MCP connection.\":::\n\n1. Configure the MCP connection values:\n\n    - **Name**: Provide a name for the tool.\n    - **Remote MCP Server**: Enter the `CONTAINER_APP_URL` value from the `azd` output for the tool endpoint.\n    - **Authentication**: Select **Microsoft Entra → Project Managed Identity**.\n    - **Type**: Select **Project Managed Identity**.\n    - **Audience**: Enter the `ENTRA_APP_IDENTIFIER_URI` value from the `azd` output.\n\n    Select **Connect** to associate the connection with the agent.\n\nThe agent is ready to assist you. It answers questions and uses tools from the Azure MCP Server to perform Azure operations for you.\n\n## Clean up resources\n\nRun `azd down` to delete Azure resources.\n\n```bash\nazd down\n```\n\n## Explore the Bicep modules\n\nThe `azd` template includes the following Bicep modules:\n\n- *main.bicep* orchestrates deployment of all resources.\n- *aca-infrastructure.bicep* deploys the container app hosting Azure MCP Server.\n- *aca-role-assignment-resource-storage.bicep* assigns Azure Storage RBAC roles to the container app's managed identity on the storage account specified by the input storage account resource ID.\n- *entra-app.bicep* creates an Entra app registration and a custom app role for OAuth 2.0 authentication.\n- *aif-role-assignment-entraapp.bicep* assigns the Entra app role to the Foundry project's managed identity (specified by the input Foundry resource ID) for Azure MCP Server access.\n- *application-insights.bicep* deploys Application Insights for telemetry and monitoring when enabled.\n\n## Related content\n\n- [Deploy a remote Azure MCP Server and connect to it using Copilot Studio](deploy-remote-mcp-server-copilot-studio.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/how-to/deploy-remote-mcp-server-on-behalf-of.md",
    "content": "---\ntitle: Deploy the Azure MCP Server with on-behalf-of authentication\ndescription: Learn how to deploy the Azure MCP Server as a remote MCP server that uses the on-behalf-of flow to call Azure services on behalf of a signed-in user.\nauthor: alexwolfmsft\nms.author: alexwolf\nms.reviewer: alexwolf\nms.date: 03/27/2026\nms.topic: how-to\nai-usage: ai-generated\n---\n\n# Deploy Azure MCP Server with on-behalf-of authentication\n\nDeploy [Azure MCP Server](https://mcr.microsoft.com/product/azure-sdk/azure-mcp) as a self-hosted remote server over HTTPS on Azure Container Apps. This article uses the on-behalf-of (OBO) authentication model, which lets the server call Azure services by using the identity of the signed-in user rather than the server's own managed identity. Agents in [Microsoft Foundry](https://azure.microsoft.com/products/ai-foundry) and [Microsoft Copilot Studio](https://www.microsoft.com/microsoft-copilot/microsoft-copilot-studio) can connect to the deployed server and invoke Azure MCP tools that operate with the user's own permissions and access.\n\n## How the OBO flow works\n\nThe on-behalf-of flow is distinct from the managed identity approach used in other Azure MCP Server templates:\n\n- **Managed identity approach**: The server authenticates to downstream Azure services by using its own managed identity. All users share the permissions granted to that identity. For a Microsoft Foundry example that uses this model, see [Deploy a remote Azure MCP Server and connect using Microsoft Foundry](deploy-remote-mcp-server-microsoft-foundry.md).\n- **OBO approach**: When a user authenticates with the server, the server exchanges the user's token for a new token scoped to a downstream Azure service. The server calls Azure services *on behalf of* the user, so each user's own Azure permissions determine what they can do.\n\nThe template provisions two [Microsoft Entra](/entra/fundamentals/whatis) app registrations to enable this flow:\n\n- **Server app registration**: Exposed to clients as the OAuth 2.0 resource. When a user's token arrives, the server uses a federated identity credential (backed by a managed identity) to perform the OBO token exchange to access downstream APIs like Azure Resource Manager and Azure Storage.\n- **Client app registration**: Used by external clients (Foundry agents, Copilot Studio custom connectors) to authenticate against the server. The client app is pre-authorized on the server app so users don't need to consent separately.\n\n## Prerequisites\n\n- Azure subscription with **Owner** or **User Access Administrator** permissions\n- [Azure Developer CLI (azd)](/azure/developer/azure-developer-cli/install-azd) installed\n- [Azure CLI](/cli/azure/install-azure-cli) installed\n- The list of Azure MCP Server tool namespaces you want to enable. See [azmcp-commands.md](https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/docs/azmcp-commands.md). The template in this article enables the `storage` namespace by default.\n\n## Deploy the Azure MCP Server\n\nThis article shows how to use the [`azmcp-obo-aca`](https://github.com/Azure-Samples/azmcp-obo-template/) `azd` template to deploy the Azure MCP Server to Azure Container Apps with OBO authentication. Deploy the server:\n\n1. Initialize the `azmcp-obo-template` template by using the `azd init` command.\n\n    ```bash\n    azd init -t azmcp-obo-template\n    ```\n\n    When prompted, enter an environment name.\n\n1. Run the template by using the `azd up` command.\n\n    ```bash\n    azd up\n    ```\n\n    `azd` prompts you for the following values:\n\n    - **Subscription**: Select the subscription for the provisioned resources.\n    - **Resource group**: Create or select a resource group to hold the resources.\n\n`azd` uses the template files to provision the following resources and configurations:\n\n- **Azure Container App**: Runs the Azure MCP Server with the `storage` namespace enabled.\n- **User-assigned managed identity**: Provides a client credential for the server app registration through a [federated identity credential](/entra/workload-id/workload-identity-federation). The server uses this identity to perform the OBO token exchange.\n- **Entra app registration (server)**: The OAuth 2.0 resource exposed to clients. Has the `Mcp.Tools.ReadWrite` scope, and carries Azure Resource Manager and Azure Storage API permissions for the OBO exchange.\n- **Entra app registration (client)**: Used by clients such as Foundry agents and Power Apps custom connectors to authenticate with the server. Pre-authorized on the server app to eliminate the need for user consent.\n- **Application Insights**: Provides telemetry and monitoring.\n\n### Retrieve deployment outputs\n\nAfter the deployment finishes, use the `azd env get-values` command to get the `azd` environment variables.\n\n```bash\nazd env get-values\n```\n\nExample output:\n\n```text\nAZURE_RESOURCE_GROUP=\"<your-resource-group-name>\"\nAZURE_SUBSCRIPTION_ID=\"<your-subscription-id>\"\nAZURE_TENANT_ID=\"<your-tenant-id>\"\nCONTAINER_APP_NAME=\"<your-container-app-name>\"\nCONTAINER_APP_URL=\"https://<your-container-app-name>.<region>.azurecontainerapps.io\"\nENTRA_APP_CLIENT_CLIENT_ID=\"<client-app-registration-id>\"\nENTRA_APP_SERVER_CLIENT_ID=\"<server-app-registration-id>\"\n```\n\nKeep this output available. You need these values in the sections that follow.\n\n### Grant admin consent and add the API scope\n\nAfter deployment, complete two required configuration steps before clients can connect.\n\n#### Add the API scope to the client app registration\n\nThe client app registration needs permission to call the server app's `Mcp.Tools.ReadWrite` scope.\n\n1. In the Azure portal, search for the client app registration by using the `ENTRA_APP_CLIENT_CLIENT_ID` value.\n1. Go to **API permissions** → **Add a permission** → **My APIs** tab.\n1. Select the server app registration and add the `Mcp.Tools.ReadWrite` scope.\n1. Select **Grant admin consent** to apply the permission to all users.\n\n> [!NOTE]\n> If the server app registration doesn't appear under **My APIs**, the app might still be propagating. Wait a few minutes and refresh, or see the [Troubleshooting](#troubleshooting) section.\n\n#### Grant admin consent for downstream API permissions\n\nThe server app registration has Azure Resource Manager and Azure Storage API permissions configured, but these permissions require admin consent before the OBO token exchange can succeed.\n\n1. In the [Azure portal](https://portal.azure.com), search for the server app registration by using the `ENTRA_APP_SERVER_CLIENT_ID` value.\n1. Go to **API permissions**.\n1. Select **Grant admin consent for \\<your tenant\\>** and confirm.\n\n> [!NOTE]\n> If the **Grant admin consent** button is unavailable, your account lacks sufficient permissions. This template requires an Azure subscription with **Owner** or **User Access Administrator** access.\n\nAlternatively, use the Azure CLI:\n\n```bash\naz ad app permission admin-consent --id <ENTRA_APP_SERVER_CLIENT_ID>\n```\n\n## Connect to the server\n\nAfter deploying and completing the post-deployment configuration, you can connect clients to the server. Select the option that fits your scenario.\n\n### [C# client app](#tab/csharp)\n\nThe template includes a .NET console app in the `client/` folder that you can use to verify the deployment locally. The app authenticates interactively through the browser by using the client app registration, connects to the MCP server, lists the available tools, and optionally calls the `storage_account_get` tool.\n\n**Prerequisites**: [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)\n\n1. In the `client/` folder, open `appsettings.json` and set the following values by using the `azd env get-values` output:\n\n    ```json\n    {\n      \"McpServer\": {\n        \"Url\": \"<CONTAINER_APP_URL>\"\n      },\n      \"EntraClientClientId\": \"<ENTRA_APP_CLIENT_CLIENT_ID>\",\n      \"SubscriptionId\": \"<AZURE_SUBSCRIPTION_ID>\"\n    }\n    ```\n\n    > [!TIP]\n    > You can also create an `appsettings.Development.json` file with your local values and set the `DOTNET_ENVIRONMENT` environment variable to `Development` to load it without modifying the committed file.\n\n1. From the `client/` folder, run the app:\n\n    ```bash\n    dotnet run\n    ```\n\n    The app opens a browser window for you to sign in. After sign-in, it connects to the MCP server and prints the list of available tools.\n\n1. To also call the `storage_account_get` tool and list storage accounts in your subscription, pass the `--list-accounts` flag:\n\n    ```bash\n    dotnet run -- --list-accounts true\n    ```\n\nIf you encounter authentication errors such as `MsalUiRequiredException`, see the [Troubleshooting](#troubleshooting) section.\n\n### [Microsoft Foundry](#tab/foundry)\n\nA Foundry agent connects to the Azure MCP Server by using [OAuth identity passthrough](/azure/foundry/agents/how-to/mcp-authentication#oauth-identity-passthrough). In this mode, the signed-in user's identity flows through all the way to the Azure service calls via the OBO exchange.\n\n1. Go to your Foundry project at https://ai.azure.com/nextgen.\n1. Select **Build** > **Create agent**.\n1. Select **+ Add** in the tools section, and then select the **Custom** tab.\n1. Select **Model Context Protocol (MCP)**, and then select **Create**.\n1. Configure the MCP connection:\n\n    | Field | Value |\n    |-------|-------|\n    | **Remote MCP Server endpoint** | `CONTAINER_APP_URL` from `azd` output |\n    | **Authentication** | OAuth Identity Passthrough |\n    | **Client ID** | `ENTRA_APP_CLIENT_CLIENT_ID` from `azd` output |\n    | **Client secret** | A secret you create on the client app registration (see next step) |\n    | **Token URL** | `https://login.microsoftonline.com/<AZURE_TENANT_ID>/oauth2/v2.0/token` |\n    | **Auth URL** | `https://login.microsoftonline.com/<AZURE_TENANT_ID>/oauth2/v2.0/authorize` |\n    | **Scope** | `<ENTRA_APP_SERVER_CLIENT_ID>/Mcp.Tools.ReadWrite` |\n\n1. Create a client secret on the client app registration:\n    - In the Azure portal, open the client app registration.\n    - Go to **Manage** > **Certificates & secrets** > **New client secret**.\n    - Copy the secret value and paste it into the **Client secret** field in Foundry.\n\n1. Select **Connect**.\n\n1. After Foundry creates the connection, copy the **Redirect URL** that appears.\n1. In the Azure portal, go to the client app registration > **Manage** > **Authentication**.\n1. Under **Web**, add the redirect URL as a new entry.\n\nAfter you complete these steps, prompt the Foundry Agent to load the MCP tools and call them.\n\n### [Copilot Studio](#tab/copilot-studio)\n\nConnecting a Copilot Studio agent to this server follows the same custom connector steps as the standard Copilot Studio deployment. For the full walkthrough, see [Deploy a remote Azure MCP Server and connect to it using Copilot Studio](deploy-remote-mcp-server-copilot-studio.md).\n\nWhen you follow that guide, use the output values from this template (`CONTAINER_APP_URL`, `ENTRA_APP_CLIENT_CLIENT_ID`, `ENTRA_APP_SERVER_CLIENT_ID`, `AZURE_TENANT_ID`) wherever the guide references `azd` output values. The key difference is that in the **Security** step of the custom connector, you must set **Enable on-behalf-of login** to `true` and set **Resource URL** to the `ENTRA_APP_SERVER_CLIENT_ID` value. This setting activates the OBO flow so the connector authenticates on behalf of the signed-in user.\n\n---\n\n## Add more Azure tools\n\nThe template enables the `storage` namespace by default. To enable additional tool namespaces:\n\n1. Identify the API permissions required for the tools you want. See the [API permissions reference](https://github.com/microsoft/mcp/blob/main/servers/Azure.Mcp.Server/azd-templates/api-permissions.md).\n\n1. Add the permissions to the server app registration by using the Azure CLI:\n\n    ```bash\n    az ad app permission add \\\n      --id <ENTRA_APP_SERVER_CLIENT_ID> \\\n      --api <downstream-api-id> \\\n      --api-permissions <permission-id>=Scope\n    ```\n\n1. Grant admin consent for the new permissions:\n\n    ```bash\n    az ad app permission admin-consent --id <ENTRA_APP_SERVER_CLIENT_ID>\n    ```\n\n1. Update the Container App environment variables to pass the additional namespace flags to the server startup command.\n\n## Clean up resources\n\nRun `azd down` to delete the Azure resources created by this template.\n\n```bash\nazd down\n```\n\n> [!NOTE]\n> `azd down` doesn't delete the Entra app registrations. After running `azd down`, manually delete them in the Azure portal by searching for the `ENTRA_APP_CLIENT_CLIENT_ID` and `ENTRA_APP_SERVER_CLIENT_ID` values.\n## Troubleshooting\n\nThe following sections provide details on common errors you might encounter and how to resolve them.\n\n**IDW10502: MsalUiRequiredException**\n\n```text\n{\"status\":500,\"message\":\"IDW10502: An MsalUiRequiredException was thrown due to a challenge for the user...\"}\n```\n\nThe server's OBO token exchange failed because admin consent isn't granted for the downstream API permissions on the server app registration. In the Azure portal, find the server app registration (using `ENTRA_APP_SERVER_CLIENT_ID`) → **API permissions** → **Grant admin consent**.\n\n**OBO token exchange failures**\n\nCheck the Entra sign-in logs for details. In the Azure portal, go to **Microsoft Entra ID** → **Monitoring** → **Sign-in logs** → **User sign-ins (non-interactive)**. Look for entries where the application matches your server app registration and the resource matches the downstream Azure API.\n\n**Container App errors**\n\nOpen the Azure portal, go to your Container App → **Monitoring** → **Log stream** to view real-time application logs. Application Insights telemetry is available under **Investigate → Search** or via Log Analytics queries on the `requests` and `traces` tables.\n\n**ServiceManagementReference error on redeploy**\n\n```text\n{\"error\":{\"code\":\"BadRequest\",\"message\":\"ServiceManagementReference field is required for Update...\"}}\n```\n\nThis error occurs when running `azd up` on an existing deployment that was originally created without a `serviceManagementReference` value. Add the parameter to `infra/main.parameters.json`:\n\n```json\n{\n  \"parameters\": {\n    \"serviceManagementReference\": {\n      \"value\": \"<your-guid>\"\n    }\n  }\n}\n```\n\n> [!NOTE]\n> For a list of other known issues, see [KnownIssues.md](https://github.com/Azure-Samples/azmcp-obo-template/blob/main/KnownIssues.md) in the template repository.\n\n## Related content\n\n- [Deploy a remote Azure MCP Server and connect to it using Microsoft Foundry](deploy-remote-mcp-server-microsoft-foundry.md)\n- [Deploy a remote Azure MCP Server and connect to it using Copilot Studio](deploy-remote-mcp-server-copilot-studio.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/how-to/github-copilot-cli.md",
    "content": "---\ntitle: \"Quickstart: Integrate Azure MCP Server with GitHub Copilot CLI\"\ndescription: Learn how to configure the Azure MCP Server for use with the GitHub Copilot CLI using the /mcp command.\nms.topic: quickstart\nms.date: 02/10/2026\nai-usage: ai-generated\n---\n\n# Quickstart: Integrate Azure MCP Server with GitHub Copilot CLI\n\nIn this quickstart, you learn how to connect the Azure Model Context Protocol (MCP) Server to the GitHub Copilot CLI. This integration allows GitHub Copilot to interact with your Azure resources directly from your terminal.\n\n## Prerequisites\n\n- [GitHub Copilot CLI](https://github.blog/changelog/2026-01-14-github-copilot-cli-enhanced-agents-context-management-and-new-ways-to-install/) installed.\n- [Azure CLI](/cli/azure/install-azure-cli) installed and authenticated (`az login`).\n- [Node.js](https://nodejs.org/) installed (for running the server via `npx`).\n\n[!INCLUDE [sign-in-local-development](../includes/sign-in-local-development.md)]\n\n## Add Azure MCP Server\n\nThe GitHub Copilot CLI supports MCP servers through the `/mcp` command family.\n\n1. Open your terminal.\n\n1. Start the GitHub Copilot CLI in interactive mode:\n\n   ```bash\n   copilot\n   ```\n\n1. In the interactive session, run the following command to open the MCP server configuration form:\n\n   ```bash\n   /mcp add\n   ```\n\n1. Fill in the configuration fields with the following values:\n\n   | Field | Value |\n   |-------|-------|\n   | **Server Name** | `azure-mcp` |\n   | **Server Type** | `1` (Local) |\n   | **Command** | `npx -y @azure/mcp@latest server start` |\n   | **Environment Variables** | *(leave blank - utilizes Azure CLI authentication)* |\n   | **Tools** | `*` |\n\n   > [!NOTE]\n   > If you prefer using .NET, set the **Command** to `dotnet dnx -p Azure.Mcp server start`.\n\n1. Press **Ctrl+S** (or **Cmd+S** on macOS) to save the server configuration.\n1. When you've finished, press `esc` to close the server configuration.\n\n## Verify the connection\n\nConfirm that you configured the Azure MCP Server correctly and that the GitHub Copilot CLI recognizes it:\n\n1. In your Copilot CLI session, run:\n\n   ```bash\n   /mcp show\n   ```\n\n1. Review the output. You should see `azure-mcp` listed in the configuration:\n\n   ```output\n   ● MCP Server Configuration:\n     • azure-mcp (local): Command: npx\n   \n   Total servers: 1\n   Config file: ~/.copilot/mcp-config.json\n   ```\n\n## Use Azure MCP Server\n\nOnce connected, you can use natural language to interact with your Azure resources.\n\n1. In the GitHub Copilot CLI session, type a prompt that requires Azure context. For example:\n\n   ```text\n   > List my Azure resource groups.\n   ```\n\n1. GitHub Copilot identifies the intent and uses the `azure-mcp` tools to fetch the information. It prints a response listing your Azure resource groups, similar to:\n\n   ```output\n   I found the following resource groups in your subscription:\n   \n   - **my-resource-group-1** (East US)\n   - **dev-environment** (West Europe)\n   - **production-app** (Central US)\n   ```\n\n## Manage MCP servers\n\nManage your configured MCP servers using the following commands:\n\n- **List servers:** `/mcp show`\n- **Remove a server:** `/mcp remove azure-mcp`\n- **Get help:** `/mcp help`\n\n## Next steps\n\n- Learn more about [GitHub Copilot CLI](https://docs.github.com/copilot/github-copilot-in-the-cli/using-github-copilot-in-the-cli).\n- Explore [Azure MCP Server capabilities](../overview.md).\n"
  },
  {
    "path": "articles/azure-mcp-server/how-to/github-copilot-coding-agent.md",
    "content": "---\ntitle: Connect GitHub Copilot coding agent to the Azure MCP Server\ndescription: Learn how to use the Azure MCP Server with the GitHub Copilot coding agent.\nauthor: rotabor\nms.author: rotabor\nms.date: 02/27/2026\nms.topic: how-to\n\n---\n# Connect GitHub Copilot coding agent to the Azure MCP Server\n\nThis article shows you how to set up and connect the GitHub Copilot coding agent to the Azure MCP Server so that the coding agent can understand your Azure-specific files and Azure resources to make edits to your code files.\n\nIn your GitHub repository, assigning GitHub issues to the GitHub Copilot coding agent creates a pull request with the changes to your code. If the requested changes require access to your Azure resources, the GitHub Copilot coding agent needs to use the Azure MCP Server. Before the GitHub Copilot coding agent can use the Azure MCP Server to make changes to your Azure-based project agentically, you need to configure the GitHub Copilot coding agent and give it the proper permissions in Azure. You could manually configure everything, however many steps are automated using `azd`, the Azure Developer CLI, and the `coding-agent` extension.\n\n## Prerequisites\n\n- An Azure account and access to an Azure subscription. For details on how to set them up, see the [pricing page for Azure accounts](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- A GitHub account and a GitHub Copilot subscription. For details on how to set them up, see [Creating an account on GitHub](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github) and [Quickstart for GitHub Copilot](https://docs.github.com/en/copilot/quickstart), respectively.\n\n- An existing local clone of a GitHub repository. Since this article describes how to set up the connection between GitHub Copilot coding agent to the Azure MCP Server, the GitHub repository should include deployment scripts to Azure, like Bicep or Terraform templates.\n\n\n## Configure the GitHub repository to use the Azure MCP Server\n\nThe `azd` coding-agent extension simplifies the steps required to securely set up the connection between the GitHub Copilot coding agent and the Azure MCP Server for your Azure subscription. First, it creates an account in your Azure subscription and assigns it a role with necessary permissions. Second, it provides a JSON snippet required to introduce the Azure MCP Server to the GitHub Copilot coding agent.\n\n1. If you don't already have `azd` installed, [follow the instructions](../../azure-developer-cli/install-azd.md) to install it.\n\n1. In the terminal, navigate into the local clone of the repository you want to work with.\n\n1. Invoke the azd coding agent extension with the command: `azd coding-agent config`. \n\n1. During installation, you are asked to select your:\n \n   - Azure subscription\n   - Which GitHub repository will use the Copilot Coding agent\n   - Whether you want to create a new or existing User Managed Identity\n   - An Azure location\n   - An Azure resource group\n   - The GitHub repository where a new branch will be created containing the generated GitHub Actions workflow setup file\n\n   When selecting the location and resource group, you may want to use the same target location and resource group as the Azure resources in the application.\n\n1. After a few moments, the `azd` coding agent extension creates (or uses the existing) User Managed Identity and assigns it a role, stores identity values in the GitHub repository environment, and creates and pushes a branch containing the generated GitHub Actions workflow setup file.\n\n1. You will see a message in the console:\n\n   ```console\n   (!)\n   (!) NOTE: Some tasks must still be completed, manually:\n   (!)\n   ```\n\n   Usually there are three tasks:\n\n   - Merge the branch containing the generated GitHub Actions workflow setup file.\n   - Configure Copilot coding agent's managed identity roles in the Azure portal. By default, the \"Reader\" role is assigned. However you may want to give it other permissions based on what you want the coding agent to do autonomously.\n   - Visit the link to set up the MCP Configuration. To navigate there manually, in GitHub go to Settings > Copilot > coding agent > MCP Configuration and paste in the JSON snippet provided. Here's an example:\n\n   ```json\n   {\n       \"mcpServers\": {\n           \"Azure\": {\n               \"type\": \"local\",\n               \"command\": \"npx\",\n               \"args\": [\n                   \"-y\",\n                   \"@azure/mcp@latest\",\n                   \"server\",\n                   \"start\"\n               ],\n               \"tools\": [\n                   \"*\"\n               ]\n           }\n       }\n   }\n   ```\n\n1. Finally, you can allow the `azd` coding agent extension to open the browser so you can create the pull request to merge the branch containing the generated GitHub Actions workflow setup file.\n\n\n## Create an Issue in GitHub to initiate GitHub Copilot coding agent\n\nAt this point, you successfully set up GitHub Copilot coding agent to use the Azure MCP Server for any GitHub Issues you assign to GitHub Copilot coding agent that require an understanding of Azure deployments and resources. \n\nFor example, suppose you want to increase the memory allocated to PostgreSQL when deployed to Azure Database for PostgreSQL. You would create an issue to modify your Bicep template to use the next tier of storage available and assign it to GitHub Copilot.\n\n> [!NOTE]\n> The User Managed Identity role is set to \"Reader\" by default, so the changes you request should be to modify deployment scripts like Bicep or Terraform templates. Asking to directly modify existing resources in your Azure subscription isn't authorized due to the permissions of the \"Reader\" role.\n\n1. In GitHub, in the repository containing your Azure-based project where you enabled the Azure MCP Server, go to Issues.\n\n1. Select the \"New Issue\" button. Describe the change you want GitHub Copilot coding agent to make in the title and description fields. Select the \"Create\" button.\n\n   Borrowing from the example earlier, you might use the following text to describe your issue.\n\n   ```text\n   Title: Increase database storage\n \n   Currently, when deploying to Azure via Bicep, we're creating a PostgreSQL database with 32gb of storage. I need the next tier higher -- whatever that is.\n   ```\n\n   This example issue makes a simple, clear request even if the user doesn't know exactly what they're asking for. It allows the Azure MCP Server to do research about available storage tiers for Azure Database fo PostgreSQL Flexible Server and the setting in the Bicep template required to make that change.\n\n   > [!Important]\n   > Make sure to use the word \"Azure\" in your prompt to ensure that GitHub Copilot requests tools from the Azure MCP Server.\n\n1. Select the \"Assign to Copilot\" button under **Assignees**. The \"Assign Copilot to issue\" dialog appears allowing you to modify the target repository, the base branch, and add an optional prompt. Select the \"Assign\" button.\n\n1. Once the issue is assigned to GitHub Copilot coding agent, you see a link to the pull request prefixed with \"[WIP]\" letting you know that the work is starting.\n\n1. Select the \"[WIP]\" link to view the pull request.\n\n1. In the body of the pull request, select the link to view the coding session. This shows the progress the Copilot Coding agent is making on the request, similar to the experience in Visual Studio.\n\n1. When finished, GitHub Copilot coding agent requests a code review. Use your normal workflow to iterate with GitHub, treating GitHub Copilot coding agent as a coworker.\n\n1. When you approve the changes and merge the pull request, GitHub Copilot resolves the original issue you created.\n\n## Related content\n\n- [GitHub Copilot coding agent](https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent)"
  },
  {
    "path": "articles/azure-mcp-server/how-to/github-copilot-sdk.md",
    "content": "---\ntitle: \"Quickstart: Integrate Azure MCP Server with GitHub Copilot SDK\"\ndescription: Learn how to configure the GitHub Copilot SDK to use Azure MCP tools for interacting with Azure resources programmatically.\nms.topic: quickstart\nms.date: 02/10/2026\nai-usage: ai-generated\n---\n\n# Quickstart: Integrate Azure MCP Server with GitHub Copilot SDK\n\nThis guide explains how to configure the [GitHub Copilot SDK](https://github.com/github/copilot-sdk) to use Azure Model Context Protocol (MCP) tools for interacting with Azure resources.\n\nAzure MCP provides a set of tools that enable AI assistants to interact with Azure resources directly. When integrated with the Copilot SDK, you can build applications that leverage natural language to manage Azure subscriptions, resource groups, storage accounts, and more.\n\n## Prerequisites\n\n- [GitHub Copilot CLI](https://docs.github.com/en/copilot/github-copilot-in-the-cli) installed.\n- [Node.js](https://nodejs.org/) installed (for running the server via `npx`).\n- [Azure CLI](/cli/azure/install-azure-cli) installed and authenticated (`az login`).\n\n[!INCLUDE [sign-in-local-development](../includes/sign-in-local-development.md)]\n\n## Azure MCP Server configuration example\n\nRegardless of the programming SDK you use, Azure MCP server must be configured in the app context for tools to be available. The essential configuration resembles the following:\n\n```json\n{\n  \"mcp_servers\": {\n    \"azure-mcp\": {\n      \"type\": \"local\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@azure/mcp@latest\", \"server\", \"start\"],\n      \"tools\": [\"*\"]\n    }\n  }\n}\n```\n\nThe `tools: [\"*\"]` parameter is essential - it enables all tools from the MCP server for the session.\n\n## Integration examples\n\nThe following examples show how to integrate the SDK in different languages.\n\n> [!NOTE]\n> For faster startup, you can install Azure MCP Server globally using `npm install -g @azure/mcp@latest`.\n\n# [Python](#tab/python)\n\n### Installation\n\nInstall the Python SDK package using pip.\n\n```bash\npip install github-copilot-sdk\n```\n\n### Sample code\n\nThe following code demonstrates a complete flow:\n\n```python\nimport asyncio\nfrom copilot import CopilotClient\nfrom copilot.generated.session_events import SessionEventType\n\nasync def main():\n    # Initialize the Copilot client\n    client = CopilotClient({\n        \"cli_args\": [\n            \"--allow-all-tools\",\n            \"--allow-all-paths\",\n        ]\n    })\n\n    await client.start()\n\n    # Configure Azure MCP server in session config\n    azure_mcp_config = {\n        \"azure-mcp\": {\n            \"type\": \"local\",\n            \"command\": \"npx\",\n            \"args\": [\"-y\", \"@azure/mcp@latest\", \"server\", \"start\"],\n            \"tools\": [\"*\"],  # Enable all Azure MCP tools\n        }\n    }\n\n    # Create session with MCP servers\n    session = await client.create_session({\n        \"model\": \"gpt-4.1\",  # Default model; BYOK can override\n        \"streaming\": True,\n        \"mcp_servers\": azure_mcp_config,\n    })\n\n    # Handle events\n    def handle_event(event):\n        if event.type == SessionEventType.ASSISTANT_MESSAGE_DELTA:\n            if hasattr(event.data, 'delta_content') and event.data.delta_content:\n                print(event.data.delta_content, end=\"\", flush=True)\n        elif event.type == SessionEventType.TOOL_EXECUTION_START:\n            tool_name = getattr(event.data, 'tool_name', 'unknown')\n            print(f\"\\n[TOOL: {tool_name}]\")\n\n    session.on(handle_event)\n\n    # Send prompt\n    await session.send_and_wait({\n        \"prompt\": \"List all resource groups in my Azure subscription\"\n    })\n\n    await client.stop()\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\nThe preceding code:\n\n- Initializes the Copilot client.\n- Configures the Azure MCP server using `npx`.\n- Creates a session with the GPT-4.1 model and streaming enabled.\n- Handles events to print assistant responses and tool execution logs.\n- Sends a prompt to list Azure resource groups.\n\n# [Node.js / TypeScript](#tab/nodejs)\n\n### Installation\n\nInstall the Node.js SDK package using npm.\n\n```bash\nnpm install @github/copilot-sdk\n```\n\nThe following code demonstrates a complete flow:\n\n```typescript\nimport { CopilotClient } from '@github/copilot-sdk';\nimport type { MCPLocalServerConfig } from '@github/copilot-sdk';\n\nasync function main() {\n  // Initialize the Copilot client\n  const client = new CopilotClient({\n    cliArgs: [\n      '--allow-all-tools',\n      '--allow-all-paths',\n    ]\n  });\n\n  await client.start();\n\n  // Configure Azure MCP server in session config\n  const azureMcpConfig: Record<string, MCPLocalServerConfig> = {\n    'azure-mcp': {\n      type: 'local',\n      command: 'npx',\n      args: ['-y', '@azure/mcp@latest', 'server', 'start'],\n      tools: ['*'],  // Enable all Azure MCP tools\n    }\n  };\n\n  // Create session with MCP servers\n  const session = await client.createSession({\n    model: 'gpt-4.1',  // Default model; BYOK can override\n    streaming: true,\n    mcpServers: azureMcpConfig,\n  });\n\n  // Handle events\n  session.on((event) => {\n    if (event.type === 'assistant.message_delta') {\n      if (event.data?.deltaContent) {\n        process.stdout.write(event.data.deltaContent);\n      }\n    } else if (event.type === 'tool.execution_start') {\n      const toolName = event.data?.toolName || 'unknown';\n      console.log(`\\n[TOOL: ${toolName}]`);\n    }\n  });\n\n  // Send prompt\n  await session.sendAndWait({\n    prompt: 'List all resource groups in my Azure subscription 16caa5c4-46f1-4bfd-8c1b-a99f1efc8845'\n  });\n\n  await client.stop();\n}\n\nmain().catch(console.error);\n```\n\nThe preceding code:\n\n- Initializes the Copilot client.\n- Configures the Azure MCP server using `npx`.\n- Creates a session with the GPT-4.1 model and streaming enabled.\n- Handles events to print assistant responses and tool execution logs.\n- Sends a prompt to list Azure resource groups.\n\n# [.NET](#tab/dotnet)\n\n### Installation\n\nAdd the contents of the NuGet package to your project.\n\n```bash\ndotnet add package GitHub.Copilot.SDK\n```\n\n### Sample code\n\nThe following C# code demonstrates a complete flow:\n\n```csharp\nusing GitHub.Copilot.SDK;\n\n// Initialize the Copilot client\nawait using var client = new CopilotClient(new CopilotClientOptions\n{\n    CliArgs = new[] { \"--allow-all-tools\", \"--allow-all-paths\" }\n});\n\nawait client.StartAsync();\n\n// Configure Azure MCP server in session config\nvar mcpServers = new Dictionary<string, object>\n{\n    [\"azure-mcp\"] = new McpLocalServerConfig\n    {\n        Type = \"local\",\n        Command = \"npx\",\n        Args = [\"-y\", \"@azure/mcp@latest\", \"server\", \"start\"],\n        Tools = [\"*\"]  // Enable all Azure MCP tools\n    }\n};\n\n// Create session with MCP servers\nawait using var session = await client.CreateSessionAsync(new SessionConfig\n{\n    Model = \"gpt-4.1\",  // Default model; BYOK can override\n    Streaming = true,\n    McpServers = mcpServers\n});\n\n// Handle events\nsession.On(evt =>\n{\n    if (evt is AssistantMessageDeltaEvent delta)\n    {\n        if (!string.IsNullOrEmpty(delta.Data.DeltaContent))\n        {\n            Console.Write(delta.Data.DeltaContent);\n        }\n    }\n    else if (evt is ToolExecutionStartEvent toolStart)\n    {\n        Console.WriteLine($\"\\n[TOOL: {toolStart.Data.ToolName}]\");\n    }\n});\n\n// Send prompt\nawait session.SendAndWaitAsync(new MessageOptions\n{\n    Prompt = \"List all resource groups in my Azure subscription\"\n});\n```\n\nThe preceding code:\n\n- Initializes the Copilot client.\n- Configures the Azure MCP server using `npx`.\n- Creates a session with the GPT-4.1 model and streaming enabled.\n- Handles events to print assistant responses and tool execution logs.\n- Sends a prompt to list Azure resource groups.\n\n# [Go](#tab/go)\n\n### Installation\n\nGet the Go SDK package using `go get`.\n\n```bash\ngo get github.com/github/copilot-sdk/go\n```\n\n### Sample code\n\nThe following code demonstrates a complete flow:\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n\n    copilot \"github.com/github/copilot-sdk/go\"\n)\n\nfunc main() {\n    ctx := context.Background()\n\n    // Initialize the Copilot client\n    client, err := copilot.NewClient(copilot.ClientOptions{\n        CLIArgs: []string{\n            \"--allow-all-tools\",\n            \"--allow-all-paths\",\n        },\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    if err := client.Start(ctx); err != nil {\n        log.Fatal(err)\n    }\n    defer client.Stop(ctx)\n\n    // Configure Azure MCP server in session config\n    azureMcpConfig := map[string]copilot.MCPServerConfig{\n        \"azure-mcp\": {\n            Type:    \"local\",\n            Command: \"npx\",\n            Args:    []string{\"-y\", \"@azure/mcp@latest\", \"server\", \"start\"},\n            Tools:   []string{\"*\"}, // Enable all Azure MCP tools\n        },\n    }\n\n    // Create session with MCP servers\n    session, err := client.CreateSession(ctx, copilot.SessionConfig{\n        Model:      \"gpt-4.1\",  // Default model; BYOK can override\n        Streaming:  true,\n        MCPServers: azureMcpConfig,\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    // Handle events\n    session.OnEvent(func(event copilot.SessionEvent) {\n        switch event.Type {\n        case copilot.AssistantMessageDelta:\n            if event.Data.DeltaContent != \"\" {\n                fmt.Print(event.Data.DeltaContent)\n            }\n        case copilot.ToolExecutionStart:\n            fmt.Printf(\"\\n[TOOL: %s]\\n\", event.Data.ToolName)\n        }\n    })\n\n    // Send prompt\n    err = session.SendAndWait(ctx, copilot.Message{\n        Prompt: \"List all resource groups in my Azure subscription\",\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n```\n\nThe preceding code:\n\n- Initializes the Copilot client.\n- Configures the Azure MCP server using `npx`.\n- Creates a session with the GPT-4.1 model and streaming enabled.\n- Handles events to print assistant responses and tool execution logs.\n- Sends a prompt to list Azure resource groups.\n\n---\n"
  },
  {
    "path": "articles/azure-mcp-server/includes/authentication-guidance.md",
    "content": "---\nauthor: alexwolfmsft\nms.service: azure\nms.topic: include\nms.author: alexwolf\nms.date: 02/27/2026\n---\n\n## Authenticate to Azure\n\nAzure MCP Server provides a seamless authentication experience using Azure accounts and Microsoft Entra ID. To use Azure MCP Server, you must first authenticate to Azure using local development tools such as the Azure CLI, Azure Developer CLI, Visual Studio, or Visual Studio Code. Azure MCP Server automatically discovers your credentials from these tools and uses them to authenticate to Azure services.\n\n1. For example, to sign in using the Azure CLI:\n\n    ```azurecli\n    az login\n    ```\n\n2. Verify your authentication status by running the following command to see which account and subscription you're currently signed in with:\n\n    ```azurecli\n    az account show\n    ```\n\n3. Ensure your user account has the appropriate role assignments for the Azure services you want to interact with. The Azure resources you intend to access with Azure MCP Server must already exist within your Azure subscription. For example, common role assignments include:\n\n    - **Blob Storage Data Contributor** - Read and write blob data in storage accounts.\n    - **Storage Account Contributor** - Manage storage account configurations.\n    - **Contributor** - General resource management across your subscription.\n    - **Reader** - Read-only access to Azure resources.\n\n    For more information about role assignments and local development authentication, see [Authenticate .NET apps to Azure services during local development](/dotnet/azure/sdk/authentication/local-development-dev-accounts).\n"
  },
  {
    "path": "articles/azure-mcp-server/includes/get-started-intro.md",
    "content": "---\nauthor: alexwolfmsft\nms.service: azure\nms.topic: include\nms.author: alexwolf\nms.date: 02/27/2026\n---\n\nThe Azure MCP Server uses the Model Context Protocol (MCP) to standardize integrations between AI apps and external tools and data sources, allowing for AI systems to perform operations that are context-aware of your Azure resources."
  },
  {
    "path": "articles/azure-mcp-server/includes/mcp-introduction.md",
    "content": "---\nms.topic: include\nms.date: 12/12/2025\n---\n\nThe Azure MCP Server enables AI agents and assistants to interact with Azure resources through natural language commands using the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/). Instead of manually navigating portals or writing scripts, you can describe what you want to accomplish, and the AI assistant uses the Azure MCP Server tools to perform the actions.\n"
  },
  {
    "path": "articles/azure-mcp-server/includes/mcp-prerequisites.md",
    "content": "---\nms.topic: include\nms.date: 12/12/2025\n---\n\n### MCP client requirements\n\nYou need an AI assistant or development environment that supports the Model Context Protocol. Choose one:\n\n**AI-powered code editors**:\n- [Cursor](../get-started/tools/cursor.md)\n- [Cline](../get-started/tools/cline.md)\n- [IntelliJ IDEA with MCP support](../get-started/tools/jet-brains.md)\n- [Visual Studio](../get-started/tools/visual-studio.md)\n- [Visual Studio Code](../get-started/tools/visual-studio-code.md)\n- [Windsurf](../get-started/tools/windsurf.md)\n\n**Programmatic integration**:\n- [.NET with MCP SDK](../get-started/languages/dotnet.md)\n- [Python with MCP SDK](../get-started/languages/python.md)\n\nFor complete setup instructions, see [Get started with Azure MCP Server](../get-started.md).\n"
  },
  {
    "path": "articles/azure-mcp-server/includes/mcp-usage-contexts.md",
    "content": "---\nms.topic: include\nms.date: 12/12/2025\n---\n\nThe Azure MCP Server works in three primary contexts:\n\n### In AI-powered chat and code editors\n\nUse the Azure MCP Server directly within AI assistants and code editors. As you chat about your Azure resources, the AI assistant automatically invokes Azure MCP Server tools to retrieve information, make changes, or answer questions. This is the most common usage pattern.\n\nGet started with:\n* [Cline](../get-started/tools/cline.md)\n* [Cursor](../get-started/tools/cursor.md)\n* [Eclipse](../get-started/tools/eclipse.md)\n* [IntelliJ](../get-started/tools/jet-brains.md)\n* [Visual Studio](../get-started/tools/visual-studio.md)\n* [Visual Studio Code](../get-started/tools/visual-studio-code.md)\n* [Windsurf](../get-started/tools/windsurf.md)\n* [GitHub Copilot coding agent](../how-to/github-copilot-coding-agent.md)\n\n### In programmatic applications\n\nIntegrate the Azure MCP Server into your applications using the MCP SDK. Your app acts as an MCP client and invokes Azure MCP Server tools programmatically. This approach is useful for building custom automation, chatbots, or intelligent applications that need Azure integration.\n\nGet started with:\n* [Python](../get-started/languages/python.md)\n* [.NET](../get-started/languages/dotnet.md)\n\n### In self-hosted scenarios\n\nDeploy the Azure MCP Server in your own environment for advanced control, security requirements, or custom modifications. You can run it locally, in containers, or integrate it into existing infrastructure. This pattern suits enterprise scenarios requiring air-gapped environments or custom authentication flows.\n\nLearn how to:\n* [Deploy a remote MCP server with Microsoft Foundry](../how-to/deploy-remote-mcp-server-microsoft-foundry.md)\n* [Deploy a remote MCP server with Copilot Studio](../how-to/deploy-remote-mcp-server-copilot-studio.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/includes/permissions-note.md",
    "content": "> [!NOTE]\n> The Azure resources you intend to access with Azure MCP Server must already exist within your Azure subscription. Additionally, your user account must have the necessary [RBAC roles and permissions](/azure/role-based-access-control/overview) assigned for those resources."
  },
  {
    "path": "articles/azure-mcp-server/includes/security-local-development.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.author: diberry\nms.date: 02/27/2026\n---\nThe MCP server uses your Azure user credentials or managed identity to ensure authorized access. Access is secured through Azure Role-Based Access Control (RBAC), providing fine-grained permissions for approved users. The local MCP server is intended strictly for developer use within your organization. Don't use these tools for external applications or scenarios outside the approved development environment."
  },
  {
    "path": "articles/azure-mcp-server/includes/sign-in-local-development.md",
    "content": "---\nms.topic: include\nms.date: 02/12/2026\n---\n## Sign in to Azure MCP Server for local development\n\nAzure MCP Server authenticates to [Microsoft Entra ID](/entra/identity/) using the [Azure Identity library for .NET](/dotnet/azure/sdk/authentication/). The server supports [two authentication modes](https://github.com/microsoft/mcp/blob/main/docs/Authentication.md#authentication-fundamentals):\n\n- **Broker mode**: Uses your operating system's native authentication (like Windows Web Account Manager) with `InteractiveBrowserCredential`.\n- **Credential chain mode**: Tries multiple authentication methods in sequence: environment variables, Visual Studio Code, Visual Studio, Azure CLI, Azure PowerShell, Azure Developer CLI, and interactive browser authentication.\n\nSign in using any of these methods:\n\n### [Visual Studio Code](#tab/visual-studio-code)\n1. Open the Command Palette (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac).\n1. Run **Azure: Sign In** and follow the prompts.\n\n### [Visual Studio](#tab/visual-studio)\n\n1. Go to **File > Account Settings**.\n1. Select **Add an account** and follow the prompts.\n\n### [Azure CLI](#tab/azure-cli)\n\n```azurecli\naz login\n```\n\n### [Azure PowerShell](#tab/azure-powershell)\n\n```azurepowershell\nConnect-AzAccount\n```\n\n### [Azure Developer CLI](#tab/azure-developer-cli)\n\n```azdeveloper\nazd auth login\n```\n\n---\n\nAfter signing in, Azure MCP Server can authenticate and run operations on Azure services based on your permissions.\n"
  },
  {
    "path": "articles/azure-mcp-server/includes/tools/global-parameters-list.md",
    "content": "---\ntitle: Azure Key Vault Tools \ndescription: Learn how to use the Azure MCP Server with Azure Key Vault keys.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: include\nms.custom: build-2025\n--- \n## Tool parameters\n\nThe Azure MCP Server tools define parameters for the data they need to complete tasks. For example, these parameters might include the subscription ID, an account name, or a resource group.\n\nYou might include the data for these parameters in the prompt you use to call a tool, or the previous conversation context might establish the data. If the conversation context provides the data, the Azure MCP Server can use that information without requiring you to repeat it in every prompt. This context creates a more natural conversational experience while still ensuring all necessary data is available for the tools.\n\nThe tools reference articles document the parameters specific to each tool. All of the tools also share the following global parameters.\n\n| Parameter       | Description       |\n|-----------------|-------------------|\n| **Subscription** | [Azure subscription](/azure/cloud-adoption-framework/ready/azure-best-practices/initial-subscriptions) ID or name for target resources. This parameter identifies the Azure subscription that contains the resources you want to manage. You can use either the subscription GUID or the display name. If not specified, the Azure MCP Server resolves the default subscription from your [Azure CLI](/cli/azure/) profile (set via [`az account set`](/cli/azure/account#az-account-set)) or the `AZURE_SUBSCRIPTION_ID` environment variable. Required for most operations unless a default is configured. |\n| **Resource group** | The name of the Azure resource group. This is a logical container for Azure resources that helps organize and manage related resources together. Required for most resource-specific operations. |\n| **Tenant Id** | [Azure tenant](/azure/cloud-adoption-framework/ready/landing-zone/design-area/azure-ad-define) ID for authentication. This parameter specifies the Microsoft Entra ID tenant to authenticate against. Can be either the GUID identifier or the display name of your Entra ID tenant. Optional - uses default tenant if not specified. |\n| **Authentication method** | [Authentication method](/entra/identity/authentication/concept-authentication-methods) to use for Azure operations. Options include `credential` (Azure CLI/managed identity), `key` (access key), or `connectionString`. Default is `credential`, which uses Azure CLI authentication or managed identity. |\n| **Maximum retries** | Maximum number of retry attempts for failed operations before giving up. Controls how many times the system attempts to retry a failed request. Default is 3 retries. |\n| **Retry delay** | Initial delay in seconds between retry attempts. For exponential backoff, this value is used as the base delay that gets multiplied on each retry. Default is 2 seconds. |\n| **Retry delay maximum** | Maximum delay in seconds between retries, regardless of the retry strategy. This parameter caps the delay time to prevent excessively long waits. Default is 10 seconds. |\n| **Retry mode** | Retry strategy to use when operations fail. `fixed` uses consistent delays between retries, while `exponential` increases the delay between each attempt. Default is `exponential` for better handling of temporary issues. |\n| **Retry network timeout** | Network operation timeout in seconds. When operations take longer than this timeout, they are canceled and might be retried if retries are enabled. Default is 100 seconds. |\n\nExample prompts include:\n\n- **Set subscription**: \"Use subscription 'my-subscription-id' for all operations\"\n- **Use tenant ID**: \"Authenticate using tenant ID 'my-tenant-id'\"\n- **Set authentication method**: \"Use 'credential' authentication for this session\"\n- **Configure retries**: \"Set maximum retries to 5 with a 3-second delay\n- **Set retry mode**: \"Use 'fixed' retry mode with a maximum delay of 5 seconds\"\n- **Set network timeout**: \"Set network timeout to 120 seconds for all operations\"\n- **Configure retry parameters**: \"Use exponential retry mode with a maximum of 4 retries and a delay of 2 seconds\"\n"
  },
  {
    "path": "articles/azure-mcp-server/includes/tools/parameter-consideration.md",
    "content": "---\n author: diberry\n ms.author: diberry\n ms.service: azure-mcp-server\n ms.topic: include\n ms.date: 02/27/2026\n---\n\n\n> [!NOTE]\n> **Tool parameters**: The Azure MCP Server tools define parameters for data they need to complete tasks. Some of these parameters are specific to each tool and are documented below. Other parameters are global and shared by all tools. For more information, see [Tool parameters](../../tools/index.md#tool-parameters).\n"
  },
  {
    "path": "articles/azure-mcp-server/includes/tools/server-start-options.md",
    "content": "---\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: include\nms.date: 02/09/2026\nms.reviewer: anannyapatra\n---\n\n## Azure MCP Server start parameters\n\nThe `azmcp` server supports the following options for server start parameters:\n\n| Option | Required or optional | Description |\n|--------|----------------------|-------------|\n| **Debug** | Optional | Enable debug mode with verbose logging to `stderr`. Default: `false`. |\n| **Enable insecure transports** | Optional | Enable insecure transport. Default: `false`. |\n| **Disable user confirmation** (Not recommended) | Optional | Disable user confirmation (elicitation) before allowing high risk commands to run, such as returning secrets (passwords) from KeyVault. When enabled, tools that handle secrets, credentials, or sensitive data will execute without user confirmation. This removes an important security layer designed to prevent unauthorized access to sensitive information. Only use this option in trusted, automated environments where user interaction isn't possible. Never use this option in production environments or when handling untrusted input. Default: `false`. |\n| **Mode** | Optional | Server mode: `namespace` (default), `consolidated`, `all`, or `single`. Default: `namespace`. |\n| **Namespace** | Optional | The Azure service namespaces to expose on the MCP server (for example, `storage`, `keyvault`, `cosmos`). Default: all namespaces. |\n| **Read only** | Optional | Whether the MCP server should be read-only. If true, no write operations are allowed. Default: `false`. |\n| **Tool**| Optional | Expose specific tools by name (for example, `azmcp_storage_account_get`). It automatically switches to `all` mode. Default: all tools. |\n| **Transport** | Optional | Transport mechanism to use for Azure MCP Server. Default: `stdio`. |\n"
  },
  {
    "path": "articles/azure-mcp-server/includes/tools/supported-azure-services.md",
    "content": "---\n author: diberry\n ms.author: diberry\n ms.service: azure-mcp-server\n ms.topic: include\n ms.date: 03/11/2026\n---\n\n## Available tools\n\nAzure MCP Server provides the following tools for Azure services and Azure-related functionality.\n\n### Best practices\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure best practices](../../tools/azure-best-practices.md) | `get azure bestpractices get` | Get guidance on Azure Functions development, deployment, and Azure SDK usage. |\n| [Azure AI best practices for app development](../../tools/azure-best-practices.md) | `get azure bestpractices ai app` | Get best practices and code generation guidance for building AI applications in Azure. Use it when you need recommendations on writing code for AI agents, chatbots, workflows, or any AI/LLM features. Additionally, this command provides guidance for code generation on Microsoft Foundry for application development. |\n| [Terraform best practices for Azure](../../tools/azure-terraform-best-practices.md) | `azureterraformbestpractices` | Get guidance on implementing Terraform for Azure resources. |\n\n### AI and Machine Learning\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Microsoft Foundry](../../tools/azure-foundry.md) | `foundry` | Work with Foundry models, deployments, and endpoints. |\n| [Azure AI Search](../../tools/azure-ai-search.md) | `search` | Manage Azure AI Search resources, including search services, indexes, and queries. |\n| [Azure Speech in Foundry Tools](../../tools/ai-services-speech.md) | `speech` | Manage Speech resources such as speech-to-text and text-to-speech services. |\n\n### Analytics\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure App Lens](../../tools/azure-app-lens.md) | `applens` | Diagnose and analyze application performance issues using Azure App Lens. |\n| [Azure Data Explorer](../../tools/azure-data-explorer.md) | `kusto` | Work with Azure Data Explorer clusters, databases, tables, and queries. |\n| [Azure Event Hubs](../../tools/azure-event-hubs.md) | `eventhubs` | Manage Azure Event Hubs namespaces and event hubs. |\n\n\n\n### Compute\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure App Service](../../tools/azure-app-service.md) | `appservice` | Manage web apps, database connections, diagnostics, deployments, and application settings for Azure App Service. |\n| [Azure Functions](../../tools/azure-functions.md) | `functionapp` | List Azure Functions. |\n| [Azure Kubernetes Service](../../tools/azure-kubernetes.md) | `aks` | List Azure Kubernetes Service clusters. |\n| [Azure Service Fabric](../../tools/azure-service-fabric.md) | `servicefabric` | Manage Service Fabric managed clusters, including node details and restarts. |\n| [Azure Compute](../../tools/azure-compute.md) | `compute` | Get details for Azure virtual machines, virtual machine scale sets, and managed disks. |\n\n### Containers\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure Container Registry](../../tools/azure-container-registry.md) | `acr` | List Azure Container Registry instances. |\n| [Azure Functions](../../tools/azure-functions.md) | `functionapp` | List Azure Functions. |\n| [Azure Kubernetes Service](../../tools/azure-kubernetes.md) | `aks` | List Azure Kubernetes Service clusters. |\n| [Azure Service Fabric](../../tools/azure-service-fabric.md) | `servicefabric` | Manage Service Fabric managed clusters, including node details and restarts. |\n\n### Databases\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure Cosmos DB](../../tools/azure-cosmos-db.md) | `cosmos` | Work with Azure Cosmos DB accounts, databases, containers, and documents. |\n| [Azure Database for MySQL](../../tools/azure-mysql.md) | `mysql` | Manage Azure Database for MySQL servers, databases, and tables. |\n| [Azure Database for PostgreSQL](../../tools/azure-database-postgresql.md) | `postgres` | Manage Azure Database for PostgreSQL servers, databases, and tables. |\n| [Azure Redis](../../tools/azure-redis.md) | `redis` | Create and list Azure Redis resources, including Managed Redis and Cache for Redis. |\n| [Azure SQL](../../tools/azure-sql.md) | `sql` | Work with Azure SQL Database servers, databases, firewall rules, and elastic pools. |\n\n### Developer tools\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure App Configuration](../../tools/app-configuration.md) | `appconfig` | Manage centralized application settings and feature flags. |\n| [Azure Application Insights](../../tools/application-insights.md) | `applicationinsights` | List Application Insights resources. |\n| [Azure CLI](../../tools/azure-cli.md) | `extension` | Find Azure CLI commands and get installation instructions for CLI tools. |\n| [Azure Developer CLI](../../tools/azure-cli.md) | `extension` | Get installation instructions for Azure Developer CLI (azd), learn usage for deployment scenarios, and access azd MCP tools when azd is installed locally |\n| [Azure Load Testing](../../tools/azure-load-testing.md) | `loadtesting` | Create, run, and see load testing. |\n\n### DevOps\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure Bicep schema](../../tools/azure-bicep-schema.md) | `bicepschema` | Retrieve Bicep schemas for Azure resources to use in Infrastructure as Code templates. |\n| [Azure Deploy](../../tools/azure-deploy.md) | `deploy` | Deploy and manage Azure resources using templates and scripts. |\n| [Azure Developer CLI](../../tools/azure-cli.md) | `extension` | Get installation instructions for Azure Developer CLI (azd), learn usage for deployment scenarios, and access azd MCP tools when azd is installed locally |\n| [Azure Managed Grafana](../../tools/azure-grafana.md) | `grafana` | List Azure Managed Grafana workspaces. |\n| [Azure Monitor](../../tools/azure-monitor.md) | `monitor` | Query Azure Monitor logs and metrics. |\n| [Azure Workbooks](../../tools/azure-monitor.md) | `workbooks` | Create, manage, and update Azure Workbooks for data visualization and reporting. |\n\n\n### Hybrid and multicloud\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure Database for PostgreSQL](../../tools/azure-database-postgresql.md) | `postgres` | Manage Azure Database for PostgreSQL servers, databases, and tables. |\n| [Azure SQL](../../tools/azure-sql.md) | `sql` | Work with Azure SQL Database servers, databases, firewall rules, and elastic pools. |\n\n### Identity\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure RBAC](../../tools/azure-rbac.md) | `role` | View and manage Azure role-based access control assignments. |\n\n### Integration\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure Event Grid](../../tools/azure-event-grid.md) | `eventgrid` | Manage Azure Event Grid resources, including topics and subscriptions. |\n| [Azure Native ISV](../../tools/azure-native-isv.md) | `datadog` | Work with Azure Native ISV services, including Datadog integration for monitoring and observability. |\n| [Azure Service Bus](../../tools/azure-service-bus.md) | `servicebus` | Manage Azure Service Bus resources, including queues, topics, and peek at messages. |\n\n### Internet of Things (IoT)\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure Cosmos DB](../../tools/azure-cosmos-db.md) | `cosmos` | Work with Azure Cosmos DB accounts, databases, containers, and documents. |\n| [Azure Event Grid](../../tools/azure-event-grid.md) | `eventgrid` | Manage Azure Event Grid resources, including topics and subscriptions. |\n| [Azure Functions](../../tools/azure-functions.md) | `functionapp` | List Azure Functions. |\n\n### Management and governance\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure Advisor](../../tools/azure-advisor.md) | `advisor` | Get recommendations to optimize Azure resources and improve performance. |\n| [Azure Cloud Architect](../../tools/azure-cloud-architect.md) | `cloudarchitect` | Design cloud systems by gathering requirements through guided questions and recommending optimal solutions. |\n| [Azure Managed Grafana](../../tools/azure-grafana.md) | `grafana` | List Azure Managed Grafana workspaces. |\n| [Azure Migrate](../../tools/azure-migrate.md) | `azuremigrate` | Get step-by-step guidance for changing a Platform Landing Zone and make or download platform landing zone setups for Azure Migrate projects. |\n| [Azure Monitor](../../tools/azure-monitor.md) | `monitor` | Query Azure Monitor logs and metrics. |\n| [Azure Policy](../../tools/azure-policy.md) | `policy` | Manage Azure Policy assignments, definitions, and initiatives. |\n| [Azure Pricing](../../tools/azure-pricing.md) | `pricing` | Get Azure retail pricing, cost estimates, and billing details for services, SKUs, and regions. |\n| [Azure Quick Review CLI](../../tools/azure-compliance-quick-review.md) | `extension` | Generate compliance and security reports for Azure resources. |\n| [Azure Quotas](../../tools/azure-quotas.md) | `quota` | Manage Azure resource quotas and limits. |\n| [Azure Resource Health](../../tools/azure-resource-health.md) | `resourcehealth` | Check availability status, view health events, and track service-impacting issues for Azure resources. |\n| [Azure Well-Architected Framework](../../tools/azure-well-architected-framework.md) | `wellarchitectedframework` | Get architectural best practices, design patterns, and recommendations for Azure services based on the five Well-Architected Framework pillars. |\n| [Azure Workbooks](../../tools/azure-monitor.md) | `workbooks` | Create, manage, and update Azure Workbooks for data visualization and reporting. |\n| [Resource Groups](../../tools/resource-group.md) | `group` | List Azure resource groups and list resources within a group. |\n| [Subscription](../../tools/subscription.md) | `subscription` | List Azure subscriptions. |\n\n### Messaging\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure Event Grid](../../tools/azure-event-grid.md) | `eventgrid` | Manage Azure Event Grid resources, including topics and subscriptions. |\n| [Azure Event Hubs](../../tools/azure-event-hubs.md) | `eventhubs` | Manage Azure Event Hubs namespaces and event hubs. |\n| [Azure Service Bus](../../tools/azure-service-bus.md) | `servicebus` | Manage Azure Service Bus resources, including queues, topics, and peek at messages. |\n\n### Mobile\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Foundry](../../tools/azure-foundry.md) | `foundry` | Work with Foundry models, deployments, and endpoints. |\n| [Azure AI Search](../../tools/azure-ai-search.md) | `search` | Manage Azure AI Search resources, including search services, indexes, and queries. |\n| [Azure App Configuration](../../tools/app-configuration.md) | `appconfig` | Manage centralized application settings and feature flags. |\n| [Azure Communication Services](../../tools/azure-communication.md) | `communication` | Send SMS and email messages using Azure Communication Services. |\n\n### Security\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure App Configuration](../../tools/app-configuration.md) | `appconfig` | Manage centralized application settings and feature flags. |\n| [Azure Confidential Ledger](../../tools/azure-confidential-ledger.md) | `confidentialledger` | Manage Azure Confidential Ledger resources, including ledgers and transactions. |\n| [Azure Key Vault](../../tools/azure-key-vault.md) | `keyvault` | List and create keys, secrets, certificates in Azure Key Vault. |\n\n### Storage\n\n| Product, tool, or service | Namespace | Description |\n|------|------|------------|\n| [Azure Confidential Ledger](../../tools/azure-confidential-ledger.md) | `confidentialledger` | Manage Azure Confidential Ledger resources, including ledgers and transactions. |\n| [Azure File Sync](../../tools/azure-file-sync.md) | `storagesync` | Manage Azure file sync services, register servers, create sync groups, configure cloud endpoints, and set up server endpoints for Azure File Sync. |\n| [Azure Files](../../tools/azure-file-shares.md) | `fileshares` | Manage Azure file shares, including creating, updating, deleting, and snapshotting file shares. |\n| [Azure Managed Lustre](../../tools/azure-managed-lustre.md) | `managedlustre` | Manage Azure Managed Lustre file systems, including auto-import and auto-export jobs. |\n| [Azure Storage](../../tools/azure-storage.md) | `storage` | Manage Azure Storage accounts, containers, blobs, and tables. |\n| [Azure Storage](../../tools/storage.md) | `storage` | List Azure Storage accounts, containers, blobs, and tables. |\n\n\n### Virtual desktop infrastructure (VDI)\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure Virtual Desktop](../../tools/azure-virtual-desktop.md) | `virtualdesktop` | Manage Azure Virtual Desktop host pools, session hosts, and user sessions. |\n\n### Web\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure AI Search](../../tools/azure-ai-search.md) | `search` | Manage Azure AI Search resources, including search services, indexes, and queries. |\n| [Azure App Configuration](../../tools/app-configuration.md) | `appconfig` | Manage centralized application settings and feature flags. |\n| [Azure App Service](../../tools/azure-app-service.md) | `appservice` | Manage web apps, database connections, diagnostics, deployments, and application settings for Azure App Service. |\n| [Azure Communication Services](../../tools/azure-communication.md) | `communication` | Send SMS and email messages using Azure Communication Services. |\n| [Azure Functions](../../tools/azure-functions.md) | `functionapp` | List Azure Functions. |\n| [Azure SignalR](../../tools/azure-signalr.md) | `signalr` | Manage Azure SignalR resources and runtimes. |\n\n### Other\n\n| Product, tool, or service | Namespace | Description |\n|------|------|--------------|\n| [Azure Marketplace](../../tools/azure-marketplace.md) | `marketplace` | Discover Azure Marketplace products and offers. |\n| [Azure MCP tool](../../tools/azure-mcp-tool.md) | No namespace | Discover and manage available Azure MCP Server tools. |\n\n"
  },
  {
    "path": "articles/azure-mcp-server/includes/tools/tool-annotation-hints.md",
    "content": "---\nms.topic: include\nms.date: 02/27/2026\n---\n## Tool annotations for Azure MCP Server\n\n[Tool annotations](https://modelcontextprotocol.io/specification/2025-06-18/schema#toolannotations) are hints that provide additional information about the characteristics of each tool. The following table describes the possible hints that can be associated with a tool.\n\n| Name | Description |\n|------|-------------|\n| **Destructive** | Indicates whether the tool can make destructive updates to its environment. If true, the tool might delete or modify existing resources. If false, the tool only adds new resources without removing or altering existing ones. |\n| **Idempotent** | Specifies if repeated calls with the same arguments produce the same result without side effects. If true, multiple executions with the same arguments produce the same result. If false, repeated executions might have additional effects or yield different results. |\n| **Open world** | Defines whether the tool might interact with an \"open world\" of external entities. If true, the tool might interact with an unpredictable or dynamic set of entities (for example, web search). If false, the tool's domain of interaction is closed and well-defined (for example, memory access). |\n| **Read only** | Indicates if the tool performs only read operations. If true, there's no change of state of the environment. If false, the tool might make modifications to its environment. |\n| **Secret** | Microsoft proprietary annotation that indicates if the tool's response might contain sensitive data requiring sanitization. If true, the response might include secrets, credentials, or keys that should be sanitized before forwarding to the LLM or logging. If false, the response doesn't contain sensitive information. |\n| **Local required** | Microsoft proprietary annotation to indicate if the tool requires local execution or resources. If true, the tool is only available when the Azure MCP server runs in Local (STDIO) mode. If false, the tool is available in both local and remote server modes. |"
  },
  {
    "path": "articles/azure-mcp-server/includes/tools/user-consent.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.author: diberry\nms.date: 02/27/2026\n---\n\nTools that handle sensitive data, such as secrets, require user consent before execution through a security mechanism called **elicitation**. When you use tools that access sensitive information, the MCP client prompts you to confirm the operation before proceeding.\n\n> **🛡️ Elicitation (user confirmation) Security Feature:**\n> \n> Elicitation prompts appear when tools might expose sensitive information like:\n> - Key Vault secrets\n> - Connection strings and passwords\n> - Certificate private keys\n> - Other confidential data\n>\n> These prompts protect against unauthorized access to sensitive information. You can bypass elicitation only in automated scenarios."
  },
  {
    "path": "articles/azure-mcp-server/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure MCP Server documentation\nsummary: Learn how to use the Azure MCP Server to manage Azure resources through natural language commands. Connect from GitHub Copilot, custom AI agents, and MCP-compatible clients to access Azure services using the Model Context Protocol (MCP).\n\nmetadata:\n  title: Azure MCP Server documentation\n  description: Learn how to use the Azure MCP Server to interact with Azure resources through natural language commands from AI agents and other types of clients.\n  ms.topic: landing-page\n  ms.date: 02/09/2026\n\nlandingContent:\n  # Card\n  - title: Get started\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: What is Azure MCP Server?\n            url: overview.md\n      - linkListType: how-to-guide\n        links:\n          - text: Install with the Azure Skills Plugin\n            url: https://github.com/microsoft/azure-skills\n          - text: Install in an IDE\n            url: get-started.md#use-a-code-editor\n          - text: Install with a package manager\n            url: get-started.md#install-azure-mcp-server-using-a-package-manager\n          - text: Connect GitHub Copilot coding agent to the Azure MCP Server\n            url: how-to/github-copilot-coding-agent.md\n      - linkListType: quickstart\n        links:\n          - text: Connect from Cline\n            url: get-started/tools/cline.md\n          - text: Connect from Cursor\n            url: get-started/tools/cursor.md\n          - text: Connect from Eclipse\n            url: get-started/tools/eclipse.md\n          - text: Connect from IntelliJ\n            url: get-started/tools/jet-brains.md\n          - text: Connect from Visual Studio\n            url: get-started/tools/visual-studio.md\n          - text: Connect from Visual Studio Code\n            url: get-started/tools/visual-studio-code.md\n          - text: Connect from Windsurf\n            url: get-started/tools/windsurf.md\n\n\n  - title: How-to\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Connect GitHub Copilot coding agent to the Azure MCP Server\n            url: how-to/github-copilot-coding-agent.md\n          - text: Connect Azure MCP Server to sovereign clouds\n            url: how-to/connect-sovereign-clouds.md\n          - text: Deploy remote MCP Server with Copilot Studio\n            url: how-to/deploy-remote-mcp-server-copilot-studio.md\n          - text: Deploy remote MCP Server with Microsoft Foundry\n            url: how-to/deploy-remote-mcp-server-microsoft-foundry.md\n\n  - title: Languages and frameworks\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Use with .NET applications\n            url: get-started/languages/dotnet.md\n          - text: Use with Python applications\n            url: get-started/languages/python.md\n\n  - title: Understand Azure MCP Server\n    linkLists:\n      - linkListType: concept\n        links:\n          - text: Model Context Protocol overview\n            url: overview.md#key-features\n          - text: Scenarios for using Azure MCP Server\n            url: overview.md#scenarios-for-using-the-azure-mcp-server\n          - text: Authentication and permissions\n            url: overview.md\n  - title: Azure MCP Server tools\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: What are the Azure MCP Server tools?\n            url: tools/index.md\n      - linkListType: reference\n        links:\n          - text: Azure best practices\n            url: tools/azure-best-practices.md\n          - text: Azure AI Search\n            url: tools/ai-search.md\n          - text: Azure App Configuration\n            url: tools/app-configuration.md\n          - text: Azure Cosmos DB\n            url: tools/azure-cosmos-db.md\n          - text: Azure Developer CLI\n            url: tools/azure-cli.md\n          - text: Azure Key Vault\n            url: tools/azure-key-vault.md\n          - text: Azure Monitor\n            url: tools/monitor.md\n          - text: Azure RBAC\n            url: tools/azure-rbac.md\n          - text: Azure Redis\n            url: tools/azure-cache-for-redis.md\n          - text: Complete list of tools\n            url: tools/index.md#available-tools\n  - title: Resources\n    linkLists:\n      - linkListType: reference\n        links:\n          - text: Azure MCP Server GitHub repository\n            url: https://github.com/microsoft/mcp/tree/main/servers/Azure.Mcp.Server\n          - text: Model Context Protocol documentation\n            url: https://modelcontextprotocol.io/\n      - linkListType: how-to-guide\n        links:\n          - text: Authentication guidance\n            url: overview.md\n          - text: Tool reference\n            url: tools/index.md\n"
  },
  {
    "path": "articles/azure-mcp-server/overview.md",
    "content": "---\ntitle: What is the Azure MCP Server?\ndescription: Learn about the Azure MCP Server, its features, and how it helps developers build and deploy apps to Azure. Discover benefits and get started today.\n#customer intent: As a developer, I want to understand what the Azure MCP Server is so that I can determine if it fits my app development needs.\nms.date: 02/09/2026\nauthor: diberry\nms.author: diberry\nms.reviewer: sandeepsen\nms.topic: overview\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.custom: build-2025\n---\n\n# What is the Azure MCP Server?\n\nThe Azure MCP Server enables AI agents and clients to interact with Azure resources using natural language commands. This article explains its features, benefits, and how it helps developers build and deploy apps to Azure.\n\nIt implements the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) and supports a wide range of tools, languages, and frameworks to help you build and deploy apps to Azure.\n\n## Key features\n\n- **MCP support**: The Azure MCP Server implements the Model Context Protocol, making it compatible with MCP clients such as GitHub Copilot agent mode, the OpenAI Agents SDK, and Semantic Kernel.\n- **Entra ID authentication**: The server uses Entra ID through the Azure Identity library, following Azure authentication best practices.\n- **Service and tool integration**: The server supports Azure services and tools, including the Azure CLI, Azure Developer CLI (azd), and a broad set of Azure resources.\n- **Azure Skills Plugin**: The [Azure Skills Plugin](https://github.com/microsoft/azure-skills) packages 19+ reusable Azure skills (such as azure-prepare, azure-validate, azure-deploy, azure-diagnostics, and azure-cost) designed to work with the Azure MCP Server and the Foundry MCP Server. Skills enable structured workflows and guardrails for real Azure operations, are version-controlled, and load on demand.\n\n## Supported code editors and tools\n\nYou can connect to the Azure MCP Server from popular code editors and tools, including:\n\n- [**Visual Studio Code**](get-started/tools/visual-studio-code.md)\n- [**Visual Studio**](get-started/tools/visual-studio.md)\n- [**Eclipse**](get-started/tools/eclipse.md)\n- [**Cursor**](get-started/tools/cursor.md)\n- [**Windsurf**](get-started/tools/windsurf.md)\n- [**IntelliJ**](get-started/tools/jet-brains.md)\n- [**Cline**](get-started/tools/cline.md)\n\n## Supported languages and frameworks\n\nThe Azure MCP Server supports multiple languages and frameworks, such as:\n\n- [**Python**](get-started/languages/python.md)\n- [**.NET**](get-started/languages/dotnet.md)\n\n## Concepts\n\nThe [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) is an open protocol designed to manage how language models interact with external tools, memory, and context in a safe, structured, and stateful way. MCP defines a client-server architecture with several components:\n\n- **Hosts**: Apps that use MCP clients to connect to and consume data from MCP servers.\n- **Clients**: Components of MCP hosts that manage connections and retrieve data from MCP servers.\n- **Servers**: Programs that provide features like data resources, tools for performing actions, and prompts to guide interactions.\n\nFor example, **Visual Studio Code** is considered a host, and GitHub Copilot agent mode in **Visual Studio Code** acts as an MCP client that connects to MCP servers. You can also build custom intelligent apps that host their own MCP client to connect to MCP servers.\n\nThe Azure MCP Server implements a set of [tools](./tools/index.md) per the Model Context Protocol. AI agents and other types of clients use these tools to interact with Azure resources.\n\n## How-to guides\n\nYou can find step-by-step instructions for common tasks, including:\n\n- [Connect GitHub Copilot coding agent to Azure MCP Server](how-to/github-copilot-coding-agent.md)\n- [Deploy a self-hosted Azure MCP Server (Microsoft Foundry)](how-to/deploy-remote-mcp-server-microsoft-foundry.md)\n- [Deploy a self-hosted Azure MCP Server (Copilot Studio)](how-to/deploy-remote-mcp-server-copilot-studio.md)\n\n## Tools and best practices\n\nThe Azure MCP Server offers a wide range of tools for Azure development. For best practices and tool reference, see [Tools overview](tools/index.md).\n\n## Scenarios for using the Azure MCP Server\n\nThe most common scenario is connecting to the Azure MCP Server from an existing client, such as GitHub Copilot agent mode in **Visual Studio Code** or a custom intelligent app. The client can use all available [tools](./tools/index.md) to access and interact with Azure resources using natural language. For example, you can use GitHub Copilot agent mode with the Azure MCP Server to list Azure storage accounts or run KQL queries on Azure databases. To learn how to connect to Azure MCP Server from an existing client, see [Get started using the Azure MCP Server](get-started.md).\n\nIn advanced scenarios, you might create your own MCP servers to offer custom tools, resources, and prompts for specific tasks involving Azure resources. If you're building an MCP server that needs to connect with Azure, you can use the Azure MCP Server tools from your MCP server.\n\n[!INCLUDE [security-developer-environment](./includes/security-local-development.md)]\n\n## Related content\n\n- [Get started using the Azure MCP Server](get-started.md)\n- [Azure MCP Server tools](./tools/index.md)\n- [Model Context Protocol documentation](https://modelcontextprotocol.io/introduction)\n- [Azure MCP Server repository](https://github.com/microsoft/mcp/tree/main/servers/Azure.Mcp.Server)\n"
  },
  {
    "path": "articles/azure-mcp-server/services/azure-mcp-server-for-app-service.md",
    "content": "---\ntitle: Manage Azure App Service with Azure MCP Server\ndescription: Learn how to use the Azure MCP Server to manage App Service resources and configure database connections through AI-powered natural language interactions.\nauthor: diberry\nms.author: diberry\nms.service: azure-app-service\nms.topic: how-to\nms.date: 03/20/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-generated\nms.custom: build-2025\n\n#customer intent: As an Azure App Service developer, I want to manage app services and configure database connections using natural language conversations so that I can quickly set up and verify configurations without navigating portals.\n\n---\n\n# Manage Azure App Service with Azure MCP Server\n\nManage web applications and configure database connections using natural language conversations with AI assistants through the Azure MCP Server.\n\n[Azure App Service](/azure/app-service/overview) is a fully managed platform for building, deploying, and scaling web applications. It supports multiple programming languages and frameworks with integrated developer tools. While the Azure portal and Azure CLI are powerful, the Azure MCP Server provides a more intuitive way to interact with your App Service resources through conversational AI.\n\n## What is the Azure MCP Server?\n\n[!INCLUDE [mcp-introduction](../includes/mcp-introduction.md)]\n\nFor Azure App Service developers, this means you can:\n\n- Add a database connection for an App Service\n- Diagnose web app issues using built-in detectors\n- List available diagnostic detectors for a web app\n- Retrieve detailed information about web app deployments\n- Retrieve detailed information about web apps\n- Retrieve application settings for an App Service web app\n- Update application settings for an App Service web app\n\n## Prerequisites\n\nTo use the Azure MCP Server with Azure App Service, you need:\n\n### Azure requirements\n\n- **Azure subscription**: An active Azure subscription. [Create one for free](https://azure.microsoft.com/free/).\n- **Azure App Service resources**: At least one App Service in your subscription, or permissions to create them.\n- **Database resource**: An existing database resource to connect to your App Service.\n- **Azure permissions**: Appropriate roles to perform the operations you want. See [Azure Built-in Roles](/azure/role-based-access-control/built-in-roles).\n\n[!INCLUDE [mcp-prerequisites](../includes/mcp-prerequisites.md)]\n\n## Where can you use Azure MCP Server?\n\n[!INCLUDE [mcp-usage-contexts](../includes/mcp-usage-contexts.md)]\n\n## Available tools for Azure App Service\n\nAzure MCP Server provides the following tools for Azure App Service operations:\n\n| Tool | Description |\n| --- | --- |\n| `appservice database add` | Add a database connection for an app using a connection string. |\n| `appservice webapp diagnostic diagnose` | Run a diagnostic detector on a web app and return the results. |\n| `appservice webapp diagnostic list` | List available diagnostic detectors for a web app. |\n| `appservice webapp deployment get` | Retrieve detailed information about web app deployments. |\n| `appservice webapp get` | Retrieve detailed information about Azure App Service web apps. |\n| `appservice webapp settings get-appsettings` | Retrieve application settings for an App Service web app. |\n| `appservice webapp settings update-appsettings` | Update application settings for an App Service web app. |\n\nFor detailed information about each tool, including parameters and examples, see [Azure App Service tools for Azure MCP Server](../tools/azure-app-service.md).\n\n## Get started\n\nReady to use Azure MCP Server with your Azure App Service resources?\n\n1. **Set up your environment**: Choose an AI assistant or development tool that supports MCP. For setup and authentication instructions, see the links in the [Where can you use Azure MCP Server?](#where-can-you-use-azure-mcp-server) section above.\n\n1. **Start exploring**: Ask your AI assistant questions about your App Service resources or request operations. Try prompts like:\n   - \"Add a database connection for 'myapp' to a SQL database named 'mydatabase' with Azure SQL server.\"\n   - \"Diagnose web app 'myapp' in resource group 'rg-prod' with detector 'Availability'.\"\n   - \"List the diagnostic detectors for web app 'myapp' in resource group 'rg-prod'.\"\n   - \"Retrieve details for deployment ID '12345' for web app 'myapp'.\"\n   - \"Retrieve details for web app 'myapp'.\"\n   - \"Retrieve application settings for web app 'myapp'.\"\n   - \"Update app setting 'API_URL' for web app 'myapp' to 'https://api.example.com'.\"\n\n1. **Learn more**: Review the [Azure App Service tools reference](../tools/azure-app-service.md) for all available capabilities and detailed parameter information.\n\n## Best practices\n\nWhen using Azure MCP Server with Azure App Service:\n\n- **Use diagnostics to investigate issues**: Run detectors like `Availability` and `CpuAnalysis` to troubleshoot app health before making configuration changes.\n- **Use version control for settings**: Track changes to application settings to prevent configuration drift.\n- **Verify settings before applying updates**: Use get-appsettings to confirm current settings before making changes.\n\n## Related content\n\n* [Azure MCP Server overview](../overview.md)\n* [Get started with Azure MCP Server](../get-started.md)\n* [Azure App Service tools reference](../tools/azure-app-service.md)\n* [Azure App Service documentation](/azure/app-service/overview)\n* [App Service best practices](/azure/app-service/app-service-best-practices)\n"
  },
  {
    "path": "articles/azure-mcp-server/services/azure-mcp-server-for-functions.md",
    "content": "---\ntitle: Manage Azure Functions with Azure MCP Server\ndescription: Learn how to use the Azure MCP Server to manage function apps, review configurations, and troubleshoot deployments through AI-powered natural language interactions.\nauthor: diberry\nms.author: diberry\nms.service: azure-functions\nms.topic: how-to\nms.date: 12/12/2025\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-generated\nms.custom: build-2025\n\n#customer intent: As an Azure Functions developer, I want to manage function apps using natural language conversations so that I can quickly verify configurations and troubleshoot issues without navigating portals.\n\n---\n\n# Manage Azure Functions with Azure MCP Server\n\nManage function apps, review configurations, and troubleshoot deployments using natural language conversations with AI assistants through the Azure MCP Server.\n\n[Azure Functions](/azure/azure-functions/) is a serverless compute service that enables you to run event-driven code without managing infrastructure. While the Azure portal, Azure CLI, and Azure Functions Core Tools are powerful, the Azure MCP Server provides a more intuitive way to interact with your function apps through conversational AI.\n\n## What is the Azure MCP Server?\n\n[!INCLUDE [mcp-introduction](../includes/mcp-introduction.md)]\n\nFor Azure Functions developers, this means you can:\n\n- Retrieve function app details and settings without navigating the portal\n- Check function app status and configuration through simple questions\n- Review hostnames and deployment information conversationally\n- Troubleshoot function app issues by asking about current state\n- Compare function app configurations across environments\n- Verify function app settings before and after deployments\n\n## Prerequisites\n\nTo use the Azure MCP Server with Azure Functions, you need:\n\n### Azure requirements\n\n- **Azure subscription**: An active Azure subscription. [Create one for free](https://azure.microsoft.com/free/).\n- **Azure Functions resources**: At least one function app in your subscription, or permissions to create them.\n- **Azure permissions**: Appropriate roles like Contributor or Website Contributor to perform the operations you want. See [Azure Functions security documentation](/azure/azure-functions/security-concepts).\n\n[!INCLUDE [mcp-prerequisites](../includes/mcp-prerequisites.md)]\n\n## Where can you use Azure MCP Server?\n\n[!INCLUDE [mcp-usage-contexts](../includes/mcp-usage-contexts.md)]\n\n## Available tools for Azure Functions\n\nThe Azure MCP Server provides one tool specifically designed for Azure Functions operations, enabling you to retrieve function app information through natural language conversations.\n\n### Get function app details\n\nGet detailed information about your function apps, including configuration, status, hostnames, and deployment details.\n\n**Common scenarios**:\n\n- Get function app details to verify configuration before deployments\n- Get function app status to check runtime information across environments\n- List hostnames for a function app to review custom domains\n\nFor detailed information about each tool, including parameters and examples, see [Azure Functions tools for Azure MCP Server](../tools/azure-functions.md).\n\n## Get started\n\nReady to use Azure MCP Server with your Azure Functions resources?\n\n1. **Set up your environment**: Choose an AI assistant or development tool that supports MCP. For setup and authentication instructions, see the links in the [Where can you use Azure MCP Server?](#where-can-you-use-azure-mcp-server) section above.\n\n2. **Start exploring**: Ask your AI assistant questions about your function apps or request operations. Try prompts like:\n   - \"Show me details for my function app 'my-functions' in resource group 'my-rg'\"\n   - \"What's the current status of function app 'api-backend'?\"\n   - \"List the hostnames for function app 'public-api'\"\n\n3. **Learn more**: Review the [Azure Functions tools reference](../tools/azure-functions.md) for all available capabilities and detailed parameter information.\n\n## Best practices\n\nWhen using Azure MCP Server with Azure Functions:\n\n- **Specify resource group**: Always include the resource group name when querying function apps to avoid ambiguity in subscriptions with many resources.\n- **Verify before changes**: Use read queries to understand current function app state before making configuration changes or deployments.\n- **Compare environments**: Leverage conversational queries to compare function app settings across development, staging, and production environments for configuration consistency.\n- **Check status regularly**: Ask about function app status and health as part of your deployment verification workflow to catch issues early.\n- **Document configurations**: Use the conversation history to document current function app configurations for team knowledge sharing and troubleshooting.\n- **Combine with other tools**: Use Azure MCP Server for quick queries and Azure Functions Core Tools for deployments to optimize your development workflow.\n\n## Related content\n\n* [Azure MCP Server overview](../overview.md)\n* [Get started with Azure MCP Server](../get-started.md)\n* [Azure Functions tools reference](../tools/azure-functions.md)\n* [Azure Functions documentation](/azure/azure-functions/)\n* [Azure Functions best practices](/azure/azure-functions/functions-best-practices)\n"
  },
  {
    "path": "articles/azure-mcp-server/services/azure-mcp-server-for-key-vault.md",
    "content": "---\ntitle: Manage Azure Key Vault with Azure MCP Server\ndescription: Learn how to use the Azure MCP Server to manage key vaults, access secrets and keys, and troubleshoot configurations through AI-powered natural language interactions.\nauthor: diberry\nms.author: diberry\nms.reviewer: mbaldwin\nms.service: azure-mcp-server\nms.topic: how-to\nms.date: 02/13/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-generated\nms.custom: build-2025\nmcp-cli.version: 2.0.0-beta.19+526b8facdd707f352913f84af0195268a22dea6f\n\n#customer intent: As an Azure Key Vault administrator, I want to manage secrets, keys, and vault configurations using natural language conversations so that I can quickly verify access and troubleshoot issues without navigating portals.\n\n---\n\n# Manage Azure Key Vault with Azure MCP Server\n\nManage keys, secrets, and certificates using natural language conversations with AI assistants through the Azure MCP Server.\n\n[Azure Key Vault](/azure/key-vault/general/overview) is a cloud service for securely storing and accessing secrets, keys, and certificates. It helps solve problems related to [secrets management, key management, and certificate management](/azure/key-vault/general/about-keys-secrets-certificates). While the Azure portal, Azure CLI, and Azure PowerShell are powerful, the Azure MCP Server provides a more intuitive way to interact with your key vaults through conversational AI.\n\n## What is the Azure MCP Server?\n\n[!INCLUDE [mcp-introduction](../includes/mcp-introduction.md)]\n\nFor Azure Key Vault administrators and developers, this means you can:\n\n- Create, retrieve, and list keys, secrets, and certificates without navigating the portal\n- Review cryptographic key properties and certificate expiration dates\n- Import certificates into your vaults\n- Query Managed HSM settings for high-security deployments\n\n## Prerequisites\n\nTo use the Azure MCP Server with Azure Key Vault, you need:\n\n### Azure requirements\n\n- **Azure subscription**: An active Azure subscription. [Create one for free](https://azure.microsoft.com/free/).\n- **Azure Key Vault resources**: At least one key vault in your subscription. You can create a key vault using the [Azure CLI](/azure/key-vault/general/quick-create-cli), [Azure PowerShell](/azure/key-vault/general/quick-create-powershell), or the [Azure portal](/azure/key-vault/general/quick-create-portal).\n- **Azure permissions**: Appropriate [Azure RBAC roles](/azure/key-vault/general/rbac-guide#azure-built-in-roles-for-key-vault-data-plane-operations) like Key Vault Administrator, Key Vault Secrets Officer, Key Vault Certificates Officer, or Key Vault Crypto Officer to perform the operations you want. See [Provide access to Key Vault keys, certificates, and secrets with Azure role-based access control](/azure/key-vault/general/rbac-guide).\n\n[!INCLUDE [mcp-prerequisites](../includes/mcp-prerequisites.md)]\n\n## Where can you use Azure MCP Server?\n\n[!INCLUDE [mcp-usage-contexts](../includes/mcp-usage-contexts.md)]\n\n## Available tools for Azure Key Vault\n\nThe Azure MCP Server provides multiple tools for Azure Key Vault operations, enabling you to manage keys, secrets, and certificates through natural language conversations.\n\n### Manage keys\n\nCreate and retrieve [cryptographic keys](/azure/key-vault/keys/about-keys) stored in your vault. Supported key types include RSA, RSA-HSM, EC, EC-HSM, oct, and oct-HSM.\n\n**Common scenarios**:\n\n- Create new RSA or EC keys for encryption or signing operations\n- Retrieve key properties and metadata\n- List all keys in a vault to audit key inventory\n\n### Manage secrets\n\nCreate, retrieve, and list [sensitive information](/azure/key-vault/secrets/about-secrets) like API keys, passwords, and connection strings.\n\n**Common scenarios**:\n\n- Securely store API keys and database passwords\n- Retrieve connection strings for application configuration\n- Audit secret inventory to identify unused credentials\n\n### Manage certificates\n\nCreate, import, retrieve, and list [SSL/TLS certificates](/azure/key-vault/certificates/about-certificates) and other certificate-based credentials.\n\n**Common scenarios**:\n\n- Generate or import SSL/TLS certificates for web applications\n- Track certificate expiration dates to plan for [renewal](/azure/key-vault/certificates/overview-renew-certificate)\n- Retrieve certificate properties for compliance verification\n\n### Manage Managed HSM settings\n\nRetrieve [Azure Key Vault Managed HSM](/azure/key-vault/managed-hsm/overview) account settings for high-security deployments that require FIPS 140-3 Level 3 validated HSMs. This tool only applies to Managed HSM vaults, not standard Key Vault vaults.\n\n**Common scenarios**:\n\n- Review purge protection and soft-delete retention settings for Managed HSM\n- Query HSM-specific configurations\n\nFor detailed information about each tool, including parameters and examples, see [Azure Key Vault tools for Azure MCP Server](../tools/azure-key-vault.md).\n\n## Get started\n\nReady to use Azure MCP Server with your Azure Key Vault resources?\n\n1. **Set up your environment**: Choose an AI assistant or development tool that supports MCP. For setup and authentication instructions, see the links in the [Where can you use Azure MCP Server?](#where-can-you-use-azure-mcp-server) section above.\n\n2. **Start exploring**: Ask your AI assistant questions about your key vaults or request operations. Try prompts like:\n   - \"List all secrets in my key vault 'my-vault'\"\n   - \"Get the certificate 'web-ssl-cert' from key vault 'prod-vault'\"\n   - \"Create a new RSA key named 'app-key' in key vault 'crypto-vault'\"\n\n3. **Learn more**: Review the [Azure Key Vault tools reference](../tools/azure-key-vault.md) for all available capabilities and detailed parameter information.\n\n## Best practices\n\nWhen using Azure MCP Server with Azure Key Vault:\n\n- **Specify vault name clearly**: Always include the exact key vault name when querying to avoid ambiguity, especially in subscriptions with many vaults.\n- **Check certificate expiration**: Ask about certificate properties regularly to identify expiring certificates before they cause issues.\n- **Audit your inventory**: Use list operations to review your keys, secrets, and certificates inventory for compliance and security audits.\n- **Combine with other tools**: Use Azure MCP Server for quick queries and inventory checks. Use Azure CLI or PowerShell for vault configuration changes, access control management, and sensitive operations like [secret rotation](/azure/key-vault/secrets/tutorial-rotation).\n\nFor general Azure Key Vault security guidance beyond the Azure MCP Server, see [Secure your Azure Key Vault](/azure/key-vault/general/secure-key-vault).\n\n## Related content\n\n* [Azure MCP Server overview](../overview.md)\n* [Get started with Azure MCP Server](../get-started.md)\n* [Azure Key Vault tools reference](../tools/azure-key-vault.md)\n* [Azure Key Vault documentation](/azure/key-vault/general/overview)\n* [Azure RBAC for Key Vault](/azure/key-vault/general/rbac-guide)"
  },
  {
    "path": "articles/azure-mcp-server/services/azure-mcp-server-for-redis.md",
    "content": "---\ntitle: Manage Azure Redis with Azure MCP Server\ndescription: Learn how to use the Azure MCP Server to create, list, and manage Azure Redis resources through AI-powered natural language interactions.\nauthor: diberry\nms.author: diberry\nms.service: azure-managed-redis\nms.topic: how-to\nms.date: 12/12/2025\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-generated\nms.custom: build-2025\n\n#customer intent: As an Azure Redis user, I want to create and manage Redis resources using natural language conversations so that I can quickly provision caches and review inventory without navigating portals.\n\n---\n\n# Manage Azure Redis with Azure MCP Server\n\nIf you work with Azure Managed Redis, the Azure MCP Server can help you create new Redis resources, inventory existing caches, and manage Redis deployments using natural language conversations with AI assistants.\n\n[Azure Managed Redis](/azure/redis) provides in-memory data storage based on the Redis software. While the Azure portal and Azure CLI are powerful tools, the Azure MCP Server provides a more intuitive way to interact with your Redis resources through conversational AI.\n\n## What is the Azure MCP Server?\n\n[!INCLUDE [mcp-introduction](../includes/mcp-introduction.md)]\n\nFor Azure Redis users, this means you can:\n\n- Create new Redis resources with specific SKUs and configurations using plain language\n- List all Redis resources across subscriptions without complex queries\n- Configure Redis modules like RedisJSON or RedisBloom through conversation\n- Review Redis cache inventory and deployment details quickly\n- Set up development and production Redis instances conversationally\n- Verify Redis resource configurations across environments\n\n## Prerequisites\n\nTo use the Azure MCP Server with Azure Redis, you need:\n\n### Azure requirements\n\n- **Azure subscription**: An active Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- **Azure Redis resources**: At least one Azure Managed Redis cache in your subscription, or permissions to create them.\n- **Azure permissions**: Appropriate roles like Contributor or Redis Cache Contributor to perform the operations you want. See [Use Microsoft Entra ID for cache authentication with Azure Managed Redis](/azure/redis/entra-for-authentication).\n\n[!INCLUDE [mcp-prerequisites](../includes/mcp-prerequisites.md)]\n\n## Where can you use Azure MCP Server?\n\n[!INCLUDE [mcp-usage-contexts](../includes/mcp-usage-contexts.md)]\n\n## Available tools for Azure Redis\n\nThe Azure MCP Server provides two tools specifically designed for Azure Redis operations. These tools enable you to create and manage Redis resources through natural language conversations.\n\n### Create a Redis resource\n\nProvision new Azure Managed Redis resources with specific configurations, SKUs, and modules.\n\n**Common scenarios**:\n\n- Create a Redis cache for a new application or environment\n- Provision Redis with a specific SKU matching performance requirements\n- Enable Redis modules like RedisJSON or RedisBloom during creation\n\n### List Redis resources\n\nList and review all Redis resources in your subscription. Returns details of all Azure Managed Redis, Azure Cache for Redis, and Azure Redis Enterprise resources.\n\n**Common scenarios**:\n\n- List all Redis resources in your subscription to audit deployments\n- View Redis caches to identify instances for cost optimization\n- Get an inventory of Redis clusters across your environment\n\nFor detailed information about each tool, including parameters and examples, see [Azure Redis tools for Azure MCP Server](../tools/azure-redis.md).\n\n## Get started\n\nReady to use Azure MCP Server with your Azure Redis resources?\n\n1. **Set up your environment**: Choose an AI assistant or development tool that supports MCP. For setup and authentication instructions, see the links in the [Where can you use Azure MCP Server?](#where-can-you-use-azure-mcp-server) section above.\n\n2. **Start exploring**: Ask your AI assistant questions about your Redis resources or request operations. Try prompts like:\n   - \"List all Redis resources in my subscription\"\n   - \"Create a Redis cache named 'test-cache' in eastus with Balanced_B0 SKU\"\n   - \"Show me my Redis instances in the 'production' resource group\"\n\n3. **Learn more**: Review the [Azure Redis tools reference](../tools/azure-redis.md) for all available capabilities and detailed parameter information.\n\n## Best practices\n\nWhen using Azure MCP Server with Azure Redis:\n\n- **Choose appropriate SKUs**: Specify Redis SKU based on your performance and cost requirements. Use Balanced_B0 for development and higher SKUs for production workloads.\n- **Enable required modules early**: Specify Redis modules like RedisJSON or RedisBloom during creation to avoid reconfiguration later.\n- **Disable access keys**: For production environments, explicitly disable access key authentication and use managed identities or Microsoft Entra ID for better security.\n- **Use consistent naming**: Follow naming conventions for Redis resources across environments (for example, `app-cache-dev`, `app-cache-prod`) to simplify management.\n- **Review regularly**: Periodically list all Redis resources to identify unused instances and optimize costs.\n- **Tag resources**: While creating Redis resources, consider adding Azure tags through the portal for better resource organization and cost tracking.\n\n## Related content\n\n* [Azure MCP Server overview](../overview.md)\n* [Get started with Azure MCP Server](../get-started.md)\n* [Azure Redis tools reference](../tools/azure-redis.md)\n* [Azure Redis documentation](/azure/redis/)\n* [Azure Managed Redis overview](/azure/redis/overview)\n"
  },
  {
    "path": "articles/azure-mcp-server/services/azure-mcp-server-for-search.md",
    "content": "---\ntitle: Use Azure MCP Server with Azure AI Search\ndescription: Learn how to use Azure Model Context Protocol (MCP) Server to interact with Azure AI Search using natural-language commands through AI assistants.\nms.date: 02/20/2026\nauthor: diberry\ncontent_well_notification:\n  - AI-contribution\nai-usage: ai-assisted\nms.topic: how-to\nms.custom: mcp-integration, devx-track-ai\nmcp-version: 2.0.0-beta.21+5fab1ed6588bc5e128601746ab9b7d58ec108a38\n---\n\n# Use Azure MCP Server with Azure AI Search\n\nAzure Model Context Protocol (MCP) Server enables AI assistants like GitHub Copilot, Claude Desktop, and others to interact with Azure AI Search through natural language commands. This integration allows you to manage search resources and query both indexed and remote data without writing code or remembering complex CLI syntax.\n\n## Overview\n\nAzure AI Search is a cloud-based search service that supports full-text, vector, and hybrid search over scattered enterprise content. You can load and query an index for classic search scenarios, or you can use a knowledge base for agentic retrieval over indexed and remote data.\n\nWith Azure MCP Server integration, you can use natural language to:\n\n- List Azure AI Search services in your subscription.\n- View index schemas, fields, and configurations.\n- Query indexes to find relevant content.\n- View knowledge base and knowledge source details.\n- Retrieve from knowledge bases using queries or conversational messages.\n\n## Prerequisites\n\nTo use the Azure MCP Server with Azure Functions, you need:\n\n### Azure requirements\n\nBefore using Azure MCP Server with Azure AI Search, ensure you have:\n\n- **Azure subscription**: An active Azure subscription. [Create one for free](https://azure.microsoft.com/free/).\n- **Azure AI Search service**: You need to have at least one Azure AI Search service provisioned to use its features.\n- **Azure permissions**: Appropriate roles to perform the operations you want. See [Azure Built-in Roles](/azure/role-based-access-control/built-in-roles).\n\n[!INCLUDE [mcp-prerequisites](../includes/mcp-prerequisites.md)]\n\n## Where can you use Azure MCP Server?\n\n[!INCLUDE [mcp-usage-contexts](../includes/mcp-usage-contexts.md)]\n\n## Available tools for Azure AI Search\n\nAzure MCP Server provides the following tools for Azure AI Search operations:\n\n| Tool | Description |\n| --- | --- |\n| `search index get` | Retrieve details of Azure AI Search indexes and their properties. |\n| `search index query` | Query an Azure AI Search index for relevant results. |\n| `search knowledge base get` | Get details of Azure AI Search knowledge bases and their sources. |\n| `search knowledge base retrieve` | Retrieve information using a specific Azure AI Search knowledge base. |\n| `search knowledge source get` | Get details of knowledge sources utilized in Azure AI Search. |\n| `search service list` | List all Azure AI Search services available in the subscription. |\n\nFor detailed information about each tool, including parameters and examples, see [Azure AI Search tools for Azure MCP Server](../tools/azure-ai-search.md).\n\n## Get started\n\nReady to use Azure MCP Server with your Azure AI Search resources?\n\n1. **Set up your environment**: Choose an AI assistant or development tool that supports MCP. For setup and authentication instructions, see the links in the [Where can you use Azure MCP Server?](#where-can-you-use-azure-mcp-server) section above.\n2. **Start exploring**: Ask your AI assistant questions about your search resources. Try prompts like:\n  - \"Get details of the search index named 'products'.\"\n  - \"Query the search index 'products' for items with 'laptop' in the title.\"\n  - \"Retrieve information from knowledge base 'faq-kb' with the question 'What are the return policies?'.\"\n\n3. **Learn more**: Review the [Azure AI Search tools reference](../tools/azure-ai-search.md) for all available capabilities and detailed parameter information.\n\n## Best practices\n\n- **Use detailed queries during retrieval**: When using the search index query tool, specify precise index and parameters to narrow results effectively.\n- **Check index structures before querying**: Use the search index get command to understand index fields and optimize query performance.\n- **Regularly review knowledge base settings**: Periodically retrieve knowledge base details to ensure configurations meet current needs.\n\n## Related content\n\n- [Azure MCP Server documentation](/azure/developer/azure-mcp-server)\n- [Azure AI Search MCP tools reference](../tools/azure-ai-search.md)\n- [Azure AI Search documentation](/azure/search/)\n"
  },
  {
    "path": "articles/azure-mcp-server/services/azure-mcp-speech-foundry-tools.md",
    "content": "---\ntitle: Use Azure MCP Server with Azure Speech in Foundry Tools\ndescription: Learn how to use Azure Model Context Protocol (MCP) Server to interact with Azure Speech in Foundry Tools using natural language commands through AI assistants.\nauthor: diberry\nms.author: diberry\nms.date: 03/04/2026\nms.topic: how-to\nms.custom: mcp-integration, devx-track-ai\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-generated\nms.service: azure-ai-speech\n---\n\n# Use Azure MCP Server with Azure Speech in Foundry Tools\n\nAzure Model Context Protocol (MCP) Server enables AI assistants like GitHub Copilot, Claude Desktop, and others to interact with Azure Speech in Foundry Tools through natural language commands. This integration allows you to manage text-to-speech and speech-to-text capabilities without writing code or remembering complex CLI syntax.\n\n[Azure Speech in Foundry Tools](/azure/ai-services/speech-service/overview) provides speech to text, text to speech, and other capabilities through a Microsoft Foundry resource. You can transcribe speech to text with high accuracy, produce natural-sounding text-to-speech voices, translate spoken audio, and conduct live AI voice conversations.\n\n## What is the Azure MCP Server?\n\n[!INCLUDE [mcp-introduction](../includes/mcp-introduction.md)]\n\nFor Azure Speech developers, this means you can:\n\n- Transcribe speech from audio files.\n- Synthesize speech from text input.\n\n## Prerequisites\n\nTo use the Azure MCP Server with Azure Speech in Foundry, you need:\n\n- **Azure subscription**: An active Azure subscription. [Create one for free](https://azure.microsoft.com/free/).\n- [**Foundry resource**](/azure/ai-services/multi-service-resource?pivots=azcli): You must have an existing Azure AI Services endpoint to process speech and text.\n- **Azure permissions**: Appropriate roles to perform the operations you want. See [Azure Built-in Roles](/azure/role-based-access-control/built-in-roles).\n\n[!INCLUDE [mcp-prerequisites](../includes/mcp-prerequisites.md)]\n\n## Where can you use Azure MCP Server?\n\n[!INCLUDE [mcp-usage-contexts](../includes/mcp-usage-contexts.md)]\n\n## Available tools for Azure Speech in Foundry\n\nAzure MCP Server provides the following tools for Azure Speech in Foundry operations:\n\n| Tool | Description |\n| --- | --- |\n| `speech stt recognize` | Recognize speech from audio files and convert it to text. |\n| `speech tts synthesize` | Generate audio files from text using neural text-to-speech. |\n\nFor detailed information about each tool, including parameters and examples, see [Azure Speech in Foundry tools for Azure MCP Server](../tools/ai-services-speech.md).\n\n## Get started\n\nReady to use Azure MCP Server with your Azure Speech resources?\n\n1. **Set up your environment**: Choose an AI assistant or development tool that supports MCP. For setup and authentication instructions, see the links in the [Where can you use Azure MCP Server?](#where-can-you-use-azure-mcp-server) section above.\n\n2. **Start exploring**: Ask your AI assistant questions about your speech apps or request operations. Try prompts like:\n   - \"Recognize speech from the audio file 'meeting-recording.mp3'.\"\n   - \"Convert 'meeting-recording.wav' audio to text and save it as 'transcript.txt'.\"\n   - \"Get transcription results from the audio recording in the project folder.\"\n\n3. **Learn more**: Review the [Azure Speech tools reference](../tools/ai-services-speech.md) for all available capabilities and detailed parameter information.\n\n\n## Best practices\n\n- **Use supported audio formats**: Ensure you use WAV, MP3, or other supported formats for speech recognition.\n- **Specify language for accuracy**: Always specify the language parameter to improve recognition accuracy.\n- **Choose voice selection wisely**: Select appropriate voice options to match the desired tone for synthesized speech.\n\n## Related content\n\n- [Azure MCP Server documentation](/azure/developer/azure-mcp-server)\n- [Azure MCP Speech tools reference](../tools/ai-services-speech.md)\n- [Azure Speech documentation](/azure/ai-services/speech-service/overview)\n- [Speech-to-text overview](/azure/ai-services/speech-service/index-speech-to-text)\n- [Text-to-speech overview](/azure/ai-services/speech-service/index-text-to-speech)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/ai-services-speech.md",
    "content": "---\ntitle: Azure Speech in Foundry Tools\ndescription: Learn how to use the Azure MCP Server with Azure Speech in Foundry Tools.\nauthor: diberry\nms.author: diberry\nms.date: 12/05/2025\ncontent_well_notification:\n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n---\n# Azure Speech in Foundry Tools for the Azure MCP Server overview\n\nUse the Azure MCP Server to manage Azure Speech in Foundry Tools functionalities such as speech-to-text (STT) and text-to-speech (TTS) with natural language prompts.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n\n## Speech-to-Text: Recognize\n\n<!-- speech stt recognize -->\n\n\nRecognize speech from an audio file using [Speech](/azure/ai-services/speech-service/speech-to-text). This command takes an audio file and converts it to text using advanced speech recognition capabilities. Supported audio formats include WAV, MP3, OPUS/OGG, FLAC, ALAW, MULAW, MP4, M4A, and AAC. Compressed formats require GStreamer to be installed on the system.\n\nExample prompts include:\n\n- **Basic conversion**: \"Convert the audio file ./meeting-recording.wav to text using endpoint `https://myservice.cognitiveservices.azure.com/` with Azure Speech Services\"\n- **With language detection**: \"Recognize speech from file ./recording.mp3 using endpoint `https://myservice.cognitiveservices.azure.com/` with language detection\"\n- **With profanity filtering**: \"Transcribe speech from file ./interview.wav using endpoint `https://myservice.cognitiveservices.azure.com/` with profanity option removed\"\n- **Specify endpoint**: \"Convert speech to text from file ./audio.wav using endpoint `https://myservice.cognitiveservices.azure.com/`\"\n- **Spanish language**: \"Transcribe the audio file ./session.wav using endpoint `https://myservice.cognitiveservices.azure.com/` in es-ES language\"\n- **Detailed output**: \"Convert speech to text from file ./audio.wav using endpoint `https://myservice.cognitiveservices.azure.com/` with detailed output format\"\n- **With phrase hints**: \"Recognize speech from file ./notes.wav using endpoint `https://myservice.cognitiveservices.azure.com/` with phrase hints 'Azure' for better accuracy\"\n- **Multiple phrase hints**: \"Transcribe file ./meeting.wav using endpoint `https://myservice.cognitiveservices.azure.com/` with phrase hints: 'Azure', 'cognitive services', 'machine learning'\"\n- **Comma-separated hints**: \"Convert speech to text from file ./podcast.mp3 using endpoint `https://myservice.cognitiveservices.azure.com/` with phrase hints: 'Azure, cognitive services, API'\"\n- **Raw profanity output**: \"Transcribe audio from file ./audio.wav using endpoint `https://myservice.cognitiveservices.azure.com/` with profanity option raw\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Endpoint** |  Required | The Azure AI Services endpoint URL (for example, `https://your-service.cognitiveservices.azure.com/`). |\n| **File** |  Required | Path to the local audio file to recognize. |\n| **Language** |  Optional | The language for speech recognition (for example, `en-US`, `es-ES`). Default is `en-US`. |\n| **Phrases** |  Optional | Phrase hints to improve recognition accuracy. Can be specified multiple times or as comma-separated values. |\n| **Format** |  Optional | Output format: `simple` or `detailed`. |\n| **Profanity** |  Optional | Profanity filter: `masked`, `removed`, or `raw`. Default is `masked`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ✅\n\n## Text-to-Speech: Synthesize\n\n<!-- speech tts synthesize -->\n\nConvert text to speech using Speech. This command takes text input and generates an audio file using advanced neural text-to-speech capabilities.\n\nExample prompts include:\n\n- **Basic synthesis**: \"Convert the text 'Hello, welcome to Foundry Tools' to speech using endpoint `https://myservice.cognitiveservices.azure.com/` and save to output.wav\"\n- **With custom voice**: \"Synthesize 'Thank you for using our service' to audio file greeting.mp3 using my custom voice my-custom-voice under service `https://myservice.cognitiveservices.azure.com/` and endpoint \"guid-endpoint\"\n- **Different language**: \"Generate Spanish speech for 'Bienvenido a Azure' and save to welcome-es.wav using my speech endpoint https://myresource.cognitiveservices.azure.com/ in es-ES language\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Endpoint** |  Required | The Azure AI Services endpoint URL (for example, `https://your-service.cognitiveservices.azure.com/`). |\n| **Text** |  Required | The text to convert to speech. |\n| **Output file path** |  Required | Path where the synthesized audio file will be saved. |\n| **Language** |  Optional | The language for speech recognition (for example, `en-US`, `es-ES`). Default is `en-US`. |\n| **Voice** |  Optional | The voice to use for speech synthesis (for example, `en-US-JennyNeural`). If not specified, the default voice for the language will be used. |\n| **Format** |  Optional | Output format: `Riff24Khz16BitMonoPcm`, `Audio16Khz32KBitRateMonoMp3`, `Audio24Khz96KBitRateMonoMp3`, `Ogg16Khz16BitMonoOpus`, `Raw16Khz16BitMonoPcm`. Default is `Riff24Khz16BitMonoPcm`. |\n| **Endpoint ID** |  Optional | The endpoint ID of a custom voice model for speech synthesis. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ✅\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Foundry Tools](/azure/ai-services)"
  },
  {
    "path": "articles/azure-mcp-server/tools/app-configuration.md",
    "content": "---\ntitle: Azure App Configuration Tools \ndescription: \"Learn how to use Azure MCP Server tools to manage Azure App Configuration stores, key-value settings, and feature flags with natural language prompts.\"\nauthor: diberry\nms.author: diberry\nms.date: 12/05/2025\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n--- \n# Azure App Configuration tools for the Azure MCP Server overview\n\nThe Azure MCP Server allows you to manage Azure resources, including App Configuration stores using natural language prompts. This allows you to quickly manage configuration settings and feature flags without remembering complex syntax.\n\n[Azure App Configuration](/azure/azure-app-configuration/overview) provides a service to centrally manage application settings and feature flags. Modern programs, especially programs running in a cloud, generally have many components that are distributed. Spreading configuration settings across these components can lead to hard-to-troubleshoot errors during an application deployment. Use App Configuration to store all the settings for your application and secure their access in one place.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Account: List stores\n\n<!-- appconfig account list -->\n\nThe Azure MCP Server can list App Configuration stores in a subscription. This is useful for quickly checking the status of your App Configuration resources.\n\nExample prompts include:\n\n- **List stores**: \"List all App Configuration stores in my subscription.\"\n- **Show stores**: \"What App Configuration stores do I have?\"\n- **Find stores**: \"I need to see my App Configuration resources\"\n- **Query stores**: \"Can you show me all my App Config stores?\"\n- **Check stores**: \"App Configuration stores in subscription abc123\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Key-value: Delete setting\n\n<!-- appconfig kv delete -->\n\nThe Azure MCP Server can delete a [key-value setting](/azure/azure-app-configuration/concept-key-value) from an App Configuration store.\n\nExample prompts include:\n\n- **Delete a setting**: \"Remove the 'AppName:TemporaryConfig' key from my 'myappconfigstore' App Configuration store.\"\n- **Delete a labeled setting**: \"Delete the 'AppName:FeatureFlag' setting with label 'test' from App Configuration store 'myappconfigstore'\"\n- **Remove configuration**: \"Delete the key 'ProductionEndpointUrl' from App Configuration store 'contoso-appconfig'\"\n- **Clean up settings**: \"Delete the key 'TestSettings' with label 'deprecated' from App Configuration store 'myappconfigstore'\"\n- **Purge config**: \"Delete the temporary API key 'TempAuth' from app-config-dev\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Account** |  Required | The name of the App Configuration store (for example, my-appconfig). |\n| **Key** |  Required | The name of the key to access within the App Configuration store. |\n| **Label** |  Optional | The label to apply to the configuration key. Labels are used to group and organize settings. |\n| **Content type** |  Optional | The content type of the configuration value. This is used to indicate how the value should be interpreted or parsed. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Key-value: Get key-values\n\n<!-- appconfig kv get -->\n\nGets key-values in an App Configuration store. This command can provide one of the following actions:\n\n- Retrieve a specific key-value by its key and optional label\n- List key-values if no key is provided. \n\nListing key-values can optionally be filtered by a key filter and label filter. Each key-value includes its key, value, label, content type, ETag, last modified time, and lock status.\n\nExample prompts include:\n\n- **List all key-value settings**: \"List all key-value settings in App Configuration store 'myappconfigstore'\"\n- **Show key-value settings**: \"Show me the key-value settings in App Configuration store 'contoso-appconfig'\"\n- **Filter by key prefix**: \"List all key-value settings with key name starting with 'prod-' in App Configuration store 'production-config'\"\n- **Get specific key content**: \"Show the content for the key 'AppName:ConnectionString' in App Configuration store 'eastus-config'\"\n- **Environment-specific settings**: \"List all key-value settings with key name starting with 'dev-' in App Configuration store 'development-config'\"\n- **Get labeled configuration**: \"Show me the key-value settings with label 'staging' in App Configuration store 'app-config-staging'\"\n- **API configuration**: \"Show the content for the key 'ApiSettings:Endpoint' in App Configuration store 'api-config'\"\n- **Database settings**: \"List all key-value settings with key name starting with 'Database' in App Configuration store 'backend-config'\"\n- **Feature flags**: \"Show me the key-value settings with label 'features' in App Configuration store 'feature-config'\"\n- **Application secrets**: \"Show the content for the key 'Secrets:ApiKey' in App Configuration store 'secure-config'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Account** |  Required | The name of the App Configuration store (for example, `my-appconfig`). |\n| **Key** |  Optional | The name of the key to access within the App Configuration store. |\n| **Label** |  Optional | The label to apply to the configuration key. Labels are used to group and organize settings. |\n| **Key filter** |  Optional | Specifies the key filter, if any, to be used when retrieving key-values. The filter can be an exact match, for example a filter of `foo` would get all key-values with a key of `foo`, or the filter can include a `*` character at the end of the string for wildcard searches (for example, `App*`). If omitted all keys is retrieved. |\n| **Label filter** |  Optional | Specifies the label filter, if any, to be used when retrieving key-values. The filter can be an exact match, for example a filter of `foo` would get all key-values with a label of `foo`, or the filter can include a `*` character at the end of the string for wildcard searches (for example, `Prod*`). This filter is case-sensitive. If omitted, all labels is retrieved. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Key-value: Set lock on key-value\n\n<!-- appconfig kv lock set -->\n\nSets the lock state of a key-value in an App Configuration store. This command can lock and unlock key-values.\n\nExample prompts include:\n\n- **Lock a setting**: \"Lock the key 'AppName:ConnectionString' in App Configuration store 'myappconfigstore'.\"\n- **Lock a labeled setting**: \"Lock the key 'AppName:ApiKey' with label 'production' in App Configuration store 'contoso-appconfig'.\"\n- **Unlock a setting**: \"Unlock the key 'AppName:ConnectionString' in App Configuration store 'myappconfigstore'.\"\n- **Unlock a labeled setting**: \"Unlock the key 'AppName:ApiKey' with label 'production' in App Configuration store 'contoso-appconfig'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Account** |  Required | The name of the App Configuration store (for example,`my-appconfig`). |\n| **Key** |  Required | The name of the key to access within the App Configuration store. |\n| **Label** |  Optional | The label to apply to the configuration key. Labels are used to group and organize settings. |\n| **Content type** |  Optional | The content type of the configuration value. This is used to indicate how the value should be interpreted or parsed. |\n| **Lock** |  Optional | Whether a key-value is locked (set to `read-only`) or unlocked (`read-only` removed). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Key-value: Set key-value setting\n\n<!-- appconfig kv set -->\n\nSet or update a [key-value setting](/azure/azure-app-configuration/concept-key-value) in an App Configuration store. \n\nExample prompts include:\n\n- **Create a setting**: \"Create a new key 'AppName:ApiUrl' with value 'https://api.example.com' in my 'myappconfigstore' App Configuration store.\"\n- **Update a setting**: \"Update the key 'AppName:MaxRetries' to value '5' in App Configuration store 'myappconfigstore'\"\n- **Create a labeled setting**: \"Set 'AppName:LogLevel' with value 'Debug' and label 'dev' in my 'contoso-appconfig' App Configuration store.\"\n- **Add new config**: \"Add a new setting called 'ApiEndpoint' with URL value 'https://api.contoso.com' to my 'eastus-config'\"\n- **Change existing value**: \"Set key 'MaxThreads' to value '10' in App Configuration store 'appconfig-prod'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Account name** | Required | The name of the App Configuration store.                                    |\n| **Key**          | Required | The key name of the setting to set.                                         |\n| **Value**        | Required | The value to set for the key.                                               |\n| **Label**        | Optional | The label of the setting to set.                                            |\n| **Tags** | Optional | The tags to associate with the configuration key. Tags should be in the format `key=value`. You can specify multiple tags. |\n| **Content type** | Optional | The content type of the configuration value. This value indicates how the value should be interpreted or parsed. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure App Configuration](/azure/azure-app-configuration/overview)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/application-insights.md",
    "content": "---\ntitle: Application Insights Tools \ndescription: \"Use Azure MCP Server with Application Insights to list resources and code optimization recommendations using natural language prompts.\"\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n--- \n# Application Insights tools for the Azure MCP Server overview\n\nThe Azure MCP Server allows you to list Application Insights resources using natural language prompts.\n\n[Application Insights](/azure/azure-monitor/app/app-insights-overview) is an extensible Application Performance Management (APM) service for developers and DevOps professionals. It provides insights into the performance and usage of your applications, helping you to detect and diagnose issues, understand user behavior, and improve application performance.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## List recommendations\n\n<!-- applicationinsights recommendation list -->\n\nLists [Application Insights](/azure/azure-monitor/app/app-insights-overview) code optimization recommendations in a subscription. \n\nExample prompts include:\n\n- **List code optimization recommendations**: \"List code optimization recommendations across my Application Insights components.\"\n- **Show recommendations for all resources**: \"Show me code optimization recommendations for all Application Insights resources in my subscription.\"\n- **List profiler recommendations by group**: \"List profiler recommendations for Application Insights in resource group 'devops-group'.\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Application Insights](/azure/azure-monitor/app/app-insights-overview)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-advisor.md",
    "content": "---\ntitle: Azure Advisor tools for the Azure MCP Server overview\ndescription: Learn about the tools in Azure Advisor for managing resource optimization and recommendations as part of the Azure MCP Server.\n#customer intent: As an Azure admin, I want to learn how to use Azure Advisor tools so I can optimize resource performance and costs in the Azure MCP Server.\nms.date: 02/18/2026\nms.reviewer: ankiga\nms.service: azure-mcp-server\nms.topic: concept-article\ntool_count: 1\nai-usage: ai-generated\n---\n\n# Azure Advisor tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage resource optimization, cost recommendations, and performance improvements with natural language prompts.\n\nAzure Advisor is a service that gives you actionable insights to help you optimize your Azure resources and improve performance. For more about Advisor, see [Azure Advisor documentation](/azure/advisor/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get recommendation list\n\n<!-- @mcpcli advisor recommendation list -->\n\nShow Azure Advisor recommendations for a subscription.\n\n### Example prompts:\n\n- \"Show Azure Advisor recommendations for subscription 'MySubscription'.\"\n- \"What are the current Advisor recommendations for my subscription 'MySubscription'?\" \n- \"Show me all Azure Advisor recommendations under subscription 'MySubscription'.\"\n\n<!-- No parameters for this tool -->\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Advisor documentation](/azure/advisor/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-ai-search.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure AI Search\ndescription: Use Azure MCP Server tools to manage search services, indexes, knowledge sources, and knowledge bases with natural language prompts from your IDE.\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 03/27/2026\ncontent_well_notification:\n  - AI-contribution\nai-usage: ai-assisted\nreviewer: pablocastro\ntool_count: 6\nmcp-cli.version: 2.0.0-beta.33\n---\n\n# Azure MCP Server tools for Azure AI Search\n\nThe Azure Model Context Protocol (MCP) Server lets you manage Azure AI Search resources, including search services, indexes, knowledge sources, and knowledge bases with natural language prompts.\n\n[Azure AI Search](/azure/search/) (formerly Azure Cognitive Search) is a cloud search service that provides APIs and tools for building applications and agents that follow the Retrieval Augmented Generation (RAG) pattern. It supports vector and keyword retrieval, reranking, and agentic retrieval; for more information, see [Azure AI Search documentation](/azure/search/).\n\n> [!NOTE]\n> Each Azure AI Search knowledge base exposes a native MCP endpoint for direct retrieval. For more information, see [Call the MCP endpoint](/azure/search/agentic-retrieval-how-to-retrieve#call-the-mcp-endpoint).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get search index\n\n<!-- @mcpcli search index get -->\n\nThis tool retrieves detailed information about Azure AI Search indexes, including index schema, fields, analyzers, scoring profiles, and other index properties. When you provide an index name, it returns properties for that index; without an index name, it returns all indexes in the specified service.\n\nExample prompts include:\n\n- \"Show me the details of index 'products-index' in Azure AI Search service 'my-search-service'.\"\n- \"List all indexes in the Azure AI Search service 'enterprise-search'.\"\n- \"What fields are in the 'users' index in service 'contoso-search'?\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Service** |  Required | The name of the Azure AI Search service (for example, `my-search-service`). |\n| **Index** |  Optional | The name of the search index within the Azure AI Search service. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Query search index\n\n<!-- @mcpcli search index query -->\n\nThis tool runs a search query against an Azure AI Search index and returns the matching documents and relevance metadata. Results typically include document fields, a relevance score, and any text highlights that match the query.\n\nExample prompts include:\n\n- \"Search for 'machine learning' in the 'documents' index of my 'contoso-search' service.\"\n- \"Query index 'products' for 'noise-canceling headphones' in Azure AI Search service 'fabrikam-search'.\"\n- \"Search my 'content' index in 'my-search-service' for anything mentioning 'climate change'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Service** |  Required | The name of the Azure AI Search service (for example, `my-search-service`). |\n| **Index** |  Required | The name of the search index within the Azure AI Search service. |\n| **Query** |  Required | The search query to execute against the Azure AI Search index. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get knowledge base\n\n<!-- @mcpcli search knowledge base get -->\n\nThis tool gets details for Azure AI Search knowledge bases. Knowledge bases encapsulate retrieval and reasoning capabilities over one or more knowledge sources or indexes. If you don't provide a knowledge base name, it returns details for all knowledge bases within the specified service.\n\nExample prompts include:\n\n- \"List all knowledge bases in the Azure AI Search service 'my-search-service'.\"\n- \"Show me the knowledge bases in service 'contoso-search'.\"\n- \"Get the details of knowledge base 'support-agent' in Azure AI Search service 'enterprise-search'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Service** |  Required | The name of the Azure AI Search service (for example, `my-search-service`). |\n| **Knowledge base** |  Optional | The name of the knowledge base within the Azure AI Search service. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Retrieve from knowledge base\n\n<!-- @mcpcli search knowledge base retrieve -->\n\nThis tool executes a retrieval operation against an Azure AI Search knowledge base to find relevant information from its data sources. Provide either a single-turn query for retrieval or one or more conversational messages in `role:content` format. Specifying both query and messages isn't allowed.\n\nExample prompts include:\n\n- \"Run a retrieval with knowledge base 'support-agent' in Azure AI Search service 'my-search-service' for the query 'password reset steps'.\"\n- \"Ask knowledge base 'product-docs' in search service 'contoso-search' to retrieve information about 'API rate limits'.\"\n- \"Query knowledge base 'hr-policies' in search service 'hr-search' about 'vacation accrual policy'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Service** |  Required | The name of the Azure AI Search service (for example, `my-search-service`). |\n| **Knowledge base** |  Required | The name of the knowledge base within the Azure AI Search service. |\n| **Query** |  Optional | Natural language query for retrieval when a conversational message history isn't provided. |\n| **Messages** |  Optional | Conversation history messages passed to the knowledge base. Each entry formatted as `role:content`, where role is `user` or `assistant` (for example, `user:What policies apply to archived invoices?`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ✅ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get knowledge source\n\n<!-- @mcpcli search knowledge source get -->\n\nThis tool gets details of Azure AI Search knowledge sources. A knowledge source can point at an existing Azure AI Search index or represent external data (for example, a blob storage container) that Azure AI Search has indexed. Knowledge sources are used by knowledge bases during retrieval. If you don't provide a knowledge source name, it returns details for all knowledge sources in the specified service.\n\nExample prompts include:\n\n- \"List all knowledge sources in the Azure AI Search service 'my-search-service'.\"\n- \"Show me the knowledge sources in the Azure AI Search service 'contoso-search'.\"\n- \"Get the details of knowledge source 'product-index' in search service 'enterprise-search'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Service** |  Required | The name of the Azure AI Search service (for example, `my-search-service`). |\n| **Knowledge source** |  Optional | The name of the knowledge source within the Azure AI Search service. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## List search services\n\n<!-- @mcpcli search service list -->\n\nThis tool lists Azure AI Search services in a subscription and returns details for each service, including name, location, SKU, provisioning state, and endpoint.\n\nExample prompts include:\n\n- \"List Azure AI Search services in my subscription.\"\n- \"What AI Search services do I have?\"\n- \"Show me my Azure AI Search resources.\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure AI Search documentation](/azure/search/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-app-lens.md",
    "content": "---\n\ntitle: Azure MCP Server tools for Azure AppLens\ndescription: Use Azure MCP Server tools to diagnose and troubleshoot Azure App Service resources with natural language prompts from your IDE.\nms.date: 04/07/2026\nms.service: azure-mcp-server\nms.topic: concept-article\nreviewer: msalaman \ntool_count: 1\nmcp-cli.version: 2.0.0-beta.39\nauthor: diberry\nms.author: diberry\nai-usage: ai-generated\nms.custom: build-2025\ncontent_well_notification:\n  - AI-contribution\n---\n\n# Azure MCP Server tools for Azure AppLens\n\nUse Azure MCP Server to diagnose Azure App Service resources by using natural language prompts.\n\nAzure AppLens identifies and troubleshoots application and platform issues for Azure App Service. For more information, see [Azure AppLens documentation](/azure/app-service/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Diagnose applens resource\n\n<!-- @mcpcli applens resource diagnose -->\n\nGet diagnostic help from App Lens for Azure application and service issues to identify what's wrong with a service. Ask questions about performance, slowness, failures, errors, application state, or availability to receive expert analysis and solutions. Returns analysis, insights, and recommended solutions. Only the resource name and question are required. Subscription, resource group, and resource type are optional and used to narrow down results when multiple resources share the same name.\n\nExample prompts include:\n\n- \"Diagnose resource 'webapp-prod' with AppLens, question: 'Why is the app responding slowly?'.\"\n- \"Use AppLens to check resource 'api-backend', question: 'Why are requests timing out under load?'.\"\n- \"What does AppLens report for resource 'orders-service', question: 'What is causing the recent 500 errors and failures?'.\"\n\n| Parameter | Required or optional | Description |\n|---|---|---|\n| **Question** | Required | The diagnostic question to ask about the resource. |\n| **Resource** | Required | The name of the resource to investigate or diagnose. |\n| **Resource group** | Optional | Azure resource group name. Use to narrow results when multiple resources share the same name. |\n| **Resource type** | Optional | The Azure resource type. Use to narrow results when multiple resources share the same name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure App Service diagnostics documentation](/azure/app-service/troubleshoot-diagnostic-logs)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-app-service.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure App Service\ndescription: Use Azure MCP Server tools to manage Azure App Service resources, including web apps and APIs, with natural language prompts from your IDE.\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 03/19/2026\ncontent_well_notification:\n  - AI-contribution\nai-usage: ai-assisted\ntool_count: 7\nmcp-cli.version: 2.0.0-beta.29+a69a87b82c6e5ae613659f0dfa7dda63fa2c15fa\n---\n\n# Azure MCP Server tools for Azure App Service\n\nThe Azure Model Context Protocol (MCP) Server lets you manage Azure App Service resources with natural language prompts. You can deploy and update web apps and APIs, configure app settings, diagnose runtime issues, and list or retrieve app details.\n\nAzure App Service is a fully managed platform for building, deploying, and scaling web apps and APIs; for more information, see [Azure App Service documentation](/azure/app-service/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Add database connection\n\n<!-- @mcpcli appservice database add -->\n\nThis tool adds a database connection to an Azure App Service by using the connection string for an existing database. It configures the App Service's connection settings so the app can access the specified database and database server. If you don't provide a connection string, the tool generates a default connection string. \n\nExample prompts include:\n\n- \"Add database 'ordersdb' of database type 'SqlServer' with database server 'contoso-sql.database.windows.net' to app 'webapp-prod' in resource group 'rg-prod'.\"\n- \"Configure database 'userdb' database type 'MySQL' on database server 'contoso-mysql.mysql.database.azure.com' for app 'api-staging' in resource group 'rg-staging'.\"\n- \"Connect database 'appdata' database type 'PostgreSQL' with database server 'pgserver.postgres.database.azure.com' to app 'backend-app' in resource group 'rg-backend'.\"\n- \"Add CosmosDB database 'catalogdb' database type 'CosmosDB' with database server 'contoso-cosmos.documents.azure.com' to app 'ecommerce-app' in resource group 'rg-ecommerce'.\"\n- \"Add database 'inventory' of database type 'SqlServer' on database server 'adventure-works-sql.database.windows.net' to app 'inventory-service' in resource group 'rg-inventory'.\"\n- \"Configure database 'analytics' database type 'PostgreSQL' on database server 'contoso-pg.postgres.database.azure.com' for app 'analytics-api' in resource group 'rg-analytics' using connection string 'Server=tcp:contoso-pg.postgres.database.azure.com;Database=analytics;User Id=\\<your-username\\>;Password=\\<your-password\\>'.\"\n- \"Add database 'customers' database type 'MySQL' with database server 'adventure-works-mysql.mysql.database.azure.com' to app 'crm-web' in resource group 'rg-crm' using connection string 'Server=adventure-works-mysql.mysql.database.azure.com;Database=customers;Uid=\\<your-username\\>;Pwd=\\<your-password\\>'.\"\n- \"Connect database 'sessiondb' database type 'CosmosDB' on database server 'fabrikam-cosmos.documents.azure.com' to app 'session-service' in resource group 'rg-session'.\"\n- \"Set up database 'orders' database type 'SqlServer' on database server 'fabrikam-sql.database.windows.net' for app 'order-processor' in resource group 'rg-orders'.\"\n- \"Configure database 'logs' database type 'PostgreSQL' on database server 'fabrikam-pg.postgres.database.azure.com' for app 'logger-app' in resource group 'rg-logging' with connection string 'Host=fabrikam-pg.postgres.database.azure.com;Database=logs;Username=\\<your-username\\>;Password=\\<your-password\\>'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **App** |  Required | The name of the Azure App Service (for example, `my-webapp`). |\n| **Database** |  Required | The name of the database to connect to (for example, mydb). |\n| **Database server** |  Required | The server name or endpoint for the database (for example, contoso-server.database.windows.net). |\n| **Database type** |  Required | The type of database:`SqlServer`, `MySQL`, `PostgreSQL`, and `Cosmos DB`. |\n| **Resource group** |  Required | The name of the Azure resource group. This resource group is a logical container for Azure resources. |\n| **Connection string** |  Optional | The connection string for the database. If not provided, a default is generated. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ✅ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Diagnose web app\n\n<!-- @mcpcli appservice webapp diagnostic diagnose -->\n\nThis tool runs a specified detector on an Azure App Service web app and returns the detector's diagnostic results. The output includes the detector results and related diagnostic data to help you investigate app health and behavior.\n\nExample prompts include:\n\n- \"Diagnose web app 'webapp-prod' in resource group 'rg-prod' with detector 'Availability'.\"\n- \"Diagnose web app 'my-webapp' in resource group 'webapp-dev' with detector 'CpuAnalysis' between '2025-03-01T00:00:00Z' and '2025-03-01T01:00:00Z' with interval 'PT5M'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **App** |  Required | The name of the Azure App Service (for example, `my-webapp`). |\n| **Detector name** |  Required | The name of the diagnostic detector to run (for example, `Availability`, `CpuAnalysis`, `MemoryAnalysis`). |\n| **Resource group** |  Required | The name of the Azure resource group. This resource group is a logical container for Azure resources. |\n| **End time** |  Optional | The end time in ISO format (for example, `2023-01-01T00:00:00Z`). |\n| **Interval** |  Optional | The time interval (for example, `PT1H` for 1 hour, `PT5M` for 5 minutes). |\n| **Start time** |  Optional | The start time in ISO format (for example, `2023-01-01T00:00:00Z`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get deployment details\n\n<!-- @mcpcli appservice webapp deployment get -->\n\nThis tool retrieves detailed information about deployments in an Azure App Service web app. It returns metadata such as deployment name, whether the deployment is active, start and end times, who authored and performed the deployment, and the deployment type. \n\nExample prompts include:\n\n- \"List the deployments for web app 'webapp-prod' in resource group 'rg-prod'.\"\n- \"Get the deployment 'd4f8c9a2-1b3e-4c5d-9f7a-123456abcdef' for web app 'webapp-prod' in resource group 'rg-prod'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **App** |  Required | The name of the Azure App Service (for example, `my-webapp`). |\n| **Resource group** |  Required | The name of the Azure resource group. This resource group is a logical container for Azure resources. |\n| **Deployment ID** |  Optional | The ID of the deployment. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get web app details\n\n<!-- @mcpcli appservice webapp get -->\n\nRetrieves detailed information about Azure App Service web apps, including app name, resource group, location, runtime stack, state, and hostnames. \n\nExample prompts include:\n\n- \"List the web apps in my subscription.\"\n- \"Show me the web apps in resource group 'rg-prod'.\"\n- \"Get the details for web app 'api-staging' in resource group 'rg-staging'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **App** |  Optional | The name of the Azure App Service web app (for example, `contoso-webapp`). This tool returns details for a specific web app when you provide the `App` name; if you don't provide an `App`, it returns information for all web apps in the subscription or for the specified `resource group` and `subscription`. |\n| **Resource group** |  Optional | The name of the Azure resource group. This resource group is a logical container for Azure resources. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get app settings\n\n<!-- @mcpcli appservice webapp settings get-appsettings -->\n\nThis tool retrieves the application settings for an Azure App Service web app and returns key-value pairs for each setting. App settings can include connection strings and other sensitive values, so treat returned values as secrets and limit their exposure.\n\nExample prompts include:\n\n- \"List the application settings for web app 'my-webapp' in resource group 'rg-prod'.\"\n- \"Get the application settings for web app 'orders-api' in resource group 'rg-staging'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **App** |  Required | The name of the Azure App Service web app (for example, `my-webapp`). |\n| **Resource group** |  Required | The name of the Azure resource group that contains the web app (for example, prod-rg). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ✅ | Local Required: ❌\n\n## List diagnostic detectors\n\n<!-- @mcpcli appservice webapp diagnostic list -->\n\nThis tool retrieves detailed information about detectors for a specified Azure App Service web app. For each detector, it returns the detector name, detector type, description, category, and analysis types. The results help you investigate issues and understand the diagnostics available for the web app.\n\nExample prompts include:\n\n- \"List the diagnostic detectors for web app 'my-webapp' in resource group 'rg-prod'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **App** |  Required | The name of the Azure App Service (for example, `my-webapp`). |\n| **Resource group** |  Required | The name of the Azure resource group. This resource group is a logical container for Azure resources. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Update app settings\n\n<!-- @mcpcli appservice webapp settings update-appsettings -->\n\nThis tool updates an application setting for an App Service web app. You can choose one of three update types: `add`, `set`, or `delete`.\n\n- `add`: Creates a new application setting with the specified name and value. If the application setting already exists, the operation fails and returns an error.\n- `set`: Creates or updates the value of an application setting. If the application setting doesn't exist, `set` behaves like `add`. If it exists, the value is overwritten.\n- `delete`: Removes the specified application setting. If the application setting doesn't exist, no action is taken.\n\nFor the `add` and `set` update types, both the application setting name and value are required. For the `delete` update type, only the application setting name is required.\n\nExample prompts include:\n\n- \"Add application setting name 'feature-flag' with value 'true' to app 'my-webapp' in resource group 'rg-prod' with setting update type 'add'.\"\n- \"Set application setting name 'db-connection-string' with value 'Server=tcp:contoso-sql.database.windows.net;Initial Catalog=orders' on app 'orders-webapp' in resource group 'rg-orders' with setting update type 'set'.\"\n- \"Delete application setting name 'old-api-key' from app 'legacy-service' in resource group 'rg-archive' with setting update type 'delete'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **App** |  Required | The name of the Azure App Service (for example, `my-webapp`). |\n| **Resource group** |  Required | The name of the Azure resource group that contains the web app. |\n| **Setting name** |  Required | The name of the application setting. |\n| **Setting update type** |  Required | The type of update to perform on the application setting. Valid values: `add`, `set`, `delete`. |\n| **Setting value** |  Optional | The value of the application setting. Required for `add` and `set` update types. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure App Service documentation](/azure/app-service/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-best-practices.md",
    "content": "---\ntitle: Azure best practices tools - Azure MCP Server\ndescription: Use the Azure best practices tools in Azure MCP Server to get guidance on Azure Functions development, deployment, and Azure SDK usage.\nms.service: azure-mcp-server\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.date: 03/02/2026\nauthor: diberry\nms.author: diberry\ntool_count: 2\nmcp-cli.version: 2.0.0-beta.23+535bd1649379f0596f18dc7d95987f8197de342d\nms.reviewer: conniey\n---\n\n# Azure best practices tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage data retrieval and analysis, including working with AI applications and executing get commands, with natural language prompts.\n\n## Get Azure best practices for AI app\n\n<!-- @mcpcli get azure bestpractices ai app -->\n\nThis command returns best practices and code generation guidance for building AI applications in Azure. Use it when you need recommendations on writing code for AI agents, chatbots, workflows, or any AI/LLM features. Additionally, this command provides guidance for code generation on Microsoft Foundry for application development. \n\nExample prompts include:\n\n- \"Get best practices for code generation in AI applications?\"\n- \"Show me code guidance for chatbots in Azure?\"\n- \"Get recommendations for building workflows using AI components?\"\n- \"Create an AI app that helps me improve customer interactions?\"\n- \"Create an AI app that supports data analysis in Microsoft Foundry?\"\n\n<!-- No parameters for this tool -->\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get Azure best practices\n\n<!-- @mcpcli get azure bestpractices get -->\n\nThis tool returns a list of best practices for code generation, operations, and deployment when working with Azure services. Call this tool for any code generation, deployment, or operations involving Azure, `Azure Functions`, `Azure Kubernetes Service (AKS)`, `Azure Container Apps (ACA)`, `Bicep`, `Terraform`, `Azure Cache`, `Redis`, `CosmosDB`, `Entra`, `Azure Active Directory`, `Azure App Services`. \n\nExample prompts include:\n\n- \"Get the latest Azure coding agent best practices?\"\n- \"Get the latest Azure operations best practices?\"\n- \"Get the latest general Azure best practices?\"\n- \"Get the latest Azure Static Web Apps code generation best practices?\"\n- \"Get the latest Azure Static Web Apps deployment best practices?\"\n- \"Get the latest Azure Static Web Apps best practices?\"\n- \"Get the latest Azure Functions all best practices?\"\n- \"What are coding agent best practices?\"\n- \"Configure Azure MCP for my coding agent project?\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Action** | Required | The action type for the best practices. Options: `all`, `code-generation`, `deployment`. Note: `static-web-app` and `coding-agent` resources only support `all`. |\n| **Resource** | Required | The Azure resource type for which to get best practices. Options: `general` (general Azure), `azurefunctions` (Azure Functions), `static-web-app` (Azure Static Web Apps), `coding-agent` (Coding Agent). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related resources\n\n- [Azure Functions documentation](/azure/azure-functions/)\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-bicep-schema.md",
    "content": "---\ntitle: Azure Bicep Schema Tools - Azure MCP Server\ndescription: Learn how to use the Azure MCP Server with Azure Bicep Schema to retrieve the latest API versions and properties for Azure resources in Bicep templates.\nms.service: azure-mcp-server\nms.date: 12/05/2025\nms.topic: concept-article\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\n---\n\n# Azure Bicep Schema tools for the Azure MCP Server overview\n\nThe Azure MCP Server enables you to manage Azure resources, including Azure Bicep schemas, with natural language prompts. With this capability, you can quickly retrieve the latest API versions and property definitions for your Infrastructure as Code templates without needing to remember complex syntax.\n\n[Azure Bicep](/azure/azure-resource-manager/bicep/) is a domain-specific language (DSL) that simplifies the authoring experience for Azure Resource Manager templates. Bicep offers concise syntax, reliable type safety, and support for all resource types and API versions.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get Bicep Resource Schema\n\n<!-- bicepschema get -->\n\nGets the Bicep schema for the most recent apiVersion of an Azure resource. This operation helps you ensure your Bicep templates use the correct properties and values when defining Azure resources.\n\nExample prompts include:\n\n- **Get storage account schema**: \"Get me the Bicep schema for Microsoft.Storage/storageAccounts\"\n- **Find service properties**: \"How can I use Bicep to create an Azure OpenAI service with resource type 'Microsoft.CognitiveServices/accounts'?\"\n- **Check API version**: \"What's the latest apiVersion for Microsoft.KeyVault/vaults?\"\n- **Need schema help**: \"I'm creating a Bicep template for Microsoft.Cognitive/accounts\"\n- **Request schema guidance**: \"Show me the properties for Microsoft.Web/sites\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource type** | Required | The Azure resource type in format `{ResourceProvider}/{ResourceType}` (such as `Microsoft.Storage/storageAccounts`, `Microsoft.Compute/virtualMachines`) |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Bicep documentation](/azure/azure-resource-manager/bicep/)\n- [Azure Resource Manager template reference](/azure/templates/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-cli.md",
    "content": "---\ntitle: Azure CLI Tools\ndescription: Learn how to use Azure CLI tools with the Azure MCP Server to generate commands, execute operations, and get installation instructions for Azure resource management.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n--- \n# Azure CLI tools for the Azure MCP Server overview\n\nThe Azure MCP Server provides comprehensive support for Azure CLI operations, including finding commands, generating command syntax, and providing installation instructions. Perform virtually any Azure resource management operation without needing to remember specific command syntax, parameters, or formatting.\n\n[Azure Command-Line Interface (CLI)](/cli/azure) is a cross-platform command-line tool to connect to Azure and execute administrative commands on Azure resources. It allows the execution of commands through a terminal using interactive command-line prompts or a script. For a complete list of Azure CLI commands this tool executes, see the [Azure CLI reference documentation](/cli/azure/reference-index).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n\n## Generate Azure CLI commands\n\n<!-- extension cli generate -->\n\nThe Azure MCP Server generates Azure CLI commands to accomplish specific goals. \n\n**Example prompts** include:\n\n- **Generate creation commands**: \"Generate an `az` command to create a storage account\"\n- **Generate query commands**: \"Create an `az` command to list all virtual machines in a resource group\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Intent** | Required | The user intent of the task to be solved by using the CLI tool. This user intent is used to generate the appropriate CLI command to accomplish the desirable goal. |\n| **Cli type** | Required | The type of CLI tool to use. Supported values are `az` for Azure CLI. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get CLI installation instructions\n\n<!-- extension cli install -->\n\nThe Azure MCP Server provides installation instructions for CLI tools including Azure CLI (`az`), Azure Developer CLI (`azd`), and Azure Functions Core Tools CLI (`func`). It incorporates knowledge of the CLI tool beyond what the LLM knows. Use this tool to get installation instructions if you attempt to use the CLI tool but it's not installed.\n\n**Example prompts** include:\n\n- **Azure CLI installation**: \"How do I install the `az` CLI?\"\n- **Azure Developer CLI installation**: \"Show me how to install `azd`\"\n- **Azure Functions Core tools**: \"What is Azure Functions Core tools and how to install it\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **CLI type** | Required | The type of CLI tool to use. Supported values are `az` for Azure CLI, `azd` for Azure Developer CLI, and `func` for Azure Functions Core Tools CLI. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ✅\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure CLI reference documentation](/cli/azure/reference-index)\n- [Azure Developer CLI reference documentation](/azure/developer/azure-developer-cli)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-cloud-architect.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure Cloud Architect\ndescription: Use Azure MCP Server tools to design cloud architectures through guided requirements gathering and receive optimal Azure solution recommendations from your IDE.\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 03/27/2026\nreviewer: msalaman\ncontent_well_notification:\n  - AI-contribution\nai-usage: ai-assisted\ntool_count: 1\nmcp-cli.version: 2.0.0-beta.39\n---\n\n# Azure MCP Server tools for Azure Cloud Architect\n\nThe Azure Model Context Protocol (MCP) Server lets you design cloud architectures through guided requirements gathering and receive optimal Azure solution recommendations with natural language prompts.\n\nAzure Cloud Architect helps you design scalable, resilient Azure solutions and apply guidance from the Azure Architecture Center; for more information, see [Azure Architecture Center documentation](/azure/architecture/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Design cloud architecture\n\n<!-- @mcpcli cloudarchitect design -->\n\nThis tool recommends architecture designs for cloud services, applications, and solutions — including file storage, banking, video streaming, e-commerce, SaaS, and more. It gathers requirements iteratively by asking 1–2 focused questions at a time, tracks a confidence score (0.0–1.0), and returns architecture guidance aligned with the Azure Well-Architected Framework. When the confidence score reaches 0.7 or higher, the tool stops asking follow-up questions and presents the architecture recommendation.\n\nThe tool covers all tiers: infrastructure, platform, application, data, security, and operations. Recommendations are conservative, actionable, and provide a high-level overview.\n\nExample prompts include:\n\n- \"Please help me design an architecture for a scalable file upload, storage, and retrieval service.\"\n- \"Help me design an Azure-based ATM service architecture for user transactions and account management.\"\n- \"I want to design a cloud app for ordering groceries with inventory and delivery tracking.\"\n- \"How can I design an Azure cloud service to store, transcode, and serve videos to users?\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Answer** |  Optional | The user's response to the current question. |\n| **Confidence score** |  Optional | A value between 0.0 and 1.0 representing confidence in understanding requirements. When this reaches 0.7 or higher, `nextQuestionNeeded` should be set to false. |\n| **Next question needed** |  Optional | Whether another question is needed. |\n| **Question** |  Optional | The current question being asked. |\n| **Question number** |  Optional | Current question number. |\n| **State** |  Optional | The complete architecture state from the previous request as JSON. Tracks architecture components, tiers (infrastructure, platform, application, data, security, operations), requirements (explicit, implicit, assumed), and confidence factors. |\n| **Total questions** |  Optional | Estimated total questions needed. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Architecture Center documentation](/azure/architecture/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-communication.md",
    "content": "---\ntitle: Azure Communication Services Tools \ndescription: Send emails and SMS messages without needing to remember complex command syntax, making communication automation more accessible and efficient.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n--- \n\n# Azure Communication Services tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage Azure Communication Services using natural language prompts. Learn how to send emails and SMS messages without needing to remember complex command syntax, making communication automation more accessible and efficient.\n\n[Azure Communication Services](/azure/communication-services/) is a set of rich communication APIs that enable developers to build intelligent communication solutions. These solutions include voice and video calling, chat, SMS, and telephony capabilities in applications.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Email: Send email\n\n<!-- communication email send -->\n\nSend an email message using Azure Communication Services.\n\nExample prompts include:\n\n- **Simple email**: \"Send email to 'user@example.com' with subject 'Welcome' and message 'Hello there!' from 'noreply@mydomain.com' using endpoint 'https://myservice.communication.azure.com'\"\n- **Email with sender name**: \"Send email from 'Support Team <support@mydomain.com>' to 'customer@example.com' with subject 'Thank you' and message 'Thanks for your purchase' using endpoint 'https://myservice.communication.azure.com'\"\n- **HTML email**: \"Send HTML email to 'subscriber@example.com' with subject 'Newsletter' and HTML message '&lt;h1&gt;Latest News&lt;/h1&gt;&lt;p&gt;Check out our updates!&lt;/p&gt;' from 'newsletter@mydomain.com' using endpoint 'https://myservice.communication.azure.com'\"\n\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Endpoint** |  Required | The Communication Services URI endpoint (for example, `https://myservice.communication.azure.com`). Used for credential authentication. |\n| **From** |  Required | The email address to send from (must be from a verified domain). |\n| **Sender name** |  Optional | The display name of the sender. |\n| **To** |  Required | The recipient email addresses to send the email to. |\n| **Cc** |  Optional | CC recipient email addresses. |\n| **Bcc** |  Optional | BCC recipient email addresses. |\n| **Subject** |  Required | The email subject. |\n| **Message** |  Required | The email message content to send to the recipients. |\n| **Is html** |  Optional | Flag indicating whether the message content is HTML. |\n| **Reply to** |  Optional | Reply-to email addresses. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ✅ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## SMS: Send SMS message\n\n<!-- communication sms send -->\n\nSends SMS messages to one or more recipients using Azure Communication Services.\n\nExample prompts include:\n\n- **Simple SMS**: \"Send an SMS message to '+12345550123' saying 'Hello' from '+12345550456' using endpoint 'https://myservice.communication.azure.com'\"\n- **Specify sender and recipient**: \"Send SMS to '+12345550789' from '+12345550456' with message 'Test message' using endpoint 'https://myservice.communication.azure.com'\"\n- **Multiple recipients**: \"Send SMS to multiple recipients: '+12345550123', '+12345550789' with message 'Group announcement' from '+12345550456' using endpoint 'https://myservice.communication.azure.com'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Endpoint** |  Required | The Communication Services URI endpoint (for example, `https://myservice.communication.azure.com`). Used for credential authentication. |\n| **From** |  Required | The SMS-enabled phone number associated with your Communication Services resource (in E.164 format, for example, `+14255550123`). Can also be a short code or alphanumeric sender ID. |\n| **To** |  Required | The recipient phone numbers in `E.164` international standard format (for example, `+14255550123`). Multiple numbers can be provided. |\n| **Message** |  Required | The SMS message content to send to the recipients. |\n| **Enable delivery report** |  Optional | Whether to enable delivery reporting for the SMS message. When enabled, events are emitted when delivery is successful. |\n| **Tag** |  Optional | Optional custom tag to apply to the SMS message for tracking purposes. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ✅ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Communication Services](/azure/communication-services/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-compliance-quick-review.md",
    "content": "---\ntitle: Azure Quick Review CLI Tools\ndescription: Learn how to use the Azure MCP Server with the Azure Quick Review CLI Tools.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\nms.reviewer: wabrez\n---\n# Azure Quick Review CLI tools for the Azure MCP Server overview\n\nThe Azure MCP Server allows you to execute Azure Quick Review (azqr) commands using natural language prompts. This enables you to generate compliance and security reports for your Azure resources to identify non-compliant configurations and areas for improvement without needing to remember specific command syntax.\n\n[Azure Quick Review CLI (azqr)](https://github.com/Azure/azqr) is a powerful command-line interface (CLI) tool that specializes in analyzing Azure resources to ensure compliance with Azure's best practices and recommendations. Its main objective is to offer users a comprehensive overview of their Azure resources, allowing them to easily identify any non-compliant configurations or areas for improvement.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Generate compliance report\n\n<!-- extension azqr -->\n\nThe Azure MCP Server can execute Azure Quick Review CLI commands to generate compliance and security reports for Azure resources. This helps identify non-compliant configurations and areas for improvement in your Azure environment.\n\n**Example prompts** include:\n\n- **Scan subscription**: \"Generate compliance report for my subscription\"\n- **Scan resource group**: \"Run security assessment for production resource group\"\n- **Quick review**: \"Check my subscription for compliance issues\"\n- **Security scan**: \"scan resources in dev-rg for security problems\"\n- **Generate report**: \"Create compliance report for subscription abc123 and resource group web-apps\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** | Optional | The name of the Azure resource group. This is a logical container for Azure resources. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Quick Review CLI GitHub repository](https://github.com/Azure/azqr)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-compute.md",
    "content": "---\ntitle: Azure MCP Server Tools for Azure Compute\ndescription: Discover compute tools for managing virtual machines, virtual machine scale sets, and disks in Azure MCP Server. Explore features and start optimizing your resources.\n#customer intent: As a system admin, I want to list all virtual machine scale sets in a subscription so I can manage their capacity and upgrade policies.\nms.date: 04/07/2026\nms.service: azure-mcp-server\nms.topic: concept-article\nreviewer: audreytoney\ntool_count: 12\nmcp-cli.version: 2.0.0-beta.39\n---\n\n# Azure MCP Server tools for Azure compute overview\n\nThe Azure MCP Server tools help you manage virtual machines (VMs), virtual machine scale sets, and disks by using natural language prompts. By using key capabilities such as creating, retrieving, and updating resources, you can efficiently control your cloud environment.\n\nAzure compute provides scalable computing resources for applications and workloads. For more information, see [Azure Compute documentation](/azure/virtual-machines/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Managed disk: create\n\n<!-- @mcpcli compute disk create -->\n\nWith this tool, you can create a new Azure managed disk in the specified resource group. You can create empty disks (specify `size-gb`), disks from a source such as a snapshot, another managed disk, or a blob URI (specify `source`). You can also create disks from a shared image gallery image version (specify `gallery-image-reference`), or disks ready for upload (specify `upload-type` and `upload-size-bytes`). If you don't specify the location, it defaults to the resource group's location.\n\nYou can configure disk size, storage SKU (for example, `Premium_LRS`, `Standard_LRS`, or `UltraSSD_LRS`), OS type, availability zone, and hypervisor generation. Other configurations possible include tags, encryption settings, performance tier, shared disk, on-demand bursting, and IOPS/throughput limits for UltraSSD disks. Create a disk with network access policy `DenyAll`, `AllowAll`, or `AllowPrivate`, and associate a disk access resource during creation.\n\nExample prompts include:\n\n- \"Create a 128 GB managed disk named `<disk-name>` in resource group `<resource-group>`.\"\n\n- \"Create a new `Premium_LRS` disk called `<disk-name>` in resource group `<resource-group>` with 256 GB.\"\n\n- \"Create a disk from snapshot `<snapshot-resource-id>` in resource group `<resource-group>`.\"\n\n- \"Create a 64-GB `Standard_LRS` Linux disk named `<disk-name>` in resource group `<resource-group>` in zone 1.\"\n\n- \"Create a managed disk from gallery image version `<image-version-resource-id>` in resource group `<resource-group>`.\"\n\n- \"Create a data disk from LUN 0 of gallery image version `<image-version-resource-id>` in resource group `<resource-group>`.\"\n\n- \"Create a disk ready for upload named `<disk-name>` in resource group `<resource-group>` with upload size 20,972,032 bytes.\"\n\n- \"Create a trusted launch upload disk named `<disk-name>` in resource group `<resource-group>` with `UploadWithSecurityData` type and security type `TrustedLaunch`.\"\n\n- \"Create a shared managed disk named `<disk-name>` in resource group `<resource-group>` with 512 GB and max shares set to 3.\"\n\n- \"Create a managed disk `<disk-name>` in resource group `<resource-group>` with network access policy `DenyAll` and disk access `<disk-access-resource-id>`.\"\n\n- \"Create a V2 hypervisor generation disk named `<disk-name>` in resource group `<resource-group>` with 128 GB.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Disk name** | Required | The name of the disk. |\n| **Resource group** | Required | The name of the Azure resource group. This name is a logical container for Azure resources. |\n| **Disk access** | Optional | The resource ID of the disk access resource for using private endpoints on disks. |\n| **Disk encryption set** | Optional | The resource ID of the disk encryption set to use for enabling encryption at rest. |\n| **Disk iops read write** | Optional | The number of IOPS allowed for this disk. Only settable for UltraSSD disks. |\n| **Disk mbps read write** | Optional | The bandwidth allowed for this disk in MBps. Only settable for UltraSSD disks. |\n| **Enable bursting** | Optional | Enable on-demand bursting beyond the provisioned performance target of the disk. Doesn't apply to Ultra disks. Accepted values: `true` or `false`. |\n| **Encryption type** | Optional | Encryption type of the disk. Accepted values: `EncryptionAtRestWithCustomerKey`, `EncryptionAtRestWithPlatformAndCustomerKeys`, or `EncryptionAtRestWithPlatformKey`. |\n| **Gallery image reference** | Optional | The resource ID of a shared image gallery image version to use as the source for the disk. Format: /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Compute/galleries/{gallery}/images/{image}/versions/{version}. |\n| **Gallery image reference lun** | Optional | The LUN (logical unit number) of the data disk in the gallery image version. If you specify this parameter, you create the disk from the data disk at this LUN. If you don't specify this parameter, you create the disk from the OS disk of the image. |\n| **Hyper v generation** | Optional | The hypervisor generation of the VM. Applicable to OS disks only. Accepted values: `V1`, `V2`. |\n| **Location** | Optional | The Azure region/location. The resource group's location is the default if you don't specify this parameter. |\n| **Max shares** | Optional | The maximum number of VMs that can attach to the disk at the same time. A value greater than one indicates a shared disk. |\n| **Network access policy** | Optional | The policy for accessing the disk via network. Accepted values: `AllowAll`, `AllowPrivate`, or `DenyAll`. |\n| **Os type** | Optional | The operating system type of the disk. Accepted values: `Linux` or `Windows`. |\n| **Security type** | Optional | The security type of the managed disk. Accepted values: `ConfidentialVM_DiskEncryptedWithCustomerKey`, `ConfidentialVM_DiskEncryptedWithPlatformKey`, `ConfidentialVM_VMGuestStateOnlyEncryptedWithPlatformKey`, `Standard`, or `TrustedLaunch`. This parameter is required when `upload-type` is `UploadWithSecurityData`. |\n| **Size gb** | Optional | The size of the disk in GB. Max size: 4,095 GB. |\n| **SKU** | Optional | The underlying storage SKU. Accepted values: `Premium_LRS`, `PremiumV2_LRS`, `Premium_ZRS`, `StandardSSD_LRS`, `StandardSSD_ZRS`, `Standard_LRS`, or `UltraSSD_LRS`. |\n| **Source** | Optional | The source to create the disk from, including a resource ID of a snapshot or disk, or a blob URI of a virtual hard disk (VHD). When you provide a source, `size-gb` is optional and defaults to the source size. |\n| **Tags** | Optional | The space-separated tags in 'key=value' format. Use '' to clear existing tags. |\n| **Tier** | Optional | The performance tier of the disk (for example, `P10`, `P15`, `P20`, `P30`, `P40`, `P50`, `P60`, `P70`, or `P80`). Applicable to Premium SSD disks only. |\n| **Upload size bytes** | Optional | The size in bytes (including the VHD footer of 512 bytes) of the content to be uploaded. This parameter is required when you specify `upload-type`. |\n| **Upload type** | Optional | The type of upload for the disk. Accepted values: `Upload` or `UploadWithSecurityData`. When you specify this parameter, you create the disk in a `ReadyToUpload` state. |\n| **Zone** | Optional | The availability zone into which to provision the resource. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Managed disk: delete\n\n<!-- @mcpcli compute disk delete -->\n\nDelete an Azure managed disk from the specified resource group. This operation is idempotent; it returns *success* whether the disk was removed or didn't exist.\n\nExample prompts include:\n\n- \"Delete the managed disk `temp-data-disk` in resource group `dev-rg`.\"\n\n- \"Remove managed disk `old-backup-disk` from resource group `prod-rg`.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. |\n| **Disk name** | Required | The name of the disk to delete. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ✅ | Local Required: ❌\n\n## Managed disk: list or get\n\n<!-- @mcpcli compute disk get -->\n\nYou can list available Azure managed disks or retrieve detailed information about a specific disk. You can view all disks in a subscription or in a specific resource group, including disk size, SKU, provisioning state, and OS type. The tool supports wildcard patterns in disk names (for example, `win_OsDisk*`).\n\nIf you provide a disk name without specifying a resource group, the tool searches across the entire subscription. Specify a resource group to scope the search to that resource group. Both parameters are optional.\n\nExample prompts include:\n\n- \"List all managed disks in my subscription.\"\n\n- \"Show me all disks in resource group `<resource-group>`.\"\n\n- \"Get details of disk `<disk-name>`.\"\n\n- \"What are the available disk sizes?\"\n\n- \"Show me the disks with name pattern `win_OsDisk*` in resource group `<resource-group>`.\"\n\n- \"Get information about disk `<disk-name>` in resource group `<resource-group>`.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Disk name** | Optional | The name of the disk. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Managed disk: update\n\n<!-- @mcpcli compute disk update -->\n\nUpdate or modify properties of an existing Azure managed disk that you previously created. If you don't specify the resource group, the disk is located by name within the subscription.\n\nThis operation supports increasing the disk size, and modifying the storage SKU, IOPS and throughput limits (for UltraSSD only), and the maximum shares for shared disk attachments. You can also change on-demand bursting, tags, encryption settings, disk access, and the performance tier.\n\nYou can modify the network access policy to `DenyAll`, `AllowAll`, or `AllowPrivate` on an existing disk. Only specified properties are updated; unspecified properties remain unchanged.\n\nExample prompts include:\n\n- \"Update disk `<disk-name>` in resource group `<resource-group>` to 1,024 GB.\"\n\n- \"Change the SKU of disk `<disk-name>` to `UltraSSD_LRS`.\"\n\n- \"Resize disk `<disk-name>` in resource group `<resource-group>` to 2,048 GB.\"\n\n- \"Set the max shares on disk `<disk-name>` to 3.\"\n\n- \"Change the network access policy of disk `<disk-name>` to `AllowPrivate`.\"\n\n- \"Update disk `<disk-name>` in resource group `<resource-group>` with tags `env=production`.\"\n\n- \"Set the IOPS limit on Ultra disk `<disk-name>` in resource group `<resource-group>` to 15,000.\"\n\n- \"Update disk `<disk-name>` in resource group `<resource-group>` to use disk encryption set `<disk-encryption-set-id>`.\"\n\n- \"Set disk access on disk `<disk-name>` in resource group `<resource-group>` to `<disk-access-resource-id>` with network access policy `DenyAll`.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Disk name** |  Required | The name of the disk. |\n| **Disk access** |  Optional | The resource ID of the disk access resource for using private endpoints on disks. |\n| **Disk encryption set** |  Optional | The resource ID of the disk encryption set to use for enabling encryption at rest. |\n| **Disk iops read write** |  Optional | The number of IOPS allowed for this disk. Only settable for UltraSSD disks. |\n| **Disk mbps read write** |  Optional | The bandwidth allowed for this disk in MBps. Only settable for UltraSSD disks. |\n| **Enable bursting** |  Optional | Enable on-demand bursting beyond the provisioned performance target of the disk. Doesn't apply to Ultra disks. Accepted values: `true` or `false`. |\n| **Encryption type** |  Optional | The encryption type of the disk. Accepted values: `EncryptionAtRestWithCustomerKey`, `EncryptionAtRestWithPlatformAndCustomerKeys`, or `EncryptionAtRestWithPlatformKey`. |\n| **Max shares** |  Optional | The maximum number of VMs that can attach to the disk at the same time. A value greater than one indicates a shared disk. |\n| **Network access policy** |  Optional | The policy for accessing the disk via network. Accepted values: `AllowAll`, `AllowPrivate`, or `DenyAll`. |\n| **Size gb** |  Optional | The size of the disk in GB. Max size: 4,095 GB. |\n| **SKU** |  Optional | The underlying storage SKU. Accepted values: `Premium_LRS`, `PremiumV2_LRS`, `Premium_ZRS`, `StandardSSD_LRS`, `StandardSSD_ZRS`, `Standard_LRS`, or `UltraSSD_LRS`. |\n| **Tags** |  Optional | Space-separated tags in `key=value` format. Use `''` to clear existing tags. |\n| **Tier** |  Optional | The performance tier of the disk (for example, `P10`, `P15`, `P20`, `P30`, `P40`, `P50`, `P60`, `P70`, or `P80`). Applicable to Premium SSD disks only. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Virtual machine: create\n\n<!-- @mcpcli compute vm create -->\n\nCreate, deploy, or provision a single virtual machine. This command launches a new Linux or Windows VM with either SSH key or password authentication. If you don't specify networking resources (such as a virtual network or subnet), this tool automatically creates them. The default VM size is `Standard_DS1_v2`, and the default OS is Ubuntu 24.04 LTS if you don't specify otherwise.\n\nYou can create a Linux VM by using an SSH public key. You provide the key content or the path to the key file. For example, you can specify your public key file at `~/.ssh/id_rsa.pub`.\n\nThis command doesn't support creating virtual machine scale sets with multiple identical instances. Instead, use `VMSS create`.\n\nExample prompts include:\n\n- \"Create a new Linux VM named `<vm-name>` with SSH key in resource group `<resource-group>`.\"\n\n- \"Launch a virtual machine with the Ubuntu2404 image in `<resource-group>`.\"\n\n- \"Create a Windows VM named `<vm-name>` with an admin password in resource group `<resource-group>`.\"\n\n- \"Deploy VM `<vm-name>` in `<location>` with `Standard_DS1_v2` size.\"\n\n- \"Spin up a VM with `Standard_B2s` size and no public IP in resource group `<resource-group>`.\"\n\n- \"Create a Linux VM named `<vm-name>` in `<location>` with a custom network security group.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Admin username** |  Required | The admin username for the VM. Required for VM creation. |\n| **Location** |  Required | The Azure region or location. Defaults to the resource group's location if you don't specify it. |\n| **Resource group** |  Required | The name of the Azure resource group. This name is a logical container for Azure resources. |\n| **VM name** |  Required | The name of the virtual machine. |\n| **Admin password** |  Optional | The admin password for Windows VMs or when the SSH key isn't provided for Linux VMs. |\n| **Image** |  Optional | The OS image to use. Can be a URN (publisher:offer:SKU:version), or an alias like `Ubuntu2404` or `Win2022Datacenter`. Defaults to Ubuntu 24.04 LTS. |\n| **Network security group** |  Optional | The name of the network security group to use or create. |\n| **No public IP** |  Optional | The instruction not to create or assign a public IP address. |\n| **OS disk size GB** |  Optional | The OS disk size in GB. Defaults are based on image requirements. |\n| **OS disk type** |  Optional | The OS disk type: `Premium_LRS`, `StandardSSD_LRS`, or `Standard_LRS`. Defaults are based on VM size. |\n| **OS type** |  Optional | The operating system type of the disk. Accepted values: `Linux` or `Windows`. |\n| **Public IP address** |  Optional | The name of the public IP address to use or create. |\n| **Source address prefix** |  Optional | The source IP address range for NSG inbound rules (for example, `203.0.113.0/24` or a specific IP). Defaults to `*` (any source). |\n| **SSH public key** |  Optional | The SSH public key for Linux VMs. Can be the key content or path to a file. |\n| **Subnet** |  Optional | The name of the subnet within the virtual network. |\n| **Virtual network** |  Optional | The name of an existing virtual network to use. If you don't specify it, the command creates a new one. |\n| **VM size** |  Optional | The VM size (for example, `Standard_D2s_v3` or `Standard_B2s`). Defaults to `Standard_DS1_v2` if you don't specify it. |\n| **Zone** |  Optional | The availability zone into which to provision the resource. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ✅ | Local Required: ❌\n\n## Virtual machine: delete\n\n<!-- @mcpcli compute vm delete -->\n\nDelete a virtual machine permanently. This operation is irreversible and the VM data is lost. Use the `Force deletion` parameter to delete a VM that's in a running or failed state.\n\nExample prompts include:\n\n- \"Delete VM `test-vm-01` in resource group `dev-rg`.\"\n\n- \"Remove virtual machine `staging-web` from resource group `staging-rg`.\"\n\n- \"Force delete VM `stuck-vm` in resource group `prod-rg`.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. |\n| **VM name** | Required | The name of the virtual machine to delete. |\n| **Force deletion** | Optional | Delete the resource even if it's in a running or failed state. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ✅ | Local Required: ❌\n\n## Virtual machine: list or get\n\n<!-- @mcpcli compute vm get -->\n\nList or get virtual machines in a subscription or resource group. This command returns VM details, including the name, location, size, provisioning state, OS type, and instance view with runtime status and power state.\n\nExample prompts include:\n\n- \"List all virtual machines in my subscription.\"\n\n- \"Show me all VMs in my subscription.\"\n\n- \"List virtual machines in resource group `resource-group-name`.\"\n\n- \"Get details for virtual machine `vm-name` in resource group `resource-group-name`.\"\n\n- \"Get virtual machine `vm-name` with instance view in resource group `resource-group-name`.\"\n\n- \"Show me VM `vm-name` with runtime status in resource group `resource-group-name`.\"\n\n- \"What is the power state of virtual machine `vm-name` in resource group `resource-group-name`?\"\n\n- \"Get VM `vm-name` status and provisioning state in resource group `resource-group-name`.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Instance view** |  Optional | Include instance view details (only available when retrieving a specific VM). |\n| **VM name** |  Optional | The name of the virtual machine. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Virtual machine: update\n\n<!-- @mcpcli compute vm update -->\n\nUpdate, modify, or reconfigure an existing virtual machine. You can resize a VM, update tags, configure boot diagnostics, or change user data. You might need to deallocate the VM before resizing it to certain sizes.\n\nExample prompts include:\n\n- \"Add license type `Windows_Server` to VM `<vm-name>` in resource group `<resource-group-name>`.\"\n\n- \"Update user data for VM `<vm-name>` in resource group `<resource-group-name>`.\"\n\n- \"Resize VM `<vm-name>` in resource group `<resource-group-name>` to `Standard_B2s`.\"\n\n- \"Enable boot diagnostics for VM `<vm-name>` in resource group `<resource-group-name>`.\"\n\n| Parameter            | Required or optional | Description                                                                                                                    |\n|----------------------|----------------------|--------------------------------------------------------------------------------------------------------------------------------|\n| **Resource group**   | Required             | The name of the Azure resource group. This name is a logical container for Azure resources.                                    |\n| **VM name**          | Required             | The name of the virtual machine.                                                                                               |\n| **Boot diagnostics** | Optional             | Enable or disable boot diagnostics: `true` or `false`.                                                                         |\n| **License type**     | Optional             | The license type for Azure hybrid benefit: `Windows_Server`, `Windows_Client`, `RHEL_BYOS`, `SLES_BYOS`, or `None` to disable. |\n| **Tags**             | Optional             | The space-separated tags in `key=value` format. Use `''` to clear existing tags.                                               |\n| **User data**        | Optional             | The base64-encoded user data for the VM. Use to update custom data scripts.                                                    |\n| **VM size**          | Optional             | The VM size (for example, `Standard_D2s_v3` or `Standard_B2s`). Defaults to `Standard_DS1_v2` if not specified.                |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Virtual machine scale set: create\n\n<!-- @mcpcli compute vmss create -->\n\nCreate, deploy, or provision a virtual machine scale set to run multiple identical VM instances. This tool helps you deploy workloads that require horizontal scaling, load balancing, or high availability across instances. The default configuration creates two instances of size Standard_DS1_v2, running Ubuntu 24.04 LTS.\n\nCreate a scale set by specifying the `resource group`, `VMSS name`, and `admin username`, along with other optional settings. Here are some example commands:\n\n- \"Create a virtual machine scale set named `my-vmss` in resource group `my-rg`.\"\n\n- \"Create a virtual machine scale set with four instances in `my-rg`.\"\n\n- \"Deploy a scale set with a manual upgrade policy and two instances in `my-rg`.\"\n\n- \"Create a Linux virtual machine scale set with SSH public key from '`~/.ssh/id_rsa.pub`' in `my-rg`.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Admin username** | Required | The admin username for the VM. Required for VM creation. |\n| **Location** | Required | The Azure region or location. Defaults to the resource group's location if you don't specify it. |\n| **Resource group** | Required | The name of the Azure resource group. This name is a logical container for Azure resources. |\n| **VMSS name** | Required | The name of the virtual machine scale set. |\n| **Admin password** | Optional | The admin password for Windows VMs or when an SSH key isn't provided for Linux VMs. |\n| **Image** | Optional | The OS image to use. Can be a URN (publisher:offer:SKU:version) or alias like `Ubuntu2404`, `Win2022Datacenter`. Defaults to Ubuntu 24.04 LTS. |\n| **Instance count** | Optional | The number of VM instances in the scale set. Default is 2. |\n| **OS disk size gb** | Optional | OS disk size in GB. Defaults based on image requirements. |\n| **OS disk type** | Optional | OS disk type: `Premium_LRS`, `StandardSSD_LRS`, or `Standard_LRS`. Defaults based on VM size. |\n| **OS type** | Optional | The operating system type of the disk. Accepted values: Linux or Windows. |\n| **Ssh public key** | Optional | The SSH public key for Linux VMs. Can be the key content or path to a file. |\n| **Subnet** | Optional | The name of the subnet within the virtual network. |\n| **Upgrade policy** | Optional | The upgrade policy mode: `Automatic`, `Manual`, or `Rolling`. Default is `Manual`. |\n| **Virtual network** | Optional | The name of an existing virtual network to use. If you don't specify it, the tool creates a new one. |\n| **VM size** | Optional | The VM size (for example, `Standard_D2s_v3` or `Standard_B2s`). Defaults to `Standard_DS1_v2` if not specified. |\n| **Zone** | Optional | The availability zone into which to provision the resource. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ✅ | Local Required: ❌\n\n## Virtual machine scale set: delete\n\n<!-- @mcpcli compute vmss delete -->\n\nDelete a virtual machine scale set and all its VM instances permanently. This operation is irreversible. Use the `Force deletion` parameter to delete a scale set that's in a running or failed state.\n\nExample prompts include:\n\n- \"Delete scale set `web-frontend-vmss` in resource group `prod-rg`.\"\n\n- \"Remove virtual machine scale set `test-scaleset` from resource group `dev-rg`.\"\n\n- \"Force delete virtual machine scale set `stuck-vmss` in resource group `staging-rg`.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. |\n| **VMSS name** | Required | The name of the virtual machine scale set to delete. |\n| **Force deletion** | Optional | Force delete the resource even if it's in a running or failed state. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ✅ | Local Required: ❌\n\n## Virtual machine scale set: list or get\n\n<!-- @mcpcli compute vmss get -->\n\nList or get virtual machine scale sets and their instances in a subscription or resource group. This tool returns scale set details, including name, location, SKU, capacity, upgrade policy, and individual VM instance information.\n\nExample prompts include:\n\n- \"List all virtual machine scale sets in my subscription.\"\n\n- \"List virtual machine scale sets in resource group `<resource-group-name>`.\"\n\n- \"What scale sets are in resource group `<resource-group-name>`?\"\n\n- \"Get details for virtual machine scale set `<vmss-name>` in resource group `<resource-group-name>`.\"\n\n- \"Show me virtual machine scale set `<vmss-name>` in resource group `<resource-group-name>`.\"\n\n- \"Show me instance `<instance-id>` of virtual machine scale set `<vmss-name>` in resource group `<resource-group-name>`.\"\n\n- \"What is the status of instance `<instance-id>` in scale set `<vmss-name>`?\"\n\n| Parameter                          | Required or optional | Description                                              |\n|------------------------------------|----------------------|----------------------------------------------------------|\n| **Instance ID**                    | Optional             | The instance ID of the virtual machine in the scale set. |\n| **Virtual machine scale set name** | Optional             | The name of the virtual machine scale set.               |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Virtual machine scale set: update\n\n<!-- @mcpcli compute vmss update -->\n\nUpdate, modify, or reconfigure an existing virtual machine scale set. You can scale the instance count, resize VMs, change the upgrade policy, or update tags on a scale set. Some changes require `update-instances` to roll out to existing VMs. This tool doesn't create a new virtual machine scale set. Use `VMSS create` instead. To update a single VM, use `VM update`.\n\nExample prompts include:\n\n- \"Update the capacity of virtual machine scale set `myScaleSet` to 15.\"\n\n- \"Enable overprovisioning on the scale set `myScaleSet`.\"\n\n- \"Change the VM size to `Standard_D4s_v3` for `myScaleSet`.\"\n\n- \"Clear existing tags on scale set `myScaleSet` in resource group `myResourceGroup`.\"\n\n| Parameter                  | Required or optional | Description                                                                                                                         |\n|----------------------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------|\n| **Resource group**         | Required             | The name of the Azure resource group. This name is a logical container for Azure resources.                                         |\n| **VMSS name**              | Required             | The name of the virtual machine scale set.                                                                                          |\n| **Capacity**               | Optional             | The number of VM instances (capacity) in the scale set.                                                                             |\n| **Enable auto OS upgrade** | Optional             | Enable automatic OS image upgrades. Requires health probes or the application health extension.                                     |\n| **Overprovision**          | Optional             | Enable or disable overprovisioning. When enabled, Azure provisions more VMs than requested, and deletes extra VMs after deployment. |\n| **Scale in policy**        | Optional             | The scale-in policy to determine which VMs to remove: `Default`, `NewestVM`, or `OldestVM`.                                         |\n| **Tags**                   | Optional             | The space-separated tags in `key=value` format. Use `''` to clear existing tags.                                                    |\n| **Upgrade policy**         | Optional             | The upgrade policy mode: `Automatic`, `Manual`, or `Rolling`. Default is `Manual`.                                                  |\n| **VM size**                | Optional             | The VM size (for example, `Standard_D2s_v3` or `Standard_B2s`). Defaults to `Standard_DS1_v2` if not specified.                     |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Virtual Machines documentation](/azure/virtual-machines/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-confidential-ledger.md",
    "content": "---\ntitle: Azure Confidential Ledger Services Tools\ndescription: Learn how to use the Azure MCP Server with Azure Confidential Ledger Services to manage tamper-proof ledger entries using natural language prompts.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n--- \n\n# Azure Confidential Ledger tools for the Azure MCP Server overview\n\nThe Azure MCP Server enables you to manage Azure resources, including Azure Confidential Ledger Services, by using natural language prompts. This capability lets you work with confidential ledger services without needing to remember complex command syntax.\n\n[Azure Confidential Ledger](/azure/confidential-ledger) is a fully managed, secure, and highly available ledger service that provides a trusted environment for storing sensitive data. It applies trusted execution environments (TEEs) to ensure data integrity and confidentiality, making it suitable for scenarios that require tamper-proof records, such as financial transactions, supply chain management, and compliance auditing.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Append an entry to the ledger\n\n<!-- confidentialledger entries append -->\n\nAppends an immutable (tamper-proof) entry to a Confidential Ledger instance and returns the transaction identifier.\n\nExample prompts include:\n\n- **Simple data entry**: \"Append an entry to 'audit-ledger' with data {\"key\": \"value\"}\"\n- **Tamper-proof transaction**: \"Write a tamper-proof entry to ledger 'financial-ledger' containing {\"transaction\": \"data\"}\"\n- **Collection-specific entry**: \"Append {\"hello\": \"from tool\"} to my confidential ledger 'test-ledger' in collection 'user-data'\"\n- **Immutable audit log**: \"Create an immutable ledger entry in 'compliance-ledger' with content {\"audit\": \"log\"}\"\n- **Basic ledger write**: \"Write an entry to confidential ledger 'business-ledger' with data {\"timestamp\": \"2025-10-08\", \"event\": \"user_login\"}\"\n- **Financial transaction**: \"Append a financial transaction to ledger 'bank-ledger' with content {\"amount\": 1000, \"account\": \"123456\", \"type\": \"deposit\"}\"\n- **Supply chain record**: \"Write tamper-proof entry to ledger 'supply-chain' with data {\"product_id\": \"ABC123\", \"location\": \"warehouse\", \"status\": \"shipped\"}\"\n- **Compliance entry**: \"Create an audit entry in confidential ledger 'regulatory-ledger' in collection 'gdpr-logs' with content {\"user_id\": \"user123\", \"action\": \"data_deletion\", \"timestamp\": \"2025-10-08T10:30:00Z\"}\"\n- **Security log**: \"Append security event to ledger 'security-ledger' with data {\"event_type\": \"login_attempt\", \"ip_address\": \"192.168.1.1\", \"success\": true}\"\n- **Document hash**: \"Write document integrity record to ledger 'document-ledger' in collection 'contracts' with content {\"document_id\": \"contract_001\", \"hash\": \"sha256:abc123\", \"verified\": true}\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Ledger** |  Required | The name of the Confidential Ledger instance (for example, `myledger` ). |\n| **Content** |  Required | The JSON or text payload to append as a tamper-proof ledger entry. |\n| **Collection ID** |  Optional | Optional ledger collection identifier. If omitted the default collection is used. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Get an entry from the ledger\n\n<!-- confidentialledger entries get -->\n\nRetrieves the Confidential Ledger entry and its recorded contents for the specified transaction ID, optionally scoped to a collection.\n\nExample prompts include:\n\n- **Retrieve specific transaction**: \"Get entry from confidential ledger 'audit-ledger' with transaction ID '2.199'\"\n- **Collection-specific retrieval**: \"Get entry with transaction ID '3.275' from ledger 'compliance-ledger' in collection 'gdpr-logs'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Ledger** |  Required | The name of the Confidential Ledger instance (for example, `myledger`). |\n| **Transaction ID** |  Required | The Confidential Ledger transaction identifier (for example: `2.199`). |\n| **Collection ID** |  Optional | Optional ledger collection identifier. If omitted the default collection is used. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Confidential Ledger](/azure/confidential-ledger)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-container-apps.md",
    "content": "---\n\ntitle: Azure MCP Server tools for Azure Container Apps\ndescription: Use Azure MCP Server tools to manage containerized applications and serverless container instances in Azure Container Apps with natural language prompts from your IDE.\nms.date: 4/6/2026\nms.service: azure-mcp-server\nms.topic: concept-article\ntool_count: 1\nmcp-cli.version: 2.0.0-beta.39\nreviewer: ArthurMa1978\nauthor: diberry\nms.author: diberry\nai-usage: ai-generated\nms.custom: build-2025\ncontent_well_notification:\n  - AI-contribution\n---\n\n# Azure MCP Server tools for Azure Container Apps\n\nThe Azure MCP Server lets you manage containerized applications on Azure Container Apps, including: list, with natural language prompts.\n\nAzure Container Apps is a fully managed serverless container platform for building and running microservices and containerized applications. For more information, see [Azure Container Apps documentation](/azure/container-apps/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n\n## List container apps\n\n<!-- @mcpcli containerapps list -->\n\nThis tool, part of the Model Context Protocol (MCP), lists Azure Container Apps in a subscription. You can optionally filter results by a resource group. Each returned container app includes the following properties: `name`, `location`, `resourceGroup`, `managedEnvironmentId`, and `provisioningState`. If no container apps are found, this tool returns an empty list of results, consistent with other list tools.\n\nExample prompts include:\n\n- \"List all Azure Container Apps in my subscription.\"\n- \"Show me my Azure Container Apps.\"\n- \"List container apps in resource group 'rg-prod'.\"\n- \"Show me the container apps in resource group 'webapp-dev'.\"\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Container Apps documentation](/azure/container-apps/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-container-registry.md",
    "content": "---\ntitle: Azure Container Registry Tools \ndescription: Learn how to use the Azure MCP Server with Azure Container Registry.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n--- \n\n# Azure Container Registry tools for the Azure MCP Server overview\n\nThe Azure MCP Server enables you to manage Azure resources, including Azure Container Registries, by using natural language prompts. This capability lets you work with container registries without needing to remember complex command syntax.\n\n[Azure Container Registry](/azure/container-registry/) enables you to build, store, and manage container images and artifacts in a private registry for all types of container deployments. Use Azure container registries with your existing container development and deployment pipelines. Use Azure Container Registry Tasks to build container images in Azure on-demand, or automate builds triggered by source code updates, updates to a container's base image, or timers.\n\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Registry: List registry accounts in subscription\n\n<!-- acr registry list -->\n\nList accounts in a subscription. Optionally filter by resource group. \n\nExample prompts include: \n\n\n- **List registries**: \"List all Azure Container Registries in my subscription.\"\n- **Show registries**: \"What container registries do I have?\"\n- **Find registries in a group**: \"Show me all container registries in resource group 'devops-resources'.\"\n- **Filter by resource group**: \"List container registries in the resource group 'production-resources'.\"\n- **Query registries**: \"Can you list all my Azure Container Registries?\"\n- **Check registries**: \"Container registries in subscription abc123\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Registry: List repositories in registry\n\n<!-- acr registry repository list -->\n\nList repositories in Azure Container Registries. By default, the command lists repositories for all registries in the subscription.\n\nExample prompts include:\n\n- **List all repositories**: \"List all repositories in my Azure Container Registries.\"\n- **Show repositories for a registry**: \"What repositories are in my registry 'myregistry'?\"\n- **Find specific repository**: \"Show me the repository 'myapp' in registry 'myregistry'.\"\n- **Filter by image name**: \"List all repositories with images named 'myimage' in my registries.\"\n- **Query repositories**: \"Can you list all my container images?\"\n- **Check repository details**: \"Get details for repository 'myapp' in registry 'myregistry'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|----------|-------------|\n| **Registry** | Optional | The name of the Azure Container Registry. This name is unique for your container registry. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Container Registry](/azure/container-registry/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-cosmos-db.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure Cosmos DB\ndescription: Use Azure MCP Server tools to manage Azure Cosmos DB resources with natural language prompts from your IDE.\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 03/24/2026\ncontent_well_notification:\n  - AI-contribution\nai-usage: ai-assisted\ntool_count: 2\nmcp-cli.version: 2.0.0-beta.31\n---\n\n# Azure MCP Server tools for Azure Cosmos DB\n\nThe Azure Model Context Protocol (MCP) Server lets you manage Azure Cosmos DB resources with natural language prompts. You can list accounts, databases, and containers, run SQL queries against containers, and inspect resource metadata.\n\nAzure Cosmos DB is a globally distributed, multi-model database service. For more information, see [Azure Cosmos DB documentation](/azure/cosmos-db/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## List accounts, databases, or containers\n\n<!-- @mcpcli cosmos list -->\n\nList Azure Cosmos DB accounts, databases, or containers. By default, this tool returns all accounts in your subscription. Specify the `Account` to list databases in that account, or specify both the `Account` and the `Database` to list containers in that database. Results are returned at the level you specify: account, database, or container.\n\nExample prompts include:\n\n- \"List all Azure Cosmos DB accounts in my subscription.\"\n- \"Show me the databases in the Azure Cosmos DB account 'prod-cosmos'.\"\n- \"List all the containers in the database 'orders-db' for the Azure Cosmos DB account 'my-cosmosdb'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Account** |  Optional | The name of the Azure Cosmos DB account. When not specified, lists all accounts in the subscription. Specify this parameter to list databases, or combine with `Database` to list containers. |\n| **Database** |  Optional | The name of the database. Requires `Account` to be specified. When provided, lists containers within this database. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Query container items\n\n<!-- @mcpcli cosmos database container item query -->\n\nQuery items from an Azure Cosmos DB container. Provide the account name, database name, and container name, and optionally supply a SQL query to filter results. The query uses Azure Cosmos DB SQL API syntax and the tool returns matching items as JSON documents.\n\nExample prompts include:\n\n- \"List all items from container 'orders' in database 'ecommerce-db' for Azure Cosmos DB account 'contoso-cosmos'.\"\n- \"Query items from container 'orders' in database 'ecommerce-db' for account 'contoso-cosmos' using the SQL query 'SELECT * FROM c WHERE c.status = shipped'.\"\n- \"Show items containing 'outage' in container 'orders' in database 'sales' for Azure Cosmos DB account 'my-cosmos-account'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Account** |  Required | The name of the Azure Cosmos DB account to query (for example, `contoso-cosmos`). |\n| **Container** |  Required | The name of the container to query (for example, `orders`). |\n| **Database** |  Required | The name of the database to query (for example, `ecommerce-db`). |\n| **Query** |  Optional | SQL query to execute against the container. Uses Azure Cosmos DB SQL API syntax. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Cosmos DB documentation](/azure/cosmos-db/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-data-explorer.md",
    "content": "---\ntitle: Azure Data Explorer \ndescription: \"Learn how to use the Azure MCP Server with Azure Data Explorer. Query data, list clusters, and manage databases using natural language prompts. You can also include KQL syntax in your prompts if needed.\"\nauthor: diberry\nms.author: diberry\nms.date: 12/05/2025\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n#kusto\n--- \n# Azure Data Explorer tools for the Azure MCP Server overview\n\nThe Azure MCP Server allows you to manage Azure Data Explorer resources using natural language prompts. You can list clusters, view databases, query data with natural language. You can also use specific KQL queries for targeted responses.\n\n[Azure Data Explorer](/azure/data-explorer/data-explorer-overview) is a fast, fully managed data analytics service for real-time analysis on large volumes of data streaming from applications, websites, IoT devices, and more. Azure Data Explorer helps you analyze large volumes of diverse data from any data source, such as websites, applications, IoT devices, and more.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Conditional parameters\n\nSome of the Azure Data Explorer tools require **one** of the following parameter sets within the conversation context:\n\n- **Option 1**: Cluster URI\n- **Option 2**: Both cluster name **and** subscription\n\nDon't provide all three parameters (cluster URI, cluster name, and subscription) together, because this creates conflicting inputs.\n\n## Cluster: List clusters\n\n<!-- kusto cluster list -->\n\nThe Azure MCP Server lists all Azure Data Explorer clusters in a subscription.\n\nExample prompts include:\n\n- **List clusters**: \"Show me all Azure Data Explorer clusters in my subscription.\"\n- **View clusters**: \"What Azure Data Explorer clusters do I have available?\"\n- **Check clusters**: \"List all my Azure Data Explorer clusters.\"\n- **Query clusters**: \"Show my Azure Data Explorer cluster organization.\"\n- **Find clusters**: \"Get all ADX clusters in my Azure subscription.\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Cluster: Get cluster details\n\n<!-- kusto cluster get -->\n\nThe Azure MCP Server gets details for a specific Azure Data Explorer cluster.\n\nExample prompts include:\n\n- **Get details**: \"Show me details of my Azure Data Explorer cluster 'analytics-cluster'.\"\n- **View cluster**: \"Give me information about my ADX cluster 'logs-prod'.\"\n- **Cluster info**: \"What are the details of Azure Data Explorer cluster 'data-explorer-dev'?\"\n- **Check configuration**: \"Get configuration details of my ADX cluster 'telemetry-cluster'.\"\n- **Cluster properties**: \"Show properties of my Azure Data Explorer cluster in subscription 'my-sub'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Cluster** | Required | The name of the Azure Data Explorer cluster. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Database: List databases\n\n<!-- kusto database list -->\n\nThe Azure MCP Server lists all databases in an Azure Data Explorer cluster.\n\nExample prompts include:\n\n- **List databases**: \"Show me all databases in Azure Data Explorer cluster 'analytics-cluster'.\"\n- **View databases**: \"What databases do I have in my ADX cluster 'analytics-cluster'?\"\n- **Check databases**: \"List all databases in Data Explorer cluster 'analytics-cluster'.\"\n- **Query databases**: \"Show databases in Azure Data Explorer cluster URI 'https://mycluster.westus.kusto.windows.net'.\"\n- **Find databases**: \"Get all databases from ADX cluster 'analytics-cluster'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Cluster URI** | [Conditionally](#conditional-parameters) required | The URI of the Azure Data Explorer cluster. |\n| **Cluster** | [Conditionally](#conditional-parameters) required | The name of the Azure Data Explorer cluster. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Table: List tables\n\n<!-- kusto table list -->\n\nThe Azure MCP Server lists all tables in a specific Azure Data Explorer database.\n\nExample prompts include:\n\n- **List tables**: \"Show me all tables in the 'logs' database of Azure Data Explorer cluster 'analytics-cluster'.\"\n- **View tables**: \"What tables do I have in database 'telemetry' in ADX cluster 'analytics-cluster'?\"\n- **Check tables**: \"List all tables in Azure Data Explorer database 'analytics' in cluster 'analytics-cluster'.\"\n- **Query tables**: \"Show tables in the 'metrics' database of Data Explorer cluster 'analytics-cluster'.\"\n- **Find tables**: \"Get all tables from 'events' database in Azure Data Explorer cluster 'analytics-cluster'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Cluster URI** | [Conditionally](#conditional-parameters) required | The URI of the Azure Data Explorer cluster. |\n| **Cluster** | [Conditionally](#conditional-parameters) required | The name of the Azure Data Explorer cluster. |\n| **Database** | Required | The name of the Azure Data Explorer database. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Table: Get table schema\n\n<!-- kusto table schema -->\n\nThe Azure MCP Server gets the schema of a specific table in an Azure Data Explorer database.\n\nExample prompts include:\n\n- **View schema**: \"Show me the schema of the 'Events' table in database 'logs' in Azure Data Explorer cluster 'analytics-cluster'.\"\n- **Get structure**: \"What columns does the 'Metrics' table have in database 'telemetry' in ADX cluster 'analytics-cluster'?\"\n- **Check schema**: \"Describe the 'Logs' table in database 'logs' in Data Explorer cluster 'analytics-cluster'.\"\n- **View columns**: \"Show columns and types for 'Telemetry' table in database 'telemetry' in Azure Data Explorer cluster 'analytics-cluster'.\"\n- **Examine table**: \"Get the structure of 'Traces' table in database 'logs' in ADX cluster 'analytics-cluster'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Cluster URI** | [Conditionally](#conditional-parameters) required | The URI of the Azure Data Explorer cluster. |\n| **Cluster** | [Conditionally](#conditional-parameters) required | The name of the Azure Data Explorer cluster. |\n| **Database** | Required | The name of the Azure Data Explorer database. |\n| **Table** | Required | The name of the table. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Sample data\n\n<!-- kusto sample -->\n\nThe Azure MCP Server retrieves a sample of data from a specified Azure Data Explorer table.\n\nExample prompts include:\n\n- **Get sample data**: \"Show me a sample of data from the 'Events' table in database 'logs' in Azure Data Explorer cluster 'analytics-cluster'.\"\n- **Preview table**: \"Give me a preview of records from the 'Logs' table in database 'logs' in ADX cluster 'analytics-cluster'.\"\n- **View data examples**: \"Show sample rows from 'Metrics' table in database 'telemetry' in Data Explorer cluster 'analytics-cluster'.\"\n- **Check data format**: \"Get a few sample records from the 'Telemetry' table in database 'telemetry' in Azure Data Explorer cluster 'analytics-cluster' to see the data structure.\"\n- **Data exploration**: \"Return 10 sample rows from 'UserActivity' table in database 'logs' in ADX cluster 'analytics-cluster'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Cluster URI** | [Conditionally](#conditional-parameters) required | The URI of the Azure Data Explorer cluster. |\n| **Cluster** | [Conditionally](#conditional-parameters) required | The name of the Azure Data Explorer cluster. |\n| **Database** | Required | The name of the Azure Data Explorer database. |\n| **Table** | Required | The name of the table to sample data from. |\n| **Limit** | Optional | The maximum number of rows to return in the sample. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Query\n\n<!-- kusto query -->\n\nThe Azure MCP Server executes a KQL query against an Azure Data Explorer database.\n\nExample prompts include:\n\n- **Run query**: \"Execute 'Logs | where Timestamp > ago(1h) | count' in database 'logs' in Azure Data Explorer cluster 'analytics-cluster'.\"\n- **Query data**: \"Run KQL query 'Logs | where Level == \"Error\" and Timestamp > ago(24h)' to find all errors in the last 24 hours in database 'logs' in ADX cluster 'analytics-cluster'.\"\n- **Fetch data**: \"Get recent events with query 'Events | take 100' from database 'logs' in Data Explorer cluster 'analytics-cluster'.\"\n- **Extract insights**: \"Query user activity patterns with 'UserActivity | summarize count() by UserId' from database 'logs' in Azure Data Explorer cluster 'analytics-cluster'.\"\n- **Analyze logs**: \"Execute KQL 'Metrics | summarize avg(Duration) by Service' to summarize performance metrics by service in database 'telemetry' in ADX cluster 'analytics-cluster'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Cluster URI** | [Conditionally](#conditional-parameters) required | The URI of the Azure Data Explorer cluster. |\n| **Cluster** | [Conditionally](#conditional-parameters) required | The name of the Azure Data Explorer cluster. |\n| **Database** | Required | The name of the Azure Data Explorer database. |\n| **Query** | Required | The KQL query to execute. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Data Explorer](/azure/data-explorer/data-explorer-overview)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-database-postgresql.md",
    "content": "---\ntitle: Azure Database for PostgreSQL Tools \ndescription: Learn how to use the Azure MCP Server to manage Azure Database for PostgreSQL resources with natural language prompts. Query databases, list tables, and retrieve schemas easily.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n--- \n# Azure Database for PostgreSQL tools for the Azure MCP Server overview\n\nThe Azure MCP Server allows you to manage Azure Database for PostgreSQL resources using natural language prompts. You can query databases, list tables, retrieve schemas, and more without remembering complex query syntax.\n\n[Azure Database for PostgreSQL](/azure/postgresql/) is a fully managed, intelligent, and scalable PostgreSQL database service in the cloud. It lets you focus on application development, not database management.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Database: List databases\n\n<!-- postgres database list -->\n\nThe Azure MCP Server can list all databases in a PostgreSQL server.\n\nExample prompts include:\n\n- **List databases**: \"Show me all databases in my PostgreSQL server 'my-pg-server' in resource group 'my-resource-group'\"\n- **View databases**: \"What databases do I have in my PostgreSQL server 'my-pg-server' in resource group 'my-resource-group'?\"\n- **Check databases**: \"Check that I have a database named 'xyz' in server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Query databases**: \"Show databases in PostgreSQL server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Find databases**: \"Get all databases from my PostgreSQL instance 'my-pg-server' in resource group 'my-resource-group'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **User** | Required | The user name to access PostgreSQL server. |\n| **Server** | Required | The PostgreSQL server to be accessed. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Database: Execute database query\n\n<!-- postgres database query -->\n\nThe Azure MCP Server can execute a query on a PostgreSQL database.\n\nExample prompts include:\n\n- **Run query**: \"Execute 'SELECT * FROM users LIMIT 10' in my PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Query data**: \"Run a query to get recent orders from PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Fetch data**: \"Get user information from my PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group' with query\"\n- **Extract data**: \"Query customer data from my PostgreSQL server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Retrieve records**: \"Select top sales records from PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **User** | Required | The user name to access PostgreSQL server. |\n| **Server** | Required | The PostgreSQL server to be accessed. |\n| **Database** | Required | The PostgreSQL database to be accessed. |\n| **Query** | Required | Query to be executed against a PostgreSQL database. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Table: List tables\n\n<!-- postgres table list -->\n\nThe Azure MCP Server can list all tables in a PostgreSQL database.\n\nExample prompts include:\n\n- **List tables**: \"Show me all tables in my PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n- **View tables**: \"What tables do I have in my PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'?\"\n- **Check tables**: \"Check that I have a table named 'xyz' in PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Query tables**: \"Show tables in PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Find tables**: \"Get all tables from my PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **User** | Required | The user name to access PostgreSQL server. |\n| **Server** | Required | The PostgreSQL server to be accessed. |\n| **Database** | Required | The PostgreSQL database to be accessed. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Table: Get table schema\n\n<!-- postgres table schema get -->\n\nThe Azure MCP Server can get the schema of a specific table in a PostgreSQL database.\n\nExample prompts include:\n\n- **View schema**: \"Show me the schema of the 'users' table in my PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Get structure**: \"What columns does the 'products' table have in my PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'?\"\n- **Check schema**: \"Check if my schema has a not null constraint on the id column in database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n- **View columns**: \"Show columns and types for 'customers' table in PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Examine table**: \"Get the structure of 'transactions' table in my PostgreSQL database 'my-db' on server 'my-pg-server' in resource group 'my-resource-group'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **User** | Required | The user name to access PostgreSQL server. |\n| **Server** | Required | The PostgreSQL server to be accessed. |\n| **Database** | Required | The PostgreSQL database to be accessed. |\n| **Table** | Required | The PostgreSQL table to be accessed. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Server: List servers\n\n<!-- postgres server list -->\n\nThe Azure MCP Server can list all PostgreSQL servers in a subscription and resource group.\n\nExample prompts include:\n\n- **List servers**: \"Show me all PostgreSQL servers in resource group 'my-resource-group'\"\n- **View servers**: \"What PostgreSQL servers do I have in resource group 'my-resource-group'?\"\n- **Check servers**: \"Check if resource group 'my-resource-group' has a server named 'xyz'\"\n- **Query servers**: \"Show PostgreSQL servers in resource group 'my-resource-group'\"\n- **Find servers**: \"Get all PostgreSQL instances in resource group 'my-resource-group'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **User** | Required | The user name to access PostgreSQL server. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Server: Get server configuration\n\n<!-- postgres server config get -->\n\nThe Azure MCP Server can retrieve the configuration of a PostgreSQL server.\n\nExample prompts include:\n\n- **View configuration**: \"Show me the configuration of my PostgreSQL server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Get settings**: \"What are the settings of my PostgreSQL server 'pg-prod' in resource group 'my-resource-group'?\"\n- **Check config**: \"Check if my server 'my-pg-server' in resource group 'my-resource-group' configuration 'x' is set to 'y'\"\n- **View server params**: \"Show me all configuration parameters of my PostgreSQL server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Get server setup**: \"What is the configuration of my PostgreSQL instance 'my-pg-server' in resource group 'my-resource-group'?\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **User** | Required | The user name to access PostgreSQL server. |\n| **Server** | Required | The PostgreSQL server to be accessed. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Server: Get server parameter\n\n<!-- postgres server param get -->\n\nThe Azure MCP Server can retrieve a specific parameter of a PostgreSQL server.\n\nExample prompts include:\n\n- **View parameter**: \"Show me the 'max_connections' parameter of my PostgreSQL server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Get setting**: \"What is the value of 'shared_buffers' in my PostgreSQL server 'my-pg-server' in resource group 'my-resource-group'?\"\n- **Check parameter**: \"Check if my server 'my-pg-server' in resource group 'my-resource-group' parameter 'x' is set to 'y'\"\n- **View server param**: \"Show me the 'work_mem' parameter value in my PostgreSQL server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Get configuration value**: \"What is the 'maintenance_work_mem' set to in my PostgreSQL instance 'my-pg-server' in resource group 'my-resource-group'?\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **User** | Required | The user name to access PostgreSQL server. |\n| **Server** | Required | The PostgreSQL server to be accessed. |\n| **Param** | Required | The PostgreSQL parameter to be accessed. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Server: Set server parameter\n\n<!-- postgres server param set -->\n\nThe Azure MCP Server can set or update a specific parameter on a PostgreSQL server. This allows you to configure server settings, optimize performance, and adjust database behavior according to your application requirements.\n\nExample prompts include:\n\n- **Update connection setting**: \"Set the 'max_connections' parameter to '200' on my 'prod-postgres-server' in resource group 'my-resource-group'\"\n- **Configure memory**: \"Update the 'shared_buffers' parameter to '256MB' on server 'database-server-east' in resource group 'my-resource-group'\"\n- **Adjust timeout**: \"Set 'statement_timeout' to '30000' on my PostgreSQL server 'my-pg-server' in resource group 'my-resource-group'\"\n- **Configure logging**: \"Update the 'log_statement' parameter to 'all' on server 'dev-postgres' in resource group 'my-resource-group'\"\n- **Set maintenance parameter**: \"Configure 'maintenance_work_mem' to '64MB' on my database server 'my-pg-server' in resource group 'my-resource-group'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **User** | Required | The user name to access the PostgreSQL server. |\n| **Server** | Required | The PostgreSQL server name to configure. |\n| **Param** | Required | The PostgreSQL parameter to be set. |\n| **Value** | Required | The value to set for the parameter. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Database for PostgreSQL](/azure/postgresql/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-deploy.md",
    "content": "---\n\ntitle: Azure MCP Server tools for Azure Deploy\ndescription: Use Azure MCP Server tools to manage deployments and deployment pipelines for Azure applications and infrastructure with natural language prompts from your IDE.\nms.date: 04/06/2026\nms.service: azure-mcp-server\nms.topic: concept-article\ntool_count: 5\nmcp-cli.version: 2.0.0-beta.39+0410ff6ade5c70a207a8e7c7a7c78be69f7f1d76\nauthor: diberry\nms.author: diberry\nreviewer: qianwens\nai-usage: ai-generated\nms.custom: build-2025\ncontent_well_notification:\n  - AI-contribution\n---\n\n# Azure MCP Server tools for Azure Deploy\n\nThe Azure MCP Server helps you manage Azure Deploy tasks. These tasks include operations that generate architecture diagrams, get app logs, retrieve deploy plans, fetch IaC rules, and provide pipeline guidance, all through natural language prompts.\n\nAzure Deploy is a set of tools that help you plan, validate, and monitor deployments to Azure resources. For more information, see [Azure Deploy documentation](/azure/azure-resource-manager/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n\n## Get app logs\n\n<!-- @mcpcli deploy app logs get -->\n\nThis tool shows application logs for applications that the Azure Developer CLI (azd) deploys. This tool queries the application's Log Analytics workspace for Azure Container Apps, Azure App Service, and Azure Functions. It automatically discovers the workspace and associated resources from the azd environment configuration. It works only for applications deployed by `azd up`.\n\nCheck deployment status or troubleshoot post-deployment issues.\n\nExample prompts include:\n\n- \"Show me the log of the application deployed by azd for Azd env name 'dev' and workspace folder '/home/alice/projects/my-app'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **AZD env name** |  Required | The environment name created by the Azure Developer CLI (azd) and stored in AZURE_ENV_NAME during `azd init` or `azd up`. If not provided in context, this tool checks the `.azure` directory in the workspace, or runs `azd env list`. |\n| **Workspace folder** |  Required | The full path to the workspace folder that contains the azd project. |\n| **Limit** |  Optional | The maximum number of log rows to retrieve. Use it to limit results or avoid exceeding token limits. Default is 200. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Generate architecture diagram\n\n<!-- @mcpcli deploy architecture diagram generate -->\n\nThis tool is part of the Model Context Protocol (MCP) toolset. It generates an Azure service architecture diagram that shows recommended Azure services and their logical connections for an application. This tool renders the diagram from an application topology (AppTopology) provided as input. You provide an AppTopology that describes services, compute hosts, dependencies, and environment settings. You can build the AppTopology by scanning the workspace to detect services, frameworks, and environment variables for connection strings. For .NET Aspire applications, include `aspireManifest.json`. The diagram focuses on service selection and connections. It doesn't show detailed network topology or security design.\n\nExample prompts include:\n\n- \"Generate the Azure architecture diagram for this application raw MCP tool input '\\<secure-password\\>'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Raw mcp tool input** |  Required | JSON object that defines the input structure for this tool. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get IaC rules\n\n<!-- @mcpcli deploy iac rules get -->\n\nRetrieves rules and best practices for creating Bicep and Terraform Infrastructure as Code (IaC) files to deploy Azure applications. This Model Context Protocol (MCP) tool returns guidance on Azure resource configuration standards, compatibility with Azure Developer CLI (azd) and Azure CLI, and general IaC quality requirements. Use the guidance to improve Bicep scripts and Terraform templates for Azure resources and to align deployments with Azure best practices.\n\nExample prompts include:\n\n- \"Show me the rules and best practices for writing Bicep and Terraform IaC for Azure using deployment tool 'AzCli'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Deployment tool** |  Required | The deployment tool to use. Valid values: `AzCli`, `AZD`. |\n| **IaC type** |  Optional | The type of IaC file used for deployment. Valid values include `bicep`, `terraform`. Leave empty only if you want to use Azure CLI command script without IaC file. |\n| **Resource types** |  Optional | List of Azure resource types to generate rules for. Get the value from context and use the same resources defined in the plan. Valid value: `appservice`,`containerapp`,`function`,`aks`,`azuredatabaseforpostgresql`,`azuredatabaseformysql`,`azuresqldatabase`,`azurecosmosdb`,`azurestorageaccount`,`azurekeyvault`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\nExamples\n\n- Provide IaC rules for Bicep and Terraform for Azure App Service and Azure SQL Database: \"Get rules for deployment tool 'AZD' and IaC type 'bicep' for resources 'appservice','azuresqldatabase'\".\n- Show best practices for a Terraform template that deploys Azure Kubernetes Service and Azure Key Vault: \"Get rules for deployment tool 'AzCli' and IaC type 'terraform' for resources 'aks','azurekeyvault'\".\n- Request general IaC quality checks without an IaC file, using an AzCli script: \"Get rules for deployment tool 'AzCli' and leave IaC type empty for resources 'azurestorageaccount'\".\n\n## Get pipeline guidance\n\n<!-- @mcpcli deploy pipeline guidance get -->\n\nThis Model Context Protocol (MCP) tool generates CI/CD pipeline configuration and step-by-step guidance to deploy an application to Azure by using GitHub Actions or Azure DevOps pipelines. It supports Azure Developer CLI (azd) and Azure CLI–based deployments. It can generate pipelines that provision infrastructure and deploy application code.\n\nYou can choose GitHub Actions or Azure DevOps, decide whether the pipeline should only deploy or also provision infrastructure, and confirm whether the project uses azd (for example, an `azure.yaml` file is present). Specify `deploy-only` or `provision-and-deploy`, and set `Is azd project` to `true` only if the project uses azd tooling and an azure.yaml file is available.\n\nExample prompts include:\n\n- \"How do I set up a CI/CD pipeline with GitHub Actions to deploy my app to Azure, with Deploy option 'deploy-only', it isn't an AZD project, and the pipeline platform 'github-actions'?\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Deploy option** |  Required | Valid values: deploy-only, provision-and-deploy. Default to deploy-only. Set to `provision-and-deploy` only when you explicitly want an infra provisioning pipeline that uses local provisioning scripts. |\n| **Is AZD project** |  Required | Whether to use AZD tool in the deployment pipeline. Set to `true` only if `azure.yaml` is provided or the context suggests AZD tools. |\n| **Pipeline platform** |  Required | The platform for the deployment pipeline. Valid values: `github-actions`, `azure-devops`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get deploy plan\n\n<!-- @mcpcli deploy plan get -->\n\nGenerates a formatted, step-by-step deployment plan for an application to Azure. This tool, part of the Model Context Protocol (MCP), suggests Azure resources, provides infrastructure as code (IaC) templates, and lists deployment steps based on a target hosting service and a chosen provisioning tool. For example, target hosting services include Azure Container Apps, Azure App Service, or Azure Kubernetes Service (AKS). For provisioning tools, examples include Azure Developer CLI (azd), Azure CLI with Bicep, or Terraform.\n\nThis tool doesn't scan your workspace or detect resources automatically. You analyze the project, determine frameworks, dependencies, and existing resources, choose the hosting service and provisioning tool, and then provide those values to generate the plan.\n\nExample prompts include:\n\n- \"How do I create a step-by-step deployment plan for project name 'my-webapp' to Azure with deploy option 'provision-and-deploy', provisioning tool 'AZD', source type 'from-project', target app service 'WebApp', workspace folder '/home/dev/my-webapp', and IaC options 'bicep'?\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Deploy option** |  Required | Set the value based on project and user input. Valid values: `provision-and-deploy`, `deploy-only`, `provision-only`. Choose `deploy-only` when you deploy to existing Azure resources or when IaC files already exist. Choose `provision-only` when you only want to provision Azure resources. Choose `provision-and-deploy` when you want to provision infrastructure and deploy the application. |\n| **Project name** |  Required | The name of the project to generate the deployment plan for. If you don't provide a project name, the tool infers it from the workspace. |\n| **Provisioning tool** |  Required | The tool to use for provisioning Azure resources. Valid values: `AzCli`, `AZD`. For example, Azure Developer CLI (azd) or Azure CLI with Bicep. |\n| **Source type** |  Required | The source of the plan to generate from. Valid values: `from-project`, `from-azure`, `from-context`. Use `from-project` to base the plan on project files in the workspace. Use `from-azure` to base the plan on existing Azure resources. Use `from-context` to base the plan on values you provide when no project files or Azure resources exist. |\n| **Target app service** |  Required | The Azure service to deploy the application. Valid values: `ContainerApp`, `WebApp`, `FunctionApp`, `AKS`. Recommend one based on the application architecture and runtime. |\n| **Workspace folder** |  Required | The full path of the workspace folder. |\n| **IaC options** |  Optional | The Infrastructure as Code option. Valid values: `bicep`, `terraform`. Leave empty to use an Azure CLI script. |\n| **Resource group** | Optional | The name of the Azure resource group. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure deployment documentation](/azure/azure-resource-manager/templates/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-event-grid.md",
    "content": "---\ntitle: Azure Event Grid\ndescription: Learn how to use the Azure MCP Server with Azure Event Grid.\nauthor: diberry\nms.author: diberry\nms.date: 12/05/2025\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n--- \n# Azure Event Grid tools for the Azure MCP Server overview\n\nThe Azure MCP Server allows you to manage Azure Event Grid resources using natural language prompts. You can list topics, view subscriptions, and more without remembering complex syntax.\n\n[Azure Event Grid](/azure/event-grid/overview) is a highly scalable, serverless event broker that you can use to integrate applications using events. Events are delivered by Event Grid to subscriber destinations such as applications, Azure services, or any endpoint to which Event Grid has network access. The source of those events can be other applications, SaaS services, and Azure services.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Events: Publish\n\n<!-- eventgrid events publish -->\n\nPublish custom events to Event Grid topics for event-driven architectures. This tool sends structured event data to \nEvent Grid topics with schema validation and delivery guarantees for downstream subscribers. Returns publish operation \nstatus. \n\nExample prompts include:\n\n- **Publish with schema**: \"Publish an event to Event Grid topic 'payment-events' using CloudEvents schema with data '{\\\"orderId\\\": \\\"12345\\\", \\\"amount\\\": 99.99}'.\"\n- **Simple publish**: \"Publish event to my Event Grid topic 'user-signups' with data '{\\\"userId\\\": \\\"user123\\\", \\\"email\\\": \\\"user@example.com\\\"}'.\"\n- **Resource group context**: \"Send an event to Event Grid topic 'analytics-events' in resource group 'data-processing' with data '{\\\"eventType\\\": \\\"click\\\", \\\"timestamp\\\": \\\"2025-12-05T10:00:00Z\\\"}'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Topic** |  Required | The name of the Event Grid topic. |\n| **Data** |  Required | The event data as JSON string to publish to the Event Grid topic. |\n| **Schema** |  Optional | The event schema type (`CloudEvents`, `EventGrid`, or `Custom`). Defaults to `EventGrid`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Subscription: List\n\n<!-- eventgrid subscription list -->\n\nList Event Grid subscriptions with filtering and endpoint configuration. This tool shows all active \nsubscriptions including webhook endpoints, event filters, and delivery retry policies. \n\nExample prompts include:\n\n- **Topic in subscription**: \"List Event Grid subscriptions for topic 'payment-events' in subscription\"\n- **View all subscriptions**: \"Show all Event Grid subscriptions in my subscription\"\n- **Complete inventory**: \"List all Event Grid subscriptions in subscription\"\n- **Resource group filter**: \"Show Event Grid subscriptions in resource group 'notification-services' in subscription\"\n- **Resource group context**: \"List Event Grid subscriptions for topic 'analytics-events' in resource group 'data-processing'\"\n- **Filter by topic**: \"Show me all Event Grid subscriptions for topic 'user-signups'\"\n- **Location-based**: \"List Event Grid subscriptions for subscription in location 'eastus'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Topic** |  Optional | The name of the Event Grid topic. |\n| **Region** |  Optional | The Azure region to filter resources by (for example, `eastus`, `westus2`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Topic: List\n\n<!-- eventgrid topic list -->\n\n\nList all Event Grid topics in an Event Grid subscription with configuration and status information. This tool retrieves\ntopic details including endpoints, access keys, and subscription information for event publishing and management.\n\nExample prompts include:\n\n- **List topics**: \"Show me all the Event Grid topics in my subscription.\"\n- **View topic details**: \"List Event Grid topics in resource group 'event-processing'\"\n- **Check available topics**: \"What Event Grid topics do I have in my 'westus2' region?\"\n- **Topic inventory**: \"I need a list of all my Event Grid resources\"\n- **Find endpoints**: \"Show me the endpoints for all my Event Grid topics\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Event Grid documentation](/azure/event-grid/overview)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-event-hubs.md",
    "content": "---\ntitle: Azure Event Hubs Tools\ndescription: Learn to use Azure MCP Server tools to manage Event Hubs resources with natural language prompts. Create, update, and delete namespaces and consumer groups.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\ncontent_well_notification:\n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n---\n# Azure Event Hubs tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage Azure Event Hubs resources with natural language prompts. You don't need to remember specific command syntax.\n\n[Azure Event Hubs](/azure/event-hubs/event-hubs-about) is a native data-streaming service in the cloud that streams millions of events per second, with low latency, from any source to any destination. Event Hubs is compatible with Apache Kafka and lets you run existing Kafka workloads without any code changes.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Event Hub: Delete consumer group\n\n<!-- eventhubs eventhub consumergroup delete -->\n\nDelete a consumer group from the specified Event Hub.\n\nExample prompts include: \n\n- **Delete specific consumer group**: \"Delete consumer group 'analytics-group' from Event Hub 'orders-hub' in namespace 'eventhub-prod' in resource group 'my-resource-group'\"\n- **Remove consumer group**: \"Remove the consumer group 'monitoring-consumers' from my Event Hub 'telemetry-events' in namespace 'prod-eventhubs' in resource group 'my-resource-group'\"\n- **Clean up consumer group**: \"Delete the consumer group 'test-group' from Event Hub 'user-events' in the 'development-eventhubs' namespace in resource group 'my-resource-group'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Namespace** |  Required | The name of the Event Hubs namespace. |\n| **Event hub** |  Required | The name of the Event Hub within the namespace. |\n| **Consumer group** |  Required | The name of the consumer group within the Event Hub. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Event Hub: Get consumer group\n\n<!-- eventhubs eventhub consumergroup get -->\n\nGet consumer groups from Azure Event Hubs. This tool can:\n\n- List all consumer groups in an Event Hub\n- Get a single consumer group by name\n\nThe event hub and namespace parameters are required for both get and list. You only need the consumer group parameter when getting a specific consumer group.\n\nExample prompts include:\n\n- **List all consumer groups**: \"List all consumer groups in Event Hub 'orders-hub' in namespace 'eventhub-prod' in resource group 'my-resource-group'\"\n- **Get specific consumer group**: \"Get details of consumer group 'analytics-group' from Event Hub 'orders-hub' in namespace 'eventhub-prod' in resource group 'my-resource-group'\"\n- **Show consumer group info**: \"Show me the consumer group 'monitoring-consumers' from Event Hub 'telemetry-events' in namespace 'prod-eventhubs' in resource group 'my-resource-group'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Namespace** |  Required | The name of the Event Hubs namespace. |\n| **Event hub** |  Required | The name of the Event Hub within the namespace. |\n| **Consumer group** |  Optional | The name of the consumer group within the Event Hub. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Event Hub: Create or update consumer group\n\n<!-- eventhubs eventhub consumergroup update -->\n\nCreate or update a consumer group within the specified Event Hub. The tool creates a new consumer group or updates an existing one.\n\nExample prompts include:\n\n- **Create new consumer group**: \"Create a new consumer group 'analytics-group' in Event Hub 'orders-hub' in namespace 'eventhub-prod' in resource group 'my-resource-group'\"\n- **Update existing consumer group**: \"Update the consumer group 'analytics-group' in Event Hub 'orders-hub' in namespace 'eventhub-prod' in resource group 'my-resource-group' with user metadata 'Updated for Q4 analytics'\"\n- **Set up consumer group**: \"Set up a consumer group 'monitoring-consumers' in Event Hub 'telemetry-events' in namespace 'prod-eventhubs' in resource group 'my-resource-group'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Namespace** |  Required | The name of the Event Hubs namespace. |\n| **Event hub** |  Required | The name of the Event Hub within the namespace. |\n| **Consumer group** |  Required | The name of the consumer group within the Event Hub. |\n| **User metadata** |  Optional | User metadata for the consumer group. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Event Hub: Delete Event Hub    \n\n<!-- eventhubs eventhub delete -->\n\nDelete an event hub from an Azure Event Hubs namespace. This action permanently deletes all messages and consumer groups in the Event Hub.\n\nExample prompts include:\n\n- **Delete specific Event Hub**: \"Delete Event Hub 'orders-hub' from namespace 'eventhub-prod' in resource group 'my-resource-group'\"\n- **Remove Event Hub**: \"Remove the Event Hub 'telemetry-events' from my 'prod-eventhubs' namespace in resource group 'my-resource-group'\"\n- **Clean up Event Hub**: \"Delete the Event Hub 'test-events' from namespace 'dev-eventhubs' in resource group 'my-resource-group'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Namespace** |  Required | The name of the Event Hubs namespace. |\n| **Event hub** |  Required | The name of the Event Hub within the namespace. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Event Hub: Get Event Hub\n\n<!-- eventhubs eventhub get -->\n\nGet event hubs from an Azure namespace. This tool:\n\n- List all event hubs in a namespace\n- Get a single event hub by name\n\nWhen you retrieve a single event hub or list multiple event hubs, the command returns detailed information for all event hubs, including partition count, settings, and metadata.\n\nExample prompts include:\n\n- **List all Event Hubs**: \"List all Event Hubs in my 'prod-eventhubs' namespace in resource group 'my-resource-group'\"\n- **Get specific Event Hub**: \"Get the details of my Event Hub 'orders-hub' in namespace 'eventhub-prod' in resource group 'my-resource-group'\"\n- **Show Event Hub info**: \"Show me the Event Hub 'telemetry-events' from namespace 'monitoring-hubs' in resource group 'my-resource-group'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Namespace** |  Required | The name of the Event Hubs namespace. |\n| **Event hub** |  Optional | The name of the Event Hub within the namespace. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Event Hub: Create or update Event Hub\n\n<!-- eventhubs eventhub update -->\n\nCreate or update an Event Hub within an Azure Event Hubs namespace. This command:\n- Creates a new Event Hub if it doesn't exist\n- Updates an existing Event Hub's configuration\n\nYou can configure these properties:\n- Partition count (number of partitions for parallel processing)\n- Message retention time (how long messages are retained, in hours)\n\nSome properties like partition count can't be changed after creation. This is a potentially long-running operation that waits for completion.\n\nExample prompts include:\n\n- **Create new Event Hub**: \"Create a new event hub 'orders-hub' in my namespace 'production-eventhubs' in resource group 'my-resource-group'\"\n- **Update existing Event Hub**: \"Update my event hub 'telemetry-events' in my namespace 'monitoring-hubs' in resource group 'my-resource-group'\"\n- **Create with configuration**: \"Create event hub 'user-activity' in namespace 'analytics-hubs' in resource group 'my-resource-group' with 4 partitions and 24 hours message retention\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Namespace** | Required | The name of the Event Hubs namespace. Must be used with the resource group parameter. |\n| **Event hub** | Required | The name of the Event Hub within the namespace. |\n| **Partition count** | Optional | The number of partitions for the Event Hub. Must be between `1` and `32` (or higher based on namespace tier). |\n| **Message retention in hours** | Optional | The message retention time in hours. Minimum is `1` hour, maximum depends on the namespace tier. |\n| **Status** | Optional | The status of the Event Hub (such as `Active`, `Disabled`). Status might be read-only in some operations. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Namespace: Delete namespace\n\n<!-- eventhubs namespace delete -->\n\nDelete an Event Hubs namespace. This operation is irreversible and permanently deletes all event hubs, consumer groups, and configurations within the namespace.\n\nExample prompts include:\n\n- **Delete specific namespace**: \"Delete event hub namespace 'eventhub-prod' in resource group 'my-resource-group'\"\n- **Remove namespace**: \"Remove the Event Hubs namespace 'test-eventhubs' in resource group 'my-resource-group'\"\n- **Clean up namespace**: \"Delete the namespace 'dev-eventhubs' in resource group 'my-resource-group' permanently\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Namespace** |  Required | The name of the Event Hubs namespace. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Namespace: Get namespace\n\n<!-- eventhubs namespace get -->\n\nGet Event Hubs namespaces from Azure. The behavior depends on which parameters you provide. When you retrieve a single namespace, the tool returns detailed information including SKU, settings, and metadata. When you list namespaces, the tool returns the same detailed information for all namespaces in the specified scope.\n\nExample prompts include:\n\n- **List all namespaces**: \"List all event hub namespaces in my subscription\"\n- **Get specific namespace**: \"Get the details of my namespace 'eventhub-prod' in my resource group 'my-resource-group'\"\n- **Show namespace info**: \"Show me the namespace 'monitoring-hubs' in resource group 'my-resource-group' details\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Optional | The name of the Azure resource group. When omitted, the system lists all namespaces in the subscription. When provided without namespace, the system lists all namespaces in the resource group. Required when getting a specific namespace. |\n| **Namespace** | Optional | The name of the Event Hubs namespace to retrieve. When provided, returns detailed information for the specific namespace (requires resource group). When omitted, returns a list of namespaces. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Namespace: Create or update namespace\n\n<!-- eventhubs namespace update -->\n\nCreate or update a namespace within the specified resource group. This tool creates a new namespace or updates an existing one. The tool might modify existing configurations and is considered destructive. This tool might take a long time.\n\nWhen updating an existing namespace, provide only the properties you want to change. Unspecified properties keep their existing values. You must provide at least one update property.\n\nCommon update scenarios include:\n\n- Scale up or down by changing the SKU tier or capacity\n- Enable or disable auto-inflate and set the maximum throughput units\n- Enable or disable Kafka support\n- Modify tags for resource management\n- Enable or disable zone redundancy (Premium SKU only)\n\nExample prompts include:\n\n- **Create new namespace**: \"Create a new Event Hubs namespace 'production-events' in resource group 'my-resource-group' in East US\"\n- **Update namespace capacity**: \"Update my namespace 'eventhub-prod' in resource group 'my-resource-group' to increase capacity to 10 throughput units\"\n- **Enable Kafka support**: \"Enable Kafka on my Event Hubs namespace 'monitoring-hubs' in resource group 'my-resource-group'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Namespace** |  Required | The name of the Event Hubs namespace. |\n| **Location** |  Optional | The Azure region where the namespace is located (for example, `eastus`, `westus2`). |\n| **SKU name** |  Optional | The SKU name for the namespace. Valid values: `Basic`, `Standard`, `Premium`. |\n| **SKU tier** |  Optional | The SKU tier for the namespace. Valid values: `Basic`, `Standard`, `Premium`. |\n| **SKU capacity** |  Optional | The SKU capacity (throughput units) for the namespace. The valid range depends on the SKU. |\n| **Is auto inflate enabled** |  Optional | Enable or disable auto-inflate for the namespace. |\n| **Maximum throughput units** |  Optional | The maximum throughput units when auto-inflate is enabled. |\n| **Kafka enabled** |  Optional | Enable or disable Kafka for the namespace. |\n| **Zone redundant** |  Optional | Enable or disable zone redundancy for the namespace. |\n| **Tags** |  Optional | Tags for the namespace in JSON format (for example, `{\"key1\":\"value1\",\"key2\":\"value2\"}`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Event Hubs tools](/azure/event-hubs)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-file-shares.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure File Shares\ndescription: Use Azure MCP Server tools to manage Azure File Shares with natural language prompts from your IDE.\nms.date: 04/08/2026\nms.service: azure-mcp-server\nms.topic: concept-article\ntool_count: 14\nmcp-cli.version: 2.0.0-beta.39\nauthor: diberry\nms.author: diberry\nai-usage: ai-generated\nms.custom: build-2025\ncontent_well_notification:\n  - AI-contribution\nreviewer: ankushbindlish2\n---\n\n# Azure MCP Server tools for Azure File Shares\n\nThe Azure Model Context Protocol (MCP) Server lets you manage Azure file shares (`Microsoft.FileShares`) by using natural language prompts. You don't need to remember specific command syntax.\n\n:heavy_check_mark: **Applies to:** File shares created with the `Microsoft.FileShares` resource provider (preview)\n\n:heavy_multiplication_x: **Doesn't apply to:** Classic file shares created with the `Microsoft.Storage` resource provider\n\n[Azure Files](/azure/storage/files/storage-files-introduction) is a managed file sharing service in the cloud. Azure file shares provide high-performance, fully managed storage for your applications and workloads. This article applies only to file shares created with the `Microsoft.FileShares` resource provider (preview), which is currently only available for Network File System (NFS) file shares. It doesn't apply to classic file shares created with the `Microsoft.Storage` resource provider.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get limits\n\n<!-- @mcpcli fileshares limits -->\n\nGet file share limits for a subscription and location.\n\nExample prompts include:\n\n- \"Show me the current file share limits in the 'eastus' location.\"\n- \"What are the file share limits for location 'westeurope?'\"\n- \"Get the file share limits for location 'centralus.'\"\n- \"Provide the file share limits for location 'eastus2.'\"\n- \"Retrieve file share limits for the 'westus' region.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Location** | Required | The Azure region or location name (for example, `eastus`, `westeurope`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get usage\n\n<!-- @mcpcli fileshares usage -->\n\nGet file share usage data for a subscription and location.\n\nExample prompts include:\n\n- \"Show me the usage details for file shares in location 'eastus.'\"\n- \"I want to see usage for file shares in region 'westeurope.'\"\n- \"Get usage statistics for file shares in location 'centralus.'\"\n- \"Can you provide usage information for file shares in 'eastus2?'\"\n- \"Display usage for file shares in the 'westus' region.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Location** | Required | The Azure region or location name (for example, `eastus`, `westeurope`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get recommendations\n\n<!-- @mcpcli fileshares rec -->\n\nGet provisioning parameter recommendations for a file share based on the desired storage size.\n\nExample prompts include:\n\n- \"Get recommendations for a 1,000-GiB file share in location 'eastus.'\"\n- \"Can you provide recommendations for a 500-GiB file share in 'westeurope?'\"\n- \"Get details for a 2,000-GiB file share in location 'centralus.'\"\n- \"I want to see recommendations for a 5,000-GiB file share in 'eastus2.'\"\n- \"Retrieve recommendations for a 250-GiB file share in the 'westus' region.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Location** | Required | The Azure region or location name (for example, `eastus`, `westeurope`). |\n| **Provisioned storage in GiB (gibibytes)** | Required | The desired provisioned storage size of the share in GiB. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## File Share: Check name availability\n\n<!-- @mcpcli fileshares fileshare check-name-availability -->\n\nCheck if a file share name is available in a specific location.\n\nExample prompts include:\n\n- \"Can you check if the file share name 'projectdata' is available in location 'eastus?'\"\n- \"I want to see if 'salesbackup' is an available file share name in 'westeurope.'\"\n- \"Check the availability of the file share name 'teamfiles' in location 'EastUS.'\"\n- \"Is the name 'archive2024' free for a new file share in 'WestUS?'\"\n- \"Verify whether 'clientdocs' can be used as a file share name in location 'centralus.'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Name** | Required | The name of the file share. |\n| **Location** | Required | The Azure region or location name (for example, `EastUS`, `WestEurope`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## File Share: Create file share\n\n<!-- @mcpcli fileshares fileshare create -->\n\nCreate a new Azure file share resource in a resource group. This operation creates a high-performance, fully managed file share accessible through the NFS protocol.\n\nExample prompts include:\n\n- \"Create a new file share named 'project-data' in resource group 'rg-prod' at location 'eastus.'\"\n- \"I need to create a file share called 'backupshare' in resource group 'rg-backup' at location 'westeurope.'\"\n- \"Set up a file share 'userdocs' in resource group 'rg-dev' at location 'centralus.'\"\n- \"Create the file share 'archive2024' in resource group 'rg-archive' at location 'eastus2.'\"\n- \"Generate a file share named 'mediafiles' in resource group 'rg-media' at location 'westus.'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **Name** | Required | The name of the file share. |\n| **Location** | Required | The Azure region or location name (for example, `EastUS`, `WestEurope`). |\n| **Mount name** | Optional | The mount name of the file share as seen by end users. |\n| **Media tier** | Optional | The storage media tier (for example, `SSD`). |\n| **Redundancy** | Optional | The redundancy level (for example, `Local`, `Zone`). |\n| **Protocol** | Optional | The file sharing protocol (for example, `NFS`). |\n| **Provisioned storage in GiB (gibibytes)** | Optional | The desired provisioned storage size of the share in GiB. |\n| **Provisioned io per sec** | Optional | The provisioned IO operations per second. |\n| **Provisioned throughput in MiB per sec (mebibytes)** | Optional | The provisioned throughput in MiB per second. |\n| **Public network access** | Optional | Public network access setting (`Enabled` or `Disabled`). |\n| **NFS root squash** | Optional | NFS root squash setting (`NoRootSquash`, `RootSquash`, or `AllSquash`). |\n| **Allowed subnets** | Optional | Comma-separated list of subnet IDs allowed to access the file share. |\n| **Tags** | Optional | Resource tags as JSON (for example, `{\"key1\":\"value1\",\"key2\":\"value2\"}`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## File Share: Get file share\n\n<!-- @mcpcli fileshares fileshare get -->\n\nGet details of a specific file share or list all file shares. If you provide a name, the command returns a specific file share. Otherwise, it lists all file shares in the subscription or resource group.\n\nExample prompts include:\n\n- \"Show me all file shares in resource group 'rg-prod.'\"\n- \"List every file share available under the resource group 'rg-backup.'\"\n- \"Get details for the file share 'reports2024' in resource group 'rg-production.'\"\n- \"Can you retrieve information on file share 'archive-logs' for resource group 'rg-data.'\"\n- \"I need to see the file share 'projectfiles' from resource group 'rg-dev.'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Optional | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **Name** | Optional | The name of the file share. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## File Share: Update file share\n\n<!-- @mcpcli fileshares fileshare update -->\n\nUpdate an existing Azure file share resource. You can update mutable properties such as provisioned storage, input/output operations per second (IOPS), throughput, and network access settings.\n\nExample prompts include:\n\n- \"Update the file share named 'projectdocs' in resource group 'rg-prod' to modify its quota.\"\n- \"Make changes to the file share 'shareddata' within resource group 'rg-backup' by updating access settings.\"\n- \"Apply new settings to the file share 'datahub' in resource group 'rg-data' to increase throughput.\"\n- \"Change configuration settings for the file share 'prod-share' in resource group 'rg-production.'\"\n- \"I need to update the file share 'reports2024' in resource group 'rg-analytics.'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **Name** | Required | The name of the file share. |\n| **Provisioned storage in GiB (gibibytes)** | Optional | The desired provisioned storage size of the share in GiB. |\n| **Provisioned io per sec** | Optional | The provisioned IO operations per second. |\n| **Provisioned throughput in MiB per sec (mebibytes)** | Optional | The provisioned throughput in MiB per second. |\n| **Public network access** | Optional | Public network access setting (`Enabled` or `Disabled`). |\n| **NFS root squash** | Optional | NFS root squash setting (`NoRootSquash`, `RootSquash`, or `AllSquash`). |\n| **Allowed subnets** | Optional | Comma-separated list of subnet IDs allowed to access the file share. |\n| **Tags** | Optional | Resource tags as JSON (for example, `{\"key1\":\"value1\",\"key2\":\"value2\"}`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## File Share: Delete file share\n\n<!-- @mcpcli fileshares fileshare delete -->\n\nDelete a file share permanently. You can't undo this operation.\n\nExample prompts include:\n\n- \"Delete the file share named 'backup-share' in resource group 'rg-prod.'\"\n- \"Remove the file share 'project-files' in resource group 'rg-marketing.'\"\n- \"I want to delete the file share 'temp-data' in resource group 'rg-dev.'\"\n- \"Can you delete the file share 'archive-old' in resource group 'rg-archive?'\"\n- \"Remove the file share 'cleanup-share' from resource group 'rg-cleanup.'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **Name** | Required | The name of the file share. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Private Endpoint Connection: Get private endpoint connection\n\n<!-- @mcpcli fileshares fileshare peconnection get -->\n\nGet details of a specific private endpoint connection or list all private endpoint connections for a file share. If you provide `connection-name`, the command returns a specific connection. Otherwise, it lists all connections.\n\nExample prompts include:\n\n- \"List all private endpoint connections for file share 'projectfiles' in resource group 'rg-prod.'\"\n- \"Get the private endpoint connection named 'myconnection' for file share 'datashare' in resource group 'rg-data.'\"\n- \"Show me private endpoint connections on file share 'backupshare' in resource group 'rg-backup.'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **File share name** | Required | The name of the file share. |\n| **Connection name** | Optional | The name of the private endpoint connection. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Private Endpoint Connection: Update private endpoint connection\n\n<!-- @mcpcli fileshares fileshare peconnection update -->\n\nUpdate the state of a private endpoint connection for a file share. Use this operation to approve or reject private endpoint connection requests.\n\nExample prompts include:\n\n- \"Approve the private endpoint connection 'myconnection' for file share 'projectfiles' in resource group 'rg-prod.'\"\n- \"Reject the private endpoint connection named 'extconnection' on file share 'datashare' in resource group 'rg-data' with description 'Not authorized.'\"\n- \"Update the private endpoint connection 'pendingconn' to 'Approved' for file share 'backupshare' in resource group 'rg-backup.'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **File share name** | Required | The name of the file share. |\n| **Connection name** | Required | The name of the private endpoint connection. |\n| **Status** | Required | The connection status (`Approved`, `Rejected`, or `Pending`). |\n| **Description** | Optional | Description for the connection state change. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## File Share Snapshot: Create snapshot\n\n<!-- @mcpcli fileshares fileshare snapshot create -->\n\nCreate a snapshot of an Azure file share. Snapshots are read-only point-in-time copies used for backup and recovery.\n\nExample prompts include:\n\n- \"Create a snapshot named 'backup-snap-jan23' for file share 'backups' in resource group 'rg-data-prod'\"\n- \"I want to create a snapshot called 'project-snapshot' for the file share 'projectfiles' in resource group 'rg-marketing'\"\n- \"Generate a snapshot named 'weekly-backup' for file share 'companyshare' in resource group 'rg-finance'\"\n- \"Create a snapshot called 'reports-snapshot' on the file share 'reports' in resource group 'rg-analytics'\"\n- \"Initiate snapshot creation named 'dev-snapshot-01' for file share 'devfiles' in resource group 'rg-development'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **File share name** | Required | The name of the parent file share. |\n| **Snapshot name** | Required | The name of the snapshot. |\n| **Metadata** | Optional | Custom metadata for the snapshot as a JSON object (for example, `{\"key1\":\"value1\",\"key2\":\"value2\"}`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## File Share Snapshot: Get snapshot\n\n<!-- @mcpcli fileshares fileshare snapshot get -->\n\nGet details of a specific file share snapshot or list all snapshots. If you provide the snapshot name, the command returns a specific snapshot. Otherwise, it lists all snapshots for the file share.\n\nExample prompts include:\n\n- \"Show me all snapshots for file share 'projectfileshare' in resource group 'rg-prod.'\"\n- \"List snapshots available on the file share 'teamdata' in resource group 'rg-finance.'\"\n- \"Get the snapshot named 'snapshot20240601' from file share 'backupshare' in resource group 'rg-backup.'\"\n- \"Retrieve details for the snapshot 'dailybackup' on file share 'reports' in resource group 'rg-analytics.'\"\n- \"I need to see the snapshot 'weekendcopy' from file share 'mediafiles' in resource group 'rg-media.'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **File share name** | Required | The name of the parent file share. |\n| **Snapshot name** | Optional | The name of the snapshot. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## File Share Snapshot: Update snapshot\n\n<!-- @mcpcli fileshares fileshare snapshot update -->\n\nUpdate the properties and metadata of an Azure file share snapshot, such as tags or retention policies.\n\nExample prompts include:\n\n- \"Update the snapshot 'backup-snap-jan23' for file share 'backupshare' in resource group 'rg-backup.'\"\n- \"Apply updates to snapshot 'data-snapshot' on file share 'datafiles' in resource group 'rg-data.'\"\n- \"Can you update snapshot 'snapshot2024' for file share 'reports' in resource group 'rg-analytics.'\"\n- \"Update the snapshot named 'endofmonth' on file share 'finance-data' in resource group 'rg-finance.'\"\n- \"Modify the properties of snapshot 'weeklybackup' for file share 'devfileshare' in resource group 'rg-dev.'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **File share name** | Required | The name of the parent file share. |\n| **Snapshot name** | Required | The name of the snapshot. |\n| **Metadata** | Optional | Custom metadata for the snapshot as a JSON object (for example, `{\"key1\":\"value1\",\"key2\":\"value2\"}`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## File share snapshot: Delete snapshot\n\n<!-- @mcpcli fileshares fileshare snapshot delete -->\n\nDelete a file share snapshot permanently. This operation can't be undone.\n\nExample prompts include:\n\n- \"Delete snapshot 'backup-snap-jan15' from file share 'datafiles' in resource group 'rg-prod.'\"\n- \"Remove snapshot 'weekly-backup' from file share 'backupshare' in resource group 'rg-backup.'\"\n- \"Delete snapshot 'snapshot2024-03-15' from file share 'reports' in resource group 'rg-analytics.'\"\n- \"Delete the snapshot 'dailybackup' from file share 'projectfiles' in resource group 'rg-dev.'\"\n- \"Remove snapshot 'weeklysnap' from file share 'archive' in resource group 'rg-archive.'\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **File share name** | Required | The name of the parent file share. |\n| **Snapshot name** | Required | The name of the snapshot. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Files](/azure/storage/files/storage-files-introduction)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-file-sync.md",
    "content": "---\ntitle: Azure File Sync Tools\ndescription: \"Learn how to use Azure MCP Server with Azure File Sync tools to manage storage sync services, sync groups, cloud endpoints, and server endpoints using natural language prompts.\"\nauthor: diberry\nms.author: diberry\nms.date: 01/22/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-generated\nms.topic: concept-article\n--- \n# Azure File Sync Tools\n\nAzure File Sync tools in Azure MCP Server help you manage Azure File Sync services through natural language prompts. You can manage Storage Sync services, register servers, create sync groups, configure cloud endpoints, and set up server endpoints to synchronize files between on-premises servers and Azure File Shares. These tools simplify storage sync management and reduce configuration complexity.\n\n[Azure File Sync](/azure/storage/file-sync) is a service that centralizes an organization's file shares in Azure Files while keeping the flexibility, performance, and compatibility of a Windows file server.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n\n## Storage Sync service: Create service\n\n<!-- @mcpcli storagesync service create -->\n\nCreate a new Azure Storage Sync service resource in a resource group. This service acts as the top-level service container that manages sync groups, registered servers, and synchronization workflows.\n\nExample prompts include:\n\n- \"Create a storage sync service named 'FileSyncService01' in resource group 'rg-storage-sync' at location 'EastUS'\"\n- \"Please set up a storage sync service called 'BackupSyncService' inside 'rg-backup' resource group located in 'WestEurope'\"\n- \"I need a new storage sync service with name 'DataSyncProd' deployed to 'rg-prod-sync' resource group in 'CentralUS'\"\n- \"Can you create a storage sync service named 'ArchiveSync' within resource group 'rg-archive' located at 'NorthEurope'?\"\n- \"Set up storage sync service 'SyncServiceWest' in the resource group 'rg-west-sync' at Azure region 'WestUS2'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Location** |  Required | The Azure region or location name (for example, `EastUS`, `WestEurope`). |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Storage Sync service: Delete service\n\n<!-- @mcpcli storagesync service delete -->\n\nDelete an Azure Storage Sync service and all its associated resources.\n\nExample prompts include:\n\n- \"Delete the storage sync service named 'SyncServiceEastUS' in resource group 'rg-storage-prod'\"\n- \"Can you remove the storage sync service 'FilesSync01' from resource group 'rg-file-sync'?\"\n- \"Please delete storage sync service 'BackupSyncService' located in resource group 'rg-backups'\"\n- \"I need to delete the storage sync service called 'CorporateSync' within resource group 'rg-corp-resources'\"\n- \"Remove the storage sync service 'DataSyncPrimary' from resource group 'rg-data-sync'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Storage Sync service: Get service\n\n<!-- @mcpcli storagesync service get -->\n\nRetrieve Azure Storage Sync service details or list all Storage Sync services. The command shows service properties, location, provisioning state, and configuration. If you provide the resource name parameter, the command returns a specific Storage Sync service. Otherwise, it lists all Storage Sync services in the subscription or resource group.\n\nExample prompts include:\n\n- \"Get details for the storage sync service named 'SyncServiceEastUS'\"\n- \"Can you retrieve info on storage sync service 'CorporateFileSync'?\"\n- \"I need to see the configuration of the service called 'DataSyncProd'\"\n- \"Show me the storage sync service with the name 'BackupSync01'\"\n- \"Fetch the service details for 'SyncServiceWestEurope' storage sync\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Name** |  Optional | The name of the storage sync service. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Storage Sync service: Update service\n\n<!-- @mcpcli storagesync service update -->\n\nUpdate properties of an existing Azure Storage Sync service.\n\nExample prompts include:\n\n- \"Update the storage sync service named 'filesyncservice01' in resource group 'rg-storage-prod'\"\n- \"Can you update the service 'sync-service-eastus' within the resource group 'rg-sync-eastus'?\"\n- \"Please update the storage sync service 'CorpFileSync' located in resource group 'rg-corp-filesync'\"\n- \"Make changes to storage sync service 'ArchiveSyncService' in the resource group 'rg-archive-data'\"\n- \"I need to update the service called 'BackupSync' in resource group 'rg-backup-resources'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Incoming traffic policy** |  Optional | Incoming traffic policy for the service (`AllowAllTraffic` or `AllowVirtualNetworksOnly`). |\n| **Tags** |  Optional | Tags to assign to the service (space-separated key=value pairs). |\n| **Identity type** |  Optional | Managed service identity type (`None`, `SystemAssigned`, `UserAssigned`, `SystemAssigned,UserAssigned`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n\n## Registered server: Get registered server\n\n<!-- @mcpcli storagesync registeredserver get -->\n\nList all registered servers in a Storage Sync service or retrieve details about a specific registered server. The command returns server properties including server ID, registration status, agent version, OS version, and last heartbeat. If you provide the server ID parameter, the command returns a specific registered server. Otherwise, it lists all registered servers in the Storage Sync service.\n\nExample prompts include:\n\n- \"Get details of the registered server for storage sync service 'SyncServiceWest' in resource group 'rg-storage-west'\"\n- \"Show me the registered server for storage sync 'FileSyncService' within resource group 'rg-europe-central'\"\n- \"Retrieve info on the registered server named 'RegisteredServer01' in resource group 'rg-prod-storage' for sync service 'ProdFileSync'\"\n- \"Can you fetch the registered server for the storage sync service 'BackupSync' located in resource group 'rg-backup'\"\n- \"I need the registered server data for storage sync service 'CorpSync' under resource group 'rg-corp-data'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Server ID** |  Optional | The ID/name of the registered server. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Registered server: Unregister registered server\n\n<!-- @mcpcli storagesync registeredserver unregister -->\n\nUnregister a server from a Storage Sync service.\n\n\nExample prompts include:\n\n- \"Unregister the registered server with ID 'server123' from the storage sync service 'SyncServiceWest' in resource group 'rg-storage-sync'\"\n- \"Can you unregister the server named 'server456' from storage sync service 'FileSyncService' within resource group 'prod-storage-rg'?\"\n- \"Please remove the registered server 'backupServer01' from the storage sync service 'DataSyncService' in resource group 'dev-sync-resources'\"\n- \"I need to unregister the server ID 'syncServer789' from the storage sync service called 'MainStorageSync' located in resource group 'rg-sync-apps'\"\n- \"How do I unregister the registered server 'appServer42' from storage sync service 'SyncServiceEast' under resource group 'rg-eastern-storage'?\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Server ID** |  Required | The ID/name of the registered server. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Registered server: Update registered server\n\n<!-- @mcpcli storagesync registeredserver update -->\n\nUpdate properties of a registered server.\n\nExample prompts include:\n\n- \"Update the registered server with ID 'server123' in storage sync service 'SyncServiceOne' within resource group 'rg-sync-prod'\"\n- \"Can you update the registered server named 'serverABC' for storage sync service 'DataSyncService' in resource group 'rg-data-sync'?\"\n- \"Please update the registered server 'server789' in storage sync service 'MySyncService' under resource group 'rg-sync-dev'\"\n- \"I need to update registered server 'server456' in 'SyncServicePrimary' storage sync service located in resource group 'rg-sync-main'\"\n- \"Modify the registered server having ID 'server321' for the storage sync service 'BackupSync' inside resource group 'rg-backup-sync'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Server ID** |  Required | The ID/name of the registered server. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Sync group: Create sync group\n\n<!-- @mcpcli storagesync syncgroup create -->\n\nCreate a sync group within an existing Storage Sync service. Sync groups define a sync topology and contain cloud endpoints (Azure File Shares) and server endpoints (local server paths) that sync together.\n\nExample prompts include:\n\n- \"Create a sync group named 'FinanceSync' in storage sync service 'FinanceSyncService' within resource group 'rg-finance-prod'\"\n- \"I need to create a sync group called 'HRSyncGroup' under storage sync service 'HRDataService' in 'rg-hr-resources'\"\n- \"Set up a sync group with the name 'ProjectSync' for the storage sync service 'ProjectFilesService' inside resource group 'rg-projects-dev'\"\n- \"Can you create a sync group named 'BackupSyncGroup' in 'BackupSyncService' located in resource group 'rg-backup-eastus'?\"\n- \"Make a new sync group 'SalesDataSync' in the storage sync service 'SalesService' under resource group 'rg-sales-central'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Required | The name of the sync group. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Sync group: Delete sync group\n\n<!-- @mcpcli storagesync syncgroup delete -->\n\nRemove a sync group from a Storage Sync service. When you delete a sync group, you also remove all associated cloud endpoints and server endpoints within that group.\n\nExample prompts include:\n\n- \"Delete the sync group named 'filesSyncGroup' in storage sync service 'DataSyncService' within resource group 'rg-storage-prod'\"\n- \"Can you remove sync group 'backupSyncGroup' from storage sync service 'MySyncService' in resource group 'rg-westus'?\"\n- \"Please delete sync group 'archiveSync' under the storage sync service 'ArchiveService' located in resource group 'rg-europe'\"\n- \"Remove the sync group called 'syncGroup01' from 'FastSyncService' inside resource group 'rg-dev-storage'\"\n- \"I want to delete the sync group 'photosSyncGroup' from storage sync service 'PhotoService' in resource group 'rg-photoapp'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Required | The name of the sync group. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Sync group: Get sync group\n\n<!-- @mcpcli storagesync syncgroup get -->\n\nGet details about a specific sync group or list all sync groups. If you provide the sync group name parameter, the command returns a specific sync group. Otherwise, it lists all sync groups in the Storage Sync service.\n\nExample prompts include:\n\n- \"Get the sync group from storage sync service 'SyncServiceWestUS' in resource group 'rg-storage-prod'\"\n- \"Show me the details of storage sync service 'BackupSyncService' located in resource group 'rg-data-archive'\"\n- \"I need to retrieve sync group information from service 'FileSyncServiceEast' within resource group 'rg-enterprise-files'\"\n- \"Can you fetch the sync group data for storage sync service 'CorpSyncService' in 'rg-corp-resources'?\"\n- \"Retrieve the sync group for 'FileShareSync' storage sync service under resource group 'rg-devops-staging'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Optional | The name of the sync group. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n\n\n## Cloud endpoint: Create cloud endpoint \n\n\n<!-- @mcpcli storagesync cloudendpoint create -->\n\nAdd a cloud endpoint to a sync group by connecting an Azure File Share. Cloud endpoints represent the Azure storage side of the sync relationship.\n\nExample prompts include:\n\n- \"Create a cloud endpoint named 'backupEndpoint' in sync group 'filesSync' within storage sync service 'FileSyncService1' and resource group 'rg-data' using storage account resource ID '/subscriptions/12345/resourceGroups/rg-data/providers/Microsoft.Storage/storageAccounts/storageacct01' with Azure file share 'backupshare'\"\n- \"Set up cloud endpoint 'userDocsEndpoint' in sync group 'docSyncGroup' under storage sync service 'UserFilesService' inside resource group 'rg-users', linking to storage account resource ID '/subscriptions/67890/resourceGroups/rg-users/providers/Microsoft.Storage/storageAccounts/usersstorage' and Azure file share 'userdocs'\"\n- \"I need to create a cloud endpoint called 'mediaEndpoint' for sync group 'mediaSync' on service 'MediaSyncService' in resource group 'rg-media', using storage account resource ID '/subscriptions/abcde/resourceGroups/rg-media/providers/Microsoft.Storage/storageAccounts/mediastorage' and the Azure file share 'mediashare1'\"\n- \"Please add cloud endpoint 'logsEndpoint' within sync group 'logSyncGroup' for storage sync service 'LogSyncService' located in resource group 'rg-logs' with storage account resource ID '/subscriptions/54321/resourceGroups/rg-logs/providers/Microsoft.Storage/storageAccounts/logstor' referencing Azure file share 'logfiles'\"\n- \"Create cloud endpoint 'archiveEndpoint' in 'archiveSyncGroup' sync group for the storage sync service named 'ArchiveService' inside resource group 'rg-archive' using storage account resource ID '/subscriptions/98765/resourceGroups/rg-archive/providers/Microsoft.Storage/storageAccounts/archivestorage' and file share 'archivefiles'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Required | The name of the sync group. |\n| **Cloud endpoint name** |  Required | The name of the cloud endpoint. |\n| **Storage account resource ID** |  Required | The resource ID of the Azure storage account. |\n| **Azure file share name** |  Required | The name of the Azure file share. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Cloud endpoint: Delete cloud endpoint\n\n<!-- @mcpcli storagesync cloudendpoint delete -->\n\nDelete a cloud endpoint from a sync group.\n\nExample prompts include:\n\n- \"Delete the cloud endpoint named 'ArchiveEndpoint' in sync group 'SyncGroupAlpha' of storage sync service 'StorageSyncWest' within resource group 'rg-storage-prod'\"\n- \"Can you remove cloud endpoint 'BackupEndpoint01' from sync group 'MainSyncGroup' under storage sync service 'FileSyncService' in resource group 'rg-data-center'?\"\n- \"I need to delete the cloud endpoint 'UserFilesEndpoint' from the sync group 'UserSyncGroup' in the storage sync service 'UserSyncServiceEast' located in resource group 'rg-eastus1'\"\n- \"Please delete cloud endpoint 'LogsStorage' for sync group 'LogSyncGroup' in storage sync service 'LogsSyncService' inside the resource group 'rg-logging-prod'\"\n- \"Remove cloud endpoint 'PhotosEndpoint' in the sync group 'MediaSync' from storage sync service 'MediaSyncService' in resource group 'rg-media-services'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Required | The name of the sync group. |\n| **Cloud endpoint name** |  Required | The name of the cloud endpoint. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Cloud endpoint: Get cloud endpoint\n\n<!-- storagesync cloudendpoint get -->\n\nList all cloud endpoints in a sync group or retrieve details about a specific cloud endpoint. The command returns cloud endpoint properties, including Azure File Share configuration, storage account details, and provisioning state. If you provide the cloud endpoint name parameter, the command returns a specific cloud endpoint. Otherwise, it lists all cloud endpoints in the sync group. \n\nExample prompts include:\n\n- \"Get the cloud endpoint details for sync group 'SyncGroup1' in storage sync service 'StorageSyncEast' within resource group 'rg-storage-sync'\"\n- \"Show me the cloud endpoint info in resource group 'rg-syncservices', storage sync service 'FileSyncService', and sync group 'PrimarySync'\"\n- \"Retrieve cloud endpoint from storage sync service 'BackupSyncService' and sync group 'GroupA' in resource group 'rg-backups'\"\n- \"I need the cloud endpoint for sync group 'DataSync' under storage sync service 'SyncServiceWest' in 'rg-westus-sync'\"\n- \"Fetch cloud endpoint data for sync group 'MainGroup' of storage sync service 'CentralStorageSync' located in resource group 'rg-central-storage'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Required | The name of the sync group. |\n| **Cloud endpoint name** |  Optional | The name of the cloud endpoint. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Cloud endpoint: Trigger change detection\n\n<!-- @mcpcli storagesync cloudendpoint triggerchangedetection -->\n\nTrigger change detection on a cloud endpoint to sync file changes.\n\nExample prompts include:\n\nExample prompts include:\n\n- \"Trigger change detection for cloud endpoint 'endpointOne' in sync group 'SyncGroupA' of storage sync service 'SyncService123' within resource group 'rg-storage-sync'\"\n- \"Can you start the change detection on cloud endpoint 'filesBackup' for sync group 'PrimaryGroup' under storage sync service 'FileSyncService' in resource group 'rg-prod-sync'?\"\n- \"Initiate cloud endpoint change detection named 'BackupEndpoint' in storage sync service 'DataSync' and sync group 'MainSync' within resource group 'rg-data-sync'\"\n- \"I need to trigger the change detection process on cloud endpoint 'archiveEndpoint' under sync group 'GroupOne' of storage sync service 'StorageSync01' located in 'rg-sync-resources'\"\n- \"Please activate change detection for cloud endpoint 'cloudEndpointX' in sync group 'GroupX' for storage sync service 'SyncServiceX' inside resource group 'rg-sync-project'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Required | The name of the sync group. |\n| **Cloud endpoint name** |  Required | The name of the cloud endpoint. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n\n## Server endpoint: Create server endpoint\n\n<!-- @mcpcli storagesync serverendpoint create -->\n\nAdd a server endpoint to a sync group by specifying a local server path to sync. Server endpoints represent the on-premises side of the sync relationship and include cloud tiering configuration.\n\nExample prompts include:\n\n- \"Create a server endpoint named 'syncEndpoint01' in sync group 'filesSyncGroup' using storage sync service 'FileSyncService' within resource group 'rg-storage' with server resource ID '/subscriptions/12345/resourceGroups/rg-storage/providers/Microsoft.StorageSync/registeredServers/server01' and local path 'D:\\Data'\"\n- \"I need to add a server endpoint called 'backupEndpoint' to sync group 'BackupGroup' under storage sync service 'BackupService' in resource group 'rg-backup' using server resource ID '/subscriptions/67890/resourceGroups/rg-backup/providers/Microsoft.StorageSync/registeredServers/serverBackup' with local path 'E:\\Backup'\"\n- \"Set up server endpoint 'MediaSync' for sync group 'MediaGroup' on storage sync service 'MediaSyncService' inside the resource group 'rg-media' specifying server resource ID '/subscriptions/abcde/resourceGroups/rg-media/providers/Microsoft.StorageSync/registeredServers/mediaServer' and local sync path 'C:\\MediaFiles'\"\n- \"Please create a server endpoint named 'LogsEndpoint' in resource group 'rg-logs' using storage sync service 'LogSyncService' with sync group 'LogSync' providing server resource ID '/subscriptions/fghij/resourceGroups/rg-logs/providers/Microsoft.StorageSync/registeredServers/logServer' and local folder 'F:\\Logs'\"\n- \"Can you add server endpoint 'DocsEndpoint' to the sync group 'DocsGroup' in 'DocSyncService' within resource group 'rg-docs'? The server resource ID is '/subscriptions/klmno/resourceGroups/rg-docs/providers/Microsoft.StorageSync/registeredServers/docServer' and the local path is 'G:\\Documents'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Required | The name of the sync group. |\n| **Server endpoint name** |  Required | The name of the server endpoint. |\n| **Server resource ID** |  Required | The resource ID of the registered server. |\n| **Server local path** |  Required | The local folder path on the server for syncing. |\n| **Cloud tiering** |  Optional | Enable cloud tiering on this endpoint. |\n| **Volume free space percent** |  Optional | Volume free space percentage to maintain (1-99, default `20`). |\n| **Tier files older than days** |  Optional | Archive files not accessed for this many days. |\n| **Local cache mode** |  Optional | Local cache mode: `DownloadNewAndModifiedFiles`, `UpdateLocallyCachedFiles`. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Server endpoint: Delete server endpoint\n\n<!-- @mcpcli storagesync serverendpoint delete -->\n\nDelete a server endpoint from a sync group.\n\nExample prompts include:\n\n- \"Delete the server endpoint 'BackupEndpoint01' from sync group 'MainSyncGroup' in storage sync service 'CorpSyncService' within resource group 'rg-data-sync'\"\n- \"Please remove the server endpoint named 'FileServerEndpoint' in sync group 'DocumentsSync' belonging to storage sync service 'FileSyncService' located in resource group 'rg-file-services'\"\n- \"I want to delete server endpoint 'ServerEndpoint3' under sync group 'DailySync' from the storage sync service 'DataSyncPrimary' in resource group 'rg-production-sync'\"\n- \"Can you delete 'FinanceEndpoint' server endpoint from the 'FinanceSyncGroup' sync group at storage sync service 'FinanceDataSync' in resource group 'rg-finance'\"\n- \"Remove the server endpoint 'ArchiveServer01' in sync group 'ArchiveSync' from storage sync service 'ArchiveSyncService' within resource group 'rg-archive-management'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Required | The name of the sync group. |\n| **Server endpoint name** |  Required | The name of the server endpoint. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Server endpoint: Get server endpoint\n\n<!-- @mcpcli storagesync serverendpoint get -->\n\nList all server endpoints in a sync group or retrieve details about a specific server endpoint. The command returns server endpoint properties, including local path, cloud tiering status, sync health, and provisioning state. If you provide the server endpoint name parameter, the command returns a specific server endpoint. Otherwise, it lists all server endpoints in the sync group.\n\nExample prompts include:\n\n- \"Get details of the server endpoint named 'endpoint1' in sync group 'SyncGroupA' from storage sync service 'StorageSync01' within resource group 'rg-storage-sync'\"\n- \"Show me the server endpoint information for sync group 'SyncGroupB' under storage sync service 'FastSync' in resource group 'resource-group-prod'\"\n- \"Retrieve server endpoint data for storage sync service 'CentralSync' and sync group 'SyncMain' located in resource group 'rg-data-sync'\"\n- \"I need to get the server endpoint for sync group 'GroupSyncX' in storage sync service 'SyncServiceX' from resource group 'rg-sync-services'\"\n- \"Please fetch the server endpoint info belonging to sync group 'PrimarySyncGroup' and storage sync service 'SyncServicePro' in resource group 'rg-sync-prod'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Required | The name of the sync group. |\n| **Server endpoint name** |  Optional | The name of the server endpoint. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Server endpoint: Update server endpoint\n\n<!-- @mcpcli storagesync serverendpoint update -->\n\nUpdate properties of a server endpoint.\n\nExample prompts include:\n\n- \"Update the server endpoint 'endpoint01' in sync group 'SyncGroupA' for storage sync service 'SyncServiceX' within resource group 'rg-filesync'\"\n- \"Can you modify server endpoint 'FileServer01' under sync group 'PrimarySync' in storage sync service 'CorpSync' in resource group 'rg-data'?\"\n- \"Please update server endpoint 'BackupEndpoint' on sync group 'BackupGroup' for storage sync service 'StorageSyncProd' located in resource group 'rg-prod-storage'\"\n- \"Set new settings for server endpoint 'EdgeNode' in storage sync service 'SyncServiceEast' sync group 'EastSync' within resource group 'rg-east'\"\n- \"I need to update the server endpoint named 'ArchiveEndpoint' in sync group 'ArchiveSync' of storage sync service 'ArchiveService' inside resource group 'rg-archives'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The name of the storage sync service. |\n| **Sync group name** |  Required | The name of the sync group. |\n| **Server endpoint name** |  Required | The name of the server endpoint. |\n| **Cloud tiering** |  Optional | Enable cloud tiering on this endpoint. |\n| **Volume free space percent** |  Optional | Volume free space percentage to maintain (1-99, default `20`). |\n| **Tier files older than days** |  Optional | Archive files not accessed for this many days. |\n| **Local cache mode** |  Optional | Local cache mode: `DownloadNewAndModifiedFiles`, `UpdateLocallyCachedFiles`. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure File Sync](/azure/storage/file-sync)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-foundry.md",
    "content": "---\ntitle: Azure MCP Server tools for Microsoft Foundry Extensions\ndescription: Use Azure MCP Server tools to manage Microsoft Foundry Extensions resources such as chat completions, text completions, embeddings, and models with natural language prompts from your IDE.\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 03/20/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\ntool_count: 7\nmcp-cli.version: 2.0.0-beta.31\nms.reviewer: zhoujay, xiangyan\n---\n\n# Azure MCP Server tools for Microsoft Foundry Extensions\n\nThe Azure MCP Server lets you manage Microsoft Foundry Extensions resources, including creating chat and text completions, generating embeddings, listing models, and working with knowledge indexes, with natural language prompts.\n\n[Microsoft Foundry](/azure/ai-foundry/) is a platform for deploying and managing custom AI models in Azure. It provides tools and services for training, fine-tuning, deploying, and monitoring AI models in production environments.\n\nWhen connecting to your Microsoft Foundry resource, the Azure MCP Server requires either the **endpoint** or the **resource group** of your Microsoft Foundry resource. For operations that don't require a specific resource, such as listing available models, neither the endpoint nor the resource group is required.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Knowledge: List knowledge indexes\n\n<!-- @mcpcli foundryextensions knowledge index list -->\n\nGet a list of knowledge indexes from Foundry:\n\n- Find knowledge indexes created within Foundry projects.\n- Use these indexes with AI agents for knowledge retrieval and RAG applications.\n- The list updates as you create new indexes or update existing ones.\n\nExample prompts include: \n\n- **View all indexes**: \"Show me all knowledge indexes at endpoint 'https://my-example-resource.services.ai.azure.com/api/projects/my-project'\"\n- **Filter by project**: \"List knowledge indexes at endpoint 'https://my-example-resource.services.ai.azure.com/api/projects/support-bot'\"\n- **Search by name**: \"Find the knowledge index named 'product-faqs' at endpoint 'https://my-example-resource.services.ai.azure.com/api/projects/my-project'\"\n- **Filter by tag**: \"List knowledge indexes tagged with 'security' at endpoint 'https://my-example-resource.services.ai.azure.com/api/projects/my-project'\"\n- **Show index details**: \"Show details for the 'customer-service' knowledge index at endpoint 'https://my-example-resource.services.ai.azure.com/api/projects/my-project'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Endpoint** |  Required | The endpoint URL for the Foundry project or service in the format `https://<resource>.services.ai.azure.com/api/projects/<project-name>`|\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Knowledge: Get index schema\n\n<!-- @mcpcli foundryextensions knowledge index schema -->\n\nGet the detailed schema configuration of a specific knowledge index from Foundry.\n\nThis operation shows you comprehensive information about the structure and configuration of a knowledge index, including field definitions, data types, searchable attributes, and other schema properties. Use this schema information to understand how the index structures and indexes your data for searching.\n\n\nExample prompts include:\n- **View index schema**: \"Show me the schema for knowledge index 'product-facts' at endpoint 'https://my-example-resource.services.ai.azure.com/api/projects/my-project'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Endpoint** |  Required | The endpoint URL for the Foundry project or service in the format `https://<resource>.services.ai.azure.com/api/projects/<project-name>` |\n| **Index** |  Required | The name of the knowledge index. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## OpenAI: Create chat completions\n\n<!-- @mcpcli foundryextensions openai chat-completions-create -->\n\n Create chat completions using Azure OpenAI in Foundry. Send messages to Azure OpenAI chat models deployed in your Foundry resource and receive AI-generated conversational responses. Supports multi-turn conversations with message history, system instructions, and response customization.\n\nExample prompts include:\n\n- **Simple greeting**: \"Create a chat completion with message array '[{\\\"role\\\":\\\"user\\\",\\\"content\\\":\\\"Hello, how are you today?\\\"}]' using deployment 'gpt-35-turbo' on resource 'openai-prod'\"\n- **With system message**: \"Create a chat completion with system message 'You are a helpful assistant' and user message 'Explain quantum computing' using deployment 'gpt-35-turbo' on resource 'openai-west'\"\n- **Control creativity**: \"Generate a chat completion for 'Write a creative story' using deployment 'gpt-4' with temperature 0.8 and max 150 tokens on resource 'ai-central'\"\n- **Deterministic response**: \"Create chat completion with message 'List 5 facts about Mars' using deployment 'gpt-35-turbo' with temperature 0.1 and seed 12345 on resource 'ai-services-prod'\"\n- **Conversation with history**: \"Continue chat completion with messages: system 'You are a coding assistant', user 'How do I create a function in Python?', assistant 'Here's how...', user 'Can you show an example?' using deployment 'gpt-4' on resource 'dev-openai'\"\n- **With penalties for repetition**: \"Create completion for 'Describe the benefits of cloud computing' using deployment 'gpt-35-turbo' with frequency penalty 0.5 and presence penalty 0.3 on resource 'ai-services-main'\"\n- **Streaming response**: \"Generate streaming chat completion for 'Explain machine learning step by step' using deployment 'gpt-4' with stream true on resource 'openai-research'\"\n- **With stop sequences**: \"Create completion for 'Count from 1 to 10' using deployment 'gpt-35-turbo' with stop sequences ['5', 'STOP'] on resource 'ai-test'\"\n- **User tracking**: \"Generate completion for 'What is Azure AI?' using deployment 'gpt-4' with user identifier 'user-123' on resource 'prod-openai'\"\n- **Fine-tuned control**: \"Create chat completion for 'Summarize this article' using deployment 'gpt-35-turbo' with temperature 0.2, top_p 0.9, max tokens 200, and AAD authentication on resource 'secure-ai'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource name** |  Required | The name of the Azure OpenAI resource. |\n| **Deployment** |  Required | The name of the Foundry model deployment. |\n| **Message array** |  Required | Array of messages in the conversation (JSON format). Each message should have `role` and `content` properties. |\n| **Max tokens** |  Optional | The maximum number of tokens to generate in the completion. |\n| **Temperature** |  Optional | Controls randomness in the output. Lower values make it more deterministic. |\n| **Top p** |  Optional | Controls diversity via nucleus sampling (0.0 to 1.0). Default is `1.0`. |\n| **Frequency penalty** |  Optional | Penalizes new tokens based on their frequency (-2.0 to 2.0). Default is `0`. |\n| **Presence penalty** |  Optional | Penalizes new tokens based on presence (-2.0 to 2.0). Default is `0`. |\n| **Stop** |  Optional | Up to 4 sequences where the API will stop generating further tokens. |\n| **Stream** |  Optional | Whether to stream back partial progress. Default is `false`. |\n| **Seed** |  Optional | If specified, the system will make a best effort to sample deterministically. |\n| **User** |  Optional | Optional user identifier for tracking and abuse monitoring. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## OpenAI: Create embeddings\n\n<!-- @mcpcli foundryextensions openai embeddings-create -->\n\nCreate embeddings using Azure OpenAI in Foundry. Generate vector embeddings from text using Azure OpenAI deployments in your Foundry resource for semantic search, similarity comparisons, clustering, or machine learning.\n\nExample prompts include:\n\n- **Basic text embedding**: \"Generate embeddings for the text 'Azure OpenAI Service' using my 'text-embedding-ada-002' deployment in resource group 'my-resource-group'\"\n- **Create vector embeddings**: \"Create vector embeddings for my text using Azure OpenAI with deployment 'text-embedding-3-large' on resource 'ai-services-prod' in resource group 'my-resource-group'\"\n- **Document embedding**: \"Generate embeddings for 'Machine learning revolutionizes data analysis' using deployment 'ada-002' on resource 'embedding-service' in resource group 'my-resource-group'\"\n- **Multiple sentences**: \"Create embeddings for the text 'Cloud computing provides scalable infrastructure. It enables global accessibility.' using my embedding deployment in resource group 'my-resource-group'\"\n- **With user tracking**: \"Generate embeddings for 'Natural language processing applications' using deployment 'text-embedding-3-small' with user identifier 'analytics-team' in resource group 'my-resource-group'\"\n- **Specific dimensions**: \"Create embeddings for 'Artificial intelligence transforms business operations' using deployment 'text-embedding-3-large' with 1536 dimensions on resource 'ai-central' in resource group 'my-resource-group'\"\n- **Base64 format**: \"Generate embeddings for 'Deep learning neural networks' using deployment 'ada-002' with base64 encoding format on resource 'ml-services' in resource group 'my-resource-group'\"\n- **Research text**: \"Create vector embeddings for 'Quantum computing demonstrates computational advantages in specific algorithms' using my text-embedding deployment in resource group 'my-resource-group'\"\n- **Product description**: \"Generate embeddings for 'High-performance laptop with advanced graphics processing unit' using deployment 'text-embedding-3-small' on resource 'product-ai' in resource group 'my-resource-group'\"\n- **Technical documentation**: \"Create embeddings for 'API authentication requires valid credentials and proper authorization headers' using deployment 'ada-002' with float encoding on resource 'docs-embedding' in resource group 'my-resource-group'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Resource name** |  Required | The name of the Azure OpenAI resource. |\n| **Deployment** |  Required | The name of the Foundry model deployment. |\n| **Input text** |  Required | The input text to generate embeddings for. |\n| **User** |  Optional | Optional user identifier for tracking and abuse monitoring. |\n| **Encoding format** |  Optional | The format to return embeddings in (`float` or `base64`). |\n| **Dimensions** |  Optional | The number of dimensions for the embedding output. Only supported in some models. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## OpenAI: Create completions\n\n<!-- @mcpcli foundryextensions openai create-completion -->\n\n Create text completions using Azure OpenAI in Foundry. Send a prompt or question to Azure OpenAI models deployed in your Foundry resource and receive generated text answers. Use this when you need to create completions, get AI-generated content, generate answers to questions, or produce text completions from Azure OpenAI based on any input prompt. Supports customization with temperature and max tokens. \n\nExample prompts include:\n\n- **Basic completion**: \"Create a completion with the prompt 'What is Azure?' using my 'gpt-35-turbo' deployment in resource group 'my-resource-group'\"\n- **With temperature control**: \"Generate text completion for 'Explain machine learning' using deployment 'text-davinci-003' with temperature 0.3 in resource group 'my-resource-group'\"\n- **Limited tokens**: \"Create a completion with prompt 'Write a summary' using my 'gpt-4' deployment with max 100 tokens in resource group 'my-resource-group'\"\n- **Creative writing**: \"Generate completion for 'Tell me a story about AI' using deployment 'gpt-35-turbo' with temperature 0.8 and 200 max tokens in resource group 'my-resource-group'\"\n- **Technical explanation**: \"Create completion with prompt 'How does cloud computing work?' using my OpenAI resource 'ai-services-east' and deployment 'gpt-4' in resource group 'my-resource-group'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group where the AI resource is hosted. |\n| **Resource name** |  Required | The name of the Azure OpenAI resource. |\n| **Deployment** |  Required | The name of the deployment. |\n| **Prompt text** |  Required | The prompt text to send to the completion model. |\n| **Max tokens** |  Optional | The maximum number of tokens to generate in the completion. |\n| **Temperature** |  Optional | Controls randomness in the output. Lower values make it more deterministic. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## OpenAI: List models and deployments\n\n<!-- @mcpcli foundryextensions openai models-list -->\n\nList all available OpenAI models and deployments in an Azure resource. This tool retrieves information about \ndeployed models including model names, versions, capabilities, and deployment status. \n\nExample prompts include:\n\n- **View all models**: \"List all OpenAI models in my 'ai-services-prod' resource in resource group 'my-resource-group'\"\n- **Check deployments**: \"Show me all deployed models and their status in resource 'openai-east' in resource group 'my-resource-group'\"\n- **Production inventory**: \"What models are available in my 'production-openai' resource in resource group 'my-resource-group'?\"\n- **Development check**: \"List all models and deployments in my 'dev-ai-services' resource in resource group 'my-resource-group'\"\n- **Model capabilities**: \"Show me all available OpenAI models with their capabilities in resource 'ai-central' in resource group 'my-resource-group'\"\n- **Deployment status**: \"What's the current status of all deployments in my 'openai-west' resource in resource group 'my-resource-group'?\"\n- **Regional models**: \"List all models available in my 'europe-openai' resource in resource group 'my-resource-group'\"\n- **Service overview**: \"Give me a complete overview of models and deployments in resource 'customer-ai' in resource group 'my-resource-group'\"\n- **Model versions**: \"Show me all model versions available in my 'ai-services-main' resource in resource group 'my-resource-group'\"\n- **Resource audit**: \"I need to audit all OpenAI models and deployments in resource 'enterprise-ai' in resource group 'my-resource-group'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Resource name** |  Required | The name of the Azure OpenAI resource. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Resources: Get Foundry resource\n\n<!-- @mcpcli foundryextensions resource get -->\n\nGet detailed information about Foundry resources, including endpoint URL, \nlocation, SKU, and all deployed models with their configuration. If a specific resource name is provided, \nreturns details for that resource only. If no resource name is provided, lists all Foundry resources \nin the subscription or resource group. \n\nExample prompts include:\n\n- **Get specific resource**: \"Show me details for the 'ai-foundry-prod' Foundry resource including all deployed models\"\n- **List all resources**: \"What Foundry resources do I have in my subscription?\"\n- **Resource with configuration**: \"Get the endpoint URL, location, and SKU information for my 'customer-ai-foundry' foundry resource\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource name** |  Optional | The name of the Azure OpenAI resource. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Microsoft Foundry documentation](/azure/ai-foundry/)\n- [Azure AI services overview](/azure/ai-services/)\n- [Deploy and consume models](/azure/ai-foundry/concepts/deployments-overview)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-functions.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure Functions\ndescription: Use Azure MCP Server tools to manage Azure Functions app resources and generate Azure Functions code with natural language prompts from your IDE.\nkeywords: azure mcp server, azmcp, function apps\nauthor: diberry\nms.author: diberry\nms.date: 04/06/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-generated\nms.topic: concept-article\nms.custom: build-2025\ntool_count: 4\nmcp-cli.version: 2.0.0-beta.39+0410ff6ade5c70a207a8e7c7a7c78be69f7f1d76\nreviewer: manvkaur\nms.reviewer: manvkaur\n---\n\n# Azure MCP Server tools for Azure Functions\n\nThe Azure MCP Server enables you to manage Azure Functions resources by using natural language prompts. You can manage existing function app resources and generate Azure Functions code, including function templates, project scaffolding, and language discovery.\n\nAzure Functions is a serverless compute service for running event-driven code without managing infrastructure. For more information, see [Azure Functions documentation](/azure/azure-functions/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Function app: list or get\n\n<!-- @mcpcli functionapp get -->\n\nGet details for a specific function app or list all function apps in your subscription. Returns information including name, location, status, and app service plan.\n\nExample prompts include:\n\n- \"List all Function Apps in my subscription.\"\n- \"Show me all Function Apps in resource group 'rg-production'.\"\n- \"Retrieve details for the Function App named 'HealthMonitor' in resource group 'rg-production'.\"\n- \"Can you get the configuration of Function App 'DataProcessor' within resource group 'rg-analytics'?\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Function app** |  Optional | The name of the function app. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n\n\n## Functions: get language list\n\n<!-- @mcpcli functions language list -->\n\nThis tool lists supported programming languages for Azure Functions development. It helps you discover available languages, compare language options, and choose a language to start a project. It returns language names, runtime versions, prerequisites, recommended development tools, and init, run, and build commands. Review this information before you use functions project get and functions template get.\n\nExample prompts include:\n\n- \"Which programming languages does Azure Functions support?\"\n- \"Show a side-by-side comparison of all Azure Functions languages.\"\n- \"Which runtime versions are available for Azure Functions?\"\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n\n## Functions: get project get\n\n<!-- @mcpcli functions project get -->\n\nThis tool returns project scaffolding information for a new Azure Functions app. It provides a project structure overview, setup instructions, and a file list that help you initialize a serverless project. The output helps you create the files and folders for the selected programming language.\n\nExample prompts include:\n\n- \"Set up a new Azure Functions project in language 'python'.\"\n- \"Generate the project files for a TypeScript Azure Functions app, language 'typescript'.\"\n- \"Create the boilerplate for a Java Azure Functions app using JDK 21, language 'java'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Language** |  Required | Programming language for the Azure Functions project. Valid values: `python`, `typescript`, `javascript`, `java`, `csharp`, `powershell`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Functions: list or get template\n\n<!-- @mcpcli functions template get -->\n\nList available Azure Functions templates or generate function code. Shows triggers (HTTP, Timer, Blob, EventHub, Durable, MCP triggers, and more), bindings, and serverless function options. Create durable functions, orchestrations, activity functions, or MCP server functions. Supports azd infrastructure with Bicep, Terraform, and ARM templates. Without the template parameter, this tool lists all templates for the specified language. With the template parameter, this tool generates function code using the specified trigger and optional input and output bindings. You specify one trigger and zero or more bindings. Run this tool after you run `functions language list` and `functions project get`.\n\nExample prompts include:\n\n- \"What triggers and bindings are available for Language 'csharp' Azure Functions?\"\n- \"Show me all the Azure Function templates for Language 'python'.\"\n- \"Create a function from template 'TimerTrigger' in Language 'csharp' that runs every 5 minutes.\"\n- \"Show me template 'CosmosDBTrigger' with an output binding in Language 'java'.\"\n- \"I need template 'McpToolTrigger' in Language 'typescript' with runtime version '22'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Language** |  Required | Programming language for the Azure Functions project. Valid values: python, typescript, javascript, java, csharp, powershell. |\n| **Runtime version** |  Optional | Optional runtime version for Java or TypeScript/JavaScript. When provided, template placeholders like {{javaVersion}} or {{nodeVersion}} are replaced automatically. See 'functions language list' for supported versions. |\n| **Template name** |  Optional | Name of the function template to retrieve. Omit to list all available templates for the specified language and valid values of template name. |\n| **Output** |  Optional | Output format. `New` (default) returns all files in a single files list for creating complete projects. `Add` separates files into function files and project files with merge instructions for adding to existing projects. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Functions documentation](/azure/azure-functions/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-grafana.md",
    "content": "---\ntitle: Azure Managed Grafana Tools - Azure MCP Server\ndescription: Learn how to use the Azure MCP Server with Azure Managed Grafana to monitor and visualize your metrics and logs.\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 02/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\n---\n\n# Azure Managed Grafana tools for the Azure MCP Server overview\n\nThe Azure MCP Server allows you to manage Azure resources, including Azure Managed Grafana workspaces using natural language prompts. This enables you to quickly manage your monitoring and visualization resources without remembering complex syntax.\n\n[Azure Managed Grafana](/azure/managed-grafana/) is a fully managed service that offers Grafana dashboards as a service. It enables you to analyze metrics, logs, and traces without having to worry about setting up, maintaining, or scaling the Grafana infrastructure.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## List Grafana workspaces\n\n<!-- grafana list -->\n\nLists all Azure Managed Grafana workspaces in your subscription. This command helps you view and manage your Grafana workspace resources across your Azure environment.\n\nExample prompts include:\n\n- **Show all workspaces**: \"Show me all Grafana workspaces in my subscription\"\n- **List monitoring resources**: \"What Grafana workspaces do I have available?\"\n- **Find visualization dashboards**: \"List all my Azure Managed Grafana resources\"\n- **Check workspace status**: \"Are there any Grafana workspaces in my dev subscription?\"\n- **Dashboard inventory**: \"I need to see all Grafana workspace resources in my account\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Managed Grafana documentation](/azure/managed-grafana/)\n- [Azure Monitor overview](/azure/azure-monitor/overview)\n- [Data visualization in Azure](/azure/architecture/best-practices/monitoring)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-key-vault.md",
    "content": "---\ntitle: Azure Key Vault Tools \ndescription: Learn how to use the Azure MCP Server with Azure Key Vault keys, secrets, and certificates.\nauthor: diberry\nms.author: diberry\nms.reviewer: mbaldwin\nms.date: 02/13/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\nmcp-cli.version: 2.0.0-beta.19+526b8facdd707f352913f84af0195268a22dea6f\n--- \n# Azure Key Vault tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage Azure Key Vault resources, including keys, secrets, and certificates with natural language prompts. You don't need to remember specialized command syntax to manage these resources.\n\n[Azure Key Vault](/azure/key-vault/general/overview) is a cloud service for securely storing and accessing secrets, keys, and certificates. A secret is anything that you want to tightly control access to, such as API keys, passwords, or connection strings.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Administration: Get all managed HSM settings\n\n<!-- keyvault admin settings get -->\n\nRetrieves all Key Vault Managed HSM account settings for a given vault. This includes settings such as purge protection and soft-delete retention days. This tool ONLY applies to Managed HSM vaults.\n\nExample prompts include:\n\n- **Get account settings**:\n  - \"Get the account settings for my managed HSM 'myhsm'\"\n  - \"Show me the account settings for managed HSM 'contoso-hsm'\"\n- **Query a specific setting**: \"What's the value of the 'purgeProtection' setting in my managed HSM with name 'myhsm'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Vault** |  Required | The name of the Key Vault. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Keys: Create key\n\n<!-- keyvault key create -->\n\nThe Azure MCP Server can create a new key in an Azure Key Vault. This operation lets you add cryptographic keys for your applications.\n\nExample prompts include:\n\n- **Create RSA key**: \"Create a new RSA key named 'app-encryption-key' in my key vault 'mykeyvault'\"\n- **Generate EC key**: \"Generate a new EC key called 'signing-key' in key vault 'security-kv'\"\n- **Add encryption key**: \"Add a new 2048-bit RSA key named 'data-key' to key vault 'mykeyvault'\"\n- **Set up signing key**: \"Create an EC key named 'signing-key' for JWT signing in key vault 'mykeyvault'\"\n- **Make new key**: \"Create a P-256 EC key called 'jwt-signing' in my key vault 'api-vault'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Vault** | Required | The name of the Key Vault. |\n| **Key name** | Required | The name of the key to create. |\n| **Key type** | Required | The type of key to create. Supported types: `RSA`, `RSA-HSM`, `EC`, `EC-HSM`, `oct`, `oct-HSM`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Keys: Get or list keys\n\n<!-- keyvault key get -->\n\nThe Azure MCP Server can retrieve details of a specific key or list all keys in an Azure Key Vault. When you provide a key name, it returns details for that specific key. When you omit the key name, it lists all keys in the vault.\n\nExample prompts include:\n\n- **Get key details**: \"Show me details of the 'app-encryption-key' in my 'mykeyvault' Key Vault.\"\n- **View key info**: \"Get information about the 'signing-key' in Key Vault 'security-kv'\"\n- **List all keys**: \"Show me all keys in my 'mykeyvault' Key Vault.\"\n- **View keys**: \"What keys do I have in Key Vault 'security-kv'?\"\n- **Query keys**: \"Show all keys including managed keys in my Key Vault\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Vault** | Required | The name of the Key Vault. |\n| **Key name** | Optional | The name of the key to retrieve. Omit to list all keys. |\n| **Include managed** | Optional | Whether or not to include managed keys when listing. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Secrets: Create secret\n\n<!-- keyvault secret create -->\n\nThe Azure MCP Server can create a new secret in an Azure Key Vault. This operation lets you securely store sensitive information like passwords, API keys, and connection strings. This operation requires [user consent](index.md#user-confirmation-for-sensitive-data).\n\nExample prompts include:\n\n- **Create API secret**: \"Create a secret named 'api-key' with value 'xyz123' in my key vault named 'production-vault'.\"\n- **Store password**: \"Add a secret called 'database-password' with value 'myP@ssw0rd' to key vault 'security-kv'\"\n- **Save connection string**: \"Create a secret 'db-connection' with value 'Server=myserver;Database=mydb' in key vault 'mykeyvault'\"\n- **Add credentials**: \"Store secret 'sp-secret' with value 'abc123def456' in key vault 'api-vault'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Vault** | Required | The name of the Key Vault. |\n| **Secret name** | Required | The name of the secret to create. |\n| **Value** | Required | The value of the secret to store. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ✅ | Local Required: ❌\n\n## Secrets: Get or list secrets\n\n<!-- keyvault secret get -->\n\nThe Azure MCP Server can retrieve a specific secret or list all secrets in a Key Vault. When you provide a secret name, it returns that specific secret value. When you omit the secret name, it lists all secrets in the vault. This operation requires [user consent](index.md#user-confirmation-for-sensitive-data) when retrieving a specific secret value.\n\nExample prompts include:\n\n- **Get specific secret**: \"Retrieve the 'database-connection-string' secret from my 'production-vault' Key Vault.\"\n- **Access API key**: \"Get the 'third-party-api-key' secret from the 'api-secrets' vault\"\n- **List all secrets**: \"Show me all secrets in my 'production-vault' Key Vault.\"\n- **View secrets**: \"What secrets do I have in Key Vault 'api-secrets'?\"\n- **Find secrets**: \"List secrets in my Key Vault 'configuration-kv'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Vault** | Required | The name of the Key Vault. |\n| **Secret name** | Optional | The name of the secret to retrieve. Omit to list all secrets. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ✅ (when retrieving specific secret) | Local Required: ❌\n\n## Certificates: Create certificate\n\n<!-- keyvault certificate create -->\n\nThe Azure MCP Server can create a new certificate in an Azure Key Vault by using the default policy. With this operation, you can generate SSL/TLS certificates for your applications.\n\nExample prompts include:\n\n- **Create SSL certificate**: \"Create a certificate named 'web-ssl-cert' in my key vault 'production-vault'.\"\n- **Generate certificate**: \"Create a new certificate called 'api-tls-cert' in key vault 'security-kv'\"\n- **Add certificate**: \"Generate a certificate 'webapp-cert' for my web application in key vault 'mykeyvault'\"\n- **Set up TLS cert**: \"Create a certificate named 'app-certificate' in key vault 'mykeyvault'\"\n- **Make new cert**: \"Create a certificate called 'service-cert' in key vault 'certificates-vault'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Vault** | Required | The name of the Key Vault. |\n| **Certificate name** | Required | The name of the certificate to create. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Certificates: Get or list certificates\n\n<!-- keyvault certificate get -->\n\nThe Azure MCP Server can retrieve details of a specific certificate or list all certificates in an Azure Key Vault. When you provide a certificate name, it returns details for that specific certificate. When you omit the certificate name, it lists all certificates in the vault.\n\nExample prompts include:\n\n- **Get certificate details**: \"Show me details of the 'web-ssl-cert' certificate in my 'production-vault' Key Vault.\"\n- **View certificate info**: \"Get information about the 'api-tls-cert' certificate in Key Vault 'security-kv'\"\n- **List all certificates**: \"Show me all certificates in my 'production-vault' Key Vault.\"\n- **View certificates**: \"What certificates do I have in Key Vault 'security-kv'?\"\n- **Check certificates**: \"What certificates are available in my 'ssl-vault'?\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Vault** | Required | The name of the Key Vault. |\n| **Certificate name** | Optional | The name of the certificate to retrieve. Omit to list all certificates. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Certificates: Import certificates\n\n<!-- keyvault certificate import -->\n\nImports an existing certificate (PFX or PEM with private key) into an Azure Key Vault without generating\na new certificate or key material. If the certificate is a password-protected PFX, provide a password.\n\nExample prompts include:\n\n- **Import certificate from file**: \"Import the certificate in file '/path/to/cert.pfx' into the key vault 'mykeyvault'.\"\n- **Import certificate with name**: \"Import a certificate into the key vault 'security-kv' using the name 'web-ssl-cert'.\"\n- **Add PFX certificate**: \"Import a PFX certificate from 'C:\\\\certs\\\\api.pfx' into key vault 'api-vault' as 'api-cert'.\"\n- **Import PEM certificate**: \"Import a PEM certificate into my key vault 'prod-vault' named 'prod-cert'.\"\n- **Import password-protected certificate**: \"Import the certificate 'secure.pfx' into key vault 'ssl-vault' with password 'mypassword'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|----------|-------------|\n| **Vault** |  Required | The name of the Key Vault. |\n| **Certificate name** | Required | The name of the certificate as it appears in Key Vault. |\n| **Certificate data or path** | Required | Either the path to a PFX or PEM file, a base64 encoded PFX, or raw PEM text beginning with `-----BEGIN`. |\n| **Password** |  Optional | Password for a protected PFX being imported. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ✅\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Manage Azure Key Vault with Azure MCP Server](../services/azure-mcp-server-for-key-vault.md)\n- [Azure Key Vault documentation](/azure/key-vault/general/overview)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-kubernetes.md",
    "content": "---\ntitle: Azure Kubernetes Service Tools - Azure MCP Server\ndescription: Learn how to use the Azure MCP Server with Azure Kubernetes Service (AKS) to manage your Kubernetes clusters and containers.\nai-usage: ai-assisted\ncontent_well_notification:\n  - AI-contribution\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 12/05/2025\n---\n# Azure Kubernetes Service tools for the Azure MCP Server overview\n\nUse the Azure MCP Server to manage Azure resources, including Azure Kubernetes Service (AKS) clusters, with natural language prompts. You can quickly manage your container workloads without remembering complex syntax.\n\n[Azure Kubernetes Service (AKS)](/azure/aks/intro-kubernetes) is a managed container orchestration service that simplifies Kubernetes deployment and management. AKS provides serverless Kubernetes, integrated CI/CD, and enterprise-grade security and governance. With AKS, you focus on application development instead of infrastructure management.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Cluster: Get cluster details\n\n<!-- aks cluster get -->\n\nGet or list Azure Kubernetes Service (AKS) clusters. If a specific cluster name is provided, that cluster will\nbe retrieved. Otherwise, all clusters are listed in the specified subscription. Returns detailed cluster\ninformation including configuration, network settings, and status.\n\nExample prompts include:\n\n- **Get cluster configuration**: \"Get the configuration of AKS cluster 'production-aks'\"\n- **Cluster details with resource group**: \"Show me the details of AKS cluster 'web-app-cluster' in resource group 'containers-rg'\"\n- **Network configuration**: \"Show me the network configuration for AKS cluster 'ml-workloads'\"\n- **Detailed cluster info**: \"What are the details of my AKS cluster 'dev-kubernetes' in 'development-rg'?\"\n- **List all clusters**: \"List all AKS clusters in my subscription for cluster 'production-aks'\"\n- **Show clusters**: \"Show me Azure Kubernetes Service cluster 'web-app-cluster'\"\n- **Cluster inventory**: \"What is the status of AKS cluster 'dev-kubernetes'?\"\n- **Production environment**: \"Get configuration details for AKS cluster 'prod-aks-001' in resource group 'production'\"\n- **Development setup**: \"Show me the setup of AKS cluster 'staging-aks' in 'staging-resources'\"\n- **Microservices cluster**: \"What's the configuration of AKS cluster 'microservices-cluster' in 'apps-rg'?\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Cluster name** | Required | The name of the AKS cluster to get details for. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Node pool: Get details for a specific node pool\n\n<!-- aks nodepool get -->\n\nGet or list Azure Kubernetes Service (AKS) node pools (agent pools) in a cluster. If a specific node pool name\nis provided, that node pool is retrieved. Otherwise, all node pools are listed in the specified cluster.\nReturns key configuration and status including size, count, OS, mode, autoscaling, and provisioning state.\n\nExample prompts include:\n\n- **Get node pool details**: \"Get details for node pool 'agentpool1' in AKS cluster 'production-aks' in 'containers-rg'\"\n- **Node pool configuration**: \"Show me the configuration for node pool 'spotpool' in AKS cluster 'web-app-cluster' in resource group 'apps-rg'\"\n- **Setup information**: \"What is the setup of node pool 'gpu-pool' for AKS cluster 'ml-workloads' in 'ai-resources'?\"\n- **List all node pools**: \"List node pools for AKS cluster 'dev-kubernetes' in 'development-rg'\"\n- **Show node pool list**: \"Show me the node pool list for AKS cluster 'microservices-cluster' in 'production'\"\n- **Node pool inventory**: \"What node pools do I have for AKS cluster 'analytics-aks' in 'data-rg'?\"\n- **Production node pools**: \"Get details for node pool 'systempool' in AKS cluster 'prod-aks-001' in 'production-rg'\"\n- **User node pools**: \"Show configuration for node pool 'userpool' in AKS cluster 'staging-aks' in 'staging-resources'\"\n- **Specialized pools**: \"What's the setup of node pool 'gpupool' for AKS cluster 'training-cluster' in 'ml-rg'?\"\n- **Scale information**: \"List all node pools with scaling details for AKS cluster 'scalable-apps' in 'compute-rg'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Cluster name** |  Required | AKS cluster name. |\n| **Node pool** |  Required | AKS node pool (agent pool) name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Kubernetes Service documentation](/azure/aks/)\n- [Kubernetes best practices](/azure/aks/best-practices)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-load-testing.md",
    "content": "---\ntitle: Azure Load Testing Tools - Azure MCP Server\ndescription: \"Learn how to use Azure MCP Server with Azure Load Testing to create, run, and analyze performance tests. Get started with load testing tools and natural language commands.\"\nai-usage: ai-assisted\ncontent_well_notification: \n  - AI-contribution\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.reviewer: nishtha\nms.date: 02/18/2026\nms.topic: concept-article\n---\n\n# Azure Load Testing tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage Azure resources, including Azure Load Testing services, using natural language prompts. This feature helps you quickly create and manage load tests without needing to remember complex syntax.\n\n[Azure Load Testing](/azure/load-testing/overview-what-is-azure-load-testing) is a fully managed load testing service that helps you generate high-scale load to identify application performance bottlenecks. With Azure Load Testing, you can stress test your applications and validate performance, scalability, and capacity.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Test: Create test\n\n<!-- loadtesting test create -->\n\nCreates a new load test in Azure Load Testing. Use this command to define and configure a load test for your application.\n\nExample prompts include:\n\n- **Create load test**: \"Create a new load test with test resource 'loadtest-resource' test ID 'api-stress-001' display name 'API Stress Test' description 'Stress testing API endpoints' endpoint 'https://api.example.com' with 100 virtual users for 300 seconds duration and 60 seconds ramp-up time\"\n- **Set up test**: \"Configure load test using test resource 'perf-test' test ID 'cart-load-001' display 'Shopping Cart Load Test' description 'Load test for cart API' endpoint 'https://cart.example.com/api' with 500 virtual users duration 600 seconds ramp-up 120 seconds\"\n- **New performance test**: \"Create load test with test resource 'test-res' test ID 'peak-sim-001' display 'Peak Traffic Simulation' description 'Simulate peak traffic' endpoint 'https://app.example.com' 1000 virtual users 900 seconds duration 180 seconds ramp-up\"\n- **Initialize test**: \"Set up load test with test resource 'ecommerce-test' test ID 'ecom-load-001' display 'E-commerce Load Test' description 'Load test for e-commerce site' endpoint 'https://shop.example.com' 200 virtual users 300 seconds duration 60 seconds ramp-up\"\n- **Test definition**: \"Create test with test resource 'webapp-test' test ID 'web-load-001' display 'Web App Load Test' description 'Concurrent user simulation' endpoint 'https://webapp.example.com' 1000 virtual users 600 seconds duration 120 seconds ramp-up\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Test resource** | Required | The name of the test resource to use. |\n| **Test ID** | Required | A unique identifier for the test. |\n| **Display** | Required | A user-friendly name for the new load test. |\n| **Description** | Required | A description of the test and its purpose. |\n| **Endpoint** | Required | The URL endpoint to test. |\n| **Virtual users** | Required | The number of concurrent virtual users for the load test. |\n| **Duration** | Required | The total duration of the test in seconds. |\n| **Ramp-up time** | Required | The time period over which to gradually increase load to the specified number of virtual users. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Test: Get test details\n\n<!-- loadtesting test get -->\n\nGets details about a specific load test in Azure Load Testing. Use this command to view the configuration and properties of an existing test.\n\n\nExample prompts include:\n\n- **View test details**: \"Show me the configuration of load test with test resource 'loadtest-resource' and test ID 'api-stress-001'\"\n- **Check test setup**: \"Get the details of test resource 'perf-test' with test ID 'peak-load-001' in resource group 'perf-testing'\"\n- **Test configuration**: \"What are the settings for test resource 'prod-test' with test ID 'prod-readiness-001'?\"\n- **Examine test**: \"Let me see the configuration of test resource 'test-res' with test ID 'recent-test-001'\"\n- **Test parameters**: \"Show the parameters for test resource 'db-test' with test ID 'database-benchmark-001'\"\n\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Test resource** | Required | The name of the test resource. |\n| **Test ID** | Required | The unique identifier of the test. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Test resources: List test resources\n\n<!-- loadtesting testresource list -->\n\nLists all test resources in the specified Azure subscription. Use this command to track and manage your load testing resources.\n    \nExample prompts include:\n\n- **List test resources**: \"Show me test resource 'loadtest-resource' in my subscription\"\n- **View available resources**: \"What is test resource 'dev-loadtest' in my dev subscription?\"\n- **Resource inventory**: \"List test resource 'perf-test-resource' in resource group 'performance-testing'\"\n- **Check environment**: \"Show me test resource 'prod-test-resource' we provisioned in our subscription\"\n- **Find resources**: \"Where is test resource 'webapp-test-resource' deployed?\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Test resource** | Required | The name of a specific test resource to filter by. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Test resources: Create test resource\n\n<!-- loadtesting testresource create -->\n\nCreates a test resource in Azure Load Testing. Use this command to set up resources needed for running load tests.\n\nExample prompts include:\n\n- **Create test resource**: \"Create a new test resource 'loadtest-resource' for my load testing in resource group 'load-test-rg'\"\n- **Provision resources**: \"Set up test resource 'perf-test-resource' for my performance testing in subscription 'test-sub'\"\n- **Initialize resource**: \"Create test resource 'api-test-resource' for my 'api-load-test' in resource group 'perf-resources'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Test resource** | Required | A name for the new test resource. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Test runs: Create or update test run\n\n<!-- @mcpcli loadtesting testrun createorupdate -->\n\nCreate or update a load test run execution. This command creates a new test run for a specified test in the load testing resource or updates metadata and display properties of an existing test run. This command doesn't modify the test plan configuration or create a new test/resource; it solely manages test run executions.\n\nWhen creating, it triggers a new test run execution based on the existing test configuration. Use the `testrun ID` to specify the new run identifier. The create operations are NOT idempotent—each call starts a new test run with unique timestamps and execution states. \n\nWhen updating, this command modifies descriptive information (like display name and description) of a completed or in-progress test run for better organization and documentation. Update operations are idempotent, meaning repeated calls with the same values produce the same result. \n\nExample prompts include:\n- \"Create a new test run for the load test with ID 'test-id-123'\"\n- \"Update the display name of test run ID 'testrun-456' to 'Updated Test Run'\"\n- \"I need to create a new load test run for the test ID 'test-id-789'\"\n- \"How can I update the description for test run ID 'testrun-101' to 'New test execution with changes'?\"\n- \"Show me how to create a test run for load test 'test-id-112' with a better display name\"\n\n| Parameter          | Required or optional | Description                                                                 |\n|--------------------|----------------------|-----------------------------------------------------------------------------|\n| **Test ID**        | Required             | The ID of the load test for which you want to fetch the details.           |\n| **Description**    | Optional             | The description for the load test run, providing more context.       |\n| **Display name**   | Optional             | A user-friendly display name to identify the load test run.               |\n| **Old testrun ID** | Optional             | The ID of an existing test run to update. If provided, it triggers a rerun of the specified test run ID. |\n| **Test resource name** | Optional         | The name of the load test resource for which you want to fetch the details. |\n| **Testrun ID**     | Optional             | The ID of the load test run for which you want to fetch the details.       |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n\n## Test runs: Get or list test runs\n\n<!-- @mcpcli loadtesting testrun get -->\n\nRetrieve load test run details by `testrun` ID or list all test runs by `test` ID. This command returns execution details, including status, start and end times, progress, metrics, and artifacts. It doesn't return test configuration or resource details.\n\nExample prompts include:\n- \"Show me all load test runs for test ID `test123`\"\n- \"List all the test runs associated with load test ID `loadtest456`\"\n- \"Get details for load test run ID `testrun789`\"\n- \"What are the results for test run `testrun101` under load test ID `loadtest202`?\"\n- \"Can you fetch the details for test run `testrun303`?\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Test ID** | Optional | The ID of the load test for which you want to fetch the details. |\n| **Test resource name** | Optional | The name of the load test resource for which you want to fetch the details. |\n| **Testrun ID** | Optional | The ID of the load test run for which you want to fetch the details. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Load Testing documentation](/azure/load-testing/)\n- [Create and run a load test](/azure/load-testing/quickstart-create-and-run-load-test)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-managed-lustre.md",
    "content": "---\ntitle: Azure Managed Lustre Tools for Azure MCP Server\ndescription: Learn how to use Azure MCP Server tools with Azure Managed Lustre to manage, create, update, and analyze scalable Lustre file systems for AI and HPC workloads.\nai-usage: ai-assisted\ncontent_well_notification: \n  - AI-contribution\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 02/08/2026\ntool_count: 18\nms.reviewer: wdesalvador\n---\n\n# Azure Managed Lustre tools for Azure MCP Server overview\n\nAzure MCP Server lets you manage Azure resources, including Azure Managed Lustre, using natural language prompts. You can optimize AI and HPC workloads with scalable Lustre file systems.\n\n[Azure Managed Lustre](/azure/azure-managed-lustre/amlfs-overview) is a high-performance, scalable file system built on the open-source Lustre technology and optimized for AI and HPC workloads on Azure. It provides the throughput, parallelism, and low-latency access required for large-scale simulation, model training, and fine-tuning. With [auto-import](/azure/azure-managed-lustre/auto-import) and [auto-export](/azure/azure-managed-lustre/auto-export) features, you can sync data between Azure Blob Storage and your Lustre file system. For one-time data movement, use manual import jobs.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## File system: Create a file system\n\n<!-- managedlustre fs create -->\n\nCreate an Azure Managed Lustre (AMLFS) file system using the specified network, capacity, maintenance window, and availability zone.\n\nExample prompts include:\n\n- **Basic filesystem creation**: \"Create Azure Managed Lustre filesystem 'amlfs-prod-001' in resource group 'my-resource-group' in eastus with SKU 'AMLFS-Durable-Premium-125', size 128 TiB, in subnet '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-rg/providers/Microsoft.Network/virtualNetworks/vnet-001/subnets/subnet-001', zone 1, maintenance on Sunday at 02:00\"\n- **Development environment**: \"Create test filesystem 'dev-amlfs' in resource group 'my-resource-group' in westus2 using 'AMLFS-Durable-Premium-40' SKU with 32-TiB capacity in subnet '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/dev-rg/providers/Microsoft.Network/virtualNetworks/dev-vnet/subnets/amlfs-subnet', availability zone 2, maintenance Wednesday at 14:00\"\n- **Secure filesystem with encryption**: \"Create encrypted filesystem 'secure-amlfs' in resource group 'my-resource-group' in northeurope with 'AMLFS-Durable-Premium-125' SKU, 64-TiB capacity, subnet '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/security-rg/providers/Microsoft.Network/virtualNetworks/secure-vnet/subnets/lustre-subnet', zone 1, maintenance Friday at 23:00, using custom encryption with key vault '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/security-rg/providers/Microsoft.KeyVault/vaults/secure-kv' and key 'https://secure-kv.vault.azure.net/keys/lustre-key/a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p'\"\n- **Budget-optimized setup**: \"Create cost-effective filesystem 'budget-fs' in resource group 'my-resource-group' in eastus2 with 'AMLFS-Durable-Premium-40', 48 TiB, subnet '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/budget-rg/providers/Microsoft.Network/virtualNetworks/budget-vnet/subnets/storage-subnet', zone 1, maintenance Sunday at 05:00\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Name** |  Required | The AMLFS resource name. Must be DNS-friendly (letters, numbers, hyphens). Example: `amlfs-001`. |\n| **Location** |  Required | Azure region/region short name (use Azure location token, lowercase). Examples: `uaenorth`, `swedencentral`, `eastus`. |\n| **SKU** |  Required | The AMLFS SKU. Exact allowed values: `AMLFS-Durable-Premium-40`, `AMLFS-Durable-Premium-125`, `AMLFS-Durable-Premium-250`, `AMLFS-Durable-Premium-500`. |\n| **Size** |  Required | The AMLFS size in TiB as an integer (no unit). Examples: `4`, `12`, `128`. |\n| **Subnet ID** |  Required | Full subnet resource ID. Required format: `/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Network/virtualNetworks/{vnet}/subnets/{subnet}`. Example: `/subscriptions/0000/resourceGroups/my-rg/providers/Microsoft.Network/virtualNetworks/vnet-001/subnets/subnet-001`. |\n| **Zone** |  Required | Availability zone identifier. Use a single digit string matching the region's availability zone labels (for example `1`). Example: `1`. |\n| **Maintenance day** |  Required | Preferred maintenance day. Allowed values: `Monday`, `Tuesday`, `Wednesday`, `Thursday`, `Friday`, `Saturday`, `Sunday`. |\n| **Maintenance time** |  Required | Preferred maintenance time in UTC. Format: `HH:MM` (24-hour). Examples: `00:00`, `23:00`. |\n| **HSM container** |  Optional | Full blob container resource ID for HSM integration. HPC Cache Resource Provider must have before deployment Storage Blob Data Contributor and Storage Account Contributor roles on parent Storage Account. Format: `/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{account}/blobServices/default/containers/{container}`. Example: `/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.Storage/storageAccounts/stacc/blobServices/default/containers/hsm-container`. |\n| **HSM log container** |  Optional | Full blob container resource ID for HSM logging. HPC Cache Resource Provider must have before deployment Storage Blob Data Contributor and Storage Account Contributor roles on parent Storage Account. Same format as HSM container. Example: `/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.Storage/storageAccounts/stacc/blobServices/default/containers/hsm-logs`. |\n| **Import prefix** |  Optional | Optional HSM import prefix (path prefix inside the container starting with `/`). Examples: `'/ingest/'`, `'/archive/2019/'`. |\n| **Root squash mode** |  Optional | Root squash mode. Allowed values: `All`, `RootOnly`, `None`. |\n| **No squash NID list** |  Optional | Comma-separated list of NIDs (network identifiers) not to squash. Example: `'10.0.2.4@tcp;10.0.2.[6-8]@tcp'`. |\n| **Squash UID** |  Optional | Numeric UID to squash root to. Required in case root squash mode isn't `None`. Example: `1000`. |\n| **Squash GID** |  Optional | Numeric GID to squash root to. Required in case root squash mode isn't `None`. Example: `1000`. |\n| **Custom encryption** |  Optional | Enable customer-managed encryption using a Key Vault key. When `true`, key URL and source vault required, with a user-assigned identity already configured for Key Vault key access. |\n| **Key URL** |  Optional | Full Key Vault key URL. Format: `https://{vaultName}.vault.azure.net/keys/{keyName}/{keyVersion}`. Example: `https://kv-amlfs-001.vault.azure.net/keys/key-amlfs-001/a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p`. |\n| **Source vault** |  Optional | Full Key Vault resource ID. Format: `/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{vaultName}`. Example: `/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.KeyVault/vaults/kv-amlfs-001`. |\n| **User assigned identity ID** |  Optional | User-assigned managed identity resource ID (full resource ID) to use for Key Vault access when custom encryption is enabled. The identity must have RBAC role to access the encryption key. Format: `/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{name}`. Example: `/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity1`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## File system: List file systems\n\n<!-- managedlustre fs list -->\n\nGet an inventory of Azure Managed Lustre file systems and check their properties.\n\nExample prompts include:\n\n- **List all file systems**: \"List all Azure Managed Lustre file systems.\"\n- **Show file system details**: \"Get details for filesystem 'lustre-fs-01'.\"\n- **Check file system status**: \"What is the status of filesystem 'lustre-fs-01'?\"\n- **Filter by resource group**: \"List Azure Managed Lustre file systems in resource group 'bigdata-rg'.\"\n- **Filter by size**: \"Show file systems larger than 100 TiB.\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## File system: Calculate required subnet size\n\n<!-- managedlustre fs subnetsize ask -->\n\nCalculates the required subnet size for an Azure Managed Lustre file system, given a SKU, and size. Use this calculation to plan network deployment for AMLFS.\n\nExample prompts include:\n\n- **Basic calculation**: \"What is the required subnet size for filesystem with SKU 'AMLFS-Durable-Premium-125' and size 128 TiB?\"\n- **Small deployment**: \"Calculate subnet size for Azure Managed Lustre filesystem with SKU 'AMLFS-Durable-Premium-250' and size 8 TiB\"\n- **Large scale planning**: \"What subnet size do I need for a 512-TiB filesystem using 'AMLFS-Durable-Premium-500' SKU?\"\n- **Development environment**: \"Calculate required subnet size for test filesystem with 'AMLFS-Durable-Premium-125' SKU and 32-TiB capacity\"\n- **Production planning**: \"What is the subnet size requirement for production filesystem 'prod-amlfs-001' with 256 TiB using 'AMLFS-Durable-Premium-250'?\"\n- **High-performance setup**: \"Calculate subnet requirements for AI training filesystem with 'AMLFS-Durable-Premium-500' and 1,024 TiB\"\n- **Research environment**: \"What subnet size is needed for research filesystem 'ml-data-fs' with SKU 'AMLFS-Durable-Premium-125' and 64 TiB?\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **SKU** |  Required | The AMLFS SKU. Allowed values: `AMLFS-Durable-Premium-40`, `AMLFS-Durable-Premium-125`, `AMLFS-Durable-Premium-250`, `AMLFS-Durable-Premium-500`. |\n| **Size** |  Required | The AMLFS size in tebibytes (TiB). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## File system: Get SKU\n\n<!-- @mcpcli managedlustre fs sku get -->\n\nRetrieves the available Azure Managed Lustre SKU, including increments, bandwidth, scale targets, and zonal support. \n\nExample prompts include: \n\n* **List available SKUs**: \"Show me the available Azure Managed Lustre SKUs.\"\n* **Get SKUs by region**: \"Display the available Azure Managed Lustre SKUs in West Europe.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Location** |  Optional | Azure region. Examples: `uaenorth`, `swedencentral`, `eastus`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## File system: Update a file system\n\n<!-- managedlustre fs update -->\n\nUpdate maintenance window and/or root squash settings of an existing Azure Managed Lustre (AMLFS) file system. Provide either maintenance day and time or root squash fields (`no-squash-nid-list`, `squash-uid`, `squash-gid`). Root squash fields must be provided if root squash isn't None. If updating the maintenance window, both maintenance day and maintenance time should be provided.\n\nExample prompts include:\n\n- **Basic maintenance window update**: \"Update the maintenance window of the Azure Managed Lustre filesystem 'amlfs-prod-001' in resource group 'my-resource-group' to Sunday at 02:00\"\n- **Weekend maintenance schedule**: \"Change maintenance window for filesystem 'hpc-lustre-fs' in resource group 'my-resource-group' to Saturday at 23:00\"\n- **Business hours maintenance**: \"Update Azure Managed Lustre filesystem 'dev-amlfs' in resource group 'my-resource-group' maintenance to Wednesday at 14:30\"\n- **Off-peak scheduling**: \"Set maintenance window for filesystem 'analytics-lustre' in resource group 'my-resource-group' to Monday at 01:00\"\n- **Root squash configuration**: \"Update filesystem 'secure-amlfs' in resource group 'my-resource-group' with root squash mode 'All' and squash UID 1000 and GID 1000 with no squash NID list '10.0.2.4@tcp;10.0.2.[6-8]@tcp'\"\n- **Combined update**: \"Update filesystem 'ml-amlfs' in resource group 'my-resource-group' maintenance to Friday at 03:00 and set root squash mode to 'None'\"\n- **Security hardening**: \"Configure Azure Managed Lustre filesystem 'production-fs' in resource group 'my-resource-group' with no squash NID list '10.0.2.4@tcp;10.0.2.[6-8]@tcp', and squash GID 999\"\n- **Development environment**: \"Update filesystem 'test-lustre' in resource group 'my-resource-group' maintenance window to Thursday at 12:00 for development testing\"\n- **Regional maintenance**: \"Set maintenance schedule for filesystem 'europe-amlfs' in resource group 'my-resource-group' to Tuesday at 04:00 for minimal impact\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. A resource group is a logical container for Azure resources. |\n| **Name** |  Required | The AMLFS resource name. Must be DNS-friendly (letters, numbers, hyphens). Example: `amlfs-001`. |\n| **Maintenance day** |  Optional | Preferred maintenance day. Allowed values: `Monday`, `Tuesday`, `Wednesday`, `Thursday`, `Friday`, `Saturday`, `Sunday`. |\n| **Maintenance time** |  Optional | Preferred maintenance time in UTC. Format: `HH:MM` (24-hour). Examples: `00:00`, `23:00`. |\n| **No squash NID list** |  Optional | Comma-separated list of NIDs (network identifiers) not to squash. Example: `'10.0.2.4@tcp;10.0.2.[6-8]@tcp'`. |\n| **Squash UID** |  Optional | Numeric UID to squash root to. Required in case root squash mode isn't `None`. Example: `1000`. |\n| **Squash GID** |  Optional | Numeric GID to squash root to. Required in case root squash mode isn't `None`. Example: `1000`. |\n| **Root squash mode** |  Optional | Root squash mode. Allowed values: `All`, `RootOnly`, `None`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## File system: Validate subnet size\n\n<!-- managedlustre fs subnetsize validate -->\n\nValidates that the provided subnet can host an Azure Managed Lustre filesystem for the given SKU and size.\n\nExample prompts include:\n\n- **Basic validation**: \"Validate if the network '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-rg/providers/Microsoft.Network/virtualNetworks/vnet-001/subnets/subnet-001' can host Azure Managed Lustre filesystem of size 128 TiB using the SKU 'AMLFS-Durable-Premium-125'\"\n- **Production environment**: \"Check if subnet '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/hpc-rg/providers/Microsoft.Network/virtualNetworks/hpc-vnet/subnets/lustre-subnet' can support AMLFS filesystem of 256 TiB with SKU 'AMLFS-Durable-Premium-250' in eastus\"\n- **Development setup**: \"Validate subnet capacity for Azure Managed Lustre filesystem size 48 TiB using SKU 'AMLFS-Durable-Premium-40' in subnet '/subscriptions/dev-sub/resourceGroups/dev-rg/providers/Microsoft.Network/virtualNetworks/dev-vnet/subnets/amlfs-subnet' in westus2\"\n- **Large scale deployment**: \"Can subnet '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/ai-rg/providers/Microsoft.Network/virtualNetworks/ai-vnet/subnets/storage-subnet' host a 512-TiB Azure Managed Lustre filesystem using 'AMLFS-Durable-Premium-500' SKU in swedencentral?\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **SKU** |  Required | The AMLFS SKU. Exact allowed values: `AMLFS-Durable-Premium-40`, `AMLFS-Durable-Premium-125`, `AMLFS-Durable-Premium-250`, `AMLFS-Durable-Premium-500`. |\n| **Size** |  Required | The AMLFS size in TiB as an integer (no unit). Examples: `4`, `12`, `128`. |\n| **Subnet ID** |  Required | Full subnet resource ID. Required format: `/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Network/virtualNetworks/{vnet}/subnets/{subnet}`. Example: `/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-rg/providers/Microsoft.Network/virtualNetworks/vnet-001/subnets/subnet-001`. |\n| **Location** |  Required | Azure region/region short name (use Azure location token, lowercase). Examples: `uaenorth`, `swedencentral`, `eastus`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n\n## Manual import: Create manual import job\n\n<!-- managedlustre fs blob import create -->\n\nCreates a manual import job for an Azure Managed Lustre filesystem to import files from the linked blob storage container. The import job performs a one-time sync of data from the configured HSM blob container to the Lustre filesystem. Use this job to import specific prefixes or all data from blob storage into the filesystem at a point in time.\n\nExample prompts include:\n\n- \"Create a manual import job for filesystem 'LustreFs01' in resource group 'rg-lustre-prod'.\"\n- \"Start a manual import job on filesystem 'DataLakeFS' in resource group 'rg-data-core'.\"\n- \"Set up a manual import job for filesystem 'ProjectDataFS' within resource group 'rg-analytics'.\"\n- \"Initiate a manual import job on filesystem 'ArchiveFS' specifying the container 'importcontainer' in resource group 'rg-mlustredemo'.\"\n- \"Create a manual import job for filesystem 'TrainingFS' in resource group 'rg-lustre-eastus'.\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Filesystem name** |  Required | The name of the Azure Managed Lustre filesystem. |\n| **Job name** |  Optional | The name of the autoimport job. If not specified, the system generates a timestamped name. |\n| **Conflict resolution mode** |  Optional | Conflict resolution method for the autoimport job. Default: `Skip`. Allowed values: `Fail`, `Skip`, `OverwriteIfDirty`, `OverwriteAlways`. Please reference [Conflict resolution mode](/azure/azure-managed-lustre/blob-integration#conflict-resolution-mode) for a thorough explanation of these resolution modes. |\n| **Import prefixes** |  Optional | Array of blob paths or prefixes to import from blob storage. Default: `/`. Maximum: 100 paths. Examples: `/data`, `/logs`. |\n| **Maximum errors** |  Optional | Total non-conflict-oriented errors (for example, OS errors) that the import job tolerates before exiting with failure. `-1`: infinite. `0`: exit immediately on any error. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Manual import: Get manual import job \n\n<!-- managedlustre fs blob import get -->\n\nGets import job details or lists all import jobs for an Azure Managed Lustre filesystem. If the job name is provided, return details for that specific job. If job name is omitted, return a list of all import jobs for the filesystem.\n\nExample prompts include:\n\n- \"Show me all import jobs for managed Lustre filesystem 'LustreFs01' in resource group 'rg-storageprod'\"\n- \"List every import job in managed Lustre filesystem 'BackupFS' under resource group 'rg-lustre-dev'\"\n- \"Get details for import job 'import123' from filesystem 'DataLakeFS' in resource group 'rg-storageprod'\"\n- \"Retrieve information about import job 'dailybackup' on filesystem 'ArchiveFS' within resource group 'rg-lustre-dev'\"\n- \"Can you show all import jobs linked to managed Lustre filesystem 'ProjectDataFS' in resource group 'rg-storageprod'?\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. A resource group is a logical container for Azure resources. |\n| **Filesystem name** |  Required | The name of the Azure Managed Lustre filesystem. |\n| **Job name** |  Optional | The name of the autoimport job. If not specified, the system generates a timestamped name. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Manual import: Cancel manual import job\n\n<!-- managedlustre fs blob import cancel -->\n\nCancels a running import job for an Azure Managed Lustre filesystem. This stops the import operation and prevents further processing. The job can't be resumed after cancellation.\n\nExample prompts include:\n\n- \"Cancel the import job 'import1234' for filesystem 'LustreFs01' in resource group 'rg-storage-prod'\"\n- \"I need to cancel the fs import job 'backup-sync' on filesystem 'DataLakeFS' in resource group 'rg-lustre-dev'\"\n- \"Cancel the import job with ID 'dailybackup-import' from the managed Lustre filesystem 'ArchiveFS' in resource group 'rg-fileservices'\"\n- \"Stop the fs import job 'import5678' on filesystem 'ProjectDataFS' in resource group 'rg-ml-prod'\"\n- \"Cancel the managed Lustre fs import job named 'weeklysync' on filesystem 'TrainingFS' within resource group 'rg-analytics'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. A resource group is a logical container for Azure resources. |\n| **Filesystem name** |  Required | The name of the Azure Managed Lustre filesystem. |\n| **Job name** |  Required | The name of the autoexport or autoimport job. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n\n## Manual import: Delete manual import job\n\n<!-- managedlustre fs blob import delete -->\n\nDeletes an import job for an Azure Managed Lustre filesystem. This operation removes the job record and history. The job must be completed or cancelled before it can be deleted.\n\nExample prompts include:\n\n- \"Delete the import job 'import123' from filesystem 'LustreFs01' in resource group 'rg-lustre-prod'\"\n- \"Remove the import job 'import456' on filesystem 'DataLakeFS' within resource group 'rg-data-central'\"\n- \"Delete the fs import job with ID 'import789' from filesystem 'ArchiveFS' in resource group 'rg-backup'\"\n- \"Remove fs import job 'importJob42' from filesystem 'ProjectDataFS' under resource group 'rg-analytics'\"\n- \"Delete the import job 'syncJob01' on filesystem 'LustreFsX' within resource group 'rg-cluster-01'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. A resource group is a logical container for Azure resources. |\n| **Filesystem name** |  Required | The name of the Azure Managed Lustre filesystem. |\n| **Job name** |  Required | The name of the autoexport or autoimport job. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Auto-import: Get details of auto-import jobs\n\n<!-- managedlustre fs blob autoimport get -->\n\nGet status, configuration, and progress details of [autoimport](/azure/azure-managed-lustre/auto-import) jobs for an Azure Managed Lustre filesystem. Autoimport jobs sync data from the linked blob storage container to the Lustre filesystem. If you provide a job name, the tool returns details of that specific job. Otherwise, it returns all jobs for the filesystem.\n\nExample prompts include:\n\n- \"Get the autoimport jobs for filesystem 'LustreFs01' in resource group 'rg-storage-prod'\"\n- \"Show me the blob autoimport jobs for filesystem 'archiveLustre' within resource group 'rg-data-lake'\"\n- \"Retrieve autoimport job details of the Managed Lustre filesystem 'fastLustreCompute' in resource group 'rg-hpc-environment'\"\n- \"Can you fetch the autoimport job info for filesystem 'Lustre2024' from resource group 'rg-lustre-main'\"\n- \"I need to get the fs blob autoimport job details for filesystem 'analyticsLustreFS' under resource group 'rg-analytics'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. A resource group is a logical container for Azure resources. |\n| **Filesystem name** |  Required | The name of the Azure Managed Lustre filesystem. |\n| **Job name** |  Optional | The name of the auto export or auto import job. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n\n## Auto-import: Create an auto-import job\n\n<!-- managedlustre fs blob autoimport create -->\n\nCreate an [autoimport](/azure/azure-managed-lustre/auto-import) job to continuously import new or modified files from the linked blob storage container to your Azure Managed Lustre filesystem. The job syncs changes from the configured HSM blob container to the Lustre filesystem, keeping your filesystem updated with changes in blob storage.\n\nExample prompts include:\n\n- \"Create an autoimport job for filesystem 'ProjectDataFS' in resource group 'rg-managedlustre-prod'\"\n- \"Set up a blob autoimport on filesystem 'LustreMainFS' within resource group 'rg-dev-cluster'\"\n- \"I need to create a Managed Lustre autoimport for filesystem 'AnalyticsFS' in resource group 'rg-analytics-eastus'\"\n- \"Start an autoimport for the filesystem named 'ResearchFS' in resource group 'rg-research-lustre'\"\n- \"Establish an autoimport job on filesystem 'FSBackup' under resource group 'rg-backup-westus2'\"\n- \"Create an autoimport job for filesystem 'DataFS' in resource group 'rg-prod' with prefix '/data/incoming' and conflict resolution mode 'OverwriteIfDirty'\"\n- \"Create an autoimport job for filesystem 'trainingLustre01' in resource group 'rg-training-lustre' with prefix '/datasets' and conflict resolution mode 'OverwriteAlways'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | Azure resource group name. |\n| **Filesystem name** |  Required | Azure Managed Lustre filesystem name. |\n| **Job name** |  Optional | Autoimport job name. If you don't specify a name, a timestamped name is generated. |\n| **Conflict resolution mode** |  Optional | Conflict resolution method for the autoimport job. Default: `Skip`. Allowed values: `Fail`, `Skip`, `OverwriteIfDirty`, `OverwriteAlways`. Please reference [Conflict resolution mode](/azure/azure-managed-lustre/blob-integration#conflict-resolution-mode) for a thorough explanation of these resolution modes. |\n| **Autoimport prefixes** |  Optional | Array of blob paths or prefixes to autoimport to the cluster namespace. Default: `/`. Maximum: 100 paths. Example: `/data`, `/logs`. |\n| **Admin status** |  Optional | Administrative status of the autoimport job. `Enable`: job is active. `Disable`: disables the current active autoimport job. Default: `Enable`. Allowed values: `Enable`, `Disable`. |\n| **Enable deletions** |  Optional | Specifies whether to enable deletions during autoimport. This parameter only affects overwrite-dirty mode. Default: `false`. |\n| **Maximum errors** |  Optional | Total non-conflict-oriented errors (for example, OS errors) that the import can tolerate before exiting with failure. `-1`: infinite. `0`: exits immediately on any error. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Auto-import: Cancel an auto-import job\n\n<!-- managedlustre fs blob autoimport cancel -->\n\nCancel a running [autoimport](/azure/azure-managed-lustre/auto-import) job for your Azure Managed Lustre filesystem. This action stops the ongoing sync operation from the linked blob storage container to the Lustre filesystem.\n\nExample prompts include:\n\n- \"Cancel the autoimport job named 'dailySyncJob' on filesystem 'LustreFs01' in resource group 'rg-storage-prod'\"\n- \"I need to stop the job 'autoimportJob42' for filesystem 'ProjectLustre' within 'rg-data-central'\"\n- \"Cancel the autoimport job 'importJobA1' on the Lustre filesystem 'FsBackup2024' in the resource group 'rg-backup'\"\n- \"How do I cancel the job 'nightlyAutoImport' running on filesystem 'fastLustreFs' in resource group 'rg-performance'?\"\n- \"Stop the autoimport job 'urgentSync' on Managed Lustre filesystem 'MainLustreFS' inside resource group 'rg-enterprise'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | Azure resource group name. |\n| **Filesystem name** |  Required | Azure Managed Lustre filesystem name. |\n| **Job name** |  Required | Autoimport job name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Auto-import: Delete an auto-import job\n\n<!-- managedlustre fs blob autoimport delete -->\n\nDelete an [autoimport](/azure/azure-managed-lustre/auto-import) job for your Azure Managed Lustre filesystem. This action permanently removes the job record from the filesystem. Use this tool to clean up completed, failed, or canceled autoimport jobs.\n\nExample prompts include:\n\n- \"Delete the autoimport job named 'importJob123' from filesystem 'LustreFs1' in resource group 'rg-lustre-prod'\"\n- \"Remove autoimport job 'dailySync' for filesystem 'FsData2024' within resource group 'rg-storage-eus'\"\n- \"I want to delete the job 'autoImportApril' from Managed Lustre filesystem 'DataLakeFs' inside resource group 'rg-datalake-west'\"\n- \"Delete the fs blob autoimport job 'syncJob01' on filesystem 'LustreFsX' located in resource group 'rg-cluster-01'\"\n- \"Can you delete the autoimport job 'weekly-import' on filesystem 'LustreMain' under resource group 'rg-enterprise-services'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | Azure resource group name. |\n| **Filesystem name** |  Required | Azure Managed Lustre filesystem name. |\n| **Job name** |  Required | Autoimport job name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Auto-export: Get details of an auto-export job\n\n<!-- managedlustre fs blob autoexport get -->\n\nGet status, configuration, and progress details of [autoexport](/azure/azure-managed-lustre/auto-export) jobs for your Azure Managed Lustre filesystem. Autoexport jobs sync data from the Lustre filesystem to the linked blob storage container. If you provide a job name, the tool returns details of that specific job. Otherwise, it returns all jobs for the filesystem.\n\nExample prompts include:\n\n- \"Get the blob autoexport jobs for filesystem 'LustreFs01' in resource group 'rg-lustre-prod'\"\n- \"Show me the autoexport jobs of the Managed Lustre filesystem named 'AnalyticsFs' within 'rg-data-center'\"\n- \"Retrieve blob autoexport job details for filesystem 'ProjectXFs' in resource group 'rg-projectx'\"\n- \"Can you provide the autoexport job information for the Lustre filesystem 'SalesDataFs' under resource group 'rg-salesapp'?\"\n - \"Can you provide the autoexport job information for the Lustre filesystem 'TrainingDataFs' under resource group 'rg-training'?\"\n- \"I need to see the blob autoexport jobs for 'ArchiveFs' in resource group 'rg-archives'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | Azure resource group name. |\n| **Filesystem name** |  Required | Azure Managed Lustre filesystem name. |\n| **Job name** |  Optional | Auto export job name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Auto-export: Create an auto-export job\n\n<!-- managedlustre fs blob autoexport create -->\n\nCreate an [autoexport](/azure/azure-managed-lustre/auto-export) job to continuously export modified files from your Azure Managed Lustre filesystem to the linked blob storage container. The job syncs changes from the Lustre filesystem to the configured HSM blob container, keeping your blob storage updated with changes in the filesystem.\n\nExample prompts include:\n\n- \"Create an autoexport job for filesystem 'DataLakeFS' in resource group 'rg-lustre-prod'\"\n- \"Set up autoexport on Managed Lustre filesystem 'LustreMain' within resource group 'rg-hpc-cluster'\"\n- \"I need to create a blob autoexport for filesystem 'faststorage' in resource group 'rg-data-analytics'\"\n- \"Deploy a new autoexport task for the Lustre filesystem named 'ArchiveFS' under resource group 'rg-archive'\"\n- \"Initiate autoexport on filesystem 'ResearchFS' located in resource group 'rg-science-projects'\"\n- \"Create an autoexport job for filesystem 'OutputFS' in resource group 'rg-prod' with prefix '/results/processed'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | Azure resource group name. |\n| **Filesystem name** |  Required | Azure Managed Lustre filesystem name. |\n| **Job name** |  Optional | Autoexport job name. If you don't specify a name, a timestamped name is generated. |\n| **Autoexport prefix** |  Optional | Blob path or prefix to autoexport from the cluster namespace. Default: `/`. Note: Only one prefix is supported for autoexport jobs. Example: `/data`. |\n| **Admin status** |  Optional | Administrative status of the autoexport job. `Enable`: job is active. `Disable`: disables the current active autoexport job. Default: `Enable`. Allowed values: `Enable`, `Disable`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Auto-export: Cancel an auto-export job\n\n<!-- managedlustre fs blob autoexport cancel -->\n\nCancel a running [autoexport](/azure/azure-managed-lustre/auto-export) job for your Azure Managed Lustre filesystem. This action stops the ongoing sync operation from the Lustre filesystem to the linked blob storage container.\n\nExample prompts include:\n\n- \"Cancel the autoexport job named 'dailyBackupJob' on filesystem 'lustreProdFs' in resource group 'rg-lustre-apps'\"\n- \"Stop the job 'trainingLustre01-autoexport' for filesystem 'trainingLustre01' in resource group 'rg-training-lustre'\"\n- \"I need to cancel the autoexport job 'weeklySync' from the 'dataLustreFs' filesystem in resource group 'rg-data-services'\"\n- \"How do I cancel the autoexport job called 'exportJob123' on filesystem 'prodLustreFs' within resource group 'rg-production'\"\n- \"Abort the autoexport job 'monthlyExport' on filesystem 'archiveLustre' under resource group 'rg-archive-management'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | Azure resource group name. |\n| **Filesystem name** |  Required | Azure Managed Lustre filesystem name. |\n| **Job name** |  Required | Autoexport job name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Auto-export: Delete an auto-export job\n\n<!-- managedlustre fs blob autoexport delete -->\n\nDelete an [autoexport](/azure/azure-managed-lustre/auto-export) job for your Azure Managed Lustre filesystem. This action permanently removes the job record from the filesystem. Use this tool to clean up completed, failed, or canceled autoexport jobs.\n\nExample prompts include:\n\n- \"Delete the autoexport job 'archiveExportJob' from filesystem 'LustreProdFs' in resource group 'rg-cloud-storage'\"\n- \"Remove autoexport job 'dailyBackup' on filesystem 'LustreFS1' within resource group 'rg-datahub'\"\n- \"Can you delete the job named 'autoExportJob42' for filesystem 'AzureLustreFs' in resource group 'rg-az-lustre'?\"\n- \"Delete autoexport job 'monthlyExport' from the Managed Lustre filesystem 'LustreFsEast' located in resource group 'rg-eastus-lustre'\"\n- \"I need to delete the autoexport job 'exportJob2024' in filesystem 'LustreMain' under resource group 'rg-production-lustre'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | Azure resource group name. |\n| **Filesystem name** |  Required | Azure Managed Lustre filesystem name. |\n| **Job name** |  Required | Auto export job name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Managed Lustre](/azure/azure-managed-lustre/amlfs-overview)\n- [Learn more about autoimport](/azure/azure-managed-lustre/auto-import)\n- [Learn more about autoexport](/azure/azure-managed-lustre/auto-export)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-marketplace.md",
    "content": "---\ntitle: Marketplace Tools - Azure MCP Server\ndescription: Learn how to use the Azure MCP Server with Azure Marketplace to discover and manage marketplace products and offers.\nms.service: azure-mcp-server\nms.date: 12/05/2025\nms.topic: concept-article\nauthor: diberry\nms.author: diberry\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\n---\n\n# Marketplace tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage Azure resources, including Azure Marketplace products, by using natural language prompts. With this capability, you can quickly discover and retrieve information about marketplace offerings without needing to remember complex syntax.\n\n[Azure Marketplace](/azure/marketplace/) is an online store for solutions that are built on or built for Azure. It's designed for IT professionals and developers. The marketplace offers a catalog of applications, services, and solutions from Microsoft and partners that help you accelerate your cloud adoption and digital transformation.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get Marketplace product information\n\n<!-- marketplace product get -->\n\nGet detailed information about a specific product or offer from Azure Marketplace. This operation helps you get comprehensive details about marketplace solutions, including pricing, plans, and availability information for evaluation and procurement decisions.\n\nExample prompts include:\n\n- **Get product details**: \"Show me information about product ID 'microsoft-ads.windows-data-science-vm'\"\n- **Check specific plan**: \"Get marketplace product details for product ID 'canonical.ubuntuserver' with plan ID 'standard-plan'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Product ID** | Required | The unique identifier for the marketplace product you want to retrieve information about. |\n| **Include stop sold plans** | Optional | Whether to include plans that are no longer available for purchase in the results. |\n| **Language** | Optional | The language code for localized product information (for example, `en-us`, `fr-fr`). |\n| **Market** | Optional | The market or region code to get region-specific pricing and availability (for example, `US`, `FR`). |\n| **Lookup offer in tenant level** | Optional | Whether to look up the offer at the tenant level for organization-specific information. |\n| **Plan ID** | Optional | The specific plan identifier within the product to get detailed plan information. |\n| **SKU ID** | Optional | The specific pricing SKU identifier for a specific product variant or configuration. |\n| **Include service instruction templates** | Optional | Whether to include service instruction templates in the response for deployment guidance. |\n| **Pricing audience** | Optional | The target audience for pricing information (for example, `public`, `private`, `government`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## List Marketplace information\n\n<!-- marketplace product list -->\n\nGets and lists all marketplace products (offers) available to a subscription in the Azure Marketplace. Use this tool to search, select, browse, or filter marketplace offers by product name, publisher, pricing, or metadata. Returns information for each product, including display name, publisher details, category, pricing data, and available plans.\n\nExample prompts include:\n\n- **List all products**: \"List all marketplace products available in my subscription\"\n- **Search products**: \"Find marketplace products related to `database`\"\n- **Filter by category**: \"Show marketplace products in the `Analytics` category\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Language** |  Optional | Product language code (for example, `en` for English, `fr` for French). |\n| **Search** |  Optional | Search for products using a short general term (up to 25 characters). |\n| **Filter** |  Optional | OData filter expression to filter results based on ProductSummary properties (for example, `displayName eq 'Azure'`). |\n| **Orderby** |  Optional | OData orderby expression to sort results by ProductSummary fields (for example, `displayName asc` or `popularity desc`). |\n| **Select** |  Optional | OData select expression to choose specific ProductSummary fields to return (for example, `displayName,publisherDisplayName,uniqueProductId`). |\n| **Next cursor** |  Optional | Pagination cursor to retrieve the next page of results. Use the NextPageLink value from a previous response. |\n| **Expand** |  Optional | OData expand expression to include related data in the response (for example, `plans` to include plan details). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Marketplace documentation](/azure/marketplace/)\n- [Find solutions in Azure Marketplace](/marketplace/find-solutions-azure-marketplace)\n- [Azure Marketplace purchasing overview](/marketplace/purchasing-overview)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-mcp-tool.md",
    "content": "---\ntitle: Azure MCP Tools Management\ndescription: Learn how to use the Azure MCP Server to discover and manage available tools.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n--- \n# Azure MCP tools management for the Azure MCP Server overview\n\nThe Azure MCP Server provides tools to discover and manage the available Azure tools within the server. You can list all available tools using natural language prompts without remembering specific command syntax.\n\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## List tools\n\nThe Azure MCP Server can list all available tools and their capabilities. This helps you discover what Azure services and operations you can manage through the MCP server.\n\n**Example prompts** include:\n\n- **List all tools**: \"Show me all available Azure MCP tools\"\n- **Discover capabilities**: \"What tools are available in the Azure MCP server?\"\n- **View tool inventory**: \"List all Azure tools I can use\"\n- **Check available services**: \"What Azure services can I manage with MCP?\"\n- **Find tools**: \"Show me what Azure operations are available\"\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-migrate.md",
    "content": "---\ntitle: Azure Migrate tools for the Azure MCP Server overview\ndescription: Learn about the tools available in Azure Migrate for managing migration planning and request handling as part of the Azure MCP Server.\nms.date: 02/25/2026\nms.reviewer: akrohill\nms.service: azure-mcp-server\nms.topic: concept-article\ntool_count: 2\nmcp-cli.version: 2.0.0-beta.22+b6fc38c7fd6e025a7fd1dff42e49516225cae21b\n---\n\n# Azure Migrate tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage migration planning, guidance retrieval, and request submissions with natural language prompts.\n\nAzure Migrate provides a centralized hub for assessing and migrating on-premises workloads to Azure. For more information, see [Azure Migrate documentation](/azure/migrate/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get guidance for landing zone\n\n<!-- @mcpcli azuremigrate platformlandingzone getguidance -->\n\nGet how-to guidance for modifying, configuring, or customizing an existing Platform Landing Zone. \n\nExample prompts include:\n\n- \"How do I turn off Bastion in my Platform Landing Zone?\"\n- \"Get guidance on changing resource naming prefixes for my Landing Zone.\"\n- \"Show me how to enable DDoS protection for my Platform Landing Zone.\"\n- \"I need instructions to adjust CIDR ranges in my Platform Landing Zone.\"\n- \"What steps do I take to disable the Azure Monitoring Agent in my Platform Landing Zone?\"\n\n| Parameter | Required or optional | Description |\n|-----------|----------------------|-------------|\n| **Scenario** | Required | The modification scenario key. |\n| **Policy name** | Optional | The policy assignment name to look up (for example, `Enable-DDoS-VNET`). Used with `policy-enforcement` or `policy-assignment` scenarios. |\n| **List policies** | Optional | Set to true to list all available policies organized by archetype. Useful for finding the exact policy name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ✅ | Read Only: ❌ | Secret: ❌ | Local Required: ✅\n\n\n## Request platform landing zone\n\n<!-- @mcpcli azuremigrate platformlandingzone request -->\n\nGenerate and download platform landing zone configurations for Azure Migrate projects, update parameters, check existing landing zones, review parameter statuses and create a new Azure Migrate project if one doesn't exist.\n\nExample prompts include:\n\n- \"Check if a platform landing zone exists for Azure Migrate project 'migrate-project-1' in resource group 'rg-prod'.\"\n- \"Update the parameters for the platform landing zone related to 'migrate-project-1' in resource group 'rg-dev'.\"\n- \"Generate the platform landing zone for Azure Migrate project 'migrate-project-2' located in resource group 'rg-test'.\"\n- \"Download the landing zone files for Azure Migrate project 'migrate-project-3' in resource group 'rg-production'.\"\n- \"What is the current status of parameters for Azure Migrate project 'migrate-project-4' in resource group 'rg-staging'?\"\n\n| Parameter                     | Required or Optional | Description                                                                                             |\n|-------------------------------|----------------------|---------------------------------------------------------------------------------------------------------|\n| **Resource group**            | Required             | The name of the Azure resource group. This is a logical container for Azure resources.                  |\n| **Migrate project name**      | Required             | The Azure Migrate project name for Platform Landing Zone generation context.                                           |\n| **Action**                    | Required             | The action to perform: `update` (set parameters), `check` (check existing platform landing zone), `generate` (generate platform landing zone), `download` (get download instructions), `status` (view parameter status), `createmigrateproject` (create a new Azure Migrate project if one doesn't exist, requires location parameter). |\n| **Region type**               | Optional             | The region type for the Platform Landing Zone. Allowed values: `single`, `multi`. |\n| **Firewall type**             | Optional             | The firewall type for the Platform Landing Zone. Allowed values: `azurefirewall`, `nva`. |\n| **Network architecture**      | Optional             | The network architecture for the Platform Landing Zone. Allowed values: `hubspoke`, `vwan`. |\n| **Identity subscription ID**   | Optional             | The Azure subscription ID for the identity management group in the Platform Landing Zone (GUID format). |\n| **Management subscription ID** | Optional             | The Azure subscription ID for the management group in the Platform Landing Zone (GUID format). |\n| **Connectivity subscription ID** | Optional           | The Azure subscription ID for the connectivity group in the Platform Landing Zone (GUID format). |\n| **Regions**                   | Optional             | Comma-separated list of Azure regions for the Platform Landing Zone (for example, `eastus,westus2`). |\n| **Environment name**          | Optional             | The environment name for the Platform Landing Zone. |\n| **Version control system**     | Optional             | The version control system for the Platform Landing Zone. Allowed values: `local`, `github`, `azuredevops`. |\n| **Organization name**         | Optional             | The organization name for the Platform Landing Zone. |\n| **Migrate project resource ID** | Optional           | The full resource ID of the Azure Migrate project for the Platform Landing Zone (alternative to `subscription/resourceGroup/migrateProjectName`).  |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ✅\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Migrate documentation](/azure/migrate/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-monitor.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure Monitor and Workbooks\ndescription: Use Azure MCP Server tools to query Azure Monitor logs and metrics, monitor resource health, and manage Azure Workbooks with natural language prompts from your IDE.\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.date: 04/07/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-generated\nms.topic: concept-article\nms.custom: build-2025\ntool_count for monitor: 16\ntool_count for workbooks: 5\nms.reviewer: diberry, jong\nreviewer: jongio\nmcp-cli.version: 2.0.0-beta.39\n---\n# Azure MCP Server tools for Azure Monitor and Workbooks\n\n\nThe Azure Model Context Protocol (MCP) Server lets you manage Azure Monitor and Workbooks resources with natural language prompts. You can query Log Analytics workspaces, analyze operational data, monitor resource health, retrieve performance metrics, manage availability web tests, orchestrate instrumentation workflows, and manage Azure Monitor workbooks.\n\n[Azure Monitor](/azure/azure-monitor/overview) helps you maximize the availability and performance of your applications and services. It provides a comprehensive solution for collecting, analyzing, and acting on telemetry from your cloud and on-premises environments. \n\nWorkbooks provide a flexible canvas for data analysis and the creation of rich visual reports within the Azure portal. They allow you to tap into multiple data sources from across Azure and combine them into unified interactive experiences. Workbooks let you combine multiple kinds of visualizations and analyses, making them great for freeform exploration. For more information, see [Azure Monitor workbooks documentation](/azure/azure-monitor/visualize/workbooks-overview).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Activity Log: Get activity logs\n\n<!-- @mcpcli monitor activitylog list -->\n\nLists Azure Monitor activity logs for a specified Azure resource for a given number of past hours. This tool helps you understand resource deployment history, configuration changes, and access patterns. It returns activity log events that include timestamp, operation name, status, and caller information. Use the results to investigate failed deployments, unexpected changes, or access issues.\n\nExample prompts include:\n\n- \"List the activity logs for the last '720' hours for resource 'webapp-prod'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource name** |  Required | The name of the Azure resource to retrieve activity logs for. |\n| **Event level** |  Optional | The level of activity logs to retrieve. Valid levels are: `Critical`, `Error`, `Informational`, `Verbose`, `Warning`. If not provided, returns all levels. |\n| **Hours** |  Optional | The number of hours before now to retrieve activity logs for. |\n| **Resource type** |  Optional | The type of the Azure resource (for example, `'Microsoft.Storage/storageAccounts'`). Only provide this if needed to disambiguate between multiple resources with the same name. |\n| **Top** |  Optional | The maximum number of activity logs to retrieve. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Web Tests: Create or update web test\n\n<!-- @mcpcli monitor webtests createorupdate -->\n\nPart of the Model Context Protocol (MCP) tooling, this tool creates or updates a standard web test in Azure Monitor to check endpoint availability. You specify monitoring settings such as the URL, frequency, locations, and expected responses. If the test doesn't exist, this tool creates it; otherwise it updates the existing test with the new settings.\n\nExample prompts include:\n\n- \"Create a new Standard Web Test with webtest resource 'webtest-prod-availability' in resource group 'rg-prod-monitoring' and associate it with AppInsights component '/subscriptions/12345678-1234-1234-1234-123456789abc/resourceGroups/rg-ai/providers/microsoft.insights/components/appinsights-prod'.\"\n- \"Update an existing Standard Web Test for webtest resource 'webtest-prod-availability' in resource group 'rg-prod-monitoring' to link it to AppInsights component '/subscriptions/12345678-1234-1234-1234-123456789abc/resourceGroups/rg-ai/providers/microsoft.insights/components/appinsights-prod'.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. |\n| **Webtest resource** | Required | The name of the Web Test resource to operate on. |\n| **Appinsights component** | Optional | The resource ID of the Application Insights component to associate with the web test. |\n| **Description** | Optional | A brief description of the web test. |\n| **Enabled** | Optional | Whether the web test is enabled. |\n| **Expected status code** | Optional | Expected HTTP status code. |\n| **Follow redirects** | Optional | Whether to follow HTTP redirects. |\n| **Frequency** | Optional | Test frequency in seconds. Supported values: 300, 600, 900. |\n| **Headers** | Optional | HTTP headers to include in the request, as comma-separated KEY=VALUE pairs. |\n| **HTTP verb** | Optional | HTTP method to use, for example get or post. |\n| **Ignore status code** | Optional | Whether to ignore the status code validation. |\n| **Location** | Optional | The location where the web test resource is created. This should match the Application Insights component location. |\n| **Parse requests** | Optional | Whether to parse dependent requests. |\n| **Request body** | Optional | The body to send with the request. |\n| **Request URL** | Optional | The absolute URL to test. |\n| **Retry enabled** | Optional | Whether retries are enabled. |\n| **SSL check** | Optional | Whether to validate SSL certificates. |\n| **SSL lifetime check** | Optional | Number of days to check SSL certificate lifetime. |\n| **Timeout** | Optional | Request timeout in seconds. Supported values: 30, 60, 90, 120. |\n| **Web test name** | Optional | The name of the test within the web test resource. |\n| **Webtest locations** | Optional | Comma-separated list of locations to run the test from. Location refers to the geo-location population tag for Availability Tests. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Web Tests: Get web test\n\n<!-- @mcpcli monitor webtests get -->\n\nThis tool gets details for a specific web test or lists all web tests. When you specify the Webtest resource, this tool returns detailed information for that web test. When you don't specify the Webtest resource, this tool returns a list of all web tests in the subscription, and you can filter the list by resource group.\n\nExample prompts include:\n\n- \"Get Web Test details for webtest resource 'webtest-prod' in my subscription in resource group 'rg-monitoring'.\"\n- \"List all Web Test resources in my subscription.\"\n- \"List all Web Test resources in my subscription in resource group 'rg-prod'.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Webtest resource** | Optional | The name of the Web Test resource to operate on. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Log Analytics: List workspaces\n\n<!-- @mcpcli monitor workspace list -->\n\nThis tool lists Log Analytics workspaces in a subscription. It retrieves each workspace's name, ID, location, and other key properties. You can use it to identify workspaces before you query their logs or examine workspace settings.\n\nExample prompts include:\n\n- \"List Log Analytics workspaces in my subscription.\"\n- \"Display my Log Analytics workspaces.\"\n- \"Get the Log Analytics workspaces in my subscription.\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Log Analytics: List tables\n\n<!-- @mcpcli monitor table list -->\n\nThis tool lists all tables in a Log Analytics workspace. For example, list tables in workspace 'prod-law' in resource group 'rg-monitoring' to preview available columns and data types. It returns table names and schemas you use to build Kusto Query Language (KQL) queries. You can filter by table type, for example `CustomLog` or `AzureMetrics`.\n\nExample prompts include:\n\n- \"List all tables in Log Analytics workspace 'prod-law' of table type 'CustomLog' in resource group 'rg-prod'.\"\n- \"Show me tables of table type 'AzureMetrics' for workspace 'f1b2c3d4-5678-90ab-cdef-1234567890ab' in resource group 'rg-monitoring'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Workspace name** | Optional | The Log Analytics workspace ID or name. This can be either the unique identifier (GUID) or the display name of your workspace. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Log Analytics: Get table types\n\n<!-- @mcpcli monitor table type list -->\n\nThis Model Context Protocol (MCP) tool lists available table types in an Azure Log Analytics workspace. It returns the names of the table types. You can use those names when you write queries against Azure Monitor Logs.\n\nExample prompts include:\n\n- \"List all available table types in Log Analytics workspace name 'prod-law-01' in resource group 'rg-prod'.\"\n- \"What table types are available in Log Analytics workspace name 'analytics-workspace' in resource group 'rg-logs'?\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group that contains the workspace. |\n| **Workspace name** | Required | The name or ID of the Log Analytics workspace. You can use the workspace GUID or the display name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Log Analytics: Query workspace logs\n\n<!-- @mcpcli monitor workspace log query -->\n\nQuery logs across an entire Log Analytics workspace using Kusto Query Language (KQL). This tool runs workspace-wide queries that return logs across all resources and tables in the workspace. This tool is part of the Model Context Protocol (MCP) tools. For example, you can ask: 'show all errors in my workspace', 'what happened in my workspace in the last 24 hours', 'list failed requests across the workspace'.\n\nExample prompts include:\n\n- \"Show logs with query 'errors' from table 'Syslog' in Log Analytics workspace 'my-workspace' in resource group 'rg-prod'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Query** | Required | The Kusto Query Language (KQL) query to run against the Log Analytics workspace. You can use predefined queries by name: `recent` shows the most recent logs, ordered by TimeGenerated; `errors` shows error-level logs, ordered by TimeGenerated. Or, provide a custom KQL query. |\n| **Resource group** | Required | The name of the Azure resource group that contains the workspace. |\n| **Table name** | Required | The name of the table to query within the workspace. |\n| **Workspace name** | Required | The Log Analytics workspace ID or name. You can provide either the globally unique identifier (GUID) or the display name of the workspace. |\n| **Hours** | Optional | The number of hours to query back from now. |\n| **Limit** | Optional | The maximum number of results to return. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Log Analytics: Query resource logs\n\n<!-- @mcpcli monitor resource log query -->\n\nQuery diagnostic and activity logs for a specific Azure resource in a Log Analytics workspace by using Kusto Query Language (KQL). This tool filters results to the specified resource and runs the provided KQL query against the chosen table. For example, ask \"Show logs for resource 'app-monitor' for the last 24 hours.\"\n\nExample prompts include:\n\n- \"Show logs with query 'recent' for resource ID '/subscriptions/12345678-1234-1234-1234-123456789012/resourceGroups/rg-prod/providers/Microsoft.Compute/virtualMachines/my-vm' in table 'AzureDiagnostics'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Query** | Required | The KQL query to execute against the Log Analytics workspace. You can use predefined queries by name: `recent` shows the most recent logs ordered by TimeGenerated; `errors` shows error-level logs ordered by TimeGenerated. Otherwise, provide a custom KQL query. |\n| **Resource ID** | Required | The Azure Resource ID of the resource to query. Example: /subscriptions/&lt;sub&gt;/resourceGroups/&lt;rg&gt;/providers/Microsoft.OperationalInsights/workspaces/&lt;ws&gt;. |\n| **Table name** | Required | The name of the table to query within the workspace. |\n| **Hours** | Optional | The number of hours to query back from now. |\n| **Limit** | Optional | The maximum number of results to return. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Health: Get entity health\n\n<!-- @mcpcli monitor healthmodels entity get -->\n\nThis tool retrieves the health status and recent health events for a specific entity in an Azure Monitor health model. The Model Context Protocol (MCP) tool reports application-level health based on custom health models, not basic resource availability. For basic resource availability, use Azure Resource Health or the `azmcp_resourcehealth_availability-status_get` tool. To query logs in a Log Analytics workspace, use `azmcp_monitor_workspace_log_query`. To query logs for a specific Azure resource, use `azmcp_monitor_resource_log_query`.\n\nExample prompts include:\n\n- \"Show me the health status of entity 'order-service' using the health model 'app-health-v1' in resource group 'rg-prod'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Entity name** | Required | The entity to get health for. |\n| **Health model** | Required | The name of the health model for which to get the health. |\n| **Resource group** | Required | The name of the Azure resource group. This resource group is a logical container for Azure resources. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Metrics: Query metrics\n\n<!-- @mcpcli monitor metrics query -->\n\nQuery Azure Monitor metrics for a resource. This tool returns time series data for the specified metrics, helping you analyze resource performance and availability. This tool is part of the Model Context Protocol (MCP) tools.\n\nExample prompts include:\n\n- \"Analyze performance trends and response times for Application Insights resource 'appinsights-prod' with metrics 'requests/duration' and metric namespace 'microsoft.insights/components'.\"\n- \"Check the availability metric 'availabilityResults/availabilityPercentage' for Application Insights resource 'appinsights-staging' using metric namespace 'microsoft.insights/components'?\"\n- \"Get the metric 'requests/duration' with aggregation 'Average' and interval 'PT1M' for resource 'appinsights-prod' using metric namespace 'microsoft.insights/components'.\"\n- \"Investigate error rates and failed requests for Application Insights resource 'appinsights-prod' using metrics 'requests/failed,exceptions/count' and metric namespace 'microsoft.insights/components'.\"\n- \"Query the metric 'requests/count' for resource type 'Microsoft.Insights/components' resource 'appinsights-qa' with metric namespace 'microsoft.insights/components' and interval 'PT5M'.\"\n- \"What's the requests per second rate using metric 'requests/count' with aggregation 'Count' for Application Insights resource 'appinsights-prod' and metric namespace 'microsoft.insights/components'?\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Metric names** | Required | The names of metrics to query, comma-separated. |\n| **Metric namespace** | Required | The metric namespace to query. Obtain this value from the azmcp-monitor-metrics-definitions tool. |\n| **Resource name** | Required | The name of the Azure resource to query metrics for. |\n| **Aggregation** | Optional | The aggregation type to use, such as Average, Maximum, Minimum, Total, or Count. |\n| **End time** | Optional | The end time for the query in ISO format (for example, `2023-01-01T00:00:00Z`). Defaults to now. |\n| **Filter** | Optional | The OData filter to apply to the metrics query. |\n| **Interval** | Optional | The time interval for data points (for example, `PT1H` for 1 hour, `PT5M` for 5 minutes). |\n| **Max buckets** | Optional | The maximum number of time buckets to return. Defaults to 50. |\n| **Resource type** | Optional | The Azure resource type (for example, `Microsoft.Storage/storageAccounts`, `Microsoft.Compute/virtualMachines`). If not specified, the tool attempts to infer the type from the resource name. |\n| **Start time** | Optional | The start time for the query in ISO format (for example, `2023-01-01T00:00:00Z`). Defaults to 24 hours ago. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Metrics: List metric definitions\n\n<!-- @mcpcli monitor metrics definitions -->\n\nThis tool lists metric definitions for an Azure resource. It returns metadata about each metric, including namespaces, descriptions, and aggregation types, so you can determine which metrics to query for a resource.\n\nExample prompts include:\n\n- \"Get metric definitions for resource name 'app-insights-prod'.\"\n- \"List metric definitions for resource name 'mystorageacct' with resource type 'Microsoft.Storage/storageAccounts' and metric namespace 'Storage'.\"\n- \"Show metric definitions for resource name 'vm-prod-01' with search string 'cpu' and limit '20'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource name** | Required | The name of the Azure resource to query metrics for. |\n| **Limit** | Optional | The maximum number of metric definitions to return. Defaults to 10. |\n| **Metric namespace** | Optional | The metric namespace to query. Obtain this value from the azmcp-monitor-metrics-definitions tool. |\n| **Resource type** | Optional | The Azure resource type (for example, `Microsoft.Storage/storageAccounts`, `Microsoft.Compute/virtualMachines`). If you don't specify it, the tool attempts to infer the resource type from the resource name. |\n| **Search string** | Optional | A string to filter the metric definitions. The filter performs case-insensitive matching on metric name and description. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Instrumentation: Get learning resource\n\n<!-- @mcpcli monitor instrumentation get-learning-resource -->\n\nThis tool lists all available learning resources for Azure Monitor instrumentation, or it retrieves the content of a specific resource by path. By default, the tool returns all resource paths. If you specify a path, the tool returns the full resource content. To instrument an application, use the orchestrator-start tool.\n\nExample prompts include:\n\n- \"Get the onboarding learning resource at path 'onboarding/get-started.md'.\"\n- \"Show me the content of the Azure Monitor onboarding learning resource at path 'onboarding/quickstart.md'.\"\n- \"Retrieve the content of the Azure Monitor learning resource file at path 'samples/instrumentation-guide.html'.\"\n- \"List all Azure Monitor onboarding learning resources.\"\n- \"Show me all learning resource paths for Azure Monitor instrumentation.\"\n- \"Which learning resources are available for Azure Monitor instrumentation onboarding?\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Path** | Optional | Learning resource path. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ✅\n\n## Instrumentation: Start orchestration\n\n<!-- @mcpcli monitor instrumentation orchestrator-start -->\n\nStart here for Model Context Protocol (MCP) tools that instrument Azure Monitor. This tool analyzes the workspace and returns the first action to execute. After you execute the action, call orchestrator-next to continue. Follow the action in the `instruction` field exactly.\n\nExample prompts include:\n\n- \"Start Azure Monitor instrumentation orchestration for workspace path '/home/dev/workspace-monitoring'.\"\n- \"Analyze workspace path '/src/projects/my-app-workspace' and return the first Azure Monitor instrumentation step.\"\n- \"Begin guided Azure Monitor onboarding for project at workspace path '/workspace/my-app' and give me step one.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Workspace path** | Required | Absolute path to the workspace folder. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ✅\n\n## Instrumentation: Continue orchestration\n\n<!-- @mcpcli monitor instrumentation orchestrator-next -->\n\nGet the next instrumentation action after you complete the current one.\n\nThis tool is part of the Model Context Protocol (MCP) suite.\n\nAfter you execute the exact `instruction` from the previous response, run this tool to receive the next action.\n\nExpected workflow:\n1. You receive an action from orchestrator-start or orchestrator-next.\n1. You execute the `instruction` field exactly.\n1. You run this tool with a concise `Completion note` to get the next action.\n\nReturns: The next action to execute, or `complete` status when all steps are done.\n\nExample prompts include:\n\n- \"After completing the previous Azure Monitor instrumentation step, get the next action for session ID 'session-abc123' with completion note 'Added UseAzureMonitor() to Program.cs'.\"\n- \"Get the next onboarding action for session ID 'workspace/session-2026' with completion note 'Ran dotnet add package Microsoft.ApplicationInsights'.\"\n- \"After finishing the previous instrumentation step, return the next step for session ID 'session-789xyz' with completion note 'Updated appsettings.json to enable Application Insights'.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Completion note** | Required | One sentence describing what you executed, for example, 'Ran dotnet add package command' or 'Added UseAzureMonitor() to Program.cs'. |\n| **Session ID** | Required | The workspace path returned as sessionId from orchestrator-start. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ✅\n\n## Instrumentation: Send brownfield analysis\n\n<!-- @mcpcli monitor instrumentation send-brownfield-analysis -->\n\nSends brownfield code analysis findings after `orchestrator-start` returns status `analysis_needed`. This tool is part of the Model Context Protocol (MCP) workflow. You must scan the workspace source files and fill in the analysis template before you call this tool. After this tool succeeds, continue with `orchestrator-next`.\n\nExample prompts include:\n\n- \"Send brownfield code analysis findings JSON '{\"serviceOptions\":null,\"initializers\":null,\"processors\":null,\"clientUsage\":null,\"sampling\":{\"found\":false,\"hasCustomSampling\":false},\"telemetryPipeline\":null,\"logging\":null}' to Azure Monitor instrumentation session 'workspace-7a3b' after analysis was requested.\"\n- \"Continue migration orchestration by submitting findings JSON '{\"serviceOptions\":{\"found\":true,\"details\":\"AddApplicationInsightsTelemetry used\"},\"initializers\":[],\"processors\":[],\"clientUsage\":null,\"sampling\":{\"found\":false,\"hasCustomSampling\":false},\"telemetryPipeline\":null,\"logging\":null}' to session 'sess-01234'.\"\n- \"Send completed brownfield telemetry analysis as findings JSON '{\"serviceOptions\":null,\"initializers\":null,\"processors\":null,\"clientUsage\":{\"found\":true},\"sampling\":{\"found\":false,\"hasCustomSampling\":false},\"telemetryPipeline\":null,\"logging\":{\"found\":true}}' for onboarding session 'session-9f3b'.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Findings JSON** | Required | JSON object with brownfield analysis findings. Required properties: serviceOptions (service options findings from analyzing AddApplicationInsightsTelemetry() call, null if not found), initializers (telemetry initializer findings from analyzing ITelemetryInitializer or IConfigureOptions&lt;TelemetryConfiguration&gt; implementations, null if none found), processors (telemetry processor findings from analyzing ITelemetryProcessor implementations, null if none found), clientUsage (TelemetryClient usage findings from analyzing direct TelemetryClient usage, null if not found), sampling (custom sampling configuration findings, null if no custom sampling), telemetryPipeline (custom ITelemetryChannel or TelemetrySinks usage findings, null if not found), logging (explicit logger provider and filter findings, null if not found). For sections that don't exist in the codebase, pass an empty default object, for example found: `false` or hasCustomSampling: `false`, instead of null. |\n| **Session ID** | Required | The workspace path returned as `sessionId` from `orchestrator-start`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ✅\n\n## Instrumentation: Send enhancement selection\n\n<!-- @mcpcli monitor instrumentation send-enhancement-select -->\n\nSubmit the user's enhancement selection after `orchestrator-start` returns status `enhancement_available`. Present the enhancement choices to the user, then call this tool with the chosen enhancement keys. You can select multiple enhancements by passing a comma-separated list, for example, `redis,processors`. After this tool succeeds, continue with `orchestrator-next`.\n\nExample prompts include:\n\n- \"Submit enhancement keys 'redis,processors' for Azure Monitor instrumentation session ID 'workspaces/my-app/session-abc123'.\"\n- \"Continue instrumentation enhancement flow by sending enhancement keys 'redis' to session ID 'workspaces/prod-app/session-789'.\"\n- \"Send chosen enhancement keys 'entityframework,otlp' for onboarding session ID 'workspaces/onboard/session-456'.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Enhancement keys** | Required | One or more enhancement keys, comma-separated (for example, `redis`, `redis,processors`, `entityframework,otlp`). |\n| **Session ID** | Required | The workspace path returned as `sessionId` from `orchestrator-start`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ✅\n\n## Workbooks: List workbooks\n\n<!-- @mcpcli workbooks list -->\n\nSearch Azure Workbooks using Resource Graph for fast metadata queries. This tool helps you discover, filter, and count workbooks across different scopes.\n\nIt returns workbook metadata, including `id`, `name`, `location`, `category`, and timestamps. By default, it doesn't return full workbook content (`serializedData`) — use the show tool for that, or set `Output format` to `full`.\n\nBy default, the search targets workbooks in your current Azure context (tenant/subscription). You can use `Resource group` to explicitly specify your search scope. The tool returns the server-side total count by default. The maximum results returned is 50, with a maximum limit of 1000; adjust this with `Max results`. Choose `Output format` as `summary` for minimal tokens or `full` for complete `serializedData` output.\n\nExample prompts include:\n\n- \"Show me all workbooks in resource group 'monitoring-rg'.\"\n- \"List the shared workbooks in resource group 'prod-rg'.\"\n- \"What workbooks were modified after 2024-01-15 in resource group 'analytics-rg'?\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** | Optional | The name of the Azure resource group to scope the search. |\n| **Category** | Optional | Filter workbooks by category (for example, `workbook`, `sentinel`, `TSG`). If not specified, all categories are returned. |\n| **Include total count** | Optional | Include the total count of all matching workbooks in the response (default: true). |\n| **Kind** | Optional | Filter workbooks by kind (for example, `shared`, `user`). If not specified, all kinds are returned. |\n| **Max results** | Optional | Maximum number of results to return (default: 50, max: 1000). |\n| **Modified after** | Optional | Filter workbooks modified after this date (ISO 8601 format, for example, `2024-01-15`). |\n| **Name contains** | Optional | Filter workbooks where the display name contains this text (case-insensitive). |\n| **Output format** | Optional | Output format: `summary` (ID and name only, minimal tokens), `standard` (metadata without content, default), `full` (includes `serializedData`). |\n| **Source ID** | Optional | Filter workbooks by source resource ID (for example, `/subscriptions/abc123/resourceGroups/prod/providers/Microsoft.Insights/components/myapp`). If not specified, all workbooks are returned. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Workbooks: Show workbook details\n\n<!-- @mcpcli workbooks show -->\n\nRetrieve full workbook details via the Azure Resource Manager (ARM) API, including the `serializedData` content. This command lets you get the complete workbook definition, including the visualization JSON.\n\nIt returns full workbook properties, `serializedData`, tags, and `ETag`. You can provide multiple `Workbook IDs` for batch operations. The command reports partial failures for individual workbooks. For better performance, use the list tool to discover workbooks first, then use show for specific workbooks.\n\nExample prompts include:\n\n- \"Show me the details of the workbook with resource ID '/subscriptions/abc123/resourceGroups/monitoring/providers/Microsoft.Insights/workbooks/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1'.\"\n- \"Get the full definition of the workbook '/subscriptions/xyz789/resourceGroups/prod-rg/providers/Microsoft.Insights/workbooks/b1b1b1b1-cccc-dddd-eeee-f2f2f2f2f2f2'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Workbook IDs** | Required | The Azure resource IDs of the workbooks to retrieve. Supports multiple values for batch operations. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Workbooks: Create workbook\n\n<!-- @mcpcli workbooks create -->\n\nCreate a new workbook in the specified resource group and subscription. You can set the display name and the serialized JSON content for the workbook. This command returns the created workbook information upon successful completion.\n\nExample prompts include:\n\n- \"Create a new workbook named 'Performance Dashboard' in resource group 'monitoring-rg' with the serialized content for a basic notebook.\"\n- \"Create a workbook called 'Infrastructure Overview' in resource group 'prod-rg' with content showing VM metrics.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Display name** | Required | The display name of the workbook. |\n| **Resource group** | Required | The name of the Azure resource group containing the workbook. |\n| **Serialized content** | Required | The serialized JSON content of the workbook. |\n| **Source ID** | Optional | The linked resource ID for the workbook. By default, this is `azure monitor`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Workbooks: Update workbook\n\n<!-- @mcpcli workbooks update -->\n\nUpdate properties of an existing Azure workbook by adding new steps, modifying content, or changing the display name. This action returns the updated workbook details. You need the workbook resource ID and can specify either new serialized content or a new display name.\n\nExample prompts include:\n\n- \"Update the workbook '/subscriptions/abc123/resourceGroups/monitoring-rg/providers/Microsoft.Insights/workbooks/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1' with display name 'Monthly Report'.\"\n- \"Change the serialized content of workbook '/subscriptions/xyz789/resourceGroups/prod-rg/providers/Microsoft.Insights/workbooks/b1b1b1b1-cccc-dddd-eeee-f2f2f2f2f2f2' to include a new metrics chart.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Workbook ID** | Required | The Azure resource ID of the workbook to update. |\n| **Display name** | Optional | The display name of the workbook. |\n| **Serialized content** | Optional | The JSON serialized content of the workbook. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Workbooks: Delete workbooks\n\n<!-- @mcpcli workbooks delete -->\n\nDelete one or more workbooks by their Azure resource IDs. This command performs a soft delete on workbooks, retaining them for 90 days. You can restore them from the Recycle Bin through the Azure portal if needed.\n\nFor batch operations, you can provide multiple `Workbook IDs` values. The command reports partial failures per workbook, ensuring that individual failures don't affect the entire batch operation.\n\nTo learn more, see [Manage Azure Monitor workbooks](/azure/azure-monitor/visualize/workbooks-manage).\n\nExample prompts include:\n\n- \"Delete the workbook with resource ID '/subscriptions/abc123/resourceGroups/monitoring/providers/Microsoft.Insights/workbooks/a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1'.\"\n- \"Remove the workbooks with resource IDs '/subscriptions/xyz789/resourceGroups/prod-rg/providers/Microsoft.Insights/workbooks/b1b1b1b1-cccc-dddd-eeee-f2f2f2f2f2f2' and '/subscriptions/def456/resourceGroups/analytics-rg/providers/Microsoft.Insights/workbooks/c2c2c2c2-dddd-eeee-ffff-a3a3a3a3a3a3'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Workbook IDs** | Required | The Azure resource IDs of the workbooks to delete. Supports multiple values for batch operations. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Monitor](/azure/azure-monitor/overview)\n- [Application Insights](/azure/azure-monitor/app/app-insights-overview)\n- [Workbooks in Azure Monitor](/azure/azure-monitor/visualize/workbooks-overview)\n- [Metrics in Azure Monitor](/azure/azure-monitor/platform/tutorial-metrics)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-mysql.md",
    "content": "---\n\ntitle: Azure MCP Server tools for Azure Database for MySQL\ndescription: Use Azure MCP Server tools to manage Azure Database for MySQL Flexible Server resources with natural language prompts from your IDE.\nms.date: 04/07/2026\nms.service: azure-mcp-server\nms.topic: concept-article\ntool_count: 6\nmcp-cli.version: 2.0.0-beta.39\nauthor: diberry\nms.author: diberry\nreviewer: mattkohnms \nai-usage: ai-generated\nms.custom: build-2025\ncontent_well_notification:\n  - AI-contribution\n---\n\n# Azure MCP Server tools for Azure Database for MySQL\n\nThe Azure MCP Server tools help you manage Azure Database for MySQL servers, databases, configuration settings, and schemas. You can use the tools to get and list servers and databases, query table schemas and data, and set server parameters by using natural language prompts.\n\nAzure Database for MySQL is a managed relational database service based on the MySQL community edition. For more information, see [Azure Database for MySQL documentation](/azure/mysql/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n\n## Get MySQL servers databases\n\n<!-- @mcpcli mysql list -->\n\nList Azure Database for MySQL servers, databases, or tables in your subscription. By default, this tool returns all servers. Specify the `server` parameter to list databases on a server, or specify both the `server` and `database` parameters to list tables in a database.\n\nExample prompts include:\n\n- \"List all MySQL servers in resource group 'rg-prod' with user name 'dbadmin'.\"\n- \"Show me my MySQL servers for resource group 'web-rg' using user name 'mysqluser'.\"\n- \"What MySQL servers are in resource group 'rg-staging' for user name 'adminuser'?\"\n- \"List all MySQL databases in server 'mysql-server-01' within resource group 'rg-prod' using user name 'dbadmin'.\"\n- \"Show me the MySQL databases on server 'mysql-dbserver' for resource group 'rg-dev' with user name 'mysqluser'.\"\n- \"List all tables in MySQL database 'salesdb' on server 'mysql-server-01' in resource group 'rg-prod' using user name 'dbadmin'.\"\n- \"Show me the tables in database 'inventory' on server 'mysql-dbserver' for resource group 'rg-test' with user name 'mysqluser'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group that contains the resources. |\n| **User name** |  Required | The user name to access the Azure Database for MySQL server. |\n| **Database name** |  Optional | The name of the Azure Database for MySQL database to list tables from. Requires the Server name parameter. |\n| **Server name** |  Optional | The name of the Azure Database for MySQL server to list databases from. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\nExamples\n\n- List all Azure Database for MySQL servers in subscription 'contoso-subscription' and resource group 'prod-rg'.\n- List databases on server 'mysql-prod-01' in resource group 'prod-rg'.\n- List tables in database 'salesdb' on server 'mysql-prod-01' in resource group 'prod-rg'.\n\n## Query MySQL database\n\n<!-- @mcpcli mysql database query -->\n\nThe Model Context Protocol (MCP) tool runs a safe, read-only SQL `SELECT` query against an Azure Database for MySQL Flexible Server database. Use this tool to retrieve or inspect table data without modifying it. The tool rejects non-`SELECT` statements such as `INSERT`, `UPDATE`, `DELETE`, `REPLACE`, `MERGE`, `TRUNCATE`, `ALTER`, `CREATE`, and `DROP`. It also rejects multistatements, comments that hide writes, transaction control (`BEGIN`/`COMMIT`/`ROLLBACK`), `INTO OUTFILE`, and other destructive keywords. This tool executes only a single `SELECT` statement to ensure data integrity.\n\nFor best results, list the columns you need instead of using `SELECT *`. Add `WHERE` filters, use `LIMIT`/`OFFSET` for paging, and add `ORDER BY` for deterministic results. Avoid returning unnecessary sensitive data.\n\nExample prompts include:\n\n- \"Execute query 'SELECT id, name, email FROM customers WHERE id > 100 ORDER BY name LIMIT 50' on database 'ecommerce_db' in resource group 'rg-prod' on server 'mysql-prod-server' as user 'readonlyuser'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Database name** |  Required | The MySQL database to access. |\n| **Query** |  Required | Query to execute against a MySQL database. |\n| **Resource group** |  Required | The name of the Azure resource group. This resource group is a logical container for Azure resources. |\n| **Server name** |  Required | The MySQL server to access. |\n| **User name** |  Required | The user name to access MySQL server. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get server config\n\n<!-- @mcpcli mysql server config get -->\n\nThis tool is part of the Model Context Protocol (MCP) tools. It retrieves comprehensive configuration details for a specified Azure Database for MySQL Flexible Server instance. The tool returns server settings, performance parameters, security configurations, and operational characteristics that help you manage and optimize the database. Output is JSON and includes ServerName, Location, Version, SKU, StorageSizeGB, BackupRetentionDays, and GeoRedundantBackup.\n\nExample prompts include:\n\n- \"Show me the configuration of MySQL server 'mysql-prod' in resource group 'rg-prod' with user 'dbadmin'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group that contains the server. |\n| **Server name** |  Required | The name of the Azure Database for MySQL Flexible Server instance. |\n| **User name** |  Required | The user name to authenticate to the server. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n\n## Get server parameter\n\n<!-- @mcpcli mysql server param get -->\n\nThis Model Context Protocol (MCP) tool retrieves the current value of a single server configuration parameter on Azure Database for MySQL Flexible Server. Use this tool to inspect a setting, such as `max_connections`, `wait_timeout`, or `slow_query_log`, before you change it. This tool requires a user account with sufficient privileges to read server parameters.\n\nExample prompts include:\n\n- \"Show me the value of parameter 'connection_timeout' in resource group 'rg-prod' for MySQL server 'my-mysql-server' with user name 'dbadmin'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Parameter** |  Required | The MySQL parameter to access. |\n| **Resource group** |  Required | The name of the Azure resource group. This resource group is a logical container for Azure resources. |\n| **Server name** |  Required | The MySQL server to access. |\n| **User name** |  Required | The user name to access MySQL server. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Update server parameter\n\n<!-- @mcpcli mysql server param set -->\n\nThis tool, part of the Model Context Protocol (MCP), updates a single configuration setting on an Azure Database for MySQL server. You specify the resource group, server name, user name, and the value to set.\n\nExample prompts include:\n\n- \"Set parameter 'connection_timeout' to value '20' on server name 'mysql-prod' in resource group 'rg-prod' with user name 'dbadmin'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Parameter** |  Required | The MySQL parameter to access. |\n| **Resource group** |  Required | The name of the Azure resource group. This resource group is a logical container for Azure resources. |\n| **Server name** |  Required | The MySQL server to access. |\n| **User name** |  Required | The user name to access MySQL server. |\n| **Value** |  Required | The value to set for the MySQL parameter. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\nExamples\n\n- Set `autocommit` to 'ON' for server 'my-mysql-server' in resource group 'prod-rg' using user 'dbadmin'.\n- Set `slow_query_log` to 'ON' for server 'analytics-db' in resource group 'analytics-rg' using user 'monitor'.\n- Set `max_connections` to '200' for server 'web-db-server' in resource group 'web-rg' using user 'dbadmin'.\n\n## Get table schema\n\n<!-- @mcpcli mysql table schema get -->\n\nThis Model Context Protocol (MCP) tool retrieves detailed schema information for a specific table in an Azure Database for MySQL Flexible Server instance. It returns comprehensive metadata, including column definitions, data types, constraints, indexes, and relationships. This metadata helps you understand table structure and supports application development.\n\nExample prompts include:\n\n- \"Show the schema of table 'orders' in database 'salesdb' on server 'mysql-prod' within resource group 'rg-db-prod' as user 'dbadmin'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Database name** |  Required | The MySQL database to access. |\n| **Resource group** |  Required | The name of the Azure resource group that contains the server. |\n| **Server name** |  Required | The MySQL server that hosts the database. |\n| **Table name** |  Required | The table to retrieve schema information for. |\n| **User name** |  Required | The user name to authenticate to the MySQL server. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Database for MySQL documentation](/azure/mysql/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-native-isv.md",
    "content": "---\ntitle: Azure Native ISV Tools for Azure MCP Server\ndescription: Learn how to use Azure MCP Server with Azure Native ISV partner solutions like Datadog for monitoring and managing Azure resources using natural language prompts.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\nms.topic: concept-article\nms.service: azure\nai-usage: ai-assisted\n---\n\n# Azure Native ISV tools for Azure MCP Server overview\n\nThe Azure MCP Server allows you to manage Azure resources, including Azure Native ISV partner solutions, using natural language prompts. This enables you to quickly manage third-party services that are natively integrated with Azure without remembering complex syntax, improving productivity and reducing operational overhead.\n\n[Azure Native Integrations](/azure/partner-solutions/partners) enable you to easily provision, manage, and tightly integrate software and services from partner companies on Azure. Microsoft and partner organizations develop these services and manage them together, providing a seamless experience through the Azure portal.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## ISV partners\n\n* [Datadog](#datadog-monitored-resources) - A monitoring and analytics platform for large-scale applications that encompasses infrastructure monitoring, application performance monitoring, log management, and user-experience monitoring.\n\n\n## Datadog monitored resources\n\n<!-- datadog monitoredresources list -->\n\nThe Azure MCP Server can list monitored resources in Datadog. [Datadog](/azure/partner-solutions/datadog/overview) is a monitoring and analytics platform for large-scale applications that encompasses infrastructure monitoring, application performance monitoring, log management, and user-experience monitoring.\n\nDatadog's Azure Native Integration allows you to manage Datadog directly in the Azure console as an integrated service. This streamlined workflow covers everything from procurement to configuration, making it easy to start monitoring the health and performance of your applications across Azure, hybrid, or multicloud environments.\n\nExample prompts include:\n\n- **List monitored resources:** \"Show me all resources being monitored by Datadog resource 'my-datadog' in resource group 'my-resource-group'\"\n- **Check monitoring status:** \"What resources are being monitored by Datadog 'main-datadog' in resource group 'my-resource-group'?\"\n- **View monitoring coverage:** \"List all monitored resources for Datadog resource 'company-datadog' in resource group 'my-resource-group'\"\n- **Audit monitoring:** \"Show me what's being monitored by Datadog 'prod-datadog' in resource group 'my-resource-group'\"\n- **Inventory check:** \"Get the list of resources monitored by Datadog 'monitor-datadog' in resource group 'my-resource-group'\"\n\n| Parameter | Required | Description |\n| --- | --- | --- |\n| **Datadog resource** | Required | The name of the Datadog resource in Azure. |\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Partner Solutions documentation](/azure/partner-solutions/partners)\n- [Datadog Azure integration documentation](/azure/partner-solutions/datadog/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-policy.md",
    "content": "---\ntitle: Azure Policy Tools for Azure MCP Server\ndescription: Manage Azure Policy assignments effortlessly with Azure MCP Server. Learn how to simplify compliance and governance using natural language prompts.\n#customer intent: As a compliance officer, I want to filter policy assignments by scope so that I can focus on policies relevant to a particular management group.\nauthor: diberry\nms.author: diberry\nms.reviewer: diberry\nms.date: 01/23/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nreviewer: msalaman\n--- \n\n# Azure Policy tools for Azure MCP Server overview\n\nAzure MCP Server enables you to view Azure Policy assignments, definitions, and initiatives using natural language prompts. Simplify policy management without complex syntax.\n\n[Azure Policy](/azure/governance/policy/) is a service in Azure that allows you to create, assign, and manage policies to enforce rules and effects on your resources. It helps ensure compliance with organizational standards and regulatory requirements.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Policy: list assignments\n\n<!-- @mcpcli policy assignment list -->\n\nList policy assignments in a subscription or scope. This command retrieves all Azure Policy assignments along with their complete policy definition details (rules, effects, parameters schema), enforcement modes, assignment parameters, and metadata. You can optionally filter by scope to list assignments at a specific resource group, resource, or management group level.\n\nExample prompts include:\n\n- \"Show me all policy assignments in resource group 'rg-contoso'\"\n- \"List every policy assignment available in resource group 'rg-production'\"\n- \"Get details for policy assignment 'AuditVMUpdates' within resource group 'rg-contoso'\"\n- \"Can you fetch the policy assignment called 'EnforceTagging' in resource group 'rg-marketing'?\"\n- \"Retrieve the policy assignment named 'SecureStorage' from resource group 'rg-security'\"\n\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Scope** |  Optional | The scope of the policy assignment (for example, `/subscriptions/{subscriptionId}`, `/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}`). |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Policy](/azure/governance/policy/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-pricing.md",
    "content": "---\ntitle: Azure pricing tools overview for the MCP Server\ndescription: Discover Azure pricing tools for MCP Server to manage cost estimates and billing. Start optimizing your Azure costs today.\n#customer intent: As a system administrator, I want to analyze pricing for Azure services like Virtual Machines and Storage so that I can recommend the best configurations for my organization.\nms.date: 02/18/2026\nms.reviewer: anannyapatra\nms.service: azure-mcp-server\nms.topic: concept-article\ntool_count: 1\n---\n\n# Azure pricing tools for the Azure MCP Server\n\nAzure [pricing tools](/azure/cost-management-billing/) in MCP Server help you manage cost estimates, billing questions, and budget tracking using natural language prompts. This article explains how these tools let organizations learn about Azure spending and manage costs effectively.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get pricing information\n\n<!-- @mcpcli pricing get -->\n\nGet Azure retail pricing information. The tool can estimate deployment costs from an ARM or Bicep template. You can provide the template within the prompt or as a file input.\n\nExample prompts include:\n\n- \"This is my Bicep template: <bicep_template>. Estimate my deployment costs.\"\n- \"What is the pricing for SKU `Standard_D4s_v5` in region `eastus`?\"\n- \"Can I get the pricing details for service `Virtual Machines` and SKU `Standard_E64-16ds_v4`?\"\n- \"Show me the `Consumption` pricing for SKU `Standard_D4s_v5` in `westeurope` and include savings plan.\"\n- \"List pricing information for all SKUs in the `Storage` service in region `westus2`.\"\n\n| Parameter                  | Required or optional | Description                                                                                                                                        |\n|---------------------------|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|\n| **Currency**              | Optional             | Currency code for pricing (for example, `USD`, `EUR`). The default is `USD`.                                                                      |\n| **SKU**                   | Optional*             | ARM SKU name (for example, `Standard_D4s_v5`, `Standard_E64-16ds_v4`).                                                                            |\n| **Service**               | Optional*             | Azure service name (for example, `Virtual Machines`, `Storage`, `SQL Database`).                                                                   |\n| **Region**                | Optional*             | Azure region (for example, `eastus`, `westeurope`, `westus2`).                                                                                    |\n| **Service family**        | Optional*             | Service family (for example, `Compute`, `Storage`, `Databases`, `Networking`).                                                                    |\n| **Price type**            | Optional*             | Price type filter (for options: `Consumption`, `Reservation`, `DevTestConsumption`).                                                              |\n| **Include savings plan**  | Optional             | Include savings plan pricing information (uses preview API version).                                                                               |\n| **Filter**                | Optional*             | Raw OData filter expression for advanced queries (for example,`meterId eq 'abc-123'`). For more about OData, see [OData documentation](https://www.odata.org/documentation/).                                               |\n\n* At least one filter option is required.\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Pricing Calculator documentation](/azure/cost-management-billing/costs/pricing-calculator/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-quotas.md",
    "content": "---\ntitle: Manage Azure Quotas with Azure MCP Server\ndescription: Use Azure MCP Server to manage Azure Quotas with natural language prompts. Monitor usage, set alerts, and optimize resource allocation. Learn more and get started today.\nai-usage: ai-assisted\ncontent_well_notification: \n  - AI-contribution\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.date: 12/05/2025\nms.topic: concept-article\n---\n\n# Azure Quotas for the Azure MCP Server overview\n\nAzure MCP Server helps you manage Azure quotas efficiently by using natural language prompts. This article explains how to monitor quota usage, set alerts, and optimize resource allocation for your Azure resources.\n\n[Azure Quotas](/azure/quotas/quotas-overview) enables you to monitor and create alerts for specific quotas. You can receive notifications when the usage reaches predefined thresholds.\n\n\n## Region: Availability list\n\n<!-- quota region availability list -->\n\nGiven a list of Azure resource types, this tool returns a list of regions where the resource types are available. Always get the user's subscription ID before calling this tool.\n\nExample prompts include:\n\n- **Check region availability**: \"Which regions support Microsoft.App/containerApps and Microsoft.Web/sites?\"\n- **Resource region list**: \"Show me all regions where I can deploy Microsoft.CognitiveServices/accounts.\"\n- **Find available regions for resources**: \"List available regions for Microsoft.App/containerApps, Microsoft.Web/sites, and Microsoft.CognitiveServices/accounts.\"\n- **Region support for cognitive services**: \"Where can I deploy the 'gpt-4' model for Microsoft.CognitiveServices/accounts?\"\n- **Deployment options**: \"What regions allow deployment of Microsoft.App/containerApps and Microsoft.Web/sites?\"\n\n| Parameters | Required or optional | Description |\n|-----------------------------|----------------------|-------------|\n| **Resource types to check** | Required | Comma-separated list of Azure resource types to check available regions for. For example: `Microsoft.App/containerApps`, `Microsoft.Web/sites`, `Microsoft.CognitiveServices/accounts`. |\n| **Cognitive service model name** | Optional | Model name for cognitive services. Only needed when `Microsoft.CognitiveServices` is included in resource types. |\n| **Cognitive service model version** | Optional | Model version for cognitive services. Only needed when `Microsoft.CognitiveServices` is included in resource types. |\n| **Cognitive service deployment SKU name** | Optional | Deployment SKU name for cognitive services. Only needed when `Microsoft.CognitiveServices` is included in resource types. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Usage: Check usage and quotas\n\n<!-- quota usage check -->\n\nThis tool checks the usage and quota information for Azure resources in a region.\n\nExample prompts include:\n\n- **Check quota usage**: \"Check my quota usage for Microsoft.App/containerApps in eastus.\"\n- **Resource quota status**: \"Show me the current quota and usage for Microsoft.Web/sites and Microsoft.CognitiveServices/accounts in westus.\"\n- **Quota limits**: \"What are the quota limits for Microsoft.App/containerApps in centralus?\"\n- **Usage report**: \"Get a usage report for Microsoft.Compute/virtualMachines in region 'eastus2'.\"\n- **Quota and usage details**: \"Can you provide quota and usage details for Microsoft.App/containerApps, Microsoft.Web/sites in westeurope?\"\n\n| Parameters | Required or optional | Description |\n|-----------------------------|----------------------|-------------|\n| **Region for deployment** | Required | The Azure region where you want to check the usage and quota. For example: `eastus`, `westus`. |\n| **Resource types to deploy** | Required | The Azure resource types that you want to check the usage and quota for (comma-separated). For example: `Microsoft.App/containerApps`, `Microsoft.Web/sites`, `Microsoft.CognitiveServices/accounts`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Quotas](/azure/quotas/quotas-overview)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-rbac.md",
    "content": "---\ntitle: Azure RBAC Tools for the Azure MCP Server\ndescription: Learn how to use Azure MCP Server with Azure RBAC to manage role assignments using natural language prompts. Simplify access control management.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\nms.topic: concept-article\n---\n\n# Azure RBAC tools for the Azure MCP Server overview\n\nAzure RBAC tools in the Azure MCP Server allow you to manage Azure role-based access control using natural language prompts. This allows you to quickly view and manage role assignments without remembering complex syntax, streamlining your Azure access management workflow.\n\n[Azure role-based access control (Azure RBAC)](/azure/role-based-access-control) is the authorization system used to manage access to Azure resources. The way you control access to resources using Azure RBAC is to assign Azure roles. This is a key concept to understand – it's how permissions are enforced. A role assignment consists of three elements: security principal, role definition, and scope.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## List role assignments\n\n<!-- role assignment list -->\n\nThe Azure MCP Server can list Azure RBAC [role assignments](/azure/role-based-access-control/role-assignments) at a specific scope. This allows you to view who has access to what resources and what permissions they have.\n\nExample prompts include:\n\n- **List assignments**: \"Show me all role assignments in my subscription.\"\n- **View scope assignments**: \"List role assignments for resource group 'myresourcegroup'\"\n- **Check access**: \"What role assignments exist at the subscription scope?\"\n- **Query assignments**: \"Show me all RBAC assignments for my Azure subscription\"\n- **Find assignments**: \"List all role assignments in scope '/subscriptions/12345678-1234-1234-1234-123456789012'\"\n- **Resource group scope**: \"Show role assignments for resource group 'production-rg' in my subscription\"\n- **Specific resource scope**: \"List role assignments for storage account 'mystorageaccount' in resource group 'storage-rg'\"\n- **Virtual machine access**: \"What role assignments exist for VM 'prod-vm01' in the production resource group?\"\n- **Database permissions**: \"Show me who has access to SQL database 'proddb' in resource group 'database-rg'\"\n\n| Parameter | Required | Description |\n|-----------|----------|-------------|\n| **Scope** | Required | The scope to list role assignments for. Can be a subscription, resource group, or resource. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure role-based access control (Azure RBAC)](/azure/role-based-access-control)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-redis.md",
    "content": "---\ntitle: Azure Redis Tools for Azure MCP Server\ndescription: Learn how to manage Azure Redis instances using the Azure MCP Server with natural language prompts. Discover tools for creating and listing Redis resources.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\nms.topic: concept-article\nms.service: azure\nai-usage: ai-assisted\nms.custom: build-2025\n---\n\n# Azure Redis tools for Azure MCP Server overview\n\nThe Azure MCP Server lets you manage Azure Redis instances using natural language prompts. You can create new Redis resources and list existing Redis resources without remembering complex syntax or commands.\n\n[Azure Redis](/azure/redis) provides an in-memory data store based on the Redis software. Redis improves the performance and scalability of applications that use backend data stores heavily. Redis processes large volumes of application requests by keeping frequently accessed data in server memory, which you can write to and read from quickly.\n\nThe Azure Redis tools support both [Azure Managed Redis](/azure/redis/overview) and [Azure Cache for Redis](/azure/azure-cache-for-redis/cache-overview).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Create a Redis resource\n\n<!-- redis create -->\n\nCreate a new Azure Managed Redis resource in Azure. Use this command to provision a new Redis resource in your subscription.\n\nExample prompts include:\n\n- \"Create a new Redis instance named 'my-redis' in resource group 'rg-backend' located in 'eastus'\"\n- \"Set up a Redis cache called 'cache-prod' within resource group 'rg-production' at location 'westus2'\"\n- \"I need to create Redis resource 'fastcache' in 'rg-apps' resource group with location 'centralus'\"\n- \"Provision Redis named 'session-store' in resource group 'rg-sessions' located in 'northcentralus'\"\n- \"Please create Redis resource 'redis-main' in resource group 'rg-main' at 'eastus2' location\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource** |  Required | The name of the Redis resource (for example, `my-redis`). |\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **SKU** |  Optional | The SKU for the Redis resource. (Default: `Balanced_B0`). |\n| **Location** |  Required | The location for the Redis resource (for example `eastus`). |\n| **Access keys authentication** |  Optional | Whether to enable access keys for authentication for the Redis resource. (Default: `false`). |\n| **Modules** |  Optional | A list of modules to enable on the Azure Managed Redis resource (for example, `RedisBloom`, `RedisJSON`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## List Redis resources\n\n<!-- redis list -->\n\nLists all Redis resources in a subscription. Returns details of all Azure Managed Redis, Azure Cache for Redis, and Azure Redis Enterprise resources. Use this command to explore and view which Redis resources are available in your subscription.\n\nExample prompts include:\n\n- \"Show me all Redis caches available in my Azure subscription\"\n- \"List every Redis instance I have under tenant 'contoso.com'\"\n- \"Get details for Redis cache 'redisCacheWestUS' in subscription 'ProductionSub'\"\n- \"Can you retrieve information about Redis instance 'sales-redis-cache'?\"\n- \"I want to see the Redis cache named 'inventory-redis' in my tenant 'contoso.com'\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Redis](/azure/redis/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-resource-health.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure Resource Health\ndescription: Use Azure MCP Server tools to manage resource health and availability of Azure resources with natural language prompts from your IDE.\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 03/24/2026\nreviewer: shdesmu\ntool_count: 2\nmcp-cli.version: 2.0.0-beta.39\n---\n\n# Azure MCP Server tools for Azure Resource Health\n\nThe Azure MCP Server lets you manage resource health, including checking availability status, viewing health events, and tracking service-impacting issues across your Azure resources, with natural language prompts.\n\nAzure Resource Health provides information about the health of your individual Azure resources and helps you diagnose and mitigate issues; for more information, see [Azure Resource Health documentation](/azure/service-health/resource-health-overview).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get resource health availability status\n\n<!-- @mcpcli resourcehealth availability-status get -->\n\nThis tool retrieves the Azure Resource Health availability status for a specific resource or for all resources in a subscription or resource group. It reports whether a resource is `Available`, `Unavailable`, `Degraded`, or `Unknown`, and includes the reason and details to help you investigate and troubleshoot. You can check the health of Azure resources such as virtual machines and storage accounts. \n\nExample prompts include:\n\n- \"Get the availability status for resource 'vm-web-01'.\"\n- \"What is the Azure Resource Health availability status of the storage account 'mystorageacct'?\"\n- \"What is the availability status of virtual machine 'app-server-01' in resource group 'rg-prod'?\"\n- \"Get Azure Resource Health availability status for all resources in my subscription.\"\n- \"Show me the health status of all my Azure resources.\"\n- \"What resources in resource group 'rg-monitoring' have health issues?\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **ResourceId** |  Optional | The Azure resource ID to get health status for such as `/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Compute/virtualMachines/{vm}`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get resource health events\n\n<!-- @mcpcli resourcehealth health-events list -->\n\nList Azure Service Health events for your subscription to track incidents, planned maintenance, advisories, and security events over a specified time range (for example, `the last 30 days`). Query planned maintenance, past or ongoing incidents, advisories, and security events to retrieve details about resource availability, potential issues, and timestamps. The tool returns `trackingId`, `title`, `summary`, `eventType`, `status`, `startTime`, `endTime`, and `impactedServices`. Filter results by `Event type`, `Status`, `Tracking ID`, time range (`Query start time` and `Query end time`), or apply an OData `Filter` to narrow the results.\n\nExample prompts include:\n\n- \"Show all service health events in my subscription.\"\n- \"Show Azure service health events for subscription <subscription_id>.\"\n- \"Which service issues occurred in the last 30 days?\"\n- \"List active service health events in my subscription.\"\n- \"Show planned maintenance events for my Azure services.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Event type** |  Optional | Filter by event type (ServiceIssue, PlannedMaintenance, HealthAdvisory, Security). If not specified, all event types are included. |\n| **Filter** |  Optional | Additional OData filter expression to apply to the service health events query. |\n| **Query end time** |  Optional | End time for the query in ISO 8601 format (for example, `2024-01-31T23:59:59Z`). Events up to this time will be included. |\n| **Query start time** |  Optional | Start time for the query in ISO 8601 format (for example, `2024-01-01T00:00:00Z`). Events from this time onwards will be included. |\n| **Status** |  Optional | Filter by status (Active, Resolved). If not specified, all statuses are included. |\n| **Tracking ID** |  Optional | Filter by tracking ID to get a specific service health event. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Resource Health documentation](/azure/service-health/resource-health-overview)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-service-bus.md",
    "content": "---\ntitle: Azure Service Bus Tools \ndescription: \"Learn how to use Azure MCP Server with Azure Service Bus to manage queues, topics, and peek at messages with natural language prompts.\"\nauthor: diberry\nms.author: diberry\nms.date: 12/05/2025\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n--- \n# Azure Service Bus tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you to manage Azure Service Bus resources, including queues and topics with natural language prompts. You can peek at messages and view message details without specialized knowledge of messaging protocols.\n\n[Azure Service Bus](/azure/service-bus-messaging/service-bus-messaging-overview) is a fully managed enterprise message broker with message queues and publish-subscribe topics. Service Bus decouples applications and services from each other.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get queue runtime details\n\n<!-- servicebus queue details -->\n\nThe Azure MCP Server can retrieve runtime details about a Service Bus queue, including its message count and status.\n\nExample prompts include:\n\n- **Details queue**: \"Show me details about the 'orders' queue in my 'app-messaging' namespace.\"\n- **Queue info**: \"What's the status of queue 'notifications' in namespace 'messaging-hub'?\"\n- **Check queue**: \"Get details for queue 'user-events' in namespace 'app-messaging'\"\n- **Queue status**: \"Show me message count for queue 'orders' in namespace 'retail-messaging'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Namespace** | Required | The fully qualified Service Bus namespace host name. |\n| **Queue name** | Required | The queue name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get topic runtime details\n\n<!-- servicebus topic details -->\n\nThe Azure MCP Server can retrieve runtime details about a Service Bus topic, including its subscription count and status.\n\nExample prompts include:\n\n- **Details topic**: \"Show me runtime details about the 'product-events' topic in my 'retail-messaging' namespace.\"\n- **Topic info**: \"What's the runtime status of topic 'system-updates' in namespace 'app-messaging'?\"\n- **Check topic**: \"Get details for topic 'notifications' in namespace 'messaging-hub'\"\n- **Topic status**: \"Show me subscription count for topic 'events' in namespace 'app-messaging'\"\n- **View topic**: \"Tell me about topic 'broadcast-topic' in namespace 'retail-messaging'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Namespace** | Required | The fully qualified Service Bus namespace host name. |\n| **Topic name** | Required | The name of the topic. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get topic subscription runtime details\n\n<!-- servicebus topic subscription details -->\n\nThe Azure MCP Server can retrieve runtime details about a subscription within a Service Bus topic, including message counts.\n\nExample prompts include:\n\n- **Details subscription**: \"Show me details about subscription 'mobile-app' in topic 'notifications' in namespace 'app-messaging'.\"\n- **Subscription info**: \"What's the status of subscription 'admin' in topic 'system-updates' in namespace 'messaging-hub'?\"\n- **Check subscription**: \"Get message count for subscription 'premium-users' in topic 'offers' in namespace 'retail-messaging'\"\n- **Subscription status**: \"Show me details for subscription 'email-service' in topic 'notifications' in namespace 'app-messaging'\"\n- **View subscription**: \"Tell me about subscription 'analytics' in topic 'events' in namespace 'data-messaging'\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Namespace** | Required | The fully qualified Service Bus namespace host name. |\n| **Topic name** | Required | The name of the topic containing the subscription. |\n| **Topic subscription name** | Required | The name of the topic subscription. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Service Bus](/azure/service-bus-messaging/service-bus-messaging-overview)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-service-fabric.md",
    "content": "---\ntitle: Azure Service Fabric tools for the Azure MCP Server overview\ndescription: Learn about the tools available in Azure Service Fabric for managing microservices and containerized applications as part of the Azure MCP Server.\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 02/18/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.reviewer: anuchan\ntool_count: 2\nmcp-cli.version: 2.0.0-beta.20+6836f5da0f4b4aac4abadd186fbcf8c4dd7743f9\n---\n\n# Azure Service Fabric tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage microservices and containerized applications, including deployment, scaling, and monitoring, with natural language prompts.\n\nService Fabric is a distributed systems platform that makes it easy to package, deploy, and manage scalable and reliable microservices and containers. For more information, see [Azure Service Fabric documentation](/azure/service-fabric/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get managed cluster node details\n\n<!-- @mcpcli servicefabric managedcluster node get -->\n\nGet nodes for a Service Fabric managed cluster. By default, this command returns all nodes. You can also specify a node name to retrieve details for a single node. The output includes the name, node type, status, IP address, fault domain, upgrade domain, health state, and seed node status.\n\nExample prompts include:\n- \"Get all nodes for the managed cluster `myManagedCluster` in resource group `rg-prod`.\"\n- \"Show me the nodes for the Service Fabric managed cluster `testCluster` within resource group `rg-dev`.\"\n- \"What is the status of node `node1` in managed cluster `myCluster` located in resource group `rg-test`?\"\n- \"I need details for the node named `node2` from the managed cluster `productionCluster` in resource group `rg-prod`.\"\n- \"List the nodes for the Service Fabric managed cluster `stagingCluster` within resource group `rg-staging`.\"\n\n| Parameter          | Required or optional | Description                                                           |\n|--------------------|----------------------|-----------------------------------------------------------------------|\n| **Cluster**        | Required             | Service Fabric managed cluster name.                                  |\n| **Resource group** | Required             | The name of the Azure resource group, which is a logical container for Azure resources. |\n| **Node**           | Optional             | The node name. When specified, this parameter returns a single node instead of all nodes. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Restart managed cluster nodes based on type\n\n<!-- @mcpcli servicefabric managedcluster nodetype restart -->\n\nRestart nodes of a specific node type in a Service Fabric managed cluster. \n\nExample prompts include:\n- \"Restart nodes `node1` and `node2` of node type `frontend` in managed cluster `myservicefabric` within resource group `rg-prod`.\"\n- \"I need to restart the nodes `node3` and `node4` of the `backend` node type in the `mycluster` managed cluster located in resource group `rg-dev`.\"\n- \"Can you restart all nodes of type `worker` in managed cluster `mycluster` that are located in resource group `rg-staging`?\"\n- \"Restart nodes `node5` and `node6` of node type `database` in managed cluster `clustername` under resource group `rg-production`?\"\n- \"Restart the nodes `node7` and `node8` of `app` node type in managed cluster `servicefabriccluster` under resource group `rg-test` and use update type `ByUpgradeDomain`.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Cluster** | Required | Service Fabric managed cluster name. |\n| **Node type** | Required | The node type name within the managed cluster. |\n| **Nodes** | Required | The list of node names to restart. You can provide multiple node names. |\n| **Resource group** | Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Update type** | Optional | The update type for the restart operation. Update types include: `Default` or `ByUpgradeDomain`.|\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Service Fabric documentation](/azure/service-fabric/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-signalr.md",
    "content": "---\ntitle: Azure SignalR Tools - Azure MCP Server\ndescription: Learn how to use the Azure MCP Server with Azure SignalR to manage your real-time messaging and communication services.\nai-usage: ai-assisted\ncontent_well_notification: \n  - AI-contribution\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 02/27/2026\n---\n\n# Azure SignalR tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage Azure resources, including Azure SignalR resources, using natural language prompts. This feature lets you quickly manage your SignalR resources without remembering complex syntax.\n\n[Azure SignalR](/azure/azure-signalr) is a fully managed real-time messaging service that enables you to build and integrate real-time communication into your applications.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Runtime: Get or list runtime information\n\n<!-- signalr runtime get -->\n\nGets or lists details of an Azure SignalR runtimes. If a specific SignalR name is used, the details of that\nSignalR runtime will be retrieved. Otherwise, all SignalR runtimes in the specified subscription or resource\ngroup will be retrieved. Returns runtime information including identity, network ACLs, upstream templates.\n\nExample prompts include:\n\n- **Get specific SignalR details**: \"Show me the details of SignalR 'my-signalr-service'\"\n- **Network information**: \"Show me the network information of SignalR runtime 'chat-signalr'\"\n- **Resource group specific**: \"Describe the SignalR runtime 'realtime-hub' in resource group 'messaging-rg'\"\n- **Detailed runtime info**: \"Get information about my SignalR runtime 'notification-service' in 'production-rg'\"\n- **List by resource group**: \"Show all the SignalRs information in 'communication-rg'\"\n- **Subscription-wide listing**: \"List all SignalRs in my subscription\"\n- **Production environment**: \"Show details of SignalR runtime 'prod-signalr-001' in resource group 'prod-messaging'\"\n- **Development setup**: \"Get runtime information for SignalR 'dev-chat-service' in 'development-rg'\"\n- **Gaming application**: \"Show me the details of SignalR 'game-hub' used for real-time gaming\"\n- **IoT messaging**: \"Display network ACLs and upstream templates for SignalR 'iot-signalr' in 'iot-resources'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Signalr** |  Optional | The name of the SignalR runtime. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure SignalR](/azure/azure-signalr)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-sql.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure SQL Database\ndescription: \"Use Azure MCP Server tools to manage Azure SQL databases, servers, elastic pools, and firewall rules with natural language prompts from your IDE.\"\nai-usage: ai-assisted\ncontent_well_notification: \n  - AI-contribution\nauthor: diberry\nms.author: diberry\nreviewer: akromm\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 04/09/2026\ntool_count: 13\nmcp-cli.version: 2.0.0-beta.31\n---\n\n# Azure MCP Server tools for Azure SQL Database\n\nThe Azure MCP Server lets you manage Azure SQL Database resources, including creating, deleting, updating, and listing databases, with natural language prompts.\n\nAzure SQL Database is a relational database service in the Microsoft Azure cloud that provides high availability, scalability, and security. For more information, see [Azure SQL Database documentation](/azure/sql-database/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Create SQL Database\n\n<!-- @mcpcli sql db create -->\n\nCreate a new Azure SQL Database on an existing SQL Server. Create a database with configurable performance tiers, size limits, and other settings. It returns the newly created database information, including configuration details.\n\nExample prompts include:\n- \"Create a SQL database named 'my-database' with SKU tier Premium in server 'my-sql-server'.\"\n- \"Create a new SQL database called 'products-db' in resource group 'my-resource-group' on server 'my-sql-server'.\"\n- \"Create a SQL database 'reports-db' with a maximum size of 2GB in server 'my-sql-server'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Database name** |  Required | The Azure SQL Database name. |\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name** |  Required | The Azure SQL Server name. |\n| **Collation** |  Optional | The collation for the database (for example, `SQL_Latin1_General_CP1_CI_AS`). |\n| **Elastic pool name** |  Optional | The name of the elastic pool to assign the database to. |\n| **Max size bytes** |  Optional | The maximum size of the database in bytes. |\n| **Read scale** |  Optional | Read scale option for the database (Enabled or Disabled). |\n| **SKU capacity** |  Optional | The SKU capacity (DTU or vCore count) for the database. |\n| **SKU name** |  Optional | The SKU name for the database (for example, `Basic`, `S0`, `P1`, `GP_Gen5_2`). |\n| **SKU tier** |  Optional | The SKU tier for the database (for example, `Basic`, `Standard`, `Premium`, `GeneralPurpose`). |\n| **Zone redundant** |  Optional | Indicates whether the database should be zone redundant. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Create SQL Server\n\n<!-- @mcpcli sql server create -->\n\nCreate a new Azure SQL server in the specified resource group and location. The server is configured with the provided administrator credentials and optional settings. The command returns the created server along with its properties, including the fully qualified domain name.\n\nExample prompts include:\n- \"Create an Azure SQL server named 'my-sql-server' in location 'eastus' with admin login 'sqladmin'.\"\n- \"Set up a new SQL server called 'prod-sql-server' in resource group 'my-resource-group' with your administrator password.\"\n- \"Create a SQL server with name 'dev-sql-server' in resource group 'dev-resource-group' located in 'westus2'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Administrator login** |  Required | The administrator login name for the SQL server. |\n| **Administrator password** |  Required | The administrator password for the SQL server. |\n| **Location** |  Required | The Azure region where the SQL server will be created. |\n| **Resource group** |  Required | The name of the Azure resource group, which is a logical container for Azure resources. |\n| **Server name** |  Required | The Azure SQL Server name. |\n| **Public network access** |  Optional | Whether public network access is enabled for the SQL server (`Enabled` or `Disabled`). |\n| **Version** |  Optional | The version of SQL Server to create (currently only `12.0` is supported). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Create SQL Server firewall rule\n\n<!-- @mcpcli sql server firewall-rule create -->\n\nCreates a firewall rule for an Azure SQL Server. Firewall rules control which IP addresses are allowed to connect to the SQL Server. You can specify either a single IP address (by setting the start and end IP to the same value) or a range of IP addresses. This command returns the created firewall rule with its properties.\n\nExample prompts include:\n- \"Create a firewall rule named 'allow-office-ip' for SQL Server 'my-sql-server' in resource group 'my-resource-group'.\"\n- \"Add a firewall rule for SQL Server 'my-sql-server' allowing IP range '203.0.113.0' to '203.0.113.255'.\"\n- \"Create a new firewall rule for Azure SQL Server 'prod-sql-server' with IP limits from '198.51.100.0' to '198.51.100.255'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **End IP address** |  Required | The end IP address of the firewall rule range. |\n| **Firewall rule name** |  Required | The name of the firewall rule. |\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name** |  Required | The Azure SQL Server name. |\n| **Start IP address** |  Required | The start IP address of the firewall rule range. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Delete SQL Database\n\n<!-- @mcpcli sql db delete -->\n\nDeletes a database from an Azure SQL Server. This idempotent operation removes the specified database from the server, returning `Deleted = false` if the database doesn't exist or `Deleted = true` if it was successfully removed.\n\nExample prompts include:\n- \"Delete the SQL database 'my-database' from server 'my-sql-server'.\"\n- \"Remove the database 'old-database' from resource group 'my-resource-group' on server 'my-sql-server'.\"\n- \"Delete the database 'test-database' from SQL server 'dev-sql-server'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Database name** |  Required | The Azure SQL Database name. |\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name** |  Required | The Azure SQL Server name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Delete SQL Server\n\n<!-- @mcpcli sql server delete -->\n\nRemove the specified Azure SQL server from your Azure subscription, including all associated databases. This operation permanently deletes all server data and cannot be reversed. Use `force` to bypass confirmation.\n\nExample prompts include:\n- \"Delete SQL server 'my-sql-server' in resource group 'my-resource-group'.\"\n- \"Remove the Azure SQL server 'old-sql-server' from my resource group.\"\n- \"Permanently delete SQL server 'test-sql-server' without confirmation.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name** |  Required | The Azure SQL Server name. |\n| **Force** |  Optional | Force delete the server without confirmation prompts. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Delete SQL Server firewall rule\n\n<!-- @mcpcli sql server firewall-rule delete -->\n\nDelete a firewall rule from an Azure SQL Server. This operation removes the specified firewall rule, which may restrict access for the IP addresses that were previously allowed by this rule. The operation is idempotent; if the rule does not exist, no error is returned.\n\nExample prompts include:\n- \"Delete the firewall rule 'allow-office-ip' from resource group 'my-resource-group' in SQL server 'my-sql-server'.\"\n- \"Remove firewall rule 'temp-access-rule' for SQL server 'my-sql-server' in resource group 'my-resource-group'.\"\n- \"Delete firewall rule 'old-firewall-rule' from my SQL server 'dev-sql-server'.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Firewall rule name** | Required | The name of the firewall rule. |\n| **Resource group** | Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name** | Required | The Azure SQL Server name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Get Azure SQL Database details\n\n<!-- @mcpcli sql db get -->\n\nRetrieve information about Azure SQL databases in a SQL Server. You can show details for a specific Azure SQL database by name or list all Azure SQL databases within the specified SQL Server. This tool provides database information, including configuration details and current status.\n\nExample prompts include:\n- \"List all databases in resource group 'my-rg' for server 'my-server'.\"\n- \"Get details for the Azure SQL database 'my-database' in resource group 'my-rg' and server 'my-server'.\"\n- \"Show all Azure SQL databases in resource group 'my-rg' within server 'my-server'.\"\n- \"Retrieve the Azure SQL database 'my-database' from resource group 'my-rg' in server 'my-server'.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name** | Required | The Azure SQL Server name. |\n| **Database name** | Optional | The Azure SQL Database name. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get elastic pool list\n\n<!-- @mcpcli sql elastic-pool list -->\n\nLists all SQL elastic pools in an Azure SQL Server, including their SKU, capacity, state, and database limits. You can view the elastic pool inventory, check pool utilization, compare pool configurations, or find available pools for database placement. The tool returns a JSON array of elastic pools with complete configuration details.\n\nExample prompts include:\n- \"List all elastic pools in resource group 'my-resource-group' for SQL server 'my-sql-server'.\"\n- \"Show me the elastic pools in resource group 'prod-resource-group' for SQL server 'prod-sql-server'.\"\n- \"What elastic pools exist in my SQL server 'dev-sql-server' under resource group 'dev-resource-group'?\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name** |  Required | The Azure SQL Server name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get firewall rule list\n\n<!-- @mcpcli sql server firewall-rule list -->\n\nRetrieve a list of firewall rules for an Azure SQL Server. This command retrieves all firewall rules configured for the specified SQL server, including their IP address ranges and rule names. It returns an array of firewall rule objects with their properties.\n\nExample prompts include:\n- \"List all firewall rules in resource group 'my-resource-group' for SQL server 'my-sql-server'.\"\n- \"Show me the firewall rules in resource group 'prod-resource-group' for SQL server 'prod-sql-server'.\"\n- \"What firewall rules are set for SQL server 'dev-sql-server' in resource group 'dev-resource-group'?\"\n\n| Parameter       | Required or optional | Description                                                                        |\n|------------------|----------------------|------------------------------------------------------------------------------------|\n| **Resource group** | Required             | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name**        | Required             | The name of the Azure SQL Server.                                                  |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Get SQL server information\n\n<!-- @mcpcli sql server get -->\n\nRetrieve details about Azure SQL servers in a resource group. Display information for a specific Azure SQL server by name or list all Azure SQL servers within the specified resource group. It returns comprehensive server information, including configuration details and the current state.\n\nExample prompts include:\n- \"List all Azure SQL servers in resource group 'my-resource-group'.\"\n- \"Show me every Azure SQL server in resource group 'prod-resource-group'.\"\n- \"Show me the details of Azure SQL server 'my-sql-server'.\"\n- \"Get information for Azure SQL server 'prod-sql-server'.\"\n- \"Display the properties of Azure SQL server 'dev-sql-server'.\"\n\n| Parameter         | Required or optional | Description |\n|-------------------|----------------------|-------------|\n| **Resource group** | Required             | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name**        | Optional             | The Azure SQL server name. |\n\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## List Microsoft Entra ID administrators\n\n<!-- @mcpcli sql server entra-admin list -->\n\nList the Microsoft Entra ID administrators configured for a SQL server. This command retrieves all Entra ID administrators, including their display names, object IDs, and tenant information.\n\nExample prompts include:\n\n- \"List Microsoft Entra ID administrators for SQL server 'prod-sql-server' in resource group 'prod-resource-group'.\"\n- \"Show me the Entra ID administrators configured for SQL server 'dev-sql-server' in resource group 'dev-resource-group'.\"\n- \"What Microsoft Entra ID administrators are set up for my SQL server 'analytics-sql-server' in resource group 'data-resource-group'?\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Resource group** | Required | The name of the Azure resource group. |\n| **Server name** | Required | The Azure SQL Server name (for example, `prod-sql-server`). |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Rename SQL Database\n\n<!-- @mcpcli sql db rename -->\n\nRenames an existing Azure SQL Database to a new name within the same SQL Server. This command changes the database resource's identifier while preserving its configuration and data. It returns the updated database information with the new name.\n\nExample prompts include:\n- \"Rename the database 'my-database' on server 'my-sql-server' to 'my-database-v2' in resource group 'my-resource-group'.\"\n- \"Rename my SQL database 'old-database' to 'new-database' on server 'prod-sql-server'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Database name** |  Required | The Azure SQL Database name. |\n| **New database name** |  Required | The new name for the Azure SQL Database. |\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name** |  Required | The Azure SQL Server name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Update SQL Database\n\n<!-- @mcpcli sql db update -->\n\nScale and configure Azure SQL Database performance settings. Update an existing database's SKU, compute tier, storage capacity, or redundancy options to meet changing performance requirements. This command returns the updated database configuration, including applied scaling changes.\n\nExample prompts include:\n- \"Change the collation of SQL database 'my-database' on server 'my-sql-server' in resource group 'my-resource-group'.\"\n- \"Update SQL database 'my-database' on server 'my-sql-server' to have a maximum size of 2GB.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Database name** |  Required | The Azure SQL Database name. |\n| **Resource group** |  Required | The name of the Azure resource group. This is a logical container for Azure resources. |\n| **Server name** |  Required | The Azure SQL Server name. |\n| **Collation** |  Optional | The collation for the database (for example, `SQL_Latin1_General_CP1_CI_AS`). |\n| **Elastic pool name** |  Optional | The name of the elastic pool to assign the database to. |\n| **Max size bytes** |  Optional | The maximum size of the database in bytes. |\n| **Read scale** |  Optional | Read scale option for the database (Enabled or Disabled). |\n| **SKU capacity** |  Optional | The SKU capacity (DTU or vCore count) for the database. |\n| **SKU name** |  Optional | The SKU name for the database (for example, `Basic`, `S0`, `P1`, `GP_Gen5_2`). |\n| **SKU tier** |  Optional | The SKU tier for the database (for example, `Basic`, `Standard`, `Premium`, `GeneralPurpose`). |\n| **Zone redundant** |  Optional | Whether the database should be zone redundant. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ✅ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure SQL Database documentation](/azure/sql-database/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-storage.md",
    "content": "---\ntitle: Azure Storage Tools \ndescription: \"Learn how to use Azure MCP Server with Azure Storage tools to manage storage accounts, containers, blobs, and tables using natural language prompts.\"\nauthor: diberry\nms.author: diberry\nms.date: 01/27/2026\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\nreviewers: alzimmermsft, jongio, xiangyan99\n--- \n\n# Azure Storage tools for the Azure MCP Server overview\n\nThe Azure MCP Server lets you manage Azure Storage resources, including storage accounts, containers, blobs, and tables with natural language prompts.\n\n[Azure Storage](/azure/storage/common/storage-introduction) is Microsoft's cloud storage solution for modern data storage scenarios.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Account: Create\n\n<!-- storage account create -->\n\nCreate a new Azure Storage account.\n\n**Prerequisites**: The conversation context establishes [global parameters](index.md#tool-parameters) (subscription, resource group). Caller must have Storage Account Contributor role or equivalent permissions on the target subscription.\n\nExample prompts include:\n\n- **Create storage account**: \"Create a storage account named 'mystorageaccount' in resource group 'my-resource-group' in location 'eastus'.\"\n- **With SKU**: \"Create a storage account 'mydata' in resource group 'my-resource-group' in location 'eastus' with Standard_GRS.\"\n- **Enable Data Lake**: \"Create a storage account 'datalakeacct' in resource group 'my-resource-group' in location 'westeurope' with hierarchical namespace enabled.\"\n\n| Parameter | Required or optional | Description |\n|-----------------------------|----------------------|-------------|\n| **Resource group** |  Required | The name of the Azure resource group. The resource group is a logical container for Azure resources. |\n| **Storage account** |  Required |The globally unique name of the Azure Storage account (3-24 characters, lowercase letters, and numbers only). |\n| **Location** |  Required | The Azure region where Azure creates the storage account (for example, `eastus`, `westus2`). |\n| **SKU** |  Optional | The storage account SKU. Valid values: `Standard_LRS`, `Standard_GRS`, `Standard_RAGRS`, `Standard_ZRS`, `Premium_LRS`, `Premium_ZRS`, `Standard_GZRS`, `Standard_RAGZRS`. |\n| **Access tier** |  Optional | The default access tier for blob storage. Valid values: `Hot`, `Cool`. |\n| **Enable hierarchical namespace** |  Optional | Whether to enable hierarchical namespace (Data Lake Storage Gen2) for the storage account. |\n\n**Success verification**: The tool returns the created storage account details.\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n## Account: Get details\n\n<!-- storage account get -->\n\nRetrieves detailed information about Azure Storage accounts, including account name, location, SKU, kind, hierarchical namespace status, HTTPS-only settings, and blob public access configuration. If you don't provide a specific account name, the tool returns details for all accounts in the subscription.\n\n**Prerequisites**: The conversation context establishes [global parameters](index.md#tool-parameters) (subscription, authentication). Caller must have Storage Account Reader role or equivalent permissions.\n\nExample prompts include:\n\n- **Get storage account details**: \"Show me details for the storage account 'mystorageaccount'.\"\n- **List all accounts**: \"What storage accounts are in my subscription?\"\n- **Check properties**: \"What are the settings for storage account 'mydata'?\"\n\n| Parameter | Required or optional | Description |\n|-----------|----------|-------------|\n| **Storage account** | Optional | The globally unique name of the Azure Storage account (for example, 'mystorageaccount'). |\n\n**Success verification**: Returns JSON with storage account properties or a list of all accounts if you don't specify a name.\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Container: Create container\n\n<!-- storage blob container create -->\n\nCreate a blob container with optional blob public access.\n\n**Prerequisites**: The conversation context establishes [global parameters](index.md#tool-parameters) (subscription, authentication). Caller must have Storage Blob Data Contributor role or equivalent on the storage account.\n\nExample prompts include:\n\n- **Create container**: \"Create a private container named 'mycontainer' in storage account 'mystorageaccount'.\"\n- **With access level**: \"Create a blob container named 'logs' in storage account 'mydata' with access level 'private'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|----------|-------------|\n| **Storage account** |  Required | The globally unique name of the Azure Storage account (for example, 'mystorageaccount'). |\n| **Container** |  Required | The name of the container to create within the storage account. |\n\n**Success verification**: The tool returns the created container properties.\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ✅ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ❌\n\n\n## Container: Get container details\n\n<!-- storage blob container get -->\n\nList all blob containers in a storage account or show details for a specific container. Displays container properties including access policies, lease status, and metadata.\n\n**Prerequisites**: The conversation context establishes [global parameters](index.md#tool-parameters) (subscription, authentication). Caller must have Storage Blob Data Reader role or equivalent on the storage account.\n\nExample prompts include:\n\n- **Get container details**: \"Show me details about the 'documents' container in storage account 'mystorageaccount'.\"\n- **List containers**: \"What containers are in storage account 'media_files'?\"\n- **Check access policy**: \"Check access policy for container 'user_data' in storage account 'prodstore'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Storage account** | Required | The globally unique name of the Azure Storage account. |\n| **Container** | Optional | The name of the container. If you don't specify a name, the tool lists all containers in the storage account. |\n\n**Success verification**: Returns JSON with container properties or a list of all containers if you don't specify a name.\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Blob: Get blob details\n\n<!-- storage blob get -->\n\nList blobs in a container or get details for a specific blob. Shows blob properties including metadata, size, last modification time, and content properties.\n\n**Prerequisites**: The conversation context establishes [global parameters](index.md#tool-parameters) (subscription, authentication). Caller must have Storage Blob Data Reader role or equivalent on the storage account.\n\nExample prompts include:\n\n- **Get blob details**: \"Show me details for 'file.txt' in container 'documents' in storage account 'mystorageaccount'.\"\n- **List blobs**: \"What blobs are in container 'photos' in storage account 'mediafiles'?\"\n- **Blob metadata**: \"What is the metadata for 'backup.zip' in container 'backups' in storage account 'mydata'?\"\n\n| Parameter | Required or optional | Description |\n|-----------------------------|----------------------|-------------|\n| **Storage account** | Required | The globally unique name of the Azure Storage account (for example, 'mystorageaccount'). |\n| **Container** | Required | The name of the container within the storage account. |\n| **Blob** | Optional | The name of the blob within the container, including the full path (for example, `file.txt` or `folder/file.txt`). If you don't specify a name, the tool lists all blobs in the container. |\n\n**Success verification**: Returns JSON with blob properties or a list of all blobs if you don't specify a name.\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Blob: Upload\n\n<!-- storage blob upload -->\n\nUploads a local file to a blob in Azure Storage if the blob doesn't exist.\n\n**Prerequisites**: The conversation context establishes [global parameters](index.md#tool-parameters) (subscription, authentication). Caller must have Storage Blob Data Contributor role or equivalent on the storage account. Local file must exist and be accessible.\n\nExample prompts include:\n\n- **Upload file**: \"Upload local file 'report.pdf' to blob 'documents/report.pdf' in container 'documents' in storage account 'mystorageaccount'.\"\n- **Upload and overwrite**: \"Upload local file 'data.csv' to blob 'archive/data.csv' in container 'archive' in storage account 'mydata', overwriting if it exists'.\"\n\n| Parameter |  Required or optional| Description |\n|-----------|----------|-------------|\n| **Storage account** |  Required | The globally unique name of the Azure Storage account (for example, `mystorageaccount`). |\n| **Container** |  Required | The name of the container within the storage account. |\n| **Blob** | Required | The name of the blob within the container, including the full path (for example, `file.txt` or `folder/file.txt`). |\n| **Local file path** | Required | The full path to the local file on your system. |\n\n**Success verification**: The tool returns the last modified time, ETag, and content hash of the uploaded blob.\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ❌ | Open World: ❌ | Read Only: ❌ | Secret: ❌ | Local Required: ✅\n\n## Table: List\n\n<!-- storage table list -->\n\nList all tables in an Azure Storage account. \n\n**Prerequisites**: The conversation context establishes [global parameters](index.md#tool-parameters) (subscription, authentication). Caller must have Storage Account Reader role or equivalent permissions.\n\nExample prompts include:\n\n- \"Show me all tables in storage account 'dataarchives'\"\n- \"List every table in storage account 'storagesample01'\"\n- \"Get details for table 'UserLogs' in storage account 'appstorage01'\"\n- \"I need to see the table named 'InventoryRecords' in storage account 'warehouseacct'\"\n- \"Can you provide the tables inside storage account 'mystorageaccount'\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Storage account** |  Required | The name of the Azure Storage account. This is the unique name you chose for your storage account (for example, `mystorageaccount`). |\n\n**Success verification**: The tool returns the list of tables in the specified storage account.\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n---\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Storage](/azure/storage/common/storage-introduction)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-terraform-best-practices.md",
    "content": "---\ntitle: Terraform best practices for Azure - Azure MCP Server\ndescription: Use the Azure Terraform best practices tool in Azure MCP Server to get guidance on implementing Terraform for Azure resources.\nms.service: azure-mcp-server\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.date: 02/27/2026\nauthor: diberry\nms.author: diberry\n---\n\n# Terraform best practices for Azure tools for the Azure MCP Server overview\n\nThis article describes the Terraform best practices for Azure tool available in Azure MCP Server. The tool provides guidance for implementing Infrastructure as Code (IaC) with Terraform in Azure environments.\n\nTerraform best practices for Azure help you implement secure, scalable, and maintainable infrastructure configurations by using recommended patterns and practices from Microsoft.\n\n## Get best practices\n\n<!-- azureterraformbestpractices get -->\n\nReturns best practices for implementing Terraform with Azure. Use this tool to get guidance on creating secure, scalable, and maintainable infrastructure as code for Azure resources.\n\nExample prompts include:\n\n- **General best practices**: \"What are the best practices for using Terraform with Azure?\"\n- **Implementation guidance**: \"Show me guidance for implementing Azure resources with Terraform\"\n- **Module structure**: \"How should I structure my Terraform modules for Azure?\"\n- **State management**: \"What are the recommended patterns for managing state files in Azure Terraform projects?\"\n- **Secure infrastructure**: \"I need help implementing secure Azure infrastructure using Terraform\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related resources\n\n- [Terraform on Azure documentation](/azure/developer/terraform/)\n- [Azure Architecture Center - Best practices in cloud applications](/azure/architecture/best-practices/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-virtual-desktop.md",
    "content": "---\ntitle: Azure Virtual Desktop Tools\ndescription: Learn how to use the Azure MCP Server with Azure Virtual Desktop.\nauthor: diberry\nms.author: diberry\nms.date: 12/06/2025\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.topic: concept-article\nms.custom: build-2025\n---\n\n# Azure Virtual Desktop tools for the Azure MCP Server overview\n\nThe Azure MCP Server enables you to manage Azure Virtual Desktop resources by using natural language prompts. You can list host pools, view session hosts, monitor user sessions, and manage your virtual desktop infrastructure without needing to remember complex command syntax.\n\n[Azure Virtual Desktop](/azure/virtual-desktop/overview) is a desktop and app virtualization service that runs on the cloud. It provides a full Windows experience with optimized Office 365 ProPlus, and supports Remote Desktop Services environments.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Conditional parameters\n\nSome of the Azure Virtual Desktop tools require **one** of the following parameter options within the conversation context:\n\n- **Option 1**: Host pool name\n- **Option 2**: Host pool resource ID\n\nDon't provide both parameters (host pool name and host pool resource ID) together, because this combination creates conflicting inputs. When you provide a host pool resource ID, the tool uses it instead of searching by name.\n\n## Host pools: List host pools\n\n<!-- virtualdesktop hostpool list -->\n\nThe Azure MCP Server can list all host pools in a subscription or resource group. This feature provides an overview of your virtual desktop infrastructure and helps you manage your desktop deployment.\n\nExample prompts include:\n\n- **List all host pools**: \"Show me all host pools in my subscription.\"\n- **View host pools**: \"What host pools do I have available?\"\n- **Find host pools**: \"List all virtual desktop host pools.\"\n- **Query host pools**: \"Show available host pools in my environment.\"\n- **Check infrastructure**: \"Get all Azure Virtual Desktop host pools.\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Host pools: List session hosts in a host pool\n\n<!-- virtualdesktop hostpool host list -->\n\nThe Azure MCP Server can list all session hosts in a host pool. This functionality helps you monitor your virtual machines and understand the capacity and status of your virtual desktop environment.\n\nExample prompts include:\n\n- **List session hosts**: \"Show me all session hosts in the 'production-hostpool' host pool.\"\n- **View VMs**: \"What session hosts are in my host pool?\"\n- **Find hosts**: \"List all virtual machines in hostpool 'dev-environment'.\"\n- **Query capacity**: \"Show session hosts in my virtual desktop pool.\"\n- **Check hosts**: \"Get all session hosts for host pool ID '/subscriptions/abc123/resourceGroups/rg/providers/Microsoft.DesktopVirtualization/hostPools/pool1'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Host pool** | [Conditionally](#conditional-parameters) required | The name of the Azure Virtual Desktop host pool. This is the unique name you choose for your host pool. |\n| **Host pool resource ID** | [Conditionally](#conditional-parameters) required | The Azure resource ID of the host pool. When you provide this ID, the server uses it instead of searching by name. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Host pools: List user sessions\n\n<!-- virtualdesktop hostpool host user-list -->\n\nThe Azure MCP Server can list all user sessions on a specific session host in a host pool. This capability helps you monitor active users, troubleshoot connection issues, and manage user workloads.\n\nExample prompts include:\n\n- **List user sessions**: \"Show me all user sessions on session host 'vm-prod-001' in host pool 'production-pool'.\"\n- **View active users**: \"What users are connected to session host 'desktop-vm-02' in host pool 'dev-pool'?\"\n- **Find sessions**: \"List all active sessions on session host 'avd-host-001' in host pool 'test-pool'.\"\n- **Monitor users**: \"Show user sessions for session host 'vm-host-05' in host pool 'production-pool'.\"\n- **Check connections**: \"Get all user sessions on session host 'session-host-03' in host pool 'main-pool'.\"\n\n| Parameter | Required or optional | Description |\n|-----------|-------------|-------------|\n| **Host pool** | [Conditionally](#conditional-parameters) required | The name of the Azure Virtual Desktop host pool. This is the unique name you choose for your host pool. |\n| **Host pool resource ID** | [Conditionally](#conditional-parameters) required | The Azure resource ID of the host pool. When you provide this ID, the server uses it instead of searching by name. |\n| **Session host** | Required | The name of the session host. This name is the computer name of the virtual machine in the host pool. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Virtual Desktop documentation](/azure/virtual-desktop/)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/azure-well-architected-framework.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure Well-Architected Framework\ndescription: Use Azure MCP Server tools to get Azure Well-Architected Framework guidance, best practices, and recommendations for Azure services with natural language prompts from your IDE.\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 03/27/2026\nreviewer: skakara\ncontent_well_notification:\n  - AI-contribution\nai-usage: ai-assisted\ntool_count: 1\nmcp-cli.version: 2.0.0-beta.33\n---\n\n# Azure MCP Server tools for Azure Well-Architected Framework\n\nThe Azure Model Context Protocol (MCP) Server lets you get Azure Well-Architected Framework guidance, best practices, and recommendations for Azure services with natural language prompts.\n\nAzure Well-Architected Framework is a set of guiding tenets that help you design, build, and optimize workloads across five pillars: reliability, security, cost optimization, operational excellence, and performance efficiency; for more information, see [Azure Well-Architected Framework documentation](/azure/architecture/framework/).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## Get Well-Architected Framework service guide\n\n<!-- @mcpcli wellarchitectedframework serviceguide get -->\n\nThis tool retrieves Azure Well-Architected Framework guidance for a specific Azure service, or lists all supported services when no service is specified. When you provide a service, the tool returns architectural best practices, design patterns, and recommendations across the five pillars: reliability, security, cost optimization, operational excellence, and performance efficiency.\n\nExample prompts include:\n\n- \"Show all services with Well-Architected Framework guidance.\"\n- \"Which services have architectural guidance under the Well-Architected Framework?\"\n- \"Retrieve Well-Architected Framework guidance for service 'App Service'.\"\n- \"What's the WAF guidance for service 'Cosmos DB'?\"\n- \"Show the architectural guidance for 'Azure Functions'.\"\n\n| Parameter |  Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Service** |  Optional | A single Azure service name. The value is case-insensitive and accepts hyphens, underscores, and spaces. If the name contains spaces, enclose it in double quotes. Examples: `cosmos-db`, `Cosmos_DB`, `Cosmos DB`, `cosmosdb`, `cosmos-database`. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Well-Architected Framework documentation](/azure/architecture/framework/)"
  },
  {
    "path": "articles/azure-mcp-server/tools/index.md",
    "content": "---\ntitle: Azure MCP Server tools\ndescription: Learn how to use the Azure MCP Server tools for consuming servers.\nauthor: diberry\nms.author: diberry\nms.date: 02/27/2026\nms.topic: overview\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\nms.custom: build-2025\n---\n\n# What are the Azure MCP Server tools?\n\nThe Azure Model Context Protocol (MCP) Server exposes many tools you can use from an existing [client](../get-started.md#use-a-code-editor) to interact with Azure services through natural language prompts. For example, you can use the Azure MCP Server to interact with Azure resources conversationally from GitHub Copilot agent mode in Visual Studio Code or other AI agents with commands like these:\n\n- \"Show me all my resource groups\"\n- \"List blobs in my storage container named 'documents'\"\n- \"What's the value of the 'ConnectionString' key in my app configuration?\"\n- \"Query my log analytics workspace for errors in the last hour\"\n- \"Show me all my Cosmos DB databases\"\n\n## Developer credentials and security\n\n[!INCLUDE [security-developer-environment](../includes/security-local-development.md)]\n\n[!INCLUDE [server start options](../includes/tools/server-start-options.md)]\n\n[!INCLUDE [global-params](../includes/tools/global-parameters-list.md)]\n\n[!INCLUDE [tool-annotations-hints](../includes/tools/tool-annotation-hints.md)]\n\n## User confirmation for sensitive data\n\n[!INCLUDE [user-consent](../includes/tools/user-consent.md)]\n\n[!INCLUDE [supported-azure-services](../includes/tools/supported-azure-services.md)]\n\n## Related content\n\n- [What is the Azure MCP Server?](../get-started.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure MCP Server repository](https://github.com/microsoft/mcp/tree/main/servers/Azure.Mcp.Server)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/resource-group.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure Resource Group\ndescription: Use Azure MCP Server tools to manage Azure resource groups and their resources with natural language prompts from your IDE.\nms.date: 03/27/2026\nms.service: azure-mcp-server\nms.topic: concept-article\ntool_count: 2\nmcp-cli.version: 2.0.0-beta.33+8fab340d1e64d47701d891b7e81b5def64bbc9f6\nauthor: diberry\nms.author: diberry\nai-usage: ai-generated\nms.custom: build-2025\ncontent_well_notification:\n  - AI-contribution\n---\n\n# Azure MCP Server tools for Azure Resource Group\n\nThe Azure MCP Server lets you manage resource groups and the resources they contain, including: listing resource groups in a subscription and listing resources within a group, with natural language prompts.\n\nAzure Resource Group is the Azure service for organizing and managing related resources as a single lifecycle and access boundary. For more information, see [Azure Resource Group documentation](/azure/azure-resource-manager/management/manage-resource-groups-portal).\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## List resource groups\n\n<!-- @mcpcli group list -->\n\nList all resource groups in a subscription. The tool returns resource group names and IDs as a JSON array, which you can use to inventory or audit resources and to drive follow-up automation.\n\nExample prompts include:\n\n- \"List resource groups in my subscription.\"\n- \"Show my resource groups.\"\n- \"Display resource groups in my subscription.\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## List group resources\n\n<!-- @mcpcli group resource list -->\n\nList all resources in a resource group. The tool retrieves each resource's name, ID, type, and location from Azure Resource Manager and returns a JSON object with a `resources` array containing those fields.\n\nExample prompts include:\n\n- \"List all resources in resource group 'my-rg'.\"\n- \"Show me what resources are in resource group 'webapp-dev'.\"\n- \"What resources exist in resource group 'rg-production'?\"\n\n| Parameter | Required or optional | Description |\n|-----------------------|----------------------|-------------|\n| **Resource group name** | Required | The name of the Azure resource group. A resource group is a logical container for Azure resources. |\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Resource Group documentation](/azure/azure-resource-manager/management/manage-resource-groups-portal)\n"
  },
  {
    "path": "articles/azure-mcp-server/tools/subscription.md",
    "content": "---\ntitle: Azure MCP Server tools for Azure Subscriptions\ndescription: Use Azure MCP Server tools to list and identify Azure subscriptions with natural language prompts from your IDE.\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: concept-article\nms.date: 03/27/2026\ncontent_well_notification:\n  - AI-contribution\nai-usage: ai-assisted\ntool_count: 1\nmcp-cli.version: 2.0.0-beta.33\n---\n\n# Azure MCP Server tools for Azure Subscriptions\n\nThe Azure Model Context Protocol (MCP) Server lets you list and identify Azure subscriptions with natural language prompts.\n\n[Azure Subscriptions](/azure/cost-management-billing/manage/cloud-subscription) provide a way to organize and manage access to Azure resources. Subscriptions are the foundation for resource management, billing, and access control in Azure.\n\n[!INCLUDE [tip-about-params](../includes/tools/parameter-consideration.md)]\n\n## List subscriptions\n\n<!-- @mcpcli subscription list -->\n\nThis tool lists all Azure subscriptions for the current account. For each subscription, it returns the subscription ID, display name, state, tenant ID, and whether it's the default subscription. The `isDefault` field indicates the user's default subscription as resolved from the Azure CLI profile (configured via [`az account set`](/cli/azure/account#az-account-set)) or, if not set there, from the `AZURE_SUBSCRIPTION_ID` environment variable.\n\nExample prompts include:\n\n- \"Show me all of my subscriptions.\"\n- \"List all subscriptions starting with 'northeast'.\"\n- \"Which subscription is my default?\"\n\n[Tool annotation hints](index.md#tool-annotations-for-azure-mcp-server):\n\nDestructive: ❌ | Idempotent: ✅ | Open World: ❌ | Read Only: ✅ | Secret: ❌ | Local Required: ❌\n\n## Related content\n\n- [What are the Azure MCP Server tools?](index.md)\n- [Get started using Azure MCP Server](../get-started.md)\n- [Azure Subscriptions](/azure/cost-management-billing/manage/cloud-subscription)"
  },
  {
    "path": "articles/azure-skills/TOC.yml",
    "content": "- name: Azure Skills\n  href: index.yml\n\n- name: Overview\n  href: overview.md\n- name: Install and configure\n  href: install.md\n- name: Quickstart\n  href: quickstart.md\n- name: Skills reference\n  items:\n  - name: AI Runway AKS Setup\n    href: skills/ai-runway-aks-setup.md\n  - name: App Insights Instrumentation\n    href: skills/app-insights-instrumentation.md\n  - name: Azure AI Gateway\n    href: skills/azure-ai-gateway.md\n  - name: Azure AI Services\n    href: skills/azure-ai.md\n  - name: Azure Cloud Migration\n    href: skills/azure-cloud-migrate.md\n  - name: Azure Compliance\n    href: skills/azure-compliance.md\n  - name: Azure Compute\n    href: skills/azure-compute.md\n  - name: Azure Cost Optimization\n    href: skills/azure-cost.md\n  - name: Azure Deploy\n    href: skills/azure-deploy.md\n  - name: Azure Diagnostics\n    href: skills/azure-diagnostics.md\n  - name: Azure Enterprise Infrastructure Planner\n    href: skills/azure-enterprise-infra-planner.md\n  - name: Azure Hosted Copilot SDK\n    href: skills/azure-hosted-copilot-sdk.md\n  - name: Azure Kubernetes\n    href: skills/azure-kubernetes.md\n  - name: Azure Kusto (Data Explorer)\n    href: skills/azure-kusto.md\n  - name: Azure Messaging\n    href: skills/azure-messaging.md\n  - name: Azure Prepare\n    href: skills/azure-prepare.md\n  - name: Azure Quotas\n    href: skills/azure-quotas.md\n  - name: Azure RBAC\n    href: skills/azure-rbac.md\n  - name: Azure Resource Lookup\n    href: skills/azure-resource-lookup.md\n  - name: Azure Resource Visualizer\n    href: skills/azure-resource-visualizer.md\n  - name: Azure Storage\n    href: skills/azure-storage.md\n  - name: Azure Upgrade\n    href: skills/azure-upgrade.md\n  - name: Azure Validate\n    href: skills/azure-validate.md\n  - name: Entra Agent ID\n    href: skills/entra-agent-id.md\n  - name: Entra App Registration\n    href: skills/entra-app-registration.md\n  - name: Microsoft Foundry\n    href: skills/microsoft-foundry.md\n"
  },
  {
    "path": "articles/azure-skills/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure Skills documentation\nsummary: Azure Skills are agent skills that extend your AI coding assistant with Azure-specific domain knowledge and specialized workflows. Manage resources, deploy applications, and monitor services directly from your development environment.\n\nmetadata:\n  title: Azure Skills documentation\n  description: Learn about Azure Skills, agent skills that extend your AI assistant with Azure-specific workflows for managing resources, deploying apps, and monitoring services.\n  ms.service: azure-mcp-server\n  ms.topic: landing-page\n  ms.date: 04/20/2026\n\nlandingContent:\n  - title: Get started\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: What are Azure Skills?\n            url: overview.md\n      - linkListType: get-started\n        links:\n          - text: Install and configure\n            url: install.md\n          - text: Quickstart\n            url: quickstart.md\n  - title: Skills reference\n    linkLists:\n      - linkListType: reference\n        links:\n          - text: Azure Prepare\n            url: skills/azure-prepare.md\n          - text: Azure Validate\n            url: skills/azure-validate.md\n          - text: Azure Deploy\n            url: skills/azure-deploy.md\n          - text: Azure Diagnostics\n            url: skills/azure-diagnostics.md\n          - text: Azure Cost Optimization\n            url: skills/azure-cost.md\n          - text: Azure Kubernetes\n            url: skills/azure-kubernetes.md\n  - title: Related tools\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Azure MCP Server\n            url: ../azure-mcp-server/overview.md\n          - text: GitHub Copilot for Azure\n            url: ../github-copilot-azure/introduction.md\n"
  },
  {
    "path": "articles/azure-skills/install.md",
    "content": "---\ntitle: Install and configure Azure Skills\ndescription: \"Install, authenticate, and configure Azure Skills to manage Azure resources from your AI assistant.\"\nms.topic: how-to\nms.date: 03/16/2026\nauthor: diberry\nms.author: diberry\nms.reviewer: alexwolf\nms.service: azure-mcp-server\n---\n\n# Install and configure Azure Skills\n\nThis article shows you how to install Azure Skills, authenticate to your Azure account, and verify the installation. After setup, you can manage Azure resources from your chat interface.\n\n## Prerequisites\n\nMake sure you have:\n\n- **Node.js Long Term Support (LTS)**: [Download from nodejs.org](https://nodejs.org) or use a version manager like [nvm](https://github.com/nvm-sh/nvm).\n- **Azure account**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **An AI assistant**: [GitHub Copilot CLI](../github-copilot-azure/introduction.md), Claude Code, or another compatible platform.\n- **Azure CLI** (recommended for local development): Simplifies authentication. [Install Azure CLI](/cli/azure/install-azure-cli). Environment variables or managed identity can be used as alternatives in CI/CD pipelines.\n\n> [!NOTE]\n> Azure Skills uses the same authentication as [Azure MCP Server](../azure-mcp-server/overview.md). If you already authenticated for Azure MCP Server, Azure Skills uses those credentials.\n\n## Authenticate to Azure\n\nAzure Skills needs credentials to access your Azure resources. Choose the method that fits your use case.\n\n### [Azure CLI (recommended)](#tab/azure-cli)\n\nThis method is the easiest for local development and testing.\n\n1. **Install Azure CLI:**\n   - Visit the [Azure CLI installation guide](/cli/azure/install-azure-cli).\n   - Or use a package manager: `brew install azure-cli` (macOS), `apt-get install azure-cli` (Linux).\n\n1. **Sign in to Azure:**\n\n   ```bash\n   az login\n   ```\n\n   A browser window opens. Sign in by using your Azure account credentials.\n\n1. **Verify authentication:**\n\n   ```bash\n   az account show\n   ```\n\n   You see your subscription details in the terminal. Azure Skills detects this authentication.\n\n### [Environment variables](#tab/environment-variables)\n\nUse environment variables for scripts or pipelines where the Azure CLI isn't available. Create a [service principal](/cli/azure/create-an-azure-service-principal-azure-cli) first.\n\n**Bash or Zsh:**\n\n```bash\nexport AZURE_TENANT_ID=\"your-tenant-id\"\nexport AZURE_CLIENT_ID=\"your-client-id\"\nexport AZURE_CLIENT_SECRET=\"your-client-secret\"\n```\n\n**PowerShell:**\n\n```powershell\n$env:AZURE_TENANT_ID = \"your-tenant-id\"\n$env:AZURE_CLIENT_ID = \"your-client-id\"\n$env:AZURE_CLIENT_SECRET = \"your-client-secret\"\n```\n\n**Windows Command Prompt:**\n\n```cmd\nset AZURE_TENANT_ID=your-tenant-id\nset AZURE_CLIENT_ID=your-client-id\nset AZURE_CLIENT_SECRET=your-client-secret\n```\n\nAzure Skills detects these environment variables automatically.\n\n### [Managed identity](#tab/managed-identity)\n\nIf you run Azure Skills on an Azure resource (virtual machine, Container Apps, or Azure Functions), managed identity handles authentication with no manual setup.\n\nFor more information, see [Azure managed identities](/entra/identity/managed-identities-azure-resources/overview).\n\n---\n\n## Install Azure Skills\n\nChoose the installation method for your AI assistant.\n\n### [GitHub Copilot CLI](#tab/copilot-cli)\n\nAdd the marketplace (first time only):\n\n```\n/plugin marketplace add microsoft/azure-skills\n```\n\nInstall the plugin:\n\n```\n/plugin install azure@azure-skills\n```\n\nUpdate the plugin:\n\n```\n/plugin update azure@azure-skills\n```\n\n### [Visual Studio Code](#tab/vscode)\n\nInstall the **Azure MCP** extension from the Visual Studio Marketplace:\n\n👉 [Azure MCP Extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server)\n\nThe Azure MCP extension installs a companion extension that brings Azure Skills into Visual Studio Code. Together they configure the Azure MCP Server and the full skills layer.\n\n> [!NOTE]\n> The skills extension requires **Git CLI** to be installed on your machine.\n\n### [Claude Code](#tab/claude-code)\n\nAdd the marketplace (first time only):\n\n```bash\n/plugin marketplace add microsoft/azure-skills\n```\n\nInstall the plugin:\n\n```bash\n/plugin install azure@azure-skills\n```\n\nUpdate:\n\n```bash\n/plugin marketplace update azure-skills\n```\n\n### [Cursor](#tab/cursor)\n\nInstall the Azure plugin from the [Cursor Marketplace](https://cursor.com/marketplace/azure) or directly from Cursor settings:\n\n1. Go to **Settings** > **Plugins**.\n1. Search for *Azure*.\n1. Select the Azure plugin to install it.\n\n    :::image type=\"content\" source=\"media/cursor-plugins.png\" alt-text=\"A screenshot showing the Azure plugin in the Cursor Plugins settings.\":::\n\nThe plugin automatically configures the Azure MCP Server, Foundry MCP, and the full skills layer.\n\n### [IntelliJ IDEA](#tab/intellij)\n\nBefore installing Azure Skills in IntelliJ IDEA, make sure you have:\n\n- **Node.js 18+** installed on your system with `npx` available on your PATH.\n- **Git** installed and accessible from the command line.\n\nYou can verify these prerequisites by running:\n\n```bash\nnpx --version\ngit --version\n```\n\n#### Step 1: Install GitHub Copilot plugin\n\n1. Open IntelliJ IDEA.\n1. Go to **File** > **Settings** (on Windows/Linux) or **IntelliJ IDEA** > **Preferences** (on macOS).\n1. Navigate to **Plugins** in the left sidebar.\n1. Search for *GitHub Copilot* in the Marketplace tab.\n1. Install the [GitHub Copilot plugin](https://plugins.jetbrains.com/plugin/17718-github-copilot--your-ai-pair-programmer) (requires version 1.5.64-242 or higher).\n1. Restart IntelliJ IDEA when prompted.\n\n#### Step 2: Enable skills for GitHub Copilot\n\n1. Open IntelliJ IDEA settings or preferences again.\n1. Navigate to **Tools** > **GitHub Copilot** > **Chat**.\n1. Select the **Enable Skills** checkbox.\n1. Select **Apply** and **OK**.\n\n    :::image type=\"content\" source=\"media/enable-azure-skills.png\" alt-text=\"A screenshot showing how to enable skills in IntelliJ IDEA GitHub Copilot settings.\":::\n\n#### Step 3: Install Azure Skills\n\n**Option 1: Azure Toolkit for IntelliJ**\n\n1. Install the [Azure Toolkit for IntelliJ](https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij) plugin from the JetBrains Marketplace.\n1. Restart IntelliJ IDEA to complete the plugin installation.\n1. After restarting, a notification appears offering to install Azure Skills. Select **Install** to add the Azure skills to your environment.\n\n    :::image type=\"content\" source=\"media/install-skills-notification.png\" alt-text=\"A screenshot showing the Azure Skills install notification in IntelliJ IDEA.\":::\n\n1. Verify the installation by opening the GitHub Copilot chat window and typing `/skill:azure`. This command displays all available Azure skills.\n\n    :::image type=\"content\" source=\"media/verify-azure-skills.png\" alt-text=\"A screenshot showing the Azure Skills verification output in IntelliJ IDEA.\":::\n\n**Option 2: Manual install**\n\n1. Open a terminal or command prompt.\n1. Run the following command to install Azure Skills globally for GitHub Copilot:\n\n    ```bash\n    npx skills add https://github.com/microsoft/azure-skills/tree/main/.github/plugins/azure-skills/skills -a github-copilot -g -y\n    ```\n\n1. Wait for the installation to complete. A confirmation message appears when the Azure skills are successfully added.\n\n---\n\nFor the full list of supported hosts and installation options, see the [Azure Skills repository](https://github.com/microsoft/azure-skills).\n\n## Verify installation\n\nAfter installation, confirm Azure Skills is ready to use.\n\n1. List installed plugins:\n\n   ```bash\n   /plugin list\n   ```\n\n   The output includes `azure@azure-skills` and available skills.\n\n1. Test with a quick command:\n\n   ```bash\n   /ask List my Azure subscriptions\n   ```\n\n   Your AI assistant queries your Azure account and displays your subscriptions.\n\n## Try Azure Skills\n\nAfter you install and verify Azure Skills, try these prompts in your AI assistant's chat window:\n\n**Prepare a deployment plan for your project:**\n\n```prompt\nAnalyze my project structure and prepare a deployment plan for deploying to Azure. What infrastructure do I need and how should I set it up?\n```\n\nExpected response: The assistant analyzes your codebase and generates infrastructure-as-code templates. It creates a deployment plan at `.azure/plan.md` and asks for your approval.\n\n**Diagnose an Azure resource health issue:**\n\n```prompt\nI'm getting errors from my Azure App Service. What's wrong and how do I fix it?\n```\n\nExpected response: The assistant inspects your app service, checks logs, and reviews recent deployments. It identifies problems and provides remediation steps.\n\n**Set up monitoring and observability:**\n\n```prompt\nConfigure monitoring and alerting for my application. Which Application Insights features should I enable? What metrics should I track?\n```\n\nExpected response: The assistant proposes a monitoring strategy and generates instrumentation code. It configures Azure Alerts for critical metrics tailored to your app stack.\n\n## Supported AI assistants\n\nYou can use Azure Skills across these platforms:\n\n- **[GitHub Copilot CLI](../github-copilot-azure/introduction.md)**: Full integration with GitHub Copilot tools\n- **Claude Code**: Through the Model Context Protocol (MCP)\n- **Other MCP-compatible AI assistants**: Any tool that supports MCP\n\nFor a complete list of tools that support Azure integration, see [Azure MCP Server supported tools](../azure-mcp-server/get-started.md#connect-to-azure-mcp-server).\n\n## Configuration options\n\n### Telemetry\n\nBy default, Azure Skills collect usage telemetry to improve the service.\n\n**To disable telemetry:**\n\n```bash\nexport AZURE_MCP_COLLECT_TELEMETRY=false\n```\n\n## Troubleshooting\n\n### \"Authentication failed\" error\n\n**Problem:** Your AI assistant can't authenticate to Azure.\n\n**Solutions:**\n\n- **Azure CLI:** Run `az login` again and ensure you're authenticated.\n- **Environment variables:** Verify `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, and `AZURE_CLIENT_SECRET` are set correctly.\n- **Managed identity:** Confirm your Azure resource has an assigned managed identity.\n\n### \"Plugin not found\" error\n\n**Problem:** The Azure Skills plugin isn't installed or recognized.\n\n**Solutions:**\n\n- To register the marketplace, run `/plugin marketplace add microsoft/azure-skills` .\n- To install the plugin, run `/plugin install azure@azure-skills`.\n- Restart your AI assistant.\n- Verify Node.js is installed.\n\n### \"Insufficient permissions\" error\n\n**Problem:** Your Azure account doesn't have the required permissions.\n\n**Solutions:**\n\n- Check your [Azure role-based access control (RBAC) role assignments](/azure/role-based-access-control/role-assignments-list-portal).\n- Request more roles from your Azure administrator.\n- Use a different subscription where you have higher permissions.\n\n### \"Invalid subscription\" error\n\n**Problem:** Azure Skills can't find or access your specified subscription.\n\n**Solutions:**\n\n- To see available subscriptions, run `az account list`. \n- Verify the subscription ID or name is correct.\n- Check that your credentials have access to the subscription.\n\n## Related content\n\n- [Get started with Azure Skills](quickstart.md)\n- [Overview of Azure Skills](overview.md)\n- [GitHub Copilot for Azure](/azure/copilot/overview)\n- [Azure MCP Server get started guide](../azure-mcp-server/get-started.md)\n"
  },
  {
    "path": "articles/azure-skills/overview.md",
    "content": "---\ntitle: What is Azure Skills?\ndescription: Connect your AI assistant to Azure to manage resources, deploy apps, and monitor services without leaving your editor.\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.topic: overview\nms.date: 03/16/2026\n\n#customer intent: As a developer, I want to use AI to manage Azure resources from my editor so that I can deploy and monitor applications without context switching.\n\n---\n\n# What is Azure Skills?\n\nAzure Skills are agent skills that extend your AI coding assistant with Azure-specific domain knowledge and specialized workflows. They give your assistant the ability to manage resources, deploy applications, and monitor services directly from your development environment.\n\n## Azure Skills in Visual Studio Code\n\nThe following demonstration shows Azure Skills in action inside Visual Studio Code. A developer uses natural language in the Copilot chat panel to interact with Azure services — no portal, no CLI commands, no context switching.\n\n:::image type=\"content\" source=\"media/azure-skills-visual-studio-code-demonstration.gif\" alt-text=\"Animated demonstration of Azure Skills running in Visual Studio Code, showing a developer using natural language to interact with Azure services through the Copilot chat panel.\" lightbox=\"media/azure-skills-visual-studio-code-demonstration.gif\":::\n\n**Azure Skills** are agent skills that extend Azure-specific domain knowledge and specialized workflows for your coding agent. Azure Skills gives your AI assistant the ability to manage resources, deploy applications, and monitor services directly from your development environment.\n\nWork with Azure without switching between tools, context windows, or documentation tabs. Ask your AI assistant to build, validate, and deploy, and it handles the Azure operations for you. Azure Skills uses the [Azure MCP Server](../azure-mcp-server/overview.md) to provide your AI assistant with tools to interact with 40+ Azure services. Skills layer high-level workflows on top of those tools.\n\nTraditional Azure workflows require context-switching between your editor, the Azure portal, and documentation while learning CLI commands and running validation steps manually. **Azure Skills** eliminates this friction. Your AI assistant becomes a full Azure development partner, understanding your application architecture and executing Azure operations at your direction.\n\n## The prepare, validate, and deploy workflow\n\nAzure Skills follow a three-step workflow designed to prevent errors and ensure safe deployments.\n\nWhen you ask your AI assistant to prepare an application for Azure, it:\n1. Analyzes your codebase\n2. Creates a detailed deployment plan\n3. Generates infrastructure-as-code\n4. Validates the setup\n5. Deploys your app to Azure\n\nAll without you leaving your editor.\n\n| Step | Skill | What happens |\n|------|-------|--------------|\n| **Plan** | `azure-prepare` | Your assistant analyzes your app, creates `.azure/plan.md` with deployment strategy, and waits for your approval before proceeding. |\n| **Check** | `azure-validate` | Validates the plan before deployment. Runs configuration checks, permission verification, and infrastructure validation. |\n| **Deploy** | `azure-deploy` | Executes the deployment. Runs provisioning, infrastructure deployment, and application setup. |\n\nThis structured approach keeps deployments safe and auditable. You always review the plan before anything happens in Azure.\n\n## Related content\n\n- [Install and configure Azure Skills](install.md) — Detailed setup instructions and authentication options.\n- [Get started with Azure Skills](quickstart.md) — Hands-on walkthrough for your first deployment.\n- [Azure Skills reference](skills/azure-deploy.md) — Full documentation of all skills and their capabilities.\n- [Azure MCP Server](../azure-mcp-server/overview.md) — Technical documentation for the underlying Azure integration.\n"
  },
  {
    "path": "articles/azure-skills/quickstart.md",
    "content": "---\ntitle: Get started with Azure Skills\ndescription: \"Azure Skills quickstart: Deploy your first Azure application in minutes. Learn how to prepare, validate, and launch Node.js apps with step-by-step guidance.\"\nms.topic: quickstart\nms.date: 03/16/2026\nauthor: diberry\nms.author: diberry\nms.reviewer: alexwolf\nms.service: azure-mcp-server\n---\n\n# Get started with Azure Skills\n\nIn this quickstart, you prepare, validate, and deploy an application to Azure by using Azure Skills.\n\n## Prerequisites\n\n- Azure Skills installed ([Install and configure Azure Skills](install.md))\n- Azure CLI authenticated (`az login` completed successfully)\n- GitHub Copilot CLI or Claude Code ready to use\n- A sample application (or create a Node.js app)\n\n## Scenario\n\nYou have a Node.js application. You want to deploy it to Azure with:\n\n- Web application hosting (Azure App Service)\n- A storage account for application data\n- Monitoring with Application Insights\n\n## Prepare your application\n\nIn your AI assistant, go to your project directory and ask:\n\n```text\nPrepare my application for Azure deployment\n```\n\nThe `azure-prepare` skill:\n\n1. Analyzes your codebase\n1. Identifies technology stack (Node.js, npm, and so on)\n1. Creates `.azure/plan.md` with a deployment strategy\n1. Generates infrastructure as code\n1. Waits for your approval\n\n### Review the generated plan\n\nOpen `.azure/plan.md` and review:\n\n- **Project Information**—Application name and deployment mode\n- **Requirements**—Classification and scale (small, medium, large)\n- **Components**—Technologies detected\n- **Deployment Strategy**—Technology used to deploy your application (Azure Developer CLI, Bicep, Terraform, or Azure CLI).\n- **Architecture**—Azure services selected\n- **Implementation Plan**—Step-by-step tasks\n\nExample plan content:\n\n```yaml\n# Azure Deployment Plan\n\n## Project Information\n- Application: my-app\n- Mode: NEW\n\n## Requirements\n- Classification: Web Application\n- Scale: Small\n- Environment: Production\n\n## Components\n- Runtime: Node.js 18+\n- Package Manager: NPM\n- Application Type: Express web server\n\n## Recipe\n- Type: AZD (Azure Developer CLI)\n\n## Azure Services\n- Azure App Service (web app hosting)\n- Azure Storage Account (data)\n- Application Insights (monitoring)\n\n## Status: Awaiting Approval\n```\n\n### Approve the plan\n\nIf the plan looks correct, tell your AI assistant:\n\n```text\nApprove this plan and proceed to validation\n```\n\nThe skill updates the plan status to `Approved` and moves to the next step.\n\n> [!TIP]\n> If the skill doesn't recognize your project type, make sure you're in the project root directory with a recognizable project file (`package.json`, `requirements.txt`, `.csproj`, or similar).\n\n## Validate the deployment plan\n\nYour AI assistant runs the `azure-validate` skill to check:\n\n- Azure CLI access and permissions\n- Bicep or Terraform template syntax, if applicable\n- Azure subscription and region availability\n- Service quota limits\n- Required permissions for your account\n\nValidation finishes and records proof of all checks in the plan. The plan status updates to `Validated`.\n\n### Review validation results\n\nCheck `.azure/plan.md` for the **Validation Proof** section, which shows:\n\n- Commands executed\n- Timestamp\n- Results (passed or failed)\n\nExample:\n\n```yaml\n## Validation Proof\n- Command: azd provision --preview\n- Timestamp: 2026-03-16T14:22:00Z\n- Result: ✓ All validation checks passed\n```\n\nIf validation fails, review errors and ask your AI assistant to fix issues:\n\n```text\nFix the validation errors and try again\n```\n\n> [!TIP]\n> If validation fails, check that your Azure account has the required permissions and that the resources specified in the plan are available in your selected region.\n\n## Deploy to Azure\n\nWhen your plan is validated, tell your AI assistant:\n\n```text\nDeploy my application to Azure\n```\n\nThe `azure-deploy` skill:\n\n1. Confirms plan status is `Validated`\n1. Provisions Azure resources (storage, app service, monitoring)\n1. Deploys your application code\n1. Configures application settings\n1. Provides your application endpoint\n\nDeployment typically takes 3-5 minutes.\n\n### View your deployed application\n\nAfter successful deployment, your AI assistant provides:\n\n- Application URL (for App Service)\n- Storage account name and access keys\n- Application Insights instrumentation key\n\nExample:\n\n```output\nDeployment complete! \n\nYour app is live at: https://my-app-abcd1234.azurewebsites.net\n\nResources deployed:\n- App Service: my-app-prod\n- Storage Account: mystorageabcd1234\n- Application Insights: my-app-insights\n\nMonitor your app: https://portal.azure.com/...\n```\n\nTo verify that your app is running, visit your application URL in a browser.\n\n> [!TIP]\n> If deployment fails, check the error output for permission or quota issues. Run `az account show` to verify you're authenticated to the correct subscription.\n\n## Verify your deployment\n\nTest your application:\n\n1. **Visit your URL**—Open the application URL in a browser.\n1. **Check monitoring**—View logs in Application Insights.\n1. **Test functionality**—Use key features of your app.\n\nAsk your AI assistant for monitoring status:\n\n```text\nShow me the application logs and performance metrics\n```\n\nYour AI assistant queries Application Insights and displays recent activity, errors, and performance data.\n\n## Update and redeploy\n\nIf you make code changes, redeploy easily:\n\n1. **Update your code** in your editor.\n1. **Ask your AI assistant:**\n\n   ```text\n   Update the deployment with my latest changes\n   ```\n\n1. The skill runs `azure-prepare` to check for changes, then `azure-deploy` to update your resources.\n\nUpdated resources reuse existing infrastructure. Only changed components redeploy.\n\n## Clean up resources\n\nWhen you no longer need your application, delete Azure resources to avoid charges:\n\n```text\nDelete all Azure resources for this application\n```\n\nYour AI assistant:\n\n1. Lists resources to be deleted (for your confirmation)\n1. Deletes the resource group and all contents\n1. Confirms cleanup complete\n\nExample:\n\n```output\nResources to delete:\n- Resource Group: my-app-rg\n- All contained resources\n\nAre you sure? (yes/no)\n```\n\nType `yes` to confirm deletion.\n\n## Troubleshooting\n\n### Deployment fails with authentication error\n\n**Problem:** Your AI assistant can't authenticate to Azure.\n\n**Solution:** Reauthenticate by using `az login` and try again.\n\n### Plan validation fails\n\n**Problem:** Azure Skills reports validation errors.\n\n**Solution:** Ask your AI assistant to review and fix issues:\n\n```text\nWhy did validation fail? Fix the errors.\n```\n\n### Application not accessible after deployment\n\n**Problem:** The provided URL returns an error or times out.\n\n**Solution:**\n\n1. Verify the URL is correct.\n1. Wait 1-2 minutes for DNS propagation.\n1. Check Application Insights logs for errors.\n\n   ```text\n   Show me recent errors in Application Insights\n   ```\n\n## Next steps\n\n- [Azure Model Context Protocol (MCP) Server documentation](../azure-mcp-server/overview.md)—Deeper technical details\n"
  },
  {
    "path": "articles/azure-skills/skills/ai-runway-aks-setup.md",
    "content": "---\ntitle: Azure skill for AI Runway AKS setup\ndescription: Walks through setting up AI Runway on an existing AKS cluster, from cluster verification to first model deployment.\nms.topic: reference\nms.date: 05/05/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.1\n---\n\n# Azure skill for AI Runway AKS setup\n\nWalks through setting up AI Runway on an existing AKS cluster, from cluster verification to first model deployment.\n\n**Skill:** `airunway-aks-setup` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/airunway-aks-setup/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge for end-to-end AI Runway onboarding on Azure Kubernetes Service (AKS). It covers cluster verification, controller installation, GPU assessment, inference provider setup, and first model deployment. This skill uses no external MCP tools — all cluster operations are performed directly via `kubectl` and `make`.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **An existing AKS cluster**: If you don't have a cluster, use the `azure-kubernetes` skill first to provision one with a GPU node pool (unless CPU-only inference is acceptable).\n- **CLI tools**: `kubectl`, `make`, and `curl` installed locally.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Set up AI Runway on an existing AKS cluster from scratch.\n- Install the AI Runway controller and Custom Resource Definitions (CRDs).\n- Assess GPU hardware compatibility for model deployment.\n- Choose and install an [inference provider](#inference-providers) such as KAITO, Dynamo, or KubeRay.\n- Deploy your first AI model to AKS via AI Runway.\n- Resume a partially complete AI Runway setup from a specific step.\n\n> [!TIP]\n> To resume setup from a specific step, tell the skill `skip-to-step N` where N is the step number (1–6).\n\n## Inference providers\n\nAn inference provider is the runtime component that serves your AI model on the cluster. This skill supports three providers:\n\n| Provider | Best for | Description |\n|----------|----------|-------------|\n| **KAITO** | Managed GPU inference | Kubernetes AI Toolchain Operator — automates model deployment with built-in GPU node provisioning |\n| **Dynamo** | High-throughput serving | Inference framework optimized for multi-GPU, multi-node deployments |\n| **KubeRay** | Ray-based workloads | Kubernetes operator for Ray clusters — ideal for distributed inference and training |\n\n## Suggested workflow\n\nThe skill follows a sequential six-step process:\n\n1. **Cluster verification**: Checks Kubernetes context, node inventory, and GPU detection.\n1. **Controller installation**: Deploys CRDs and the AI Runway controller.\n1. **GPU assessment**: Detects GPU models and flags dtype/attention constraints.\n1. **Provider setup**: Recommends and installs the appropriate inference provider.\n1. **First deployment**: Picks a model, deploys it, and verifies it reaches Ready state.\n1. **Summary**: Recaps the setup, runs a smoke test, and suggests next steps.\n\n> [!NOTE]\n> GPU node pools incur significant compute charges. An A100-80GB node pool can cost $3–5+ per hour. Confirm cost implications before provisioning GPU resources.\n\n## Troubleshooting\n\n| Error / Symptom | Likely cause | Remediation |\n|-----------------|--------------|-------------|\n| No kubeconfig context | Not connected to a cluster | Run `az aks get-credentials` or equivalent |\n| Controller in CrashLoopBackOff | Config or RBAC issue | Check logs: `kubectl logs -n airunway-system -l control-plane=controller-manager --previous` |\n| Provider not ready | Image pull or RBAC issue | Check pod logs: `kubectl logs <pod-name> -n <namespace>` |\n| ModelDeployment stuck in Pending | GPU scheduling failure or provider not ready | Inspect events: `kubectl describe modeldeployment <name> -n <namespace>` |\n| `bfloat16` errors at inference | T4 or V100 lacks bfloat16 support | Add `--dtype float16` to serving args |\n\nFor detailed troubleshooting and rollback procedures, see the [Azure Diagnostics skill](/azure/developer/azure-skills/skills/azure-diagnostics).\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Set up AI Runway on my AKS cluster\"\n- \"Install AI Runway on AKS\"\n- \"Deploy a model to AKS using AI Runway\"\n- \"Set up GPU inference on AKS\"\n- \"Configure KAITO on my AKS cluster\"\n- \"Run an LLM on AKS\"\n- \"Set up vLLM on AKS\"\n- \"Set up model serving on AKS\"\n- \"Install the AI Runway controller\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Azure Diagnostics skill](/azure/developer/azure-skills/skills/azure-diagnostics) — troubleshooting AI Runway deployments\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/airunway-aks-setup/SKILL.md)\n"
  },
  {
    "path": "articles/azure-skills/skills/app-insights-instrumentation.md",
    "content": "---\ntitle: Azure skill for App Insights instrumentation\ndescription: Guidance for instrumenting webapps with Azure Application Insights. Provides telemetry patterns, SDK setup, and configuration references.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.2\n---\n\n# Azure skill for App Insights instrumentation\n\nGuidance for instrumenting webapps with Azure Application Insights. Provides telemetry patterns, SDK setup, and configuration references.\n\n**Skill:** `appinsights-instrumentation` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/appinsights-instrumentation/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Guidance for instrumenting webapps with Azure Application Insights. Provides telemetry patterns, SDK setup, and configuration references.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **[PowerShell](/powershell/scripting/install/installing-powershell)** (v7.4+): Install with `winget install Microsoft.PowerShell`.\n- **Azure CLI with Bicep** (v2.60.0+): [Install](/cli/azure/install-azure-cli), sign in with `az login`, then run `az bicep install`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Work with App Insights SDK, telemetry patterns, Application Insights guidance, and instrumentation examples\n- Work with Apm best practices\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Instrument my webapp to send telemetry to App Insights\"\n- \"How do I instrument my app with Azure App Insights?\"\n- \"Add AppInsights instrumentation to my web application\"\n- \"Add App Insights instrumentation to my Node.js app\"\n- \"Configure Application Insights for my Python webapp\"\n- \"Set up telemetry monitoring in Azure\"\n- \"Instrument my application to send data to App Insights\"\n- \"Add observability to my Azure web application\"\n- \"How to enable App Insights autoinstrumentation?\"\n- \"Configure telemetry for my Azure App Service\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/appinsights-instrumentation/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-ai-gateway.md",
    "content": "---\ntitle: Azure skill for AI Gateway\ndescription: Configure Azure API Management as an AI Gateway for AI models, MCP tools, and agents.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-3.0.1\n---\n\n# Azure skill for AI Gateway\n\nConfigure Azure API Management as an AI Gateway for AI models, Model Context Protocol (MCP) tools, and agents.\n\n**Skill:** `azure-aigateway` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-aigateway/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Configure Azure API Management as an AI Gateway for AI models, MCP tools, and agents.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Work with semantic caching, token limit, content safety, and load balancing\n- Work with AI model governance, MCP rate limiting, and jailbreak detection\n- Add Azure OpenAI back end\n- Add AI Foundry model\n- Test AI gateway in Azure\n- Work with LLM policies\n- Configure AI back end in Azure\n- Work with token metrics, AI cost control, convert API to MCP, and import OpenAPI to gateway\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Set up an AI Gateway for my Azure OpenAI models\"\n- \"Configure Azure API Management as a gateway for my AI models\"\n- \"Add a gateway to my MCP server\"\n- \"Set up APIM for my AI workloads\"\n- \"Add rate limiting to my model requests\"\n- \"Limit tokens for my AI API\"\n- \"How do I ratelimit my MCP server?\"\n- \"Enable semantic caching for my AI API\"\n- \"Set up semantic cache for Azure OpenAI in APIM\"\n- \"Add content safety to my AI endpoint\"\n\n## Related content\n\n- [Azure MCP Server overview](/azure/developer/azure-mcp-server/overview)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-ai.md",
    "content": "---\ntitle: Azure skill for AI Services\ndescription: Azure AI Services including AI Search, Speech, OpenAI, and Document Intelligence.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.1\n---\n\n# Azure skill for AI Services\n\n**Skill:** `azure-ai` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-ai/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge about Azure AI Services services and workflows in Azure.\n\n### Azure services knowledge\n\n| Service | When to use |\n|---------|------------|\n| AI Search | Full-text, vector, hybrid search |\n| Speech | Speech-to-text, text-to-speech |\n| OpenAI | GPT models, embeddings, DALL-E |\n| Document Intelligence | Form extraction, OCR |\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Query and manage Azure AI Search resources.\n- Perform full-text, vector, hybrid, and semantic search queries.\n- Execute vector, hybrid, and semantic search queries.\n- Convert speech to text and text to speech using Azure Cognitive Services.\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-ai/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-cloud-migrate.md",
    "content": "---\ntitle: Azure skill for cloud migration\ndescription: Assess and migrate cross-cloud workloads to Azure with migration reports and code conversion guidance. Supports AWS, GCP, and other providers.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.2\n---\n\n# Azure skill for cloud migration\n\nAssess and migrate cross-cloud workloads to Azure with migration reports and code conversion guidance. Supports AWS, GCP, and other providers.\n\n**Skill:** `azure-cloud-migrate` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-cloud-migrate/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Assess and migrate cross-cloud workloads to Azure with migration reports and code conversion guidance. Supports AWS, GCP, and other providers.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Migrate AWS Lambda functions to Azure Functions.\n- Migrate GCP Cloud Run services to Azure Container Apps.\n- Plan and execute migrations of AWS or GCP infrastructure to Azure.\n- Perform readiness assessments for Lambda function or Cloud Run migrations.\n- Convert AWS serverless architectures to Azure Compute services.\n- Generate migration readiness reports.\n- Execute migrations from AWS to Azure Cloud.\n- Execute migrations from Google Cloud Platform to Azure.\n- Plan migrations across multiple cloud providers to Azure.\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"How do I migrate my AWS Lambda functions to Azure Functions?\"\n- \"I want to migrate from AWS to Azure\"\n- \"Can you do a Lambda migration assessment for my project?\"\n- \"Convert my serverless functions to Azure\"\n- \"Generate a migration readiness report for my Lambda functions\"\n- \"Help me migrate code to Azure Functions\"\n- \"Assess my AWS Lambda project for Azure migration\"\n- \"I need to move my Lambda workloads to Azure Functions\"\n- \"Migrate my GCP Cloud Run services to Azure Container Apps\"\n- \"How do I move from Cloud Run to Azure?\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-cloud-migrate/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-compliance.md",
    "content": "---\ntitle: Azure skill for compliance\ndescription: Run Azure compliance and security audits with azqr plus Key Vault expiration checks. Covers best-practice assessment, resource review, policy/compliance validation, and security posture checks.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.3\n---\n\n# Azure skill for compliance\n\nRun Azure compliance and security audits with `azqr` plus Key Vault expiration checks. Covers best-practice assessment, resource review, policy/compliance validation, and security posture checks.\n\n**Skill:** `azure-compliance` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-compliance/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Run Azure compliance and security audits with `azqr` plus Key Vault expiration checks. Covers best-practice assessment, resource review, policy/compliance validation, and security posture checks.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n- **[Azure Key Vault](/azure/key-vault/general/quick-create-portal)** (optional): Required only for key, secret, and certificate expiration audits.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Work with compliance scan and security audit\n- Before running `azqr` (compliance cli tool)\n- Work with Azure best practices, Key Vault expiration check, expired certificates, and expiring secrets\n- Work with orphaned resources and compliance assessment\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Run `azqr` to check Azure compliance\"\n- \"Check my Azure subscription for compliance issues\"\n- \"Perform compliance assessment using Azure Quick Review\"\n- \"Assess my Azure resources against best practices\"\n- \"Review my Azure security posture\"\n- \"Run compliance scan on my Azure subscription\"\n- \"Identify orphaned resources in Azure\"\n- \"Find resources that don't comply with best practices\"\n- \"Show me expired certificates in my Key Vault\"\n- \"Check what secrets are expiring in the next 30 days\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-compliance/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-compute.md",
    "content": "---\ntitle: Azure skill for compute\ndescription: Azure VM and Virtual machine scale set (VMSS) router for recommendations, pricing, autoscale, orchestration, and connectivity troubleshooting. Answers questions but doesn't execute infrastructure changes.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-2.1.0\n---\n\n# Azure skill for compute\n\nAzure virtual machine (VM) and Virtual machine scale set (VMSS) router for recommendations, pricing, autoscale, orchestration, and connectivity troubleshooting. This skill can answer questions about autoscaling and orchestration but isn't meant to help execute those tasks.\n\n**Skill:** `azure-compute` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-compute/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Azure VM and Virtual machine scale set (VMSS) router for recommendations, pricing, autoscale, orchestration, and connectivity troubleshooting.\n\n## Prerequisites\n\n- **Azure subscription** (required for troubleshooting actual VMs/VMSS): [Create a free account](https://azure.microsoft.com/free/) if you don't have one. Not required for general questions, recommendations, or pricing information.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+) (required for pulling diagnostics from actual VMs/VMSS): [Install](/cli/azure/install-azure-cli) and sign in with `az login`. Not required for general questions, recommendations, or pricing information.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Create and manage Azure virtual machines (VMs) and virtual machine scale sets (VMSS).\n- Configure autoscaling for virtual machine scale sets.\n- Select appropriate VM SKUs for your workload (server, web hosting, burstable compute, or lightweight).\n- Optimize VM selection for different workloads, including development/test scenarios and back-end services.\n- Work with autoscale, load balancer, Flexible orchestration, and Uniform orchestration\n- Work with cost estimate, Linux, black screen, and reset password\n- Troubleshoot virtual machine connectivity issues.\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Help me choose a VM for my workload\"\n- \"What VM size should I use for a web server?\"\n- \"Compare Azure VM families for machine learning workloads\"\n- \"How much will a Standard D4s v3 VM cost?\"\n- \"Help me set up autoscale for my VM scale set\"\n- \"I can't connect to my VM via RDP, help me troubleshoot\"\n- \"How do I reset the password on my Azure VM?\"\n- \"What's the difference between Flexible and Uniform orchestration?\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-compute/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-cost.md",
    "content": "---\ntitle: Azure skill for cost optimization\ndescription: \"Unified Azure cost management: query historical costs, forecast future spending, and optimize to reduce waste.\"\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.1.0\n---\n\n# Azure skill for cost optimization\n\nAnalyze and optimize your Azure spending with historical cost queries, spending forecasts, and actionable cost-reduction recommendations.\n\n**Skill:** `azure-cost` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-cost/SKILL.md)\n\n## What it provides\n\nThis skill gives GitHub Copilot access to Azure Cost Management APIs and optimization best practices. It can analyze your current spending, project future costs, and suggest specific ways to reduce waste.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n- **Azure roles**: Your account must have the [Cost Management Reader](/azure/role-based-access-control/built-in-roles#cost-management-reader), [Monitoring Reader](/azure/role-based-access-control/built-in-roles#monitoring-reader), and [Reader](/azure/role-based-access-control/built-in-roles#reader) roles on the target subscription or resource group.\n- **[Azure Kubernetes Service](/azure/aks/learn/quick-kubernetes-deploy-portal)**: An AKS cluster for container orchestration.\n\n### Related tools\n\n| Tool | Command | Purpose |\n|------|---------|---------|\n| `azure__documentation` | Search Azure documentation | Search for relevant Azure documentation by keyword |\n| `azure__extension_cli_generate` | Generate Azure CLI commands | Generate Azure CLI commands from a natural-language description |\n| `azure__get_azure_bestpractices` | Get Azure best practices | Retrieve best practices for a specific optimization scenario |\n| `azure__extension_azqr` | Run Azure Quick Review | Run a compliance scan against a subscription or resource group |\n| `azure__aks` | Azure Kubernetes Service operations | Manage Azure Kubernetes Service clusters and workloads |\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Analyze costs of your existing Azure resources and infrastructure.\n- Review your Azure bill, costs broken down by service, and costs per resource.\n- Compare monthly cost summaries, identify cost trends, and pinpoint top cost drivers.\n- Calculate amortized costs and actual spending.\n- Forecast future spending and project end-of-month costs.\n- Plan budget forecasts based on historical data.\n- Identify and implement cost optimization strategies.\n- Find opportunities to reduce cloud spending.\n- Discover cost-saving recommendations tailored to your infrastructure.\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-cost/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-deploy.md",
    "content": "---\ntitle: Azure skill for deploy\ndescription: Execute Azure deployments for already-prepared applications that have existing .azure/deployment-plan.md and infrastructure files.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.19\n---\n\n# Azure skill for deploy\n\nExecute Azure deployments for already-prepared applications that have existing .azure/deployment-plan.md and infrastructure files.\n\n**Skill:** `azure-deploy` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-deploy/SKILL.md)\n\n## What it provides\n\nThis skill enables GitHub Copilot to execute production deployments using your prepared infrastructure-as-code files. You get automated provisioning, reliable updates to deployed resources, and safe infrastructure deployments without manual CLI commands.\n\n## Prerequisites\n\n- **Prepared deployment plan**: Run the [azure-prepare](azure-prepare.md) skill first to generate your `.azure/deployment-plan.md` and infrastructure files. Then run the [azure-validate](azure-validate.md) skill to verify readiness.\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Provision and deploy resources to Azure using the `azd up` command\n- Update deployed resources using the `azd deploy` command\n- Execute deployments with Azure Developer CLI or your infrastructure-as-code tool\n- Work with push to production, push to cloud, go live, and ship it\n- Work with bicep deploy, terraform apply, publish to Azure, and launch on Azure\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Execute deployment to Azure production\"\n- \"Deploy and provision my Azure infrastructure\"\n- \"Push my deploy to Azure production\"\n- \"Ship and deploy my Azure app\"\n- \"Run the Azure deployment now\"\n- \"Deploy my Azure Functions app to cloud using the Azure Developer CLI.\"\n- \"Deploy my serverless function app to Azure\"\n- \"Deploy Azure Functions to production\"\n- \"Deploy my app and verify the role-based access control (RBAC) roles are assigned correctly\"\n- \"Run deployment and check live role assignments on Azure\"\n\n## Deployment workflow\n\nThis skill is the final step in the deployment workflow:\n\n1. [**azure-prepare**](azure-prepare.md) — generates infrastructure files and `.azure/deployment-plan.md`\n1. [**azure-validate**](azure-validate.md) — validates the deployment plan and infrastructure before deploying\n1. **azure-deploy** (this skill) — executes the deployment\n\n## Related content\n\n- [Azure skill for prepare](azure-prepare.md)\n- [Azure skill for validate](azure-validate.md)\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-deploy/SKILL.md)\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-diagnostics.md",
    "content": "---\ntitle: Azure skill for diagnostics\ndescription: Debug Azure production issues on Azure using AppLens, Azure Monitor, resource health, and safe triage.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.4\n---\n\n# Azure skill for diagnostics\n\nDebug Azure production issues on Azure using AppLens, Azure Monitor, resource health, and safe triage.\n\n**Skill:** `azure-diagnostics` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-diagnostics/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Debug Azure production issues on Azure using AppLens, Azure Monitor, resource health, and safe triage.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n- **Azure compute resources**: This skill supports Azure Container Apps, Azure Functions, Azure Kubernetes Service (AKS), and other Azure compute services.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Debug production issues in Azure\n- Troubleshoot container apps in Azure\n- Troubleshoot functions in Azure\n- Troubleshoot AKS in Azure\n- Work with kubectl can't connect, kube-system/CoreDNS failures, pod pending, and crashloop\n- Work with node not ready\n- Upgrade failures in Azure\n- Analyze logs in Azure\n- Work with insights, image pull failures, cold start issues, and health probe failures\n- Work with resource health and root cause of errors\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Debug my Azure Container App\"\n- \"Troubleshoot production issues in my container app\"\n- \"Diagnose errors in my Azure service\"\n- \"Help me troubleshoot container apps on Azure\"\n- \"Analyze logs with KQL for my app\"\n- \"How do I analyze application logs?\"\n- \"View application logs for my container\"\n- \"Fix image pull failures in Container Apps\"\n- \"My container app has image pull errors\"\n- \"Resolve cold start issues\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-diagnostics/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-enterprise-infra-planner.md",
    "content": "---\ntitle: Azure skill for enterprise infrastructure planning\ndescription: Architect and provision enterprise Azure infrastructure from workload descriptions. For cloud architects and platform engineers planning networking, identity, security, compliance, and multi-resource topologies with waf alignment. Generates Bicep or Terraform directly (no azd).\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.2\n---\n\n# Azure skill for enterprise infrastructure planning\n\nArchitect and provision enterprise Azure infrastructure from workload descriptions. For cloud architects and platform engineers planning networking, identity, security, compliance, and multi-resource topologies with waf alignment. Generates Bicep or Terraform directly (no `azd`).\n\n**Skill:** `azure-enterprise-infra-planner` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-enterprise-infra-planner/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Architect and provision enterprise Azure infrastructure from workload descriptions. For cloud architects and platform engineers planning networking, identity, security, compliance, and multi-resource topologies with waf alignment. Generates Bicep or Terraform directly (no `azd`).\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Design enterprise Azure infrastructure from high-level requirements.\n- Architect Azure landing zones with security, governance, and cost controls.\n- Design hub-and-spoke network topologies for multi-region Azure deployments.\n- Plan multi-region disaster recovery topologies.\n- Configure virtual network security with firewalls and private endpoints.\n- Deploy Bicep templates at subscription scope (for infrastructure-only workflows; use `azure-prepare` for application-centric deployments).\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Deploy a geo-redundant backup solution for on-premises SQL servers using Azure Backup, configure encryption-at-rest, and automate monthly DR tests.\"\n- \"Deploy 3-tier architecture with hardened OS images, virtual machine (VM) backups scheduled daily, and application-level redundancy for the business logic tier.\"\n- \"Configure a site recovery plan for disaster failover from East to West Azure region, replicate major VM workloads, and automate DNS failbacks.\"\n- \"Provision a jumpbox VM for secure management, establish NSGs for each tier, and connect tiers using internal Azure Load Balancer.\"\n- \"Spin up Linux VMs for each tier using Terraform, automate patch management through Azure Automation, and log traffic between subnets for compliance.\"\n- \"Deploy three distinct VM scale sets for a legacy app, route incoming HTTP/S through Application Gateway with Web Application Firewall (WAF), and encrypt all data disks.\"\n- \"Set up Azure Backup for critical VM workloads, create a long-term retention policy for compliance, and test backup restores quarterly.\"\n- \"Deploy disaster recovery for VMware VMs using Azure Site Recovery, configure runbooks for smooth failover, and maintain compliance audit trails.\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-enterprise-infra-planner/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-hosted-copilot-sdk.md",
    "content": "---\ntitle: Azure skill for hosted Copilot SDK\ndescription: Build and deploy GitHub Copilot SDK apps to Azure.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.6\n---\n\n# Azure skill for Hosted Copilot SDK\n\nBuild and deploy GitHub Copilot SDK apps to Azure.\n\n**Skill:** `azure-hosted-copilot-sdk` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-hosted-copilot-sdk/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Build and deploy GitHub Copilot SDK apps to Azure.\n\n> [!NOTE]\n> This skill automatically activates when your codebase contains `@github/copilot-sdk` in `package.json` or `CopilotClient` in source files. When detected, this skill becomes the entry point for deploy, modify, and add-feature workflows instead of the general-purpose azure-prepare skill.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Build custom copilot applications on Azure infrastructure.\n- Create and configure copilot applications.\n- Use the GitHub Copilot SDK to scaffold and build copilot-powered applications.\n- Deploy your copilot application to Azure infrastructure.\n- Host applications on Azure using Azure OpenAI models or bring your own model (BYOM).\n- Integrate your own large language model (LLM) with the Copilot SDK.\n- Configure Azure OpenAI models, managed identity authentication, and the Copilot SDK service.\n- Build chat applications using the Copilot SDK service template and the `CopilotClient` library.\n- Implement session management and message handling using the GitHub Models API.\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Build a Copilot SDK app and deploy it\"\n- \"Create a new copilot SDK service\"\n- \"Scaffold a copilot-powered app on Azure\"\n- \"Build with the GitHub Copilot SDK and host it\"\n- \"Build a Copilot SDK app with my own Azure model\"\n- \"Create a copilot app using my Azure OpenAI model\"\n- \"Set up a copilot service with `BYOM` and `DefaultAzureCredential`\"\n- \"Build a copilot app that uses a self-hosted model on Azure\"\n- \"Deploy a copilot SDK app with my own endpoint\"\n- \"Create a copilot app and bring your own model from Azure OpenAI\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-hosted-copilot-sdk/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-kubernetes.md",
    "content": "---\ntitle: Azure skill for Kubernetes\ndescription: Plan, create, and configure production-ready Azure Kubernetes Service (AKS) clusters. Covers Day-0 checklist, SKU selection (Automatic vs Standard), networking options (private API server, Azure cni Overlay, egress configuration), security, and operations (autoscaling, upgrade strategy, cost analysis).\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.4\n---\n\n# Azure skill for Kubernetes\n\nPlan, create, and configure production-ready Azure Kubernetes Service (AKS) clusters. Covers Day-0 checklist, SKU selection (Automatic vs Standard), networking options (private API server, Azure cni Overlay, egress configuration), security, and operations (autoscaling, upgrade strategy, cost analysis).\n\n**Skill:** `azure-kubernetes` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-kubernetes/SKILL.md)\n\n## What it provides\n\nThis skill gives GitHub Copilot deep expertise in AKS cluster planning and configuration. It helps you make critical Day-0 decisions — networking topology, API server access, and pod IP model — that are difficult to change after cluster creation. Specifically, it provides:\n\n- **SKU selection guidance**: Recommends AKS Automatic vs Standard based on your control and customization needs.\n- **Networking configuration**: Advises on Azure CNI Overlay vs VNet-routable CNI, egress strategies (Static Egress Gateway, UDR + Firewall), ingress options (App Routing, Istio, Application Gateway for Containers), and DNS settings.\n- **Security best practices**: Guides Microsoft Entra ID integration, Workload Identity for pods, Key Vault secrets via CSI Driver, Azure Policy with Deployment Safeguards, and image signing.\n- **Operations and scaling**: Configures autoscaling (KEDA, Node Auto Provisioning), upgrade strategies (maintenance windows, Fleet Manager), and observability (Managed Prometheus, Container Insights, Grafana).\n- **Optimization**: Recommends rightsizing, Spot node pools, Cluster AutoScaler (CAS), and Vertical Pod Autoscaler (VPA).\n\n### Related tools\n\n| Tool | Command | Purpose |\n|------|---------|---------|\n| `mcp_azure_mcp_aks` | `AKS Model Context Protocol (MCP) entry point used to discover the exact AKS-specific tools exposed by the client` | Discover the callable AKS tool first, then use that tool's parameters |\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n- **[Azure Key Vault](/azure/key-vault/general/quick-create-portal)**: A key vault for secrets and certificate management.\n- **[Azure Kubernetes Service](/azure/aks/learn/quick-kubernetes-deploy-portal)**: An AKS cluster for container orchestration.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Create AKS environment in Azure\n- Provision AKS environment in Azure\n- Enable AKS observability in Azure\n- Design AKS networking in Azure\n- Choose AKS SKU in Azure\n- Secure AKS in Azure\n\n## Suggested workflow\n\n- **AKS Automatic** (default): Best for most production workloads, provides a curated experience with pre-configured best practices for security, reliability, and performance. Use unless you have specific custom requirements for networking, autoscaling, or node pool configurations not supported by Node Auto-Provisioning (NAP).\n- **AKS Standard**: Use if you need full control over environment configuration, which requires additional overhead to set up and manage.\n- **Azure CNI Overlay** (recommended): Uses private IP addresses for pods (not routable from the virtual network), scales to large environments, and works well for most production workloads.\n- **Azure CNI (VNet-routable)**: pod IPs directly from VNet (pod subnet or node subnet), use when pods must be directly addressable from VNet or on-prem\n- **Azure CNI powered by Cilium** (recommended): eBPF (extended Berkeley Packet Filter)-based for high-performance packet processing, network policies, and observability\n- **Static Egress Gateway** for stable, predictable outbound IPs\n- For restricted egress: user-defined route (UDR) + Azure Firewall or network virtual appliance (NVA)\n- **App Routing addon with Gateway API** - recommended default for HTTP/HTTPS workloads\n- **Istio service mesh with Gateway API** - for advanced traffic management, mTLS, canary releases\n- **Application Gateway for Containers** - for L7 load balancing with Web Application Firewall (WAF) integration\n- Enable **LocalDNS** on all node pools for reliable, performant DNS resolution\n- Use **Microsoft Entra ID** everywhere (control plane, Workload Identity for pods, node access). Avoid static credentials.\n- Azure Key Vault through **Secrets Store CSI Driver** for secrets\n- Enable **Azure Policy** + **Deployment Safeguards**\n- Enable **Encryption at rest** for etcd/API server; **in-transit** for node-to-node\n- Allow only signed, policy-approved images (Azure Policy + Ratify), prefer **Azure Container Registry**\n- **Isolation**: Use namespaces, network policies, scoped logging\n- Use Managed Prometheus and Container Insights with Grafana for AKS observability (logs + metrics).\n- Enable Diagnostic Settings to collect control plane logs and audit logs in a Log Analytics workspace for security monitoring and troubleshooting.\n- For other monitoring and troubleshooting tools, use features like the Agentic CLI for AKS, Application Insights, Resource Health Center, AppLens detectors, and Azure Advisors.\n- Configure **Maintenance Windows** for controlled upgrade timing\n- Enable **automatic upgrades** for control plane and node OS to stay up-to-date with security patches and Kubernetes versions\n- Consider **Long-Term Support (LTS) versions** for enterprise stability (2-year support) by upgrading your AKS environment to the Premium tier\n- **Fleet upgrades**: Use **AKS Fleet Manager** for staged rollout across test to production environments\n- Use **Ephemeral OS disks** (`--node-osdisk-type Ephemeral`) for faster node startup\n- Select **Azure Linux** as node OS (smaller footprint, faster boot)\n- Enable **KEDA (Kubernetes Event-Driven Autoscaling)** for event-driven autoscaling beyond Horizontal Pod Autoscaler (HPA)\n- **Dedicated system node pool**: At least 2 nodes, tainted for system workloads only (`CriticalAddonsOnly`)\n- Enable **Node Auto Provisioning (NAP)** on all pools for cost savings and responsive scaling\n- Use **latest generation SKUs (v5/v6)** for host-level optimizations\n- **Avoid B-series VMs** - burstable SKUs cause performance/reliability issues\n- Use SKUs with **at least 4 vCPUs** for production workloads\n- Set **topology spread constraints** to distribute pods across hosts/zones per SLO\n- Deploy across **3 Availability Zones** (`--zones 1 2 3`)\n- Use **Standard tier** for zone-redundant control plane + 99.95% SLA for API server availability\n- Enable **Microsoft Defender for Containers** for runtime protection\n- Configure **PodDisruptionBudgets** for all production workloads\n- Use **topology spread constraints** to ensure pod distribution across failure domains\n- Use **Spot node pools** for batch/interruptible workloads (up to 90% savings)\n- **Stop/Start development and test clusters** to reduce costs: `az aks stop` and `az aks start`\n- Consider **Reserved Instances** or **Savings Plans** for steady-state workloads\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Help me create an AKS cluster\"\n- \"I need to set up a new Kubernetes cluster on Azure\"\n- \"Create a production-ready AKS cluster with best practices\"\n- \"How do I provision an AKS cluster for my team?\"\n- \"What networking options should I choose for AKS?\"\n- \"AKS Day-0 checklist\"\n- \"Plan AKS configuration for production\"\n- \"Design AKS networking with private API server\"\n- \"What's the difference between AKS Automatic and Standard?\"\n- \"Should I use AKS Automatic or Standard SKU?\"\n\n## Related content\n\n- [Azure MCP Server overview](/azure/developer/azure-mcp-server/overview)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-kusto.md",
    "content": "---\ntitle: Azure skill for Kusto (Azure Data Explorer)\ndescription: This skill queries and analyzes data in Azure Data Explorer (also called Kusto or ADX) using Kusto Query Language (KQL) to support log analytics, telemetry monitoring, and time-series analysis.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.1\n---\n\n# Azure skill for Kusto (Data Explorer)\n\nThis skill queries and analyzes data in Azure Data Explorer (also called Kusto or ADX) using Kusto Query Language (KQL) to support log analytics, telemetry monitoring, and time-series analysis.\n\n**Skill:** `azure-kusto` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-kusto/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. This skill queries and analyzes data in Azure Data Explorer (also called Kusto or ADX) using Kusto Query Language (KQL) to support log analytics, telemetry monitoring, and time-series analysis.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Write KQL queries to analyze logs, telemetry data, and time-series information in Azure Data Explorer clusters.\n- Perform log analytics, analyze time-series data from IoT devices, and detect anomalies.\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Query my Kusto database for events in the last hour\"\n- \"Write a KQL query to analyze telemetry data from my ADX cluster\"\n- \"Show me the schema for tables in my Azure Data Explorer cluster\"\n- \"Analyze IoT sensor data for anomalies in the last 24 hours\"\n- \"Create a time series chart of application logs from my Kusto database\"\n- \"What tables are available in my Azure Data Explorer cluster?\"\n- \"Aggregate request latency metrics by service using KQL\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-kusto/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-messaging.md",
    "content": "---\ntitle: Azure skill for messaging\ndescription: Troubleshoot and resolve issues with Azure Messaging SDKs for Event Hubs and Service Bus. Covers connection failures, authentication errors, message processing issues, and SDK configuration problems.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.4\n---\n\n# Azure skill for messaging\n\nTroubleshoot and resolve issues with Azure Messaging SDKs for Event Hubs and Service Bus. Covers connection failures, authentication errors, message processing issues, and SDK configuration problems.\n\n**Skill:** `azure-messaging` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-messaging/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Troubleshoot and resolve issues with Azure Messaging SDKs for Event Hubs and Service Bus. Covers connection failures, authentication errors, message processing issues, and SDK configuration problems.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n### Related tools\n\n| Tool | Command | Purpose |\n|------|---------|---------|\n| `mcp_azure_mcp_eventhubs` | `Namespace/hub ops` | List namespaces, hubs, consumer groups |\n| `mcp_azure_mcp_servicebus` | `Queue/topic ops` | List namespaces, queues, topics, subscriptions |\n| `mcp_azure_mcp_monitor` | `logs_query` | Query diagnostic logs with KQL |\n| `mcp_azure_mcp_resourcehealth` | ``get`` | Check service health status |\n| `mcp_azure_mcp_documentation` | `Doc search` | Search Microsoft Learn for troubleshooting docs |\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Troubleshoot Event Hubs SDK errors, Service Bus SDK issues, and messaging connection failures (including AMQP protocol errors).\n- Resolve event processor host issues, message lock expiration, and lock renewal failures.\n- Work with lock renewal batch, send timeout, receiver disconnected, and SDK troubleshooting\n- Debug Azure Messaging SDK problems affecting Event Hubs consumers, Service Bus queues, and topic subscriptions.\n- Enable and configure logging for Event Hubs.\n- Set up logging for Service Bus and configure SDK logging in Python, Java, and JavaScript.\n- Configure .NET Service Bus clients and manage Event Hubs checkpoints.\n- Event hub not receiving messages\n- Handle dead-letter messages, resolve batch processing locks, and troubleshoot session timeouts.\n- Address inactive connections, link detachment, slow reconnection, and session errors.\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"event hub SDK error in my Python app\"\n- \"my event hub consumer isn't receiving messages\"\n- \"event hub checkpoint store failing\"\n- \"`eventhub` python connection timeout\"\n- \"`eventhub` javascript client disconnects\"\n- \"service bus SDK issue with message lock lost\"\n- \"service bus queue issue with dead letter\"\n- \"`servicebus` java send timeout\"\n- \"`servicebus` dotnet receiver disconnected\"\n- \"service bus message lock expired during batch processing\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-messaging/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-prepare.md",
    "content": "---\ntitle: Azure skill for prepare\ndescription: Prepare Azure apps for deployment (infra Bicep/Terraform, azure.yaml, Dockerfiles).\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.1.15\n---\n\n# Azure skill for prepare\n\nPrepare Azure apps for deployment (infra Bicep/Terraform, azure.yaml, Dockerfiles).\n\n**Skill:** `azure-prepare` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-prepare/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Prepare Azure apps for deployment (infra Bicep/Terraform, azure.yaml, Dockerfiles).\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI with Bicep** (v2.60.0+): [Install](/cli/azure/install-azure-cli), sign in with `az login`, then run `az bicep install`.\n- **[Terraform](https://developer.hashicorp.com/terraform/install)** (v1.5+).\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Create app in Azure\n- Build web app in Azure\n- Create API in Azure\n- Create serverless HTTP API\n- Create front end in Azure\n- Create back end in Azure\n- Build a service in Azure\n- Work with modernize application\n- Update application in Azure\n- Add authentication in Azure\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Create a dad joke generator and deploy to Azure\"\n- \"Build a web app and host it on Azure\"\n- \"I want to deploy my application to Azure\"\n- \"Set up Azure infrastructure for my project\"\n- \"Prepare my app for Azure deployment\"\n- \"Create an API and run it on Azure\"\n- \"Migrate my application to Azure\"\n- \"Configure Azure hosting for my app\"\n- \"Create a serverless HTTP API using Azure Functions and deploy to Azure\"\n- \"Create an event-driven function app to process messages and deploy to Azure Functions\"\n\n## Deployment workflow\n\nThis skill is the first step in the deployment workflow:\n\n1. **azure-prepare** (this skill) — generates infrastructure files and `.azure/deployment-plan.md`\n1. [**azure-validate**](azure-validate.md) — validates the deployment plan and infrastructure before deploying\n1. [**azure-deploy**](azure-deploy.md) — executes the deployment\n\n## Related content\n\n- [Azure skill for validate](azure-validate.md)\n- [Azure skill for deploy](azure-deploy.md)\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-prepare/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-quotas.md",
    "content": "---\ntitle: Azure skill for quotas\ndescription: Check/manage Azure quotas and usage across providers. For deployment planning, capacity validation, region selection.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.6\n---\n\n# Azure skill for quotas\n\nCheck/manage Azure quotas and usage across providers. For deployment planning, capacity validation, region selection.\n\n**Skill:** `azure-quotas` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-quotas/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Check/manage Azure quotas and usage across providers. For deployment planning, capacity validation, region selection.\n\n## Prerequisites\n\n- **Azure subscription and region**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one. Both a subscription and a target region are needed to check quotas.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Check quotas in Azure\n- Work with service limits and current usage\n- Request quota increase in Azure\n- Work with quota exceeded\n- Validate capacity in Azure\n- Work with regional availability\n- Provisioning limits in Azure\n- Work with vCPU limit\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"How do I check my Azure quota limits?\"\n- \"What are the service limits for my Azure subscription?\"\n- \"Check current usage for my compute quota\"\n- \"I need to request a quota increase for VMs in East US\"\n- \"My deployment failed with a quota exceeded error\"\n- \"How do I validate deployment capacity before provisioning?\"\n- \"Help me select a region based on quota availability\"\n- \"Compare quotas across regions for Standard_D4s_v3\"\n- \"What is the provisioning limit for public IP addresses?\"\n- \"Check regional capacity for Container Apps\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-quotas/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-rbac.md",
    "content": "---\ntitle: Azure skill for role-based access control (RBAC)\ndescription: Helps users find the right Azure RBAC role for an identity with least privilege access, then generate CLI commands and Bicep code to assign it. Also provides guidance on permissions required to grant roles.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.2\n---\n\n# Azure skill for role-based access control (RBAC)\n\nHelps users find the right Azure RBAC role for an identity with least privilege access, then generate CLI commands and Bicep code to assign it. Also provides guidance on permissions required to grant roles.\n\n**Skill:** `azure-rbac` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-rbac/SKILL.md)\n\n## What it provides\n\nThis skill gives GitHub Copilot expertise in Azure role-based access control so it can guide you through secure role assignments. Specifically, it provides:\n\n- **Least-privilege role recommendations**: Searches built-in Azure roles to find the minimal role definition that matches the permissions your identity needs.\n- **Custom role definitions**: When no built-in role fits, generates a custom role definition scoped to exactly the permissions you require.\n- **Role assignment commands**: Produces ready-to-run Azure CLI commands and Bicep code snippets for assigning roles to managed identities, service principals, or users.\n- **Granting permissions guidance**: Explains what permissions you need (such as `Microsoft.Authorization/roleAssignments/write`) to assign roles, and which built-in roles like User Access Administrator or Owner provide them.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n- **Azure role**: Your account must have `Microsoft.Authorization/roleAssignments/write` permission, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Work with bicep for role assignment, least privilege role, RBAC role for, and role to read blobs\n- Work with role for managed identity and custom role definition\n- Assign role to identity\n- Work with permissions to assign roles\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"What Azure RBAC role should I assign to my managed identity?\"\n- \"Which Azure role gives least privilege access to read blobs from storage?\"\n- \"What role do I need for my identity to access Azure Key Vault secrets?\"\n- \"Help me find the right Azure role for container registry access\"\n- \"I need a custom role definition for my Azure storage account\"\n- \"What Azure role should I use to give my function app access to Service Bus?\"\n- \"Assign an Azure RBAC role to my identity for Cosmos DB read access\"\n- \"What is the least privilege role for reading from a storage queue?\"\n- \"I need to assign a role to my app service managed identity for database access\"\n- \"Generate Bicep code for assigning a role to my function app\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-rbac/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-resource-lookup.md",
    "content": "---\ntitle: Azure skill for resource lookup\ndescription: List, find, and show Azure resources across subscriptions or resource groups. Handles prompts like \"list websites\", \"list virtual machines\", \"list my VMs\", \"show storage accounts\", \"find container apps\", and \"what resources do I have\".\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.1\n---\n\n# Azure skill for resource lookup\n\nList, find, and show Azure resources across subscriptions or resource groups. Handles prompts like \"list websites\", \"list virtual machines\", \"list my VMs\", \"show storage accounts\", \"find container apps\", and \"what resources do I have\".\n\n**Skill:** `azure-resource-lookup` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-resource-lookup/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. List, find, and show Azure resources across subscriptions or resource groups. Handles prompts like \"list websites\", \"list virtual machines\", \"list my VMs\", \"show storage accounts\", \"find container apps\", and \"what resources do I have\".\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n- **[Azure Key Vault](/azure/key-vault/general/quick-create-portal)**: A key vault for secrets and certificate management.\n- **[Azure Storage](/azure/storage/common/storage-account-create)**: A storage account for blob, file, queue, or table data.\n- **[Azure Kubernetes Service](/azure/aks/learn/quick-kubernetes-deploy-portal)**: An AKS cluster for container orchestration.\n- **[Azure Cosmos DB](/azure/cosmos-db/nosql/quickstart-portal)**: A Cosmos DB account for NoSQL data.\n\n### Related tools\n\n| Tool | Command | Purpose |\n|------|---------|---------|\n| `extension_cli_generate` | `Generate `az graph query` commands` | Primary tool - generate ARG queries from user intent |\n| `mcp_azure_mcp_subscription_list` | `List available subscriptions` | Discover subscription scope before querying |\n| `mcp_azure_mcp_group_list` | `List resource groups` | Narrow query scope |\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Work with resource inventory\n- Find resources by tag\n- Work with tag analysis\n- Orphaned resource discovery (not for cost analysis)\n- Work with unattached disks, count resources by type, and cross-subscription lookup\n- And Azure Resource Graph queries\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"List the websites in my subscription\"\n- \"Show me the websites in my resource group\"\n- \"List all virtual machines in my subscription\"\n- \"Show me all VMs in resource group 'my-rg'\"\n- \"List my Azure storage accounts\"\n- \"List all my Azure Container Registries\"\n- \"List the container apps in my subscription\"\n- \"Show me the container apps in my resource group\"\n- \"What resources do I have across all my subscriptions?\"\n- \"Show me all my Azure resources\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-resource-lookup/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-resource-visualizer.md",
    "content": "---\ntitle: Azure skill for resource visualizer\ndescription: Analyze Azure resource groups and generate detailed Mermaid architecture diagrams showing the relationships between individual resources.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.1\n---\n\n# Azure skill for resource visualizer\n\nAnalyze Azure resource groups and generate detailed Mermaid architecture diagrams showing the relationships between individual resources.\n\n**Skill:** `azure-resource-visualizer` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-resource-visualizer/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Analyze Azure resource groups and generate detailed Mermaid architecture diagrams showing the relationships between individual resources.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Create architecture diagram in Azure\n- Visualize Azure resources\n- Work with generate Mermaid diagram\n- Analyze resource group in Azure\n- Work with diagram my resources, architecture visualization, resource topology, and map Azure infrastructure\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Create an architecture diagram for my Azure resource group\"\n- \"Generate a Mermaid diagram of my resource group\"\n- \"Visualize my Azure resources\"\n- \"Visualize the architecture of my Azure resources\"\n- \"Architecture visualization for my Azure infrastructure\"\n- \"Show me the relationships between my Azure resources\"\n- \"Show resource relationships\"\n- \"How are my Azure resources connected?\"\n- \"Analyze my resource group\"\n- \"Analyze resource group architecture\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-resource-visualizer/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-storage.md",
    "content": "---\ntitle: Azure skill for storage\ndescription: Azure Storage Services including Blob Storage, File Shares, Queue Storage, Table Storage, and Data Lake. Provides object storage, SMB file shares, async messaging, NoSQL key-value, and big data analytics capabilities. Includes access tiers (hot, cool, archive) and lifecycle management.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.0\n---\n\n# Azure skill for storage\n\nAzure Storage Services including Blob Storage, File Shares, Queue Storage, Table Storage, and Data Lake. Provides object storage, SMB file shares, async messaging, NoSQL key-value, and big data analytics capabilities. Includes access tiers (hot, cool, archive) and lifecycle management.\n\n**Skill:** `azure-storage` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-storage/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Azure Storage Services including Blob Storage, File Shares, Queue Storage, Table Storage, and Data Lake. Provides object storage, SMB file shares, async messaging, NoSQL key-value, and big data analytics capabilities. Includes access tiers (hot, cool, archive) and lifecycle management.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n- **[Azure Storage](/azure/storage/common/storage-account-create)**: A storage account for blob, file, queue, or table data.\n\n### Azure services knowledge\n\n| Service | When to use |\n|---------|------------|\n| Blob Storage | Objects, files, backups, static content |\n| File Shares | SMB file shares, lift-and-shift |\n| Queue Storage | Async messaging, task queues |\n| Table Storage | NoSQL key-value (consider Cosmos DB) |\n| Data Lake | Big data analytics, hierarchical namespace |\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Work with blob storage, file shares, queue storage, and table storage\n- Work with data lake\n- Upload files in Azure\n- Work with download blobs, storage accounts, access tiers, and lifecycle management\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Upload a file to my Azure Blob Storage container\"\n- \"Download a blob from my storage account\"\n- \"List all containers in my Azure Storage account\"\n- \"Set up lifecycle management to move blobs to archive tier\"\n- \"Create a file share in my storage account\"\n- \"What's the difference between hot, cool, and archive access tiers?\"\n- \"Set up a queue storage for async processing\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-storage/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-upgrade.md",
    "content": "---\ntitle: Azure skill for upgrade\ndescription: Assess and upgrade Azure workloads between plans, tiers, or SKUs within Azure. Generates assessment reports and automates upgrade steps.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.0\n---\n\n# Azure skill for upgrade\n\nAssess and upgrade Azure workloads between plans, tiers, or SKUs within Azure. Generates assessment reports and automates upgrade steps.\n\n**Skill:** `azure-upgrade` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-upgrade/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Assess and upgrade Azure workloads between plans, tiers, or SKUs within Azure. Generates assessment reports and automates upgrade steps.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Upgrade Consumption to Flex Consumption\n- Upgrade Azure Functions plan\n- Migrate hosting plan in Azure\n- Upgrade Functions SKU in Azure\n- Move to Flex Consumption\n- Upgrade Azure service tier\n- Work with change hosting plan\n- Upgrade function app plan\n- Migrate App Service to Container Apps\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Upgrade my function app from Consumption to Flex Consumption\"\n- \"Move my function app to a better plan\"\n- \"Is my function app ready for Flex Consumption?\"\n- \"Automate the steps to upgrade my Functions plan\"\n- \"Upgrade my Azure Functions SKU\"\n- \"Change my function app hosting plan\"\n- \"Migrate my Azure Functions from Consumption to Flex Consumption\"\n- \"Assess my function app for upgrade readiness\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-upgrade/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/azure-validate.md",
    "content": "---\ntitle: Azure skill for validate\ndescription: Pre-deployment validation for Azure readiness. Run deep checks on configuration, infrastructure (Bicep or Terraform), RBAC role assignments, managed identity permissions, and prerequisites before deploying.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.4\n---\n\n# Azure skill for validate\n\nPre-deployment validation for Azure readiness. Run deep checks on configuration, infrastructure (Bicep or Terraform), role-based access control (RBAC) role assignments, managed identity permissions, and prerequisites before deploying.\n\n**Skill:** `azure-validate` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-validate/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Pre-deployment validation for Azure readiness. Run deep checks on configuration, infrastructure (Bicep or Terraform), RBAC role assignments, managed identity permissions, and prerequisites before deploying.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI** (v2.60.0+): [Install](/cli/azure/install-azure-cli) and sign in with `az login`.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Validate my app in Azure\n- Check deployment readiness in Azure\n- Run preflight checks in Azure\n- Verify configuration in Azure\n- Check if ready to deploy\n- Validate azure.yaml\n- Validate Bicep in Azure\n- Test before deploying in Azure\n- Troubleshoot deployment errors in Azure\n- Validate Azure Functions\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Check if my app is ready to deploy to Azure\"\n- \"Validate my azure.yaml configuration\"\n- \"Run preflight checks before Azure deployment\"\n- \"Troubleshoot deployment errors\"\n- \"Verify my infrastructure configuration before deploying\"\n- \"Is my app ready for Azure deployment?\"\n- \"Validate my Bicep configuration\"\n- \"Validate my Bicep template before deploying to Azure\"\n- \"Check my deployment permissions before running `azd` up\"\n- \"Verify my Bicep files are valid before provisioning\"\n\n## Deployment workflow\n\nThis skill is the second step in the deployment workflow:\n\n1. [**azure-prepare**](azure-prepare.md) — generates infrastructure files and `.azure/deployment-plan.md`\n1. **azure-validate** (this skill) — validates the deployment plan and infrastructure before deploying\n1. [**azure-deploy**](azure-deploy.md) — executes the deployment\n\n## Related content\n\n- [Azure skill for prepare](azure-prepare.md)\n- [Azure skill for deploy](azure-deploy.md)\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/azure-validate/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/entra-agent-id.md",
    "content": "---\ntitle: Azure skill for Entra Agent ID\ndescription: Provisions Microsoft Entra Agent Identity Blueprints, BlueprintPrincipals, and per-instance Agent Identities via Microsoft Graph, and configures OAuth 2.0 token exchange.\nms.topic: reference\nms.date: 05/05/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.1\n---\n\n# Azure skill for Entra Agent ID\n\nProvisions Microsoft Entra Agent Identity Blueprints, BlueprintPrincipals, and per-instance Agent Identities via Microsoft Graph, and configures OAuth 2.0 token exchange.\n\n**Skill:** `entra-agent-id` | [Source code](https://github.com/microsoft/skills/blob/main/.github/skills/entra-agent-id/SKILL.md)\n\n> [!IMPORTANT]\n> **Preview API** — All Agent Identity endpoints are under Microsoft Graph `/beta` only. They are not available in `/v1.0`. Verify API parameters match current preview behavior before production use.\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge for creating and managing OAuth 2.0-capable identities for AI agents using Microsoft Graph. Every agent instance gets a distinct identity, audit trail, and independently scoped permission grants. The skill covers the Agent Identity object model (Blueprint → BlueprintPrincipal → Agent Identity), runtime token exchange flows, and the Microsoft Entra SDK for AgentID sidecar.\n\nFor the latest Agent ID documentation, use the [microsoft-docs skill](https://github.com/microsoft/skills/blob/main/.github/skills/microsoft-docs/SKILL.md) which queries the Microsoft Learn MCP Server (`learn.microsoft.com/api/mcp`) for current API parameters and behavior.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Microsoft Entra role**: Agent Identity Developer, Agent Identity Administrator, or Application Administrator.\n- **Microsoft Graph access**: PowerShell (`Microsoft.Graph.Applications`) or Python (`azure-identity`, `requests`).\n- **OData-Version header**: Include `OData-Version: 4.0` on every Graph request to Agent Identity endpoints.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Provision a new Agent Identity Blueprint and BlueprintPrincipal.\n- Create per-instance Agent Identities under a Blueprint.\n- Configure credentials (Federated Identity Credential, Managed Identity, or client secret) on the Blueprint.\n- Implement the two-step `fmi_path` runtime token exchange (autonomous or OBO).\n- Set up cross-tenant agent token flows.\n- Deploy the Microsoft Entra SDK for AgentID sidecar for polyglot agents (Python, Node, Go, Java).\n- Grant per-Agent-Identity application or delegated permissions.\n- Diagnose Agent ID errors such as `AADSTS82001`, `AADSTS700211`, or `PropertyNotCompatibleWithAgentIdentity`.\n\n### When not to use this skill\n\n- Standard Entra app registration — use [entra-app-registration](entra-app-registration.md).\n- Azure RBAC — use [azure-rbac](azure-rbac.md).\n- Microsoft Foundry agent authoring — use [microsoft-foundry](microsoft-foundry.md).\n\n## Suggested workflow\n\nThe skill follows a core provisioning workflow:\n\n1. **Create Agent Identity Blueprint**: Define the agent type/class as an application object.\n1. **Create BlueprintPrincipal**: Explicitly create the service principal. This step is mandatory — creating a Blueprint does NOT auto-create its service principal. Without this step, Agent Identity creation fails with `400: The Agent Blueprint Principal for the Agent Blueprint does not exist.`\n1. **Create Agent Identities**: Provision per-instance identities under the Blueprint. Sponsors are required and must be User objects — ServicePrincipals and Groups are rejected.\n1. **Configure credentials**: Set up authentication on the Blueprint (Workload Identity Federation for production, client secret for dev).\n1. **Grant permissions**: Assign application or delegated permissions per Agent Identity.\n1. **Configure runtime exchange**: Implement the two-step `fmi_path` token exchange for autonomous or OBO flows.\n\n> [!IMPORTANT]\n> `DefaultAzureCredential` is not supported for Agent Identity APIs. Azure CLI tokens carry `Directory.AccessAsUser.All`, which Agent Identity APIs reject with 403. You MUST use a dedicated app registration with `client_credentials` flow, or connect via `Connect-MgGraph` with explicit delegated scopes.\n\n## Required permissions\n\nAgent Identity APIs use 18 specific Microsoft Graph application permissions. Discover them with:\n\n```azurecli\naz ad sp show --id 00000003-0000-0000-c000-000000000000 \\\n  --query \"appRoles[?contains(value, 'AgentIdentity')].{id:id, value:value}\" -o json\n```\n\nKey permissions include:\n\n| Permission | Purpose |\n|-----------|---------|\n| `Application.ReadWrite.All` | Blueprint CRUD (application objects) |\n| `AgentIdentityBlueprint.Create` | Create new Blueprints |\n| `AgentIdentityBlueprint.ReadWrite.All` | Manage Blueprint lifecycle |\n| `AgentIdentity.Create.All` | Create per-instance identities |\n| `AgentIdentity.ReadWrite.All` | Manage Agent Identity lifecycle |\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"Set up an Agent Identity Blueprint for my AI agent\"\n- \"Create a BlueprintPrincipal for my agent\"\n- \"Provision agent identities for my AI agents\"\n- \"Configure OAuth for agent identity\"\n- \"Set up fmi_path token exchange for my agent\"\n- \"Configure agent OBO flow\"\n- \"Set up Workload Identity Federation for agents\"\n- \"Deploy the Microsoft Entra SDK for AgentID sidecar\"\n- \"Configure polyglot agent authentication\"\n\n## Related content\n\n- [Microsoft Entra Agent ID AI-guided setup](/entra/agent-id/identity-platform/agent-id-ai-guided-setup)\n- [Microsoft Entra SDK for AgentID](/entra/msidweb/agent-id-sdk/overview)\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/skills/blob/main/.github/skills/entra-agent-id/SKILL.md)\n\n> [!NOTE]\n> The [skill source](https://github.com/microsoft/skills/blob/main/.github/skills/entra-agent-id/SKILL.md) is an AI instruction file that tells GitHub Copilot when and how to use this capability. For official developer documentation, see the [Microsoft Entra Agent ID AI-guided setup](/entra/agent-id/identity-platform/agent-id-ai-guided-setup).\n"
  },
  {
    "path": "articles/azure-skills/skills/entra-app-registration.md",
    "content": "---\ntitle: Azure skill for Entra app registration\ndescription: Guides Microsoft Entra ID app registration, OAuth 2.0 authentication, and MSAL integration.\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.1\n---\n\n# Azure skill for Entra app registration\n\nGuides Microsoft Entra ID app registration, OAuth 2.0 authentication, and MSAL integration.\n\n**Skill:** `entra-app-registration` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/entra-app-registration/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Guides Microsoft Entra ID app registration, OAuth 2.0 authentication, and MSAL integration.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **Azure CLI with Bicep** (v2.60.0+): [Install](/cli/azure/install-azure-cli), sign in with `az login`, then run `az bicep install`.\n- **[Azure Key Vault](/azure/key-vault/general/quick-create-portal)**: A key vault for secrets and certificate management.\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Create a Microsoft Entra ID app registration for your application.\n- Register your application with Microsoft Entra ID.\n- Configure OAuth 2.0 authentication flows for your registered application.\n- Set up authentication and authorization for your application.\n- Add API permissions in Azure\n- Work with generate service principal, MSAL example, console app auth, and Entra ID setup\n- Work with Microsoft Entra ID authentication\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"How do I create an app registration in Azure?\"\n- \"Register a Microsoft Entra ID app for my web application\"\n- \"Configure OAuth authentication for my application\"\n- \"Set up authentication with Microsoft Entra ID\"\n- \"Add API permissions to my Entra app registration\"\n- \"Generate a service principal for Azure authentication\"\n- \"Show me MSAL examples for Microsoft Entra ID authentication.\"\n- \"Create a console app with Microsoft Entra ID authentication\"\n- \"Help me set up Entra ID authentication for my app\"\n- \"Configure Microsoft Entra ID OAuth authentication for my API\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/entra-app-registration/SKILL.md)\n\n"
  },
  {
    "path": "articles/azure-skills/skills/microsoft-foundry.md",
    "content": "---\ntitle: Azure skill for Microsoft Foundry\ndescription: \"Deploy, evaluate, and manage Foundry agents end-to-end: Docker build, acr push, hosted and prompt agent create, container start, batch eval, prompt optimization, and dataset curation from traces.\"\nms.topic: reference\nms.date: 4/2/2026\nauthor: diberry\nms.author: diberry\nms.service: azure-mcp-server\nms.custom: skill-version-1.0.10\n---\n\n# Azure skill for Microsoft Foundry\n\nDeploy, evaluate, and manage Foundry agents end-to-end: Docker build, acr push, hosted/prompt agent create, container start, batch eval, prompt optimization, prompt optimizer workflows, agent.yaml, dataset curation from traces.\n\n**Skill:** `microsoft-foundry` | [Source code](https://github.com/microsoft/azure-skills/blob/main/skills/microsoft-foundry/SKILL.md)\n\n## What it provides\n\nThis skill provides GitHub Copilot with specialized knowledge. Deploy, evaluate, and manage Foundry agents end-to-end: Docker build, acr push, hosted/prompt agent create, container start, batch eval, prompt optimization, prompt optimizer workflows, agent.yaml, dataset curation from traces.\n\n## Prerequisites\n\n- **Azure subscription**: [Create a free account](https://azure.microsoft.com/free/) if you don't have one.\n- **AI assistant with Azure Skills**: [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/get-started), Visual Studio Code with [Azure MCP extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-mcp-server), Claude Code, or another [compatible MCP client](../install.md).\n- **[PowerShell](/powershell/scripting/install/installing-powershell)** (v7.4+): Install with `winget install Microsoft.PowerShell`.\n- **Bash**: A Bash-compatible shell (macOS/Linux terminal or [WSL](/windows/wsl/install) on Windows).\n\n## When to use this skill\n\nUse this skill when you need to:\n\n- Deploy agents to Azure AI Foundry.\n- Configure and manage hosted agents.\n- Create agents in Azure AI Foundry.\n- Invoke and test agents.\n- Evaluate agent performance using Azure AI Foundry evaluators.\n- Run batch evaluations against your agents.\n- Optimize prompts for agent instructions.\n- Improve agent prompts and system instructions using the prompt optimizer.\n- Refine agent instructions for better performance.\n- Optimize system prompts for your agents.\n- Manage RBAC permissions, role assignments, managed identities, and service principals for Foundry resources.\n\n## Example prompts\n\nTry these prompts to activate this skill:\n\n- \"How do I deploy an AI model from Microsoft Foundry catalog?\"\n- \"Build a RAG application with Azure AI Foundry knowledge index\"\n- \"Create an AI agent in Microsoft Foundry with web search\"\n- \"Evaluate agent performance using Foundry evaluators\"\n- \"Optimize my prompt for a Microsoft Foundry agent\"\n- \"Improve my agent instructions in Azure AI Foundry\"\n- \"Use a prompt optimizer on my Foundry system prompt\"\n- \"Set up agent monitoring and continuous evaluation in Foundry\"\n- \"Help me with Microsoft Foundry model deployment\"\n- \"How to use knowledge index for RAG in Azure AI Foundry?\"\n\n## Related content\n\n- [Azure Model Context Protocol (MCP) Server overview](/azure/developer/azure-mcp-server/overview)\n- [Skill source code](https://github.com/microsoft/azure-skills/blob/main/skills/microsoft-foundry/SKILL.md)\n\n"
  },
  {
    "path": "articles/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: AI\n      tocHref: /azure/developer/ai\n      topicHref: /azure/developer/ai/index\n    - name: Ansible\n      tocHref: /azure/developer/ansible\n      topicHref: /azure/developer/ansible/index\n    - name: C++\n      tocHref: /azure/developer/cpp\n      topicHref: /azure/developer/cpp/index\n    - name: GitHub\n      tocHref: /azure/developer/github\n      topicHref: /azure/developer/github/index\n    - name: Go\n      tocHref: /azure/developer/go\n      topicHref: /azure/developer/go/index\n    - name: Java\n      tocHref: /azure/developer/java\n      topicHref: /azure/developer/java/index\n    - name: JavaScript\n      tocHref: /azure/developer/javascript\n      topicHref: /azure/developer/javascript/index\n    - name: Jenkins\n      tocHref: /azure/developer/jenkins\n      topicHref: /azure/developer/jenkins/index\n    - name: Migrate\n      tocHref: /azure/developer/migrate\n      topicHref: /azure/developer/migrate/index\n    - name: Python\n      tocHref: /azure/developer/python\n      topicHref: /azure/developer/python/index\n    - name: Rust\n      tocHref: /azure/developer/rust\n      topicHref: /azure/developer/rust/index\n    - name: Terraform\n      tocHref: /azure/developer/terraform\n      topicHref: /azure/developer/terraform/index\n    - name: Azure Developer CLI\n      tocHref: /azure/developer/azure-developer-cli\n      topicHref: /azure/developer/azure-developer-cli/index\n    - name: Dev Tunnels CLI\n      tocHref: /azure/developer/dev-tunnels\n      topicHref: /azure/developer/dev-tunnels/index\n    - name: GitHub Copilot modernization\n      tocHref: /azure/developer/github-copilot-app-modernization\n      topicHref: /azure/developer/github-copilot-app-modernization/index\n    - name: TypeSpec\n      tocHref: /azure/developer/typespec\n      topicHref: /azure/developer/typespec/index\n    - name: AI developer tools\n      tocHref: /azure/developer/ai-developer-tools\n      topicHref: /azure/developer/ai-developer-tools/index\n      items:\n      - name: GitHub Copilot for Azure\n        tocHref: /azure/developer/github-copilot-azure\n        topicHref: /azure/developer/github-copilot-azure/index\n      - name: Azure MCP Server\n        tocHref: /azure/developer/azure-mcp-server\n        topicHref: /azure/developer/azure-mcp-server/index\n      - name: Azure Skills\n        tocHref: /azure/developer/azure-skills\n        topicHref: /azure/developer/azure-skills/index\n    - name: Introduction\n      tocHref: /azure/developer/intro\n      topicHref: /azure/developer/intro/index\n"
  },
  {
    "path": "articles/cpp/TOC.yml",
    "content": "items: \n  - name: Azure for C++ developers\n    href: index.yml\n  - name: Get started\n    items:\n      - name: How to install the Azure SDK for C++\n        href: sdk/install-and-integrate-the-sdk.md\n  - name: Use the Azure SDK for C++\n    items: \n      - name: Overview\n        href: sdk/overview.md \n      - name: Fundamentals\n        items: \n          - name: Overview\n            href: sdk/fundamentals/overview.md\n          - name: Errors\n            href: sdk/fundamentals/errors.md\n          - name: HTTP pipelines and retries\n            href: sdk/fundamentals/http-pipelines-and-retries.md\n          - name: Common types\n            href: sdk/fundamentals/common-types.md\n          - name: Language design guidelines\n            href: https://azure.github.io/azure-sdk/cpp_introduction.html\n      - name: Authentication\n        items: \n          - name: Overview\n            href: sdk/authentication/overview.md\n          - name: Auth during local development\n            items:\n            - name: Use a developer account\n              href: sdk/authentication/local-development-dev-accounts.md\n            - name: Use a service principal\n              href: sdk/authentication/local-development-service-principal.md\n          - name: Auth from Azure-hosted apps\n            items:\n            - name: Use a system-assigned managed identity\n              href: sdk/authentication/system-assigned-managed-identity.md\n            - name: Use a user-assigned managed identity\n              href: sdk/authentication/user-assigned-managed-identity.md\n          - name: Credential chains\n            href: sdk/authentication/credential-chains.md\n  - name: API reference\n    href: /cpp/api/overview/\n"
  },
  {
    "path": "articles/cpp/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure for C++ developers\nsummary: Learn to use the Azure SDK for C++, browse API references, sample code, tutorials, quickstarts, conceptual articles, and more.\nmetadata:\n  title: Azure for C++ developers\n  description: Get started developing with the Azure SDK for C++.\n  ms.date: 5/08/2025\n  ms.topic: landing-page\n  ms.collection: collection\n  ms.custom: devx-track-cpp\n\nlandingContent:\n  - title: Azure libraries (SDK)\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: What is the Azure SDK for C++?\n            url: sdk/overview.md\n      - linkListType: download\n        links:\n          - text: Install and Integrate the Azure SDK for C++\n            url: sdk/install-and-integrate-the-sdk.md\n      - linkListType: overview\n        links:\n          - text: Credential chains in the Azure Identity client library for C++\n            url: sdk/authentication/credential-chains.md\n            \n"
  },
  {
    "path": "articles/cpp/sdk/authentication/credential-chains.md",
    "content": "---\ntitle: Credential Chains in the Azure Identity Client Library for C++\ndescription: This article describes the DefaultAzureCredential and ChainedTokenCredential classes in the Azure Identity client library for C++.\nms.date: 11/24/2025\nms.topic: concept-article\nms.custom: devx-track-cpp\n\n#customer intent: As a developer using the Azure SDK for C++, I want to use credential chains to combine different authentication methods, so my app can authenticate seamlessly across different environments, from local development to production deployments in Azure.\n---\n\n# Credential chains in the Azure Identity client library for C++\n\nThe Azure Identity client library provides *credentials*&mdash;public types that derive from the Azure Core library's [TokenCredential](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity) abstract base class. A credential represents a distinct authentication flow for acquiring an access token from Microsoft Entra ID. These credentials can be chained together to form an ordered sequence of authentication mechanisms to be attempted.\n\n## How a chained credential works\n\nAt runtime, a credential chain attempts to authenticate using the sequence's first credential. If that credential fails to acquire an access token, the next credential in the sequence is attempted, and so on, until an access token is successfully obtained. The following sequence diagram illustrates this behavior:\n\n:::image type=\"content\" source=\"./../media/mermaidjs/chain-sequence.svg\" alt-text=\"Diagram that shows credential chain sequence.\":::\n\n## Why use credential chains?\n\nA chained credential can offer the following benefits:\n\n- **Environment awareness**: Automatically selects the most appropriate credential based on the environment in which the app is running. Without it, you'd have to write code like this:\n\n    ```cpp\n    // Set up credential based on environment (Azure or local development)\n    std::shared_ptr<Azure::Core::Credentials::TokenCredential> credential;\n    if (std::getenv(\"WEBSITE_HOSTNAME\"))\n    {\n        credential = std::make_shared<Azure::Identity::ManagedIdentityCredential>();\n    }\n    else\n    {\n        credential = std::make_shared<Azure::Identity::AzureCliCredential>();\n    }\n    ```\n\n- **Seamless transitions**: Your app can move from local development to your staging or production environment without changing authentication code.\n- **Improved resiliency**: Includes a fallback mechanism that moves to the next credential when the prior fails to acquire an access token.\n\n## How to choose a chained credential\n\nWith C++, there are two choices for credential chaining:\n\n- **Use a preconfigured chain**: Use the preconfigured chain implemented by the `DefaultAzureCredential` type. For this approach, see the [DefaultAzureCredential overview](#defaultazurecredential-overview) section.\n- **Build a custom credential chain**: Start with an empty chain and include only what you need. For this approach, see the [ChainedTokenCredential overview](#chainedtokencredential-overview) section.\n\n## DefaultAzureCredential overview\n\n[DefaultAzureCredential](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#defaultazurecredential) is an opinionated, preconfigured chain of credentials. Its design supports many environments, along with the most common authentication flows and developer tools. In graphical form, the underlying chain looks like this:\n\n:::image type=\"content\" source=\"./../media/mermaidjs/default-azure-credential-authentication-flow.svg\" alt-text=\"Diagram that shows DefaultAzureCredential authentication flow.\":::\n\nThe order in which `DefaultAzureCredential` attempts credentials follows.\n\n| Order | Credential                   | Description                                                                                                                                                                                                                                                                                                                                    |\n|-------|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| 1     | [Environment][env-cred]      | Reads a collection of [environment variables][env-vars] to determine if an application service principal (application user) is configured for the app. If so, `DefaultAzureCredential` uses these values to authenticate the app to Azure. This method is most often used in server environments but can also be used when developing locally. |\n| 2     | [Workload Identity][wi-cred] | If the app is deployed to an Azure host with Workload Identity enabled, authenticate that account.                                                                                                                                                                                                                                             |\n| 3     | [Managed Identity][mi-cred]  | If the app is deployed to an Azure host with Managed Identity enabled, authenticate the app to Azure using that Managed Identity.                                                                                                                                                                                                              |\n| 4     | [Azure CLI][az-cred]         | If the developer authenticated to Azure using Azure CLI's `az login` command, authenticate the app to Azure using that same account.                                                                                                                                                                                                           |\n\n[env-cred]: https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#environment-variables\n[wi-cred]: https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#authenticate-azure-hosted-applications\n[mi-cred]: https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#managed-identity-support\n[az-cred]: https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#authenticate-via-development-tools\n\nIn its simplest form, you can use the parameterless version of `DefaultAzureCredential` as follows:\n\n```cpp\n#include <azure/identity/default_azure_credential.hpp>\n#include <azure/storage/blobs/blob_client.hpp>\n\nint main()\n{\n    // create a credential\n    auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>();\n\n    // create a Blob service client\n    auto blobUrl = \"https://<my_account_name>.blob.core.windows.net/mycontainer/myblob\";\n    Azure::Storage::Blobs::BlobClient blobClient{blobUrl, credential};\n}\n```\n\n### How to customize DefaultAzureCredential\n\nThe following sections describe strategies for controlling which credentials are included in the chain.\n\n#### Exclude a credential type category\n\nTo exclude all `Developer tool` or `Deployed service` credentials, set environment variable `AZURE_TOKEN_CREDENTIALS` to `prod` or `dev`, respectively. When a value of `prod` is used, the underlying credential chain looks as follows:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-environment-variable-production.svg\" alt-text=\"Diagram that shows DefaultAzureCredential with AZURE_TOKEN_CREDENTIALS set to 'prod'.\":::\n\nWhen a value of `dev` is used, the chain only includes `AzureCliCredential`.\n\nTo ensure the environment variable is defined and set to a supported string, pass `true` to the `DefaultAzureCredential` constructor:\n\n```cpp\nauto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);\n```\n\n> [!IMPORTANT]\n> The aforementioned constructor overload is supported in `azure-identity-cpp` package versions 1.13.1 and later.\n\n#### Use a specific credential\n\nTo exclude all credentials except for one, set environment variable `AZURE_TOKEN_CREDENTIALS` to the credential name. For example, you can reduce the `DefaultAzureCredential` chain to `AzureCliCredential` by setting `AZURE_TOKEN_CREDENTIALS` to `AzureCliCredential`. The string comparison is performed in a case-insensitive manner. Valid string values for the environment variable include:\n\n- `AzureCliCredential`\n- `EnvironmentCredential`\n- `ManagedIdentityCredential`\n- `WorkloadIdentityCredential`\n\nTo ensure the environment variable is defined and set to a supported string, pass `true` to the `DefaultAzureCredential` constructor:\n\n```cpp\nauto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);\n```\n\n> [!IMPORTANT]\n> The aforementioned constructor overload is supported in `azure-identity-cpp` package versions 1.13.1 and later.\n\n## ChainedTokenCredential overview\n\n[ChainedTokenCredential](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#chained-token-credential) is an empty chain to which you add credentials to suit your app's needs. For example:\n\n```cpp\n#include <azure/identity/azure_cli_credential.hpp>\n#include <azure/identity/chained_token_credential.hpp>\n#include <azure/identity/managed_identity_credential.hpp>\n#include <azure/storage/blobs/blob_client.hpp>\n\nint main()\n{\n    // create a credential\n    auto credential = std::make_shared<Azure::Identity::ChainedTokenCredential>(\n        Azure::Identity::ChainedTokenCredential::Sources{\n            std::make_shared<Azure::Identity::ManagedIdentityCredential>(),\n            std::make_shared<Azure::Identity::AzureCliCredential>()});\n\n    // create a Blob service client\n    auto blobUrl = \"https://<my_account_name>.blob.core.windows.net/mycontainer/myblob\";\n    Azure::Storage::Blobs::BlobClient blobClient{blobUrl, credential};\n}\n```\n\nThe preceding code sample creates a tailored credential chain comprised of two credentials. `ManagedIdentityCredential` is attempted first, followed by `AzureCliCredential`, if necessary. In graphical form, the chain looks like this:\n\n:::image type=\"content\" source=\"./../media/mermaidjs/chained-token-credential-authentication-flow.svg\" alt-text=\"Diagram that shows authentication flow for a ChainedTokenCredential instance that is composed of ManagedIdentityCredential and AzureCliCredential.\":::\n\n> [!TIP]\n> For improved performance, optimize credential ordering in `ChainedTokenCredential` from most to least used credential.\n\n## Usage guidance for DefaultAzureCredential\n\n`DefaultAzureCredential` is undoubtedly the easiest way to get started with the Azure Identity client library, but with that convenience comes tradeoffs. Once you deploy your app to Azure, you should understand the app's authentication requirements. For that reason, replace `DefaultAzureCredential` with a specific `TokenCredential` implementation, such as `ManagedIdentityCredential`.\n\nHere's why:\n\n- **Debugging challenges**: When authentication fails, it can be challenging to debug and identify the offending credential. You must enable logging to see the progression from one credential to the next and the success/failure status of each. For more information, see [Debug a chained credential](#debug-a-chained-credential).\n- **Performance overhead**: The process of sequentially trying multiple credentials can introduce performance overhead. For example, when running on a local development machine, managed identity is unavailable. Consequently, `ManagedIdentityCredential` always fails in the local development environment.\n- **Unpredictable behavior**: `DefaultAzureCredential` checks for the presence of certain [environment variables][env-vars]. It's possible that someone could add or modify these environment variables at the system level on the host machine. Those changes apply globally and therefore alter the behavior of `DefaultAzureCredential` at runtime in any app running on that machine.\n\n## Debug a chained credential\n\nTo diagnose an unexpected issue or to understand what a chained credential is doing, [enable logging](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#troubleshooting) in your app.\nFor illustration purposes, assume the parameterless form of `DefaultAzureCredential` is used to authenticate a request to a Blob Storage account. The app runs in the local development environment, and the developer authenticated to Azure using the Azure CLI. When the app is run, the following pertinent entries appear in the output:\n\n```output\nDEBUG : Identity: Creating DefaultAzureCredential which combines multiple parameterless credentials into a single one.\nDefaultAzureCredential is only recommended for the early stages of development, and not for usage in production environment.\nOnce the developer focuses on the Credentials and Authentication aspects of their application, DefaultAzureCredential needs to be replaced with the credential that is the better fit for the application.\nINFO  : Identity: EnvironmentCredential gets created with ClientSecretCredential.\nDEBUG : Identity: EnvironmentCredential: 'AZURE_TENANT_ID', 'AZURE_CLIENT_ID', and 'AZURE_CLIENT_SECRET' environment variables are set, so ClientSecretCredential with corresponding tenantId, clientId, and clientSecret gets created.\nWARN  : Identity: Azure Kubernetes environment is not set up for the WorkloadIdentityCredential credential to work.\nDEBUG : Identity: ManagedIdentityCredential: Environment is not set up for the credential to be created with App Service 2019 source.\nDEBUG : Identity: ManagedIdentityCredential: Environment is not set up for the credential to be created with App Service 2017 source.\nDEBUG : Identity: ManagedIdentityCredential: Environment is not set up for the credential to be created with Cloud Shell source.\nDEBUG : Identity: ManagedIdentityCredential: Environment is not set up for the credential to be created with Azure Arc source.\nINFO  : Identity: ManagedIdentityCredential will be created with Azure Instance Metadata Service source.\nSuccessful creation does not guarantee further successful token retrieval.\nINFO  : Identity: AzureCliCredential created.\nSuccessful creation does not guarantee further successful token retrieval.\nINFO  : Identity: DefaultAzureCredential: Created with the following credentials: EnvironmentCredential, WorkloadIdentityCredential, ManagedIdentityCredential, AzureCliCredential.\nDEBUG : Identity: DefaultAzureCredential: Failed to get token from EnvironmentCredential: GetToken(): error response: 400 Bad Request\n\n{\"error\":\"invalid_grant\",\"error_description\":\"AADSTS53003: Access has been blocked by Conditional Access policies. The access policy does not allow token issuance. Trace ID: 0000aaaa-11bb-cccc-dd22-eeeeee333333 Correlation ID: aaaa0000-bb11-2222-33cc-444444dddddd Timestamp: 2025-03-07 21:25:44Z\",\"error_codes\":[53003],\"timestamp\":\"2025-03-07 21:25:44Z\",\"trace_id\":\"0000aaaa-11bb-cccc-dd22-eeeeee333333\",\"correlation_id\":\"aaaa0000-bb11-2222-33cc-444444dddddd\",\"error_uri\":\"https://login.microsoftonline.com/error?code=53003\",\"suberror\":\"message_only\",\"claims\":\"{\\\"access_token\\\":{\\\"capolids\\\":{\\\"essential\\\":true,\\\"values\\\":[\\\"cccc2222-dd33-4444-55ee-666666ffffff\\\"]}}}\"}\nWARN  : Identity: WorkloadIdentityCredential authentication unavailable. See earlier WorkloadIdentityCredential log messages for details.\nDEBUG : Identity: DefaultAzureCredential: Failed to get token from WorkloadIdentityCredential: WorkloadIdentityCredential authentication unavailable. Azure Kubernetes environment is not set up correctly.\nINFO  : Identity: DefaultAzureCredential: Successfully got token from ManagedIdentityCredential. This credential will be reused for subsequent calls.\nDEBUG : Identity: DefaultAzureCredential: Saved this credential at index 2 for subsequent calls.\n```\n\nIn the preceding output, notice that:\n\n- `EnvironmentCredential`, `WorkloadIdentityCredential`, and `ManagedIdentityCredential` each failed to acquire a Microsoft Entra access token, in that order.\n- `ManagedIdentityCredential` succeeds, as indicated by an entry that starts with \"`Successfully got token from ManagedIdentityCredential`\".\n\n\n<!-- LINKS -->\n[env-vars]: https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#environment-variables\n"
  },
  {
    "path": "articles/cpp/sdk/authentication/local-development-dev-accounts.md",
    "content": "---\ntitle: Authenticate C++ apps to Azure services during local development using developer accounts\ndescription: This article describes how to authenticate your application to Azure services when using the Azure SDK for C++ during local development using developer accounts.\n#customer intent: As a developer, I want to learn how to sign in to Azure using developer tools so that I can authenticate my app during development.\nms.date: 12/03/2025\nms.topic: how-to\nms.custom: devx-track-cpp, devx-track-azurecli\nai-usage: ai-assisted\n---\n\n# Authenticate C++ apps to Azure services during local development using developer accounts\n\nDuring local development, applications need to authenticate to Azure to use different Azure services. Authenticate locally using one of these approaches:\n\n- Use a developer account with one of the [developer tools supported by the Azure Identity library](#supported-developer-tools-for-authentication).\n- Use a [service principal](local-development-service-principal.md).\n\nThis article explains how to authenticate using a developer account with tools supported by the Azure Identity library. In the sections ahead, you learn:\n\n- How to use Microsoft Entra groups to efficiently manage permissions for multiple developer accounts.\n- How to assign roles to developer accounts to scope permissions.\n- How to sign-in to supported local development tools.\n- How to authenticate using a developer account from your app code.\n\n## Supported developer tools for authentication\n\nFor an app to authenticate to Azure during local development using the developer's Azure credentials, the developer must be signed-in to Azure using Azure CLI.\n\nThe Azure Identity library can detect that the developer is signed-in from the tool. The library can then obtain the Microsoft Entra access token via the tool to authenticate the app to Azure as the signed-in user.\n\nThis approach takes advantage of the developer's existing Azure accounts to streamline the authentication process. However, a developer's account likely has more permissions than required by the app, therefore exceeding the permissions the app runs with in production. As an alternative, you can [create application service principals to use during local development](./local-development-service-principal.md), which can be scoped to have only the access needed by the app.\n\n[!INCLUDE [create-entra-group](../../../includes/authentication/create-entra-group.md)]\n\n[!INCLUDE [assign-group-roles](../../../includes/authentication/assign-group-roles.md)]\n\n## Sign-in to Azure using developer tooling\n\nSign-in to Azure using one of several developer tools that can be used to perform authentication in your development environment. The account you authenticate should also exist in the Microsoft Entra group you created and configured earlier.\n\n### Azure CLI\n\nDevelopers can use [Azure CLI](/cli/azure/what-is-azure-cli) to authenticate. Apps using [DefaultAzureCredential](credential-chains.md#defaultazurecredential-overview) or [AzureCliCredential](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity) can then use this account to authenticate app requests.\n\nTo authenticate with the Azure CLI, run the `az login` command. On a system with a default web browser, the Azure CLI launches the browser to authenticate the user.\n\n```azurecli\naz login\n```\n\nFor systems without a default web browser, the `az login` command uses the device code authentication flow. The user can also force the Azure CLI to use the device code flow rather than launching a browser by specifying the `--use-device-code` argument.\n\n```azurecli\naz login --use-device-code\n```\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library for C++](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity) provides various *credentials* adapted to supporting different scenarios and Microsoft Entra authentication flows. The steps ahead demonstrate how to use `DefaultAzureCredential` when working with user accounts locally.\n\n### Implement the code\n\nThe [DefaultAzureCredential](credential-chains.md#defaultazurecredential-overview) class is an ordered sequence of mechanisms for authenticating to Microsoft Entra ID. Each authentication mechanism is a class derived from the `TokenCredential` class and is known as a *credential*. In this scenario, `DefaultAzureCredential` sequentially checks to see if the developer has signed-in to Azure using the Azure CLI. If the developer is signed-in to Azure CLI, then the credentials used to sign into the tool is used by the app to authenticate to Azure. For more information about customizing the credential chain, see [How to customize DefaultAzureCredential](credential-chains.md#how-to-customize-defaultazurecredential).\n\n1. Add the [azure-identity-cpp](https://vcpkg.io/en/package/azure-identity-cpp) package to your application using [vcpkg](/vcpkg/).\n\n    ```bash\n    vcpkg add port azure-identity-cpp\n    ```\n\n1. Add the following lines in your CMake file:\n\n    ```cmake\n    find_package(azure-identity-cpp CONFIG REQUIRED)\n    target_link_libraries(<your project name> PRIVATE Azure::azure-identity)\n    ```\n\n1. For any C++ code that creates an Azure SDK client object in your app, you want to:\n\n    1. Include the `azure/identity.hpp` header.\n    1. Use `DefaultAzureCredential` or `AzureCliCredential` to create an instance of a credential. For example:\n\n        - To use `DefaultAzureCredential`, set the environment variable `AZURE_TOKEN_CREDENTIALS` to `dev` that indicates the app is running in a development environment. For more information, see [How to customize DefaultAzureCredential](credential-chains.md#how-to-customize-defaultazurecredential).\n            \n            ```cpp\n            // Environment variable AZURE_TOKEN_CREDENTIALS=dev\n            auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);\n            ```\n        - Or use `AzureCliCredential` to always use the Azure CLI signed-in user to authenticate.\n            \n            ```cpp\n            auto credential = std::make_shared<Azure::Identity::AzureCliCredential>();\n            ```\n\n    1. Pass the instance of `DefaultAzureCredential` or `AzureCliCredential` to the Azure SDK client constructor.\n\n    An example of these steps is shown in the following code segment. The example creates an Azure Storage Blob client using `DefaultAzureCredential` to authenticate to Azure.\n\n    ```cpp\n    #include <azure/identity.hpp>\n    #include <azure/storage/blobs.hpp>\n    #include <iostream>\n    #include <memory>\n\n    int main() {\n        try {\n            // DefaultAzureCredential supports dev, test, and prod environments.\n            // See documentation for details on customizing the credential chain:\n            // https://learn.microsoft.com/azure/developer/cpp/sdk/authentication/credential-chains#defaultazurecredential-overview\n            // In production, it's better to use a specific credential type so authentication is more predictable and easier to debug.\n            // Here DefaultAzureCredential is used for local development and environment variable AZURE_TOKEN_CREDENTIALS=dev\n\n            auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);\n            \n            // Or use AzureCliCredential to always use the Azure CLI signed-in user to authenticate\n            // auto credential = std::make_shared<Azure::Identity::AzureCliCredential>();\n\n            // Create a client for the specified storage account\n            std::string accountUrl = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\";\n            Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);\n            \n            // Get a reference to a container\n            std::string containerName = \"sample-container\";\n            auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);\n            \n            // TODO: perform some action with the blob client\n            // auto blobClient = containerClient.GetBlobClient(\"sample-blob\");\n            // auto downloadResult = blobClient.DownloadTo(\"path/to/local/file\");\n            \n        } catch (const std::exception& ex) {\n            std::cout << \"Exception: \" << ex.what() << std::endl;\n            return 1;\n        }\n        \n        return 0;\n    }\n    ```\n"
  },
  {
    "path": "articles/cpp/sdk/authentication/local-development-service-principal.md",
    "content": "---\ntitle: Authenticate C++ apps to Azure services during local development using service principals\ndescription: This article describes how to authenticate your application to Azure services when using the Azure SDK for C++ during local development using dedicated application service principals.\n#customer intent: As a C++ developer, I want to use the Azure SDK for C++ with service principals so that I can authenticate my app during local development using dedicated application service principals.\nms.date: 12/03/2025\nms.topic: how-to\nms.custom:\n  - devx-track-cpp\n  - devx-track-azurecli\n  - sfi-image-nochange\nai-usage: ai-assisted\n---\n\n# Authenticate C++ apps to Azure services during local development using service principals\n\nDuring local development, applications need to authenticate to Azure to access various Azure services. Two common approaches for local authentication are to [use a developer account](local-development-dev-accounts.md) or a service principal. This article explains how to use an application service principal. In the sections ahead, you learn:\n\n- How to register an application with Microsoft Entra to create a service principal\n- How to use Microsoft Entra groups to efficiently manage permissions\n- How to assign roles to scope permissions\n- How to authenticate using a service principal from your app code\n\nUsing dedicated application service principals allows you to adhere to the principle of least privilege when accessing Azure resources. Permissions are limited to the specific requirements of the app during development, preventing accidental access to Azure resources intended for other apps or services. This approach also helps avoid issues when the app is moved to production by ensuring it isn't over-privileged in the development environment.\n\n:::image type=\"content\" source=\"../media/mermaidjs/local-service-principal-authentication.svg\" alt-text=\"A diagram showing how a local C++ app uses a service principal to connect to Azure resources.\":::\n\nWhen the app is registered in Azure, an application service principal is created. For local development:\n\n- Create a separate app registration for each developer working on the app to ensure each developer has their own application service principal, avoiding the need to share credentials.\n- Create a separate app registration for each app to limit the app's permissions to only what is necessary.\n\nDuring local development, environment variables are set with the application service principal's identity. The Azure Identity library reads these environment variables to authenticate the app to the required Azure resources.\n\n\n[!INCLUDE [create-app-registration](../../../includes/authentication/create-app-registration.md)]\n\n[!INCLUDE [create-entra-group](../../../includes/authentication/create-entra-group.md)]\n\n[!INCLUDE [assign-group-roles](../../../includes/authentication/assign-group-roles.md)]\n\n\n## Set the app environment variables\n\nAt runtime, certain credentials from the Azure Identity library, such as `DefaultAzureCredential`, `EnvironmentCredential`, and `ClientSecretCredential`, search for service principal information by convention in the environment variables. There are multiple ways to configure environment variables depending on your tooling and environment. You can create an `.env` file or use system environment variables to store these credentials locally during development.\n\nRegardless of the approach you choose, set the following environment variables for a service principal:\n\n- `AZURE_CLIENT_ID`: Used to identify the registered app in Azure.\n- `AZURE_TENANT_ID`: The ID of the Microsoft Entra tenant.\n- `AZURE_CLIENT_SECRET`: The secret credential that was generated for the app.\n\nFor C++ applications, you can set these environment variables in several ways. You can load them from a `.env` file in your code, or you can set them in your system environment. The following examples show how to set the environment variables in different shells:\n\n# [Bash](#tab/bash)\n\n```bash\nexport AZURE_CLIENT_ID=<your-client-id>\nexport AZURE_TENANT_ID=<your-tenant-id>\nexport AZURE_CLIENT_SECRET=<your-client-secret>\n```\n\n# [Windows command prompt](#tab/cmd)\n\nYou can set environment variables for Windows from the command line. However, the values are accessible to all apps running on that operating system and could cause conflicts, so use caution with this approach.\n\n```cmd\nset AZURE_CLIENT_ID=<your-client-id>\nset AZURE_TENANT_ID=<your-tenant-id>\nset AZURE_CLIENT_SECRET=<your-client-secret>\n```\n\n# [PowerShell](#tab/powershell)\n\n```powershell\n$env:AZURE_CLIENT_ID=\"<your-client-id>\"\n$env:AZURE_TENANT_ID=\"<your-tenant-id>\"\n$env:AZURE_CLIENT_SECRET=\"<your-client-secret>\"\n```\n\n---\n\n## Authenticate to Azure services from your app\n\nThe Azure Identity library provides various credentials—implementations of TokenCredential adapted to supporting different scenarios and Microsoft Entra authentication flows. Use the `ClientSecretCredential` class when working with service principals locally and in production. In this scenario, `ClientSecretCredential` reads the environment variables `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_CLIENT_SECRET` to get the application service principal information to connect to Azure.\n\n1. Add the [azure-identity-cpp](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity) package to your application using [vcpkg](/vcpkg/).\n\n    ```bash\n    vcpkg add port azure-identity-cpp\n    ```\n\n1. Add the following lines in your CMake file:\n\n    ```cmake\n    find_package(azure-identity-cpp CONFIG REQUIRED)\n    target_link_libraries(<your project name> PRIVATE Azure::azure-identity)\n    ```\n\n1. For any C++ code that creates an Azure SDK client object in your app:\n\n    1. Include the `azure/identity.hpp` header.\n    1. Create an instance of `ClientSecretCredential`.\n    1. Pass the instance of `ClientSecretCredential` to the Azure SDK client constructor.\n\n    An example is shown in the following code segment:\n\n    ```cpp\n    #include <azure/identity.hpp>\n    #include <azure/storage/blobs.hpp>\n    #include <iostream>\n    #include <memory>\n\n    // The following environment variables must be set before running the sample.\n    // * AZURE_TENANT_ID: Tenant ID for the Azure account.\n    // * AZURE_CLIENT_ID: The Client ID to authenticate the request.\n    // * AZURE_CLIENT_SECRET: The client secret.\n    std::string GetTenantId() { return std::getenv(\"AZURE_TENANT_ID\"); }\n    std::string GetClientId() { return std::getenv(\"AZURE_CLIENT_ID\"); }\n    std::string GetClientSecret() { return std::getenv(\"AZURE_CLIENT_SECRET\"); }\n\n    int main() {\n        try {\n            // Create a credential - this will automatically read the environment variables\n            // AZURE_CLIENT_ID, AZURE_TENANT_ID, and AZURE_CLIENT_SECRET\n            auto credential = std::make_shared<Azure::Identity::ClientSecretCredential>(GetTenantId(), GetClientId(), GetClientSecret());\n            \n            // Create a client for the specified storage account\n            std::string accountUrl = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\";\n            Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);\n            \n            // Get a reference to a container\n            std::string containerName = \"sample-container\";\n            auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);\n            \n            // Get a reference to a blob\n            std::string blobName = \"sample-blob\";\n            auto blobClient = containerClient.GetBlobClient(blobName);\n            \n            // TODO: perform some action with the blob client\n            // auto downloadResult = blobClient.DownloadTo(\"path/to/local/file\");\n            \n            std::cout << \"Successfully authenticated and created Azure clients.\" << std::endl;\n            \n        } catch (const std::exception& ex) {\n            std::cout << \"Exception: \" << ex.what() << std::endl;\n            return 1;\n        }\n        \n        return 0;\n    }\n    ```\n"
  },
  {
    "path": "articles/cpp/sdk/authentication/overview.md",
    "content": "---\ntitle: Authenticate C++ Apps to Azure Using the Azure SDK\ndescription: This article provides an overview of how to authenticate applications to Azure services when you use the Azure SDK for C++ in both server environments and in local development.\nms.topic: overview\nms.date: 11/06/2025\nms.custom: devx-track-cpp\nai-usage: ai-assisted\n\n#customer intent: As a developer, I want a comprehensive and easy-to-use SDK for Azure services so that I can efficiently integrate cloud capabilities into my C++ applications.\n---\n\n# Authenticate C++ apps to Azure services using the Azure Identity library\n\nApps can use the Azure Identity library to authenticate to Microsoft Entra ID, which allows the apps to access Azure services and resources. This authentication requirement applies whether the app is deployed to Azure, hosted on-premises, or running locally on a developer workstation. The sections ahead describe the recommended approaches to authenticate an app to Microsoft Entra ID across different environments when using the Azure SDK client libraries.\n\n## Recommended approach for app authentication\n\nToken-based authentication via Microsoft Entra ID is the recommended approach for authenticating apps to Azure, instead of using connection strings or key-based options. The [Azure Identity client library for C++](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity) provides token-based authentication and allows apps to authenticate to Azure resources whether the app runs locally, on Azure, or on an on-premises server.\n\n### Advantages of token-based authentication\n\nToken-based authentication offers the following advantages over connection strings:\n\n- Token-based authentication ensures only the specific apps intended to access the Azure resource are able to do so, whereas anyone or any app with a connection string can connect to an Azure resource.\n- Token-based authentication allows you to further limit Azure resource access to only the specific permissions needed by the app. This follows the [principle of least privilege](https://wikipedia.org/wiki/Principle_of_least_privilege). In contrast, a connection string grants full rights to the Azure resource.\n- When using a [managed identity](/entra/identity/managed-identities-azure-resources/overview) for token-based authentication, Azure handles administrative functions for you, so you don't have to worry about tasks like securing or rotating secrets. This makes the app more secure because there's no connection string or application secret that can be compromised.\n- Connection strings are functionally equivalent to credentials and require special handling to prevent accidental leakage. They must be stored securely (for example, in Azure Key Vault) and never hardcoded in your application or committed to source control. The [Microsoft Secure Future Initiative (SFI)](https://www.microsoft.com/microsoft-cloud/resources/secure-future-initiative) prohibits the use of connection strings and similar long-lived secrets because they can be used to compromise your application if not carefully managed.\n- The Azure Identity library acquires and manages Microsoft Entra tokens for you.\n\nUse of connection strings should be limited to scenarios where token-based authentication isn't an option, initial proof-of-concept apps, or development prototypes that don't access production or sensitive data. When possible, use the credential types in the Azure Identity library to authenticate to Azure resources.\n\n## Authentication across different environments\n\nThe specific type of token-based authentication an app should use to authenticate to Azure resources depends on where the app runs. The following diagram provides guidance for different scenarios and environments:\n\n:::image type=\"content\" source=\"../media/authentication-environments.svg\" alt-text=\"A diagram that shows the recommended token-based authentication strategies for an app depending on where it's running.\" :::\n\nWhen an app is:\n\n- **Hosted on Azure**: The app should authenticate to Azure resources using a managed identity. This option is discussed in more detail at [authentication for Azure-hosted apps](#authentication-for-azure-hosted-apps).\n- **Running locally during development**: The app can authenticate to Azure using either an application service principal for local development or by using the developer's Azure credentials. Each option is discussed in more detail at [authentication during local development](#authentication-during-local-development).\n- **Hosted on-premises**: The app should authenticate to Azure resources using an application service principal, or a managed identity in the case of Azure Arc. On-premises workflows are discussed in more detail at [authentication for apps hosted on-premises](#authentication-for-apps-hosted-on-premises).\n\n## Authentication for Azure-hosted apps\n\nWhen your app is hosted on Azure, it can use managed identities to authenticate to Azure resources without needing to manage any credentials. There are two types of managed identities: user-assigned and system-assigned.\n\n#### Use a user-assigned managed identity\n\nA user-assigned managed identity is created as a standalone Azure resource. It can be assigned to one or more Azure resources, allowing those resources to share the same identity and permissions. To authenticate using a user-assigned managed identity, create the identity, assign it to your Azure resource, and then configure your app to use this identity for authentication by specifying its client ID, resource ID, or object ID.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate using a user-assigned managed identity](user-assigned-managed-identity.md)\n\n#### Use a system-assigned managed identity\n\nA system-assigned managed identity is enabled directly on an Azure resource. The identity is tied to the lifecycle of that resource and is automatically deleted when the resource is deleted. To authenticate using a system-assigned managed identity, enable the identity on your Azure resource and then configure your app to use this identity for authentication.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate using a system-assigned managed identity](system-assigned-managed-identity.md)\n\n## Authentication during local development\n\nDuring local development, you can authenticate to Azure resources using your developer credentials or a service principal. This allows you to test your app's authentication logic without deploying it to Azure.\n\n#### Use developer credentials\n\nYou can use your own Azure credentials to authenticate to Azure resources during local development. This is typically done using a development tool, such as Azure CLI, which can provide your app with the necessary tokens to access Azure services. This method is convenient but should only be used for development purposes.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally using developer credentials](local-development-dev-accounts.md)\n\n#### Use a service principal\n\nA service principal is created in a Microsoft Entra tenant to represent an app and be used to authenticate to Azure resources. You can configure your app to use service principal credentials during local development. This method is more secure than using developer credentials and is closer to how your app authenticates in production. However, it's still less ideal than using a managed identity due to the need for secrets.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally using a service principal](local-development-service-principal.md)\n\n## Authentication for apps hosted on-premises\n\nFor apps hosted on-premises, you can use a service principal to authenticate to Azure resources. This involves creating a service principal in Microsoft Entra ID, assigning it the necessary permissions, and configuring your app to use its credentials. This method allows your on-premises app to securely access Azure services.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate your on-prem app using a service principal](local-development-service-principal.md)\n\n## Related content\n\n- [Azure Identity client library for C++ README on GitHub](https://github.com/Azure/azure-sdk-for-cpp/blob/main/sdk/identity/azure-identity/README.md)\n"
  },
  {
    "path": "articles/cpp/sdk/authentication/system-assigned-managed-identity.md",
    "content": "---\ntitle: Authenticate Azure-hosted C++ apps to Azure resources using a system-assigned managed identity\ndescription: Learn how to authenticate Azure-hosted C++ apps to other Azure services using a system-assigned managed identity.\nms.date: 11/06/2025\nms.topic: how-to\nms.custom: devx-track-cpp devx-track-azurecli\nai-usage: ai-assisted\n---\n\n# Authenticate Azure-hosted C++ apps to Azure resources using a system-assigned managed identity\n\nThe recommended approach to authenticate an Azure-hosted app to other Azure resources is to use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). This approach is [supported for most Azure services](/entra/identity/managed-identities-azure-resources/managed-identities-status), including apps hosted on Azure App Service, Azure Container Apps, and Azure Virtual Machines. Discover more about different authentication techniques and approaches on the [authentication overview](overview.md) page. In the sections ahead, you'll learn:\n\n- Essential managed identity concepts\n- How to create a system-assigned managed identity for your app\n- How to assign roles to the system-assigned managed identity\n- How to authenticate using the system-assigned managed identity from your app code\n\n[!INCLUDE [Managed identity concepts](<../../../includes/authentication/managed-identity-concepts.md>)]\n\nThe following sections describe the steps to enable and use a system-assigned managed identity for an Azure-hosted app. If you need to use a user-assigned managed identity, visit the [user-assigned managed identities](user-assigned-managed-identity.md) article for more information.\n\n[!INCLUDE [Language agnostic system assigned procedures](<../../../includes/authentication/system-assigned-managed-identity.md>)]\n\n[!INCLUDE [Implement-managed-identity-concepts](../includes/implement-managed-identity-concepts.md)]\n\n## Implement the code\n\n1. Add the [azure-identity-cpp](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity) package to your application using [vcpkg](/vcpkg/).\n\n    In a terminal of your choice, navigate to the application project directory and run the following command:\n\n    ```bash\n    vcpkg add port azure-identity-cpp\n    ```\n\n1. Add the following in your CMake file:\n\n    ```cmake\n    find_package(azure-identity-cpp CONFIG REQUIRED)\n    target_link_libraries(<your project name> PRIVATE Azure::azure-identity)\n    ```\n\n1. Azure services are accessed using specialized clients from the various Azure SDK client libraries. For any C++ code that instantiates an Azure SDK client in your app, you need to:\n\n    1. Include the `azure/identity.hpp` header.\n    1. Create an instance of `DefaultAzureCredential`.\n    1. Pass the instance of `DefaultAzureCredential` to the Azure SDK client constructor.\n    1. Set the `AZURE_TOKEN_CREDENTIALS` environment variable to `ManagedIdentityCredential` to ensure that `DefaultAzureCredential` uses the managed identity credential. This practice makes authentication more predictable and easier to debug when deployed to Azure. For more information, see [Use a specific credential](credential-chains.md#use-a-specific-credential).\n\n    An example of these steps is shown in the following code segment with an Azure Storage Blob client.\n\n    ```cpp\n    #include <azure/identity.hpp>\n    #include <azure/storage/blobs.hpp>\n    #include <iostream>\n    #include <memory>\n\n    int main() {\n        try {\n            // Create a credential\n            auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);\n            \n            // Create a client for the specified storage account\n            std::string accountUrl = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\";\n            Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);\n            \n            // Get a reference to a container\n            std::string containerName = \"sample-container\";\n            auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);\n            \n            // Get a reference to a blob\n            std::string blobName = \"sample-blob\";\n            auto blobClient = containerClient.GetBlobClient(blobName);\n            \n            // TODO: perform some action with the blob client\n            // auto downloadResult = blobClient.DownloadTo(\"path/to/local/file\");\n            \n            std::cout << \"Successfully authenticated and created Azure clients.\" << std::endl;\n            \n        } catch (const std::exception& ex) {\n            std::cout << \"Exception: \" << ex.what() << std::endl;\n            return 1;\n        }\n        \n        return 0;\n    }\n    ```\n\nAs discussed in the [Azure SDK for C++ authentication overview](./overview.md) article, `DefaultAzureCredential` supports multiple authentication methods and determines the authentication method being used at runtime. The benefit of this approach is that your app can use different authentication methods in different environments without implementing environment-specific code. When the preceding code is run on your workstation during local development, `DefaultAzureCredential` uses either an application service principal, as determined by environment settings, or developer tool credentials to authenticate with other Azure resources. Thus, the same code can be used to authenticate your app to Azure resources during both local development and when deployed to Azure.\n\n> [!IMPORTANT]\n> `DefaultAzureCredential` simplifies authentication while developing applications that deploy to Azure by combining credentials used in Azure hosting environments and credentials used in local development. In production, it's better to use a specific credential type so authentication is more predictable and easier to debug.\n\nAn alternative to `DefaultAzureCredential` is to use [ManagedIdentityCredential](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity). The steps for using `ManagedIdentityCredential` are the same as for using the `DefaultAzureCredential` type.\n\nAn example of these steps is shown in the following code segment with an Azure Storage Blob client.\n\n```cpp\n#include <azure/identity.hpp>\n#include <azure/storage/blobs.hpp>\n#include <iostream>\n#include <memory>\n\nint main() {\n    try {\n        // Create a system-assigned managed identity credential\n        auto credential = std::make_shared<Azure::Identity::ManagedIdentityCredential>();\n        \n        // Create a client for the specified storage account\n        std::string accountUrl = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\";\n        Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);\n        \n        // Get a reference to a container\n        std::string containerName = \"sample-container\";\n        auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);\n        \n        // Get a reference to a blob\n        std::string blobName = \"sample-blob\";\n        auto blobClient = containerClient.GetBlobClient(blobName);\n        \n        // TODO: perform some action with the blob client\n        // auto downloadResult = blobClient.DownloadTo(\"path/to/local/file\");\n        \n        std::cout << \"Successfully authenticated using system-assigned managed identity.\" << std::endl;\n        \n    } catch (const std::exception& ex) {\n        std::cout << \"Exception: \" << ex.what() << std::endl;\n        return 1;\n    }\n    \n    return 0;\n}\n```\n"
  },
  {
    "path": "articles/cpp/sdk/authentication/user-assigned-managed-identity.md",
    "content": "---\ntitle: Authenticate Azure-hosted C++ apps to Azure resources using a user-assigned managed identity\ndescription: Learn how to authenticate Azure-hosted C++ apps to other Azure services using a user-assigned managed identity.\nms.topic: how-to\nms.custom: devx-track-cpp, engagement-fy23, devx-track-azurecli\nms.date: 11/06/2025\nai-usage: ai-assisted\n---\n\n# Authenticate Azure-hosted C++ apps to Azure resources using a user-assigned managed identity\n\nThe recommended approach to authenticate an Azure-hosted app to other Azure resources is to use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). This approach is [supported for most Azure services](/entra/identity/managed-identities-azure-resources/managed-identities-status), including apps hosted on Azure App Service, Azure Container Apps, and Azure Virtual Machines. Discover more about different authentication techniques and approaches on the [authentication overview](overview.md) page. In the sections ahead, you'll learn:\n\n- Essential managed identity concepts\n- How to create a user-assigned managed identity for your app\n- How to assign roles to the user-assigned managed identity\n- How to authenticate using the user-assigned managed identity from your app code\n\n[!INCLUDE [Managed identity concepts](../../../includes/authentication/managed-identity-concepts.md)]\n\nThe following sections describe the steps to enable and use a user-assigned managed identity for an Azure-hosted app. If you need to use a system-assigned managed identity, visit the [system-assigned managed identities](system-assigned-managed-identity.md) article for more information.\n\n[!INCLUDE [Language agnostic user assigned procedures](<../../../includes/authentication/user-assigned-managed-identity.md>)]\n\n[!INCLUDE [Implement-managed-identity-concepts](../includes/implement-managed-identity-concepts.md)]\n\n## Implement the code\n\n1. Add the [azure-identity-cpp](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity) package to your application using [vcpkg](/vcpkg/).\n\n    In a terminal of your choice, navigate to the application project directory and run the following command:\n\n    ```bash\n    vcpkg add port azure-identity-cpp\n    ```\n\n1. Add the following in your CMake file:\n\n    ```cmake\n    find_package(azure-identity-cpp CONFIG REQUIRED)\n    target_link_libraries(<your project name> PRIVATE Azure::azure-identity)\n    ```\n\n1. Azure services are accessed using specialized clients from the various Azure SDK client libraries. For any C++ code that instantiates an Azure SDK client in your app, you need to:\n\n    1. Include the `azure/identity.hpp` header.\n    1. Create an instance of `DefaultAzureCredential`.\n    1. Pass the instance of `DefaultAzureCredential` to the Azure SDK client constructor.\n    1. Set the environment variable `AZURE_CLIENT_ID` to the client ID of your user-assigned managed identity.\n    1. Set the `AZURE_TOKEN_CREDENTIALS` environment variable to `ManagedIdentityCredential` to ensure that `DefaultAzureCredential` uses the managed identity credential. This practice makes authentication more predictable and easier to debug when deployed to Azure. For more information, see [Use a specific credential](credential-chains.md#use-a-specific-credential). \n\n    An example of these steps is shown in the following code segment with an Azure Storage Blob client.\n\n    ```cpp\n    #include <azure/identity.hpp>\n    #include <azure/storage/blobs.hpp>\n    #include <iostream>\n    #include <memory>\n    #include <cstdlib>\n\n    int main() {\n        try {\n            // Set the AZURE_CLIENT_ID environment variable to your user-assigned managed identity client ID\n            // This can be done in your deployment environment or in code (shown below for demonstration)\n            // std::putenv(\"AZURE_CLIENT_ID=your-user-assigned-identity-client-id\");\n            \n            // Create a credential - DefaultAzureCredential will use the AZURE_CLIENT_ID environment variable\n            // Create a credential - DefaultAzureCredential will use the AZURE_CLIENT_ID and AZURE_TOKEN_CREDENTIALS environment variables\n            auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);\n            \n            // Create a client for the specified storage account\n            std::string accountUrl = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\";\n            Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);\n            \n            // Get a reference to a container\n            std::string containerName = \"sample-container\";\n            auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);\n            \n            // Get a reference to a blob\n            std::string blobName = \"sample-blob\";\n            auto blobClient = containerClient.GetBlobClient(blobName);\n            \n            // TODO: perform some action with the blob client\n            // auto downloadResult = blobClient.DownloadTo(\"path/to/local/file\");\n            \n            std::cout << \"Successfully authenticated using user-assigned managed identity.\" << std::endl;\n            \n        } catch (const std::exception& ex) {\n            std::cout << \"Exception: \" << ex.what() << std::endl;\n            return 1;\n        }\n        \n        return 0;\n    }\n    ```\n\nAs discussed in the [Azure SDK for C++ authentication overview](./overview.md) article, `DefaultAzureCredential` supports multiple authentication methods and determines the authentication method being used at runtime. The benefit of this approach is that your app can use different authentication methods in different environments without implementing environment-specific code. When the preceding code is run on your workstation during local development, `DefaultAzureCredential` uses either an application service principal, as determined by environment settings, or developer tool credentials to authenticate with other Azure resources. Thus, the same code can be used to authenticate your app to Azure resources during both local development and when deployed to Azure.\n\n> [!IMPORTANT]\n> `DefaultAzureCredential` simplifies authentication while developing applications that deploy to Azure by combining credentials used in Azure hosting environments and credentials used in local development. In production, it's better to use a specific credential type so authentication is more predictable and easier to debug.\n\nAn alternative to `DefaultAzureCredential` is to use [`ManagedIdentityCredential`](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity). The steps for using `ManagedIdentityCredential` are the same as for using the `DefaultAzureCredential` type.\n\nAn example of these steps is shown in the following code segment with an Azure Storage Blob client.\n\n```cpp\n#include <azure/identity.hpp>\n#include <azure/storage/blobs.hpp>\n#include <iostream>\n#include <memory>\n\nint main() {\n    try {\n        // Create a user-assigned managed identity credential with the client ID\n        Azure::Identity::ManagedIdentityCredentialOptions options;\n        options.ClientId = \"abcd1234-...\"; // Replace with your user-assigned managed identity client ID\n        auto credential = std::make_shared<Azure::Identity::ManagedIdentityCredential>(options);\n        \n        // Create a client for the specified storage account\n        std::string accountUrl = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\";\n        Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);\n        \n        // Get a reference to a container\n        std::string containerName = \"sample-container\";\n        auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);\n        \n        // Get a reference to a blob\n        std::string blobName = \"sample-blob\";\n        auto blobClient = containerClient.GetBlobClient(blobName);\n        \n        // TODO: perform some action with the blob client\n        // auto downloadResult = blobClient.DownloadTo(\"path/to/local/file\");\n        \n        std::cout << \"Successfully authenticated using user-assigned managed identity.\" << std::endl;\n        \n    } catch (const std::exception& ex) {\n        std::cout << \"Exception: \" << ex.what() << std::endl;\n        return 1;\n    }\n    \n    return 0;\n}\n```\n"
  },
  {
    "path": "articles/cpp/sdk/fundamentals/common-types.md",
    "content": "---\ntitle: Common Types in the Azure SDK for C++\ndescription: Understand how to effectively use the common types provided by the Azure Core library when developing applications with the Azure SDK for C++.\nms.topic: overview\nms.date: 5/08/2025\nms.custom: devx-track-cpp\n\n#customer intent: As a developer, I want a comprehensive and easy-to-use SDK for Azure services so that I can efficiently integrate cloud capabilities into my C++ applications.\n\n---\n\n# Common Types in the Azure SDK for C++\n\nThe Azure SDK for C++ relies on several common types from the Azure Core library to provide consistent functionality across its service libraries. Understanding these types help you use Azure services more effectively.\n\n## Core types\n\n### Response\\<T>\n\n`Azure::Response<T>` wraps the result of an Azure service operation, providing both the typed response value and access to the raw HTTP response.\n\n```cpp\ntemplate <class T> class Response final {\npublic:\n  // The value returned by the service\n  T Value;\n  \n  // The HTTP response returned by the service\n  std::unique_ptr<Azure::Core::Http::RawResponse> RawResponse;\n  \n  // Constructor\n  explicit Response(T value, std::unique_ptr<Azure::Core::Http::RawResponse> rawResponse)\n      : Value(std::move(value)), RawResponse(std::move(rawResponse))\n  {\n  }\n};\n```\n\nUsage example:\n\n```cpp\n// When calling a service operation that returns a response\nauto response = blobClient.GetProperties();\n\n// Accessing the returned value\nauto blobProperties = response.Value;\n\n// Accessing the raw HTTP response\nauto& rawResponse = *response.RawResponse;\nauto statusCode = rawResponse.GetStatusCode();\n```\n\n### Nullable\\<T>\n\n`Azure::Nullable<T>` represents a value that may or may not be present. It's similar to `std::optional` (C++17), but is available even when compiling with C++14.\n\n```cpp\ntemplate <class T> class Nullable final {\npublic:\n  // Constructs an empty Nullable\n  constexpr Nullable() : m_hasValue(false) {}\n  \n  // Constructs a Nullable with a value\n  constexpr Nullable(T initialValue) : m_value(std::move(initialValue)), m_hasValue(true) {}\n  \n  // Check if the Nullable contains a value\n  bool HasValue() const noexcept { return m_hasValue; }\n  \n  // Retrieve the value (throws if empty)\n  T& Value() & noexcept;\n  const T& Value() const& noexcept;\n  \n  // Get the value or a default\n  typename std::remove_cv<T>::type ValueOr(U&& defaultValue) const&;\n  \n  // Reset to empty state\n  void Reset() noexcept;\n  \n  // Boolean conversion operator\n  explicit operator bool() const noexcept { return HasValue(); }\n  \n  // Dereference operators\n  T* operator->() { return std::addressof(m_value); }\n  const T* operator->() const { return std::addressof(m_value); }\n  T& operator*() & { return m_value; }\n  const T& operator*() const& { return m_value; }\n};\n```\n\nUsage example:\n\n```cpp\n// A property that might not have a value\nAzure::Nullable<std::string> versionId = blobProperties.VersionId;\n\n// Check if it has a value\nif (versionId.HasValue()) {\n    // Use versionId.Value() or *versionId\n    std::string version = versionId.Value();\n    // OR\n    std::string version = *versionId;\n}\n\n// Using ValueOr to provide a default\nstd::string version = versionId.ValueOr(\"default-version\");\n\n// Boolean context\nif (versionId) {\n    // versionId has a value\n}\n```\n\n### Operation\\<T>\n\n`Azure::Core::Operation<T>` represents a long-running operation (LRO) that may not complete immediately. It allows checking the status of the operation and waiting for completion.\n\n```cpp\ntemplate <class T> class Operation {\npublic:\n  // Get the current status of the operation\n  OperationStatus const& Status() const noexcept;\n  \n  // Poll for status updates\n  Http::RawResponse const& Poll();\n  Http::RawResponse const& Poll(Context const& context);\n  \n  // Wait for the operation to complete\n  Response<T> PollUntilDone(std::chrono::milliseconds period);\n  Response<T> PollUntilDone(std::chrono::milliseconds period, Context& context);\n  \n  // Get the result value (only valid when the operation is complete)\n  virtual T Value() const = 0;\n  \n  // Get the raw HTTP response from the last poll\n  Http::RawResponse const& GetRawResponse() const;\n  \n  // Get a token to resume the operation later\n  virtual std::string GetResumeToken() const = 0;\n};\n```\n\nUsage example:\n\n```cpp\n// Start a long-running operation\nauto operation = sourceBlob.StartCopyFromUri(destinationUri);\n\n// Check the status\nif (operation.Status() == Azure::Core::OperationStatus::Succeeded) {\n    // Operation already completed\n}\n\n// Poll for status updates\noperation.Poll();\n\n// Wait for the operation to complete\nauto response = operation.PollUntilDone(std::chrono::seconds(1));\n\n// Access the result\nauto blobProperties = response.Value;\n```\n\n### PagedResponse\\<T>\n\n`Azure::Core::PagedResponse<T>` provides an interface for handling paginated results from Azure services.\n\n```cpp\ntemplate <class T> class PagedResponse {\npublic:\n  // The current page token\n  std::string CurrentPageToken;\n  \n  // The token for the next page (empty if no more pages)\n  Azure::Nullable<std::string> NextPageToken;\n  \n  // Move to the next page\n  void MoveToNextPage(const Context& context = {});\n  \n  // Check if there are more pages\n  bool HasPage() const;\n};\n```\n\nUsage example:\n\n```cpp\n// Get a paged list of containers\nauto response = blobServiceClient.ListBlobContainers();\n\n// Process each page\ndo {\n    // Process the current page's results\n    for (const auto& container : response.BlobContainers) {\n        std::cout << \"Container name: \" << container.Name << std::endl;\n    }\n    \n    // Continue to next page if available\n    if (response.HasPage()) {\n        response.MoveToNextPage();\n    } else {\n        break;\n    }\n} while (true);\n```\n\n### Context\n\n`Azure::Core::Context` allows controlling the lifetime of operations and supports cancellation.\n\n```cpp\nclass Context {\npublic:\n  // Default constructor creates a context with no cancellation\n  Context() noexcept;\n  \n  // Create a context with a timeout\n  static Context WithDeadline(Azure::DateTime deadline);\n  static Context WithTimeout(std::chrono::milliseconds timeout);\n  \n  // Create a context with a cancellation signal\n  static Context WithCancellation();\n  \n  // Check if the context has been cancelled\n  bool IsCancelled() const noexcept;\n  \n  // Throw an exception if the context has been cancelled\n  void ThrowIfCancelled() const;\n  \n  // Cancel the context\n  static void Cancel(Context& context);\n};\n```\n\nUsage example:\n\n```cpp\n// Create a context with a 30-second timeout\nauto context = Azure::Core::Context::WithTimeout(std::chrono::seconds(30));\n\n// Use the context with an operation\nauto response = blobClient.DownloadTo(outputStream, {}, context);\n\n// Create a cancelable context\nauto cancelableContext = Azure::Core::Context::WithCancellation();\n\n// Cancel the context from another thread\nstd::thread([&cancelableContext]() {\n    std::this_thread::sleep_for(std::chrono::seconds(5));\n    Azure::Core::Context::Cancel(cancelableContext);\n}).detach();\n```\n\n### ETag\n\n`Azure::ETag` represents an HTTP entity tag used for conditional operations.\n\n```cpp\nclass ETag final {\npublic:\n  // Create an ETag from a string\n  explicit ETag(std::string etag);\n  \n  // Get the string representation\n  const std::string& ToString() const;\n  \n  // Comparison operators\n  bool operator==(const ETag& other) const;\n  bool operator!=(const ETag& other) const;\n};\n```\n\nUsage example:\n\n```cpp\n// Get the ETag from blob properties\nAzure::ETag etag = blobProperties.ETag;\n\n// Use the ETag for conditional operations\nAzure::Storage::Blobs::DeleteBlobOptions options;\noptions.IfMatch = etag;\nblobClient.Delete(options);\n```\n\n### DateTime\n\n`Azure::DateTime` represents a date and time value with timezone information.\n\n```cpp\nclass DateTime final {\npublic:\n  // Create a DateTime representing the current time in UTC\n  static DateTime Now();\n  \n  // Parse from string formats\n  static DateTime Parse(const std::string& dateTime);\n  \n  // Format to string\n  std::string ToString() const;\n};\n```\n\nUsage example:\n\n```cpp\n// Get the last modified time of a blob\nAzure::DateTime lastModified = blobProperties.LastModified;\n\n// Format as a string\nstd::string formattedTime = lastModified.ToString();\n\n// Use in conditional operations\nAzure::Storage::Blobs::GetBlobPropertiesOptions options;\noptions.IfModifiedSince = lastModified;\n```\n\n### Http::RawResponse\n\n`Azure::Core::Http::RawResponse` represents an HTTP response from a service.\n\n```cpp\nclass RawResponse final {\npublic:\n  // Get HTTP status code\n  HttpStatusCode GetStatusCode() const;\n  \n  // Get the reason phrase\n  const std::string& GetReasonPhrase() const;\n  \n  // Get headers\n  const CaseInsensitiveMap& GetHeaders() const;\n  \n  // Get HTTP version\n  int32_t GetMajorVersion() const;\n  int32_t GetMinorVersion() const;\n  \n  // Access the body\n  std::vector<uint8_t> const& GetBody() const;\n  std::unique_ptr<Azure::Core::IO::BodyStream> ExtractBodyStream();\n};\n```\n\nUsage example:\n\n```cpp\n// Access the raw HTTP response\nauto& rawResponse = *response.RawResponse;\n\n// Get status code\nauto statusCode = rawResponse.GetStatusCode();\nif (statusCode == Azure::Core::Http::HttpStatusCode::Ok) {\n    // Handle success case\n}\n\n// Get headers\nauto contentType = rawResponse.GetHeaders().at(\"content-type\");\n\n// Get body as bytes\nconst auto& bodyBytes = rawResponse.GetBody();\n```\n\n## Error handling\n\n### RequestFailedException\n\n`Azure::Core::RequestFailedException` is the base exception type for service errors.\n\n```cpp\nclass RequestFailedException : public std::runtime_error {\npublic:\n  // Constructor\n  RequestFailedException(\n      std::string message,\n      std::unique_ptr<Azure::Core::Http::RawResponse> rawResponse);\n  \n  // Get the status code from the response\n  Azure::Core::Http::HttpStatusCode StatusCode;\n  \n  // Get the error code returned by the service\n  std::string ErrorCode;\n  \n  // Get the request ID for troubleshooting\n  std::string RequestId;\n  \n  // Access the raw response that caused this exception\n  const Azure::Core::Http::RawResponse& RawResponse() const;\n};\n```\n\nUsage example:\n\n```cpp\ntry {\n    auto response = blobClient.Delete();\n}\ncatch (const Azure::Core::RequestFailedException& e) {\n    std::cerr << \"Status code: \" << static_cast<int>(e.StatusCode) << std::endl;\n    std::cerr << \"Error code: \" << e.ErrorCode << std::endl;\n    std::cerr << \"Message: \" << e.what() << std::endl;\n    std::cerr << \"Request ID: \" << e.RequestId << std::endl;\n}\n```\n"
  },
  {
    "path": "articles/cpp/sdk/fundamentals/errors.md",
    "content": "---\ntitle: Error Handling in the Azure SDK for C++\ndescription: Understand how to handle errors effectively when using the Azure SDK for C++. \nms.topic: overview\nms.date: 5/08/2025\nms.custom: devx-track-cpp\n\n#customer intent: As a developer, I want a comprehensive and easy-to-use SDK for Azure services so that I can efficiently integrate cloud capabilities into my C++ applications.\n\n---\n\n# Error handling in the Azure SDK for C++\n\nError handling in the Azure SDK for C++ is primarily implemented through C++ exceptions. This approach aligns with standard C++ practices and allows for clear error reporting and handling across the SDK. When your C++ application interacts with Azure services, operations can fail for various reasons such as authentication issues, service unavailability, invalid requests, or resource constraints. The SDK captures these errors as exceptions that provide detailed information about the failure.\n\n## Exception hierarchy\n\n### Core exception types\n\nThe Azure SDK for C++ uses a hierarchy of exception classes, with the most important ones being:\n\n1. **`std::runtime_error`** - The base C++ standard exception from which Azure-specific exceptions inherit.\n\n2. **`Azure::Core::RequestFailedException`** - Derived from `std::runtime_error`, this is the base exception for all Azure service request failures. Defined in `azure/core/exception.hpp`, this exception is thrown when a request to an Azure service fails. It provides:\n   - HTTP status code\n   - Error codes from the service\n   - Error messages\n   - Request IDs for troubleshooting\n   - The raw HTTP response\n\n3. **`Azure::Core::OperationCancelledException`** - Derived from `std::runtime_error`, this exception is thrown when an operation is canceled, typically through a context object.\n\n4. **`Azure::Core::Http::TransportException`** - Derived from `Azure::Core::RequestFailedException`, this exception is thrown when there's an error in the HTTP transport layer, such as connection failures.\n\n5. **`Azure::Core::Credentials::AuthenticationException`** - Derived from `std::exception`, this exception is thrown when authentication with Azure services fails.\n\n### Service-specific exception types\n\nDifferent Azure services extend the base exception types to provide service-specific error information:\n\n1. **`Azure::Storage::StorageException`** - Extends `RequestFailedException` with other storage-specific information. This exception includes:\n   - Storage-specific error codes\n   - Additional information in response body\n   - Details about the failed storage operation\n\n2. **`Azure::Messaging::EventHubs::EventHubsException`** - An exception specific to Event Hubs operations. It includes:\n   - Error condition (symbolic value from AMQP (Advanced Message Queuing Protocol))\n   - Error description\n   - Status code\n   - Information about whether the error is transient\n\n## Error information in exceptions\n\nThe `RequestFailedException` class contains rich information about service failures:\n\n```cpp\nclass RequestFailedException : public std::runtime_error {\npublic:\n    // The entire HTTP raw response\n    std::unique_ptr<Azure::Core::Http::RawResponse> RawResponse;\n    \n    // The HTTP response code\n    Azure::Core::Http::HttpStatusCode StatusCode;\n    \n    // The HTTP reason phrase from the response\n    std::string ReasonPhrase;\n    \n    // The client request header (x-ms-client-request-id) from the HTTP response\n    std::string ClientRequestId;\n    \n    // The request ID header (x-ms-request-id) from the HTTP response\n    std::string RequestId;\n    \n    // The error code from service returned in the HTTP response\n    std::string ErrorCode;\n    \n    // The error message from the service returned in the HTTP response\n    std::string Message;\n    \n    /* ... constructors and other methods ... */\n};\n```\n\nService-specific exceptions can add extra fields. For example, `StorageException` adds `AdditionalInformation`:\n\n```cpp\nstruct StorageException final : public Azure::Core::RequestFailedException {\n    // Some storage-specific information in response body\n    std::map<std::string, std::string> AdditionalInformation;\n    \n    /* ... constructors and other methods ... */\n};\n```\n\n## Exception handling patterns and examples\n\n### Using error codes\n\nService exceptions contain `ErrorCode` values that can be used to make decisions about how to handle failures. Here's an example with Storage services:\n\n```cpp\ntry {\n    containerClient.Delete();\n}\ncatch (Azure::Storage::StorageException& e) {\n    if (e.ErrorCode == \"ContainerNotFound\") {\n        // Ignore the error if the container does not exist\n    }\n    else {\n        // Handle other errors here\n    }\n}\n```\n\n### Handling basic exceptions\n\nBasic pattern for handling exceptions in the Azure SDK:\n\n```cpp\ntry {\n    // Perform an Azure SDK operation\n    result = client.SomeOperation();\n}\ncatch (Azure::Core::RequestFailedException const& e) {\n    std::cout << \"Request Failed Exception happened:\" << std::endl << e.what() << std::endl;\n    if (e.RawResponse) {\n        std::cout << \"Error Code: \" << e.ErrorCode << std::endl;\n        std::cout << \"Error Message: \" << e.Message << std::endl;\n    }\n    // Handle or rethrow as appropriate\n}\ncatch (std::exception const& e) {\n    std::cout << \"Other exception: \" << e.what() << std::endl;\n    // Handle general exceptions\n}\n```\n\n### Handling transient errors\n\nSome services, like Event Hubs, provide information about whether an error is transient, allowing for retry logic:\n\n```cpp\ntry {\n    // EventHubs operation\n}\ncatch (Azure::Messaging::EventHubs::EventHubsException& e) {\n    if (e.IsTransient) {\n        // Retry the operation after a delay\n    }\n    else {\n        // Handle permanent failure\n    }\n}\n```\n\nThe SDK implements internal retry policies for transient failures, but you want to handle specific cases in your application code.\n\n### Service-specific error handling\n\nFor storage services (Blobs, Files, Queues, etc.), you can handle errors based on both error codes and HTTP status codes:\n\n```cpp\ntry {\n    shareClient.Delete();\n}\ncatch (Azure::Storage::StorageException& e) {\n    if (e.ErrorCode == \"ShareNotFound\") {\n        // Ignore the error if the file share does not exist\n    }\n    else if (e.StatusCode == Azure::Core::Http::HttpStatusCode::Conflict) {\n        // Handle conflict error (e.g., resource in use)\n        std::cout << \"Conflict error: \" << e.Message << std::endl;\n        \n        // Check additional information\n        for (auto const& info : e.AdditionalInformation) {\n            std::cout << info.first << \": \" << info.second << std::endl;\n        }\n    }\n    else {\n        // Handle other errors based on status code or error code\n        std::cout << \"Error: \" << e.Message << \" (Code: \" << e.ErrorCode << \")\" << std::endl;\n    }\n}\n```\n\nFor Key Vault operations, you might need to handle authentication exceptions separately:\n\n```cpp\ntry {\n    // Key Vault operation\n}\ncatch (Azure::Core::Credentials::AuthenticationException const& e) {\n    std::cout << \"Authentication Exception happened:\" << std::endl << e.what() << std::endl;\n    // Handle authentication failure (e.g., invalid credentials)\n}\ncatch (Azure::Core::RequestFailedException const& e) {\n    std::cout << \"Key Vault Client Exception happened:\" << std::endl << e.Message << std::endl;\n    // Handle Key Vault specific errors\n}\n```\n\n## Thread safety considerations\n\nThe Azure SDK for C++ guarantees that client instance methods are thread-safe and independent of each other. This means you can safely use a client instance across multiple threads without synchronization.\n\nWhen handling exceptions across threads, keep in mind:\n\n1. Exception objects shouldn't be shared between threads unless properly synchronized\n2. The `RequestFailedException` includes a copy constructor that creates a deep copy, which can be used when needing to pass exception information between threads\n"
  },
  {
    "path": "articles/cpp/sdk/fundamentals/http-pipelines-and-retries.md",
    "content": "---\ntitle: HTTP Pipelines and Retries in the Azure SDK for C++\ndescription: Understand how HTTP pipelines and retry mechanisms are implemented in the Azure SDK for C++. Learn to customize and troubleshoot request processing and failure recovery in their Azure applications. \nms.topic: overview\nms.date: 5/08/2025\nms.custom: devx-track-cpp\n\n#customer intent: As a developer, I want a comprehensive and easy-to-use SDK for Azure services so that I can efficiently integrate cloud capabilities into my C++ applications.\n\n---\n\n# HTTP Pipelines and retries in the Azure SDK for C++\n\nThe Azure SDK for C++ uses an HTTP pipeline architecture to process HTTP requests to Azure services. This document explains how HTTP pipelines work, how retry policies are implemented, and how you can customize them for your application needs.\n\n## HTTP pipeline architecture\n\n### What is an HTTP pipeline?\n\nAn HTTP pipeline is a stack of HTTP policies that get applied sequentially to process HTTP requests and responses. Each client in the Azure SDK has its own HTTP pipeline. The policies in the pipeline shape how HTTP requests are handled, including operations like:\n\n- Adding authentication headers\n- Request/response logging\n- Retry logic for failed requests\n- Telemetry collection\n- Transport handling (actually sending the HTTP request)\n\nThe pipeline is split into two main parts:\n\n1. **Per-call policies** - Execute once per API operation\n2. **Per-retry policies** - Execute for each retry attempt\n\nThis structure ensures that appropriate policies (like authentication) only execute once per operation, while others (like logging) execute for each retry attempt.\n\n### Policy ordering\n\nA typical HTTP pipeline in the Azure SDK for C++ includes the following policies in order:\n\n1. **Telemetry Policy** (per-call) - Adds Azure SDK telemetry information\n2. **Request ID Policy** (per-call) - Ensures each request has a unique ID\n3. **Service-specific Per-Call Policies** - Custom policies specific to a service\n4. **Retry Policy** (per-call) - Implements retry logic\n5. **Service-specific Per-Retry Policies** - Custom policies specific to a service that run on each retry\n6. **Request Activity Policy** (per-retry) - Manages distributed tracing\n7. **Log Policy** (per-retry) - Handles logging requests and responses\n8. **Transport Policy** (per-retry) - Handles the actual sending of the HTTP request\n\n:::image type=\"content\" source=\"../media/http-pipeline.svg\" alt-text=\"A diagram that shows the policy phases of the Azure SDK for C++ HTTP Pipeline.\" :::\n\n## Retry policy\n\n### How retries work\n\nThe retry policy is designed to handle transient failures that may occur when making HTTP requests to Azure services. When a request fails due to a transient error, the retry policy will:\n\n1. Determine if the failure is retryable\n2. Calculate an appropriate delay\n3. Wait for that delay\n4. Retry the request\n\nThe policy supports retrying on both transport-level failures (network issues) and certain HTTP status codes.\n\n### Default retry behavior\n\nBy default, the retry policy is configured with:\n\n- Maximum of three retry attempts\n- Initial retry delay of 800 milliseconds\n- Maximum retry delay of 60 seconds\n- Retryable status codes: 408, 429, 500, 502, 503, 504\n\nThe retry delay uses an exponential backoff strategy with jitter:\n\n- First retry: ~800 ms\n- Second retry: ~1,600 ms\n- Third retry: ~3,200 ms\n- And so on, until max retry delay is reached\n\n### When retries happen\n\nThe retry policy attempts to retry a request in the following scenarios:\n\n1. **Transport failures**:\n   - Network connectivity issues\n   - Connection time-outs\n   - DNS (Domain Name System) resolution failures\n\n2. **HTTP status codes**:\n   - 408 (Request time-out)\n   - 429 (Too Many Requests)\n   - 500 (Internal Server Error)\n   - 502 (Bad Gateway)\n   - 503 (Service Unavailable)\n   - 504 (Gateway time-out)\n\n3. **Service-specific retry logic**:\n   - Some services like Storage implement specialized retry logic for failover scenarios\n\n## Customizing retry behavior\n\nYou can customize the retry behavior when creating a client by modifying the `RetryOptions` in the client options.\n\n### Example: customizing retry options\n\n```cpp\n#include <azure/storage/blobs.hpp>\n\nint main() \n{\n    // Create client options\n    Azure::Storage::Blobs::BlobClientOptions options;\n    \n    // Modify retry options\n    options.Retry.MaxRetries = 5;                                    // Increase max retries\n    options.Retry.RetryDelay = std::chrono::milliseconds(1000);      // Set initial retry delay to 1 second\n    options.Retry.MaxRetryDelay = std::chrono::seconds(30);          // Cap maximum retry delay at 30 seconds\n    \n    // Add a custom status code to retry on\n    options.Retry.StatusCodes.insert(Azure::Core::Http::HttpStatusCode::Forbidden); // Retry on 403 errors\n    \n    // Create the client with custom retry options\n    auto blobClient = Azure::Storage::Blobs::BlobClient::CreateFromConnectionString(\n        connectionString,\n        containerName,\n        blobName,\n        options);\n    \n    // Use the client...\n}\n```\n\n## Adding custom policies\n\nYou can add custom policies to the HTTP pipeline to implement specialized behavior:\n\n### Adding a per-operation policy\n\nPer-operation policies are called once per API operation, regardless of how many retries are needed:\n\n```cpp\nclass MyCustomPolicy final : public Azure::Core::Http::Policies::HttpPolicy {\npublic:\n    ~MyCustomPolicy() override = default;\n    std::unique_ptr<HttpPolicy> Clone() const override\n    {\n        return std::make_unique<MyCustomPolicy>(*this);\n    }\n\n    std::unique_ptr<Azure::Core::Http::RawResponse> Send(\n        Azure::Core::Http::Request& request,\n        Azure::Core::Http::Policies::NextHttpPolicy nextPolicy,\n        Azure::Core::Context const& context) const override\n    {\n        // Custom logic before the request\n        \n        auto response = nextPolicy.Send(request, context);\n        \n        // Custom logic after the response\n        \n        return response;\n    }\n};\n\n// Adding the policy to client options\nAzure::Storage::Blobs::BlobClientOptions options;\noptions.PerOperationPolicies.emplace_back(std::make_unique<MyCustomPolicy>());\n```\n\n### Adding a per-retry policy\n\nPer-retry policies are called for each retry attempt:\n\n```cpp\n// Similar implementation to above, but add to PerRetryPolicies\noptions.PerRetryPolicies.emplace_back(std::make_unique<MyCustomRetryPolicy>());\n```\n\n## Handling secondary endpoints\n\nSome Azure services like Storage support secondary endpoints for high availability. The SDK includes support for automatic failover to secondary endpoints:\n\n```cpp\nAzure::Storage::Blobs::BlobClientOptions options;\n\n// Configure secondary endpoint for Storage\nstd::string primaryUrl = blobClient.GetUrl();\nstd::string secondaryUrl = InferSecondaryUrl(primaryUrl); // Your logic to determine secondary URL\nstd::string secondaryHost = Azure::Core::Url(secondaryUrl).GetHost();\n\noptions.SecondaryHostForRetryReads = secondaryHost;\n```\n\n## Logging retry attempts\n\nThe HTTP pipeline includes built-in logging for retry attempts. You can configure the logging level to see information about retries:\n\n```cpp\n// Set log level to see retry information\nAzure::Core::Diagnostics::Logger::SetLevel(Azure::Core::Diagnostics::Logger::Level::Informational);\n\n// Set a custom log listener to capture logs\nAzure::Core::Diagnostics::Logger::SetListener([](auto level, auto message) {\n    std::cout << \"Log [\" << static_cast<int>(level) << \"]: \" << message << std::endl;\n});\n```\n\nWhen a retry occurs, log entries appear like:\n\n- \"HTTP Transport error: [error details]\"\n- \"HTTP Retry attempt #1 will be made in 800 ms.\"\n- \"HTTP status code 503 will be retried.\"\n\n## Best practices\n\n1. **Use default retry settings when possible**\n   - The default settings are tuned for most scenarios and include best practices like exponential backoff\n\n2. **Be careful with non-idempotent operations**\n   - Consider limiting retries for operations that aren't safe to retry (like nonidempotent POST requests)\n\n3. **Consider circuit breaker patterns**\n   - For high-volume applications, implement circuit breaker patterns to prevent overwhelming services that are responding with errors\n\n4. **Test retry scenarios**\n   - Test your application's behavior when retries occur to ensure proper handling\n\n5. **Monitor retry telemetry**\n   - High retry rates might indicate underlying issues that should be addressed\n\n## Advanced: pipeline internals\n\nThe HTTP pipeline is implemented in the `Azure::Core::Http::_internal::HttpPipeline` class, which manages the sequence of policy execution. When a request is made, the pipeline:\n\n1. Starts with the first policy in the pipeline\n2. Each policy processes the request and then passes it to the next policy\n3. The last policy is typically the transport policy, which actually sends the request\n4. The response then flows back through the policies in reverse order\n\nThe retry policy is special in that it can repeat the entire sequence of policies that come after it in the pipeline.\n\n## Troubleshooting\n\nIf you're experiencing issues with retries:\n\n1. **Enable informational logging**\n   - Set the `AZURE_LOG_LEVEL` environment variable to `Informational` to see retry attempts\n\n2. **Check for transport errors**\n   - Network issues often manifest as transport exceptions\n\n3. **Verify service health**\n   - Persistent 500-level errors may indicate an Azure service issue\n\n4. **Review request IDs**\n   - Each request has a unique ID that can be used when working with Azure Support\n\n5. **Check timeout settings**\n   - Ensure your application's time-outs are compatible with the retry policy\n\n## Related content\n\n- [Azure SDK Design Guidelines](https://azure.github.io/azure-sdk/cpp_introduction.html)\n- [Retry Pattern](/azure/architecture/patterns/retry)\n- [Circuit Breaker Pattern](/azure/architecture/patterns/circuit-breaker)\n"
  },
  {
    "path": "articles/cpp/sdk/fundamentals/overview.md",
    "content": "---\ntitle: Core Concepts of the Azure SDK for C++\ndescription: Learn the fundamentals of using the Azure SDK for C++. \nms.topic: overview\nms.date: 5/08/2025\nms.custom: devx-track-cpp\n\n#customer intent: As a developer, I want a comprehensive and easy-to-use SDK for Azure services so that I can efficiently integrate cloud capabilities into my C++ applications.\n\n---\n\n# Core concepts of the Azure SDK for C++\n\nThe Azure SDK for C++ provides a set of libraries designed to help C++ developers integrate Azure services into their applications. This article explores the fundamental concepts that underpin the SDK, including the distinction between data and management planes, the role of Azure Core, package naming conventions, client objects, and configuration options. Understanding these core concepts will enable you to effectively use the SDK in your C++ applications.\n\n## Data plane vs. management plane\n\nThe Azure SDK for C++ provides libraries for data plane operations but doesn't offer libraries for management plane operations. Data plane libraries are used to interact with already provisioned Azure services. If you require management plane libraries for provisioning and managing Azure resources in C++, leave an issue on our [GitHub repository](https://github.com/Azure/azure-sdk-for-cpp/issues/new/choose).\n\n## Azure Core vs. other libraries\n\nThe Azure Core ([`azure-core`](/cpp/api/overview/azure/core-readme)) library provides fundamental functionalities that other libraries build on top of to provide specific functionalities for different Azure services. Developers need to understand the role of Azure Core to effectively use the SDK.\n\nThe main shared concepts of [`Azure::Core`](/cpp/api/azure-core/namespace_azure) include:\n\n- Handling streaming data and input/output (I/O) via [`BodyStream`](/cpp/api/azure-core/class_azure_1_1_core_1_1_i_o_1_1_body_stream) along with its derived types.\n- Accessing HTTP response details for the returned model of any SDK client operation, via [`Response<T>`](/cpp/api/azure-core/class_azure_1_1_response).\n- Polling long-running operations (LROs), via [`Operation<T>`](/cpp/api/azure-core/class_azure_1_1_core_1_1_operation).\n- Exceptions for reporting errors from service requests in a consistent fashion via the base exception type [`RequestFailedException`](/cpp/api/azure-core/class_azure_1_1_core_1_1_request_failed_exception).\n- Abstractions for Azure SDK credentials [`TokenCredential`](/cpp/api/azure-core/class_azure_1_1_core_1_1_credentials_1_1_token_credential).\n- Replaceable HTTP transport layer to send requests and receive responses over the network.\n- HTTP pipeline and HTTP policies such as retry and logging, which are configurable via service client specific options.\n\n## Package naming scheme\n\nThe Azure SDK for C++ uses a consistent naming scheme: `azure-<group_name>-<service_name>-<sub_service_name>`. Each name starts with `azure-`, followed by the group, service, and optionally a subservice. For example, `azure-security-keyvault-secrets` is for Azure Key Vault secrets.\n\n## Client objects\n\nClient objects in the Azure SDK for C++ are used to interact with Azure services. Each client object corresponds to a specific Azure service and provides methods to perform operations on that service. For example, [`BlobClient`](/cpp/api/azure-storage-blobs/class_azure_1_1_storage_1_1_blobs_1_1_blob_client) is used to interact with Azure Blob Storage.\n\n## Options parameter for client objects\n\nClient objects in the Azure SDK for C++ have methods that take an options parameter for customizing the interactions with the service. These options parameters can be used to set things like time-outs, retry policies, and other configurations.\n"
  },
  {
    "path": "articles/cpp/sdk/includes/implement-managed-identity-concepts.md",
    "content": "---\nms.topic: include\nms.date: 10/02/2025\n---\n\n## Authenticate to Azure services from your app\n\nThe Azure Identity library provides various *credentials*&mdash;implementations of `TokenCredential` adapted to supporting different scenarios and Microsoft Entra authentication flows. Since managed identity is unavailable when running locally, the steps ahead demonstrate which credential to use in which scenario:\n\n- **Local dev environment**: During **local development only**, use a class called [DefaultAzureCredential](../authentication/credential-chains.md#defaultazurecredential-overview) for an opinionated, preconfigured chain of credentials. `DefaultAzureCredential` discovers user credentials from your local tooling or IDE, such as the Azure CLI or Visual Studio. It also provides flexibility and convenience for retries, wait times for responses, and support for multiple authentication options. Visit the [Authenticate to Azure services during local development](../authentication/local-development-dev-accounts.md) article to learn more.\n- **Azure-hosted apps**: When your app is running in Azure, use [ManagedIdentityCredential](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity) to safely discover the managed identity configured for your app. Specifying this exact type of credential prevents other available credentials from being picked up unexpectedly.\n"
  },
  {
    "path": "articles/cpp/sdk/includes/sdk-auth-overview-dev-accounts.md",
    "content": "---\nms.topic: include\nms.date: 05/08/2025\n---\nIn this method, a developer must be signed in to Azure from the Azure CLI, Azure PowerShell, or Azure Developer CLI on their local workstation. The application then can access the developer's credentials from the credential store and use those credentials to access Azure resources from the app.<br>\n<br>\nThis method has the advantage of easier setup because a developer only needs to sign in to their Azure account through one of the aforementioned developer tools. The disadvantage of this approach is that the developer's account likely has more permissions than required by the application. As a result, the application doesn't accurately replicate the permissions it will run with in production.<br>\n<br>\n"
  },
  {
    "path": "articles/cpp/sdk/includes/sdk-auth-overview-dev-service-principals.md",
    "content": "---\nms.topic: include\nms.date: 05/08/2025\n---\nIn this method, dedicated *application service principal* objects are set up by using the app registration process for use during local development. The identity of the service principal is then stored as environment variables to be accessed by the app when it's run in local development.<br>\n<br>\nThis method allows you to assign the specific resource permissions needed by the app to the service principal objects used by developers during local development. This practice makes sure the application only has access to the specific resources it needs and replicates the permissions the app will have in production.<br>\n<br>\nThe downside of this approach is the need to create separate service principal objects for each developer who works on an application.<br>\n<br>\n"
  },
  {
    "path": "articles/cpp/sdk/includes/sdk-auth-overview-managed-identity.md",
    "content": "---\nms.topic: include\nms.date: 05/08/2025\n---\nApps hosted in Azure should use a *managed identity service principal*. Managed identities are designed to represent the identity of an app hosted in Azure and can only be used with Azure-hosted apps.<br>\n<br>\nFor example, a Django web app hosted in Azure App Service would be assigned a managed identity. The managed identity assigned to the app would then be used to authenticate the app to other Azure services.<br>\n<br>\nApps running in Azure Kubernetes Service (AKS) can use a Workload identity credential. This credential is based on a managed identity that has a trust relationship with an AKS service account.<br>\n<br>\n"
  },
  {
    "path": "articles/cpp/sdk/includes/sdk-auth-overview-service-principal.md",
    "content": "---\nms.topic: include\nms.date: 05/08/2025\n---\nApps hosted outside of Azure (for example, on-premises apps) that need to connect to Azure services should use an *application service principal*. An application service principal represents the identity of the app in Azure and is created through the application registration process.<br>\n<br>\nFor example, consider a Django web app hosted on-premises that makes use of Azure Blob Storage. You would create an application service principal for the app by using the app registration process. The `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_CLIENT_SECRET` would all be stored as environment variables to be read by the application at runtime and allow the app to authenticate to Azure by using the application service principal.<br>\n<br>\n"
  },
  {
    "path": "articles/cpp/sdk/install-and-integrate-the-sdk.md",
    "content": "---\ntitle: Install and Integrate the Azure SDK for C++\ndescription: \"Learn how to install packages from the Azure SDK for C++ with vcpkg and integrate them into your project with CMake.\"\nms.topic: install-set-up-deploy #Don't change\nms.date: 5/08/2025\nms.custom: devx-track-cpp\n\n#customer intent: As a developer, I want to seamlessly integrate Azure SDK for C++ libraries into my projects so that I can leverage Azure services efficiently and effectively.\n\n---\n<!-- markdownlint-disable MD051 MD024 -->\n\n# Install and integrate libraries from the Azure SDK for C++\n\nThis guide provides developers with the necessary steps to install libraries from the Azure SDK for C++ using vcpkg and integrate them into their projects with CMake. By following the instructions, you can set up your development environment and begin using Azure services in your C++ applications. Whether you're new to Azure or looking to streamline your integration process, this documentation helps you get started quickly and efficiently.\n\n## Prerequisites\n\n- Any Text Editor\n- A terminal\n- A C++ compiler\n- [git](https://git-scm.com/downloads)\n- [CMake](https://cmake.org/download/)\n- [An Azure subscription](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- [Azure CLI](/cli/azure/install-azure-cli)\n\n## Verify git and CMake installation\n\nTo ensure a smooth integration process, it's important to verify that git, and CMake are correctly installed on your system.\n\n### [Windows - PowerShell](#tab/win-powershell)\n\n1. To verify git is installed properly, run the following command in your terminal:\n\n    ```powershell\n    git --version\n    ```\n\n1. You should get an output denoting the currently installed version for git, like this:\n\n    ```output\n    git version <version>\n    ```\n\n1. To verify CMake is installed properly, run the following command in your terminal:\n\n    ```powershell\n    cmake --version\n    ```\n\n1. You should get an output denoting the currently installed version of CMake, like this:\n\n    ```output\n    cmake version <version>\n    ```\n\n### [MacOS/Linux - Bash](#tab/mac-linux-bash)\n\n1. To verify git is installed properly, run the following command in your terminal:\n\n    ```bash\n    git --version\n    ```\n\n1. You should get an output denoting the currently installed version for git, like this:\n\n    ```output\n    git version <version>\n    ```\n\n1. To verify CMake is installed properly, run the following command in your terminal:\n\n    ```bash\n    cmake --version\n    ```\n\n1. You should get an output denoting the currently installed version of CMake, like this:\n\n    ```output\n    cmake version <version>\n    ```\n\n---\n\n## Install vcpkg\n\nTo manage and install the Azure SDK for C++ libraries, use vcpkg. [vcpkg](/vcpkg/get_started/overview) is a cross-platform package manager that simplifies the process of handling dependencies.\n\n### [Windows - PowerShell](#tab/win-powershell)\n\n1. To install vcpkg, first clone the vcpkg repo. The recommended approach is to clone vcpkg to a central location on your development environment and not in your C++ project directory. In this example, vcpkg is cloned to the home dir.\n\n    ```powershell\n    cd ~\n    git clone https://github.com/microsoft/vcpkg.git\n    ```\n\n1. Once the vcpkg repo is cloned, traverse into the new directory and run the `bootstrap-vcpkg.bat` script.\n\n    ```powershell\n    cd .\\vcpkg\\\n    .\\bootstrap-vcpkg.bat\n    ```\n\n1. After bootstrapping vcpkg, add it to your path so you can access the vcpkg executable from your project directory. Remember to replace the `<path\\to\\vcpkg>` in the command example with the path to the vcpkg directory you cloned earlier.\n\n    ```powershell\n    $env:Path = \"$env:Path;<path\\to\\vcpkg>\"\n    ```\n\n1. To verify the vcpkg directory was added to your path, traverse back to your project directory and run the following command:\n\n    ```powershell\n    vcpkg --version\n    ```\n\n1. You should get the following output:\n\n    ```output\n    vcpkg package management program version <version>\n    ```\n\n### [MacOS/Linux - Bash](#tab/mac-linux-bash)\n\n1. To install vcpkg, first clone the vcpkg repo. The recommended approach is to clone vcpkg to a central location on your development environment and not in your C++ project directory. In this example, vcpkg is cloned to the home dir.\n\n    ```bash\n    cd ~\n    git clone https://github.com/microsoft/vcpkg.git\n    ```\n\n1. Once the vcpkg repo is cloned, traverse into the new directory and run the `bootstrap-vcpkg.sh` script.\n\n    ```bash\n    cd vcpkg\n    ./bootstrap-vcpkg.sh\n    ```\n\n1. After bootstrapping vcpkg, add it to your path so you can access the vcpkg executable from your project directory. Remember to replace the `<path\\to\\vcpkg>` in the command example with the path to the vcpkg directory you cloned earlier.\n\n    ```bash\n    export PATH=$PATH:/path/to/vcpkg\n    ```\n\n1. To verify the vcpkg directory was added to your path, traverse back to your project directory and run the following command:\n\n    ```bash\n    vcpkg --version\n    ```\n\n1. You should get the following output:\n\n    ```output\n    vcpkg package management program version <version>\n    ```\n\n---\n\n## Install the libraries\n\nThis section guides you through the process of installing the necessary libraries from the Azure SDK for C++ using vcpkg. This section shows how to use vcpkg in manifest mode which creates a couple vcpkg project files to help managed the dependencies of the project even when shared with other collaborators.\n\n### [Windows - PowerShell](#tab/win-powershell)\n\n1. From the root directory of your project, run the following command to start a new vcpkg project in manifest mode:\n\n    ```powershell\n    vcpkg new --application\n    ```\n\n1. There should now be a **vcpkg.json** file and a **vcpkg-configuration.json** file in your project directory.\n1. Now we can add the Azure Key Vault and Identity libraries from the Azure SDK for C++ to our project by running the following command:\n\n    ```powershell\n    vcpkg add port azure-identity-cpp azure-security-keyvault-secrets-cpp\n    ```\n\n1. The **vcpkg.json** file should now have the following contents:\n\n    ```json\n    {\n      \"dependencies\": [\n        \"azure-identity-cpp\",\n        \"azure-security-keyvault-secrets-cpp\"\n      ]\n    }\n    ```\n\n### [MacOS/Linux - Bash](#tab/mac-linux-bash)\n\n1. From the root directory of your project, run the following command to start a new vcpkg project in manifest mode:\n\n    ```bash\n    vcpkg new --application\n    ```\n\n1. There should now be a **vcpkg.json** file and a **vcpkg-configuration.json** file in your project directory.\n1. Now we can add the Azure Key Vault and Identity libraries from the Azure SDK for C++ to our project by running the following command:\n\n    ```bash\n    vcpkg add port azure-identity-cpp azure-security-keyvault-secrets-cpp\n    ```\n\n1. The **vcpkg.json** file should now have the following contents:\n\n    ```json\n    {\n      \"dependencies\": [\n        \"azure-identity-cpp\",\n        \"azure-security-keyvault-secrets-cpp\"\n      ]\n    }\n    ```\n\n---\n\n## Create an Azure Key Vault resource\n\nThis section discusses how to use the Azure CLI to create an Azure Key Vault resource. This Key Vault resource securely stores and manages sensitive information, such as secrets and keys.\n\n### [Windows - PowerShell](#tab/win-powershell)\n\n1. Use the Azure CLI to login by entering following command in your terminal:\n\n    ```azurecli\n    az login\n    ```\n\n1. Use the pop-up windows to log in to Azure.\n1. After using the pop-up browser window to log in, select the Azure subscription you'd like to use in the terminal.\n1. Then use the following command to create your Key Vault resource, and remember to replace `<your-resource-group-name>` and `<your-key-vault-name>` with your own, unique names:\n\n    ```azurecli\n    az keyvault create --resource-group <your-resource-group-name> --name <your-key-vault-name>\n    ```\n\n1. In the output, you should see a list of properties with a `vaultUri` property. Set that to an environment variable to be used in our program with the following command:\n\n    ```powershell\n    $env:AZURE_KEYVAULT_URL = \"https://<your-key-vault-name>.vault.azure.net/\"\n    ```\n\n### [MacOS/Linux - Bash](#tab/mac-linux-bash)\n\n1. Use the Azure CLI to login by entering following command in your terminal:\n\n    ```azurecli\n    az login\n    ```\n\n1. Use the pop-up windows to log in to Azure.\n1. After using the pop-up browser window to log in, select the Azure subscription you'd like to use in the terminal.\n1. Then use the following command to create your Key Vault resource, and remember to replace `<your-resource-group-name>` and `<your-key-vault-name>` with your own, unique names:\n\n    ```azurecli\n    az keyvault create --resource-group <your-resource-group-name> --name <your-key-vault-name>\n    ```\n\n1. In the output, you should see a list of properties with a `vaultUri` property. Set that to an environment variable to be used in our program with the following command:\n\n    ```bash\n    export AZURE_KEYVAULT_URL=\"https://<your-key-vault-name>.vault.azure.net/\"\n    ```\n\n---\n\n1. Finally, make sure your Azure account has the proper permissions to work with Key Vault Secrets. You can give yourself the proper permissions by assigning yourself the \"Key Vault Secrets Officer\" role on the Access Control (IAM) page of your Key Vault resource in the Azure portal. *IAM stands for identity and access management.*\n\n## Set up your project\n\nThis section describes the process of creating the necessary folders and files to set up your Azure C++ project.\n\n1. In the root of your project directory, create a **CMakeLists.txt** file. This file is used to configure our CMake project. Add the following code to the **CMakeLists.txt** file:\n\n    ```cmake\n    # Specify the minimum version of CMake required to build this project\n    cmake_minimum_required(VERSION 3.30.0)\n    \n    # Set the path to the vcpkg toolchain file\n    # Remember to replace the path below with the path where you cloned vcpkg\n    set(CMAKE_TOOLCHAIN_FILE \"/path/to/vcpkg-root/scripts/buildsystems/vcpkg.cmake\")\n    \n    # Define the project name, version, and the languages used\n    project(azure_sample VERSION 0.1.0 LANGUAGES C CXX)\n    \n    # Find and include the azure-identity-cpp package\n    find_package(azure-identity-cpp CONFIG REQUIRED)\n    \n    # Find and include the azure-security-keyvault-secrets-cpp package\n    find_package(azure-security-keyvault-secrets-cpp CONFIG REQUIRED)\n    \n    # Add an executable target named 'azure_sample' built from the main.cpp source file\n    add_executable(azure_sample main.cpp)\n    \n    # Link the azure-identity and azure-security-keyvault-secrets \n    # libraries to the azure_sample target\n    target_link_libraries(azure_sample PRIVATE\n        Azure::azure-identity\n        Azure::azure-security-keyvault-secrets\n    )\n    ```\n\n1. In the root of your project directory, create a **main.cpp** file. Add the following code to the **main.cpp** file:\n\n    ```cpp\n    #include <azure/identity.hpp>\n    #include <azure/keyvault/secrets.hpp>\n    #include <iostream>\n    \n    using namespace Azure::Security::KeyVault::Secrets;\n    \n    int main()\n    {\n        try\n        {\n            // Set Key Vault URL string\n            auto const keyVaultUrl = std::getenv(\"AZURE_KEYVAULT_URL\");\n    \n            // Create Default Azure Credential to Authenticate.\n            // It will pick up on our AzureCLI login\n            auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>();\n    \n            // Create Key Vault Secret Client\n            SecretClient secretClient(keyVaultUrl, credential);\n    \n            // Create a Secret\n            std::string secretName(\"MySampleSecret\");\n            std::string secretValue(\"My super secret value\");\n            secretClient.SetSecret(secretName, secretValue);\n    \n            // Get the Secret\n            KeyVaultSecret secret = secretClient.GetSecret(secretName).Value;\n            std::string valueString = secret.Value.HasValue()\n                                          ? secret.Value.Value()\n                                          : \"NONE RETURNED\";\n            std::cout << \"Secret is returned with name \" << secret.Name\n                      << \" and value \" << valueString << std::endl;\n        }\n        catch (Azure::Core::Credentials::AuthenticationException const &e)\n        {\n            std::cout << \"Authentication Exception happened:\" << std::endl\n                      << e.what() << std::endl;\n            return 1;\n        }\n        catch (Azure::Core::RequestFailedException const &e)\n        {\n            std::cout << \"Key Vault Secret Client Exception happened:\" << std::endl\n                      << e.Message << std::endl;\n            return 1;\n        }\n    \n        return 0;\n    }\n    ```\n\n1. Create a **build** directory for the build artifacts.\n\n## Build and run\n\nThis section discusses how to configure and build your project using CMake commands, and then run the program to ensure everything is set up correctly. The commands in this section should be run from the root of your project where the `build` directory, `CMakeLists.txt`, and `main.cpp` files are located.\n\n### [Windows - PowerShell](#tab/win-powershell)\n\n1. To configure CMake, enter the following command:\n\n    ```powershell\n    cmake -B ./build\n    ```\n\n1. To build the project, enter the following command:\n\n    ```powershell\n    cmake --build ./build\n    ```\n\n1. To run the program, enter the following command:\n\n    ```powershell\n    .\\build\\Debug\\azure_sample.exe\n    ```\n\n1. The program should have the following output:\n\n    ```output\n    Secret is returned with name MySampleSecret and value My super secret value\n    ```\n\n### [MacOS/Linux - Bash](#tab/mac-linux-bash)\n\n1. To configure CMake, enter the following command:\n\n    ```bash\n    cmake -B ./build\n    ```\n\n1. To build the project, enter the following command:\n\n    ```bash\n    cmake --build ./build\n    ```\n\n1. To run the program, enter the following command:\n\n    ```bash\n    ./build/azure_sample\n    ```\n\n1. The program should have the following output:\n\n    ```output\n    Secret is returned with name MySampleSecret and value My super secret value\n    ```\n\n---\n\n## Troubleshooting\n\n### Resource group not found\n\nWhen using the AzureCLI to create a Key Vault instance, if you receive the following error, the resource group you're trying to add the Key Vault instance to doesn't exist.\n\n  ```output\n  (ResourceGroupNotFound) Resource group '<your-resource-group-name>' could not be found.\n  Code: ResourceGroupNotFound\n  Message: Resource group '<your-resource-group-name>' could not be found.\n  ```\n\nTo create the resource group, you can use the following command:\n\n  ```azurecli\n  az group create --name <your-resource-group-name> --location <your-resource-group-location>\n  ```\n\nFor more information, check out the [AzureCLI docs on Managing Azure Resource Groups](/azure/azure-resource-manager/management/manage-resource-groups-cli).\n\n### CMake configure or build can't find Azure packages\n\nWhen running the CMake configure or build commands, if you receive the following error or something similar, the `CMakeLists.txt` file isn't running the `vcpkg.cmake` module before the CMake project is established or at all.\n\n  ```output\n  CMake Error at CMakeLists.txt:12 (find_package):\n    Could not find a package configuration file provided by\n    \"azure-identity-cpp\" with any of the following names:\n  \n      azure-identity-cppConfig.cmake\n      azure-identity-cpp-config.cmake\n  \n    Add the installation prefix of \"azure-identity-cpp\" to CMAKE_PREFIX_PATH or\n    set \"azure-identity-cpp_DIR\" to a directory containing one of the above\n    files.  If \"azure-identity-cpp\" provides a separate development package or\n    SDK, be sure it has been installed.\n  ```\n\nVerify in the **CMakeLists.txt** file, that the `set(CMAKE_TOOLCHAIN_FILE \"/path/to/vcpkg-root/scripts/buildsystems/vcpkg.cmake\")` line is above the `project(azure_sample VERSION 0.1.0 LANGUAGES C CXX)`.\n\nThen also verify that the `/path/to/vcpkg-root/` in the `set(CMAKE_TOOLCHAIN_FILE \"/path/to/vcpkg-root/scripts/buildsystems/vcpkg.cmake\")` line is updated to the location where vcpkg was installed.\n\n### Syntax error in cmake code\n\nWhen running the CMake configuration or build commands, if you receive the following error, the **CMakeLists.txt** file may contain paths using `\\`. This issue can be common when using Window's paths.\n\n  ```output\n  Syntax error in cmake code at\n  \n      C:/Users/username/Desktop/CppProject/CMakeLists.txt:6\n  \n    when parsing string\n  \n      C:\\Users\\username\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake\n  \n    Invalid character escape '\\U'.\n  ```\n\nEven though Windows uses `\\` in file paths, CMake only uses `/` in file paths. The issue can be resolved by replacing all `\\` with `/` in paths used in the **CMakeLists.txt** file.\n\nIf your error persists after making the change, refer to the [CMake errors persist after making change](#cmake-errors-persist-after-making-change) section to learn how to resolve them.\n\n### CMake errors persist after making change\n\nWhen running the CMake configure command, if you continue to receive the same error after making changes to fix it, try clearing the CMake cache. The CMake cache can be cleared by deleting the content of the **build** directory then rerunning the CMake configure command.\n\n### CMake 3.30 or higher required\n\nWhen running the CMake configure command, if you receive an error like the following, you may need to update your version of CMake.\n\n  ```output\n  CMake Error at CMakeLists.txt:2 (cmake_minimum_required):\n    CMake 3.30.0 or higher is required.  You are running version 3.25.0\n  ```\n\nTo resolve this error, update your installation of CMake to the version stated in the error message.\n\n### Caller is not authorized to perform action on resource\n\nWhen running the C++ sample program, if you receive an error like the following, you don't have the proper permissions to work with secrets on the specified Key Vault resource.\n\n  ```output\n  Key Vault Secret Client Exception happened:\n  Caller is not authorized to perform action on resource.\n  If role assignments, deny assignments or role definitions were changed recently, please observe propagation time.\n  Caller: <redacted-application-information>\n  Action: 'Microsoft.KeyVault/vaults/secrets/setSecret/action'\n  Resource: <redacted-resource-information>\n  Assignment: (not found)\n  DenyAssignmentId: null\n  DecisionReason: null \n  Vault: <your-key-vault-name>;location=<your-key-vault-location>\n  ```\n\nThe proper permissions can be given to your account either using the Azure portal or the Azure CLI.\n\nTo update your permissions using the Azure portal, navigate to the **Access Control (IAM)** page of your Key Vault resource. Select the **Add** dropdown and select **Add role assignment**. On the **Role** page, select the **Key Vault Secrets Officer** role and select **Next** at the bottom of the page. On the **Members** page, leave the **Assign access to** option on **User, group, or service principal** and select on the **Select members** link. In the pop-up on right, search for and select your ID, then select **Select** at the bottom of the pop-up. The ID you selected should now show in the table of the **Members** section. Select the **Review + assign** button at the bottom. Then select the **Review + assign** button again.\n\nTo update your permissions using the Azure CLI, enter the following command, replacing `<upn>` with your user principal name, `<subscription-id>` with your subscription ID, `<resource-group-name>` with your resource group name, and `<your-unique-keyvault-name>` with your Key Vault instance name:\n\n  ```azurecli\n  az role assignment create --role \"Key Vault Secrets Officer\" --assignee \"<upn>\" --scope \"/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>\"\n  ```\n\n### VS Code include errors\n\nIf you see error lines under your include statements when using VS Code (shown in the following image), the editor doesn't know where to find the include directory.\n\n:::image type=\"content\" source=\"media/vscode-include-error.png\" alt-text=\"{Screenshot of C++ include statements from VS Code that have red error squiggly lines underneath.}\":::\n\nvcpkg places the include headers in the `build/vcpkg_installed/<vcpkg-platform-triplet>/include` when in manifest mode. *Replace `<vcpkg-platform-triplet>` with the vcpkg triplet for your platform.*\n\nTo add the include directory to your VS Code settings, hover over the include statement with the error line. Then select the **Quick Fix...** link at the bottom of the pop-up. In the Quick Fix options, select the **Add to `\"includePath\": ${workspaceFolder}/build/vcpkg_installed/<vcpkg-platform-triplet>/include`** option. The C/C++ Extension Configuration tab should open up and under the \"Include path\" section you should see the path to the include directory listed.\n\n### Linux bootstrap-vcpkg could not find dependencies\n\nWhen running the **bootstrap-vcpkg.sh** script on Linux, if you receive an error like the following, you don't have the necessary tools installed to run the script.\n\n  ```output\n  Could not find zip. Please install it (and other dependencies) with:\n  On Debian and Ubuntu derivatives:\n    sudo apt-get install curl zip unzip tar\n  On recent Red Hat and Fedora derivatives:\n    sudo dnf install curl zip unzip tar\n  On older Red Hat and Fedora derivatives:\n    sudo yum install curl zip unzip tar\n  On SUSE Linux and derivatives:\n    sudo zypper install curl zip unzip tar\n  On Arch Linux and derivatives:\n    sudo pacman -Syu base-devel git curl zip unzip tar cmake ninja\n  On Alpine:\n    apk add build-base cmake ninja zip unzip curl git\n    (and export VCPKG_FORCE_SYSTEM_BINARIES=1)\n  ```\n\nTo install the tools, use the provided command in the error message for your linux distribution. For example, on Ubuntu it would be the following command:\n\n  ```bash\n  sudo apt-get install curl zip unzip tar\n  ```\n\nThen rerun the `bootstrap-vcpkg.sh` script.\n\n### Linux could not find toolchain file\n\nWhen running the CMake configure command, if you receive an error like the following, the path to the **vcpkg.cmake** modules wasn't properly set.\n\n  ```output\n  CMake Error at /usr/share/cmake-3.28/Modules/CMakeDetermineSystem.cmake:176 (message):\n    Could not find toolchain file:\n    /path/to/vcpkg-root/scripts/buildsystems/vcpkg.cmake\n  Call Stack (most recent call first):\n    CMakeLists.txt:9 (project)\n  ```\n\nIn the **CMakeLists.txt** file update the `set(CMAKE_TOOLCHAIN_FILE \"/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake\")` statement with the correct path to where vcpkg was installed.\n\n### Linux vcpkg install failed\n\nWhen running the CMake configure command, if you receive an error like the following, system dependencies for the packages need to be installed.\n\n  ```output\n  CMake Error at /path/to/vcpkg/scripts/buildsystems/vcpkg.cmake:904 (message):\n    vcpkg install failed.  See logs for more information:\n  ```\n\nTo find the needed system packages, search the output of the CMake config commands for lines starting with `Could not find <system-package>`, replacing `<system-package>` with the missing system package. Underneath this line should be a command to install that missing system package. Run that command. Then rerun the CMake configuration command. You may need to repeat this process a few times depending on the number of missing system packages.\n\n## Next step\n"
  },
  {
    "path": "articles/cpp/sdk/media/mermaidjs/local-service-principal-authentication.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE \n%% ======================= \n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md): \n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1 \n%% 2. Run command: mmdc -i local-service-principal-authentication.md -o ../../media/mermaidjs/local-service-principal-authentication.svg \n\nflowchart LR\n    APP[\"Local C++ app\"]\n    SP[\"App service principal stored in environment variables\"]\n    AS[\"Azure services\"]\n    \n    APP --> SP\n    SP --> AS\n    \n    classDef app fill:#e6f3ff,stroke:#0078d4,stroke-width:2px,color:#000,font-size:16px\n    classDef serviceP fill:#D4F4D4,stroke:#7BC97B,stroke-width:2px,color:#000,font-size:16px\n    classDef services fill:#0078d4,stroke:#005ba1,stroke-width:2px,color:#fff,font-size:16px\n    \n    class APP app\n    class SP serviceP\n    class AS services\n```\n"
  },
  {
    "path": "articles/cpp/sdk/mermaidjs/chain-sequence.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chain-sequence.md -o ../media/mermaidjs/chain-sequence.svg\n\nsequenceDiagram\n  autonumber;\n\n  participant A as C++ app;\n  participant B as Credential chain;\n  participant C as TokenCredential instance;\n    \n  A->>B: Authenticate to Microsoft Entra ID;\n  activate B;\n  B->>B: GetToken;\n  loop Traverse TokenCredential collection until AccessToken received\n    B->>C: Fetch token;\n    activate C;\n    C->>C: GetToken;\n    break when Result is AccessToken\n        C-->>B: Result;\n    end;\n    deactivate C;\n  end;\n  \n  B-->>A: AccessToken;\n  deactivate B;\n```\n"
  },
  {
    "path": "articles/cpp/sdk/mermaidjs/chained-token-credential-authentication-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chained-token-credential-authentication-flow.md -o ../media/mermaidjs/chained-token-credential-authentication-flow.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    direction LR;\n    A(Managed Identity):::deployed ==> B(Azure CLI):::developer;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C;\n    classDef developer fill:#F5AF6F, stroke:#EB7C39;\n```\n"
  },
  {
    "path": "articles/cpp/sdk/mermaidjs/default-azure-credential-authentication-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i default-azure-credential-authentication-flow.md -o ../media/mermaidjs/default-azure-credential-authentication-flow.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    subgraph CREDENTIAL TYPES;\n        direction LR;\n        Deployed(Deployed service):::deployed ~~~ Developer(Developer tool):::developer;\n    end;\n\n    subgraph CREDENTIALS;\n        direction LR;\n        A(Environment):::deployed ==> B(Workload Identity):::deployed ==> C(Managed Identity):::deployed ==> D(Azure CLI):::developer;\n    end;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C;\n    classDef developer fill:#F5AF6F, stroke:#EB7C39;\n```\n"
  },
  {
    "path": "articles/cpp/sdk/mermaidjs/default-azure-credential-environment-variable-production.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i default-azure-credential-environment-variable-production.md -o ../media/mermaidjs/default-azure-credential-environment-variable-production.svg\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\nflowchart LR;\n    A(Environment):::deployed ==> B(Workload Identity):::deployed ==> D(Managed Identity):::deployed;\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C;\n```\n"
  },
  {
    "path": "articles/cpp/sdk/overview.md",
    "content": "---\ntitle: Overview of the Azure SDK for C++\ndescription: Learn how the Azure SDK for C++ can help you create and manage applications that run on Azure.\nms.topic: overview\nms.date: 5/08/2025\nms.custom: devx-track-cpp\n\n#customer intent: As a developer, I want a comprehensive and easy-to-use SDK for Azure services so that I can efficiently integrate cloud capabilities into my C++ applications.\n\n---\n\n# What is the Azure SDK for C++?\n\nThe Azure SDK for C++ provides a set of client libraries that enable your C++ applications to interact seamlessly with Azure services, whether in local or cloud environments. These libraries, built on top of the Azure REST API, offer familiar C++ syntax and implement common cloud patterns such as authentication, logging, and retries. By using the Azure SDK for C++, you can efficiently manage and utilize Azure resources, enhancing your development workflow with robust and reliable cloud capabilities.\n\n## Client libraries\n\nThe Azure SDK for C++ is composed of numerous client libraries, each designed to interact with specific Azure services. This modular approach allows developers to include only the libraries they need, minimizing unnecessary dependencies and reducing bloat in their projects.\n\nEach Azure service can have one or multiple libraries tailored to different functionalities. For example, Azure Key Vault offers separate libraries for managing Keys, Secrets, and Certificates. This granularity ensures that developers can precisely target the capabilities they require without incorporating extraneous features.\n\nBreaking down the Azure SDK for C++ into these small, consumable service libraries, allows users to efficiently manage their dependencies and streamline their development process. This design not only enhances the flexibility and maintainability of applications but also aligns with common cloud development patterns, ensuring a seamless integration with Azure services.\n\n## Installation and integration\n\nThe Azure SDK for C++ supports acquiring libraries through vcpkg, a modern package manager for C++. vcpkg simplifies the often frustrating task of managing dependencies in C++ projects. By using vcpkg, you can easily download the source of your project's dependencies and their dependencies, and build them as part of your project's build process.\n\nvcpkg integrates seamlessly with CMake, a widely used build system for C++ projects. By utilizing a CMake module, vcpkg manages the entire dependency chain, ensuring that all required libraries are correctly downloaded and built. This integration not only streamlines the setup process but also ensures consistency across different development environments.\n\nBy using vcpkg and CMake, you can focus more on developing your application and less on managing dependencies, enhancing your overall development workflow. If you'd like to see how to install and integrate the Azure SDK for C++ libraries into your projects, check out the [Install and integrate libraries from the Azure SDK for C++](./install-and-integrate-the-sdk.md).\n\n## Unified design principles\n\nThe Azure SDK for C++ is built on a foundation of core libraries that provide common types and patterns across all service libraries. This unified design ensures consistency and familiarity, making it easier for developers to learn and use the SDK effectively.\n\nWhen you start with your first library from the Azure SDK for C++, you'll encounter these common types and patterns. As you become familiar with them, you'll find that transitioning to other libraries within the SDK is seamless. This consistency allows you to quickly get up to speed with new libraries, enhancing your productivity and reducing the learning curve.\n\nAdhering to these unified design principles, allows the Azure SDK for C++ to offer a cohesive and intuitive development experience. Whether you're working with Azure Key Vault, Azure Storage, or any other service, you'll benefit from the same reliable and predictable behavior, enabling you to efficiently manage and utilize Azure resources.\n\n## Open source\n\nThe Azure SDK for C++ is an open source project, providing transparency and accessibility to its users. By being open source, it allows developers to [inspect the source code](https://github.com/Azure/azure-sdk-for-cpp) of each library, gaining a deeper understanding of how the SDK operates and ensuring that it meets their specific needs.\n\nWe actively encourage feedback from our users through [issues on our GitHub repository](https://github.com/Azure/azure-sdk-for-cpp/issues). This feedback is invaluable in helping us improve the SDK and address any concerns or suggestions from the community. Additionally, we welcome contributions from developers around the world. Whether it's fixing bugs, adding new features, or improving documentation, contributions through pull requests (PRs) are always appreciated.\n\nBy fostering an open-source community, we aim to create a collaborative environment where developers can work together to enhance the Azure SDK for C++. This collaborative approach not only improves the quality of the SDK but also ensures that it evolves to meet the needs of its users.\n\n## Next steps\n\n- [Install and Integrate the Azure SDK for C++](install-and-integrate-the-sdk.md)\n"
  },
  {
    "path": "articles/dev-tunnels/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: Dev tunnels\n      tocHref: /azure\n      topicHref: /azure/developer/dev-tunnels/index\n"
  },
  {
    "path": "articles/dev-tunnels/cli-commands.md",
    "content": "---\ntitle: Dev tunnels command-line reference\ntitleSuffix: Microsoft dev tunnels\ndescription: Reference documentation for how to use the dev tunnel command line tool to create publicly accessible ports for local services.\nauthor: plequere-ms\nms.author: plequere\nms.topic: reference\nms.service: azure-dev-tunnels\nms.date: 03/27/2025\n---\n\n# Dev tunnels command-line reference\n\nDev tunnels offer a command-line interface (CLI) tool for creating and managing dev tunnels. This article explains the syntax and parameters for the various `devtunnel` CLI commands.\n\n> [!IMPORTANT]\n> This feature is currently in public preview.\n> This preview version is provided without a service-level agreement, and it's not recommended for production workloads. Certain features might not be supported or might have constrained capabilities.\n\n>[!NOTE]\n>`devtunnel` CLI commands are in preview. Command names and options may change in future releases.\n\n## Global options\n\n- `-v, --verbose`: Enable verbose output.\n- `-?, -h, --help`: Show help and usage information.\n\n## Manage user credentials\n\nThe dev tunnel service requires login for authorizing management of and access to dev tunnels. By default, a dev tunnel is only accessible to the user who created the dev tunnel, though that user may grant access to others.\n\nAfter logging in, the login token is cached in the system secure key chain, and is valid for several days before expiration. Logging out of the CLI clears this cached token, but doesn't clear any browser cookies. Which may include dev tunnel access tokens if a browser was used to authenticate with a dev tunnel.\n\n| Command     | Description                                                       |\n|-------------------|-------------------------------------------------------------------|\n| `devtunnel user login`     | Login with a Microsoft or GitHub account. |\n| `devtunnel user logout`    | Clear the cached token                                  |\n| `devtunnel user show` | Show current login status                                     |\n\n> [!TIP]\n> `devtunnel login` and `devtunnel logout` are shorthand commands for logging in and out.\n\nHere are some examples on use of these commands:\n\n| Examples     | Description                                                       |\n|-----------------------------------|---------------------------------------------------------|\n| `devtunnel user login`     | Login with a Microsoft organization (Microsoft Entra ID) or personal account |\n| `devtunnel user login -g`  | Login with a GitHub account |\n| `devtunnel user login -d`  | Login with a Microsoft organization (Microsoft Entra ID) or personal account with _device code login_, if local interactive browser login isn't possible  |\n| `devtunnel user login -g -d`  | Login with a GitHub account with _device code login_, if local interactive browser login isn't possible |\n\n## Host a dev tunnel\n\n`devtunnel host` is the main command used to host your dev tunnel. The command should be run on the host system running the server you want accessible through the dev tunnel.\n\n| Command     | Description                                                       |\n|-------------------|-------------------------------------------------------------------|\n| `devtunnel host`     | Host a dev tunnel. If a dev tunnel ID isn't specified, a new _temporary_ dev tunnel is created that is deleted once the connection is closed. |\n\nHere are some examples on use of this command:\n\n| Examples     | Description                                                       |\n|---------------------------------------------------|---------------------------------------------|\n| `devtunnel host -p 3000`     | Host a temporary dev tunnel for a server listening port 3000 on the host system. |\n| `devtunnel host -p 3000 --allow-anonymous`  | Host a temporary dev tunnel and enable anonymous client access. |\n| `devtunnel host -p 3000 5000`  | Host a temporary dev tunnel for local servers listening on ports 3000 and 5000. |\n| `devtunnel host -p 8443 --protocol https`  | Host a temporary dev tunnel for a server listening on port 8443 that uses the HTTPS protocol. |\n| `devtunnel host -p 8000 --expiration 2d`     | Host a temporary dev tunnel with a custom expiration time. Minimum is 1 hour (1h) and the maximum is 30 days (30d). |\n| `devtunnel host TUNNELID`  | Host an existing dev tunnel that has previously been configured. |\n\n> [!WARNING]\n> Allowing anonymous access to a dev tunnel means anyone on the internet is able to connect to your local server, if they can guess the dev tunnel ID.\n\nPress **Control-C** to stop the dev tunnel host process and terminate any client connections through the dev tunnel.\nIf an existing dev tunnel wasn't provided, the dev tunnel that was automatically created by the process will be deleted on process exit.\n\n## Connect to a dev tunnel\n\n**Using web-forwarding UI:**\n\nThe `devtunnel host` command shows output similar to the following:\n\n```powershell\nHosting port 3000 at https://l3rs99qw-3000.usw2.devtunnels.ms/\n```\n\nThe displayed `https:` URI is unique to the dev tunnel port: the first component is a subdomain containing the given dev tunnel id and port number.\n\nIf the hosted port connects to a web server, then that URI can be opened directly in a browser, from anywhere. If access to the dev tunnel requires authorization, then the initial request to the URI will redirect to a login page, and return to the site after the user is authorized.\n\nIf the hosted port connects to a web service, then that URI can be used as the base URI by a web service client application. However, if the dev tunnel doesn't allow anonymous access then the web service client normally won't know how to authenticate. If the web service is safe to expose publicly, consider allowing anonymous access. Otherwise, a web service client may add a request header with a dev tunnel access token to authorize the connection.\n\n**Using the CLI:**\n\nInstead of having a client browser or application connect directly to a dev tunnel relay URI, the CLI may be used to forward connections from a port on the client to a dev tunnel port. The client may also need to log in, if the dev tunnel doesn't allow anonymous access.\n\n```powershell\ndevtunnel connect TUNNELID\n```\n\n- Replace `TUNNELID` with the same dev tunnel id that was used on the host.\n\nSuccessful client output is similar to the following:\n\n```powershell\nConnected to tunnel: l3rs99qw\nSSH: Forwarding from 127.0.0.1:3000 to host port 3000.\nSSH: Forwarding from [::1]:3000 to host port 3000.\n```\n\nNow, the server that was shared on the host's port 3000 is available at `localhost:3000` on the client, using either IPv4 or IPv6. (The \"SSH\" prefix is because the dev tunnel service builds on the standard SSH protocol for port-forwarding.) If the hosted port connects to a web server, then `http://localhost:3000/` can be opened in a browser. In this case, no further authorization is required because the client's CLI login token was used to authorize the connection if necessary.\n\n## Advanced: Manage dev tunnels\n\nIt's possible to create a dev tunnel without yet hosting it. This is useful for advanced dev tunnel configuration and management such as:\n\n- Listing all owned dev tunnels\n- Adding and removing ports of a dev tunnel\n- Managing dev tunnel access controls\n- Adding metadata to a dev tunnel like description and tags\n\n| Command     | Description                                                       |\n|-------------------|-------------------------------------------------------------------|\n| `devtunnel create`     | Create a persistent dev tunnel |\n| `devtunnel list`     | List dev tunnels |\n| `devtunnel show`     | Show dev tunnel details |\n| `devtunnel update`     | Update dev tunnel properties |\n| `devtunnel delete`     | Delete a dev tunnel |\n| `devtunnel delete-all`     | Delete all dev tunnels |\n\nHere are some examples on use of these commands:\n\n| Examples     | Description                                                       |\n|-------------------------------------------------------------|----------------------------------|\n| `devtunnel create -a`     | Create a persistent dev tunnel that allows anonymous access. |\n| `devtunnel create -d 'my tunnel description'`     | Create a persistent dev tunnel with a non-searchable description. |\n| `devtunnel create --expiration 4h`     | Create a persistent dev tunnel with a custom expiration time. Minimum is 1 hour (1h) and the maximum is 30 days (30d). |\n| `devtunnel create myTunnelID`     | Create a persistent dev tunnel with a custom tunnel ID. |\n| `devtunnel create --tags my-web-app v1`     | Create a persistent dev tunnel and apply searchable tags. |\n| `devtunnel list --tags my-web-app`     | List dev tunnels that have any of the specified tags. |\n| `devtunnel list --all-tags my-web-app v1`     | List dev tunnels that have all the specified tags. |\n| `devtunnel show`     | Show details of the last-used dev tunnel. |\n| `devtunnel show TUNNELID`     | Show details for a dev tunnel. |\n| `devtunnel update TUNNELID -d 'my new tunnel description'`     | Update the description of a dev tunnel. |\n| `devtunnel update TUNNELID --remove-tags`     | Remove all tags from a dev tunnel. |\n| `devtunnel update TUNNELID --expiration 10d`     | Update a dev tunnel with a new custom expiration time. Minimum is 1 hour (1h) and the maximum is 30 days (30d). |\n| `devtunnel delete TUNNELID`     | Delete a dev tunnel. |\n| `devtunnel delete-all`     | Delete all your dev tunnels. |\n\n> [!TIP]\n> Most CLI commands operate on the last-used dev tunnel implicitly, though there's an option to specify a dev tunnel ID if necessary.\n\n## Advanced: Manage dev tunnel ports\n\nA dev tunnel created using the `devtunnel create` command initially has no ports. Use `devtunnel port` commands to add ports before hosting:\n\n| Command     | Description                                                       |\n|-------------------|-------------------------------------------------------------------|\n| `devtunnel port create`     | Create a dev tunnel port |\n| `devtunnel port list`     | List dev tunnel ports |\n| `devtunnel port show`     | Show dev tunnel port details |\n| `devtunnel port update`     | Update dev tunnel port properties |\n| `devtunnel port delete`     | Delete a dev tunnel port |\n\n| Examples                                      | Description                            |\n|-----------------------------------------------------|----------------------------------------|\n| `devtunnel port create -p 3000 --protocol http` | Add a port with the specified protocol |\n| `devtunnel port list TUNNELID`                               | List current ports                     |\n| `devtunnel port show TUNNELID -p 3000`                               | Show the details for port 3000                     |\n| `devtunnel port update -p 3000 --description 'frontend port'` | Update a dev tunnel port description |\n| `devtunnel port delete -p 3000`                     | Delete a port                          |\n\nWhen creating a port, the protocol may optionally be specified, if auto-detection doesn't work properly. Current options are \"http\", \"https\" or \"auto\" (default). If the hosted port is HTTPS, then it's recommended to set the port protocol to \"https\"; otherwise \"auto\" is probably fine.\n\nAfter configuring a dev tunnel using the above commands, start hosting it:\n\n```powershell\ndevtunnel host\n```\n\n## Advanced: Manage dev tunnel access\n\nWith the following commands, dev tunnel access tokens can be issued to provide other clients access to your dev tunnel without allowing anonymous access. The access control entry commands allow you to configure access control on dev tunnels and dev tunnel ports.\n\n| Command     | Description                                                       |\n|-------------------|-------------------------------------------------------------------|\n| `devtunnel token`     | Issue dev tunnel access token |\n| `devtunnel access create`     | Create an access control entry |\n| `devtunnel access list`     | List access control entries |\n| `devtunnel access delete`     | Delete an access control entry |\n| `devtunnel access reset`     | Reset access control entries to default |\n\nHere are some examples on use of these commands:\n\n| Examples                                      | Description                            |\n|------------------------------------------------------------------|--------------------------------|\n| `devtunnel token TUNNELID --scopes connect` | Get a 'connect' access token for a dev tunnel that can be shared to provide temporarily access to the dev tunnel. |\n| `devtunnel access create TUNNELID --anonymous` | Enable anonymous client access on the dev tunnel. |\n| `devtunnel access create TUNNELID --anonymous --expiration 4h` | Enable anonymous client access on the dev tunnel with a custom access control expiration time. Minimum is 1 hour (1h) and the maximum is 30 days (30d). |\n| `devtunnel access create TUNNELID --port 3000 --anonymous` | Enable anonymous client access on port 3000. |\n| `devtunnel access create TUNNELID --tenant` | Enable the current Microsoft Entra tenant access on the dev tunnel. |\n| `devtunnel access create TUNNELID --org ORG` | Enable a GitHub organization access by name on the dev tunnel. |\n\n> [!TIP]\n> GitHub organization access requires [installing the Dev Tunnels GitHub app into the org](./security.md#github-organization-access).\n\n## Supplementary commands\n\nThese commands can be used if you need to explicitly set or unset this local cache of last-used dev tunnel.\n\n| Command     | Description                                                       |\n|-------------------|-------------------------------------------------------------------|\n| `devtunnel set`     | Set default dev tunnel |\n| `devtunnel unset`     | Clear default dev tunnel |\n\n## Diagnostic commands\n\n| Command     | Description                                                       |\n|-------------------|-------------------------------------------------------------------|\n| `devtunnel clusters`     | List available service clusters by location |\n| `devtunnel echo`     | Run a diagnostic echo server on a local port |\n| `devtunnel ping`     | Send diagnostic messages to a remote echo server |\n\n\n| Examples     | Description                                                       |\n|-------------------|-------------------------------------------------------------------|\n| `devtunnel clusters --ping`     | List available service clusters sorted by measured latency. |\n| `devtunnel echo http --port 8080 --interface 127.0.0.1`     | Start a local http diagnostic server on port 8080. |\n\n## Troubleshooting\n\nTo troubleshoot issues with the `devtunnel` CLI, the following tips may be useful:\n\n- Ensure you're on the latest version of the `devtunnel` CLI. Check the currently installed version with `devtunnel --version`.\n- The `--verbose` option prints debugging messages, which can provide extra diagnostic information.\n"
  },
  {
    "path": "articles/dev-tunnels/faq.md",
    "content": "---\ntitle: Dev tunnels frequently asked questions (FAQ)\ntitleSuffix: Microsoft dev tunnels\ndescription: Frequently asked questions for dev tunnels.\nauthor: plequere-ms\nms.author: plequere\nms.topic: reference\nms.service: azure-dev-tunnels\nms.date: 03/27/2025\n---\n\n# Frequently asked questions (FAQ)\n\nThis article answers some frequently asked questions about dev tunnels.\n\n## What is dev tunnels?\n\nDev tunnels allow developers to securely share local web services across the internet. There are many use cases including: sharing in-progress work without having to deploy an application; prototyping applications locally that need the ability to receive webhook notifications from other services; working with local web services during mobile development.\n\n## Issues and requests\n\nSee how to request feedback or submit an issue [here](support.md).\n\n## Is dev tunnels available on all platforms?\n\nDev tunnels are available cross-platform on Windows, Linux, and macOS.\n\n## What are the usage limits for dev tunnels?\n\nSee the dev tunnels limits [here](https://aka.ms/devtunnels/limits).\n\n## When are unused dev tunnels deleted?\n\nThe default is after 30 days of no activity. You can set a custom expiration by appending `--expiration 5d` to the create, host, or update command. Minimum that you can set is 1 hour (1h) and the maximum you can set is 30 days (30d). The custom expiration you set is after a period of inactivity, just like the default expiration. This means it isn't a fixed expiration time, but instead a sliding window that is automatically pushed out by any new activity. See examples [here](cli-commands.md).\n\n## Can I set time-limited anonymous access to my tunnel?\n\nYes. You can set time-limited anonymous access by running `devtunnel access create TUNNELID -a --expiration 2h` after you've created a tunnel. Minimum that you can set is 1 hour (1h) and the maximum you can set is 30 days (30d). Once the access control expires, it is removed from the tunnel. If an access control is set to expire after the tunnel expires, the tunnel expiration takes precedence. Note, once you set the expiration for an access control you cannot modify it, unless you entirely reset your access controls on the tunnel. Additionally, this expiration is on a fixed window, so it checks the access control expiration against the time it was created.\n\n## How can I create a persistent tunnel?\n\nRun `devtunnel create` to create a persistent tunnel. If you run `devtunnel host` without running `devtunnel create` before that, the `devtunnel host` command creates a temporary tunnel that is deleted once the connection is closed.\n\n## Is it better to recreate dev tunnels or reuse the same dev tunnel?\n\nWe'd recommend reusing the same dev tunnel when it's convenient, rather than creating a new one for every use. It's also slightly faster to get an existing dev tunnel compared to creating a new one. In addition, by reusing the same dev tunnel, the dev tunnel web forwarding URL can be stable instead of changing on every use.\n\n## Can anonymous users create dev tunnels?\n\nNo, anonymous users can't create dev tunnels. All creation of dev tunnels requires either a Microsoft Entra ID, Microsoft, or GitHub account.\n\n## Why would I want to choose a tunnel ID if it's not used in the tunnel URL?\n\nTunnel IDs need to be provided for all operations that refer to a tunnel, so having the ability to choose your own tunnel ID adds convenience. We recommend choosing a tunnel ID that is easy to remember and type.\n\n## What are the license terms for dev tunnels?\n\nWhen using the `devtunnel` CLI for the first time, you see a link to the dev tunnel license terms. You can also download our license terms [here](https://aka.ms/devtunnels/tos).\n\n## Where else is dev tunnels used?\n\n- [How to use dev tunnels in Visual Studio 2022 with ASP.NET Core apps](/aspnet/core/test/dev-tunnels)\n- [Local Port Forwarding built into Visual Studio Code](https://code.visualstudio.com/docs/editor/port-forwarding)\n- [Teams Toolkit for Visual Studio Code Update – April 2023](https://devblogs.microsoft.com/microsoft365dev/teams-toolkit-for-visual-studio-code-update-april-2023/)\n- [Debug and test your web APIs within Microsoft Power Automate or Power Apps](/connectors/custom-connectors/port-tunneling)\n- [GitHub Codespaces](https://github.com/features/codespaces)\n"
  },
  {
    "path": "articles/dev-tunnels/get-started.md",
    "content": "---\ntitle: Create and host a tunnel\ntitleSuffix: Microsoft dev tunnels\ndescription: In this quickstart, you learn how to get started with creating publicly accessible ports for local services with dev tunnels. After you complete these steps, you have a dev tunnel that you can use to connect to remote compute.\nauthor: plequere-ms\nms.author: plequere\nms.topic: quickstart\nms.service: azure-dev-tunnels\nms.date: 03/27/2025\n---\n# Create and host a dev tunnel\n\nDev tunnels is a powerful tool to securely open your localhost to the internet and control who has access, so you can easily test and debug your web apps and webhooks from virtually anywhere. Create, host, and connect to your first dev tunnel in seconds.\n\nIn this quickstart, you'll learn how to create, host, and connect to your first dev tunnel in seconds.\n\n## Install\n\nBefore you create a dev tunnel, you first need to download and install the `devtunnel` CLI (Command Line Interface) tool that corresponds to your operating system.\n\n## [Windows](#tab/windows)\n\n## Windows Package Manager (winget)\n\nYou can use winget, Microsoft's package manager for Windows, to install and update the `devtunnel` CLI.\n\n```powershell\nwinget install Microsoft.devtunnel\n```\n\nThis command installs the latest version by default and removes the older version in the same location, which is %LOCALAPPDATA%\\Microsoft\\WinGet\\Packages. To specify a version, add `--version <version_number>` with your desired version to the command.\n\n```powershell\nwinget upgrade Microsoft.devtunnel\n```\n\n## PowerShell script\n\nYou can also install the `devtunnel` CLI using PowerShell and running the following command:\n\n```powershell\nInvoke-WebRequest -Uri https://aka.ms/TunnelsCliDownload/win-x64 -OutFile devtunnel.exe\n.\\devtunnel.exe -h\n```\n\nDirect download link:\n\n[Windows (x64) - https://aka.ms/TunnelsCliDownload/win-x64](https://aka.ms/TunnelsCliDownload/win-x64)\n\nRun commands with `devtunnel` instead of `./devtunnel`:\n\n1. Press the Windows key and type 'Environment variables'.\n2. Select the option 'Edit the system environment variables'.\n3. Select the 'Environment Variables...' button.\n4. There you see two tables, in the 'System Variables' table, find and select the 'PATH' variable.\n5. Select the 'Edit...' button.\n6. A window should pop up. Select the 'New' button.\n7. Type the directory path of your devtunnel.exe file (directory means exclude the file name from path.\n8. To find the directory string, you can navigate to the directory in PowerShell or terminal and type 'pwd')\n9. Select 'Ok' on all open windows and restart the command prompt.\n\n## [macOS](#tab/macos)\n\n## Homebrew\n\nYou can use Homebrew, to install and update the `devtunnel` CLI. The following commands could be used with or without `--cask`.\n\n```bash\nbrew install --cask devtunnel\n```\n\n```bash\nbrew uninstall --cask devtunnel\n```\n\n```bash\nbrew upgrade --cask devtunnel\n```\n\n```bash\nbrew list --versions devtunnel\n```\n\nPlease note, the following command is only available if you installed the version you are looking for with Homebrew previously. To see a list of which versions you have available, run the command above.\n\n```bash\nbrew switch --cask devtunnel <older_version>\n```\n\n\n## Script\n\n```bash\ncurl -sL https://aka.ms/DevTunnelCliInstall | bash\n```\n\nDirect download link:\n\n[macOS (arm64) - https://aka.ms/TunnelsCliDownload/osx-arm64-zip](https://aka.ms/TunnelsCliDownload/osx-arm64-zip)\n\n[macOS (x64) - https://aka.ms/TunnelsCliDownload/osx-x64-zip](https://aka.ms/TunnelsCliDownload/osx-x64-zip)\n\n## [Linux](#tab/linux)\n\n```bash\ncurl -sL https://aka.ms/DevTunnelCliInstall | bash\n```\n\nDirect download link:\n\n[Linux (x64) - https://aka.ms/TunnelsCliDownload/linux-x64](https://aka.ms/TunnelsCliDownload/linux-x64)\n\n---\n\n## Login\n\nTo start a dev tunnel, you first need to log in with either a Microsoft Entra ID, Microsoft, or GitHub account. Dev tunnels doesn't support hosting tunnels anonymously. For more information, see [CLI command reference](cli-commands.md) documentation.\n\n```bash\ndevtunnel user login\n```\n\n## Host\n\nOnce logged in you can start hosting a dev tunnel using the `host` command. In the example below dev tunnels will:\n\n- Run a local server on port `8080` that echoes requests sent to it.\n- Host a dev tunnel for the local port `8080` that is accessible to the internet.\n\n```bash\n# Start a http server on port 8080\ndevtunnel echo http -p 8080\n# Tunnel port 8080\ndevtunnel host -p 8080\n```\n\nA successful `host` command prints something similar to the following example to the console.\n\n```bash\nConnecting to host tunnel relay wss://usw2-data.rel.tunnels.api.visualstudio.com/api/v1/Host/Connect/<tunnel_id>\nHosting port 8080 at https://<tunnel_id>.usw2.devtunnels.ms:8080/, https://<tunnel_id>-8080.usw2.devtunnels.ms/ and inspect it at https:/<tunnel_id>-8080-inspect.usw2.devtunnels.ms/\nReady to accept connections for tunnel: <tunnel_id>\n```\n\nThe printed text contains:\n\n- `tunnel_id` - The ID of the dev tunnel.\n- Public URL - The URL, which can be used to access your dev tunnel, `https://<tunnel_id>.usw2.devtunnels.ms:8080/` in this example.\n- Inspect URL - The URL you can use to inspect the traffic sent across the dev tunnel in, `https:/<tunnel_id>-8080-inspect.usw2.devtunnels.ms/` in this example.\n\n## Connect\n\nTo connect to the dev tunnel, you need to:\n\n1. Visit this URL in a web browser.\n1. Login using the same account as you used to host the dev tunnel. By default, dev tunnels are only accessible to you.\n\nCongratulations! You can now access your local service across the internet.\n\n## Next Steps\n\n- [CLI command reference](cli-commands.md)\n"
  },
  {
    "path": "articles/dev-tunnels/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Dev tunnels documentation\nsummary: Dev tunnels allows developers to securely expose local web services to the Internet, control who has access, and easily & debug your web applications from anywhere.\nmetadata:\n  title: Dev tunnels documentation\n  description: Use Dev tunnels to securely expose local web services to the Internet, control who has access, and easily test and debug your web applications from anywhere.\n  ms.service: azure-dev-tunnels\n  ms.topic: landing-page\n  author: plequere-ms\n  ms.author: plequere\n  ms.date: 03/27/2025\n# linkListType: architecture | concept | deploy | download | get-started | how-to-guide | learn | overview | quickstart | reference | tutorial | whats-new\n\nlandingContent:\n# Cards and links should be based on top customer tasks or top subjects\n# Start card title with a verb\n\n  # Card\n  - title: About dev tunnels\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: What are dev tunnels?\n            url: overview.md\n          - text: How are dev tunnels secured?\n            url: security.md\n      - linkListType: video\n        links:\n          - text: Intro to dev tunnels with demos \n            url: https://www.youtube.com/watch?v=yBiOGgUFD68\n          - text: Advanced dev tunnels features with demos\n            url: https://youtu.be/yCYLurylgj8?si=nCH2E2xHo4qNYnCV\n\n  # Card\n  - title: 'Quickstart: Dev tunnels'\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Create and host a tunnel\n            url: get-started.md\n          - text: Configure and deploy group policies\n            url: policies.md\n\n  # Card\n  - title: Reference documentation\n    linkLists:\n      - linkListType: reference\n        links:\n          - text: Command line reference\n            url: cli-commands.md\n          - text: Frequently asked questions\n            url: faq.md\n          - text: Provide feedback\n            url: support.md\n  "
  },
  {
    "path": "articles/dev-tunnels/overview.md",
    "content": "---\ntitle: What are dev tunnels?\ntitleSuffix: Microsoft dev tunnels\ndescription: Learn about using dev tunnels\nauthor: plequere-ms\nms.author: plequere\nms.topic: overview\nms.service: azure-dev-tunnels\nms.date: 03/27/2025\n---\n\n# What are dev tunnels?\n\nDev tunnels allow developers to securely share local web services across the internet. Enabling you to connect your local development environment with cloud services, share work in progress with colleagues or aid in building webhooks. Dev tunnels is for adhoc testing and development, not for production workloads.\n\n> [!IMPORTANT]\n> This feature is currently in public preview.\n> This preview version is provided without a service-level agreement, and it's not recommended for production workloads. Certain features might not be supported or might have constrained capabilities.\n\n## Benefits\n\n- **Secure by default** - By default dev tunnels you create are only accessible to you using your Microsoft, Microsoft Entra ID, or GitHub account.\n- **Persistent URLs** - Keep the same dev tunnel url for as long as you need.\n- **Support for multiple simultaneous ports** - Host multiple ports on a single dev tunnel at the same time.\n- **Global service availability** - The dev tunnels service is available globally. Dev tunnels are automatically created in the closest available region.\n- **Tunnel inspection** - Inspect dev tunnel traffic in a familiar interface, browser DevTools.\n\n## Terminology\n\nBefore using the CLI, it's helpful to understand the following terms that are referenced throughout:\n\n- **Tunnel** - Provides secure remote access to one host through a relay service. A dev tunnel has a unique DNS name, multiple ports, access controls, and other associated metadata.\n\n- **Tunnel relay service** - Facilitates secure connections between a dev tunnel host and clients via a cloud service, even when the host may be behind a firewall and unable to accept incoming connections directly.\n\n- **Tunnel host** - Accepts client connections to a dev tunnel via the dev tunnel relay service, and forwards those connections to local ports.\n\n- **Tunnel port** - An IP port number (1-65535) that is allowed through a dev tunnel. A dev tunnel only allows connections on ports that have been added. One dev tunnel can support multiple ports, and different ports within a dev tunnel may use different protocols (HTTP, HTTPS, etc.) and may have different access controls.\n\n- **Tunnel connection** - A duplex stream of packets between a dev tunnel client and dev tunnel host, through a dev tunnel port. A dev tunnel connection is most often linked to TCP connections on either side, but UDP-based protocols may also be supported. One tunnel port can support multiple simultaneous connections.\n\n- **Tunnel client** - Initiates a remote connection through a dev tunnel to a host. (While the host may also have a \"client\" relationship with the dev tunnel service, the term is avoided in that context to reduce confusion.)\n\n## Next steps\n\n- [Get started with dev tunnels](get-started.md)\n"
  },
  {
    "path": "articles/dev-tunnels/policies.md",
    "content": "---\ntitle: Configure and deploy group policies\ntitleSuffix: Microsoft dev tunnels\ndescription: Learn how to configure and deploy group policies settings across your organization. \nauthor: plequere-ms\nms.author: plequere\nms.topic: quickstart\nms.service: azure-dev-tunnels\nms.date: 03/27/2025\nms.custom: sfi-image-nochange\n---\n\n# Configure and deploy Group Policy Administrative Templates for Dev Tunnels\n\nIT Administrators in organizations may want to control certain aspects of Dev Tunnels to achieve consistency or compliance across their organization. An easy way to accomplish this level of control is to configure and then deploy group policy settings to the client machines. The [Dev Tunnels in Visual Studio](https://aka.ms/devtunnels/vs), [port forwarding built into Visual Studio Code](https://code.visualstudio.com/docs/editor/port-forwarding), [the Visual Studio Code Remote - Tunnels extension](https://code.visualstudio.com/docs/remote/tunnels), and `devtunnel` CLI policies are consolidated in the [Administrator Template files (ADMX/ADML) for Dev Tunnels](https://aka.ms/devtunnels/policies/download).\n\nIn this quickstart, you'll learn how to configure and deploy Dev Tunnels group policy settings across your organization.\n\n## Prerequisites\n\n- Windows Server 2016, Windows Server 2019, Windows Server 2022, Windows 8.1, Windows 10, Windows 11\n- Active Directory\n- Access to Local Group Policy Editor\n\n>[!NOTE]\n>The policies are only applicable on Windows machines.\n\n## Policies Supported\n\n:::image type=\"content\" source=\"./media/policies/tunnel-policies.png\" alt-text=\"Screenshot that shows Dev Tunnel policies in the Local Group Policy Editor.\":::\n\n- **Disable anonymous tunnel access**: Disallow anonymous tunnel access. Enabling this policy enforces users to select either private or organization for tunnel access. This means users cannot connect to an existing tunnel with anonymous access control, host an existing tunnel with anonymous access control, or add anonymous access to existing or new tunnels.\n- **Disable Dev Tunnels**: Disallow users from using the Dev Tunnels service. All commands, with few exceptions, should be denied access when this policy is enabled. Exceptions: unset, echo, ping, and user.\n- **Allow only selected Microsoft Entra tenant IDs**: Users must authenticate within the given tenant list to access Dev Tunnels. When enabling this policy, multiple tenant IDs can be added by using a semicolon or comma to separate each. All commands, with few exceptions, should be denied access when this policy is enabled and the user's tenant ID isn't in the list of allowed tenant IDs. Exceptions: unset, echo, ping, and user. Follow the steps in [this article to find your Microsoft Entra tenant ID](/entra/fundamentals/how-to-find-tenant).\n\n## Configure policies with Local Group Policy Editor\n\n### Download the Administrator Template files\n\n1. Head over to the Microsoft Download Center and download the [Administrator Template files (ADMX/ADML) for Dev Tunnels](https://aka.ms/devtunnels/policies/download).\n1. Navigate to the `C:\\Windows\\PolicyDefinitions` folder and add the `TunnelsPolicies.admx` file.\n1. Navigate to the `C:\\Windows\\PolicyDefinitions\\en-US` folder and add the `TunnelsPolicies.adml` file.\n\n### Apply the policies using the Local Group Policy Editor\n\n1. Open Command Prompt and run `gpupdate /force` to ensure the policy files are configured.\n1. Open the Windows Local Group Policy Editor.\n1. Navigate to Computer Configuration > Administrative Templates > Dev Tunnels.\n1. Apply the desired policy changes.\n\n"
  },
  {
    "path": "articles/dev-tunnels/security.md",
    "content": "---\ntitle: Dev tunnels security\ntitleSuffix: Microsoft dev tunnels\ndescription: Learn about security when using dev tunnels\nauthor: plequere-ms\nms.author: plequere\nms.topic: concept-article\nms.service: azure-dev-tunnels\nms.date: 03/27/2025\n---\n# Security\n\nDev tunnels is a security-focused developer tunneling service. In this article, learn about how dev tunnels are secured.\n\n## Overview\n\nBy default, hosting and connecting to a tunnel requires authentication with the same Microsoft, Microsoft Entra ID, or GitHub account that created the tunnel. Tunneling requires outbound connections to be made to the service hosted in Azure. No inbound connections are required to use the service.\n\n## Domains\n\nAccess to dev tunnels can be controlled by allowing or denying outbound access to the following domains:\n\n- Authentication\n  - `github.com`\n  - `login.microsoftonline.com`\n\n- Dev Tunnels\n  - `global.rel.tunnels.api.visualstudio.com`\n  - `[clusterId].rel.tunnels.api.visualstudio.com`\n  - `[clusterId]-data.rel.tunnels.api.visualstudio.com`\n  - `*.[clusterId].devtunnels.ms`\n  - `*.devtunnels.ms`\n\nThe list of current `[clusterId]` values is available at https://global.rel.tunnels.api.visualstudio.com/api/v1/clusters.\n\n## Web-forwarding\n\nTunnel ports using the HTTP(S)/WS(S) protocols can be accessed directly via the provided web-forwarding url (for example: `https://tunnelid-3000.devtunnels.ms`).\n\n- Insecure client connections are always automatically upgraded to HTTPS/WSS.\n- HTTP Strict Transport Security (HSTS) is enabled with a one year max-age.\n- The minimum TLS version the service supports is 1.2, with TLS 1.3 being the preferred version.\n- TLS termination is done at service ingress using service certificates, issued by a Microsoft CA.\n  - After TLS termination, header rewriting takes place. This is required for many web application development scenarios.\n\n## Anti-phishing protection\n\nWhen connecting to a web-forwarding url for the first time, users are presented with an interstitial anti-phishing page. The page is skipped under the following circumstances:\n- The request uses a method other than `GET`\n- The request `Accept` header doesn't contain `text/html`\n- The request contains the `X-Tunnel-Skip-AntiPhishing-Page` header\n- The request contains the `X-Tunnel-Authorization` header\n- The user has already visited the page and clicked continue\n\n## Tunnel access\n\nBy default, tunnels and tunnel ports are private and only accessible to the user who created the tunnel.\n\nIf a tunnel or tunnel port does need to be accessed without authentication, an allow-anonymous Access control entry (ACE) can be added (use `--allow-anonymous`).\n\nTunnel access can also be extended to your current Microsoft Entra tenant (use `--tenant`) or specific GitHub organizations (use `--organization`); for the latter see [GitHub Organization Access](#github-organization-access) below.\n\nThe CLI can also be used to request access tokens that grant limited access to anyone holding the token (use `devtunnel token`). This is an advanced feature but can be useful in specific situations.\n\nCurrently, four types of tunnel access tokens are available:\n\n- A \"client access token\" allows the bearer to connect to any ports of the tunnel.\n- A \"host access token\" allows the bearer to host the tunnel and accept connections, but not make any other changes to it.\n- A \"manage ports access token\" allows the bearer to add and delete ports on a tunnel.\n- A \"management access token\" allows the bearer to perform any operations on that tunnel, including setting access controls, hosting, connecting, and deleting the tunnel.\n\nAll of the tokens are limited to the current tunnel; they don't grant access to any of the current user's _other_ tunnels, if any. The tokens expire after some time (currently 24 hours). Tokens can only be refreshed using an actual user identity that has manage-scope access to the tunnel (not just a management access token).\n\nMost CLI commands can accept a `--access-token` argument with an appropriate token as an alternative to logging in.\n\nWeb clients can pass a token in a header to authorize requests to a tunnel URI:\n\n```http\nX-Tunnel-Authorization: tunnel <TOKEN>\n```\n\n> [!TIP]\n> This is useful for non-interactive clients as it allows them to access tunnels without requiring anonymous access to be enabled. We use the `X-Tunnel-Authorization` header instead of the standard `Authorization` header to prevent potentially interfering with application-specific authorization.\n\nSee the [Manage dev tunnel access](cli-commands.md#advanced-manage-dev-tunnel-access) section to learn more about how to manage tunnel access through the CLI.\n\n### GitHub Organization Access\nTo support tunnels granting access to all members of a GitHub organization, install the [Dev Tunnels GitHub app](https://github.com/apps/dev-tunnels) in the organization. That gives the Dev Tunnels service permission to check users' membership status in that organization. (Dev Tunnels does not require repo permissions to the org.) You may need to be an admin in the GitHub organization to perform this operation.\n"
  },
  {
    "path": "articles/dev-tunnels/support.md",
    "content": "---\ntitle: Troubleshooting, feedback, and support\ntitleSuffix: Microsoft dev tunnels\ndescription: How to submit feedback and request support for dev tunnels.\nauthor: plequere-ms\nms.author: plequere\nms.topic: reference\nms.service: azure-dev-tunnels\nms.date: 03/27/2025\n---\n\n# Troubleshooting\n\nTo troubleshoot issues with the `devtunnel` CLI, the following tips may be useful:\n\n- Ensure you're on the latest version of the `devtunnel` CLI. Check the currently installed version with `devtunnel --version`.\n- The `--verbose` option prints debugging messages, which can provide extra diagnostic information.\n\n"
  },
  {
    "path": "articles/dev-tunnels/toc.yml",
    "content": "- name: Dev tunnels documentation\n  href: ./index.yml\n- name: Overview \n  items:\n  - name: What are dev tunnels?\n    href: overview.md\n- name: Quickstarts\n  items:\n  - name: Create and host a tunnel\n    href: get-started.md\n  - name: Configure and deploy group policies\n    href: policies.md\n- name: Concepts\n  items:\n  - name: Security\n    href: security.md\n- name: Reference\n  items:\n  - name: Command line\n    href: cli-commands.md\n  - name: Frequently asked questions\n    href: faq.md\n  - name: Provide feedback\n    href: support.md\n"
  },
  {
    "path": "articles/docfx.json",
    "content": "{\n  \"build\": {\n    \"content\": [\n      {\n        \"files\": [\n          \"**/*.md\",\n          \"**/*.yml\"\n        ],\n        \"exclude\": [\n          \"**/obj/**\",\n          \"**/includes/**\",\n          \"**/mermaidjs/**\",\n          \"**/_themes/**\",\n          \"**/docfx.json\",\n          \"README.md\",\n          \"LICENSE\",\n          \"LICENSE-CODE\",\n          \"ThirdPartyNotices.md\",\n          \"azure-docs/**\"\n        ],\n        \"src\": \".\",\n        \"dest\": \".\"\n      }\n    ],\n    \"resource\": [\n      {\n        \"files\": [\n          \"**/*.png\",\n          \"**/*.jpg\",\n          \"**/*.gif\",\n          \"**/*.svg\"],\n        \"exclude\": [\n          \"**/obj/**\",\n          \"_themes/**\",\n          \"_themes.pdf/**\",\n          \"**/docfx.json\",\n          \"_repo.en-us/**\"\n        ]\n      }\n    ],\n    \"overwrite\": [],\n    \"externalReference\": [],\n    \"globalMetadata\": {\n      \"breadcrumb_path\": \"/azure/developer/breadcrumb/toc.json\",\n      \"uhfHeaderId\": \"azure\",\n      \"feedback_system\": \"Standard\",\n      \"feedback_github_repo\": \"MicrosoftDocs/azure-dev-docs\",\n      \"recommendations\": true,\n      \"feedback_help_link_type\": \"get-help-at-qna\",\n      \"feedback_help_link_url\": \"https://learn.microsoft.com/answers/questions/\"      \n    },\n    \"fileMetadata\": {\n      \"breadcrumb_path\": {\n        \"github-copilot-azure/**/*.md\": \"/azure/developer/ai-developer-tools/breadcrumb/toc.json\",\n        \"github-copilot-azure/**/*.yml\": \"/azure/developer/ai-developer-tools/breadcrumb/toc.json\",\n        \"azure-mcp-server/**/*.md\": \"/azure/developer/ai-developer-tools/breadcrumb/toc.json\",\n        \"azure-mcp-server/**/*.yml\": \"/azure/developer/ai-developer-tools/breadcrumb/toc.json\",\n        \"azure-skills/**/*.md\": \"/azure/developer/ai-developer-tools/breadcrumb/toc.json\",\n        \"azure-skills/**/*.yml\": \"/azure/developer/ai-developer-tools/breadcrumb/toc.json\"\n      },\n      \"feedback_help_link_url\": {\n        \"github-copilot-azure/**/*.md\": \"https://github.com/microsoft/GitHub-Copilot-for-Azure\"\n      },\n      \"feedback_help_link_type\": {\n        \"cpp/**/*.md\": \"get-product-support\",\n        \"github-copilot-azure/**/*.md\": \"get-product-support\"\n      },\n      \"feedback_product_url\" : {\n        \"rust/**/*.md\": \"https://github.com/Azure/azure-sdk-for-rust/issues\",\n        \"python/**/*.md\": \"https://github.com/Azure/azure-sdk-for-python/issues\",\n        \"ansible/**/*.md\": \"https://feedback.azure.com/d365community/forum/79b1327d-d925-ec11-b6e6-000d3a4f06a4\",\n        \"cpp/**/*.md\": \"https://github.com/Azure/azure-sdk-for-cpp/issues\",\n        \"jenkins/**/*.md\": \"https://feedback.azure.com/d365community/forum/79b1327d-d925-ec11-b6e6-000d3a4f06a4\",\n        \"terraform/**/*.md\": \"https://feedback.azure.com/d365community/forum/79b1327d-d925-ec11-b6e6-000d3a4f06a4\",\n        \"javascript/**/*.md\": \"https://github.com/Azure/azure-sdk-for-js/issues\",\n        \"java/sdk/**/*.md\": \"https://github.com/Azure/azure-sdk-for-java/issues\",\n        \"python/tutorial-deploy-app-service-on-linux*.md\" : \"https://github.com/Microsoft/vscode-azureappservice/issues\",\n        \"python/tutorial-deploy-containers*.md\" : \"https://github.com/Microsoft/vscode-azureappservice/issues\",\n        \"python/tutorial-vs-code-serverless-python*.md\" : \"https://github.com/Microsoft/vscode-azurefunctions/issues\",\n        \"tutorial-vscode-azure-app-service-node*.md\" : \"https://github.com/Microsoft/vscode-azureappservice/issues\",\n        \"tutorial-vscode-azure-cli-node*.md\" : \"https://github.com/Azure/azure-cli/issues\",\n        \"tutorial-vscode-docker-node*.md\" : \"https://github.com/Microsoft/vscode-azureappservice/issues\",\n        \"tutorial-vscode-serverless-node*.md\" : \"https://github.com/Microsoft/vscode-azurefunctions/issues\",\n        \"tutorial-vscode-static-website-node*.md\": \"https://github.com/Microsoft/vscode-azurestorage/issues\",\n        \"github-copilot-azure/**/*.md\": \"https://github.com/microsoft/GitHub-Copilot-for-Azure/issues\",\n        \"typespec/**/*.md\": \"https://github.com/microsoft/typespec/\",\n        \"azure-mcp-server\": \"https://github.com/Microsoft/mcp\"\n      },\n      \"_op_documentIdPathDepotMapping\": {\n        \"python\": {\n          \"depot_name\": \"MSDN.python-sdk\",\n          \"folder_relative_path_in_docset\": \"docs-ref-conceptual\"\n        },\n        \"javascript\":{\n          \"depot_name\": \"MSDN.node-api\",\n          \"folder_relative_path_in_docset\": \"docs-ref-conceptual\"\n        }\n      },\n      \"author\": {\n        \"**/*.md\": \"Susan-Potter\",\n        \"**/*.yml\": \"Susan-Potter\",\n        \"ansible/**/*.md\": \"TomArcherMsft\",\n        \"ansible/**/*.yml\": \"TomArcherMsft\",\n        \"azure-developer-cli/**/*.md\": \"alexwolfmsft\",\n        \"azure-developer-cli/**/*.yml\": \"alexwolfmsft\",\n        \"cpp/**/*.md\": \"PatAltimore\",\n        \"cpp/**/*.yml\": \"PatAltimore\",\n        \"github/**/*.md\": \"N-Usha\",\n        \"github/**/*.yml\": \"N-Usha\",\n        \"go/**/*.md\": \"PatAltimore\",\n        \"go/**/*.yml\": \"PatAltimore\",\n        \"java/**/*.md\": \"karlerickson\",\n        \"java/**/*.yml\": \"karlerickson\",\n        \"javascript/**/*.md\": \"diberry\",\n        \"javascript/**/*.yml\": \"diberry\",\n        \"jenkins/**/*.md\": \"TomArcherMsft\",\n        \"jenkins/**/*.yml\": \"TomArcherMsft\",\n        \"github-copilot-app-modernization/**/*.md\": \"KarlErickson\",\n        \"github-copilot-app-modernization/**/*.yml\": \"KarlErickson\",\n        \"python/**/*.md\": \"PatAltimore\",\n        \"python/**/*.yml\": \"PatAltimore\",\n        \"terraform/**/*.md\": \"TomArcherMsft\",\n        \"terraform/**/*.yml\": \"TomArcherMsft\",\n        \"typespec/**/*.md\": \"diberry\",\n        \"typespec/**/*.yml\": \"diberry\",\n        \"rust/**/*.md\": \"diberry\",\n        \"rust/**/*.yml\": \"diberry\",\n        \"intro/**/*.md\": \"PatAltimore\",\n        \"intro/**/*.yml\": \"PatAltimore\",\n        \"ai/**/*.md\": \"bobtabor-msft\",\n        \"ai/**/*.yml\": \"bobtabor-msft\",\n        \"github-copilot-azure/**/*.md\": \"diberry\",\n        \"github-copilot-azure/**/*.yml\": \"diberry\",\n        \"javascript/ai/**/*.md\": \"bobtabor-msft\",\n        \"javascript/ai/**/*.yml\": \"bobtabor-msft\",\n        \"python/ai/**/*.md\": \"bobtabor-msft\",\n        \"python/ai/**/*.yml\": \"bobtabor-msft\",\n        \"azure-mcp-server/**/*.md\": \"diberry\",\n        \"azure-mcp-server/**/*.yml\": \"diberry\",\n        \"ai-developer-tools/**/*.md\": \"diberry\",\n        \"ai-developer-tools/**/*.yml\": \"diberry\"\n      },\n      \"manager\":{\n        \"**/*.md\": \"susanpotter\",\n        \"**/*.yml\": \"susanpotter\",\n        \"terraform/**/*.md\": \"jasongroce\",\n        \"terraform/**/*.yml\": \"jasongroce\"\n      },\n      \"ms.author\": {\n        \"**/*.md\": \"susanpotter\",\n        \"**/*.yml\": \"susanpotter\",\n        \"ansible/**/*.md\": \"tarcher\",\n        \"ansible/**/*.yml\": \"tarcher\",\n        \"azure-developer-cli/**/*.md\": \"alexwolf\",\n        \"azure-developer-cli/**/*.yml\": \"alexwolf\",\n        \"cpp/**/*.md\": \"patricka\",\n        \"cpp/**/*.yml\": \"patricka\",\n        \"github/**/*.md\": \"ushan\",\n        \"github/**/*.yml\": \"ushan\",\n        \"go/**/*.md\": \"patricka\",\n        \"go/**/*.yml\": \"patricka\",\n        \"java/**/*.md\": \"karler\",\n        \"java/**/*.yml\": \"karler\",\n        \"javascript/**/*.md\": \"diberry\",\n        \"javascript/**/*.yml\": \"diberry\",\n        \"jenkins/**/*.md\": \"tarcher\",\n        \"jenkins/**/*.yml\": \"tarcher\",\n        \"github-copilot-app-modernization/**/*.md\": \"karler\",\n        \"github-copilot-app-modernization/**/*.yml\": \"karler\",\n        \"python/**/*.md\": \"patricka\",\n        \"python/**/*.yml\": \"patricka\",\n        \"terraform/**/*.md\": \"tarcher\",\n        \"terraform/**/*.yml\": \"tarcher\",\n        \"typespec/**/*.md\": \"diberry\",\n        \"typespec/**/*.yml\": \"diberry\",\n        \"rust/**/*.md\": \"diberry\",\n        \"rust/**/*.yml\": \"diberry\",\n        \"intro/**/*.md\": \"patricka\",\n        \"intro/**/*.yml\": \"patricka\",\n        \"ai/**/*.md\": \"rotabor\",\n        \"ai/**/*.yml\": \"rotabor\",\n        \"github-copilot-azure/**/*.md\": \"diberry\",\n        \"github-copilot-azure/**/*.yml\": \"diberry\",\n        \"javascript/ai/**/*.md\": \"rotabor\",\n        \"javascript/ai/**/*.yml\": \"rotabor\",\n        \"python/ai/**/*.md\": \"rotabor\",\n        \"python/ai/**/*.yml\": \"rotabor\",\n        \"azure-mcp-server/**/*.md\": \"diberry\",\n        \"azure-mcp-server/**/*.yml\": \"diberry\",\n        \"ai-developer-tools/**/*.md\": \"diberry\",\n        \"ai-developer-tools/**/*.yml\": \"diberry\"\n      },\n      \"ms.devlang\":{\n        \"cpp/**/*.md\": \"cpp\",\n        \"cpp/**/*.yml\": \"cpp\",\n        \"java/**/*.md\": \"java\",\n        \"java/**/*.yml\": \"java\",\n        \"python/**/*.md\": \"python\",\n        \"python/**/*.yml\": \"python\",\n        \"go/**/*.md\": \"golang\",\n        \"go/**/*.yml\": \"golang\",\n        \"javascript/**/*.md\": \"nodejs\",\n        \"javascript/**/*.yml\": \"nodejs\",\n        \"rust/**/*.md\": \"rust\",\n        \"rust/**/*.yml\": \"rust\"\n      },\n      \"ms.service\": {\n        \"ai/**/*.md\": \"azure\",\n        \"ai/**/*.yml\": \"azure\",\n        \"ansible/**/*.md\": \"ansible\",\n        \"ansible/**/*.yml\": \"ansible\",\n        \"azure-developer-cli/**/*.md\": \"azure-dev-cli\",\n        \"azure-developer-cli/**/*.yml\": \"azure-dev-cli\",\n        \"azure-mcp-server/**/*.md\": \"azure-mcp-server\",\n        \"azure-mcp-server/**/*.yml\": \"azure-mcp-server\",\n        \"cpp/**/*.md\": \"azure-cpp\",\n        \"cpp/**/*.yml\": \"azure-cpp\",\n        \"dev-tunnels/**/*.md\": \"azure-dev-tunnels\",\n        \"dev-tunnels/**/*.yml\": \"azure-dev-tunnels\",\n        \"github-copilot-azure/**/*.md\": \"github-copilot-for-azure\",\n        \"github-copilot-azure/**/*.yml\": \"github-copilot-for-azure\",\n        \"go/**/*.md\": \"azure-go\",\n        \"go/**/*.yml\": \"azure-go\",\n        \"iac/**/*.yml\": \"azure\",\n        \"intro/**/*.md\": \"azure\",\n        \"intro/**/*.yml\": \"azure\",\n        \"java/**/*.md\": \"azure-java\",\n        \"java/**/*.yml\": \"azure-java\",\n        \"javascript/**/*.md\": \"azure-javascript\",\n        \"javascript/**/*.yml\": \"azure-javascript\",\n        \"jenkins/**/*.md\": \"jenkins\",\n        \"jenkins/**/*.yml\": \"jenkins\",\n        \"github-copilot-app-modernization/**/*.md\": \"azure\",\n        \"github-copilot-app-modernization/**/*.yml\": \"azure\",\n        \"python/**/*.md\": \"azure-python\",\n        \"python/**/*.yml\": \"azure-python\",\n        \"terraform/**/*.md\": \"terraform\",\n        \"terraform/**/*.yml\": \"terraform\",\n        \"typespec/**/*.md\": \"typespec\",\n        \"typespec/**/*.yml\": \"typespec\",\n        \"rust/**/*.md\": \"azure-rust\",\n        \"rust/**/*.yml\": \"azure-rust\",\n        \"ai-developer-tools/**/*.md\": \"azure-mcp-server\",\n        \"ai-developer-tools/**/*.yml\": \"azure-mcp-server\"\n      },\n      \"ms.subservice\": {\n        \"ai/**/*.md\": \"intelligent-apps\",\n        \"ai/**/*.yml\": \"intelligent-apps\",\n        \"iac/**/*.yml\": \"developer\",\n        \"intro/**/*.md\": \"developer\",\n        \"intro/**/*.yml\": \"developer\",\n        \"github-copilot-app-modernization/**/*.md\": \"migration-copilot\",\n        \"github-copilot-app-modernization/**/*.yml\": \"migration-copilot\",\n        \"javascript/ai/**/*.md\": \"intelligent-apps\",\n        \"java/ai/**/*.md\": \"intelligent-apps\",\n        \"java/ai/**/*.yml\": \"intelligent-apps\",\n        \"java/containers/**/*.md\": \"java-fundamentals\",\n        \"java/containers/**/*.yml\": \"java-fundamentals\",\n        \"java/ee/**/*.md\": \"java-fundamentals\",\n        \"java/ee/**/*.yml\": \"java-fundamentals\",\n        \"java/fundamentals/**/*.md\": \"java-fundamentals\",\n        \"java/fundamentals/**/*.yml\": \"java-fundamentals\",\n        \"java/get-started/**/*.md\": \"java-fundamentals\",\n        \"java/get-started/**/*.yml\": \"java-fundamentals\",\n        \"java/identity/**/*.md\": \"java-fundamentals\",\n        \"java/identity/**/*.yml\": \"java-fundamentals\",\n        \"java/learning-resources/**/*.md\": \"java-fundamentals\",\n        \"java/learning-resources/**/*.yml\": \"java-fundamentals\",\n        \"java/migration/**/*.md\": \"migration\",\n        \"java/migration/**/*.yml\": \"migration\",\n        \"java/quickstarts/**/*.md\": \"java-fundamentals\",\n        \"java/quickstarts/**/*.yml\": \"java-fundamentals\",\n        \"java/sdk/**/*.md\": \"java-sdk\",\n        \"java/sdk/**/*.yml\": \"java-sdk\",\n        \"java/spring/**/*.yml\": \"azure-spring\",\n        \"java/spring-framework/**/*.md\": \"azure-spring\",\n        \"java/spring-framework/**/*.yml\": \"azure-spring\",\n        \"java/toolkit-for-eclipse/**/*.md\": \"java-fundamentals\",\n        \"java/toolkit-for-eclipse/**/*.yml\": \"java-fundamentals\",\n        \"java/toolkit-for-intellij/**/*.md\": \"java-fundamentals\",\n        \"java/toolkit-for-intellij/**/*.yml\": \"java-fundamentals\"\n      },\n      \"titleSuffix\": {\n        \"ansible/**/*.yml\" : \"Ansible\",\n        \"cpp/**/*.md\": \"C++ on Azure\",\n        \"cpp/**/*.yml\": \"C++ on Azure\",\n        \"jenkins/**/*.yml\" : \"Jenkins\",\n        \"terraform/**/*.yml\" : \"Terraform\",\n        \"javascript/**/*.md\": \"JavaScript on Azure\",\n        \"javascript/**/*.yml\": \"JavaScript on Azure\",\n        \"python/**/*.md\": \"Python on Azure\",\n        \"python/**/*.yml\": \"Python on Azure\",\n        \"java/**/*.md\": \"Java on Azure\",\n        \"java/**/*.yml\": \"Java on Azure\",\n        \"go/**/*.md\": \"Go on Azure\",\n        \"go/**/*.yml\": \"Go on Azure\",\n        \"github-copilot-azure/**/*.md\": \"GitHub Copilot for Azure\",\n        \"github-copilot-azure/**/*.yml\": \"GitHub Copilot for Azure\",\n        \"typespec/**/*.md\": \"TypeSpec\",\n        \"typespec/**/*.md\": \"TypeSpec\",\n        \"rust/**/*.md\": \"Rust on Azure\",\n        \"rust/**/*.yml\": \"Rust on Azure\",\n        \"azure-mcp-server/**/*.md\": \"Azure MCP Server\",\n        \"azure-mcp-server/**/*.yml\": \"Azure MCP Server\",\n        \"ai-developer-tools/**/*.md\": \"AI Developer Tools\",\n        \"ai-developer-tools/**/*.yml\": \"AI Developer Tools\"\n      },\n      \"featureFlags\": {\n        \"javascript/**/*-feedback.yml\": [\n          \"enable_tutorial_feedback\"\n        ],\n        \"javascript/tutorial/**/*\": [\n          \"enable_tutorial_feedback\"\n        ]\n      },\n      \"ms.topic\": {\n        \"**/includes/**/*.md\": \"include\"\n      },\n      \"ms.collection\": {\n        \"**/ai/**/*.md\": \"ce-skilling-ai-copilot\",\n        \"**/ai/**/*.yml\": \"ce-skilling-ai-copilot\",\n        \"**/azure-mcp-server/**/*.md\": \"ce-skilling-ai-copilot\",\n        \"**/azure-mcp-server/**/*.yml\": \"ce-skilling-ai-copilot\",\n        \"**/github-copilot-azure/**/*.md\": \"ce-skilling-ai-copilot\",\n        \"**/github-copilot-azure/**/*.yml\": \"ce-skilling-ai-copilot\",\n        \"**/java/ai/**/*.md\": \"ce-skilling-ai-copilot\",\n        \"**/java/ai/**/*.yml\": \"ce-skilling-ai-copilot\",\n        \"**/javascript/ai/**/*.md\": \"ce-skilling-ai-copilot\",\n        \"**/javascript/ai/**/*.yml\": \"ce-skilling-ai-copilot\",\n        \"**/github-copilot-app-modernization/**/*.md\": \"ce-skilling-ai-copilot\",\n        \"**/github-copilot-app-modernization/**/*.yml\": \"ce-skilling-ai-copilot\",\n        \"**/ai-developer-tools/**/*.md\": \"ce-skilling-ai-copilot\",\n        \"**/ai-developer-tools/**/*.yml\": \"ce-skilling-ai-copilot\"\n      },\n      \"ms.update-cycle\": {\n        \"**/ai/**/*.md\": \"180-days\",\n        \"**/ai/**/*.yml\": \"180-days\",\n        \"**/azure-mcp-server/**/*.md\": \"180-days\",\n        \"**/azure-mcp-server/**/*.yml\": \"180-days\",\n        \"**/github-copilot-azure/**/*.md\": \"180-days\",\n        \"**/github-copilot-azure/**/*.yml\": \"180-days\",\n        \"**/java/ai/**/*.md\": \"180-days\",\n        \"**/java/ai/**/*.yml\": \"180-days\",\n        \"**/java/migration/**/*.md\": \"365-days\",\n        \"**/java/migration/**/*.yml\": \"365-days\",\n        \"**/java/ee/**/*.md\": \"365-days\",\n        \"**/java/ee/**/*.yml\": \"365-days\",\n        \"**/java/spring-framework/**/*.md\": \"365-days\",\n        \"**/java/spring-framework/**/*.yml\": \"365-days\",\n        \"**/javascript/ai/**/*.md\": \"180-days\",\n        \"**/javascript/ai/**/*.yml\": \"180-days\",\n        \"**/github-copilot-app-modernization/**/*.md\": \"180-days\",\n        \"**/github-copilot-app-modernization/**/*.yml\": \"180-days\",\n        \"**/ai-developer-tools/**/*.md\": \"180-days\",\n        \"**/ai-developer-tools/**/*.yml\": \"180-days\"\n      },\n      \"ROBOTS\": {\n        \"ux-beta/**/*.md\": \"NOINDEX\"\n      }    \n    },\n    \"template\": [],\n    \"dest\": \"azure-dev-docs\",\n    \"markdownEngineName\": \"markdig\",\n    \"rules\": {\n      \"sensitive-language-sl\": {\n        \"exclude\": [\n          \"java/migration/migrate-jboss-eap-to-azure-vm-manually.md\"\n        ]\n      },\n      \"sensitive-language-wl\": {\n        \"exclude\": [\n          \"terraform/provider-version-history-azurerm-2-0-0-to-2-99-0.md\"\n        ]\n      }\n    }\n  }\n}"
  },
  {
    "path": "articles/github/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: GitHub\n      tocHref: /azure\n      topicHref: /azure/developer/github/index\n"
  },
  {
    "path": "articles/github/build-vm-image.md",
    "content": "--- \ntitle: Build custom virtual machine images with GitHub Actions and Azure  \ndescription: Learn how to build custom virtual machine images with GitHub Actions and Azure\nauthor: ramiMSFT \nms.author: rabououn \nms.topic: quickstart\nms.service: azure-virtual-machines\nms.subservice: imaging\nms.date: 02/12/2025\nms.custom: github-actions-azure, devx-track-azurecli, mode-portal, devx-track-extended-java, linux-related-content\n---\n\n\n# Build custom virtual machine images with GitHub Actions and Azure\n\nGet started with the [GitHub Actions](https://docs.github.com/en/actions/learn-github-actions) by creating a workflow to build a virtual machine image.\n\n\nWith GitHub Actions, you can speed up your CI/CD process by creating custom virtual machine images with artifacts from your workflows. You can both build images and distribute them to a [Shared Image Gallery](/azure/virtual-machines/shared-image-galleries).\n\n You can then use these images to create [virtual machines](https://azure.microsoft.com/services/virtual-machines/) and [virtual machine scale sets](/azure/virtual-machine-scale-sets/overview).\n\nThe build virtual machine image action uses the [Azure Image Builder service](/azure/virtual-machines/image-builder-overview).\n\n## Prerequisites\n\n- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- A GitHub account with an active repository. If you don't have one, sign up for [free](https://github.com/join). \n    - This example uses the [Java Spring PetClinic Sample Application](https://github.com/spring-projects/spring-petclinic).\n- An Azure Compute Gallery with an image.\n    - [Create an Azure Compute Gallery](/azure/virtual-machines/create-gallery?tabs=cli).\n    - [Create an image](/azure/virtual-machines/image-version).\n\n\n## Workflow file overview\n\nA workflow is defined by a YAML (.yml) file in the `/.github/workflows/` path in your repository. This definition contains the various steps and parameters that make up the workflow.\n\nThe file has three sections:\n\n|Section  |Tasks  |\n|---------|---------|\n|**Authentication** | 1. Add a user-managed identity. <br /> 2. Set up a service principal or Open ID Connect.  <br /> 3. Create a GitHub secret. |\n|**Build** | 1. Set up the environment. <br /> 2. Build the app. |\n|**Image** | 1. Create a VM Image. <br /> 2. Create a virtual machine. |\n\n\n## Create a user-managed identity\n\nYou'll need a user-managed identity for Azure Image Builder(AIB) to distribute images. Your Azure user-assigned managed identity will be used during the image build to read and write images to a Shared Image Gallery. \n\n1. Create a user-managed identity with [Azure CLI](/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-cli) or the [Azure portal](/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-portal). Write down the name of your managed identity. \n\n1. Customize this JSON code. Replace the placeholders for `{subscriptionID}` and `{rgName}`with your subscription ID and resource group name.\n\n    ```yaml\n    {\n    \"properties\": {\n        \"roleName\": \"Image Creation Role\",\n        \"IsCustom\": true,\n        \"description\": \"Azure Image Builder access to create resources for the image build\",\n        \"assignableScopes\": [\n          \"/subscriptions/{subscriptionID}/resourceGroups/{rgName}\"\n        ],\n        \"permissions\": [\n            {\n                \"actions\": [\n                    \"Microsoft.Compute/galleries/read\",\n                    \"Microsoft.Compute/galleries/images/read\",\n                    \"Microsoft.Compute/galleries/images/versions/read\",\n                    \"Microsoft.Compute/galleries/images/versions/write\",\n                    \"Microsoft.Compute/images/write\",\n                    \"Microsoft.Compute/images/read\",\n                    \"Microsoft.Compute/images/delete\"\n                ],\n                \"notActions\": [],\n                \"dataActions\": [],\n                \"notDataActions\": []\n            }\n        ]\n        } \n    } \n    ```\n\n1. Use this JSON code to create a [new custom role](/azure/role-based-access-control/custom-roles-portal#start-from-scratch#start-from-json) with JSON.\n\n1. In Azure portal, open your Azure Compute Gallery and go to **Access control (IAM)**. \n\n1. Select **Add role assignment** and assign the Image Creation Role to your user-managed identity.\n\n## Generate deployment credentials\n\n[!INCLUDE [include](~/../articles/reusable-content/github-actions/generate-deployment-credentials.md)]\n\n## Create GitHub secrets\n\n[!INCLUDE [include](~/../articles/reusable-content/github-actions/create-secrets-with-openid.md)]\n\n\n## Use the Azure login action\n\nUse your GitHub secret with the [Azure Login action](https://github.com/Azure/login) to authenticate to Azure.\n\n# [OpenID Connect](#tab/openid)\n\nFor Open ID Connect you'll use a federated credential associated with your Active Directory app.\n\nFor more information about referencing GitHub secrets in a workflow file, see [Using encrypted secrets in a workflow](https://docs.github.com/en/actions/reference/encrypted-secrets#using-encrypted-secrets-in-a-workflow) in GitHub Docs.\n\n\n```yaml\non: [push]\n\nname: Create Custom VM Image\n\njobs:\n  build-image:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Log in with Azure\n        uses: azure/login@v2\n        with:\n          client-id: ${{ secrets.AZURE_CLIENT_ID }}\n          tenant-id: ${{ secrets.AZURE_TENANT_ID }}\n          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}\n```\n\n# [Service principal](#tab/userlevel)\n\nIn this workflow, you authenticate using the Azure login action with the service principal details stored in `secrets.AZURE_CREDENTIALS`. Then, you run an Azure CLI action. For more information about referencing GitHub secrets in a workflow file, see [Using encrypted secrets in a workflow](https://docs.github.com/en/actions/reference/encrypted-secrets#using-encrypted-secrets-in-a-workflow) in GitHub Docs.\n\n\n```yaml\non: [push]\n\nname: Create Custom VM Image\n\njobs:\n  build-image:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Log in with Azure\n        uses: azure/login@v2\n        with:\n          creds: '${{ secrets.AZURE_CREDENTIALS }}'\n```\n\n___\n\n## Configure Java\n\nSet up the Java environment with the [Java Setup SDK action](https://github.com/marketplace/actions/setup-java-jdk). For this example, you'll set up the environment, build with Maven, and then output an artifact.\n\n[GitHub artifacts](https://docs.github.com/en/actions/guides/storing-workflow-data-as-artifacts) are a way to share files in a workflow between jobs. You'll create an artifact to hold the JAR file and then add it to the virtual machine image.\n\n# [OpenID Connect](#tab/openid)\n\n```yaml\non: [push]\n\nname: Create Custom VM Image\n\njobs:\n  build-image:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        java: [ '17' ]\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v3    \n\n    - name: Login via Az module\n      uses: azure/login@v2\n      with:\n        creds: ${{secrets.AZURE_CREDENTIALS}}\n\n    - name: Set up JDK ${{matrix.java}}\n      uses: actions/setup-java@v2\n      with:\n        java-version: ${{matrix.java}}\n        distribution: 'adopt'\n        cache: maven\n    - name: Build with Maven Wrapper\n      run: ./mvnw -B package\n        \n    - name: Build Java\n      run: mvn --batch-mode --update-snapshots verify\n\n    - run: mkdir staging && cp target/*.jar staging\n    - uses: actions/upload-artifact@v2\n      with:\n        name: Package\n        path: staging\n```\n\n# [Service principal](#tab/userlevel)\n\n```yaml\non: [push]\n\nname: Create Custom VM Image\n\njobs:\n  build-image:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        java: [ '17' ]\n\n    steps:\n    - name: Checkout\n      uses: actions/checkout@v3    \n\n    - name: Login via Az module\n      uses: azure/login@v2\n      with:\n        creds: ${{secrets.AZURE_CREDENTIALS}}\n\n    - name: Set up JDK ${{matrix.java}}\n      uses: actions/setup-java@v2\n      with:\n        java-version: ${{matrix.java}}\n        distribution: 'adopt'\n        cache: maven\n    - name: Build with Maven Wrapper\n      run: ./mvnw -B package\n        \n    - name: Build Java\n      run: mvn --batch-mode --update-snapshots verify\n\n    - run: mkdir staging && cp target/*.jar staging\n    - uses: actions/upload-artifact@v2\n      with:\n        name: Package\n        path: staging\n```\n___\n\n## Build your image \n\nUse the [Build Azure Virtual Machine Image action](https://github.com/marketplace/actions/build-azure-virtual-machine-image) to create a custom virtual machine image.\n\nReplace the placeholders for `{subscriptionID}`, `{rgName}`and `{Identity}` with your subscription ID, resource group name, and managed identity name. Replace the values of `{galleryName}` and `{imageName}` with your image gallery name and your image name.\n\n> [!NOTE]\n> If the Create App Baked Image action fails with a permission error, verify that you have assigned the Image Creation Role to your user-managed identity.\n\n\n\n```yaml\n    - name: Create App Baked Image\n      id: imageBuilder\n      uses: azure/build-vm-image@v0\n      with:\n        location: 'eastus2'\n        resource-group-name: '{rgName}'\n        managed-identity: '{Identity}' # Managed identity\n        source-os-type: 'windows'\n        source-image-type: 'platformImage'\n        source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image\n        dist-type: 'SharedImageGallery'\n        dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image  gallery's image definition\n        dist-location: 'eastus2'\n```\n\n### Virtual Machine action arguments\n\n| Input  | Required  | Description  |\n|---|---|---|\n| `resource-group-name`  | Yes  | The resource group used for storage and saving artifacts during the build process.  |\n|  `image-builder-template-name` |  No |  The name of the image builder template resource used.  |\n|  `location` | Yes  | The location where Azure Image Builder will run. See [supported locations](/azure/virtual-machines/image-builder-overview#regions).  |\n| `build-timeout-in-minutes`  |  No | Time after which the build is canceled. Defaults to 240. |\n| `vm-size`  | Optional  | By default, `Standard_D1_v2` will be used.  See [virtual machine sizes](/azure/virtual-machines/sizes).|\n|  `managed-identity` |  Yes | The user-managed identity you created earlier. Use the full identifier if your identity is in a different resources group. Use the name if it is in the same resource group. |\n|  `source-os` | Yes  | The OS type of the base image (Linux or Windows) |\n|  `source-image-type` | Yes  | The base image type that will be used for creating the custom image.  |\n|  `source-image` | Yes  | The resource identifier for base image. A source image should be present in the same Azure region set in the input value of location. |\n|  `customizer-source` | No  | The directory where you can keep all the artifacts that need to be added to the base image for customization. By default, the value is `${{ GITHUB.WORKSPACE }}/workflow-artifacts.` |\n|  `customizer-destination` | No  | This is the directory in the customized image where artifacts are copied to. |\n|  `customizer-windows-update` | No  | For Windows only. Boolean value. If `true`, the image builder will run Windows update at the end of the customizations.|\n|  `dist-location` | No  | For SharedImageGallery, this is the `dist-type`.|\n|  `dist-image-tags` | No  | These are user-defined tags that are added to the custom image created (example: `version:beta`). |\n\n\n## Create your virtual machine\n\nAs a last step, create a virtual machine from your image. \n\n1. Replace the placeholders for `{rgName}`with your resource group name.\n\n1. Add a GitHub secret with the virtual machine password (`VM_PWD`). Be sure to write down the password because you will not be able to see it again. The username is `myuser`.\n\n```yaml\n    - name: CREATE VM\n      uses: azure/CLI@v1\n      with:\n        azcliversion: 2.0.72\n        inlineScript: |\n        az vm create --resource-group ghactions-vMimage  --name \"app-vm-${{ GITHUB.RUN_NUMBER }}\"  --admin-username myuser --admin-password \"${{ secrets.VM_PWD }}\" --location  eastus2 \\\n            --image \"${{ steps.imageBuilder.outputs.custom-image-uri }}\"              \n```\n\n### Complete YAML\n\n# [OpenID Connect](#tab/openid)\n\n```yaml\n  on: [push]\n\n  name: Create Custom VM Image\n\n  jobs:\n    build-image:\n      runs-on: ubuntu-latest    \n      steps:\n      - name: Checkout\n        uses: actions/checkout@v2    \n\n      - name: Login via Az module\n        uses: azure/login@v2\n        with:\n          client-id: ${{ secrets.AZURE_CLIENT_ID }}\n          tenant-id: ${{ secrets.AZURE_TENANT_ID }}\n          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}\n\n      - name: Setup Java 1.8.x\n        uses: actions/setup-java@v1\n        with:\n          java-version: '1.8.x'\n          \n      - name: Build Java\n        run: mvn --batch-mode --update-snapshots verify\n\n      - run: mkdir staging && cp target/*.jar staging\n      - uses: actions/upload-artifact@v2\n        with:\n          name: Package\n          path: staging\n\n      - name: Create App Baked Image\n        id: imageBuilder\n        uses: azure/build-vm-image@v0\n        with:\n          location: 'eastus2'\n          resource-group-name: '{rgName}'\n          managed-identity: '{Identity}' # Managed identity\n          source-os-type: 'windows'\n          source-image-type: 'platformImage'\n          source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image\n          dist-type: 'SharedImageGallery'\n          dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image  gallery's image definition\n          dist-location: 'eastus2'\n\n      - name: CREATE VM\n        uses: azure/CLI@v1\n        with:\n          azcliversion: 2.0.72\n          inlineScript: |\n          az vm create --resource-group ghactions-vMimage  --name \"app-vm-${{ GITHUB.RUN_NUMBER }}\"  --admin-username myuser --admin-password \"${{ secrets.VM_PWD }}\" --location  eastus2 \\\n              --image \"${{ steps.imageBuilder.outputs.custom-image-uri }}\"              \n```\n\n# [Service principal](#tab/userlevel)\n\n```yaml\n  on: [push]\n\n  name: Create Custom VM Image\n\n  jobs:\n    build-image:\n      runs-on: ubuntu-latest    \n      steps:\n      - name: Checkout\n        uses: actions/checkout@v2    \n\n      - name: Login via Az module\n        uses: azure/login@v2\n        with:\n          creds: ${{secrets.AZURE_CREDENTIALS}}\n\n      - name: Setup Java 1.8.x\n        uses: actions/setup-java@v1\n        with:\n          java-version: '1.8.x'\n          \n      - name: Build Java\n        run: mvn --batch-mode --update-snapshots verify\n\n      - run: mkdir staging && cp target/*.jar staging\n      - uses: actions/upload-artifact@v2\n        with:\n          name: Package\n          path: staging\n\n      - name: Create App Baked Image\n        id: imageBuilder\n        uses: azure/build-vm-image@v0\n        with:\n          location: 'eastus2'\n          resource-group-name: '{rgName}'\n          managed-identity: '{Identity}' # Managed identity\n          source-os-type: 'windows'\n          source-image-type: 'platformImage'\n          source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image\n          dist-type: 'SharedImageGallery'\n          dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image  gallery's image definition\n          dist-location: 'eastus2'\n\n      - name: CREATE VM\n        uses: azure/CLI@v1\n        with:\n          azcliversion: 2.0.72\n          inlineScript: |\n          az vm create --resource-group ghactions-vMimage  --name \"app-vm-${{ GITHUB.RUN_NUMBER }}\"  --admin-username myuser --admin-password \"${{ secrets.VM_PWD }}\" --location  eastus2 \\\n              --image \"${{ steps.imageBuilder.outputs.custom-image-uri }}\"              \n```\n\n---\n\n\n## Next steps\n- Learn how to [deploy to Azure](deploy-to-azure.md).\n"
  },
  {
    "path": "articles/github/connect-from-azure-identity.md",
    "content": "--- \ntitle:  Authenticate to Azure from GitHub by a managed identity\ndescription: Securely authenticate to Azure services from GitHub Actions workflows using Azure Login action with a managed identity configured on a virtual machine.\nauthor: wangzelin007\nms.author: zelinwang\nms.topic: reference\nms.service: azure \nms.date: 07/01/2024\nms.custom: github-actions-azure, devx-track-azurecli, devx-track-azurepowershell, linux-related-content\n---\n\n# Use the Azure Login action with a managed identity\n\nOn a virtual machine configured with [managed identities](/entra/identity/managed-identities-azure-resources/overview) in Azure, you can sign in [Azure Login action](https://github.com/marketplace/actions/azure-login) using the managed identity. You don't need to manage credentials, as they aren't accessible to you. There are two types of managed identities for you to choose: [**system-assigned managed identities**](/entra/identity/managed-identities-azure-resources/how-to-configure-managed-identities#system-assigned-managed-identity) or [**user-assigned managed identities**](/entra/identity/managed-identities-azure-resources/how-to-configure-managed-identities#user-assigned-managed-identity).\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create GitHub secrets for system/user-assigned managed identity\n> * Set up Azure Login for system/user-assigned managed identity in GitHub Actions workflows\n\n> [!NOTE]\n>\n> Login with managed identity is only supported for self-hosted runners on Azure virtual machines. For other users, please refer to [Sign in with OpenID Connect](connect-from-azure-openid-connect.md) or [Sign in with a service principal and secret](connect-from-azure-secret.md). \n\n## Prerequisites\n\n- Create an Azure virtual machine\n  - [Create a Windows virtual machine](/azure/virtual-machines/windows/quick-create-portal)\n  - [Create a Linux virtual machine](/azure/virtual-machines/linux/quick-create-portal?tabs=ubuntu)\n- [Configure managed identity on the Azure virtual machine](/entra/identity/managed-identities-azure-resources/qs-configure-portal-windows-vm)\n- Install required software on the Azure virtual machine\n  - [Install Azure CLI](/cli/azure/install-azure-cli)\n  - [install Docker](https://docs.docker.com/engine/install/)\n  - [Install PowerShell](/powershell/scripting/install/installing-powershell)\n  - [Install Azure PowerShell](/powershell/azure/install-azure-powershell)\n- [Configure the Azure virtual machine as a GitHub self-hosted runner](https://docs.github.com/actions/hosting-your-own-runners/managing-self-hosted-runners/adding-self-hosted-runners)\n\n\n## Use the Azure Login action with system-assigned managed identity\n\nLearn how to securely authenticate to Azure services from GitHub Actions workflows using [Azure Login action](https://github.com/marketplace/actions/azure-login) with [system-assigned managed identity](/entra/identity/managed-identities-azure-resources/how-to-configure-managed-identities#system-assigned-managed-identity) that configured on a virtual machine. \n\n### Create GitHub secrets for system-assigned managed identity\n\n1. Open your GitHub repository and go to **Settings**.\n    :::image type=\"content\" source=\"media/github-repo-settings.png\" alt-text=\"Select settings tab in GitHub repository.\":::\n\n1. Select **Security > Secrets and variables > Actions > New repository secret**.\n    :::image type=\"content\" source=\"media/github-repo-secrets.png\" alt-text=\"Select Security > Secrets and variables > Actions.\":::\n\n    > [!NOTE]\n    > To enhance workflow security in public repositories, use [environment secrets](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) instead of repository secrets. If the environment requires approval, a job cannot access environment secrets until one of the required reviewers approves it.\n\n1. Create secrets for `AZURE_TENANT_ID`, and `AZURE_SUBSCRIPTION_ID`. Copy these values from your user-assigned managed identity for your GitHub secrets:\n\n    |GitHub secret  |System-assigned managed identity  |\n    |---------|---------|\n    |AZURE_SUBSCRIPTION_ID     |    Subscription ID     |\n    |AZURE_TENANT_ID    |    Directory (tenant) ID  |\n\n    > [!NOTE]\n    > For security reasons, we recommend using GitHub Secrets rather than passing values directly to the workflow.\n\n### Set up Azure Login action with system-assigned managed identity in GitHub Actions workflows\n\nIn this example, you use the system-assigned managed identity to authenticate with Azure with the [Azure login](https://github.com/marketplace/actions/azure-login) action. The example uses GitHub secrets for the `subscription-id`, and `tenant-id` values. The self-hosted runner has been labeled `self-hosted` on GitHub.\n\n\n```yaml\nname: Run Azure Login with system-assigned managed identity\non: [push]\n\njobs:\n  test:\n    runs-on: [self-hosted] # Specify the label of your self-hosted runner here\n    steps:\n    - name: Azure login\n      uses: azure/login@v2\n      with:\n        auth-type: IDENTITY\n        tenant-id: ${{ secrets.AZURE_TENANT_ID }}\n        subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}\n        enable-AzPSSession: true\n\n    # Azure CLI action only supports linux self-hosted runners for now.\n    # If you want to execute the Azure CLI script on a windows self-hosted runner, you can execute it directly in `run`.\n    - name: Azure CLI script\n      uses: azure/cli@v2\n      with:\n        azcliversion: latest\n        inlineScript: |\n          az account show\n          # You can write your Azure CLI inline scripts here.\n\n    - name: Azure PowerShell script\n      uses: azure/powershell@v2\n      with:\n        azPSVersion: latest\n        inlineScript: |\n          Get-AzContext\n          # You can write your Azure PowerShell inline scripts here.\n```\n\n## Use the Azure Login action with user-assigned managed identity\n\nLearn how to securely authenticate to Azure services from GitHub Actions workflows using [Azure Login action](https://github.com/marketplace/actions/azure-login) with [user-assigned managed identity](/entra/identity/managed-identities-azure-resources/how-to-configure-managed-identities#user-assigned-managed-identity) that configured on a virtual machine. \n\n### Create GitHub secrets for user-assigned managed identity\n\n1. Open your GitHub repository and go to **Settings**.\n    :::image type=\"content\" source=\"media/github-repo-settings.png\" alt-text=\"Select settings tab in GitHub repository.\":::\n\n\n1. Select **Security > Secrets and variables > Actions > New repository secret**.\n    :::image type=\"content\" source=\"media/github-repo-secrets.png\" alt-text=\"Select Security > Secrets and variables > Actions.\":::\n\n    > [!NOTE]\n    > To enhance workflow security in public repositories, use [environment secrets](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) instead of repository secrets. If the environment requires approval, a job cannot access environment secrets until one of the required reviewers approves it.\n\n1. Create secrets for `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_SUBSCRIPTION_ID`. Copy these values from your user-assigned managed identity for your GitHub secrets:\n\n    |GitHub secret  |User-assigned managed identity  |\n    |---------|---------|\n    |AZURE_CLIENT_ID     |    Client ID     |\n    |AZURE_SUBSCRIPTION_ID     |    Subscription ID     |\n    |AZURE_TENANT_ID    |    Directory (tenant) ID   |\n\n    > [!NOTE]\n    > For security reasons, we recommend using GitHub Secrets rather than passing values directly to the workflow.\n\n### Set up Azure Login action with user-assigned managed identity in GitHub Actions workflows\n\nIn this example, you use the user-assigned managed identity to authenticate with Azure with the [Azure login](https://github.com/marketplace/actions/azure-login) action. The example uses GitHub secrets for the `client-id`, `subscription-id`, and `tenant-id` values. The self-hosted runner has been labeled `self-hosted` on GitHub.\n\n```yaml\nname: Run Azure Login with user-assigned managed identity\non: [push]\n\njobs:\n  test:\n    runs-on: [self-hosted] # Specify the label of your self-hosted runner here\n    steps:\n    - name: Azure login\n      uses: azure/login@v2\n      with:\n        auth-type: IDENTITY\n        client-id: ${{ secrets.AZURE_CLIENT_ID }}\n        tenant-id: ${{ secrets.AZURE_TENANT_ID }}\n        subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}\n        enable-AzPSSession: true\n\n    # Azure CLI action only supports linux self-hosted runners for now.\n    # If you want to execute the Azure CLI script on a windows self-hosted runner, you can execute it directly in `run`.\n    - name: Azure CLI script\n      uses: azure/cli@v2\n      with:\n        azcliversion: latest\n        inlineScript: |\n          az account show \n          # You can write your Azure CLI inline scripts here.\n\n    - name: Azure PowerShell script\n      uses: azure/powershell@v2\n      with:\n        azPSVersion: latest\n        inlineScript: |\n          Get-AzContext\n          # You can write your Azure PowerShell inline scripts here.\n```"
  },
  {
    "path": "articles/github/connect-from-azure-openid-connect.md",
    "content": "--- \ntitle: Authenticate to Azure from GitHub Actions by OpenID Connect\ndescription: Securely authenticate to Azure services from GitHub Actions workflows using Azure Login action with OpenID Connect (OIDC).\nauthor: wangzelin007\nms.author: zelinwang\nms.topic: reference\nms.service: azure \nms.date: 07/01/2024\nms.custom: github-actions-azure, devx-track-azurecli, devx-track-azurepowershell, linux-related-content\n---\n\n# Use the Azure Login action with OpenID Connect\n\nLearn how to securely authenticate to Azure services from GitHub Actions workflows using [Azure Login action](https://github.com/marketplace/actions/azure-login) with [OpenID Connect (OIDC)](https://www.microsoft.com/security/business/security-101/what-is-openid-connect-oidc). \n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create GitHub secrets for the credentials of a Microsoft Entra application/user-assigned managed identity\n> * Set up Azure Login with OpenID Connect authentication in GitHub Actions workflows\n\n## Prerequisites\n\nTo use [Azure Login action](https://github.com/marketplace/actions/azure-login) with OIDC, you need to configure a federated identity credential on a Microsoft Entra application or a user-assigned managed identity.\n\n**Option 1: Microsoft Entra application**\n\n* Create a Microsoft Entra application with a service principal by [Azure portal](/entra/identity-platform/howto-create-service-principal-portal#register-an-application-with-microsoft-entra-id-and-create-a-service-principal), [Azure CLI](/cli/azure/azure-cli-sp-tutorial-1#create-a-service-principal), or [Azure PowerShell](/powershell/azure/create-azure-service-principal-azureps#create-a-service-principal).\n*  Copy the values for **Client ID**, **Subscription ID**, and **Directory (tenant) ID** to use later in your GitHub Actions workflow.\n* Assign an appropriate role to your service principal by [Azure portal](/entra/identity-platform/howto-create-service-principal-portal#assign-a-role-to-the-application), [Azure CLI](/cli/azure/azure-cli-sp-tutorial-5#create-or-remove-a-role-assignment), or [Azure PowerShell](/powershell/azure/create-azure-service-principal-azureps#manage-service-principal-roles).\n* [Configure a federated identity credential on a Microsoft Entra application](/entra/workload-id/workload-identity-federation-create-trust) to trust tokens issued by GitHub Actions to your GitHub repository. \n\n**Option 2: User-assigned managed identity**\n\n* [Create a user-assigned managed identity](/entra/identity/managed-identities-azure-resources/how-manage-user-assigned-managed-identities#create-a-user-assigned-managed-identity).\n*  Copy the values for **Client ID**, **Subscription ID**, and **Directory (tenant) ID** to use later in your GitHub Actions workflow.\n* [Assign an appropriate role to your user-assigned managed identity](/entra/identity/managed-identities-azure-resources/how-manage-user-assigned-managed-identities#manage-access-to-user-assigned-managed-identities).\n* [Configure a federated identity credential on a user-assigned managed identity](/entra/workload-id/workload-identity-federation-create-trust-user-assigned-managed-identity) to trust tokens issued by GitHub Actions to your GitHub repository. \n\n## Create GitHub secrets\n\n1. Open your GitHub repository and go to **Settings**.\n    :::image type=\"content\" source=\"media/github-repo-settings.png\" alt-text=\"Select settings tab in GitHub repository.\":::\n\n1. Select **Security > Secrets and variables > Actions > New repository secret**.\n    :::image type=\"content\" source=\"media/github-repo-secrets.png\" alt-text=\"Select Security > Secrets and variables > Actions.\":::\n\n    > [!NOTE]\n    > To enhance workflow security in public repositories, use [environment secrets](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) instead of repository secrets. If the environment requires approval, a job cannot access environment secrets until one of the required reviewers approves it.\n\n1. Create secrets for `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_SUBSCRIPTION_ID`. Copy these values from your Microsoft Entra application or user-assigned managed identity for your GitHub secrets:\n\n    |GitHub secret  |Microsoft Entra application or user-assigned managed identity  |\n    |---------|---------|\n    |AZURE_CLIENT_ID    |    Client ID    |\n    |AZURE_SUBSCRIPTION_ID     |    Subscription ID     |\n    |AZURE_TENANT_ID    |    Directory (tenant) ID  |\n\n    > [!NOTE]\n    > For security reasons, we recommend using GitHub Secrets rather than passing values directly to the workflow.\n\n## Set up Azure Login action with OpenID Connect in GitHub Actions workflows\n\nYour GitHub Actions workflow uses OpenID Connect to authenticate with Azure. Once you have a working Azure Login step, you can use the [Azure PowerShell action](https://github.com/Azure/PowerShell) or [Azure CLI action](https://github.com/Azure/CLI). You can also use other Azure actions, like [Azure webapp deploy](https://github.com/Azure/webapps-deploy) and [Azure functions](https://github.com/Azure/functions-action).\n\nTo learn more about this interaction, see the [GitHub Actions documentation](https://docs.github.com/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-azure).\n\nIn this example, you use OpenID Connect to authenticate with Azure with the [Azure login](https://github.com/marketplace/actions/azure-login) action. The example uses GitHub secrets stored before for the `client-id`, `tenant-id`, and `subscription-id` values. \n\nThe Azure Login action includes an optional `audience` input parameter that defaults to `api://AzureADTokenExchange`, available for public clouds. For non-public clouds, update this parameter with the appropriate values. You can also customize this parameter for specific audience values.\n\n### The workflow sample to only run Azure CLI\n\nThis workflow authenticates with OpenID Connect and uses Azure CLI to get the details of the connected subscription.\n\n```yaml\nname: Run Azure CLI Login with OpenID Connect\non: [push]\n     \njobs: \n  test:\n    permissions:\n      id-token: write # Require write permission to Fetch an OIDC token.\n\n    runs-on: ubuntu-latest\n    steps:\n    - name: Azure CLI Login\n      uses: azure/login@v2\n      with:\n        client-id: ${{ secrets.AZURE_CLIENT_ID }}\n        tenant-id: ${{ secrets.AZURE_TENANT_ID }}\n        subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}\n  \n    - name: Azure CLI script\n      uses: azure/cli@v2\n      with:\n        azcliversion: latest\n        inlineScript: |\n          az account show\n          # You can write your Azure CLI inline scripts here.\n```\n\n### The workflow sample to run both Azure CLI and Azure PowerShell\n\nThis workflow authenticates with OpenID Connect and uses both Azure CLI and Azure PowerShell to get the details of the connected subscription.\n\n```yaml\nname: Run Azure Login with OpenID Connect\non: [push]\n      \njobs: \n  test:\n    permissions:\n      id-token: write # Require write permission to Fetch an OIDC token.\n\n    runs-on: ubuntu-latest\n    steps:\n    - name: Azure Login\n      uses: azure/login@v2\n      with:\n        client-id: ${{ secrets.AZURE_CLIENT_ID }}\n        tenant-id: ${{ secrets.AZURE_TENANT_ID }}\n        subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} \n        enable-AzPSSession: true\n    \n    - name: Azure CLI script\n      uses: azure/cli@v2\n      with:\n        azcliversion: latest\n        inlineScript: |\n          az account show\n          # You can write your Azure CLI inline scripts here.\n\n    - name: Azure PowerShell script\n      uses: azure/powershell@v2\n      with:\n        azPSVersion: latest\n        inlineScript: |\n          Get-AzContext  \n          # You can write your Azure PowerShell inline scripts here.\n```\n\n\n### Connect to Azure Government clouds and Azure Stack Hub clouds\n\nTo log in to one of the Azure Government clouds or Azure Stack, set the parameter `environment` to one of the following supported values: `AzureUSGovernment`, `AzureChinaCloud`, `AzureGermanCloud`, or `AzureStack`. If this parameter isn't specified, it takes the default value `AzureCloud` and connects to the Azure Public Cloud.\n\n```yaml  \njobs: \n  test:\n    permissions:\n      id-token: write # Require write permission to Fetch an OIDC token.\n    runs-on: ubuntu-latest\n    steps:\n    - name: Login to Azure US Gov Cloud with both Azure CLI and Azure Powershell\n      uses: azure/login@v2\n        with:\n          client-id: ${{ secrets.AZURE_CLIENT_ID }}\n          tenant-id: ${{ secrets.AZURE_TENANT_ID }}\n          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}\n          environment: 'AzureUSGovernment'\n          audience: api://AzureADTokenExchangeUSGov\n          enable-AzPSSession: true\n```\n"
  },
  {
    "path": "articles/github/connect-from-azure-secret.md",
    "content": "--- \ntitle: Authenticate to Azure from GitHub Actions by a secret\ndescription: Securely authenticate to Azure services from GitHub Actions workflows using Azure Login action with a client secret.\nauthor: wangzelin007\nms.author: zelinwang\nms.topic: reference\nms.service: azure \nms.date: 07/01/2024\nms.custom: github-actions-azure, devx-track-azurecli, devx-track-azurepowershell, linux-related-content\n---\n\n# Use the Azure Login action with a client secret\n\nLearn how to create a service principal with a client secret and securely authenticate to Azure services from GitHub Actions workflows using [Azure Login action](https://github.com/marketplace/actions/azure-login). \n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create a GitHub secret for the service principal\n> * Set up Azure Login for service principal secret in GitHub Actions workflows\n\n> [!WARNING]\n> Treat your client secrets with care to prevent leaks. Unauthorized disclosure can compromise security. Store secrets securely and share only with authorized ones.\n\n## Prerequisites \n\n- Create a Microsoft Entra application with a service principal by [Azure portal](/entra/identity-platform/howto-create-service-principal-portal#register-an-application-with-microsoft-entra-id-and-create-a-service-principal), [Azure CLI](/cli/azure/azure-cli-sp-tutorial-1#create-a-service-principal), or [Azure PowerShell](/powershell/azure/create-azure-service-principal-azureps#create-a-service-principal).\n- Create a client secret for your service principal by [Azure portal](/entra/identity-platform/howto-create-service-principal-portal#option-3-create-a-new-client-secret), [Azure CLI](/cli/azure/azure-cli-sp-tutorial-2?branch=main#create-a-service-principal-containing-a-password), or [Azure PowerShell](/powershell/azure/create-azure-service-principal-azureps?#password-based-authentication).\n- Copy the values for **Client ID**, **Client Secret**, **Subscription ID**, and **Directory (tenant) ID** to use later in your GitHub Actions workflow.\n- Assign an appropriate role to your service principal by [Azure portal](/entra/identity-platform/howto-create-service-principal-portal#assign-a-role-to-the-application), [Azure CLI](/cli/azure/azure-cli-sp-tutorial-5#create-or-remove-a-role-assignment), or [Azure PowerShell](/powershell/azure/create-azure-service-principal-azureps#manage-service-principal-roles).\n\n## Create a GitHub secret for the service principal\n\n1. Open your GitHub repository and go to **Settings**.\n    :::image type=\"content\" source=\"media/github-repo-settings.png\" alt-text=\"Select settings tab in GitHub repository.\":::\n\n1. Select **Security > Secrets and variables > Actions > New repository secret**.\n    :::image type=\"content\" source=\"media/github-repo-secrets.png\" alt-text=\"Select Security > Secrets and variables > Actions.\":::\n\n    > [!NOTE]\n    > To enhance workflow security in public repositories, use [environment secrets](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#environment-secrets) instead of repository secrets. If the environment requires approval, a job cannot access environment secrets until one of the required reviewers approves it.\n\n1. Create a GitHub Actions secret `AZURE_CREDENTIALS` in the following format. Copy these values from your service principal.\n\n    ```json\n      {\n          \"clientId\": \"<Client ID>\",\n          \"clientSecret\": \"<Client Secret>\",\n          \"subscriptionId\": \"<Subscription ID>\",\n          \"tenantId\": \"<Tenant ID>\"\n      }\n    ```\n\n    |GitHub secret  |Service principal  |\n    |---------|---------|\n    |clientId |    Client ID    |\n    |clientSecret    |    Client Secret   |\n    |subscriptionId    |    Subscription ID     |\n    |tenantId   |    Directory (tenant) ID  |\n\n## Set up Azure Login action with the Service Principal secret in GitHub Actions workflows\n\nTo authenticate to Azure in GitHub Actions workflows using the service principal secret, you need to use the [Azure Login action](https://github.com/Azure/login).\n\n### Use the Azure Login action with both Azure CLI action and Azure PowerShell action\n\nIn this workflow, you authenticate using the Azure Login action with the service principal details stored in `secrets.AZURE_CREDENTIALS`. For more information about referencing GitHub secrets in a workflow file, see [Using secrets in a workflow](https://docs.github.com/actions/security-guides/using-secrets-in-github-actions#using-secrets-in-a-workflow) in GitHub Docs.\n\n```yaml\nname: Run Azure Login with the Service Principal secret\non: [push]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Azure Login action\n      uses: azure/login@v2\n      with:\n        creds: ${{ secrets.AZURE_CREDENTIALS }}\n        enable-AzPSSession: true\n    \n    - name: Azure CLI script\n      uses: azure/cli@v2\n      with:\n        azcliversion: latest\n        inlineScript: |\n          az group show --name \"<YOUR RESOURCE GROUP>\"\n          # You can write your Azure CLI inline scripts here.\n\n    - name: Azure PowerShell action\n      uses: azure/powershell@v2\n      with:\n        azPSVersion: latest\n        inlineScript: |\n          Get-AzResourceGroup -Name \"<YOUR RESOURCE GROUP>\"\n          # You can write your Azure PowerShell inline scripts here.\n```"
  },
  {
    "path": "articles/github/connect-from-azure.md",
    "content": "--- \ntitle: Authenticate to Azure from GitHub Actions workflows\ndescription: Securely authenticate to Azure services from GitHub Actions workflows using Azure Login action and manage your Azure resources.\nauthor: wangzelin007\nms.author: zelinwang\nms.topic: reference\nms.service: azure \nms.date: 07/01/2024\nms.custom:\n  - github-actions-azure\n  - devx-track-azurecli\n  - devx-track-azurepowershell\n  - linux-related-content\n  - sfi-image-nochange\n---\n\n# Use GitHub Actions to connect to Azure\n\nLearn how to use [Azure Login action](https://github.com/Azure/login) with either [Azure PowerShell action](https://github.com/Azure/PowerShell) or [Azure CLI action](https://github.com/Azure/CLI) to interact with your Azure resources.\n\nTo use Azure PowerShell or Azure CLI in a GitHub Actions workflow, you need to first log in with the [Azure Login action](https://github.com/marketplace/actions/azure-login) action.\n\nThe Azure Login action supports different ways of authenticating with Azure:\n\n* [Sign in with OpenID Connect using a Microsoft Entra application or a user-assigned managed identity](connect-from-azure-openid-connect.md) \n* [Sign in with a managed identity configured on an Azure virtual machine](connect-from-azure-identity.md) (Only available for self-hosted GitHub runners)\n* [Sign in with a service principal and secret](connect-from-azure-secret.md) (Not recommended)\n\nBy default, the Azure Login action logs in with the Azure CLI and sets up the GitHub Actions runner environment for Azure CLI. You can use Azure PowerShell with `enable-AzPSSession` property of the Azure Login action. This property sets up the GitHub Actions runner environment with the Azure PowerShell module.\n\nYou can also use the Azure Login action to connect to public or sovereign clouds including Azure Government and Azure Stack Hub.\n\n## Connect with other Azure services\n\nThe following articles provide details on connecting from GitHub to Azure and other services.  \n\n| Service | Tutorial |\n|-|-|\n| Microsoft Entra ID | [Sign in to GitHub Enterprise with Microsoft Entra ID (single sign-on)](/azure/active-directory/saas-apps/github-tutorial)\n| Power BI | [Connect Power BI with GitHub](/power-bi/service-connect-to-github)\n| GitHub Connectors | [GitHub connector for Azure Logic Apps, Power Automate, and Power Apps](/connectors/github/)\n| Azure Databricks | [Use GitHub as version control for notebooks](/azure/databricks/notebooks/github-version-control) \n\n> [!div class=\"nextstepaction\"]\n> [Deploy apps from GitHub to Azure](deploy-to-azure.md)\n"
  },
  {
    "path": "articles/github/database-actions-deploy.md",
    "content": "--- \ntitle: Deploy databases from GitHub to Azure  \ndescription: Support to deploy databases from GitHub to Azure   \nauthor: ramiMSFT \nms.author: rabououn \nms.topic: reference\nms.service: azure\nms.date: 02/15/2023\nms.custom: github-actions-azure\n---\n\n# Deploy databases from GitHub to Azure\n\nThe following articles provide support to deploy database updates from GitHub to Azure. You can use GitHub Actions to deploy to [Azure SQL](/azure/azure-sql/), [Azure MySQL](/azure/mysql/), and [Azure Database for PostgreSQL](/azure/postgresql/).\n\nFor Azure SQL Managed Instance, [use Azure CLI](/cli/azure/sql/) and the [Azure CLI action](https://github.com/marketplace/actions/azure-cli-action).\n\n- [Use GitHub Actions to connect to Azure SQL Database](/azure/azure-sql/database/connect-github-actions-sql-db)\n- [Use GitHub Actions to connect to Azure MySQL](/azure/mysql/quickstart-mysql-github-actions)\n- [Use GitHub Actions to connect to Azure PostgreSQL](/azure/postgresql/how-to-deploy-github-action)\n"
  },
  {
    "path": "articles/github/deploy-to-azure.md",
    "content": "--- \ntitle: Deploy apps from GitHub to Azure  \ndescription: Support to deploy apps from GitHub to Azure   \nauthor: N-Usha \nms.author: ushan \nms.topic: reference\nms.service: azure\nms.date: 09/24/2021\nms.custom: github-actions-azure, devx-track-arm-template\n---\n\n\n# Deploy apps from GitHub to Azure\n\nThe following articles provide support to deploy apps from GitHub to Azure.  \n\n## Azure App Service\n\n- [Deploy to Azure App Service on Linux using GitHub Actions](/azure/app-service/deploy-github-actions)  \n- [Deploy an Azure App Service Custom Container with GitHub Actions](/azure/app-service/deploy-container-github-action)\n- [Deploy to App Service on Linux and connect to a database](/azure/app-service/app-service-sql-asp-github-actions)\n- [Deploy to Azure App Service on Linux using Visual Studio Code](/azure/devops/pipelines/targets/deploy-to-azure-vscode)\n- [Tutorial: Use GitHub Actions to deploy to an App Service Custom Container and connect to a database](/azure/app-service/app-service-sql-github-actions)\n\n## Azure Functions\n\n- [Deploy a function app continuously from GitHub](/azure/azure-functions/scripts/functions-cli-create-function-app-github-continuous)  \n- [Deploy to Azure Functions using GitHub Actions](/azure/azure-functions/functions-how-to-github-actions)   \n\n## Azure App Configuration\n\n- [Sync your GitHub repository to App Configuration](/azure/azure-app-configuration/push-kv-github-action)\n\n## Azure Storage\n\n- [Use GitHub Actions workflow to deploy your static website in Azure Storage](/azure/storage/blobs/storage-blobs-static-site-github-actions)\n## Azure Container Instances\n\n- [Configure a GitHub action to create a container instance](/azure/container-instances/container-instances-github-action)\n\n## Azure Kubernetes Service\n\n- [Use GitHub Actions to deploy to Kubernetes](/azure/aks/kubernetes-action)  \n- [Deploy to Azure Dev Spaces using GitHub Actions](/azure/dev-spaces/how-to/github-actions)\n\n## Azure Shared Image Gallery\n- [Build custom virtual machine images with GitHub Actions](build-vm-image.md)\n\n## Azure Pipelines\n\n- [Trigger a Pipeline run from GitHub Actions](/azure/devops/pipelines/ecosystems/github-actions)\n\n\n## Azure Resource Manager templates\n\n- [Deploy Bicep files by using GitHub Actions](/azure/azure-resource-manager/bicep/deploy-github-actions)\n- [Deploy Azure Resource Manager templates by using GitHub Actions](/azure/azure-resource-manager/templates/deploy-github-actions)\n\n## Azure Machine Learning\n\n- [Use GitHub Actions with Azure Machine Learning](/azure/machine-learning/how-to-github-actions-machine-learning)\n\n## Azure Stack\n\n- [Use the Azure login action with Azure CLI and PowerShell on Azure Stack Hub](/azure-stack/user/ci-cd-github-action-login-cli)\n"
  },
  {
    "path": "articles/github/deploy-with-visual-studio.md",
    "content": "--- \ntitle: Use Visual Studio to deploy apps from GitHub \ndescription: Visual Studio and Visual Studio Code resources to deploy apps from GitHub  \nauthor: N-Usha \nms.author: ushan \nms.topic: reference\nms.service: azure\nms.date: 05/05/2020\n---\n\n\n# Use Visual Studio or Visual Studio Code to deploy apps from GitHub \n\nReview the following article to learn how to use Visual Studio or Visual Studio Code with GitHub.  \n\n- [Deploy to Azure App Service using Visual Studio Code](/azure/devops/pipelines/targets/deploy-to-azure-vscode)  \n- [Visual Studio subscription with GitHub offer](/visualstudio/subscriptions/access-github)  \n\nAnd, the following Marketplace extensions provide developer support for integrating with GitHub. \n\n- [GitHub extension for Visual Studio](https://visualstudio.github.com/)  \n- [GitHub extension for Visual Studio Code](https://vscode.github.com/)\n\nYou can also use Visual Studio and Visual Studio Code to create your own actions.\n\n- [Tutorial: Create a GitHub Action with .NET](/dotnet/devops/create-dotnet-github-action)\n"
  },
  {
    "path": "articles/github/github-actions-key-vault.md",
    "content": "---\ntitle: Use Azure Key Vault secrets in a GitHub Actions workflow\ndescription: Securely retrieve secrets with GitHub Actions and Azure Key Vault.\nms.topic: sample\nms.service: azure\nms.date: 06/30/2025\nms.custom: github-actions-azure\n---\n\n# Integrate Azure Key Vault into a GitHub Actions workflow\n\nIntegrate [Azure Key Vault](/azure/key-vault/) into your GitHub Actions workflow to securely manage sensitive credentials in one place. This approach reduces the risk of accidental exposure or unauthorized access to sensitive data.\n\nThis GitHub Actions sample workflow demonstrates how to securely retrieve secrets from Azure Key Vault using OpenID Connect (OIDC) authentication.\n\n## Prerequisites\n\n- Configure a federated identity credential on a Microsoft Entra application or a user-assigned managed identity. Learn how in [Authenticate to Azure from GitHub Actions by OpenID Connect](connect-from-azure-openid-connect.md). When you set up your federated credential, store these secrets in GitHub:\n    - `AZURE_CLIENT_ID`: Your Azure service principal's client ID.\n    - `AZURE_TENANT_ID`: Your Azure AD tenant ID.\n    - `AZURE_SUBSCRIPTION_ID`: Your Azure subscription ID.\n    - `KEYVAULT_NAME`: Your Key Vault name.\n- Grant permissions: Make sure the service principal has appropriate access to the Key Vault (example, \"Key Vault Secrets User\" role).\n- Replace `<SECRET_NAME>` with your Key Vault secret name.\n\n## GitHub Actions workflow sample\n\nWhat the workflow does:\n\n- Triggers on pushes to the main branch\n- Uses OIDC authentication to connect to Azure (no passwords stored in GitHub)\n- Retrieves a secret from Azure Key Vault\n- Masks the secret value with `::add-mask::` to prevent it from appearing in logs\n- Makes the secret available as an environment variable for subsequent steps\n\n\n```yaml\nname: Access Azure Key Vault and pass secret to workflow\n\non:\n  push:\n    branches:\n      - main\n\npermissions:\n  id-token: write\n  contents: read\n\njobs:\n  get-secret:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Azure Login\n        uses: azure/login@v1\n        with:\n          client-id: ${{ secrets.AZURE_CLIENT_ID }}\n          tenant-id: ${{ secrets.AZURE_TENANT_ID }}\n          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}\n\n      - name: Retrieve secret from Key Vault\n        id: keyvault\n        uses: azure/CLI@v1\n        with:\n          inlineScript: |\n            SECRET_VALUE=$(az keyvault secret show --name <SECRET_NAME> --vault-name ${{ secrets.KEYVAULT_NAME }} --query value -o tsv)\n            echo \"::add-mask::$SECRET_VALUE\"\n            echo \"SECRET_VALUE=$SECRET_VALUE\" >> $GITHUB_ENV\n      - name: Use retrieved secret\n        run: echo \"The secret is successfully retrieved!\"\n\n      - name: Use SECRET_VALUE in deployment\n        run: |\n          ./deploy.sh\n        env:\n          SECRET_VALUE: ${{ env.SECRET_VALUE }}\n```\n\n\n## Additional resources\n\n- [Authenticate to Azure from GitHub Actions by OpenID Connect](connect-from-azure-openid-connect.md)\n- [About Azure Key Vault](/azure/key-vault/general/overview)"
  },
  {
    "path": "articles/github/github-actions.md",
    "content": "---\ntitle: What is GitHub Actions for Azure?\ndescription: Create workflows within your repository to build, test, package, release, and deploy to Azure. \nauthor: N-Usha \nms.author: ushan \nms.topic: concept-article\nms.service: azure\nms.date: 03/19/2022\nms.custom: github-actions-azure\n---\n\n\n# What is GitHub Actions for Azure\n\n[GitHub Actions](https://docs.github.com/en/free-pro-team@latest/actions) helps you automate your software development workflows from within GitHub. You can deploy workflows in the same place where you store code and collaborate on pull requests and issues.\n\nIn GitHub Actions, a [workflow](https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/introduction-to-github-actions) is an automated process that you set up in your GitHub repository. You can build, test, package, release, or deploy any project on GitHub with a workflow.\n\nEach workflow is made up of individual [actions](https://docs.github.com/en/actions/learn-github-actions/introduction-to-github-actions) that run after a specific event (like a pull request) occur. The individual actions are packaged scripts that automate software development tasks.\n\nWith GitHub Actions for Azure, you can create workflows that you can set up in your repository to build, test, package, release, and deploy to Azure. GitHub Actions for Azure supports Azure services, including Azure App Service, Azure Functions, and Azure Key Vault.\n\nGitHub Actions also include support for utilities, including Azure Resource Manager templates, Azure CLI, and Azure Policy.\n\nWatch this video from GitHub Universe 2020 to learn more about continuous delivery with GitHub Actions.  \n\n> [!VIDEO https://www.youtube.com/embed/36hY0-O4STg]\n\n## Why should I use GitHub Actions for Azure\n\nMicrosoft developed GitHub Actions for Azure and designed them be used with Azure. You can see all of the GitHub Actions for Azure in the [GitHub Marketplace](https://github.com/marketplace?query=Azure&type=actions). See [Finding and customizing actions](https://docs.github.com/en/actions/learn-github-actions/finding-and-customizing-actions) to learn more about incorporating actions into your workflows.\n\n## What is the difference between GitHub Actions and Azure Pipelines\n\nAzure Pipelines and GitHub Actions both help you automate software development workflows. [Learn more](https://docs.github.com/en/actions/learn-github-actions/migrating-from-azure-pipelines-to-github-actions) about how the services differ and how to migrate from Azure Pipelines to GitHub Actions.\n\n## What do I need to use GitHub Actions for Azure\n\nYou'll need Azure and GitHub accounts:\n\n* An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* A GitHub account. If you don't have one, sign up for [free](https://github.com/join).  \n\n## How do I connect GitHub Actions and Azure\n\nDepending on the action, you can use service principal or publish profile to connect to Azure from GitHub. You'll use a service principal each time you use the [Azure login](https://github.com/marketplace/actions/azure-login) action. When you use a service principal you can use OpenID Connect or a secret.\n\nThe [Azure App Service action](https://github.com/marketplace/actions/azure-webapp) supports using a publish profile or service principal. See [Application and service principal objects in Microsoft Entra ID](/azure/active-directory/develop/app-objects-and-service-principals#service-principal-object) to learn more about service principals.  \n\nYou can use the Azure login action in combination with both the [Azure CLI](https://github.com/marketplace/actions/azure-cli-action) and Azure [Azure PowerShell](https://github.com/marketplace/actions/azure-powershell-action) actions. The Azure login action also works with most other GitHub actions for Azure including [deploying to web apps](https://github.com/marketplace/actions/azure-webapp). You can also use Azure login with community-contributed actions like [Enhanced Azure key vault](https://github.com/marketplace/actions/enhanced-env-azure-key-vault-get-secrets) that aren't officially supported by Microsoft.\n\n## What is included in a GitHub Actions workflow\n\nWorkflows are made up of one or more jobs. Within a job, there are steps made up of individual actions. See [Introduction to GitHub Actions](https://docs.github.com/en/actions/learn-github-actions/introduction-to-github-actions) to learn more about GitHub Actions concepts.  \n\n## Where can I see complete workflow examples\n\nThe [Azure starter action workflows repository](https://github.com/Azure/actions-workflow-samples) includes end-to-end workflows to build and deploy Web apps of any language, any ecosystem to Azure.\n\n## Where can I see all the available actions\n\nVisit the [Marketplace for GitHub Actions for Azure](https://github.com/marketplace?query=Azure&type=actions) to see all the available GitHub Actions for Azure.\n\n* [Azure Spring Cloud](https://github.com/Azure/azure-spring-cloud)\n* [Deploy Bicep file or Azure Resource Manager template](https://github.com/Azure/arm-deploy)\n* [Deploy to a static web app](/azure/static-web-apps/getting-started?tabs=angular)\n* [Azure App Service settings](https://github.com/Azure/appservice-settings)  \n* [Deploy to Azure Functions](https://github.com/Azure/functions-action)  \n* [Deploy to Azure Functions for Containers](https://github.com/Azure/webapps-container-deploy)  \n* [Docker login](https://github.com/Azure/docker-login)  \n* [Deploy to Azure Container Instances](https://github.com/Azure/aci-deploy)\n* [Container scanning action](https://github.com/Azure/container-scan)\n* [Kubectl tool installer](https://github.com/Azure/setup-kubectl)  \n* [Kubernetes set context](https://github.com/Azure/k8s-set-context)  \n* [AKS set context](https://github.com/Azure/aks-set-context)  \n* [Kubernetes create secret](https://github.com/Azure/k8s-create-secret)  \n* [Kubernetes deploy](https://github.com/Azure/k8s-deploy)  \n* [Setup Helm](https://github.com/Azure/setup-helm)  \n* [Kubernetes bake](https://github.com/Azure/k8s-bake)  \n* [Build Azure virtual machine images](https://github.com/Azure/build-vm-image)\n* [Machine learning login](https://github.com/Azure/aml-workspace)\n* [Machine learning training](https://github.com/Azure/aml-run)\n* [Machine learning - deploy model](https://github.com/Azure/aml-deploy)\n* [Deploy to Azure SQL database](https://github.com/Azure/sql-action)  \n* [Deploy to Azure MySQL action](https://github.com/Azure/mysql-action)  \n* [Azure Policy Compliance Scan](https://github.com/Azure/policy-compliance-scan)\n* [Manage Azure Policy](https://github.com/Azure/manage-azure-policy)\n* [Trigger an Azure Pipelines run](https://github.com/Azure/pipelines)  \n\n"
  },
  {
    "path": "articles/github/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure and GitHub integration\nsummary: Learn how GitHub and Azure work together to let you build and deploy apps. \n\nmetadata:\n  title: Azure and GitHub integration\n  description: Learn how GitHub and Azure work together to let you build and deploy apps. \n  ms.service: azure\n  ms.topic: landing-page \n  author: N-Usha \n  ms.author: ushan \n  ms.date: 11/24/2020\n  ms.custom: github-actions-azure\n\n# linkListType: architecture | concept | deploy | download | get-started | how-to-guide | learn | overview | quickstart | reference | tutorial | video | whats-new\n\nlandingContent:\n# Cards and links should be based on top customer tasks or top subjects\n# Start card title with a verb\n  # Card (optional)\n  - title: GitHub Actions for Azure\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: What is GitHub Actions for Azure?\n            url: github-actions.md\n  # Card (optional)\n  - title: Deploy to Azure\n    linkLists:\n      - linkListType: deploy\n        links:\n          - text: Deploy apps from GitHub to Azure\n            url: deploy-to-azure.md   \n          - text: Deploy databases from GitHub to Azure\n            url: database-actions-deploy.md \n          - text: Build custom virtual images\n            url: build-vm-image.md\n\n  # Card\n  - title: Tools for interacting with GitHub Actions \n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Authenticate from Azure to GitHub\n            url: connect-from-azure.md  \n\n  # Card (optional)\n  - title: Azure Developer CLI (azd)\n    linkLists:\n      - linkListType: deploy\n        links:\n          - text: What is Azure Developer CLI?\n            url: ../azure-developer-cli/overview.md\n          - text: Get started\n            url: ../azure-developer-cli/install-azd.md\n          - text: See more in the Azure Developer CLI developer center\n            url: ../azure-developer-cli/index.yml\n\n  # Card (optional)\n  # - title: Visual Studio and Visual Studio Code\n  #   linkLists:\n  #     - linkListType: deploy\n  #       links:\n  #         - text: Use Visual Studio or Visual Studio Code to deploy apps from GitHub\n  #           url: deploy-with-visual-studio.md \n\n  # Card (optional)\n  - title: Azure Pipelines and GitHub integration\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Work with Azure DevOps and GitHub \n            url: integrate-azure-devops.md\n\n    # Card (optional)\n  - title: Manage Azure Policies with GitHub\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Manage Azure Policies as code with GitHub\n            url: manage-azure-policy.md\n"
  },
  {
    "path": "articles/github/integrate-azure-devops.md",
    "content": "--- \ntitle: Work with Azure DevOps and GitHub  \ndescription: Find resources that support integration of Azure DevOps and GitHub  \nauthor: N-Usha \nms.author: ushan \nms.topic: reference\nms.service: azure\nms.date: 05/05/2020\nms.custom: github-actions-azure\n---\n\n\n# Work with Azure DevOps and GitHub \n\nReview the following article to learn how Azure DevOps works with GitHub.  \n\n- [Connect Azure Boards with GitHub](/azure/devops/boards/github)   \n- [Link Azure Boards work items to GitHub commits, pull requests and issues](/azure/devops/boards/github/link-to-from-github)  \n- [Use Azure Pipelines to build GitHub repositories](/azure/devops/pipelines/repos/github)   \n- [Create a GitHub Release from Azure Pipelines](/azure/devops/pipelines/tasks/utility/github-release)  \n \n"
  },
  {
    "path": "articles/github/manage-azure-policy.md",
    "content": "--- \ntitle: Manage Azure Policies with GitHub  \ndescription: Manage Azure Policies as code from GitHub \nauthor: raiyanalam \nms.custom: github-actions-azure\nms.author: moala \nms.topic: reference\nms.service: azure-policy \nms.date: 10/27/2020\n---\n\n\n# Manage Azure Policies with GitHub\n\nReview the following articles to learn how to manage Azure Policies as code from GitHub\n\n- [Export Azure Policies from Azure](/azure/governance/policy/how-to/export-resources)   \n- [Manage Azure Policies as code from GitHub](/azure/governance/policy/tutorials/policy-as-code-github)\n- [Trigger Azure compliance scans](/azure/governance/policy/how-to/get-compliance-data#on-demand-evaluation-scan)"
  },
  {
    "path": "articles/github/toc.yml",
    "content": "- name: Azure and GitHub integration\n  href: index.yml  \n  items:\n  - name: GitHub Actions for Azure\n    expanded: true\n    items:\n    - name: Introduction to GitHub Actions for Azure\n      href: github-actions.md \n    - name: Authenticate to Azure from GitHub  \n      expanded: true\n      items:\n      - name: Authenticatication methods\n        href: connect-from-azure.md\n      - name: Sign in with OpenID Connect\n        href: connect-from-azure-openid-connect.md\n      - name: Sign in with a managed identity configured on an Azure VM\n        href: connect-from-azure-identity.md\n      - name: Sign in with a service principal and secret\n        href: connect-from-azure-secret.md\n    - name: Use Azure Key Vault secrets in a GitHub Actions workflow \n      href: github-actions-key-vault.md \n    - name: Deploy apps to Azure \n      href: deploy-to-azure.md \n    - name: Deploy databases to Azure\n      href: database-actions-deploy.md\n    - name: Manage Azure Policy\n      href: manage-azure-policy.md\n    - name: Build custom virtual machine images\n      href: build-vm-image.md\n  - name: Azure DevOps & GitHub \n    href: integrate-azure-devops.md\n  - name: Visual Studio and Visual Studio Code  \n    href: deploy-with-visual-studio.md "
  },
  {
    "path": "articles/github-copilot-app-modernization/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: GitHub Copilot modernization\n      tocHref: /azure\n      topicHref: /azure/developer/github-copilot-app-modernization/index\n    - name: GitHub Copilot modernization\n      tocHref: /java\n      topicHref: /azure/developer/github-copilot-app-modernization/index\n    - name: GitHub Copilot modernization\n      tocHref: /dotnet\n      topicHref: /azure/developer/github-copilot-app-modernization/index\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/configure-settings-intellij.md",
    "content": "---\ntitle: Optimize GitHub Copilot Modernization Settings for IntelliJ\ndescription: Learn how to configure GitHub Copilot modernization to optimize the experience for IntelliJ.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xinrzhu\nms.topic: how-to\nms.date: 10/28/2025\nms.custom: devx-track-java\n---\n\n# Configure settings for GitHub Copilot modernization to optimize the experience for IntelliJ\n\nThis article shows you how to configure GitHub Copilot modernization on IntelliJ to optimize the experience. Because GitHub Copilot modernization relies on Model Context Protocol (MCP) tools, these adjustments help ensure smoother execution.\n\n## Enable auto-approve in MCP sampling\n\nEnabling auto-approve helps prevent repeated approval prompts during the upgrade process. Use the following steps:\n\n1. In IntelliJ, go to **GitHub Copilot > Model Context Protocol (MCP)**. Then, under **Auto Approve for Sampling**, select **Configure**.\n\n   :::image type=\"content\" source=\"media/configure-settings-intellij/auto-approve-configure.png\" alt-text=\"Screenshot of IntelliJ that shows the MCP settings.\" lightbox=\"media/configure-settings-intellij/auto-approve-configure.png\":::\n\n1. Locate **java-upgrade** and then select **Auto Approve**.\n\n   :::image type=\"content\" source=\"media/configure-settings-intellij/auto-approve.png\" alt-text=\"Screenshot of IntelliJ that shows the MCP Sampling Auto-approval settings.\" lightbox=\"media/configure-settings-intellij/auto-approve.png\":::\n\n## Enable Claude Sonnet 4 model access in MCP sampling\n\nFor optimal upgrade results, we recommend enabling access to the **Claude Sonnet 4** model (or newer). Use the following steps to configure model access:\n\n1. In the chat window, select **Configure tools**.\n\n   :::image type=\"content\" source=\"media/configure-settings-intellij/model-tools.png\" alt-text=\"Screenshot of IntelliJ that shows Agent mode, model selector, and tool selector.\" lightbox=\"media/configure-settings-intellij/model-tools.png\":::\n\n1. Find **java-upgrade** and then select **Configure Model Access**.\n\n   :::image type=\"content\" source=\"media/configure-settings-intellij/configure-model-access.png\" alt-text=\"Screenshot of IntelliJ that shows the Configure Tools pane.\" lightbox=\"media/configure-settings-intellij/configure-model-access.png\":::\n\n1. Make sure **Claude Sonnet 4** (or a newer model) is selected.\n\n   :::image type=\"content\" source=\"media/configure-settings-intellij/select-models.png\" alt-text=\"Screenshot of IntelliJ that shows the pane Select models for java-upgrade.\" lightbox=\"media/configure-settings-intellij/select-models.png\":::\n\n## Increase maximum requests per turn to 100\n\nBecause GitHub Copilot modernization tasks can be long-running, increase the **maximum requests per turn** in Agent Mode from the default of 25 to **100**. Adjust this setting directly in the **GitHub Copilot settings**.\n\n:::image type=\"content\" source=\"media/configure-settings-intellij/max-request.png\" alt-text=\"Screenshot of IntelliJ that shows the GitHub Copilot settings pane with the Max Requests settings highlighted.\" lightbox=\"media/configure-settings-intellij/max-request.png\":::\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/context/context.yml",
    "content": "### YamlMime:ContextObject\nbrand: azure\nuhfHeaderId: azure\nbreadcrumb_path: ../breadcrumb/toc.yml\ntoc_rel: ../toc.yml"
  },
  {
    "path": "articles/github-copilot-app-modernization/customize-upgrade-plan.md",
    "content": "---\ntitle: Customize the Java Project Upgrade Plan When Using GitHub Copilot Modernization\ndescription: Describes how to customize the upgrade plan generated by GitHub Copilot modernization.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xinrzhu\nms.topic: how-to\nms.date: 11/18/2025\nms.custom: devx-track-java\n---\n\n# Customize the Java project upgrade plan when using GitHub Copilot modernization\n\nThis article describes how to customize the Java project upgrade plan generated by GitHub Copilot modernization.\n\nWhen you initiate an upgrade session, GitHub Copilot generates a **plan.md** file that outlines the steps and tasks required for the upgrade. This file serves as a blueprint for the upgrade process, which you can customize to better fit your project's needs.\n\nAfter the tool generates the **plan.md** file, it automatically opens in the Visual Studio Code editor. At this stage, you can review and customize the plan to ensure it aligns with your specific upgrade goals.\n\n## Example plan.md file structure\n\nThe following sections describe a sample **plan.md** file structure in order to illustrate the customization points.\n\n## Key parameters\n\nThe following sections describe key parameters in the plan that you can modify.\n\n### Build tool command option\n\nThis option is under **Project Information**. Use it to define custom command-line parameters for build tool execution. For valid options, see the [Maven CLI](https://maven.apache.org/ref/current/maven-embedder/cli.html) or [Gradle CLI](https://docs.gradle.org/current/userguide/command_line_interface.html) documentation, depending on your project.\n\nExamples:\n\n- **For Maven**: `Build tool command options: -Dmaven.javadoc.skip=true -s \"/path/to/custom/settings.xml\"`\n\n- **For Gradle**: `Build tool command options: --info -Penv=production`\n\n> [!NOTE]\n> Replace the path with your actual `settings` file location as needed. The path shown is just an example.\n\n:::image type=\"content\" source=\"media/customize-upgrade-plan/upgrade-plan.png\" alt-text=\"Screenshot of Visual Studio Code that shows an example upgrade plan with upgrade targets highlighted.\" lightbox=\"media/customize-upgrade-plan/upgrade-plan.png\":::\n\n### Test validation\n\nLocated under the **Additional Tasks** section, you can enable or disable test execution by modifying the `run tests before and after the upgrade` flag.\n\n- Set to `true` to enable unit tests before and after upgrade.\n- Set to `false` to skip test validation.\n\nThis setting controls whether the tool runs unit tests to verify functional correctness during the upgrade.\n\nBy adjusting these settings, you can fine-tune the upgrade process to better suit your project's requirements.\n\n## Customize upgrade goals and provide guidelines\n\nIn Java upgrade scenarios, you often need customization beyond standard JDK or framework upgrades - for example, to apply project-specific code changes or to update internal libraries the tool doesn't automatically detect. To support these needs, GitHub Copilot modernization now enables customization within the upgrade plan. This capability enables you to provide your own recipes, instructions, and inputs to guide the upgrade process. You can perform this customization by modifying the **Upgrade Goals** and **Guidelines** sections.\n\n### The Upgrade Goals section\n\nIn the **Upgrade Goals** section, specify more upgrade targets along with the objectives in your initial prompt. For example, if the primary task is to upgrade the project from Java 17 to Java 21, but the project also requires upgrading Log4j from 1.x to 2.x, list that requirement as an additional goal, as shown in the following example prompt:\n\n```prompt\n## Upgrade Goals\n- Upgrade from Java 17 to 21\n- Upgrade org.apache.logging.log4j:* to 2.24.3 \n- Upgrade org.internal.lib to 2.0\n```\n\n### The Guidelines section\n\nThe **Guidelines** section defines how Copilot should perform the upgrade. While the **Upgrade Goals** section focuses on what needs to be upgraded, the **Guidelines** section captures the methodology, conventions, tooling, and rules that guide Copilot's behavior during code transformation.\n\nInclude any instructions that help steer how Copilot modifies code, such as the following instructions:\n\n- Guidance on which tools, recipes, or frameworks to use for code changes.\n- Constraints or prohibitions on certain upgrade approaches.\n- Code style or convention requirements.\n- Links to internal files, documentation, or scripts the agent can access.\n- Domain knowledge helpful for fixing errors or performing upgrades.\n- Requirements for how the agent should annotate or comment on code changes.\n- Cleanup instructions for temporary artifacts created during the upgrade process.\n\nThe content of this section can be plain text, hyperlinks, or references to local files as long as Copilot can access them.\n\nExamples:\n\n```prompt\n## Guidelines\n- Do not use Log4j 1 to Log4J 2 API bridge to upgrade to Log4J 2. \n- Please follow the code conventions defined in /xxx/bbb/rules.txt.\n- Please provide detailed comments explaining why each code change is necessary.\n- \"com.example:internal-lib:2.0.0\" is compatible with Java 21.\n- Use our internal MCP tool get_internal_lib_knowledge to retrieve compatibility information for internal libraries.\n- After the upgrade, please remove any temporary files created during the process, such as code modification scripts.\n\n```\n\n:::image type=\"content\" source=\"media/customize-upgrade-plan/guidelines.png\" alt-text=\"Screenshot of the Java upgrade plan that shows the Upgrade Goals and Guidelines sections.\" lightbox=\"media/customize-upgrade-plan/guidelines.png\":::\n\n## See also\n\n[GitHub Copilot modernization](/azure/developer/java/migration/migrate-github-copilot-app-modernization-for-java?toc=/java/upgrade/toc.json&bc=/java/upgrade/breadcrumb/toc.json)\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/framework-upgrade.md",
    "content": "---\ntitle: Upgrade a Java Framework or Third-Party Dependency by Using GitHub Copilot Modernization\ndescription: Shows you how to use GitHub Copilot modernization to upgrade a framework or third-party dependency without requiring a JDK runtime upgrade.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xinrzhu\nms.topic: how-to\nms.date: 03/26/2026\nms.custom: devx-track-java\n---\n\n# Upgrade a Java framework or third-party dependency by using GitHub Copilot modernization\n\nThis article shows you how to use GitHub Copilot modernization to upgrade a Java framework or third-party dependency without requiring a JDK runtime upgrade.\n\n## Initiate a framework upgrade\n\nTo initiate this type of upgrade, start a prompt in agent mode. For example:\n\n```prompt\nupgrade this Java project to Spring Boot 3.2\n```\n\n:::image type=\"content\" source=\"media/framework-upgrade/upgrade-spring-boot-only.png\" alt-text=\"Screenshot of Visual Studio Code that shows Copilot trying to upgrade to Spring Boot 3.2 only.\" lightbox=\"media/framework-upgrade/upgrade-spring-boot-only.png\":::\n\n## Handle compatibility\n\nIf your current JDK version is compatible with the specified Spring Boot version - for example, JDK 17+ for Spring Boot 3.2 - the tool performs a framework-only upgrade. Both the source and target JDK versions remain the same and the target Spring Boot version is set according to your initial prompt.\n\nIf your current JDK version isn't compatible with the target Spring Boot version - for example, when upgrading from JDK 8 to Spring Boot 3.2 - the tool automatically upgrades the JDK to the minimum supported version required by the framework - in this case, JDK 17 - in addition to performing the framework upgrade.\n\n## Upgrade third-party libraries\n\nYou can also use a similar prompt to upgrade a third-party library. For example:\n\n```prompt\nuse the java upgrade tools to upgrade \"com.google.inject.guice\" to 6.0.0 in this java project\n```\n\n:::image type=\"content\" source=\"media/framework-upgrade/upgrade-library-only.png\" alt-text=\"Screenshot of Visual Studio Code that shows Copilot trying to upgrade a Google library to a newer version.\" lightbox=\"media/framework-upgrade/upgrade-library-only.png\":::\n\nWhen you initiate a prompt to upgrade a specific third-party library - for example, `Upgrade com.google.inject.guide to version 3.17.0` - GitHub Copilot analyzes the current project and generates an upgrade plan focused solely on updating the requested dependency.\n\n## What Copilot does during the upgrade\n\nAs part of this process, Copilot might perform the following tasks:\n\n- Modify code or configuration files to ensure compatibility with the new library version.\n- Perform build validation to confirm the project compiles successfully.\n- Run CVE checks to detect and surface any security issues.\n- Execute test validation to ensure no new test failures are introduced.\n\nThis *targeted upgrade flow* enables you to modernize dependencies with transparency and control.\n\n## See also\n\n[GitHub Copilot modernization](/azure/developer/java/migration/migrate-github-copilot-app-modernization-for-java?toc=/java/upgrade/toc.json&bc=/java/upgrade/breadcrumb/toc.json)\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: GitHub Copilot modernization documentation\nsummary: Provides an overview, reference, and quickstarts on using GitHub Copilot modernization.\n\nmetadata:\n  title: GitHub Copilot Modernization Documentation\n  description: Provides an overview, reference, and quickstarts on using GitHub Copilot modernization.\n  author: KarlErickson\n  ms.author: karler\n  ms.date: 03/26/2026\n  ms.topic: landing-page\n\nlandingContent:\n  - title: Overview\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: GitHub Copilot modernization overview\n            url: overview.md\n          - text: Languages and frameworks supported\n            url: languages.md\n          - text: Portfolio assessment integration\n            url: ../java/migration/github-copilot-app-modernization-for-java-portfolio-assessment-integration.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: Java overview\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: Java FAQ\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-faq.yml?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: .NET overview\n            url: /dotnet/core/porting/github-copilot-app-modernization/overview?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: .NET FAQ\n            url: /dotnet/core/porting/github-copilot-app-modernization/faq?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n  - title: \"CLI: Modernization agent\"\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Modernization agent overview\n            url: modernization-agent/overview.md\n      - linkListType: quickstart\n        links:\n          - text: Modernization agent quickstart\n            url: modernization-agent/quickstart.md\n      - linkListType: reference\n        links:\n          - text: Modernization agent CLI commands\n            url: modernization-agent/cli-commands.md\n      - linkListType: how-to-guide\n        links:\n          - text: Batch assessment\n            url: modernization-agent/batch-assess.md\n          - text: Batch upgrade\n            url: modernization-agent/batch-upgrade.md\n          - text: Customization\n            url: modernization-agent/customization.md\n          - text: CI/CD integration\n            url: modernization-agent/cicd-integration.md\n          - text: Infrastructure and deployment\n            url: modernization-agent/infra-deployment.md\n  - title: Upgrade Java projects\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: \"Quickstart: Upgrade a Java project\"\n            url: quickstart-upgrade.md\n          - text: \"Quickstart: Generate unit tests\"\n            url: quickstart-unit-tests.md\n      - linkListType: how-to-guide\n        links:\n          - text: Configure settings for IntelliJ\n            url: configure-settings-intellij.md\n          - text: Customize the upgrade plan\n            url: customize-upgrade-plan.md\n          - text: Upgrade a framework or third-party dependency\n            url: framework-upgrade.md\n  - title: Migrate Java projects to Azure\n    linkLists:\n      - linkListType: reference\n        links:\n          - text: Predefined tasks\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-predefined-tasks.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: Working with assessment\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-working-with-assessment.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: Understand assessment rules\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-assess-rules.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n      - linkListType: quickstart\n        links:\n          - text: Optimize chat results with the AppModernization agent\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-chat-window.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: Assess and migrate a Java project\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-assess-migrate.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: Create and apply your own skill\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: Prepare infrastructure\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-infrastructure.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: Containerize your project\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-containerization.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: Deploy your project\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-deploy-to-azure.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n      - linkListType: sample\n        links:\n          - text: Migration sample\n            url: ../java/migration/migrate-github-copilot-app-modernization-for-java-sample.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n  - title: Upgrade .NET apps\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Upgrade .NET apps\n            url: /dotnet/core/porting/github-copilot-app-modernization/overview?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: Install\n            url: /dotnet/core/porting/github-copilot-app-modernization/install?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: FAQ\n            url: /dotnet/core/porting/github-copilot-app-modernization/faq?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n      - linkListType: how-to-guide\n        links:\n          - text: How to upgrade a .NET app\n            url: /dotnet/core/porting/github-copilot-app-modernization/how-to-upgrade-with-github-copilot?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n          - text: How to apply custom upgrade instructions\n            url: /dotnet/core/porting/github-copilot-app-modernization/how-to-custom-upgrade-instructions?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n  - title: Migrate .NET projects to Azure\n    linkLists:\n      - linkListType: reference\n        links:\n          - text: Predefined tasks\n            url: /dotnet/azure/migration/appmod/predefined-tasks?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n      - linkListType: quickstart\n        links:\n          - text: Assess and migrate a .NET project\n            url: /dotnet/azure/migration/appmod/quickstart?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n      - linkListType: sample\n        links:\n          - text: Migration sample\n            url: /dotnet/azure/migration/appmod/sample?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/languages.md",
    "content": "---\r\ntitle: Languages and Frameworks Supported by GitHub Copilot Modernization\r\ndescription: Introduces the support scope of GitHub Copilot modernization for languages and frameworks.\r\nauthor: KarlErickson\r\nms.author: karler\r\nms.reviewer: yangtony\r\nms.topic: reference\r\nms.date: 11/18/2025\r\n---\r\n\r\n# Languages and frameworks supported by GitHub Copilot modernization\r\n\r\nThis article describes the languages and frameworks supported by GitHub Copilot modernization.\r\n\r\n## Java\r\n\r\nThe following sections describe the Java support.\r\n\r\n### Upgrade the Java version\r\n\r\nGitHub Copilot modernization can help you [upgrade the Java version](/java/upgrade/quickstart-upgrade?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) of your application and fix compilation issues and common vulnerabilities. You can [customize the upgrade plan](/java/upgrade/customize-upgrade-plan?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) to consider more goals or guidelines during the Java version upgrade.\r\n\r\n### Upgrade the Java framework version\r\n\r\nGitHub Copilot modernization can help you [upgrade the framework version](/java/upgrade/framework-upgrade?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) of your Java application, whether it's Spring, Spring Boot, or Java EE/Jakarta EE. The tool makes sure the JDK version is also upgraded to be compatible with the framework version, and verifies the changes with build fixes and CVE checks.\r\n\r\n### Migrate Java apps to Azure\r\n\r\nGitHub Copilot modernization can help you [migrate your Java application to Azure](../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-assess-migrate.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) by assessing its cloud readiness and updating the code for dependency services.\r\n\r\nThe tool supports [Common scenarios](../java/migration/migrate-github-copilot-app-modernization-for-java-predefined-tasks.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) with AI-assisted code changes out-of-box, and you can define and run your [custom skills](../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) with resource knowledge. Code changes are validated with compilation and CVE fixes.\r\n\r\nFor Java EE / Jakarta EE applications, you need to first make sure your application architecture is compatible with the target Azure platform. For example, some JBoss EAP apps can be deployed to [Azure App Service](/azure/app-service/configure-language-java-deploy-run?pivots=java-jboss&tabs=windows#jboss-eap-server-lifecycle), but [WebSphere apps should be transformed to Liberty](https://www.ibm.com/docs/en/was-liberty/core?topic=migrating-applications-liberty) before being deployed to Azure Kubernetes Service (AKS). After such transformation, GitHub Copilot modernization can help you update the code for dependency services if they're called with direct APIs.\r\n\r\n## .NET\r\n\r\nThe following sections describe the .NET support.\r\n\r\n### Upgrade the .NET version\r\n\r\nGitHub Copilot modernization can help you [upgrade the .NET version](/dotnet/core/porting/how-to-upgrade-with-github-copilot?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) of your application, from an older .NET version or from .NET Framework. You can customize the upgrade plan with your requirements and preferences. Code changes are validated with compilation and CVE fixes.\r\n\r\n### Migrate .NET apps to Azure\r\n\r\nGitHub Copilot modernization can help you [migrate your .NET application to Azure](/dotnet/azure/migration/appmod/quickstart?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) by assessing its cloud readiness and updating the code for dependency services.\r\n\r\nThe tool supports [common scenarios](/dotnet/azure/migration/appmod/predefined-tasks?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) with AI-assisted code changes out of the box. It validates code changes with compilation and CVE fixes.\r\n\r\n## Python\r\n\r\nThe following section describes the Python support.\r\n\r\n### Migrate to Microsoft Agent Framework\r\n\r\nGitHub Copilot modernization can help you migrate your Python application from Semantic Kernel or AutoGen to Microsoft Agent Framework.\r\n\r\nTo migrate to Microsoft Agent Framework:\r\n\r\n1. Make sure you install and enable GitHub Copilot modernization in Visual Studio Code. For best results, select Claude Sonnet 4 or later as your model.\r\n\r\n1. Open your Python project that uses Semantic Kernel or AutoGen in Visual Studio Code.\r\n\r\n1. Select the GitHub Copilot modernization extension to open the sidebar.\r\n\r\n1. Start the migration process by using one of these methods:\r\n\r\n   - Select the **Convert to Agent Framework** button when detected automatically.\r\n   - Manually navigate to **Tasks** > **Python** > **Agent Framework Migration** > **Migrate AutoGen to Agent Framework** or **Migrate Semantic Kernel to Agent Framework**.\r\n\r\n   :::image type=\"content\" source=\"media/languages/migrate-to-agent-framework-quickstart.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization pane with the Convert to Agent Framework button highlighted.\" lightbox=\"media/languages/migrate-to-agent-framework-quickstart.png\":::\r\n\r\n   > [!TIP]\r\n   > If you have a hybrid project with both Java and Python, use the manual navigation method through the **Tasks** list to select the Python migration option.\r\n\r\n1. The extension starts the migration process in the Copilot Agent chat window.\r\n\r\n   :::image type=\"content\" source=\"media/languages/migrate-to-agent-framework-run-task.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization chat pane with the migration task being invoked through the appmod-run-task tool.\" lightbox=\"media/languages/migrate-to-agent-framework-run-task.png\":::\r\n\r\n1. To complete the migration, follow the guidance in the chat window. After code migration, the workflow sets up a Python virtual environment if it isn't already set up, installs project dependencies, then runs the following Python-specific validation steps:\r\n\r\n   - **Checks Python syntax issues**: Resolves Python syntax and import issues.\r\n   - **Checks Python lint issues**: Installs linters if they aren't already installed then resolves lint issues per project configuration.\r\n   - **Runs Python tests**: Installs test runners if they aren't already installed then runs tests to verify the migration quality.\r\n\r\n   :::image type=\"content\" source=\"media/languages/migrate-to-agent-framework-workflow.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization pane with the environment setup, syntax checking, and lint checking in the migration workflow.\" lightbox=\"media/languages/migrate-to-agent-framework-workflow.png\":::\r\n\r\n   :::image type=\"content\" source=\"media/languages/migrate-to-agent-framework-workflow-run-test.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization pane with the Run Python Tests step in the migration workflow.\" lightbox=\"media/languages/migrate-to-agent-framework-workflow-run-test.png\":::\r\n\r\n1. Review the migration summary, which includes the files migrated, validation results, and more.\r\n\r\n   :::image type=\"content\" source=\"media/languages/migrate-to-agent-framework-summary.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization pane with the migration summary including the migrated files and validation results.\" lightbox=\"media/languages/migrate-to-agent-framework-summary.png\":::\r\n\r\n## Language-agnostic\r\n\r\nThe following sections describe the language-agnostic support.\r\n\r\n### Containerization\r\n\r\nRegardless of language, GitHub Copilot modernization can help you containerize your application by creating Dockerfiles and building container images.\r\n\r\nFor more information, see [the Java example on Visual Studio Code](../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-containerization.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) or [the .NET example on Visual Studio](/dotnet/azure/migration/appmod/containerization?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json). You can containerize any application with the **Containerization Tasks** options under the **Common Tasks** list in the GitHub Copilot modernization extension sidebar in Visual Studio Code.\r\n\r\n### Deploy to Azure\r\n\r\nRegardless of language, GitHub Copilot modernization can help you deploy your application on existing or new Azure resources.\r\n\r\nFor more information, see [the Java example on Visual Studio Code](../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-deploy-to-azure.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json) or [the .NET example on Visual Studio](/dotnet/azure/migration/appmod/deploy?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json). You can deploy any application with the **Deployment Tasks** options under the **Common Tasks** list in the GitHub Copilot modernization extension sidebar in Visual Studio Code.\r\n\r\n## See also\r\n\r\nTo learn more about GitHub Copilot modernization, see [GitHub Copilot modernization documentation](index.yml).\r\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/modernization-agent/batch-assess.md",
    "content": "---\ntitle: Batch Assessment with GitHub Copilot Modernization Agent\ndescription: Learn how to use the GitHub Copilot modernization agent to assess multiple applications simultaneously and generate aggregated report.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jessiehuang\nms.topic: how-to\nai-usage: ai-assisted\nms.date: 04/17/2026\n---\n\n# Batch assessment with the GitHub Copilot modernization agent\n\nBatch assessment enables you to analyze multiple applications simultaneously, providing a comprehensive view of the modernization landscape across your applications. This article guides you through the process of assessing multiple repositories efficiently.\n\nBatch assessment is especially valuable for migration planning because it enables you to efficiently assess the readiness and requirements of various applications at once. By using batch assessment, you can evaluate different repositories at the same time and obtain detailed assessment reports for each application. It produces two kinds of reports to support your migration planning:\n\n- **Per app report**: Provides detailed insights into all modernization problems identified at the individual repository level.\n- **Aggregated report**: Presents an overall perspective of all assessed applications, offering summary insights, recommendations on Azure services, target platforms, and upgrade paths. Additionally, the aggregated report includes shortcuts for easy access to each per app report.\n\nBatch assessment provides the following benefits:\n\n- Cross-applications visibility:\n\n   - **Aggregated reports**: Get a comprehensive view across applications.\n   - **Cross-repository analysis**: Identify common patterns and dependencies across applications.\n   - **Prioritization insights**: Understand which applications need immediate attention.\n\n- Scale and efficiency:\n\n   - **Parallel processing**: Use Cloud Coding Agents to process multiple repositories simultaneously.\n   - **Automated workflows**: Integrate with CI/CD pipelines for scheduled assessment.\n   - **Time savings**: Reduce total assessment time from weeks to hours.\n\n## Prerequisites\n\n- [Modernize CLI](quickstart.md).\n- Access to all repositories you want to assess.\n- GitHub authentication is configured (`gh auth login`).\n\n## Configure repositories\n\nThe modernization agent supports multiple ways to specify the repositories you want to assess:\n\n- **Current folder**: Assess the project in your current working directory.\n- **Manual input**: Enter local directory paths or remote Git URLs directly.\n- **Repository config file**: Use a JSON config file that lists all repositories.\n\n### Repository config file\n\nFor batch operations across many repositories, create a JSON config file to list all repositories. For example, create it at `.github/modernize/repos.json` in your working directory, or provide a custom path.\n\nMake sure you have the right permissions for the repositories or fork them.\n\n**Simple format** (array of repositories):\n\n```json\n[\n  {\n    \"name\": \"PhotoAlbum-Java\",\n    \"url\": \"https://github.com/Azure-Samples/PhotoAlbum-Java.git\"\n  },\n  {\n    \"name\": \"PhotoAlbum\",\n    \"url\": \"https://github.com/Azure-Samples/PhotoAlbum.git\"\n  },\n  {\n    \"name\": \"eShopOnWeb\",\n    \"url\": \"https://github.com/dotnet-architecture/eShopOnWeb.git\"\n  }\n]\n```\n\n**Full format** (with branch and local paths):\n\n```json\n{\n  \"repos\": [\n    {\n      \"name\": \"PhotoAlbum-Java\",\n      \"url\": \"https://github.com/Azure-Samples/PhotoAlbum-Java.git\",\n      \"branch\": \"main\"\n    },\n    {\n      \"name\": \"local-project\",\n      \"path\": \"/absolute/path/to/project\"\n    }\n  ]\n}\n```\n\nEach repo entry supports the following fields:\n\n| Field         | Description                                                          | Required               |\n|---------------|----------------------------------------------------------------------|------------------------|\n| `name`        | A friendly name for the repository (used in reports and dashboards). | Yes                    |\n| `url`         | Git clone URL in HTTPS or SSH format.                                | One of `url` or `path` |\n| `path`        | Absolute local directory path.                                       | One of `url` or `path` |\n| `branch`      | Branch to check out after cloning.                                   | No                     |\n| `description` | Human-readable description.                                          | No                     |\n\n**Full format with app grouping** (optional, for organized reporting):\n\nYou can add an `apps[]` section to group repositories into logical applications. When apps are defined, the aggregated report organizes results by application and supports report distribution to external destinations.\n\n```json\n{\n  \"repos\": [\n    {\n      \"name\": \"PhotoAlbum-Java\",\n      \"url\": \"https://github.com/Azure-Samples/PhotoAlbum-Java.git\",\n      \"branch\": \"main\"\n    },\n    {\n      \"name\": \"PhotoAlbum\",\n      \"url\": \"https://github.com/Azure-Samples/PhotoAlbum.git\"\n    }\n  ],\n  \"apps\": [\n    {\n      \"identifier\": \"photo-app\",\n      \"description\": \"Photo management application\",\n      \"repos\": [\"PhotoAlbum-Java\"],\n      \"output\": {\n        \"type\": \"local\",\n        \"path\": \"/path/to/reports/photo-app\"\n      }\n    }\n  ]\n}\n```\n\nEach app entry supports:\n\n| Field         | Description                                                        | Required |\n|---------------|--------------------------------------------------------------------|----------|\n| `identifier`  | Unique display name of the application.                            | Yes      |\n| `description` | Human-readable description.                                        | No       |\n| `repos`       | List of repo names that belong to this app.                        | Yes      |\n| `output`      | Where to distribute this app's assessment report after generation. | No       |\n\nThe `output` field supports the following distribution types:\n\n| Type    | Description                                                                                        | Required fields |\n|---------|----------------------------------------------------------------------------------------------------|-----------------|\n| `local` | Copy reports to a local directory.                                                                 | `path`          |\n| `git`   | Push reports to a Git repository. The URL format is `https://github.com/org/repo.git#branch:path`. | `url`           |\n\n> [!TIP]\n> You can include repositories from different organizations and use different authentication methods as long as you have access.\n\nThe modernization agent automatically detects the `repos.json` file at `.github/modernize/repos.json` when you select **From a config file** in interactive mode. You can also provide a custom path.\n\n## Run batch assessment\n\nTwo execution modes are available:\n\n- **Local execution**: The modernization agent processes repositories one after another on your local machine. This mode works best for a smaller set of applications or for initial testing. Supports both Git URL and local path repositories.\n- **Cloud Coding Agent delegation**: The modernization agent submits tasks to GitHub Cloud Coding Agents for parallel processing in the cloud. This mode is faster for multi-repo scenarios.\n\n> [!IMPORTANT]\n> Cloud Coding Agent delegation requires repositories to have **GitHub (github.com) repository URLs**. Local path repositories and non-GitHub providers (GitLab, Azure DevOps) aren't supported for cloud delegation. Use local execution for those repositories.\n\n> [!TIP]\n> By using Cloud Coding Agent delegation, you enable parallel execution across all repositories. This approach significantly reduces the total assessment time for large portfolios.\n\n### Interactive mode (assess locally)\n\n1. Run the modernization agent:\n\n    ```bash\n    modernize\n    ```\n\n1. Select **Assess** from the main menu.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-understand-application-menu.png\" alt-text=\"Screenshot of Modernize CLI that shows the main menu with the Assess option in the terminal.\" lightbox=\"../media/modernization-agent/assess-understand-application-menu.png\":::\n\n1. Choose how to specify your target repositories. Select **From a config file** to use a `repos.json` file.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/source-type-selection.png\" alt-text=\"Screenshot of Modernize CLI that shows the source type selection in the terminal.\" lightbox=\"../media/modernization-agent/source-type-selection.png\":::\n\n    > [!TIP]\n    > You can also select **Manual input** to enter local paths or remote Git URLs directly, or **Current folder** to assess the project in your current directory.\n\n1. If the `repos.json` file is detected at the default location, the agent automatically fills it in. Otherwise, enter the path to your config file and press <kbd>Enter</kbd>.\n\n1. All repositories are selected by default. Deselect any repositories you want to skip, and then press <kbd>Enter</kbd> to confirm your selection.\n\n    - **Use arrow keys** to navigate and press <kbd>Space</kbd> to toggle individual repositories.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-repo-list.png\" alt-text=\"Screenshot of Modernize CLI that shows the repository list in the terminal.\" lightbox=\"../media/modernization-agent/assess-repo-list.png\":::\n\n1. Choose the execution mode. Select **Assess locally**.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-locally-option.png\" alt-text=\"Screenshot of Modernize CLI that shows the assess mode menu in the terminal.\" lightbox=\"../media/modernization-agent/assess-locally-option.png\":::\n\n1. Select the assessment domains to analyze. Choose from **Java upgrade** and **Cloud Readiness**, and then press <kbd>Enter</kbd>.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-domain-selection.png\" alt-text=\"Screenshot of Modernize CLI that shows the assessment domain selection in the terminal.\" lightbox=\"../media/modernization-agent/assess-domain-selection.png\":::\n\n1. Review and configure the assessment options. The configuration page shows options grouped by language and domain:\n\n    - **Java / GENERAL**: Analysis Coverage (Issue only, Issues & Technologies, or Issues, Technologies & Dependencies).\n    - **Java / JAVA UPGRADE**: Target Runtime (OpenJDK 11, 17, or 21).\n    - **Java / CLOUD READINESS**: Target Compute Services, Target Operating System, and Containerization.\n    - **.NET / CLOUD READINESS**: Target Compute Services.\n\n    Use the arrow keys to navigate, press <kbd>Enter</kbd> to change a value, or select **Continue** to proceed with the current settings.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-configuration.png\" alt-text=\"Screenshot of Modernize CLI that shows the assessment configuration page in the terminal.\" lightbox=\"../media/modernization-agent/assess-configuration.png\":::\n\n    > [!TIP]\n    > The recommended defaults work for most scenarios. You only need to change these settings if you have specific requirements, such as targeting a particular JDK version or Azure compute service.\n\n1. Enter the output path for assessment results or press <kbd>Enter</kbd> to accept the default.\n\n1. The agent automatically:\n\n    - Clones remote repositories (local path repositories are used directly).\n    - Runs assessment on each repository one by one.\n    - Generates individual assessment reports.\n\n        :::image type=\"content\" source=\"../media/modernization-agent/assess-individual-report-output.png\" alt-text=\"Screenshot of Modernize CLI that shows the output of individual assessment report generation in the terminal.\" lightbox=\"../media/modernization-agent/assess-individual-report-output.png\":::\n\n    - Creates an aggregated report.\n\n        :::image type=\"content\" source=\"../media/modernization-agent/assess-aggregated-report-output.png\" alt-text=\"Screenshot of Modernize CLI that shows the output of the aggregated report generation in the terminal.\" lightbox=\"../media/modernization-agent/assess-aggregated-report-output.png\":::\n\n1. When the assessment finishes, the agent automatically opens the aggregated report.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-repo-list-report.png\" alt-text=\"Screenshot of Modernize CLI that shows the content of the aggregated report.\" lightbox=\"../media/modernization-agent/assess-repo-list-report.png\":::\n\n### Interactive mode (delegating to Cloud Coding Agents)\n\nFirst, configure Cloud Coding Agents in each application repository. To configure Cloud Coding Agents, fork the sample repositories.\n\n#### Configuration for .NET applications\n\n##### Configure to run on Windows for .NET Framework applications\n\nBy default, the Copilot Coding Agent runs in an Ubuntu Linux environment. For .NET Framework applications, you need a Windows environment. To enable it, configure `.github/workflows/copilot-setup-steps.yaml` in the `main` branch of your application repository as shown in the following example:\n\n```yaml\n# Windows-based Copilot Setup Steps for .NET tasks\n# Note: Windows runners have firewall limitations that may affect some network operations\n# Use this workflow for .NET projects that require Windows-specific tooling\n\nname: \"Copilot Setup Step (Windows)\"\n\non:\n  workflow_dispatch:\n\njobs:\n  copilot-setup-steps:\n    runs-on: windows-latest\n    permissions:\n      contents: read\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v5\n```\n\nLearn more from: [Customizing Copilot's development environment with Copilot setup steps](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/customize-the-agent-environment#customizing-copilots-development-environment-with-copilot-setup-steps)\n\n##### Disable firewall \n\nDisable Copilot coding agent's integrated firewall in your repository settings as shown in the following image:\n\n:::image type=\"content\" source=\"../media/modernization-agent/disable-firewall-for-cloud-coding-agent.png\" alt-text=\"Screenshot of GitHub that shows the repository settings with the Enable firewall setting set to Off.\" lightbox=\"../media/modernization-agent/disable-firewall-for-cloud-coding-agent.png\":::\n\n#### Configuration for Java applications\n\nConfigure GitHub Copilot Modernization MCP Server in Cloud Coding Agent section of your repository settings as shown in the following example:\n\n```json\n{\n  \"mcpServers\": {\n    \"app-modernization\": {\n      \"type\": \"local\",\n      \"command\": \"npx\",\n      \"tools\": [\n        \"*\"\n      ],\n      \"args\": [\n        \"-y\",\n        \"@microsoft/github-copilot-app-modernization-mcp-server\"\n      ]\n    }\n  }\n}\n```\n\n:::image type=\"content\" source=\"../media/modernization-agent/mcp-config-cloud-coding-agent.png\" alt-text=\"Screenshot of GitHub that shows the repository Coding agent settings with the MCP configuration section highlighted.\" lightbox=\"../media/modernization-agent/mcp-config-cloud-coding-agent.png\":::\n\n#### Steps\n\n1. Run the modernization agent:\n\n   ```bash\n   modernize\n   ```\n\n1. Select **Assess** from the main menu.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-understand-application-menu.png\" alt-text=\"Screenshot of Modernize CLI that shows the main menu with the Assess option in the terminal.\" lightbox=\"../media/modernization-agent/assess-understand-application-menu.png\":::\n\n1. Choose how to specify your target repositories. Select **From a config file** to use a `repos.json` file, or select **Manual input** to enter GitHub repository URLs directly.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/source-type-selection.png\" alt-text=\"Screenshot of Modernize CLI that shows the source type selection in the terminal.\" lightbox=\"../media/modernization-agent/source-type-selection.png\":::\n\n1. If you selected **From a config file** and the `repos.json` file is detected at the default location, the agent automatically fills it in. Otherwise, enter the path to your config file and press <kbd>Enter</kbd>.\n\n1. All repositories are selected by default. Deselect any repositories you want to skip, and then press <kbd>Enter</kbd> to confirm your selection.\n\n    - **Use arrow keys** to navigate and press <kbd>Space</kbd> to toggle individual repositories.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-repo-list.png\" alt-text=\"Screenshot of Modernize CLI that shows the repository list in terminal.\" lightbox=\"../media/modernization-agent/assess-repo-list.png\":::\n\n1. Choose the execution mode. Select **Delegate to Cloud Agents**.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-delegate-cloud-coding-agents-option.png\" alt-text=\"Screenshot of Modernize CLI that shows the assess menu with the Delegate to Cloud Coding Agents option selected.\" lightbox=\"../media/modernization-agent/assess-delegate-cloud-coding-agents-option.png\":::\n\n    > [!NOTE]\n    > When you delegate to Cloud Coding Agents, the domain selection and assessment configuration steps aren't supported. The cloud agent uses the default configurations to run assessment.\n\n1. Enter the output path for assessment results or press <kbd>Enter</kbd> to accept the default.\n\n1. The agent automatically delegates assessment tasks for each repository to Cloud Coding Agents and executes them in the cloud in parallel.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-delegate-cloud-coding-agents-progress.png\" alt-text=\"Screenshot of Modernize CLI that shows the output of the progress of delegating assessment to Cloud Coding Agents in the terminal.\" lightbox=\"../media/modernization-agent/assess-delegate-cloud-coding-agents-progress.png\":::\n\n    The agent pulls the per-app assessment results back to local and generates the aggregated report locally.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/assess-aggregated-report-output.png\" alt-text=\"Screenshot of Modernize CLI that shows the Aggregating Assessment Reports in the terminal.\" lightbox=\"../media/modernization-agent/assess-aggregated-report-output.png\":::\n\n1. When the assessment finishes, the agent automatically opens the aggregated report.\n\n### Non-interactive mode (CLI)\n\nYou can also use non-interactive mode by specifying command arguments directly. Use the `modernize assess` command:\n\n**Assess locally using a repository config file:**\n\n```bash\nmodernize assess --source .github/modernize/repos.json\n```\n\n**Assess multiple repositories by specifying sources directly:**\n\n```bash\nmodernize assess --source https://github.com/org/repo1 --source https://github.com/org/repo2\n```\n\n**Assess by delegating to Cloud Coding Agents:**\n\n```bash\nmodernize assess --source .github/modernize/repos.json --delegate cloud --wait\n```\n\nFor more information, see [assess - CLI commands](cli-commands.md#assess).\n\n## Understanding the aggregated report\n\nThe aggregated report provides a comprehensive view across assessed applications as follows:\n\n### Dashboard\n\n- Snapshot of portfolio health: total apps, how many need upgrades, and aggregate blocker and issue counts.\n- Technology distribution: what frameworks are in use and how many apps share them.\n- Effort distribution: whether the overall migration is a small or large undertaking.\n\n### Recommendations\n\n- Azure Services: maps current dependencies to recommended Azure equivalents. Shared dependencies across apps are decided once, so you avoid per-app rework.\n- Target Platform: guides hosting choice, such as Azure Container Apps versus AKS, and surfaces consolidation opportunities.\n- Upgrade Path: identifies which apps need framework upgrades as a prerequisite, separating upgrade work from migration work.\n- Migration Waves: sequences apps by readiness and risk into phases. This approach enables early wins while harder apps are prepared in parallel.\n\n### Application assessment matrix\n\n- Quick overview for each application on aspects of framework, target platform, upgrade recommendation, issue breakdown (Mandatory, Potential, Optional), effort sizing, and more. \n- Links to individual app reports for drill-down when needed.\n\n## Troubleshooting batch assessment\n\n### Common problems\n\n**Repository access errors:**\n\n- Verify GitHub authentication by using `gh auth status`.\n- Make sure you have access to all repositories listed in `repos.json`.\n\n**Clone failures:**\n\n- Verify repository URLs in `repos.json` are correct and accessible.\n- Make sure you have the right access permissions for all repositories.\n- Check your network connectivity and VPN settings.\n\n**Assessment failures:**\n\n- Check if the repository contains valid Java or .NET projects.\n- Verify that build files exist, such as `pom.xml`, `build.gradle`, `*.csproj`, `*.sln`, or `*.slnx`.\n- Review error messages in the console output.\n\n**Cloud Coding Agent delegation problems:**\n\n- Make sure you have the right permissions to create GitHub Actions workflows.\n- Check GitHub Actions permissions and quota limits for your organization.\n- For .NET Framework apps, make sure Windows runner configuration is properly set.\n- Check your MCP server configuration.\n\n## Next steps\n\nAfter completing batch assessment, you can:\n\n**Continue the modernization workflow:**\n\n- [Run batch upgrade across repositories](batch-upgrade.md) - Apply consistent upgrades based on assessment findings.\n\n**Learn more:**\n\n- [Create custom skills for organization-specific patterns](customization.md).\n- [Learn about CLI commands](cli-commands.md).\n\n## Provide feedback\n\nYour input is important! If you have any feedback about batch assessment or the Modernization agent, [create an issue at the github-copilot-appmod repository](https://github.com/microsoft/github-copilot-appmod/issues/new?template=feedback-template.yml) or use the [GitHub Copilot modernization feedback form](https://aka.ms/ghcp-appmod/feedback).\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/modernization-agent/batch-upgrade.md",
    "content": "---\ntitle: Batch Upgrade with the GitHub Copilot Modernization Agent\ndescription: Learn how to use the GitHub Copilot modernization agent to upgrade multiple applications simultaneously with consistent modernization patterns.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jessiehuang\nms.topic: how-to\nai-usage: ai-assisted\nms.date: 04/17/2026\n---\n\n# Batch upgrade with the GitHub Copilot modernization agent\n\nBatch upgrade enables you to apply consistent modernization plans across multiple repositories simultaneously. This article shows you how to upgrade multiple applications efficiently at enterprise scale.\n\nBy using batch upgrade, you can:\n\n- **Upgrade multiple applications** simultaneously by using the same upgrade target.\n- **Apply consistent patterns** by using similar upgrade patterns across applications.\n- **Leverage parallel execution** when delegating to Cloud Coding Agents.\n\nBatch upgrade provides the following benefits:\n\n- Consistent execution:\n\n    - **Standardized approach**: Apply the same modernization patterns across all repositories.\n    - **Reduced variability**: Ensure consistent upgrade paths for similar applications.\n    - **Reusable strategies**: Use organization-specific skills across applications.\n\n- Scale and efficiency:\n\n    - **Parallel processing**: Use Cloud Coding Agents to process multiple repositories simultaneously.\n    - **Automated workflows**: Integrate with CI/CD pipelines for scheduled modernization.\n    - **Time savings**: Reduce total modernization time from weeks to hours.\n\n## Prerequisites\n\n- [Modernize CLI](quickstart.md).\n- A completed [batch assessment](batch-assess.md) (recommended but not required).\n- All repositories use the same programming language (Java or .NET).\n- Access to all repositories you want to upgrade.\n- GitHub authentication configured (`gh auth login`).\n\n> [!IMPORTANT]\n> All repositories in a batch upgrade must use the same programming language. If a repository uses a different language, the batch upgrade marks the repository as failed and skips it.\n\n## Configure repositories\n\nThe modernization agent supports multiple ways to specify the repositories you want to upgrade:\n\n- **Current folder**: Upgrade the project in your current working directory.\n- **Manual input**: Enter local directory paths or remote Git URLs directly.\n- **Repository config file**: Use a JSON config file that lists all repositories.\n\n### Repository config file\n\nFor batch operations across many repositories, create a JSON config file to list all repositories. For example, create it at `.github/modernize/repos.json` in your working directory, or provide a custom path.\n\n> [!TIP]\n> For sample repositories, fork them first and make sure you have admin permission to delegate the job to Cloud Coding Agents.\n\n**Simple format** (array of repositories):\n\n```json\n[\n  {\n    \"name\": \"PhotoAlbum-Java\",\n    \"url\": \"https://github.com/Azure-Samples/PhotoAlbum-Java.git\"\n  },\n  {\n    \"name\": \"ZavaSocialFrontEnd\",\n    \"url\": \"https://github.com/Azure-Samples/ZavaSocialFrontEnd\"\n  }\n]\n```\n\n**Full format** (with branch and local paths):\n\n```json\n{\n  \"repos\": [\n    {\n      \"name\": \"PhotoAlbum-Java\",\n      \"url\": \"https://github.com/Azure-Samples/PhotoAlbum-Java.git\",\n      \"branch\": \"main\"\n    },\n    {\n      \"name\": \"local-project\",\n      \"path\": \"/absolute/path/to/project\"\n    }\n  ]\n}\n```\n\nEach repo entry supports the following fields:\n\n| Field         | Description                                                          | Required               |\n|---------------|----------------------------------------------------------------------|------------------------|\n| `name`        | A friendly name for the repository (used in reports and dashboards). | Yes                    |\n| `url`         | Git clone URL in HTTPS or SSH format.                                | One of `url` or `path` |\n| `path`        | Absolute local directory path.                                       | One of `url` or `path` |\n| `branch`      | Branch to check out after cloning.                                   | No                     |\n| `description` | Human-readable description.                                          | No                     |\n\n> [!TIP]\n> You can include repositories from different organizations and use different authentication methods as long as you have access.\n\nThe modernization agent automatically detects the `repos.json` file at `.github/modernize/repos.json` when you select **From a config file** in interactive mode. You can also provide a custom path.\n\n## Choose your execution mode\n\nBatch upgrade supports two execution modes and two interaction methods:\n\n### Execution modes\n\n**Local execution**\n\n- **Best for**: Testing, smaller sets of repositories (1-5 repos), or when you prefer local control.\n- **How it works**: Processes repositories sequentially on your local machine.\n- **Setup required**: None beyond the basic prerequisites.\n- **Supports**: Both Git URL and local path repositories.\n\n**Cloud Coding Agent delegation**\n\n- **Best for**: Enterprise-scale operations, large portfolios (5+ repos), or parallel processing.\n- **How it works**: Submits tasks to GitHub Cloud Coding Agents for parallel execution in the cloud.\n- **Setup required**: MCP server configuration in each repository (configured during setup).\n- **Supports**: Only repositories with GitHub (github.com) URLs. Local paths and non-GitHub providers aren't supported.\n\n> [!IMPORTANT]\n> Cloud Coding Agent delegation requires repositories to have **GitHub (github.com) repository URLs**. Repositories specified with local paths or hosted on non-GitHub providers (GitLab, Azure DevOps) are skipped during cloud delegation. Use local execution for those repositories.\n\n> [!TIP]\n> By processing repositories in parallel, Cloud Coding Agent delegation can reduce total modernization time from hours to minutes.\n\n### Interaction methods\n\n**Interactive mode (TUI)**\n\n- Guided experience with menus and prompts.\n- Best for first-time users or when you want to review options.\n- Supports both local and cloud execution.\n\n**Non-interactive mode (CLI/headless)**\n\n- Command-line based, fully automated.\n- Best for CI/CD pipelines and automation.\n- Supports both local and cloud execution with `--delegate cloud` flag.\n\n> [!NOTE]\n> You can combine any execution mode with any interaction method. For example:\n>\n> - `modernize` → select Upgrade (interactive, local)\n> - `modernize` → select Upgrade → Delegate to Cloud Agents (interactive, cloud)\n> - `modernize upgrade \"Java 21\" --source ./repos.json` (non-interactive, local)\n> - `modernize upgrade \"Java 21\" --source ./repos.json --delegate cloud` (non-interactive, cloud)\n\n## How batch upgrade works\n\nThe batch upgrade workflow:\n\n1. **Language detection**: Automatically detects the project language (Java or .NET) from the first repository.\n1. **Plan creation**: Creates an upgrade plan based on your prompt or uses latest LTS versions.\n1. **Execution**: Applies the upgrade to each repository.\n1. **Validation**: Builds and validates changes for each repository.\n\n## Run batch upgrade\n\nAfter you configure your repositories and choose an execution mode, start the batch upgrade.\n\n### Interactive mode (upgrade locally)\n\n1. Run the modernization agent:\n\n   ```bash\n   modernize\n   ```\n\n1. Select **Upgrade** from the main menu.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/upgrade-menu.png\" alt-text=\"Screenshot of Modernize CLI that shows the main menu with the Upgrade option in the terminal.\" lightbox=\"../media/modernization-agent/upgrade-menu.png\":::\n\n1. Choose how to specify your target repositories. Select **From a config file** to use a `repos.json` file.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/source-type-selection.png\" alt-text=\"Screenshot of Modernize CLI that shows the source type selection in the terminal.\" lightbox=\"../media/modernization-agent/source-type-selection.png\":::\n\n    > [!TIP]\n    > You can also select **Manual input** to enter local paths or remote Git URLs directly, or **Current folder** to upgrade the project in your current directory.\n\n1. If the `repos.json` file is detected at the default location, the agent automatically fills it in. Otherwise, enter the path to your config file and press <kbd>Enter</kbd>.\n\n1. All repositories are selected by default. Deselect any repositories you want to skip, and then press <kbd>Enter</kbd> to confirm your selection.\n\n    - **Use arrow keys** to navigate and press <kbd>Space</kbd> to toggle individual repositories.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/upgrade-repo-list.png\" alt-text=\"Screenshot of Modernize CLI that shows the Choose repositories list in the terminal.\" lightbox=\"../media/modernization-agent/upgrade-repo-list.png\":::\n\n1. Choose the execution mode. Select **Upgrade locally**.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/upgrade-local-option.png\" alt-text=\"Screenshot of Modernize CLI that shows the Upgrade locally menu option in the terminal.\" lightbox=\"../media/modernization-agent/upgrade-local-option.png\":::\n\n1. Enter the upgrade target prompt (for example, `Java 21` or `.NET 10`) or press <kbd>Enter</kbd> to accept the default (latest LTS version).\n\n1. The agent automatically:\n\n    - Creates an upgrade plan based on your request.\n    - Applies the plan to each repository sequentially.\n    - Builds and validates each repository after changes.\n    - Displays progress and summary for each repository.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/upgrade-progress.png\" alt-text=\"Screenshot of Modernize CLI that shows the upgrade progress for each repository in the terminal.\" lightbox=\"../media/modernization-agent/upgrade-progress.png\":::\n\n### Interactive mode (delegating to Cloud Coding Agents)\n\n#### Prerequisites: Configure MCP server\n\nBefore running the upgrade, configure the GitHub Copilot Modernization MCP Server in each repository.\n\n**For Java applications**, add this configuration in the Cloud Coding Agent section of your repository settings:\n\n```json\n{\n  \"mcpServers\": {\n    \"app-modernization\": {\n      \"type\": \"local\",\n      \"command\": \"npx\",\n      \"tools\": [\n        \"*\"\n      ],\n      \"args\": [\n        \"-y\",\n        \"@microsoft/github-copilot-app-modernization-mcp-server\"\n      ]\n    }\n  }\n}\n```\n\n:::image type=\"content\" source=\"../media/modernization-agent/mcp-config-cloud-coding-agent.png\" alt-text=\"Screenshot of GitHub that shows the repository Coding agent settings pane with the MCP configuration section highlighted.\" lightbox=\"../media/modernization-agent/mcp-config-cloud-coding-agent.png\":::\n\n#### Steps\n\n1. Run the modernization agent:\n\n    ```bash\n    modernize\n    ```\n\n1. Select **Upgrade** from the main menu.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/upgrade-menu.png\" alt-text=\"Screenshot of Modernize CLI that shows the main menu with the Upgrade option in the terminal.\" lightbox=\"../media/modernization-agent/upgrade-menu.png\":::\n\n1. Choose how to specify your target repositories. Select **From a config file**.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/source-type-selection.png\" alt-text=\"Screenshot of Modernize CLI that shows the source type selection in the terminal.\" lightbox=\"../media/modernization-agent/source-type-selection.png\":::\n\n1. If the `repos.json` file is detected at the default location, the agent automatically fills it in. Otherwise, enter the path to your config file and press <kbd>Enter</kbd>.\n\n1. All repositories are selected by default. Deselect any repositories you want to skip, and then press <kbd>Enter</kbd> to confirm your selection. Use arrow keys to navigate and press <kbd>Space</kbd> to toggle individual repositories.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/upgrade-repo-list.png\" alt-text=\"Screenshot of Modernize CLI that shows the repository list in terminal.\" lightbox=\"../media/modernization-agent/upgrade-repo-list.png\":::\n\n1. Choose the execution mode. Select **Delegate to Cloud Agents**.\n\n    :::image type=\"content\" source=\"../media/modernization-agent/upgrade-delegate-option.png\" alt-text=\"Screenshot of Modernize CLI that shows the Delegate to Cloud Coding Agents menu option in the terminal.\" lightbox=\"../media/modernization-agent/upgrade-delegate-option.png\":::\n\n1. Enter the upgrade target prompt (for example, `Java 21`) or press <kbd>Enter</kbd> to accept the default.\n\n1. The agent automatically:\n\n    - Creates upgrade plans for each repository.\n    - Submits a Cloud Coding Agent job for each repository.\n    - Runs jobs independently in parallel in the cloud.\n    - Displays job IDs and PR URLs for each repository.\n\n        :::image type=\"content\" source=\"../media/modernization-agent/upgrade-cloud-coding-agent-progress.png\" alt-text=\"Screenshot of Modernize CLI that shows the progress of delegating upgrades to Cloud Coding Agents in the terminal.\" lightbox=\"../media/modernization-agent/upgrade-cloud-coding-agent-progress.png\":::\n\n    - Delegates tasks to AgentHQ for parallel execution.\n\n        :::image type=\"content\" source=\"../media/modernization-agent/upgrade-agent-headquarters-tasks.png\" alt-text=\"Screenshot of GitHub that shows the Agents pane with the upgrade tasks delegated to AgentHQ.\" lightbox=\"../media/modernization-agent/upgrade-agent-headquarters-tasks.png\":::\n\n    - Tracks progress for each individual task in real-time.\n\n        :::image type=\"content\" source=\"../media/modernization-agent/upgrade-cloud-coding-agent-status.png\" alt-text=\"Screenshot of GitHub that shows the Agents pane with progress tracking for individual Cloud Coding Agent upgrade tasks.\" lightbox=\"../media/modernization-agent/upgrade-cloud-coding-agent-status.png\":::\n\n    - Displays upgrade summary for each completed task.\n\n        :::image type=\"content\" source=\"../media/modernization-agent/upgrade-cloud-coding-agent-summary.png\" alt-text=\"Screenshot of GitHub that shows the Agents pane with the upgrade summary for individual Cloud Coding Agent tasks.\" lightbox=\"../media/modernization-agent/upgrade-cloud-coding-agent-summary.png\":::\n\n### Non-interactive mode (CLI)\n\nFor automation and CI/CD integration, use the `modernize upgrade` command:\n\n**Upgrade locally using a repository config file:**\n\n```bash\nmodernize upgrade \"Java 21\" --source .github/modernize/repos.json\n```\n\n**Upgrade multiple repositories by specifying sources directly:**\n\n```bash\nmodernize upgrade \"Java 21\" --source https://github.com/org/repo1 --source https://github.com/org/repo2\n```\n\n**Upgrade using Cloud Coding Agents:**\n\n```bash\nmodernize upgrade \"Java 21\" --source .github/modernize/repos.json --delegate cloud\n```\n\n> [!NOTE]\n> For batch headless execution and more CLI options, see the [Multi-repository configuration](cli-commands.md#multi-repository-configuration) section in the CLI commands reference.\n\n## Review results\n\nWhen the batch upgrade finishes:\n\n1. **Check the aggregated report** displayed in the terminal.\n\n1. **Review individual repository changes**:\n\n    ```bash\n    cd <repository-name>\n    git status\n    git diff\n    ```\n\n1. **Create pull requests** for successful upgrades:\n\n    ```bash\n    cd <repository-name>\n    gh pr create --title \"Upgrade to Java 21\" --body \"Automated upgrade by modernization agent\"\n    ```\n\n## Troubleshooting batch upgrades\n\n### Common problems\n\n**Repository access errors:**\n\n- Verify GitHub authentication by using `gh auth status`.\n- Make sure you have access to all repositories in `repos.json`.\n\n**Language mismatch errors:**\n\n- Make sure all repositories in `repos.json` use the same language (Java or .NET).\n- Create separate batch operations for different languages.\n\n**Clone failures:**\n\n- Verify repository URLs in `repos.json` are correct and accessible.\n- Make sure you have proper access permissions to all repositories.\n- Check network connectivity and VPN settings.\n\n**Build failures after upgrade:**\n\n- Review build error messages in the aggregated report.\n- Check if you need to update other dependencies.\n- Verify compatibility of third-party libraries with the new version.\n\n**Individual repository failures:**\n\n- The batch process continues even if individual repositories fail.\n- Review the aggregated report to identify failed repositories.\n- Check error logs for specific error messages.\n- Retry failed repositories individually.\n\n**Cloud Coding Agent failures:**\n\n- Check GitHub Actions permissions and quota limits.\n- For .NET Framework, make sure Windows runner configuration is properly set.\n\n## Next steps\n\nAfter completing batch upgrade, you can:\n\n**Continue improving:**\n\n- [Run batch assessment](batch-assess.md) - Reassess to verify improvements and identify new opportunities.\n- [Create custom skills for organization-specific patterns](customization.md) - Capture successful patterns for reuse.\n\n**Learn more:**\n\n- [Learn about CLI commands](cli-commands.md)\n\n## Provide feedback\n\nWe value your input! If you have any feedback about batch upgrade or the Modernization agent, [create an issue at the github-copilot-appmod repository](https://github.com/microsoft/github-copilot-appmod/issues/new?template=feedback-template.yml) or use the [GitHub Copilot modernization feedback form](https://aka.ms/ghcp-appmod/feedback).\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/modernization-agent/cicd-integration.md",
    "content": "---\ntitle: CI/CD Integration with Modernize CLI\ntitleSuffix: GitHub Copilot Modernization Agent\ndescription: Learn how to integrate the GitHub Copilot modernization agent into CI/CD pipelines using GitHub Actions and Azure Pipelines for automated application modernization.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jessiehuang\nms.topic: how-to\nai-usage: ai-assisted\nms.date: 03/11/2026\n---\n\n# CI/CD integration with Modernize CLI\n\nIntegrate the Modernize CLI into your CI/CD pipelines to automate application modernization at scale. This article shows you how to configure both GitHub Actions and Azure Pipelines to run the Modernize CLI on a schedule or on demand.\n\nRunning the Modernize CLI in a CI/CD pipeline enables you to:\n\n- **Automate upgrades** on a recurring schedule without manual intervention.\n- **Standardize modernization workflows** across your organization.\n- **Track changes** through dedicated branches and build artifacts.\n- **Review results** through pull requests, build summaries, and logs.\n\nThe sample pipelines in this article perform the following steps:\n\n1. Download and install the latest Modernize CLI.\n1. Run `modernize upgrade` with a configurable target (for example, `Java 21`).\n1. Commit any resulting changes and push them to a dedicated branch.\n1. Publish a results summary and upload CLI logs as build artifacts.\n\n## Prerequisites\n\n### [GitHub Actions](#tab/github-actions)\n\n- **A GitHub Copilot subscription**: Free, Pro, Pro+, Business, or Enterprise plan. See [Copilot plans](https://github.com/features/copilot/plans).\n- **A GitHub Personal Access Token (PAT)**: Create a token and store it as a repository secret named `GH_TOKEN`. See [Managing your personal access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens).\n\n### [Azure Pipelines](#tab/azure-pipelines)\n\n- **A GitHub Copilot subscription**: Free, Pro, Pro+, Business, or Enterprise plan. See [Copilot plans](https://github.com/features/copilot/plans).\n- **Permissions to create Azure Pipelines**: See [About permissions and security groups](/azure/devops/organizations/security/about-permissions).\n- **Build service permissions**: The pipeline's build service identity needs permissions to write to the repository. See [Run Git commands in a script](/azure/devops/pipelines/scripts/git-commands).\n  - Go to **Project Settings** > **Repositories**.\n  - Select the target repository and then select the **Security** tab.\n  - Search for the build service identity (for example, `Project Collection Build Service (<Organization>)`).\n  - Set the following permissions to **Allow**:\n    - **Create branch**\n    - **Contribute**\n    - **Read**\n- **A GitHub Personal Access Token (PAT)**: Create a token and store it as a pipeline variable named `GH_TOKEN`. See [Managing your personal access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) and [Define variables](/azure/devops/pipelines/process/variables).\n\n---\n\n## Configure the pipeline\n\n### [GitHub Actions](#tab/github-actions)\n\nCreate a workflow file at `.github/workflows/modernize.yml` in your repository with the following content:\n\n```yaml\nname: Modernization CLI\n\non:\n  workflow_dispatch:\n    inputs:\n      upgrade_target:\n        description: 'Upgrade target (e.g., Java 21)'\n        required: false\n        default: 'latest'\n  schedule:\n    # Run during off-peak hours: 2 AM UTC daily\n    - cron: '0 2 * * *'\n\npermissions:\n    id-token: write\n    contents: write\n    actions: read\n\njobs:\n  modernization:\n    runs-on: ubuntu-latest\n    env:\n      GH_TOKEN: ${{ secrets.GH_TOKEN }}\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n\n      - name: Download Modernize CLI\n        run: |\n          curl -fsSL https://raw.githubusercontent.com/microsoft/modernize-cli/main/scripts/install.sh | sh\n\n      - name: Run Modernize CLI to upgrade code\n        run: |\n          TARGET=\"${{ github.event.inputs.upgrade_target }}\"\n          if [ -z \"$TARGET\" ] || [ \"$TARGET\" = \"latest\" ]; then\n            modernize upgrade --no-tty\n          else\n            modernize upgrade \"$TARGET\" --no-tty\n          fi\n\n      - name: Push changes to result branch\n        id: push_changes\n        run: |\n          BRANCH_NAME=\"modernize-upgrade-${{ github.event.inputs.upgrade_target || 'latest' }}-$(date +%Y%m%d-%H%M%S)\"\n\n          git config user.name \"github-actions[bot]\"\n          git config user.email \"github-actions[bot]@users.noreply.github.com\"\n\n          git add -A\n          git reset .github/workflows\n          git diff --cached --quiet || git commit -m \"chore: apply Modernize CLI changes [skip ci]\"\n          git checkout -B \"$BRANCH_NAME\"\n          git push origin \"$BRANCH_NAME\"\n\n          echo \"BRANCH_NAME=$BRANCH_NAME\" >> $GITHUB_OUTPUT\n\n      - name: Display results summary\n        if: success()\n        run: |\n          cat >> $GITHUB_STEP_SUMMARY <<EOF\n          ## Modernization Complete\n\n          ### Branch Information\n          - **Result Branch**: \\`${{ steps.push_changes.outputs.BRANCH_NAME }}\\`\n          - **Target**: ${{ github.event.inputs.upgrade_target || 'latest' }}\n\n          ### Links\n          - [View Branch](https://github.com/${{ github.repository }}/tree/${{ steps.push_changes.outputs.BRANCH_NAME }})\n          - [Create PR](https://github.com/${{ github.repository }}/compare/main...${{ steps.push_changes.outputs.BRANCH_NAME }})\n          EOF\n\n      - name: Upload Modernize CLI logs\n        if: always()\n        uses: actions/upload-artifact@v4\n        with:\n          name: modernize-logs\n          path: ~/.modernize/logs/\n          if-no-files-found: warn\n```\n\n### [Azure Pipelines](#tab/azure-pipelines)\n\n1. Create a pipeline YAML file - for example, `azure-pipelines-modernize.yml` - in your repository with the following content.\n\n    ```yaml\n    name: Modernization CLI\n    \n    schedules:\n      - cron: '0 2 * * *'\n        displayName: 'Daily 2 AM UTC build'\n        branches:\n          include:\n            - main\n        always: true\n    \n    parameters:\n      - name: upgrade_target\n        displayName: 'Upgrade target (e.g., Java 21)'\n        type: string\n        default: 'latest'\n    \n    variables:\n      - name: BRANCH_NAME\n        value: modernize-${{ parameters.upgrade_target }}-$(Build.BuildId)\n    \n    pool:\n      vmImage: 'ubuntu-latest'\n    \n    jobs:\n      - job: modernization\n        displayName: 'Modernization CLI'\n        steps:\n          - checkout: self\n            persistCredentials: true\n    \n          - task: Bash@3\n            displayName: 'Download Modernize CLI'\n            inputs:\n              targetType: 'inline'\n              script: |\n                curl -fsSL https://raw.githubusercontent.com/microsoft/modernize-cli/main/scripts/install.sh | sh\n    \n          - task: Bash@3\n            displayName: 'Run Modernize CLI to upgrade code'\n            inputs:\n              targetType: 'inline'\n              script: |\n                TARGET=\"${{ parameters.upgrade_target }}\"\n                if [ -z \"$TARGET\" ] || [ \"$TARGET\" = \"latest\" ]; then\n                  modernize upgrade --no-tty\n                else\n                  modernize upgrade \"$TARGET\" --no-tty\n                fi\n            env:\n              GH_TOKEN: $(GH_TOKEN)\n    \n          - task: Bash@3\n            displayName: 'Push changes to result branch'\n            inputs:\n              targetType: 'inline'\n              script: |\n                git config user.name \"Azure Pipelines\"\n                git config user.email \"azuredevops@microsoft.com\"\n    \n                git add -A\n                git reset .github/workflows\n                git diff --cached --quiet || git commit -m \"chore: apply Modernize CLI changes [skip ci]\"\n                git checkout -B \"$(BRANCH_NAME)\"\n                git push origin \"$(BRANCH_NAME)\"\n    \n          - task: Bash@3\n            displayName: 'Display results summary'\n            condition: succeeded()\n            inputs:\n              targetType: 'inline'\n              script: |\n                mkdir -p \"$(Build.ArtifactStagingDirectory)/summary\"\n                cat > \"$(Build.ArtifactStagingDirectory)/summary/SUMMARY.md\" <<EOF\n                ## Modernization Complete\n    \n                ### Branch Information\n                - **Result Branch**: \\`$(BRANCH_NAME)\\`\n                - **Target**: ${{ parameters.upgrade_target }}\n    \n                ### Links\n                - [View Branch]($(Build.Repository.Uri)/tree/$(BRANCH_NAME))\n                - [View Build]($(System.CollectionUri)$(System.TeamProject)/_build/results?buildId=$(Build.BuildId))\n                EOF\n    \n          - task: PublishBuildArtifacts@1\n            displayName: 'Publish summary'\n            condition: succeeded()\n            inputs:\n              pathToPublish: '$(Build.ArtifactStagingDirectory)/summary'\n              artifactName: 'modernize-summary'\n            continueOnError: true\n    \n          - task: Bash@3\n            displayName: 'Prepare logs for upload'\n            condition: always()\n            inputs:\n              targetType: 'inline'\n              script: |\n                if [ -d \"$HOME/.modernize/logs\" ]; then\n                  mkdir -p \"$(Build.ArtifactStagingDirectory)/modernize-logs\"\n                  cp -r \"$HOME/.modernize/logs/\"* \"$(Build.ArtifactStagingDirectory)/modernize-logs/\" 2>/dev/null || true\n                fi\n            continueOnError: true\n    \n          - task: PublishBuildArtifacts@1\n            displayName: 'Upload Modernize CLI logs'\n            condition: always()\n            inputs:\n              pathToPublish: '$(Build.ArtifactStagingDirectory)/modernize-logs'\n              artifactName: 'modernize-logs'\n            continueOnError: true\n    ```\n\n1. Create an Azure Pipeline that references this YAML file. For more information, see [Create your first pipeline](/azure/devops/pipelines/create-first-pipeline).\n\n---\n\n## Workflow details\n\n### [GitHub Actions](#tab/github-actions)\n\nThe workflow includes two triggers:\n\n- **Manual dispatch** (`workflow_dispatch`): Run the workflow on demand from the **Actions** tab. Optionally specify an upgrade target such as `Java 21`.\n- **Scheduled** (`schedule`): Run automatically at 2 AM UTC daily. Adjust the cron expression to match your preferred schedule.\n\nEach run performs the following steps:\n\n1. Checks out the repository code.\n1. Downloads and installs the latest Modernize CLI.\n1. Runs `modernize upgrade` with the specified target or defaults to `latest`.\n1. Commits any changes and pushes them to a timestamped branch.\n1. Writes a summary with branch and PR links to the GitHub Actions step summary.\n1. Uploads Modernize CLI logs as a build artifact for troubleshooting.\n\n> [!NOTE]\n> The workflow resets `.github/workflows` before committing to avoid accidentally modifying the workflow file itself.\n\n### [Azure Pipelines](#tab/azure-pipelines)\n\nThe pipeline includes two triggers:\n\n- **Manual run**: Run the pipeline on demand from Azure DevOps. Specify an upgrade target parameter such as `Java 21`.\n- **Scheduled** (`schedules`): Run automatically at 2 AM UTC daily on the `main` branch. Adjust the cron expression to match your preferred schedule.\n\nEach run performs the following steps:\n\n1. Checks out the repository with persisted credentials for pushing changes.\n1. Downloads and installs the latest Modernize CLI.\n1. Runs `modernize upgrade` with the specified target or defaults to `latest`.\n1. Commits any changes and pushes them to a result branch named with the build ID.\n1. Publishes a summary markdown file as a build artifact.\n1. Uploads Modernize CLI logs as a build artifact for troubleshooting.\n\n---\n\n## Run the pipeline\n\n### [GitHub Actions](#tab/github-actions)\n\nTo trigger the workflow manually:\n\n1. Go to your repository on GitHub.\n1. Select the **Actions** tab.\n1. Select **Modernization CLI** from the workflow list.\n1. Select **Run workflow**.\n1. Optionally enter an upgrade target, and then select **Run workflow** to confirm.\n\nAfter the workflow finishes, review the step summary for links to the result branch and create a pull request to merge the changes.\n\n### [Azure Pipelines](#tab/azure-pipelines)\n\nTo trigger the pipeline manually:\n\n1. Go to your Azure DevOps project.\n1. Select **Pipelines** from the left navigation.\n1. Select the **Modernization CLI** pipeline.\n1. Select **Run pipeline**.\n1. Optionally update the **Upgrade target** parameter, and then select **Run**.\n\nAfter the pipeline finishes, review the published artifacts for the summary and logs. Then create a pull request from the result branch.\n\n---\n\n## Troubleshooting\n\n### Common problems\n\n**Authentication errors:**\n\n- Verify the `GH_TOKEN` secret or variable is set correctly with a valid GitHub Personal Access Token.\n- Ensure the token has the required scopes for GitHub Copilot access.\n\n**No changes detected:**\n\n- The Modernize CLI might determine that no changes are needed for the specified target.\n- Review the uploaded logs artifact for details on the assessment.\n\n**Push failures (Azure Pipelines):**\n\n- Confirm the build service identity has **Create branch**, **Contribute**, and **Read** permissions on the repository.\n- See [Run Git commands in a script](/azure/devops/pipelines/scripts/git-commands) for detailed setup instructions.\n\n**Modernize CLI download errors:**\n\n- Verify the runner has internet access to <https://github.com>.\n- Check for proxy or firewall restrictions that might block the download.\n\n## Next steps\n\n- [Learn about CLI commands](cli-commands.md)\n- [Run batch assessment](batch-assess.md)\n- [Run batch upgrade](batch-upgrade.md)\n- [Create custom skills for organization-specific patterns](customization.md)\n\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/modernization-agent/cli-commands.md",
    "content": "---\ntitle: GitHub Copilot Modernization Agent CLI Commands\ndescription: Complete reference for GitHub Copilot modernization agent CLI commands, including interactive and non-interactive modes.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jessiehuang\nms.topic: reference\nai-usage: ai-assisted\nms.date: 04/17/2026\n---\n\n# GitHub Copilot modernization agent CLI commands\n\nThe GitHub Copilot modernization agent provides both interactive and non-interactive modes for application modernization.\n\n## Command modes\n\n### Interactive mode\n\nLaunch the interactive Text User Interface (TUI) for guided modernization:\n\n```bash\nmodernize\n```\n\nThe interactive mode provides:\n\n- Menu-driven navigation through the modernization workflow.\n- Flexible source selection: current folder, manual input (local paths or Git URLs), or repository config files.\n- Visual plan and progress indicators.\n- Guided prompts for configuration options, including assessment domains and parameters.\n- Multi-repository selection interface.\n\n### Non-interactive mode\n\nExecute specific commands directly for automation and scripting:\n\n```bash\nmodernize <command> [options]\n```\n\nUse non-interactive mode when:\n\n- Integrating with CI/CD pipelines.\n- Automating batch operations.\n- Scripting modernization workflows.\n- Running in headless environments.\n\n## Global options\n\nAll commands support these global options:\n\n| Option         | Description                                   |\n|----------------|-----------------------------------------------|\n| `--help`, `-h` | Displays help information.                    |\n| `--no-tty`     | Disables interactive prompts (headless mode). |\n\n## Commands\n\n### assess\n\nRuns an assessment and generates a comprehensive analysis report.\n\n#### Syntax\n\n```bash\nmodernize assess [options]\n```\n\n#### Options\n\n| Option                   | Description                                                                                                                                                 | Default                         |\n|--------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------|\n| `--source <source>`      | Source to assess (repeatable). Accepts local paths, Git URLs, or a JSON config file path. Use multiple `--source` flags to specify several repositories.    | `.` (current directory)         |\n| `--output-path <path>`   | A custom output path for assessment results.                                                                                                                | `.github/modernize/assessment/` |\n| `--issue-url <url>`      | A GitHub issue URL to update with the assessment summary.                                                                                                   | None                            |\n| `--format <format>`      | Output format for assessment reports: `html` or `markdown`.                                                                                                 | `html`                          |\n| `--assess-config <path>` | Path to an assessment configuration YAML file that overrides default assessment parameters such as target runtime, compute services, and analysis coverage. | Auto-discovered or defaults     |\n| `--model <model>`        | The LLM model to use.                                                                                                                                       | `claude-sonnet-4.6`             |\n| `--delegate <delegate>`  | The execution mode: `local` (this machine) or `cloud` (Cloud Coding Agent).                                                                                 | `local`                         |\n| `--wait`                 | Waits for the delegated tasks to complete and generate results (only valid with `--delegate cloud`).                                                        | Disabled                        |\n| `--force`                | Forces restart delegation, ignoring ongoing tasks (only valid with `--delegate cloud`).                                                                     | Disabled                        |\n\n#### Examples\n\nBasic assessment of current directory:\n\n```bash\nmodernize assess\n```\n\nAssess with custom output location:\n\n```bash\nmodernize assess --output-path ./reports/assessment\n```\n\nAssess and update GitHub issue with results:\n\n```bash\nmodernize assess --issue-url https://github.com/org/repo/issues/123\n```\n\nAssess specific project directory:\n\n```bash\nmodernize assess --source /path/to/project\n```\n\nAssess multiple repositories by using a config file:\n\n```bash\nmodernize assess --source .github/modernize/repos.json\n```\n\nAssess multiple repositories by specifying sources directly:\n\n```bash\nmodernize assess --source https://github.com/org/repo1 --source https://github.com/org/repo2\n```\n\nAssess and output reports in markdown format:\n\n```bash\nmodernize assess --format markdown\n```\n\n#### Output\n\nThe assessment generates:\n\n- **Report files**: Detailed analysis in JSON, MD, and HTML formats.\n- **Summary**: Key findings and recommendations.\n- **Issue updates** (if you provide `--issue-url`): GitHub issue comment with summary.\n\n### plan create\n\nCreates a modernization plan based on a natural language prompt describing your modernization goals.\n\n#### Syntax\n\n```bash\nmodernize plan create <prompt> [options]\n```\n\n#### Arguments\n\n| Argument   | Description                                                           |\n|------------|-----------------------------------------------------------------------|\n| `<prompt>` | A natural-language description of the modernization goals (required). |\n\n#### Options\n\n| Option               | Description                                               | Default              |\n|----------------------|-----------------------------------------------------------|----------------------|\n| `--source <path>`    | The path to the application source code.                  | Current directory    |\n| `--plan-name <name>` | The name for the modernization plan.                      | `modernization-plan` |\n| `--language <lang>`  | The programming language (`java`, `dotnet`, or `python`). | Auto-detected        |\n| `--overwrite`        | Overwrites an existing plan with the same name.           | Disabled             |\n| `--model <model>`    | The LLM model to use.                                     | `claude-sonnet-4.6`  |\n\n#### Examples\n\nGenerate a migration plan:\n\n```bash\nmodernize plan create \"migrate from oracle to azure postgresql\"\n```\n\nGenerate an upgrade plan with custom name:\n\n```bash\nmodernize plan create \"upgrade to spring boot 3\" --plan-name spring-boot-upgrade\n```\n\nGenerate a deployment plan:\n\n```bash\nmodernize plan create \"deploy the app to azure container apps\" --plan-name deploy-to-aca\n```\n\nFull options example:\n\n```bash\nmodernize plan create \"upgrade to .NET 8\" \\\n    --source /path/to/project \\\n    --plan-name dotnet8-upgrade \\\n    --language dotnet \\\n    --issue-url https://github.com/org/repo/issues/456\n```\n\n#### Prompt examples\n\n**Framework upgrades:**\n\n- `upgrade to spring boot 3`\n- `upgrade to .NET 10`\n- `upgrade to JDK 21`\n- `migrate from spring boot 2 to spring boot 3`\n\n**Database migrations:**\n\n- `migrate from oracle to azure postgresql`\n- `migrate from SQL Server to azure cosmos db`\n- `switch from MySQL to azure database for mysql`\n\n**Cloud migrations:**\n\n- `migrate from on-premises to azure`\n- `containerize and deploy to azure container apps`\n- `migrate from rabbitmq to azure service bus`\n\n**Deployment:**\n\n- `deploy to azure app service`\n- `deploy to azure kubernetes service`\n- `set up CI/CD pipeline for azure`\n\n#### Output\n\nThe command generates:\n\n- **Plan file** (`.github/modernize/{plan-name}/plan.md`): Detailed modernization strategy including:\n  - Context and goals\n  - Approach and methodology\n  - Clarifications\n\n- **Task list** (`.github/modernize/{plan-name}/tasks.json`): Structured breakdown of executable tasks with:\n  - Task descriptions\n  - Skills to use\n  - Success criteria\n\n> [!TIP]\n> You can manually edit both `plan.md` and `tasks.json` after generation to customize the approach before execution.\n\n### plan execute\n\nExecutes a modernization plan created by `modernize plan create`.\n\n#### Syntax\n\n```bash\nmodernize plan execute [prompt] [options]\n```\n\n#### Arguments\n\n| Argument   | Description                                                                           |\n|------------|---------------------------------------------------------------------------------------|\n| `[prompt]` | The optional natural language instructions for execution (for example, \"skip tests\"). |\n\n#### Options\n\n| Option                  | Description                                                                 | Default              |\n|-------------------------|-----------------------------------------------------------------------------|----------------------|\n| `--source <path>`       | The path to the application source code.                                    | Current directory    |\n| `--plan-name <name>`    | The name of the plan to execute.                                            | `modernization-plan` |\n| `--language <lang>`     | The programming language (`java` or `dotnet`).                              | Auto-detected        |\n| `--model <model>`       | The LLM model to use.                                                       | `claude-sonnet-4.6`  |\n| `--delegate <delegate>` | The execution mode: `local` (this machine) or `cloud` (Cloud Coding Agent). | `local`              |\n| `--force`               | Forces execution even when a CCA job is in progress.                        | Disabled             |\n\n#### Examples\n\nExecute the most recent plan interactively:\n\n```bash\nmodernize plan execute\n```\n\nExecute a specific plan:\n\n```bash\nmodernize plan execute --plan-name spring-boot-upgrade\n```\n\nExecute with extra instructions:\n\n```bash\nmodernize plan execute \"skip the test\" --plan-name spring-boot-upgrade\n```\n\nExecute in headless mode for CI/CD:\n\n```bash\nmodernize plan execute --plan-name spring-boot-upgrade --no-tty\n```\n\n#### Execution behavior\n\nDuring execution, the agent:\n\n1. **Loads the plan**: Reads the plan and task list from `.github/modernization/{plan-name}/`\n\n1. **Executes tasks**: Processes each task in the task list sequentially:\n\n    - Applies code transformations.\n    - Validates builds after changes.\n    - Scans for CVEs.\n    - Commits changes with descriptive messages.\n\n1. **Generates summary**: Provides a report of all changes and results.\n\n#### Output\n\n- **Commit history**: Detailed commits for each task executed.\n- **Summary report**: Overview of changes, successes, and any problems encountered.\n- **Build validation**: Confirmation that the application builds successfully.\n- **CVE report**: Security vulnerabilities identified and addressed.\n\n### upgrade\n\nRuns an end-to-end upgrade workflow - plan, and execute - in a single command.\n\n#### Syntax\n\n```bash\nmodernize upgrade [prompt] [options]\n```\n\n#### Arguments\n\n| Argument   | Description                                                                                      |\n|------------|--------------------------------------------------------------------------------------------------|\n| `[prompt]` | The target version, such as `Java 17`, `Spring Boot 3.2`, `.NET 10`. Defaults to the latest LTS. |\n\n#### Options\n\n| Option                  | Description                                                                                                                                               | Default                 |\n|-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|\n| `--source <source>`     | Source to upgrade (repeatable). Accepts local paths, Git URLs, or a JSON config file path. Use multiple `--source` flags to specify several repositories. | `.` (current directory) |\n| `--delegate <delegate>` | The execution mode: `local` (this machine) or `cloud` (Cloud Coding Agent).                                                                               | `local`                 |\n| `--model <model>`       | The LLM model to use.                                                                                                                                     | `claude-sonnet-4.6`     |\n\n#### Examples\n\nRun `upgrade` on the current directory:\n\n```bash\nmodernize upgrade \"Java 17\"\n```\n\n```bash\nmodernize upgrade \".NET 10\"\n```\n\nRun `upgrade` on a specific project:\n\n```bash\nmodernize upgrade \"Java 17\" --source /path/to/project\n```\n\nRun `upgrade` by using the Cloud Coding Agent:\n\n```bash\nmodernize upgrade \"Java 17\" --delegate cloud\n```\n\nUpgrade multiple repositories by using a config file:\n\n```bash\nmodernize upgrade \"Java 21\" --source .github/modernize/repos.json\n```\n\nUpgrade multiple repositories by specifying sources directly:\n\n```bash\nmodernize upgrade \"Java 21\" --source https://github.com/org/repo1 --source https://github.com/org/repo2\n```\n\n### help\n\nProvides help and information commands.\n\n#### Syntax\n\n```bash\nmodernize help [command]\n```\n\n#### Commands\n\n| Command  | Description                                       |\n|----------|---------------------------------------------------|\n| `models` | Lists available LLM models and their multipliers. |\n\n#### Examples\n\nList available models:\n\n```bash\nmodernize help models\n```\n\n## Configure the CLI\n\nBy using the modernization agent, you can customize application behavior through JSON files and environment variables.\n\n### Environment variables\n\nSet environment variables to override all other configuration scopes:\n\n| Variable                      | Description                                                            | Default             |\n|-------------------------------|------------------------------------------------------------------------|---------------------|\n| `MODERNIZE_LOG_LEVEL`         | The logging level (`none`, `error`, `warning`, `info`, `debug`, `all`) | `info`              |\n| `MODERNIZE_MODEL`             | The LLM model to use.                                                  | `claude-sonnet-4.6` |\n| `MODERNIZE_COLLECT_TELEMETRY` | Enable or disable telemetry collection.                                | `true`              |\n\nExample:\n\n```bash\nexport MODERNIZE_LOG_LEVEL=debug\nexport MODERNIZE_MODEL=claude-sonnet-4.6\nmodernize assess\n```\n\n### User configuration\n\nStore user-specific preferences in `~/.modernize/config.json` or repository-wide settings in `.github/modernize/config.json`.\n\n```json\n{\n  \"model\": \"claude-sonnet-4.6\",\n  \"log_level\": \"info\",\n  \"trusted_folders\": [\n    \"/path/to/trusted/project\",\n  ]\n}\n```\n\nThe `trusted_folders` property specifies the folders that are trusted to use LLM in interactive mode.\n\n> [!NOTE]\n> Environment variables take the highest precedence, followed by user configuration, and then repository configuration. Use environment variables for CI/CD overrides and user configuration for personal preferences.\n\n### Multi-repository configuration\n\nYou can provide multiple sources to the CLI in several ways:\n\n- **Repository config file**: Create a `.github/modernize/repos.json` file that lists all repositories, then pass it with `--source`.\n- **Multiple `--source` flags**: Specify local paths or Git URLs directly on the command line.\n- **Interactive mode**: Select sources through the TUI (current folder, manual input, or repository config).\n\n#### Repository config file\n\nCreate a `.github/modernize/repos.json` file to define your repository list. The config supports two formats:\n\n**Simple format** (array of repositories):\n\n```json\n[\n  {\n    \"name\": \"PhotoAlbum-Java\",\n    \"url\": \"https://github.com/Azure-Samples/PhotoAlbum-Java.git\"\n  },\n  {\n    \"name\": \"PhotoAlbum\",\n    \"url\": \"https://github.com/Azure-Samples/PhotoAlbum.git\"\n  }\n]\n```\n\n**Full format** (with branch and local paths):\n\n```json\n{\n  \"repos\": [\n    {\n      \"name\": \"PhotoAlbum-Java\",\n      \"url\": \"https://github.com/Azure-Samples/PhotoAlbum-Java.git\",\n      \"branch\": \"main\"\n    },\n    {\n      \"name\": \"local-project\",\n      \"path\": \"/absolute/path/to/project\"\n    }\n  ]\n}\n```\n\nEach repo entry supports the following fields:\n\n| Field         | Description                         | Required               |\n|---------------|-------------------------------------|------------------------|\n| `name`        | A friendly name for the repository. | Yes                    |\n| `url`         | Git clone URL (HTTPS or SSH).       | One of `url` or `path` |\n| `path`        | Absolute local directory path.      | One of `url` or `path` |\n| `branch`      | Branch to check out after cloning.  | No                     |\n| `description` | Human-readable description.         | No                     |\n\n**Full format with app grouping** (optional, for organized reporting):\n\nYou can add an `apps[]` section to group repositories into logical applications. When apps are defined, the aggregated report organizes results by application and supports report distribution.\n\n```json\n{\n  \"repos\": [\n    {\n      \"name\": \"PhotoAlbum-Java\",\n      \"url\": \"https://github.com/Azure-Samples/PhotoAlbum-Java.git\",\n      \"branch\": \"main\"\n    },\n    {\n      \"name\": \"PhotoAlbum\",\n      \"url\": \"https://github.com/Azure-Samples/PhotoAlbum.git\"\n    }\n  ],\n  \"apps\": [\n    {\n      \"identifier\": \"photo-app\",\n      \"description\": \"Photo management application\",\n      \"repos\": [\"PhotoAlbum-Java\"],\n      \"output\": {\n        \"type\": \"local\",\n        \"path\": \"/path/to/reports/photo-app\"\n      }\n    }\n  ]\n}\n```\n\nEach app entry supports:\n\n| Field         | Description                                                        | Required |\n|---------------|--------------------------------------------------------------------|----------|\n| `identifier`  | Unique display name of the application.                            | Yes      |\n| `description` | Human-readable description.                                        | No       |\n| `repos`       | List of repo names that belong to this app.                        | Yes      |\n| `output`      | Where to distribute this app's assessment report after generation. | No       |\n\nThe `output` field supports the following distribution types:\n\n| Type    | Description                                                                                  | Required fields |\n|---------|----------------------------------------------------------------------------------------------|-----------------|\n| `local` | Copy reports to a local directory.                                                           | `path`          |\n| `git`   | Push reports to a Git repository. URL format: `https://github.com/org/repo.git#branch:path`. | `url`           |\n\n> [!IMPORTANT]\n> Cloud Coding Agent delegation (`--delegate cloud`) requires repositories to have **GitHub (github.com) repository URLs**. Local path repositories and non-GitHub providers (GitLab, Azure DevOps) aren't supported for cloud delegation and are skipped.\n\nThen use `--source` to pass the config file path:\n\nAssess all repositories locally:\n\n```bash\nmodernize assess --source .github/modernize/repos.json\n```\n\nAssess all repositories by using the Cloud Coding Agent:\n\n```bash\nmodernize assess --source .github/modernize/repos.json --delegate cloud\n```\n\nUpgrade all repositories by using the Cloud Coding Agent:\n\n```bash\nmodernize upgrade --source .github/modernize/repos.json --delegate cloud\n```\n\n#### Multiple sources on the command line\n\nYou can also specify multiple sources directly:\n\n```bash\nmodernize assess --source https://github.com/org/repo1 --source https://github.com/org/repo2\n```\n\n```bash\nmodernize upgrade \"Java 21\" --source ./project-a --source ./project-b\n```\n\n## Next steps\n\n- [Batch assessment: Assess multiple applications](batch-assess.md)\n- [Batch upgrade: Upgrade multiple applications](batch-upgrade.md)\n- [Create custom skills for your organization](customization.md)\n- [Return to overview](overview.md)\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/modernization-agent/customization.md",
    "content": "---\ntitle: Customize the GitHub Copilot Modernization Agent for Migrations\ndescription: Learn how to customize the GitHub Copilot modernization agent with custom skills to encode organization-specific migration patterns. Start now.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jessiehuang\nms.topic: how-to\nai-usage: ai-assisted\nms.date: 03/11/2026\n---\n\n# Customize the GitHub Copilot modernization agent\n\nThe GitHub Copilot modernization agent supports custom skills that you can use to define organization-specific migration patterns, internal library usage, and coding standards. By using these custom skills, you can ensure consistent modernization across your organization while using proprietary knowledge.\n\n## What are custom skills?\n\nCustom skills follow the [agent skills specification](https://agentskills.io/specification) to teach the modernization agent how to perform specific migration tasks using your organization's patterns and libraries. When you create a modernization plan, the agent automatically detects and applies relevant custom skills based on your migration prompt.\n\nCustom skills are useful for:\n\n- **Internal library migrations**: Switching to organization-specific SDKs or frameworks.\n- **Re-use migration patterns**: Capturing and reusing successful migration patterns.\n\n## Custom skill structure\n\nDefine each custom skill in a `SKILL.md` file with:\n\n- **YAML front matter**: Metadata for skill detection.\n- **Overview**: Description of the migration scenario.\n- **Steps**: Detailed instructions for the agent.\n- **Sample code**: Concrete examples demonstrating the migration.\n\n## Create a custom skill\n\n### Step 1: Create the skill directory\n\nCreate a new folder under `.github/skills/` in your repository with a descriptive name:\n\n```bash\nmkdir -p .github/skills/my-migration-pattern\n```\n\n### Step 2: Write the SKILL.md file\n\nCreate `.github/skills/my-migration-pattern/SKILL.md` with the structure shown in the following section.\n\n#### Required front matter fields\n\n```yaml\n---\nname: my-migration-pattern\ndescription: A concrete description of what this skill helps migrate\n---\n```\n\n**Important**: The `description` field is critical. The agent uses it to determine when to apply the skill based on the user's migration prompt. Make it specific and accurate.\n\nGood descriptions:\n\n- ✅ \"Migrate from RabbitMQ with AMQP to Azure Service Bus for messaging\"\n- ✅ \"Replace direct JDBC calls with Spring Data repositories\"\n\nBad descriptions:\n\n- ❌ \"Messaging migration\" (too vague)\n- ❌ \"Update libraries\" (not specific)\n- ❌ \"Improve code\" (unclear goal)\n\n### Step 3: Provide examples and migration verification checks\n\nInclude code examples and verification checks to guide the agent:\n\n- **Code changes**: code snippets showing the migrated implementation using the new approach.\n- **Configuration changes**: updates to properties, XML, or other config files.\n- **Dependency changes**: Maven, Gradle, or NuGet updates required for the migration.\n- **Verification checks**: criteria the agent should validate after applying the migration.\n\nYou can also provide resource files in the skill directory and tell the agent how to use them in the content of the `SKILL.md` file.\n\n## Use custom skills\n\n### Automatic detection\n\nWhen you create a modernization plan, the agent automatically:\n\n1. Scans `.github/skills/` for custom skills.\n1. Compares your migration prompt with skill descriptions.\n1. Incorporates relevant skills into the plan.\n1. Uses skill to guide code transformations.\n\nExample:\n\n```bash\n# Agent will automatically detect and use the RabbitMQ skill\nmodernize plan create \"migrate from rabbitmq to azure service bus\"\n```\n\n### Manual verification\n\nTo verify which skills are detected:\n\n1. Create a plan with your prompt.\n\n1. Review `.github/modernization/{plan-name}/tasks.json`.\n\n1. Look for references to your custom skills.\n\n    ```json\n    \"skills\": [\n        {\n          \"name\": \"your-skill-name\",\n          \"location\": \"project\"\n        }\n    ]\n    ```\n\nIf a skill isn't detected:\n\n- Refine the skill `description` to better match your prompt.\n- Make the prompt more specific.\n- Ensure `SKILL.md` is properly formatted.\n\n## Sample repository\n\nFor a complete example, see the [NewsFeedSite sample repository](https://github.com/Azure-Samples/NewsFeedSite), which includes:\n\n- Custom skill for RabbitMQ to Azure Service Bus migration.\n- Demonstrates using internal JDK libraries.\n- Shows proper skill structure and formatting.\n\nClone and explore:\n\n```bash\ngit clone https://github.com/Azure-Samples/NewsFeedSite.git\ncd NewsFeedSite\nls -la .github/skills/\nmodernize plan create \"migrate from rabbitmq to azure service bus\"\n```\n\n## Troubleshooting\n\n### Skill not detected\n\n**Problem**: The agent doesn't use your custom skill.\n\n**Solutions**:\n\n- Check that the skill name in the YAML front matter doesn't contain spaces. Use hyphens instead (for example, `my-custom-skill` not `my custom skill`).\n- Verify that the `description` matches your prompt keywords.\n- Check the YAML front matter syntax.\n- Ensure that `SKILL.md` is in `.github/skills/{skill-name}/`.\n- Make your migration prompt more specific.\n\n## Next steps\n\n- [Quick start: Get started with the modernization agent](quickstart.md)\n- [Batch assessment: Assess multiple applications](batch-assess.md)\n- [Batch upgrade: Upgrade multiple applications](batch-upgrade.md)\n- [CLI reference](cli-commands.md)\n- [Return to overview](overview.md)\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/modernization-agent/infra-deployment.md",
    "content": "---\ntitle: Prepare Infrastructure and Deploy Applications\ntitleSuffix: GitHub Copilot Modernization Agent\ndescription: Learn how to use the GitHub Copilot modernization agent to prepare Azure infrastructure, containerize, and deploy your application. Get started now.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: honc\nms.topic: how-to\nai-usage: ai-assisted\nms.date: 03/11/2026\n---\n\n# Prepare infrastructure and deploy applications with the GitHub Copilot modernization agent\n\nThe GitHub Copilot modernization agent supports infrastructure provisioning, containerization, and deployment. These capabilities follow the same **plan create → plan execute** model used throughout the agent.\n\nThe workflow consists of two phases:\n\n1. **Infrastructure preparation**: Generate and provision Azure infrastructure.\n1. **Containerization and deployment**: Containerize and deploy the application.\n\n> [!NOTE]\n> These two phases are independent. You can run them together or use each phase separately. For example, skip infrastructure preparation if you already have an environment provisioned, or prepare infrastructure now and deploy later.\n\n## Prerequisites\n\n- **An Azure subscription**: An active Azure subscription for infrastructure provisioning.\n- **Modernize CLI**: Follow the [quickstart](quickstart.md) to install and authenticate.\n\n## Phase 1: Infrastructure preparation\n\nThe modernization agent creates a plan to provision Azure infrastructure based on the inputs you provide. This capability includes the ability to design an [Azure landing zone](/azure/cloud-adoption-framework/ready/landing-zone/) tailored to your application, covering networking, identity, governance, and security foundations.\n\n### Inputs\n\nThe agent can use various inputs to inform the infrastructure plan:\n\n- **Application source code**: Codebase analysis to determine technology stack, dependencies, and resource requirements.\n- **Assessment reports**: Reports from `modernize assess`, Azure Migrate, or other migration and assessment tools.\n- **Architecture diagrams**: Pre-migration architecture diagrams or design documents in the repository.\n- **Compliance and security requirements**: Organizational policies, security standards, or landing zone guidelines, provided as documents in the repository or as natural language in your prompt.\n\n### Create the infrastructure plan\n\nUse `modernize plan create` with a prompt describing your infrastructure needs:\n\n```bash\nmodernize plan create \"help create azure infrastructure for my app\" --plan-name infra-setup\n```\n\nThe agent generates a plan that includes a proposed Azure architecture and a detailed resource list to provision. By default, the plan covers both IaC file generation and resource provisioning. You can request only IaC file generation through your prompt.\n\n> [!TIP]\n> Combine different inputs and preferences in your prompt. For example:\n>\n> - `\"create an Azure landing zone tailored to my application's architecture and requirements\"`\n> - `\"create azure infrastructure based on the assessment report, following our compliance policies in docs/security-requirements.md\"`\n> - `\"generate Bicep files for the target architecture in the design doc, don't provision yet\"`\n> - `\"provision azure resources based on the architecture diagram and assessment findings\"`\n\n### Review the plan\n\nReview the output files before execution:\n\n- **Plan file** (`.github/modernize/infra-setup/plan.md`): Infrastructure strategy and proposed architecture.\n- **Task list** (`.github/modernize/infra-setup/tasks.json`): Specific tasks the agent performs.\n\nYou can edit both files to adjust resource configurations or modify the approach before execution.\n\n### Execute the infrastructure plan\n\nExecute the plan:\n\n```bash\nmodernize plan execute --plan-name infra-setup\n```\n\n\n### Verify infrastructure\n\nReview the generated infrastructure code and confirm the Azure resources through the Azure portal or Azure CLI.\n\n```bash\ngit status\ngit diff main\n```\n\n## Phase 2: Containerization and deployment\n\nUse a second plan to containerize your application and deploy it.\n\n> [!NOTE]\n> This phase requires application source code that you already migrated or upgraded. Complete your code modernization before proceeding with containerization and deployment.\n\n### Create the deployment plan\n\n```bash\nmodernize plan create \"containerize and deploy my app to azure, subscription: <sub-id>, resource group: <rg-name>\" --plan-name deploy\n```\n\nYou can containerize and deploy together, or handle them separately with individual plans.\n\n- **Containerization**: Generates a Dockerfile for your project and validates the container image build.\n- **Deployment**: Creates all required configuration files and manifests based on the target Azure hosting service, deploys the application, and generates a reusable deployment script for future use.\n\n> [!TIP]\n> Customize the prompt to match your needs:\n>\n> - `\"containerize my app and create dockerfile\"`: containerize only, without deploying.\n> - `\"deploy my app to the AKS cluster in subscription: <sub-id>, resource group: <rg-name>\"`: deploy an already containerized application.\n\n### Review the plan\n\nReview the generated plan files:\n\n- **Plan file** (`.github/modernize/deploy/plan.md`): Containerization and deployment strategy.\n- **Task list** (`.github/modernize/deploy/tasks.json`): Specific deployment tasks.\n\n### Execute the deployment plan\n\n```bash\nmodernize plan execute --plan-name deploy\n```\n\n### Verify the deployment\n\n1. **Review code changes**: Check the generated Dockerfile, deployment manifests, and configuration changes.\n\n    ```bash\n    git status\n    git diff main\n    ```\n\n1. **Validate the running application**: Access your deployed application through the URL provided by the target hosting service.\n\n## Use interactive mode\n\nYou can also perform both phases through the interactive TUI by running `modernize` and selecting **Create modernization plan** from the menu.\n\n## Next steps\n\n- [Learn about CLI commands](cli-commands.md)\n- [Create custom skills for your organization](customization.md)\n- [Return to overview](overview.md)\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/modernization-agent/overview.md",
    "content": "---\ntitle: GitHub Copilot Modernization Agent Overview\ndescription: Learn about the GitHub Copilot modernization agent, its key capabilities, and how it enables end-to-end application modernization.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jessiehuang\nms.topic: overview\nai-usage: ai-assisted\nms.date: 03/11/2026\nkeywords: modernize cli, modernization agent\n---\n\n# GitHub Copilot modernization agent overview\n\nThis overview describes the GitHub Copilot modernization agent, which is currently in public preview.\n\n> [!TIP]\n> **Want to try it now?** To install the CLI and modernize your first application, see the [quickstart guide](quickstart.md).\n\nOrganizations modernizing multiple applications need consistency, repeatability, and the ability to define standards that apply across every dev team and repository. The modernization agent is built for these requirements.\n\nDelivered through the Modernize CLI, the modernization agent enables **agentic, end-to-end application modernization** through intelligent workflow orchestration. It provides architects and app owners with a platform to define modernization standards once - via customizable, reusable skills - and apply them consistently across multiple applications and repositories. It offers a unified CLI and TUI experience for hands-on modernization of individual applications.\n\nThe modernization agent supports the full modernization lifecycle through an **Assess → Plan → Execute** model that ensures every application follows the same governed, repeatable path to cloud readiness:\n\n- **Multi-repo assessment**: Assess multiple applications and repositories simultaneously to identify modernization opportunities, map dependencies, and generate cloud readiness scores.\n- **Upgrades and migrations**: Perform framework upgrades, language version migrations, containerization, and cloud service integrations through structured, repeatable workflows.\n- **Customizable skills**: Define organization-specific migration patterns, internal library usage, and coding standards as reusable custom skills. By using these skills, you can enable consistent modernization across your organization while using proprietary knowledge.\n- **Structured planning**: Generate reviewable modernization plans with ordered tasks and success criteria, aligned to organizational goals.\n- **Autonomous execution**: Apply code transformations, dependency upgrades, and validation checks automatically, with version-controlled traceability at each step.\n- **Batch operations**: Run modernization workflows across multiple applications in non-interactive mode, with support for CI/CD pipeline integration.\n\n## What is the Modernize CLI?\n\nThe Modernize CLI is the command-line experience within **GitHub Copilot modernization**. It orchestrates modernization workflows by combining deterministic automation with AI-powered intelligence.\n\nIt provides a flexible execution substrate for both local and scaled modernization scenarios.\n\n### Core capabilities\n\n- **Deterministic automation**: Enables orchestration, business workflow, and platform integrations.\n- **AI-powered intelligence**: Provides context-aware code analysis, modernization plan generation, and guided transformations via GitHub Copilot.\n\n### Flexible execution modes\n\n- **Interactive workflows (TUI)**: Designed for complex, decision-intensive scenarios requiring human oversight.\n- **Non-interactive workflows**: Automated execution optimized for CI/CD pipelines and large-scale modernization.\n\n## Key capabilities\n\n### Application assessment\n\nThe Modernize CLI assesses applications and repositories to determine modernization readiness:\n\n- **Automated scanning**:  Evaluates code, configuration, and dependencies by using built-in tools and AI capabilities.\n- **Single or multi-repository assessment**: Assesses individual applications or multiple repositories simultaneously.\n- **Rich aggregated reports**: Delivers comprehensive insights with cross-repository analysis, dependency mapping, and cloud readiness scores.\n- **GitHub integration**: Optionally publishes assessment summaries directly to GitHub issues.\n\n### Intelligent planning\n\nGenerate detailed modernization plans that align with enterprise intent:\n\n- **AI-driven contextual analysis**: Interprets modernization goals, such as upgrade, migrate, and deploy, in the context of your codebase.\n- **Diverse modernization scenarios**: Supports upgrades, framework migrations (Spring Boot), containerization, and Azure service integrations.\n- **Extensible customization via skills**: Plug in organization-specific skills to encode enterprise standards and patterns.\n- **Structured task breakdown**: Converts complex modernization efforts into ordered, executable steps with success criteria.\n- **Editable plans**: Review, refine, and approve plans before execution.\n\n### Autonomous execution\n\nExecute modernization plans with validation at every stage:\n\n- **Code transformations**: Automated dependency upgrades, API replacements, and framework updates.\n- **Build and validation checks**: Ensure successful compilation and integrity after each step.\n- **Security scanning**: Identify and address common vulnerabilities and exposures (CVEs).\n- **Version control integration**: Create branches and commits with traceable change history.\n- **Cloud alignment**: Support containerization and deployment workflows as part of execution.\n\nYou can also delegate assessment, upgrade, and execution tasks to GitHub Copilot Coding Agent for enhanced tracking and collaboration.\n\n### Multi-repo and batch modernization\n\nUse this solution for enterprise-scale modernization across large portfolios:\n\n- **Parallel processing**: Assess and upgrade multiple repositories at the same time.\n- **Batch operations**: Execute modernization workflows across entire estates.\n- **CI/CD integration**: Run headless in automated pipelines.\n- **Progress tracking**: Monitor modernization status across applications.\n\n## Get started\n\nReady to modernize your applications? Follow these steps:\n\n1. **[Install and try the Modernize CLI](quickstart.md)**: Get started in minutes with the interactive quickstart.\n1. **[Learn the CLI commands](cli-commands.md)**: Explore all available commands and options.\n1. **[Scale to multiple repos](batch-assess.md)**: Assess and upgrade applications at enterprise scale.\n\n> [!NOTE]\n> New users should start with the [quickstart guide](quickstart.md) to experience the full workflow on a sample application.\n\n## When to use the modernization agent\n\nUse the modernization agent when you need:\n\n- **Agentic modernization**: Autonomous execution of complex upgrades and migrations.\n- **Enterprise-scale operations**: Batch modernization across multiple repositories.\n- **CI/CD integration**: Embedding modernization into automated delivery workflows.\n- **Consistent enterprise patterns**: Applying standardized modernization approaches through reusable skills.\n- **Hybrid execution modes**: Switching between interactive and fully automated modes.\n- **Custom migrations**: Using organization-specific patterns through custom skills.\n\n## Next steps\n\n**Get started:**\n\n- [**Quickstart: Install and try the CLI**](quickstart.md): Best place to start! Modernize your first app in 5-10 minutes.\n\n**Learn more:**\n\n- [CLI command reference](cli-commands.md)\n- [Batch assessment: Assess multiple applications](batch-assess.md)\n- [Batch upgrade: Upgrade multiple applications](batch-upgrade.md)\n- [Customization with skills](customization.md)\n\n## Provide feedback\n\nWe value your input! If you have any feedback about the Modernization agent, [create an issue at the github-copilot-appmod repository](https://github.com/microsoft/github-copilot-appmod/issues/new?template=feedback-template.yml) or use the [GitHub Copilot modernization feedback form](https://aka.ms/ghcp-appmod/feedback).\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/modernization-agent/quickstart.md",
    "content": "---\ntitle: \"Quickstart: Install and Use the GitHub Copilot Modernization Agent\"\ndescription: Learn how to install and use the GitHub Copilot modernization agent to assess, plan, and execute application modernization.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jessiehuang\nms.topic: quickstart\nai-usage: ai-assisted\nms.date: 04/17/2026\n---\n\n# Quickstart: Install and use the GitHub Copilot modernization agent\n\nThis quickstart guides you through installing the GitHub Copilot modernization agent and using it to modernize a sample application.\n\n## Prerequisites\n\n- **A GitHub Copilot subscription**: Free, Pro, Pro+, Business, or Enterprise plan. See [Copilot plans](https://github.com/features/copilot/plans).\n- **GitHub CLI**: Install the GitHub CLI (`gh`) for authentication, version `v2.45.0` or later. See [Installing gh](https://cli.github.com/).\n\n### Platform requirements\n\n- **Windows**: x64 or ARM64.\n- **Linux**: x64 or ARM64 with `glibc` 2.27 or later (Ubuntu 18.04 or later, Debian 10 or later, Fedora 29 or later, Azure Linux 2.0 or later).\n- **macOS**: Apple Silicon or Intel.\n\n## Install the modernization agent\n\nUse the following commands to install the modernization agent or update to the latest version.\n\n### [Windows](#tab/windows)\n\nUse one of the following options:\n\n**Option 1 - Winget (recommended):**\n\n```powershell\nwinget install GitHub.Copilot.modernization.agent\n```\n\nFor silent installation with no prompts:\n\n```powershell\nwinget install GitHub.Copilot.modernization.agent --silent\n```\n\n**Option 2 - PowerShell one-liner:**\n\n```powershell\niex (irm 'https://raw.githubusercontent.com/microsoft/modernize-cli/main/scripts/install.ps1')\n```\n\n**Option 3 - MSI installer:**\n\nDownload and run the latest MSI from the [GitHub releases page](https://github.com/microsoft/modernize-cli/releases/latest).\n\n> [!NOTE]\n> After installation, open a new terminal for the `modernize` command to be available on your PATH. These commands work for both initial installation and updating to the latest version. A dedicated version update command will be available in a future release.\n\n### [Linux/macOS](#tab/linux-macos)\n\nUse one of the following options:\n\n**Option 1 - Homebrew:**\n\n```bash\nbrew tap microsoft/modernize https://github.com/microsoft/modernize-cli\nbrew install modernize\n```\n\n**Option 2 - Shell script:**\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/microsoft/modernize-cli/main/scripts/install.sh | bash\n```\n\n---\n\nVerify the installation:\n\n```bash\nmodernize --version\n```\n\n## Get a sample application\n\nFor this quickstart, use a sample application. Choose either Java or .NET:\n\n### [Java](#tab/java)\n\n```bash\ngit clone https://github.com/Azure-Samples/PhotoAlbum-Java.git\ncd PhotoAlbum-Java\ngit checkout -b modernize\n```\n\n### [.NET](#tab/dotnet)\n\n```bash\ngit clone https://github.com/Azure-Samples/PhotoAlbum.git\ncd PhotoAlbum\ngit checkout -b modernize\n```\n\n---\n\n## Use the interactive mode\n\nThe easiest way to get started is by using the interactive mode. First, authenticate by using the GitHub CLI:\n\n```bash\ngh auth login\n```\n\nThen, run the modernization agent:\n\n```bash\nmodernize\n```\n\nThe main menu appears:\n\n```Modernize CLI\n○ What would you like to do?\n\n  > Assess        Analyze your source application and generate an assessment report\n    Plan          Create a modernization plan based on assessment findings\n    Execute       Run tasks defined in your modernization plan\n  ──────────────\n    Upgrade       Upgrade your runtime and frameworks to the latest versions\n```\n\n### Step 1: Assess the application\n\n1. Select **Assess** from the main menu.\n1. Choose how to specify your target repositories. You can select **Current folder** to use your current directory, **Manual input** to enter local paths or remote Git URLs, or **From a config file** to load repositories from a JSON config file. For this quickstart, select **Current folder**.\n1. Choose the execution mode. Select **Assess locally** to run the assessment on your machine, or **Delegate to Cloud Agents** to let cloud agents run the assessment in parallel. For this quickstart, select **Assess locally**.\n1. Select assessment domains, such as **Java upgrade** and **Cloud Readiness**, and press <kbd>Enter</kbd>.\n1. Review the assessment configuration options, such as Analysis Coverage and Target Runtime. Press <kbd>Enter</kbd> on **Continue** to accept the recommended defaults, or adjust individual settings as needed.\n1. Accept the default output path or enter a custom one, and then press <kbd>Enter</kbd> to start the assessment.\n1. Wait for the assessment to complete.\n\nThe assessment results are saved to `.github\\modernize\\assessment\\` in your project directory. The agent analyzes your code, dependencies, and configuration to identify:\n\n- Outdated framework versions\n- Deprecated APIs\n- Cloud compatibility issues\n- Migration opportunities\n\n### Step 2: Create a modernization plan\n\nAfter the assessment finishes, the agent prompts you to create a modernization plan based on the identified problems:\n\n```Modernize CLI\n○ How would you like to continue?\n\n  > 1. Create modernization plan\n       Generate a plan.md file according to the identified issues\n    2. Return to main menu\n```\n\n1. Select **1. Create modernization plan**.\n1. Enter a plan name or press Enter to use the default name.\n1. Enter your modernization goal as a prompt. By default, the prompt is `References the assessment summary and creates plan` to create a plan based on the assessment findings. You can replace it with any other migration request, for example:\n   - `migrate the database to Azure PostgreSQL`\n   - `upgrade to Spring Boot 3`\n   - `deploy to Azure Container Apps`\n1. Press Enter to generate the plan.\n\nThe agent analyzes your codebase and generates:\n\n- **Plan file** (`.github/modernize/{plan-name}/plan.md`): Detailed strategy and approach.\n- **Task list** (`.github/modernize/{plan-name}/tasks.json`): Breakdown of executable steps.\n\n> [!TIP]\n> You can manually edit `plan.md` to add clarifications or adjust details. You can also update `tasks.json` to modify, reorder, add, or remove tasks before executing the plan.\n\n### Step 3: Execute the modernization plan\n\nAfter you verify the plan, confirm that you want to execute the plan.\n\n```Modernize CLI\n○ How would you like to continue?\n\n  > 1. Execute modernization plan\n       Run the tasks defined in the modernization plan\n    2. Return to main menu\n```\n\n1. Select **1. Execute modernization plan**.\n1. Press Enter to execute the plan.\n1. Monitor progress as the agent applies changes.\n\nThe agent executes each task in order:\n\n- Makes code changes according to the plan.\n- Validates builds after each change.\n- Scans for and addresses CVEs.\n- Commits changes.\n\n### Step 4: Review the results\n\nAfter execution finishes, you can review all changes that the agent made before merging them:\n\n1. **Review changes**: Check the modifications on the current branch.\n\n    ```bash\n    git status\n    git diff main\n    ```\n\n1. **Create a pull request**: If you're satisfied with the changes, create a PR for team review.\n\n    ```bash\n    gh pr create \\\n        --title \"Modernization: migrate the app to azure\" \\\n        --body \"Automated modernization by GitHub Copilot agent\"\n    ```\n\n## Next steps\n\n- [Learn about CLI](cli-commands.md)\n- [Batch assessment: Assess multiple applications](batch-assess.md)\n- [Batch upgrade: Upgrade multiple applications](batch-upgrade.md)\n- [Create custom skills for your organization](customization.md)\n\n## Provide feedback\n\nYour input is important! If you have any feedback about the Modernization agent, [create an issue at the github-copilot-appmod repository](https://github.com/microsoft/github-copilot-appmod/issues/new?template=feedback-template.yml) or use the [GitHub Copilot modernization feedback form](https://aka.ms/ghcp-appmod/feedback).\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/overview.md",
    "content": "---\ntitle: Analyze Applications and Migrate to Azure by Using GitHub Copilot Modernization\ntitleSuffix: Azure\ndescription: Learn how GitHub Copilot modernization simplifies application assessment, framework upgrades, and Azure migration for Java and .NET projects.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: upgrade-and-migration-article\nai-usage: ai-assisted\nms.date: 03/11/2026\n---\n\n# GitHub Copilot modernization\n\nGitHub Copilot modernization is an agentic, end-to-end solution that analyzes, upgrades, and migrates Java and .NET applications to Azure.\n\nThe modernization experience is delivered through two complementary layers. The modernization agent, delivered via the Modernize CLI, enables architects and application owners to orchestrate assessment, migration planning, and framework upgrade automation across multiple applications simultaneously, then seamlessly hand off plans to developers. In the IDE, developers can use GitHub Copilot modernization to execute transformations: migrating dependencies to Azure services, containerizing applications, generating infrastructure-as-code, and deploying directly to Azure.\n\nHumans remain in the loop throughout, with every recommendation transparent, every change reviewable, and every step validated.\n\n\n## Current availability\n\nThe following GitHub Copilot modernization capabilities are currently available:\n\n- **General availability**: IDE experience - language and framework upgrades for .NET and Java.\n- **General availability**: IDE experience - migration scenarios for .NET and Java.\n- **Public preview**: Modernization agent - CLI experience for application assessment and planning. For more information, see [Modernization agent overview](modernization-agent/overview.md).\n\n<br>\n\n> [!VIDEO https://www.youtube.com/embed/Olt5getqPoo]\n\n## Key capabilities\n\n- **Application assessment and planning**: Analyze code, configuration, and dependencies.\n\n  Modernization starts with a comprehensive codebase analysis. GitHub Copilot modernization analyzes your project's current state and generates modernization plans. The tool identifies dependencies, outdated libraries, and potential migration problems. It provides actionable strategies to remediate problems.\n\n- **Code transformations**: Upgrade Java or .NET runtime and framework, and migrate to Azure.\n\n  Uses tools like `OpenRewrite` to upgrade code, including API replacements and dependency updates. AI-powered predefined tasks encode expert knowledge for common Azure migration scenarios, including secret management, message queue integration, and identity services. The system can capture and reuse migration patterns. You can convert Git commits into reusable migration patterns through custom skills. The system learns from existing code changes and applies similar fixes across multiple codebases. Migration patterns are applied uniformly across teams and projects to ensure consistency.\n\n- **Modernize and secure**: Ensure successful build, migrate unit tests, and address Common Vulnerabilities and Exposures (CVEs).\n\n  Modernization includes comprehensive build validation. The tool automatically resolves build problems that arise during transformation. It performs test validations to ensure error-free changes. The modernization process maintains production pipeline integrity.\n\n  Security vulnerability management is integrated into the modernization process. The system scans for CVEs after upgrades. It automatically applies security fixes in Agent Mode. You can review all security-related changes. This process improves your security posture while maintaining compliance requirements.\n\n- **Containerization and deployment**: Generate assets for app containerization and deployment.\n\n  The tool creates Infrastructure as Code files for Azure deployment. It addresses deployment problems automatically. CI/CD pipelines are set up for continuous integration. This task completes the modernization workflow from analysis to production.\n\n## Get started\n\nUse the following links to begin modernizing applications with GitHub Copilot:\n\n- [GitHub Copilot modernization for Java](../java/migration/migrate-github-copilot-app-modernization-for-java.md?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json)\n- [GitHub Copilot modernization for .NET](/dotnet/core/porting/github-copilot-app-modernization-overview?toc=/azure/developer/github-copilot-app-modernization/toc.json&bc=/azure/developer/github-copilot-app-modernization/breadcrumb/toc.json)\n- [Modernization agent](modernization-agent/overview.md)\n\nAfter you modernize on Azure, applications can integrate with Azure AI capabilities and services:\n\n- **Microsoft Foundry**: Access to over 11,000 AI models.\n- **AI agent services**: Built-in capabilities for intelligent application features.\n- **Observe performance**: Real-time insights into AI-powered application performance.\n- **Ensure content safety**: Responsible AI implementation at scale.\n- **App Service**: Fully managed platform for hosting web applications and APIs.\n- **Azure Container Apps**: Serverless container platform for microservices and containerized applications.\n- **Azure Kubernetes Service**: Managed Kubernetes service for orchestrating containerized workloads.\n- **AKS Automatic**: Simplified Kubernetes experience with automated cluster management.\n\n## Privacy statement\n\nGitHub Copilot modernization uses GitHub Copilot the same way you use GitHub Copilot to modify code. This process doesn't retain code snippets beyond the immediate session. The process doesn't collect, transmit, or store your custom skills either. For more information, see the [Microsoft privacy statement](https://www.microsoft.com/en-us/privacy/privacystatement).\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/quickstart-unit-tests.md",
    "content": "---\ntitle: \"Quickstart: Generate Java Unit Tests with GitHub Copilot Modernization\"\ndescription: Shows you how to generate Java unit tests using GitHub Copilot modernization.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xinrzhu\nms.topic: quickstart\nms.date: 09/23/2025\nms.custom: devx-track-java\n---\n\n# Quickstart: generate Java unit tests with GitHub Copilot modernization\n\nThis quickstart shows you how to generate Java unit tests using GitHub Copilot modernization.\n\n## Prerequisites\n\n- A GitHub account with [GitHub Copilot](https://github.com/features/copilot) enabled. A Pro, Pro+, Business, or Enterprise plan is required.\n- The latest version of [Visual Studio Code](https://code.visualstudio.com/). Must be version 1.101 or later.\n- [GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/overview). For setup instructions, see [Set up GitHub Copilot in VS Code](https://code.visualstudio.com/docs/copilot/setup). Be sure to sign in to your GitHub account within VS Code.\n- [GitHub Copilot modernization](https://marketplace.visualstudio.com/items?itemName=vscjava.migrate-java-to-azure). Restart VS Code after installation.\n- [Java JDK](/java/openjdk/download) for both the source and target JDK versions.\n- [Maven](https://maven.apache.org/download.cgi) or [Gradle](https://gradle.org/install/) to build Java projects.\n- A Git-managed Java project using Maven or Gradle.\n- For Maven-based projects: access to the public Maven Central repository.\n- In the Visual Studio Code settings, make sure `chat.extensionTools.enabled` is set to `true`. This setting might be controlled by your organization.\n\n> [!NOTE]\n> [!INCLUDE [Azure account note](../includes/github-copilot-modernization-azure-note.md)]\n>\n> [!INCLUDE [Gradle Kotlin note](../includes/github-copilot-modernization-gradle-kotlin-note.md)]\n\n## Sign in to use Copilot and then install the required extension\n\nTo use GitHub Copilot, sign in to your GitHub account in Visual Studio Code. Select the Copilot icon at the top of Visual Studio Code to access the GitHub Copilot pane. For more information about setting up GitHub Copilot, see [Set up GitHub Copilot in VS Code](https://code.visualstudio.com/docs/copilot/setup).\n\nThen, use the following steps to install the extension in Visual Studio Code:\n\n1. In Visual Studio Code, open the **Extensions** view from the Activity Bar.\n1. Search for **GitHub Copilot modernization** in the marketplace.\n1. Select the **GitHub Copilot modernization** extension pack.\n1. On the extension page, select **Install**.\n1. Restart Visual Studio Code.\n\nAfter installation completes, you should see a notification in the corner of Visual Studio Code confirming success.\n\nFor more information, see [Install a VS Code extension](https://code.visualstudio.com/docs/getstarted/extensions#_install-a-vs-code-extension).\n\n## Launch GitHub Copilot Agent Mode and start the upgrade\n\nUse the following steps to launch GitHub Copilot Agent Mode and generate unit tests:\n\n1. Select a Java project that uses either Maven or Gradle as its build tool.\n1. Open the selected Java project in Visual Studio Code.\n1. Open the GitHub Copilot Chat panel.\n1. Switch to Agent Mode.\n1. Enter a prompt such as **Generate unit tests for this Java project**.\n\n:::image type=\"content\" source=\"media/quickstart-unit-tests/before-generation.png\" alt-text=\"Screenshot of Visual Studio Code that shows an example before unit test generation.\" lightbox=\"media/quickstart-unit-tests/before-generation.png\":::\n\n## Wait for the test generation to complete\n\nGitHub Copilot modernization analyzes the Java project within the current workspace. This includes evaluating the project's JDK version, build tools, and any existing unit tests.\n\nAs part of the process, the tool generates a **TestReport.md** file that tracks test generation progress and provides a summary of test results both before and after test generation. The report includes the following details:\n\n- Total number of existing tests\n- Overall pass rate\n- Timestamp\n- Number of successful tests\n- Number of failed tests\n- Number of tests with errors\n\nDuring test generation, the output displays progress messages - for example, \"Generating unit tests for ...\" - to indicate ongoing activity. The tool automatically generates test files and adds them to the workspace.\n\n## Review the generated tests\n\nAfter test generation is complete, GitHub Copilot displays a detailed report summarizing the post-generation test results. This report includes the same metrics captured before test generation - such as the total number of tests, successes, failures, and errors - enabling you to easily compare and evaluate the changes introduced during the process.\n\n:::image type=\"content\" source=\"media/quickstart-unit-tests/after-generation.png\" alt-text=\"Screenshot of Visual Studio Code that shows the unit test generation report.\" lightbox=\"media/quickstart-unit-tests/after-generation.png\":::\n\n## See also\n\n[GitHub Copilot modernization](/azure/developer/java/migration/migrate-github-copilot-app-modernization-for-java?toc=/java/upgrade/toc.json&bc=/java/upgrade/breadcrumb/toc.json)\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/quickstart-upgrade.md",
    "content": "---\ntitle: \"Quickstart: Upgrade a Java Project with GitHub Copilot Modernization\"\ndescription: Learn how to upgrade your Java project to Java 21 or Spring Boot 3.x using GitHub Copilot modernization. Follow this quickstart to modernize JDK, frameworks, and dependencies.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xinrzhu\nms.topic: quickstart\nms.date: 10/28/2025\nms.custom: devx-track-java\n---\n\n# Quickstart: Upgrade a Java project with GitHub Copilot modernization\n\nGitHub Copilot modernization Java upgrades support the following scenarios:\n\n- Upgrade Java Development Kit (JDK) to Java 11, 17, 21, or 25.\n- Upgrade Spring Boot up to version 3.5.\n- Upgrade Spring Framework up to version 6.2+.\n- Upgrade Java EE to Jakarta EE, up to Jakarta EE 10.\n- Upgrade JUnit.\n- Upgrade [third-party dependencies](framework-upgrade.md) to a specified version.\n- Upgrade Ant to Maven build.\n  \nThis quickstart shows you how to upgrade a Java project by using GitHub Copilot modernization.\n\n## Prerequisites\n\n- A GitHub account with [GitHub Copilot](https://github.com/features/copilot) enabled. You need a Free Tier, Pro, Pro+, Business, or Enterprise plan.\n- One of the following IDEs:\n  - The latest version of [Visual Studio Code](https://code.visualstudio.com/). Must be version 1.101 or later.\n    - [GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/overview). For setup instructions, see [Set up GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/setup). Be sure to sign in to your GitHub account within Visual Studio Code.\n    - [GitHub Copilot modernization](https://marketplace.visualstudio.com/items?itemName=vscjava.migrate-java-to-azure). Restart Visual Studio Code after installation.\n  - The latest version of [IntelliJ IDEA](https://www.jetbrains.com/idea/download). Must be version 2023.3 or later.\n    - [GitHub Copilot](https://plugins.jetbrains.com/plugin/17718-github-copilot). Must be version 1.5.59 or later. For more instructions, see [Set up GitHub Copilot in IntelliJ IDEA](https://docs.github.com/en/copilot/get-started/quickstart). Be sure to sign in to your GitHub account within IntelliJ IDEA.\n    - [GitHub Copilot modernization](https://plugins.jetbrains.com/plugin/28791-github-copilot-app-modernization). Restart IntelliJ IDEA after installation. If you don't have GitHub Copilot installed, you can install GitHub Copilot modernization directly.\n    - For more efficient use of GitHub Copilot modernization: in the IntelliJ IDEA settings, select the **Tools** > **GitHub Copilot** configuration window, and then select **Auto-approve** and **Trust MCP Tool Annotations**. For more information, see [Configure settings for GitHub Copilot modernization to optimize the experience for IntelliJ](configure-settings-intellij.md).\n- [Java JDK](/java/openjdk/download) for both the source and target JDK versions.\n- [Maven](https://maven.apache.org/download.cgi) or [Gradle](https://gradle.org/install/) to build Java projects.\n- A Git-managed Java project using Maven or Gradle.\n- For Maven-based projects: access to the public Maven Central repository.\n- In the Visual Studio Code settings, make sure `chat.extensionTools.enabled` is set to `true`. Your organization might control this setting.\n\n> [!NOTE]\n> [!INCLUDE [Azure account note](../includes/github-copilot-modernization-azure-note.md)]\n>\n> [!INCLUDE [Gradle Kotlin note](../includes/github-copilot-modernization-gradle-kotlin-note.md)]\n>\n> [!INCLUDE [IntelliJ note](../includes/github-copilot-modernization-intellij-note.md)]\n\n## Sign in to use Copilot and then install the required extension\n\nTo use GitHub Copilot, sign in to your GitHub account in Visual Studio Code. Select the Copilot icon at the top of Visual Studio Code to access the GitHub Copilot pane. For more information about setting up GitHub Copilot, see [Set up GitHub Copilot in VS Code](https://code.visualstudio.com/docs/copilot/setup).\n\nThen, use the following steps to install the extension in Visual Studio Code:\n\n1. In Visual Studio Code, open the **Extensions** view from the Activity Bar.\n1. Search for **GitHub Copilot modernization** in the marketplace.\n1. Select **GitHub Copilot modernization**.\n1. On the extension page, select **Install**.\n1. Restart Visual Studio Code.\n\n> [!TIP]\n> To get the best experience in IntelliJ, we recommend configuring a few key settings. For more information, see [Configure settings for GitHub Copilot modernization to optimize the experience for IntelliJ](configure-settings-intellij.md).\n\nAfter installation completes, you see a notification in the corner of Visual Studio Code confirming success.\n\nFor more information, see [Install a VS Code extension](https://code.visualstudio.com/docs/getstarted/extensions#_install-a-vs-code-extension).\n\n## Select a Java project to upgrade\n\nFor the purposes of this tutorial, choose one of the following sample repositories:\n\n- Maven: [uportal-messaging](https://github.com/UW-Madison-DoIT/uportal-messaging)\n- Gradle: [docraptor-java](https://github.com/DocRaptor/docraptor-java)\n\n## Launch GitHub Copilot Agent Mode and start the upgrade\n\nUse the following steps to launch GitHub Copilot Agent Mode and start the upgrade process:\n\n1. Open the selected Java project in Visual Studio Code.\n1. Open the GitHub Copilot Chat panel.\n1. Switch to Agent Mode.\n1. Enter a prompt such as **Upgrade project to Java 21 using Java upgrade tools** or **Upgrade project to Java 21 and Spring Boot 3.2 using Java upgrade tools** to include framework information.\n\n   > [!NOTE]\n   > If you need to upgrade a framework or third-party dependency only, see [Upgrade a framework or third-party dependency by using GitHub Copilot modernization](framework-upgrade.md).\n\n1. When prompted, select **Continue** to generate an upgrade plan.\n\n:::image type=\"content\" source=\"media/quickstart-upgrade/plan.png\" alt-text=\"Screenshot of Visual Studio Code that shows an example upgrade plan.\" lightbox=\"media/quickstart-upgrade/plan.png\":::\n\n## Review and edit the upgrade plan\n\nGitHub Copilot modernization analyzes the Java project in the current workspace, including its JDK, build tools, and dependencies. The tool generates a **plan.md** file that outlines the following planned changes:\n\n- Source and target JDK versions.\n- Framework and library upgrade paths.\n\nReview the plan and make changes if needed, then select **Continue** to proceed. For information about further customization, such as adding more build tool parameters, see [Customize the upgrade plan](customize-upgrade-plan.md).\n\n> [!TIP]\n> Ensure that the plan matches your desired upgrade targets - for example, Java 8 to Java 21, Spring Boot 2.7 to 3.2.\n\n:::image type=\"content\" source=\"media/quickstart-upgrade/review-plan.png\" alt-text=\"Screenshot of Visual Studio Code that shows an example upgrade plan with upgrade targets highlighted.\" lightbox=\"media/quickstart-upgrade/review-plan.png\":::\n\n## Apply code changes and fix build issues\n\nGitHub Copilot then proceeds with the code transformation phase of the project. It uses an open-source tool called OpenRewrite to implement some code changes based on specific recipes. Then, AI addresses the remaining issues through a dynamic build/fix loop. You can monitor progress in the editor area of Visual Studio Code by checking the **progress.md** markdown file at any time.\n\nAt various stages of the process, GitHub Copilot prompts you to continue.\n\nFor the **Confirm the OpenRewrite transformation** step, select **Continue** to upgrade Java code by using OpenRewrite. This step might take a few minutes.\n\nFor the **Approve the dynamic build/fix loop** step, select **Continue** to build the project and fix errors.\n\nCopilot iterates and continues to fix errors until there are no more issues. Progress is shown in a **progress.md** file. The loop continues until the project builds successfully.\n\n:::image type=\"content\" source=\"media/quickstart-upgrade/build-fix.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot chat pane with Build-Fix output and the Continue button highlighted.\" lightbox=\"media/quickstart-upgrade/build-fix.png\":::\n\n## Check for vulnerabilities and code behavior changes\n\nUnder certain circumstances, the upgrade might cause code behavior changes or introduce libraries with Common Vulnerabilities and Exposures (CVE) issues. The tool performs an extra check for these issues.\n\nWhen GitHub Copilot prompts **Run Validate if any modified dependencies have known CVEs**, select **Continue**.\n\nIf CVEs are found, GitHub Copilot Agent Mode attempts to fix them. Review the changes in VS Code and decide whether to keep them.\n\n:::image type=\"content\" source=\"media/quickstart-upgrade/common-vulnerabilities-exposures.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot chat pane with CVE output and the Continue button highlighted.\" lightbox=\"media/quickstart-upgrade/common-vulnerabilities-exposures.png\":::\n\nAfter the CVE check, when prompted to **Run Validate code behavior consistency**, select **Continue**.\n\nIf issues are found, GitHub Copilot Agent Mode tries to resolve them. Decide whether to keep or discard the changes.\n\nAfter the checks complete, GitHub Copilot rebuilds the project and reruns the previous checks.\n\nIf minor issues remain that don't require immediate fixes, the upgrade is complete. Otherwise, GitHub Copilot goes back to address them.\n\n:::image type=\"content\" source=\"media/quickstart-upgrade/fixed.png\" alt-text=\"Screenshot of Visual Studio Code that shows the editor with a fixed line.\" lightbox=\"media/quickstart-upgrade/fixed.png\":::\n\n## View the summary\n\nAfter the upgrade, the tool generates a summary in the **summary.md** file, which includes the following information:\n\n- Project information.\n- Lines of code changed.\n- Updated dependencies.\n- Summarized code changes.\n- Fixed CVE security and code inconsistency issues, if any.\n- Unaddressed minor CVE issues.\n\n:::image type=\"content\" source=\"media/quickstart-upgrade/summary.png\" alt-text=\"Screenshot of Visual Studio Code that shows the Upgrade Java Project summary content.\" lightbox=\"media/quickstart-upgrade/summary.png\":::\n\n## Next step\n\n[Quickstart: generate unit tests with GitHub Copilot modernization](quickstart-unit-tests.md)\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/toc.yml",
    "content": "items:\n  - name: GitHub Copilot modernization documentation\n    href: index.yml\n    items:\n      - name: Overview\n        href: overview.md\n      - name: Languages and frameworks supported\n        href: languages.md\n      - name: Portfolio assessment integration\n        href: ../java/migration/github-copilot-app-modernization-for-java-portfolio-assessment-integration.md?context=/azure/developer/github-copilot-app-modernization/context/context\n      - name: \"CLI: Modernization agent\"\n        expanded: true\n        items:\n          - name: Overview\n            href: modernization-agent/overview.md\n          - name: Quickstart\n            href: modernization-agent/quickstart.md\n          - name: CLI commands\n            href: modernization-agent/cli-commands.md\n          - name: Batch modernization\n            expanded: true\n            items:\n              - name: Batch assessment\n                href: modernization-agent/batch-assess.md\n              - name: Batch upgrade\n                href: modernization-agent/batch-upgrade.md\n          - name: Customization\n            href: modernization-agent/customization.md\n          - name: CI/CD integration\n            href: modernization-agent/cicd-integration.md\n          - name: Infrastructure and deployment\n            href: modernization-agent/infra-deployment.md\n      - name: Developer environment\n        expanded: true\n        items:\n        - name: Java\n          expanded: true\n          items:\n            - name: Overview\n              href: ../java/migration/migrate-github-copilot-app-modernization-for-java.md?context=/azure/developer/github-copilot-app-modernization/context/context\n            - name: FAQ\n              href: ../java/migration/migrate-github-copilot-app-modernization-for-java-faq.yml?context=/azure/developer/github-copilot-app-modernization/context/context\n            - name: Copilot CLI\n              href: ../java/migration/github-copilot-app-modernization-for-java-copilot-cli.md?context=/azure/developer/github-copilot-app-modernization/context/context\n            - name: Coding agent\n              href: ../java/migration/github-copilot-app-modernization-for-java-coding-agent.md?context=/azure/developer/github-copilot-app-modernization/context/context\n            - name: Java utilities\n              href: tools.md\n            - name: Configure settings for IntelliJ\n              href: configure-settings-intellij.md\n            - name: Upgrade Java projects\n              expanded: true\n              items:\n              - name: \"Quickstart: Upgrade a Java project\"\n                href: quickstart-upgrade.md\n              - name: \"Quickstart: Generate unit tests\"\n                href: quickstart-unit-tests.md\n              - name: Customize the upgrade plan\n                href: customize-upgrade-plan.md\n              - name: Upgrade a framework or third-party dependency\n                href: framework-upgrade.md\n            - name: Migrate Java projects to Azure\n              expanded: true\n              items:\n              - name: Predefined tasks\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-predefined-tasks.md?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: Working with assessment\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-working-with-assessment.md?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: Understand assessment rules\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-assess-rules.md?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: Optimize chat results with the AppModernization agent\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-chat-window.md?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: \"Quickstart: Assess and migrate a Java project\"\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-assess-migrate.md?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: \"Quickstart: Create and apply your own skill\"\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: Migration sample\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-sample.md?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: Migrate from Oracle to PostgreSQL\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-oracle-to-postgresql.md?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: Migration via custom agent\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-custom-agent.md?context=/azure/developer/github-copilot-app-modernization/context/context\n            - name: Re-architect (preview)\n              href: ../java/migration/github-copilot-app-modernization-for-java-rearchitecture.md?context=/azure/developer/github-copilot-app-modernization/context/context\n            - name: Infrastructure and deployment\n              expanded: true\n              items:\n              - name: \"Quickstart: Prepare infrastructure\"\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-infrastructure.md?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: \"Quickstart: Containerize your project\"\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-containerization.md?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: \"Quickstart: Deploy your project\"\n                href: ../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-deploy-to-azure.md?context=/azure/developer/github-copilot-app-modernization/context/context\n        - name: .NET\n          expanded: true\n          items:\n            - name: Overview\n              href: /dotnet/core/porting/github-copilot-app-modernization/overview?context=/azure/developer/github-copilot-app-modernization/context/context\n            - name: Install\n              href: /dotnet/core/porting/github-copilot-app-modernization/install?context=/azure/developer/github-copilot-app-modernization/context/context\n            - name: FAQ\n              href: /dotnet/core/porting/github-copilot-app-modernization/faq?context=/azure/developer/github-copilot-app-modernization/context/context\n            - name: Upgrade .NET projects\n              expanded: true\n              items:\n              - name: How to upgrade\n                href: /dotnet/core/porting/github-copilot-app-modernization/how-to-upgrade-with-github-copilot?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: How to apply custom upgrade instructions\n                href: /dotnet/core/porting/github-copilot-app-modernization/how-to-custom-upgrade-instructions?context=/azure/developer/github-copilot-app-modernization/context/context\n            - name: Migrate .NET projects to Azure\n              expanded: true\n              items:\n              - name: Predefined tasks\n                href: /dotnet/azure/migration/appmod/predefined-tasks?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: Working with assessment\n                href: /dotnet/azure/migration/appmod/working-with-assessment?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: \"Quickstart: Assess and migrate a .NET project\"\n                href: /dotnet/azure/migration/appmod/quickstart?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: \"Quickstart: Containerize a .NET project\"\n                href: /dotnet/azure/migration/appmod/containerization?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: \"Quickstart: Deploy a .NET project\"\n                href: /dotnet/azure/migration/appmod/deploy?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: Copilot CLI support\n                href: /dotnet/azure/migration/appmod/copilot-cli-support?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: Coding agent support\n                href: /dotnet/azure/migration/appmod/coding-agent-support?context=/azure/developer/github-copilot-app-modernization/context/context\n              - name: Migration sample\n                href: /dotnet/azure/migration/appmod/sample?context=/azure/developer/github-copilot-app-modernization/context/context\n"
  },
  {
    "path": "articles/github-copilot-app-modernization/tools.md",
    "content": "---\ntitle: GitHub Copilot Modernization Java Utilities\ndescription: Learn about Java-focused tools available in GitHub Copilot modernization that help with CVE validation, unit testing, and code maintenance.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xinrzhu\nms.topic: reference\nms.date: 09/23/2025\nms.custom: devx-track-java\n---\n\n# GitHub Copilot modernization Java utilities\n\nThis article describes several Java-focused tools that are now available through GitHub Copilot modernization. These tools provide more flexibility for day-to-day development and code maintenance.\n\n## Validation\n\n- `validate_cves_for_java`\n\n  Scans your project for known Java-related Common Vulnerabilities and Exposures (CVEs) and validates that critical vulnerabilities are addressed.\n\n  **Sample prompt:**\n\n  ```prompt\n  Check if there's any CVE issues in this Java project using #validate_cves_for_java\n  ```\n\n  :::image type=\"content\" source=\"media/general/common-vulnerabilities-exposures.png\" alt-text=\"Screenshot of Visual Studio Code that shows Copilot checking for CVE issues.\" lightbox=\"media/general/common-vulnerabilities-exposures.png\":::\n\n## Unit testing\n\n- `run_tests_for_java`\n\n  Runs your project's unit test suite and shows the results.\n\n  **Sample prompt:**\n\n  ```prompt\n  Run unit tests for this Java project using #run_tests_for_java\n  ```\n\n- `generate_tests_for_java`\n\n  Uses AI-based code understanding to automatically create unit tests for your Java code.\n\n  **Sample prompt:**\n\n  ```prompt\n  Generate unit test for this Java project using #generate_tests_for_java\n  ```\n\nFor more information on test generation, see the relevant documentation or article.\n\nThese tools help streamline the Java development lifecycle. They make it easier to adopt best practices for upgrades, testing, and security validation, regardless of whether you're in an upgrade session.\n\n## See also\n\n[GitHub Copilot modernization](/azure/developer/java/migration/migrate-github-copilot-app-modernization-for-java?toc=/java/upgrade/toc.json&bc=/java/upgrade/breadcrumb/toc.json)\n"
  },
  {
    "path": "articles/github-copilot-azure/TOC.yml",
    "content": "- name: GitHub Copilot for Azure\n  href: index.yml\n\n- name: Overview\n  href: introduction.md\n- name: Get started\n  href: get-started.md\n- name: Get support\n  href: support.md\n- name: Quickstarts\n  items:\n    - name: Overview\n      href: introduction.md\n    - name: Get started\n      href: get-started.md\n    - name: Get support\n      href: support.md\n    - name: Quickstarts\n      items:\n    - name: Deploy an existing app with agent mode\n      href: quickstart-deploy-app-agent-mode.md\n- name: Learn about Azure and your app\n  href: learn-examples.md\n- name: Design and develop your app\n  href: design-develop-examples.md\n- name: Deploy your app\n  href: deploy-examples.md\n- name: Troubleshooting your app\n  href: troubleshoot-examples.md\n- name: Advanced scenarios\n  expanded: true\n  items: \n    - name: Create Bicep files\n      href: bicep-generate-edit.md\n    - name: Generate and deploy a Django / PostgreSQL app\n      href: generate-deploy-django-postgresql.md\n"
  },
  {
    "path": "articles/github-copilot-azure/bicep-generate-edit.md",
    "content": "---\ntitle: Use GitHub Copilot for Azure to Generate Bicep files\ndescription: This article provides sample prompts and example responses from GitHub Copilot for Azure to create Bicep files to deploy Azure resources.\nkeywords: github, copilot, ai, azure\nms.service: github-copilot-for-azure\nms.topic: overview\nms.date: 12/19/2025\nms.collection: ce-skilling-ai-copilot\n---\n\n# Generate Bicep files using GitHub Copilot for Azure\n\n There are many ways to create new resources on Azure. Bicep files provide a declarative, modular, and reusable approach to defining Azure resources. Bicep templates offer improved readability, maintainability, and native integration with Azure Resource Manager (ARM) compared to JSON-based ARM templates or imperative scripting methods like PowerShell and Azure CLI. GitHub Copilot for Azure can help you create Bicep files. \n\n## Generate Bicep files\n\nGetting started with Bicep files might require some learning if you're new to the syntax, but tools like GitHub Copilot for Azure can help.\n\n### Example scenario\n\nSuppose you want an easy way to create a repeatable, automated process for creating a Blob container and file share. You might be familiar with how to create a Blob container and file share using the Azure portal, but unsure how to use Bicep files to accomplish the same task.\n\n### Example prompt\n\nCreate a New Chat (Ctrl + L), then copy and paste the following prompt into GitHub Copilot's chat pane.\n\n```\nShow me a Bicep file that creates an Azure Storage account with a blob container and a file share.\n```\n\n### Example response\n\n> [!NOTE]\n> The following response is an example. GitHub Copilot for Azure responses are nondeterministic, so you might get a different response from the one shown here.\n\nGitHub Copilot for Azure generates a Bicep file similar to the following.\n\n```\n@description('Specifies the name of the Azure Storage account.')\nparam storageAccountName string\n\n@description('Specifies the name of the blob container to create.')\nparam blobContainerName string\n\n@description('Specifies the name of the file share to create.')\nparam fileShareName string\n\n@description('Specifies the location in which the Azure Storage resources should be deployed.')\nparam location string = resourceGroup().location\n\nresource sa 'Microsoft.Storage/storageAccounts@2023-01-01' = {\n  name: storageAccountName\n  location: location\n  sku: {\n    name: 'Standard_LRS'\n  }\n  kind: 'StorageV2'\n  properties: {\n    accessTier: 'Hot'\n  }\n}\n\nresource blobServices 'Microsoft.Storage/storageAccounts/blobServices@2023-01-01' = {\n  parent: sa\n  name: 'default'\n}\n\nresource blobContainer 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-01-01' = {\n  parent: blobServices\n  name: blobContainerName\n  properties: {\n    publicAccess: 'None'\n  }\n}\n\nresource fileServices 'Microsoft.Storage/storageAccounts/fileServices@2023-01-01' = {\n  parent: sa\n  name: 'default'\n}\n\nresource fileShare 'Microsoft.Storage/storageAccounts/fileServices/shares@2023-01-01' = {\n  parent: fileServices\n  name: fileShareName\n  properties: {\n    shareQuota: 100 // Quota in MB\n  }\n}\n```\n\nCreate a new main.bicep file, then copy the response from GitHub Copilot for Azure and paste into the new file.\n\nWhen using the Azure CLI to execute the Bicep file, you can set the params declared as `storageAccountName`, `blobContainerName`, and `fileShareName`.\n\nAlternatively, you can edit the Bicep file initializing the `storageAccountName` param to your desired value.\n\n```\nparam storageAccountName string = '<your-storage-account-name>'\n```\n\n\n## Refine the response\n\nHowever, if you're new to Bicep files, you might need more information. Continue prompting in the same chat session to understand next steps.\n\nFor example, you might ask where this Bicep file should be created in your VS Code workspace.\n\n```\nWhere in my workspace should I create the Azure Bicep file, and what should I call it?\n```\n\nIt might respond by suggesting a folder and file name for your new Bicep file. For example, `infra/storageAccount.bicep`.\n\nFinally, if you're unsure about how to deploy the Bicep file, you can create a prompt that asks for instructions.\n\n```\nHow do I execute the Azure Bicep file?\n```\n\nYou might receive a response similar to the following.\n\n```\nTo execute the Bicep file, you can use the Azure CLI with the following steps:\n\n1. **Install Azure CLI and Bicep CLI**: Ensure you have the Azure CLI and Bicep CLI installed. You can install Bicep using the Azure CLI with the command:\n\n   az bicep install\n\n\n2. **Log in to Azure**: Use the Azure CLI to log in to your Azure account:\n\n   az login\n\n\n3. **Deploy the Bicep file**: Use the `az deployment group create` command to deploy the Bicep file to a resource group. Replace `<resource-group-name>` with your resource group name and `<location>` with your desired Azure region:\n  \n   az deployment group create --resource-group <resource-group-name> --template-file infra/storageAccount.bicep --parameters storageAccountName=<your-storage-account-name> containerName=<your-container-name> fileShareName=<your-file-share-name> location=<location>\n\n\nThis command will deploy the resources defined in your Bicep file to the specified resource group in Azure.\n\n```\n\nWhile following these instructions, if you get stuck or encounter a problem, continue asking GitHub Copilot questions creating prompts including the word `azure` in the chat pane.\n\n\n## Related content\n\n- [Bicep overview](/azure/azure-resource-manager/bicep/overview)\n- [What is GitHub Copilot for Azure?](introduction.md)\n- [Get started with GitHub Copilot for Azure](get-started.md)\n"
  },
  {
    "path": "articles/github-copilot-azure/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: GitHub Copilot for Azure\n      tocHref: /azure\n      topicHref: /azure/developer/github-copilot-azure/index"
  },
  {
    "path": "articles/github-copilot-azure/deploy-examples.md",
    "content": "---\ntitle: GitHub Copilot for Azure prompt engineering examples for deploying your application\ndescription: This article provides example prompts that can help you deploy your application to the cloud.\nkeywords: github, copilot, ai, azure\nms.service: github-copilot-for-azure\nms.topic: best-practice\nms.date: 12/16/2025\nms.collection: ce-skilling-ai-copilot\n---\n\n# Example prompts for deploying your application with GitHub Copilot for Azure\n\nIf you're unfamiliar with Azure or you just want the tooling and AI to do most of the work, you can ask GitHub Copilot for Azure and Azure MCP Server to help you deploy your application. Use [best practices](introduction.md#best-practices) to achieve the best results. Most importantly:\n\n- Use \"Agent\" mode for the best experience. Avoid \"Ask\" mode.\n- Include the word \"Azure\" in the prompt to help Copilot understand that it needs to call tools from the Azure MCP Server.\n- If using Visual Studio Code, make sure you use \"Configure Tools ...\" and include both \"Azure MCP\" and \"GitHub Copilot for Azure\". [See the Tool calling section's Visual Studio Code tab](introduction.md#tool-calling) for more details.\n\n## Example prompts for deploying an app\n\nIf you want to use GitHub Copilot for Azure for help with deploying your application, you can start with an open-ended question or request like one of these examples:\n\n- \"Help me deploy my application to Azure.\"\n- \"How can I deploy this app to Azure?\"\n- \"Deploy this project to Azure.\"\n- \"Run this app on Azure.\"\n\n\nThen, add more detail for better results. Here are some example prompts:\n\n|Service or technology|Deploy prompt examples|\n|---|---|\n|Azure Kubernetes Service (AKS)|<ul><li>\"Can you help me create a new deployment in my AKS cluster?\"</li><li>\"What is the Azure command to scale a deployment to 5 replicas?\"</li><li>\"Can you provide the Azure command to expose a deployment as a service?\"</li></ul>|\n|Azure App Service|<ul><li>\"How many Azure web app plans using the free tier do I have deployed, grouped by region in my \\<your-subscription-id\\> subscription?\"</li><li>\"How many Azure web apps do I have deployed in eastus?\"</li></ul>|\n|Azure Container Apps|<ul><li>\"How can I deploy my container app to Azure?\"</li></ul>|\n|Azure Developer CLI (`azd`)|<ul><li>\"Use azd to deploy my Azure project.\"</li><li>\"I want to use azd to create a deployment pipeline for my Azure application.\"</li><li>\"Initialize my project with the Azure Developer CLI.\"</li><li>\"Please start an azd deployment pipeline in Azure.\"</li></ul>|\n|Azure DevOps|<ul><li>\"Create a deployment pipeline for my Azure project.\"</li><li>\"I don't want to deploy my app from my local machine — can you set up a remote Azure solution instead?\"</li><li>\"I need a CI/CD pipeline so I can deploy my app to Azure.\"</li><li>\"I need help setting up a pipeline to deploy my app to Azure.\"</li><li>\"Please help me create an automated Azure deployment pipeline for my app.\"</li><li>\"This project is ready for automated deployment — set it up in Azure.\"</li></ul>|\n|Azure OpenAI Service|<ul><li>\"Create an Azure OpenAI deployment using the gpt-3.5-turbo model with a Terraform template, setting the model version to 0613.\"</li></ul>|\n|GitHub Actions|<ul><li>\"Let's use GitHub Actions to deploy my app to Azure.\"</li><li>\"Set up a GitHub Actions pipeline to deploy my Azure app.\"</li></ul>|\n\nIn many cases, when you ask GitHub Copilot for Azure to choose Azure services and deploy your application to Azure, it will create Bicep templates and give you the option to use `azd` to begin deployment. \n\n>[!IMPORTANT]\n>You should always inspect the Bicep templates to ensure you understand what GitHub Copilot for Azure is recommending. Furthermore, the templates are intended to be a starting point. You should plan on editing the templates to suit your needs.\n\n## GitHub Copilot for Azure to deploy models to Azure OpenAI Service\n\nIn addition to the example prompts for deploying to Azure OpenAI Service, GitHub Copilot for Azure has the following capabilities:\n\n- Given an existing OpenAI resource, user can deploy a model and optionally input a name for model to deploy.\n- Given the name of an existing resource group, and optionally location, user can deploy a model, and GitHub Copilot for Azure will deploy a new OpenAI resource. User needs to input the name of the new OpenAI resource to create.\n- Given the location, user can deploy a model, and GitHub Copilot for Azure will deploy a new resource group and OpenAI resource.  User needs to input the name of the new resource group and OpenAI resource to create.\n- If there is insufficient quota error, the user will be asked to choose a different region.\n\n## Example prompts for Azure Kubernetes Service (AKS)\n\nGitHub Copilot for Azure enables users to perform a robust set of tasks related to Azure Kubernetes Service (AKS) directly from the GitHub Copilot Chat view. These skills include creating an AKS cluster, deploying a manifest to an AKS cluster, and generating Kubectl commands.\n\n### Create an AKS Cluster\n\nUsers can quickly set up an AKS cluster using simple, natural language prompts. GitHub Copilot for Azure reduces the complexity and time required to manually configure and deploy a Kubernetes cluster.\n\nYou can create an AKS cluster using the following prompts:\n\n- \"Can you help me create a Kubernetes cluster in Azure?\"\n- \"Can you set up an AKS cluster for me?\"\n- \"I have a containerized application—can you help me create an AKS cluster to host it?\"\n- \"Create an AKS cluster.\"\n- \"Help me create a Kubernetes cluster in Azure to host my application.\"\n\n\n### Deploy a Manifest to an AKS Cluster\n\nUsers can deploy their application manifests to an AKS cluster directly from the GitHub Copilot Chat view. This simplifies the deployment process and ensures consistency. Use these predefined prompts to reduce the risk of errors during deployment, leading to more reliable and stable deployments.\n\nTo deploy a manifest file to an AKS cluster, you can use these prompts:\n\n- \"Help me deploy my manifest file to Azure.\"\n- \"Can you deploy my manifest to my AKS cluster?\"\n- \"Can you deploy my manifest to my Azure Kubernetes cluster?\"\n- \"Deploy my application manifest to an AKS cluster.\"\n- \"Deploy the manifest for my AKS cluster.\"\n\n### **Generate Kubectl Command**\n\nUsers can generate various Kubectl commands to manage their AKS clusters without needing to remember complex command syntax. Using GitHub Copilot for Azure makes cluster management more accessible and efficient, especially for users who aren't Kubernetes experts.\n\nYou can generate various Kubectl commands for your AKS cluster using these prompts:\n\n- \"List all services for my AKS cluster.\"\n- \"Show the kubectl command to get deployments with at least 2 replicas in my AKS cluster.\"\n- \"Get all services in my AKS cluster with external IPs.\"\n- \"What is the kubectl command to get pod info for my AKS cluster?\"\n- \"Get the kubectl command for listing all API resources in Azure.\"\n\n## Example prompts for undeploying an app\n\nIf you deployed your application with `azd`, you can ask GitHub Copilot for Azure for undeploying assistance. As a Visual Studio Code extension, it has context about where and how you deployed your application to Azure.\n\nExample prompts:\n\n- \"Undeploy my project using the Azure Developer CLI.\"\n- \"Use azd to undeploy my Azure project.\"\n- \"Undeploy this project from Azure.\"\n- \"Stop this app running on Azure.\"\n- \"Remove this code from running on Azure.\"\n\n> [!NOTE]\n> Currently, GitHub Copilot for Azure can only undeploy an app if it was originally deployed with AZD.\n\n## Related content\n\n- [Understand what GitHub Copilot for Azure is and how it works](introduction.md).\n- [Get started](get-started.md) with GitHub Copilot for Azure by installing the software and writing your first prompt.\n- Follow the [quickstart](quickstart-deploy-app-agent-mode.md) to understand how to include GitHub Copilot for Azure in your software development workflow. The quickstart describes how to deploy services to Azure, monitor their status, and troubleshoot problems.\n- See example prompts for [designing and developing applications for Azure](design-develop-examples.md).\n- See example prompts for [learning more about Azure and understanding your Azure account, subscription, and resources](learn-examples.md).\n- See example prompts for [troubleshooting your Azure resources](troubleshoot-examples.md).\n"
  },
  {
    "path": "articles/github-copilot-azure/design-develop-examples.md",
    "content": "---\ntitle: GitHub Copilot for Azure prompt engineering examples for designing and developing your application\ndescription: This article provides example prompts that can help you design and develop your application in the cloud.\nkeywords: github, copilot, ai, azure\nms.service: github-copilot-for-azure\nms.topic: best-practice\nms.date: 12/16/2025\nms.collection: ce-skilling-ai-copilot\n---\n\n# Example prompts for designing and developing your application with GitHub Copilot for Azure\n\nIf you're unfamiliar with Azure or you just want the tooling and AI to do most of the work, you can ask GitHub Copilot for Azure and Azure MCP Server to help you deploy your application. Use [best practices](introduction.md#best-practices) to achieve the best results. Most importantly:\n\n- Use \"Agent\" mode for the best experience. Avoid \"Ask\" mode.\n- Include the word \"Azure\" in the prompt to help Copilot understand that it needs to call tools from the Azure MCP Server.\n- If using Visual Studio Code, make sure you use \"Configure Tools ...\" and include both \"Azure MCP\" and \"GitHub Copilot for Azure\". [See the Tool calling section's Visual Studio Code tab](introduction.md#tool-calling) for more details.\n\n## Example prompts to create an entire sample app\n\nIf you want to use GitHub Copilot for Azure for help with building your application, you can start with an open-ended question or request. Then, add details like specific programming languages, frameworks, services and technologies for better results. Try the following example prompts.\n\n- \"Could you help me create and deploy a simple Flask website using Python on Azure?\"\n- \"Can you help me build a Python RAG application on Azure?\"\n\n## Prompts to design APIs\n\nYou can now leverage GitHub Copilot for Azure for a variety of API-related tasks which utilizes the Azure API Center plugin: \n\n- **Generating API Specifications**: Describe your requirements in natural language, and GitHub Copilot for Azure will create new API specifications tailored to your needs. It can also help you register these APIs into the API Center swiftly. \n- **Designing Compliant APIs**: Design API specifications that comply with API Center governance. The AI assistance ensures that your APIs are designed according to best practices and standards.\n\nExamples:\n\n- \"Generate an OpenAPI spec for an Azure API that accepts purchase orders for specialized coffee beans.\"\n- \"Generate an OpenAPI spec for an Azure API to handle customized pizza delivery orders for our pizza company.\"\n\n## Related content\n\n- [Understand what GitHub Copilot for Azure is and how it works](introduction.md).\n- [Get started](get-started.md) with GitHub Copilot for Azure by installing the software and writing your first prompt.\n- Follow the [quickstart](quickstart-deploy-app-agent-mode.md) to understand how to include GitHub Copilot for Azure in your software development workflow. The quickstart describes how to deploy services to Azure, monitor their status, and troubleshoot problems.\n- See example prompts for [learning more about Azure and understanding your Azure account, subscription, and resources](learn-examples.md).\n- See example prompts for [deploying your application to Azure](deploy-examples.md).\n- See example prompts for [troubleshooting your Azure resources](troubleshoot-examples.md).\n"
  },
  {
    "path": "articles/github-copilot-azure/generate-deploy-django-postgresql.md",
    "content": "---\ntitle: Generate a Django and PostgreSQL app and deploy to Azure\ndescription: This article demonstrates how to prompt GitHub Copilot along with GitHub Copilot for Azure to generate an entire app, then deploy to Azure App Service and Azure PostgreSQL Flexible Server.\nkeywords: github, copilot, ai, azure\nms.service: github-copilot-for-azure\nms.topic: how-to\nms.date: 12/19/2025\nms.collection: ce-skilling-ai-copilot\n---\n\n# Generate a Django and PostgreSQL app and deploy to Azure\n\nThis article guides you in how to interact with GitHub Copilot to generate a local Django web app that performs CRUD operations on a PostgreSQL database. Next, it guides you in how to interact with GitHub Copilot for Azure to deploy the web app and database to Azure App Service and Azure PostgreSQL Flexible Server (along with several supporting Azure services).\n\nThe specific application you create is a trivial contact management application that features CRUD operations with a list-detail style architecture.\n\n> [!NOTE]\n> Using a Large Language Model (LLM) to generate an application may yield inconsistent results. Your results depend on the LLM model, your instructions, and more. The focus of this guide is to help you understand how to get better results. However each time you go through this example, you get (potentially) dramatically different results.\n\n## Prerequisites\n\n[!INCLUDE [ghcpa-prerequisites](includes/prerequisites.md)]\n\n- [GitHub Copilot for Azure](./get-started.md)\n\n- [Python extension to Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python). For instructions on how to install the extension, see [Install Python and the Python extension](https://code.visualstudio.com/docs/languages/python#_install-python-and-the-python-extension).\n\n- PostgreSQL, including pgAdmin (available from the [PostgreSQL Windows installer](https://www.postgresql.org/download/windows/))\n\n- Git Bash (available from the [Git installer for Windows](https://git-scm.com/downloads))\n\n- [PostgreSQL for Visual Studio Code (Preview) extension](https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql). For instructions on installing and using the extension see [Quickstart: Connect and query a database with the PostgreSQL extension for Visual Studio Code preview](/azure/postgresql/extensions/vs-code-extension/quickstart-connect).\n\n- Azure CLI. For instructions on how to install the Azure CLI, see [How to install the Azure CLI](/cli/azure/install-azure-cli).\n\n- Azure Developer CLI (`azd`). For instructions on how to install `azd`, see [Install or update the Azure Developer CLI](/azure/developer/azure-developer-cli/install-azd?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&pivots=os-windows).\n\n\n## Prepare the chat session \n\n1. In Visual Studio Code, use the Toggle Chat button in the title bar or select <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>i</kbd> to open the Chat Window. Use the New Chat icon to create a new chat session.\n\n1. In the chat area, select `Agent` mode. At the time of this writing,  `Claude Sonnet 4` yields the best results. Use the best model available for code generation.\n\n\n## Validate your configuration\n\nMake sure your CLI tools and Visual Studio Code are updated, properly configured and operating correctly to improve your results.\n\n1. In a new chat, enter the following prompt:\n\n   ```\n   \n   I want to create a new Django website that stores data in PostgreSQL. Then, I'll want\n   to deploy that new website to Azure. Do I have everything installed on my local \n   computer that you will need to perform these tasks?\n   \n   ```\n\n   GitHub Copilot will ask permission to run a series of command line checks to ensure you have the tools, as well as the most up to date versions of those tools, installed.\n\n1. In your terminal, update the Azure CLI with the command `az --upgrade`.\n\n1. In your terminal, install the service connector passwordless extension for Azure CLI with the command `az extension add --name serviceconnector-passwordless --upgrade`\n\n1. In Visual Studio Code, set the default terminal to Git Bash. Go to File > Preferences > Settings, then in \"Search settings\", type  \"Default Profile: Windows\" and select \"Git Bash\". You may need to restart Visual Studio Code for this setting to take effect.\n\n   > [!Note] \n   > Using Git Bash isn't strictly necessary, but at the time of this writing it yields the best results.\n\n1. In Visual Studio Code, use the PostgreSQL for Visual Studio Code (Preview) extension and navigate to the `contacts` database.\n\n1. In Visual Studio Code, use the Azure extension and ensure you're logged into your Azure account and subscription. When you open the Azure extension in the primary side bar, you should be able to view your existing subscriptions and resources.\n\n1. Create a new folder for your new application files and open it in Visual Studio Code as your workspace.\n\n\n## Set up the local database\n\nWhile GitHub Copilot is capable of performing virtually any application development task that developers typically perform, you will get the best results if you take some tasks in smaller steps. To improve results, create the database and set up authentication and authorization before working with GitHub Copilot.\n\n1. Create a new chat, and use the following prompt:\n\n   ```\n\n   On my PostgreSQL server localhost, please create a new database named 'contacts'.\n\n   Then create a new user <db-username> with password `<password>` and give that \n   user full rights (create tables and other db objects, CRUD data) to the new \n   contacts database.\n\n   Please do the work, and only prompt me when you are unable to do it yourself.\n\n   ```\n\n   Replace `<db-username>` and `<password>` with your desired database username and password, respectively.\n\n1. On Windows machines, the recommended security best practice is to store the database username and password in a local file:\n\n   `%APPDATA%\\postgresql\\pgpass.conf`\n\n   This will typically resolve the following location on your hard drive:\n\n   `c:\\Users\\<username>\\AppSettings\\Roaming\\postgresql\\pgpass.conf`\n   \n   Replace `<username>` with your Windows username.\n\n   The file should use the following format:\n\n   ```\n   localhost:5432:<database-name>:<database-user>:<password>\n   ```\n\n   This assumes you're working with an instance of PostgreSQL on your local computer, and that it's hosted at the default port (5432).\n   \n   Replace `<database-name>` with `contacts` and replace `<db-username>` and `<password>` with the credentials you used in the previous step.\n\n   For more information about the `pgpass.conf` file see [PostgreSQL's documentation](https://www.postgresql.org/docs/current/libpq-pgpass.html).\n\n1. Add the path to the `pgpass.conf` file into your PATH environment variable.\n\n1. Test the connection to ensure that it works. Use the psql CLI to test it with the following command:\n\n   ```bash\n   psql -h localhost -U <db-username> -d contacts\n   ```\n   Replace `<db-username>` with the database username segment in the `pgpass.conf` file.\n\n   If the `pgpass.conf` is not set up correctly, you'll see a prompt for you to type in your password.\n\n\n\n## Generate an app using GitHub Copilot\n\nFirst, you provide instructions and guidance on building and testing the application on your local computer.\n\n1. In Visual Studio Code, use the Toggle Chat button in the title bar to open the Chat Window. Use the New Chat icon to create a new chat session.\n\n1. In the chat area, select `Agent` mode. At the time of this writing,  `Claude Sonnet 4` yields the best results. Use the best model available for code generation.\n\n1. Use the following prompt to begin application generation:\n\n   ```copilot-prompt\n\n   I want you to create a simple Contact Manager application using Django and PostgreSQL. \n   \n   This should be a CRUD application, so create web pages that display a list of \n   contacts, view details, add a new contact, edit or delete a contact. Each Contact \n   is comprised of a contact's Name, Address, and Phone number. Since this is a \n   Python / Django project please make sure to work inside of a virtual environment (venv). \n   I've already created a PostgreSQL database at `localhost` named `contacts`. There are \n   no tables yet. For local development in PostgreSQL, I'm using a `pgpass.conf` file \n   and I have tested that it works. Prefer Git Bash in the terminal. Beyond that, if there's \n   anything I need to do, please include instructions. But I want you to do as much as \n   you can on your own.\n\n   ```\n\n   The prompt has the following features:\n\n   - **The type of application you want to create.** In this case, a contact management application.\n   - **The technologies to use.** In this case, Django and PostgreSQL.\n   - **The site architecture you want to generate.** In this case, a CRUD style application that features a page that lists all contact and allows you to drill down into a specific contact.\n   - **More detail about the problem domain.** In this case, you provide the fields of data you want the application to manage, including the contact's name, address, and phone number.\n   - **Specific instructions regarding the database.** In this case, you instruct GitHub Copilot to use a specific database that you already created, you provide the state of the database, and how to interact\n   - **Specific instructions about the environment.** In this case, you instruct it to use Git Bash. You also tell it that you want the work to be performed in a Python environment (venv), which is a best practice. GitHub Copilot might choose these options on its own, but stating it explicitly makes the process go smoothly.\n   - **Explicit expectations that you want it to do as much work on its own as possible.** Otherwise, GitHub Copilot might provide instructions for you to take.\n   - **Explicit expectations for instructions / context.** If it needs you to perform other actions, you set the expectation that you need it to help you by providing instructions and guidance.\n\n   >[!IMPORTANT]\n   > When GitHub Copilot uses the terminal to create a new virtual environment, Visual Studio Code detects the `venv` and displays a dialog asking whether you want to use it. Ignore that dialog. It goes away. Allow GitHub Copilot to use the terminal exclusively for this operation.\n\n   GitHub Copilot uses the built-in terminal and the Visual Studio Code environment to:\n\n   - Create a Python virtual environment\n   - Install libraries and other dependencies\n   - Generate code files\n   - Generate database tables \n   - Generate readme files for further instructions\n   - Create test data\n   - Launch a local web server\n   - Test the website (using Simple Browser or curl)\n\n   Due to how LLMs generate code, the commands it uses and what it produces are different each time.\n\n## Deploy to Azure with GitHub Copilot for Azure\n\nAfter GitHub Copilot generates the site locally, you'll author a prompt asking GitHub Copilot to make changes to the site in preparation for deployment, and then to perform the deployment. The GitHub Copilot for Azure extension handles this request by creating Bicep files then running those files using the `azd` CLI.\n\nUse the following prompt ... you may copy to Notepad and change any value in brackets like `<resource-group-name>` and `<region-name>` then copy and paste into GitHub Copilot chat:\n\n```copilot-prompt\n\nPlease help me deploy this Django app to Azure. \n\nFirst, create and use a Resource Group named \"<resource-group-name>\" in the \"<region-name>\" region.\n\nSecond, create an Azure App Service for the Django app in the new \"<resource-group-name>\" in the \"<region-name>\" region.\n\nThird, create a new Azure Database for PostgreSQL flexible server named \"<server-name>\" in a resource group named \"<resource-group-name>\" in my subscription \"<subscription-id>\". Use my current account (\"<account-id>\") as the Microsoft Entra administrator. For the PostgreSQL \"Administrator login\", use \"<azure-database-username>\" and password \"<azure-database-password>\". Use a \"development\" class database configuration in the \"<region-name>\" region. Create a new database named \"contact_manager_db\" and migrate all tables and data from the local version of \"contact_manager_db\". The local database uses the username \"<local-database-username>\" and password \"<local-database-password>\". Add my IP address as a firewall rule, allow public access to this resource through the internet using a public IP address, and allow public access from any Azure service within Azure to this server.\n\nFourth, use Service Connector (and any other services you need to make this configuration work successfully) to connect the web app to the database. You may need to modify the application code to accommodate Service Connector. Also, please ensure a secure connection between the Azure App Service web site and the Azure PostgreSQL Flexible Server.\n\nPlease choose the least expensive options.  \n\nIf you are prompted for an environment, use the name \"contacts-env\". Configure my firewall to allow my IP address. Beyond that, if there's anything \nI need to do, please include instructions. But I want you to do as much as you can on your own.\n\nBefore you start: \n\n- Do you have any questions that need to be clarified? \n- Please create a plan for deployment in the form of a TODO list, and then update the TODO list as you progress. Do not start until I have a chance to review your plan and tell you to proceed.\n\n```\n\nThe prompt has the following features:\n\n   - **Specific services you want to use.** In this case, you tell it that you want to use Azure App Service, Azure PostgreSQL Flexible Server, Service Connector. You also give it the instruction to \"do whatever else you need to do\" to ensure it works.\n   - **Specific service options.** In this case, you indicate that you want to use the least expensive option possible for each service.\n   - **Hint at probable next steps.** In this case, you suggest that some code modification is necessary in order to use Service Connector.\n   - **Anticipate decisions ahead of time.** In this case, you provide the answer to settings it needs, such as an environment name for `azd`, \n   - **Explicit expectations that you want it to do as much work on its own.** Otherwise, it might provide instructions for you to take.\n   - **Explicit expectations for instructions / context.** Set the expectation that you need help and guidance when it asks you to take action.\n   - **Asks if any clarification is needed.** This often surfaces potential issues like edge cases or unclear instructions.\n   - **Requests a plan with a TODO list.** Gives you confidence that GitHub Copilot for Azure understands the assignment and plans to carry it out as you intended.\n\n   GitHub Copilot uses the built-in terminal and the Visual Studio Code environment to:\n\n   - Update the code files to accommodate Service Connector\n   - Generate Bicep files\n   - Run the `azd` CLI\n   - Test the deployment\n   - If necessary, debug the deployment using logs or other output\n\n\n## Interact with GitHub Copilot\n\nGitHub Copilot requires your input before performing many tasks. A pause for input is your opportunity to direct GitHub Copilot to course correct in order to prevent mistakes or customize generated output to your preferences.\n\nWhile it's working, you can watch and agree to most of the questions it asks you using the `Continue` button.\n\n   >[!IMPORTANT]\n   > If you get unexpected results, restart using a new chat session.\n\nOccasionally, you're required to provide input. There are a few distinct moments when you're prompted for input:\n\n- **User credentials** - If the current operation in the terminal requires a username or password, you will be prompted for this information.\n- **Moment of decision** - Occasionally, GitHub Copilot gives you several options in a list and ask which you prefer.\n- **The Command Palette** - Occasionally, GitHub Copilot uses the features of an extension and the options are displayed in the Command Palette. Once you make the proper selections, GitHub Copilot proceeds.\n- **Interactive login** - The Azure CLI and `azd` CLI need you to authenticate, and initiates one of several authentication mechanisms.\n\n### Testing and asking for changes\n\nWhen GitHub Copilot finishes, it's possible that it considers the site to be complete and functional. However, your testing might discover issues, or unexpected / undesirable app features.\n\nUse prompts that describe the issue with as much detail as possible. For example, if the application isn't functioning, provide as much information as possible,**including the exact error message** and the expected result.\n\n\n### Interrupting the flow\n\nOccasionally, you might notice that GitHub Copilot is either stuck in a loop attempting to perform the same tasks repeatedly or it's stuck in a process that never returns. For example, when diagnosing problems with the website, GitHub Copilot might want to run a command like:\n\n```bash\naz webapp log tail\n```\n\nWhen GitHub Copilot is stuck, you can interrupt GitHub Copilot in one of several ways:\n\n- <kbd>Ctrl</kbd>+<kbd>c</kbd>\n- Use the pause button in the chat\n- End the chat session and start a new chat\n\n> [!Important] \n> Ending the chat session destroys all the context built up during the session, which might or might not be desirable.\n\nTo provide it context to what just happened, and nudge it towards a possible solution, you could add a prompt immediately after interrupting the GitHub Copilot such as:\n\n```copilot-prompt\nYou were just getting the logs from Azure App Service but it did not return \nso you got stuck. Try to interrupt after a minute once you get what you need \nfrom the logs.\n```\n\n## Next steps\n\n- [What is GitHub Copilot?](https://docs.github.com/en/copilot/about-github-copilot/what-is-github-copilot)\n- [What is Bicep?](/azure/azure-resource-manager/bicep/overview?tabs=bicep)\n"
  },
  {
    "path": "articles/github-copilot-azure/get-started.md",
    "content": "---\ntitle: Get started with GitHub Copilot for Azure\ndescription: This article describes the requirements and installation procedure for the GitHub Copilot for Azure Visual Studio Code extension.\nkeywords: github, copilot, ai, azure\nms.service: github-copilot-for-azure\nms.topic: get-started\nms.date: 10/17/2025\nms.collection: ce-skilling-ai-copilot\nms.custom: sfi-image-nochange\nzone_pivot_group_filename: developer/github-copilot-azure/github-copilot-azure-zone-pivot-groups.json\nzone_pivot_groups: ide-options\n---\n\n# Get started with GitHub Copilot for Azure\n\nGet started with GitHub Copilot for Azure to streamline your development workflow and enhance your productivity on the Azure platform. This guide walks you through the prerequisites and installation of the GitHub Copilot for Azure in Visual Studio, so you can write your first prompt.\n\n::: zone pivot=\"visual-studio-code\"\n[!INCLUDE [get-started-vscode](./includes/get-started-vscode.md)]\n::: zone-end  \n\n::: zone pivot=\"visual-studio-2022\"  \n[!INCLUDE [get-started-vs2022](./includes/get-started-visual-studio-2022.md)]\n::: zone-end\n\n::: zone pivot=\"visual-studio-2026\"  \n[!INCLUDE [get-started-vs2026](./includes/get-started-visual-studio-2026.md)]\n::: zone-end\n\n## Related content\n\n- [Understand what GitHub Copilot for Azure is and how it works](introduction.md).\n- Follow the [quickstart](quickstart-deploy-app-agent-mode.md) to understand how to include GitHub Copilot for Azure in your software development workflow. The quickstart describes how to deploy services to Azure, monitor their status, and troubleshoot problems.\n- See example prompts for [learning more about Azure and understanding your Azure account, subscription, and resources](learn-examples.md).\n- See example prompts for [designing and developing applications for Azure](design-develop-examples.md).\n- See example prompts for [deploying your application to Azure](deploy-examples.md).\n- See example prompts for [troubleshooting your Azure resources](troubleshoot-examples.md).\n"
  },
  {
    "path": "articles/github-copilot-azure/github-copilot-azure-zone-pivot-groups.yml",
    "content": "# YamlMime:ZonePivotGroups\ngroups:\n# Owner: rotabor\n- id: ide-options\n  title: IDE options\n  prompt: Choose an IDE\n  pivots:\n  - id: visual-studio-code \n    title: Visual Studio Code\n  - id: visual-studio-2022\n    title: Visual Studio 2022\n  - id: visual-studio-2026\n    title: Visual Studio 2026\n"
  },
  {
    "path": "articles/github-copilot-azure/includes/get-started-visual-studio-2022.md",
    "content": "---\nauthor: rotabor\nms.service: github-copilot-for-azure\nms.topic: include\nms.date: 04/10/2026\n---\n\n## Prerequisites\n\nTo complete the steps in this article, make sure that you have:\n\n- A GitHub account and a GitHub Copilot subscription. For details on how to set them up, see [Creating an account on GitHub](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github) and [Quickstart for GitHub Copilot](https://docs.github.com/en/copilot/quickstart), respectively.\n\n- Visual Studio 2022 version 17.14.30 or later (any edition). For details on how to download and install it, see [Install Visual Studio](/visualstudio/install/install-visual-studio).\n\n>[!IMPORTANT]\n>GitHub Copilot is a separate subscription managed by GitHub. For questions regarding GitHub Copilot subscriptions and Support, see [Getting started with a GitHub Copilot plan](https://docs.github.com/en/copilot/how-tos/manage-your-account/get-started-with-a-copilot-plan).\n\nBy default, Copilot in Azure is available to all users in a tenant. However, Global Administrators can manage access to Copilot in Azure for their organization. Access can also be optionally granted to specific Microsoft Entra users or groups. For more information, see [Manage access to Microsoft Copilot in Azure](/azure/copilot/manage-access).\n\n## Install GitHub Copilot for Azure\n\nAzure MCP is built in to Visual Studio 2022. No separate GitHub Copilot for Azure extension is required; the Azure MCP tools are included with the Azure development workload.\n\n1. If you already installed Visual Studio 2022 and want to add GitHub Copilot for Azure after initial install, open Visual Studio Installer and select the **Modify** button, which displays the available workloads.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2022-installer-modify.png\" alt-text=\"Screenshot that shows the Visual Studio Installer with the Modify button highlighted.\":::\n\n   If you're installing Visual Studio 2022 for the first time, the Visual Studio Installer automatically displays the available workloads.\n\n1. On the Workloads tab, make sure the **Azure development** workload is selected.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2022-installer-workloads.png\" alt-text=\"Screenshot that shows the Visual Studio Installer with the Azure development button highlighted.\":::\n\n1. Select the **Install** button to complete the installation.\n\n> [!NOTE]\n> Azure MCP tools are serviced with regular Visual Studio updates. To get updates, use the Visual Studio Installer (**Modify** or **Update**) and ensure you are on the latest Visual Studio 2022 version.\n\n1. Launch Visual Studio 2022 and create or load a project.\n\n1. Open GitHub Copilot Chat.\n\n1. If prompted, sign in to your GitHub account.\n\n1. If prompted, sign in to your Azure account.\n\n1. In the chat area, select the Select tools button (two wrenches icon) to display a list of available tools. Enable all Azure tools by checking the top nodes for **Azure MCP Server v.x.x.x**.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2022-select-tools-mcp-server.png\" alt-text=\"Screenshot that shows the select tools dialog with the Azure MCP Server node checked.\":::\n\n> [!NOTE]\n> The Azure MCP tools are disabled by default in Visual Studio 2022 and need to be manually enabled before use. Once enabled from the Select tools dialog, your Azure MCP tool selections persist across sessions. Visual Studio 2026–specific tools aren't available in Visual Studio 2022.\n\n## Write your first prompt\n\n1. If the Chat window isn't already open, make sure it's open by selecting the **View** > **GitHub Copilot Chat** menu option. You should see chat window docked to the right side by default.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2022-chat-window.png\" alt-text=\"Screenshot that shows the GitHub Copilot Chat window in Visual Studio 2022.\":::\n\n1. In the chat text area at the bottom of the chat pane, enter the following prompt:\n\n   ```prompt\n   Do I have any resources currently running?\n   ```\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2022-first-prompt.png\" alt-text=\"Screenshot that shows an example prompt typed into the chat area in Visual Studio 2022.\":::\n\nBy default, GitHub Copilot uses **ask** mode. Ask mode provides answers to your prompts in the chat pane. **Agent** mode enables GitHub Copilot to take action in your workspace.\n\nThe answer to your question depends on what's currently running in Azure in your subscription.\n\n## Agent mode\n\nIn Agent mode, GitHub Copilot can perform tasks across your entire Visual Studio workspace, making edits, executing terminal commands, and so on.\n\nGitHub Copilot for Azure provides \"tools\" to GitHub Copilot to enhance the agentic experience through deep integration with Azure.\n\nTo switch, between ask and agent mode, select the down chevron next to the Ask option in the chat area and select the desired mode.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2022-switch-agent-mode.png\" alt-text=\"Screenshot that shows the mode menu in the chat area in Visual Studio 2022.\":::\n\n### Enable and disable tools in agent mode\n\nYou might want to disable or re-enable certain tools available by GitHub Copilot for Azure.\n\n1. Select the \"Select tools\" icon in the chat pane.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2022-select-tools-icon.png\" alt-text=\"Screenshot of chat pane with the select tools button clicked in Visual Studio 2022.\":::\n\n1. Use the checkbox next to the list of tools to enable / disable tools (or groups of tools).\n"
  },
  {
    "path": "articles/github-copilot-azure/includes/get-started-visual-studio-2026.md",
    "content": "---\nauthor: rotabor\nms.service: github-copilot-for-azure\nms.topic: include\nms.date: 03/02/2026\n---\n\n## Prerequisites\n\nTo complete the steps in this article, make sure that you have:\n\n[!INCLUDE [ghcpa-prerequisites-2026](./prerequisites-2026.md)]\n\nBy default, Copilot in Azure is available to all users in a tenant. However, Global Administrators can manage access to Copilot in Azure for their organization. Access can also be optionally granted to specific Microsoft Entra users or groups. For more information, see [Manage access to Microsoft Copilot in Azure](/azure/copilot/manage-access).\n\n## Install GitHub Copilot for Azure\n\n1. If you already installed Visual Studio 2026 and want to add GitHub Copilot for Azure after initial install, open Visual Studio Installer and select the **Modify** button, which displays the available workloads.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2026-installer-modify.png\" alt-text=\"Screenshot that shows the Visual Studio Installer with the Modify button highlighted.\":::\n\n   If you're installing Visual Studio 2026 for the first time, the Visual Studio Installer automatically displays the available workloads.\n\n1.  On the Workloads tab, make sure \"Azure AI development\" is selected.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2026-installer-workloads.png\" alt-text=\"Screenshot that shows the Visual Studio Installer's available workloads with the Azure AI development option selected and highlighted.\":::\n\n1. Select the **Install** button to complete the installation.\n\n1. Launch Visual Studio 2026 and create or load a project.\n\n1. Open GitHub Copilot Chat. \n\n1. If prompted, sign in to your GitHub account. \n\n1. If prompted, sign in to your Azure account. \n\n1. In the chat area, select the **Select tools** button (two wrenches icon) to display a list of available tools. Enable all Azure tools by checking the top nodes for **Azure**.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2026-select-tools.png\" alt-text=\"Screenshot that shows the select tools dialog with the Azure node checked.\":::\n\n   Also select the top node for **Azure MCP Server**.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2026-select-tools-mcp-server.png\" alt-text=\"Screenshot that shows the select tools dialog with the Azure MCP Server node checked.\":::\n\n\n## Write your first prompt\n\n1. If the Chat window isn't already open, make sure it's open by selecting the **View** > **GitHub Copilot Chat** menu option. You should see chat window docked to the right side by default.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2026-chat-window.png\" alt-text=\"Screenshot that shows the GitHub Copilot Chat window in Visual Studio 2026.\":::\n\n1. In the chat text area at the bottom of the chat pane, enter the following prompt:\n\n   ```prompt\n   Do I have any resources currently running?\n   ```\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2026-first-prompt.png\" alt-text=\"Screenshot that shows an example prompt typed into the chat area in Visual Studio 2026.\":::\n\nBy default, GitHub Copilot uses **ask** mode. Ask mode provides answers to your prompts in the chat pane. **Agent** mode enables GitHub Copilot to take action in your workspace.\n\nThe answer to your question depends on what's currently running in Azure in your subscription.\n\n## Agent mode\n\nIn Agent mode, GitHub Copilot can perform tasks across your entire Visual Studio workspace, making edits, executing terminal commands, and so on.\n\nGitHub Copilot for Azure provides \"tools\" to GitHub Copilot to enhance the agentic experience through deep integration with Azure.\n\nTo switch, between ask and agent mode, select the down chevron next to the Ask option in the chat area and select the desired mode.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2026-switch-agent-mode.png\" alt-text=\"Screenshot that shows the mode menu in the chat area in Visual Studio 2026.\":::\n\n### Enable and disable tools in agent mode\n\nYou might want to disable or re-enable certain tools available by GitHub Copilot for Azure.\n\n1. Select the \"Select tools\" icon in the chat pane.\n\n   :::image type=\"content\" source=\"../media/get-started/visual-studio-2026-select-tools-icon.png\" alt-text=\"Screenshot of chat pane with the select tools button clicked in Visual Studio 2026.\":::\n\n1. Use the checkbox next to the list of tools to enable / disable tools (or groups of tools).\n"
  },
  {
    "path": "articles/github-copilot-azure/includes/get-started-vscode.md",
    "content": "---\nauthor: rotabor\nms.service: github-copilot-for-azure\nms.topic: include\nms.date: 03/02/2026\n---\n\n## Prerequisites\n\nTo complete the steps in this article, make sure that you have:\n\n[!INCLUDE [ghcpa-prerequisites](./prerequisites.md)]\n\nBy default, Copilot in Azure is available to all users in a tenant. However, Global Administrators can manage access to Copilot in Azure for their organization. Access can also be optionally granted to specific Microsoft Entra users or groups. For more information, see [Manage access to Microsoft Copilot in Azure](/azure/copilot/manage-access).\n\n## Install GitHub Copilot for Azure\n\n1. In Visual Studio Code, select the **Extensions** icon.\n1. In the Extensions Marketplace, search for **GitHub Copilot for Azure**. When the GitHub Copilot for Azure extension appears, select **Install**.\n1. If you're prompted, sign in to your Azure account.\n\n## Write your first prompt\n\n1. Ensure that the extension is installed, that you're properly authenticated, and that the extension is working correctly.\n\n1. If the Chat window isn't already open, make sure it's open by either selecting the **Toggle Chat** button in the menu bar, or select the dropdown next to the **Toggle Chat** button and select **Open Chat (Ctrl+Alt+I)**.\n\n   :::image type=\"content\" source=\"../media/get-started/open-chat.png\" alt-text=\"Screenshot that shows the Toggle Chat menu open and selecting the Open Chat menu option.\":::\n\n1. In the chat text area at the bottom of the chat pane, enter the following prompt:\n\n   ```prompt\n   Do I have any Azure resources currently running?\n   ```\n\n   The answer to your question depends on what's currently running in Azure in your subscription.\n\n1. Next, use the following prompt:\n\n   ```\n   What are your tools?\n   ```\n\n   The completion response displays a list of GitHub Copilot for Azure specific tools available to GitHub Copilot. The response provides a good overview of the kinds of functionality now available to you:\n\n   ```\n   I'll ask the Azure development helper to recommend custom modes relevant to listing and explaining the GitHub Copilot for Azure tools in VS Code; expected outcome: a short set of recommended modes or tips to tailor the tools explanation.\n\n   Progress update: I queried the Azure development helper to get recommended custom modes for this topic. Next, I'll list and briefly explain the tools I have available (grouped and with example prompts and common uses) so you can copy/paste or use them directly in VS Code.\n\n   Tools I can use (concise overview)\n\n   1. Search & navigation\n\n      - Capabilities: semantic code/documentation search, file search with globs, text search (grep), list directory contents, read file contents, find usages/references.\n      - Example prompts:\n         - \"Find all usages of MyService in this workspace.\"\n         - \"Search for connectionString in **/*.config files.\"\n      - When to use: locating code, docs, or examples quickly inside your repo.\n\n   2. Code editing & analysis\n      - Capabilities: insert edits into files, create or modify files, suggest refactors, report code errors, find test files.\n      - Example prompts:\n         - \"Add a function to validate input in src/utils.js.\"\n         - \"Refactor this function to use async/await and update its tests.\"\n      - When to use: implementing features, fixing bugs, generating or updating code.\n\n   3. Terminal & Git operations\n\n      - Capabilities: run shell commands, read terminal output, show git diffs and changed files.\n      - Example prompts:\n         - \"Run npm test and show me failing tests.\"\n         - \"Stage and commit the changes with message 'fix: update README'.\"\n      - When to use: run builds/tests, inspect outputs, perform git workflows (if enabled).\n\n   4. Project creation & workspace setup\n\n      - Capabilities: create new workspaces, scaffold projects (templates), install VS Code extensions, create notebooks.\n      - Example prompts:\n         - \"Generate a Node.js express app scaffold in a new folder.\"\n         - \"Add recommended extensions for Python development.\"\n      - When to use: bootstrapping projects or adding project-level config.\n\n   5. Web & API tools\n\n      - Capabilities: fetch web pages, retrieve API docs (for example VS Code API references), gather remote content for research.\n      - Example prompts:\n         - \"Fetch the Azure CLI docs for az storage account list.\"\n         - \"Get the VS Code extension API docs for commands.\"\n      - When to use: look up official docs or examples during work.\n\n   6. Azure-specific tools\n\n      - Capabilities: Azure development best practices guidance, Microsoft Learn documentation lookup, query Azure Resource Graph (when authenticated), manage Azure auth context (change tenant, sign out), generate Azure CLI / Bicep / ARM snippets, Bicep schemas, and guidance for deploying models and services.\n      - Example prompts:\n         - \"What are Azure best practices for deploying this function app?\"\n         - \"@azure /changeTenant — set my default tenant to <tenant-id>\"\n         - \"Generate a Bicep template for an App Service and a Storage Account.\"\n      - When to use: any task that touches Azure resources, deployment, or configuration.\n\n   7. Documentation & learning\n\n      - Capabilities: search and extract Microsoft Learn articles, provide code samples from official docs, show relevant how-to steps.\n      - Example prompts:\n         - \"Show official docs for configuring Key Vault access policies.\"\n         - \"Give me a short tutorial on using Azure App Configuration.\"\n      - When to use: learn or reference official Microsoft guidance.\n\n   How I present results\n\n   - Short answers or step-by-step instructions.\n   - Full edits (I can create or modify files if you allow the extension to act).\n   - Commands and code snippets you can paste into your terminal.\n   - Checks (like running tests or linters) when terminal access is allowed.\n\n   Example: Quick copy-paste prompts you can use in the VS Code chat\n   \n   - \"What are your tools?\" — lists the tools (this reply).\n   - \"Find all TODO comments in this repo and open a summary.\"\n   - \"Generate an az CLI command to list storage accounts sorted by region.\"\n   - \"@azure /changeTenant\" — opens tenant selection (if you need to set a default).\n\n   Notes and privacy/permissions\n\n   - Some capabilities (like querying your Azure resources or running commands) require you to be signed in and to enable those tools in the extension (you can enable/disable specific tools in the chat pane tool list).\n   - I won't perform actions that need elevated permissions without verifying your explicit consent.\n\n   If you'd like, I can:\n\n   - Expand any tool section with more example prompts and exact commands.\n   - Show a short step-by-step for enabling/disabling tools in the chat pane.\n   - Generate a one-page cheatsheet you can paste into an internal docs file. Which would you like next?\n   \n   ```\n\n   The contents of the reply may vary and can change over time as new capabilities and tools are added.\n\n1. To test out prompts about Azure-specific tooling, try the following prompt: \n\n   ```\n   What is the az command to list all my storage accounts ordered by location?\n   ```\n\n   The completion to that prompt might generate:\n\n   ```\n\n   I'll show the exact az CLI commands (sorted ascending/descending) plus a few useful output variants and a quick note about prerequisites.\n\n   Commands\n\n   - Sorted by location (ascending), full JSON:\n      \n      az storage account list --query \"sort_by(@, &location)\" -o json\n\n   - Sorted by location, show only name and location in a readable table:\n\n      az storage account list --query \"sort_by(@, &location)[].[name,location]\" -o table\n\n   - Sorted by location (descending):\n\n      az storage account list --query \"reverse(sort_by(@, &location))\" -o json\n\n   - Sorted by location and include resource group and SKU in table:\n\n      az storage account list --query \"sort_by(@, &location)[].[name,resourceGroup,sku.name,location]\" -o table\n\n   Notes\n\n   - Run az login first and ensure the correct subscription is selected (e.g., az account set -s \"<subscription-id-or-name>\").\n   - You need permission to list storage accounts in the chosen subscription.\n   - The query uses JMESPath (sort_by/reverse) to order results client-side.\n\n   Would you like a version that groups counts by region or that queries across all subscriptions?\n\n   ```\n\n### Enable and disable tools in agent mode\n\nYou might want to disable or re-enable certain tools available by GitHub Copilot for Azure.\n\n1. Select the tool icon in the chat pane.\n\n   :::image type=\"content\" source=\"../media/get-started/tool-icon.png\" alt-text=\"Screenshot of chat pane with highlight around the Configure Tools icon.\":::\n\n1. Use the checkbox next to the list of tools to enable / disable tools (or groups of tools).\n\n   :::image type=\"content\" source=\"../media/get-started/tool-list.png\" alt-text=\"Screenshot of the list of tools in Visual Studio Code.\":::\n\n\n## Set your default tenant\n\nIf you have multiple [Microsoft Entra ID](/entra/fundamentals/whatis#terminology) tenants, You can set a default tenant using the following prompt:\n\n   ```prompt\n   @azure /changeTenant\n   ```\n\nSelect from a list of your available tenants in the top center drop-down.\n\nYou can also set the default tenant in the extension settings:\n\n1. In Visual Studio Code, on the Activity Bar, select **Extensions**. Then scroll down to **GitHub Copilot for Azure**.\n\n   :::image type=\"content\" source=\"../media/get-started/extensions.png\" alt-text=\"Screenshot that shows GitHub Copilot for Azure in the list of extensions in Visual Studio Code.\":::\n\n2. Select the gear icon in the corner of the extension's entry, and then select **Settings** from the pop-up menu.\n\n   :::image type=\"content\" source=\"../media/get-started/settings.png\" alt-text=\"Screenshot that shows the pop-up menu for GitHub Copilot for Azure.\":::\n\n3. On the **Settings** tab, set the Azure Resource Graph tenant to your Microsoft Entra tenant ID. You can find your Microsoft Entra tenant ID in the Azure portal.\n\n   :::image type=\"content\" source=\"../media/get-started/arg-tenant.png\" alt-text=\"Screenshot that shows the Settings tab with an option to set the Azure Resource Graph tenant.\":::\n\n## View the GitHub Copilot for Azure instructions file\n\nThe **instructions** file (also referred to as \"Azure Copilot Guidelines\") contains high-level guidance for GitHub Copilot that is added to the context window when sending prompts to GitHub Copilot for Azure tools and Azure MCP Server tools. The guidance in this file is intended to be global in nature, meaning, it's intended for all interactions across GitHub Copilot for Azure across all projects. This file is located in a hidden folder location and is not intended to be modified. You should not modify this file because it could degrade or disable GitHub Copilot for Azure, and your changes might be overwritten with new updates to GitHub Copilot for Azure.\n\nViewing the \"Azure Copilot Guidelines\" can provide an insight into how the GitHub Copilot for Azure tools and the Azure MCP Server tools are introduced to GitHub Copilot helping you develop a deeper understanding of how it all works.\n\n> [!Important]\n> You should not modify this file.\n\n1. Select `ctrl` + `shift` + `p` to open the command palette.\n\n1. Type `Chat: Configure Instructions` and select the entry.\n\n   :::image type=\"content\" source=\"../media/get-started/configure-instructions-option.png\" alt-text=\"Screenshot of typing in the Visual Studio Code command palette.\":::\n\n1. In the next step, select `AzureCopilotGuidelines` .\n\n   :::image type=\"content\" source=\"../media/get-started/configure-instructions-azure-copilot-guidelines.png\" alt-text=\"Screenshot of the option to select Azure Copilot Guidelines.\":::\n\n1. A new tab opens containing the instructions file.\n\n   :::image type=\"content\" source=\"../media/get-started/configure-instructions-file.png\" alt-text=\"Screenshot of the GitHub Copilot for Azure instructions file.\":::\n\n   > [!Important]\n   > You should not modify this file.\n"
  },
  {
    "path": "articles/github-copilot-azure/includes/prerequisites-2022.md",
    "content": "---\nauthor: rotabor\nms.service: github-copilot-for-azure\nms.topic: include\nms.date: 03/02/2026\n---\n\n- An Azure account and access to an Azure subscription. For details on how to set them up, see the [pricing page for Azure accounts](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- A GitHub account and a GitHub Copilot subscription. For details on how to set them up, see [Creating an account on GitHub](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github) and [Quickstart for GitHub Copilot](https://docs.github.com/en/copilot/quickstart), respectively.\n\n- Visual Studio 2022 (Any edition). For details on how to download and install it, see [Install Visual Studio](/visualstudio/install/install-visual-studio).\n\n>[!IMPORTANT]\n>GitHub Copilot is a separate subscription managed by GitHub. For questions regarding GitHub Copilot subscriptions and Support, see [Getting started with a GitHub Copilot plan](https://docs.github.com/en/copilot/how-tos/manage-your-account/get-started-with-a-copilot-plan)."
  },
  {
    "path": "articles/github-copilot-azure/includes/prerequisites-2026.md",
    "content": "---\nauthor: rotabor\nms.service: github-copilot-for-azure\nms.topic: include\nms.date: 03/02/2026\n---\n\n- An Azure account and access to an Azure subscription. For details on how to set them up, see the [pricing page for Azure accounts](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- A GitHub account and a GitHub Copilot subscription. For details on how to set them up, see [Creating an account on GitHub](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github) and [Quickstart for GitHub Copilot](https://docs.github.com/en/copilot/quickstart), respectively.\n\n- Visual Studio 2026 (Any edition). For details on how to download and install it, see [Install Visual Studio](https://visualstudio.microsoft.com/insiders/).\n\n>[!IMPORTANT]\n>GitHub Copilot is a separate subscription managed by GitHub. For questions regarding GitHub Copilot subscriptions and Support, see [Getting started with a GitHub Copilot plan](https://docs.github.com/en/copilot/how-tos/manage-your-account/get-started-with-a-copilot-plan)."
  },
  {
    "path": "articles/github-copilot-azure/includes/prerequisites.md",
    "content": "---\nauthor: rotabor\nms.service: github-copilot-for-azure\nms.topic: include\nms.date: 03/02/2026\n---\n\n- An Azure account and access to an Azure subscription. For details on how to set them up, see the [pricing page for Azure accounts](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- A GitHub account and a GitHub Copilot subscription. For details on how to set them up, see [Creating an account on GitHub](https://docs.github.com/en/get-started/start-your-journey/creating-an-account-on-github) and [Quickstart for GitHub Copilot](https://docs.github.com/en/copilot/quickstart), respectively.\n\n- Visual Studio Code. For details on how to download and install it, see [Setting up Visual Studio Code](https://code.visualstudio.com/docs/setup/setup-overview).\n\n- The GitHub Copilot extension and the GitHub Copilot Chat extension. For instructions on how to install these extensions, see [Set up GitHub Copilot in VS Code](https://code.visualstudio.com/docs/copilot/setup) and [Getting started with GitHub Copilot Chat in VS Code](https://code.visualstudio.com/docs/copilot/getting-started-chat), respectively.\n\n>[!IMPORTANT]\n>GitHub Copilot is a separate subscription managed by GitHub. For questions regarding GitHub Copilot subscriptions and Support, see [Getting started with a GitHub Copilot plan](https://docs.github.com/en/copilot/how-tos/manage-your-account/get-started-with-a-copilot-plan).\n"
  },
  {
    "path": "articles/github-copilot-azure/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: GitHub Copilot for Azure\nsummary: |\n  Use AI to add cloud features and deploy your app to Azure\n\nmetadata:\n  title: GitHub Copilot for Azure\n  description: Use AI to add cloud features and deploy your app to Azure\n  ms.date: 12/16/2025\n  ms.topic: landing-page\n  ms.collection: ce-skilling-ai-copilot\n  ms.service: github-copilot-for-azure\n\nlandingContent:\n  - title: Get Started\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Overview\n            url: introduction.md\n          - text: Get Started with GitHub Copilot for Azure\n            url: get-started.md\n          - text: Get Support\n            url: support.md\n          - text: Quickstart - Building, Deploying and Improving your application with GitHub Copilot for Azure\n            url: quickstart-deploy-app-agent-mode.md\n          - text: Generate and deploy a Django / PostgreSQL app\n            url: generate-deploy-django-postgresql.md\n\n  - title: Prompts for Azure\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Learn about Azure and your application\n            url: learn-examples.md\n          - text: Design and develop your app\n            url: design-develop-examples.md\n          - text: Deploy your app\n            url: deploy-examples.md\n          - text: Troubleshoot your app\n            url: troubleshoot-examples.md\n"
  },
  {
    "path": "articles/github-copilot-azure/introduction.md",
    "content": "---\ntitle: What is GitHub Copilot for Azure?\ndescription: This article describes the purpose and capabilities of the GitHub Copilot for Azure Visual Studio Code extension, and how it fits into a developer's workflow.\nkeywords: github, copilot, ai, azure\nms.service: github-copilot-for-azure\nms.topic: overview\nms.date: 11/17/2025\nms.collection: ce-skilling-ai-copilot\n---\n\n# What is GitHub Copilot for Azure?\n\nGitHub Copilot for Azure is a GitHub Copilot extension that enables developers to use natural language to:\n\n- Learn about Azure features.\n- Deploy Azure resources.\n- Get information about Azure resources.\n- Diagnose and troubleshoot problems with Azure resources.\n\nYou must have access to an Azure subscription and be subscribed to GitHub Copilot. [Get started](get-started.md) using the extension.\n\nGitHub Copilot is designed to help developers, including developers new to Azure, to be more productive as quickly as possible. For experienced Azure users, GitHub Copilot for Azure replaces the need to:\n\n- memorize or look up Azure CLI commands and arguments.\n- create complex deployment scripts by hand.\n- sign in and browse through the Azure portal.\n\n## How it works\n\nGitHub Copilot for Azure supplements the general knowledge of a foundational large language model (LLM) like GPT-5 and Claude Sonnet 4 with tool calling using the **Azure Model Context Protocol (MCP) Server** that enables interaction with Azure services, systems, and Azure Resource Graph to carry out specific tasks on your behalf. Over [50 Azure services](../azure-mcp-server/tools/index.md) are already available and more services and capabilities are being added regularly. Learn more about the capabilities of [Azure MCP Server](../azure-mcp-server/overview.md).\n\n## Supported development environments\n\nYou can use GitHub Copilot for Azure in the following supported development environments:\n\n|Supported Client|Description|Feature Stage|Download Link|\n|---|---|---|---|\n|Visual Studio Code|Surfaces GitHub Copilot for Azure via the GitHub Copilot user interface. It also surfaces the Azure MCP Server tools. Provides IDE-specific tools and custom modes.|General availability|[Link](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-github-copilot)|\n|Visual Studio 2022|Surfaces built-in Azure MCP Server tools via the GitHub Copilot user interface.|Public preview|The tools are available upon installation of the [Azure development workload](/dotnet/azure/configure-visual-studio#install-azure-workloads).|\n|Visual Studio 2026|Surfaces built-in GitHub Copilot for Azure and Azure MCP Server tools via GitHub Copilot user interface.|General availability|The tools are available upon installation of the [Azure and AI development workload](/dotnet/azure/configure-visual-studio#install-azure-workloads).|\n\n## Primary scenarios\n\nGitHub Copilot for Azure currently enables four primary scenarios:\n\n|Category|Explanation|Examples|\n|---|---|---|\n|Learn|Learn about Azure services and tools from the latest Microsoft Learn documentation.|<ul><li>\"What Azure services should I use with my app?\"</li><li>\"What are the available types of Azure OpenAI models?\"</li><li>\"What is Azure AI Search and why should I use it?\"</li><li>\"How does pricing work for Azure SQL?\"</li></ul>|\n|Design and develop|Ask for guidance and help when building apps for the cloud.|<ul><li>\"Can you help me build a RAG application with Python to deploy to Azure?\"</li><li>\"Use azd to undeploy my project in Azure.\"</li><li>\"We're a pizza company and want to create an online customized pizza delivery solution. Create an API to accept pizza orders on Azure.\"</li></ul>|\n|Deploy|Create Azure resources and deploy apps.|<ul><li>\"Can you help me deploy my application to Azure?\"</li><li>\"I need a CI/CD pipeline so I can get my app deployed to Azure.\"</li><li>\"Use azd to undeploy my project from Azure.\"</li></ul>|\n|Troubleshoot|Diagnose and troubleshoot application and resource problems.|<ul><li>\"What is using up my GPT-5 model quota on Azure?\"</li><li>\"Find out why my Kubernetes cluster is running slow on Azure.\"</li><li>\"Why am I seeing 500 errors when opening my website on Azure?\"</li></ul>|\n\n\n> [!Note]\n> Make sure the word \"Azure\" is somewhere in the prompt so that the LLM calls the appropriate tool from Azure MCP Server.\n\nThe documentation provides a quickstart and example prompts to help you start using GitHub Copilot for Azure as quickly as possible.\n\n## Best practices\n\nFirst, use \"Agent\" mode for the best experience. Avoid \"Ask\" mode.\n\nSecond, include the word \"Azure\" in the prompt to help Copilot understand that it needs to call tools from the Azure MCP Server.\n\nThird, using copilots can increase developer productivity by answering questions, executing tasks, and generating code. However, remember these vital rules:\n\n- Review all AI-generated responses. Validate their correctness, applicability, potential outcomes (such as costs and security) before taking action based on those responses.\n- Never save application secrets or credentials in source code.\n- Never submit application secrets or credentials in questions or in code when you ask questions.\n\nWhen you're working with any tool based on large language models use good prompt engineering techniques for the best results. The following tips come from the article [Write effective prompts for Microsoft Copilot in Azure](/azure/copilot/write-effective-prompts), which provides advice for prompt engineering in the context of Azure.\n\n- [Be clear and specific](/azure/copilot/write-effective-prompts#be-clear-and-specific)\n- [Set expectations](/azure/copilot/write-effective-prompts#set-expectations)\n- [Add context about your scenario](/azure/copilot/write-effective-prompts#add-context-about-your-scenario)\n- [Break down your requests](/azure/copilot/write-effective-prompts#break-down-your-requests)\n- [Customize your code](/azure/copilot/write-effective-prompts#customize-your-code)\n- [Use Azure terminology](/azure/copilot/write-effective-prompts#use-azure-terminology)\n- [Use the feedback loop](/azure/copilot/write-effective-prompts#use-the-feedback-loop)\n\nWhen working in agent mode, you can create longer prompts, however it's important to constrain the copilot before allowing it to act on your behalf especially when working with your Azure account. Here's an approach to building a longer prompt that might help get the results you desire.\n\n- **Command** - \"Don't take any action until I authorize it.\" Prevent the copilot from taking action before you validate its understanding of the prompt.\n- **Describe** - Express what you want to happen. Here, you describe the work like you would to a coworker in sufficient detail for your coworker to be successful.\n- **Ask** - \"Do you have any clarifying questions to ask me before you begin?\" - Give the copilot an opportunity to identify unclear instructions.\n- **Iterate** - Iterate with the copilot until it understands what you are asking it to do. The copilot might require several iterations before it has everything it needs to be successful.\n- **Request** - \"Create a step-by-step checklist plan that I can review before I authorize you to execute the plan.\" This not only forces the copilot to think ahead of its actions and explain its approach, it also follows these steps and provides a status.\n- **Review** - At some point, you might trust the copilot and not closely review its work. However, it's always best to make sure you review the plan and clarify what you want.\n- **Authorize** - \"I reviewed the plan and you're authorized to begin.\"\n- **Validate** - Spend time checking the work to ensure that it accomplishes what you intended.\n\n## Tool calling\n\n# [Visual Studio Code](#tab/vscode)\n\nGitHub Copilot for Azure uses agentic tools behind the scenes to perform all operations. When first released for Visual Studio Code, the GitHub Copilot for Azure team created proprietary tools for use, however the current direction is to migrate away from proprietary tools to tools supplied by the [Azure MCP Server](../azure-mcp-server/overview.md).\n\nHere's a list of all the tools currently supported by GitHub Copilot for Azure. Also listed is the migration status, which applies solely to the Visual Studio Code version. The Visual Studio 2022 version uses Azure MCP Server tools by default.\n\n|Tool|Description and sample prompts|Migration Status|\n|---|---|---|\n|azure_list_activity_logs|Lists activity logs for a resource over a specified time.<br /><ul><li>\"Show me the activity logs for my web app\"</li><li>\"What happened to my VM in the last 24 hours?\"</li></ul>|Complete|\n|azure_diagnose_resource|Diagnoses app performance or failures using logs and telemetry.<br /><ul><li>\"Why is my app slow?\"</li><li>\"Help me diagnose issues with my app\"</li></ul>|Complete|\n|azure_get_auth_context|Retrieves current Azure authentication context (account, subscription, tenant).<br /><ul><li>\"What Azure account am I signed in with?\"</li><li>\"Show me my current tenant\"</li></ul>|N/A|\n|azure_set_auth_context|Updates Azure authentication context (sign in/out, switch tenant or subscription).<br /><ul><li>\"Sign me into Azure\"</li><li>\"Change my subscription\"</li></ul>|N/A|\n|azure_get_azure_verified_module|Fetches verified Bicep modules for a resource type.<br /><ul><li>\"Get Bicep module for storage account\"</li><li>\"Find verified module for virtual machine\"</li></ul>|Planned|\n|azure_generate_azure_cli_command|Generates Azure CLI commands based on user intent.<br /><ul><li>\"Create a new resource group using Azure CLI\"</li><li>\"List all VMs in a resource group\"</li></ul>|Complete|\n|azure_recommend_custom_modes|Captures Azure-related intent and suggests modes to enhance workflows.<br /><ul><li>\"I want to build an Azure Function\"</li><li>\"Help me deploy to Azure\"</li></ul>|N/A|\n|azure_get_dotnet_template_tags|Lists tags for filtering .NET templates\t\"What .NET template tags are available?\"</li><li>\"Show me template categories for Azure projects\"</li></ul>|N/A|\n|azure_dotnet_templates_for_tag|Retrieves the list of .NET project templates matching a given tag for dotnet new commands.<br /><ul><li>\"Show me Azure Function templates\", \"Get web API templates\"</li></ul>|N/A|\n|azure_query_azure_resource_graph|Queries Azure Resource Graph for resources, subscriptions, or resource groups.<br /><ul><li>\"List all my virtual machines\"</li><li>\"Show me resources in my resource group\"</li></ul>|Planned|\n\n\n# [Visual Studio 2022](#tab/vs2022)\n\nGitHub Copilot for Azure uses agentic tools supplied by the [Azure MCP Server](../azure-mcp-server/overview.md) behind the scenes to perform all operations. The tools appear in all tools mode and need to be manually enabled before use.\n\n# [Visual Studio 2026](#tab/vs2026)\n\nGitHub Copilot for Azure uses agentic tools supplied by the [Azure MCP Server](../azure-mcp-server/overview.md) behind the scenes to perform all operations. In addition to Azure MCP Server tools, the following Visual Studio–specific tools are also available.\n\n|Tool|Description|Example Prompts|\n|---|---|---|\n|create_azure_devops_workflow|Generate an Azure DevOps Workflow for Azure Functions or ASP.NET projects. Creates directory structure and YAML for publishing.|<ul><li>\"Create Azure DevOps workflow for my Blazor project\"</li><li>\"Create yaml file to publish to ADO\"</li></ul>|\n|create_github_actions_workflow|Generate a GitHub Actions Workflow for Azure Functions or ASP.NET projects. Creates directory, YAML, and sets up secrets.|<ul><li>\"Create GitHub Actions workflow for deployment\"</li><li>\"Publish with GitHub Actions to Azure\"</li></ul>|\n|create_website_azure_publish_profile|Create a publish profile for Azure Web Apps or Azure Function Apps.|<ul><li>\"Create publish profile for my Azure web app\"</li><li>\"Set up Azure publish profile for my Blazor project\"</li></ul>|\n|generate_azure_cli_command|Generates Azure CLI (az) commands based on natural language intent. Always use this tool for CLI requests.|<ul><li>\"Create a new resource group using the Azure CLI\"</li><li>\"How do I create an app service using Azure cli?\"</li></ul>|\n|publish_project_to_azure_website|Publish a project to an Azure Web site using an existing publish profile (.pubxml file).|<ul><li>\"Publish my Blazor project to Azure using the existing profile\"</li><li>\"Deploy my project to Azure website\"</li></ul>|\n|query_azure_resource_graph|Query Azure Resource Graph using natural language prompts; returns results as JSON.|<ul><li>\"Find all virtual machines in my subscription\"</li><li>\"Show me all storage accounts in the West US region\"</li></ul>|\n|select_website_for_azure_publish|Select an Azure Web site for publishing projects; guides through choosing or creating instances.|<ul><li>\"Help me select an Azure web app for my Blazor project\"</li><li>\"I need to choose an Azure Function App for deployment\"</li></ul>|\n|verify_azure_publish_compatibility|Verify if a project is compatible with Azure publish operations (ASP.NET Core, Blazor, Azure Function).|<ul><li>\"Check if my project can be published to Azure\"</li><li>\"Verify Azure compatibility for my Blazor application\"</li></ul>|\n\n---\n\n## Related content\n\n- [Get started](get-started.md) with GitHub Copilot for Azure by installing the software and writing your first prompt.\n- Follow the [quickstart](quickstart-deploy-app-agent-mode.md) to understand how to include GitHub Copilot for Azure in your software development workflow. The quickstart describes how to deploy services to Azure, monitor their status, and troubleshoot problems.\n- See example prompts for [learning more about Azure and understanding your Azure account, subscription, and resources](learn-examples.md).\n- See example prompts for [designing and developing applications for Azure](design-develop-examples.md).\n- See example prompts for [deploying your application to Azure](deploy-examples.md).\n- See example prompts for [troubleshooting your Azure resources](troubleshoot-examples.md).\n"
  },
  {
    "path": "articles/github-copilot-azure/learn-examples.md",
    "content": "---\ntitle: GitHub Copilot for Azure prompt engineering examples to learn about using Azure for your application\ndescription: This article provides example prompts that can help you learn how to use Azure and deploy your application to the cloud.\nkeywords: github, copilot, ai, azure\nms.service: github-copilot-for-azure\nms.topic: best-practice\nms.date: 12/16/2025\nms.collection: ce-skilling-ai-copilot\n---\n\n# Example prompts for learning about Azure and your application with GitHub Copilot for Azure\n\nIf you're unfamiliar with Azure or you just want the tooling and AI to do most of the work, you can ask GitHub Copilot for Azure and Azure MCP Server to help you deploy your application. Use [best practices](introduction.md#best-practices) to achieve the best results. Most importantly:\n\n- Use \"Agent\" mode for the best experience. Avoid \"Ask\" mode.\n- Include the word \"Azure\" in the prompt to help Copilot understand that it needs to call tools from the Azure MCP Server.\n- If using Visual Studio Code, make sure you use \"Configure Tools ...\" and include both \"Azure MCP\" and \"GitHub Copilot for Azure\". [See the Tool calling section's Visual Studio Code tab](introduction.md#tool-calling) for more details.\n\n\n## Example prompts to learn about Azure\n\nIf you want to use GitHub Copilot for Azure to learn about how to use Azure for your application, you can start with an open-ended question or request. Then, add details like specific services and technologies for better results. Try the following example prompts.\n\n### Learn about system architecture on Azure\n\nUse GitHub Copilot to recommend Azure services to use for your project.\n\n- \"What services should I use with my Azure app?\"\n- \"Please recommend Azure services for my project.\"\n\nWhen asked to recommend an Azure service, GitHub Copilot for Azure scans the current application in the workspace and provides recommendations for Azure services and service bindings. \n\nYou can work in an iterative manner asking GitHub Copilot for Azure to update the recommendations to use a different Azure service or change the bindings information. Example prompts: \n\n- \"I'd like to use Azure App Service instead of Container Apps for my API project.\"\n- \"Add an Azure Cosmos DB to my project.\"\n- \"The Azure SERVICE_URL value should be bing.com.\"\n- \"Add an environment variable STAGE=dev to my Azure project.\"\n\nYou can follow up by asking more detailed questions based on GitHub Copilot for Azure's recommendations. Here are some example detailed questions to help you understand the types of prompts you can use.\n\n- \"How can I create a highly available architecture using Azure?\"\n- \"Explain the Azure Well-Architected Framework.\"\n- \"What types of app hosting solutions are available in Azure?\"\n- \"Help me orchestrate and automate my Azure data processing workflows.\"\n- \"How can I integrate Azure SignalR with Application Gateway and API Management?\"\n- \"How many Azure units do you recommend?\"\n- \"What are the benefits and applications of using Azure with Terraform?\"\n\n### Learn about AI on Azure\n\n- \"I want to build an AI application. What Azure services can I use?\"\n\n### Learn about web and application hosting on Azure\n\n- \"Which Azure service is best for hosting a scalable web application?\"\n- \"Which Azure service should I use to create a website?\"\n- \"How can I use Azure to build a scalable web application?\"\n- \"For what scenarios is Azure Functions better than Web Apps?\"\n\n### Learn about containers on Azure\n\n- \"What types of containerized applications does Azure support?\"\n- \"What are the options for managing containers in Azure?\"\n- \"When should I use Azure Kubernetes Service instead of Azure Container Apps?\"\n- \"What's the difference between Azure Container Apps and AKS?\"\n- \"Why would I choose Azure Container Apps over AKS?\"\n\n### Learn how to use Azure services for your app\n\n|Service or technology|Learn prompt examples|\n|---|---|\n|Azure AI Search|<ul><li>\"What is Azure AI Search and why should I use it?\"</li><li>\"How does pricing work for Azure AI Search?\"</li><li>\"How is Azure AI Search integrated with Azure OpenAI?\"</li><li>\"How is Azure AI Search integrated with Azure Machine Learning?\"</li><li>\"When should I use hybrid search or vector search versus the semantic ranker in Azure AI Search?\"</li><li>\"Is Azure AI Search a vector database? How does it ensure the accuracy and relevance of vector search results?\"</li><li>\"What support does Azure AI Search have for high-scale multitenant applications?\"</li><li>\"What is the integrated vectorization feature in Azure AI Search, and from which data sources can I extract data for it?\"</li><li>\"What is AI enrichment in Azure AI Search, how does it work, and what are its benefits?\"</li><li>\"What is the semantic ranker in Azure AI Search, and how is it different from vector search?\"</li><li>\"What are the top recommended code samples or solution accelerators for Azure AI Search?\"</li><li>\"What are some real-world examples of businesses using Azure AI Search?\"</li></ul>|\n|Azure API Management|<ul><li>\"What are the benefits and applications of Azure API Management?\"</li></ul>|\n|Azure App Service|<ul><li>\"How do I deploy a web app in Azure?\"</li><li>\"How do I create an Azure App Service app and deploy code to a staging environment using the CLI?\"</li><li>\"Create a script to deploy a Python web app in Azure.\"</li><li>\"What database options does Azure offer for web apps?\"</li><li>\"What serverless options does Azure provide for web apps?\"</li><li>\"Create a guide for maximizing Azure App Service.\"</li></ul>|\n|Azure Cache for Redis|<ul><li>\"Demonstrate how to configure an Azure Redis cache for high availability and disaster recovery.\"</li></ul>|\n|Azure Container Apps|<ul><li>\"What is the Azure Container Apps service?\"</li><li>\"Tell me the difference between an Azure container app and a container app environment.\"</li></ul>|\n|Azure Cosmos DB|<ul><li>\"Why would I use Azure Cosmos DB instead of Azure SQL?\"</li><li>\"I want to use Azure Cosmos DB to store my data.\"</li><li>\"Why would I use an Azure Cosmos DB account instead of a SQL database?\"</li></ul>|\n|Azure Data Factory|<ul><li>\"How do I create data pipelines using Azure Data Factory?\"</li></ul>|\n|Azure Developer CLI (`azd`)|<ul><li>\"Do you have example deployment models for Azure, such as SaaS or PaaS?\"</li><li>\"What is the best Azure infrastructure for my application?\"</li><li>\"How do I set up my Azure environment?\"</li><li>\"What are Azure Resource Manager templates and how do I use them?\"</li><li>\"How do I manage environments with the Azure Developer CLI?\"</li><li>\"What is the Azure Developer CLI?\"</li><li>\"What is the difference between Azure Bicep and ARM templates?\"</li><li>\"How do I ensure my Azure environments follow best security patterns?\"</li><li>\"How do I deploy using my CI/CD pipeline in Azure?\"</li></ul>|\n|Azure Functions|<ul><li>\"How do I create a new Azure Function?\"</li><li>\"What is the difference between Azure Functions and Azure Logic Apps?\"</li><li>\"Create a guide for integrating Azure Logic Apps with Azure Functions.\"</li><li>\"I want to create an Azure Function in Node.js.\"</li></ul>|\n|Azure Key Vault|<ul><li>\"Explain how and why I should use Azure Key Vault.\"</li></ul>|\n|Azure Kubernetes Service (AKS)|<ul><li>\"How do I get the status of all nodes in my AKS cluster?\"</li><li>\"What's the command to set a context for my AKS cluster?\"</li></ul>|\n|Azure Machine Learning|<ul><li>\"Generate a PowerShell script to create a new Azure Machine Learning workspace.\"</li><li>\"What is the difference between Foundry Tools and Azure Machine Learning?\"</li></ul>|\n|Azure Monitor|<ul><li>\"Create a guide for using Azure Logic Apps to automate responses to Azure Monitor alerts.\"</li></ul>|\n|Azure Virtual Network|<ul><li>\"How do I balance inbound network traffic to my Azure application?\"</li></ul>|\n|Azure OpenAI Service|<ul><li>\"What services does Azure OpenAI provide?\"</li><li>\"Where is GPT-4o mini available in Azure?\"</li><li>\"What are the prerequisites for integrating Azure OpenAI?\"</li><li>\"Create a guide for creating and using Azure OpenAI resources.\"</li><li>\"What are the available Azure OpenAI model types?\"</li></ul>|\n|Azure SDK|<ul><li>\"Can I use Azure SDKs in the browser?\"</li><li>\"Does the Azure C# Storage SDK support chunked blob uploads and downloads?\"</li></ul>|\n|Azure SignalR Service|<ul><li>\"How do I host and scale SignalR on multiple servers in Azure?\"</li><li>\"How do I do real-time communication in .NET with Azure?\"</li><li>\"How do I push real-time updates to clients using Azure?\"</li><li>\"How do I synchronize data across clients in Azure SignalR Service?\"</li><li>\"How do I stream data to clients in Azure?\"</li><li>\"How do I manage and scale WebSocket connections in Azure?\"</li><li>\"How do I host and scale Socket.IO in Azure?\"</li><li>\"What do I need to configure my SignalR code to work with Azure SignalR Service?\"</li><li>\"Evaluate my SignalR setup — is it following Azure’s best security practices?\"</li><li>\"How do I stress test Azure SignalR?\"</li><li>\"How do I configure networking in Azure SignalR Service?\"</li><li>\"How do I configure an Azure Web PubSub event handler?\"</li></ul>|\n|Azure SQL|<ul><li>\"Create a Terraform configuration to deploy an Azure SQL database.\"</li><li>\"Design a strategy for migrating on-premises SQL Server databases to Azure SQL Managed Instance.\"</li></ul>|\n|Azure Static Web Apps|<ul><li>\"Does Azure Static Web Apps support static IP addresses?\"</li></ul>|\n|Azure Storage|<ul><li>\"Why would I use Azure Blob Storage?\"</li><li>\"How do I pull data from an Azure Storage blob in React?\"</li><li>\"Outline steps to secure Azure Blob Storage with private endpoints and Azure Private Link.\"</li><li>\"Generate an Azure CLI script to create a new storage account.\"</li><li>\"Give me the CLI code to create a new Azure Storage account.\"</li><li>\"Can you help me choose the right Azure Storage solution?\"</li></ul>|\n|Azure Web PubSub|<ul><li>\"How do I authenticate with Azure Web PubSub?\"</li><li>\"What do I need to do to host my Socket.IO app on Azure?\"</li><li>\"How do I stress test Azure Web PubSub?\"</li></ul>|\n\n## Related content\n\n- [Understand what GitHub Copilot for Azure is and how it works](introduction.md).\n- [Get started](get-started.md) with GitHub Copilot for Azure by installing the software and writing your first prompt.\n- Follow the [quickstart](quickstart-deploy-app-agent-mode.md) to understand how to include GitHub Copilot for Azure in your software development workflow. The quickstart describes how to deploy services to Azure, monitor their status, and troubleshoot problems.\n- See example prompts for [designing and developing applications for Azure](design-develop-examples.md).\n- See example prompts for [deploying your application to Azure](deploy-examples.md).\n- See example prompts for [troubleshooting your Azure resources](troubleshoot-examples.md).\n"
  },
  {
    "path": "articles/github-copilot-azure/quickstart-create-redis.md",
    "content": "---\ntitle: \"Quickstart: Create and deploy an app using Azure Cache for Redis using GitHub Copilot for Azure and Azure MCP Server\"\ndescription: \"Create a prompt in GitHub Copilot for Azure that creates and deploys an instance of Azure Cache for Redis, and a Python app that writes and reads from it.\"\nauthor: bobtabor-msft\nms.author: rotabor\nms.service: github-copilot-for-azure\nms.topic: quickstart  #Don't change\nms.date: 2/28/2026\nzone_pivot_group_filename: developer/github-copilot-azure/github-copilot-azure-zone-pivot-groups.json\nzone_pivot_groups: ide-options\n---\n  \n# Quickstart: Create and deploy an app using Azure Cache for Redis by using GitHub Copilot for Azure and Azure MCP Server\n\nThis quickstart shows you how to create a simple Python app that:\n\n- Connects to **Azure Cache for Redis**\n- Writes the current date and time to Redis\n- Reads the value back\n- Prints the result to the console\n\nYou use **GitHub Copilot** to generate most of the code and provisioning steps.\n\n## Prerequisites\n\nFor complete setup instructions, see the [Get started](get-started.md) article. Make sure that you have the following items:\n\n::: zone pivot=\"visual-studio-code\"\n[!INCLUDE [prerequisites](./includes/prerequisites.md)]\n::: zone-end  \n\n::: zone pivot=\"visual-studio-2022\"  \n[!INCLUDE [prerequisites-vs2022](./includes/prerequisites-2022.md)]\n::: zone-end\n\n::: zone pivot=\"visual-studio-2026\"  \n[!INCLUDE [prerequisites-vs2026](./includes/prerequisites-2026.md)]\n::: zone-end\n\n## Building the app\n\nFollow these steps described in this article:\n\n1. Create a `.env` file in your workspace to store Azure deployment information as environment variables.\n1. Write a prompt to create an instance of Azure Cache for Redis in your subscription. The Redis connection information is also stored in the `.env` file.\n1. Validate that the resource and the `.env` file are created correctly.\n1. Write a prompt to create a Python app to retrieve, write, and read from the cache by using environment variables.\n1. Validate the app works.\n1. Clean up the resources in Azure.\n\n### Ensure you have the right tools selected\n\nYou must have both Azure MCP Server installed and GitHub Copilot for Azure installed.\n\n::: zone pivot=\"visual-studio-code\"\n\n1. Select the **Configure tools...** icon in the chat pane.\n1. **Configure tools** is displayed in the Command Palette. Make sure the top nodes for \"Azure MCP\" and \"GitHub Copilot for Azure\" are both selected.\n\n::: zone-end\n\n::: zone pivot=\"visual-studio-2022\"  \n\n1. Select the **Select tools...** icon in the chat pane.\n1. **Select tools** menu is displayed. Make sure the \"Azure MCP Server\" top node is selected.\n\n::: zone-end\n\n::: zone pivot=\"visual-studio-2026\"  \n\n1. Select the **Select tools** icon in the chat pane.\n1. The **Select tools** menu is displayed. Make sure the top nodes for \"Azure\" and \"Azure MCP\" are both selected.\n\n::: zone-end\n\n### Create local environment variables\n\nA common development practice is to store important keys and other settings as environment variables in a `.env` file in your workspace folder. This keeps all configuration self-contained within the project.\n\n> [!IMPORTANT]\n> Make sure your `.gitignore` file includes `.env` so you don't accidentally commit secrets to source control.\n\nIn this step, create a `.env` file in your workspace by using a prompt like the following:\n\n```prompt\nCreate a .env file in this workspace with the following environment variables filled in:\n\nAZURE_SUBSCRIPTION_ID\nAZURE_TENANT_ID\nAZURE_LOCATION\nAZURE_RESOURCE_GROUP\nAZURE_RESOURCE_PREFIX\n\nUse my <your-subscription-name> subscription and I want to put everything in eastus.\n```\n\nReplace `<your-subscription-name>` with the name of your Azure subscription. Copilot looks up the subscription and tenant IDs for you, generates a resource group name and prefix, and creates the `.env` file.\n\nAfter the file is created, open it and verify the values look correct:\n\n```dotenv\nAZURE_SUBSCRIPTION_ID=<your-azure-subscription-id>\nAZURE_TENANT_ID=<your-azure-tenant-id>\nAZURE_LOCATION=eastus\nAZURE_RESOURCE_GROUP=<resource-group>\nAZURE_RESOURCE_PREFIX=<resource-prefix>\n```\n\n### Create Azure Cache for Redis\n\nOpen GitHub Copilot Chat and paste the following prompt:\n\n   ```prompt\n   You have access to Azure MCP tools.\n  \n   Use the variables in the `.env` file in this workspace to create an Azure Cache for Redis instance.\n   \n   Tasks:\n   1. Ensure the resource group exists.\n   2. Create Azure Cache for Redis:\n       - Name: {AZURE_RESOURCE_PREFIX}-redis\n       - SKU: Basic C0\n       - TLS enabled (port 6380)\n   3. Write the following values into the `.env` file:\n       REDIS_HOST\n       REDIS_PORT=6380\n       REDIS_PASSWORD (primary key)\n       REDIS_SSL=true\n  \n   Important:\n   - Use Azure MCP to create resources and fetch keys.\n   ```\n\n   Copilot creates the Redis resource, and then creates a `.env` file containing the hostname, primary key, and the other environment variables.\n\n### Validate that the .env file has the Redis settings\n\n1. Open the `.env` file in your project folder and validate that it has values.\n\n   ```dotenv\n   REDIS_HOST=<your-cache-name>.redis.cache.windows.net\n   REDIS_PORT=6380\n   REDIS_PASSWORD=<primary-key>\n   REDIS_SSL=true\n   ```\n\n1. Validate that the Azure Cache for Redis instance is running by using the following prompt.\n\n   ```prompt\n   Use the values in the `.env` file in this workspace to validate that an instance of Azure Cache for Redis is running and ready to be used.\n   ```\n\n### Prompt to write the Python app\n\nUse the following prompt to create the Python app that writes and reads from the new instance of Azure Cache for Redis.\n\n```prompt\nCreate a minimal Python console app in this workspace.\n\nImportant:\n- Do ALL work directly by editing files.\n- Do NOT ask me to copy/paste code.\n- Create files if they do not exist.\n\nGoal:\nBuild a simple app that writes the current date/time to Azure Cache for Redis, reads it back, and prints results to the console.\n\nProject requirements:\n\n1. Create or update these files:\n\n- main.py\n- requirements.txt\n- .gitignore\n\n2. requirements.txt must include:\n- redis\n- python-dotenv\n\n3. .gitignore must include:\n- .venv/\n- __pycache__/\n- .env\n\n4. main.py must:\n\n- Load environment variables using python-dotenv\n- Read:\n    REDIS_HOST\n    REDIS_PORT\n    REDIS_PASSWORD\n    REDIS_SSL\n- Connect to Azure Cache for Redis using TLS (ssl=True when REDIS_SSL=true)\n- Use decode_responses=True\n- Test connection with PING and print:\n    Connected to Redis\n- Write current datetime (ISO format) to key:\n    demo:timestamp\n- Read the value back\n- Print exactly:\n\n    WROTE: <value>\n    READ : <value>\n\n- Wrap connection logic in a try/except and print a helpful error message.\n\n5. Keep the code simple and beginner-friendly:\n- Single file\n- No classes\n- About 40–60 lines\n\nAfter editing the files:\n- Show a summary of what you changed.\n- Do NOT print the full file contents unless I ask.\n```\n\n### Validate the Python app\n\n1. Make sure the files you requested in the prompt exist. Visually inspect the files to see if they have values that seem reasonable.\n\n1. Inspect the `main.py` file to ensure that it retrieves values from the `.env` file, imports the `redis` package, and connects to Azure Cache for Redis. Check that it writes and reads the cache. You might see code that resembles the following code:\n\n   ```python\n   \n   import os\n   from datetime import datetime\n   from dotenv import load_dotenv\n   import redis\n   \n   # Load local environment variables\n   load_dotenv()\n   \n   host = os.getenv(\"REDIS_HOST\")\n   port = int(os.getenv(\"REDIS_PORT\", \"6380\"))\n   password = os.getenv(\"REDIS_PASSWORD\")\n   ssl_enabled = os.getenv(\"REDIS_SSL\", \"true\").lower() == \"true\"\n   \n   try:\n       client = redis.Redis(\n           host=host,\n           port=port,\n           password=password,\n           ssl=ssl_enabled,\n           decode_responses=True\n       ) \n   \n       # Verify connection\n       client.ping()\n       print(\"Connected to Redis\")\n   \n       # Write current time\n       now = datetime.now().isoformat()\n       client.set(\"demo:timestamp\", now)\n       print(f\"WROTE: {now}\")\n   \n       # Read value back\n       value = client.get(\"demo:timestamp\")\n       print(f\"READ : {value}\")\n   \n   except Exception as ex:\n       print(\"Connection failed.\")\n       print(ex)\n   ```\n\n   >[!IMPORTANT]\n   >AI-assisted software development is non-deterministic, meaning you don't get the same code generated twice. However, in a simple application like this one, the basic approach, syntax, and end result should be close though not exactly the same.\n\n### Run the app\n\nIn the terminal, run the app:\n\n   ```bash\n   python -m venv .venv && source .venv/bin/activate\n   pip install -r requirements.txt\n   python main.py\n   ```\n  \n   You should see output similar to this:\n\n   ```output\n   Connected to Redis\n   WROTE: 2026-03-01T10:22:11.452331\n   READ : 2026-03-01T10:22:11.452331\n   ```\n\n### Clean up resources\n\nUse the following prompt:\n\n```prompt\nI am finished with this instance. Please remove the Azure Cache for Redis that you created earlier by using the values in the `.env` file. ONLY remove this resource and nothing else.\n```\n\n## Related content\n\n- [Understand what GitHub Copilot for Azure is and how it works](introduction.md).\n- Follow the [quickstart](quickstart-deploy-app-agent-mode.md) to understand how to include GitHub Copilot for Azure in your software development workflow. The quickstart describes how to deploy services to Azure, monitor their status, and troubleshoot problems.\n- See example prompts for [learning more about Azure and understanding your Azure account, subscription, and resources](learn-examples.md).\n- See example prompts for [designing and developing applications for Azure](design-develop-examples.md).\n- See example prompts for [deploying your application to Azure](deploy-examples.md).\n- See example prompts for [troubleshooting your Azure resources](troubleshoot-examples.md).\n"
  },
  {
    "path": "articles/github-copilot-azure/quickstart-deploy-app-agent-mode.md",
    "content": "---\ntitle: Quickstart - Deploy Your Application to Azure with Agent Mode in GitHub Copilot for Azure\ndescription: This article demonstrates how to use agent mode in GitHub Copilot for the Azure to deploy an application to Azure.\nkeywords: github, copilot, ai, azure\nms.service: github-copilot-for-azure\nms.topic: quickstart\nms.date: 12/19/2025\nms.collection: ce-skilling-ai-copilot\n---\n\n# Quickstart: Deploy your application to Azure with agent mode in GitHub Copilot for Azure\n\nIn this quickstart, you learn how to use agent mode in GitHub Copilot for Azure to bring your existing application to Azure. It demonstrates how agent mode helps you define Azure infrastructure, deploy your application to Azure, and create a CI/CD pipeline.\n\n## Prerequisites\n\nFor complete setup instructions, see the [Get started](get-started.md) article. Make sure that you have the following items:\n\n[!INCLUDE [ghcpa-prerequisites](includes/prerequisites.md)]\n\n## Define Azure infrastructure for your application\n\nIn this section, use GitHub Copilot agent mode to create [Bicep deployment files](/azure/azure-resource-manager/bicep/overview) and an [azd template](../azure-developer-cli/overview.md) for the application.\n\n1. Open your existing application in Visual Studio Code.\n\n   If you want to follow along with this tutorial, you can clone the following repo from GitHub to your local computer:\n\n   ```bash\n   git clone https://github.com/Azure-Samples/storage-blob-upload-from-webapp.git\n   ```\n   \n1. In Visual Studio Code, on the Title Bar, select the **Open Chat** icon (the GitHub Copilot logo) to open the chat pane in the Secondary side bar. To start a new chat session, select the plus icon (**+**) on the pane's title bar. Then select **Agent** under the chat text box.\n\n   :::image type=\"content\" source=\"media/quickstart-deploy-app-agent-mode/ask-copilot.png\" alt-text=\"Screenshot that shows the GitHub Copilot chat pane.\":::\n\n1. In the chat text box at the bottom of the pane, type the following prompt. Then select **Send** (paper airplane icon) or select Enter on your keyboard.\n\n   ```prompt\n   Help me deploy my project to Azure\n   ```\n\n   > [!IMPORTANT]\n   > Each time GitHub Copilot for Azure answers the prompt the response's wording and potentially its approach is different due to how large language models (LLMs) generate responses and its approach. It's possible your experience might vary from this article. Take the time to read GitHub Copilot's responses and choose the correct course of action. If you're unsure how to proceed, ask GitHub Copilot what it intends to do and why.\n\nIn general, Copilot agent analyzes your project and generates the necessary deployment files. \n\nCopilot agent uses command line tools like `azd` to perform many tasks, including a predeployment check, dependency checks, and ultimately the deployment itself using the `azd up` command. The `azd up` command runs in Visual Studio Code's terminal and prompts you for input like an environment name, a resource group, and more.\n\nIf you followed the instructions in this document, you might encounter an error with .NET version; Copilot picks it up and generates a fix for it.\n\nIf any errors were encountered during the deployment process, Copilot agent mode can also fix the errors and redeploy the application. Be sure to read the conversation closely and respond appropriately. You can nudge, suggest, and direct Copilot to try different approaches.\n\n## Tips\n\n- Use Claude Sonnet 4.5 for better results.\n- Make sure the following GitHub Copilot for Azure tools are selected in the GitHub Copilot tools list:\n  - **Recommend Azure service configuration**\n  - **Check Azure pre-deploy settings**\n  - **Run AZD Up to deploy to Azure**\n  - **Check app status for Azure azd deployment**\n  - **Configure Azure deployment pipeline**\n  - **Check Azure region availability**\n  - **Check Azure quota availability**\n\n   :::image type=\"content\" source=\"media/quickstart-deploy-app-agent-mode/azure-tools.png\" alt-text=\"Screenshot of the selected GitHub Copilot for Azure tools.\":::\n\n   To view a list of tools that are available to your prompts, select the **Select tools...** button in the chat text box.\n\n## Related content\n\n- [What is GitHub Copilot for Azure?](introduction.md)\n- [Get started with GitHub Copilot for Azure](get-started.md)\n- [Video - GitHub Copilot Modernization for Java - Automated Deployment to Azure](https://www.youtube.com/watch?v=469QHVDJiIk)\n"
  },
  {
    "path": "articles/github-copilot-azure/support.md",
    "content": "---\ntitle: Getting support for GitHub Copilot for Azure\ndescription: This article helps you decide where to find support for your issue.\nkeywords: github, copilot, ai, azure\nms.service: github-copilot-for-azure\nms.topic: best-practice\nms.date: 12/15/2025\nms.collection: ce-skilling-ai-copilot\nzone_pivot_group_filename: developer/github-copilot-azure/github-copilot-azure-zone-pivot-groups.json\nzone_pivot_groups: ide-options\n---\n\n# Getting support for GitHub Copilot for Azure\n\nIf you experience issues when using GitHub Copilot for Azure, you can get support from the product team. However, _where_ you find support you need depends on the type of issue you're experiencing. Since GitHub Copilot for Azure is one of many extensions to GitHub Copilot, this document provides some guidance on where to look for support for your issue.\n\n::: zone pivot=\"visual-studio-code\"\n\n## GitHub Copilot support\n\nSeek out support for GitHub Copilot when experiencing the following issues:\n\n- Copilot or GitHub authentication issues\n- Issues with a large language model (LLM)\n\nTo get support, create a [new issue on the GitHub Copilot repo](https://github.com/microsoft/vscode-copilot-release/issues).\n\n## Azure MCP Server\n\nGitHub Copilot for Azure supplements the general knowledge of a foundational large language model (LLM) like GPT-5 and Claude Sonnet 4 with tool calling using the **Azure Model Context Protocol (MCP) Server** that enables interaction with Azure services, systems, and Azure Resource Graph to carry out specific tasks on your behalf.\n\nSeek out support for Azure MCP Server when experiencing the following issues:\n\n- Azure authentication issues\n- Incorrect tool calling (the wrong tools are being called by the LLM)\n- Tool performance (calls to the tools are taking too long, or returning unusable results)\n\nTo get support, create a [new issue on the GitHub Copilot for Azure repo](https://aka.ms/azmcp)\n\n\n## GitHub Copilot for Azure support in Visual Studio Code\n\nSeek out support for GitHub Copilot for Azure when experiencing the following issues:\n\n- Installation issues\n\nTo get support, create a [new issue on the GitHub Copilot for Azure repo](https://github.com/microsoft/GitHub-Copilot-for-Azure/issues).\n\n::: zone-end  \n\n::: zone pivot=\"visual-studio-2022\"  \n\n## GitHub Copilot for Azure support in Visual Studio 2022\n\nSeek out support for GitHub Copilot for Azure in Visual Studio 2022 when experiencing the following issues:\n\n- Installation issues\n- Azure authentication issues\n- Incorrect tool calling (the wrong tools are being called by the LLM)\n- Tool performance (calls to the tools are taking too long, or returning unusable results)\n\nUse Visual Studio 2022's \"Report a Problem\" menu item. On the menu bar, choose \"Help\" > \"Send Feedback\" > \"Report a Problem\". This will open a web browser to the \"Report a problem\" page on the Developer Community site.\n::: zone-end\n\n::: zone pivot=\"visual-studio-2026\"  \n\n## GitHub Copilot for Azure support in Visual Studio 2026\n\nSeek out support for GitHub Copilot for Azure in Visual Studio 2026 when experiencing the following issues:\n\n- Installation issues\n- Azure authentication issues\n- Incorrect tool calling (the wrong tools are being called by the LLM)\n- Tool performance (calls to the tools are taking too long, or returning unusable results)\n\nUse Visual Studio 2026's \"Report a Problem\" menu item. On the menu bar, choose \"Help\" > \"Send Feedback\" > \"Report a Problem\". This will open a web browser to the \"Report a problem\" page on the Developer Community site.\n\n::: zone-end\n\n\n\n\n\n## Related content\n\n- [Understand what GitHub Copilot for Azure is and how it works](introduction.md).\n- [Get started](get-started.md) with GitHub Copilot for Azure by installing the software and writing your first prompt.\n- Follow the [quickstart](quickstart-deploy-app-agent-mode.md) to understand how to include GitHub Copilot for Azure in your software development workflow. The quickstart describes how to deploy services to Azure, monitor their status, and troubleshoot problems.\n- See example prompts for [learning more about Azure and understanding your Azure account, subscription, and resources](learn-examples.md).\n- See example prompts for [designing and developing applications for Azure](design-develop-examples.md).\n- See example prompts for [deploying your application to Azure](deploy-examples.md).\n"
  },
  {
    "path": "articles/github-copilot-azure/troubleshoot-examples.md",
    "content": "---\ntitle: GitHub Copilot for Azure prompt engineering examples for troubleshooting your application\ndescription: This article provides example prompts that can help you troubleshoot your application in the cloud.\nkeywords: github, copilot, ai, azure\nms.service: github-copilot-for-azure\nms.topic: best-practice\nms.date: 5/30/2025\nms.collection: ce-skilling-ai-copilot\n---\n\n# Example prompts for troubleshooting your application with GitHub Copilot for Azure\n\nIf you're unfamiliar with Azure or you just want the tooling and AI to do most of the work, you can ask GitHub Copilot for Azure to help you troubleshoot problems with your application.\n\n## Example prompts for troubleshooting your app\n\nIf you're unfamiliar with Azure or you just want the tooling and AI to do most of the work, you can ask GitHub Copilot for Azure and Azure MCP Server to help you deploy your application. Use [best practices](introduction.md#best-practices) to achieve the best results. Most importantly:\n\n- Use \"Agent\" mode for the best experience. Avoid \"Ask\" mode.\n- Include the word \"Azure\" in the prompt to help Copilot understand that it needs to call tools from the Azure MCP Server.\n- If using Visual Studio Code, make sure you use \"Configure Tools ...\" and include both \"Azure MCP\" and \"GitHub Copilot for Azure\". [See the Tool calling section's Visual Studio Code tab](introduction.md#tool-calling) for more details.\n\n### Open-ended prompts\n\n- \"Where can I find metrics and logs in Azure?\"\n- \"I want to see all the error messages in my Azure logs.\"\n- \"I'm seeing errors with my app — check the Azure logs to find out why.\"\n- \"Why are my clients being disconnected so often in Azure?\"\n- \"Why did my last Azure deployment fail?\"\n- \"Help me analyze my Azure app for high CPU usage.\"\n- \"Why is my Azure application running slow?\"\n- \"Take a memory dump of my Azure app.\"\n\n### Prompts about specific timeframes\n\n- \"Grab all the Azure errors in the logs between yesterday and today.\"\n- \"Diagnose my Azure app to show what problems it encountered.\"\n- \"Tell me what goes wrong with my Azure app 'myAppName'.\"\n- \"Troubleshoot my Azure app for any possible issues in the last 3 hours.\"\n- \"What errors did my Azure app 'myAppName' have in the last 24 hours?\"\n\n\n### Prompts about specific errors\n\n- \"Are there any 501 errors in my Azure app logs?\"\n- \"Why am I seeing a 500 error when opening my Azure website?\"\n- \"I'm getting an xxx error code in Azure — what could be the reasons?\"\n- \"Show me all the 4xx errors in my Azure logs from the last 6 hours.\"\n- \"Find error messages in the Azure logs that might correlate to 500 errors.\"\n\n\n### Prompts about specific services and technologies\n\n|Service or technology|Troubleshoot prompt examples|\n|---|---|\n|Azure Container Apps|<ul><li>\"My Azure container app won't start.\"</li><li>\"My users are reporting errors with my Azure container app.\"</li><li>\"Can you look at my Azure container app 'energy-api-1' logs for any 404 errors?\"</li><li>\"Have my Azure container app's system console logs contained any warnings recently?\"</li></ul>|\n|Azure Kubernetes Service (AKS)|<ul><li>\"Help me troubleshoot my AKS cluster.\"</li><li>\"How do I troubleshoot Azure Kubernetes Service (AKS)?\"</li><li>\"How can I get the logs of a specific pod in Azure?\"</li><li>\"Do my Azure kube-apiserver logs show the last time a restart occurred?\"</li><li>\"My AKS cluster 'assistant-orchestrator' is having performance problems.\"</li><li>\"Find out why my Azure Kubernetes cluster 'store-service-prod' is running slow.\"</li><li>\"I'd like to investigate performance problems with my Azure Kubernetes cluster.\"</li></ul>|\n|Azure App Service|<ul><li>\"How can I improve my Azure web app's performance?\"</li><li>\"How do I improve my app's CPU usage in Azure?\"</li><li>\"How can I improve the performance of my Azure web app?\"</li><li>\"Diagnose high CPU usage in Azure App Service.\"</li><li>\"Show me how to detect slow performance issues in my Azure App Service web app.\"</li><li>\"Investigate high CPU usage for Azure App Service.\"</li><li>\"What's causing latency in my Azure web app?\"</li><li>\"Can you help me diagnose high CPU usage in Azure App Service?\"</li><li>\"Why am I seeing high memory usage in my Azure App Service?\"</li><li>\"Help me analyze my Azure web app downtime.\"</li><li>\"Help me diagnose slow performance in my Azure web app.\"</li><li>\"Help me collect a memory dump from Azure App Service.\"</li><li>\"My Azure App Service container won't start.\"</li><li>\"Is there anything wrong with my Azure bakery-api web app?\"</li><li>\"Look into whether my Azure web app is having any downtime.\"</li><li>\"Troubleshoot why my Azure web app is not responding.\"</li></ul>|\n|Azure Developer CLI (`azd`)|<ul><li>\"I'm getting this Azure Developer CLI error. What does it mean?\"</li></ul>|\n|Azure SDK|<ul><li>\"The npm Azure Resource Manager SDK is failing to install. What should I do?\"</li></ul>|\n|Azure Event Hubs|<ul><li>\"My application needs help processing real-time events in Azure Event Hubs.\"</li></ul>|\n|Azure OpenAI Service|<ul><li>\"What is using up my Azure OpenAI GPT4o model quota?\"</li></ul>|\n|Azure SignalR Service|<ul><li>\"My Azure SignalR client is not receiving messages. Why?\"</li><li>\"Why are my Azure SignalR clients being disconnected so often?\"</li><li>\"Where can I find metrics and logs for my Azure SignalR app?\"</li></ul>|\n|Azure Storage|<ul><li>\"Can you help me choose the right Azure Storage solution?\"</li><li>\"What are some ways to secure my Azure Storage account?\"</li><li>\"I got an Azure Storage error 403: unauthorized blob listing.\"</li></ul>|\n|Azure Web PubSub|<ul><li>\"My Azure Web PubSub client is not receiving messages. Why?\"</li></ul>|\n\n## Related content\n\n- [Understand what GitHub Copilot for Azure is and how it works](introduction.md).\n- [Get started](get-started.md) with GitHub Copilot for Azure by installing the software and writing your first prompt.\n- Follow the [quickstart](quickstart-deploy-app-agent-mode.md) to understand how to include GitHub Copilot for Azure in your software development workflow. The quickstart describes how to deploy services to Azure, monitor their status, and troubleshoot problems.\n- See example prompts for [learning more about Azure and understanding your Azure account, subscription, and resources](learn-examples.md).\n- See example prompts for [designing and developing applications for Azure](design-develop-examples.md).\n- See example prompts for [deploying your application to Azure](deploy-examples.md).\n"
  },
  {
    "path": "articles/go/TOC.yml",
    "content": "items:\n  - name: Azure for Go developers\n    href: index.yml\n  - name: Get started with Go on Azure\n    items:\n    - name: Key Azure services for Go developers\n      href: key-azure-services-for-go.md\n    - name: Use Blob Storage\n      href: /azure/storage/blobs/storage-quickstart-blobs-go?toc=/azure/developer/go/toc.json&bc=/azure/developer/go/breadcrumb/toc.json\n    - name: Connect to an Azure Database for PostgreSQL\n      href: /azure/postgresql/flexible-server/connect-go?toc=/azure/developer/go/toc.json&bc=/azure/developer/go/breadcrumb/toc.json\n    - name: Connect to an Azure Database for MySQL\n      href: /azure/mysql/flexible-server/connect-go?toc=/azure/developer/go/toc.json&bc=/azure/developer/go/breadcrumb/toc.json\n    - name: Query an Azure SQL database\n      href: /azure/azure-sql/database/connect-query-go?toc=/azure/developer/go/toc.json&bc=/azure/developer/go/breadcrumb/toc.json\n  - name: Use the Azure SDK for Go\n    items:\n    - name: What is the Azure SDK for Go?\n      href: overview.md\n    - name: Core concepts\n      href: azure-sdk-core-concepts.md\n    - name: Management libraries\n      expanded: false    \n      items:\n        - name: Overview\n          href: management-libraries.md\n        - name: Control plane operations\n          href: control-plane.md\n        - name: Data plane operations\n          href: data-plane.md\n    - name: Authentication\n      expanded: false\n      items:\n        - name: Overview\n          href: sdk/authentication/authentication-overview.md\n        - name: Auth during local development\n          items:\n          - name: Use a service principal\n            href: sdk/authentication/local-development-service-principal.md\n          - name: Use a developer account\n            href: sdk/authentication/local-development-dev-accounts.md\n        - name: Auth from Azure-hosted apps\n          items:\n          - name: Use a system-assigned managed identity\n            href: sdk/authentication/system-assigned-managed-identity.md\n          - name: Use a user-assigned managed identity\n            href: sdk/authentication/user-assigned-managed-identity.md\n        - name: Auth from on-premises apps\n          href: sdk/authentication/authentication-on-premises-apps.md\n        - name: Additional auth methods\n          href: sdk/authentication/authentication-additional-methods.md\n        - name: Credential chains\n          href: sdk/authentication/credential-chains.md\n    - name: How-to guides\n      expanded: false\n      items:\n        - name: Deploy an ARM template\n          href: deploy-azure-resource-manager-template.md\n        - name: Deploy a Go app to Container Apps\n          href: deploy-container-apps.md\n    - name: SDK examples\n      href: https://github.com/azure-samples/azure-sdk-for-go-samples\n    - name: Migration guides\n      href: migration-guides.md\n    - name: Reference\n      items:\n        - name: Azure SDK for Go API reference\n          href: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go\n        - name: Packages list\n          href: azure-sdk-library-package-index.md\n    - name: Resources\n      items:\n        - name: Visual Studio Code extension for Go\n          href: configure-visual-studio-code.md\n"
  },
  {
    "path": "articles/go/azure-ai-for-go-developers.md",
    "content": "---\ntitle: Develop Go apps that use AI services in Azure\ndescription: This article provides an organized list of resources about Azure AI scenarios for Go developers, including documentation and code samples.\nkeywords: ai, azure openai service\nms.topic: overview\nms.date: 03/31/2026\nms.update-cycle: 180-days\nms.custom: overview, devx-track-go, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n---\n\n# Develop AI apps with Go\n\nThis article contains an organized list of the best learning resources for Go developers who are getting started building AI apps. Resources include popular quickstart articles, reference samples, documentation, training courses, and so on.\n\n[!INCLUDE [azure-ai-for-developers-go](../ai/includes/azure-ai-for-developers-go.md)]\n"
  },
  {
    "path": "articles/go/azure-sdk-core-concepts.md",
    "content": "---\ntitle: Common usage patterns in Azure SDK for Go\ndescription: This article provides an overview of the common usage patterns in Azure SDK for Go.\nms.date: 06/2/2025\nms.topic: overview\nms.custom: devx-track-go\n---\n\n# Common usage patterns in Azure SDK for Go\n\nThe Azure Core (`azcore`) package in Azure SDK for Go implements several patterns that are applied throughout the SDK:\n\n- The [HTTP pipeline flow](#http-pipeline-flow), which is the underlying HTTP mechanism used by the SDK's client libraries.\n- [Pagination (methods that return collections)](#pagination-methods-that-return-collections).\n- [Long-running operations (LROs)](#long-running-operations).\n\n## Pagination (methods that return collections)\n\nMany Azure services return collections of items. Because the number of items can be large, these client methods return a *Pager*, which allows your app to process one page of results at a time. These types are individually defined for various contexts but share common characteristics, like a `NextPage` method.\n\nFor example, suppose there's a `ListWidgets` method that returns a `WidgetPager`. You'd then use the `WidgetPager` as shown here:\n\n```go\nfunc (c *WidgetClient) ListWidgets(options *ListWidgetOptions) WidgetPager {\n    // ...\n}\n\npager := client.ListWidgets(options)\n\nfor pager.NextPage(ctx) {\n    for _, w := range pager.PageResponse().Widgets {\n        process(w)\n    }\n}\n\nif pager.Err() != nil {\n    // Handle error...\n}\n```\n\n## Long-running operations\n\nSome operations on Azure can take a long time to complete, anywhere from a few seconds to a few days. Examples of such operations include copying data from a source URL to a storage blob or training an AI model to recognize forms. These *long-running operations (LROs)* poorly suited to the standard HTTP flow of a relatively quick request and response.\n\nBy convention, methods that start an LRO are prefixed with \"Begin\" and return a *Poller*. The Poller is used to periodically poll the service until the operation finishes.\n\nThe following examples illustrate various patterns for handling LROs. You can also learn more from the [poller.go](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azcore/internal/pollers/poller.go) source code in the SDK.\n\n### Blocking call to PollUntilDone\n\n`PollUntilDone` handles the entire span of a polling operation until a terminal state is reached. It then returns the final HTTP response for the polling operation with the content of the payload in the `respType` interface.\n\n```go\nresp, err := client.BeginCreate(context.Background(), \"blue_widget\", nil)\n\nif err != nil {\n    // Handle error...\n}\n\nw, err = resp.PollUntilDone(context.Background(), nil)\n\nif err != nil {\n    // Handle error...\n}\n\nprocess(w)\n```\n\n#### Customized poll loop\n\n`Poll` sends a polling request to the polling endpoint and returns the response or an error.\n\n```go\nresp, err := client.BeginCreate(context.Background(), \"green_widget\")\n\nif err != nil {\n    // Handle error...\n}\n\npoller := resp.Poller\n\nfor {\n    resp, err := poller.Poll(context.Background())\n\n    if err != nil {\n        // Handle error...\n    }\n\n    if poller.Done() {\n        break\n    }\n\n    // Do other work while waiting.\n}\n\nw, err := poller.FinalResponse(ctx)\n\nif err != nil {\n    // Handle error...\n}\n\nprocess(w)\n```\n\n### Resume from a previous operation\n\nExtract and save the resume token from an existing Poller.\n\nTo resume polling, maybe in another process or on another computer, create a new `PollerResponse` instance and then initialize it by calling its `Resume` method, passing it the previously saved resume token.\n\n```go\npoller := resp.Poller\ntk, err := poller.ResumeToken()\n\nif err != nil {\n    // Handle error...\n}\n\nresp = WidgetPollerResponse()\n\n// Resume takes the resume token as an argument.\nerr := resp.Resume(tk, ...)\n\nif err != nil {\n\t// Handle error...\n}\n\nfor {\n\tresp, err := poller.Poll(context.Background())\n\n\tif err != nil {\n\t\t// Handle error...\n\t}\n\n\tif poller.Done() {\n\t\tbreak\n\t}\n\n\t// Do other work while waiting.\n}\n\nw, err := poller.FinalResponse(ctx)\n\nif err != nil {\n\t// Handle error...\n}\n\nprocess(w)\n```\n\n## HTTP pipeline flow\n\nThe various SDK clients provide an abstraction over an Azure's REST API to enable code completion and compile-time type safety so you don't have to deal with lower-level transport mechanics over HTTP. However, you can *customize* the transport mechanics (like retries and logging).\n\nThe SDK makes HTTP requests through an HTTP *pipeline*. The pipeline describes the sequence of steps performed for each HTTP request-response round trip.\n\nThe pipeline is composed of a transport together with any number of policies:\n\n- The *transport* sends the request to the service and receives the response.\n- Each *policy* completes a specific action in the pipeline.\n\nThe following diagram illustrates the flow of a pipeline:\n\n![Diagram that shows the flow of a pipeline.](media/azure-sdk-core-concepts/request-response-pipeline-flow.png)\n\nAll client packages share a *Core* package named `azcore`. This package constructs the HTTP pipeline with its ordered set of policies, ensuring that all client packages behave consistently.\n\nWhen an HTTP request is sent, all policies run in the order in which they were added to the pipeline before the request is sent to the HTTP endpoint. These policies typically add request headers or log the outgoing HTTP request.\n\nAfter the Azure service responds, all policies run in the reverse order before the response returns to your code. Most policies ignore the response, but the logging policy records the response. The retry policy might reissue the request, making your app more resilient to network failures.\n\nEach policy is provided with the needed request or response data, together with any necessary context for running the policy. The policy completes its operation with the given data and then passes control to the next policy in the pipeline.\n\nBy default, each client package creates a pipeline configured to work with that specific Azure service. You can also define your own [custom policies](#custom-http-pipeline-policies) and insert them into the HTTP pipeline when you create a client.\n\n### Core HTTP pipeline policies\n\nThe Core package provides three HTTP policies that are part of every pipeline:\n\n- [Retry Policy](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/azcore/runtime/policy_retry.go)\n- [Logging Policy](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/azcore/runtime/policy_logging.go)\n- [Telemetry Policy](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/azcore/runtime/policy_telemetry.go)\n\n### Custom HTTP pipeline policies\n\nYou can define your own custom policy to add capabilities beyond the contents of the Core package. For example, to see how your app deals with network or service failures, you could create a policy that injects fault when requests are made during testing. Or you could create a policy that mocks a service's behavior for testing.\n\nTo create a custom HTTP policy, define your own structure with a `Do` method that implements the [`Policy`](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azcore/policy/policy.go#L20) interface: \n\n1. Your policy's `Do` method should perform operations as needed on the incoming [`policy.Request`](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azcore/policy/policy.go#L27). Examples of operations include logging, injecting a failure, or modifying any of the request's URL, query parameters, or request headers.\n1. The `Do` method forwards the (modified) request to the next policy in the pipeline by calling the request's `Next` method.\n1. `Next` returns the `http.Response` and an error. Your policy can perform any necessary operation, like logging the response/error.\n1. Your policy must return a response and error back to the previous policy in the pipeline.\n\n> [!NOTE]\n> Policies must be goroutine-safe. Goroutine safety allows multiple goroutines to access a single client object concurrently. It's common for a policy to be immutable after creation. This immutability ensures the goroutine is safe.\n\n\n#### Custom policy template\n\nThe following code can be used as a starting point to define a custom policy.\n\n```go\ntype MyPolicy struct {\n\tLogPrefix string\n}\n\nfunc (m *MyPolicy) Do(req *policy.Request) (*http.Response, error) {\n\t// Mutate/process request.\n\tstart := time.Now()\n\t// Forward the request to the next policy in the pipeline.\n\tres, err := req.Next()\n\t// Mutate/process response.\n\t// Return the response & error back to the previous policy in the pipeline.\n\trecord := struct {\n\t\tPolicy   string\n\t\tURL      string\n\t\tDuration time.Duration\n\t}{\n\t\tPolicy:   \"MyPolicy\",\n\t\tURL:      req.Raw().URL.RequestURI(),\n\t\tDuration: time.Duration(time.Since(start).Milliseconds()),\n\t}\n\tb, _ := json.Marshal(record)\n\tlog.Printf(\"%s %s\\n\", m.LogPrefix, b)\n\treturn res, err\n}\n\nfunc ListResourcesWithPolicy(subscriptionID string) error {\n\tcred, err := azidentity.NewDefaultAzureCredential(nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tmp := &MyPolicy{\n\t\tLogPrefix: \"[MyPolicy]\",\n\t}\n\toptions := &arm.ConnectionOptions{}\n\toptions.PerCallPolicies = []policy.Policy{mp}\n\toptions.Retry = policy.RetryOptions{\n\t\tRetryDelay: 20 * time.Millisecond,\n\t}\n\n\tcon := arm.NewDefaultConnection(cred, options)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tclient := armresources.NewResourcesClient(con, subscriptionID)\n\tpager := client.List(nil)\n\tfor pager.NextPage(context.Background()) {\n\t\tif err := pager.Err(); err != nil {\n\t\t\tlog.Fatalf(\"failed to advance page: %v\", err)\n\t\t}\n\t\tfor _, r := range pager.PageResponse().ResourceListResult.Value {\n\t\t\tprintJSON(r)\n\t\t}\n\t}\n\treturn nil\n}\n```\n\n### Custom HTTP transport\n\nA transport sends an HTTP request and returns its response/error. The first policy to handle the request is also the last policy that handles the response before returning the response/error back to the pipeline's policies (in reverse order). The last policy in the pipeline invokes the transport.\n\nBy default, clients use the shared `http.Client` from Go's standard library.\n\nYou create a custom stateful or stateless transport in the same way that you create a custom policy. In the stateful case, you implement the `Do` method inherited from the [Transporter](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azcore/policy/policy.go#L23) interface. In both cases, your function or `Do` method again receives an `azcore.Request`, returns an `azCore.Response`, and performs actions in the same order as a policy.\n\n### How to delete a JSON field when you invoke an Azure operation\n\nOperations like `JSON-MERGE-PATCH` send a JSON `null` to indicate a field should be deleted (along with its value):\n\n```json\n{\n    \"delete-me\": null\n}\n```\n\nThis behavior conflicts with the SDK's default marshaling that specifies `omitempty` as a way to resolve the ambiguity between a field to be excluded and its zero-value.\n\n```go\ntype Widget struct {\n\tName *string `json:\",omitempty\"`\n\tCount *int `json:\",omitempty\"`\n}\n```\n\nIn the preceding example, `Name` and `Count` are defined as pointer-to-type to disambiguate between a missing value (`nil`) and a zero-value (0), which might have semantic differences.\n\nIn an HTTP PATCH operation, any fields with the value `nil` don't affect the value in the server's resource. When updating a Widget's `Count` field, specify the new value for `Count`, leaving `Name` as `nil`.\n\nTo fulfill the requirement for sending a JSON `null`, the `NullValue` function is used:\n\n```go\nw := Widget{\n\tCount: azcore.NullValue(0).(*int),\n}\n```\n\nThis code sets `Count` to an explicit JSON `null`. When the request is sent to the server, the resource's `Count` field is deleted.\n\n## See also\n\n- [Azure SDK for Go reference documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go)\n- [Azure SDK for Go source code (GitHub)](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/azcore)\n"
  },
  {
    "path": "articles/go/azure-sdk-library-package-index.md",
    "content": "---\ntitle: Package index for Azure SDK libraries for Go\ndescription: Listing of the package names, pkg.go.dev links, docs links, and source code links for all libraries in the Azure SDK for Go.\nms.date: 09/04/2025\nms.topic: overview\nms.custom: devx-track-go\n---\n\n# Azure libraries for Go index\n\nAzure Go SDK packages, including beta releases, are listed at [pkg.go.dev](https://pkg.go.dev/). For more information, see: [Azure SDK Releases: Go](https://azure.github.io/azure-sdk/policies_releases.html#go).\n\n## Explore packages\n\nTo view source code, examples, and documentation:\n\n1. Find your desired package in the [all libraries](#all-libraries) table.\n1. **View source code repository** - Select the GitHub link in the **Source** column to view the package source code repository.\n1. **Try examples** - Each repository contains a *README.md* file with examples on how to get started.\n1. **Review documentation** - Go to the [Azure for Go developers](index.yml) documentation to find examples, quickstarts, tutorials, and best practices for using Azure SDK packages.\n\nThe following table shows all libraries that exist in the Azure SDK for Go. The table provides links to all relevant repositories and documentation. To keep up to date with the Azure SDKs, consider following the [@AzureSDK X account](https://twitter.com/azuresdk) (formerly known as Twitter) and the [Azure SDK blog](https://devblogs.microsoft.com/azure-sdk/).\n\n## All libraries\n\n[!INCLUDE [go-new-libraries](../includes/go-new.md)]\n"
  },
  {
    "path": "articles/go/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: Go\n      tocHref: /azure\n      topicHref: /azure/developer/go/index\n"
  },
  {
    "path": "articles/go/configure-visual-studio-code.md",
    "content": "---\ntitle: Install and configure Visual Studio Code for Go development\ndescription: This article helps you install and configure Visual Studio Code for Go development.\nms.date: 6/2/2025\nms.topic: quickstart\nms.custom: devx-track-go\n---\n\n# Install and configure Visual Studio Code for Go development\n\nIn this quickstart, you install the Go compiler and tools, install Visual Studio Code to write Go code, and install the Go for Visual Studio Code extension which provides support while writing Go. Once configured, you create an application, run it, and use the debugging tool to pause execution and observe the value of variables.\n\n## 1. Install Go\n\nInstall Go from the official page. This installs the compiler, the Standard Library, and many tools to perform various common tasks during Go development. To install Go, follow these steps:\n\n1. In a web browser, go to [go.dev/doc/install](https://go.dev/doc/install).\n1. Download the version for your operating system.\n1. Once downloaded, run the installer.\n1. Open a command prompt, then run `go version` to confirm Go was installed.\n\n## 2. Install Visual Studio Code\n\nNext, install Visual Studio Code, which provides basic code editing functionality. Follow these steps to install Visual Studio Code:\n\n1. Open a web browser and go to [code.visualstudio.com](https://code.visualstudio.com/).\n1. Download the version for your operating system. Visual Studio Code supports Windows, Linux, and macOS.\n1. Once downloaded, run the installer.\n\n## 3. Install the Go extension\n\nInstall and configure the [Go for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=golang.Go) extension. Visual Studio Code and the Go extension provide IntelliSense, code navigation, and advanced debugging.\n\n| Instructions    | Screenshot |\n|:----------------|-----------:|\n| In Visual Studio Code, bring up the Extensions view by clicking on the Extensions icon in the Activity Bar. Or use keyboard shortcut (Ctrl+Shift+X). | :::image type=\"content\" source=\"./media/configure-visual-studio-code/search-extensions-240px.png\" alt-text=\"A screenshot showing how search for the Go extension.\" lightbox=\"./media/configure-visual-studio-code/search-extensions.png\"::: |\n| Search for the Go extension, then select install. | :::image type=\"content\" source=\"./media/configure-visual-studio-code/install-go-extension-240px.png\" alt-text=\"A screenshot showing how to use the search box in the top tool bar to find App Services in Azure.\" lightbox=\"./media/configure-visual-studio-code/install-go-extension.png\"::: |\n\n## 4. Update the Go tools\n\n| Instructions    | Screenshot |\n|:----------------|-----------:|\n| In Visual Studio Code, open **Command Palette**'s **Help** > **Show All Commands**. Or use the keyboard shortcut (Ctrl+Shift+P) | :::image type=\"content\" source=\"./media/configure-visual-studio-code/search-extensions-240px.png\" alt-text=\"A screenshot showing how search the Command Palette.\" lightbox=\"./media/configure-visual-studio-code/search-extensions.png\"::: |\n| Search for `Go: Install/Update tools` then run the command from the pallet | :::image type=\"content\" source=\"./media/configure-visual-studio-code/install-go-tools-240px.png\" alt-text=\"A screenshot showing how to run the Go: install/update tool from the command pallet.\" lightbox=\"./media/configure-visual-studio-code/install-go-tools.png\"::: |\n| When prompted, select all the available Go tools then select OK.  | :::image type=\"content\" source=\"./media/configure-visual-studio-code/select-all-go-tools-240px.png\" alt-text=\"A screenshot showing how to update all the available Go tools.\" lightbox=\"./media/configure-visual-studio-code/select-all-go-tools.png\"::: |\n| Wait for the Go tools to finish updating.  | :::image type=\"content\" source=\"./media/configure-visual-studio-code/go-tools-install-240x.png\" alt-text=\"A screenshot showing all the Go tools that were updated.\" lightbox=\"./media/configure-visual-studio-code/go-tools-install.png\"::: |\n\n## 5. Write a sample Go program\n\nIn this step, you write and run a sample Go program to make sure everything is working correctly.\n\n| Instructions    | Screenshot |\n|:----------------|-----------:|\n| In Visual Studio Code, open the root directory of your Go application. To open the folder, select the Explorer icon in the Activity Bar then select **Open Folder**. | :::image type=\"content\" source=\"./media/configure-visual-studio-code/open-folder-240px.png\" alt-text=\"A screenshot showing how to create a new folder.\" lightbox=\"./media/configure-visual-studio-code/open-folder.png\"::: |\n| Select **New Folder** in the Explorer panel, then Create the root director for your sample Go application named `sample-app` | :::image type=\"content\" source=\"./media/configure-visual-studio-code/create-folder-240px.png\" alt-text=\"A screenshot showing how to create a folder in Visual Studio Code.\" lightbox=\"./media/configure-visual-studio-code/create-folder.png\"::: |\n| Select **New File** in the Explorer panel, then name the file `main.go` | :::image type=\"content\" source=\"./media/configure-visual-studio-code/create-file-240px.png\" alt-text=\"A screenshot showing how to create a file in Visual Studio Code.\" lightbox=\"./media/configure-visual-studio-code/create-file.png\"::: |\n| Open a terminal, **Terminal > New Terminal**, then run the command `go mod init sample-app` to initialize your sample Go app.   | :::image type=\"content\" source=\"./media/configure-visual-studio-code/run-go-mod-240px.png\" alt-text=\"A screenshot running the go mod init command.\" lightbox=\"./media/configure-visual-studio-code/run-go-mod.png\"::: |\n| Copy the following code into the `main.go` file.   | :::image type=\"content\" source=\"./media/configure-visual-studio-code/visual-studio-code-240px.png\" alt-text=\"A screenshot displaying a sample Go program.\" lightbox=\"./media/configure-visual-studio-code/visual-studio-code.png\"::: |\n\nSample code:\n\n```go\npackage main\n\nimport \"fmt\"\n\nfunc main() {\n    name := \"Go Developers\"\n    fmt.Println(\"Azure for\", name)\n}\n```\n\n## 6. Run the debugger\n\nFinally, create a break point and use the debugger tool. Break points allow you to step through code line by line and view the values stored in variables while the application is paused.\n\n| Instructions    | Screenshot |\n|:----------------|-----------:|\n| Create a break point on line 7 by clicking to the left of the numbered line. Optionally, place your cursor on line 7 and hit F9. | :::image type=\"content\" source=\"./media/configure-visual-studio-code/create-breakpoint-240px.png\" alt-text=\"A screenshot showing how to set a breakpoint.\" lightbox=\"./media/configure-visual-studio-code/create-breakpoint.png\"::: |\n| Open the Debug view by selecting the debug icon in the Activity Bar on the left side of Visual Studio Code. Optionally, use the keyboard shortcut (Ctrl+Shift+D). | :::image type=\"content\" source=\"./media/configure-visual-studio-code/run-debugger-240px.png\" alt-text=\"A screenshot showing how to navigate to the debug panel.\" lightbox=\"./media/configure-visual-studio-code/run-debugger.png\"::: |\n| Select *Run and Debug*, or select F5 to run the debugger. Then Hover over the variable `name` on line 7 to see its value. Exit the debugger by clicking **Continue** on the debugger bar or hit F5. | :::image type=\"content\" source=\"./media/configure-visual-studio-code/debug-variable-240px.png\" alt-text=\"A screenshot showing running the debugger in VS Code.\" lightbox=\"./media/configure-visual-studio-code/debug-variable.png\"::: |\n\nWhen the application completes, you should see the output of the `fmt.Println()` statement in the Debug Console.\n\n:::image type=\"content\" source=\"./media/configure-visual-studio-code/debug-console.png\" alt-text=\"A screenshot showing the result of the sample Go program printed to the debug console.\":::\n\nVisual Studio Code for Go development environment is successfully set up.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Go in Visual Studio Code](https://code.visualstudio.com/docs/languages/go)\n> [!div class=\"nextstepaction\"]\n> [Key Azure Services for Go Developers](key-azure-services-for-go.md)\n> [!div class=\"nextstepaction\"]\n> [Authenticate with the Azure SDK for Go](azure-sdk-authentication.md)\n"
  },
  {
    "path": "articles/go/control-plane.md",
    "content": "---\ntitle: Use the Azure SDK for Go for control plane operations\ndescription: Learn how to provision, configure, and manage Azure resources programmatically by using the Azure SDK for Go. This article focuses on control plane patterns such as creating resource groups and managing infrastructure through the SDK's management libraries.\nms.date: 03/13/2026\nms.topic: overview\nms.custom: devx-track-go\nms.devlang: golang\nai-usage: ai-assisted\n---\n\n# Use the Azure SDK for Go for control plane operations\n\nLearn how to provision, configure, and manage Azure resources programmatically by using the Azure SDK for Go management libraries. Common control-plane workflows include creating resource groups, managing storage and networking infrastructure, and handling virtual machine (VM) lifecycle operations such as create, start, stop, resize, update, and delete. If you want the higher-level introduction to how management libraries fit into the Azure SDK for Go, start with [Overview of the Azure SDK for Go management libraries](management-libraries.md). This article focuses on the Go control-plane patterns you reuse across services, and links to [data plane guidance](data-plane.md) when the runtime path moves from resource management to working with service data.\n\n## What is the Azure control plane?\n\nThe Azure control plane is the set of APIs that control the lifecycle of Azure resources - creating, updating, configuring, and deleting them. Every operation you perform in the Azure portal, Azure CLI, or infrastructure-as-code tool ultimately calls these control plane APIs.\n\nThe Azure SDK for Go exposes the control plane through a family of `arm*` packages under `github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/`. Each package maps to an Azure resource provider and follows a consistent pattern:\n\n1. Authenticate by using the `azidentity` package.\n1. Create a typed client for the resource you want to manage.\n1. Call methods on the client to create, read, update, or delete resources.\n1. Handle long-running operations by using pollers.\n\nCommon scenarios for Go control plane automation include:\n\n- Provisioning infrastructure for deployment pipelines\n- Managing VM lifecycle operations such as create, update, delete, start, stop, and resize\n- Building custom CLIs and operators for platform teams\n- Implementing GitOps-style infrastructure reconciliation\n- Automating compliance auditing and drift detection\n\n## Authentication\n\nAll management operations require an authenticated credential from the [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) package. The package provides credential types for every environment including local development, CI/CD pipelines, and production workloads running in Azure. All credential types implement the same `azcore.TokenCredential` interface, so you can swap them without changing client code.\n\nAfter you get a credential, create a client factory for the package and then ask it for the typed client you need:\n\n```go\n// Create credential that auto-discovers authentication (Azure CLI, env vars, managed identity)\ncred, err := azidentity.NewDefaultAzureCredential(nil)\n\n// Construct a client factory, then the typed client for management operations\nclientFactory, err := armresources.NewClientFactory(subscriptionID, cred, nil)\nrgClient := clientFactory.NewResourceGroupsClient()\n```\n\nCurrent `arm*` package docs usually show the client factory pattern because it centralizes shared configuration for related clients. Many packages also expose direct `New<ResourceType>Client(subscriptionID, credential, options)` constructors, but `NewClientFactory(...).New<ResourceType>Client()` is the pattern you'll most often see on pkg.go.dev. For local development, `DefaultAzureCredential` usually picks up your Azure CLI sign-in. In CI/CD and deployed workloads, you can switch to environment-based credentials or managed identity without changing the rest of your client code.\n\nFor a full guide on credential types and best practices, see [Authentication with the Azure SDK for Go](./sdk/authentication/authentication-overview.md) and the [azidentity package documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity).\n\n## Client packages and typed clients\n\nManagement packages are under `github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/<service>/arm<service>`. Install the identity package and only the `arm*` packages you plan to use. For example, if you're only managing VMs and resource groups, you only need `armcompute` and `armresources`. Each package contains clients for the resources in that service. For example, `armcompute` has clients for virtual machines, disks, images, and related compute resources.\n\nA single management package often contains several clients, with each client focused on one resource type or operation group. For example, `armcompute` includes clients for virtual machines, disks, images, and related resources. After you choose the package for a service, create one client factory and reuse it to create the typed clients that match the resources you want to manage.\n\n```go\nclientFactory, err := armcompute.NewClientFactory(subscriptionID, cred, nil)\nif err != nil {\n\treturn err\n}\nvmClient := clientFactory.NewVirtualMachinesClient()\n```\n\nThis package and client factory pattern is consistent across the `resourcemanager` modules. It's a useful shortcut when you're scanning pkg.go.dev or asking an agent to find the right client for a task.\n\n## Long-running operations\n\nMany management operations, such as creating clusters, deleting resource groups, and upgrading infrastructure, run asynchronously. Methods prefixed with `Begin` start the server-side work and return a poller immediately. Your code can decide whether to wait or keep doing other work:\n\n```go\n// Start an asynchronous operation (returns immediately)\npoller, err := client.BeginCreateOrUpdate(ctx, resourceGroupName, parameters, nil)\nif err != nil {\n\treturn err\n}\n\n// Block until the operation completes or fails\nresult, err := poller.PollUntilDone(ctx, nil)\nif err != nil {\n\treturn err\n}\n```\n\nA successful `Begin*` call only means Azure accepted the request. The operation can still fail later while the poller runs. That's why both the initial call and `PollUntilDone` need error handling. Use `PollUntilDone` when you want the simplest flow. Use `poller.Poll` and `poller.Done` when you need custom wait logic or progress reporting.\n\nFor more details on patterns, see the [Common usage patterns in Azure SDK for Go](azure-sdk-core-concepts.md).\n\n## Error handling\n\nManagement operations return structured errors you can inspect for specific error codes:\n\n```go\nimport \"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\n// Check if the error is an Azure service error with structured details\nvar respErr *azcore.ResponseError\nif errors.As(err, &respErr) {\n\tfmt.Printf(\"Error code: %s\\n\", respErr.ErrorCode)\n\tfmt.Printf(\"Status code: %d\\n\", respErr.StatusCode)\n}\n```\n\nMost `CreateOrUpdate` operations are idempotent. Calling them on an existing resource updates the resource instead of failing.\n\n## Provision a resource example\n\nThis example shows the common control plane pattern: authenticate, create a resource with tags and timeout, and check the result. Use this pattern as a template for all management operations because the credential, context, and subscription ID pattern applies to all `arm*` clients.\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources\"\n)\n\nfunc main() {\n\t// Read subscription ID from environment (avoid hardcoding)\n\tsubscriptionID := os.Getenv(\"AZURE_SUBSCRIPTION_ID\")\n\tif subscriptionID == \"\" {\n\t\tlog.Fatal(\"AZURE_SUBSCRIPTION_ID not set\")\n\t}\n\n\t// Create credential that auto-discovers authentication\n\tcred, err := azidentity.NewDefaultAzureCredential(nil)\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to create credential: %v\", err)\n\t}\n\n\t// Set a timeout for the entire operation (prevents hanging indefinitely)\n\tctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)\n\tdefer cancel()\n\n\t// Create a client factory for this management package\n\tclientFactory, err := armresources.NewClientFactory(subscriptionID, cred, nil)\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to create client factory: %v\", err)\n\t}\n\n\t// Create the typed client for resource groups\n\trgClient := clientFactory.NewResourceGroupsClient()\n\n\t// Many ARM models use pointer fields for optional values.\n\tresp, err := rgClient.CreateOrUpdate(ctx, \"example-rg\", armresources.ResourceGroup{\n\t\tLocation: to.Ptr(\"eastus\"),\n\t\tTags: map[string]*string{\n\t\t\t\"env\":  to.Ptr(\"dev\"),\n\t\t\t\"team\": to.Ptr(\"platform\"),\n\t\t},\n\t}, nil)\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to create or update resource group: %v\", err)\n\t}\n\n\tfmt.Printf(\"resource group %s ready in %s\\n\", *resp.Name, *resp.Location)\n}\n```\n\n## Resource groups\n\nThe [armresources](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources) package manages resource groups - the fundamental organizational containers in Azure. Every Azure resource exists within a resource group, making this the starting point for any provisioning workflow.\n\nUse it to create and update resource groups with location and tags, list groups across a subscription, and delete groups along with all contained resources. Resource group creation is synchronous and idempotent. Deletion is asynchronous and permanent.\n\nListing resource groups also introduces an important control-plane pattern: many read operations use pagers. When you enumerate resource groups or other large ARM collections, create a pager and iterate until `pager.More()` returns `false`.\n\n```go\npager := rgClient.NewListPager(nil)\nfor pager.More() {\n\tpage, err := pager.NextPage(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, group := range page.ResourceGroupListResult.Value {\n\t\tfmt.Println(*group.Name)\n\t}\n}\n```\n\n[Resource group management code sample](https://github.com/Azure-Samples/azure-sdk-for-go-samples/tree/main/sdk/resourcemanager/resource/resourcegroups).\n\nFor a getting started guide, see the [armresources package documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources).\n\n## Virtual machines\n\nThe [armcompute](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute) package is a canonical control-plane example because VM management is mostly lifecycle work: create or update a VM, start or stop it, resize it, and delete it. In Go, these workflows use the same `DefaultAzureCredential`, `context.Context`, and client factory pattern shown in the resource group example, so once that pattern is in place you can apply it across compute operations without changing your authentication approach.\n\nIf you need a quick starting point, create the compute client factory and then ask it for the typed VM client:\n\n```go\nclientFactory, err := armcompute.NewClientFactory(subscriptionID, cred, nil)\nif err != nil {\n\treturn err\n}\nvmClient := clientFactory.NewVirtualMachinesClient()\n```\n\nFor full VM samples and operation-specific guidance, see the existing [virtual machine management samples](https://github.com/Azure-Samples/azure-sdk-for-go-samples/tree/main/sdk/resourcemanager/compute) and the [armcompute package documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute). Use those references for complete request models and long-running operation details instead of duplicating large VM templates in this article.\n\n## Key Vault\n\nThe [armkeyvault](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault) package manages the lifecycle of Azure Key Vault instances. This package handles the control plane for vault infrastructure. Use the separate `azsecrets`, `azkeys`, and `azcertificates` data plane packages to read and write secrets, keys, and certificates.\n\nUse this package to provision vaults with the appropriate SKU and security settings, such as soft delete and purge protection. You can also manage access policies for principals, configure network access and private endpoints, and enable diagnostic logging. You can integrate vault provisioning into application onboarding workflows.\n\n[Key Vault management code sample](https://github.com/Azure-Samples/azure-sdk-for-go-samples/tree/main/sdk/resourcemanager/keyvault).\n\nFor runtime-side Key Vault clients, see [Use the Azure SDK for Go for data plane operations](data-plane.md).\n\nFor a getting started guide, see the [armkeyvault package documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault#section-readme).\n\n## AKS clusters\n\nThe [armcontainerservice](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice) package manages Azure Kubernetes Service clusters across their full lifecycle.\n\nUse this package to create clusters with configurable networking, Kubernetes version, and managed identity. You can add and scale node pools, upgrade control plane and node versions, enable add-ons like Azure Policy and monitoring, and query cluster health for operational dashboards. All cluster operations are long-running and follow the poller pattern.\n\n[AKS management code sample](https://github.com/Azure-Samples/azure-sdk-for-go-samples/tree/main/sdk/resourcemanager/containerservice).\n\nFor a getting started guide, see the [armcontainerservice package documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice#section-readme).\n\n## RBAC and authorization\n\nThe [armauthorization](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization) package manages Azure Role-Based Access Control. Use it to automate least-privilege access policies across subscriptions and resource groups.\n\nUse it to list and search built-in roles, assign roles to principals (users, service principals, managed identities, or groups) at any scope, create custom role definitions with fine-grained permissions, and audit assignments for compliance reporting and drift detection. Assign roles to groups rather than individuals, and use built-in roles where possible.\n\nFor a getting started guide, see the [armauthorization package documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization#section-readme).\n\n## Virtual networks and network security\n\nThe [armnetwork](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork) package manages Azure virtual networking infrastructure.\n\nUse it to create virtual networks and subnets, configure network security groups with inbound and outbound rules, set up private endpoints for PaaS services, automate network peering across regions, and implement hub-and-spoke topologies programmatically.\n\n[Network management code sample](https://github.com/Azure-Samples/azure-sdk-for-go-samples/tree/main/sdk/resourcemanager/network).\n\nFor a getting started guide, see the [armnetwork package documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork#section-readme).\n\n## Container registry\n\nThe [armcontainerregistry](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerregistry/armcontainerregistry) package manages Azure Container Registry instances.\n\nUse it to provision registries with the appropriate SKU and geo-replication, configure authentication (admin, service principal, or managed identity), manage webhooks for CI/CD, enable vulnerability scanning, and apply retention policies to images. You often use Container Registry alongside Azure Kubernetes Service. First, provision the registry, and then reference it during cluster creation.\n\n[Container Registry management code sample](https://github.com/Azure-Samples/azure-sdk-for-go-samples/tree/main/sdk/resourcemanager/containerregistry).\n\nFor a getting started guide, see the [armcontainerregistry package documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerregistry/armcontainerregistry#section-readme).\n\n## Storage accounts\n\nThe [armstorage](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage) package manages Azure Storage accounts. \n\nUse it to create storage accounts with the right performance tier and redundancy, manage access keys and shared access signatures, configure blob lifecycle policies, and set up diagnostic logging. Storage accounts are a common dependency for many applications, so automating their provisioning and configuration is a common control-plane scenario.\n\n[Storage account management code sample](https://github.com/Azure-Samples/azure-sdk-for-go-samples/tree/main/sdk/resourcemanager/storage).\n\nFor a getting started guide, see the [armstorage package documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage#section-readme).\n\n## Next steps\n\n- [Overview of the Azure SDK for Go management libraries](management-libraries.md)\n- [Use the Azure SDK for Go for data plane operations](data-plane.md)\n- [Azure SDK for Go authentication](./sdk/authentication/authentication-overview.md)\n- [Azure SDK for Go samples on GitHub](https://github.com/Azure-Samples/azure-sdk-for-go-samples)"
  },
  {
    "path": "articles/go/data-plane.md",
    "content": "---\ntitle: Use the Azure SDK for Go for data plane operations\ndescription: Learn how to work with application data in Azure services by using the Azure SDK for Go client libraries. This article covers runtime operations such as reading, writing, querying, and streaming data—performed against existing Azure resources after they've been provisioned.\nms.date: 03/13/2026\nms.topic: overview\nms.custom: devx-track-go\nms.devlang: golang\nai-usage: ai-assisted\n---\n\n# Use the Azure SDK for Go for data plane operations\n\nLearn how to interact with data stored in Azure services programmatically by using the Azure SDK for Go client libraries. For a higher-level introduction to how management libraries and client libraries fit together, see [Overview of the Azure SDK for Go management libraries](management-libraries.md). This article focuses on the Go data-plane patterns you use after a resource already exists, and points back to [control plane operations](control-plane.md) for provisioning and configuration work.\n\n## What is the Azure data plane?\n\nThe Azure data plane is the set of APIs that you use to interact with data inside Azure services, including uploading blobs, sending messages, querying databases, and retrieving secrets. While the control plane provisions and configures resources, the data plane is what your application code calls at runtime. A common Go workflow is to use control plane code once in setup or automation, and then keep data plane clients in the application path that runs every day.\n\nThe Azure SDK for Go exposes the data plane through service-specific packages such as **azblob**, **azservicebus**, **azeventhubs**, **azsecrets**, and **azcosmos**. Each package connects to an already-provisioned resource and follows a consistent pattern:\n\n1. Authenticate by using the `azidentity` package.\n1. Create a typed client by using a service endpoint or connection string.\n1. Call methods on the client to read, write, or process data.\n1. Handle paginated results and errors.\n\nCommon scenarios for Go data plane operations include:\n\n- Uploading and downloading files from Blob Storage\n- Sending and receiving messages with Service Bus or Event Hubs\n- Storing and querying documents in Cosmos DB\n- Retrieving secrets, keys, and certificates from Key Vault\n- Monitoring application performance with Application Insights\n\n## Authentication\n\nData plane operations support the same credential types from the [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) package used for control plane operations. All credential types implement the `azcore.TokenCredential` interface, so you can swap them without changing client code.\n\nData plane clients take a service endpoint (URL or namespace) and a credential, rather than a subscription ID:\n\n```go\n// Create credential that auto-discovers authentication\ncred, err := azidentity.NewDefaultAzureCredential(nil)\n\n// Blob Storage - pass the storage account URL\nblobClient, err := azblob.NewClient(\"https://mystorageaccount.blob.core.windows.net/\", cred, nil)\n\n// Key Vault secrets - pass the vault URL\nsecretClient, err := azsecrets.NewClient(\"https://mykeyvault.vault.azure.net/\", cred, nil)\n\n// Service Bus - pass the fully qualified namespace\nsbClient, err := azservicebus.NewClient(\"mynamespace.servicebus.windows.net\", cred, nil)\n```\n\nSome services also support connection strings for environments where token-based authentication isn't available:\n\n```go\n// Connection string authentication (when token auth is not available)\nclient, err := azservicebus.NewClientFromConnectionString(connectionString, nil)\n```\n\nFor production workloads running in Azure, use managed identity. For local development, `DefaultAzureCredential` automatically discovers credentials from `az login`, environment variables, or other sources.\n\nFor a full guide on credential types and best practices, see [Authentication with the Azure SDK for Go](./sdk/authentication/authentication-overview.md) and the [azidentity package documentation](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity).\n\n## Pagination\n\nMany data plane operations return collections that can be large. The SDK uses a pager pattern for these operations:\n\n```go\n// Create a pager for listing large result sets\npager := client.NewListSecretPropertiesPager(nil)\n\n// Iterate through pages until no more results\nfor pager.More() {\n\tpage, err := pager.NextPage(ctx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfor _, item := range page.Value {\n\t\tfmt.Println(*item.ID)\n\t}\n}\n```\n\nMethods that return `*Pager` types follow this same iteration pattern across all data plane packages.\n\nFor more details on pagination and other common patterns, see the [Common usage patterns in Azure SDK for Go](azure-sdk-core-concepts.md).\n\n## Error handling\n\nData plane operations return structured errors you can inspect for specific error codes:\n\n```go\nimport \"github.com/Azure/azure-sdk-for-go/sdk/azcore\"\n\n// Check if the error is an Azure service error with structured details\nvar respErr *azcore.ResponseError\nif errors.As(err, &respErr) {\n\tfmt.Printf(\"Error code: %s\\n\", respErr.ErrorCode)\n\tfmt.Printf(\"Status code: %d\\n\", respErr.StatusCode)\n}\n```\n\nCommon data plane error codes include `BlobNotFound`, `MessageLockLost`, `SecretNotFound`, and `RequestEntityTooLarge`. Check the documentation for each service for the full list of error codes.\n\n## Upload a blob example\n\nThis example shows a production-ready pattern: authenticate by using `DefaultAzureCredential`, create a blob client, upload data with a timeout, and verify. This pattern applies to all data plane clients. Swap the service endpoint and client type to adapt it for Service Bus, Event Hubs, Cosmos DB, or Key Vault.\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n)\n\nfunc main() {\n\taccountURL := \"https://<storage-account-name>.blob.core.windows.net/\"\n\tcontainerName := \"demo\"\n\tblobName := \"hello.txt\"\n\tdata := []byte(\"hello from Go\")\n\n\t// Create credential that auto-discovers authentication\n\tcred, err := azidentity.NewDefaultAzureCredential(nil)\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to create credential: %v\", err)\n\t}\n\n\t// Set a timeout to prevent hanging on network issues\n\tctx, cancel := context.WithTimeout(context.Background(), time.Minute)\n\tdefer cancel()\n\n\t// Create a client for the storage account\n\tclient, err := azblob.NewClient(accountURL, cred, nil)\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to create blob client: %v\", err)\n\t}\n\n\t// Upload data directly from a byte slice\n\t_, err = client.UploadBuffer(ctx, containerName, blobName, data, nil)\n\tif err != nil {\n\t\tlog.Fatalf(\"failed to upload blob: %v\", err)\n\t}\n\n\tfmt.Printf(\"uploaded %s to container %s\\n\", blobName, containerName)\n}\n```\n\n## Blob Storage\n\nThe [azblob](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob) package provides data plane access to Azure Blob Storage, a massively scalable object storage service. This package is what your application uses at runtime to read and write data. Use the separate `armstorage` control plane package to provision storage accounts and containers.\n\nUse it to upload and download files and documents, list and manage blobs and containers, set metadata and content properties, implement parallel uploads for large files, and build data processing pipelines.\n\n```bash\ngo get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\n```\n\nTo get started, see [Quickstart: Azure Blob Storage client module for Go](/azure/storage/blobs/storage-quickstart-blobs-go).\n\nFor the package documentation, see the [azblob package reference](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob#section-readme).\n\n## Cosmos DB\n\nThe [azcosmos](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos) package provides data plane access to Azure Cosmos DB, a globally distributed, multi-model database. Use it to build applications that need low-latency reads and writes at any scale.\n\nUse it to perform CRUD operations on documents, run SQL queries against containers, manage partitioning strategies for efficient data access, handle pagination over large result sets, and execute multi-item batch operations.\n\n```bash\ngo get github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos\n```\n\nTo get started, see [Quickstart: Use Azure Cosmos DB for NoSQL with Azure SDK for Go](/azure/cosmos-db/quickstart-go).\n\nFor the package documentation, see the [azcosmos package reference](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos#section-readme).\n\n## Event Hubs\n\nThe [azeventhubs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs) package provides data plane access to Azure Event Hubs - a real-time data ingestion service for high-throughput event streaming.\n\nUse it to send events with batching for efficient throughput, receive and process events by using consumer groups, manage partition assignment and checkpointing, route events by using partition keys for ordering guarantees, and build log ingestion and telemetry pipelines.\n\n```bash\ngo get github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs\n```\n\nTo get started, see [Quickstart: Send events to or receive events from Event Hubs using Go](/azure/event-hubs/event-hubs-go-get-started-send).\n\nFor the package documentation, see the [azeventhubs package reference](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs#section-readme).\n\n## Key Vault\n\nThe [azsecrets](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets), [azkeys](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys), and [azcertificates](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azcertificates) packages provide data plane access to Azure Key Vault. These packages your application uses at runtime to retrieve secrets and perform cryptographic operations. Use the separate `armkeyvault` control plane package to provision and configure vault instances.\n\nUse them to retrieve and set secrets (database passwords, API keys), create and manage cryptographic keys for signing and encryption, manage TLS/SSL certificates with automatic renewal, track secret versions and implement rotation strategies, and cache secrets to reduce latency and API calls.\n\n```bash\ngo get github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets\ngo get github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys\ngo get github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azcertificates\n```\n\nTo get started with Key Vault, see [Quickstart: Azure Key Vault certificate client library for Go](/azure/key-vault/certificates/quick-create-go).\n\nFor the package documentation, see the [azsecrets](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets#section-readme), [azkeys](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys#section-readme), and [azcertificates](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azcertificates#section-readme) package references.\n\n## Service Bus\n\nThe [azservicebus](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus) package provides data plane access to Azure Service Bus - a fully managed message broker for reliable asynchronous communication.\n\nUse it to send and receive messages on queues for point-to-point communication, publish and subscribe to topics for fan-out patterns, send batches of messages for efficient throughput, schedule messages for future delivery, and implement long-polling consumers with message completion and abandonment.\n\n```bash\ngo get github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus\n```\n\nTo get started with Azure Service Bus, see [Quickstart: Send messages to and receive messages from Azure Service Bus queues (Go)](/azure/service-bus-messaging/service-bus-go-how-to-use-queues).\n\nFor the package documentation, see the [azservicebus package reference](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus#section-readme).\n\n## Application Insights\n\nThe [ApplicationInsights-Go](https://github.com/microsoft/ApplicationInsights-Go) module provides telemetry integration with Azure Application Insights - Azure's application performance monitoring (APM) service.\n\nUse it to track custom events and metrics, monitor API response times and failures, implement distributed tracing across services, log exceptions with contextual properties, and control telemetry volume with sampling.\n\n```bash\ngo get github.com/microsoft/ApplicationInsights-Go\n```\n\nFor the service documentation, see the [Application Insights overview](/azure/azure-monitor/app/app-insights-overview).\n\n## Next steps\n\n- [Overview of the Azure SDK for Go management libraries](management-libraries.md)\n- [Use the Azure SDK for Go for control plane operations](control-plane.md)\n- [Azure SDK for Go authentication](./sdk/authentication/authentication-overview.md)\n- [Azure SDK for Go samples on GitHub](https://github.com/Azure-Samples/azure-sdk-for-go-samples)"
  },
  {
    "path": "articles/go/deploy-azure-resource-manager-template.md",
    "content": "---\ntitle: Deploy an Azure Resource Manage Template with the Azure SDK for Go\ndescription: In this tutorial, you learn how to use the Azure SDK for Go to deploy an Azure Resource Manager template.\nms.topic: how-to\nms.date: 12/16/2025\nms.custom: devx-track-go, devx-track-arm-template\n---\n\n# Deploy an Azure Resource Manager template by using the Azure SDK for Go\n\nIn this tutorial, you use the Azure SDK for Go to deploy an Azure Resource Manager template.\n\nAzure Resource Manager is the deployment and management service for Azure. It enables you to create, update, and delete resources in your Azure account. Azure Resource Manager templates declaratively describe your infrastructure as code in JSON documents.\n\nBy the end of this tutorial, you write and deploy an Azure Resource Manager template by using Go.\n\n<!-- Screenshot of ARM template & Go code in VS Code -->\n\n## Prerequisites\n\n[!INCLUDE [azure-subscription.md](includes/azure-subscription.md)]\n- [Go version 1.18 or above](https://go.dev/dl/)\n- [Azure CLI](/cli/azure/install-azure-cli)\n\n## Create a new module\n\nIn this section, you create a new Go module and install the required Azure SDK packages. You then create the main application file and add code that deploys an Azure Resource Manager template.\n\n1. Create a new directory named `deployARM-how-to`. Then change into that directory.\n\n    ```bash\n    mkdir deployARM-how-to\n    cd deployARM-how-to\n    ```\n\n1. Run the `go mod init` command to create the `go.mod` and `go.sum` files.\n\n    ```bash\n    go mod init deployARM-how-to\n    ```\n\n1. The Azure SDK for Go contains several packages for working with Azure. For this tutorial, you need the `azcore/to`, `azidentity`, and `armresources` packages.\n\n    Run the `go get` command to download these packages:\n\n    ```bash\n    go get github.com/Azure/azure-sdk-for-go/sdk/azcore/to\n    go get github.com/Azure/azure-sdk-for-go/sdk/azidentity\n    go get github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources\n    ```\n\n1. Create a file named `main.go`.\n\n    ```bash\n    touch main.go\n    ```\n\n1. Open `main.go` in your editor and add the following code that authenticates to Azure, creates a resource group, and deploys an Azure Resource Manager template:\n\n    ```go\n    package main\n    \n    import (\n    \t\"context\"\n    \t\"encoding/json\"\n    \t\"fmt\"\n    \t\"log\"\n    \t\"os\"\n    \n    \t\"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n    \t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n    \t\"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources\"\n    )\n    \n    const (\n    \tresourceGroupName     = \"deployARM-how-to\"\n    \tresourceGroupLocation = \"eastus\"\n    \tdeploymentName        = \"deployARM-how-to\"\n    \ttemplateFile          = \"template.json\"\n    )\n    \n    var (\n    \tctx = context.Background()\n    )\n\n    // Read a JSON file from the given path.\n\n    func readJSON(path string) (map[string]interface{}, error) {\n    \tdata, err := os.ReadFile(path)\n    \tif err != nil {\n    \t\tlog.Fatalf(\"failed to read file: %v\", err)\n    \t}\n    \tcontents := make(map[string]interface{})\n    \t_ = json.Unmarshal(data, &contents)\n    \treturn contents, nil\n    }\n    \n    func main() {\n    \tsubscriptionId := os.Getenv(\"AZURE_SUBSCRIPTION_ID\")\n\n    \t// Authenticate to Azure\n    \n    \tcred, err := azidentity.NewDefaultAzureCredential(nil)\n    \tif err != nil {\n    \t\tlog.Fatalf(\"failed to obtain a credential: %v\", err)\n    \t}\n    \n\t\t// Create a resource group.\n    \n    \tclient, err := armresources.NewResourceGroupsClient(subscriptionId, cred, nil)\n    \tif err != nil {\n    \t\tlog.Fatalf(\"failed to create client: %v\", err)\n    \t}\n    \tresp, err := client.CreateOrUpdate(context.Background(), resourceGroupName, armresources.ResourceGroup{\n    \t\tLocation: to.Ptr(resourceGroupLocation),\n    \t}, nil)\n    \tif err != nil {\n    \t\tlog.Fatalf(\"failed to obtain a response: %v\", err)\n    \t}\n    \tlog.Printf(\"resource group ID: %s\\n\", *resp.ResourceGroup.ID)\n    \n    \t// Read the template file.\n    \n    \ttemplate, err := readJSON(templateFile)\n    \tif err != nil {\n    \t\treturn\n    \t}\n    \n    \t// Deploy the Azure Resource Manager template.\n    \n    \tdeploymentsClient, err := armresources.NewDeploymentsClient(subscriptionId, cred, nil)\n    \tif err != nil {\n    \t\tlog.Fatalf(\"failed to create client: %v\", err)\n    \t}\n    \tdeploy, err := deploymentsClient.BeginCreateOrUpdate(\n    \t\tctx,\n    \t\tresourceGroupName,\n    \t\tdeploymentName,\n    \t\tarmresources.Deployment{\n    \t\t\tProperties: &armresources.DeploymentProperties{\n    \t\t\t\tTemplate: template,\n    \t\t\t\tMode:     to.Ptr(armresources.DeploymentModeIncremental),\n    \t\t\t},\n    \t\t},\n    \t\tnil,\n    \t)\n    \tif err != nil {\n    \t\tlog.Fatalf(\"failed to deploy template: %v\", err)\n    \t}\n    \n    \tfmt.Println(deploy)\n    }\n    ```\n\n## Create the Azure Resource Manager template\n\n1. In the `deployARM-how-to` directory, create another file named `template.json`.\n\n1. Open the `template.json` file and add the following Azure Resource Manager template code that creates an Azure storage account:\n\n    ```json\n    {\n        \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n        \"contentVersion\": \"1.0.0.0\",\n        \"parameters\": {\n        },\n        \"functions\": [],\n        \"variables\": {},\n        \"resources\": [{\n            \"name\": \"<StorageAccountName>\",\n            \"type\": \"Microsoft.Storage/storageAccounts\",\n            \"apiVersion\": \"2021-04-01\",\n            \"tags\": {\n                \"displayName\": \"<StorageAccountDisplayName>\"\n            },\n            \"location\": \"EastUS\",\n            \"kind\": \"StorageV2\",\n            \"sku\": {\n                \"name\": \"Premium_LRS\",\n                \"tier\": \"Premium\"\n            }\n        }],\n        \"outputs\": {}\n    }\n    ```\n\n1. Replace `<StorageAccountName>` and `<StorageAccountDisplayName>` with a [valid storage name value](/azure/storage/common/storage-account-overview).\n\nFor more information about Azure Resource Manager templates, see [Azure Resource Manager templates overview](/azure/azure-resource-manager/templates/overview).\n\n## Sign in to Azure\n\nThe code in this article uses the [DefaultAzureCredential](./sdk/authentication/credential-chains.md#defaultazurecredential-overview) type from the Azure Identity module for Go to authenticate to Azure. `DefaultAzureCredential` supports many credential types for authentication with Azure using OAuth with Microsoft Entra ID. In this article, you use the user credentials that you sign in to the Azure CLI with.\n\nIf you haven't already, sign in to the Azure CLI:\n\n```azurecli\naz login\n```\n\nIf multiple subscriptions are associated with your account, use the [az account list](/cli/azure/account#az-account-list) command to get a list of those subscriptions. Use the [az account set](/cli/azure/account#az-account-set) command to set the active subscription. By setting the active subscription, you ensure that any CLI commands you run in the rest of this article run against your intended subscription.\n\n> [!NOTE]\n> When running locally, `DefaultAzureCredential` also supports Azure Developer CLI (AZD) sign-in credentials or an Azure service principal that you configure in environment variables. To learn more about all the supported credential types, see [Azure authentication with the Azure Identity module for Go](azure-sdk-authentication.md).\n\n## Run the application\n\nBefore you can deploy the template, you need to define your Azure subscription ID as an environment variable.\n\n1. To get the subscription ID, run the following [az account show](/cli/azure/account#az-account-show) command.\n\n    ```azurecli\n    az account show --query id --output tsv\n    ```\n\n1. Set the `AZURE_SUBSCRIPTION_ID` environment variable with your subscription ID. Replace `<AzureSubscriptionId>` with your subscription ID.\n\n    ```azurecli\n    export AZURE_SUBSCRIPTION_ID=<AzureSubscriptionId>\n    ```\n\n1. Run the `go run` command to deploy the template:\n\n    ```azurecli\n    go run main.go\n    ```\n\n## Troubleshoot\n\nIf the storage account deployment fails, verify you used a [valid storage name value](/azure/storage/common/storage-account-overview#storage-account-endpoints). Storage account names must be between 3 and 24 characters in length and can contain only lowercase letters and numbers.\n\nIf the program returns an error related to authentication or authorization, check the following items:\n\n- If the error begins with a timestamp and the following text: \"failed to obtain a response: DefaultAzureCredential: failed to acquire a token.\", make sure that you signed in to the Azure CLI as instructed previously.\n\n- If the error is an authorization or forbidden error (status code 401 or 403), make sure your user account is in an Azure role that gives it rights to create resource groups and add resources on your subscription. Examples include the *Contributor* or *Owner* [Azure built-in roles](/azure/role-based-access-control/built-in-roles). To learn how to assign Azure roles to your user, see [Assign Azure roles using Azure CLI](/azure/role-based-access-control/role-assignments-cli).\n\nFor more detailed troubleshooting guidance, see [Troubleshoot Azure Identity authentication issues](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azidentity/TROUBLESHOOTING.md).\n\n## Verify the resources on Azure\n\nYou can use several Azure CLI commands to verify that the resources were successfully created on Azure. The following commands are some examples.\n\nTo verify that the resource group exists, run the [az group exists](/cli/azure/group#az-group-exists) command.\n\n```azurecli\naz group exists --name deployARM-how-to\n```\n\nYou can list the resources in the group by using the [az resource list](/cli/azure/resource#az-resource-list) command.\n\n```azurecli\naz resource list --resource-group deployARM-how-to\n```\n\nYou can examine the deployment results (outputResources) and properties by using the [az deployment group show](/cli/azure/deployment/group#az-deployment-group-show) command.\n\n```azurecli\naz deployment group show -g deployARM-how-to -n deployARM-how-to\n```\n\n## Clean up resources\n\nResources in Azure can incur ongoing charges. Be sure to clean up the resources you created in this article.\n\nDeploying an empty template in complete mode deletes all the resources within a resource group. It's a neat way to clean up resources without deleting the resource group itself.\n\n1. Create a new empty template named `empty-template.json`.\n\n1. Open `empty-template.json` in your editor and add the following code:\n\n    ```json\n    {\n        \"$schema\": \"https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#\",\n        \"contentVersion\": \"1.0.0.0\",\n        \"parameters\": {},\n        \"variables\": {},\n        \"resources\": [],\n        \"outputs\": {}\n    }\n    ```\n\n1. Open your `main.go` file.\n\n1. Update the `templateFile` constant value to `empty-template.json`.\n\n    ```go\n    const (\n    \tresourceGroupName     = \"deployARM-how-to\"\n    \tresourceGroupLocation = \"eastus\"\n    \tdeploymentName        = \"deployARM-how-to\"\n    \ttemplateFile          = \"empty-template.json\"\n    )\n    ```\n\n1. Change the deployment time from *incremental* to *complete* by changing the deployment *Mode* properties to `DeploymentModeComplete`. To learn more about deployment modes, see [Azure Resource Manager deployment modes](/azure/azure-resource-manager/templates/deployment-modes).\n\n    ```go\n    deploy, err = deploymentsClient.BeginCreateOrUpdate(\n    \tctx,\n    \tresourceGroupName,\n    \tdeploymentName,\n    \tarmresources.Deployment{\n    \t\tProperties: &armresources.DeploymentProperties{\n    \t\t\tTemplate: template,\n    \t\t\tMode:     to.Ptr(armresources.DeploymentModeComplete), //Deployment Mode is here\n    \t\t},\n    \t},\n    \tnil,\n    )\n    ```\n\n1. Run the `go run` command to deploy the empty template and delete the storage account you created previously.\n\n    ```azurecli\n    go run main.go\n    ```\n\nInstead of using a deployment, you can delete the resource group and all its resources by running the following Azure CLI command:\n\n```azurecli\naz group delete --resource-group deployARM-how-to\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure SDK for Go Core Concepts](azure-sdk-core-concepts.md)\n\n> [!div class=\"nextstepaction\"]\n> [Azure SDK for Go management libraries](management-libraries.md)\n"
  },
  {
    "path": "articles/go/deploy-container-apps.md",
    "content": "---\ntitle: Deploy a Go web app to Azure Container Apps\ndescription: In this tutorial, you learn how to use Docker, Azure Container Registry, and Azure Container Apps to deploy a Go web app to Azure.\nms.topic: quickstart\nms.date: 11/24/2025\nms.custom: devx-track-go, devx-track-azurecli\n---\n\n# Deploy a Go web app to Azure Container Apps\n\nIn this quickstart, you learn to deploy a containerized Go web app to Azure Container Apps.\n\n[Azure Container Apps](/azure/container-apps/) lets you run application code packaged in any container without managing complicated cloud infrastructure or complex container orchestrators. It also eliminates the need to worry about the runtime or programming model. Common uses of Azure Container Apps include: Deploying API endpoints, hosting background processing applications, handling event-driven processing, and running microservices.\n\nFollow this tutorial to walk through building a Docker image, deploying that image to Azure Container Registry, and deploying a Go web app to Azure Container Apps.\n\n## Prerequisites\n\n[!INCLUDE [azure-subscription.md](includes/azure-subscription.md)]\n- **Go installed**: Version 1.18 or [above](https://go.dev/dl/)\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/)\n\n## Setup\n\nTo sign in to Azure from the CLI, run the [az login](/cli/azure/reference-index#az-login) command and follow the prompts to complete the authentication process.\n\n```azurecli\naz login\n```\n\nTo ensure you're running the latest version of the CLI, run the [az upgrade](/cli/azure/reference-index#az-upgrade) command.\n\n```azurecli\naz upgrade\n```\n\nNext, install or update the Azure Container Apps extension for the CLI.\n\nIf you receive errors about missing parameters when you run `az containerapp` commands in Azure CLI, make sure you have the latest version of the Azure Container Apps extension installed.\n\n```azurecli\naz extension add --name containerapp --upgrade\n```\n\n> [!NOTE]\n> Starting in May 2024, Azure CLI extensions no longer enable preview features by default. To access Container Apps [preview features](/azure/container-apps/whats-new), install the Container Apps extension with `--allow-preview true`.\n>\n> ```azurecli\n> az extension add --name containerapp --upgrade --allow-preview true\n> ```\n\nNow that the current extension or module is installed, register the `Microsoft.App`, `Microsoft.ContainerRegistry`, and `Microsoft.OperationalInsights` namespaces.\n\n```azurecli\naz provider register --namespace Microsoft.App\naz provider register --namespace Microsoft.ContainerRegistry\naz provider register --namespace Microsoft.OperationalInsights\n```\n\n> [!NOTE]\n> Azure Container Apps resources migrated from the `Microsoft.Web` namespace to the `Microsoft.App` namespace. For more information, see [Namespace migration from Microsoft.Web to Microsoft.App in March 2022](https://github.com/microsoft/azure-container-apps/issues/109).\n\n## Download the sample app\n\nTo follow this tutorial, you need a sample application to containerize. The [msdocs-go-webapp-quickstart](https://github.com/Azure-Samples/msdocs-go-webapp-quickstart) GitHub repository provides a sample Go web app. Download or clone the sample application to your local workstation.\n\n```bash\ngit clone https://github.com/Azure-Samples/msdocs-go-webapp-quickstart.git\n\ncd msdocs-go-webapp-quickstart\n```\n\n## Create an Azure Container Registry\n\n[Azure Container Registry](/azure/container-registry/) allows you to build, store, and manage container images. Use it to store the Docker image that contains the sample Go web app provided in the sample repository mentioned previously.\n\nRun the following commands to create an Azure Container Registry:\n\n1. Set environment variables for the resources you'll create. Replace the placeholder text in brackets with the appropriate values. Your Azure Container Registry name needs to be globally unique.\n\n    ```bash\n    RESOURCE_GROUP_NAME=\"<resourceGroupName>\"  # Name of the Azure resource group to create\n    LOCATION=\"<location>\"                      # Azure region (For example, \"eastus\", \"westus2\")\n    ACR_NAME=\"<azureContainerRegistryName>\"    # Globally unique name for Azure Container Registry\n    ```\n\n    The example commands for setting the environment variables are for the Bash shell. If you're using a different shell, adjust the commands accordingly.\n\n1. Create an Azure resource group with the [az group create](/cli/azure/group#az-group-create) command.\n\n    ```azurecli\n    az group create \\\n        --name $RESOURCE_GROUP_NAME \\\n        --location $LOCATION\n    ```\n\n1. Create an Azure Container Registry with the [az acr create](/cli/azure/acr#az-acr-create) command.\n\n    ```azurecli\n    az acr create \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --name $ACR_NAME \\\n        --sku basic\n    ```\n\n1. Sign in to the Azure container instance with the [az acr login](/cli/azure/acr#az-acr-login) command.\n\n    ```azurecli\n    az acr login --name $ACR_NAME\n    ```\n\n    > [!NOTE]\n    > If you get an error similar to the following error when you run the `az acr login` command, make sure the Docker daemon is running on your system:\n    >\n    > ```output\n    > You may want to use 'az acr login -n $ACR_NAME --expose-token' to get an access token, which doesn't require Docker to be installed.\n    > An error occurred: DOCKER_COMMAND_ERROR\n    > ```\n\n### Build and push the Docker image\n\nAfter you create an Azure Container Registry, build and push the Docker image of the sample Go web app.\n\nRun the following commands to build and push the image to the registry.\n\n1. Set environment variable for the Docker image you'll create. Replace the placeholder text in brackets with the appropriate values.\n\n    ```bash\n    IMAGE_NAME=\"go-webapp\"  # Name for the Docker image\n    ```\n    The example commands for setting the environment variables are for the Bash shell. If you're using a different shell, adjust the commands accordingly.\n\n1. Get the sign-in server information with the [az acr show](/cli/azure/acr#az-acr-show) command and store it in an environment variable.\n\n    ```azurecli\n    LOGIN_SERVER=$(az acr show \\\n        --name $ACR_NAME \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --query loginServer \\\n        --output tsv)\n\n    echo \"Login server: $LOGIN_SERVER\"\n    ```\n\n1. Build the Docker image locally.\n\n    ```bash\n    docker build -t $LOGIN_SERVER/$IMAGE_NAME:latest .\n    ```\n\n1. Push the Docker image to Azure Container Registry.\n\n    ```bash\n    docker push $LOGIN_SERVER/$IMAGE_NAME:latest\n    ```\n\n1. Verify the image was successfully pushed to Azure Container Registry with the [az acr repository list](/cli/azure/acr#az-acr-list) command.\n\n    ```azurecli\n    az acr repository list \\\n        --name $ACR_NAME \\\n        --output table\n    ```\n\nNow that you have an image available in Azure Container Registry, you're ready to deploy the Azure Container App and its environment.\n\n### Create an Azure Container Apps environment\n\nAzure Container Apps doesn't have the complexity of a container orchestrator, but it still needs some way to establish secure boundaries. Azure Container Apps environments provide this capability. Container Apps deployed in the same environment share the same virtual network and write logs to the same Log Analytics workspace. Before you can deploy an Azure Container App, you need an environment to deploy to.\n\n1. Set environment variables for the resources you'll create. Replace the placeholder text in brackets with the appropriate values.\n\n    ```bash\n    CONTAINER_APP_ENV=\"mygoappenv\"  # Name for the Container Apps environment\n    CONTAINER_APP_NAME=\"mygoapp\"    # Name for your container app\n    ```\n    The example commands for setting the environment variables are for the Bash shell. If you're using a different shell, adjust the commands accordingly.\n\n1. Run the [az containerapp env create](/cli/azure/containerapp/env#az-containerapp-env-create) command to create an Azure Container Apps environment.\n\n    ```azurecli\n    az containerapp env create \\\n        --name $CONTAINER_APP_ENV \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --location $LOCATION\n    ```\n\n## Deploy to Azure Container Apps\n\nAt this point, you've completed the following steps:\n\n- Created an Azure Container Registry.\n- Built and pushed a Docker image to the registry.\n- Set up an Azure Container Apps environment.\n\nThe last step is to deploy the application.\n\nRun the [az containerapp create](/cli/azure/containerapp#az-containerapp-create) command to deploy the Go web app to Azure Container Apps.\n\n```azurecli\naz containerapp create \\\n    --name $CONTAINER_APP_NAME \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --environment $CONTAINER_APP_ENV \\\n    --image \"$LOGIN_SERVER/$IMAGE_NAME:latest\" \\\n    --registry-server \"$LOGIN_SERVER\" \\\n    --registry-identity system \\\n    --target-port 8080 \\\n    --ingress external\n```\n\nThe `--registry-identity system` parameter configures the system-assigned **[managed identity](/azure/active-directory/managed-identities-azure-resources/overview)** on the container app. The container app uses this identity rather than username and password, which is less secure, to authenticate with the container registry. The command also automatically creates an [`AcrPull` role](/azure/role-based-access-control/built-in-roles/containers#acrpull) assignment for the identity, authorizing it to pull images from the registry. To use managed identities for authentication and authorization, the registry must be an Azure Container Registry.\n\n## Verify the web app URL\n\n1. Run the [az containerapp show](/cli/azure/containerapp#az-containerapp-show) command to get the FQDN (Fully Qualified Domain Name) of the web application's ingress.\n\n    ```azurecli\n    APP_FQDN=$(az containerapp show \\\n        --name $CONTAINER_APP_NAME \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --query properties.configuration.ingress.fqdn \\\n        --output tsv)\n\n    echo \"App URL: https://$APP_FQDN\"\n    ```\n\n1. Run the curl command against the FQDN and confirm the output reflects the HTML of the website. You can also open the URL in a web browser to interact with the web app.\n\n    ```bash\n    curl \"https://$APP_FQDN\"\n    ```\n\n    `The command returns the HTML for the web app's home page similar to the following:\n\n    ```html\n    <!DOCTYPE html>\n    <html>\n\n    <head>\n        <title>Hello Azure - Go Quickstart</title>\n        <link rel=\"stylesheet\" href=\"/assets/main.css\">\n        <link rel=\"icon\" type=\"image/x-icon\" href=\"/assets/favicon.ico\">\n    </head>\n\n    <header>\n        <h1>Welcome to Azure</h1>\n    </header>\n\n    <section>\n        <img src=\"/assets/images/azure-icon.svg\">\n        <form method=\"post\">\n            <label for=\"form-label\">Could you please tell me your name?</label><br>\n            <input type=\"text\" id=\"name\" name=\"name\" style=\"max-width: 256px;\"><br>\n            <button type=\"submit\">Say Hello</button>\n        </form>\n    </section>\n\n    </html>\n    ```\n\n## Clean up resources\n\nWhen you're finished with the sample app, you can remove all of the resources for the app from Azure. Doing so avoids ongoing charges and keeps your Azure subscription uncluttered. Removing the resource group also removes all resources in the resource group and is the fastest way to remove all Azure resources for your app.\n\nRun the [az group delete](/cli/azure/group#az-group-delete) command to delete the resource group and its resources.\n\n```azurecli\naz group delete \\\n    --name $RESOURCE_GROUP_NAME \\\n    --no-wait\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Key Azure Services for Go developers](key-azure-services-for-go.md)\n\n> [!div class=\"nextstepaction\"]\n> [Configure Visual Studio Code for Go Development](configure-visual-studio-code.md)\n"
  },
  {
    "path": "articles/go/includes/azure-sdk-get.md",
    "content": "---\nms.date: 09/05/2018 \nms.technology: azure-cli\n---\nThe [Azure SDK for Go](https://github.com/Azure/azure-sdk-for-go) is compatible with Go versions 1.8 and higher. For environments using\n[Azure Stack Profiles](/azure/azure-stack/user/azure-stack-version-profiles-go), Go version 1.9 is the minimum requirement.\nIf you need to install Go, follow [the Go installation instructions](https://go.dev/doc/install).\n\nYou can download the Azure SDK for Go and its dependencies via `go get`.\n\n```bash\ngo get -u -d github.com/Azure/azure-sdk-for-go/...\n```\n\n> [!WARNING]\n> Make sure that you capitalize `Azure` in the URL. Doing otherwise can cause case-related import problems\n> when working with the SDK. You also need to capitalize `Azure` in your import statements.\n"
  },
  {
    "path": "articles/go/includes/azure-subscription.md",
    "content": "---\n ms.service: azure-go\n ms.topic: include\n ms.date: 08/17/2021\n---\n\n- **Azure subscription**: If you don't have an Azure subscription, create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin."
  },
  {
    "path": "articles/go/includes/configure-environment.md",
    "content": "---\ntitle: Include file\ndescription: Include file\nms.topic: include\nms.date: 08/04/2024\n---\n\n- **Azure subscription:** If you don't have an Azure subscription, create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n\n- [Get the Azure subscription ID](/azure/media-services/latest/setup-azure-subscription-how-to?tabs=portal).\n\n- [Get the Microsoft Entra tenant ID](/azure/active-directory/fundamentals/how-to-find-tenant).\n\n- [Create a service principal](/azure/active-directory/develop/howto-create-service-principal-portal). Note the service principal's application (client) ID and secret. Make sure you also follow the instructions to assign the Contributor role on your subscription to the application. The Contributor role is a privileged administrator role that grants permission to manage all resources in your subscription.\n"
  },
  {
    "path": "articles/go/includes/set-authentication-environment-variables.md",
    "content": "---\ntitle: Include file\ndescription: Include file\nms.topic: include\nms.date: 08/04/2024\n---\n\nUsing your Azure authentication information, set the appropriate environment variables so that your code can authenticate to Azure.\n\n#### [Bash](#tab/bash)\n\nSet the following environment variables. Replace the placeholders with the appropriate values from the previous section.\n\n```bash\nexport AZURE_SUBSCRIPTION_ID=\"<azure_subscription_id>\"\nexport AZURE_TENANT_ID=\"<active_directory_tenant_id>\"\nexport AZURE_CLIENT_ID=\"<service_principal_appid>\"\nexport AZURE_CLIENT_SECRET=\"<service_principal_password>\"\n```\n\n#### [Windows](#tab/windows)\n\nSet the following environment variables. Replace the placeholders with the appropriate values from the previous section.\n\n```cmd\nset AZURE_SUBSCRIPTION_ID=\"<azure_subscription_id>\"\nset AZURE_TENANT_ID=\"<active_directory_tenant_id>\"\nset AZURE_CLIENT_ID=\"<service_principal_appid>\"\nset AZURE_CLIENT_SECRET=\"<service_principal_password>\"\n```\n\n----\n"
  },
  {
    "path": "articles/go/includes/troubleshooting.md",
    "content": "---\ntitle: include file\ndescription: include file\nms.topic: include\nms.date: 08/10/2021\n---\n\n## Troubleshooting\n\n- Check [previous questions posted to Stack Overflow](https://stackoverflow.com/questions/tagged/azure+go) or ask new questions using the `Azure` and `Go` tags.\n- For any errors you come across, file a [GitHub Issue](https://github.com/Azure/azure-sdk-for-go/issues)\n"
  },
  {
    "path": "articles/go/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure for Go developers\nsummary: Learn to use the Azure SDK for Go, browse API references, sample code, tutorials, quickstarts, conceptual articles, and more.\nmetadata:\n  title: Azure for Go developers\n  description: Get started developing with the Azure SDK for Go.\n  author: PatAltimore\n  ms.author: patricka\n  ms.date: 09/03/2025\n  ms.topic: landing-page\n  ms.service: azure-go\n  ms.collection: collection\n  ms.devlang: golang\n  ms.custom: devx-track-go\n\nlandingContent:\n  - title: Get started\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: What is the Azure SDK for Go?\n            url: overview.md\n          - text: Key Azure services for Go developers\n            url: key-azure-services-for-go.md\n          - text: Authenticate with the Azure Identity module for Go\n            url: azure-sdk-authentication.md\n      - linkListType: download\n        links:\n          - text: Install the Azure SDK for Go\n            url: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go\n          - text: Azure SDK for Go samples\n            url: https://github.com/azure-samples/azure-sdk-for-go-samples\n      - linkListType: training\n        links:\n          - text: Build serverless apps with Go\n            url: /training/modules/serverless-go\n  - title: Data and storage\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Use Blob Storage with Go\n            url: /azure/storage/blobs/storage-quickstart-blobs-go?toc=/azure/developer/go/toc.json&bc=/azure/developer/go/breadcrumb/toc.json\n          - text: Connect to an Azure Database for PostgreSQL\n            url: /azure/postgresql/flexible-server/connect-go?toc=/azure/developer/go/toc.json&bc=/azure/developer/go/breadcrumb/toc.json\n          - text: Connect to an Azure Database for MySQL\n            url: /azure/mysql/flexible-server/connect-go?toc=/azure/developer/go/toc.json&bc=/azure/developer/go/breadcrumb/toc.json\n          - text: Query an Azure SQL database\n            url: /azure/azure-sql/database/connect-query-go?toc=/azure/developer/go/toc.json&bc=/azure/developer/go/breadcrumb/toc.json\n  - title: Virtual Machines\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Authenticate with a managed identity\n            url: azure-sdk-authentication-managed-identity.md\n  - title: Serverless functions\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Create a Go serverless function in Azure\n            url: /azure/azure-functions/create-first-function-vs-code-other\n  - title: Containers\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Build and containerize a Go app\n            url: deploy-container-apps.md\n  - title: Open source\n    linkLists:\n      - linkListType: reference\n        links:\n          - text: Dapr (Distributed Application Runtime)\n            url: https://github.com/dapr/dapr\n          - text: KEDA (Kubernetes Event Driven Autoscaler)\n            url: https://github.com/kedacore/keda\n          - text: KEDA HTTP Add-on\n            url: https://github.com/kedacore/http-add-on\n"
  },
  {
    "path": "articles/go/key-azure-services-for-go.md",
    "content": "---\ntitle: Key Azure Services for Go developers\ndescription: Azure has over 100 services, but these are the 8 services most frequently used by Go developers.\nms.date: 09/11/2025\nms.topic: overview\nms.custom: devx-track-go\n---\n\n# Key Azure services for Go developers\n\nAzure offers over 100 services, but Go developers most often use these services.\n\n| Icon | Service | Description |\n|:----:|:--------|:------------|\n| ![Azure Storage Blobs Icon](./media/service-icons/blob-block-general.svg) | **Azure Blob Storage**   | [Azure Blob Storage](/azure/storage/blobs/) allows your applications to store and retrieve files in the cloud. Azure Storage is highly scalable to store massive amounts of data and data is stored redundantly to ensure high availability. |\n| ![Azure Functions Icon](./media/service-icons/function-app.svg) | **Azure Functions** | [Azure Functions](/azure/azure-functions/) is a serverless compute service that lets you write small, discrete segments of code that can be executed in a scalable and cost-effective manner, all without managing any servers or runtimes. Functions are invoked by various events and easily integrate with other Azure services by using input and output bindings.        |\n| ![Azure Container Registry](./media/service-icons/container-registries.svg) | **Azure Container Registry** | [Azure Container Registry](/azure/container-registry/) is a managed, private Docker registry service based on the open-source Docker Registry 2.0. Create and maintain Azure container registries to store and manage your private Docker container images and related artifacts. |\n| ![Azure Container Instance](./media/service-icons/containers-instances.svg) | **Azure Container Instance** | [Azure Container Instances](/azure/container-instances/) offers the fastest and simplest way to run a container in Azure, without having to manage any virtual machines and without having to adopt a higher-level service. |\n| ![Azure Kubernetes Service](./media/service-icons/azure-kubernetes-service.svg) | **Azure Kubernetes Service** | [Azure Kubernetes Service](/azure/aks/) (AKS) simplifies deploying a managed Kubernetes cluster in Azure by offloading the operational overhead to Azure. As a hosted Kubernetes service, Azure handles critical tasks, like health monitoring and maintenance. Since Kubernetes is managed by Azure, you only manage and maintain the agent nodes. |\n| ![Azure Virtual Machines](./media/service-icons/virtual-machine.svg) | **Azure Virtual Machines**   | [Azure virtual machines](/azure/virtual-machines/) (VMs) enable you to create dedicated compute resources in minutes that can be used just like a physical desktop or server machine. |\n| ![Azure Key Vault Icon](./media/service-icons/key-vaults.svg) | **Azure Key Vault**   | [Azure Key Vault](/azure/key-vault/general/) helps you store and access secrets securely, in an encrypted vault with restricted access to make sure your secrets and your application aren't compromised.   |\n| ![Foundry Tools Icon](./media/service-icons/azure.svg) | **Foundry Tools**   | [Foundry Tools](/azure/ai-foundry/) are a collection of cloud-based services that allow you to add AI based capabilities to your application. Examples include computer vision, speech recognition, language understanding, and anomaly detection. |\n\nFor the full list of Azure products and services, see the [Azure documentation home page](/azure/?product=all).\n\n### Next steps\n\n> [!div class=\"nextstepaction\"]\n> [What is the Azure SDK for Go?](overview.md)\n"
  },
  {
    "path": "articles/go/management-libraries.md",
    "content": "---\ntitle: Overview of the Azure SDK for Go management and client libraries\ndescription: In this article, you learn the basic tasks of working with the Azure SDK for Go management and client libraries.\nms.date: 03/13/2026\nms.topic: overview\nms.custom: devx-track-go\nms.devlang: golang\nai-usage: ai-assisted\n---\n\n# Overview of the Azure SDK for Go libraries\n\nThe Azure SDK for Go includes both management libraries and data plane client libraries. This article provides an overview so you can understand what the libraries are, how they fit into Azure workflows, and where to go next for Go-specific patterns.\n\n## Management libraries\n\nUse the management libraries to provision, configure, and govern Azure resources. They focus on managing the resources themselves rather than the data stored inside them. Management libraries perform *control plane* operations, which manage Azure resources and service configuration. Typical tasks include:\n\n- Creating or updating resource groups, virtual networks, or virtual machines.\n- Configuring security settings, identities, access policies, and diagnostics.\n- Listing, tagging, and deleting Azure resources across a subscription.\n- Automating deployment, cleanup, compliance, and platform operations.\n\nManagement library packages have names like `armcompute`, `armnetwork`, and `armkeyvault`. Use management libraries during the setup, configuration, and governance phases of an application lifecycle. For detailed package documentation, search for the package on [pkg.go.dev](https://pkg.go.dev/).\n\n## Client libraries\n\nUse the client libraries when your Go application needs to work with data or runtime surfaces inside an already provisioned Azure service. Client libraries perform *data plane* operations, which work with the data stored in or flowing through a service. Typical tasks include:\n\n- Uploading and downloading blobs from a storage account.\n- Sending and receiving messages with Service Bus or Event Hubs.\n- Reading, writing, or deleting records in a database.\n- Retrieving secrets from Key Vault.\n- Executing queries or operations against provisioned resources.\n\nClient library packages have names like `azblob`, `azstorage`, `azsecrets`, `azservicebus`, and `azeventhubs`. Use client libraries after you already provisioned the underlying Azure service by using management libraries. For detailed package documentation, search for the package on [pkg.go.dev](https://pkg.go.dev/).\n\n## Using both management and client libraries\n\nA single Go solution can use both management and client libraries across control and data planes. For example, you might use a management library during setup to create a storage account (control plane), and then use a client library in the application to upload and download blobs (data plane). Understanding the distinction helps you choose the right library for each task in your workflow.\n\nFor Go-specific patterns and examples for each plane, see these articles:\n\n- [Use the Azure SDK for Go for control plane operations](control-plane.md).\n- [Use the Azure SDK for Go for data plane operations](data-plane.md).\n\n## Installing Go packages\n\nIn most projects, you install the Go packages for versioning and dependency management.\n\nTo install a Go package, run the `go get` command.\n\nFor example, to install the `armcompute` package, run the following command:\n\n```azurecli\ngo get github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute\n```\n\nIn most Go apps, install the following packages for authentication:\n\n- github.com/Azure/azure-sdk-for-go/sdk/azcore/to\n- github.com/Azure/azure-sdk-for-go/sdk/azidentity\n\n## Importing packages into your Go code\n\nAfter downloading the packages, import them into your app by using the `import` statement:\n\n```go\nimport (\n    \"github.com/Azure/azure-sdk-for-go/sdk/azcore/to\"\n    \"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n    \"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute\"\n)\n```\n\n## Authenticating to Azure\n\nGo apps that use Azure SDK libraries should authenticate by using Microsoft Entra ID with the [Azure Identity library](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity). Token-based authentication is more secure and manageable than connection strings or keys. The recommended credential depends on where the app runs: use managed identities for Azure-hosted apps, developer credentials or a service principal for local development, and a service principal for most on-premises scenarios.\n\nThe default authentication option is **DefaultAzureCredential**, which uses the environment variables set earlier in this article. In your Go code, create an `azidentity` object as follows:\n\n```go\ncred, err := azidentity.NewDefaultAzureCredential(nil)\nif err != nil {\n  // handle error\n}\n```\n\nFor more information about authentication, see [Azure SDK for Go authentication](./sdk/authentication/authentication-overview.md).\n\n## Creating a Resource Management client\n\nAfter you get a credential from Azure Identity, create a client to connect to the target Azure service.\n\nFor example, suppose you want to connect to the [Azure Compute](https://azure.microsoft.com/product-categories/compute/) service. The [Compute package](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute) consists of one or more clients. A client groups a set of related APIs, providing access to its functionality within the specified subscription. You create one or more clients to access the APIs you require.\n\nThe following code uses the [armcompute.NewVirtualMachinesClient type](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute#VirtualMachinesClient) to create a client to manage virtual machines:\n\n```go\nclient, err := armcompute.NewVirtualMachinesClient(\"<subscription ID>\", cred, nil)\nif err != nil {\n  // handle error\n}\n```\n\nFor more information about managing Azure resources with Go, see [Use the Azure SDK for Go for control plane operations](control-plane.md).\n\nUse the same pattern to connect with other Azure services. For example, install the [`armnetwork`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork) package and create a [virtual network](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork#VirtualNetworksClient) client to manage virtual network resources.\n\n```go\nclient, err := armnetwork.NewVirtualNetworksClient(\"<subscription ID>\", cred, nil)\nif err != nil {\n  // handle error\n}\n```\n\n**Code sample**:\n\n```go\npackage main\n\nimport (\n    \"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n    \"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute\"\n)\n\nfunc main() {\n    cred, err := azidentity.NewDefaultAzureCredential(nil)\n    if err != nil {\n        // handle error\n    }\n    client, err := armcompute.NewVirtualMachinesClient(\"<subscription ID>\", cred, nil)\n    if err != nil {\n        // handle error\n    }\n}\n```\n\nFor more information about using the Azure SDK for Go for Azure services, see [Use the Azure SDK for Go for data plane operations](data-plane.md).\n\n## Using the Azure SDK for Go repository\n\nAfter you instantiate a client, use it to make API calls to your Azure resources. For resource management scenarios, most use cases are CRUD (create, read, update, delete) operations.\n\nTo find operations for a specific type, browse the source in the [Azure SDK for Go GitHub repository](https://github.com/Azure/azure-sdk-for-go). The SDK source is organized under the [`sdk/`](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk) directory, with management libraries under [`sdk/resourcemanager/`](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/resourcemanager) and client libraries in service-specific folders such as `sdk/storage/` and `sdk/security/keyvault/`.\n\nTo locate the source for a specific type, follow these steps:\n\n1. Go to the [Azure SDK for Go repository](https://github.com/Azure/azure-sdk-for-go) on GitHub.\n1. Navigate to `sdk/resourcemanager/` for management libraries, or `sdk/` for client libraries.\n1. Open the service folder and then the package folder. For example, `sdk/resourcemanager/compute/armcompute/`.\n1. Find the source file that contains the type you need. Client types and their methods are typically in files named after the client, such as `virtualmachines_client.go`.\n1. Read the type's comments and method signatures for usage information.\n\nYou can also build the URL directly. For example, to find the resource group operations source, navigate to `https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/resourcemanager/resources/armresources`.\n\nThis example shows how to find the source for Azure resource group operations:\n\n1. Go to the [Azure SDK for Go repository](https://github.com/Azure/azure-sdk-for-go) on GitHub.\n1. Navigate to [`sdk/resourcemanager/resources/armresources/`](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/resourcemanager/resources/armresources).\n1. Open `resource_groups_client.go` to find the [`ResourceGroupsClient`](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/resourcemanager/resources/armresources/resourcegroups_client.go) type and its `CreateOrUpdate` method.\n1. Read the method's comments and parameters to understand how to make the API call.\n\nFor generated reference documentation, search for the package on [pkg.go.dev](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go).\n\n## Long-running operations\n\nSome operations take a long time to finish. To handle these operations, the management libraries provide functions that support long-running operations (LRO) through asynchronous calls. These function names start with `Begin`, such as `BeginCreate` and `BeginDelete`.\n\nBecause these functions are asynchronous, your code doesn't block while the function finishes its task. Instead, the function returns a *poller* object immediately. Your code then calls a synchronous poller function that returns when the original asynchronous function completes.\n\nThe following code snippet shows an example of this pattern.\n\n```go\nctx := context.Background()\n// Call an asynchronous function to create a client. The return value is a poller object.\npoller, err := client.BeginCreate(ctx, \"resource_identifier\", \"additional_parameter\")\n\nif err != nil {\n    // handle error...\n}\n\n// Call the poller object's PollUntilDone function that will block until the poller object\n// has been updated to indicate the task has completed.\nresp, err = poller.PollUntilDone(ctx, nil)\nif err != nil {\n    // handle error...\n}\n\n// Print the fact that the LRO completed.\nfmt.Printf(\"LRO done\")\n\n// Work with the response (\"resp\") object.\n```\n\n**Key points:**\n\n- The `PollUntilDone` function requires a polling interval that specifies how often it should try to get the status. The [interval defaults to 30 seconds](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azcore/runtime/poller.go) if you pass `nil` for the options parameter, but you can adjust it based on your needs.\n- The interval is typically short. See the documentation for the specific Azure resource for recommended intervals.\n- The [LRO section of the Go Azure SDK Design Guidelines page](https://azure.github.io/azure-sdk/golang_introduction.html#methods-invoking-long-running-operations) has a more advanced example and general guidelines for LRO.\n\nFor more details on patterns, see the [Common usage patterns in Azure SDK for Go](azure-sdk-core-concepts.md).\n\n## Next steps\n\nFor more information about authentication, client construction, long-running operation, and service walkthrough patterns, see the plane-specific articles:\n\n- [Use the Azure SDK for Go for control plane operations](control-plane.md) for management-oriented Go workflows.\n- [Use the Azure SDK for Go for data plane operations](data-plane.md) for runtime data access patterns that often follow provisioning.\n\nFor examples, see [Azure SDK for Go samples on GitHub](https://github.com/Azure-Samples/azure-sdk-for-go-samples)."
  },
  {
    "path": "articles/go/migration-guides.md",
    "content": "---\ntitle: Migration guides for the Azure SDK for Go\ndescription: List of migration guides between different versions of the Azure SDK for Go\nms.date: 6/2/2025\nms.topic: upgrade-and-migration-article\nms.custom: devx-track-go\n---\n\n# Migration guides for the Azure SDK for Go\n\nThe following table links to migration guides for the Azure SDK for Go.\n\n| Migration guide | To | From |\n|------|-------------|-------------|\n|[Azure Resource Management libraries](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/development/ARM/MIGRATION_GUIDE.md)|sdk/resourcemanager/\\*\\*/arm\\*\\*|services/\\*\\*/mgmt/\\*\\*|\n|[Azure Service Bus](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/messaging/azservicebus/migrationguide.md)| azservicebus | azure-service-bus-go |\n\n<!-- Include links to packages in the To \\\\ From columns? -->\n"
  },
  {
    "path": "articles/go/overview.md",
    "content": "---\ntitle: What is the Azure SDK for Go?\ndescription: Learn how the Azure SDK for Go can help you create, manage, and use Azure resources.\nms.date: 06/2/2025\nms.topic: overview\nms.custom: devx-track-go\n---\n\n# What is the Azure SDK for Go?\n\nThe open-source Azure SDK for Go simplifies provisioning, managing, and using Azure resources from Go application code.\n\n## Introducing the management and client libraries\n\nThe Azure SDK for Go provides several libraries (grouped into *management* and *client*) that allow your Go code to communicate with Azure services. Both the management and client libraries are designed to work with both local and cloud environments.\n\nDue to the adoption of generics, the Azure SDK for Go is compatible with Go 1.18 and later. The Azure SDK for Go now supports only the two most recent major releases. For a list of all Go releases and to see how to update to a specific version, see [Go Release History](https://go.dev/doc/devel/release.html).\n\nYou'll sometimes see the management libraries referred to as the \"*management plane*\" and the client libraries referred to as the \"*data plane*.\" The key difference between the management plane and the data plane can best be explained as follows:\n\n- The management plane is used to manage resources in your Azure subscription.\n- The data plane is used to interact with Azure resources in your subscription.\n\n> [!TIP]\n> Example: You want to create an Azure Storage Account in your subscription. You use the management plane to create the storage account, and the data plane to interact with the account by reading and writing data to it.\n\nThe management and client libraries are built on top of the Azure REST API. This layering allows you to access the functionality of the underlying Azure REST API using familiar Go paradigms. You can also use the Azure REST API directly by making HTTP requests from your Go code.\n\nSource code for the management and client libraries is available via the [Azure SDK for GO GitHub repository](https://github.com/Azure/azure-sdk-for-go). As an open-source project, contributions from the public are welcome!\n\nCurrent versions of the management and client libraries share the common cloud patterns implemented in the [Azure core library](https://github.com/Azure/azure-sdk-for-go/tree/main/sdk/azcore). These patterns include authentication protocols, logging, tracing, transport protocols, buffered responses, and retries.\n\nThe Azure SDK for Go is composed of many individual Go libraries that relate to specific Azure services. For the list of client and management libraries, see the [Go section of the Azure SDK Releases page](https://azure.github.io/azure-sdk/#go).\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure SDK for Go Core Concepts](azure-sdk-core-concepts.md)\n\n> [!div class=\"nextstepaction\"]\n> [Azure SDK for Go management libraries](management-libraries.md)\n"
  },
  {
    "path": "articles/go/sdk/authentication/authentication-additional-methods.md",
    "content": "---\ntitle: Additional methods to authenticate to Azure resources from Go apps\ndescription: This article describes additional, less common methods you can use to authenticate your Go app to Azure resources. \nms.date: 03/31/2026\nms.topic: how-to\nms.custom: devx-track-go, passwordless-go\n---\n\n# Additional methods to authenticate to Azure resources from Go apps\n\nThis article lists additional methods that apps can use to authenticate to Azure resources. These methods are less commonly used. When possible, use one of the methods outlined in [authenticating Go apps to Azure using the Azure SDK overview](./authentication-overview.md).\n\n## Interactive browser authentication\n\nThis method authenticates an application through [`InteractiveBrowserCredential`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#InteractiveBrowserCredential) by collecting user credentials in the default system.\n\nInteractive browser authentication enables the application for all operations allowed by the interactive login credentials. As a result, if you're the owner or administrator of your subscription, your code has inherent access to most resources in that subscription without having to assign any specific permissions. For this reason, use interactive browser authentication only for experimentation.\n\n### Enable applications for interactive browser authentication\n\nPerform the following steps to enable the application to authenticate through the interactive browser flow. These steps also work for [device code authentication](#device-code-authentication) described later. You need to follow this process only if you're using `InteractiveBrowserCredential` in your code.\n\n1. On the [Azure portal](https://portal.azure.com), go to Microsoft Entra ID and select **App registrations** in the left-hand menu.\n1. Select the registration for your app, and then select **Authentication**.\n1. Under **Advanced settings**, select **Yes** for **Allow public client flows**.\n1. Select **Save** to apply the changes.\n1. To authorize the application for specific resources, go to the resource in question, select **API Permissions**, and enable **Microsoft Graph** and other resources you want to access. Microsoft Graph is usually enabled by default.\n\n    > [!IMPORTANT]\n    > You must also be the admin of your tenant to grant consent to your application when you sign in for the first time.\n\nIf you can't configure the device code flow option on your Microsoft Entra ID, your application might need to be multitenant. To make this change, go to the **Authentication** panel, select **Accounts in any organizational directory** (under **Supported account types**), and then select **Yes** for **Allow public client flows**.\n\n### Example using InteractiveBrowserCredential\n\nThe following example demonstrates using an [`InteractiveBrowserCredential`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#InteractiveBrowserCredential) to authenticate with the [`SubscriptionsClient`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription#SubscriptionsClient) in the [`armsubscription`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription) package:\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"log\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription\"\n)\n\nfunc main() {\n\tcred, err := azidentity.NewInteractiveBrowserCredential(nil)\n\tif err != nil {\n\t\t// TODO: handle error\n\t}\n\tctx := context.Background()\n\tclientFactory, err := armsubscription.NewClientFactory(cred, nil)\n\tif err != nil {\n\t\t// TODO: handle error\n\t}\n\tres, err := clientFactory.NewSubscriptionsClient().Get(ctx, \"<your_subscription_id>\", nil)\n\tif err != nil {\n\t\t// TODO: handle error\n\t}\n\t// You could use response here. We use blank identifier for just demo purposes.\n\t_ = res\n}\n```\n\nFor more exact control, such as setting redirect URIs, you can supply specific arguments such as `RedirectURL` to `InteractiveBrowserCredential` via the [`InteractiveBrowserCredentialOptions`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#InteractiveBrowserCredentialOptions) type.\n\n## Device code authentication\n\nThis method interactively authenticates a user on devices with limited UI (typically devices without a keyboard):\n\n1. When the application attempts to authenticate, the credential prompts the user with a URL and an authentication code.\n1. The user visits the URL on a separate browser-enabled device (a computer, smartphone, and so on) and enters the code.\n1. The user follows a normal authentication process in the browser.\n1. Upon successful authentication, the application is authenticated on the device.\n\nFor more information, see [Microsoft identity platform and the OAuth 2.0 device authorization grant flow](/entra/identity-platform/v2-oauth2-device-code).\n\nDevice code authentication in a development environment enables the application for all operations allowed by the interactive sign-in credentials. As a result, if you're the owner or administrator of your subscription, your code has inherent access to most resources in that subscription without having to assign any specific permissions. However, you can use this method with a specific client ID, rather than the default, for which you can assign specific permissions.\n\nUse the [`DeviceCodeCredential`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#DeviceCodeCredential) type from the [`azidentity`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) package to implement device code authentication.\n"
  },
  {
    "path": "articles/go/sdk/authentication/authentication-on-premises-apps.md",
    "content": "---\ntitle: Authenticate to Azure resources from Go apps hosted on-premises\ndescription: This article describes how to authenticate your application to Azure services when using the Azure SDK for Go in on-premises hosted applications. \nms.date: 10/07/2025\nms.topic: how-to\nms.custom:\n  - devx-track-go\n  - sfi-image-nochange\n---\n\n# Authenticate to Azure resources from Go apps hosted on-premises\n\nApps hosted outside of Azure, like on-premises or at a data center, should use an application service principal to authenticate to Azure when accessing Azure resources. Application service principal objects are created using the app registration process in Azure. When you create an application service principal, a client ID and client secret are generated for your app. Store the client ID, client secret, and your tenant ID in environment variables so the Azure SDK for Go can use them to authenticate your app to Azure at runtime.\n\nCreate a different app registration for each environment where the app is hosted. This setup lets you configure environment-specific resource permissions for each service principal and ensures that an app deployed to one environment doesn't access Azure resources in another environment.\n\n## 1 - Register the application in Azure\n\nYou can register an app with Azure using either the Azure portal or the Azure CLI.\n\n### [Azure CLI](#tab/azure-cli)\n\n```azurecli\naz ad sp create-for-rbac --name <app-name>\n```\n\nThe command output is similar to the following. Note these values or keep this window open because you need them in the next steps and can't view the password (client secret) value again.\n\n```json\n{\n  \"appId\": \"00001111-aaaa-2222-bbbb-3333cccc4444\",\n  \"displayName\": \"msdocs-python-sdk-auth-prod\",\n  \"password\": \"Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6\",\n  \"tenant\": \"aaaabbbb-0000-cccc-1111-dddd2222eeee\"\n}\n```\n\n### [Azure portal](#tab/azure-portal)\n\nSign in to the [Azure portal](https://portal.azure.com/) and complete these steps.\n\n| Instructions    | Screenshot |\n|:----------------|-----------:|\n| [!INCLUDE [Create app registration step 1](<../../../includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-1.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-1-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-1.png\" alt-text=\"A screenshot showing how to use the top search bar in the Azure portal to find and navigate to the App registrations page.\" ::: |\n| [!INCLUDE [Create app registration step 2](<../../../includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-2.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-2-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-2.png\" alt-text=\"A screenshot showing the location of the New registration button in the App registrations page.\" ::: |\n| [!INCLUDE [Create app registration step 3](<../../../includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-3.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-3-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-3.png\" alt-text=\"A screenshot to fill out Register by giving the app a name and specifying supported account types as accounts in this organizational directory only.\" ::: |\n| [!INCLUDE [Create app registration step 4](<../../../includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-4.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-4-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-4.png\" alt-text=\"A screenshot of the App registration after completion. This screenshot shows the application and tenant IDs, which will be needed in a future step. \" ::: |\n| [!INCLUDE [Create app registration step 5](<../../../includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-5.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-5-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-5.png\" alt-text=\"A screenshot showing the location of the link to use to create a new client secret on the certificates and secrets page.\" ::: |\n| [!INCLUDE [Create app registration step 6](<../../../includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-6.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-6-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-6.png\" alt-text=\"A screenshot showing the page where a new client secret is added for the application service principal created by the app registration process.\" ::: |\n| [!INCLUDE [Create app registration step 7](<../../../includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-7.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-7-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/on-premises-app-registration-azure-portal-7.png\" alt-text=\"A screenshot showing the page with the generated client secret.\" ::: |\n\n---\n\n## 2 - Assign roles to the application service principal\n\nNext, you need to determine what roles (permissions) your app needs on what resources and assign those roles to your app. Roles can be assigned a role at a resource, resource group, or subscription scope. This example shows how to assign roles for the service principal at the resource group scope because most applications group all their Azure resources into a single resource group.\n\n### [Azure CLI](#tab/azure-cli)\n\nAssign a role to a service principal in Azure using the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command.\n\n```azurecli\naz role assignment create --assignee {appId} \\\n    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \\\n    --role \"{roleName}\" \n```\n\nTo get the role names that a service principal can be assigned to, use the [az role definition list](/cli/azure/role/definition#az-role-definition-list) command.\n\n```azurecli\naz role definition list \\\n    --query \"sort_by([].{roleName:roleName, description:description}, &roleName)\" \\\n    --output table\n```\n\nFor example, to allow the service principal with the appId of `00001111-aaaa-2222-bbbb-3333cccc4444` read, write, and delete access to Azure Storage blob containers and data in all storage accounts in the *msdocs-go-sdk-auth-example* resource group in the subscription with ID `aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e`, you would assign the application service principal to the *Storage Blob Data Contributor* role using the following command.\n\n```azurecli\naz role assignment create --assignee 00001111-aaaa-2222-bbbb-3333cccc4444 \\\n    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-go-sdk-auth-example \\\n    --role \"Storage Blob Data Contributor\"\n```\n\nFor information on assigning permissions at the resource or subscription level using the Azure CLI, see the article [Assign Azure roles using the Azure CLI](/azure/role-based-access-control/role-assignments-cli).\n\n### [Azure portal](#tab/azure-portal)\n\n| Instructions    | Screenshot |\n|:----------------|-----------:|\n| [!INCLUDE [Assign service principal to role step 1](<../../../includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-1.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-1-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-1.png\" alt-text=\"A screenshot showing the top search box in the Azure portal to locate and navigate to the resource group you want to assign roles (permissions) to.\" ::: |\n| [!INCLUDE [Assign service principal to role step 2](<../../../includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-2.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-2-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-2.png\" alt-text=\"A screenshot of the resource group page showing the location of the Access control (IAM) menu item.\" ::: |\n| [!INCLUDE [Assign service principal to role step 3](<../../../includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-3.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-3-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-3.png\" alt-text=\"A screenshot showing how to navigate to the role assignments tab and the location of the button used to add role assignments to a resource group.\" ::: |\n| [!INCLUDE [Assign service principal to role step 4](<../../../includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-4.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-4-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-4.png\" alt-text=\"A screenshot showing how to filter and select role assignments to be added to the resource group.\" ::: |\n| [!INCLUDE [Assign service principal to role step 5](<../../../includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-5.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-5-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-5.png\" alt-text=\"A screenshot showing the radio button to select to assign a role to a Microsoft Entra group and the link used to select the group to assign the role to.\" ::: |\n| [!INCLUDE [Assign service principal to role step 6](<../../../includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-6.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-6-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-6.png\" alt-text=\"A screenshot showing how to filter for and select the Microsoft Entra group for the application in the Select members dialog box.\" ::: |\n| [!INCLUDE [Assign service principal to role step 7](<../../../includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-7.md>)] | :::image type=\"content\" source=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-7-240px.png\" lightbox=\"../../../includes/media/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-7.png\" alt-text=\"A screenshot showing the completed Add role assignment page and the location of the Review + assign button used to complete the process.\" ::: |\n\n---\n\n## 3 - Configure environment variables for application\n\nSet the `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_CLIENT_SECRET` environment variables for the process running your Go app to make the application service principal credentials available at runtime. The [`DefaultAzureCredential`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#DefaultAzureCredential) object retrieves the service principal information from these environment variables.\n\n|Variable name|Value\n|-|-\n|`AZURE_CLIENT_ID`|Application ID of an Azure service principal\n|`AZURE_TENANT_ID`|Tenant ID of the application's Microsoft Entra tenant\n|`AZURE_CLIENT_SECRET`|Password of the Azure service principal\n\n# [Bash](#tab/bash)\n\n```bash\nexport AZURE_TENANT_ID=\"<active_directory_tenant_id>\"\nexport AZURE_CLIENT_ID=\"<service_principal_appid>\"\nexport AZURE_CLIENT_SECRET=\"<service_principal_password>\"\n```\n\n# [PowerShell](#tab/powershell)\n\n```powershell\n$env:AZURE_TENANT_ID=\"<active_directory_tenant_id>\"\n$env:AZURE_CLIENT_ID=\"<service_principal_appid>\"\n$env:AZURE_CLIENT_SECRET=\"<service_principal_password>\"\n```\n\n---\n\n## 4 - Implement DefaultAzureCredential in your application\n\nTo authenticate Azure SDK client objects to Azure, your application should use the [`DefaultAzureCredential`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#DefaultAzureCredential) type from the [`azidentity`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) package.\n\nStart by adding the [`azidentity`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) package to your application.\n\n```terminal\ngo get github.com/Azure/azure-sdk-for-go/sdk/azidentity\n```\n\nNext, for any Go code that instantiates an Azure SDK client in your app, follow these steps:\n\n1. Import the `azidentity` package.\n1. Create an instance of `DefaultAzureCredential` type.\n1. Pass the instance of `DefaultAzureCredential` type to the Azure SDK client constructor.\n\nThe following code segment shows an example.\n\n```go\nimport (\n\t\"context\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n)\n\nconst (\n\taccount       = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\"\n\tcontainerName = \"sample-container\"\n\tblobName      = \"sample-blob\"\n\tsampleFile    = \"path/to/sample/file\"\n)\n\nfunc main() {\n    // create a credential\n    cred, err := azidentity.NewDefaultAzureCredential(nil)\n    if err != nil {\n      // TODO: handle error\n    }\n    \n    // create a client for the specified storage account\n    client, err := azblob.NewClient(account, cred, nil)\n    if err != nil {\n      // TODO: handle error\n    }\n    \n    // TODO: perform some action with the azblob Client\n    // _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)\n}\n```\n\nWhen the code instantiates `DefaultAzureCredential`, it reads the environment variables `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, and `AZURE_CLIENT_SECRET` to retrieve the application service principal information needed to connect to Azure.\n"
  },
  {
    "path": "articles/go/sdk/authentication/authentication-overview.md",
    "content": "---\ntitle: Authenticate Go apps to Azure using the Azure Identity library\ndescription: This article provides an overview of how to authenticate applications to Azure services when you use the Azure SDK for Go in both server environments and in local development.\nms.date: 12/04/2025\nms.topic: overview\nms.custom: devx-track-go\n---\n\n# Authenticate Go apps to Azure services by using the Azure Identity library\n\nApps can use the Azure Identity library to authenticate to Microsoft Entra ID, which grants access to Azure services and resources. This authentication requirement applies whether the app is deployed to Azure, hosted on-premises, or running locally on a developer workstation. The following sections describe the recommended approaches to authenticate an app to Microsoft Entra ID across different environments when using the Azure SDK client libraries.\n\n## Recommended approach for app authentication\n\nToken-based authentication through Microsoft Entra ID is the recommended approach for authenticating apps to Azure, instead of using connection strings or key-based options. The [Azure Identity client module for Go](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) provides token-based authentication and enables apps to authenticate to Azure resources whether the app runs locally, on Azure, or on an on-premises server.\n\n### Advantages of token-based authentication\n\nToken-based authentication offers the following advantages over connection strings:\n\n- Token-based authentication ensures only the specific apps intended to access the Azure resource can do so, whereas anyone or any app with a connection string can connect to an Azure resource.\n- Token-based authentication allows you to further limit Azure resource access to only the specific permissions needed by the app. This approach follows the [principle of least privilege](https://wikipedia.org/wiki/Principle_of_least_privilege). In contrast, a connection string grants full rights to the Azure resource.\n- When using a [managed identity](/entra/identity/managed-identities-azure-resources/overview) for token-based authentication, Azure handles administrative functions for you, so you don't have to worry about tasks like securing or rotating secrets. This feature makes the app more secure because there's no connection string or application secret that can be compromised.\n- Connection strings are functionally equivalent to credentials and require special handling to prevent accidental leakage. You must store them securely (for example, in Azure Key Vault) and never hardcode them in your application or commit them to source control. The [Microsoft Secure Future Initiative (SFI)](https://www.microsoft.com/microsoft-cloud/resources/secure-future-initiative) prohibits the use of connection strings and similar long-lived secrets because they can be used to compromise your application if not carefully managed.\n- The Azure Identity library acquires and manages Microsoft Entra tokens for you.\n\nLimit the use of connection strings to scenarios where token-based authentication isn't an option, initial proof-of-concept apps, or development prototypes that don't access production or sensitive data. When possible, use the credential types in the Azure Identity library to authenticate to Azure resources.\n\n## Authentication across different environments\n\nThe type of token-based authentication an app uses to authenticate to Azure resources depends on where the app runs. The following diagram provides guidance for different scenarios and environments:\n\n:::image type=\"content\" source=\"../media/authentication-environments.svg\" alt-text=\"A diagram that shows the recommended token-based authentication strategies for an app depending on where it's running.\" :::\n\nWhen an app is:\n\n- **Hosted on Azure**: The app should authenticate to Azure resources by using a managed identity. For more information, see [authentication in server environments](#authentication-for-azure-hosted-apps).\n- **Running locally during development**: The app can authenticate to Azure by using either an application service principal for local development or the developer's Azure credentials. For more information, see [authentication during local development](#authentication-during-local-development).\n- **Hosted on-premises**: The app should authenticate to Azure resources by using an application service principal or, in the case of Azure Arc, a managed identity. For more information, see [authentication in server environments](#authentication-for-apps-hosted-on-premises).\n\n## Authentication for Azure-hosted apps\n\nWhen you host your app on Azure, it can use managed identities to authenticate to Azure resources without needing to manage any credentials. There are two types of managed identities: user-assigned and system-assigned.\n\n#### Use a user-assigned managed identity\n\nYou create a user-assigned managed identity as a standalone Azure resource. You can assign it to one or more Azure resources, allowing those resources to share the same identity and permissions. To authenticate by using a user-assigned managed identity, create the identity, assign it to your Azure resource, and then configure your app to use this identity for authentication by specifying its client ID, resource ID, or object ID.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate using a user-assigned managed identity](user-assigned-managed-identity.md)\n\n#### Use a system-assigned managed identity\n\nYou enable a system-assigned managed identity directly on an Azure resource. The identity is tied to the lifecycle of that resource and is automatically deleted when the resource is deleted. To authenticate by using a system-assigned managed identity, enable the identity on your Azure resource and then configure your app to use this identity for authentication.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate using a system-assigned managed identity](system-assigned-managed-identity.md)\n\n## Authentication during local development\n\nDuring local development, you can authenticate to Azure resources by using your developer credentials or a service principal. This authentication method lets you test your app's authentication logic without deploying it to Azure.\n\n#### Use developer credentials\n\nYou can use your own Azure credentials to authenticate to Azure resources during local development. Typically, you use a development tool, such as Azure CLI, which can provide your app with the necessary tokens to access Azure services. This method is convenient but should only be used for development purposes.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally using developer credentials](local-development-dev-accounts.md)\n\n#### Use a service principal\n\nYou create a service principal in a Microsoft Entra tenant to represent an app and use it to authenticate to Azure resources. You can configure your app to use service principal credentials during local development. This method is more secure than using developer credentials and is closer to how your app authenticates in production. However, it's still less ideal than using a managed identity because of the need for secrets.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally using a service principal](local-development-service-principal.md)\n\n## Authentication for apps hosted on-premises\n\nFor apps hosted on-premises, you can use a service principal to authenticate to Azure resources. This method involves creating a service principal in Microsoft Entra ID, assigning it the necessary permissions, and configuring your app to use its credentials. With this method, your on-premises app can securely access Azure services.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate your on-prem app using a service principal](local-development-service-principal.md)\n\n## Related content\n\n- [Azure Identity client library for Go README on GitHub](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azidentity/README.md)\n- [Azure Identity client library reference on pkg.go.dev](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity)\n"
  },
  {
    "path": "articles/go/sdk/authentication/credential-chains.md",
    "content": "---\ntitle: Credential chains in the Azure Identity library for Go\ndescription: This article describes the DefaultAzureCredential and ChainedTokenCredential classes in the Azure Identity library for Go.\nms.date: 12/03/2025\nms.topic: concept-article\nms.custom: devx-track-go\n\n#customer intent: As a developer using the Azure SDK for Go, I want to use credential chains to combine different authentication methods, so my app can authenticate seamlessly across different environments, from local development to production deployments in Azure.\n---\n\n# Credential chains in the Azure Identity library for Go\n\nThe Azure Identity library provides *credentials*&mdash;public types that implement the Azure Core library's [TokenCredential](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore#TokenCredential) interface. A credential represents a distinct authentication flow for acquiring an access token from Microsoft Entra ID. These credentials can be chained together to form an ordered sequence of authentication mechanisms to be attempted.\n\n## How a chained credential works\n\nAt runtime, a credential chain attempts to authenticate using the sequence's first credential. If that credential fails to acquire an access token, the next credential in the sequence is attempted, and so on, until an access token is successfully obtained. The following sequence diagram illustrates this behavior:\n\n:::image type=\"content\" source=\"../media/mermaidjs/chain-sequence.svg\" alt-text=\"Diagram that shows credential chain sequence.\":::\n\n## Why use credential chains\n\nA chained credential can offer the following benefits:\n\n- **Environment awareness**: Automatically selects the most appropriate credential based on the environment in which the app is running. Without it, you'd have to write code like this:\n\n    ```go\n    // Set up credential based on environment (Azure or local development)\n    if os.Getenv(\"WEBSITE_HOSTNAME\") != \"\" {\n        clientID := azidentity.ClientID(\"abcd1234-...\")\n        opts := azidentity.ManagedIdentityCredentialOptions{ID: clientID}\n        credential, err = azidentity.NewManagedIdentityCredential(&opts)\n        \n        if err != nil {\n          // TODO: handle error\n        }\n    } else {\n        // Use Azure CLI Credential\n        credential, err = azidentity.NewAzureCLICredential(nil)\n\n        if err != nil {\n          // TODO: handle error\n        }\n    }\n    ```\n\n- **Seamless transitions**: Your app can move from local development to your staging or production environment without changing authentication code.\n- **Improved resiliency**: Includes a fallback mechanism that moves to the next credential when the prior fails to acquire an access token.\n\n## How to choose a chained credential\n\nWith Go, there are two choices for credential chaining:\n\n- **Use a preconfigured chain**: Use the preconfigured chain implemented by the `DefaultAzureCredential` type. For this approach, see the [DefaultAzureCredential overview](#defaultazurecredential-overview) section.\n- **Build a custom credential chain**: Start with an empty chain and include only what you need. For this approach, see the [ChainedTokenCredential overview](#chainedtokencredential-overview) section.\n\n## DefaultAzureCredential overview\n\n[DefaultAzureCredential](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#DefaultAzureCredential) is an opinionated, preconfigured chain of credentials. It's designed to support many environments, along with the most common authentication flows and developer tools. In graphical form, the underlying chain looks like this:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-auth-flow-inline.svg\" alt-text=\"Diagram that shows DefaultAzureCredential authentication flow.\" lightbox=\"../media/mermaidjs/default-azure-credential-auth-flow-expanded.png\":::\n\nThe order in which `DefaultAzureCredential` attempts credentials follows.\n\n| Order | Credential                      | Description                                                                                                                                                                                                                                                                                                                                    |\n|-------|---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| 1     | [Environment][env-cred]         | Reads a collection of [environment variables][env-vars] to determine if an application service principal (application user) is configured for the app. If so, `DefaultAzureCredential` uses these values to authenticate the app to Azure. This method is most often used in server environments but can also be used when developing locally. |\n| 2     | [Workload Identity][wi-cred]    | If the app is deployed to an Azure host with Workload Identity enabled, authenticate that account.                                                                                                                                                                                                                                             |\n| 3     | [Managed Identity][mi-cred]     | If the app is deployed to an Azure host with Managed Identity enabled, authenticate the app to Azure using that Managed Identity.                                                                                                                                                                                                              |\n| 4     | [Azure CLI][az-cred]            | If the developer authenticated to Azure using Azure CLI's `az login` command, authenticate the app to Azure using that same account.                                                                                                                                                                                                           |\n| 5     | [Azure Developer CLI][azd-cred] | If the developer authenticated to Azure using Azure Developer CLI's `azd auth login` command, authenticate with that account.                                                                                                                                                                                                                  |\n| 6     | [Azure PowerShell][pwsh-cred] | If the developer authenticated to Azure using Azure PowerShell's `Connect-AzAccount` cmdlet, authenticate with that account.                                                                                                                                                                                                                  |\n\n[env-cred]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#EnvironmentCredential\n[wi-cred]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#WorkloadIdentityCredential\n[mi-cred]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#ManagedIdentityCredential\n[az-cred]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#AzureCLICredential\n[azd-cred]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#AzureDeveloperCLICredential\n[pwsh-cred]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#AzurePowerShellCredential\n\nIn its simplest form, you can use the parameterless version of `DefaultAzureCredential` as follows:\n\n```go\nimport (\n    \"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n    \"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n)\n\n// create a credential\ncredential, err := azidentity.NewDefaultAzureCredential(nil)\nif err != nil {\n    // TODO: handle error\n}\n\n// create a Blob service client \naccountURL := \"https://<my_account_name>.blob.core.windows.net\"\nclient, err := azblob.NewClient(accountURL, credential, nil)\nif err != nil {\n    // TODO: handle error\n}\n```\n\n### How to customize DefaultAzureCredential\n\nThe following sections describe strategies for controlling which credentials are included in the chain.\n\n#### Exclude a credential type category\n\nTo exclude all `Developer tool` or `Deployed service` credentials, set environment variable `AZURE_TOKEN_CREDENTIALS` to `prod` or `dev`, respectively. When a value of `prod` is used, the underlying credential chain looks as follows:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-environment-variable-production.svg\" alt-text=\"Diagram that shows DefaultAzureCredential with AZURE_TOKEN_CREDENTIALS set to 'prod'.\":::\n\nWhen a value of `dev` is used, the chain looks as follows:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-environment-variable-development.svg\" alt-text=\"Diagram that shows DefaultAzureCredential with AZURE_TOKEN_CREDENTIALS set to 'dev'.\":::\n\n> [!IMPORTANT]\n> The `AZURE_TOKEN_CREDENTIALS` environment variable is supported in `azidentity` module versions 1.10.0 and later.\n\nTo ensure the environment variable is defined, set option `RequireAzureTokenCredentials` to `true`:\n\n```go\nopts := azidentity.DefaultAzureCredentialOptions{RequireAzureTokenCredentials: true}\ncredential, err := azidentity.NewDefaultAzureCredential(&opts)\nif err != nil {\n    // TODO: handle error\n}\n```\n\n#### Use a specific credential\n\nTo exclude all credentials except for one, set environment variable `AZURE_TOKEN_CREDENTIALS` to the credential name. For example, you can reduce the `DefaultAzureCredential` chain to `AzureCLICredential` by setting `AZURE_TOKEN_CREDENTIALS` to `AzureCLICredential`. The string comparison is performed in a case-insensitive manner. Valid string values for the environment variable include:\n\n- `AzureCLICredential`\n- `AzureDeveloperCLICredential`\n- `AzurePowerShellCredential`\n- `EnvironmentCredential`\n- `ManagedIdentityCredential`\n- `WorkloadIdentityCredential`\n\n> [!IMPORTANT]\n> The `AZURE_TOKEN_CREDENTIALS` environment variable supports individual credential names in `azidentity` module versions 1.11.0 and later.\n\nTo ensure the environment variable is defined, set option `RequireAzureTokenCredentials` to `true`:\n\n```go\nopts := azidentity.DefaultAzureCredentialOptions{RequireAzureTokenCredentials: true}\ncredential, err := azidentity.NewDefaultAzureCredential(&opts)\nif err != nil {\n    // TODO: handle error\n}\n```\n\n## ChainedTokenCredential overview\n\n[ChainedTokenCredential](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#ChainedTokenCredential) is an empty chain to which you add credentials to suit your app's needs. For example:\n\n```go\nazCLI, err := azidentity.NewAzureCLICredential(nil)\nif err != nil {\n  // handle error\n}\n\nazdCLI, err := azidentity.NewAzureDeveloperCLICredential(nil)\nif err != nil {\n  // handle error\n}\n\nchain, err := azidentity.NewChainedTokenCredential([]azcore.TokenCredential{azCLI, azdCLI}, nil)\nif err != nil {\n  // handle error\n}\n```\n\nThe preceding code sample creates a tailored credential chain comprised of two credentials. `AzureCLICredential` is attempted first, followed by `AzureDeveloperCLICredential`, if necessary. In graphical form, the chain looks like this:\n\n:::image type=\"content\" source=\"../media/mermaidjs/chained-token-credential-auth-flow.svg\" alt-text=\"Diagram that shows authentication flow for a ChainedTokenCredential instance that is composed of Azure CLI and Azure Developer CLI credentials.\":::\n\n> [!TIP]\n> For improved performance, optimize credential ordering in `ChainedTokenCredential` from most to least used credential.\n\n## Usage guidance for DefaultAzureCredential\n\n`DefaultAzureCredential` is undoubtedly the easiest way to get started with the Azure Identity library, but with that convenience comes tradeoffs. Once you deploy your app to Azure, you should understand the app's authentication requirements. For that reason, replace `DefaultAzureCredential` with a specific `TokenCredential` implementation, such as `ManagedIdentityCredential`.\n\nHere's why:\n\n- **Debugging challenges**: When authentication fails, it can be challenging to debug and identify the offending credential. You must enable logging to see the progression from one credential to the next and the success/failure status of each. For more information, see [Debug a chained credential](#debug-a-chained-credential).\n- **Performance overhead**: The process of sequentially trying multiple credentials can introduce performance overhead. For example, when running on a local development machine, managed identity is unavailable. Consequently, `ManagedIdentityCredential` always fails in the local development environment, unless explicitly disabled via its corresponding `exclude`-prefixed property.\n- **Unpredictable behavior**: `DefaultAzureCredential` checks for the presence of certain [environment variables][env-vars]. It's possible that someone could add or modify these environment variables at the system level on the host machine. Those changes apply globally and therefore alter the behavior of `DefaultAzureCredential` at runtime in any app running on that machine.\n\n## Debug a chained credential\n\nTo diagnose an unexpected issue or to understand what a chained credential is doing, [enable logging](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#readme-logging) in your app. Optionally, filter the logs to only those events emitted from the Azure Identity client library. For example:\n\n```go\nimport azlog \"github.com/Azure/azure-sdk-for-go/sdk/azcore/log\"\n// print log output to stdout\nazlog.SetListener(func(event azlog.Event, s string) {\n    fmt.Println(s)\n})\n// include only azidentity credential logs\nazlog.SetEvents(azidentity.EventAuthentication)\n```\n\nFor guidance on resolving errors from specific credential types, see the [troubleshooting guide](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azidentity/TROUBLESHOOTING.md).\n\n<!-- LINKS -->\n[env-vars]: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#readme-environment-variables\n"
  },
  {
    "path": "articles/go/sdk/authentication/local-development-dev-accounts.md",
    "content": "---\ntitle: Authenticate Go apps to Azure services during local development using developer accounts\ndescription: This article describes how to authenticate your application to Azure services when using the Azure SDK for Go during local development using developer accounts.\n#customer intent: As a developer, I want to learn how to sign in to Azure using developer tools so that I can authenticate my app during development.\nms.date: 12/03/2025\nms.topic: how-to\nms.custom: devx-track-go, devx-track-azurecli\n---\n\n# Authenticate Go apps to Azure services during local development using developer accounts\n\nDuring local development, applications need to authenticate to Azure to use different Azure services. Authenticate locally by using one of these approaches:\n\n- Use a developer account with one of the [developer tools supported by the Azure Identity library](#supported-developer-tools-for-authentication).\n- Use a [service principal](local-development-service-principal.md).\n\nThis article explains how to authenticate by using a developer account with tools supported by the Azure Identity library. In the following sections, you learn:\n\n- How to use Microsoft Entra groups to efficiently manage permissions for multiple developer accounts.\n- How to assign roles to developer accounts to scope permissions.\n- How to sign in to supported local development tools.\n- How to authenticate by using a developer account from your app code.\n\n## Supported developer tools for authentication\n\nFor an app to authenticate to Azure during local development by using the developer's Azure credentials, the developer must be signed in to Azure from one of the following developer tools:\n\n- Azure CLI\n- Azure Developer CLI\n- Azure PowerShell\n\nThe Azure Identity library can detect that the developer is signed in from one of these tools. The library can then obtain the Microsoft Entra access token via the tool to authenticate the app to Azure as the signed-in user.\n\nThis approach takes advantage of the developer's existing Azure accounts to streamline the authentication process. However, a developer's account likely has more permissions than required by the app, therefore exceeding the permissions the app runs with in production. As an alternative, you can [create application service principals to use during local development](./local-development-service-principal.md), which can be scoped to have only the access needed by the app.\n\n[!INCLUDE [create-entra-group](../../../includes/authentication/create-entra-group.md)]\n\n[!INCLUDE [assign-group-roles](../../../includes/authentication/assign-group-roles.md)]\n\n## Sign in to Azure by using developer tooling\n\nNext, sign in to Azure by using one of several developer tools that you can use to perform authentication in your development environment. The account you authenticate should also exist in the Microsoft Entra group you created and configured earlier.\n\n### [Azure CLI](#tab/sign-in-azure-cli)\n\n[!INCLUDE [sign-in-azure-cli](../../../includes/authentication/sign-in-azure-cli.md)]\n\n### [Azure Developer CLI](#tab/sign-in-azure-developer-cli)\n\n[!INCLUDE [sign-in-azure-developer-cli](../../../includes/authentication/sign-in-azure-developer-cli.md)]\n\n### [Azure PowerShell](#tab/sign-in-azure-powershell)\n\n[!INCLUDE [sign-in-azure-powershell](../../../includes/authentication/sign-in-azure-powershell.md)]\n\n---\n\n## Authenticate to Azure services from your app\n\nThe [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) package provides various *credentials* adapted to supporting different scenarios and Microsoft Entra authentication flows. The following steps demonstrate how to use [DefaultAzureCredential](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#DefaultAzureCredential) when working with service principals locally and in production.\n\n## Implement the code\n\nTo authenticate Azure SDK client objects to Azure, your application should use the [`DefaultAzureCredential`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#DefaultAzureCredential) class. In this scenario, `DefaultAzureCredential` sequentially checks if the developer signed in to Azure by using the Azure CLI or Azure developer CLI. If the developer signs in to Azure by using one of these tools, the app uses the credentials for authentication.\n\n[DefaultAzureCredential](credential-chains.md#defaultazurecredential-overview) is an ordered sequence of mechanisms for authenticating to Microsoft Entra ID. Each authentication mechanism is a type implementing the `TokenCredential` interface and is known as a *credential*. `DefaultAzureCredential` sequentially checks if the developer signed in to Azure by using the Azure CLI or Azure developer CLI. If the developer signs in to Azure by using one of these tools, the app uses the credentials for authentication. For more information about customizing the credential chain, see [How to customize DefaultAzureCredential](credential-chains.md#how-to-customize-defaultazurecredential).\n\n1. Add the [`azidentity`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) package to your application.\n\n    ```console\n    go get github.com/Azure/azure-sdk-for-go/sdk/azidentity\n    ```\n\n1. For any Go code that creates an Azure SDK client object in your app, you want to:\n\n    1. Import the `azidentity` package.\n    1. Use `DefaultAzureCredential` or `AzureCLICredential` to create an instance of a credential. For example:\n\n     - To use `DefaultAzureCredential`, set the environment variable `AZURE_TOKEN_CREDENTIALS` to `dev` that indicates the app is running in a development environment. For more information, see [How to customize DefaultAzureCredential](credential-chains.md#how-to-customize-defaultazurecredential).\n        \n        ```go\n        // Environment variable AZURE_TOKEN_CREDENTIALS=dev or a specific developer tool credential value\n        cred, err := azidentity.NewDefaultAzureCredential(nil)\n        ```\n    - Or use a specific credential such as `AzureCLICredential`, `AzureDeveloperCLICredential`, or `AzurePowerShellCredential` to authenticate by using the signed-in user for a specific development tool.\n        \n        ```go\n        cred, err := azidentity.NewAzureCLICredential(nil)\n        // or cred, err := azidentity.NewAzureDeveloperCLICredential(nil)\n        // or cred, err := azidentity.NewAzurePowerShellCredential(nil)\n        ```\n\n    1. Pass the credential instance to the Azure SDK client constructor.\n\nAn example of these steps is shown in the following code segment.\n\n```go\nimport (\n\t\"context\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n)\n\nconst (\n\taccount       = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\"\n\tcontainerName = \"sample-container\"\n\tblobName      = \"sample-blob\"\n\tsampleFile    = \"path/to/sample/file\"\n)\n\nfunc main() {\n\t// create a credential\n\tcred, err := azidentity.NewDefaultAzureCredential(nil)\n\t// or cred, err := azidentity.NewAzureCLICredential(nil)\n\t// or cred, err := azidentity.NewAzureDeveloperCLICredential(nil)\n\t// or cred, err := azidentity.NewAzurePowerShellCredential(nil)\n\tif err != nil {\n\t  // TODO: handle error\n\t}\n\t\n\t// create a client for the specified storage account\n\tclient, err := azblob.NewClient(account, cred, nil)\n\tif err != nil {\n\t  // TODO: handle error\n\t}\n\t\n\t// TODO: perform some action with the azblob Client\n\t// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)\n}\n```\n"
  },
  {
    "path": "articles/go/sdk/authentication/local-development-service-principal.md",
    "content": "---\ntitle: Authenticate Go apps to Azure services during local development using service principals\ndescription: This article describes how to authenticate your application to Azure services when using the Azure SDK for Go during local development using dedicated application service principals.\n#customer intent: As a Go developer, I want to use the Azure SDK for Go with service principals so that I can authenticate my app during local development using dedicated application service principals.\nms.date: 12/08/2025\nms.topic: how-to\nms.custom:\n  - devx-track-go\n  - devx-track-azurecli\n  - sfi-image-nochange\n---\n\n# Authenticate Go apps to Azure services during local development by using service principals\n\nDuring local development, applications need to authenticate to Azure to access various Azure services. Two common approaches for local authentication are to [use a developer account](local-development-dev-accounts.md) or a service principal. This article explains how to use an application service principal. In the following sections, you learn:\n\n- How to register an application with Microsoft Entra to create a service principal\n- How to use Microsoft Entra groups to efficiently manage permissions\n- How to assign roles to scope permissions\n- How to authenticate using a service principal from your app code\n\nBy using dedicated application service principals, you can adhere to the principle of least privilege when accessing Azure resources. Limit permissions to the specific requirements of the app during development, preventing accidental access to Azure resources intended for other apps or services. This approach also helps avoid issues when the app is moved to production by ensuring it isn't over-privileged in the development environment.\n\n:::image type=\"content\" source=\"../media/mermaidjs/local-service-principal-authentication.svg\" alt-text=\"A diagram showing how a local Go app uses a service principal to connect to Azure resources.\":::\n\nWhen you register the app in Azure, you create an application service principal. For local development:\n\n- Create a separate app registration for each developer working on the app so each developer has their own application service principal and doesn't need to share credentials.\n- Create a separate app registration for each app to limit the app's permissions to only what is necessary.\n\nDuring local development, set environment variables with the application service principal's identity. The Azure Identity library reads these environment variables to authenticate the app to the required Azure resources.\n\n\n[!INCLUDE [create-app-registration](../../../includes/authentication/create-app-registration.md)]\n\n[!INCLUDE [create-entra-group](../../../includes/authentication/create-entra-group.md)]\n\n[!INCLUDE [assign-group-roles](../../../includes/authentication/assign-group-roles.md)]\n\n## Set the app environment variables\n\nAt runtime, certain credentials from the Azure Identity library, such as [`DefaultAzureCredential`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#DefaultAzureCredential), `EnvironmentCredential`, and `ClientSecretCredential`, search for service principal information by convention in the environment variables. You can configure environment variables in multiple ways depending on your tooling and environment. You can create an `.env` file or use system environment variables to store these credentials locally during development. Since most developers work on multiple applications, use a package like `godotenv` to access environment variables from a `.env` file stored in the application's directory during development. This approach scopes the environment variables used to authenticate the application to Azure so that only this application can use them. Never check the `.env` file into source control since it contains the application secret key for Azure. The standard [.gitignore](https://github.com/github/gitignore/blob/main/Go.gitignore) file for Go automatically excludes the `.env` file from check-in.\n\nTo use the `godotenv` package, first install the package in your application.\n\n```bash\ngo get github.com/joho/godotenv\n```\n\nThen, create a `.env` file in your application root directory. Set the environment variable values with values obtained from the app registration process for a service principal:\n\n- `AZURE_CLIENT_ID`: Used to identify the registered app in Azure.\n- `AZURE_TENANT_ID`: The ID of the Microsoft Entra tenant.\n- `AZURE_CLIENT_SECRET`: The secret credential that was generated for the app.\n\n```env\nAZURE_CLIENT_ID=<your-client-id>\nAZURE_TENANT_ID=<your-tenant-id>\nAZURE_CLIENT_SECRET=<your-client-secret>\n```\n\nFinally, in the startup code for your application, use the `godotenv` library to read the environment variables from the `.env` file on startup.\n\n```go\n// Imports of fmt, log, and os omitted for brevity \nimport \"github.com/joho/godotenv\"\n\nenvironment := os.Getenv(\"ENVIRONMENT\")\n\nif environment == \"development\" {\n\tfmt.Println(\"Loading environment variables from .env file\")\n\n\t// Load the .env file\n\terr := godotenv.Load(\".env\")\n\tif err != nil {\n\t    log.Fatalf(\"Error loading .env file: %v\", err)\n\t}\n}\n```\n\nIf you prefer to set the environment variables in your system environment instead of using a `.env` file, you can do so in several ways depending on your operating system and shell. The following examples show how to set the environment variables in different shells:\n\n# [Bash](#tab/bash)\n\n```bash\nexport AZURE_CLIENT_ID=<your-client-id>\nexport AZURE_TENANT_ID=<your-tenant-id>\nexport AZURE_CLIENT_SECRET=<your-client-secret>\n```\n\n# [Windows command prompt](#tab/cmd)\n\nYou can set environment variables for Windows from the command line. However, all apps running on that operating system can access the values, which could cause conflicts. Use caution with this approach.\n\n```cmd\nset AZURE_CLIENT_ID=<your-client-id>\nset AZURE_TENANT_ID=<your-tenant-id>\nset AZURE_CLIENT_SECRET=<your-client-secret>\n```\n\n# [PowerShell](#tab/powershell)\n\n```powershell\n$env:AZURE_CLIENT_ID=\"<your-client-id>\"\n$env:AZURE_TENANT_ID=\"<your-tenant-id>\"\n$env:AZURE_CLIENT_SECRET=\"<your-client-secret>\"\n```\n\n---\n\n## Authenticate to Azure services from your app\n\nThe Azure Identity library provides different `TokenCredential` implementations for various scenarios and Microsoft Entra authentication flows. Use `EnvironmentCredential` when working with service principals locally and in production. In this scenario, `EnvironmentCredential` reads the environment variables `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_CLIENT_SECRET` to get the application service principal information to connect to Azure.\n\n1. Add the [`azidentity`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) package to your application.\n\n    ```bash\n    go get github.com/Azure/azure-sdk-for-go/sdk/azidentity\n    ```\n\n1. For any Go code that creates an Azure SDK client object in your app, you want to:\n\n    1. Import the `azidentity` package.\n    1. Create an `EnvironmentCredential` instance.\n    1. Pass the instance to the Azure SDK client constructor.\n\n    The following code segment shows an example:\n\n    ```go\n    import (\n    \t\"context\"\n    \t\"os\"\n\n    \t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n    \t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n    )\n    \n    const (\n    \taccount       = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\"\n    \tcontainerName = \"sample-container\"\n    \tblobName      = \"sample-blob\"\n    \tsampleFile    = \"path/to/sample/file\"\n    )\n    \n    func main() {\n    \t// create a credential\n    \tcred, err := azidentity.NewEnvironmentCredential(nil)\n    \tif err != nil {\n    \t  // TODO: handle error\n    \t}\n    \n    \t// create a client for the specified storage account\n    \tclient, err := azblob.NewClient(account, cred, nil)\n    \tif err != nil {\n    \t  // TODO: handle error\n    \t}\n    \n    \t// TODO: perform some action with the azblob Client\n    \t// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)\n    }\n    ```\n"
  },
  {
    "path": "articles/go/sdk/authentication/system-assigned-managed-identity.md",
    "content": "---\ntitle: Authenticate Azure-hosted Go apps to Azure resources using a system-assigned managed identity\ndescription: Learn how to authenticate Azure-hosted Go apps to other Azure services using a system-assigned managed identity.\nms.date: 12/04/2025\nms.topic: how-to\nms.custom: devx-track-go devx-track-azurecli\n---\n\n# Authenticate Azure-hosted Go apps to Azure resources using a system-assigned managed identity\n\nThe recommended approach to authenticate an Azure-hosted app to other Azure resources is to use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). This approach is [supported for most Azure services](/entra/identity/managed-identities-azure-resources/managed-identities-status), including apps hosted on Azure App Service, Azure Container Apps, and Azure Virtual Machines. Discover more about different authentication techniques and approaches on the [authentication overview](authentication-overview.md) page. In the sections ahead, you'll learn:\n\n- Essential managed identity concepts\n- How to create a system-assigned managed identity for your app\n- How to assign roles to the system-assigned managed identity\n- How to authenticate using the system-assigned managed identity from your app code\n\n[!INCLUDE [Managed identity concepts](<../../../includes/authentication/managed-identity-concepts.md>)]\n\nThe following sections describe the steps to enable and use a system-assigned managed identity for an Azure-hosted app. If you need to use a user-assigned managed identity, visit the [user-assigned managed identities](user-assigned-managed-identity.md) article for more information.\n\n[!INCLUDE [Language agnostic system assigned procedures](<../../../includes/authentication/system-assigned-managed-identity.md>)]\n\n[!INCLUDE [Go implement-managed-identity-concepts](../includes/implement-managed-identity-concepts.md)]\n\n## Implement the code\n\nAdd the [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) module.\n\nIn a terminal of your choice, navigate to the application project directory and run the following commands:\n\n```console\ngo get github.com/Azure/azure-sdk-for-go/sdk/azidentity\n```\n\n\nAzure services are accessed using specialized clients from the various Azure SDK client libraries. For any Go code that instantiates an Azure SDK client in your app, you need to:\n\n1. Import the `azidentity` package.\n1. Create an instance of `DefaultAzureCredential` type.\n1. Pass the instance of `DefaultAzureCredential` type to the Azure SDK client constructor.\n1. Set the `AZURE_TOKEN_CREDENTIALS` environment variable to `ManagedIdentityCredential` to ensure that `DefaultAzureCredential` uses only the managed identity credential. This practice makes authentication more predictable and easier to debug when deployed to Azure. For more information, see [Use a specific credential](credential-chains.md#use-a-specific-credential).\n\nAn example of these steps is shown in the following code segment with an Azure Storage Blob client.\n\n```go\nimport (\n\t\"context\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n)\n\nconst (\n\taccount       = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\"\n\tcontainerName = \"sample-container\"\n\tblobName      = \"sample-blob\"\n\tsampleFile    = \"path/to/sample/file\"\n)\n\nfunc main() {\n\t// create a credential\n\tcred, err := azidentity.NewDefaultAzureCredential(nil)\n\tif err != nil {\n\t  // TODO: handle error\n\t}\n\n\t// create a client for the specified storage account\n\tclient, err := azblob.NewClient(account, cred, nil)\n\tif err != nil {\n\t  // TODO: handle error\n\t}\n\n\t// TODO: perform some action with the azblob Client\n\t// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)\n}\n```\n\nAs discussed in the [Azure SDK for Go authentication overview](./authentication-overview.md) article, `DefaultAzureCredential` supports multiple authentication methods and determines the authentication method being used at runtime. The benefit of this approach is that your app can use different authentication methods in different environments without implementing environment-specific code. When the preceding code is run on your workstation during local development, `DefaultAzureCredential` uses either an application service principal, as determined by environment settings, or developer tool credentials to authenticate with other Azure resources. Thus, the same code can be used to authenticate your app to Azure resources during both local development and when deployed to Azure.\n\n> [!IMPORTANT]\n> `DefaultAzureCredential` simplifies authentication while developing applications that deploy to Azure by combining credentials used in Azure hosting environments and credentials used in local development. In production, it's better to use a specific credential type so authentication is more predictable and easier to debug.\n\nAn alternative to `DefaultAzureCredential` is to use [`ManagedIdentityCredential`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#ManagedIdentityCredential). The steps for using `ManagedIdentityCredential` are the same as for using the `DefaultAzureCredential` type.\n\nAn example of these steps is shown in the following code segment with an Azure Storage Blob client.\n\n```go\nimport (\n\t\"context\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n)\n\nconst (\n                    // Replace placeholder text with your storage account name\n\taccount       = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\"\n\tcontainerName = \"sample-container\"\n\tblobName      = \"sample-blob\"\n\tsampleFile    = \"path/to/sample/file\"\n)\n\nfunc main() {\n\t// create a credential\n\tcred, err := azidentity.NewManagedIdentityCredential(nil)\n\t\n\t// When using User Assigned Managed Identity use this instead and pass your client id in the options\n\t// clientID := azidentity.ClientID(\"abcd1234-...\")\n\t// opts := azidentity.ManagedIdentityCredentialOptions{ID: clientID}\n\t// cred, err := azidentity.NewManagedIdentityCredential(&opts)\n\t\n\tif err != nil {\n\t  // TODO: handle error\n\t}\n\t\n\t// create a client for the specified storage account\n\tclient, err := azblob.NewClient(account, cred, nil)\n\tif err != nil {\n\t  // TODO: handle error\n\t}\n\t\n\t// TODO: perform some action with the azblob Client\n\t// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)\n}\n```\n"
  },
  {
    "path": "articles/go/sdk/authentication/user-assigned-managed-identity.md",
    "content": "---\ntitle: Authenticate Azure-hosted Go apps to Azure resources using a user-assigned managed identity\ndescription: Learn how to authenticate Azure-hosted Go apps to other Azure services using a user-assigned managed identity.\nms.topic: how-to\nms.custom: devx-track-go, engagement-fy23, devx-track-azurecli\nms.date: 12/04/2025\n---\n\n# Authenticate Azure-hosted Go apps to Azure resources using a user-assigned managed identity\n\nThe recommended approach to authenticate an Azure-hosted app to other Azure resources is to use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). This approach is [supported for most Azure services](/entra/identity/managed-identities-azure-resources/managed-identities-status), including apps hosted on Azure App Service, Azure Container Apps, and Azure Virtual Machines. Discover more about different authentication techniques and approaches on the [authentication overview](authentication-overview.md) page. In the sections ahead, you'll learn:\n\n- Essential managed identity concepts\n- How to create a user-assigned managed identity for your app\n- How to assign roles to the user-assigned managed identity\n- How to authenticate using the user-assigned managed identity from your app code\n\n[!INCLUDE [Managed identity concepts](../../../includes/authentication/managed-identity-concepts.md)]\n\nThe following sections describe the steps to enable and use a user-assigned managed identity for an Azure-hosted app. If you need to use a system-assigned managed identity, visit the [system-assigned managed identities](system-assigned-managed-identity.md) article for more information.\n\n[!INCLUDE [Language agnostic user assigned procedures](<../../../includes/authentication/user-assigned-managed-identity.md>)]\n\n[!INCLUDE [Go implement-managed-identity-concepts](../includes/implement-managed-identity-concepts.md)]\n\n## Implement the code\n\nAdd the [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) module.\n\nIn a terminal of your choice, navigate to the application project directory and run the following commands:\n\n```console\ngo get github.com/Azure/azure-sdk-for-go/sdk/azidentity\n```\n\n\nAzure services are accessed using specialized clients from the various Azure SDK client libraries. For any Go code that instantiates an Azure SDK client in your app, you need to:\n\n1. Import the `azidentity` package.\n1. Create an instance of `DefaultAzureCredential` type.\n1. Pass the instance of `DefaultAzureCredential` type to the Azure SDK client constructor.\n1. Set the environment variable `AZURE_CLIENT_ID` to the client ID of your user-assigned identity\n1. Set the `AZURE_TOKEN_CREDENTIALS` environment variable to `ManagedIdentityCredential` to ensure that `DefaultAzureCredential` uses only the managed identity credential. This practice makes authentication more predictable and easier to debug when deployed to Azure. For more information, see [Use a specific credential](credential-chains.md#use-a-specific-credential). \n\nAn example of these steps is shown in the following code segment with an Azure Storage Blob client.\n\n```go\nimport (\n\t\"context\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n)\n\nconst (\n\taccount       = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\"\n\tcontainerName = \"sample-container\"\n\tblobName      = \"sample-blob\"\n\tsampleFile    = \"path/to/sample/file\"\n)\n\nfunc main() {\n\t// create a credential\n\tcred, err := azidentity.NewDefaultAzureCredential(nil)\n\tif err != nil {\n\t\t// TODO: handle error\n\t}\n\n\t// create a client for the specified storage account\n\tclient, err := azblob.NewClient(account, cred, nil)\n\tif err != nil {\n\t\t// TODO: handle error\n\t}\n\n\t// TODO: perform some action with the azblob Client\n\t// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)\n}\n```\n\nAs discussed in the [Azure SDK for Go authentication overview](./authentication-overview.md) article, `DefaultAzureCredential` supports multiple authentication methods and determines the authentication method being used at runtime. The benefit of this approach is that your app can use different authentication methods in different environments without implementing environment-specific code. When the preceding code is run on your workstation during local development, `DefaultAzureCredential` uses either an application service principal, as determined by environment settings, or developer tool credentials to authenticate with other Azure resources. Thus, the same code can be used to authenticate your app to Azure resources during both local development and when deployed to Azure.\n\n> [!IMPORTANT]\n> `DefaultAzureCredential` simplifies authentication while developing applications that deploy to Azure by combining credentials used in Azure hosting environments and credentials used in local development. In production, it's better to use a specific credential type so authentication is more predictable and easier to debug.\n\n\nAn alternative to `DefaultAzureCredential` is to use [`ManagedIdentityCredential`](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#ManagedIdentityCredential). The steps for using `ManagedIdentityCredential` are the same as for using the `DefaultAzureCredential` type.\n\nAn example of these steps is shown in the following code segment with an Azure Storage Blob client.\n\n```go\nimport (\n\t\"context\"\n\n\t\"github.com/Azure/azure-sdk-for-go/sdk/azidentity\"\n\t\"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob\"\n)\n\nconst (\n\t// Replace placeholder text with your storage account name\n\taccount       = \"https://<replace_with_your_storage_account_name>.blob.core.windows.net/\"\n\tcontainerName = \"sample-container\"\n\tblobName      = \"sample-blob\"\n\tsampleFile    = \"path/to/sample/file\"\n)\n\nfunc main() {\n\t// create a credential\n\tclientID := azidentity.ClientID(\"abcd1234-...\")\n\topts := azidentity.ManagedIdentityCredentialOptions{ID: clientID}\n\tcred, err := azidentity.NewManagedIdentityCredential(&opts)\n\tif err != nil {\n\t\t// TODO: handle error\n\t}\n\t\n\t// create a client for the specified storage account\n\tclient, err := azblob.NewClient(account, cred, nil)\n\tif err != nil {\n\t\t// TODO: handle error\n\t}\n\t\n\t// TODO: perform some action with the azblob Client\n\t// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)\n}\n```\n"
  },
  {
    "path": "articles/go/sdk/includes/implement-managed-identity-concepts.md",
    "content": "---\nms.topic: include\nms.date: 10/02/2025\n---\n\n## Authenticate to Azure services from your app\n\nThe [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) module provides various *credentials* - implementations of `TokenCredential` adapted to supporting different scenarios and Microsoft Entra authentication flows. Since managed identity is unavailable when running locally, the steps ahead demonstrate which credential to use in which scenario:\n\n- **Local dev environment**: During **local development only**, use [DefaultAzureCredential](../authentication/credential-chains.md#defaultazurecredential-overview) for an opinionated, preconfigured chain of credentials. `DefaultAzureCredential` discovers user credentials from your local development tools, such as the Azure CLI. It also provides flexibility and convenience for retries, wait times for responses, and support for multiple authentication options. Visit the [Authenticate to Azure services during local development](../authentication/local-development-dev-accounts.md) article to learn more.\n- **Azure-hosted apps**: When your app is running in Azure, use [ManagedIdentityCredential](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#ManagedIdentityCredential) to safely discover the managed identity configured for your app. Specifying this exact type of credential prevents other available credentials from being picked up unexpectedly.\n"
  },
  {
    "path": "articles/go/sdk/includes/sdk-auth-overview-dev-accounts.md",
    "content": "---\nms.topic: include\nms.date: 06/20/2024\n---\nIn this method, a developer must be signed in to Azure from the Azure CLI or Azure Developer CLI on their local workstation. The application then can access the developer's credentials from the credential store and use those credentials to access Azure resources from the app.<br>\n<br>\nThis method has the advantage of easier setup because a developer only needs to sign in to their Azure account through one of the aforementioned developer tools. The disadvantage of this approach is that the developer's account likely has more permissions than required by the application. As a result, the application doesn't accurately replicate the permissions it will run with in production.<br>\n<br>\n> [!div class=\"nextstepaction\"]\n> [Learn about auth using developer accounts](../authentication/local-development-dev-accounts.md)\n"
  },
  {
    "path": "articles/go/sdk/includes/sdk-auth-overview-dev-service-principals.md",
    "content": "---\nms.topic: include\nms.date: 06/20/2024\n---\nIn this method, dedicated *application service principal* objects are set up by using the app registration process for use during local development. The identity of the service principal is then stored as environment variables to be accessed by the app when it's run in local development.<br>\n<br>\nThis method allows you to assign the specific resource permissions needed by the app to the service principal objects used by developers during local development. This practice makes sure the application only has access to the specific resources it needs and replicates the permissions the app will have in production.<br>\n<br>\nThe downside of this approach is the need to create separate service principal objects for each developer who works on an application.<br>\n<br>\n> [!div class=\"nextstepaction\"]\n> [Learn about auth using developer service principals](../authentication/local-development-service-principal.md)\n"
  },
  {
    "path": "articles/go/sdk/includes/sdk-auth-overview-managed-identity.md",
    "content": "---\nms.topic: include\nms.date: 06/20/2024\n---\nApps hosted in Azure should use a *managed identity service principal*. Managed identities are designed to represent the identity of an app hosted in Azure and can only be used with Azure-hosted apps.<br>\n<br>\nFor example, a [Gin](https://github.com/gin-gonic/gin) web app hosted in Azure Container Apps would be assigned a managed identity. The managed identity assigned to the app would then be used to authenticate the app to other Azure services.<br>\n<br>\nApps running in Azure Kubernetes Service (AKS) can use a Workload identity credential. This credential is based on a managed identity that has a trust relationship with an AKS service account.<br>\n<br>\n> [!div class=\"nextstepaction\"]\n> [Learn about auth from Azure-hosted apps](../authentication/authentication-azure-hosted-apps.md)\n"
  },
  {
    "path": "articles/go/sdk/includes/sdk-auth-overview-service-principal.md",
    "content": "---\nms.topic: include\nms.date: 06/20/2024\n---\nApps hosted outside of Azure (for example, on-premises apps) that need to connect to Azure services should use an *application service principal*. An application service principal represents the identity of the app in Azure and is created through the application registration process.<br>\n<br>\nFor example, consider a [Gin](https://github.com/gin-gonic/gin)  web app hosted on-premises that makes use of Azure Blob Storage. You would create an application service principal for the app by using the app registration process. The `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_CLIENT_SECRET` would all be stored as environment variables to be read by the application at runtime and allow the app to authenticate to Azure by using the application service principal.<br>\n<br>\n> [!div class=\"nextstepaction\"]\n> [Learn about auth from apps hosted outside of Azure](../authentication/authentication-on-premises-apps.md)\n"
  },
  {
    "path": "articles/go/sdk/media/mermaidjs/local-service-principal-authentication.md",
    "content": "---\nms.topic: include\nms.date: 08/07/2024\n---\n\n```mermaid\n%% STEPS TO GENERATE IMAGE \n%% ======================= \n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md): \n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1 \n%% 2. Run command: mmdc -i local-service-principal-authentication.md -o ../../media/mermaidjs/local-service-principal-authentication.svg \n\nflowchart LR\n    APP[\"Local Go app\"]\n    SP[\"App service principal stored in environment variables\"]\n    AS[\"Azure services\"]\n    \n    APP --> SP\n    SP --> AS\n    \n    classDef app fill:#e6f3ff,stroke:#0078d4,stroke-width:2px,color:#000,font-size:16px\n    classDef serviceP fill:#D4F4D4,stroke:#7BC97B,stroke-width:2px,color:#000,font-size:16px\n    classDef services fill:#0078d4,stroke:#005ba1,stroke-width:2px,color:#fff,font-size:16px\n    \n    class APP app\n    class SP serviceP\n    class AS services\n```\n"
  },
  {
    "path": "articles/go/sdk/mermaidjs/chain-sequence.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chain-sequence.md -o ../media/mermaidjs/chain-sequence.svg\n\nsequenceDiagram\n  autonumber;\n\n  participant A as Go app;\n  participant B as Credential chain;\n  participant C as TokenCredential instance;\n    \n  A->>B: Authenticate to Microsoft Entra ID;\n  activate B;\n  B->>B: GetToken;\n  loop Traverse TokenCredential collection until AccessToken received\n    B->>C: Fetch token;\n    activate C;\n    C->>C: GetToken;\n    break when Result is AccessToken\n        C-->>B: Result;\n    end;\n    deactivate C;\n  end;\n  \n  B-->>A: AccessToken;\n  deactivate B;\n```\n"
  },
  {
    "path": "articles/go/sdk/mermaidjs/chained-token-credential-auth-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chained-token-credential-auth-flow.md -o ../media/mermaidjs/chained-token-credential-auth-flow.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    D(Azure CLI):::developer --> E(Azure Developer CLI):::developer;\n\n    %% Define styles for credential type boxes\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/go/sdk/mermaidjs/default-azure-credential-auth-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run commands:\n%%    mmdc -i default-azure-credential-auth-flow.md -o ../media/mermaidjs/default-azure-credential-auth-flow-inline.svg\n%%    mmdc -i default-azure-credential-auth-flow.md -o ../media/mermaidjs/default-azure-credential-auth-flow-expanded.png -w 1156\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#ffffff',\n      'tertiaryColor': '#ffffff'\n    }\n  }\n}%%\n\nflowchart LR;\n    subgraph CREDENTIAL TYPES;\n        direction LR;\n        Deployed(Deployed service):::deployed ~~~ Developer(Developer tool):::developer;\n    end;\n\n    subgraph CREDENTIALS;\n        direction LR\n        A(Environment):::deployed --> B(Workload Identity):::deployed --> C(Managed Identity):::deployed --> D(Azure CLI):::developer --> E(Azure Developer CLI):::developer --> F(Azure PowerShell):::developer;\n    end;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C;\n    classDef developer fill:#F5AF6F, stroke:#EB7C39;\n\n    %% Add API ref links to credential type boxes\n    click A \"https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#EnvironmentCredential\" _blank;\n    click B \"https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#WorkloadIdentityCredential\" _blank;\n    click C \"https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#ManagedIdentityCredential\" _blank;\n    click D \"https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#AzureCLICredential\" _blank;\n    click E \"https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#AzureDeveloperCLICredential\" _blank;\n    click F \"https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#AzurePowerShellCredential\" _blank;\n```\n"
  },
  {
    "path": "articles/go/sdk/mermaidjs/default-azure-credential-environment-variable-development.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command:\n%%    mmdc -i default-azure-credential-environment-variable-development.md -o ../media/mermaidjs/default-azure-credential-environment-variable-development.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#ffffff',\n      'tertiaryColor': '#ffffff'\n    }\n  }\n}%%\n\nflowchart LR;\n    D(Azure CLI):::developer --> E(Azure Developer CLI):::developer --> F(Azure PowerShell):::developer;\n\n    %% Define styles for credential type boxes\n    classDef developer fill:#F5AF6F, stroke:#EB7C39;\n```\n"
  },
  {
    "path": "articles/go/sdk/mermaidjs/default-azure-credential-environment-variable-production.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command:\n%%    mmdc -i default-azure-credential-environment-variable-production.md -o ../media/mermaidjs/default-azure-credential-environment-variable-production.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#ffffff',\n      'tertiaryColor': '#ffffff'\n    }\n  }\n}%%\n\nflowchart LR;\n    A(Environment):::deployed --> B(Workload Identity):::deployed --> C(Managed Identity):::deployed;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C;\n```\n"
  },
  {
    "path": "articles/iac/index.yml",
    "content": "### YamlMime:Hub\n\ntitle: Get started with Infrastructure as Code (IaC)\nsummary: Learn how to use Infrastructure-as-Code (IaC) tools to reliably provision virtual machines and other infrastructure on Azure.\nbrand: azure\n\nmetadata:\n  title: Get started with Infrastructure as Code (IaC)\n  description: Learn how to use Infrastructure-as-Code (IaC) tools to reliably provision virtual machines and other infrastructure on Azure.\n  ms.service: azure\n  author: TomArcherMsft\n  ms.author: tarcher\n  ms.topic: hub-page\n  ms.date: 02/14/2025\n\nhighlightedContent:\n# itemType: architecture | concept | deploy | download | get-started | how-to-guide | learn | overview | quickstart | reference | sample | tutorial | video | whats-new\n  items:\n    - title: What is Infrastructure as Code (IaC)?\n      url: /devops/deliver/what-is-infrastructure-as-code\n      itemType: concept\n    - title: Deploy to Azure with IaC\n      url: /devops/deliver/iac-github-actions\n      itemType: concept\n    - title: Comparing Bicep and Terraform\n      url: /azure/developer/terraform/comparing-terraform-and-bicep?tabs=comparing-bicep-terraform-integration-features\n      itemType: overview\n\nconceptualContent:\n  sections:\n    - title: Get started with IaC\n      summary: Learn how IaC allows you to deploy your infrastructure multiple times using the same code.\n      items:\n      - title: Deploying with IaC\n        links:\n        - text: What is IaC?\n          url: /devops/deliver/what-is-infrastructure-as-code\n          itemType: concept\n        - text: Deploy with IaC\n          url: /devops/deliver/iac-github-actions\n          itemType: deploy\n        - text: Azure and GitHub integration\n          url: /azure/developer/github/\n          itemType: concept\n      - title: Use IaC tools\n        links:\n        - text: Deploy with Bicep\n          url: /azure/azure-resource-manager/bicep/overview?tabs=bicep\n          itemType: get-started\n        - text: Deploy with Terraform providers\n          url: /azure/developer/terraform/overview\n          itemType: get-started\n        - text: (Legacy) Deploy with ARM templates\n          url: /azure/azure-resource-manager/management/overview\n          itemType: get-started\n      - title: Azure command-line tools\n        links:\n        - text: Azure CLI\n          url: /cli/azure/\n          itemType: overview\n        - text: Azure PowerShell\n          url: /powershell/azure/\n          itemType: overview\n        - text: Deploy Bicep with Azure CLI\n          url: /azure/azure-resource-manager/bicep/deploy-cli\n          itemType: how-to-guide\n        - text: Deploy Bicep with Azure PowerShell\n          url: /azure/azure-resource-manager/bicep/deploy-powershell\n          itemType: how-to-guide\n        - text: Authenticate Terraform with Azure CLI\n          url: /azure/developer/terraform/authenticate-to-azure\n          itemType: how-to-guide\n\nadditionalContent:\n  sections:\n  - title: Third-party Azure IaC providers\n    items:\n      - title: Terraform\n        summary: Use HCL (HashiCorp Language) to codify infrastructure in configuration files that describe the desired state for your topology.\n        url: /azure/developer/terraform/overview\n      - title: Chef\n        summary: Use Chef Automate to collaborate on application and infrastructure changes with speed and at scale.\n        url: https://docs.chef.io/automate/\n      - title: Jenkins\n        summary: Use Jenkins to set up continuous integration and delivery (CI/CD) for software projects.\n        url: https://www.jenkins.io/\n      - title: Ansible\n        summary: Use Ansible to automate provisioning, configuration management, application deployment, orchestration, and many other IT processes.\n        url: https://www.redhat.com/en/ansible-collaborative\n      - title: Pulumi\n        summary: Build infrastructure on Azure using TypeScript, Python, Go, C#, Java or YAML. The Azure Native provider is always up-to-date and covers 100% of the resources in Azure Resource Manager (ARM).\n        url: https://www.pulumi.com/docs/iac/clouds/azure/\n"
  },
  {
    "path": "articles/includes/authentication/advantages-token-based-authentication.md",
    "content": "---\nauthor: brendm\nms.service: azure\nms.topic: include\nms.date: 02/09/2026\nms.author: bmitchell287\n---\n\nToken-based authentication offers the following advantages over connection strings:\n\n- Token-based authentication ensures that only the specific apps intended to access the Azure resource can access it, whereas anyone or any app with a connection string can connect to an Azure resource.\n- Token-based authentication enables you to limit Azure resource access to only the specific permissions needed by the app. This approach follows the [principle of least privilege](https://wikipedia.org/wiki/Principle_of_least_privilege). In contrast, a connection string grants full rights to the Azure resource.\n- When you use a [managed identity](/entra/identity/managed-identities-azure-resources/overview) for token-based authentication, Azure handles administrative functions for you, so you don't need to worry about tasks like securing or rotating secrets. This approach makes the app more secure because there's no connection string or application secret that can be compromised.\n- The Azure Identity library acquires and manages Microsoft Entra tokens for you.\n\nLimit use of connection strings to scenarios where token-based authentication isn't an option, initial proof-of-concept apps, or development prototypes that don't access production or sensitive data. When possible, use the token-based authentication classes available in the Azure Identity library to authenticate to Azure resources.\n"
  },
  {
    "path": "articles/includes/authentication/assign-group-roles.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 09/22/2025\nms.author: diberry\n---\n\n## Assign roles to the group\n\nNext, determine what roles (permissions) your app needs on what resources and assign those roles to the Microsoft Entra group you created. Groups can be assigned a role at the resource, resource group, or subscription scope. This example shows how to assign roles at the resource group scope, since most apps group all their Azure resources into a single resource group.\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the Azure portal, navigate to the **Overview** page of the resource group that contains your app.\n1. Select **Access control (IAM)** from the left navigation.\n1. On the **Access control (IAM)** page, select **+ Add** and then choose **Add role assignment** from the drop-down menu. The **Add role assignment** page provides several tabs to configure and assign roles.\n1. On the **Role** tab, use the search box to locate the role you want to assign. Select the role, and then choose **Next**.\n1. On the **Members** tab:\n    - For the **Assign access to** value, select **User, group, or service principal** .\n    - For the **Members** value, choose **+ Select members** to open the **Select members** flyout panel.\n    - Search for the Microsoft Entra group you created earlier and select it from the filtered results. Choose **Select** to select the group and close the flyout panel.\n    - Select **Review + assign** at the bottom of the **Members** tab.\n\n    :::image type=\"content\" source=\"./media/group-role-assignment.png\"  lightbox=\"./media/group-role-assignment.png\" alt-text=\"A screenshot showing how to assign a role to the Microsoft Entra group.\":::\n\n1. On the **Review + assign** tab, select **Review + assign** at the bottom of the page.\n\n### [Azure CLI](#tab/azure-cli)\n\n1. Use the [az role definition list](/cli/azure/role/definition#az-role-definition-list) command to get the names of the roles that a Microsoft Entra group or service principal can be assigned to:\n\n    ```azurecli\n    az role definition list \\\n        --query \"sort_by([].{roleName:roleName, description:description}, &roleName)\" \\\n        --output table\n    ```\n\n1. Use the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command to assign a role to the Microsoft Entra group you created:\n\n    ```azurecli\n    az role assignment create \\\n        --assignee \"<group-object-Id>\" \\\n        --role \"<role-name>\" \\\n        --resource-group \"<resource-group-name>\"\n    ```\n\n    For information on assigning permissions at the resource or subscription level using the Azure CLI, see [Assign Azure roles using the Azure CLI](/azure/role-based-access-control/role-assignments-cli).\n\n---"
  },
  {
    "path": "articles/includes/authentication/assign-service-principal-roles.md",
    "content": "---\nms.topic: include\nms.date: 01/05/2026\n---\n\n## Assign roles to the application service principal\n\nNext, determine what roles (permissions) your app needs on what resources and assign those roles to the service principal you created. Roles can be assigned at the resource, resource group, or subscription scope. This example shows how to assign roles at the resource group scope, since most apps group all their Azure resources into a single resource group.\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the Azure portal, navigate to the **Overview** page of the resource group that contains your app.\n1. Select **Access control (IAM)** from the left navigation.\n1. On the **Access control (IAM)** page, select **+ Add** and then choose **Add role assignment** from the drop-down menu. The **Add role assignment** page provides several tabs to configure and assign roles.\n1. On the **Role** tab, use the search box to locate the role you want to assign. Select the role, and then choose **Next**.\n1. On the **Members** tab:\n    - For the **Assign access to** value, select **User, group, or service principal** .\n    - For the **Members** value, choose **+ Select members** to open the **Select members** flyout panel.\n    - Search for the service principal you created earlier and select it from the filtered results. Choose **Select** to select the group and close the flyout panel.\n    - Select **Review + assign** at the bottom of the **Members** tab.\n\n    :::image type=\"content\" source=\"/dotnet/azure/media/app-role-assignment.png\" alt-text=\"A screenshot showing how to assign a role to the service principal.\":::\n\n1. On the **Review + assign** tab, select **Review + assign** at the bottom of the page.\n\n### [Azure CLI](#tab/azure-cli)\n\n1. Use the [az role definition list](/cli/azure/role/definition#az-role-definition-list) command to get the names of the roles that a service principal can be assigned to:\n\n    ```azurecli\n    az role definition list \\\n        --query \"sort_by([].{roleName:roleName, description:description}, &roleName)\" \\\n        --output table\n    ```\n\n1. Use the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command to assign a role to an application service principal:\n\n    ```azurecli\n    az role assignment create \\\n        --assignee \"<app-Id>\" \\\n        --role \"<role-name>\" \\\n        --resource-group \"<resource-group-name>\"\n    ```\n\n    For information on assigning permissions at the resource or subscription level using the Azure CLI, see [Assign Azure roles using the Azure CLI](/azure/role-based-access-control/role-assignments-cli)."
  },
  {
    "path": "articles/includes/authentication/broker-assign-roles.md",
    "content": "---\nms.topic: include\nms.date: 03/19/2025\n---\n\n## Assign roles\n\nTo run your app code successfully with brokered authentication, grant your user account permissions using [Azure role-based access control (RBAC)](/azure/role-based-access-control/overview). Assign an appropriate role to your user account for the relevant Azure service. For example:\n\n- **Azure Blob Storage**: Assign the **Storage Account Data Contributor** role.\n- **Azure Key Vault**: Assign the **Key Vault Secrets Officer** role.\n\nIf an app is specified, it must have API permissions set for **user_impersonation Access Azure Storage** (step 6 in the previous section). This API permission allows the app to access Azure storage on behalf of the signed-in user after consent is granted during sign-in.\n"
  },
  {
    "path": "articles/includes/authentication/broker-configure-application.md",
    "content": "---\nms.topic: include\nms.date: 03/19/2025\n---\n\n## Configure the app for brokered authentication\n\nTo enable brokered authentication in your application, follow these steps:\n\n1. In the [Azure portal](https://portal.azure.com), navigate to **Microsoft Entra ID** and select **App registrations** on the left-hand menu.\n1. Select the registration for your app, then select **Authentication**.\n1. Add the appropriate redirect URI to your app registration via a platform configuration:\n    1. Under **Platform configurations**, select **+ Add a platform**.\n    1. Under **Configure platforms**, select the tile for your application type (platform) to configure its settings, such as **mobile and desktop applications**.\n    1. In **Custom redirect URIs**, enter the following redirect URI for your platform:\n\n        | Platform    | Redirect URI                                                                                                          |\n        |-------------|-----------------------------------------------------------------------------------------------------------------------|\n        | Windows 10+ or WSL | `ms-appx-web://Microsoft.AAD.BrokerPlugin/{your_client_id}`                                                             |\n        | macOS       | `msauth.com.msauth.unsignedapp://auth` for unsigned apps<br>`msauth.{bundle_id}://auth` for signed apps                    |\n        | Linux       | `https://login.microsoftonline.com/common/oauth2/nativeclient`                                                        |\n\n        Replace `{your_client_id}` or `{bundle_id}` with the **Application (client) ID** from the app registration's **Overview** pane.\n\n    1. Select **Configure**.\n\n    To learn more, see [Add a redirect URI to an app registration](/entra/identity-platform/quickstart-register-app#add-a-redirect-uri).\n\n1. Back on the **Authentication** pane, under **Advanced settings**, select **Yes** for **Allow public client flows**.\n1. Select **Save** to apply the changes.\n1. To authorize the application for specific resources, navigate to the resource in question, select **API Permissions**, and enable **Microsoft Graph** and other resources you want to access.\n\n    > [!IMPORTANT]\n    > You must also be the admin of your tenant to grant consent to your application when you sign in for the first time.\n"
  },
  {
    "path": "articles/includes/authentication/broker-introduction.md",
    "content": "---\nms.topic: include\nms.date: 04/25/2025\n---\n\nBrokered authentication collects user credentials using the system authentication broker to authenticate an app. A system authentication broker is an app running on a user's machine that manages the authentication handshakes and token maintenance for all connected accounts.\n\nBrokered authentication offers the following benefits:\n\n- **Enables Single Sign-On (SSO):** Enables apps to simplify how users authenticate with Microsoft Entra ID and protects Microsoft Entra ID refresh tokens from exfiltration and misuse.\n- **Enhanced security:** Many security enhancements are delivered with the broker, without needing to update the app logic.\n- **Enhanced feature support:** With the help of the broker, developers can access rich OS and service capabilities.\n- **System integration:** Applications that use the broker plug-and-play with the built-in account picker, allowing the user to quickly pick an existing account instead of reentering the same credentials over and over.\n- **Token Protection:** Ensures that the refresh tokens are device bound and enables apps to acquire device bound access tokens. See [Token Protection](/azure/active-directory/conditional-access/concept-token-protection).\n"
  },
  {
    "path": "articles/includes/authentication/broker-linux.md",
    "content": "---\nms.topic: include\nms.date: 04/25/2025\n---\n\nLinux uses [Microsoft single sign-on for Linux](/entra/identity/devices/sso-linux) as its authentication broker.\n"
  },
  {
    "path": "articles/includes/authentication/broker-mac.md",
    "content": "---\nms.topic: include\nms.date: 04/25/2025\n---\n\nmacOS doesn't natively include a built-in authentication broker. The Azure Identity client library implements brokered authentication features using platform-specific mechanisms and may integrate with apps like Microsoft Company Portal when devices are managed. For more information, see [Microsoft Enterprise SSO plug-in for Apple devices](/entra/identity-platform/apple-sso-plugin).\n"
  },
  {
    "path": "articles/includes/authentication/broker-windows.md",
    "content": "---\nms.topic: include\nms.date: 04/25/2025\n---\n\nWindows provides an authentication broker called [Web Account Manager (WAM)](/entra/msal/dotnet/acquiring-tokens/desktop-mobile/wam). WAM enables identity providers such as Microsoft Entra ID to natively plug into the OS and provide secure login services to apps. Brokered authentication enables the app for all operations allowed by the interactive login credentials.\n\nPersonal Microsoft accounts and work or school accounts are supported. On supported Windows versions, the default browser-based UI is replaced with a smoother authentication experience, similar to built-in Windows apps.\n"
  },
  {
    "path": "articles/includes/authentication/create-app-registration.md",
    "content": "---\nms.topic: include\nms.date: 03/13/2025\n---\n\n## Register the app in Azure\n\nApplication service principal objects are created through an app registration in Azure using either the Azure portal or Azure CLI.\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the Azure portal, use the search bar to navigate to the **App registrations** page.\n1. On the **App registrations** page, select **+ New registration**.\n1. On the **Register an application** page:\n    - For the **Name** field, enter a descriptive value that includes the app name and the target environment.\n    - For the **Supported account types**, select **Accounts in this organizational directory only (Microsoft Customer Led only - Single tenant)**, or whichever option best fits your requirements.\n1. Select **Register** to register your app and create the service principal.\n\n    :::image type=\"content\" source=\"./media/app-registration.png\" alt-text=\"A screenshot showing how to create an app registration in the Azure portal.\":::\n\n1. On the **App registration** page for your app, copy the **Application (client) ID** and **Directory (tenant) ID** and paste them in a temporary location for later use in your app code configurations.\n1. Select **Add a certificate or secret** to set up credentials for your app.\n1. On the **Certificates & secrets** page, select **+ New client secret**.\n1. In the **Add a client secret** flyout panel that opens:\n    - For the **Description**, enter a value of Current.\n    - For the **Expires** value, leave the default recommended value of 180 days.\n    - Select **Add** to add the secret.\n1. On the **Certificates & secrets** page, copy the **Value** property of the client secret for use in a future step.\n\n    > [!NOTE]\n    > The client secret value is only displayed once after the app registration is created. You can add more client secrets without invalidating this client secret, but there's no way to display this value again.\n\n### [Azure CLI](#tab/azure-cli)\n\nAzure CLI commands can be run in the [Azure Cloud Shell](https://shell.azure.com) or on a workstation with the [Azure CLI installed](/cli/azure/install-azure-cli).\n\n1. Use the [az ad sp create-for-rbac](/cli/azure/ad/sp#az-ad-sp-create-for-rbac) command to create a new app registration and service principal for the app.\n\n    ```azurecli\n    az ad sp create-for-rbac --name <service-principal-name>\n    ```\n\n    The output of this command resembles the following JSON:\n\n    ```json\n    {\n      \"appId\": \"00000000-0000-0000-0000-000000000000\",\n      \"displayName\": \"<service-principal-name>\",\n      \"password\": \"abcdefghijklmnopqrstuvwxyz\",\n      \"tenant\": \"11111111-1111-1111-1111-111111111111\"\n    }\n    ```\n\n1. Copy this output into a temporary file in a text editor, as you'll need these values in a future step.\n\n    > [!NOTE]\n    > The client secret value is only displayed once after the app registration is created. You can add more client secrets without invalidating this client secret, but there's no way to display this value again.\n\n---\n"
  },
  {
    "path": "articles/includes/authentication/create-entra-group.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 09/22/2025\nms.author: diberry\n---\n\n## Create a Microsoft Entra group for local development\n\nCreate a Microsoft Entra group to encapsulate the roles (permissions) the app needs in local development rather than assigning the roles to individual service principal objects. This approach offers the following advantages:\n\n- Every developer has the same roles assigned at the group level.\n- If a new role is needed for the app, it only needs to be added to the group for the app.\n- If a new developer joins the team, a new application service principal is created for the developer and added to the group, ensuring the developer has the right permissions to work on the app.\n\n### [Azure portal](#tab/azure-portal)\n\n1. Navigate to the **Microsoft Entra ID** overview page in the Azure portal.\n1. Select **All groups** from the left-hand menu.\n1. On the **Groups** page, select **New group**.\n1. On the **New group** page, fill out the following form fields:\n    - **Group type**: Select **Security**.\n    - **Group name**: Enter a name for the group that includes a reference to the app or environment name.\n    - **Group description**: Enter a description that explains the purpose of the group.\n\n    :::image type=\"content\" source=\"./media/create-group.png\" lightbox=\"./media/create-group.png\" alt-text=\"A screenshot showing how to create a group in the Azure portal.\":::\n\n1. Select the **No members selected** link under **Members** to add members to the group.\n1. In the flyout panel that opens, search for the service principal you created earlier and select it from the filtered results. Choose the **Select** button at the bottom of the panel to confirm your selection.\n1. Select **Create** at the bottom of the **New group** page to create the group and return to the **All groups** page. If you don't see the new group listed, wait a moment and refresh the page.\n\n### [Azure CLI](#tab/azure-cli)\n\n1. Use the [az ad group create](/cli/azure/ad/group#az-ad-group-create) command to create groups in Microsoft Entra ID.\n\n    ```azurecli\n    az ad group create \\\n        --display-name <group-name> \\\n        --mail-nickname <group-mail-nickname> \\\n        --description <group-description>\n    ```\n\n    The `--display-name` and `--mail-nickname` parameters are required. The name given to the group should be based on the name and environment of the app to indicate the group's purpose.\n\n1. To add members to the group, you need the object ID of the application service principal, which is different than the application ID. Use the [az ad sp list](/cli/azure/ad/sp#az-ad-sp-list) command to list the available service principals:\n\n    ```azurecli\n    az ad sp list \\\n        --filter \"startswith(displayName, '<group-name>')\" \\\n        --query \"[].{objectId:id, displayName:displayName}\"\n    ```\n\n    The `--filter` parameter accepts OData-style filters and can be used to filter the list as shown. The `--query` parameter limits the output to only the columns of interest.\n\n1. Use the [az ad group member add](/cli/azure/ad/group/member#az-ad-group-member-add) command to add members to the group:\n\n    ```azurecli\n    az ad group member add \\\n        --group <group-name> \\\n        --member-id <object-id>\n    ```\n\n---"
  },
  {
    "path": "articles/includes/authentication/managed-identity-concepts.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 08/15/2025\nms.author: diberry\n---\n\n## Essential managed identity concepts\n\nA managed identity enables your app to securely connect to other Azure resources without the use of secret keys or other application secrets. Internally, Azure tracks the identity and which resources it's allowed to connect to. Azure uses this information to automatically obtain Microsoft Entra tokens for the app to allow it to connect to other Azure resources.\n\nThere are two types of managed identities to consider when configuring your hosted app:\n\n- **System-assigned** managed identities are enabled directly on an Azure resource and are tied to its life cycle. When the resource is deleted, Azure automatically deletes the identity for you. System-assigned identities provide a minimalistic approach to using managed identities.\n- **User-assigned** managed identities are created as standalone Azure resources and offer greater flexibility and capabilities. They're ideal for solutions involving multiple Azure resources that need to share the same identity and permissions. For example, if multiple virtual machines need to access the same set of Azure resources, a user-assigned managed identity provides reusability and optimized management.\n\n> [!TIP]\n> Learn more about selecting and managing system-assigned and user-assigned managed identities in the [Managed identity best practice recommendations](/entra/identity/managed-identities-azure-resources/managed-identity-best-practice-recommendations) article."
  },
  {
    "path": "articles/includes/authentication/media/mermaidjs/authentication-environments.md",
    "content": "---\nms.topic: include\nms.date: 08/07/2024\n---\n\n```mermaid\n%% STEPS TO GENERATE IMAGE \n%% ======================= \n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md): \n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1 \n%% 2. Run command: mmdc -i authentication-environments.md -o ../../media/mermaidjs/authentication-environments.svg \n\n%%{init: {'theme':'base', 'themeVariables': { 'primaryColor': '#fff', 'edgeLabelBackground':'#fff', 'fontSize': '24px'}}}%%\nflowchart LR\n    App[\"App\"]\n    Q1{Where is the app running?}\n    \n    App --> Q1\n    \n    %% Local Development Machine Branch\n    Q1 --> LocalDev[Development machine]\n    LocalDev --> AppSP[\"**Service principal**\"]\n    LocalDev --> UserPrincipal[\"**User principal**\"]\n    \n    %% Azure Branch\n    Q1 --> AzureApp[Azure]\n    AzureApp --> ManagedId[\"**Managed identity**\"]\n    \n\n    %% On-premises Server Branch\n    Q1 --> OnPremApp[On-premises server]\n    OnPremApp --> ServicePrincipal[\"**Service principal**\"]\n    OnPremApp --> ArcManagedId[\"**Managed identity (Azure Arc only)**\"]\n\n    %% Styling\n    classDef questionBox fill:#4472C4,stroke:#333,stroke-width:2px,color:#fff,font-size:24px\n    classDef authMethod fill:#e6f2ff,stroke:#4472C4,stroke-width:2px,color:#000,font-size:24px\n    classDef envNode fill:#8fbc8f,stroke:#333,stroke-width:2px,color:#000,font-size:24px\n    classDef startNode fill:#2d5f3f,stroke:#333,stroke-width:2px,color:#fff,font-size:24px\n    \n    %% Edge label styling\n    linkStyle default font-size:24px\n    \n    class App startNode\n    class Q1 questionBox\n    class AppSP,UserPrincipal,ManagedId,ServicePrincipal,ArcManagedId authMethod\n    class LocalDev,AzureApp,OnPremApp envNode\n```\n"
  },
  {
    "path": "articles/includes/authentication/media/mermaidjs/chain-sequence.md",
    "content": "---\nms.topic: include\nms.date: 08/07/2024\n---\n\n```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chain-sequence.md -o ../../media/mermaidjs/chain-sequence.svg\n\nsequenceDiagram\n  autonumber;\n\n  participant A as .NET app;\n  participant B as Credential chain;\n  participant C as TokenCredential instance;\n    \n  A->>B: Authenticate to Microsoft Entra ID;\n  activate B;\n  B->>B: GetToken;\n  loop Traverse TokenCredential collection until AccessToken received\n    B->>C: Fetch token;\n    activate C;\n    C->>C: GetToken;\n    break when Result is AccessToken\n        C-->>B: Result;\n    end;\n    deactivate C;\n  end;\n  \n  B-->>A: AccessToken;\n  deactivate B;\n```\n"
  },
  {
    "path": "articles/includes/authentication/media/mermaidjs/chained-token-credential-authentication-flow.md",
    "content": "---\nms.topic: include\nms.date: 08/07/2024\n---\n\n```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chained-token-credential-authentication-flow.md -o ../../media/mermaidjs/chained-token-credential-authentication-flow.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    F(Azure PowerShell):::developer --> D(Visual Studio):::developer;\n\n    %% Define styles for credential type boxes\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/includes/authentication/media/mermaidjs/default-azure-credential-authentication-flow.md",
    "content": "---\nms.topic: include\nms.date: 08/13/2025\n---\n\n```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run commands:\n%%    mmdc -i default-azure-credential-authentication-flow.md -o ../../media/mermaidjs/default-azure-credential-authentication-flow-inline.svg\n%%    mmdc -i default-azure-credential-authentication-flow.md -o ../../media/mermaidjs/default-azure-credential-authentication-flow-expanded.png -w 1156\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential;\n\n    subgraph CREDENTIAL TYPES;\n        direction LR;\n        Deployed(Deployed service):::deployed ~~~ Developer(Developer tool):::developer ~~~ Interactive(Interactive):::interactive;\n    end;\n\n    subgraph CREDENTIALS;\n        direction LR;\n        A(Environment):::deployed -->\n        B(Workload Identity):::deployed -->\n        C(Managed Identity):::deployed -->\n        D(Visual Studio):::developer -->\n        E(Visual Studio Code):::developer -->\n        F(Azure CLI):::developer -->\n        G(Azure PowerShell):::developer -->\n        H(Azure Developer CLI):::developer -->\n        I(Interactive browser):::interactive -->\n        J(Broker):::developer;\n    end;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C, stroke-width:2px;\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n    classDef interactive fill:#A5A5A5, stroke:#828282, stroke-dasharray:5 5, stroke-width:2px;\n\n    %% Add API ref links to credential type boxes\n    click A \"https://learn.microsoft.com/dotnet/api/azure.identity.environmentcredential?view=azure-dotnet\" _blank;\n    click B \"https://learn.microsoft.com/dotnet/api/azure.identity.workloadidentitycredential?view=azure-dotnet\" _blank;\n    click C \"https://learn.microsoft.com/dotnet/api/azure.identity.managedidentitycredential?view=azure-dotnet\" _blank;\n    click D \"https://learn.microsoft.com/dotnet/api/azure.identity.visualstudiocredential?view=azure-dotnet\" _blank;\n    click E \"https://learn.microsoft.com/dotnet/api/azure.identity.visualstudiocodecredential?view=azure-dotnet\" _blank;\n    click F \"https://learn.microsoft.com/dotnet/api/azure.identity.azureclicredential?view=azure-dotnet\" _blank;\n    click G \"https://learn.microsoft.com/dotnet/api/azure.identity.azurepowershellcredential?view=azure-dotnet\" _blank;\n    click H \"https://learn.microsoft.com/dotnet/api/azure.identity.azuredeveloperclicredential?view=azure-dotnet\" _blank\n    click I \"https://learn.microsoft.com/dotnet/api/azure.identity.interactivebrowsercredential?view=azure-dotnet\" _blank;\n    click J \"https://learn.microsoft.com/dotnet/api/azure.identity.interactivebrowsercredential?view=azure-dotnet\" _blank;\n```\n"
  },
  {
    "path": "articles/includes/authentication/media/mermaidjs/default-azure-credential-environment-variable-development.md",
    "content": "---\nms.topic: include\nms.date: 08/13/2025\n---\n\n```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i default-azure-credential-environment-variable-development.md -o ../../media/mermaidjs/default-azure-credential-environment-variable-development.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow without deployed service credentials;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential when AZURE_TOKEN_CREDENTIALS is set to \"dev\";\n\n    D(Visual Studio):::developer -->\n    E(Visual Studio Code):::developer -->\n    F(Azure CLI):::developer -->\n    G(Azure PowerShell):::developer -->\n    H(Azure Developer CLI):::developer;\n\n    %% Define styles for credential type boxes\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/includes/authentication/media/mermaidjs/default-azure-credential-environment-variable-production.md",
    "content": "---\nms.topic: include\nms.date: 05/30/2025\n---\n\n```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i default-azure-credential-environment-variable-production.md -o ../../media/mermaidjs/default-azure-credential-environment-variable-production.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow without developer tool credentials;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential when AZURE_TOKEN_CREDENTIALS is set to \"prod\";\n\n    A(Environment):::deployed --> B(Workload Identity):::deployed --> C(Managed Identity):::deployed;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/includes/authentication/media/mermaidjs/default-azure-credential-excludes.md",
    "content": "---\nms.topic: include\nms.date: 08/13/2025\n---\n\n```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i default-azure-credential-excludes.md -o ../../media/mermaidjs/default-azure-credential-excludes.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    D(Visual Studio):::developer -->\n    E(Visual Studio Code):::developer -->\n    F(Azure CLI):::developer -->\n    G(Azure PowerShell):::developer -->\n    H(Azure Developer CLI):::developer -->\n    I(Broker):::developer;\n\n    %% Define styles for credential type boxes\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/includes/authentication/media/mermaidjs/local-service-principal-authentication.md",
    "content": "---\nms.topic: include\nms.date: 08/07/2024\n---\n\n```mermaid\n%% STEPS TO GENERATE IMAGE \n%% ======================= \n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md): \n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1 \n%% 2. Run command: mmdc -i local-service-principal-authentication.md -o ../../media/mermaidjs/local-service-principal-authentication.svg \n\nflowchart LR\n    APP[\"Local app\"]\n    SP[\"App service principal stored in environment variables\"]\n    AS[\"Azure services\"]\n    \n    APP --> SP\n    SP --> AS\n    \n    classDef app fill:#e6f3ff,stroke:#0078d4,stroke-width:2px,color:#000,font-size:16px\n    classDef serviceP fill:#D4F4D4,stroke:#7BC97B,stroke-width:2px,color:#000,font-size:16px\n    classDef services fill:#0078d4,stroke:#005ba1,stroke-width:2px,color:#fff,font-size:16px\n    \n    class APP app\n    class SP serviceP\n    class AS services\n```\n"
  },
  {
    "path": "articles/includes/authentication/overview-advantages.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 12/04/2024\nms.author: diberry\n---\n\n|Token-based authentication|Secrets (connection strings and keys)|\n|--|--|\n|[Principle of least privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege), establish the specific permissions needed by the app on the Azure resource. | A connection string or key grants full rights to the Azure resource.|\n|There's no application secret to store.| Must store and rotate secrets in app setting or environment variable.|\n|The Azure Identity library manages tokens for you behind the scenes. This makes using token-based authentication as easy to use as a connection string.|Secrets aren't managed.|\n\nUse of connection strings should be limited to initial proof of concept apps or development prototypes that don't access production or sensitive data. Otherwise, the token-based authentication classes available in the Azure Identity library should always be preferred when authenticating to Azure resources."
  },
  {
    "path": "articles/includes/authentication/overview-credential-sequence.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 06/13/2019\nms.author: diberry\n---\nInternally, `DefaultAzureCredential` implements a chain of selecting credential providers for authenticating applications to Azure resources.  Each credential provider is able to detect if credentials of that type are configured for the app.  `DefaultAzureCredential` sequentially checks each provider in order and uses the credentials from the first provider that has credentials configured.\n\nIf you've more than one credential configured, the order of finding the credential through the chain is important. "
  },
  {
    "path": "articles/includes/authentication/overview-defaultazurecredential-after.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 06/13/2019\nms.author: diberry\n---\n`DefaultAzureCredential` will automatically detect the authentication mechanism configured for the app and obtain the necessary tokens to authenticate the app to Azure. If an application makes use of more than one SDK client, the same credential object can be used with each SDK client object."
  },
  {
    "path": "articles/includes/authentication/overview-local-environments.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 06/13/2019\nms.author: diberry\n---\nWhen an application is run on a developer's workstation during local development, the local environment must still authenticate to any Azure services used by the app. "
  },
  {
    "path": "articles/includes/authentication/overview-para-1.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 12/04/2024\nms.author: diberry\n---\nWhen an application needs to access an Azure resource, such as Storage, Key Vault, or Cognitive Services, the application must be authenticated to Azure. This is true for all applications, whether deployed to Azure, deployed on-premises, or under development on a local developer workstation.\n"
  },
  {
    "path": "articles/includes/authentication/overview-recommend-authentication-rust.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 08/13/2025\nms.author: diberry\n---\nThe recommended approach is to have your apps use **token-based authentication**, rather than connection strings or keys, when authenticating to Azure resources. The [azure_identity](https://crates.io/crates/azure_identity) crate provides token-based authentication and enables apps to seamlessly authenticate to Azure resources whether the app is in local development, deployed to Azure, or deployed to an on-premises server.\n\nThe specific type of token-based authentication an app should use to authenticate to Azure resources depends on where the app is running. \n\n|Environment|Authentication|\n|--|--|\n|**Local**| When a developer runs an app during local development - The app can authenticate to Azure using the developer's local credentials. These options are provided in more detail in the [crates.io: Authenticate with development tools](https://crates.io/crates/azure_identity#authenticate-via-development-tools).|\n|**Azure**| When an app is hosted on Azure - The app should authenticate to Azure resources using a managed identity. This option is discussed in more detail in the _crates.io_ documentation: [Authenticate Azure-hosted applications](https://crates.io/crates/azure_identity#authenticate-azure-hosted-applications).|\n|**On-premises**|When an app is hosted and deployed on-premises - The app should authenticate to Azure resources using an application service principal. This option is discussed in the _crates.io_ documentation: [Authenticate service principals](https://crates.io/crates/azure_identity#authenticate-service-principals).|\n"
  },
  {
    "path": "articles/includes/authentication/overview-server-environments.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 06/13/2019\nms.author: diberry\n---\nWhen hosting in a server environment, each application should be assigned a unique *application identity* per environment. In Azure, an app identity is represented by a **service principal**, a special type of *security principal* intended to identify and authenticate apps to Azure. The type of service principal to use for your app depends on where your app is running."
  },
  {
    "path": "articles/includes/authentication/sign-in-azure-cli.md",
    "content": "---\nauthor: PatAltimore\nms.service: azure\nms.topic: include\nms.date: 02/05/2026\nms.author: patricka\n---\n\nDevelopers can use [Azure CLI](/cli/azure/what-is-azure-cli) to authenticate. Apps that use `DefaultAzureCredential` or `AzureCLICredential` can then use this account to authenticate app requests.\n\nTo authenticate with the Azure CLI, run the `az login` command. On a system with a default web browser, the Azure CLI launches the browser to authenticate the user.\n\n```azurecli\naz login\n```\n\nFor systems without a default web browser, the `az login` command uses the device code authentication flow. You can also force the Azure CLI to use the device code flow rather than launching a browser by specifying the `--use-device-code` argument.\n\n```azurecli\naz login --use-device-code\n```\n"
  },
  {
    "path": "articles/includes/authentication/sign-in-azure-developer-cli.md",
    "content": "---\nauthor: brendm\nms.service: azure\nms.topic: include\nms.date: 02/05/2026\nms.author: bmitchell287\n---\n\nDevelopers can use [Azure Developer CLI](/azure/developer/azure-developer-cli/overview) to authenticate to Microsoft Entra ID. Apps using `DefaultAzureCredential` or `AzureDeveloperCliCredential` can then use this account to authenticate app requests when running locally.\n\nTo authenticate with the Azure Developer CLI, run the `azd auth login` command. On a system with a default web browser, the Azure Developer CLI launches the browser to authenticate the user.\n\n```azdeveloper\nazd auth login\n```\n\nFor systems without a default web browser, the `azd auth login --use-device-code` uses the device code authentication flow. The user can also force the Azure Developer CLI to use the device code flow rather than launching a browser by specifying the `--use-device-code` argument.\n\n```azdeveloper\nazd auth login --use-device-code\n```\n"
  },
  {
    "path": "articles/includes/authentication/sign-in-azure-powershell.md",
    "content": "---\nauthor: brendm\nms.service: azure\nms.topic: include\nms.date: 02/05/2026\nms.author: bmitchell287\n---\n\nDevelopers can use [Azure PowerShell](/powershell/azure/what-is-azure-powershell) to authenticate to Microsoft Entra ID. Apps using `DefaultAzureCredential` or `AzurePowerShellCredential` can then use this account to authenticate app requests when running locally.\n\nTo authenticate with Azure PowerShell, run the command `Connect-AzAccount`. On a system with a default web browser and version 5.0.0 or later of Azure PowerShell, it launches the browser to authenticate the user.\n\n```azurepowershell\nConnect-AzAccount\n```\n\nFor systems without a default web browser, the `Connect-AzAccount` command uses the device code authentication flow. The user can also force Azure PowerShell to use the device code flow rather than launching a browser by specifying the `UseDeviceAuthentication` argument.\n\n```azurepowershell\nConnect-AzAccount -UseDeviceAuthentication\n```\n"
  },
  {
    "path": "articles/includes/authentication/sign-in-visual-studio-code.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 02/18/2026\nms.author: diberry\n---\n\nDevelopers using Visual Studio Code can authenticate with their developer account directly through the editor via the broker. Apps that use `DefaultAzureCredential` or `VisualStudioCodeCredential` can then use this account to authenticate app requests through a seamless single-sign-on experience.\n\n1. In Visual Studio Code, go to the **Extensions** panel and install the [Azure Resources](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureresourcegroups) extension. This extension lets you view and manage Azure resources directly from Visual Studio Code. It also uses the built-in Visual Studio Code Microsoft authentication provider to authenticate with Azure.\n\n    :::image type=\"content\" source=\"./media/azure-resources-extension.png\" alt-text=\"Screenshot showing the Azure Resources extension.\":::\n\n1. Open the Command Palette in Visual Studio Code, then search for and select **Azure: Sign in**.\n\n    :::image type=\"content\" source=\"./media/visual-studio-code-sign-in.png\" alt-text=\"Screenshot showing how to sign in to Azure in Visual Studio Code.\":::\n\n    > [!TIP]\n    > Open the Command Palette using `Ctrl+Shift+P` on Windows/Linux or `Cmd+Shift+P` on macOS.\n"
  },
  {
    "path": "articles/includes/authentication/system-assigned-managed-identity.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 08/15/2025\nms.author: diberry\n---\n## Enable a system-assigned managed identity on the Azure hosting resource\n\nTo get started using a system-assigned managed identity with your app, enable the identity on the Azure resource hosting your app, such as an Azure App Service, Azure Container Apps, or Azure Virtual Machines instance.\n\nYou can enable a system-assigned managed identity for an Azure resource using either the Azure portal or the Azure CLI.\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the Azure portal, navigate to the resource that hosts your application code, such as an Azure App Service or Azure Container Apps instance.\n1. From the resource's **Overview** page, expand **Settings** and select **Identity** from the navigation.\n1. On the **Identity** page, toggle the **Status** slider to **On**.\n1. Select **Save** to apply your changes.\n\n    :::image type=\"content\" source=\"./media/system-assigned-identity-enable.png\" lightbox=\"./media/system-assigned-identity-enable.png\" alt-text=\"A screenshot showing how to enable a system-assigned managed identity on a container app.\":::\n\n### [Azure CLI](#tab/azure-cli)\n\nAzure CLI commands can be run in the [Azure Cloud Shell](https://shell.azure.com) or on a workstation with the [Azure CLI installed](/cli/azure/install-azure-cli).\n\nThe Azure CLI commands used to enable managed identity for an Azure resource are of the form `az <command-group> identity --resource-group <resource-group-name> --name <resource-name>`. Specific commands for popular Azure services are shown below.\n\nAzure App Service:\n\n```azurecli\naz webapp identity assign \\\n    --resource-group <resource-group-name> \\\n    --name <web-app-name>\n```\n\nAzure Container Apps:\n\n```azurecli\naz containerapp identity assign \\\n    --resource-group <resource-group-name> \\\n    --name <container-app-name> \\\n    --system-assigned\n```\n\nAzure Virtual Machines:\n\n```azurecli\naz vm identity assign \\\n    --resource-group <resource-group-name> \\\n    --name <virtual-machine-name>\n```\n\nThe output resembles the following:\n\n```json\n{\n  \"principalId\": \"aaaaaaaa-bbbb-cccc-1111-222222222222\",\n  \"tenantId\": \"aaaabbbb-0000-cccc-1111-dddd2222eeee\",\n  \"type\": \"SystemAssigned\",\n  \"userAssignedIdentities\": null\n}\n```\n\nThe `principalId` value is the unique ID of the managed identity. Keep a copy of this output, as you'll need these values in the next step.\n\n---\n\n## Assign roles to the managed identity\n\nNext, determine which roles your app needs and assign those roles to the managed identity. You can assign roles to a managed identity at the following scopes:\n\n- **Resource**: The assigned roles only apply to that specific resource.\n- **Resource group**: The assigned roles apply to all resources contained in the resource group.\n- **Subscription**: The assigned roles apply to all resources contained in the subscription.\n\nThe following example shows how to assign roles at the resource group scope, since many apps manage all their related Azure resources using a single resource group.\n\n### [Azure portal](#tab/azure-portal)\n\n1. Navigate to the **Overview** page of the resource group that contains the app with the system-assigned managed identity.\n1. Select **Access control (IAM)** on the left navigation.\n1. On the **Access control (IAM)** page, select **+ Add** on the top menu and then choose **Add role assignment** to navigate to the **Add role assignment** page.\n\n    :::image type=\"content\" source=\"./media/system-assigned-identity-access-control.png\" lightbox=\"./media/system-assigned-identity-access-control.png\" alt-text=\"A screenshot showing how to access the identity role assignment page.\":::\n\n1. The **Add role assignment** page presents a tabbed, multi-step workflow to assign roles to identities. On the initial **Role** tab, use the search box at the top to locate the role you want to assign to the identity.\n1. Select the role from the results and then choose **Next** to move to the **Members** tab.\n1. For the **Assign access to** option, select **Managed identity**.\n1. For the **Members** option, choose **+ Select members** to open the **Select managed identities** panel.\n1. On the **Select managed identities** panel, use the **Subscription** and **Managed identity** dropdowns to filter the search results for your identities. Use the **Select** search box to locate the system-identity you enabled for the Azure resource hosting your app.\n\n    :::image type=\"content\" source=\"./media/system-assigned-identity-assign-roles.png\" lightbox=\"./media/system-assigned-identity-assign-roles.png\" alt-text=\"A screenshot showing the managed identity assignment process.\":::\n\n1. Select the identity and choose **Select** at the bottom of the panel to continue.\n1. Select **Review + assign** at the bottom of the page.\n1. On the final **Review + assign** tab, select **Review + assign** to complete the workflow.\n\n### [Azure CLI](#tab/azure-cli)\n\nA managed identity is assigned a role in Azure using the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command:\n\n```azurecli\naz role assignment create \\\n    --assignee \"{managedIdentityId}\" \\\n    --role \"{roleName}\" \\\n    --scope \"{scope}\"\n```\n\nTo get the role names to which a service principal can be assigned, use the [az role definition list](/cli/azure/role/definition#az-role-definition-list) command:\n\n```azurecli\naz role definition list \\\n    --query \"sort_by([].{roleName:roleName, description:description}, &roleName)\" \\\n    --output table\n```\n\nFor example, to allow the managed identity with the ID of `aaaaaaaa-bbbb-cccc-1111-222222222222` read, write, and delete access to Azure Storage blob containers and data to all storage accounts in the *msdocs-sdk-auth-example* resource group, assign the application service principal to the *Storage Blob Data Contributor* role using the following command:\n\n```azurecli\naz role assignment create \\\n    --assignee aaaaaaaa-bbbb-cccc-1111-222222222222 \\\n    --role \"Storage Blob Data Contributor\" \\\n    --scope \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/msdocs-sdk-auth-example\"\n```\n\nFor information on assigning permissions at the resource or subscription level using the Azure CLI, see the article [Assign Azure roles using the Azure CLI](/azure/role-based-access-control/role-assignments-cli).\n\n---\n"
  },
  {
    "path": "articles/includes/authentication/user-assigned-managed-identity.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 08/15/2025\nms.author: diberry\n---\n## Create a user-assigned managed identity\n\nUser-assigned managed identities are created as standalone resources in your Azure subscription using the Azure portal or the Azure CLI. Azure CLI commands can be run in the [Azure Cloud Shell](https://shell.azure.com) or on a workstation with the [Azure CLI installed](/cli/azure/install-azure-cli).\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the Azure portal, enter *Managed identities* in the main search bar and select the matching result under the **Services** section.\n1. On the **Managed Identities** page, select **+ Create**.\n\n    :::image type=\"content\" source=\"./media/user-assigned-identity-create.png\" lightbox=\"./media/user-assigned-identity-create.png\" alt-text=\"A screenshot showing the page to manage user-assigned managed identities.\":::\n\n1. On the **Create User Assigned Managed Identity** page, select a subscription, resource group, and region for the user-assigned managed identity, and then provide a name.\n1. Select **Review + create** to review and validate your inputs.\n\n    :::image type=\"content\" source=\"./media/user-assigned-identity-form.png\" lightbox=\"./media/user-assigned-identity-form.png\" alt-text=\"A screenshot showing the form to create a user-assigned managed identity.\":::\n\n1. Select **Create** to create the user-assigned managed identity.\n1. After the identity is created, select **Go to resource**.\n1. On the new identity's **Overview** page, copy the **Client ID** value to use for later when you configure the application code.\n\n### [Azure CLI](#tab/azure-cli)\n\nUse the Azure CLI command [`az identity create`](/cli/azure/identity#az-identity-create) to create a managed identity:\n\n```azurecli\naz identity create \\\n    --resource-group <resource-group-name> \\\n    --name <identity-name> \\\n    --query 'clientId' \\\n    --output json\n```\n\nThe command output prints the client ID of the created user-assigned managed identity. The client ID is used to configure application code that relies on the identity.\n\nYou can always view the managed identity properties again using the [`az identity show`](/cli/azure/identity#az-identity-show) command:\n\n```azurecli\naz identity show \\\n    --resource-group <your-resource-group> \\\n    --name <your-managed-identity-name> \\\n    --output json\n```\n\n---\n\n## Assign the managed identity to your app\n\nA user-assigned managed identity can be associated with one or more Azure resources. All of the resources that use that identity gain the permissions applied through the identity's roles.\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the Azure portal, navigate to the resource that hosts your app code, such as an Azure App Service or Azure Container Apps instance.\n1. From the resource's **Overview** page, expand **Settings** and select **Identity** from the navigation.\n1. On the **Identity** page, switch to the **User assigned** tab.\n1. Select **+ Add** to open the **Add user assigned managed identity** panel.\n1. On the **Add user assigned managed identity** panel, use the **Subscription** dropdown to filter the search results for your identities. Use the **User assigned managed identities** search box to locate the user-assigned managed identity you enabled for the Azure resource hosting your app.\n1. Select the identity and choose **Add** at the bottom of the panel to continue.\n\n    :::image type=\"content\" source=\"./media/add-user-assigned-identity-to-app.png\" lightbox=\"./media/add-user-assigned-identity-to-app.png\" alt-text=\"A screenshot showing how to associate a user-assigned managed identity with an app.\":::\n\n### [Azure CLI](#tab/azure-cli)\n\nThe Azure CLI provides different commands to assign a user-assigned managed identity to different types of hosting services.\n\n1. To assign a user-assigned managed identity to a resource such as an Azure App Service web app using the Azure CLI, you'll need the resource ID of the identity. Use the [`az identity show`](/cli/azure/identity#az-identity-show) command to retrieve the resource ID:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <your-resource-group> \\\n        --name <your-managed-identity-name> \\\n        --output json \\\n        --query id\n    ```\n\n2. Once you have the resource ID, use the Azure CLI command `az <resourceType> identity assign` command to associate the user-assigned managed identity with different resources, such as the following:\n\n    For Azure App Service, use the Azure CLI command [`az webapp identity assign`](/cli/azure/webapp/identity#az-webapp-identity-assign):\n\n    ```azurecli\n    az webapp identity assign \\\n        --resource-group <resource-group-name> \\\n        --name <webapp-name> \\\n        --identities <user-assigned-identity-resource-id>\n    ```\n\n    For Azure Container Apps, use the Azure CLI command [`az containerapp identity assign`](/cli/azure/containerapp/identity#az-containerapp-identity-assign):\n\n    ```azurecli\n    az containerapp identity assign \\\n        --resource-group <resource-group-name> \\\n        --name <containerapp-name> \\\n        --user-assigned <user-assigned-identity-resource-id>\n    ```\n\n    For Azure Virtual Machines, use the Azure CLI command [`az vm identity assign`](/cli/azure/vm/identity#az-vm-identity-assign):\n\n    ```azurecli\n    az vm identity assign \\\n        --resource-group <resource-group-name> \\\n        --name <vm-name> \\\n        --identities <user-assigned-identity-resource-id>\n    ```\n\n---\n\n## Assign roles to the managed identity\n\nNext, determine which roles your app needs and assign those roles to the managed identity. You can assign roles to a managed identity at the following scopes:\n\n- **Resource**: The assigned roles only apply to that specific resource.\n- **Resource group**: The assigned roles apply to all resources contained in the resource group.\n- **Subscription**: The assigned roles apply to all resources contained in the subscription.\n\nThe following example shows how to assign roles at the resource group scope, since many apps manage all their related Azure resources using a single resource group.\n\n### [Azure portal](#tab/azure-portal)\n\n1. Navigate to the **Overview** page of the resource group that contains the app with the user-assigned managed identity.\n1. Select **Access control (IAM)** on the left navigation.\n1. On the **Access control (IAM)** page, select **+ Add** on the top menu and then choose **Add role assignment** to navigate to the **Add role assignment** page.\n\n    :::image type=\"content\" source=\"./media/add-role-assignment.png\" lightbox=\"./media/add-role-assignment.png\" alt-text=\"A screenshot showing how to access the identity role assignment page.\":::\n\n1. The **Add role assignment** page presents a tabbed, multi-step workflow to assign roles to identities. On the initial **Role** tab, use the search box at the top to locate the role you want to assign to the identity.\n1. Select the role from the results and then choose **Next** to move to the **Members** tab.\n1. For the **Assign access to** option, select **Managed identity**.\n1. For the **Members** option, choose **+ Select members** to open the **Select managed identities** panel.\n1. On the **Select managed identities** panel, use the **Subscription** and **Managed identity** dropdowns to filter the search results for your identities. Use the **Select** search box to locate the user-assigned managed identity you enabled for the Azure resource hosting your app.\n\n    :::image type=\"content\" source=\"./media/user-assigned-identity-assign-roles.png\" lightbox=\"./media/user-assigned-identity-assign-roles.png\" alt-text=\"A screenshot showing the managed identity assignment process.\":::\n\n1. Select the identity and choose **Select** at the bottom of the panel to continue.\n1. Select **Review + assign** at the bottom of the page.\n1. On the final **Review + assign** tab, select **Review + assign** to complete the workflow.\n\n### [Azure CLI](#tab/azure-cli)\n\n1. To assign a role to a user-assigned managed identity using the Azure CLI, you'll need the principal ID of the identity. Use the `az identity show` command to retrieve the principal ID:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <your-resource-group> \\\n        --name <your-managed-identity-name> \\\n        --output json \\\n        --query principalId\n    ```\n\n1. Use the [az role definition list](/cli/azure/role/definition#az-role-definition-list) command to explore which roles a managed identity can be assigned:\n\n    ```azurecli\n    az role definition list \\\n        --query \"sort_by([].{roleName:roleName, description:description}, &roleName)\" \\\n        --output table\n    ```\n\n1. Assign a role to a managed identity using the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command:\n\n    ```azurecli\n    az role assignment create \\\n        --assignee <your-principal-id> \\\n        --role <role-name> \\\n        --scope <scope>\n    ```\n\n    For example, to allow the managed identity with the ID of `99999999-9999-9999-9999-999999999999` read, write, and delete access to Azure Storage blob containers and data to all storage accounts in the *msdocs-sdk-auth-example* resource group, assign the application service principal to the *Storage Blob Data Contributor* role using the following command:\n\n    ```azurecli\n    az role assignment create \\\n        --assignee 99999999-9999-9999-9999-999999999999 \\\n        --role \"Storage Blob Data Contributor\" \\\n        --scope \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/msdocs-sdk-auth-example\"\n    ```\n\nFor information on assigning permissions at the resource or subscription level using the Azure CLI, see the article [Assign Azure roles using the Azure CLI](/azure/role-based-access-control/role-assignments-cli).\n\n---"
  },
  {
    "path": "articles/includes/azure-cli-login.md",
    "content": "---\nms.topic: include\nms.date: 07/25/2022\nauthor: dbradish-microsoft\nms.author: dbradish\nmanager: barbkess\nms.custom: devx-track-azurecli\n---\n\n##### [Bash](#tab/az-login-terminal-bash) \n\nInstall [Azure CLI](/cli/azure/install-azure-cli) and sign in interactively with the [az login](/cli/azure/authenticate-azure-cli#sign-in-interactively) command to log in to Azure before using `DefaultAzureCredential` in code.\n\n```bash\naz login\n```\n\n##### [PowerShell](#tab/az-login-terminal-ps)\n\nTo authenticate with Azure PowerShell, run the `Connect-AzAccount` cmdlet. By default, like the Azure CLI, `Connect-AzAccount` launches the default web browser to authenticate a user account.\n\n```powershell\nConnect-AzAccount\n```\n\n##### [Visual Studio Code](#tab/az-login-vscode)\n\nIf you're using Visual Studio Code, you can also sign in to Azure with the [Azure Account extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account).\n\n---\n"
  },
  {
    "path": "articles/includes/choose-the-right-azure-command-line-tool.md",
    "content": "---\n ms.service: azure\nms.custom: devx-track-azurecli, devx-track-azurepowershell\n ms.topic: include\n ms.date: 05/12/2021\n---\n\n# Choose the right Azure command-line tool\n\nWhen it comes to managing Azure, you have many options. This article compares the Azure CLI and Azure PowerShell language and gives a comparison of the shell environments on which they run.\n\n[Azure CLI](/cli/azure/install-azure-cli), [Azure PowerShell](/powershell/azure/install-az-ps), and [Azure Cloud Shell](/azure/cloud-shell/overview) have overlapping functionality. Each operates differently, and the language is sometimes confused with the environment. Use this guide to determine which is the right tool for you.\n\n## What's the advantage of using an Azure command-line tool?\n\nAzure runs on automation. Every action you take inside the portal translates somewhere to code being executed to read, create, modify, or delete resources.\n\nMoving your workload to Azure lifts some of the administrative burden but not all. As your rate of adoption with Azure increases so will the overhead. Even though you don't have to worry about the data center, you still have to patch and troubleshoot Azure VMs, failover databases, and configure virtual networks.\n\nBy using the existing automation that runs Azure, command-line tools reduce that overhead.\n\n## What are Azure command-line tools?\n\nAzure command-line tools automate routine operations, standardize database failovers, and pull data that provide powerful insight. Command-line tools not only give you the ability to scale your tasks in Azure, but they also make much easier to share. Sharing a script is much easier than a lengthy wiki page with time consuming screenshots.\n\nUsing an Azure command-line tool isn't always necessary, but it's a useful skill to have.\n\n## Azure CLI vs Azure PowerShell\n\nAzure CLI and Azure PowerShell are command-line tools that enable you to create and manage Azure resources. Both are cross-platform, installable\non Windows, macOS, and Linux.\n\n**Azure CLI**\n\n* Cross-platform command-line interface, installable on Windows, macOS, Linux\n* Runs in Windows PowerShell, Cmd, or Bash and other Unix shells.\n\n**Azure PowerShell**\n\n* Cross-platform PowerShell module, runs on Windows, macOS, Linux\n* Requires Windows PowerShell or PowerShell\n\n## Different shell environments\n\n|Shell Environment|Azure CLI|Azure PowerShell|\n|---|:---:|:---:|\n|Cmd|Yes||\n|Bash|Yes|\n|Windows PowerShell|Yes|Yes|\n|PowerShell|Yes|Yes|\n\nWindows PowerShell, PowerShell, Cmd, and Bash are shell environments. Your shell environment not only determines which tools you can use but also changes your command-line experience.\n\nFor example, for the line continuation character, Bash uses the backslash `\\` while Windows PowerShell uses the backtick  `` ` ``. The differences in the shell environment doesn't change how Azure CLI and Azure PowerShell operate. However, they do change your command-line experience.\n\nAzure CLI has an installer that makes its commands executable in all four shell environments.\n\nAzure PowerShell is set of cmdlets packaged as a PowerShell module named `Az`; not an executable. Windows PowerShell or PowerShell must be used to install the `Az` module. \n\nWindows PowerShell is the standard scripting shell that comes preinstalled with most Windows operating systems. PowerShell is a stand-alone installation that uses .NET Core as it's run time, allowing it to be installed on macOS, Linux, and Windows.\n\n**Key points:**\n\n* AzureRM is a PowerShell module that is still referenced for Azure administration with PowerShell. However, it has been replaced by Azure PowerShell and has an official retirement date of February 29 2024.\n\nIf you're using AzureRM, you can [migrate Azure PowerShell from AzureRM to Az](/powershell/azure/migrate-from-azurerm-to-az).\n\n## What about Azure Cloud Shell?\n\nAzure Cloud Shell is a hosted shell environment that runs on an Ubuntu container.\n\nCloud Shell provides two shell environments: Bash (with Azure CLI preinstalled) and PowerShell (with Azure PowerShell preinstalled). A dropdown list at the top of the Cloud Shell window allows you to easily switch between the two environments.\n\nCloud Shell is accessible in a web browser and has integrations for [Windows Terminal](/Shows/IT-Ops-Talk/Azure-Cloud-Shell-in-the-Windows-Terminal) and [Visual Studio Code](https://azure.microsoft.com/blog/cloudshelleditor/).\n\n![Azure CloudShell Bash and PowerShell environments](./media/choosing-the-right-azure-tool/azure-cloud-shell-bash-powershell.png)\n\n> [!NOTE]\n> Azure Cloud Shell may not always _immediately reflect_ the most recent Azure PowerShell and Azure CLI releases as the publishing schedule for all three tools is different.  However, Azure Cloud Shell is generally thought to always contain the most recent versions of both tools.\n\n## Which Azure command-line tool is right for you?\n\nWhen picking the right tool, consider your past experience and current work environment.\n\nAzure CLI syntax is similar to that of Bash scripting. If you work primarily with Linux systems, Azure CLI feels more natural.\n\nAzure PowerShell is a PowerShell module. If you work primarily with Windows systems, Azure PowerShell is a natural fit. Commands follow a verb-noun naming scheme and\ndata is returned as objects.\n\nChoose the tool that uses your experience and shortens your learning curve. Take advantage of [Microsoft learning](/training/paths/manage-resources-in-azure) to become proficient at managing Azure at the command line.\n\nWith that said, being open-minded will only improve your abilities. Use a different tool when it makes sense.\n\n**Key points:**\n\n* Feature parity for Azure services doesn't always exist between Azure CLI and Azure PowerShell.\n\n## Azure CLI vs Azure PowerShell: Side-by-side Command Comparison\n\nSign in, Subscription, and Location Commands:\n\n|Command|Azure CLI|Azure PowerShell|\n|---|---|---|\n|Sign in with Web Browser|az login|Connect-AzAccount|\n|Get available subscriptions|az account list|Get-AzSubscription|\n|Set Subscription|az account set –-subscription \\<SubscriptionId>|Set-AzContext -Subscription \\<SubscriptionID>|\n|List Azure Locations|az account list-locations|Get-AzLocation|\n\n---\n\nFind Versions, Get Help, and View Command Help:\n\n|Command|Azure CLI|Azure PowerShell|\n|---|---|---|\n|Find Version|az --version|Get-InstalledModule -Name Az|\n|Get Help|az --help|Get-Help|\n|View Command Help|az vm --help|Get-Help -Name New-AzVM\n\n---\n\nCreate a Resource Group, VM, and Storage Account:\n\n|Command|Azure CLI|Azure PowerShell|\n| --- | --- | --- |\n| Create Resource Group | az group create --name \\<ResourceGroupName> --location eastus |New-AzResourceGroup -Name \\<ResourceGroupName> -Location eastus\n| Create Azure Virtual Machine | az vm create --resource-group myResourceGroup --name myVM --image UbuntuLTS --admin-username azureuser --admin-password '\\<Password>' |  New-AzVM -ResourceGroupName \\<ResourceGroupName> -Name myVM -Image UbuntuLTS -Credential (Get-Credential) |\n| Create Azure Storage Account | az storage account create --name \\<StorageAccountName> --resource-group \\<ResourceGroupName> --location eastus --sku Standard_LRS --kind StorageV2 | New-AzStorageAccount -Name \\<StorageAccountName> -ResourceGroupName \\<ResourceGroupName> -Location eastus -SkuName Standard_LRS -Kind StorageV2\n\n---\n\nManage Azure Virtual Machines:\n\n|Command|Azure CLI|Azure PowerShell|\n| --- | --- | --- |\n|List VM|az vm list|Get-AzVM\n|Restart VM|az vm restart --name myVM --resource-group \\<ResourceGroupName>|Restart-AzVM -Name myVM -ResourceGroupName \\<ResourceGroupName>\n|Stop VM|az vm stop --name myVM --resource-group \\<ResourceGroupName>|Stop-AzVM -Name myVM -ResourceGroupName \\<ResourceGroupName>\n|Stop & Deallocate VM| az vm deallocate --name myVM --resource-group \\<ResourceGroupName>|Stop-AzVM -Name myVM -ResourceGroupName \\<ResourceGroupName>\n|Start VM| az vm start --name myVM --resource-group \\<ResourceGroupName>|Start-AzVM -Name myVM -ResourceGroupName \\<ResourceGroupName>\n|Delete VM|az vm delete --name myVM --resource-group \\<ResourceGroupName>|Remove-AzVM -Name myVM -ResourceGroupName \\<ResourceGroupName>|\n\nSelect Properties and Change Output Formats:\n\n|Command|Azure CLI|Azure PowerShell|\n| --- | --- | --- |\n|Show all subscription information|az account list --all|Get-AzSubscription \\| Select-Object -Property *|\n|Output as a Table|az account list -o table| Get-AzSubscription \\| Format-Table|\n|Output as JSON|az account show|Get-AzSubscription \\| ConvertTo-Json|\n\n**Key points:**\n\n* Azure CLI defaults to outputting a JSON string. Other format options can be found on the [Output formats for Azure CLI commands](/cli/azure/format-output-azure-cli).\n* Azure PowerShell defaults to outputting objects. To learn more about formatting in PowerShell, read the [Using Format Commands to Change Output View](/powershell/scripting/samples/using-format-commands-to-change-output-view).\n\n## Next steps\n\nAzure CLI:\n\n* [Install the Azure CLI](/cli/azure/install-azure-cli)\n\nAzure PowerShell:\n\n* [Install Azure PowerShell](/powershell/azure/install-az-ps)\n"
  },
  {
    "path": "articles/includes/cloud-shell-try-it.md",
    "content": "---\nauthor: sptramer\nms.service: azure\nms.topic: include\nms.date: 06/13/2019\nms.author: sttramer\n---\n\n## Use Azure Cloud Shell\n\nAzure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. You can use either Bash or PowerShell with Cloud Shell to work with Azure services. You can use the Cloud Shell preinstalled commands to run the code in this article without having to install anything on your local environment.\n\nTo start Azure Cloud Shell:\n\n| Option | Example/Link |\n|-----------------------------------------------|---|\n| Select **Try It** in the upper-right corner of a code block. Selecting **Try It** doesn't automatically copy the code to Cloud Shell. | ![Example of Try It for Azure Cloud Shell](./media/cloud-shell-try-it/hdi-azure-cli-try-it.png) |\n| Go to [https://shell.azure.com](https://shell.azure.com), or select the **Launch Cloud Shell** button to open Cloud Shell in your browser. | [![Launch Cloud Shell in a new window](media/cloud-shell-try-it/hdi-launch-cloud-shell.png)](https://shell.azure.com) |\n| Select the **Cloud Shell** button on the menu bar at the upper right in the [Azure portal](https://portal.azure.com). | ![Cloud Shell button in the Azure portal](./media/cloud-shell-try-it/hdi-cloud-shell-menu.png) |\n\nTo run the code in this article in Azure Cloud Shell:\n\n1. Start Cloud Shell.\n\n1. Select the **Copy** button on a code block to copy the code.\n\n1. Paste the code into the Cloud Shell session by selecting **Ctrl**+**Shift**+**V** on Windows and Linux or by selecting **Cmd**+**Shift**+**V** on macOS.\n\n1. Select **Enter** to run the code.\n"
  },
  {
    "path": "articles/includes/create-resource-group.md",
    "content": "### [Azure portal](#tab/azure-portal)\n\n1. Open the Azure portal in a web browser. \n1. In the search bar, enter **resource groups** and select it.\n1. Select **+ Create**.\n1. Enter your resource group settings:\n\n    |Property|Value|\n    |--|--|\n    |Subscription|Select your subscription.|\n    |Resource group|Enter your resource group name. This resource group name is used as part of a resources URI when you access the Resource Manager (management plane). The name isn't used for control (such as creating a database) or data plane (inserting data into a table).|\n    |Region|Select a geographical region for the resource group.|\n\n1. Select **Review + create** to begin validation.\n1. When validation successes, select **Create**.\n\n### [Visual Studio Code](#tab/vscode)\n\n1. Open the command palette, <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>.\n1. Search for **create resource group** and select it.\n1. Answer the prompts using the following settings:\n\n    |Prompt|Value|\n    |--|--|\n    |Select subscription|Sign in to Azure if prompted. Select an existing subscription or create an Azure account if you don't have one.|\n    |Enter the name of the new resource group.|Enter your resource group name. This resource group name is used as part of a resources URI when you access the Resource Manager (management plane). The name isn't used for control (such as creating a database) or data plane (inserting data into a table).|\n    |Select a location for new resources.|Select a geographical region for the resource group.|\n\n\n### [Azure CLI](#tab/azure-cli)\n\n1. Log in to Azure:\n\n    ```azurecli\n    az login\n    ```\n\n    Complete the authentication in a browser.\n\n1. List your subscription names and IDs. Copy the **SubscriptionId** value to use the next command.\n\n    ```azurecli\n    az account subscription list --output table \n    ```\n\n1. Set your default subscription, used by subsequent commands:\n\n    ```azurecli\n    az account set --subscription YOUR_SUBSCRIPTION_ID\n    ```\n\n1. Select from a list of locations supported for your subscription. Copy the **Name** value of a region close to you.\n\n    ```azurecli\n    az account list-locations --output table\n    ```\n\n1. Use the following Azure CLI to create a resource group with your subscription name or ID:\n\n    ```azurecli\n    az group create --name \"YOUR_RESOURCE_GROUP_NAME\" --location YOUR_REGION\n    ```\n\n    For example:\n\n    ```azurecli\n    az group create --name \"my-azure-app\" --location westus\n    ```"
  },
  {
    "path": "articles/includes/delete-resource-group.md",
    "content": "### [Azure portal](#tab/azure-portal)\n\n1. Open the Azure portal in a web browser. \n1. In the search bar, enter **resource groups** and select it.\n1. Find and select your resource group.\n1. On the resource group's **Overview** page, select **Delete resource group**.\n1. On the panel, enter the resource group name and select **Delete**.\n\n### [Visual Studio Code](#tab/vscode)\n\n1. Open the command palette, <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>.\n1. Search for **delete resource group** and select it.\n1. Select your resource group and select **OK**.\n\n### [Azure CLI](#tab/azure-cli)\n\n1. Log in to Azure:\n\n    ```azurecli\n    az login\n    ```\n\n    Complete the authentication in a browser.\n\n1. Delete your resource group. \n\n    ```azurecli\n    az group delete --name \"YOUR-RESOURCE-GROUP-NAME\" -y\n    ```"
  },
  {
    "path": "articles/includes/dotnet-all.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| AI Agent Server - Agent Framework | NuGet [1.0.0-beta.11](https://www.nuget.org/packages/Azure.AI.AgentServer.AgentFramework/1.0.0-beta.11) | [docs](/dotnet/api/overview/azure/AI.AgentServer.AgentFramework-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.11](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.AgentFramework_1.0.0-beta.11/sdk/agentserver/Azure.AI.AgentServer.AgentFramework/) |\n| AI Agent Server - Contracts | NuGet [1.0.0-beta.11](https://www.nuget.org/packages/Azure.AI.AgentServer.Contracts/1.0.0-beta.11) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Contracts-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.11](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Contracts_1.0.0-beta.11/sdk/agentserver/Azure.AI.AgentServer.Contracts/) |\n| AI Agent Server - Core | NuGet [1.0.0-beta.23](https://www.nuget.org/packages/Azure.AI.AgentServer.Core/1.0.0-beta.23) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Core-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.23](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Core_1.0.0-beta.23/sdk/agentserver/Azure.AI.AgentServer.Core/) |\n| AI Agents Persistent | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Agents.Persistent/1.1.0)<br>NuGet [1.2.0-beta.10](https://www.nuget.org/packages/Azure.AI.Agents.Persistent/1.2.0-beta.10) | [docs](/dotnet/api/overview/azure/AI.Agents.Persistent-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Agents.Persistent_1.1.0/sdk/ai/Azure.AI.Agents.Persistent/)<br>GitHub [1.2.0-beta.10](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Agents.Persistent_1.2.0-beta.10/sdk/ai/Azure.AI.Agents.Persistent/) |\n| AI Foundry | NuGet [2.0.1](https://www.nuget.org/packages/Azure.AI.Projects/2.0.1)<br>NuGet [2.1.0-beta.1](https://www.nuget.org/packages/Azure.AI.Projects/2.1.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Projects-readme) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects_2.0.1/sdk/ai/Azure.AI.Projects/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects_2.1.0-beta.1/sdk/ai/Azure.AI.Projects/) |\n| AI Model Inference | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.AI.Inference/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/AI.Inference-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Inference_1.0.0-beta.5/sdk/ai/Azure.AI.Inference/) |\n| AI Projects - OpenAI | NuGet [2.0.0-beta.1](https://www.nuget.org/packages/Azure.AI.Projects.OpenAI/2.0.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Projects.OpenAI-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects.OpenAI_2.0.0-beta.1/sdk/ai/Azure.AI.Projects.OpenAI/) |\n| Anomaly Detector | NuGet [3.0.0-preview.7](https://www.nuget.org/packages/Azure.AI.AnomalyDetector/3.0.0-preview.7) | [docs](/dotnet/api/overview/azure/AI.AnomalyDetector-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [3.0.0-preview.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AnomalyDetector_3.0.0-preview.7/sdk/anomalydetector/Azure.AI.AnomalyDetector/) |\n| App Configuration | NuGet [1.9.0](https://www.nuget.org/packages/Azure.Data.AppConfiguration/1.9.0) | [docs](/dotnet/api/overview/azure/Data.AppConfiguration-readme) | GitHub [1.9.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.AppConfiguration_1.9.0/sdk/appconfiguration/Azure.Data.AppConfiguration/) |\n| App Configuration Provider | NuGet [8.5.0](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.AzureAppConfiguration/8.5.0)<br>NuGet [8.6.0-preview](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.AzureAppConfiguration/8.6.0-preview) | [docs](/dotnet/api/overview/azure/Microsoft.Extensions.Configuration.AzureAppConfiguration-readme) | GitHub [8.5.0](https://github.com/Azure/AppConfiguration-DotnetProvider) |\n| Attestation | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Security.Attestation/1.0.0) | [docs](/dotnet/api/overview/azure/Security.Attestation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.Attestation_1.0.0/sdk/attestation/Azure.Security.Attestation/) |\n| Azure AI Search | NuGet [12.0.0](https://www.nuget.org/packages/Azure.Search.Documents/12.0.0) | [docs](/dotnet/api/overview/azure/Search.Documents-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_12.0.0/sdk/search/Azure.Search.Documents/) |\n| Azure AI Transcription | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Speech.Transcription/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Speech.Transcription-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Speech.Transcription_1.0.0-beta.2/sdk/transcription/Azure.AI.Speech.Transcription/) |\n| Code Transparency | NuGet [1.0.0-beta.8](https://www.nuget.org/packages/Azure.Security.CodeTransparency/1.0.0-beta.8) | [docs](/dotnet/api/overview/azure/Security.CodeTransparency-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.8](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.CodeTransparency_1.0.0-beta.8/sdk/confidentialledger/Azure.Security.CodeTransparency/) |\n| Communication Call Automation | NuGet [1.5.1](https://www.nuget.org/packages/Azure.Communication.CallAutomation/1.5.1)<br>NuGet [1.6.0-beta.2](https://www.nuget.org/packages/Azure.Communication.CallAutomation/1.6.0-beta.2) | [docs](/dotnet/api/overview/azure/Communication.CallAutomation-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.CallAutomation_1.5.1/sdk/communication/Azure.Communication.CallAutomation/)<br>GitHub [1.6.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.CallAutomation_1.6.0-beta.2/sdk/communication/Azure.Communication.CallAutomation/) |\n| Communication Chat | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Communication.Chat/1.4.0) | [docs](/dotnet/api/overview/azure/Communication.Chat-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Chat_1.4.0/sdk/communication/Azure.Communication.Chat/) |\n| Communication Common | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Communication.Common/1.4.0)<br>NuGet [2.0.0-beta.1](https://www.nuget.org/packages/Azure.Communication.Common/2.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Communication.Common-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Common_1.4.0/sdk/communication/Azure.Communication.Common/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Common_2.0.0-beta.1/sdk/communication/Azure.Communication.Common/) |\n| Communication Email | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Communication.Email/1.1.0) | [docs](/dotnet/api/overview/azure/Communication.Email-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Email_1.1.0/sdk/communication/Azure.Communication.Email/) |\n| Communication Identity | NuGet [1.3.1](https://www.nuget.org/packages/Azure.Communication.Identity/1.3.1)<br>NuGet [1.4.0-beta.1](https://www.nuget.org/packages/Azure.Communication.Identity/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/Communication.Identity-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Identity_1.3.1/sdk/communication/Azure.Communication.Identity/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Identity_1.4.0-beta.1/sdk/communication/Azure.Communication.Identity/) |\n| Communication JobRouter | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Communication.JobRouter/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Communication.JobRouter/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Communication.JobRouter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.JobRouter_1.0.0/sdk/communication/Azure.Communication.JobRouter/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.JobRouter_1.1.0-beta.1/sdk/communication/Azure.Communication.JobRouter/) |\n| Communication Messages | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Communication.Messages/1.1.0)<br>NuGet [1.3.0-beta.2](https://www.nuget.org/packages/Azure.Communication.Messages/1.3.0-beta.2) | [docs](/dotnet/api/overview/azure/Communication.Messages-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Messages_1.1.0/sdk/communication/Azure.Communication.Messages/)<br>GitHub [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Messages_1.3.0-beta.2/sdk/communication/Azure.Communication.Messages/) |\n| Communication Phone Numbers | NuGet [1.5.0](https://www.nuget.org/packages/Azure.Communication.PhoneNumbers/1.5.0) | [docs](/dotnet/api/overview/azure/Communication.PhoneNumbers-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.PhoneNumbers_1.5.0/sdk/communication/Azure.Communication.PhoneNumbers/) |\n| Communication Rooms | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Communication.Rooms/1.2.0) | [docs](/dotnet/api/overview/azure/Communication.Rooms-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Rooms_1.2.0/sdk/communication/Azure.Communication.Rooms/) |\n| Communication SMS | NuGet [1.0.2](https://www.nuget.org/packages/Azure.Communication.Sms/1.0.2)<br>NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.Communication.Sms/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/Communication.Sms-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Sms_1.0.2/sdk/communication/Azure.Communication.Sms/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Sms_1.1.0-beta.3/sdk/communication/Azure.Communication.Sms/) |\n| Compute Batch | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Compute.Batch/1.0.0) | [docs](/dotnet/api/overview/azure/Compute.Batch-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Compute.Batch_1.0.0/sdk/batch/Azure.Compute.Batch/) |\n| Confidential Ledger | NuGet [1.3.0](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.3.0)<br>NuGet [1.4.1-beta.3](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.4.1-beta.3) | [docs](/dotnet/api/overview/azure/Security.ConfidentialLedger-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.3.0/sdk/confidentialledger/Azure.Security.ConfidentialLedger/)<br>GitHub [1.4.1-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.4.1-beta.3/sdk/confidentialledger/Azure.Security.ConfidentialLedger/) |\n| Container Registry | NuGet [1.3.0](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.3.0) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.3.0/sdk/containerregistry/Azure.Containers.ContainerRegistry/) |\n| Content Safety | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.ContentSafety/1.0.0) | [docs](/dotnet/api/overview/azure/AI.ContentSafety-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentSafety_1.0.0/sdk/contentsafety/Azure.AI.ContentSafety/) |\n| Content Understanding | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.ContentUnderstanding/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.AI.ContentUnderstanding/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.ContentUnderstanding-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentUnderstanding_1.1.0/sdk/contentunderstanding/Azure.AI.ContentUnderstanding/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentUnderstanding_1.2.0-beta.1/sdk/contentunderstanding/Azure.AI.ContentUnderstanding/) |\n| Conversational Language Understanding | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Language.Conversations/1.1.0)<br>NuGet [2.0.0-beta.5](https://www.nuget.org/packages/Azure.AI.Language.Conversations/2.0.0-beta.5) | [docs](/dotnet/api/overview/azure/AI.Language.Conversations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations_1.1.0/sdk/cognitivelanguage/Azure.AI.Language.Conversations/)<br>GitHub [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations_2.0.0-beta.5/sdk/cognitivelanguage/Azure.AI.Language.Conversations/) |\n| Conversations Authoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.AI.Language.Conversations.Authoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/AI.Language.Conversations.Authoring-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations.Authoring_1.0.0-beta.3/sdk/cognitivelanguage/Azure.AI.Language.Conversations.Authoring/) |\n| Core - Client - AMQP | NuGet [1.3.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.3.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.3.1/sdk/core/Azure.Core.Amqp/) |\n| Core - Client - Core | NuGet [1.55.0](https://www.nuget.org/packages/Azure.Core/1.55.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.55.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.55.0/sdk/core/Azure.Core/) |\n| Core - Client - Core | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Core.Expressions.DataFactory/1.0.0) | [docs](/dotnet/api/overview/azure/Core.Expressions.DataFactory-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Expressions.DataFactory_1.0.0/sdk/core/Azure.Core.Expressions.DataFactory/) |\n| Core Newtonsoft Json | NuGet [2.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.NewtonsoftJson/2.0.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Core.NewtonsoftJson-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.NewtonsoftJson_2.0.0/sdk/core/Microsoft.Azure.Core.NewtonsoftJson/) |\n| Core WCF Storage Queues | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.CoreWCF.Azure.StorageQueues/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.CoreWCF.Azure.StorageQueues-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.CoreWCF.Azure.StorageQueues_1.0.0-beta.1/sdk/extension-wcf/Microsoft.CoreWCF.Azure.StorageQueues/) |\n| Data Movement | NuGet [12.3.0](https://www.nuget.org/packages/Azure.Storage.DataMovement/12.3.0) | [docs](/dotnet/api/overview/azure/Storage.DataMovement-readme) | GitHub [12.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement_12.3.0/sdk/storage/Azure.Storage.DataMovement/) |\n| Data Movement - Blobs | NuGet [12.3.0](https://www.nuget.org/packages/Azure.Storage.DataMovement.Blobs/12.3.0) | [docs](/dotnet/api/overview/azure/Storage.DataMovement.Blobs-readme) | GitHub [12.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement.Blobs_12.3.0/sdk/storage/Azure.Storage.DataMovement.Blobs/) |\n| Data Movement - Files Shares | NuGet [12.3.0](https://www.nuget.org/packages/Azure.Storage.DataMovement.Files.Shares/12.3.0) | [docs](/dotnet/api/overview/azure/Storage.DataMovement.Files.Shares-readme) | GitHub [12.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement.Files.Shares_12.3.0/sdk/storage/Azure.Storage.DataMovement.Files.Shares/) |\n| Defender EASM | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Defender.Easm/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Defender.Easm-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Defender.Easm_1.0.0-beta.1/sdk/easm/Azure.Analytics.Defender.Easm/) |\n| Dev Center | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.DevCenter/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.DevCenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.DevCenter_1.0.0/sdk/devcenter/Azure.Developer.DevCenter/) |\n| Device Update | NuGet [1.0.0](https://www.nuget.org/packages/Azure.IoT.DeviceUpdate/1.0.0) | [docs](/dotnet/api/overview/azure/IoT.DeviceUpdate-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.DeviceUpdate_1.0.0/sdk/deviceupdate/Azure.IoT.DeviceUpdate/) |\n| Digital Twins | NuGet [1.6.0](https://www.nuget.org/packages/Azure.DigitalTwins.Core/1.6.0) | [docs](/dotnet/api/overview/azure/DigitalTwins.Core-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.DigitalTwins.Core_1.6.0/sdk/digitaltwins/Azure.DigitalTwins.Core/) |\n| Document Intelligence | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.DocumentIntelligence/1.0.0) | [docs](/dotnet/api/overview/azure/AI.DocumentIntelligence-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.DocumentIntelligence_1.0.0/sdk/documentintelligence/Azure.AI.DocumentIntelligence/) |\n| Document Translation | NuGet [2.0.0](https://www.nuget.org/packages/Azure.AI.Translation.Document/2.0.0) | [docs](/dotnet/api/overview/azure/AI.Translation.Document-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Document_2.0.0/sdk/translation/Azure.AI.Translation.Document/) |\n| Event Grid | NuGet [5.0.0](https://www.nuget.org/packages/Azure.Messaging.EventGrid/5.0.0) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid_5.0.0/sdk/eventgrid/Azure.Messaging.EventGrid/) |\n| Event Grid Namespaces | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Messaging.EventGrid.Namespaces/1.1.0) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid.Namespaces-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid.Namespaces_1.1.0/sdk/eventgrid/Azure.Messaging.EventGrid.Namespaces/) |\n| Event Hubs | NuGet [5.12.2](https://www.nuget.org/packages/Azure.Messaging.EventHubs/5.12.2) | [docs](/dotnet/api/overview/azure/Messaging.EventHubs-readme) | GitHub [5.12.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventHubs_5.12.2/sdk/eventhub/Azure.Messaging.EventHubs/) |\n| Event Hubs - Event Processor | NuGet [5.12.2](https://www.nuget.org/packages/Azure.Messaging.EventHubs.Processor/5.12.2) | [docs](/dotnet/api/overview/azure/Messaging.EventHubs.Processor-readme) | GitHub [5.12.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventHubs.Processor_5.12.2/sdk/eventhub/Azure.Messaging.EventHubs.Processor/) |\n| Face | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Vision.Face/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Vision.Face-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Vision.Face_1.0.0-beta.2/sdk/face/Azure.AI.Vision.Face/) |\n| FarmBeats | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Verticals.AgriFood.Farming/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Verticals.AgriFood.Farming-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Verticals.AgriFood.Farming_1.0.0-beta.2/sdk/agrifood/Azure.Verticals.AgriFood.Farming/) |\n| Form Recognizer | NuGet [4.1.0](https://www.nuget.org/packages/Azure.AI.FormRecognizer/4.1.0) | [docs](/dotnet/api/overview/azure/AI.FormRecognizer-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.FormRecognizer_4.1.0/sdk/formrecognizer/Azure.AI.FormRecognizer/) |\n| Functions Extensions - WebPubSub | NuGet [1.7.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.WebPubSub/1.7.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Functions.Worker.Extensions.WebPubSub-readme) | GitHub [1.7.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Functions.Worker.Extensions.WebPubSub_1.7.0/sdk/webpubsub/Microsoft.Azure.Functions.Worker.Extensions.WebPubSub/) |\n| Health Deidentification | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Health.Deidentification/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Health.Deidentification/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Health.Deidentification-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Deidentification_1.0.0/sdk/healthdataaiservices/Azure.Health.Deidentification/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Deidentification_1.1.0-beta.1/sdk/healthdataaiservices/Azure.Health.Deidentification/) |\n| Health Insights Cancer Profiling | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Health.Insights.CancerProfiling/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Health.Insights.CancerProfiling-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.CancerProfiling_1.0.0-beta.1/sdk/healthinsights/Azure.Health.Insights.CancerProfiling/) |\n| Health Insights Clinical Matching | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Health.Insights.ClinicalMatching/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Health.Insights.ClinicalMatching-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.ClinicalMatching_1.0.0-beta.1/sdk/healthinsights/Azure.Health.Insights.ClinicalMatching/) |\n| Health Insights Radiology Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Health.Insights.RadiologyInsights/1.1.0) | [docs](/dotnet/api/overview/azure/Health.Insights.RadiologyInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.RadiologyInsights_1.1.0/sdk/healthinsights/Azure.Health.Insights.RadiologyInsights/) |\n| Identity | NuGet [1.21.0](https://www.nuget.org/packages/Azure.Identity/1.21.0) | [docs](/dotnet/api/overview/azure/Identity-readme) | GitHub [1.21.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.21.0/sdk/identity/Azure.Identity/) |\n| Identity Broker | NuGet [1.6.0](https://www.nuget.org/packages/Azure.Identity.Broker/1.6.0) | [docs](/dotnet/api/overview/azure/Identity.Broker-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity.Broker_1.6.0/sdk/identity/Azure.Identity.Broker/) |\n| Image Analysis | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.Vision.ImageAnalysis/1.0.0) | [docs](/dotnet/api/overview/azure/AI.Vision.ImageAnalysis-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Vision.ImageAnalysis_1.0.0/sdk/vision/Azure.AI.Vision.ImageAnalysis/) |\n| Key Vault - Administration | NuGet [4.8.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.8.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Administration-readme) | GitHub [4.8.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.8.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) |\n| Key Vault - Certificates | NuGet [4.8.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.8.0)<br>NuGet [4.9.0-beta.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.9.0-beta.1) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.8.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.8.0/sdk/keyvault/Azure.Security.KeyVault.Certificates/)<br>GitHub [4.9.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.9.0-beta.1/sdk/keyvault/Azure.Security.KeyVault.Certificates/) |\n| Key Vault - Keys | NuGet [4.10.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.10.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Keys-readme) | GitHub [4.10.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.10.0/sdk/keyvault/Azure.Security.KeyVault.Keys/) |\n| Key Vault - Secrets | NuGet [4.11.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.11.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Secrets-readme) | GitHub [4.11.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.11.0/sdk/keyvault/Azure.Security.KeyVault.Secrets/) |\n| Language Text | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.Language.Text/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.Language.Text-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Text_1.0.0-beta.4/sdk/cognitivelanguage/Azure.AI.Language.Text/) |\n| Load Testing | NuGet [1.0.2](https://www.nuget.org/packages/Azure.Developer.LoadTesting/1.0.2)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.Developer.LoadTesting/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/Developer.LoadTesting-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.LoadTesting_1.0.2/sdk/loadtestservice/Azure.Developer.LoadTesting/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.LoadTesting_1.3.0-beta.1/sdk/loadtestservice/Azure.Developer.LoadTesting/) |\n| Maps Common | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Maps.Common/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Maps.Common-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.Common_1.0.0-beta.4/sdk/maps/Azure.Maps.Common/) |\n| Maps Geolocation | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Maps.Geolocation/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Maps.Geolocation-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.Geolocation_1.0.0-beta.3/sdk/maps/Azure.Maps.Geolocation/) |\n| Maps Render | NuGet [2.0.0-beta.1](https://www.nuget.org/packages/Azure.Maps.Rendering/2.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Maps.Rendering-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.Rendering_2.0.0-beta.1/sdk/maps/Azure.Maps.Rendering/) |\n| Maps Route | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Maps.Routing/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Maps.Routing-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.Routing_1.0.0-beta.4/sdk/maps/Azure.Maps.Routing/) |\n| Maps Search | NuGet [2.0.0-beta.5](https://www.nuget.org/packages/Azure.Maps.Search/2.0.0-beta.5) | [docs](/dotnet/api/overview/azure/Maps.Search-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.Search_2.0.0-beta.5/sdk/maps/Azure.Maps.Search/) |\n| Media Analytics Edge | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Media.Analytics.Edge/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Media.Analytics.Edge-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Media.Analytics.Edge_1.0.0-beta.1/sdk/mediaservices/Azure.Media.Analytics.Edge) |\n| Metrics Advisor | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.MetricsAdvisor/1.1.0) | [docs](/dotnet/api/overview/azure/AI.MetricsAdvisor-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.MetricsAdvisor_1.1.0/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/) |\n| Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents/1.1.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents_1.1.0/sdk/entra/Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents/) |\n| Microsoft.Azure.WebPubSub.AspNetCore | NuGet [1.5.0](https://www.nuget.org/packages/Microsoft.Azure.WebPubSub.AspNetCore/1.5.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebPubSub.AspNetCore-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebPubSub.AspNetCore_1.5.0/sdk/webpubsub/Microsoft.Azure.WebPubSub.AspNetCore/) |\n| Microsoft.Azure.WebPubSub.Common | NuGet [1.5.0](https://www.nuget.org/packages/Microsoft.Azure.WebPubSub.Common/1.5.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebPubSub.Common-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebPubSub.Common_1.5.0/sdk/webpubsub/Microsoft.Azure.WebPubSub.Common/) |\n| Models Repository | NuGet [1.0.0-preview.6](https://www.nuget.org/packages/Azure.IoT.ModelsRepository/1.0.0-preview.6) | [docs](/dotnet/api/overview/azure/IoT.ModelsRepository-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-preview.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.ModelsRepository_1.0.0-preview.6/sdk/modelsrepository/Azure.IoT.ModelsRepository/) |\n| Monitor Ingestion | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Monitor.Ingestion/1.2.0) | [docs](/dotnet/api/overview/azure/Monitor.Ingestion-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Ingestion_1.2.0/sdk/monitor/Azure.Monitor.Ingestion/) |\n| Monitor Query Logs | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Monitor.Query.Logs/1.0.0) | [docs](/dotnet/api/overview/azure/Monitor.Query.Logs-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query.Logs_1.0.0/sdk/monitor/Azure.Monitor.Query.Logs/) |\n| Monitor Query Metrics | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Monitor.Query.Metrics/1.0.0) | [docs](/dotnet/api/overview/azure/Monitor.Query.Metrics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query.Metrics_1.0.0/sdk/monitor/Azure.Monitor.Query.Metrics/) |\n| Online Experimentation | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.OnlineExperimentation/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.OnlineExperimentation-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.OnlineExperimentation_1.0.0-beta.1/sdk/onlineexperimentation/Azure.Analytics.OnlineExperimentation/) |\n| OpenAI Assistants | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.OpenAI.Assistants/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.OpenAI.Assistants-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI.Assistants_1.0.0-beta.4/sdk/openai/Azure.AI.OpenAI.Assistants/) |\n| OpenAI Inference | NuGet [2.1.0](https://www.nuget.org/packages/Azure.AI.OpenAI/2.1.0)<br>NuGet [2.9.0-beta.1](https://www.nuget.org/packages/Azure.AI.OpenAI/2.9.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.OpenAI-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI_2.1.0/sdk/openai/Azure.AI.OpenAI/)<br>GitHub [2.9.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI_2.9.0-beta.1/sdk/openai/Azure.AI.OpenAI/) |\n| OpenTelemetry AspNetCore | NuGet [1.5.0](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.AspNetCore/1.5.0) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.AspNetCore-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.AspNetCore_1.5.0/sdk/monitor/Azure.Monitor.OpenTelemetry.AspNetCore/) |\n| OpenTelemetry Exporter | NuGet [1.8.0](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.Exporter/1.8.0) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.Exporter-readme) | GitHub [1.8.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.Exporter_1.8.0/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/) |\n| Personalizer | NuGet [2.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Personalizer/2.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Personalizer-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Personalizer_2.0.0-beta.2/sdk/personalizer/Azure.AI.Personalizer/) |\n| Playwright | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.Playwright/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.Playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright_1.0.0/sdk/loadtestservice/Azure.Developer.Playwright/) |\n| Playwright NUnit | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.Playwright.NUnit/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.Playwright.NUnit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright.NUnit_1.0.0/sdk/loadtestservice/Azure.Developer.Playwright.NUnit/) |\n| Provisioning | NuGet [1.5.0](https://www.nuget.org/packages/Azure.Provisioning/1.5.0)<br>NuGet [1.6.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning/1.6.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.5.0/sdk/provisioning/Azure.Provisioning/)<br>GitHub [1.6.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.6.0-beta.1/sdk/provisioning/Azure.Provisioning/) |\n| Provisioning - Resources | NuGet [0.2.0](https://www.nuget.org/packages/Azure.Provisioning.Resources/0.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.Resources-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Resources_0.2.0/sdk/provisioning/Azure.Provisioning.Resources/) |\n| Purview Account | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Account/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Account-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Account_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Account/) |\n| Purview Administration | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Administration/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Administration-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Administration_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Administration/) |\n| Purview Data Map | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Analytics.Purview.DataMap/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Analytics.Purview.DataMap-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.DataMap_1.0.0-beta.2/sdk/purview/Azure.Analytics.Purview.DataMap/) |\n| Purview Scanning | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Analytics.Purview.Scanning/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Scanning-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Scanning_1.0.0-beta.2/sdk/purview/Azure.Analytics.Purview.Scanning/) |\n| Purview Sharing | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Analytics.Purview.Sharing/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Sharing-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Sharing_1.0.0-beta.3/sdk/purview/Azure.Analytics.Purview.Sharing/) |\n| Purview Workflow | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Analytics.Purview.Workflows/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Workflows-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Workflows_1.0.0-beta.2/sdk/purview/Azure.Analytics.Purview.Workflows/) |\n| Quantum Jobs | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Quantum.Jobs/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Quantum.Jobs-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Quantum.Jobs_1.0.0-beta.3/sdk/quantum/Azure.Quantum.Jobs/) |\n| Question Answering | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Language.QuestionAnswering/1.1.0) | [docs](/dotnet/api/overview/azure/AI.Language.QuestionAnswering-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.QuestionAnswering_1.1.0/sdk/cognitivelanguage/Azure.AI.Language.QuestionAnswering/) |\n| Question Answering | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.AI.Language.QuestionAnswering.Inference/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Language.QuestionAnswering.Inference-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.QuestionAnswering.Inference_1.0.0-beta.1/sdk/cognitivelanguage/Azure.AI.Language.QuestionAnswering.Inference/) |\n| Question Answering Authoring | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.AI.Language.QuestionAnswering.Authoring/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Language.QuestionAnswering.Authoring-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.QuestionAnswering.Authoring_1.0.0-beta.1/sdk/cognitivelanguage/Azure.AI.Language.QuestionAnswering.Authoring/) |\n| Schema Registry | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Data.SchemaRegistry/1.4.0) | [docs](/dotnet/api/overview/azure/Data.SchemaRegistry-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.SchemaRegistry_1.4.0/sdk/schemaregistry/Azure.Data.SchemaRegistry/) |\n| Schema Registry - Avro | NuGet [1.0.1](https://www.nuget.org/packages/Microsoft.Azure.Data.SchemaRegistry.ApacheAvro/1.0.1) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Data.SchemaRegistry.ApacheAvro-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Data.SchemaRegistry.ApacheAvro_1.0.1/sdk/schemaregistry/Microsoft.Azure.Data.SchemaRegistry.ApacheAvro/) |\n| Service Bus | NuGet [7.20.1](https://www.nuget.org/packages/Azure.Messaging.ServiceBus/7.20.1) | [docs](/dotnet/api/overview/azure/Messaging.ServiceBus-readme) | GitHub [7.20.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.ServiceBus_7.20.1/sdk/servicebus/Azure.Messaging.ServiceBus/) |\n| Storage - Blobs | NuGet [12.27.0](https://www.nuget.org/packages/Azure.Storage.Blobs/12.27.0)<br>NuGet [12.29.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Blobs/12.29.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Blobs-readme) | GitHub [12.27.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs_12.27.0/sdk/storage/Azure.Storage.Blobs/)<br>GitHub [12.29.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs_12.29.0-beta.1/sdk/storage/Azure.Storage.Blobs/) |\n| Storage - Blobs Batch | NuGet [12.24.0](https://www.nuget.org/packages/Azure.Storage.Blobs.Batch/12.24.0)<br>NuGet [12.26.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Blobs.Batch/12.26.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Blobs.Batch-readme) | GitHub [12.24.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs.Batch_12.24.0/sdk/storage/Azure.Storage.Blobs.Batch/)<br>GitHub [12.26.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs.Batch_12.26.0-beta.1/sdk/storage/Azure.Storage.Blobs.Batch/) |\n| Storage - Blobs ChangeFeed | NuGet [12.0.0-preview.61](https://www.nuget.org/packages/Azure.Storage.Blobs.ChangeFeed/12.0.0-preview.61) | [docs](/dotnet/api/overview/azure/Storage.Blobs.ChangeFeed-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [12.0.0-preview.61](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs.ChangeFeed_12.0.0-preview.61/sdk/storage/Azure.Storage.Blobs.ChangeFeed/) |\n| Storage - Files Data Lake | NuGet [12.25.0](https://www.nuget.org/packages/Azure.Storage.Files.DataLake/12.25.0)<br>NuGet [12.27.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Files.DataLake/12.27.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Files.DataLake-readme) | GitHub [12.25.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Files.DataLake_12.25.0/sdk/storage/Azure.Storage.Files.DataLake/)<br>GitHub [12.27.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Files.DataLake_12.27.0-beta.1/sdk/storage/Azure.Storage.Files.DataLake/) |\n| Storage - Files Share | NuGet [12.25.0](https://www.nuget.org/packages/Azure.Storage.Files.Shares/12.25.0)<br>NuGet [12.27.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Files.Shares/12.27.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Files.Shares-readme) | GitHub [12.25.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Files.Shares_12.25.0/sdk/storage/Azure.Storage.Files.Shares/)<br>GitHub [12.27.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Files.Shares_12.27.0-beta.1/sdk/storage/Azure.Storage.Files.Shares/) |\n| Storage - Queues | NuGet [12.25.0](https://www.nuget.org/packages/Azure.Storage.Queues/12.25.0)<br>NuGet [12.27.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Queues/12.27.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Queues-readme) | GitHub [12.25.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Queues_12.25.0/sdk/storage/Azure.Storage.Queues/)<br>GitHub [12.27.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Queues_12.27.0-beta.1/sdk/storage/Azure.Storage.Queues/) |\n| Synapse - AccessControl | NuGet [1.0.0-preview.5](https://www.nuget.org/packages/Azure.Analytics.Synapse.AccessControl/1.0.0-preview.5) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.AccessControl-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-preview.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.AccessControl_1.0.0-preview.5/sdk/synapse/Azure.Analytics.Synapse.AccessControl/) |\n| Synapse - Artifacts | NuGet [1.0.0-preview.23](https://www.nuget.org/packages/Azure.Analytics.Synapse.Artifacts/1.0.0-preview.23) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Artifacts-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-preview.23](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Artifacts_1.0.0-preview.23/sdk/synapse/Azure.Analytics.Synapse.Artifacts/) |\n| Synapse - Managed Private Endpoints | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.Analytics.Synapse.ManagedPrivateEndpoints/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.ManagedPrivateEndpoints-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.ManagedPrivateEndpoints_1.0.0-beta.5/sdk/synapse/Azure.Analytics.Synapse.ManagedPrivateEndpoints/) |\n| Synapse - Monitoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Analytics.Synapse.Monitoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Monitoring-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Monitoring_1.0.0-beta.3/sdk/synapse/Azure.Analytics.Synapse.Monitoring/) |\n| Synapse - Spark | NuGet [1.0.0-preview.8](https://www.nuget.org/packages/Azure.Analytics.Synapse.Spark/1.0.0-preview.8) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Spark-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-preview.8](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Spark_1.0.0-preview.8/sdk/synapse/Azure.Analytics.Synapse.Spark/) |\n| System Events | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Messaging.EventGrid.SystemEvents/1.0.0) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid.SystemEvents-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid.SystemEvents_1.0.0/sdk/eventgrid/Azure.Messaging.EventGrid.SystemEvents/) |\n| System.ClientModel | NuGet [1.11.0](https://www.nuget.org/packages/System.ClientModel/1.11.0) | [docs](/dotnet/api/overview/azure/System.ClientModel-readme) | GitHub [1.11.0](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.11.0/sdk/core/System.ClientModel/) |\n| Tables | NuGet [12.11.0](https://www.nuget.org/packages/Azure.Data.Tables/12.11.0) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.11.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.11.0/sdk/tables/Azure.Data.Tables/) |\n| Text Analytics | NuGet [5.3.0](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.3.0) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme) | GitHub [5.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.3.0/sdk/textanalytics/Azure.AI.TextAnalytics/) |\n| Text Authoring | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Language.Text.Authoring/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Language.Text.Authoring-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Text.Authoring_1.0.0-beta.2/sdk/cognitivelanguage/Azure.AI.Language.Text.Authoring/) |\n| Text Translation | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.Translation.Text/1.0.0)<br>NuGet [2.0.0-beta.1](https://www.nuget.org/packages/Azure.AI.Translation.Text/2.0.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Translation.Text-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Text_1.0.0/sdk/translation/Azure.AI.Translation.Text/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Text_2.0.0-beta.1/sdk/translation/Azure.AI.Translation.Text/) |\n| Time Series Insights | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.IoT.TimeSeriesInsights/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/IoT.TimeSeriesInsights-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.TimeSeriesInsights_1.0.0-beta.1/sdk/timeseriesinsights/Azure.IoT.TimeSeriesInsights/) |\n| TimeZone | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Maps.TimeZones/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Maps.TimeZones-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.TimeZones_1.0.0-beta.1/sdk/maps/Azure.Maps.TimeZones/) |\n| unknown | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.AI.AgentServer.Invocations/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Invocations-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Invocations_1.0.0-beta.3/sdk/agentserver/Azure.AI.AgentServer.Invocations/) |\n| unknown | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.AgentServer.Responses/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Responses-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Responses_1.0.0-beta.4/sdk/agentserver/Azure.AI.AgentServer.Responses/) |\n| unknown | NuGet [2.0.0](https://www.nuget.org/packages/Azure.AI.Extensions.OpenAI/2.0.0)<br>NuGet [2.1.0-beta.1](https://www.nuget.org/packages/Azure.AI.Extensions.OpenAI/2.1.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Extensions.OpenAI-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Extensions.OpenAI_2.0.0/sdk/ai/Azure.AI.Extensions.OpenAI/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Extensions.OpenAI_2.1.0-beta.1/sdk/ai/Azure.AI.Extensions.OpenAI/) |\n| unknown | NuGet [2.0.0](https://www.nuget.org/packages/Azure.AI.Projects.Agents/2.0.0)<br>NuGet [2.1.0-beta.1](https://www.nuget.org/packages/Azure.AI.Projects.Agents/2.1.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Projects.Agents-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects.Agents_2.0.0/sdk/ai/Azure.AI.Projects.Agents/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects.Agents_2.1.0-beta.1/sdk/ai/Azure.AI.Projects.Agents/) |\n| unknown | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.PostgreSQL.Auth/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.PostgreSQL.Auth-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.PostgreSQL.Auth_1.0.0-beta.1/sdk/postgresql/Microsoft.Azure.PostgreSQL.Auth/) |\n| Vision Common | NuGet [0.15.1-beta.1](https://www.nuget.org/packages/Azure.AI.Vision.Common/0.15.1-beta.1) |  | GitHub [0.15.1-beta.1](https://msasg.visualstudio.com/Skyman/_git/Carbon) |\n| Voice Live | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.VoiceLive/1.0.0)<br>NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.AI.VoiceLive/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/AI.VoiceLive-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.VoiceLive_1.0.0/sdk/voicelive/Azure.AI.VoiceLive/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.VoiceLive_1.1.0-beta.3/sdk/voicelive/Azure.AI.VoiceLive/) |\n| WCF Storage Queues | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.WCF.Azure.StorageQueues/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.WCF.Azure.StorageQueues-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.WCF.Azure.StorageQueues_1.0.0-beta.1/sdk/extension-wcf/Microsoft.WCF.Azure.StorageQueues/) |\n| Web PubSub | NuGet [1.6.0](https://www.nuget.org/packages/Azure.Messaging.WebPubSub/1.6.0) | [docs](/dotnet/api/overview/azure/Messaging.WebPubSub-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.WebPubSub_1.6.0/sdk/webpubsub/Azure.Messaging.WebPubSub/) |\n| Web PubSub Client | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Messaging.WebPubSub.Client/1.0.0) | [docs](/dotnet/api/overview/azure/Messaging.WebPubSub.Client-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.WebPubSub.Client_1.0.0/sdk/webpubsub/Azure.Messaging.WebPubSub.Client/) |\n| Azure client library integration for ASP.NET Core | NuGet [1.14.0](https://www.nuget.org/packages/Microsoft.Extensions.Azure/1.14.0) | [docs](/dotnet/api/overview/azure/Microsoft.Extensions.Azure-readme) | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Extensions.Azure_1.14.0/sdk/extensions/Microsoft.Extensions.Azure/) |\n| Blob Storage Key Store for .NET Data Protection | NuGet [1.5.3](https://www.nuget.org/packages/Azure.Extensions.AspNetCore.DataProtection.Blobs/1.5.3) | [docs](/dotnet/api/overview/azure/Extensions.AspNetCore.DataProtection.Blobs-readme) | GitHub [1.5.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Extensions.AspNetCore.DataProtection.Blobs_1.5.3/sdk/extensions/Azure.Extensions.AspNetCore.DataProtection.Blobs/) |\n| CloudNative CloudEvents with Event Grid  | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents/1.0.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents_1.0.0/sdk/eventgrid/Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents/) |\n| Core - Client - Spatial | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Core.Spatial-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.Spatial_1.1.0/sdk/core/Microsoft.Azure.Core.Spatial/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.Spatial_1.2.0-beta.1/sdk/core/Microsoft.Azure.Core.Spatial/) |\n| Core - Client - Spatial Newtonsoft Json | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial.NewtonsoftJson/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial.NewtonsoftJson/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Core.Spatial.NewtonsoftJson-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.Spatial.NewtonsoftJson_1.0.0/sdk/core/Microsoft.Azure.Core.Spatial.NewtonsoftJson/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.Spatial.NewtonsoftJson_1.1.0-beta.1/sdk/core/Microsoft.Azure.Core.Spatial.NewtonsoftJson/) |\n| Functions extension for Azure Tables | NuGet [1.4.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Tables/1.4.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Tables-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.Tables_1.4.0/sdk/tables/Microsoft.Azure.WebJobs.Extensions.Tables/) |\n| Key Encryptor for .NET Data Protection | NuGet [1.6.3](https://www.nuget.org/packages/Azure.Extensions.AspNetCore.DataProtection.Keys/1.6.3) | [docs](/dotnet/api/overview/azure/Extensions.AspNetCore.DataProtection.Keys-readme) | GitHub [1.6.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Extensions.AspNetCore.DataProtection.Keys_1.6.3/sdk/extensions/Azure.Extensions.AspNetCore.DataProtection.Keys/) |\n| Secrets Configuration Provider for .NET | NuGet [1.5.1](https://www.nuget.org/packages/Azure.Extensions.AspNetCore.Configuration.Secrets/1.5.1) | [docs](/dotnet/api/overview/azure/Extensions.AspNetCore.Configuration.Secrets-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Extensions.AspNetCore.Configuration.Secrets_1.5.1/sdk/extensions/Azure.Extensions.AspNetCore.Configuration.Secrets/) |\n| Storage - Common | NuGet [12.26.0](https://www.nuget.org/packages/Azure.Storage.Common/12.26.0)<br>NuGet [12.28.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Common/12.28.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Common-readme) | GitHub [12.26.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Common_12.26.0/sdk/storage/Azure.Storage.Common/)<br>GitHub [12.28.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Common_12.28.0-beta.1/sdk/storage/Azure.Storage.Common/) |\n| WebJobs Extensions - Event Grid | NuGet [3.5.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.5.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventGrid-readme) | GitHub [3.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.EventGrid_3.5.0/sdk/eventgrid/Microsoft.Azure.WebJobs.Extensions.EventGrid/) |\n| WebJobs Extensions - Event Hubs | NuGet [6.5.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/6.5.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventHubs-readme) | GitHub [6.5.3](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.EventHubs_6.5.3/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/) |\n| WebJobs Extensions - Service Bus | NuGet [5.17.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ServiceBus/5.17.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.ServiceBus-readme) | GitHub [5.17.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.ServiceBus_5.17.0/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/) |\n| WebJobs Extensions - SignalR Service | NuGet [2.1.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.SignalRService/2.1.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.SignalRService-readme) | GitHub [2.1.0](https://github.com/Azure/azure-functions-signalrservice-extension/tree/v1.2.0/src/SignalRServiceExtension) |\n| WebJobs Extensions - Storage | NuGet [5.3.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage/5.3.7) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage-readme) | GitHub [5.3.7](https://github.com/Azure/azure-webjobs-sdk/tree/master/src/Microsoft.Azure.WebJobs.Extensions.Storage) |\n| WebJobs Extensions - Web PubSub | NuGet [1.10.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.WebPubSub/1.10.1) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.WebPubSub-readme) | GitHub [1.10.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.WebPubSub_1.10.1/sdk/webpubsub/Microsoft.Azure.WebJobs.Extensions.WebPubSub/) |\n| Functions extension for Blob Storage | NuGet [5.3.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/5.3.7) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs-readme) | GitHub [5.3.7](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs_5.3.7/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/) |\n| Functions extension for Storage Queues | NuGet [5.3.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/5.3.7) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage.Queues-readme) | GitHub [5.3.7](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.Storage.Queues_5.3.7/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/) |\n| Functions extension for WebPubSub for SocketIO | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO/1.0.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO_1.0.0/sdk/webpubsub/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO/) |\n| Provisioning - Apimanagement | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ApiManagement/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ApiManagement-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ApiManagement_1.0.0-beta.1/sdk/apimanagement/Azure.Provisioning.ApiManagement/) |\n| Provisioning - App Configuration | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.AppConfiguration/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.AppConfiguration/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.AppConfiguration-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppConfiguration_1.1.0/sdk/provisioning/Azure.Provisioning.AppConfiguration/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppConfiguration_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.AppConfiguration/) |\n| Provisioning - App Containers | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Provisioning.AppContainers/1.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.AppContainers-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppContainers_1.2.0/sdk/provisioning/Azure.Provisioning.AppContainers/) |\n| Provisioning - App Service | NuGet [1.3.1](https://www.nuget.org/packages/Azure.Provisioning.AppService/1.3.1)<br>NuGet [1.4.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.AppService/1.4.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.AppService-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppService_1.3.1/sdk/provisioning/Azure.Provisioning.AppService/)<br>GitHub [1.4.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppService_1.4.0-beta.2/sdk/provisioning/Azure.Provisioning.AppService/) |\n| Provisioning - Application Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.ApplicationInsights/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ApplicationInsights/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ApplicationInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ApplicationInsights_1.1.0/sdk/provisioning/Azure.Provisioning.ApplicationInsights/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ApplicationInsights_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.ApplicationInsights/) |\n| Provisioning - Batch | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Batch/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Batch-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Batch_1.0.0-beta.1/sdk/batch/Azure.Provisioning.Batch/) |\n| Provisioning - Cdn | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.Cdn/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.Cdn-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Cdn_1.0.0-beta.2/sdk/cdn/Azure.Provisioning.Cdn/) |\n| Provisioning - Cognitive Services | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Provisioning.CognitiveServices/1.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.CognitiveServices-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.CognitiveServices_1.2.0/sdk/provisioning/Azure.Provisioning.CognitiveServices/) |\n| Provisioning - Communication | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Provisioning.Communication/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Provisioning.Communication-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Communication_1.0.0-beta.4/sdk/provisioning/Azure.Provisioning.Communication/) |\n| Provisioning - Compute | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Compute/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Compute-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Compute_1.0.0-beta.1/sdk/compute/Azure.Provisioning.Compute/) |\n| Provisioning - Container Registry | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.ContainerRegistry/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.ContainerRegistry-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ContainerRegistry_1.1.0/sdk/provisioning/Azure.Provisioning.ContainerRegistry/) |\n| Provisioning - Container Service | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.Provisioning.ContainerService/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Provisioning.ContainerService-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ContainerService_1.0.0-beta.6/sdk/containerservice/Azure.Provisioning.ContainerService/) |\n| Provisioning - Containerinstance | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ContainerInstance/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ContainerInstance-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ContainerInstance_1.0.0-beta.1/sdk/containerinstance/Azure.Provisioning.ContainerInstance/) |\n| Provisioning - CosmosDB | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Provisioning.CosmosDB/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.CosmosDB/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.CosmosDB-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.CosmosDB_1.0.0/sdk/provisioning/Azure.Provisioning.CosmosDB/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.CosmosDB_1.1.0-beta.1/sdk/provisioning/Azure.Provisioning.CosmosDB/) |\n| Provisioning - Deployment | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.Deployment/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.Deployment-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Deployment_1.0.0-beta.2/sdk/provisioning/Azure.Provisioning.Deployment/) |\n| Provisioning - Dns | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.Dns/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.Dns-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Dns_1.0.0-beta.2/sdk/provisioning/Azure.Provisioning.Dns/) |\n| Provisioning - Event Grid | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.EventGrid/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.EventGrid-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.EventGrid_1.1.0/sdk/provisioning/Azure.Provisioning.EventGrid/) |\n| Provisioning - Event Hubs | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.EventHubs/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.EventHubs-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.EventHubs_1.1.0/sdk/provisioning/Azure.Provisioning.EventHubs/) |\n| Provisioning - Frontdoor | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.FrontDoor/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.FrontDoor-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.FrontDoor_1.0.0-beta.1/sdk/provisioning/Azure.Provisioning.FrontDoor/) |\n| Provisioning - Key Vault | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.KeyVault/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.KeyVault/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.KeyVault-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.KeyVault_1.1.0/sdk/provisioning/Azure.Provisioning.KeyVault/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.KeyVault_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.KeyVault/) |\n| Provisioning - Kubernetes | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Provisioning.Kubernetes/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Provisioning.Kubernetes-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Kubernetes_1.0.0-beta.3/sdk/provisioning/Azure.Provisioning.Kubernetes/) |\n| Provisioning - Kubernetes Configuration | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Provisioning.KubernetesConfiguration/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Provisioning.KubernetesConfiguration-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.KubernetesConfiguration_1.0.0-beta.3/sdk/provisioning/Azure.Provisioning.KubernetesConfiguration/) |\n| Provisioning - Kusto | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.Kusto/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.Kusto-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Kusto_1.0.0-beta.2/sdk/provisioning/Azure.Provisioning.Kusto/) |\n| Provisioning - Logic | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Logic/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Logic-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Logic_1.0.0-beta.1/sdk/logic/Azure.Provisioning.Logic/) |\n| Provisioning - Monitor | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Monitor/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Monitor-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Monitor_1.0.0-beta.1/sdk/monitor/Azure.Provisioning.Monitor/) |\n| Provisioning - Mysql | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.MySql/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.MySql-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.MySql_1.0.0-beta.1/sdk/mysql/Azure.Provisioning.MySql/) |\n| Provisioning - Network | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.Network/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.Network-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Network_1.1.0/sdk/network/Azure.Provisioning.Network/) |\n| Provisioning - Operational Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.OperationalInsights/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.OperationalInsights/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.OperationalInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.OperationalInsights_1.1.0/sdk/provisioning/Azure.Provisioning.OperationalInsights/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.OperationalInsights_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.OperationalInsights/) |\n| Provisioning - PostgreSQL | NuGet [1.1.1](https://www.nuget.org/packages/Azure.Provisioning.PostgreSql/1.1.1)<br>NuGet [1.2.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.PostgreSql/1.2.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.PostgreSql-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.PostgreSql_1.1.1/sdk/provisioning/Azure.Provisioning.PostgreSql/)<br>GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.PostgreSql_1.2.0-beta.2/sdk/provisioning/Azure.Provisioning.PostgreSql/) |\n| Provisioning - Private DNS | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Provisioning.PrivateDns/1.0.0) | [docs](/dotnet/api/overview/azure/Provisioning.PrivateDns-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.PrivateDns_1.0.0/sdk/provisioning/Azure.Provisioning.PrivateDns/) |\n| Provisioning - Redis | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.Redis/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.Redis-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Redis_1.1.0/sdk/provisioning/Azure.Provisioning.Redis/) |\n| Provisioning - Redisenterprise | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.RedisEnterprise/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.RedisEnterprise-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.RedisEnterprise_1.1.0/sdk/provisioning/Azure.Provisioning.RedisEnterprise/) |\n| Provisioning - Resourcegraph | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ResourceGraph/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ResourceGraph-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ResourceGraph_1.0.0-beta.1/sdk/resourcegraph/Azure.Provisioning.ResourceGraph/) |\n| Provisioning - Search | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Provisioning.Search/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Search/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Search-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Search_1.0.0/sdk/provisioning/Azure.Provisioning.Search/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Search_1.1.0-beta.1/sdk/provisioning/Azure.Provisioning.Search/) |\n| Provisioning - Securitycenter | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.SecurityCenter/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.SecurityCenter-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.SecurityCenter_1.0.0-beta.1/sdk/securitycenter/Azure.Provisioning.SecurityCenter/) |\n| Provisioning - Service Bus | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.ServiceBus/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.ServiceBus-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ServiceBus_1.1.0/sdk/provisioning/Azure.Provisioning.ServiceBus/) |\n| Provisioning - Servicenetworking | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ServiceNetworking/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ServiceNetworking-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ServiceNetworking_1.0.0-beta.1/sdk/servicenetworking/Azure.Provisioning.ServiceNetworking/) |\n| Provisioning - SignalR | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.SignalR/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.SignalR-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.SignalR_1.1.0/sdk/provisioning/Azure.Provisioning.SignalR/) |\n| Provisioning - SQL | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.Sql/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Sql/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Sql-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Sql_1.1.0/sdk/provisioning/Azure.Provisioning.Sql/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Sql_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.Sql/) |\n| Provisioning - Storage | NuGet [1.1.2](https://www.nuget.org/packages/Azure.Provisioning.Storage/1.1.2)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Storage/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Storage-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Storage_1.1.2/sdk/provisioning/Azure.Provisioning.Storage/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Storage_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.Storage/) |\n| Provisioning - WebPubSub | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.WebPubSub/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.WebPubSub-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.WebPubSub_1.1.0/sdk/provisioning/Azure.Provisioning.WebPubSub/) |\n| Resource Management - Advisor | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.Advisor/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.Advisor-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Advisor_1.0.0-beta.6/sdk/advisor/Azure.ResourceManager.Advisor/) |\n| Resource Management - Agricultureplatform | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.AgriculturePlatform/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.AgriculturePlatform-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AgriculturePlatform_1.0.0-beta.2/sdk/agricultureplatform/Azure.ResourceManager.AgriculturePlatform/) |\n| Resource Management - Agrifood | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.AgFoodPlatform/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.AgFoodPlatform-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AgFoodPlatform_1.0.0-beta.6/sdk/agrifood/Azure.ResourceManager.AgFoodPlatform/) |\n| Resource Management - Alerts Management | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.AlertsManagement/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.AlertsManagement-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AlertsManagement_1.1.2/sdk/alertsmanagement/Azure.ResourceManager.AlertsManagement/) |\n| Resource Management - Analysis | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Analysis/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Analysis-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Analysis_1.1.2/sdk/analysisservices/Azure.ResourceManager.Analysis/) |\n| Resource Management - API Center | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ApiCenter/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ApiCenter/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ApiCenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiCenter_1.0.0/sdk/apicenter/Azure.ResourceManager.ApiCenter/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiCenter_1.1.0-beta.1/sdk/apicenter/Azure.ResourceManager.ApiCenter/) |\n| Resource Management - API Management | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.ApiManagement/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ApiManagement-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiManagement_1.3.1/sdk/apimanagement/Azure.ResourceManager.ApiManagement/) |\n| Resource Management - App Compliance Automation | NuGet [1.0.2](https://www.nuget.org/packages/Azure.ResourceManager.AppComplianceAutomation/1.0.2) | [docs](/dotnet/api/overview/azure/ResourceManager.AppComplianceAutomation-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppComplianceAutomation_1.0.2/sdk/appcomplianceautomation/Azure.ResourceManager.AppComplianceAutomation/) |\n| Resource Management - App Configuration | NuGet [1.4.1](https://www.nuget.org/packages/Azure.ResourceManager.AppConfiguration/1.4.1)<br>NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.AppConfiguration/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppConfiguration-readme) | GitHub [1.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppConfiguration_1.4.1/sdk/appconfiguration/Azure.ResourceManager.AppConfiguration/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppConfiguration_1.5.0-beta.1/sdk/appconfiguration/Azure.ResourceManager.AppConfiguration/) |\n| Resource Management - App Service | NuGet [1.4.1](https://www.nuget.org/packages/Azure.ResourceManager.AppService/1.4.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppService-readme) | GitHub [1.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppService_1.4.1/sdk/websites/Azure.ResourceManager.AppService/) |\n| Resource Management - Application Insights | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ApplicationInsights/1.0.1)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ApplicationInsights/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ApplicationInsights-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApplicationInsights_1.0.1/sdk/applicationinsights/Azure.ResourceManager.ApplicationInsights/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApplicationInsights_1.1.0-beta.1/sdk/applicationinsights/Azure.ResourceManager.ApplicationInsights/) |\n| Resource Management - Appnetwork | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.AppNetwork/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppNetwork-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppNetwork_1.0.0-beta.1/sdk/appnetwork/Azure.ResourceManager.AppNetwork/) |\n| Resource Management - Arizeaiobservabilityeval | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ArizeAIObservabilityEval/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ArizeAIObservabilityEval-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ArizeAIObservabilityEval_1.0.1/sdk/arizeaiobservabilityeval/Azure.ResourceManager.ArizeAIObservabilityEval/) |\n| Resource Management - Artifactsigning | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ArtifactSigning/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ArtifactSigning-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ArtifactSigning_1.0.0/sdk/artifactsigning/Azure.ResourceManager.ArtifactSigning/) |\n| Resource Management - Astro | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Astro/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Astro-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Astro_1.0.0-beta.3/sdk/astronomer/Azure.ResourceManager.Astro/) |\n| Resource Management - Attestation | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.Attestation/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.Attestation-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Attestation_1.0.0-beta.6/sdk/attestation/Azure.ResourceManager.Attestation/) |\n| Resource Management - Authorization | NuGet [1.1.6](https://www.nuget.org/packages/Azure.ResourceManager.Authorization/1.1.6) | [docs](/dotnet/api/overview/azure/ResourceManager.Authorization-readme) | GitHub [1.1.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Authorization_1.1.6/sdk/authorization/Azure.ResourceManager.Authorization/) |\n| Resource Management - Automanage | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Automanage/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Automanage-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Automanage_1.1.2/sdk/automanage/Azure.ResourceManager.Automanage/) |\n| Resource Management - Automation | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Automation/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Automation-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Automation_1.1.2/sdk/automation/Azure.ResourceManager.Automation/) |\n| Resource Management - Azure AI Search | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.Search/1.3.0)<br>NuGet [1.4.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Search/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Search-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Search_1.3.0/sdk/search/Azure.ResourceManager.Search/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Search_1.4.0-beta.1/sdk/search/Azure.ResourceManager.Search/) |\n| Resource Management - Azure Stack HCI | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Hci/1.2.1)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Hci/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Hci-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Hci_1.2.1/sdk/azurestackhci/Azure.ResourceManager.Hci/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Hci_1.3.0-beta.1/sdk/azurestackhci/Azure.ResourceManager.Hci/) |\n| Resource Management - Azure VMware Solution | NuGet [1.6.0](https://www.nuget.org/packages/Azure.ResourceManager.Avs/1.6.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Avs-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Avs_1.6.0/sdk/avs/Azure.ResourceManager.Avs/) |\n| Resource Management - Batch | NuGet [1.6.0](https://www.nuget.org/packages/Azure.ResourceManager.Batch/1.6.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Batch-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Batch_1.6.0/sdk/batch/Azure.ResourceManager.Batch/) |\n| Resource Management - Billing | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.Billing/1.2.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Billing-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Billing_1.2.2/sdk/billing/Azure.ResourceManager.Billing/) |\n| Resource Management - Billing Benefits | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.BillingBenefits/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.BillingBenefits-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.BillingBenefits_1.0.0-beta.5/sdk/billingbenefits/Azure.ResourceManager.BillingBenefits/) |\n| Resource Management - Blueprint | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.Blueprint/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.Blueprint-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Blueprint_1.0.0-beta.6/sdk/blueprint/Azure.ResourceManager.Blueprint/) |\n| Resource Management - Bot Service | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.BotService/1.1.1)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.BotService/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.BotService-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.BotService_1.1.1/sdk/botservice/Azure.ResourceManager.BotService/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.BotService_1.2.0-beta.1/sdk/botservice/Azure.ResourceManager.BotService/) |\n| Resource Management - Carbonoptimization | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.CarbonOptimization/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.CarbonOptimization-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CarbonOptimization_1.0.1/sdk/carbon/Azure.ResourceManager.CarbonOptimization/) |\n| Resource Management - Certificateregistration | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.CertificateRegistration/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.CertificateRegistration-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CertificateRegistration_1.0.0-beta.1/sdk/certificateregistration/Azure.ResourceManager.CertificateRegistration/) |\n| Resource Management - Change Analysis | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.ChangeAnalysis/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ChangeAnalysis-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ChangeAnalysis_1.1.2/sdk/changeanalysis/Azure.ResourceManager.ChangeAnalysis/) |\n| Resource Management - Chaos | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.Chaos/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Chaos-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Chaos_1.1.1/sdk/chaos/Azure.ResourceManager.Chaos/) |\n| Resource Management - Cloudhealth | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.CloudHealth/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.CloudHealth-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CloudHealth_1.0.0-beta.2/sdk/cloudhealth/Azure.ResourceManager.CloudHealth/) |\n| Resource Management - Cognitive Services | NuGet [1.5.2](https://www.nuget.org/packages/Azure.ResourceManager.CognitiveServices/1.5.2)<br>NuGet [1.6.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.CognitiveServices/1.6.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.CognitiveServices-readme) | GitHub [1.5.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CognitiveServices_1.5.2/sdk/cognitiveservices/Azure.ResourceManager.CognitiveServices/)<br>GitHub [1.6.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CognitiveServices_1.6.0-beta.1/sdk/cognitiveservices/Azure.ResourceManager.CognitiveServices/) |\n| Resource Management - Communication | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.Communication/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Communication-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Communication_1.3.1/sdk/communication/Azure.ResourceManager.Communication/) |\n| Resource Management - Compute | NuGet [1.14.0](https://www.nuget.org/packages/Azure.ResourceManager.Compute/1.14.0)<br>NuGet [1.15.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Compute/1.15.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Compute-readme) | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Compute_1.14.0/sdk/compute/Azure.ResourceManager.Compute/)<br>GitHub [1.15.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Compute_1.15.0-beta.1/sdk/compute/Azure.ResourceManager.Compute/) |\n| Resource Management - Compute Fleet | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ComputeFleet/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ComputeFleet/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ComputeFleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeFleet_1.0.0/sdk/computefleet/Azure.ResourceManager.ComputeFleet/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeFleet_1.1.0-beta.1/sdk/computefleet/Azure.ResourceManager.ComputeFleet/) |\n| Resource Management - Compute Schedule | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ComputeSchedule/1.1.0)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ComputeSchedule/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ComputeSchedule-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeSchedule_1.1.0/sdk/computeschedule/Azure.ResourceManager.ComputeSchedule/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeSchedule_1.2.0-beta.3/sdk/computeschedule/Azure.ResourceManager.ComputeSchedule/) |\n| Resource Management - Compute.Recommender | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Compute.Recommender/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Compute.Recommender-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Compute.Recommender_1.0.0-beta.2/sdk/computerecommender/Azure.ResourceManager.Compute.Recommender/) |\n| Resource Management - Computelimit | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ComputeLimit/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ComputeLimit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeLimit_1.0.0/sdk/computelimit/Azure.ResourceManager.ComputeLimit/) |\n| Resource Management - Confidential Ledger | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ConfidentialLedger/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ConfidentialLedger-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConfidentialLedger_1.1.0/sdk/confidentialledger/Azure.ResourceManager.ConfidentialLedger/) |\n| Resource Management - Confluent | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Confluent/1.2.1)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Confluent/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Confluent-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Confluent_1.2.1/sdk/confluent/Azure.ResourceManager.Confluent/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Confluent_1.3.0-beta.1/sdk/confluent/Azure.ResourceManager.Confluent/) |\n| Resource Management - Connected VMware vSphere | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.ConnectedVMwarevSphere/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ConnectedVMwarevSphere-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConnectedVMwarevSphere_1.1.2/sdk/connectedvmwarevsphere/Azure.ResourceManager.ConnectedVMwarevSphere/) |\n| Resource Management - Connectedcache | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ConnectedCache/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ConnectedCache-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConnectedCache_1.0.0-beta.2/sdk/connectedcache/Azure.ResourceManager.ConnectedCache/) |\n| Resource Management - Consumption | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Consumption/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Consumption-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Consumption_1.1.0/sdk/consumption/Azure.ResourceManager.Consumption/) |\n| Resource Management - Container Apps | NuGet [1.5.0](https://www.nuget.org/packages/Azure.ResourceManager.AppContainers/1.5.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AppContainers-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppContainers_1.5.0/sdk/containerapps/Azure.ResourceManager.AppContainers/) |\n| Resource Management - Container Instances | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerInstance/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerInstance-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerInstance_1.3.0/sdk/containerinstance/Azure.ResourceManager.ContainerInstance/) |\n| Resource Management - Container Orchestrator Runtime | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ContainerOrchestratorRuntime/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerOrchestratorRuntime-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerOrchestratorRuntime_1.0.0-beta.2/sdk/containerorchestratorruntime/Azure.ResourceManager.ContainerOrchestratorRuntime/) |\n| Resource Management - Container Registry | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.4.0)<br>NuGet [1.5.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.5.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerRegistry-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.4.0/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/)<br>GitHub [1.5.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.5.0-beta.2/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/) |\n| Resource Management - Container Service | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.4.0)<br>NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerService-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.4.0/sdk/containerservice/Azure.ResourceManager.ContainerService/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.5.0-beta.1/sdk/containerservice/Azure.ResourceManager.ContainerService/) |\n| Resource Management - Container Service Fleet | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.1.0)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerServiceFleet-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.1.0/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.2.0-beta.3/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/) |\n| Resource Management - Containerregistry.Tasks | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry.Tasks/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerRegistry.Tasks-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry.Tasks_1.0.0-beta.1/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry.Tasks/) |\n| Resource Management - Content Delivery Network | NuGet [1.5.1](https://www.nuget.org/packages/Azure.ResourceManager.Cdn/1.5.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Cdn-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Cdn_1.5.1/sdk/cdn/Azure.ResourceManager.Cdn/) |\n| Resource Management - Cosmos DB | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDB/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDB-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDB_1.4.0/sdk/cosmosdb/Azure.ResourceManager.CosmosDB/) |\n| Resource Management - Cosmos DB for PostgreSQL | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.0.0)<br>NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDBForPostgreSql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.0.0/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.1.0-beta.3/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/) |\n| Resource Management - Costmanagement | NuGet [1.0.3](https://www.nuget.org/packages/Azure.ResourceManager.CostManagement/1.0.3) | [docs](/dotnet/api/overview/azure/ResourceManager.CostManagement-readme) | GitHub [1.0.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CostManagement_1.0.3/sdk/costmanagement/Azure.ResourceManager.CostManagement/) |\n| Resource Management - Customer Insights | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.CustomerInsights/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.CustomerInsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CustomerInsights_1.0.0/sdk/customer-insights/Azure.ResourceManager.CustomerInsights/) |\n| Resource Management - Data Box | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.DataBox/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DataBox-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataBox_1.1.1/sdk/databox/Azure.ResourceManager.DataBox/) |\n| Resource Management - Data Box Edge | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.DataBoxEdge/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DataBoxEdge-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataBoxEdge_1.1.1/sdk/databoxedge/Azure.ResourceManager.DataBoxEdge/) |\n| Resource Management - Data Factory | NuGet [1.11.0](https://www.nuget.org/packages/Azure.ResourceManager.DataFactory/1.11.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DataFactory-readme) | GitHub [1.11.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataFactory_1.11.0/sdk/datafactory/Azure.ResourceManager.DataFactory/) |\n| Resource Management - Data Lake Analytics | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.DataLakeAnalytics/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DataLakeAnalytics-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataLakeAnalytics_1.1.2/sdk/datalake-analytics/Azure.ResourceManager.DataLakeAnalytics/) |\n| Resource Management - Data Lake Store | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.DataLakeStore/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DataLakeStore-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataLakeStore_1.1.2/sdk/datalake-store/Azure.ResourceManager.DataLakeStore/) |\n| Resource Management - Data Migration | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DataMigration/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DataMigration-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataMigration_1.0.0/sdk/datamigration/Azure.ResourceManager.DataMigration/) |\n| Resource Management - Data Protection | NuGet [1.7.1](https://www.nuget.org/packages/Azure.ResourceManager.DataProtectionBackup/1.7.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DataProtectionBackup-readme) | GitHub [1.7.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataProtectionBackup_1.7.1/sdk/dataprotection/Azure.ResourceManager.DataProtectionBackup/) |\n| Resource Management - Data Share | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.DataShare/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DataShare-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataShare_1.1.2/sdk/datashare/Azure.ResourceManager.DataShare/) |\n| Resource Management - Database Fleet Manager | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DatabaseFleetManager/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DatabaseFleetManager-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DatabaseFleetManager_1.0.0-beta.1/sdk/fleet/Azure.ResourceManager.DatabaseFleetManager/) |\n| Resource Management - Database Watcher | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.DatabaseWatcher/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DatabaseWatcher-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DatabaseWatcher_1.0.0-beta.2/sdk/databasewatcher/Azure.ResourceManager.DatabaseWatcher/) |\n| Resource Management - Datadog | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Datadog/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Datadog-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Datadog_1.0.0/sdk/datadog/Azure.ResourceManager.Datadog/) |\n| Resource Management - Defender EASM | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.DefenderEasm/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.DefenderEasm-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DefenderEasm_1.0.0-beta.4/sdk/defendereasm/Azure.ResourceManager.DefenderEasm/) |\n| Resource Management - Dell.Storage | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Dell.Storage/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Dell.Storage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dell.Storage_1.0.0/sdk/dellstorage/Azure.ResourceManager.Dell.Storage/) |\n| Resource Management - Dependencymap | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.DependencyMap/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DependencyMap-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DependencyMap_1.0.0-beta.2/sdk/dependencymap/Azure.ResourceManager.DependencyMap/) |\n| Resource Management - Deployment Manager | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.DeploymentManager/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.DeploymentManager-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeploymentManager_1.0.0-beta.3/sdk/deploymentmanager/Azure.ResourceManager.DeploymentManager/) |\n| Resource Management - Desktop Virtualization | NuGet [1.3.2](https://www.nuget.org/packages/Azure.ResourceManager.DesktopVirtualization/1.3.2)<br>NuGet [1.4.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DesktopVirtualization/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DesktopVirtualization-readme) | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DesktopVirtualization_1.3.2/sdk/desktopvirtualization/Azure.ResourceManager.DesktopVirtualization/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DesktopVirtualization_1.4.0-beta.1/sdk/desktopvirtualization/Azure.ResourceManager.DesktopVirtualization/) |\n| Resource Management - Dev Center | NuGet [1.0.2](https://www.nuget.org/packages/Azure.ResourceManager.DevCenter/1.0.2)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DevCenter/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DevCenter-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevCenter_1.0.2/sdk/devcenter/Azure.ResourceManager.DevCenter/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevCenter_1.1.0-beta.1/sdk/devcenter/Azure.ResourceManager.DevCenter/) |\n| Resource Management - Dev Spaces | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DevSpaces/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DevSpaces-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevSpaces_1.0.0/sdk/devspaces/Azure.ResourceManager.DevSpaces/) |\n| Resource Management - Device Provisioning Services | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.DeviceProvisioningServices/1.2.1)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DeviceProvisioningServices/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceProvisioningServices-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceProvisioningServices_1.2.1/sdk/deviceprovisioningservices/Azure.ResourceManager.DeviceProvisioningServices/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceProvisioningServices_1.3.0-beta.1/sdk/deviceprovisioningservices/Azure.ResourceManager.DeviceProvisioningServices/) |\n| Resource Management - Device Registry | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DeviceRegistry/1.0.0)<br>NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.DeviceRegistry/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceRegistry-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceRegistry_1.0.0/sdk/deviceregistry/Azure.ResourceManager.DeviceRegistry/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceRegistry_1.1.0-beta.3/sdk/deviceregistry/Azure.ResourceManager.DeviceRegistry/) |\n| Resource Management - Device Update | NuGet [1.0.2](https://www.nuget.org/packages/Azure.ResourceManager.DeviceUpdate/1.0.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceUpdate-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceUpdate_1.0.2/sdk/deviceupdate/Azure.ResourceManager.DeviceUpdate/) |\n| Resource Management - DevOps Infrastructure | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DevOpsInfrastructure/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DevOpsInfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevOpsInfrastructure_1.0.0/sdk/devopsinfrastructure/Azure.ResourceManager.DevOpsInfrastructure/) |\n| Resource Management - DevTest Labs | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.DevTestLabs/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DevTestLabs-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevTestLabs_1.1.2/sdk/devtestlabs/Azure.ResourceManager.DevTestLabs/) |\n| Resource Management - Digital Twins | NuGet [1.3.2](https://www.nuget.org/packages/Azure.ResourceManager.DigitalTwins/1.3.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DigitalTwins-readme) | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DigitalTwins_1.3.2/sdk/digitaltwins/Azure.ResourceManager.DigitalTwins/) |\n| Resource Management - Disconnectedoperations | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DisconnectedOperations/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DisconnectedOperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DisconnectedOperations_1.0.0/sdk/disconnectedoperations/Azure.ResourceManager.DisconnectedOperations/) |\n| Resource Management - DNS | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.Dns/1.1.1)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Dns/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Dns-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dns_1.1.1/sdk/dns/Azure.ResourceManager.Dns/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dns_1.2.0-beta.3/sdk/dns/Azure.ResourceManager.Dns/) |\n| Resource Management - DNS Resolver | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.DnsResolver/1.2.0)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DnsResolver/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DnsResolver-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DnsResolver_1.2.0/sdk/dnsresolver/Azure.ResourceManager.DnsResolver/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DnsResolver_1.3.0-beta.1/sdk/dnsresolver/Azure.ResourceManager.DnsResolver/) |\n| Resource Management - Domainregistration | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DomainRegistration/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DomainRegistration-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DomainRegistration_1.0.0-beta.1/sdk/domainregistration/Azure.ResourceManager.DomainRegistration/) |\n| Resource Management - Durabletask | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.DurableTask/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DurableTask-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DurableTask_1.1.0/sdk/durabletask/Azure.ResourceManager.DurableTask/) |\n| Resource Management - Dynatrace | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Dynatrace/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Dynatrace-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dynatrace_1.2.0/sdk/dynatrace/Azure.ResourceManager.Dynatrace/) |\n| Resource Management - Edge Order | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.EdgeOrder/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.EdgeOrder-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EdgeOrder_1.1.2/sdk/edgeorder/Azure.ResourceManager.EdgeOrder/) |\n| Resource Management - Edge Zones | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.EdgeZones/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.EdgeZones-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EdgeZones_1.0.0-beta.3/sdk/edgezones/Azure.ResourceManager.EdgeZones/) |\n| Resource Management - Edgeactions | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.EdgeActions/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.EdgeActions-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EdgeActions_1.0.0-beta.2/sdk/edgeactions/Azure.ResourceManager.EdgeActions/) |\n| Resource Management - Elastic | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Elastic/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Elastic-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Elastic_1.1.0/sdk/elastic/Azure.ResourceManager.Elastic/) |\n| Resource Management - ElasticSan | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.ElasticSan/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ElasticSan-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ElasticSan_1.2.0/sdk/elasticsan/Azure.ResourceManager.ElasticSan/) |\n| Resource Management - Energy Services | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.EnergyServices/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.EnergyServices-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EnergyServices_1.0.0-beta.4/sdk/openenergyplatform/Azure.ResourceManager.EnergyServices/) |\n| Resource Management - Event Grid | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.1.0)<br>NuGet [1.2.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.2.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.EventGrid-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.1.0/sdk/eventgrid/Azure.ResourceManager.EventGrid/)<br>GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.2.0-beta.2/sdk/eventgrid/Azure.ResourceManager.EventGrid/) |\n| Resource Management - Event Hubs | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.EventHubs/1.2.1)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.EventHubs/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.EventHubs-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventHubs_1.2.1/sdk/eventhub/Azure.ResourceManager.EventHubs/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventHubs_1.3.0-beta.1/sdk/eventhub/Azure.ResourceManager.EventHubs/) |\n| Resource Management - Extended Location | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.ExtendedLocations/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ExtendedLocations-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ExtendedLocations_1.1.2/sdk/extendedlocation/Azure.ResourceManager.ExtendedLocations/) |\n| Resource Management - Fabric | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Fabric/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Fabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Fabric_1.0.0/sdk/fabric/Azure.ResourceManager.Fabric/) |\n| Resource Management - Fileshares | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.FileShares/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.FileShares-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FileShares_1.0.0/sdk/fileshares/Azure.ResourceManager.FileShares/) |\n| Resource Management - Fluid Relay | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.FluidRelay/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.FluidRelay-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FluidRelay_1.1.2/sdk/fluidrelay/Azure.ResourceManager.FluidRelay/) |\n| Resource Management - Front Door | NuGet [1.4.1](https://www.nuget.org/packages/Azure.ResourceManager.FrontDoor/1.4.1) | [docs](/dotnet/api/overview/azure/ResourceManager.FrontDoor-readme) | GitHub [1.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FrontDoor_1.4.1/sdk/frontdoor/Azure.ResourceManager.FrontDoor/) |\n| Resource Management - Graph Services | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.GraphServices/1.1.3) | [docs](/dotnet/api/overview/azure/ResourceManager.GraphServices-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.GraphServices_1.1.3/sdk/graphservices/Azure.ResourceManager.GraphServices/) |\n| Resource Management - Guest Configuration | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.GuestConfiguration/1.2.2) | [docs](/dotnet/api/overview/azure/ResourceManager.GuestConfiguration-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.GuestConfiguration_1.2.2/sdk/guestconfiguration/Azure.ResourceManager.GuestConfiguration/) |\n| Resource Management - Hardware Security Modules | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.HardwareSecurityModules/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.HardwareSecurityModules-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HardwareSecurityModules_1.0.1/sdk/hardwaresecuritymodules/Azure.ResourceManager.HardwareSecurityModules/) |\n| Resource Management - Hci.Vm | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Hci.Vm/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Hci.Vm-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Hci.Vm_1.0.0-beta.2/sdk/azurestackhci/Azure.ResourceManager.Hci.Vm/) |\n| Resource Management - HDInsight | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.HDInsight/1.1.0)<br>NuGet [1.2.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.HDInsight/1.2.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.HDInsight-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HDInsight_1.1.0/sdk/hdinsight/Azure.ResourceManager.HDInsight/)<br>GitHub [1.2.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HDInsight_1.2.0-beta.5/sdk/hdinsight/Azure.ResourceManager.HDInsight/) |\n| Resource Management - Health Bot | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.HealthBot/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.HealthBot-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HealthBot_1.2.0/sdk/healthbot/Azure.ResourceManager.HealthBot/) |\n| Resource Management - Health Data AI Services | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.HealthDataAIServices/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.HealthDataAIServices-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HealthDataAIServices_1.0.1/sdk/healthdataaiservices/Azure.ResourceManager.HealthDataAIServices/) |\n| Resource Management - Healthcare APIs | NuGet [1.3.2](https://www.nuget.org/packages/Azure.ResourceManager.HealthcareApis/1.3.2) | [docs](/dotnet/api/overview/azure/ResourceManager.HealthcareApis-readme) | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HealthcareApis_1.3.2/sdk/healthcareapis/Azure.ResourceManager.HealthcareApis/) |\n| Resource Management - Hybrid Compute | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.HybridCompute/1.0.0)<br>NuGet [1.1.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.HybridCompute/1.1.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.HybridCompute-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridCompute_1.0.0/sdk/hybridcompute/Azure.ResourceManager.HybridCompute/)<br>GitHub [1.1.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridCompute_1.1.0-beta.2/sdk/hybridcompute/Azure.ResourceManager.HybridCompute/) |\n| Resource Management - Hybrid Connectivity | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.HybridConnectivity/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.HybridConnectivity-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridConnectivity_1.1.1/sdk/hybridconnectivity/Azure.ResourceManager.HybridConnectivity/) |\n| Resource Management - Hybrid Container Service | NuGet [1.0.2](https://www.nuget.org/packages/Azure.ResourceManager.HybridContainerService/1.0.2) | [docs](/dotnet/api/overview/azure/ResourceManager.HybridContainerService-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridContainerService_1.0.2/sdk/hybridaks/Azure.ResourceManager.HybridContainerService/) |\n| Resource Management - Hybrid Kubernetes | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.Kubernetes/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.Kubernetes-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Kubernetes_1.0.0-beta.6/sdk/hybridkubernetes/Azure.ResourceManager.Kubernetes/) |\n| Resource Management - Hybrid Network | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.HybridNetwork/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.HybridNetwork-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridNetwork_1.0.0-beta.3/sdk/hybridnetwork/Azure.ResourceManager.HybridNetwork/) |\n| Resource Management - Impactreporting | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ImpactReporting/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ImpactReporting-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ImpactReporting_1.0.0-beta.1/sdk/impactreporting/Azure.ResourceManager.ImpactReporting/) |\n| Resource Management - Informatica Data Management | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.InformaticaDataManagement/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.InformaticaDataManagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.InformaticaDataManagement_1.0.0/sdk/informaticadatamanagement/Azure.ResourceManager.InformaticaDataManagement/) |\n| Resource Management - IoT Central | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.IotCentral/1.0.1)<br>NuGet [1.1.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.IotCentral/1.1.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.IotCentral-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotCentral_1.0.1/sdk/iotcentral/Azure.ResourceManager.IotCentral/)<br>GitHub [1.1.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotCentral_1.1.0-beta.4/sdk/iotcentral/Azure.ResourceManager.IotCentral/) |\n| Resource Management - IoT Firmware Defense | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.IotFirmwareDefense/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.IotFirmwareDefense-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotFirmwareDefense_1.1.0/sdk/iot/Azure.ResourceManager.IotFirmwareDefense/) |\n| Resource Management - IoT Hub | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.IotHub/1.1.1)<br>NuGet [1.2.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.IotHub/1.2.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.IotHub-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotHub_1.1.1/sdk/iothub/Azure.ResourceManager.IotHub/)<br>GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotHub_1.2.0-beta.2/sdk/iothub/Azure.ResourceManager.IotHub/) |\n| Resource Management - IoT Operations | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.IotOperations/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.IotOperations/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.IotOperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotOperations_1.0.0/sdk/iotoperations/Azure.ResourceManager.IotOperations/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotOperations_1.1.0-beta.1/sdk/iotoperations/Azure.ResourceManager.IotOperations/) |\n| Resource Management - Key Vault | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.KeyVault/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.KeyVault-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.KeyVault_1.4.0/sdk/keyvault/Azure.ResourceManager.KeyVault/) |\n| Resource Management - Kubernetes Configuration | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.KubernetesConfiguration/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.KubernetesConfiguration-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.KubernetesConfiguration_1.2.1/sdk/kubernetesconfiguration/Azure.ResourceManager.KubernetesConfiguration/) |\n| Resource Management - Kubernetesconfiguration.Extensions | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.KubernetesConfiguration.Extensions/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.KubernetesConfiguration.Extensions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.KubernetesConfiguration.Extensions_1.0.0/sdk/kubernetesconfiguration/Azure.ResourceManager.KubernetesConfiguration.Extensions/) |\n| Resource Management - Kusto | NuGet [1.6.2](https://www.nuget.org/packages/Azure.ResourceManager.Kusto/1.6.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Kusto-readme) | GitHub [1.6.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Kusto_1.6.2/sdk/kusto/Azure.ResourceManager.Kusto/) |\n| Resource Management - Lab Services | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.LabServices/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.LabServices-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LabServices_1.1.2/sdk/labservices/Azure.ResourceManager.LabServices/) |\n| Resource Management - Lambdatesthyperexecute | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.LambdaTestHyperExecute/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.LambdaTestHyperExecute-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LambdaTestHyperExecute_1.0.1/sdk/lambdatesthyperexecute/Azure.ResourceManager.LambdaTestHyperExecute/) |\n| Resource Management - Large Instance | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.LargeInstance/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.LargeInstance-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LargeInstance_1.0.0-beta.3/sdk/azurelargeinstance/Azure.ResourceManager.LargeInstance/) |\n| Resource Management - Load Testing | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.LoadTesting/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.LoadTesting-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LoadTesting_1.1.2/sdk/loadtestservice/Azure.ResourceManager.LoadTesting/) |\n| Resource Management - Log Analytics | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.OperationalInsights/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.OperationalInsights-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.OperationalInsights_1.3.1/sdk/operationalinsights/Azure.ResourceManager.OperationalInsights/) |\n| Resource Management - Logic Apps | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Logic/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Logic-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Logic_1.2.0/sdk/logic/Azure.ResourceManager.Logic/) |\n| Resource Management - Machine Learning | NuGet [1.2.3](https://www.nuget.org/packages/Azure.ResourceManager.MachineLearning/1.2.3) | [docs](/dotnet/api/overview/azure/ResourceManager.MachineLearning-readme) | GitHub [1.2.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MachineLearning_1.2.3/sdk/machinelearningservices/Azure.ResourceManager.MachineLearning/) |\n| Resource Management - Machine Learning Compute | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.MachineLearningCompute/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.MachineLearningCompute-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MachineLearningCompute_1.0.0-beta.6/sdk/machinelearningcompute/Azure.ResourceManager.MachineLearningCompute/) |\n| Resource Management - Maintenance | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.Maintenance/1.1.3)<br>NuGet [1.2.0-beta.10](https://www.nuget.org/packages/Azure.ResourceManager.Maintenance/1.2.0-beta.10) | [docs](/dotnet/api/overview/azure/ResourceManager.Maintenance-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Maintenance_1.1.3/sdk/maintenance/Azure.ResourceManager.Maintenance/)<br>GitHub [1.2.0-beta.10](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Maintenance_1.2.0-beta.10/sdk/maintenance/Azure.ResourceManager.Maintenance/) |\n| Resource Management - Managed Grafana | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.Grafana/1.1.1)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Grafana/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Grafana-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Grafana_1.1.1/sdk/grafana/Azure.ResourceManager.Grafana/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Grafana_1.2.0-beta.3/sdk/grafana/Azure.ResourceManager.Grafana/) |\n| Resource Management - Managed Network | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.ManagedNetwork/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagedNetwork-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagedNetwork_1.0.0-beta.6/sdk/managednetwork/Azure.ResourceManager.ManagedNetwork/) |\n| Resource Management - Managed Network Fabric | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.ManagedNetworkFabric/1.1.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagedNetworkFabric-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagedNetworkFabric_1.1.3/sdk/managednetworkfabric/Azure.ResourceManager.ManagedNetworkFabric/) |\n| Resource Management - Managed Service Identity | NuGet [1.4.1](https://www.nuget.org/packages/Azure.ResourceManager.ManagedServiceIdentities/1.4.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagedServiceIdentities-readme) | GitHub [1.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagedServiceIdentities_1.4.1/sdk/managedserviceidentity/Azure.ResourceManager.ManagedServiceIdentities/) |\n| Resource Management - Managed Services | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.ManagedServices/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagedServices-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagedServices_1.1.2/sdk/managedservices/Azure.ResourceManager.ManagedServices/) |\n| Resource Management - Managedops | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ManagedOps/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagedOps-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagedOps_1.0.0-beta.1/sdk/managedops/Azure.ResourceManager.ManagedOps/) |\n| Resource Management - Management Partner | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.ManagementPartner/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagementPartner-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagementPartner_1.0.0-beta.6/sdk/managementpartner/Azure.ResourceManager.ManagementPartner/) |\n| Resource Management - Maps | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Maps/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Maps/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Maps-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Maps_1.1.0/sdk/maps/Azure.ResourceManager.Maps/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Maps_1.2.0-beta.1/sdk/maps/Azure.ResourceManager.Maps/) |\n| Resource Management - Marketplace | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.Marketplace/1.1.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Marketplace-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Marketplace_1.1.3/sdk/marketplace/Azure.ResourceManager.Marketplace/) |\n| Resource Management - Marketplace Ordering | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.MarketplaceOrdering/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.MarketplaceOrdering-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MarketplaceOrdering_1.1.2/sdk/marketplaceordering/Azure.ResourceManager.MarketplaceOrdering/) |\n| Resource Management - Migration Assessment | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Migration.Assessment/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Migration.Assessment-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Migration.Assessment_1.0.0-beta.2/sdk/migrationassessment/Azure.ResourceManager.Migration.Assessment/) |\n| Resource Management - Migration Discovery SAP | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.MigrationDiscoverySap/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.MigrationDiscoverySap-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MigrationDiscoverySap_1.0.0-beta.3/sdk/migrationdiscoverysap/Azure.ResourceManager.MigrationDiscoverySap/) |\n| Resource Management - Mongo Cluster | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.MongoCluster/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.MongoCluster-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MongoCluster_1.0.0/sdk/mongocluster/Azure.ResourceManager.MongoCluster/) |\n| Resource Management - Mongodbatlas | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.MongoDBAtlas/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.MongoDBAtlas-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MongoDBAtlas_1.0.1/sdk/mongodbatlas/Azure.ResourceManager.MongoDBAtlas/) |\n| Resource Management - Monitor | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.Monitor/1.3.1)<br>NuGet [1.4.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Monitor/1.4.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Monitor-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Monitor_1.3.1/sdk/monitor/Azure.ResourceManager.Monitor/)<br>GitHub [1.4.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Monitor_1.4.0-beta.4/sdk/monitor/Azure.ResourceManager.Monitor/) |\n| Resource Management - Monitor.Pipelinegroups | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Monitor.PipelineGroups/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Monitor.PipelineGroups_1.0.0-beta.1/sdk/monitorpipelinegroups/Azure.ResourceManager.Monitor.PipelineGroups/) |\n| Resource Management - MySQL | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.MySql/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.MySql-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MySql_1.2.0/sdk/mysql/Azure.ResourceManager.MySql/) |\n| Resource Management - NetApp Files | NuGet [1.16.0](https://www.nuget.org/packages/Azure.ResourceManager.NetApp/1.16.0) | [docs](/dotnet/api/overview/azure/ResourceManager.NetApp-readme) | GitHub [1.16.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetApp_1.16.0/sdk/netapp/Azure.ResourceManager.NetApp/) |\n| Resource Management - Network | NuGet [1.15.0](https://www.nuget.org/packages/Azure.ResourceManager.Network/1.15.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Network-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Network_1.15.0/sdk/network/Azure.ResourceManager.Network/) |\n| Resource Management - Network Cloud | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.NetworkCloud/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkCloud-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkCloud_1.3.0/sdk/networkcloud/Azure.ResourceManager.NetworkCloud/) |\n| Resource Management - Network Function | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.NetworkFunction/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkFunction-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkFunction_1.0.0/sdk/networkfunction/Azure.ResourceManager.NetworkFunction/) |\n| Resource Management - New Relic Observability | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.NewRelicObservability/1.1.1)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.NewRelicObservability/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.NewRelicObservability-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NewRelicObservability_1.1.1/sdk/newrelicobservability/Azure.ResourceManager.NewRelicObservability/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NewRelicObservability_1.2.0-beta.1/sdk/newrelicobservability/Azure.ResourceManager.NewRelicObservability/) |\n| Resource Management - Nginx | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Nginx/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Nginx-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Nginx_1.1.0/sdk/nginx/Azure.ResourceManager.Nginx/) |\n| Resource Management - Notification Hubs | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.NotificationHubs/1.1.1)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.NotificationHubs/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.NotificationHubs-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NotificationHubs_1.1.1/sdk/notificationhubs/Azure.ResourceManager.NotificationHubs/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NotificationHubs_1.2.0-beta.3/sdk/notificationhubs/Azure.ResourceManager.NotificationHubs/) |\n| Resource Management - Onlineexperimentation | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.OnlineExperimentation/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.OnlineExperimentation-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.OnlineExperimentation_1.0.0-beta.2/sdk/onlineexperimentation/Azure.ResourceManager.OnlineExperimentation/) |\n| Resource Management - Oracle Database | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.OracleDatabase/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.OracleDatabase-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.OracleDatabase_1.2.0/sdk/oracle/Azure.ResourceManager.OracleDatabase/) |\n| Resource Management - Orbital | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Orbital/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Orbital-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Orbital_1.1.2/sdk/orbital/Azure.ResourceManager.Orbital/) |\n| Resource Management - Palo Alto Networks - Next Generation Firewall | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.PaloAltoNetworks.Ngfw/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PaloAltoNetworks.Ngfw-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PaloAltoNetworks.Ngfw_1.2.0/sdk/paloaltonetworks.ngfw/Azure.ResourceManager.PaloAltoNetworks.Ngfw/) |\n| Resource Management - Peering | NuGet [1.2.3](https://www.nuget.org/packages/Azure.ResourceManager.Peering/1.2.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Peering-readme) | GitHub [1.2.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Peering_1.2.3/sdk/peering/Azure.ResourceManager.Peering/) |\n| Resource Management - Pineconevectordb | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.PineconeVectorDB/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.PineconeVectorDB-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PineconeVectorDB_1.0.0-beta.2/sdk/pineconevectordb/Azure.ResourceManager.PineconeVectorDB/) |\n| Resource Management - Planetarycomputer | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.PlanetaryComputer/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PlanetaryComputer-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PlanetaryComputer_1.0.0/sdk/planetarycomputer/Azure.ResourceManager.PlanetaryComputer/) |\n| Resource Management - Playwright | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Playwright/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Playwright/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Playwright_1.0.0/sdk/playwright/Azure.ResourceManager.Playwright/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Playwright_1.1.0-beta.1/sdk/playwright/Azure.ResourceManager.Playwright/) |\n| Resource Management - Policy Insights | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.PolicyInsights/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PolicyInsights-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PolicyInsights_1.3.0/sdk/policyinsights/Azure.ResourceManager.PolicyInsights/) |\n| Resource Management - Portalservicescopilot | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.PortalServicesCopilot/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.PortalServicesCopilot-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PortalServicesCopilot_1.0.0-beta.2/sdk/portalservices/Azure.ResourceManager.PortalServicesCopilot/) |\n| Resource Management - PostgreSQL | NuGet [1.4.2](https://www.nuget.org/packages/Azure.ResourceManager.PostgreSql/1.4.2) | [docs](/dotnet/api/overview/azure/ResourceManager.PostgreSql-readme) | GitHub [1.4.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PostgreSql_1.4.2/sdk/postgresql/Azure.ResourceManager.PostgreSql/) |\n| Resource Management - Power BI Dedicated | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.PowerBIDedicated/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PowerBIDedicated-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PowerBIDedicated_1.0.0/sdk/powerbidedicated/Azure.ResourceManager.PowerBIDedicated/) |\n| Resource Management - Private DNS | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.PrivateDns/1.2.2) | [docs](/dotnet/api/overview/azure/ResourceManager.PrivateDns-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PrivateDns_1.2.2/sdk/privatedns/Azure.ResourceManager.PrivateDns/) |\n| Resource Management - Provider Hub | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.ProviderHub/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ProviderHub-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ProviderHub_1.2.0/sdk/providerhub/Azure.ResourceManager.ProviderHub/) |\n| Resource Management - Purestorageblock | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.PureStorageBlock/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.PureStorageBlock-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PureStorageBlock_1.0.1/sdk/purestorageblock/Azure.ResourceManager.PureStorageBlock/) |\n| Resource Management - Purview | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Purview/1.1.0)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Purview/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Purview-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Purview_1.1.0/sdk/purview/Azure.ResourceManager.Purview/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Purview_1.2.0-beta.3/sdk/purview/Azure.ResourceManager.Purview/) |\n| Resource Management - Quantum | NuGet [1.0.0-beta.7](https://www.nuget.org/packages/Azure.ResourceManager.Quantum/1.0.0-beta.7) | [docs](/dotnet/api/overview/azure/ResourceManager.Quantum-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Quantum_1.0.0-beta.7/sdk/quantum/Azure.ResourceManager.Quantum/) |\n| Resource Management - Qumulo | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Qumulo/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Qumulo-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Qumulo_1.2.0/sdk/qumulo/Azure.ResourceManager.Qumulo/) |\n| Resource Management - Quota | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Quota/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Quota-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Quota_1.2.0/sdk/quota/Azure.ResourceManager.Quota/) |\n| Resource Management - Recovery Services | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.RecoveryServices/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.RecoveryServices-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RecoveryServices_1.2.0/sdk/recoveryservices/Azure.ResourceManager.RecoveryServices/) |\n| Resource Management - Recovery Services Backup | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.RecoveryServicesBackup/1.3.1)<br>NuGet [1.4.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.RecoveryServicesBackup/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.RecoveryServicesBackup-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RecoveryServicesBackup_1.3.1/sdk/recoveryservices-backup/Azure.ResourceManager.RecoveryServicesBackup/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RecoveryServicesBackup_1.4.0-beta.1/sdk/recoveryservices-backup/Azure.ResourceManager.RecoveryServicesBackup/) |\n| Resource Management - Recovery Services Data Replication | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.RecoveryServicesDataReplication/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.RecoveryServicesDataReplication-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RecoveryServicesDataReplication_1.0.1/sdk/recoveryservices-datareplication/Azure.ResourceManager.RecoveryServicesDataReplication/) |\n| Resource Management - Recovery Services Site Recovery | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.RecoveryServicesSiteRecovery/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.RecoveryServicesSiteRecovery-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RecoveryServicesSiteRecovery_1.3.1/sdk/recoveryservices-siterecovery/Azure.ResourceManager.RecoveryServicesSiteRecovery/) |\n| Resource Management - Redhatopenshift | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.RedHatOpenShift/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RedHatOpenShift_1.0.0-beta.1/sdk/redhatopenshift/Azure.ResourceManager.RedHatOpenShift/) |\n| Resource Management - Redis | NuGet [1.5.1](https://www.nuget.org/packages/Azure.ResourceManager.Redis/1.5.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Redis-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Redis_1.5.1/sdk/redis/Azure.ResourceManager.Redis/) |\n| Resource Management - Redis Enterprise | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.RedisEnterprise/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.RedisEnterprise-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RedisEnterprise_1.3.0/sdk/redisenterprise/Azure.ResourceManager.RedisEnterprise/) |\n| Resource Management - Redis Enterprise Cache | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.RedisEnterpriseCache/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.RedisEnterpriseCache-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RedisEnterpriseCache_1.0.0-beta.1/sdk/redisenterprise/Azure.ResourceManager.RedisEnterpriseCache/) |\n| Resource Management - Relationships | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Relationships/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Relationships-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Relationships_1.0.0-beta.1/sdk/relationships/Azure.ResourceManager.Relationships/) |\n| Resource Management - Relay | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.Relay/1.2.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Relay-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Relay_1.2.2/sdk/relay/Azure.ResourceManager.Relay/) |\n| Resource Management - Reservations | NuGet [1.4.2](https://www.nuget.org/packages/Azure.ResourceManager.Reservations/1.4.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Reservations-readme) | GitHub [1.4.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Reservations_1.4.2/sdk/reservations/Azure.ResourceManager.Reservations/) |\n| Resource Management - Resource Connector | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.ResourceConnector/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceConnector-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceConnector_1.0.0-beta.4/sdk/resourceconnector/Azure.ResourceManager.ResourceConnector/) |\n| Resource Management - Resource Graph | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ResourceGraph/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceGraph-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceGraph_1.1.0/sdk/resourcegraph/Azure.ResourceManager.ResourceGraph/) |\n| Resource Management - Resource Health | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ResourceHealth/1.0.0)<br>NuGet [1.1.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.ResourceHealth/1.1.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceHealth-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceHealth_1.0.0/sdk/resourcehealth/Azure.ResourceManager.ResourceHealth/)<br>GitHub [1.1.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceHealth_1.1.0-beta.5/sdk/resourcehealth/Azure.ResourceManager.ResourceHealth/) |\n| Resource Management - Resource Manager | NuGet [1.14.0](https://www.nuget.org/packages/Azure.ResourceManager/1.14.0) | [docs](/dotnet/api/overview/azure/ResourceManager-readme) | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager_1.14.0/sdk/resourcemanager/Azure.ResourceManager/) |\n| Resource Management - Resource Mover | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.ResourceMover/1.1.1)<br>NuGet [1.1.2-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ResourceMover/1.1.2-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceMover-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceMover_1.1.1/sdk/resourcemover/Azure.ResourceManager.ResourceMover/)<br>GitHub [1.1.2-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceMover_1.1.2-beta.3/sdk/resourcemover/Azure.ResourceManager.ResourceMover/) |\n| Resource Management - Resources | NuGet [1.11.2](https://www.nuget.org/packages/Azure.ResourceManager.Resources/1.11.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Resources-readme) | GitHub [1.11.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Resources_1.11.2/sdk/resources/Azure.ResourceManager.Resources/) |\n| Resource Management - Resources.Deploymentstacks | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Resources.DeploymentStacks/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Resources.DeploymentStacks-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Resources.DeploymentStacks_1.0.0/sdk/resources/Azure.ResourceManager.Resources.DeploymentStacks/) |\n| Resource Management - Resources.Policy | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Resources.Policy/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Resources.Policy-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Resources.Policy_1.0.0-beta.1/sdk/resources/Azure.ResourceManager.Resources.Policy/) |\n| Resource Management - ScVmm | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ScVmm/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ScVmm-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ScVmm_1.0.0/sdk/arc-scvmm/Azure.ResourceManager.ScVmm/) |\n| Resource Management - Secretsstoreextension | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.SecretsStoreExtension/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.SecretsStoreExtension-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecretsStoreExtension_1.0.0-beta.2/sdk/secretsstoreextension/Azure.ResourceManager.SecretsStoreExtension/) |\n| Resource Management - Security | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.SecurityCenter/1.1.0)<br>NuGet [1.2.0-beta.7](https://www.nuget.org/packages/Azure.ResourceManager.SecurityCenter/1.2.0-beta.7) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityCenter-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityCenter_1.1.0/sdk/securitycenter/Azure.ResourceManager.SecurityCenter/)<br>GitHub [1.2.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityCenter_1.2.0-beta.7/sdk/securitycenter/Azure.ResourceManager.SecurityCenter/) |\n| Resource Management - Security DevOps | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.SecurityDevOps/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityDevOps-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityDevOps_1.0.0-beta.6/sdk/securitydevops/Azure.ResourceManager.SecurityDevOps/) |\n| Resource Management - Security Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.SecurityInsights/1.1.0)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.SecurityInsights/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityInsights_1.1.0/sdk/securityinsights/Azure.ResourceManager.SecurityInsights/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityInsights_1.2.0-beta.3/sdk/securityinsights/Azure.ResourceManager.SecurityInsights/) |\n| Resource Management - Self Help | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.SelfHelp/1.0.0)<br>NuGet [1.1.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.SelfHelp/1.1.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.SelfHelp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SelfHelp_1.0.0/sdk/selfhelp/Azure.ResourceManager.SelfHelp/)<br>GitHub [1.1.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SelfHelp_1.1.0-beta.6/sdk/selfhelp/Azure.ResourceManager.SelfHelp/) |\n| Resource Management - Service Bus | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceBus/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ServiceBus/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceBus-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceBus_1.1.0/sdk/servicebus/Azure.ResourceManager.ServiceBus/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceBus_1.2.0-beta.1/sdk/servicebus/Azure.ResourceManager.ServiceBus/) |\n| Resource Management - Service Fabric | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabric/1.1.0)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabric/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceFabric-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabric_1.1.0/sdk/servicefabric/Azure.ResourceManager.ServiceFabric/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabric_1.2.0-beta.3/sdk/servicefabric/Azure.ResourceManager.ServiceFabric/) |\n| Resource Management - Service Fabric Managed Clusters | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabricManagedClusters/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceFabricManagedClusters-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabricManagedClusters_1.3.0/sdk/servicefabricmanagedclusters/Azure.ResourceManager.ServiceFabricManagedClusters/) |\n| Resource Management - Service Linker | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.ServiceLinker/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceLinker-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceLinker_1.1.2/sdk/servicelinker/Azure.ResourceManager.ServiceLinker/) |\n| Resource Management - Service Networking | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceNetworking/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ServiceNetworking/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceNetworking-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceNetworking_1.1.0/sdk/servicenetworking/Azure.ResourceManager.ServiceNetworking/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceNetworking_1.2.0-beta.1/sdk/servicenetworking/Azure.ResourceManager.ServiceNetworking/) |\n| Resource Management - Servicegroups | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ServiceGroups/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceGroups-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceGroups_1.0.0-beta.2/sdk/servicegroups/Azure.ResourceManager.ServiceGroups/) |\n| Resource Management - SignalR | NuGet [1.1.4](https://www.nuget.org/packages/Azure.ResourceManager.SignalR/1.1.4) | [docs](/dotnet/api/overview/azure/ResourceManager.SignalR-readme) | GitHub [1.1.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SignalR_1.1.4/sdk/signalr/Azure.ResourceManager.SignalR/) |\n| Resource Management - Sitemanager | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.SiteManager/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.SiteManager-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SiteManager_1.0.0/sdk/sitemanager/Azure.ResourceManager.SiteManager/) |\n| Resource Management - Sphere | NuGet [1.0.2](https://www.nuget.org/packages/Azure.ResourceManager.Sphere/1.0.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Sphere-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Sphere_1.0.2/sdk/sphere/Azure.ResourceManager.Sphere/) |\n| Resource Management - Spring App Discovery | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.SpringAppDiscovery/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.SpringAppDiscovery-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SpringAppDiscovery_1.0.0-beta.3/sdk/springappdiscovery/Azure.ResourceManager.SpringAppDiscovery/) |\n| Resource Management - SQL | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.Sql/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Sql-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Sql_1.4.0/sdk/sqlmanagement/Azure.ResourceManager.Sql/) |\n| Resource Management - SQL Virtual Machine | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.SqlVirtualMachine/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.SqlVirtualMachine-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SqlVirtualMachine_1.1.2/sdk/sqlvirtualmachine/Azure.ResourceManager.SqlVirtualMachine/) |\n| Resource Management - Standby Pool | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.StandbyPool/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.StandbyPool-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StandbyPool_1.2.0/sdk/standbypool/Azure.ResourceManager.StandbyPool/) |\n| Resource Management - Storage | NuGet [1.6.2](https://www.nuget.org/packages/Azure.ResourceManager.Storage/1.6.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Storage-readme) | GitHub [1.6.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Storage_1.6.2/sdk/storage/Azure.ResourceManager.Storage/) |\n| Resource Management - Storage Actions | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.StorageActions/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.StorageActions-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageActions_1.0.1/sdk/storageactions/Azure.ResourceManager.StorageActions/) |\n| Resource Management - Storage Cache | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.StorageCache/1.4.0)<br>NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.StorageCache/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.StorageCache-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageCache_1.4.0/sdk/storagecache/Azure.ResourceManager.StorageCache/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageCache_1.5.0-beta.1/sdk/storagecache/Azure.ResourceManager.StorageCache/) |\n| Resource Management - Storage Mover | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.StorageMover/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.StorageMover-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageMover_1.4.0/sdk/storagemover/Azure.ResourceManager.StorageMover/) |\n| Resource Management - Storage Pool | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.StoragePool/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.StoragePool-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StoragePool_1.1.2/sdk/storagepool/Azure.ResourceManager.StoragePool/) |\n| Resource Management - Storage Sync | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.StorageSync/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.StorageSync-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageSync_1.3.1/sdk/storagesync/Azure.ResourceManager.StorageSync/) |\n| Resource Management - Storagediscovery | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.StorageDiscovery/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.StorageDiscovery-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageDiscovery_1.0.0/sdk/storagediscovery/Azure.ResourceManager.StorageDiscovery/) |\n| Resource Management - Stream Analytics | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.StreamAnalytics/1.2.1)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.StreamAnalytics/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.StreamAnalytics-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StreamAnalytics_1.2.1/sdk/streamanalytics/Azure.ResourceManager.StreamAnalytics/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StreamAnalytics_1.3.0-beta.1/sdk/streamanalytics/Azure.ResourceManager.StreamAnalytics/) |\n| Resource Management - Subscriptions | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Subscription/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Subscription-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Subscription_1.1.2/sdk/subscription/Azure.ResourceManager.Subscription/) |\n| Resource Management - Support | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.Support/1.1.1)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Support/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Support-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Support_1.1.1/sdk/support/Azure.ResourceManager.Support/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Support_1.2.0-beta.1/sdk/support/Azure.ResourceManager.Support/) |\n| Resource Management - Synapse | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.Synapse/1.2.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Synapse-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Synapse_1.2.2/sdk/synapse/Azure.ResourceManager.Synapse/) |\n| Resource Management - Terraform | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Terraform/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Terraform-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Terraform_1.0.0-beta.3/sdk/terraform/Azure.ResourceManager.Terraform/) |\n| Resource Management - Traffic Manager | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.TrafficManager/1.1.3)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.TrafficManager/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.TrafficManager-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.TrafficManager_1.1.3/sdk/trafficmanager/Azure.ResourceManager.TrafficManager/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.TrafficManager_1.2.0-beta.1/sdk/trafficmanager/Azure.ResourceManager.TrafficManager/) |\n| Resource Management - Trusted Signing | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.TrustedSigning/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.TrustedSigning-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.TrustedSigning_1.0.0/sdk/trustedsigning/Azure.ResourceManager.TrustedSigning/) |\n| Resource Management - Virtualenclaves | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.VirtualEnclaves/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.VirtualEnclaves-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.VirtualEnclaves_1.0.0-beta.1/sdk/virtualenclaves/Azure.ResourceManager.VirtualEnclaves/) |\n| Resource Management - Voice Services | NuGet [1.0.3](https://www.nuget.org/packages/Azure.ResourceManager.VoiceServices/1.0.3) | [docs](/dotnet/api/overview/azure/ResourceManager.VoiceServices-readme) | GitHub [1.0.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.VoiceServices_1.0.3/sdk/voiceservices/Azure.ResourceManager.VoiceServices/) |\n| Resource Management - Web PubSub | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.WebPubSub/1.2.0)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.WebPubSub/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.WebPubSub-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WebPubSub_1.2.0/sdk/webpubsub/Azure.ResourceManager.WebPubSub/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WebPubSub_1.3.0-beta.1/sdk/webpubsub/Azure.ResourceManager.WebPubSub/) |\n| Resource Management - Weightsandbiases | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.WeightsAndBiases/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.WeightsAndBiases-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WeightsAndBiases_1.0.0/sdk/weightsandbiases/Azure.ResourceManager.WeightsAndBiases/) |\n| Resource Management - Workload Monitor | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.WorkloadMonitor/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.WorkloadMonitor-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WorkloadMonitor_1.0.0-beta.6/sdk/workloadmonitor/Azure.ResourceManager.WorkloadMonitor/) |\n| Resource Management - Workloadorchestration | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.WorkloadOrchestration/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.WorkloadOrchestration-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WorkloadOrchestration_1.0.0/sdk/workloadorchestration/Azure.ResourceManager.WorkloadOrchestration/) |\n| Resource Management - Workloads | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Workloads/1.1.2)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Workloads/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Workloads-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Workloads_1.1.2/sdk/workloads/Azure.ResourceManager.Workloads/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Workloads_1.2.0-beta.1/sdk/workloads/Azure.ResourceManager.Workloads/) |\n| Resource Management - Workloadssapvirtualinstance | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.WorkloadsSapVirtualInstance/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.WorkloadsSapVirtualInstance-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WorkloadsSapVirtualInstance_1.0.0/sdk/workloadssapvirtualinstance/Azure.ResourceManager.WorkloadsSapVirtualInstance/) |\n| App Configuration Extension | NuGet [8.5.0](https://www.nuget.org/packages/Microsoft.Azure.AppConfiguration.Functions.Worker/8.5.0)<br>NuGet [8.6.0-preview](https://www.nuget.org/packages/Microsoft.Azure.AppConfiguration.Functions.Worker/8.6.0-preview) |  |  |\n| App Configuration Provider | NuGet [8.5.0](https://www.nuget.org/packages/Microsoft.Azure.AppConfiguration.AspNetCore/8.5.0)<br>NuGet [8.6.0-preview](https://www.nuget.org/packages/Microsoft.Azure.AppConfiguration.AspNetCore/8.6.0-preview) |  |  |\n| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp/1.0.0)<br>NuGet [3.0.0-beta.10](https://www.nuget.org/packages/Azure.Mcp/3.0.0-beta.10) |  |  |\n| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.linux-arm64/1.0.0)<br>NuGet [3.0.0-beta.10](https://www.nuget.org/packages/Azure.Mcp.linux-arm64/3.0.0-beta.10) |  |  |\n| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.linux-x64/1.0.0)<br>NuGet [3.0.0-beta.10](https://www.nuget.org/packages/Azure.Mcp.linux-x64/3.0.0-beta.10) |  |  |\n| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.osx-arm64/1.0.0)<br>NuGet [3.0.0-beta.10](https://www.nuget.org/packages/Azure.Mcp.osx-arm64/3.0.0-beta.10) |  |  |\n| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.osx-x64/1.0.0)<br>NuGet [3.0.0-beta.10](https://www.nuget.org/packages/Azure.Mcp.osx-x64/3.0.0-beta.10) |  |  |\n| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.win-arm64/1.0.0)<br>NuGet [3.0.0-beta.10](https://www.nuget.org/packages/Azure.Mcp.win-arm64/3.0.0-beta.10) |  |  |\n| Azure MCP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Mcp.win-x64/1.0.0)<br>NuGet [3.0.0-beta.10](https://www.nuget.org/packages/Azure.Mcp.win-x64/3.0.0-beta.10) |  |  |\n| Azure MCP Types Internal | NuGet [0.2.804](https://www.nuget.org/packages/Microsoft.Azure.Mcp.AzTypes.Internal.Compact/0.2.804) |  |  |\n| Azure.Communication.Administration | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Communication.Administration/1.0.0-beta.3) |  |  |\n| Caching - PostgreSQL | NuGet [1.2.2](https://www.nuget.org/packages/Microsoft.Extensions.Caching.Postgres/1.2.2) |  |  |\n| Communication Calling Windows Client | NuGet [1.15.0](https://www.nuget.org/packages/Azure.Communication.Calling.WindowsClient/1.15.0) |  |  |\n| Content Safety Extension Embedded Image | NuGet [1.0.1-beta.4](https://www.nuget.org/packages/Azure.AI.ContentSafety.Extension.Embedded.Image/1.0.1-beta.4) |  |  |\n| Content Safety Extension Embedded Text | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.ContentSafety.Extension.Embedded.Text/1.0.0)<br>NuGet [1.0.1-beta.4](https://www.nuget.org/packages/Azure.AI.ContentSafety.Extension.Embedded.Text/1.0.1-beta.4) |  |  |\n| Cosmos DB AOT | NuGet [0.1.4-preview.2](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Aot/0.1.4-preview.2) |  |  |\n| Cosmos DB Fault Injection | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.FaultInjection/1.0.0-beta.1) |  |  |\n| DotNetty | NuGet [0.7.6](https://www.nuget.org/packages/DotNetty.Common/0.7.6) |  |  |\n| Fabric MCP | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Fabric.Mcp/1.0.0) |  |  |\n| Fabric MCP | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Fabric.Mcp.linux-arm64/1.0.0) |  |  |\n| Fabric MCP | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Fabric.Mcp.linux-x64/1.0.0) |  |  |\n| Fabric MCP | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Fabric.Mcp.osx-arm64/1.0.0) |  |  |\n| Fabric MCP | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Fabric.Mcp.osx-x64/1.0.0) |  |  |\n| Fabric MCP | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Fabric.Mcp.win-arm64/1.0.0) |  |  |\n| Fabric MCP | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Fabric.Mcp.win-x64/1.0.0) |  |  |\n| Functions Extension MCP | NuGet [1.5.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Extensions.Mcp/1.5.0) |  |  |\n| Functions Worker Extension MCP | NuGet [1.5.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Mcp/1.5.0) |  |  |\n| Functions Worker Extension MCP SDK | NuGet [1.0.0-preview.4](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Mcp.Sdk/1.0.0-preview.4) |  |  |\n| Functions Worker Extension MySQL | NuGet [1.0.129](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.MySql/1.0.129) |  |  |\n| HTTP ASPNETCore Analyzers | NuGet [1.0.4](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore.Analyzers/1.0.4) |  |  |\n| IoT Operations Connector | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Iot.Operations.Connector/1.1.0) |  |  |\n| IoT Operations MQTT | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Iot.Operations.Mqtt/1.1.0) |  |  |\n| IoT Operations Protocol | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Iot.Operations.Protocol/1.2.0) |  |  |\n| IoT Operations Services | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Iot.Operations.Services/1.2.0) |  |  |\n| IoT Operations Templates | NuGet [0.1.0](https://www.nuget.org/packages/Azure.Iot.Operations.Templates/0.1.0) |  |  |\n| Item Templates NetCore | NuGet [4.0.5544](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.ItemTemplates.NetCore/4.0.5544) |  |  |\n| Item Templates NetFx | NuGet [4.0.5544](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.ItemTemplates.NetFx/4.0.5544) |  |  |\n| MCP Template | NuGet [0.0.12](https://www.nuget.org/packages/Microsoft.Template.Mcp/0.0.12) |  |  |\n| MCP Template | NuGet [0.0.12](https://www.nuget.org/packages/Microsoft.Template.Mcp.linux-arm64/0.0.12) |  |  |\n| MCP Template | NuGet [0.0.12](https://www.nuget.org/packages/Microsoft.Template.Mcp.linux-x64/0.0.12) |  |  |\n| MCP Template | NuGet [0.0.12](https://www.nuget.org/packages/Microsoft.Template.Mcp.osx-arm64/0.0.12) |  |  |\n| MCP Template | NuGet [0.0.12](https://www.nuget.org/packages/Microsoft.Template.Mcp.osx-x64/0.0.12) |  |  |\n| MCP Template | NuGet [0.0.12](https://www.nuget.org/packages/Microsoft.Template.Mcp.win-arm64/0.0.12) |  |  |\n| MCP Template | NuGet [0.0.12](https://www.nuget.org/packages/Microsoft.Template.Mcp.win-x64/0.0.12) |  |  |\n| MCP Template Server | NuGet [0.0.9](https://www.nuget.org/packages/Microsoft.Template.Mcp.Server.linux-arm64/0.0.9) |  |  |\n| MCP Template Server | NuGet [0.0.9](https://www.nuget.org/packages/Microsoft.Template.Mcp.Server.linux-x64/0.0.9) |  |  |\n| MCP Template Server | NuGet [0.0.9](https://www.nuget.org/packages/Microsoft.Template.Mcp.Server.osx-arm64/0.0.9) |  |  |\n| MCP Template Server | NuGet [0.0.9](https://www.nuget.org/packages/Microsoft.Template.Mcp.Server.osx-x64/0.0.9) |  |  |\n| MCP Template Server | NuGet [0.0.9](https://www.nuget.org/packages/Microsoft.Template.Mcp.Server.win-arm64/0.0.9) |  |  |\n| MCP Template Server | NuGet [0.0.9](https://www.nuget.org/packages/Microsoft.Template.Mcp.Server.win-x64/0.0.9) |  |  |\n| Microsoft.Azure.DataFactoryTestingFramework.Expressions | NuGet [0.2.7](https://www.nuget.org/packages/Microsoft.Azure.DataFactoryTestingFramework.Expressions/0.2.7) |  |  |\n| Microsoft.Azure.Functions.Worker.OpenTelemetry | NuGet [1.2.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.OpenTelemetry/1.2.0) |  |  |\n| OpenTelemetry Profiler | NuGet [1.0.0-beta9](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.Profiler/1.0.0-beta9) |  |  |\n| Speech CLI | NuGet [1.49.1](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech.CLI/1.49.1) |  |  |\n| Speech Extension Embedded SR | NuGet [1.49.1](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech.Extension.Embedded.SR/1.49.1) |  |  |\n| Speech Extension Embedded TTS | NuGet [1.49.1](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech.Extension.Embedded.TTS/1.49.1) |  |  |\n| Speech Extension MAS | NuGet [1.49.1](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech.Extension.MAS/1.49.1) |  |  |\n| Speech Extension ONNX Runtime | NuGet [1.49.1](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech.Extension.ONNX.Runtime/1.49.1) |  |  |\n| Speech Extension Telemetry | NuGet [1.49.1](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech.Extension.Telemetry/1.49.1) |  |  |\n| System Net Client Model | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/System.Net.ClientModel/1.0.0-beta.1) |  |  |\n| Unknown Display Name | NuGet [0.10.0-preview.1](https://www.nuget.org/packages/Azure.Connectors.Sdk/0.10.0-preview.1) |  |  |\n| Unknown Display Name | NuGet [0.4.0](https://www.nuget.org/packages/Azure.Functions.Sdk/0.4.0) |  |  |\n| Unknown Display Name | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Iot.Operations.ProtocolCompiler/1.0.0) |  |  |\n| Unknown Display Name | NuGet [0.8.0-preview.1](https://www.nuget.org/packages/Microsoft.Azure.Connectors.Sdk/0.8.0-preview.1) |  |  |\n| Unknown Display Name | NuGet [0.1.0-ci.26217.6](https://www.nuget.org/packages/Microsoft.Azure.Functions.Extensions.Connector/0.1.0-ci.26217.6) |  |  |\n| WebJobs Extension Cosmos DB Mongo | NuGet [1.2.2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.AzureCosmosDb.Mongo/1.2.2)<br>NuGet [1.2.3-preview](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.AzureCosmosDb.Mongo/1.2.3-preview) |  |  |\n| WebJobs Extension MySQL | NuGet [1.0.129](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.MySql/1.0.129) |  |  |\n| App Service | NuGet [0.2.2-alpha](https://www.nuget.org/packages/Microsoft.Azure.AppService/0.2.2-alpha) |  |  |\n| Application Insights | NuGet [0.9.0-preview](https://www.nuget.org/packages/Microsoft.Azure.ApplicationInsights/0.9.0-preview) |  |  |\n| Autorest Client Runtime - Azure | NuGet [3.3.19](https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime.Azure/3.3.19) |  | GitHub [3.3.19](https://github.com/Azure/azure-sdk-for-net/tree/mgmt-legacy/sdk/mgmtcommon/ClientRuntime.Azure) |\n| Autorest Client Runtime - Azure Authentication | NuGet [2.4.1](https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime.Azure.Authentication/2.4.1) |  | GitHub [2.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Rest.ClientRuntime.Azure.Authentication_2.4.1/sdk/mgmtcommon/Auth/Az.Auth/Az.Authentication) |\n| Autorest Client Runtime - Client | NuGet [2.3.24](https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime/2.3.24) |  | GitHub [2.3.24](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Rest.ClientRuntime_2.3.21/sdk/mgmtcommon/ClientRuntime) |\n| Autorest Client Runtime - ETW | NuGet [2.1.3](https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime.Etw/2.1.3) |  | GitHub [2.1.3](https://github.com/Azure/azure-sdk-for-net/tree/mgmt-legacy/sdk/mgmtcommon/ClientRuntime.Etw) |\n| Autorest Client Runtime - Log4Net | NuGet [2.1.4](https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime.Log4Net/2.1.4) |  | GitHub [2.1.4](https://github.com/Azure/azure-sdk-for-net/tree/mgmt-legacy/sdk/mgmtcommon/ClientRuntime.Log4Net) |\n| AutoRest Common | NuGet [2.4.48](https://www.nuget.org/packages/Microsoft.AutoRest.Common/2.4.48) |  | GitHub [2.4.48](https://github.com/Azure/autorest.common) |\n| Azure Stack - Azure Consistent Storage | NuGet [0.10.8-preview](https://www.nuget.org/packages/Microsoft.AzureStack.AzureConsistentStorage/0.10.8-preview) |  |  |\n| Azure.FX | NuGet [0.0.24-alpha](https://www.nuget.org/packages/Azure.FX/0.0.24-alpha) |  |  |\n| Azure.FX.Templates | NuGet [1.2.0](https://www.nuget.org/packages/Azure.FX.Templates/1.2.0) |  |  |\n| Batch | NuGet [16.3.1](https://www.nuget.org/packages/Microsoft.Azure.Batch/16.3.1) |  | GitHub [16.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Batch_16.3.1/sdk/batch/Microsoft.Azure.Batch/) |\n| Batch - Apps Cryptography | NuGet [1.1.1.4](https://www.nuget.org/packages/Microsoft.Azure.Batch.Apps.Cryptography/1.1.1.4) |  |  |\n| Batch - Conventions Files | NuGet [4.0.0](https://www.nuget.org/packages/Microsoft.Azure.Batch.Conventions.Files/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Batch.Conventions.Files_4.0.0/sdk/batch/Microsoft.Azure.Batch.Conventions.Files/) |\n| Batch - File Staging | NuGet [9.0.0](https://www.nuget.org/packages/Microsoft.Azure.Batch.FileStaging/9.0.0) |  | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-net/tree/mgmt-legacy/sdk/batch/Microsoft.Azure.Batch.FileStaging) |\n| Commerce Usage Aggregates | NuGet [1.5.3](https://www.nuget.org/packages/Microsoft.Azure.Commerce.UsageAggregates/1.5.3) |  |  |\n| Common | NuGet [2.2.1](https://www.nuget.org/packages/Microsoft.Azure.Common/2.2.1) |  |  |\n| Common - Dependencies | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Common.Dependencies/1.0.0) |  |  |\n| Cosmos DB | NuGet [3.58.0](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.58.0)<br>NuGet [3.60.0-preview.0](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.60.0-preview.0) | [docs](/dotnet/api/overview/azure/cosmosdb) | GitHub [3.58.0](https://github.com/Azure/azure-cosmos-dotnet-v3/tree/3.12.0/Microsoft.Azure.Cosmos) |\n| Data Lake Analytics | NuGet [1.4.211011](https://www.nuget.org/packages/Microsoft.Azure.DataLake.USQL.SDK/1.4.211011) |  |  |\n| Data Movement | NuGet [2.0.5](https://www.nuget.org/packages/Microsoft.Azure.Storage.DataMovement/2.0.5) |  | GitHub [2.0.5](https://github.com/Azure/azure-storage-net-data-movement/tree/v1.3.0) |\n| DCAP | NuGet [1.13.1](https://www.nuget.org/packages/Microsoft.Azure.DCAP/1.13.1) |  | GitHub [1.13.1](https://github.com/microsoft/Azure-DCAP-Client/tree/1.6) |\n| Devices Provisioning Service | NuGet [1.18.1](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Service/1.18.1)<br>NuGet [2.0.0-rc](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Service/2.0.0-rc) |  |  |\n| Digital Twins Service | NuGet [1.0.0-preview-001](https://www.nuget.org/packages/Microsoft.Azure.Devices.DigitalTwin.Service/1.0.0-preview-001) |  |  |\n| Event Hubs - Service Fabric Processor | NuGet [0.5.4](https://www.nuget.org/packages/Microsoft.Azure.EventHubs.ServiceFabricProcessor/0.5.4) |  | GitHub [0.5.4](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.EventHubs.ServiceFabricProcessor_0.5.4/sdk/eventhub/Microsoft.Azure.EventHubs.ServiceFabricProcessor/) |\n| Feature Management | NuGet [3.0.0](https://www.nuget.org/packages/Microsoft.FeatureManagement/3.0.0) | [docs](/dotnet/api/microsoft.featuremanagement) |  |\n| Gallery | NuGet [2.6.2-preview](https://www.nuget.org/packages/Microsoft.Azure.Gallery/2.6.2-preview) |  |  |\n| HDInsight - Job | NuGet [3.0.0-preview.3](https://www.nuget.org/packages/Microsoft.Azure.HDInsight.Job/3.0.0-preview.3) |  | GitHub [3.0.0-preview.3](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.HDInsight.Job_3.0.0-preview.3/sdk/hdinsight/Microsoft.Azure.HDInsight.Job/) |\n| IoT Edge Function | NuGet [3.5.3](https://www.nuget.org/packages/Microsoft.Azure.IoT.Edge.Function/3.5.3) |  |  |\n| IoT Plug and Play - Devices Client | NuGet [1.42.3](https://www.nuget.org/packages/Microsoft.Azure.Devices.Client/1.42.3)<br>NuGet [2.0.0-rc](https://www.nuget.org/packages/Microsoft.Azure.Devices.Client/2.0.0-rc) |  |  |\n| Kusto Data | NuGet [9.3.1](https://www.nuget.org/packages/Microsoft.Azure.Kusto.Data/9.3.1) | [docs](/azure/data-explorer/kusto/api/netfx/about-kusto-data) | GitHub [9.3.1](https://github.com/Azure/azure-kusto-dotnet) |\n| Kusto Ingest | NuGet [9.3.1](https://www.nuget.org/packages/Microsoft.Azure.Kusto.Ingest/9.3.1) | [docs](/azure/data-explorer/kusto/api/netfx/about-kusto-ingest) | GitHub [9.3.1](https://github.com/Azure/azure-kusto-dotnet) |\n| Media Live Video Analytics Edge | NuGet [1.0.4-preview.1](https://www.nuget.org/packages/Microsoft.Azure.Media.LiveVideoAnalytics.Edge/1.0.4-preview.1) |  | GitHub [1.0.4-preview.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Media.LiveVideoAnalytics.Edge_1.0.4-preview.1/sdk/mediaservices/Microsoft.Azure.Media.LiveVideoAnalytics.Edge) |\n| Microsoft Service Fabric | NuGet [11.3.475](https://www.nuget.org/packages/Microsoft.ServiceFabric/11.3.475) | [docs](/dotnet/api/overview/azure/service-fabric) |  |\n| Microsoft.Azure.Amqp | NuGet [2.7.2](https://www.nuget.org/packages/Microsoft.Azure.Amqp/2.7.2) |  |  |\n| Microsoft.Azure.Devices | NuGet [1.41.0](https://www.nuget.org/packages/Microsoft.Azure.Devices/1.41.0)<br>NuGet [2.0.0-rc](https://www.nuget.org/packages/Microsoft.Azure.Devices/2.0.0-rc) |  |  |\n| Microsoft.Azure.Devices.Authentication | NuGet [2.0.0-preview001](https://www.nuget.org/packages/Microsoft.Azure.Devices.Authentication/2.0.0-preview001) |  |  |\n| Microsoft.Azure.Devices.Client.PCL | NuGet [1.0.16](https://www.nuget.org/packages/Microsoft.Azure.Devices.Client.PCL/1.0.16) |  |  |\n| Microsoft.Azure.Devices.ProtocolGateway.Core | NuGet [2.0.1](https://www.nuget.org/packages/Microsoft.Azure.Devices.ProtocolGateway.Core/2.0.1) |  |  |\n| Microsoft.Azure.Devices.ProtocolGateway.IotHubClient | NuGet [2.0.1](https://www.nuget.org/packages/Microsoft.Azure.Devices.ProtocolGateway.IotHubClient/2.0.1) |  |  |\n| Microsoft.Azure.Devices.ProtocolGateway.Providers.CloudStorage | NuGet [2.0.1](https://www.nuget.org/packages/Microsoft.Azure.Devices.ProtocolGateway.Providers.CloudStorage/2.0.1) |  |  |\n| Microsoft.Azure.Devices.Provisioning.Client | NuGet [1.19.1](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Client/1.19.1)<br>NuGet [2.0.0-rc](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Client/2.0.0-rc) |  |  |\n| Microsoft.Azure.Devices.Provisioning.Security.Tpm | NuGet [1.14.1](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Security.Tpm/1.14.1)<br>NuGet [1.15.0-preview-001](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Security.Tpm/1.15.0-preview-001) |  |  |\n| Microsoft.Azure.Devices.Provisioning.Transport.Amqp | NuGet [1.16.1](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Transport.Amqp/1.16.1)<br>NuGet [1.17.0-preview-001](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Transport.Amqp/1.17.0-preview-001) |  |  |\n| Microsoft.Azure.Devices.Provisioning.Transport.Http | NuGet [1.15.1](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Transport.Http/1.15.1)<br>NuGet [1.16.0-preview-001](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Transport.Http/1.16.0-preview-001) |  |  |\n| Microsoft.Azure.Devices.Provisioning.Transport.Mqtt | NuGet [1.17.1](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Transport.Mqtt/1.17.1)<br>NuGet [1.18.0-preview-001](https://www.nuget.org/packages/Microsoft.Azure.Devices.Provisioning.Transport.Mqtt/1.18.0-preview-001) |  |  |\n| Microsoft.Azure.Devices.Shared | NuGet [1.30.1](https://www.nuget.org/packages/Microsoft.Azure.Devices.Shared/1.30.1)<br>NuGet [1.31.0-preview-001](https://www.nuget.org/packages/Microsoft.Azure.Devices.Shared/1.31.0-preview-001) |  |  |\n| Microsoft.Azure.IoT.Edge.Module | NuGet [8.0.0](https://www.nuget.org/packages/Microsoft.Azure.IoT.Edge.Module/8.0.0) |  |  |\n| Microsoft.Azure.uamqp | NuGet [1.2.11](https://www.nuget.org/packages/Microsoft.Azure.uamqp/1.2.11) |  |  |\n| Microsoft.Azure.umqtt | NuGet [1.1.11](https://www.nuget.org/packages/Microsoft.Azure.umqtt/1.1.11) |  |  |\n| Mobile Apps | NuGet [2.0.3](https://www.nuget.org/packages/Microsoft.Azure.Mobile.Server/2.0.3) |  |  |\n| Mobile Server - Cross Domain | NuGet [2.0.3](https://www.nuget.org/packages/Microsoft.Azure.Mobile.Server.CrossDomain/2.0.3) |  |  |\n| Notification Hubs | NuGet [4.2.0](https://www.nuget.org/packages/Microsoft.Azure.NotificationHubs/4.2.0) |  | GitHub [4.2.0](https://github.com/Azure/azure-notificationhubs-dotnet) |\n| Relay | NuGet [3.1.1](https://www.nuget.org/packages/Microsoft.Azure.Relay/3.1.1) | [docs](/dotnet/api/overview/azure/service-bus-relay) | GitHub [3.1.1](https://github.com/Azure/azure-relay-dotnet/tree/2.0.1) |\n| Schema Registry - Avro | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Kafka.SchemaRegistry.Avro/1.0.0-beta.1) |  |  |\n| Schema Registry - JSON | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Kafka.SchemaRegistry.Json/1.0.0-beta.1) |  |  |\n| Search - Common | NuGet [10.1.0](https://www.nuget.org/packages/Microsoft.Azure.Search.Common/10.1.0) |  | GitHub [10.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Search.Common_10.1.0/sdk/search/Microsoft.Azure.Search.Common/) |\n| Search - Data | NuGet [10.1.0](https://www.nuget.org/packages/Microsoft.Azure.Search.Data/10.1.0) |  | GitHub [10.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Search.Data_10.1.0/sdk/search/Microsoft.Azure.Search.Data/) |\n| Search - Service | NuGet [10.1.0](https://www.nuget.org/packages/Microsoft.Azure.Search.Service/10.1.0) |  | GitHub [10.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Search.Service_10.1.0/sdk/search/Microsoft.Azure.Search.Service/) |\n| Speech | NuGet [1.49.1](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech/1.49.1)<br>NuGet [1.47.0-beta.0.357883](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech/1.47.0-beta.0.357883) |  |  |\n| Speech Remote Conversation | NuGet [1.49.1](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech.Remoteconversation/1.49.1) |  |  |\n| Speech Xamarin iOS | NuGet [1.25.0](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech.Xamarin.iOS/1.25.0) |  |  |\n| Spell Check | NuGet [4.1.0-preview.1](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.Language.SpellCheck/4.1.0-preview.1) |  | GitHub [4.1.0-preview.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.CognitiveServices.Language.SpellCheck_4.1.0-preview.1/sdk/cognitiveservices/Language.SpellCheck) |\n| Spring Cloud Client | NuGet [2.0.0-preview.3](https://www.nuget.org/packages/Microsoft.Azure.SpringCloud.Client/2.0.0-preview.3) |  |  |\n| Storage - Files Data Lake | NuGet [2.0.3](https://www.nuget.org/packages/Microsoft.Azure.DataLake.Store/2.0.3) | [docs](/dotnet/api/overview/azure/data-lake-store) | GitHub [2.0.3](https://github.com/Azure/azure-data-lake-store-net/tree/1.2.3-alpha) |\n| Synapse Analytics | NuGet [0.1.0-preview](https://www.nuget.org/packages/Microsoft.Azure.Synapse/0.1.0-preview) |  | GitHub [0.1.0-preview](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Synapse_0.1.0-preview/sdk/synapse/Microsoft.Azure.Synapse/) |\n| Tables | NuGet [2.1.2](https://www.nuget.org/packages/Microsoft.Azure.CosmosDB.Table/2.1.2) |  |  |\n| WebSites - DataProtection | NuGet [0.1.78-alpha](https://www.nuget.org/packages/Microsoft.Azure.WebSites.DataProtection/0.1.78-alpha) |  |  |\n| App Service - API Apps Common | NuGet [0.9.36](https://www.nuget.org/packages/Microsoft.Azure.AppService.ApiApps.Common/0.9.36) |  |  |\n| App Service - API Apps Service | NuGet [0.9.64](https://www.nuget.org/packages/Microsoft.Azure.AppService.ApiApps.Service/0.9.64) |  |  |\n| Code Analyzers for Durable Functions | NuGet [0.5.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.DurableTask.Analyzers/0.5.0) |  | GitHub [0.5.0](https://github.com/Azure/azure-functions-durable-extension/tree/Analyzer-v0.3.0/src/WebJobs.Extensions.DurableTask.Analyzers) |\n| Cosmos DB - BulkExecutor | NuGet [2.5.1-preview](https://www.nuget.org/packages/Microsoft.Azure.CosmosDB.BulkExecutor/2.5.1-preview) |  | GitHub [2.5.1-preview](https://github.com/Azure/azure-cosmosdb-bulkexecutor-dotnet-getting-started) |\n| Cosmos DB - Direct | NuGet [3.43.1](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Direct/3.43.1) |  | GitHub [3.43.1](https://github.com/Azure/azure-cosmos-dotnet-v3) |\n| Cosmos DB - Encryption | NuGet [2.0.3](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Encryption/2.0.3)<br>NuGet [2.1.0-preview4](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Encryption/2.1.0-preview4) |  | GitHub [2.0.3](https://github.com/Azure/azure-cosmos-dotnet-v3/tree/releases/encryption/1.0.0-preview4/Microsoft.Azure.Cosmos.Encryption) |\n| Cosmos DB - Encryption | NuGet [1.0.0-preview07](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Encryption.Custom/1.0.0-preview07) |  |  |\n| Extensions - Caching Cosmos | NuGet [1.8.0](https://www.nuget.org/packages/Microsoft.Extensions.Caching.Cosmos/1.8.0) |  | GitHub [1.8.0](https://github.com/Azure/Microsoft.Extensions.Caching.Cosmos/tree/v1.0.0-preview4) |\n| Functions - Extensions | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Extensions/1.1.0) |  | GitHub [1.1.0](https://github.com/Azure/azure-functions-dotnet-extensions) |\n| Functions extension for Application Insights | NuGet [1.0.0-preview4](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ApplicationInsights/1.0.0-preview4) |  |  |\n| Functions extension for Azure Mobile Apps | NuGet [3.0.0-beta8](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.MobileApps/3.0.0-beta8) |  | GitHub [3.0.0-beta8](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/v3.0.0-beta8/src/WebJobs.Extensions.MobileApps) |\n| Functions extension for Azure SQL and SQL Server | NuGet [3.1.536](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Sql/3.1.536) |  |  |\n| Functions extension for Cosmos DB | NuGet [4.15.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.CosmosDB/4.15.0) |  | GitHub [4.15.0](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/cosmos-v3.0.7/src/WebJobs.Extensions.CosmosDB) |\n| Functions extension for DocumentDB | NuGet [1.3.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.DocumentDB/1.3.0) |  | GitHub [1.3.0](https://github.com/Azure/azure-webjobs-sdk-extensions) |\n| Functions extension for Durable Task Framework | NuGet [3.12.5](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.DurableTask/3.12.5) | [docs](/dotnet/api/overview/azure/functions) | GitHub [3.12.5](https://github.com/Azure/azure-functions-durable-extension/tree/v2.2.2/src/WebJobs.Extensions.DurableTask) |\n| Functions extension for Durable Task Framework - isolated worker | NuGet [1.16.5](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.DurableTask/1.16.5) |  |  |\n| Functions extension for HTTP | NuGet [3.3.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Http/3.3.0) |  | GitHub [3.3.0](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/v3.0.2/src/WebJobs.Extensions.Http) |\n| Functions extension for IoT Edge | NuGet [1.0.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EdgeHub/1.0.7) |  | GitHub [1.0.7](https://github.com/Azure/iotedge/tree/1.0.7/edge-hub) |\n| Functions extension for Kafka | NuGet [4.3.2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Kafka/4.3.2) |  | GitHub [4.3.2](https://github.com/Azure/azure-functions-kafka-extension/tree/3.0.0/src/Microsoft.Azure.WebJobs.Extensions.Kafka) |\n| Functions extension for Notification Hubs | NuGet [1.3.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.NotificationHubs/1.3.0) |  | GitHub [1.3.0](https://github.com/Azure/azure-webjobs-sdk-extensions) |\n| Functions extension for RabbitMQ | NuGet [2.1.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.RabbitMQ/2.1.0) |  | GitHub [2.1.0](https://github.com/Azure/azure-functions-rabbitmq-extension/tree/v0.2.2029-beta) |\n| Functions extension for script abstractions | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Script.Abstractions/1.1.0) |  |  |\n| Functions extension for SendGrid | NuGet [3.1.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.SendGrid/3.1.1) |  | GitHub [3.1.1](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/v3.0.0/src/WebJobs.Extensions.SendGrid) |\n| Functions extension for Sources | NuGet [3.0.45](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Sources/3.0.45) |  | GitHub [3.0.45](https://github.com/Azure/azure-webjobs-sdk) |\n| Functions extension for Storage Timers | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Timers.Storage/1.1.0) |  |  |\n| Functions extension for Twilio | NuGet [3.0.2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Twilio/3.0.2) |  | GitHub [3.0.2](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/v3.0.0/src/WebJobs.Extensions.Twilio) |\n| Functions extension metadata generator | NuGet [4.0.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator/4.0.1) |  | GitHub [4.0.1](https://github.com/Azure/azure-functions-host) |\n| Functions Extensions - Cosmos DB ChangeProcessor | NuGet [1.0.2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.CosmosDb.ChangeProcessor/1.0.2) |  |  |\n| Functions Extensions - Dapr | NuGet [1.0.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Dapr/1.0.1) |  |  |\n| Functions Extensions - Dapr Core | NuGet [1.0.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Extensions.Dapr.Core/1.0.1) |  |  |\n| Functions Extensions - HTTP AspNet Core | NuGet [2.1.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore/2.1.0) |  |  |\n| Functions Extensions - Redis | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Redis/1.0.0) |  |  |\n| Functions Extensions - Redis | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Redis/1.0.0) |  |  |\n| Functions Extensions - Worker Extentions | NuGet [1.0.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Dapr/1.0.1) |  |  |\n| Functions item template pack for Microsoft Template Engine | NuGet [4.0.5544](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.ItemTemplates/4.0.5544) |  | GitHub [4.0.5544](https://github.com/Azure/azure-functions-templates/tree/3.1.1582) |\n| Functions OpenAPI app settings deserialization library | NuGet [1.4.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.OpenApi.Configuration.AppSettings/1.4.0)<br>NuGet [2.0.0-preview2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.OpenApi.Configuration.AppSettings/2.0.0-preview2) |  |  |\n| Functions OpenAPI document and Swagger UI renderer library | NuGet [1.4.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.OpenApi/1.4.0)<br>NuGet [2.0.0-preview2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.OpenApi/2.0.0-preview2) |  |  |\n| Functions project template pack for Microsoft Template Engine | NuGet [4.0.5544](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.ProjectTemplates/4.0.5544) |  | GitHub [4.0.5544](https://github.com/Azure/azure-functions-templates/tree/3.1.1582) |\n| Functions runtime assemblies for App Insights logging | NuGet [3.0.45](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Logging.ApplicationInsights/3.0.45) |  | GitHub [3.0.45](https://github.com/Azure/azure-webjobs-sdk/tree/v3.0.18/src/Microsoft.Azure.WebJobs.Logging.ApplicationInsights) |\n| Functions runtime assemblies for logging | NuGet [4.0.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Logging/4.0.3) |  |  |\n| Functions runtime assemblies for Microsoft.Azure.WebJobs.Host | NuGet [3.0.45](https://www.nuget.org/packages/Microsoft.Azure.WebJobs/3.0.45) |  | GitHub [3.0.45](https://github.com/Azure/azure-webjobs-sdk/tree/v3.0.18/src/Microsoft.Azure.WebJobs) |\n| Functions timers and file triggers | NuGet [5.2.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions/5.2.1) |  | GitHub [5.2.1](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/dev/src/WebJobs.Extensions) |\n| Microsoft.Azure.Cosmos.Templates | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Templates/1.0.0) |  |  |\n| Microsoft.Azure.Functions.Analyzers | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Analyzers/1.0.0) |  |  |\n| Microsoft.Azure.Functions.Authentication.WebAssembly | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Authentication.WebAssembly/1.0.0)<br>NuGet [1.0.1-preview](https://www.nuget.org/packages/Microsoft.Azure.Functions.Authentication.WebAssembly/1.0.1-preview) |  |  |\n| Microsoft.Azure.Functions.Worker | NuGet [2.52.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker/2.52.0) |  |  |\n| Microsoft.Azure.Functions.Worker.ApplicationInsights | NuGet [2.50.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.ApplicationInsights/2.50.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Core | NuGet [2.52.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Core/2.52.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Abstractions | NuGet [1.3.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Abstractions/1.3.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.ApplicationInsights | NuGet [1.0.0-preview4](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.ApplicationInsights/1.0.0-preview4) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.CosmosDB | NuGet [4.15.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.CosmosDB/4.15.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.EventGrid | NuGet [3.6.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.EventGrid/3.6.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.EventHubs | NuGet [6.5.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.EventHubs/6.5.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Http | NuGet [3.3.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Http/3.3.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Kafka | NuGet [4.3.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Kafka/4.3.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Kusto | NuGet [1.0.13-Preview](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Kusto/1.0.13-Preview) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.OpenApi | NuGet [1.4.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.OpenApi/1.4.0)<br>NuGet [2.0.0-preview2](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.OpenApi/2.0.0-preview2) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.RabbitMQ | NuGet [2.1.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.RabbitMQ/2.1.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Rpc | NuGet [1.0.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Rpc/1.0.1) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.SendGrid | NuGet [3.1.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.SendGrid/3.1.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.ServiceBus | NuGet [5.24.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.ServiceBus/5.24.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.SignalRService | NuGet [2.0.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.SignalRService/2.0.1) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Sql | NuGet [3.1.536](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Sql/3.1.536) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Storage | NuGet [6.8.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage/6.8.1) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs | NuGet [6.8.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs/6.8.1) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues | NuGet [5.5.4](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues/5.5.4) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Storage.Tables | NuGet [1.0.0-preview1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Storage.Tables/1.0.0-preview1) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Tables | NuGet [1.5.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Tables/1.5.0) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Timer | NuGet [4.3.1](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Timer/4.3.1) |  |  |\n| Microsoft.Azure.Functions.Worker.Extensions.Warmup | NuGet [4.0.2](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.Warmup/4.0.2) |  |  |\n| Microsoft.Azure.Functions.Worker.Grpc | NuGet [2.52.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Grpc/2.52.0) |  |  |\n| Microsoft.Azure.Functions.Worker.ItemTemplates | NuGet [4.0.5544](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.ItemTemplates/4.0.5544) |  |  |\n| Microsoft.Azure.Functions.Worker.ProjectTemplates | NuGet [4.0.5544](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.ProjectTemplates/4.0.5544) |  |  |\n| Microsoft.Azure.Functions.Worker.Sdk | NuGet [2.0.7](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Sdk/2.0.7) |  |  |\n| Microsoft.Azure.Functions.Worker.Sdk.Analyzers | NuGet [1.2.2](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Sdk.Analyzers/1.2.2) |  |  |\n| Microsoft.Azure.Functions.Worker.Sdk.Generators | NuGet [1.3.6](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Sdk.Generators/1.3.6) |  |  |\n| Microsoft.Azure.WebJobs.CosmosDb.ChangeProcessor | NuGet [1.0.4](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.CosmosDb.ChangeProcessor/1.0.4) |  |  |\n| Microsoft.Azure.WebJobs.Extensions.Kusto | NuGet [1.0.13-Preview](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Kusto/1.0.13-Preview) |  |  |\n| Microsoft.Azure.WebJobs.Extensions.Rpc | NuGet [3.0.45](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Rpc/3.0.45) |  |  |\n| Microsoft.Azure.WebJobs.Rpc.Core | NuGet [3.0.45](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Rpc.Core/3.0.45) |  |  |\n| Service Bus - Message ID plugin | NuGet [2.0.0](https://www.nuget.org/packages/Microsoft.Azure.ServiceBus.MessageIdPlugin/2.0.0) |  |  |\n| SignalR | NuGet [1.33.0](https://www.nuget.org/packages/Microsoft.Azure.SignalR/1.33.0)<br>NuGet [1.25.0-preview1-11147](https://www.nuget.org/packages/Microsoft.Azure.SignalR/1.25.0-preview1-11147) |  | GitHub [1.33.0](https://github.com/Azure/azure-signalr/tree/v1.5.0/src/Microsoft.Azure.SignalR) |\n| SignalR - ASP.NET | NuGet [1.33.0](https://www.nuget.org/packages/Microsoft.Azure.SignalR.AspNet/1.33.0) |  | GitHub [1.33.0](https://github.com/Azure/azure-signalr/tree/v1.5.0/src/Microsoft.Azure.SignalR.AspNet) |\n| SignalR - Benchmark | NuGet [1.0.0-preview1-10415](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Benchmark/1.0.0-preview1-10415) |  | GitHub [1.0.0-preview1-10415](https://github.com/azure/azure-signalr-bench) |\n| SignalR - Protocols | NuGet [1.33.0](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Protocols/1.33.0) |  | GitHub [1.33.0](https://github.com/Azure/azure-signalr/tree/v1.5.0/src/Microsoft.Azure.SignalR.Protocols) |\n| SignalR - Serverless Protocols | NuGet [1.11.0](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Serverless.Protocols/1.11.0) |  | GitHub [1.11.0](https://github.com/Azure/azure-functions-signalrservice-extension/tree/v1.2.0/src/Microsoft.Azure.SignalR.Serverless.Protocols) |\n| SignalR Management | NuGet [1.33.0](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Management/1.33.0) |  | GitHub [1.33.0](https://github.com/Azure/azure-signalr/tree/v1.5.0/src/Microsoft.Azure.SignalR.Management) |\n| SQL Database Elastic Scale Client | NuGet [2.4.2](https://www.nuget.org/packages/Microsoft.Azure.SqlDatabase.ElasticScale.Client/2.4.2) |  | GitHub [2.4.2](https://github.com/Azure/elastic-db-tools/tree/v2.3.0/Src/ElasticScale.Client) |\n| SQL Database Elastic Scale Service SplitMerge | NuGet [1.2.0](https://www.nuget.org/packages/Microsoft.Azure.SqlDatabase.ElasticScale.Service.SplitMerge/1.2.0) |  |  |\n| SQL Database Jobs | NuGet [0.8.3362.1](https://www.nuget.org/packages/Microsoft.Azure.SqlDatabase.Jobs/0.8.3362.1) |  |  |\n| Storage APIs for Microsoft.Azure.WebJobs.Host | NuGet [5.0.2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Host.Storage/5.0.2) |  | GitHub [5.0.2](https://github.com/Azure/azure-webjobs-sdk/tree/storage-v4.0.1/src/Microsoft.Azure.WebJobs.Host.Storage) |\n| Supporting library for Microsoft.Azure.WebJobs | NuGet [3.0.45](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Core/3.0.45) |  | GitHub [3.0.45](https://github.com/Azure/azure-webjobs-sdk/tree/v3.0.18) |\n| Supporting library for Microsoft.Azure.WebJobs.Extensions.OpenApi | NuGet [1.4.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/1.4.0)<br>NuGet [2.0.0-preview2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/2.0.0-preview2) |  |  |\n| Supporting library for testing Microsoft.Azure.WebJobs.Host | NuGet [3.0.45](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Host.TestCommon/3.0.45) |  | GitHub [3.0.45](https://github.com/Azure/azure-webjobs-sdk) |\n| Web - Redis Output Cache Provider | NuGet [4.0.1](https://www.nuget.org/packages/Microsoft.Web.RedisOutputCacheProvider/4.0.1) |  | GitHub [4.0.1](https://github.com/Azure/aspnet-redis-providers/tree/NuGet-Release/RedisOutputCacheProvider-3.0.1/src/OutputCacheProvider) |\n| Web - Redis Session State Provider | NuGet [5.0.4](https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/5.0.4) |  | GitHub [5.0.4](https://github.com/Azure/aspnet-redis-providers/tree/NuGet-Release/RedisSessionStateProvider-4.0.1/src/RedisSessionStateProvider) |\n| Hyak Common | NuGet [1.2.2](https://www.nuget.org/packages/Hyak.Common/1.2.2) |  |  |\n| Hyak Common - Tracing Etw | NuGet [1.0.2](https://www.nuget.org/packages/Hyak.Common.Tracing.Etw/1.0.2) |  |  |\n| Hyak Common - Tracing Log4Net | NuGet [1.0.2](https://www.nuget.org/packages/Hyak.Common.Tracing.Log4Net/1.0.2) |  |  |\n| Microsoft.Azure.SignalR.Emulator | NuGet [1.6.1](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Emulator/1.6.1)<br>NuGet [1.0.0-preview1-10809](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Emulator/1.0.0-preview1-10809) |  |  |\n| MSBuild | NuGet [0.42.0](https://www.nuget.org/packages/Microsoft.TypeSpec.MSBuild/0.42.0) |  |  |\n| ProviderHub Controller | NuGet [0.28.0](https://www.nuget.org/packages/Microsoft.TypeSpec.ProviderHub.Controller/0.28.0) |  |  |\n| ProviderHub Templates | NuGet [1.21.0](https://www.nuget.org/packages/Microsoft.TypeSpec.ProviderHub.Templates/1.21.0) |  |  |\n| Template | NuGet [1.0.2-preview1](https://www.nuget.org/packages/Microsoft.Azure.Template/1.0.2-preview1) |  |  |\n| Test HttpRecorder | NuGet [1.13.3](https://www.nuget.org/packages/Microsoft.Azure.Test.HttpRecorder/1.13.3) |  | GitHub [1.13.3](https://github.com/Azure/azure-sdk-for-net/tree/mgmt-legacy/sdk/mgmtcommon/TestFramework/Microsoft.Azure.Test.HttpRecorder) |\n"
  },
  {
    "path": "articles/includes/dotnet-new.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| AI Agent Server - Agent Framework | NuGet [1.0.0-beta.11](https://www.nuget.org/packages/Azure.AI.AgentServer.AgentFramework/1.0.0-beta.11) | [docs](/dotnet/api/overview/azure/AI.AgentServer.AgentFramework-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.11](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.AgentFramework_1.0.0-beta.11/sdk/agentserver/Azure.AI.AgentServer.AgentFramework/) |\n| AI Agent Server - Contracts | NuGet [1.0.0-beta.11](https://www.nuget.org/packages/Azure.AI.AgentServer.Contracts/1.0.0-beta.11) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Contracts-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.11](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Contracts_1.0.0-beta.11/sdk/agentserver/Azure.AI.AgentServer.Contracts/) |\n| AI Agent Server - Core | NuGet [1.0.0-beta.23](https://www.nuget.org/packages/Azure.AI.AgentServer.Core/1.0.0-beta.23) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Core-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.23](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Core_1.0.0-beta.23/sdk/agentserver/Azure.AI.AgentServer.Core/) |\n| AI Agents Persistent | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Agents.Persistent/1.1.0)<br>NuGet [1.2.0-beta.10](https://www.nuget.org/packages/Azure.AI.Agents.Persistent/1.2.0-beta.10) | [docs](/dotnet/api/overview/azure/AI.Agents.Persistent-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Agents.Persistent_1.1.0/sdk/ai/Azure.AI.Agents.Persistent/)<br>GitHub [1.2.0-beta.10](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Agents.Persistent_1.2.0-beta.10/sdk/ai/Azure.AI.Agents.Persistent/) |\n| AI Foundry | NuGet [2.0.1](https://www.nuget.org/packages/Azure.AI.Projects/2.0.1)<br>NuGet [2.1.0-beta.1](https://www.nuget.org/packages/Azure.AI.Projects/2.1.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Projects-readme) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects_2.0.1/sdk/ai/Azure.AI.Projects/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects_2.1.0-beta.1/sdk/ai/Azure.AI.Projects/) |\n| AI Model Inference | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.AI.Inference/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/AI.Inference-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Inference_1.0.0-beta.5/sdk/ai/Azure.AI.Inference/) |\n| AI Projects - OpenAI | NuGet [2.0.0-beta.1](https://www.nuget.org/packages/Azure.AI.Projects.OpenAI/2.0.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Projects.OpenAI-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects.OpenAI_2.0.0-beta.1/sdk/ai/Azure.AI.Projects.OpenAI/) |\n| Anomaly Detector | NuGet [3.0.0-preview.7](https://www.nuget.org/packages/Azure.AI.AnomalyDetector/3.0.0-preview.7) | [docs](/dotnet/api/overview/azure/AI.AnomalyDetector-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [3.0.0-preview.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AnomalyDetector_3.0.0-preview.7/sdk/anomalydetector/Azure.AI.AnomalyDetector/) |\n| App Configuration | NuGet [1.9.0](https://www.nuget.org/packages/Azure.Data.AppConfiguration/1.9.0) | [docs](/dotnet/api/overview/azure/Data.AppConfiguration-readme) | GitHub [1.9.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.AppConfiguration_1.9.0/sdk/appconfiguration/Azure.Data.AppConfiguration/) |\n| App Configuration Provider | NuGet [8.5.0](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.AzureAppConfiguration/8.5.0)<br>NuGet [8.6.0-preview](https://www.nuget.org/packages/Microsoft.Extensions.Configuration.AzureAppConfiguration/8.6.0-preview) | [docs](/dotnet/api/overview/azure/Microsoft.Extensions.Configuration.AzureAppConfiguration-readme) | GitHub [8.5.0](https://github.com/Azure/AppConfiguration-DotnetProvider) |\n| Attestation | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Security.Attestation/1.0.0) | [docs](/dotnet/api/overview/azure/Security.Attestation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.Attestation_1.0.0/sdk/attestation/Azure.Security.Attestation/) |\n| Azure AI Search | NuGet [12.0.0](https://www.nuget.org/packages/Azure.Search.Documents/12.0.0) | [docs](/dotnet/api/overview/azure/Search.Documents-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_12.0.0/sdk/search/Azure.Search.Documents/) |\n| Azure AI Transcription | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Speech.Transcription/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Speech.Transcription-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Speech.Transcription_1.0.0-beta.2/sdk/transcription/Azure.AI.Speech.Transcription/) |\n| Azure Object Anchors Conversion | NuGet [0.3.0-beta.6](https://www.nuget.org/packages/Azure.MixedReality.ObjectAnchors.Conversion/0.3.0-beta.6) |  | GitHub [0.3.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.MixedReality.ObjectAnchors.Conversion_0.3.0-beta.6/sdk/objectanchors/Azure.MixedReality.ObjectAnchors.Conversion/) |\n| Azure Remote Rendering | NuGet [1.1.0](https://www.nuget.org/packages/Azure.MixedReality.RemoteRendering/1.1.0) | [docs](/dotnet/api/overview/azure/MixedReality.RemoteRendering-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.MixedReality.RemoteRendering_1.1.0/sdk/remoterendering/Azure.MixedReality.RemoteRendering/) |\n| Calling Server | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Communication.CallingServer/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Communication.CallingServer-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.CallingServer_1.0.0-beta.3/sdk/communication/Azure.Communication.CallingServer/) |\n| Code Transparency | NuGet [1.0.0-beta.8](https://www.nuget.org/packages/Azure.Security.CodeTransparency/1.0.0-beta.8) | [docs](/dotnet/api/overview/azure/Security.CodeTransparency-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.8](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.CodeTransparency_1.0.0-beta.8/sdk/confidentialledger/Azure.Security.CodeTransparency/) |\n| Communication Call Automation | NuGet [1.5.1](https://www.nuget.org/packages/Azure.Communication.CallAutomation/1.5.1)<br>NuGet [1.6.0-beta.2](https://www.nuget.org/packages/Azure.Communication.CallAutomation/1.6.0-beta.2) | [docs](/dotnet/api/overview/azure/Communication.CallAutomation-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.CallAutomation_1.5.1/sdk/communication/Azure.Communication.CallAutomation/)<br>GitHub [1.6.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.CallAutomation_1.6.0-beta.2/sdk/communication/Azure.Communication.CallAutomation/) |\n| Communication Chat | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Communication.Chat/1.4.0) | [docs](/dotnet/api/overview/azure/Communication.Chat-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Chat_1.4.0/sdk/communication/Azure.Communication.Chat/) |\n| Communication Common | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Communication.Common/1.4.0)<br>NuGet [2.0.0-beta.1](https://www.nuget.org/packages/Azure.Communication.Common/2.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Communication.Common-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Common_1.4.0/sdk/communication/Azure.Communication.Common/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Common_2.0.0-beta.1/sdk/communication/Azure.Communication.Common/) |\n| Communication Email | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Communication.Email/1.1.0) | [docs](/dotnet/api/overview/azure/Communication.Email-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Email_1.1.0/sdk/communication/Azure.Communication.Email/) |\n| Communication Identity | NuGet [1.3.1](https://www.nuget.org/packages/Azure.Communication.Identity/1.3.1)<br>NuGet [1.4.0-beta.1](https://www.nuget.org/packages/Azure.Communication.Identity/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/Communication.Identity-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Identity_1.3.1/sdk/communication/Azure.Communication.Identity/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Identity_1.4.0-beta.1/sdk/communication/Azure.Communication.Identity/) |\n| Communication JobRouter | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Communication.JobRouter/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Communication.JobRouter/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Communication.JobRouter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.JobRouter_1.0.0/sdk/communication/Azure.Communication.JobRouter/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.JobRouter_1.1.0-beta.1/sdk/communication/Azure.Communication.JobRouter/) |\n| Communication Messages | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Communication.Messages/1.1.0)<br>NuGet [1.3.0-beta.2](https://www.nuget.org/packages/Azure.Communication.Messages/1.3.0-beta.2) | [docs](/dotnet/api/overview/azure/Communication.Messages-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Messages_1.1.0/sdk/communication/Azure.Communication.Messages/)<br>GitHub [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Messages_1.3.0-beta.2/sdk/communication/Azure.Communication.Messages/) |\n| Communication Network Traversal | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Communication.NetworkTraversal/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Communication.NetworkTraversal/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Communication.NetworkTraversal-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.NetworkTraversal_1.0.0/sdk/communication/Azure.Communication.NetworkTraversal/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.NetworkTraversal_1.1.0-beta.1/sdk/communication/Azure.Communication.NetworkTraversal/) |\n| Communication Phone Numbers | NuGet [1.5.0](https://www.nuget.org/packages/Azure.Communication.PhoneNumbers/1.5.0) | [docs](/dotnet/api/overview/azure/Communication.PhoneNumbers-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.PhoneNumbers_1.5.0/sdk/communication/Azure.Communication.PhoneNumbers/) |\n| Communication Rooms | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Communication.Rooms/1.2.0) | [docs](/dotnet/api/overview/azure/Communication.Rooms-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Rooms_1.2.0/sdk/communication/Azure.Communication.Rooms/) |\n| Communication SMS | NuGet [1.0.2](https://www.nuget.org/packages/Azure.Communication.Sms/1.0.2)<br>NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.Communication.Sms/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/Communication.Sms-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Sms_1.0.2/sdk/communication/Azure.Communication.Sms/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Sms_1.1.0-beta.3/sdk/communication/Azure.Communication.Sms/) |\n| Compute Batch | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Compute.Batch/1.0.0) | [docs](/dotnet/api/overview/azure/Compute.Batch-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Compute.Batch_1.0.0/sdk/batch/Azure.Compute.Batch/) |\n| Confidential Ledger | NuGet [1.3.0](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.3.0)<br>NuGet [1.4.1-beta.3](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.4.1-beta.3) | [docs](/dotnet/api/overview/azure/Security.ConfidentialLedger-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.3.0/sdk/confidentialledger/Azure.Security.ConfidentialLedger/)<br>GitHub [1.4.1-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.4.1-beta.3/sdk/confidentialledger/Azure.Security.ConfidentialLedger/) |\n| Container Registry | NuGet [1.3.0](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.3.0) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.3.0/sdk/containerregistry/Azure.Containers.ContainerRegistry/) |\n| Content Safety | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.ContentSafety/1.0.0) | [docs](/dotnet/api/overview/azure/AI.ContentSafety-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentSafety_1.0.0/sdk/contentsafety/Azure.AI.ContentSafety/) |\n| Content Understanding | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.ContentUnderstanding/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.AI.ContentUnderstanding/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.ContentUnderstanding-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentUnderstanding_1.1.0/sdk/contentunderstanding/Azure.AI.ContentUnderstanding/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.ContentUnderstanding_1.2.0-beta.1/sdk/contentunderstanding/Azure.AI.ContentUnderstanding/) |\n| Conversational Language Understanding | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Language.Conversations/1.1.0)<br>NuGet [2.0.0-beta.5](https://www.nuget.org/packages/Azure.AI.Language.Conversations/2.0.0-beta.5) | [docs](/dotnet/api/overview/azure/AI.Language.Conversations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations_1.1.0/sdk/cognitivelanguage/Azure.AI.Language.Conversations/)<br>GitHub [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations_2.0.0-beta.5/sdk/cognitivelanguage/Azure.AI.Language.Conversations/) |\n| Conversations Authoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.AI.Language.Conversations.Authoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/AI.Language.Conversations.Authoring-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Conversations.Authoring_1.0.0-beta.3/sdk/cognitivelanguage/Azure.AI.Language.Conversations.Authoring/) |\n| Core - Client - AMQP | NuGet [1.3.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.3.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.3.1/sdk/core/Azure.Core.Amqp/) |\n| Core - Client - Core | NuGet [1.55.0](https://www.nuget.org/packages/Azure.Core/1.55.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.55.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.55.0/sdk/core/Azure.Core/) |\n| Core - Client - Core | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Core.Expressions.DataFactory/1.0.0) | [docs](/dotnet/api/overview/azure/Core.Expressions.DataFactory-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Expressions.DataFactory_1.0.0/sdk/core/Azure.Core.Expressions.DataFactory/) |\n| Core Newtonsoft Json | NuGet [2.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.NewtonsoftJson/2.0.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Core.NewtonsoftJson-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.NewtonsoftJson_2.0.0/sdk/core/Microsoft.Azure.Core.NewtonsoftJson/) |\n| Core WCF Storage Queues | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.CoreWCF.Azure.StorageQueues/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.CoreWCF.Azure.StorageQueues-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.CoreWCF.Azure.StorageQueues_1.0.0-beta.1/sdk/extension-wcf/Microsoft.CoreWCF.Azure.StorageQueues/) |\n| Data Movement | NuGet [12.3.0](https://www.nuget.org/packages/Azure.Storage.DataMovement/12.3.0) | [docs](/dotnet/api/overview/azure/Storage.DataMovement-readme) | GitHub [12.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement_12.3.0/sdk/storage/Azure.Storage.DataMovement/) |\n| Data Movement - Blobs | NuGet [12.3.0](https://www.nuget.org/packages/Azure.Storage.DataMovement.Blobs/12.3.0) | [docs](/dotnet/api/overview/azure/Storage.DataMovement.Blobs-readme) | GitHub [12.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement.Blobs_12.3.0/sdk/storage/Azure.Storage.DataMovement.Blobs/) |\n| Data Movement - Files Shares | NuGet [12.3.0](https://www.nuget.org/packages/Azure.Storage.DataMovement.Files.Shares/12.3.0) | [docs](/dotnet/api/overview/azure/Storage.DataMovement.Files.Shares-readme) | GitHub [12.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.DataMovement.Files.Shares_12.3.0/sdk/storage/Azure.Storage.DataMovement.Files.Shares/) |\n| Defender EASM | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Defender.Easm/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Defender.Easm-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Defender.Easm_1.0.0-beta.1/sdk/easm/Azure.Analytics.Defender.Easm/) |\n| Dev Center | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.DevCenter/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.DevCenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.DevCenter_1.0.0/sdk/devcenter/Azure.Developer.DevCenter/) |\n| Device Update | NuGet [1.0.0](https://www.nuget.org/packages/Azure.IoT.DeviceUpdate/1.0.0) | [docs](/dotnet/api/overview/azure/IoT.DeviceUpdate-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.DeviceUpdate_1.0.0/sdk/deviceupdate/Azure.IoT.DeviceUpdate/) |\n| Digital Twins | NuGet [1.6.0](https://www.nuget.org/packages/Azure.DigitalTwins.Core/1.6.0) | [docs](/dotnet/api/overview/azure/DigitalTwins.Core-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.DigitalTwins.Core_1.6.0/sdk/digitaltwins/Azure.DigitalTwins.Core/) |\n| Document Intelligence | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.DocumentIntelligence/1.0.0) | [docs](/dotnet/api/overview/azure/AI.DocumentIntelligence-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.DocumentIntelligence_1.0.0/sdk/documentintelligence/Azure.AI.DocumentIntelligence/) |\n| Document Translation | NuGet [2.0.0](https://www.nuget.org/packages/Azure.AI.Translation.Document/2.0.0) | [docs](/dotnet/api/overview/azure/AI.Translation.Document-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Document_2.0.0/sdk/translation/Azure.AI.Translation.Document/) |\n| Event Grid | NuGet [5.0.0](https://www.nuget.org/packages/Azure.Messaging.EventGrid/5.0.0) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid_5.0.0/sdk/eventgrid/Azure.Messaging.EventGrid/) |\n| Event Grid Namespaces | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Messaging.EventGrid.Namespaces/1.1.0) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid.Namespaces-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid.Namespaces_1.1.0/sdk/eventgrid/Azure.Messaging.EventGrid.Namespaces/) |\n| Event Hubs | NuGet [5.12.2](https://www.nuget.org/packages/Azure.Messaging.EventHubs/5.12.2) | [docs](/dotnet/api/overview/azure/Messaging.EventHubs-readme) | GitHub [5.12.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventHubs_5.12.2/sdk/eventhub/Azure.Messaging.EventHubs/) |\n| Event Hubs - Event Processor | NuGet [5.12.2](https://www.nuget.org/packages/Azure.Messaging.EventHubs.Processor/5.12.2) | [docs](/dotnet/api/overview/azure/Messaging.EventHubs.Processor-readme) | GitHub [5.12.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventHubs.Processor_5.12.2/sdk/eventhub/Azure.Messaging.EventHubs.Processor/) |\n| Face | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Vision.Face/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Vision.Face-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Vision.Face_1.0.0-beta.2/sdk/face/Azure.AI.Vision.Face/) |\n| FarmBeats | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Verticals.AgriFood.Farming/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Verticals.AgriFood.Farming-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Verticals.AgriFood.Farming_1.0.0-beta.2/sdk/agrifood/Azure.Verticals.AgriFood.Farming/) |\n| Form Recognizer | NuGet [4.1.0](https://www.nuget.org/packages/Azure.AI.FormRecognizer/4.1.0) | [docs](/dotnet/api/overview/azure/AI.FormRecognizer-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.FormRecognizer_4.1.0/sdk/formrecognizer/Azure.AI.FormRecognizer/) |\n| Functions Extensions - WebPubSub | NuGet [1.7.0](https://www.nuget.org/packages/Microsoft.Azure.Functions.Worker.Extensions.WebPubSub/1.7.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Functions.Worker.Extensions.WebPubSub-readme) | GitHub [1.7.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Functions.Worker.Extensions.WebPubSub_1.7.0/sdk/webpubsub/Microsoft.Azure.Functions.Worker.Extensions.WebPubSub/) |\n| Health Deidentification | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Health.Deidentification/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Health.Deidentification/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Health.Deidentification-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Deidentification_1.0.0/sdk/healthdataaiservices/Azure.Health.Deidentification/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Deidentification_1.1.0-beta.1/sdk/healthdataaiservices/Azure.Health.Deidentification/) |\n| Health Insights Cancer Profiling | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Health.Insights.CancerProfiling/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Health.Insights.CancerProfiling-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.CancerProfiling_1.0.0-beta.1/sdk/healthinsights/Azure.Health.Insights.CancerProfiling/) |\n| Health Insights Clinical Matching | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Health.Insights.ClinicalMatching/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Health.Insights.ClinicalMatching-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.ClinicalMatching_1.0.0-beta.1/sdk/healthinsights/Azure.Health.Insights.ClinicalMatching/) |\n| Health Insights Radiology Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Health.Insights.RadiologyInsights/1.1.0) | [docs](/dotnet/api/overview/azure/Health.Insights.RadiologyInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Health.Insights.RadiologyInsights_1.1.0/sdk/healthinsights/Azure.Health.Insights.RadiologyInsights/) |\n| Identity | NuGet [1.21.0](https://www.nuget.org/packages/Azure.Identity/1.21.0) | [docs](/dotnet/api/overview/azure/Identity-readme) | GitHub [1.21.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.21.0/sdk/identity/Azure.Identity/) |\n| Identity Broker | NuGet [1.6.0](https://www.nuget.org/packages/Azure.Identity.Broker/1.6.0) | [docs](/dotnet/api/overview/azure/Identity.Broker-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity.Broker_1.6.0/sdk/identity/Azure.Identity.Broker/) |\n| Image Analysis | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.Vision.ImageAnalysis/1.0.0) | [docs](/dotnet/api/overview/azure/AI.Vision.ImageAnalysis-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Vision.ImageAnalysis_1.0.0/sdk/vision/Azure.AI.Vision.ImageAnalysis/) |\n| Key Vault - Administration | NuGet [4.8.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.8.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Administration-readme) | GitHub [4.8.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.8.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) |\n| Key Vault - Certificates | NuGet [4.8.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.8.0)<br>NuGet [4.9.0-beta.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.9.0-beta.1) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.8.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.8.0/sdk/keyvault/Azure.Security.KeyVault.Certificates/)<br>GitHub [4.9.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.9.0-beta.1/sdk/keyvault/Azure.Security.KeyVault.Certificates/) |\n| Key Vault - Keys | NuGet [4.10.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.10.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Keys-readme) | GitHub [4.10.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.10.0/sdk/keyvault/Azure.Security.KeyVault.Keys/) |\n| Key Vault - Secrets | NuGet [4.11.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.11.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Secrets-readme) | GitHub [4.11.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.11.0/sdk/keyvault/Azure.Security.KeyVault.Secrets/) |\n| Language Text | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.Language.Text/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.Language.Text-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Text_1.0.0-beta.4/sdk/cognitivelanguage/Azure.AI.Language.Text/) |\n| Load Testing | NuGet [1.0.2](https://www.nuget.org/packages/Azure.Developer.LoadTesting/1.0.2)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.Developer.LoadTesting/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/Developer.LoadTesting-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.LoadTesting_1.0.2/sdk/loadtestservice/Azure.Developer.LoadTesting/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.LoadTesting_1.3.0-beta.1/sdk/loadtestservice/Azure.Developer.LoadTesting/) |\n| Maps Common | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Maps.Common/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Maps.Common-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.Common_1.0.0-beta.4/sdk/maps/Azure.Maps.Common/) |\n| Maps Geolocation | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Maps.Geolocation/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Maps.Geolocation-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.Geolocation_1.0.0-beta.3/sdk/maps/Azure.Maps.Geolocation/) |\n| Maps Render | NuGet [2.0.0-beta.1](https://www.nuget.org/packages/Azure.Maps.Rendering/2.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Maps.Rendering-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.Rendering_2.0.0-beta.1/sdk/maps/Azure.Maps.Rendering/) |\n| Maps Route | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Maps.Routing/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Maps.Routing-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.Routing_1.0.0-beta.4/sdk/maps/Azure.Maps.Routing/) |\n| Maps Search | NuGet [2.0.0-beta.5](https://www.nuget.org/packages/Azure.Maps.Search/2.0.0-beta.5) | [docs](/dotnet/api/overview/azure/Maps.Search-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.Search_2.0.0-beta.5/sdk/maps/Azure.Maps.Search/) |\n| Media Analytics Edge | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Media.Analytics.Edge/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Media.Analytics.Edge-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Media.Analytics.Edge_1.0.0-beta.1/sdk/mediaservices/Azure.Media.Analytics.Edge) |\n| Metrics Advisor | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.MetricsAdvisor/1.1.0) | [docs](/dotnet/api/overview/azure/AI.MetricsAdvisor-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.MetricsAdvisor_1.1.0/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/) |\n| Microsoft Playwright Testing | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Developer.MicrosoftPlaywrightTesting.TestLogger/1.0.0-beta.4) |  | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.MicrosoftPlaywrightTesting.TestLogger_1.0.0-beta.4/sdk/playwrighttesting/Azure.Developer.MicrosoftPlaywrightTesting.TestLogger/) |\n| Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents/1.1.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents_1.1.0/sdk/entra/Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents/) |\n| Microsoft.Azure.WebPubSub.AspNetCore | NuGet [1.5.0](https://www.nuget.org/packages/Microsoft.Azure.WebPubSub.AspNetCore/1.5.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebPubSub.AspNetCore-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebPubSub.AspNetCore_1.5.0/sdk/webpubsub/Microsoft.Azure.WebPubSub.AspNetCore/) |\n| Microsoft.Azure.WebPubSub.Common | NuGet [1.5.0](https://www.nuget.org/packages/Microsoft.Azure.WebPubSub.Common/1.5.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebPubSub.Common-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebPubSub.Common_1.5.0/sdk/webpubsub/Microsoft.Azure.WebPubSub.Common/) |\n| Mixed Reality Authentication | NuGet [1.2.0](https://www.nuget.org/packages/Azure.MixedReality.Authentication/1.2.0) | [docs](/dotnet/api/overview/azure/MixedReality.Authentication-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.MixedReality.Authentication_1.2.0/sdk/mixedreality/Azure.MixedReality.Authentication/) |\n| Models Repository | NuGet [1.0.0-preview.6](https://www.nuget.org/packages/Azure.IoT.ModelsRepository/1.0.0-preview.6) | [docs](/dotnet/api/overview/azure/IoT.ModelsRepository-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-preview.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.ModelsRepository_1.0.0-preview.6/sdk/modelsrepository/Azure.IoT.ModelsRepository/) |\n| Monitor Ingestion | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Monitor.Ingestion/1.2.0) | [docs](/dotnet/api/overview/azure/Monitor.Ingestion-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Ingestion_1.2.0/sdk/monitor/Azure.Monitor.Ingestion/) |\n| Monitor Query | NuGet [1.7.1](https://www.nuget.org/packages/Azure.Monitor.Query/1.7.1) | [docs](/dotnet/api/overview/azure/Monitor.Query-readme) | GitHub [1.7.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query_1.7.1/sdk/monitor/Azure.Monitor.Query/) |\n| Monitor Query Logs | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Monitor.Query.Logs/1.0.0) | [docs](/dotnet/api/overview/azure/Monitor.Query.Logs-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query.Logs_1.0.0/sdk/monitor/Azure.Monitor.Query.Logs/) |\n| Monitor Query Metrics | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Monitor.Query.Metrics/1.0.0) | [docs](/dotnet/api/overview/azure/Monitor.Query.Metrics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query.Metrics_1.0.0/sdk/monitor/Azure.Monitor.Query.Metrics/) |\n| NUnit ? Microsoft Playwright Testing | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Developer.MicrosoftPlaywrightTesting.NUnit/1.0.0-beta.4) |  | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.MicrosoftPlaywrightTesting.NUnit_1.0.0-beta.4/sdk/playwrighttesting/Azure.Developer.MicrosoftPlaywrightTesting.NUnit/) |\n| Online Experimentation | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.OnlineExperimentation/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.OnlineExperimentation-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.OnlineExperimentation_1.0.0-beta.1/sdk/onlineexperimentation/Azure.Analytics.OnlineExperimentation/) |\n| OpenAI Assistants | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.OpenAI.Assistants/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.OpenAI.Assistants-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI.Assistants_1.0.0-beta.4/sdk/openai/Azure.AI.OpenAI.Assistants/) |\n| OpenAI Inference | NuGet [2.1.0](https://www.nuget.org/packages/Azure.AI.OpenAI/2.1.0)<br>NuGet [2.9.0-beta.1](https://www.nuget.org/packages/Azure.AI.OpenAI/2.9.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.OpenAI-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI_2.1.0/sdk/openai/Azure.AI.OpenAI/)<br>GitHub [2.9.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.OpenAI_2.9.0-beta.1/sdk/openai/Azure.AI.OpenAI/) |\n| OpenTelemetry AspNetCore | NuGet [1.5.0](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.AspNetCore/1.5.0) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.AspNetCore-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.AspNetCore_1.5.0/sdk/monitor/Azure.Monitor.OpenTelemetry.AspNetCore/) |\n| OpenTelemetry Exporter | NuGet [1.8.0](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.Exporter/1.8.0) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.Exporter-readme) | GitHub [1.8.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.Exporter_1.8.0/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/) |\n| OpenTelemetry LiveMetrics | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.LiveMetrics/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.LiveMetrics-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.LiveMetrics_1.0.0-beta.3/sdk/monitor/Azure.Monitor.OpenTelemetry.LiveMetrics/) |\n| Personalizer | NuGet [2.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Personalizer/2.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Personalizer-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Personalizer_2.0.0-beta.2/sdk/personalizer/Azure.AI.Personalizer/) |\n| Playwright | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.Playwright/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.Playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright_1.0.0/sdk/loadtestservice/Azure.Developer.Playwright/) |\n| Playwright NUnit | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Developer.Playwright.NUnit/1.0.0) | [docs](/dotnet/api/overview/azure/Developer.Playwright.NUnit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Developer.Playwright.NUnit_1.0.0/sdk/loadtestservice/Azure.Developer.Playwright.NUnit/) |\n| Programmable Connectivity | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Communication.ProgrammableConnectivity/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.ProgrammableConnectivity_1.0.0-beta.1/sdk/communication/Azure.Communication.ProgrammableConnectivity/) |\n| Provisioning | NuGet [1.5.0](https://www.nuget.org/packages/Azure.Provisioning/1.5.0)<br>NuGet [1.6.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning/1.6.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.5.0/sdk/provisioning/Azure.Provisioning/)<br>GitHub [1.6.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning_1.6.0-beta.1/sdk/provisioning/Azure.Provisioning/) |\n| Provisioning - Resources | NuGet [0.2.0](https://www.nuget.org/packages/Azure.Provisioning.Resources/0.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.Resources-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Resources_0.2.0/sdk/provisioning/Azure.Provisioning.Resources/) |\n| Purview Account | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Account/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Account-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Account_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Account/) |\n| Purview Administration | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Administration/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Administration-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Administration_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Administration/) |\n| Purview Catalog | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Analytics.Purview.Catalog/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Catalog-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Catalog_1.0.0-beta.4/sdk/purview/Azure.Analytics.Purview.Catalog/) |\n| Purview Data Map | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Analytics.Purview.DataMap/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Analytics.Purview.DataMap-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.DataMap_1.0.0-beta.2/sdk/purview/Azure.Analytics.Purview.DataMap/) |\n| Purview Scanning | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Analytics.Purview.Scanning/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Scanning-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Scanning_1.0.0-beta.2/sdk/purview/Azure.Analytics.Purview.Scanning/) |\n| Purview Share | NuGet [1.0.3-beta.20](https://www.nuget.org/packages/Azure.Analytics.Purview.Share/1.0.3-beta.20) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Share-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.3-beta.20](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Share_1.0.3-beta.20/sdk/purview/Azure.Analytics.Purview.Share) |\n| Purview Sharing | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Analytics.Purview.Sharing/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Sharing-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Sharing_1.0.0-beta.3/sdk/purview/Azure.Analytics.Purview.Sharing/) |\n| Purview Workflow | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Analytics.Purview.Workflows/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Workflows-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Workflows_1.0.0-beta.2/sdk/purview/Azure.Analytics.Purview.Workflows/) |\n| Quantum Jobs | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Quantum.Jobs/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Quantum.Jobs-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Quantum.Jobs_1.0.0-beta.3/sdk/quantum/Azure.Quantum.Jobs/) |\n| Question Answering | NuGet [1.1.0](https://www.nuget.org/packages/Azure.AI.Language.QuestionAnswering/1.1.0) | [docs](/dotnet/api/overview/azure/AI.Language.QuestionAnswering-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.QuestionAnswering_1.1.0/sdk/cognitivelanguage/Azure.AI.Language.QuestionAnswering/) |\n| Question Answering | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.AI.Language.QuestionAnswering.Inference/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Language.QuestionAnswering.Inference-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.QuestionAnswering.Inference_1.0.0-beta.1/sdk/cognitivelanguage/Azure.AI.Language.QuestionAnswering.Inference/) |\n| Question Answering Authoring | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.AI.Language.QuestionAnswering.Authoring/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Language.QuestionAnswering.Authoring-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.QuestionAnswering.Authoring_1.0.0-beta.1/sdk/cognitivelanguage/Azure.AI.Language.QuestionAnswering.Authoring/) |\n| Schema Registry | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Data.SchemaRegistry/1.4.0) | [docs](/dotnet/api/overview/azure/Data.SchemaRegistry-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.SchemaRegistry_1.4.0/sdk/schemaregistry/Azure.Data.SchemaRegistry/) |\n| Schema Registry - Avro | NuGet [1.0.1](https://www.nuget.org/packages/Microsoft.Azure.Data.SchemaRegistry.ApacheAvro/1.0.1) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Data.SchemaRegistry.ApacheAvro-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Data.SchemaRegistry.ApacheAvro_1.0.1/sdk/schemaregistry/Microsoft.Azure.Data.SchemaRegistry.ApacheAvro/) |\n| Service Bus | NuGet [7.20.1](https://www.nuget.org/packages/Azure.Messaging.ServiceBus/7.20.1) | [docs](/dotnet/api/overview/azure/Messaging.ServiceBus-readme) | GitHub [7.20.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.ServiceBus_7.20.1/sdk/servicebus/Azure.Messaging.ServiceBus/) |\n| Storage - Blobs | NuGet [12.27.0](https://www.nuget.org/packages/Azure.Storage.Blobs/12.27.0)<br>NuGet [12.29.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Blobs/12.29.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Blobs-readme) | GitHub [12.27.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs_12.27.0/sdk/storage/Azure.Storage.Blobs/)<br>GitHub [12.29.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs_12.29.0-beta.1/sdk/storage/Azure.Storage.Blobs/) |\n| Storage - Blobs Batch | NuGet [12.24.0](https://www.nuget.org/packages/Azure.Storage.Blobs.Batch/12.24.0)<br>NuGet [12.26.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Blobs.Batch/12.26.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Blobs.Batch-readme) | GitHub [12.24.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs.Batch_12.24.0/sdk/storage/Azure.Storage.Blobs.Batch/)<br>GitHub [12.26.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs.Batch_12.26.0-beta.1/sdk/storage/Azure.Storage.Blobs.Batch/) |\n| Storage - Blobs ChangeFeed | NuGet [12.0.0-preview.61](https://www.nuget.org/packages/Azure.Storage.Blobs.ChangeFeed/12.0.0-preview.61) | [docs](/dotnet/api/overview/azure/Storage.Blobs.ChangeFeed-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [12.0.0-preview.61](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Blobs.ChangeFeed_12.0.0-preview.61/sdk/storage/Azure.Storage.Blobs.ChangeFeed/) |\n| Storage - Files Data Lake | NuGet [12.25.0](https://www.nuget.org/packages/Azure.Storage.Files.DataLake/12.25.0)<br>NuGet [12.27.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Files.DataLake/12.27.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Files.DataLake-readme) | GitHub [12.25.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Files.DataLake_12.25.0/sdk/storage/Azure.Storage.Files.DataLake/)<br>GitHub [12.27.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Files.DataLake_12.27.0-beta.1/sdk/storage/Azure.Storage.Files.DataLake/) |\n| Storage - Files Share | NuGet [12.25.0](https://www.nuget.org/packages/Azure.Storage.Files.Shares/12.25.0)<br>NuGet [12.27.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Files.Shares/12.27.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Files.Shares-readme) | GitHub [12.25.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Files.Shares_12.25.0/sdk/storage/Azure.Storage.Files.Shares/)<br>GitHub [12.27.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Files.Shares_12.27.0-beta.1/sdk/storage/Azure.Storage.Files.Shares/) |\n| Storage - Queues | NuGet [12.25.0](https://www.nuget.org/packages/Azure.Storage.Queues/12.25.0)<br>NuGet [12.27.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Queues/12.27.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Queues-readme) | GitHub [12.25.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Queues_12.25.0/sdk/storage/Azure.Storage.Queues/)<br>GitHub [12.27.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Queues_12.27.0-beta.1/sdk/storage/Azure.Storage.Queues/) |\n| Synapse - AccessControl | NuGet [1.0.0-preview.5](https://www.nuget.org/packages/Azure.Analytics.Synapse.AccessControl/1.0.0-preview.5) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.AccessControl-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-preview.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.AccessControl_1.0.0-preview.5/sdk/synapse/Azure.Analytics.Synapse.AccessControl/) |\n| Synapse - Artifacts | NuGet [1.0.0-preview.23](https://www.nuget.org/packages/Azure.Analytics.Synapse.Artifacts/1.0.0-preview.23) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Artifacts-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-preview.23](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Artifacts_1.0.0-preview.23/sdk/synapse/Azure.Analytics.Synapse.Artifacts/) |\n| Synapse - Managed Private Endpoints | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.Analytics.Synapse.ManagedPrivateEndpoints/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.ManagedPrivateEndpoints-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.ManagedPrivateEndpoints_1.0.0-beta.5/sdk/synapse/Azure.Analytics.Synapse.ManagedPrivateEndpoints/) |\n| Synapse - Monitoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Analytics.Synapse.Monitoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Monitoring-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Monitoring_1.0.0-beta.3/sdk/synapse/Azure.Analytics.Synapse.Monitoring/) |\n| Synapse - Spark | NuGet [1.0.0-preview.8](https://www.nuget.org/packages/Azure.Analytics.Synapse.Spark/1.0.0-preview.8) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Spark-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-preview.8](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Spark_1.0.0-preview.8/sdk/synapse/Azure.Analytics.Synapse.Spark/) |\n| System Events | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Messaging.EventGrid.SystemEvents/1.0.0) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid.SystemEvents-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid.SystemEvents_1.0.0/sdk/eventgrid/Azure.Messaging.EventGrid.SystemEvents/) |\n| System.ClientModel | NuGet [1.11.0](https://www.nuget.org/packages/System.ClientModel/1.11.0) | [docs](/dotnet/api/overview/azure/System.ClientModel-readme) | GitHub [1.11.0](https://github.com/Azure/azure-sdk-for-net/tree/System.ClientModel_1.11.0/sdk/core/System.ClientModel/) |\n| Tables | NuGet [12.11.0](https://www.nuget.org/packages/Azure.Data.Tables/12.11.0) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.11.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.11.0/sdk/tables/Azure.Data.Tables/) |\n| Text Analytics | NuGet [5.3.0](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.3.0) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme) | GitHub [5.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.3.0/sdk/textanalytics/Azure.AI.TextAnalytics/) |\n| Text Authoring | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Language.Text.Authoring/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Language.Text.Authoring-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Language.Text.Authoring_1.0.0-beta.2/sdk/cognitivelanguage/Azure.AI.Language.Text.Authoring/) |\n| Text Translation | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.Translation.Text/1.0.0)<br>NuGet [2.0.0-beta.1](https://www.nuget.org/packages/Azure.AI.Translation.Text/2.0.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Translation.Text-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Text_1.0.0/sdk/translation/Azure.AI.Translation.Text/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Text_2.0.0-beta.1/sdk/translation/Azure.AI.Translation.Text/) |\n| Time Series Insights | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.IoT.TimeSeriesInsights/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/IoT.TimeSeriesInsights-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.TimeSeriesInsights_1.0.0-beta.1/sdk/timeseriesinsights/Azure.IoT.TimeSeriesInsights/) |\n| TimeZone | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Maps.TimeZones/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Maps.TimeZones-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Maps.TimeZones_1.0.0-beta.1/sdk/maps/Azure.Maps.TimeZones/) |\n| unknown | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.AI.AgentServer.Invocations/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Invocations-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Invocations_1.0.0-beta.3/sdk/agentserver/Azure.AI.AgentServer.Invocations/) |\n| unknown | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.AgentServer.Responses/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.AgentServer.Responses-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AgentServer.Responses_1.0.0-beta.4/sdk/agentserver/Azure.AI.AgentServer.Responses/) |\n| unknown | NuGet [2.0.0](https://www.nuget.org/packages/Azure.AI.Extensions.OpenAI/2.0.0)<br>NuGet [2.1.0-beta.1](https://www.nuget.org/packages/Azure.AI.Extensions.OpenAI/2.1.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Extensions.OpenAI-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Extensions.OpenAI_2.0.0/sdk/ai/Azure.AI.Extensions.OpenAI/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Extensions.OpenAI_2.1.0-beta.1/sdk/ai/Azure.AI.Extensions.OpenAI/) |\n| unknown | NuGet [2.0.0](https://www.nuget.org/packages/Azure.AI.Projects.Agents/2.0.0)<br>NuGet [2.1.0-beta.1](https://www.nuget.org/packages/Azure.AI.Projects.Agents/2.1.0-beta.1) | [docs](/dotnet/api/overview/azure/AI.Projects.Agents-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects.Agents_2.0.0/sdk/ai/Azure.AI.Projects.Agents/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Projects.Agents_2.1.0-beta.1/sdk/ai/Azure.AI.Projects.Agents/) |\n| unknown | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.PostgreSQL.Auth/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.PostgreSQL.Auth-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.PostgreSQL.Auth_1.0.0-beta.1/sdk/postgresql/Microsoft.Azure.PostgreSQL.Auth/) |\n| Video Analyzer Edge | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.Media.VideoAnalyzer.Edge/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Media.VideoAnalyzer.Edge-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Media.VideoAnalyzer.Edge_1.0.0-beta.6/sdk/videoanalyzer/Azure.Media.VideoAnalyzer.Edge/) |\n| Vision Common | NuGet [0.15.1-beta.1](https://www.nuget.org/packages/Azure.AI.Vision.Common/0.15.1-beta.1) |  | GitHub [0.15.1-beta.1](https://msasg.visualstudio.com/Skyman/_git/Carbon) |\n| Voice Live | NuGet [1.0.0](https://www.nuget.org/packages/Azure.AI.VoiceLive/1.0.0)<br>NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.AI.VoiceLive/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/AI.VoiceLive-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.VoiceLive_1.0.0/sdk/voicelive/Azure.AI.VoiceLive/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.VoiceLive_1.1.0-beta.3/sdk/voicelive/Azure.AI.VoiceLive/) |\n| WCF Storage Queues | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.WCF.Azure.StorageQueues/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.WCF.Azure.StorageQueues-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.WCF.Azure.StorageQueues_1.0.0-beta.1/sdk/extension-wcf/Microsoft.WCF.Azure.StorageQueues/) |\n| Web PubSub | NuGet [1.6.0](https://www.nuget.org/packages/Azure.Messaging.WebPubSub/1.6.0) | [docs](/dotnet/api/overview/azure/Messaging.WebPubSub-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.WebPubSub_1.6.0/sdk/webpubsub/Azure.Messaging.WebPubSub/) |\n| Web PubSub Client | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Messaging.WebPubSub.Client/1.0.0) | [docs](/dotnet/api/overview/azure/Messaging.WebPubSub.Client-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.WebPubSub.Client_1.0.0/sdk/webpubsub/Azure.Messaging.WebPubSub.Client/) |\n| Azure client library integration for ASP.NET Core | NuGet [1.14.0](https://www.nuget.org/packages/Microsoft.Extensions.Azure/1.14.0) | [docs](/dotnet/api/overview/azure/Microsoft.Extensions.Azure-readme) | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Extensions.Azure_1.14.0/sdk/extensions/Microsoft.Extensions.Azure/) |\n| Blob Storage Key Store for .NET Data Protection | NuGet [1.5.3](https://www.nuget.org/packages/Azure.Extensions.AspNetCore.DataProtection.Blobs/1.5.3) | [docs](/dotnet/api/overview/azure/Extensions.AspNetCore.DataProtection.Blobs-readme) | GitHub [1.5.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Extensions.AspNetCore.DataProtection.Blobs_1.5.3/sdk/extensions/Azure.Extensions.AspNetCore.DataProtection.Blobs/) |\n| CloudNative CloudEvents with Event Grid  | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents/1.0.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents_1.0.0/sdk/eventgrid/Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents/) |\n| Core - Client - Spatial | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Core.Spatial-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.Spatial_1.1.0/sdk/core/Microsoft.Azure.Core.Spatial/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.Spatial_1.2.0-beta.1/sdk/core/Microsoft.Azure.Core.Spatial/) |\n| Core - Client - Spatial Newtonsoft Json | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial.NewtonsoftJson/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial.NewtonsoftJson/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.Core.Spatial.NewtonsoftJson-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.Spatial.NewtonsoftJson_1.0.0/sdk/core/Microsoft.Azure.Core.Spatial.NewtonsoftJson/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Core.Spatial.NewtonsoftJson_1.1.0-beta.1/sdk/core/Microsoft.Azure.Core.Spatial.NewtonsoftJson/) |\n| Functions extension for Azure Tables | NuGet [1.4.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Tables/1.4.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Tables-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.Tables_1.4.0/sdk/tables/Microsoft.Azure.WebJobs.Extensions.Tables/) |\n| Key Encryptor for .NET Data Protection | NuGet [1.6.3](https://www.nuget.org/packages/Azure.Extensions.AspNetCore.DataProtection.Keys/1.6.3) | [docs](/dotnet/api/overview/azure/Extensions.AspNetCore.DataProtection.Keys-readme) | GitHub [1.6.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Extensions.AspNetCore.DataProtection.Keys_1.6.3/sdk/extensions/Azure.Extensions.AspNetCore.DataProtection.Keys/) |\n| Secrets Configuration Provider for .NET | NuGet [1.5.1](https://www.nuget.org/packages/Azure.Extensions.AspNetCore.Configuration.Secrets/1.5.1) | [docs](/dotnet/api/overview/azure/Extensions.AspNetCore.Configuration.Secrets-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Extensions.AspNetCore.Configuration.Secrets_1.5.1/sdk/extensions/Azure.Extensions.AspNetCore.Configuration.Secrets/) |\n| Storage - Common | NuGet [12.26.0](https://www.nuget.org/packages/Azure.Storage.Common/12.26.0)<br>NuGet [12.28.0-beta.1](https://www.nuget.org/packages/Azure.Storage.Common/12.28.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.Common-readme) | GitHub [12.26.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Common_12.26.0/sdk/storage/Azure.Storage.Common/)<br>GitHub [12.28.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.Common_12.28.0-beta.1/sdk/storage/Azure.Storage.Common/) |\n| WebJobs Extensions - Event Grid | NuGet [3.5.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.5.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventGrid-readme) | GitHub [3.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.EventGrid_3.5.0/sdk/eventgrid/Microsoft.Azure.WebJobs.Extensions.EventGrid/) |\n| WebJobs Extensions - Event Hubs | NuGet [6.5.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/6.5.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventHubs-readme) | GitHub [6.5.3](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.EventHubs_6.5.3/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/) |\n| WebJobs Extensions - Service Bus | NuGet [5.17.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ServiceBus/5.17.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.ServiceBus-readme) | GitHub [5.17.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.ServiceBus_5.17.0/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/) |\n| WebJobs Extensions - SignalR Service | NuGet [2.1.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.SignalRService/2.1.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.SignalRService-readme) | GitHub [2.1.0](https://github.com/Azure/azure-functions-signalrservice-extension/tree/v1.2.0/src/SignalRServiceExtension) |\n| WebJobs Extensions - Storage | NuGet [5.3.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage/5.3.7) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage-readme) | GitHub [5.3.7](https://github.com/Azure/azure-webjobs-sdk/tree/master/src/Microsoft.Azure.WebJobs.Extensions.Storage) |\n| WebJobs Extensions - Web PubSub | NuGet [1.10.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.WebPubSub/1.10.1) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.WebPubSub-readme) | GitHub [1.10.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.WebPubSub_1.10.1/sdk/webpubsub/Microsoft.Azure.WebJobs.Extensions.WebPubSub/) |\n| Functions extension for Blob Storage | NuGet [5.3.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/5.3.7) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs-readme) | GitHub [5.3.7](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs_5.3.7/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/) |\n| Functions extension for Storage Queues | NuGet [5.3.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/5.3.7) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage.Queues-readme) | GitHub [5.3.7](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.Storage.Queues_5.3.7/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/) |\n| Functions extension for WebPubSub for SocketIO | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO/1.0.0) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO_1.0.0/sdk/webpubsub/Microsoft.Azure.WebJobs.Extensions.WebPubSubForSocketIO/) |\n| Provisioning - Apimanagement | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ApiManagement/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ApiManagement-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ApiManagement_1.0.0-beta.1/sdk/apimanagement/Azure.Provisioning.ApiManagement/) |\n| Provisioning - App Configuration | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.AppConfiguration/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.AppConfiguration/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.AppConfiguration-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppConfiguration_1.1.0/sdk/provisioning/Azure.Provisioning.AppConfiguration/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppConfiguration_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.AppConfiguration/) |\n| Provisioning - App Containers | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Provisioning.AppContainers/1.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.AppContainers-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppContainers_1.2.0/sdk/provisioning/Azure.Provisioning.AppContainers/) |\n| Provisioning - App Service | NuGet [1.3.1](https://www.nuget.org/packages/Azure.Provisioning.AppService/1.3.1)<br>NuGet [1.4.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.AppService/1.4.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.AppService-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppService_1.3.1/sdk/provisioning/Azure.Provisioning.AppService/)<br>GitHub [1.4.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.AppService_1.4.0-beta.2/sdk/provisioning/Azure.Provisioning.AppService/) |\n| Provisioning - Application Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.ApplicationInsights/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ApplicationInsights/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ApplicationInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ApplicationInsights_1.1.0/sdk/provisioning/Azure.Provisioning.ApplicationInsights/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ApplicationInsights_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.ApplicationInsights/) |\n| Provisioning - Batch | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Batch/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Batch-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Batch_1.0.0-beta.1/sdk/batch/Azure.Provisioning.Batch/) |\n| Provisioning - Cdn | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.Cdn/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.Cdn-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Cdn_1.0.0-beta.2/sdk/cdn/Azure.Provisioning.Cdn/) |\n| Provisioning - Cognitive Services | NuGet [1.2.0](https://www.nuget.org/packages/Azure.Provisioning.CognitiveServices/1.2.0) | [docs](/dotnet/api/overview/azure/Provisioning.CognitiveServices-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.CognitiveServices_1.2.0/sdk/provisioning/Azure.Provisioning.CognitiveServices/) |\n| Provisioning - Communication | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Provisioning.Communication/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Provisioning.Communication-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Communication_1.0.0-beta.4/sdk/provisioning/Azure.Provisioning.Communication/) |\n| Provisioning - Compute | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Compute/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Compute-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Compute_1.0.0-beta.1/sdk/compute/Azure.Provisioning.Compute/) |\n| Provisioning - Container Registry | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.ContainerRegistry/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.ContainerRegistry-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ContainerRegistry_1.1.0/sdk/provisioning/Azure.Provisioning.ContainerRegistry/) |\n| Provisioning - Container Service | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.Provisioning.ContainerService/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Provisioning.ContainerService-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ContainerService_1.0.0-beta.6/sdk/containerservice/Azure.Provisioning.ContainerService/) |\n| Provisioning - Containerinstance | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ContainerInstance/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ContainerInstance-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ContainerInstance_1.0.0-beta.1/sdk/containerinstance/Azure.Provisioning.ContainerInstance/) |\n| Provisioning - CosmosDB | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Provisioning.CosmosDB/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.CosmosDB/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.CosmosDB-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.CosmosDB_1.0.0/sdk/provisioning/Azure.Provisioning.CosmosDB/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.CosmosDB_1.1.0-beta.1/sdk/provisioning/Azure.Provisioning.CosmosDB/) |\n| Provisioning - Deployment | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.Deployment/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.Deployment-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Deployment_1.0.0-beta.2/sdk/provisioning/Azure.Provisioning.Deployment/) |\n| Provisioning - Dns | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.Dns/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.Dns-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Dns_1.0.0-beta.2/sdk/provisioning/Azure.Provisioning.Dns/) |\n| Provisioning - Event Grid | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.EventGrid/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.EventGrid-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.EventGrid_1.1.0/sdk/provisioning/Azure.Provisioning.EventGrid/) |\n| Provisioning - Event Hubs | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.EventHubs/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.EventHubs-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.EventHubs_1.1.0/sdk/provisioning/Azure.Provisioning.EventHubs/) |\n| Provisioning - Frontdoor | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.FrontDoor/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.FrontDoor-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.FrontDoor_1.0.0-beta.1/sdk/provisioning/Azure.Provisioning.FrontDoor/) |\n| Provisioning - Key Vault | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.KeyVault/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.KeyVault/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.KeyVault-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.KeyVault_1.1.0/sdk/provisioning/Azure.Provisioning.KeyVault/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.KeyVault_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.KeyVault/) |\n| Provisioning - Kubernetes | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Provisioning.Kubernetes/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Provisioning.Kubernetes-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Kubernetes_1.0.0-beta.3/sdk/provisioning/Azure.Provisioning.Kubernetes/) |\n| Provisioning - Kubernetes Configuration | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Provisioning.KubernetesConfiguration/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Provisioning.KubernetesConfiguration-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.KubernetesConfiguration_1.0.0-beta.3/sdk/provisioning/Azure.Provisioning.KubernetesConfiguration/) |\n| Provisioning - Kusto | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.Kusto/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.Kusto-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Kusto_1.0.0-beta.2/sdk/provisioning/Azure.Provisioning.Kusto/) |\n| Provisioning - Logic | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Logic/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Logic-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Logic_1.0.0-beta.1/sdk/logic/Azure.Provisioning.Logic/) |\n| Provisioning - Monitor | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Monitor/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Monitor-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Monitor_1.0.0-beta.1/sdk/monitor/Azure.Provisioning.Monitor/) |\n| Provisioning - Mysql | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.MySql/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.MySql-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.MySql_1.0.0-beta.1/sdk/mysql/Azure.Provisioning.MySql/) |\n| Provisioning - Network | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.Network/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.Network-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Network_1.1.0/sdk/network/Azure.Provisioning.Network/) |\n| Provisioning - Operational Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.OperationalInsights/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.OperationalInsights/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.OperationalInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.OperationalInsights_1.1.0/sdk/provisioning/Azure.Provisioning.OperationalInsights/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.OperationalInsights_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.OperationalInsights/) |\n| Provisioning - PostgreSQL | NuGet [1.1.1](https://www.nuget.org/packages/Azure.Provisioning.PostgreSql/1.1.1)<br>NuGet [1.2.0-beta.2](https://www.nuget.org/packages/Azure.Provisioning.PostgreSql/1.2.0-beta.2) | [docs](/dotnet/api/overview/azure/Provisioning.PostgreSql-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.PostgreSql_1.1.1/sdk/provisioning/Azure.Provisioning.PostgreSql/)<br>GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.PostgreSql_1.2.0-beta.2/sdk/provisioning/Azure.Provisioning.PostgreSql/) |\n| Provisioning - Private DNS | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Provisioning.PrivateDns/1.0.0) | [docs](/dotnet/api/overview/azure/Provisioning.PrivateDns-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.PrivateDns_1.0.0/sdk/provisioning/Azure.Provisioning.PrivateDns/) |\n| Provisioning - Redis | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.Redis/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.Redis-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Redis_1.1.0/sdk/provisioning/Azure.Provisioning.Redis/) |\n| Provisioning - Redisenterprise | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.RedisEnterprise/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.RedisEnterprise-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.RedisEnterprise_1.1.0/sdk/provisioning/Azure.Provisioning.RedisEnterprise/) |\n| Provisioning - Resourcegraph | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ResourceGraph/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ResourceGraph-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ResourceGraph_1.0.0-beta.1/sdk/resourcegraph/Azure.Provisioning.ResourceGraph/) |\n| Provisioning - Search | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Provisioning.Search/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Search/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Search-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Search_1.0.0/sdk/provisioning/Azure.Provisioning.Search/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Search_1.1.0-beta.1/sdk/provisioning/Azure.Provisioning.Search/) |\n| Provisioning - Securitycenter | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.SecurityCenter/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.SecurityCenter-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.SecurityCenter_1.0.0-beta.1/sdk/securitycenter/Azure.Provisioning.SecurityCenter/) |\n| Provisioning - Service Bus | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.ServiceBus/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.ServiceBus-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ServiceBus_1.1.0/sdk/provisioning/Azure.Provisioning.ServiceBus/) |\n| Provisioning - Servicenetworking | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.ServiceNetworking/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.ServiceNetworking-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.ServiceNetworking_1.0.0-beta.1/sdk/servicenetworking/Azure.Provisioning.ServiceNetworking/) |\n| Provisioning - SignalR | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.SignalR/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.SignalR-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.SignalR_1.1.0/sdk/provisioning/Azure.Provisioning.SignalR/) |\n| Provisioning - SQL | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.Sql/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Sql/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Sql-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Sql_1.1.0/sdk/provisioning/Azure.Provisioning.Sql/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Sql_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.Sql/) |\n| Provisioning - Storage | NuGet [1.1.2](https://www.nuget.org/packages/Azure.Provisioning.Storage/1.1.2)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.Provisioning.Storage/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/Provisioning.Storage-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Storage_1.1.2/sdk/provisioning/Azure.Provisioning.Storage/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.Storage_1.2.0-beta.1/sdk/provisioning/Azure.Provisioning.Storage/) |\n| Provisioning - WebPubSub | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Provisioning.WebPubSub/1.1.0) | [docs](/dotnet/api/overview/azure/Provisioning.WebPubSub-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Provisioning.WebPubSub_1.1.0/sdk/provisioning/Azure.Provisioning.WebPubSub/) |\n| Resource Management - Advisor | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.Advisor/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.Advisor-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Advisor_1.0.0-beta.6/sdk/advisor/Azure.ResourceManager.Advisor/) |\n| Resource Management - Agricultureplatform | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.AgriculturePlatform/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.AgriculturePlatform-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AgriculturePlatform_1.0.0-beta.2/sdk/agricultureplatform/Azure.ResourceManager.AgriculturePlatform/) |\n| Resource Management - Agrifood | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.AgFoodPlatform/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.AgFoodPlatform-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AgFoodPlatform_1.0.0-beta.6/sdk/agrifood/Azure.ResourceManager.AgFoodPlatform/) |\n| Resource Management - Alerts Management | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.AlertsManagement/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.AlertsManagement-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AlertsManagement_1.1.2/sdk/alertsmanagement/Azure.ResourceManager.AlertsManagement/) |\n| Resource Management - Analysis | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Analysis/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Analysis-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Analysis_1.1.2/sdk/analysisservices/Azure.ResourceManager.Analysis/) |\n| Resource Management - API Center | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ApiCenter/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ApiCenter/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ApiCenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiCenter_1.0.0/sdk/apicenter/Azure.ResourceManager.ApiCenter/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiCenter_1.1.0-beta.1/sdk/apicenter/Azure.ResourceManager.ApiCenter/) |\n| Resource Management - API Management | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.ApiManagement/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ApiManagement-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApiManagement_1.3.1/sdk/apimanagement/Azure.ResourceManager.ApiManagement/) |\n| Resource Management - App Compliance Automation | NuGet [1.0.2](https://www.nuget.org/packages/Azure.ResourceManager.AppComplianceAutomation/1.0.2) | [docs](/dotnet/api/overview/azure/ResourceManager.AppComplianceAutomation-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppComplianceAutomation_1.0.2/sdk/appcomplianceautomation/Azure.ResourceManager.AppComplianceAutomation/) |\n| Resource Management - App Configuration | NuGet [1.4.1](https://www.nuget.org/packages/Azure.ResourceManager.AppConfiguration/1.4.1)<br>NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.AppConfiguration/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppConfiguration-readme) | GitHub [1.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppConfiguration_1.4.1/sdk/appconfiguration/Azure.ResourceManager.AppConfiguration/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppConfiguration_1.5.0-beta.1/sdk/appconfiguration/Azure.ResourceManager.AppConfiguration/) |\n| Resource Management - App Platform | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.AppPlatform/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.AppPlatform-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppPlatform_1.1.2/sdk/appplatform/Azure.ResourceManager.AppPlatform/) |\n| Resource Management - App Service | NuGet [1.4.1](https://www.nuget.org/packages/Azure.ResourceManager.AppService/1.4.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppService-readme) | GitHub [1.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppService_1.4.1/sdk/websites/Azure.ResourceManager.AppService/) |\n| Resource Management - Application Insights | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ApplicationInsights/1.0.1)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ApplicationInsights/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ApplicationInsights-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApplicationInsights_1.0.1/sdk/applicationinsights/Azure.ResourceManager.ApplicationInsights/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ApplicationInsights_1.1.0-beta.1/sdk/applicationinsights/Azure.ResourceManager.ApplicationInsights/) |\n| Resource Management - Appnetwork | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.AppNetwork/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppNetwork-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppNetwork_1.0.0-beta.1/sdk/appnetwork/Azure.ResourceManager.AppNetwork/) |\n| Resource Management - Arc ScVmm | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.ArcScVmm/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.ArcScVmm-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ArcScVmm_1.0.0-beta.4/sdk/arc-scvmm/Azure.ResourceManager.ArcScVmm/) |\n| Resource Management - Arizeaiobservabilityeval | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.ArizeAIObservabilityEval/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ArizeAIObservabilityEval-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ArizeAIObservabilityEval_1.0.1/sdk/arizeaiobservabilityeval/Azure.ResourceManager.ArizeAIObservabilityEval/) |\n| Resource Management - Artifactsigning | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ArtifactSigning/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ArtifactSigning-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ArtifactSigning_1.0.0/sdk/artifactsigning/Azure.ResourceManager.ArtifactSigning/) |\n| Resource Management - Astro | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Astro/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Astro-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Astro_1.0.0-beta.3/sdk/astronomer/Azure.ResourceManager.Astro/) |\n| Resource Management - Attestation | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.Attestation/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.Attestation-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Attestation_1.0.0-beta.6/sdk/attestation/Azure.ResourceManager.Attestation/) |\n| Resource Management - Authorization | NuGet [1.1.6](https://www.nuget.org/packages/Azure.ResourceManager.Authorization/1.1.6) | [docs](/dotnet/api/overview/azure/ResourceManager.Authorization-readme) | GitHub [1.1.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Authorization_1.1.6/sdk/authorization/Azure.ResourceManager.Authorization/) |\n| Resource Management - Automanage | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Automanage/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Automanage-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Automanage_1.1.2/sdk/automanage/Azure.ResourceManager.Automanage/) |\n| Resource Management - Automation | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Automation/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Automation-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Automation_1.1.2/sdk/automation/Azure.ResourceManager.Automation/) |\n| Resource Management - Azure AI Search | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.Search/1.3.0)<br>NuGet [1.4.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Search/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Search-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Search_1.3.0/sdk/search/Azure.ResourceManager.Search/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Search_1.4.0-beta.1/sdk/search/Azure.ResourceManager.Search/) |\n| Resource Management - Azure Stack HCI | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Hci/1.2.1)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Hci/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Hci-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Hci_1.2.1/sdk/azurestackhci/Azure.ResourceManager.Hci/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Hci_1.3.0-beta.1/sdk/azurestackhci/Azure.ResourceManager.Hci/) |\n| Resource Management - Azure VMware Solution | NuGet [1.6.0](https://www.nuget.org/packages/Azure.ResourceManager.Avs/1.6.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Avs-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Avs_1.6.0/sdk/avs/Azure.ResourceManager.Avs/) |\n| Resource Management - Batch | NuGet [1.6.0](https://www.nuget.org/packages/Azure.ResourceManager.Batch/1.6.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Batch-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Batch_1.6.0/sdk/batch/Azure.ResourceManager.Batch/) |\n| Resource Management - Billing | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.Billing/1.2.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Billing-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Billing_1.2.2/sdk/billing/Azure.ResourceManager.Billing/) |\n| Resource Management - Billing Benefits | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.BillingBenefits/1.0.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.BillingBenefits-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.BillingBenefits_1.0.0-beta.5/sdk/billingbenefits/Azure.ResourceManager.BillingBenefits/) |\n| Resource Management - Blueprint | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.Blueprint/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.Blueprint-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Blueprint_1.0.0-beta.6/sdk/blueprint/Azure.ResourceManager.Blueprint/) |\n| Resource Management - Bot Service | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.BotService/1.1.1)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.BotService/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.BotService-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.BotService_1.1.1/sdk/botservice/Azure.ResourceManager.BotService/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.BotService_1.2.0-beta.1/sdk/botservice/Azure.ResourceManager.BotService/) |\n| Resource Management - Carbonoptimization | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.CarbonOptimization/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.CarbonOptimization-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CarbonOptimization_1.0.1/sdk/carbon/Azure.ResourceManager.CarbonOptimization/) |\n| Resource Management - Certificateregistration | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.CertificateRegistration/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.CertificateRegistration-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CertificateRegistration_1.0.0-beta.1/sdk/certificateregistration/Azure.ResourceManager.CertificateRegistration/) |\n| Resource Management - Change Analysis | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.ChangeAnalysis/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ChangeAnalysis-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ChangeAnalysis_1.1.2/sdk/changeanalysis/Azure.ResourceManager.ChangeAnalysis/) |\n| Resource Management - Chaos | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.Chaos/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Chaos-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Chaos_1.1.1/sdk/chaos/Azure.ResourceManager.Chaos/) |\n| Resource Management - Cloudhealth | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.CloudHealth/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.CloudHealth-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CloudHealth_1.0.0-beta.2/sdk/cloudhealth/Azure.ResourceManager.CloudHealth/) |\n| Resource Management - Cognitive Services | NuGet [1.5.2](https://www.nuget.org/packages/Azure.ResourceManager.CognitiveServices/1.5.2)<br>NuGet [1.6.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.CognitiveServices/1.6.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.CognitiveServices-readme) | GitHub [1.5.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CognitiveServices_1.5.2/sdk/cognitiveservices/Azure.ResourceManager.CognitiveServices/)<br>GitHub [1.6.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CognitiveServices_1.6.0-beta.1/sdk/cognitiveservices/Azure.ResourceManager.CognitiveServices/) |\n| Resource Management - Communication | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.Communication/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Communication-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Communication_1.3.1/sdk/communication/Azure.ResourceManager.Communication/) |\n| Resource Management - Compute | NuGet [1.14.0](https://www.nuget.org/packages/Azure.ResourceManager.Compute/1.14.0)<br>NuGet [1.15.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Compute/1.15.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Compute-readme) | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Compute_1.14.0/sdk/compute/Azure.ResourceManager.Compute/)<br>GitHub [1.15.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Compute_1.15.0-beta.1/sdk/compute/Azure.ResourceManager.Compute/) |\n| Resource Management - Compute Fleet | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ComputeFleet/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ComputeFleet/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ComputeFleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeFleet_1.0.0/sdk/computefleet/Azure.ResourceManager.ComputeFleet/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeFleet_1.1.0-beta.1/sdk/computefleet/Azure.ResourceManager.ComputeFleet/) |\n| Resource Management - Compute Schedule | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ComputeSchedule/1.1.0)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ComputeSchedule/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ComputeSchedule-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeSchedule_1.1.0/sdk/computeschedule/Azure.ResourceManager.ComputeSchedule/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeSchedule_1.2.0-beta.3/sdk/computeschedule/Azure.ResourceManager.ComputeSchedule/) |\n| Resource Management - Compute.Recommender | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Compute.Recommender/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Compute.Recommender-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Compute.Recommender_1.0.0-beta.2/sdk/computerecommender/Azure.ResourceManager.Compute.Recommender/) |\n| Resource Management - Computelimit | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ComputeLimit/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ComputeLimit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ComputeLimit_1.0.0/sdk/computelimit/Azure.ResourceManager.ComputeLimit/) |\n| Resource Management - Confidential Ledger | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ConfidentialLedger/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ConfidentialLedger-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConfidentialLedger_1.1.0/sdk/confidentialledger/Azure.ResourceManager.ConfidentialLedger/) |\n| Resource Management - Confluent | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.Confluent/1.2.1)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Confluent/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Confluent-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Confluent_1.2.1/sdk/confluent/Azure.ResourceManager.Confluent/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Confluent_1.3.0-beta.1/sdk/confluent/Azure.ResourceManager.Confluent/) |\n| Resource Management - Connected VMware vSphere | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.ConnectedVMwarevSphere/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ConnectedVMwarevSphere-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConnectedVMwarevSphere_1.1.2/sdk/connectedvmwarevsphere/Azure.ResourceManager.ConnectedVMwarevSphere/) |\n| Resource Management - Connectedcache | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ConnectedCache/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ConnectedCache-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ConnectedCache_1.0.0-beta.2/sdk/connectedcache/Azure.ResourceManager.ConnectedCache/) |\n| Resource Management - Consumption | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Consumption/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Consumption-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Consumption_1.1.0/sdk/consumption/Azure.ResourceManager.Consumption/) |\n| Resource Management - Container Apps | NuGet [1.5.0](https://www.nuget.org/packages/Azure.ResourceManager.AppContainers/1.5.0) | [docs](/dotnet/api/overview/azure/ResourceManager.AppContainers-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppContainers_1.5.0/sdk/containerapps/Azure.ResourceManager.AppContainers/) |\n| Resource Management - Container Instances | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerInstance/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerInstance-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerInstance_1.3.0/sdk/containerinstance/Azure.ResourceManager.ContainerInstance/) |\n| Resource Management - Container Orchestrator Runtime | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ContainerOrchestratorRuntime/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerOrchestratorRuntime-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerOrchestratorRuntime_1.0.0-beta.2/sdk/containerorchestratorruntime/Azure.ResourceManager.ContainerOrchestratorRuntime/) |\n| Resource Management - Container Registry | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.4.0)<br>NuGet [1.5.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry/1.5.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerRegistry-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.4.0/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/)<br>GitHub [1.5.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry_1.5.0-beta.2/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry/) |\n| Resource Management - Container Service | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.4.0)<br>NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerService/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerService-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.4.0/sdk/containerservice/Azure.ResourceManager.ContainerService/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerService_1.5.0-beta.1/sdk/containerservice/Azure.ResourceManager.ContainerService/) |\n| Resource Management - Container Service Fleet | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.1.0)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ContainerServiceFleet/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerServiceFleet-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.1.0/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerServiceFleet_1.2.0-beta.3/sdk/fleet/Azure.ResourceManager.ContainerServiceFleet/) |\n| Resource Management - Containerregistry.Tasks | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ContainerRegistry.Tasks/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ContainerRegistry.Tasks-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ContainerRegistry.Tasks_1.0.0-beta.1/sdk/containerregistry/Azure.ResourceManager.ContainerRegistry.Tasks/) |\n| Resource Management - Content Delivery Network | NuGet [1.5.1](https://www.nuget.org/packages/Azure.ResourceManager.Cdn/1.5.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Cdn-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Cdn_1.5.1/sdk/cdn/Azure.ResourceManager.Cdn/) |\n| Resource Management - Cosmos DB | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDB/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDB-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDB_1.4.0/sdk/cosmosdb/Azure.ResourceManager.CosmosDB/) |\n| Resource Management - Cosmos DB for PostgreSQL | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.0.0)<br>NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.CosmosDBForPostgreSql/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.CosmosDBForPostgreSql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.0.0/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CosmosDBForPostgreSql_1.1.0-beta.3/sdk/cosmosdbforpostgresql/Azure.ResourceManager.CosmosDBForPostgreSql/) |\n| Resource Management - Costmanagement | NuGet [1.0.3](https://www.nuget.org/packages/Azure.ResourceManager.CostManagement/1.0.3) | [docs](/dotnet/api/overview/azure/ResourceManager.CostManagement-readme) | GitHub [1.0.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CostManagement_1.0.3/sdk/costmanagement/Azure.ResourceManager.CostManagement/) |\n| Resource Management - Customer Insights | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.CustomerInsights/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.CustomerInsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.CustomerInsights_1.0.0/sdk/customer-insights/Azure.ResourceManager.CustomerInsights/) |\n| Resource Management - Data Box | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.DataBox/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DataBox-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataBox_1.1.1/sdk/databox/Azure.ResourceManager.DataBox/) |\n| Resource Management - Data Box Edge | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.DataBoxEdge/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DataBoxEdge-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataBoxEdge_1.1.1/sdk/databoxedge/Azure.ResourceManager.DataBoxEdge/) |\n| Resource Management - Data Factory | NuGet [1.11.0](https://www.nuget.org/packages/Azure.ResourceManager.DataFactory/1.11.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DataFactory-readme) | GitHub [1.11.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataFactory_1.11.0/sdk/datafactory/Azure.ResourceManager.DataFactory/) |\n| Resource Management - Data Lake Analytics | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.DataLakeAnalytics/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DataLakeAnalytics-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataLakeAnalytics_1.1.2/sdk/datalake-analytics/Azure.ResourceManager.DataLakeAnalytics/) |\n| Resource Management - Data Lake Store | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.DataLakeStore/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DataLakeStore-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataLakeStore_1.1.2/sdk/datalake-store/Azure.ResourceManager.DataLakeStore/) |\n| Resource Management - Data Migration | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DataMigration/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DataMigration-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataMigration_1.0.0/sdk/datamigration/Azure.ResourceManager.DataMigration/) |\n| Resource Management - Data Protection | NuGet [1.7.1](https://www.nuget.org/packages/Azure.ResourceManager.DataProtectionBackup/1.7.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DataProtectionBackup-readme) | GitHub [1.7.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataProtectionBackup_1.7.1/sdk/dataprotection/Azure.ResourceManager.DataProtectionBackup/) |\n| Resource Management - Data Share | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.DataShare/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DataShare-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DataShare_1.1.2/sdk/datashare/Azure.ResourceManager.DataShare/) |\n| Resource Management - Database Fleet Manager | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DatabaseFleetManager/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DatabaseFleetManager-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DatabaseFleetManager_1.0.0-beta.1/sdk/fleet/Azure.ResourceManager.DatabaseFleetManager/) |\n| Resource Management - Database Watcher | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.DatabaseWatcher/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DatabaseWatcher-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DatabaseWatcher_1.0.0-beta.2/sdk/databasewatcher/Azure.ResourceManager.DatabaseWatcher/) |\n| Resource Management - Datadog | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Datadog/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Datadog-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Datadog_1.0.0/sdk/datadog/Azure.ResourceManager.Datadog/) |\n| Resource Management - Defender EASM | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.DefenderEasm/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.DefenderEasm-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DefenderEasm_1.0.0-beta.4/sdk/defendereasm/Azure.ResourceManager.DefenderEasm/) |\n| Resource Management - Dell.Storage | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Dell.Storage/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Dell.Storage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dell.Storage_1.0.0/sdk/dellstorage/Azure.ResourceManager.Dell.Storage/) |\n| Resource Management - Dependencymap | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.DependencyMap/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DependencyMap-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DependencyMap_1.0.0-beta.2/sdk/dependencymap/Azure.ResourceManager.DependencyMap/) |\n| Resource Management - Deployment Manager | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.DeploymentManager/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.DeploymentManager-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeploymentManager_1.0.0-beta.3/sdk/deploymentmanager/Azure.ResourceManager.DeploymentManager/) |\n| Resource Management - Desktop Virtualization | NuGet [1.3.2](https://www.nuget.org/packages/Azure.ResourceManager.DesktopVirtualization/1.3.2)<br>NuGet [1.4.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DesktopVirtualization/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DesktopVirtualization-readme) | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DesktopVirtualization_1.3.2/sdk/desktopvirtualization/Azure.ResourceManager.DesktopVirtualization/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DesktopVirtualization_1.4.0-beta.1/sdk/desktopvirtualization/Azure.ResourceManager.DesktopVirtualization/) |\n| Resource Management - Dev Center | NuGet [1.0.2](https://www.nuget.org/packages/Azure.ResourceManager.DevCenter/1.0.2)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DevCenter/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DevCenter-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevCenter_1.0.2/sdk/devcenter/Azure.ResourceManager.DevCenter/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevCenter_1.1.0-beta.1/sdk/devcenter/Azure.ResourceManager.DevCenter/) |\n| Resource Management - Dev Spaces | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DevSpaces/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DevSpaces-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevSpaces_1.0.0/sdk/devspaces/Azure.ResourceManager.DevSpaces/) |\n| Resource Management - Device Provisioning Services | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.DeviceProvisioningServices/1.2.1)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DeviceProvisioningServices/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceProvisioningServices-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceProvisioningServices_1.2.1/sdk/deviceprovisioningservices/Azure.ResourceManager.DeviceProvisioningServices/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceProvisioningServices_1.3.0-beta.1/sdk/deviceprovisioningservices/Azure.ResourceManager.DeviceProvisioningServices/) |\n| Resource Management - Device Registry | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DeviceRegistry/1.0.0)<br>NuGet [1.1.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.DeviceRegistry/1.1.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceRegistry-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceRegistry_1.0.0/sdk/deviceregistry/Azure.ResourceManager.DeviceRegistry/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceRegistry_1.1.0-beta.3/sdk/deviceregistry/Azure.ResourceManager.DeviceRegistry/) |\n| Resource Management - Device Update | NuGet [1.0.2](https://www.nuget.org/packages/Azure.ResourceManager.DeviceUpdate/1.0.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DeviceUpdate-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DeviceUpdate_1.0.2/sdk/deviceupdate/Azure.ResourceManager.DeviceUpdate/) |\n| Resource Management - DevOps Infrastructure | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DevOpsInfrastructure/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DevOpsInfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevOpsInfrastructure_1.0.0/sdk/devopsinfrastructure/Azure.ResourceManager.DevOpsInfrastructure/) |\n| Resource Management - DevTest Labs | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.DevTestLabs/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DevTestLabs-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DevTestLabs_1.1.2/sdk/devtestlabs/Azure.ResourceManager.DevTestLabs/) |\n| Resource Management - Digital Twins | NuGet [1.3.2](https://www.nuget.org/packages/Azure.ResourceManager.DigitalTwins/1.3.2) | [docs](/dotnet/api/overview/azure/ResourceManager.DigitalTwins-readme) | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DigitalTwins_1.3.2/sdk/digitaltwins/Azure.ResourceManager.DigitalTwins/) |\n| Resource Management - Disconnectedoperations | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.DisconnectedOperations/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DisconnectedOperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DisconnectedOperations_1.0.0/sdk/disconnectedoperations/Azure.ResourceManager.DisconnectedOperations/) |\n| Resource Management - DNS | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.Dns/1.1.1)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Dns/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Dns-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dns_1.1.1/sdk/dns/Azure.ResourceManager.Dns/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dns_1.2.0-beta.3/sdk/dns/Azure.ResourceManager.Dns/) |\n| Resource Management - DNS Resolver | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.DnsResolver/1.2.0)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DnsResolver/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DnsResolver-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DnsResolver_1.2.0/sdk/dnsresolver/Azure.ResourceManager.DnsResolver/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DnsResolver_1.3.0-beta.1/sdk/dnsresolver/Azure.ResourceManager.DnsResolver/) |\n| Resource Management - Domainregistration | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.DomainRegistration/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.DomainRegistration-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DomainRegistration_1.0.0-beta.1/sdk/domainregistration/Azure.ResourceManager.DomainRegistration/) |\n| Resource Management - Durabletask | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.DurableTask/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.DurableTask-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.DurableTask_1.1.0/sdk/durabletask/Azure.ResourceManager.DurableTask/) |\n| Resource Management - Dynatrace | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Dynatrace/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Dynatrace-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Dynatrace_1.2.0/sdk/dynatrace/Azure.ResourceManager.Dynatrace/) |\n| Resource Management - Edge Order | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.EdgeOrder/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.EdgeOrder-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EdgeOrder_1.1.2/sdk/edgeorder/Azure.ResourceManager.EdgeOrder/) |\n| Resource Management - Edge Zones | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.EdgeZones/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.EdgeZones-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EdgeZones_1.0.0-beta.3/sdk/edgezones/Azure.ResourceManager.EdgeZones/) |\n| Resource Management - Edgeactions | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.EdgeActions/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.EdgeActions-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EdgeActions_1.0.0-beta.2/sdk/edgeactions/Azure.ResourceManager.EdgeActions/) |\n| Resource Management - Elastic | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Elastic/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Elastic-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Elastic_1.1.0/sdk/elastic/Azure.ResourceManager.Elastic/) |\n| Resource Management - ElasticSan | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.ElasticSan/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ElasticSan-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ElasticSan_1.2.0/sdk/elasticsan/Azure.ResourceManager.ElasticSan/) |\n| Resource Management - Energy Services | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.EnergyServices/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.EnergyServices-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EnergyServices_1.0.0-beta.4/sdk/openenergyplatform/Azure.ResourceManager.EnergyServices/) |\n| Resource Management - Event Grid | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.1.0)<br>NuGet [1.2.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.EventGrid/1.2.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.EventGrid-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.1.0/sdk/eventgrid/Azure.ResourceManager.EventGrid/)<br>GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventGrid_1.2.0-beta.2/sdk/eventgrid/Azure.ResourceManager.EventGrid/) |\n| Resource Management - Event Hubs | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.EventHubs/1.2.1)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.EventHubs/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.EventHubs-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventHubs_1.2.1/sdk/eventhub/Azure.ResourceManager.EventHubs/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.EventHubs_1.3.0-beta.1/sdk/eventhub/Azure.ResourceManager.EventHubs/) |\n| Resource Management - Extended Location | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.ExtendedLocations/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ExtendedLocations-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ExtendedLocations_1.1.2/sdk/extendedlocation/Azure.ResourceManager.ExtendedLocations/) |\n| Resource Management - Fabric | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Fabric/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Fabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Fabric_1.0.0/sdk/fabric/Azure.ResourceManager.Fabric/) |\n| Resource Management - Fileshares | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.FileShares/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.FileShares-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FileShares_1.0.0/sdk/fileshares/Azure.ResourceManager.FileShares/) |\n| Resource Management - Fluid Relay | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.FluidRelay/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.FluidRelay-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FluidRelay_1.1.2/sdk/fluidrelay/Azure.ResourceManager.FluidRelay/) |\n| Resource Management - Front Door | NuGet [1.4.1](https://www.nuget.org/packages/Azure.ResourceManager.FrontDoor/1.4.1) | [docs](/dotnet/api/overview/azure/ResourceManager.FrontDoor-readme) | GitHub [1.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.FrontDoor_1.4.1/sdk/frontdoor/Azure.ResourceManager.FrontDoor/) |\n| Resource Management - Graph Services | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.GraphServices/1.1.3) | [docs](/dotnet/api/overview/azure/ResourceManager.GraphServices-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.GraphServices_1.1.3/sdk/graphservices/Azure.ResourceManager.GraphServices/) |\n| Resource Management - Guest Configuration | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.GuestConfiguration/1.2.2) | [docs](/dotnet/api/overview/azure/ResourceManager.GuestConfiguration-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.GuestConfiguration_1.2.2/sdk/guestconfiguration/Azure.ResourceManager.GuestConfiguration/) |\n| Resource Management - Hardware Security Modules | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.HardwareSecurityModules/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.HardwareSecurityModules-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HardwareSecurityModules_1.0.1/sdk/hardwaresecuritymodules/Azure.ResourceManager.HardwareSecurityModules/) |\n| Resource Management - Hci.Vm | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Hci.Vm/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Hci.Vm-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Hci.Vm_1.0.0-beta.2/sdk/azurestackhci/Azure.ResourceManager.Hci.Vm/) |\n| Resource Management - HDInsight | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.HDInsight/1.1.0)<br>NuGet [1.2.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.HDInsight/1.2.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.HDInsight-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HDInsight_1.1.0/sdk/hdinsight/Azure.ResourceManager.HDInsight/)<br>GitHub [1.2.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HDInsight_1.2.0-beta.5/sdk/hdinsight/Azure.ResourceManager.HDInsight/) |\n| Resource Management - HDInsight Containers | NuGet [1.0.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.HDInsight.Containers/1.0.0-beta.5) |  | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HDInsight.Containers_1.0.0-beta.5/sdk/hdinsightcontainers/Azure.ResourceManager.HDInsight.Containers/) |\n| Resource Management - Health Bot | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.HealthBot/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.HealthBot-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HealthBot_1.2.0/sdk/healthbot/Azure.ResourceManager.HealthBot/) |\n| Resource Management - Health Data AI Services | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.HealthDataAIServices/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.HealthDataAIServices-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HealthDataAIServices_1.0.1/sdk/healthdataaiservices/Azure.ResourceManager.HealthDataAIServices/) |\n| Resource Management - Healthcare APIs | NuGet [1.3.2](https://www.nuget.org/packages/Azure.ResourceManager.HealthcareApis/1.3.2) | [docs](/dotnet/api/overview/azure/ResourceManager.HealthcareApis-readme) | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HealthcareApis_1.3.2/sdk/healthcareapis/Azure.ResourceManager.HealthcareApis/) |\n| Resource Management - Hybrid Compute | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.HybridCompute/1.0.0)<br>NuGet [1.1.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.HybridCompute/1.1.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.HybridCompute-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridCompute_1.0.0/sdk/hybridcompute/Azure.ResourceManager.HybridCompute/)<br>GitHub [1.1.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridCompute_1.1.0-beta.2/sdk/hybridcompute/Azure.ResourceManager.HybridCompute/) |\n| Resource Management - Hybrid Connectivity | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.HybridConnectivity/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.HybridConnectivity-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridConnectivity_1.1.1/sdk/hybridconnectivity/Azure.ResourceManager.HybridConnectivity/) |\n| Resource Management - Hybrid Container Service | NuGet [1.0.2](https://www.nuget.org/packages/Azure.ResourceManager.HybridContainerService/1.0.2) | [docs](/dotnet/api/overview/azure/ResourceManager.HybridContainerService-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridContainerService_1.0.2/sdk/hybridaks/Azure.ResourceManager.HybridContainerService/) |\n| Resource Management - Hybrid Data | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.HybridData/1.0.1)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.HybridData/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.HybridData-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridData_1.1.0-beta.1/sdk/hybriddatamanager/Azure.ResourceManager.HybridData) |\n| Resource Management - Hybrid Kubernetes | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.Kubernetes/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.Kubernetes-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Kubernetes_1.0.0-beta.6/sdk/hybridkubernetes/Azure.ResourceManager.Kubernetes/) |\n| Resource Management - Hybrid Network | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.HybridNetwork/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.HybridNetwork-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.HybridNetwork_1.0.0-beta.3/sdk/hybridnetwork/Azure.ResourceManager.HybridNetwork/) |\n| Resource Management - Impactreporting | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ImpactReporting/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ImpactReporting-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ImpactReporting_1.0.0-beta.1/sdk/impactreporting/Azure.ResourceManager.ImpactReporting/) |\n| Resource Management - Informatica Data Management | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.InformaticaDataManagement/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.InformaticaDataManagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.InformaticaDataManagement_1.0.0/sdk/informaticadatamanagement/Azure.ResourceManager.InformaticaDataManagement/) |\n| Resource Management - IoT Central | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.IotCentral/1.0.1)<br>NuGet [1.1.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.IotCentral/1.1.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.IotCentral-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotCentral_1.0.1/sdk/iotcentral/Azure.ResourceManager.IotCentral/)<br>GitHub [1.1.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotCentral_1.1.0-beta.4/sdk/iotcentral/Azure.ResourceManager.IotCentral/) |\n| Resource Management - IoT Firmware Defense | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.IotFirmwareDefense/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.IotFirmwareDefense-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotFirmwareDefense_1.1.0/sdk/iot/Azure.ResourceManager.IotFirmwareDefense/) |\n| Resource Management - IoT Hub | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.IotHub/1.1.1)<br>NuGet [1.2.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.IotHub/1.2.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.IotHub-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotHub_1.1.1/sdk/iothub/Azure.ResourceManager.IotHub/)<br>GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotHub_1.2.0-beta.2/sdk/iothub/Azure.ResourceManager.IotHub/) |\n| Resource Management - IoT Operations | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.IotOperations/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.IotOperations/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.IotOperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotOperations_1.0.0/sdk/iotoperations/Azure.ResourceManager.IotOperations/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.IotOperations_1.1.0-beta.1/sdk/iotoperations/Azure.ResourceManager.IotOperations/) |\n| Resource Management - Key Vault | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.KeyVault/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.KeyVault-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.KeyVault_1.4.0/sdk/keyvault/Azure.ResourceManager.KeyVault/) |\n| Resource Management - Kubernetes Configuration | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.KubernetesConfiguration/1.2.1) | [docs](/dotnet/api/overview/azure/ResourceManager.KubernetesConfiguration-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.KubernetesConfiguration_1.2.1/sdk/kubernetesconfiguration/Azure.ResourceManager.KubernetesConfiguration/) |\n| Resource Management - Kubernetesconfiguration.Extensions | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.KubernetesConfiguration.Extensions/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.KubernetesConfiguration.Extensions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.KubernetesConfiguration.Extensions_1.0.0/sdk/kubernetesconfiguration/Azure.ResourceManager.KubernetesConfiguration.Extensions/) |\n| Resource Management - Kusto | NuGet [1.6.2](https://www.nuget.org/packages/Azure.ResourceManager.Kusto/1.6.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Kusto-readme) | GitHub [1.6.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Kusto_1.6.2/sdk/kusto/Azure.ResourceManager.Kusto/) |\n| Resource Management - Lab Services | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.LabServices/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.LabServices-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LabServices_1.1.2/sdk/labservices/Azure.ResourceManager.LabServices/) |\n| Resource Management - Lambdatesthyperexecute | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.LambdaTestHyperExecute/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.LambdaTestHyperExecute-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LambdaTestHyperExecute_1.0.1/sdk/lambdatesthyperexecute/Azure.ResourceManager.LambdaTestHyperExecute/) |\n| Resource Management - Large Instance | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.LargeInstance/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.LargeInstance-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LargeInstance_1.0.0-beta.3/sdk/azurelargeinstance/Azure.ResourceManager.LargeInstance/) |\n| Resource Management - Load Testing | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.LoadTesting/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.LoadTesting-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.LoadTesting_1.1.2/sdk/loadtestservice/Azure.ResourceManager.LoadTesting/) |\n| Resource Management - Log Analytics | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.OperationalInsights/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.OperationalInsights-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.OperationalInsights_1.3.1/sdk/operationalinsights/Azure.ResourceManager.OperationalInsights/) |\n| Resource Management - Logic Apps | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Logic/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Logic-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Logic_1.2.0/sdk/logic/Azure.ResourceManager.Logic/) |\n| Resource Management - Machine Learning | NuGet [1.2.3](https://www.nuget.org/packages/Azure.ResourceManager.MachineLearning/1.2.3) | [docs](/dotnet/api/overview/azure/ResourceManager.MachineLearning-readme) | GitHub [1.2.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MachineLearning_1.2.3/sdk/machinelearningservices/Azure.ResourceManager.MachineLearning/) |\n| Resource Management - Machine Learning Compute | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.MachineLearningCompute/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.MachineLearningCompute-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MachineLearningCompute_1.0.0-beta.6/sdk/machinelearningcompute/Azure.ResourceManager.MachineLearningCompute/) |\n| Resource Management - Maintenance | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.Maintenance/1.1.3)<br>NuGet [1.2.0-beta.10](https://www.nuget.org/packages/Azure.ResourceManager.Maintenance/1.2.0-beta.10) | [docs](/dotnet/api/overview/azure/ResourceManager.Maintenance-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Maintenance_1.1.3/sdk/maintenance/Azure.ResourceManager.Maintenance/)<br>GitHub [1.2.0-beta.10](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Maintenance_1.2.0-beta.10/sdk/maintenance/Azure.ResourceManager.Maintenance/) |\n| Resource Management - Managed Grafana | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.Grafana/1.1.1)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Grafana/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Grafana-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Grafana_1.1.1/sdk/grafana/Azure.ResourceManager.Grafana/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Grafana_1.2.0-beta.3/sdk/grafana/Azure.ResourceManager.Grafana/) |\n| Resource Management - Managed Network | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.ManagedNetwork/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagedNetwork-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagedNetwork_1.0.0-beta.6/sdk/managednetwork/Azure.ResourceManager.ManagedNetwork/) |\n| Resource Management - Managed Network Fabric | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.ManagedNetworkFabric/1.1.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagedNetworkFabric-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagedNetworkFabric_1.1.3/sdk/managednetworkfabric/Azure.ResourceManager.ManagedNetworkFabric/) |\n| Resource Management - Managed Service Identity | NuGet [1.4.1](https://www.nuget.org/packages/Azure.ResourceManager.ManagedServiceIdentities/1.4.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagedServiceIdentities-readme) | GitHub [1.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagedServiceIdentities_1.4.1/sdk/managedserviceidentity/Azure.ResourceManager.ManagedServiceIdentities/) |\n| Resource Management - Managed Services | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.ManagedServices/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagedServices-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagedServices_1.1.2/sdk/managedservices/Azure.ResourceManager.ManagedServices/) |\n| Resource Management - Managedops | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ManagedOps/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagedOps-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagedOps_1.0.0-beta.1/sdk/managedops/Azure.ResourceManager.ManagedOps/) |\n| Resource Management - Management Partner | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.ManagementPartner/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.ManagementPartner-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ManagementPartner_1.0.0-beta.6/sdk/managementpartner/Azure.ResourceManager.ManagementPartner/) |\n| Resource Management - Maps | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Maps/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Maps/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Maps-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Maps_1.1.0/sdk/maps/Azure.ResourceManager.Maps/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Maps_1.2.0-beta.1/sdk/maps/Azure.ResourceManager.Maps/) |\n| Resource Management - Marketplace | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.Marketplace/1.1.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Marketplace-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Marketplace_1.1.3/sdk/marketplace/Azure.ResourceManager.Marketplace/) |\n| Resource Management - Marketplace Ordering | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.MarketplaceOrdering/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.MarketplaceOrdering-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MarketplaceOrdering_1.1.2/sdk/marketplaceordering/Azure.ResourceManager.MarketplaceOrdering/) |\n| Resource Management - Media | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.Media/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Media-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Media_1.3.1/sdk/mediaservices/Azure.ResourceManager.Media/) |\n| Resource Management - Migration Assessment | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.Migration.Assessment/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Migration.Assessment-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Migration.Assessment_1.0.0-beta.2/sdk/migrationassessment/Azure.ResourceManager.Migration.Assessment/) |\n| Resource Management - Migration Discovery SAP | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.MigrationDiscoverySap/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.MigrationDiscoverySap-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MigrationDiscoverySap_1.0.0-beta.3/sdk/migrationdiscoverysap/Azure.ResourceManager.MigrationDiscoverySap/) |\n| Resource Management - Mixed Reality | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.MixedReality/1.1.1) | [docs](/dotnet/api/overview/azure/ResourceManager.MixedReality-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MixedReality_1.1.1/sdk/mixedreality/Azure.ResourceManager.MixedReality/) |\n| Resource Management - Mobile Network | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.MobileNetwork/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.MobileNetwork-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MobileNetwork_1.2.0/sdk/mobilenetwork/Azure.ResourceManager.MobileNetwork/) |\n| Resource Management - Mongo Cluster | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.MongoCluster/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.MongoCluster-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MongoCluster_1.0.0/sdk/mongocluster/Azure.ResourceManager.MongoCluster/) |\n| Resource Management - Mongodbatlas | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.MongoDBAtlas/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.MongoDBAtlas-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MongoDBAtlas_1.0.1/sdk/mongodbatlas/Azure.ResourceManager.MongoDBAtlas/) |\n| Resource Management - Monitor | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.Monitor/1.3.1)<br>NuGet [1.4.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.Monitor/1.4.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.Monitor-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Monitor_1.3.1/sdk/monitor/Azure.ResourceManager.Monitor/)<br>GitHub [1.4.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Monitor_1.4.0-beta.4/sdk/monitor/Azure.ResourceManager.Monitor/) |\n| Resource Management - Monitor.Pipelinegroups | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Monitor.PipelineGroups/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Monitor.PipelineGroups_1.0.0-beta.1/sdk/monitorpipelinegroups/Azure.ResourceManager.Monitor.PipelineGroups/) |\n| Resource Management - MySQL | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.MySql/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.MySql-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.MySql_1.2.0/sdk/mysql/Azure.ResourceManager.MySql/) |\n| Resource Management - Neon Postgres | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.NeonPostgres/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.NeonPostgres-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NeonPostgres_1.0.0/sdk/neonpostgres/Azure.ResourceManager.NeonPostgres/) |\n| Resource Management - NetApp Files | NuGet [1.16.0](https://www.nuget.org/packages/Azure.ResourceManager.NetApp/1.16.0) | [docs](/dotnet/api/overview/azure/ResourceManager.NetApp-readme) | GitHub [1.16.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetApp_1.16.0/sdk/netapp/Azure.ResourceManager.NetApp/) |\n| Resource Management - Network | NuGet [1.15.0](https://www.nuget.org/packages/Azure.ResourceManager.Network/1.15.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Network-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Network_1.15.0/sdk/network/Azure.ResourceManager.Network/) |\n| Resource Management - Network Analytics | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.NetworkAnalytics/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkAnalytics-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkAnalytics_1.0.1/sdk/networkanalytics/Azure.ResourceManager.NetworkAnalytics/) |\n| Resource Management - Network Cloud | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.NetworkCloud/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkCloud-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkCloud_1.3.0/sdk/networkcloud/Azure.ResourceManager.NetworkCloud/) |\n| Resource Management - Network Function | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.NetworkFunction/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.NetworkFunction-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NetworkFunction_1.0.0/sdk/networkfunction/Azure.ResourceManager.NetworkFunction/) |\n| Resource Management - New Relic Observability | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.NewRelicObservability/1.1.1)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.NewRelicObservability/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.NewRelicObservability-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NewRelicObservability_1.1.1/sdk/newrelicobservability/Azure.ResourceManager.NewRelicObservability/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NewRelicObservability_1.2.0-beta.1/sdk/newrelicobservability/Azure.ResourceManager.NewRelicObservability/) |\n| Resource Management - Nginx | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Nginx/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Nginx-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Nginx_1.1.0/sdk/nginx/Azure.ResourceManager.Nginx/) |\n| Resource Management - Notification Hubs | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.NotificationHubs/1.1.1)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.NotificationHubs/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.NotificationHubs-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NotificationHubs_1.1.1/sdk/notificationhubs/Azure.ResourceManager.NotificationHubs/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.NotificationHubs_1.2.0-beta.3/sdk/notificationhubs/Azure.ResourceManager.NotificationHubs/) |\n| Resource Management - Onlineexperimentation | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.OnlineExperimentation/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.OnlineExperimentation-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.OnlineExperimentation_1.0.0-beta.2/sdk/onlineexperimentation/Azure.ResourceManager.OnlineExperimentation/) |\n| Resource Management - Oracle Database | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.OracleDatabase/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.OracleDatabase-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.OracleDatabase_1.2.0/sdk/oracle/Azure.ResourceManager.OracleDatabase/) |\n| Resource Management - Orbital | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Orbital/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Orbital-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Orbital_1.1.2/sdk/orbital/Azure.ResourceManager.Orbital/) |\n| Resource Management - Palo Alto Networks - Next Generation Firewall | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.PaloAltoNetworks.Ngfw/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PaloAltoNetworks.Ngfw-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PaloAltoNetworks.Ngfw_1.2.0/sdk/paloaltonetworks.ngfw/Azure.ResourceManager.PaloAltoNetworks.Ngfw/) |\n| Resource Management - Peering | NuGet [1.2.3](https://www.nuget.org/packages/Azure.ResourceManager.Peering/1.2.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Peering-readme) | GitHub [1.2.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Peering_1.2.3/sdk/peering/Azure.ResourceManager.Peering/) |\n| Resource Management - Pineconevectordb | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.PineconeVectorDB/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.PineconeVectorDB-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PineconeVectorDB_1.0.0-beta.2/sdk/pineconevectordb/Azure.ResourceManager.PineconeVectorDB/) |\n| Resource Management - Planetarycomputer | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.PlanetaryComputer/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PlanetaryComputer-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PlanetaryComputer_1.0.0/sdk/planetarycomputer/Azure.ResourceManager.PlanetaryComputer/) |\n| Resource Management - Playwright | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Playwright/1.0.0)<br>NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Playwright/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Playwright_1.0.0/sdk/playwright/Azure.ResourceManager.Playwright/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Playwright_1.1.0-beta.1/sdk/playwright/Azure.ResourceManager.Playwright/) |\n| Resource Management - Playwright Testing | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.PlaywrightTesting/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PlaywrightTesting-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PlaywrightTesting_1.0.0/sdk/playwrighttesting/Azure.ResourceManager.PlaywrightTesting/) |\n| Resource Management - Policy Insights | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.PolicyInsights/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PolicyInsights-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PolicyInsights_1.3.0/sdk/policyinsights/Azure.ResourceManager.PolicyInsights/) |\n| Resource Management - Portalservicescopilot | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.PortalServicesCopilot/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.PortalServicesCopilot-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PortalServicesCopilot_1.0.0-beta.2/sdk/portalservices/Azure.ResourceManager.PortalServicesCopilot/) |\n| Resource Management - PostgreSQL | NuGet [1.4.2](https://www.nuget.org/packages/Azure.ResourceManager.PostgreSql/1.4.2) | [docs](/dotnet/api/overview/azure/ResourceManager.PostgreSql-readme) | GitHub [1.4.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PostgreSql_1.4.2/sdk/postgresql/Azure.ResourceManager.PostgreSql/) |\n| Resource Management - Power BI Dedicated | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.PowerBIDedicated/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.PowerBIDedicated-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PowerBIDedicated_1.0.0/sdk/powerbidedicated/Azure.ResourceManager.PowerBIDedicated/) |\n| Resource Management - Private DNS | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.PrivateDns/1.2.2) | [docs](/dotnet/api/overview/azure/ResourceManager.PrivateDns-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PrivateDns_1.2.2/sdk/privatedns/Azure.ResourceManager.PrivateDns/) |\n| Resource Management - Provider Hub | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.ProviderHub/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ProviderHub-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ProviderHub_1.2.0/sdk/providerhub/Azure.ResourceManager.ProviderHub/) |\n| Resource Management - Purestorageblock | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.PureStorageBlock/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.PureStorageBlock-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.PureStorageBlock_1.0.1/sdk/purestorageblock/Azure.ResourceManager.PureStorageBlock/) |\n| Resource Management - Purview | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.Purview/1.1.0)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Purview/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Purview-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Purview_1.1.0/sdk/purview/Azure.ResourceManager.Purview/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Purview_1.2.0-beta.3/sdk/purview/Azure.ResourceManager.Purview/) |\n| Resource Management - Quantum | NuGet [1.0.0-beta.7](https://www.nuget.org/packages/Azure.ResourceManager.Quantum/1.0.0-beta.7) | [docs](/dotnet/api/overview/azure/ResourceManager.Quantum-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Quantum_1.0.0-beta.7/sdk/quantum/Azure.ResourceManager.Quantum/) |\n| Resource Management - Qumulo | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Qumulo/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Qumulo-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Qumulo_1.2.0/sdk/qumulo/Azure.ResourceManager.Qumulo/) |\n| Resource Management - Quota | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.Quota/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Quota-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Quota_1.2.0/sdk/quota/Azure.ResourceManager.Quota/) |\n| Resource Management - Recovery Services | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.RecoveryServices/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.RecoveryServices-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RecoveryServices_1.2.0/sdk/recoveryservices/Azure.ResourceManager.RecoveryServices/) |\n| Resource Management - Recovery Services Backup | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.RecoveryServicesBackup/1.3.1)<br>NuGet [1.4.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.RecoveryServicesBackup/1.4.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.RecoveryServicesBackup-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RecoveryServicesBackup_1.3.1/sdk/recoveryservices-backup/Azure.ResourceManager.RecoveryServicesBackup/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RecoveryServicesBackup_1.4.0-beta.1/sdk/recoveryservices-backup/Azure.ResourceManager.RecoveryServicesBackup/) |\n| Resource Management - Recovery Services Data Replication | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.RecoveryServicesDataReplication/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.RecoveryServicesDataReplication-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RecoveryServicesDataReplication_1.0.1/sdk/recoveryservices-datareplication/Azure.ResourceManager.RecoveryServicesDataReplication/) |\n| Resource Management - Recovery Services Site Recovery | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.RecoveryServicesSiteRecovery/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.RecoveryServicesSiteRecovery-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RecoveryServicesSiteRecovery_1.3.1/sdk/recoveryservices-siterecovery/Azure.ResourceManager.RecoveryServicesSiteRecovery/) |\n| Resource Management - Redhatopenshift | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.RedHatOpenShift/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RedHatOpenShift_1.0.0-beta.1/sdk/redhatopenshift/Azure.ResourceManager.RedHatOpenShift/) |\n| Resource Management - Redis | NuGet [1.5.1](https://www.nuget.org/packages/Azure.ResourceManager.Redis/1.5.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Redis-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Redis_1.5.1/sdk/redis/Azure.ResourceManager.Redis/) |\n| Resource Management - Redis Enterprise | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.RedisEnterprise/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.RedisEnterprise-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RedisEnterprise_1.3.0/sdk/redisenterprise/Azure.ResourceManager.RedisEnterprise/) |\n| Resource Management - Redis Enterprise Cache | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.RedisEnterpriseCache/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.RedisEnterpriseCache-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.RedisEnterpriseCache_1.0.0-beta.1/sdk/redisenterprise/Azure.ResourceManager.RedisEnterpriseCache/) |\n| Resource Management - Relationships | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Relationships/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Relationships-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Relationships_1.0.0-beta.1/sdk/relationships/Azure.ResourceManager.Relationships/) |\n| Resource Management - Relay | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.Relay/1.2.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Relay-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Relay_1.2.2/sdk/relay/Azure.ResourceManager.Relay/) |\n| Resource Management - Reservations | NuGet [1.4.2](https://www.nuget.org/packages/Azure.ResourceManager.Reservations/1.4.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Reservations-readme) | GitHub [1.4.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Reservations_1.4.2/sdk/reservations/Azure.ResourceManager.Reservations/) |\n| Resource Management - Resource Connector | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.ResourceManager.ResourceConnector/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceConnector-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceConnector_1.0.0-beta.4/sdk/resourceconnector/Azure.ResourceManager.ResourceConnector/) |\n| Resource Management - Resource Graph | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ResourceGraph/1.1.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceGraph-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceGraph_1.1.0/sdk/resourcegraph/Azure.ResourceManager.ResourceGraph/) |\n| Resource Management - Resource Health | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ResourceHealth/1.0.0)<br>NuGet [1.1.0-beta.5](https://www.nuget.org/packages/Azure.ResourceManager.ResourceHealth/1.1.0-beta.5) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceHealth-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceHealth_1.0.0/sdk/resourcehealth/Azure.ResourceManager.ResourceHealth/)<br>GitHub [1.1.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceHealth_1.1.0-beta.5/sdk/resourcehealth/Azure.ResourceManager.ResourceHealth/) |\n| Resource Management - Resource Manager | NuGet [1.14.0](https://www.nuget.org/packages/Azure.ResourceManager/1.14.0) | [docs](/dotnet/api/overview/azure/ResourceManager-readme) | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager_1.14.0/sdk/resourcemanager/Azure.ResourceManager/) |\n| Resource Management - Resource Mover | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.ResourceMover/1.1.1)<br>NuGet [1.1.2-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ResourceMover/1.1.2-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ResourceMover-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceMover_1.1.1/sdk/resourcemover/Azure.ResourceManager.ResourceMover/)<br>GitHub [1.1.2-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ResourceMover_1.1.2-beta.3/sdk/resourcemover/Azure.ResourceManager.ResourceMover/) |\n| Resource Management - Resources | NuGet [1.11.2](https://www.nuget.org/packages/Azure.ResourceManager.Resources/1.11.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Resources-readme) | GitHub [1.11.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Resources_1.11.2/sdk/resources/Azure.ResourceManager.Resources/) |\n| Resource Management - Resources.Deploymentstacks | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.Resources.DeploymentStacks/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Resources.DeploymentStacks-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Resources.DeploymentStacks_1.0.0/sdk/resources/Azure.ResourceManager.Resources.DeploymentStacks/) |\n| Resource Management - Resources.Policy | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Resources.Policy/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Resources.Policy-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Resources.Policy_1.0.0-beta.1/sdk/resources/Azure.ResourceManager.Resources.Policy/) |\n| Resource Management - ScVmm | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.ScVmm/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ScVmm-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ScVmm_1.0.0/sdk/arc-scvmm/Azure.ResourceManager.ScVmm/) |\n| Resource Management - Secretsstoreextension | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.SecretsStoreExtension/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.SecretsStoreExtension-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecretsStoreExtension_1.0.0-beta.2/sdk/secretsstoreextension/Azure.ResourceManager.SecretsStoreExtension/) |\n| Resource Management - Security | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.SecurityCenter/1.1.0)<br>NuGet [1.2.0-beta.7](https://www.nuget.org/packages/Azure.ResourceManager.SecurityCenter/1.2.0-beta.7) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityCenter-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityCenter_1.1.0/sdk/securitycenter/Azure.ResourceManager.SecurityCenter/)<br>GitHub [1.2.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityCenter_1.2.0-beta.7/sdk/securitycenter/Azure.ResourceManager.SecurityCenter/) |\n| Resource Management - Security DevOps | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.SecurityDevOps/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityDevOps-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityDevOps_1.0.0-beta.6/sdk/securitydevops/Azure.ResourceManager.SecurityDevOps/) |\n| Resource Management - Security Insights | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.SecurityInsights/1.1.0)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.SecurityInsights/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.SecurityInsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityInsights_1.1.0/sdk/securityinsights/Azure.ResourceManager.SecurityInsights/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SecurityInsights_1.2.0-beta.3/sdk/securityinsights/Azure.ResourceManager.SecurityInsights/) |\n| Resource Management - Self Help | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.SelfHelp/1.0.0)<br>NuGet [1.1.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.SelfHelp/1.1.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.SelfHelp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SelfHelp_1.0.0/sdk/selfhelp/Azure.ResourceManager.SelfHelp/)<br>GitHub [1.1.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SelfHelp_1.1.0-beta.6/sdk/selfhelp/Azure.ResourceManager.SelfHelp/) |\n| Resource Management - Service Bus | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceBus/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ServiceBus/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceBus-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceBus_1.1.0/sdk/servicebus/Azure.ResourceManager.ServiceBus/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceBus_1.2.0-beta.1/sdk/servicebus/Azure.ResourceManager.ServiceBus/) |\n| Resource Management - Service Fabric | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabric/1.1.0)<br>NuGet [1.2.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabric/1.2.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceFabric-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabric_1.1.0/sdk/servicefabric/Azure.ResourceManager.ServiceFabric/)<br>GitHub [1.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabric_1.2.0-beta.3/sdk/servicefabric/Azure.ResourceManager.ServiceFabric/) |\n| Resource Management - Service Fabric Managed Clusters | NuGet [1.3.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceFabricManagedClusters/1.3.0) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceFabricManagedClusters-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceFabricManagedClusters_1.3.0/sdk/servicefabricmanagedclusters/Azure.ResourceManager.ServiceFabricManagedClusters/) |\n| Resource Management - Service Linker | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.ServiceLinker/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceLinker-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceLinker_1.1.2/sdk/servicelinker/Azure.ResourceManager.ServiceLinker/) |\n| Resource Management - Service Networking | NuGet [1.1.0](https://www.nuget.org/packages/Azure.ResourceManager.ServiceNetworking/1.1.0)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.ServiceNetworking/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceNetworking-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceNetworking_1.1.0/sdk/servicenetworking/Azure.ResourceManager.ServiceNetworking/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceNetworking_1.2.0-beta.1/sdk/servicenetworking/Azure.ResourceManager.ServiceNetworking/) |\n| Resource Management - Servicegroups | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.ResourceManager.ServiceGroups/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/ResourceManager.ServiceGroups-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.ServiceGroups_1.0.0-beta.2/sdk/servicegroups/Azure.ResourceManager.ServiceGroups/) |\n| Resource Management - SignalR | NuGet [1.1.4](https://www.nuget.org/packages/Azure.ResourceManager.SignalR/1.1.4) | [docs](/dotnet/api/overview/azure/ResourceManager.SignalR-readme) | GitHub [1.1.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SignalR_1.1.4/sdk/signalr/Azure.ResourceManager.SignalR/) |\n| Resource Management - Sitemanager | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.SiteManager/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.SiteManager-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SiteManager_1.0.0/sdk/sitemanager/Azure.ResourceManager.SiteManager/) |\n| Resource Management - Sphere | NuGet [1.0.2](https://www.nuget.org/packages/Azure.ResourceManager.Sphere/1.0.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Sphere-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Sphere_1.0.2/sdk/sphere/Azure.ResourceManager.Sphere/) |\n| Resource Management - Spring App Discovery | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.SpringAppDiscovery/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.SpringAppDiscovery-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SpringAppDiscovery_1.0.0-beta.3/sdk/springappdiscovery/Azure.ResourceManager.SpringAppDiscovery/) |\n| Resource Management - SQL | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.Sql/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.Sql-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Sql_1.4.0/sdk/sqlmanagement/Azure.ResourceManager.Sql/) |\n| Resource Management - SQL Virtual Machine | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.SqlVirtualMachine/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.SqlVirtualMachine-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.SqlVirtualMachine_1.1.2/sdk/sqlvirtualmachine/Azure.ResourceManager.SqlVirtualMachine/) |\n| Resource Management - Standby Pool | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.StandbyPool/1.2.0) | [docs](/dotnet/api/overview/azure/ResourceManager.StandbyPool-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StandbyPool_1.2.0/sdk/standbypool/Azure.ResourceManager.StandbyPool/) |\n| Resource Management - Storage | NuGet [1.6.2](https://www.nuget.org/packages/Azure.ResourceManager.Storage/1.6.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Storage-readme) | GitHub [1.6.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Storage_1.6.2/sdk/storage/Azure.ResourceManager.Storage/) |\n| Resource Management - Storage Actions | NuGet [1.0.1](https://www.nuget.org/packages/Azure.ResourceManager.StorageActions/1.0.1) | [docs](/dotnet/api/overview/azure/ResourceManager.StorageActions-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageActions_1.0.1/sdk/storageactions/Azure.ResourceManager.StorageActions/) |\n| Resource Management - Storage Cache | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.StorageCache/1.4.0)<br>NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.StorageCache/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.StorageCache-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageCache_1.4.0/sdk/storagecache/Azure.ResourceManager.StorageCache/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageCache_1.5.0-beta.1/sdk/storagecache/Azure.ResourceManager.StorageCache/) |\n| Resource Management - Storage Mover | NuGet [1.4.0](https://www.nuget.org/packages/Azure.ResourceManager.StorageMover/1.4.0) | [docs](/dotnet/api/overview/azure/ResourceManager.StorageMover-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageMover_1.4.0/sdk/storagemover/Azure.ResourceManager.StorageMover/) |\n| Resource Management - Storage Pool | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.StoragePool/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.StoragePool-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StoragePool_1.1.2/sdk/storagepool/Azure.ResourceManager.StoragePool/) |\n| Resource Management - Storage Sync | NuGet [1.3.1](https://www.nuget.org/packages/Azure.ResourceManager.StorageSync/1.3.1) | [docs](/dotnet/api/overview/azure/ResourceManager.StorageSync-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageSync_1.3.1/sdk/storagesync/Azure.ResourceManager.StorageSync/) |\n| Resource Management - Storagediscovery | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.StorageDiscovery/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.StorageDiscovery-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StorageDiscovery_1.0.0/sdk/storagediscovery/Azure.ResourceManager.StorageDiscovery/) |\n| Resource Management - Stream Analytics | NuGet [1.2.1](https://www.nuget.org/packages/Azure.ResourceManager.StreamAnalytics/1.2.1)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.StreamAnalytics/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.StreamAnalytics-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StreamAnalytics_1.2.1/sdk/streamanalytics/Azure.ResourceManager.StreamAnalytics/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.StreamAnalytics_1.3.0-beta.1/sdk/streamanalytics/Azure.ResourceManager.StreamAnalytics/) |\n| Resource Management - Subscriptions | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Subscription/1.1.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Subscription-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Subscription_1.1.2/sdk/subscription/Azure.ResourceManager.Subscription/) |\n| Resource Management - Support | NuGet [1.1.1](https://www.nuget.org/packages/Azure.ResourceManager.Support/1.1.1)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Support/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Support-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Support_1.1.1/sdk/support/Azure.ResourceManager.Support/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Support_1.2.0-beta.1/sdk/support/Azure.ResourceManager.Support/) |\n| Resource Management - Synapse | NuGet [1.2.2](https://www.nuget.org/packages/Azure.ResourceManager.Synapse/1.2.2) | [docs](/dotnet/api/overview/azure/ResourceManager.Synapse-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Synapse_1.2.2/sdk/synapse/Azure.ResourceManager.Synapse/) |\n| Resource Management - Terraform | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.ResourceManager.Terraform/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/ResourceManager.Terraform-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Terraform_1.0.0-beta.3/sdk/terraform/Azure.ResourceManager.Terraform/) |\n| Resource Management - Traffic Manager | NuGet [1.1.3](https://www.nuget.org/packages/Azure.ResourceManager.TrafficManager/1.1.3)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.TrafficManager/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.TrafficManager-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.TrafficManager_1.1.3/sdk/trafficmanager/Azure.ResourceManager.TrafficManager/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.TrafficManager_1.2.0-beta.1/sdk/trafficmanager/Azure.ResourceManager.TrafficManager/) |\n| Resource Management - Trusted Signing | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.TrustedSigning/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.TrustedSigning-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.TrustedSigning_1.0.0/sdk/trustedsigning/Azure.ResourceManager.TrustedSigning/) |\n| Resource Management - Virtualenclaves | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.VirtualEnclaves/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.VirtualEnclaves-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.VirtualEnclaves_1.0.0-beta.1/sdk/virtualenclaves/Azure.ResourceManager.VirtualEnclaves/) |\n| Resource Management - Voice Services | NuGet [1.0.3](https://www.nuget.org/packages/Azure.ResourceManager.VoiceServices/1.0.3) | [docs](/dotnet/api/overview/azure/ResourceManager.VoiceServices-readme) | GitHub [1.0.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.VoiceServices_1.0.3/sdk/voiceservices/Azure.ResourceManager.VoiceServices/) |\n| Resource Management - Web PubSub | NuGet [1.2.0](https://www.nuget.org/packages/Azure.ResourceManager.WebPubSub/1.2.0)<br>NuGet [1.3.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.WebPubSub/1.3.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.WebPubSub-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WebPubSub_1.2.0/sdk/webpubsub/Azure.ResourceManager.WebPubSub/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WebPubSub_1.3.0-beta.1/sdk/webpubsub/Azure.ResourceManager.WebPubSub/) |\n| Resource Management - Weightsandbiases | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.WeightsAndBiases/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.WeightsAndBiases-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WeightsAndBiases_1.0.0/sdk/weightsandbiases/Azure.ResourceManager.WeightsAndBiases/) |\n| Resource Management - Workload Monitor | NuGet [1.0.0-beta.6](https://www.nuget.org/packages/Azure.ResourceManager.WorkloadMonitor/1.0.0-beta.6) | [docs](/dotnet/api/overview/azure/ResourceManager.WorkloadMonitor-readme?view=azure-dotnet-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WorkloadMonitor_1.0.0-beta.6/sdk/workloadmonitor/Azure.ResourceManager.WorkloadMonitor/) |\n| Resource Management - Workloadorchestration | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.WorkloadOrchestration/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.WorkloadOrchestration-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WorkloadOrchestration_1.0.0/sdk/workloadorchestration/Azure.ResourceManager.WorkloadOrchestration/) |\n| Resource Management - Workloads | NuGet [1.1.2](https://www.nuget.org/packages/Azure.ResourceManager.Workloads/1.1.2)<br>NuGet [1.2.0-beta.1](https://www.nuget.org/packages/Azure.ResourceManager.Workloads/1.2.0-beta.1) | [docs](/dotnet/api/overview/azure/ResourceManager.Workloads-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Workloads_1.1.2/sdk/workloads/Azure.ResourceManager.Workloads/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.Workloads_1.2.0-beta.1/sdk/workloads/Azure.ResourceManager.Workloads/) |\n| Resource Management - Workloadssapvirtualinstance | NuGet [1.0.0](https://www.nuget.org/packages/Azure.ResourceManager.WorkloadsSapVirtualInstance/1.0.0) | [docs](/dotnet/api/overview/azure/ResourceManager.WorkloadsSapVirtualInstance-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.WorkloadsSapVirtualInstance_1.0.0/sdk/workloadssapvirtualinstance/Azure.ResourceManager.WorkloadsSapVirtualInstance/) |\n"
  },
  {
    "path": "articles/includes/github-copilot-modernization-azure-note.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.topic: include\nms.date: 04/08/2026\n---\n\nAn Azure account is required only for deploying resources to Azure, and isn't needed when using GitHub Copilot modernization to make code changes.\n"
  },
  {
    "path": "articles/includes/github-copilot-modernization-gradle-kotlin-note.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.topic: include\nms.date: 04/08/2026\n---\n\nIf you're using Gradle, only the Gradle wrapper version 5 or later is supported.\n\nThe Kotlin Domain Specific Language (DSL) isn't supported.\n"
  },
  {
    "path": "articles/includes/github-copilot-modernization-intellij-note.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.topic: include\nms.date: 04/08/2026\n---\n\nThe function `My Skills` isn't supported yet for IntelliJ IDEA.\n"
  },
  {
    "path": "articles/includes/go-all.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| App Configuration | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azappconfig/v2.2.0/sdk/data/azappconfig/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azappconfig/v2.2.0/sdk/data/azappconfig/) |\n| Batch | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/batch/azbatch/v0.1.0/sdk/batch/azbatch/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/batch/azbatch) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/batch/azbatch/v0.1.0/sdk/batch/azbatch/) |\n| Container Registry | module [0.2.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/containers/azcontainerregistry/v0.2.3/sdk/containers/azcontainerregistry/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/containers/azcontainerregistry) | GitHub [0.2.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/containers/azcontainerregistry/v0.2.3/sdk/containers/azcontainerregistry/) |\n| Core | module [1.21.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azcore/v1.21.1/sdk/azcore/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore) | GitHub [1.21.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azcore/v1.21.1/sdk/azcore/) |\n| Cosmos DB | module [1.4.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azcosmos/v1.4.2/sdk/data/azcosmos/)<br>module [1.5.0-beta.5](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azcosmos/v1.5.0-beta.5/sdk/data/azcosmos/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos) | GitHub [1.4.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azcosmos/v1.4.2/sdk/data/azcosmos/)<br>GitHub [1.5.0-beta.5](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azcosmos/v1.5.0-beta.5/sdk/data/azcosmos/) |\n| Event Grid | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/azeventgrid/v1.0.0/sdk/messaging/eventgrid/azeventgrid/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/eventgrid/azeventgrid) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/azeventgrid/v1.0.0/sdk/messaging/eventgrid/azeventgrid/) |\n| Event Grid Namespaces | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/aznamespaces/v1.0.0/sdk/messaging/eventgrid/aznamespaces/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/eventgrid/aznamespaces) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/aznamespaces/v1.0.0/sdk/messaging/eventgrid/aznamespaces/) |\n| Event Hubs | module [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azeventhubs/v2.0.2/sdk/messaging/azeventhubs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs) | GitHub [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azeventhubs/v2.0.2/sdk/messaging/azeventhubs/) |\n| Identity | module [1.13.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/v1.13.1/sdk/azidentity/)<br>module [1.14.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/v1.14.0-beta.3/sdk/azidentity/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) | GitHub [1.13.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/v1.13.1/sdk/azidentity/)<br>GitHub [1.14.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/v1.14.0-beta.3/sdk/azidentity/) |\n| Identity - Cache | module [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/cache/v0.4.0/sdk/azidentity/cache/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache) | GitHub [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/cache/v0.4.0/sdk/azidentity/cache/) |\n| Ingestion - Logs | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/ingestion/azlogs/v1.1.0/sdk/monitor/ingestion/azlogs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/monitor/ingestion/azlogs) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/ingestion/azlogs/v1.1.0/sdk/monitor/ingestion/azlogs/) |\n| Key Vault  - Keys | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azkeys/v1.4.0/sdk/security/keyvault/azkeys/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azkeys/v1.4.0/sdk/security/keyvault/azkeys/) |\n| Key Vault - Administration | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azadmin/v1.4.0/sdk/security/keyvault/azadmin/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azadmin) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azadmin/v1.4.0/sdk/security/keyvault/azadmin/) |\n| Key Vault - Certificates | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azcertificates/v1.4.0/sdk/security/keyvault/azcertificates/)<br>module [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azcertificates/v1.5.0-beta.1/sdk/security/keyvault/azcertificates/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azcertificates) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azcertificates/v1.4.0/sdk/security/keyvault/azcertificates/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azcertificates/v1.5.0-beta.1/sdk/security/keyvault/azcertificates/) |\n| Key Vault - Secrets | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azsecrets/v1.4.0/sdk/security/keyvault/azsecrets/)<br>module [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azsecrets/v1.5.0-beta.1/sdk/security/keyvault/azsecrets/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azsecrets/v1.4.0/sdk/security/keyvault/azsecrets/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azsecrets/v1.5.0-beta.1/sdk/security/keyvault/azsecrets/) |\n| Monitor Ingestion | module [0.1.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/azingest/v0.1.2/sdk/monitor/azingest/) |  | GitHub [0.1.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/azingest/v0.1.2/sdk/monitor/azingest/) |\n| Monitor Query | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/azquery/v1.2.0/sdk/monitor/azquery/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/monitor/azquery) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/azquery/v1.2.0/sdk/monitor/azquery/) |\n| OpenAI | module [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/ai/azopenai/v0.9.0/sdk/ai/azopenai/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai) | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/ai/azopenai/v0.9.0/sdk/ai/azopenai/) |\n| OpenTelemetry | module [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/tracing/azotel/v0.4.0/sdk/tracing/azotel/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel) | GitHub [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/tracing/azotel/v0.4.0/sdk/tracing/azotel/) |\n| Query - Logs | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/query/azlogs/v1.2.0/sdk/monitor/query/azlogs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azlogs) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/query/azlogs/v1.2.0/sdk/monitor/query/azlogs/) |\n| Query - Metrics | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/query/azmetrics/v1.3.0/sdk/monitor/query/azmetrics/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azmetrics) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/query/azmetrics/v1.3.0/sdk/monitor/query/azmetrics/) |\n| Service Bus | module [1.10.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azservicebus/v1.10.0/sdk/messaging/azservicebus/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus) | GitHub [1.10.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azservicebus/v1.10.0/sdk/messaging/azservicebus/) |\n| Storage - Blobs | module [1.6.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azblob/v1.6.4/sdk/storage/azblob/)<br>module [1.8.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azblob/v1.8.0-beta.1/sdk/storage/azblob/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob) | GitHub [1.6.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azblob/v1.6.4/sdk/storage/azblob/)<br>GitHub [1.8.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azblob/v1.8.0-beta.1/sdk/storage/azblob/) |\n| Storage - Files Data Lake | module [1.4.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azdatalake/v1.4.4/sdk/storage/azdatalake/)<br>module [1.6.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azdatalake/v1.6.0-beta.1/sdk/storage/azdatalake/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azdatalake) | GitHub [1.4.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azdatalake/v1.4.4/sdk/storage/azdatalake/)<br>GitHub [1.6.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azdatalake/v1.6.0-beta.1/sdk/storage/azdatalake/) |\n| Storage - Files Share | module [1.5.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azfile/v1.5.4/sdk/storage/azfile/)<br>module [1.7.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azfile/v1.7.0-beta.1/sdk/storage/azfile/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azfile) | GitHub [1.5.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azfile/v1.5.4/sdk/storage/azfile/)<br>GitHub [1.7.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azfile/v1.7.0-beta.1/sdk/storage/azfile/) |\n| Storage - Queues | module [2.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azqueue/v2.0.1/sdk/storage/azqueue/)<br>module [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azqueue/v2.1.0-beta.1/sdk/storage/azqueue/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azqueue/v2.0.1/sdk/storage/azqueue/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azqueue/v2.1.0-beta.1/sdk/storage/azqueue/) |\n| System Events | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/azsystemevents/v1.0.0/sdk/messaging/eventgrid/azsystemevents/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/eventgrid/azsystemevents) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/azsystemevents/v1.0.0/sdk/messaging/eventgrid/azsystemevents/) |\n| Tables | module [1.4.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/aztables/v1.4.1/sdk/data/aztables/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/data/aztables) | GitHub [1.4.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/aztables/v1.4.1/sdk/data/aztables/) |\n| Template | module [0.6.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/template/aztemplate/v0.6.3/sdk/template/aztemplate/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/template/aztemplate) | GitHub [0.6.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/template/aztemplate/v0.6.3/sdk/template/aztemplate/) |\n| Web PubSub | module [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azwebpubsub/v0.1.1/sdk/messaging/azwebpubsub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azwebpubsub) | GitHub [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azwebpubsub/v0.1.1/sdk/messaging/azwebpubsub/) |\n| Resource Management - Active Directory | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/aad/armaad/v1.2.0/sdk/resourcemanager/aad/armaad/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/aad/armaad) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/aad/armaad/v1.2.0/sdk/resourcemanager/aad/armaad/) |\n| Resource Management - Addons | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/addons/armaddons/v0.3.0/sdk/resourcemanager/addons/armaddons/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/addons/armaddons) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/addons/armaddons/v0.3.0/sdk/resourcemanager/addons/armaddons/) |\n| Resource Management - Advisor | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/advisor/armadvisor/v1.2.0/sdk/resourcemanager/advisor/armadvisor/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/advisor/armadvisor) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/advisor/armadvisor/v1.2.0/sdk/resourcemanager/advisor/armadvisor/) |\n| Resource Management - Agricultureplatform | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/agricultureplatform/armagricultureplatform/v0.1.0/sdk/resourcemanager/agricultureplatform/armagricultureplatform/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/agricultureplatform/armagricultureplatform) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/agricultureplatform/armagricultureplatform/v0.1.0/sdk/resourcemanager/agricultureplatform/armagricultureplatform/) |\n| Resource Management - Agrifood | module [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/agrifood/armagrifood/v0.9.0/sdk/resourcemanager/agrifood/armagrifood/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/agrifood/armagrifood) | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/agrifood/armagrifood/v0.9.0/sdk/resourcemanager/agrifood/armagrifood/) |\n| Resource Management - Alertprocessingrules | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertprocessingrules/armalertprocessingrules/v0.1.0/sdk/resourcemanager/alertprocessingrules/armalertprocessingrules/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/alertprocessingrules/armalertprocessingrules) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertprocessingrules/armalertprocessingrules/v0.1.0/sdk/resourcemanager/alertprocessingrules/armalertprocessingrules/) |\n| Resource Management - Alertrulerecommendations | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertrulerecommendations/armalertrulerecommendations/v0.1.0/sdk/resourcemanager/alertrulerecommendations/armalertrulerecommendations/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/alertrulerecommendations/armalertrulerecommendations) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertrulerecommendations/armalertrulerecommendations/v0.1.0/sdk/resourcemanager/alertrulerecommendations/armalertrulerecommendations/) |\n| Resource Management - Alerts Management | module [0.11.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertsmanagement/armalertsmanagement/v0.11.0/sdk/resourcemanager/alertsmanagement/armalertsmanagement/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/alertsmanagement/armalertsmanagement) | GitHub [0.11.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertsmanagement/armalertsmanagement/v0.11.0/sdk/resourcemanager/alertsmanagement/armalertsmanagement/) |\n| Resource Management - Analysis Services | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/analysisservices/armanalysisservices/v1.2.0/sdk/resourcemanager/analysisservices/armanalysisservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/analysisservices/armanalysisservices) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/analysisservices/armanalysisservices/v1.2.0/sdk/resourcemanager/analysisservices/armanalysisservices/) |\n| Resource Management - API Center | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/apicenter/armapicenter/v1.0.0/sdk/resourcemanager/apicenter/armapicenter/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/apicenter/armapicenter) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/apicenter/armapicenter/v1.0.0/sdk/resourcemanager/apicenter/armapicenter/) |\n| Resource Management - API Management | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/apimanagement/armapimanagement/v3.0.0/sdk/resourcemanager/apimanagement/armapimanagement/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/apimanagement/armapimanagement) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/apimanagement/armapimanagement/v3.0.0/sdk/resourcemanager/apimanagement/armapimanagement/) |\n| Resource Management - App Compliance Automation | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appcomplianceautomation/armappcomplianceautomation/v1.0.0/sdk/resourcemanager/appcomplianceautomation/armappcomplianceautomation/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcomplianceautomation/armappcomplianceautomation) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appcomplianceautomation/armappcomplianceautomation/v1.0.0/sdk/resourcemanager/appcomplianceautomation/armappcomplianceautomation/) |\n| Resource Management - App Configuration | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appconfiguration/armappconfiguration/v3.0.0/sdk/resourcemanager/appconfiguration/armappconfiguration/)<br>module [3.1.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appconfiguration/armappconfiguration/v3.1.0-beta.2/sdk/resourcemanager/appconfiguration/armappconfiguration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appconfiguration/armappconfiguration) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appconfiguration/armappconfiguration/v3.0.0/sdk/resourcemanager/appconfiguration/armappconfiguration/)<br>GitHub [3.1.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appconfiguration/armappconfiguration/v3.1.0-beta.2/sdk/resourcemanager/appconfiguration/armappconfiguration/) |\n| Resource Management - App Service | module [6.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appservice/armappservice/v6.0.0/sdk/resourcemanager/appservice/armappservice/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appservice/armappservice) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appservice/armappservice/v6.0.0/sdk/resourcemanager/appservice/armappservice/) |\n| Resource Management - Application Insights | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/applicationinsights/armapplicationinsights/v1.2.0/sdk/resourcemanager/applicationinsights/armapplicationinsights/)<br>module [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/applicationinsights/armapplicationinsights/v2.0.0-beta.3/sdk/resourcemanager/applicationinsights/armapplicationinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/applicationinsights/armapplicationinsights) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/applicationinsights/armapplicationinsights/v1.2.0/sdk/resourcemanager/applicationinsights/armapplicationinsights/)<br>GitHub [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/applicationinsights/armapplicationinsights/v2.0.0-beta.3/sdk/resourcemanager/applicationinsights/armapplicationinsights/) |\n| Resource Management - Appnetwork | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appnetwork/armappnetwork/v0.1.0/sdk/resourcemanager/appnetwork/armappnetwork/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appnetwork/armappnetwork) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appnetwork/armappnetwork/v0.1.0/sdk/resourcemanager/appnetwork/armappnetwork/) |\n| Resource Management - Arc Data | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurearcdata/armazurearcdata/v0.7.0/sdk/resourcemanager/azurearcdata/armazurearcdata/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/azurearcdata/armazurearcdata) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurearcdata/armazurearcdata/v0.7.0/sdk/resourcemanager/azurearcdata/armazurearcdata/) |\n| Resource Management - Arize AI Observability Eval | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/arizeaiobservabilityeval/armarizeaiobservabilityeval/v1.0.0/sdk/resourcemanager/arizeaiobservabilityeval/armarizeaiobservabilityeval/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/arizeaiobservabilityeval/armarizeaiobservabilityeval) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/arizeaiobservabilityeval/armarizeaiobservabilityeval/v1.0.0/sdk/resourcemanager/arizeaiobservabilityeval/armarizeaiobservabilityeval/) |\n| Resource Management - Artifactsigning | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/artifactsigning/armartifactsigning/v0.1.0/sdk/resourcemanager/artifactsigning/armartifactsigning/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/artifactsigning/armartifactsigning) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/artifactsigning/armartifactsigning/v0.1.0/sdk/resourcemanager/artifactsigning/armartifactsigning/) |\n| Resource Management - Astro | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/astro/armastro/v0.1.0/sdk/resourcemanager/astro/armastro/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/astro/armastro) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/astro/armastro/v0.1.0/sdk/resourcemanager/astro/armastro/) |\n| Resource Management - Attestation | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/attestation/armattestation/v1.2.0/sdk/resourcemanager/attestation/armattestation/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/attestation/armattestation/v2.0.0-beta.1/sdk/resourcemanager/attestation/armattestation/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/attestation/armattestation) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/attestation/armattestation/v1.2.0/sdk/resourcemanager/attestation/armattestation/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/attestation/armattestation/v2.0.0-beta.1/sdk/resourcemanager/attestation/armattestation/) |\n| Resource Management - Authorization | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/authorization/armauthorization/v2.2.0/sdk/resourcemanager/authorization/armauthorization/)<br>module [3.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/authorization/armauthorization/v3.0.0-beta.2/sdk/resourcemanager/authorization/armauthorization/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/authorization/armauthorization/v2.2.0/sdk/resourcemanager/authorization/armauthorization/)<br>GitHub [3.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/authorization/armauthorization/v3.0.0-beta.2/sdk/resourcemanager/authorization/armauthorization/) |\n| Resource Management - Automanage | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/automanage/armautomanage/v1.2.0/sdk/resourcemanager/automanage/armautomanage/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/automanage/armautomanage) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/automanage/armautomanage/v1.2.0/sdk/resourcemanager/automanage/armautomanage/) |\n| Resource Management - Automation | module [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/automation/armautomation/v0.9.0/sdk/resourcemanager/automation/armautomation/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/automation/armautomation) | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/automation/armautomation/v0.9.0/sdk/resourcemanager/automation/armautomation/) |\n| Resource Management - Azure Data | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azuredata/armazuredata/v0.7.0/sdk/resourcemanager/azuredata/armazuredata/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/azuredata/armazuredata) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azuredata/armazuredata/v0.7.0/sdk/resourcemanager/azuredata/armazuredata/) |\n| Resource Management - Azure Stack HCI | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhci/v3.0.0/sdk/resourcemanager/azurestackhci/armazurestackhci/)<br>module [3.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhci/v3.1.0-beta.1/sdk/resourcemanager/azurestackhci/armazurestackhci/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/azurestackhci/armazurestackhci) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhci/v3.0.0/sdk/resourcemanager/azurestackhci/armazurestackhci/)<br>GitHub [3.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhci/v3.1.0-beta.1/sdk/resourcemanager/azurestackhci/armazurestackhci/) |\n| Resource Management - Azure VMware Solution | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/avs/armavs/v2.2.0/sdk/resourcemanager/avs/armavs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/avs/armavs) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/avs/armavs/v2.2.0/sdk/resourcemanager/avs/armavs/) |\n| Resource Management - Azurestackhcivm | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhcivm/v0.1.0/sdk/resourcemanager/azurestackhci/armazurestackhcivm/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/azurestackhci/armazurestackhcivm) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhcivm/v0.1.0/sdk/resourcemanager/azurestackhci/armazurestackhcivm/) |\n| Resource Management - BareMetal Infrastructure | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/v1.2.0/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/v2.0.0-beta.1/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/v1.2.0/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/v2.0.0-beta.1/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/) |\n| Resource Management - Batch | module [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/batch/armbatch/v4.0.0/sdk/resourcemanager/batch/armbatch/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/batch/armbatch) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/batch/armbatch/v4.0.0/sdk/resourcemanager/batch/armbatch/) |\n| Resource Management - Bicep | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armbicep/v0.1.0/sdk/resourcemanager/resources/armbicep/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armbicep) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armbicep/v0.1.0/sdk/resourcemanager/resources/armbicep/) |\n| Resource Management - Billing | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/billing/armbilling/v1.0.0/sdk/resourcemanager/billing/armbilling/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/billing/armbilling) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/billing/armbilling/v1.0.0/sdk/resourcemanager/billing/armbilling/) |\n| Resource Management - Billingbenefits | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/billingbenefits/armbillingbenefits/v2.1.0/sdk/resourcemanager/billingbenefits/armbillingbenefits/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/billingbenefits/armbillingbenefits) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/billingbenefits/armbillingbenefits/v2.1.0/sdk/resourcemanager/billingbenefits/armbillingbenefits/) |\n| Resource Management - Blockchain | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/blockchain/armblockchain/v0.7.0/sdk/resourcemanager/blockchain/armblockchain/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/blockchain/armblockchain) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/blockchain/armblockchain/v0.7.0/sdk/resourcemanager/blockchain/armblockchain/) |\n| Resource Management - Blueprint | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/blueprint/armblueprint/v0.7.0/sdk/resourcemanager/blueprint/armblueprint/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/blueprint/armblueprint) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/blueprint/armblueprint/v0.7.0/sdk/resourcemanager/blueprint/armblueprint/) |\n| Resource Management - Bot Service | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/botservice/armbotservice/v1.2.0/sdk/resourcemanager/botservice/armbotservice/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/botservice/armbotservice) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/botservice/armbotservice/v1.2.0/sdk/resourcemanager/botservice/armbotservice/) |\n| Resource Management - Carbonoptimization | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/carbonoptimization/armcarbonoptimization/v1.0.0/sdk/resourcemanager/carbonoptimization/armcarbonoptimization/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/carbonoptimization/armcarbonoptimization) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/carbonoptimization/armcarbonoptimization/v1.0.0/sdk/resourcemanager/carbonoptimization/armcarbonoptimization/) |\n| Resource Management - Certificateregistration | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/certificateregistration/armcertificateregistration/v0.1.0/sdk/resourcemanager/certificateregistration/armcertificateregistration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/certificateregistration/armcertificateregistration) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/certificateregistration/armcertificateregistration/v0.1.0/sdk/resourcemanager/certificateregistration/armcertificateregistration/) |\n| Resource Management - Change Analysis | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/changeanalysis/armchangeanalysis/v1.2.0/sdk/resourcemanager/changeanalysis/armchangeanalysis/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/changeanalysis/armchangeanalysis) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/changeanalysis/armchangeanalysis/v1.2.0/sdk/resourcemanager/changeanalysis/armchangeanalysis/) |\n| Resource Management - Changes | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armchanges/v1.2.0/sdk/resourcemanager/resources/armchanges/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armchanges) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armchanges/v1.2.0/sdk/resourcemanager/resources/armchanges/) |\n| Resource Management - Chaos | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/chaos/armchaos/v2.0.0/sdk/resourcemanager/chaos/armchaos/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/chaos/armchaos) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/chaos/armchaos/v2.0.0/sdk/resourcemanager/chaos/armchaos/) |\n| Resource Management - Cloudhealth | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cloudhealth/armcloudhealth/v0.1.0/sdk/resourcemanager/cloudhealth/armcloudhealth/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cloudhealth/armcloudhealth) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cloudhealth/armcloudhealth/v0.1.0/sdk/resourcemanager/cloudhealth/armcloudhealth/) |\n| Resource Management - Cognitive Search | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/search/armsearch/v1.4.0/sdk/resourcemanager/search/armsearch/)<br>module [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/search/armsearch/v2.0.0-beta.2/sdk/resourcemanager/search/armsearch/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/search/armsearch) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/search/armsearch/v1.4.0/sdk/resourcemanager/search/armsearch/)<br>GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/search/armsearch/v2.0.0-beta.2/sdk/resourcemanager/search/armsearch/) |\n| Resource Management - Cognitive Services | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cognitiveservices/armcognitiveservices/v3.0.0/sdk/resourcemanager/cognitiveservices/armcognitiveservices/)<br>module [4.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cognitiveservices/armcognitiveservices/v4.0.0-beta.1/sdk/resourcemanager/cognitiveservices/armcognitiveservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cognitiveservices/armcognitiveservices) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cognitiveservices/armcognitiveservices/v3.0.0/sdk/resourcemanager/cognitiveservices/armcognitiveservices/)<br>GitHub [4.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cognitiveservices/armcognitiveservices/v4.0.0-beta.1/sdk/resourcemanager/cognitiveservices/armcognitiveservices/) |\n| Resource Management - Commerce | module [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/commerce/armcommerce/v0.4.0/sdk/resourcemanager/commerce/armcommerce/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/commerce/armcommerce) | GitHub [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/commerce/armcommerce/v0.4.0/sdk/resourcemanager/commerce/armcommerce/) |\n| Resource Management - Communication | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/communication/armcommunication/v2.3.0/sdk/resourcemanager/communication/armcommunication/)<br>module [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/communication/armcommunication/v3.0.0-beta.1/sdk/resourcemanager/communication/armcommunication/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/communication/armcommunication) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/communication/armcommunication/v2.3.0/sdk/resourcemanager/communication/armcommunication/)<br>GitHub [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/communication/armcommunication/v3.0.0-beta.1/sdk/resourcemanager/communication/armcommunication/) |\n| Resource Management - Compute | module [8.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/compute/armcompute/v8.0.0/sdk/resourcemanager/compute/armcompute/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute) | GitHub [8.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/compute/armcompute/v8.0.0/sdk/resourcemanager/compute/armcompute/) |\n| Resource Management - Compute Fleet | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computefleet/armcomputefleet/v1.0.0/sdk/resourcemanager/computefleet/armcomputefleet/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computefleet/armcomputefleet/v2.0.0-beta.1/sdk/resourcemanager/computefleet/armcomputefleet/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computefleet/armcomputefleet) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computefleet/armcomputefleet/v1.0.0/sdk/resourcemanager/computefleet/armcomputefleet/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computefleet/armcomputefleet/v2.0.0-beta.1/sdk/resourcemanager/computefleet/armcomputefleet/) |\n| Resource Management - Compute Schedule | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computeschedule/armcomputeschedule/v1.1.0/sdk/resourcemanager/computeschedule/armcomputeschedule/)<br>module [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computeschedule/armcomputeschedule/v1.2.0-beta.1/sdk/resourcemanager/computeschedule/armcomputeschedule/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computeschedule/armcomputeschedule) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computeschedule/armcomputeschedule/v1.1.0/sdk/resourcemanager/computeschedule/armcomputeschedule/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computeschedule/armcomputeschedule/v1.2.0-beta.1/sdk/resourcemanager/computeschedule/armcomputeschedule/) |\n| Resource Management - Computebulkactions | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computebulkactions/armcomputebulkactions/v0.1.0/sdk/resourcemanager/computebulkactions/armcomputebulkactions/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computebulkactions/armcomputebulkactions) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computebulkactions/armcomputebulkactions/v0.1.0/sdk/resourcemanager/computebulkactions/armcomputebulkactions/) |\n| Resource Management - Computelimit | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computelimit/armcomputelimit/v1.0.0/sdk/resourcemanager/computelimit/armcomputelimit/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computelimit/armcomputelimit) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computelimit/armcomputelimit/v1.0.0/sdk/resourcemanager/computelimit/armcomputelimit/) |\n| Resource Management - Computerecommender | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computerecommender/armcomputerecommender/v0.1.0/sdk/resourcemanager/computerecommender/armcomputerecommender/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computerecommender/armcomputerecommender) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computerecommender/armcomputerecommender/v0.1.0/sdk/resourcemanager/computerecommender/armcomputerecommender/) |\n| Resource Management - Confidential Ledger | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confidentialledger/armconfidentialledger/v1.2.0/sdk/resourcemanager/confidentialledger/armconfidentialledger/)<br>module [1.3.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confidentialledger/armconfidentialledger/v1.3.0-beta.3/sdk/resourcemanager/confidentialledger/armconfidentialledger/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/confidentialledger/armconfidentialledger) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confidentialledger/armconfidentialledger/v1.2.0/sdk/resourcemanager/confidentialledger/armconfidentialledger/)<br>GitHub [1.3.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confidentialledger/armconfidentialledger/v1.3.0-beta.3/sdk/resourcemanager/confidentialledger/armconfidentialledger/) |\n| Resource Management - Confluent | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confluent/armconfluent/v1.3.0/sdk/resourcemanager/confluent/armconfluent/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/confluent/armconfluent) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confluent/armconfluent/v1.3.0/sdk/resourcemanager/confluent/armconfluent/) |\n| Resource Management - Connected Cache | module [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/connectedcache/armconnectedcache/v0.2.0/sdk/resourcemanager/connectedcache/armconnectedcache/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/connectedcache/armconnectedcache) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/connectedcache/armconnectedcache/v0.2.0/sdk/resourcemanager/connectedcache/armconnectedcache/) |\n| Resource Management - Connected VMWare | module [1.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/connectedvmware/armconnectedvmware/v1.1.1/sdk/resourcemanager/connectedvmware/armconnectedvmware/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/connectedvmware/armconnectedvmware) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/connectedvmware/armconnectedvmware/v1.1.1/sdk/resourcemanager/connectedvmware/armconnectedvmware/) |\n| Resource Management - Consumption | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/consumption/armconsumption/v1.2.0/sdk/resourcemanager/consumption/armconsumption/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/consumption/armconsumption) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/consumption/armconsumption/v1.2.0/sdk/resourcemanager/consumption/armconsumption/) |\n| Resource Management - Container Apps | module [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appcontainers/armappcontainers/v4.0.0/sdk/resourcemanager/appcontainers/armappcontainers/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcontainers/armappcontainers) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appcontainers/armappcontainers/v4.0.0/sdk/resourcemanager/appcontainers/armappcontainers/) |\n| Resource Management - Container Instances | module [2.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerinstance/armcontainerinstance/v2.4.0/sdk/resourcemanager/containerinstance/armcontainerinstance/)<br>module [2.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerinstance/armcontainerinstance/v2.5.0-beta.1/sdk/resourcemanager/containerinstance/armcontainerinstance/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerinstance/armcontainerinstance) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerinstance/armcontainerinstance/v2.4.0/sdk/resourcemanager/containerinstance/armcontainerinstance/)<br>GitHub [2.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerinstance/armcontainerinstance/v2.5.0-beta.1/sdk/resourcemanager/containerinstance/armcontainerinstance/) |\n| Resource Management - Container Orchestrator Runtime | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerorchestratorruntime/armcontainerorchestratorruntime/v0.1.0/sdk/resourcemanager/containerorchestratorruntime/armcontainerorchestratorruntime/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerorchestratorruntime/armcontainerorchestratorruntime) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerorchestratorruntime/armcontainerorchestratorruntime/v0.1.0/sdk/resourcemanager/containerorchestratorruntime/armcontainerorchestratorruntime/) |\n| Resource Management - Container Registry | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerregistry/armcontainerregistry/v3.0.0/sdk/resourcemanager/containerregistry/armcontainerregistry/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerregistry/armcontainerregistry) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerregistry/armcontainerregistry/v3.0.0/sdk/resourcemanager/containerregistry/armcontainerregistry/) |\n| Resource Management - Container Service | module [9.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armcontainerservice/v9.1.0/sdk/resourcemanager/containerservice/armcontainerservice/)<br>module [9.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armcontainerservice/v9.2.0-beta.1/sdk/resourcemanager/containerservice/armcontainerservice/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice) | GitHub [9.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armcontainerservice/v9.1.0/sdk/resourcemanager/containerservice/armcontainerservice/)<br>GitHub [9.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armcontainerservice/v9.2.0-beta.1/sdk/resourcemanager/containerservice/armcontainerservice/) |\n| Resource Management - Container Service Fleet | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/v2.0.0/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/)<br>module [3.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/v3.0.0-beta.4/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/v2.0.0/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/)<br>GitHub [3.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/v3.0.0-beta.4/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/) |\n| Resource Management - Containerregistrytasks | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerregistry/armcontainerregistrytasks/v0.1.0/sdk/resourcemanager/containerregistry/armcontainerregistrytasks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerregistry/armcontainerregistrytasks) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerregistry/armcontainerregistrytasks/v0.1.0/sdk/resourcemanager/containerregistry/armcontainerregistrytasks/) |\n| Resource Management - Content Delivery Network | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cdn/armcdn/v2.2.0/sdk/resourcemanager/cdn/armcdn/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cdn/armcdn) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cdn/armcdn/v2.2.0/sdk/resourcemanager/cdn/armcdn/) |\n| Resource Management - Cosmos DB | module [3.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmos/armcosmos/v3.4.0/sdk/resourcemanager/cosmos/armcosmos/)<br>module [4.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmos/armcosmos/v4.0.0-beta.3/sdk/resourcemanager/cosmos/armcosmos/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cosmos/armcosmos) | GitHub [3.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmos/armcosmos/v3.4.0/sdk/resourcemanager/cosmos/armcosmos/)<br>GitHub [4.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmos/armcosmos/v4.0.0-beta.3/sdk/resourcemanager/cosmos/armcosmos/) |\n| Resource Management - Cosmos DB for PostgreSQL | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/v1.1.0/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/)<br>module [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/v1.2.0-beta.1/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/v1.1.0/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/v1.2.0-beta.1/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/) |\n| Resource Management - Cost Management | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/costmanagement/armcostmanagement/v2.1.0/sdk/resourcemanager/costmanagement/armcostmanagement/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/costmanagement/armcostmanagement) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/costmanagement/armcostmanagement/v2.1.0/sdk/resourcemanager/costmanagement/armcostmanagement/) |\n| Resource Management - Custom Providers | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customproviders/armcustomproviders/v0.7.0/sdk/resourcemanager/customproviders/armcustomproviders/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/customproviders/armcustomproviders) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customproviders/armcustomproviders/v0.7.0/sdk/resourcemanager/customproviders/armcustomproviders/) |\n| Resource Management - Customer Insights | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customerinsights/armcustomerinsights/v1.2.0/sdk/resourcemanager/customerinsights/armcustomerinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/customerinsights/armcustomerinsights) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customerinsights/armcustomerinsights/v1.2.0/sdk/resourcemanager/customerinsights/armcustomerinsights/) |\n| Resource Management - Customer Lockbox | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customerlockbox/armcustomerlockbox/v0.7.0/sdk/resourcemanager/customerlockbox/armcustomerlockbox/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/customerlockbox/armcustomerlockbox) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customerlockbox/armcustomerlockbox/v0.7.0/sdk/resourcemanager/customerlockbox/armcustomerlockbox/) |\n| Resource Management - Data Boundaries | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databoundaries/armdataboundaries/v0.1.0/sdk/resourcemanager/databoundaries/armdataboundaries/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databoundaries/armdataboundaries) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databoundaries/armdataboundaries/v0.1.0/sdk/resourcemanager/databoundaries/armdataboundaries/) |\n| Resource Management - Data Box | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databox/armdatabox/v2.2.0/sdk/resourcemanager/databox/armdatabox/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databox/armdatabox) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databox/armdatabox/v2.2.0/sdk/resourcemanager/databox/armdatabox/) |\n| Resource Management - Data Box Edge | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databoxedge/armdataboxedge/v1.2.0/sdk/resourcemanager/databoxedge/armdataboxedge/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databoxedge/armdataboxedge) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databoxedge/armdataboxedge/v1.2.0/sdk/resourcemanager/databoxedge/armdataboxedge/) |\n| Resource Management - Data Catalog | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datacatalog/armdatacatalog/v1.2.0/sdk/resourcemanager/datacatalog/armdatacatalog/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datacatalog/armdatacatalog) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datacatalog/armdatacatalog/v1.2.0/sdk/resourcemanager/datacatalog/armdatacatalog/) |\n| Resource Management - Data Factory | module [10.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datafactory/armdatafactory/v10.0.0/sdk/resourcemanager/datafactory/armdatafactory/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datafactory/armdatafactory) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datafactory/armdatafactory/v10.0.0/sdk/resourcemanager/datafactory/armdatafactory/) |\n| Resource Management - Data Lake Analytics | module [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datalake-analytics/armdatalakeanalytics/v0.8.0/sdk/resourcemanager/datalake-analytics/armdatalakeanalytics/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datalake-analytics/armdatalakeanalytics) | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datalake-analytics/armdatalakeanalytics/v0.8.0/sdk/resourcemanager/datalake-analytics/armdatalakeanalytics/) |\n| Resource Management - Data Lake Store | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datalake-store/armdatalakestore/v1.2.0/sdk/resourcemanager/datalake-store/armdatalakestore/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datalake-store/armdatalakestore) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datalake-store/armdatalakestore/v1.2.0/sdk/resourcemanager/datalake-store/armdatalakestore/) |\n| Resource Management - Data Migration | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datamigration/armdatamigration/v2.0.0/sdk/resourcemanager/datamigration/armdatamigration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datamigration/armdatamigration) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datamigration/armdatamigration/v2.0.0/sdk/resourcemanager/datamigration/armdatamigration/) |\n| Resource Management - Data Protection | module [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dataprotection/armdataprotection/v4.0.0/sdk/resourcemanager/dataprotection/armdataprotection/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dataprotection/armdataprotection) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dataprotection/armdataprotection/v4.0.0/sdk/resourcemanager/dataprotection/armdataprotection/) |\n| Resource Management - Data Share | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datashare/armdatashare/v1.2.0/sdk/resourcemanager/datashare/armdatashare/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datashare/armdatashare) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datashare/armdatashare/v1.2.0/sdk/resourcemanager/datashare/armdatashare/) |\n| Resource Management - Database Watcher | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databasewatcher/armdatabasewatcher/v0.1.0/sdk/resourcemanager/databasewatcher/armdatabasewatcher/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databasewatcher/armdatabasewatcher) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databasewatcher/armdatabasewatcher/v0.1.0/sdk/resourcemanager/databasewatcher/armdatabasewatcher/) |\n| Resource Management - Databricks | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databricks/armdatabricks/v1.1.0/sdk/resourcemanager/databricks/armdatabricks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databricks/armdatabricks) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databricks/armdatabricks/v1.1.0/sdk/resourcemanager/databricks/armdatabricks/) |\n| Resource Management - Datadog | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datadog/armdatadog/v1.3.0/sdk/resourcemanager/datadog/armdatadog/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datadog/armdatadog) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datadog/armdatadog/v1.3.0/sdk/resourcemanager/datadog/armdatadog/) |\n| Resource Management - Delegated Network | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/delegatednetwork/armdelegatednetwork/v1.2.0/sdk/resourcemanager/delegatednetwork/armdelegatednetwork/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/delegatednetwork/armdelegatednetwork) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/delegatednetwork/armdelegatednetwork/v1.2.0/sdk/resourcemanager/delegatednetwork/armdelegatednetwork/) |\n| Resource Management - Dellstorage | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dell/armdellstorage/v1.0.0/sdk/resourcemanager/dell/armdellstorage/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dell/armdellstorage) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dell/armdellstorage/v1.0.0/sdk/resourcemanager/dell/armdellstorage/) |\n| Resource Management - Dependencymap | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dependencymap/armdependencymap/v0.1.0/sdk/resourcemanager/dependencymap/armdependencymap/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dependencymap/armdependencymap) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dependencymap/armdependencymap/v0.1.0/sdk/resourcemanager/dependencymap/armdependencymap/) |\n| Resource Management - Deployment Manager | module [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deploymentmanager/armdeploymentmanager/v0.6.0/sdk/resourcemanager/deploymentmanager/armdeploymentmanager/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/deploymentmanager/armdeploymentmanager) | GitHub [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deploymentmanager/armdeploymentmanager/v0.6.0/sdk/resourcemanager/deploymentmanager/armdeploymentmanager/) |\n| Resource Management - Deployment Scripts | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeploymentscripts/v2.1.0/sdk/resourcemanager/resources/armdeploymentscripts/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armdeploymentscripts) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeploymentscripts/v2.1.0/sdk/resourcemanager/resources/armdeploymentscripts/) |\n| Resource Management - Deployment Stacks | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeploymentstacks/v2.0.0/sdk/resourcemanager/resources/armdeploymentstacks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armdeploymentstacks) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeploymentstacks/v2.0.0/sdk/resourcemanager/resources/armdeploymentstacks/) |\n| Resource Management - Deployments | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeployments/v1.0.0/sdk/resourcemanager/resources/armdeployments/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armdeployments) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeployments/v1.0.0/sdk/resourcemanager/resources/armdeployments/) |\n| Resource Management - Deploymentsafeguards | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armdeploymentsafeguards/v0.1.0/sdk/resourcemanager/containerservice/armdeploymentsafeguards/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armdeploymentsafeguards) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armdeploymentsafeguards/v0.1.0/sdk/resourcemanager/containerservice/armdeploymentsafeguards/) |\n| Resource Management - Desktop Virtualization | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/desktopvirtualization/armdesktopvirtualization/v2.3.0/sdk/resourcemanager/desktopvirtualization/armdesktopvirtualization/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/desktopvirtualization/armdesktopvirtualization) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/desktopvirtualization/armdesktopvirtualization/v2.3.0/sdk/resourcemanager/desktopvirtualization/armdesktopvirtualization/) |\n| Resource Management - Dev Center | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devcenter/armdevcenter/v2.0.0/sdk/resourcemanager/devcenter/armdevcenter/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/devcenter/armdevcenter) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devcenter/armdevcenter/v2.0.0/sdk/resourcemanager/devcenter/armdevcenter/) |\n| Resource Management - DevHub | module [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devhub/armdevhub/v0.6.0/sdk/resourcemanager/devhub/armdevhub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/devhub/armdevhub) | GitHub [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devhub/armdevhub/v0.6.0/sdk/resourcemanager/devhub/armdevhub/) |\n| Resource Management - Device Provisioning Services | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/v1.2.0/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/)<br>module [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/v1.3.0-beta.2/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/v1.2.0/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/)<br>GitHub [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/v1.3.0-beta.2/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/) |\n| Resource Management - Device Registry | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceregistry/armdeviceregistry/v2.0.0/sdk/resourcemanager/deviceregistry/armdeviceregistry/)<br>module [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceregistry/armdeviceregistry/v2.1.0-beta.1/sdk/resourcemanager/deviceregistry/armdeviceregistry/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/deviceregistry/armdeviceregistry) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceregistry/armdeviceregistry/v2.0.0/sdk/resourcemanager/deviceregistry/armdeviceregistry/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceregistry/armdeviceregistry/v2.1.0-beta.1/sdk/resourcemanager/deviceregistry/armdeviceregistry/) |\n| Resource Management - Device Update | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceupdate/armdeviceupdate/v1.3.0/sdk/resourcemanager/deviceupdate/armdeviceupdate/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/deviceupdate/armdeviceupdate) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceupdate/armdeviceupdate/v1.3.0/sdk/resourcemanager/deviceupdate/armdeviceupdate/) |\n| Resource Management - DevOps | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devops/armdevops/v0.7.0/sdk/resourcemanager/devops/armdevops/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/devops/armdevops) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devops/armdevops/v0.7.0/sdk/resourcemanager/devops/armdevops/) |\n| Resource Management - DevOps Infrastructure | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devopsinfrastructure/armdevopsinfrastructure/v1.0.0/sdk/resourcemanager/devopsinfrastructure/armdevopsinfrastructure/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/devopsinfrastructure/armdevopsinfrastructure) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devopsinfrastructure/armdevopsinfrastructure/v1.0.0/sdk/resourcemanager/devopsinfrastructure/armdevopsinfrastructure/) |\n| Resource Management - DevTest Labs | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devtestlabs/armdevtestlabs/v1.2.0/sdk/resourcemanager/devtestlabs/armdevtestlabs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/devtestlabs/armdevtestlabs) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devtestlabs/armdevtestlabs/v1.2.0/sdk/resourcemanager/devtestlabs/armdevtestlabs/) |\n| Resource Management - Digital Twins | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/digitaltwins/armdigitaltwins/v1.2.0/sdk/resourcemanager/digitaltwins/armdigitaltwins/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/digitaltwins/armdigitaltwins) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/digitaltwins/armdigitaltwins/v1.2.0/sdk/resourcemanager/digitaltwins/armdigitaltwins/) |\n| Resource Management - Disconnectedoperations | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/disconnectedoperations/armdisconnectedoperations/v1.0.0/sdk/resourcemanager/disconnectedoperations/armdisconnectedoperations/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/disconnectedoperations/armdisconnectedoperations) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/disconnectedoperations/armdisconnectedoperations/v1.0.0/sdk/resourcemanager/disconnectedoperations/armdisconnectedoperations/) |\n| Resource Management - DNS | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dns/armdns/v1.2.0/sdk/resourcemanager/dns/armdns/)<br>module [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dns/armdns/v1.3.0-beta.1/sdk/resourcemanager/dns/armdns/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dns/armdns/v1.2.0/sdk/resourcemanager/dns/armdns/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dns/armdns/v1.3.0-beta.1/sdk/resourcemanager/dns/armdns/) |\n| Resource Management - DNS Resolver | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dnsresolver/armdnsresolver/v1.3.0/sdk/resourcemanager/dnsresolver/armdnsresolver/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dnsresolver/armdnsresolver/v2.0.0-beta.1/sdk/resourcemanager/dnsresolver/armdnsresolver/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dnsresolver/armdnsresolver) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dnsresolver/armdnsresolver/v1.3.0/sdk/resourcemanager/dnsresolver/armdnsresolver/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dnsresolver/armdnsresolver/v2.0.0-beta.1/sdk/resourcemanager/dnsresolver/armdnsresolver/) |\n| Resource Management - Domain Services | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/domainservices/armdomainservices/v1.2.0/sdk/resourcemanager/domainservices/armdomainservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/domainservices/armdomainservices) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/domainservices/armdomainservices/v1.2.0/sdk/resourcemanager/domainservices/armdomainservices/) |\n| Resource Management - Domainregistration | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/domainregistration/armdomainregistration/v0.1.0/sdk/resourcemanager/domainregistration/armdomainregistration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/domainregistration/armdomainregistration) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/domainregistration/armdomainregistration/v0.1.0/sdk/resourcemanager/domainregistration/armdomainregistration/) |\n| Resource Management - Durable Task | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/durabletask/armdurabletask/v1.1.0/sdk/resourcemanager/durabletask/armdurabletask/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/durabletask/armdurabletask) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/durabletask/armdurabletask/v1.1.0/sdk/resourcemanager/durabletask/armdurabletask/) |\n| Resource Management - Dynatrace | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dynatrace/armdynatrace/v2.1.0/sdk/resourcemanager/dynatrace/armdynatrace/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dynatrace/armdynatrace) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dynatrace/armdynatrace/v2.1.0/sdk/resourcemanager/dynatrace/armdynatrace/) |\n| Resource Management - Edge Order | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeorder/armedgeorder/v1.2.0/sdk/resourcemanager/edgeorder/armedgeorder/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/edgeorder/armedgeorder) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeorder/armedgeorder/v1.2.0/sdk/resourcemanager/edgeorder/armedgeorder/) |\n| Resource Management - Edge Order Partner | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeorderpartner/armedgeorderpartner/v0.7.0/sdk/resourcemanager/edgeorderpartner/armedgeorderpartner/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/edgeorderpartner/armedgeorderpartner) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeorderpartner/armedgeorderpartner/v0.7.0/sdk/resourcemanager/edgeorderpartner/armedgeorderpartner/) |\n| Resource Management - Edge Zones | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgezones/armedgezones/v0.1.0/sdk/resourcemanager/edgezones/armedgezones/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/edgezones/armedgezones) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgezones/armedgezones/v0.1.0/sdk/resourcemanager/edgezones/armedgezones/) |\n| Resource Management - Edgeactions | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeactions/armedgeactions/v0.1.0/sdk/resourcemanager/edgeactions/armedgeactions/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/edgeactions/armedgeactions) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeactions/armedgeactions/v0.1.0/sdk/resourcemanager/edgeactions/armedgeactions/) |\n| Resource Management - Education | module [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/education/armeducation/v0.4.0/sdk/resourcemanager/education/armeducation/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/education/armeducation) | GitHub [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/education/armeducation/v0.4.0/sdk/resourcemanager/education/armeducation/) |\n| Resource Management - Elastic | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elastic/armelastic/v2.0.0/sdk/resourcemanager/elastic/armelastic/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/elastic/armelastic) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elastic/armelastic/v2.0.0/sdk/resourcemanager/elastic/armelastic/) |\n| Resource Management - Elastic SAN | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elasticsan/armelasticsan/v1.2.0/sdk/resourcemanager/elasticsan/armelasticsan/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/elasticsan/armelasticsan) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elasticsan/armelasticsan/v1.2.0/sdk/resourcemanager/elasticsan/armelasticsan/) |\n| Resource Management - Elastics SANs | module [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elasticsans/armelasticsans/v0.1.1/sdk/resourcemanager/elasticsans/armelasticsans/) |  | GitHub [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elasticsans/armelasticsans/v0.1.1/sdk/resourcemanager/elasticsans/armelasticsans/) |\n| Resource Management - Engagement Fabric | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/engagementfabric/armengagementfabric/v0.3.0/sdk/resourcemanager/engagementfabric/armengagementfabric/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/engagementfabric/armengagementfabric) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/engagementfabric/armengagementfabric/v0.3.0/sdk/resourcemanager/engagementfabric/armengagementfabric/) |\n| Resource Management - Event Grid | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventgrid/armeventgrid/v2.3.0/sdk/resourcemanager/eventgrid/armeventgrid/)<br>module [2.4.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventgrid/armeventgrid/v2.4.0-beta.2/sdk/resourcemanager/eventgrid/armeventgrid/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventgrid/armeventgrid) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventgrid/armeventgrid/v2.3.0/sdk/resourcemanager/eventgrid/armeventgrid/)<br>GitHub [2.4.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventgrid/armeventgrid/v2.4.0-beta.2/sdk/resourcemanager/eventgrid/armeventgrid/) |\n| Resource Management - Event Hubs | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventhub/armeventhub/v1.3.0/sdk/resourcemanager/eventhub/armeventhub/)<br>module [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventhub/armeventhub/v1.4.0-beta.1/sdk/resourcemanager/eventhub/armeventhub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventhub/armeventhub/v1.3.0/sdk/resourcemanager/eventhub/armeventhub/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventhub/armeventhub/v1.4.0-beta.1/sdk/resourcemanager/eventhub/armeventhub/) |\n| Resource Management - Extended Location | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/extendedlocation/armextendedlocation/v1.2.0/sdk/resourcemanager/extendedlocation/armextendedlocation/)<br>module [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/extendedlocation/armextendedlocation/v1.3.0-beta.1/sdk/resourcemanager/extendedlocation/armextendedlocation/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/extendedlocation/armextendedlocation) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/extendedlocation/armextendedlocation/v1.2.0/sdk/resourcemanager/extendedlocation/armextendedlocation/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/extendedlocation/armextendedlocation/v1.3.0-beta.1/sdk/resourcemanager/extendedlocation/armextendedlocation/) |\n| Resource Management - Extensions | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armextensions/v1.0.0/sdk/resourcemanager/kubernetesconfiguration/armextensions/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kubernetesconfiguration/armextensions) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armextensions/v1.0.0/sdk/resourcemanager/kubernetesconfiguration/armextensions/) |\n| Resource Management - Extensiontypes | module [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armextensiontypes/v0.2.0/sdk/resourcemanager/kubernetesconfiguration/armextensiontypes/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kubernetesconfiguration/armextensiontypes) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armextensiontypes/v0.2.0/sdk/resourcemanager/kubernetesconfiguration/armextensiontypes/) |\n| Resource Management - Fabric | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/fabric/armfabric/v1.0.0/sdk/resourcemanager/fabric/armfabric/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/fabric/armfabric) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/fabric/armfabric/v1.0.0/sdk/resourcemanager/fabric/armfabric/) |\n| Resource Management - Features | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armfeatures/v1.2.0/sdk/resourcemanager/resources/armfeatures/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armfeatures) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armfeatures/v1.2.0/sdk/resourcemanager/resources/armfeatures/) |\n| Resource Management - Fluid Relay | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/fluidrelay/armfluidrelay/v1.2.0/sdk/resourcemanager/fluidrelay/armfluidrelay/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/fluidrelay/armfluidrelay) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/fluidrelay/armfluidrelay/v1.2.0/sdk/resourcemanager/fluidrelay/armfluidrelay/) |\n| Resource Management - Fluxconfigurations | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armfluxconfigurations/v0.1.0/sdk/resourcemanager/kubernetesconfiguration/armfluxconfigurations/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kubernetesconfiguration/armfluxconfigurations) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armfluxconfigurations/v0.1.0/sdk/resourcemanager/kubernetesconfiguration/armfluxconfigurations/) |\n| Resource Management - Front Door | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/frontdoor/armfrontdoor/v1.4.0/sdk/resourcemanager/frontdoor/armfrontdoor/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/frontdoor/armfrontdoor/v2.0.0-beta.1/sdk/resourcemanager/frontdoor/armfrontdoor/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/frontdoor/armfrontdoor) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/frontdoor/armfrontdoor/v1.4.0/sdk/resourcemanager/frontdoor/armfrontdoor/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/frontdoor/armfrontdoor/v2.0.0-beta.1/sdk/resourcemanager/frontdoor/armfrontdoor/) |\n| Resource Management - Graph Services | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/graphservices/armgraphservices/v1.1.0/sdk/resourcemanager/graphservices/armgraphservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/graphservices/armgraphservices) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/graphservices/armgraphservices/v1.1.0/sdk/resourcemanager/graphservices/armgraphservices/) |\n| Resource Management - Guest Configuration | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/guestconfiguration/armguestconfiguration/v1.2.0/sdk/resourcemanager/guestconfiguration/armguestconfiguration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/guestconfiguration/armguestconfiguration) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/guestconfiguration/armguestconfiguration/v1.2.0/sdk/resourcemanager/guestconfiguration/armguestconfiguration/) |\n| Resource Management - HANA on Azure | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hanaonazure/armhanaonazure/v0.7.0/sdk/resourcemanager/hanaonazure/armhanaonazure/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hanaonazure/armhanaonazure) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hanaonazure/armhanaonazure/v0.7.0/sdk/resourcemanager/hanaonazure/armhanaonazure/) |\n| Resource Management - Hardware Security Module | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hardwaresecuritymodules/armhardwaresecuritymodules/v2.0.0/sdk/resourcemanager/hardwaresecuritymodules/armhardwaresecuritymodules/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hardwaresecuritymodules/armhardwaresecuritymodules) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hardwaresecuritymodules/armhardwaresecuritymodules/v2.0.0/sdk/resourcemanager/hardwaresecuritymodules/armhardwaresecuritymodules/) |\n| Resource Management - Hdinsight | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hdinsight/armhdinsight/v1.2.0/sdk/resourcemanager/hdinsight/armhdinsight/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hdinsight/armhdinsight/v2.0.0-beta.1/sdk/resourcemanager/hdinsight/armhdinsight/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hdinsight/armhdinsight) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hdinsight/armhdinsight/v1.2.0/sdk/resourcemanager/hdinsight/armhdinsight/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hdinsight/armhdinsight/v2.0.0-beta.1/sdk/resourcemanager/hdinsight/armhdinsight/) |\n| Resource Management - Health Bot | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthbot/armhealthbot/v1.2.0/sdk/resourcemanager/healthbot/armhealthbot/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/healthbot/armhealthbot) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthbot/armhealthbot/v1.2.0/sdk/resourcemanager/healthbot/armhealthbot/) |\n| Resource Management - Health Data AI Services | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthdataaiservices/armhealthdataaiservices/v1.0.0/sdk/resourcemanager/healthdataaiservices/armhealthdataaiservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/healthdataaiservices/armhealthdataaiservices) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthdataaiservices/armhealthdataaiservices/v1.0.0/sdk/resourcemanager/healthdataaiservices/armhealthdataaiservices/) |\n| Resource Management - Healthcare APIs | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthcareapis/armhealthcareapis/v2.1.0/sdk/resourcemanager/healthcareapis/armhealthcareapis/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/healthcareapis/armhealthcareapis) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthcareapis/armhealthcareapis/v2.1.0/sdk/resourcemanager/healthcareapis/armhealthcareapis/) |\n| Resource Management - Hybrid Compute | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcompute/armhybridcompute/v2.0.0/sdk/resourcemanager/hybridcompute/armhybridcompute/)<br>module [2.1.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcompute/armhybridcompute/v2.1.0-beta.2/sdk/resourcemanager/hybridcompute/armhybridcompute/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybridcompute/armhybridcompute) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcompute/armhybridcompute/v2.0.0/sdk/resourcemanager/hybridcompute/armhybridcompute/)<br>GitHub [2.1.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcompute/armhybridcompute/v2.1.0-beta.2/sdk/resourcemanager/hybridcompute/armhybridcompute/) |\n| Resource Management - Hybrid Connectivity | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/v1.1.0/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/)<br>module [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/v1.2.0-beta.1/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/v1.1.0/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/v1.2.0-beta.1/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/) |\n| Resource Management - Hybrid Container Service | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcontainerservice/armhybridcontainerservice/v1.0.0/sdk/resourcemanager/hybridcontainerservice/armhybridcontainerservice/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybridcontainerservice/armhybridcontainerservice) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcontainerservice/armhybridcontainerservice/v1.0.0/sdk/resourcemanager/hybridcontainerservice/armhybridcontainerservice/) |\n| Resource Management - Hybrid Kubernetes | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/v1.2.0/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/v2.0.0-beta.1/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/v1.2.0/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/v2.0.0-beta.1/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/) |\n| Resource Management - Hybrid Network | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridnetwork/armhybridnetwork/v2.0.0/sdk/resourcemanager/hybridnetwork/armhybridnetwork/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybridnetwork/armhybridnetwork) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridnetwork/armhybridnetwork/v2.0.0/sdk/resourcemanager/hybridnetwork/armhybridnetwork/) |\n| Resource Management - Impact Reporting | module [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/impactreporting/armimpactreporting/v0.2.0/sdk/resourcemanager/impactreporting/armimpactreporting/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/impactreporting/armimpactreporting) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/impactreporting/armimpactreporting/v0.2.0/sdk/resourcemanager/impactreporting/armimpactreporting/) |\n| Resource Management - Informatica Data Management | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/informaticadatamgmt/arminformaticadatamgmt/v1.0.0/sdk/resourcemanager/informaticadatamgmt/arminformaticadatamgmt/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/informaticadatamgmt/arminformaticadatamgmt) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/informaticadatamgmt/arminformaticadatamgmt/v1.0.0/sdk/resourcemanager/informaticadatamgmt/arminformaticadatamgmt/) |\n| Resource Management - Integration Spaces | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/integrationspaces/armintegrationspaces/v0.1.0/sdk/resourcemanager/integrationspaces/armintegrationspaces/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/integrationspaces/armintegrationspaces) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/integrationspaces/armintegrationspaces/v0.1.0/sdk/resourcemanager/integrationspaces/armintegrationspaces/) |\n| Resource Management - IoT Central | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotcentral/armiotcentral/v1.2.0/sdk/resourcemanager/iotcentral/armiotcentral/)<br>module [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotcentral/armiotcentral/v2.0.0-beta.2/sdk/resourcemanager/iotcentral/armiotcentral/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/iotcentral/armiotcentral) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotcentral/armiotcentral/v1.2.0/sdk/resourcemanager/iotcentral/armiotcentral/)<br>GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotcentral/armiotcentral/v2.0.0-beta.2/sdk/resourcemanager/iotcentral/armiotcentral/) |\n| Resource Management - IoT Firmware Defense | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotfirmwaredefense/armiotfirmwaredefense/v2.0.0/sdk/resourcemanager/iotfirmwaredefense/armiotfirmwaredefense/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/iotfirmwaredefense/armiotfirmwaredefense) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotfirmwaredefense/armiotfirmwaredefense/v2.0.0/sdk/resourcemanager/iotfirmwaredefense/armiotfirmwaredefense/) |\n| Resource Management - IoT Hub | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iothub/armiothub/v1.3.0/sdk/resourcemanager/iothub/armiothub/)<br>module [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iothub/armiothub/v1.4.0-beta.1/sdk/resourcemanager/iothub/armiothub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/iothub/armiothub) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iothub/armiothub/v1.3.0/sdk/resourcemanager/iothub/armiothub/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iothub/armiothub/v1.4.0-beta.1/sdk/resourcemanager/iothub/armiothub/) |\n| Resource Management - IoT Operations | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotoperations/armiotoperations/v1.1.0/sdk/resourcemanager/iotoperations/armiotoperations/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/iotoperations/armiotoperations) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotoperations/armiotoperations/v1.1.0/sdk/resourcemanager/iotoperations/armiotoperations/) |\n| Resource Management - IoT Security | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotsecurity/armiotsecurity/v0.7.0/sdk/resourcemanager/iotsecurity/armiotsecurity/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/iotsecurity/armiotsecurity) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotsecurity/armiotsecurity/v0.7.0/sdk/resourcemanager/iotsecurity/armiotsecurity/) |\n| Resource Management - Key Vault | module [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/keyvault/armkeyvault/v2.0.2/sdk/resourcemanager/keyvault/armkeyvault/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault) | GitHub [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/keyvault/armkeyvault/v2.0.2/sdk/resourcemanager/keyvault/armkeyvault/) |\n| Resource Management - Kubernetes Configuration | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration/v2.2.0/sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration/v2.2.0/sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration/) |\n| Resource Management - Kusto | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kusto/armkusto/v2.3.0/sdk/resourcemanager/kusto/armkusto/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kusto/armkusto) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kusto/armkusto/v2.3.0/sdk/resourcemanager/kusto/armkusto/) |\n| Resource Management - Lab Services | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/labservices/armlabservices/v1.2.0/sdk/resourcemanager/labservices/armlabservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/labservices/armlabservices) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/labservices/armlabservices/v1.2.0/sdk/resourcemanager/labservices/armlabservices/) |\n| Resource Management - Lambdatesthyperexecute | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/lambdatesthyperexecute/armlambdatesthyperexecute/v1.0.0/sdk/resourcemanager/lambdatesthyperexecute/armlambdatesthyperexecute/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/lambdatesthyperexecute/armlambdatesthyperexecute) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/lambdatesthyperexecute/armlambdatesthyperexecute/v1.0.0/sdk/resourcemanager/lambdatesthyperexecute/armlambdatesthyperexecute/) |\n| Resource Management - Large Instance | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/largeinstance/armlargeinstance/v0.1.0/sdk/resourcemanager/largeinstance/armlargeinstance/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/largeinstance/armlargeinstance) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/largeinstance/armlargeinstance/v0.1.0/sdk/resourcemanager/largeinstance/armlargeinstance/) |\n| Resource Management - Links | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armlinks/v1.2.0/sdk/resourcemanager/resources/armlinks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armlinks) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armlinks/v1.2.0/sdk/resourcemanager/resources/armlinks/) |\n| Resource Management - Load Testing | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/loadtesting/armloadtesting/v1.2.0/sdk/resourcemanager/loadtesting/armloadtesting/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/loadtesting/armloadtesting) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/loadtesting/armloadtesting/v1.2.0/sdk/resourcemanager/loadtesting/armloadtesting/) |\n| Resource Management - Load Testing | module [1.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/loadtestservice/armloadtestservice/v1.0.1/sdk/resourcemanager/loadtestservice/armloadtestservice/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/loadtestservice/armloadtestservice) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/loadtestservice/armloadtestservice/v1.0.1/sdk/resourcemanager/loadtestservice/armloadtestservice/) |\n| Resource Management - Locks | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armlocks/v1.2.0/sdk/resourcemanager/resources/armlocks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armlocks) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armlocks/v1.2.0/sdk/resourcemanager/resources/armlocks/) |\n| Resource Management - Log Analytics | module [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/operationalinsights/armoperationalinsights/v2.0.2/sdk/resourcemanager/operationalinsights/armoperationalinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/operationalinsights/armoperationalinsights) | GitHub [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/operationalinsights/armoperationalinsights/v2.0.2/sdk/resourcemanager/operationalinsights/armoperationalinsights/) |\n| Resource Management - Logic Apps | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/logic/armlogic/v1.2.0/sdk/resourcemanager/logic/armlogic/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/logic/armlogic) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/logic/armlogic/v1.2.0/sdk/resourcemanager/logic/armlogic/) |\n| Resource Management - M365 Security and Compliance | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/m365securityandcompliance/armm365securityandcompliance/v0.7.0/sdk/resourcemanager/m365securityandcompliance/armm365securityandcompliance/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/m365securityandcompliance/armm365securityandcompliance) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/m365securityandcompliance/armm365securityandcompliance/v0.7.0/sdk/resourcemanager/m365securityandcompliance/armm365securityandcompliance/) |\n| Resource Management - Machine Learning | module [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/machinelearning/armmachinelearning/v4.0.0/sdk/resourcemanager/machinelearning/armmachinelearning/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/machinelearning/armmachinelearning) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/machinelearning/armmachinelearning/v4.0.0/sdk/resourcemanager/machinelearning/armmachinelearning/) |\n| Resource Management - Machine Learning Services | module [1.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/machinelearningservices/armmachinelearningservices/v1.0.1/sdk/resourcemanager/machinelearningservices/armmachinelearningservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/machinelearningservices/armmachinelearningservices) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/machinelearningservices/armmachinelearningservices/v1.0.1/sdk/resourcemanager/machinelearningservices/armmachinelearningservices/) |\n| Resource Management - Maintenance | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maintenance/armmaintenance/v1.3.0/sdk/resourcemanager/maintenance/armmaintenance/)<br>module [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maintenance/armmaintenance/v1.4.0-beta.1/sdk/resourcemanager/maintenance/armmaintenance/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/maintenance/armmaintenance) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maintenance/armmaintenance/v1.3.0/sdk/resourcemanager/maintenance/armmaintenance/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maintenance/armmaintenance/v1.4.0-beta.1/sdk/resourcemanager/maintenance/armmaintenance/) |\n| Resource Management - Managed Applications | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armmanagedapplications/v1.2.0/sdk/resourcemanager/resources/armmanagedapplications/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armmanagedapplications) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armmanagedapplications/v1.2.0/sdk/resourcemanager/resources/armmanagedapplications/) |\n| Resource Management - Managed Applications | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/solutions/armmanagedapplications/v2.1.0/sdk/resourcemanager/solutions/armmanagedapplications/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/solutions/armmanagedapplications) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/solutions/armmanagedapplications/v2.1.0/sdk/resourcemanager/solutions/armmanagedapplications/) |\n| Resource Management - Managed Grafana | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dashboard/armdashboard/v2.0.0/sdk/resourcemanager/dashboard/armdashboard/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dashboard/armdashboard) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dashboard/armdashboard/v2.0.0/sdk/resourcemanager/dashboard/armdashboard/) |\n| Resource Management - Managed Network | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managednetwork/armmanagednetwork/v0.3.0/sdk/resourcemanager/managednetwork/armmanagednetwork/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managednetwork/armmanagednetwork) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managednetwork/armmanagednetwork/v0.3.0/sdk/resourcemanager/managednetwork/armmanagednetwork/) |\n| Resource Management - Managed Network Fabric | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managednetworkfabric/armmanagednetworkfabric/v1.1.0/sdk/resourcemanager/managednetworkfabric/armmanagednetworkfabric/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managednetworkfabric/armmanagednetworkfabric) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managednetworkfabric/armmanagednetworkfabric/v1.1.0/sdk/resourcemanager/managednetworkfabric/armmanagednetworkfabric/) |\n| Resource Management - Managed Service Identity | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/msi/armmsi/v1.3.0/sdk/resourcemanager/msi/armmsi/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/msi/armmsi/v1.3.0/sdk/resourcemanager/msi/armmsi/) |\n| Resource Management - Managed Services | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managedservices/armmanagedservices/v0.7.0/sdk/resourcemanager/managedservices/armmanagedservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managedservices/armmanagedservices) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managedservices/armmanagedservices/v0.7.0/sdk/resourcemanager/managedservices/armmanagedservices/) |\n| Resource Management - Managedops | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managedops/armmanagedops/v0.1.0/sdk/resourcemanager/managedops/armmanagedops/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managedops/armmanagedops) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managedops/armmanagedops/v0.1.0/sdk/resourcemanager/managedops/armmanagedops/) |\n| Resource Management - Management Groups | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementgroups/armmanagementgroups/v1.2.0/sdk/resourcemanager/managementgroups/armmanagementgroups/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementgroups/armmanagementgroups/v2.0.0-beta.1/sdk/resourcemanager/managementgroups/armmanagementgroups/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementgroups/armmanagementgroups/v1.2.0/sdk/resourcemanager/managementgroups/armmanagementgroups/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementgroups/armmanagementgroups/v2.0.0-beta.1/sdk/resourcemanager/managementgroups/armmanagementgroups/) |\n| Resource Management - Management Partner | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementpartner/armmanagementpartner/v0.7.0/sdk/resourcemanager/managementpartner/armmanagementpartner/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementpartner/armmanagementpartner) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementpartner/armmanagementpartner/v0.7.0/sdk/resourcemanager/managementpartner/armmanagementpartner/) |\n| Resource Management - Maps | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maps/armmaps/v1.1.0/sdk/resourcemanager/maps/armmaps/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maps/armmaps/v2.0.0-beta.1/sdk/resourcemanager/maps/armmaps/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/maps/armmaps) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maps/armmaps/v1.1.0/sdk/resourcemanager/maps/armmaps/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maps/armmaps/v2.0.0-beta.1/sdk/resourcemanager/maps/armmaps/) |\n| Resource Management - MariaDB | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mariadb/armmariadb/v1.2.0/sdk/resourcemanager/mariadb/armmariadb/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mariadb/armmariadb) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mariadb/armmariadb/v1.2.0/sdk/resourcemanager/mariadb/armmariadb/) |\n| Resource Management - Marketplace | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplace/armmarketplace/v1.2.0/sdk/resourcemanager/marketplace/armmarketplace/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplace/armmarketplace/v2.0.0-beta.1/sdk/resourcemanager/marketplace/armmarketplace/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/marketplace/armmarketplace) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplace/armmarketplace/v1.2.0/sdk/resourcemanager/marketplace/armmarketplace/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplace/armmarketplace/v2.0.0-beta.1/sdk/resourcemanager/marketplace/armmarketplace/) |\n| Resource Management - Marketplace Ordering | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplaceordering/armmarketplaceordering/v1.2.0/sdk/resourcemanager/marketplaceordering/armmarketplaceordering/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/marketplaceordering/armmarketplaceordering) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplaceordering/armmarketplaceordering/v1.2.0/sdk/resourcemanager/marketplaceordering/armmarketplaceordering/) |\n| Resource Management - Migrate | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrate/armmigrate/v1.2.0/sdk/resourcemanager/migrate/armmigrate/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/migrate/armmigrate) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrate/armmigrate/v1.2.0/sdk/resourcemanager/migrate/armmigrate/) |\n| Resource Management - Migration Assessment | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrationassessment/armmigrationassessment/v0.1.0/sdk/resourcemanager/migrationassessment/armmigrationassessment/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/migrationassessment/armmigrationassessment) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrationassessment/armmigrationassessment/v0.1.0/sdk/resourcemanager/migrationassessment/armmigrationassessment/) |\n| Resource Management - Migration Discovery SAP | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrationdiscovery/armmigrationdiscoverysap/v0.1.0/sdk/resourcemanager/migrationdiscovery/armmigrationdiscoverysap/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/migrationdiscovery/armmigrationdiscoverysap) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrationdiscovery/armmigrationdiscoverysap/v0.1.0/sdk/resourcemanager/migrationdiscovery/armmigrationdiscoverysap/) |\n| Resource Management - Mongo Cluster | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mongocluster/armmongocluster/v1.1.0/sdk/resourcemanager/mongocluster/armmongocluster/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mongocluster/armmongocluster) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mongocluster/armmongocluster/v1.1.0/sdk/resourcemanager/mongocluster/armmongocluster/) |\n| Resource Management - Mongodbatlas | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mongodbatlas/armmongodbatlas/v1.0.0/sdk/resourcemanager/mongodbatlas/armmongodbatlas/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mongodbatlas/armmongodbatlas) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mongodbatlas/armmongodbatlas/v1.0.0/sdk/resourcemanager/mongodbatlas/armmongodbatlas/) |\n| Resource Management - Monitor | module [0.11.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/monitor/armmonitor/v0.11.0/sdk/resourcemanager/monitor/armmonitor/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor) | GitHub [0.11.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/monitor/armmonitor/v0.11.0/sdk/resourcemanager/monitor/armmonitor/) |\n| Resource Management - MySQL | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysql/v1.2.0/sdk/resourcemanager/mysql/armmysql/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mysql/armmysql) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysql/v1.2.0/sdk/resourcemanager/mysql/armmysql/) |\n| Resource Management - MySQL Flexible Server | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysqlflexibleservers/v1.2.0/sdk/resourcemanager/mysql/armmysqlflexibleservers/)<br>module [2.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysqlflexibleservers/v2.0.0-beta.4/sdk/resourcemanager/mysql/armmysqlflexibleservers/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mysql/armmysqlflexibleservers) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysqlflexibleservers/v1.2.0/sdk/resourcemanager/mysql/armmysqlflexibleservers/)<br>GitHub [2.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysqlflexibleservers/v2.0.0-beta.4/sdk/resourcemanager/mysql/armmysqlflexibleservers/) |\n| Resource Management - Net App | module [10.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/netapp/armnetapp/v10.0.0/sdk/resourcemanager/netapp/armnetapp/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/netapp/armnetapp) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/netapp/armnetapp/v10.0.0/sdk/resourcemanager/netapp/armnetapp/) |\n| Resource Management - Network | module [9.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/network/armnetwork/v9.0.0/sdk/resourcemanager/network/armnetwork/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/network/armnetwork/v9.0.0/sdk/resourcemanager/network/armnetwork/) |\n| Resource Management - Network Cloud | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkcloud/armnetworkcloud/v1.4.0/sdk/resourcemanager/networkcloud/armnetworkcloud/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/networkcloud/armnetworkcloud) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkcloud/armnetworkcloud/v1.4.0/sdk/resourcemanager/networkcloud/armnetworkcloud/) |\n| Resource Management - Network Function | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkfunction/armnetworkfunction/v2.2.0/sdk/resourcemanager/networkfunction/armnetworkfunction/)<br>module [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkfunction/armnetworkfunction/v3.0.0-beta.1/sdk/resourcemanager/networkfunction/armnetworkfunction/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/networkfunction/armnetworkfunction) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkfunction/armnetworkfunction/v2.2.0/sdk/resourcemanager/networkfunction/armnetworkfunction/)<br>GitHub [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkfunction/armnetworkfunction/v3.0.0-beta.1/sdk/resourcemanager/networkfunction/armnetworkfunction/) |\n| Resource Management - New Relic Observability | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/newrelic/armnewrelicobservability/v1.2.0/sdk/resourcemanager/newrelic/armnewrelicobservability/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/newrelic/armnewrelicobservability/v2.0.0-beta.1/sdk/resourcemanager/newrelic/armnewrelicobservability/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/newrelic/armnewrelicobservability) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/newrelic/armnewrelicobservability/v1.2.0/sdk/resourcemanager/newrelic/armnewrelicobservability/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/newrelic/armnewrelicobservability/v2.0.0-beta.1/sdk/resourcemanager/newrelic/armnewrelicobservability/) |\n| Resource Management - Nginx | module [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/nginx/armnginx/v4.0.0/sdk/resourcemanager/nginx/armnginx/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/nginx/armnginx) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/nginx/armnginx/v4.0.0/sdk/resourcemanager/nginx/armnginx/) |\n| Resource Management - Notification Hubs | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/notificationhubs/armnotificationhubs/v1.2.0/sdk/resourcemanager/notificationhubs/armnotificationhubs/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/notificationhubs/armnotificationhubs/v2.0.0-beta.1/sdk/resourcemanager/notificationhubs/armnotificationhubs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/notificationhubs/armnotificationhubs) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/notificationhubs/armnotificationhubs/v1.2.0/sdk/resourcemanager/notificationhubs/armnotificationhubs/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/notificationhubs/armnotificationhubs/v2.0.0-beta.1/sdk/resourcemanager/notificationhubs/armnotificationhubs/) |\n| Resource Management - Oep | module [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/oep/armoep/v0.6.0/sdk/resourcemanager/oep/armoep/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/oep/armoep) | GitHub [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/oep/armoep/v0.6.0/sdk/resourcemanager/oep/armoep/) |\n| Resource Management - Operations Management | module [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/operationsmanagement/armoperationsmanagement/v0.8.0/sdk/resourcemanager/operationsmanagement/armoperationsmanagement/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/operationsmanagement/armoperationsmanagement) | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/operationsmanagement/armoperationsmanagement/v0.8.0/sdk/resourcemanager/operationsmanagement/armoperationsmanagement/) |\n| Resource Management - Oracle Database | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/oracledatabase/armoracledatabase/v2.0.0/sdk/resourcemanager/oracledatabase/armoracledatabase/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/oracledatabase/armoracledatabase) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/oracledatabase/armoracledatabase/v2.0.0/sdk/resourcemanager/oracledatabase/armoracledatabase/) |\n| Resource Management - Orbital | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/orbital/armorbital/v2.1.0/sdk/resourcemanager/orbital/armorbital/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/orbital/armorbital) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/orbital/armorbital/v2.1.0/sdk/resourcemanager/orbital/armorbital/) |\n| Resource Management - Palo Alto Networks - Next Generation Firewall | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/v2.0.0/sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/paloaltonetworksngfw/armpanngfw) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/v2.0.0/sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/) |\n| Resource Management - Peering | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/peering/armpeering/v1.2.0/sdk/resourcemanager/peering/armpeering/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/peering/armpeering) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/peering/armpeering/v1.2.0/sdk/resourcemanager/peering/armpeering/) |\n| Resource Management - Pinecone Vector DB | module [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/pineconevectordb/armpineconevectordb/v0.1.1/sdk/resourcemanager/pineconevectordb/armpineconevectordb/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/pineconevectordb/armpineconevectordb) | GitHub [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/pineconevectordb/armpineconevectordb/v0.1.1/sdk/resourcemanager/pineconevectordb/armpineconevectordb/) |\n| Resource Management - Planetarycomputer | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/planetarycomputer/armplanetarycomputer/v1.0.0/sdk/resourcemanager/planetarycomputer/armplanetarycomputer/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/planetarycomputer/armplanetarycomputer) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/planetarycomputer/armplanetarycomputer/v1.0.0/sdk/resourcemanager/planetarycomputer/armplanetarycomputer/) |\n| Resource Management - Playwright | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/playwright/armplaywright/v1.0.0/sdk/resourcemanager/playwright/armplaywright/)<br>module [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/playwright/armplaywright/v1.1.0-beta.1/sdk/resourcemanager/playwright/armplaywright/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/playwright/armplaywright) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/playwright/armplaywright/v1.0.0/sdk/resourcemanager/playwright/armplaywright/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/playwright/armplaywright/v1.1.0-beta.1/sdk/resourcemanager/playwright/armplaywright/) |\n| Resource Management - Policy | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armpolicy/v1.0.0/sdk/resourcemanager/resources/armpolicy/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armpolicy) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armpolicy/v1.0.0/sdk/resourcemanager/resources/armpolicy/) |\n| Resource Management - Policy Insights | module [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/policyinsights/armpolicyinsights/v0.9.0/sdk/resourcemanager/policyinsights/armpolicyinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/policyinsights/armpolicyinsights) | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/policyinsights/armpolicyinsights/v0.9.0/sdk/resourcemanager/policyinsights/armpolicyinsights/) |\n| Resource Management - Portal | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/portal/armportal/v0.7.0/sdk/resourcemanager/portal/armportal/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/portal/armportal) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/portal/armportal/v0.7.0/sdk/resourcemanager/portal/armportal/) |\n| Resource Management - Portalservicescopilot | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/portalservicescopilot/armportalservicescopilot/v0.1.0/sdk/resourcemanager/portalservicescopilot/armportalservicescopilot/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/portalservicescopilot/armportalservicescopilot) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/portalservicescopilot/armportalservicescopilot/v0.1.0/sdk/resourcemanager/portalservicescopilot/armportalservicescopilot/) |\n| Resource Management - PostgreSQL | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresql/v1.2.0/sdk/resourcemanager/postgresql/armpostgresql/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/postgresql/armpostgresql) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresql/v1.2.0/sdk/resourcemanager/postgresql/armpostgresql/) |\n| Resource Management - PostgreSQL Flexible Server | module [5.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/v5.0.0/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/)<br>module [6.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/v6.0.0-beta.2/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/v5.0.0/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/)<br>GitHub [6.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/v6.0.0-beta.2/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/) |\n| Resource Management - PostgreSQL HSC | module [0.6.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresqlhsc/armpostgresqlhsc/v0.6.1/sdk/resourcemanager/postgresqlhsc/armpostgresqlhsc/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/postgresqlhsc/armpostgresqlhsc) | GitHub [0.6.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresqlhsc/armpostgresqlhsc/v0.6.1/sdk/resourcemanager/postgresqlhsc/armpostgresqlhsc/) |\n| Resource Management - Power BI  Private Links | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbiprivatelinks/armpowerbiprivatelinks/v2.1.0/sdk/resourcemanager/powerbiprivatelinks/armpowerbiprivatelinks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/powerbiprivatelinks/armpowerbiprivatelinks) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbiprivatelinks/armpowerbiprivatelinks/v2.1.0/sdk/resourcemanager/powerbiprivatelinks/armpowerbiprivatelinks/) |\n| Resource Management - Power BI Dedicated | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbidedicated/armpowerbidedicated/v1.2.0/sdk/resourcemanager/powerbidedicated/armpowerbidedicated/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/powerbidedicated/armpowerbidedicated) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbidedicated/armpowerbidedicated/v1.2.0/sdk/resourcemanager/powerbidedicated/armpowerbidedicated/) |\n| Resource Management - Power BI Embedded | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbiembedded/armpowerbiembedded/v1.2.0/sdk/resourcemanager/powerbiembedded/armpowerbiembedded/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/powerbiembedded/armpowerbiembedded) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbiembedded/armpowerbiembedded/v1.2.0/sdk/resourcemanager/powerbiembedded/armpowerbiembedded/) |\n| Resource Management - Power Platform | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerplatform/armpowerplatform/v0.3.0/sdk/resourcemanager/powerplatform/armpowerplatform/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/powerplatform/armpowerplatform) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerplatform/armpowerplatform/v0.3.0/sdk/resourcemanager/powerplatform/armpowerplatform/) |\n| Resource Management - Previewalertrule | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/previewalertrule/armpreviewalertrule/v0.1.0/sdk/resourcemanager/previewalertrule/armpreviewalertrule/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/previewalertrule/armpreviewalertrule) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/previewalertrule/armpreviewalertrule/v0.1.0/sdk/resourcemanager/previewalertrule/armpreviewalertrule/) |\n| Resource Management - Private DNS | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/privatedns/armprivatedns/v1.3.0/sdk/resourcemanager/privatedns/armprivatedns/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/privatedns/armprivatedns/v1.3.0/sdk/resourcemanager/privatedns/armprivatedns/) |\n| Resource Management - Privatelinkscopes | module [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armprivatelinkscopes/v0.2.0/sdk/resourcemanager/kubernetesconfiguration/armprivatelinkscopes/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kubernetesconfiguration/armprivatelinkscopes) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armprivatelinkscopes/v0.2.0/sdk/resourcemanager/kubernetesconfiguration/armprivatelinkscopes/) |\n| Resource Management - Prometheusrulegroups | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/prometheusrulegroups/armprometheusrulegroups/v0.1.0/sdk/resourcemanager/prometheusrulegroups/armprometheusrulegroups/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/prometheusrulegroups/armprometheusrulegroups) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/prometheusrulegroups/armprometheusrulegroups/v0.1.0/sdk/resourcemanager/prometheusrulegroups/armprometheusrulegroups/) |\n| Resource Management - Provider Hub | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/providerhub/armproviderhub/v2.0.0/sdk/resourcemanager/providerhub/armproviderhub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/providerhub/armproviderhub) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/providerhub/armproviderhub/v2.0.0/sdk/resourcemanager/providerhub/armproviderhub/) |\n| Resource Management - Purestorageblock | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purestorageblock/armpurestorageblock/v1.0.0/sdk/resourcemanager/purestorageblock/armpurestorageblock/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/purestorageblock/armpurestorageblock) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purestorageblock/armpurestorageblock/v1.0.0/sdk/resourcemanager/purestorageblock/armpurestorageblock/) |\n| Resource Management - Purview | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purview/armpurview/v1.2.0/sdk/resourcemanager/purview/armpurview/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purview/armpurview/v2.0.0-beta.1/sdk/resourcemanager/purview/armpurview/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/purview/armpurview) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purview/armpurview/v1.2.0/sdk/resourcemanager/purview/armpurview/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purview/armpurview/v2.0.0-beta.1/sdk/resourcemanager/purview/armpurview/) |\n| Resource Management - Quantum | module [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/quantum/armquantum/v0.8.0/sdk/resourcemanager/quantum/armquantum/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/quantum/armquantum) | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/quantum/armquantum/v0.8.0/sdk/resourcemanager/quantum/armquantum/) |\n| Resource Management - Qumulo | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/liftrqumulo/armqumulo/v2.0.0/sdk/resourcemanager/liftrqumulo/armqumulo/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/liftrqumulo/armqumulo) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/liftrqumulo/armqumulo/v2.0.0/sdk/resourcemanager/liftrqumulo/armqumulo/) |\n| Resource Management - Quota | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/quota/armquota/v2.0.0/sdk/resourcemanager/quota/armquota/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/quota/armquota) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/quota/armquota/v2.0.0/sdk/resourcemanager/quota/armquota/) |\n| Resource Management - Recommender | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/compute/armrecommender/v0.1.0/sdk/resourcemanager/compute/armrecommender/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armrecommender) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/compute/armrecommender/v0.1.0/sdk/resourcemanager/compute/armrecommender/) |\n| Resource Management - Recovery Services | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservices/v2.1.0/sdk/resourcemanager/recoveryservices/armrecoveryservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservices) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservices/v2.1.0/sdk/resourcemanager/recoveryservices/armrecoveryservices/) |\n| Resource Management - Recovery Services Backup | module [4.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v4.2.0/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/)<br>module [5.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v5.0.0-beta.1/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v4.2.0/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/)<br>GitHub [5.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v5.0.0-beta.1/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/) |\n| Resource Management - Recovery Services Data Replication | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservicesdatareplication/armrecoveryservicesdatareplication/v1.0.0/sdk/resourcemanager/recoveryservicesdatareplication/armrecoveryservicesdatareplication/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservicesdatareplication/armrecoveryservicesdatareplication) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservicesdatareplication/armrecoveryservicesdatareplication/v1.0.0/sdk/resourcemanager/recoveryservicesdatareplication/armrecoveryservicesdatareplication/) |\n| Resource Management - Recovery Services Site Recovery | module [2.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/v2.4.0/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/)<br>module [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/v3.0.0-beta.1/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/v2.4.0/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/)<br>GitHub [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/v3.0.0-beta.1/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/) |\n| Resource Management - Red Hat OpenShift | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redhatopenshift/armredhatopenshift/v2.0.0/sdk/resourcemanager/redhatopenshift/armredhatopenshift/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redhatopenshift/armredhatopenshift) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redhatopenshift/armredhatopenshift/v2.0.0/sdk/resourcemanager/redhatopenshift/armredhatopenshift/) |\n| Resource Management - Redis | module [3.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redis/armredis/v3.3.0/sdk/resourcemanager/redis/armredis/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis) | GitHub [3.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redis/armredis/v3.3.0/sdk/resourcemanager/redis/armredis/) |\n| Resource Management - Redis Enterprise | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redisenterprise/armredisenterprise/v3.0.0/sdk/resourcemanager/redisenterprise/armredisenterprise/)<br>module [4.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redisenterprise/armredisenterprise/v4.0.0-beta.1/sdk/resourcemanager/redisenterprise/armredisenterprise/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redisenterprise/armredisenterprise/v3.0.0/sdk/resourcemanager/redisenterprise/armredisenterprise/)<br>GitHub [4.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redisenterprise/armredisenterprise/v4.0.0-beta.1/sdk/resourcemanager/redisenterprise/armredisenterprise/) |\n| Resource Management - Relationships | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/relationships/armrelationships/v0.1.0/sdk/resourcemanager/relationships/armrelationships/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/relationships/armrelationships) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/relationships/armrelationships/v0.1.0/sdk/resourcemanager/relationships/armrelationships/) |\n| Resource Management - Relay | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/relay/armrelay/v1.2.0/sdk/resourcemanager/relay/armrelay/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/relay/armrelay) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/relay/armrelay/v1.2.0/sdk/resourcemanager/relay/armrelay/) |\n| Resource Management - Reservations | module [3.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/reservations/armreservations/v3.1.0/sdk/resourcemanager/reservations/armreservations/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/reservations/armreservations) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/reservations/armreservations/v3.1.0/sdk/resourcemanager/reservations/armreservations/) |\n| Resource Management - Resource Connector | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourceconnector/armresourceconnector/v1.1.0/sdk/resourcemanager/resourceconnector/armresourceconnector/)<br>module [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourceconnector/armresourceconnector/v1.2.0-beta.1/sdk/resourcemanager/resourceconnector/armresourceconnector/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourceconnector/armresourceconnector) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourceconnector/armresourceconnector/v1.1.0/sdk/resourcemanager/resourceconnector/armresourceconnector/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourceconnector/armresourceconnector/v1.2.0-beta.1/sdk/resourcemanager/resourceconnector/armresourceconnector/) |\n| Resource Management - Resource Graph | module [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcegraph/armresourcegraph/v0.9.0/sdk/resourcemanager/resourcegraph/armresourcegraph/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph) | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcegraph/armresourcegraph/v0.9.0/sdk/resourcemanager/resourcegraph/armresourcegraph/) |\n| Resource Management - Resource Health | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcehealth/armresourcehealth/v1.3.0/sdk/resourcemanager/resourcehealth/armresourcehealth/)<br>module [1.4.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcehealth/armresourcehealth/v1.4.0-beta.2/sdk/resourcemanager/resourcehealth/armresourcehealth/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcehealth/armresourcehealth) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcehealth/armresourcehealth/v1.3.0/sdk/resourcemanager/resourcehealth/armresourcehealth/)<br>GitHub [1.4.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcehealth/armresourcehealth/v1.4.0-beta.2/sdk/resourcemanager/resourcehealth/armresourcehealth/) |\n| Resource Management - Resource Mover | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcemover/armresourcemover/v1.3.0/sdk/resourcemanager/resourcemover/armresourcemover/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcemover/armresourcemover) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcemover/armresourcemover/v1.3.0/sdk/resourcemanager/resourcemover/armresourcemover/) |\n| Resource Management - Resources | module [3.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armresources/v3.0.1/sdk/resourcemanager/resources/armresources/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armresources/v3.0.1/sdk/resourcemanager/resources/armresources/) |\n| Resource Management - Saas | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/saas/armsaas/v0.7.0/sdk/resourcemanager/saas/armsaas/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/saas/armsaas) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/saas/armsaas/v0.7.0/sdk/resourcemanager/saas/armsaas/) |\n| Resource Management - Scheduler | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/scheduler/armscheduler/v1.2.0/sdk/resourcemanager/scheduler/armscheduler/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/scheduler/armscheduler) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/scheduler/armscheduler/v1.2.0/sdk/resourcemanager/scheduler/armscheduler/) |\n| Resource Management - Scvmm | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/scvmm/armscvmm/v1.0.0/sdk/resourcemanager/scvmm/armscvmm/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/scvmm/armscvmm) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/scvmm/armscvmm/v1.0.0/sdk/resourcemanager/scvmm/armscvmm/) |\n| Resource Management - Security | module [0.14.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/security/armsecurity/v0.14.0/sdk/resourcemanager/security/armsecurity/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/security/armsecurity) | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/security/armsecurity/v0.14.0/sdk/resourcemanager/security/armsecurity/) |\n| Resource Management - Security DevOps | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securitydevops/armsecuritydevops/v0.3.0/sdk/resourcemanager/securitydevops/armsecuritydevops/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/securitydevops/armsecuritydevops) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securitydevops/armsecuritydevops/v0.3.0/sdk/resourcemanager/securitydevops/armsecuritydevops/) |\n| Resource Management - Security Insights | module [0.2.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsight/armsecurityinsight/v0.2.1/sdk/resourcemanager/securityinsight/armsecurityinsight/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/securityinsight/armsecurityinsight) | GitHub [0.2.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsight/armsecurityinsight/v0.2.1/sdk/resourcemanager/securityinsight/armsecurityinsight/) |\n| Resource Management - Security Insights | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsights/armsecurityinsights/v1.2.0/sdk/resourcemanager/securityinsights/armsecurityinsights/)<br>module [2.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsights/armsecurityinsights/v2.0.0-beta.4/sdk/resourcemanager/securityinsights/armsecurityinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/securityinsights/armsecurityinsights) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsights/armsecurityinsights/v1.2.0/sdk/resourcemanager/securityinsights/armsecurityinsights/)<br>GitHub [2.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsights/armsecurityinsights/v2.0.0-beta.4/sdk/resourcemanager/securityinsights/armsecurityinsights/) |\n| Resource Management - Self Help | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/selfhelp/armselfhelp/v1.1.0/sdk/resourcemanager/selfhelp/armselfhelp/)<br>module [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/selfhelp/armselfhelp/v2.0.0-beta.5/sdk/resourcemanager/selfhelp/armselfhelp/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/selfhelp/armselfhelp) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/selfhelp/armselfhelp/v1.1.0/sdk/resourcemanager/selfhelp/armselfhelp/)<br>GitHub [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/selfhelp/armselfhelp/v2.0.0-beta.5/sdk/resourcemanager/selfhelp/armselfhelp/) |\n| Resource Management - Serial Console | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/serialconsole/armserialconsole/v1.2.0/sdk/resourcemanager/serialconsole/armserialconsole/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/serialconsole/armserialconsole/v2.0.0-beta.1/sdk/resourcemanager/serialconsole/armserialconsole/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/serialconsole/armserialconsole) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/serialconsole/armserialconsole/v1.2.0/sdk/resourcemanager/serialconsole/armserialconsole/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/serialconsole/armserialconsole/v2.0.0-beta.1/sdk/resourcemanager/serialconsole/armserialconsole/) |\n| Resource Management - Service Bus | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicebus/armservicebus/v1.2.0/sdk/resourcemanager/servicebus/armservicebus/)<br>module [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicebus/armservicebus/v2.0.0-beta.3/sdk/resourcemanager/servicebus/armservicebus/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicebus/armservicebus) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicebus/armservicebus/v1.2.0/sdk/resourcemanager/servicebus/armservicebus/)<br>GitHub [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicebus/armservicebus/v2.0.0-beta.3/sdk/resourcemanager/servicebus/armservicebus/) |\n| Resource Management - Service Fabric | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabric/armservicefabric/v2.0.0/sdk/resourcemanager/servicefabric/armservicefabric/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicefabric/armservicefabric) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabric/armservicefabric/v2.0.0/sdk/resourcemanager/servicefabric/armservicefabric/) |\n| Resource Management - Service Fabric Managed Clusters | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabricmanagedclusters/armservicefabricmanagedclusters/v1.0.0/sdk/resourcemanager/servicefabricmanagedclusters/armservicefabricmanagedclusters/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicefabricmanagedclusters/armservicefabricmanagedclusters) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabricmanagedclusters/armservicefabricmanagedclusters/v1.0.0/sdk/resourcemanager/servicefabricmanagedclusters/armservicefabricmanagedclusters/) |\n| Resource Management - Service Fabric Mesh | module [0.6.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabricmesh/armservicefabricmesh/v0.6.2/sdk/resourcemanager/servicefabricmesh/armservicefabricmesh/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicefabricmesh/armservicefabricmesh) | GitHub [0.6.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabricmesh/armservicefabricmesh/v0.6.2/sdk/resourcemanager/servicefabricmesh/armservicefabricmesh/) |\n| Resource Management - Service Linker | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicelinker/armservicelinker/v1.2.0/sdk/resourcemanager/servicelinker/armservicelinker/)<br>module [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicelinker/armservicelinker/v2.0.0-beta.2/sdk/resourcemanager/servicelinker/armservicelinker/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicelinker/armservicelinker) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicelinker/armservicelinker/v1.2.0/sdk/resourcemanager/servicelinker/armservicelinker/)<br>GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicelinker/armservicelinker/v2.0.0-beta.2/sdk/resourcemanager/servicelinker/armservicelinker/) |\n| Resource Management - Servicegroups | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicegroups/armservicegroups/v0.1.0/sdk/resourcemanager/servicegroups/armservicegroups/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicegroups/armservicegroups) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicegroups/armservicegroups/v0.1.0/sdk/resourcemanager/servicegroups/armservicegroups/) |\n| Resource Management - Servicenetworking | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicenetworking/armservicenetworking/v1.1.0/sdk/resourcemanager/servicenetworking/armservicenetworking/)<br>module [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicenetworking/armservicenetworking/v1.2.0-beta.1/sdk/resourcemanager/servicenetworking/armservicenetworking/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicenetworking/armservicenetworking) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicenetworking/armservicenetworking/v1.1.0/sdk/resourcemanager/servicenetworking/armservicenetworking/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicenetworking/armservicenetworking/v1.2.0-beta.1/sdk/resourcemanager/servicenetworking/armservicenetworking/) |\n| Resource Management - Signalr | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/signalr/armsignalr/v1.2.0/sdk/resourcemanager/signalr/armsignalr/)<br>module [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/signalr/armsignalr/v1.3.0-beta.1/sdk/resourcemanager/signalr/armsignalr/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/signalr/armsignalr) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/signalr/armsignalr/v1.2.0/sdk/resourcemanager/signalr/armsignalr/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/signalr/armsignalr/v1.3.0-beta.1/sdk/resourcemanager/signalr/armsignalr/) |\n| Resource Management - Sitemanager | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sitemanager/armsitemanager/v1.0.0/sdk/resourcemanager/sitemanager/armsitemanager/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sitemanager/armsitemanager) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sitemanager/armsitemanager/v1.0.0/sdk/resourcemanager/sitemanager/armsitemanager/) |\n| Resource Management - Slis | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/monitor/armslis/v0.1.0/sdk/resourcemanager/monitor/armslis/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armslis) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/monitor/armslis/v0.1.0/sdk/resourcemanager/monitor/armslis/) |\n| Resource Management - Sphere | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sphere/armsphere/v1.0.0/sdk/resourcemanager/sphere/armsphere/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sphere/armsphere) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sphere/armsphere/v1.0.0/sdk/resourcemanager/sphere/armsphere/) |\n| Resource Management - Spring App Discovery | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/springappdiscovery/armspringappdiscovery/v0.1.0/sdk/resourcemanager/springappdiscovery/armspringappdiscovery/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/springappdiscovery/armspringappdiscovery) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/springappdiscovery/armspringappdiscovery/v0.1.0/sdk/resourcemanager/springappdiscovery/armspringappdiscovery/) |\n| Resource Management - SQL | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sql/armsql/v1.2.0/sdk/resourcemanager/sql/armsql/)<br>module [2.0.0-beta.7](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sql/armsql/v2.0.0-beta.7/sdk/resourcemanager/sql/armsql/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sql/armsql/v1.2.0/sdk/resourcemanager/sql/armsql/)<br>GitHub [2.0.0-beta.7](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sql/armsql/v2.0.0-beta.7/sdk/resourcemanager/sql/armsql/) |\n| Resource Management - SQL Virtual Machine | module [0.10.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sqlvirtualmachine/armsqlvirtualmachine/v0.10.0/sdk/resourcemanager/sqlvirtualmachine/armsqlvirtualmachine/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sqlvirtualmachine/armsqlvirtualmachine) | GitHub [0.10.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sqlvirtualmachine/armsqlvirtualmachine/v0.10.0/sdk/resourcemanager/sqlvirtualmachine/armsqlvirtualmachine/) |\n| Resource Management - Standby Pool | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/standbypool/armstandbypool/v2.0.0/sdk/resourcemanager/standbypool/armstandbypool/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/standbypool/armstandbypool) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/standbypool/armstandbypool/v2.0.0/sdk/resourcemanager/standbypool/armstandbypool/) |\n| Resource Management - Storage | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storage/armstorage/v3.0.0/sdk/resourcemanager/storage/armstorage/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storage/armstorage/v3.0.0/sdk/resourcemanager/storage/armstorage/) |\n| Resource Management - Storage Actions | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storageactions/armstorageactions/v1.0.0/sdk/resourcemanager/storageactions/armstorageactions/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storageactions/armstorageactions) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storageactions/armstorageactions/v1.0.0/sdk/resourcemanager/storageactions/armstorageactions/) |\n| Resource Management - Storage Cache | module [4.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagecache/armstoragecache/v4.2.0/sdk/resourcemanager/storagecache/armstoragecache/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storagecache/armstoragecache) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagecache/armstoragecache/v4.2.0/sdk/resourcemanager/storagecache/armstoragecache/) |\n| Resource Management - Storage Mover | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagemover/armstoragemover/v2.3.0/sdk/resourcemanager/storagemover/armstoragemover/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storagemover/armstoragemover) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagemover/armstoragemover/v2.3.0/sdk/resourcemanager/storagemover/armstoragemover/) |\n| Resource Management - Storage Pool | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagepool/armstoragepool/v1.2.0/sdk/resourcemanager/storagepool/armstoragepool/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storagepool/armstoragepool) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagepool/armstoragepool/v1.2.0/sdk/resourcemanager/storagepool/armstoragepool/) |\n| Resource Management - Storage Sync | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagesync/armstoragesync/v1.2.0/sdk/resourcemanager/storagesync/armstoragesync/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storagesync/armstoragesync) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagesync/armstoragesync/v1.2.0/sdk/resourcemanager/storagesync/armstoragesync/) |\n| Resource Management - Storagediscovery | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagediscovery/armstoragediscovery/v1.0.0/sdk/resourcemanager/storagediscovery/armstoragediscovery/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storagediscovery/armstoragediscovery) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagediscovery/armstoragediscovery/v1.0.0/sdk/resourcemanager/storagediscovery/armstoragediscovery/) |\n| Resource Management - Stream Analytics | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/streamanalytics/armstreamanalytics/v1.2.0/sdk/resourcemanager/streamanalytics/armstreamanalytics/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/streamanalytics/armstreamanalytics/v2.0.0-beta.1/sdk/resourcemanager/streamanalytics/armstreamanalytics/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/streamanalytics/armstreamanalytics) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/streamanalytics/armstreamanalytics/v1.2.0/sdk/resourcemanager/streamanalytics/armstreamanalytics/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/streamanalytics/armstreamanalytics/v2.0.0-beta.1/sdk/resourcemanager/streamanalytics/armstreamanalytics/) |\n| Resource Management - Subscriptions | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armsubscriptions/v1.3.0/sdk/resourcemanager/resources/armsubscriptions/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armsubscriptions) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armsubscriptions/v1.3.0/sdk/resourcemanager/resources/armsubscriptions/) |\n| Resource Management - Subscriptions | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/subscription/armsubscription/v1.2.0/sdk/resourcemanager/subscription/armsubscription/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/subscription/armsubscription/v2.0.0-beta.1/sdk/resourcemanager/subscription/armsubscription/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/subscription/armsubscription/v1.2.0/sdk/resourcemanager/subscription/armsubscription/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/subscription/armsubscription/v2.0.0-beta.1/sdk/resourcemanager/subscription/armsubscription/) |\n| Resource Management - Support | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/support/armsupport/v1.3.0/sdk/resourcemanager/support/armsupport/)<br>module [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/support/armsupport/v2.0.0-beta.3/sdk/resourcemanager/support/armsupport/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/support/armsupport) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/support/armsupport/v1.3.0/sdk/resourcemanager/support/armsupport/)<br>GitHub [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/support/armsupport/v2.0.0-beta.3/sdk/resourcemanager/support/armsupport/) |\n| Resource Management - Synapse Analytics | module [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/synapse/armsynapse/v0.8.0/sdk/resourcemanager/synapse/armsynapse/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/synapse/armsynapse) | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/synapse/armsynapse/v0.8.0/sdk/resourcemanager/synapse/armsynapse/) |\n| Resource Management - Template Specs | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armtemplatespecs/v1.2.0/sdk/resourcemanager/resources/armtemplatespecs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armtemplatespecs) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armtemplatespecs/v1.2.0/sdk/resourcemanager/resources/armtemplatespecs/) |\n| Resource Management - Tenantactivitylogalerts | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/tenantactivitylogalerts/armtenantactivitylogalerts/v0.1.0/sdk/resourcemanager/tenantactivitylogalerts/armtenantactivitylogalerts/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/tenantactivitylogalerts/armtenantactivitylogalerts) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/tenantactivitylogalerts/armtenantactivitylogalerts/v0.1.0/sdk/resourcemanager/tenantactivitylogalerts/armtenantactivitylogalerts/) |\n| Resource Management - Terraform | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/terraform/armterraform/v0.1.0/sdk/resourcemanager/terraform/armterraform/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/terraform/armterraform) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/terraform/armterraform/v0.1.0/sdk/resourcemanager/terraform/armterraform/) |\n| Resource Management - Time Series Insights | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/timeseriesinsights/armtimeseriesinsights/v1.2.0/sdk/resourcemanager/timeseriesinsights/armtimeseriesinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/timeseriesinsights/armtimeseriesinsights) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/timeseriesinsights/armtimeseriesinsights/v1.2.0/sdk/resourcemanager/timeseriesinsights/armtimeseriesinsights/) |\n| Resource Management - Traffic Manager | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/trafficmanager/armtrafficmanager/v1.3.0/sdk/resourcemanager/trafficmanager/armtrafficmanager/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/trafficmanager/armtrafficmanager) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/trafficmanager/armtrafficmanager/v1.3.0/sdk/resourcemanager/trafficmanager/armtrafficmanager/) |\n| Resource Management - Trusted Signing | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/trustedsigning/armtrustedsigning/v0.1.0/sdk/resourcemanager/trustedsigning/armtrustedsigning/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/trustedsigning/armtrustedsigning) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/trustedsigning/armtrustedsigning/v0.1.0/sdk/resourcemanager/trustedsigning/armtrustedsigning/) |\n| Resource Management - Virtual Machine Image Builder | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/virtualmachineimagebuilder/armvirtualmachineimagebuilder/v2.3.0/sdk/resourcemanager/virtualmachineimagebuilder/armvirtualmachineimagebuilder/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/virtualmachineimagebuilder/armvirtualmachineimagebuilder) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/virtualmachineimagebuilder/armvirtualmachineimagebuilder/v2.3.0/sdk/resourcemanager/virtualmachineimagebuilder/armvirtualmachineimagebuilder/) |\n| Resource Management - Visual Studio | module [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/visualstudio/armvisualstudio/v0.6.0/sdk/resourcemanager/visualstudio/armvisualstudio/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/visualstudio/armvisualstudio) | GitHub [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/visualstudio/armvisualstudio/v0.6.0/sdk/resourcemanager/visualstudio/armvisualstudio/) |\n| Resource Management - VMWare Cloud Simple | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/vmwarecloudsimple/armvmwarecloudsimple/v1.2.0/sdk/resourcemanager/vmwarecloudsimple/armvmwarecloudsimple/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/vmwarecloudsimple/armvmwarecloudsimple) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/vmwarecloudsimple/armvmwarecloudsimple/v1.2.0/sdk/resourcemanager/vmwarecloudsimple/armvmwarecloudsimple/) |\n| Resource Management - Voice Services | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/voiceservices/armvoiceservices/v1.1.0/sdk/resourcemanager/voiceservices/armvoiceservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/voiceservices/armvoiceservices) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/voiceservices/armvoiceservices/v1.1.0/sdk/resourcemanager/voiceservices/armvoiceservices/) |\n| Resource Management - Web | module [0.2.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/web/armweb/v0.2.1/sdk/resourcemanager/web/armweb/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/web/armweb) | GitHub [0.2.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/web/armweb/v0.2.1/sdk/resourcemanager/web/armweb/) |\n| Resource Management - Web PubSub | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/webpubsub/armwebpubsub/v1.3.0/sdk/resourcemanager/webpubsub/armwebpubsub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/webpubsub/armwebpubsub) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/webpubsub/armwebpubsub/v1.3.0/sdk/resourcemanager/webpubsub/armwebpubsub/) |\n| Resource Management - Weights & Biases | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/weightsandbiases/armweightsandbiases/v0.1.0/sdk/resourcemanager/weightsandbiases/armweightsandbiases/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/weightsandbiases/armweightsandbiases) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/weightsandbiases/armweightsandbiases/v0.1.0/sdk/resourcemanager/weightsandbiases/armweightsandbiases/) |\n| Resource Management - Window SESU | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/windowsesu/armwindowsesu/v0.7.0/sdk/resourcemanager/windowsesu/armwindowsesu/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/windowsesu/armwindowsesu) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/windowsesu/armwindowsesu/v0.7.0/sdk/resourcemanager/windowsesu/armwindowsesu/) |\n| Resource Management - Windows IoT | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/windowsiot/armwindowsiot/v1.2.0/sdk/resourcemanager/windowsiot/armwindowsiot/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/windowsiot/armwindowsiot) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/windowsiot/armwindowsiot/v1.2.0/sdk/resourcemanager/windowsiot/armwindowsiot/) |\n| Resource Management - Workload Monitor | module [0.5.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadmonitor/armworkloadmonitor/v0.5.1/sdk/resourcemanager/workloadmonitor/armworkloadmonitor/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/workloadmonitor/armworkloadmonitor) | GitHub [0.5.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadmonitor/armworkloadmonitor/v0.5.1/sdk/resourcemanager/workloadmonitor/armworkloadmonitor/) |\n| Resource Management - Workloadorchestration | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadorchestration/armworkloadorchestration/v0.3.0/sdk/resourcemanager/workloadorchestration/armworkloadorchestration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/workloadorchestration/armworkloadorchestration) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadorchestration/armworkloadorchestration/v0.3.0/sdk/resourcemanager/workloadorchestration/armworkloadorchestration/) |\n| Resource Management - Workloads | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloads/armworkloads/v1.1.0/sdk/resourcemanager/workloads/armworkloads/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/workloads/armworkloads) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloads/armworkloads/v1.1.0/sdk/resourcemanager/workloads/armworkloads/) |\n| Resource Management - Workloads SAP Virtual Instance | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadssapvirtualinstance/armworkloadssapvirtualinstance/v1.0.0/sdk/resourcemanager/workloadssapvirtualinstance/armworkloadssapvirtualinstance/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/workloadssapvirtualinstance/armworkloadssapvirtualinstance) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadssapvirtualinstance/armworkloadssapvirtualinstance/v1.0.0/sdk/resourcemanager/workloadssapvirtualinstance/armworkloadssapvirtualinstance/) |\n| Resource Manager Internal | module [3.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/internal/v3.2.0/sdk/resourcemanager/internal/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal) | GitHub [3.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/internal/v3.2.0/sdk/resourcemanager/internal/) |\n| Application Insights - Query | module [0.4.4](https://github.com/Azure/azure-sdk-for-go/tree/appinsights/v0.4.4/sdk/https://github.com/Microsoft/ApplicationInsights-go//) | [docs](https://azure.microsoft.com/services/monitor/#overview) | GitHub [0.4.4](https://github.com/Microsoft/ApplicationInsights-go/) |\n| Event Hubs | module [3.3.12](https://github.com/Azure/azure-sdk-for-go/tree/azure-event-hubs-go/v3.3.12/sdk/https://github.com/Azure/azure-event-hubs-go//) | [docs](https://azure.microsoft.com/services/event-hubs/#overview) | GitHub [3.3.12](https://github.com/Azure/azure-event-hubs-go/) |\n| Kusto | module [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/kusto/v0.4.0/sdk/https://github.com/Azure/azure-kusto-go//) | [docs](https://azure.microsoft.com/en-us/services/data-explorer/#overview) | GitHub [0.4.0](https://github.com/Azure/azure-kusto-go/) |\n"
  },
  {
    "path": "articles/includes/go-new.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| App Configuration | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azappconfig/v2.2.0/sdk/data/azappconfig/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/data/azappconfig) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azappconfig/v2.2.0/sdk/data/azappconfig/) |\n| Batch | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/batch/azbatch/v0.1.0/sdk/batch/azbatch/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/batch/azbatch) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/batch/azbatch/v0.1.0/sdk/batch/azbatch/) |\n| Container Registry | module [0.2.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/containers/azcontainerregistry/v0.2.3/sdk/containers/azcontainerregistry/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/containers/azcontainerregistry) | GitHub [0.2.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/containers/azcontainerregistry/v0.2.3/sdk/containers/azcontainerregistry/) |\n| Core | module [1.21.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azcore/v1.21.1/sdk/azcore/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azcore) | GitHub [1.21.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azcore/v1.21.1/sdk/azcore/) |\n| Cosmos DB | module [1.4.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azcosmos/v1.4.2/sdk/data/azcosmos/)<br>module [1.5.0-beta.5](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azcosmos/v1.5.0-beta.5/sdk/data/azcosmos/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos) | GitHub [1.4.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azcosmos/v1.4.2/sdk/data/azcosmos/)<br>GitHub [1.5.0-beta.5](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/azcosmos/v1.5.0-beta.5/sdk/data/azcosmos/) |\n| Event Grid | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/azeventgrid/v1.0.0/sdk/messaging/eventgrid/azeventgrid/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/eventgrid/azeventgrid) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/azeventgrid/v1.0.0/sdk/messaging/eventgrid/azeventgrid/) |\n| Event Grid Namespaces | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/aznamespaces/v1.0.0/sdk/messaging/eventgrid/aznamespaces/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/eventgrid/aznamespaces) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/aznamespaces/v1.0.0/sdk/messaging/eventgrid/aznamespaces/) |\n| Event Hubs | module [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azeventhubs/v2.0.2/sdk/messaging/azeventhubs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs) | GitHub [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azeventhubs/v2.0.2/sdk/messaging/azeventhubs/) |\n| Identity | module [1.13.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/v1.13.1/sdk/azidentity/)<br>module [1.14.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/v1.14.0-beta.3/sdk/azidentity/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) | GitHub [1.13.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/v1.13.1/sdk/azidentity/)<br>GitHub [1.14.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/v1.14.0-beta.3/sdk/azidentity/) |\n| Identity - Cache | module [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/cache/v0.4.0/sdk/azidentity/cache/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache) | GitHub [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/azidentity/cache/v0.4.0/sdk/azidentity/cache/) |\n| Ingestion - Logs | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/ingestion/azlogs/v1.1.0/sdk/monitor/ingestion/azlogs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/monitor/ingestion/azlogs) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/ingestion/azlogs/v1.1.0/sdk/monitor/ingestion/azlogs/) |\n| Key Vault  - Keys | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azkeys/v1.4.0/sdk/security/keyvault/azkeys/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azkeys/v1.4.0/sdk/security/keyvault/azkeys/) |\n| Key Vault - Administration | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azadmin/v1.4.0/sdk/security/keyvault/azadmin/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azadmin) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azadmin/v1.4.0/sdk/security/keyvault/azadmin/) |\n| Key Vault - Certificates | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azcertificates/v1.4.0/sdk/security/keyvault/azcertificates/)<br>module [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azcertificates/v1.5.0-beta.1/sdk/security/keyvault/azcertificates/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azcertificates) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azcertificates/v1.4.0/sdk/security/keyvault/azcertificates/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azcertificates/v1.5.0-beta.1/sdk/security/keyvault/azcertificates/) |\n| Key Vault - Secrets | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azsecrets/v1.4.0/sdk/security/keyvault/azsecrets/)<br>module [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azsecrets/v1.5.0-beta.1/sdk/security/keyvault/azsecrets/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azsecrets/v1.4.0/sdk/security/keyvault/azsecrets/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/security/keyvault/azsecrets/v1.5.0-beta.1/sdk/security/keyvault/azsecrets/) |\n| Monitor Ingestion | module [0.1.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/azingest/v0.1.2/sdk/monitor/azingest/) |  | GitHub [0.1.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/azingest/v0.1.2/sdk/monitor/azingest/) |\n| Monitor Query | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/azquery/v1.2.0/sdk/monitor/azquery/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/monitor/azquery) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/azquery/v1.2.0/sdk/monitor/azquery/) |\n| OpenAI | module [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/ai/azopenai/v0.9.0/sdk/ai/azopenai/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/ai/azopenai) | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/ai/azopenai/v0.9.0/sdk/ai/azopenai/) |\n| OpenTelemetry | module [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/tracing/azotel/v0.4.0/sdk/tracing/azotel/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/tracing/azotel) | GitHub [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/tracing/azotel/v0.4.0/sdk/tracing/azotel/) |\n| Query - Logs | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/query/azlogs/v1.2.0/sdk/monitor/query/azlogs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azlogs) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/query/azlogs/v1.2.0/sdk/monitor/query/azlogs/) |\n| Query - Metrics | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/query/azmetrics/v1.3.0/sdk/monitor/query/azmetrics/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/monitor/query/azmetrics) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/monitor/query/azmetrics/v1.3.0/sdk/monitor/query/azmetrics/) |\n| Service Bus | module [1.10.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azservicebus/v1.10.0/sdk/messaging/azservicebus/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus) | GitHub [1.10.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azservicebus/v1.10.0/sdk/messaging/azservicebus/) |\n| Storage - Blobs | module [1.6.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azblob/v1.6.4/sdk/storage/azblob/)<br>module [1.8.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azblob/v1.8.0-beta.1/sdk/storage/azblob/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azblob) | GitHub [1.6.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azblob/v1.6.4/sdk/storage/azblob/)<br>GitHub [1.8.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azblob/v1.8.0-beta.1/sdk/storage/azblob/) |\n| Storage - Files Data Lake | module [1.4.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azdatalake/v1.4.4/sdk/storage/azdatalake/)<br>module [1.6.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azdatalake/v1.6.0-beta.1/sdk/storage/azdatalake/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azdatalake) | GitHub [1.4.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azdatalake/v1.4.4/sdk/storage/azdatalake/)<br>GitHub [1.6.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azdatalake/v1.6.0-beta.1/sdk/storage/azdatalake/) |\n| Storage - Files Share | module [1.5.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azfile/v1.5.4/sdk/storage/azfile/)<br>module [1.7.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azfile/v1.7.0-beta.1/sdk/storage/azfile/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azfile) | GitHub [1.5.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azfile/v1.5.4/sdk/storage/azfile/)<br>GitHub [1.7.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azfile/v1.7.0-beta.1/sdk/storage/azfile/) |\n| Storage - Queues | module [2.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azqueue/v2.0.1/sdk/storage/azqueue/)<br>module [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azqueue/v2.1.0-beta.1/sdk/storage/azqueue/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azqueue/v2.0.1/sdk/storage/azqueue/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/storage/azqueue/v2.1.0-beta.1/sdk/storage/azqueue/) |\n| System Events | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/azsystemevents/v1.0.0/sdk/messaging/eventgrid/azsystemevents/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/eventgrid/azsystemevents) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/eventgrid/azsystemevents/v1.0.0/sdk/messaging/eventgrid/azsystemevents/) |\n| Tables | module [1.4.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/aztables/v1.4.1/sdk/data/aztables/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/data/aztables) | GitHub [1.4.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/data/aztables/v1.4.1/sdk/data/aztables/) |\n| Template | module [0.6.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/template/aztemplate/v0.6.3/sdk/template/aztemplate/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/template/aztemplate) | GitHub [0.6.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/template/aztemplate/v0.6.3/sdk/template/aztemplate/) |\n| Web PubSub | module [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azwebpubsub/v0.1.1/sdk/messaging/azwebpubsub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/messaging/azwebpubsub) | GitHub [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/messaging/azwebpubsub/v0.1.1/sdk/messaging/azwebpubsub/) |\n| Resource Management - Active Directory | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/aad/armaad/v1.2.0/sdk/resourcemanager/aad/armaad/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/aad/armaad) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/aad/armaad/v1.2.0/sdk/resourcemanager/aad/armaad/) |\n| Resource Management - Addons | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/addons/armaddons/v0.3.0/sdk/resourcemanager/addons/armaddons/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/addons/armaddons) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/addons/armaddons/v0.3.0/sdk/resourcemanager/addons/armaddons/) |\n| Resource Management - Advisor | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/advisor/armadvisor/v1.2.0/sdk/resourcemanager/advisor/armadvisor/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/advisor/armadvisor) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/advisor/armadvisor/v1.2.0/sdk/resourcemanager/advisor/armadvisor/) |\n| Resource Management - Agricultureplatform | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/agricultureplatform/armagricultureplatform/v0.1.0/sdk/resourcemanager/agricultureplatform/armagricultureplatform/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/agricultureplatform/armagricultureplatform) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/agricultureplatform/armagricultureplatform/v0.1.0/sdk/resourcemanager/agricultureplatform/armagricultureplatform/) |\n| Resource Management - Agrifood | module [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/agrifood/armagrifood/v0.9.0/sdk/resourcemanager/agrifood/armagrifood/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/agrifood/armagrifood) | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/agrifood/armagrifood/v0.9.0/sdk/resourcemanager/agrifood/armagrifood/) |\n| Resource Management - Alertprocessingrules | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertprocessingrules/armalertprocessingrules/v0.1.0/sdk/resourcemanager/alertprocessingrules/armalertprocessingrules/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/alertprocessingrules/armalertprocessingrules) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertprocessingrules/armalertprocessingrules/v0.1.0/sdk/resourcemanager/alertprocessingrules/armalertprocessingrules/) |\n| Resource Management - Alertrulerecommendations | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertrulerecommendations/armalertrulerecommendations/v0.1.0/sdk/resourcemanager/alertrulerecommendations/armalertrulerecommendations/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/alertrulerecommendations/armalertrulerecommendations) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertrulerecommendations/armalertrulerecommendations/v0.1.0/sdk/resourcemanager/alertrulerecommendations/armalertrulerecommendations/) |\n| Resource Management - Alerts Management | module [0.11.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertsmanagement/armalertsmanagement/v0.11.0/sdk/resourcemanager/alertsmanagement/armalertsmanagement/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/alertsmanagement/armalertsmanagement) | GitHub [0.11.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/alertsmanagement/armalertsmanagement/v0.11.0/sdk/resourcemanager/alertsmanagement/armalertsmanagement/) |\n| Resource Management - Analysis Services | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/analysisservices/armanalysisservices/v1.2.0/sdk/resourcemanager/analysisservices/armanalysisservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/analysisservices/armanalysisservices) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/analysisservices/armanalysisservices/v1.2.0/sdk/resourcemanager/analysisservices/armanalysisservices/) |\n| Resource Management - API Center | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/apicenter/armapicenter/v1.0.0/sdk/resourcemanager/apicenter/armapicenter/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/apicenter/armapicenter) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/apicenter/armapicenter/v1.0.0/sdk/resourcemanager/apicenter/armapicenter/) |\n| Resource Management - API Management | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/apimanagement/armapimanagement/v3.0.0/sdk/resourcemanager/apimanagement/armapimanagement/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/apimanagement/armapimanagement) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/apimanagement/armapimanagement/v3.0.0/sdk/resourcemanager/apimanagement/armapimanagement/) |\n| Resource Management - App Compliance Automation | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appcomplianceautomation/armappcomplianceautomation/v1.0.0/sdk/resourcemanager/appcomplianceautomation/armappcomplianceautomation/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcomplianceautomation/armappcomplianceautomation) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appcomplianceautomation/armappcomplianceautomation/v1.0.0/sdk/resourcemanager/appcomplianceautomation/armappcomplianceautomation/) |\n| Resource Management - App Configuration | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appconfiguration/armappconfiguration/v3.0.0/sdk/resourcemanager/appconfiguration/armappconfiguration/)<br>module [3.1.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appconfiguration/armappconfiguration/v3.1.0-beta.2/sdk/resourcemanager/appconfiguration/armappconfiguration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appconfiguration/armappconfiguration) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appconfiguration/armappconfiguration/v3.0.0/sdk/resourcemanager/appconfiguration/armappconfiguration/)<br>GitHub [3.1.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appconfiguration/armappconfiguration/v3.1.0-beta.2/sdk/resourcemanager/appconfiguration/armappconfiguration/) |\n| Resource Management - App Platform | module [2.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appplatform/armappplatform/v2.0.1/sdk/resourcemanager/appplatform/armappplatform/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appplatform/armappplatform) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appplatform/armappplatform/v2.0.1/sdk/resourcemanager/appplatform/armappplatform/) |\n| Resource Management - App Service | module [6.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appservice/armappservice/v6.0.0/sdk/resourcemanager/appservice/armappservice/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appservice/armappservice) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appservice/armappservice/v6.0.0/sdk/resourcemanager/appservice/armappservice/) |\n| Resource Management - Application Insights | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/applicationinsights/armapplicationinsights/v1.2.0/sdk/resourcemanager/applicationinsights/armapplicationinsights/)<br>module [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/applicationinsights/armapplicationinsights/v2.0.0-beta.3/sdk/resourcemanager/applicationinsights/armapplicationinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/applicationinsights/armapplicationinsights) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/applicationinsights/armapplicationinsights/v1.2.0/sdk/resourcemanager/applicationinsights/armapplicationinsights/)<br>GitHub [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/applicationinsights/armapplicationinsights/v2.0.0-beta.3/sdk/resourcemanager/applicationinsights/armapplicationinsights/) |\n| Resource Management - Appnetwork | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appnetwork/armappnetwork/v0.1.0/sdk/resourcemanager/appnetwork/armappnetwork/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appnetwork/armappnetwork) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appnetwork/armappnetwork/v0.1.0/sdk/resourcemanager/appnetwork/armappnetwork/) |\n| Resource Management - Arc Data | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurearcdata/armazurearcdata/v0.7.0/sdk/resourcemanager/azurearcdata/armazurearcdata/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/azurearcdata/armazurearcdata) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurearcdata/armazurearcdata/v0.7.0/sdk/resourcemanager/azurearcdata/armazurearcdata/) |\n| Resource Management - Arize AI Observability Eval | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/arizeaiobservabilityeval/armarizeaiobservabilityeval/v1.0.0/sdk/resourcemanager/arizeaiobservabilityeval/armarizeaiobservabilityeval/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/arizeaiobservabilityeval/armarizeaiobservabilityeval) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/arizeaiobservabilityeval/armarizeaiobservabilityeval/v1.0.0/sdk/resourcemanager/arizeaiobservabilityeval/armarizeaiobservabilityeval/) |\n| Resource Management - Artifactsigning | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/artifactsigning/armartifactsigning/v0.1.0/sdk/resourcemanager/artifactsigning/armartifactsigning/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/artifactsigning/armartifactsigning) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/artifactsigning/armartifactsigning/v0.1.0/sdk/resourcemanager/artifactsigning/armartifactsigning/) |\n| Resource Management - Astro | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/astro/armastro/v0.1.0/sdk/resourcemanager/astro/armastro/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/astro/armastro) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/astro/armastro/v0.1.0/sdk/resourcemanager/astro/armastro/) |\n| Resource Management - Attestation | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/attestation/armattestation/v1.2.0/sdk/resourcemanager/attestation/armattestation/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/attestation/armattestation/v2.0.0-beta.1/sdk/resourcemanager/attestation/armattestation/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/attestation/armattestation) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/attestation/armattestation/v1.2.0/sdk/resourcemanager/attestation/armattestation/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/attestation/armattestation/v2.0.0-beta.1/sdk/resourcemanager/attestation/armattestation/) |\n| Resource Management - Authorization | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/authorization/armauthorization/v2.2.0/sdk/resourcemanager/authorization/armauthorization/)<br>module [3.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/authorization/armauthorization/v3.0.0-beta.2/sdk/resourcemanager/authorization/armauthorization/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/authorization/armauthorization/v2.2.0/sdk/resourcemanager/authorization/armauthorization/)<br>GitHub [3.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/authorization/armauthorization/v3.0.0-beta.2/sdk/resourcemanager/authorization/armauthorization/) |\n| Resource Management - Automanage | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/automanage/armautomanage/v1.2.0/sdk/resourcemanager/automanage/armautomanage/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/automanage/armautomanage) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/automanage/armautomanage/v1.2.0/sdk/resourcemanager/automanage/armautomanage/) |\n| Resource Management - Automation | module [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/automation/armautomation/v0.9.0/sdk/resourcemanager/automation/armautomation/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/automation/armautomation) | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/automation/armautomation/v0.9.0/sdk/resourcemanager/automation/armautomation/) |\n| Resource Management - Azure Data | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azuredata/armazuredata/v0.7.0/sdk/resourcemanager/azuredata/armazuredata/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/azuredata/armazuredata) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azuredata/armazuredata/v0.7.0/sdk/resourcemanager/azuredata/armazuredata/) |\n| Resource Management - Azure Stack HCI | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhci/v3.0.0/sdk/resourcemanager/azurestackhci/armazurestackhci/)<br>module [3.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhci/v3.1.0-beta.1/sdk/resourcemanager/azurestackhci/armazurestackhci/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/azurestackhci/armazurestackhci) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhci/v3.0.0/sdk/resourcemanager/azurestackhci/armazurestackhci/)<br>GitHub [3.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhci/v3.1.0-beta.1/sdk/resourcemanager/azurestackhci/armazurestackhci/) |\n| Resource Management - Azure VMware Solution | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/avs/armavs/v2.2.0/sdk/resourcemanager/avs/armavs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/avs/armavs) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/avs/armavs/v2.2.0/sdk/resourcemanager/avs/armavs/) |\n| Resource Management - Azurestackhcivm | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhcivm/v0.1.0/sdk/resourcemanager/azurestackhci/armazurestackhcivm/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/azurestackhci/armazurestackhcivm) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/azurestackhci/armazurestackhcivm/v0.1.0/sdk/resourcemanager/azurestackhci/armazurestackhcivm/) |\n| Resource Management - BareMetal Infrastructure | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/v1.2.0/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/v2.0.0-beta.1/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/v1.2.0/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/v2.0.0-beta.1/sdk/resourcemanager/baremetalinfrastructure/armbaremetalinfrastructure/) |\n| Resource Management - Batch | module [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/batch/armbatch/v4.0.0/sdk/resourcemanager/batch/armbatch/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/batch/armbatch) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/batch/armbatch/v4.0.0/sdk/resourcemanager/batch/armbatch/) |\n| Resource Management - Bicep | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armbicep/v0.1.0/sdk/resourcemanager/resources/armbicep/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armbicep) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armbicep/v0.1.0/sdk/resourcemanager/resources/armbicep/) |\n| Resource Management - Billing | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/billing/armbilling/v1.0.0/sdk/resourcemanager/billing/armbilling/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/billing/armbilling) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/billing/armbilling/v1.0.0/sdk/resourcemanager/billing/armbilling/) |\n| Resource Management - Billingbenefits | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/billingbenefits/armbillingbenefits/v2.1.0/sdk/resourcemanager/billingbenefits/armbillingbenefits/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/billingbenefits/armbillingbenefits) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/billingbenefits/armbillingbenefits/v2.1.0/sdk/resourcemanager/billingbenefits/armbillingbenefits/) |\n| Resource Management - Blockchain | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/blockchain/armblockchain/v0.7.0/sdk/resourcemanager/blockchain/armblockchain/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/blockchain/armblockchain) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/blockchain/armblockchain/v0.7.0/sdk/resourcemanager/blockchain/armblockchain/) |\n| Resource Management - Blueprint | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/blueprint/armblueprint/v0.7.0/sdk/resourcemanager/blueprint/armblueprint/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/blueprint/armblueprint) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/blueprint/armblueprint/v0.7.0/sdk/resourcemanager/blueprint/armblueprint/) |\n| Resource Management - Bot Service | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/botservice/armbotservice/v1.2.0/sdk/resourcemanager/botservice/armbotservice/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/botservice/armbotservice) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/botservice/armbotservice/v1.2.0/sdk/resourcemanager/botservice/armbotservice/) |\n| Resource Management - Carbonoptimization | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/carbonoptimization/armcarbonoptimization/v1.0.0/sdk/resourcemanager/carbonoptimization/armcarbonoptimization/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/carbonoptimization/armcarbonoptimization) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/carbonoptimization/armcarbonoptimization/v1.0.0/sdk/resourcemanager/carbonoptimization/armcarbonoptimization/) |\n| Resource Management - Certificateregistration | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/certificateregistration/armcertificateregistration/v0.1.0/sdk/resourcemanager/certificateregistration/armcertificateregistration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/certificateregistration/armcertificateregistration) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/certificateregistration/armcertificateregistration/v0.1.0/sdk/resourcemanager/certificateregistration/armcertificateregistration/) |\n| Resource Management - Change Analysis | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/changeanalysis/armchangeanalysis/v1.2.0/sdk/resourcemanager/changeanalysis/armchangeanalysis/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/changeanalysis/armchangeanalysis) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/changeanalysis/armchangeanalysis/v1.2.0/sdk/resourcemanager/changeanalysis/armchangeanalysis/) |\n| Resource Management - Changes | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armchanges/v1.2.0/sdk/resourcemanager/resources/armchanges/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armchanges) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armchanges/v1.2.0/sdk/resourcemanager/resources/armchanges/) |\n| Resource Management - Chaos | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/chaos/armchaos/v2.0.0/sdk/resourcemanager/chaos/armchaos/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/chaos/armchaos) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/chaos/armchaos/v2.0.0/sdk/resourcemanager/chaos/armchaos/) |\n| Resource Management - Cloudhealth | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cloudhealth/armcloudhealth/v0.1.0/sdk/resourcemanager/cloudhealth/armcloudhealth/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cloudhealth/armcloudhealth) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cloudhealth/armcloudhealth/v0.1.0/sdk/resourcemanager/cloudhealth/armcloudhealth/) |\n| Resource Management - Cognitive Search | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/search/armsearch/v1.4.0/sdk/resourcemanager/search/armsearch/)<br>module [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/search/armsearch/v2.0.0-beta.2/sdk/resourcemanager/search/armsearch/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/search/armsearch) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/search/armsearch/v1.4.0/sdk/resourcemanager/search/armsearch/)<br>GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/search/armsearch/v2.0.0-beta.2/sdk/resourcemanager/search/armsearch/) |\n| Resource Management - Cognitive Services | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cognitiveservices/armcognitiveservices/v3.0.0/sdk/resourcemanager/cognitiveservices/armcognitiveservices/)<br>module [4.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cognitiveservices/armcognitiveservices/v4.0.0-beta.1/sdk/resourcemanager/cognitiveservices/armcognitiveservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cognitiveservices/armcognitiveservices) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cognitiveservices/armcognitiveservices/v3.0.0/sdk/resourcemanager/cognitiveservices/armcognitiveservices/)<br>GitHub [4.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cognitiveservices/armcognitiveservices/v4.0.0-beta.1/sdk/resourcemanager/cognitiveservices/armcognitiveservices/) |\n| Resource Management - Commerce | module [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/commerce/armcommerce/v0.4.0/sdk/resourcemanager/commerce/armcommerce/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/commerce/armcommerce) | GitHub [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/commerce/armcommerce/v0.4.0/sdk/resourcemanager/commerce/armcommerce/) |\n| Resource Management - Communication | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/communication/armcommunication/v2.3.0/sdk/resourcemanager/communication/armcommunication/)<br>module [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/communication/armcommunication/v3.0.0-beta.1/sdk/resourcemanager/communication/armcommunication/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/communication/armcommunication) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/communication/armcommunication/v2.3.0/sdk/resourcemanager/communication/armcommunication/)<br>GitHub [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/communication/armcommunication/v3.0.0-beta.1/sdk/resourcemanager/communication/armcommunication/) |\n| Resource Management - Compute | module [8.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/compute/armcompute/v8.0.0/sdk/resourcemanager/compute/armcompute/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute) | GitHub [8.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/compute/armcompute/v8.0.0/sdk/resourcemanager/compute/armcompute/) |\n| Resource Management - Compute Fleet | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computefleet/armcomputefleet/v1.0.0/sdk/resourcemanager/computefleet/armcomputefleet/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computefleet/armcomputefleet/v2.0.0-beta.1/sdk/resourcemanager/computefleet/armcomputefleet/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computefleet/armcomputefleet) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computefleet/armcomputefleet/v1.0.0/sdk/resourcemanager/computefleet/armcomputefleet/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computefleet/armcomputefleet/v2.0.0-beta.1/sdk/resourcemanager/computefleet/armcomputefleet/) |\n| Resource Management - Compute Schedule | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computeschedule/armcomputeschedule/v1.1.0/sdk/resourcemanager/computeschedule/armcomputeschedule/)<br>module [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computeschedule/armcomputeschedule/v1.2.0-beta.1/sdk/resourcemanager/computeschedule/armcomputeschedule/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computeschedule/armcomputeschedule) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computeschedule/armcomputeschedule/v1.1.0/sdk/resourcemanager/computeschedule/armcomputeschedule/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computeschedule/armcomputeschedule/v1.2.0-beta.1/sdk/resourcemanager/computeschedule/armcomputeschedule/) |\n| Resource Management - Computebulkactions | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computebulkactions/armcomputebulkactions/v0.1.0/sdk/resourcemanager/computebulkactions/armcomputebulkactions/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computebulkactions/armcomputebulkactions) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computebulkactions/armcomputebulkactions/v0.1.0/sdk/resourcemanager/computebulkactions/armcomputebulkactions/) |\n| Resource Management - Computelimit | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computelimit/armcomputelimit/v1.0.0/sdk/resourcemanager/computelimit/armcomputelimit/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computelimit/armcomputelimit) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computelimit/armcomputelimit/v1.0.0/sdk/resourcemanager/computelimit/armcomputelimit/) |\n| Resource Management - Computerecommender | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computerecommender/armcomputerecommender/v0.1.0/sdk/resourcemanager/computerecommender/armcomputerecommender/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/computerecommender/armcomputerecommender) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/computerecommender/armcomputerecommender/v0.1.0/sdk/resourcemanager/computerecommender/armcomputerecommender/) |\n| Resource Management - Confidential Ledger | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confidentialledger/armconfidentialledger/v1.2.0/sdk/resourcemanager/confidentialledger/armconfidentialledger/)<br>module [1.3.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confidentialledger/armconfidentialledger/v1.3.0-beta.3/sdk/resourcemanager/confidentialledger/armconfidentialledger/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/confidentialledger/armconfidentialledger) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confidentialledger/armconfidentialledger/v1.2.0/sdk/resourcemanager/confidentialledger/armconfidentialledger/)<br>GitHub [1.3.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confidentialledger/armconfidentialledger/v1.3.0-beta.3/sdk/resourcemanager/confidentialledger/armconfidentialledger/) |\n| Resource Management - Confluent | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confluent/armconfluent/v1.3.0/sdk/resourcemanager/confluent/armconfluent/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/confluent/armconfluent) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/confluent/armconfluent/v1.3.0/sdk/resourcemanager/confluent/armconfluent/) |\n| Resource Management - Connected Cache | module [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/connectedcache/armconnectedcache/v0.2.0/sdk/resourcemanager/connectedcache/armconnectedcache/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/connectedcache/armconnectedcache) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/connectedcache/armconnectedcache/v0.2.0/sdk/resourcemanager/connectedcache/armconnectedcache/) |\n| Resource Management - Connected VMWare | module [1.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/connectedvmware/armconnectedvmware/v1.1.1/sdk/resourcemanager/connectedvmware/armconnectedvmware/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/connectedvmware/armconnectedvmware) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/connectedvmware/armconnectedvmware/v1.1.1/sdk/resourcemanager/connectedvmware/armconnectedvmware/) |\n| Resource Management - Consumption | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/consumption/armconsumption/v1.2.0/sdk/resourcemanager/consumption/armconsumption/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/consumption/armconsumption) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/consumption/armconsumption/v1.2.0/sdk/resourcemanager/consumption/armconsumption/) |\n| Resource Management - Container Apps | module [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appcontainers/armappcontainers/v4.0.0/sdk/resourcemanager/appcontainers/armappcontainers/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/appcontainers/armappcontainers) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/appcontainers/armappcontainers/v4.0.0/sdk/resourcemanager/appcontainers/armappcontainers/) |\n| Resource Management - Container Instances | module [2.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerinstance/armcontainerinstance/v2.4.0/sdk/resourcemanager/containerinstance/armcontainerinstance/)<br>module [2.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerinstance/armcontainerinstance/v2.5.0-beta.1/sdk/resourcemanager/containerinstance/armcontainerinstance/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerinstance/armcontainerinstance) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerinstance/armcontainerinstance/v2.4.0/sdk/resourcemanager/containerinstance/armcontainerinstance/)<br>GitHub [2.5.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerinstance/armcontainerinstance/v2.5.0-beta.1/sdk/resourcemanager/containerinstance/armcontainerinstance/) |\n| Resource Management - Container Orchestrator Runtime | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerorchestratorruntime/armcontainerorchestratorruntime/v0.1.0/sdk/resourcemanager/containerorchestratorruntime/armcontainerorchestratorruntime/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerorchestratorruntime/armcontainerorchestratorruntime) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerorchestratorruntime/armcontainerorchestratorruntime/v0.1.0/sdk/resourcemanager/containerorchestratorruntime/armcontainerorchestratorruntime/) |\n| Resource Management - Container Registry | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerregistry/armcontainerregistry/v3.0.0/sdk/resourcemanager/containerregistry/armcontainerregistry/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerregistry/armcontainerregistry) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerregistry/armcontainerregistry/v3.0.0/sdk/resourcemanager/containerregistry/armcontainerregistry/) |\n| Resource Management - Container Service | module [9.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armcontainerservice/v9.1.0/sdk/resourcemanager/containerservice/armcontainerservice/)<br>module [9.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armcontainerservice/v9.2.0-beta.1/sdk/resourcemanager/containerservice/armcontainerservice/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armcontainerservice) | GitHub [9.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armcontainerservice/v9.1.0/sdk/resourcemanager/containerservice/armcontainerservice/)<br>GitHub [9.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armcontainerservice/v9.2.0-beta.1/sdk/resourcemanager/containerservice/armcontainerservice/) |\n| Resource Management - Container Service Fleet | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/v2.0.0/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/)<br>module [3.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/v3.0.0-beta.4/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/v2.0.0/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/)<br>GitHub [3.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/v3.0.0-beta.4/sdk/resourcemanager/containerservicefleet/armcontainerservicefleet/) |\n| Resource Management - Containerregistrytasks | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerregistry/armcontainerregistrytasks/v0.1.0/sdk/resourcemanager/containerregistry/armcontainerregistrytasks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerregistry/armcontainerregistrytasks) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerregistry/armcontainerregistrytasks/v0.1.0/sdk/resourcemanager/containerregistry/armcontainerregistrytasks/) |\n| Resource Management - Content Delivery Network | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cdn/armcdn/v2.2.0/sdk/resourcemanager/cdn/armcdn/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cdn/armcdn) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cdn/armcdn/v2.2.0/sdk/resourcemanager/cdn/armcdn/) |\n| Resource Management - Cosmos DB | module [3.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmos/armcosmos/v3.4.0/sdk/resourcemanager/cosmos/armcosmos/)<br>module [4.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmos/armcosmos/v4.0.0-beta.3/sdk/resourcemanager/cosmos/armcosmos/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cosmos/armcosmos) | GitHub [3.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmos/armcosmos/v3.4.0/sdk/resourcemanager/cosmos/armcosmos/)<br>GitHub [4.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmos/armcosmos/v4.0.0-beta.3/sdk/resourcemanager/cosmos/armcosmos/) |\n| Resource Management - Cosmos DB for PostgreSQL | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/v1.1.0/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/)<br>module [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/v1.2.0-beta.1/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/v1.1.0/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/v1.2.0-beta.1/sdk/resourcemanager/cosmosforpostgresql/armcosmosforpostgresql/) |\n| Resource Management - Cost Management | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/costmanagement/armcostmanagement/v2.1.0/sdk/resourcemanager/costmanagement/armcostmanagement/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/costmanagement/armcostmanagement) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/costmanagement/armcostmanagement/v2.1.0/sdk/resourcemanager/costmanagement/armcostmanagement/) |\n| Resource Management - Custom Providers | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customproviders/armcustomproviders/v0.7.0/sdk/resourcemanager/customproviders/armcustomproviders/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/customproviders/armcustomproviders) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customproviders/armcustomproviders/v0.7.0/sdk/resourcemanager/customproviders/armcustomproviders/) |\n| Resource Management - Customer Insights | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customerinsights/armcustomerinsights/v1.2.0/sdk/resourcemanager/customerinsights/armcustomerinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/customerinsights/armcustomerinsights) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customerinsights/armcustomerinsights/v1.2.0/sdk/resourcemanager/customerinsights/armcustomerinsights/) |\n| Resource Management - Customer Lockbox | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customerlockbox/armcustomerlockbox/v0.7.0/sdk/resourcemanager/customerlockbox/armcustomerlockbox/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/customerlockbox/armcustomerlockbox) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/customerlockbox/armcustomerlockbox/v0.7.0/sdk/resourcemanager/customerlockbox/armcustomerlockbox/) |\n| Resource Management - Data Boundaries | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databoundaries/armdataboundaries/v0.1.0/sdk/resourcemanager/databoundaries/armdataboundaries/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databoundaries/armdataboundaries) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databoundaries/armdataboundaries/v0.1.0/sdk/resourcemanager/databoundaries/armdataboundaries/) |\n| Resource Management - Data Box | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databox/armdatabox/v2.2.0/sdk/resourcemanager/databox/armdatabox/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databox/armdatabox) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databox/armdatabox/v2.2.0/sdk/resourcemanager/databox/armdatabox/) |\n| Resource Management - Data Box Edge | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databoxedge/armdataboxedge/v1.2.0/sdk/resourcemanager/databoxedge/armdataboxedge/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databoxedge/armdataboxedge) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databoxedge/armdataboxedge/v1.2.0/sdk/resourcemanager/databoxedge/armdataboxedge/) |\n| Resource Management - Data Catalog | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datacatalog/armdatacatalog/v1.2.0/sdk/resourcemanager/datacatalog/armdatacatalog/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datacatalog/armdatacatalog) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datacatalog/armdatacatalog/v1.2.0/sdk/resourcemanager/datacatalog/armdatacatalog/) |\n| Resource Management - Data Factory | module [10.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datafactory/armdatafactory/v10.0.0/sdk/resourcemanager/datafactory/armdatafactory/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datafactory/armdatafactory) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datafactory/armdatafactory/v10.0.0/sdk/resourcemanager/datafactory/armdatafactory/) |\n| Resource Management - Data Lake Analytics | module [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datalake-analytics/armdatalakeanalytics/v0.8.0/sdk/resourcemanager/datalake-analytics/armdatalakeanalytics/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datalake-analytics/armdatalakeanalytics) | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datalake-analytics/armdatalakeanalytics/v0.8.0/sdk/resourcemanager/datalake-analytics/armdatalakeanalytics/) |\n| Resource Management - Data Lake Store | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datalake-store/armdatalakestore/v1.2.0/sdk/resourcemanager/datalake-store/armdatalakestore/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datalake-store/armdatalakestore) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datalake-store/armdatalakestore/v1.2.0/sdk/resourcemanager/datalake-store/armdatalakestore/) |\n| Resource Management - Data Migration | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datamigration/armdatamigration/v2.0.0/sdk/resourcemanager/datamigration/armdatamigration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datamigration/armdatamigration) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datamigration/armdatamigration/v2.0.0/sdk/resourcemanager/datamigration/armdatamigration/) |\n| Resource Management - Data Protection | module [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dataprotection/armdataprotection/v4.0.0/sdk/resourcemanager/dataprotection/armdataprotection/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dataprotection/armdataprotection) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dataprotection/armdataprotection/v4.0.0/sdk/resourcemanager/dataprotection/armdataprotection/) |\n| Resource Management - Data Share | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datashare/armdatashare/v1.2.0/sdk/resourcemanager/datashare/armdatashare/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datashare/armdatashare) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datashare/armdatashare/v1.2.0/sdk/resourcemanager/datashare/armdatashare/) |\n| Resource Management - Database Watcher | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databasewatcher/armdatabasewatcher/v0.1.0/sdk/resourcemanager/databasewatcher/armdatabasewatcher/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databasewatcher/armdatabasewatcher) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databasewatcher/armdatabasewatcher/v0.1.0/sdk/resourcemanager/databasewatcher/armdatabasewatcher/) |\n| Resource Management - Databricks | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databricks/armdatabricks/v1.1.0/sdk/resourcemanager/databricks/armdatabricks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/databricks/armdatabricks) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/databricks/armdatabricks/v1.1.0/sdk/resourcemanager/databricks/armdatabricks/) |\n| Resource Management - Datadog | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datadog/armdatadog/v1.3.0/sdk/resourcemanager/datadog/armdatadog/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/datadog/armdatadog) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/datadog/armdatadog/v1.3.0/sdk/resourcemanager/datadog/armdatadog/) |\n| Resource Management - Delegated Network | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/delegatednetwork/armdelegatednetwork/v1.2.0/sdk/resourcemanager/delegatednetwork/armdelegatednetwork/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/delegatednetwork/armdelegatednetwork) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/delegatednetwork/armdelegatednetwork/v1.2.0/sdk/resourcemanager/delegatednetwork/armdelegatednetwork/) |\n| Resource Management - Dellstorage | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dell/armdellstorage/v1.0.0/sdk/resourcemanager/dell/armdellstorage/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dell/armdellstorage) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dell/armdellstorage/v1.0.0/sdk/resourcemanager/dell/armdellstorage/) |\n| Resource Management - Dependencymap | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dependencymap/armdependencymap/v0.1.0/sdk/resourcemanager/dependencymap/armdependencymap/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dependencymap/armdependencymap) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dependencymap/armdependencymap/v0.1.0/sdk/resourcemanager/dependencymap/armdependencymap/) |\n| Resource Management - Deployment Manager | module [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deploymentmanager/armdeploymentmanager/v0.6.0/sdk/resourcemanager/deploymentmanager/armdeploymentmanager/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/deploymentmanager/armdeploymentmanager) | GitHub [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deploymentmanager/armdeploymentmanager/v0.6.0/sdk/resourcemanager/deploymentmanager/armdeploymentmanager/) |\n| Resource Management - Deployment Scripts | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeploymentscripts/v2.1.0/sdk/resourcemanager/resources/armdeploymentscripts/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armdeploymentscripts) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeploymentscripts/v2.1.0/sdk/resourcemanager/resources/armdeploymentscripts/) |\n| Resource Management - Deployment Stacks | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeploymentstacks/v2.0.0/sdk/resourcemanager/resources/armdeploymentstacks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armdeploymentstacks) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeploymentstacks/v2.0.0/sdk/resourcemanager/resources/armdeploymentstacks/) |\n| Resource Management - Deployments | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeployments/v1.0.0/sdk/resourcemanager/resources/armdeployments/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armdeployments) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armdeployments/v1.0.0/sdk/resourcemanager/resources/armdeployments/) |\n| Resource Management - Deploymentsafeguards | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armdeploymentsafeguards/v0.1.0/sdk/resourcemanager/containerservice/armdeploymentsafeguards/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/containerservice/armdeploymentsafeguards) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/containerservice/armdeploymentsafeguards/v0.1.0/sdk/resourcemanager/containerservice/armdeploymentsafeguards/) |\n| Resource Management - Desktop Virtualization | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/desktopvirtualization/armdesktopvirtualization/v2.3.0/sdk/resourcemanager/desktopvirtualization/armdesktopvirtualization/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/desktopvirtualization/armdesktopvirtualization) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/desktopvirtualization/armdesktopvirtualization/v2.3.0/sdk/resourcemanager/desktopvirtualization/armdesktopvirtualization/) |\n| Resource Management - Dev Center | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devcenter/armdevcenter/v2.0.0/sdk/resourcemanager/devcenter/armdevcenter/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/devcenter/armdevcenter) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devcenter/armdevcenter/v2.0.0/sdk/resourcemanager/devcenter/armdevcenter/) |\n| Resource Management - DevHub | module [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devhub/armdevhub/v0.6.0/sdk/resourcemanager/devhub/armdevhub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/devhub/armdevhub) | GitHub [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devhub/armdevhub/v0.6.0/sdk/resourcemanager/devhub/armdevhub/) |\n| Resource Management - Device Provisioning Services | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/v1.2.0/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/)<br>module [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/v1.3.0-beta.2/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/v1.2.0/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/)<br>GitHub [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/v1.3.0-beta.2/sdk/resourcemanager/deviceprovisioningservices/armdeviceprovisioningservices/) |\n| Resource Management - Device Registry | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceregistry/armdeviceregistry/v2.0.0/sdk/resourcemanager/deviceregistry/armdeviceregistry/)<br>module [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceregistry/armdeviceregistry/v2.1.0-beta.1/sdk/resourcemanager/deviceregistry/armdeviceregistry/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/deviceregistry/armdeviceregistry) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceregistry/armdeviceregistry/v2.0.0/sdk/resourcemanager/deviceregistry/armdeviceregistry/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceregistry/armdeviceregistry/v2.1.0-beta.1/sdk/resourcemanager/deviceregistry/armdeviceregistry/) |\n| Resource Management - Device Update | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceupdate/armdeviceupdate/v1.3.0/sdk/resourcemanager/deviceupdate/armdeviceupdate/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/deviceupdate/armdeviceupdate) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/deviceupdate/armdeviceupdate/v1.3.0/sdk/resourcemanager/deviceupdate/armdeviceupdate/) |\n| Resource Management - DevOps | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devops/armdevops/v0.7.0/sdk/resourcemanager/devops/armdevops/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/devops/armdevops) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devops/armdevops/v0.7.0/sdk/resourcemanager/devops/armdevops/) |\n| Resource Management - DevOps Infrastructure | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devopsinfrastructure/armdevopsinfrastructure/v1.0.0/sdk/resourcemanager/devopsinfrastructure/armdevopsinfrastructure/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/devopsinfrastructure/armdevopsinfrastructure) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devopsinfrastructure/armdevopsinfrastructure/v1.0.0/sdk/resourcemanager/devopsinfrastructure/armdevopsinfrastructure/) |\n| Resource Management - DevTest Labs | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devtestlabs/armdevtestlabs/v1.2.0/sdk/resourcemanager/devtestlabs/armdevtestlabs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/devtestlabs/armdevtestlabs) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/devtestlabs/armdevtestlabs/v1.2.0/sdk/resourcemanager/devtestlabs/armdevtestlabs/) |\n| Resource Management - Digital Twins | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/digitaltwins/armdigitaltwins/v1.2.0/sdk/resourcemanager/digitaltwins/armdigitaltwins/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/digitaltwins/armdigitaltwins) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/digitaltwins/armdigitaltwins/v1.2.0/sdk/resourcemanager/digitaltwins/armdigitaltwins/) |\n| Resource Management - Disconnectedoperations | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/disconnectedoperations/armdisconnectedoperations/v1.0.0/sdk/resourcemanager/disconnectedoperations/armdisconnectedoperations/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/disconnectedoperations/armdisconnectedoperations) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/disconnectedoperations/armdisconnectedoperations/v1.0.0/sdk/resourcemanager/disconnectedoperations/armdisconnectedoperations/) |\n| Resource Management - DNS | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dns/armdns/v1.2.0/sdk/resourcemanager/dns/armdns/)<br>module [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dns/armdns/v1.3.0-beta.1/sdk/resourcemanager/dns/armdns/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dns/armdns/v1.2.0/sdk/resourcemanager/dns/armdns/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dns/armdns/v1.3.0-beta.1/sdk/resourcemanager/dns/armdns/) |\n| Resource Management - DNS Resolver | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dnsresolver/armdnsresolver/v1.3.0/sdk/resourcemanager/dnsresolver/armdnsresolver/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dnsresolver/armdnsresolver/v2.0.0-beta.1/sdk/resourcemanager/dnsresolver/armdnsresolver/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dnsresolver/armdnsresolver) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dnsresolver/armdnsresolver/v1.3.0/sdk/resourcemanager/dnsresolver/armdnsresolver/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dnsresolver/armdnsresolver/v2.0.0-beta.1/sdk/resourcemanager/dnsresolver/armdnsresolver/) |\n| Resource Management - Domain Services | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/domainservices/armdomainservices/v1.2.0/sdk/resourcemanager/domainservices/armdomainservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/domainservices/armdomainservices) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/domainservices/armdomainservices/v1.2.0/sdk/resourcemanager/domainservices/armdomainservices/) |\n| Resource Management - Domainregistration | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/domainregistration/armdomainregistration/v0.1.0/sdk/resourcemanager/domainregistration/armdomainregistration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/domainregistration/armdomainregistration) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/domainregistration/armdomainregistration/v0.1.0/sdk/resourcemanager/domainregistration/armdomainregistration/) |\n| Resource Management - Durable Task | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/durabletask/armdurabletask/v1.1.0/sdk/resourcemanager/durabletask/armdurabletask/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/durabletask/armdurabletask) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/durabletask/armdurabletask/v1.1.0/sdk/resourcemanager/durabletask/armdurabletask/) |\n| Resource Management - Dynatrace | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dynatrace/armdynatrace/v2.1.0/sdk/resourcemanager/dynatrace/armdynatrace/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dynatrace/armdynatrace) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dynatrace/armdynatrace/v2.1.0/sdk/resourcemanager/dynatrace/armdynatrace/) |\n| Resource Management - Edge Order | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeorder/armedgeorder/v1.2.0/sdk/resourcemanager/edgeorder/armedgeorder/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/edgeorder/armedgeorder) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeorder/armedgeorder/v1.2.0/sdk/resourcemanager/edgeorder/armedgeorder/) |\n| Resource Management - Edge Order Partner | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeorderpartner/armedgeorderpartner/v0.7.0/sdk/resourcemanager/edgeorderpartner/armedgeorderpartner/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/edgeorderpartner/armedgeorderpartner) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeorderpartner/armedgeorderpartner/v0.7.0/sdk/resourcemanager/edgeorderpartner/armedgeorderpartner/) |\n| Resource Management - Edge Zones | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgezones/armedgezones/v0.1.0/sdk/resourcemanager/edgezones/armedgezones/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/edgezones/armedgezones) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgezones/armedgezones/v0.1.0/sdk/resourcemanager/edgezones/armedgezones/) |\n| Resource Management - Edgeactions | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeactions/armedgeactions/v0.1.0/sdk/resourcemanager/edgeactions/armedgeactions/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/edgeactions/armedgeactions) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/edgeactions/armedgeactions/v0.1.0/sdk/resourcemanager/edgeactions/armedgeactions/) |\n| Resource Management - Education | module [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/education/armeducation/v0.4.0/sdk/resourcemanager/education/armeducation/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/education/armeducation) | GitHub [0.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/education/armeducation/v0.4.0/sdk/resourcemanager/education/armeducation/) |\n| Resource Management - Elastic | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elastic/armelastic/v2.0.0/sdk/resourcemanager/elastic/armelastic/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/elastic/armelastic) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elastic/armelastic/v2.0.0/sdk/resourcemanager/elastic/armelastic/) |\n| Resource Management - Elastic SAN | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elasticsan/armelasticsan/v1.2.0/sdk/resourcemanager/elasticsan/armelasticsan/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/elasticsan/armelasticsan) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elasticsan/armelasticsan/v1.2.0/sdk/resourcemanager/elasticsan/armelasticsan/) |\n| Resource Management - Elastics SANs | module [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elasticsans/armelasticsans/v0.1.1/sdk/resourcemanager/elasticsans/armelasticsans/) |  | GitHub [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/elasticsans/armelasticsans/v0.1.1/sdk/resourcemanager/elasticsans/armelasticsans/) |\n| Resource Management - Engagement Fabric | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/engagementfabric/armengagementfabric/v0.3.0/sdk/resourcemanager/engagementfabric/armengagementfabric/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/engagementfabric/armengagementfabric) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/engagementfabric/armengagementfabric/v0.3.0/sdk/resourcemanager/engagementfabric/armengagementfabric/) |\n| Resource Management - Event Grid | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventgrid/armeventgrid/v2.3.0/sdk/resourcemanager/eventgrid/armeventgrid/)<br>module [2.4.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventgrid/armeventgrid/v2.4.0-beta.2/sdk/resourcemanager/eventgrid/armeventgrid/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventgrid/armeventgrid) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventgrid/armeventgrid/v2.3.0/sdk/resourcemanager/eventgrid/armeventgrid/)<br>GitHub [2.4.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventgrid/armeventgrid/v2.4.0-beta.2/sdk/resourcemanager/eventgrid/armeventgrid/) |\n| Resource Management - Event Hubs | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventhub/armeventhub/v1.3.0/sdk/resourcemanager/eventhub/armeventhub/)<br>module [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventhub/armeventhub/v1.4.0-beta.1/sdk/resourcemanager/eventhub/armeventhub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventhub/armeventhub/v1.3.0/sdk/resourcemanager/eventhub/armeventhub/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/eventhub/armeventhub/v1.4.0-beta.1/sdk/resourcemanager/eventhub/armeventhub/) |\n| Resource Management - Extended Location | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/extendedlocation/armextendedlocation/v1.2.0/sdk/resourcemanager/extendedlocation/armextendedlocation/)<br>module [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/extendedlocation/armextendedlocation/v1.3.0-beta.1/sdk/resourcemanager/extendedlocation/armextendedlocation/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/extendedlocation/armextendedlocation) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/extendedlocation/armextendedlocation/v1.2.0/sdk/resourcemanager/extendedlocation/armextendedlocation/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/extendedlocation/armextendedlocation/v1.3.0-beta.1/sdk/resourcemanager/extendedlocation/armextendedlocation/) |\n| Resource Management - Extensions | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armextensions/v1.0.0/sdk/resourcemanager/kubernetesconfiguration/armextensions/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kubernetesconfiguration/armextensions) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armextensions/v1.0.0/sdk/resourcemanager/kubernetesconfiguration/armextensions/) |\n| Resource Management - Extensiontypes | module [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armextensiontypes/v0.2.0/sdk/resourcemanager/kubernetesconfiguration/armextensiontypes/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kubernetesconfiguration/armextensiontypes) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armextensiontypes/v0.2.0/sdk/resourcemanager/kubernetesconfiguration/armextensiontypes/) |\n| Resource Management - Fabric | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/fabric/armfabric/v1.0.0/sdk/resourcemanager/fabric/armfabric/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/fabric/armfabric) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/fabric/armfabric/v1.0.0/sdk/resourcemanager/fabric/armfabric/) |\n| Resource Management - Features | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armfeatures/v1.2.0/sdk/resourcemanager/resources/armfeatures/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armfeatures) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armfeatures/v1.2.0/sdk/resourcemanager/resources/armfeatures/) |\n| Resource Management - Fluid Relay | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/fluidrelay/armfluidrelay/v1.2.0/sdk/resourcemanager/fluidrelay/armfluidrelay/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/fluidrelay/armfluidrelay) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/fluidrelay/armfluidrelay/v1.2.0/sdk/resourcemanager/fluidrelay/armfluidrelay/) |\n| Resource Management - Fluxconfigurations | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armfluxconfigurations/v0.1.0/sdk/resourcemanager/kubernetesconfiguration/armfluxconfigurations/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kubernetesconfiguration/armfluxconfigurations) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armfluxconfigurations/v0.1.0/sdk/resourcemanager/kubernetesconfiguration/armfluxconfigurations/) |\n| Resource Management - Front Door | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/frontdoor/armfrontdoor/v1.4.0/sdk/resourcemanager/frontdoor/armfrontdoor/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/frontdoor/armfrontdoor/v2.0.0-beta.1/sdk/resourcemanager/frontdoor/armfrontdoor/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/frontdoor/armfrontdoor) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/frontdoor/armfrontdoor/v1.4.0/sdk/resourcemanager/frontdoor/armfrontdoor/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/frontdoor/armfrontdoor/v2.0.0-beta.1/sdk/resourcemanager/frontdoor/armfrontdoor/) |\n| Resource Management - Graph Services | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/graphservices/armgraphservices/v1.1.0/sdk/resourcemanager/graphservices/armgraphservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/graphservices/armgraphservices) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/graphservices/armgraphservices/v1.1.0/sdk/resourcemanager/graphservices/armgraphservices/) |\n| Resource Management - Guest Configuration | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/guestconfiguration/armguestconfiguration/v1.2.0/sdk/resourcemanager/guestconfiguration/armguestconfiguration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/guestconfiguration/armguestconfiguration) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/guestconfiguration/armguestconfiguration/v1.2.0/sdk/resourcemanager/guestconfiguration/armguestconfiguration/) |\n| Resource Management - HANA on Azure | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hanaonazure/armhanaonazure/v0.7.0/sdk/resourcemanager/hanaonazure/armhanaonazure/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hanaonazure/armhanaonazure) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hanaonazure/armhanaonazure/v0.7.0/sdk/resourcemanager/hanaonazure/armhanaonazure/) |\n| Resource Management - Hardware Security Module | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hardwaresecuritymodules/armhardwaresecuritymodules/v2.0.0/sdk/resourcemanager/hardwaresecuritymodules/armhardwaresecuritymodules/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hardwaresecuritymodules/armhardwaresecuritymodules) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hardwaresecuritymodules/armhardwaresecuritymodules/v2.0.0/sdk/resourcemanager/hardwaresecuritymodules/armhardwaresecuritymodules/) |\n| Resource Management - Hdinsight | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hdinsight/armhdinsight/v1.2.0/sdk/resourcemanager/hdinsight/armhdinsight/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hdinsight/armhdinsight/v2.0.0-beta.1/sdk/resourcemanager/hdinsight/armhdinsight/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hdinsight/armhdinsight) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hdinsight/armhdinsight/v1.2.0/sdk/resourcemanager/hdinsight/armhdinsight/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hdinsight/armhdinsight/v2.0.0-beta.1/sdk/resourcemanager/hdinsight/armhdinsight/) |\n| Resource Management - HDInsight Containers | module [0.4.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hdinsightcontainers/armhdinsightcontainers/v0.4.1/sdk/resourcemanager/hdinsightcontainers/armhdinsightcontainers/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hdinsightcontainers/armhdinsightcontainers) | GitHub [0.4.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hdinsightcontainers/armhdinsightcontainers/v0.4.1/sdk/resourcemanager/hdinsightcontainers/armhdinsightcontainers/) |\n| Resource Management - Health Bot | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthbot/armhealthbot/v1.2.0/sdk/resourcemanager/healthbot/armhealthbot/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/healthbot/armhealthbot) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthbot/armhealthbot/v1.2.0/sdk/resourcemanager/healthbot/armhealthbot/) |\n| Resource Management - Health Data AI Services | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthdataaiservices/armhealthdataaiservices/v1.0.0/sdk/resourcemanager/healthdataaiservices/armhealthdataaiservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/healthdataaiservices/armhealthdataaiservices) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthdataaiservices/armhealthdataaiservices/v1.0.0/sdk/resourcemanager/healthdataaiservices/armhealthdataaiservices/) |\n| Resource Management - Healthcare APIs | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthcareapis/armhealthcareapis/v2.1.0/sdk/resourcemanager/healthcareapis/armhealthcareapis/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/healthcareapis/armhealthcareapis) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/healthcareapis/armhealthcareapis/v2.1.0/sdk/resourcemanager/healthcareapis/armhealthcareapis/) |\n| Resource Management - Hybrid Compute | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcompute/armhybridcompute/v2.0.0/sdk/resourcemanager/hybridcompute/armhybridcompute/)<br>module [2.1.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcompute/armhybridcompute/v2.1.0-beta.2/sdk/resourcemanager/hybridcompute/armhybridcompute/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybridcompute/armhybridcompute) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcompute/armhybridcompute/v2.0.0/sdk/resourcemanager/hybridcompute/armhybridcompute/)<br>GitHub [2.1.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcompute/armhybridcompute/v2.1.0-beta.2/sdk/resourcemanager/hybridcompute/armhybridcompute/) |\n| Resource Management - Hybrid Connectivity | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/v1.1.0/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/)<br>module [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/v1.2.0-beta.1/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/v1.1.0/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/v1.2.0-beta.1/sdk/resourcemanager/hybridconnectivity/armhybridconnectivity/) |\n| Resource Management - Hybrid Container Service | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcontainerservice/armhybridcontainerservice/v1.0.0/sdk/resourcemanager/hybridcontainerservice/armhybridcontainerservice/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybridcontainerservice/armhybridcontainerservice) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridcontainerservice/armhybridcontainerservice/v1.0.0/sdk/resourcemanager/hybridcontainerservice/armhybridcontainerservice/) |\n| Resource Management - Hybrid Data Manager | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybriddatamanager/armhybriddatamanager/v1.2.0/sdk/resourcemanager/hybriddatamanager/armhybriddatamanager/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybriddatamanager/armhybriddatamanager) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybriddatamanager/armhybriddatamanager/v1.2.0/sdk/resourcemanager/hybriddatamanager/armhybriddatamanager/) |\n| Resource Management - Hybrid Kubernetes | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/v1.2.0/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/v2.0.0-beta.1/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/v1.2.0/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/v2.0.0-beta.1/sdk/resourcemanager/hybridkubernetes/armhybridkubernetes/) |\n| Resource Management - Hybrid Network | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridnetwork/armhybridnetwork/v2.0.0/sdk/resourcemanager/hybridnetwork/armhybridnetwork/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/hybridnetwork/armhybridnetwork) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/hybridnetwork/armhybridnetwork/v2.0.0/sdk/resourcemanager/hybridnetwork/armhybridnetwork/) |\n| Resource Management - Impact Reporting | module [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/impactreporting/armimpactreporting/v0.2.0/sdk/resourcemanager/impactreporting/armimpactreporting/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/impactreporting/armimpactreporting) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/impactreporting/armimpactreporting/v0.2.0/sdk/resourcemanager/impactreporting/armimpactreporting/) |\n| Resource Management - Informatica Data Management | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/informaticadatamgmt/arminformaticadatamgmt/v1.0.0/sdk/resourcemanager/informaticadatamgmt/arminformaticadatamgmt/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/informaticadatamgmt/arminformaticadatamgmt) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/informaticadatamgmt/arminformaticadatamgmt/v1.0.0/sdk/resourcemanager/informaticadatamgmt/arminformaticadatamgmt/) |\n| Resource Management - Integration Spaces | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/integrationspaces/armintegrationspaces/v0.1.0/sdk/resourcemanager/integrationspaces/armintegrationspaces/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/integrationspaces/armintegrationspaces) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/integrationspaces/armintegrationspaces/v0.1.0/sdk/resourcemanager/integrationspaces/armintegrationspaces/) |\n| Resource Management - IoT Central | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotcentral/armiotcentral/v1.2.0/sdk/resourcemanager/iotcentral/armiotcentral/)<br>module [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotcentral/armiotcentral/v2.0.0-beta.2/sdk/resourcemanager/iotcentral/armiotcentral/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/iotcentral/armiotcentral) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotcentral/armiotcentral/v1.2.0/sdk/resourcemanager/iotcentral/armiotcentral/)<br>GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotcentral/armiotcentral/v2.0.0-beta.2/sdk/resourcemanager/iotcentral/armiotcentral/) |\n| Resource Management - IoT Firmware Defense | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotfirmwaredefense/armiotfirmwaredefense/v2.0.0/sdk/resourcemanager/iotfirmwaredefense/armiotfirmwaredefense/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/iotfirmwaredefense/armiotfirmwaredefense) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotfirmwaredefense/armiotfirmwaredefense/v2.0.0/sdk/resourcemanager/iotfirmwaredefense/armiotfirmwaredefense/) |\n| Resource Management - IoT Hub | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iothub/armiothub/v1.3.0/sdk/resourcemanager/iothub/armiothub/)<br>module [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iothub/armiothub/v1.4.0-beta.1/sdk/resourcemanager/iothub/armiothub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/iothub/armiothub) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iothub/armiothub/v1.3.0/sdk/resourcemanager/iothub/armiothub/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iothub/armiothub/v1.4.0-beta.1/sdk/resourcemanager/iothub/armiothub/) |\n| Resource Management - IoT Operations | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotoperations/armiotoperations/v1.1.0/sdk/resourcemanager/iotoperations/armiotoperations/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/iotoperations/armiotoperations) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotoperations/armiotoperations/v1.1.0/sdk/resourcemanager/iotoperations/armiotoperations/) |\n| Resource Management - IoT Security | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotsecurity/armiotsecurity/v0.7.0/sdk/resourcemanager/iotsecurity/armiotsecurity/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/iotsecurity/armiotsecurity) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/iotsecurity/armiotsecurity/v0.7.0/sdk/resourcemanager/iotsecurity/armiotsecurity/) |\n| Resource Management - Key Vault | module [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/keyvault/armkeyvault/v2.0.2/sdk/resourcemanager/keyvault/armkeyvault/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault) | GitHub [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/keyvault/armkeyvault/v2.0.2/sdk/resourcemanager/keyvault/armkeyvault/) |\n| Resource Management - Kubernetes Configuration | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration/v2.2.0/sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration/v2.2.0/sdk/resourcemanager/kubernetesconfiguration/armkubernetesconfiguration/) |\n| Resource Management - Kusto | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kusto/armkusto/v2.3.0/sdk/resourcemanager/kusto/armkusto/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kusto/armkusto) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kusto/armkusto/v2.3.0/sdk/resourcemanager/kusto/armkusto/) |\n| Resource Management - Lab Services | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/labservices/armlabservices/v1.2.0/sdk/resourcemanager/labservices/armlabservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/labservices/armlabservices) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/labservices/armlabservices/v1.2.0/sdk/resourcemanager/labservices/armlabservices/) |\n| Resource Management - Lambdatesthyperexecute | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/lambdatesthyperexecute/armlambdatesthyperexecute/v1.0.0/sdk/resourcemanager/lambdatesthyperexecute/armlambdatesthyperexecute/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/lambdatesthyperexecute/armlambdatesthyperexecute) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/lambdatesthyperexecute/armlambdatesthyperexecute/v1.0.0/sdk/resourcemanager/lambdatesthyperexecute/armlambdatesthyperexecute/) |\n| Resource Management - Large Instance | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/largeinstance/armlargeinstance/v0.1.0/sdk/resourcemanager/largeinstance/armlargeinstance/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/largeinstance/armlargeinstance) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/largeinstance/armlargeinstance/v0.1.0/sdk/resourcemanager/largeinstance/armlargeinstance/) |\n| Resource Management - Links | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armlinks/v1.2.0/sdk/resourcemanager/resources/armlinks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armlinks) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armlinks/v1.2.0/sdk/resourcemanager/resources/armlinks/) |\n| Resource Management - Load Testing | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/loadtesting/armloadtesting/v1.2.0/sdk/resourcemanager/loadtesting/armloadtesting/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/loadtesting/armloadtesting) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/loadtesting/armloadtesting/v1.2.0/sdk/resourcemanager/loadtesting/armloadtesting/) |\n| Resource Management - Load Testing | module [1.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/loadtestservice/armloadtestservice/v1.0.1/sdk/resourcemanager/loadtestservice/armloadtestservice/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/loadtestservice/armloadtestservice) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/loadtestservice/armloadtestservice/v1.0.1/sdk/resourcemanager/loadtestservice/armloadtestservice/) |\n| Resource Management - Locks | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armlocks/v1.2.0/sdk/resourcemanager/resources/armlocks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armlocks) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armlocks/v1.2.0/sdk/resourcemanager/resources/armlocks/) |\n| Resource Management - Log Analytics | module [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/operationalinsights/armoperationalinsights/v2.0.2/sdk/resourcemanager/operationalinsights/armoperationalinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/operationalinsights/armoperationalinsights) | GitHub [2.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/operationalinsights/armoperationalinsights/v2.0.2/sdk/resourcemanager/operationalinsights/armoperationalinsights/) |\n| Resource Management - Logic Apps | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/logic/armlogic/v1.2.0/sdk/resourcemanager/logic/armlogic/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/logic/armlogic) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/logic/armlogic/v1.2.0/sdk/resourcemanager/logic/armlogic/) |\n| Resource Management - Logz | module [1.2.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/logz/armlogz/v1.2.1/sdk/resourcemanager/logz/armlogz/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/logz/armlogz) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/logz/armlogz/v1.2.1/sdk/resourcemanager/logz/armlogz/) |\n| Resource Management - M365 Security and Compliance | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/m365securityandcompliance/armm365securityandcompliance/v0.7.0/sdk/resourcemanager/m365securityandcompliance/armm365securityandcompliance/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/m365securityandcompliance/armm365securityandcompliance) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/m365securityandcompliance/armm365securityandcompliance/v0.7.0/sdk/resourcemanager/m365securityandcompliance/armm365securityandcompliance/) |\n| Resource Management - Machine Learning | module [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/machinelearning/armmachinelearning/v4.0.0/sdk/resourcemanager/machinelearning/armmachinelearning/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/machinelearning/armmachinelearning) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/machinelearning/armmachinelearning/v4.0.0/sdk/resourcemanager/machinelearning/armmachinelearning/) |\n| Resource Management - Machine Learning Services | module [1.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/machinelearningservices/armmachinelearningservices/v1.0.1/sdk/resourcemanager/machinelearningservices/armmachinelearningservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/machinelearningservices/armmachinelearningservices) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/machinelearningservices/armmachinelearningservices/v1.0.1/sdk/resourcemanager/machinelearningservices/armmachinelearningservices/) |\n| Resource Management - Maintenance | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maintenance/armmaintenance/v1.3.0/sdk/resourcemanager/maintenance/armmaintenance/)<br>module [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maintenance/armmaintenance/v1.4.0-beta.1/sdk/resourcemanager/maintenance/armmaintenance/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/maintenance/armmaintenance) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maintenance/armmaintenance/v1.3.0/sdk/resourcemanager/maintenance/armmaintenance/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maintenance/armmaintenance/v1.4.0-beta.1/sdk/resourcemanager/maintenance/armmaintenance/) |\n| Resource Management - Managed Applications | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armmanagedapplications/v1.2.0/sdk/resourcemanager/resources/armmanagedapplications/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armmanagedapplications) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armmanagedapplications/v1.2.0/sdk/resourcemanager/resources/armmanagedapplications/) |\n| Resource Management - Managed Applications | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/solutions/armmanagedapplications/v2.1.0/sdk/resourcemanager/solutions/armmanagedapplications/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/solutions/armmanagedapplications) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/solutions/armmanagedapplications/v2.1.0/sdk/resourcemanager/solutions/armmanagedapplications/) |\n| Resource Management - Managed Grafana | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dashboard/armdashboard/v2.0.0/sdk/resourcemanager/dashboard/armdashboard/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dashboard/armdashboard) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/dashboard/armdashboard/v2.0.0/sdk/resourcemanager/dashboard/armdashboard/) |\n| Resource Management - Managed Network | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managednetwork/armmanagednetwork/v0.3.0/sdk/resourcemanager/managednetwork/armmanagednetwork/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managednetwork/armmanagednetwork) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managednetwork/armmanagednetwork/v0.3.0/sdk/resourcemanager/managednetwork/armmanagednetwork/) |\n| Resource Management - Managed Network Fabric | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managednetworkfabric/armmanagednetworkfabric/v1.1.0/sdk/resourcemanager/managednetworkfabric/armmanagednetworkfabric/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managednetworkfabric/armmanagednetworkfabric) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managednetworkfabric/armmanagednetworkfabric/v1.1.0/sdk/resourcemanager/managednetworkfabric/armmanagednetworkfabric/) |\n| Resource Management - Managed Service Identity | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/msi/armmsi/v1.3.0/sdk/resourcemanager/msi/armmsi/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/msi/armmsi) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/msi/armmsi/v1.3.0/sdk/resourcemanager/msi/armmsi/) |\n| Resource Management - Managed Services | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managedservices/armmanagedservices/v0.7.0/sdk/resourcemanager/managedservices/armmanagedservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managedservices/armmanagedservices) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managedservices/armmanagedservices/v0.7.0/sdk/resourcemanager/managedservices/armmanagedservices/) |\n| Resource Management - Managedops | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managedops/armmanagedops/v0.1.0/sdk/resourcemanager/managedops/armmanagedops/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managedops/armmanagedops) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managedops/armmanagedops/v0.1.0/sdk/resourcemanager/managedops/armmanagedops/) |\n| Resource Management - Management Groups | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementgroups/armmanagementgroups/v1.2.0/sdk/resourcemanager/managementgroups/armmanagementgroups/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementgroups/armmanagementgroups/v2.0.0-beta.1/sdk/resourcemanager/managementgroups/armmanagementgroups/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementgroups/armmanagementgroups/v1.2.0/sdk/resourcemanager/managementgroups/armmanagementgroups/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementgroups/armmanagementgroups/v2.0.0-beta.1/sdk/resourcemanager/managementgroups/armmanagementgroups/) |\n| Resource Management - Management Partner | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementpartner/armmanagementpartner/v0.7.0/sdk/resourcemanager/managementpartner/armmanagementpartner/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementpartner/armmanagementpartner) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/managementpartner/armmanagementpartner/v0.7.0/sdk/resourcemanager/managementpartner/armmanagementpartner/) |\n| Resource Management - Maps | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maps/armmaps/v1.1.0/sdk/resourcemanager/maps/armmaps/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maps/armmaps/v2.0.0-beta.1/sdk/resourcemanager/maps/armmaps/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/maps/armmaps) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maps/armmaps/v1.1.0/sdk/resourcemanager/maps/armmaps/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/maps/armmaps/v2.0.0-beta.1/sdk/resourcemanager/maps/armmaps/) |\n| Resource Management - MariaDB | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mariadb/armmariadb/v1.2.0/sdk/resourcemanager/mariadb/armmariadb/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mariadb/armmariadb) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mariadb/armmariadb/v1.2.0/sdk/resourcemanager/mariadb/armmariadb/) |\n| Resource Management - Marketplace | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplace/armmarketplace/v1.2.0/sdk/resourcemanager/marketplace/armmarketplace/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplace/armmarketplace/v2.0.0-beta.1/sdk/resourcemanager/marketplace/armmarketplace/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/marketplace/armmarketplace) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplace/armmarketplace/v1.2.0/sdk/resourcemanager/marketplace/armmarketplace/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplace/armmarketplace/v2.0.0-beta.1/sdk/resourcemanager/marketplace/armmarketplace/) |\n| Resource Management - Marketplace Ordering | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplaceordering/armmarketplaceordering/v1.2.0/sdk/resourcemanager/marketplaceordering/armmarketplaceordering/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/marketplaceordering/armmarketplaceordering) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/marketplaceordering/armmarketplaceordering/v1.2.0/sdk/resourcemanager/marketplaceordering/armmarketplaceordering/) |\n| Resource Management - Media Services | module [3.4.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mediaservices/armmediaservices/v3.4.1/sdk/resourcemanager/mediaservices/armmediaservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mediaservices/armmediaservices) | GitHub [3.4.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mediaservices/armmediaservices/v3.4.1/sdk/resourcemanager/mediaservices/armmediaservices/) |\n| Resource Management - Migrate | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrate/armmigrate/v1.2.0/sdk/resourcemanager/migrate/armmigrate/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/migrate/armmigrate) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrate/armmigrate/v1.2.0/sdk/resourcemanager/migrate/armmigrate/) |\n| Resource Management - Migration Assessment | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrationassessment/armmigrationassessment/v0.1.0/sdk/resourcemanager/migrationassessment/armmigrationassessment/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/migrationassessment/armmigrationassessment) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrationassessment/armmigrationassessment/v0.1.0/sdk/resourcemanager/migrationassessment/armmigrationassessment/) |\n| Resource Management - Migration Discovery SAP | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrationdiscovery/armmigrationdiscoverysap/v0.1.0/sdk/resourcemanager/migrationdiscovery/armmigrationdiscoverysap/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/migrationdiscovery/armmigrationdiscoverysap) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/migrationdiscovery/armmigrationdiscoverysap/v0.1.0/sdk/resourcemanager/migrationdiscovery/armmigrationdiscoverysap/) |\n| Resource Management - Mixed Reality | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mixedreality/armmixedreality/v0.7.0/sdk/resourcemanager/mixedreality/armmixedreality/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mixedreality/armmixedreality) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mixedreality/armmixedreality/v0.7.0/sdk/resourcemanager/mixedreality/armmixedreality/) |\n| Resource Management - Mobile Network | module [4.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mobilenetwork/armmobilenetwork/v4.1.1/sdk/resourcemanager/mobilenetwork/armmobilenetwork/) |  | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mobilenetwork/armmobilenetwork/v4.1.1/sdk/resourcemanager/mobilenetwork/armmobilenetwork/) |\n| Resource Management - Mongo Cluster | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mongocluster/armmongocluster/v1.1.0/sdk/resourcemanager/mongocluster/armmongocluster/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mongocluster/armmongocluster) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mongocluster/armmongocluster/v1.1.0/sdk/resourcemanager/mongocluster/armmongocluster/) |\n| Resource Management - Mongodbatlas | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mongodbatlas/armmongodbatlas/v1.0.0/sdk/resourcemanager/mongodbatlas/armmongodbatlas/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mongodbatlas/armmongodbatlas) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mongodbatlas/armmongodbatlas/v1.0.0/sdk/resourcemanager/mongodbatlas/armmongodbatlas/) |\n| Resource Management - Monitor | module [0.11.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/monitor/armmonitor/v0.11.0/sdk/resourcemanager/monitor/armmonitor/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor) | GitHub [0.11.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/monitor/armmonitor/v0.11.0/sdk/resourcemanager/monitor/armmonitor/) |\n| Resource Management - MySQL | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysql/v1.2.0/sdk/resourcemanager/mysql/armmysql/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mysql/armmysql) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysql/v1.2.0/sdk/resourcemanager/mysql/armmysql/) |\n| Resource Management - MySQL Flexible Server | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysqlflexibleservers/v1.2.0/sdk/resourcemanager/mysql/armmysqlflexibleservers/)<br>module [2.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysqlflexibleservers/v2.0.0-beta.4/sdk/resourcemanager/mysql/armmysqlflexibleservers/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/mysql/armmysqlflexibleservers) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysqlflexibleservers/v1.2.0/sdk/resourcemanager/mysql/armmysqlflexibleservers/)<br>GitHub [2.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/mysql/armmysqlflexibleservers/v2.0.0-beta.4/sdk/resourcemanager/mysql/armmysqlflexibleservers/) |\n| Resource Management - Neon Postgres | module [1.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/neonpostgres/armneonpostgres/v1.0.1/sdk/resourcemanager/neonpostgres/armneonpostgres/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/neonpostgres/armneonpostgres) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/neonpostgres/armneonpostgres/v1.0.1/sdk/resourcemanager/neonpostgres/armneonpostgres/) |\n| Resource Management - Net App | module [10.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/netapp/armnetapp/v10.0.0/sdk/resourcemanager/netapp/armnetapp/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/netapp/armnetapp) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/netapp/armnetapp/v10.0.0/sdk/resourcemanager/netapp/armnetapp/) |\n| Resource Management - Network | module [9.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/network/armnetwork/v9.0.0/sdk/resourcemanager/network/armnetwork/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/network/armnetwork/v9.0.0/sdk/resourcemanager/network/armnetwork/) |\n| Resource Management - Network Analytics | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkanalytics/armnetworkanalytics/v1.0.0/sdk/resourcemanager/networkanalytics/armnetworkanalytics/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/networkanalytics/armnetworkanalytics) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkanalytics/armnetworkanalytics/v1.0.0/sdk/resourcemanager/networkanalytics/armnetworkanalytics/) |\n| Resource Management - Network Cloud | module [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkcloud/armnetworkcloud/v1.4.0/sdk/resourcemanager/networkcloud/armnetworkcloud/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/networkcloud/armnetworkcloud) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkcloud/armnetworkcloud/v1.4.0/sdk/resourcemanager/networkcloud/armnetworkcloud/) |\n| Resource Management - Network Function | module [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkfunction/armnetworkfunction/v2.2.0/sdk/resourcemanager/networkfunction/armnetworkfunction/)<br>module [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkfunction/armnetworkfunction/v3.0.0-beta.1/sdk/resourcemanager/networkfunction/armnetworkfunction/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/networkfunction/armnetworkfunction) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkfunction/armnetworkfunction/v2.2.0/sdk/resourcemanager/networkfunction/armnetworkfunction/)<br>GitHub [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/networkfunction/armnetworkfunction/v3.0.0-beta.1/sdk/resourcemanager/networkfunction/armnetworkfunction/) |\n| Resource Management - New Relic Observability | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/newrelic/armnewrelicobservability/v1.2.0/sdk/resourcemanager/newrelic/armnewrelicobservability/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/newrelic/armnewrelicobservability/v2.0.0-beta.1/sdk/resourcemanager/newrelic/armnewrelicobservability/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/newrelic/armnewrelicobservability) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/newrelic/armnewrelicobservability/v1.2.0/sdk/resourcemanager/newrelic/armnewrelicobservability/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/newrelic/armnewrelicobservability/v2.0.0-beta.1/sdk/resourcemanager/newrelic/armnewrelicobservability/) |\n| Resource Management - Nginx | module [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/nginx/armnginx/v4.0.0/sdk/resourcemanager/nginx/armnginx/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/nginx/armnginx) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/nginx/armnginx/v4.0.0/sdk/resourcemanager/nginx/armnginx/) |\n| Resource Management - Notification Hubs | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/notificationhubs/armnotificationhubs/v1.2.0/sdk/resourcemanager/notificationhubs/armnotificationhubs/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/notificationhubs/armnotificationhubs/v2.0.0-beta.1/sdk/resourcemanager/notificationhubs/armnotificationhubs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/notificationhubs/armnotificationhubs) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/notificationhubs/armnotificationhubs/v1.2.0/sdk/resourcemanager/notificationhubs/armnotificationhubs/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/notificationhubs/armnotificationhubs/v2.0.0-beta.1/sdk/resourcemanager/notificationhubs/armnotificationhubs/) |\n| Resource Management - Oep | module [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/oep/armoep/v0.6.0/sdk/resourcemanager/oep/armoep/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/oep/armoep) | GitHub [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/oep/armoep/v0.6.0/sdk/resourcemanager/oep/armoep/) |\n| Resource Management - Operations Management | module [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/operationsmanagement/armoperationsmanagement/v0.8.0/sdk/resourcemanager/operationsmanagement/armoperationsmanagement/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/operationsmanagement/armoperationsmanagement) | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/operationsmanagement/armoperationsmanagement/v0.8.0/sdk/resourcemanager/operationsmanagement/armoperationsmanagement/) |\n| Resource Management - Oracle Database | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/oracledatabase/armoracledatabase/v2.0.0/sdk/resourcemanager/oracledatabase/armoracledatabase/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/oracledatabase/armoracledatabase) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/oracledatabase/armoracledatabase/v2.0.0/sdk/resourcemanager/oracledatabase/armoracledatabase/) |\n| Resource Management - Orbital | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/orbital/armorbital/v2.1.0/sdk/resourcemanager/orbital/armorbital/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/orbital/armorbital) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/orbital/armorbital/v2.1.0/sdk/resourcemanager/orbital/armorbital/) |\n| Resource Management - Palo Alto Networks - Next Generation Firewall | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/v2.0.0/sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/paloaltonetworksngfw/armpanngfw) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/v2.0.0/sdk/resourcemanager/paloaltonetworksngfw/armpanngfw/) |\n| Resource Management - Peering | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/peering/armpeering/v1.2.0/sdk/resourcemanager/peering/armpeering/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/peering/armpeering) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/peering/armpeering/v1.2.0/sdk/resourcemanager/peering/armpeering/) |\n| Resource Management - Pinecone Vector DB | module [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/pineconevectordb/armpineconevectordb/v0.1.1/sdk/resourcemanager/pineconevectordb/armpineconevectordb/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/pineconevectordb/armpineconevectordb) | GitHub [0.1.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/pineconevectordb/armpineconevectordb/v0.1.1/sdk/resourcemanager/pineconevectordb/armpineconevectordb/) |\n| Resource Management - Planetarycomputer | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/planetarycomputer/armplanetarycomputer/v1.0.0/sdk/resourcemanager/planetarycomputer/armplanetarycomputer/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/planetarycomputer/armplanetarycomputer) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/planetarycomputer/armplanetarycomputer/v1.0.0/sdk/resourcemanager/planetarycomputer/armplanetarycomputer/) |\n| Resource Management - Playwright | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/playwright/armplaywright/v1.0.0/sdk/resourcemanager/playwright/armplaywright/)<br>module [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/playwright/armplaywright/v1.1.0-beta.1/sdk/resourcemanager/playwright/armplaywright/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/playwright/armplaywright) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/playwright/armplaywright/v1.0.0/sdk/resourcemanager/playwright/armplaywright/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/playwright/armplaywright/v1.1.0-beta.1/sdk/resourcemanager/playwright/armplaywright/) |\n| Resource Management - Playwright Testing | module [1.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/playwrighttesting/armplaywrighttesting/v1.0.2/sdk/resourcemanager/playwrighttesting/armplaywrighttesting/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/playwrighttesting/armplaywrighttesting) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/playwrighttesting/armplaywrighttesting/v1.0.2/sdk/resourcemanager/playwrighttesting/armplaywrighttesting/) |\n| Resource Management - Policy | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armpolicy/v1.0.0/sdk/resourcemanager/resources/armpolicy/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armpolicy) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armpolicy/v1.0.0/sdk/resourcemanager/resources/armpolicy/) |\n| Resource Management - Policy Insights | module [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/policyinsights/armpolicyinsights/v0.9.0/sdk/resourcemanager/policyinsights/armpolicyinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/policyinsights/armpolicyinsights) | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/policyinsights/armpolicyinsights/v0.9.0/sdk/resourcemanager/policyinsights/armpolicyinsights/) |\n| Resource Management - Portal | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/portal/armportal/v0.7.0/sdk/resourcemanager/portal/armportal/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/portal/armportal) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/portal/armportal/v0.7.0/sdk/resourcemanager/portal/armportal/) |\n| Resource Management - Portalservicescopilot | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/portalservicescopilot/armportalservicescopilot/v0.1.0/sdk/resourcemanager/portalservicescopilot/armportalservicescopilot/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/portalservicescopilot/armportalservicescopilot) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/portalservicescopilot/armportalservicescopilot/v0.1.0/sdk/resourcemanager/portalservicescopilot/armportalservicescopilot/) |\n| Resource Management - PostgreSQL | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresql/v1.2.0/sdk/resourcemanager/postgresql/armpostgresql/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/postgresql/armpostgresql) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresql/v1.2.0/sdk/resourcemanager/postgresql/armpostgresql/) |\n| Resource Management - PostgreSQL Flexible Server | module [5.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/v5.0.0/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/)<br>module [6.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/v6.0.0-beta.2/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/v5.0.0/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/)<br>GitHub [6.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/v6.0.0-beta.2/sdk/resourcemanager/postgresql/armpostgresqlflexibleservers/) |\n| Resource Management - PostgreSQL HSC | module [0.6.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresqlhsc/armpostgresqlhsc/v0.6.1/sdk/resourcemanager/postgresqlhsc/armpostgresqlhsc/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/postgresqlhsc/armpostgresqlhsc) | GitHub [0.6.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/postgresqlhsc/armpostgresqlhsc/v0.6.1/sdk/resourcemanager/postgresqlhsc/armpostgresqlhsc/) |\n| Resource Management - Power BI  Private Links | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbiprivatelinks/armpowerbiprivatelinks/v2.1.0/sdk/resourcemanager/powerbiprivatelinks/armpowerbiprivatelinks/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/powerbiprivatelinks/armpowerbiprivatelinks) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbiprivatelinks/armpowerbiprivatelinks/v2.1.0/sdk/resourcemanager/powerbiprivatelinks/armpowerbiprivatelinks/) |\n| Resource Management - Power BI Dedicated | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbidedicated/armpowerbidedicated/v1.2.0/sdk/resourcemanager/powerbidedicated/armpowerbidedicated/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/powerbidedicated/armpowerbidedicated) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbidedicated/armpowerbidedicated/v1.2.0/sdk/resourcemanager/powerbidedicated/armpowerbidedicated/) |\n| Resource Management - Power BI Embedded | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbiembedded/armpowerbiembedded/v1.2.0/sdk/resourcemanager/powerbiembedded/armpowerbiembedded/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/powerbiembedded/armpowerbiembedded) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerbiembedded/armpowerbiembedded/v1.2.0/sdk/resourcemanager/powerbiembedded/armpowerbiembedded/) |\n| Resource Management - Power Platform | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerplatform/armpowerplatform/v0.3.0/sdk/resourcemanager/powerplatform/armpowerplatform/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/powerplatform/armpowerplatform) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/powerplatform/armpowerplatform/v0.3.0/sdk/resourcemanager/powerplatform/armpowerplatform/) |\n| Resource Management - Previewalertrule | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/previewalertrule/armpreviewalertrule/v0.1.0/sdk/resourcemanager/previewalertrule/armpreviewalertrule/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/previewalertrule/armpreviewalertrule) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/previewalertrule/armpreviewalertrule/v0.1.0/sdk/resourcemanager/previewalertrule/armpreviewalertrule/) |\n| Resource Management - Private DNS | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/privatedns/armprivatedns/v1.3.0/sdk/resourcemanager/privatedns/armprivatedns/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/privatedns/armprivatedns/v1.3.0/sdk/resourcemanager/privatedns/armprivatedns/) |\n| Resource Management - Privatelinkscopes | module [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armprivatelinkscopes/v0.2.0/sdk/resourcemanager/kubernetesconfiguration/armprivatelinkscopes/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/kubernetesconfiguration/armprivatelinkscopes) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/kubernetesconfiguration/armprivatelinkscopes/v0.2.0/sdk/resourcemanager/kubernetesconfiguration/armprivatelinkscopes/) |\n| Resource Management - Programmableconnectivity | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/programmableconnectivity/armprogrammableconnectivity/v0.1.0/sdk/resourcemanager/programmableconnectivity/armprogrammableconnectivity/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/programmableconnectivity/armprogrammableconnectivity) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/programmableconnectivity/armprogrammableconnectivity/v0.1.0/sdk/resourcemanager/programmableconnectivity/armprogrammableconnectivity/) |\n| Resource Management - Prometheusrulegroups | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/prometheusrulegroups/armprometheusrulegroups/v0.1.0/sdk/resourcemanager/prometheusrulegroups/armprometheusrulegroups/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/prometheusrulegroups/armprometheusrulegroups) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/prometheusrulegroups/armprometheusrulegroups/v0.1.0/sdk/resourcemanager/prometheusrulegroups/armprometheusrulegroups/) |\n| Resource Management - Provider Hub | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/providerhub/armproviderhub/v2.0.0/sdk/resourcemanager/providerhub/armproviderhub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/providerhub/armproviderhub) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/providerhub/armproviderhub/v2.0.0/sdk/resourcemanager/providerhub/armproviderhub/) |\n| Resource Management - Purestorageblock | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purestorageblock/armpurestorageblock/v1.0.0/sdk/resourcemanager/purestorageblock/armpurestorageblock/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/purestorageblock/armpurestorageblock) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purestorageblock/armpurestorageblock/v1.0.0/sdk/resourcemanager/purestorageblock/armpurestorageblock/) |\n| Resource Management - Purview | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purview/armpurview/v1.2.0/sdk/resourcemanager/purview/armpurview/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purview/armpurview/v2.0.0-beta.1/sdk/resourcemanager/purview/armpurview/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/purview/armpurview) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purview/armpurview/v1.2.0/sdk/resourcemanager/purview/armpurview/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/purview/armpurview/v2.0.0-beta.1/sdk/resourcemanager/purview/armpurview/) |\n| Resource Management - Quantum | module [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/quantum/armquantum/v0.8.0/sdk/resourcemanager/quantum/armquantum/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/quantum/armquantum) | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/quantum/armquantum/v0.8.0/sdk/resourcemanager/quantum/armquantum/) |\n| Resource Management - Qumulo | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/liftrqumulo/armqumulo/v2.0.0/sdk/resourcemanager/liftrqumulo/armqumulo/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/liftrqumulo/armqumulo) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/liftrqumulo/armqumulo/v2.0.0/sdk/resourcemanager/liftrqumulo/armqumulo/) |\n| Resource Management - Quota | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/quota/armquota/v2.0.0/sdk/resourcemanager/quota/armquota/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/quota/armquota) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/quota/armquota/v2.0.0/sdk/resourcemanager/quota/armquota/) |\n| Resource Management - Recommender | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/compute/armrecommender/v0.1.0/sdk/resourcemanager/compute/armrecommender/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armrecommender) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/compute/armrecommender/v0.1.0/sdk/resourcemanager/compute/armrecommender/) |\n| Resource Management - Recovery Services | module [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservices/v2.1.0/sdk/resourcemanager/recoveryservices/armrecoveryservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservices) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservices/v2.1.0/sdk/resourcemanager/recoveryservices/armrecoveryservices/) |\n| Resource Management - Recovery Services Backup | module [4.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v4.2.0/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/)<br>module [5.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v5.0.0-beta.1/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v4.2.0/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/)<br>GitHub [5.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/v5.0.0-beta.1/sdk/resourcemanager/recoveryservices/armrecoveryservicesbackup/) |\n| Resource Management - Recovery Services Data Replication | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservicesdatareplication/armrecoveryservicesdatareplication/v1.0.0/sdk/resourcemanager/recoveryservicesdatareplication/armrecoveryservicesdatareplication/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservicesdatareplication/armrecoveryservicesdatareplication) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservicesdatareplication/armrecoveryservicesdatareplication/v1.0.0/sdk/resourcemanager/recoveryservicesdatareplication/armrecoveryservicesdatareplication/) |\n| Resource Management - Recovery Services Site Recovery | module [2.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/v2.4.0/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/)<br>module [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/v3.0.0-beta.1/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/v2.4.0/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/)<br>GitHub [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/v3.0.0-beta.1/sdk/resourcemanager/recoveryservices/armrecoveryservicessiterecovery/) |\n| Resource Management - Red Hat OpenShift | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redhatopenshift/armredhatopenshift/v2.0.0/sdk/resourcemanager/redhatopenshift/armredhatopenshift/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redhatopenshift/armredhatopenshift) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redhatopenshift/armredhatopenshift/v2.0.0/sdk/resourcemanager/redhatopenshift/armredhatopenshift/) |\n| Resource Management - Redis | module [3.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redis/armredis/v3.3.0/sdk/resourcemanager/redis/armredis/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redis/armredis) | GitHub [3.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redis/armredis/v3.3.0/sdk/resourcemanager/redis/armredis/) |\n| Resource Management - Redis Enterprise | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redisenterprise/armredisenterprise/v3.0.0/sdk/resourcemanager/redisenterprise/armredisenterprise/)<br>module [4.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redisenterprise/armredisenterprise/v4.0.0-beta.1/sdk/resourcemanager/redisenterprise/armredisenterprise/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redisenterprise/armredisenterprise/v3.0.0/sdk/resourcemanager/redisenterprise/armredisenterprise/)<br>GitHub [4.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/redisenterprise/armredisenterprise/v4.0.0-beta.1/sdk/resourcemanager/redisenterprise/armredisenterprise/) |\n| Resource Management - Relationships | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/relationships/armrelationships/v0.1.0/sdk/resourcemanager/relationships/armrelationships/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/relationships/armrelationships) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/relationships/armrelationships/v0.1.0/sdk/resourcemanager/relationships/armrelationships/) |\n| Resource Management - Relay | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/relay/armrelay/v1.2.0/sdk/resourcemanager/relay/armrelay/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/relay/armrelay) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/relay/armrelay/v1.2.0/sdk/resourcemanager/relay/armrelay/) |\n| Resource Management - Reservations | module [3.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/reservations/armreservations/v3.1.0/sdk/resourcemanager/reservations/armreservations/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/reservations/armreservations) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/reservations/armreservations/v3.1.0/sdk/resourcemanager/reservations/armreservations/) |\n| Resource Management - Resource Connector | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourceconnector/armresourceconnector/v1.1.0/sdk/resourcemanager/resourceconnector/armresourceconnector/)<br>module [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourceconnector/armresourceconnector/v1.2.0-beta.1/sdk/resourcemanager/resourceconnector/armresourceconnector/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourceconnector/armresourceconnector) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourceconnector/armresourceconnector/v1.1.0/sdk/resourcemanager/resourceconnector/armresourceconnector/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourceconnector/armresourceconnector/v1.2.0-beta.1/sdk/resourcemanager/resourceconnector/armresourceconnector/) |\n| Resource Management - Resource Graph | module [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcegraph/armresourcegraph/v0.9.0/sdk/resourcemanager/resourcegraph/armresourcegraph/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph) | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcegraph/armresourcegraph/v0.9.0/sdk/resourcemanager/resourcegraph/armresourcegraph/) |\n| Resource Management - Resource Health | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcehealth/armresourcehealth/v1.3.0/sdk/resourcemanager/resourcehealth/armresourcehealth/)<br>module [1.4.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcehealth/armresourcehealth/v1.4.0-beta.2/sdk/resourcemanager/resourcehealth/armresourcehealth/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcehealth/armresourcehealth) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcehealth/armresourcehealth/v1.3.0/sdk/resourcemanager/resourcehealth/armresourcehealth/)<br>GitHub [1.4.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcehealth/armresourcehealth/v1.4.0-beta.2/sdk/resourcemanager/resourcehealth/armresourcehealth/) |\n| Resource Management - Resource Mover | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcemover/armresourcemover/v1.3.0/sdk/resourcemanager/resourcemover/armresourcemover/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcemover/armresourcemover) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resourcemover/armresourcemover/v1.3.0/sdk/resourcemanager/resourcemover/armresourcemover/) |\n| Resource Management - Resources | module [3.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armresources/v3.0.1/sdk/resourcemanager/resources/armresources/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armresources/v3.0.1/sdk/resourcemanager/resources/armresources/) |\n| Resource Management - Saas | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/saas/armsaas/v0.7.0/sdk/resourcemanager/saas/armsaas/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/saas/armsaas) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/saas/armsaas/v0.7.0/sdk/resourcemanager/saas/armsaas/) |\n| Resource Management - Scheduler | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/scheduler/armscheduler/v1.2.0/sdk/resourcemanager/scheduler/armscheduler/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/scheduler/armscheduler) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/scheduler/armscheduler/v1.2.0/sdk/resourcemanager/scheduler/armscheduler/) |\n| Resource Management - Scvmm | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/scvmm/armscvmm/v1.0.0/sdk/resourcemanager/scvmm/armscvmm/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/scvmm/armscvmm) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/scvmm/armscvmm/v1.0.0/sdk/resourcemanager/scvmm/armscvmm/) |\n| Resource Management - Security | module [0.14.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/security/armsecurity/v0.14.0/sdk/resourcemanager/security/armsecurity/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/security/armsecurity) | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/security/armsecurity/v0.14.0/sdk/resourcemanager/security/armsecurity/) |\n| Resource Management - Security DevOps | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securitydevops/armsecuritydevops/v0.3.0/sdk/resourcemanager/securitydevops/armsecuritydevops/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/securitydevops/armsecuritydevops) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securitydevops/armsecuritydevops/v0.3.0/sdk/resourcemanager/securitydevops/armsecuritydevops/) |\n| Resource Management - Security Insights | module [0.2.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsight/armsecurityinsight/v0.2.1/sdk/resourcemanager/securityinsight/armsecurityinsight/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/securityinsight/armsecurityinsight) | GitHub [0.2.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsight/armsecurityinsight/v0.2.1/sdk/resourcemanager/securityinsight/armsecurityinsight/) |\n| Resource Management - Security Insights | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsights/armsecurityinsights/v1.2.0/sdk/resourcemanager/securityinsights/armsecurityinsights/)<br>module [2.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsights/armsecurityinsights/v2.0.0-beta.4/sdk/resourcemanager/securityinsights/armsecurityinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/securityinsights/armsecurityinsights) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsights/armsecurityinsights/v1.2.0/sdk/resourcemanager/securityinsights/armsecurityinsights/)<br>GitHub [2.0.0-beta.4](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/securityinsights/armsecurityinsights/v2.0.0-beta.4/sdk/resourcemanager/securityinsights/armsecurityinsights/) |\n| Resource Management - Self Help | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/selfhelp/armselfhelp/v1.1.0/sdk/resourcemanager/selfhelp/armselfhelp/)<br>module [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/selfhelp/armselfhelp/v2.0.0-beta.5/sdk/resourcemanager/selfhelp/armselfhelp/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/selfhelp/armselfhelp) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/selfhelp/armselfhelp/v1.1.0/sdk/resourcemanager/selfhelp/armselfhelp/)<br>GitHub [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/selfhelp/armselfhelp/v2.0.0-beta.5/sdk/resourcemanager/selfhelp/armselfhelp/) |\n| Resource Management - Serial Console | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/serialconsole/armserialconsole/v1.2.0/sdk/resourcemanager/serialconsole/armserialconsole/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/serialconsole/armserialconsole/v2.0.0-beta.1/sdk/resourcemanager/serialconsole/armserialconsole/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/serialconsole/armserialconsole) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/serialconsole/armserialconsole/v1.2.0/sdk/resourcemanager/serialconsole/armserialconsole/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/serialconsole/armserialconsole/v2.0.0-beta.1/sdk/resourcemanager/serialconsole/armserialconsole/) |\n| Resource Management - Service Bus | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicebus/armservicebus/v1.2.0/sdk/resourcemanager/servicebus/armservicebus/)<br>module [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicebus/armservicebus/v2.0.0-beta.3/sdk/resourcemanager/servicebus/armservicebus/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicebus/armservicebus) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicebus/armservicebus/v1.2.0/sdk/resourcemanager/servicebus/armservicebus/)<br>GitHub [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicebus/armservicebus/v2.0.0-beta.3/sdk/resourcemanager/servicebus/armservicebus/) |\n| Resource Management - Service Fabric | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabric/armservicefabric/v2.0.0/sdk/resourcemanager/servicefabric/armservicefabric/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicefabric/armservicefabric) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabric/armservicefabric/v2.0.0/sdk/resourcemanager/servicefabric/armservicefabric/) |\n| Resource Management - Service Fabric Managed Clusters | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabricmanagedclusters/armservicefabricmanagedclusters/v1.0.0/sdk/resourcemanager/servicefabricmanagedclusters/armservicefabricmanagedclusters/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicefabricmanagedclusters/armservicefabricmanagedclusters) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabricmanagedclusters/armservicefabricmanagedclusters/v1.0.0/sdk/resourcemanager/servicefabricmanagedclusters/armservicefabricmanagedclusters/) |\n| Resource Management - Service Fabric Mesh | module [0.6.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabricmesh/armservicefabricmesh/v0.6.2/sdk/resourcemanager/servicefabricmesh/armservicefabricmesh/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicefabricmesh/armservicefabricmesh) | GitHub [0.6.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicefabricmesh/armservicefabricmesh/v0.6.2/sdk/resourcemanager/servicefabricmesh/armservicefabricmesh/) |\n| Resource Management - Service Linker | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicelinker/armservicelinker/v1.2.0/sdk/resourcemanager/servicelinker/armservicelinker/)<br>module [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicelinker/armservicelinker/v2.0.0-beta.2/sdk/resourcemanager/servicelinker/armservicelinker/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicelinker/armservicelinker) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicelinker/armservicelinker/v1.2.0/sdk/resourcemanager/servicelinker/armservicelinker/)<br>GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicelinker/armservicelinker/v2.0.0-beta.2/sdk/resourcemanager/servicelinker/armservicelinker/) |\n| Resource Management - Servicegroups | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicegroups/armservicegroups/v0.1.0/sdk/resourcemanager/servicegroups/armservicegroups/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicegroups/armservicegroups) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicegroups/armservicegroups/v0.1.0/sdk/resourcemanager/servicegroups/armservicegroups/) |\n| Resource Management - Servicenetworking | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicenetworking/armservicenetworking/v1.1.0/sdk/resourcemanager/servicenetworking/armservicenetworking/)<br>module [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicenetworking/armservicenetworking/v1.2.0-beta.1/sdk/resourcemanager/servicenetworking/armservicenetworking/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/servicenetworking/armservicenetworking) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicenetworking/armservicenetworking/v1.1.0/sdk/resourcemanager/servicenetworking/armservicenetworking/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/servicenetworking/armservicenetworking/v1.2.0-beta.1/sdk/resourcemanager/servicenetworking/armservicenetworking/) |\n| Resource Management - Signalr | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/signalr/armsignalr/v1.2.0/sdk/resourcemanager/signalr/armsignalr/)<br>module [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/signalr/armsignalr/v1.3.0-beta.1/sdk/resourcemanager/signalr/armsignalr/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/signalr/armsignalr) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/signalr/armsignalr/v1.2.0/sdk/resourcemanager/signalr/armsignalr/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/signalr/armsignalr/v1.3.0-beta.1/sdk/resourcemanager/signalr/armsignalr/) |\n| Resource Management - Sitemanager | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sitemanager/armsitemanager/v1.0.0/sdk/resourcemanager/sitemanager/armsitemanager/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sitemanager/armsitemanager) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sitemanager/armsitemanager/v1.0.0/sdk/resourcemanager/sitemanager/armsitemanager/) |\n| Resource Management - Slis | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/monitor/armslis/v0.1.0/sdk/resourcemanager/monitor/armslis/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armslis) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/monitor/armslis/v0.1.0/sdk/resourcemanager/monitor/armslis/) |\n| Resource Management - Sphere | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sphere/armsphere/v1.0.0/sdk/resourcemanager/sphere/armsphere/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sphere/armsphere) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sphere/armsphere/v1.0.0/sdk/resourcemanager/sphere/armsphere/) |\n| Resource Management - Spring App Discovery | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/springappdiscovery/armspringappdiscovery/v0.1.0/sdk/resourcemanager/springappdiscovery/armspringappdiscovery/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/springappdiscovery/armspringappdiscovery) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/springappdiscovery/armspringappdiscovery/v0.1.0/sdk/resourcemanager/springappdiscovery/armspringappdiscovery/) |\n| Resource Management - SQL | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sql/armsql/v1.2.0/sdk/resourcemanager/sql/armsql/)<br>module [2.0.0-beta.7](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sql/armsql/v2.0.0-beta.7/sdk/resourcemanager/sql/armsql/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sql/armsql/v1.2.0/sdk/resourcemanager/sql/armsql/)<br>GitHub [2.0.0-beta.7](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sql/armsql/v2.0.0-beta.7/sdk/resourcemanager/sql/armsql/) |\n| Resource Management - SQL Virtual Machine | module [0.10.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sqlvirtualmachine/armsqlvirtualmachine/v0.10.0/sdk/resourcemanager/sqlvirtualmachine/armsqlvirtualmachine/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sqlvirtualmachine/armsqlvirtualmachine) | GitHub [0.10.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/sqlvirtualmachine/armsqlvirtualmachine/v0.10.0/sdk/resourcemanager/sqlvirtualmachine/armsqlvirtualmachine/) |\n| Resource Management - Standby Pool | module [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/standbypool/armstandbypool/v2.0.0/sdk/resourcemanager/standbypool/armstandbypool/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/standbypool/armstandbypool) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/standbypool/armstandbypool/v2.0.0/sdk/resourcemanager/standbypool/armstandbypool/) |\n| Resource Management - Storage | module [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storage/armstorage/v3.0.0/sdk/resourcemanager/storage/armstorage/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storage/armstorage/v3.0.0/sdk/resourcemanager/storage/armstorage/) |\n| Resource Management - Storage Actions | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storageactions/armstorageactions/v1.0.0/sdk/resourcemanager/storageactions/armstorageactions/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storageactions/armstorageactions) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storageactions/armstorageactions/v1.0.0/sdk/resourcemanager/storageactions/armstorageactions/) |\n| Resource Management - Storage Cache | module [4.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagecache/armstoragecache/v4.2.0/sdk/resourcemanager/storagecache/armstoragecache/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storagecache/armstoragecache) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagecache/armstoragecache/v4.2.0/sdk/resourcemanager/storagecache/armstoragecache/) |\n| Resource Management - Storage Import/Export | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storageimportexport/armstorageimportexport/v0.7.0/sdk/resourcemanager/storageimportexport/armstorageimportexport/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storageimportexport/armstorageimportexport) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storageimportexport/armstorageimportexport/v0.7.0/sdk/resourcemanager/storageimportexport/armstorageimportexport/) |\n| Resource Management - Storage Mover | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagemover/armstoragemover/v2.3.0/sdk/resourcemanager/storagemover/armstoragemover/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storagemover/armstoragemover) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagemover/armstoragemover/v2.3.0/sdk/resourcemanager/storagemover/armstoragemover/) |\n| Resource Management - Storage Pool | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagepool/armstoragepool/v1.2.0/sdk/resourcemanager/storagepool/armstoragepool/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storagepool/armstoragepool) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagepool/armstoragepool/v1.2.0/sdk/resourcemanager/storagepool/armstoragepool/) |\n| Resource Management - Storage Sync | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagesync/armstoragesync/v1.2.0/sdk/resourcemanager/storagesync/armstoragesync/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storagesync/armstoragesync) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagesync/armstoragesync/v1.2.0/sdk/resourcemanager/storagesync/armstoragesync/) |\n| Resource Management - Storagediscovery | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagediscovery/armstoragediscovery/v1.0.0/sdk/resourcemanager/storagediscovery/armstoragediscovery/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storagediscovery/armstoragediscovery) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storagediscovery/armstoragediscovery/v1.0.0/sdk/resourcemanager/storagediscovery/armstoragediscovery/) |\n| Resource Management - StorSimple 1200 series | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storsimple1200series/armstorsimple1200series/v1.2.0/sdk/resourcemanager/storsimple1200series/armstorsimple1200series/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storsimple1200series/armstorsimple1200series) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storsimple1200series/armstorsimple1200series/v1.2.0/sdk/resourcemanager/storsimple1200series/armstorsimple1200series/) |\n| Resource Management - StorSimple 8000 series | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storsimple8000series/armstorsimple8000series/v1.2.0/sdk/resourcemanager/storsimple8000series/armstorsimple8000series/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storsimple8000series/armstorsimple8000series) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/storsimple8000series/armstorsimple8000series/v1.2.0/sdk/resourcemanager/storsimple8000series/armstorsimple8000series/) |\n| Resource Management - Stream Analytics | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/streamanalytics/armstreamanalytics/v1.2.0/sdk/resourcemanager/streamanalytics/armstreamanalytics/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/streamanalytics/armstreamanalytics/v2.0.0-beta.1/sdk/resourcemanager/streamanalytics/armstreamanalytics/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/streamanalytics/armstreamanalytics) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/streamanalytics/armstreamanalytics/v1.2.0/sdk/resourcemanager/streamanalytics/armstreamanalytics/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/streamanalytics/armstreamanalytics/v2.0.0-beta.1/sdk/resourcemanager/streamanalytics/armstreamanalytics/) |\n| Resource Management - Subscriptions | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armsubscriptions/v1.3.0/sdk/resourcemanager/resources/armsubscriptions/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armsubscriptions) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armsubscriptions/v1.3.0/sdk/resourcemanager/resources/armsubscriptions/) |\n| Resource Management - Subscriptions | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/subscription/armsubscription/v1.2.0/sdk/resourcemanager/subscription/armsubscription/)<br>module [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/subscription/armsubscription/v2.0.0-beta.1/sdk/resourcemanager/subscription/armsubscription/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/subscription/armsubscription/v1.2.0/sdk/resourcemanager/subscription/armsubscription/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/subscription/armsubscription/v2.0.0-beta.1/sdk/resourcemanager/subscription/armsubscription/) |\n| Resource Management - Support | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/support/armsupport/v1.3.0/sdk/resourcemanager/support/armsupport/)<br>module [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/support/armsupport/v2.0.0-beta.3/sdk/resourcemanager/support/armsupport/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/support/armsupport) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/support/armsupport/v1.3.0/sdk/resourcemanager/support/armsupport/)<br>GitHub [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/support/armsupport/v2.0.0-beta.3/sdk/resourcemanager/support/armsupport/) |\n| Resource Management - Synapse Analytics | module [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/synapse/armsynapse/v0.8.0/sdk/resourcemanager/synapse/armsynapse/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/synapse/armsynapse) | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/synapse/armsynapse/v0.8.0/sdk/resourcemanager/synapse/armsynapse/) |\n| Resource Management - Template Specs | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armtemplatespecs/v1.2.0/sdk/resourcemanager/resources/armtemplatespecs/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armtemplatespecs) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/resources/armtemplatespecs/v1.2.0/sdk/resourcemanager/resources/armtemplatespecs/) |\n| Resource Management - Tenantactivitylogalerts | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/tenantactivitylogalerts/armtenantactivitylogalerts/v0.1.0/sdk/resourcemanager/tenantactivitylogalerts/armtenantactivitylogalerts/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/tenantactivitylogalerts/armtenantactivitylogalerts) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/tenantactivitylogalerts/armtenantactivitylogalerts/v0.1.0/sdk/resourcemanager/tenantactivitylogalerts/armtenantactivitylogalerts/) |\n| Resource Management - Terraform | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/terraform/armterraform/v0.1.0/sdk/resourcemanager/terraform/armterraform/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/terraform/armterraform) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/terraform/armterraform/v0.1.0/sdk/resourcemanager/terraform/armterraform/) |\n| Resource Management - Test Base | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/testbase/armtestbase/v0.7.0/sdk/resourcemanager/testbase/armtestbase/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/testbase/armtestbase) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/testbase/armtestbase/v0.7.0/sdk/resourcemanager/testbase/armtestbase/) |\n| Resource Management - Time Series Insights | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/timeseriesinsights/armtimeseriesinsights/v1.2.0/sdk/resourcemanager/timeseriesinsights/armtimeseriesinsights/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/timeseriesinsights/armtimeseriesinsights) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/timeseriesinsights/armtimeseriesinsights/v1.2.0/sdk/resourcemanager/timeseriesinsights/armtimeseriesinsights/) |\n| Resource Management - Traffic Manager | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/trafficmanager/armtrafficmanager/v1.3.0/sdk/resourcemanager/trafficmanager/armtrafficmanager/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/trafficmanager/armtrafficmanager) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/trafficmanager/armtrafficmanager/v1.3.0/sdk/resourcemanager/trafficmanager/armtrafficmanager/) |\n| Resource Management - Trusted Signing | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/trustedsigning/armtrustedsigning/v0.1.0/sdk/resourcemanager/trustedsigning/armtrustedsigning/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/trustedsigning/armtrustedsigning) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/trustedsigning/armtrustedsigning/v0.1.0/sdk/resourcemanager/trustedsigning/armtrustedsigning/) |\n| Resource Management - Video Analyzer | module [0.4.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/videoanalyzer/armvideoanalyzer/v0.4.2/sdk/resourcemanager/videoanalyzer/armvideoanalyzer/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/videoanalyzer/armvideoanalyzer) | GitHub [0.4.2](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/videoanalyzer/armvideoanalyzer/v0.4.2/sdk/resourcemanager/videoanalyzer/armvideoanalyzer/) |\n| Resource Management - Virtual Machine Image Builder | module [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/virtualmachineimagebuilder/armvirtualmachineimagebuilder/v2.3.0/sdk/resourcemanager/virtualmachineimagebuilder/armvirtualmachineimagebuilder/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/virtualmachineimagebuilder/armvirtualmachineimagebuilder) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/virtualmachineimagebuilder/armvirtualmachineimagebuilder/v2.3.0/sdk/resourcemanager/virtualmachineimagebuilder/armvirtualmachineimagebuilder/) |\n| Resource Management - Visual Studio | module [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/visualstudio/armvisualstudio/v0.6.0/sdk/resourcemanager/visualstudio/armvisualstudio/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/visualstudio/armvisualstudio) | GitHub [0.6.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/visualstudio/armvisualstudio/v0.6.0/sdk/resourcemanager/visualstudio/armvisualstudio/) |\n| Resource Management - VMWare Cloud Simple | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/vmwarecloudsimple/armvmwarecloudsimple/v1.2.0/sdk/resourcemanager/vmwarecloudsimple/armvmwarecloudsimple/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/vmwarecloudsimple/armvmwarecloudsimple) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/vmwarecloudsimple/armvmwarecloudsimple/v1.2.0/sdk/resourcemanager/vmwarecloudsimple/armvmwarecloudsimple/) |\n| Resource Management - Voice Services | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/voiceservices/armvoiceservices/v1.1.0/sdk/resourcemanager/voiceservices/armvoiceservices/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/voiceservices/armvoiceservices) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/voiceservices/armvoiceservices/v1.1.0/sdk/resourcemanager/voiceservices/armvoiceservices/) |\n| Resource Management - Web | module [0.2.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/web/armweb/v0.2.1/sdk/resourcemanager/web/armweb/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/web/armweb) | GitHub [0.2.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/web/armweb/v0.2.1/sdk/resourcemanager/web/armweb/) |\n| Resource Management - Web PubSub | module [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/webpubsub/armwebpubsub/v1.3.0/sdk/resourcemanager/webpubsub/armwebpubsub/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/webpubsub/armwebpubsub) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/webpubsub/armwebpubsub/v1.3.0/sdk/resourcemanager/webpubsub/armwebpubsub/) |\n| Resource Management - Weights & Biases | module [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/weightsandbiases/armweightsandbiases/v0.1.0/sdk/resourcemanager/weightsandbiases/armweightsandbiases/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/weightsandbiases/armweightsandbiases) | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/weightsandbiases/armweightsandbiases/v0.1.0/sdk/resourcemanager/weightsandbiases/armweightsandbiases/) |\n| Resource Management - Window SESU | module [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/windowsesu/armwindowsesu/v0.7.0/sdk/resourcemanager/windowsesu/armwindowsesu/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/windowsesu/armwindowsesu) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/windowsesu/armwindowsesu/v0.7.0/sdk/resourcemanager/windowsesu/armwindowsesu/) |\n| Resource Management - Windows IoT | module [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/windowsiot/armwindowsiot/v1.2.0/sdk/resourcemanager/windowsiot/armwindowsiot/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/windowsiot/armwindowsiot) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/windowsiot/armwindowsiot/v1.2.0/sdk/resourcemanager/windowsiot/armwindowsiot/) |\n| Resource Management - Workload Monitor | module [0.5.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadmonitor/armworkloadmonitor/v0.5.1/sdk/resourcemanager/workloadmonitor/armworkloadmonitor/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/workloadmonitor/armworkloadmonitor) | GitHub [0.5.1](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadmonitor/armworkloadmonitor/v0.5.1/sdk/resourcemanager/workloadmonitor/armworkloadmonitor/) |\n| Resource Management - Workloadorchestration | module [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadorchestration/armworkloadorchestration/v0.3.0/sdk/resourcemanager/workloadorchestration/armworkloadorchestration/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/workloadorchestration/armworkloadorchestration) | GitHub [0.3.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadorchestration/armworkloadorchestration/v0.3.0/sdk/resourcemanager/workloadorchestration/armworkloadorchestration/) |\n| Resource Management - Workloads | module [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloads/armworkloads/v1.1.0/sdk/resourcemanager/workloads/armworkloads/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/workloads/armworkloads) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloads/armworkloads/v1.1.0/sdk/resourcemanager/workloads/armworkloads/) |\n| Resource Management - Workloads SAP Virtual Instance | module [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadssapvirtualinstance/armworkloadssapvirtualinstance/v1.0.0/sdk/resourcemanager/workloadssapvirtualinstance/armworkloadssapvirtualinstance/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/workloadssapvirtualinstance/armworkloadssapvirtualinstance) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/workloadssapvirtualinstance/armworkloadssapvirtualinstance/v1.0.0/sdk/resourcemanager/workloadssapvirtualinstance/armworkloadssapvirtualinstance/) |\n| Resource Manager Internal | module [3.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/internal/v3.2.0/sdk/resourcemanager/internal/) | [docs](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal) | GitHub [3.2.0](https://github.com/Azure/azure-sdk-for-go/tree/sdk/resourcemanager/internal/v3.2.0/sdk/resourcemanager/internal/) |\n"
  },
  {
    "path": "articles/includes/java-all.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| JDBC Authentication Plugin for MySQL | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-identity-providers-jdbc-mysql/1.0.0-beta.1) | [docs](/java/api/overview/azure/identity-providers-jdbc-mysql-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity-extensions) |\n| JDBC Authentication Plugin for PostgreSQL | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-identity-providers-jdbc-postgresql/1.0.0-beta.1) | [docs](/java/api/overview/azure/identity-providers-jdbc-postgresql-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity-extensions) |\n| Token-as-password Authentication Core Library | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-identity-providers-core/1.0.0-beta.1) | [docs](/java/api/overview/azure/identity-providers-core-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity-extensions) |\n| Token-as-password Authentication Extensions | Maven [1.2.8](https://central.sonatype.com/artifact/com.azure/azure-identity-extensions/1.2.8) | [docs](/java/api/overview/azure/identity-extensions-readme) | GitHub [1.2.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-identity-extensions_1.2.8/sdk/identity/azure-identity-extensions/) |\n| AI Agents | Maven [2.0.1](https://central.sonatype.com/artifact/com.azure/azure-ai-agents/2.0.1) | [docs](/java/api/overview/azure/ai-agents-readme) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-agents_2.0.1/sdk/ai/azure-ai-agents/) |\n| AI Agents Persistent | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-ai-agents-persistent/1.0.0-beta.2) | [docs](/java/api/overview/azure/ai-agents-persistent-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-agents-persistent_1.0.0-beta.2/sdk/ai/azure-ai-agents-persistent/) |\n| AI Projects | Maven [2.0.1](https://central.sonatype.com/artifact/com.azure/azure-ai-projects/2.0.1) | [docs](/java/api/overview/azure/ai-projects-readme) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-projects_2.0.1/sdk/ai/azure-ai-projects/) |\n| App Configuration | Maven [1.9.2](https://central.sonatype.com/artifact/com.azure/azure-data-appconfiguration/1.9.2) | [docs](/java/api/overview/azure/data-appconfiguration-readme) | GitHub [1.9.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-appconfiguration_1.9.2/sdk/appconfiguration/azure-data-appconfiguration/) |\n| Attestation | Maven [1.1.39](https://central.sonatype.com/artifact/com.azure/azure-security-attestation/1.1.39) | [docs](/java/api/overview/azure/security-attestation-readme) | GitHub [1.1.39](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-attestation_1.1.39/sdk/attestation/azure-security-attestation/) |\n| Azure AI Inference | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-ai-inference/1.0.0-beta.5) | [docs](/java/api/overview/azure/ai-inference-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-inference_1.0.0-beta.5/sdk/ai/azure-ai-inference/) |\n| Azure AI Search | Maven [12.0.0](https://central.sonatype.com/artifact/com.azure/azure-search-documents/12.0.0) | [docs](/java/api/overview/azure/search-documents-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-search-documents_12.0.0/sdk/search/azure-search-documents/) |\n| Azure AI Transcription | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-ai-speech-transcription/1.0.0-beta.3) | [docs](/java/api/overview/azure/ai-speech-transcription-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-speech-transcription_1.0.0-beta.3/sdk/transcription/azure-ai-speech-transcription/) |\n| Azure Blob Storage Checkpoint Store | Maven [1.21.6](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventhubs-checkpointstore-blob/1.21.6) | [docs](/java/api/overview/azure/messaging-eventhubs-checkpointstore-blob-readme) | GitHub [1.21.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-eventhubs-checkpointstore-blob_1.21.6/sdk/eventhubs/azure-messaging-eventhubs-checkpointstore-blob/) |\n| Azure Maps Geolocation | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-maps-geolocation/1.0.0-beta.3) | [docs](/java/api/overview/azure/maps-geolocation-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-geolocation_1.0.0-beta.3/sdk/maps/azure-maps-geolocation/) |\n| Azure Maps TimeZone | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-maps-timezone/1.0.0-beta.2) | [docs](/java/api/overview/azure/maps-timezone-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-timezone_1.0.0-beta.2/sdk/maps/azure-maps-timezone/) |\n| Azure Maps Traffic | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-maps-traffic/1.0.0-beta.1) | [docs](/java/api/overview/azure/maps-traffic-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-traffic_1.0.0-beta.1/sdk/maps/azure-maps-traffic/) |\n| Azure Maps Weather | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-maps-weather/1.0.0-beta.3) | [docs](/java/api/overview/azure/maps-weather-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-weather_1.0.0-beta.3/sdk/maps/azure-maps-weather/) |\n| Azure Redis Checkpoint Store | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventhubs-checkpointstore-jedis/1.0.0-beta.4) | [docs](/java/api/overview/azure/messaging-eventhubs-checkpointstore-jedis-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-messaging-eventhubs-checkpointstore-jedis_1.0.0-beta.4/sdk/eventhubs/azure-messaging-eventhubs-checkpointstore-jedis/) |\n| Azure SDK Template | Maven [1.0.1-beta.5657548](https://central.sonatype.com/artifact/com.azure.v2/azure-sdk-template/1.0.1-beta.5657548) | [docs](/java/api/overview/azure/sdk-template-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.1-beta.5657548](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-sdk-template_1.0.1-beta.5657548/sdk/template-v2/azure-sdk-template/) |\n| Azure SDK Template Three | Maven [1.0.0-beta.5657548](https://central.sonatype.com/artifact/com.azure.v2/azure-sdk-template-three/1.0.0-beta.5657548) | [docs](/java/api/overview/azure/sdk-template-three-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5657548](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-sdk-template-three_1.0.0-beta.5657548/sdk/template-v2/azure-sdk-template-three/) |\n| Azure SDK Template Two | Maven [1.0.0-beta.5657548](https://central.sonatype.com/artifact/com.azure.v2/azure-sdk-template-two/1.0.0-beta.5657548) | [docs](/java/api/overview/azure/sdk-template-two-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5657548](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-sdk-template-two_1.0.0-beta.5657548/sdk/template-v2/azure-sdk-template-two/) |\n| azure-core-http-jdk-httpclient | Maven [1.1.4](https://central.sonatype.com/artifact/com.azure/azure-core-http-jdk-httpclient/1.1.4) | [docs](/java/api/overview/azure/core-http-jdk-httpclient-readme) | GitHub [1.1.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-http-jdk-httpclient_1.1.4/sdk/core/azure-core-http-jdk-httpclient/) |\n| azure-core-http-vertx | Maven [1.1.4](https://central.sonatype.com/artifact/com.azure/azure-core-http-vertx/1.1.4) | [docs](/java/api/overview/azure/core-http-vertx-readme) | GitHub [1.1.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-http-vertx_1.1.4/sdk/core/azure-core-http-vertx/) |\n| azure-core-metrics-opentelemetry | Maven [1.0.0-beta.36](https://central.sonatype.com/artifact/com.azure/azure-core-metrics-opentelemetry/1.0.0-beta.36) | [docs](/java/api/overview/azure/core-metrics-opentelemetry-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.36](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-metrics-opentelemetry_1.0.0-beta.36/sdk/core/azure-core-metrics-opentelemetry/) |\n| azure-json | Maven [1.5.1](https://central.sonatype.com/artifact/com.azure/azure-json/1.5.1) | [docs](/java/api/overview/azure/json-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-json_1.5.1/sdk/serialization/azure-json/) |\n| azure-sdk-archetype | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.tools/azure-sdk-archetype/1.0.0) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-sdk-archetype_1.0.0/sdk/tools/azure-sdk-archetype/) |\n| azure-sdk-build-tool | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.tools/azure-sdk-build-tool/1.0.0) | [docs](/java/api/overview/azure/sdk-build-tool-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-sdk-build-tool_1.0.0/sdk/tools/azure-sdk-build-tool/) |\n| azure-xml | Maven [1.2.1](https://central.sonatype.com/artifact/com.azure/azure-xml/1.2.1) | [docs](/java/api/overview/azure/xml-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-xml_1.2.1/sdk/serialization/azure-xml/) |\n| Client Core | Maven [1.0.0-beta.11](https://central.sonatype.com/artifact/io.clientcore/core/1.0.0-beta.11) | [docs](/java/api/overview/azure/core-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.11](https://github.com/Azure/azure-sdk-for-java/tree/core_1.0.0-beta.11/sdk/clientcore/core/) |\n| Client Core Annotation Processor | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/io.clientcore/annotation-processor/1.0.0-beta.4) |  | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/annotation-processor_1.0.0-beta.4/sdk/clientcore/annotation-processor/) |\n| Client Core HTTP OkHttp3 | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/io.clientcore/http-okhttp3/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/http-okhttp3_1.0.0-beta.2/sdk/clientcore/http-okhttp3/) |\n| Client Core Linting Extensions | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/io.clientcore/linting-extensions/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+linting-extensions_1.0.0-beta.2/sdk/tools/linting-extensions/) |\n| Communication Call Automation | Maven [1.6.2](https://central.sonatype.com/artifact/com.azure/azure-communication-callautomation/1.6.2) | [docs](/java/api/overview/azure/communication-callautomation-readme) | GitHub [1.6.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-callautomation_1.6.2/sdk/communication/azure-communication-callautomation/) |\n| Communication Chat | Maven [1.6.6](https://central.sonatype.com/artifact/com.azure/azure-communication-chat/1.6.6) | [docs](/java/api/overview/azure/communication-chat-readme) | GitHub [1.6.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-chat_1.6.6/sdk/communication/azure-communication-chat/) |\n| Communication Common | Maven [1.4.6](https://central.sonatype.com/artifact/com.azure/azure-communication-common/1.4.6)<br>Maven [2.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-communication-common/2.0.0-beta.1) | [docs](/java/api/overview/azure/communication-common-readme) | GitHub [1.4.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-common_1.4.6/sdk/communication/azure-communication-common/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-common_2.0.0-beta.1/sdk/communication/azure-communication-common/) |\n| Communication Email | Maven [1.1.3](https://central.sonatype.com/artifact/com.azure/azure-communication-email/1.1.3)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-communication-email/1.2.0-beta.1) | [docs](/java/api/overview/azure/communication-email-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-email_1.1.3/sdk/communication/azure-communication-email/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-email_1.2.0-beta.1/sdk/communication/azure-communication-email/) |\n| Communication Identity | Maven [1.6.11](https://central.sonatype.com/artifact/com.azure/azure-communication-identity/1.6.11) | [docs](/java/api/overview/azure/communication-identity-readme) | GitHub [1.6.11](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-identity_1.6.11/sdk/communication/azure-communication-identity/) |\n| Communication JobRouter | Maven [1.1.19](https://central.sonatype.com/artifact/com.azure/azure-communication-jobrouter/1.1.19) | [docs](/java/api/overview/azure/communication-jobrouter-readme) | GitHub [1.1.19](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-jobrouter_1.1.19/sdk/communication/azure-communication-jobrouter/) |\n| Communication Messages | Maven [1.1.10](https://central.sonatype.com/artifact/com.azure/azure-communication-messages/1.1.10)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-communication-messages/1.2.0-beta.1) | [docs](/java/api/overview/azure/communication-messages-readme) | GitHub [1.1.10](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-messages_1.1.10/sdk/communication/azure-communication-messages/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-messages_1.2.0-beta.1/sdk/communication/azure-communication-messages/) |\n| Communication Phone Numbers | Maven [1.4.4](https://central.sonatype.com/artifact/com.azure/azure-communication-phonenumbers/1.4.4) | [docs](/java/api/overview/azure/communication-phonenumbers-readme) | GitHub [1.4.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-phonenumbers_1.4.4/sdk/communication/azure-communication-phonenumbers/) |\n| Communication Rooms | Maven [1.2.7](https://central.sonatype.com/artifact/com.azure/azure-communication-rooms/1.2.7) | [docs](/java/api/overview/azure/communication-rooms-readme) | GitHub [1.2.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-rooms_1.2.7/sdk/communication/azure-communication-rooms/) |\n| Communication Sms | Maven [1.1.39](https://central.sonatype.com/artifact/com.azure/azure-communication-sms/1.1.39) | [docs](/java/api/overview/azure/communication-sms-readme) | GitHub [1.1.39](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-sms_1.1.39/sdk/communication/azure-communication-sms/) |\n| Compute Batch | Maven [1.0.0-beta.6](https://central.sonatype.com/artifact/com.azure/azure-compute-batch/1.0.0-beta.6) | [docs](/java/api/overview/azure/compute-batch-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-compute-batch_1.0.0-beta.6/sdk/batch/azure-compute-batch/) |\n| Confidential Ledger | Maven [1.0.35](https://central.sonatype.com/artifact/com.azure/azure-security-confidentialledger/1.0.35)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-security-confidentialledger/1.1.0-beta.1) | [docs](/java/api/overview/azure/security-confidentialledger-readme) | GitHub [1.0.35](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-confidentialledger_1.0.35/sdk/confidentialledger/azure-security-confidentialledger/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-confidentialledger_1.1.0-beta.1/sdk/confidentialledger/azure-security-confidentialledger/) |\n| Container Registry | Maven [1.2.23](https://central.sonatype.com/artifact/com.azure/azure-containers-containerregistry/1.2.23) | [docs](/java/api/overview/azure/containers-containerregistry-readme) | GitHub [1.2.23](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-containers-containerregistry_1.2.23/sdk/containerregistry/azure-containers-containerregistry/) |\n| Content Safety | Maven [1.0.18](https://central.sonatype.com/artifact/com.azure/azure-ai-contentsafety/1.0.18) | [docs](/java/api/overview/azure/ai-contentsafety-readme) | GitHub [1.0.18](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-contentsafety_1.0.18/sdk/contentsafety/azure-ai-contentsafety/) |\n| Content Understanding | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure/azure-ai-contentunderstanding/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-ai-contentunderstanding/1.1.0-beta.1) | [docs](/java/api/overview/azure/ai-contentunderstanding-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-contentunderstanding_1.0.0/sdk/contentunderstanding/azure-ai-contentunderstanding/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-contentunderstanding_1.1.0-beta.1/sdk/contentunderstanding/azure-ai-contentunderstanding/) |\n| Core - Client - AMQP | Maven [2.11.4](https://central.sonatype.com/artifact/com.azure/azure-core-amqp/2.11.4) | [docs](/java/api/overview/azure/core-amqp-readme) | GitHub [2.11.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-amqp_2.11.4/sdk/core/azure-core-amqp/) |\n| Core - Client - Core | Maven [1.58.0](https://central.sonatype.com/artifact/com.azure/azure-core/1.58.0) | [docs](/java/api/overview/azure/core-readme) | GitHub [1.58.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core_1.58.0/sdk/core/azure-core/) |\n| Core - Client - Core Experimental | Maven [1.0.0-beta.67](https://central.sonatype.com/artifact/com.azure/azure-core-experimental/1.0.0-beta.67) | [docs](/java/api/overview/azure/core-experimental-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.67](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-experimental_1.0.0-beta.67/sdk/core/azure-core-experimental/) |\n| Core - Client - Core Serializer Apache Avro | Maven [1.0.0-beta.64](https://central.sonatype.com/artifact/com.azure/azure-core-serializer-avro-apache/1.0.0-beta.64) | [docs](/java/api/overview/azure/core-serializer-avro-apache-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.64](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-serializer-avro-apache_1.0.0-beta.64/sdk/core/azure-core-serializer-avro-apache/) |\n| Core - Client - Core Serializer GSON JSON | Maven [1.4.4](https://central.sonatype.com/artifact/com.azure/azure-core-serializer-json-gson/1.4.4) | [docs](/java/api/overview/azure/core-serializer-json-gson-readme) | GitHub [1.4.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-serializer-json-gson_1.4.4/sdk/core/azure-core-serializer-json-gson/) |\n| Core - Client - Core Serializer Jackson JSON | Maven [1.6.4](https://central.sonatype.com/artifact/com.azure/azure-core-serializer-json-jackson/1.6.4) | [docs](/java/api/overview/azure/core-serializer-json-jackson-readme) | GitHub [1.6.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-serializer-json-jackson_1.6.4/sdk/core/azure-core-serializer-json-jackson/) |\n| Core - Client - HTTP Netty | Maven [1.16.4](https://central.sonatype.com/artifact/com.azure/azure-core-http-netty/1.16.4) | [docs](/java/api/overview/azure/core-http-netty-readme) | GitHub [1.16.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-http-netty_1.16.4/sdk/core/azure-core-http-netty/) |\n| Core - Client - HTTP OkHttp | Maven [1.13.4](https://central.sonatype.com/artifact/com.azure/azure-core-http-okhttp/1.13.4) | [docs](/java/api/overview/azure/core-http-okhttp-readme) | GitHub [1.13.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-http-okhttp_1.13.4/sdk/core/azure-core-http-okhttp/) |\n| Core - Client - Test | Maven [1.26.2](https://central.sonatype.com/artifact/com.azure/azure-core-test/1.26.2)<br>Maven [1.27.0-beta.15](https://central.sonatype.com/artifact/com.azure/azure-core-test/1.27.0-beta.15) | [docs](/java/api/overview/azure/core-test-readme) | GitHub [1.26.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-test_1.26.2/sdk/core/azure-core-test/)<br>GitHub [1.27.0-beta.15](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-test_1.27.0-beta.15/sdk/core/azure-core-test/) |\n| Core - Plugin - Tracing OpenTelemetry Plugin | Maven [1.0.0-beta.63](https://central.sonatype.com/artifact/com.azure/azure-core-tracing-opentelemetry/1.0.0-beta.63) | [docs](/java/api/overview/azure/core-tracing-opentelemetry-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.63](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-tracing-opentelemetry_1.0.0-beta.63/sdk/core/azure-core-tracing-opentelemetry/) |\n| Cosmos DB | Maven [4.80.0](https://central.sonatype.com/artifact/com.azure/azure-cosmos/4.80.0) | [docs](/java/api/overview/azure/cosmos-readme) | GitHub [4.80.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos_4.80.0/sdk/cosmos/azure-cosmos/) |\n| Cosmos Kafka Connect | Maven [2.10.0](https://central.sonatype.com/artifact/com.azure.cosmos.kafka/azure-cosmos-kafka-connect/2.10.0) |  | GitHub [2.10.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-kafka-connect_2.10.0/sdk/cosmos/azure-cosmos-kafka-connect/) |\n| Cosmos Spark 3.4 | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-4_2-12/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_3-4_2-12_4.48.0/sdk/cosmos/azure-cosmos-spark_3-4_2-12/) |\n| Cosmos Spark 3.5 | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-5_2-12/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_3-5_2-12_4.48.0/sdk/cosmos/azure-cosmos-spark_3-5_2-12/) |\n| Cosmos Spark 3.5 | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-5_2-13/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_3-5_2-13_4.48.0/sdk/cosmos/azure-cosmos-spark_3-5_2-13/) |\n| Cosmos Spark 4.0 | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_4-0_2-13/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_4-0_2-13_4.48.0/sdk/cosmos/azure-cosmos-spark_4-0_2-13/) |\n| Cosmos Test | Maven [1.0.0-beta.18](https://central.sonatype.com/artifact/com.azure/azure-cosmos-test/1.0.0-beta.18) | [docs](/java/api/overview/azure/cosmos-test-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.18](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-test_1.0.0-beta.18/sdk/cosmos/azure-cosmos-test/) |\n| Defender EASM | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-analytics-defender-easm/1.0.0-beta.1) | [docs](/java/api/overview/azure/analytics-defender-easm-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-defender-easm_1.0.0-beta.1/sdk/easm/azure-analytics-defender-easm/) |\n| Dev Center | Maven [1.0.15](https://central.sonatype.com/artifact/com.azure/azure-developer-devcenter/1.0.15) | [docs](/java/api/overview/azure/developer-devcenter-readme) | GitHub [1.0.15](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-developer-devcenter_1.0.15/sdk/devcenter/azure-developer-devcenter/) |\n| Device Update | Maven [1.0.33](https://central.sonatype.com/artifact/com.azure/azure-iot-deviceupdate/1.0.33) | [docs](/java/api/overview/azure/iot-deviceupdate-readme) | GitHub [1.0.33](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-iot-deviceupdate_1.0.33/sdk/deviceupdate/azure-iot-deviceupdate/) |\n| Digital Twins | Maven [1.5.6](https://central.sonatype.com/artifact/com.azure/azure-digitaltwins-core/1.5.6) | [docs](/java/api/overview/azure/digitaltwins-core-readme) | GitHub [1.5.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-digitaltwins-core_1.5.6/sdk/digitaltwins/azure-digitaltwins-core/) |\n| Document Intelligence | Maven [1.0.8](https://central.sonatype.com/artifact/com.azure/azure-ai-documentintelligence/1.0.8) | [docs](/java/api/overview/azure/ai-documentintelligence-readme) | GitHub [1.0.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-documentintelligence_1.0.8/sdk/documentintelligence/azure-ai-documentintelligence/) |\n| Document Translation | Maven [1.0.8](https://central.sonatype.com/artifact/com.azure/azure-ai-translation-document/1.0.8) | [docs](/java/api/overview/azure/ai-translation-document-readme) | GitHub [1.0.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-translation-document_1.0.8/sdk/translation/azure-ai-translation-document/) |\n| Event Grid | Maven [4.31.6](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventgrid/4.31.6) | [docs](/java/api/overview/azure/messaging-eventgrid-readme) | GitHub [4.31.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-eventgrid_4.31.6/sdk/eventgrid/azure-messaging-eventgrid/) |\n| Event Grid Namespaces | Maven [1.1.10](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventgrid-namespaces/1.1.10) | [docs](/java/api/overview/azure/messaging-eventgrid-namespaces-readme) | GitHub [1.1.10](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-eventgrid-namespaces_1.1.10/sdk/eventgrid/azure-messaging-eventgrid-namespaces/) |\n| Event Hubs | Maven [5.21.4](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventhubs/5.21.4) | [docs](/java/api/overview/azure/messaging-eventhubs-readme) | GitHub [5.21.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-eventhubs_5.21.4/sdk/eventhubs/azure-messaging-eventhubs/) |\n| Fabric Cosmos Spark Auth | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/fabric-cosmos-spark-auth_3/1.1.0) |  | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/fabric-cosmos-spark-auth_3_1.1.0/sdk/cosmos/fabric-cosmos-spark-auth_3/) |\n| Face | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-ai-vision-face/1.0.0-beta.2) | [docs](/java/api/overview/azure/ai-vision-face-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-vision-face_1.0.0-beta.2/sdk/face/azure-ai-vision-face/) |\n| Form Recognizer | Maven [4.1.13](https://central.sonatype.com/artifact/com.azure/azure-ai-formrecognizer/4.1.13) | [docs](/java/api/overview/azure/ai-formrecognizer-readme) | GitHub [4.1.13](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-formrecognizer_4.1.13/sdk/formrecognizer/azure-ai-formrecognizer/) |\n| Health Deidentification | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure/azure-health-deidentification/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-health-deidentification/1.1.0-beta.1) | [docs](/java/api/overview/azure/health-deidentification-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-health-deidentification_1.0.0/sdk/healthdataaiservices/azure-health-deidentification/) |\n| Health Insights Cancer Profiling | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-health-insights-cancerprofiling/1.0.0-beta.1) | [docs](/java/api/overview/azure/health-insights-cancerprofiling-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-health-insights-cancerprofiling_1.0.0-beta.1/sdk/healthinsights/azure-health-insights-cancerprofiling/) |\n| Health Insights Clinical Matching | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-health-insights-clinicalmatching/1.0.0-beta.1) | [docs](/java/api/overview/azure/health-insights-clinicalmatching-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-health-insights-clinicalmatching_1.0.0-beta.1/sdk/healthinsights/azure-health-insights-clinicalmatching/) |\n| Health Insights Radiology Insights | Maven [1.1.7](https://central.sonatype.com/artifact/com.azure/azure-health-insights-radiologyinsights/1.1.7) | [docs](/java/api/overview/azure/health-insights-radiologyinsights-readme) | GitHub [1.1.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-health-insights-radiologyinsights_1.1.7/sdk/healthinsights/azure-health-insights-radiologyinsights/) |\n| Identity | Maven [1.18.3](https://central.sonatype.com/artifact/com.azure/azure-identity/1.18.3)<br>Maven [1.19.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-identity/1.19.0-beta.2) | [docs](/java/api/overview/azure/identity-readme) | GitHub [1.18.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-identity_1.18.3/sdk/identity/azure-identity/)<br>GitHub [1.19.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-identity_1.19.0-beta.2/sdk/identity/azure-identity/) |\n| Identity Broker | Maven [1.1.20](https://central.sonatype.com/artifact/com.azure/azure-identity-broker/1.1.20) | [docs](/java/api/overview/azure/identity-broker-readme) | GitHub [1.1.20](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-identity-broker_1.1.20/sdk/identity/azure-identity-broker/) |\n| Image Analysis | Maven [1.0.8](https://central.sonatype.com/artifact/com.azure/azure-ai-vision-imageanalysis/1.0.8) | [docs](/java/api/overview/azure/ai-vision-imageanalysis-readme) | GitHub [1.0.8](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/vision/azure-ai-vision-imageanalysis) |\n| Key Vault - Administration | Maven [4.7.7](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-administration/4.7.7) | [docs](/java/api/overview/azure/security-keyvault-administration-readme) | GitHub [4.7.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-administration_4.7.7/sdk/keyvault/azure-security-keyvault-administration/) |\n| Key Vault - Certificates | Maven [4.8.7](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-certificates/4.8.7)<br>Maven [4.9.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-certificates/4.9.0-beta.1) | [docs](/java/api/overview/azure/security-keyvault-certificates-readme) | GitHub [4.8.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-certificates_4.8.7/sdk/keyvault/azure-security-keyvault-certificates/)<br>GitHub [4.9.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-certificates_4.9.0-beta.1/sdk/keyvault/azure-security-keyvault-certificates/) |\n| Key Vault - Keys | Maven [4.10.7](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-keys/4.10.7) | [docs](/java/api/overview/azure/security-keyvault-keys-readme) | GitHub [4.10.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-keys_4.10.7/sdk/keyvault/azure-security-keyvault-keys/) |\n| Key Vault - Secrets | Maven [4.10.7](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-secrets/4.10.7)<br>Maven [4.11.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-secrets/4.11.0-beta.1) | [docs](/java/api/overview/azure/security-keyvault-secrets-readme) | GitHub [4.10.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-secrets_4.10.7/sdk/keyvault/azure-security-keyvault-secrets/)<br>GitHub [4.11.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-secrets_4.11.0-beta.1/sdk/keyvault/azure-security-keyvault-secrets/) |\n| Load Testing | Maven [1.0.29](https://central.sonatype.com/artifact/com.azure/azure-developer-loadtesting/1.0.29)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-developer-loadtesting/1.2.0-beta.1) | [docs](/java/api/overview/azure/developer-loadtesting-readme) | GitHub [1.0.29](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-developer-loadtesting_1.0.29/sdk/loadtesting/azure-developer-loadtesting/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-developer-loadtesting_1.2.0-beta.1/sdk/loadtesting/azure-developer-loadtesting/) |\n| Maps Render | Maven [2.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-maps-render/2.0.0-beta.2) | [docs](/java/api/overview/azure/maps-render-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-render_2.0.0-beta.2/sdk/maps/azure-maps-render/) |\n| Maps Route | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-maps-route/1.0.0-beta.3) | [docs](/java/api/overview/azure/maps-route-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-route_1.0.0-beta.3/sdk/maps/azure-maps-route/) |\n| Maps Search | Maven [2.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-maps-search/2.0.0-beta.2) | [docs](/java/api/overview/azure/maps-search-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-search_2.0.0-beta.2/sdk/maps/azure-maps-search/) |\n| Metrics Advisor | Maven [1.2.13](https://central.sonatype.com/artifact/com.azure/azure-ai-metricsadvisor/1.2.13) | [docs](/java/api/overview/azure/ai-metricsadvisor-readme) | GitHub [1.2.13](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-metricsadvisor_1.2.13/sdk/metricsadvisor/azure-ai-metricsadvisor/) |\n| Models Repository | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-iot-modelsrepository/1.0.0-beta.1) | [docs](/java/api/overview/azure/iot-modelsrepository-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-iot-modelsrepository_1.0.0-beta.1/sdk/modelsrepository/azure-iot-modelsrepository/) |\n| Monitor Ingestion | Maven [1.2.16](https://central.sonatype.com/artifact/com.azure/azure-monitor-ingestion/1.2.16) | [docs](/java/api/overview/azure/monitor-ingestion-readme) | GitHub [1.2.16](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-monitor-ingestion_1.2.16/sdk/monitor/azure-monitor-ingestion/) |\n| Monitor Query Logs | Maven [1.0.5](https://central.sonatype.com/artifact/com.azure/azure-monitor-query-logs/1.0.5) | [docs](/java/api/overview/azure/monitor-query-logs-readme) | GitHub [1.0.5](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-monitor-query-logs_1.0.5/sdk/monitor/azure-monitor-query-logs/) |\n| Monitor Query Metrics | Maven [1.0.5](https://central.sonatype.com/artifact/com.azure/azure-monitor-query-metrics/1.0.5) | [docs](/java/api/overview/azure/monitor-query-metrics-readme) | GitHub [1.0.5](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-monitor-query-metrics_1.0.5/sdk/monitor/azure-monitor-query-metrics/) |\n| Online Experimentation | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-analytics-onlineexperimentation/1.0.0-beta.1) | [docs](/java/api/overview/azure/analytics-onlineexperimentation-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-onlineexperimentation_1.0.0-beta.1/sdk/onlineexperimentation/azure-analytics-onlineexperimentation/) |\n| OpenAI | Maven [1.0.0-beta.16](https://central.sonatype.com/artifact/com.azure/azure-ai-openai/1.0.0-beta.16) | [docs](/java/api/overview/azure/ai-openai-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.16](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-openai_1.0.0-beta.16/sdk/openai/azure-ai-openai/) |\n| OpenAI Assistants | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-ai-openai-assistants/1.0.0-beta.5) | [docs](/java/api/overview/azure/ai-openai-assistants-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-openai-assistants_1.0.0-beta.5/sdk/openai/azure-ai-openai-assistants/) |\n| OpenTelemetry AutoConfigure | Maven [1.4.0](https://central.sonatype.com/artifact/com.azure/azure-monitor-opentelemetry-autoconfigure/1.4.0) | [docs](/java/api/overview/azure/monitor-opentelemetry-autoconfigure-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-monitor-opentelemetry-autoconfigure_1.4.0/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/) |\n| OpenTelemetry Exporter | Maven [1.0.0-beta.32](https://central.sonatype.com/artifact/com.azure/azure-monitor-opentelemetry-exporter/1.0.0-beta.32) | [docs](/java/api/overview/azure/monitor-opentelemetry-exporter-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.32](https://github.com/Azure/azure-sdk-for-java/tree/azure-monitor-opentelemetry-exporter_1.0.0-beta.32/sdk/monitor/azure-monitor-opentelemetry-exporter/) |\n| Purview Account | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-account/1.0.0-beta.1) | [docs](/java/api/overview/azure/analytics-purview-account-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-account_1.0.0-beta.1/sdk/purview/azure-analytics-purview-account/) |\n| Purview Administration | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-administration/1.0.0-beta.1) | [docs](/java/api/overview/azure/analytics-purview-administration-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-administration_1.0.0-beta.1/sdk/purview/azure-analytics-purview-administration/) |\n| Purview Data Map | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-datamap/1.0.0-beta.2) | [docs](/java/api/overview/azure/analytics-purview-datamap-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-datamap_1.0.0-beta.2/sdk/purview/azure-analytics-purview-datamap/) |\n| Purview Scanning | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-scanning/1.0.0-beta.2) | [docs](/java/api/overview/azure/analytics-purview-scanning-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-scanning_1.0.0-beta.2/sdk/purview/azure-analytics-purview-scanning/) |\n| Purview Sharing | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-sharing/1.0.0-beta.2) | [docs](/java/api/overview/azure/analytics-purview-sharing-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-sharing_1.0.0-beta.2/sdk/purview/azure-analytics-purview-sharing/) |\n| Purview Workflow | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-workflow/1.0.0-beta.2) | [docs](/java/api/overview/azure/analytics-purview-workflow-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-workflow_1.0.0-beta.2/sdk/purview/azure-analytics-purview-workflow/) |\n| Quantum Jobs | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-quantum-jobs/1.0.0-beta.1) | [docs](/java/api/overview/azure/quantum-jobs-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-quantum-jobs_1.0.0-beta.1/sdk/quantum/azure-quantum-jobs/) |\n| Schema Registry | Maven [1.5.11](https://central.sonatype.com/artifact/com.azure/azure-data-schemaregistry/1.5.11) | [docs](/java/api/overview/azure/data-schemaregistry-readme) | GitHub [1.5.11](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-schemaregistry_1.5.11/sdk/schemaregistry/azure-data-schemaregistry/) |\n| Schema Registry - Avro | Maven [1.1.32](https://central.sonatype.com/artifact/com.azure/azure-data-schemaregistry-apacheavro/1.1.32)<br>Maven [1.2.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-data-schemaregistry-apacheavro/1.2.0-beta.2) | [docs](/java/api/overview/azure/data-schemaregistry-apacheavro-readme) | GitHub [1.1.32](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-schemaregistry-apacheavro_1.1.32/sdk/schemaregistry/azure-data-schemaregistry-apacheavro/)<br>GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-schemaregistry-apacheavro_1.2.0-beta.2/sdk/schemaregistry/azure-data-schemaregistry-apacheavro/) |\n| Schema Registry - Avro | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-data-schemaregistry-avro/1.0.0-beta.5) | [docs](/java/api/overview/azure/data-schemaregistry-avro-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-data-schemaregistry-avro_1.0.0-beta.5/sdk/schemaregistry/azure-data-schemaregistry-avro/) |\n| Schema Registry - JSON | Maven [1.0.8](https://central.sonatype.com/artifact/com.azure/azure-data-schemaregistry-jsonschema/1.0.8) | [docs](/java/api/overview/azure/data-schemaregistry-jsonschema-readme) | GitHub [1.0.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-schemaregistry-jsonschema_1.0.8/sdk/schemaregistry/azure-data-schemaregistry-jsonschema/) |\n| Service Bus | Maven [7.17.18](https://central.sonatype.com/artifact/com.azure/azure-messaging-servicebus/7.17.18)<br>Maven [7.18.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-messaging-servicebus/7.18.0-beta.1) | [docs](/java/api/overview/azure/messaging-servicebus-readme) | GitHub [7.17.18](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-servicebus_7.17.18/sdk/servicebus/azure-messaging-servicebus/)<br>GitHub [7.18.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-servicebus_7.18.0-beta.1/sdk/servicebus/azure-messaging-servicebus/) |\n| Storage - Blobs | Maven [12.33.4](https://central.sonatype.com/artifact/com.azure/azure-storage-blob/12.33.4)<br>Maven [12.35.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-blob/12.35.0-beta.1) | [docs](/java/api/overview/azure/storage-blob-readme) | GitHub [12.33.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob_12.33.4/sdk/storage/azure-storage-blob/)<br>GitHub [12.35.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob_12.35.0-beta.1/sdk/storage/azure-storage-blob/) |\n| Storage - Blobs Batch | Maven [12.29.4](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-batch/12.29.4)<br>Maven [12.31.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-batch/12.31.0-beta.1) | [docs](/java/api/overview/azure/storage-blob-batch-readme) | GitHub [12.29.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-batch_12.29.4/sdk/storage/azure-storage-blob-batch/)<br>GitHub [12.31.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-batch_12.31.0-beta.1/sdk/storage/azure-storage-blob-batch/) |\n| Storage - Blobs Changefeed | Maven [12.0.0-beta.36](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-changefeed/12.0.0-beta.36) | [docs](/java/api/overview/azure/storage-blob-changefeed-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [12.0.0-beta.36](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-changefeed_12.0.0-beta.36/sdk/storage/azure-storage-blob-changefeed/) |\n| Storage - Blobs Cryptography | Maven [12.32.4](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-cryptography/12.32.4)<br>Maven [12.34.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-cryptography/12.34.0-beta.1) | [docs](/java/api/overview/azure/storage-blob-cryptography-readme) | GitHub [12.32.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-cryptography_12.32.4/sdk/storage/azure-storage-blob-cryptography/)<br>GitHub [12.34.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-cryptography_12.34.0-beta.1/sdk/storage/azure-storage-blob-cryptography/) |\n| Storage - Blobs NIO | Maven [12.0.0-beta.37](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-nio/12.0.0-beta.37) | [docs](/java/api/overview/azure/storage-blob-nio-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [12.0.0-beta.37](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-nio_12.0.0-beta.37/sdk/storage/azure-storage-blob-nio/) |\n| Storage - Files Data Lake | Maven [12.26.4](https://central.sonatype.com/artifact/com.azure/azure-storage-file-datalake/12.26.4)<br>Maven [12.28.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-file-datalake/12.28.0-beta.1) | [docs](/java/api/overview/azure/storage-file-datalake-readme) | GitHub [12.26.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-file-datalake_12.26.4/sdk/storage/azure-storage-file-datalake/)<br>GitHub [12.28.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-file-datalake_12.28.0-beta.1/sdk/storage/azure-storage-file-datalake/) |\n| Storage - Files Share | Maven [12.29.3](https://central.sonatype.com/artifact/com.azure/azure-storage-file-share/12.29.3)<br>Maven [12.31.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-file-share/12.31.0-beta.1) | [docs](/java/api/overview/azure/storage-file-share-readme) | GitHub [12.29.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-file-share_12.29.3/sdk/storage/azure-storage-file-share/)<br>GitHub [12.31.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-file-share_12.31.0-beta.1/sdk/storage/azure-storage-file-share/) |\n| Storage - Internal Avro | Maven [12.18.3](https://central.sonatype.com/artifact/com.azure/azure-storage-internal-avro/12.18.3)<br>Maven [12.20.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-internal-avro/12.20.0-beta.1) | [docs](/java/api/overview/azure/storage-internal-avro-readme) | GitHub [12.18.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-internal-avro_12.18.3/sdk/storage/azure-storage-internal-avro/)<br>GitHub [12.20.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-internal-avro_12.20.0-beta.1/sdk/storage/azure-storage-internal-avro/) |\n| Storage - Queues | Maven [12.28.3](https://central.sonatype.com/artifact/com.azure/azure-storage-queue/12.28.3)<br>Maven [12.30.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-queue/12.30.0-beta.1) | [docs](/java/api/overview/azure/storage-queue-readme) | GitHub [12.28.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-queue_12.28.3/sdk/storage/azure-storage-queue/)<br>GitHub [12.30.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-queue_12.30.0-beta.1/sdk/storage/azure-storage-queue/) |\n| Synapse - AccessControl | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure/azure-analytics-synapse-accesscontrol/1.0.0-beta.4) | [docs](/java/api/overview/azure/analytics-synapse-accesscontrol-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-synapse-accesscontrol_1.0.0-beta.4/sdk/synapse/azure-analytics-synapse-accesscontrol/) |\n| Synapse - Artifacts | Maven [1.0.0-beta.17](https://central.sonatype.com/artifact/com.azure/azure-analytics-synapse-artifacts/1.0.0-beta.17) | [docs](/java/api/overview/azure/analytics-synapse-artifacts-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.17](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-synapse-artifacts_1.0.0-beta.17/sdk/synapse/azure-analytics-synapse-artifacts/) |\n| Synapse - Managed Private Endpoints | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-analytics-synapse-managedprivateendpoints/1.0.0-beta.5) | [docs](/java/api/overview/azure/analytics-synapse-managedprivateendpoints-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-synapse-managedprivateendpoints_1.0.0-beta.5/sdk/synapse/azure-analytics-synapse-managedprivateendpoints/) |\n| Synapse - Monitoring | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-analytics-synapse-monitoring/1.0.0-beta.3) | [docs](/java/api/overview/azure/analytics-synapse-monitoring-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-synapse-monitoring_1.0.0-beta.3/sdk/synapse/azure-analytics-synapse-monitoring/) |\n| Synapse - Spark | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-analytics-synapse-spark/1.0.0-beta.5) | [docs](/java/api/overview/azure/analytics-synapse-spark-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-synapse-spark_1.0.0-beta.5/sdk/synapse/azure-analytics-synapse-spark/) |\n| System Events | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventgrid-systemevents/1.0.0) | [docs](/java/api/overview/azure/messaging-eventgrid-systemevents-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-messaging-eventgrid-systemevents_1.0.0/sdk/eventgrid/azure-messaging-eventgrid-systemevents/) |\n| Tables | Maven [12.5.10](https://central.sonatype.com/artifact/com.azure/azure-data-tables/12.5.10) | [docs](/java/api/overview/azure/data-tables-readme) | GitHub [12.5.10](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-tables_12.5.10/sdk/tables/azure-data-tables/) |\n| Text Analytics | Maven [5.5.13](https://central.sonatype.com/artifact/com.azure/azure-ai-textanalytics/5.5.13) | [docs](/java/api/overview/azure/ai-textanalytics-readme) | GitHub [5.5.13](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-textanalytics_5.5.13/sdk/textanalytics/azure-ai-textanalytics/) |\n| Text Translation | Maven [1.1.9](https://central.sonatype.com/artifact/com.azure/azure-ai-translation-text/1.1.9)<br>Maven [2.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-ai-translation-text/2.0.0-beta.1) | [docs](/java/api/overview/azure/ai-translation-text-readme) | GitHub [1.1.9](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-translation-text_1.1.9/sdk/translation/azure-ai-translation-text/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-translation-text_2.0.0-beta.1/sdk/translation/azure-ai-translation-text/) |\n| unknown | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_4-1_2-13/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_4-1_2-13_4.48.0/sdk/cosmos/azure-cosmos-spark_4-1_2-13/) |\n| Voice Live | Maven [1.0.0-beta.6](https://central.sonatype.com/artifact/com.azure/azure-ai-voicelive/1.0.0-beta.6) | [docs](/java/api/overview/azure/ai-voicelive-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-voicelive_1.0.0-beta.6/sdk/voicelive/azure-ai-voicelive/) |\n| Web PubSub | Maven [1.5.5](https://central.sonatype.com/artifact/com.azure/azure-messaging-webpubsub/1.5.5) | [docs](/java/api/overview/azure/messaging-webpubsub-readme) | GitHub [1.5.5](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-webpubsub_1.5.5/sdk/webpubsub/azure-messaging-webpubsub/) |\n| Web PubSub Client | Maven [1.1.8](https://central.sonatype.com/artifact/com.azure/azure-messaging-webpubsub-client/1.1.8) | [docs](/java/api/overview/azure/messaging-webpubsub-client-readme) | GitHub [1.1.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-webpubsub-client_1.1.8/sdk/webpubsub/azure-messaging-webpubsub-client/) |\n| Cosmos DB Encryption | Maven [2.29.0](https://central.sonatype.com/artifact/com.azure/azure-cosmos-encryption/2.29.0) | [docs](/java/api/overview/azure/cosmos-encryption-readme) | GitHub [2.29.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-encryption_2.29.0/sdk/cosmos/azure-cosmos-encryption/) |\n| OLTP Spark 3.1 Connector for Azure Cosmos DB SQL API | Maven [4.37.1](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-1_2-12/4.37.1) | [docs](/java/api/overview/azure/cosmos-spark_3-1_2-12-readme) | GitHub [4.37.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-cosmos-spark_3-1_2-12_4.37.1/sdk/cosmos/azure-cosmos-spark_3-1_2-12/) |\n| OLTP Spark 3.2 Connector for Azure Cosmos DB SQL API | Maven [4.37.1](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-2_2-12/4.37.1) | [docs](/java/api/overview/azure/cosmos-spark_3-2_2-12-readme) | GitHub [4.37.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-cosmos-spark_3-2_2-12_4.37.1/sdk/cosmos/azure-cosmos-spark_3-2_2-12/) |\n| OLTP Spark 3.3 Connector for Azure Cosmos DB SQL API | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-3_2-12/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_3-3_2-12_4.48.0/sdk/cosmos/azure-cosmos-spark_3-3_2-12/) |\n| SDK - Bill of Materials | Maven [1.3.6](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom/1.3.6) |  | GitHub [1.3.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-sdk-bom_1.3.6/sdk/boms/azure-sdk-bom/) |\n| Storage - Common | Maven [12.32.3](https://central.sonatype.com/artifact/com.azure/azure-storage-common/12.32.3)<br>Maven [12.34.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-common/12.34.0-beta.1) | [docs](/java/api/overview/azure/storage-common-readme) | GitHub [12.32.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-common_12.32.3/sdk/storage/azure-storage-common/)<br>GitHub [12.34.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-common_12.34.0-beta.1/sdk/storage/azure-storage-common/) |\n| Core - Management - Core | Maven [1.19.4](https://central.sonatype.com/artifact/com.azure/azure-core-management/1.19.4) | [docs](/java/api/overview/azure/core-management-readme) | GitHub [1.19.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-management_1.19.4/sdk/core/azure-core-management/) |\n| Resource Management | Maven [2.62.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager/2.62.0) | [docs](/java/api/overview/azure/resourcemanager-readme) | GitHub [2.62.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager_2.62.0/sdk/resourcemanager/azure-resourcemanager/) |\n| Resource Management - Advisor | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-advisor/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-advisor-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-advisor_1.0.0/sdk/advisor/azure-resourcemanager-advisor/) |\n| Resource Management - Alerts Management | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-alertsmanagement/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-alertsmanagement-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-alertsmanagement_1.0.0-beta.2/sdk/alertsmanagement/azure-resourcemanager-alertsmanagement/) |\n| Resource Management - API Center | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-apicenter/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-apicenter-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-apicenter_1.1.0/sdk/apicenter/azure-resourcemanager-apicenter/) |\n| Resource Management - API Management | Maven [2.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-apimanagement/2.0.0) | [docs](/java/api/overview/azure/resourcemanager-apimanagement-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-apimanagement_2.0.0/sdk/apimanagement/azure-resourcemanager-apimanagement/) |\n| Resource Management - App Compliance Automation | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appcomplianceautomation/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-appcomplianceautomation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-appcomplianceautomation_1.0.0/sdk/appcomplianceautomation/azure-resourcemanager-appcomplianceautomation/) |\n| Resource Management - App Configuration | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appconfiguration/1.1.0)<br>Maven [1.2.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appconfiguration/1.2.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-appconfiguration-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-appconfiguration_1.1.0/sdk/appconfiguration/azure-resourcemanager-appconfiguration/)<br>GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-appconfiguration_1.2.0-beta.2/sdk/appconfiguration/azure-resourcemanager-appconfiguration/) |\n| Resource Management - App Service | Maven [2.55.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appservice/2.55.2) | [docs](/java/api/overview/azure/resourcemanager-appservice-readme) | GitHub [2.55.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-appservice_2.55.2/sdk/appservice/azure-resourcemanager-appservice/) |\n| Resource Management - Application Insights | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-applicationinsights/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-applicationinsights/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-applicationinsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-applicationinsights_1.1.0/sdk/applicationinsights/azure-resourcemanager-applicationinsights/) |\n| Resource Management - Appnetwork | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appnetwork/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-appnetwork-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-appnetwork_1.0.0-beta.1/sdk/appnetwork/azure-resourcemanager-appnetwork/) |\n| Resource Management - Arc Data | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-azurearcdata/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-azurearcdata-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-azurearcdata_1.0.0/sdk/azurearcdata/azure-resourcemanager-azurearcdata/) |\n| Resource Management - Arize AI Observability Eval | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-arizeaiobservabilityeval/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-arizeaiobservabilityeval-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-arizeaiobservabilityeval_1.0.0/sdk/arizeaiobservabilityeval/azure-resourcemanager-arizeaiobservabilityeval/) |\n| Resource Management - Artifact Signing | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-artifactsigning/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-artifactsigning-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-artifactsigning_1.0.0/sdk/artifactsigning/azure-resourcemanager-artifactsigning/) |\n| Resource Management - Astro | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-astro/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-astro-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-astro_1.0.0-beta.2/sdk/astro/azure-resourcemanager-astro/) |\n| Resource Management - Attestation | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-attestation/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-attestation-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-attestation_1.0.0-beta.3/sdk/attestation/azure-resourcemanager-attestation/) |\n| Resource Management - Authorization | Maven [2.53.9](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-authorization/2.53.9)<br>Maven [2.54.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-authorization/2.54.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-authorization-readme) | GitHub [2.53.9](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-authorization_2.53.9/sdk/authorization/azure-resourcemanager-authorization/)<br>GitHub [2.54.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-authorization_2.54.0-beta.1/sdk/authorization/azure-resourcemanager-authorization/) |\n| Resource Management - Automanage | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-automanage/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-automanage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-automanage_1.0.0/sdk/automanage/azure-resourcemanager-automanage/) |\n| Resource Management - Automation | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-automation/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-automation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-automation_1.0.0/sdk/automation/azure-resourcemanager-automation/) |\n| Resource Management - Azure AI Search | Maven [2.54.7](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-search/2.54.7)<br>Maven [2.55.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-search/2.55.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-search-readme) | GitHub [2.54.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-search_2.54.7/sdk/search/azure-resourcemanager-search/)<br>GitHub [2.55.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-search_2.55.0-beta.1/sdk/search/azure-resourcemanager-search/) |\n| Resource Management - Azure Stack | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-azurestack/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-azurestack-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-azurestack_1.0.0/sdk/azurestack/azure-resourcemanager-azurestack/) |\n| Resource Management - Azure Stack HCI | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-azurestackhci/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-azurestackhci/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-azurestackhci-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-azurestackhci_1.0.0/sdk/azurestackhci/azure-resourcemanager-azurestackhci/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-azurestackhci_1.1.0-beta.1/sdk/azurestackhci/azure-resourcemanager-azurestackhci/) |\n| Resource Management - Azure VMware Solution | Maven [1.4.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-avs/1.4.0) | [docs](/java/api/overview/azure/resourcemanager-avs-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-avs_1.4.0/sdk/avs/azure-resourcemanager-avs/) |\n| Resource Management - Azurestackhci-Vm | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-azurestackhci-vm/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-azurestackhci-vm-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-azurestackhci-vm_1.0.0-beta.1/sdk/azurestackhci/azure-resourcemanager-azurestackhci-vm/) |\n| Resource Management - BareMetal Infrastructure | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-baremetalinfrastructure/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-baremetalinfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-baremetalinfrastructure_1.0.0/sdk/baremetalinfrastructure/azure-resourcemanager-baremetalinfrastructure/) |\n| Resource Management - Batch | Maven [2.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-batch/2.0.0) | [docs](/java/api/overview/azure/resourcemanager-batch-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-batch_2.0.0/sdk/batch/azure-resourcemanager-batch/) |\n| Resource Management - Billing | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-billing/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-billing-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-billing_1.0.0/sdk/billing/azure-resourcemanager-billing/) |\n| Resource Management - Billing Benefits | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-billingbenefits/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-billingbenefits-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-billingbenefits_1.0.0-beta.2/sdk/billingbenefits/azure-resourcemanager-billingbenefits/) |\n| Resource Management - Bot Service | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-botservice/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-botservice-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-botservice_1.0.0/sdk/botservice/azure-resourcemanager-botservice/) |\n| Resource Management - Carbonoptimization | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-carbonoptimization/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-carbonoptimization-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-carbonoptimization_1.0.0/sdk/carbonoptimization/azure-resourcemanager-carbonoptimization/) |\n| Resource Management - Change Analysis | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-changeanalysis/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-changeanalysis-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-changeanalysis_1.1.0/sdk/changeanalysis/azure-resourcemanager-changeanalysis/) |\n| Resource Management - Chaos | Maven [1.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-chaos/1.3.0) | [docs](/java/api/overview/azure/resourcemanager-chaos-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-chaos_1.3.0/sdk/chaos/azure-resourcemanager-chaos/) |\n| Resource Management - Cloud Health | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cloudhealth/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-cloudhealth-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-cloudhealth_1.0.0-beta.1/sdk/cloudhealth/azure-resourcemanager-cloudhealth/) |\n| Resource Management - Cognitive Services | Maven [1.4.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cognitiveservices/1.4.0)<br>Maven [1.5.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cognitiveservices/1.5.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-cognitiveservices-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cognitiveservices_1.4.0/sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cognitiveservices_1.5.0-beta.1/sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/) |\n| Resource Management - Commerce | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-commerce/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-commerce-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-commerce_1.0.0-beta.3/sdk/commerce/azure-resourcemanager-commerce/) |\n| Resource Management - Communication | Maven [2.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-communication/2.3.0) | [docs](/java/api/overview/azure/resourcemanager-communication-readme) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-communication_2.3.0/sdk/communication/azure-resourcemanager-communication/) |\n| Resource Management - Compute | Maven [2.57.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-compute/2.57.1) | [docs](/java/api/overview/azure/resourcemanager-compute-readme) | GitHub [2.57.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-compute_2.57.1/sdk/compute/azure-resourcemanager-compute/) |\n| Resource Management - Compute Fleet | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computefleet/1.0.0)<br>Maven [1.1.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computefleet/1.1.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-computefleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-computefleet_1.0.0/sdk/computefleet/azure-resourcemanager-computefleet/) |\n| Resource Management - Compute Schedule | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computeschedule/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computeschedule/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-computeschedule-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-computeschedule_1.1.0/sdk/computeschedule/azure-resourcemanager-computeschedule/) |\n| Resource Management - Compute-Recommender | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-compute-recommender/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-compute-recommender-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-compute-recommender_1.0.0-beta.1/sdk/compute/azure-resourcemanager-compute-recommender/) |\n| Resource Management - Computebulkactions | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computebulkactions/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-computebulkactions-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-computebulkactions_1.0.0-beta.1/sdk/computebulkactions/azure-resourcemanager-computebulkactions/) |\n| Resource Management - Computelimit | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computelimit/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-computelimit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-computelimit_1.0.0/sdk/computelimit/azure-resourcemanager-computelimit/) |\n| Resource Management - Computerecommender | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computerecommender/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-computerecommender-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-computerecommender_1.0.0-beta.2/sdk/computerecommender/azure-resourcemanager-computerecommender/) |\n| Resource Management - Confidential Ledger | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-confidentialledger/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-confidentialledger/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-confidentialledger-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-confidentialledger_1.0.0/sdk/confidentialledger/azure-resourcemanager-confidentialledger/) |\n| Resource Management - Confluent | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-confluent/1.2.0)<br>Maven [1.3.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-confluent/1.3.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-confluent-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-confluent_1.2.0/sdk/confluent/azure-resourcemanager-confluent/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-confluent_1.3.0-beta.1/sdk/confluent/azure-resourcemanager-confluent/) |\n| Resource Management - Connected Cache | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-connectedcache/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-connectedcache-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-connectedcache_1.0.0-beta.2/sdk/connectedcache/azure-resourcemanager-connectedcache/) |\n| Resource Management - Connected VMware | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-connectedvmware/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-connectedvmware-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-connectedvmware_1.1.0/sdk/connectedvmware/azure-resourcemanager-connectedvmware/) |\n| Resource Management - Consumption | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-consumption/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-consumption-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-consumption_1.0.0/sdk/consumption/azure-resourcemanager-consumption/) |\n| Resource Management - Container Apps | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appcontainers/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-appcontainers-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-appcontainers_1.2.0/sdk/appcontainers/azure-resourcemanager-appcontainers/) |\n| Resource Management - Container Instances | Maven [2.53.10](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerinstance/2.53.10) | [docs](/java/api/overview/azure/resourcemanager-containerinstance-readme) | GitHub [2.53.10](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerinstance_2.53.10/sdk/containerinstance/azure-resourcemanager-containerinstance/) |\n| Resource Management - Container Orchestrator Runtime | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerorchestratorruntime/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-containerorchestratorruntime-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-containerorchestratorruntime_1.0.0-beta.1/sdk/containerorchestratorruntime/azure-resourcemanager-containerorchestratorruntime/) |\n| Resource Management - Container Registry | Maven [2.55.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerregistry/2.55.2)<br>Maven [2.56.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerregistry/2.56.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-containerregistry-readme) | GitHub [2.55.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerregistry_2.55.2/sdk/containerregistry/azure-resourcemanager-containerregistry/)<br>GitHub [2.56.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerregistry_2.56.0-beta.1/sdk/containerregistry/azure-resourcemanager-containerregistry/) |\n| Resource Management - Container Service | Maven [2.59.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerservice/2.59.1) | [docs](/java/api/overview/azure/resourcemanager-containerservice-readme) | GitHub [2.59.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerservice_2.59.1/sdk/containerservice/azure-resourcemanager-containerservice/) |\n| Resource Management - Container Service Fleet | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerservicefleet/1.2.0)<br>Maven [1.3.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerservicefleet/1.3.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-containerservicefleet-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerservicefleet_1.2.0/sdk/containerservicefleet/azure-resourcemanager-containerservicefleet/)<br>GitHub [1.3.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerservicefleet_1.3.0-beta.3/sdk/containerservicefleet/azure-resourcemanager-containerservicefleet/) |\n| Resource Management - Containerregistry-Tasks | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerregistry-tasks/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-containerregistry-tasks-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerregistry-tasks_1.0.0-beta.1/sdk/containerregistry/azure-resourcemanager-containerregistry-tasks/) |\n| Resource Management - Containerservicesafeguards | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerservicesafeguards/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-containerservicesafeguards-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-containerservicesafeguards_1.0.0-beta.1/sdk/containerservicesafeguards/azure-resourcemanager-containerservicesafeguards/) |\n| Resource Management - Content Delivery Network | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cdn/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-cdn-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cdn_2.53.8/sdk/cdn/azure-resourcemanager-cdn/) |\n| Resource Management - Cosmos DB | Maven [2.54.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cosmos/2.54.3) | [docs](/java/api/overview/azure/resourcemanager-cosmos-readme) | GitHub [2.54.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cosmos_2.54.3/sdk/cosmos/azure-resourcemanager-cosmos/) |\n| Resource Management - Cosmos DB for PostgreSQL | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cosmosdbforpostgresql/1.0.0)<br>Maven [1.1.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cosmosdbforpostgresql/1.1.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-cosmosdbforpostgresql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cosmosdbforpostgresql_1.0.0/sdk/cosmosdbforpostgresql/azure-resourcemanager-cosmosdbforpostgresql/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cosmosdbforpostgresql_1.1.0-beta.3/sdk/cosmosdbforpostgresql/azure-resourcemanager-cosmosdbforpostgresql/) |\n| Resource Management - Cost Management | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-costmanagement/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-costmanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-costmanagement_1.0.0/sdk/costmanagement/azure-resourcemanager-costmanagement/) |\n| Resource Management - Customer Insights | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-customerinsights/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-customerinsights-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-customerinsights_1.0.0-beta.3/sdk/customerinsights/azure-resourcemanager-customerinsights/) |\n| Resource Management - Data Box | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-databox/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-databox-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-databox_1.1.0/sdk/databox/azure-resourcemanager-databox/) |\n| Resource Management - Data Box Edge | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-databoxedge/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-databoxedge-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-databoxedge_1.0.0/sdk/databoxedge/azure-resourcemanager-databoxedge/) |\n| Resource Management - Data Factory | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datafactory/1.2.0)<br>Maven [1.3.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datafactory/1.3.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-datafactory-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-datafactory_1.2.0/sdk/datafactory/azure-resourcemanager-datafactory/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-datafactory_1.3.0-beta.1/sdk/datafactory/azure-resourcemanager-datafactory/) |\n| Resource Management - Data Lake Analytics | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datalakeanalytics/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-datalakeanalytics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-datalakeanalytics_1.0.0/sdk/datalakeanalytics/azure-resourcemanager-datalakeanalytics/) |\n| Resource Management - Data Lake Store | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datalakestore/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-datalakestore-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-datalakestore_1.0.0/sdk/datalakestore/azure-resourcemanager-datalakestore/) |\n| Resource Management - Data Migration | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datamigration/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-datamigration-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-datamigration_1.2.0/sdk/datamigration/azure-resourcemanager-datamigration/) |\n| Resource Management - Data Protection | Maven [1.5.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dataprotection/1.5.0) | [docs](/java/api/overview/azure/resourcemanager-dataprotection-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-dataprotection_1.5.0/sdk/dataprotection/azure-resourcemanager-dataprotection/) |\n| Resource Management - Database Watcher | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-databasewatcher/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-databasewatcher-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-databasewatcher_1.0.0-beta.1/sdk/databasewatcher/azure-resourcemanager-databasewatcher/) |\n| Resource Management - Databricks | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-databricks/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-databricks-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-databricks_1.0.0/sdk/databricks/azure-resourcemanager-databricks/) |\n| Resource Management - Datadog | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datadog/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-datadog-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-datadog_1.1.0/sdk/datadog/azure-resourcemanager-datadog/) |\n| Resource Management - Defender EASM | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-defendereasm/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-defendereasm-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-defendereasm_1.0.0-beta.2/sdk/defendereasm/azure-resourcemanager-defendereasm/) |\n| Resource Management - Delegated Network | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-delegatednetwork/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-delegatednetwork-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-delegatednetwork_1.0.0-beta.3/sdk/delegatednetwork/azure-resourcemanager-delegatednetwork/) |\n| Resource Management - Dell Storage | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dell-storage/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-dell-storage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-dell-storage_1.0.0/sdk/dell/azure-resourcemanager-dell-storage/) |\n| Resource Management - Dependencymap | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dependencymap/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-dependencymap-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-dependencymap_1.0.0-beta.1/sdk/dependencymap/azure-resourcemanager-dependencymap/) |\n| Resource Management - Deployment Manager | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deploymentmanager/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-deploymentmanager-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-deploymentmanager_1.0.0-beta.2/sdk/deploymentmanager/azure-resourcemanager-deploymentmanager/) |\n| Resource Management - Desktop Virtualization | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-desktopvirtualization/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-desktopvirtualization-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-desktopvirtualization_1.2.0/sdk/desktopvirtualization/azure-resourcemanager-desktopvirtualization/) |\n| Resource Management - Dev Center | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-devcenter/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-devcenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-devcenter_1.0.0/sdk/devcenter/azure-resourcemanager-devcenter/) |\n| Resource Management - Dev Spaces | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-devspaces/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-devspaces-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-devspaces_1.0.0-beta.3/sdk/devspaces/azure-resourcemanager-devspaces/) |\n| Resource Management - DevHub | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-devhub/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-devhub-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-devhub_1.0.0-beta.3/sdk/devhub/azure-resourcemanager-devhub/) |\n| Resource Management - Device Provisioning Services | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deviceprovisioningservices/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deviceprovisioningservices/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-deviceprovisioningservices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-deviceprovisioningservices_1.1.0/sdk/deviceprovisioningservices/azure-resourcemanager-deviceprovisioningservices/) |\n| Resource Management - Device Registry | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deviceregistry/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deviceregistry/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-deviceregistry-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-deviceregistry_1.1.0/sdk/deviceregistry/azure-resourcemanager-deviceregistry/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-deviceregistry_1.2.0-beta.1/sdk/deviceregistry/azure-resourcemanager-deviceregistry/) |\n| Resource Management - Device Update | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deviceupdate/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-deviceupdate-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-deviceupdate_1.1.0/sdk/deviceupdate/azure-resourcemanager-deviceupdate/) |\n| Resource Management - DevOps Infrastructure | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-devopsinfrastructure/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-devopsinfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-devopsinfrastructure_1.0.0/sdk/devopsinfrastructure/azure-resourcemanager-devopsinfrastructure/) |\n| Resource Management - DevTest Labs | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-devtestlabs/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-devtestlabs-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-devtestlabs_1.1.0/sdk/devtestlabs/azure-resourcemanager-devtestlabs/) |\n| Resource Management - Digital Twins | Maven [1.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-digitaltwins/1.3.0) | [docs](/java/api/overview/azure/resourcemanager-digitaltwins-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-digitaltwins_1.3.0/sdk/digitaltwins/azure-resourcemanager-digitaltwins/) |\n| Resource Management - Disconnected Operations | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-disconnectedoperations/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-disconnectedoperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-disconnectedoperations_1.0.0/sdk/disconnectedoperations/azure-resourcemanager-disconnectedoperations/) |\n| Resource Management - DNS | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dns/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-dns-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-dns_2.53.8/sdk/dns/azure-resourcemanager-dns/) |\n| Resource Management - DNS Resolver | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dnsresolver/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dnsresolver/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-dnsresolver-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-dnsresolver_1.1.0/sdk/dnsresolver/azure-resourcemanager-dnsresolver/) |\n| Resource Management - Durable Task | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-durabletask/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-durabletask-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-durabletask_1.1.0/sdk/durabletask/azure-resourcemanager-durabletask/) |\n| Resource Management - Dynatrace | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dynatrace/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-dynatrace-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-dynatrace_1.0.0/sdk/dynatrace/azure-resourcemanager-dynatrace/) |\n| Resource Management - Edge Actions | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-edgeactions/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-edgeactions-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-edgeactions_1.0.0-beta.1/sdk/edgeactions/azure-resourcemanager-edgeactions/) |\n| Resource Management - Edge Order | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-edgeorder/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-edgeorder-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-edgeorder_1.0.0/sdk/edgeorder/azure-resourcemanager-edgeorder/) |\n| Resource Management - Edge Zones | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-edgezones/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-edgezones-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-edgezones_1.0.0-beta.3/sdk/edgezones/azure-resourcemanager-edgezones/) |\n| Resource Management - Education | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-education/1.0.0-beta.4) | [docs](/java/api/overview/azure/resourcemanager-education-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-education_1.0.0-beta.4/sdk/education/azure-resourcemanager-education/) |\n| Resource Management - Elastic | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-elastic/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-elastic-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-elastic_1.2.0/sdk/elastic/azure-resourcemanager-elastic/) |\n| Resource Management - Elastic SAN | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-elasticsan/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-elasticsan-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-elasticsan_1.2.0/sdk/elasticsan/azure-resourcemanager-elasticsan/) |\n| Resource Management - Event Grid | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-eventgrid/1.2.0)<br>Maven [1.3.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-eventgrid/1.3.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-eventgrid-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-eventgrid_1.2.0/sdk/eventgrid/azure-resourcemanager-eventgrid/) |\n| Resource Management - Event Hubs | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-eventhubs/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-eventhubs-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-eventhubs_2.53.8/sdk/eventhubs/azure-resourcemanager-eventhubs/) |\n| Resource Management - Extended Location | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-extendedlocation/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-extendedlocation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-extendedlocation_1.0.0/sdk/extendedlocation/azure-resourcemanager-extendedlocation/) |\n| Resource Management - Fabric | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-fabric/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-fabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-fabric_1.0.0/sdk/fabric/azure-resourcemanager-fabric/) |\n| Resource Management - Fluid Relay | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-fluidrelay/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-fluidrelay-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-fluidrelay_1.1.0/sdk/fluidrelay/azure-resourcemanager-fluidrelay/) |\n| Resource Management - Front Door | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-frontdoor/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-frontdoor-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-frontdoor_1.1.0/sdk/frontdoor/azure-resourcemanager-frontdoor/) |\n| Resource Management - Graph Services | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-graphservices/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-graphservices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-graphservices_1.1.0/sdk/graphservices/azure-resourcemanager-graphservices/) |\n| Resource Management - HANA on Azure | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hanaonazure/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-hanaonazure-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hanaonazure_1.0.0-beta.3/sdk/hanaonazure/azure-resourcemanager-hanaonazure/) |\n| Resource Management - Hardware Security Module | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hardwaresecuritymodules/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-hardwaresecuritymodules-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hardwaresecuritymodules_1.1.0/sdk/hardwaresecuritymodules/azure-resourcemanager-hardwaresecuritymodules/) |\n| Resource Management - HDInsight | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hdinsight/1.0.0)<br>Maven [1.1.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hdinsight/1.1.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-hdinsight-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hdinsight_1.0.0/sdk/hdinsight/azure-resourcemanager-hdinsight/) |\n| Resource Management - Health Bot | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-healthbot/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-healthbot-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-healthbot_1.1.0/sdk/healthbot/azure-resourcemanager-healthbot/) |\n| Resource Management - Health Data AI Services | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-healthdataaiservices/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-healthdataaiservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-healthdataaiservices_1.0.0/sdk/healthdataaiservices/azure-resourcemanager-healthdataaiservices/) |\n| Resource Management - Healthcare APIs | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-healthcareapis/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-healthcareapis-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-healthcareapis_1.2.0/sdk/healthcareapis/azure-resourcemanager-healthcareapis/) |\n| Resource Management - Hybrid Compute | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridcompute/1.0.0)<br>Maven [1.1.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridcompute/1.1.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-hybridcompute-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hybridcompute_1.0.0/sdk/hybridcompute/azure-resourcemanager-hybridcompute/) |\n| Resource Management - Hybrid Connectivity | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridconnectivity/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridconnectivity/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-hybridconnectivity-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hybridconnectivity_1.1.0/sdk/hybridconnectivity/azure-resourcemanager-hybridconnectivity/) |\n| Resource Management - Hybrid Container Service | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridcontainerservice/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-hybridcontainerservice-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hybridcontainerservice_1.1.0/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/) |\n| Resource Management - Hybrid Kubernetes | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridkubernetes/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridkubernetes/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-hybridkubernetes-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hybridkubernetes_1.0.0/sdk/hybridkubernetes/azure-resourcemanager-hybridkubernetes/) |\n| Resource Management - Hybrid Network | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridnetwork/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-hybridnetwork-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hybridnetwork_1.1.0/sdk/hybridnetwork/azure-resourcemanager-hybridnetwork/) |\n| Resource Management - Image Builder | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-imagebuilder/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-imagebuilder-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-imagebuilder_1.2.0/sdk/imagebuilder/azure-resourcemanager-imagebuilder/) |\n| Resource Management - Impact Reporting | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-impactreporting/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-impactreporting-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-impactreporting_1.0.0-beta.1/sdk/impactreporting/azure-resourcemanager-impactreporting/) |\n| Resource Management - Informatica Data Management | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-informaticadatamanagement/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-informaticadatamanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-informaticadatamanagement_1.0.0/sdk/informaticadatamanagement/azure-resourcemanager-informaticadatamanagement/) |\n| Resource Management - IoT Central | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iotcentral/1.0.0)<br>Maven [1.1.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iotcentral/1.1.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-iotcentral-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-iotcentral_1.0.0/sdk/iotcentral/azure-resourcemanager-iotcentral/) |\n| Resource Management - IoT Firmware Defense | Maven [2.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iotfirmwaredefense/2.0.0) | [docs](/java/api/overview/azure/resourcemanager-iotfirmwaredefense-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-iotfirmwaredefense_2.0.0/sdk/iotfirmwaredefense/azure-resourcemanager-iotfirmwaredefense/) |\n| Resource Management - IoT Hub | Maven [1.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iothub/1.3.0)<br>Maven [1.4.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iothub/1.4.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-iothub-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-iothub_1.3.0/sdk/iothub/azure-resourcemanager-iothub/)<br>GitHub [1.4.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-iothub_1.4.0-beta.2/sdk/iothub/azure-resourcemanager-iothub/) |\n| Resource Management - IoT Operations | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iotoperations/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-iotoperations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-iotoperations_1.1.0/sdk/iotoperations/azure-resourcemanager-iotoperations/) |\n| Resource Management - Key Vault | Maven [2.55.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-keyvault/2.55.2) | [docs](/java/api/overview/azure/resourcemanager-keyvault-readme) | GitHub [2.55.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-keyvault_2.55.2/sdk/keyvault/azure-resourcemanager-keyvault/) |\n| Resource Management - Kubernetes Configuration | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kubernetesconfiguration/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-kubernetesconfiguration-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-kubernetesconfiguration_1.1.0/sdk/kubernetesconfiguration/azure-resourcemanager-kubernetesconfiguration/) |\n| Resource Management - Kubernetesconfiguration-Extensions | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kubernetesconfiguration-extensions/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-kubernetesconfiguration-extensions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-kubernetesconfiguration-extensions_1.0.0/sdk/kubernetesconfiguration/azure-resourcemanager-kubernetesconfiguration-extensions/) |\n| Resource Management - Kubernetesconfiguration-Extensiontypes | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kubernetesconfiguration-extensiontypes/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-kubernetesconfiguration-extensiontypes-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-kubernetesconfiguration-extensiontypes_1.0.0-beta.1/sdk/kubernetesconfiguration/azure-resourcemanager-kubernetesconfiguration-extensiontypes/) |\n| Resource Management - Kubernetesconfiguration-Fluxconfigurations | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kubernetesconfiguration-fluxconfigurations/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-kubernetesconfiguration-fluxconfigurations-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-kubernetesconfiguration-fluxconfigurations_1.0.0-beta.1/sdk/kubernetesconfiguration/azure-resourcemanager-kubernetesconfiguration-fluxconfigurations/) |\n| Resource Management - Kubernetesconfiguration-Privatelinkscopes | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kubernetesconfiguration-privatelinkscopes/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-kubernetesconfiguration-privatelinkscopes-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-kubernetesconfiguration-privatelinkscopes_1.0.0-beta.1/sdk/kubernetesconfiguration/azure-resourcemanager-kubernetesconfiguration-privatelinkscopes/) |\n| Resource Management - Kusto | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kusto/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-kusto-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-kusto_1.2.0/sdk/kusto/azure-resourcemanager-kusto/) |\n| Resource Management - Lab Services | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-labservices/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-labservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-labservices_1.0.0/sdk/labservices/azure-resourcemanager-labservices/) |\n| Resource Management - Lambdatesthyperexecute | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-lambdatesthyperexecute/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-lambdatesthyperexecute-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-lambdatesthyperexecute_1.0.0/sdk/lambdatesthyperexecute/azure-resourcemanager-lambdatesthyperexecute/) |\n| Resource Management - Large Instance | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-largeinstance/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-largeinstance-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-largeinstance_1.0.0-beta.2/sdk/largeinstance/azure-resourcemanager-largeinstance/) |\n| Resource Management - Load Testing | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-loadtesting/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-loadtesting-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-loadtesting_1.1.0/sdk/loadtesting/azure-resourcemanager-loadtesting/) |\n| Resource Management - Log Analytics | Maven [2.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-loganalytics/2.2.0) | [docs](/java/api/overview/azure/resourcemanager-loganalytics-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-loganalytics_2.2.0/sdk/loganalytics/azure-resourcemanager-loganalytics/) |\n| Resource Management - Logic Apps | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-logic/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-logic-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-logic_1.0.0/sdk/logic/azure-resourcemanager-logic/) |\n| Resource Management - Machine Learning | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-machinelearning/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-machinelearning-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-machinelearning_1.1.0/sdk/machinelearning/azure-resourcemanager-machinelearning/) |\n| Resource Management - Maintenance | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-maintenance/1.0.0)<br>Maven [1.1.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-maintenance/1.1.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-maintenance-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-maintenance_1.0.0/sdk/maintenance/azure-resourcemanager-maintenance/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-maintenance_1.1.0-beta.3/sdk/maintenance/azure-resourcemanager-maintenance/) |\n| Resource Management - Managed Applications | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-managedapplications/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-managedapplications-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-managedapplications_1.0.0/sdk/managedapplications/azure-resourcemanager-managedapplications/) |\n| Resource Management - Managed Grafana | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dashboard/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-dashboard-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-dashboard_1.2.0/sdk/dashboard/azure-resourcemanager-dashboard/) |\n| Resource Management - Managed Network Fabric | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-managednetworkfabric/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-managednetworkfabric-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-managednetworkfabric_1.1.0/sdk/managednetworkfabric/azure-resourcemanager-managednetworkfabric/) |\n| Resource Management - Managed Ops | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-managedops/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-managedops-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-managedops_1.0.0-beta.2/sdk/managedops/azure-resourcemanager-managedops/) |\n| Resource Management - Managed Service Identity | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-msi/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-msi-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-msi_2.53.8/sdk/msi/azure-resourcemanager-msi/) |\n| Resource Management - Management Groups | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-managementgroups/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-managementgroups-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-managementgroups_1.0.0-beta.2/sdk/managementgroups/azure-resourcemanager-managementgroups/) |\n| Resource Management - Maps | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-maps/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-maps-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-maps_1.1.0/sdk/maps/azure-resourcemanager-maps/) |\n| Resource Management - MariaDB | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mariadb/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-mariadb-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mariadb_1.0.0/sdk/mariadb/azure-resourcemanager-mariadb/) |\n| Resource Management - Marketplace Ordering | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-marketplaceordering/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-marketplaceordering-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-marketplaceordering_1.0.0/sdk/marketplaceordering/azure-resourcemanager-marketplaceordering/) |\n| Resource Management - Migration Assessment | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-migration-assessment/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-migration-assessment-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-migration-assessment_1.0.0-beta.1/sdk/migration/azure-resourcemanager-migration-assessment/) |\n| Resource Management - Migration Discovery SAP | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-migrationdiscoverysap/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-migrationdiscoverysap-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-migrationdiscoverysap_1.0.0-beta.2/sdk/migrationdiscoverysap/azure-resourcemanager-migrationdiscoverysap/) |\n| Resource Management - Mongo Cluster | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mongocluster/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-mongocluster-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mongocluster_1.1.0/sdk/mongocluster/azure-resourcemanager-mongocluster/) |\n| Resource Management - Mongodbatlas | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mongodbatlas/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-mongodbatlas-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mongodbatlas_1.0.0/sdk/mongodbatlas/azure-resourcemanager-mongodbatlas/) |\n| Resource Management - Monitor | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-monitor/2.53.8)<br>Maven [2.54.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-monitor/2.54.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-monitor-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-monitor_2.53.8/sdk/monitor/azure-resourcemanager-monitor/)<br>GitHub [2.54.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-monitor_2.54.0-beta.1/sdk/monitor/azure-resourcemanager-monitor/) |\n| Resource Management - Monitor-Slis | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-monitor-slis/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-monitor-slis-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-monitor-slis_1.0.0-beta.1/sdk/monitor/azure-resourcemanager-monitor-slis/) |\n| Resource Management - MySQL | Maven [1.0.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mysql/1.0.2) | [docs](/java/api/overview/azure/resourcemanager-mysql-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mysql_1.0.2/sdk/mysql/azure-resourcemanager-mysql/) |\n| Resource Management - MySQL Flexible Server | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mysqlflexibleserver/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-mysqlflexibleserver-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mysqlflexibleserver_1.0.0/sdk/mysqlflexibleserver/azure-resourcemanager-mysqlflexibleserver/) |\n| Resource Management - NetApp Files | Maven [2.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-netapp/2.2.0) | [docs](/java/api/overview/azure/resourcemanager-netapp-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-netapp_2.2.0/sdk/netapp/azure-resourcemanager-netapp/) |\n| Resource Management - Network | Maven [2.58.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-network/2.58.2) | [docs](/java/api/overview/azure/resourcemanager-network-readme) | GitHub [2.58.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-network_2.58.2/sdk/network/azure-resourcemanager-network/) |\n| Resource Management - Network Cloud | Maven [2.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-networkcloud/2.1.0) | [docs](/java/api/overview/azure/resourcemanager-networkcloud-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-networkcloud_2.1.0/sdk/networkcloud/azure-resourcemanager-networkcloud/) |\n| Resource Management - Network Function | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-networkfunction/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-networkfunction-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-networkfunction_1.0.0/sdk/networkfunction/azure-resourcemanager-networkfunction/) |\n| Resource Management - New Relic Observability | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-newrelicobservability/1.2.0)<br>Maven [1.3.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-newrelicobservability/1.3.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-newrelicobservability-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-newrelicobservability_1.2.0/sdk/newrelicobservability/azure-resourcemanager-newrelicobservability/)<br>GitHub [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-newrelicobservability_1.3.0-beta.2/sdk/newrelicobservability/azure-resourcemanager-newrelicobservability/) |\n| Resource Management - Nginx | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-nginx/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-nginx-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-nginx_1.1.0/sdk/nginx/azure-resourcemanager-nginx/) |\n| Resource Management - Notification Hubs | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-notificationhubs/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-notificationhubs-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-notificationhubs_1.0.0/sdk/notificationhubs/azure-resourcemanager-notificationhubs/) |\n| Resource Management - Onlineexperimentation | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-onlineexperimentation/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-onlineexperimentation-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-onlineexperimentation_1.0.0-beta.1/sdk/onlineexperimentation/azure-resourcemanager-onlineexperimentation/) |\n| Resource Management - Open Energy Platform | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-oep/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-oep-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-oep_1.0.0-beta.2/sdk/oep/azure-resourcemanager-oep/) |\n| Resource Management - Operations Management | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-operationsmanagement/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-operationsmanagement-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-operationsmanagement_1.0.0-beta.3/sdk/operationsmanagement/azure-resourcemanager-operationsmanagement/) |\n| Resource Management - Oracle Database | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-oracledatabase/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-oracledatabase-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-oracledatabase_1.2.0/sdk/oracledatabase/azure-resourcemanager-oracledatabase/) |\n| Resource Management - Orbital | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-orbital/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-orbital-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-orbital_1.0.0/sdk/orbital/azure-resourcemanager-orbital/) |\n| Resource Management - Palo Alto Networks - Next Generation Firewall | Maven [1.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-paloaltonetworks-ngfw/1.3.0) | [docs](/java/api/overview/azure/resourcemanager-paloaltonetworks-ngfw-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-paloaltonetworks-ngfw_1.3.0/sdk/paloaltonetworks/azure-resourcemanager-paloaltonetworks-ngfw/) |\n| Resource Management - Peering | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-peering/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-peering-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-peering_1.0.0/sdk/peering/azure-resourcemanager-peering/) |\n| Resource Management - Pinecone Vector DB | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-pineconevectordb/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-pineconevectordb-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-pineconevectordb_1.0.0-beta.2/sdk/pineconevectordb/azure-resourcemanager-pineconevectordb/) |\n| Resource Management - Planetarycomputer | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-planetarycomputer/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-planetarycomputer-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-planetarycomputer_1.0.0/sdk/planetarycomputer/azure-resourcemanager-planetarycomputer/) |\n| Resource Management - Playwright | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-playwright/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-playwright/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-playwright_1.0.0/sdk/playwright/azure-resourcemanager-playwright/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-playwright_1.1.0-beta.1/sdk/playwright/azure-resourcemanager-playwright/) |\n| Resource Management - Policy Insights | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-policyinsights/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-policyinsights/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-policyinsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-policyinsights_1.0.0/sdk/policyinsights/azure-resourcemanager-policyinsights/) |\n| Resource Management - Portalservicescopilot | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-portalservicescopilot/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-portalservicescopilot-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-portalservicescopilot_1.0.0-beta.1/sdk/portalservices/azure-resourcemanager-portalservicescopilot/) |\n| Resource Management - PostgreSQL | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-postgresql/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-postgresql-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-postgresql_1.1.0/sdk/postgresql/azure-resourcemanager-postgresql/) |\n| Resource Management - PostgreSQL Flexible Server | Maven [2.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-postgresqlflexibleserver/2.0.0)<br>Maven [2.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-postgresqlflexibleserver/2.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-postgresqlflexibleserver-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-postgresqlflexibleserver_2.0.0/sdk/postgresqlflexibleserver/azure-resourcemanager-postgresqlflexibleserver/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-postgresqlflexibleserver_2.1.0-beta.1/sdk/postgresqlflexibleserver/azure-resourcemanager-postgresqlflexibleserver/) |\n| Resource Management - Power BI Dedicated | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-powerbidedicated/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-powerbidedicated-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-powerbidedicated_1.1.0/sdk/powerbidedicated/azure-resourcemanager-powerbidedicated/) |\n| Resource Management - Private DNS | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-privatedns/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-privatedns-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-privatedns_2.53.8/sdk/privatedns/azure-resourcemanager-privatedns/) |\n| Resource Management - Provider Hub | Maven [2.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-providerhub/2.1.0) | [docs](/java/api/overview/azure/resourcemanager-providerhub-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-providerhub_2.1.0/sdk/providerhub/azure-resourcemanager-providerhub/) |\n| Resource Management - Purestorageblock | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-purestorageblock/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-purestorageblock-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-purestorageblock_1.0.0/sdk/purestorageblock/azure-resourcemanager-purestorageblock/) |\n| Resource Management - Purview | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-purview/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-purview-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-purview_1.0.0/sdk/purview/azure-resourcemanager-purview/) |\n| Resource Management - Quantum | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-quantum/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-quantum-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-quantum_1.0.0-beta.3/sdk/quantum/azure-resourcemanager-quantum/) |\n| Resource Management - Qumulo | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-qumulo/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-qumulo-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-qumulo_1.1.0/sdk/qumulo/azure-resourcemanager-qumulo/) |\n| Resource Management - Quota | Maven [2.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-quota/2.0.0) | [docs](/java/api/overview/azure/resourcemanager-quota-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-quota_2.0.0/sdk/quota/azure-resourcemanager-quota/) |\n| Resource Management - Recovery Services | Maven [1.5.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-recoveryservices/1.5.0) | [docs](/java/api/overview/azure/resourcemanager-recoveryservices-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-recoveryservices_1.5.0/sdk/recoveryservices/azure-resourcemanager-recoveryservices/) |\n| Resource Management - Recovery Services Backup | Maven [1.6.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-recoveryservicesbackup/1.6.0)<br>Maven [1.7.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-recoveryservicesbackup/1.7.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-recoveryservicesbackup-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-recoveryservicesbackup_1.6.0/sdk/recoveryservicesbackup/azure-resourcemanager-recoveryservicesbackup/)<br>GitHub [1.7.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-recoveryservicesbackup_1.7.0-beta.1/sdk/recoveryservicesbackup/azure-resourcemanager-recoveryservicesbackup/) |\n| Resource Management - Recovery Services Data Replication | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-recoveryservicesdatareplication/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-recoveryservicesdatareplication-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-recoveryservicesdatareplication_1.0.0/sdk/recoveryservicesdatareplication/azure-resourcemanager-recoveryservicesdatareplication/) |\n| Resource Management - Recovery Services Site Recovery | Maven [1.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-recoveryservicessiterecovery/1.3.0) | [docs](/java/api/overview/azure/resourcemanager-recoveryservicessiterecovery-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-recoveryservicessiterecovery_1.3.0/sdk/recoveryservicessiterecovery/azure-resourcemanager-recoveryservicessiterecovery/) |\n| Resource Management - Red Hat OpenShift | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-redhatopenshift/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-redhatopenshift-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-redhatopenshift_1.0.0-beta.1/sdk/redhatopenshift/azure-resourcemanager-redhatopenshift/) |\n| Resource Management - Redis | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-redis/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-redis-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-redis_2.53.8/sdk/redis/azure-resourcemanager-redis/) |\n| Resource Management - Redis Enterprise | Maven [2.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-redisenterprise/2.1.0) | [docs](/java/api/overview/azure/resourcemanager-redisenterprise-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-redisenterprise_2.1.0/sdk/redisenterprise/azure-resourcemanager-redisenterprise/) |\n| Resource Management - Relationships | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-relationships/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-relationships-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-relationships_1.0.0-beta.1/sdk/relationships/azure-resourcemanager-relationships/) |\n| Resource Management - Relay | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-relay/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-relay-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-relay_1.0.0/sdk/relay/azure-resourcemanager-relay/) |\n| Resource Management - Reservations | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-reservations/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-reservations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-reservations_1.0.0/sdk/reservations/azure-resourcemanager-reservations/) |\n| Resource Management - Resource Connector | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourceconnector/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourceconnector/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-resourceconnector-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-resourceconnector_1.1.0/sdk/resourceconnector/azure-resourcemanager-resourceconnector/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-resourceconnector_1.2.0-beta.1/sdk/resourceconnector/azure-resourcemanager-resourceconnector/) |\n| Resource Management - Resource Graph | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourcegraph/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-resourcegraph-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-resourcegraph_1.1.0/sdk/resourcegraph/azure-resourcemanager-resourcegraph/) |\n| Resource Management - Resource Health | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourcehealth/1.0.0)<br>Maven [1.1.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourcehealth/1.1.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-resourcehealth-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-resourcehealth_1.0.0/sdk/resourcehealth/azure-resourcemanager-resourcehealth/) |\n| Resource Management - Resource Mover | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourcemover/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-resourcemover-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-resourcemover_1.2.0/sdk/resourcemover/azure-resourcemanager-resourcemover/) |\n| Resource Management - Resources | Maven [2.54.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resources/2.54.1) | [docs](/java/api/overview/azure/resourcemanager-resources-readme) | GitHub [2.54.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-resources_2.54.1/sdk/resources/azure-resourcemanager-resources/) |\n| Resource Management - Resources-Bicep | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resources-bicep/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-resources-bicep-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-resources-bicep_1.0.0-beta.1/sdk/resources/azure-resourcemanager-resources-bicep/) |\n| Resource Management - Resources-Deploymentstacks | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resources-deploymentstacks/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-resources-deploymentstacks-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-resources-deploymentstacks_1.1.0/sdk/resources/azure-resourcemanager-resources-deploymentstacks/) |\n| Resource Management - Secretsstoreextension | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-secretsstoreextension/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-secretsstoreextension-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-secretsstoreextension_1.0.0-beta.1/sdk/secretsstoreextension/azure-resourcemanager-secretsstoreextension/) |\n| Resource Management - Security | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-security/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-security-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-security_1.0.0/sdk/security/azure-resourcemanager-security/) |\n| Resource Management - Security DevOps | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-securitydevops/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-securitydevops-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-securitydevops_1.0.0-beta.1/sdk/securitydevops/azure-resourcemanager-securitydevops/) |\n| Resource Management - Security Insights | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-securityinsights/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-securityinsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-securityinsights_1.0.0/sdk/securityinsights/azure-resourcemanager-securityinsights/) |\n| Resource Management - Self Help | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-selfhelp/1.0.0)<br>Maven [1.1.0-beta.6](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-selfhelp/1.1.0-beta.6) | [docs](/java/api/overview/azure/resourcemanager-selfhelp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-selfhelp_1.0.0/sdk/selfhelp/azure-resourcemanager-selfhelp/)<br>GitHub [1.1.0-beta.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-selfhelp_1.1.0-beta.6/sdk/selfhelp/azure-resourcemanager-selfhelp/) |\n| Resource Management - Service Bus | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicebus/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-servicebus-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-servicebus_2.53.8/sdk/servicebus/azure-resourcemanager-servicebus/) |\n| Resource Management - Service Fabric | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicefabric/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-servicefabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-servicefabric_1.0.0/sdk/servicefabric/azure-resourcemanager-servicefabric/) |\n| Resource Management - Service Fabric Managed Clusters | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicefabricmanagedclusters/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-servicefabricmanagedclusters-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-servicefabricmanagedclusters_1.1.0/sdk/servicefabricmanagedclusters/azure-resourcemanager-servicefabricmanagedclusters/) |\n| Resource Management - Service Linker | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicelinker/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-servicelinker-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-servicelinker_1.0.0/sdk/servicelinker/azure-resourcemanager-servicelinker/) |\n| Resource Management - Service Networking | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicenetworking/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-servicenetworking-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-servicenetworking_1.1.0/sdk/servicenetworking/azure-resourcemanager-servicenetworking/) |\n| Resource Management - Servicegroups | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicegroups/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-servicegroups-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-servicegroups_1.0.0-beta.2/sdk/servicegroups/azure-resourcemanager-servicegroups/) |\n| Resource Management - SignalR | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-signalr/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-signalr-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-signalr_1.0.0/sdk/signalr/azure-resourcemanager-signalr/) |\n| Resource Management - Sitemanager | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-sitemanager/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-sitemanager-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-sitemanager_1.0.0/sdk/sitemanager/azure-resourcemanager-sitemanager/) |\n| Resource Management - Sphere | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-sphere/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-sphere-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-sphere_1.1.0/sdk/sphere/azure-resourcemanager-sphere/) |\n| Resource Management - Spring App Discovery | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-springappdiscovery/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-springappdiscovery-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-springappdiscovery_1.0.0-beta.2/sdk/springappdiscovery/azure-resourcemanager-springappdiscovery/) |\n| Resource Management - SQL | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-sql/2.53.8)<br>Maven [2.54.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-sql/2.54.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-sql-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-sql_2.53.8/sdk/sql/azure-resourcemanager-sql/)<br>GitHub [2.54.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-sql_2.54.0-beta.1/sdk/sql/azure-resourcemanager-sql/) |\n| Resource Management - SQL Virtual Machine | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-sqlvirtualmachine/1.0.0-beta.5) | [docs](/java/api/overview/azure/resourcemanager-sqlvirtualmachine-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-sqlvirtualmachine_1.0.0-beta.5/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/) |\n| Resource Management - Standby Pool | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-standbypool/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-standbypool-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-standbypool_1.1.0/sdk/standbypool/azure-resourcemanager-standbypool/) |\n| Resource Management - Storage | Maven [2.55.5](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storage/2.55.5) | [docs](/java/api/overview/azure/resourcemanager-storage-readme) | GitHub [2.55.5](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-storage_2.55.5/sdk/storage/azure-resourcemanager-storage/) |\n| Resource Management - Storage Actions | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storageactions/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-storageactions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-storageactions_1.0.0/sdk/storageactions/azure-resourcemanager-storageactions/) |\n| Resource Management - Storage Cache | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storagecache/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-storagecache-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-storagecache_1.2.0/sdk/storagecache/azure-resourcemanager-storagecache/) |\n| Resource Management - Storage Mover | Maven [1.4.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storagemover/1.4.0) | [docs](/java/api/overview/azure/resourcemanager-storagemover-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-storagemover_1.4.0/sdk/storagemover/azure-resourcemanager-storagemover/) |\n| Resource Management - Storage Pool | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storagepool/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-storagepool-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-storagepool_1.0.0/sdk/storagepool/azure-resourcemanager-storagepool/) |\n| Resource Management - Storagediscovery | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storagediscovery/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-storagediscovery-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-storagediscovery_1.0.0/sdk/storagediscovery/azure-resourcemanager-storagediscovery/) |\n| Resource Management - Stream Analytics | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-streamanalytics/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-streamanalytics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-streamanalytics_1.0.0/sdk/streamanalytics/azure-resourcemanager-streamanalytics/) |\n| Resource Management - Subscriptions | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-subscription/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-subscription/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-subscription-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-subscription_1.0.0/sdk/subscription/azure-resourcemanager-subscription/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-subscription_1.1.0-beta.1/sdk/subscription/azure-resourcemanager-subscription/) |\n| Resource Management - Support | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-support/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-support-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-support_1.1.0/sdk/support/azure-resourcemanager-support/) |\n| Resource Management - Synapse | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-synapse/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-synapse-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-synapse_1.0.0/sdk/synapse/azure-resourcemanager-synapse/) |\n| Resource Management - System Center Virtual Machine Manager | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-scvmm/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-scvmm-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-scvmm_1.0.0/sdk/scvmm/azure-resourcemanager-scvmm/) |\n| Resource Management - Terraform | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-terraform/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-terraform-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-terraform_1.0.0-beta.1/sdk/terraform/azure-resourcemanager-terraform/) |\n| Resource Management - Test | Maven [2.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-test/2.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-test-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-test_2.0.0-beta.2/sdk/resourcemanager/azure-resourcemanager-test/) |\n| Resource Management - Time Series Insights | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-timeseriesinsights/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-timeseriesinsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-timeseriesinsights_1.0.0/sdk/timeseriesinsights/azure-resourcemanager-timeseriesinsights/) |\n| Resource Management - Traffic Manager | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-trafficmanager/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-trafficmanager-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-trafficmanager_2.53.8/sdk/trafficmanager/azure-resourcemanager-trafficmanager/) |\n| Resource Management - Trusted Signing | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-trustedsigning/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-trustedsigning-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-trustedsigning_1.0.0-beta.1/sdk/trustedsigning/azure-resourcemanager-trustedsigning/) |\n| Resource Management - VMware Solution by CloudSimple | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-vmwarecloudsimple/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-vmwarecloudsimple-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-vmwarecloudsimple_1.0.0-beta.3/sdk/vmwarecloudsimple/azure-resourcemanager-vmwarecloudsimple/) |\n| Resource Management - Voice Services | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-voiceservices/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-voiceservices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-voiceservices_1.1.0/sdk/voiceservices/azure-resourcemanager-voiceservices/) |\n| Resource Management - Web PubSub | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-webpubsub/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-webpubsub-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-webpubsub_1.1.0/sdk/webpubsub/azure-resourcemanager-webpubsub/) |\n| Resource Management - Weights & Biases | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-weightsandbiases/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-weightsandbiases-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-weightsandbiases_1.0.0-beta.1/sdk/weightsandbiases/azure-resourcemanager-weightsandbiases/) |\n| Resource Management - Workloadorchestration | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-workloadorchestration/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-workloadorchestration-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-workloadorchestration_1.0.0-beta.1/sdk/workloadorchestration/azure-resourcemanager-workloadorchestration/) |\n| Resource Management - Workloads | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-workloads/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-workloads-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-workloads_1.1.0/sdk/workloads/azure-resourcemanager-workloads/) |\n| Resource Management - Workloads SAP Virtual Instance | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-workloadssapvirtualinstance/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-workloadssapvirtualinstance-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-workloadssapvirtualinstance_1.0.0/sdk/workloadssapvirtualinstance/azure-resourcemanager-workloadssapvirtualinstance/) |\n| Azure Identity Spring | Maven [1.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-identity-spring/1.14.0) |  | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-identity-spring_1.14.0/sdk/spring/azure-identity-spring/) |\n| Azure Spring Boot BOM | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-bom/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Active Directory | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-active-directory/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Active Directory B2C | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-active-directory-b2c/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Cosmos | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-cosmos/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Key Vault Certificates | Maven [3.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-keyvault-certificates/3.14.0) |  | GitHub [3.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-boot-starter-keyvault-certificates_3.14.0/sdk/spring/azure-spring-boot-starter-keyvault-certificates/) |\n| Azure Spring Boot Starter Key Vault Secrets | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-keyvault-secrets/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Service bus Jms | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-servicebus-jms/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Storage | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-storage/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Appconfiguration Config | Maven [2.11.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-appconfiguration-config/2.11.0) |  | GitHub [2.11.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-appconfiguration-config_2.11.0/sdk/appconfiguration/azure-spring-cloud-appconfiguration-config/) |\n| Azure Spring Cloud Appconfiguration Config Web | Maven [2.11.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-appconfiguration-config-web/2.11.0) | [docs](/java/api/overview/azure/spring-cloud-appconfiguration-config-web-readme) | GitHub [2.11.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-appconfiguration-config-web_2.11.0/sdk/appconfiguration/azure-spring-cloud-appconfiguration-config-web/) |\n| Azure Spring Cloud Autoconfigure | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-autoconfigure/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Context | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-context/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-context_2.14.0/sdk/spring/azure-spring-cloud-context/) |\n| Azure Spring Cloud Dependencies | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-dependencies/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Feature Management | Maven [2.10.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-feature-management/2.10.0) | [docs](/java/api/overview/azure/spring-cloud-feature-management-readme) | GitHub [2.10.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-feature-management_2.10.0/sdk/appconfiguration/azure-spring-cloud-feature-management/) |\n| Azure Spring Cloud Feature Management Web | Maven [2.10.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-feature-management-web/2.10.0) | [docs](/java/api/overview/azure/spring-cloud-feature-management-web-readme) | GitHub [2.10.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-feature-management-web_2.10.0/sdk/appconfiguration/azure-spring-cloud-feature-management-web/) |\n| Azure Spring Cloud Integration Core | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-core/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Integration Event Hubs | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-eventhubs/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Integration Service Bus | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-servicebus/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Integration Storage Queue | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-storage-queue/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Integration Test | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-test/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-integration-test_2.14.0/sdk/spring/azure-spring-integration-test/) |\n| Azure Spring Cloud Messaging | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-messaging/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Starter Appconfiguration Config | Maven [2.11.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-appconfiguration-config/2.11.0) | [docs](/java/api/overview/azure/spring-cloud-starter-appconfiguration-config-readme) | GitHub [2.11.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-starter-appconfiguration-config_2.11.0/sdk/appconfiguration/azure-spring-cloud-starter-appconfiguration-config/) |\n| Azure Spring Cloud Starter Cache | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-cache/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-starter-cache_2.14.0/sdk/spring/azure-spring-cloud-starter-cache/) |\n| Azure Spring Cloud Starter Event Hubs | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-eventhubs/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Starter Event Hubs Kafka | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-eventhubs-kafka/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-starter-eventhubs-kafka_2.14.0/sdk/spring/azure-spring-cloud-starter-eventhubs-kafka/) |\n| Azure Spring Cloud Starter Service bus | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-servicebus/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Starter Storage Queue | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-storage-queue/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Storage | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-storage/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-storage_2.14.0/sdk/spring/azure-spring-cloud-storage/) |\n| Azure Spring Cloud Stream Binder Event Hubs | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-eventhubs/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Stream Binder Service bus Core | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-servicebus-core/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Stream Binder Service bus Queue | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-servicebus-queue/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Stream Binder Service bus Topic | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-servicebus-topic/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Stream Binder Test | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-test/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-stream-binder-test_2.14.0/sdk/spring/azure-spring-cloud-stream-binder-test/) |\n| Azure Spring Cloud Telemetry | Maven [2.5.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-telemetry/2.5.0) |  | GitHub [2.5.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-telemetry_2.5.0/sdk/spring/azure-spring-cloud-telemetry/) |\n| Key Vault - JCA | Maven [2.11.0](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-jca/2.11.0) |  | GitHub [2.11.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-jca_2.11.0/sdk/keyvault/azure-security-keyvault-jca/) |\n| Spring Azure Docker Compose | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-docker-compose/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-docker-compose_7.2.0/sdk/spring/spring-cloud-azure-docker-compose/) |\n| Spring Azure Starter KeyVault JCA | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-keyvault-jca/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-keyvault-jca_7.2.0/sdk/spring/spring-cloud-azure-starter-keyvault-jca/) |\n| Spring Cloud Azure Actuator | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-actuator/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-actuator_7.2.0/sdk/spring/spring-cloud-azure-actuator/) |\n| Spring Cloud Azure Actuator AutoConfigure | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-actuator-autoconfigure/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-actuator-autoconfigure_7.2.0/sdk/spring/spring-cloud-azure-actuator-autoconfigure/) |\n| Spring Cloud Azure Appconfiguration Config | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-appconfiguration-config/7.2.0) | [docs](/java/api/overview/azure/spring-cloud-azure-appconfiguration-config-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-appconfiguration-config_7.2.0/sdk/spring/spring-cloud-azure-appconfiguration-config/) |\n| Spring Cloud Azure Appconfiguration Config Web | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-appconfiguration-config-web/7.2.0) | [docs](/java/api/overview/azure/spring-cloud-azure-appconfiguration-config-web-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-appconfiguration-config-web_7.2.0/sdk/spring/spring-cloud-azure-appconfiguration-config-web/) |\n| Spring Cloud Azure Autoconfigure | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-autoconfigure/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-autoconfigure_7.2.0/sdk/spring/spring-cloud-azure-autoconfigure/) |\n| Spring Cloud Azure Core | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-core/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-core_7.2.0/sdk/spring/spring-cloud-azure-core/) |\n| Spring Cloud Azure Dependencies | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-dependencies/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-dependencies_7.2.0/sdk/boms/spring-cloud-azure-dependencies/) |\n| Spring Cloud Azure Feature Management | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-feature-management/7.2.0) | [docs](/java/api/overview/azure/spring-cloud-azure-feature-management-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-feature-management_7.2.0/sdk/spring/spring-cloud-azure-feature-management/) |\n| Spring Cloud Azure Feature Management Web | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-feature-management-web/7.2.0) | [docs](/java/api/overview/azure/spring-cloud-azure-feature-management-web-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-feature-management-web_7.2.0/sdk/spring/spring-cloud-azure-feature-management-web/) |\n| Spring Cloud Azure Native Configuration | Maven [4.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-native-configuration/4.0.0-beta.1) |  | GitHub [4.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/spring-cloud-azure-native-configuration_4.0.0-beta.1/sdk/spring-experimental/spring-cloud-azure-native-configuration/) |\n| Spring Cloud Azure Resource Manager | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-resourcemanager/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-resourcemanager_7.2.0/sdk/spring/spring-cloud-azure-resourcemanager/) |\n| Spring Cloud Azure Service | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-service/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-service_7.2.0/sdk/spring/spring-cloud-azure-service/) |\n| Spring Cloud Azure Starter | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter_7.2.0/sdk/spring/spring-cloud-azure-starter/) |\n| Spring Cloud Azure Starter Active Directory | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-active-directory/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-active-directory_7.2.0/sdk/spring/spring-cloud-azure-starter-active-directory/) |\n| Spring Cloud Azure Starter Active Directory B2C | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-active-directory-b2c/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-active-directory-b2c_7.2.0/sdk/spring/spring-cloud-azure-starter-active-directory-b2c/) |\n| Spring Cloud Azure Starter Actuator | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-actuator/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-actuator_7.2.0/sdk/spring/spring-cloud-azure-starter-actuator/) |\n| Spring Cloud Azure Starter App Configuration | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-appconfiguration/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-appconfiguration_7.2.0/sdk/spring/spring-cloud-azure-starter-appconfiguration/) |\n| Spring Cloud Azure Starter Cosmos DB | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-cosmos/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-cosmos_7.2.0/sdk/spring/spring-cloud-azure-starter-cosmos/) |\n| Spring Cloud Azure Starter Data Cosmos DB | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-data-cosmos/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-data-cosmos_7.2.0/sdk/spring/spring-cloud-azure-starter-data-cosmos/) |\n| Spring Cloud Azure Starter Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-eventhubs_7.2.0/sdk/spring/spring-cloud-azure-starter-eventhubs/) |\n| Spring Cloud Azure Starter Integration Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-integration-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-integration-eventhubs_7.2.0/sdk/spring/spring-cloud-azure-starter-integration-eventhubs/) |\n| Spring Cloud Azure Starter Integration Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-integration-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-integration-servicebus_7.2.0/sdk/spring/spring-cloud-azure-starter-integration-servicebus/) |\n| Spring Cloud Azure Starter Integration Storage Queue | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-integration-storage-queue/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-integration-storage-queue_7.2.0/sdk/spring/spring-cloud-azure-starter-integration-storage-queue/) |\n| Spring Cloud Azure Starter Key Vault Certificates | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-keyvault-certificates/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-keyvault-certificates_7.2.0/sdk/spring/spring-cloud-azure-starter-keyvault-certificates/) |\n| Spring Cloud Azure Starter Key Vault Secrets | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-keyvault-secrets/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-keyvault-secrets_7.2.0/sdk/spring/spring-cloud-azure-starter-keyvault-secrets/) |\n| Spring Cloud Azure Starter Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-servicebus_7.2.0/sdk/spring/spring-cloud-azure-starter-servicebus/) |\n| Spring Cloud Azure Starter Service Bus JMS | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-servicebus-jms/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-servicebus-jms_7.2.0/sdk/spring/spring-cloud-azure-starter-servicebus-jms/) |\n| Spring Cloud Azure Starter Storage | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-storage/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-storage_7.2.0/sdk/spring/spring-cloud-azure-starter-storage/) |\n| Spring Cloud Azure Starter Storage Blob | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-storage-blob/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-storage-blob_7.2.0/sdk/spring/spring-cloud-azure-starter-storage-blob/) |\n| Spring Cloud Azure Starter Storage File Share | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-storage-file-share/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-storage-file-share_7.2.0/sdk/spring/spring-cloud-azure-starter-storage-file-share/) |\n| Spring Cloud Azure Starter Storage Queue | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-storage-queue/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-storage-queue_7.2.0/sdk/spring/spring-cloud-azure-starter-storage-queue/) |\n| Spring Cloud Azure Starter Stream Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-stream-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-stream-eventhubs_7.2.0/sdk/spring/spring-cloud-azure-starter-stream-eventhubs/) |\n| Spring Cloud Azure Starter Stream Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-stream-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-stream-servicebus_7.2.0/sdk/spring/spring-cloud-azure-starter-stream-servicebus/) |\n| Spring Cloud Azure Stream Binder Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-stream-binder-eventhubs_7.2.0/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/) |\n| Spring Cloud Azure Stream Binder Event Hubs Core | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-eventhubs-core/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-stream-binder-eventhubs-core_7.2.0/sdk/spring/spring-cloud-azure-stream-binder-eventhubs-core/) |\n| Spring Cloud Azure Stream Binder Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-stream-binder-servicebus_7.2.0/sdk/spring/spring-cloud-azure-stream-binder-servicebus/) |\n| Spring Cloud Azure Stream Binder Service Bus Core | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-servicebus-core/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-stream-binder-servicebus-core_7.2.0/sdk/spring/spring-cloud-azure-stream-binder-servicebus-core/) |\n| Spring Cloud Azure Trace on Sleuth | Maven [4.20.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-trace-sleuth/4.20.0)<br>Maven [6.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-trace-sleuth/6.0.0-beta.2) |  | GitHub [4.20.0](https://github.com/Azure/azure-sdk-for-java/tree/spring-cloud-azure-trace-sleuth_4.20.0/sdk/spring/spring-cloud-azure-trace-sleuth/) |\n| Spring Cloud Integration Azure Core | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-core/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-integration-azure-core_7.2.0/sdk/spring/spring-integration-azure-core/) |\n| Spring Data Cosmos | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure/azure-spring-data-cosmos/7.2.0) | [docs](/java/api/overview/azure/spring-data-cosmos-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-spring-data-cosmos_7.2.0/sdk/spring/azure-spring-data-cosmos/) |\n| Spring Integration Azure Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-integration-azure-eventhubs_7.2.0/sdk/spring/spring-integration-azure-eventhubs/) |\n| Spring Integration Azure Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-integration-azure-servicebus_7.2.0/sdk/spring/spring-integration-azure-servicebus/) |\n| Spring Integration Azure Storage Queue | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-storage-queue/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-integration-azure-storage-queue_7.2.0/sdk/spring/spring-integration-azure-storage-queue/) |\n| Spring Messaging Azure | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-messaging-azure/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-messaging-azure_7.2.0/sdk/spring/spring-messaging-azure/) |\n| Spring Messaging Azure Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-messaging-azure-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-messaging-azure-eventhubs_7.2.0/sdk/spring/spring-messaging-azure-eventhubs/) |\n| Spring Messaging Azure Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-messaging-azure-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-messaging-azure-servicebus_7.2.0/sdk/spring/spring-messaging-azure-servicebus/) |\n| Spring Messaging Azure Storage Queue | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-messaging-azure-storage-queue/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-messaging-azure-storage-queue_7.2.0/sdk/spring/spring-messaging-azure-storage-queue/) |\n| Spring Test Containers | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-testcontainers/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-testcontainers_7.2.0/sdk/spring/spring-cloud-azure-testcontainers/) |\n| spring-cloud-azure-starter-appconfiguration-config | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-appconfiguration-config/7.2.0) | [docs](/java/api/overview/azure/spring-cloud-azure-starter-appconfiguration-config-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-appconfiguration-config_7.2.0/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/) |\n| spring-cloud-azure-starter-data-redis-lettuce | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-data-redis-lettuce/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-data-redis-lettuce_7.2.0/sdk/spring/spring-cloud-azure-starter-data-redis-lettuce/) |\n| spring-cloud-azure-starter-eventgrid | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-eventgrid/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-eventgrid_7.2.0/sdk/spring/spring-cloud-azure-starter-eventgrid/) |\n| spring-cloud-azure-starter-jdbc-mysql | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-jdbc-mysql/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-jdbc-mysql_7.2.0/sdk/spring/spring-cloud-azure-starter-jdbc-mysql/) |\n| spring-cloud-azure-starter-jdbc-postgresql | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-jdbc-postgresql/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-jdbc-postgresql_7.2.0/sdk/spring/spring-cloud-azure-starter-jdbc-postgresql/) |\n| spring-cloud-azure-starter-keyvault | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-keyvault/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-keyvault_7.2.0/sdk/spring/spring-cloud-azure-starter-keyvault/) |\n| spring-cloud-azure-starter-monitor | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-monitor/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-monitor_7.2.0/sdk/spring/spring-cloud-azure-starter-monitor/) |\n| spring-cloud-azure-starter-redis | Maven [4.20.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-redis/4.20.0) |  | GitHub [4.20.0](https://github.com/Azure/azure-sdk-for-java/tree/spring-cloud-azure-starter-redis_4.20.0/sdk/spring/spring-cloud-azure-starter-redis/) |\n| Azure Client SDK Parent | Maven [2.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.v2/azure-client-sdk-parent/2.0.0-beta.2) |  |  |\n| Azure Core (Legacy) | Maven [2.0.0](https://central.sonatype.com/artifact/com.microsoft.azure/core/2.0.0) |  |  |\n| Azure Log4j 1.2 | Maven [2.0.0](https://central.sonatype.com/artifact/com.microsoft.azure/log4j1_2/2.0.0) |  |  |\n| Azure Log4j2 | Maven [2.0.0](https://central.sonatype.com/artifact/com.microsoft.azure/log4j2/2.0.0) |  |  |\n| Azure Logback | Maven [2.0.0](https://central.sonatype.com/artifact/com.microsoft.azure/logback/2.0.0) |  |  |\n| Azure Web (Legacy) | Maven [2.0.0](https://central.sonatype.com/artifact/com.microsoft.azure/web/2.0.0) |  |  |\n| azure-cosmos-cassandra-spring-data-extensions | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure/azure-cosmos-cassandra-spring-data-extensions/1.1.0)<br>Maven [1.1.2-1](https://central.sonatype.com/artifact/com.azure/azure-cosmos-cassandra-spring-data-extensions/1.1.2-1) |  |  |\n| azure-functions-java-library-dapr | Maven [1.0.1](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library-dapr/1.0.1) |  |  |\n| azure-functions-java-library-kusto | Maven [1.0.11-Preview](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library-kusto/1.0.11-Preview) |  |  |\n| azure-gradle-plugins-common | Maven [1.10.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-gradle-plugins-common/1.10.0) |  |  |\n| azure-kusto-log4j | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.kusto/azure-kusto-log4j/1.0.0) |  |  |\n| azure-mariadb-connector-java | Maven [2.7.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-mariadb-connector-java/2.7.0) |  |  |\n| azure-microprofile-bom | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.microprofile/azure-microprofile-bom/1.0.0-beta.3) |  |  |\n| azure-microprofile-config-keyvault | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.microprofile/azure-microprofile-config-keyvault/1.0.0-beta.3) |  |  |\n| azure-microprofile-parent | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.microprofile/azure-microprofile-parent/1.0.0-beta.3) |  |  |\n| azure-sdk-build-tool-maven-plugin | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-sdk-build-tool-maven-plugin/1.0.0) |  |  |\n| azure-spring-apps-maven-plugin | Maven [1.19.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-spring-apps-maven-plugin/1.19.0) |  |  |\n| azure-toolkit-identity-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-identity-lib/0.55.0) |  |  |\n| azure-toolkit-keyvault-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-keyvault-lib/0.55.0) |  |  |\n| azureml-fs-scala-impl | Maven [1.0.4](https://central.sonatype.com/artifact/com.microsoft.azure/azureml-fs-scala-impl/1.0.4) |  |  |\n| Client Core Parent | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/io.clientcore/clientcore-parent/1.0.0-beta.3) |  |  |\n| Container Apps Maven Plugin | Maven [0.2.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-container-apps-maven-plugin/0.2.0) |  |  |\n| Face UI | Maven [1.4.8](https://central.sonatype.com/artifact/com.azure/azure-ai-vision-face-ui/1.4.8) |  |  |\n| flink-connector-kusto | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.kusto/flink-connector-kusto/1.0.2) |  |  |\n| Fuctions OpenAI | Maven [0.5.0-preview](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library-openai/0.5.0-preview) |  |  |\n| Functions - MySQL | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library-mysql/1.0.2) |  |  |\n| Functions Java OpenTelemetry | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-opentelemetry/1.0.0) |  |  |\n| Functiosn - Java SDK Types | Maven [1.0.1](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-sdktypes/1.0.1) |  |  |\n| hdi-oauth-token-utils | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.hdinsight/hdi-oauth-token-utils/1.0.2) |  |  |\n| HDInsights OAuth Token Utils Shaded | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.hdinsight/hdi-oauth-token-utils-shaded/1.0.2) |  |  |\n| Java Library Redis | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library-redis/1.0.0) |  |  |\n| javamsalruntime | Maven [0.17.4](https://central.sonatype.com/artifact/com.microsoft.azure/javamsalruntime/0.17.4) |  |  |\n| JSON - GSON JSON | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-json-gson/1.0.0-beta.3) |  |  |\n| JSON - JSON Reflect | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-json-reflect/1.0.0-beta.2) |  |  |\n| Kusto Spark | Maven [5.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.kusto/kusto-spark_2.4_2.12/5.0.0) |  |  |\n| ONNX Protobuf | Maven [0.9.24](https://central.sonatype.com/artifact/com.microsoft.azure/onnx-protobuf_2.13/0.9.24) |  |  |\n| Postgre Single Library | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-postgre-single-lib/0.55.0) |  |  |\n| Schema Registry - JSON | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.microsoft.azure/azure-schemaregistry-kafka-json/1.0.0-beta.5) |  |  |\n| Service Bus -JMS | Maven [2.1.0](https://central.sonatype.com/artifact/com.azure/azure-servicebus-jms/2.1.0) |  |  |\n| Service Bus Library | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-servicebus-lib/0.55.0) |  |  |\n| Service Linker Library | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-servicelinker-lib/0.55.0) |  |  |\n| Spring Cloud Azure Native Reachability | Maven [5.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-native-reachability/5.0.0-beta.1) |  |  |\n| Spring Cloud Azure Starter - OpenAI | Maven [4.9.0-beta.1](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-openai/4.9.0-beta.1) |  |  |\n| Spring Cloud Azure Stream Binder Test | Maven [4.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-test/4.0.0-beta.2) |  |  |\n| Active Directory Authentication Library | Maven [1.6.7](https://central.sonatype.com/artifact/com.microsoft.azure/adal4j/1.6.7) | [docs](/java/api/overview/azure/activedirectory) |  |\n| Actors | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.servicefabric/actors-preview/1.0.0) |  |  |\n| Application Insights - Agent | Maven [3.7.8](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-agent/3.7.8) |  |  |\n| Application Insights - Collectd | Maven [2.6.4](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-collectd/2.6.4)<br>Maven [2.6.3-BETA-HEYA-TEST](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-collectd/2.6.3-BETA-HEYA-TEST) |  |  |\n| Application Insights - Core | Maven [3.7.8](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-core/3.7.8) |  |  |\n| Application Insights - Logging Log4j1_2 | Maven [2.6.4](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-logging-log4j1_2/2.6.4) |  |  |\n| Application Insights - Logging Log4j2 | Maven [2.6.4](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-logging-log4j2/2.6.4) |  |  |\n| Application Insights - Logging Logback | Maven [2.6.4](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-logging-logback/2.6.4) |  |  |\n| Application Insights - Profiler Agent | Maven [0.2.0](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-profiler-agent/0.2.0) |  |  |\n| Application Insights - Profiler Library | Maven [0.2.0](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-profiler-library/0.2.0) |  |  |\n| Application Insights - Profiler Telemetrymodule | Maven [0.2.1](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-profiler-telemetrymodule/0.2.1) |  |  |\n| Application Insights - Profiler Uploader | Maven [0.2.0](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-profiler-uploader/0.2.0) |  |  |\n| Application Insights - Spring Boot Starter | Maven [2.6.4](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-spring-boot-starter/2.6.4)<br>Maven [2.6.3-BETA-HEYA-TEST](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-spring-boot-starter/2.6.3-BETA-HEYA-TEST) |  |  |\n| Application Insights - Web | Maven [3.7.8](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-web/3.7.8) |  |  |\n| Application Insights - Web Auto | Maven [2.6.4](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-web-auto/2.6.4)<br>Maven [2.6.3-BETA-HEYA-TEST](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-web-auto/2.6.3-BETA-HEYA-TEST) |  |  |\n| AutoRest Build Tools | Maven [1.7.14](https://central.sonatype.com/artifact/com.microsoft.azure/autorest-build-tools/1.7.14) |  |  |\n| AutoRest Client Runtime for Java | Maven [2.1.1](https://central.sonatype.com/artifact/com.microsoft.azure.v2/autorest-clientruntime-for-java/2.1.1) |  |  |\n| Azure AI Vision SDK - Common | Maven [0.15.1-beta.1](https://central.sonatype.com/artifact/com.azure/azure-ai-vision-common/0.15.1-beta.1) |  | GitHub [0.15.1-beta.1](https://msasg.visualstudio.com/DefaultCollection/Skyman/_git/Carbon) |\n| Azure AI Vision SDK - Internal | Maven [0.15.1-beta.1](https://central.sonatype.com/artifact/com.azure/azure-ai-vision-common-internal/0.15.1-beta.1) |  | GitHub [0.15.1-beta.1](https://msasg.visualstudio.com/DefaultCollection/Skyman/_git/Carbon) |\n| Azure Functions Java Library RabbitMQ | Maven [2.1.0](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library-rabbitmq/2.1.0) |  |  |\n| Azure Profile hybrid | Maven [1.0.0-beta-1](https://central.sonatype.com/artifact/com.microsoft.azure.profile_2019_03_01_hybrid/azure/1.0.0-beta-1) |  |  |\n| azure-communication-administration | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure/azure-communication-administration/1.0.0-beta.4) |  |  |\n| azure-schemaregistry-spark-avro | Maven [1.0.1](https://central.sonatype.com/artifact/com.microsoft.azure/azure-schemaregistry-spark-avro/1.0.1) |  |  |\n| azure-storage-fastpath | Maven [1.0.0-beta.6](https://central.sonatype.com/artifact/com.azure/azure-storage-fastpath/1.0.0-beta.6) |  |  |\n| azure-toolkit-applicationinsights-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-applicationinsights-lib/0.55.0) |  |  |\n| Batch | Maven [11.2.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-batch/11.2.0) | [docs](/java/api/overview/azure/batch) | GitHub [11.2.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/batch/microsoft-azure-batch) |\n| Client Authentication | Maven [1.7.14](https://central.sonatype.com/artifact/com.microsoft.azure/azure-client-authentication/1.7.14) |  |  |\n| Client Runtime | Maven [1.7.14](https://central.sonatype.com/artifact/com.microsoft.azure/azure-client-runtime/1.7.14) |  |  |\n| Cognitive Services - Parent | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.cognitiveservices/azure-cognitiveservices-parent/1.0.2) |  |  |\n| Confidential Ledger | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-data-confidentialledger/1.0.0-beta.1) |  |  |\n| Conversational Language Understanding | Maven [0.0.1-beta](https://central.sonatype.com/artifact/com.microsoft.azure.cognitiveservices/azure-cognitiveservices-language/0.0.1-beta) |  |  |\n| Core - Client - Legacy | Maven [0.9.8](https://central.sonatype.com/artifact/com.microsoft.azure/azure-core/0.9.8) | [docs](/java/api/overview/azure/core-readme?view=azure-java-preview&amp;preserve-view=true) |  |\n| Core - Parent | Maven [1.0.0-preview.2](https://central.sonatype.com/artifact/com.azure/azure-core-parent/1.0.0-preview.2) |  |  |\n| Core - Tracing OpenCensus | Maven [1.0.0-preview.4](https://central.sonatype.com/artifact/com.azure/azure-core-tracing-opencensus/1.0.0-preview.4) |  | GitHub [1.0.0-preview.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-core-tracing-opencensus_1.0.0-preview.4/sdk/core/azure-core-tracing-opencensus/) |\n| Cosmos DB | Maven [3.7.6](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmos/3.7.6) | [docs](/java/api/overview/azure/cosmos-readme) | GitHub [3.7.6](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/cosmos/azure-cosmos) |\n| Cosmos DB - Commons | Maven [2.6.16](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmosdb-commons/2.6.16)<br>Maven [3.0.0-beta-3](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmosdb-commons/3.0.0-beta-3) |  |  |\n| Cosmos DB - Parent | Maven [4.0.0-preview.2](https://central.sonatype.com/artifact/com.azure/azure-cosmos-parent/4.0.0-preview.2) |  |  |\n| Cosmos DB - Parent | Maven [3.5.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmos-parent/3.5.0) |  |  |\n| Digital Twins Device Client Preview | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot/digital-twin-service-client-preview/1.0.0) |  |  |\n| Document DB - Spring Boot Auto Configure | Maven [0.1.7](https://central.sonatype.com/artifact/com.microsoft.azure/azure-documentdb-spring-boot-autoconfigure/0.1.7) |  |  |\n| Document DB - Spring Boot Starter | Maven [2.0.5](https://central.sonatype.com/artifact/com.microsoft.azure/azure-documentdb-spring-boot-starter/2.0.5) |  |  |\n| Durable Functions - Java Library | Maven [1.0.1](https://central.sonatype.com/artifact/com.microsoft/durabletask-azure-functions/1.0.1) |  | GitHub [1.0.1](https://github.com/microsoft/durabletask-java) |\n| Event Hubs - Databricks | Maven [3.4.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-eventhubs-databricks_2.11/3.4.0) |  |  |\n| Event Hubs - Parent | Maven [5.0.0-preview.1](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventhubs-parent/5.0.0-preview.1) |  |  |\n| Event Hubs - Reactive | Maven [0.5.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-eventhubs-reactive_2.12/0.5.0) |  |  |\n| Event Hubs - Spark | Maven [2.3.22](https://central.sonatype.com/artifact/com.microsoft.azure/azure-eventhubs-spark_2.12/2.3.22) |  |  |\n| Functions - Archetype | Maven [1.66](https://central.sonatype.com/artifact/com.microsoft.azure/azure-functions-archetype/1.66) |  |  |\n| Functions - Java Core | Maven [1.0.0-beta-3](https://central.sonatype.com/artifact/com.microsoft.azure/azure-functions-java-core/1.0.0-beta-3) |  |  |\n| Functions - Java Library | Maven [3.1.0](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library/3.1.0)<br>Maven [3.1.1-alpha](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library/3.1.1-alpha) |  |  |\n| Functions - Java Library Cosmos DB Cassandra | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library-cosmosdbcassandra/1.0.0) |  |  |\n| Functions - Java Library SignalR | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library-signalr/1.0.0) |  |  |\n| Functions - Kotlin Archetype | Maven [1.23](https://central.sonatype.com/artifact/com.microsoft.azure/azure-functions-kotlin-archetype/1.23) |  |  |\n| Internet Analyzer Java | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.microsoft.azure/azure-internet-analyzer-java/1.0.0-beta.1) |  |  |\n| IoT Deps | Maven [2.0.0-preview-001](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot/iot-deps/2.0.0-preview-001) |  |  |\n| IoT Edge - Gateway - Java Binding | Maven [1.1.0](https://central.sonatype.com/artifact/com.microsoft.azure.gateway/gateway-java-binding/1.1.0) |  |  |\n| IoT Edge - Gateway - Linux | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.gateway/gateway-linux/1.0.2) |  |  |\n| IoT Edge - Gateway - Module Base | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.gateway/gateway-module-base/1.0.2) |  |  |\n| IoT Edge - Gateway - Module Simple | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.gateway.archetypes/gateway-module-simple/1.0.0) |  |  |\n| IoT Edge - Gateway - Win32 | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.gateway/gateway-win32/1.0.2) |  |  |\n| IoT Edge Archetype | Maven [1.3.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-iot-edge-archetype/1.3.0) |  |  |\n| IoT Hub - Security Provider | Maven [2.0.1](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.provisioning.security/security-provider/2.0.1)<br>Maven [2.0.0-preview-001](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.provisioning.security/security-provider/2.0.0-preview-001) |  |  |\n| IoT Hub - TPM Provider | Maven [2.0.1](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.provisioning.security/tpm-provider/2.0.1)<br>Maven [2.0.0-preview-001](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.provisioning.security/tpm-provider/2.0.0-preview-001) |  |  |\n| IoT Hub - X509 Provider | Maven [2.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.provisioning.security/x509-provider/2.0.2)<br>Maven [2.0.0-preview-001](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.provisioning.security/x509-provider/2.0.0-preview-001) |  |  |\n| IoT Plug and Play - Device Client | Maven [2.5.0](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot/iot-device-client/2.5.0)<br>Maven [2.0.0-preview-002](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot/iot-device-client/2.0.0-preview-002) |  |  |\n| IoT Service Client | Maven [2.1.9](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot/iot-service-client/2.1.9)<br>Maven [2.0.0-preview-002](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot/iot-service-client/2.0.0-preview-002) | [docs](/java/api/overview/azure/iot) |  |\n| Kusto Data | Maven [6.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.kusto/kusto-data/6.0.2) |  |  |\n| Kusto Ingest | Maven [6.0.2](https://central.sonatype.com/artifact/com.microsoft.azure.kusto/kusto-ingest/6.0.2) |  |  |\n| Kusto Spark | Maven [5.3.1](https://central.sonatype.com/artifact/com.microsoft.azure.kusto/kusto-spark_3.0_2.12/5.3.1) |  |  |\n| Media Services | Maven [0.9.8](https://central.sonatype.com/artifact/com.microsoft.azure/azure-media/0.9.8) |  | GitHub [0.9.8](https://github.com/Azure/azure-sdk-for-java/tree/8ed4b90a4a8d75d018c4f1cf90ede50db2b4b6ce/sdk/mediaservices/microsoft-azure-media) |\n| Native | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.servicefabric/native-preview/1.0.0) |  |  |\n| Parent | Maven [1.41.4](https://central.sonatype.com/artifact/com.microsoft.azure/azure-parent/1.41.4) |  |  |\n| Profile - Parent | Maven [1.0.0-beta-1](https://central.sonatype.com/artifact/com.microsoft.azure.profile_2019_03_01_hybrid/azure-profile-parent/1.0.0-beta-1) |  | GitHub [1.0.0-beta-1](https://github.com/Azure/azure-sdk-for-java/tree/mgmt-release-v2/profiles/2019-03-01-hybrid) |\n| Provisioning Device Client | Maven [2.1.3](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.provisioning/provisioning-device-client/2.1.3)<br>Maven [2.0.0-preview-002](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.provisioning/provisioning-device-client/2.0.0-preview-002) |  |  |\n| Provisioning Service Client | Maven [2.0.3](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.provisioning/provisioning-service-client/2.0.3)<br>Maven [2.0.1-preview-001](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.provisioning/provisioning-service-client/2.0.1-preview-001) |  |  |\n| Qpid Proton J Extensions | Maven [1.2.7](https://central.sonatype.com/artifact/com.microsoft.azure/qpid-proton-j-extensions/1.2.7) |  |  |\n| Relay | Maven [0.0.6](https://central.sonatype.com/artifact/com.microsoft.azure/azure-relay/0.0.6) |  |  |\n| Service Fabric | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.servicefabric/services-preview/1.0.0) |  |  |\n| Service Runtime | Maven [0.9.8](https://central.sonatype.com/artifact/com.microsoft.azure/azure-serviceruntime/0.9.8) |  |  |\n| Speech | Maven [1.28.1](https://central.sonatype.com/artifact/com.microsoft.cognitiveservices.speech/client-sdk/1.28.1) |  | GitHub [1.28.1](https://msasg.visualstudio.com/Skyman/_git/Carbon) |\n| Spring Cloud Maven Plugin | Maven [1.11.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-spring-cloud-maven-plugin/1.11.0) |  |  |\n| Spring Data Azure CosmosDB DocumentDB | Maven [0.1.1](https://central.sonatype.com/artifact/com.microsoft.azure/spring-data-azure-cosmosdb-documentdb/0.1.1) |  |  |\n| Spring Data Azure DocumentDB | Maven [0.1.7](https://central.sonatype.com/artifact/com.microsoft.azure/spring-data-azure-documentdb/0.1.7) |  |  |\n| Spring Data Cosmos Core | Maven [3.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-spring-data-cosmos-core/3.0.0-beta.1) |  |  |\n| Spring Data CosmosDB | Maven [2.3.1](https://central.sonatype.com/artifact/com.microsoft.azure/spring-data-cosmosdb/2.3.1)<br>Maven [3.0.0.M1](https://central.sonatype.com/artifact/com.microsoft.azure/spring-data-cosmosdb/3.0.0.M1) |  |  |\n| Spring Data DocumentDB | Maven [2.0.3](https://central.sonatype.com/artifact/com.microsoft.azure/spring-data-documentdb/2.0.3) |  |  |\n| Storage - Files Data Lake | Maven [2.3.10](https://central.sonatype.com/artifact/com.microsoft.azure/azure-data-lake-store-sdk/2.3.10) | [docs](/java/api/overview/azure/datalake) |  |\n| Storage - Java | Maven [10.0.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-storage-java/10.0.0) |  |  |\n| Support | Maven [0.1.8](https://central.sonatype.com/artifact/com.microsoft.azure/azure-support/0.1.8) |  |  |\n| synapseml | Maven [0.9.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml/0.9.3) |  |  |\n| synapseml_2.12 | Maven [1.1.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml_2.12/1.1.3) |  |  |\n| synapseml-cognitive | Maven [0.9.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-cognitive/0.9.3) |  |  |\n| synapseml-cognitive_2.12 | Maven [1.1.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-cognitive_2.12/1.1.3) |  |  |\n| synapseml-core | Maven [0.9.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-core/0.9.3) |  |  |\n| synapseml-core_2.12 | Maven [1.1.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-core_2.12/1.1.3) |  |  |\n| synapseml-deep-learning | Maven [0.9.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-deep-learning/0.9.3) |  |  |\n| synapseml-deep-learning_2.12 | Maven [1.1.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-deep-learning_2.12/1.1.3) |  |  |\n| synapseml-lightgbm | Maven [0.9.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-lightgbm/0.9.3) |  |  |\n| synapseml-lightgbm_2.12 | Maven [1.1.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-lightgbm_2.12/1.1.3) |  |  |\n| synapseml-opencv | Maven [0.9.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-opencv/0.9.3) |  |  |\n| synapseml-opencv_2.12 | Maven [1.1.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-opencv_2.12/1.1.3) |  |  |\n| synapseml-vw | Maven [0.9.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-vw/0.9.3) |  |  |\n| synapseml-vw_2.12 | Maven [1.1.3](https://central.sonatype.com/artifact/com.microsoft.azure/synapseml-vw_2.12/1.1.3) |  |  |\n| synapseutils | Maven [1.1](https://central.sonatype.com/artifact/com.microsoft.azure.synapse/synapseutils/1.1) |  |  |\n| synapseutils_2.11 | Maven [1.5.3](https://central.sonatype.com/artifact/com.microsoft.azure.synapse/synapseutils_2.11/1.5.3) |  |  |\n| synapseutils_2.12 | Maven [1.5.4](https://central.sonatype.com/artifact/com.microsoft.azure.synapse/synapseutils_2.12/1.5.4) |  |  |\n| System Fabric | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.servicefabric/system-fabric-preview/1.0.0) |  |  |\n| TPM Software Stack Java | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure/TSS.Java/1.0.0) |  |  |\n| Transport | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure.servicefabric/transport-preview/1.0.0) |  |  |\n| Websocket Transport Layer | Maven [0.1.3](https://central.sonatype.com/artifact/com.microsoft.azure.sdk.iot.deps/websocket-transport-layer/0.1.3) |  |  |\n| Annotations | Maven [1.10.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-annotations/1.10.0) |  |  |\n| Apache Spark Archetype | Maven [0.1.0](https://central.sonatype.com/artifact/com.microsoft.azure/apache-spark-archetype/0.1.0) |  |  |\n| applicationinsights-runtime-attach | Maven [3.7.8](https://central.sonatype.com/artifact/com.microsoft.azure/applicationinsights-runtime-attach/3.7.8) |  |  |\n| azure-cosmos-cassandra-driver-3 | Maven [1.0.3](https://central.sonatype.com/artifact/com.azure/azure-cosmos-cassandra-driver-3/1.0.3) |  |  |\n| azure-cosmos-cassandra-driver-3 | Maven [0.14.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmos-cassandra-driver-3/0.14.0) |  |  |\n| azure-cosmos-cassandra-driver-3-extensions | Maven [1.0.3](https://central.sonatype.com/artifact/com.azure/azure-cosmos-cassandra-driver-3-extensions/1.0.3) |  |  |\n| azure-cosmos-cassandra-driver-4 | Maven [1.1.2](https://central.sonatype.com/artifact/com.azure/azure-cosmos-cassandra-driver-4/1.1.2) |  |  |\n| azure-cosmos-cassandra-driver-4-extensions | Maven [1.1.2](https://central.sonatype.com/artifact/com.azure/azure-cosmos-cassandra-driver-4-extensions/1.1.2) |  |  |\n| azure-cosmos-spark_3-0_2-12 | Maven [4.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-cosmos-spark_3-0_2-12/4.0.0-beta.1) |  |  |\n| azure-functions-java-core-library | Maven [1.3.0](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-core-library/1.3.0) |  |  |\n| azure-functions-java-library-sql | Maven [2.1.0-preview](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-library-sql/2.1.0-preview) |  |  |\n| azure-functions-java-spi | Maven [1.1.0](https://central.sonatype.com/artifact/com.microsoft.azure.functions/azure-functions-java-spi/1.1.0) |  |  |\n| azure-toolkit-compute-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-compute-lib/0.55.0) |  |  |\n| azure-toolkit-containerapps-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-containerapps-lib/0.55.0) |  |  |\n| azure-toolkit-cosmos-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-cosmos-lib/0.55.0) |  |  |\n| azure-toolkit-database-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-database-lib/0.55.0) |  |  |\n| azure-toolkit-libs | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-libs/0.55.0) |  |  |\n| azure-toolkit-monitor-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-monitor-lib/0.55.0) |  |  |\n| azure-toolkit-postgre-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-postgre-lib/0.55.0) |  |  |\n| azure-toolkit-resource-lib | Maven [0.19.2](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-resource-lib/0.19.2) |  |  |\n| azure-toolkit-sqlserver-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-sqlserver-lib/0.55.0) |  |  |\n| Bill of Materials | Maven [1.0.0.M1](https://central.sonatype.com/artifact/com.microsoft.azure/azure-bom/1.0.0.M1) |  |  |\n| Bill of Materials | Maven [2.3.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-dependencies-bom/2.3.0) |  |  |\n| Cosmos DB - Cassandra Extensions | Maven [0.14.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmos-cassandra-extensions/0.14.0) |  |  |\n| Cosmos DB - Cassandra Extensions Parent | Maven [0.13.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmos-cassandra-extensions.parent/0.13.0) |  |  |\n| Cosmos DB - Cassandra Spark Helper | Maven [1.2.0](https://central.sonatype.com/artifact/com.microsoft.azure.cosmosdb/azure-cosmos-cassandra-spark-helper/1.2.0) |  |  |\n| Cosmos DB - Cassandra Uploader | Maven [1.0.16](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmos-cassandra-uploader/1.0.16) |  |  |\n| Cosmos DB - Change Feed | Maven [1.0.0-beta-2](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmos-change-feed/1.0.0-beta-2) |  |  |\n| Cosmos DB - Change Feed Processor | Maven [0.9.2](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmos-changefeedprocessor/0.9.2) |  |  |\n| Cosmos DB - Direct | Maven [2.6.16](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmosdb-direct/2.6.16)<br>Maven [3.0.0-beta-3](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmosdb-direct/3.0.0-beta-3) |  |  |\n| Cosmos DB - Examples | Maven [3.3.1](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmos-examples/3.3.1) |  |  |\n| Cosmos DB - Gateway | Maven [2.6.16](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmosdb-gateway/2.6.16)<br>Maven [3.0.0-beta-3](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmosdb-gateway/3.0.0-beta-3) |  |  |\n| Cosmos DB - Serialization | Maven [2.9.6](https://central.sonatype.com/artifact/com.azure.data/azure-cosmos-serialization/2.9.6) |  |  |\n| Cosmos DB - Spark | Maven [3.7.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-cosmosdb-spark_2.4.0_2.11/3.7.0) |  |  |\n| Document DB - Bulk Executor | Maven [2.12.5](https://central.sonatype.com/artifact/com.microsoft.azure/documentdb-bulkexecutor/2.12.5) |  |  |\n| Document DB - Bulk Import | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure/documentdb-bulkimport/1.0.2) |  |  |\n| Document DB - Hadoop | Maven [1.2.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-documentdb-hadoop/1.2.0) |  |  |\n| Document DB - Reactive Extension | Maven [0.9.0-rc2](https://central.sonatype.com/artifact/com.microsoft.azure/azure-documentdb-rx/0.9.0-rc2) |  |  |\n| Elastic Database Tools | Maven [1.0.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-elasticdb-tools/1.0.0) |  |  |\n| Event Hubs Library | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-eventhubs-lib/0.55.0) |  |  |\n| kusto-log4j-appender | Maven [2.0.3](https://central.sonatype.com/artifact/com.microsoft.azure.kusto/kusto-log4j-appender/2.0.3) |  |  |\n| Schema Registry - Kafka Avro | Maven [1.1.4](https://central.sonatype.com/artifact/com.microsoft.azure/azure-schemaregistry-kafka-avro/1.1.4) |  |  |\n| Service Bus - JMS | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure/azure-servicebus-jms/1.0.2) |  |  |\n| Service Bus - JMS Connection Factory | Maven [0.0.1](https://central.sonatype.com/artifact/com.microsoft.azure/service-bus-jms-connection-factory/0.0.1) |  |  |\n| Service Fabric | Maven [0.1.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-sfmesh-maven-plugin/0.1.0) |  |  |\n| Session Management - Datastore Azure Cache For Redis | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.microsoft.azure.sessionmanager/sessionmanager-datastore-azurecacheforredis/1.0.0-beta.1) |  |  |\n| Session Management - Tomcat | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.microsoft.azure.sessionmanager/sessionmanager-tomcat/1.0.0-beta.1) |  |  |\n| Spark - Archetype | Maven [0.1.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-spark-archetype/0.1.0) |  |  |\n| Spark - CDM Connector | Maven [0.19.1](https://central.sonatype.com/artifact/com.microsoft.azure/spark-cdm-connector/0.19.1) |  |  |\n| Spark - Kusto Connector | Maven [2.3.1](https://central.sonatype.com/artifact/com.microsoft.azure.kusto/spark-kusto-connector/2.3.1) |  |  |\n| Spark - MsSQL Connector | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure/spark-mssql-connector/1.0.2) |  |  |\n| Spark - Streaming Eventhubs | Maven [2.1.5](https://central.sonatype.com/artifact/com.microsoft.azure/spark-streaming-eventhubs_2.11/2.1.5) |  |  |\n| Spark - Streaming Eventhubs Connector | Maven [2.1.4](https://central.sonatype.com/artifact/com.microsoft.azure/spark-streaming-eventhubs_connector_2.11/2.1.4) |  |  |\n| Spark - Streaming Eventhubs Examples | Maven [2.1.4](https://central.sonatype.com/artifact/com.microsoft.azure/spark-streaming-eventhubs_examples_2.11/2.1.4) |  |  |\n| spark-mssql-connector_2.11_2.4 | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure/spark-mssql-connector_2.11_2.4/1.0.2) |  |  |\n| spark-mssql-connector_2.12 | Maven [1.2.0](https://central.sonatype.com/artifact/com.microsoft.azure/spark-mssql-connector_2.12/1.2.0)<br>Maven [1.3.0-BETA](https://central.sonatype.com/artifact/com.microsoft.azure/spark-mssql-connector_2.12/1.3.0-BETA) |  |  |\n| SQLDB Spark | Maven [1.0.2](https://central.sonatype.com/artifact/com.microsoft.azure/azure-sqldb-spark/1.0.2) |  |  |\n| Management | Maven [0.8.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-management/0.8.0) |  |  |\n| Resource Management - Client Runtime | Maven [1.7.14](https://central.sonatype.com/artifact/com.microsoft.azure/azure-arm-client-runtime/1.7.14) |  | GitHub [1.7.14](https://github.com/Azure/autorest-clientruntime-for-java/tree/master/azure-arm-client-runtime) |\n| Resource Management - Parent | Maven [1.3.2](https://central.sonatype.com/artifact/com.microsoft.azure/azure-arm-parent/1.3.2) |  | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-java/tree/mgmt-release-v2/sdk/parents/azure-arm-parent) |\n| Auth Helper  Plugin | Maven [0.7.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-auth-helper/0.7.0) |  |  |\n| azure-appservice-maven-plugin-lib | Maven [1.44.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-appservice-maven-plugin-lib/1.44.0) |  |  |\n| azure-autorest-customization | Maven [1.0.0-beta.11](https://central.sonatype.com/artifact/com.azure.tools/azure-autorest-customization/1.0.0-beta.11) |  |  |\n| azure-autorest-extension | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure.tools/azure-autorest-extension/1.0.0-beta.5) |  |  |\n| azure-autorest-parent | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure.tools/azure-autorest-parent/1.0.0-beta.5) |  |  |\n| azure-maven-plugins | Maven [1.44.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-maven-plugins/1.44.0) |  |  |\n| azure-toolkit-appservice-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-appservice-lib/0.55.0) |  |  |\n| azure-toolkit-auth-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-auth-lib/0.55.0) |  |  |\n| azure-toolkit-cognitiveservices-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-cognitiveservices-lib/0.55.0) |  |  |\n| azure-toolkit-common-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-common-lib/0.55.0) |  |  |\n| azure-toolkit-containerregistry-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-containerregistry-lib/0.55.0) |  |  |\n| azure-toolkit-containerservice-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-containerservice-lib/0.55.0) |  |  |\n| azure-toolkit-mysql-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-mysql-lib/0.55.0) |  |  |\n| azure-toolkit-mysql-single-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-mysql-single-lib/0.55.0) |  |  |\n| azure-toolkit-redis-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-redis-lib/0.55.0) |  |  |\n| azure-toolkit-springcloud-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-springcloud-lib/0.55.0) |  |  |\n| azure-toolkit-storage-lib | Maven [0.55.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-toolkit-storage-lib/0.55.0) |  |  |\n| Bundler Maven Plugin | Maven [0.0.5](https://central.sonatype.com/artifact/com.microsoft.azure/bundler-maven-plugin/0.0.5) |  |  |\n| codesnippet-maven-plugin | Maven [1.0.0-beta.10](https://central.sonatype.com/artifact/com.azure.tools/codesnippet-maven-plugin/1.0.0-beta.10) |  |  |\n| Functions - Maven Plugin | Maven [1.41.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-functions-maven-plugin/1.41.0) |  |  |\n| Maven - Plugin | Maven [0.2.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-maven-plugin/0.2.0) |  |  |\n| Maven - Plugin Common | Maven [0.2.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-maven-plugin-common/0.2.0) |  |  |\n| Maven - Plugin Lib | Maven [0.1.1](https://central.sonatype.com/artifact/com.microsoft.azure/maven-plugin-lib/0.1.1) |  |  |\n| Maven - Plugin Library | Maven [1.44.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-maven-plugin-lib/1.44.0) |  |  |\n| Maven - Plugins Pom | Maven [1.1.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-maven-plugins-pom/1.1.0) |  |  |\n| onnx-protobuf_2.12 | Maven [0.9.22](https://central.sonatype.com/artifact/com.microsoft.azure/onnx-protobuf_2.12/0.9.22) |  |  |\n| Session Management | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.microsoft.azure.sessionmanager/sessionmanager/1.0.0-beta.1) |  |  |\n| Session Management - Project | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.microsoft.azure.sessionmanager/project/1.0.0-beta.1) |  |  |\n| Tools common | Maven [0.14.0](https://central.sonatype.com/artifact/com.microsoft.azure/azure-tools-common/0.14.0) |  |  |\n| Tracing Util | Maven [0.9.8](https://central.sonatype.com/artifact/com.microsoft.azure/azure-tracing-util/0.9.8) |  |  |\n| Troposphere Maven Plugin | Maven [2.6.0.1](https://central.sonatype.com/artifact/com.azurenight.maven/troposphere-maven-plugin/2.6.0.1) |  |  |\n| Webapp Maven Plugin | Maven [2.14.1](https://central.sonatype.com/artifact/com.microsoft.azure/azure-webapp-maven-plugin/2.14.1) |  |  |\n| Webapp Maven Plugin | Maven [0.1.1](https://central.sonatype.com/artifact/com.microsoft.azure/webapp-maven-plugin/0.1.1) |  |  |\n"
  },
  {
    "path": "articles/includes/java-new.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| JDBC Authentication Plugin for MySQL | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-identity-providers-jdbc-mysql/1.0.0-beta.1) | [docs](/java/api/overview/azure/identity-providers-jdbc-mysql-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity-extensions) |\n| JDBC Authentication Plugin for PostgreSQL | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-identity-providers-jdbc-postgresql/1.0.0-beta.1) | [docs](/java/api/overview/azure/identity-providers-jdbc-postgresql-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity-extensions) |\n| Token-as-password Authentication Core Library | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-identity-providers-core/1.0.0-beta.1) | [docs](/java/api/overview/azure/identity-providers-core-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity-extensions) |\n| Token-as-password Authentication Extensions | Maven [1.2.8](https://central.sonatype.com/artifact/com.azure/azure-identity-extensions/1.2.8) | [docs](/java/api/overview/azure/identity-extensions-readme) | GitHub [1.2.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-identity-extensions_1.2.8/sdk/identity/azure-identity-extensions/) |\n| AI Agents | Maven [2.0.1](https://central.sonatype.com/artifact/com.azure/azure-ai-agents/2.0.1) | [docs](/java/api/overview/azure/ai-agents-readme) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-agents_2.0.1/sdk/ai/azure-ai-agents/) |\n| AI Agents Persistent | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-ai-agents-persistent/1.0.0-beta.2) | [docs](/java/api/overview/azure/ai-agents-persistent-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-agents-persistent_1.0.0-beta.2/sdk/ai/azure-ai-agents-persistent/) |\n| AI Projects | Maven [2.0.1](https://central.sonatype.com/artifact/com.azure/azure-ai-projects/2.0.1) | [docs](/java/api/overview/azure/ai-projects-readme) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-projects_2.0.1/sdk/ai/azure-ai-projects/) |\n| Anomaly Detector | Maven [3.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-ai-anomalydetector/3.0.0-beta.5) | [docs](/java/api/overview/azure/ai-anomalydetector-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [3.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-anomalydetector_3.0.0-beta.5/sdk/anomalydetector/azure-ai-anomalydetector/) |\n| App Configuration | Maven [1.9.2](https://central.sonatype.com/artifact/com.azure/azure-data-appconfiguration/1.9.2) | [docs](/java/api/overview/azure/data-appconfiguration-readme) | GitHub [1.9.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-appconfiguration_1.9.2/sdk/appconfiguration/azure-data-appconfiguration/) |\n| Attestation | Maven [1.1.39](https://central.sonatype.com/artifact/com.azure/azure-security-attestation/1.1.39) | [docs](/java/api/overview/azure/security-attestation-readme) | GitHub [1.1.39](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-attestation_1.1.39/sdk/attestation/azure-security-attestation/) |\n| Azure AI Inference | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-ai-inference/1.0.0-beta.5) | [docs](/java/api/overview/azure/ai-inference-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-inference_1.0.0-beta.5/sdk/ai/azure-ai-inference/) |\n| Azure AI Search | Maven [12.0.0](https://central.sonatype.com/artifact/com.azure/azure-search-documents/12.0.0) | [docs](/java/api/overview/azure/search-documents-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-search-documents_12.0.0/sdk/search/azure-search-documents/) |\n| Azure AI Transcription | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-ai-speech-transcription/1.0.0-beta.3) | [docs](/java/api/overview/azure/ai-speech-transcription-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-speech-transcription_1.0.0-beta.3/sdk/transcription/azure-ai-speech-transcription/) |\n| Azure Blob Storage Checkpoint Store | Maven [1.21.6](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventhubs-checkpointstore-blob/1.21.6) | [docs](/java/api/overview/azure/messaging-eventhubs-checkpointstore-blob-readme) | GitHub [1.21.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-eventhubs-checkpointstore-blob_1.21.6/sdk/eventhubs/azure-messaging-eventhubs-checkpointstore-blob/) |\n| Azure Maps Elevation | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-maps-elevation/1.0.0-beta.2) | [docs](/java/api/overview/azure/maps-elevation-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-elevation_1.0.0-beta.2/sdk/maps/azure-maps-elevation/) |\n| Azure Maps Geolocation | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-maps-geolocation/1.0.0-beta.3) | [docs](/java/api/overview/azure/maps-geolocation-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-geolocation_1.0.0-beta.3/sdk/maps/azure-maps-geolocation/) |\n| Azure Maps TimeZone | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-maps-timezone/1.0.0-beta.2) | [docs](/java/api/overview/azure/maps-timezone-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-timezone_1.0.0-beta.2/sdk/maps/azure-maps-timezone/) |\n| Azure Maps Traffic | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-maps-traffic/1.0.0-beta.1) | [docs](/java/api/overview/azure/maps-traffic-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-traffic_1.0.0-beta.1/sdk/maps/azure-maps-traffic/) |\n| Azure Maps Weather | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-maps-weather/1.0.0-beta.3) | [docs](/java/api/overview/azure/maps-weather-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-weather_1.0.0-beta.3/sdk/maps/azure-maps-weather/) |\n| Azure Redis Checkpoint Store | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventhubs-checkpointstore-jedis/1.0.0-beta.4) | [docs](/java/api/overview/azure/messaging-eventhubs-checkpointstore-jedis-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-messaging-eventhubs-checkpointstore-jedis_1.0.0-beta.4/sdk/eventhubs/azure-messaging-eventhubs-checkpointstore-jedis/) |\n| Azure Remote Rendering | Maven [1.1.41](https://central.sonatype.com/artifact/com.azure/azure-mixedreality-remoterendering/1.1.41) | [docs](/java/api/overview/azure/mixedreality-remoterendering-readme) | GitHub [1.1.41](https://github.com/Azure/azure-sdk-for-java/tree/azure-mixedreality-remoterendering_1.1.41/sdk/remoterendering/azure-mixedreality-remoterendering/) |\n| Azure SDK Template | Maven [1.0.1-beta.5657548](https://central.sonatype.com/artifact/com.azure.v2/azure-sdk-template/1.0.1-beta.5657548) | [docs](/java/api/overview/azure/sdk-template-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.1-beta.5657548](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-sdk-template_1.0.1-beta.5657548/sdk/template-v2/azure-sdk-template/) |\n| Azure SDK Template Three | Maven [1.0.0-beta.5657548](https://central.sonatype.com/artifact/com.azure.v2/azure-sdk-template-three/1.0.0-beta.5657548) | [docs](/java/api/overview/azure/sdk-template-three-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5657548](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-sdk-template-three_1.0.0-beta.5657548/sdk/template-v2/azure-sdk-template-three/) |\n| Azure SDK Template Two | Maven [1.0.0-beta.5657548](https://central.sonatype.com/artifact/com.azure.v2/azure-sdk-template-two/1.0.0-beta.5657548) | [docs](/java/api/overview/azure/sdk-template-two-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5657548](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-sdk-template-two_1.0.0-beta.5657548/sdk/template-v2/azure-sdk-template-two/) |\n| azure-core-http-jdk-httpclient | Maven [1.1.4](https://central.sonatype.com/artifact/com.azure/azure-core-http-jdk-httpclient/1.1.4) | [docs](/java/api/overview/azure/core-http-jdk-httpclient-readme) | GitHub [1.1.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-http-jdk-httpclient_1.1.4/sdk/core/azure-core-http-jdk-httpclient/) |\n| azure-core-http-vertx | Maven [1.1.4](https://central.sonatype.com/artifact/com.azure/azure-core-http-vertx/1.1.4) | [docs](/java/api/overview/azure/core-http-vertx-readme) | GitHub [1.1.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-http-vertx_1.1.4/sdk/core/azure-core-http-vertx/) |\n| azure-core-metrics-opentelemetry | Maven [1.0.0-beta.36](https://central.sonatype.com/artifact/com.azure/azure-core-metrics-opentelemetry/1.0.0-beta.36) | [docs](/java/api/overview/azure/core-metrics-opentelemetry-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.36](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-metrics-opentelemetry_1.0.0-beta.36/sdk/core/azure-core-metrics-opentelemetry/) |\n| azure-json | Maven [1.5.1](https://central.sonatype.com/artifact/com.azure/azure-json/1.5.1) | [docs](/java/api/overview/azure/json-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-json_1.5.1/sdk/serialization/azure-json/) |\n| azure-sdk-archetype | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.tools/azure-sdk-archetype/1.0.0) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-sdk-archetype_1.0.0/sdk/tools/azure-sdk-archetype/) |\n| azure-sdk-build-tool | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.tools/azure-sdk-build-tool/1.0.0) | [docs](/java/api/overview/azure/sdk-build-tool-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-sdk-build-tool_1.0.0/sdk/tools/azure-sdk-build-tool/) |\n| azure-xml | Maven [1.2.1](https://central.sonatype.com/artifact/com.azure/azure-xml/1.2.1) | [docs](/java/api/overview/azure/xml-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-xml_1.2.1/sdk/serialization/azure-xml/) |\n| Calling Server | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure/azure-communication-callingserver/1.0.0-beta.4) |  | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-communication-callingserver_1.0.0-beta.4/sdk/communication/azure-communication-callingserver/) |\n| Client Core | Maven [1.0.0-beta.11](https://central.sonatype.com/artifact/io.clientcore/core/1.0.0-beta.11) | [docs](/java/api/overview/azure/core-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.11](https://github.com/Azure/azure-sdk-for-java/tree/core_1.0.0-beta.11/sdk/clientcore/core/) |\n| Client Core Annotation Processor | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/io.clientcore/annotation-processor/1.0.0-beta.4) |  | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/annotation-processor_1.0.0-beta.4/sdk/clientcore/annotation-processor/) |\n| Client Core HTTP OkHttp3 | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/io.clientcore/http-okhttp3/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/http-okhttp3_1.0.0-beta.2/sdk/clientcore/http-okhttp3/) |\n| Client Core Linting Extensions | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/io.clientcore/linting-extensions/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+linting-extensions_1.0.0-beta.2/sdk/tools/linting-extensions/) |\n| CloudNative CloudEvents with Event Grid  | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventgrid-cloudnative-cloudevents/1.0.0-beta.1) | [docs](/java/api/overview/azure/messaging-eventgrid-cloudnative-cloudevents-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-messaging-eventgrid-cloudnative-cloudevents_1.0.0-beta.1/sdk/eventgrid/azure-messaging-eventgrid-cloudnative-cloudevents/) |\n| Communication Call Automation | Maven [1.6.2](https://central.sonatype.com/artifact/com.azure/azure-communication-callautomation/1.6.2) | [docs](/java/api/overview/azure/communication-callautomation-readme) | GitHub [1.6.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-callautomation_1.6.2/sdk/communication/azure-communication-callautomation/) |\n| Communication Chat | Maven [1.6.6](https://central.sonatype.com/artifact/com.azure/azure-communication-chat/1.6.6) | [docs](/java/api/overview/azure/communication-chat-readme) | GitHub [1.6.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-chat_1.6.6/sdk/communication/azure-communication-chat/) |\n| Communication Common | Maven [1.4.6](https://central.sonatype.com/artifact/com.azure/azure-communication-common/1.4.6)<br>Maven [2.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-communication-common/2.0.0-beta.1) | [docs](/java/api/overview/azure/communication-common-readme) | GitHub [1.4.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-common_1.4.6/sdk/communication/azure-communication-common/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-common_2.0.0-beta.1/sdk/communication/azure-communication-common/) |\n| Communication Email | Maven [1.1.3](https://central.sonatype.com/artifact/com.azure/azure-communication-email/1.1.3)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-communication-email/1.2.0-beta.1) | [docs](/java/api/overview/azure/communication-email-readme) | GitHub [1.1.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-email_1.1.3/sdk/communication/azure-communication-email/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-email_1.2.0-beta.1/sdk/communication/azure-communication-email/) |\n| Communication Identity | Maven [1.6.11](https://central.sonatype.com/artifact/com.azure/azure-communication-identity/1.6.11) | [docs](/java/api/overview/azure/communication-identity-readme) | GitHub [1.6.11](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-identity_1.6.11/sdk/communication/azure-communication-identity/) |\n| Communication JobRouter | Maven [1.1.19](https://central.sonatype.com/artifact/com.azure/azure-communication-jobrouter/1.1.19) | [docs](/java/api/overview/azure/communication-jobrouter-readme) | GitHub [1.1.19](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-jobrouter_1.1.19/sdk/communication/azure-communication-jobrouter/) |\n| Communication Messages | Maven [1.1.10](https://central.sonatype.com/artifact/com.azure/azure-communication-messages/1.1.10)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-communication-messages/1.2.0-beta.1) | [docs](/java/api/overview/azure/communication-messages-readme) | GitHub [1.1.10](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-messages_1.1.10/sdk/communication/azure-communication-messages/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-messages_1.2.0-beta.1/sdk/communication/azure-communication-messages/) |\n| Communication Network Traversal | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure/azure-communication-networktraversal/1.1.0) | [docs](/java/api/overview/azure/communication-networktraversal-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-communication-networktraversal_1.1.0/sdk/communication/azure-communication-networktraversal/) |\n| Communication Phone Numbers | Maven [1.4.4](https://central.sonatype.com/artifact/com.azure/azure-communication-phonenumbers/1.4.4) | [docs](/java/api/overview/azure/communication-phonenumbers-readme) | GitHub [1.4.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-phonenumbers_1.4.4/sdk/communication/azure-communication-phonenumbers/) |\n| Communication Rooms | Maven [1.2.7](https://central.sonatype.com/artifact/com.azure/azure-communication-rooms/1.2.7) | [docs](/java/api/overview/azure/communication-rooms-readme) | GitHub [1.2.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-rooms_1.2.7/sdk/communication/azure-communication-rooms/) |\n| Communication Sms | Maven [1.1.39](https://central.sonatype.com/artifact/com.azure/azure-communication-sms/1.1.39) | [docs](/java/api/overview/azure/communication-sms-readme) | GitHub [1.1.39](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-communication-sms_1.1.39/sdk/communication/azure-communication-sms/) |\n| Compute Batch | Maven [1.0.0-beta.6](https://central.sonatype.com/artifact/com.azure/azure-compute-batch/1.0.0-beta.6) | [docs](/java/api/overview/azure/compute-batch-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-compute-batch_1.0.0-beta.6/sdk/batch/azure-compute-batch/) |\n| Confidential Ledger | Maven [1.0.35](https://central.sonatype.com/artifact/com.azure/azure-security-confidentialledger/1.0.35)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-security-confidentialledger/1.1.0-beta.1) | [docs](/java/api/overview/azure/security-confidentialledger-readme) | GitHub [1.0.35](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-confidentialledger_1.0.35/sdk/confidentialledger/azure-security-confidentialledger/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-confidentialledger_1.1.0-beta.1/sdk/confidentialledger/azure-security-confidentialledger/) |\n| Container Registry | Maven [1.2.23](https://central.sonatype.com/artifact/com.azure/azure-containers-containerregistry/1.2.23) | [docs](/java/api/overview/azure/containers-containerregistry-readme) | GitHub [1.2.23](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-containers-containerregistry_1.2.23/sdk/containerregistry/azure-containers-containerregistry/) |\n| Content Safety | Maven [1.0.18](https://central.sonatype.com/artifact/com.azure/azure-ai-contentsafety/1.0.18) | [docs](/java/api/overview/azure/ai-contentsafety-readme) | GitHub [1.0.18](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-contentsafety_1.0.18/sdk/contentsafety/azure-ai-contentsafety/) |\n| Content Understanding | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure/azure-ai-contentunderstanding/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-ai-contentunderstanding/1.1.0-beta.1) | [docs](/java/api/overview/azure/ai-contentunderstanding-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-contentunderstanding_1.0.0/sdk/contentunderstanding/azure-ai-contentunderstanding/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-contentunderstanding_1.1.0-beta.1/sdk/contentunderstanding/azure-ai-contentunderstanding/) |\n| Core - Client - AMQP | Maven [2.11.4](https://central.sonatype.com/artifact/com.azure/azure-core-amqp/2.11.4) | [docs](/java/api/overview/azure/core-amqp-readme) | GitHub [2.11.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-amqp_2.11.4/sdk/core/azure-core-amqp/) |\n| Core - Client - Core | Maven [1.58.0](https://central.sonatype.com/artifact/com.azure/azure-core/1.58.0) | [docs](/java/api/overview/azure/core-readme) | GitHub [1.58.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core_1.58.0/sdk/core/azure-core/) |\n| Core - Client - Core Experimental | Maven [1.0.0-beta.67](https://central.sonatype.com/artifact/com.azure/azure-core-experimental/1.0.0-beta.67) | [docs](/java/api/overview/azure/core-experimental-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.67](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-experimental_1.0.0-beta.67/sdk/core/azure-core-experimental/) |\n| Core - Client - Core Serializer Apache Avro | Maven [1.0.0-beta.64](https://central.sonatype.com/artifact/com.azure/azure-core-serializer-avro-apache/1.0.0-beta.64) | [docs](/java/api/overview/azure/core-serializer-avro-apache-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.64](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-serializer-avro-apache_1.0.0-beta.64/sdk/core/azure-core-serializer-avro-apache/) |\n| Core - Client - Core Serializer Apache Jackson | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-core-serializer-avro-jackson/1.0.0-beta.1) | [docs](/java/api/overview/azure/core-serializer-avro-jackson-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-core-serializer-avro-jackson_1.0.0-beta.1/sdk/core/azure-core-serializer-avro-jackson/) |\n| Core - Client - Core Serializer GSON JSON | Maven [1.4.4](https://central.sonatype.com/artifact/com.azure/azure-core-serializer-json-gson/1.4.4) | [docs](/java/api/overview/azure/core-serializer-json-gson-readme) | GitHub [1.4.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-serializer-json-gson_1.4.4/sdk/core/azure-core-serializer-json-gson/) |\n| Core - Client - Core Serializer Jackson JSON | Maven [1.6.4](https://central.sonatype.com/artifact/com.azure/azure-core-serializer-json-jackson/1.6.4) | [docs](/java/api/overview/azure/core-serializer-json-jackson-readme) | GitHub [1.6.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-serializer-json-jackson_1.6.4/sdk/core/azure-core-serializer-json-jackson/) |\n| Core - Client - HTTP Netty | Maven [1.16.4](https://central.sonatype.com/artifact/com.azure/azure-core-http-netty/1.16.4) | [docs](/java/api/overview/azure/core-http-netty-readme) | GitHub [1.16.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-http-netty_1.16.4/sdk/core/azure-core-http-netty/) |\n| Core - Client - HTTP OkHttp | Maven [1.13.4](https://central.sonatype.com/artifact/com.azure/azure-core-http-okhttp/1.13.4) | [docs](/java/api/overview/azure/core-http-okhttp-readme) | GitHub [1.13.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-http-okhttp_1.13.4/sdk/core/azure-core-http-okhttp/) |\n| Core - Client - Test | Maven [1.26.2](https://central.sonatype.com/artifact/com.azure/azure-core-test/1.26.2)<br>Maven [1.27.0-beta.15](https://central.sonatype.com/artifact/com.azure/azure-core-test/1.27.0-beta.15) | [docs](/java/api/overview/azure/core-test-readme) | GitHub [1.26.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-test_1.26.2/sdk/core/azure-core-test/)<br>GitHub [1.27.0-beta.15](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-test_1.27.0-beta.15/sdk/core/azure-core-test/) |\n| Core - Plugin - Tracing OpenTelemetry Plugin | Maven [1.0.0-beta.63](https://central.sonatype.com/artifact/com.azure/azure-core-tracing-opentelemetry/1.0.0-beta.63) | [docs](/java/api/overview/azure/core-tracing-opentelemetry-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.63](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-tracing-opentelemetry_1.0.0-beta.63/sdk/core/azure-core-tracing-opentelemetry/) |\n| Cosmos DB | Maven [4.80.0](https://central.sonatype.com/artifact/com.azure/azure-cosmos/4.80.0) | [docs](/java/api/overview/azure/cosmos-readme) | GitHub [4.80.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos_4.80.0/sdk/cosmos/azure-cosmos/) |\n| Cosmos Kafka Connect | Maven [2.10.0](https://central.sonatype.com/artifact/com.azure.cosmos.kafka/azure-cosmos-kafka-connect/2.10.0) |  | GitHub [2.10.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-kafka-connect_2.10.0/sdk/cosmos/azure-cosmos-kafka-connect/) |\n| Cosmos Spark 3.4 | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-4_2-12/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_3-4_2-12_4.48.0/sdk/cosmos/azure-cosmos-spark_3-4_2-12/) |\n| Cosmos Spark 3.5 | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-5_2-12/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_3-5_2-12_4.48.0/sdk/cosmos/azure-cosmos-spark_3-5_2-12/) |\n| Cosmos Spark 3.5 | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-5_2-13/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_3-5_2-13_4.48.0/sdk/cosmos/azure-cosmos-spark_3-5_2-13/) |\n| Cosmos Spark 4.0 | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_4-0_2-13/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_4-0_2-13_4.48.0/sdk/cosmos/azure-cosmos-spark_4-0_2-13/) |\n| Cosmos Test | Maven [1.0.0-beta.18](https://central.sonatype.com/artifact/com.azure/azure-cosmos-test/1.0.0-beta.18) | [docs](/java/api/overview/azure/cosmos-test-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.18](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-test_1.0.0-beta.18/sdk/cosmos/azure-cosmos-test/) |\n| Defender EASM | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-analytics-defender-easm/1.0.0-beta.1) | [docs](/java/api/overview/azure/analytics-defender-easm-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-defender-easm_1.0.0-beta.1/sdk/easm/azure-analytics-defender-easm/) |\n| Dev Center | Maven [1.0.15](https://central.sonatype.com/artifact/com.azure/azure-developer-devcenter/1.0.15) | [docs](/java/api/overview/azure/developer-devcenter-readme) | GitHub [1.0.15](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-developer-devcenter_1.0.15/sdk/devcenter/azure-developer-devcenter/) |\n| Device Update | Maven [1.0.33](https://central.sonatype.com/artifact/com.azure/azure-iot-deviceupdate/1.0.33) | [docs](/java/api/overview/azure/iot-deviceupdate-readme) | GitHub [1.0.33](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-iot-deviceupdate_1.0.33/sdk/deviceupdate/azure-iot-deviceupdate/) |\n| Digital Twins | Maven [1.5.6](https://central.sonatype.com/artifact/com.azure/azure-digitaltwins-core/1.5.6) | [docs](/java/api/overview/azure/digitaltwins-core-readme) | GitHub [1.5.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-digitaltwins-core_1.5.6/sdk/digitaltwins/azure-digitaltwins-core/) |\n| Document Intelligence | Maven [1.0.8](https://central.sonatype.com/artifact/com.azure/azure-ai-documentintelligence/1.0.8) | [docs](/java/api/overview/azure/ai-documentintelligence-readme) | GitHub [1.0.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-documentintelligence_1.0.8/sdk/documentintelligence/azure-ai-documentintelligence/) |\n| Document Translation | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-ai-documenttranslator/1.0.0-beta.1) | [docs](/java/api/overview/azure/ai-documenttranslator-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-documenttranslator_1.0.0-beta.1/sdk/translation/azure-ai-documenttranslator/) |\n| Document Translation | Maven [1.0.8](https://central.sonatype.com/artifact/com.azure/azure-ai-translation-document/1.0.8) | [docs](/java/api/overview/azure/ai-translation-document-readme) | GitHub [1.0.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-translation-document_1.0.8/sdk/translation/azure-ai-translation-document/) |\n| Event Grid | Maven [4.31.6](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventgrid/4.31.6) | [docs](/java/api/overview/azure/messaging-eventgrid-readme) | GitHub [4.31.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-eventgrid_4.31.6/sdk/eventgrid/azure-messaging-eventgrid/) |\n| Event Grid Namespaces | Maven [1.1.10](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventgrid-namespaces/1.1.10) | [docs](/java/api/overview/azure/messaging-eventgrid-namespaces-readme) | GitHub [1.1.10](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-eventgrid-namespaces_1.1.10/sdk/eventgrid/azure-messaging-eventgrid-namespaces/) |\n| Event Hubs | Maven [5.21.4](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventhubs/5.21.4) | [docs](/java/api/overview/azure/messaging-eventhubs-readme) | GitHub [5.21.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-eventhubs_5.21.4/sdk/eventhubs/azure-messaging-eventhubs/) |\n| Fabric Cosmos Spark Auth | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/fabric-cosmos-spark-auth_3/1.1.0) |  | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/fabric-cosmos-spark-auth_3_1.1.0/sdk/cosmos/fabric-cosmos-spark-auth_3/) |\n| Face | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-ai-vision-face/1.0.0-beta.2) | [docs](/java/api/overview/azure/ai-vision-face-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-vision-face_1.0.0-beta.2/sdk/face/azure-ai-vision-face/) |\n| FarmBeats | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-verticals-agrifood-farming/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-verticals-agrifood-farming_1.0.0-beta.3/sdk/agrifood/azure-verticals-agrifood-farming/) |\n| Form Recognizer | Maven [4.1.13](https://central.sonatype.com/artifact/com.azure/azure-ai-formrecognizer/4.1.13) | [docs](/java/api/overview/azure/ai-formrecognizer-readme) | GitHub [4.1.13](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-formrecognizer_4.1.13/sdk/formrecognizer/azure-ai-formrecognizer/) |\n| Health Deidentification | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure/azure-health-deidentification/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-health-deidentification/1.1.0-beta.1) | [docs](/java/api/overview/azure/health-deidentification-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-health-deidentification_1.0.0/sdk/healthdataaiservices/azure-health-deidentification/) |\n| Health Insights Cancer Profiling | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-health-insights-cancerprofiling/1.0.0-beta.1) | [docs](/java/api/overview/azure/health-insights-cancerprofiling-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-health-insights-cancerprofiling_1.0.0-beta.1/sdk/healthinsights/azure-health-insights-cancerprofiling/) |\n| Health Insights Clinical Matching | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-health-insights-clinicalmatching/1.0.0-beta.1) | [docs](/java/api/overview/azure/health-insights-clinicalmatching-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-health-insights-clinicalmatching_1.0.0-beta.1/sdk/healthinsights/azure-health-insights-clinicalmatching/) |\n| Health Insights Radiology Insights | Maven [1.1.7](https://central.sonatype.com/artifact/com.azure/azure-health-insights-radiologyinsights/1.1.7) | [docs](/java/api/overview/azure/health-insights-radiologyinsights-readme) | GitHub [1.1.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-health-insights-radiologyinsights_1.1.7/sdk/healthinsights/azure-health-insights-radiologyinsights/) |\n| Identity | Maven [1.18.3](https://central.sonatype.com/artifact/com.azure/azure-identity/1.18.3)<br>Maven [1.19.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-identity/1.19.0-beta.2) | [docs](/java/api/overview/azure/identity-readme) | GitHub [1.18.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-identity_1.18.3/sdk/identity/azure-identity/)<br>GitHub [1.19.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-identity_1.19.0-beta.2/sdk/identity/azure-identity/) |\n| Identity Broker | Maven [1.1.20](https://central.sonatype.com/artifact/com.azure/azure-identity-broker/1.1.20) | [docs](/java/api/overview/azure/identity-broker-readme) | GitHub [1.1.20](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-identity-broker_1.1.20/sdk/identity/azure-identity-broker/) |\n| Image Analysis | Maven [1.0.8](https://central.sonatype.com/artifact/com.azure/azure-ai-vision-imageanalysis/1.0.8) | [docs](/java/api/overview/azure/ai-vision-imageanalysis-readme) | GitHub [1.0.8](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/vision/azure-ai-vision-imageanalysis) |\n| Key Vault - Administration | Maven [4.7.7](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-administration/4.7.7) | [docs](/java/api/overview/azure/security-keyvault-administration-readme) | GitHub [4.7.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-administration_4.7.7/sdk/keyvault/azure-security-keyvault-administration/) |\n| Key Vault - Certificates | Maven [4.8.7](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-certificates/4.8.7)<br>Maven [4.9.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-certificates/4.9.0-beta.1) | [docs](/java/api/overview/azure/security-keyvault-certificates-readme) | GitHub [4.8.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-certificates_4.8.7/sdk/keyvault/azure-security-keyvault-certificates/)<br>GitHub [4.9.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-certificates_4.9.0-beta.1/sdk/keyvault/azure-security-keyvault-certificates/) |\n| Key Vault - Keys | Maven [4.10.7](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-keys/4.10.7) | [docs](/java/api/overview/azure/security-keyvault-keys-readme) | GitHub [4.10.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-keys_4.10.7/sdk/keyvault/azure-security-keyvault-keys/) |\n| Key Vault - Secrets | Maven [4.10.7](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-secrets/4.10.7)<br>Maven [4.11.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-secrets/4.11.0-beta.1) | [docs](/java/api/overview/azure/security-keyvault-secrets-readme) | GitHub [4.10.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-secrets_4.10.7/sdk/keyvault/azure-security-keyvault-secrets/)<br>GitHub [4.11.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-secrets_4.11.0-beta.1/sdk/keyvault/azure-security-keyvault-secrets/) |\n| Load Testing | Maven [1.0.29](https://central.sonatype.com/artifact/com.azure/azure-developer-loadtesting/1.0.29)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-developer-loadtesting/1.2.0-beta.1) | [docs](/java/api/overview/azure/developer-loadtesting-readme) | GitHub [1.0.29](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-developer-loadtesting_1.0.29/sdk/loadtesting/azure-developer-loadtesting/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-developer-loadtesting_1.2.0-beta.1/sdk/loadtesting/azure-developer-loadtesting/) |\n| Maps Render | Maven [2.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-maps-render/2.0.0-beta.2) | [docs](/java/api/overview/azure/maps-render-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-render_2.0.0-beta.2/sdk/maps/azure-maps-render/) |\n| Maps Route | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-maps-route/1.0.0-beta.3) | [docs](/java/api/overview/azure/maps-route-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-route_1.0.0-beta.3/sdk/maps/azure-maps-route/) |\n| Maps Search | Maven [2.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-maps-search/2.0.0-beta.2) | [docs](/java/api/overview/azure/maps-search-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-maps-search_2.0.0-beta.2/sdk/maps/azure-maps-search/) |\n| Metrics Advisor | Maven [1.2.13](https://central.sonatype.com/artifact/com.azure/azure-ai-metricsadvisor/1.2.13) | [docs](/java/api/overview/azure/ai-metricsadvisor-readme) | GitHub [1.2.13](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-metricsadvisor_1.2.13/sdk/metricsadvisor/azure-ai-metricsadvisor/) |\n| Mixed Reality Authentication | Maven [1.2.38](https://central.sonatype.com/artifact/com.azure/azure-mixedreality-authentication/1.2.38) | [docs](/java/api/overview/azure/mixedreality-authentication-readme) | GitHub [1.2.38](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-mixedreality-authentication_1.2.38/sdk/mixedreality/azure-mixedreality-authentication/) |\n| Models Repository | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-iot-modelsrepository/1.0.0-beta.1) | [docs](/java/api/overview/azure/iot-modelsrepository-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-iot-modelsrepository_1.0.0-beta.1/sdk/modelsrepository/azure-iot-modelsrepository/) |\n| Monitor Ingestion | Maven [1.2.16](https://central.sonatype.com/artifact/com.azure/azure-monitor-ingestion/1.2.16) | [docs](/java/api/overview/azure/monitor-ingestion-readme) | GitHub [1.2.16](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-monitor-ingestion_1.2.16/sdk/monitor/azure-monitor-ingestion/) |\n| Monitor Query | Maven [1.5.9](https://central.sonatype.com/artifact/com.azure/azure-monitor-query/1.5.9) | [docs](/java/api/overview/azure/monitor-query-readme) | GitHub [1.5.9](https://github.com/Azure/azure-sdk-for-java/tree/azure-monitor-query_1.5.9/sdk/monitor/azure-monitor-query/) |\n| Monitor Query Logs | Maven [1.0.5](https://central.sonatype.com/artifact/com.azure/azure-monitor-query-logs/1.0.5) | [docs](/java/api/overview/azure/monitor-query-logs-readme) | GitHub [1.0.5](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-monitor-query-logs_1.0.5/sdk/monitor/azure-monitor-query-logs/) |\n| Monitor Query Metrics | Maven [1.0.5](https://central.sonatype.com/artifact/com.azure/azure-monitor-query-metrics/1.0.5) | [docs](/java/api/overview/azure/monitor-query-metrics-readme) | GitHub [1.0.5](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-monitor-query-metrics_1.0.5/sdk/monitor/azure-monitor-query-metrics/) |\n| Online Experimentation | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-analytics-onlineexperimentation/1.0.0-beta.1) | [docs](/java/api/overview/azure/analytics-onlineexperimentation-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-onlineexperimentation_1.0.0-beta.1/sdk/onlineexperimentation/azure-analytics-onlineexperimentation/) |\n| OpenAI | Maven [1.0.0-beta.16](https://central.sonatype.com/artifact/com.azure/azure-ai-openai/1.0.0-beta.16) | [docs](/java/api/overview/azure/ai-openai-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.16](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-openai_1.0.0-beta.16/sdk/openai/azure-ai-openai/) |\n| OpenAI Assistants | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-ai-openai-assistants/1.0.0-beta.5) | [docs](/java/api/overview/azure/ai-openai-assistants-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-openai-assistants_1.0.0-beta.5/sdk/openai/azure-ai-openai-assistants/) |\n| OpenTelemetry AutoConfigure | Maven [1.4.0](https://central.sonatype.com/artifact/com.azure/azure-monitor-opentelemetry-autoconfigure/1.4.0) | [docs](/java/api/overview/azure/monitor-opentelemetry-autoconfigure-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-monitor-opentelemetry-autoconfigure_1.4.0/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/) |\n| OpenTelemetry Exporter | Maven [1.0.0-beta.32](https://central.sonatype.com/artifact/com.azure/azure-monitor-opentelemetry-exporter/1.0.0-beta.32) | [docs](/java/api/overview/azure/monitor-opentelemetry-exporter-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.32](https://github.com/Azure/azure-sdk-for-java/tree/azure-monitor-opentelemetry-exporter_1.0.0-beta.32/sdk/monitor/azure-monitor-opentelemetry-exporter/) |\n| Personalizer | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-ai-personalizer/1.0.0-beta.1) | [docs](/java/api/overview/azure/ai-personalizer-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-ai-personalizer_1.0.0-beta.1/sdk/personalizer/azure-ai-personalizer/) |\n| Purview Account | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-account/1.0.0-beta.1) | [docs](/java/api/overview/azure/analytics-purview-account-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-account_1.0.0-beta.1/sdk/purview/azure-analytics-purview-account/) |\n| Purview Administration | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-administration/1.0.0-beta.1) | [docs](/java/api/overview/azure/analytics-purview-administration-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-administration_1.0.0-beta.1/sdk/purview/azure-analytics-purview-administration/) |\n| Purview Catalog | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-catalog/1.0.0-beta.4) | [docs](/java/api/overview/azure/analytics-purview-catalog-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-catalog_1.0.0-beta.4/sdk/purview/azure-analytics-purview-catalog/) |\n| Purview Data Map | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-datamap/1.0.0-beta.2) | [docs](/java/api/overview/azure/analytics-purview-datamap-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-datamap_1.0.0-beta.2/sdk/purview/azure-analytics-purview-datamap/) |\n| Purview Scanning | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-scanning/1.0.0-beta.2) | [docs](/java/api/overview/azure/analytics-purview-scanning-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-scanning_1.0.0-beta.2/sdk/purview/azure-analytics-purview-scanning/) |\n| Purview Sharing | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-sharing/1.0.0-beta.2) | [docs](/java/api/overview/azure/analytics-purview-sharing-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-sharing_1.0.0-beta.2/sdk/purview/azure-analytics-purview-sharing/) |\n| Purview Workflow | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-analytics-purview-workflow/1.0.0-beta.2) | [docs](/java/api/overview/azure/analytics-purview-workflow-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-purview-workflow_1.0.0-beta.2/sdk/purview/azure-analytics-purview-workflow/) |\n| Quantum Jobs | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-quantum-jobs/1.0.0-beta.1) | [docs](/java/api/overview/azure/quantum-jobs-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-quantum-jobs_1.0.0-beta.1/sdk/quantum/azure-quantum-jobs/) |\n| Schema Registry | Maven [1.5.11](https://central.sonatype.com/artifact/com.azure/azure-data-schemaregistry/1.5.11) | [docs](/java/api/overview/azure/data-schemaregistry-readme) | GitHub [1.5.11](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-schemaregistry_1.5.11/sdk/schemaregistry/azure-data-schemaregistry/) |\n| Schema Registry - Avro | Maven [1.1.32](https://central.sonatype.com/artifact/com.azure/azure-data-schemaregistry-apacheavro/1.1.32)<br>Maven [1.2.0-beta.2](https://central.sonatype.com/artifact/com.azure/azure-data-schemaregistry-apacheavro/1.2.0-beta.2) | [docs](/java/api/overview/azure/data-schemaregistry-apacheavro-readme) | GitHub [1.1.32](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-schemaregistry-apacheavro_1.1.32/sdk/schemaregistry/azure-data-schemaregistry-apacheavro/)<br>GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-schemaregistry-apacheavro_1.2.0-beta.2/sdk/schemaregistry/azure-data-schemaregistry-apacheavro/) |\n| Schema Registry - Avro | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-data-schemaregistry-avro/1.0.0-beta.5) | [docs](/java/api/overview/azure/data-schemaregistry-avro-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-data-schemaregistry-avro_1.0.0-beta.5/sdk/schemaregistry/azure-data-schemaregistry-avro/) |\n| Schema Registry - JSON | Maven [1.0.8](https://central.sonatype.com/artifact/com.azure/azure-data-schemaregistry-jsonschema/1.0.8) | [docs](/java/api/overview/azure/data-schemaregistry-jsonschema-readme) | GitHub [1.0.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-schemaregistry-jsonschema_1.0.8/sdk/schemaregistry/azure-data-schemaregistry-jsonschema/) |\n| Service Bus | Maven [7.17.18](https://central.sonatype.com/artifact/com.azure/azure-messaging-servicebus/7.17.18)<br>Maven [7.18.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-messaging-servicebus/7.18.0-beta.1) | [docs](/java/api/overview/azure/messaging-servicebus-readme) | GitHub [7.17.18](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-servicebus_7.17.18/sdk/servicebus/azure-messaging-servicebus/)<br>GitHub [7.18.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-servicebus_7.18.0-beta.1/sdk/servicebus/azure-messaging-servicebus/) |\n| Storage - Blobs | Maven [12.33.4](https://central.sonatype.com/artifact/com.azure/azure-storage-blob/12.33.4)<br>Maven [12.35.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-blob/12.35.0-beta.1) | [docs](/java/api/overview/azure/storage-blob-readme) | GitHub [12.33.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob_12.33.4/sdk/storage/azure-storage-blob/)<br>GitHub [12.35.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob_12.35.0-beta.1/sdk/storage/azure-storage-blob/) |\n| Storage - Blobs Batch | Maven [12.29.4](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-batch/12.29.4)<br>Maven [12.31.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-batch/12.31.0-beta.1) | [docs](/java/api/overview/azure/storage-blob-batch-readme) | GitHub [12.29.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-batch_12.29.4/sdk/storage/azure-storage-blob-batch/)<br>GitHub [12.31.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-batch_12.31.0-beta.1/sdk/storage/azure-storage-blob-batch/) |\n| Storage - Blobs Changefeed | Maven [12.0.0-beta.36](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-changefeed/12.0.0-beta.36) | [docs](/java/api/overview/azure/storage-blob-changefeed-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [12.0.0-beta.36](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-changefeed_12.0.0-beta.36/sdk/storage/azure-storage-blob-changefeed/) |\n| Storage - Blobs Cryptography | Maven [12.32.4](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-cryptography/12.32.4)<br>Maven [12.34.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-cryptography/12.34.0-beta.1) | [docs](/java/api/overview/azure/storage-blob-cryptography-readme) | GitHub [12.32.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-cryptography_12.32.4/sdk/storage/azure-storage-blob-cryptography/)<br>GitHub [12.34.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-cryptography_12.34.0-beta.1/sdk/storage/azure-storage-blob-cryptography/) |\n| Storage - Blobs NIO | Maven [12.0.0-beta.37](https://central.sonatype.com/artifact/com.azure/azure-storage-blob-nio/12.0.0-beta.37) | [docs](/java/api/overview/azure/storage-blob-nio-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [12.0.0-beta.37](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-blob-nio_12.0.0-beta.37/sdk/storage/azure-storage-blob-nio/) |\n| Storage - Files Data Lake | Maven [12.26.4](https://central.sonatype.com/artifact/com.azure/azure-storage-file-datalake/12.26.4)<br>Maven [12.28.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-file-datalake/12.28.0-beta.1) | [docs](/java/api/overview/azure/storage-file-datalake-readme) | GitHub [12.26.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-file-datalake_12.26.4/sdk/storage/azure-storage-file-datalake/)<br>GitHub [12.28.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-file-datalake_12.28.0-beta.1/sdk/storage/azure-storage-file-datalake/) |\n| Storage - Files Share | Maven [12.29.3](https://central.sonatype.com/artifact/com.azure/azure-storage-file-share/12.29.3)<br>Maven [12.31.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-file-share/12.31.0-beta.1) | [docs](/java/api/overview/azure/storage-file-share-readme) | GitHub [12.29.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-file-share_12.29.3/sdk/storage/azure-storage-file-share/)<br>GitHub [12.31.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-file-share_12.31.0-beta.1/sdk/storage/azure-storage-file-share/) |\n| Storage - Internal Avro | Maven [12.18.3](https://central.sonatype.com/artifact/com.azure/azure-storage-internal-avro/12.18.3)<br>Maven [12.20.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-internal-avro/12.20.0-beta.1) | [docs](/java/api/overview/azure/storage-internal-avro-readme) | GitHub [12.18.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-internal-avro_12.18.3/sdk/storage/azure-storage-internal-avro/)<br>GitHub [12.20.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-internal-avro_12.20.0-beta.1/sdk/storage/azure-storage-internal-avro/) |\n| Storage - Queues | Maven [12.28.3](https://central.sonatype.com/artifact/com.azure/azure-storage-queue/12.28.3)<br>Maven [12.30.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-queue/12.30.0-beta.1) | [docs](/java/api/overview/azure/storage-queue-readme) | GitHub [12.28.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-queue_12.28.3/sdk/storage/azure-storage-queue/)<br>GitHub [12.30.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-queue_12.30.0-beta.1/sdk/storage/azure-storage-queue/) |\n| Synapse - AccessControl | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure/azure-analytics-synapse-accesscontrol/1.0.0-beta.4) | [docs](/java/api/overview/azure/analytics-synapse-accesscontrol-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-synapse-accesscontrol_1.0.0-beta.4/sdk/synapse/azure-analytics-synapse-accesscontrol/) |\n| Synapse - Artifacts | Maven [1.0.0-beta.17](https://central.sonatype.com/artifact/com.azure/azure-analytics-synapse-artifacts/1.0.0-beta.17) | [docs](/java/api/overview/azure/analytics-synapse-artifacts-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.17](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-synapse-artifacts_1.0.0-beta.17/sdk/synapse/azure-analytics-synapse-artifacts/) |\n| Synapse - Managed Private Endpoints | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-analytics-synapse-managedprivateendpoints/1.0.0-beta.5) | [docs](/java/api/overview/azure/analytics-synapse-managedprivateendpoints-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-synapse-managedprivateendpoints_1.0.0-beta.5/sdk/synapse/azure-analytics-synapse-managedprivateendpoints/) |\n| Synapse - Monitoring | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-analytics-synapse-monitoring/1.0.0-beta.3) | [docs](/java/api/overview/azure/analytics-synapse-monitoring-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-synapse-monitoring_1.0.0-beta.3/sdk/synapse/azure-analytics-synapse-monitoring/) |\n| Synapse - Spark | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure/azure-analytics-synapse-spark/1.0.0-beta.5) | [docs](/java/api/overview/azure/analytics-synapse-spark-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-analytics-synapse-spark_1.0.0-beta.5/sdk/synapse/azure-analytics-synapse-spark/) |\n| System Events | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure/azure-messaging-eventgrid-systemevents/1.0.0) | [docs](/java/api/overview/azure/messaging-eventgrid-systemevents-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-messaging-eventgrid-systemevents_1.0.0/sdk/eventgrid/azure-messaging-eventgrid-systemevents/) |\n| Tables | Maven [12.5.10](https://central.sonatype.com/artifact/com.azure/azure-data-tables/12.5.10) | [docs](/java/api/overview/azure/data-tables-readme) | GitHub [12.5.10](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-data-tables_12.5.10/sdk/tables/azure-data-tables/) |\n| Text Analytics | Maven [5.5.13](https://central.sonatype.com/artifact/com.azure/azure-ai-textanalytics/5.5.13) | [docs](/java/api/overview/azure/ai-textanalytics-readme) | GitHub [5.5.13](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-textanalytics_5.5.13/sdk/textanalytics/azure-ai-textanalytics/) |\n| Text Translation | Maven [1.1.9](https://central.sonatype.com/artifact/com.azure/azure-ai-translation-text/1.1.9)<br>Maven [2.0.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-ai-translation-text/2.0.0-beta.1) | [docs](/java/api/overview/azure/ai-translation-text-readme) | GitHub [1.1.9](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-translation-text_1.1.9/sdk/translation/azure-ai-translation-text/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-translation-text_2.0.0-beta.1/sdk/translation/azure-ai-translation-text/) |\n| unknown | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_4-1_2-13/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_4-1_2-13_4.48.0/sdk/cosmos/azure-cosmos-spark_4-1_2-13/) |\n| Video Analyzer Edge | Maven [1.0.0-beta.6](https://central.sonatype.com/artifact/com.azure/azure-media-videoanalyzer-edge/1.0.0-beta.6) | [docs](/java/api/overview/azure/media-videoanalyzer-edge-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-java/tree/azure-media-videoanalyzer-edge_1.0.0-beta.6/sdk/videoanalyzer/azure-media-videoanalyzer-edge/) |\n| Voice Live | Maven [1.0.0-beta.6](https://central.sonatype.com/artifact/com.azure/azure-ai-voicelive/1.0.0-beta.6) | [docs](/java/api/overview/azure/ai-voicelive-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-ai-voicelive_1.0.0-beta.6/sdk/voicelive/azure-ai-voicelive/) |\n| Web PubSub | Maven [1.5.5](https://central.sonatype.com/artifact/com.azure/azure-messaging-webpubsub/1.5.5) | [docs](/java/api/overview/azure/messaging-webpubsub-readme) | GitHub [1.5.5](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-webpubsub_1.5.5/sdk/webpubsub/azure-messaging-webpubsub/) |\n| Web PubSub Client | Maven [1.1.8](https://central.sonatype.com/artifact/com.azure/azure-messaging-webpubsub-client/1.1.8) | [docs](/java/api/overview/azure/messaging-webpubsub-client-readme) | GitHub [1.1.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-messaging-webpubsub-client_1.1.8/sdk/webpubsub/azure-messaging-webpubsub-client/) |\n| Cosmos DB Encryption | Maven [2.29.0](https://central.sonatype.com/artifact/com.azure/azure-cosmos-encryption/2.29.0) | [docs](/java/api/overview/azure/cosmos-encryption-readme) | GitHub [2.29.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-encryption_2.29.0/sdk/cosmos/azure-cosmos-encryption/) |\n| OLTP Spark 3.1 Connector for Azure Cosmos DB SQL API | Maven [4.37.1](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-1_2-12/4.37.1) | [docs](/java/api/overview/azure/cosmos-spark_3-1_2-12-readme) | GitHub [4.37.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-cosmos-spark_3-1_2-12_4.37.1/sdk/cosmos/azure-cosmos-spark_3-1_2-12/) |\n| OLTP Spark 3.2 Connector for Azure Cosmos DB SQL API | Maven [4.37.1](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-2_2-12/4.37.1) | [docs](/java/api/overview/azure/cosmos-spark_3-2_2-12-readme) | GitHub [4.37.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-cosmos-spark_3-2_2-12_4.37.1/sdk/cosmos/azure-cosmos-spark_3-2_2-12/) |\n| OLTP Spark 3.3 Connector for Azure Cosmos DB SQL API | Maven [4.48.0](https://central.sonatype.com/artifact/com.azure.cosmos.spark/azure-cosmos-spark_3-3_2-12/4.48.0) |  | GitHub [4.48.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-cosmos-spark_3-3_2-12_4.48.0/sdk/cosmos/azure-cosmos-spark_3-3_2-12/) |\n| SDK - Bill of Materials | Maven [1.3.6](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom/1.3.6) |  | GitHub [1.3.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-sdk-bom_1.3.6/sdk/boms/azure-sdk-bom/) |\n| Storage - Common | Maven [12.32.3](https://central.sonatype.com/artifact/com.azure/azure-storage-common/12.32.3)<br>Maven [12.34.0-beta.1](https://central.sonatype.com/artifact/com.azure/azure-storage-common/12.34.0-beta.1) | [docs](/java/api/overview/azure/storage-common-readme) | GitHub [12.32.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-common_12.32.3/sdk/storage/azure-storage-common/)<br>GitHub [12.34.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-storage-common_12.34.0-beta.1/sdk/storage/azure-storage-common/) |\n| Core - Management - Core | Maven [1.19.4](https://central.sonatype.com/artifact/com.azure/azure-core-management/1.19.4) | [docs](/java/api/overview/azure/core-management-readme) | GitHub [1.19.4](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-core-management_1.19.4/sdk/core/azure-core-management/) |\n| Resource Management | Maven [2.62.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager/2.62.0) | [docs](/java/api/overview/azure/resourcemanager-readme) | GitHub [2.62.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager_2.62.0/sdk/resourcemanager/azure-resourcemanager/) |\n| Resource Management - Advisor | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-advisor/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-advisor-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-advisor_1.0.0/sdk/advisor/azure-resourcemanager-advisor/) |\n| Resource Management - AgriFood | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-agrifood/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-agrifood_1.0.0-beta.2/sdk/agrifood/azure-resourcemanager-agrifood/) |\n| Resource Management - Alerts Management | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-alertsmanagement/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-alertsmanagement-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-alertsmanagement_1.0.0-beta.2/sdk/alertsmanagement/azure-resourcemanager-alertsmanagement/) |\n| Resource Management - API Center | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-apicenter/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-apicenter-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-apicenter_1.1.0/sdk/apicenter/azure-resourcemanager-apicenter/) |\n| Resource Management - API Management | Maven [2.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-apimanagement/2.0.0) | [docs](/java/api/overview/azure/resourcemanager-apimanagement-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-apimanagement_2.0.0/sdk/apimanagement/azure-resourcemanager-apimanagement/) |\n| Resource Management - App Compliance Automation | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appcomplianceautomation/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-appcomplianceautomation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-appcomplianceautomation_1.0.0/sdk/appcomplianceautomation/azure-resourcemanager-appcomplianceautomation/) |\n| Resource Management - App Configuration | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appconfiguration/1.1.0)<br>Maven [1.2.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appconfiguration/1.2.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-appconfiguration-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-appconfiguration_1.1.0/sdk/appconfiguration/azure-resourcemanager-appconfiguration/)<br>GitHub [1.2.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-appconfiguration_1.2.0-beta.2/sdk/appconfiguration/azure-resourcemanager-appconfiguration/) |\n| Resource Management - App Platform | Maven [2.51.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appplatform/2.51.0) | [docs](/java/api/overview/azure/resourcemanager-appplatform-readme) | GitHub [2.51.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-appplatform_2.51.0/sdk/appplatform/azure-resourcemanager-appplatform/) |\n| Resource Management - App Service | Maven [2.55.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appservice/2.55.2) | [docs](/java/api/overview/azure/resourcemanager-appservice-readme) | GitHub [2.55.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-appservice_2.55.2/sdk/appservice/azure-resourcemanager-appservice/) |\n| Resource Management - Application Insights | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-applicationinsights/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-applicationinsights/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-applicationinsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-applicationinsights_1.1.0/sdk/applicationinsights/azure-resourcemanager-applicationinsights/) |\n| Resource Management - Appnetwork | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appnetwork/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-appnetwork-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-appnetwork_1.0.0-beta.1/sdk/appnetwork/azure-resourcemanager-appnetwork/) |\n| Resource Management - Arc Data | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-azurearcdata/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-azurearcdata-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-azurearcdata_1.0.0/sdk/azurearcdata/azure-resourcemanager-azurearcdata/) |\n| Resource Management - Arize AI Observability Eval | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-arizeaiobservabilityeval/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-arizeaiobservabilityeval-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-arizeaiobservabilityeval_1.0.0/sdk/arizeaiobservabilityeval/azure-resourcemanager-arizeaiobservabilityeval/) |\n| Resource Management - Artifact Signing | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-artifactsigning/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-artifactsigning-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-artifactsigning_1.0.0/sdk/artifactsigning/azure-resourcemanager-artifactsigning/) |\n| Resource Management - Astro | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-astro/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-astro-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-astro_1.0.0-beta.2/sdk/astro/azure-resourcemanager-astro/) |\n| Resource Management - Attestation | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-attestation/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-attestation-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-attestation_1.0.0-beta.3/sdk/attestation/azure-resourcemanager-attestation/) |\n| Resource Management - Authorization | Maven [2.53.9](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-authorization/2.53.9)<br>Maven [2.54.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-authorization/2.54.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-authorization-readme) | GitHub [2.53.9](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-authorization_2.53.9/sdk/authorization/azure-resourcemanager-authorization/)<br>GitHub [2.54.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-authorization_2.54.0-beta.1/sdk/authorization/azure-resourcemanager-authorization/) |\n| Resource Management - Automanage | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-automanage/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-automanage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-automanage_1.0.0/sdk/automanage/azure-resourcemanager-automanage/) |\n| Resource Management - Automation | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-automation/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-automation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-automation_1.0.0/sdk/automation/azure-resourcemanager-automation/) |\n| Resource Management - Azure AI Search | Maven [2.54.7](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-search/2.54.7)<br>Maven [2.55.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-search/2.55.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-search-readme) | GitHub [2.54.7](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-search_2.54.7/sdk/search/azure-resourcemanager-search/)<br>GitHub [2.55.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-search_2.55.0-beta.1/sdk/search/azure-resourcemanager-search/) |\n| Resource Management - Azure Stack | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-azurestack/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-azurestack-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-azurestack_1.0.0/sdk/azurestack/azure-resourcemanager-azurestack/) |\n| Resource Management - Azure Stack HCI | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-azurestackhci/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-azurestackhci/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-azurestackhci-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-azurestackhci_1.0.0/sdk/azurestackhci/azure-resourcemanager-azurestackhci/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-azurestackhci_1.1.0-beta.1/sdk/azurestackhci/azure-resourcemanager-azurestackhci/) |\n| Resource Management - Azure VMware Solution | Maven [1.4.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-avs/1.4.0) | [docs](/java/api/overview/azure/resourcemanager-avs-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-avs_1.4.0/sdk/avs/azure-resourcemanager-avs/) |\n| Resource Management - Azurestackhci-Vm | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-azurestackhci-vm/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-azurestackhci-vm-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-azurestackhci-vm_1.0.0-beta.1/sdk/azurestackhci/azure-resourcemanager-azurestackhci-vm/) |\n| Resource Management - BareMetal Infrastructure | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-baremetalinfrastructure/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-baremetalinfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-baremetalinfrastructure_1.0.0/sdk/baremetalinfrastructure/azure-resourcemanager-baremetalinfrastructure/) |\n| Resource Management - Batch | Maven [2.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-batch/2.0.0) | [docs](/java/api/overview/azure/resourcemanager-batch-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-batch_2.0.0/sdk/batch/azure-resourcemanager-batch/) |\n| Resource Management - Batch AI | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-batchai/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-batchai-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-batchai_1.0.0-beta.1/sdk/batchai/azure-resourcemanager-batchai/) |\n| Resource Management - Billing | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-billing/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-billing-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-billing_1.0.0/sdk/billing/azure-resourcemanager-billing/) |\n| Resource Management - Billing Benefits | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-billingbenefits/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-billingbenefits-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-billingbenefits_1.0.0-beta.2/sdk/billingbenefits/azure-resourcemanager-billingbenefits/) |\n| Resource Management - Bot Service | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-botservice/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-botservice-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-botservice_1.0.0/sdk/botservice/azure-resourcemanager-botservice/) |\n| Resource Management - Carbonoptimization | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-carbonoptimization/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-carbonoptimization-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-carbonoptimization_1.0.0/sdk/carbonoptimization/azure-resourcemanager-carbonoptimization/) |\n| Resource Management - Change Analysis | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-changeanalysis/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-changeanalysis-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-changeanalysis_1.1.0/sdk/changeanalysis/azure-resourcemanager-changeanalysis/) |\n| Resource Management - Chaos | Maven [1.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-chaos/1.3.0) | [docs](/java/api/overview/azure/resourcemanager-chaos-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-chaos_1.3.0/sdk/chaos/azure-resourcemanager-chaos/) |\n| Resource Management - Cloud Health | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cloudhealth/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-cloudhealth-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-cloudhealth_1.0.0-beta.1/sdk/cloudhealth/azure-resourcemanager-cloudhealth/) |\n| Resource Management - Cognitive Services | Maven [1.4.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cognitiveservices/1.4.0)<br>Maven [1.5.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cognitiveservices/1.5.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-cognitiveservices-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cognitiveservices_1.4.0/sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/)<br>GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cognitiveservices_1.5.0-beta.1/sdk/cognitiveservices/azure-resourcemanager-cognitiveservices/) |\n| Resource Management - Commerce | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-commerce/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-commerce-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-commerce_1.0.0-beta.3/sdk/commerce/azure-resourcemanager-commerce/) |\n| Resource Management - Communication | Maven [2.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-communication/2.3.0) | [docs](/java/api/overview/azure/resourcemanager-communication-readme) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-communication_2.3.0/sdk/communication/azure-resourcemanager-communication/) |\n| Resource Management - Compute | Maven [2.57.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-compute/2.57.1) | [docs](/java/api/overview/azure/resourcemanager-compute-readme) | GitHub [2.57.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-compute_2.57.1/sdk/compute/azure-resourcemanager-compute/) |\n| Resource Management - Compute Fleet | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computefleet/1.0.0)<br>Maven [1.1.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computefleet/1.1.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-computefleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-computefleet_1.0.0/sdk/computefleet/azure-resourcemanager-computefleet/) |\n| Resource Management - Compute Schedule | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computeschedule/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computeschedule/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-computeschedule-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-computeschedule_1.1.0/sdk/computeschedule/azure-resourcemanager-computeschedule/) |\n| Resource Management - Compute-Recommender | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-compute-recommender/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-compute-recommender-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-compute-recommender_1.0.0-beta.1/sdk/compute/azure-resourcemanager-compute-recommender/) |\n| Resource Management - Computebulkactions | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computebulkactions/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-computebulkactions-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-computebulkactions_1.0.0-beta.1/sdk/computebulkactions/azure-resourcemanager-computebulkactions/) |\n| Resource Management - Computelimit | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computelimit/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-computelimit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-computelimit_1.0.0/sdk/computelimit/azure-resourcemanager-computelimit/) |\n| Resource Management - Computerecommender | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-computerecommender/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-computerecommender-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-computerecommender_1.0.0-beta.2/sdk/computerecommender/azure-resourcemanager-computerecommender/) |\n| Resource Management - Confidential Ledger | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-confidentialledger/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-confidentialledger/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-confidentialledger-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-confidentialledger_1.0.0/sdk/confidentialledger/azure-resourcemanager-confidentialledger/) |\n| Resource Management - Confluent | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-confluent/1.2.0)<br>Maven [1.3.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-confluent/1.3.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-confluent-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-confluent_1.2.0/sdk/confluent/azure-resourcemanager-confluent/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-confluent_1.3.0-beta.1/sdk/confluent/azure-resourcemanager-confluent/) |\n| Resource Management - Connected Cache | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-connectedcache/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-connectedcache-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-connectedcache_1.0.0-beta.2/sdk/connectedcache/azure-resourcemanager-connectedcache/) |\n| Resource Management - Connected VMware | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-connectedvmware/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-connectedvmware-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-connectedvmware_1.1.0/sdk/connectedvmware/azure-resourcemanager-connectedvmware/) |\n| Resource Management - Consumption | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-consumption/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-consumption-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-consumption_1.0.0/sdk/consumption/azure-resourcemanager-consumption/) |\n| Resource Management - Container Apps | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-appcontainers/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-appcontainers-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-appcontainers_1.2.0/sdk/appcontainers/azure-resourcemanager-appcontainers/) |\n| Resource Management - Container Instances | Maven [2.53.10](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerinstance/2.53.10) | [docs](/java/api/overview/azure/resourcemanager-containerinstance-readme) | GitHub [2.53.10](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerinstance_2.53.10/sdk/containerinstance/azure-resourcemanager-containerinstance/) |\n| Resource Management - Container Orchestrator Runtime | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerorchestratorruntime/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-containerorchestratorruntime-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-containerorchestratorruntime_1.0.0-beta.1/sdk/containerorchestratorruntime/azure-resourcemanager-containerorchestratorruntime/) |\n| Resource Management - Container Registry | Maven [2.55.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerregistry/2.55.2)<br>Maven [2.56.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerregistry/2.56.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-containerregistry-readme) | GitHub [2.55.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerregistry_2.55.2/sdk/containerregistry/azure-resourcemanager-containerregistry/)<br>GitHub [2.56.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerregistry_2.56.0-beta.1/sdk/containerregistry/azure-resourcemanager-containerregistry/) |\n| Resource Management - Container Service | Maven [2.59.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerservice/2.59.1) | [docs](/java/api/overview/azure/resourcemanager-containerservice-readme) | GitHub [2.59.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerservice_2.59.1/sdk/containerservice/azure-resourcemanager-containerservice/) |\n| Resource Management - Container Service Fleet | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerservicefleet/1.2.0)<br>Maven [1.3.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerservicefleet/1.3.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-containerservicefleet-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerservicefleet_1.2.0/sdk/containerservicefleet/azure-resourcemanager-containerservicefleet/)<br>GitHub [1.3.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerservicefleet_1.3.0-beta.3/sdk/containerservicefleet/azure-resourcemanager-containerservicefleet/) |\n| Resource Management - Containerregistry-Tasks | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerregistry-tasks/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-containerregistry-tasks-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-containerregistry-tasks_1.0.0-beta.1/sdk/containerregistry/azure-resourcemanager-containerregistry-tasks/) |\n| Resource Management - Containerservicesafeguards | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-containerservicesafeguards/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-containerservicesafeguards-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-containerservicesafeguards_1.0.0-beta.1/sdk/containerservicesafeguards/azure-resourcemanager-containerservicesafeguards/) |\n| Resource Management - Content Delivery Network | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cdn/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-cdn-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cdn_2.53.8/sdk/cdn/azure-resourcemanager-cdn/) |\n| Resource Management - Cosmos DB | Maven [2.54.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cosmos/2.54.3) | [docs](/java/api/overview/azure/resourcemanager-cosmos-readme) | GitHub [2.54.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cosmos_2.54.3/sdk/cosmos/azure-resourcemanager-cosmos/) |\n| Resource Management - Cosmos DB for PostgreSQL | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cosmosdbforpostgresql/1.0.0)<br>Maven [1.1.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-cosmosdbforpostgresql/1.1.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-cosmosdbforpostgresql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cosmosdbforpostgresql_1.0.0/sdk/cosmosdbforpostgresql/azure-resourcemanager-cosmosdbforpostgresql/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-cosmosdbforpostgresql_1.1.0-beta.3/sdk/cosmosdbforpostgresql/azure-resourcemanager-cosmosdbforpostgresql/) |\n| Resource Management - Cost Management | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-costmanagement/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-costmanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-costmanagement_1.0.0/sdk/costmanagement/azure-resourcemanager-costmanagement/) |\n| Resource Management - Customer Insights | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-customerinsights/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-customerinsights-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-customerinsights_1.0.0-beta.3/sdk/customerinsights/azure-resourcemanager-customerinsights/) |\n| Resource Management - Data Box | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-databox/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-databox-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-databox_1.1.0/sdk/databox/azure-resourcemanager-databox/) |\n| Resource Management - Data Box Edge | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-databoxedge/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-databoxedge-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-databoxedge_1.0.0/sdk/databoxedge/azure-resourcemanager-databoxedge/) |\n| Resource Management - Data Factory | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datafactory/1.2.0)<br>Maven [1.3.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datafactory/1.3.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-datafactory-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-datafactory_1.2.0/sdk/datafactory/azure-resourcemanager-datafactory/)<br>GitHub [1.3.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-datafactory_1.3.0-beta.1/sdk/datafactory/azure-resourcemanager-datafactory/) |\n| Resource Management - Data Lake Analytics | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datalakeanalytics/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-datalakeanalytics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-datalakeanalytics_1.0.0/sdk/datalakeanalytics/azure-resourcemanager-datalakeanalytics/) |\n| Resource Management - Data Lake Store | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datalakestore/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-datalakestore-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-datalakestore_1.0.0/sdk/datalakestore/azure-resourcemanager-datalakestore/) |\n| Resource Management - Data Migration | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datamigration/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-datamigration-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-datamigration_1.2.0/sdk/datamigration/azure-resourcemanager-datamigration/) |\n| Resource Management - Data Protection | Maven [1.5.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dataprotection/1.5.0) | [docs](/java/api/overview/azure/resourcemanager-dataprotection-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-dataprotection_1.5.0/sdk/dataprotection/azure-resourcemanager-dataprotection/) |\n| Resource Management - Database Watcher | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-databasewatcher/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-databasewatcher-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-databasewatcher_1.0.0-beta.1/sdk/databasewatcher/azure-resourcemanager-databasewatcher/) |\n| Resource Management - Databricks | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-databricks/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-databricks-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-databricks_1.0.0/sdk/databricks/azure-resourcemanager-databricks/) |\n| Resource Management - Datadog | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-datadog/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-datadog-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-datadog_1.1.0/sdk/datadog/azure-resourcemanager-datadog/) |\n| Resource Management - Defender EASM | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-defendereasm/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-defendereasm-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-defendereasm_1.0.0-beta.2/sdk/defendereasm/azure-resourcemanager-defendereasm/) |\n| Resource Management - Delegated Network | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-delegatednetwork/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-delegatednetwork-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-delegatednetwork_1.0.0-beta.3/sdk/delegatednetwork/azure-resourcemanager-delegatednetwork/) |\n| Resource Management - Dell Storage | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dell-storage/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-dell-storage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-dell-storage_1.0.0/sdk/dell/azure-resourcemanager-dell-storage/) |\n| Resource Management - Dependencymap | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dependencymap/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-dependencymap-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-dependencymap_1.0.0-beta.1/sdk/dependencymap/azure-resourcemanager-dependencymap/) |\n| Resource Management - Deployment Manager | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deploymentmanager/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-deploymentmanager-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-deploymentmanager_1.0.0-beta.2/sdk/deploymentmanager/azure-resourcemanager-deploymentmanager/) |\n| Resource Management - Desktop Virtualization | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-desktopvirtualization/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-desktopvirtualization-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-desktopvirtualization_1.2.0/sdk/desktopvirtualization/azure-resourcemanager-desktopvirtualization/) |\n| Resource Management - Dev Center | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-devcenter/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-devcenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-devcenter_1.0.0/sdk/devcenter/azure-resourcemanager-devcenter/) |\n| Resource Management - Dev Spaces | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-devspaces/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-devspaces-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-devspaces_1.0.0-beta.3/sdk/devspaces/azure-resourcemanager-devspaces/) |\n| Resource Management - DevHub | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-devhub/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-devhub-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-devhub_1.0.0-beta.3/sdk/devhub/azure-resourcemanager-devhub/) |\n| Resource Management - Device Provisioning Services | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deviceprovisioningservices/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deviceprovisioningservices/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-deviceprovisioningservices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-deviceprovisioningservices_1.1.0/sdk/deviceprovisioningservices/azure-resourcemanager-deviceprovisioningservices/) |\n| Resource Management - Device Registry | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deviceregistry/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deviceregistry/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-deviceregistry-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-deviceregistry_1.1.0/sdk/deviceregistry/azure-resourcemanager-deviceregistry/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-deviceregistry_1.2.0-beta.1/sdk/deviceregistry/azure-resourcemanager-deviceregistry/) |\n| Resource Management - Device Update | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-deviceupdate/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-deviceupdate-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-deviceupdate_1.1.0/sdk/deviceupdate/azure-resourcemanager-deviceupdate/) |\n| Resource Management - DevOps Infrastructure | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-devopsinfrastructure/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-devopsinfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-devopsinfrastructure_1.0.0/sdk/devopsinfrastructure/azure-resourcemanager-devopsinfrastructure/) |\n| Resource Management - DevTest Labs | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-devtestlabs/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-devtestlabs-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-devtestlabs_1.1.0/sdk/devtestlabs/azure-resourcemanager-devtestlabs/) |\n| Resource Management - Digital Twins | Maven [1.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-digitaltwins/1.3.0) | [docs](/java/api/overview/azure/resourcemanager-digitaltwins-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-digitaltwins_1.3.0/sdk/digitaltwins/azure-resourcemanager-digitaltwins/) |\n| Resource Management - Disconnected Operations | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-disconnectedoperations/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-disconnectedoperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-disconnectedoperations_1.0.0/sdk/disconnectedoperations/azure-resourcemanager-disconnectedoperations/) |\n| Resource Management - DNS | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dns/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-dns-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-dns_2.53.8/sdk/dns/azure-resourcemanager-dns/) |\n| Resource Management - DNS Resolver | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dnsresolver/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dnsresolver/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-dnsresolver-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-dnsresolver_1.1.0/sdk/dnsresolver/azure-resourcemanager-dnsresolver/) |\n| Resource Management - Durable Task | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-durabletask/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-durabletask-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-durabletask_1.1.0/sdk/durabletask/azure-resourcemanager-durabletask/) |\n| Resource Management - Dynatrace | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dynatrace/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-dynatrace-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-dynatrace_1.0.0/sdk/dynatrace/azure-resourcemanager-dynatrace/) |\n| Resource Management - Edge Actions | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-edgeactions/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-edgeactions-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-edgeactions_1.0.0-beta.1/sdk/edgeactions/azure-resourcemanager-edgeactions/) |\n| Resource Management - Edge Order | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-edgeorder/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-edgeorder-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-edgeorder_1.0.0/sdk/edgeorder/azure-resourcemanager-edgeorder/) |\n| Resource Management - Edge Zones | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-edgezones/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-edgezones-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-edgezones_1.0.0-beta.3/sdk/edgezones/azure-resourcemanager-edgezones/) |\n| Resource Management - Education | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-education/1.0.0-beta.4) | [docs](/java/api/overview/azure/resourcemanager-education-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-education_1.0.0-beta.4/sdk/education/azure-resourcemanager-education/) |\n| Resource Management - Elastic | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-elastic/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-elastic-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-elastic_1.2.0/sdk/elastic/azure-resourcemanager-elastic/) |\n| Resource Management - Elastic SAN | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-elasticsan/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-elasticsan-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-elasticsan_1.2.0/sdk/elasticsan/azure-resourcemanager-elasticsan/) |\n| Resource Management - Event Grid | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-eventgrid/1.2.0)<br>Maven [1.3.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-eventgrid/1.3.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-eventgrid-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-eventgrid_1.2.0/sdk/eventgrid/azure-resourcemanager-eventgrid/) |\n| Resource Management - Event Hubs | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-eventhubs/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-eventhubs-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-eventhubs_2.53.8/sdk/eventhubs/azure-resourcemanager-eventhubs/) |\n| Resource Management - Extended Location | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-extendedlocation/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-extendedlocation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-extendedlocation_1.0.0/sdk/extendedlocation/azure-resourcemanager-extendedlocation/) |\n| Resource Management - Fabric | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-fabric/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-fabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-fabric_1.0.0/sdk/fabric/azure-resourcemanager-fabric/) |\n| Resource Management - Fluid Relay | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-fluidrelay/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-fluidrelay-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-fluidrelay_1.1.0/sdk/fluidrelay/azure-resourcemanager-fluidrelay/) |\n| Resource Management - Front Door | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-frontdoor/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-frontdoor-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-frontdoor_1.1.0/sdk/frontdoor/azure-resourcemanager-frontdoor/) |\n| Resource Management - Graph Services | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-graphservices/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-graphservices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-graphservices_1.1.0/sdk/graphservices/azure-resourcemanager-graphservices/) |\n| Resource Management - HANA on Azure | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hanaonazure/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-hanaonazure-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hanaonazure_1.0.0-beta.3/sdk/hanaonazure/azure-resourcemanager-hanaonazure/) |\n| Resource Management - Hardware Security Module | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hardwaresecuritymodules/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-hardwaresecuritymodules-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hardwaresecuritymodules_1.1.0/sdk/hardwaresecuritymodules/azure-resourcemanager-hardwaresecuritymodules/) |\n| Resource Management - HDInsight | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hdinsight/1.0.0)<br>Maven [1.1.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hdinsight/1.1.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-hdinsight-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hdinsight_1.0.0/sdk/hdinsight/azure-resourcemanager-hdinsight/) |\n| Resource Management - HDInsight Containers | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hdinsight-containers/1.0.0-beta.4) |  | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hdinsight-containers_1.0.0-beta.4/sdk/hdinsight/azure-resourcemanager-hdinsight-containers/) |\n| Resource Management - Health Bot | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-healthbot/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-healthbot-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-healthbot_1.1.0/sdk/healthbot/azure-resourcemanager-healthbot/) |\n| Resource Management - Health Data AI Services | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-healthdataaiservices/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-healthdataaiservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-healthdataaiservices_1.0.0/sdk/healthdataaiservices/azure-resourcemanager-healthdataaiservices/) |\n| Resource Management - Healthcare APIs | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-healthcareapis/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-healthcareapis-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-healthcareapis_1.2.0/sdk/healthcareapis/azure-resourcemanager-healthcareapis/) |\n| Resource Management - Hybrid Compute | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridcompute/1.0.0)<br>Maven [1.1.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridcompute/1.1.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-hybridcompute-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hybridcompute_1.0.0/sdk/hybridcompute/azure-resourcemanager-hybridcompute/) |\n| Resource Management - Hybrid Connectivity | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridconnectivity/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridconnectivity/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-hybridconnectivity-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hybridconnectivity_1.1.0/sdk/hybridconnectivity/azure-resourcemanager-hybridconnectivity/) |\n| Resource Management - Hybrid Container Service | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridcontainerservice/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-hybridcontainerservice-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hybridcontainerservice_1.1.0/sdk/hybridcontainerservice/azure-resourcemanager-hybridcontainerservice/) |\n| Resource Management - Hybrid Kubernetes | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridkubernetes/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridkubernetes/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-hybridkubernetes-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hybridkubernetes_1.0.0/sdk/hybridkubernetes/azure-resourcemanager-hybridkubernetes/) |\n| Resource Management - Hybrid Network | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-hybridnetwork/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-hybridnetwork-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-hybridnetwork_1.1.0/sdk/hybridnetwork/azure-resourcemanager-hybridnetwork/) |\n| Resource Management - Image Builder | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-imagebuilder/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-imagebuilder-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-imagebuilder_1.2.0/sdk/imagebuilder/azure-resourcemanager-imagebuilder/) |\n| Resource Management - Impact Reporting | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-impactreporting/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-impactreporting-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-impactreporting_1.0.0-beta.1/sdk/impactreporting/azure-resourcemanager-impactreporting/) |\n| Resource Management - Informatica Data Management | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-informaticadatamanagement/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-informaticadatamanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-informaticadatamanagement_1.0.0/sdk/informaticadatamanagement/azure-resourcemanager-informaticadatamanagement/) |\n| Resource Management - IoT Central | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iotcentral/1.0.0)<br>Maven [1.1.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iotcentral/1.1.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-iotcentral-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-iotcentral_1.0.0/sdk/iotcentral/azure-resourcemanager-iotcentral/) |\n| Resource Management - IoT Firmware Defense | Maven [2.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iotfirmwaredefense/2.0.0) | [docs](/java/api/overview/azure/resourcemanager-iotfirmwaredefense-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-iotfirmwaredefense_2.0.0/sdk/iotfirmwaredefense/azure-resourcemanager-iotfirmwaredefense/) |\n| Resource Management - IoT Hub | Maven [1.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iothub/1.3.0)<br>Maven [1.4.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iothub/1.4.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-iothub-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-iothub_1.3.0/sdk/iothub/azure-resourcemanager-iothub/)<br>GitHub [1.4.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-iothub_1.4.0-beta.2/sdk/iothub/azure-resourcemanager-iothub/) |\n| Resource Management - IoT Operations | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-iotoperations/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-iotoperations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-iotoperations_1.1.0/sdk/iotoperations/azure-resourcemanager-iotoperations/) |\n| Resource Management - Key Vault | Maven [2.55.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-keyvault/2.55.2) | [docs](/java/api/overview/azure/resourcemanager-keyvault-readme) | GitHub [2.55.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-keyvault_2.55.2/sdk/keyvault/azure-resourcemanager-keyvault/) |\n| Resource Management - Kubernetes Configuration | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kubernetesconfiguration/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-kubernetesconfiguration-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-kubernetesconfiguration_1.1.0/sdk/kubernetesconfiguration/azure-resourcemanager-kubernetesconfiguration/) |\n| Resource Management - Kubernetesconfiguration-Extensions | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kubernetesconfiguration-extensions/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-kubernetesconfiguration-extensions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-kubernetesconfiguration-extensions_1.0.0/sdk/kubernetesconfiguration/azure-resourcemanager-kubernetesconfiguration-extensions/) |\n| Resource Management - Kubernetesconfiguration-Extensiontypes | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kubernetesconfiguration-extensiontypes/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-kubernetesconfiguration-extensiontypes-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-kubernetesconfiguration-extensiontypes_1.0.0-beta.1/sdk/kubernetesconfiguration/azure-resourcemanager-kubernetesconfiguration-extensiontypes/) |\n| Resource Management - Kubernetesconfiguration-Fluxconfigurations | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kubernetesconfiguration-fluxconfigurations/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-kubernetesconfiguration-fluxconfigurations-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-kubernetesconfiguration-fluxconfigurations_1.0.0-beta.1/sdk/kubernetesconfiguration/azure-resourcemanager-kubernetesconfiguration-fluxconfigurations/) |\n| Resource Management - Kubernetesconfiguration-Privatelinkscopes | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kubernetesconfiguration-privatelinkscopes/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-kubernetesconfiguration-privatelinkscopes-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-kubernetesconfiguration-privatelinkscopes_1.0.0-beta.1/sdk/kubernetesconfiguration/azure-resourcemanager-kubernetesconfiguration-privatelinkscopes/) |\n| Resource Management - Kusto | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-kusto/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-kusto-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-kusto_1.2.0/sdk/kusto/azure-resourcemanager-kusto/) |\n| Resource Management - Lab Services | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-labservices/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-labservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-labservices_1.0.0/sdk/labservices/azure-resourcemanager-labservices/) |\n| Resource Management - Lambdatesthyperexecute | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-lambdatesthyperexecute/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-lambdatesthyperexecute-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-lambdatesthyperexecute_1.0.0/sdk/lambdatesthyperexecute/azure-resourcemanager-lambdatesthyperexecute/) |\n| Resource Management - Large Instance | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-largeinstance/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-largeinstance-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-largeinstance_1.0.0-beta.2/sdk/largeinstance/azure-resourcemanager-largeinstance/) |\n| Resource Management - Load Testing | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-loadtesting/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-loadtesting-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-loadtesting_1.1.0/sdk/loadtesting/azure-resourcemanager-loadtesting/) |\n| Resource Management - Load Testing | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-loadtestservice/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-loadtestservice-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-loadtestservice_1.0.0-beta.2/sdk/loadtestservice/azure-resourcemanager-loadtestservice/) |\n| Resource Management - Log Analytics | Maven [2.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-loganalytics/2.2.0) | [docs](/java/api/overview/azure/resourcemanager-loganalytics-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-loganalytics_2.2.0/sdk/loganalytics/azure-resourcemanager-loganalytics/) |\n| Resource Management - Logic Apps | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-logic/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-logic-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-logic_1.0.0/sdk/logic/azure-resourcemanager-logic/) |\n| Resource Management - Logz | Maven [1.0.0-beta.4](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-logz/1.0.0-beta.4) | [docs](/java/api/overview/azure/resourcemanager-logz-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-logz_1.0.0-beta.4/sdk/logz/azure-resourcemanager-logz/) |\n| Resource Management - Machine Learning | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-machinelearning/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-machinelearning-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-machinelearning_1.1.0/sdk/machinelearning/azure-resourcemanager-machinelearning/) |\n| Resource Management - Machine Learning Services | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-machinelearningservices/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-machinelearningservices-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-machinelearningservices_1.0.0-beta.1/sdk/machinelearningservices/azure-resourcemanager-machinelearningservices/) |\n| Resource Management - Maintenance | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-maintenance/1.0.0)<br>Maven [1.1.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-maintenance/1.1.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-maintenance-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-maintenance_1.0.0/sdk/maintenance/azure-resourcemanager-maintenance/)<br>GitHub [1.1.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-maintenance_1.1.0-beta.3/sdk/maintenance/azure-resourcemanager-maintenance/) |\n| Resource Management - Managed Applications | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-managedapplications/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-managedapplications-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-managedapplications_1.0.0/sdk/managedapplications/azure-resourcemanager-managedapplications/) |\n| Resource Management - Managed Grafana | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-dashboard/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-dashboard-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-dashboard_1.2.0/sdk/dashboard/azure-resourcemanager-dashboard/) |\n| Resource Management - Managed Network Fabric | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-managednetworkfabric/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-managednetworkfabric-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-managednetworkfabric_1.1.0/sdk/managednetworkfabric/azure-resourcemanager-managednetworkfabric/) |\n| Resource Management - Managed Ops | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-managedops/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-managedops-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-managedops_1.0.0-beta.2/sdk/managedops/azure-resourcemanager-managedops/) |\n| Resource Management - Managed Service Identity | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-msi/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-msi-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-msi_2.53.8/sdk/msi/azure-resourcemanager-msi/) |\n| Resource Management - Management Groups | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-managementgroups/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-managementgroups-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-managementgroups_1.0.0-beta.2/sdk/managementgroups/azure-resourcemanager-managementgroups/) |\n| Resource Management - Maps | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-maps/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-maps-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-maps_1.1.0/sdk/maps/azure-resourcemanager-maps/) |\n| Resource Management - MariaDB | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mariadb/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-mariadb-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mariadb_1.0.0/sdk/mariadb/azure-resourcemanager-mariadb/) |\n| Resource Management - Marketplace Ordering | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-marketplaceordering/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-marketplaceordering-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-marketplaceordering_1.0.0/sdk/marketplaceordering/azure-resourcemanager-marketplaceordering/) |\n| Resource Management - Media Services | Maven [2.4.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mediaservices/2.4.0) | [docs](/java/api/overview/azure/resourcemanager-mediaservices-readme) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mediaservices_2.4.0/sdk/mediaservices/azure-resourcemanager-mediaservices/) |\n| Resource Management - Migration Assessment | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-migration-assessment/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-migration-assessment-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-migration-assessment_1.0.0-beta.1/sdk/migration/azure-resourcemanager-migration-assessment/) |\n| Resource Management - Migration Discovery SAP | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-migrationdiscoverysap/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-migrationdiscoverysap-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-migrationdiscoverysap_1.0.0-beta.2/sdk/migrationdiscoverysap/azure-resourcemanager-migrationdiscoverysap/) |\n| Resource Management - Mixed Reality | Maven [1.0.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mixedreality/1.0.1) | [docs](/java/api/overview/azure/resourcemanager-mixedreality-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-mixedreality_1.0.1/sdk/mixedreality/azure-resourcemanager-mixedreality/) |\n| Resource Management - Mobile Network | Maven [1.3.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mobilenetwork/1.3.1) | [docs](/java/api/overview/azure/resourcemanager-mobilenetwork-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-mobilenetwork_1.3.1/sdk/mobilenetwork/azure-resourcemanager-mobilenetwork/) |\n| Resource Management - Mongo Cluster | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mongocluster/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-mongocluster-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mongocluster_1.1.0/sdk/mongocluster/azure-resourcemanager-mongocluster/) |\n| Resource Management - Mongodbatlas | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mongodbatlas/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-mongodbatlas-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mongodbatlas_1.0.0/sdk/mongodbatlas/azure-resourcemanager-mongodbatlas/) |\n| Resource Management - Monitor | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-monitor/2.53.8)<br>Maven [2.54.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-monitor/2.54.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-monitor-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-monitor_2.53.8/sdk/monitor/azure-resourcemanager-monitor/)<br>GitHub [2.54.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-monitor_2.54.0-beta.1/sdk/monitor/azure-resourcemanager-monitor/) |\n| Resource Management - Monitor-Slis | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-monitor-slis/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-monitor-slis-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-monitor-slis_1.0.0-beta.1/sdk/monitor/azure-resourcemanager-monitor-slis/) |\n| Resource Management - MySQL | Maven [1.0.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mysql/1.0.2) | [docs](/java/api/overview/azure/resourcemanager-mysql-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mysql_1.0.2/sdk/mysql/azure-resourcemanager-mysql/) |\n| Resource Management - MySQL Flexible Server | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-mysqlflexibleserver/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-mysqlflexibleserver-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-mysqlflexibleserver_1.0.0/sdk/mysqlflexibleserver/azure-resourcemanager-mysqlflexibleserver/) |\n| Resource Management - Neon Postgres | Maven [1.0.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-neonpostgres/1.0.1) | [docs](/java/api/overview/azure/resourcemanager-neonpostgres-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-neonpostgres_1.0.1/sdk/neonpostgres/azure-resourcemanager-neonpostgres/) |\n| Resource Management - NetApp Files | Maven [2.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-netapp/2.2.0) | [docs](/java/api/overview/azure/resourcemanager-netapp-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-netapp_2.2.0/sdk/netapp/azure-resourcemanager-netapp/) |\n| Resource Management - Network | Maven [2.58.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-network/2.58.2) | [docs](/java/api/overview/azure/resourcemanager-network-readme) | GitHub [2.58.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-network_2.58.2/sdk/network/azure-resourcemanager-network/) |\n| Resource Management - Network Analytics | Maven [1.0.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-networkanalytics/1.0.1) | [docs](/java/api/overview/azure/resourcemanager-networkanalytics-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-networkanalytics_1.0.1/sdk/networkanalytics/azure-resourcemanager-networkanalytics/) |\n| Resource Management - Network Cloud | Maven [2.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-networkcloud/2.1.0) | [docs](/java/api/overview/azure/resourcemanager-networkcloud-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-networkcloud_2.1.0/sdk/networkcloud/azure-resourcemanager-networkcloud/) |\n| Resource Management - Network Function | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-networkfunction/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-networkfunction-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-networkfunction_1.0.0/sdk/networkfunction/azure-resourcemanager-networkfunction/) |\n| Resource Management - New Relic Observability | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-newrelicobservability/1.2.0)<br>Maven [1.3.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-newrelicobservability/1.3.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-newrelicobservability-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-newrelicobservability_1.2.0/sdk/newrelicobservability/azure-resourcemanager-newrelicobservability/)<br>GitHub [1.3.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-newrelicobservability_1.3.0-beta.2/sdk/newrelicobservability/azure-resourcemanager-newrelicobservability/) |\n| Resource Management - Nginx | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-nginx/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-nginx-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-nginx_1.1.0/sdk/nginx/azure-resourcemanager-nginx/) |\n| Resource Management - Notification Hubs | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-notificationhubs/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-notificationhubs-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-notificationhubs_1.0.0/sdk/notificationhubs/azure-resourcemanager-notificationhubs/) |\n| Resource Management - Onlineexperimentation | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-onlineexperimentation/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-onlineexperimentation-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-onlineexperimentation_1.0.0-beta.1/sdk/onlineexperimentation/azure-resourcemanager-onlineexperimentation/) |\n| Resource Management - Open Energy Platform | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-oep/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-oep-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-oep_1.0.0-beta.2/sdk/oep/azure-resourcemanager-oep/) |\n| Resource Management - Operations Management | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-operationsmanagement/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-operationsmanagement-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-operationsmanagement_1.0.0-beta.3/sdk/operationsmanagement/azure-resourcemanager-operationsmanagement/) |\n| Resource Management - Oracle Database | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-oracledatabase/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-oracledatabase-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-oracledatabase_1.2.0/sdk/oracledatabase/azure-resourcemanager-oracledatabase/) |\n| Resource Management - Orbital | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-orbital/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-orbital-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-orbital_1.0.0/sdk/orbital/azure-resourcemanager-orbital/) |\n| Resource Management - Palo Alto Networks - Next Generation Firewall | Maven [1.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-paloaltonetworks-ngfw/1.3.0) | [docs](/java/api/overview/azure/resourcemanager-paloaltonetworks-ngfw-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-paloaltonetworks-ngfw_1.3.0/sdk/paloaltonetworks/azure-resourcemanager-paloaltonetworks-ngfw/) |\n| Resource Management - Peering | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-peering/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-peering-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-peering_1.0.0/sdk/peering/azure-resourcemanager-peering/) |\n| Resource Management - Pinecone Vector DB | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-pineconevectordb/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-pineconevectordb-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-pineconevectordb_1.0.0-beta.2/sdk/pineconevectordb/azure-resourcemanager-pineconevectordb/) |\n| Resource Management - Planetarycomputer | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-planetarycomputer/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-planetarycomputer-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-planetarycomputer_1.0.0/sdk/planetarycomputer/azure-resourcemanager-planetarycomputer/) |\n| Resource Management - Playwright | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-playwright/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-playwright/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-playwright_1.0.0/sdk/playwright/azure-resourcemanager-playwright/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-playwright_1.1.0-beta.1/sdk/playwright/azure-resourcemanager-playwright/) |\n| Resource Management - Playwright Testing | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-playwrighttesting/1.0.0)<br>Maven [1.1.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-playwrighttesting/1.1.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-playwrighttesting-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-playwrighttesting_1.0.0/sdk/playwrighttesting/azure-resourcemanager-playwrighttesting/) |\n| Resource Management - Policy Insights | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-policyinsights/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-policyinsights/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-policyinsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-policyinsights_1.0.0/sdk/policyinsights/azure-resourcemanager-policyinsights/) |\n| Resource Management - Portalservicescopilot | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-portalservicescopilot/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-portalservicescopilot-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-portalservicescopilot_1.0.0-beta.1/sdk/portalservices/azure-resourcemanager-portalservicescopilot/) |\n| Resource Management - PostgreSQL | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-postgresql/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-postgresql-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-postgresql_1.1.0/sdk/postgresql/azure-resourcemanager-postgresql/) |\n| Resource Management - PostgreSQL Flexible Server | Maven [2.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-postgresqlflexibleserver/2.0.0)<br>Maven [2.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-postgresqlflexibleserver/2.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-postgresqlflexibleserver-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-postgresqlflexibleserver_2.0.0/sdk/postgresqlflexibleserver/azure-resourcemanager-postgresqlflexibleserver/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-postgresqlflexibleserver_2.1.0-beta.1/sdk/postgresqlflexibleserver/azure-resourcemanager-postgresqlflexibleserver/) |\n| Resource Management - Power BI Dedicated | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-powerbidedicated/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-powerbidedicated-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-powerbidedicated_1.1.0/sdk/powerbidedicated/azure-resourcemanager-powerbidedicated/) |\n| Resource Management - Private DNS | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-privatedns/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-privatedns-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-privatedns_2.53.8/sdk/privatedns/azure-resourcemanager-privatedns/) |\n| Resource Management - Provider Hub | Maven [2.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-providerhub/2.1.0) | [docs](/java/api/overview/azure/resourcemanager-providerhub-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-providerhub_2.1.0/sdk/providerhub/azure-resourcemanager-providerhub/) |\n| Resource Management - Purestorageblock | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-purestorageblock/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-purestorageblock-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-purestorageblock_1.0.0/sdk/purestorageblock/azure-resourcemanager-purestorageblock/) |\n| Resource Management - Purview | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-purview/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-purview-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-purview_1.0.0/sdk/purview/azure-resourcemanager-purview/) |\n| Resource Management - Quantum | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-quantum/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-quantum-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-quantum_1.0.0-beta.3/sdk/quantum/azure-resourcemanager-quantum/) |\n| Resource Management - Qumulo | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-qumulo/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-qumulo-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-qumulo_1.1.0/sdk/qumulo/azure-resourcemanager-qumulo/) |\n| Resource Management - Quota | Maven [2.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-quota/2.0.0) | [docs](/java/api/overview/azure/resourcemanager-quota-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-quota_2.0.0/sdk/quota/azure-resourcemanager-quota/) |\n| Resource Management - Recovery Services | Maven [1.5.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-recoveryservices/1.5.0) | [docs](/java/api/overview/azure/resourcemanager-recoveryservices-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-recoveryservices_1.5.0/sdk/recoveryservices/azure-resourcemanager-recoveryservices/) |\n| Resource Management - Recovery Services Backup | Maven [1.6.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-recoveryservicesbackup/1.6.0)<br>Maven [1.7.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-recoveryservicesbackup/1.7.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-recoveryservicesbackup-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-recoveryservicesbackup_1.6.0/sdk/recoveryservicesbackup/azure-resourcemanager-recoveryservicesbackup/)<br>GitHub [1.7.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-recoveryservicesbackup_1.7.0-beta.1/sdk/recoveryservicesbackup/azure-resourcemanager-recoveryservicesbackup/) |\n| Resource Management - Recovery Services Data Replication | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-recoveryservicesdatareplication/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-recoveryservicesdatareplication-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-recoveryservicesdatareplication_1.0.0/sdk/recoveryservicesdatareplication/azure-resourcemanager-recoveryservicesdatareplication/) |\n| Resource Management - Recovery Services Site Recovery | Maven [1.3.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-recoveryservicessiterecovery/1.3.0) | [docs](/java/api/overview/azure/resourcemanager-recoveryservicessiterecovery-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-recoveryservicessiterecovery_1.3.0/sdk/recoveryservicessiterecovery/azure-resourcemanager-recoveryservicessiterecovery/) |\n| Resource Management - Red Hat OpenShift | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-redhatopenshift/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-redhatopenshift-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-redhatopenshift_1.0.0-beta.1/sdk/redhatopenshift/azure-resourcemanager-redhatopenshift/) |\n| Resource Management - Redis | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-redis/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-redis-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-redis_2.53.8/sdk/redis/azure-resourcemanager-redis/) |\n| Resource Management - Redis Enterprise | Maven [2.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-redisenterprise/2.1.0) | [docs](/java/api/overview/azure/resourcemanager-redisenterprise-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-redisenterprise_2.1.0/sdk/redisenterprise/azure-resourcemanager-redisenterprise/) |\n| Resource Management - Relationships | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-relationships/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-relationships-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-relationships_1.0.0-beta.1/sdk/relationships/azure-resourcemanager-relationships/) |\n| Resource Management - Relay | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-relay/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-relay-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-relay_1.0.0/sdk/relay/azure-resourcemanager-relay/) |\n| Resource Management - Reservations | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-reservations/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-reservations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-reservations_1.0.0/sdk/reservations/azure-resourcemanager-reservations/) |\n| Resource Management - Resource Connector | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourceconnector/1.1.0)<br>Maven [1.2.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourceconnector/1.2.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-resourceconnector-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-resourceconnector_1.1.0/sdk/resourceconnector/azure-resourcemanager-resourceconnector/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-resourceconnector_1.2.0-beta.1/sdk/resourceconnector/azure-resourcemanager-resourceconnector/) |\n| Resource Management - Resource Graph | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourcegraph/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-resourcegraph-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-resourcegraph_1.1.0/sdk/resourcegraph/azure-resourcemanager-resourcegraph/) |\n| Resource Management - Resource Health | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourcehealth/1.0.0)<br>Maven [1.1.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourcehealth/1.1.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-resourcehealth-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-resourcehealth_1.0.0/sdk/resourcehealth/azure-resourcemanager-resourcehealth/) |\n| Resource Management - Resource Mover | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resourcemover/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-resourcemover-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-resourcemover_1.2.0/sdk/resourcemover/azure-resourcemanager-resourcemover/) |\n| Resource Management - Resources | Maven [2.54.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resources/2.54.1) | [docs](/java/api/overview/azure/resourcemanager-resources-readme) | GitHub [2.54.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-resources_2.54.1/sdk/resources/azure-resourcemanager-resources/) |\n| Resource Management - Resources-Bicep | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resources-bicep/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-resources-bicep-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-resources-bicep_1.0.0-beta.1/sdk/resources/azure-resourcemanager-resources-bicep/) |\n| Resource Management - Resources-Deploymentstacks | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-resources-deploymentstacks/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-resources-deploymentstacks-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-resources-deploymentstacks_1.1.0/sdk/resources/azure-resourcemanager-resources-deploymentstacks/) |\n| Resource Management - Secretsstoreextension | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-secretsstoreextension/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-secretsstoreextension-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-secretsstoreextension_1.0.0-beta.1/sdk/secretsstoreextension/azure-resourcemanager-secretsstoreextension/) |\n| Resource Management - Security | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-security/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-security-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-security_1.0.0/sdk/security/azure-resourcemanager-security/) |\n| Resource Management - Security DevOps | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-securitydevops/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-securitydevops-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-securitydevops_1.0.0-beta.1/sdk/securitydevops/azure-resourcemanager-securitydevops/) |\n| Resource Management - Security Insights | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-securityinsights/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-securityinsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-securityinsights_1.0.0/sdk/securityinsights/azure-resourcemanager-securityinsights/) |\n| Resource Management - Self Help | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-selfhelp/1.0.0)<br>Maven [1.1.0-beta.6](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-selfhelp/1.1.0-beta.6) | [docs](/java/api/overview/azure/resourcemanager-selfhelp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-selfhelp_1.0.0/sdk/selfhelp/azure-resourcemanager-selfhelp/)<br>GitHub [1.1.0-beta.6](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-selfhelp_1.1.0-beta.6/sdk/selfhelp/azure-resourcemanager-selfhelp/) |\n| Resource Management - Service Bus | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicebus/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-servicebus-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-servicebus_2.53.8/sdk/servicebus/azure-resourcemanager-servicebus/) |\n| Resource Management - Service Fabric | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicefabric/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-servicefabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-servicefabric_1.0.0/sdk/servicefabric/azure-resourcemanager-servicefabric/) |\n| Resource Management - Service Fabric Managed Clusters | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicefabricmanagedclusters/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-servicefabricmanagedclusters-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-servicefabricmanagedclusters_1.1.0/sdk/servicefabricmanagedclusters/azure-resourcemanager-servicefabricmanagedclusters/) |\n| Resource Management - Service Linker | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicelinker/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-servicelinker-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-servicelinker_1.0.0/sdk/servicelinker/azure-resourcemanager-servicelinker/) |\n| Resource Management - Service Networking | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicenetworking/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-servicenetworking-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-servicenetworking_1.1.0/sdk/servicenetworking/azure-resourcemanager-servicenetworking/) |\n| Resource Management - Servicegroups | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-servicegroups/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-servicegroups-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-servicegroups_1.0.0-beta.2/sdk/servicegroups/azure-resourcemanager-servicegroups/) |\n| Resource Management - SignalR | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-signalr/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-signalr-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-signalr_1.0.0/sdk/signalr/azure-resourcemanager-signalr/) |\n| Resource Management - Sitemanager | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-sitemanager/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-sitemanager-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-sitemanager_1.0.0/sdk/sitemanager/azure-resourcemanager-sitemanager/) |\n| Resource Management - Sphere | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-sphere/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-sphere-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-sphere_1.1.0/sdk/sphere/azure-resourcemanager-sphere/) |\n| Resource Management - Spring App Discovery | Maven [1.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-springappdiscovery/1.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-springappdiscovery-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-springappdiscovery_1.0.0-beta.2/sdk/springappdiscovery/azure-resourcemanager-springappdiscovery/) |\n| Resource Management - SQL | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-sql/2.53.8)<br>Maven [2.54.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-sql/2.54.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-sql-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-sql_2.53.8/sdk/sql/azure-resourcemanager-sql/)<br>GitHub [2.54.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-sql_2.54.0-beta.1/sdk/sql/azure-resourcemanager-sql/) |\n| Resource Management - SQL Virtual Machine | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-sqlvirtualmachine/1.0.0-beta.5) | [docs](/java/api/overview/azure/resourcemanager-sqlvirtualmachine-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-sqlvirtualmachine_1.0.0-beta.5/sdk/sqlvirtualmachine/azure-resourcemanager-sqlvirtualmachine/) |\n| Resource Management - Standby Pool | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-standbypool/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-standbypool-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-standbypool_1.1.0/sdk/standbypool/azure-resourcemanager-standbypool/) |\n| Resource Management - Storage | Maven [2.55.5](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storage/2.55.5) | [docs](/java/api/overview/azure/resourcemanager-storage-readme) | GitHub [2.55.5](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-storage_2.55.5/sdk/storage/azure-resourcemanager-storage/) |\n| Resource Management - Storage Actions | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storageactions/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-storageactions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-storageactions_1.0.0/sdk/storageactions/azure-resourcemanager-storageactions/) |\n| Resource Management - Storage Cache | Maven [1.2.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storagecache/1.2.0) | [docs](/java/api/overview/azure/resourcemanager-storagecache-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-storagecache_1.2.0/sdk/storagecache/azure-resourcemanager-storagecache/) |\n| Resource Management - Storage Import/Export | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storageimportexport/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-storageimportexport-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-storageimportexport_1.0.0-beta.3/sdk/storageimportexport/azure-resourcemanager-storageimportexport/) |\n| Resource Management - Storage Mover | Maven [1.4.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storagemover/1.4.0) | [docs](/java/api/overview/azure/resourcemanager-storagemover-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-storagemover_1.4.0/sdk/storagemover/azure-resourcemanager-storagemover/) |\n| Resource Management - Storage Pool | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storagepool/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-storagepool-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-storagepool_1.0.0/sdk/storagepool/azure-resourcemanager-storagepool/) |\n| Resource Management - Storagediscovery | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-storagediscovery/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-storagediscovery-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-storagediscovery_1.0.0/sdk/storagediscovery/azure-resourcemanager-storagediscovery/) |\n| Resource Management - Stream Analytics | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-streamanalytics/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-streamanalytics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-streamanalytics_1.0.0/sdk/streamanalytics/azure-resourcemanager-streamanalytics/) |\n| Resource Management - Subscriptions | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-subscription/1.0.0)<br>Maven [1.1.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-subscription/1.1.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-subscription-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-subscription_1.0.0/sdk/subscription/azure-resourcemanager-subscription/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-subscription_1.1.0-beta.1/sdk/subscription/azure-resourcemanager-subscription/) |\n| Resource Management - Support | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-support/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-support-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-support_1.1.0/sdk/support/azure-resourcemanager-support/) |\n| Resource Management - Synapse | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-synapse/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-synapse-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-synapse_1.0.0/sdk/synapse/azure-resourcemanager-synapse/) |\n| Resource Management - System Center Virtual Machine Manager | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-scvmm/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-scvmm-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-scvmm_1.0.0/sdk/scvmm/azure-resourcemanager-scvmm/) |\n| Resource Management - Terraform | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-terraform/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-terraform-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-terraform_1.0.0-beta.1/sdk/terraform/azure-resourcemanager-terraform/) |\n| Resource Management - Test | Maven [2.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-test/2.0.0-beta.2) | [docs](/java/api/overview/azure/resourcemanager-test-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-test_2.0.0-beta.2/sdk/resourcemanager/azure-resourcemanager-test/) |\n| Resource Management - Time Series Insights | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-timeseriesinsights/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-timeseriesinsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-timeseriesinsights_1.0.0/sdk/timeseriesinsights/azure-resourcemanager-timeseriesinsights/) |\n| Resource Management - Traffic Manager | Maven [2.53.8](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-trafficmanager/2.53.8) | [docs](/java/api/overview/azure/resourcemanager-trafficmanager-readme) | GitHub [2.53.8](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-resourcemanager-trafficmanager_2.53.8/sdk/trafficmanager/azure-resourcemanager-trafficmanager/) |\n| Resource Management - Trusted Signing | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-trustedsigning/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-trustedsigning-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-trustedsigning_1.0.0-beta.1/sdk/trustedsigning/azure-resourcemanager-trustedsigning/) |\n| Resource Management - Video Analyzer | Maven [1.0.0-beta.5](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-videoanalyzer/1.0.0-beta.5) | [docs](/java/api/overview/azure/resourcemanager-videoanalyzer-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-videoanalyzer_1.0.0-beta.5/sdk/videoanalyzer/azure-resourcemanager-videoanalyzer/) |\n| Resource Management - VMware Solution by CloudSimple | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-vmwarecloudsimple/1.0.0-beta.3) | [docs](/java/api/overview/azure/resourcemanager-vmwarecloudsimple-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-vmwarecloudsimple_1.0.0-beta.3/sdk/vmwarecloudsimple/azure-resourcemanager-vmwarecloudsimple/) |\n| Resource Management - Voice Services | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-voiceservices/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-voiceservices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-voiceservices_1.1.0/sdk/voiceservices/azure-resourcemanager-voiceservices/) |\n| Resource Management - Web PubSub | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-webpubsub/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-webpubsub-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-webpubsub_1.1.0/sdk/webpubsub/azure-resourcemanager-webpubsub/) |\n| Resource Management - Weights & Biases | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-weightsandbiases/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-weightsandbiases-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-weightsandbiases_1.0.0-beta.1/sdk/weightsandbiases/azure-resourcemanager-weightsandbiases/) |\n| Resource Management - Workloadorchestration | Maven [1.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-workloadorchestration/1.0.0-beta.1) | [docs](/java/api/overview/azure/resourcemanager-workloadorchestration-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-workloadorchestration_1.0.0-beta.1/sdk/workloadorchestration/azure-resourcemanager-workloadorchestration/) |\n| Resource Management - Workloads | Maven [1.1.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-workloads/1.1.0) | [docs](/java/api/overview/azure/resourcemanager-workloads-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-workloads_1.1.0/sdk/workloads/azure-resourcemanager-workloads/) |\n| Resource Management - Workloads SAP Virtual Instance | Maven [1.0.0](https://central.sonatype.com/artifact/com.azure.resourcemanager/azure-resourcemanager-workloadssapvirtualinstance/1.0.0) | [docs](/java/api/overview/azure/resourcemanager-workloadssapvirtualinstance-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-resourcemanager-workloadssapvirtualinstance_1.0.0/sdk/workloadssapvirtualinstance/azure-resourcemanager-workloadssapvirtualinstance/) |\n| Azure Identity Spring | Maven [1.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-identity-spring/1.14.0) |  | GitHub [1.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-identity-spring_1.14.0/sdk/spring/azure-identity-spring/) |\n| Azure Spring Boot BOM | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-bom/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Active Directory | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-active-directory/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Active Directory B2C | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-active-directory-b2c/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Cosmos | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-cosmos/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Key Vault Certificates | Maven [3.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-keyvault-certificates/3.14.0) |  | GitHub [3.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-boot-starter-keyvault-certificates_3.14.0/sdk/spring/azure-spring-boot-starter-keyvault-certificates/) |\n| Azure Spring Boot Starter Key Vault Secrets | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-keyvault-secrets/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Service bus Jms | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-servicebus-jms/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Boot Starter Storage | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-storage/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Appconfiguration Config | Maven [2.11.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-appconfiguration-config/2.11.0) |  | GitHub [2.11.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-appconfiguration-config_2.11.0/sdk/appconfiguration/azure-spring-cloud-appconfiguration-config/) |\n| Azure Spring Cloud Appconfiguration Config Web | Maven [2.11.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-appconfiguration-config-web/2.11.0) | [docs](/java/api/overview/azure/spring-cloud-appconfiguration-config-web-readme) | GitHub [2.11.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-appconfiguration-config-web_2.11.0/sdk/appconfiguration/azure-spring-cloud-appconfiguration-config-web/) |\n| Azure Spring Cloud Autoconfigure | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-autoconfigure/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Context | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-context/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-context_2.14.0/sdk/spring/azure-spring-cloud-context/) |\n| Azure Spring Cloud Dependencies | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-dependencies/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Feature Management | Maven [2.10.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-feature-management/2.10.0) | [docs](/java/api/overview/azure/spring-cloud-feature-management-readme) | GitHub [2.10.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-feature-management_2.10.0/sdk/appconfiguration/azure-spring-cloud-feature-management/) |\n| Azure Spring Cloud Feature Management Web | Maven [2.10.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-feature-management-web/2.10.0) | [docs](/java/api/overview/azure/spring-cloud-feature-management-web-readme) | GitHub [2.10.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-feature-management-web_2.10.0/sdk/appconfiguration/azure-spring-cloud-feature-management-web/) |\n| Azure Spring Cloud Integration Core | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-core/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Integration Event Hubs | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-eventhubs/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Integration Service Bus | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-servicebus/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Integration Storage Queue | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-storage-queue/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Integration Test | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-test/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-integration-test_2.14.0/sdk/spring/azure-spring-integration-test/) |\n| Azure Spring Cloud Messaging | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-messaging/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Starter Appconfiguration Config | Maven [2.11.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-appconfiguration-config/2.11.0) | [docs](/java/api/overview/azure/spring-cloud-starter-appconfiguration-config-readme) | GitHub [2.11.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-starter-appconfiguration-config_2.11.0/sdk/appconfiguration/azure-spring-cloud-starter-appconfiguration-config/) |\n| Azure Spring Cloud Starter Cache | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-cache/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-starter-cache_2.14.0/sdk/spring/azure-spring-cloud-starter-cache/) |\n| Azure Spring Cloud Starter Event Hubs | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-eventhubs/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Starter Event Hubs Kafka | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-eventhubs-kafka/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-starter-eventhubs-kafka_2.14.0/sdk/spring/azure-spring-cloud-starter-eventhubs-kafka/) |\n| Azure Spring Cloud Starter Service bus | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-servicebus/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Starter Storage Queue | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-storage-queue/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Storage | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-storage/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-storage_2.14.0/sdk/spring/azure-spring-cloud-storage/) |\n| Azure Spring Cloud Stream Binder Event Hubs | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-eventhubs/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Stream Binder Service bus Core | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-servicebus-core/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Stream Binder Service bus Queue | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-servicebus-queue/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Stream Binder Service bus Topic | Maven [4.0.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-servicebus-topic/4.0.0) |  | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring) |\n| Azure Spring Cloud Stream Binder Test | Maven [2.14.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-test/2.14.0) |  | GitHub [2.14.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-stream-binder-test_2.14.0/sdk/spring/azure-spring-cloud-stream-binder-test/) |\n| Azure Spring Cloud Telemetry | Maven [2.5.0](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-telemetry/2.5.0) |  | GitHub [2.5.0](https://github.com/Azure/azure-sdk-for-java/tree/azure-spring-cloud-telemetry_2.5.0/sdk/spring/azure-spring-cloud-telemetry/) |\n| Key Vault - JCA | Maven [2.11.0](https://central.sonatype.com/artifact/com.azure/azure-security-keyvault-jca/2.11.0) |  | GitHub [2.11.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-security-keyvault-jca_2.11.0/sdk/keyvault/azure-security-keyvault-jca/) |\n| Spring Azure Docker Compose | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-docker-compose/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-docker-compose_7.2.0/sdk/spring/spring-cloud-azure-docker-compose/) |\n| Spring Azure Starter KeyVault JCA | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-keyvault-jca/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-keyvault-jca_7.2.0/sdk/spring/spring-cloud-azure-starter-keyvault-jca/) |\n| Spring Cloud Azure Actuator | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-actuator/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-actuator_7.2.0/sdk/spring/spring-cloud-azure-actuator/) |\n| Spring Cloud Azure Actuator AutoConfigure | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-actuator-autoconfigure/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-actuator-autoconfigure_7.2.0/sdk/spring/spring-cloud-azure-actuator-autoconfigure/) |\n| Spring Cloud Azure Appconfiguration Config | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-appconfiguration-config/7.2.0) | [docs](/java/api/overview/azure/spring-cloud-azure-appconfiguration-config-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-appconfiguration-config_7.2.0/sdk/spring/spring-cloud-azure-appconfiguration-config/) |\n| Spring Cloud Azure Appconfiguration Config Web | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-appconfiguration-config-web/7.2.0) | [docs](/java/api/overview/azure/spring-cloud-azure-appconfiguration-config-web-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-appconfiguration-config-web_7.2.0/sdk/spring/spring-cloud-azure-appconfiguration-config-web/) |\n| Spring Cloud Azure Autoconfigure | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-autoconfigure/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-autoconfigure_7.2.0/sdk/spring/spring-cloud-azure-autoconfigure/) |\n| Spring Cloud Azure Core | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-core/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-core_7.2.0/sdk/spring/spring-cloud-azure-core/) |\n| Spring Cloud Azure Dependencies | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-dependencies/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-dependencies_7.2.0/sdk/boms/spring-cloud-azure-dependencies/) |\n| Spring Cloud Azure Feature Management | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-feature-management/7.2.0) | [docs](/java/api/overview/azure/spring-cloud-azure-feature-management-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-feature-management_7.2.0/sdk/spring/spring-cloud-azure-feature-management/) |\n| Spring Cloud Azure Feature Management Web | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-feature-management-web/7.2.0) | [docs](/java/api/overview/azure/spring-cloud-azure-feature-management-web-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-feature-management-web_7.2.0/sdk/spring/spring-cloud-azure-feature-management-web/) |\n| Spring Cloud Azure Native Configuration | Maven [4.0.0-beta.1](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-native-configuration/4.0.0-beta.1) |  | GitHub [4.0.0-beta.1](https://github.com/Azure/azure-sdk-for-java/tree/spring-cloud-azure-native-configuration_4.0.0-beta.1/sdk/spring-experimental/spring-cloud-azure-native-configuration/) |\n| Spring Cloud Azure Resource Manager | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-resourcemanager/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-resourcemanager_7.2.0/sdk/spring/spring-cloud-azure-resourcemanager/) |\n| Spring Cloud Azure Service | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-service/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-service_7.2.0/sdk/spring/spring-cloud-azure-service/) |\n| Spring Cloud Azure Starter | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter_7.2.0/sdk/spring/spring-cloud-azure-starter/) |\n| Spring Cloud Azure Starter Active Directory | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-active-directory/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-active-directory_7.2.0/sdk/spring/spring-cloud-azure-starter-active-directory/) |\n| Spring Cloud Azure Starter Active Directory B2C | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-active-directory-b2c/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-active-directory-b2c_7.2.0/sdk/spring/spring-cloud-azure-starter-active-directory-b2c/) |\n| Spring Cloud Azure Starter Actuator | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-actuator/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-actuator_7.2.0/sdk/spring/spring-cloud-azure-starter-actuator/) |\n| Spring Cloud Azure Starter App Configuration | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-appconfiguration/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-appconfiguration_7.2.0/sdk/spring/spring-cloud-azure-starter-appconfiguration/) |\n| Spring Cloud Azure Starter Cosmos DB | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-cosmos/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-cosmos_7.2.0/sdk/spring/spring-cloud-azure-starter-cosmos/) |\n| Spring Cloud Azure Starter Data Cosmos DB | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-data-cosmos/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-data-cosmos_7.2.0/sdk/spring/spring-cloud-azure-starter-data-cosmos/) |\n| Spring Cloud Azure Starter Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-eventhubs_7.2.0/sdk/spring/spring-cloud-azure-starter-eventhubs/) |\n| Spring Cloud Azure Starter Integration Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-integration-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-integration-eventhubs_7.2.0/sdk/spring/spring-cloud-azure-starter-integration-eventhubs/) |\n| Spring Cloud Azure Starter Integration Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-integration-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-integration-servicebus_7.2.0/sdk/spring/spring-cloud-azure-starter-integration-servicebus/) |\n| Spring Cloud Azure Starter Integration Storage Queue | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-integration-storage-queue/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-integration-storage-queue_7.2.0/sdk/spring/spring-cloud-azure-starter-integration-storage-queue/) |\n| Spring Cloud Azure Starter Key Vault Certificates | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-keyvault-certificates/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-keyvault-certificates_7.2.0/sdk/spring/spring-cloud-azure-starter-keyvault-certificates/) |\n| Spring Cloud Azure Starter Key Vault Secrets | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-keyvault-secrets/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-keyvault-secrets_7.2.0/sdk/spring/spring-cloud-azure-starter-keyvault-secrets/) |\n| Spring Cloud Azure Starter Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-servicebus_7.2.0/sdk/spring/spring-cloud-azure-starter-servicebus/) |\n| Spring Cloud Azure Starter Service Bus JMS | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-servicebus-jms/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-servicebus-jms_7.2.0/sdk/spring/spring-cloud-azure-starter-servicebus-jms/) |\n| Spring Cloud Azure Starter Storage | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-storage/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-storage_7.2.0/sdk/spring/spring-cloud-azure-starter-storage/) |\n| Spring Cloud Azure Starter Storage Blob | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-storage-blob/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-storage-blob_7.2.0/sdk/spring/spring-cloud-azure-starter-storage-blob/) |\n| Spring Cloud Azure Starter Storage File Share | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-storage-file-share/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-storage-file-share_7.2.0/sdk/spring/spring-cloud-azure-starter-storage-file-share/) |\n| Spring Cloud Azure Starter Storage Queue | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-storage-queue/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-storage-queue_7.2.0/sdk/spring/spring-cloud-azure-starter-storage-queue/) |\n| Spring Cloud Azure Starter Stream Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-stream-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-stream-eventhubs_7.2.0/sdk/spring/spring-cloud-azure-starter-stream-eventhubs/) |\n| Spring Cloud Azure Starter Stream Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-stream-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-stream-servicebus_7.2.0/sdk/spring/spring-cloud-azure-starter-stream-servicebus/) |\n| Spring Cloud Azure Stream Binder Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-stream-binder-eventhubs_7.2.0/sdk/spring/spring-cloud-azure-stream-binder-eventhubs/) |\n| Spring Cloud Azure Stream Binder Event Hubs Core | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-eventhubs-core/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-stream-binder-eventhubs-core_7.2.0/sdk/spring/spring-cloud-azure-stream-binder-eventhubs-core/) |\n| Spring Cloud Azure Stream Binder Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-stream-binder-servicebus_7.2.0/sdk/spring/spring-cloud-azure-stream-binder-servicebus/) |\n| Spring Cloud Azure Stream Binder Service Bus Core | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-servicebus-core/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-stream-binder-servicebus-core_7.2.0/sdk/spring/spring-cloud-azure-stream-binder-servicebus-core/) |\n| Spring Cloud Azure Trace on Sleuth | Maven [4.20.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-trace-sleuth/4.20.0)<br>Maven [6.0.0-beta.2](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-trace-sleuth/6.0.0-beta.2) |  | GitHub [4.20.0](https://github.com/Azure/azure-sdk-for-java/tree/spring-cloud-azure-trace-sleuth_4.20.0/sdk/spring/spring-cloud-azure-trace-sleuth/) |\n| Spring Cloud Integration Azure Core | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-core/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-integration-azure-core_7.2.0/sdk/spring/spring-integration-azure-core/) |\n| Spring Data Cosmos | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure/azure-spring-data-cosmos/7.2.0) | [docs](/java/api/overview/azure/spring-data-cosmos-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+azure-spring-data-cosmos_7.2.0/sdk/spring/azure-spring-data-cosmos/) |\n| Spring Integration Azure Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-integration-azure-eventhubs_7.2.0/sdk/spring/spring-integration-azure-eventhubs/) |\n| Spring Integration Azure Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-integration-azure-servicebus_7.2.0/sdk/spring/spring-integration-azure-servicebus/) |\n| Spring Integration Azure Storage Queue | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-storage-queue/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-integration-azure-storage-queue_7.2.0/sdk/spring/spring-integration-azure-storage-queue/) |\n| Spring Messaging Azure | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-messaging-azure/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-messaging-azure_7.2.0/sdk/spring/spring-messaging-azure/) |\n| Spring Messaging Azure Event Hubs | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-messaging-azure-eventhubs/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-messaging-azure-eventhubs_7.2.0/sdk/spring/spring-messaging-azure-eventhubs/) |\n| Spring Messaging Azure Service Bus | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-messaging-azure-servicebus/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-messaging-azure-servicebus_7.2.0/sdk/spring/spring-messaging-azure-servicebus/) |\n| Spring Messaging Azure Storage Queue | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-messaging-azure-storage-queue/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-messaging-azure-storage-queue_7.2.0/sdk/spring/spring-messaging-azure-storage-queue/) |\n| Spring Test Containers | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-testcontainers/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-testcontainers_7.2.0/sdk/spring/spring-cloud-azure-testcontainers/) |\n| spring-cloud-azure-starter-appconfiguration-config | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-appconfiguration-config/7.2.0) | [docs](/java/api/overview/azure/spring-cloud-azure-starter-appconfiguration-config-readme) | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-appconfiguration-config_7.2.0/sdk/spring/spring-cloud-azure-starter-appconfiguration-config/) |\n| spring-cloud-azure-starter-data-redis-lettuce | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-data-redis-lettuce/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-data-redis-lettuce_7.2.0/sdk/spring/spring-cloud-azure-starter-data-redis-lettuce/) |\n| spring-cloud-azure-starter-eventgrid | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-eventgrid/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-eventgrid_7.2.0/sdk/spring/spring-cloud-azure-starter-eventgrid/) |\n| spring-cloud-azure-starter-jdbc-mysql | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-jdbc-mysql/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-jdbc-mysql_7.2.0/sdk/spring/spring-cloud-azure-starter-jdbc-mysql/) |\n| spring-cloud-azure-starter-jdbc-postgresql | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-jdbc-postgresql/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-jdbc-postgresql_7.2.0/sdk/spring/spring-cloud-azure-starter-jdbc-postgresql/) |\n| spring-cloud-azure-starter-keyvault | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-keyvault/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-keyvault_7.2.0/sdk/spring/spring-cloud-azure-starter-keyvault/) |\n| spring-cloud-azure-starter-monitor | Maven [7.2.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-monitor/7.2.0) |  | GitHub [7.2.0](https://github.com/Azure/azure-sdk-for-java/tree/item.GroupId+spring-cloud-azure-starter-monitor_7.2.0/sdk/spring/spring-cloud-azure-starter-monitor/) |\n| spring-cloud-azure-starter-redis | Maven [4.20.0](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-redis/4.20.0) |  | GitHub [4.20.0](https://github.com/Azure/azure-sdk-for-java/tree/spring-cloud-azure-starter-redis_4.20.0/sdk/spring/spring-cloud-azure-starter-redis/) |\n| azure-aot-graalvm-support | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-aot-graalvm-support/1.0.0-beta.3) | [docs](/java/api/overview/azure/aot-graalvm-support-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-aot-graalvm-support_1.0.0-beta.3/sdk/aot/azure-aot-graalvm-support/) |\n| azure-aot-graalvm-support-netty | Maven [1.0.0-beta.3](https://central.sonatype.com/artifact/com.azure/azure-aot-graalvm-support-netty/1.0.0-beta.3) | [docs](/java/api/overview/azure/aot-graalvm-support-netty-readme?view=azure-java-preview&amp;preserve-view=true) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-java/tree/azure-aot-graalvm-support-netty_1.0.0-beta.3/sdk/aot/azure-aot-graalvm-support-netty/) |\n"
  },
  {
    "path": "articles/includes/javascript-all.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| @azure/api-management-custom-widgets-scaffolder | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/api-management-custom-widgets-scaffolder/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/api-management-custom-widgets-scaffolder-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/apimanagement/api-management-custom-widgets-scaffolder) |\n| @azure/api-management-custom-widgets-tools | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/api-management-custom-widgets-tools/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/api-management-custom-widgets-tools-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/apimanagement/api-management-custom-widgets-tools) |\n| @azure/communication-administration | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/communication-administration/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/communication-administration-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/communication) |\n| @azure/communication-calling-effects | npm [1.3.2](https://www.npmjs.com/package/@azure/communication-calling-effects/v/1.3.2) |  | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/communication) |\n| @azure/communication-react | npm [1.31.0](https://www.npmjs.com/package/@azure/communication-react/v/1.31.0) |  | GitHub [1.31.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/communication) |\n| @azure/core-sse | npm [2.3.0](https://www.npmjs.com/package/@azure/core-sse/v/2.3.0) | [docs](/javascript/api/overview/azure/core-sse-readme) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-sse_2.3.0/sdk/core/core-sse/) |\n| @azure/functions-authentication-events | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/functions-authentication-events/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/functions-authentication-events-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/functions-authentication-events_1.0.0-beta.2/sdk/entra/functions-authentication-events/) |\n| @azure/template-dpg | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/template-dpg/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/template-dpg-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/template-dpg_1.0.0-beta.1/sdk/template/template-dpg/) |\n| AccessControl | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/synapse-access-control/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/synapse-access-control-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/synapse-access-control_1.0.0-beta.3/sdk/synapse/synapse-access-control/) |\n| AI Agents | npm [1.1.0](https://www.npmjs.com/package/@azure/ai-agents/v/1.1.0) | [docs](/javascript/api/overview/azure/ai-agents-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-agents_1.1.0/sdk/ai/ai-agents/) |\n| AI Model Inference | npm [1.0.0-beta.6](https://www.npmjs.com/package/@azure-rest/ai-inference/v/1.0.0-beta.6) |  | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-inference_1.0.0-beta.6/sdk/ai/ai-inference-rest/) |\n| AI Projects | npm [2.1.1](https://www.npmjs.com/package/@azure/ai-projects/v/2.1.1) | [docs](/javascript/api/overview/azure/ai-projects-readme) | GitHub [2.1.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-projects_2.1.1/sdk/ai/ai-projects/) |\n| App Configuration | npm [1.11.0](https://www.npmjs.com/package/@azure/app-configuration/v/1.11.0) | [docs](/javascript/api/overview/azure/app-configuration-readme) | GitHub [1.11.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/app-configuration_1.11.0/sdk/appconfiguration/app-configuration/) |\n| Artifacts | npm [1.0.0-beta.16](https://www.npmjs.com/package/@azure/synapse-artifacts/v/1.0.0-beta.16) | [docs](/javascript/api/overview/azure/synapse-artifacts-readme) | GitHub [1.0.0-beta.16](https://github.com/Azure/azure-sdk-for-js/tree/@azure/synapse-artifacts_1.0.0-beta.16/sdk/synapse/synapse-artifacts/) |\n| Attestation | npm [1.0.0](https://www.npmjs.com/package/@azure/attestation/v/1.0.0) | [docs](/javascript/api/overview/azure/attestation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/attestation_1.0.0/sdk/attestation/attestation/) |\n| Azure AI Search | npm [13.0.0](https://www.npmjs.com/package/@azure/search-documents/v/13.0.0) | [docs](/javascript/api/overview/azure/search-documents-readme) | GitHub [13.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/search-documents_13.0.0/sdk/search/search-documents/) |\n| Azure AI Transcription | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/ai-speech-transcription/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/ai-speech-transcription-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-speech-transcription_1.0.0-beta.1/sdk/transcription/ai-speech-transcription/) |\n| Azure Blob Storage Checkpoint Store | npm [2.0.0](https://www.npmjs.com/package/@azure/eventhubs-checkpointstore-blob/v/2.0.0) | [docs](/javascript/api/overview/azure/eventhubs-checkpointstore-blob-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/eventhubs-checkpointstore-blob_2.0.0/sdk/eventhub/eventhubs-checkpointstore-blob/) |\n| Azure Monitor OpenTelemetry | npm [1.17.0](https://www.npmjs.com/package/@azure/monitor-opentelemetry/v/1.17.0) | [docs](/javascript/api/overview/azure/monitor-opentelemetry-readme) | GitHub [1.17.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-opentelemetry_1.17.0/sdk/monitor/monitor-opentelemetry/) |\n| Batch | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure-rest/batch/v/1.0.0-beta.4) |  | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/batch_1.0.0-beta.4/sdk/batch/batch-rest/) |\n| Batch | npm [13.0.0](https://www.npmjs.com/package/@azure/batch/v/13.0.0) | [docs](/javascript/api/overview/azure/batch-readme) | GitHub [13.0.0](https://github.com/azure/azure-sdk-for-js/tree/main/sdk/batch/batch) |\n| Common | npm [2.1.0](https://www.npmjs.com/package/@azure/keyvault-common/v/2.1.0) | [docs](/javascript/api/overview/azure/keyvault-common-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/keyvault-common_2.1.0/sdk/keyvault/keyvault-common/) |\n| Communication Call Automation | npm [1.5.1](https://www.npmjs.com/package/@azure/communication-call-automation/v/1.5.1)<br>npm [1.6.0-beta.2](https://www.npmjs.com/package/@azure/communication-call-automation/v/1.6.0-beta.2) | [docs](/javascript/api/overview/azure/communication-call-automation-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-call-automation_1.5.1/sdk/communication/communication-call-automation/)<br>GitHub [1.6.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-call-automation_1.6.0-beta.2/sdk/communication/communication-call-automation/) |\n| Communication Chat | npm [1.6.0](https://www.npmjs.com/package/@azure/communication-chat/v/1.6.0) | [docs](/javascript/api/overview/azure/communication-chat-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-chat_1.6.0/sdk/communication/communication-chat/) |\n| Communication Common | npm [2.4.0](https://www.npmjs.com/package/@azure/communication-common/v/2.4.0)<br>npm [3.0.0-beta.1](https://www.npmjs.com/package/@azure/communication-common/v/3.0.0-beta.1) | [docs](/javascript/api/overview/azure/communication-common-readme) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-common_2.4.0/sdk/communication/communication-common/)<br>GitHub [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-common_3.0.0-beta.1/sdk/communication/communication-common/) |\n| Communication Email | npm [1.1.0](https://www.npmjs.com/package/@azure/communication-email/v/1.1.0) | [docs](/javascript/api/overview/azure/communication-email-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-email_1.1.0/sdk/communication/communication-email/) |\n| Communication Identity | npm [1.3.1](https://www.npmjs.com/package/@azure/communication-identity/v/1.3.1)<br>npm [1.4.0-beta.1](https://www.npmjs.com/package/@azure/communication-identity/v/1.4.0-beta.1) | [docs](/javascript/api/overview/azure/communication-identity-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-identity_1.3.1/sdk/communication/communication-identity/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-identity_1.4.0-beta.1/sdk/communication/communication-identity/) |\n| Communication Job Router | npm [1.0.0](https://www.npmjs.com/package/@azure-rest/communication-job-router/v/1.0.0)<br>npm [1.1.0-beta.2](https://www.npmjs.com/package/@azure-rest/communication-job-router/v/1.1.0-beta.2) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/communication-job-router_1.0.0/sdk/communication/communication-job-router-rest/) |\n| Communication Job Router | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/communication-job-router/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/communication-job-router-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-job-router_1.0.0-beta.1/sdk/communication/communication-job-router/) |\n| Communication Messages | npm [2.0.0](https://www.npmjs.com/package/@azure-rest/communication-messages/v/2.0.0)<br>npm [2.2.0-beta.1](https://www.npmjs.com/package/@azure-rest/communication-messages/v/2.2.0-beta.1) |  | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/communication-messages_2.0.0/sdk/communication/communication-messages-rest/) |\n| Communication Phone Numbers | npm [1.5.0](https://www.npmjs.com/package/@azure/communication-phone-numbers/v/1.5.0) | [docs](/javascript/api/overview/azure/communication-phone-numbers-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-phone-numbers_1.5.0/sdk/communication/communication-phone-numbers/) |\n| Communication Rooms | npm [1.2.0](https://www.npmjs.com/package/@azure/communication-rooms/v/1.2.0) | [docs](/javascript/api/overview/azure/communication-rooms-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-rooms_1.2.0/sdk/communication/communication-rooms/) |\n| Communication Sms | npm [1.1.0](https://www.npmjs.com/package/@azure/communication-sms/v/1.1.0)<br>npm [1.2.0-beta.4](https://www.npmjs.com/package/@azure/communication-sms/v/1.2.0-beta.4) | [docs](/javascript/api/overview/azure/communication-sms-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-sms_1.1.0/sdk/communication/communication-sms/)<br>GitHub [1.2.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-sms_1.2.0-beta.4/sdk/communication/communication-sms/) |\n| Confidential Ledger | npm [1.0.0](https://www.npmjs.com/package/@azure-rest/confidential-ledger/v/1.0.0)<br>npm [1.1.2-beta.4](https://www.npmjs.com/package/@azure-rest/confidential-ledger/v/1.1.2-beta.4) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/confidential-ledger_1.0.0/sdk/confidentialledger/confidential-ledger-rest/) |\n| Container Registry | npm [1.1.2](https://www.npmjs.com/package/@azure/container-registry/v/1.1.2) | [docs](/javascript/api/overview/azure/container-registry-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/container-registry_1.1.2/sdk/containerregistry/container-registry/) |\n| Content Safety | npm [1.0.1](https://www.npmjs.com/package/@azure-rest/ai-content-safety/v/1.0.1) |  | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-content-safety_1.0.1/sdk/contentsafety/ai-content-safety-rest/) |\n| Content Understanding | npm [1.1.0](https://www.npmjs.com/package/@azure/ai-content-understanding/v/1.1.0)<br>npm [1.2.0-beta.1](https://www.npmjs.com/package/@azure/ai-content-understanding/v/1.2.0-beta.1) | [docs](/javascript/api/overview/azure/ai-content-understanding-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-content-understanding_1.1.0/sdk/contentunderstanding/ai-content-understanding/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-content-understanding_1.2.0-beta.1/sdk/contentunderstanding/ai-content-understanding/) |\n| Conversational Language Understanding | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/ai-language-conversations/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/ai-language-conversations-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-language-conversations_1.0.0-beta.1/sdk/cognitivelanguage/ai-language-conversations/) |\n| Core - Client - Abort Controller | npm [2.1.2](https://www.npmjs.com/package/@azure/abort-controller/v/2.1.2) | [docs](/javascript/api/overview/azure/abort-controller-readme) | GitHub [2.1.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/abort-controller_2.1.2/sdk/core/abort-controller/) |\n| Core - Client - AMQP | npm [4.4.2](https://www.npmjs.com/package/@azure/core-amqp/v/4.4.2) | [docs](/javascript/api/overview/azure/core-amqp-readme) | GitHub [4.4.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-amqp_4.4.2/sdk/core/core-amqp/) |\n| Core - Client - Auth | npm [1.10.1](https://www.npmjs.com/package/@azure/core-auth/v/1.10.1) | [docs](/javascript/api/overview/azure/core-auth-readme) | GitHub [1.10.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-auth_1.10.1/sdk/core/core-auth/) |\n| Core - Client - Client | npm [1.10.1](https://www.npmjs.com/package/@azure/core-client/v/1.10.1) | [docs](/javascript/api/overview/azure/core-client-readme) | GitHub [1.10.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-client_1.10.1/sdk/core/core-client/) |\n| Core - Client - Client Paging | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/core-client-paging/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/core-client-paging_1.0.0-beta.1/sdk/core/core-client-paging-rest/) |\n| Core - Client - Core Rest Pipeline | npm [1.23.0](https://www.npmjs.com/package/@azure/core-rest-pipeline/v/1.23.0) | [docs](/javascript/api/overview/azure/core-rest-pipeline-readme) | GitHub [1.23.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-rest-pipeline_1.23.0/sdk/core/core-rest-pipeline/) |\n| Core - Client - Core Utils | npm [1.13.1](https://www.npmjs.com/package/@azure/core-util/v/1.13.1) | [docs](/javascript/api/overview/azure/core-util-readme) | GitHub [1.13.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-util_1.13.1/sdk/core/core-util/) |\n| Core - Client - HTTP | npm [3.0.5](https://www.npmjs.com/package/@azure/core-http/v/3.0.5) | [docs](/javascript/api/overview/azure/core-http-readme) | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-http_3.0.5/sdk/core/core-http/) |\n| Core - Client - Http Compat | npm [2.4.0](https://www.npmjs.com/package/@azure/core-http-compat/v/2.4.0) | [docs](/javascript/api/overview/azure/core-http-compat-readme) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-http-compat_2.4.0/sdk/core/core-http-compat/) |\n| Core - Client - Logger | npm [1.3.0](https://www.npmjs.com/package/@azure/logger/v/1.3.0) | [docs](/javascript/api/overview/azure/logger-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/logger_1.3.0/sdk/core/logger/) |\n| Core - Client - LRO | npm [3.3.1](https://www.npmjs.com/package/@azure/core-lro/v/3.3.1) | [docs](/javascript/api/overview/azure/core-lro-readme) | GitHub [3.3.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-lro_3.3.1/sdk/core/core-lro/) |\n| Core - Client - Rest | npm [2.6.0](https://www.npmjs.com/package/@azure-rest/core-client/v/2.6.0) |  | GitHub [2.6.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/core-client_2.6.0/sdk/core/core-client-rest/) |\n| Core - Client - Tracing | npm [1.3.1](https://www.npmjs.com/package/@azure/core-tracing/v/1.3.1) | [docs](/javascript/api/overview/azure/core-tracing-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-tracing_1.3.1/sdk/core/core-tracing/) |\n| Core - Client - XML | npm [1.5.1](https://www.npmjs.com/package/@azure/core-xml/v/1.5.1) | [docs](/javascript/api/overview/azure/core-xml-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-xml_1.5.1/sdk/core/core-xml/) |\n| Core - Paging | npm [1.6.2](https://www.npmjs.com/package/@azure/core-paging/v/1.6.2) | [docs](/javascript/api/overview/azure/core-paging-readme) | GitHub [1.6.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-paging_1.6.2/sdk/core/core-paging/) |\n| Cosmos DB | npm [4.9.3](https://www.npmjs.com/package/@azure/cosmos/v/4.9.3) | [docs](/javascript/api/overview/azure/cosmos-readme) | GitHub [4.9.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/cosmos_4.9.3/sdk/cosmosdb/cosmos/) |\n| Create Playwright | npm [1.1.0](https://www.npmjs.com/package/@azure/create-playwright/v/1.1.0) |  | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/create-playwright_1.1.0/sdk/loadtesting/create-playwright/) |\n| Defender EASM | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/defender-easm/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/defender-easm_1.0.0-beta.2/sdk/easm/defender-easm-rest/) |\n| Dev Center | npm [1.0.1](https://www.npmjs.com/package/@azure-rest/developer-devcenter/v/1.0.1) |  | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/developer-devcenter_1.0.1/sdk/devcenter/developer-devcenter-rest/) |\n| Device Update | npm [1.1.0](https://www.npmjs.com/package/@azure-rest/iot-device-update/v/1.1.0) |  | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/iot-device-update_1.1.0/sdk/deviceupdate/iot-device-update-rest/) |\n| Digital Twins - Core | npm [2.0.0](https://www.npmjs.com/package/@azure/digital-twins-core/v/2.0.0) | [docs](/javascript/api/overview/azure/digital-twins-core-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/digital-twins-core_2.0.0/sdk/digitaltwins/digital-twins-core/) |\n| Digital Twins Definition Language Parser | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/dtdl-parser/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/dtdl-parser-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/dtdl-parser_1.0.0-beta.2/sdk/digitaltwins/dtdl-parser/) |\n| Document Intelligence | npm [1.1.0](https://www.npmjs.com/package/@azure-rest/ai-document-intelligence/v/1.1.0) |  | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-document-intelligence_1.1.0/sdk/documentintelligence/ai-document-intelligence-rest/) |\n| Document Translation | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/ai-document-translator/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-document-translator_1.0.0-beta.2/sdk/documenttranslator/ai-document-translator-rest/) |\n| Document Translation | npm [1.0.0](https://www.npmjs.com/package/@azure-rest/ai-translation-document/v/1.0.0) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-translation-document_1.0.0/sdk/translation/ai-translation-document-rest/) |\n| Event Grid | npm [5.12.0](https://www.npmjs.com/package/@azure/eventgrid/v/5.12.0) | [docs](/javascript/api/overview/azure/eventgrid-readme) | GitHub [5.12.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/eventgrid_5.12.0/sdk/eventgrid/eventgrid/) |\n| Event Grid Namespaces | npm [1.0.0](https://www.npmjs.com/package/@azure/eventgrid-namespaces/v/1.0.0) | [docs](/javascript/api/overview/azure/eventgrid-namespaces-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/eventgrid-namespaces_1.0.0/sdk/eventgrid/eventgrid-namespaces/) |\n| Event Grid System Events | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure/eventgrid-system-events/v/1.0.0-beta.5) | [docs](/javascript/api/overview/azure/eventgrid-system-events-readme) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/eventgrid-system-events_1.0.0-beta.5/sdk/eventgrid/eventgrid-system-events/) |\n| Event Hubs | npm [6.0.4](https://www.npmjs.com/package/@azure/event-hubs/v/6.0.4) | [docs](/javascript/api/overview/azure/event-hubs-readme) | GitHub [6.0.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/event-hubs_6.0.4/sdk/eventhub/event-hubs/) |\n| Face | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/ai-vision-face/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-vision-face_1.0.0-beta.3/sdk/face/ai-vision-face-rest/) |\n| farmbeats | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/agrifood-farming/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/agrifood-farming_1.0.0-beta.3/sdk/agrifood/agrifood-farming-rest/) |\n| Form Recognizer | npm [5.1.0](https://www.npmjs.com/package/@azure/ai-form-recognizer/v/5.1.0) | [docs](/javascript/api/overview/azure/ai-form-recognizer-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-form-recognizer_5.1.0/sdk/formrecognizer/ai-form-recognizer/) |\n| Health Deidentification | npm [1.0.0](https://www.npmjs.com/package/@azure-rest/health-deidentification/v/1.0.0) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/health-deidentification_1.0.0/sdk/healthdataaiservices/health-deidentification-rest/) |\n| Health Insights Cancer Profiling | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/health-insights-cancerprofiling/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/health-insights-cancerprofiling_1.0.0-beta.1/sdk/healthinsights/health-insights-cancerprofiling-rest/) |\n| Health Insights Clinical Matching | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/health-insights-clinicalmatching/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/health-insights-clinicalmatching_1.0.0-beta.1/sdk/healthinsights/health-insights-clinicalmatching-rest/) |\n| Health Insights Radiology Insights | npm [2.0.0](https://www.npmjs.com/package/@azure-rest/health-insights-radiologyinsights/v/2.0.0) |  | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/health-insights-radiologyinsights_2.0.0/sdk/healthinsights/health-insights-radiologyinsights-rest/) |\n| Identity | npm [4.13.1](https://www.npmjs.com/package/@azure/identity/v/4.13.1)<br>npm [4.14.0-beta.3](https://www.npmjs.com/package/@azure/identity/v/4.14.0-beta.3) | [docs](/javascript/api/overview/azure/identity-readme) | GitHub [4.13.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/identity_4.13.1/sdk/identity/identity/)<br>GitHub [4.14.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/identity_4.14.0-beta.3/sdk/identity/identity/) |\n| Identity Broker | npm [1.4.0](https://www.npmjs.com/package/@azure/identity-broker/v/1.4.0) | [docs](/javascript/api/overview/azure/identity-broker-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/identity-broker_1.4.0/sdk/identity/identity-broker/) |\n| Image Analysis | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/ai-vision-image-analysis/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-vision-image-analysis_1.0.0-beta.3/sdk/vision/ai-vision-image-analysis-rest/) |\n| IoT Device Update | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/iot-device-update/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/iot-device-update-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/iot-device-update_1.0.0-beta.1/sdk/deviceupdate/iot-device-update/) |\n| Key Vault - Administration | npm [4.7.0](https://www.npmjs.com/package/@azure/keyvault-admin/v/4.7.0) | [docs](/javascript/api/overview/azure/keyvault-admin-readme) | GitHub [4.7.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/keyvault-admin_4.7.0/sdk/keyvault/keyvault-admin/) |\n| Key Vault - Certificates | npm [4.10.3](https://www.npmjs.com/package/@azure/keyvault-certificates/v/4.10.3) | [docs](/javascript/api/overview/azure/keyvault-certificates-readme) | GitHub [4.10.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/keyvault-certificates_4.10.3/sdk/keyvault/keyvault-certificates/) |\n| Key Vault - Keys | npm [4.10.0](https://www.npmjs.com/package/@azure/keyvault-keys/v/4.10.0) | [docs](/javascript/api/overview/azure/keyvault-keys-readme) | GitHub [4.10.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/keyvault-keys_4.10.0/sdk/keyvault/keyvault-keys/) |\n| Key Vault - Secrets | npm [4.11.2](https://www.npmjs.com/package/@azure/keyvault-secrets/v/4.11.2) | [docs](/javascript/api/overview/azure/keyvault-secrets-readme) | GitHub [4.11.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/keyvault-secrets_4.11.2/sdk/keyvault/keyvault-secrets/) |\n| Language Text | npm [1.1.0](https://www.npmjs.com/package/@azure/ai-language-text/v/1.1.0) | [docs](/javascript/api/overview/azure/ai-language-text-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-language-text_1.1.0/sdk/cognitivelanguage/ai-language-text/) |\n| Load Testing | npm [1.0.1](https://www.npmjs.com/package/@azure-rest/load-testing/v/1.0.1)<br>npm [1.2.0-beta.1](https://www.npmjs.com/package/@azure-rest/load-testing/v/1.2.0-beta.1) |  | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/load-testing_1.0.1/sdk/loadtesting/load-testing-rest/) |\n| Managed Private Endpoints | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/synapse-managed-private-endpoints/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/synapse-managed-private-endpoints-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/synapse-managed-private-endpoints_1.0.0-beta.4/sdk/synapse/synapse-managed-private-endpoints/) |\n| Maps Common | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/maps-common/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/maps-common-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/maps-common_1.0.0-beta.2/sdk/maps/maps-common/) |\n| Maps Geolocation | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure-rest/maps-geolocation/v/1.0.0-beta.5) |  | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/maps-geolocation_1.0.0-beta.5/sdk/maps/maps-geolocation-rest/) |\n| Maps Render | npm [2.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/maps-render/v/2.0.0-beta.2) |  | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/maps-render_2.0.0-beta.2/sdk/maps/maps-render-rest/) |\n| Maps Route | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure-rest/maps-route/v/1.0.0-beta.5) |  | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/maps-route_1.0.0-beta.5/sdk/maps/maps-route-rest/) |\n| Maps Search | npm [2.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/maps-search/v/2.0.0-beta.3) |  | GitHub [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/maps-search_2.0.0-beta.3/sdk/maps/maps-search-rest/) |\n| Maps Search | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/maps-search/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/maps-search-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/maps-search_1.0.0-beta.2/sdk/maps/maps-search/) |\n| Metrics Advisor | npm [1.0.0](https://www.npmjs.com/package/@azure/ai-metrics-advisor/v/1.0.0) | [docs](/javascript/api/overview/azure/ai-metrics-advisor-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-metrics-advisor_1.0.0/sdk/metricsadvisor/ai-metrics-advisor/) |\n| Monitor Ingestion | npm [1.2.0](https://www.npmjs.com/package/@azure/monitor-ingestion/v/1.2.0) | [docs](/javascript/api/overview/azure/monitor-ingestion-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-ingestion_1.2.0/sdk/monitor/monitor-ingestion/) |\n| Monitor Query Logs | npm [1.0.0](https://www.npmjs.com/package/@azure/monitor-query-logs/v/1.0.0) | [docs](/javascript/api/overview/azure/monitor-query-logs-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-query-logs_1.0.0/sdk/monitor/monitor-query-logs/) |\n| Monitor Query Metrics | npm [1.0.0](https://www.npmjs.com/package/@azure/monitor-query-metrics/v/1.0.0) | [docs](/javascript/api/overview/azure/monitor-query-metrics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-query-metrics_1.0.0/sdk/monitor/monitor-query-metrics/) |\n| Notification Hubs | npm [2.1.0](https://www.npmjs.com/package/@azure/notification-hubs/v/2.1.0) | [docs](/javascript/api/overview/azure/notification-hubs-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/notification-hubs_2.1.0/sdk/notificationhubs/notification-hubs/) |\n| Online Experimentation | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/onlineexperimentation/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/onlineexperimentation_1.0.0-beta.1/sdk/onlineexperimentation/onlineexperimentation-rest/) |\n| OpenAI | npm [2.0.0](https://www.npmjs.com/package/@azure/openai/v/2.0.0)<br>npm [2.1.0-beta.1](https://www.npmjs.com/package/@azure/openai/v/2.1.0-beta.1) | [docs](/javascript/api/overview/azure/openai-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/openai_2.0.0/sdk/openai/openai/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/openai_2.1.0-beta.1/sdk/openai/openai/) |\n| OpenAI Assistants | npm [1.0.0-beta.6](https://www.npmjs.com/package/@azure/openai-assistants/v/1.0.0-beta.6) | [docs](/javascript/api/overview/azure/openai-assistants-readme) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-js/tree/@azure/openai-assistants_1.0.0-beta.6/sdk/openai/openai-assistants/) |\n| OpenTelemetry Exporter | npm [1.0.0-beta.40](https://www.npmjs.com/package/@azure/monitor-opentelemetry-exporter/v/1.0.0-beta.40) | [docs](/javascript/api/overview/azure/monitor-opentelemetry-exporter-readme) | GitHub [1.0.0-beta.40](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-opentelemetry-exporter_1.0.0-beta.40/sdk/monitor/monitor-opentelemetry-exporter/) |\n| Personalizer | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/ai-personalizer/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-personalizer_1.0.0-beta.1/sdk/personalizer/ai-personalizer-rest/) |\n| Playwright | npm [1.1.5](https://www.npmjs.com/package/@azure/playwright/v/1.1.5) | [docs](/javascript/api/overview/azure/playwright-readme) | GitHub [1.1.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/playwright_1.1.5/sdk/loadtesting/playwright/) |\n| Purview Administration | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/purview-administration/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-administration_1.0.0-beta.2/sdk/purview/purview-administration-rest/) |\n| Purview Data Map | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/purview-datamap/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-datamap_1.0.0-beta.3/sdk/purview/purview-datamap-rest/) |\n| Purview Scanning | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/purview-scanning/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-scanning_1.0.0-beta.3/sdk/purview/purview-scanning-rest/) |\n| Purview Sharing | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/purview-sharing/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-sharing_1.0.0-beta.3/sdk/purview/purview-sharing-rest) |\n| Purview Workflow | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/purview-workflow/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-workflow_1.0.0-beta.2/sdk/purview/purview-workflow-rest/) |\n| Quantum Jobs | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/quantum-jobs/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/quantum-jobs-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/76c6e9a4cb5847a996ac6480f9a78b2ffaa1a182/sdk/quantum/quantum-jobs) |\n| Schema Registry | npm [1.3.0](https://www.npmjs.com/package/@azure/schema-registry/v/1.3.0) | [docs](/javascript/api/overview/azure/schema-registry-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/schema-registry_1.3.0/sdk/schemaregistry/schema-registry/) |\n| Schema Registry - Avro | npm [1.1.0](https://www.npmjs.com/package/@azure/schema-registry-avro/v/1.1.0) | [docs](/javascript/api/overview/azure/schema-registry-avro-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/schema-registry-avro_1.1.0/sdk/schemaregistry/schema-registry-avro/) |\n| Schema Registry - JSON | npm [1.0.0](https://www.npmjs.com/package/@azure/schema-registry-json/v/1.0.0) | [docs](/javascript/api/overview/azure/schema-registry-json-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/schema-registry-json_1.0.0/sdk/schemaregistry/schema-registry-json/) |\n| Service Bus | npm [7.9.5](https://www.npmjs.com/package/@azure/service-bus/v/7.9.5)<br>npm [7.10.0-beta.4](https://www.npmjs.com/package/@azure/service-bus/v/7.10.0-beta.4) | [docs](/javascript/api/overview/azure/service-bus-readme) | GitHub [7.9.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/service-bus_7.9.5/sdk/servicebus/service-bus/)<br>GitHub [7.10.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/service-bus_7.10.0-beta.4/sdk/servicebus/service-bus/) |\n| Spark | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/synapse-spark/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/synapse-spark-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/synapse-spark_1.0.0-beta.4/sdk/synapse/synapse-spark/) |\n| Storage - Blobs | npm [12.31.0](https://www.npmjs.com/package/@azure/storage-blob/v/12.31.0)<br>npm [12.33.0-beta.1](https://www.npmjs.com/package/@azure/storage-blob/v/12.33.0-beta.1) | [docs](/javascript/api/overview/azure/storage-blob-readme) | GitHub [12.31.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-blob_12.31.0/sdk/storage/storage-blob/)<br>GitHub [12.33.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-blob_12.33.0-beta.1/sdk/storage/storage-blob/) |\n| Storage - Blobs Changefeed | npm [12.0.0-preview.4](https://www.npmjs.com/package/@azure/storage-blob-changefeed/v/12.0.0-preview.4) | [docs](/javascript/api/overview/azure/storage-blob-changefeed-readme) | GitHub [12.0.0-preview.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-blob-changefeed_12.0.0-preview.4/sdk/storage/storage-blob-changefeed/) |\n| Storage - Files Data Lake | npm [12.29.0](https://www.npmjs.com/package/@azure/storage-file-datalake/v/12.29.0)<br>npm [12.31.0-beta.1](https://www.npmjs.com/package/@azure/storage-file-datalake/v/12.31.0-beta.1) | [docs](/javascript/api/overview/azure/storage-file-datalake-readme) | GitHub [12.29.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-file-datalake_12.29.0/sdk/storage/storage-file-datalake/)<br>GitHub [12.31.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-file-datalake_12.31.0-beta.1/sdk/storage/storage-file-datalake/) |\n| Storage - Files Share | npm [12.30.0](https://www.npmjs.com/package/@azure/storage-file-share/v/12.30.0)<br>npm [12.32.0-beta.1](https://www.npmjs.com/package/@azure/storage-file-share/v/12.32.0-beta.1) | [docs](/javascript/api/overview/azure/storage-file-share-readme) | GitHub [12.30.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-file-share_12.30.0/sdk/storage/storage-file-share/)<br>GitHub [12.32.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-file-share_12.32.0-beta.1/sdk/storage/storage-file-share/) |\n| Storage - Queues | npm [12.29.0](https://www.npmjs.com/package/@azure/storage-queue/v/12.29.0)<br>npm [12.31.0-beta.1](https://www.npmjs.com/package/@azure/storage-queue/v/12.31.0-beta.1) | [docs](/javascript/api/overview/azure/storage-queue-readme) | GitHub [12.29.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-queue_12.29.0/sdk/storage/storage-queue/)<br>GitHub [12.31.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-queue_12.31.0-beta.1/sdk/storage/storage-queue/) |\n| Storage Common | npm [12.3.0](https://www.npmjs.com/package/@azure/storage-common/v/12.3.0)<br>npm [12.4.0-beta.1](https://www.npmjs.com/package/@azure/storage-common/v/12.4.0-beta.1) | [docs](/javascript/api/overview/azure/storage-common-readme) | GitHub [12.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-common_12.3.0/sdk/storage/storage-common/)<br>GitHub [12.4.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-common_12.4.0-beta.1/sdk/storage/storage-common/) |\n| Synapse - Monitoring | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/synapse-monitoring/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/synapse-monitoring-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/synapse-monitoring_1.0.0-beta.2/sdk/synapse/synapse-monitoring/) |\n| System Events | npm [1.0.1](https://www.npmjs.com/package/@azure/eventgrid-systemevents/v/1.0.1) | [docs](/javascript/api/overview/azure/eventgrid-systemevents-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/eventgrid-systemevents_1.0.1/sdk/eventgrid/eventgrid-systemevents/) |\n| Tables | npm [13.3.2](https://www.npmjs.com/package/@azure/data-tables/v/13.3.2) | [docs](/javascript/api/overview/azure/data-tables-readme) | GitHub [13.3.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/data-tables_13.3.2/sdk/tables/data-tables/) |\n| Text Analytics | npm [5.1.0](https://www.npmjs.com/package/@azure/ai-text-analytics/v/5.1.0)<br>npm [6.0.0-beta.1](https://www.npmjs.com/package/@azure/ai-text-analytics/v/6.0.0-beta.1) | [docs](/javascript/api/overview/azure/ai-text-analytics-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-text-analytics_5.1.0/sdk/textanalytics/ai-text-analytics/)<br>GitHub [6.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-text-analytics_6.0.0-beta.1/sdk/textanalytics/ai-text-analytics/) |\n| Text Translation | npm [1.0.1](https://www.npmjs.com/package/@azure-rest/ai-translation-text/v/1.0.1)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/ai-translation-text/v/2.0.0-beta.1) |  | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-translation-text_1.0.1/sdk/translation/ai-translation-text-rest/) |\n| TimeZones | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/maps-timezone/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/maps-timezone_1.0.0-beta.1/sdk/maps/maps-timezone-rest/) |\n| Token Cache Persistence Plugin | npm [1.3.0](https://www.npmjs.com/package/@azure/identity-cache-persistence/v/1.3.0) | [docs](/javascript/api/overview/azure/identity-cache-persistence-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/identity-cache-persistence_1.3.0/sdk/identity/identity-cache-persistence/) |\n| TypeSpec HTTP Runtime | npm [0.3.5](https://www.npmjs.com/package/@typespec/ts-http-runtime/v/0.3.5) |  | GitHub [0.3.5](https://github.com/Azure/azure-sdk-for-js/tree/@typespec/ts-http-runtime_0.3.5/sdk/core/ts-http-runtime) |\n| unknown | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/postgresql-auth/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/postgresql-auth-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/postgresql-auth_1.0.0-beta.1/sdk/postgresql/postgresql-auth/) |\n| Voice Live | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/ai-voicelive/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/ai-voicelive-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-voicelive_1.0.0-beta.4/sdk/voicelive/ai-voicelive/) |\n| VS Code Authentication Plugin | npm [2.2.0](https://www.npmjs.com/package/@azure/identity-vscode/v/2.2.0) | [docs](/javascript/api/overview/azure/identity-vscode-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/identity-vscode_2.2.0/sdk/identity/identity-vscode/) |\n| Web PubSub | npm [1.2.0](https://www.npmjs.com/package/@azure/web-pubsub/v/1.2.0) | [docs](/javascript/api/overview/azure/web-pubsub-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/web-pubsub_1.2.0/sdk/web-pubsub/web-pubsub/) |\n| Web PubSub Client | npm [1.0.4](https://www.npmjs.com/package/@azure/web-pubsub-client/v/1.0.4) | [docs](/javascript/api/overview/azure/web-pubsub-client-readme) | GitHub [1.0.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/web-pubsub-client_1.0.4/sdk/web-pubsub/web-pubsub-client/) |\n| WebPubSub Client SDK Protobuf | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/web-pubsub-client-protobuf/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/web-pubsub-client-protobuf-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/web-pubsub-client-protobuf_1.0.0-beta.2/sdk/web-pubsub/web-pubsub-client-protobuf/) |\n| OpenTelemetry Instrumentation | npm [1.0.0](https://www.npmjs.com/package/@azure/opentelemetry-instrumentation-azure-sdk/v/1.0.0) | [docs](/javascript/api/overview/azure/opentelemetry-instrumentation-azure-sdk-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/opentelemetry-instrumentation-azure-sdk_1.0.0/sdk/instrumentation/opentelemetry-instrumentation-azure-sdk/) |\n| Web PubSub CloudEvents Handlers for Express | npm [1.0.6](https://www.npmjs.com/package/@azure/web-pubsub-express/v/1.0.6) | [docs](/javascript/api/overview/azure/web-pubsub-express-readme) | GitHub [1.0.6](https://github.com/Azure/azure-sdk-for-js/tree/@azure/web-pubsub-express_1.0.6/sdk/web-pubsub/web-pubsub-express/) |\n| @azure/arm-authorization-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-authorization-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-authorization-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-authorization-profile-2020-09-01-hybrid_2.1.0/sdk/authorization/arm-authorization-profile-2020-09-01-hybrid/) |\n| @azure/arm-commerce-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-commerce-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-commerce-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-commerce-profile-2020-09-01-hybrid_2.1.0/sdk/commerce/arm-commerce-profile-2020-09-01-hybrid/) |\n| @azure/arm-compute-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-compute-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-compute-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-compute-profile-2020-09-01-hybrid_2.1.0/sdk/compute/arm-compute-profile-2020-09-01-hybrid/) |\n| @azure/arm-databoxedge-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-databoxedge-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-databoxedge-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-databoxedge-profile-2020-09-01-hybrid_2.1.0/sdk/databoxedge/arm-databoxedge-profile-2020-09-01-hybrid/) |\n| @azure/arm-dns-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-dns-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-dns-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dns-profile-2020-09-01-hybrid_2.1.0/sdk/dns/arm-dns-profile-2020-09-01-hybrid/) |\n| @azure/arm-eventhub-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-eventhub-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-eventhub-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-eventhub-profile-2020-09-01-hybrid_2.1.0/sdk/eventhub/arm-eventhub-profile-2020-09-01-hybrid/) |\n| @azure/arm-keyvault-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-keyvault-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-keyvault-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-keyvault-profile-2020-09-01-hybrid_2.1.0/sdk/keyvault/arm-keyvault-profile-2020-09-01-hybrid/) |\n| @azure/arm-locks-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-locks-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-locks-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-locks-profile-2020-09-01-hybrid_2.1.0/sdk/locks/arm-locks-profile-2020-09-01-hybrid/) |\n| @azure/arm-monitor-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-monitor-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-monitor-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-monitor-profile-2020-09-01-hybrid_2.1.0/sdk/monitor/arm-monitor-profile-2020-09-01-hybrid/) |\n| @azure/arm-network-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-network-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-network-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-network-profile-2020-09-01-hybrid_2.1.0/sdk/network/arm-network-profile-2020-09-01-hybrid/) |\n| @azure/arm-policy-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-policy-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-policy-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-policy-profile-2020-09-01-hybrid_2.1.0/sdk/policy/arm-policy-profile-2020-09-01-hybrid/) |\n| @azure/arm-resources-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-resources-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-resources-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resources-profile-2020-09-01-hybrid_2.1.0/sdk/resources/arm-resources-profile-2020-09-01-hybrid/) |\n| @azure/arm-storage-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-storage-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-storage-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-storage-profile-2020-09-01-hybrid_2.1.0/sdk/storage/arm-storage-profile-2020-09-01-hybrid/) |\n| @azure/arm-subscriptions-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-subscriptions-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-subscriptions-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-subscriptions-profile-2020-09-01-hybrid_2.1.0/sdk/subscription/arm-subscriptions-profile-2020-09-01-hybrid/) |\n| Anomaly Detector - RLC | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/ai-anomaly-detector/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-anomaly-detector_1.0.0-beta.1/sdk/anomalydetector/ai-anomaly-detector-rest) |\n| Resource Management - AD External Identities | npm [1.0.3](https://www.npmjs.com/package/@azure/arm-azureadexternalidentities/v/1.0.3) | [docs](/javascript/api/overview/azure/arm-azureadexternalidentities-readme) | GitHub [1.0.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-azureadexternalidentities_1.0.3/sdk/azureadexternalidentities/arm-azureadexternalidentities/) |\n| Resource Management - Advisor | npm [3.2.0](https://www.npmjs.com/package/@azure/arm-advisor/v/3.2.0) | [docs](/javascript/api/overview/azure/arm-advisor-readme) | GitHub [3.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/advisor/arm-advisor) |\n| Resource Management - Agriculture Platform | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-agricultureplatform/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-agricultureplatform-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-agricultureplatform_1.0.0-beta.1/sdk/agricultureplatform/arm-agricultureplatform/) |\n| Resource Management - Agrifood | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-agrifood/v/1.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-agrifood-readme) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-agrifood_1.0.0-beta.5/sdk/agrifood/arm-agrifood/) |\n| Resource Management - Alertprocessingrules | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-alertprocessingrules/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-alertprocessingrules-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-alertprocessingrules_1.0.0-beta.1/sdk/alertprocessingrules/arm-alertprocessingrules/) |\n| Resource Management - Alertrulerecommendations | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-alertrulerecommendations/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-alertrulerecommendations-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-alertrulerecommendations_1.0.0-beta.1/sdk/alertrulerecommendations/arm-alertrulerecommendations/) |\n| Resource Management - Alertsmanagement | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-alertsmanagement/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-alertsmanagement-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-alertsmanagement_1.0.0-beta.1/sdk/alertsmanagement/arm-alertsmanagement/) |\n| Resource Management - Analysis Services | npm [4.1.3](https://www.npmjs.com/package/@azure/arm-analysisservices/v/4.1.3) | [docs](/javascript/api/overview/azure/arm-analysisservices-readme) | GitHub [4.1.3](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/analysisservices/arm-analysisservices) |\n| Resource Management - API Center | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-apicenter/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-apicenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-apicenter_1.0.0/sdk/apicenter/arm-apicenter/) |\n| Resource Management - API Management | npm [10.0.0](https://www.npmjs.com/package/@azure/arm-apimanagement/v/10.0.0) | [docs](/javascript/api/overview/azure/arm-apimanagement-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/apimanagement/arm-apimanagement) |\n| Resource Management - App Compliance Automation | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-appcomplianceautomation/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-appcomplianceautomation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-appcomplianceautomation_1.0.0/sdk/appcomplianceautomation/arm-appcomplianceautomation/) |\n| Resource Management - App Configuration | npm [5.0.0](https://www.npmjs.com/package/@azure/arm-appconfiguration/v/5.0.0)<br>npm [6.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-appconfiguration/v/6.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-appconfiguration-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/appconfiguration/arm-appconfiguration) |\n| Resource Management - App Service | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/arm-appservice/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/appservice/arm-appservice-rest) |\n| Resource Management - App Service | npm [18.0.0](https://www.npmjs.com/package/@azure/arm-appservice/v/18.0.0) | [docs](/javascript/api/overview/azure/arm-appservice-readme) | GitHub [18.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/appservice/arm-appservice) |\n| Resource Management - App Service | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-appservice-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-appservice-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-appservice-profile-2020-09-01-hybrid_2.1.0/sdk/appservice/arm-appservice-profile-2020-09-01-hybrid/) |\n| Resource Management - Application Insights | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-appinsights/v/4.0.0)<br>npm [5.0.0-beta.8](https://www.npmjs.com/package/@azure/arm-appinsights/v/5.0.0-beta.8) | [docs](/javascript/api/overview/azure/arm-appinsights-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/applicationinsights/arm-appinsights) |\n| Resource Management - Appnetwork | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-appnetwork/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-appnetwork_1.0.0-beta.1/sdk/appnetwork/arm-appnetwork/) |\n| Resource Management - Arize AI Observability Eval | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-arizeaiobservabilityeval/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-arizeaiobservabilityeval-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-arizeaiobservabilityeval_1.0.0/sdk/liftrarize/arm-arizeaiobservabilityeval/) |\n| Resource Management - Artifactsigning | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-artifactsigning/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-artifactsigning-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-artifactsigning_1.0.0/sdk/artifactsigning/arm-artifactsigning/) |\n| Resource Management - Astro | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-astro/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-astro-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-astro_1.0.0-beta.1/sdk/astro/arm-astro/) |\n| Resource Management - Attestation | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-attestation/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-attestation-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-attestation_2.1.0/sdk/attestation/arm-attestation/) |\n| Resource Management - Authorization | npm [9.0.0](https://www.npmjs.com/package/@azure/arm-authorization/v/9.0.0)<br>npm [10.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-authorization/v/10.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-authorization-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/authorization/arm-authorization) |\n| Resource Management - Automanage | npm [1.0.2](https://www.npmjs.com/package/@azure/arm-automanage/v/1.0.2) | [docs](/javascript/api/overview/azure/arm-automanage-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-automanage_1.0.2/sdk/automanage/arm-automanage/) |\n| Resource Management - Automation | npm [10.1.1](https://www.npmjs.com/package/@azure/arm-automation/v/10.1.1)<br>npm [11.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-automation/v/11.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-automation-readme) | GitHub [10.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/automation/arm-automation) |\n| Resource Management - Azure AI Search | npm [3.3.0](https://www.npmjs.com/package/@azure/arm-search/v/3.3.0)<br>npm [4.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-search/v/4.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-search-readme) | GitHub [3.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/search/arm-search) |\n| Resource Management - Azure Stack | npm [2.1.1](https://www.npmjs.com/package/@azure/arm-azurestack/v/2.1.1)<br>npm [3.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-azurestack/v/3.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-azurestack-readme) | GitHub [2.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/azurestack/arm-azurestack) |\n| Resource Management - Azure Stack HCI | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-azurestackhci/v/4.0.0)<br>npm [4.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-azurestackhci/v/4.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-azurestackhci-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-azurestackhci_4.0.0/sdk/azurestackhci/arm-azurestackhci/)<br>GitHub [4.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-azurestackhci_4.1.0-beta.1/sdk/azurestackhci/arm-azurestackhci/) |\n| Resource Management - Azure VMware Solution | npm [7.1.0](https://www.npmjs.com/package/@azure/arm-avs/v/7.1.0) | [docs](/javascript/api/overview/azure/arm-avs-readme) | GitHub [7.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/avs/arm-avs) |\n| Resource Management - Azurestackhcivm | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-azurestackhcivm/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-azurestackhcivm-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-azurestackhcivm_1.0.0-beta.1/sdk/azurestackhcivm/arm-azurestackhcivm/) |\n| Resource Management - BareMetal Infrastructure | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-baremetalinfrastructure/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-baremetalinfrastructure-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-baremetalinfrastructure_1.0.0-beta.2/sdk/baremetalinfrastructure/arm-baremetalinfrastructure/) |\n| Resource Management - Batch | npm [11.0.0](https://www.npmjs.com/package/@azure/arm-batch/v/11.0.0) | [docs](/javascript/api/overview/azure/arm-batch-readme) | GitHub [11.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/batch/arm-batch) |\n| Resource Management - Billing | npm [5.0.0](https://www.npmjs.com/package/@azure/arm-billing/v/5.0.0) | [docs](/javascript/api/overview/azure/arm-billing-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/billing/arm-billing) |\n| Resource Management - Billing Benefits | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-billingbenefits/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-billingbenefits-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-billingbenefits_1.0.0/sdk/billingbenefits/arm-billingbenefits/) |\n| Resource Management - Bot Service | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-botservice/v/4.0.0) | [docs](/javascript/api/overview/azure/arm-botservice-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/botservice/arm-botservice) |\n| Resource Management - Carbonoptimization | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-carbonoptimization/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-carbonoptimization-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-carbonoptimization_1.0.0/sdk/carbonoptimization/arm-carbonoptimization/) |\n| Resource Management - Certificateregistration | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-certificateregistration/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-certificateregistration-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-certificateregistration_1.0.0-beta.1/sdk/certificateregistration/arm-certificateregistration/) |\n| Resource Management - Change Analysis | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-changeanalysis/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-changeanalysis-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-changeanalysis_2.1.0/sdk/changeanalysis/arm-changeanalysis/) |\n| Resource Management - Changes | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-changes/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-changes-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-changes_1.1.0/sdk/changes/arm-changes/) |\n| Resource Management - Chaos | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-chaos/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-chaos-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-chaos_2.0.0/sdk/chaos/arm-chaos/) |\n| Resource Management - Cognitive Services | npm [8.1.0](https://www.npmjs.com/package/@azure/arm-cognitiveservices/v/8.1.0)<br>npm [9.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-cognitiveservices/v/9.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-cognitiveservices-readme) | GitHub [8.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/cognitiveservices/arm-cognitiveservices) |\n| Resource Management - Commerce | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-commerce/v/3.0.0)<br>npm [4.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-commerce/v/4.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-commerce-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/commerce/arm-commerce) |\n| Resource Management - Commitment Plans | npm [1.3.1](https://www.npmjs.com/package/@azure/arm-commitmentplans/v/1.3.1)<br>npm [2.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-commitmentplans/v/2.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-commitmentplans-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/machinelearning/arm-commitmentplans) |\n| Resource Management - Communication | npm [4.2.0](https://www.npmjs.com/package/@azure/arm-communication/v/4.2.0)<br>npm [5.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-communication/v/5.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-communication-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-communication_4.2.0/sdk/communication/arm-communication/)<br>GitHub [5.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-communication_5.0.0-beta.1/sdk/communication/arm-communication/) |\n| Resource Management - Compute | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/arm-compute/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-compute-rest) |\n| Resource Management - Compute | npm [24.0.0](https://www.npmjs.com/package/@azure/arm-compute/v/24.0.0) | [docs](/javascript/api/overview/azure/arm-compute-readme) | GitHub [24.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-compute) |\n| Resource Management - Compute Fleet | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-computefleet/v/1.0.0)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-computefleet/v/2.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-computefleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computefleet_1.0.0/sdk/computefleet/arm-computefleet/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computefleet_2.0.0-beta.1/sdk/computefleet/arm-computefleet/) |\n| Resource Management - Compute Schedule | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-computeschedule/v/1.1.0)<br>npm [1.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-computeschedule/v/1.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-computeschedule-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computeschedule_1.1.0/sdk/computeschedule/arm-computeschedule/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computeschedule_1.2.0-beta.1/sdk/computeschedule/arm-computeschedule/) |\n| Resource Management - Computebulkactions | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-computebulkactions/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-computebulkactions-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computebulkactions_1.0.0-beta.1/sdk/computebulkactions/arm-computebulkactions/) |\n| Resource Management - Computelimit | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-computelimit/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-computelimit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computelimit_1.0.0/sdk/computelimit/arm-computelimit/) |\n| Resource Management - Computerecommender | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-computerecommender/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-computerecommender-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computerecommender_1.0.0/sdk/compute/arm-computerecommender/) |\n| Resource Management - Confidential Ledger | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-confidentialledger/v/1.2.0)<br>npm [1.3.0-beta.3](https://www.npmjs.com/package/@azure/arm-confidentialledger/v/1.3.0-beta.3) | [docs](/javascript/api/overview/azure/arm-confidentialledger-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-confidentialledger_1.2.0/sdk/confidentialledger/arm-confidentialledger/)<br>GitHub [1.3.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-confidentialledger_1.3.0-beta.3/sdk/confidentialledger/arm-confidentialledger/) |\n| Resource Management - Confluent | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-confluent/v/3.1.0)<br>npm [4.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-confluent/v/4.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-confluent-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/confluent/arm-confluent) |\n| Resource Management - Connected Cache | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-connectedcache/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-connectedcache-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-connectedcache_1.0.0-beta.1/sdk/connectedcache/arm-connectedcache/) |\n| Resource Management - Connected VMware | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-connectedvmware/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-connectedvmware-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-connectedvmware_1.0.0/sdk/connectedvmware/arm-connectedvmware/) |\n| Resource Management - Consumption | npm [9.2.0](https://www.npmjs.com/package/@azure/arm-consumption/v/9.2.0) | [docs](/javascript/api/overview/azure/arm-consumption-readme) | GitHub [9.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/consumption/arm-consumption) |\n| Resource Management - Container Apps | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-appcontainers/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-appcontainers-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-appcontainers_3.0.0/sdk/appcontainers/arm-appcontainers/) |\n| Resource Management - Container Instances | npm [9.1.0](https://www.npmjs.com/package/@azure/arm-containerinstance/v/9.1.0)<br>npm [9.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-containerinstance/v/9.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-containerinstance-readme) | GitHub [9.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/containerinstance/arm-containerinstance) |\n| Resource Management - Container Orchestrator Runtime | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-containerorchestratorruntime/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-containerorchestratorruntime-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-containerorchestratorruntime_1.0.0-beta.1/sdk/kubernetesruntime/arm-containerorchestratorruntime/) |\n| Resource Management - Container Registry | npm [12.0.0](https://www.npmjs.com/package/@azure/arm-containerregistry/v/12.0.0)<br>npm [12.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-containerregistry/v/12.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-containerregistry-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/containerregistry/arm-containerregistry) |\n| Resource Management - Container Service | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/arm-containerservice/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/containerservice/arm-containerservice-rest) |\n| Resource Management - Container Service | npm [25.1.0](https://www.npmjs.com/package/@azure/arm-containerservice/v/25.1.0) | [docs](/javascript/api/overview/azure/arm-containerservice-readme) | GitHub [25.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/containerservice/arm-containerservice) |\n| Resource Management - Container Service Fleet | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-containerservicefleet/v/2.0.0)<br>npm [2.1.0-beta.3](https://www.npmjs.com/package/@azure/arm-containerservicefleet/v/2.1.0-beta.3) | [docs](/javascript/api/overview/azure/arm-containerservicefleet-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-containerservicefleet_2.0.0/sdk/containerservice/arm-containerservicefleet/)<br>GitHub [2.1.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-containerservicefleet_2.1.0-beta.3/sdk/containerservice/arm-containerservicefleet/) |\n| Resource Management - Containerregistrytasks | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-containerregistrytasks/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-containerregistrytasks-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-containerregistrytasks_1.0.0-beta.1/sdk/containerregistry/arm-containerregistrytasks/) |\n| Resource Management - Containerservicesafeguards | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-containerservicesafeguards/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-containerservicesafeguards-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-containerservicesafeguards_1.0.0-beta.1/sdk/containerservice/arm-containerservicesafeguards/) |\n| Resource Management - Content Delivery Network | npm [9.1.0](https://www.npmjs.com/package/@azure/arm-cdn/v/9.1.0) | [docs](/javascript/api/overview/azure/arm-cdn-readme) | GitHub [9.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/cdn/arm-cdn) |\n| Resource Management - Cosmos DB | npm [16.4.0](https://www.npmjs.com/package/@azure/arm-cosmosdb/v/16.4.0)<br>npm [17.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-cosmosdb/v/17.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-cosmosdb-readme) | GitHub [16.4.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/cosmosdb/arm-cosmosdb) |\n| Resource Management - CosmosDB for PostgreSQL | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-cosmosdbforpostgresql/v/1.0.0)<br>npm [1.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-cosmosdbforpostgresql/v/1.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-cosmosdbforpostgresql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-cosmosdbforpostgresql_1.0.0/sdk/cosmosforpostgresql/arm-cosmosdbforpostgresql/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-cosmosdbforpostgresql_1.1.0-beta.1/sdk/cosmosforpostgresql/arm-cosmosdbforpostgresql/) |\n| Resource Management - Cost Management | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-costmanagement/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-costmanagement-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-costmanagement_1.0.0-beta.1/sdk/cost-management/arm-costmanagement/) |\n| Resource Management - Customer Insights | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-customerinsights/v/4.1.0) | [docs](/javascript/api/overview/azure/arm-customerinsights-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/customer-insights/arm-customerinsights) |\n| Resource Management - Data Boundaries | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-databoundaries/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-databoundaries-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-databoundaries_1.0.0-beta.1/sdk/databoundaries/arm-databoundaries/) |\n| Resource Management - Data Box | npm [5.1.0](https://www.npmjs.com/package/@azure/arm-databox/v/5.1.0) | [docs](/javascript/api/overview/azure/arm-databox-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/databox/arm-databox) |\n| Resource Management - Data Box Edge | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-databoxedge/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-databoxedge-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-databoxedge_2.1.0/sdk/databoxedge/arm-databoxedge/) |\n| Resource Management - Data Catalog | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-datacatalog/v/4.1.0) | [docs](/javascript/api/overview/azure/arm-datacatalog-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/datacatalog/arm-datacatalog) |\n| Resource Management - Data Factory | npm [19.0.0](https://www.npmjs.com/package/@azure/arm-datafactory/v/19.0.0)<br>npm [20.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-datafactory/v/20.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-datafactory-readme) | GitHub [19.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/datafactory/arm-datafactory) |\n| Resource Management - Data Lake Analytics | npm [1.1.1](https://www.npmjs.com/package/@azure/arm-datalake-analytics/v/1.1.1)<br>npm [2.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-datalake-analytics/v/2.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-datalake-analytics-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/datalake-analytics/arm-datalake-analytics) |\n| Resource Management - Data Migration | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-datamigration/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-datamigration-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/datamigration/arm-datamigration) |\n| Resource Management - Data Protection | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-dataprotection/v/4.0.0) | [docs](/javascript/api/overview/azure/arm-dataprotection-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dataprotection_4.0.0/sdk/dataprotection/arm-dataprotection/) |\n| Resource Management - Database Watcher | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-databasewatcher/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-databasewatcher_1.0.0-beta.1/sdk/databasewatcher/arm-databasewatcher/) |\n| Resource Management - Databricks | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-databricks/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-databricks-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/databricks/arm-databricks) |\n| Resource Management - Datadog | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-datadog/v/3.1.0) | [docs](/javascript/api/overview/azure/arm-datadog-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-datadog_3.1.0/sdk/datadog/arm-datadog/) |\n| Resource Management - Defender EASM | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-defendereasm/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-defendereasm-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-defendereasm_1.0.0-beta.1/sdk/defendereasm/arm-defendereasm/) |\n| Resource Management - Dell-Storage | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-dell-storage/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-dell-storage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dell-storage_1.0.0/sdk/dell/arm-dell-storage/) |\n| Resource Management - Dependencymap | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-dependencymap/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dependencymap_1.0.0-beta.1/sdk/dependencymap/arm-dependencymap/) |\n| Resource Management - Deployment Manager | npm [3.1.1](https://www.npmjs.com/package/@azure/arm-deploymentmanager/v/3.1.1)<br>npm [4.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-deploymentmanager/v/4.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-deploymentmanager-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/deploymentmanager/arm-deploymentmanager) |\n| Resource Management - Deployment Stacks | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-resourcesdeploymentstacks/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-resourcesdeploymentstacks-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourcesdeploymentstacks_1.0.0/sdk/resourcesdeploymentstacks/arm-resourcesdeploymentstacks/) |\n| Resource Management - Desktop Virtualization | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-desktopvirtualization/v/1.2.0) | [docs](/javascript/api/overview/azure/arm-desktopvirtualization-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-desktopvirtualization_1.2.0/sdk/desktopvirtualization/arm-desktopvirtualization/) |\n| Resource Management - Dev Center | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-devcenter/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-devcenter-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-devcenter_1.1.0/sdk/devcenter/arm-devcenter/) |\n| Resource Management - Dev Spaces | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-devspaces/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-devspaces-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/devspaces/arm-devspaces) |\n| Resource Management - DevHub | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-devhub/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-devhub-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-devhub_1.0.0-beta.3/sdk/devhub/arm-devhub/) |\n| Resource Management - Device Provisioning Services | npm [5.1.0](https://www.npmjs.com/package/@azure/arm-deviceprovisioningservices/v/5.1.0)<br>npm [6.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-deviceprovisioningservices/v/6.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-deviceprovisioningservices-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/deviceprovisioningservices/arm-deviceprovisioningservices) |\n| Resource Management - Device Registry | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-deviceregistry/v/1.1.0)<br>npm [1.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-deviceregistry/v/1.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-deviceregistry-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-deviceregistry_1.1.0/sdk/deviceregistry/arm-deviceregistry/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-deviceregistry_1.2.0-beta.1/sdk/deviceregistry/arm-deviceregistry/) |\n| Resource Management - Device Update | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-deviceupdate/v/1.2.0) | [docs](/javascript/api/overview/azure/arm-deviceupdate-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-deviceupdate_1.2.0/sdk/deviceupdate/arm-deviceupdate/) |\n| Resource Management - DevOps Infrastructure | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-devopsinfrastructure/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-devopsinfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-devopsinfrastructure_1.0.0/sdk/devopsinfrastructure/arm-devopsinfrastructure/) |\n| Resource Management - DevTest Labs | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-devtestlabs/v/4.1.0) | [docs](/javascript/api/overview/azure/arm-devtestlabs-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/devtestlabs/arm-devtestlabs) |\n| Resource Management - Digital Twins | npm [3.3.0](https://www.npmjs.com/package/@azure/arm-digitaltwins/v/3.3.0) | [docs](/javascript/api/overview/azure/arm-digitaltwins-readme) | GitHub [3.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/digitaltwins/arm-digitaltwins) |\n| Resource Management - Disconnectedoperations | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-disconnectedoperations/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-disconnectedoperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-disconnectedoperations_1.0.0/sdk/disconnectedoperations/arm-disconnectedoperations/) |\n| Resource Management - DNS | npm [5.1.0](https://www.npmjs.com/package/@azure/arm-dns/v/5.1.0)<br>npm [5.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-dns/v/5.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-dns-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/dns/arm-dns) |\n| Resource Management - DNS Resolver | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-dnsresolver/v/1.2.0)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-dnsresolver/v/2.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-dnsresolver-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dnsresolver_1.2.0/sdk/dnsresolver/arm-dnsresolver/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dnsresolver_2.0.0-beta.1/sdk/dnsresolver/arm-dnsresolver/) |\n| Resource Management - Domain Services | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-domainservices/v/4.1.0) | [docs](/javascript/api/overview/azure/arm-domainservices-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/domainservices/arm-domainservices) |\n| Resource Management - Domainregistration | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-domainregistration/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-domainregistration-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-domainregistration_1.0.0-beta.1/sdk/domainregistration/arm-domainregistration/) |\n| Resource Management - Durable Task | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-durabletask/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-durabletask-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-durabletask_1.1.0/sdk/durabletask/arm-durabletask/) |\n| Resource Management - Dynatrace | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-dynatrace/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-dynatrace-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dynatrace_2.0.0/sdk/dynatrace/arm-dynatrace/) |\n| Resource Management - Edge Zones | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-edgezones/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-edgezones-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-edgezones_1.0.0-beta.3/sdk/edgezones/arm-edgezones/) |\n| Resource Management - Edgeactions | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-edgeactions/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-edgeactions-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-edgeactions_1.0.0-beta.1/sdk/edgeactions/arm-edgeactions/) |\n| Resource Management - Education | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-education/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-education-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-education_1.0.0-beta.3/sdk/education/arm-education/) |\n| Resource Management - Elastic | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-elastic/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-elastic-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-elastic_2.0.0/sdk/elastic/arm-elastic/) |\n| Resource Management - Elasticsan | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-elasticsan/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-elasticsan-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-elasticsan_2.0.0/sdk/elasticsans/arm-elasticsan/) |\n| Resource Management - Event Grid | npm [14.2.0](https://www.npmjs.com/package/@azure/arm-eventgrid/v/14.2.0)<br>npm [15.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-eventgrid/v/15.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-eventgrid-readme) | GitHub [14.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/eventgrid/arm-eventgrid) |\n| Resource Management - Event Hubs | npm [5.2.0](https://www.npmjs.com/package/@azure/arm-eventhub/v/5.2.0)<br>npm [5.3.0-beta.1](https://www.npmjs.com/package/@azure/arm-eventhub/v/5.3.0-beta.1) | [docs](/javascript/api/overview/azure/arm-eventhub-readme) | GitHub [5.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/eventhub/arm-eventhub) |\n| Resource Management - Extended Location | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-extendedlocation/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-extendedlocation-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-extendedlocation_1.0.0-beta.3/sdk/extendedlocation/arm-extendedlocation/) |\n| Resource Management - Fabric | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-fabric/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-fabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-fabric_1.0.0/sdk/fabric/arm-fabric/) |\n| Resource Management - Features | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-features/v/3.1.0) | [docs](/javascript/api/overview/azure/arm-features-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/features/arm-features) |\n| Resource Management - Fileshares | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-fileshares/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-fileshares-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-fileshares_1.0.0-beta.1/sdk/fileshares/arm-fileshares/) |\n| Resource Management - Fluid Relay | npm [1.0.1](https://www.npmjs.com/package/@azure/arm-fluidrelay/v/1.0.1) | [docs](/javascript/api/overview/azure/arm-fluidrelay-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-fluidrelay_1.0.1/sdk/fluidrelay/arm-fluidrelay/) |\n| Resource Management - Front Door | npm [5.3.0](https://www.npmjs.com/package/@azure/arm-frontdoor/v/5.3.0) | [docs](/javascript/api/overview/azure/arm-frontdoor-readme) | GitHub [5.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/frontdoor/arm-frontdoor) |\n| Resource Management - Graph Services | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-graphservices/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-graphservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-graphservices_1.0.0/sdk/graphservices/arm-graphservices/) |\n| Resource Management - Guest Configuration | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-guestconfiguration/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-guestconfiguration-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-guestconfiguration_1.0.0-beta.1/sdk/guestconfiguration/arm-guestconfiguration/) |\n| Resource Management - HANA on Azure | npm [3.1.1](https://www.npmjs.com/package/@azure/arm-hanaonazure/v/3.1.1)<br>npm [4.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-hanaonazure/v/4.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-hanaonazure-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/hanaonazure/arm-hanaonazure) |\n| Resource Management - Hardware Security Modules | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-hardwaresecuritymodules/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-hardwaresecuritymodules-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hardwaresecuritymodules_2.0.0/sdk/hardwaresecuritymodules/arm-hardwaresecuritymodules/) |\n| Resource Management - HDInsight | npm [1.2.1](https://www.npmjs.com/package/@azure/arm-hdinsight/v/1.2.1)<br>npm [1.3.0-beta.2](https://www.npmjs.com/package/@azure/arm-hdinsight/v/1.3.0-beta.2) | [docs](/javascript/api/overview/azure/arm-hdinsight-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/hdinsight/arm-hdinsight) |\n| Resource Management - Health Bot | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-healthbot/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-healthbot-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-healthbot_2.1.0/sdk/healthbot/arm-healthbot/) |\n| Resource Management - Health Data AI  Services | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-healthdataaiservices/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-healthdataaiservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-healthdataaiservices_1.0.0/sdk/healthdataaiservices/arm-healthdataaiservices/) |\n| Resource Management - Healthcare APIs | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-healthcareapis/v/3.1.0) | [docs](/javascript/api/overview/azure/arm-healthcareapis-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-healthcareapis_3.1.0/sdk/healthcareapis/arm-healthcareapis/) |\n| Resource Management - Hybrid Compute | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-hybridcompute/v/4.0.0)<br>npm [5.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-hybridcompute/v/5.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-hybridcompute-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridcompute_4.0.0/sdk/hybridcompute/arm-hybridcompute/)<br>GitHub [5.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridcompute_5.0.0-beta.1/sdk/hybridcompute/arm-hybridcompute/) |\n| Resource Management - Hybrid Connectivity | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-hybridconnectivity/v/1.0.0)<br>npm [2.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-hybridconnectivity/v/2.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-hybridconnectivity-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridconnectivity_1.0.0/sdk/hybridconnectivity/arm-hybridconnectivity/)<br>GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridconnectivity_2.0.0-beta.2/sdk/hybridconnectivity/arm-hybridconnectivity/) |\n| Resource Management - Hybrid Container Service | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-hybridcontainerservice/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-hybridcontainerservice-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridcontainerservice_1.0.0/sdk/hybridcontainerservice/arm-hybridcontainerservice/) |\n| Resource Management - Hybrid Kubernetes | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-hybridkubernetes/v/2.1.0)<br>npm [3.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-hybridkubernetes/v/3.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-hybridkubernetes-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridkubernetes_2.1.0/sdk/hybridkubernetes/arm-hybridkubernetes/)<br>GitHub [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridkubernetes_3.0.0-beta.1/sdk/hybridkubernetes/arm-hybridkubernetes/) |\n| Resource Management - Hybrid Network | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-hybridnetwork/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-hybridnetwork-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridnetwork_1.0.0-beta.1/sdk/hybridnetwork/arm-hybridnetwork/) |\n| Resource Management - Image Builder | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-imagebuilder/v/4.1.0) | [docs](/javascript/api/overview/azure/arm-imagebuilder-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-imagebuilder_4.1.0/sdk/imagebuilder/arm-imagebuilder/) |\n| Resource Management - Impact Reporting | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-impactreporting/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-impactreporting_1.0.0-beta.1/sdk/impactreporting/arm-impactreporting/) |\n| Resource Management - Informatica Data Management | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-informaticadatamanagement/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-informaticadatamanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-informaticadatamanagement_1.0.0/sdk/informatica/arm-informaticadatamanagement/) |\n| Resource Management - IoT Central | npm [6.0.0](https://www.npmjs.com/package/@azure/arm-iotcentral/v/6.0.0)<br>npm [7.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-iotcentral/v/7.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-iotcentral-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/iotcentral/arm-iotcentral) |\n| Resource Management - IoT Firmware Defense | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-iotfirmwaredefense/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-iotfirmwaredefense-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-iotfirmwaredefense_2.0.0/sdk/iotfirmwaredefense/arm-iotfirmwaredefense/) |\n| Resource Management - IoT Hub | npm [6.3.0](https://www.npmjs.com/package/@azure/arm-iothub/v/6.3.0) | [docs](/javascript/api/overview/azure/arm-iothub-readme) | GitHub [6.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/iothub/arm-iothub) |\n| Resource Management - IoT Operations | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-iotoperations/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-iotoperations-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-iotoperations_2.0.0/sdk/iotoperations/arm-iotoperations/) |\n| Resource Management - Key Vault | npm [5.0.0](https://www.npmjs.com/package/@azure/arm-keyvault/v/5.0.0) | [docs](/javascript/api/overview/azure/arm-keyvault-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/keyvault/arm-keyvault) |\n| Resource Management - Kubernetes Configuration | npm [6.1.0](https://www.npmjs.com/package/@azure/arm-kubernetesconfiguration/v/6.1.0) | [docs](/javascript/api/overview/azure/arm-kubernetesconfiguration-readme) | GitHub [6.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/kubernetesconfiguration/arm-kubernetesconfiguration) |\n| Resource Management - Kubernetesconfiguration-Extensions | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-kubernetesconfiguration-extensions/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-kubernetesconfiguration-extensions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-kubernetesconfiguration-extensions_1.0.0/sdk/kubernetesconfiguration/arm-kubernetesconfiguration-extensions/) |\n| Resource Management - Kubernetesconfiguration-Extensiontypes | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-kubernetesconfiguration-extensiontypes/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-kubernetesconfiguration-extensiontypes-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-kubernetesconfiguration-extensiontypes_1.0.0-beta.1/sdk/kubernetesconfiguration/arm-kubernetesconfiguration-extensiontypes/) |\n| Resource Management - Kubernetesconfiguration-Fluxconfigurations | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-kubernetesconfiguration-fluxconfigurations/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-kubernetesconfiguration-fluxconfigurations-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-kubernetesconfiguration-fluxconfigurations_1.0.0-beta.1/sdk/kubernetesconfiguration/arm-kubernetesconfiguration-fluxconfigurations/) |\n| Resource Management - Kubernetesconfiguration-Privatelinkscopes | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-kubernetesconfiguration-privatelinkscopes/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-kubernetesconfiguration-privatelinkscopes-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-kubernetesconfiguration-privatelinkscopes_1.0.0-beta.1/sdk/kubernetesconfiguration/arm-kubernetesconfiguration-privatelinkscopes/) |\n| Resource Management - Kusto | npm [8.2.0](https://www.npmjs.com/package/@azure/arm-kusto/v/8.2.0) | [docs](/javascript/api/overview/azure/arm-kusto-readme) | GitHub [8.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/kusto/arm-kusto) |\n| Resource Management - Lab Services | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-labservices/v/3.1.0) | [docs](/javascript/api/overview/azure/arm-labservices-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/labservices/arm-labservices) |\n| Resource Management - Lambdatesthyperexecute | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-lambdatesthyperexecute/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-lambdatesthyperexecute-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-lambdatesthyperexecute_1.0.0/sdk/lambdatesthyperexecute/arm-lambdatesthyperexecute/) |\n| Resource Management - Large Instance | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-largeinstance/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-largeinstance-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-largeinstance_1.0.0-beta.1/sdk/largeinstance/arm-largeinstance/) |\n| Resource Management - Links | npm [2.0.1](https://www.npmjs.com/package/@azure/arm-links/v/2.0.1) | [docs](/javascript/api/overview/azure/arm-links-readme) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/links/arm-links) |\n| Resource Management - Load Testing | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-loadtesting/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-loadtesting-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-loadtesting_1.0.0/sdk/loadtestservice/arm-loadtesting/) |\n| Resource Management - Locks | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-locks/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-locks-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/locks/arm-locks) |\n| Resource Management - Log Analytics | npm [10.1.0](https://www.npmjs.com/package/@azure/arm-operationalinsights/v/10.1.0) | [docs](/javascript/api/overview/azure/arm-operationalinsights-readme) | GitHub [10.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/operationalinsights/arm-operationalinsights) |\n| Resource Management - Logic Apps | npm [8.2.0](https://www.npmjs.com/package/@azure/arm-logic/v/8.2.0) | [docs](/javascript/api/overview/azure/arm-logic-readme) | GitHub [8.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/logic/arm-logic) |\n| Resource Management - Machine Learning | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-machinelearning/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-machinelearning-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-machinelearning_3.0.0/sdk/machinelearning/arm-machinelearning/) |\n| Resource Management - Machine Learning Compute | npm [2.1.1](https://www.npmjs.com/package/@azure/arm-machinelearningcompute/v/2.1.1)<br>npm [3.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-machinelearningcompute/v/3.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-machinelearningcompute-readme) | GitHub [2.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/machinelearningcompute/arm-machinelearningcompute) |\n| Resource Management - Machine Learning Experimentation | npm [1.2.1](https://www.npmjs.com/package/@azure/arm-machinelearningexperimentation/v/1.2.1)<br>npm [2.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-machinelearningexperimentation/v/2.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-machinelearningexperimentation-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/machinelearningexperimentation/arm-machinelearningexperimentation) |\n| Resource Management - Maintenance | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-maintenance/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-maintenance-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-maintenance_1.0.0-beta.2/sdk/maintenance/arm-maintenance/) |\n| Resource Management - Managed Applications | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-managedapplications/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-managedapplications-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/managedapplications/arm-managedapplications) |\n| Resource Management - Managed Grafana | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-dashboard/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-dashboard-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dashboard_2.0.0/sdk/dashboard/arm-dashboard/) |\n| Resource Management - Managed Network Fabric | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-managednetworkfabric/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-managednetworkfabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-managednetworkfabric_1.0.0/sdk/managednetworkfabric/arm-managednetworkfabric/) |\n| Resource Management - Managed Service Identity | npm [2.2.0](https://www.npmjs.com/package/@azure/arm-msi/v/2.2.0) | [docs](/javascript/api/overview/azure/arm-msi-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/msi/arm-msi) |\n| Resource Management - Managedops | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-managedops/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-managedops-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-managedops_1.0.0-beta.2/sdk/managedops/arm-managedops/) |\n| Resource Management - Management Groups | npm [2.0.2](https://www.npmjs.com/package/@azure/arm-managementgroups/v/2.0.2) | [docs](/javascript/api/overview/azure/arm-managementgroups-readme) | GitHub [2.0.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/managementgroups/arm-managementgroups) |\n| Resource Management - Management Partner | npm [3.0.1](https://www.npmjs.com/package/@azure/arm-managementpartner/v/3.0.1) | [docs](/javascript/api/overview/azure/arm-managementpartner-readme) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/managementpartner/arm-managementpartner) |\n| Resource Management - Maps | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-maps/v/3.1.0)<br>npm [4.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-maps/v/4.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-maps-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/maps/arm-maps) |\n| Resource Management - MariaDB | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-mariadb/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-mariadb-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/mariadb/arm-mariadb) |\n| Resource Management - Marketplace | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-marketplace/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-marketplace-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-marketplace_1.0.0-beta.1/sdk/marketplace/arm-marketplace/) |\n| Resource Management - Marketplace Ordering | npm [3.1.1](https://www.npmjs.com/package/@azure/arm-marketplaceordering/v/3.1.1) | [docs](/javascript/api/overview/azure/arm-marketplaceordering-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/marketplaceordering/arm-marketplaceordering) |\n| Resource Management - Migrate | npm [2.0.3](https://www.npmjs.com/package/@azure/arm-migrate/v/2.0.3) | [docs](/javascript/api/overview/azure/arm-migrate-readme) | GitHub [2.0.3](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/migrate/arm-migrate) |\n| Resource Management - Migration Assessment | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-migrationassessment/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-migrationassessment-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-migrationassessment_1.0.0-beta.1/sdk/migrate/arm-migrationassessment/) |\n| Resource Management - Migration Discovery SAP | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-migrationdiscoverysap/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-migrationdiscoverysap-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-migrationdiscoverysap_1.0.0-beta.1/sdk/migrationdiscovery/arm-migrationdiscoverysap/) |\n| Resource Management - ML Web Services | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-webservices/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-webservices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/machinelearning/arm-webservices) |\n| Resource Management - Mongo Cluster | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-mongocluster/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-mongocluster-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-mongocluster_1.1.0/sdk/mongocluster/arm-mongocluster/) |\n| Resource Management - Mongodbatlas | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-mongodbatlas/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-mongodbatlas-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-mongodbatlas_1.0.0/sdk/mongodbatlas/arm-mongodbatlas/) |\n| Resource Management - Monitor | npm [7.0.0](https://www.npmjs.com/package/@azure/arm-monitor/v/7.0.0)<br>npm [8.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-monitor/v/8.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-monitor-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/monitor/arm-monitor) |\n| Resource Management - Monitorslis | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-monitorslis/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-monitorslis-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-monitorslis_1.0.0-beta.1/sdk/monitor/arm-monitorslis/) |\n| Resource Management - MySQL | npm [5.1.0](https://www.npmjs.com/package/@azure/arm-mysql/v/5.1.0) | [docs](/javascript/api/overview/azure/arm-mysql-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/mysql/arm-mysql) |\n| Resource Management - MySQL Flexible | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-mysql-flexible/v/3.1.0)<br>npm [4.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-mysql-flexible/v/4.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-mysql-flexible-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-mysql-flexible_3.1.0/sdk/mysql/arm-mysql-flexible/)<br>GitHub [4.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-mysql-flexible_4.0.0-beta.4/sdk/mysql/arm-mysql-flexible/) |\n| Resource Management - NetApp Files | npm [24.0.0](https://www.npmjs.com/package/@azure/arm-netapp/v/24.0.0) | [docs](/javascript/api/overview/azure/arm-netapp-readme) | GitHub [24.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/netapp/arm-netapp) |\n| Resource Management - Network | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/arm-network/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/network/arm-network-rest) |\n| Resource Management - Network | npm [36.0.0](https://www.npmjs.com/package/@azure/arm-network/v/36.0.0) | [docs](/javascript/api/overview/azure/arm-network-readme) | GitHub [36.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/network/arm-network) |\n| Resource Management - Network Cloud | npm [1.3.0](https://www.npmjs.com/package/@azure/arm-networkcloud/v/1.3.0)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-networkcloud/v/2.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-networkcloud-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-networkcloud_1.3.0/sdk/networkcloud/arm-networkcloud/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-networkcloud_2.0.0-beta.1/sdk/networkcloud/arm-networkcloud/) |\n| Resource Management - Network Function | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-networkfunction/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-networkfunction-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-networkfunction_2.0.0/sdk/networkfunction/arm-networkfunction/) |\n| Resource Management - New Relic Observability | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-newrelicobservability/v/1.1.0)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-newrelicobservability/v/2.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-newrelicobservability-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-newrelicobservability_1.1.0/sdk/newrelicobservability/arm-newrelicobservability/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-newrelicobservability_2.0.0-beta.1/sdk/newrelicobservability/arm-newrelicobservability/) |\n| Resource Management - Nginx | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-nginx/v/4.0.0) | [docs](/javascript/api/overview/azure/arm-nginx-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-nginx_4.0.0/sdk/nginx/arm-nginx/) |\n| Resource Management - Notification Hubs | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-notificationhubs/v/2.1.0)<br>npm [3.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-notificationhubs/v/3.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-notificationhubs-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/notificationhubs/arm-notificationhubs) |\n| Resource Management - Oep | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-oep/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-oep-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-oep_1.0.0-beta.3/sdk/oep/arm-oep/) |\n| Resource Management - Onlineexperimentation | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-onlineexperimentation/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-onlineexperimentation-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-onlineexperimentation_1.0.0-beta.1/sdk/onlineexperimentation/arm-onlineexperimentation/) |\n| Resource Management - Operations Management | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-operations/v/3.0.0)<br>npm [4.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-operations/v/4.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-operations-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/operationsmanagement/arm-operations) |\n| Resource Management - Oracle Database | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-oracledatabase/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-oracledatabase-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-oracledatabase_3.0.0/sdk/oracledatabase/arm-oracledatabase/) |\n| Resource Management - Orbital | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-orbital/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-orbital-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-orbital_2.0.0/sdk/orbital/arm-orbital/) |\n| Resource Management - Palo Alto Networks - Next Generation Firewall | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-paloaltonetworksngfw/v/1.2.0) | [docs](/javascript/api/overview/azure/arm-paloaltonetworksngfw-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-paloaltonetworksngfw_1.2.0/sdk/paloaltonetworksngfw/arm-paloaltonetworksngfw/) |\n| Resource Management - Peering | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-peering/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-peering-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/peering/arm-peering) |\n| Resource Management - Pinecone Vector DB | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-pineconevectordb/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-pineconevectordb-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-pineconevectordb_1.0.0-beta.2/sdk/pineconevectordb/arm-pineconevectordb/) |\n| Resource Management - Planetarycomputer | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-planetarycomputer/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-planetarycomputer-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-planetarycomputer_1.0.0/sdk/planetarycomputer/arm-planetarycomputer/) |\n| Resource Management - Playwright | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-playwright/v/1.0.0)<br>npm [1.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-playwright/v/1.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-playwright_1.0.0/sdk/playwright/arm-playwright/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-playwright_1.1.0-beta.1/sdk/playwright/arm-playwright/) |\n| Resource Management - Policy | npm [7.0.0](https://www.npmjs.com/package/@azure/arm-policy/v/7.0.0) | [docs](/javascript/api/overview/azure/arm-policy-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/policy/arm-policy) |\n| Resource Management - Policy Insights | npm [6.0.0](https://www.npmjs.com/package/@azure/arm-policyinsights/v/6.0.0) | [docs](/javascript/api/overview/azure/arm-policyinsights-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/policyinsights/arm-policyinsights) |\n| Resource Management - Portal | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-portal/v/1.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-portal-readme) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-portal_1.0.0-beta.5/sdk/portal/arm-portal/) |\n| Resource Management - Portalservicescopilot | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-portalservicescopilot/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-portalservicescopilot-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-portalservicescopilot_1.0.0-beta.1/sdk/portalservices/arm-portalservicescopilot/) |\n| Resource Management - PostgreSQL | npm [6.1.0](https://www.npmjs.com/package/@azure/arm-postgresql/v/6.1.0) | [docs](/javascript/api/overview/azure/arm-postgresql-readme) | GitHub [6.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/postgresql/arm-postgresql) |\n| Resource Management - Postgresql | npm [9.0.0](https://www.npmjs.com/package/@azure/arm-postgresql-flexible/v/9.0.0)<br>npm [10.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-postgresql-flexible/v/10.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-postgresql-flexible-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-postgresql-flexible_9.0.0/sdk/postgresql/arm-postgresql-flexible/)<br>GitHub [10.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-postgresql-flexible_10.0.0-beta.1/sdk/postgresql/arm-postgresql-flexible/) |\n| Resource Management - Power BI Dedicated | npm [4.0.1](https://www.npmjs.com/package/@azure/arm-powerbidedicated/v/4.0.1) | [docs](/javascript/api/overview/azure/arm-powerbidedicated-readme) | GitHub [4.0.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/powerbidedicated/arm-powerbidedicated) |\n| Resource Management - Power BI Embedded | npm [2.0.2](https://www.npmjs.com/package/@azure/arm-powerbiembedded/v/2.0.2) | [docs](/javascript/api/overview/azure/arm-powerbiembedded-readme) | GitHub [2.0.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/powerbiembedded/arm-powerbiembedded) |\n| Resource Management - Previewalertrule | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-previewalertrule/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-previewalertrule-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-previewalertrule_1.0.0-beta.1/sdk/previewalertrule/arm-previewalertrule/) |\n| Resource Management - Private DNS | npm [3.3.0](https://www.npmjs.com/package/@azure/arm-privatedns/v/3.3.0) | [docs](/javascript/api/overview/azure/arm-privatedns-readme) | GitHub [3.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/privatedns/arm-privatedns) |\n| Resource Management - Prometheusrulegroups | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-prometheusrulegroups/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-prometheusrulegroups-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-prometheusrulegroups_1.0.0-beta.1/sdk/prometheusrulegroups/arm-prometheusrulegroups/) |\n| Resource Management - Purestorageblock | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-purestorageblock/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-purestorageblock-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-purestorageblock_1.0.0/sdk/purestorageblock/arm-purestorageblock/) |\n| Resource Management - Purview | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-purview/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-purview-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-purview_1.1.0/sdk/purview/arm-purview/) |\n| Resource Management - Quantum | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-quantum/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-quantum-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-quantum_1.0.0-beta.2/sdk/quantum/arm-quantum/) |\n| Resource Management - Qumulo | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-qumulo/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-qumulo-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-qumulo_2.0.0/sdk/liftrqumulo/arm-qumulo/) |\n| Resource Management - Quota | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-quota/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-quota-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-quota_2.0.0/sdk/quota/arm-quota/) |\n| Resource Management - Recovery Services | npm [7.0.0](https://www.npmjs.com/package/@azure/arm-recoveryservices/v/7.0.0) | [docs](/javascript/api/overview/azure/arm-recoveryservices-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/recoveryservices/arm-recoveryservices) |\n| Resource Management - Recovery Services Backup | npm [13.2.0](https://www.npmjs.com/package/@azure/arm-recoveryservicesbackup/v/13.2.0)<br>npm [14.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-recoveryservicesbackup/v/14.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-recoveryservicesbackup-readme) | GitHub [13.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/recoveryservicesbackup/arm-recoveryservicesbackup) |\n| Resource Management - Recovery Services Data Replication | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-recoveryservicesdatareplication/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-recoveryservicesdatareplication-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-recoveryservicesdatareplication_1.0.0/sdk/recoveryservicesdatareplication/arm-recoveryservicesdatareplication/) |\n| Resource Management - Recovery Services Site Recovery | npm [5.3.0](https://www.npmjs.com/package/@azure/arm-recoveryservices-siterecovery/v/5.3.0)<br>npm [6.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-recoveryservices-siterecovery/v/6.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-recoveryservices-siterecovery-readme) | GitHub [5.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/recoveryservicessiterecovery/arm-recoveryservices-siterecovery) |\n| Resource Management - Red Hat OpenShift | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-redhatopenshift/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-redhatopenshift-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-redhatopenshift_1.0.0-beta.1/sdk/redhatopenshift/arm-redhatopenshift/) |\n| Resource Management - Redis | npm [8.2.0](https://www.npmjs.com/package/@azure/arm-rediscache/v/8.2.0) | [docs](/javascript/api/overview/azure/arm-rediscache-readme) | GitHub [8.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/redis/arm-rediscache) |\n| Resource Management - Redis Enterprise Cache | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-redisenterprisecache/v/4.0.0) | [docs](/javascript/api/overview/azure/arm-redisenterprisecache-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-redisenterprisecache_4.0.0/sdk/redisenterprise/arm-redisenterprisecache/) |\n| Resource Management - Relationships | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-relationships/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-relationships-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-relationships_1.0.0-beta.1/sdk/relationships/arm-relationships/) |\n| Resource Management - Relay | npm [3.1.1](https://www.npmjs.com/package/@azure/arm-relay/v/3.1.1) | [docs](/javascript/api/overview/azure/arm-relay-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/relay/arm-relay) |\n| Resource Management - Reservations | npm [9.0.0](https://www.npmjs.com/package/@azure/arm-reservations/v/9.0.0) | [docs](/javascript/api/overview/azure/arm-reservations-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/reservations/arm-reservations) |\n| Resource Management - Resource Connector | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-resourceconnector/v/1.0.0)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-resourceconnector/v/2.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-resourceconnector-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourceconnector_1.0.0/sdk/resourceconnector/arm-resourceconnector/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourceconnector_2.0.0-beta.1/sdk/resourceconnector/arm-resourceconnector/) |\n| Resource Management - Resource Graph | npm [4.2.1](https://www.npmjs.com/package/@azure/arm-resourcegraph/v/4.2.1)<br>npm [5.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-resourcegraph/v/5.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-resourcegraph-readme) | GitHub [4.2.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/resourcegraph/arm-resourcegraph) |\n| Resource Management - Resource Health | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-resourcehealth/v/4.0.0)<br>npm [4.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-resourcehealth/v/4.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-resourcehealth-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/resourcehealth/arm-resourcehealth) |\n| Resource Management - Resource Mover | npm [2.2.0](https://www.npmjs.com/package/@azure/arm-resourcemover/v/2.2.0) | [docs](/javascript/api/overview/azure/arm-resourcemover-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourcemover_2.2.0/sdk/resourcemover/arm-resourcemover/) |\n| Resource Management - Resources | npm [7.0.0](https://www.npmjs.com/package/@azure/arm-resources/v/7.0.0) | [docs](/javascript/api/overview/azure/arm-resources-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/resources/arm-resources) |\n| Resource Management - Resources Deployments | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-resourcesdeployments/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-resourcesdeployments-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourcesdeployments_1.0.0-beta.1/sdk/resources/arm-resourcesdeployments/) |\n| Resource Management - Resources Subscriptions | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-resources-subscriptions/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-resources-subscriptions-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resources-subscriptions_2.1.0/sdk/resources-subscriptions/arm-resources-subscriptions/) |\n| Resource Management - Resourcesbicep | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-resourcesbicep/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-resourcesbicep-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourcesbicep_1.0.0-beta.1/sdk/resources/arm-resourcesbicep/) |\n| Resource Management - Scvmm | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-scvmm/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-scvmm-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-scvmm_1.0.0/sdk/scvmm/arm-scvmm/) |\n| Resource Management - Security | npm [5.0.0](https://www.npmjs.com/package/@azure/arm-security/v/5.0.0)<br>npm [6.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-security/v/6.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-security-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/security/arm-security) |\n| Resource Management - Security DevOps | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-securitydevops/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-securitydevops-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-securitydevops_1.0.0-beta.2/sdk/securitydevops/arm-securitydevops/) |\n| Resource Management - Security Insights | npm [1.0.0-beta.6](https://www.npmjs.com/package/@azure/arm-securityinsight/v/1.0.0-beta.6) | [docs](/javascript/api/overview/azure/arm-securityinsight-readme) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-securityinsight_1.0.0-beta.6/sdk/securityinsight/arm-securityinsight/) |\n| Resource Management - Self Help | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-selfhelp/v/1.0.0)<br>npm [2.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-selfhelp/v/2.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-selfhelp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-selfhelp_1.0.0/sdk/selfhelp/arm-selfhelp/)<br>GitHub [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-selfhelp_2.0.0-beta.5/sdk/selfhelp/arm-selfhelp/) |\n| Resource Management - Serial Console | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-serialconsole/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-serialconsole-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/serialconsole/arm-serialconsole) |\n| Resource Management - Service Bus | npm [6.1.0](https://www.npmjs.com/package/@azure/arm-servicebus/v/6.1.0)<br>npm [6.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-servicebus/v/6.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-servicebus-readme) | GitHub [6.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/servicebus/arm-servicebus) |\n| Resource Management - Service Fabric | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/arm-servicefabric/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/servicefabric/arm-servicefabric-rest) |\n| Resource Management - Service Fabric | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-servicefabric/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-servicefabric-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/servicefabric/arm-servicefabric) |\n| Resource Management - Service Fabric Managed Clusters | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-servicefabricmanagedclusters/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-servicefabricmanagedclusters-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicefabricmanagedclusters_1.0.0/sdk/servicefabricmanagedclusters/arm-servicefabricmanagedclusters/) |\n| Resource Management - Service Fabric Mesh | npm [2.2.1](https://www.npmjs.com/package/@azure/arm-servicefabricmesh/v/2.2.1)<br>npm [3.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-servicefabricmesh/v/3.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-servicefabricmesh-readme) | GitHub [2.2.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/servicefabricmesh/arm-servicefabricmesh) |\n| Resource Management - Service Linker | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-servicelinker/v/2.1.0)<br>npm [2.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-servicelinker/v/2.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-servicelinker-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicelinker_2.1.0/sdk/servicelinker/arm-servicelinker/)<br>GitHub [2.2.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicelinker_2.2.0-beta.1/sdk/servicelinker/arm-servicelinker/) |\n| Resource Management - Service Map | npm [2.3.1](https://www.npmjs.com/package/@azure/arm-servicemap/v/2.3.1)<br>npm [3.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-servicemap/v/3.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-servicemap-readme) | GitHub [2.3.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/service-map/arm-servicemap) |\n| Resource Management - Service Networking | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-servicenetworking/v/2.0.0)<br>npm [2.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-servicenetworking/v/2.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-servicenetworking-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicenetworking_2.0.0/sdk/servicenetworking/arm-servicenetworking/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicenetworking_2.1.0-beta.1/sdk/servicenetworking/arm-servicenetworking/) |\n| Resource Management - Servicegroups | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-servicegroups/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-servicegroups-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicegroups_1.0.0-beta.1/sdk/servicegroups/arm-servicegroups/) |\n| Resource Management - SignalR | npm [5.2.0](https://www.npmjs.com/package/@azure/arm-signalr/v/5.2.0)<br>npm [6.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-signalr/v/6.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-signalr-readme) | GitHub [5.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/signalr/arm-signalr) |\n| Resource Management - Sitemanager | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-sitemanager/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-sitemanager-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-sitemanager_1.0.0/sdk/sitemanager/arm-sitemanager/) |\n| Resource Management - Sphere | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-sphere/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-sphere-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-sphere_1.0.0/sdk/sphere/arm-sphere/) |\n| Resource Management - Spring App Discovery | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-springappdiscovery/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-springappdiscovery-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-springappdiscovery_1.0.0-beta.1/sdk/springappdiscovery/arm-springappdiscovery/) |\n| Resource Management - SQL | npm [10.0.0](https://www.npmjs.com/package/@azure/arm-sql/v/10.0.0)<br>npm [11.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-sql/v/11.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-sql-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/sql/arm-sql) |\n| Resource Management - SQL Virtual Machine | npm [4.1.1](https://www.npmjs.com/package/@azure/arm-sqlvirtualmachine/v/4.1.1)<br>npm [5.0.0-beta.8](https://www.npmjs.com/package/@azure/arm-sqlvirtualmachine/v/5.0.0-beta.8) | [docs](/javascript/api/overview/azure/arm-sqlvirtualmachine-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/sqlvirtualmachine/arm-sqlvirtualmachine) |\n| Resource Management - Standby Pool | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-standbypool/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-standbypool-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-standbypool_2.0.0/sdk/standbypool/arm-standbypool/) |\n| Resource Management - Storage | npm [19.1.0](https://www.npmjs.com/package/@azure/arm-storage/v/19.1.0) | [docs](/javascript/api/overview/azure/arm-storage-readme) | GitHub [19.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storage/arm-storage) |\n| Resource Management - Storage Actions | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-storageactions/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-storageactions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-storageactions_1.0.0/sdk/storageactions/arm-storageactions/) |\n| Resource Management - Storage Cache | npm [8.2.0](https://www.npmjs.com/package/@azure/arm-storagecache/v/8.2.0) | [docs](/javascript/api/overview/azure/arm-storagecache-readme) | GitHub [8.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storagecache/arm-storagecache) |\n| Resource Management - Storage Mover | npm [3.0.1](https://www.npmjs.com/package/@azure/arm-storagemover/v/3.0.1) | [docs](/javascript/api/overview/azure/arm-storagemover-readme) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-storagemover_3.0.1/sdk/storagemover/arm-storagemover/) |\n| Resource Management - Storage Sync | npm [9.1.0](https://www.npmjs.com/package/@azure/arm-storagesync/v/9.1.0) | [docs](/javascript/api/overview/azure/arm-storagesync-readme) | GitHub [9.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storagesync/arm-storagesync) |\n| Resource Management - Storagediscovery | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-storagediscovery/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-storagediscovery-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-storagediscovery_1.0.0/sdk/storagediscovery/arm-storagediscovery/) |\n| Resource Management - Stream Analytics | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-streamanalytics/v/4.1.0)<br>npm [5.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-streamanalytics/v/5.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-streamanalytics-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/streamanalytics/arm-streamanalytics) |\n| Resource Management - Subscriptions | npm [6.0.0](https://www.npmjs.com/package/@azure/arm-subscriptions/v/6.0.0) | [docs](/javascript/api/overview/azure/arm-subscriptions-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/subscription/arm-subscriptions) |\n| Resource Management - Support | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-support/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-support-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/support/arm-support) |\n| Resource Management - Synapse | npm [8.0.0](https://www.npmjs.com/package/@azure/arm-synapse/v/8.0.0)<br>npm [9.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-synapse/v/9.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-synapse-readme) | GitHub [8.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/synapse/arm-synapse) |\n| Resource Management - Tenantactivitylogalerts | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-tenantactivitylogalerts/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-tenantactivitylogalerts-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-tenantactivitylogalerts_1.0.0-beta.1/sdk/tenantactivitylogalerts/arm-tenantactivitylogalerts/) |\n| Resource Management - Terraform | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-terraform/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-terraform-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-terraform_1.0.0-beta.1/sdk/terraform/arm-terraform/) |\n| Resource Management - Time Series Insights | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-timeseriesinsights/v/2.0.0)<br>npm [2.1.0-beta.2](https://www.npmjs.com/package/@azure/arm-timeseriesinsights/v/2.1.0-beta.2) | [docs](/javascript/api/overview/azure/arm-timeseriesinsights-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/timeseriesinsights/arm-timeseriesinsights) |\n| Resource Management - Traffic Manager | npm [6.1.0](https://www.npmjs.com/package/@azure/arm-trafficmanager/v/6.1.0) | [docs](/javascript/api/overview/azure/arm-trafficmanager-readme) | GitHub [6.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/trafficmanager/arm-trafficmanager) |\n| Resource Management - Trusted Signing | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-trustedsigning/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-trustedsigning-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-trustedsigning_1.0.0-beta.2/sdk/trustedsigning/arm-trustedsigning/) |\n| Resource Management - Visual Studio | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-visualstudio/v/3.0.0)<br>npm [4.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-visualstudio/v/4.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-visualstudio-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/visualstudio/arm-visualstudio) |\n| Resource Management - VMware Solution by CloudSimple | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-vmwarecloudsimple/v/3.1.0) | [docs](/javascript/api/overview/azure/arm-vmwarecloudsimple-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/vmwarecloudsimple/arm-vmwarecloudsimple) |\n| Resource Management - Voice Services | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-voiceservices/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-voiceservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-voiceservices_1.0.0/sdk/voiceservices/arm-voiceservices/) |\n| Resource Management - Web PubSub | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-webpubsub/v/1.2.0)<br>npm [2.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-webpubsub/v/2.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-webpubsub-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-webpubsub_1.2.0/sdk/web-pubsub/arm-webpubsub/)<br>GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-webpubsub_2.0.0-beta.2/sdk/web-pubsub/arm-webpubsub/) |\n| Resource Management - Weights & Biases | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-weightsandbiases/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-weightsandbiases_1.0.0-beta.1/sdk/liftrweightsandbiases/arm-weightsandbiases/) |\n| Resource Management - Workloadorchestration | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-workloadorchestration/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-workloadorchestration-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-workloadorchestration_1.0.0-beta.1/sdk/workloadorchestration/arm-workloadorchestration/) |\n| Resource Management - Workloads | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-workloads/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-workloads-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-workloads_1.0.0/sdk/workloads/arm-workloads/) |\n| Resource Management - Workloads SAP Virtual Instance | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-workloadssapvirtualinstance/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-workloadssapvirtualinstance-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-workloadssapvirtualinstance_1.0.0/sdk/workloads/arm-workloadssapvirtualinstance/) |\n| Resource Management - Workspaces | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-workspaces/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-workspaces-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/machinelearning/arm-workspaces) |\n| Resource Management - Template Specs | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-templatespecs/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-templatespecs-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-templatespecs_2.1.0/sdk/templatespecs/arm-templatespecs/) |\n| @autorest/openapi-to-typespec | npm [0.11.14](https://www.npmjs.com/package/@autorest/openapi-to-typespec/v/0.11.14) |  |  |\n| @azure-rest/core-client-lro | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/core-client-lro/v/1.0.0-beta.1) |  |  |\n| @azure/arm-template | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-template/v/1.0.0-beta.2) |  |  |\n| @azure/core-crypto | npm [1.0.0-alpha.20210122.1](https://www.npmjs.com/package/@azure/core-crypto/v/1.0.0-alpha.20210122.1) |  |  |\n| @azure/fabric-react-jsonschema-form | npm [0.1.5](https://www.npmjs.com/package/@azure/fabric-react-jsonschema-form/v/0.1.5) |  |  |\n| @azure/functions-opentelemetry-instrumentation | npm [0.3.0](https://www.npmjs.com/package/@azure/functions-opentelemetry-instrumentation/v/0.3.0) |  |  |\n| @microsoft.azure/autorest-core | npm [2.0.4432](https://www.npmjs.com/package/@microsoft.azure/autorest-core/v/2.0.4432) |  |  |\n| @microsoft.azure/autorest.testserver | npm [3.3.51](https://www.npmjs.com/package/@microsoft.azure/autorest.testserver/v/3.3.51) |  |  |\n| @microsoft.azure/openapi-validator | npm [2.2.4](https://www.npmjs.com/package/@microsoft.azure/openapi-validator/v/2.2.4) |  |  |\n| @microsoft.azure/openapi-validator-rulesets | npm [2.2.6](https://www.npmjs.com/package/@microsoft.azure/openapi-validator-rulesets/v/2.2.6) |  |  |\n| @typespec/best-practices | npm [0.46.0-dev.0](https://www.npmjs.com/package/@typespec/best-practices/v/0.46.0-dev.0) |  |  |\n| @typespec/bundler | npm [0.5.2](https://www.npmjs.com/package/@typespec/bundler/v/0.5.2) |  |  |\n| @typespec/http-server-javascript | npm [0.58.0-alpha.9](https://www.npmjs.com/package/@typespec/http-server-javascript/v/0.58.0-alpha.9) |  |  |\n| @typespec/playground | npm [0.14.0](https://www.npmjs.com/package/@typespec/playground/v/0.14.0) |  |  |\n| @typespec/tspd | npm [0.74.1](https://www.npmjs.com/package/@typespec/tspd/v/0.74.1) |  |  |\n| @typespec/xml | npm [0.81.0](https://www.npmjs.com/package/@typespec/xml/v/0.81.0) |  |  |\n| AI Chat Protocol | npm [1.0.0-beta.20240814.1](https://www.npmjs.com/package/@microsoft/ai-chat-protocol/v/1.0.0-beta.20240814.1) |  |  |\n| App Configuration Provider | npm [3.0.0-preview](https://www.npmjs.com/package/@azure/app-configuration-importer/v/3.0.0-preview) |  |  |\n| App Configuration Provider | npm [2.4.2](https://www.npmjs.com/package/@azure/app-configuration-provider/v/2.4.2) |  |  |\n| App Configuration Provider File Source | npm [3.0.0-preview](https://www.npmjs.com/package/@azure/app-configuration-importer-file-source/v/3.0.0-preview) |  |  |\n| Azure MCP | npm [2.0.2](https://www.npmjs.com/package/@azure/mcp/v/2.0.2)<br>npm [3.0.0-beta.10](https://www.npmjs.com/package/@azure/mcp/v/3.0.0-beta.10) |  |  |\n| Azure MCP | npm [2.0.2](https://www.npmjs.com/package/@azure/mcp-darwin-arm64/v/2.0.2)<br>npm [3.0.0-beta.10](https://www.npmjs.com/package/@azure/mcp-darwin-arm64/v/3.0.0-beta.10) |  |  |\n| Azure MCP | npm [2.0.2](https://www.npmjs.com/package/@azure/mcp-darwin-x64/v/2.0.2)<br>npm [3.0.0-beta.10](https://www.npmjs.com/package/@azure/mcp-darwin-x64/v/3.0.0-beta.10) |  |  |\n| Azure MCP | npm [2.0.2](https://www.npmjs.com/package/@azure/mcp-linux-arm64/v/2.0.2)<br>npm [3.0.0-beta.10](https://www.npmjs.com/package/@azure/mcp-linux-arm64/v/3.0.0-beta.10) |  |  |\n| Azure MCP | npm [2.0.2](https://www.npmjs.com/package/@azure/mcp-linux-x64/v/2.0.2)<br>npm [3.0.0-beta.10](https://www.npmjs.com/package/@azure/mcp-linux-x64/v/3.0.0-beta.10) |  |  |\n| Azure MCP | npm [2.0.2](https://www.npmjs.com/package/@azure/mcp-win32-arm64/v/2.0.2)<br>npm [3.0.0-beta.10](https://www.npmjs.com/package/@azure/mcp-win32-arm64/v/3.0.0-beta.10) |  |  |\n| Azure MCP | npm [2.0.2](https://www.npmjs.com/package/@azure/mcp-win32-x64/v/2.0.2)<br>npm [3.0.0-beta.10](https://www.npmjs.com/package/@azure/mcp-win32-x64/v/3.0.0-beta.10) |  |  |\n| Azure MCP Native | npm [0.5.13](https://www.npmjs.com/package/@azure/mcp-native/v/0.5.13) |  |  |\n| Azure MCP Native | npm [0.5.13](https://www.npmjs.com/package/@azure/mcp-native-darwin-arm64/v/0.5.13) |  |  |\n| Azure MCP Native | npm [0.5.13](https://www.npmjs.com/package/@azure/mcp-native-darwin-x64/v/0.5.13) |  |  |\n| Azure MCP Native | npm [0.5.13](https://www.npmjs.com/package/@azure/mcp-native-linux-arm64/v/0.5.13) |  |  |\n| Azure MCP Native | npm [0.5.13](https://www.npmjs.com/package/@azure/mcp-native-linux-x64/v/0.5.13) |  |  |\n| Azure MCP Native | npm [0.5.13](https://www.npmjs.com/package/@azure/mcp-native-win32-arm64/v/0.5.13) |  |  |\n| Azure MCP Native | npm [0.5.13](https://www.npmjs.com/package/@azure/mcp-native-win32-x64/v/0.5.13) |  |  |\n| azure-common | npm [0.9.27](https://www.npmjs.com/package/azure-common/v/0.9.27) |  |  |\n| Bicep Deploy Common | npm [0.0.6](https://www.npmjs.com/package/@azure/bicep-deploy-common/v/0.0.6) |  |  |\n| Face UI | npm [1.4.8](https://www.npmjs.com/package/@azure/ai-vision-face-ui/v/1.4.8) |  |  |\n| Functions Extensions Base | npm [0.3.0](https://www.npmjs.com/package/@azure/functions-extensions-base/v/0.3.0) |  |  |\n| Functions Extensions Service Bus | npm [0.5.1](https://www.npmjs.com/package/@azure/functions-extensions-servicebus/v/0.5.1) |  |  |\n| MCP Server TypeSpec | npm [0.0.0-104](https://www.npmjs.com/package/mcp-server-typespec/v/0.0.0-104) |  |  |\n| MCP Template | npm [0.0.12-alpha.6251995](https://www.npmjs.com/package/@azure/mcp-template/v/0.0.12-alpha.6251995) |  |  |\n| MCP Template | npm [0.0.12-alpha.6251995](https://www.npmjs.com/package/@azure/mcp-template-darwin-arm64/v/0.0.12-alpha.6251995) |  |  |\n| MCP Template | npm [0.0.12-alpha.6251995](https://www.npmjs.com/package/@azure/mcp-template-darwin-x64/v/0.0.12-alpha.6251995) |  |  |\n| MCP Template | npm [0.0.12-alpha.6251995](https://www.npmjs.com/package/@azure/mcp-template-linux-arm64/v/0.0.12-alpha.6251995) |  |  |\n| MCP Template | npm [0.0.12-alpha.6251995](https://www.npmjs.com/package/@azure/mcp-template-linux-x64/v/0.0.12-alpha.6251995) |  |  |\n| MCP Template | npm [0.0.12-alpha.6251995](https://www.npmjs.com/package/@azure/mcp-template-win32-arm64/v/0.0.12-alpha.6251995) |  |  |\n| MCP Template | npm [0.0.12-alpha.6251995](https://www.npmjs.com/package/@azure/mcp-template-win32-x64/v/0.0.12-alpha.6251995) |  |  |\n| OpenAPI Validator Core | npm [1.0.7](https://www.npmjs.com/package/@microsoft.azure/openapi-validator-core/v/1.0.7) |  |  |\n| tmlanguage-generator | npm [0.6.8](https://www.npmjs.com/package/tmlanguage-generator/v/0.6.8) |  |  |\n| TypeSpec Asset Emitter | npm [0.79.1](https://www.npmjs.com/package/@typespec/asset-emitter/v/0.79.1) |  |  |\n| TypeSpec Emitter Framework | npm [0.17.0](https://www.npmjs.com/package/@typespec/emitter-framework/v/0.17.0) |  |  |\n| TypeSpec Events | npm [0.81.0](https://www.npmjs.com/package/@typespec/events/v/0.81.0) |  |  |\n| TypeSpec HTTP Canonicalization | npm [0.16.1](https://www.npmjs.com/package/@typespec/http-canonicalization/v/0.16.1) |  |  |\n| TypeSpec HTTP Client | npm [0.15.1](https://www.npmjs.com/package/@typespec/http-client/v/0.15.1) |  |  |\n| TypeSpec HTTP Client Java | npm [0.8.1](https://www.npmjs.com/package/@typespec/http-client-java/v/0.8.1) |  |  |\n| TypeSpec HTTP Client JavaScript | npm [0.14.1](https://www.npmjs.com/package/@typespec/http-client-js/v/0.14.1) |  |  |\n| TypeSpec HTTP Client Python | npm [0.29.0](https://www.npmjs.com/package/@typespec/http-client-python/v/0.29.0) |  |  |\n| TypeSpec HTTP Specs | npm [0.1.0-alpha.36](https://www.npmjs.com/package/@typespec/http-specs/v/0.1.0-alpha.36) |  |  |\n| TypeSpec MCP | npm [0.0.0-104](https://www.npmjs.com/package/typespec-mcp/v/0.0.0-104) |  |  |\n| TypeSpec MCP HTTP Server C# | npm [0.0.0-0](https://www.npmjs.com/package/typespec-mcp-http-server-csharp/v/0.0.0-0) |  |  |\n| TypeSpec MCP Server C# | npm [0.0.0-104](https://www.npmjs.com/package/typespec-mcp-server-csharp/v/0.0.0-104) |  |  |\n| TypeSpec MCP Server JS | npm [0.0.0-104](https://www.npmjs.com/package/typespec-mcp-server-js/v/0.0.0-104) |  |  |\n| TypeSpec Mutator Framework | npm [0.16.1](https://www.npmjs.com/package/@typespec/mutator-framework/v/0.16.1) |  |  |\n| TypeSpec SSE | npm [0.81.0](https://www.npmjs.com/package/@typespec/sse/v/0.81.0) |  |  |\n| TypeSpec Streams | npm [0.81.0](https://www.npmjs.com/package/@typespec/streams/v/0.81.0) |  |  |\n| Unknown Display Name | npm [0.1.0-beta.1](https://www.npmjs.com/package/@azure-tools/dataflow-dev/v/0.1.0-beta.1) |  |  |\n| Unknown Display Name | npm [0.1.0-preview](https://www.npmjs.com/package/@azure/azure-connectors/v/0.1.0-preview) |  |  |\n| Unknown Display Name | npm [0.1.1-preview](https://www.npmjs.com/package/@azure/connectors/v/0.1.1-preview) |  |  |\n| Unknown Display Name | npm [0.3.0](https://www.npmjs.com/package/@azure/functions-extensions-blob/v/0.3.0) |  |  |\n| Unknown Display Name | npm [0.1.1-preview](https://www.npmjs.com/package/@azure/functions-extensions-express/v/0.1.1-preview) |  |  |\n| Web PubSub Tunnel Tool | npm [1.0.0-beta.12](https://www.npmjs.com/package/@azure/web-pubsub-tunnel-tool/v/1.0.0-beta.12) |  |  |\n| @azure/media-stream-library | npm [1.1.0-beta.4](https://www.npmjs.com/package/@azure/media-stream-library/v/1.1.0-beta.4) |  |  |\n| @azure/video-analyzer-player | npm [1.0.4](https://www.npmjs.com/package/@azure/video-analyzer-player/v/1.0.4)<br>npm [1.1.0-beta.8](https://www.npmjs.com/package/@azure/video-analyzer-player/v/1.1.0-beta.8) |  |  |\n| @azure/video-analyzer-widgets | npm [2.0.6](https://www.npmjs.com/package/@azure/video-analyzer-widgets/v/2.0.6) |  |  |\n| @azure/video-indexer-widgets | npm [1.0.5](https://www.npmjs.com/package/@azure/video-indexer-widgets/v/1.0.5) |  |  |\n| Auto Suggest | npm [2.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-autosuggest/v/2.0.1) |  |  |\n| AutoRest | npm [3.8.0](https://www.npmjs.com/package/autorest/v/3.8.0) |  |  |\n| Azure Functions | npm [4.14.0](https://www.npmjs.com/package/@azure/functions/v/4.14.0) |  | GitHub [4.14.0](https://github.com/Azure/azure-functions-nodejs-library) |\n| Code Model | npm [3.0.137](https://www.npmjs.com/package/@azure/autorest.codemodel-v3/v/3.0.137) |  |  |\n| Communication Calling | npm [1.43.1](https://www.npmjs.com/package/@azure/communication-calling/v/1.43.1) |  | GitHub [1.43.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/communication) |\n| Communication Signaling | npm [1.0.0-beta.34](https://www.npmjs.com/package/@azure/communication-signaling/v/1.0.0-beta.34) |  | GitHub [1.0.0-beta.34](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/communication) |\n| Computer Vision | npm [8.2.0](https://www.npmjs.com/package/@azure/cognitiveservices-computervision/v/8.2.0) |  |  |\n| Content Safety | npm [5.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-contentmoderator/v/5.0.1) |  |  |\n| Core - Client - AMQP Common | npm [1.0.0-preview.17](https://www.npmjs.com/package/@azure/amqp-common/v/1.0.0-preview.17) |  | GitHub [1.0.0-preview.17](https://github.com/Azure/azure-sdk-for-js/tree/@azure/amqp-common_1.0.0-preview.17/sdk/core/amqp-common/) |\n| Core - Client - Asynciterator Polyfill | npm [1.0.2](https://www.npmjs.com/package/@azure/core-asynciterator-polyfill/v/1.0.2) |  | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-asynciterator-polyfill_1.0.2/sdk/core/core-asynciterator-polyfill/) |\n| Core - Client - Https | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/core-https/v/1.0.0-beta.1) |  |  |\n| Cosmos DB Query Editor | npm [1.0.0-beta.9](https://www.npmjs.com/package/@azure/cosmos-query-editor-react/v/1.0.0-beta.9) |  |  |\n| Custom Image Search | npm [2.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-customimagesearch/v/2.0.1) |  |  |\n| Custom Search | npm [3.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-customsearch/v/3.0.1) |  |  |\n| Custom Search | npm [2.0.0](https://www.npmjs.com/package/azure-cognitiveservices-customsearch/v/2.0.0) |  |  |\n| Custom Vision Prediction | npm [5.1.2](https://www.npmjs.com/package/@azure/cognitiveservices-customvision-prediction/v/5.1.2) |  |  |\n| Custom Vision Training | npm [5.2.0](https://www.npmjs.com/package/@azure/cognitiveservices-customvision-training/v/5.2.0) |  |  |\n| Device Provisioning Services | npm [1.11.2](https://www.npmjs.com/package/azure-iot-provisioning-service/v/1.11.2) |  | GitHub [1.11.2](https://github.com/Azure/azure-iot-sdk-node/tree/master/provisioning/transport/mqtt) |\n| Durable Functions | npm [3.0.0](https://www.npmjs.com/package/durable-functions/v/3.0.0) |  | GitHub [3.0.0](https://github.com/Azure/azure-functions-durable-js) |\n| Entity Search | npm [3.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-entitysearch/v/3.0.1) |  |  |\n| Face | npm [5.0.0](https://www.npmjs.com/package/@azure/cognitiveservices-face/v/5.0.0) |  |  |\n| Image Search | npm [3.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-imagesearch/v/3.0.1) |  |  |\n| IoT AMQP Base | npm [2.5.3](https://www.npmjs.com/package/azure-iot-amqp-base/v/2.5.3) |  | GitHub [2.5.3](https://github.com/Azure/azure-iot-sdk-node) |\n| IoT Http Base | npm [1.12.3](https://www.npmjs.com/package/azure-iot-http-base/v/1.12.3) |  | GitHub [1.12.3](https://github.com/Azure/azure-iot-sdk-node) |\n| IoT Hub | npm [1.16.6](https://www.npmjs.com/package/azure-iothub/v/1.16.6) |  | GitHub [1.16.6](https://github.com/Azure/azure-iot-sdk-node) |\n| IoT Hub - IoT Common | npm [1.13.3](https://www.npmjs.com/package/azure-iot-common/v/1.13.3) |  | GitHub [1.13.3](https://github.com/Azure/azure-iot-sdk-node/tree/master/common) |\n| IoT Hub - IoT Device | npm [1.18.4](https://www.npmjs.com/package/azure-iot-device/v/1.18.4) |  | GitHub [1.18.4](https://github.com/Azure/azure-iot-sdk-node/tree/master/device) |\n| IoT Hub Device Provisioning | npm [1.9.1](https://www.npmjs.com/package/azure-iot-provisioning-device/v/1.9.1) |  | GitHub [1.9.1](https://github.com/Azure/azure-iot-sdk-node/tree/master/provisioning/device) |\n| IoT Hub Device Provisioning - AMQP | npm [1.9.1](https://www.npmjs.com/package/azure-iot-provisioning-device-amqp/v/1.9.1) |  | GitHub [1.9.1](https://github.com/Azure/azure-iot-sdk-node/tree/master/provisioning/transport/amqp) |\n| IoT Hub Device Provisioning - Http | npm [1.9.1](https://www.npmjs.com/package/azure-iot-provisioning-device-http/v/1.9.1) |  | GitHub [1.9.1](https://github.com/Azure/azure-iot-sdk-node/tree/master/provisioning/transport/http) |\n| IoT Hub Device Provisioning - MQTT | npm [1.8.1](https://www.npmjs.com/package/azure-iot-provisioning-device-mqtt/v/1.8.1) |  | GitHub [1.8.1](https://github.com/Azure/azure-iot-sdk-node/tree/master/provisioning/device) |\n| IoT MQTT Base | npm [1.13.3](https://www.npmjs.com/package/azure-iot-mqtt-base/v/1.13.3) |  | GitHub [1.13.3](https://github.com/Azure/azure-iot-sdk-node) |\n| IoT Plug and Play - IoT Device AMQP | npm [1.14.4](https://www.npmjs.com/package/azure-iot-device-amqp/v/1.14.4) |  | GitHub [1.14.4](https://github.com/Azure/azure-iot-sdk-node/tree/master/device/transport/amqp) |\n| IoT Plug and Play - IoT Device Http | npm [1.14.4](https://www.npmjs.com/package/azure-iot-device-http/v/1.14.4) |  | GitHub [1.14.4](https://github.com/Azure/azure-iot-sdk-node/tree/master/device/transport/http) |\n| IoT Plug and Play - IoT Device MQTT | npm [1.16.4](https://www.npmjs.com/package/azure-iot-device-mqtt/v/1.16.4) |  | GitHub [1.16.4](https://github.com/Azure/azure-iot-sdk-node/tree/master/device/transport/mqtt) |\n| IoT Security Symmetric Key | npm [1.8.3](https://www.npmjs.com/package/azure-iot-security-symmetric-key/v/1.8.3) |  | GitHub [1.8.3](https://github.com/Azure/azure-iot-sdk-node/tree/master/security/symmetric) |\n| IoT Security TPM | npm [1.9.3](https://www.npmjs.com/package/azure-iot-security-tpm/v/1.9.3) |  | GitHub [1.9.3](https://github.com/Azure/azure-iot-sdk-node/tree/master/security/tpm) |\n| IoT Security X509 | npm [1.8.3](https://www.npmjs.com/package/azure-iot-security-x509/v/1.8.3) |  | GitHub [1.8.3](https://github.com/Azure/azure-iot-sdk-node/tree/master/security/x509) |\n| Local Search | npm [2.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-localsearch/v/2.0.1) |  |  |\n| Logger JS | npm [1.3.2](https://www.npmjs.com/package/@azure/logger-js/v/1.3.2) |  | GitHub [1.3.2](https://github.com/Azure/logger-js) |\n| LUIS Authoring | npm [4.0.0-preview.3](https://www.npmjs.com/package/@azure/cognitiveservices-luis-authoring/v/4.0.0-preview.3) |  |  |\n| LUIS Runtime | npm [5.0.0](https://www.npmjs.com/package/@azure/cognitiveservices-luis-runtime/v/5.0.0) |  |  |\n| MS REST - Azure Env | npm [2.0.0](https://www.npmjs.com/package/@azure/ms-rest-azure-env/v/2.0.0) |  | GitHub [2.0.0](https://github.com/Azure/ms-rest-azure-env) |\n| MS REST - Azure JS | npm [2.1.0](https://www.npmjs.com/package/@azure/ms-rest-azure-js/v/2.1.0) |  | GitHub [2.1.0](https://github.com/Azure/ms-rest-azure-js) |\n| MS REST - Browser Auth | npm [1.0.2](https://www.npmjs.com/package/@azure/ms-rest-browserauth/v/1.0.2) |  | GitHub [1.0.2](https://github.com/Azure/ms-rest-browserauth) |\n| MS REST - JS | npm [2.7.0](https://www.npmjs.com/package/@azure/ms-rest-js/v/2.7.0) |  | GitHub [2.7.0](https://github.com/Azure/ms-rest-js) |\n| MS REST - Node Auth | npm [3.1.1](https://www.npmjs.com/package/@azure/ms-rest-nodeauth/v/3.1.1) |  | GitHub [3.1.1](https://github.com/Azure/ms-rest-nodeauth) |\n| News Search | npm [3.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-newssearch/v/3.0.1) |  |  |\n| Node Red Contrib Azure IoT Hub Node | npm [0.5.3](https://www.npmjs.com/package/node-red-contrib-azureiothubnode/v/0.5.3) |  |  |\n| Personalizer | npm [2.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-personalizer/v/2.0.1) |  |  |\n| Question Answering | npm [3.2.0](https://www.npmjs.com/package/@azure/cognitiveservices-qnamaker/v/3.2.0) |  |  |\n| Question Answering | npm [1.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-qnamaker-runtime/v/1.0.1) |  |  |\n| Service Fabric | npm [5.0.0](https://www.npmjs.com/package/@azure/servicefabric/v/5.0.0) | [docs](/javascript/api/overview/azure/service-fabric) |  |\n| Speech | npm [1.14.1](https://www.npmjs.com/package/microsoft-cognitiveservices-speech-sdk/v/1.14.1) | [docs](/javascript/api/overview/azure/microsoft-cognitiveservices-speech-sdk-readme) |  |\n| Spell Check | npm [3.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-spellcheck/v/3.0.1) |  |  |\n| Storage - Files Share | npm [10.3.0](https://www.npmjs.com/package/@azure/storage-file/v/10.3.0) |  |  |\n| Translator | npm [1.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-translatortext/v/1.0.1) |  |  |\n| Video Search | npm [3.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-videosearch/v/3.0.1) |  |  |\n| Visual Search | npm [3.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-visualsearch/v/3.0.1) |  |  |\n| Web Apps Framework Detection | npm [0.1.3](https://www.npmjs.com/package/@azure/web-apps-framework-detection/v/0.1.3) |  |  |\n| Web PubSub | npm [0.0.1-security.3](https://www.npmjs.com/package/azure-web-pubsub/v/0.0.1-security.3) |  |  |\n| Web PubSub Socket.IO | npm [1.2.1](https://www.npmjs.com/package/@azure/web-pubsub-socket.io/v/1.2.1) |  |  |\n| Web Search | npm [3.0.1](https://www.npmjs.com/package/@azure/cognitiveservices-websearch/v/3.0.1) |  |  |\n| Web PubSub CloudEvents Handlers for Express | npm [0.0.1-security.3](https://www.npmjs.com/package/azure-web-pubsub-express/v/0.0.1-security.3) |  |  |\n|  | npm [2.5.6](https://www.npmjs.com/package/ms-rest/v/2.5.6) |  |  |\n|  | npm [3.0.2](https://www.npmjs.com/package/ms-rest-azure/v/3.0.2) |  |  |\n| @autorest/adl | npm [0.0.2](https://www.npmjs.com/package/@autorest/adl/v/0.0.2) |  |  |\n| @autorest/cadl | npm [0.3.0](https://www.npmjs.com/package/@autorest/cadl/v/0.3.0) |  |  |\n| @autorest/codemodel | npm [4.20.1](https://www.npmjs.com/package/@autorest/codemodel/v/4.20.1) |  |  |\n| @autorest/common | npm [1.6.1](https://www.npmjs.com/package/@autorest/common/v/1.6.1) |  |  |\n| @autorest/configuration | npm [1.12.3](https://www.npmjs.com/package/@autorest/configuration/v/1.12.3) |  |  |\n| @autorest/csharp | npm [3.0.0-beta.20251203.1](https://www.npmjs.com/package/@autorest/csharp/v/3.0.0-beta.20251203.1) |  |  |\n| @autorest/csharp-v3 | npm [3.0.0-beta.20201217.1](https://www.npmjs.com/package/@autorest/csharp-v3/v/3.0.0-beta.20201217.1) |  |  |\n| @autorest/extension-base | npm [3.6.1](https://www.npmjs.com/package/@autorest/extension-base/v/3.6.1) |  |  |\n| @autorest/fixer | npm [1.2.0](https://www.npmjs.com/package/@autorest/fixer/v/1.2.0) |  |  |\n| @autorest/gotest | npm [4.7.7](https://www.npmjs.com/package/@autorest/gotest/v/4.7.7) |  |  |\n| @autorest/openapi-to-cadl | npm [0.6.0](https://www.npmjs.com/package/@autorest/openapi-to-cadl/v/0.6.0) |  |  |\n| @autorest/schemas | npm [1.3.6](https://www.npmjs.com/package/@autorest/schemas/v/1.3.6) |  |  |\n| @autorest/system-requirements | npm [1.1.1](https://www.npmjs.com/package/@autorest/system-requirements/v/1.1.1) |  |  |\n| @autorest/test-utils | npm [0.6.1](https://www.npmjs.com/package/@autorest/test-utils/v/0.6.1) |  |  |\n| @autorest/testmodeler | npm [2.6.2](https://www.npmjs.com/package/@autorest/testmodeler/v/2.6.2)<br>npm [2.6.4-ci.254802bfc.0](https://www.npmjs.com/package/@autorest/testmodeler/v/2.6.4-ci.254802bfc.0) |  |  |\n| @autorest/typescript | npm [6.0.69](https://www.npmjs.com/package/@autorest/typescript/v/6.0.69) |  |  |\n| @azure/static-web-apps-cli | npm [2.0.9](https://www.npmjs.com/package/@azure/static-web-apps-cli/v/2.0.9) |  |  |\n| @cadl-lang/compiler | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/compiler/v/0.40.0) |  |  |\n| @cadl-lang/eslint-config-cadl | npm [0.5.0](https://www.npmjs.com/package/@cadl-lang/eslint-config-cadl/v/0.5.0) |  |  |\n| @cadl-lang/eslint-plugin | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/eslint-plugin/v/0.40.0) |  |  |\n| @cadl-lang/html-program-viewer | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/html-program-viewer/v/0.40.0) |  |  |\n| @cadl-lang/internal-build-utils | npm [0.3.3](https://www.npmjs.com/package/@cadl-lang/internal-build-utils/v/0.3.3) |  |  |\n| @cadl-lang/library-linter | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/library-linter/v/0.40.0) |  |  |\n| @cadl-lang/lint | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/lint/v/0.40.0) |  |  |\n| @cadl-lang/migrate | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/migrate/v/0.40.0) |  |  |\n| @cadl-lang/openapi | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/openapi/v/0.40.0) |  |  |\n| @cadl-lang/openapi3 | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/openapi3/v/0.40.0) |  |  |\n| @cadl-lang/prettier-plugin-cadl | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/prettier-plugin-cadl/v/0.40.0) |  |  |\n| @cadl-lang/rest | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/rest/v/0.40.0) |  |  |\n| @cadl-lang/versioning | npm [0.40.0](https://www.npmjs.com/package/@cadl-lang/versioning/v/0.40.0) |  |  |\n| adl-vscode | npm [0.6.0](https://www.npmjs.com/package/adl-vscode/v/0.6.0) |  |  |\n| AutoRest - AZ | npm [1.8.0](https://www.npmjs.com/package/@autorest/az/v/1.8.0) |  | GitHub [1.8.0](https://github.com/Azure/autorest.az/tree/1.4.0) |\n| AutoRest - Azure Resource Schema | npm [3.0.109](https://www.npmjs.com/package/@autorest/azureresourceschema/v/3.0.109) |  | GitHub [3.0.109](https://github.com/Azure/autorest.azureresourceschema) |\n| AutoRest - CLI | npm [0.1.889](https://www.npmjs.com/package/@autorest/cli/v/0.1.889) |  | GitHub [0.1.889](https://github.com/Azure/autorest.cli) |\n| AutoRest - CLI Common | npm [0.6.2](https://www.npmjs.com/package/@autorest/clicommon/v/0.6.2) |  | GitHub [0.6.2](https://github.com/Azure/autorest.clicommon/tree/0.4.12) |\n| AutoRest - Compare | npm [0.5.3](https://www.npmjs.com/package/@autorest/compare/v/0.5.3) |  | GitHub [0.5.3](https://github.com/Azure/autorest.compare) |\n| AutoRest - Core | npm [3.10.9](https://www.npmjs.com/package/@autorest/core/v/3.10.9) |  | GitHub [3.10.9](https://github.com/Azure/autorest) |\n| AutoRest - Functions CSharp | npm [0.2.0-preview-dev.321054549](https://www.npmjs.com/package/@autorest/azure-functions-csharp/v/0.2.0-preview-dev.321054549) |  |  |\n| AutoRest - Functions Java | npm [0.0.2-Preview](https://www.npmjs.com/package/@autorest/azure-functions-java/v/0.0.2-Preview) |  |  |\n| AutoRest - Functions Python | npm [0.1.0-preview](https://www.npmjs.com/package/@autorest/azure-functions-python/v/0.1.0-preview) |  |  |\n| AutoRest - Functions TypeScript | npm [0.0.1-preview](https://www.npmjs.com/package/@autorest/azure-functions-typescript/v/0.0.1-preview) |  |  |\n| AutoRest - Go | npm [4.0.0-preview.77](https://www.npmjs.com/package/@autorest/go/v/4.0.0-preview.77) |  |  |\n| AutoRest - Modeler Four | npm [4.27.3](https://www.npmjs.com/package/@autorest/modelerfour/v/4.27.3) |  | GitHub [4.27.3](https://github.com/Azure/autorest.modelerfour) |\n| AutoRest - PowerShell | npm [4.0.699](https://www.npmjs.com/package/@autorest/powershell/v/4.0.699) |  | GitHub [4.0.699](https://github.com/Azure/autorest.powershell) |\n| AutoRest - Python | npm [6.50.3](https://www.npmjs.com/package/@autorest/python/v/6.50.3) |  | GitHub [6.50.3](https://github.com/Azure/autorest.python/tree/v5.1.0-preview.7) |\n| AutoRest - Remodeler | npm [2.1.27](https://www.npmjs.com/package/@autorest/remodeler/v/2.1.27) |  | GitHub [2.1.27](https://github.com/Azure/autorest.remodeler) |\n| AutoRest - Test | npm [0.1.76](https://www.npmjs.com/package/@autorest/test/v/0.1.76) |  | GitHub [0.1.76](https://github.com/Azure/autorest.test) |\n| AutoRest - Test Server | npm [3.0.27](https://www.npmjs.com/package/@autorest/test-server/v/3.0.27) |  |  |\n| Avocado | npm [0.11.0](https://www.npmjs.com/package/@azure/avocado/v/0.11.0) |  | GitHub [0.11.0](https://github.com/Azure/avocado) |\n| cadl-msbuild-target | npm [0.1.0](https://www.npmjs.com/package/cadl-msbuild-target/v/0.1.0) |  |  |\n| cadl-vs | npm [0.40.0](https://www.npmjs.com/package/cadl-vs/v/0.40.0) |  |  |\n| cadl-vscode | npm [0.40.0](https://www.npmjs.com/package/cadl-vscode/v/0.40.0) |  |  |\n| Git Rest Api SDK | npm [0.3.3](https://www.npmjs.com/package/git-rest-api-sdk/v/0.3.3) |  | GitHub [0.3.3](https://github.com/azure/git-rest-api) |\n| Ng Deploy | npm [0.2.3](https://www.npmjs.com/package/@azure/ng-deploy/v/0.2.3) |  | GitHub [0.2.3](https://github.com/Azure/ng-deploy-azure) |\n| Oad | npm [0.12.4](https://www.npmjs.com/package/@azure/oad/v/0.12.4) |  | GitHub [0.12.4](https://github.com/Azure/openapi-diff) |\n| OpenAPI Markdown | npm [0.9.4](https://www.npmjs.com/package/@azure/openapi-markdown/v/0.9.4) |  | GitHub [0.9.4](https://github.com/Azure/openapi-markdown) |\n| Publish Pipeline Result | npm [0.1.2](https://www.npmjs.com/package/@azure/publish-pipeline-result/v/0.1.2) |  |  |\n| RestAPI Specs Scripts | npm [0.14.0](https://www.npmjs.com/package/@azure/rest-api-specs-scripts/v/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/rest-api-specs-scripts) |\n| Stream Analytics CI/CD | npm [3.1.6](https://www.npmjs.com/package/azure-streamanalytics-cicd/v/3.1.6) |  |  |\n| Swagger Validation Common | npm [0.1.2](https://www.npmjs.com/package/@azure/swagger-validation-common/v/0.1.2) |  |  |\n"
  },
  {
    "path": "articles/includes/javascript-new.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| @azure/api-management-custom-widgets-scaffolder | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/api-management-custom-widgets-scaffolder/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/api-management-custom-widgets-scaffolder-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/apimanagement/api-management-custom-widgets-scaffolder) |\n| @azure/api-management-custom-widgets-tools | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/api-management-custom-widgets-tools/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/api-management-custom-widgets-tools-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/apimanagement/api-management-custom-widgets-tools) |\n| @azure/communication-administration | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/communication-administration/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/communication-administration-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/communication) |\n| @azure/communication-calling-effects | npm [1.3.2](https://www.npmjs.com/package/@azure/communication-calling-effects/v/1.3.2) |  | GitHub [1.3.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/communication) |\n| @azure/communication-react | npm [1.31.0](https://www.npmjs.com/package/@azure/communication-react/v/1.31.0) |  | GitHub [1.31.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/communication) |\n| @azure/core-sse | npm [2.3.0](https://www.npmjs.com/package/@azure/core-sse/v/2.3.0) | [docs](/javascript/api/overview/azure/core-sse-readme) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-sse_2.3.0/sdk/core/core-sse/) |\n| @azure/functions-authentication-events | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/functions-authentication-events/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/functions-authentication-events-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/functions-authentication-events_1.0.0-beta.2/sdk/entra/functions-authentication-events/) |\n| @azure/template-dpg | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/template-dpg/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/template-dpg-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/template-dpg_1.0.0-beta.1/sdk/template/template-dpg/) |\n| AccessControl | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/synapse-access-control/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/synapse-access-control-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/synapse-access-control_1.0.0-beta.3/sdk/synapse/synapse-access-control/) |\n| AI Agents | npm [1.1.0](https://www.npmjs.com/package/@azure/ai-agents/v/1.1.0) | [docs](/javascript/api/overview/azure/ai-agents-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-agents_1.1.0/sdk/ai/ai-agents/) |\n| AI Model Inference | npm [1.0.0-beta.6](https://www.npmjs.com/package/@azure-rest/ai-inference/v/1.0.0-beta.6) |  | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-inference_1.0.0-beta.6/sdk/ai/ai-inference-rest/) |\n| AI Projects | npm [2.1.1](https://www.npmjs.com/package/@azure/ai-projects/v/2.1.1) | [docs](/javascript/api/overview/azure/ai-projects-readme) | GitHub [2.1.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-projects_2.1.1/sdk/ai/ai-projects/) |\n| Anomaly Detector | npm [3.0.0-beta.5](https://www.npmjs.com/package/@azure/ai-anomaly-detector/v/3.0.0-beta.5) | [docs](/javascript/api/overview/azure/ai-anomaly-detector-readme) | GitHub [3.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-anomaly-detector_3.0.0-beta.5/sdk/anomalydetector/ai-anomaly-detector/) |\n| App Configuration | npm [1.11.0](https://www.npmjs.com/package/@azure/app-configuration/v/1.11.0) | [docs](/javascript/api/overview/azure/app-configuration-readme) | GitHub [1.11.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/app-configuration_1.11.0/sdk/appconfiguration/app-configuration/) |\n| Artifacts | npm [1.0.0-beta.16](https://www.npmjs.com/package/@azure/synapse-artifacts/v/1.0.0-beta.16) | [docs](/javascript/api/overview/azure/synapse-artifacts-readme) | GitHub [1.0.0-beta.16](https://github.com/Azure/azure-sdk-for-js/tree/@azure/synapse-artifacts_1.0.0-beta.16/sdk/synapse/synapse-artifacts/) |\n| Attestation | npm [1.0.0](https://www.npmjs.com/package/@azure/attestation/v/1.0.0) | [docs](/javascript/api/overview/azure/attestation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/attestation_1.0.0/sdk/attestation/attestation/) |\n| Azure AI Search | npm [13.0.0](https://www.npmjs.com/package/@azure/search-documents/v/13.0.0) | [docs](/javascript/api/overview/azure/search-documents-readme) | GitHub [13.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/search-documents_13.0.0/sdk/search/search-documents/) |\n| Azure AI Transcription | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/ai-speech-transcription/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/ai-speech-transcription-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-speech-transcription_1.0.0-beta.1/sdk/transcription/ai-speech-transcription/) |\n| Azure Blob Storage Checkpoint Store | npm [2.0.0](https://www.npmjs.com/package/@azure/eventhubs-checkpointstore-blob/v/2.0.0) | [docs](/javascript/api/overview/azure/eventhubs-checkpointstore-blob-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/eventhubs-checkpointstore-blob_2.0.0/sdk/eventhub/eventhubs-checkpointstore-blob/) |\n| Azure Monitor OpenTelemetry | npm [1.17.0](https://www.npmjs.com/package/@azure/monitor-opentelemetry/v/1.17.0) | [docs](/javascript/api/overview/azure/monitor-opentelemetry-readme) | GitHub [1.17.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-opentelemetry_1.17.0/sdk/monitor/monitor-opentelemetry/) |\n| Azure Remote Rendering | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/mixed-reality-remote-rendering/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/mixed-reality-remote-rendering_1.0.0-beta.1/sdk/remoterendering/mixed-reality-remote-rendering/) |\n| Batch | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure-rest/batch/v/1.0.0-beta.4) |  | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/batch_1.0.0-beta.4/sdk/batch/batch-rest/) |\n| Batch | npm [13.0.0](https://www.npmjs.com/package/@azure/batch/v/13.0.0) | [docs](/javascript/api/overview/azure/batch-readme) | GitHub [13.0.0](https://github.com/azure/azure-sdk-for-js/tree/main/sdk/batch/batch) |\n| Common | npm [2.1.0](https://www.npmjs.com/package/@azure/keyvault-common/v/2.1.0) | [docs](/javascript/api/overview/azure/keyvault-common-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/keyvault-common_2.1.0/sdk/keyvault/keyvault-common/) |\n| Communication Call Automation | npm [1.5.1](https://www.npmjs.com/package/@azure/communication-call-automation/v/1.5.1)<br>npm [1.6.0-beta.2](https://www.npmjs.com/package/@azure/communication-call-automation/v/1.6.0-beta.2) | [docs](/javascript/api/overview/azure/communication-call-automation-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-call-automation_1.5.1/sdk/communication/communication-call-automation/)<br>GitHub [1.6.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-call-automation_1.6.0-beta.2/sdk/communication/communication-call-automation/) |\n| Communication Chat | npm [1.6.0](https://www.npmjs.com/package/@azure/communication-chat/v/1.6.0) | [docs](/javascript/api/overview/azure/communication-chat-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-chat_1.6.0/sdk/communication/communication-chat/) |\n| Communication Common | npm [2.4.0](https://www.npmjs.com/package/@azure/communication-common/v/2.4.0)<br>npm [3.0.0-beta.1](https://www.npmjs.com/package/@azure/communication-common/v/3.0.0-beta.1) | [docs](/javascript/api/overview/azure/communication-common-readme) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-common_2.4.0/sdk/communication/communication-common/)<br>GitHub [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-common_3.0.0-beta.1/sdk/communication/communication-common/) |\n| Communication Email | npm [1.1.0](https://www.npmjs.com/package/@azure/communication-email/v/1.1.0) | [docs](/javascript/api/overview/azure/communication-email-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-email_1.1.0/sdk/communication/communication-email/) |\n| Communication Identity | npm [1.3.1](https://www.npmjs.com/package/@azure/communication-identity/v/1.3.1)<br>npm [1.4.0-beta.1](https://www.npmjs.com/package/@azure/communication-identity/v/1.4.0-beta.1) | [docs](/javascript/api/overview/azure/communication-identity-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-identity_1.3.1/sdk/communication/communication-identity/)<br>GitHub [1.4.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-identity_1.4.0-beta.1/sdk/communication/communication-identity/) |\n| Communication Job Router | npm [1.0.0](https://www.npmjs.com/package/@azure-rest/communication-job-router/v/1.0.0)<br>npm [1.1.0-beta.2](https://www.npmjs.com/package/@azure-rest/communication-job-router/v/1.1.0-beta.2) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/communication-job-router_1.0.0/sdk/communication/communication-job-router-rest/) |\n| Communication Job Router | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/communication-job-router/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/communication-job-router-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-job-router_1.0.0-beta.1/sdk/communication/communication-job-router/) |\n| Communication Messages | npm [2.0.0](https://www.npmjs.com/package/@azure-rest/communication-messages/v/2.0.0)<br>npm [2.2.0-beta.1](https://www.npmjs.com/package/@azure-rest/communication-messages/v/2.2.0-beta.1) |  | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/communication-messages_2.0.0/sdk/communication/communication-messages-rest/) |\n| Communication Network Traversal | npm [1.1.0-beta.1](https://www.npmjs.com/package/@azure/communication-network-traversal/v/1.1.0-beta.1) | [docs](/javascript/api/overview/azure/communication-network-traversal-readme) | GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-network-traversal_1.1.0-beta.1/sdk/communication/communication-network-traversal/) |\n| Communication Phone Numbers | npm [1.5.0](https://www.npmjs.com/package/@azure/communication-phone-numbers/v/1.5.0) | [docs](/javascript/api/overview/azure/communication-phone-numbers-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-phone-numbers_1.5.0/sdk/communication/communication-phone-numbers/) |\n| Communication Rooms | npm [1.2.0](https://www.npmjs.com/package/@azure/communication-rooms/v/1.2.0) | [docs](/javascript/api/overview/azure/communication-rooms-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-rooms_1.2.0/sdk/communication/communication-rooms/) |\n| Communication Sms | npm [1.1.0](https://www.npmjs.com/package/@azure/communication-sms/v/1.1.0)<br>npm [1.2.0-beta.4](https://www.npmjs.com/package/@azure/communication-sms/v/1.2.0-beta.4) | [docs](/javascript/api/overview/azure/communication-sms-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-sms_1.1.0/sdk/communication/communication-sms/)<br>GitHub [1.2.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/communication-sms_1.2.0-beta.4/sdk/communication/communication-sms/) |\n| Confidential Ledger | npm [1.0.0](https://www.npmjs.com/package/@azure-rest/confidential-ledger/v/1.0.0)<br>npm [1.1.2-beta.4](https://www.npmjs.com/package/@azure-rest/confidential-ledger/v/1.1.2-beta.4) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/confidential-ledger_1.0.0/sdk/confidentialledger/confidential-ledger-rest/) |\n| Container Registry | npm [1.1.2](https://www.npmjs.com/package/@azure/container-registry/v/1.1.2) | [docs](/javascript/api/overview/azure/container-registry-readme) | GitHub [1.1.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/container-registry_1.1.2/sdk/containerregistry/container-registry/) |\n| Content Safety | npm [1.0.1](https://www.npmjs.com/package/@azure-rest/ai-content-safety/v/1.0.1) |  | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-content-safety_1.0.1/sdk/contentsafety/ai-content-safety-rest/) |\n| Content Understanding | npm [1.1.0](https://www.npmjs.com/package/@azure/ai-content-understanding/v/1.1.0)<br>npm [1.2.0-beta.1](https://www.npmjs.com/package/@azure/ai-content-understanding/v/1.2.0-beta.1) | [docs](/javascript/api/overview/azure/ai-content-understanding-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-content-understanding_1.1.0/sdk/contentunderstanding/ai-content-understanding/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-content-understanding_1.2.0-beta.1/sdk/contentunderstanding/ai-content-understanding/) |\n| Conversational Language Understanding | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/ai-language-conversations/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/ai-language-conversations-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-language-conversations_1.0.0-beta.1/sdk/cognitivelanguage/ai-language-conversations/) |\n| Core - Client - Abort Controller | npm [2.1.2](https://www.npmjs.com/package/@azure/abort-controller/v/2.1.2) | [docs](/javascript/api/overview/azure/abort-controller-readme) | GitHub [2.1.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/abort-controller_2.1.2/sdk/core/abort-controller/) |\n| Core - Client - AMQP | npm [4.4.2](https://www.npmjs.com/package/@azure/core-amqp/v/4.4.2) | [docs](/javascript/api/overview/azure/core-amqp-readme) | GitHub [4.4.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-amqp_4.4.2/sdk/core/core-amqp/) |\n| Core - Client - Auth | npm [1.10.1](https://www.npmjs.com/package/@azure/core-auth/v/1.10.1) | [docs](/javascript/api/overview/azure/core-auth-readme) | GitHub [1.10.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-auth_1.10.1/sdk/core/core-auth/) |\n| Core - Client - Client | npm [1.10.1](https://www.npmjs.com/package/@azure/core-client/v/1.10.1) | [docs](/javascript/api/overview/azure/core-client-readme) | GitHub [1.10.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-client_1.10.1/sdk/core/core-client/) |\n| Core - Client - Client Paging | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/core-client-paging/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/core-client-paging_1.0.0-beta.1/sdk/core/core-client-paging-rest/) |\n| Core - Client - Core Rest Pipeline | npm [1.23.0](https://www.npmjs.com/package/@azure/core-rest-pipeline/v/1.23.0) | [docs](/javascript/api/overview/azure/core-rest-pipeline-readme) | GitHub [1.23.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-rest-pipeline_1.23.0/sdk/core/core-rest-pipeline/) |\n| Core - Client - Core Utils | npm [1.13.1](https://www.npmjs.com/package/@azure/core-util/v/1.13.1) | [docs](/javascript/api/overview/azure/core-util-readme) | GitHub [1.13.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-util_1.13.1/sdk/core/core-util/) |\n| Core - Client - HTTP | npm [3.0.5](https://www.npmjs.com/package/@azure/core-http/v/3.0.5) | [docs](/javascript/api/overview/azure/core-http-readme) | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-http_3.0.5/sdk/core/core-http/) |\n| Core - Client - Http Compat | npm [2.4.0](https://www.npmjs.com/package/@azure/core-http-compat/v/2.4.0) | [docs](/javascript/api/overview/azure/core-http-compat-readme) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-http-compat_2.4.0/sdk/core/core-http-compat/) |\n| Core - Client - Logger | npm [1.3.0](https://www.npmjs.com/package/@azure/logger/v/1.3.0) | [docs](/javascript/api/overview/azure/logger-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/logger_1.3.0/sdk/core/logger/) |\n| Core - Client - LRO | npm [3.3.1](https://www.npmjs.com/package/@azure/core-lro/v/3.3.1) | [docs](/javascript/api/overview/azure/core-lro-readme) | GitHub [3.3.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-lro_3.3.1/sdk/core/core-lro/) |\n| Core - Client - Rest | npm [2.6.0](https://www.npmjs.com/package/@azure-rest/core-client/v/2.6.0) |  | GitHub [2.6.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/core-client_2.6.0/sdk/core/core-client-rest/) |\n| Core - Client - Tracing | npm [1.3.1](https://www.npmjs.com/package/@azure/core-tracing/v/1.3.1) | [docs](/javascript/api/overview/azure/core-tracing-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-tracing_1.3.1/sdk/core/core-tracing/) |\n| Core - Client - XML | npm [1.5.1](https://www.npmjs.com/package/@azure/core-xml/v/1.5.1) | [docs](/javascript/api/overview/azure/core-xml-readme) | GitHub [1.5.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-xml_1.5.1/sdk/core/core-xml/) |\n| Core - Paging | npm [1.6.2](https://www.npmjs.com/package/@azure/core-paging/v/1.6.2) | [docs](/javascript/api/overview/azure/core-paging-readme) | GitHub [1.6.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/core-paging_1.6.2/sdk/core/core-paging/) |\n| Cosmos DB | npm [4.9.3](https://www.npmjs.com/package/@azure/cosmos/v/4.9.3) | [docs](/javascript/api/overview/azure/cosmos-readme) | GitHub [4.9.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/cosmos_4.9.3/sdk/cosmosdb/cosmos/) |\n| Create - Microsoft Playwright Testing | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/create-microsoft-playwright-testing/v/1.0.0-beta.4) |  | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/create-microsoft-playwright-testing_1.0.0-beta.4/sdk/playwrighttesting/create-microsoft-playwright-testing/) |\n| Create Playwright | npm [1.1.0](https://www.npmjs.com/package/@azure/create-playwright/v/1.1.0) |  | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/create-playwright_1.1.0/sdk/loadtesting/create-playwright/) |\n| Defender EASM | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/defender-easm/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/defender-easm_1.0.0-beta.2/sdk/easm/defender-easm-rest/) |\n| Dev Center | npm [1.0.1](https://www.npmjs.com/package/@azure-rest/developer-devcenter/v/1.0.1) |  | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/developer-devcenter_1.0.1/sdk/devcenter/developer-devcenter-rest/) |\n| Device Update | npm [1.1.0](https://www.npmjs.com/package/@azure-rest/iot-device-update/v/1.1.0) |  | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/iot-device-update_1.1.0/sdk/deviceupdate/iot-device-update-rest/) |\n| Digital Twins - Core | npm [2.0.0](https://www.npmjs.com/package/@azure/digital-twins-core/v/2.0.0) | [docs](/javascript/api/overview/azure/digital-twins-core-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/digital-twins-core_2.0.0/sdk/digitaltwins/digital-twins-core/) |\n| Digital Twins Definition Language Parser | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/dtdl-parser/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/dtdl-parser-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/dtdl-parser_1.0.0-beta.2/sdk/digitaltwins/dtdl-parser/) |\n| Document Intelligence | npm [1.1.0](https://www.npmjs.com/package/@azure-rest/ai-document-intelligence/v/1.1.0) |  | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-document-intelligence_1.1.0/sdk/documentintelligence/ai-document-intelligence-rest/) |\n| Document Translation | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/ai-document-translator/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-document-translator_1.0.0-beta.2/sdk/documenttranslator/ai-document-translator-rest/) |\n| Document Translation | npm [1.0.0](https://www.npmjs.com/package/@azure-rest/ai-translation-document/v/1.0.0) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-translation-document_1.0.0/sdk/translation/ai-translation-document-rest/) |\n| Event Grid | npm [5.12.0](https://www.npmjs.com/package/@azure/eventgrid/v/5.12.0) | [docs](/javascript/api/overview/azure/eventgrid-readme) | GitHub [5.12.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/eventgrid_5.12.0/sdk/eventgrid/eventgrid/) |\n| Event Grid Namespaces | npm [1.0.0](https://www.npmjs.com/package/@azure/eventgrid-namespaces/v/1.0.0) | [docs](/javascript/api/overview/azure/eventgrid-namespaces-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/eventgrid-namespaces_1.0.0/sdk/eventgrid/eventgrid-namespaces/) |\n| Event Grid System Events | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure/eventgrid-system-events/v/1.0.0-beta.5) | [docs](/javascript/api/overview/azure/eventgrid-system-events-readme) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/eventgrid-system-events_1.0.0-beta.5/sdk/eventgrid/eventgrid-system-events/) |\n| Event Hubs | npm [6.0.4](https://www.npmjs.com/package/@azure/event-hubs/v/6.0.4) | [docs](/javascript/api/overview/azure/event-hubs-readme) | GitHub [6.0.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/event-hubs_6.0.4/sdk/eventhub/event-hubs/) |\n| Face | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/ai-vision-face/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-vision-face_1.0.0-beta.3/sdk/face/ai-vision-face-rest/) |\n| farmbeats | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/agrifood-farming/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/agrifood-farming_1.0.0-beta.3/sdk/agrifood/agrifood-farming-rest/) |\n| Form Recognizer | npm [5.1.0](https://www.npmjs.com/package/@azure/ai-form-recognizer/v/5.1.0) | [docs](/javascript/api/overview/azure/ai-form-recognizer-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-form-recognizer_5.1.0/sdk/formrecognizer/ai-form-recognizer/) |\n| Health Deidentification | npm [1.0.0](https://www.npmjs.com/package/@azure-rest/health-deidentification/v/1.0.0) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/health-deidentification_1.0.0/sdk/healthdataaiservices/health-deidentification-rest/) |\n| Health Insights Cancer Profiling | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/health-insights-cancerprofiling/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/health-insights-cancerprofiling_1.0.0-beta.1/sdk/healthinsights/health-insights-cancerprofiling-rest/) |\n| Health Insights Clinical Matching | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/health-insights-clinicalmatching/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/health-insights-clinicalmatching_1.0.0-beta.1/sdk/healthinsights/health-insights-clinicalmatching-rest/) |\n| Health Insights Radiology Insights | npm [2.0.0](https://www.npmjs.com/package/@azure-rest/health-insights-radiologyinsights/v/2.0.0) |  | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/health-insights-radiologyinsights_2.0.0/sdk/healthinsights/health-insights-radiologyinsights-rest/) |\n| Identity | npm [4.13.1](https://www.npmjs.com/package/@azure/identity/v/4.13.1)<br>npm [4.14.0-beta.3](https://www.npmjs.com/package/@azure/identity/v/4.14.0-beta.3) | [docs](/javascript/api/overview/azure/identity-readme) | GitHub [4.13.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/identity_4.13.1/sdk/identity/identity/)<br>GitHub [4.14.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/identity_4.14.0-beta.3/sdk/identity/identity/) |\n| Identity Broker | npm [1.4.0](https://www.npmjs.com/package/@azure/identity-broker/v/1.4.0) | [docs](/javascript/api/overview/azure/identity-broker-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/identity-broker_1.4.0/sdk/identity/identity-broker/) |\n| Image Analysis | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/ai-vision-image-analysis/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-vision-image-analysis_1.0.0-beta.3/sdk/vision/ai-vision-image-analysis-rest/) |\n| IoT Device Update | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/iot-device-update/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/iot-device-update-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/iot-device-update_1.0.0-beta.1/sdk/deviceupdate/iot-device-update/) |\n| Key Vault - Administration | npm [4.7.0](https://www.npmjs.com/package/@azure/keyvault-admin/v/4.7.0) | [docs](/javascript/api/overview/azure/keyvault-admin-readme) | GitHub [4.7.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/keyvault-admin_4.7.0/sdk/keyvault/keyvault-admin/) |\n| Key Vault - Certificates | npm [4.10.3](https://www.npmjs.com/package/@azure/keyvault-certificates/v/4.10.3) | [docs](/javascript/api/overview/azure/keyvault-certificates-readme) | GitHub [4.10.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/keyvault-certificates_4.10.3/sdk/keyvault/keyvault-certificates/) |\n| Key Vault - Keys | npm [4.10.0](https://www.npmjs.com/package/@azure/keyvault-keys/v/4.10.0) | [docs](/javascript/api/overview/azure/keyvault-keys-readme) | GitHub [4.10.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/keyvault-keys_4.10.0/sdk/keyvault/keyvault-keys/) |\n| Key Vault - Secrets | npm [4.11.2](https://www.npmjs.com/package/@azure/keyvault-secrets/v/4.11.2) | [docs](/javascript/api/overview/azure/keyvault-secrets-readme) | GitHub [4.11.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/keyvault-secrets_4.11.2/sdk/keyvault/keyvault-secrets/) |\n| Language Text | npm [1.1.0](https://www.npmjs.com/package/@azure/ai-language-text/v/1.1.0) | [docs](/javascript/api/overview/azure/ai-language-text-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-language-text_1.1.0/sdk/cognitivelanguage/ai-language-text/) |\n| Load Testing | npm [1.0.1](https://www.npmjs.com/package/@azure-rest/load-testing/v/1.0.1)<br>npm [1.2.0-beta.1](https://www.npmjs.com/package/@azure-rest/load-testing/v/1.2.0-beta.1) |  | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/load-testing_1.0.1/sdk/loadtesting/load-testing-rest/) |\n| Managed Private Endpoints | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/synapse-managed-private-endpoints/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/synapse-managed-private-endpoints-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/synapse-managed-private-endpoints_1.0.0-beta.4/sdk/synapse/synapse-managed-private-endpoints/) |\n| Maps Common | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/maps-common/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/maps-common-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/maps-common_1.0.0-beta.2/sdk/maps/maps-common/) |\n| Maps Geolocation | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure-rest/maps-geolocation/v/1.0.0-beta.5) |  | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/maps-geolocation_1.0.0-beta.5/sdk/maps/maps-geolocation-rest/) |\n| Maps Render | npm [2.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/maps-render/v/2.0.0-beta.2) |  | GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/maps-render_2.0.0-beta.2/sdk/maps/maps-render-rest/) |\n| Maps Route | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure-rest/maps-route/v/1.0.0-beta.5) |  | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/maps-route_1.0.0-beta.5/sdk/maps/maps-route-rest/) |\n| Maps Search | npm [2.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/maps-search/v/2.0.0-beta.3) |  | GitHub [2.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/maps-search_2.0.0-beta.3/sdk/maps/maps-search-rest/) |\n| Maps Search | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/maps-search/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/maps-search-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/maps-search_1.0.0-beta.2/sdk/maps/maps-search/) |\n| Metrics Advisor | npm [1.0.0](https://www.npmjs.com/package/@azure/ai-metrics-advisor/v/1.0.0) | [docs](/javascript/api/overview/azure/ai-metrics-advisor-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-metrics-advisor_1.0.0/sdk/metricsadvisor/ai-metrics-advisor/) |\n| Microsoft Playwright Testing | npm [1.0.0-beta.9](https://www.npmjs.com/package/@azure/microsoft-playwright-testing/v/1.0.0-beta.9) | [docs](/javascript/api/overview/azure/microsoft-playwright-testing-readme) | GitHub [1.0.0-beta.9](https://github.com/Azure/azure-sdk-for-js/tree/@azure/microsoft-playwright-testing_1.0.0-beta.9/sdk/playwrighttesting/microsoft-playwright-testing/) |\n| Mixed Reality Authentication | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/mixed-reality-authentication/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/mixed-reality-authentication_1.0.0-beta.1/sdk/mixedreality/mixed-reality-authentication/) |\n| Monitor Ingestion | npm [1.2.0](https://www.npmjs.com/package/@azure/monitor-ingestion/v/1.2.0) | [docs](/javascript/api/overview/azure/monitor-ingestion-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-ingestion_1.2.0/sdk/monitor/monitor-ingestion/) |\n| Monitor Query | npm [1.3.3](https://www.npmjs.com/package/@azure/monitor-query/v/1.3.3) | [docs](/javascript/api/overview/azure/monitor-query-readme) | GitHub [1.3.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-query_1.3.3/sdk/monitor/monitor-query/) |\n| Monitor Query Logs | npm [1.0.0](https://www.npmjs.com/package/@azure/monitor-query-logs/v/1.0.0) | [docs](/javascript/api/overview/azure/monitor-query-logs-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-query-logs_1.0.0/sdk/monitor/monitor-query-logs/) |\n| Monitor Query Metrics | npm [1.0.0](https://www.npmjs.com/package/@azure/monitor-query-metrics/v/1.0.0) | [docs](/javascript/api/overview/azure/monitor-query-metrics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-query-metrics_1.0.0/sdk/monitor/monitor-query-metrics/) |\n| Notification Hubs | npm [2.1.0](https://www.npmjs.com/package/@azure/notification-hubs/v/2.1.0) | [docs](/javascript/api/overview/azure/notification-hubs-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/notification-hubs_2.1.0/sdk/notificationhubs/notification-hubs/) |\n| Online Experimentation | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/onlineexperimentation/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/onlineexperimentation_1.0.0-beta.1/sdk/onlineexperimentation/onlineexperimentation-rest/) |\n| OpenAI | npm [2.0.0](https://www.npmjs.com/package/@azure/openai/v/2.0.0)<br>npm [2.1.0-beta.1](https://www.npmjs.com/package/@azure/openai/v/2.1.0-beta.1) | [docs](/javascript/api/overview/azure/openai-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/openai_2.0.0/sdk/openai/openai/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/openai_2.1.0-beta.1/sdk/openai/openai/) |\n| OpenAI Assistants | npm [1.0.0-beta.6](https://www.npmjs.com/package/@azure/openai-assistants/v/1.0.0-beta.6) | [docs](/javascript/api/overview/azure/openai-assistants-readme) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-js/tree/@azure/openai-assistants_1.0.0-beta.6/sdk/openai/openai-assistants/) |\n| OpenTelemetry Exporter | npm [1.0.0-beta.40](https://www.npmjs.com/package/@azure/monitor-opentelemetry-exporter/v/1.0.0-beta.40) | [docs](/javascript/api/overview/azure/monitor-opentelemetry-exporter-readme) | GitHub [1.0.0-beta.40](https://github.com/Azure/azure-sdk-for-js/tree/@azure/monitor-opentelemetry-exporter_1.0.0-beta.40/sdk/monitor/monitor-opentelemetry-exporter/) |\n| Personalizer | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/ai-personalizer/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-personalizer_1.0.0-beta.1/sdk/personalizer/ai-personalizer-rest/) |\n| Playwright | npm [1.1.5](https://www.npmjs.com/package/@azure/playwright/v/1.1.5) | [docs](/javascript/api/overview/azure/playwright-readme) | GitHub [1.1.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/playwright_1.1.5/sdk/loadtesting/playwright/) |\n| Purview Account | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/purview-account/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-account_1.0.0-beta.1/sdk/purview/purview-account-rest/) |\n| Purview Administration | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/purview-administration/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-administration_1.0.0-beta.2/sdk/purview/purview-administration-rest/) |\n| Purview Catalog | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure-rest/purview-catalog/v/1.0.0-beta.5) |  | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-catalog_1.0.0-beta.5/sdk/purview/purview-catalog-rest/) |\n| Purview Data Map | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/purview-datamap/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-datamap_1.0.0-beta.3/sdk/purview/purview-datamap-rest/) |\n| Purview Scanning | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/purview-scanning/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-scanning_1.0.0-beta.3/sdk/purview/purview-scanning-rest/) |\n| Purview Sharing | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure-rest/purview-sharing/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-sharing_1.0.0-beta.3/sdk/purview/purview-sharing-rest) |\n| Purview Workflow | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/purview-workflow/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/purview-workflow_1.0.0-beta.2/sdk/purview/purview-workflow-rest/) |\n| Quantum Jobs | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/quantum-jobs/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/quantum-jobs-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/76c6e9a4cb5847a996ac6480f9a78b2ffaa1a182/sdk/quantum/quantum-jobs) |\n| Schema Registry | npm [1.3.0](https://www.npmjs.com/package/@azure/schema-registry/v/1.3.0) | [docs](/javascript/api/overview/azure/schema-registry-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/schema-registry_1.3.0/sdk/schemaregistry/schema-registry/) |\n| Schema Registry - Avro | npm [1.1.0](https://www.npmjs.com/package/@azure/schema-registry-avro/v/1.1.0) | [docs](/javascript/api/overview/azure/schema-registry-avro-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/schema-registry-avro_1.1.0/sdk/schemaregistry/schema-registry-avro/) |\n| Schema Registry - JSON | npm [1.0.0](https://www.npmjs.com/package/@azure/schema-registry-json/v/1.0.0) | [docs](/javascript/api/overview/azure/schema-registry-json-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/schema-registry-json_1.0.0/sdk/schemaregistry/schema-registry-json/) |\n| Service Bus | npm [7.9.5](https://www.npmjs.com/package/@azure/service-bus/v/7.9.5)<br>npm [7.10.0-beta.4](https://www.npmjs.com/package/@azure/service-bus/v/7.10.0-beta.4) | [docs](/javascript/api/overview/azure/service-bus-readme) | GitHub [7.9.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/service-bus_7.9.5/sdk/servicebus/service-bus/)<br>GitHub [7.10.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/service-bus_7.10.0-beta.4/sdk/servicebus/service-bus/) |\n| Spark | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/synapse-spark/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/synapse-spark-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/synapse-spark_1.0.0-beta.4/sdk/synapse/synapse-spark/) |\n| Storage - Blobs | npm [12.31.0](https://www.npmjs.com/package/@azure/storage-blob/v/12.31.0)<br>npm [12.33.0-beta.1](https://www.npmjs.com/package/@azure/storage-blob/v/12.33.0-beta.1) | [docs](/javascript/api/overview/azure/storage-blob-readme) | GitHub [12.31.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-blob_12.31.0/sdk/storage/storage-blob/)<br>GitHub [12.33.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-blob_12.33.0-beta.1/sdk/storage/storage-blob/) |\n| Storage - Blobs Changefeed | npm [12.0.0-preview.4](https://www.npmjs.com/package/@azure/storage-blob-changefeed/v/12.0.0-preview.4) | [docs](/javascript/api/overview/azure/storage-blob-changefeed-readme) | GitHub [12.0.0-preview.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-blob-changefeed_12.0.0-preview.4/sdk/storage/storage-blob-changefeed/) |\n| Storage - Files Data Lake | npm [12.29.0](https://www.npmjs.com/package/@azure/storage-file-datalake/v/12.29.0)<br>npm [12.31.0-beta.1](https://www.npmjs.com/package/@azure/storage-file-datalake/v/12.31.0-beta.1) | [docs](/javascript/api/overview/azure/storage-file-datalake-readme) | GitHub [12.29.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-file-datalake_12.29.0/sdk/storage/storage-file-datalake/)<br>GitHub [12.31.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-file-datalake_12.31.0-beta.1/sdk/storage/storage-file-datalake/) |\n| Storage - Files Share | npm [12.30.0](https://www.npmjs.com/package/@azure/storage-file-share/v/12.30.0)<br>npm [12.32.0-beta.1](https://www.npmjs.com/package/@azure/storage-file-share/v/12.32.0-beta.1) | [docs](/javascript/api/overview/azure/storage-file-share-readme) | GitHub [12.30.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-file-share_12.30.0/sdk/storage/storage-file-share/)<br>GitHub [12.32.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-file-share_12.32.0-beta.1/sdk/storage/storage-file-share/) |\n| Storage - Queues | npm [12.29.0](https://www.npmjs.com/package/@azure/storage-queue/v/12.29.0)<br>npm [12.31.0-beta.1](https://www.npmjs.com/package/@azure/storage-queue/v/12.31.0-beta.1) | [docs](/javascript/api/overview/azure/storage-queue-readme) | GitHub [12.29.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-queue_12.29.0/sdk/storage/storage-queue/)<br>GitHub [12.31.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-queue_12.31.0-beta.1/sdk/storage/storage-queue/) |\n| Storage Common | npm [12.3.0](https://www.npmjs.com/package/@azure/storage-common/v/12.3.0)<br>npm [12.4.0-beta.1](https://www.npmjs.com/package/@azure/storage-common/v/12.4.0-beta.1) | [docs](/javascript/api/overview/azure/storage-common-readme) | GitHub [12.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-common_12.3.0/sdk/storage/storage-common/)<br>GitHub [12.4.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/storage-common_12.4.0-beta.1/sdk/storage/storage-common/) |\n| Synapse - Monitoring | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/synapse-monitoring/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/synapse-monitoring-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/synapse-monitoring_1.0.0-beta.2/sdk/synapse/synapse-monitoring/) |\n| System Events | npm [1.0.1](https://www.npmjs.com/package/@azure/eventgrid-systemevents/v/1.0.1) | [docs](/javascript/api/overview/azure/eventgrid-systemevents-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/eventgrid-systemevents_1.0.1/sdk/eventgrid/eventgrid-systemevents/) |\n| Tables | npm [13.3.2](https://www.npmjs.com/package/@azure/data-tables/v/13.3.2) | [docs](/javascript/api/overview/azure/data-tables-readme) | GitHub [13.3.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/data-tables_13.3.2/sdk/tables/data-tables/) |\n| Text Analytics | npm [5.1.0](https://www.npmjs.com/package/@azure/ai-text-analytics/v/5.1.0)<br>npm [6.0.0-beta.1](https://www.npmjs.com/package/@azure/ai-text-analytics/v/6.0.0-beta.1) | [docs](/javascript/api/overview/azure/ai-text-analytics-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-text-analytics_5.1.0/sdk/textanalytics/ai-text-analytics/)<br>GitHub [6.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-text-analytics_6.0.0-beta.1/sdk/textanalytics/ai-text-analytics/) |\n| Text Translation | npm [1.0.1](https://www.npmjs.com/package/@azure-rest/ai-translation-text/v/1.0.1)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/ai-translation-text/v/2.0.0-beta.1) |  | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-translation-text_1.0.1/sdk/translation/ai-translation-text-rest/) |\n| TimeZones | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/maps-timezone/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/maps-timezone_1.0.0-beta.1/sdk/maps/maps-timezone-rest/) |\n| Token Cache Persistence Plugin | npm [1.3.0](https://www.npmjs.com/package/@azure/identity-cache-persistence/v/1.3.0) | [docs](/javascript/api/overview/azure/identity-cache-persistence-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/identity-cache-persistence_1.3.0/sdk/identity/identity-cache-persistence/) |\n| TypeSpec HTTP Runtime | npm [0.3.5](https://www.npmjs.com/package/@typespec/ts-http-runtime/v/0.3.5) |  | GitHub [0.3.5](https://github.com/Azure/azure-sdk-for-js/tree/@typespec/ts-http-runtime_0.3.5/sdk/core/ts-http-runtime) |\n| unknown | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/postgresql-auth/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/postgresql-auth-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/postgresql-auth_1.0.0-beta.1/sdk/postgresql/postgresql-auth/) |\n| Video Analyzer Edge | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/video-analyzer-edge/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/video-analyzer-edge-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/video-analyzer-edge_1.0.0-beta.4/sdk/videoanalyzer/video-analyzer-edge/) |\n| Voice Live | npm [1.0.0-beta.4](https://www.npmjs.com/package/@azure/ai-voicelive/v/1.0.0-beta.4) | [docs](/javascript/api/overview/azure/ai-voicelive-readme) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/ai-voicelive_1.0.0-beta.4/sdk/voicelive/ai-voicelive/) |\n| VS Code Authentication Plugin | npm [2.2.0](https://www.npmjs.com/package/@azure/identity-vscode/v/2.2.0) | [docs](/javascript/api/overview/azure/identity-vscode-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/identity-vscode_2.2.0/sdk/identity/identity-vscode/) |\n| Web PubSub | npm [1.2.0](https://www.npmjs.com/package/@azure/web-pubsub/v/1.2.0) | [docs](/javascript/api/overview/azure/web-pubsub-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/web-pubsub_1.2.0/sdk/web-pubsub/web-pubsub/) |\n| Web PubSub Client | npm [1.0.4](https://www.npmjs.com/package/@azure/web-pubsub-client/v/1.0.4) | [docs](/javascript/api/overview/azure/web-pubsub-client-readme) | GitHub [1.0.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/web-pubsub-client_1.0.4/sdk/web-pubsub/web-pubsub-client/) |\n| WebPubSub Client SDK Protobuf | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/web-pubsub-client-protobuf/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/web-pubsub-client-protobuf-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/web-pubsub-client-protobuf_1.0.0-beta.2/sdk/web-pubsub/web-pubsub-client-protobuf/) |\n| OpenTelemetry Instrumentation | npm [1.0.0](https://www.npmjs.com/package/@azure/opentelemetry-instrumentation-azure-sdk/v/1.0.0) | [docs](/javascript/api/overview/azure/opentelemetry-instrumentation-azure-sdk-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/opentelemetry-instrumentation-azure-sdk_1.0.0/sdk/instrumentation/opentelemetry-instrumentation-azure-sdk/) |\n| Web PubSub CloudEvents Handlers for Express | npm [1.0.6](https://www.npmjs.com/package/@azure/web-pubsub-express/v/1.0.6) | [docs](/javascript/api/overview/azure/web-pubsub-express-readme) | GitHub [1.0.6](https://github.com/Azure/azure-sdk-for-js/tree/@azure/web-pubsub-express_1.0.6/sdk/web-pubsub/web-pubsub-express/) |\n| @azure/arm-authorization-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-authorization-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-authorization-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-authorization-profile-2020-09-01-hybrid_2.1.0/sdk/authorization/arm-authorization-profile-2020-09-01-hybrid/) |\n| @azure/arm-commerce-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-commerce-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-commerce-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-commerce-profile-2020-09-01-hybrid_2.1.0/sdk/commerce/arm-commerce-profile-2020-09-01-hybrid/) |\n| @azure/arm-compute-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-compute-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-compute-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-compute-profile-2020-09-01-hybrid_2.1.0/sdk/compute/arm-compute-profile-2020-09-01-hybrid/) |\n| @azure/arm-databoxedge-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-databoxedge-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-databoxedge-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-databoxedge-profile-2020-09-01-hybrid_2.1.0/sdk/databoxedge/arm-databoxedge-profile-2020-09-01-hybrid/) |\n| @azure/arm-dns-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-dns-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-dns-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dns-profile-2020-09-01-hybrid_2.1.0/sdk/dns/arm-dns-profile-2020-09-01-hybrid/) |\n| @azure/arm-eventhub-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-eventhub-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-eventhub-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-eventhub-profile-2020-09-01-hybrid_2.1.0/sdk/eventhub/arm-eventhub-profile-2020-09-01-hybrid/) |\n| @azure/arm-keyvault-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-keyvault-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-keyvault-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-keyvault-profile-2020-09-01-hybrid_2.1.0/sdk/keyvault/arm-keyvault-profile-2020-09-01-hybrid/) |\n| @azure/arm-locks-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-locks-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-locks-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-locks-profile-2020-09-01-hybrid_2.1.0/sdk/locks/arm-locks-profile-2020-09-01-hybrid/) |\n| @azure/arm-monitor-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-monitor-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-monitor-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-monitor-profile-2020-09-01-hybrid_2.1.0/sdk/monitor/arm-monitor-profile-2020-09-01-hybrid/) |\n| @azure/arm-network-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-network-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-network-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-network-profile-2020-09-01-hybrid_2.1.0/sdk/network/arm-network-profile-2020-09-01-hybrid/) |\n| @azure/arm-policy-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-policy-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-policy-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-policy-profile-2020-09-01-hybrid_2.1.0/sdk/policy/arm-policy-profile-2020-09-01-hybrid/) |\n| @azure/arm-resources-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-resources-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-resources-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resources-profile-2020-09-01-hybrid_2.1.0/sdk/resources/arm-resources-profile-2020-09-01-hybrid/) |\n| @azure/arm-storage-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-storage-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-storage-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-storage-profile-2020-09-01-hybrid_2.1.0/sdk/storage/arm-storage-profile-2020-09-01-hybrid/) |\n| @azure/arm-subscriptions-profile-2020-09-01-hybrid | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-subscriptions-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-subscriptions-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-subscriptions-profile-2020-09-01-hybrid_2.1.0/sdk/subscription/arm-subscriptions-profile-2020-09-01-hybrid/) |\n| Anomaly Detector - RLC | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure-rest/ai-anomaly-detector/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure-rest/ai-anomaly-detector_1.0.0-beta.1/sdk/anomalydetector/ai-anomaly-detector-rest) |\n| Resource Management - AD External Identities | npm [1.0.3](https://www.npmjs.com/package/@azure/arm-azureadexternalidentities/v/1.0.3) | [docs](/javascript/api/overview/azure/arm-azureadexternalidentities-readme) | GitHub [1.0.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-azureadexternalidentities_1.0.3/sdk/azureadexternalidentities/arm-azureadexternalidentities/) |\n| Resource Management - Advisor | npm [3.2.0](https://www.npmjs.com/package/@azure/arm-advisor/v/3.2.0) | [docs](/javascript/api/overview/azure/arm-advisor-readme) | GitHub [3.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/advisor/arm-advisor) |\n| Resource Management - Agriculture Platform | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-agricultureplatform/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-agricultureplatform-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-agricultureplatform_1.0.0-beta.1/sdk/agricultureplatform/arm-agricultureplatform/) |\n| Resource Management - Agrifood | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-agrifood/v/1.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-agrifood-readme) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-agrifood_1.0.0-beta.5/sdk/agrifood/arm-agrifood/) |\n| Resource Management - Alertprocessingrules | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-alertprocessingrules/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-alertprocessingrules-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-alertprocessingrules_1.0.0-beta.1/sdk/alertprocessingrules/arm-alertprocessingrules/) |\n| Resource Management - Alertrulerecommendations | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-alertrulerecommendations/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-alertrulerecommendations-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-alertrulerecommendations_1.0.0-beta.1/sdk/alertrulerecommendations/arm-alertrulerecommendations/) |\n| Resource Management - Alertsmanagement | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-alertsmanagement/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-alertsmanagement-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-alertsmanagement_1.0.0-beta.1/sdk/alertsmanagement/arm-alertsmanagement/) |\n| Resource Management - Analysis Services | npm [4.1.3](https://www.npmjs.com/package/@azure/arm-analysisservices/v/4.1.3) | [docs](/javascript/api/overview/azure/arm-analysisservices-readme) | GitHub [4.1.3](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/analysisservices/arm-analysisservices) |\n| Resource Management - API Center | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-apicenter/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-apicenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-apicenter_1.0.0/sdk/apicenter/arm-apicenter/) |\n| Resource Management - API Management | npm [10.0.0](https://www.npmjs.com/package/@azure/arm-apimanagement/v/10.0.0) | [docs](/javascript/api/overview/azure/arm-apimanagement-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/apimanagement/arm-apimanagement) |\n| Resource Management - App Compliance Automation | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-appcomplianceautomation/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-appcomplianceautomation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-appcomplianceautomation_1.0.0/sdk/appcomplianceautomation/arm-appcomplianceautomation/) |\n| Resource Management - App Configuration | npm [5.0.0](https://www.npmjs.com/package/@azure/arm-appconfiguration/v/5.0.0)<br>npm [6.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-appconfiguration/v/6.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-appconfiguration-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/appconfiguration/arm-appconfiguration) |\n| Resource Management - App Platform | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-appplatform/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-appplatform-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-appplatform_3.0.0/sdk/appplatform/arm-appplatform) |\n| Resource Management - App Service | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/arm-appservice/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/appservice/arm-appservice-rest) |\n| Resource Management - App Service | npm [18.0.0](https://www.npmjs.com/package/@azure/arm-appservice/v/18.0.0) | [docs](/javascript/api/overview/azure/arm-appservice-readme) | GitHub [18.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/appservice/arm-appservice) |\n| Resource Management - App Service | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-appservice-profile-2020-09-01-hybrid/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-appservice-profile-2020-09-01-hybrid-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-appservice-profile-2020-09-01-hybrid_2.1.0/sdk/appservice/arm-appservice-profile-2020-09-01-hybrid/) |\n| Resource Management - Application Insights | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-appinsights/v/4.0.0)<br>npm [5.0.0-beta.8](https://www.npmjs.com/package/@azure/arm-appinsights/v/5.0.0-beta.8) | [docs](/javascript/api/overview/azure/arm-appinsights-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/applicationinsights/arm-appinsights) |\n| Resource Management - Appnetwork | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-appnetwork/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-appnetwork_1.0.0-beta.1/sdk/appnetwork/arm-appnetwork/) |\n| Resource Management - Arize AI Observability Eval | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-arizeaiobservabilityeval/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-arizeaiobservabilityeval-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-arizeaiobservabilityeval_1.0.0/sdk/liftrarize/arm-arizeaiobservabilityeval/) |\n| Resource Management - Artifactsigning | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-artifactsigning/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-artifactsigning-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-artifactsigning_1.0.0/sdk/artifactsigning/arm-artifactsigning/) |\n| Resource Management - Astro | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-astro/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-astro-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-astro_1.0.0-beta.1/sdk/astro/arm-astro/) |\n| Resource Management - Attestation | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-attestation/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-attestation-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-attestation_2.1.0/sdk/attestation/arm-attestation/) |\n| Resource Management - Authorization | npm [9.0.0](https://www.npmjs.com/package/@azure/arm-authorization/v/9.0.0)<br>npm [10.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-authorization/v/10.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-authorization-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/authorization/arm-authorization) |\n| Resource Management - Automanage | npm [1.0.2](https://www.npmjs.com/package/@azure/arm-automanage/v/1.0.2) | [docs](/javascript/api/overview/azure/arm-automanage-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-automanage_1.0.2/sdk/automanage/arm-automanage/) |\n| Resource Management - Automation | npm [10.1.1](https://www.npmjs.com/package/@azure/arm-automation/v/10.1.1)<br>npm [11.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-automation/v/11.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-automation-readme) | GitHub [10.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/automation/arm-automation) |\n| Resource Management - Azure AI Search | npm [3.3.0](https://www.npmjs.com/package/@azure/arm-search/v/3.3.0)<br>npm [4.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-search/v/4.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-search-readme) | GitHub [3.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/search/arm-search) |\n| Resource Management - Azure Stack | npm [2.1.1](https://www.npmjs.com/package/@azure/arm-azurestack/v/2.1.1)<br>npm [3.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-azurestack/v/3.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-azurestack-readme) | GitHub [2.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/azurestack/arm-azurestack) |\n| Resource Management - Azure Stack HCI | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-azurestackhci/v/4.0.0)<br>npm [4.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-azurestackhci/v/4.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-azurestackhci-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-azurestackhci_4.0.0/sdk/azurestackhci/arm-azurestackhci/)<br>GitHub [4.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-azurestackhci_4.1.0-beta.1/sdk/azurestackhci/arm-azurestackhci/) |\n| Resource Management - Azure VMware Solution | npm [7.1.0](https://www.npmjs.com/package/@azure/arm-avs/v/7.1.0) | [docs](/javascript/api/overview/azure/arm-avs-readme) | GitHub [7.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/avs/arm-avs) |\n| Resource Management - Azurestackhcivm | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-azurestackhcivm/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-azurestackhcivm-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-azurestackhcivm_1.0.0-beta.1/sdk/azurestackhcivm/arm-azurestackhcivm/) |\n| Resource Management - BareMetal Infrastructure | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-baremetalinfrastructure/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-baremetalinfrastructure-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-baremetalinfrastructure_1.0.0-beta.2/sdk/baremetalinfrastructure/arm-baremetalinfrastructure/) |\n| Resource Management - Batch | npm [11.0.0](https://www.npmjs.com/package/@azure/arm-batch/v/11.0.0) | [docs](/javascript/api/overview/azure/arm-batch-readme) | GitHub [11.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/batch/arm-batch) |\n| Resource Management - Billing | npm [5.0.0](https://www.npmjs.com/package/@azure/arm-billing/v/5.0.0) | [docs](/javascript/api/overview/azure/arm-billing-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/billing/arm-billing) |\n| Resource Management - Billing Benefits | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-billingbenefits/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-billingbenefits-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-billingbenefits_1.0.0/sdk/billingbenefits/arm-billingbenefits/) |\n| Resource Management - Bot Service | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-botservice/v/4.0.0) | [docs](/javascript/api/overview/azure/arm-botservice-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/botservice/arm-botservice) |\n| Resource Management - Carbonoptimization | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-carbonoptimization/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-carbonoptimization-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-carbonoptimization_1.0.0/sdk/carbonoptimization/arm-carbonoptimization/) |\n| Resource Management - Certificateregistration | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-certificateregistration/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-certificateregistration-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-certificateregistration_1.0.0-beta.1/sdk/certificateregistration/arm-certificateregistration/) |\n| Resource Management - Change Analysis | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-changeanalysis/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-changeanalysis-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-changeanalysis_2.1.0/sdk/changeanalysis/arm-changeanalysis/) |\n| Resource Management - Changes | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-changes/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-changes-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-changes_1.1.0/sdk/changes/arm-changes/) |\n| Resource Management - Chaos | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-chaos/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-chaos-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-chaos_2.0.0/sdk/chaos/arm-chaos/) |\n| Resource Management - Cognitive Services | npm [8.1.0](https://www.npmjs.com/package/@azure/arm-cognitiveservices/v/8.1.0)<br>npm [9.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-cognitiveservices/v/9.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-cognitiveservices-readme) | GitHub [8.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/cognitiveservices/arm-cognitiveservices) |\n| Resource Management - Commerce | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-commerce/v/3.0.0)<br>npm [4.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-commerce/v/4.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-commerce-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/commerce/arm-commerce) |\n| Resource Management - Commitment Plans | npm [1.3.1](https://www.npmjs.com/package/@azure/arm-commitmentplans/v/1.3.1)<br>npm [2.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-commitmentplans/v/2.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-commitmentplans-readme) | GitHub [1.3.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/machinelearning/arm-commitmentplans) |\n| Resource Management - Communication | npm [4.2.0](https://www.npmjs.com/package/@azure/arm-communication/v/4.2.0)<br>npm [5.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-communication/v/5.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-communication-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-communication_4.2.0/sdk/communication/arm-communication/)<br>GitHub [5.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-communication_5.0.0-beta.1/sdk/communication/arm-communication/) |\n| Resource Management - Compute | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/arm-compute/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-compute-rest) |\n| Resource Management - Compute | npm [24.0.0](https://www.npmjs.com/package/@azure/arm-compute/v/24.0.0) | [docs](/javascript/api/overview/azure/arm-compute-readme) | GitHub [24.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/compute/arm-compute) |\n| Resource Management - Compute Fleet | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-computefleet/v/1.0.0)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-computefleet/v/2.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-computefleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computefleet_1.0.0/sdk/computefleet/arm-computefleet/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computefleet_2.0.0-beta.1/sdk/computefleet/arm-computefleet/) |\n| Resource Management - Compute Schedule | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-computeschedule/v/1.1.0)<br>npm [1.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-computeschedule/v/1.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-computeschedule-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computeschedule_1.1.0/sdk/computeschedule/arm-computeschedule/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computeschedule_1.2.0-beta.1/sdk/computeschedule/arm-computeschedule/) |\n| Resource Management - Computebulkactions | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-computebulkactions/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-computebulkactions-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computebulkactions_1.0.0-beta.1/sdk/computebulkactions/arm-computebulkactions/) |\n| Resource Management - Computelimit | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-computelimit/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-computelimit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computelimit_1.0.0/sdk/computelimit/arm-computelimit/) |\n| Resource Management - Computerecommender | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-computerecommender/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-computerecommender-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-computerecommender_1.0.0/sdk/compute/arm-computerecommender/) |\n| Resource Management - Confidential Ledger | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-confidentialledger/v/1.2.0)<br>npm [1.3.0-beta.3](https://www.npmjs.com/package/@azure/arm-confidentialledger/v/1.3.0-beta.3) | [docs](/javascript/api/overview/azure/arm-confidentialledger-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-confidentialledger_1.2.0/sdk/confidentialledger/arm-confidentialledger/)<br>GitHub [1.3.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-confidentialledger_1.3.0-beta.3/sdk/confidentialledger/arm-confidentialledger/) |\n| Resource Management - Confluent | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-confluent/v/3.1.0)<br>npm [4.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-confluent/v/4.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-confluent-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/confluent/arm-confluent) |\n| Resource Management - Connected Cache | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-connectedcache/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-connectedcache-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-connectedcache_1.0.0-beta.1/sdk/connectedcache/arm-connectedcache/) |\n| Resource Management - Connected VMware | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-connectedvmware/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-connectedvmware-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-connectedvmware_1.0.0/sdk/connectedvmware/arm-connectedvmware/) |\n| Resource Management - Consumption | npm [9.2.0](https://www.npmjs.com/package/@azure/arm-consumption/v/9.2.0) | [docs](/javascript/api/overview/azure/arm-consumption-readme) | GitHub [9.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/consumption/arm-consumption) |\n| Resource Management - Container Apps | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-appcontainers/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-appcontainers-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-appcontainers_3.0.0/sdk/appcontainers/arm-appcontainers/) |\n| Resource Management - Container Instances | npm [9.1.0](https://www.npmjs.com/package/@azure/arm-containerinstance/v/9.1.0)<br>npm [9.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-containerinstance/v/9.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-containerinstance-readme) | GitHub [9.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/containerinstance/arm-containerinstance) |\n| Resource Management - Container Orchestrator Runtime | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-containerorchestratorruntime/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-containerorchestratorruntime-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-containerorchestratorruntime_1.0.0-beta.1/sdk/kubernetesruntime/arm-containerorchestratorruntime/) |\n| Resource Management - Container Registry | npm [12.0.0](https://www.npmjs.com/package/@azure/arm-containerregistry/v/12.0.0)<br>npm [12.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-containerregistry/v/12.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-containerregistry-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/containerregistry/arm-containerregistry) |\n| Resource Management - Container Service | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/arm-containerservice/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/containerservice/arm-containerservice-rest) |\n| Resource Management - Container Service | npm [25.1.0](https://www.npmjs.com/package/@azure/arm-containerservice/v/25.1.0) | [docs](/javascript/api/overview/azure/arm-containerservice-readme) | GitHub [25.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/containerservice/arm-containerservice) |\n| Resource Management - Container Service Fleet | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-containerservicefleet/v/2.0.0)<br>npm [2.1.0-beta.3](https://www.npmjs.com/package/@azure/arm-containerservicefleet/v/2.1.0-beta.3) | [docs](/javascript/api/overview/azure/arm-containerservicefleet-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-containerservicefleet_2.0.0/sdk/containerservice/arm-containerservicefleet/)<br>GitHub [2.1.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-containerservicefleet_2.1.0-beta.3/sdk/containerservice/arm-containerservicefleet/) |\n| Resource Management - Containerregistrytasks | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-containerregistrytasks/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-containerregistrytasks-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-containerregistrytasks_1.0.0-beta.1/sdk/containerregistry/arm-containerregistrytasks/) |\n| Resource Management - Containerservicesafeguards | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-containerservicesafeguards/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-containerservicesafeguards-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-containerservicesafeguards_1.0.0-beta.1/sdk/containerservice/arm-containerservicesafeguards/) |\n| Resource Management - Content Delivery Network | npm [9.1.0](https://www.npmjs.com/package/@azure/arm-cdn/v/9.1.0) | [docs](/javascript/api/overview/azure/arm-cdn-readme) | GitHub [9.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/cdn/arm-cdn) |\n| Resource Management - Cosmos DB | npm [16.4.0](https://www.npmjs.com/package/@azure/arm-cosmosdb/v/16.4.0)<br>npm [17.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-cosmosdb/v/17.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-cosmosdb-readme) | GitHub [16.4.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/cosmosdb/arm-cosmosdb) |\n| Resource Management - CosmosDB for PostgreSQL | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-cosmosdbforpostgresql/v/1.0.0)<br>npm [1.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-cosmosdbforpostgresql/v/1.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-cosmosdbforpostgresql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-cosmosdbforpostgresql_1.0.0/sdk/cosmosforpostgresql/arm-cosmosdbforpostgresql/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-cosmosdbforpostgresql_1.1.0-beta.1/sdk/cosmosforpostgresql/arm-cosmosdbforpostgresql/) |\n| Resource Management - Cost Management | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-costmanagement/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-costmanagement-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-costmanagement_1.0.0-beta.1/sdk/cost-management/arm-costmanagement/) |\n| Resource Management - Customer Insights | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-customerinsights/v/4.1.0) | [docs](/javascript/api/overview/azure/arm-customerinsights-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/customer-insights/arm-customerinsights) |\n| Resource Management - Data Boundaries | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-databoundaries/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-databoundaries-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-databoundaries_1.0.0-beta.1/sdk/databoundaries/arm-databoundaries/) |\n| Resource Management - Data Box | npm [5.1.0](https://www.npmjs.com/package/@azure/arm-databox/v/5.1.0) | [docs](/javascript/api/overview/azure/arm-databox-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/databox/arm-databox) |\n| Resource Management - Data Box Edge | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-databoxedge/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-databoxedge-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-databoxedge_2.1.0/sdk/databoxedge/arm-databoxedge/) |\n| Resource Management - Data Catalog | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-datacatalog/v/4.1.0) | [docs](/javascript/api/overview/azure/arm-datacatalog-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/datacatalog/arm-datacatalog) |\n| Resource Management - Data Factory | npm [19.0.0](https://www.npmjs.com/package/@azure/arm-datafactory/v/19.0.0)<br>npm [20.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-datafactory/v/20.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-datafactory-readme) | GitHub [19.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/datafactory/arm-datafactory) |\n| Resource Management - Data Lake Analytics | npm [1.1.1](https://www.npmjs.com/package/@azure/arm-datalake-analytics/v/1.1.1)<br>npm [2.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-datalake-analytics/v/2.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-datalake-analytics-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/datalake-analytics/arm-datalake-analytics) |\n| Resource Management - Data Migration | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-datamigration/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-datamigration-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/datamigration/arm-datamigration) |\n| Resource Management - Data Protection | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-dataprotection/v/4.0.0) | [docs](/javascript/api/overview/azure/arm-dataprotection-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dataprotection_4.0.0/sdk/dataprotection/arm-dataprotection/) |\n| Resource Management - Database Watcher | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-databasewatcher/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-databasewatcher_1.0.0-beta.1/sdk/databasewatcher/arm-databasewatcher/) |\n| Resource Management - Databricks | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-databricks/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-databricks-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/databricks/arm-databricks) |\n| Resource Management - Datadog | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-datadog/v/3.1.0) | [docs](/javascript/api/overview/azure/arm-datadog-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-datadog_3.1.0/sdk/datadog/arm-datadog/) |\n| Resource Management - Defender EASM | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-defendereasm/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-defendereasm-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-defendereasm_1.0.0-beta.1/sdk/defendereasm/arm-defendereasm/) |\n| Resource Management - Dell-Storage | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-dell-storage/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-dell-storage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dell-storage_1.0.0/sdk/dell/arm-dell-storage/) |\n| Resource Management - Dependencymap | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-dependencymap/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dependencymap_1.0.0-beta.1/sdk/dependencymap/arm-dependencymap/) |\n| Resource Management - Deployment Manager | npm [3.1.1](https://www.npmjs.com/package/@azure/arm-deploymentmanager/v/3.1.1)<br>npm [4.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-deploymentmanager/v/4.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-deploymentmanager-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/deploymentmanager/arm-deploymentmanager) |\n| Resource Management - Deployment Stacks | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-resourcesdeploymentstacks/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-resourcesdeploymentstacks-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourcesdeploymentstacks_1.0.0/sdk/resourcesdeploymentstacks/arm-resourcesdeploymentstacks/) |\n| Resource Management - Desktop Virtualization | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-desktopvirtualization/v/1.2.0) | [docs](/javascript/api/overview/azure/arm-desktopvirtualization-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-desktopvirtualization_1.2.0/sdk/desktopvirtualization/arm-desktopvirtualization/) |\n| Resource Management - Dev Center | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-devcenter/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-devcenter-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-devcenter_1.1.0/sdk/devcenter/arm-devcenter/) |\n| Resource Management - Dev Spaces | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-devspaces/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-devspaces-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/devspaces/arm-devspaces) |\n| Resource Management - DevHub | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-devhub/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-devhub-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-devhub_1.0.0-beta.3/sdk/devhub/arm-devhub/) |\n| Resource Management - Device Provisioning Services | npm [5.1.0](https://www.npmjs.com/package/@azure/arm-deviceprovisioningservices/v/5.1.0)<br>npm [6.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-deviceprovisioningservices/v/6.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-deviceprovisioningservices-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/deviceprovisioningservices/arm-deviceprovisioningservices) |\n| Resource Management - Device Registry | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-deviceregistry/v/1.1.0)<br>npm [1.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-deviceregistry/v/1.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-deviceregistry-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-deviceregistry_1.1.0/sdk/deviceregistry/arm-deviceregistry/)<br>GitHub [1.2.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-deviceregistry_1.2.0-beta.1/sdk/deviceregistry/arm-deviceregistry/) |\n| Resource Management - Device Update | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-deviceupdate/v/1.2.0) | [docs](/javascript/api/overview/azure/arm-deviceupdate-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-deviceupdate_1.2.0/sdk/deviceupdate/arm-deviceupdate/) |\n| Resource Management - DevOps Infrastructure | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-devopsinfrastructure/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-devopsinfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-devopsinfrastructure_1.0.0/sdk/devopsinfrastructure/arm-devopsinfrastructure/) |\n| Resource Management - DevTest Labs | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-devtestlabs/v/4.1.0) | [docs](/javascript/api/overview/azure/arm-devtestlabs-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/devtestlabs/arm-devtestlabs) |\n| Resource Management - Digital Twins | npm [3.3.0](https://www.npmjs.com/package/@azure/arm-digitaltwins/v/3.3.0) | [docs](/javascript/api/overview/azure/arm-digitaltwins-readme) | GitHub [3.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/digitaltwins/arm-digitaltwins) |\n| Resource Management - Disconnectedoperations | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-disconnectedoperations/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-disconnectedoperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-disconnectedoperations_1.0.0/sdk/disconnectedoperations/arm-disconnectedoperations/) |\n| Resource Management - DNS | npm [5.1.0](https://www.npmjs.com/package/@azure/arm-dns/v/5.1.0)<br>npm [5.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-dns/v/5.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-dns-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/dns/arm-dns) |\n| Resource Management - DNS Resolver | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-dnsresolver/v/1.2.0)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-dnsresolver/v/2.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-dnsresolver-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dnsresolver_1.2.0/sdk/dnsresolver/arm-dnsresolver/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dnsresolver_2.0.0-beta.1/sdk/dnsresolver/arm-dnsresolver/) |\n| Resource Management - Domain Services | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-domainservices/v/4.1.0) | [docs](/javascript/api/overview/azure/arm-domainservices-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/domainservices/arm-domainservices) |\n| Resource Management - Domainregistration | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-domainregistration/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-domainregistration-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-domainregistration_1.0.0-beta.1/sdk/domainregistration/arm-domainregistration/) |\n| Resource Management - Durable Task | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-durabletask/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-durabletask-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-durabletask_1.1.0/sdk/durabletask/arm-durabletask/) |\n| Resource Management - Dynatrace | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-dynatrace/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-dynatrace-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dynatrace_2.0.0/sdk/dynatrace/arm-dynatrace/) |\n| Resource Management - Edge Zones | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-edgezones/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-edgezones-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-edgezones_1.0.0-beta.3/sdk/edgezones/arm-edgezones/) |\n| Resource Management - Edgeactions | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-edgeactions/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-edgeactions-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-edgeactions_1.0.0-beta.1/sdk/edgeactions/arm-edgeactions/) |\n| Resource Management - Education | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-education/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-education-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-education_1.0.0-beta.3/sdk/education/arm-education/) |\n| Resource Management - Elastic | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-elastic/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-elastic-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-elastic_2.0.0/sdk/elastic/arm-elastic/) |\n| Resource Management - Elasticsan | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-elasticsan/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-elasticsan-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-elasticsan_2.0.0/sdk/elasticsans/arm-elasticsan/) |\n| Resource Management - Event Grid | npm [14.2.0](https://www.npmjs.com/package/@azure/arm-eventgrid/v/14.2.0)<br>npm [15.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-eventgrid/v/15.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-eventgrid-readme) | GitHub [14.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/eventgrid/arm-eventgrid) |\n| Resource Management - Event Hubs | npm [5.2.0](https://www.npmjs.com/package/@azure/arm-eventhub/v/5.2.0)<br>npm [5.3.0-beta.1](https://www.npmjs.com/package/@azure/arm-eventhub/v/5.3.0-beta.1) | [docs](/javascript/api/overview/azure/arm-eventhub-readme) | GitHub [5.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/eventhub/arm-eventhub) |\n| Resource Management - Extended Location | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-extendedlocation/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-extendedlocation-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-extendedlocation_1.0.0-beta.3/sdk/extendedlocation/arm-extendedlocation/) |\n| Resource Management - Fabric | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-fabric/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-fabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-fabric_1.0.0/sdk/fabric/arm-fabric/) |\n| Resource Management - Features | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-features/v/3.1.0) | [docs](/javascript/api/overview/azure/arm-features-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/features/arm-features) |\n| Resource Management - Fileshares | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-fileshares/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-fileshares-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-fileshares_1.0.0-beta.1/sdk/fileshares/arm-fileshares/) |\n| Resource Management - Fluid Relay | npm [1.0.1](https://www.npmjs.com/package/@azure/arm-fluidrelay/v/1.0.1) | [docs](/javascript/api/overview/azure/arm-fluidrelay-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-fluidrelay_1.0.1/sdk/fluidrelay/arm-fluidrelay/) |\n| Resource Management - Front Door | npm [5.3.0](https://www.npmjs.com/package/@azure/arm-frontdoor/v/5.3.0) | [docs](/javascript/api/overview/azure/arm-frontdoor-readme) | GitHub [5.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/frontdoor/arm-frontdoor) |\n| Resource Management - Graph Services | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-graphservices/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-graphservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-graphservices_1.0.0/sdk/graphservices/arm-graphservices/) |\n| Resource Management - Guest Configuration | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-guestconfiguration/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-guestconfiguration-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-guestconfiguration_1.0.0-beta.1/sdk/guestconfiguration/arm-guestconfiguration/) |\n| Resource Management - HANA on Azure | npm [3.1.1](https://www.npmjs.com/package/@azure/arm-hanaonazure/v/3.1.1)<br>npm [4.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-hanaonazure/v/4.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-hanaonazure-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/hanaonazure/arm-hanaonazure) |\n| Resource Management - Hardware Security Modules | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-hardwaresecuritymodules/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-hardwaresecuritymodules-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hardwaresecuritymodules_2.0.0/sdk/hardwaresecuritymodules/arm-hardwaresecuritymodules/) |\n| Resource Management - HDInsight | npm [1.2.1](https://www.npmjs.com/package/@azure/arm-hdinsight/v/1.2.1)<br>npm [1.3.0-beta.2](https://www.npmjs.com/package/@azure/arm-hdinsight/v/1.3.0-beta.2) | [docs](/javascript/api/overview/azure/arm-hdinsight-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/hdinsight/arm-hdinsight) |\n| Resource Management - HDInsight Containers | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-hdinsightcontainers/v/1.0.0-beta.3) |  | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hdinsightcontainers_1.0.0-beta.3/sdk/hdinsight/arm-hdinsightcontainers/) |\n| Resource Management - Health Bot | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-healthbot/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-healthbot-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-healthbot_2.1.0/sdk/healthbot/arm-healthbot/) |\n| Resource Management - Health Data AI  Services | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-healthdataaiservices/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-healthdataaiservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-healthdataaiservices_1.0.0/sdk/healthdataaiservices/arm-healthdataaiservices/) |\n| Resource Management - Healthcare APIs | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-healthcareapis/v/3.1.0) | [docs](/javascript/api/overview/azure/arm-healthcareapis-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-healthcareapis_3.1.0/sdk/healthcareapis/arm-healthcareapis/) |\n| Resource Management - Hybrid Compute | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-hybridcompute/v/4.0.0)<br>npm [5.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-hybridcompute/v/5.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-hybridcompute-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridcompute_4.0.0/sdk/hybridcompute/arm-hybridcompute/)<br>GitHub [5.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridcompute_5.0.0-beta.1/sdk/hybridcompute/arm-hybridcompute/) |\n| Resource Management - Hybrid Connectivity | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-hybridconnectivity/v/1.0.0)<br>npm [2.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-hybridconnectivity/v/2.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-hybridconnectivity-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridconnectivity_1.0.0/sdk/hybridconnectivity/arm-hybridconnectivity/)<br>GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridconnectivity_2.0.0-beta.2/sdk/hybridconnectivity/arm-hybridconnectivity/) |\n| Resource Management - Hybrid Container Service | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-hybridcontainerservice/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-hybridcontainerservice-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridcontainerservice_1.0.0/sdk/hybridcontainerservice/arm-hybridcontainerservice/) |\n| Resource Management - Hybrid Kubernetes | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-hybridkubernetes/v/2.1.0)<br>npm [3.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-hybridkubernetes/v/3.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-hybridkubernetes-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridkubernetes_2.1.0/sdk/hybridkubernetes/arm-hybridkubernetes/)<br>GitHub [3.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridkubernetes_3.0.0-beta.1/sdk/hybridkubernetes/arm-hybridkubernetes/) |\n| Resource Management - Hybrid Network | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-hybridnetwork/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-hybridnetwork-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-hybridnetwork_1.0.0-beta.1/sdk/hybridnetwork/arm-hybridnetwork/) |\n| Resource Management - Image Builder | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-imagebuilder/v/4.1.0) | [docs](/javascript/api/overview/azure/arm-imagebuilder-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-imagebuilder_4.1.0/sdk/imagebuilder/arm-imagebuilder/) |\n| Resource Management - Impact Reporting | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-impactreporting/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-impactreporting_1.0.0-beta.1/sdk/impactreporting/arm-impactreporting/) |\n| Resource Management - Informatica Data Management | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-informaticadatamanagement/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-informaticadatamanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-informaticadatamanagement_1.0.0/sdk/informatica/arm-informaticadatamanagement/) |\n| Resource Management - IoT Central | npm [6.0.0](https://www.npmjs.com/package/@azure/arm-iotcentral/v/6.0.0)<br>npm [7.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-iotcentral/v/7.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-iotcentral-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/iotcentral/arm-iotcentral) |\n| Resource Management - IoT Firmware Defense | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-iotfirmwaredefense/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-iotfirmwaredefense-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-iotfirmwaredefense_2.0.0/sdk/iotfirmwaredefense/arm-iotfirmwaredefense/) |\n| Resource Management - IoT Hub | npm [6.3.0](https://www.npmjs.com/package/@azure/arm-iothub/v/6.3.0) | [docs](/javascript/api/overview/azure/arm-iothub-readme) | GitHub [6.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/iothub/arm-iothub) |\n| Resource Management - IoT Operations | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-iotoperations/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-iotoperations-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-iotoperations_2.0.0/sdk/iotoperations/arm-iotoperations/) |\n| Resource Management - Key Vault | npm [5.0.0](https://www.npmjs.com/package/@azure/arm-keyvault/v/5.0.0) | [docs](/javascript/api/overview/azure/arm-keyvault-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/keyvault/arm-keyvault) |\n| Resource Management - Kubernetes Configuration | npm [6.1.0](https://www.npmjs.com/package/@azure/arm-kubernetesconfiguration/v/6.1.0) | [docs](/javascript/api/overview/azure/arm-kubernetesconfiguration-readme) | GitHub [6.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/kubernetesconfiguration/arm-kubernetesconfiguration) |\n| Resource Management - Kubernetesconfiguration-Extensions | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-kubernetesconfiguration-extensions/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-kubernetesconfiguration-extensions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-kubernetesconfiguration-extensions_1.0.0/sdk/kubernetesconfiguration/arm-kubernetesconfiguration-extensions/) |\n| Resource Management - Kubernetesconfiguration-Extensiontypes | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-kubernetesconfiguration-extensiontypes/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-kubernetesconfiguration-extensiontypes-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-kubernetesconfiguration-extensiontypes_1.0.0-beta.1/sdk/kubernetesconfiguration/arm-kubernetesconfiguration-extensiontypes/) |\n| Resource Management - Kubernetesconfiguration-Fluxconfigurations | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-kubernetesconfiguration-fluxconfigurations/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-kubernetesconfiguration-fluxconfigurations-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-kubernetesconfiguration-fluxconfigurations_1.0.0-beta.1/sdk/kubernetesconfiguration/arm-kubernetesconfiguration-fluxconfigurations/) |\n| Resource Management - Kubernetesconfiguration-Privatelinkscopes | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-kubernetesconfiguration-privatelinkscopes/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-kubernetesconfiguration-privatelinkscopes-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-kubernetesconfiguration-privatelinkscopes_1.0.0-beta.1/sdk/kubernetesconfiguration/arm-kubernetesconfiguration-privatelinkscopes/) |\n| Resource Management - Kusto | npm [8.2.0](https://www.npmjs.com/package/@azure/arm-kusto/v/8.2.0) | [docs](/javascript/api/overview/azure/arm-kusto-readme) | GitHub [8.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/kusto/arm-kusto) |\n| Resource Management - Lab Services | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-labservices/v/3.1.0) | [docs](/javascript/api/overview/azure/arm-labservices-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/labservices/arm-labservices) |\n| Resource Management - Lambdatesthyperexecute | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-lambdatesthyperexecute/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-lambdatesthyperexecute-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-lambdatesthyperexecute_1.0.0/sdk/lambdatesthyperexecute/arm-lambdatesthyperexecute/) |\n| Resource Management - Large Instance | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-largeinstance/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-largeinstance-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-largeinstance_1.0.0-beta.1/sdk/largeinstance/arm-largeinstance/) |\n| Resource Management - Links | npm [2.0.1](https://www.npmjs.com/package/@azure/arm-links/v/2.0.1) | [docs](/javascript/api/overview/azure/arm-links-readme) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/links/arm-links) |\n| Resource Management - Load Testing | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-loadtesting/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-loadtesting-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-loadtesting_1.0.0/sdk/loadtestservice/arm-loadtesting/) |\n| Resource Management - Locks | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-locks/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-locks-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/locks/arm-locks) |\n| Resource Management - Log Analytics | npm [10.1.0](https://www.npmjs.com/package/@azure/arm-operationalinsights/v/10.1.0) | [docs](/javascript/api/overview/azure/arm-operationalinsights-readme) | GitHub [10.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/operationalinsights/arm-operationalinsights) |\n| Resource Management - Logic Apps | npm [8.2.0](https://www.npmjs.com/package/@azure/arm-logic/v/8.2.0) | [docs](/javascript/api/overview/azure/arm-logic-readme) | GitHub [8.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/logic/arm-logic) |\n| Resource Management - Machine Learning | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-machinelearning/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-machinelearning-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-machinelearning_3.0.0/sdk/machinelearning/arm-machinelearning/) |\n| Resource Management - Machine Learning Compute | npm [2.1.1](https://www.npmjs.com/package/@azure/arm-machinelearningcompute/v/2.1.1)<br>npm [3.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-machinelearningcompute/v/3.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-machinelearningcompute-readme) | GitHub [2.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/machinelearningcompute/arm-machinelearningcompute) |\n| Resource Management - Machine Learning Experimentation | npm [1.2.1](https://www.npmjs.com/package/@azure/arm-machinelearningexperimentation/v/1.2.1)<br>npm [2.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-machinelearningexperimentation/v/2.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-machinelearningexperimentation-readme) | GitHub [1.2.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/machinelearningexperimentation/arm-machinelearningexperimentation) |\n| Resource Management - Maintenance | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-maintenance/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-maintenance-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-maintenance_1.0.0-beta.2/sdk/maintenance/arm-maintenance/) |\n| Resource Management - Managed Applications | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-managedapplications/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-managedapplications-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/managedapplications/arm-managedapplications) |\n| Resource Management - Managed Grafana | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-dashboard/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-dashboard-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-dashboard_2.0.0/sdk/dashboard/arm-dashboard/) |\n| Resource Management - Managed Network Fabric | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-managednetworkfabric/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-managednetworkfabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-managednetworkfabric_1.0.0/sdk/managednetworkfabric/arm-managednetworkfabric/) |\n| Resource Management - Managed Service Identity | npm [2.2.0](https://www.npmjs.com/package/@azure/arm-msi/v/2.2.0) | [docs](/javascript/api/overview/azure/arm-msi-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/msi/arm-msi) |\n| Resource Management - Managedops | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-managedops/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-managedops-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-managedops_1.0.0-beta.2/sdk/managedops/arm-managedops/) |\n| Resource Management - Management Groups | npm [2.0.2](https://www.npmjs.com/package/@azure/arm-managementgroups/v/2.0.2) | [docs](/javascript/api/overview/azure/arm-managementgroups-readme) | GitHub [2.0.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/managementgroups/arm-managementgroups) |\n| Resource Management - Management Partner | npm [3.0.1](https://www.npmjs.com/package/@azure/arm-managementpartner/v/3.0.1) | [docs](/javascript/api/overview/azure/arm-managementpartner-readme) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/managementpartner/arm-managementpartner) |\n| Resource Management - Maps | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-maps/v/3.1.0)<br>npm [4.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-maps/v/4.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-maps-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/maps/arm-maps) |\n| Resource Management - MariaDB | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-mariadb/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-mariadb-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/mariadb/arm-mariadb) |\n| Resource Management - Marketplace | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-marketplace/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-marketplace-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-marketplace_1.0.0-beta.1/sdk/marketplace/arm-marketplace/) |\n| Resource Management - Marketplace Ordering | npm [3.1.1](https://www.npmjs.com/package/@azure/arm-marketplaceordering/v/3.1.1) | [docs](/javascript/api/overview/azure/arm-marketplaceordering-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/marketplaceordering/arm-marketplaceordering) |\n| Resource Management - Media Services | npm [13.1.0](https://www.npmjs.com/package/@azure/arm-mediaservices/v/13.1.0) | [docs](/javascript/api/overview/azure/arm-mediaservices-readme) | GitHub [13.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-mediaservices_13.1.0/sdk/mediaservices/arm-mediaservices) |\n| Resource Management - Migrate | npm [2.0.3](https://www.npmjs.com/package/@azure/arm-migrate/v/2.0.3) | [docs](/javascript/api/overview/azure/arm-migrate-readme) | GitHub [2.0.3](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/migrate/arm-migrate) |\n| Resource Management - Migration Assessment | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-migrationassessment/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-migrationassessment-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-migrationassessment_1.0.0-beta.1/sdk/migrate/arm-migrationassessment/) |\n| Resource Management - Migration Discovery SAP | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-migrationdiscoverysap/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-migrationdiscoverysap-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-migrationdiscoverysap_1.0.0-beta.1/sdk/migrationdiscovery/arm-migrationdiscoverysap/) |\n| Resource Management - Mixed Reality | npm [4.0.1](https://www.npmjs.com/package/@azure/arm-mixedreality/v/4.0.1)<br>npm [4.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-mixedreality/v/4.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-mixedreality-readme) | GitHub [4.0.1](https://github.com/Azure/azure-sdk-for-js/tree/1133631dbc5a5d6e7dd21aa735f91c48173f81b7/sdk/mixedreality/arm-mixedreality) |\n| Resource Management - ML Web Services | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-webservices/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-webservices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/machinelearning/arm-webservices) |\n| Resource Management - Mobile Network | npm [6.0.0](https://www.npmjs.com/package/@azure/arm-mobilenetwork/v/6.0.0) | [docs](/javascript/api/overview/azure/arm-mobilenetwork-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-mobilenetwork_6.0.0/sdk/mobilenetwork/arm-mobilenetwork/) |\n| Resource Management - Mongo Cluster | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-mongocluster/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-mongocluster-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-mongocluster_1.1.0/sdk/mongocluster/arm-mongocluster/) |\n| Resource Management - Mongodbatlas | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-mongodbatlas/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-mongodbatlas-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-mongodbatlas_1.0.0/sdk/mongodbatlas/arm-mongodbatlas/) |\n| Resource Management - Monitor | npm [7.0.0](https://www.npmjs.com/package/@azure/arm-monitor/v/7.0.0)<br>npm [8.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-monitor/v/8.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-monitor-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/monitor/arm-monitor) |\n| Resource Management - Monitorslis | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-monitorslis/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-monitorslis-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-monitorslis_1.0.0-beta.1/sdk/monitor/arm-monitorslis/) |\n| Resource Management - MySQL | npm [5.1.0](https://www.npmjs.com/package/@azure/arm-mysql/v/5.1.0) | [docs](/javascript/api/overview/azure/arm-mysql-readme) | GitHub [5.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/mysql/arm-mysql) |\n| Resource Management - MySQL Flexible | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-mysql-flexible/v/3.1.0)<br>npm [4.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-mysql-flexible/v/4.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-mysql-flexible-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-mysql-flexible_3.1.0/sdk/mysql/arm-mysql-flexible/)<br>GitHub [4.0.0-beta.4](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-mysql-flexible_4.0.0-beta.4/sdk/mysql/arm-mysql-flexible/) |\n| Resource Management - Neon Postgres | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-neonpostgres/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-neonpostgres-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-neonpostgres_1.0.0/sdk/neonpostgres/arm-neonpostgres/) |\n| Resource Management - NetApp Files | npm [24.0.0](https://www.npmjs.com/package/@azure/arm-netapp/v/24.0.0) | [docs](/javascript/api/overview/azure/arm-netapp-readme) | GitHub [24.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/netapp/arm-netapp) |\n| Resource Management - Network | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/arm-network/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/network/arm-network-rest) |\n| Resource Management - Network | npm [36.0.0](https://www.npmjs.com/package/@azure/arm-network/v/36.0.0) | [docs](/javascript/api/overview/azure/arm-network-readme) | GitHub [36.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/network/arm-network) |\n| Resource Management - Network Analytics | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-networkanalytics/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-networkanalytics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-networkanalytics_1.0.0/sdk/networkanalytics/arm-networkanalytics/) |\n| Resource Management - Network Cloud | npm [1.3.0](https://www.npmjs.com/package/@azure/arm-networkcloud/v/1.3.0)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-networkcloud/v/2.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-networkcloud-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-networkcloud_1.3.0/sdk/networkcloud/arm-networkcloud/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-networkcloud_2.0.0-beta.1/sdk/networkcloud/arm-networkcloud/) |\n| Resource Management - Network Function | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-networkfunction/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-networkfunction-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-networkfunction_2.0.0/sdk/networkfunction/arm-networkfunction/) |\n| Resource Management - New Relic Observability | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-newrelicobservability/v/1.1.0)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-newrelicobservability/v/2.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-newrelicobservability-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-newrelicobservability_1.1.0/sdk/newrelicobservability/arm-newrelicobservability/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-newrelicobservability_2.0.0-beta.1/sdk/newrelicobservability/arm-newrelicobservability/) |\n| Resource Management - Nginx | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-nginx/v/4.0.0) | [docs](/javascript/api/overview/azure/arm-nginx-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-nginx_4.0.0/sdk/nginx/arm-nginx/) |\n| Resource Management - Notification Hubs | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-notificationhubs/v/2.1.0)<br>npm [3.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-notificationhubs/v/3.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-notificationhubs-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/notificationhubs/arm-notificationhubs) |\n| Resource Management - Oep | npm [1.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-oep/v/1.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-oep-readme) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-oep_1.0.0-beta.3/sdk/oep/arm-oep/) |\n| Resource Management - Onlineexperimentation | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-onlineexperimentation/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-onlineexperimentation-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-onlineexperimentation_1.0.0-beta.1/sdk/onlineexperimentation/arm-onlineexperimentation/) |\n| Resource Management - Operations Management | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-operations/v/3.0.0)<br>npm [4.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-operations/v/4.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-operations-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/operationsmanagement/arm-operations) |\n| Resource Management - Oracle Database | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-oracledatabase/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-oracledatabase-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-oracledatabase_3.0.0/sdk/oracledatabase/arm-oracledatabase/) |\n| Resource Management - Orbital | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-orbital/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-orbital-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-orbital_2.0.0/sdk/orbital/arm-orbital/) |\n| Resource Management - Palo Alto Networks - Next Generation Firewall | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-paloaltonetworksngfw/v/1.2.0) | [docs](/javascript/api/overview/azure/arm-paloaltonetworksngfw-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-paloaltonetworksngfw_1.2.0/sdk/paloaltonetworksngfw/arm-paloaltonetworksngfw/) |\n| Resource Management - Peering | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-peering/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-peering-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/peering/arm-peering) |\n| Resource Management - Pinecone Vector DB | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-pineconevectordb/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-pineconevectordb-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-pineconevectordb_1.0.0-beta.2/sdk/pineconevectordb/arm-pineconevectordb/) |\n| Resource Management - Planetarycomputer | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-planetarycomputer/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-planetarycomputer-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-planetarycomputer_1.0.0/sdk/planetarycomputer/arm-planetarycomputer/) |\n| Resource Management - Playwright | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-playwright/v/1.0.0)<br>npm [1.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-playwright/v/1.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-playwright_1.0.0/sdk/playwright/arm-playwright/)<br>GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-playwright_1.1.0-beta.1/sdk/playwright/arm-playwright/) |\n| Resource Management - Playwright Testing | npm [1.0.1](https://www.npmjs.com/package/@azure/arm-playwrighttesting/v/1.0.1) | [docs](/javascript/api/overview/azure/arm-playwrighttesting-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-playwrighttesting_1.0.1/sdk/playwrighttesting/arm-playwrighttesting/) |\n| Resource Management - Policy | npm [7.0.0](https://www.npmjs.com/package/@azure/arm-policy/v/7.0.0) | [docs](/javascript/api/overview/azure/arm-policy-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/policy/arm-policy) |\n| Resource Management - Policy Insights | npm [6.0.0](https://www.npmjs.com/package/@azure/arm-policyinsights/v/6.0.0) | [docs](/javascript/api/overview/azure/arm-policyinsights-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/policyinsights/arm-policyinsights) |\n| Resource Management - Portal | npm [1.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-portal/v/1.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-portal-readme) | GitHub [1.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-portal_1.0.0-beta.5/sdk/portal/arm-portal/) |\n| Resource Management - Portalservicescopilot | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-portalservicescopilot/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-portalservicescopilot-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-portalservicescopilot_1.0.0-beta.1/sdk/portalservices/arm-portalservicescopilot/) |\n| Resource Management - PostgreSQL | npm [6.1.0](https://www.npmjs.com/package/@azure/arm-postgresql/v/6.1.0) | [docs](/javascript/api/overview/azure/arm-postgresql-readme) | GitHub [6.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/postgresql/arm-postgresql) |\n| Resource Management - Postgresql | npm [9.0.0](https://www.npmjs.com/package/@azure/arm-postgresql-flexible/v/9.0.0)<br>npm [10.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-postgresql-flexible/v/10.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-postgresql-flexible-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-postgresql-flexible_9.0.0/sdk/postgresql/arm-postgresql-flexible/)<br>GitHub [10.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-postgresql-flexible_10.0.0-beta.1/sdk/postgresql/arm-postgresql-flexible/) |\n| Resource Management - Power BI Dedicated | npm [4.0.1](https://www.npmjs.com/package/@azure/arm-powerbidedicated/v/4.0.1) | [docs](/javascript/api/overview/azure/arm-powerbidedicated-readme) | GitHub [4.0.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/powerbidedicated/arm-powerbidedicated) |\n| Resource Management - Power BI Embedded | npm [2.0.2](https://www.npmjs.com/package/@azure/arm-powerbiembedded/v/2.0.2) | [docs](/javascript/api/overview/azure/arm-powerbiembedded-readme) | GitHub [2.0.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/powerbiembedded/arm-powerbiembedded) |\n| Resource Management - Previewalertrule | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-previewalertrule/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-previewalertrule-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-previewalertrule_1.0.0-beta.1/sdk/previewalertrule/arm-previewalertrule/) |\n| Resource Management - Private DNS | npm [3.3.0](https://www.npmjs.com/package/@azure/arm-privatedns/v/3.3.0) | [docs](/javascript/api/overview/azure/arm-privatedns-readme) | GitHub [3.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/privatedns/arm-privatedns) |\n| Resource Management - Prometheusrulegroups | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-prometheusrulegroups/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-prometheusrulegroups-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-prometheusrulegroups_1.0.0-beta.1/sdk/prometheusrulegroups/arm-prometheusrulegroups/) |\n| Resource Management - Purestorageblock | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-purestorageblock/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-purestorageblock-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-purestorageblock_1.0.0/sdk/purestorageblock/arm-purestorageblock/) |\n| Resource Management - Purview | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-purview/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-purview-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-purview_1.1.0/sdk/purview/arm-purview/) |\n| Resource Management - Quantum | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-quantum/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-quantum-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-quantum_1.0.0-beta.2/sdk/quantum/arm-quantum/) |\n| Resource Management - Qumulo | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-qumulo/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-qumulo-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-qumulo_2.0.0/sdk/liftrqumulo/arm-qumulo/) |\n| Resource Management - Quota | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-quota/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-quota-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-quota_2.0.0/sdk/quota/arm-quota/) |\n| Resource Management - Recovery Services | npm [7.0.0](https://www.npmjs.com/package/@azure/arm-recoveryservices/v/7.0.0) | [docs](/javascript/api/overview/azure/arm-recoveryservices-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/recoveryservices/arm-recoveryservices) |\n| Resource Management - Recovery Services Backup | npm [13.2.0](https://www.npmjs.com/package/@azure/arm-recoveryservicesbackup/v/13.2.0)<br>npm [14.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-recoveryservicesbackup/v/14.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-recoveryservicesbackup-readme) | GitHub [13.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/recoveryservicesbackup/arm-recoveryservicesbackup) |\n| Resource Management - Recovery Services Data Replication | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-recoveryservicesdatareplication/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-recoveryservicesdatareplication-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-recoveryservicesdatareplication_1.0.0/sdk/recoveryservicesdatareplication/arm-recoveryservicesdatareplication/) |\n| Resource Management - Recovery Services Site Recovery | npm [5.3.0](https://www.npmjs.com/package/@azure/arm-recoveryservices-siterecovery/v/5.3.0)<br>npm [6.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-recoveryservices-siterecovery/v/6.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-recoveryservices-siterecovery-readme) | GitHub [5.3.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/recoveryservicessiterecovery/arm-recoveryservices-siterecovery) |\n| Resource Management - Red Hat OpenShift | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-redhatopenshift/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-redhatopenshift-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-redhatopenshift_1.0.0-beta.1/sdk/redhatopenshift/arm-redhatopenshift/) |\n| Resource Management - Redis | npm [8.2.0](https://www.npmjs.com/package/@azure/arm-rediscache/v/8.2.0) | [docs](/javascript/api/overview/azure/arm-rediscache-readme) | GitHub [8.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/redis/arm-rediscache) |\n| Resource Management - Redis Enterprise Cache | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-redisenterprisecache/v/4.0.0) | [docs](/javascript/api/overview/azure/arm-redisenterprisecache-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-redisenterprisecache_4.0.0/sdk/redisenterprise/arm-redisenterprisecache/) |\n| Resource Management - Relationships | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-relationships/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-relationships-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-relationships_1.0.0-beta.1/sdk/relationships/arm-relationships/) |\n| Resource Management - Relay | npm [3.1.1](https://www.npmjs.com/package/@azure/arm-relay/v/3.1.1) | [docs](/javascript/api/overview/azure/arm-relay-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/relay/arm-relay) |\n| Resource Management - Reservations | npm [9.0.0](https://www.npmjs.com/package/@azure/arm-reservations/v/9.0.0) | [docs](/javascript/api/overview/azure/arm-reservations-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/reservations/arm-reservations) |\n| Resource Management - Resource Connector | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-resourceconnector/v/1.0.0)<br>npm [2.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-resourceconnector/v/2.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-resourceconnector-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourceconnector_1.0.0/sdk/resourceconnector/arm-resourceconnector/)<br>GitHub [2.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourceconnector_2.0.0-beta.1/sdk/resourceconnector/arm-resourceconnector/) |\n| Resource Management - Resource Graph | npm [4.2.1](https://www.npmjs.com/package/@azure/arm-resourcegraph/v/4.2.1)<br>npm [5.0.0-beta.3](https://www.npmjs.com/package/@azure/arm-resourcegraph/v/5.0.0-beta.3) | [docs](/javascript/api/overview/azure/arm-resourcegraph-readme) | GitHub [4.2.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/resourcegraph/arm-resourcegraph) |\n| Resource Management - Resource Health | npm [4.0.0](https://www.npmjs.com/package/@azure/arm-resourcehealth/v/4.0.0)<br>npm [4.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-resourcehealth/v/4.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-resourcehealth-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/resourcehealth/arm-resourcehealth) |\n| Resource Management - Resource Mover | npm [2.2.0](https://www.npmjs.com/package/@azure/arm-resourcemover/v/2.2.0) | [docs](/javascript/api/overview/azure/arm-resourcemover-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourcemover_2.2.0/sdk/resourcemover/arm-resourcemover/) |\n| Resource Management - Resources | npm [7.0.0](https://www.npmjs.com/package/@azure/arm-resources/v/7.0.0) | [docs](/javascript/api/overview/azure/arm-resources-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/resources/arm-resources) |\n| Resource Management - Resources Deployments | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-resourcesdeployments/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-resourcesdeployments-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourcesdeployments_1.0.0-beta.1/sdk/resources/arm-resourcesdeployments/) |\n| Resource Management - Resources Subscriptions | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-resources-subscriptions/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-resources-subscriptions-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resources-subscriptions_2.1.0/sdk/resources-subscriptions/arm-resources-subscriptions/) |\n| Resource Management - Resourcesbicep | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-resourcesbicep/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-resourcesbicep-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-resourcesbicep_1.0.0-beta.1/sdk/resources/arm-resourcesbicep/) |\n| Resource Management - Scvmm | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-scvmm/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-scvmm-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-scvmm_1.0.0/sdk/scvmm/arm-scvmm/) |\n| Resource Management - Security | npm [5.0.0](https://www.npmjs.com/package/@azure/arm-security/v/5.0.0)<br>npm [6.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-security/v/6.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-security-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/security/arm-security) |\n| Resource Management - Security DevOps | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-securitydevops/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-securitydevops-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-securitydevops_1.0.0-beta.2/sdk/securitydevops/arm-securitydevops/) |\n| Resource Management - Security Insights | npm [1.0.0-beta.6](https://www.npmjs.com/package/@azure/arm-securityinsight/v/1.0.0-beta.6) | [docs](/javascript/api/overview/azure/arm-securityinsight-readme) | GitHub [1.0.0-beta.6](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-securityinsight_1.0.0-beta.6/sdk/securityinsight/arm-securityinsight/) |\n| Resource Management - Self Help | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-selfhelp/v/1.0.0)<br>npm [2.0.0-beta.5](https://www.npmjs.com/package/@azure/arm-selfhelp/v/2.0.0-beta.5) | [docs](/javascript/api/overview/azure/arm-selfhelp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-selfhelp_1.0.0/sdk/selfhelp/arm-selfhelp/)<br>GitHub [2.0.0-beta.5](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-selfhelp_2.0.0-beta.5/sdk/selfhelp/arm-selfhelp/) |\n| Resource Management - Serial Console | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-serialconsole/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-serialconsole-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/serialconsole/arm-serialconsole) |\n| Resource Management - Service Bus | npm [6.1.0](https://www.npmjs.com/package/@azure/arm-servicebus/v/6.1.0)<br>npm [6.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-servicebus/v/6.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-servicebus-readme) | GitHub [6.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/servicebus/arm-servicebus) |\n| Resource Management - Service Fabric | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure-rest/arm-servicefabric/v/1.0.0-beta.2) |  | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/servicefabric/arm-servicefabric-rest) |\n| Resource Management - Service Fabric | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-servicefabric/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-servicefabric-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/servicefabric/arm-servicefabric) |\n| Resource Management - Service Fabric Managed Clusters | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-servicefabricmanagedclusters/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-servicefabricmanagedclusters-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicefabricmanagedclusters_1.0.0/sdk/servicefabricmanagedclusters/arm-servicefabricmanagedclusters/) |\n| Resource Management - Service Fabric Mesh | npm [2.2.1](https://www.npmjs.com/package/@azure/arm-servicefabricmesh/v/2.2.1)<br>npm [3.0.0-beta.4](https://www.npmjs.com/package/@azure/arm-servicefabricmesh/v/3.0.0-beta.4) | [docs](/javascript/api/overview/azure/arm-servicefabricmesh-readme) | GitHub [2.2.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/servicefabricmesh/arm-servicefabricmesh) |\n| Resource Management - Service Linker | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-servicelinker/v/2.1.0)<br>npm [2.2.0-beta.1](https://www.npmjs.com/package/@azure/arm-servicelinker/v/2.2.0-beta.1) | [docs](/javascript/api/overview/azure/arm-servicelinker-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicelinker_2.1.0/sdk/servicelinker/arm-servicelinker/)<br>GitHub [2.2.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicelinker_2.2.0-beta.1/sdk/servicelinker/arm-servicelinker/) |\n| Resource Management - Service Map | npm [2.3.1](https://www.npmjs.com/package/@azure/arm-servicemap/v/2.3.1)<br>npm [3.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-servicemap/v/3.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-servicemap-readme) | GitHub [2.3.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/service-map/arm-servicemap) |\n| Resource Management - Service Networking | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-servicenetworking/v/2.0.0)<br>npm [2.1.0-beta.1](https://www.npmjs.com/package/@azure/arm-servicenetworking/v/2.1.0-beta.1) | [docs](/javascript/api/overview/azure/arm-servicenetworking-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicenetworking_2.0.0/sdk/servicenetworking/arm-servicenetworking/)<br>GitHub [2.1.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicenetworking_2.1.0-beta.1/sdk/servicenetworking/arm-servicenetworking/) |\n| Resource Management - Servicegroups | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-servicegroups/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-servicegroups-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-servicegroups_1.0.0-beta.1/sdk/servicegroups/arm-servicegroups/) |\n| Resource Management - SignalR | npm [5.2.0](https://www.npmjs.com/package/@azure/arm-signalr/v/5.2.0)<br>npm [6.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-signalr/v/6.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-signalr-readme) | GitHub [5.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/signalr/arm-signalr) |\n| Resource Management - Sitemanager | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-sitemanager/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-sitemanager-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-sitemanager_1.0.0/sdk/sitemanager/arm-sitemanager/) |\n| Resource Management - Sphere | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-sphere/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-sphere-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-sphere_1.0.0/sdk/sphere/arm-sphere/) |\n| Resource Management - Spring App Discovery | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-springappdiscovery/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-springappdiscovery-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-springappdiscovery_1.0.0-beta.1/sdk/springappdiscovery/arm-springappdiscovery/) |\n| Resource Management - SQL | npm [10.0.0](https://www.npmjs.com/package/@azure/arm-sql/v/10.0.0)<br>npm [11.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-sql/v/11.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-sql-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/sql/arm-sql) |\n| Resource Management - SQL Virtual Machine | npm [4.1.1](https://www.npmjs.com/package/@azure/arm-sqlvirtualmachine/v/4.1.1)<br>npm [5.0.0-beta.8](https://www.npmjs.com/package/@azure/arm-sqlvirtualmachine/v/5.0.0-beta.8) | [docs](/javascript/api/overview/azure/arm-sqlvirtualmachine-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/sqlvirtualmachine/arm-sqlvirtualmachine) |\n| Resource Management - Standby Pool | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-standbypool/v/2.0.0) | [docs](/javascript/api/overview/azure/arm-standbypool-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-standbypool_2.0.0/sdk/standbypool/arm-standbypool/) |\n| Resource Management - Storage | npm [19.1.0](https://www.npmjs.com/package/@azure/arm-storage/v/19.1.0) | [docs](/javascript/api/overview/azure/arm-storage-readme) | GitHub [19.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storage/arm-storage) |\n| Resource Management - Storage Actions | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-storageactions/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-storageactions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-storageactions_1.0.0/sdk/storageactions/arm-storageactions/) |\n| Resource Management - Storage Cache | npm [8.2.0](https://www.npmjs.com/package/@azure/arm-storagecache/v/8.2.0) | [docs](/javascript/api/overview/azure/arm-storagecache-readme) | GitHub [8.2.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storagecache/arm-storagecache) |\n| Resource Management - Storage Import/Export | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-storageimportexport/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-storageimportexport-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storageimportexport/arm-storageimportexport) |\n| Resource Management - Storage Mover | npm [3.0.1](https://www.npmjs.com/package/@azure/arm-storagemover/v/3.0.1) | [docs](/javascript/api/overview/azure/arm-storagemover-readme) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-storagemover_3.0.1/sdk/storagemover/arm-storagemover/) |\n| Resource Management - Storage Sync | npm [9.1.0](https://www.npmjs.com/package/@azure/arm-storagesync/v/9.1.0) | [docs](/javascript/api/overview/azure/arm-storagesync-readme) | GitHub [9.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storagesync/arm-storagesync) |\n| Resource Management - Storagediscovery | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-storagediscovery/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-storagediscovery-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-storagediscovery_1.0.0/sdk/storagediscovery/arm-storagediscovery/) |\n| Resource Management - StorSimple 1200 series | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-storsimple1200series/v/2.1.0) |  | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storsimple1200series/arm-storsimple1200series) |\n| Resource Management - StorSimple 8000 series | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-storsimple8000series/v/2.1.0) |  | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storsimple8000series/arm-storsimple8000series) |\n| Resource Management - Stream Analytics | npm [4.1.0](https://www.npmjs.com/package/@azure/arm-streamanalytics/v/4.1.0)<br>npm [5.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-streamanalytics/v/5.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-streamanalytics-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/streamanalytics/arm-streamanalytics) |\n| Resource Management - Subscriptions | npm [6.0.0](https://www.npmjs.com/package/@azure/arm-subscriptions/v/6.0.0) | [docs](/javascript/api/overview/azure/arm-subscriptions-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/subscription/arm-subscriptions) |\n| Resource Management - Support | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-support/v/3.0.0) | [docs](/javascript/api/overview/azure/arm-support-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/support/arm-support) |\n| Resource Management - Synapse | npm [8.0.0](https://www.npmjs.com/package/@azure/arm-synapse/v/8.0.0)<br>npm [9.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-synapse/v/9.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-synapse-readme) | GitHub [8.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/synapse/arm-synapse) |\n| Resource Management - Tenantactivitylogalerts | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-tenantactivitylogalerts/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-tenantactivitylogalerts-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-tenantactivitylogalerts_1.0.0-beta.1/sdk/tenantactivitylogalerts/arm-tenantactivitylogalerts/) |\n| Resource Management - Terraform | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-terraform/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-terraform-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-terraform_1.0.0-beta.1/sdk/terraform/arm-terraform/) |\n| Resource Management - Time Series Insights | npm [2.0.0](https://www.npmjs.com/package/@azure/arm-timeseriesinsights/v/2.0.0)<br>npm [2.1.0-beta.2](https://www.npmjs.com/package/@azure/arm-timeseriesinsights/v/2.1.0-beta.2) | [docs](/javascript/api/overview/azure/arm-timeseriesinsights-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/timeseriesinsights/arm-timeseriesinsights) |\n| Resource Management - Traffic Manager | npm [6.1.0](https://www.npmjs.com/package/@azure/arm-trafficmanager/v/6.1.0) | [docs](/javascript/api/overview/azure/arm-trafficmanager-readme) | GitHub [6.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/trafficmanager/arm-trafficmanager) |\n| Resource Management - Trusted Signing | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-trustedsigning/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-trustedsigning-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-trustedsigning_1.0.0-beta.2/sdk/trustedsigning/arm-trustedsigning/) |\n| Resource Management - Video Analyzer | npm [1.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-videoanalyzer/v/1.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-videoanalyzer-readme) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-videoanalyzer_1.0.0-beta.2/sdk/videoanalyzer/arm-videoanalyzer/) |\n| Resource Management - Visual Studio | npm [3.0.0](https://www.npmjs.com/package/@azure/arm-visualstudio/v/3.0.0)<br>npm [4.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-visualstudio/v/4.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-visualstudio-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/visualstudio/arm-visualstudio) |\n| Resource Management - VMware Solution by CloudSimple | npm [3.1.0](https://www.npmjs.com/package/@azure/arm-vmwarecloudsimple/v/3.1.0) | [docs](/javascript/api/overview/azure/arm-vmwarecloudsimple-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/vmwarecloudsimple/arm-vmwarecloudsimple) |\n| Resource Management - Voice Services | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-voiceservices/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-voiceservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-voiceservices_1.0.0/sdk/voiceservices/arm-voiceservices/) |\n| Resource Management - Web PubSub | npm [1.2.0](https://www.npmjs.com/package/@azure/arm-webpubsub/v/1.2.0)<br>npm [2.0.0-beta.2](https://www.npmjs.com/package/@azure/arm-webpubsub/v/2.0.0-beta.2) | [docs](/javascript/api/overview/azure/arm-webpubsub-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-webpubsub_1.2.0/sdk/web-pubsub/arm-webpubsub/)<br>GitHub [2.0.0-beta.2](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-webpubsub_2.0.0-beta.2/sdk/web-pubsub/arm-webpubsub/) |\n| Resource Management - Weights & Biases | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-weightsandbiases/v/1.0.0-beta.1) |  | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-weightsandbiases_1.0.0-beta.1/sdk/liftrweightsandbiases/arm-weightsandbiases/) |\n| Resource Management - Workloadorchestration | npm [1.0.0-beta.1](https://www.npmjs.com/package/@azure/arm-workloadorchestration/v/1.0.0-beta.1) | [docs](/javascript/api/overview/azure/arm-workloadorchestration-readme) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-workloadorchestration_1.0.0-beta.1/sdk/workloadorchestration/arm-workloadorchestration/) |\n| Resource Management - Workloads | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-workloads/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-workloads-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-workloads_1.0.0/sdk/workloads/arm-workloads/) |\n| Resource Management - Workloads SAP Virtual Instance | npm [1.0.0](https://www.npmjs.com/package/@azure/arm-workloadssapvirtualinstance/v/1.0.0) | [docs](/javascript/api/overview/azure/arm-workloadssapvirtualinstance-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-workloadssapvirtualinstance_1.0.0/sdk/workloads/arm-workloadssapvirtualinstance/) |\n| Resource Management - Workspaces | npm [1.1.0](https://www.npmjs.com/package/@azure/arm-workspaces/v/1.1.0) | [docs](/javascript/api/overview/azure/arm-workspaces-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/machinelearning/arm-workspaces) |\n| Resource Management - Template Specs | npm [2.1.0](https://www.npmjs.com/package/@azure/arm-templatespecs/v/2.1.0) | [docs](/javascript/api/overview/azure/arm-templatespecs-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-js/tree/@azure/arm-templatespecs_2.1.0/sdk/templatespecs/arm-templatespecs/) |\n"
  },
  {
    "path": "articles/includes/open-cloud-shell.md",
    "content": "---\ntitle: include file\ndescription: include file\nauthor: tomarchermsft\nms.service: terraform\nms.topic: include\nms.date: 07/22/2021\nms.author: tarcher\n---\n\n1. If you already have a Cloud Shell session open, you can skip to the next section.\n\n1. Browse to the [Azure portal](https://portal.azure.com)\n\n1. If necessary, log in to your Azure subscription and change the Azure directory.\n\n1. Open Cloud Shell.\n\n    :::image type=\"content\" source=\"media/open-cloud-shell/portal-cloud-shell.png\" alt-text=\"Open Cloud Shell from the top menu in the Azure portal.\":::\n\n1. If you haven't previously used Cloud Shell, configure the environment and storage settings.\n\n1. Select the command-line environment.\n\n    :::image type=\"content\" source=\"media/open-cloud-shell/choose-cloudshell-cli.png\" alt-text=\"Select the CLI you want to use in Cloud Shell.\":::\n"
  },
  {
    "path": "articles/includes/open-source-devops-intro-aks.md",
    "content": "---\n author: tomarchermsft\n ms.service: ansible\n ms.topic: include\n ms.date: 04/22/2019\n ms.author: tarcher\n---\n\n[Azure Kubernetes Service (AKS)](/azure/aks) makes it simple to deploy a managed Kubernetes cluster in Azure. AKS reduces the complexity and operational overhead of managing Kubernetes by offloading much of that responsibility to Azure. As a hosted Kubernetes service, Azure handles critical tasks like health monitoring and maintenance for you. The Kubernetes masters are managed by Azure. You only manage and maintain the agent nodes. As a managed Kubernetes service, AKS is free - you pay only for the agent nodes within your clusters; not for the masters."
  },
  {
    "path": "articles/includes/open-source-devops-intro-app-service.md",
    "content": "---\n author: tomarchermsft\n ms.service: ansible\n ms.topic: include\n ms.date: 04/22/2019\n ms.author: tarcher\n---\n\n[Azure App Service](/azure/app-service/overview) enables you to build and host code. This code can be in the form of web apps, mobile backends, and RESTful APIs. Using App Service, you can develop you code using the programming language of your choice without managing infrastructure. App Service supports both Windows and Linux. Automated deployments from any Git repo are supported, including GitHub and Azure DevOps."
  },
  {
    "path": "articles/includes/open-source-devops-intro-servicebus.md",
    "content": "---\n author: tomarchermsft\n ms.service: ansible\n ms.topic: include\n ms.date: 04/22/2019\n ms.author: tarcher\n---\n\n[Azure Service Bus](/azure/service-bus-messaging/service-bus-messaging-overview) is an enterprise [integration](https://azure.microsoft.com/product-categories/integration/) message broker. Service bus supports two types of communication: queues and topics. \n\nQueues support asynchronous communications between applications. An app sends messages to a queue, which stores the messages. The receiving application then connects to and reads the messages from the queue.\n\nTopics support the publish-subscribe pattern, which enables a one-to-many relationship between the message originator and the messager receiver(s)."
  },
  {
    "path": "articles/includes/open-source-devops-intro-vm-scale-set.md",
    "content": "---\n author: tomarchermsft\n ms.service: ansible\n ms.topic: include\n ms.date: 04/22/2019\n ms.author: tarcher\n---\n\n[Azure virtual machine scale sets](/azure/virtual-machine-scale-sets/overview) is an Azure feature that lets you configure a group of identical, load balanced VMs. There's no additional cost to scale sets and they're built from virtual machines. You pay only for the underlying compute resources such as the VM instances, load balancers, or Managed Disk storage. With scale sets, the management and automation layers are provided to run and scale your applications. You could instead manually create and manage individual VMs. However, there are two key benefits to using scale sets. They're built into Azure and they automatically scale your virtual machines to meet application needs."
  },
  {
    "path": "articles/includes/open-source-devops-prereqs-azure-subscription.md",
    "content": "---\n author: tomarchermsft\n ms.service: ansible\n ms.topic: include\n ms.date: 04/30/2019\n ms.author: tarcher\n---\n\n- **Azure subscription**: If you don't have an Azure subscription, create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin."
  },
  {
    "path": "articles/includes/open-source-devops-prereqs-create-service-principal.md",
    "content": "---\n author: tomarchermsft\n ms.service: ansible\n ms.topic: include\n ms.date: 04/30/2019\n ms.author: tarcher\n---\n\n- **Azure service principal**: [Create a service principal](../ansible/create-ansible-service-principal.md), making note of the following values: **appId**, **displayName**, **password**, and **tenant**."
  },
  {
    "path": "articles/includes/python-all.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| AI Agent Server - Core | PyPI [2.0.0b3](https://pypi.org/project/azure-ai-agentserver-core/2.0.0b3) | [docs](/python/api/overview/azure/ai-agentserver-core-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [2.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-agentserver-core_2.0.0b3/sdk/agentserver/azure-ai-agentserver-core/) |\n| AI Agents | PyPI [1.1.0](https://pypi.org/project/azure-ai-agents/1.1.0)<br>PyPI [1.2.0b6](https://pypi.org/project/azure-ai-agents/1.2.0b6) | [docs](/python/api/overview/azure/ai-agents-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-agents_1.1.0/sdk/ai/azure-ai-agents/)<br>GitHub [1.2.0b6](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-agents_1.2.0b6/sdk/ai/azure-ai-agents/) |\n| AI Evaluation | PyPI [1.16.7](https://pypi.org/project/azure-ai-evaluation/1.16.7) | [docs](/python/api/overview/azure/ai-evaluation-readme) | GitHub [1.16.7](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-evaluation_1.16.7/sdk/evaluation/azure-ai-evaluation/) |\n| AI Model Inference | PyPI [1.0.0b9](https://pypi.org/project/azure-ai-inference/1.0.0b9) | [docs](/python/api/overview/azure/ai-inference-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b9](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-inference_1.0.0b9/sdk/ai/azure-ai-inference/) |\n| AI Projects | PyPI [2.1.0](https://pypi.org/project/azure-ai-projects/2.1.0) | [docs](/python/api/overview/azure/ai-projects-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-projects_2.1.0/sdk/ai/azure-ai-projects/) |\n| Anomaly Detector | PyPI [3.0.0b6](https://pypi.org/project/azure-ai-anomalydetector/3.0.0b6) | [docs](/python/api/overview/azure/ai-anomalydetector-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [3.0.0b6](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-anomalydetector_3.0.0b6/sdk/anomalydetector/azure-ai-anomalydetector/) |\n| App Configuration | PyPI [1.8.1](https://pypi.org/project/azure-appconfiguration/1.8.1) | [docs](/python/api/overview/azure/appconfiguration-readme) | GitHub [1.8.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-appconfiguration_1.8.1/sdk/appconfiguration/azure-appconfiguration/) |\n| App Configuration Provider | PyPI [2.4.0](https://pypi.org/project/azure-appconfiguration-provider/2.4.0) | [docs](/python/api/overview/azure/appconfiguration-provider-readme) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-appconfiguration-provider_2.4.0/sdk/appconfiguration/azure-appconfiguration-provider/) |\n| Attestation | PyPI [1.0.0](https://pypi.org/project/azure-security-attestation/1.0.0) | [docs](/python/api/overview/azure/security-attestation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-security-attestation_1.0.0/sdk/attestation/azure-security-attestation/) |\n| Azure AI Search | PyPI [12.0.0](https://pypi.org/project/azure-search-documents/12.0.0) | [docs](/python/api/overview/azure/search-documents-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-search-documents_12.0.0/sdk/search/azure-search-documents/) |\n| Azure AI Transcription | PyPI [1.0.0b4](https://pypi.org/project/azure-ai-transcription/1.0.0b4) | [docs](/python/api/overview/azure/ai-transcription-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-transcription_1.0.0b4/sdk/transcription/azure-ai-transcription/) |\n| Azure Blob Storage Checkpoint Store | PyPI [1.2.0](https://pypi.org/project/azure-eventhub-checkpointstoreblob/1.2.0) | [docs](/python/api/overview/azure/eventhub-checkpointstoreblob-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-eventhub-checkpointstoreblob_1.2.0/sdk/eventhub/azure-eventhub-checkpointstoreblob/) |\n| Azure Blob Storage Checkpoint Store AIO | PyPI [1.2.0](https://pypi.org/project/azure-eventhub-checkpointstoreblob-aio/1.2.0) | [docs](/python/api/overview/azure/eventhub-checkpointstoreblob-aio-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-eventhub-checkpointstoreblob-aio_1.2.0/sdk/eventhub/azure-eventhub-checkpointstoreblob-aio/) |\n| Azure Content Understanding in Foundry Tools | PyPI [1.1.0](https://pypi.org/project/azure-ai-contentunderstanding/1.1.0)<br>PyPI [1.2.0b1](https://pypi.org/project/azure-ai-contentunderstanding/1.2.0b1) | [docs](/python/api/overview/azure/ai-contentunderstanding-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-contentunderstanding_1.1.0/sdk/contentunderstanding/azure-ai-contentunderstanding/)<br>GitHub [1.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-contentunderstanding_1.2.0b1/sdk/contentunderstanding/azure-ai-contentunderstanding/) |\n| Azure Monitor OpenTelemetry | PyPI [1.8.7](https://pypi.org/project/azure-monitor-opentelemetry/1.8.7) | [docs](/python/api/overview/azure/monitor-opentelemetry-readme) | GitHub [1.8.7](https://github.com/Azure/azure-sdk-for-python/tree/azure-monitor-opentelemetry_1.8.7/sdk/monitor/azure-monitor-opentelemetry/) |\n| Batch | PyPI [15.1.0](https://pypi.org/project/azure-batch/15.1.0) | [docs](/python/api/overview/azure/batch-readme) | GitHub [15.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-batch_15.1.0/sdk/batch/azure-batch/) |\n| Communication Call Automation | PyPI [1.5.0](https://pypi.org/project/azure-communication-callautomation/1.5.0)<br>PyPI [1.6.0b1](https://pypi.org/project/azure-communication-callautomation/1.6.0b1) | [docs](/python/api/overview/azure/communication-callautomation-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-callautomation_1.5.0/sdk/communication/azure-communication-callautomation/)<br>GitHub [1.6.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-callautomation_1.6.0b1/sdk/communication/azure-communication-callautomation/) |\n| Communication Chat | PyPI [1.3.0](https://pypi.org/project/azure-communication-chat/1.3.0) | [docs](/python/api/overview/azure/communication-chat-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-chat_1.3.0/sdk/communication/azure-communication-chat/) |\n| Communication Email | PyPI [1.1.0](https://pypi.org/project/azure-communication-email/1.1.0) | [docs](/python/api/overview/azure/communication-email-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-email_1.1.0/sdk/communication/azure-communication-email/) |\n| Communication Identity | PyPI [1.5.0](https://pypi.org/project/azure-communication-identity/1.5.0) | [docs](/python/api/overview/azure/communication-identity-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-identity_1.5.0/sdk/communication/azure-communication-identity/) |\n| Communication JobRouter | PyPI [1.0.0](https://pypi.org/project/azure-communication-jobrouter/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-communication-jobrouter/1.1.0b1) | [docs](/python/api/overview/azure/communication-jobrouter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-jobrouter_1.0.0/sdk/communication/azure-communication-jobrouter/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-jobrouter_1.1.0b1/sdk/communication/azure-communication-jobrouter/) |\n| Communication Messages | PyPI [1.1.0](https://pypi.org/project/azure-communication-messages/1.1.0)<br>PyPI [1.2.0b1](https://pypi.org/project/azure-communication-messages/1.2.0b1) | [docs](/python/api/overview/azure/communication-messages-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-messages_1.1.0/sdk/communication/azure-communication-messages/)<br>GitHub [1.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-messages_1.2.0b1/sdk/communication/azure-communication-messages/) |\n| Communication Phone Numbers | PyPI [1.4.0](https://pypi.org/project/azure-communication-phonenumbers/1.4.0) | [docs](/python/api/overview/azure/communication-phonenumbers-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-phonenumbers_1.4.0/sdk/communication/azure-communication-phonenumbers/) |\n| Communication Rooms | PyPI [1.2.0](https://pypi.org/project/azure-communication-rooms/1.2.0) | [docs](/python/api/overview/azure/communication-rooms-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-rooms_1.2.0/sdk/communication/azure-communication-rooms/) |\n| Communication Sms | PyPI [1.1.0](https://pypi.org/project/azure-communication-sms/1.1.0) | [docs](/python/api/overview/azure/communication-sms-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-sms_1.1.0/sdk/communication/azure-communication-sms/) |\n| Confidential Ledger | PyPI [1.1.1](https://pypi.org/project/azure-confidentialledger/1.1.1)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-confidentialledger/2.0.0b2) | [docs](/python/api/overview/azure/confidentialledger-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-confidentialledger_1.1.1/sdk/confidentialledger/azure-confidentialledger/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-confidentialledger_2.0.0b2/sdk/confidentialledger/azure-confidentialledger/) |\n| Confidential Ledger Certificate | PyPI [1.0.0b1](https://pypi.org/project/azure-confidentialledger-certificate/1.0.0b1) | [docs](/python/api/overview/azure/confidentialledger-certificate-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-confidentialledger-certificate_1.0.0b1/sdk/confidentialledger/azure-confidentialledger-certificate/) |\n| Container Registry | PyPI [1.2.0](https://pypi.org/project/azure-containerregistry/1.2.0) | [docs](/python/api/overview/azure/containerregistry-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-containerregistry_1.2.0/sdk/containerregistry/azure-containerregistry/) |\n| Content Safety | PyPI [1.0.0](https://pypi.org/project/azure-ai-contentsafety/1.0.0) | [docs](/python/api/overview/azure/ai-contentsafety-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-contentsafety_1.0.0/sdk/contentsafety/azure-ai-contentsafety/) |\n| Conversational Language Understanding | PyPI [1.1.0](https://pypi.org/project/azure-ai-language-conversations/1.1.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-ai-language-conversations/2.0.0b2) | [docs](/python/api/overview/azure/ai-language-conversations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-conversations_1.1.0/sdk/cognitivelanguage/azure-ai-language-conversations/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-conversations_2.0.0b2/sdk/cognitivelanguage/azure-ai-language-conversations/) |\n| Conversations Authoring | PyPI [1.0.0b4](https://pypi.org/project/azure-ai-language-conversations-authoring/1.0.0b4) | [docs](/python/api/overview/azure/ai-language-conversations-authoring-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-conversations-authoring_1.0.0b4/sdk/cognitivelanguage/azure-ai-language-conversations-authoring/) |\n| Core - Client - Core | PyPI [1.41.0](https://pypi.org/project/azure-core/1.41.0) | [docs](/python/api/overview/azure/core-readme) | GitHub [1.41.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-core_1.41.0/sdk/core/azure-core/) |\n| Core - Client - Core HTTP | PyPI [1.0.0b7](https://pypi.org/project/corehttp/1.0.0b7) | [docs](/python/api/overview/azure/corehttp-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b7](https://github.com/Azure/azure-sdk-for-python/tree/corehttp_1.0.0b7/sdk/core/corehttp/) |\n| Core - Client - Experimental | PyPI [1.0.0b4](https://pypi.org/project/azure-core-experimental/1.0.0b4) | [docs](/python/api/overview/azure/core-experimental-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-core-experimental_1.0.0b4/sdk/core/azure-core-experimental/) |\n| Core - Client - Tracing Opentelemetry | PyPI [1.0.0b13](https://pypi.org/project/azure-core-tracing-opentelemetry/1.0.0b13) | [docs](/python/api/overview/azure/core-tracing-opentelemetry-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b13](https://github.com/Azure/azure-sdk-for-python/tree/azure-core-tracing-opentelemetry_1.0.0b13/sdk/core/azure-core-tracing-opentelemetry/) |\n| Core Tracing Opencensus | PyPI [1.0.0b10](https://pypi.org/project/azure-core-tracing-opencensus/1.0.0b10) | [docs](/python/api/overview/azure/core-tracing-opencensus-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b10](https://github.com/Azure/azure-sdk-for-python/tree/azure-core-tracing-opencensus_1.0.0b10/sdk/core/azure-core-tracing-opencensus/) |\n| Cosmos DB | PyPI [4.15.0](https://pypi.org/project/azure-cosmos/4.15.0)<br>PyPI [4.16.0b2](https://pypi.org/project/azure-cosmos/4.16.0b2) | [docs](/python/api/overview/azure/cosmos-readme) | GitHub [4.15.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-cosmos_4.15.0/sdk/cosmos/azure-cosmos/)<br>GitHub [4.16.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-cosmos_4.16.0b2/sdk/cosmos/azure-cosmos/) |\n| Defender EASM | PyPI [1.0.0b1](https://pypi.org/project/azure-defender-easm/1.0.0b1) | [docs](/python/api/overview/azure/defender-easm-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-defender-easm_1.0.0b1/sdk/easm/azure-defender-easm/) |\n| Dev Center | PyPI [1.0.0](https://pypi.org/project/azure-developer-devcenter/1.0.0) | [docs](/python/api/overview/azure/developer-devcenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-developer-devcenter_1.0.0/sdk/devcenter/azure-developer-devcenter/) |\n| Device Provisioning Services | PyPI [1.0.0b1](https://pypi.org/project/azure-iot-deviceprovisioning/1.0.0b1) | [docs](/python/api/overview/azure/iot-deviceprovisioning-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-iot-deviceprovisioning_1.0.0b1/sdk/iothub/azure-iot-deviceprovisioning/) |\n| Device Update | PyPI [1.0.0](https://pypi.org/project/azure-iot-deviceupdate/1.0.0) | [docs](/python/api/overview/azure/iot-deviceupdate-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-iot-deviceupdate_1.0.0/sdk/deviceupdate/azure-iot-deviceupdate/) |\n| Digital Twins | PyPI [1.3.0](https://pypi.org/project/azure-digitaltwins-core/1.3.0) | [docs](/python/api/overview/azure/digitaltwins-core-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-digitaltwins-core_1.3.0/sdk/digitaltwins/azure-digitaltwins-core/) |\n| Document Intelligence | PyPI [1.0.2](https://pypi.org/project/azure-ai-documentintelligence/1.0.2) | [docs](/python/api/overview/azure/ai-documentintelligence-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-documentintelligence_1.0.2/sdk/documentintelligence/azure-ai-documentintelligence/) |\n| Document Translation | PyPI [1.1.0](https://pypi.org/project/azure-ai-translation-document/1.1.0) | [docs](/python/api/overview/azure/ai-translation-document-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-translation-document_1.1.0/sdk/translation/azure-ai-translation-document/) |\n| Event Grid | PyPI [4.22.0](https://pypi.org/project/azure-eventgrid/4.22.0) | [docs](/python/api/overview/azure/eventgrid-readme) | GitHub [4.22.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-eventgrid_4.22.0/sdk/eventgrid/azure-eventgrid/) |\n| Event Hubs | PyPI [5.15.1](https://pypi.org/project/azure-eventhub/5.15.1) | [docs](/python/api/overview/azure/eventhub-readme) | GitHub [5.15.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-eventhub_5.15.1/sdk/eventhub/azure-eventhub/) |\n| Face | PyPI [1.0.0b2](https://pypi.org/project/azure-ai-vision-face/1.0.0b2) | [docs](/python/api/overview/azure/ai-vision-face-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-vision-face_1.0.0b2/sdk/face/azure-ai-vision-face/) |\n| FarmBeats | PyPI [1.0.0b2](https://pypi.org/project/azure-agrifood-farming/1.0.0b2) | [docs](/python/api/overview/azure/agrifood-farming-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-agrifood-farming_1.0.0b2/sdk/agrifood/azure-agrifood-farming/) |\n| Form Recognizer | PyPI [3.3.3](https://pypi.org/project/azure-ai-formrecognizer/3.3.3) | [docs](/python/api/overview/azure/ai-formrecognizer-readme) | GitHub [3.3.3](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-formrecognizer_3.3.3/sdk/formrecognizer/azure-ai-formrecognizer/) |\n| Health Deidentification | PyPI [1.0.0](https://pypi.org/project/azure-health-deidentification/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-health-deidentification/1.1.0b1) | [docs](/python/api/overview/azure/health-deidentification-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-health-deidentification_1.0.0/sdk/healthdataaiservices/azure-health-deidentification/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-health-deidentification_1.1.0b1/sdk/healthdataaiservices/azure-health-deidentification/) |\n| Health Insights Cancer Profiling | PyPI [1.0.0b1](https://pypi.org/project/azure-healthinsights-cancerprofiling/1.0.0b1) | [docs](/python/api/overview/azure/healthinsights-cancerprofiling-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-healthinsights-cancerprofiling_1.0.0b1/sdk/healthinsights/azure-healthinsights-cancerprofiling/) |\n| Health Insights Clinical Matching | PyPI [1.0.0b1](https://pypi.org/project/azure-healthinsights-clinicalmatching/1.0.0b1) | [docs](/python/api/overview/azure/healthinsights-clinicalmatching-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-healthinsights-clinicalmatching_1.0.0b1/sdk/healthinsights/azure-healthinsights-clinicalmatching/) |\n| Health Insights Radiology Insights | PyPI [1.1.0](https://pypi.org/project/azure-healthinsights-radiologyinsights/1.1.0) | [docs](/python/api/overview/azure/healthinsights-radiologyinsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-healthinsights-radiologyinsights_1.1.0/sdk/healthinsights/azure-healthinsights-radiologyinsights/) |\n| Identity | PyPI [1.25.3](https://pypi.org/project/azure-identity/1.25.3)<br>PyPI [1.26.0b2](https://pypi.org/project/azure-identity/1.26.0b2) | [docs](/python/api/overview/azure/identity-readme) | GitHub [1.25.3](https://github.com/Azure/azure-sdk-for-python/tree/azure-identity_1.25.3/sdk/identity/azure-identity/)<br>GitHub [1.26.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-identity_1.26.0b2/sdk/identity/azure-identity/) |\n| Identity Broker | PyPI [1.3.0](https://pypi.org/project/azure-identity-broker/1.3.0) | [docs](/python/api/overview/azure/identity-broker-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-identity-broker_1.3.0/sdk/identity/azure-identity-broker/) |\n| Image Analysis | PyPI [1.0.0](https://pypi.org/project/azure-ai-vision-imageanalysis/1.0.0) | [docs](/python/api/overview/azure/ai-vision-imageanalysis-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-vision-imageanalysis_1.0.0/sdk/vision/azure-ai-vision-imageanalysis/) |\n| Key Vault - Administration | PyPI [4.6.0](https://pypi.org/project/azure-keyvault-administration/4.6.0) | [docs](/python/api/overview/azure/keyvault-administration-readme) | GitHub [4.6.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-administration_4.6.0/sdk/keyvault/azure-keyvault-administration/) |\n| Key Vault - Certificates | PyPI [4.11.1](https://pypi.org/project/azure-keyvault-certificates/4.11.1) | [docs](/python/api/overview/azure/keyvault-certificates-readme) | GitHub [4.11.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-certificates_4.11.1/sdk/keyvault/azure-keyvault-certificates/) |\n| Key Vault - Keys | PyPI [4.11.0](https://pypi.org/project/azure-keyvault-keys/4.11.0) | [docs](/python/api/overview/azure/keyvault-keys-readme) | GitHub [4.11.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-keys_4.11.0/sdk/keyvault/azure-keyvault-keys/) |\n| Key Vault - Secrets | PyPI [4.11.0](https://pypi.org/project/azure-keyvault-secrets/4.11.0) | [docs](/python/api/overview/azure/keyvault-secrets-readme) | GitHub [4.11.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-secrets_4.11.0/sdk/keyvault/azure-keyvault-secrets/) |\n| Key Vault - Security Domain | PyPI [1.0.0b1](https://pypi.org/project/azure-keyvault-securitydomain/1.0.0b1) | [docs](/python/api/overview/azure/keyvault-securitydomain-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-securitydomain_1.0.0b1/sdk/keyvault/azure-keyvault-securitydomain/) |\n| Load Testing | PyPI [1.0.1](https://pypi.org/project/azure-developer-loadtesting/1.0.1)<br>PyPI [1.2.0b1](https://pypi.org/project/azure-developer-loadtesting/1.2.0b1) | [docs](/python/api/overview/azure/developer-loadtesting-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-developer-loadtesting_1.0.1/sdk/loadtesting/azure-developer-loadtesting/)<br>GitHub [1.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-developer-loadtesting_1.2.0b1/sdk/loadtesting/azure-developer-loadtesting/) |\n| Machine Learning | PyPI [1.33.0](https://pypi.org/project/azure-ai-ml/1.33.0) | [docs](/python/api/overview/azure/ai-ml-readme) | GitHub [1.33.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-ml_1.33.0/sdk/ml/azure-ai-ml/) |\n| Machine Learning - Feature Store | PyPI [1.0.1](https://pypi.org/project/azureml-featurestore/1.0.1) |  | GitHub [1.0.1](https://msdata.visualstudio.com/Vienna/_git/sdk-cli-v2?path=/src/azureml-featurestore) |\n| Managed Private Endpoints | PyPI [0.4.0](https://pypi.org/project/azure-synapse-managedprivateendpoints/0.4.0) | [docs](/python/api/overview/azure/synapse-managedprivateendpoints-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-managedprivateendpoints_0.4.0/sdk/synapse/azure-synapse-managedprivateendpoints/) |\n| Maps Geolocation | PyPI [1.0.0b3](https://pypi.org/project/azure-maps-geolocation/1.0.0b3) | [docs](/python/api/overview/azure/maps-geolocation-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-maps-geolocation_1.0.0b3/sdk/maps/azure-maps-geolocation/) |\n| Maps Render | PyPI [2.0.0b2](https://pypi.org/project/azure-maps-render/2.0.0b2) | [docs](/python/api/overview/azure/maps-render-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-maps-render_2.0.0b2/sdk/maps/azure-maps-render/) |\n| Maps Route | PyPI [1.0.0b3](https://pypi.org/project/azure-maps-route/1.0.0b3) | [docs](/python/api/overview/azure/maps-route-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-maps-route_1.0.0b3/sdk/maps/azure-maps-route/) |\n| Maps Search | PyPI [2.0.0b2](https://pypi.org/project/azure-maps-search/2.0.0b2) | [docs](/python/api/overview/azure/maps-search-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-maps-search_2.0.0b2/sdk/maps/azure-maps-search/) |\n| Media Analytics Edge | PyPI [1.0.0b2](https://pypi.org/project/azure-media-analytics-edge/1.0.0b2) | [docs](/python/api/overview/azure/media-analytics-edge-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-media-analytics-edge_1.0.0b2/sdk/media/azure-media-analytics-edge/) |\n| Microsoft Planetary Computer Pro | PyPI [1.0.0b1](https://pypi.org/project/azure-planetarycomputer/1.0.0b1) | [docs](/python/api/overview/azure/planetarycomputer-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-planetarycomputer_1.0.0b1/sdk/planetarycomputer/azure-planetarycomputer/) |\n| Monitor Ingestion | PyPI [1.1.0](https://pypi.org/project/azure-monitor-ingestion/1.1.0) | [docs](/python/api/overview/azure/monitor-ingestion-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-monitor-ingestion_1.1.0/sdk/monitor/azure-monitor-ingestion/) |\n| Monitor Query Logs | PyPI [2.0.0](https://pypi.org/project/azure-monitor-query/2.0.0) | [docs](/python/api/overview/azure/monitor-query-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-monitor-query_2.0.0/sdk/monitor/azure-monitor-query/) |\n| Monitor Query Metrics | PyPI [1.0.0](https://pypi.org/project/azure-monitor-querymetrics/1.0.0) | [docs](/python/api/overview/azure/monitor-querymetrics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-monitor-querymetrics_1.0.0/sdk/monitor/azure-monitor-querymetrics/) |\n| Online Experimentation | PyPI [1.0.0b1](https://pypi.org/project/azure-onlineexperimentation/1.0.0b1) | [docs](/python/api/overview/azure/onlineexperimentation-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-onlineexperimentation_1.0.0b1/sdk/onlineexperimentation/azure-onlineexperimentation/) |\n| OpenTelemetry Exporter | PyPI [1.0.0b52](https://pypi.org/project/azure-monitor-opentelemetry-exporter/1.0.0b52) | [docs](/python/api/overview/azure/monitor-opentelemetry-exporter-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b52](https://github.com/Azure/azure-sdk-for-python/tree/azure-monitor-opentelemetry-exporter_1.0.0b52/sdk/monitor/azure-monitor-opentelemetry-exporter/) |\n| Personalizer | PyPI [1.0.0b1](https://pypi.org/project/azure-ai-personalizer/1.0.0b1) |  | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-personalizer_1.0.0b1/sdk/personalizer/azure-ai-personalizer/) |\n| Purview Account | PyPI [1.0.0b1](https://pypi.org/project/azure-purview-account/1.0.0b1) | [docs](/python/api/overview/azure/purview-account-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-account_1.0.0b1/sdk/purview/azure-purview-account/) |\n| Purview Administration | PyPI [1.0.0b1](https://pypi.org/project/azure-purview-administration/1.0.0b1) | [docs](/python/api/overview/azure/purview-administration-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-administration_1.0.0b1/sdk/purview/azure-purview-administration/) |\n| Purview Data Map | PyPI [1.0.0b2](https://pypi.org/project/azure-purview-datamap/1.0.0b2) | [docs](/python/api/overview/azure/purview-datamap-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-datamap_1.0.0b2/sdk/purview/azure-purview-datamap/) |\n| Purview Scanning | PyPI [1.0.0b2](https://pypi.org/project/azure-purview-scanning/1.0.0b2) | [docs](/python/api/overview/azure/purview-scanning-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-scanning_1.0.0b2/sdk/purview/azure-purview-scanning/) |\n| Purview Sharing | PyPI [1.0.0b3](https://pypi.org/project/azure-purview-sharing/1.0.0b3) | [docs](/python/api/overview/azure/purview-sharing-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-sharing_1.0.0b3/sdk/purview/azure-purview-sharing/) |\n| Purview Workflow | PyPI [1.0.0b2](https://pypi.org/project/azure-purview-workflow/1.0.0b2) | [docs](/python/api/overview/azure/purview-workflow-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-workflow_1.0.0b2/sdk/purview/azure-purview-workflow/) |\n| Question Answering | PyPI [1.1.0](https://pypi.org/project/azure-ai-language-questionanswering/1.1.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-ai-language-questionanswering/2.0.0b1) | [docs](/python/api/overview/azure/ai-language-questionanswering-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-questionanswering_1.1.0/sdk/cognitivelanguage/azure-ai-language-questionanswering/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-questionanswering_2.0.0b1/sdk/cognitivelanguage/azure-ai-language-questionanswering/) |\n| Question Answering Authoring | PyPI [1.0.0b1](https://pypi.org/project/azure-ai-language-questionanswering-authoring/1.0.0b1) | [docs](/python/api/overview/azure/ai-language-questionanswering-authoring-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-questionanswering-authoring_1.0.0b1/sdk/cognitivelanguage/azure-ai-language-questionanswering-authoring/) |\n| Schema Registry | PyPI [1.3.0](https://pypi.org/project/azure-schemaregistry/1.3.0) | [docs](/python/api/overview/azure/schemaregistry-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-schemaregistry_1.3.0/sdk/schemaregistry/azure-schemaregistry/) |\n| Schema Registry - Avro | PyPI [1.0.0](https://pypi.org/project/azure-schemaregistry-avroencoder/1.0.0) | [docs](/python/api/overview/azure/schemaregistry-avroencoder-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-schemaregistry-avroencoder_1.0.0/sdk/schemaregistry/azure-schemaregistry-avroencoder/) |\n| Service Bus | PyPI [7.14.3](https://pypi.org/project/azure-servicebus/7.14.3) | [docs](/python/api/overview/azure/servicebus-readme) | GitHub [7.14.3](https://github.com/Azure/azure-sdk-for-python/tree/azure-servicebus_7.14.3/sdk/servicebus/azure-servicebus/) |\n| Spark | PyPI [0.7.0](https://pypi.org/project/azure-synapse-spark/0.7.0) | [docs](/python/api/overview/azure/synapse-spark-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-spark_0.7.0/sdk/synapse/azure-synapse-spark/) |\n| Storage - Blobs | PyPI [12.28.0](https://pypi.org/project/azure-storage-blob/12.28.0)<br>PyPI [12.30.0b1](https://pypi.org/project/azure-storage-blob/12.30.0b1) | [docs](/python/api/overview/azure/storage-blob-readme) | GitHub [12.28.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-blob_12.28.0/sdk/storage/azure-storage-blob/)<br>GitHub [12.30.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-blob_12.30.0b1/sdk/storage/azure-storage-blob/) |\n| Storage - Blobs Changefeed | PyPI [12.0.0b5](https://pypi.org/project/azure-storage-blob-changefeed/12.0.0b5) | [docs](/python/api/overview/azure/storage-blob-changefeed-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [12.0.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-blob-changefeed_12.0.0b5/sdk/storage/azure-storage-blob-changefeed/) |\n| Storage - Files Data Lake | PyPI [12.23.0](https://pypi.org/project/azure-storage-file-datalake/12.23.0)<br>PyPI [12.25.0b1](https://pypi.org/project/azure-storage-file-datalake/12.25.0b1) | [docs](/python/api/overview/azure/storage-file-datalake-readme) | GitHub [12.23.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-file-datalake_12.23.0/sdk/storage/azure-storage-file-datalake/)<br>GitHub [12.25.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-file-datalake_12.25.0b1/sdk/storage/azure-storage-file-datalake/) |\n| Storage - Files Share | PyPI [12.24.0](https://pypi.org/project/azure-storage-file-share/12.24.0)<br>PyPI [12.26.0b1](https://pypi.org/project/azure-storage-file-share/12.26.0b1) | [docs](/python/api/overview/azure/storage-file-share-readme) | GitHub [12.24.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-file-share_12.24.0/sdk/storage/azure-storage-file-share/)<br>GitHub [12.26.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-file-share_12.26.0b1/sdk/storage/azure-storage-file-share/) |\n| Storage - Queues | PyPI [12.15.0](https://pypi.org/project/azure-storage-queue/12.15.0)<br>PyPI [12.17.0b1](https://pypi.org/project/azure-storage-queue/12.17.0b1) | [docs](/python/api/overview/azure/storage-queue-readme) | GitHub [12.15.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-queue_12.15.0/sdk/storage/azure-storage-queue/)<br>GitHub [12.17.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-queue_12.17.0b1/sdk/storage/azure-storage-queue/) |\n| Synapse - AccessControl | PyPI [0.7.0](https://pypi.org/project/azure-synapse-accesscontrol/0.7.0) | [docs](/python/api/overview/azure/synapse-accesscontrol-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-accesscontrol_0.7.0/sdk/synapse/azure-synapse-accesscontrol/) |\n| Synapse - Artifacts | PyPI [0.22.0](https://pypi.org/project/azure-synapse-artifacts/0.22.0) | [docs](/python/api/overview/azure/synapse-artifacts-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.22.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-artifacts_0.22.0/sdk/synapse/azure-synapse-artifacts/) |\n| Synapse - Monitoring | PyPI [0.2.0](https://pypi.org/project/azure-synapse-monitoring/0.2.0) | [docs](/python/api/overview/azure/synapse-monitoring-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-monitoring_0.2.0/sdk/synapse/azure-synapse-monitoring/) |\n| Tables | PyPI [12.7.0](https://pypi.org/project/azure-data-tables/12.7.0) | [docs](/python/api/overview/azure/data-tables-readme) | GitHub [12.7.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-data-tables_12.7.0/sdk/tables/azure-data-tables/) |\n| Text Analytics | PyPI [5.4.0](https://pypi.org/project/azure-ai-textanalytics/5.4.0)<br>PyPI [6.0.0b2](https://pypi.org/project/azure-ai-textanalytics/6.0.0b2) | [docs](/python/api/overview/azure/ai-textanalytics-readme) | GitHub [5.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-textanalytics_5.4.0/sdk/textanalytics/azure-ai-textanalytics/)<br>GitHub [6.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-textanalytics_6.0.0b2/sdk/textanalytics/azure-ai-textanalytics/) |\n| Text Analytics Authoring | PyPI [1.0.0b1](https://pypi.org/project/azure-ai-textanalytics-authoring/1.0.0b1) | [docs](/python/api/overview/azure/ai-textanalytics-authoring-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-textanalytics-authoring_1.0.0b1/sdk/cognitivelanguage/azure-ai-textanalytics-authoring/) |\n| Text Translation | PyPI [1.0.1](https://pypi.org/project/azure-ai-translation-text/1.0.1)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-ai-translation-text/2.0.0b1) | [docs](/python/api/overview/azure/ai-translation-text-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-translation-text_1.0.1/sdk/translation/azure-ai-translation-text/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-translation-text_2.0.0b1/sdk/translation/azure-ai-translation-text/) |\n| TimeZones | PyPI [1.0.0b1](https://pypi.org/project/azure-maps-timezone/1.0.0b1) | [docs](/python/api/overview/azure/maps-timezone-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-maps-timezone_1.0.0b1/sdk/maps/azure-maps-timezone/) |\n| unknown | PyPI [1.0.0b5](https://pypi.org/project/azure-ai-agentserver-responses/1.0.0b5) | [docs](/python/api/overview/azure/ai-agentserver-responses-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-agentserver-responses_1.0.0b5/sdk/agentserver/azure-ai-agentserver-responses/) |\n| unknown | PyPI [1.0.2](https://pypi.org/project/azure-postgresql-auth/1.0.2) | [docs](/python/api/overview/azure/postgresql-auth-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-python/tree/azure-postgresql-auth_1.0.2/sdk/postgresql/azure-postgresql-auth/) |\n| Voice Live | PyPI [1.1.0](https://pypi.org/project/azure-ai-voicelive/1.1.0)<br>PyPI [1.2.0b5](https://pypi.org/project/azure-ai-voicelive/1.2.0b5) | [docs](/python/api/overview/azure/ai-voicelive-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-voicelive_1.1.0/sdk/voicelive/azure-ai-voicelive/)<br>GitHub [1.2.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-voicelive_1.2.0b5/sdk/voicelive/azure-ai-voicelive/) |\n| Web PubSub | PyPI [1.3.0](https://pypi.org/project/azure-messaging-webpubsubservice/1.3.0) | [docs](/python/api/overview/azure/messaging-webpubsubservice-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-messaging-webpubsubservice_1.3.0/sdk/webpubsub/azure-messaging-webpubsubservice/) |\n| Web PubSub Client | PyPI [1.1.0](https://pypi.org/project/azure-messaging-webpubsubclient/1.1.0) | [docs](/python/api/overview/azure/messaging-webpubsubclient-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-messaging-webpubsubclient_1.1.0/sdk/webpubsub/azure-messaging-webpubsubclient/) |\n| Core - Management - Core | PyPI [1.6.0](https://pypi.org/project/azure-mgmt-core/1.6.0) | [docs](/python/api/overview/azure/mgmt-core-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-core_1.6.0/sdk/core/azure-mgmt-core/) |\n| Resource Management -  Astro | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-astro/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-astro-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-astro_1.0.0b1/sdk/astro/azure-mgmt-astro/) |\n| Resource Management -  Dev Center | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-devcenter/1.1.0) | [docs](/python/api/overview/azure/mgmt-devcenter-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devcenter_1.1.0/sdk/devcenter/azure-mgmt-devcenter/) |\n| Resource Management -  Elastic SAN | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-elasticsan/2.0.0) | [docs](/python/api/overview/azure/mgmt-elasticsan-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-elasticsan_2.0.0/sdk/elasticsan/azure-mgmt-elasticsan/) |\n| Resource Management -  Security DevOps | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-securitydevops/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-securitydevops-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-securitydevops_1.0.0b2/sdk/securitydevops/azure-mgmt-securitydevops/) |\n| Resource Management - Advisor | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-advisor/9.0.0)<br>PyPI [10.0.0b1](https://pypi.org/project/azure-mgmt-advisor/10.0.0b1) | [docs](/python/api/overview/azure/mgmt-advisor-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-advisor_9.0.0/sdk/advisor/azure-mgmt-advisor/)<br>GitHub [10.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-advisor_10.0.0b1/sdk/advisor/azure-mgmt-advisor/) |\n| Resource Management - Agricultureplatform | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-agricultureplatform/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-agricultureplatform-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-agricultureplatform_1.0.0b1/sdk/agricultureplatform/azure-mgmt-agricultureplatform/) |\n| Resource Management - Agrifood | PyPI [1.0.0b3](https://pypi.org/project/azure-mgmt-agrifood/1.0.0b3) | [docs](/python/api/overview/azure/mgmt-agrifood-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-agrifood_1.0.0b3/sdk/agrifood/azure-mgmt-agrifood/) |\n| Resource Management - AKS Developer Hub | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-devhub/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-devhub-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devhub_1.0.0b1/sdk/devhub/azure-mgmt-devhub/) |\n| Resource Management - Alerts Management | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-alertsmanagement/1.0.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-alertsmanagement/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-alertsmanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-alertsmanagement_1.0.0/sdk/alertsmanagement/azure-mgmt-alertsmanagement/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-alertsmanagement_2.0.0b2/sdk/alertsmanagement/azure-mgmt-alertsmanagement/) |\n| Resource Management - API Center | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-apicenter/1.0.0) | [docs](/python/api/overview/azure/mgmt-apicenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-apicenter_1.0.0/sdk/apicenter/azure-mgmt-apicenter/) |\n| Resource Management - API Management | PyPI [5.0.0](https://pypi.org/project/azure-mgmt-apimanagement/5.0.0)<br>PyPI [6.0.0b1](https://pypi.org/project/azure-mgmt-apimanagement/6.0.0b1) | [docs](/python/api/overview/azure/mgmt-apimanagement-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-apimanagement_5.0.0/sdk/apimanagement/azure-mgmt-apimanagement/)<br>GitHub [6.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-apimanagement_6.0.0b1/sdk/apimanagement/azure-mgmt-apimanagement/) |\n| Resource Management - App Compliance Automation | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-appcomplianceautomation/1.0.0) | [docs](/python/api/overview/azure/mgmt-appcomplianceautomation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appcomplianceautomation_1.0.0/sdk/appcomplianceautomation/azure-mgmt-appcomplianceautomation/) |\n| Resource Management - App Configuration | PyPI [5.0.0](https://pypi.org/project/azure-mgmt-appconfiguration/5.0.0)<br>PyPI [6.0.0b2](https://pypi.org/project/azure-mgmt-appconfiguration/6.0.0b2) | [docs](/python/api/overview/azure/mgmt-appconfiguration-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appconfiguration_5.0.0/sdk/appconfiguration/azure-mgmt-appconfiguration/)<br>GitHub [6.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appconfiguration_6.0.0b2/sdk/appconfiguration/azure-mgmt-appconfiguration/) |\n| Resource Management - App Service | PyPI [11.0.0](https://pypi.org/project/azure-mgmt-web/11.0.0) | [docs](/python/api/overview/azure/mgmt-web-readme) | GitHub [11.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-web_11.0.0/sdk/appservice/azure-mgmt-web/) |\n| Resource Management - Application Insights | PyPI [4.1.0](https://pypi.org/project/azure-mgmt-applicationinsights/4.1.0)<br>PyPI [5.0.0b1](https://pypi.org/project/azure-mgmt-applicationinsights/5.0.0b1) | [docs](/python/api/overview/azure/mgmt-applicationinsights-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-applicationinsights_4.1.0/sdk/applicationinsights/azure-mgmt-applicationinsights/)<br>GitHub [5.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-applicationinsights_5.0.0b1/sdk/applicationinsights/azure-mgmt-applicationinsights/) |\n| Resource Management - Arc Data | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-azurearcdata/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-azurearcdata/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-azurearcdata-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurearcdata_1.0.0/sdk/azurearcdata/azure-mgmt-azurearcdata/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurearcdata_2.0.0b1/sdk/azurearcdata/azure-mgmt-azurearcdata/) |\n| Resource Management - Arize AI Observability Eval | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-arizeaiobservabilityeval/1.0.0) | [docs](/python/api/overview/azure/mgmt-arizeaiobservabilityeval-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-arizeaiobservabilityeval_1.0.0/sdk/arizeaiobservabilityeval/azure-mgmt-arizeaiobservabilityeval/) |\n| Resource Management - Artifactsigning | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-artifactsigning/1.0.0) | [docs](/python/api/overview/azure/mgmt-artifactsigning-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-artifactsigning_1.0.0/sdk/artifactsigning/azure-mgmt-artifactsigning/) |\n| Resource Management - Attestation | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-attestation/2.0.0) | [docs](/python/api/overview/azure/mgmt-attestation-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-attestation_2.0.0/sdk/attestation/azure-mgmt-attestation/) |\n| Resource Management - Authorization | PyPI [4.0.0](https://pypi.org/project/azure-mgmt-authorization/4.0.0)<br>PyPI [5.0.0b2](https://pypi.org/project/azure-mgmt-authorization/5.0.0b2) | [docs](/python/api/overview/azure/mgmt-authorization-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-authorization_4.0.0/sdk/authorization/azure-mgmt-authorization/)<br>GitHub [5.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-authorization_5.0.0b2/sdk/authorization/azure-mgmt-authorization/) |\n| Resource Management - Automanage | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-automanage/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-automanage/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-automanage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-automanage_1.0.0/sdk/automanage/azure-mgmt-automanage/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-automanage_2.0.0b1/sdk/automanage/azure-mgmt-automanage/) |\n| Resource Management - Automation | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-automation/1.0.0)<br>PyPI [1.1.0b4](https://pypi.org/project/azure-mgmt-automation/1.1.0b4) | [docs](/python/api/overview/azure/mgmt-automation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-automation_1.0.0/sdk/automation/azure-mgmt-automation/)<br>GitHub [1.1.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-automation_1.1.0b4/sdk/automation/azure-mgmt-automation/) |\n| Resource Management - Azure AI Search | PyPI [9.2.0](https://pypi.org/project/azure-mgmt-search/9.2.0)<br>PyPI [10.0.0b1](https://pypi.org/project/azure-mgmt-search/10.0.0b1) | [docs](/python/api/overview/azure/mgmt-search-readme) | GitHub [9.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-search_9.2.0/sdk/search/azure-mgmt-search/)<br>GitHub [10.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-search_10.0.0b1/sdk/search/azure-mgmt-search/) |\n| Resource Management - Azure Stack | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-azurestack/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-azurestack/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-azurestack-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurestack_1.0.0/sdk/azurestack/azure-mgmt-azurestack/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurestack_2.0.0b1/sdk/azurestack/azure-mgmt-azurestack/) |\n| Resource Management - Azure Stack HCI | PyPI [8.0.0](https://pypi.org/project/azure-mgmt-azurestackhci/8.0.0)<br>PyPI [8.1.0b1](https://pypi.org/project/azure-mgmt-azurestackhci/8.1.0b1) | [docs](/python/api/overview/azure/mgmt-azurestackhci-readme) | GitHub [8.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurestackhci_8.0.0/sdk/azurestackhci/azure-mgmt-azurestackhci/)<br>GitHub [8.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurestackhci_8.1.0b1/sdk/azurestackhci/azure-mgmt-azurestackhci/) |\n| Resource Management - Azure VMware Solution | PyPI [10.0.0](https://pypi.org/project/azure-mgmt-avs/10.0.0) | [docs](/python/api/overview/azure/mgmt-avs-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-avs_10.0.0/sdk/compute/azure-mgmt-avs/) |\n| Resource Management - Azurestackhcivm | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-azurestackhcivm/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-azurestackhcivm-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurestackhcivm_1.0.0b1/sdk/azurestackhci/azure-mgmt-azurestackhcivm/) |\n| Resource Management - BareMetal Infrastructure | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-baremetalinfrastructure/1.0.0)<br>PyPI [1.1.0b2](https://pypi.org/project/azure-mgmt-baremetalinfrastructure/1.1.0b2) | [docs](/python/api/overview/azure/mgmt-baremetalinfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-baremetalinfrastructure_1.0.0/sdk/baremetalinfrastructure/azure-mgmt-baremetalinfrastructure/)<br>GitHub [1.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-baremetalinfrastructure_1.1.0b2/sdk/baremetalinfrastructure/azure-mgmt-baremetalinfrastructure/) |\n| Resource Management - Batch | PyPI [19.0.0](https://pypi.org/project/azure-mgmt-batch/19.0.0) | [docs](/python/api/overview/azure/mgmt-batch-readme) | GitHub [19.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-batch_19.0.0/sdk/batch/azure-mgmt-batch/) |\n| Resource Management - Billing | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-billing/7.0.0) | [docs](/python/api/overview/azure/mgmt-billing-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-billing_7.0.0/sdk/billing/azure-mgmt-billing/) |\n| Resource Management - Billing Benefits | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-billingbenefits/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-billingbenefits-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-billingbenefits_1.0.0b2/sdk/billingbenefits/azure-mgmt-billingbenefits/) |\n| Resource Management - Bot Service | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-botservice/2.0.0) | [docs](/python/api/overview/azure/mgmt-botservice-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-botservice_2.0.0/sdk/botservice/azure-mgmt-botservice/) |\n| Resource Management - Carbonoptimization | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-carbonoptimization/1.0.0) | [docs](/python/api/overview/azure/mgmt-carbonoptimization-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-carbonoptimization_1.0.0/sdk/carbonoptimization/azure-mgmt-carbonoptimization/) |\n| Resource Management - Change Analysis | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-changeanalysis/1.0.0) | [docs](/python/api/overview/azure/mgmt-changeanalysis-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-changeanalysis_1.0.0/sdk/changeanalysis/azure-mgmt-changeanalysis/) |\n| Resource Management - Chaos | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-chaos/2.0.0) | [docs](/python/api/overview/azure/mgmt-chaos-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-chaos_2.0.0/sdk/chaos/azure-mgmt-chaos/) |\n| Resource Management - Cloudhealth | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-cloudhealth/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-cloudhealth-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cloudhealth_1.0.0b1/sdk/cloudhealth/azure-mgmt-cloudhealth/) |\n| Resource Management - Cognitive Services | PyPI [14.1.0](https://pypi.org/project/azure-mgmt-cognitiveservices/14.1.0)<br>PyPI [15.0.0b1](https://pypi.org/project/azure-mgmt-cognitiveservices/15.0.0b1) | [docs](/python/api/overview/azure/mgmt-cognitiveservices-readme) | GitHub [14.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cognitiveservices_14.1.0/sdk/cognitiveservices/azure-mgmt-cognitiveservices/)<br>GitHub [15.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cognitiveservices_15.0.0b1/sdk/cognitiveservices/azure-mgmt-cognitiveservices/) |\n| Resource Management - Commerce | PyPI [6.0.0](https://pypi.org/project/azure-mgmt-commerce/6.0.0)<br>PyPI [6.1.0b2](https://pypi.org/project/azure-mgmt-commerce/6.1.0b2) | [docs](/python/api/overview/azure/mgmt-commerce-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-commerce_6.0.0/sdk/commerce/azure-mgmt-commerce/)<br>GitHub [6.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-commerce_6.1.0b2/sdk/commerce/azure-mgmt-commerce/) |\n| Resource Management - Communication | PyPI [2.2.0](https://pypi.org/project/azure-mgmt-communication/2.2.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-communication/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-communication-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-communication_2.2.0/sdk/communication/azure-mgmt-communication/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-communication_3.0.0b1/sdk/communication/azure-mgmt-communication/) |\n| Resource Management - Compute | PyPI [38.0.0](https://pypi.org/project/azure-mgmt-compute/38.0.0) | [docs](/python/api/overview/azure/mgmt-compute-readme) | GitHub [38.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-compute_38.0.0/sdk/compute/azure-mgmt-compute/) |\n| Resource Management - Compute Fleet | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-computefleet/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-computefleet/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-computefleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computefleet_1.0.0/sdk/computefleet/azure-mgmt-computefleet/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computefleet_2.0.0b1/sdk/computefleet/azure-mgmt-computefleet/) |\n| Resource Management - Compute Schedule | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-computeschedule/1.1.0)<br>PyPI [1.2.0b1](https://pypi.org/project/azure-mgmt-computeschedule/1.2.0b1) | [docs](/python/api/overview/azure/mgmt-computeschedule-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computeschedule_1.1.0/sdk/computeschedule/azure-mgmt-computeschedule/)<br>GitHub [1.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computeschedule_1.2.0b1/sdk/computeschedule/azure-mgmt-computeschedule/) |\n| Resource Management - Computebulkactions | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-computebulkactions/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-computebulkactions-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computebulkactions_1.0.0b1/sdk/computebulkactions/azure-mgmt-computebulkactions/) |\n| Resource Management - Computelimit | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-computelimit/1.0.0) | [docs](/python/api/overview/azure/mgmt-computelimit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computelimit_1.0.0/sdk/computelimit/azure-mgmt-computelimit/) |\n| Resource Management - Computerecommender | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-computerecommender/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-computerecommender-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computerecommender_1.0.0b1/sdk/computerecommender/azure-mgmt-computerecommender/) |\n| Resource Management - Confidential Ledger | PyPI [1.0.1](https://pypi.org/project/azure-mgmt-confidentialledger/1.0.1)<br>PyPI [2.0.0b5](https://pypi.org/project/azure-mgmt-confidentialledger/2.0.0b5) | [docs](/python/api/overview/azure/mgmt-confidentialledger-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-confidentialledger_1.0.1/sdk/confidentialledger/azure-mgmt-confidentialledger/)<br>GitHub [2.0.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-confidentialledger_2.0.0b5/sdk/confidentialledger/azure-mgmt-confidentialledger/) |\n| Resource Management - Confluent | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-confluent/2.1.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-confluent/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-confluent-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-confluent_2.1.0/sdk/confluent/azure-mgmt-confluent/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-confluent_3.0.0b1/sdk/confluent/azure-mgmt-confluent/) |\n| Resource Management - Connected Cache | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-connectedcache/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-connectedcache-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-connectedcache_1.0.0b2/sdk/connectedcache/azure-mgmt-connectedcache/) |\n| Resource Management - Connected VMware | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-connectedvmware/1.0.0) | [docs](/python/api/overview/azure/mgmt-connectedvmware-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-connectedvmware_1.0.0/sdk/connectedvmware/azure-mgmt-connectedvmware/) |\n| Resource Management - Consumption | PyPI [10.0.0](https://pypi.org/project/azure-mgmt-consumption/10.0.0)<br>PyPI [11.0.0b1](https://pypi.org/project/azure-mgmt-consumption/11.0.0b1) | [docs](/python/api/overview/azure/mgmt-consumption-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-consumption_10.0.0/sdk/consumption/azure-mgmt-consumption/)<br>GitHub [11.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-consumption_11.0.0b1/sdk/consumption/azure-mgmt-consumption/) |\n| Resource Management - Container Apps | PyPI [4.0.0](https://pypi.org/project/azure-mgmt-appcontainers/4.0.0) | [docs](/python/api/overview/azure/mgmt-appcontainers-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appcontainers_4.0.0/sdk/appcontainers/azure-mgmt-appcontainers/) |\n| Resource Management - Container Instances | PyPI [10.1.0](https://pypi.org/project/azure-mgmt-containerinstance/10.1.0)<br>PyPI [10.2.0b1](https://pypi.org/project/azure-mgmt-containerinstance/10.2.0b1) | [docs](/python/api/overview/azure/mgmt-containerinstance-readme) | GitHub [10.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerinstance_10.1.0/sdk/containerinstance/azure-mgmt-containerinstance/)<br>GitHub [10.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerinstance_10.2.0b1/sdk/containerinstance/azure-mgmt-containerinstance/) |\n| Resource Management - Container Orchestrator Runtime | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-containerorchestratorruntime/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-containerorchestratorruntime-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerorchestratorruntime_1.0.0b1/sdk/containerorchestratorruntime/azure-mgmt-containerorchestratorruntime/) |\n| Resource Management - Container Registry | PyPI [15.0.0](https://pypi.org/project/azure-mgmt-containerregistry/15.0.0)<br>PyPI [15.1.0b1](https://pypi.org/project/azure-mgmt-containerregistry/15.1.0b1) | [docs](/python/api/overview/azure/mgmt-containerregistry-readme) | GitHub [15.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerregistry_15.0.0/sdk/containerregistry/azure-mgmt-containerregistry/)<br>GitHub [15.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerregistry_15.1.0b1/sdk/containerregistry/azure-mgmt-containerregistry/) |\n| Resource Management - Container Service | PyPI [41.1.0](https://pypi.org/project/azure-mgmt-containerservice/41.1.0)<br>PyPI [41.2.0b1](https://pypi.org/project/azure-mgmt-containerservice/41.2.0b1) | [docs](/python/api/overview/azure/mgmt-containerservice-readme) | GitHub [41.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerservice_41.1.0/sdk/containerservice/azure-mgmt-containerservice/)<br>GitHub [41.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerservice_41.2.0b1/sdk/containerservice/azure-mgmt-containerservice/) |\n| Resource Management - Container Service Fleet | PyPI [3.1.0](https://pypi.org/project/azure-mgmt-containerservicefleet/3.1.0)<br>PyPI [4.0.0b3](https://pypi.org/project/azure-mgmt-containerservicefleet/4.0.0b3) | [docs](/python/api/overview/azure/mgmt-containerservicefleet-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerservicefleet_3.1.0/sdk/containerservice/azure-mgmt-containerservicefleet/)<br>GitHub [4.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerservicefleet_4.0.0b3/sdk/containerservice/azure-mgmt-containerservicefleet/) |\n| Resource Management - Containerservicesafeguards | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-containerservicesafeguards/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-containerservicesafeguards-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerservicesafeguards_1.0.0b1/sdk/containerservice/azure-mgmt-containerservicesafeguards/) |\n| Resource Management - Content Delivery Network | PyPI [13.1.1](https://pypi.org/project/azure-mgmt-cdn/13.1.1) | [docs](/python/api/overview/azure/mgmt-cdn-readme) | GitHub [13.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cdn_13.1.1/sdk/cdn/azure-mgmt-cdn/) |\n| Resource Management - Cosmos DB | PyPI [9.9.0](https://pypi.org/project/azure-mgmt-cosmosdb/9.9.0)<br>PyPI [10.0.0b6](https://pypi.org/project/azure-mgmt-cosmosdb/10.0.0b6) | [docs](/python/api/overview/azure/mgmt-cosmosdb-readme) | GitHub [9.9.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cosmosdb_9.9.0/sdk/cosmos/azure-mgmt-cosmosdb/)<br>GitHub [10.0.0b6](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cosmosdb_10.0.0b6/sdk/cosmos/azure-mgmt-cosmosdb/) |\n| Resource Management - Cosmos DB for PostgreSQL | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-cosmosdbforpostgresql/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-cosmosdbforpostgresql/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-cosmosdbforpostgresql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cosmosdbforpostgresql_1.0.0/sdk/cosmosdbforpostgresql/azure-mgmt-cosmosdbforpostgresql/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cosmosdbforpostgresql_1.1.0b1/sdk/cosmosdbforpostgresql/azure-mgmt-cosmosdbforpostgresql/) |\n| Resource Management - Cost Management | PyPI [4.0.1](https://pypi.org/project/azure-mgmt-costmanagement/4.0.1) | [docs](/python/api/overview/azure/mgmt-costmanagement-readme) | GitHub [4.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-costmanagement_4.0.1/sdk/costmanagement/azure-mgmt-costmanagement/) |\n| Resource Management - Custom Providers | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-customproviders/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-customproviders/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-customproviders-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-customproviders_1.0.0/sdk/customproviders/azure-mgmt-customproviders/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-customproviders_1.1.0b1/sdk/customproviders/azure-mgmt-customproviders/) |\n| Resource Management - Data Box | PyPI [3.1.0](https://pypi.org/project/azure-mgmt-databox/3.1.0) | [docs](/python/api/overview/azure/mgmt-databox-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-databox_3.1.0/sdk/databox/azure-mgmt-databox/) |\n| Resource Management - Data Box Edge | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-databoxedge/2.0.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-databoxedge/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-databoxedge-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-databoxedge_2.0.0/sdk/databoxedge/azure-mgmt-databoxedge/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-databoxedge_3.0.0b1/sdk/databoxedge/azure-mgmt-databoxedge/) |\n| Resource Management - Data Factory | PyPI [9.3.0](https://pypi.org/project/azure-mgmt-datafactory/9.3.0) | [docs](/python/api/overview/azure/mgmt-datafactory-readme) | GitHub [9.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datafactory_9.3.0/sdk/datafactory/azure-mgmt-datafactory/) |\n| Resource Management - Data Lake Analytics | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-datalake-analytics/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-datalake-analytics-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datalake-analytics_0.6.0/azure-mgmt-datalake-analytics/) |\n| Resource Management - Data Lake Store | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-datalake-store/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-datalake-store/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-datalake-store-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datalake-store_0.5.0/azure-mgmt-datalake-store/) |\n| Resource Management - Data Migration | PyPI [10.1.0](https://pypi.org/project/azure-mgmt-datamigration/10.1.0) | [docs](/python/api/overview/azure/mgmt-datamigration-readme) | GitHub [10.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datamigration_10.1.0/sdk/datamigration/azure-mgmt-datamigration/) |\n| Resource Management - Data Protection | PyPI [2.0.1](https://pypi.org/project/azure-mgmt-dataprotection/2.0.1) | [docs](/python/api/overview/azure/mgmt-dataprotection-readme) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dataprotection_2.0.1/sdk/dataprotection/azure-mgmt-dataprotection/) |\n| Resource Management - Data Share | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-datashare/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-datashare/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-datashare-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datashare_1.0.0/sdk/datashare/azure-mgmt-datashare/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datashare_1.1.0b1/sdk/datashare/azure-mgmt-datashare/) |\n| Resource Management - Database Watcher | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-databasewatcher/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-databasewatcher-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-databasewatcher_1.0.0b1/sdk/databasewatcher/azure-mgmt-databasewatcher/) |\n| Resource Management - Databricks | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-databricks/2.0.0) | [docs](/python/api/overview/azure/mgmt-databricks-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-databricks_2.0.0/sdk/databricks/azure-mgmt-databricks/) |\n| Resource Management - Datadog | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-datadog/2.1.0) | [docs](/python/api/overview/azure/mgmt-datadog-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datadog_2.1.0/sdk/datadog/azure-mgmt-datadog/) |\n| Resource Management - Defender EASM | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-defendereasm/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-defendereasm-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-defendereasm_1.0.0b1/sdk/defendereasm/azure-mgmt-defendereasm/) |\n| Resource Management - Dellstorage | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-dellstorage/1.0.0) | [docs](/python/api/overview/azure/mgmt-dellstorage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dellstorage_1.0.0/sdk/dell/azure-mgmt-dellstorage/) |\n| Resource Management - Dependencymap | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-dependencymap/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-dependencymap-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dependencymap_1.0.0b1/sdk/dependencymap/azure-mgmt-dependencymap/) |\n| Resource Management - Deployment Manager | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-deploymentmanager/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-deploymentmanager/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-deploymentmanager-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-deploymentmanager_1.0.0/sdk/deploymentmanager/azure-mgmt-deploymentmanager/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-deploymentmanager_2.0.0b1/sdk/deploymentmanager/azure-mgmt-deploymentmanager/) |\n| Resource Management - Desktop Virtualization | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-desktopvirtualization/2.0.0) | [docs](/python/api/overview/azure/mgmt-desktopvirtualization-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-desktopvirtualization_2.0.0/sdk/desktopvirtualization/azure-mgmt-desktopvirtualization/) |\n| Resource Management - Dev Spaces | PyPI [1.0.0b3](https://pypi.org/project/azure-mgmt-devspaces/1.0.0b3) | [docs](/python/api/overview/azure/mgmt-devspaces-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devspaces_1.0.0b3/sdk/aks/azure-mgmt-devspaces/) |\n| Resource Management - Device Provisioning Services | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-iothubprovisioningservices/1.1.0)<br>PyPI [1.2.0b3](https://pypi.org/project/azure-mgmt-iothubprovisioningservices/1.2.0b3) | [docs](/python/api/overview/azure/mgmt-iothubprovisioningservices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iothubprovisioningservices_0.2.0/azure-mgmt-iothubprovisioningservices/) |\n| Resource Management - Device Registry | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-deviceregistry/1.1.0)<br>PyPI [1.2.0b1](https://pypi.org/project/azure-mgmt-deviceregistry/1.2.0b1) | [docs](/python/api/overview/azure/mgmt-deviceregistry-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-deviceregistry_1.1.0/sdk/deviceregistry/azure-mgmt-deviceregistry/)<br>GitHub [1.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-deviceregistry_1.2.0b1/sdk/deviceregistry/azure-mgmt-deviceregistry/) |\n| Resource Management - Device Update | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-deviceupdate/1.1.0) | [docs](/python/api/overview/azure/mgmt-deviceupdate-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-deviceupdate_1.1.0/sdk/deviceupdate/azure-mgmt-deviceupdate/) |\n| Resource Management - DevOps Infrastructure | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-devopsinfrastructure/1.0.0) | [docs](/python/api/overview/azure/mgmt-devopsinfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devopsinfrastructure_1.0.0/sdk/devopsinfrastructure/azure-mgmt-devopsinfrastructure/) |\n| Resource Management - DevTest Labs | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-devtestlabs/9.0.0)<br>PyPI [10.0.0b2](https://pypi.org/project/azure-mgmt-devtestlabs/10.0.0b2) | [docs](/python/api/overview/azure/mgmt-devtestlabs-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devtestlabs_9.0.0/sdk/devtestlabs/azure-mgmt-devtestlabs/)<br>GitHub [10.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devtestlabs_10.0.0b2/sdk/devtestlabs/azure-mgmt-devtestlabs/) |\n| Resource Management - Digital Twins | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-digitaltwins/7.0.0) | [docs](/python/api/overview/azure/mgmt-digitaltwins-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-digitaltwins_7.0.0/sdk/digitaltwins/azure-mgmt-digitaltwins/) |\n| Resource Management - Disconnectedoperations | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-disconnectedoperations/1.0.0) | [docs](/python/api/overview/azure/mgmt-disconnectedoperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-disconnectedoperations_1.0.0/sdk/disconnectedoperations/azure-mgmt-disconnectedoperations/) |\n| Resource Management - DNS | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-dns/9.0.0) | [docs](/python/api/overview/azure/mgmt-dns-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dns_9.0.0/sdk/network/azure-mgmt-dns/) |\n| Resource Management - DNS Resolver | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-dnsresolver/1.1.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-dnsresolver/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-dnsresolver-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dnsresolver_1.1.0/sdk/dnsresolver/azure-mgmt-dnsresolver/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dnsresolver_2.0.0b1/sdk/dnsresolver/azure-mgmt-dnsresolver/) |\n| Resource Management - Durable Task | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-durabletask/1.1.0) | [docs](/python/api/overview/azure/mgmt-durabletask-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-durabletask_1.1.0/sdk/durabletask/azure-mgmt-durabletask/) |\n| Resource Management - Dynatrace | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-dynatrace/2.0.0) | [docs](/python/api/overview/azure/mgmt-dynatrace-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dynatrace_2.0.0/sdk/dynatrace/azure-mgmt-dynatrace/) |\n| Resource Management - Edge Order | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-edgeorder/2.0.0) | [docs](/python/api/overview/azure/mgmt-edgeorder-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-edgeorder_2.0.0/sdk/edgeorder/azure-mgmt-edgeorder/) |\n| Resource Management - Edge Zones | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-edgezones/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-edgezones-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-edgezones_1.0.0b2/sdk/edgezones/azure-mgmt-edgezones/) |\n| Resource Management - Edgeactions | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-edgeactions/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-edgeactions-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-edgeactions_1.0.0b1/sdk/edgeactions/azure-mgmt-edgeactions/) |\n| Resource Management - Education | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-education/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-education-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-education_1.0.0b2/sdk/education/azure-mgmt-education/) |\n| Resource Management - Elastic | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-elastic/2.0.0) | [docs](/python/api/overview/azure/mgmt-elastic-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-elastic_2.0.0/sdk/elastic/azure-mgmt-elastic/) |\n| Resource Management - Event Grid | PyPI [10.4.0](https://pypi.org/project/azure-mgmt-eventgrid/10.4.0)<br>PyPI [10.5.0b2](https://pypi.org/project/azure-mgmt-eventgrid/10.5.0b2) | [docs](/python/api/overview/azure/mgmt-eventgrid-readme) | GitHub [10.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-eventgrid_10.4.0/sdk/eventgrid/azure-mgmt-eventgrid/)<br>GitHub [10.5.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-eventgrid_10.5.0b2/sdk/eventgrid/azure-mgmt-eventgrid/) |\n| Resource Management - Event Hubs | PyPI [11.2.0](https://pypi.org/project/azure-mgmt-eventhub/11.2.0)<br>PyPI [12.0.0b1](https://pypi.org/project/azure-mgmt-eventhub/12.0.0b1) | [docs](/python/api/overview/azure/mgmt-eventhub-readme) | GitHub [11.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-eventhub_11.2.0/sdk/eventhub/azure-mgmt-eventhub/)<br>GitHub [12.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-eventhub_12.0.0b1/sdk/eventhub/azure-mgmt-eventhub/) |\n| Resource Management - Extended Location | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-extendedlocation/2.0.0) | [docs](/python/api/overview/azure/mgmt-extendedlocation-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-extendedlocation_2.0.0/sdk/extendedlocation/azure-mgmt-extendedlocation/) |\n| Resource Management - Fabric | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-fabric/1.0.0) | [docs](/python/api/overview/azure/mgmt-fabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-fabric_1.0.0/sdk/fabric/azure-mgmt-fabric/) |\n| Resource Management - Fileshares | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-fileshares/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-fileshares-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-fileshares_1.0.0b1/sdk/fileshares/azure-mgmt-fileshares/) |\n| Resource Management - Fluid Relay | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-fluidrelay/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-fluidrelay/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-fluidrelay-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-fluidrelay_1.0.0/sdk/fluidrelay/azure-mgmt-fluidrelay/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-fluidrelay_1.1.0b1/sdk/fluidrelay/azure-mgmt-fluidrelay/) |\n| Resource Management - Front Door | PyPI [1.2.0](https://pypi.org/project/azure-mgmt-frontdoor/1.2.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-frontdoor/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-frontdoor-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-frontdoor_1.2.0/sdk/network/azure-mgmt-frontdoor/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-frontdoor_2.0.0b1/sdk/network/azure-mgmt-frontdoor/) |\n| Resource Management - Graph Services | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-graphservices/1.0.0) | [docs](/python/api/overview/azure/mgmt-graphservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-graphservices_1.0.0/sdk/graphservices/azure-mgmt-graphservices/) |\n| Resource Management - Guest Configuration | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-guestconfig/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-guestconfig-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-guestconfig_1.0.0b2/sdk/machinelearning/azure-mgmt-guestconfig/) |\n| Resource Management - HANA on Azure | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-hanaonazure/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-hanaonazure/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-hanaonazure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hanaonazure_1.0.0/sdk/hanaonazure/azure-mgmt-hanaonazure/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hanaonazure_1.1.0b1/sdk/hanaonazure/azure-mgmt-hanaonazure/) |\n| Resource Management - Hardware Security Modules | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-hardwaresecuritymodules/1.0.0) | [docs](/python/api/overview/azure/mgmt-hardwaresecuritymodules-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hardwaresecuritymodules_1.0.0/sdk/hardwaresecuritymodules/azure-mgmt-hardwaresecuritymodules/) |\n| Resource Management - HDInsight | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-hdinsight/9.0.0)<br>PyPI [9.1.0b2](https://pypi.org/project/azure-mgmt-hdinsight/9.1.0b2) | [docs](/python/api/overview/azure/mgmt-hdinsight-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hdinsight_9.0.0/sdk/hdinsight/azure-mgmt-hdinsight/)<br>GitHub [9.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hdinsight_9.1.0b2/sdk/hdinsight/azure-mgmt-hdinsight/) |\n| Resource Management - Health Bot | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-healthbot/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-healthbot-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-healthbot_1.0.0b2/sdk/healthbot/azure-mgmt-healthbot/) |\n| Resource Management - Health Data AI Services | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-healthdataaiservices/1.0.0) | [docs](/python/api/overview/azure/mgmt-healthdataaiservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-healthdataaiservices_1.0.0/sdk/healthdataaiservices/azure-mgmt-healthdataaiservices/) |\n| Resource Management - Healthcare APIs | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-healthcareapis/2.1.0) | [docs](/python/api/overview/azure/mgmt-healthcareapis-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-healthcareapis_2.1.0/sdk/healthcareapis/azure-mgmt-healthcareapis/) |\n| Resource Management - Hybrid Compute | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-hybridcompute/9.0.0)<br>PyPI [9.1.0b2](https://pypi.org/project/azure-mgmt-hybridcompute/9.1.0b2) | [docs](/python/api/overview/azure/mgmt-hybridcompute-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridcompute_9.0.0/sdk/hybridcompute/azure-mgmt-hybridcompute/)<br>GitHub [9.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridcompute_9.1.0b2/sdk/hybridcompute/azure-mgmt-hybridcompute/) |\n| Resource Management - Hybrid Connectivity | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-hybridconnectivity/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-hybridconnectivity/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-hybridconnectivity-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridconnectivity_1.0.0/sdk/hybridconnectivity/azure-mgmt-hybridconnectivity/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridconnectivity_2.0.0b1/sdk/hybridconnectivity/azure-mgmt-hybridconnectivity/) |\n| Resource Management - Hybrid Container Service | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-hybridcontainerservice/1.0.0) | [docs](/python/api/overview/azure/mgmt-hybridcontainerservice-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridcontainerservice_1.0.0/sdk/hybridcontainerservice/azure-mgmt-hybridcontainerservice/) |\n| Resource Management - Hybrid Kubernetes | PyPI [1.2.0](https://pypi.org/project/azure-mgmt-hybridkubernetes/1.2.0) | [docs](/python/api/overview/azure/mgmt-hybridkubernetes-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridkubernetes_1.2.0/sdk/hybridkubernetes/azure-mgmt-hybridkubernetes/) |\n| Resource Management - Hybrid Network | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-hybridnetwork/2.0.0) | [docs](/python/api/overview/azure/mgmt-hybridnetwork-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridnetwork_2.0.0/sdk/hybridnetwork/azure-mgmt-hybridnetwork/) |\n| Resource Management - Image Builder | PyPI [1.4.0](https://pypi.org/project/azure-mgmt-imagebuilder/1.4.0) | [docs](/python/api/overview/azure/mgmt-imagebuilder-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-imagebuilder_1.4.0/sdk/compute/azure-mgmt-imagebuilder/) |\n| Resource Management - Impact Reporting | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-impactreporting/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-impactreporting-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-impactreporting_1.0.0b1/sdk/impactreporting/azure-mgmt-impactreporting/) |\n| Resource Management - Informatica Data Management | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-informaticadatamanagement/1.0.0) | [docs](/python/api/overview/azure/mgmt-informaticadatamanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-informaticadatamanagement_1.0.0/sdk/informaticadatamanagement/azure-mgmt-informaticadatamanagement/) |\n| Resource Management - IoT Central | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-iotcentral/9.0.0)<br>PyPI [10.0.0b2](https://pypi.org/project/azure-mgmt-iotcentral/10.0.0b2) | [docs](/python/api/overview/azure/mgmt-iotcentral-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iotcentral_9.0.0/sdk/iothub/azure-mgmt-iotcentral/)<br>GitHub [10.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iotcentral_10.0.0b2/sdk/iothub/azure-mgmt-iotcentral/) |\n| Resource Management - IoT Firmware Defense | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-iotfirmwaredefense/2.0.0) | [docs](/python/api/overview/azure/mgmt-iotfirmwaredefense-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iotfirmwaredefense_2.0.0/sdk/iotfirmwaredefense/azure-mgmt-iotfirmwaredefense/) |\n| Resource Management - IoT Hub | PyPI [4.0.0](https://pypi.org/project/azure-mgmt-iothub/4.0.0)<br>PyPI [5.0.0b2](https://pypi.org/project/azure-mgmt-iothub/5.0.0b2) | [docs](/python/api/overview/azure/mgmt-iothub-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iothub_4.0.0/sdk/iothub/azure-mgmt-iothub/)<br>GitHub [5.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iothub_5.0.0b2/sdk/iothub/azure-mgmt-iothub/) |\n| Resource Management - IoT Operations | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-iotoperations/1.1.0) | [docs](/python/api/overview/azure/mgmt-iotoperations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iotoperations_1.1.0/sdk/iotoperations/azure-mgmt-iotoperations/) |\n| Resource Management - Key Vault | PyPI [14.0.1](https://pypi.org/project/azure-mgmt-keyvault/14.0.1) | [docs](/python/api/overview/azure/mgmt-keyvault-readme) | GitHub [14.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-keyvault_14.0.1/sdk/keyvault/azure-mgmt-keyvault/) |\n| Resource Management - Kubernetes Configuration | PyPI [3.1.0](https://pypi.org/project/azure-mgmt-kubernetesconfiguration/3.1.0) | [docs](/python/api/overview/azure/mgmt-kubernetesconfiguration-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kubernetesconfiguration_3.1.0/sdk/kubernetesconfiguration/azure-mgmt-kubernetesconfiguration/) |\n| Resource Management - Kubernetesconfiguration-Extensions | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-kubernetesconfiguration-extensions/1.0.0) | [docs](/python/api/overview/azure/mgmt-kubernetesconfiguration-extensions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kubernetesconfiguration-extensions_1.0.0/sdk/kubernetesconfiguration/azure-mgmt-kubernetesconfiguration-extensions/) |\n| Resource Management - Kubernetesconfiguration-Extensiontypes | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-kubernetesconfiguration-extensiontypes/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-kubernetesconfiguration-extensiontypes-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kubernetesconfiguration-extensiontypes_1.0.0b2/sdk/kubernetesconfiguration/azure-mgmt-kubernetesconfiguration-extensiontypes/) |\n| Resource Management - Kubernetesconfiguration-Fluxconfigurations | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-kubernetesconfiguration-fluxconfigurations/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-kubernetesconfiguration-fluxconfigurations-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kubernetesconfiguration-fluxconfigurations_1.0.0b2/sdk/kubernetesconfiguration/azure-mgmt-kubernetesconfiguration-fluxconfigurations/) |\n| Resource Management - Kubernetesconfiguration-Privatelinkscopes | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-kubernetesconfiguration-privatelinkscopes/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-kubernetesconfiguration-privatelinkscopes-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kubernetesconfiguration-privatelinkscopes_1.0.0b2/sdk/kubernetesconfiguration/azure-mgmt-kubernetesconfiguration-privatelinkscopes/) |\n| Resource Management - Kusto | PyPI [3.4.0](https://pypi.org/project/azure-mgmt-kusto/3.4.0) | [docs](/python/api/overview/azure/mgmt-kusto-readme) | GitHub [3.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kusto_3.4.0/sdk/kusto/azure-mgmt-kusto/) |\n| Resource Management - Lab Services | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-labservices/2.0.0)<br>PyPI [2.1.0b1](https://pypi.org/project/azure-mgmt-labservices/2.1.0b1) | [docs](/python/api/overview/azure/mgmt-labservices-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-labservices_2.0.0/sdk/labservices/azure-mgmt-labservices/)<br>GitHub [2.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-labservices_2.1.0b1/sdk/labservices/azure-mgmt-labservices/) |\n| Resource Management - Lambdatesthyperexecute | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-lambdatesthyperexecute/1.0.0) | [docs](/python/api/overview/azure/mgmt-lambdatesthyperexecute-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-lambdatesthyperexecute_1.0.0/sdk/lambdatesthyperexecute/azure-mgmt-lambdatesthyperexecute/) |\n| Resource Management - Large Instance | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-largeinstance/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-largeinstance-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-largeinstance_1.0.0b1/sdk/largeinstance/azure-mgmt-largeinstance/) |\n| Resource Management - Load Testing | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-loadtesting/1.0.0) | [docs](/python/api/overview/azure/mgmt-loadtesting-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-loadtesting_1.0.0/sdk/loadtestservice/azure-mgmt-loadtesting/) |\n| Resource Management - Log Analytics | PyPI [13.1.1](https://pypi.org/project/azure-mgmt-loganalytics/13.1.1) | [docs](/python/api/overview/azure/mgmt-loganalytics-readme) | GitHub [13.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-loganalytics_13.1.1/sdk/loganalytics/azure-mgmt-loganalytics/) |\n| Resource Management - Logic Apps | PyPI [10.0.0](https://pypi.org/project/azure-mgmt-logic/10.0.0)<br>PyPI [10.1.0b1](https://pypi.org/project/azure-mgmt-logic/10.1.0b1) | [docs](/python/api/overview/azure/mgmt-logic-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-logic_10.0.0/sdk/logic/azure-mgmt-logic/)<br>GitHub [10.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-logic_10.1.0b1/sdk/logic/azure-mgmt-logic/) |\n| Resource Management - Machine Learning Compute | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-machinelearningcompute/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-machinelearningcompute-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-machinelearningcompute_1.0.0b2/sdk/machinelearning/azure-mgmt-machinelearningcompute/) |\n| Resource Management - Machine Learning Services | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-machinelearningservices/1.0.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-machinelearningservices/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-machinelearningservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-machinelearningservices_1.0.0/sdk/machinelearning/azure-mgmt-machinelearningservices/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-machinelearningservices_2.0.0b2/sdk/machinelearning/azure-mgmt-machinelearningservices/) |\n| Resource Management - Maintenance | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-maintenance/2.1.0)<br>PyPI [2.2.0b2](https://pypi.org/project/azure-mgmt-maintenance/2.2.0b2) | [docs](/python/api/overview/azure/mgmt-maintenance-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-maintenance_2.1.0/sdk/maintenance/azure-mgmt-maintenance/)<br>GitHub [2.2.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-maintenance_2.2.0b2/sdk/maintenance/azure-mgmt-maintenance/) |\n| Resource Management - Managed Applications | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-managedapplications/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-managedapplications-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managedapplications_1.0.0b1/sdk/managedapplications/azure-mgmt-managedapplications/) |\n| Resource Management - Managed Grafana | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-dashboard/2.0.0) | [docs](/python/api/overview/azure/mgmt-dashboard-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dashboard_2.0.0/sdk/dashboard/azure-mgmt-dashboard/) |\n| Resource Management - Managed Network Fabric | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-managednetworkfabric/1.0.0) | [docs](/python/api/overview/azure/mgmt-managednetworkfabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managednetworkfabric_1.0.0/sdk/managednetworkfabric/azure-mgmt-managednetworkfabric/) |\n| Resource Management - Managed Service Identity | PyPI [7.1.0](https://pypi.org/project/azure-mgmt-msi/7.1.0)<br>PyPI [8.0.0b1](https://pypi.org/project/azure-mgmt-msi/8.0.0b1) | [docs](/python/api/overview/azure/mgmt-msi-readme) | GitHub [7.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-msi_7.1.0/sdk/resources/azure-mgmt-msi/)<br>GitHub [8.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-msi_8.0.0b1/sdk/resources/azure-mgmt-msi/) |\n| Resource Management - Managed Services | PyPI [6.0.0](https://pypi.org/project/azure-mgmt-managedservices/6.0.0)<br>PyPI [7.0.0b2](https://pypi.org/project/azure-mgmt-managedservices/7.0.0b2) | [docs](/python/api/overview/azure/mgmt-managedservices-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managedservices_6.0.0/sdk/managedservices/azure-mgmt-managedservices/)<br>GitHub [7.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managedservices_7.0.0b2/sdk/managedservices/azure-mgmt-managedservices/) |\n| Resource Management - Managedops | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-managedops/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-managedops-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managedops_1.0.0b2/sdk/managedops/azure-mgmt-managedops/) |\n| Resource Management - Management Groups | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-managementgroups/1.1.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-managementgroups/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-managementgroups-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managementgroups_1.1.0/sdk/managementgroups/azure-mgmt-managementgroups/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managementgroups_2.0.0b1/sdk/managementgroups/azure-mgmt-managementgroups/) |\n| Resource Management - Management Partner | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-managementpartner/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-managementpartner/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-managementpartner-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managementpartner_1.0.0/sdk/managementpartner/azure-mgmt-managementpartner/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managementpartner_1.1.0b1/sdk/managementpartner/azure-mgmt-managementpartner/) |\n| Resource Management - Maps | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-maps/2.1.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-maps/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-maps-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-maps_2.1.0/sdk/maps/azure-mgmt-maps/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-maps_3.0.0b1/sdk/maps/azure-mgmt-maps/) |\n| Resource Management - Marketplace Ordering | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-marketplaceordering/1.1.0)<br>PyPI [1.2.0b2](https://pypi.org/project/azure-mgmt-marketplaceordering/1.2.0b2) | [docs](/python/api/overview/azure/mgmt-marketplaceordering-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-marketplaceordering_1.1.0/sdk/marketplaceordering/azure-mgmt-marketplaceordering/)<br>GitHub [1.2.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-marketplaceordering_1.2.0b2/sdk/marketplaceordering/azure-mgmt-marketplaceordering/) |\n| Resource Management - Migration Assessment | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-migrationassessment/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-migrationassessment-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-migrationassessment_1.0.0b1/sdk/migrate/azure-mgmt-migrationassessment/) |\n| Resource Management - Migration Discovery SAP | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-migrationdiscoverysap/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-migrationdiscoverysap-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-migrationdiscoverysap_1.0.0b1/sdk/migrationdiscovery/azure-mgmt-migrationdiscoverysap/) |\n| Resource Management - Mongo Cluster | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-mongocluster/1.1.0) | [docs](/python/api/overview/azure/mgmt-mongocluster-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mongocluster_1.1.0/sdk/mongocluster/azure-mgmt-mongocluster/) |\n| Resource Management - Mongodbatlas | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-mongodbatlas/1.0.0) | [docs](/python/api/overview/azure/mgmt-mongodbatlas-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mongodbatlas_1.0.0/sdk/mongodbatlas/azure-mgmt-mongodbatlas/) |\n| Resource Management - Monitor | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-monitor/7.0.0)<br>PyPI [8.0.0b2](https://pypi.org/project/azure-mgmt-monitor/8.0.0b2) | [docs](/python/api/overview/azure/mgmt-monitor-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-monitor_7.0.0/sdk/monitor/azure-mgmt-monitor/)<br>GitHub [8.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-monitor_8.0.0b2/sdk/monitor/azure-mgmt-monitor/) |\n| Resource Management - MySQL Flexible Servers | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-mysqlflexibleservers/1.0.0)<br>PyPI [1.1.0b2](https://pypi.org/project/azure-mgmt-mysqlflexibleservers/1.1.0b2) | [docs](/python/api/overview/azure/mgmt-mysqlflexibleservers-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mysqlflexibleservers_1.0.0/sdk/mysqlflexibleservers/azure-mgmt-mysqlflexibleservers/)<br>GitHub [1.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mysqlflexibleservers_1.1.0b2/sdk/mysqlflexibleservers/azure-mgmt-mysqlflexibleservers/) |\n| Resource Management - NetApp Files | PyPI [16.0.0](https://pypi.org/project/azure-mgmt-netapp/16.0.0) | [docs](/python/api/overview/azure/mgmt-netapp-readme) | GitHub [16.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-netapp_16.0.0/sdk/netapp/azure-mgmt-netapp/) |\n| Resource Management - Network | PyPI [30.2.0](https://pypi.org/project/azure-mgmt-network/30.2.0)<br>PyPI [31.0.0b1](https://pypi.org/project/azure-mgmt-network/31.0.0b1) | [docs](/python/api/overview/azure/mgmt-network-readme) | GitHub [30.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-network_30.2.0/sdk/network/azure-mgmt-network/)<br>GitHub [31.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-network_31.0.0b1/sdk/network/azure-mgmt-network/) |\n| Resource Management - Network Function | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-networkfunction/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-networkfunction-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-networkfunction_1.0.0b2/sdk/networkfunction/azure-mgmt-networkfunction/) |\n| Resource Management - Networkcloud | PyPI [2.2.0](https://pypi.org/project/azure-mgmt-networkcloud/2.2.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-networkcloud/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-networkcloud-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-networkcloud_2.2.0/sdk/networkcloud/azure-mgmt-networkcloud/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-networkcloud_3.0.0b1/sdk/networkcloud/azure-mgmt-networkcloud/) |\n| Resource Management - New Relic Observability | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-newrelicobservability/1.1.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-newrelicobservability/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-newrelicobservability-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-newrelicobservability_1.1.0/sdk/newrelicobservability/azure-mgmt-newrelicobservability/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-newrelicobservability_2.0.0b1/sdk/newrelicobservability/azure-mgmt-newrelicobservability/) |\n| Resource Management - Nginx | PyPI [4.0.0](https://pypi.org/project/azure-mgmt-nginx/4.0.0) | [docs](/python/api/overview/azure/mgmt-nginx-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-nginx_4.0.0/sdk/nginx/azure-mgmt-nginx/) |\n| Resource Management - Notification Hubs | PyPI [8.0.0](https://pypi.org/project/azure-mgmt-notificationhubs/8.0.0)<br>PyPI [8.1.0b2](https://pypi.org/project/azure-mgmt-notificationhubs/8.1.0b2) | [docs](/python/api/overview/azure/mgmt-notificationhubs-readme) | GitHub [8.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-notificationhubs_8.0.0/sdk/notificationhubs/azure-mgmt-notificationhubs/)<br>GitHub [8.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-notificationhubs_8.1.0b2/sdk/notificationhubs/azure-mgmt-notificationhubs/) |\n| Resource Management - Oep | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-oep/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-oep-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-oep_1.0.0b2/sdk/oep/azure-mgmt-oep/) |\n| Resource Management - Onlineexperimentation | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-onlineexperimentation/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-onlineexperimentation-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-onlineexperimentation_1.0.0b1/sdk/onlineexperimentation/azure-mgmt-onlineexperimentation/) |\n| Resource Management - Operations Management | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-operationsmanagement/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-operationsmanagement/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-operationsmanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-operationsmanagement_1.0.0/sdk/operationsmanagement/azure-mgmt-operationsmanagement/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-operationsmanagement_2.0.0b1/sdk/operationsmanagement/azure-mgmt-operationsmanagement/) |\n| Resource Management - Oracle Database | PyPI [3.0.0](https://pypi.org/project/azure-mgmt-oracledatabase/3.0.0) | [docs](/python/api/overview/azure/mgmt-oracledatabase-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-oracledatabase_3.0.0/sdk/oracledatabase/azure-mgmt-oracledatabase/) |\n| Resource Management - Orbital | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-orbital/2.0.0) | [docs](/python/api/overview/azure/mgmt-orbital-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-orbital_2.0.0/sdk/orbital/azure-mgmt-orbital/) |\n| Resource Management - Palo Alto Networks - Next Generation Firewall | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-paloaltonetworksngfw/1.1.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-paloaltonetworksngfw/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-paloaltonetworksngfw-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-paloaltonetworksngfw_1.1.0/sdk/paloaltonetworks/azure-mgmt-paloaltonetworksngfw/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-paloaltonetworksngfw_2.0.0b1/sdk/paloaltonetworks/azure-mgmt-paloaltonetworksngfw/) |\n| Resource Management - Peering | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-peering/1.0.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-peering/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-peering-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-peering_1.0.0/sdk/peering/azure-mgmt-peering/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-peering_2.0.0b2/sdk/peering/azure-mgmt-peering/) |\n| Resource Management - Pinecone Vector DB | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-pineconevectordb/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-pineconevectordb-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-pineconevectordb_1.0.0b2/sdk/pineconevectordb/azure-mgmt-pineconevectordb/) |\n| Resource Management - Planetarycomputer | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-planetarycomputer/1.0.0) | [docs](/python/api/overview/azure/mgmt-planetarycomputer-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-planetarycomputer_1.0.0/sdk/planetarycomputer/azure-mgmt-planetarycomputer/) |\n| Resource Management - Playwright | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-playwright/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-playwright/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-playwright_1.0.0/sdk/playwright/azure-mgmt-playwright/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-playwright_1.1.0b1/sdk/playwright/azure-mgmt-playwright/) |\n| Resource Management - Policy Insights | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-policyinsights/1.0.0)<br>PyPI [1.1.0b5](https://pypi.org/project/azure-mgmt-policyinsights/1.1.0b5) | [docs](/python/api/overview/azure/mgmt-policyinsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-policyinsights_1.0.0/sdk/policyinsights/azure-mgmt-policyinsights/)<br>GitHub [1.1.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-policyinsights_1.1.0b5/sdk/policyinsights/azure-mgmt-policyinsights/) |\n| Resource Management - Portal | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-portal/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-portal/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-portal-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-portal_1.0.0/sdk/portal/azure-mgmt-portal/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-portal_1.1.0b1/sdk/portal/azure-mgmt-portal/) |\n| Resource Management - Portalservicescopilot | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-portalservicescopilot/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-portalservicescopilot-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-portalservicescopilot_1.0.0b1/sdk/portalservices/azure-mgmt-portalservicescopilot/) |\n| Resource Management - PostgreSQL | PyPI [10.1.1](https://pypi.org/project/azure-mgmt-rdbms/10.1.1)<br>PyPI [10.2.0b18](https://pypi.org/project/azure-mgmt-rdbms/10.2.0b18) | [docs](/python/api/overview/azure/mgmt-rdbms-readme) | GitHub [10.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-rdbms_10.1.1/sdk/rdbms/azure-mgmt-rdbms/)<br>GitHub [10.2.0b18](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-rdbms_10.2.0b18/sdk/rdbms/azure-mgmt-rdbms/) |\n| Resource Management - PostgreSQL  Flexible Servers | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-postgresqlflexibleservers/2.0.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-postgresqlflexibleservers/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-postgresqlflexibleservers-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-postgresqlflexibleservers_2.0.0/sdk/postgresqlflexibleservers/azure-mgmt-postgresqlflexibleservers/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-postgresqlflexibleservers_3.0.0b1/sdk/postgresqlflexibleservers/azure-mgmt-postgresqlflexibleservers/) |\n| Resource Management - Power BI Dedicated | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-powerbidedicated/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-powerbidedicated/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-powerbidedicated-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-powerbidedicated_1.0.0/sdk/powerbidedicated/azure-mgmt-powerbidedicated/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-powerbidedicated_1.1.0b1/sdk/powerbidedicated/azure-mgmt-powerbidedicated/) |\n| Resource Management - Private DNS | PyPI [1.2.0](https://pypi.org/project/azure-mgmt-privatedns/1.2.0) | [docs](/python/api/overview/azure/mgmt-privatedns-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-privatedns_1.2.0/sdk/network/azure-mgmt-privatedns/) |\n| Resource Management - Purestorageblock | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-purestorageblock/1.0.0) | [docs](/python/api/overview/azure/mgmt-purestorageblock-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-purestorageblock_1.0.0/sdk/purestorageblock/azure-mgmt-purestorageblock/) |\n| Resource Management - Purview | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-purview/1.0.0)<br>PyPI [1.1.0b2](https://pypi.org/project/azure-mgmt-purview/1.1.0b2) | [docs](/python/api/overview/azure/mgmt-purview-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-purview_1.0.0/sdk/purview/azure-mgmt-purview/)<br>GitHub [1.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-purview_1.1.0b2/sdk/purview/azure-mgmt-purview/) |\n| Resource Management - Quantum | PyPI [1.0.0b5](https://pypi.org/project/azure-mgmt-quantum/1.0.0b5) | [docs](/python/api/overview/azure/mgmt-quantum-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-quantum_1.0.0b5/sdk/quantum/azure-mgmt-quantum/) |\n| Resource Management - Qumulo | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-qumulo/2.0.0) | [docs](/python/api/overview/azure/mgmt-qumulo-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-qumulo_2.0.0/sdk/qumulo/azure-mgmt-qumulo/) |\n| Resource Management - Quota | PyPI [3.0.1](https://pypi.org/project/azure-mgmt-quota/3.0.1) | [docs](/python/api/overview/azure/mgmt-quota-readme) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-quota_3.0.1/sdk/quota/azure-mgmt-quota/) |\n| Resource Management - Recovery Services | PyPI [4.0.0](https://pypi.org/project/azure-mgmt-recoveryservices/4.0.0) | [docs](/python/api/overview/azure/mgmt-recoveryservices-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservices_4.0.0/sdk/recoveryservices/azure-mgmt-recoveryservices/) |\n| Resource Management - Recovery Services Backup | PyPI [10.0.0](https://pypi.org/project/azure-mgmt-recoveryservicesbackup/10.0.0)<br>PyPI [11.0.0b1](https://pypi.org/project/azure-mgmt-recoveryservicesbackup/11.0.0b1) | [docs](/python/api/overview/azure/mgmt-recoveryservicesbackup-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicesbackup_10.0.0/sdk/recoveryservices/azure-mgmt-recoveryservicesbackup/)<br>GitHub [11.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicesbackup_11.0.0b1/sdk/recoveryservices/azure-mgmt-recoveryservicesbackup/) |\n| Resource Management - Recovery Services Data Replication | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-recoveryservicesdatareplication/1.0.0) | [docs](/python/api/overview/azure/mgmt-recoveryservicesdatareplication-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicesdatareplication_1.0.0/sdk/recoveryservicesdatareplication/azure-mgmt-recoveryservicesdatareplication/) |\n| Resource Management - Recovery Services Site Recovery | PyPI [1.3.0](https://pypi.org/project/azure-mgmt-recoveryservicessiterecovery/1.3.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-recoveryservicessiterecovery/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-recoveryservicessiterecovery-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicessiterecovery_1.3.0/sdk/recoveryservices/azure-mgmt-recoveryservicessiterecovery/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicessiterecovery_2.0.0b1/sdk/recoveryservices/azure-mgmt-recoveryservicessiterecovery/) |\n| Resource Management - Recoveryservicesbackup-Passivestamp | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-recoveryservicesbackup-passivestamp/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-recoveryservicesbackup-passivestamp-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicesbackup-passivestamp_1.0.0b1/sdk/recoveryservices/azure-mgmt-recoveryservicesbackup-passivestamp/) |\n| Resource Management - Red Hat OpenShift | PyPI [3.0.0](https://pypi.org/project/azure-mgmt-redhatopenshift/3.0.0) | [docs](/python/api/overview/azure/mgmt-redhatopenshift-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-redhatopenshift_3.0.0/sdk/redhatopenshift/azure-mgmt-redhatopenshift/) |\n| Resource Management - Redis | PyPI [14.5.0](https://pypi.org/project/azure-mgmt-redis/14.5.0) | [docs](/python/api/overview/azure/mgmt-redis-readme) | GitHub [14.5.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-redis_14.5.0/sdk/redis/azure-mgmt-redis/) |\n| Resource Management - Redis Enterprise | PyPI [3.1.0](https://pypi.org/project/azure-mgmt-redisenterprise/3.1.0)<br>PyPI [4.0.0b1](https://pypi.org/project/azure-mgmt-redisenterprise/4.0.0b1) | [docs](/python/api/overview/azure/mgmt-redisenterprise-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-redisenterprise_3.1.0/sdk/redisenterprise/azure-mgmt-redisenterprise/)<br>GitHub [4.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-redisenterprise_4.0.0b1/sdk/redisenterprise/azure-mgmt-redisenterprise/) |\n| Resource Management - Relay | PyPI [1.1.1](https://pypi.org/project/azure-mgmt-relay/1.1.1)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-relay/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-relay-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-relay_1.1.1/sdk/relay/azure-mgmt-relay/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-relay_2.0.0b1/sdk/relay/azure-mgmt-relay/) |\n| Resource Management - Reservations | PyPI [2.3.0](https://pypi.org/project/azure-mgmt-reservations/2.3.0) | [docs](/python/api/overview/azure/mgmt-reservations-readme) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-reservations_2.3.0/sdk/reservations/azure-mgmt-reservations/) |\n| Resource Management - Resource Connector | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-resourceconnector/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-resourceconnector/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-resourceconnector-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourceconnector_1.0.0/sdk/resourceconnector/azure-mgmt-resourceconnector/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourceconnector_2.0.0b1/sdk/resourceconnector/azure-mgmt-resourceconnector/) |\n| Resource Management - Resource Graph | PyPI [8.0.1](https://pypi.org/project/azure-mgmt-resourcegraph/8.0.1)<br>PyPI [8.1.0b3](https://pypi.org/project/azure-mgmt-resourcegraph/8.1.0b3) | [docs](/python/api/overview/azure/mgmt-resourcegraph-readme) | GitHub [8.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourcegraph_8.0.1/sdk/resources/azure-mgmt-resourcegraph/)<br>GitHub [8.1.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourcegraph_8.1.0b3/sdk/resources/azure-mgmt-resourcegraph/) |\n| Resource Management - Resource Health | PyPI [1.0.0b6](https://pypi.org/project/azure-mgmt-resourcehealth/1.0.0b6) | [docs](/python/api/overview/azure/mgmt-resourcehealth-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b6](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourcehealth_1.0.0b6/sdk/resourcehealth/azure-mgmt-resourcehealth/) |\n| Resource Management - Resource Mover | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-resourcemover/1.1.0) | [docs](/python/api/overview/azure/mgmt-resourcemover-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourcemover_1.1.0/sdk/resourcemover/azure-mgmt-resourcemover/) |\n| Resource Management - Resource-Bicep | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-bicep/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-bicep-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-bicep_1.0.0b1/sdk/resources/azure-mgmt-resource-bicep/) |\n| Resource Management - Resource-Changes | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-changes/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-changes-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-changes_1.0.0b1/sdk/resources/azure-mgmt-resource-changes/) |\n| Resource Management - Resource-Databoundaries | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-databoundaries/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-databoundaries-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-databoundaries_1.0.0b1/sdk/resources/azure-mgmt-resource-databoundaries/) |\n| Resource Management - Resource-Deployments | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-deployments/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-deployments-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-deployments_1.0.0b1/sdk/resources/azure-mgmt-resource-deployments/) |\n| Resource Management - Resource-Deploymentscripts | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-deploymentscripts/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-deploymentscripts-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-deploymentscripts_1.0.0b1/sdk/resources/azure-mgmt-resource-deploymentscripts/) |\n| Resource Management - Resource-Deploymentstacks | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-resource-deploymentstacks/1.0.0) | [docs](/python/api/overview/azure/mgmt-resource-deploymentstacks-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-deploymentstacks_1.0.0/sdk/resources/azure-mgmt-resource-deploymentstacks/) |\n| Resource Management - Resource-Features | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-features/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-features-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-features_1.0.0b1/sdk/resources/azure-mgmt-resource-features/) |\n| Resource Management - Resource-Links | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-links/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-links-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-links_1.0.0b1/sdk/resources/azure-mgmt-resource-links/) |\n| Resource Management - Resource-Locks | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-locks/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-locks-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-locks_1.0.0b1/sdk/resources/azure-mgmt-resource-locks/) |\n| Resource Management - Resource-Managedapplications | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-managedapplications/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-managedapplications-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-managedapplications_1.0.0b1/sdk/resources/azure-mgmt-resource-managedapplications/) |\n| Resource Management - Resource-Policy | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-resource-policy/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-resource-policy-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-policy_1.0.0b2/sdk/resources/azure-mgmt-resource-policy/) |\n| Resource Management - Resource-Privatelinks | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-privatelinks/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-privatelinks-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-privatelinks_1.0.0b1/sdk/resources/azure-mgmt-resource-privatelinks/) |\n| Resource Management - Resource-Subscriptions | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-subscriptions/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-subscriptions-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-subscriptions_1.0.0b1/sdk/resources/azure-mgmt-resource-subscriptions/) |\n| Resource Management - Resource-Templatespecs | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-templatespecs/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-templatespecs-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-templatespecs_1.0.0b1/sdk/resources/azure-mgmt-resource-templatespecs/) |\n| Resource Management - Resources | PyPI [25.0.0](https://pypi.org/project/azure-mgmt-resource/25.0.0) | [docs](/python/api/overview/azure/mgmt-resource-readme) | GitHub [25.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource_25.0.0/sdk/resources/azure-mgmt-resource/) |\n| Resource Management - Scvmm | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-scvmm/1.0.0) | [docs](/python/api/overview/azure/mgmt-scvmm-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-scvmm_1.0.0/sdk/scvmm/azure-mgmt-scvmm/) |\n| Resource Management - Secretsstoreextension | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-secretsstoreextension/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-secretsstoreextension-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-secretsstoreextension_1.0.0b1/sdk/secretsstoreextension/azure-mgmt-secretsstoreextension/) |\n| Resource Management - Security | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-security/7.0.0)<br>PyPI [8.0.0b1](https://pypi.org/project/azure-mgmt-security/8.0.0b1) | [docs](/python/api/overview/azure/mgmt-security-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-security_7.0.0/sdk/security/azure-mgmt-security/)<br>GitHub [8.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-security_8.0.0b1/sdk/security/azure-mgmt-security/) |\n| Resource Management - Security Insights | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-securityinsight/1.0.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-securityinsight/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-securityinsight-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-securityinsight_1.0.0/sdk/securityinsight/azure-mgmt-securityinsight/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-securityinsight_2.0.0b2/sdk/securityinsight/azure-mgmt-securityinsight/) |\n| Resource Management - Self Help | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-selfhelp/1.0.0)<br>PyPI [2.0.0b4](https://pypi.org/project/azure-mgmt-selfhelp/2.0.0b4) | [docs](/python/api/overview/azure/mgmt-selfhelp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-selfhelp_1.0.0/sdk/selfhelp/azure-mgmt-selfhelp/)<br>GitHub [2.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-selfhelp_2.0.0b4/sdk/selfhelp/azure-mgmt-selfhelp/) |\n| Resource Management - Serial Console | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-serialconsole/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-serialconsole/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-serialconsole-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-serialconsole_1.0.0/sdk/serialconsole/azure-mgmt-serialconsole/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-serialconsole_1.1.0b1/sdk/serialconsole/azure-mgmt-serialconsole/) |\n| Resource Management - Service Bus | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-servicebus/9.0.0)<br>PyPI [10.0.0b1](https://pypi.org/project/azure-mgmt-servicebus/10.0.0b1) | [docs](/python/api/overview/azure/mgmt-servicebus-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicebus_9.0.0/sdk/servicebus/azure-mgmt-servicebus/)<br>GitHub [10.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicebus_10.0.0b1/sdk/servicebus/azure-mgmt-servicebus/) |\n| Resource Management - Service Fabric | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-servicefabric/2.1.0)<br>PyPI [2.2.0b1](https://pypi.org/project/azure-mgmt-servicefabric/2.2.0b1) | [docs](/python/api/overview/azure/mgmt-servicefabric-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicefabric_2.1.0/sdk/servicefabric/azure-mgmt-servicefabric/)<br>GitHub [2.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicefabric_2.2.0b1/sdk/servicefabric/azure-mgmt-servicefabric/) |\n| Resource Management - Service Fabric Managed Clusters | PyPI [3.0.0](https://pypi.org/project/azure-mgmt-servicefabricmanagedclusters/3.0.0) | [docs](/python/api/overview/azure/mgmt-servicefabricmanagedclusters-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicefabricmanagedclusters_3.0.0/sdk/servicefabricmanagedclusters/azure-mgmt-servicefabricmanagedclusters/) |\n| Resource Management - Service Linker | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-servicelinker/1.1.0)<br>PyPI [1.2.0b3](https://pypi.org/project/azure-mgmt-servicelinker/1.2.0b3) | [docs](/python/api/overview/azure/mgmt-servicelinker-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicelinker_1.1.0/sdk/servicelinker/azure-mgmt-servicelinker/)<br>GitHub [1.2.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicelinker_1.2.0b3/sdk/servicelinker/azure-mgmt-servicelinker/) |\n| Resource Management - Service Networking | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-servicenetworking/2.0.0)<br>PyPI [2.1.0b1](https://pypi.org/project/azure-mgmt-servicenetworking/2.1.0b1) | [docs](/python/api/overview/azure/mgmt-servicenetworking-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicenetworking_2.0.0/sdk/servicenetworking/azure-mgmt-servicenetworking/)<br>GitHub [2.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicenetworking_2.1.0b1/sdk/servicenetworking/azure-mgmt-servicenetworking/) |\n| Resource Management - SignalR | PyPI [1.2.0](https://pypi.org/project/azure-mgmt-signalr/1.2.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-signalr/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-signalr-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-signalr_1.2.0/sdk/signalr/azure-mgmt-signalr/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-signalr_2.0.0b2/sdk/signalr/azure-mgmt-signalr/) |\n| Resource Management - Sitemanager | PyPI [1.0.1](https://pypi.org/project/azure-mgmt-sitemanager/1.0.1) | [docs](/python/api/overview/azure/mgmt-sitemanager-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-sitemanager_1.0.1/sdk/sitemanager/azure-mgmt-sitemanager/) |\n| Resource Management - Sphere | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-sphere/1.0.0) | [docs](/python/api/overview/azure/mgmt-sphere-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-sphere_1.0.0/sdk/sphere/azure-mgmt-sphere/) |\n| Resource Management - Spring App Discovery | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-springappdiscovery/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-springappdiscovery-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-springappdiscovery_1.0.0b1/sdk/springappdiscovery/azure-mgmt-springappdiscovery/) |\n| Resource Management - SQL | PyPI [3.0.1](https://pypi.org/project/azure-mgmt-sql/3.0.1)<br>PyPI [4.0.0b24](https://pypi.org/project/azure-mgmt-sql/4.0.0b24) | [docs](/python/api/overview/azure/mgmt-sql-readme) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-sql_3.0.1/sdk/sql/azure-mgmt-sql/)<br>GitHub [4.0.0b24](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-sql_4.0.0b24/sdk/sql/azure-mgmt-sql/) |\n| Resource Management - SQL Virtual Machine | PyPI [1.0.0b6](https://pypi.org/project/azure-mgmt-sqlvirtualmachine/1.0.0b6) | [docs](/python/api/overview/azure/mgmt-sqlvirtualmachine-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b6](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-sqlvirtualmachine_1.0.0b6/sdk/sql/azure-mgmt-sqlvirtualmachine/) |\n| Resource Management - Standby Pool | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-standbypool/2.0.0) | [docs](/python/api/overview/azure/mgmt-standbypool-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-standbypool_2.0.0/sdk/standbypool/azure-mgmt-standbypool/) |\n| Resource Management - Storage | PyPI [24.0.1](https://pypi.org/project/azure-mgmt-storage/24.0.1) | [docs](/python/api/overview/azure/mgmt-storage-readme) | GitHub [24.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storage_24.0.1/sdk/storage/azure-mgmt-storage/) |\n| Resource Management - Storage Actions | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-storageactions/1.0.0) | [docs](/python/api/overview/azure/mgmt-storageactions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storageactions_1.0.0/sdk/storageactions/azure-mgmt-storageactions/) |\n| Resource Management - Storage Cache | PyPI [3.0.1](https://pypi.org/project/azure-mgmt-storagecache/3.0.1) | [docs](/python/api/overview/azure/mgmt-storagecache-readme) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagecache_3.0.1/sdk/storage/azure-mgmt-storagecache/) |\n| Resource Management - Storage Mover | PyPI [3.0.0](https://pypi.org/project/azure-mgmt-storagemover/3.0.0) | [docs](/python/api/overview/azure/mgmt-storagemover-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagemover_3.0.0/sdk/storagemover/azure-mgmt-storagemover/) |\n| Resource Management - Storage Pool | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-storagepool/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-storagepool/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-storagepool-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagepool_1.0.0/sdk/storagepool/azure-mgmt-storagepool/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagepool_1.1.0b1/sdk/storagepool/azure-mgmt-storagepool/) |\n| Resource Management - Storage Sync | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-storagesync/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-storagesync/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-storagesync-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagesync_1.0.0/sdk/storage/azure-mgmt-storagesync/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagesync_2.0.0b1/sdk/storage/azure-mgmt-storagesync/) |\n| Resource Management - Storagediscovery | PyPI [1.0.1](https://pypi.org/project/azure-mgmt-storagediscovery/1.0.1) | [docs](/python/api/overview/azure/mgmt-storagediscovery-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagediscovery_1.0.1/sdk/storagediscovery/azure-mgmt-storagediscovery/) |\n| Resource Management - Stream Analytics | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-streamanalytics/1.0.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-streamanalytics/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-streamanalytics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-streamanalytics_1.0.0/sdk/streamanalytics/azure-mgmt-streamanalytics/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-streamanalytics_2.0.0b2/sdk/streamanalytics/azure-mgmt-streamanalytics/) |\n| Resource Management - Subscriptions | PyPI [3.1.1](https://pypi.org/project/azure-mgmt-subscription/3.1.1)<br>PyPI [3.2.0b1](https://pypi.org/project/azure-mgmt-subscription/3.2.0b1) | [docs](/python/api/overview/azure/mgmt-subscription-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-subscription_3.1.1/sdk/subscription/azure-mgmt-subscription/)<br>GitHub [3.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-subscription_3.2.0b1/sdk/subscription/azure-mgmt-subscription/) |\n| Resource Management - Support | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-support/7.0.0) | [docs](/python/api/overview/azure/mgmt-support-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-support_7.0.0/sdk/support/azure-mgmt-support/) |\n| Resource Management - Synapse | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-synapse/2.0.0)<br>PyPI [2.1.0b7](https://pypi.org/project/azure-mgmt-synapse/2.1.0b7) | [docs](/python/api/overview/azure/mgmt-synapse-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-synapse_2.0.0/sdk/synapse/azure-mgmt-synapse/)<br>GitHub [2.1.0b7](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-synapse_2.1.0b7/sdk/synapse/azure-mgmt-synapse/) |\n| Resource Management - Terraform | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-terraform/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-terraform-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-terraform_1.0.0b1/sdk/terraform/azure-mgmt-terraform/) |\n| Resource Management - Time Series Insights | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-timeseriesinsights/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-timeseriesinsights/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-timeseriesinsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-timeseriesinsights_1.0.0/sdk/timeseriesinsights/azure-mgmt-timeseriesinsights/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-timeseriesinsights_2.0.0b1/sdk/timeseriesinsights/azure-mgmt-timeseriesinsights/) |\n| Resource Management - Traffic Manager | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-trafficmanager/1.1.0) | [docs](/python/api/overview/azure/mgmt-trafficmanager-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-trafficmanager_1.1.0/sdk/trafficmanager/azure-mgmt-trafficmanager/) |\n| Resource Management - Trusted Signing | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-trustedsigning/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-trustedsigning-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-trustedsigning_1.0.0b1/sdk/trustedsigning/azure-mgmt-trustedsigning/) |\n| Resource Management - VMware Solution by CloudSimple | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-vmwarecloudsimple/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-vmwarecloudsimple-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-vmwarecloudsimple_1.0.0b2/sdk/compute/azure-mgmt-vmwarecloudsimple/) |\n| Resource Management - Voice Services | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-voiceservices/1.0.0) | [docs](/python/api/overview/azure/mgmt-voiceservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-voiceservices_1.0.0/sdk/voiceservices/azure-mgmt-voiceservices/) |\n| Resource Management - Web PubSub | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-webpubsub/2.0.0) | [docs](/python/api/overview/azure/mgmt-webpubsub-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-webpubsub_2.0.0/sdk/webpubsub/azure-mgmt-webpubsub/) |\n| Resource Management - Weights & Biases | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-weightsandbiases/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-weightsandbiases-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-weightsandbiases_1.0.0b1/sdk/weightsandbiases/azure-mgmt-weightsandbiases/) |\n| Resource Management - Workloadorchestration | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-workloadorchestration/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-workloadorchestration-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-workloadorchestration_1.0.0b1/sdk/workloadorchestration/azure-mgmt-workloadorchestration/) |\n| Resource Management - Workloads | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-workloads/1.0.0) | [docs](/python/api/overview/azure/mgmt-workloads-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-workloads_1.0.0/sdk/workloads/azure-mgmt-workloads/) |\n| Resource Management - Workloads SAP Virtual Instance | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-workloadssapvirtualinstance/1.0.0) | [docs](/python/api/overview/azure/mgmt-workloadssapvirtualinstance-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-workloadssapvirtualinstance_1.0.0/sdk/workloads/azure-mgmt-workloadssapvirtualinstance/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-appnetwork/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-appnetwork-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appnetwork_1.0.0b1/sdk/appnetwork/azure-mgmt-appnetwork/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-certificateregistration/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-certificateregistration-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-certificateregistration_1.0.0b1/sdk/certificateregistration/azure-mgmt-certificateregistration/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-containerregistrytasks/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-containerregistrytasks-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerregistrytasks_1.0.0b1/sdk/containerregistry/azure-mgmt-containerregistrytasks/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-domainregistration/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-domainregistration-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-domainregistration_1.0.0b1/sdk/domainregistration/azure-mgmt-domainregistration/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-horizondb/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-horizondb-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-horizondb_1.0.0b1/sdk/horizondb/azure-mgmt-horizondb/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-monitorslis/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-monitorslis-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-monitorslis_1.0.0b1/sdk/monitor/azure-mgmt-monitorslis/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-relationships/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-relationships-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-relationships_1.0.0b1/sdk/relationships/azure-mgmt-relationships/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-servicegroups/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-servicegroups-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicegroups_1.0.0b1/sdk/servicegroups/azure-mgmt-servicegroups/) |\n| AI Agent Server - Agent Framework | PyPI [1.0.0b17](https://pypi.org/project/azure-ai-agentserver-agentframework/1.0.0b17) |  |  |\n| AI Agent Server - LangGraph | PyPI [1.0.0b17](https://pypi.org/project/azure-ai-agentserver-langgraph/1.0.0b17) |  |  |\n| azure-communication-administration | PyPI [1.0.0b4](https://pypi.org/project/azure-communication-administration/1.0.0b4) |  |  |\n| Unknown Display Name | PyPI [0.0.0](https://pypi.org/project/apiview-copilot/0.0.0) |  |  |\n| Unknown Display Name | PyPI [0.0.0](https://pypi.org/project/apiview-stub-generator-test/0.0.0) |  |  |\n| Unknown Display Name | PyPI [1.0.0b3](https://pypi.org/project/azure-ai-agentserver-invocations/1.0.0b3) |  |  |\n| azureml-fsspec | PyPI [1.0.0](https://pypi.org/project/azureml-fsspec/1.0.0) |  |  |\n| Core - Client - Tracing Opencensus | PyPI [1.0.0b10](https://pypi.org/project/azure-core-tracing-opencensus/1.0.0b10) | [docs](/python/api/overview/azure/core-tracing-opencensus-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b10](https://github.com/Azure/azure-sdk-for-python/tree/azure-core-tracing-opencensus_1.0.0b10/sdk/core/azure-core-tracing-opencensus/) |\n| Device Provisioning Services | PyPI [1.2.0](https://pypi.org/project/azure-iothub-provisioningserviceclient/1.2.0) |  |  |\n| Ink Recognizer | PyPI [1.0.0b1](https://pypi.org/project/azure-cognitiveservices-inkrecognizer/1.0.0b1) |  | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-cognitiveservices-inkrecognizer_1.0.0b1/sdk/cognitiveservices/azure-cognitiveservices-inkrecognizer/) |\n| IoT Device | PyPI [2.12.0](https://pypi.org/project/azure-iot-device/2.12.0)<br>PyPI [3.0.0b2](https://pypi.org/project/azure-iot-device/3.0.0b2) |  |  |\n| IoT Hub | PyPI [2.7.0](https://pypi.org/project/azure-iot-hub/2.7.0) |  |  |\n| iotedgedev | PyPI [3.3.7](https://pypi.org/project/iotedgedev/3.3.7) |  |  |\n| iotedgehubdev | PyPI [0.14.18](https://pypi.org/project/iotedgehubdev/0.14.18) |  |  |\n| Key Vault | PyPI [4.2.0](https://pypi.org/project/azure-keyvault/4.2.0) |  | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault_4.2.0/sdk/keyvault/azure-keyvault/) |\n| Kusto Data | PyPI [2.0.0](https://pypi.org/project/azure-kusto-data/2.0.0) |  |  |\n| Machine Learning | PyPI [1.2.0](https://pypi.org/project/azureml-sdk/1.2.0) |  |  |\n| Machine Learning - Table | PyPI [1.3.0](https://pypi.org/project/mltable/1.3.0) |  |  |\n| Machine Learning Monitoring | PyPI [0.1.0a3](https://pypi.org/project/azure-ai-mlmonitoring/0.1.0a3) |  |  |\n| Purview Administration | PyPI [1.0.0b1](https://pypi.org/project/azure-purview-administration/1.0.0b1) |  | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-administration_1.0.0b1/sdk/purview/azure-purview-administration/) |\n| Service Fabric | PyPI [8.2.0.0](https://pypi.org/project/azure-servicefabric/8.2.0.0) | [docs](/python/api/overview/azure/servicefabric-readme) | GitHub [8.2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-servicefabric_8.2.0.0/sdk/servicefabric/azure-servicefabric/) |\n| Speech | PyPI [1.14.0](https://pypi.org/project/azure-cognitiveservices-speech/1.14.0) |  |  |\n| Storage | PyPI [0.37.0](https://pypi.org/project/azure-storage/0.37.0) |  | GitHub [0.37.0](https://github.com/Azure/azure-storage-python) |\n| Storage - Files Data Lake | PyPI [0.0.51](https://pypi.org/project/azure-datalake-store/0.0.51) |  |  |\n| Text Analytics | PyPI [1.0.2](https://pypi.org/project/text-analytics/1.0.2) |  |  |\n| Uamqp | PyPI [1.6.11](https://pypi.org/project/uamqp/1.6.11) |  | GitHub [1.6.11](https://github.com/Azure/azure-uamqp-python/) |\n| azure-agrifood-nspkg | PyPI [1.0.0](https://pypi.org/project/azure-agrifood-nspkg/1.0.0) |  |  |\n| azure-ai-language-nspkg | PyPI [1.0.0](https://pypi.org/project/azure-ai-language-nspkg/1.0.0) |  |  |\n| azure-ai-translation-nspkg | PyPI [1.0.0](https://pypi.org/project/azure-ai-translation-nspkg/1.0.0) |  |  |\n| azure-iot-nspkg | PyPI [1.0.1](https://pypi.org/project/azure-iot-nspkg/1.0.1) |  |  |\n| azure-media-nspkg | PyPI [1.0.0](https://pypi.org/project/azure-media-nspkg/1.0.0) |  |  |\n| azure-messaging-nspkg | PyPI [1.0.0](https://pypi.org/project/azure-messaging-nspkg/1.0.0) |  |  |\n| azure-monitor-nspkg | PyPI [1.0.0](https://pypi.org/project/azure-monitor-nspkg/1.0.0) |  |  |\n| azure-purview-nspkg | PyPI [2.0.0](https://pypi.org/project/azure-purview-nspkg/2.0.0) |  |  |\n| azure-security-nspkg | PyPI [1.0.0](https://pypi.org/project/azure-security-nspkg/1.0.0) |  |  |\n| Cognitive Services Knowledge Namespace Package | PyPI [3.0.0](https://pypi.org/project/azure-cognitiveservices-knowledge-nspkg/3.0.0) |  | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/nspkg/azure-cognitiveservices-knowledge-nspkg/) |\n| Cognitive Services Language Namespace Package | PyPI [3.0.1](https://pypi.org/project/azure-cognitiveservices-language-nspkg/3.0.1) |  | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/nspkg/azure-cognitiveservices-language-nspkg/) |\n| Cognitive Services Namespace Package | PyPI [3.0.1](https://pypi.org/project/azure-cognitiveservices-nspkg/3.0.1) |  | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/nspkg/azure-cognitiveservices-nspkg/) |\n| Cognitive Services Search Namespace Package | PyPI [3.0.1](https://pypi.org/project/azure-cognitiveservices-search-nspkg/3.0.1) |  | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-cognitiveservices-search-nspkg_3.0.1/azure-cognitiveservices-search-nspkg/) |\n| Cognitive Services Vision Namespace Package | PyPI [3.0.1](https://pypi.org/project/azure-cognitiveservices-vision-nspkg/3.0.1) |  | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-cognitiveservices-vision-nspkg_3.0.1/azure-cognitiveservices-vision-nspkg/) |\n| Communication Namespace Package | PyPI [0.0.0b1](https://pypi.org/project/azure-communication-nspkg/0.0.0b1) | [docs](/python/api/overview/azure/communication-nspkg-readme?view=azure-python-preview&amp;preserve-view=true) |  |\n| Core Namespace Package | PyPI [3.0.2](https://pypi.org/project/azure-nspkg/3.0.2) |  | GitHub [3.0.2](https://github.com/Azure/azure-sdk-for-python/tree/azure-nspkg_3.0.2/azure-nspkg/) |\n| Data Namespace Package | PyPI [1.0.0](https://pypi.org/project/azure-data-nspkg/1.0.0) | [docs](/python/api/overview/azure/data-nspkg-readme) |  |\n| Digital Twins Namespace Package | PyPI [1.0.0](https://pypi.org/project/azure-digitaltwins-nspkg/1.0.0) |  |  |\n| Key Vault Namespace Package | PyPI [1.0.0](https://pypi.org/project/azure-keyvault-nspkg/1.0.0) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-nspkg_1.0.0/sdk/keyvault/azure-keyvault-nspkg/) |\n| Search Namespace Package | PyPI [1.0.0](https://pypi.org/project/azure-search-nspkg/1.0.0) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-search-nspkg_1.0.0/sdk/search/azure-search-nspkg/) |\n| Storage Namespace Package | PyPI [3.1.0](https://pypi.org/project/azure-storage-nspkg/3.1.0) |  | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/nspkg/azure-storage-nspkg) |\n| Synapse Namespace Package | PyPI [1.0.0](https://pypi.org/project/azure-synapse-nspkg/1.0.0) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-nspkg_1.0.0/sdk/synapse/azure-synapse-nspkg/) |\n| Text Analytics Namespace Package | PyPI [1.0.0](https://pypi.org/project/azure-ai-nspkg/1.0.0) |  | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-nspkg_1.0.0/sdk/textanalytics/azure-ai-nspkg/) |\n| Resource Management | PyPI [5.0.0](https://pypi.org/project/azure-mgmt/5.0.0) |  | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/core/azure-mgmt) |\n| Resource Management - Common | PyPI [0.20.0](https://pypi.org/project/azure-mgmt-common/0.20.0) |  |  |\n| apiview-stub-generator | PyPI [0.3.7](https://pypi.org/project/apiview-stub-generator/0.3.7) |  |  |\n| azure-pylint-guidelines-checker | PyPI [0.0.8](https://pypi.org/project/azure-pylint-guidelines-checker/0.0.8) |  |  |\n| Dev Tools | PyPI [1.2.0](https://pypi.org/project/azure-devtools/1.2.0) |  | GitHub [1.2.0](https://github.com/Azure/azure-python-devtools/tree/1.2.0/src/azure_devtools) |\n| Doc Warden | PyPI [0.7.3](https://pypi.org/project/doc-warden/0.7.3) |  | GitHub [0.7.3](https://github.com/Azure/azure-sdk-tools/tree/doc-warden_0.7.1/packages/python-packages/doc-warden) |\n| Tox Monorepo | PyPI [0.1.2](https://pypi.org/project/tox-monorepo/0.1.2) |  | GitHub [0.1.2](https://github.com/Azure/azure-sdk-tools/tree/main/packages/python-packages/tox-monorepo) |\n"
  },
  {
    "path": "articles/includes/python-new.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| AI Agent Server - Core | PyPI [2.0.0b3](https://pypi.org/project/azure-ai-agentserver-core/2.0.0b3) | [docs](/python/api/overview/azure/ai-agentserver-core-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [2.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-agentserver-core_2.0.0b3/sdk/agentserver/azure-ai-agentserver-core/) |\n| AI Agents | PyPI [1.1.0](https://pypi.org/project/azure-ai-agents/1.1.0)<br>PyPI [1.2.0b6](https://pypi.org/project/azure-ai-agents/1.2.0b6) | [docs](/python/api/overview/azure/ai-agents-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-agents_1.1.0/sdk/ai/azure-ai-agents/)<br>GitHub [1.2.0b6](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-agents_1.2.0b6/sdk/ai/azure-ai-agents/) |\n| AI Evaluation | PyPI [1.16.7](https://pypi.org/project/azure-ai-evaluation/1.16.7) | [docs](/python/api/overview/azure/ai-evaluation-readme) | GitHub [1.16.7](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-evaluation_1.16.7/sdk/evaluation/azure-ai-evaluation/) |\n| AI Generative | PyPI [1.0.0b11](https://pypi.org/project/azure-ai-generative/1.0.0b11) |  | GitHub [1.0.0b11](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-generative_1.0.0b11/sdk/ai/azure-ai-generative/) |\n| AI Model Inference | PyPI [1.0.0b9](https://pypi.org/project/azure-ai-inference/1.0.0b9) | [docs](/python/api/overview/azure/ai-inference-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b9](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-inference_1.0.0b9/sdk/ai/azure-ai-inference/) |\n| AI Projects | PyPI [2.1.0](https://pypi.org/project/azure-ai-projects/2.1.0) | [docs](/python/api/overview/azure/ai-projects-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-projects_2.1.0/sdk/ai/azure-ai-projects/) |\n| AI Resources | PyPI [1.0.0b9](https://pypi.org/project/azure-ai-resources/1.0.0b9) |  | GitHub [1.0.0b9](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-resources_1.0.0b9/sdk/ai/azure-ai-resources/) |\n| Anomaly Detector | PyPI [3.0.0b6](https://pypi.org/project/azure-ai-anomalydetector/3.0.0b6) | [docs](/python/api/overview/azure/ai-anomalydetector-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [3.0.0b6](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-anomalydetector_3.0.0b6/sdk/anomalydetector/azure-ai-anomalydetector/) |\n| App Configuration | PyPI [1.8.1](https://pypi.org/project/azure-appconfiguration/1.8.1) | [docs](/python/api/overview/azure/appconfiguration-readme) | GitHub [1.8.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-appconfiguration_1.8.1/sdk/appconfiguration/azure-appconfiguration/) |\n| App Configuration Provider | PyPI [2.4.0](https://pypi.org/project/azure-appconfiguration-provider/2.4.0) | [docs](/python/api/overview/azure/appconfiguration-provider-readme) | GitHub [2.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-appconfiguration-provider_2.4.0/sdk/appconfiguration/azure-appconfiguration-provider/) |\n| Attestation | PyPI [1.0.0](https://pypi.org/project/azure-security-attestation/1.0.0) | [docs](/python/api/overview/azure/security-attestation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-security-attestation_1.0.0/sdk/attestation/azure-security-attestation/) |\n| Azure AI Search | PyPI [12.0.0](https://pypi.org/project/azure-search-documents/12.0.0) | [docs](/python/api/overview/azure/search-documents-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-search-documents_12.0.0/sdk/search/azure-search-documents/) |\n| Azure AI Transcription | PyPI [1.0.0b4](https://pypi.org/project/azure-ai-transcription/1.0.0b4) | [docs](/python/api/overview/azure/ai-transcription-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-transcription_1.0.0b4/sdk/transcription/azure-ai-transcription/) |\n| Azure AI Vision SDK | PyPI [0.15.1b1](https://pypi.org/project/azure-ai-vision/0.15.1b1) |  | GitHub [0.15.1b1](https://msasg.visualstudio.com/Skyman/_git/Carbon) |\n| Azure Blob Storage Checkpoint Store | PyPI [1.2.0](https://pypi.org/project/azure-eventhub-checkpointstoreblob/1.2.0) | [docs](/python/api/overview/azure/eventhub-checkpointstoreblob-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-eventhub-checkpointstoreblob_1.2.0/sdk/eventhub/azure-eventhub-checkpointstoreblob/) |\n| Azure Blob Storage Checkpoint Store AIO | PyPI [1.2.0](https://pypi.org/project/azure-eventhub-checkpointstoreblob-aio/1.2.0) | [docs](/python/api/overview/azure/eventhub-checkpointstoreblob-aio-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-eventhub-checkpointstoreblob-aio_1.2.0/sdk/eventhub/azure-eventhub-checkpointstoreblob-aio/) |\n| Azure Content Understanding in Foundry Tools | PyPI [1.1.0](https://pypi.org/project/azure-ai-contentunderstanding/1.1.0)<br>PyPI [1.2.0b1](https://pypi.org/project/azure-ai-contentunderstanding/1.2.0b1) | [docs](/python/api/overview/azure/ai-contentunderstanding-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-contentunderstanding_1.1.0/sdk/contentunderstanding/azure-ai-contentunderstanding/)<br>GitHub [1.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-contentunderstanding_1.2.0b1/sdk/contentunderstanding/azure-ai-contentunderstanding/) |\n| Azure Monitor OpenTelemetry | PyPI [1.8.7](https://pypi.org/project/azure-monitor-opentelemetry/1.8.7) | [docs](/python/api/overview/azure/monitor-opentelemetry-readme) | GitHub [1.8.7](https://github.com/Azure/azure-sdk-for-python/tree/azure-monitor-opentelemetry_1.8.7/sdk/monitor/azure-monitor-opentelemetry/) |\n| Azure Remote Rendering | PyPI [1.0.0b3](https://pypi.org/project/azure-mixedreality-remoterendering/1.0.0b3) |  | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mixedreality-remoterendering_1.0.0b3/sdk/remoterendering/azure-mixedreality-remoterendering/) |\n| Batch | PyPI [15.1.0](https://pypi.org/project/azure-batch/15.1.0) | [docs](/python/api/overview/azure/batch-readme) | GitHub [15.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-batch_15.1.0/sdk/batch/azure-batch/) |\n| Communication Call Automation | PyPI [1.5.0](https://pypi.org/project/azure-communication-callautomation/1.5.0)<br>PyPI [1.6.0b1](https://pypi.org/project/azure-communication-callautomation/1.6.0b1) | [docs](/python/api/overview/azure/communication-callautomation-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-callautomation_1.5.0/sdk/communication/azure-communication-callautomation/)<br>GitHub [1.6.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-callautomation_1.6.0b1/sdk/communication/azure-communication-callautomation/) |\n| Communication Chat | PyPI [1.3.0](https://pypi.org/project/azure-communication-chat/1.3.0) | [docs](/python/api/overview/azure/communication-chat-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-chat_1.3.0/sdk/communication/azure-communication-chat/) |\n| Communication Email | PyPI [1.1.0](https://pypi.org/project/azure-communication-email/1.1.0) | [docs](/python/api/overview/azure/communication-email-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-email_1.1.0/sdk/communication/azure-communication-email/) |\n| Communication Identity | PyPI [1.5.0](https://pypi.org/project/azure-communication-identity/1.5.0) | [docs](/python/api/overview/azure/communication-identity-readme) | GitHub [1.5.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-identity_1.5.0/sdk/communication/azure-communication-identity/) |\n| Communication JobRouter | PyPI [1.0.0](https://pypi.org/project/azure-communication-jobrouter/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-communication-jobrouter/1.1.0b1) | [docs](/python/api/overview/azure/communication-jobrouter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-jobrouter_1.0.0/sdk/communication/azure-communication-jobrouter/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-jobrouter_1.1.0b1/sdk/communication/azure-communication-jobrouter/) |\n| Communication Messages | PyPI [1.1.0](https://pypi.org/project/azure-communication-messages/1.1.0)<br>PyPI [1.2.0b1](https://pypi.org/project/azure-communication-messages/1.2.0b1) | [docs](/python/api/overview/azure/communication-messages-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-messages_1.1.0/sdk/communication/azure-communication-messages/)<br>GitHub [1.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-messages_1.2.0b1/sdk/communication/azure-communication-messages/) |\n| Communication Network Traversal | PyPI [1.1.0b2](https://pypi.org/project/azure-communication-networktraversal/1.1.0b2) | [docs](/python/api/overview/azure/communication-networktraversal-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-networktraversal_1.1.0b2/sdk/communication/azure-communication-networktraversal/) |\n| Communication Phone Numbers | PyPI [1.4.0](https://pypi.org/project/azure-communication-phonenumbers/1.4.0) | [docs](/python/api/overview/azure/communication-phonenumbers-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-phonenumbers_1.4.0/sdk/communication/azure-communication-phonenumbers/) |\n| Communication Rooms | PyPI [1.2.0](https://pypi.org/project/azure-communication-rooms/1.2.0) | [docs](/python/api/overview/azure/communication-rooms-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-rooms_1.2.0/sdk/communication/azure-communication-rooms/) |\n| Communication Sms | PyPI [1.1.0](https://pypi.org/project/azure-communication-sms/1.1.0) | [docs](/python/api/overview/azure/communication-sms-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-communication-sms_1.1.0/sdk/communication/azure-communication-sms/) |\n| Confidential Ledger | PyPI [1.1.1](https://pypi.org/project/azure-confidentialledger/1.1.1)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-confidentialledger/2.0.0b2) | [docs](/python/api/overview/azure/confidentialledger-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-confidentialledger_1.1.1/sdk/confidentialledger/azure-confidentialledger/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-confidentialledger_2.0.0b2/sdk/confidentialledger/azure-confidentialledger/) |\n| Confidential Ledger Certificate | PyPI [1.0.0b1](https://pypi.org/project/azure-confidentialledger-certificate/1.0.0b1) | [docs](/python/api/overview/azure/confidentialledger-certificate-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-confidentialledger-certificate_1.0.0b1/sdk/confidentialledger/azure-confidentialledger-certificate/) |\n| Container Registry | PyPI [1.2.0](https://pypi.org/project/azure-containerregistry/1.2.0) | [docs](/python/api/overview/azure/containerregistry-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-containerregistry_1.2.0/sdk/containerregistry/azure-containerregistry/) |\n| Content Safety | PyPI [1.0.0](https://pypi.org/project/azure-ai-contentsafety/1.0.0) | [docs](/python/api/overview/azure/ai-contentsafety-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-contentsafety_1.0.0/sdk/contentsafety/azure-ai-contentsafety/) |\n| Conversational Language Understanding | PyPI [1.1.0](https://pypi.org/project/azure-ai-language-conversations/1.1.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-ai-language-conversations/2.0.0b2) | [docs](/python/api/overview/azure/ai-language-conversations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-conversations_1.1.0/sdk/cognitivelanguage/azure-ai-language-conversations/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-conversations_2.0.0b2/sdk/cognitivelanguage/azure-ai-language-conversations/) |\n| Conversations Authoring | PyPI [1.0.0b4](https://pypi.org/project/azure-ai-language-conversations-authoring/1.0.0b4) | [docs](/python/api/overview/azure/ai-language-conversations-authoring-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-conversations-authoring_1.0.0b4/sdk/cognitivelanguage/azure-ai-language-conversations-authoring/) |\n| Core - Client - Core | PyPI [1.41.0](https://pypi.org/project/azure-core/1.41.0) | [docs](/python/api/overview/azure/core-readme) | GitHub [1.41.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-core_1.41.0/sdk/core/azure-core/) |\n| Core - Client - Core HTTP | PyPI [1.0.0b7](https://pypi.org/project/corehttp/1.0.0b7) | [docs](/python/api/overview/azure/corehttp-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b7](https://github.com/Azure/azure-sdk-for-python/tree/corehttp_1.0.0b7/sdk/core/corehttp/) |\n| Core - Client - Experimental | PyPI [1.0.0b4](https://pypi.org/project/azure-core-experimental/1.0.0b4) | [docs](/python/api/overview/azure/core-experimental-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-core-experimental_1.0.0b4/sdk/core/azure-core-experimental/) |\n| Core - Client - Tracing Opentelemetry | PyPI [1.0.0b13](https://pypi.org/project/azure-core-tracing-opentelemetry/1.0.0b13) | [docs](/python/api/overview/azure/core-tracing-opentelemetry-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b13](https://github.com/Azure/azure-sdk-for-python/tree/azure-core-tracing-opentelemetry_1.0.0b13/sdk/core/azure-core-tracing-opentelemetry/) |\n| Core Tracing Opencensus | PyPI [1.0.0b10](https://pypi.org/project/azure-core-tracing-opencensus/1.0.0b10) | [docs](/python/api/overview/azure/core-tracing-opencensus-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b10](https://github.com/Azure/azure-sdk-for-python/tree/azure-core-tracing-opencensus_1.0.0b10/sdk/core/azure-core-tracing-opencensus/) |\n| Cosmos DB | PyPI [4.15.0](https://pypi.org/project/azure-cosmos/4.15.0)<br>PyPI [4.16.0b2](https://pypi.org/project/azure-cosmos/4.16.0b2) | [docs](/python/api/overview/azure/cosmos-readme) | GitHub [4.15.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-cosmos_4.15.0/sdk/cosmos/azure-cosmos/)<br>GitHub [4.16.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-cosmos_4.16.0b2/sdk/cosmos/azure-cosmos/) |\n| Defender EASM | PyPI [1.0.0b1](https://pypi.org/project/azure-defender-easm/1.0.0b1) | [docs](/python/api/overview/azure/defender-easm-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-defender-easm_1.0.0b1/sdk/easm/azure-defender-easm/) |\n| Dev Center | PyPI [1.0.0](https://pypi.org/project/azure-developer-devcenter/1.0.0) | [docs](/python/api/overview/azure/developer-devcenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-developer-devcenter_1.0.0/sdk/devcenter/azure-developer-devcenter/) |\n| Device Provisioning Services | PyPI [1.0.0b1](https://pypi.org/project/azure-iot-deviceprovisioning/1.0.0b1) | [docs](/python/api/overview/azure/iot-deviceprovisioning-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-iot-deviceprovisioning_1.0.0b1/sdk/iothub/azure-iot-deviceprovisioning/) |\n| Device Update | PyPI [1.0.0](https://pypi.org/project/azure-iot-deviceupdate/1.0.0) | [docs](/python/api/overview/azure/iot-deviceupdate-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-iot-deviceupdate_1.0.0/sdk/deviceupdate/azure-iot-deviceupdate/) |\n| Digital Twins | PyPI [1.3.0](https://pypi.org/project/azure-digitaltwins-core/1.3.0) | [docs](/python/api/overview/azure/digitaltwins-core-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-digitaltwins-core_1.3.0/sdk/digitaltwins/azure-digitaltwins-core/) |\n| Document Intelligence | PyPI [1.0.2](https://pypi.org/project/azure-ai-documentintelligence/1.0.2) | [docs](/python/api/overview/azure/ai-documentintelligence-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-documentintelligence_1.0.2/sdk/documentintelligence/azure-ai-documentintelligence/) |\n| Document Translation | PyPI [1.1.0](https://pypi.org/project/azure-ai-translation-document/1.1.0) | [docs](/python/api/overview/azure/ai-translation-document-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-translation-document_1.1.0/sdk/translation/azure-ai-translation-document/) |\n| Event Grid | PyPI [4.22.0](https://pypi.org/project/azure-eventgrid/4.22.0) | [docs](/python/api/overview/azure/eventgrid-readme) | GitHub [4.22.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-eventgrid_4.22.0/sdk/eventgrid/azure-eventgrid/) |\n| Event Hubs | PyPI [5.15.1](https://pypi.org/project/azure-eventhub/5.15.1) | [docs](/python/api/overview/azure/eventhub-readme) | GitHub [5.15.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-eventhub_5.15.1/sdk/eventhub/azure-eventhub/) |\n| Face | PyPI [1.0.0b2](https://pypi.org/project/azure-ai-vision-face/1.0.0b2) | [docs](/python/api/overview/azure/ai-vision-face-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-vision-face_1.0.0b2/sdk/face/azure-ai-vision-face/) |\n| Face | PyPI [0.6.1](https://pypi.org/project/azure-cognitiveservices-vision-face/0.6.1) | [docs](/python/api/overview/azure/cognitiveservices-vision-face-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.6.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-cognitiveservices-vision-face_0.6.1/sdk/cognitiveservices/azure-cognitiveservices-vision-face/) |\n| FarmBeats | PyPI [1.0.0b2](https://pypi.org/project/azure-agrifood-farming/1.0.0b2) | [docs](/python/api/overview/azure/agrifood-farming-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-agrifood-farming_1.0.0b2/sdk/agrifood/azure-agrifood-farming/) |\n| Form Recognizer | PyPI [3.3.3](https://pypi.org/project/azure-ai-formrecognizer/3.3.3) | [docs](/python/api/overview/azure/ai-formrecognizer-readme) | GitHub [3.3.3](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-formrecognizer_3.3.3/sdk/formrecognizer/azure-ai-formrecognizer/) |\n| Health Deidentification | PyPI [1.0.0](https://pypi.org/project/azure-health-deidentification/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-health-deidentification/1.1.0b1) | [docs](/python/api/overview/azure/health-deidentification-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-health-deidentification_1.0.0/sdk/healthdataaiservices/azure-health-deidentification/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-health-deidentification_1.1.0b1/sdk/healthdataaiservices/azure-health-deidentification/) |\n| Health Insights Cancer Profiling | PyPI [1.0.0b1](https://pypi.org/project/azure-healthinsights-cancerprofiling/1.0.0b1) | [docs](/python/api/overview/azure/healthinsights-cancerprofiling-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-healthinsights-cancerprofiling_1.0.0b1/sdk/healthinsights/azure-healthinsights-cancerprofiling/) |\n| Health Insights Clinical Matching | PyPI [1.0.0b1](https://pypi.org/project/azure-healthinsights-clinicalmatching/1.0.0b1) | [docs](/python/api/overview/azure/healthinsights-clinicalmatching-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-healthinsights-clinicalmatching_1.0.0b1/sdk/healthinsights/azure-healthinsights-clinicalmatching/) |\n| Health Insights Radiology Insights | PyPI [1.1.0](https://pypi.org/project/azure-healthinsights-radiologyinsights/1.1.0) | [docs](/python/api/overview/azure/healthinsights-radiologyinsights-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-healthinsights-radiologyinsights_1.1.0/sdk/healthinsights/azure-healthinsights-radiologyinsights/) |\n| Identity | PyPI [1.25.3](https://pypi.org/project/azure-identity/1.25.3)<br>PyPI [1.26.0b2](https://pypi.org/project/azure-identity/1.26.0b2) | [docs](/python/api/overview/azure/identity-readme) | GitHub [1.25.3](https://github.com/Azure/azure-sdk-for-python/tree/azure-identity_1.25.3/sdk/identity/azure-identity/)<br>GitHub [1.26.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-identity_1.26.0b2/sdk/identity/azure-identity/) |\n| Identity Broker | PyPI [1.3.0](https://pypi.org/project/azure-identity-broker/1.3.0) | [docs](/python/api/overview/azure/identity-broker-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-identity-broker_1.3.0/sdk/identity/azure-identity-broker/) |\n| Image Analysis | PyPI [1.0.0](https://pypi.org/project/azure-ai-vision-imageanalysis/1.0.0) | [docs](/python/api/overview/azure/ai-vision-imageanalysis-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-vision-imageanalysis_1.0.0/sdk/vision/azure-ai-vision-imageanalysis/) |\n| Key Vault - Administration | PyPI [4.6.0](https://pypi.org/project/azure-keyvault-administration/4.6.0) | [docs](/python/api/overview/azure/keyvault-administration-readme) | GitHub [4.6.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-administration_4.6.0/sdk/keyvault/azure-keyvault-administration/) |\n| Key Vault - Certificates | PyPI [4.11.1](https://pypi.org/project/azure-keyvault-certificates/4.11.1) | [docs](/python/api/overview/azure/keyvault-certificates-readme) | GitHub [4.11.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-certificates_4.11.1/sdk/keyvault/azure-keyvault-certificates/) |\n| Key Vault - Keys | PyPI [4.11.0](https://pypi.org/project/azure-keyvault-keys/4.11.0) | [docs](/python/api/overview/azure/keyvault-keys-readme) | GitHub [4.11.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-keys_4.11.0/sdk/keyvault/azure-keyvault-keys/) |\n| Key Vault - Secrets | PyPI [4.11.0](https://pypi.org/project/azure-keyvault-secrets/4.11.0) | [docs](/python/api/overview/azure/keyvault-secrets-readme) | GitHub [4.11.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-secrets_4.11.0/sdk/keyvault/azure-keyvault-secrets/) |\n| Key Vault - Security Domain | PyPI [1.0.0b1](https://pypi.org/project/azure-keyvault-securitydomain/1.0.0b1) | [docs](/python/api/overview/azure/keyvault-securitydomain-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-keyvault-securitydomain_1.0.0b1/sdk/keyvault/azure-keyvault-securitydomain/) |\n| Load Testing | PyPI [1.0.1](https://pypi.org/project/azure-developer-loadtesting/1.0.1)<br>PyPI [1.2.0b1](https://pypi.org/project/azure-developer-loadtesting/1.2.0b1) | [docs](/python/api/overview/azure/developer-loadtesting-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-developer-loadtesting_1.0.1/sdk/loadtesting/azure-developer-loadtesting/)<br>GitHub [1.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-developer-loadtesting_1.2.0b1/sdk/loadtesting/azure-developer-loadtesting/) |\n| Machine Learning | PyPI [1.33.0](https://pypi.org/project/azure-ai-ml/1.33.0) | [docs](/python/api/overview/azure/ai-ml-readme) | GitHub [1.33.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-ml_1.33.0/sdk/ml/azure-ai-ml/) |\n| Machine Learning - Feature Store | PyPI [1.0.1](https://pypi.org/project/azureml-featurestore/1.0.1) |  | GitHub [1.0.1](https://msdata.visualstudio.com/Vienna/_git/sdk-cli-v2?path=/src/azureml-featurestore) |\n| Managed Private Endpoints | PyPI [0.4.0](https://pypi.org/project/azure-synapse-managedprivateendpoints/0.4.0) | [docs](/python/api/overview/azure/synapse-managedprivateendpoints-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-managedprivateendpoints_0.4.0/sdk/synapse/azure-synapse-managedprivateendpoints/) |\n| Maps Geolocation | PyPI [1.0.0b3](https://pypi.org/project/azure-maps-geolocation/1.0.0b3) | [docs](/python/api/overview/azure/maps-geolocation-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-maps-geolocation_1.0.0b3/sdk/maps/azure-maps-geolocation/) |\n| Maps Render | PyPI [2.0.0b2](https://pypi.org/project/azure-maps-render/2.0.0b2) | [docs](/python/api/overview/azure/maps-render-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-maps-render_2.0.0b2/sdk/maps/azure-maps-render/) |\n| Maps Route | PyPI [1.0.0b3](https://pypi.org/project/azure-maps-route/1.0.0b3) | [docs](/python/api/overview/azure/maps-route-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-maps-route_1.0.0b3/sdk/maps/azure-maps-route/) |\n| Maps Search | PyPI [2.0.0b2](https://pypi.org/project/azure-maps-search/2.0.0b2) | [docs](/python/api/overview/azure/maps-search-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-maps-search_2.0.0b2/sdk/maps/azure-maps-search/) |\n| Media Analytics Edge | PyPI [1.0.0b2](https://pypi.org/project/azure-media-analytics-edge/1.0.0b2) | [docs](/python/api/overview/azure/media-analytics-edge-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-media-analytics-edge_1.0.0b2/sdk/media/azure-media-analytics-edge/) |\n| Metrics Advisor | PyPI [1.0.1](https://pypi.org/project/azure-ai-metricsadvisor/1.0.1) | [docs](/python/api/overview/azure/ai-metricsadvisor-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-metricsadvisor_1.0.1/sdk/metricsadvisor/azure-ai-metricsadvisor/) |\n| Microsoft Planetary Computer Pro | PyPI [1.0.0b1](https://pypi.org/project/azure-planetarycomputer/1.0.0b1) | [docs](/python/api/overview/azure/planetarycomputer-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-planetarycomputer_1.0.0b1/sdk/planetarycomputer/azure-planetarycomputer/) |\n| Mixed Reality Authentication | PyPI [1.0.0b2](https://pypi.org/project/azure-mixedreality-authentication/1.0.0b2) |  | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mixedreality-authentication_1.0.0b2/sdk/mixedreality/azure-mixedreality-authentication/) |\n| Models Repository | PyPI [1.0.0b2](https://pypi.org/project/azure-iot-modelsrepository/1.0.0b2) | [docs](/python/api/overview/azure/iot-modelsrepository-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-iot-modelsrepository_1.0.0b2/sdk/modelsrepository/azure-iot-modelsrepository/) |\n| Monitor Ingestion | PyPI [1.1.0](https://pypi.org/project/azure-monitor-ingestion/1.1.0) | [docs](/python/api/overview/azure/monitor-ingestion-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-monitor-ingestion_1.1.0/sdk/monitor/azure-monitor-ingestion/) |\n| Monitor Query Logs | PyPI [2.0.0](https://pypi.org/project/azure-monitor-query/2.0.0) | [docs](/python/api/overview/azure/monitor-query-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-monitor-query_2.0.0/sdk/monitor/azure-monitor-query/) |\n| Monitor Query Metrics | PyPI [1.0.0](https://pypi.org/project/azure-monitor-querymetrics/1.0.0) | [docs](/python/api/overview/azure/monitor-querymetrics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-monitor-querymetrics_1.0.0/sdk/monitor/azure-monitor-querymetrics/) |\n| Online Experimentation | PyPI [1.0.0b1](https://pypi.org/project/azure-onlineexperimentation/1.0.0b1) | [docs](/python/api/overview/azure/onlineexperimentation-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-onlineexperimentation_1.0.0b1/sdk/onlineexperimentation/azure-onlineexperimentation/) |\n| OpenTelemetry Exporter | PyPI [1.0.0b52](https://pypi.org/project/azure-monitor-opentelemetry-exporter/1.0.0b52) | [docs](/python/api/overview/azure/monitor-opentelemetry-exporter-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b52](https://github.com/Azure/azure-sdk-for-python/tree/azure-monitor-opentelemetry-exporter_1.0.0b52/sdk/monitor/azure-monitor-opentelemetry-exporter/) |\n| Personalizer | PyPI [1.0.0b1](https://pypi.org/project/azure-ai-personalizer/1.0.0b1) |  | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-personalizer_1.0.0b1/sdk/personalizer/azure-ai-personalizer/) |\n| Purview Account | PyPI [1.0.0b1](https://pypi.org/project/azure-purview-account/1.0.0b1) | [docs](/python/api/overview/azure/purview-account-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-account_1.0.0b1/sdk/purview/azure-purview-account/) |\n| Purview Administration | PyPI [1.0.0b1](https://pypi.org/project/azure-purview-administration/1.0.0b1) | [docs](/python/api/overview/azure/purview-administration-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-administration_1.0.0b1/sdk/purview/azure-purview-administration/) |\n| Purview Catalog | PyPI [1.0.0b4](https://pypi.org/project/azure-purview-catalog/1.0.0b4) | [docs](/python/api/overview/azure/purview-catalog-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-catalog_1.0.0b4/sdk/purview/azure-purview-catalog/) |\n| Purview Data Map | PyPI [1.0.0b2](https://pypi.org/project/azure-purview-datamap/1.0.0b2) | [docs](/python/api/overview/azure/purview-datamap-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-datamap_1.0.0b2/sdk/purview/azure-purview-datamap/) |\n| Purview Scanning | PyPI [1.0.0b2](https://pypi.org/project/azure-purview-scanning/1.0.0b2) | [docs](/python/api/overview/azure/purview-scanning-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-scanning_1.0.0b2/sdk/purview/azure-purview-scanning/) |\n| Purview Sharing | PyPI [1.0.0b3](https://pypi.org/project/azure-purview-sharing/1.0.0b3) | [docs](/python/api/overview/azure/purview-sharing-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-sharing_1.0.0b3/sdk/purview/azure-purview-sharing/) |\n| Purview Workflow | PyPI [1.0.0b2](https://pypi.org/project/azure-purview-workflow/1.0.0b2) | [docs](/python/api/overview/azure/purview-workflow-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-purview-workflow_1.0.0b2/sdk/purview/azure-purview-workflow/) |\n| Question Answering | PyPI [1.1.0](https://pypi.org/project/azure-ai-language-questionanswering/1.1.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-ai-language-questionanswering/2.0.0b1) | [docs](/python/api/overview/azure/ai-language-questionanswering-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-questionanswering_1.1.0/sdk/cognitivelanguage/azure-ai-language-questionanswering/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-questionanswering_2.0.0b1/sdk/cognitivelanguage/azure-ai-language-questionanswering/) |\n| Question Answering Authoring | PyPI [1.0.0b1](https://pypi.org/project/azure-ai-language-questionanswering-authoring/1.0.0b1) | [docs](/python/api/overview/azure/ai-language-questionanswering-authoring-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-language-questionanswering-authoring_1.0.0b1/sdk/cognitivelanguage/azure-ai-language-questionanswering-authoring/) |\n| Schema Registry | PyPI [1.3.0](https://pypi.org/project/azure-schemaregistry/1.3.0) | [docs](/python/api/overview/azure/schemaregistry-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-schemaregistry_1.3.0/sdk/schemaregistry/azure-schemaregistry/) |\n| Schema Registry - Avro | PyPI [1.0.0](https://pypi.org/project/azure-schemaregistry-avroencoder/1.0.0) | [docs](/python/api/overview/azure/schemaregistry-avroencoder-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-schemaregistry-avroencoder_1.0.0/sdk/schemaregistry/azure-schemaregistry-avroencoder/) |\n| Schema Registry - Avro | PyPI [1.0.0b4](https://pypi.org/project/azure-schemaregistry-avroserializer/1.0.0b4) | [docs](/python/api/overview/azure/schemaregistry-avroserializer-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-schemaregistry-avroserializer_1.0.0b4/sdk/schemaregistry/azure-schemaregistry-avroserializer/) |\n| Service Bus | PyPI [7.14.3](https://pypi.org/project/azure-servicebus/7.14.3) | [docs](/python/api/overview/azure/servicebus-readme) | GitHub [7.14.3](https://github.com/Azure/azure-sdk-for-python/tree/azure-servicebus_7.14.3/sdk/servicebus/azure-servicebus/) |\n| Spark | PyPI [0.7.0](https://pypi.org/project/azure-synapse-spark/0.7.0) | [docs](/python/api/overview/azure/synapse-spark-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-spark_0.7.0/sdk/synapse/azure-synapse-spark/) |\n| Storage - Blobs | PyPI [12.28.0](https://pypi.org/project/azure-storage-blob/12.28.0)<br>PyPI [12.30.0b1](https://pypi.org/project/azure-storage-blob/12.30.0b1) | [docs](/python/api/overview/azure/storage-blob-readme) | GitHub [12.28.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-blob_12.28.0/sdk/storage/azure-storage-blob/)<br>GitHub [12.30.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-blob_12.30.0b1/sdk/storage/azure-storage-blob/) |\n| Storage - Blobs Changefeed | PyPI [12.0.0b5](https://pypi.org/project/azure-storage-blob-changefeed/12.0.0b5) | [docs](/python/api/overview/azure/storage-blob-changefeed-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [12.0.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-blob-changefeed_12.0.0b5/sdk/storage/azure-storage-blob-changefeed/) |\n| Storage - Files Data Lake | PyPI [12.23.0](https://pypi.org/project/azure-storage-file-datalake/12.23.0)<br>PyPI [12.25.0b1](https://pypi.org/project/azure-storage-file-datalake/12.25.0b1) | [docs](/python/api/overview/azure/storage-file-datalake-readme) | GitHub [12.23.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-file-datalake_12.23.0/sdk/storage/azure-storage-file-datalake/)<br>GitHub [12.25.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-file-datalake_12.25.0b1/sdk/storage/azure-storage-file-datalake/) |\n| Storage - Files Share | PyPI [12.24.0](https://pypi.org/project/azure-storage-file-share/12.24.0)<br>PyPI [12.26.0b1](https://pypi.org/project/azure-storage-file-share/12.26.0b1) | [docs](/python/api/overview/azure/storage-file-share-readme) | GitHub [12.24.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-file-share_12.24.0/sdk/storage/azure-storage-file-share/)<br>GitHub [12.26.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-file-share_12.26.0b1/sdk/storage/azure-storage-file-share/) |\n| Storage - Queues | PyPI [12.15.0](https://pypi.org/project/azure-storage-queue/12.15.0)<br>PyPI [12.17.0b1](https://pypi.org/project/azure-storage-queue/12.17.0b1) | [docs](/python/api/overview/azure/storage-queue-readme) | GitHub [12.15.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-queue_12.15.0/sdk/storage/azure-storage-queue/)<br>GitHub [12.17.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-storage-queue_12.17.0b1/sdk/storage/azure-storage-queue/) |\n| Synapse - AccessControl | PyPI [0.7.0](https://pypi.org/project/azure-synapse-accesscontrol/0.7.0) | [docs](/python/api/overview/azure/synapse-accesscontrol-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.7.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-accesscontrol_0.7.0/sdk/synapse/azure-synapse-accesscontrol/) |\n| Synapse - Artifacts | PyPI [0.22.0](https://pypi.org/project/azure-synapse-artifacts/0.22.0) | [docs](/python/api/overview/azure/synapse-artifacts-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.22.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-artifacts_0.22.0/sdk/synapse/azure-synapse-artifacts/) |\n| Synapse - Monitoring | PyPI [0.2.0](https://pypi.org/project/azure-synapse-monitoring/0.2.0) | [docs](/python/api/overview/azure/synapse-monitoring-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-synapse-monitoring_0.2.0/sdk/synapse/azure-synapse-monitoring/) |\n| Tables | PyPI [12.7.0](https://pypi.org/project/azure-data-tables/12.7.0) | [docs](/python/api/overview/azure/data-tables-readme) | GitHub [12.7.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-data-tables_12.7.0/sdk/tables/azure-data-tables/) |\n| Text Analytics | PyPI [5.4.0](https://pypi.org/project/azure-ai-textanalytics/5.4.0)<br>PyPI [6.0.0b2](https://pypi.org/project/azure-ai-textanalytics/6.0.0b2) | [docs](/python/api/overview/azure/ai-textanalytics-readme) | GitHub [5.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-textanalytics_5.4.0/sdk/textanalytics/azure-ai-textanalytics/)<br>GitHub [6.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-textanalytics_6.0.0b2/sdk/textanalytics/azure-ai-textanalytics/) |\n| Text Analytics Authoring | PyPI [1.0.0b1](https://pypi.org/project/azure-ai-textanalytics-authoring/1.0.0b1) | [docs](/python/api/overview/azure/ai-textanalytics-authoring-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-textanalytics-authoring_1.0.0b1/sdk/cognitivelanguage/azure-ai-textanalytics-authoring/) |\n| Text Translation | PyPI [1.0.1](https://pypi.org/project/azure-ai-translation-text/1.0.1)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-ai-translation-text/2.0.0b1) | [docs](/python/api/overview/azure/ai-translation-text-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-translation-text_1.0.1/sdk/translation/azure-ai-translation-text/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-translation-text_2.0.0b1/sdk/translation/azure-ai-translation-text/) |\n| TimeZones | PyPI [1.0.0b1](https://pypi.org/project/azure-maps-timezone/1.0.0b1) | [docs](/python/api/overview/azure/maps-timezone-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-maps-timezone_1.0.0b1/sdk/maps/azure-maps-timezone/) |\n| unknown | PyPI [1.0.0b5](https://pypi.org/project/azure-ai-agentserver-responses/1.0.0b5) | [docs](/python/api/overview/azure/ai-agentserver-responses-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-agentserver-responses_1.0.0b5/sdk/agentserver/azure-ai-agentserver-responses/) |\n| unknown | PyPI [1.0.2](https://pypi.org/project/azure-postgresql-auth/1.0.2) | [docs](/python/api/overview/azure/postgresql-auth-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-python/tree/azure-postgresql-auth_1.0.2/sdk/postgresql/azure-postgresql-auth/) |\n| Video Analyzer Edge | PyPI [1.0.0b4](https://pypi.org/project/azure-media-videoanalyzer-edge/1.0.0b4) | [docs](/python/api/overview/azure/media-videoanalyzer-edge-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-media-videoanalyzer-edge_1.0.0b4/sdk/videoanalyzer/azure-media-videoanalyzer-edge/) |\n| Voice Live | PyPI [1.1.0](https://pypi.org/project/azure-ai-voicelive/1.1.0)<br>PyPI [1.2.0b5](https://pypi.org/project/azure-ai-voicelive/1.2.0b5) | [docs](/python/api/overview/azure/ai-voicelive-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-voicelive_1.1.0/sdk/voicelive/azure-ai-voicelive/)<br>GitHub [1.2.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-ai-voicelive_1.2.0b5/sdk/voicelive/azure-ai-voicelive/) |\n| Web PubSub | PyPI [1.3.0](https://pypi.org/project/azure-messaging-webpubsubservice/1.3.0) | [docs](/python/api/overview/azure/messaging-webpubsubservice-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-messaging-webpubsubservice_1.3.0/sdk/webpubsub/azure-messaging-webpubsubservice/) |\n| Web PubSub Client | PyPI [1.1.0](https://pypi.org/project/azure-messaging-webpubsubclient/1.1.0) | [docs](/python/api/overview/azure/messaging-webpubsubclient-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-messaging-webpubsubclient_1.1.0/sdk/webpubsub/azure-messaging-webpubsubclient/) |\n| Core - Management - Core | PyPI [1.6.0](https://pypi.org/project/azure-mgmt-core/1.6.0) | [docs](/python/api/overview/azure/mgmt-core-readme) | GitHub [1.6.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-core_1.6.0/sdk/core/azure-mgmt-core/) |\n| Resource Management -  Astro | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-astro/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-astro-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-astro_1.0.0b1/sdk/astro/azure-mgmt-astro/) |\n| Resource Management -  Dev Center | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-devcenter/1.1.0) | [docs](/python/api/overview/azure/mgmt-devcenter-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devcenter_1.1.0/sdk/devcenter/azure-mgmt-devcenter/) |\n| Resource Management -  Elastic SAN | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-elasticsan/2.0.0) | [docs](/python/api/overview/azure/mgmt-elasticsan-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-elasticsan_2.0.0/sdk/elasticsan/azure-mgmt-elasticsan/) |\n| Resource Management -  Security DevOps | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-securitydevops/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-securitydevops-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-securitydevops_1.0.0b2/sdk/securitydevops/azure-mgmt-securitydevops/) |\n| Resource Management - Advisor | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-advisor/9.0.0)<br>PyPI [10.0.0b1](https://pypi.org/project/azure-mgmt-advisor/10.0.0b1) | [docs](/python/api/overview/azure/mgmt-advisor-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-advisor_9.0.0/sdk/advisor/azure-mgmt-advisor/)<br>GitHub [10.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-advisor_10.0.0b1/sdk/advisor/azure-mgmt-advisor/) |\n| Resource Management - Agricultureplatform | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-agricultureplatform/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-agricultureplatform-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-agricultureplatform_1.0.0b1/sdk/agricultureplatform/azure-mgmt-agricultureplatform/) |\n| Resource Management - Agrifood | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-agfood/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-agfood-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-agfood_1.0.0b2/sdk/agfood/azure-mgmt-agfood/) |\n| Resource Management - Agrifood | PyPI [1.0.0b3](https://pypi.org/project/azure-mgmt-agrifood/1.0.0b3) | [docs](/python/api/overview/azure/mgmt-agrifood-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-agrifood_1.0.0b3/sdk/agrifood/azure-mgmt-agrifood/) |\n| Resource Management - AKS Developer Hub | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-devhub/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-devhub-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devhub_1.0.0b1/sdk/devhub/azure-mgmt-devhub/) |\n| Resource Management - Alerts Management | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-alertsmanagement/1.0.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-alertsmanagement/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-alertsmanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-alertsmanagement_1.0.0/sdk/alertsmanagement/azure-mgmt-alertsmanagement/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-alertsmanagement_2.0.0b2/sdk/alertsmanagement/azure-mgmt-alertsmanagement/) |\n| Resource Management - API Center | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-apicenter/1.0.0) | [docs](/python/api/overview/azure/mgmt-apicenter-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-apicenter_1.0.0/sdk/apicenter/azure-mgmt-apicenter/) |\n| Resource Management - API Management | PyPI [5.0.0](https://pypi.org/project/azure-mgmt-apimanagement/5.0.0)<br>PyPI [6.0.0b1](https://pypi.org/project/azure-mgmt-apimanagement/6.0.0b1) | [docs](/python/api/overview/azure/mgmt-apimanagement-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-apimanagement_5.0.0/sdk/apimanagement/azure-mgmt-apimanagement/)<br>GitHub [6.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-apimanagement_6.0.0b1/sdk/apimanagement/azure-mgmt-apimanagement/) |\n| Resource Management - App Compliance Automation | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-appcomplianceautomation/1.0.0) | [docs](/python/api/overview/azure/mgmt-appcomplianceautomation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appcomplianceautomation_1.0.0/sdk/appcomplianceautomation/azure-mgmt-appcomplianceautomation/) |\n| Resource Management - App Configuration | PyPI [5.0.0](https://pypi.org/project/azure-mgmt-appconfiguration/5.0.0)<br>PyPI [6.0.0b2](https://pypi.org/project/azure-mgmt-appconfiguration/6.0.0b2) | [docs](/python/api/overview/azure/mgmt-appconfiguration-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appconfiguration_5.0.0/sdk/appconfiguration/azure-mgmt-appconfiguration/)<br>GitHub [6.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appconfiguration_6.0.0b2/sdk/appconfiguration/azure-mgmt-appconfiguration/) |\n| Resource Management - App Platform | PyPI [10.0.1](https://pypi.org/project/azure-mgmt-appplatform/10.0.1) | [docs](/python/api/overview/azure/mgmt-appplatform-readme) | GitHub [10.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appplatform_10.0.1/sdk/appplatform/azure-mgmt-appplatform/) |\n| Resource Management - App Service | PyPI [11.0.0](https://pypi.org/project/azure-mgmt-web/11.0.0) | [docs](/python/api/overview/azure/mgmt-web-readme) | GitHub [11.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-web_11.0.0/sdk/appservice/azure-mgmt-web/) |\n| Resource Management - Application Insights | PyPI [4.1.0](https://pypi.org/project/azure-mgmt-applicationinsights/4.1.0)<br>PyPI [5.0.0b1](https://pypi.org/project/azure-mgmt-applicationinsights/5.0.0b1) | [docs](/python/api/overview/azure/mgmt-applicationinsights-readme) | GitHub [4.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-applicationinsights_4.1.0/sdk/applicationinsights/azure-mgmt-applicationinsights/)<br>GitHub [5.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-applicationinsights_5.0.0b1/sdk/applicationinsights/azure-mgmt-applicationinsights/) |\n| Resource Management - Arc Data | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-azurearcdata/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-azurearcdata/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-azurearcdata-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurearcdata_1.0.0/sdk/azurearcdata/azure-mgmt-azurearcdata/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurearcdata_2.0.0b1/sdk/azurearcdata/azure-mgmt-azurearcdata/) |\n| Resource Management - Arize AI Observability Eval | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-arizeaiobservabilityeval/1.0.0) | [docs](/python/api/overview/azure/mgmt-arizeaiobservabilityeval-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-arizeaiobservabilityeval_1.0.0/sdk/arizeaiobservabilityeval/azure-mgmt-arizeaiobservabilityeval/) |\n| Resource Management - Artifactsigning | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-artifactsigning/1.0.0) | [docs](/python/api/overview/azure/mgmt-artifactsigning-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-artifactsigning_1.0.0/sdk/artifactsigning/azure-mgmt-artifactsigning/) |\n| Resource Management - Attestation | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-attestation/2.0.0) | [docs](/python/api/overview/azure/mgmt-attestation-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-attestation_2.0.0/sdk/attestation/azure-mgmt-attestation/) |\n| Resource Management - Authorization | PyPI [4.0.0](https://pypi.org/project/azure-mgmt-authorization/4.0.0)<br>PyPI [5.0.0b2](https://pypi.org/project/azure-mgmt-authorization/5.0.0b2) | [docs](/python/api/overview/azure/mgmt-authorization-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-authorization_4.0.0/sdk/authorization/azure-mgmt-authorization/)<br>GitHub [5.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-authorization_5.0.0b2/sdk/authorization/azure-mgmt-authorization/) |\n| Resource Management - Automanage | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-automanage/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-automanage/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-automanage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-automanage_1.0.0/sdk/automanage/azure-mgmt-automanage/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-automanage_2.0.0b1/sdk/automanage/azure-mgmt-automanage/) |\n| Resource Management - Automation | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-automation/1.0.0)<br>PyPI [1.1.0b4](https://pypi.org/project/azure-mgmt-automation/1.1.0b4) | [docs](/python/api/overview/azure/mgmt-automation-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-automation_1.0.0/sdk/automation/azure-mgmt-automation/)<br>GitHub [1.1.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-automation_1.1.0b4/sdk/automation/azure-mgmt-automation/) |\n| Resource Management - Azure AD B2C | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-azureadb2c/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-azureadb2c-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azureadb2c_1.0.0b2/sdk/azureadb2c/azure-mgmt-azureadb2c/) |\n| Resource Management - Azure AI Search | PyPI [9.2.0](https://pypi.org/project/azure-mgmt-search/9.2.0)<br>PyPI [10.0.0b1](https://pypi.org/project/azure-mgmt-search/10.0.0b1) | [docs](/python/api/overview/azure/mgmt-search-readme) | GitHub [9.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-search_9.2.0/sdk/search/azure-mgmt-search/)<br>GitHub [10.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-search_10.0.0b1/sdk/search/azure-mgmt-search/) |\n| Resource Management - Azure Stack | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-azurestack/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-azurestack/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-azurestack-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurestack_1.0.0/sdk/azurestack/azure-mgmt-azurestack/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurestack_2.0.0b1/sdk/azurestack/azure-mgmt-azurestack/) |\n| Resource Management - Azure Stack HCI | PyPI [8.0.0](https://pypi.org/project/azure-mgmt-azurestackhci/8.0.0)<br>PyPI [8.1.0b1](https://pypi.org/project/azure-mgmt-azurestackhci/8.1.0b1) | [docs](/python/api/overview/azure/mgmt-azurestackhci-readme) | GitHub [8.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurestackhci_8.0.0/sdk/azurestackhci/azure-mgmt-azurestackhci/)<br>GitHub [8.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurestackhci_8.1.0b1/sdk/azurestackhci/azure-mgmt-azurestackhci/) |\n| Resource Management - Azure VMware Solution | PyPI [10.0.0](https://pypi.org/project/azure-mgmt-avs/10.0.0) | [docs](/python/api/overview/azure/mgmt-avs-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-avs_10.0.0/sdk/compute/azure-mgmt-avs/) |\n| Resource Management - Azurestackhcivm | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-azurestackhcivm/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-azurestackhcivm-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-azurestackhcivm_1.0.0b1/sdk/azurestackhci/azure-mgmt-azurestackhcivm/) |\n| Resource Management - BareMetal Infrastructure | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-baremetalinfrastructure/1.0.0)<br>PyPI [1.1.0b2](https://pypi.org/project/azure-mgmt-baremetalinfrastructure/1.1.0b2) | [docs](/python/api/overview/azure/mgmt-baremetalinfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-baremetalinfrastructure_1.0.0/sdk/baremetalinfrastructure/azure-mgmt-baremetalinfrastructure/)<br>GitHub [1.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-baremetalinfrastructure_1.1.0b2/sdk/baremetalinfrastructure/azure-mgmt-baremetalinfrastructure/) |\n| Resource Management - Batch | PyPI [19.0.0](https://pypi.org/project/azure-mgmt-batch/19.0.0) | [docs](/python/api/overview/azure/mgmt-batch-readme) | GitHub [19.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-batch_19.0.0/sdk/batch/azure-mgmt-batch/) |\n| Resource Management - Batch AI | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-batchai/7.0.0) | [docs](/python/api/overview/azure/mgmt-batchai-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-batchai_2.0.0/azure-mgmt-batchai/) |\n| Resource Management - Billing | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-billing/7.0.0) | [docs](/python/api/overview/azure/mgmt-billing-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-billing_7.0.0/sdk/billing/azure-mgmt-billing/) |\n| Resource Management - Billing Benefits | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-billingbenefits/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-billingbenefits-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-billingbenefits_1.0.0b2/sdk/billingbenefits/azure-mgmt-billingbenefits/) |\n| Resource Management - Bot Service | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-botservice/2.0.0) | [docs](/python/api/overview/azure/mgmt-botservice-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-botservice_2.0.0/sdk/botservice/azure-mgmt-botservice/) |\n| Resource Management - Carbonoptimization | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-carbonoptimization/1.0.0) | [docs](/python/api/overview/azure/mgmt-carbonoptimization-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-carbonoptimization_1.0.0/sdk/carbonoptimization/azure-mgmt-carbonoptimization/) |\n| Resource Management - Change Analysis | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-changeanalysis/1.0.0) | [docs](/python/api/overview/azure/mgmt-changeanalysis-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-changeanalysis_1.0.0/sdk/changeanalysis/azure-mgmt-changeanalysis/) |\n| Resource Management - Chaos | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-chaos/2.0.0) | [docs](/python/api/overview/azure/mgmt-chaos-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-chaos_2.0.0/sdk/chaos/azure-mgmt-chaos/) |\n| Resource Management - Cloudhealth | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-cloudhealth/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-cloudhealth-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cloudhealth_1.0.0b1/sdk/cloudhealth/azure-mgmt-cloudhealth/) |\n| Resource Management - Cognitive Services | PyPI [14.1.0](https://pypi.org/project/azure-mgmt-cognitiveservices/14.1.0)<br>PyPI [15.0.0b1](https://pypi.org/project/azure-mgmt-cognitiveservices/15.0.0b1) | [docs](/python/api/overview/azure/mgmt-cognitiveservices-readme) | GitHub [14.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cognitiveservices_14.1.0/sdk/cognitiveservices/azure-mgmt-cognitiveservices/)<br>GitHub [15.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cognitiveservices_15.0.0b1/sdk/cognitiveservices/azure-mgmt-cognitiveservices/) |\n| Resource Management - Commerce | PyPI [6.0.0](https://pypi.org/project/azure-mgmt-commerce/6.0.0)<br>PyPI [6.1.0b2](https://pypi.org/project/azure-mgmt-commerce/6.1.0b2) | [docs](/python/api/overview/azure/mgmt-commerce-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-commerce_6.0.0/sdk/commerce/azure-mgmt-commerce/)<br>GitHub [6.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-commerce_6.1.0b2/sdk/commerce/azure-mgmt-commerce/) |\n| Resource Management - Communication | PyPI [2.2.0](https://pypi.org/project/azure-mgmt-communication/2.2.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-communication/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-communication-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-communication_2.2.0/sdk/communication/azure-mgmt-communication/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-communication_3.0.0b1/sdk/communication/azure-mgmt-communication/) |\n| Resource Management - Compute | PyPI [38.0.0](https://pypi.org/project/azure-mgmt-compute/38.0.0) | [docs](/python/api/overview/azure/mgmt-compute-readme) | GitHub [38.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-compute_38.0.0/sdk/compute/azure-mgmt-compute/) |\n| Resource Management - Compute Fleet | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-computefleet/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-computefleet/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-computefleet-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computefleet_1.0.0/sdk/computefleet/azure-mgmt-computefleet/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computefleet_2.0.0b1/sdk/computefleet/azure-mgmt-computefleet/) |\n| Resource Management - Compute Schedule | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-computeschedule/1.1.0)<br>PyPI [1.2.0b1](https://pypi.org/project/azure-mgmt-computeschedule/1.2.0b1) | [docs](/python/api/overview/azure/mgmt-computeschedule-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computeschedule_1.1.0/sdk/computeschedule/azure-mgmt-computeschedule/)<br>GitHub [1.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computeschedule_1.2.0b1/sdk/computeschedule/azure-mgmt-computeschedule/) |\n| Resource Management - Computebulkactions | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-computebulkactions/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-computebulkactions-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computebulkactions_1.0.0b1/sdk/computebulkactions/azure-mgmt-computebulkactions/) |\n| Resource Management - Computelimit | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-computelimit/1.0.0) | [docs](/python/api/overview/azure/mgmt-computelimit-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computelimit_1.0.0/sdk/computelimit/azure-mgmt-computelimit/) |\n| Resource Management - Computerecommender | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-computerecommender/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-computerecommender-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-computerecommender_1.0.0b1/sdk/computerecommender/azure-mgmt-computerecommender/) |\n| Resource Management - Confidential Ledger | PyPI [1.0.1](https://pypi.org/project/azure-mgmt-confidentialledger/1.0.1)<br>PyPI [2.0.0b5](https://pypi.org/project/azure-mgmt-confidentialledger/2.0.0b5) | [docs](/python/api/overview/azure/mgmt-confidentialledger-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-confidentialledger_1.0.1/sdk/confidentialledger/azure-mgmt-confidentialledger/)<br>GitHub [2.0.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-confidentialledger_2.0.0b5/sdk/confidentialledger/azure-mgmt-confidentialledger/) |\n| Resource Management - Confluent | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-confluent/2.1.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-confluent/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-confluent-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-confluent_2.1.0/sdk/confluent/azure-mgmt-confluent/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-confluent_3.0.0b1/sdk/confluent/azure-mgmt-confluent/) |\n| Resource Management - Connected Cache | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-connectedcache/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-connectedcache-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-connectedcache_1.0.0b2/sdk/connectedcache/azure-mgmt-connectedcache/) |\n| Resource Management - Connected VMware | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-connectedvmware/1.0.0) | [docs](/python/api/overview/azure/mgmt-connectedvmware-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-connectedvmware_1.0.0/sdk/connectedvmware/azure-mgmt-connectedvmware/) |\n| Resource Management - Consumption | PyPI [10.0.0](https://pypi.org/project/azure-mgmt-consumption/10.0.0)<br>PyPI [11.0.0b1](https://pypi.org/project/azure-mgmt-consumption/11.0.0b1) | [docs](/python/api/overview/azure/mgmt-consumption-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-consumption_10.0.0/sdk/consumption/azure-mgmt-consumption/)<br>GitHub [11.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-consumption_11.0.0b1/sdk/consumption/azure-mgmt-consumption/) |\n| Resource Management - Container Apps | PyPI [4.0.0](https://pypi.org/project/azure-mgmt-appcontainers/4.0.0) | [docs](/python/api/overview/azure/mgmt-appcontainers-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appcontainers_4.0.0/sdk/appcontainers/azure-mgmt-appcontainers/) |\n| Resource Management - Container Instances | PyPI [10.1.0](https://pypi.org/project/azure-mgmt-containerinstance/10.1.0)<br>PyPI [10.2.0b1](https://pypi.org/project/azure-mgmt-containerinstance/10.2.0b1) | [docs](/python/api/overview/azure/mgmt-containerinstance-readme) | GitHub [10.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerinstance_10.1.0/sdk/containerinstance/azure-mgmt-containerinstance/)<br>GitHub [10.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerinstance_10.2.0b1/sdk/containerinstance/azure-mgmt-containerinstance/) |\n| Resource Management - Container Orchestrator Runtime | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-containerorchestratorruntime/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-containerorchestratorruntime-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerorchestratorruntime_1.0.0b1/sdk/containerorchestratorruntime/azure-mgmt-containerorchestratorruntime/) |\n| Resource Management - Container Registry | PyPI [15.0.0](https://pypi.org/project/azure-mgmt-containerregistry/15.0.0)<br>PyPI [15.1.0b1](https://pypi.org/project/azure-mgmt-containerregistry/15.1.0b1) | [docs](/python/api/overview/azure/mgmt-containerregistry-readme) | GitHub [15.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerregistry_15.0.0/sdk/containerregistry/azure-mgmt-containerregistry/)<br>GitHub [15.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerregistry_15.1.0b1/sdk/containerregistry/azure-mgmt-containerregistry/) |\n| Resource Management - Container Service | PyPI [41.1.0](https://pypi.org/project/azure-mgmt-containerservice/41.1.0)<br>PyPI [41.2.0b1](https://pypi.org/project/azure-mgmt-containerservice/41.2.0b1) | [docs](/python/api/overview/azure/mgmt-containerservice-readme) | GitHub [41.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerservice_41.1.0/sdk/containerservice/azure-mgmt-containerservice/)<br>GitHub [41.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerservice_41.2.0b1/sdk/containerservice/azure-mgmt-containerservice/) |\n| Resource Management - Container Service Fleet | PyPI [3.1.0](https://pypi.org/project/azure-mgmt-containerservicefleet/3.1.0)<br>PyPI [4.0.0b3](https://pypi.org/project/azure-mgmt-containerservicefleet/4.0.0b3) | [docs](/python/api/overview/azure/mgmt-containerservicefleet-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerservicefleet_3.1.0/sdk/containerservice/azure-mgmt-containerservicefleet/)<br>GitHub [4.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerservicefleet_4.0.0b3/sdk/containerservice/azure-mgmt-containerservicefleet/) |\n| Resource Management - Containerservicesafeguards | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-containerservicesafeguards/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-containerservicesafeguards-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerservicesafeguards_1.0.0b1/sdk/containerservice/azure-mgmt-containerservicesafeguards/) |\n| Resource Management - Content Delivery Network | PyPI [13.1.1](https://pypi.org/project/azure-mgmt-cdn/13.1.1) | [docs](/python/api/overview/azure/mgmt-cdn-readme) | GitHub [13.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cdn_13.1.1/sdk/cdn/azure-mgmt-cdn/) |\n| Resource Management - Cosmos DB | PyPI [9.9.0](https://pypi.org/project/azure-mgmt-cosmosdb/9.9.0)<br>PyPI [10.0.0b6](https://pypi.org/project/azure-mgmt-cosmosdb/10.0.0b6) | [docs](/python/api/overview/azure/mgmt-cosmosdb-readme) | GitHub [9.9.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cosmosdb_9.9.0/sdk/cosmos/azure-mgmt-cosmosdb/)<br>GitHub [10.0.0b6](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cosmosdb_10.0.0b6/sdk/cosmos/azure-mgmt-cosmosdb/) |\n| Resource Management - Cosmos DB | PyPI [0.1.4](https://pypi.org/project/azure-mgmt-documentdb/0.1.4) |  | GitHub [0.1.4](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-documentdb_0.1.3/azure-mgmt-documentdb/) |\n| Resource Management - Cosmos DB for PostgreSQL | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-cosmosdbforpostgresql/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-cosmosdbforpostgresql/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-cosmosdbforpostgresql-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cosmosdbforpostgresql_1.0.0/sdk/cosmosdbforpostgresql/azure-mgmt-cosmosdbforpostgresql/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-cosmosdbforpostgresql_1.1.0b1/sdk/cosmosdbforpostgresql/azure-mgmt-cosmosdbforpostgresql/) |\n| Resource Management - Cost Management | PyPI [4.0.1](https://pypi.org/project/azure-mgmt-costmanagement/4.0.1) | [docs](/python/api/overview/azure/mgmt-costmanagement-readme) | GitHub [4.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-costmanagement_4.0.1/sdk/costmanagement/azure-mgmt-costmanagement/) |\n| Resource Management - Custom Providers | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-customproviders/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-customproviders/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-customproviders-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-customproviders_1.0.0/sdk/customproviders/azure-mgmt-customproviders/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-customproviders_1.1.0b1/sdk/customproviders/azure-mgmt-customproviders/) |\n| Resource Management - Data Box | PyPI [3.1.0](https://pypi.org/project/azure-mgmt-databox/3.1.0) | [docs](/python/api/overview/azure/mgmt-databox-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-databox_3.1.0/sdk/databox/azure-mgmt-databox/) |\n| Resource Management - Data Box Edge | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-databoxedge/2.0.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-databoxedge/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-databoxedge-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-databoxedge_2.0.0/sdk/databoxedge/azure-mgmt-databoxedge/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-databoxedge_3.0.0b1/sdk/databoxedge/azure-mgmt-databoxedge/) |\n| Resource Management - Data Factory | PyPI [9.3.0](https://pypi.org/project/azure-mgmt-datafactory/9.3.0) | [docs](/python/api/overview/azure/mgmt-datafactory-readme) | GitHub [9.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datafactory_9.3.0/sdk/datafactory/azure-mgmt-datafactory/) |\n| Resource Management - Data Lake Analytics | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-datalake-analytics/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-datalake-analytics-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datalake-analytics_0.6.0/azure-mgmt-datalake-analytics/) |\n| Resource Management - Data Lake Store | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-datalake-store/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-datalake-store/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-datalake-store-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datalake-store_0.5.0/azure-mgmt-datalake-store/) |\n| Resource Management - Data Migration | PyPI [10.1.0](https://pypi.org/project/azure-mgmt-datamigration/10.1.0) | [docs](/python/api/overview/azure/mgmt-datamigration-readme) | GitHub [10.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datamigration_10.1.0/sdk/datamigration/azure-mgmt-datamigration/) |\n| Resource Management - Data Protection | PyPI [2.0.1](https://pypi.org/project/azure-mgmt-dataprotection/2.0.1) | [docs](/python/api/overview/azure/mgmt-dataprotection-readme) | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dataprotection_2.0.1/sdk/dataprotection/azure-mgmt-dataprotection/) |\n| Resource Management - Data Share | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-datashare/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-datashare/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-datashare-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datashare_1.0.0/sdk/datashare/azure-mgmt-datashare/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datashare_1.1.0b1/sdk/datashare/azure-mgmt-datashare/) |\n| Resource Management - Database Watcher | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-databasewatcher/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-databasewatcher-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-databasewatcher_1.0.0b1/sdk/databasewatcher/azure-mgmt-databasewatcher/) |\n| Resource Management - Databricks | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-databricks/2.0.0) | [docs](/python/api/overview/azure/mgmt-databricks-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-databricks_2.0.0/sdk/databricks/azure-mgmt-databricks/) |\n| Resource Management - Datadog | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-datadog/2.1.0) | [docs](/python/api/overview/azure/mgmt-datadog-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datadog_2.1.0/sdk/datadog/azure-mgmt-datadog/) |\n| Resource Management - Defender EASM | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-defendereasm/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-defendereasm-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-defendereasm_1.0.0b1/sdk/defendereasm/azure-mgmt-defendereasm/) |\n| Resource Management - Dellstorage | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-dellstorage/1.0.0) | [docs](/python/api/overview/azure/mgmt-dellstorage-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dellstorage_1.0.0/sdk/dell/azure-mgmt-dellstorage/) |\n| Resource Management - Dependencymap | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-dependencymap/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-dependencymap-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dependencymap_1.0.0b1/sdk/dependencymap/azure-mgmt-dependencymap/) |\n| Resource Management - Deployment Manager | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-deploymentmanager/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-deploymentmanager/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-deploymentmanager-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-deploymentmanager_1.0.0/sdk/deploymentmanager/azure-mgmt-deploymentmanager/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-deploymentmanager_2.0.0b1/sdk/deploymentmanager/azure-mgmt-deploymentmanager/) |\n| Resource Management - Desktop Virtualization | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-desktopvirtualization/2.0.0) | [docs](/python/api/overview/azure/mgmt-desktopvirtualization-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-desktopvirtualization_2.0.0/sdk/desktopvirtualization/azure-mgmt-desktopvirtualization/) |\n| Resource Management - Dev Spaces | PyPI [1.0.0b3](https://pypi.org/project/azure-mgmt-devspaces/1.0.0b3) | [docs](/python/api/overview/azure/mgmt-devspaces-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devspaces_1.0.0b3/sdk/aks/azure-mgmt-devspaces/) |\n| Resource Management - Device Provisioning Services | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-iothubprovisioningservices/1.1.0)<br>PyPI [1.2.0b3](https://pypi.org/project/azure-mgmt-iothubprovisioningservices/1.2.0b3) | [docs](/python/api/overview/azure/mgmt-iothubprovisioningservices-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iothubprovisioningservices_0.2.0/azure-mgmt-iothubprovisioningservices/) |\n| Resource Management - Device Registry | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-deviceregistry/1.1.0)<br>PyPI [1.2.0b1](https://pypi.org/project/azure-mgmt-deviceregistry/1.2.0b1) | [docs](/python/api/overview/azure/mgmt-deviceregistry-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-deviceregistry_1.1.0/sdk/deviceregistry/azure-mgmt-deviceregistry/)<br>GitHub [1.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-deviceregistry_1.2.0b1/sdk/deviceregistry/azure-mgmt-deviceregistry/) |\n| Resource Management - Device Update | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-deviceupdate/1.1.0) | [docs](/python/api/overview/azure/mgmt-deviceupdate-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-deviceupdate_1.1.0/sdk/deviceupdate/azure-mgmt-deviceupdate/) |\n| Resource Management - DevOps Infrastructure | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-devopsinfrastructure/1.0.0) | [docs](/python/api/overview/azure/mgmt-devopsinfrastructure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devopsinfrastructure_1.0.0/sdk/devopsinfrastructure/azure-mgmt-devopsinfrastructure/) |\n| Resource Management - DevTest Labs | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-devtestlabs/9.0.0)<br>PyPI [10.0.0b2](https://pypi.org/project/azure-mgmt-devtestlabs/10.0.0b2) | [docs](/python/api/overview/azure/mgmt-devtestlabs-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devtestlabs_9.0.0/sdk/devtestlabs/azure-mgmt-devtestlabs/)<br>GitHub [10.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-devtestlabs_10.0.0b2/sdk/devtestlabs/azure-mgmt-devtestlabs/) |\n| Resource Management - Digital Twins | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-digitaltwins/7.0.0) | [docs](/python/api/overview/azure/mgmt-digitaltwins-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-digitaltwins_7.0.0/sdk/digitaltwins/azure-mgmt-digitaltwins/) |\n| Resource Management - Disconnectedoperations | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-disconnectedoperations/1.0.0) | [docs](/python/api/overview/azure/mgmt-disconnectedoperations-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-disconnectedoperations_1.0.0/sdk/disconnectedoperations/azure-mgmt-disconnectedoperations/) |\n| Resource Management - DNS | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-dns/9.0.0) | [docs](/python/api/overview/azure/mgmt-dns-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dns_9.0.0/sdk/network/azure-mgmt-dns/) |\n| Resource Management - DNS Resolver | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-dnsresolver/1.1.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-dnsresolver/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-dnsresolver-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dnsresolver_1.1.0/sdk/dnsresolver/azure-mgmt-dnsresolver/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dnsresolver_2.0.0b1/sdk/dnsresolver/azure-mgmt-dnsresolver/) |\n| Resource Management - Durable Task | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-durabletask/1.1.0) | [docs](/python/api/overview/azure/mgmt-durabletask-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-durabletask_1.1.0/sdk/durabletask/azure-mgmt-durabletask/) |\n| Resource Management - Dynatrace | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-dynatrace/2.0.0) | [docs](/python/api/overview/azure/mgmt-dynatrace-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dynatrace_2.0.0/sdk/dynatrace/azure-mgmt-dynatrace/) |\n| Resource Management - Edge Order | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-edgeorder/2.0.0) | [docs](/python/api/overview/azure/mgmt-edgeorder-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-edgeorder_2.0.0/sdk/edgeorder/azure-mgmt-edgeorder/) |\n| Resource Management - Edge Zones | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-edgezones/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-edgezones-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-edgezones_1.0.0b2/sdk/edgezones/azure-mgmt-edgezones/) |\n| Resource Management - Edgeactions | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-edgeactions/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-edgeactions-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-edgeactions_1.0.0b1/sdk/edgeactions/azure-mgmt-edgeactions/) |\n| Resource Management - Education | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-education/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-education-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-education_1.0.0b2/sdk/education/azure-mgmt-education/) |\n| Resource Management - Elastic | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-elastic/2.0.0) | [docs](/python/api/overview/azure/mgmt-elastic-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-elastic_2.0.0/sdk/elastic/azure-mgmt-elastic/) |\n| Resource Management - Event Grid | PyPI [10.4.0](https://pypi.org/project/azure-mgmt-eventgrid/10.4.0)<br>PyPI [10.5.0b2](https://pypi.org/project/azure-mgmt-eventgrid/10.5.0b2) | [docs](/python/api/overview/azure/mgmt-eventgrid-readme) | GitHub [10.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-eventgrid_10.4.0/sdk/eventgrid/azure-mgmt-eventgrid/)<br>GitHub [10.5.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-eventgrid_10.5.0b2/sdk/eventgrid/azure-mgmt-eventgrid/) |\n| Resource Management - Event Hubs | PyPI [11.2.0](https://pypi.org/project/azure-mgmt-eventhub/11.2.0)<br>PyPI [12.0.0b1](https://pypi.org/project/azure-mgmt-eventhub/12.0.0b1) | [docs](/python/api/overview/azure/mgmt-eventhub-readme) | GitHub [11.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-eventhub_11.2.0/sdk/eventhub/azure-mgmt-eventhub/)<br>GitHub [12.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-eventhub_12.0.0b1/sdk/eventhub/azure-mgmt-eventhub/) |\n| Resource Management - Extended Location | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-extendedlocation/2.0.0) | [docs](/python/api/overview/azure/mgmt-extendedlocation-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-extendedlocation_2.0.0/sdk/extendedlocation/azure-mgmt-extendedlocation/) |\n| Resource Management - Fabric | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-fabric/1.0.0) | [docs](/python/api/overview/azure/mgmt-fabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-fabric_1.0.0/sdk/fabric/azure-mgmt-fabric/) |\n| Resource Management - Fileshares | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-fileshares/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-fileshares-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-fileshares_1.0.0b1/sdk/fileshares/azure-mgmt-fileshares/) |\n| Resource Management - Fluid Relay | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-fluidrelay/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-fluidrelay/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-fluidrelay-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-fluidrelay_1.0.0/sdk/fluidrelay/azure-mgmt-fluidrelay/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-fluidrelay_1.1.0b1/sdk/fluidrelay/azure-mgmt-fluidrelay/) |\n| Resource Management - Front Door | PyPI [1.2.0](https://pypi.org/project/azure-mgmt-frontdoor/1.2.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-frontdoor/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-frontdoor-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-frontdoor_1.2.0/sdk/network/azure-mgmt-frontdoor/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-frontdoor_2.0.0b1/sdk/network/azure-mgmt-frontdoor/) |\n| Resource Management - Graph Services | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-graphservices/1.0.0) | [docs](/python/api/overview/azure/mgmt-graphservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-graphservices_1.0.0/sdk/graphservices/azure-mgmt-graphservices/) |\n| Resource Management - Guest Configuration | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-guestconfig/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-guestconfig-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-guestconfig_1.0.0b2/sdk/machinelearning/azure-mgmt-guestconfig/) |\n| Resource Management - HANA on Azure | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-hanaonazure/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-hanaonazure/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-hanaonazure-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hanaonazure_1.0.0/sdk/hanaonazure/azure-mgmt-hanaonazure/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hanaonazure_1.1.0b1/sdk/hanaonazure/azure-mgmt-hanaonazure/) |\n| Resource Management - Hardware Security Modules | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-hardwaresecuritymodules/1.0.0) | [docs](/python/api/overview/azure/mgmt-hardwaresecuritymodules-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hardwaresecuritymodules_1.0.0/sdk/hardwaresecuritymodules/azure-mgmt-hardwaresecuritymodules/) |\n| Resource Management - HDInsight | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-hdinsight/9.0.0)<br>PyPI [9.1.0b2](https://pypi.org/project/azure-mgmt-hdinsight/9.1.0b2) | [docs](/python/api/overview/azure/mgmt-hdinsight-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hdinsight_9.0.0/sdk/hdinsight/azure-mgmt-hdinsight/)<br>GitHub [9.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hdinsight_9.1.0b2/sdk/hdinsight/azure-mgmt-hdinsight/) |\n| Resource Management - HDInsight Containers | PyPI [1.0.0b4](https://pypi.org/project/azure-mgmt-hdinsightcontainers/1.0.0b4) |  | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hdinsightcontainers_1.0.0b4/sdk/hdinsight/azure-mgmt-hdinsightcontainers/) |\n| Resource Management - Health Bot | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-healthbot/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-healthbot-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-healthbot_1.0.0b2/sdk/healthbot/azure-mgmt-healthbot/) |\n| Resource Management - Health Data AI Services | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-healthdataaiservices/1.0.0) | [docs](/python/api/overview/azure/mgmt-healthdataaiservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-healthdataaiservices_1.0.0/sdk/healthdataaiservices/azure-mgmt-healthdataaiservices/) |\n| Resource Management - Healthcare APIs | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-healthcareapis/2.1.0) | [docs](/python/api/overview/azure/mgmt-healthcareapis-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-healthcareapis_2.1.0/sdk/healthcareapis/azure-mgmt-healthcareapis/) |\n| Resource Management - Hybrid Compute | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-hybridcompute/9.0.0)<br>PyPI [9.1.0b2](https://pypi.org/project/azure-mgmt-hybridcompute/9.1.0b2) | [docs](/python/api/overview/azure/mgmt-hybridcompute-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridcompute_9.0.0/sdk/hybridcompute/azure-mgmt-hybridcompute/)<br>GitHub [9.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridcompute_9.1.0b2/sdk/hybridcompute/azure-mgmt-hybridcompute/) |\n| Resource Management - Hybrid Connectivity | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-hybridconnectivity/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-hybridconnectivity/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-hybridconnectivity-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridconnectivity_1.0.0/sdk/hybridconnectivity/azure-mgmt-hybridconnectivity/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridconnectivity_2.0.0b1/sdk/hybridconnectivity/azure-mgmt-hybridconnectivity/) |\n| Resource Management - Hybrid Container Service | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-hybridcontainerservice/1.0.0) | [docs](/python/api/overview/azure/mgmt-hybridcontainerservice-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridcontainerservice_1.0.0/sdk/hybridcontainerservice/azure-mgmt-hybridcontainerservice/) |\n| Resource Management - Hybrid Kubernetes | PyPI [1.2.0](https://pypi.org/project/azure-mgmt-hybridkubernetes/1.2.0) | [docs](/python/api/overview/azure/mgmt-hybridkubernetes-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridkubernetes_1.2.0/sdk/hybridkubernetes/azure-mgmt-hybridkubernetes/) |\n| Resource Management - Hybrid Network | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-hybridnetwork/2.0.0) | [docs](/python/api/overview/azure/mgmt-hybridnetwork-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-hybridnetwork_2.0.0/sdk/hybridnetwork/azure-mgmt-hybridnetwork/) |\n| Resource Management - Image Builder | PyPI [1.4.0](https://pypi.org/project/azure-mgmt-imagebuilder/1.4.0) | [docs](/python/api/overview/azure/mgmt-imagebuilder-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-imagebuilder_1.4.0/sdk/compute/azure-mgmt-imagebuilder/) |\n| Resource Management - Impact Reporting | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-impactreporting/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-impactreporting-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-impactreporting_1.0.0b1/sdk/impactreporting/azure-mgmt-impactreporting/) |\n| Resource Management - Informatica Data Management | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-informaticadatamanagement/1.0.0) | [docs](/python/api/overview/azure/mgmt-informaticadatamanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-informaticadatamanagement_1.0.0/sdk/informaticadatamanagement/azure-mgmt-informaticadatamanagement/) |\n| Resource Management - IoT Central | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-iotcentral/9.0.0)<br>PyPI [10.0.0b2](https://pypi.org/project/azure-mgmt-iotcentral/10.0.0b2) | [docs](/python/api/overview/azure/mgmt-iotcentral-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iotcentral_9.0.0/sdk/iothub/azure-mgmt-iotcentral/)<br>GitHub [10.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iotcentral_10.0.0b2/sdk/iothub/azure-mgmt-iotcentral/) |\n| Resource Management - IoT Firmware Defense | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-iotfirmwaredefense/2.0.0) | [docs](/python/api/overview/azure/mgmt-iotfirmwaredefense-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iotfirmwaredefense_2.0.0/sdk/iotfirmwaredefense/azure-mgmt-iotfirmwaredefense/) |\n| Resource Management - IoT Hub | PyPI [4.0.0](https://pypi.org/project/azure-mgmt-iothub/4.0.0)<br>PyPI [5.0.0b2](https://pypi.org/project/azure-mgmt-iothub/5.0.0b2) | [docs](/python/api/overview/azure/mgmt-iothub-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iothub_4.0.0/sdk/iothub/azure-mgmt-iothub/)<br>GitHub [5.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iothub_5.0.0b2/sdk/iothub/azure-mgmt-iothub/) |\n| Resource Management - IoT Operations | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-iotoperations/1.1.0) | [docs](/python/api/overview/azure/mgmt-iotoperations-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-iotoperations_1.1.0/sdk/iotoperations/azure-mgmt-iotoperations/) |\n| Resource Management - Key Vault | PyPI [14.0.1](https://pypi.org/project/azure-mgmt-keyvault/14.0.1) | [docs](/python/api/overview/azure/mgmt-keyvault-readme) | GitHub [14.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-keyvault_14.0.1/sdk/keyvault/azure-mgmt-keyvault/) |\n| Resource Management - Kubernetes Configuration | PyPI [3.1.0](https://pypi.org/project/azure-mgmt-kubernetesconfiguration/3.1.0) | [docs](/python/api/overview/azure/mgmt-kubernetesconfiguration-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kubernetesconfiguration_3.1.0/sdk/kubernetesconfiguration/azure-mgmt-kubernetesconfiguration/) |\n| Resource Management - Kubernetesconfiguration-Extensions | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-kubernetesconfiguration-extensions/1.0.0) | [docs](/python/api/overview/azure/mgmt-kubernetesconfiguration-extensions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kubernetesconfiguration-extensions_1.0.0/sdk/kubernetesconfiguration/azure-mgmt-kubernetesconfiguration-extensions/) |\n| Resource Management - Kubernetesconfiguration-Extensiontypes | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-kubernetesconfiguration-extensiontypes/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-kubernetesconfiguration-extensiontypes-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kubernetesconfiguration-extensiontypes_1.0.0b2/sdk/kubernetesconfiguration/azure-mgmt-kubernetesconfiguration-extensiontypes/) |\n| Resource Management - Kubernetesconfiguration-Fluxconfigurations | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-kubernetesconfiguration-fluxconfigurations/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-kubernetesconfiguration-fluxconfigurations-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kubernetesconfiguration-fluxconfigurations_1.0.0b2/sdk/kubernetesconfiguration/azure-mgmt-kubernetesconfiguration-fluxconfigurations/) |\n| Resource Management - Kubernetesconfiguration-Privatelinkscopes | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-kubernetesconfiguration-privatelinkscopes/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-kubernetesconfiguration-privatelinkscopes-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kubernetesconfiguration-privatelinkscopes_1.0.0b2/sdk/kubernetesconfiguration/azure-mgmt-kubernetesconfiguration-privatelinkscopes/) |\n| Resource Management - Kusto | PyPI [3.4.0](https://pypi.org/project/azure-mgmt-kusto/3.4.0) | [docs](/python/api/overview/azure/mgmt-kusto-readme) | GitHub [3.4.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-kusto_3.4.0/sdk/kusto/azure-mgmt-kusto/) |\n| Resource Management - Lab Services | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-labservices/2.0.0)<br>PyPI [2.1.0b1](https://pypi.org/project/azure-mgmt-labservices/2.1.0b1) | [docs](/python/api/overview/azure/mgmt-labservices-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-labservices_2.0.0/sdk/labservices/azure-mgmt-labservices/)<br>GitHub [2.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-labservices_2.1.0b1/sdk/labservices/azure-mgmt-labservices/) |\n| Resource Management - Lambdatesthyperexecute | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-lambdatesthyperexecute/1.0.0) | [docs](/python/api/overview/azure/mgmt-lambdatesthyperexecute-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-lambdatesthyperexecute_1.0.0/sdk/lambdatesthyperexecute/azure-mgmt-lambdatesthyperexecute/) |\n| Resource Management - Large Instance | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-largeinstance/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-largeinstance-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-largeinstance_1.0.0b1/sdk/largeinstance/azure-mgmt-largeinstance/) |\n| Resource Management - Load Testing | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-loadtesting/1.0.0) | [docs](/python/api/overview/azure/mgmt-loadtesting-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-loadtesting_1.0.0/sdk/loadtestservice/azure-mgmt-loadtesting/) |\n| Resource Management - Log Analytics | PyPI [13.1.1](https://pypi.org/project/azure-mgmt-loganalytics/13.1.1) | [docs](/python/api/overview/azure/mgmt-loganalytics-readme) | GitHub [13.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-loganalytics_13.1.1/sdk/loganalytics/azure-mgmt-loganalytics/) |\n| Resource Management - Logic Apps | PyPI [10.0.0](https://pypi.org/project/azure-mgmt-logic/10.0.0)<br>PyPI [10.1.0b1](https://pypi.org/project/azure-mgmt-logic/10.1.0b1) | [docs](/python/api/overview/azure/mgmt-logic-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-logic_10.0.0/sdk/logic/azure-mgmt-logic/)<br>GitHub [10.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-logic_10.1.0b1/sdk/logic/azure-mgmt-logic/) |\n| Resource Management - Logz | PyPI [1.1.1](https://pypi.org/project/azure-mgmt-logz/1.1.1) | [docs](/python/api/overview/azure/mgmt-logz-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-logz_1.1.1/sdk/logz/azure-mgmt-logz/) |\n| Resource Management - Machine Learning Compute | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-machinelearningcompute/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-machinelearningcompute-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-machinelearningcompute_1.0.0b2/sdk/machinelearning/azure-mgmt-machinelearningcompute/) |\n| Resource Management - Machine Learning Services | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-machinelearningservices/1.0.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-machinelearningservices/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-machinelearningservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-machinelearningservices_1.0.0/sdk/machinelearning/azure-mgmt-machinelearningservices/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-machinelearningservices_2.0.0b2/sdk/machinelearning/azure-mgmt-machinelearningservices/) |\n| Resource Management - Maintenance | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-maintenance/2.1.0)<br>PyPI [2.2.0b2](https://pypi.org/project/azure-mgmt-maintenance/2.2.0b2) | [docs](/python/api/overview/azure/mgmt-maintenance-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-maintenance_2.1.0/sdk/maintenance/azure-mgmt-maintenance/)<br>GitHub [2.2.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-maintenance_2.2.0b2/sdk/maintenance/azure-mgmt-maintenance/) |\n| Resource Management - Managed Applications | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-managedapplications/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-managedapplications-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managedapplications_1.0.0b1/sdk/managedapplications/azure-mgmt-managedapplications/) |\n| Resource Management - Managed Grafana | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-dashboard/2.0.0) | [docs](/python/api/overview/azure/mgmt-dashboard-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-dashboard_2.0.0/sdk/dashboard/azure-mgmt-dashboard/) |\n| Resource Management - Managed Network Fabric | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-managednetworkfabric/1.0.0) | [docs](/python/api/overview/azure/mgmt-managednetworkfabric-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managednetworkfabric_1.0.0/sdk/managednetworkfabric/azure-mgmt-managednetworkfabric/) |\n| Resource Management - Managed Service Identity | PyPI [7.1.0](https://pypi.org/project/azure-mgmt-msi/7.1.0)<br>PyPI [8.0.0b1](https://pypi.org/project/azure-mgmt-msi/8.0.0b1) | [docs](/python/api/overview/azure/mgmt-msi-readme) | GitHub [7.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-msi_7.1.0/sdk/resources/azure-mgmt-msi/)<br>GitHub [8.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-msi_8.0.0b1/sdk/resources/azure-mgmt-msi/) |\n| Resource Management - Managed Services | PyPI [6.0.0](https://pypi.org/project/azure-mgmt-managedservices/6.0.0)<br>PyPI [7.0.0b2](https://pypi.org/project/azure-mgmt-managedservices/7.0.0b2) | [docs](/python/api/overview/azure/mgmt-managedservices-readme) | GitHub [6.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managedservices_6.0.0/sdk/managedservices/azure-mgmt-managedservices/)<br>GitHub [7.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managedservices_7.0.0b2/sdk/managedservices/azure-mgmt-managedservices/) |\n| Resource Management - Managedops | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-managedops/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-managedops-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managedops_1.0.0b2/sdk/managedops/azure-mgmt-managedops/) |\n| Resource Management - Management Groups | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-managementgroups/1.1.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-managementgroups/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-managementgroups-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managementgroups_1.1.0/sdk/managementgroups/azure-mgmt-managementgroups/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managementgroups_2.0.0b1/sdk/managementgroups/azure-mgmt-managementgroups/) |\n| Resource Management - Management Partner | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-managementpartner/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-managementpartner/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-managementpartner-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managementpartner_1.0.0/sdk/managementpartner/azure-mgmt-managementpartner/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-managementpartner_1.1.0b1/sdk/managementpartner/azure-mgmt-managementpartner/) |\n| Resource Management - Maps | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-maps/2.1.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-maps/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-maps-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-maps_2.1.0/sdk/maps/azure-mgmt-maps/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-maps_3.0.0b1/sdk/maps/azure-mgmt-maps/) |\n| Resource Management - Marketplace Ordering | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-marketplaceordering/1.1.0)<br>PyPI [1.2.0b2](https://pypi.org/project/azure-mgmt-marketplaceordering/1.2.0b2) | [docs](/python/api/overview/azure/mgmt-marketplaceordering-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-marketplaceordering_1.1.0/sdk/marketplaceordering/azure-mgmt-marketplaceordering/)<br>GitHub [1.2.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-marketplaceordering_1.2.0b2/sdk/marketplaceordering/azure-mgmt-marketplaceordering/) |\n| Resource Management - Media Services | PyPI [10.2.1](https://pypi.org/project/azure-mgmt-media/10.2.1) | [docs](/python/api/overview/azure/mgmt-media-readme) | GitHub [10.2.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-media_10.2.1/sdk/media/azure-mgmt-media/) |\n| Resource Management - Migration Assessment | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-migrationassessment/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-migrationassessment-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-migrationassessment_1.0.0b1/sdk/migrate/azure-mgmt-migrationassessment/) |\n| Resource Management - Migration Discovery SAP | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-migrationdiscoverysap/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-migrationdiscoverysap-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-migrationdiscoverysap_1.0.0b1/sdk/migrationdiscovery/azure-mgmt-migrationdiscoverysap/) |\n| Resource Management - Mixed Reality | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-mixedreality/1.0.0)<br>PyPI [1.1.0b2](https://pypi.org/project/azure-mgmt-mixedreality/1.1.0b2) | [docs](/python/api/overview/azure/mgmt-mixedreality-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mixedreality_1.0.0/sdk/mixedreality/azure-mgmt-mixedreality/)<br>GitHub [1.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mixedreality_1.1.0b2/sdk/mixedreality/azure-mgmt-mixedreality/) |\n| Resource Management - Mobile Network | PyPI [3.3.1](https://pypi.org/project/azure-mgmt-mobilenetwork/3.3.1) | [docs](/python/api/overview/azure/mgmt-mobilenetwork-readme) | GitHub [3.3.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mobilenetwork_3.3.1/sdk/mobilenetwork/azure-mgmt-mobilenetwork/) |\n| Resource Management - Mongo Cluster | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-mongocluster/1.1.0) | [docs](/python/api/overview/azure/mgmt-mongocluster-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mongocluster_1.1.0/sdk/mongocluster/azure-mgmt-mongocluster/) |\n| Resource Management - Mongodbatlas | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-mongodbatlas/1.0.0) | [docs](/python/api/overview/azure/mgmt-mongodbatlas-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mongodbatlas_1.0.0/sdk/mongodbatlas/azure-mgmt-mongodbatlas/) |\n| Resource Management - Monitor | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-monitor/7.0.0)<br>PyPI [8.0.0b2](https://pypi.org/project/azure-mgmt-monitor/8.0.0b2) | [docs](/python/api/overview/azure/mgmt-monitor-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-monitor_7.0.0/sdk/monitor/azure-mgmt-monitor/)<br>GitHub [8.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-monitor_8.0.0b2/sdk/monitor/azure-mgmt-monitor/) |\n| Resource Management - MySQL Flexible Servers | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-mysqlflexibleservers/1.0.0)<br>PyPI [1.1.0b2](https://pypi.org/project/azure-mgmt-mysqlflexibleservers/1.1.0b2) | [docs](/python/api/overview/azure/mgmt-mysqlflexibleservers-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mysqlflexibleservers_1.0.0/sdk/mysqlflexibleservers/azure-mgmt-mysqlflexibleservers/)<br>GitHub [1.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-mysqlflexibleservers_1.1.0b2/sdk/mysqlflexibleservers/azure-mgmt-mysqlflexibleservers/) |\n| Resource Management - Neon Postgres | PyPI [1.0.1](https://pypi.org/project/azure-mgmt-neonpostgres/1.0.1) | [docs](/python/api/overview/azure/mgmt-neonpostgres-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-neonpostgres_1.0.1/sdk/neonpostgres/azure-mgmt-neonpostgres/) |\n| Resource Management - NetApp Files | PyPI [16.0.0](https://pypi.org/project/azure-mgmt-netapp/16.0.0) | [docs](/python/api/overview/azure/mgmt-netapp-readme) | GitHub [16.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-netapp_16.0.0/sdk/netapp/azure-mgmt-netapp/) |\n| Resource Management - Network | PyPI [30.2.0](https://pypi.org/project/azure-mgmt-network/30.2.0)<br>PyPI [31.0.0b1](https://pypi.org/project/azure-mgmt-network/31.0.0b1) | [docs](/python/api/overview/azure/mgmt-network-readme) | GitHub [30.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-network_30.2.0/sdk/network/azure-mgmt-network/)<br>GitHub [31.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-network_31.0.0b1/sdk/network/azure-mgmt-network/) |\n| Resource Management - Network Analytics | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-networkanalytics/1.0.0) | [docs](/python/api/overview/azure/mgmt-networkanalytics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-networkanalytics_1.0.0/sdk/networkanalytics/azure-mgmt-networkanalytics/) |\n| Resource Management - Network Function | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-networkfunction/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-networkfunction-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-networkfunction_1.0.0b2/sdk/networkfunction/azure-mgmt-networkfunction/) |\n| Resource Management - Networkcloud | PyPI [2.2.0](https://pypi.org/project/azure-mgmt-networkcloud/2.2.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-networkcloud/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-networkcloud-readme) | GitHub [2.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-networkcloud_2.2.0/sdk/networkcloud/azure-mgmt-networkcloud/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-networkcloud_3.0.0b1/sdk/networkcloud/azure-mgmt-networkcloud/) |\n| Resource Management - New Relic Observability | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-newrelicobservability/1.1.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-newrelicobservability/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-newrelicobservability-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-newrelicobservability_1.1.0/sdk/newrelicobservability/azure-mgmt-newrelicobservability/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-newrelicobservability_2.0.0b1/sdk/newrelicobservability/azure-mgmt-newrelicobservability/) |\n| Resource Management - Nginx | PyPI [4.0.0](https://pypi.org/project/azure-mgmt-nginx/4.0.0) | [docs](/python/api/overview/azure/mgmt-nginx-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-nginx_4.0.0/sdk/nginx/azure-mgmt-nginx/) |\n| Resource Management - Notification Hubs | PyPI [8.0.0](https://pypi.org/project/azure-mgmt-notificationhubs/8.0.0)<br>PyPI [8.1.0b2](https://pypi.org/project/azure-mgmt-notificationhubs/8.1.0b2) | [docs](/python/api/overview/azure/mgmt-notificationhubs-readme) | GitHub [8.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-notificationhubs_8.0.0/sdk/notificationhubs/azure-mgmt-notificationhubs/)<br>GitHub [8.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-notificationhubs_8.1.0b2/sdk/notificationhubs/azure-mgmt-notificationhubs/) |\n| Resource Management - Oep | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-oep/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-oep-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-oep_1.0.0b2/sdk/oep/azure-mgmt-oep/) |\n| Resource Management - Onlineexperimentation | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-onlineexperimentation/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-onlineexperimentation-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-onlineexperimentation_1.0.0b1/sdk/onlineexperimentation/azure-mgmt-onlineexperimentation/) |\n| Resource Management - Operations Management | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-operationsmanagement/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-operationsmanagement/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-operationsmanagement-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-operationsmanagement_1.0.0/sdk/operationsmanagement/azure-mgmt-operationsmanagement/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-operationsmanagement_2.0.0b1/sdk/operationsmanagement/azure-mgmt-operationsmanagement/) |\n| Resource Management - Oracle Database | PyPI [3.0.0](https://pypi.org/project/azure-mgmt-oracledatabase/3.0.0) | [docs](/python/api/overview/azure/mgmt-oracledatabase-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-oracledatabase_3.0.0/sdk/oracledatabase/azure-mgmt-oracledatabase/) |\n| Resource Management - Orbital | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-orbital/2.0.0) | [docs](/python/api/overview/azure/mgmt-orbital-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-orbital_2.0.0/sdk/orbital/azure-mgmt-orbital/) |\n| Resource Management - Palo Alto Networks - Next Generation Firewall | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-paloaltonetworksngfw/1.1.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-paloaltonetworksngfw/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-paloaltonetworksngfw-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-paloaltonetworksngfw_1.1.0/sdk/paloaltonetworks/azure-mgmt-paloaltonetworksngfw/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-paloaltonetworksngfw_2.0.0b1/sdk/paloaltonetworks/azure-mgmt-paloaltonetworksngfw/) |\n| Resource Management - Peering | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-peering/1.0.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-peering/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-peering-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-peering_1.0.0/sdk/peering/azure-mgmt-peering/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-peering_2.0.0b2/sdk/peering/azure-mgmt-peering/) |\n| Resource Management - Pinecone Vector DB | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-pineconevectordb/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-pineconevectordb-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-pineconevectordb_1.0.0b2/sdk/pineconevectordb/azure-mgmt-pineconevectordb/) |\n| Resource Management - Planetarycomputer | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-planetarycomputer/1.0.0) | [docs](/python/api/overview/azure/mgmt-planetarycomputer-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-planetarycomputer_1.0.0/sdk/planetarycomputer/azure-mgmt-planetarycomputer/) |\n| Resource Management - Playwright | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-playwright/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-playwright/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-playwright-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-playwright_1.0.0/sdk/playwright/azure-mgmt-playwright/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-playwright_1.1.0b1/sdk/playwright/azure-mgmt-playwright/) |\n| Resource Management - Playwright Testing | PyPI [1.0.1](https://pypi.org/project/azure-mgmt-playwrighttesting/1.0.1) | [docs](/python/api/overview/azure/mgmt-playwrighttesting-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-playwrighttesting_1.0.1/sdk/playwrighttesting/azure-mgmt-playwrighttesting/) |\n| Resource Management - Policy Insights | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-policyinsights/1.0.0)<br>PyPI [1.1.0b5](https://pypi.org/project/azure-mgmt-policyinsights/1.1.0b5) | [docs](/python/api/overview/azure/mgmt-policyinsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-policyinsights_1.0.0/sdk/policyinsights/azure-mgmt-policyinsights/)<br>GitHub [1.1.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-policyinsights_1.1.0b5/sdk/policyinsights/azure-mgmt-policyinsights/) |\n| Resource Management - Portal | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-portal/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-portal/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-portal-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-portal_1.0.0/sdk/portal/azure-mgmt-portal/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-portal_1.1.0b1/sdk/portal/azure-mgmt-portal/) |\n| Resource Management - Portalservicescopilot | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-portalservicescopilot/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-portalservicescopilot-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-portalservicescopilot_1.0.0b1/sdk/portalservices/azure-mgmt-portalservicescopilot/) |\n| Resource Management - PostgreSQL | PyPI [10.1.1](https://pypi.org/project/azure-mgmt-rdbms/10.1.1)<br>PyPI [10.2.0b18](https://pypi.org/project/azure-mgmt-rdbms/10.2.0b18) | [docs](/python/api/overview/azure/mgmt-rdbms-readme) | GitHub [10.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-rdbms_10.1.1/sdk/rdbms/azure-mgmt-rdbms/)<br>GitHub [10.2.0b18](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-rdbms_10.2.0b18/sdk/rdbms/azure-mgmt-rdbms/) |\n| Resource Management - PostgreSQL  Flexible Servers | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-postgresqlflexibleservers/2.0.0)<br>PyPI [3.0.0b1](https://pypi.org/project/azure-mgmt-postgresqlflexibleservers/3.0.0b1) | [docs](/python/api/overview/azure/mgmt-postgresqlflexibleservers-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-postgresqlflexibleservers_2.0.0/sdk/postgresqlflexibleservers/azure-mgmt-postgresqlflexibleservers/)<br>GitHub [3.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-postgresqlflexibleservers_3.0.0b1/sdk/postgresqlflexibleservers/azure-mgmt-postgresqlflexibleservers/) |\n| Resource Management - Power BI Dedicated | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-powerbidedicated/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-powerbidedicated/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-powerbidedicated-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-powerbidedicated_1.0.0/sdk/powerbidedicated/azure-mgmt-powerbidedicated/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-powerbidedicated_1.1.0b1/sdk/powerbidedicated/azure-mgmt-powerbidedicated/) |\n| Resource Management - Private DNS | PyPI [1.2.0](https://pypi.org/project/azure-mgmt-privatedns/1.2.0) | [docs](/python/api/overview/azure/mgmt-privatedns-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-privatedns_1.2.0/sdk/network/azure-mgmt-privatedns/) |\n| Resource Management - Purestorageblock | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-purestorageblock/1.0.0) | [docs](/python/api/overview/azure/mgmt-purestorageblock-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-purestorageblock_1.0.0/sdk/purestorageblock/azure-mgmt-purestorageblock/) |\n| Resource Management - Purview | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-purview/1.0.0)<br>PyPI [1.1.0b2](https://pypi.org/project/azure-mgmt-purview/1.1.0b2) | [docs](/python/api/overview/azure/mgmt-purview-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-purview_1.0.0/sdk/purview/azure-mgmt-purview/)<br>GitHub [1.1.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-purview_1.1.0b2/sdk/purview/azure-mgmt-purview/) |\n| Resource Management - Quantum | PyPI [1.0.0b5](https://pypi.org/project/azure-mgmt-quantum/1.0.0b5) | [docs](/python/api/overview/azure/mgmt-quantum-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b5](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-quantum_1.0.0b5/sdk/quantum/azure-mgmt-quantum/) |\n| Resource Management - Qumulo | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-qumulo/2.0.0) | [docs](/python/api/overview/azure/mgmt-qumulo-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-qumulo_2.0.0/sdk/qumulo/azure-mgmt-qumulo/) |\n| Resource Management - Quota | PyPI [3.0.1](https://pypi.org/project/azure-mgmt-quota/3.0.1) | [docs](/python/api/overview/azure/mgmt-quota-readme) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-quota_3.0.1/sdk/quota/azure-mgmt-quota/) |\n| Resource Management - Recovery Services | PyPI [4.0.0](https://pypi.org/project/azure-mgmt-recoveryservices/4.0.0) | [docs](/python/api/overview/azure/mgmt-recoveryservices-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservices_4.0.0/sdk/recoveryservices/azure-mgmt-recoveryservices/) |\n| Resource Management - Recovery Services Backup | PyPI [10.0.0](https://pypi.org/project/azure-mgmt-recoveryservicesbackup/10.0.0)<br>PyPI [11.0.0b1](https://pypi.org/project/azure-mgmt-recoveryservicesbackup/11.0.0b1) | [docs](/python/api/overview/azure/mgmt-recoveryservicesbackup-readme) | GitHub [10.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicesbackup_10.0.0/sdk/recoveryservices/azure-mgmt-recoveryservicesbackup/)<br>GitHub [11.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicesbackup_11.0.0b1/sdk/recoveryservices/azure-mgmt-recoveryservicesbackup/) |\n| Resource Management - Recovery Services Data Replication | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-recoveryservicesdatareplication/1.0.0) | [docs](/python/api/overview/azure/mgmt-recoveryservicesdatareplication-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicesdatareplication_1.0.0/sdk/recoveryservicesdatareplication/azure-mgmt-recoveryservicesdatareplication/) |\n| Resource Management - Recovery Services Site Recovery | PyPI [1.3.0](https://pypi.org/project/azure-mgmt-recoveryservicessiterecovery/1.3.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-recoveryservicessiterecovery/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-recoveryservicessiterecovery-readme) | GitHub [1.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicessiterecovery_1.3.0/sdk/recoveryservices/azure-mgmt-recoveryservicessiterecovery/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicessiterecovery_2.0.0b1/sdk/recoveryservices/azure-mgmt-recoveryservicessiterecovery/) |\n| Resource Management - Recoveryservicesbackup-Passivestamp | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-recoveryservicesbackup-passivestamp/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-recoveryservicesbackup-passivestamp-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-recoveryservicesbackup-passivestamp_1.0.0b1/sdk/recoveryservices/azure-mgmt-recoveryservicesbackup-passivestamp/) |\n| Resource Management - Red Hat OpenShift | PyPI [3.0.0](https://pypi.org/project/azure-mgmt-redhatopenshift/3.0.0) | [docs](/python/api/overview/azure/mgmt-redhatopenshift-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-redhatopenshift_3.0.0/sdk/redhatopenshift/azure-mgmt-redhatopenshift/) |\n| Resource Management - Redis | PyPI [14.5.0](https://pypi.org/project/azure-mgmt-redis/14.5.0) | [docs](/python/api/overview/azure/mgmt-redis-readme) | GitHub [14.5.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-redis_14.5.0/sdk/redis/azure-mgmt-redis/) |\n| Resource Management - Redis Enterprise | PyPI [3.1.0](https://pypi.org/project/azure-mgmt-redisenterprise/3.1.0)<br>PyPI [4.0.0b1](https://pypi.org/project/azure-mgmt-redisenterprise/4.0.0b1) | [docs](/python/api/overview/azure/mgmt-redisenterprise-readme) | GitHub [3.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-redisenterprise_3.1.0/sdk/redisenterprise/azure-mgmt-redisenterprise/)<br>GitHub [4.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-redisenterprise_4.0.0b1/sdk/redisenterprise/azure-mgmt-redisenterprise/) |\n| Resource Management - Region Move | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-regionmove/1.0.0b1) |  | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-regionmove_1.0.0b1/sdk/regionmove/azure-mgmt-regionmove/) |\n| Resource Management - Relay | PyPI [1.1.1](https://pypi.org/project/azure-mgmt-relay/1.1.1)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-relay/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-relay-readme) | GitHub [1.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-relay_1.1.1/sdk/relay/azure-mgmt-relay/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-relay_2.0.0b1/sdk/relay/azure-mgmt-relay/) |\n| Resource Management - Reservations | PyPI [2.3.0](https://pypi.org/project/azure-mgmt-reservations/2.3.0) | [docs](/python/api/overview/azure/mgmt-reservations-readme) | GitHub [2.3.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-reservations_2.3.0/sdk/reservations/azure-mgmt-reservations/) |\n| Resource Management - Resource Connector | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-resourceconnector/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-resourceconnector/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-resourceconnector-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourceconnector_1.0.0/sdk/resourceconnector/azure-mgmt-resourceconnector/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourceconnector_2.0.0b1/sdk/resourceconnector/azure-mgmt-resourceconnector/) |\n| Resource Management - Resource Graph | PyPI [8.0.1](https://pypi.org/project/azure-mgmt-resourcegraph/8.0.1)<br>PyPI [8.1.0b3](https://pypi.org/project/azure-mgmt-resourcegraph/8.1.0b3) | [docs](/python/api/overview/azure/mgmt-resourcegraph-readme) | GitHub [8.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourcegraph_8.0.1/sdk/resources/azure-mgmt-resourcegraph/)<br>GitHub [8.1.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourcegraph_8.1.0b3/sdk/resources/azure-mgmt-resourcegraph/) |\n| Resource Management - Resource Health | PyPI [1.0.0b6](https://pypi.org/project/azure-mgmt-resourcehealth/1.0.0b6) | [docs](/python/api/overview/azure/mgmt-resourcehealth-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b6](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourcehealth_1.0.0b6/sdk/resourcehealth/azure-mgmt-resourcehealth/) |\n| Resource Management - Resource Mover | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-resourcemover/1.1.0) | [docs](/python/api/overview/azure/mgmt-resourcemover-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resourcemover_1.1.0/sdk/resourcemover/azure-mgmt-resourcemover/) |\n| Resource Management - Resource-Bicep | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-bicep/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-bicep-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-bicep_1.0.0b1/sdk/resources/azure-mgmt-resource-bicep/) |\n| Resource Management - Resource-Changes | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-changes/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-changes-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-changes_1.0.0b1/sdk/resources/azure-mgmt-resource-changes/) |\n| Resource Management - Resource-Databoundaries | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-databoundaries/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-databoundaries-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-databoundaries_1.0.0b1/sdk/resources/azure-mgmt-resource-databoundaries/) |\n| Resource Management - Resource-Deployments | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-deployments/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-deployments-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-deployments_1.0.0b1/sdk/resources/azure-mgmt-resource-deployments/) |\n| Resource Management - Resource-Deploymentscripts | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-deploymentscripts/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-deploymentscripts-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-deploymentscripts_1.0.0b1/sdk/resources/azure-mgmt-resource-deploymentscripts/) |\n| Resource Management - Resource-Deploymentstacks | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-resource-deploymentstacks/1.0.0) | [docs](/python/api/overview/azure/mgmt-resource-deploymentstacks-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-deploymentstacks_1.0.0/sdk/resources/azure-mgmt-resource-deploymentstacks/) |\n| Resource Management - Resource-Features | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-features/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-features-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-features_1.0.0b1/sdk/resources/azure-mgmt-resource-features/) |\n| Resource Management - Resource-Links | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-links/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-links-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-links_1.0.0b1/sdk/resources/azure-mgmt-resource-links/) |\n| Resource Management - Resource-Locks | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-locks/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-locks-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-locks_1.0.0b1/sdk/resources/azure-mgmt-resource-locks/) |\n| Resource Management - Resource-Managedapplications | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-managedapplications/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-managedapplications-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-managedapplications_1.0.0b1/sdk/resources/azure-mgmt-resource-managedapplications/) |\n| Resource Management - Resource-Policy | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-resource-policy/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-resource-policy-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-policy_1.0.0b2/sdk/resources/azure-mgmt-resource-policy/) |\n| Resource Management - Resource-Privatelinks | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-privatelinks/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-privatelinks-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-privatelinks_1.0.0b1/sdk/resources/azure-mgmt-resource-privatelinks/) |\n| Resource Management - Resource-Subscriptions | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-subscriptions/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-subscriptions-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-subscriptions_1.0.0b1/sdk/resources/azure-mgmt-resource-subscriptions/) |\n| Resource Management - Resource-Templatespecs | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-resource-templatespecs/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-resource-templatespecs-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource-templatespecs_1.0.0b1/sdk/resources/azure-mgmt-resource-templatespecs/) |\n| Resource Management - Resources | PyPI [25.0.0](https://pypi.org/project/azure-mgmt-resource/25.0.0) | [docs](/python/api/overview/azure/mgmt-resource-readme) | GitHub [25.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-resource_25.0.0/sdk/resources/azure-mgmt-resource/) |\n| Resource Management - Scheduler | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-scheduler/7.0.0) | [docs](/python/api/overview/azure/mgmt-scheduler-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-scheduler_2.0.0/azure-mgmt-scheduler/) |\n| Resource Management - Scvmm | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-scvmm/1.0.0) | [docs](/python/api/overview/azure/mgmt-scvmm-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-scvmm_1.0.0/sdk/scvmm/azure-mgmt-scvmm/) |\n| Resource Management - Secretsstoreextension | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-secretsstoreextension/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-secretsstoreextension-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-secretsstoreextension_1.0.0b1/sdk/secretsstoreextension/azure-mgmt-secretsstoreextension/) |\n| Resource Management - Security | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-security/7.0.0)<br>PyPI [8.0.0b1](https://pypi.org/project/azure-mgmt-security/8.0.0b1) | [docs](/python/api/overview/azure/mgmt-security-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-security_7.0.0/sdk/security/azure-mgmt-security/)<br>GitHub [8.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-security_8.0.0b1/sdk/security/azure-mgmt-security/) |\n| Resource Management - Security Insights | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-securityinsight/1.0.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-securityinsight/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-securityinsight-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-securityinsight_1.0.0/sdk/securityinsight/azure-mgmt-securityinsight/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-securityinsight_2.0.0b2/sdk/securityinsight/azure-mgmt-securityinsight/) |\n| Resource Management - Self Help | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-selfhelp/1.0.0)<br>PyPI [2.0.0b4](https://pypi.org/project/azure-mgmt-selfhelp/2.0.0b4) | [docs](/python/api/overview/azure/mgmt-selfhelp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-selfhelp_1.0.0/sdk/selfhelp/azure-mgmt-selfhelp/)<br>GitHub [2.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-selfhelp_2.0.0b4/sdk/selfhelp/azure-mgmt-selfhelp/) |\n| Resource Management - Serial Console | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-serialconsole/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-serialconsole/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-serialconsole-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-serialconsole_1.0.0/sdk/serialconsole/azure-mgmt-serialconsole/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-serialconsole_1.1.0b1/sdk/serialconsole/azure-mgmt-serialconsole/) |\n| Resource Management - Server Management | PyPI [2.0.1](https://pypi.org/project/azure-mgmt-servermanager/2.0.1) |  | GitHub [2.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servermanager_2.0.0/azure-mgmt-servermanager/) |\n| Resource Management - Service Bus | PyPI [9.0.0](https://pypi.org/project/azure-mgmt-servicebus/9.0.0)<br>PyPI [10.0.0b1](https://pypi.org/project/azure-mgmt-servicebus/10.0.0b1) | [docs](/python/api/overview/azure/mgmt-servicebus-readme) | GitHub [9.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicebus_9.0.0/sdk/servicebus/azure-mgmt-servicebus/)<br>GitHub [10.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicebus_10.0.0b1/sdk/servicebus/azure-mgmt-servicebus/) |\n| Resource Management - Service Fabric | PyPI [2.1.0](https://pypi.org/project/azure-mgmt-servicefabric/2.1.0)<br>PyPI [2.2.0b1](https://pypi.org/project/azure-mgmt-servicefabric/2.2.0b1) | [docs](/python/api/overview/azure/mgmt-servicefabric-readme) | GitHub [2.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicefabric_2.1.0/sdk/servicefabric/azure-mgmt-servicefabric/)<br>GitHub [2.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicefabric_2.2.0b1/sdk/servicefabric/azure-mgmt-servicefabric/) |\n| Resource Management - Service Fabric Managed Clusters | PyPI [3.0.0](https://pypi.org/project/azure-mgmt-servicefabricmanagedclusters/3.0.0) | [docs](/python/api/overview/azure/mgmt-servicefabricmanagedclusters-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicefabricmanagedclusters_3.0.0/sdk/servicefabricmanagedclusters/azure-mgmt-servicefabricmanagedclusters/) |\n| Resource Management - Service Linker | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-servicelinker/1.1.0)<br>PyPI [1.2.0b3](https://pypi.org/project/azure-mgmt-servicelinker/1.2.0b3) | [docs](/python/api/overview/azure/mgmt-servicelinker-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicelinker_1.1.0/sdk/servicelinker/azure-mgmt-servicelinker/)<br>GitHub [1.2.0b3](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicelinker_1.2.0b3/sdk/servicelinker/azure-mgmt-servicelinker/) |\n| Resource Management - Service Networking | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-servicenetworking/2.0.0)<br>PyPI [2.1.0b1](https://pypi.org/project/azure-mgmt-servicenetworking/2.1.0b1) | [docs](/python/api/overview/azure/mgmt-servicenetworking-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicenetworking_2.0.0/sdk/servicenetworking/azure-mgmt-servicenetworking/)<br>GitHub [2.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicenetworking_2.1.0b1/sdk/servicenetworking/azure-mgmt-servicenetworking/) |\n| Resource Management - SignalR | PyPI [1.2.0](https://pypi.org/project/azure-mgmt-signalr/1.2.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-signalr/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-signalr-readme) | GitHub [1.2.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-signalr_1.2.0/sdk/signalr/azure-mgmt-signalr/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-signalr_2.0.0b2/sdk/signalr/azure-mgmt-signalr/) |\n| Resource Management - Sitemanager | PyPI [1.0.1](https://pypi.org/project/azure-mgmt-sitemanager/1.0.1) | [docs](/python/api/overview/azure/mgmt-sitemanager-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-sitemanager_1.0.1/sdk/sitemanager/azure-mgmt-sitemanager/) |\n| Resource Management - Sphere | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-sphere/1.0.0) | [docs](/python/api/overview/azure/mgmt-sphere-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-sphere_1.0.0/sdk/sphere/azure-mgmt-sphere/) |\n| Resource Management - Spring App Discovery | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-springappdiscovery/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-springappdiscovery-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-springappdiscovery_1.0.0b1/sdk/springappdiscovery/azure-mgmt-springappdiscovery/) |\n| Resource Management - SQL | PyPI [3.0.1](https://pypi.org/project/azure-mgmt-sql/3.0.1)<br>PyPI [4.0.0b24](https://pypi.org/project/azure-mgmt-sql/4.0.0b24) | [docs](/python/api/overview/azure/mgmt-sql-readme) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-sql_3.0.1/sdk/sql/azure-mgmt-sql/)<br>GitHub [4.0.0b24](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-sql_4.0.0b24/sdk/sql/azure-mgmt-sql/) |\n| Resource Management - SQL Virtual Machine | PyPI [1.0.0b6](https://pypi.org/project/azure-mgmt-sqlvirtualmachine/1.0.0b6) | [docs](/python/api/overview/azure/mgmt-sqlvirtualmachine-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b6](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-sqlvirtualmachine_1.0.0b6/sdk/sql/azure-mgmt-sqlvirtualmachine/) |\n| Resource Management - Standby Pool | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-standbypool/2.0.0) | [docs](/python/api/overview/azure/mgmt-standbypool-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-standbypool_2.0.0/sdk/standbypool/azure-mgmt-standbypool/) |\n| Resource Management - Storage | PyPI [24.0.1](https://pypi.org/project/azure-mgmt-storage/24.0.1) | [docs](/python/api/overview/azure/mgmt-storage-readme) | GitHub [24.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storage_24.0.1/sdk/storage/azure-mgmt-storage/) |\n| Resource Management - Storage Actions | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-storageactions/1.0.0) | [docs](/python/api/overview/azure/mgmt-storageactions-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storageactions_1.0.0/sdk/storageactions/azure-mgmt-storageactions/) |\n| Resource Management - Storage Cache | PyPI [3.0.1](https://pypi.org/project/azure-mgmt-storagecache/3.0.1) | [docs](/python/api/overview/azure/mgmt-storagecache-readme) | GitHub [3.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagecache_3.0.1/sdk/storage/azure-mgmt-storagecache/) |\n| Resource Management - Storage Import/Export | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-storageimportexport/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-storageimportexport-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storageimportexport_1.0.0b2/sdk/storage/azure-mgmt-storageimportexport/) |\n| Resource Management - Storage Mover | PyPI [3.0.0](https://pypi.org/project/azure-mgmt-storagemover/3.0.0) | [docs](/python/api/overview/azure/mgmt-storagemover-readme) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagemover_3.0.0/sdk/storagemover/azure-mgmt-storagemover/) |\n| Resource Management - Storage Pool | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-storagepool/1.0.0)<br>PyPI [1.1.0b1](https://pypi.org/project/azure-mgmt-storagepool/1.1.0b1) | [docs](/python/api/overview/azure/mgmt-storagepool-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagepool_1.0.0/sdk/storagepool/azure-mgmt-storagepool/)<br>GitHub [1.1.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagepool_1.1.0b1/sdk/storagepool/azure-mgmt-storagepool/) |\n| Resource Management - Storage Sync | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-storagesync/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-storagesync/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-storagesync-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagesync_1.0.0/sdk/storage/azure-mgmt-storagesync/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagesync_2.0.0b1/sdk/storage/azure-mgmt-storagesync/) |\n| Resource Management - Storagediscovery | PyPI [1.0.1](https://pypi.org/project/azure-mgmt-storagediscovery/1.0.1) | [docs](/python/api/overview/azure/mgmt-storagediscovery-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-storagediscovery_1.0.1/sdk/storagediscovery/azure-mgmt-storagediscovery/) |\n| Resource Management - Stream Analytics | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-streamanalytics/1.0.0)<br>PyPI [2.0.0b2](https://pypi.org/project/azure-mgmt-streamanalytics/2.0.0b2) | [docs](/python/api/overview/azure/mgmt-streamanalytics-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-streamanalytics_1.0.0/sdk/streamanalytics/azure-mgmt-streamanalytics/)<br>GitHub [2.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-streamanalytics_2.0.0b2/sdk/streamanalytics/azure-mgmt-streamanalytics/) |\n| Resource Management - Subscriptions | PyPI [3.1.1](https://pypi.org/project/azure-mgmt-subscription/3.1.1)<br>PyPI [3.2.0b1](https://pypi.org/project/azure-mgmt-subscription/3.2.0b1) | [docs](/python/api/overview/azure/mgmt-subscription-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-subscription_3.1.1/sdk/subscription/azure-mgmt-subscription/)<br>GitHub [3.2.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-subscription_3.2.0b1/sdk/subscription/azure-mgmt-subscription/) |\n| Resource Management - Support | PyPI [7.0.0](https://pypi.org/project/azure-mgmt-support/7.0.0) | [docs](/python/api/overview/azure/mgmt-support-readme) | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-support_7.0.0/sdk/support/azure-mgmt-support/) |\n| Resource Management - Synapse | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-synapse/2.0.0)<br>PyPI [2.1.0b7](https://pypi.org/project/azure-mgmt-synapse/2.1.0b7) | [docs](/python/api/overview/azure/mgmt-synapse-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-synapse_2.0.0/sdk/synapse/azure-mgmt-synapse/)<br>GitHub [2.1.0b7](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-synapse_2.1.0b7/sdk/synapse/azure-mgmt-synapse/) |\n| Resource Management - Terraform | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-terraform/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-terraform-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-terraform_1.0.0b1/sdk/terraform/azure-mgmt-terraform/) |\n| Resource Management - Test Base | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-testbase/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-testbase-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-testbase_1.0.0b2/sdk/testbase/azure-mgmt-testbase/) |\n| Resource Management - Time Series Insights | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-timeseriesinsights/1.0.0)<br>PyPI [2.0.0b1](https://pypi.org/project/azure-mgmt-timeseriesinsights/2.0.0b1) | [docs](/python/api/overview/azure/mgmt-timeseriesinsights-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-timeseriesinsights_1.0.0/sdk/timeseriesinsights/azure-mgmt-timeseriesinsights/)<br>GitHub [2.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-timeseriesinsights_2.0.0b1/sdk/timeseriesinsights/azure-mgmt-timeseriesinsights/) |\n| Resource Management - Traffic Manager | PyPI [1.1.0](https://pypi.org/project/azure-mgmt-trafficmanager/1.1.0) | [docs](/python/api/overview/azure/mgmt-trafficmanager-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-trafficmanager_1.1.0/sdk/trafficmanager/azure-mgmt-trafficmanager/) |\n| Resource Management - Trusted Signing | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-trustedsigning/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-trustedsigning-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-trustedsigning_1.0.0b1/sdk/trustedsigning/azure-mgmt-trustedsigning/) |\n| Resource Management - VMware Solution by CloudSimple | PyPI [1.0.0b2](https://pypi.org/project/azure-mgmt-vmwarecloudsimple/1.0.0b2) | [docs](/python/api/overview/azure/mgmt-vmwarecloudsimple-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b2](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-vmwarecloudsimple_1.0.0b2/sdk/compute/azure-mgmt-vmwarecloudsimple/) |\n| Resource Management - Voice Services | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-voiceservices/1.0.0) | [docs](/python/api/overview/azure/mgmt-voiceservices-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-voiceservices_1.0.0/sdk/voiceservices/azure-mgmt-voiceservices/) |\n| Resource Management - Web PubSub | PyPI [2.0.0](https://pypi.org/project/azure-mgmt-webpubsub/2.0.0) | [docs](/python/api/overview/azure/mgmt-webpubsub-readme) | GitHub [2.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-webpubsub_2.0.0/sdk/webpubsub/azure-mgmt-webpubsub/) |\n| Resource Management - Weights & Biases | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-weightsandbiases/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-weightsandbiases-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-weightsandbiases_1.0.0b1/sdk/weightsandbiases/azure-mgmt-weightsandbiases/) |\n| Resource Management - Workload Monitor | PyPI [1.0.0b4](https://pypi.org/project/azure-mgmt-workloadmonitor/1.0.0b4) | [docs](/python/api/overview/azure/mgmt-workloadmonitor-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b4](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-workloadmonitor_1.0.0b4/sdk/workloadmonitor/azure-mgmt-workloadmonitor/) |\n| Resource Management - Workloadorchestration | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-workloadorchestration/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-workloadorchestration-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-workloadorchestration_1.0.0b1/sdk/workloadorchestration/azure-mgmt-workloadorchestration/) |\n| Resource Management - Workloads | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-workloads/1.0.0) | [docs](/python/api/overview/azure/mgmt-workloads-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-workloads_1.0.0/sdk/workloads/azure-mgmt-workloads/) |\n| Resource Management - Workloads SAP Virtual Instance | PyPI [1.0.0](https://pypi.org/project/azure-mgmt-workloadssapvirtualinstance/1.0.0) | [docs](/python/api/overview/azure/mgmt-workloadssapvirtualinstance-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-workloadssapvirtualinstance_1.0.0/sdk/workloads/azure-mgmt-workloadssapvirtualinstance/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-appnetwork/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-appnetwork-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-appnetwork_1.0.0b1/sdk/appnetwork/azure-mgmt-appnetwork/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-certificateregistration/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-certificateregistration-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-certificateregistration_1.0.0b1/sdk/certificateregistration/azure-mgmt-certificateregistration/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-containerregistrytasks/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-containerregistrytasks-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-containerregistrytasks_1.0.0b1/sdk/containerregistry/azure-mgmt-containerregistrytasks/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-domainregistration/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-domainregistration-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-domainregistration_1.0.0b1/sdk/domainregistration/azure-mgmt-domainregistration/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-horizondb/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-horizondb-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-horizondb_1.0.0b1/sdk/horizondb/azure-mgmt-horizondb/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-monitorslis/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-monitorslis-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-monitorslis_1.0.0b1/sdk/monitor/azure-mgmt-monitorslis/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-relationships/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-relationships-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-relationships_1.0.0b1/sdk/relationships/azure-mgmt-relationships/) |\n| unknown | PyPI [1.0.0b1](https://pypi.org/project/azure-mgmt-servicegroups/1.0.0b1) | [docs](/python/api/overview/azure/mgmt-servicegroups-readme?view=azure-python-preview&amp;preserve-view=true) | GitHub [1.0.0b1](https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-servicegroups_1.0.0b1/sdk/servicegroups/azure-mgmt-servicegroups/) |\n"
  },
  {
    "path": "articles/includes/quickstarts-free-trial-note.md",
    "content": "If you don't have an [Azure subscription](/azure/developer/intro/azure-developer-billing#what-is-an-azure-subscription), create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n"
  },
  {
    "path": "articles/includes/rust-all.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| Core | crate [0.35.0](https://crates.io/crates/azure_core/0.35.0) |  | GitHub [0.35.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_core@0.35.0/sdk/core/azure_core) |\n| Core - AMQP | crate [0.14.0](https://crates.io/crates/azure_core_amqp/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_core_amqp@0.14.0/sdk/core/azure_core_amqp) |\n| Core - Macros | crate [0.8.0](https://crates.io/crates/azure_core_macros/0.8.0) |  | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_core_macros@0.8.0/sdk/core/azure_core_macros) |\n| Core - OpenTelemetry | crate [0.9.0](https://crates.io/crates/azure_core_opentelemetry/0.9.0) |  | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_core_opentelemetry@0.9.0/sdk/core/azure_core_opentelemetry) |\n| Cosmos DB | crate [0.33.0](https://crates.io/crates/azure_data_cosmos/0.33.0) |  | GitHub [0.33.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_data_cosmos@0.33.0/sdk/cosmos/azure_data_cosmos) |\n| Cosmos DB Client Driver | crate [0.2.0](https://crates.io/crates/azure_data_cosmos_driver/0.2.0) |  | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_data_cosmos_driver@0.2.0/sdk/cosmos/azure_data_cosmos_driver) |\n| Cosmos DB SDK Macros | crate [0.1.0](https://crates.io/crates/azure_data_cosmos_macros/0.1.0) |  | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_data_cosmos_macros@0.1.0/sdk/cosmos/azure_data_cosmos_macros) |\n| Event Hubs | crate [0.14.0](https://crates.io/crates/azure_messaging_eventhubs/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_messaging_eventhubs@0.14.0/sdk/eventhubs/azure_messaging_eventhubs) |\n| EventHubs Checkpoint Store for Azure Blob Storage | crate [0.8.0](https://crates.io/crates/azure_messaging_eventhubs_checkpointstore_blob/0.8.0) |  | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_messaging_eventhubs_checkpointstore_blob@0.8.0/sdk/eventhubs/azure_messaging_eventhubs_checkpointstore_blob) |\n| Identity | crate [0.35.0](https://crates.io/crates/azure_identity/0.35.0) |  | GitHub [0.35.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_identity@0.35.0/sdk/identity/azure_identity) |\n| Key Vault - Certificates | crate [0.13.0](https://crates.io/crates/azure_security_keyvault_certificates/0.13.0) |  | GitHub [0.13.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_security_keyvault_certificates@0.13.0/sdk/keyvault/azure_security_keyvault_certificates) |\n| Key Vault - Keys | crate [0.14.0](https://crates.io/crates/azure_security_keyvault_keys/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_security_keyvault_keys@0.14.0/sdk/keyvault/azure_security_keyvault_keys) |\n| Key Vault - Secrets | crate [0.14.0](https://crates.io/crates/azure_security_keyvault_secrets/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_security_keyvault_secrets@0.14.0/sdk/keyvault/azure_security_keyvault_secrets) |\n| Storage - Blobs | crate [0.12.0](https://crates.io/crates/azure_storage_blob/0.12.0) |  | GitHub [0.12.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_storage_blob@0.12.0/sdk/storage/azure_storage_blob) |\n| TypeSpec Client Core | crate [0.14.0](https://crates.io/crates/typespec_client_core/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/typespec_client_core@0.14.0/sdk/core/typespec_client_core) |\n| TypeSpec Core | crate [0.14.0](https://crates.io/crates/typespec/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/typespec@0.14.0/sdk/core/typespec) |\n| TypeSpec Core Macros | crate [0.13.0](https://crates.io/crates/typespec_macros/0.13.0) |  | GitHub [0.13.0](https://github.com/Azure/azure-sdk-for-rust/tree/typespec_macros@0.13.0/sdk/core/typespec_macros) |\n"
  },
  {
    "path": "articles/includes/rust-new.md",
    "content": "| Name | Package | Docs | Source |\n| ---- | ------- | ---- | ------ |\n| Core | crate [0.35.0](https://crates.io/crates/azure_core/0.35.0) |  | GitHub [0.35.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_core@0.35.0/sdk/core/azure_core) |\n| Core - AMQP | crate [0.14.0](https://crates.io/crates/azure_core_amqp/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_core_amqp@0.14.0/sdk/core/azure_core_amqp) |\n| Core - Macros | crate [0.8.0](https://crates.io/crates/azure_core_macros/0.8.0) |  | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_core_macros@0.8.0/sdk/core/azure_core_macros) |\n| Core - OpenTelemetry | crate [0.9.0](https://crates.io/crates/azure_core_opentelemetry/0.9.0) |  | GitHub [0.9.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_core_opentelemetry@0.9.0/sdk/core/azure_core_opentelemetry) |\n| Cosmos DB | crate [0.33.0](https://crates.io/crates/azure_data_cosmos/0.33.0) |  | GitHub [0.33.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_data_cosmos@0.33.0/sdk/cosmos/azure_data_cosmos) |\n| Cosmos DB Client Driver | crate [0.2.0](https://crates.io/crates/azure_data_cosmos_driver/0.2.0) |  | GitHub [0.2.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_data_cosmos_driver@0.2.0/sdk/cosmos/azure_data_cosmos_driver) |\n| Cosmos DB SDK Macros | crate [0.1.0](https://crates.io/crates/azure_data_cosmos_macros/0.1.0) |  | GitHub [0.1.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_data_cosmos_macros@0.1.0/sdk/cosmos/azure_data_cosmos_macros) |\n| Event Hubs | crate [0.14.0](https://crates.io/crates/azure_messaging_eventhubs/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_messaging_eventhubs@0.14.0/sdk/eventhubs/azure_messaging_eventhubs) |\n| EventHubs Checkpoint Store for Azure Blob Storage | crate [0.8.0](https://crates.io/crates/azure_messaging_eventhubs_checkpointstore_blob/0.8.0) |  | GitHub [0.8.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_messaging_eventhubs_checkpointstore_blob@0.8.0/sdk/eventhubs/azure_messaging_eventhubs_checkpointstore_blob) |\n| Identity | crate [0.35.0](https://crates.io/crates/azure_identity/0.35.0) |  | GitHub [0.35.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_identity@0.35.0/sdk/identity/azure_identity) |\n| Key Vault - Certificates | crate [0.13.0](https://crates.io/crates/azure_security_keyvault_certificates/0.13.0) |  | GitHub [0.13.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_security_keyvault_certificates@0.13.0/sdk/keyvault/azure_security_keyvault_certificates) |\n| Key Vault - Keys | crate [0.14.0](https://crates.io/crates/azure_security_keyvault_keys/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_security_keyvault_keys@0.14.0/sdk/keyvault/azure_security_keyvault_keys) |\n| Key Vault - Secrets | crate [0.14.0](https://crates.io/crates/azure_security_keyvault_secrets/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_security_keyvault_secrets@0.14.0/sdk/keyvault/azure_security_keyvault_secrets) |\n| Storage - Blobs | crate [0.12.0](https://crates.io/crates/azure_storage_blob/0.12.0) |  | GitHub [0.12.0](https://github.com/Azure/azure-sdk-for-rust/tree/azure_storage_blob@0.12.0/sdk/storage/azure_storage_blob) |\n| TypeSpec Client Core | crate [0.14.0](https://crates.io/crates/typespec_client_core/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/typespec_client_core@0.14.0/sdk/core/typespec_client_core) |\n| TypeSpec Core | crate [0.14.0](https://crates.io/crates/typespec/0.14.0) |  | GitHub [0.14.0](https://github.com/Azure/azure-sdk-for-rust/tree/typespec@0.14.0/sdk/core/typespec) |\n| TypeSpec Core Macros | crate [0.13.0](https://crates.io/crates/typespec_macros/0.13.0) |  | GitHub [0.13.0](https://github.com/Azure/azure-sdk-for-rust/tree/typespec_macros@0.13.0/sdk/core/typespec_macros) |\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-local-dev-group-to-role-azure-portal-1.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nLocate the resource group for your application by searching for the resource group name using the search box at the top of the Azure portal.<br>\n<br>\nNavigate to your resource group by selecting the resource group name under the *Resource Groups* heading in the dialog box.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-local-dev-group-to-role-azure-portal-2.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the page for the resource group, select *Access control (IAM)* from the left-hand menu.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-local-dev-group-to-role-azure-portal-3.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the *Access control (IAM)* page:\n\n1. Select the *Role assignments* tab.\n1. Select *+ Add* from the top menu and then *Add role assignment* from the resulting drop-down menu.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-local-dev-group-to-role-azure-portal-4.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe *Add role assignment* page lists all of the roles that can be assigned for the resource group.\n\n1. Use the search box to filter the list to a more manageable size. This example shows how to filter for Storage Blob roles.\n1. Select the role that you want to assign.\n<br>\nSelect *Next* to go to the next screen.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-local-dev-group-to-role-azure-portal-5.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe next *Add role assignment* page allows you to specify what user to assign the role to.\n\n1. Select *User, group, or service principal* under *Assign access to*.\n1. Select *+ Select members* under *Members*\n\nA dialog box opens on the right-hand side of the Azure portal."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-local-dev-group-to-role-azure-portal-6.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nIn the *Select members* dialog:\n\n1. The *Select* text box can be used to filter the list of users and groups in your subscription. If needed, type the first few characters of the local development Microsoft Entra group you created for the app.\n1. Select the local development Microsoft Entra group associated with your application.\n\nSelect *Select* at the bottom of the dialog to continue.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-local-dev-group-to-role-azure-portal-7.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe Microsoft Entra group shows as selected on the *Add role assignment* screen.<br>\n<br>\nSelect *Review + assign* to go to the final page and then *Review + assign* again to complete the process.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-managed-identity-to-role-azure-portal-1.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nLocate the resource group for your application by searching for the resource group name using the search box at the top of the Azure portal.<br>\n<br>\nNavigate to your resource group by selecting the resource group name under the *Resource Groups* heading in the dialog box.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-managed-identity-to-role-azure-portal-2.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the page for the resource group, select *Access control (IAM)* from the left-hand menu.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-managed-identity-to-role-azure-portal-3.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the *Access control (IAM)* page:\n\n1. Select the *Role assignments* tab.\n1. Select *+ Add* from the top menu and then *Add role assignment* from the resulting drop-down menu."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-managed-identity-to-role-azure-portal-4.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe *Add role assignment* page lists all of the roles that can be assigned for the resource group.\n\n1. Use the search box to filter the list to a more manageable size. This example shows how to filter for Storage Blob roles.\n1. Select the role that you want to assign.\n<br>\nSelect *Next* to go to the next screen.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-managed-identity-to-role-azure-portal-5.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe next *Add role assignment* page allows you to specify what user to assign the role to.\n\n1. Select *Managed identity* under *Assign access to*.\n1. Select *+ Select members* under *Members*\n\nA dialog box opens on the right-hand side of the Azure portal.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-managed-identity-to-role-azure-portal-6.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nIn the *Select managed identities* dialog:\n\n1. The *Managed identity* dropdown and *Select* text box can be used to filter the list of managed identities in your subscription.  In this example by selecting *App Service*, only managed identities associated with an App Service are displayed.\n1. Select the managed identity for the Azure resource hosting your application.\n\nChoose *Select* at the bottom of the dialog to continue.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-managed-identity-to-role-azure-portal-7.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe managed identity shows as selected on the *Add role assignment* screen.<br>\n<br>\nSelect *Review + assign* to go to the final page and then *Review + assign* again to complete the process.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-1.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nLocate the resource group for your application by searching for the resource group name using the search box at the top of the Azure portal.<br>\n<br>\nNavigate to your resource group by selecting the resource group name under the *Resource Groups* heading in the dialog box.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-2.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the page for the resource group, select *Access control (IAM)* from the left-hand menu.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-3.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the *Access control (IAM)* page:\n\n1. Select the *Role assignments* tab.\n1. Select *+ Add* from the top menu and then *Add role assignment* from the resulting drop-down menu.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-4.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe *Add role assignment* page lists all of the roles that can be assigned for the resource group.\n\n1. Use the search box to filter the list to a more manageable size. This example shows how to filter for Storage Blob roles.\n1. Select the role that you want to assign.\n<br>\nSelect *Next* to go to the next screen.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-5.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe next *Add role assignment* page allows you to specify what user to assign the role to.\n\n1. Select *User, group, or service principal* under *Assign access to*.\n1. Select *+ Select members* under *Members*\n\nA dialog box opens on the right-hand side of the Azure portal."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-6.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nIn the *Select members* dialog:\n\n1. The *Select* text box can be used to filter the list of users and groups in your subscription. If needed, type the first few characters of the service principal you created for the app to filter the list.\n1. Select the service principal associated with your application.\n\nSelect *Select* at the bottom of the dialog to continue.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/assign-service-principal-to-role-azure-portal-7.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe service principal shows as selected on the *Add role assignment* screen.<br>\n<br>\nSelect *Review + assign* to go to the final page and then *Review + assign* again to complete the process."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/enable-managed-identity-azure-cli-2.md",
    "content": "---\nms.topic: include\nms.custom: devx-track-azurecli\nms.date: 08/20/2024\n---\n#### [Azure Container Apps](#tab/azure-container-app)\n\n```azurecli\naz containerapp identity assign \\\n    --resource-group <resource-group-name> \\\n    --name <container-app-name> \\\n    --system-assigned\n```\n\n#### [Azure Virtual Machines](#tab/azure-virtual-machines)\n\n```azurecli\naz vm identity assign \\\n    --resource-group <resource-group-name> \\\n    -name <virtual-machine-name>\n```\n\n---\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/enable-managed-identity-azure-cli.md",
    "content": "---\nms.topic: include\nms.custom: devx-track-azurecli\nms.date: 03/31/2022\n---\n#### [Azure App Service](#tab/azure-app-service)\n\n```azurecli\naz webapp identity assign --resource-group <resource-group-name> --name <web-app-name>\n```\n\n#### [Azure Virtual Machines](#tab/azure-virtual-machines)\n\n```azurecli\naz vm identity assign --resource-group <resource-group-name> --name <virtual-machine-name>\n```\n\n---\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/enable-managed-identity-azure-portal-1.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nNavigate to the resource that hosts your application code in the Azure portal.<br>\n<br>\nFor example, you can type the name of your resource in the search box at the top of the page and navigate to it by selecting it in the dialog box."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/enable-managed-identity-azure-portal-2.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the page for your resource, select the *Identity* menu item from the left-hand menu.<br>\n<br>\nAll Azure resources capable of supporting managed identity will have an *Identity* menu item even though the layout of the menu may vary slightly."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/enable-managed-identity-azure-portal-3.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the *Identity* page:\n\n1. Change the *Status* slider to *On*.\n1. Select *Save*.\n\nA confirmation dialog verifies you want to enable managed identity for your service.  Answer *Yes* to enable managed identity for the Azure resource."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-accounts-app-ad-group-azure-portal-1.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nNavigate to the Microsoft Entra ID page in the Azure portal by typing *Microsoft Entra ID* into the search box at the top of the page and then selecting *Microsoft Entra ID* from under services.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-accounts-app-ad-group-azure-portal-2.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the *Microsoft Entra ID* page, select **Groups** from the left-hand menu.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-accounts-app-ad-group-azure-portal-3.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the *All groups* page, select **New group**."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-accounts-app-ad-group-azure-portal-4.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the **New Group** page:\n\n1. **Group type** &rarr; **Security**.\n1. **Group name** &rarr; A name for the security group, typically created from the application name.  It's also helpful to include a string like *local-dev* in the name of the group to indicate the purpose of the group.\n1. **Group description** &rarr; A description of the purpose of the group.\n1. Select the **No members selected** link under **Members** to add members to the group.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-accounts-app-ad-group-azure-portal-5.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the **Add members** dialog box:\n\n1. Use the search box to filter the list of user names in the list.\n1. Choose one or more users for local development for this app.  As you choose an object, the object moves to the *Selected items* list at the bottom of the dialog.\n1. When finished, choose the **Select** button.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-accounts-app-ad-group-azure-portal-6.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nBack on the **New group** page, select **Create** to create the group.<br>\n<br>\nThe group will be created and you will be taken back to the **All groups** page.  It may take up to 30 seconds for the group to appear and you may need to refresh the page due to caching in the Azure portal."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-ad-group-azure-portal-1.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nNavigate to the Microsoft Entra ID page in the Azure portal by typing *Microsoft Entra ID* into the search box at the top of the page and then selecting *Microsoft Entra ID* from under services.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-ad-group-azure-portal-2.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the *Microsoft Entra ID* page, select **Groups** from the left-hand menu.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-ad-group-azure-portal-3.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the *All groups* page, select **New group**."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-ad-group-azure-portal-4.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the **New Group** page:\n\n1. **Group type** &rarr; **Security**\n1. **Group name** &rarr; A name for the security group, typically created from the application name.  It is also helpful to include a string like *local-dev* in the name of the group to indicate the purpose of the group.\n1. **Group description** &rarr; A description of the purpose of the group.\n1. Select the **No members selected** link under **Members** to add members to the group.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-ad-group-azure-portal-5.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the **Add members** dialog box:\n\n1. Use the search box to filter the list of principal names in the list.\n1. Select the application service principals for local development for this app.  As objects are selected, they will be greyed out and move to the *Selected items* list at the bottom of the dialog.\n1. When finished, select the **Select** button."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-ad-group-azure-portal-6.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nBack on the **New group** page, select **Create** to create the group.<br>\n<br>\nThe group will be created and you will be taken back to the **All groups** page.  It may take up to 30 seconds for the group to appear and you may need to refresh the page due to caching in the Azure portal."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-registration-azure-portal-1.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nIn the Azure portal:\n\n   1. Enter *app registrations* in the search bar at the top of the Azure portal.\n   1. Select the item labeled **App registrations** under the **Services** heading on the menu that appears below the search bar."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-registration-azure-portal-2.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the **App registrations** page, select **+ New registration**."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-registration-azure-portal-3.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the **Register an application** page, fill out the form as follows.\n\n1. **Name** &rarr; Enter a name for the app registration in Azure.  It is recommended this name include the app name, the user the app registration is for, and an identifier like 'dev' to indicate this app registration is for use in local development.\n1. **Supported account types** &rarr; *Accounts in this organizational directory only*.\n\nSelect **Register** to register your app and create the application service principal.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-registration-azure-portal-4.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the App registration page for your app:\n\n1. **Application (client) ID** &rarr; This is the app ID the app will use to access Azure during local development. Copy this value to a temporary location in a text editor as you'll need it in a future step.\n1. **Directory (tenant) id** &rarr; This value will also be needed by your app when it authenticates to Azure.  Copy this value to a temporary location in a text editor it will also be needed it in a future step.\n1. **Client credentials** &rarr; You must set the client credentials for the app before your app can authenticate to Azure and use Azure services.  Select *Add a certificate or secret* to add credentials for your app.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-registration-azure-portal-5.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the Certificates & secrets page, select **+ New client secret**.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-registration-azure-portal-6.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe **Add a client secret** dialog will pop out from the right-hand side of the page.  In this dialog:\n\n1. **Description** &rarr; Enter a value of *Current*.\n1. **Expires** &rarr; Select a value of *24 months*.\n\nSelect **Add** to add the secret.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/local-dev-app-registration-azure-portal-7.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the *Certificates & secrets* page, you'll be shown the value of the client secret.<br>\n<br>\nCopy this value to a temporary location in a text editor as you'll need it in a future step.<br>\n<br>\n***IMPORTANT: This is the only time you will see this value.***  Once you leave or refresh this page, you won't be able to see this value again.  You may add more client secrets without invalidating this client secret, but you won't see this value again."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-1.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nIn the Azure portal:\n\n   1. Enter *app registrations* in the search bar at the top of the Azure portal.\n   1. Select the item labeled **App registrations** under the under **Services** heading on the menu that appears below the search bar.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-2.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the **App registrations** page, select **+ New registration**.\n"
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-3.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the **Register an application** page, fill out the form as follows.\n\n1. **Name** &rarr; Enter a name for the app registration in Azure.  It is recommended this name include the app name and environment (test, prod) the app registration is for.\n1. **Supported account types** &rarr; *Accounts in this organizational directory only*.\n\nSelect **Register** to register your app and create the application service principal."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-4.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the App registration page for your app:\n\n1. **Application (client) ID** &rarr; This is the app ID that your app will use to access Azure during local development. Copy this value to a temporary location in a text editor as you'll need it in a future step.\n1. **Directory (tenant) ID** &rarr; This value will also be needed by your app when it authenticates to Azure.  Copy this value to a temporary location in a text editor it will also be needed it in a future step.\n1. **Client credentials** &rarr; You must set the client credentials for the app before your app can authenticate to Azure and use Azure services.  Select *Add a certificate or secret* to add credentials for your app."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-5.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nOn the Certificates & secrets page, select **+ New client secret**."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-6.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe **Add a client secret** dialog will pop out from the right-hand side of the page.  In this dialog:\n\n1. **Description** &rarr; Enter a value of *Current*.\n1. **Expires** &rarr; Select a value of *24 months*.\n\nSelect **Add** to add the secret.<br>\n<br>\n***IMPORTANT: Set a reminder in your calendar prior to the expiration date of the secret.***  This way, you can add a new secret prior and update your apps prior to the expiration of this secret and avoid a service interruption in your app."
  },
  {
    "path": "articles/includes/sdk-auth-passwordless/on-premises-app-registration-azure-portal-7.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nThe *Certificates & secrets* page shows the value of the client secret.<br>\n<br>\nCopy this value to a temporary location in a text editor because you need it in a future step.<br>\n<br>\n***IMPORTANT: This is the only time you will see this value.***  Once you leave or refresh this page, you won't be able to see this value again.  You may add another client secret without invalidating this client secret, but you won't see this value again."
  },
  {
    "path": "articles/index.yml",
    "content": "### YamlMime:Hub\n\ntitle: Azure developer documentation\nsummary: Develop applications on Azure using Python, JavaScript, Java, .NET, Go, C++, and Rust. Use development tools like Visual Studio, Visual Studio Code, and Azure SDKs. Learn through quickstarts, tutorials, and toolkits for building applications, AI integration, deployment, and resource management.\nbrand: azure ## Used for color theming of icons and hero area\n\nmetadata:\n  title: Azure developer documentation\n  description: Develop applications on Azure using Python, JavaScript, Java, .NET, Go, C++, and Rust. Use development tools like Visual Studio, Visual Studio Code, and Azure SDKs. Learn through quickstarts, tutorials, and toolkits for building applications, AI integration, deployment, and resource management.\n  ms.topic: hub-page\n  ms.service: azure\n  ms.subservice: developer\n  author: Susan-Potter\n  ms.author: mcleans\n  manager: mcleans\n  ms.date: 10/14/2025\nhighlightedContent:\n  items:\n    - title: What's new in Azure developer documentation\n      itemType: whats-new\n      url: ./intro/whats-new.md\n    - title: Introduction to Azure for developers\n      itemType: get-started # controls the icon image and super-title text\n      url: intro/azure-developer-overview.md\n    - title: Develop AI apps for Azure\n      itemType: overview\n      url: ./ai/azure-ai-for-developers.md\n    - title: Passwordless authentication for Azure services\n      itemType: overview\n      url: /azure/developer/intro/passwordless-overview\nproductDirectory:\n  title: Azure SDKs\n  summary: Use your favorite programming languages to build applications on Azure.\n  items:\n    - title: .NET\n      summary: Learn to develop .NET apps using various Azure services.\n      imageSrc: /azure/media/index/net-logo.svg\n      links:\n        - text: Azure SDK for .NET\n          url: /dotnet/azure/sdk/azure-sdk-for-dotnet/\n        - text: API reference\n          url: /dotnet/api/overview/azure/\n        - text: Developer center\n          url: /dotnet/azure/\n    - title: Python\n      summary: Build secure, scalable cloud applications with Python libraries that interact with Azure services.\n      imageSrc: /media/logos/logo_python.svg\n      links:\n        - text: Azure SDK for Python\n          url: ./python/sdk/azure-sdk-overview.md\n        - text: API reference\n          url: /python/api/overview/azure/\n        - text: Developer center\n          url: ./python/index.yml\n    - title: JavaScript\n      summary: Learn to develop JavaScript apps using various Azure services.\n      imageSrc: /media/logos/logo_js.svg\n      links:\n        - text: Azure SDK for JavaScript\n          url: ./javascript/sdk/use-azure-sdk.md\n        - text: API reference\n          url: /javascript/api/overview/azure/\n        - text: Developer center\n          url: ./javascript/index.yml\n    - title: Java\n      summary: Learn how to get started developing apps for the cloud using Java.\n      imageSrc: /media/logos/logo_java.svg\n      links:\n        - text: Azure SDK for Java\n          url: ./java/sdk/index.yml\n        - text: API reference\n          url: /java/api/overview/azure/\n        - text: Developer center\n          url: ./java/index.yml\n    - title: Go\n      summary: Simplify provisioning, managing, and using Azure resources with Go.\n      imageSrc: /media/logos/logo_Go-lightblue.svg\n      links:\n        - text: Azure SDK for Go\n          url: ./go/overview.md\n        - text: API reference\n          url: https://pkg.go.dev/github.com/Azure/azure-sdk-for-go\n        - text: Developer center\n          url: ./go/index.yml\n    - title: C++\n      summary: Learn how to enable your C++ applications to interact with Azure services.\n      imageSrc: /media/logos/logo_Cplusplus.svg\n      links:\n        - text: Azure SDK for C++\n          url: ./cpp/sdk/overview.md\n        - text: API reference\n          url: https://azure.github.io/azure-sdk-for-cpp/index.html\n        - text: Developer center\n          url: ./cpp/index.yml\n    - title: Rust\n      summary: Build, deploy, and manage high-performance applications using Rust libraries.\n      imageSrc: ./intro/media/logo-rust.png\n      links:\n        - text: Azure SDK for Rust\n          url: ./rust/sdk/overview.md\n        - text: Rust crates index\n          url: ./rust/azure-sdk-library-package-index.md\n        - text: Developer center\n          url: ./rust/index.yml\nconceptualContent:\n  title: AI apps and AI developer tools\n  summary: Integrate AI capabilities into your applications. Use AI-powered tools to enhance your development workflow.\n  items:\n    # Card\n    - title: Develop AI apps using Azure services\n      summary: Build applications with generative AI capabilities on Azure.\n      links:\n        - url: ./ai/azure-ai-for-developers.md\n          itemType: overview\n          text: Overview of AI app development on Azure\n      footerLink:\n        url: /azure/developer/ai/\n        text: See more\n    # Card\n    - title: Azure AI developer tools\n      summary: Use Azure AI developer tools to enhance your AI development workflow.\n      links:\n        - url: ./github-copilot-azure/introduction.md\n          itemType: overview\n          text: What is GitHub Copilot for Azure?\n        - url: ./azure-mcp-server/overview.md\n          itemType: overview\n          text: What is Azure MCP Server?\n        - url: ./azure-skills/overview.md\n          itemType: overview\n          text: What are Azure Skills?\n      footerLink:\n        url: /azure/developer/ai-developer-tools/\n        text: See more\n    # Card\n    - title: GitHub Copilot modernization\n      summary: AI-powered agents that analyze and upgrade Java and .NET applications, and migrate them to Azure.\n      links:\n        - url: ./github-copilot-app-modernization/overview.md\n          itemType: overview\n          text: What is GitHub Copilot modernization?\n      footerLink:\n        url: /azure/developer/github-copilot-app-modernization/\n        text: See more\ntools:\n  title: Developer tools\n  summary: Use your favorite development tools when working with Azure.\n  items:\n    # Card\n    - title: Azure CLI\n      imageSrc: /media/logos/logo_CLIgeneric.svg\n      url: /cli/azure/\n    # Card\n    - title: Azure PowerShell\n      imageSrc: /media/logos/logo-powershell.png\n      url: /powershell/azure/\n    # Card\n    - title: Develop applications for Azure using Visual Studio\n      imageSrc: /media/logos/logo_visual-studio.svg\n      url: https://learn.microsoft.com/visualstudio/azure/\n    # Card\n    - title: Visual Studio Code Azure extensions\n      imageSrc: /media/logos/logo_vs-code.svg\n      url: https://code.visualstudio.com/docs/azure/extensions\n    # Card\n    - title: Azure Developer CLI (azd)\n      imageSrc: https://static.docs.com/ui/media/product/azure/azure-developer-cli.svg\n      url: /azure/developer/azure-developer-cli/\n    # Card\n    - title: DevOps and automation\n      imageSrc: /azure/media/index/devops.svg\n      url: ./iac/index.yml\n    # Card\n    - title: Azure Toolkit for IntelliJ\n      imageSrc: /media/logos/logo_intellij.svg\n      url: ./java/toolkit-for-intellij/index.yml\n    # Card\n    - title: Azure Toolkit for Eclipse\n      imageSrc: /media/logos/logo_eclipse.svg\n      url: ./java/toolkit-for-eclipse/index.yml\n    # Card\n    - title: Maven plugins for Azure\n      imageSrc: /media/logos/logo_maven.svg\n      url: https://github.com/Microsoft/azure-maven-plugins#readme\n    # Card\n    - title: TypeSpec\n      imageSrc: ./typespec/media/icon-for-hub/typespec-hub-icon.svg\n      url: /azure/developer/typespec/\n    # Card\n    - title: Dev Proxy\n      imageSrc: ./includes/media/dev-proxy/dev-proxy-icon.svg\n      url: /microsoft-cloud/dev/dev-proxy/overview\n"
  },
  {
    "path": "articles/intro/TOC.yml",
    "content": "items:\n  - name: Introduction to Azure for developers\n    href: index.yml\n  - name: What's new in Azure developer documentation\n    href: whats-new.md\n  - name: Get started\n    expanded: false\n    items:\n      - name: Overview\n        href: azure-developer-overview.md\n      - name: Get started with Azure dev tools\n        href: quickstart-developer-tools.md\n      - name: Key Azure services for developers\n        href: azure-developer-key-services.md\n      - name: Host applications on Azure\n        href: hosting-apps-on-azure.md\n      - name: Connect apps to Azure services\n        href: connect-to-azure-services.md\n      - name: Create Azure resources\n        href: azure-developer-create-resources.md\n      - name: Key concepts for building Azure apps\n        href: azure-developer-key-concepts.md\n      - name: Overview of Azure billing\n        href: azure-developer-billing.md\n  - name: AI development on Azure\n    href: ../ai/index.yml\n  - name: Tools\n    items:\n      - name: Azure Developer CLI (azd)\n        href: ../azure-developer-cli/overview.md\n      - name: GitHub Copilot for Azure\n        href: ../github-copilot-azure/introduction.md\n      - name: VS Code for Web - Azure\n        href: https://code.visualstudio.com/docs/azure/vscodeforweb\n      - name: Azure Tools extension\n        href: https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack\n  - name: Azure developer centers\n    expanded: true\n    items:\n      - name: .NET on Azure\n        href: /dotnet/azure/\n      - name: Java on Azure \n        href: ../java/index.yml\n      - name: JavaScript on Azure\n        href: ../javascript/index.yml\n      - name: Python on Azure\n        href: ../python/index.yml\n      - name: Go on Azure\n        href: ../go/index.yml\n      - name: C++ on Azure\n        href: ../cpp/index.yml\n      - name: Rust on Azure\n        href: ../rust/index.yml\n  - name: Versioning policy for Azure services, SDKs, and CLI tools\n    href: azure-service-sdk-tool-versioning.md\n\n"
  },
  {
    "path": "articles/intro/azure-developer-billing.md",
    "content": "---\ntitle: How am I billed?\ndescription: A developer focused overview of how billing works on Azure.\nkeywords: azure billing, azure portal\nms.service: azure\nms.topic: overview\nms.date: 03/25/2026\nms.custom: overview\n---\n\n# How am I billed?\n\nThis article is the final installment in a series of seven articles that help developers get started with Azure.\n\n* Part 1: [Azure for developers overview](azure-developer-overview.md)\n* Part 2: [Key Azure services for developers](azure-developer-key-services.md)\n* Part 3: [Hosting applications on Azure](hosting-apps-on-azure.md)\n* Part 4: [Connect your app to Azure services](connect-to-azure-services.md)\n* Part 5: [How do I create and manage resources in Azure?](azure-developer-create-resources.md)\n* Part 6: [Key concepts for building Azure apps](azure-developer-key-concepts.md)\n* Part 7: **How am I billed?**\n\nWhen you create applications that use Azure, you need to understand the factors that influence the cost of the solutions you create. You also need to know how to estimate the cost of a solution, how you're billed, and how to monitor the costs incurred in your Azure subscriptions.\n\n## What is an Azure account?\n\nYou use your Azure account to sign in to Azure. You might have an Azure account through the organization you work for or the school you attend. You can also create an individual Azure account for personal use that's linked to your Microsoft account. To learn about and experiment with Azure, [create an Azure account for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n> [!div class=\"nextstepaction\"]\n> [Create a free Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\nIf you're using an Azure account from your workplace or school, your organization's Azure administrators likely assigned different groups and roles to your account that govern what you can and can't do in Azure. If you can't create a certain type of resource, check with your Azure administrator about the permissions assigned to your account.\n\n## What is an Azure subscription?\n\nBilling for Azure resources happens on a per-subscription basis. An Azure subscription defines a set of Azure resources that are invoiced together.\n\nOrganizations often create multiple Azure subscriptions for billing and management purposes. For example, an organization might create one subscription for each department so each department pays for its own Azure resources. *When you create Azure resources, pay attention to which subscription you use because the owner of that subscription pays for those resources.*  \n\nIf you have an individual Azure account tied to your Microsoft account, you can also have multiple subscriptions. For example, you might have both a Visual Studio Enterprise subscription that provides monthly Azure credits and a Pay-as-you-go subscription that bills to your credit card. In this scenario, make sure to choose the right subscription when creating Azure resources to avoid unexpected bills for Azure services.\n\n\n> [!VIDEO 05835149-e242-48c6-b041-7d70918ae6c6]\n\n\n## What factors influence the cost of a service on Azure?\n\nSeveral factors influence the cost of a given service in Azure.\n\n- **Compute power** - Compute power refers to the amount of CPU and memory assigned to a resource. The more compute power you allocate to a resource, the higher the cost is. Many Azure services let you elastically scale, so you can increase compute power when demand is high and reduce it to save money when demand is low.\n- **Storage amount** - Most storage services bill based on the amount of data you want to store.\n- **Storage hardware** - Some storage services provide options for the type of hardware where your data is stored. Depending on the type of data you're storing, you might prefer long-term storage with slower read and write speeds, or you might pay more for low-latency reads and writes for highly transactional operations.\n- **Bandwidth** - Most services bill ingress and egress separately. Ingress refers to the bandwidth needed for incoming requests, while egress refers to the bandwidth needed for outgoing data to satisfy those requests.\n- **Per use** - Some services bill based on the number of times the service is used, the number of requests handled, or the number of entities (such as Microsoft Entra user accounts) configured.\n- **Per service** - Some services simply charge a straight monthly fee.\n- **Region** - Services sometimes have different prices depending on the region (data center) where they're hosted.\n- **Token usage** - AI services like Azure OpenAI bill based on the number of tokens processed. A token is roughly four characters of text. Both input and output tokens count toward your bill.\n\n## Azure pricing calculator\n\nMost Azure solutions involve multiple Azure services, so it's challenging to determine the cost of a solution upfront. For this reason, Azure provides the [Azure pricing calculator](https://azure.microsoft.com/pricing/calculator/) to help you estimate the cost of a solution.\n\n> [!div class=\"nextstepaction\"]\n> [Azure pricing calculator](https://azure.microsoft.com/pricing/calculator/)\n\n## Where can I find our current spend in Azure?\n\nThe Azure portal provides an easy-to-navigate and visual presentation of all the services your organization uses during a particular month. You can view the data by service, resource group, and more.\n\nTo access billing information in the Azure portal:\n\n1. [Sign in to the Azure portal](https://portal.azure.com).\n1. In the search box at the top of the portal, enter **Cost Management + Billing**.\n1. Select **Cost Management + Billing** from the search results.\n1. Review your current spend and other billing information.\n\n   :::image type=\"content\" source=\"./media/billing-azure-portal.png\" alt-text=\"A screenshot of the detailed overview page for an Azure subscription showing the links used for cost analysis, setting up cost alerts, and how to get detailed billing data by Azure resource.\" lightbox=\"./media/billing-azure-portal.png\":::\n\nYou can also access the **Cost Management + Billing** overview page directly.\n\n> [!div class=\"nextstepaction\"]\n> [Azure Cost Management in the Azure portal](https://portal.azure.com/#view/Microsoft_Azure_CostManagement/Menu/~/overview)\n\nYou can also access cost information programmatically to create a customized and accessible view of your cloud spend by using the Billing API.\n\n- [Azure Billing libraries for .NET](/dotnet/api/overview/azure/billing)\n- [Azure Billing libraries for Python](/python/api/overview/azure/billing)\n- [Azure Resource Manager Billing client library for Java - Version 1.0.0-beta.1](/java/api/overview/azure/resourcemanager-billing-readme)\n- [All other programming languages - RESTful API](/rest/api/billing/)\n- [Azure consumption API overview](/azure/cost-management-billing/manage/consumption-api-overview)\n\n## What tools can I use to monitor and analyze cloud spend?\n\nTwo services help you set up and manage your cloud costs.\n\n- **Cost alerts** let you set spending thresholds and receive notifications as your bill nears those thresholds. \n- **Azure Cost Management** helps you plan for and control your costs by providing cost analysis, budgets, recommendations, and letting you export cost management data for analysis in Excel or your own custom reporting.\n\nLearn more about **cost alerts** and **Cost Management**:\n\n- [Use cost alerts to monitor usage and spending](/azure/cost-management-billing/costs/cost-mgt-alerts-monitor-usage-spending)\n- [What is Microsoft Billing?](/azure/cost-management-billing/cost-management-billing-overview)\n- [How to optimize your cloud investment with Cost Management](/azure/cost-management-billing/costs/cost-mgt-best-practices)\n\n"
  },
  {
    "path": "articles/intro/azure-developer-create-resources.md",
    "content": "---\ntitle: How do I create and manage resources in Azure?\ndescription: An overview of techniques that developers use to provision resources in Azure.\nkeywords: azure portal, azure cli, azure powershell, azure sdk, azure rest apis\nms.service: azure\nms.topic: overview\nms.date: 03/25/2026\nms.custom: overview\n---\n\n# How do I create and manage resources in Azure?\n\nThis article is part five in a series of seven articles that help developers get started with Azure.\n\n* Part 1: [Azure for developers overview](azure-developer-overview.md)\n* Part 2: [Key Azure services for developers](azure-developer-key-services.md)\n* Part 3: [Hosting applications on Azure](hosting-apps-on-azure.md)\n* Part 4: [Connect your app to Azure services](connect-to-azure-services.md)\n* Part 5: **How do I create and manage resources in Azure?**\n* Part 6: [Key concepts for building Azure apps](azure-developer-key-concepts.md)\n* Part 7: [How am I billed?](azure-developer-billing.md)\n\nAzure offers various tools to create and manage the resources your application used by your application.\n\n\n> [!VIDEO e45eb362-8ff4-4fe3-8f83-24797f73202a]\n\n\nDifferent tools support various use cases, and most Azure developers use a combination of tools depending on the job. For example, you might:\n\n* **Use a GUI tool like the [Azure portal](https://portal.azure.com) or the [Azure Tools extension for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)** when prototyping Azure resources for a new application. GUI tools guide you through the process of creating new services and let you review and select the options for a service using drop-down menus and other graphical elements.\n\n* **Use the [Azure Developer CLI (`azd`)](../azure-developer-cli/overview.md) to provision and deploy full-stack applications** from [starter templates](../azure-developer-cli/azd-templates.md). With a single `azd up` command, you can create all necessary Azure resources and deploy your code without manually configuring each service.\n\n* **Use [GitHub Copilot for Azure](../github-copilot-azure/introduction.md) to get AI-assisted guidance** when you're unsure which resources to create or how to configure them. GitHub Copilot for Azure can help you learn about services, generate deployment scripts, and troubleshoot issues using natural language.\n\n* **Write a script using the [Azure CLI](/cli/azure/what-is-azure-cli) or [Azure PowerShell](/powershell/azure/what-is-azure-powershell)** to automate a common task. For example, you might create a script that creates a basic dev environment for a new web application consisting of an Azure App Service, a database, and blob storage. Writing a script ensures consistent resource creation and is faster than using a UI.\n\n* **Use [Infrastructure as code (IaC)](/devops/deliver/what-is-infrastructure-as-code) tools to declaratively deploy and manage Azure resources**. Tools like [Terraform](../terraform/index.yml), [Ansible](../ansible/index.yml), and [Bicep](/azure/azure-resource-manager/bicep/) let you codify Azure resources in declarative syntax, ensuring consistent deployment across environments and preventing environmental drift.\n\n* **Use AI app templates to bootstrap AI projects quickly.** Azure provides [AI app templates](../ai/intelligent-app-templates.md) that include infrastructure definitions, application code, and deployment configuration for common AI scenarios like chat-with-your-data and document processing.\n\nTo get started with Azure developer tools, see the [Quickstart: Azure developer tools](quickstart-developer-tools.md).\n\n## Azure portal\n\nThe [Azure portal](https://portal.azure.com) is a web-based interface designed for managing Azure resources. The Azure portal features:\n\n* An easy-to-use, web-based UI for creating and managing Azure resources\n* Create configurable dashboards\n* Access subscription settings and billing information\n\n:::image type=\"content\" source=\"./media/azure-portal-800px.png\" alt-text=\"A screenshot showing the Azure portal.\" lightbox=\"./media/azure-portal.png\":::\n\n## VS Code Azure Tools Extension Pack\n\nDevelopers using [Visual Studio Code](https://code.visualstudio.com) manage Azure resources directly in VS Code with the [Azure Tools Extension Pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) for VS Code. The Azure Tools Extension Pack lets you:\n\n* Create, manage, and deploy code to websites with Azure App Service\n* Create, browse, and query Azure databases\n* Create, debug, and deploy Azure Functions directly in VS Code\n* Deploy containerized applications in VS Code\n\nFor the full list of features, see the extension's download page.\n\n> [!div class=\"nextstepaction\"]\n> [Download Azure Tools extension pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)\n\n:::image type=\"content\" source=\"./media/visual-studio-code-azure-tools-extension.png\" alt-text=\"A screenshot showing Visual Studio Code with the Azure Tools extension pack installed.\":::\n\n## Azure development in Visual Studio\n\nDevelopers using [Visual Studio](https://visualstudio.microsoft.com/) access Azure tools through the Azure development workload. Visual Studio's Azure integration includes:\n\n* Create and deploy to Azure App Service, Azure Functions, and Azure Container Apps\n* Add Azure service dependencies through Connected Services\n* Browse and manage Azure resources with Cloud Explorer\n* Debug cloud services locally and remotely\n\nTo learn more about Azure development with Visual Studio, see [Azure development with Visual Studio](/visualstudio/azure/overview-azure-integration).\n\n## Azure Developer CLI\n\nThe [Azure Developer CLI (`azd`)](../azure-developer-cli/overview.md) is a developer-focused command-line tool for creating Azure applications. The Azure Developer CLI:\n\n* Provisions and deploys full-stack applications from [starter templates](../azure-developer-cli/azd-templates.md)\n* Reduces the time from code to cloud with a single `azd up` command\n* Supports CI/CD pipeline configuration with `azd pipeline config`\n* Works with infrastructure definitions in Bicep or Terraform\n\n\nTo get started, see the [Azure Developer CLI quickstart](../azure-developer-cli/get-started.md).\n\n## GitHub Copilot for Azure\n\n[GitHub Copilot for Azure](../github-copilot-azure/introduction.md) is an AI-powered chat extension that helps you work with Azure using natural language. Use it to:\n\n* Learn about Azure services and best practices\n* Deploy Azure resources through conversation\n* Troubleshoot application and resource issues\n* Get guidance on designing cloud-native applications\n\nGitHub Copilot for Azure works in VS Code alongside the Azure Tools extension pack, providing AI-assisted guidance as you build and manage your applications.\n\nTo learn more, see [Get started with GitHub Copilot for Azure](../github-copilot-azure/get-started.md).\n\n## Command line tools\n\nCommand line tools offer efficiency, repeatability, and the ability to script recurring tasks. Azure provides two command line tools: Azure CLI and Azure PowerShell. Both tools are functionally equivalent, so select the one that fits your workflow.\n\n### Azure CLI\n\nThe [Azure CLI](/cli/azure/what-is-azure-cli) is a cross-platform command line tool that runs on Windows, Linux, and macOS. The Azure CLI:\n\n* Features a concise, efficient syntax for managing Azure resources\n* Outputs results as JSON (by default). Results can also be formatted as YAML, an ASCII table, or tab-separated values with no keys\n* Provides the ability to query and shape output by using [JMESPath queries](https://jmespath.org/)\n\nAzure CLI commands integrate easily into popular scripting languages like [Bash](/training/modules/bash-introduction/), letting you script common tasks.\n\n```azurecli\nLOCATION='eastus'                                        \nRESOURCE_GROUP_NAME='msdocs-expressjs-mongodb-tutorial'\n\nWEB_APP_NAME='msdocs-expressjs-mongodb-123'\nAPP_SERVICE_PLAN_NAME='msdocs-expressjs-mongodb-plan-123'    \nRUNTIME='NODE|14-lts'\n\n# Create a resource group\naz group create \\\n    --location $LOCATION \\\n    --name $RESOURCE_GROUP_NAME\n\n# Create an app service plan\naz appservice plan create \\\n    --name $APP_SERVICE_PLAN_NAME \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --sku B1 \\\n    --is-linux\n\n# Create the web app in the app service\naz webapp create \\\n    --name $WEB_APP_NAME \\\n    --runtime $RUNTIME \\\n    --plan $APP_SERVICE_PLAN_NAME \\\n    --resource-group $RESOURCE_GROUP_NAME \n```\n\n### Azure PowerShell\n\n[Azure PowerShell](/powershell/azure/what-is-azure-powershell) is a set of cmdlets for managing Azure resources directly from PowerShell. Azure PowerShell is installed as a PowerShell module and works with PowerShell 7.0.6 LTS and PowerShell 7.1.3 or higher on all platforms including Windows, macOS, and Linux. It's also compatible with Windows PowerShell 5.1.\n\nAzure PowerShell integrates tightly with the PowerShell language. Commands use a verb-noun format, and data returns as PowerShell objects. If you're already familiar with PowerShell scripting, Azure PowerShell is a natural choice.\n\n```azurepowershell\n$location = 'eastus'\n$resourceGroupName = 'msdocs-blob-storage-demo-azps'\n$storageAccountName = 'stblobstoragedemo999'\n\n# Create a resource group\nNew-AzResourceGroup `\n    -Location $location `\n    -Name $resourceGroupName\n\n# Create the storage account\nNew-AzStorageAccount `\n    -Name $storageAccountName `\n    -ResourceGroupName $resourceGroupName `\n    -Location $location `\n    -SkuName Standard_LRS\n```\n\nFor more information on choosing between Azure CLI and Azure PowerShell, see the article [Choose the right command-line tool](/cli/azure/choose-the-right-azure-command-line-tool).\n\n## Infrastructure as code tools\n\n[Infrastructure as code](/devops/deliver/what-is-infrastructure-as-code) is the process of managing and provisioning resources through declarative configuration files. Infrastructure as code tools use a declarative end state specification to guarantee a set of resources are created and configured the same way each time. Most infrastructure as code tools also monitor resources to ensure they remain configured in the desired state.\n\nAzure supports various infrastructure as code tools for automated, repeated, and reliable deployments.\n\n### Bicep\n\n[Bicep](/azure/azure-resource-manager/bicep/) is a domain-specific language (DSL) that uses declarative syntax to deploy Azure resources. It provides concise syntax, reliable type safety, and support for code reuse.\n\n  ```bicep\n  param location string = resourceGroup().location\n  param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'\n\n  resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {\n    name: storageAccountName\n    location: location\n    sku: {\n      name: 'Standard_LRS'\n    }\n    kind: 'StorageV2'\n    properties: {\n      accessTier: 'Hot'\n    }\n  }\n  ```\n\n### Terraform\n\n[Hashicorp Terraform](../terraform/index.yml) is an open-source tool for provisioning and managing cloud infrastructure. It codifies infrastructure in configuration files that describe the topology of cloud resources. The Terraform CLI provides a simple mechanism to deploy and version configuration files to Azure.\n\n```terraform\nprovider \"azurerm\" {\n  features {}\n}\n\nresource \"azurerm_resource_group\" \"main\" {\n  name     = \"${var.prefix}-resources\"\n  location = var.location\n}\n\nresource \"azurerm_app_service_plan\" \"main\" {\n  name                = \"${var.prefix}-asp\"\n  location            = azurerm_resource_group.main.location\n  resource_group_name = azurerm_resource_group.main.name\n  kind                = \"Linux\"\n  reserved            = true\n\n  sku {\n    tier = \"Standard\"\n    size = \"S1\"\n  }\n}\n\nresource \"azurerm_app_service\" \"main\" {\n  name                = \"${var.prefix}-appservice\"\n  location            = azurerm_resource_group.main.location\n  resource_group_name = azurerm_resource_group.main.name\n  app_service_plan_id = azurerm_app_service_plan.main.id\n\n  site_config {\n    linux_fx_version = \"NODE|10.14\"\n  }\n}\n```\n\n### Ansible\n\n[Ansible](../ansible/index.yml) is an open-source product that automates cloud provisioning, configuration management, and application deployments. Using Ansible, you can provision virtual machines, containers, networks, and complete cloud infrastructures. Ansible also lets you automate the deployment and configuration of resources in your environment.\n\n```yml\n- hosts: localhost\n  connection: local\n  vars:\n    resource_group: myResourceGroup\n    webapp_name: myfirstWebApp\n    plan_name: myAppServicePlan\n    location: eastus\n  tasks:\n    - name: Create a resource group\n      azure_rm_resourcegroup:\n        name: \"{{ resource_group }}\"\n        location: \"{{ location }}\"\n\n    - name: Create App Service on Linux with Java Runtime\n      azure_rm_webapp:\n        resource_group: \"{{ resource_group }}\"\n        name: \"{{ webapp_name }}\"\n        plan:\n          resource_group: \"{{ resource_group }}\"\n          name: \"{{ plan_name }}\"\n          is_linux: true\n          sku: S1\n          number_of_workers: 1\n        frameworks:\n          - name: \"java\"\n            version: \"8\"\n            settings:\n              java_container: tomcat\n              java_container_version: 8.5\n```\n\n## Azure SDK and REST APIs\n\nAzure resources can be created programmatically from code. This lets you write applications that dynamically provision Azure resources in response to user requests. The Azure SDK provides resource management packages in .NET, Go, Java, JavaScript, and Python that let you create and manage Azure resources directly in code. Alternatively, the Azure REST API lets you manage Azure resources through HTTP requests to a RESTful endpoint.\n\n- [Using the Azure SDK for .NET](/dotnet/azure/sdk/resource-management)\n- [Using the Azure SDK for Go](../go/management-libraries.md)\n- [Using the Azure SDK for Java](../java/sdk/overview.md)\n- [Using the Azure SDK for JavaScript](../javascript/core/use-azure-sdk.md)\n- [Using the Azure SDK for Python](../python/sdk/azure-sdk-overview.md)\n- [Using the Azure REST APIs](/rest/api/azure/)\n\n> [!div class=\"nextstepaction\"]\n> [Continue to part 6: Key concepts for building Azure apps](azure-developer-key-concepts.md)\n"
  },
  {
    "path": "articles/intro/azure-developer-key-concepts.md",
    "content": "---\ntitle: Important considerations when designing your Azure solution\ndescription: Understand the factors that affect your overall strategy for designing an Azure solution.\nkeywords: azure account, azure subscription, billing, region, resource groups\nms.service: azure\nms.topic: overview\nms.date: 03/25/2026\nms.custom: overview\n---\n\n# Key concepts for building Azure apps\nThis article is part six in a series of seven articles that help developers get started with Azure.\n\n* Part 1: [Azure for developers overview](azure-developer-overview.md)\n* Part 2: [Key Azure services for developers](azure-developer-key-services.md)\n* Part 3: [Hosting applications on Azure](hosting-apps-on-azure.md)\n* Part 4: [Connect your app to Azure services](connect-to-azure-services.md)\n* Part 5: [How do I create and manage resources in Azure?](azure-developer-create-resources.md)\n* Part 6: **Key concepts for building Azure apps**\n* Part 7: [How am I billed?](azure-developer-billing.md)\n\nBefore designing your application to run on Azure, you need to plan ahead. As you start, you need to understand some basic Azure concepts to make the best decisions for your scenario. Consider the information in the following sections when planning.\n\n## Azure regions\n\nA region is a set of datacenters deployed within a latency-defined perimeter and connected by a dedicated regional low-latency network. Azure lets you deploy applications where you need them, including across multiple regions to deliver cross-region resiliency when needed.\n\nTypically, you want to keep all resources for a solution in the same region to minimize latency between components of your application. For example, if your solution includes Azure App Service, a database, and Azure Blob Storage, create all these resources in the same Azure region.\n\nNot every Azure service is available in every region. The [Products available by region](https://azure.microsoft.com/global-infrastructure/services/?products=all) page helps you find a region where the Azure services your app needs are available.\n\n\n> [!VIDEO a46cc039-9c20-411c-9829-a92dd96c1bf1]\n\n\n## Azure resource group\n\nA resource group in Azure is a logical container that groups Azure resources together. Every Azure resource belongs to one resource group.\n\nResource groups often group all the Azure resources needed for a solution in Azure. For example, if you have a web application deployed to Azure App Service that uses a SQL database, Azure Storage, and Azure Key Vault, it's common to place all these resources in a single resource group.\n\n:::image type=\"content\" source=\"media/resource-group-example.png\" alt-text=\"A diagram showing a sample resource group containing an App Service, SQL database, Blob storage, and a Key Vault.\":::\n\nThis approach makes it easier to identify the resources needed for the application to run and how they're related. Typically, the first step in creating resources for an app in Azure is creating the resource group that serves as a container for the app's resources.\n\n\n> [!VIDEO ec777d71-6067-4f03-bf19-8dd5189125c6]\n\n\n## Environments\n\nIf you've developed on-premises, you're familiar with promoting your code through dev, test, and production environments. In Azure, to create separate environments you would create a separate set of Azure resources for each environment you need.\n\n:::image type=\"content\" source=\"media/test-environments-example-800px.png\" alt-text=\"A diagram showing DEV, TEST, and PROD environments with a separate set of Azure resources in each environment.\" lightbox=\"media/test-environments-example.png\":::\n\nBecause it's important that each environment is an exact copy, use [scripting to create resources](./azure-developer-create-resources.md#command-line-tools) needed for an environment or use [infrastructure as code (IaC) tools](./azure-developer-create-resources.md#infrastructure-as-code-tools) to declaratively specify the configuration of each environment. This ensures that the environment creation process is repeatable and also lets you create new environments on demand, such as for performance or security testing of your application.\n\n\n> [!VIDEO 11847e6e-3424-4284-ba49-f7358fc8c8c9]\n\n\n## AI development considerations\n\nWhen building AI applications on Azure, consider these additional factors:\n\n- **Model selection** - Choose between Azure OpenAI models and open-source models available through the model catalog in Microsoft Foundry. Each model has different capabilities, latency characteristics, and cost profiles.\n- **Responsible AI** - Azure provides built-in content filtering and safety features. Design your AI applications with [responsible AI practices](/azure/ai-services/responsible-use-of-ai-overview) in mind, including fairness, transparency, and accountability.\n- **Token-based pricing** - Many AI services use token-based billing rather than traditional compute-based pricing. Understand your expected usage patterns to estimate costs accurately.\n\nTo learn more, see [Overview of AI app development](../ai/azure-ai-for-developers.md).\n\n## DevOps Support\n\nWhether you're publishing apps to Azure with continuous integration or provisioning resources for a new environment, Azure integrates with popular DevOps tools. You can work with your existing tools and maximize your experience with support for tools like:\n\n- [GitHub Actions](../github/github-actions.md)\n- [Azure DevOps](/azure/devops/)\n- [Octopus Deploy](https://octopus.com/docs/infrastructure/deployment-targets/azure)\n- [Jenkins](../jenkins/index.yml)\n- [Terraform](../terraform/index.yml)\n- [Ansible](../ansible/index.yml)\n- [Chef](https://docs.chef.io/client/19/integrations/azure_chef_cli/)\n\n\n> [!div class=\"nextstepaction\"]\n> [Continue to part 7: How am I billed?](azure-developer-billing.md)\n"
  },
  {
    "path": "articles/intro/azure-developer-key-services.md",
    "content": "---\ntitle: Key Azure services for developers\ndescription: An overview of important services that developers use when building solutions on Azure.\nkeywords: azure services\nms.service: azure\nms.topic: overview\nms.date: 03/25/2026\nms.custom: overview\n#CustomerIntent: As an experienced developer, I want an overview of Azure services since there are so many new terms and ideas. I want to see the products organized into large categories so I can make sense of them and start building a mental model.\n---\n\n# Key Azure services for developers\n\nThis article is part two in a series of seven articles that help developers get started with Azure.\n\n* Part 1: [Azure for developers overview](azure-developer-overview.md)\n* **Part 2: Key Azure services for developers**\n* Part 3: [Hosting applications on Azure](hosting-apps-on-azure.md)\n* Part 4: [Connect your app to Azure services](connect-to-azure-services.md)\n* Part 5: [How do I create and manage resources in Azure?](azure-developer-create-resources.md)\n* Part 6: [Key concepts for building Azure apps](azure-developer-key-concepts.md)\n* Part 7: [How am I billed?](azure-developer-billing.md)\n\nThis article introduces some of the key Azure services that developers use most frequently. For a comprehensive list of all Azure services, see the [Azure documentation hub page](/azure/?product=featured#browse-azure-products).\n\n## App hosting and compute\n\nWhether you need to host a web app's static resources, an API, or long-running back-end processes using containers, VMs, or serverless technologies, these Azure services help you architect your entire solution.\n\n|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Service|Description|\n|----|-------|-----------|\n|:::image type=\"icon\" source=\"media/azure-app-service.png\":::| [Azure App Service](/azure/app-service/) |Host .NET, Java, Node.js, and Python web applications and APIs in a fully managed Azure service. You only need to deploy your code to Azure. Azure manages infrastructure tasks like high availability, load balancing, and autoscaling. |\n|:::image type=\"icon\" source=\"media/static-web-apps.png\":::| [Azure Static Web Apps](/azure/static-web-apps/) |Host static web apps built using frameworks like Gatsby, Hugo, or VuePress, or modern web apps built using Angular, React, Svelte, or Vue. Static web apps automatically build and deploy based on code changes and feature API integration with Azure Functions.|\n|:::image type=\"icon\" source=\"media/azure-container-apps.png\":::| [Azure Container Apps](/azure/container-apps/) |Azure Container Apps lets you run containerized applications on a serverless platform without managing orchestration or infrastructure.|\n|:::image type=\"icon\" source=\"media/azure-container-instances.png\":::| [Azure Container Instances](/azure/container-instances/) |Run Docker containers on-demand in a managed, serverless Azure environment. Azure Container Instances is a solution for any scenario that can operate in isolated containers, without orchestration.|\n|:::image type=\"icon\" source=\"media/azure-kubernetes-service.png\":::| [Azure Kubernetes Services](/azure/aks/) |Quickly deploy a production ready Kubernetes cluster to the cloud and offload the operational overhead to Azure. Azure handles critical tasks, like health monitoring and maintenance. You only need to manage and maintain the agent nodes.|\n|:::image type=\"icon\" source=\"media/azure-virtual-machines.png\":::| [Azure Virtual Machines](/azure/virtual-machines/) |Host your app using virtual machines in Azure when you need more control over your computing environment. Azure VMs offer a flexible, scalable computing environment for both Linux and Windows virtual machines. |\n|:::image type=\"icon\" source=\"media/azure-functions.png\":::| [Azure Functions](/azure/azure-functions/) |A serverless compute platform for creating small, discrete segments of code that can be triggered from a variety of different events. Common applications include building serverless APIs or orchestrating event-drive architectures.|\n|:::image type=\"icon\" source=\"media/azure-spring-cloud.png\":::| [Azure Spring Apps](/azure/spring-apps/) |Host Spring Boot microservice applications in Azure, no code changes required. Azure Spring Apps provides monitoring, configuration management, service discovery, CI/CD integration and more.|\n\nYou might wonder, \"Why are there so many different ways to host an application?\" The answer is explained in the next article, [Hosting applications on Azure](hosting-apps-on-azure.md). \n\n## Foundry Tools\n\n[Foundry Tools](/azure/ai-services/) help you create AI apps with prebuilt and customizable APIs and models. Example applications include natural language processing for conversations, search, monitoring, translation, speech, vision, and decision making.\n\n|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Service|Description|\n|----|-------|-----------|\n| :::image type=\"icon\" source=\"media/azure-openai.png\"::: | [Azure OpenAI](/azure/ai-services/openai/) | Use powerful language models including the GPT, Codex, and Embeddings model series for content generation, summarization, semantic search, and natural language to code translation. |\n| :::image type=\"icon\" source=\"media/azure-speech.png\"::: | [Azure Speech in Foundry Tools](/azure/ai-services/speech-service/) | Transcribe audible speech into readable, searchable text or convert text to lifelike speech for more natural interfaces. |\n| :::image type=\"icon\" source=\"media/language.png\"::: | [Azure Language in Foundry Tools](/azure/ai-services/language-service) | Use natural language processing (NLP) to identify key phrases and conduct sentiment analysis from text. |\n| :::image type=\"icon\" source=\"media/text-translator.png\"::: | [Azure Translator in Foundry Tools](/azure/ai-services/translator/) | Translate over 100 languages and dialects. |\n| :::image type=\"icon\" source=\"media/computer-vision.png\"::: | [Azure Vision in Foundry Tools](/azure/ai-services/computer-vision/) | Analyze content in images and video. |\n| :::image type=\"icon\" source=\"media/search.png\"::: | [Azure AI Search](/azure/search) | Information retrieval at scale for traditional and conversational search applications, with security and options for AI enrichment and vectorization. |\n| :::image type=\"icon\" source=\"media/document-intelligence.png\"::: | [Azure Document Intelligence in Foundry Tools](/azure/ai-services/document-intelligence) | Document extraction service that understands your forms, allowing you to quickly extract text and structure from documents. |\n\nTo get started building AI apps, see the [overview of AI app development](../ai/azure-ai-for-developers.md). For ready-to-deploy reference samples, browse the [AI app templates](../ai/intelligent-app-templates.md). If you're interested in building intelligent agents, see [Build agents using Model Context Protocol on Azure](../ai/intro-agents-mcp.md).\n\n## Data\n\nAzure offers a wide array of relational and NoSQL storage options, including managed versions of many popular open-source database products.\n\n|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Service|Description|\n|----|-------|-----------|\n|:::image type=\"icon\" source=\"media/azure-sql.png\":::| [Azure SQL](/azure/azure-sql/) | A family of SQL Server database engine products in the cloud.|\n|:::image type=\"icon\" source=\"media/azure-sql-database.png\":::| [Azure SQL Database](/azure/azure-sql/database/) |A fully managed, cloud-based version of SQL Server.|\n|:::image type=\"icon\" source=\"media/azure-cosmos-db.png\":::| [Azure Cosmos DB](/azure/cosmos-db/) |A fully managed, cloud-based NoSQL database. Azure Cosmos DB features multiple APIs, including APIs compatible with [MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction), [Cassandra](/azure/cosmos-db/cassandra/cassandra-introduction), and [Gremlin](/azure/cosmos-db/graph/gremlin-support).|\n|:::image type=\"icon\" source=\"media/azure-postgresql.png\":::| [Azure Database for PostgreSQL](/azure/postgresql/) |A fully managed, cloud-based PostgreSQL database service based on PostgreSQL Community Edition. |\n|:::image type=\"icon\" source=\"media/azure-mysql.png\":::| [Azure Database for MySQL](/azure/mysql/) |A fully managed, cloud-based MySQL database service based on the MySQL Community Edition. |\n|:::image type=\"icon\" source=\"media/azure-mariadb.png\":::| [Azure Database for MariaDB](/azure/mariadb/) |A fully managed, cloud-based MariaDB database service based on the MariaDB community edition. |\n|:::image type=\"icon\" source=\"media/cache-redis.png\":::| [Azure Cache for Redis](/azure/azure-cache-for-redis/) |A secure data cache and messaging broker that provides high-throughput and low-latency access to data for applications.|\n\n## Storage\n\n[Azure Storage](/azure/storage/) products offer secure, scalable cloud, and hybrid data storage services. Offerings include services for hybrid storage solutions and services to transfer, share, and back up data.\n\n|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Service|Description|\n|----|-------|-----------|\n|:::image type=\"icon\" source=\"media/azure-storage-accounts.png\":::| [Azure Blob Storage](/azure/storage/blobs/) |Azure Blob Storage lets your applications store and retrieve files in the cloud. Azure Storage is highly scalable, stores massive amounts of data, and ensures high availability with redundant storage.|\n|:::image type=\"icon\" source=\"media/azure-storage-accounts.png\":::| [Azure Data Lake Storage](/azure/storage/blobs/data-lake-storage-introduction) |Azure Data Lake Storage supports big data analytics with scalable, cost-effective storage for structured, semi-structured, or unstructured data.|\n\n## Messaging\n\nThese are some of the most popular services that manage sending, receiving, and routing of messages from and to apps.\n\n|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Service|Description|\n|----|-------|-----------|\n|:::image type=\"icon\" source=\"media/azure-service-bus.png\":::| [Azure Service Bus](/azure/service-bus-messaging/) |A fully managed enterprise message broker that supports point-to-point and publish-subscribe integrations. It's ideal for building decoupled applications, queue-based load leveling, or facilitating communication between microservices.|\n|:::image type=\"icon\" source=\"media/event-hubs.png\":::| [Azure Event Hubs](/azure/event-hubs/) |Azure Event Hubs is a managed service that ingests and processes massive data streams from websites, apps, or devices.|\n|:::image type=\"icon\" source=\"media/azure-storage-queues.png\":::| [Azure Queue Storage](/azure/storage/queues/) |A simple and reliable queue that handles large workloads.|\n\n## Identity and security\n\nOne of Azure's strengths lies in its secure-by-default security posture. You can enhance application-level security with the following services.\n\n|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Service|Description|\n|----|-------|-----------|\n|:::image type=\"icon\" source=\"media/active-directory.png\":::| [Microsoft Entra ID](/entra/identity/) |Manage user identities and control access to your apps, data, and resources.|\n|:::image type=\"icon\" source=\"media/azure-key-vault.png\":::| [Azure Key Vault](/azure/key-vault/) |Store and access application secrets, like connection strings and API keys, in an encrypted vault with restricted access to ensure your secrets and application aren't compromised.|\n|:::image type=\"icon\" source=\"media/app-configuration.png\":::| [App Configuration](/azure/azure-app-configuration/) |A fast and scalable service to centrally manage application settings and feature flags.|\n\n## Management\n\nMost applications benefit from letting DevOps, developers, and admins have deep visibility into the code running in the cloud. The following services provide insight into application performance and logging.\n\n|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Service|Description|\n|----|-------|-----------|\n|:::image type=\"icon\" source=\"media/monitor.png\":::| [Azure Monitor](/azure/azure-monitor/) |A comprehensive monitoring solution for collecting, analyzing, and responding to monitoring data from your cloud and on-premises environments.|\n|:::image type=\"icon\" source=\"media/application-insights.png\":::| [Application Insights](/azure/azure-monitor/app/app-insights-overview) |This feature of Azure Monitor provides Application Performance Management (APM) for enhancing the performance, reliability, and quality of your live web applications.|\n\nNow that you have an overview of the services that can be combined into a robust cloud solution, we'll take a closer look at building and hosting applications that target the cloud.\n\n> [!div class=\"nextstepaction\"]\n> [Continue to part 3: Hosting applications on Azure](hosting-apps-on-azure.md)\n"
  },
  {
    "path": "articles/intro/azure-developer-overview.md",
    "content": "---\ntitle: Azure for developers overview\ndescription: An overview of Azure from a developer's perspective.\nkeywords: azure billing, azure portal\nms.service: azure\nms.topic: overview\nms.date: 03/25/2026\nms.custom: overview\n---\n\n# Azure for developers overview\n\nIf you're new to developing applications for the cloud, start with this seven-article series.\n\n* Part 1: **Azure for developers overview**\n* Part 2: [Key Azure services for developers](azure-developer-key-services.md)\n* Part 3: [Hosting applications on Azure](hosting-apps-on-azure.md)\n* Part 4: [Connect your app to Azure services](connect-to-azure-services.md)\n* Part 5: [How do I create and manage resources in Azure?](azure-developer-create-resources.md)\n* Part 6: [Key concepts for building Azure apps](azure-developer-key-concepts.md)\n* Part 7: [How am I billed?](azure-developer-billing.md)\n\nAzure is a cloud platform designed to simplify the process of building modern applications. Whether you choose to host your applications entirely in Azure or extend your on-premises applications with Azure services, Azure helps you create applications that are scalable, reliable, and maintainable.\n\nAzure supports the most popular programming languages in use today, including .NET, C++, Go, Java, JavaScript, Python, and Rust. With a comprehensive SDK and extensive support in tools you already use like VS Code, Visual Studio, IntelliJ, and Eclipse, Azure builds on the skills you already have and helps you be productive right away.\n\nAzure also provides a suite of developer tools that streamline how you build, deploy, and manage cloud applications.\n\n## Application development scenarios on Azure\n\nIncorporate Azure into your application in different ways depending on your needs. The following video provides a helpful overview of the most popular development scenarios for Azure developers:\n\n\n> [!VIDEO e882f09e-efff-465d-a72e-1b430631e6bf]\n\n\nCommon software development and deployment scenarios on Azure include the following options:\n\n- **Application hosting on Azure -** Host your entire application stack: web applications, APIs, databases, and storage services. Azure supports various hosting models from fully managed services to containers to virtual machines. When you use fully managed Azure services, your applications take advantage of the scalability, high availability, and security built into Azure.\n\n- **Consuming cloud services from existing on-premises applications -** Extend existing on-premises apps with Azure services. For example, an application can use Azure Blob Storage to store files, Azure Key Vault to securely store application secrets, or [Azure AI Search](/azure/search/search-what-is-azure-search) to add full-text search capability. These fully managed services integrate with your apps without changing your application architecture or deployment model.\n\n- **Container based architectures -** Use container-based services to modernize your apps. Whether you need a private registry for container images, you're containerizing an existing app for easier deployment, deploying microservices-based applications, or managing containers at scale, Azure has solutions that support your needs.\n\n- **AI driven applications -** Build AI-powered applications on your terms, in your preferred programming language, in the cloud, on-premises, or at the edge. Azure provides access to powerful foundation models through Azure OpenAI, prebuilt AI services for speech, vision, and language, and tools for building intelligent agents using the Model Context Protocol (MCP). Get started with [AI app development on Azure](../ai/azure-ai-for-developers.md) or explore [AI resources by programming language](../ai/resources-overview.md).\n\n- **Modern serverless architectures -** Use Azure Functions to simplify building event-driven solutions, whether responding to HTTP requests, handling file uploads in Blob storage, or processing queue events. You write only the code necessary to handle your event without worrying about servers or framework code. Use more than 250 connectors to Azure and other services to tackle integration problems.\n\n- **Developer tools -** Azure provides tools for every stage of the development lifecycle, including the [Azure Developer CLI (`azd`)](../azure-developer-cli/overview.md), [GitHub Copilot for Azure](../github-copilot-azure/introduction.md), [Azure Tools for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack), and [Azure development with Visual Studio](/visualstudio/azure/overview-azure-integration). For a hands-on walkthrough, see [Quickstart: Azure developer tools](quickstart-developer-tools.md).\n\nHow do you implement those scenarios? The next article, \"Key Azure services for developers\", gives several Azure service options to implement each scenario.\n\n> [!div class=\"nextstepaction\"]\n> [Continue to part 2: Key Azure services for developers](azure-developer-key-services.md)\n"
  },
  {
    "path": "articles/intro/azure-service-sdk-tool-versioning.md",
    "content": "---\ntitle: Versioning policy for Azure services, SDKs, and CLI tools\ndescription: Versioning policy for Azure services, SDKs, and CLI tools\nms.service: azure\nms.topic: overview\nms.date: 12/11/2025\n---\n\n# Versioning policy for Azure services, SDKs, and CLI tools\n\nMost Azure services let you programmatically control and manage their resources by using REST APIs. Services evolve through new published versions of their APIs with different contracts that add new features and modify behaviors.\n\nThis article outlines the policy that the Azure service, SDK, and CLI teams use for versioning the Azure REST APIs. While Azure teams make every effort to adhere to this policy, deviations can occur.\n\n## Service versioning\n\nEach published version of an API is identified by a date value in `YYYY-MM-DD` format, called the `api-version`. Newer versions have later dates.\n\nAll API operations require clients to specify a valid API version for the service through the `api-version` query string parameter in the URL. For example: `https://management.azure.com/subscriptions?api-version=2020-01-01`. Client SDKs and tools include the `api-version` value automatically. For more considerations, see the [Client SDKs and service versions](#client-sdks-and-service-versions) section later in this article.\n\nIn most scenarios, a service client only needs to interact with a single version of a service to access all of the functionality it requires.\n\nStable service versions generally remain available and supported for many years, even as newer versions become available. In most cases, you adopt a new service version within existing code to take advantage of new features.\n\n### Stable versions\n\nMost published service versions are *stable versions*. Stable versions are backwards compatible, meaning that any code you write that relies on one version of a service can adopt a newer stable version without requiring any code changes to maintain correctness or existing functionality.\n\n### Breaking change versions\n\nA *breaking change version* of a service isn't backwards compatible. Adopting a breaking change version in existing client code might require code changes to ensure the client behaves exactly as it did when targeting the previous version.\n\nBreaking change versions are rare. The Azure teams announce them via documentation and typically precede them with a preview version. Publication of a breaking change version might prompt the eventual retirement of existing stable versions. These stable versions remain available for at least three years after the breaking change version releases. For breaking changes published due to security or compliance issues, existing stable service versions might remain available for one year or less depending on the severity of the the issue.\n\nDue to the rapid innovation and developments in AI, AI-driven services might have a reduced minimum availability of one year. Each service publishes its breaking change policy.\n\nAny Azure service dependent on a non-Microsoft component can shrink its support policy to match that component's policy. Any dependent breaking change links to the component vendor's policy showing the date when the component is no longer supported.\n\n### Preview versions\n\nOccasionally, Microsoft publishes a *preview version* of a service to gather feedback about proposed changes and new features. Preview service versions include the suffix `-preview` in their `api-version` - for example, `2022-07-07-preview`.\n\nUnless a preview version explicitly introduces a breaking change from the previous stable version, it includes all the features of the most recent stable version and adds new preview features. However, between preview versions, a service can break any of the newly added preview features.\n\nPreviews aren't intended for long-term use. Anytime a new stable or preview version of a service becomes available, existing preview versions can become unavailable as early as 90 days from the availability of the new version. Use preview versions only in situations where you're actively developing against new service features and you're prepared to adopt a new, non-preview version soon after it's released. If some features from a preview version are released in a new stable version, remaining features still in preview typically are published in a new preview version.\n\n## Client SDKs and service versions\n\nThe [Azure SDKs](https://azure.github.io/azure-sdk/releases/latest/) aim to eliminate service versioning as a concern when writing code. Each SDK is composed of client libraries, one for each service, and each client library version targets a single version of the service it relies on.\n\nWhen you use an SDK to access an Azure service, taking advantage of new versions and features typically requires upgrading the client library version used by the application. New stable versions of services are accompanied by new point releases of client libraries. For new breaking change versions, new client libraries are published as either point release versions or major release versions. The type of release depends on the nature of the service's change and the way the library is able to accommodate it. Only beta-version client libraries use preview service versions.\n\nSDK client libraries support manual overriding of the service version. Overriding a client library's default service version is an advanced scenario and can lead to unexpected behavior. If you make use of this feature, test your application thoroughly to ensure it works as desired.\n\n## Azure command line tools\n\nAs with the SDKs, the Azure command line tools (including the [Azure CLI](/cli/azure/) and [Azure PowerShell](/powershell/azure/)) are designed to allow usage of Azure management services without regard for versions. Accessing new service features often requires a new version of a tool. New backward-compatible tool versions are released monthly. Versions with breaking changes are released approximately twice a year, or as required to fix critical security issues.\n\nThe Azure command line tools can occasionally expose preview features. These commands are marked with a `Preview` label and output a warning indicating limited support and potential changes in future tool versions.\n\n## Next steps\n\n- [Azure REST API specifications](https://github.com/Azure/azure-rest-api-specs)\n- [Microsoft REST API guidelines](https://github.com/microsoft/api-guidelines)\n- [Azure SDK general guidelines](https://azure.github.io/azure-sdk/general_introduction.html)\n\n"
  },
  {
    "path": "articles/intro/connect-to-azure-services.md",
    "content": "---\ntitle: Connect your app to Azure Services\ndescription: An overview of how to connect your applications to Azure.\nms.service: azure\nms.topic: overview\nms.date: 03/25/2026\n---\n\n# Connect your app to Azure services\n\nThis article is part four in a series of seven articles that help you get started with Azure.\n\n* Part 1: [Azure for developers overview](azure-developer-overview.md)\n* Part 2: [Key Azure services for developers](azure-developer-key-services.md)\n* Part 3: [Hosting applications on Azure](hosting-apps-on-azure.md)\n* Part 4: **Connect your app to Azure services**\n* Part 5: [How do I create and manage resources in Azure?](azure-developer-create-resources.md)\n* Part 6: [Key concepts for building Azure apps](azure-developer-key-concepts.md)\n* Part 7: [How am I billed?](azure-developer-billing.md)\n\nAzure offers many services that applications can use whether they're hosted in Azure or on-premises. For example, you can:\n\n- Store and retrieve files with Azure Blob Storage.\n- Add full-text search to your application with Azure AI Search.\n- Use Azure Service Bus to handle messaging between different components of a microservices architecture.\n- Use Text Analytics to identify and redact sensitive data in a document.\n- Call Azure OpenAI models to add generative AI capabilities like chat, summarization, and code generation.\n\nAzure services offer the benefit that they're fully managed by Azure.\n\n## Access Azure services from application code\n\nUse the Azure SDK, the Azure REST API, or the Azure AI Foundry SDK to access Azure services from your application code.\n\n- **Azure SDK** - Available for .NET, C++, Go, Java, JavaScript, Python, and Rust.\n- **Azure REST API** - Available for all languages.\n- **Azure AI Foundry SDK** - Available for Python, .NET, Java, and JavaScript for AI-specific workloads.\n\nWhen possible, use the Azure SDK to access Azure services from application code. Advantages include:\n\n- **Access Azure services like any other library.** You import the appropriate SDK package, create a client object, then call its methods to work with your Azure resource.\n- **Simplify authentication.** When you create an SDK client object, you include credentials, and the SDK handles authenticating your calls to Azure.\n- **Simplified programming model.** Internally, the Azure SDK calls the Azure REST API. The SDK includes built-in error handling, retry logic, and result pagination, making development simpler than calling the REST API directly.\n\n## Azure SDK\n\nThe Azure SDK lets you access Azure services from .NET, Java, JavaScript, Python, and Go. Install the required packages from each language's package manager, then call the SDK methods to access Azure resources.\n\n\n> [!VIDEO 80e061f0-39fd-439b-8fa3-aba064820634]\n\n\nFor more information about the Azure SDK, see the documentation in each language's developer center.\n\n| Language                                | &nbsp;     | Overview                                                                           | Package list                                                                                         |\n|-----------------------------------------|------------|------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|\n| ![.NET Logo](./media/logo-dotnet.png)   | .NET       |[Azure SDK for .NET overview](/dotnet/azure/sdk/azure-sdk-for-dotnet)               | [Azure SDK for .NET package list](/dotnet/azure/sdk/packages)                                        |\n| ![Java Logo](./media/logo-java.png)     | Java       |[Azure SDK for Java overview](../java/sdk/overview.md)                   | [Azure SDK for Java package list](../java/sdk/azure-sdk-library-package-index.md)         |\n| ![JavaScript Logo](./media/logo-js.png) | JavaScript |[Azure SDK for JavaScript overview](../javascript/core/use-azure-sdk.md) | [Azure SDK for JavaScript package list](../javascript/azure-sdk-library-package-index.md) |\n| ![Python Logo](./media/logo-python.png) | Python     |[Azure SDK for Python overview](../python/sdk/azure-sdk-overview.md)         | [Azure SDK for Python package list](../python/sdk/azure-sdk-library-package-index.md)         |\n| ![Golang Logo](./media/logo-golang.png) | Go         |[Azure SDK for Go overview](../go/overview.md)                           | [Azure SDK for Go package list](https://azure.github.io/azure-sdk/releases/latest/all/go.html)     |\n\n## Azure REST API\n\nUse the Azure REST API when the Azure SDK doesn't support your programming language. For details and the full list of operations, see the [Azure REST API overview](/rest/api/azure/).\n\n## Azure AI Foundry SDK\n\nWhen building AI applications, you can also use the [Azure AI Foundry SDK](/azure/foundry/how-to/develop/sdk-overview) (available for Python, .NET, Java, and JavaScript) to interact with Azure OpenAI models, manage prompts, and orchestrate AI workflows. For keyless authentication to AI services, see [Use Azure OpenAI without keys](../ai/keyless-connections.md).\n\n> [!div class=\"nextstepaction\"]\n> [Continue to part 5: How do I create and manage resources in Azure?](azure-developer-create-resources.md)\n"
  },
  {
    "path": "articles/intro/hosting-apps-on-azure.md",
    "content": "---\ntitle: Hosting applications on Azure\ndescription: An overview of the different ways to host your applications on Azure\nkeywords: azure app service, azure functions, azure virtual machines, azure container instances, azure container registry\nms.service: azure\nms.custom: devx-track-extended-java\nms.topic: overview\nms.date: 03/25/2026\n#CustomerIntent: As an experienced developer, I want to select the correct hosting services for my applications so that I can get the level of control versus responsibility to meet my business and team needs.\n---\n\n# Hosting applications on Azure\n\nThis article is part three in a series of seven articles that help developers get started with Azure.\n\n* Part 1: [Azure for developers overview](azure-developer-overview.md)\n* Part 2: [Key Azure services for developers](azure-developer-key-services.md)\n* Part 3: **Hosting applications on Azure**\n* Part 4: [Connect your app to Azure services](connect-to-azure-services.md)\n* Part 5: [How do I create and manage resources in Azure?](azure-developer-create-resources.md)\n* Part 6: [Key concepts for building Azure apps](azure-developer-key-concepts.md)\n* Part 7: [How am I billed?](azure-developer-billing.md)\n\nAzure offers several ways to host your application. This article suggests services that match your requirements. It isn't prescriptive. Mix and match services to meet your needs. Most production environments combine services to meet business and organizational needs.\n\nThe services you choose often come down to two considerations:\n- Do you prefer simplicity or control?\n- Do you prefer cloud-native (containers) or Azure-native (tailored tools and integrations)?\n\nThe following video explains the first consideration: simplicity versus control.\n\n> [!VIDEO c3791642-781c-49cc-8319-8798e9b3659f]\n\n## Simplicity and control\n\nAzure hosting services involve two key considerations:\n\n* **Simplicity versus control**\n    * Simple hosting platforms need less configuration and management but give you less control over the underlying infrastructure.\n    * Complex hosting platforms need more configuration and management but give you more control over the underlying infrastructure.\n* **Cloud-native versus Azure-native**\n    * Cloud-native can be thought of as cloud-portable. Use open-source workloads like containers and technologies like Dapr so you can deploy the applications you build to any cloud provider.\n    * Azure-native focuses on Azure-specific tools and technologies to manage infrastructure. These services include containers, code-first, low-code, and infrastructure tooling that emphasizes integration across Azure services.\n\n## Simplified hosting\n\nSimplified hosting solutions are fully managed by Azure. You're responsible for code and environment configuration. Azure manages the underlying runtime and infrastructure, including updates and patches. Simplified hosting is the Azure-native approach.\n\n* [Logic Apps][azure-logic-apps]: Create and run automated workflows with little to no code.\n* [Power Automate][power-automate]: Automate business processes and workflows.\n* [Azure Static Web Apps][azure-static-web-apps]: Deploy static web apps built with frameworks like Blazor or React.\n* [Azure Functions Apps][azure-functions]: Run serverless code or containers. \n\n## Balanced hosting\n\nBalanced hosting solutions balance the need for simplicity with the need for control. You're responsible for functionality such as code and environment configuration. Azure manages the underlying runtime and infrastructure, including updates and patches. You can also bring your own container to the service. Balanced hosting is both Azure-native and cloud-native.\n\n* [Azure App Service][azure-app-service]: Full-service web hosting including language runtimes, containers, and automation workloads.\n* [Azure Container Apps][azure-container-apps]: Serverless container hosting. \n* [Azure Spring Apps][azure-spring-apps]: Migrate Spring Boot applications to the Azure cloud.\n\n## Controlled hosting\n\nControlled hosting solutions give you full control over the underlying infrastructure. You're responsible for updates, patches, code, assets, and environment configuration. Controlled hosting is the cloud-native approach.\n\n* [Azure Virtual Machines][azure-virtual-machines]: Full control of the virtual machine.\n* [Azure Kubernetes Service][azure-kubernetes]: Full control of the Kubernetes cluster. \n\n## Hosting AI workloads\n\nIf your application includes AI models or agents, the same hosting services apply. The following services are popular for hosting AI workloads on Azure:\n\n- Azure Container Apps and Azure Kubernetes Service are popular choices for hosting AI inference endpoints and agent orchestrators\n- Azure Functions works well for event-driven AI pipelines that respond to new data.\n- For GPU-accelerated workloads, Azure Virtual Machines offer access to NVIDIA GPU instances.\n\nTo learn more about building AI apps on Azure, see [Overview of AI app development](../ai/azure-ai-for-developers.md).\n\n## Source code hosting\n\nFor developers new to Azure who want to start **new development**, use the following chart to find the suggested hosting solution.\n\n:::image type=\"content\" source=\"media/hosting-apps-on-azure/source-code-suggested-compute.png\" alt-text=\"Diagram showing no code, low code in the first box, code in the second box and container in the third box with recommended services for each box.\":::\n\n### No code or low code\n\nAzure supports no-code solutions as part of its cloud approach. \n\n* [Logic Apps][azure-logic-apps]: Use a visual designer with prebuilt operations to develop a workflow for your enterprise and business-to-business scenarios.\n* [Power Automate][power-automate] such as [Power apps][power-apps]: Use when you need to automate business processes and workflows within the Microsoft 365 organization.\n\n### Code vs container\n\n**Low-code** hosting solutions are designed to allow you to bring your code functionality without having to manage the application infrastructure.\n\n* [Azure Static Web Apps][azure-static-web-apps]: Deploy generated static web apps.\n* [Azure Functions][azure-functions]: Deploy code functions in supported languages without managing application infrastructure.\n\n**Code-first** hosting solutions host code so you deploy directly to the service.\n\n* [Azure App Service][azure-app-service]: Full-service web hosting.\n* [Azure Spring Apps][azure-spring-apps]: Spring Boot applications.\n\n**Container-first** hosting solutions are designed to host containers. The service provides container-specific configuration options and features. You're responsible for the compute used inside the container. The services which host containers move from managed control to full responsibility so you only take on the amount of container management you want.\n\n**Kubernetes-centric** orchestration hosting includes:\n\n|Service|Focus|Use|\n|--|--|--|\n|[Azure Kubernetes Service][azure-kubernetes]|Cloud-native| Use for Kubernetes clusters with a **declarative** approach using configuration files and external artifacts.|\n|[Azure Service Fabric][azure-service-fabric]|Azure-native|Use an **imperative** approach to deploying microservices across clusters of machines. It provides a programming model that allows developers to write code that describes the desired state of the system, and the Service Fabric runtime takes care of making the system match that state.|\n\n**Preconfigured** container hosting means the orchestration options are preconfigured for you. Your ability to communicate between containers or container clusters might require an additional service such as [Dapr](https://docs.dapr.io/).\n\n|Service|Use|\n|--|--|\n|[Azure App Service][azure-app-service]|Full-service web hosting|\n|[Azure Spring Apps][azure-spring-apps]|Spring Boot applications|\n|[Azure Container Apps][azure-container-apps]|Serverless container hosting|\n|[Azure Container Instances][azure-container-instances]|Simple single-container hosting|\n\nAzure provides a container registry to store and manage your container images or you can use a third-party container registry.\n\n|Service|Use|\n|--|--|\n|[Azure Container Registry][azure-container-registry]|Use when you build and host your own container images, which can be triggered with source code commits and base image updates.|\n\n## Serverless \n\n**Serverless** hosting solutions are designed to run stateless code, which includes a consumption-based pricing tier that scales to zero when not used. \n\n|Service|Use|\n|--|--|\n|[Azure Container Apps][azure-container-apps]|Container hosting|\n|[Azure Functions][azure-functions]|Code or container hosting|\n\n## Microservices\n\nMicroservices hosting solutions run small, independent services that work together to form a larger application. Microservices are typically deployed as containers.\n\n|Service|Use|\n|--|--|\n|[Azure Container Apps][azure-container-apps]|Use for serverless containerized microservices.|\n|[Azure Functions][azure-functions]|Use for serverless code or containerized microservices.|\n\n## Cloud edge\n\nCloud edge is a term to indicate if the cloud service is located to benefit the user (client) or the application (server).\n\n### Client compute\n\nClient compute runs on the client outside Azure. Client compute is typically used for client-side rendering and client-side processing such as browser-based or mobile applications.\n\n|Service|Use|\n|--|--|\n|[Azure Static Web Apps][azure-static-web-apps]|Use for static web apps that use client-side rendering such as React, Angular, Svelte, Vue, and Blazor.|\n\n### Client availability\n\n|Service|Use|\n|--|--|\n|[Azure Front Door][azure-frontdoor]|Use for all internet-facing applications to provide a global cached and secure network to your static and dynamic assets including DDoS protection, end-to-end TLS encryption, application firewalls, and geo-filtering.|\n\n### Server compute\n\nServer compute assets are files that are processed by the server before being served to the client. Dynamic assets are developed using back-end server compute, optionally integrated with other Azure services. \n\n|Service|Use|\n|--|--|\n|[Azure App Service][azure-app-service]|Use this service for typical web hosting. This supports a wide set of functionality API endpoints, full-stack applications, and background tasks. This service comes with many programming language runtimes and the ability to provide your own stack, language, or workload from a container.|\n|[Azure Functions][azure-functions]|Use this service to provide your own code in the supported languages for either HTTP endpoints or event-based triggers from Azure services.|\n|[Azure Spring Apps][azure-spring-apps]|Use to deploy Spring Boot applications without code changes.|\n|[Azure Container Apps][azure-container-apps]|Use to host managed microservices and containerized applications on a serverless platform.|\n|[Azure Container Instances][azure-container-instances]|Use this for simple container scenarios that don't need container orchestration.|\n|[Azure Kubernetes Service][azure-kubernetes]|Use this service when you need a Kubernetes cluster. The control plane to manage the cluster is created and provided for you at no extra cost.|\n\n### Server endpoint management\n\nServer endpoint management lets you manage server endpoints through a gateway that adds versioning, caching, transformation, API policies, and monitoring.\n\n|Service|Use|\n|--|--|\n|[Azure API Management][azure-apim]|Use this service when you productize your **REST, OpenAPI, and GraphQL APIs** with an API gateway including quotas and rate limits, authentication and authorization, transformation, and cached responses.|\n|[Azure Application Gateway][azure-application-gateway]|Use for **regional load balancing** (OSI layer 7). It can be used to route traffic based on URL path or host headers, and it supports SSL offloading, cookie-based session affinity, and Web Application Firewall (WAF) capabilities.|\n|[Azure Front Door][azure-frontdoor]|Use for **global load balancing** (OSI layer 7) to provide a global cached and secure network to your static and dynamic assets including DDoS protection, end-to-end TLS encryption, application firewalls, and geo-filtering.|\n|[Azure Traffic Manager][azure-traffic-manager]|Use for distributing traffic by **DNS** (OSI layer 7) to your public facing applications across the global Azure regions. Traffic Manager uses DNS to direct client requests to the appropriate service endpoint based on a traffic-routing method. It supports various traffic-routing methods such as priority, performance, and geographic routing. It's ideal for managing traffic across multiple regions or data centers.|\n\n### Automated compute\n\nAutomated compute is automated by an event such as a timed schedule or another Azure service and is typically used for background processing, batch processing, or long-running processes. \n\n|Service|Use|\n|--|--|\n|[Power Automate][power-automate]| Use when you need to automate business processes and workflows.|\n|[Azure Functions][azure-functions]|Use when you need to run code based on a timed schedule or in response to events in other Azure services.|\n|Container services ([Azure Container Instances][azure-container-instances], [Azure Kubernetes Service][azure-kubernetes], [Azure Container Apps][azure-container-apps])|Use for standard automatable workloads|\n|[Azure Batch][azure-batch]|Use when you need high-performance automation.|\n\n## Hybrid cloud\n\nHybrid cloud is a computing environment that connects a company's on-premises private cloud services and third-party public cloud into a single, flexible infrastructure for running the organization's applications and workloads. \n\n|Service|Use|\n|--|--|\n|[Azure Arc][azure-arc]|Use when need to manage your entire environment, both cloud and on-premises resources including security, governance, inventory, and management. |\n\nIf you don't need to maintain your own infrastructure, use Azure Stack HCI to run virtual machines on-premises.\n\n## High-performance computing\n\nHigh-performance computing (HPC) is the use of parallel processing for running advanced application programs efficiently, reliably and quickly. The term applies especially to systems that function above a teraflop or 10^12 floating-point operations per second. \n\n|Service|Use|\n|--|--|\n|[Azure Batch][azure-batch]|Azure Batch creates and manages a pool of compute nodes (virtual machines), installs the applications you want to run, and schedules jobs to run on the nodes. Developers can use Batch as a platform service to build SaaS applications or client apps where large-scale execution is required.|\n|[Azure BareMetal Instances][azure-bare-metal]|Use when you need to run in a nonvirtualized environment with root-level access to the operating system, storage, and network.|\n|[Azure Quantum workspace][quantum]|Use when you need to develop and experiment with quantum algorithms.|\n|[Microsoft Genomics][microsoft-genomics]|Use for ISO-certified, HIPAA-compliant genomic processing.|\n\nTo learn more, see [High-performance computing on Azure](/azure/architecture/topics/high-performance-computing).\n\n## Event-based compute\n\nEvent-based compute is compute that is triggered by an event such as a timed schedule or another Azure service. Event-based compute is typically used for background processing, batch processing, or long-running processes.\n\n|Service|Use|\n|--|--|\n|[Microsoft Copilot Studio][microsoft-copilot-studio]|Use when you need to create chatbots with a no-code interface.|\n|[Azure Functions][azure-functions]|Use when you need to run code based on a timed schedule or in response to events in other Azure services.|\n|[Azure Service Bus Messaging][azure-service-bus-messaging]|Use when you need to decouple applications and services.|\n\n## CI/CD compute\n\nCI/CD compute is compute that is used to build and deploy your application. \n\n| Service| Description| \n|--|--|\n|[Azure DevOps][azure-devops]|Use Azure DevOps for tight integration with the Azure cloud including authentication and authorization to the hosted agents, which build and deploy your application.|\n|[GitHub Actions][github-actions]| Use GitHub Actions to build and deploy your GitHub repository applications. Use the Azure CLI to securely access Azure within the action.|\n|[Azure Virtual Machines][azure-virtual-machines]|If you use another CI/CD system, you can use Azure Virtual Machines to host your CI/CD system.|\n\n## Java resources\n\n* [Java hosting options](/azure/architecture/guide/technology-choices/service-for-java-comparison)\n* [Java migration to Azure](/azure/developer/java/migration/)\n\n## Additional resources\n\n* [Azure Architecture Center: Choose an Azure compute service](/azure/architecture/guide/technology-choices/compute-decision-tree)\n\n[azure-apim]:/azure/api-management\n[azure-app-service]:/azure/app-service\n[azure-application-gateway]:/azure/application-gateway\n[azure-arc]:/azure/azure-arc\n[azure-bare-metal]:/azure/baremetal-infrastructure\n[azure-batch]:/azure/batch/batch-technical-overview\n[azure-container-apps]:/azure/container-apps\n[azure-container-instances]:/azure/container-instances\n[azure-container-registry]:/azure/container-registry\n[azure-devops]:/azure/devops\n[azure-frontdoor]:/azure/frontdoor\n[azure-functions]:/azure/azure-functions\n[azure-kubernetes]:/azure/aks\n[azure-logic-apps]:/azure/logic-apps/logic-apps-overview\n[azure-service-bus-messaging]:/azure/service-bus-messaging\n[azure-service-fabric]:/azure/service-fabric\n[azure-spring-apps]:/azure/spring-apps\n[azure-static-web-apps]:/azure/static-web-apps\n[azure-traffic-manager]:/azure/traffic-manager\n[azure-virtual-machines]:/azure/virtual-machines\n\n[github-actions]:/azure/developer/github/github-actions\n\n[microsoft-genomics]:/azure/genomics\n\n[power-apps]:/power-apps\n[power-automate]:/power-automate\n[microsoft-copilot-studio]:/microsoft-copilot-studio\n\n[quantum]:/azure/quantum\n\n\n> [!div class=\"nextstepaction\"]\n> [Continue to part 4: Connect your app to Azure services](connect-to-azure-services.md)\n\n"
  },
  {
    "path": "articles/intro/index.yml",
    "content": "### YamlMime:Landing\n\n# On-page H1/lede\ntitle: Introduction to Azure for developers\nsummary: |\n  Learn how you can build applications using Azure.\n\n# Search & metrics meta\nmetadata:\n  title: Introduction to Azure for developers\n  description: Learn how you can build applications using Azure.\n  author: PatAltimore\n  ms.author: patricka\n  ms.date: 09/30/2025\n  ms.topic: landing-page\n  ms.service: azure\n  ms.subservice: developer\n\nlandingContent:\n  # Card\n  - title: Get started\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Azure for developers\n            url: ./azure-developer-overview.md\n          - text: Key Azure services for developers\n            url: ./azure-developer-key-services.md\n          - text: Host applications on Azure\n            url: ./hosting-apps-on-azure.md\n          - text: Connect apps to Azure services\n            url: ./connect-to-azure-services.md\n          - text: Create Azure resources\n            url: ./azure-developer-create-resources.md\n          - text: Key concepts for building Azure apps\n            url: ./azure-developer-key-concepts.md\n          - text: Azure billing\n            url: ./azure-developer-billing.md\n      - linkListType: quickstart\n        links:\n          - text: Get started with Azure dev tools\n            url: ./quickstart-developer-tools.md\n  # Card\n  - title: Key developer scenarios\n    linkLists:\n      - linkListType: concept\n        links:\n          - text: AI development on Azure\n            url: /azure/developer/ai/azure-ai-for-developers\n          - text: Passwordless connections for Azure Services\n            url: ./passwordless-overview.md\n  # Card\n  - title: Developer centers\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: .NET on Azure\n            url: /dotnet/azure/\n          - text: Java on Azure \n            url: ../java/index.yml\n          - text: JavaScript on Azure\n            url: ../javascript/index.yml\n          - text: Python on Azure \n            url: ../python/index.yml\n          - text: Go on Azure\n            url: ../go/index.yml\n          - text: C++ on Azure\n            url: ../cpp/index.yml\n          - text: Rust on Azure\n            url: ../rust/index.yml"
  },
  {
    "path": "articles/intro/intro-zone-pivot-groups.yml",
    "content": "# YamlMime:ZonePivotGroups\ngroups:\n- id: intelligent-apps-languages\n  title: Intelligent Apps Languages\n  prompt: Choose a programming language\n  pivots:\n  - id: dotnet\n    title: .NET\n  - id: python\n    title: Python\n  - id: javascript\n    title: JavaScript\n  - id: java\n    title: Java\n  - id: golang\n    title: Go\n- id: intelligent-apps-languages-top-four\n  title: Intelligent Apps Languages\n  prompt: Choose a programming language\n  pivots:\n  - id: dotnet\n    title: .NET\n  - id: python\n    title: Python\n  - id: javascript\n    title: JavaScript\n  - id: java\n    title: Java\n- id: intelligent-apps-languages-python-dotnet\n  title: Intelligent Apps Python Dotnet\n  prompt: Choose a programming language\n  pivots:\n  - id: python\n    title: Python\n  - id: dotnet\n    title: .NET\n# Dina created just for Securing AI article\n- id: intelligent-apps-languages-python-dotnet-typescript\n  title: Intelligent Apps Python Dotnet TypeScript\n  prompt: Choose a programming language\n  pivots:\n  - id: python\n    title: Python\n  - id: dotnet\n    title: .NET\n  - id: typescript\n    title: TypeScript"
  },
  {
    "path": "articles/intro/passwordless-overview.md",
    "content": "---\ntitle: Passwordless connections for Azure services\ndescription: Describes the security challenges with passwords and introduces passwordless connections for Azure services.\nms.topic: overview\nms.date: 04/25/2025\nms.author: alexwolf\nauthor: alexwolfmsft\nms.service: azure\nms.custom: devx-track-java, devx-track-javaee, passwordless-dotnet, passwordless-go, passwordless-java, passwordless-js, passwordless-python\n---\n\n# Passwordless connections for Azure services\n\n> [!NOTE]\n> Passwordless connections is a language-agnostic feature spanning multiple Azure services. Although the current documentation focuses on a few languages and services, we're currently in the process of producing additional documentation for other languages and services.\n\nThis article describes the security challenges with passwords and introduces passwordless connections for Azure services.\n\n## Security challenges with passwords and secrets\n\nPasswords and secret keys should be used with caution, and developers must never place them in an unsecure location. Many apps connect to backend database, cache, messaging, and eventing services using usernames, passwords, and access keys. If exposed, these credentials could be used to gain unauthorized access to sensitive information such as a sales catalog that you built for an upcoming campaign, or customer data that must be private.\n\nEmbedding passwords in an application itself presents a huge security risk for many reasons, including discovery through a code repository. Many developers externalize such passwords using environment variables so that applications can load them from different environments. However, this only shifts the risk from the code itself to an execution environment. Anyone who gains access to the environment can steal passwords, which in turn, increases your data exfiltration risk.\n\nThe following code example demonstrates how to connect to Azure Storage using a storage account key. Many developers gravitate towards this solution because it feels familiar to options they've worked with in the past, even though it isn't an ideal solution. If your application currently uses access keys, consider migrating to passwordless connections.\n\n```csharp\n// Connection using secret access keys\nBlobServiceClient blobServiceClient = new(\n    new Uri(\"https://<storage-account-name>.blob.core.windows.net\"),\n    new StorageSharedKeyCredential(\"<storage-account-name>\", \"<your-access-key>\"));\n```\n\nDevelopers must be diligent to never expose these types of keys or secrets in an unsecure location. Many companies have strict security requirements to connect to Azure services without exposing passwords to developers, operators, or anyone else. They often use a vault to store and load passwords into applications, and further reduce the risk by adding password-rotation requirements and procedures. This approach, in turn, increases the operational complexity and, at times, leads to application connection outages.\n\n## Passwordless connections and Zero Trust\n\nYou can now use passwordless connections in your apps to connect to Azure-based services without any need to rotate passwords. In some cases, all you need is configuration&mdash;no new code is required. Zero Trust uses the principle of \"never trust, always verify, and credential-free\". This means securing all communications by trusting machines or users only after verifying identity and prior to granting them access to backend services.\n\nThe recommended authentication option for secure, passwordless connections is to use managed identities and Azure role-based access control (RBAC) in combination. With this approach, you don't have to manually track and manage many different secrets for managed identities because these tasks are securely handled internally by Azure.\n\nYou can configure passwordless connections to Azure services using Service Connector or you can configure them manually. Service Connector enables managed identities in app hosting services like Azure Spring Apps, Azure App Service, and Azure Container Apps. Service Connector also configures backend services with passwordless connections using managed identities and Azure RBAC, and hydrates applications with necessary connection information.\n\nIf you inspect the running environment of an application configured for passwordless connections, you can see the full connection string. The connection string carries, for example, a database server address, a database name, and an instruction to delegate authentication to an Azure authentication plugin, but it doesn't contain any passwords or secrets.\n\nThe following video illustrates passwordless connections from apps to Azure services, using Java applications as an example. Similar coverage for other languages is forthcoming.\n\n<br>\n\n> [!VIDEO https://www.youtube.com/embed/X6nR3AjIwJw]\n\n## Introducing DefaultAzureCredential\n\nPasswordless connections to Azure services through Microsoft Entra ID and Role Based Access control (RBAC) can be implemented using `DefaultAzureCredential` from the Azure Identity client libraries.\n\n> [!IMPORTANT]\n> Some languages must implement `DefaultAzureCredential` explicitly in their code, while others utilize `DefaultAzureCredential` internally through underlying plugins or drivers.\n\n`DefaultAzureCredential` supports multiple authentication methods and automatically determines which should be used at runtime. This approach enables your app to use different authentication methods in different environments (local dev vs. production) without implementing environment-specific code.\n\nThe order and locations in which `DefaultAzureCredential` searches for credentials varies between languages:\n\n- [.NET](/dotnet/api/overview/azure/Identity-readme?view=azure-dotnet&preserve-view=true#defaultazurecredential)\n- [C++](https://github.com/Azure/azure-sdk-for-cpp/tree/main/sdk/identity/azure-identity#defaultazurecredential)\n- [Go](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity#readme-defaultazurecredential)\n- [Java](/java/api/overview/azure/identity-readme?view=azure-java-stable&preserve-view=true#defaultazurecredential)\n- [JavaScript](/javascript/api/overview/azure/identity-readme?view=azure-node-latest&preserve-view=true#defaultazurecredential)\n- [Python](/python/api/overview/azure/identity-readme?view=azure-python&preserve-view=true#defaultazurecredential)\n\nFor example, when working locally with .NET, `DefaultAzureCredential` will generally authenticate using the account the developer used to sign-in to Visual Studio, Azure CLI, or Azure PowerShell. When the app is deployed to Azure, `DefaultAzureCredential` will automatically discover and use the [managed identity](/azure/active-directory/managed-identities-azure-resources/overview) of the associated hosting service, such as Azure App Service. No code changes are required for this transition.\n\n> [!NOTE]\n> A managed identity provides a security identity to represent an app or service. The identity is managed by the Azure platform and doesn't require you to provision or rotate secrets. You can read more about managed identities in the [overview](/azure/active-directory/managed-identities-azure-resources/overview) documentation.\n\nThe following code example demonstrates how to connect to Service Bus using passwordless connections. Other documentation describes how to migrate to this setup for a specific service in more detail. A .NET app can pass an instance of `DefaultAzureCredential` into the constructor of a service client class. `DefaultAzureCredential` will automatically discover the credentials that are available in that environment.\n\n```csharp\nServiceBusClient serviceBusClient = new(\n    new Uri(\"https://<your-service-bus-namespace>.blob.core.windows.net\"),\n    new DefaultAzureCredential());\n```\n\n## See also\n\nFor a more detailed explanation of passwordless connections, see the developer guide [Configure passwordless connections between multiple Azure apps and services](/azure/storage/common/multiple-identity-scenarios?toc=/azure/developer/intro/toc.json&bc=/azure/developer/intro/breadcrumb/toc.json).\n"
  },
  {
    "path": "articles/intro/quickstart-developer-tools.md",
    "content": "---\ntitle: \"Quickstart: Get started with Azure developer tools\"\ndescription: Get hands-on with the Azure Developer CLI, Azure Tools for VS Code, and GitHub Copilot for Azure.\nms.service: azure\nms.topic: quickstart\nms.date: 03/25/2026\nms.custom: devx-track-azdevcli\nai-usage: ai-generated\n---\n\n# Quickstart: Get started with Azure developer tools\n\nIn this quickstart, you use the core Azure developer tools to deploy a sample application to Azure. By the end, you have hands-on experience with:\n\n- Azure Developer CLI (azd) to scaffold and deploy a full-stack app\n- Azure Tools for VS Code extension pack to browse and manage your deployed resources\n- GitHub Copilot for Azure to get AI-assisted answers about your Azure resources\n\n## Prerequisites\n\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- A [GitHub Copilot](https://github.com/features/copilot) subscription - required by GitHub Copilot for Azure\n- Use either the local installation of the tools or the browser-based VS Code for the Web experience. For the local installation, ensure you have:\n    - [Visual Studio Code](https://code.visualstudio.com/)\n    - [Git](https://git-scm.com/downloads) - required by Azure Developer CLI to clone the template repository\n\n## Set up the tools\n\nYou can choose to use the tools directly in the browser with VS Code for the Web or install them locally. The browser-based experience is the fastest way to get started, while the local installation provides a local development environment.\n\n# [VS Code for the Web](#tab/vscode-web)\n\n[VS Code for the Web (vscode.dev/azure)](https://vscode.dev/azure) gives you a browser-based VS Code environment with CLIs and several extensions preinstalled. No local installation is required.\n\n1. Open [vscode.dev/azure](https://vscode.dev/azure) in your browser.\n1. Sign in by using your Azure account when prompted.\n1. Some Azure extensions are preinstalled. For all Azure tools, install the [Azure Tools extension pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) You can install it from the Extensions view in VS Code for the Web. Search for \"Azure Tools\" and select **Install**.\n\nYou now have access to the Azure Tools extensions and GitHub Copilot for Azure directly in the browser.\n\n:::image type=\"content\" source=\"media/quickstart-developer-tools/azure-extensions.png\" alt-text=\"Screenshot of VS Code for the Web showing Azure Tools extension pack details and installed Azure extensions list.\":::\n\nFor more information about using VS Code for the Web for Azure development, see [VS Code for the Web - Azure](https://code.visualstudio.com/docs/azure/vscodeforweb).\n\n# [Install tools locally](#tab/local-install)\n\nInstall the following tools locally to get a full development experience on your machine.\n\n1. The Azure Developer CLI (azd) is a command-line tool that simplifies provisioning and deploying applications to Azure. Follow the steps in [Install the Azure Developer CLI](../azure-developer-cli/install-azd.md) for your operating system.\n1. The [Azure Tools extension pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) includes extensions for Azure App Service, Azure Functions, Azure Storage, Azure Databases, and more.\n1. [GitHub Copilot for Azure](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azure-github-copilot) extends Copilot with Azure-specific knowledge so you can ask questions about your Azure resources, get deployment guidance, and troubleshoot problems.\n\n---\n\n## Deploy a sample app with azd\n\nUse the Azure Developer CLI to deploy a full-stack to-do application to Azure. This step creates all the Azure resources and deploys the application code.\n\n1. Open the terminal from the [Command Palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette) via **Terminal > Create New Terminal**.\n1. In the terminal, create and change into a new directory for your project.\n\n    ```bash\n    mkdir my-todo-app && cd my-todo-app\n    ```\n1. Initialize a project from a starter template. The `todo-nodejs-mongo` template is a full-stack application built with Node.js, Express, and MongoDB. The template includes an Azure Resource Manager (ARM) template that defines the required Azure resources, such as an App Service for hosting the application and an Azure Cosmos DB account for the database.\n\n    ```azdeveloper\n    azd init --template todo-nodejs-mongo\n    ```\n     When prompted, enter an environment name like `my-todo-dev`. Use this name as a prefix for the Azure resources.\n\n1. Sign in to Azure:\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. Provision Azure resources and deploy the application:\n\n    ```azdeveloper\n    azd up\n    ```\n\n    When prompted, select a subscription and region.\n    \n    The `azd up` command:\n    - Creates a resource group with the infrastructure defined in the template.\n    - Provisions the required Azure services, such as App Service and Azure Cosmos DB.\n    - Deploys the application code.\n\n    This process takes a few minutes. When it finishes, Azure Developer CLI displays the URL of your deployed application.\n\n1. Open the URL in your browser to verify the application is running. You see a to-do application where you can add and complete tasks.\n\nFor more information, see [What is the Azure Developer CLI](../azure-developer-cli/overview.md).\n\n## Browse resources with Azure Tools for VS Code\n\nNow use the Azure Tools extension to explore the resources that Azure Developer CLI created.\n\n1. Verify that you're signed in to Azure by running the following command in the terminal:\n\n    ```azdeveloper\n    azd auth status\n    ```\n\n    If the command returns your account details, you're already signed in. If not, sign in through VS Code:\n    - Open the Command Palette.\n    - Type **Azure: Sign In** and select it.\n    - Complete the sign-in flow in your browser.\n\n1. Open the Azure view by selecting the Azure icon in the Activity Bar (left sidebar). Expand **Resources** to see your Azure subscriptions. Make sure the resource list is grouped by **Resource Group** by selecting the **Group By** icon at the top of the Resources view and choosing **Resource Group**. Expand your subscription and find the resource group created by Azure Developer CLI. The resource group name starts with the environment name you chose when running `azd init`.\n\n    :::image type=\"content\" source=\"media/quickstart-developer-tools/azure-resources.png\" alt-text=\"Screenshot of VS Code Azure view showing resources grouped by resource group with the Group By menu open.\":::\n\n1. Explore the deployed resources:\n    - Expand the resource group to see the App Service, Cosmos DB account, and other resources.\n    - Right-click the **App Service** resource and select **Browse Website** to open your deployed app.\n    - Right-click the **Cosmos DB** account and select **Open in Portal** to view the database in the Azure portal.\n\n1. View application logs:\n    - Right-click the **App Service** resource.\n    - Select **Start Streaming Logs** to see live log output from your running application.\n    - Open your to-do app in a browser and add a task to see log entries appear.\n\nFor more information, see [Azure Tools extension pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack).\n\n## Use GitHub Copilot for Azure\n\nUse GitHub Copilot for Azure to learn about the resources you deployed and get guidance on next steps.\n\n1. In VS Code, open the [Copilot Chat](https://code.visualstudio.com/docs/copilot/chat/copilot-chat) view by selecting the chat icon in the activity bar.\n\n\n1. Ask for guidance on your application:\n\n    ```text\n    How can I add authentication to my Azure App Service?\n    ```\n\n    Copilot provides step-by-step guidance tailored to your deployed application.\n\nFor example prompts, see:\n\n- [Example prompts for learning about Azure and your application with GitHub Copilot for Azure](../github-copilot-azure/learn-examples.md)\n- [Example prompts for designing and developing your application with GitHub Copilot for Azure](../github-copilot-azure/design-develop-examples.md)\n- [Example prompts for deploying your application with GitHub Copilot for Azure](../github-copilot-azure/deploy-examples.md)\n\nFor more information about GitHub Copilot for Azure, see the [GitHub Copilot for Azure overview](../github-copilot-azure/introduction.md). \n\n## Clean up resources\n\nWhen you're done exploring, delete the Azure resources to avoid incurring charges:\n\n```azdeveloper\nazd down\n```\n\nThis command deletes all Azure resources created by `azd up`, including the resource group, App Service, and Cosmos DB account.\n\n## Next steps\n\nNow that you used the core Azure developer tools, explore more:\n\n- [Azure Developer CLI templates](../azure-developer-cli/azd-templates.md) - Find templates for different languages and architectures.\n- [GitHub Copilot for Azure documentation](../github-copilot-azure/introduction.md) - Learn more about AI-assisted Azure development.\n- [Azure Tools for VS Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) - Explore all available extensions.\n"
  },
  {
    "path": "articles/intro/whats-new.md",
    "content": "---\ntitle: \"Azure developer documentation: What's new\"\ndescription: \"What's new in the Azure developer documentation.\"\nms.date: 03/11/2026\nauthor: KarlErickson\nms.author: karler\nms.topic: whats-new\n---\n\n# Azure developer documentation: What's new\n\nWelcome to what's new in the [Azure developer documentation](../index.yml) for the last three months. This article lists some of the major changes to docs during this period.\n\n## What's new for February 2026\n\n### Azure Developer CLI (azd)\n\nNew articles:\n\n- [Layered provisioning](../azure-developer-cli/layered-provisioning.md)\n\n### Azure for JavaScript\n\nNew articles:\n\n- [Azure JavaScript samples catalog](../javascript/samples.md)\n\nUpdated articles:\n\n- [How to authenticate JavaScript apps with Azure services](../javascript/sdk/authentication/overview.md) - Update SDK Auth to use shared includes\n\n### Azure MCP Server\n\nNew articles:\n\n- [Azure Advisor tools for the Azure MCP Server overview](../azure-mcp-server/tools/azure-advisor.md)\n- [Azure Files tools for the Azure MCP Server overview](../azure-mcp-server/tools/azure-file-shares.md)\n- [Azure Migrate tools for the Azure MCP Server overview](../azure-mcp-server/tools/azure-migrate.md)\n- [Azure pricing tools for the Azure MCP Server](../azure-mcp-server/tools/azure-pricing.md)\n- [Azure Service Fabric tools for the Azure MCP Server overview](../azure-mcp-server/tools/azure-service-fabric.md)\n- [Azure Virtual Machines tools for the Azure MCP Server overview](../azure-mcp-server/tools/azure-virtual-machines.md)\n- [Quickstart: Integrate Azure MCP Server with GitHub Copilot CLI](../azure-mcp-server/how-to/github-copilot-cli.md)\n- [Quickstart: Integrate Azure MCP Server with GitHub Copilot SDK](../azure-mcp-server/how-to/github-copilot-sdk.md)\n\nUpdated articles:\n\n- [Azure Managed Lustre tools for Azure MCP Server overview](../azure-mcp-server/tools/azure-managed-lustre.md) - Update Managed Lustre for file system blob operations\n- [Azure Monitor tools for the Azure MCP Server overview](../azure-mcp-server/tools/azure-monitor.md) - updated MCP tools for Azure Monitor for tool consolidation\n- [What is the Azure MCP Server?](../azure-mcp-server/overview.md) - Update MCP Overview & Landing\n- [Get started using the Azure MCP Server with Visual Studio Code](../azure-mcp-server/get-started/tools/visual-studio-code.md) - Add note about install version\n- [Azure Load Testing Tools - Azure MCP Server](../azure-mcp-server/tools/azure-load-testing.md) - Update Load Testing for tool consolidation\n- [Azure Storage Tools](../azure-mcp-server/tools/azure-storage.md) - Update Storage with new table tool\n\n## What's new for January 2026\n\n### Azure Developer CLI (azd)\n\nNew articles:\n\n- [Azure Developer CLI publishing workflows](../azure-developer-cli/publishing-workflows.md)\n- [Configure a proxy server for the Azure Developer CLI](../azure-developer-cli/configure-proxy.md)\n- [Full-stack deployment templates for Azure Developer CLI](../azure-developer-cli/full-stack-templates.md)\n- [Full-stack deployment with Azure Developer CLI](../azure-developer-cli/full-stack-deployment.md)\n\n### Azure for Java\n\nNew articles:\n\n- [Migrate Java apps to Azure by using GitHub Copilot modernization via custom agent](../java/migration/migrate-github-copilot-app-modernization-for-java-custom-agent.md)\n- [Optimize chat results for migrating Java apps to Azure](../java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-chat-window.md)\n- [Passwordless authentication with Spring Cloud Azure](../java/spring-framework/passwordless-authentication.md)\n\n### Azure for JavaScript\n\nUpdated articles:\n\n- [Authenticate JavaScript apps to Azure services using the Azure Identity library](../javascript/sdk/authentication/overview.md) - Align JavaScript SDK authentication overview and service principal article with .NET structure\n- [Authenticate to Azure resources from JavaScript apps hosted on-premises](../javascript/sdk/authentication/on-premises-apps.md) - Update JavaScript on-premises authentication article using ClientSecretCredential\n\n### Azure for Python\n\nNew articles:\n\n- [Authenticate Azure-hosted Python apps to Azure resources using a system-assigned managed identity](../python/sdk/authentication/system-assigned-managed-identity.md)\n- [Authenticate Azure-hosted Python apps to Azure resources using a user-assigned managed identity](../python/sdk/authentication/user-assigned-managed-identity.md)\n\nUpdated articles:\n\n- [Authenticate Python apps to Azure services during local development using developer accounts](../python/sdk/authentication/local-development-dev-accounts.md) - Update \"Authenticate Python apps to Azure service during local development using developer accounts\"\n\n### Azure MCP Server\n\nNew articles:\n\n- [Azure MCP Server concepts](../azure-mcp-server/concepts.md)\n- [Azure Policy tools for Azure MCP Server overview](../azure-mcp-server/tools/azure-policy.md)\n- [Manage Azure Functions with Azure MCP Server](../azure-mcp-server/services/azure-mcp-server-for-functions.md)\n- [Manage Azure Key Vault with Azure MCP Server](../azure-mcp-server/services/azure-mcp-server-for-key-vault.md)\n- [Manage Azure Redis with Azure MCP Server](../azure-mcp-server/services/azure-mcp-server-for-redis.md)\n- [Azure File Sync Tools](../azure-mcp-server/tools/azure-file-sync.md)\n\nUpdated articles:\n\n- [Azure Key Vault tools for the Azure MCP Server overview](../azure-mcp-server/tools/azure-key-vault.md) - MCP - kv - fix required params\n- [Azure Managed Lustre tools for Azure MCP Server overview](../azure-mcp-server/tools/azure-managed-lustre.md) - Azure MCP server: new auto-import and auto-export tools for Managed Lustre\n\n## What's new for December 2025\n\n### Azure Developer CLI (azd)\n\nUpdated articles:\n\n- [Azure Developer CLI reference](../azure-developer-cli/reference.md) - Update reference documents for Azure CLI @ 1.22.5\n\n### Azure for C++\n\nNew articles:\n\n- [Authenticate Azure-hosted C++ apps to Azure resources using a system-assigned managed identity](../cpp/sdk/authentication/system-assigned-managed-identity.md)\n- [Authenticate Azure-hosted C++ apps to Azure resources using a user-assigned managed identity](../cpp/sdk/authentication/user-assigned-managed-identity.md)\n- [Authenticate C++ apps to Azure services during local development using developer accounts](../cpp/sdk/authentication/local-development-dev-accounts.md)\n- [Authenticate C++ apps to Azure services during local development using service principals](../cpp/sdk/authentication/local-development-service-principal.md)\n\nUpdated articles:\n\n- [Authenticate C++ apps to Azure services using the Azure Identity library](../cpp/sdk/authentication/overview.md) - Add C++ authentication articles\n\n### Azure for JavaScript\n\nUpdated articles:\n\n- [Deployment JavaScript app to Azure overview](../javascript/how-to/deploy-web-app.md) - Update JavaScript deployment article with modern Azure services\n- [Developing Serverless Node.js Apps with Azure Functions](../javascript/how-to/develop-serverless-apps.md) - Refresh serverless Node.js article with 2025 Azure Functions features\n- [Tutorial: Upload an image to an Azure Storage blob with TypeScript](../javascript/tutorial/browser-file-upload-azure-storage-blob.md) - Update article and sample code to use latest Azure SDK for JavaScript/TypeScript libraries and infrastructure with Azure Developer CLI\n- [Tutorial: Build a LangChain.js agent with Azure AI Search](../javascript/ai/langchain-agent-on-azure.md) - Update article and sample code to use latest SDK and infrastructure with Azure Developer CLI\n\n### Azure for Python\n\nNew articles:\n\n- [Authenticate Python apps to Azure services during local development using brokered authentication](../python/sdk/authentication/local-development-broker.md)\n\n### Azure MCP Server\n\nUpdated articles:\n\n- [Get started with the Azure MCP Server using Visual Studio](../azure-mcp-server/get-started/tools/visual-studio.md?tabs=manual&pivots=visual-studio-2026) - Update for Visual Studio 2026 release\n\n### GitHub Copilot modernization\n\nNew articles:\n\n- [Configure settings for GitHub Copilot modernization to optimize the experience for IntelliJ](../github-copilot-app-modernization/configure-settings-intellij.md)\n- [Customize the Java project upgrade plan when using GitHub Copilot modernization](../github-copilot-app-modernization/customize-upgrade-plan.md)\n- [GitHub Copilot modernization Java utilities](../github-copilot-app-modernization/tools.md)\n- [Quickstart: generate Java unit tests with GitHub Copilot modernization](../github-copilot-app-modernization/quickstart-unit-tests.md)\n- [Quickstart: upgrade a Java project with GitHub Copilot modernization](../github-copilot-app-modernization/quickstart-upgrade.md)\n- [Upgrade a Java framework or third-party dependency by using GitHub Copilot modernization](../github-copilot-app-modernization/framework-upgrade.md)\n\n## TypeSpec on Azure\n\nUpdated articles:\n\n- [Resources for developing TypeSpec apps](../typespec/resources.md) updated to include latest information\n"
  },
  {
    "path": "articles/java/.openpublishing.redirection.java.json",
    "content": "{\n    \"redirections\": [\n        {\n            \"source_path\": \"sdk/get-started.md\",\n            \"redirect_url\": \"/previous-versions/azure/developer/java/sdk/get-started\",\n            \"redirect_document_id\": false\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/cicd-microprofile-vsts.md\",\n            \"redirect_url\": \"/azure/developer/java/ee/index\"\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/deploy-microprofile-to-container-instances.md\",\n            \"redirect_url\": \"/azure/developer/java/ee/index\"\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/deploy-microprofile-helidon-java-app-with-maven-plugin.md\",\n            \"redirect_url\": \"/azure/developer/java/ee/index\"\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/deploy-microprofile-to-web-app-for-containers.md\",\n            \"redirect_url\": \"/azure/developer/java/ee/index\"\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/deploy-microprofile-kumuluzee-java-app-with-maven-plugin.md\",\n            \"redirect_url\": \"/azure/developer/java/ee/index\"\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/deploy-microprofile-payara-micro-java-app-with-maven-plugin.md\",\n            \"redirect_url\": \"/azure/developer/java/ee/index\"\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/deploy-microprofile-open-liberty-java-app-with-maven-plugin.md\",\n            \"redirect_url\": \"/azure/developer/java/ee/index\"\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/cicd-microprofile.md\",\n            \"redirect_url\": \"/azure/developer/java/ee/index\"\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/configure-microprofile-with-keyvault.md\",\n            \"redirect_url\": \"/azure/developer/java/ee/index\"\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/index.yml\",\n            \"redirect_url\": \"/azure/developer/java/ee/index\"\n        },\n        {\n            \"source_path\": \"eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin.md\",\n            \"redirect_url\": \"/azure/app-service/quickstart-java?tabs=quarkus&pivots=java-javase\"\n        },\n        {\n            \"source_path\": \"ee/jboss-eap-single-server-azure-vm.md\",\n            \"redirect_url\": \"/azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\"\n        },\n        {\n            \"source_path\": \"ee/jboss-eap-cluster-azure-vms.md\",\n            \"redirect_url\": \"/azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\"\n        },\n        {\n            \"source_path\": \"ee/weblogic-server-azure-virtual-machine.md\",\n            \"redirect_url\": \"/azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine\"\n        },\n        {\n            \"source_path\": \"ee/weblogic-server-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/aks/howto-deploy-java-wls-app\"\n        },\n        {\n            \"source_path\": \"ee/how-to-configure-passwordless-datasource.md\",\n            \"redirect_url\": \"/azure/developer/java/ee/how-to-configure-passwordless-datasource-wls\"\n        },\n        {\n            \"source_path\": \"fundamentals/java-jdk-docker-images.md\",\n            \"redirect_url\": \"/azure/developer/java/openjdk/containers\"\n        },\n        {\n            \"source_path\": \"fundamentals/java-jdk-flight-recorder-and-mission-control.md\",\n            \"redirect_url\": \"/azure/developer/java/openjdk/java-jdk-flight-recorder-and-mission-control?toc=/azure/developer/java/fundamentals/toc.json&bc=/azure/developer/breadcrumb/toc.json\"\n        },\n        {\n            \"source_path\": \"fundamentals/java-jdk-long-term-support.md\",\n            \"redirect_url\": \"/azure/developer/java/fundamentals/java-support-on-azure\"\n        },\n        {\n            \"source_path\": \"fundamentals/reasons-to-move-to-java-11.md\",\n            \"redirect_url\": \"/azure/developer/java/openjdk/reasons-to-move-to-java-11?toc=/azure/developer/java/fundamentals/toc.json&bc=/azure/developer/breadcrumb/toc.json\"\n        },\n        {\n            \"source_path\": \"fundamentals/transition-from-java-7-to-java-8.md\",\n            \"redirect_url\": \"/azure/developer/java/openjdk/transition-from-java-7-to-java-8?toc=/azure/developer/java/fundamentals/toc.json&bc=/azure/developer/breadcrumb/toc.json\"\n        },\n        {\n            \"source_path\": \"fundamentals/transition-from-java-8-to-java-11.md\",\n            \"redirect_url\": \"/azure/developer/java/openjdk/transition-from-java-8-to-java-11?toc=/azure/developer/java/fundamentals/toc.json&bc=/azure/developer/breadcrumb/toc.json\"\n        },\n        {\n            \"source_path\": \"java-azure-tools.md\",\n            \"redirect_url\": \"/azure/developer/java/fundamentals/java-azure-tools\"\n        },\n        {\n            \"source_path\": \"java-get-started-with-logzio.md\",\n            \"redirect_url\": \"/azure/developer/java/fundamentals/java-get-started-with-logzio\"\n        },\n        {\n            \"source_path\": \"java-sdk-add-certificate-ca-store.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"java-sdk-azure-authenticate.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/identity\"\n        },\n        {\n            \"source_path\": \"java-sdk-azure-concepts.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/overview\"\n        },\n        {\n            \"source_path\": \"java-sdk-azure-containers-samples.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/containers-samples\"\n        },\n        {\n            \"source_path\": \"java-sdk-azure-get-started.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/get-started\"\n        },\n        {\n            \"source_path\": \"java-sdk-azure-log.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/logging-overview\"\n        },\n        {\n            \"source_path\": \"java-sdk-azure-release-notes.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"java-sdk-azure-security-samples.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/security-samples\"\n        },\n        {\n            \"source_path\": \"java-sdk-azure-sql-database-samples.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/sql-database-samples\"\n        },\n        {\n            \"source_path\": \"java-sdk-azure-virtual-machine-samples.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/virtual-machine-samples\"\n        },\n        {\n            \"source_path\": \"java-sdk-azure-web-apps-samples.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/web-apps-samples\"\n        },\n        {\n            \"source_path\": \"java-sdk-configure-webapp-sources.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"java-sdk-manage-sql-elastic-pools.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"java-sdk-manage-storage-accounts.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"java-sdk-manage-virtual-machines.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"java-sdk-manage-virtual-networks.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"java-sdk-manage-vm-scalesets.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"java-sdk-virtual-machines-in-parallel.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/virtual-machine-samples\"\n        },\n        {\n            \"source_path\": \"migrate-java-se-to-java-se-app-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/index\"\n        },\n        {\n            \"source_path\": \"migrate-jboss-eap-to-wildfly-on-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-jboss-eap-to-azure-redhat-openshift\"\n        },\n        {\n            \"source_path\": \"migrate-tomcat-to-containers-on-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-tomcat-to-containers-on-azure-kubernetes-service\"\n        },\n        {\n            \"source_path\": \"migrate-tomcat-to-tomcat-app-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-tomcat-to-tomcat-app-service\"\n        },\n        {\n            \"source_path\": \"migrate-weblogic-to-virtual-machines.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-weblogic-to-virtual-machines\"\n        },\n        {\n            \"source_path\": \"migrate-weblogic-to-wildfly-on-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-weblogic-to-azure-kubernetes-service\"\n        },\n        {\n            \"source_path\": \"migrate-websphere-to-wildfly-on-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-websphere-to-azure-kubernetes-service\"\n        },\n        {\n            \"source_path\": \"migrate-wildfly-to-wildfly-on-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-jboss-eap-to-jboss-eap-on-azure-app-service\"\n        },\n        {\n            \"source_path\": \"migration-overview.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migration-overview\"\n        },\n        {\n            \"source_path\": \"migration/cloud-suitability-analyzer.md\",\n            \"redirect_url\": \"/previous-versions/azure/developer/java/migration/cloud-suitability-analyzer\",\n            \"redirect_document_id\": false\n        },\n        {\n            \"source_path\": \"migration/migrate-java-se-to-java-se-app-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/index\"\n        },\n        {\n            \"source_path\": \"migration/migrate-spring-boot-to-azure-spring-apps.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/index\"\n        },\n        {\n            \"source_path\": \"migration/migrate-spring-cloud-to-azure-spring-apps.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/index\"\n        },\n        {\n            \"source_path\": \"migration/migrate-spring-boot-to-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/index\"\n        },\n        {\n            \"source_path\": \"migration/migrate-spring-boot-to-azure-spring-cloud.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-spring-boot-to-azure-spring-apps\"\n        },\n        {\n            \"source_path\": \"migration/migrate-spring-cloud-to-azure-spring-cloud.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-spring-cloud-to-azure-spring-apps\"\n        },\n        {\n            \"source_path\": \"migration/migrate-tomcat-to-azure-spring-cloud.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-tomcat-to-azure-spring-apps\"\n        },\n        {\n            \"source_path\": \"migration/appcat.md\",\n            \"redirect_url\": \"/azure/migrate/appcat/java?toc=/azure/developer/java/migration/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\"\n        },\n        {\n            \"source_path\": \"migration/migrate-weblogic-with-aad-ldap.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-weblogic-with-entra-id-via-ldap\"\n        },\n        {\n            \"source_path\": \"migration/migrate-tomcat-to-azure-spring-apps.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-tomcat-to-tomcat-app-service\"\n        },\n        {\n            \"source_path\": \"migration/migrate-github-copilot-app-modernization-for-java-predefined-formula.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-github-copilot-app-modernization-for-java-predefined-tasks\"\n        },\n        {\n            \"source_path\": \"migration/migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-formula.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-add-certificate-ca-store.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-azure-authenticate.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/identity\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-azure-concepts.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/overview\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-azure-containers-samples.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/containers-samples\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-azure-get-started.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/get-started\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-azure-log.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/logging-overview\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-azure-release-notes.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-azure-security-samples.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/security-samples\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-azure-sql-database-samples.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/sql-database-samples\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-azure-virtual-machine-samples.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/virtual-machine-samples\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-azure-web-apps-samples.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/web-apps-samples\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-configure-webapp-sources.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-manage-sql-elastic-pools.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-manage-storage-accounts.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-manage-virtual-machines.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-manage-virtual-networks.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-manage-vm-scalesets.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk\"\n        },\n        {\n            \"source_path\": \"sdk/java-sdk-virtual-machines-in-parallel.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/virtual-machine-samples\"\n        },\n        {\n            \"source_path\": \"spring-framework/spring-app-service-e2e.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework\"\n        },\n        {\n            \"source_path\": \"spring-framework/configure-spring-boot-java-applicationinsights.md\",\n            \"redirect_url\": \"/azure/azure-monitor/app/java-in-process-agent\"\n        },\n        {\n            \"source_path\": \"spring-framework/configure-spring-boot-starter-java-app-with-azure-storage-api.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework\"\n        },\n        {\n            \"source_path\": \"spring-framework/configure-spring-data-gremlin-java-app-with-cosmos-db.md\",\n            \"redirect_url\": \"/azure/developer/java/quickstarts/data\"\n        },\n        {\n            \"source_path\": \"spring-framework/deploy-containerized-spring-boot-java-app-with-maven-plugin.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework/deploy-spring-boot-java-app-on-linux\"\n        },\n        {\n            \"source_path\": \"spring-framework/deploy-spring-boot-java-app-from-container-registry-using-maven-plugin.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework/deploy-spring-boot-java-app-on-linux\"\n        },\n        {\n            \"source_path\": \"spring-framework/deploy-spring-boot-java-app-using-fabric8-maven-plugin.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework\"\n        },\n        {\n            \"source_path\": \"spring-framework/deploy-spring-boot-java-app-with-maven-plugin.md\",\n            \"redirect_url\": \"/azure/app-service/quickstart-java?tabs=javase&pivots=platform-linux\"\n        },\n        {\n            \"source_path\": \"spring-framework/spring-boot-starters-for-azure.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework/spring-cloud-azure-overview\"\n        },\n        {\n            \"source_path\": \"spring-framework/spring-cloud-azure-appendix.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework/developer-guide-overview\"\n        },\n        {\n            \"source_path\": \"spring-framework/spring-cloud-azure.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework/developer-guide-overview\"\n        },\n        {\n            \"source_path\": \"spring-framework/spring-messaging-support.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework/spring-messaging-event-hubs-support\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-azure-project-properties.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-azure-role-properties.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-azure-service-endpoints.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-azure-storage-account-list.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-create-hello-world-web-app-legacy-version.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/create-hello-world-web-app\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-create-hello-world-web-app.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/create-hello-world-web-app\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-deploying-large-deployments.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-displaying-javadoc-content-for-azure-libraries.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/displaying-javadoc-content-for-azure-libraries\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-enable-session-affinity.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-enabling-remote-access-for-azure-deployments.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-hello-world-web-app-linux.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/hello-world-web-app-linux\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-installation.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/installation\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-managing-redis-caches-using-azure-explorer.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/managing-redis-caches-using-azure-explorer\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-managing-storage-accounts-using-azure-explorer.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/managing-storage-accounts-using-azure-explorer\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-managing-virtual-machines-using-azure-explorer.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/managing-virtual-machines-using-azure-explorer\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-publish-as-docker-container.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-publish-spring-boot-docker-app.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-sign-in-instructions.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/sign-in-instructions\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse-whats-new.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/whats-new\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/azure-toolkit-for-eclipse.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/create-hello-world-web-app-legacy-version.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse/create-hello-world-web-app\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/displaying-javadoc-content-for-azure-libraries.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/hello-world-web-app-linux.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-eclipse/whats-new.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-eclipse\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-create-hello-world-web-app-legacy-version.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij/create-hello-world-web-app\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-create-hello-world-web-app.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij/create-hello-world-web-app\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-hello-world-web-app-linux.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij/hello-world-web-app-linux\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-installation.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij/installation\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-managing-redis-caches-using-azure-explorer.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij/managing-redis-caches-using-azure-explorer\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-managing-storage-accounts-using-azure-explorer.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij/managing-storage-accounts-using-azure-explorer\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-managing-virtual-machines-using-azure-explorer.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij/managing-virtual-machines-using-azure-explorer\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-publish-as-docker-container.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-publish-spring-boot-docker-app.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-sign-in-instructions.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij/sign-in-instructions\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij-whats-new.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij/whats-new\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/azure-toolkit-for-intellij.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/create-hello-world-web-app-legacy-version.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/installation.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/quickstart-functions.md\",\n            \"redirect_url\": \"/azure/azure-functions/functions-create-maven-intellij?toc=/azure/developer/java/toolkit-for-intellij/toc.json&bc=/azure/developer/breadcrumb/toc.json\"\n        },\n        {\n            \"source_path\": \"toolkit-for-intellij/whats-new.md\",\n            \"redirect_url\": \"/azure/developer/java/toolkit-for-intellij\"\n        },\n        {\n            \"source_path\": \"quickstarts/azure-ai-for-java-developers.md\",\n            \"redirect_url\": \"/azure/developer/java/ai/azure-ai-for-java-developers\"\n        },\n        {\n            \"source_path\": \"quickstarts/get-started-app-chat-template.md\",\n            \"redirect_url\": \"/azure/developer/java/ai/get-started-app-chat-template\"\n        },\n        {\n            \"source_path\": \"quickstarts/get-started-app-chat-scaling-with-azure-container-apps.md\",\n            \"redirect_url\": \"/azure/developer/java/ai/get-started-app-chat-scaling-with-azure-container-apps\"\n        },\n        {\n            \"source_path\": \"azure-ai/index.yml\",\n            \"redirect_url\": \"/azure/developer/java/ai/index\"\n        },\n        {\n            \"source_path\": \"azure-ai/azure-ai-for-java-developers.md\",\n            \"redirect_url\": \"/azure/developer/java/ai/azure-ai-for-java-developers\"\n        },\n        {\n            \"source_path\": \"azure-ai/get-started-app-chat-scaling-with-azure-container-apps.md\",\n            \"redirect_url\": \"/azure/developer/java/ai/get-started-app-chat-scaling-with-azure-container-apps\"\n        },\n        {\n            \"source_path\": \"azure-ai/get-started-app-chat-template.md\",\n            \"redirect_url\": \"/azure/developer/java/ai/get-started-app-chat-template\"\n        },\n        {\n            \"source_path\": \"sdk/identity.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/authentication/overview\"\n        },\n        {\n            \"source_path\": \"sdk/identity-azure-hosted-auth.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/authentication/azure-hosted-apps\"\n        },\n        {\n            \"source_path\": \"sdk/identity-service-principal-auth.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/authentication/service-principal\"\n        },\n        {\n            \"source_path\": \"sdk/identity-dev-env-auth.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/authentication/dev-env\"\n        },\n        {\n            \"source_path\": \"sdk/identity-user-auth.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/authentication/user\"\n        },\n        {\n            \"source_path\": \"identity/deploy-spring-boot-to-azure-spring-apps.md\",\n            \"redirect_url\": \"/azure/developer/java/identity/deploy-spring-boot-to-azure-container-apps\"\n        },\n        {\n            \"source_path\": \"spring-framework/configuration-properties-azure-active-directory.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework/configuration-properties-entra\"\n        },\n        {\n            \"source_path\": \"spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-entra\"\n        },\n        {\n            \"source_path\": \"spring-framework/spring-boot-starter-for-azure-active-directory-developer-guide.md\",\n            \"redirect_url\": \"/azure/developer/java/spring-framework/spring-boot-starter-for-entra-developer-guide\"\n        },\n        {\n            \"source_path\": \"sdk/troubleshooting-authentication-user-credential.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/troubleshooting-authentication-overview\"\n        },\n        {\n            \"source_path\": \"migration/migrate-jboss-eap-to-wildfly-on-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-jboss-eap-to-azure-redhat-openshift\"\n        },\n        {\n            \"source_path\": \"migration/migrate-weblogic-to-wildfly-on-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-weblogic-to-azure-kubernetes-service\"\n        },\n        {\n            \"source_path\": \"migration/migrate-websphere-to-wildfly-on-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-websphere-to-azure-kubernetes-service\"\n        },\n        {\n            \"source_path\": \"migration/migrate-wildfly-to-wildfly-on-azure-kubernetes-service.md\",\n            \"redirect_url\": \"/azure/developer/java/migration/migrate-jboss-eap-to-jboss-eap-on-azure-app-service\"\n        },\n        {\n            \"source_path\": \"learning-resources/index.yml\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"learning-resources/books.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"learning-resources/certifications.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"learning-resources/fundamentals.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"learning-resources/more-resources.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"learning-resources/overview.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"learning-resources/samples.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"learning-resources/workshops-videos.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/index.yml\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/caching.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/cognitive-services.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/compute.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/data.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/devops.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/directories.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/messaging-and-eventing.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/monitoring.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/networking.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/secrets-and-configuration-management.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"quickstarts/storage.md\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"spring/index.yml\",\n            \"redirect_url\": \"/azure/developer/java/index\"\n        },\n        {\n            \"source_path\": \"sdk/authentication/azure-hosted-apps.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/authentication/system-assigned-managed-identity\",\n            \"redirect_document_id\": false\n        },\n        {\n            \"source_path\": \"sdk/authentication/dev-env.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/authentication/local-development-dev-accounts\",\n            \"redirect_document_id\": true\n        },\n        {\n            \"source_path\": \"sdk/authentication/user.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/authentication/local-development-dev-accounts\",\n            \"redirect_document_id\": false\n        },\n        {\n            \"source_path\": \"sdk/authentication/service-principal.md\",\n            \"redirect_url\": \"/azure/developer/java/sdk/authentication/local-development-service-principal\",\n            \"redirect_document_id\": true\n        }\n    ]\n}\n"
  },
  {
    "path": "articles/java/ai/azure-ai-for-java-developers.md",
    "content": "---\ntitle: Develop Java Apps that Use Foundry Tools\ndescription: This article provides an organized list of resources about Azure AI scenarios for Java developers, including documentation and code samples.\nms.topic: overview\nms.date: 01/30/2026\nms.custom: devx-track-java, overview, devx-track-extended-java, build-2024-intelligent-apps\n---\n\n# Develop AI apps with Java\n\nThis article contains an organized list of the best learning resources for Java developers who are getting started building AI apps. Resources include popular quickstart articles, reference samples, documentation, training courses, and so on.\n\n[!INCLUDE [azure-ai-for-developers-java](../../ai/includes/azure-ai-for-developers-java.md)]\n"
  },
  {
    "path": "articles/java/ai/get-started-app-chat-scaling-with-azure-container-apps.md",
    "content": "---\ntitle: Scale OpenAI for Java Chat Sample Using RAG\ndescription: Learn how to add load balancing to your Java solution to extend the chat app beyond the Azure OpenAI token and model quota limits. \nms.date: 01/30/2026\nms.topic: get-started\nms.custom: devx-track-java, devx-track-java-ai, devx-track-extended-java, build-2024-intelligent-apps\n# CustomerIntent: As a Java developer new to Azure OpenAI, I want to scale my OpenAI capacity to avoid rate limit errors.\n---\n\n# Scale OpenAI for Java chat using RAG with Azure Container Apps\n\n[!INCLUDE [aca-load-balancer-intro](../../ai/includes/scaling-load-balancer-introduction-azure-container-apps.md)]\n\n## Prerequisites\n\n* An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\n* [Dev containers](https://containers.dev/) are available for both samples, with all dependencies required to complete this article. You can run the dev containers in GitHub Codespaces in a browser, or locally using Visual Studio Code.\n\n    ### [Codespaces (recommended)](#tab/github-codespaces)\n\n    * A GitHub account.\n\n    ### [Visual Studio Code](#tab/visual-studio-code)\n\n    * [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running.\n    * [Visual Studio Code](https://code.visualstudio.com/)\n    * [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n    ---\n\n[!INCLUDE [scaling-load-balancer-aca-procedure.md](../../ai/includes/scaling-load-balancer-procedure-azure-container-apps.md)]\n\n[!INCLUDE [py-deployment-procedure](../../ai/includes/redeploy-procedure-chat.md)]\n\n[!INCLUDE [logs](../../ai/includes/scaling-load-balancer-logs-azure-container-apps.md)]\n\n[!INCLUDE [capacity.md](../../ai/includes/scaling-load-balancer-capacity.md)]\n\n[!INCLUDE [py-aca-cleanup](../../ai/includes/scaling-load-balancer-cleanup-azure-container-apps.md)]\n\n## Sample code\n\nThe following samples are used in this article:\n\n* [Java chat app with RAG](https://github.com/Azure-Samples/azure-search-openai-demo-java)\n* [Load Balancer with Azure Container Apps](https://github.com/Azure-Samples/openai-aca-lb)\n\n## Next step\n\n* Use [Azure Load Testing](/azure/load-testing/) to load test your chat app.\n"
  },
  {
    "path": "articles/java/ai/get-started-app-chat-template.md",
    "content": "---\ntitle: Get started with the Chat Using your Own Data Sample for Java\ndescription: Get started with Java and search across your own data using a chat app sample implemented using Azure OpenAI Service and Retrieval Augmented Generation (RAG) in Azure AI Search. Easily deploy with Azure Developer CLI. This article uses the Azure AI Reference Template sample.\nms.date: 01/30/2026\nms.topic: get-started\nms.custom: devx-track-java, devx-track-java-ai, devx-track-extended-java, devx-track-extended-azdevcli, build-2024-intelligent-apps\n# CustomerIntent: As a Java developer new to Azure OpenAI, I want deploy and use sample code to interact with app infused with my own business data so that learn from the sample code.\n---\n\n# Get started with the chat using your own data sample for Java\n\nThis article shows you how to deploy and run the [Chat with your data sample for Java](https://github.com/Azure-Samples/azure-search-openai-demo-java). This sample implements a chat app using Java, Azure OpenAI Models in Microsoft Foundry, and [Retrieval Augmented Generation (RAG)](/azure/search/retrieval-augmented-generation-overview) in Azure AI Search to get answers about employee benefits at a fictitious company. The app is seeded with PDF files including the employee handbook, a benefits document, and a list of company roles and expectations.\n\n* [Demo video](https://aka.ms/azai/java/video)\n\nIn this article, you accomplish the following tasks:\n\n- Deploy a chat app to Azure.\n- Get answers about employee benefits.\n- Change settings to change behavior of responses.\n\nOnce you complete this article, you can start modifying the new project with your custom code.\n\nThis article is part of a collection of articles that show you how to build a chat app using Azure OpenAI Models in Microsoft Foundry and Azure AI Search. Other articles in the collection include: \n\n* [.NET](/dotnet/ai/get-started-app-chat-template)\n* [JavaScript](../../javascript/ai/get-started-app-chat-template.md)\n* [Python](../../python/get-started-app-chat-template.md)\n\n> [!NOTE]\n> This article uses one or more [AI app templates](../../ai/intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained, easy to deploy reference implementations that help to ensure a high-quality starting point for your AI apps.\n\n## Architectural overview\n\nA simple architecture of the chat app is shown in the following diagram:\n\n:::image type=\"content\" source=\"./media/get-started-app-chat-template/simple-architecture-diagram.png\" alt-text=\"Diagram showing architecture from client to backend app.\":::\n\nKey components of the architecture include:\n\n* A web application to host the interactive chat experience.\n* An Azure AI Search resource to get answers from your own data.\n* An Azure OpenAI Service to provide: \n    * Keywords to enhance the search over your own data.\n    * Answers from the OpenAI model.\n    * Embeddings from the ada model\n\n## Cost\n\nMost resources used in this architecture fall under basic or consumption-based pricing tiers. This means you only pay for what you use, and charges are typically minimal during development or testing.\n\nTo complete this sample, there may be a small cost incurred from using services like Azure OpenAI, AI Search, and storage. Once you're done evaluating or deploying the app, you can delete all provisioned resources to avoid ongoing charges.\n\nLearn more about [cost in the sample repo](https://github.com/Azure-Samples/azure-search-openai-demo-java#cost-estimation).\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\nTo use this article, you need the following prerequisites:\n\n#### [Codespaces (recommended)](#tab/github-codespaces)\n\n* An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* Azure account permissions - your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n* A GitHub account.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n* An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n* Azure account permissions - Your Azure Account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n* [Azure Developer CLI](/azure/developer/azure-developer-cli)\n* [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running\n* [Visual Studio Code](https://code.visualstudio.com/)\n* [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n---\n\n## Open development environment\n\nBegin by setting up a development environment that has all the dependencies installed to complete this article.\n\n### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Right-click on the following button, and select **Open link in new windows** in order to have both the development environment and the documentation available at the same time. \n\n    [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo-java)\n\n1. On the **Create codespace** page, review the codespace configuration settings, and then select **Create Codespace**.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-template/github-create-codespace.png\" alt-text=\"Screenshot of the confirmation screen before creating a new codespace.\":::\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. In the terminal at the bottom of the screen, sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login --use-device-code\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\n1. The remaining tasks in this article take place in the context of this development container.\n\n### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n1. Create a new local directory on your computer for the project.\n\n    ```bash\n    mkdir my-intelligent-app && cd my-intelligent-app\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```bash\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```bash\n    azd init -t azure-search-openai-demo-java\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login\n    ```\n\n    Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\n1. The remaining exercises in this project take place in the context of this development container.\n\n---\n\n## Deploy and run\n\nThe sample repository contains all the code and configuration files you need to deploy a chat app to Azure. The following steps walk you through the process of deploying the sample to Azure.\n\n### Deploy chat app to Azure\n\n> [!IMPORTANT]\n> Azure resources created in this section—especially Azure AI Search—can begin accruing charges immediately upon provisioning, even if the deployment is interrupted before completion. To avoid unexpected charges, monitor your Azure usage and delete unused resources promptly after testing.\n\n1. Provision the Azure resources and deploy the source code by running the following command:\n\n   ```bash\n   azd up\n   ```\n\n1. If you're prompted to enter an environment name, keep it short and lowercase, for example, `myenv`. It's used as part of the resource group name.\n\n1. When prompted, select a subscription to create the resources in.\n\n1. When you're prompted to select a location the first time, select a location near you. This location is used for most the resources including hosting.\n\n1. If you're prompted for a location for the OpenAI model, select a location that is near you. If the same location is available as your first location, select that.\n\n1. Wait until app is deployed, which can take 5-10 minutes to complete.\n\n1. After the application successfully deploys, you see a URL displayed in the terminal.\n\n1. Select that URL labeled `Deploying service web` to open the chat application in a browser.\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/browser-chat-with-your-data.png\" alt-text=\"Screenshot of chat app in browser showing several suggestions for chat input, as well as the chat box where you enter a question.\":::\n\n### Use chat app to get answers from PDF files\n\nThe chat app is preloaded with employee benefits information from [PDF files](https://github.com/Azure-Samples/azure-search-openai-demo-java/tree/main/data). You can use the chat app to ask questions about the benefits. The following steps walk you through the process of using the chat app.\n\n1. In the browser, select or enter **What is included in my Northwind Health Plus plan that is not in standard?** in the chat text box.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-template/browser-chat-initial-answer.png\" lightbox=\"./media/get-started-app-chat-template/browser-chat-initial-answer.png\" alt-text=\"Screenshot of chat app's first answer.\":::\n\n1. From the answer, select one of the citations.\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/browser-chat-initial-answer-citation-highlighted.png\" lightbox=\"./media/get-started-app-chat-template/browser-chat-initial-answer-citation-highlighted.png\" alt-text=\"Screenshot of chat app's first answer with its citation highlighted in a red box.\":::\n\n1. In the right-pane, use the tabs to understand how the answer was generated.\n\n   | Tab                    | Description                                                                    |\n   |------------------------|--------------------------------------------------------------------------------|\n   | **Thought process**    | Script of the interactions in chat.                                  |\n   | **Supporting content** | Includes the information to answer your question and the source material. |\n   | **Citation**           | Displays the PDF page that contains the citation.                         |\n\n1. When you're done, select the selected tab again to close the pane.\n\n### Use chat app settings to change behavior of responses\n\nThe OpenAI model and the settings that are used to interact with the model determine the intelligence of the chat app.\n\n:::image type=\"content\" source=\"./media/get-started-app-chat-template/browser-chat-developer-settings-chat-pane.png\" alt-text=\"Screenshot of chat developer settings.\":::\n\n| Setting                                                   | Description                                                                                                                                                                                                                                                                                         |\n|-----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Override prompt template                                  | Prompt that is used to generate the answer.                                                                                                                                                                                                                                             |\n| Retrieve this many search results                         | Number of search results that are used to generate the answer. You can see these sources returned in the **Thought process** and **Supporting content** tabs of the citation.                                                                                                               |\n| Exclude category                                          | Category of documents that are excluded from the search results.                                                                                                                                                                                                                        |\n| Use semantic ranker for retrieval                         | Feature of [Azure AI Search](/azure/search/semantic-search-overview#what-is-semantic-search) that uses machine learning to improve the relevance of search results.                                                                                                                       |\n| Use query-contextual summaries instead of whole documents | When both `Use semantic ranker` and `Use query-contextual summaries` are checked, the LLM uses captions extracted from key passages, instead of all the passages, in the highest ranked documents.                                                                                                  |\n| Suggest follow-up questions                               | Have the chat app suggest follow-up questions based on the answer.                                                                                                                                                                                                                                  |\n| Retrieval mode                                            | **Vectors + Text** means that the search results are based on the text of the documents and the embeddings of the documents. **Vectors** means that the search results are based on the embeddings of the documents. **Text** means that the search results are based on the text of the documents. |\n| Stream chat completion responses                          | Stream response instead of waiting until the complete answer is available for a response.                                                                                                                                                                                                           |\n\nThe following steps walk you through the process of changing the settings.\n\n1. In the browser, select the **Developer Settings** tab.\n\n1. Select the **Suggest follow-up questions** checkbox and ask the same question again.\n\n    ```\n    What is my deductible?\n    ```\n\n    The chat returns suggested follow-up questions such as these:\n\n    ```\n    1. What is the cost sharing for out-of-network services?\n    2. Are preventive care services subject to the deductible?\n    3. How does the prescription drug deductible work?\n    ```\n\n1. In the **Settings** tab, deselect **Use semantic ranker for retrieval**.\n\n1. Ask the same question again?\n\n    ```\n    What is my deductible?\n    ```\n\n1. What is the difference in the answers?\n\n    For example the response, which used the Semantic ranker provided a single answer: `The deductible for the Northwind Health Plus plan is $2,000 per year`.\n\n    The response without semantic ranking returned an answer, which required more work to get the answer: `Based on the information provided, it is unclear what your specific deductible is. The Northwind Health Plus plan has different deductible amounts for in-network and out-of-network services, and there is also a separate prescription drug deductible. I would recommend checking with your provider or referring to the specific benefits details for your plan to determine your deductible amount`.\n\n## Clean up resources\n\nAfter you complete the exercise, it's a best practice to remove any resources that are no longer required.\n\n### Clean up Azure resources\n\nThe Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges. Use the following command to delete the Azure resources and remove the source code:\n\n```bash\nazd down --purge\n```\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running Codespaces sourced from the [Azure-Samples/azure-search-openai-demo-java](https://github.com/Azure-Samples/azure-search-openai-demo-java) GitHub repository.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-template/github-codespace-dashboard.png\" alt-text=\"Screenshot of all the running Codespaces including their status and templates.\":::\n\n1. Open the context menu for the codespace and then select **Delete**.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-template/github-codespace-delete.png\" alt-text=\"Screenshot of the context menu for a single codespace with the delete option highlighted.\":::\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\nOpen the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen Folder Locally**.\n\n:::image type=\"content\" source=\"./media/get-started-app-chat-template/reopen-local-command-palette.png\" alt-text=\"Screenshot of the Command Palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. You can always delete the container instance, container image, and volumes from Docker to free up more space on your local machine.\n\n---\n\n## How is the question answered?\n\nThe app is separated out into two apps:\n\n* A front-end JavaScript application using the React framework with the Vite build tool.\n* A back-end Java application answers the question.\n\nThe backend `/chat` API steps through the process of getting the answer:\n\n* Build RAG options: Create a set of options used to generate an answer.\n* Create approach using RAG options: Use a combination of retrieval-based and generative-based models to create an approach for generating an accurate and natural-sounding response.\n* Run the approach with RAG options and previous conversation: Use the approach and RAG options to generate an answer based on the previous conversation. The answer includes information about which documents were used to generate the response.\n\n## Get help\n\nThis sample repository offers [troubleshooting information](https://github.com/Azure-Samples/azure-search-openai-demo-java/tree/main#troubleshooting). If your issue isn't addressed, log it in the repository's [Issues](https://github.com/Azure-Samples/azure-search-openai-demo-java/issues).\n\n## Next steps\n\n* [Get the source code for the sample used in this article](https://github.com/Azure-Samples/azure-search-openai-demo-java)\n* [Build a chat app with Azure OpenAI](https://aka.ms/azai/chat) best practice solution architecture\n* [Access control in Generative AI Apps with Azure AI Search](https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/access-control-in-generative-ai-applications-with-azure-ai-search/3956408)\n* [Build an Enterprise ready OpenAI solution with Azure API Management](https://techcommunity.microsoft.com/blog/appsonazureblog/build-an-enterprise-ready-azure-openai-solution-with-azure-api-management/3907562/replies/3935407)\n* [Outperforming vector search with hybrid retrieval and ranking capabilities](https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/azure-ai-search-outperforming-vector-search-with-hybrid-retrieval-and-reranking/3929167)\n* [More Azure AI end-to-end templates](https://aka.ms/aiapps)\n"
  },
  {
    "path": "articles/java/ai/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure AI for Java documentation\nsummary: Get started using Azure AI with Java.\n\nmetadata:\n  title: Azure AI for Java Documentation\n  description: Get started using Azure AI with Java.\n  author: KarlErickson\n  ms.author: karler\n  ms.date: 01/13/2026 \n  ms.topic: landing-page\n  ms.custom: devx-track-java, devx-track-extended-java\n\nlandingContent:\n  - title: Azure AI for Java\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Develop using Foundry Tools\n            url: azure-ai-for-java-developers.md\n          - text: GitHub Copilot modernization for Java developers\n            url: ../migration/migrate-github-copilot-app-modernization-for-java.md?toc=/azure/developer/java/ai/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - linkListType: get-started\n        links:\n          - text: Enterprise chat using RAG\n            url: get-started-app-chat-template.md\n          - text: Scale chat using RAG with Azure Container Apps\n            url: get-started-app-chat-scaling-with-azure-container-apps.md\n      - linkListType: quickstart\n        links:\n          - text: Chat using your own data\n            url: /azure/ai-services/openai/use-your-data-quickstart?pivots=programming-language-spring&toc=/azure/developer/java/ai/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: GPT-35-Turbo and GPT-4\n            url: /azure/ai-services/openai/chatgpt-quickstart?tabs=bash&pivots=programming-language-java&toc=/azure/developer/java/ai/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: GPT-35-Turbo and GPT-4 with IntelliJ\n            url: ../toolkit-for-intellij/chatgpt-intellij.md?toc=/azure/developer/java/ai/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Generate text\n            url: /azure/ai-services/openai/quickstart?tabs=bash&pivots=programming-language-java&toc=/azure/developer/java/ai/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Generate images\n            url: /azure/ai-services/openai/dall-e-quickstart?tabs=bash&pivots=programming-language-java&toc=/azure/developer/java/ai/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n"
  },
  {
    "path": "articles/java/ai/toc.yml",
    "content": "items:\n- name: Azure AI for Java documentation\n  href: index.yml\n  items:\n    - name: Overview\n      href: azure-ai-for-java-developers.md\n    - name: Enterprise chat using RAG\n      href: get-started-app-chat-template.md\n    - name: Scale chat using RAG with Azure Container Apps\n      href: get-started-app-chat-scaling-with-azure-container-apps.md\n    - name: Chat using your own data\n      href: /azure/ai-services/openai/use-your-data-quickstart?pivots=programming-language-spring&toc=/azure/developer/java/ai/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n    - name: GPT-35-Turbo and GPT-4 with IntelliJ\n      href: ../toolkit-for-intellij/chatgpt-intellij.md?toc=/azure/developer/java/ai/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n    - name: Generate text\n      href: /azure/ai-services/openai/quickstart?view=foundry&preserve-view=true&tabs=bash&pivots=programming-language-java&toc=/azure/developer/java/ai/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n    - name: Generate images\n      href: /azure/ai-services/openai/dall-e-quickstart?view=foundry&preserve-view=true&tabs=bash&pivots=programming-language-java&toc=/azure/developer/java/ai/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n"
  },
  {
    "path": "articles/java/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: Java\n      tocHref: /azure\n      topicHref: /azure/developer/java/index\n"
  },
  {
    "path": "articles/java/containers/baseline.md",
    "content": "---\ntitle: Establish a Baseline for Containerized Java Applications\ndescription: This article describes how to establish a baseline for containerized Java applications\nauthor: KarlErickson\nms.author: karler\nms.reviewer: brborges\nms.topic: concept-article\nms.date: 04/13/2022\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Establish a baseline for containerized Java applications\n\nThis article describes how to establish a baseline for containerized Java applications.\n\nIt's important to establish a baseline to understand what your application is really doing and how much memory and how many CPU cores it needs. An under-provisioned environment might affect the overall performance of your containerized application, while an over-provisioned environment might increase your costs.\n\nThe process of establishing a baseline enables you to experiment with different settings and then determine their impact and the right balanced amount of resources needed.\n\nTo establish a baseline, you can use Azure Application Insights or an APM solution of your choice.\n\n## Use Azure Application Insights\n\nFor information on setting up Application Insights, see [Azure Monitor OpenTelemetry-based auto-instrumentation for Java applications](/azure/azure-monitor/app/java-in-process-agent).\n\n## Next steps\n\nNow that you configured Azure Application Insights for your application, the next step is to review the recommendations for the target platform.\n\n* [Containerize your Java applications for Kubernetes](kubernetes.md)\n"
  },
  {
    "path": "articles/java/containers/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Java containerization strategies\nsummary: Recommended strategies for containerizing your Java applications for deployment to the cloud.\n\nmetadata:\n  title: Java Containerization Strategies\n  description: Recommended strategies for containerizing your Java applications for deployment to the cloud.\n  author: KarlErickson\n  ms.author: karler\n  ms.reviewer: brborges\n  ms.date: 02/14/2025\n  ms.topic: landing-page\n  ms.custom: devx-track-java, devx-track-extended-java\n\nlandingContent:\n  - title: Containerize your Java applications\n    linkLists:\n      - linkListType: concept\n        links:\n          - text: Overview\n            url: overview.md\n          - text: Establish a baseline\n            url: baseline.md\n          - text: Containerize for Kubernetes\n            url: kubernetes.md\n"
  },
  {
    "path": "articles/java/containers/kubernetes.md",
    "content": "---\ntitle: Containerize your Java Applications for Kubernetes\ndescription: This article describes how to containerize your Java applications for Kubernetes deployment\nauthor: KarlErickson\nms.author: karler\nms.reviewer: brborges\nms.topic: how-to\nms.date: 04/13/2022\nms.custom: devx-track-extended-java, devx-track-java, devx-track-javaee, devx-track-javaee-liberty, devx-track-javaee-liberty-aks, devx-track-javaee-liberty-aro, devx-track-javaee-wls, devx-track-javaee-wls-aks\n---\n\n# Containerize your Java applications for Kubernetes\n\nThis article describes how to containerize your Java applications for deployment on Kubernetes. For guidance on container memory, JVM heap memory, garbage collectors (GCs), and vCPU cores, see [Containerize your Java applications](overview.md).\n\n## Determine the appropriate VM SKU for the Kubernetes node pool\n\nDetermine whether the Kubernetes node pool or pools that are available for your cluster can fit the container memory and vCPU cores that you intend to use. If the node pool can host the application, then continue on. Otherwise, provision a node pool that's appropriate for the amount of container memory and number of vCPU cores you're targeting.\n\nKeep in mind that the cost of a VM SKU is proportional to the number of cores and amount of memory. After you determine your starting point in terms of vCPUs and memory for one container instance, determine whether you can meet your application's needs by horizontal scaling only. For reliable, always-on systems, a minimum of two replicas must be available. Scale up and out as needed.\n\n## Set CPU requests and limits\n\nIf you must limit the CPU, ensure that you apply the same value for both `limits` and `requests` in the deployment file. The JVM doesn't dynamically adjust its runtime, such as the GC and other thread pools. The JVM reads the number of processors available only during startup time.\n\n> [!TIP]\n> Set same value for CPU requests and CPU limits.\n\n```yaml\ncontainers:\n- image: myimage\n  name: myapp\n  resources:\n    limits:\n      cpu: \"2\"\n    requests:\n      cpu: \"2\"\n```\n\n### Understand JVM available processors\n\nWhen the HotSpot JVM in OpenJDK identifies that it's running inside a container, it uses values such as `cpu_quota` and `cpu_period` to determine how many processors are available to it. In general, any value up to `1000m` millicores are identified as a single processor machine. Any value between `1001m` and `2000m` is identified as a dual processor machine, and so forth. This information is available through the API [Runtime.getRuntime().availableProcessors()](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Runtime.html#availableProcessors()). Some of the concurrent GCs might also use this value to configure their threads. Other APIs, libraries, and frameworks might also use this information to configure thread pools.\n\nKubernetes CPU quotas are related to the amount of time a process spends in the CPU, and not the number of CPUs available to the process. Multi-threaded runtimes such as the JVM might still use multiple processors concurrently, with multiple threads. Even if a container has a limit of one vCPU, the JVM might be instructed to see two or more available processors.\n\nTo inform the JVM of the exact number of processors it should be seeing in a Kubernetes environment, use the following JVM flag:\n\n```java\n-XX:ActiveProcessorCount=N\n```\n\n## Set memory request and limits\n\nSet the memory limits to the amount that you previously determined. Be sure the memory limits number is the container memory and NOT the JVM heap memory value.\n\n> [!TIP]\n> Set the memory requests equal to the memory limits.\n\n```yaml\ncontainers:\n  - name: myimage\n    image: myapp\n    resources:\n      limits:\n        memory: \"4Gi\"\n      requests:\n        memory: \"4Gi\"\n```\n\n## Set the JVM arguments in the deployment file\n\nRemember to set the JVM heap memory to the amount you previously determined. We recommend that you pass this value as an environment variable so you can easily change it without needing to rebuild the container image.\n\n```yaml\ncontainers:\n  - name: myimage\n    image: myapp\n    env:\n    - name: JAVA_OPTS\n      value: \"-XX:+UseParallelGC -XX:MaxRAMPercentage=75\"\n```\n\n## Next steps\n\n- [Java containerization strategies](index.yml)\n- Jakarta EE on Azure container runtimes\n  - Oracle WebLogic Server\n    - [Azure Kubernetes Service](/azure/virtual-machines/workloads/oracle/weblogic-aks?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/ee/breadcrumb/toc.json)\n  - IBM WebSphere Liberty, Open Liberty, and traditional WebSphere\n    - [Azure Kubernetes Service, Azure Red Hat OpenShift](../ee/websphere-family.md)\n"
  },
  {
    "path": "articles/java/containers/overview.md",
    "content": "---\ntitle: Containerize your Java Applications\ndescription: This article provides an overview of recommended strategies for containerizing your Java applications.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: brborges\nms.topic: concept-article\nms.date: 04/13/2022\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Containerize your Java applications\n\nThis article provides an overview of recommended strategies and settings for containerizing Java applications. When you're containerizing a Java application, carefully consider how much CPU time the container has available. Then consider how much memory is available both in terms of total amount of memory, and the heap size of the Java Virtual Machine (JVM). In containerized environments, applications might have access to all processors and therefore be able to run multiple threads in parallel. It's common, though, that containers have a CPU quota applied that might throttle access to CPUs.\n\nThe JVM has heuristics to determine the number of \"available processors\" based on CPU quota, which can dramatically influence the performance of Java applications. The memory allocated to the container itself and the size of the heap area for the JVM are as important as the processors. These factors determine the behavior of the garbage collector (GC) and the overall performance of the system.\n\n## Containerize a new application\n\nWhen you're containerizing a Java workload for a new application, you must take two things into account when thinking about memory:\n\n* The memory allocated to the container itself.\n* The amount of memory available to the Java process.\n\n### Understand JVM default ergonomics\n\nApplications need a starting point and settings. The JVM has default ergonomics with predefined values that are based on number of available processors and amount of memory in the system. The default values shown in the following tables are used when the JVM is started without specific startup flags or parameters.\n\nThe following table shows the default GC used for the resources available:\n\n| Resources available                                    | Default GC |\n|--------------------------------------------------------|------------|\n| Any number of processors <br/> Up to 1,791 MB of memory | SerialGC   |\n| 2+ processors <br/> 1,792 MB or more of memory          | G1GC       |\n\nThe following table shows the default maximum heap size depending on how much memory is available in the environment where the JVM is running:\n\n| Memory available    | Default maximum heap size |\n|---------------------|---------------------------|\n| Up to 256 MB        | 50% of available memory   |\n| 256 MB to 512 MB    | ~127 MB                    |\n| More than 512 MB    | 25% of available memory   |\n\nThe default initial heap size is 1/64 of available memory. These values are valid for OpenJDK 11 and later—and for most distributions, including Microsoft Build of OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK, and others.\n\n### Determine container memory\n\nPick a container memory amount that serves your work load best, depending on the needs of your application and its distinctive usage patterns. For example, if your application creates large object graphs, then you probably need more memory than you'd need for applications with many small object graphs.\n\n> [!TIP]\n> If you don't know how much memory to allocate, a good starting point is 4 GB.\n\n### Determine JVM heap memory\n\nWhen you allocate JVM heap memory, the JVM needs more memory than what is used for the JVM heap. When you set the maximum JVM heap memory, it should never be equal to the amount of container memory because that causes container Out of Memory (OOM) errors and container crashes.\n\n> [!TIP]\n> Allocate 75% of container memory for the JVM heap.\n\nOn OpenJDK 11 and later, you can set the JVM heap size in the following ways:\n\n| Description   | Flag                   | Examples                  |\n|---------------|------------------------|---------------------------|\n| Fixed value   | `-Xmx`                 | `-Xmx4g`                  |\n| Dynamic value | `-XX:MaxRAMPercentage` | `-XX:MaxRAMPercentage=75` |\n\n#### Minimum/initial heap size\n\nWhere the environment is guaranteed to have a certain amount of memory reserved to a JVM instance, such as in a container, you should set the minimum heap size - or initial heap size - to the same size as the maximum heap size. This setting indicates to the JVM that it shouldn't perform the task of freeing memory to the OS.\n\nTo set a minimum heap size, use `-Xms` for absolute amounts or `-XX:InitialRAMPercentage` for percentage amounts.\n\n> [!IMPORTANT]\n> The flag `-XX:MinRAMPercentage`, despite what the name suggests, is used for setting the default *maximum* RAM percentage for systems with up to 256 MB of RAM available in the system.\n\n:::image type=\"content\" source=\"media/default-heap-chart-openjdk17.png\" alt-text=\"Chart showing the default heap size on OpenJDK 17.\":::\n\n### Determine which GC to use\n\nPreviously, you determined the amount of JVM heap memory to start with. The next step is to choose your GC. The amount of maximum JVM heap memory you have is often a factor in choosing your GC. The following table describes the characteristics of each GC.\n\n| Factors             | SerialGC                | ParallelGC                                                   | G1GC                                                                   | ZGC                                                                    | ShenandoahGC                                                           |\n|---------------------|-------------------------|--------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------|\n| Number of cores     | 1                       | 2                                                            | 2                                                                      | 2                                                                      | 2                                                                      |\n| Multi-threaded      | No                      | Yes                                                          | Yes                                                                    | Yes                                                                    | Yes                                                                    |\n| Java heap size      | <4 GBytes               | <4 GBytes                                                    | >4 GBytes                                                              | >4 GBytes                                                              | >4 GBytes                                                              |\n| Pause               | Yes                     | Yes                                                          | Yes                                                                    | Yes (<1 ms)                                                            | Yes (<10 ms)                                                           |\n| Overhead            | Minimal                 | Minimal                                                      | Moderate                                                               | Moderate                                                               | Moderate                                                               |\n| Tail-latency Effect | High                    | High                                                         | High                                                                   | Low                                                                    | Moderate                                                               |\n| JDK version         | All                     | All                                                          | JDK 8+                                                                 | JDK 17+                                                                | JDK 11+                                                                |\n| Best for            | Single core small heaps | Multi-core small heaps or batch workloads with any heap size | Responsive in medium to large heaps (request-response/DB interactions) | Responsive in medium to large heaps (request-response/DB interactions) | Responsive in medium to large heaps (request-response/DB interactions) |\n\n> [!TIP]\n> For most general-purpose microservice applications, start with the Parallel GC.\n\n### Determine how many CPU cores are needed\n\nFor any GC other than SerialGC, we recommend two or more vCPU cores - or at least `2000m` for `cpu_limit` on Kubernetes. We don't recommend selecting anything less than one vCPU core on containerized environments.\n\n> [!TIP]\n> If you don't know how many cores to start with, a good choice is two vCPU cores.\n\n### Pick a starting point\n\nWe recommend starting with two replicas or instances in container orchestration environments like Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps, and Azure App Service. The following table summarizes the recommended starting points for the containerization of your new Java application.\n\n| vCPU cores | Container memory | JVM heap size | GC         | Replicas |\n|------------|------------------|---------------|------------|----------|\n| 2          | 4 GB             | 75%           | ParallelGC | 2        |\n\nUse the following JVM parameters:\n\n```java\n-XX:+UseParallelGC -XX:MaxRAMPercentage=75\n```\n\n## Containerize an existing on premises application\n\nIf your application is already running on premises or on a VM in the cloud, then we recommend that you start with the following configuration:\n\n* The same amount of memory that the application currently has access to.\n* The same number of CPUs or vCPU cores the application currently has available.\n* The same JVM parameters that you currently use.\n\nIf the vCPU cores or container memory combination isn't available, then pick the closest one, rounding up the vCPU cores and container memory.\n\n## Next steps\n\nNow that you understand the general recommendations for containerizing Java applications, continue on to the following article to establish a containerization baseline:\n\n* [Establish a baseline for containerized Java applications](baseline.md)\n"
  },
  {
    "path": "articles/java/containers/toc.yml",
    "content": "items:\n- name: Java containerization strategies\n  href: index.yml\n  items:\n    - name: Overview\n      href: overview.md\n    - name: Establish a baseline\n      href: baseline.md\n    - name: Containerize for Kubernetes\n      href: kubernetes.md\n    - name: Container images for Java\n      href: /java/openjdk/containers\n"
  },
  {
    "path": "articles/java/ee/deploy-java-liberty-app-aca.md",
    "content": "---\ntitle: Deploy a Java Application with Open Liberty on Azure Container Apps\ndescription: Shows you how to deploy a Java application with Open Liberty on Azure Container Apps.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.topic: quickstart\nms.date: 03/26/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-liberty\n  - devx-track-javaee-liberty-aca\n  - devx-track-javaee-websphere\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Deploy a Java application with Open Liberty on Azure Container Apps\n\nThis article shows you how to run Open Liberty on Azure Container Apps. You do the following activities in this article:\n\n* Run your Java, Java Enterprise Edition (EE), Jakarta EE, or MicroProfile application on the Open Liberty runtime.\n* Build the application Docker image using Liberty container images.\n* Deploy the containerized application to Azure Container Apps.\n\nFor more information about Open Liberty, see [the Open Liberty project page](https://openliberty.io/). This article is intended to help you quickly get to deployment. Before going to production, you should explore [Tuning Liberty](https://openliberty.io/docs/latest/performance-tuning.html).\n\nIf you're interested in providing feedback or working closely on your migration scenarios with the engineering team developing Java on Azure solutions, fill out this short [survey on Azure migration](https://aka.ms/websphere-on-azure-survey) and include your contact information. The team of program managers, architects, and engineers will promptly get in touch with you to initiate close collaboration.\n\n## Prerequisites\n\n* An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n* Prepare a local machine with either Windows or Unix-like operating system installed - for example, Ubuntu, macOS, or Windows Subsystem for Linux.\n* [Install the Azure CLI](/cli/azure/install-azure-cli) 2.62.0 or above to run Azure CLI commands.\n    * If you're prompted, install the Azure CLI extension on first use. For more information about extensions, see [Use and manage extensions with the Azure CLI](/cli/azure/azure-cli-extensions-overview).\n    * Run [`az version`](/cli/azure/reference-index?#az-version) to find the version and dependent libraries that are installed. To upgrade to the latest version, run [`az upgrade`](/cli/azure/reference-index?#az-upgrade).\n* Install a Java Standard Edition (SE) implementation version 17 - for example, [Microsoft build of OpenJDK](/java/openjdk).\n* Install [Maven](https://maven.apache.org/download.cgi) 3.9.8 or higher.\n* Ensure that [Git](https://git-scm.com) is installed.\n\n## Sign in to Azure\n\nSign in to your Azure subscription by using the [`az login`](/cli/azure/authenticate-azure-cli) command and follow the on-screen directions.\n\n### [Bash](#tab/in-bash)\n\n```azurecli\naz login\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\naz login\n```\n\n---\n\n> [!NOTE]\n> You can run most Azure CLI commands in PowerShell the same as in Bash. The difference exists only when using variables. In the following sections, the difference is addressed in different tabs when needed.\n>\n> If you have multiple Azure tenants associated with your Azure credentials, you must specify which tenant you want to sign in to. You can specify the tenant by using the `--tenant` option - for example, `az login --tenant contoso.onmicrosoft.com`.\n>\n> If you have multiple subscriptions within a single tenant, make sure you're signed in with the one you intend to use by using `az account set --subscription <subscription-id>`.\n\n## Create a resource group\n\nAn Azure resource group is a logical group in which Azure resources are deployed and managed.\n\nCreate a resource group called `java-liberty-project` using the [`az group create`](/cli/azure/group#az-group-create) command in the `eastus2` location. This resource group is used later for creating the Azure Container Registry (ACR) instance and the Azure Container Apps instance.\n\n### [Bash](#tab/in-bash)\n\n```azurecli\nexport RESOURCE_GROUP_NAME=java-liberty-project\nexport LOCATION=eastus2\naz group create --name $RESOURCE_GROUP_NAME --location $LOCATION\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\n$Env:RESOURCE_GROUP_NAME = \"java-liberty-project\"\n$Env:LOCATION = \"eastus2\"\naz group create --name $Env:RESOURCE_GROUP_NAME --location $Env:LOCATION\n```\n\n---\n\n## Create an ACR instance\n\nUse the [`az acr create`](/cli/azure/acr#az-acr-create) command to create the ACR instance. The following example creates an ACR instance named `youruniqueacrname`. Make sure `youruniqueacrname` is unique within Azure.\n\n> [!NOTE]\n> This article uses the recommended passwordless authentication mechanism for Container Registry. It's still possible to use a username and password with `docker login` after using `az acr credential show` to obtain the username and password. Using a username and password is less secure than passwordless authentication.\n\n### [Bash](#tab/in-bash)\n\n```azurecli\nexport REGISTRY_NAME=youruniqueacrname\naz acr create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $REGISTRY_NAME \\\n    --sku Basic\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\n$Env:REGISTRY_NAME = \"youruniqueacrname\"\naz acr create `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name $Env:REGISTRY_NAME `\n    --sku Basic\n```\n\n---\n\nAfter a short time, you should see a JSON output that contains the following lines:\n\n```output\n\"provisioningState\": \"Succeeded\",\n\"publicNetworkAccess\": \"Enabled\",\n\"resourceGroup\": \"java-liberty-project\",\n```\n\nNext, use the following command to retrieve the login server for the Container Registry instance. You need this value when you deploy the application image to the Azure Container Apps later.\n\n### [Bash](#tab/in-bash)\n\n```azurecli\nexport ACR_LOGIN_SERVER=$(az acr show \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $REGISTRY_NAME \\\n    --query 'loginServer' \\\n    --output tsv)\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\n$Env:ACR_LOGIN_SERVER = $(az acr show `\n    --name $Env:REGISTRY_NAME `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --query 'loginServer' `\n    --output tsv)\n```\n\n---\n\n## Create an environment\n\nAn environment in Azure Container Apps creates a secure boundary around a group of container apps. Container Apps deployed to the same environment are deployed in the same virtual network and write logs to the same Log Analytics workspace. Use the [`az containerapp env create`](/cli/azure/containerapp/env#az-containerapp-env-create) command to create an environment. The following example creates an environment named `youracaenvname`:\n\n### [Bash](#tab/in-bash)\n\n```azurecli\nexport ACA_ENV=youracaenvname\naz containerapp env create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --location $LOCATION \\\n    --name $ACA_ENV\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\n$Env:ACA_ENV = \"youracaenvname\"\naz containerapp env create `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --location $Env:LOCATION `\n    --name $Env:ACA_ENV\n```\n\n---\n\nIf you're asked to install an extension, answer <kbd>Y</kbd>.\n\nAfter a short time, you should see a JSON output that contains the following lines:\n\n```output\n\"provisioningState\": \"Succeeded\",\n\"type\": \"Microsoft.App/managedEnvironments\"\n\"resourceGroup\": \"java-liberty-project\",\n```\n\n## Create a single database in Azure SQL Database\n\nIn this section, you create a single database in Azure SQL Database, for use with your app.\n\n### [Bash](#tab/in-bash)\n\nFirst, use the following commands to set database-related environment variables. Replace `<your-unique-sql-server-name>` with a unique name for your Azure SQL Database server.\n\n```bash\nexport SQL_SERVER_NAME=<your-unique-sql-server-name>\nexport DB_NAME=demodb\n```\n\nNext, use the following commands to create a single database in Azure SQL Database and set the current signed-in user as a Microsoft Entra admin. For more information, see [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-cli).\n\n```azurecli\nexport ENTRA_ADMIN_NAME=$(az account show --query user.name --output tsv)\n\naz sql server create \\\n    --name $SQL_SERVER_NAME \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --enable-ad-only-auth \\\n    --external-admin-principal-type User \\\n    --external-admin-name $ENTRA_ADMIN_NAME \\\n    --external-admin-sid $(az ad signed-in-user show --query id --output tsv)\naz sql db create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server $SQL_SERVER_NAME \\\n    --name $DB_NAME \\\n    --edition GeneralPurpose \\\n    --compute-model Serverless \\\n    --family Gen5 \\\n    --capacity 2\n```\n\nThen, use the following commands to add the local IP address to the Azure SQL Database server firewall rules to allow your local machine to connect to the database for local testing later.\n\n```azurecli\nexport AZ_LOCAL_IP_ADDRESS=$(curl -s https://whatismyip.akamai.com)\naz sql server firewall-rule create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server $SQL_SERVER_NAME \\\n    --name AllowLocalIP \\\n    --start-ip-address $AZ_LOCAL_IP_ADDRESS \\\n    --end-ip-address $AZ_LOCAL_IP_ADDRESS\n```\n\n### [PowerShell](#tab/in-powershell)\n\nFirst, use the following commands to set database-related environment variables. Replace `<your-unique-sql-server-name>` with a unique name for your Azure SQL Database server.\n\n```powershell\n$Env:SQL_SERVER_NAME = \"<your-unique-sql-server-name>\"\n$Env:DB_NAME = \"demodb\"\n```\n\nNext, use the following commands to create a single database in Azure SQL Database and set the current signed-in user as Microsoft Entra admin. For more information, see [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-powershell).\n\n```azurepowershell\n$Env:ENTRA_ADMIN_NAME = $(az account show --query user.name --output tsv)\n\naz sql server create `\n    --name $Env:SQL_SERVER_NAME `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --enable-ad-only-auth `\n    --external-admin-principal-type User `\n    --external-admin-name $Env:ENTRA_ADMIN_NAME `\n    --external-admin-sid $(az ad signed-in-user show --query id --output tsv)\naz sql db create `\n    --name $Env:DB_NAME `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --server $Env:SQL_SERVER_NAME `\n    --edition GeneralPurpose `\n    --compute-model Serverless `\n    --family Gen5 `\n    --capacity 2\n```\n\nThen, use the following commands to add the local IP address to the Azure SQL Database server firewall rules to allow your local machine to connect to the database for local testing later.\n\n```azurepowershell\n$Env:AZ_LOCAL_IP_ADDRESS = (Invoke-WebRequest https://whatismyip.akamai.com).Content\naz sql server firewall-rule create `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --server $Env:SQL_SERVER_NAME `\n    --name AllowLocalIP `\n    --start-ip-address $Env:AZ_LOCAL_IP_ADDRESS `\n    --end-ip-address $Env:AZ_LOCAL_IP_ADDRESS\n```\n\n---\n\n> [!NOTE]\n> You create an Azure SQL server with SQL authentication disabled for security considerations. Only Microsoft Entra ID is used to authenticate to the server. If you need to enable SQL authentication, see [`az sql server create`](/cli/azure/sql/server#az-sql-server-create).\n\n## Configure and build the application image\n\nTo deploy and run your Liberty application on Azure Container Apps, containerize your application as a Docker image using [Open Liberty container images](https://github.com/OpenLiberty/ci.docker).\n\nFollow the steps in this section to deploy the sample application on the Liberty runtime. These steps use Maven.\n\n### Check out the application\n\nUse the following commands to prepare the sample code for this guide. The sample is on [GitHub](https://github.com/Azure-Samples/open-liberty-on-aca).\n\n#### [Bash](#tab/in-bash)\n\n```bash\ngit clone https://github.com/Azure-Samples/open-liberty-on-aca.git\ncd open-liberty-on-aca\nexport BASE_DIR=$PWD\ngit checkout 20250327\n```\n\n#### [PowerShell](#tab/in-powershell)\n\n```powershell\ngit clone https://github.com/Azure-Samples/open-liberty-on-aca.git\ncd open-liberty-on-aca\n$Env:BASE_DIR = $PWD\ngit checkout 20250327\n```\n\n---\n\nIf you see a message about being in `detached HEAD` state, this message is safe to ignore. It just means you checked out a tag.\n\nThis article uses **java-app**. Here's the file structure of the application's important files:\n\n```output\njava-app\n├─ src/main/\n│  ├─ liberty/config/\n│  │  ├─ server.xml\n│  ├─ java/\n│  ├─ resources/\n│  ├─ webapp/\n├─ Dockerfile\n├─ pom.xml\n├─ pom-azure-identity.xml\n```\n\nThe directories **java**, **resources**, and **webapp** contain the source code of the sample application. The code declares and uses a data source named `jdbc/JavaEECafeDB`.\n\nIn the **java-app** root directory, there's a Dockerfile to create the application image with Open Liberty.\n\nIn the **liberty/config** directory, the **server.xml** file is used to configure the database connection for the Open Liberty. It defines a variable `azure.sql.connectionstring` that is used to connect to the Azure SQL Database.\n\nThe **pom.xml** file is the Maven project object model (POM) file that contains the configuration information for the project. The **pom-azure-identity.xml** file declares the `azure-identity` dependency, which is used to authenticate to Azure services using Microsoft Entra ID.\n\n> [!NOTE]\n> This sample uses `azure-identity` library to authenticate to Azure SQL Database using Microsoft Entra authentication, which is recommended for security considerations. If you need to use SQL authentication in your Liberty application, see [Relational database connections with JDBC](https://openliberty.io/docs/latest/relational-database-connections-JDBC.html).\n\n### Build the project\n\nUse the following commands to build the application:\n\n#### [Bash](#tab/in-bash)\n\n```bash\ncd $BASE_DIR/java-app\nmvn clean install\nmvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources\n```\n\n#### [PowerShell](#tab/in-powershell)\n\n```powershell\ncd $Env:BASE_DIR/java-app\nmvn clean install\nmvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources\n```\n\n---\n\nIf the build is successful, you should see output similar to the following at the end of your build.\n\n```output\n[INFO] ------------------------------------------------------------------------\n[INFO] BUILD SUCCESS\n[INFO] ------------------------------------------------------------------------\n[INFO] Total time:  22.651 s\n[INFO] Finished at: 2023-10-26T18:58:40-04:00\n[INFO] ------------------------------------------------------------------------\n```\n\nIf you don't see this output, troubleshoot and resolve the problem before continuing.\n\n### Test your project locally\n\nYou can now use the following steps to run and test the project locally before deploying to Azure. For convenience, use the `liberty-maven-plugin`. To learn more about the `liberty-maven-plugin`, see [Building a web application with Maven](https://openliberty.io/guides/maven-intro.html). For your application, you can do something similar using any other mechanism, such as your local IDE.\n\n> [!NOTE]\n> If you selected a \"serverless\" database deployment, verify that your SQL database didn't enter pause mode. One way to perform the verification is to sign in to the database query editor as described in [Quickstart: Use the Azure portal query editor (preview) to query Azure SQL Database](/azure/azure-sql/database/connect-query-portal).\n\n1. Start the application using `liberty:run`.\n\n    #### [Bash](#tab/in-bash)\n\n    ```bash\n    cd $BASE_DIR/java-app\n\n    # The value of environment variable AZURE_SQL_CONNECTIONSTRING is read by the configuration variable azure.sql.connectionstring in server.xml.\n    export AZURE_SQL_CONNECTIONSTRING=\"jdbc:sqlserver://$SQL_SERVER_NAME.database.windows.net:1433;databaseName=$DB_NAME;authentication=ActiveDirectoryDefault\"\n    mvn liberty:run\n    ```\n\n    #### [PowerShell](#tab/in-powershell)\n\n    ```powershell\n    cd $Env:BASE_DIR/java-app\n\n    # The value of environment variable AZURE_SQL_CONNECTIONSTRING is read by configuration variable azure.sql.connectionstring in server.xml.\n    $Env:AZURE_SQL_CONNECTIONSTRING = \"jdbc:sqlserver://$Env:SQL_SERVER_NAME.database.windows.net:1433;databaseName=$Env:DB_NAME;authentication=ActiveDirectoryDefault\"\n    mvn liberty:run\n    ```\n\n1. Verify that the application works as expected. If successful, you should see a message similar to `[INFO] [AUDIT   ] CWWKZ0001I: Application javaee-cafe started in 11.086 seconds.` in the command output. Go to `http://localhost:9080/` in your browser to verify that the application is accessible and all functions are working.\n\n1. Press <kbd>Ctrl</kbd>+<kbd>C</kbd> to stop. Select <kbd>Y</kbd> if you're asked to terminate the batch job.\n\nWhen you're finished, delete the firewall rule that allows your local IP address to access the Azure SQL Database by using the following command:\n\n### [Bash](#tab/in-bash)\n\n```azurecli\naz sql server firewall-rule delete \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server $SQL_SERVER_NAME \\\n    --name AllowLocalIP\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\naz sql server firewall-rule delete `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --server $Env:SQL_SERVER_NAME `\n    --name AllowLocalIP\n```\n\n---\n\n### Build the image for Azure Container Apps deployment\n\nYou can now run the [`az acr build`](/cli/azure/acr#az-acr-build) command to build the image, as shown in the following example:\n\n### [Bash](#tab/in-bash)\n\n```azurecli\ncd $BASE_DIR/java-app\n\naz acr build \\\n    --registry ${REGISTRY_NAME} \\\n    --image javaee-cafe:v1 \\\n    .\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\ncd $Env:BASE_DIR/java-app\n\naz acr build `\n    --registry $Env:REGISTRY_NAME `\n    --image javaee-cafe:v1 .\n```\n\n---\n\nThe `az acr build` command uploads the artifacts specified in the Dockerfile to the Container Registry instance, builds the image, and stores it in the Container Registry instance.\n\n## Deploy the application to Azure Container Apps\n\nUse the following commands to create an Azure Container Apps instance to run the app after pulling the image from the ACR. This example creates an Azure Container Apps instance named `youracainstancename`:\n\n### [Bash](#tab/in-bash)\n\n```azurecli\nexport ACA_NAME=youracainstancename\naz containerapp create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $ACA_NAME \\\n    --image ${ACR_LOGIN_SERVER}/javaee-cafe:v1 \\\n    --environment $ACA_ENV \\\n    --registry-server $ACR_LOGIN_SERVER \\\n    --registry-identity system \\\n    --target-port 9080 \\\n    --ingress 'external' \\\n    --min-replicas 1\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\n$Env:ACA_NAME = \"youracainstancename\"\naz containerapp create `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name $Env:ACA_NAME `\n    --image $Env:ACR_LOGIN_SERVER/javaee-cafe:v1 `\n    --environment $Env:ACA_ENV `\n    --registry-server $Env:ACR_LOGIN_SERVER `\n    --registry-identity system `\n    --target-port 9080 `\n    --ingress 'external' `\n    --min-replicas 1\n```\n\n---\n\nSuccessful output is a JSON object including the property `\"type\": \"Microsoft.App/containerApps\"`.\n\nThen, connect the Azure SQL Database server to the container app using Service Connector by using the following steps:\n\n1. Open the Azure portal in your browser and navigate to the Azure Container Apps instance you created in the previous step.\n1. In the navigation pane, select **Settings** > **Service Connector (preview)**.\n1. Select **Create**. You should see the popup window **Create connection**.\n1. In the **Basic** pane, for **Service type**, select **SQL Database**.  For **Client type**, select **Java**. Leave other fields at their default values, then select **Next: Authentication**.\n1. In the **Authentication** pane, for **Authentication type**, select **System assigned managed identity**, then select **Next: Networking**.\n1. In the **Networking** pane, select **Next: Review + create**.\n1. In the **Review + create** pane, wait for the validation to pass, and then select **Create on Cloud Shell**. The Cloud Shell opens and then executes the commands to create the connection. Wait for the commands to finish and then close the Cloud Shell.\n\n> [!NOTE]\n> The Service Connector creates a secret in the container app that contains the value for `AZURE_SQL_CONNECTIONSTRING`, which is a password-free connection string to the Azure SQL Database. For more information, see the sample value from the [User-assigned managed identity](/azure/service-connector/how-to-integrate-sql-database?tabs=sql-me-id-java#user-assigned-managed-identity) section of [Integrate Azure SQL Database with Service Connector](/azure/service-connector/how-to-integrate-sql-database?tabs=sql-me-id-java).\n\n### Test the application\n\nUse the following command to get a fully qualified URL to access the application:\n\n#### [Bash](#tab/in-bash)\n\n```azurecli\necho https://$(az containerapp show \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $ACA_NAME \\\n    --query properties.configuration.ingress.fqdn \\\n    --output tsv)\n```\n\n#### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\nWrite-Host https://$(az containerapp show `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name $Env:ACA_NAME `\n    --query properties.configuration.ingress.fqdn `\n    --output tsv)\n```\n\n---\n\nTo access and test the application, open a web browser to the URL. The following screenshot shows the running application:\n\n:::image type=\"content\" source=\"./media/deploy-java-liberty-app-aca/deploy-succeeded.png\" alt-text=\"Screenshot that shows the Java liberty application successfully deployed on Azure Container Apps.\":::\n\n## Clean up resources\n\nTo avoid Azure charges, you should clean up unnecessary resources. When the cluster is no longer needed, use the [`az group delete`](/cli/azure/group#az-group-delete) command to remove the resource group, container registry, container apps, database server, and all related resources.\n\n### [Bash](#tab/in-bash)\n\n```azurecli\naz group delete --name $RESOURCE_GROUP_NAME --yes --no-wait\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\naz group delete --name $Env:RESOURCE_GROUP_NAME --yes --no-wait\n```\n\n---\n\n## Next steps\n\nYou can learn more from the references used in this guide:\n\n* [Azure Container Apps](https://azure.microsoft.com/products/container-apps)\n* [Integrate Azure SQL Database with Service Connector](/azure/service-connector/how-to-integrate-sql-database?tabs=sql-me-id-java%2Csql-secret-java)\n* [Connect using Microsoft Entra authentication](/sql/connect/jdbc/connecting-using-azure-active-directory-authentication?view=azuresqldb-current&preserve-view=true)\n* [Open Liberty](https://openliberty.io/)\n* [Open Liberty Server Configuration](https://openliberty.io/docs/ref/config/)\n* [Liberty Maven Plugin](https://github.com/OpenLiberty/ci.maven#liberty-maven-plugin)\n* [Open Liberty Container Images](https://github.com/OpenLiberty/ci.docker)\n\nTo explore options to run WebSphere products on Azure, see [What are solutions to run the WebSphere family of products on Azure?](websphere-family.md)\n"
  },
  {
    "path": "articles/java/ee/deploy-java-quarkus-app.md",
    "content": "---\ntitle: Deploy a Java Application with Quarkus on Azure Container Apps\ndescription: Shows how to quickly stand up Quarkus on Azure Container Apps.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.topic: quickstart\nms.date: 03/26/2026\nms.custom: devx-track-java, devx-track-javaee, devx-track-javaee-quarkus, devx-track-javaee-quarkus-aca, devx-track-extended-java, devx-track-azurecli\n---\n\n# Deploy a Java application with Quarkus on Azure Container Apps\n\nThis article shows you how to quickly deploy Red Hat Quarkus on Microsoft Azure Container Apps with a simple CRUD application. The application is a \"to do list\" with a JavaScript front end and a REST endpoint. Azure Database for PostgreSQL flexible server provides the persistence layer for the app. The article shows you how to test your app locally and deploy it to Container Apps.\n\n## Prerequisites\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n- Prepare a local machine with Unix-like operating system installed - for example, Ubuntu, macOS, or Windows Subsystem for Linux.\n- Install a Java SE implementation version 17 or later - for example, [Microsoft build of OpenJDK](/java/openjdk).\n- Install [Maven](https://maven.apache.org/download.cgi), version 3.9.8 or higher.\n- Install [Docker](https://docs.docker.com/get-docker/) for your OS.\n- Install [jq](https://jqlang.github.io/jq/download/).\n- Install [cURL](https://curl.se/download.html).\n- Install the [Quarkus CLI](https://quarkus.io/guides/cli-tooling), version 3.12.1 or higher.\n- Install the [Azure CLI](/cli/azure/install-azure-cli) to run Azure CLI commands.\n    - Sign in to the Azure CLI by using the [`az login`](/cli/azure/reference-index#az-login) command. To finish the authentication process, follow the steps displayed in your terminal. For other sign-in options, see [Sign into Azure with Azure CLI](/cli/azure/authenticate-azure-cli#sign-into-azure-with-azure-cli).\n    - When you're prompted, install the Azure CLI extension on first use. For more information about extensions, see [Use and manage extensions with the Azure CLI](/cli/azure/azure-cli-extensions-overview).\n    - Run [`az version`](/cli/azure/reference-index?#az-version) to find the version and dependent libraries that are installed. To upgrade to the latest version, run [`az upgrade`](/cli/azure/reference-index?#az-upgrade). This article requires at least version 2.61.0 of Azure CLI.\n\n## Create the app project\n\nUse the following commands to clone the sample Java project for this article. The sample is on [GitHub](https://github.com/Azure-Samples/quarkus-azure).\n\n```bash\ngit clone https://github.com/Azure-Samples/quarkus-azure\ncd quarkus-azure\ngit checkout 2025-05-08\ncd aca-quarkus\n```\n\nIf you see a message about being in `detached HEAD` state, this message is safe to ignore. Because this article doesn't require any commits, `detached HEAD` state is appropriate.\n\n## Test your Quarkus app locally\n\nThe steps in this section show you how to run the app locally.\n\nQuarkus supports the automatic provisioning of unconfigured services in development and test mode. Quarkus refers to this capability as dev services. Let's say you include a Quarkus feature, such as connecting to a database service. You want to test the app, but haven't yet fully configured the connection to a real database. Quarkus automatically starts a stub version of the relevant service and connects your application to it. For more information, see [Dev Services Overview](https://quarkus.io/guides/dev-services#databases) in the Quarkus documentation.\n\nMake sure your container environment is running and use the following command to enter Quarkus dev mode:\n\n```bash\nquarkus dev\n```\n\nInstead of `quarkus dev`, you can accomplish the same thing with Maven by using `mvn quarkus:dev`.\n\nYou might be asked if you want to send telemetry of your usage of Quarkus dev mode. If so, answer as you like.\n\nQuarkus dev mode enables live reload with background compilation. If you modify any aspect of your app source code and refresh your browser, you can see the changes. If there are any issues with compilation or deployment, an error page lets you know. Quarkus dev mode listens for a debugger on port 5005. If you want to wait for the debugger to attach before running, pass `-Dsuspend` on the command line. If you don't want the debugger at all, you can use `-Ddebug=false`.\n\nThe output should look like the following example:\n\n```output\n__  ____  __  _____   ___  __ ____  ______\n --/ __ \\/ / / / _ | / _ \\/ //_/ / / / __/\n -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\\ \\\n--\\___\\_\\____/_/ |_/_/|_/_/|_|\\____/___/\nINFO  [io.quarkus] (Quarkus Main Thread) quarkus-todo-demo-app-aca 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.2.0.Final) started in 14.826s. Listening on: http://localhost:8080\nINFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.\nINFO  [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, hibernate-orm, hibernate-validator, jdbc-postgresql, narayana-jta, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]\n\n--\nTests paused\nPress [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>\n```\n\nPress <kbd>w</kbd> on the terminal where Quarkus dev mode is running. The <kbd>w</kbd> key opens your default web browser to show the `Todo` application. You can also access the application GUI at `http://localhost:8080` directly.\n\n:::image type=\"content\" source=\"media/deploy-java-quarkus-app/demo.png\" alt-text=\"Screenshot of the Todo sample app.\" lightbox=\"media/deploy-java-quarkus-app/demo.png\":::\n\nTry selecting a few todo items in the todo list. The UI indicates selection with a strikethrough text style. You can also add a new todo item to the todo list by typing **Verify Todo apps** and pressing <kbd>ENTER</kbd>, as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/deploy-java-quarkus-app/demo-local.png\" alt-text=\"Screenshot of the Todo sample app with new items added.\" lightbox=\"media/deploy-java-quarkus-app/demo-local.png\":::\n\nAccess the RESTful API (`/api`) to get all todo items that store in the local PostgreSQL database:\n\n```bash\ncurl --verbose http://localhost:8080/api | jq .\n```\n\nThe output should look like the following example:\n\n```output\n* Connected to localhost (127.0.0.1) port 8080 (#0)\n> GET /api HTTP/1.1\n> Host: localhost:8080\n> User-Agent: curl/7.88.1\n> Accept: */*\n>\n< HTTP/1.1 200 OK\n< content-length: 664\n< Content-Type: application/json;charset=UTF-8\n<\n{ [664 bytes data]\n100   664  100   664    0     0  13278      0 --:--:-- --:--:-- --:--:-- 15441\n* Connection #0 to host localhost left intact\n[\n  {\n    \"id\": 1,\n    \"title\": \"Introduction to Quarkus Todo App\",\n    \"completed\": false,\n    \"order\": 0,\n    \"url\": null\n  },\n  {\n    \"id\": 2,\n    \"title\": \"Quarkus on Azure App Service\",\n    \"completed\": false,\n    \"order\": 1,\n    \"url\": \"https://learn.microsoft.com/en-us/azure/app-service/quickstart-java\"\n  },\n  {\n    \"id\": 3,\n    \"title\": \"Quarkus on Azure Container Apps\",\n    \"completed\": false,\n    \"order\": 2,\n    \"url\": \"https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/\"\n  },\n  {\n    \"id\": 4,\n    \"title\": \"Quarkus on Azure Functions\",\n    \"completed\": false,\n    \"order\": 3,\n    \"url\": \"https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus\"\n  },\n  {\n    \"id\": 5,\n    \"title\": \"Verify Todo apps\",\n    \"completed\": false,\n    \"order\": 5,\n    \"url\": null\n  }\n]\n```\n\nPress <kbd>q</kbd> to exit Quarkus dev mode.\n\n## Create the Azure resources to run the Quarkus app\n\nThe steps in this section show you how to create the following Azure resources to run the Quarkus sample app:\n\n- Azure Database for PostgreSQL Flexible Server\n- Azure Container Registry\n- Azure Container Apps\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\nSome of these resources must have unique names within the scope of the Azure subscription. To ensure this uniqueness, you can use the *initials, sequence, date, suffix* pattern. To apply this pattern, name your resources by listing your initials, some sequence number, today's date, and some kind of resource specific suffix - for example, `rg` for \"resource group\". The following environment variables use this pattern. Replace the placeholder values in `UNIQUE_VALUE` and `LOCATION` with your own values and run the commands in your terminal.\n\n```bash\nexport UNIQUE_VALUE=<your unique value, such as mjg101424>\nexport RESOURCE_GROUP_NAME=${UNIQUE_VALUE}rg-passwordless\nexport LOCATION=<your desired Azure region for deploying your resources - for example, eastus>\nexport REGISTRY_NAME=${UNIQUE_VALUE}regpasswordless\nexport DB_SERVER_NAME=${UNIQUE_VALUE}dbpasswordless\nexport DB_NAME=demodb\nexport ACA_ENV=${UNIQUE_VALUE}envpasswordless\nexport ACA_NAME=${UNIQUE_VALUE}acapasswordless\n```\n\n### [Password](#tab/password)\n\nSome of these resources must have unique names within the scope of the Azure subscription. To ensure this uniqueness, you can use the *initials, sequence, date, suffix* pattern. To apply this pattern, name your resources by listing your initials, some sequence number, today's date, and some kind of resource specific suffix - for example, `rg` for \"resource group\". The following environment variables use this pattern. Replace the placeholder values in `UNIQUE_VALUE`, `LOCATION`, and `DB_PASSWORD` with your own values and run the commands in your terminal.\n\n```bash\nexport UNIQUE_VALUE=<your unique value, such as mjg101424>\nexport RESOURCE_GROUP_NAME=${UNIQUE_VALUE}rg-password\nexport LOCATION=<your desired Azure region for deploying your resources - for example, eastus>\nexport REGISTRY_NAME=${UNIQUE_VALUE}regpassword\nexport DB_SERVER_NAME=${UNIQUE_VALUE}dbpassword\nexport DB_NAME=demodb\nexport DB_ADMIN=demouser\nexport DB_PASSWORD='<your desired password for the database server - for example, Secret123456>'\nexport ACA_ENV=${UNIQUE_VALUE}envpassword\nexport ACA_NAME=${UNIQUE_VALUE}acapassword\n```\n\n---\n\nNext, create a resource group by using the following command:\n\n```azurecli\naz group create \\\n    --name $RESOURCE_GROUP_NAME \\\n    --location $LOCATION\n```\n\n### Create an Azure Database for PostgreSQL flexible server instance\n\nAzure Database for PostgreSQL flexible server is a fully managed database service designed to provide more granular control and flexibility over database management functions and configuration settings. This section shows you how to create an Azure Database for PostgreSQL flexible server instance using the Azure CLI. For more information, see [Quickstart: Create an instance of Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/quickstart-create-server).\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\nCreate an Azure Database for PostgreSQL flexible server instance by using the following command:\n\n```azurecli\naz postgres flexible-server create \\\n    --name $DB_SERVER_NAME \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --database-name $DB_NAME \\\n    --public-access None \\\n    --sku-name Standard_B1ms \\\n    --tier Burstable \\\n    --active-directory-auth Enabled\n```\n\nIt takes a few minutes to create the server, database, admin user, and firewall rules. If the command is successful, the output looks similar to the following example:\n\n```output\n{\n  \"connectionString\": \"postgresql://REDACTED:REDACTED@<DB_SERVER_NAME>.postgres.database.azure.com/<DB_NAME>?sslmode=require\",\n  \"databaseName\": \"<DB_NAME>\",\n  \"host\": \"<DB_SERVER_NAME>.postgres.database.azure.com\",\n  \"id\": \"/subscriptions/REDACTED/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.DBforPostgreSQL/flexibleServers/<DB_SERVER_NAME>\",\n  \"location\": \"East US\",\n  \"password\": \"REDACTED\",\n  \"resourceGroup\": \"<RESOURCE_GROUP_NAME>\",\n  \"skuname\": \"Standard_B1ms\",\n  \"username\": \"REDACTED\",\n  \"version\": \"13\"\n}\n```\n\nAdd the current signed-in user as Microsoft Entra Admin to the Azure Database for PostgreSQL Flexible Server instance by using the following commands:\n\n```azurecli\nENTRA_ADMIN_NAME=$(az ad signed-in-user show --query userPrincipalName -o tsv)\naz postgres flexible-server ad-admin create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server-name $DB_SERVER_NAME \\\n    --display-name $ENTRA_ADMIN_NAME \\\n    --object-id $(az ad signed-in-user show --query id -o tsv)\n```\n\nSuccessful output is a JSON object including the property `\"type\": \"Microsoft.DBforPostgreSQL/flexibleServers/administrators\"`.\n\n### [Password](#tab/password)\n\nCreate an Azure Database for PostgreSQL flexible server instance by using the following command:\n\n```azurecli\naz postgres flexible-server create \\\n    --name $DB_SERVER_NAME \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --admin-user $DB_ADMIN \\\n    --admin-password $DB_PASSWORD \\\n    --database-name $DB_NAME \\\n    --public-access 0.0.0.0 \\\n    --sku-name Standard_B1ms \\\n    --tier Burstable\n```\n\nIt takes a few minutes to create the server, database, admin user, and firewall rules. If the command is successful, the output looks similar to the following example:\n\n```output\n{\n  \"connectionString\": \"postgresql://<DB_ADMIN>:<DB_PASSWORD>@<DB_SERVER_NAME>.postgres.database.azure.com/<DB_NAME>?sslmode=require\",\n  \"databaseName\": \"<DB_NAME>\",\n  \"firewallName\": \"AllowAllAzureServicesAndResourcesWithinAzureIps_2024-10-14_14-39-45\",\n  \"host\": \"<DB_SERVER_NAME>.postgres.database.azure.com\",\n  \"id\": \"/subscriptions/REDACTED/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.DBforPostgreSQL/flexibleServers/<DB_SERVER_NAME>\",\n  \"location\": \"East US\",\n  \"password\": \"<DB_PASSWORD>\",\n  \"resourceGroup\": \"<RESOURCE_GROUP_NAME>\",\n  \"skuname\": \"Standard_B1ms\",\n  \"username\": \"<DB_ADMIN>\",\n  \"version\": \"13\"\n}\n```\n\n---\n\n### Create a Microsoft Azure Container Registry instance\n\nBecause Quarkus is a cloud native technology, it has built-in support for creating containers that run in Container Apps. Container Apps is entirely dependent on having a container registry from which it finds the container images to run. Container Apps has built-in support for Azure Container Registry.\n\nUse the [`az acr create`](/cli/azure/acr#az-acr-create) command to create the Container Registry instance. The following example creates n Container Registry instance named with the value of your environment variable `${REGISTRY_NAME}`:\n\n```azurecli\naz acr create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --location ${LOCATION} \\\n    --name $REGISTRY_NAME \\\n    --sku Basic\n```\n\nAfter a short time, you should see JSON output that contains the following lines:\n\n```output\n  \"provisioningState\": \"Succeeded\",\n  \"publicNetworkAccess\": \"Enabled\",\n  \"resourceGroup\": \"<YOUR_RESOURCE_GROUP>\",\n```\n\nGet the login server for the container registry instance by using the following command:\n\n```azurecli\nexport LOGIN_SERVER=$(az acr show \\\n    --name $REGISTRY_NAME \\\n    --query 'loginServer' \\\n    --output tsv)\necho $LOGIN_SERVER\n```\n\n### Connect your Docker to the Azure Container Registry instance\n\nSign in to the container registry instance. Signing in lets you push an image. Use the following command to sign in to the registry:\n\n```azurecli\naz acr login --name $REGISTRY_NAME\n```\n\nIf you signed in to the container registry instance successfully, you should see `Login Succeeded` at the end of command output.\n\n### Create an environment\n\nAn environment in Azure Container Apps creates a secure boundary around a group of container apps. Container Apps deployed to the same environment are deployed in the same virtual network and write logs to the same Log Analytics workspace.\n\nIf this is your first time to create an Azure Container Apps environment, you probably need to register the `Microsoft.App` and `Microsoft.OperationalInsights` namespaces. Use the following commands to register the namespaces:\n\n```azurecli\naz provider register --namespace Microsoft.App --wait\naz provider register --namespace Microsoft.OperationalInsights --wait\n```\n\nNow, use the [`az containerapp env create`](/cli/azure/containerapp/env#az-containerapp-env-create) command to create an environment, as shown in the following example:\n\n```azurecli\naz containerapp env create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --location $LOCATION \\\n    --name $ACA_ENV\n```\n\nIf you're asked to install an extension, answer <kbd>Y</kbd>.\n\n## Customize the cloud native configuration\n\nAs a cloud native technology, Quarkus offers the ability to automatically generate container images. For more information, see [Container Images](https://quarkus.io/guides/container-image). Developers can then deploy the application image to a target containerized platform - for example, Azure Container Apps.\n\nTo generate the container image, use the following command to add the `container-image-jib` extension in your local terminal:\n\n```bash\nquarkus ext add container-image-jib\n```\n\nQuarkus modifies the POM to ensure the extension is included among the `<dependencies>`. If you're asked to install something called `JBang`, answer yes and allow it to be installed.\n\nThe output should look like the following example:\n\n```output\n[SUCCESS] ✅  Extension io.quarkus:quarkus-container-image-jib has been installed\n```\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\nOpen the **pom.xml** file and you should see the following dependencies added by the `container-image-jib` extension:\n\n```xml\n<dependency>\n  <groupId>io.quarkus</groupId>\n  <artifactId>quarkus-container-image-jib</artifactId>\n</dependency>\n```\n\nThen, add the following dependencies to the **pom.xml** file to support passwordless authentication with Azure Database for PostgreSQL Flexible Server:\n\n```xml\n<dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-identity-extensions</artifactId>\n    <version>1.1.20</version>\n</dependency>\n```\n\n### [Password](#tab/password)\n\nOpen the **pom.xml** file and you should see the following dependencies added by the `container-image-jib` extension:\n\n```xml\n<dependency>\n  <groupId>io.quarkus</groupId>\n  <artifactId>quarkus-container-image-jib</artifactId>\n</dependency>\n```\n\n---\n\nAs a cloud native technology, Quarkus supports the notion of configuration profiles. Quarkus has the following three built-in profiles:\n\n- `dev` - Activated when in development mode.\n- `test` - Activated when running tests.\n- `prod` - The default profile when not running in development or test mode.\n\nQuarkus supports any number of named profiles, as needed.\n\nThe remaining steps in this section direct you to uncomment and customize values in the **src/main/resources/application.properties** file. Ensure that all lines starting with `# %prod.` are uncommented by removing the leading `#` character.\n\nThe `%prod.` prefix indicates that these properties are active when running in the `prod` profile. For more information on configuration profiles, see the [Quarkus documentation](https://access.redhat.com/search/?q=Quarkus+Using+configuration+profiles).\n\n### Examine the database configuration\n\nAfter you uncomment the properties, the database configuration in the **src/main/resources/application.properties** file should look like the following example:\n\n```properties\n# Database configurations\n%prod.quarkus.datasource.db-kind=postgresql\n%prod.quarkus.datasource.jdbc.url=\n%prod.quarkus.datasource.username=\n%prod.quarkus.datasource.password=\n%prod.quarkus.hibernate-orm.database.generation=create\n%prod.quarkus.hibernate-orm.sql-load-script=no-file\n```\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\nRemove the `%prod.quarkus.datasource.password` property because it's not required when using passwordless authentication with Azure Database for PostgreSQL flexible server. Update the other database connection related properties `%prod.quarkus.datasource.jdbc.url` and `%prod.quarkus.datasource.username` with the values as shown in the following example. The final configuration should look like the following example:\n\n```properties\n# Database configurations\n%prod.quarkus.datasource.db-kind=postgresql\n%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\\\nauthenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\\\n&sslmode=require\n%prod.quarkus.datasource.username=${AZURE_POSTGRESQL_USERNAME}\n%prod.quarkus.hibernate-orm.database.generation=create\n%prod.quarkus.hibernate-orm.sql-load-script=no-file\n```\n\nThe value of `${AZURE_POSTGRESQL_HOST}`, `${AZURE_POSTGRESQL_PORT}`, `${AZURE_POSTGRESQL_DATABASE}`, and `${AZURE_POSTGRESQL_USERNAME}` are provided by the Azure Container Apps environment at runtime using the Service Connector passwordless extension later in this article.\n\n### [Password](#tab/password)\n\nThe database connection related properties `%prod.quarkus.datasource.jdbc.url`, `%prod.quarkus.datasource.username`, and `%prod.quarkus.datasource.password` are intentionally left empty because they're provided at runtime by the Azure Container Apps environment for security reasons.\n\n---\n\nGenerally, you don't expect that the data persisted in the database is dropped and repopulated with the sample data in a production environment. That's why you can see that the schema for `quarkus.hibernate-orm.database.generation` is specified as `create` so that the app only creates the schema when it doesn't exist at the initial startup. Besides, the database isn't populated beforehand with any sample data because `hibernate-orm.sql-load-script` is specified as `no-file`. This setting is different than when you ran the app locally in development mode previously. The default values in development mode for `quarkus.hibernate-orm.database.generation` and `hibernate-orm.sql-load-script` are `drop-and-create` and `import.sql` respectively, which means the app always drops and recreates the database schema and loads the data defined in **import.sql**. The **import.sql** file is a convenience facility from Quarkus. If the **src/main/resources/import.sql** file exists in the Quarkus jar, and the value of the `hibernate-orm.sql-load-script` property is `import.sql`, the SQL DML statements in this file are executed at startup time for the app.\n\n### Test your Quarkus app locally with Azure Database for PostgreSQL flexible server\n\nBefore deploying the Quarkus app to Azure Container Apps, test the connection to the Azure Database for PostgreSQL flexible server instance locally.\n\nFirst, add the local IP address to the Azure Database for PostgreSQL flexible server instance firewall rules by using the following commands:\n\n```azurecli\nexport AZ_LOCAL_IP_ADDRESS=$(curl -s https://whatismyip.akamai.com)\n\naz postgres flexible-server firewall-rule create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $DB_SERVER_NAME \\\n    --rule-name $DB_SERVER_NAME-database-allow-local-ip \\\n    --start-ip-address $AZ_LOCAL_IP_ADDRESS \\\n    --end-ip-address $AZ_LOCAL_IP_ADDRESS\n```\n\nNext, set the following environment variables in your previous terminal. These environment variables are used to connect to the Azure Database for PostgreSQL flexible server instance from the Quarkus app running locally:\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\n```bash\nexport AZURE_POSTGRESQL_HOST=${DB_SERVER_NAME}.postgres.database.azure.com\nexport AZURE_POSTGRESQL_PORT=5432\nexport AZURE_POSTGRESQL_DATABASE=${DB_NAME}\nexport AZURE_POSTGRESQL_USERNAME=${ENTRA_ADMIN_NAME}\n```\n\n### [Password](#tab/password)\n\n```bash\nexport QUARKUS_DATASOURCE_JDBC_URL=jdbc:postgresql://${DB_SERVER_NAME}.postgres.database.azure.com:5432/${DB_NAME}?sslmode=require\nexport QUARKUS_DATASOURCE_USERNAME=${DB_ADMIN}\nexport QUARKUS_DATASOURCE_PASSWORD=${DB_PASSWORD}\n```\n\nThe values of these environment variables are passed to properties `%prod.quarkus.datasource.jdbc.url`, `%prod.quarkus.datasource.username`, and `%prod.quarkus.datasource.password`. Quarkus knows to look up values from corresponding environment variables if there's no value in the **application.properties** file.\n\n---\n\nRun the Quarkus app locally to test the connection to the Azure Database for PostgreSQL flexible server instance. Use the following commands to start the app in production mode:\n\n```bash\nmvn clean package -DskipTests\njava -jar target/quarkus-app/quarkus-run.jar\n```\n\nTo access the Todo application, open a new web browser to `http://localhost:8080`. You should see the same Todo app as you saw when you ran the app locally in development mode, without any Todo items.\n\nTo stop the app, press <kbd>Control</kbd>+<kbd>C</kbd>.\n\n## Build the container image and push it to the container registry\n\nNow, use the following command to build the application itself. This command uses the Jib extension to build the container image.\n\n```bash\nexport TODO_QUARKUS_IMAGE_NAME=todo-quarkus-aca\nexport TODO_QUARKUS_IMAGE_TAG=${LOGIN_SERVER}/${TODO_QUARKUS_IMAGE_NAME}:1.0\nquarkus build -Dquarkus.container-image.build=true -Dquarkus.container-image.image=${TODO_QUARKUS_IMAGE_TAG} --no-tests \n```\n\nThe output should end with `BUILD SUCCESS`.\n\nYou can verify whether the container image is generated as well by using the `docker` command line (CLI), as shown in the following example:\n\n```bash\ndocker images | grep ${TODO_QUARKUS_IMAGE_NAME}\n```\n\nThe output looks similar to the following example:\n\n```output\n<LOGIN_SERVER_VALUE>/todo-quarkus-aca   1.0       0804dfd834fd   2 minutes ago   407MB\n```\n\nPush the container images to container registry by using the following command:\n\n```bash\ndocker push ${TODO_QUARKUS_IMAGE_TAG}\n```\n\nThe output should look similar to the following example:\n\n```output\nThe push refers to repository [<LOGIN_SERVER_VALUE>/todo-quarkus-aca]\n188a550fce3d: Pushed\n4e3afea591e2: Pushed\n1db0eba807a6: Pushed\nc72d9ccda0b2: Pushed\nd7819b8a2d18: Pushed\nd0e5cba6b262: Pushed\ne0bac91f0f10: Pushed\n1.0: digest: sha256:f9ccb476e2388efa0dfdf817625a94f2247674148a69b7e4846793e63c8be994 size: 1789\n```\n\n## Deploy the Quarkus app to Azure Container Apps\n\nNow that you pushed the app image to the container registry, use the following command to create an Azure Container Apps instance to run the app after pulling the image from the container registry:\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\n```azurecli\naz containerapp create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $ACA_NAME \\\n    --image $TODO_QUARKUS_IMAGE_TAG \\\n    --environment $ACA_ENV \\\n    --registry-server $LOGIN_SERVER \\\n    --registry-identity system \\\n    --target-port 8080 \\\n    --ingress 'external' \\\n    --min-replicas 1\n```\n\nSuccessful output is a JSON object including the property `\"type\": \"Microsoft.App/containerApps\"`.\n\nThen, connect the Azure Database for PostgreSQL Flexible Server instance to the container app using Service Connector by using the following steps:\n\n1. Install the [Service Connector](/azure/service-connector/overview) passwordless extension for the Azure CLI by using the following command:\n\n    ```azurecli\n    az extension add --name serviceconnector-passwordless --upgrade --allow-preview true\n    ```\n\n1. Connect the database to the container app with a system-assigned managed identity by using the following command:\n\n    ```azurecli\n    az containerapp connection create postgres-flexible \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --name $ACA_NAME \\\n        --target-resource-group $RESOURCE_GROUP_NAME \\\n        --server $DB_SERVER_NAME \\\n        --database $DB_NAME \\\n        --system-identity \\\n        --container $ACA_NAME\n    ```\n\n   Successful output is a JSON object including the property `\"type\": \"microsoft.servicelinker/linkers\"`.\n\n### [Password](#tab/password)\n\n```azurecli\nexport DATASOURCE_JDBC_URL=jdbc:postgresql://${DB_SERVER_NAME}.postgres.database.azure.com:5432/${DB_NAME}?sslmode=require\naz containerapp create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $ACA_NAME \\\n    --image $TODO_QUARKUS_IMAGE_TAG \\\n    --environment $ACA_ENV \\\n    --registry-server $LOGIN_SERVER \\\n    --registry-identity system \\\n    --target-port 8080 \\\n    --secrets \\\n        jdbcurl=${DATASOURCE_JDBC_URL} \\\n        dbusername=${DB_ADMIN} \\\n        dbpassword=${DB_PASSWORD} \\\n    --env-vars \\\n        QUARKUS_DATASOURCE_JDBC_URL=secretref:jdbcurl \\\n        QUARKUS_DATASOURCE_USERNAME=secretref:dbusername \\\n        QUARKUS_DATASOURCE_PASSWORD=secretref:dbpassword \\\n    --ingress 'external' \\\n    --min-replicas 1\n```\n\nThe `--secrets` option is used to create secrets referenced by database connection related environment variables `QUARKUS_DATASOURCE_JDBC_URL`, `QUARKUS_DATASOURCE_USERNAME`, and `QUARKUS_DATASOURCE_PASSWORD`. The values of these environment variables are passed to properties `%prod.quarkus.datasource.jdbc.url`, `%prod.quarkus.datasource.username`, and `%prod.quarkus.datasource.password`. Quarkus looks up values from corresponding environment variables if there's no value in the **application.properties** file.\n\nSuccessful output is a JSON object including the property `\"type\": \"Microsoft.App/containerApps\"`.\n\n---\n\nGet a fully qualified URL to access the Todo application by using the following command:\n\n```azurecli\nexport QUARKUS_URL=https://$(az containerapp show \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $ACA_NAME \\\n    --query properties.configuration.ingress.fqdn -o tsv)\necho $QUARKUS_URL\n```\n\nOpen a new web browser to the value of `${QUARKUS_URL}`. If the webpage doesn't render correctly, wait for a while and refresh the page.\n\nThen, add a new todo item with the text `Deployed the Todo app to Container Apps`. Select this item to mark it as completed.\n\n:::image type=\"content\" source=\"media/deploy-java-quarkus-app/demo-updated.png\" alt-text=\"Screenshot of the Todo sample app running in Container Apps.\" lightbox=\"media/deploy-java-quarkus-app/demo-updated.png\":::\n\nAccess the RESTful API (`/api`) to get all todo items stored in the Azure Database for PostgreSQL, as shown in the following example:\n\n```bash\ncurl --verbose -k ${QUARKUS_URL}/api | jq .\n```\n\nThe output should look like the following example:\n\n```output\n* Connected to <aca-name>.<random-id>.eastus.azurecontainerapps.io (20.231.235.79) port 443 (#0)\n> GET /api HTTP/2\n> Host: <aca-name>.<random-id>.eastus.azurecontainerapps.io\n> user-agent: curl/7.88.1\n> accept: */*\n>\n< HTTP/2 200\n< content-length: 88\n< content-type: application/json;charset=UTF-8\n<\n[\n  {\n    \"id\": 1,\n    \"title\": \"Deployed the Todo app to Container Apps\",\n    \"completed\": true,\n    \"order\": 1,\n    \"url\": null\n  }\n]\n```\n\n### Verify that the database is updated\n\nUse the following command to verify that the database was updated with the new todo item:\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\n```azurecli\nexport ACCESS_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)\naz postgres flexible-server execute \\\n    --admin-user $ENTRA_ADMIN_NAME \\\n    --admin-password $ACCESS_TOKEN \\\n    --name $DB_SERVER_NAME \\\n    --database-name $DB_NAME \\\n    --querytext \"select * from todo;\"\n```\n\n### [Password](#tab/password)\n\n```azurecli\naz postgres flexible-server execute \\\n    --admin-user $DB_ADMIN \\\n    --admin-password $DB_PASSWORD \\\n    --name $DB_SERVER_NAME \\\n    --database-name $DB_NAME \\\n    --querytext \"select * from todo;\"\n```\n\n---\n\nIf you're asked to install an extension, answer <kbd>Y</kbd>.\n\nThe output should look similar to the following example, and should include the same item in the Todo app GUI shown previously:\n\n```output\nSuccessfully connected to <DB_SERVER_NAME>.\nRan Database Query: 'select * from todo;'\nRetrieving first 30 rows of query output, if applicable.\nClosed the connection to <DB_SERVER_NAME>\n[\n  {\n    \"completed\": true,\n    \"id\": 1,\n    \"ordering\": 1,\n    \"title\": \"Deployed the Todo app to Container Apps\",\n    \"url\": null\n  }\n]\n```\n\nWhen you're finished, delete the firewall rule that allows your local IP address to access the Azure Database for PostgreSQL flexible server instance by using the following command:\n\n```azurecli\naz postgres flexible-server firewall-rule delete \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $DB_SERVER_NAME \\\n    --rule-name $DB_SERVER_NAME-database-allow-local-ip \\\n    --yes\n```\n\n## Clean up resources\n\nTo avoid Azure charges, you should clean up unneeded resources. When the cluster is no longer needed, use the [`az group delete`](/cli/azure/group#az-group-delete) command to remove the resource group, container service, container registry, and all related resources.\n\n```azurecli\ngit reset --hard\ndocker rmi ${TODO_QUARKUS_IMAGE_TAG}\naz group delete --name $RESOURCE_GROUP_NAME --yes --no-wait\n```\n\nYou might also want to use `docker rmi` to delete the `postgres` and `testcontainers` container images generated by Quarkus dev mode.\n\n## Next steps\n\n- [Azure Container Apps](https://azure.microsoft.com/products/container-apps/)\n- [Deploy a Java application with Quarkus on an Azure Kubernetes Service cluster](/azure/aks/howto-deploy-java-quarkus-app)\n- [Deploy serverless Java apps with Quarkus on Azure Functions](/azure/azure-functions/functions-create-first-quarkus)\n- [Quarkus](https://quarkus.io/)\n- [Jakarta EE on Azure](./index.yml)\n"
  },
  {
    "path": "articles/java/ee/how-to-configure-passwordless-datasource-eap.md",
    "content": "---\ntitle: Configure Passwordless Database Connections for Java Apps on Red Hat JBoss EAP\ntitleSuffix: Azure\ndescription: Configure passwordless datasource connections for Java apps on Red Hat JBoss EAP.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.topic: how-to\nms.date: 03/26/2026\nms.custom: devx-track-azurecli, devx-track-java, devx-track-javaee, devx-track-javaee-wls, devx-track-javaee-wls-aks, devx-track-javaee-wls-vm, has-azure-ad-ps-ref, passwordless-java\n---\n\n# Configure passwordless database connections for Java apps on Red Hat JBoss EAP\n\nThis article shows you how to configure passwordless database connections for Java apps on Red Hat JBoss EAP offers with the Azure portal.\n\nIn this guide, you accomplish the following tasks:\n\n> [!div class=\"checklist\"]\n> - Provision database resources using Azure CLI.\n> - Enable the Microsoft Entra administrator in the database.\n> - Provision a user-assigned managed identity and create a database user for it.\n> - Configure a passwordless database connection in Red Hat JBoss EAP offers with the Azure portal.\n> - Validate the database connection.\n\nThe offers support passwordless connections for Azure database for PostgreSQL and Azure SQL databases.\n\n[!INCLUDE [how-to-configure-passwordless-datasource-non-appserver](includes/how-to-configure-passwordless-datasource-non-appserver.md)]\n\n## Configure a passwordless database connection for Red Hat JBoss EAP on Azure VMs\n\nBefore proceeding, ensure that the Azure identity you use to sign in and complete this article has either the [Owner](/azure/role-based-access-control/built-in-roles#owner) role in the current subscription or the [Contributor](/azure/role-based-access-control/built-in-roles#contributor) and [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) roles in the current subscription. For an overview of Azure roles, see [What is Azure role-based access control (Azure RBAC)?](/azure/role-based-access-control/overview) For details on the specific roles required by the Red Hat JBoss EAP marketplace offer, see [Azure built-in roles](/azure/role-based-access-control/built-in-roles).\n\nThis section shows you how to configure the passwordless data source connection using the Azure Marketplace offers for Red Hat JBoss EAP.\n\nFirst, begin the process of deploying an offer. The following offers support passwordless database connections:\n\n- [JBoss EAP Standalone on RHEL VM](https://aka.ms/eap-vm-single-portal)\n- [JBoss EAP Cluster on RHEL VMs](https://aka.ms/eap-vm-cluster-portal). For more information, see [Quickstart: Deploy a JBoss EAP cluster on Azure Virtual Machines (VMs)](/azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm).\n\nEnter the required information in the **Basics** pane and other panes if you want to enable the features. When you reach the **Database** pane, enter the passwordless configuration as shown in the following steps:\n\n1. For **Connect to database?**, select **Yes**.\n1. Under **Connection settings**, for **Choose database type**, open the dropdown menu and then select **Azure SQL (supports passwordless connection)**.\n1. For **JNDI Name**, enter **testpasswordless** or your expected value.\n1. For **DataSource Connection String**, input the connection string you obtained in last section.\n1. Select **Use passwordless datasource connection**.\n1. For **User assigned managed identity**, select the managed identity you created in previous step. In this example, its name is **myManagedIdentity**.\n1. Select **Add**.\n\nThe **Connection settings** section should look like the following screenshot:\n\n:::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-eap/azure-portal-azure-sql-configuration.png\" alt-text=\"Screenshot of the Azure portal that shows the Choose database type page.\" lightbox=\"media/how-to-configure-passwordless-datasource-eap/azure-portal-azure-sql-configuration.png\":::\n\n## Verify the database connection\n\nThe database connection is configured successfully if the offer deployment completes without error.\n\nAfter the deployment completes, follow these steps in the Azure portal to find the Admin console URL.\n\n1. Find the resource group in which you deployed JBoss EAP.\n1. Under **Settings**, select **Deployments**.\n1. Select the deployment with the longest **Duration**. This deployment should be at the bottom of the list.\n1. Select **Outputs**.\n1. The URL of the admin console is the value of the **adminConsole** output.\n1. Copy the value of the output variable **adminConsole**.\n1. Paste the value into your browser address bar and press <kbd>Enter</kbd> to open the sign-in page of the Integrated Solutions Console.\n\nUse the following steps to verify the database connection:\n\n1. Sign in to the admin console with the username and password you provided on the **Basics** pane.\n\n   :::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-eap/admin-console-login.png\" alt-text=\"Screenshot of admin console login screen.\" lightbox=\"media/how-to-configure-passwordless-datasource-eap/admin-console-login.png\":::\n\n1. After you sign in, select **Configuration** from the main menu.\n1. In the column browser, select **Subsystems**, **Datasources & Drivers**, **Datasources**, **dataSource-mssqlserver**.\n1. In the dropdown menu, select **Test connection**\n1. You should see a message stating something similar to `Successfully tested connection for data source dataSource-mssqlserver.`\n\nThe following screenshot highlights the relevant user interface elements:\n\n:::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-eap/screenshot-eap-console-successful-database.png\" alt-text=\"Screenshot of the admin console that shows the test database page.\" lightbox=\"media/how-to-configure-passwordless-datasource-eap/screenshot-eap-console-successful-database.png\":::\n\n## Clean up resources\n\nIf you don't need these resources, you can delete them by using the following commands:\n\n```azurecli-interactive\naz group delete --name ${RESOURCE_GROUP_NAME}\naz group delete --name <resource-group-name-that-deploys-the-offer>\n```\n\n## Next steps\n\nLearn more about running JBoss EAP on  Azure RedHat OpenShift and virtual machines by following these links:\n\n> [!div class=\"nextstepaction\"]\n> [Explore JBoss EAP products on Azure](/azure/developer/java/ee/jboss-on-azure)\n\n> [!div class=\"nextstepaction\"]\n> [Quickstart: Deploy a JBoss EAP cluster on Azure Virtual Machines (VMs)](/azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n\n> [!div class=\"nextstepaction\"]\n> [Quickstart: Deploy JBoss EAP on Azure Red Hat OpenShift](/azure/openshift/howto-deploy-java-jboss-enterprise-application-platform-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n\n> [!div class=\"nextstepaction\"]\n> [Migrate JBoss EAP applications to JBoss EAP on Azure VMs](/azure/developer/java/migration/migrate-jboss-eap-to-jboss-eap-on-azure-vms?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n\n> [!div class=\"nextstepaction\"]\n> [Tutorial: Migrate JBoss EAP Application Server to Azure Virtual Machines with high availability and disaster recovery](/azure/developer/java/migration/migrate-jboss-eap-to-vms-with-ha-dr?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n"
  },
  {
    "path": "articles/java/ee/how-to-configure-passwordless-datasource-websphere.md",
    "content": "---\ntitle: Configure Passwordless Database Connections for Java Apps on IBM WebSphere Application Server\ntitleSuffix: Azure\ndescription: Configure passwordless datasource connections for Java apps on IBM WebSphere Application Server.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.topic: how-to\nms.date: 03/26/2026\nms.custom: devx-track-azurecli, devx-track-java, devx-track-javaee, devx-track-javaee-wls, devx-track-javaee-wls-aks, devx-track-javaee-wls-vm, has-azure-ad-ps-ref, passwordless-java\n---\n\n# Configure passwordless database connections for Java apps on IBM WebSphere Application Server\n\nThis article shows you how to configure passwordless database connections for Java apps on IBM WebSphere Application Server offers with the Azure portal.\n\nIn this guide, you accomplish the following tasks:\n\n> [!div class=\"checklist\"]\n> - Provision database resources using Azure CLI.\n> - Enable the Microsoft Entra administrator in the database.\n> - Provision a user-assigned managed identity and create a database user for it.\n> - Configure a passwordless database connection in IBM WebSphere Application Server offers with the Azure portal.\n> - Validate the database connection.\n\nThe offers support passwordless connections for PostgreSQL, MySQL, and Azure SQL databases.\n\n[!INCLUDE [how-to-configure-passwordless-datasource-non-appserver](includes/how-to-configure-passwordless-datasource-non-appserver.md)]\n\n## Configure a passwordless database connection for IBM WebSphere Application Server on Azure VMs\n\nBefore proceeding, ensure that the Azure identity you use to sign in and complete this article has either the [Owner](/azure/role-based-access-control/built-in-roles#owner) role in the current subscription or the [Contributor](/azure/role-based-access-control/built-in-roles#contributor) and [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) roles in the current subscription. For an overview of Azure roles, see [What is Azure role-based access control (Azure RBAC)?](/azure/role-based-access-control/overview) For details on the specific roles required by Oracle WebLogic marketplace offer, see [Azure built-in roles](/azure/role-based-access-control/built-in-roles).\n\nThis section shows you how to configure the passwordless data source connection using the Azure Marketplace offers for IBM WebSphere Application Server.\n\nFirst, begin the process of deploying an offer. The following offers support passwordless database connections:\n\n- [WebSphere Traditional on VM](https://aka.ms/twas-single-portal)\n- [WebSphere Traditional cluster on VM](https://aka.ms/twas-cluster-portal). For more information, see [Quickstart: Deploy WebSphere Application Server Network Deployment cluster on Azure Virtual Machines](traditional-websphere-application-server-virtual-machines.md).\n\nEnter the required information in the **Basics** pane and other panes if you want to enable the features. When you reach the **Database** pane, enter the passwordless configuration as shown in the following steps:\n\n1. For **Connect to database?**, select **Yes**.\n1. Under **Connection settings**, for **Choose database type**, open the dropdown menu and then select **Azure SQL (with support for passwordless connection)**.\n1. For **JNDI name**, enter **testpasswordless** or your expected value.\n1. For **DataSource Connection String**, input the connection string you obtained in last section.\n1. Select **Use passwordless datasource connection**.\n1. For **User assigned managed identity**, select the managed identity you created in previous step. In this example, its name is **myManagedIdentity**.\n1. Select **Add**.\n\nThe **Connection settings** section should look like the following screenshot:\n\n:::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-websphere/azure-portal-azure-sql-configuration.png\" alt-text=\"Screenshot of the Azure portal that shows the Choose database type page.\" lightbox=\"media/how-to-configure-passwordless-datasource-websphere/azure-portal-azure-sql-configuration.png\":::\n\n## Verify the database connection\n\nThe database connection is configured successfully if the offer deployment completes without error.\n\nAfter the deployment completes, follow these steps in the Azure portal to find the Admin console URL.\n\n1. Find the resource group in which you deployed WebSphere.\n1. Under **Settings**, select **Deployments**.\n1. Select the deployment with the longest **Duration**. This deployment should be at the bottom of the list.\n1. Select **Outputs**.\n1. The URL of the Integrated Solutions Console is the value of the **adminSecuredConsole** output.\n1. Copy the value of the output variable **adminSecuredConsole**.\n1. Paste the value into your browser address bar and press <kbd>Enter</kbd> to open the sign-in page of the Integrated Solutions Console.\n\nUse the following steps to verify the database connection:\n\n1. Sign in to the Integrated Solutions Console with the username and password you provided on the **Basics** pane.\n1. In the navigation pane, expand **Resources** then **JDBC**.\n1. Select **Data sources**.\n1. Select the check box next to the row with the **JNDI name** value matching the value you entered in the **Database** tab.\n1. Select **Test connection**.\n1. You should see a message stating something similar to `The test connection operation for data source dataSource-sqlserver on server server1 at node was0aef4a-vmNode01 was successful.`\n\nThe following screenshot highlights the relevant user interface elements:\n\n:::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-websphere/screenshot-twas-console-successful-database.png\" alt-text=\"Screenshot of the Integrated solutions console that shows the test database page.\" lightbox=\"media/how-to-configure-passwordless-datasource-websphere/screenshot-twas-console-successful-database.png\":::\n\n## Clean up resources\n\nIf you don't need these resources, you can delete them by using the following commands:\n\n```azurecli-interactive\naz group delete --name ${RESOURCE_GROUP_NAME}\naz group delete --name <resource-group-name-that-deploys-the-offer>\n```\n\n## Next steps\n\nLearn more about running WebSphere Application Server on AKS, Azure RedHat OpenShift, or virtual machines by following these links:\n\n> [!div class=\"nextstepaction\"]\n> [Explore IBM WebSphere products on Azure](websphere-family.md)\n\n> [!div class=\"nextstepaction\"]\n> [Migrate WebSphere applications to AKS](../migration/migrate-websphere-to-azure-kubernetes-service.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n\n> [!div class=\"nextstepaction\"]\n> [Migrate WebSphere applications to Azure Red Hat OpenShift](../migration/migrate-websphere-to-azure-redhat-openshift.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n\n> [!div class=\"nextstepaction\"]\n> [Migrate WebSphere applications to Azure Virtual Machines](../migration/migrate-websphere-to-virtual-machines.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n"
  },
  {
    "path": "articles/java/ee/how-to-configure-passwordless-datasource-wls.md",
    "content": "---\ntitle: Configure Passwordless Database Connections for Java Apps on Oracle WebLogic Server\ntitleSuffix: Azure\ndescription: Configure passwordless datasource connection using marketplace offers.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.topic: how-to\nms.date: 03/26/2026\nms.custom: devx-track-azurecli, devx-track-extended-java, devx-track-java, devx-track-javaee, devx-track-javaee-wls, devx-track-javaee-wls-aks, devx-track-javaee-wls-vm, has-azure-ad-ps-ref, passwordless-java\n---\n\n# Configure passwordless database connections for Java apps on Oracle WebLogic Server\n\nThis article shows you how to configure passwordless database connections for Java apps on Oracle WebLogic Server offers with the Azure portal.\n\nIn this guide, you accomplish the following tasks:\n\n> [!div class=\"checklist\"]\n> - Provision database resources using Azure CLI.\n> - Enable the Microsoft Entra administrator in the database.\n> - Provision a user-assigned managed identity and create a database user for it.\n> - Configure a passwordless database connection in Oracle WebLogic offers with the Azure portal.\n> - Validate the database connection.\n\nThe offers support passwordless connections for PostgreSQL, MySQL, and Azure SQL databases.\n\n[!INCLUDE [how-to-configure-passwordless-datasource-non-appserver](includes/how-to-configure-passwordless-datasource-non-appserver.md)]\n\n## Configure a passwordless database connection for Oracle WebLogic Server on Azure VMs\n\nBefore proceeding, Ensure the Azure identity you use to sign in and complete this article has either the [Owner](/azure/role-based-access-control/built-in-roles#owner) role in the current subscription or the [Contributor](/azure/role-based-access-control/built-in-roles#contributor) and [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) roles in the current subscription. For an overview of Azure roles, see [What is Azure role-based access control (Azure RBAC)?](/azure/role-based-access-control/overview) For details on the specific roles required by Oracle WebLogic marketplace offer, see [Azure built-in roles](/azure/role-based-access-control/built-in-roles).\n\nThis section shows you how to configure the passwordless data source connection using the Azure Marketplace offers for Oracle WebLogic Server.\n\nFirst, begin the process of deploying an offer. The following offers support passwordless database connections:\n\n- [Oracle WebLogic Server on Azure Kubernetes Service (AKS)](https://aka.ms/wls-aks-portal)\n    - [Quickstart](/azure/aks/howto-deploy-java-wls-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/ee/breadcrumb/toc.json)\n- [Oracle WebLogic Server Cluster on VMs](https://aka.ms/wls-vm-cluster)\n    - [Quickstart](/azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n- [Oracle WebLogic Server with Admin Server on VMs](https://aka.ms/wls-vm-admin)\n    - [Quickstart](/azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n- [Oracle WebLogic Server Dynamic Cluster on VMs](https://aka.ms/wls-vm-dynamic-cluster)\n    - [Quickstart](/azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n\nEnter the required information in the **Basics** pane and other panes if you want to enable the features. When you reach the **Database** pane, enter the passwordless configuration as shown in the following steps:\n\n### [MySQL Flexible Server](#tab/mysql-flexible-server)\n\n1. For **Connect to database?**, select **Yes**.\n1. Under **Connection settings**, for **Choose database type**, from the dropdown menu select **MySQL (with support for passwordless connection)**.\n1. For **JNDI Name**, enter **testpasswordless** or your expected value.\n1. For **DataSource Connection String**, enter the connection string you obtained in the last section.\n1. For **Database username**, enter the database user name of your managed identity, which is the value of `${IDENTITY_LOGIN_NAME}`. In this example, the value is **identity-contoso**.\n1. Select **Use passwordless datasource connection**.\n1. For **User assigned managed identity**, select the managed identity you created previously. In this example, its name is **myManagedIdentity**.\n\nThe **Connection settings** section should look like the following screenshot, which uses [Oracle WebLogic Server Cluster on VMs](https://aka.ms/wls-vm-cluster) as an example.\n\n:::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-wls/screenshot-database-portal.png\" alt-text=\"Screenshot of the Azure portal showing the Configure database pane of the Create Oracle WebLogic Server on VMs page.\" lightbox=\"media/how-to-configure-passwordless-datasource-wls/screenshot-database-portal.png\":::\n\n### [PostgreSQL Flexible Server](#tab/postgresql-flexible-server)\n\n1. For **Connect to database?**, select **Yes**.\n1. Under **Connection settings**, for **Choose database type**, open the dropdown menu and then select **Azure Database for PostgreSQL (with support for passwordless connection)**.\n1. For **JNDI Name**, enter **testpasswordless** or your expected value.\n1. For **DataSource Connection String**, enter the connection string you obtained in last section.\n1. For **Database username**, enter your managed identity name. In this example, the value is **myManagedIdentity**.\n1. Select **Use passwordless datasource connection**.\n1. For **User assigned managed identity**, select the managed identity you created in previous step. In this example, its name is **myManagedIdentity**.\n1. Select **Add**.\n\nThe **Connection settings** section should look like the following screenshot, which uses [Oracle WebLogic Server Cluster on VMs](https://aka.ms/wls-vm-cluster) as an example:\n\n:::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-wls/azure-portal-postgresql-configuration.png\" alt-text=\"Screenshot of the Azure portal showing the Configure PostgreSQL database page.\" lightbox=\"media/how-to-configure-passwordless-datasource-wls/azure-portal-postgresql-configuration.png\":::\n\n### [Azure SQL Database](#tab/azure-sql-database)\n\n1. For **Connect to database?**, select **Yes**.\n1. Under **Connection settings**, for **Choose database type**, open the dropdown menu and then select **Azure SQL (with support for passwordless connection)**.\n1. For **JNDI Name**, enter **testpasswordless** or your expected value.\n1. For **DataSource Connection String**, input the connection string you obtained in last section.\n1. Select **Use passwordless datasource connection**.\n1. For **User assigned managed identity**, select the managed identity you created in previous step. In this example, its name is **myManagedIdentity**.\n1. Select **Add**.\n\nThe **Connection settings** section should look like the following screenshot, which uses [Oracle WebLogic Server Cluster on VMs](https://aka.ms/wls-vm-cluster) as an example.\n\n:::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-wls/azure-portal-azure-sql-configuration.png\" alt-text=\"Screenshot of the Azure portal showing the Configure Azure SQL database page.\" lightbox=\"media/how-to-configure-passwordless-datasource-wls/azure-portal-azure-sql-configuration.png\":::\n\n---\n\nYou finished configuring the passwordless connection. You can continue to fill in the following panes or select **Review + create**, then **Create** to deploy the offer.\n\n## Verify the database connection\n\nThe database connection is configured successfully if the offer deployment completes without error.\n\nContinuing to take [Oracle WebLogic Server Cluster on VMs](https://aka.ms/wls-vm-cluster) as an example, after the deployment completes, follow these steps in the Azure portal to find the Admin console URL.\n\n1. Find the resource group in which you deployed WLS.\n1. Under **Settings**, select **Deployments**.\n1. Select the deployment with the longest **Duration**. This deployment should be at the bottom of the list.\n1. Select **Outputs**.\n1. The URL of the WebLogic Administration Console is the value of the **adminConsoleUrl** output.\n1. Copy the value of the output variable **adminConsoleUrl**.\n1. Paste the value into your browser address bar and press <kbd>Enter</kbd> to open the sign-in page of the WebLogic Administration Console.\n\nUse the following steps to verify the database connection:\n\n1. Sign in to the WebLogic Administration Console with the username and password you provided on the **Basics** pane.\n1. Under the **Domain Structure**, select **Services**, **Data Sources**, then **testpasswordless**.\n1. Select the **Monitoring** tab, where the state of the data source is **Running**, as shown in the following screenshot:\n\n   ### [MySQL Flexible Server](#tab/mysql-flexible-server)\n\n   :::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-wls/screenshot-weblogic-console-datasource-state.png\" alt-text=\"Screenshot of the WebLogic Console portal showing the MySQL datasource state.\" lightbox=\"media/how-to-configure-passwordless-datasource-wls/screenshot-weblogic-console-datasource-state.png\":::\n\n   ### [PostgreSQL Flexible Server](#tab/postgresql-flexible-server)\n\n   :::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-wls/screenshot-weblogic-console-postgresql-state.png\" alt-text=\"Screenshot of the WebLogic Console portal showing the PostgreSQL datasource state.\" lightbox=\"media/how-to-configure-passwordless-datasource-wls/screenshot-weblogic-console-postgresql-state.png\":::\n\n   ### [Azure SQL Database](#tab/azure-sql-database)\n\n   :::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-wls/screenshot-weblogic-console-sql-server-state.png\" alt-text=\"Screenshot of the WebLogic Console portal showing the SQL Server datasource state.\" lightbox=\"media/how-to-configure-passwordless-datasource-wls/screenshot-weblogic-console-sql-server-state.png\":::\n\n1. Select the **Testing** tab, and then select the radio button next to the desired server.\n1. Select **Test Data Source**. You should see a message indicating a successful test, as shown in the following screenshot:\n\n   :::image type=\"content\" source=\"media/how-to-configure-passwordless-datasource-wls/screenshot-weblogic-console-successful-database.png\" alt-text=\"Screenshot of the WebLogic Console portal showing a successful test of the datasource.\" lightbox=\"media/how-to-configure-passwordless-datasource-wls/screenshot-weblogic-console-successful-database.png\":::\n\n## Clean up resources\n\nIf you don't need these resources, you can delete them by using the following commands:\n\n```azurecli-interactive\naz group delete --name ${RESOURCE_GROUP_NAME}\naz group delete --name <resource-group-name-that-deploys-the-offer>\n```\n\n## Next steps\n\nLearn more about running WLS on AKS or virtual machines by following these links:\n\n> [!div class=\"nextstepaction\"]\n> [Explore WebLogic Server on AKS](/azure/virtual-machines/workloads/oracle/weblogic-aks?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n\n> [!div class=\"nextstepaction\"]\n> [Explore WebLogic Server on Azure Virtual Machines](/azure/virtual-machines/workloads/oracle/oracle-weblogic?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n\n> [!div class=\"nextstepaction\"]\n> [Passwordless Connections Samples for Java Apps](https://github.com/Azure-Samples/Passwordless-Connections-for-Java-Apps)\n"
  },
  {
    "path": "articles/java/ee/how-to-deploy-java-liberty-jcache.md",
    "content": "---\ntitle: Using Azure Redis as session cache for WebSphere Liberty or Open Liberty\ndescription: Using Azure Redis as session cache for WebSphere Liberty or Open Liberty.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.topic: how-to\nms.date: 03/26/2026\nms.custom: template-how-to, devx-track-java, devx-track-javaee, devx-track-javaee-liberty, devx-track-javaee-liberty-aks, devx-track-javaee-websphere, devx-track-azurecli, devx-track-extended-java\n#Customer intent: As a Java developer, I want to build an application that uses Azure Redis as the HTTP session cache for WebSphere Liberty or Open Liberty.\n---\n\n# Using Azure Redis as session cache for WebSphere Liberty or Open Liberty\n\nThis article describes how to use Azure Redis as the HTTP session cache for WebSphere Liberty or Open Liberty.\n\nIn this guide, you'll:\n\n* Create an Azure Managed Redis instance as session cache.\n* Prepare a sample application that enables persistence of HTTP sessions.\n* Run the sample application locally.\n\nThis article is intended to help you quickly get to deployment. Before going to production, you should explore [Tuning Liberty](https://www.ibm.com/docs/was-liberty/base?topic=tuning-liberty).\n\nIf you're interested in providing feedback or working closely on your migration scenarios with the engineering team developing WebSphere on Azure solutions, fill out this short [survey on WebSphere migration](https://aka.ms/websphere-on-azure-survey) and include your contact information. The team of program managers, architects, and engineers will promptly get in touch with you to initiate close collaboration.\n\n## Prerequisites\n\n* An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n* Prepare a local machine with Unix-like operating system installed - for example, Ubuntu, macOS, or Windows Subsystem for Linux.\n* Install a Java Standard Edition (SE) implementation version 17 or later - for example, [Microsoft build of OpenJDK](/java/openjdk).\n* Install [Maven](https://maven.apache.org/download.cgi) 3.9.8 or higher.\n* Ensure that [Git](https://git-scm.com) is installed.\n\n## Create an Azure Managed Redis instance\n\n[Azure Managed Redis](/azure/azure-cache-for-redis/managed-redis/managed-redis-overview) provides an in-memory data store based on the [Redis Enterprise](https://redis.io/about/redis-enterprise/) software. Use the following steps to create an Azure Managed Redis instance, and then note down its connection information. You use this information later to configure the sample application.\n\n1. Create an Azure Managed Redis instance by following the steps in [Quickstart: Create an Azure Managed Redis Instance](/azure/azure-cache-for-redis/quickstart-create-managed-redis). Carefully note the following differences:\n\n   1. At step 3 of the section [Create a Redis instance](/azure/azure-cache-for-redis/quickstart-create-managed-redis#create-a-redis-instance), where you're on the **Basics** tab, select a **Cache SKU** that supports Azure Managed Redis. For this guide, select **Balanced (For general purpose workloads with typical performance requirements)**. For more information, see [Choosing the right tier](/azure/azure-cache-for-redis/managed-redis/managed-redis-overview#choosing-the-right-tier).\n\n   1. At step 4 of the section [Create a Redis instance](/azure/azure-cache-for-redis/quickstart-create-managed-redis#create-a-redis-instance), where you're on the **Networking** tab, for the **Connectivity** option, select **Public Endpoint**. This option is the best choice for simplicity when using this guide. For production, you should consider using **Private Endpoint** for better security.\n\n   1. At step 5 of the section [Create a Redis instance](/azure/azure-cache-for-redis/quickstart-create-managed-redis#create-a-redis-instance), where you're on the **Advanced** tab, configure the following settings:\n\n      * For **Authentication**, enable **Access Keys Authentication**. This option is the best choice for simplicity when using this guide. For optimal security, we recommend using Microsoft Entra ID with managed identities to authorize requests against your cache, if possible. Authorization by using Microsoft Entra ID and managed identities provides superior security and ease of use over shared access key authorization. For more information about using managed identities with your cache, see [Use Microsoft Entra ID for cache authentication](/azure/azure-cache-for-redis/cache-azure-active-directory-for-authentication).\n\n      * Set **Clustering policy** to **Enterprise** for a nonclustered cache, which works for this guide where single node configuration is used. For more information, see [Clustering on Enterprise](/azure/azure-cache-for-redis/cache-best-practices-enterprise-tiers#clustering-on-enterprise).\n\n1. After the deployment completes, select **Go to resource** if you're on the **Deployment** page. Otherwise, navigate to the Azure portal, find, and select your Azure Managed Redis instance.\n\n1. On the **Overview** page, note down the **Endpoint** value. You use this value in the `REDIS_CACHE_ADDRESS` environment variable later.\n\n1. Select **Settings** > **Authentication**. Select **Access keys** and note down the **Primary** value. You use this value as the `REDIS_CACHE_KEY` environment variable later.\n\n1. Use the following command to export the environment variables `REDIS_CACHE_ADDRESS` and `REDIS_CACHE_KEY`:\n\n   ```bash\n   export REDIS_CACHE_ADDRESS=rediss://<your-redis-cache-endpoint>\n   export REDIS_CACHE_KEY=<your-primary-access-key>\n   ```\n\n## Prepare the sample application\n\nWebSphere Liberty and Open Liberty provide a session cache feature that enables you to store HTTP session data in an external cache. In this guide, you use the [JCache Session Persistence](https://openliberty.io/docs/latest/reference/feature/sessionCache-1.0.html) feature to store the session data in the Azure Managed Redis instance.\n\nUse the following commands to clone the sample code for this guide. The sample is in the [open-liberty-on-aks](https://github.com/Azure-Samples/open-liberty-on-aks) repository on GitHub. There are a few samples in the repository. This article uses *java-app-jcache*.\n\n```bash\ngit clone https://github.com/Azure-Samples/open-liberty-on-aks.git\ncd open-liberty-on-aks\ngit checkout 20250228\ncd java-app-jcache\n```\n\nIf you see a message about being in `detached HEAD` state, this message is safe to ignore. It just means you checked out a tag.\n\nThe application has the following file structure:\n\n```text\njava-app-jcache/\n├── pom.xml\n├── pom-redisson.xml\n└── src\n    └── main\n        ├── docker\n        │   ├── Dockerfile\n        │   └── Dockerfile-wlp\n        ├── java\n        ├── liberty\n        │   └── config\n        │       └── server.xml\n        ├── redisson\n        │   └── redisson-config.yaml\n        ├── resources\n        └── webapp\n```\n\nThe **pom.xml** file is the Maven project file that contains the dependencies and plugins for the sample application.\n\nThe **pom-redisson.xml** file is used to copy dependencies for the Redisson client library to the shared resources directory of the Liberty server later.\n\nThe **java**, **resources**, and **webapp** directories contain the source code of the sample application.\n\nIn the **liberty/config** directory, the **server.xml** file is used to configure the HTTP session cache for Open Liberty and WebSphere Liberty.\n\nIn the **redisson** directory, the **redisson-config.yaml** file is used to configure the connection to the Azure Managed Redis instance.\n\nThe **docker** directory contains two Dockerfiles. **Dockerfile** is used to build an image with Open Liberty and **Dockerfile-wlp** is used to build an image with WebSphere Liberty.\n\n## Run the sample application locally\n\nUse the following steps to build and run your sample application locally. These steps use Maven and the `liberty-maven-plugin`. For more information about the `liberty-maven-plugin`, see [Building a web application with Maven](https://openliberty.io/guides/maven-intro.html).\n\n1. Verify the current working directory is **java-app-jcache** in your local clone.\n1. Run the Maven command `mvn clean package` and package the application.\n1. Run `mvn -Predisson validate` to copy the Redisson configuration file to the correct target location. This step also inserts the values of the environment variables `REDIS_CACHE_ADDRESS` and `REDIS_CACHE_KEY` into the **redisson-config.yaml** file, which is referenced by the **server.xml** file.\n1. Run `mvn dependency:copy-dependencies -f pom-redisson.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources` to copy the Redisson client library and its dependencies to the shared resources directory of the Liberty server.\n1. Run the Maven command `mvn liberty:dev` and start the application. If the application is successfully started, you should see `The defaultServer server is ready to run a smarter planet.` in the command output.\n\n   You should see output similar to the following if the Redis connection is successful.\n\n   ```output\n   [INFO] [err] [Default Executor-thread-3] INFO org.redisson.Version - Redisson 3.23.4\n   [INFO] [err] [redisson-netty-2-7] INFO org.redisson.connection.pool.MasterPubSubConnectionPool - 1 connections initialized for redacted.<region>.redis.azure.net/<ip_address>:10000\n   [INFO] [err] [redisson-netty-2-20] INFO org.redisson.connection.pool.MasterConnectionPool - 24 connections initialized for redacted.<region>.redis.azure.net/<ip_address>:10000\n   ```\n\n### Test the application\n\nOpen a web browser to [http://localhost:9080](http://localhost:9080) and you should see the application home page.\n\n:::image type=\"content\" source=\"media/how-to-deploy-java-liberty-jcache/run-succeeded-locally.png\" alt-text=\"Screenshot of Java liberty application running successfully.\":::\n\nIn the **New coffee** form, set values for the fields **Name** and **Price**, and then select **Submit**. The application creates a new coffee, persists it, and also stores the HTTP session in the Azure Managed Redis instance.\n\nAfter a few seconds, you see the new coffee displayed in the table **Our coffees**.\n\n:::image type=\"content\" source=\"media/how-to-deploy-java-liberty-jcache/new-coffee-in-cache.png\" alt-text=\"Screenshot of sample application showing new coffee created and persisted in the session of the application.\":::\n\nTo demonstrate that the session data can be retrieved from Redis, use <kbd>Ctrl</kbd>+<kbd>C</kbd> to stop the application and restart it with the `mvn liberty:dev` command.\n\nThen, refresh the application home page. You should see the same session data displayed in the section **New coffee**. Stop the application when you're done testing.\n\n### Containerize the application\n\nOptionally, you can package and run the application in a container by using the following steps. The sample application provides two Dockerfiles for Open Liberty and WebSphere Liberty. This guide uses the Dockerfile for Open Liberty, but you can use the Dockerfile for WebSphere Liberty by following similar steps.\n\n1. Install Docker for your OS. For more information, see [Get Docker](https://docs.docker.com/get-docker/).\n\n1. Use the following command to build the Docker image:\n\n   ```bash\n   docker build -t javaee-cafe-jcache:v1 -f src/main/docker/Dockerfile .\n   ```\n\n1. Use the following command to start the Docker container:\n\n   ```bash\n   docker run -it --rm \\\n      -p 9080:9080 \\\n      -e REDIS_CACHE_ADDRESS=${REDIS_CACHE_ADDRESS} \\\n      -e REDIS_CACHE_KEY=${REDIS_CACHE_KEY} \\\n      --mount type=bind,source=$(pwd)/target/liberty/wlp/usr/servers/defaultServer/redisson-config.yaml,target=/config/redisson-config.yaml \\\n      javaee-cafe-jcache:v1\n   ```\n\n   After the container starts, you can test it by using steps similar to the ones you use to run the application locally without Docker.\n\n## Clean up resources\n\nTo avoid Azure charges, you should clean up unnecessary resources. When the Azure Managed Redis instance is no longer needed, find its resource group name and delete it from the Azure portal.\n\nFor more information, see [Delete resource groups](/azure/azure-resource-manager/management/manage-resource-groups-portal#delete-resource-groups).\n\n## Next steps\n\nYou can learn more from references used in this guide:\n\n* [Configuring Liberty session persistence with JCache](https://www.ibm.com/docs/en/was-liberty/base?topic=manually-configuring-liberty-session-persistence-jcache)\n* [JCache support of Redisson](https://redisson.org/glossary/jcache.html)\n* [Open Liberty Server Configuration](https://openliberty.io/docs/ref/config/)\n\nIf you want to deploy the sample application to Azure, reference the following articles:\n\n* [Deploy a Java application with Open Liberty or WebSphere Liberty on an Azure Kubernetes Service (AKS) cluster](/azure/aks/howto-deploy-java-liberty-app)\n* [Deploy WebSphere Liberty and Open Liberty on Azure Red Hat OpenShift](/azure/openshift/howto-deploy-java-liberty-app)\n* [Deploy a Java application with Open Liberty on Azure Container Apps](deploy-java-liberty-app-aca.md)\n\nTo explore options to run WebSphere products on Azure, see [What are solutions to run the WebSphere family of products on Azure?](websphere-family.md)\n"
  },
  {
    "path": "articles/java/ee/howto-deploy-java-liberty-app-manual.md",
    "content": "---\ntitle: Manually Deploy a Java Application with Open Liberty or WebSphere Liberty on an Azure Kubernetes Service (AKS) Cluster\ndescription: Shows you how to manually deploy a Java application with Open Liberty or WebSphere Liberty on an Azure Kubernetes Service (AKS) cluster.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.topic: install-set-up-deploy\nms.date: 03/26/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-liberty\n  - devx-track-javaee-liberty-aks\n  - devx-track-javaee-websphere\n  - devx-track-azurecli\n  - sfi-image-nochange\n---\n\n# Manually deploy a Java application with Open Liberty or WebSphere Liberty on an Azure Kubernetes Service (AKS) cluster\n\nThis article provides step-by-step guidance for manually deploying Open/WebSphere Liberty on Azure.\n\nSpecifically, this article explains how to accomplish the following tasks:\n\n* Run your Java, Java Enterprise Edition (EE), Jakarta EE, or MicroProfile application on the Open Liberty or WebSphere Liberty runtime.\n* Build the application Docker image with `az acr build` using Liberty container images.\n* Deploy the containerized application to an Azure Kubernetes Service (AKS) cluster using a Liberty Operator.\n\nA Liberty Operator simplifies the deployment and management of applications running on Kubernetes clusters. With the Open Liberty Operator or WebSphere Liberty Operator, you can also perform more advanced operations, such as gathering traces and dumps.\n\nFor a more automated solution that accelerates your journey to AKS using a Marketplace solution available on the Azure portal, see [Deploy a Java application with Open Liberty/WebSphere Liberty on an Azure Kubernetes Service (AKS) cluster](/azure/aks/howto-deploy-java-liberty-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json).\n\nFor more information on Open Liberty, see [the Open Liberty project page](https://openliberty.io/). For more information on IBM WebSphere Liberty, see [the WebSphere Liberty product page](https://www.ibm.com/cloud/websphere-liberty).\n\nThis article is intended to help you quickly get to deployment. Before going to production, you should explore [Tuning Liberty](https://www.ibm.com/docs/was-liberty/base?topic=tuning-liberty).\n\nIf you're interested in providing feedback or working closely on your migration scenarios with the engineering team developing WebSphere on Azure solutions, fill out this short [survey on WebSphere migration](https://aka.ms/websphere-on-azure-survey) and include your contact information. The team of program managers, architects, and engineers will promptly get in touch with you to initiate close collaboration.\n\n## Prerequisites\n\n* An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n* [Azure CLI](/cli/azure/install-azure-cli) version 2.71.0+\n* Java Standard Edition (SE), version 17 - for example, [Eclipse Open J9](https://www.eclipse.org/openj9/).\n* [Maven](https://maven.apache.org/download.cgi) version 3.5.0+\n* [Git](https://git-scm.com)\n* The `Owner` role or the `Contributor` and `User Access Administrator` roles in the Azure subscription. You can verify the assignment by following the steps in [List Azure role assignments using the Azure portal](/azure/role-based-access-control/role-assignments-list-portal).\n\n## Sign in to Azure\n\nIf you didn't do so already, use the following steps to sign in to your Azure subscription:\n\n1. Open the Azure CLI or PowerShell and then sign in by using [`az login`](/cli/azure/reference-index#az-login). To finish the authentication process, follow the steps displayed in your terminal. For other sign-in options, see [Sign into Azure with Azure CLI](/cli/azure/authenticate-azure-cli#sign-into-azure-with-azure-cli).\n\n    > [!NOTE]\n    > If you have multiple Azure tenants associated with your Azure credentials, you must specify which tenant you want to sign in to. You can specify a tenant with the `--tenant` option - for example, `az login --tenant contoso.onmicrosoft.com`.\n\n1. Find the version and dependent libraries that are installed by using [`az version`](/cli/azure/reference-index?#az-version).\n\n1. Upgrade to the latest version by using [`az upgrade`](/cli/azure/reference-index?#az-upgrade).\n\n> [!NOTE]\n> When using the Azure CLI, if you're prompted to install an Azure CLI extension, do so. For more information about extensions, see [Use and manage extensions with the Azure CLI](/cli/azure/azure-cli-extensions-overview).\n>\n> You can run most Azure CLI commands in PowerShell the same as in Bash. The difference exists only when using variables. In the following sections, the difference is addressed in different tabs when needed.\n\n## Create a resource group\n\nAn Azure resource group is a logical group in which Azure resources are deployed and managed.\n\nCreate a resource group called `java-liberty-project` by using [`az group create`](/cli/azure/group#az-group-create) in the `eastus2` location. This resource group is used later for creating the Azure Container Registry instance and the AKS cluster.\n\n### [Bash](#tab/in-bash)\n\n```azurecli\nexport RESOURCE_GROUP_NAME=java-liberty-project\naz group create --name $RESOURCE_GROUP_NAME --location eastus2\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\n$Env:RESOURCE_GROUP_NAME = \"java-liberty-project\"\naz group create --name $Env:RESOURCE_GROUP_NAME --location eastus2\n```\n\n---\n\n## Create a container registry instance\n\nUse [`az acr create`](/cli/azure/acr#az-acr-create) to create the container registry instance. The following example creates a container registry instance named `<your-unique-ACR-name>`. Replace this placeholder with a value that is unique across Azure.\n\n> [!NOTE]\n> This article uses the recommended passwordless authentication mechanism for Azure Container Registry. It's still possible to use a username and password with `docker login` after using `az acr credential show` to obtain the username and password. Using a username and password is less secure than passwordless authentication, however.\n\n### [Bash](#tab/in-bash)\n\n```azurecli\nexport REGISTRY_NAME=<your-unique-ACR-name>\naz acr create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $REGISTRY_NAME \\\n    --sku Basic\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\n$Env:REGISTRY_NAME = \"<your-unique-ACR-name>\"\naz acr create `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name $Env:REGISTRY_NAME `\n    --sku Basic\n```\n\n---\n\nAfter a short time, you should see JSON output that contains the following lines:\n\n```output\n\"provisioningState\": \"Succeeded\",\n\"publicNetworkAccess\": \"Enabled\",\n\"resourceGroup\": \"java-liberty-project\",\n```\n\nRetrieve the sign-in server name for the container registry instance. You need this value when you deploy the application image to the AKS cluster later.\n\n### [Bash](#tab/in-bash)\n\n```azurecli\nexport LOGIN_SERVER=$(az acr show \\\n    --name $REGISTRY_NAME \\\n    --query 'loginServer' \\\n    --output tsv)\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\n$Env:LOGIN_SERVER = $(az acr show `\n    --name $Env:REGISTRY_NAME `\n    --query 'loginServer' `\n    --output tsv)\n```\n\n---\n\n## Create an AKS cluster\n\nUse [`az aks create`](/cli/azure/aks#az-aks-create) to create an AKS cluster, as shown in the following example. This example creates an AKS cluster named `myAKSCluster` with one node and attaches the container registry instance to it. The command takes several minutes to complete.\n\n### [Bash](#tab/in-bash)\n\n```azurecli\nexport CLUSTER_NAME=myAKSCluster\naz aks create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $CLUSTER_NAME \\\n    --node-count 1 \\\n    --node-vm-size Standard_DS2_V2 \\\n    --generate-ssh-keys \\\n    --enable-managed-identity \\\n    --attach-acr $REGISTRY_NAME\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\n$Env:CLUSTER_NAME = \"myAKSCluster\"\naz aks create `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name $Env:CLUSTER_NAME `\n    --node-count 1 `\n    --node-vm-size Standard_DS2_V2 `\n    --generate-ssh-keys `\n    --enable-managed-identity `\n    --attach-acr $Env:REGISTRY_NAME\n```\n\n---\n\nAfter the command completes, it returns JSON-formatted information about the cluster, including the following output:\n\n```output\n\"nodeResourceGroup\": \"MC_java-liberty-project_myAKSCluster_eastus2\",\n\"privateFqdn\": null,\n\"provisioningState\": \"Succeeded\",\n\"resourceGroup\": \"java-liberty-project\",\n```\n\n## Connect to the AKS cluster\n\nUse the following steps to manage your Kubernetes cluster:\n\n1. Install [`kubectl`](https://kubernetes.io/docs/reference/kubectl/overview/), the Kubernetes command-line client, by using [`az aks install-cli`](/cli/azure/aks#az-aks-install-cli), as shown in the following example:\n\n    ### [Bash](#tab/in-bash)\n\n    ```azurecli\n    az aks install-cli\n    ```\n\n    ### [PowerShell](#tab/in-powershell)\n\n    ```azurepowershell\n    az aks install-cli\n    ```\n\n    ---\n\n1. Use [`az aks get-credentials`](/cli/azure/aks#az-aks-get-credentials) to configure `kubectl` to connect to your Kubernetes cluster. This command downloads credentials and configures the Kubernetes CLI to use them, as shown in the following example:\n\n    > [!NOTE]\n    > The command uses the default location for the [Kubernetes configuration file](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/), which is **~/.kube/config**. You can specify a different location for your Kubernetes configuration file by using `--file`.\n\n    ### [Bash](#tab/in-bash)\n\n    ```azurecli\n    az aks get-credentials \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --name $CLUSTER_NAME \\\n        --overwrite-existing \\\n        --admin\n    ```\n\n    ### [PowerShell](#tab/in-powershell)\n\n    ```azurepowershell\n    az aks get-credentials `\n        --resource-group $Env:RESOURCE_GROUP_NAME `\n        --name $Env:CLUSTER_NAME `\n        --overwrite-existing `\n        --admin\n    ```\n\n    ---\n\n1. Verify the connection to your cluster by using [`kubectl get`]( https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#get) to return a list of the cluster nodes, as shown in the following example:\n\n    ### [Bash](#tab/in-bash)\n\n    ```bash\n    kubectl get nodes\n    ```\n\n    ### [PowerShell](#tab/in-powershell)\n\n    ```powershell\n    kubectl get nodes\n    ```\n\n    ---\n\n    The following example output shows the single node created in the previous steps. Make sure that the status of the node is `Ready`:\n\n    ```output\n    NAME                                STATUS   ROLES   AGE     VERSION\n    aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    <none>  76s     v1.29.9\n    ```\n\n## Create an Azure SQL Database\n\nCreate an Azure SQL Database single database for your app by using the following steps:\n\n### [Bash](#tab/in-bash)\n\n1. Use the following commands to set database-related environment variables. Replace `<your-unique-sql-server-name>` with a unique name for your Azure SQL Database server.\n\n    ```bash\n    export SQL_SERVER_NAME=<your-unique-sql-server-name>\n    export DB_NAME=demodb\n    ```\n\n1. Use the following commands to create a single database and set the current signed-in user as a Microsoft Entra admin. For more information, see [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-cli).\n\n    ```azurecli\n    export ENTRA_ADMIN_NAME=$(az account show \\\n        --query user.name \\\n        --output tsv)\n\n    az sql server create \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --name $SQL_SERVER_NAME \\\n        --enable-ad-only-auth \\\n        --external-admin-principal-type User \\\n        --external-admin-name $ENTRA_ADMIN_NAME \\\n        --external-admin-sid $(az ad signed-in-user show --query id --output tsv)\n\n    az sql db create \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --name $DB_NAME \\\n        --server $SQL_SERVER_NAME \\\n        --edition GeneralPurpose \\\n        --compute-model Serverless \\\n        --family Gen5 \\\n        --capacity 2\n    ```\n\n### [PowerShell](#tab/in-powershell)\n\n1. Use the following commands to set database-related environment variables. Replace `<your-unique-sql-server-name>` with a unique name for your Azure SQL Database server.\n\n    ```powershell\n    $Env:SQL_SERVER_NAME = \"<your-unique-sql-server-name>\"\n    $Env:DB_NAME = \"demodb\"\n    ```\n\n1. Use the following commands to create a single database and set the current signed-in user as a Microsoft Entra admin. For more information, see [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-cli).\n\n    ```azurepowershell\n    $Env:ENTRA_ADMIN_NAME = $(az account show `\n        --query user.name `\n        --output tsv)\n    \n    az sql server create `\n        --resource-group $Env:RESOURCE_GROUP_NAME `\n        --name $Env:SQL_SERVER_NAME `\n        --enable-ad-only-auth `\n        --external-admin-principal-type User `\n        --external-admin-name $Env:ENTRA_ADMIN_NAME `\n        --external-admin-sid $(az ad signed-in-user show --query id --output tsv)\n\n    az sql db create `\n        --resource-group $Env:RESOURCE_GROUP_NAME `\n        --name $Env:DB_NAME `\n        --server $Env:SQL_SERVER_NAME `\n        --edition GeneralPurpose `\n        --compute-model Serverless `\n        --family Gen5 `\n        --capacity 2\n    ```\n\n---\n\n> [!NOTE]\n> You create an Azure SQL server with SQL authentication disabled for security considerations. Only Microsoft Entra ID is used to authenticate to the server. For more information on enabling SQL authentication, see [`az sql server create`](/cli/azure/sql/server#az-sql-server-create).\n\n## Create a service connection in AKS with Service Connector\n\nUse the following commands to create a connection between the AKS cluster and the SQL database using Microsoft Entra Workload ID with Service Connector. For more information, see [Create a service connection in AKS with Service Connector](/azure/service-connector/tutorial-python-aks-sql-database-connection-string?tabs=azure-cli&pivots=workload-id#create-a-service-connection-in-aks-with-service-connector).\n\n### [Bash](#tab/in-bash)\n\n```azurecli\n# Register the Service Connector and Kubernetes Configuration resource providers\naz provider register --namespace Microsoft.ServiceLinker --wait\naz provider register --namespace Microsoft.KubernetesConfiguration --wait\n\n# Install the Service Connector passwordless extension\naz extension add \\\n    --name serviceconnector-passwordless \\\n    --upgrade \\\n    --allow-preview true\n\n# Retrieve the AKS cluster and Azure SQL Server resource IDs\nexport AKS_CLUSTER_RESOURCE_ID=$(az aks show \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $CLUSTER_NAME \\\n    --query id \\\n    --output tsv)\n\nexport AZURE_SQL_SERVER_RESOURCE_ID=$(az sql server show \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $SQL_SERVER_NAME \\\n    --query id \\\n    --output tsv)\n\n# Create a user-assigned managed identity used for workload identity\nexport USER_ASSIGNED_IDENTITY_NAME=workload-identity-uami\naz identity create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name ${USER_ASSIGNED_IDENTITY_NAME}\n\n# Retrieve the user-assigned managed identity resource ID\nexport UAMI_RESOURCE_ID=$(az identity show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name ${USER_ASSIGNED_IDENTITY_NAME} \\\n    --query id \\\n    --output tsv)\n\n# Create a service connection between your AKS cluster and your SQL database using Microsoft Entra Workload ID\naz aks connection create sql \\\n    --connection akssqlconn \\\n    --client-type java \\\n    --source-id $AKS_CLUSTER_RESOURCE_ID \\\n    --target-id $AZURE_SQL_SERVER_RESOURCE_ID/databases/$DB_NAME \\\n    --workload-identity $UAMI_RESOURCE_ID\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\n# Register the Service Connector and Kubernetes Configuration resource providers\naz provider register --namespace Microsoft.ServiceLinker --wait\naz provider register --namespace Microsoft.KubernetesConfiguration --wait\n\n# Install the Service Connector passwordless extension\naz extension add --name serviceconnector-passwordless --upgrade --allow-preview true\n\n# Retrieve the AKS cluster and Azure SQL Server resource IDs\n$Env:AKS_CLUSTER_RESOURCE_ID = $(az aks show `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name $Env:CLUSTER_NAME `\n    --query id --output tsv)\n\n$Env:AZURE_SQL_SERVER_RESOURCE_ID = $(az sql server show `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name $Env:SQL_SERVER_NAME `\n    --query id `\n    --output tsv)\n\n# Create a user-assigned managed identity used for workload identity\n$Env:USER_ASSIGNED_IDENTITY_NAME = \"workload-identity-uami\"\naz identity create `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name $Env:USER_ASSIGNED_IDENTITY_NAME\n\n# Retrieve the user-assigned managed identity resource ID\n$Env:UAMI_RESOURCE_ID = $(az identity show `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name $Env:USER_ASSIGNED_IDENTITY_NAME `\n    --query id `\n    --output tsv)\n\n# Create a service connection between your AKS cluster and your SQL database using Microsoft Entra Workload ID\naz aks connection create sql `\n    --connection akssqlconn `\n    --client-type java `\n    --source-id $Env:AKS_CLUSTER_RESOURCE_ID `\n    --target-id $Env:AZURE_SQL_SERVER_RESOURCE_ID/databases/$Env:DB_NAME `\n    --workload-identity $Env:UAMI_RESOURCE_ID\n```\n\n---\n\n### Troubleshoot error messages\n\nIf the `az aks connection create sql` command produces an error message, find the error message in the following list and then use the instructions to troubleshoot the issue:\n\n* `Dependency pyodbc can't be installed, please install it manually`\n\n    This error message indicates that the `pyodbc` package can't be installed, most likely because of permissions issues. Fix the problem by using the following steps:\n\n    #### [Bash](#tab/in-bash)\n\n    1. Find the location of Python that works with the Azure CLI by running the following command:\n\n        ```azurecli\n        az --version\n        ```\n\n        The output should contain `Python location` - for example, `Python location '/opt/az/bin/python3'`.\n\n    1. Copy the `Python location` value.\n\n    1. Use the following command to install the `pyodbc` package in `sudo` mode. Replace `<python-location>` with the Python location you copied in the previous step.\n\n        ```azurecli\n        sudo <python-location> -m pip install pyodbc\n        ```\n\n    #### [PowerShell](#tab/in-powershell)\n\n    1. Find the location of Python that works with the Azure CLI by using the following command:\n\n        ```powershell\n        az --version\n        ```\n\n       The output should contain `Python location` - for example, `Python location 'C:\\Program Files\\Microsoft SDKs\\Azure\\CLI2\\python.exe'`.\n\n    1. Copy the `Python location` value.\n\n    1. Open Windows PowerShell with administrator privileges. For more information, see the [Run with administrative privileges](/powershell/scripting/windows-powershell/starting-windows-powershell#run-with-administrative-privileges) section of [Starting Windows PowerShell](/powershell/scripting/windows-powershell/starting-windows-powershell).\n\n    1. Use the following command to install the `pyodbc` package. Replace `<python-location>` with the Python location you copied in the previous step.\n\n        ```powershell\n        & '<python-location>' -m pip install pyodbc\n        ```\n\n    ---\n\n* libodbc.so: cannot open shared object file: No such file or directory\n* Please manually install odbc 17/18 for SQL server\n\n    These errors indicate that the `odbc` driver isn't installed. Fix the problem by using the following steps:\n\n    > [!NOTE]\n    > You should use Microsoft Entra Workload ID for secure access to your Azure SQL Database without using SQL authentication. If you need to use SQL authentication, ignore the steps in this section and use the username and password to connect to the Azure SQL Database.\n\n    #### [Bash](#tab/in-bash)\n\n    1. If you're using Linux, open [Install the Microsoft ODBC driver for SQL Server (Linux)](/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=azuresqldb-current&preserve-view=true). If you're using MacOS, open [Install the Microsoft ODBC driver for SQL Server (macOS)](/sql/connect/odbc/linux-mac/install-microsoft-odbc-driver-sql-server-macos?view=azuresqldb-current&preserve-view=true).\n\n    1. Follow the instructions to install the Microsoft ODBC Driver (18 or 17) for SQL Server.\n\n    1. Use `az aks connection create sql` again to create the service connection, as shown in the following example:\n\n        ```azurecli\n        az aks connection create sql \\\n            --connection akssqlconn \\\n            --client-type java \\\n            --source-id $AKS_CLUSTER_RESOURCE_ID \\\n            --target-id $AZURE_SQL_SERVER_RESOURCE_ID/databases/$DB_NAME \\\n            --workload-identity $UAMI_RESOURCE_ID\n        ```\n\n    #### [PowerShell](#tab/in-powershell)\n\n    1. Open [Download ODBC Driver for SQL Server](/sql/connect/odbc/download-odbc-driver-for-sql-server?view=azuresqldb-current&preserve-view=true) in your browser.\n\n    1. From the [Download for Windows](/sql/connect/odbc/download-odbc-driver-for-sql-server?view=azuresqldb-current&preserve-view=true#download-for-windows) section, find and download the appropriate installer for Microsoft ODBC Driver for SQL Server.\n\n    1. Follow the instructions, run the installer, and install the driver.\n\n    1. Use `az aks connection create sql` again to create the service connection, as shown in the following example:\n\n        ```powershell\n        az aks connection create sql `\n            --connection akssqlconn `\n            --client-type java `\n            --source-id $Env:AKS_CLUSTER_RESOURCE_ID `\n            --target-id $Env:AZURE_SQL_SERVER_RESOURCE_ID/databases/$Env:DB_NAME `\n            --workload-identity $Env:UAMI_RESOURCE_ID\n        ```\n\n    ---\n\n## Get the service account and secret created by Service Connector\n\nTo authenticate with Azure SQL Database, use the following steps:\n\n1. Get the service account and secret created by Service Connector by following the instructions in the [Update your container](/azure/service-connector/tutorial-python-aks-sql-database-connection-string?tabs=azure-cli#update-your-container) section of [Tutorial: Connect an AKS app to Azure SQL Database](/azure/service-connector/tutorial-python-aks-sql-database-connection-string?tabs=azure-cli). Use the option to directly create a deployment using the YAML sample code snippet provided.\n\n    > [!NOTE]\n    > The secret created by Service Connector contains an `AZURE_SQL_CONNECTIONSTRING` value, which is a password-free connection string to the Azure SQL Database. For more information, see the sample value from the [User-assigned managed identity](/azure/service-connector/how-to-integrate-sql-database?tabs=sql-me-id-java#user-assigned-managed-identity) section of [Integrate Azure SQL Database with Service Connector](/azure/service-connector/how-to-integrate-sql-database?tabs=sql-me-id-java).\n\n1. From the highlighted sections in the sample Kubernetes deployment YAML, copy the `serviceAccountName` and `secretRef.name` values, as shown in the following example:\n\n    ```yaml\n    serviceAccountName: <service-account-name>\n    containers:\n    - name: raw-linux\n       envFrom:\n          - secretRef:\n             name: <secret-name>\n    ```\n\n1. Define environment variables by using the following commands. Be sure to replace `<service-account-name>` and `<secret-name>` with the values you copied in the previous step:\n\n    ### [Bash](#tab/in-bash)\n\n    ```bash\n    export SERVICE_ACCOUNT_NAME=<service-account-name>\n    export SECRET_NAME=<secret-name>\n    ```\n\n    ### [PowerShell](#tab/in-powershell)\n\n    ```powershell\n    $Env:SERVICE_ACCOUNT_NAME = \"<service-account-name>\"\n    $Env:SECRET_NAME = \"<secret-name>\"\n    ```\n\n    ---\n\n    These values are used in the next section to deploy the Liberty application to the AKS cluster.\n\n## Install the Open Liberty Operator\n\nIn this section, you install the Open Liberty Operator on the AKS cluster to host the Liberty application.\n\nInstall the [Open Liberty Operator](https://github.com/OpenLiberty/open-liberty-operator/tree/main/deploy/releases/1.2.2) by using the following commands:\n\n> [!NOTE]\n> This guide directs you to install the Open Liberty Operator. To use the WebSphere Liberty Operator, see [Installing WebSphere Liberty operator with the Kubernetes CLI](https://www.ibm.com/docs/en/was-liberty/nd?topic=operator-installing-kubernetes-cli).\n\n### [Bash](#tab/in-bash)\n\n```bash\n# Install cert-manager Operator\nexport CERT_MANAGER_VERSION=v1.11.2\nkubectl apply -f https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml\n\n# Install the Open Liberty Operator\nexport OPERATOR_VERSION=1.4.2\nmkdir -p overlays/watch-all-namespaces\nwget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/olo-all-namespaces.yaml -q -P ./overlays/watch-all-namespaces\nwget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/cluster-roles.yaml -q -P ./overlays/watch-all-namespaces\nwget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/kustomization.yaml -q -P ./overlays/watch-all-namespaces\nmkdir base\nwget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/kustomization.yaml -q -P ./base\nwget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-crd.yaml -q -P ./base\nwget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-operator.yaml -q -P ./base\nwget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-roles.yaml -q -P ./base\nkubectl create namespace open-liberty\nkubectl apply --server-side -k overlays/watch-all-namespaces\n\n# Remove the downloaded files\nrm -rf overlays base\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```powershell\n# Install cert-manager Operator\n$Env:CERT_MANAGER_VERSION = \"v1.11.2\"\nkubectl apply -f https://github.com/jetstack/cert-manager/releases/download/$Env:CERT_MANAGER_VERSION/cert-manager.yaml\n\n# Install the Open Liberty Operator\n$Env:OPERATOR_VERSION = \"1.4.2\"\nmkdir -p overlays/watch-all-namespaces\nInvoke-WebRequest https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/$Env:OPERATOR_VERSION/kustomize/overlays/watch-all-namespaces/olo-all-namespaces.yaml -OutFile ./overlays/watch-all-namespaces/olo-all-namespaces.yaml\nInvoke-WebRequest https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/$Env:OPERATOR_VERSION/kustomize/overlays/watch-all-namespaces/cluster-roles.yaml -OutFile ./overlays/watch-all-namespaces/cluster-roles.yaml\nInvoke-WebRequest https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/$Env:OPERATOR_VERSION/kustomize/overlays/watch-all-namespaces/kustomization.yaml -OutFile ./overlays/watch-all-namespaces/kustomization.yaml\nmkdir base\nInvoke-WebRequest https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/$Env:OPERATOR_VERSION/kustomize/base/kustomization.yaml -OutFile ./base/kustomization.yaml\nInvoke-WebRequest https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/$Env:OPERATOR_VERSION/kustomize/base/open-liberty-crd.yaml -OutFile ./base/open-liberty-crd.yaml\nInvoke-WebRequest https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/$Env:OPERATOR_VERSION/kustomize/base/open-liberty-operator.yaml -OutFile ./base/open-liberty-operator.yaml\nInvoke-WebRequest https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/$Env:OPERATOR_VERSION/kustomize/base/open-liberty-roles.yaml -OutFile ./base/open-liberty-roles.yaml\nkubectl create namespace open-liberty\nkubectl apply --server-side -k overlays/watch-all-namespaces\n\n# Remove the downloaded files\nRemove-Item -Recurse -Force overlays, base\n```\n\n---\n\n## Configure and build the application image\n\nTo deploy and run your Liberty application on the AKS cluster, containerize your application as a Docker image using [Open Liberty Images](https://github.com/OpenLiberty/ci.docker) or [WebSphere Liberty container images](https://www.ibm.com/docs/was-liberty/base?topic=images-liberty-container#cntr_r_images__wlicr__title__1).\n\nFollow the steps in this section to deploy the sample application on the Liberty runtime. These steps use Maven.\n\n### Check out the application\n\nClone the sample code for this guide by using the following commands. The sample is in the [Open Liberty/WebSphere Liberty on Azure Kubernetes Service Samples](https://github.com/Azure-Samples/open-liberty-on-aks) GitHub repo, which contains a few samples. This article uses the `java-app` sample.\n\n#### [Bash](#tab/in-bash)\n\n```bash\ngit clone https://github.com/Azure-Samples/open-liberty-on-aks.git\ncd open-liberty-on-aks\nexport BASE_DIR=$PWD\ngit checkout 20250424\n```\n\n#### [PowerShell](#tab/in-powershell)\n\n```powershell\ngit clone https://github.com/Azure-Samples/open-liberty-on-aks.git\ncd open-liberty-on-aks\n$Env:BASE_DIR = $PWD\ngit checkout 20250424\n```\n\n---\n\nIf you see a message about being in `detached HEAD` state, this message is safe to ignore. It just means you checked out a tag. Cloning the repo creates the following file structure:\n\n```\njava-app\n├─ src/main/\n│  ├─ aks/\n│  │  ├─ openlibertyapplication-passwordless-db.yaml\n│  ├─ docker/\n│  │  ├─ Dockerfile\n│  │  ├─ Dockerfile-wlp\n│  ├─ liberty/config/\n│  │  ├─ server.xml\n│  ├─ java/\n│  ├─ resources/\n│  ├─ webapp/\n├─ pom.xml\n├─ pom-azure-identity.xml\n```\n\nThe directories **java**, **resources**, and **webapp** contain the source code of the sample application. The code declares and uses a data source named `jdbc/JavaEECafeDB`.\n\nIn the **aks** directory, the file **openlibertyapplication-passwordless-db.yaml** is used to deploy the application image. In the **docker** directory, there are two files to create the application image with either Open Liberty or WebSphere Liberty.\n\nIn the **liberty/config** directory, the **server.xml** file is used to configure the database connection for the Open Liberty and WebSphere Liberty cluster. It defines an `azure.sql.connectionstring` variable that is used to connect to the Azure SQL Database.\n\nThe **pom.xml** file is the Maven project object model (POM) file that contains the configuration information for the project. The **pom-azure-identity.xml** file declares the `azure-identity` dependency, which is used to authenticate to Azure services using Microsoft Entra ID.\n\n> [!NOTE]\n> This sample uses the `azure-identity` library to authenticate to Azure SQL Database using Microsoft Entra authentication, which is recommended for security considerations. For more information on using SQL authentication in your Liberty application, see [Relational database connections with Java Database Connectivity (JDBC)](https://openliberty.io/docs/latest/relational-database-connections-JDBC.html).\n\n### Build the project\n\nNow that you gathered the necessary properties, build the application by using the following commands. The POM file for the project reads many variables from the environment. As part of the Maven build, these variables are used to populate values in the YAML files located in **src/main/aks**. You can do something similar for your application outside Maven if you prefer.\n\n#### [Bash](#tab/in-bash)\n\n```bash\ncd $BASE_DIR/java-app\n\n# The following variables are used for deployment file generation into target/\nexport LOGIN_SERVER=${LOGIN_SERVER}\nexport SC_SERVICE_ACCOUNT_NAME=${SERVICE_ACCOUNT_NAME}\nexport SC_SECRET_NAME=${SECRET_NAME}\n\nmvn clean install\nmvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources\n```\n\n#### [PowerShell](#tab/in-powershell)\n\n```powershell\ncd $Env:BASE_DIR/java-app\n\n# The following variables are used for deployment file generation into target/\n$Env:LOGIN_SERVER = $Env:LOGIN_SERVER\n$Env:SC_SERVICE_ACCOUNT_NAME = $Env:SERVICE_ACCOUNT_NAME\n$Env:SC_SECRET_NAME = $Env:SECRET_NAME\n\nmvn clean install\nmvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources\n```\n\n---\n\n### Build the image for AKS deployment\n\nUse [`az acr build`](/cli/azure/acr#az-acr-build) to build the image, as shown in the following example:\n\n#### [Bash](#tab/in-bash)\n\n```azurecli\ncd $BASE_DIR/java-app/target\n\naz acr build \\\n    --registry ${REGISTRY_NAME} \\\n    --image javaee-cafe:v1 \\\n    .\n```\n\n#### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\ncd $Env:BASE_DIR/java-app/target\n\naz acr build `\n    --registry $Env:REGISTRY_NAME `\n    --image javaee-cafe:v1 `\n    .\n```\n\n---\n\nThe `az acr build` command uploads the artifacts specified in the **Dockerfile** to the container registry instance, builds the image, and stores it in the container registry instance.\n\n## Deploy the application to the AKS cluster\n\nUse the following steps to deploy the Liberty application on the AKS cluster:\n\n1. Apply the deployment file by using the following commands:\n\n    ### [Bash](#tab/in-bash)\n\n    ```bash\n    cd $BASE_DIR/java-app/target\n\n    # Apply deployment file\n    kubectl apply -f openlibertyapplication-passwordless-db.yaml\n    ```\n\n    ### [PowerShell](#tab/in-powershell)\n\n    ```powershell\n    cd $Env:BASE_DIR/java-app/target\n\n    # Apply deployment file\n    kubectl apply -f openlibertyapplication-passwordless-db.yaml\n    ```\n\n    ---\n\n1. Determine whether the `OpenLibertyApplication` instance is created by using the following command:\n\n    ### [Bash](#tab/in-bash)\n\n    ```bash\n    kubectl get openlibertyapplication javaee-cafe-cluster --watch\n    ```\n\n    ### [PowerShell](#tab/in-powershell)\n\n    ```powershell\n    kubectl get openlibertyapplication javaee-cafe-cluster --watch\n    ```\n\n     ---\n\n    The following output is typical. Use <kbd>Ctrl</kbd>+<kbd>C</kbd> to exit.\n\n    ```output\n    NAME                  IMAGE                                        EXPOSED   RECONCILED   RESOURCESREADY   READY   WARNING   AGE\n    javaee-cafe-cluster   <registry-name>.azurecr.io/javaee-cafe:v1              True         True             True              57s\n    ```\n\n1. Determine whether the deployment created by the operator is ready by using the following command:\n\n    ### [Bash](#tab/in-bash)\n\n    ```bash\n    kubectl get deployment javaee-cafe-cluster --watch\n    ```\n\n    ### [PowerShell](#tab/in-powershell)\n\n    ```powershell\n    kubectl get deployment javaee-cafe-cluster --watch\n    ```\n\n    ---\n\n    The following output is typical:\n\n    ```output\n    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE\n    javaee-cafe-cluster         0/3     3            0           20s\n    ```\n\n1. Wait until you see `3/3` under the `READY` column and `3` under the `AVAILABLE` column, then use <kbd>Ctrl</kbd>+<kbd>C</kbd> to stop the `kubectl` watch process.\n\n## Test the application\n\nWhen the application runs, a Kubernetes load balancer service exposes the application front end to the internet. This process can take some time to complete.\n\nUse [`kubectl get service`](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#get) to get the external IP address of the service when it's available, as shown in the following example:\n\n### [Bash](#tab/in-bash)\n\n```bash\nexport APP_URL=http://$(kubectl get service javaee-cafe-cluster -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\necho $APP_URL\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```powershell\n$Env:APP_URL = \"http://$(kubectl get service javaee-cafe-cluster -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\"\necho $Env:APP_URL\n```\n\n---\n\n> [!NOTE]\n> If you don't see a valid URL from the output, wait for a while and run the command again.\n\nOpen the URL in a web browser and check the application home page. If the page doesn't load correctly, refresh the page later, after the app starts. You should see the pod name of your application replicas displayed at the top-left of the page. Wait for a few minutes and refresh the page to see a different pod name displayed due to load balancing provided by the AKS cluster.\n\n:::image type=\"content\" source=\"./media/howto-deploy-java-liberty-app-manual/deployment-succeeded.png\" alt-text=\"Screenshot of the Java liberty application home page.\":::\n\n> [!NOTE]\n> Currently, the application doesn't use HTTPS. We recommend that you enable Transport Layer Security (TLS) with your own certificates. For more information, see [Use TLS with an ingress controller on Azure Kubernetes Service (AKS)](/azure/aks/ingress-tls).\n\n## Clean up resources\n\nTo avoid Azure charges, you should clean up unnecessary resources. When the cluster is no longer needed, use [`az group delete`](/cli/azure/group#az-group-delete) to remove the resource group, container service, container registry, database, and all related resources.\n\n### [Bash](#tab/in-bash)\n\n```azurecli\naz group delete --name $RESOURCE_GROUP_NAME --yes --no-wait\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```azurepowershell\naz group delete --name $Env:RESOURCE_GROUP_NAME --yes --no-wait\n```\n\n---\n\n## Next steps\n\nYou can learn more from the following references used in this guide:\n\n* [What is Azure Kubernetes Service (AKS)?](/azure/aks/what-is-aks)\n* [Tutorial: Connect an AKS app to Azure SQL Database](/azure/service-connector/tutorial-python-aks-sql-database-connection-string?tabs=azure-cli)\n* [Integrate Azure SQL Database with Service Connector](/azure/service-connector/how-to-integrate-sql-database?tabs=sql-me-id-java%2Csql-secret-java)\n* [Connect using Microsoft Entra authentication](/sql/connect/jdbc/connecting-using-azure-active-directory-authentication?view=azuresqldb-current&preserve-view=true)\n* [Open Liberty](https://openliberty.io/)\n* [Open Liberty Operator](https://github.com/OpenLiberty/open-liberty-operator)\n* [Open Liberty Server configuration overview](https://openliberty.io/docs/latest/reference/config/server-configuration-overview.html)\n* [Liberty Maven Plugin](https://github.com/OpenLiberty/ci.maven#liberty-maven-plugin)\n* [Open Liberty Images](https://github.com/OpenLiberty/ci.docker)\n* [WebSphere Liberty container images](https://www.ibm.com/docs/was-liberty/base?topic=images-liberty-container#cntr_r_images__wlicr__title__1)\n\nTo incorporate Azure Cache for Redis into a Java app, see [Quickstart: Use Azure Cache for Redis in Java with Redisson Redis client](/azure/redis/java-redisson-get-started).\n\nTo explore options to run WebSphere products on Azure, see [What are solutions to run the WebSphere family of products on Azure?](websphere-family.md)\n"
  },
  {
    "path": "articles/java/ee/includes/aro-quota.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 03/26/2026\n---\n\n> [!NOTE]\n> Azure Red Hat OpenShift requires a minimum of 40 cores to create and run an OpenShift cluster. The default Azure resource quota for a new Azure subscription does not meet this requirement. To request an increase in your resource limit, see [Standard quota: Increase limits by VM series](/azure/azure-portal/supportability/per-vm-quota-requests). Note that the free trial subscription isn't eligible for a quota increase, [upgrade to a Pay-As-You-Go subscription](/azure/cost-management-billing/manage/upgrade-azure-subscription) before requesting a quota increase.\n"
  },
  {
    "path": "articles/java/ee/includes/aro-support.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 03/26/2026\n---\n\n> [!IMPORTANT]\n> While Azure Red Hat OpenShift is jointly engineered, operated, and supported by Red Hat and Microsoft to provide an integrated support experience, the software you run on top of Azure Red Hat OpenShift, including that described in this article, is subject to its own support and license terms. For more information about support for Azure Red Hat OpenShift, see [Support lifecycle for Azure Red Hat OpenShift 4](/azure/openshift/support-lifecycle). For more information about support for the software described in this article, see the main pages for that software as listed in the article.\n"
  },
  {
    "path": "articles/java/ee/includes/how-to-configure-passwordless-datasource-non-appserver.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 03/26/2026\n---\n\n## Prerequisites\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../../includes/quickstarts-free-trial-note.md)]\n- Use [Azure Cloud Shell](/azure/cloud-shell/quickstart) using the Bash environment. Make sure the Azure CLI version is 2.43.0 or higher.\n\n    [![Launch Cloud Shell in a new window](../../../includes/media/hdi-launch-cloud-shell.png)](https://shell.azure.com)\n\n- If you prefer, [install the Azure CLI 2.43.0 or higher](/cli/azure/install-azure-cli) to run Azure CLI commands.\n  - If you're using a local install, sign in with Azure CLI by using the [`az login`](/cli/azure/reference-index#az-login) command. To finish the authentication process, follow the steps displayed in your terminal. See [Sign in with Azure CLI](/cli/azure/authenticate-azure-cli) for other sign-in options.\n  - When you're prompted, install Azure CLI extensions on first use. For more information about extensions, see [Use extensions with Azure CLI](/cli/azure/azure-cli-extensions-overview).\n  - Run [`az version`](/cli/azure/reference-index?#az-version) to find the version and dependent libraries that are installed. To upgrade to the latest version, run [`az upgrade`](/cli/azure/reference-index?#az-upgrade).\n- Ensure the Azure identity you use to sign in and complete this article has either the [Owner](/azure/role-based-access-control/built-in-roles#owner) role in the current subscription or the [Contributor](/azure/role-based-access-control/built-in-roles#contributor) and [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) roles in the current subscription. For an overview of Azure roles, see [What is Azure role-based access control (Azure RBAC)?](/azure/role-based-access-control/overview) For details on the specific roles required by Oracle WebLogic marketplace offer, see [Azure built-in roles](/azure/role-based-access-control/built-in-roles).\n\n## Select a region for the deployment\n\nSelect a region that has available SKUs for your desired database. The following Azure CLI command lists the available SKUs in a given region. Keep trying different regions until you find one that has some results.\n\n### [MySQL Flexible Server](#tab/mysql-flexible-server)\n\n```azurecli-interactive\naz mysql flexible-server list-skus --location \"$REGION\" --output table\n```\n\n### [PostgreSQL Flexible Server](#tab/postgresql-flexible-server)\n\n```azurecli-interactive\naz postgres flexible-server list-skus --location \"$REGION\" --output table\n```\n\n### [Azure SQL Database](#tab/azure-sql-database)\n\n```azurecli-interactive\naz sql db list-editions --location \"$REGION\" --output table\n```\n\n---\n\n## Create a resource group\n\nCreate a resource group with [`az group create`](/cli/azure/group#az-group-create). Because resource groups must be unique within a subscription, pick a unique name. An easy way to have unique names is to use a combination of your initials, today's date, and some identifier - for example, `abc1228rg`. This example creates a resource group named `abc1228rg` in the `eastus` location. \n\n```azurecli-interactive\nexport RESOURCE_GROUP_NAME=\"abc1228rg\"\nexport REGION=eastus\naz group create \\\n    --name ${RESOURCE_GROUP_NAME} \\\n    --location ${REGION}\n```\n\n## Create a database server and a database\n\n### [MySQL Flexible Server](#tab/mysql-flexible-server)\n\nCreate a flexible server with the [`az mysql flexible-server create`](/cli/azure/mysql/flexible-server#az-mysql-flexible-server-create) command. This example creates a flexible server named `mysql20221201` with admin user `azureuser` and admin password `Secret123456`. Replace the password with yours. For more information, see [Create an Azure Database for MySQL Flexible Server using Azure CLI](/azure/mysql/flexible-server/quickstart-create-server-cli).\n\n```azurecli-interactive\nexport MYSQL_NAME=\"mysql20221201\"\nexport MYSQL_ADMIN_USER=\"azureuser\"\nexport MYSQL_ADMIN_PASSWORD=\"Secret123456\"\n\naz mysql flexible-server create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $MYSQL_NAME \\\n    --location ${REGION} \\\n    --admin-user $MYSQL_ADMIN_USER \\\n    --admin-password $MYSQL_ADMIN_PASSWORD \\\n    --public-access 0.0.0.0 \\\n    --tier Burstable \\\n    --sku-name Standard_B1ms\n```\n\nCreate a database with [`az mysql flexible-server db create`](/cli/azure/mysql/flexible-server/db#az-mysql-flexible-server-db-create).\n\n```azurecli-interactive\nexport DATABASE_NAME=\"contoso\"\n\n# create mysql database\naz mysql flexible-server db create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server-name $MYSQL_NAME \\\n    --database-name $DATABASE_NAME\n```\n\nWhen the command completes, you should see output similar to the following example:\n\n```output\nCreating database with utf8 charset and utf8_general_ci collation\n{\n  \"charset\": \"utf8\",\n  \"collation\": \"utf8_general_ci\",\n  \"id\": \"/subscriptions/contoso-hashcode/resourceGroups/abc1228rg/providers/Microsoft.DBforMySQL/flexibleServers/mysql20221201/databases/contoso\",\n  \"name\": \"contoso\",\n  \"resourceGroup\": \"abc1228rg\",\n  \"systemData\": null,\n  \"type\": \"Microsoft.DBforMySQL/flexibleServers/databases\"\n}\n```\n\n### [PostgreSQL Flexible Server](#tab/postgresql-flexible-server)\n\nCreate a flexible server with the [`az postgres flexible-server create`](/cli/azure/postgres/flexible-server#az-postgres-flexible-server-create) command. This example creates a flexible server named `postgresql20221223` with admin user `azureuser` and admin password `Secret123456`. Replace the password with yours. For more information, see [Create an Azure Database for PostgreSQL Flexible Server using Azure CLI](/azure/postgresql/flexible-server/quickstart-create-server-cli).\n\n```azurecli-interactive\nexport POSTGRESQL_NAME=\"postgresql20221223\"\nexport POSTGRESQL_ADMIN_USER=\"azureuser\"\nexport POSTGRESQL_ADMIN_PASSWORD=\"Secret123456\"\n\naz postgres flexible-server create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $POSTGRESQL_NAME \\\n    --location ${REGION} \\\n    --admin-user $POSTGRESQL_ADMIN_USER \\\n    --admin-password $POSTGRESQL_ADMIN_PASSWORD \\\n    --public-access 0.0.0.0 \\\n    --tier Burstable \\\n    --sku-name Standard_B1ms \\\n    --active-directory-auth Enabled\n```\n\nCreate a database with [`az postgres flexible-server db create`](/cli/azure/postgres/flexible-server/db#az-postgres-flexible-server-db-create).\n\n```azurecli-interactive\nexport DATABASE_NAME=\"contoso\"\n\n# create postgresql database\naz postgres flexible-server db create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server-name $POSTGRESQL_NAME \\\n    --database-name $DATABASE_NAME\n```\n\nAllow public access from any Azure service within Azure to this server.\n\n```azurecli-interactive\naz postgres flexible-server firewall-rule create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $POSTGRESQL_NAME \\\n    --rule-name AllowAllAzureServices \\\n    --start-ip-address 0.0.0.0 \\\n    --end-ip-address 0.0.0.0\n```\n\n### [Azure SQL Database](#tab/azure-sql-database)\n\n<!-- Part of Azure SQL Database content is used in azure-aks-docs-pr/blob/wls-aks-quickstart-pswless/articles/aks/includes/jakartaee/create-azure-sql-database-passwordless.md. Ensure any changes made here are also applied to that file.-->\n\nCreate a server with the [`az sql server create`](/cli/azure/sql/server#az-sql-server-create) command. This example creates a server named `myazuresql20130213` with admin user `azureuser` and admin password `Secret123456`. Replace the password with yours. For more information, see [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart?tabs=azure-cli).\n\n```azurecli-interactive\nexport AZURESQL_SERVER_NAME=\"myazuresql20130213\"\nexport AZURESQL_ADMIN_USER=\"azureuser\"\nexport AZURESQL_ADMIN_PASSWORD=\"Secret123456\"\n\naz sql server create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $AZURESQL_SERVER_NAME \\\n    --location ${REGION} \\\n    --admin-user $AZURESQL_ADMIN_USER \\\n    --admin-password $AZURESQL_ADMIN_PASSWORD\n```\n\nCreate a database with the [`az sql db create`](/cli/azure/sql/db) command in the [serverless compute tier](/azure/azure-sql/database/serverless-tier-overview).\n\n```azurecli-interactive\nexport DATABASE_NAME=\"mysingledatabase20230213\"\n\naz sql db create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server $AZURESQL_SERVER_NAME \\\n    --name $DATABASE_NAME \\\n    --sample-name AdventureWorksLT \\\n    --edition GeneralPurpose \\\n    --compute-model Serverless \\\n    --family Gen5 \\\n    --capacity 2\n```\n\n---\n\n<a name='configure-an-azure-ad-administrator-to-your-database'></a>\n\n## Configure a Microsoft Entra administrator for your database\n\nNow that you created the database, you need to make it ready to support passwordless connections. A passwordless connection requires a combination of managed identities for Azure resources and Microsoft Entra authentication. For an overview of managed identities for Azure resources, see [What are managed identities for Azure resources?](/azure/active-directory/managed-identities-azure-resources/overview)\n\n### [MySQL Flexible Server](#tab/mysql-flexible-server)\n\nFor information on how MySQL Flexible Server interacts with managed identities, see the [Azure Database for MySQL documentation](/azure/mysql).\n\nThe following example configures the current Azure CLI user as a Microsoft Entra administrator account. To enable Azure authentication, it's necessary to assign an identity to MySQL Flexible Server.\n\nFirst, create a managed identity with [`az identity create`](/cli/azure/identity#az-identity-create) and assign the identity to MySQL server with [`az mysql flexible-server identity assign`](/cli/azure/mysql/flexible-server/identity#az-mysql-flexible-server-identity-assign).\n\n```azurecli-interactive\nexport MYSQL_UMI_NAME=\"id-mysql-aad-20221205\"\n\n# create a User Assigned Managed Identity for MySQL to be used for AAD authentication\naz identity create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $MYSQL_UMI_NAME\n\n## assign the identity to the MySQL server\naz mysql flexible-server identity assign \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server-name $MYSQL_NAME \\\n    --identity $MYSQL_UMI_NAME\n```\n\nThen, set the current Azure CLI user as the Microsoft Entra administrator account with [`az mysql flexible-server ad-admin create`](/cli/azure/mysql/flexible-server/ad-admin#az-mysql-flexible-server-ad-admin-create).\n\n```azurecli-interactive\nexport CURRENT_USER=$(az account show --query user.name --output tsv)\nexport CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)\n\naz mysql flexible-server ad-admin create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server-name $MYSQL_NAME \\\n    --object-id $CURRENT_USER_OBJECTID \\\n    --display-name $CURRENT_USER \\\n    --identity $MYSQL_UMI_NAME\n```\n\n### [PostgreSQL Flexible Server](#tab/postgresql-flexible-server)\n\nFor information on how PostgreSQL Flexible server interacts with managed identities, see [Use Microsoft Entra ID for authentication with Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/how-to-configure-sign-in-azure-ad-authentication). \n\nAdd the current signed-in user as Microsoft Entra Admin to the Azure Database for PostgreSQL Flexible Server instance by using the following commands:\n\n```azurecli-interactive\nexport CURRENT_USER=$(az account show --query user.name --output tsv)\naz postgres flexible-server ad-admin create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server-name $POSTGRESQL_NAME \\\n    --display-name $CURRENT_USER \\\n    --object-id $(az ad signed-in-user show --query id --output tsv)\n```\n\n### [Azure SQL Database](#tab/azure-sql-database)\n\nFor information on how Azure SQL Server interacts with managed identities, see [Connect using Microsoft Entra authentication](/sql/connect/jdbc/connecting-using-azure-active-directory-authentication).\n\nThe following example configures a Microsoft Entra administrator account to Azure SQL server from the portal:\n\n1. In the [Azure portal](https://portal.azure.com/), open the Azure SQL server instance **myazuresql20130213**.\n1. Select **Settings**, then select **Microsoft Entra ID**. On the **Microsoft Entra ID** page, select **Set admin**.\n1. On the **Add admin** page, search for a user, select the user or group to be an administrator, and then select **Select**.\n1. At the top of the **Microsoft Entra ID** page, select **Save**. For Microsoft Entra users and groups, the **Object ID** is displayed next to the admin name.\n1. The process of changing the administrator might take several minutes. Then, the new administrator appears in the **Microsoft Entra ID** box.\n\n---\n\n## Create a user-assigned managed identity\n\nNext, in Azure CLI, create an identity in your subscription by using the [`az identity create`](/cli/azure/identity#az-identity-create) command. You use this managed identity to connect to your database.\n\n```azurecli-interactive\naz identity create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myManagedIdentity\n```\n\nTo configure the identity in the following steps, use the [`az identity show`](/cli/azure/identity#az-identity-show) command to store the identity's client ID in a shell variable.\n\n```azurecli-interactive\n# Get client ID of the user-assigned identity\nexport CLIENT_ID=$(az identity show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myManagedIdentity \\\n    --query clientId \\\n    --output tsv)\n```\n\n## Create a database user for your managed identity\n\nFirst, you're required to create a firewall rule to access the database server from your CLI client. Run the following commands to get your current IP address:\n\n```bash\nexport MY_IP=$(curl http://whatismyip.akamai.com)\n```\n\nIf you're working on Windows Subsystem for Linux (WSL) with VPN enabled, the following command might return an incorrect IPv4 address. One way to get your IPv4 address is by visiting [whatismyipaddress.com](https://whatismyipaddress.com/). Set the environment variable `MY_IP` as the IPv4 address from which you want to connect to the database. You configure the database firewall with this IP address later.\n\n### [MySQL Flexible Server](#tab/mysql-flexible-server)\n\nConnect as the Microsoft Entra administrator user to your MySQL database, and create a MySQL user for your managed identity.\n\nCreate a temporary firewall rule with [`az mysql flexible-server firewall-rule create`](/cli/azure/mysql/flexible-server/firewall-rule#az-mysql-flexible-server-firewall-rule-create).\n\n```azurecli-interactive\naz mysql flexible-server firewall-rule create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $MYSQL_NAME \\\n    --rule-name AllowCurrentMachineToConnect \\\n    --start-ip-address ${MY_IP} \\\n    --end-ip-address ${MY_IP}\n```\n\nNext, prepare an SQL file to create a database user for the managed identity. The following example adds a user with login name `identity-contoso` and grants the user privileges to access database `contoso`:\n\n```bash\nexport IDENTITY_LOGIN_NAME=\"identity-contoso\"\n\ncat <<EOF >createuser.sql\nSET aad_auth_validate_oids_in_tenant = OFF;\nDROP USER IF EXISTS '${IDENTITY_LOGIN_NAME}'@'%';\nCREATE AADUSER '${IDENTITY_LOGIN_NAME}' IDENTIFIED BY '${CLIENT_ID}';\nGRANT ALL PRIVILEGES ON ${DATABASE_NAME}.* TO '${IDENTITY_LOGIN_NAME}'@'%';\nFLUSH privileges;\nEOF\n```\n\nExecute the SQL file with the command [`az mysql flexible-server execute`](/cli/azure/mysql/flexible-server#az-mysql-flexible-server-execute). You can retrieve your access token with the command [`az account get-access-token`](/cli/azure/account#az-account-get-access-token).\n\n```azurecli-interactive\nexport RDBMS_ACCESS_TOKEN=$(az account get-access-token \\\n    --resource-type oss-rdbms \\\n    --query accessToken \\\n    --output tsv) \n\naz mysql flexible-server execute \\\n    --name ${MYSQL_NAME} \\\n    --admin-user ${CURRENT_USER} \\\n    --admin-password ${RDBMS_ACCESS_TOKEN} \\\n    --file-path \"createuser.sql\"\n```\n\nYou might be prompted to install the `rdbms-connect` extension, as shown in the following output. Press <kbd>y</kbd> to continue. If you're not working with the `root` user, you need to input the user password.\n\n```output\nThe command requires the extension rdbms-connect. Do you want to install it now? The command will continue to run after the extension is installed. (Y/n): y\nRun 'az config set extension.use_dynamic_install=yes_without_prompt' to allow installing extensions without prompt.\nThis extension depends on gcc, libpq-dev, python3-dev and they will be installed first.\n[sudo] password for user:\n```\n\nIf the SQL file executes successfully, your output is similar to the following example:\n\n```output\nRunning *.sql* file 'createuser.sql'...\nSuccessfully executed the file.\nClosed the connection to mysql20221201\n```\n\nThe managed identity `myManagedIdentity` now has access to the database when authenticating with the username `identity-contoso`.\n\nIf you no longer want to access the server from this IP address, you can remove the firewall rule by using the following command:\n\n```azurecli-interactive\naz mysql flexible-server firewall-rule delete \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $MYSQL_NAME \\\n    --rule-name AllowCurrentMachineToConnect \\\n    --yes\n```\n\nFinally, use the following command to get the connection string that you use in the next section:\n\n```azurecli-interactive\nexport CONNECTION_STRING=\"jdbc:mysql://${MYSQL_NAME}.mysql.database.azure.com:3306/${DATABASE_NAME}?useSSL=true\"\necho ${CONNECTION_STRING}\n```\n\n### [PostgreSQL Flexible Server](#tab/postgresql-flexible-server)\n\nConnect as the Microsoft Entra administrator user to your PostgreSQL database, and create a PostgreSQL user for your managed identity.\n\nCreate a temporary firewall rule with [`az postgres flexible-server firewall-rule create`](/cli/azure/postgres/flexible-server/firewall-rule#az-postgres-flexible-server-firewall-rule-create), as shown in the following example:\n\n```azurecli-interactive\naz postgres flexible-server firewall-rule create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name $POSTGRESQL_NAME \\\n    --rule-name $POSTGRESQL_NAME-database-allow-local-ip \\\n    --start-ip-address $MY_IP \\\n    --end-ip-address $MY_IP\n```\n\nIn the same Azure CLI shell you've been using, obtain a token for connection by using the following command:\n\n```bash\nexport RDBMS_ACCESS_TOKEN=$(az account get-access-token --resource-type oss-rdbms --query accessToken --output tsv)\n```\n\nNext, prepare an SQL file to create a database user for the managed identity. The following example adds a user with login name `myManagedIdentity` and grants the user privileges to access database `contoso`:\n\n```bash\ncat <<EOF >createuser.sql\nselect * from pgaadauth_create_principal('myManagedIdentity', false, false);\nselect * from pgaadauth_list_principals(false);\nGRANT ALL PRIVILEGES ON DATABASE \"contoso\" TO \"myManagedIdentity\";\nGRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"myManagedIdentity\";\nGRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"myManagedIdentity\";\nEOF\n```\n\nUse the following commands to execute the SQL file:\n   \n```bash\naz config set extension.use_dynamic_install=yes_without_prompt\n\naz postgres flexible-server execute --verbose \\\n    --name ${POSTGRESQL_NAME} \\\n    --admin-user ${CURRENT_USER} \\\n    --admin-password ${RDBMS_ACCESS_TOKEN} \\\n    --file-path createuser.sql\n```\n\nThe output is similar to the following example:\n\n```output\nConnecting to postgres database by default.\nRunning sql file 'dbuser.sql'...\nSuccessfully executed the file.\nClosed the connection to postgresql20221223\nCommand ran in 2.752 seconds (init: 0.144, invoke: 2.609)\n```\n\nUse the following command to get the connection string that you use in the next section:\n\n```azurecli-interactive\nexport CONNECTION_STRING=\"jdbc:postgresql://${POSTGRESQL_NAME}.postgres.database.azure.com:5432/${DATABASE_NAME}?sslmode=require\"\necho ${CONNECTION_STRING}\n```\n\n### [Azure SQL Database](#tab/azure-sql-database)\n\nConnect as the Microsoft Entra administrator user to your Azure SQL database from the Azure portal, and create a user for your managed identity.\n\nFirst, create a firewall rule to access the Azure SQL server from portal, as shown in the following steps:\n\n1. In the [Azure portal](https://portal.azure.com/), open the Azure SQL server instance **myazuresql20130213**.\n1. Select **Security**, and then select **Networking**.\n1. Under **Firewall rules** select **Add your client IPV4 IP address**.\n1. Under **Exceptions** select **Allow Azure services and resources to access this server**.\n1. Select **Save**.\n\nAfter the firewall rule is created, you can access the Azure SQL server from the Azure portal. Use the following steps to create a database user:\n\n1. Select **Settings** and then select **SQL databases**. Select **mysingledatabase20230213**.\n\n1. Select **Query editor**. On the **Welcome to SQL Database Query Editor** page, under **Active Directory authentication**, find a message similar to \"Logged in as user@contoso.com\".\n\n1. Select **Continue as user@contoso.com**, where **user** is your AD admin account name.\n\n1. After signing in, in the **Query 1** editor, use the following commands to create a database user for managed identity `myManagedIdentity`:\n\n    ```sql\n    CREATE USER \"myManagedIdentity\" FROM EXTERNAL PROVIDER;\n    ALTER ROLE db_datareader ADD MEMBER \"myManagedIdentity\";\n    ALTER ROLE db_datawriter ADD MEMBER \"myManagedIdentity\";\n    ALTER ROLE db_ddladmin ADD MEMBER \"myManagedIdentity\";\n    GO\n    ```\n\n1. In the **Query 1** editor, select **Run** to run the SQL commands.\n\n1. If the commands complete successfully, the system responds with a message saying \"Query succeeded: Affected rows: 0\".\n\n1. Use the following command to get the connection string that you use in the next section:\n\n    ```azurecli-interactive\n    export CONNECTION_STRING=\"jdbc:sqlserver://myazuresql20130213.database.windows.net:1433;database=mysingledatabase20230213;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;\"\n    echo ${CONNECTION_STRING}\n    ```\n\n---\n"
  },
  {
    "path": "articles/java/ee/includes/secure-with-entra-id-add-app-roles.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.date: 03/26/2026\n---\n\nThen, add app roles to your application by following steps in [Add app roles to your application and receive them in the token](/entra/identity-platform/howto-add-app-roles-in-apps). You just need the sections [Declare roles for an application](/entra/identity-platform/howto-add-app-roles-in-apps#declare-roles-for-an-application) and [Assign users and groups to Microsoft Entra roles](/entra/identity-platform/howto-add-app-roles-in-apps#assign-users-and-groups-to-microsoft-entra-roles). Use the following directions as you go through the article, then return to this article after you declare roles for the application.\n\n1. When you reach the [Declare roles for an application](/entra/identity-platform/howto-add-app-roles-in-apps#declare-roles-for-an-application) section, use the **App roles** UI to create roles for the administrator and the regular user.\n\n   1. Create an administrator user role by using the following values:\n      - For **Display name**, enter *Admin*.\n      - For **Allowed member types**, select **Users/Groups**.\n      - For **Value**, enter *admin*.\n      - For **Description**, enter *Admin*.\n      - Select **Do you want to enable this app role?**.\n\n      :::image type=\"content\" source=\"media/secure-with-entra-id-add-app-roles/create-admin-role.png\" alt-text=\"Screenshot of the Azure portal that shows the Create app role pane for the admin user.\" lightbox=\"media/secure-with-entra-id-add-app-roles/create-admin-role.png\":::\n\n   1. Select **Apply**. Wait until the role is created.\n\n   1. Create a regular user role by using the same steps, but with the following values:\n      - For **Display name**, enter *User*.\n      - For **Value**, enter *user*.\n      - For **Description**, enter *User*.\n\n      :::image type=\"content\" source=\"media/secure-with-entra-id-add-app-roles/create-user-role.png\" alt-text=\"Screenshot of the Azure portal that shows the Create app role pane for the regular user.\" lightbox=\"media/secure-with-entra-id-add-app-roles/create-user-role.png\":::\n\n1. When you reach the [Assign users and groups to Microsoft Entra roles](/entra/identity-platform/howto-add-app-roles-in-apps#assign-users-and-groups-to-microsoft-entra-roles), section, use the following steps:\n   1. Select **Add user/group**.\n   1. In the **Add Assignment** pane, for **Users**, select user **Admin** and for **Select a role**, select role **Admin**. Then, select **Assign**. Wait until the application assignment succeeds. You might need to scroll the table sideways to see the **Role assigned** column.\n   1. Repeat the previous steps to assign the **User** role to user **User**.\n   1. Select **Refresh** and you should see the users and roles assigned in the **Users and groups** pane.\n\n      :::image type=\"content\" source=\"media/secure-with-entra-id-add-app-roles/users-and-roles-assigned.png\" alt-text=\"Screenshot of the Azure portal that shows the users and roles assigned.\" lightbox=\"media/secure-with-entra-id-add-app-roles/users-and-roles-assigned.png\":::\n\n      You might need to adjust the width of the column headers to make your view look like the image.\n\nDon't follow any other steps in **Add app roles to your application and receive them in the token**.\n"
  },
  {
    "path": "articles/java/ee/includes/secure-with-entra-id-add-redirect-uri.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.date: 03/26/2026\n---\n\nTo successfully run and test the app locally, you need to add a redirect URI to the app registration. Follow the instructions in the [Add a redirect URI](/entra/identity-platform/quickstart-register-app#add-a-redirect-uri) section of [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app), and use the following values:\n"
  },
  {
    "path": "articles/java/ee/includes/secure-with-entra-id-clean-up-resources.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.date: 03/26/2026\n---\n\nThis article doesn't direct you to deploy your app on Azure. There are no Azure resources to clean up for the app, although there **are** Microsoft Entra ID resources. To deploy an app on Azure, you can follow the guidance referenced in the next section.\n\nWhen you finish with the resources for this sample app, use the following steps to clean up the Microsoft Entra ID resources. Removing unused Microsoft Entra ID resources is an important security best practice.\n\n1. Remove the app registration you created by following the steps in [Remove an application registered with the Microsoft identity platform](/entra/identity-platform/howto-remove-app). You only need to follow the steps in the section **Remove an application authored by your organization**.\n1. The act of removing the app registration should also delete the enterprise application. For more information about deleting enterprise applications, see [Delete an enterprise application](/entra/identity/enterprise-apps/delete-application-portal).\n1. Delete the users you created by following the steps in [How to create, invite, and delete users](/entra/fundamentals/how-to-create-delete-users).\n"
  },
  {
    "path": "articles/java/ee/includes/secure-with-entra-id-create-users.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.date: 03/26/2026\nms.custom: sfi-image-nochange\n---\n\nFirst, create two users in your Microsoft Entra tenant by following the steps in [How to create, invite, and delete users](/entra/fundamentals/how-to-create-delete-users). You just need the [Create a new user](/entra/fundamentals/how-to-create-delete-users#create-a-new-user) section. Use the following directions as you go through the article, then return to this article after you create users in your Microsoft Entra tenant.\n\nTo create a user to serve as an \"admin\" in the app, use the following steps:\n\n1. When you reach the **Basics** tab in the [Create a new user](/entra/fundamentals/how-to-create-delete-users#create-a-new-user) section, use the following steps:\n   1. For **User principal name**, enter *admin*. Save the value so you can use it later when you sign in to the app.\n   1. For **Mail nickname**, select **Derive from user principal name** \n   1. For **Display name**, enter *Admin*.\n   1. For **Password**, select **Auto-generate password**. Copy and save the **Password** value to use later when you sign in to the app.\n   1. Select **Account enabled**.\n\n      :::image type=\"content\" source=\"media/secure-with-entra-id-create-users/create-admin-user.png\" alt-text=\"Screenshot of the Azure portal that shows the Create new user Basics pane for an admin user.\" lightbox=\"media/secure-with-entra-id-create-users/create-admin-user.png\":::\n\n   1. Select **Review + create** > **Create**. Wait until the user is created.\n   1. Wait a minute or so and select **Refresh**. You should see the new user in the list.\n\nTo create a user to serve as a \"user\" in the app, repeat these steps, but use the following values:\n\n- For **User principal name**, enter *user*.\n- For **Display name**, enter *User*.\n\n:::image type=\"content\" source=\"media/secure-with-entra-id-create-users/create-regular-user.png\" alt-text=\"Screenshot of the Azure portal that shows the Create new user Basics pane for a regular user.\" lightbox=\"media/secure-with-entra-id-create-users/create-regular-user.png\":::\n"
  },
  {
    "path": "articles/java/ee/includes/secure-with-entra-id-gather-user-credentials.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.date: 03/26/2026\n---\n\nIn this article, Microsoft Entra ID uses the email address of each user as the user ID for signing in. Use the following steps to get the email address for the admin user and regular user:\n\n1. Sign in to the [Microsoft Entra admin center](https://entra.microsoft.com/) as at least a [Cloud Application Administrator](/entra/identity/role-based-access-control/permissions-reference#cloud-application-administrator).\n1. If you have access to multiple tenants, use the **Settings** icon (:::image type=\"icon\" source=\"/entra/identity-platform/media/common/admin-center-settings-icon.png\" border=\"false\":::) in the top menu to switch to the tenant in which you want to register the application from the **Directories + subscriptions** menu.\n1. Browse to **Identity > Users > All Users**.\n1. Locate the admin user in the list and select it.\n1. Locate the **User principal name** field.\n1. Use the copy icon next to the value of the field to save the email address of the user to the clipboard. Save the value for later use.\n1. To get the email address for the regular user, follow the same steps.\n\nUse the passwords for the admin user and regular user that you set when creating the users.\n"
  },
  {
    "path": "articles/java/ee/includes/secure-with-entra-id-prerequisites.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.date: 03/26/2026\n---\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../../includes/quickstarts-free-trial-note.md)]\n- An Azure identity with at least the Cloud Application Administrator Microsoft Entra role. For more information, see [List Microsoft Entra role assignments](/entra/identity/role-based-access-control/view-assignments#microsoft-entra-admin-center) and [Microsoft Entra built-in roles](/entra/identity/role-based-access-control/permissions-reference#cloud-application-administrator).\n- A Microsoft Entra tenant. If you don't have an existing tenant, see [Quickstart: Set up a tenant](/entra/identity-platform/quickstart-create-new-tenant).\n- A local machine with a Unix-like operating system installed - for example, Ubuntu, macOS, or Windows Subsystem for Linux.\n- [Git](/devops/develop/git/install-and-set-up-git).\n- A Java SE implementation, version 21 or later - for example, [the Microsoft build of OpenJDK](/java/openjdk).\n- [Maven](https://maven.apache.org/download.cgi), version 3.9.3 or later.\n"
  },
  {
    "path": "articles/java/ee/includes/secure-with-entra-id-register-app.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.date: 03/26/2026\n---\n\nNext, register an application by following the steps in [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app). Use the following directions as you go through the article, then return to this article after you register and configure the application.\n\n1. When you reach the [Register an application](/entra/identity-platform/quickstart-register-app#register-an-application) section, use the following steps:\n   1. For **Supported account types**, select **Accounts in this organizational directory only (Default directory only - Single tenant)**.\n   1. When registration finishes, save the **Application (client) ID** and **Directory (tenant) ID** values to use later in the app configuration.\n1. When you reach the [Add a redirect URI](/entra/identity-platform/quickstart-register-app#add-a-redirect-uri) section, skip the steps as for now. You add the redirect URI later when you run and test the sample app locally in this article.\n1. When you reach the [Add credentials](/entra/identity-platform/quickstart-register-app#add-credentials) section, select the **Add a client secret** tab.\n1. When you add a client secret, write down the **Client secret** value to use later in the app configuration.\n"
  },
  {
    "path": "articles/java/ee/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Java EE, Jakarta EE, and MicroProfile on Azure\nsummary: Java EE, Jakarta EE, and MicroProfile are open specifications for Cloud Native Java. Learn how to use these technologies on Azure here.\n\nmetadata:\n  title: Java EE, Jakarta EE, and MicroProfile\n  description: Java EE, Jakarta EE, and MicroProfile are open specifications for Cloud Native Java. Learn how to combine the power of Azure with technologies based on these specifications with this documentation.\n  ms.topic: landing-page\n  author: KarlErickson\n  ms.author: karler\n  ms.reviewer: edburns\n  ms.date: 03/26/2026\n  ms.custom: devx-track-java, devx-track-extended-java\n\n# linkListType: architecture | concept | deploy | download | get-started | how-to-guide | learn | overview | quickstart | reference | sample | tutorial | video | whats-new\n\nlandingContent:\n# Cards and links should be based on top customer tasks or top subjects\n# Start card title with a verb\n  # Card (optional)\n  - title: Java application servers on Azure\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Oracle WebLogic Server on Azure VMs\n            url: /azure/virtual-machines/workloads/oracle/oracle-weblogic?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Oracle WebLogic Server on AKS\n            url: /azure/virtual-machines/workloads/oracle/weblogic-aks?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: IBM WebSphere products on Azure\n            url: websphere-family.md\n          - text: JBoss EAP on Azure\n            url: jboss-on-azure.md\n  - title: Migrate Quarkus to Azure\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Deploy a Java application with Quarkus on an Azure Kubernetes Service (AKS) cluster\n            url: /azure/aks/howto-deploy-java-quarkus-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Deploy serverless Java apps with Quarkus on Azure Functions\n            url: /azure/azure-functions/functions-create-first-quarkus?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Deploy a Java application with Quarkus on Azure Container Apps\n            url: deploy-java-quarkus-app.md\n          - text: Secure Quarkus applications with Microsoft Entra ID using OpenID Connect\n            url: quarkus-with-microsoft-entra-id.md\n  - title: Migrate WebLogic Server to Azure\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: WebLogic Server on Azure VMs\n            url: /azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: WebLogic Server on Azure Kubernetes Service\n            url: /azure/aks/howto-deploy-java-wls-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - linkListType: how-to-guide\n        links:\n          - text: Step-by-step guide to installing WebLogic Server on Azure VMs \n            url: ../migration/migrate-weblogic-to-azure-vm-manually.md?bc=/azure/developer/java/breadcrumb/toc.json&toc=/azure/developer/java/ee/toc.json\n          - text: Step-by-step guide to installing WebLogic Server on AKS\n            url: https://aka.ms/wls-aks-guidance\n      - linkListType: tutorial\n        links:\n          - text: Migrating WebLogic Server to AKS\n            url: ../migration/migrate-weblogic-to-azure-kubernetes-service.md?bc=/azure/developer/java/breadcrumb/toc.json&toc=/azure/developer/java/ee/toc.json\n          - text: Migrating WebLogic Server to Azure VMs\n            url: ../migration/migrate-weblogic-to-virtual-machines.md?bc=/azure/developer/java/breadcrumb/toc.json&toc=/azure/developer/java/ee/toc.json\n          - text: WebLogic to AKS with KEDA scaler based on Prometheus Metrics\n            url: ../migration/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics.md?bc=/azure/developer/java/breadcrumb/toc.json&toc=/azure/developer/java/ee/toc.json\n          - text: WebLogic Server on AKS with a custom virtual network\n            url: ../migration/migrate-weblogic-to-aks-within-an-existing-vnet.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: WebLogic with App Gateway\n            url: ../migration/migrate-weblogic-with-app-gateway.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: WebLogic to Azure VMs with Elastic\n            url: ../migration/migrate-weblogic-with-elk.md?bc=/azure/developer/java/breadcrumb/toc.json&toc=/azure/developer/java/ee/toc.json\n          - text: WebLogic to Azure VMs with Entra ID\n            url: ../migration/migrate-weblogic-with-entra-id-via-ldap.md?bc=/azure/developer/java/breadcrumb/toc.json&toc=/azure/developer/java/ee/toc.json\n          - text: Passwordless database connections for WebLogic Server\n            url: how-to-configure-passwordless-datasource-wls.md\n  - title: Migrate JBoss EAP to Azure\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Red Hat JBoss EAP cluster on Azure VMs\n            url: /azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: JBoss EAP to Azure Red Hat OpenShift\n            url: /azure/openshift/howto-deploy-java-jboss-enterprise-application-platform-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - linkListType: how-to-guide\n        links:\n          - text: Step-by-step guide to installing Red Hat JBoss EAP on Azure Red Hat OpenShift\n            url: jboss-eap-on-aro.md\n          - text: Step-by-step guide to installing JBoss EAP on Azure VMs\n            url: ../migration/migrate-jboss-eap-to-azure-vm-manually.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - linkListType: tutorial\n        links:\n          - text: JBoss EAP to Azure App Service\n            url: ../migration/migrate-jboss-eap-to-jboss-eap-on-azure-app-service.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Migrate JBoss EAP applications to Azure Red Hat OpenShift\n            url: ../migration/migrate-jboss-eap-to-azure-redhat-openshift.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Migrate JBoss EAP applications to JBoss EAP on Azure VMs\n            url: ../migration/migrate-jboss-eap-to-jboss-eap-on-azure-vms.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Passwordless database connections for JBoss EAP\n            url: how-to-configure-passwordless-datasource-eap.md\n  - title: Migrate WebSphere to Azure\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: IBM WebSphere Liberty and Open Liberty on AKS\n            url: /azure/aks/howto-deploy-java-liberty-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: IBM WebSphere Liberty and Open Liberty on Azure Red Hat OpenShift\n            url: /azure/openshift/howto-deploy-java-liberty-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: IBM WebSphere Liberty and Open Liberty on Azure Container Apps\n            url: deploy-java-liberty-app-aca.md\n          - text: IBM WebSphere Application Server on Azure VMs\n            url: traditional-websphere-application-server-virtual-machines.md\n      - linkListType: how-to-guide\n        links:\n          - text: Step-by-step guide to installing WebSphere Application Server Network Deployment (traditional) on Azure VMs\n            url: ../migration/migrate-websphere-to-azure-vm-manually.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Step-by-step guide to installing WebSphere Liberty/Open Liberty on AKS\n            url: howto-deploy-java-liberty-app-manual.md\n          - text: Step-by-step guide to installing WebSphere Liberty/Open Liberty on Azure Red Hat OpenShift\n            url: liberty-on-aro.md\n      - linkListType: tutorial\n        links:\n          - text: Migrate WebSphere applications to AKS\n            url: ../migration/migrate-websphere-to-azure-kubernetes-service.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Migrate WebSphere applications to Azure Red Hat OpenShift\n            url: ../migration/migrate-websphere-to-azure-redhat-openshift.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Migrate WebSphere applications to Azure VMs\n            url: ../migration/migrate-websphere-to-virtual-machines.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Java app with WebSphere Liberty/Open Liberty using Microsoft Entra ID\n            url: liberty-with-microsoft-entra-id.md\n          - text: Azure Redis as WebSphere Liberty/Open Liberty session cache\n            url: how-to-deploy-java-liberty-jcache.md\n          - text: Passwordless database connections for WebSphere\n            url: how-to-configure-passwordless-datasource-websphere.md\n  - title: High Availability/Disaster Recovery (HA/DR)\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: WebSphere Liberty/Open Liberty on AKS\n            url: ../migration/migrate-liberty-to-aks-with-ha-dr.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: WebSphere Application Server on Azure VMs\n            url: ../migration/migrate-websphere-to-vms-with-ha-dr.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: WebLogic Server on AKS\n            url: ../migration/migrate-weblogic-to-aks-with-ha-geo-redundancy.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: WebLogic Server on Azure VMs\n            url: ../migration/migrate-weblogic-to-vms-with-ha-dr.md?bc=/azure/developer/java/breadcrumb/toc.json&toc=/azure/developer/java/ee/toc.json\n          - text: JBoss EAP on Azure VMs\n            url: ../migration/migrate-jboss-eap-to-vms-with-ha-dr.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n\n  - title: Code samples\n    linkLists:\n      - linkListType: sample\n        links:\n          - text: PiggyMetrics on MicroProfile\n            url: https://github.com/Azure-Samples/piggymetrics/tree/openliberty\n          - text: Open/WebSphere Liberty on Azure Red Hat OpenShift samples\n            url: https://github.com/Azure-Samples/open-liberty-on-aro\n          - text: Open Liberty/WebSphere Liberty on AKS samples\n            url: https://github.com/Azure-Samples/open-liberty-on-aks\n"
  },
  {
    "path": "articles/java/ee/jboss-eap-on-aro.md",
    "content": "---\ntitle: Manually Deploy a Java Application with JBoss EAP on an Azure Red Hat OpenShift Cluster\ndescription: Deploy a Java application with Red Hat JBoss Enterprise Application Platform (JBoss EAP) on an Azure Red Hat OpenShift cluster.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 03/26/2026\nms.topic: how-to\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-jbosseap\n  - devx-track-javaee-jbosseap-aro\n  - devx-track-extended-java\n  - linux-related-content\n  - sfi-image-nochange\n---\n\n# Manually deploy a Java application with JBoss EAP on an Azure Red Hat OpenShift cluster\n\nThis article shows you how to deploy a Red Hat JBoss Enterprise Application Platform (EAP) application to an Azure Red Hat OpenShift cluster. The sample is a Java application backed by an SQL database. The app is deployed using [JBoss EAP Helm Charts](https://jbossas.github.io/eap-charts).\n\nIn this guide, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Prepare a JBoss EAP application for OpenShift.\n> * Create a single database instance of Azure SQL Database.\n>   * Because Azure Workload Identity is not yet supported by Azure OpenShift, this article still uses username and password for database authentication instead of using passwordless database connections.\n> * Deploy the application on an Azure Red Hat OpenShift cluster by using JBoss Helm Charts and OpenShift Web Console\n\nThe sample application is a stateful application that stores information in an HTTP session. It makes use of the JBoss EAP clustering capabilities and uses the following Jakarta EE and MicroProfile technologies:\n\n* Jakarta Server Faces\n* Jakarta Enterprise Beans\n* Jakarta Persistence\n* MicroProfile Health\n\nThis article is step-by-step manual guidance for running JBoss EAP app on an Azure Red Hat OpenShift cluster. For a more automated solution that accelerates your journey to Azure Red Hat OpenShift cluster, see [Quickstart: Deploy JBoss EAP on Azure Red Hat OpenShift using the Azure portal](/azure/openshift/howto-deploy-java-jboss-enterprise-application-platform-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json).\n\nIf you're interested in providing feedback or working closely on your migration scenario with the engineering team developing JBoss EAP on Azure solutions, fill out this short [survey on JBoss EAP migration](https://aka.ms/jboss-on-azure-survey) and include your contact information. The team of program managers, architects, and engineers will promptly get in touch with you to initiate close collaboration.\n\n> [!IMPORTANT]\n> This article deploys an application by using JBoss EAP Helm Charts. At the time of writing, this feature is still offered as a [Technology Preview](https://access.redhat.com/articles/6290611). Before choosing to deploy applications with JBoss EAP Helm Charts on production environments, ensure that this feature is a supported feature for your JBoss EAP/XP product version.\n\n> [!IMPORTANT]\n> While Red Hat and Microsoft Azure jointly engineer, operate, and support Azure Red Hat OpenShift to provide an integrated support experience, the software you run on top of Azure Red Hat OpenShift, including that described in this article, is subject to its own support and license terms. For details about support of Azure Red Hat OpenShift, see [Support lifecycle for Azure Red Hat OpenShift 4](/azure/openshift/support-lifecycle). For details about support of the software described in this article, see the main pages for that software as listed in the article.\n\n## Prerequisites\n\n> [!NOTE]\n> Azure Red Hat OpenShift requires a minimum of 40 cores to create and run an OpenShift cluster. The default Azure resource quota for a new Azure subscription doesn't meet this requirement. To request an increase in your resource limit, see [Standard quota: Increase limits by VM series](/azure/azure-portal/supportability/per-vm-quota-requests). The free trial subscription isn't eligible for a quota increase, [upgrade to a Pay-As-You-Go subscription](/azure/cost-management-billing/manage/upgrade-azure-subscription) before requesting a quota increase.\n\n1. Prepare a local machine with a Unix-like operating system supported by the various products installed - such as Ubuntu, macOS, or [Windows Subsystem for Linux](/windows/wsl/).\n1. Install a Java Standard Edition (SE) implementation. The local development steps in this article were tested with Java Development Kit (JDK) 17 [from the Microsoft build of OpenJDK](https://www.microsoft.com/openjdk).\n1. Install [Maven](https://maven.apache.org/download.cgi) 3.8.6 or later.\n1. Install [Azure CLI](/cli/azure/install-azure-cli) 2.40 or later.\n1. Clone the code for this demo application (todo-list) to your local system. The demo application is at [GitHub](https://github.com/Azure-Samples/jboss-on-aro-jakartaee).\n1. Follow the instructions in [Create an Azure Red Hat OpenShift 4 cluster](/azure/openshift/tutorial-create-cluster).\n\n   Though the \"Get a Red Hat pull secret\" step is labeled as optional, it's required for this article. The pull secret enables your Azure Red Hat OpenShift cluster to find the JBoss EAP application images.\n\n   If you plan to run memory-intensive applications on the cluster, specify the proper virtual machine size for the worker nodes using the `--worker-vm-size` parameter. For more information, see:\n\n   * [Azure CLI to create a cluster](/cli/azure/aro#az-aro-create)\n   * [Supported virtual machine sizes for memory optimized](/azure/openshift/support-policies-v4#memory-optimized)\n\n1. Connect to the cluster by following the steps in [Connect to an Azure Red Hat OpenShift 4 cluster](/azure/openshift/tutorial-connect-cluster).\n\n   * Follow the steps in \"Install the OpenShift CLI\"\n   * Connect to an Azure Red Hat OpenShift cluster using the OpenShift CLI with the user `kubeadmin`\n\n1. Execute the following command to create the OpenShift project for this demo application:\n\n   ```bash\n   oc new-project eap-demo\n   ```\n\n1. Execute the following command to add the view role to the default service account. This role is needed so the application can discover other pods and set up a cluster with them:\n\n   ```bash\n   oc policy add-role-to-user view system:serviceaccount:$(oc project -q):default -n $(oc project -q)\n   ```\n\n## Prepare the application\n\nClone the sample application using the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/jboss-on-aro-jakartaee\n```\n\nYou cloned the **Todo-list** demo application and your local repository is on the **main** branch. The demo application is a simple Java app that creates, reads, updates, and deletes records on Azure SQL. You can deploy this application as it is on a JBoss EAP server installed in your local machine. You just need to configure the server with the required database driver and data source. You also need a database server accessible from your local environment.\n\nHowever, when you're targeting OpenShift, you might want to trim the capabilities of your JBoss EAP server. For example, you might want to reduce the security exposure of the provisioned server and reduce the overall footprint. You might also want to include some MicroProfile specs to make your application more suitable for running on an OpenShift environment. When you use JBoss EAP, one way to accomplish this task is by packaging your application and your server in a single deployment unit known as a Bootable JAR. Let's do that by adding the required changes to our demo application.\n\nNavigate to your demo application local repository and change the branch to **bootable-jar**:\n\n```bash\n## cd jboss-on-aro-jakartaee\ngit checkout bootable-jar\n```\n\nLet's do a quick review of what we changed in this branch:\n\n* We added the `wildfly-jar-maven` plugin to provision the server and the application in a single executable JAR file. The OpenShift deployment unit is our server with our application.\n* On the Maven plugin, we specified a set of Galleon layers. This configuration enables us to trim the server capabilities to only what we need. For complete documentation on Galleon, see [the WildFly documentation](https://docs.wildfly.org/galleon/).\n* Our application uses Jakarta Faces with Ajax requests, which means that there's information stored in the HTTP session. We don't want to lose such information if a pod is removed. We could save this information on the client and send it back on each request. However, there are cases where you might decide not to distribute certain information to the clients. For this demo, we chose to replicate the session across all pod replicas. To do it, we added `<distributable />` to the **web.xml**. That, together with the server clustering capabilities, makes the HTTP session distributable across all pods.\n* We added two MicroProfile Health Checks that enable you to identify when the application is live and ready to receive requests.\n\n## Run the application locally\n\nBefore deploying the application on OpenShift, we're going to run it locally to verify how it works. The following steps assume you have Azure SQL running and available from your local environment.\n\nTo create the database, follow the steps in [Quickstart: Create an Azure SQL Database single database](/azure/azure-sql/database/single-database-create-quickstart?tabs=azure-portal), but use the following substitutions.\n\n* For **Resource group** use the resource group you created previously.\n* For **Database name** use `todos_db`.\n* For **Server admin login** use `azureuser`.\n* For **Password** use `Passw0rd!`.\n* In the **Firewall rules** section, toggle the **Allow Azure services and resources to access this server** to **Yes**.\n\nAll of the other settings can be safely used from the linked article.\n\nOn the **Additional settings** page, you don't have to choose the option to prepopulate the database with sample data, but there's no harm in doing so.\n\nAfter you create the database, get the value for the server name from the overview page. Hover the mouse over the value of the **Server name** field and select the copy icon that appears beside the value. Save this value aside for use later (we set a variable named `MSSQLSERVER_HOST` to this value).\n\n> [!NOTE]\n> To keep monetary costs low, the Quickstart directs the reader to select the serverless compute tier. This tier scales to zero when there's no activity. When this happens, the database isn't immediately responsive. If at any point when executing the steps in this article you observe database problems, consider disabling Auto-pause. To learn how, search for Auto-pause in [Azure SQL Database serverless](/azure/azure-sql/database/serverless-tier-overview). At the time of writing, the following Azure CLI command disables Auto-pause for the database configured in this article: `az sql db update --resource-group $RESOURCEGROUP --server <Server name, without the .database.windows.net part> --name todos_db --auto-pause-delay -1`\n\nFollow the next steps to build and run the application locally.\n\n1. Build the Bootable JAR. Because we're using the `eap-datasources-galleon-pack` with MS SQL Server database, we must specify the database driver version we want to use with this specific environment variable. For more information on the `eap-datasources-galleon-pack` and MS SQL Server, see the [documentation from Red Hat](https://github.com/jbossas/eap-datasources-galleon-pack/blob/main/doc/mssqlserver/README.md)\n\n   ```bash\n   export MSSQLSERVER_DRIVER_VERSION=7.4.1.jre11\n   mvn clean package\n   ```\n\n1. Launch the Bootable JAR by using the following commands.\n\n   You must ensure that the Azure SQL database permits network traffic from the host on which this server is running. Because you selected **Add current client IP address** when performing the steps in [Quickstart: Create an Azure SQL Database single database](/azure/azure-sql/database/single-database-create-quickstart), if the host on which the server is running is the same host from which your browser is connecting to the Azure portal, the network traffic should be permitted. If host on which the server is running is some other host, you need to refer to [Use the Azure portal to manage server-level IP firewall rules](/azure/azure-sql/database/firewall-configure?view=azuresql&preserve-view=true#use-the-azure-portal-to-manage-server-level-ip-firewall-rules).\n\n   When we're launching the application, we need to pass the required environment variables to configure the data source:\n\n   ```bash\n   export MSSQLSERVER_USER=azureuser\n   export MSSQLSERVER_PASSWORD='Passw0rd!'\n   export MSSQLSERVER_JNDI=java:/comp/env/jdbc/mssqlds\n   export MSSQLSERVER_DATABASE=todos_db\n   export MSSQLSERVER_HOST=<server name saved aside earlier>\n   export MSSQLSERVER_PORT=1433\n   mvn wildfly-jar:run\n   ```\n\n   [!INCLUDE [security-note](../includes/security-note.md)]\n\n   If you want to learn more about the underlying runtime used by this demo, the [Galleon Feature Pack for integrating datasources](https://github.com/jbossas/eap-datasources-galleon-pack/blob/main/doc/mssqlserver/README.md) documentation has a complete list of available environment variables. For details on the concept of feature-pack, see [the WildFly documentation](https://docs.wildfly.org/galleon/#_feature_packs).\n\n   If you receive an error with text similar to the following example:\n\n   ```output\n   Cannot open server '<your prefix>mysqlserver' requested by the login. Client with IP address 'XXX.XXX.XXX.XXX' is not allowed to access the server.\n   ```\n\n   This message indicates that your steps to ensure that the network traffic is permitted didn't work. Ensure the IP address from the error message is included in the firewall rules.\n\n   If you receive a message with text similar to the following example:\n\n   ```output\n   Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: There is already an object named 'TODOS' in the database.\n   ```\n\n   This message indicates the sample data is already in the database. You can ignore this message.\n\n1. (Optional) If you want to verify the clustering capabilities, you can also launch more instances of the same application by passing to the Bootable JAR the `jboss.node.name` argument and, to avoid conflicts with the port numbers, shifting the port numbers by using `jboss.socket.binding.port-offset`. For example, to launch a second instance that represents a new pod on OpenShift, you can execute the following command in a new terminal window:\n\n   ```bash\n   export MSSQLSERVER_USER=azureuser\n   export MSSQLSERVER_PASSWORD='Passw0rd!'\n   export MSSQLSERVER_JNDI=java:/comp/env/jdbc/mssqlds\n   export MSSQLSERVER_DATABASE=todos_db\n   export MSSQLSERVER_HOST=<server name saved aside earlier>\n   export MSSQLSERVER_PORT=1433\n   mvn wildfly-jar:run -Dwildfly.bootable.arguments=\"-Djboss.node.name=node2 -Djboss.socket.binding.port-offset=1000\"\n   ```\n\n   [!INCLUDE [security-note](../includes/security-note.md)]\n\n   If your cluster is working, you can see on the server console log a trace similar to the following one:\n\n   ```output\n   INFO  [org.infinispan.CLUSTER] (thread-6,ejb,node) ISPN000094: Received new cluster view for channel ejb\n   ```\n\n   > [!NOTE]\n   > By default the Bootable JAR configures the JGroups subsystem to use the UDP protocol and sends messages to discover other cluster members to the 230.0.0.4 multicast address. To properly verify the clustering capabilities on your local machine, your Operating System should be capable of sending and receiving multicast datagrams and route them to the 230.0.0.4 IP through your ethernet interface. If you see warnings related to the cluster on the server logs, check your network configuration and verify it supports multicast on that address.\n\n1. Open http://localhost:8080/ in your browser to visit the application home page. If you created more instances, you can access them by shifting the port number, for example http://localhost:9080/. The application should look similar to the following image:\n\n   :::image type=\"content\" source=\"media/jboss-eap-on-aro/todo-demo-application.png\" alt-text=\"Screenshot of ToDo EAP demo Application.\":::\n\n1. Check the liveness and readiness probes for the application. OpenShift uses these endpoints to verify when your pod is live and ready to receive user requests.\n\n   To check the status of liveness, run:\n\n   ```bash\n   curl http://localhost:9990/health/live\n   ```\n\n   You should see this output:\n\n   ```json\n   {\"status\":\"UP\",\"checks\":[{\"name\":\"SuccessfulCheck\",\"status\":\"UP\"}]}\n   ```\n\n   To check the status of readiness, run:\n\n   ```bash\n   curl http://localhost:9990/health/ready\n   ```\n\n   You should see this output:\n\n   ```json\n    {\"status\":\"UP\",\"checks\":[{\"name\":\"deployments-status\",\"status\":\"UP\",\"data\":{\"todo-list.war\":\"OK\"}},{\"name\":\"server-state\",\"status\":\"UP\",\"data\":{\"value\":\"running\"}},{\"name\":\"boot-errors\",\"status\":\"UP\"},{\"name\":\"DBConnectionHealthCheck\",\"status\":\"UP\"}]}\n   ```\n\n1. Press <kbd>Ctrl</kbd>+<kbd>C</kbd> to stop the application.\n\n## Deploy to OpenShift\n\nTo deploy the application, we're going to use the JBoss EAP Helm Charts already available in Azure Red Hat OpenShift. We also need to supply the desired configuration, for example, the database user, the database password, the driver version we want to use, and the connection information used by the data source. The following steps assume you have Azure SQL running and accessible from your OpenShift cluster, and you stored the database user name, password, hostname, port, and database name in an OpenShift [OpenShift Secret object](https://docs.openshift.com/container-platform/4.8/nodes/pods/nodes-pods-secrets.html#nodes-pods-secrets-about_nodes-pods-secrets) named `mssqlserver-secret`.\n\nNavigate to your demo application local repository and change the current branch to **bootable-jar-openshift**:\n\n```bash\ngit checkout bootable-jar-openshift\n```\n\nLet's do a quick review about what we changed in this branch:\n\n* We added a new Maven profile named `bootable-jar-openshift` that prepares the Bootable JAR with a specific configuration for running the server on the cloud. For example, it enables the JGroups subsystem to use network requests to discover other pods by using the KUBE_PING protocol.\n* We added a set of configuration files in the **jboss-on-aro-jakartaee/deployment** directory. In this directory, you can find the configuration files to deploy the application.\n\n### Deploy the application on OpenShift\n\nThe next steps explain how you can deploy the application with a Helm chart using the OpenShift web console. Avoid hard coding sensitive values into your Helm chart using a feature called \"secrets\". A secret is simply a collection of name-value pairs, where the values are specified in some known place before they're needed. In our case, the Helm chart uses two secrets, with the following name-value pairs from each.\n\n* `mssqlserver-secret`\n\n  * `db-host` conveys the value of `MSSQLSERVER_HOST`.\n  * `db-name` conveys the value of `MSSQLSERVER_DATABASE`\n  * `db-password` conveys the value of `MSSQLSERVER_PASSWORD`\n  * `db-port` conveys the value of `MSSQLSERVER_PORT`.\n  * `db-user` conveys the value of `MSSQLSERVER_USER`.\n\n* `todo-list-secret`\n\n  * `app-cluster-password` conveys an arbitrary, user-specified password so that cluster nodes can form more securely.\n  * `app-driver-version` conveys the value of `MSSQLSERVER_DRIVER_VERSION`.\n  * `app-ds-jndi` conveys the value of `MSSQLSERVER_JNDI`.\n\n1. Create `mssqlserver-secret`.\n\n   ```bash\n   oc create secret generic mssqlserver-secret \\\n       --from-literal db-host=${MSSQLSERVER_HOST} \\\n       --from-literal db-name=${MSSQLSERVER_DATABASE} \\\n       --from-literal db-password=${MSSQLSERVER_PASSWORD} \\\n       --from-literal db-port=${MSSQLSERVER_PORT} \\\n       --from-literal db-user=${MSSQLSERVER_USER}\n   ```\n\n1. Create `todo-list-secret`.\n\n   ```bash\n   export MSSQLSERVER_DRIVER_VERSION=7.4.1.jre11\n   oc create secret generic todo-list-secret \\\n       --from-literal app-cluster-password=mut2UTG6gDwNDcVW \\\n       --from-literal app-driver-version=${MSSQLSERVER_DRIVER_VERSION} \\\n       --from-literal app-ds-jndi=${MSSQLSERVER_JNDI}\n   ```\n\n   [!INCLUDE [security-note](../includes/security-note.md)]\n\n1. Open the OpenShift console and navigate to the developer view. You can discover the console URL for your OpenShift cluster by running this command. Sign in with the `kubeadmin` userid and password you obtained from a preceding step.\n\n   ```bash\n   az aro show \\\n       --name $CLUSTER \\\n       --resource-group $RESOURCEGROUP \\\n       --query \"consoleProfile.url\" \\\n       --output tsv\n   ```\n\n   Select the **</> Developer** perspective from the drop-down menu at the top of the navigation pane.\n\n   :::image type=\"content\" source=\"media/jboss-eap-on-aro/console-developer-view.png\" alt-text=\"Screenshot of OpenShift console developer view.\":::\n\n1. In the **</> Developer** perspective, select the **eap-demo** project from the **Project** drop-down menu.\n\n   :::image type=\"content\" source=\"media/jboss-eap-on-aro/console-project-combo-box.png\" alt-text=\"Screenshot of OpenShift console project combo box.\":::\n\n1. Select **+Add**. In the **Developer Catalog** section, select **Helm Chart**. You arrive at the Helm Chart catalog available on your Azure Red Hat OpenShift cluster. In the **Filter by keyword** box, type **eap**. You should see several options, as shown here:\n\n   :::image type=\"content\" source=\"media/jboss-eap-on-aro/console-eap-helm-charts.png\" alt-text=\"Screenshot of OpenShift console EAP Helm Charts.\":::\n\n   Because our application uses MicroProfile capabilities, we select the Helm Chart for EAP Xp. The \"Xp\" stands for Expansion Pack. With the JBoss Enterprise Application Platform expansion pack, developers can use Eclipse MicroProfile application programming interfaces (APIs) to build and deploy microservices-based applications.\n\n1. Select the **JBoss EAP XP 4** Helm Chart, and then select **Install Helm Chart**.\n\nAt this point, we need to configure the chart to build and deploy the application:\n\n1. Change the name of the release to **eap-todo-list-demo**.\n1. We can configure the Helm Chart either using a **Form View** or a **YAML View**. In the section labeled **Configure via**, select **YAML View**.\n1. Change the YAML content to configure the Helm Chart by copying and pasting the content of the Helm Chart file available at **deployment/application/todo-list-helm-chart.yaml** instead of the existing content:\n\n   :::image type=\"content\" source=\"media/jboss-eap-on-aro/console-eap-helm-charts-yaml-content-inline.png\" alt-text=\"OpenShift console EAP Helm Chart YAML content\" lightbox=\"media/jboss-eap-on-aro/console-eap-helm-charts-yaml-content-inline.png\":::\n\n   This content makes references to the secrets you set earlier.\n\n1. Finally, select **Install** to start the application deployment. This action opens the **Topology** view with a graphical representation of the Helm release (named **eap-todo-list-demo**) and its associated resources.\n\n   :::image type=\"content\" source=\"media/jboss-eap-on-aro/console-topology.png\" alt-text=\"Screenshot of OpenShift console topology.\":::\n\n   The Helm Release (abbreviated **HR**) is named **eap-todo-list-demo**. It includes a Deployment resource (abbreviated **D**) also named **eap-todo-list-demo**.\n\n   If you select the icon with two arrows in a circle at the lower left of the **D** box, you're taken to the **Logs** pane. Here you can observe the progress of the build. To return to the topology view, select **Topology** in the left navigation pane.\n\n1. When the build is finished, the bottom-left icon displays a green check.\n\n1. When the deployment is completed, the circle outline is dark blue. If you hover the mouse over the dark blue, you should see a message appear stating something similar to `3 Running`. When you see that message, you can go to application the URL (using the top-right icon) from the route associated with the deployment.\n\n   :::image type=\"content\" source=\"media/jboss-eap-on-aro/console-open-application.png\" alt-text=\"Screenshot of OpenShift console open application.\":::\n\n1. The application is opened in your browser looking similar to the following image ready to be used:\n\n   :::image type=\"content\" source=\"media/jboss-eap-on-aro/application-running-openshift.png\" alt-text=\"Screenshot of OpenShift application running.\":::\n\n1. The application shows you the name of the pod that serves the information. To verify the clustering capabilities, you could add some **Todo** items. Then, delete the pod with the name indicated in the **Server Host Name** field that appears on the application by using `oc delete pod <pod-name>`. After deleting the pod, create a new Todo on the same application window. You can see that the new **Todo** is added via an Ajax request and the **Server Host Name** field now shows a different name. Behind the scenes, the OpenShift load balancer dispatched the new request and delivered it to an available pod. The Jakarta Faces view is restored from the HTTP session copy stored in the pod that's processing the request. Indeed, you can see that the **Session ID** field didn't change. If the session isn't replicated across your pods, you get a Jakarta Faces `ViewExpiredException`, and your application doesn't work as expected.\n\n## Clean up resources\n\n### Delete the application\n\nIf you only want to delete your application, you can open the OpenShift console and, at the developer view, navigate to the **Helm** menu option. On this menu, you can see all the Helm Chart releases installed on your cluster.\n\n   :::image type=\"content\" source=\"media/jboss-eap-on-aro/console-uninstall-application-inline.png\" alt-text=\"OpenShift uninstall application\" lightbox=\"media/jboss-eap-on-aro/console-uninstall-application-inline.png\":::\n\nLocate the **eap-todo-list-demo** Helm Chart. At the end of the row, select the tree vertical dots to open the action contextual menu entry.\n\nSelect **Uninstall Helm Release** to remove the application. Notice that the secret object used to supply the application configuration isn't part of the chart. You need to remove it separately if you no longer need it.\n\nExecute the following command if you want to delete the secret that holds the application configuration:\n\n```bash\n$ oc delete secrets/todo-list-secret\n# secret \"todo-list-secret\" deleted\n```\n\n### Delete the OpenShift project\n\nYou can also delete all the configuration created for this demo by deleting the `eap-demo` project. To do so, execute the following command:\n\n```bash\n$ oc delete project eap-demo\n# project.project.openshift.io \"eap-demo\" deleted\n```\n\n### Delete the Azure Red Hat OpenShift cluster\n\nDelete the Azure Red Hat OpenShift cluster by following the steps in [Tutorial: Delete an Azure Red Hat OpenShift 4 cluster](/azure/openshift/tutorial-delete-cluster).\n\n### Delete the resource group\n\nIf you want to delete all of the resources created by the preceding steps, delete the resource group you created for the Azure Red Hat OpenShift cluster.\n\n## Next steps\n\nYou can learn more from references used in this guide:\n\n* [Red Hat JBoss Enterprise Application Platform](https://www.redhat.com/en/technologies/jboss-middleware/application-platform)\n* [Using JBoss EAP on OpenShift Container Platform](https://docs.redhat.com/en/documentation/red_hat_jboss_enterprise_application_platform/8.0/html/using_jboss_eap_on_openshift_container_platform/index)\n* [Azure Red Hat OpenShift](https://azure.microsoft.com/services/openshift/)\n* [JBoss EAP Helm Charts](https://jbossas.github.io/eap-charts/)\n* [JBoss EAP Bootable JAR](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html-single/using_jboss_eap_xp_3.0.0/index#the-bootable-jar_default)\n\nContinue to explore options to run JBoss EAP on Azure.\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about JBoss EAP on Azure](jboss-on-azure.md)\n"
  },
  {
    "path": "articles/java/ee/jboss-on-azure.md",
    "content": "---\ntitle: JBoss EAP on Azure\ndescription: An overview of the different JBoss EAP solutions on Azure, all jointly developed and supported by Red Hat and Microsoft.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.topic: overview\nms.date: 03/26/2026\nms.custom: template-overview, devx-track-java, devx-track-javaee, devx-track-javaee-jbosseap, devx-track-extended-java, linux-related-content\n---\n\n# JBoss EAP on Azure\n\nThis article describes the available solutions for hosting Red Hat JBoss Enterprise Application Platform (EAP) on Azure, including the features and benefits of each option so you can choose the best one for your deployment.\n\nThere are three hosting options for JBoss EAP on Azure: App Service, Azure Red Hat OpenShift, and Azure Virtual Machines (VMs). Red Hat and Microsoft jointly develop and support all three solutions. When you open a support case on the Azure portal about your JBoss EAP applications, Azure support automatically contacts Red Hat technical support when necessary.\n\nIf you're interested in providing feedback or working closely on your migration scenarios with the engineering team developing JBoss EAP on Azure solutions, fill out this short [survey on JBoss EAP migration](https://aka.ms/jboss-on-azure-survey) and include your contact information. Our team of program managers, architects, and engineers promptly get in touch with you to initiate close collaboration.\n\n## JBoss EAP on Azure App Service\n\nAzure App Service is a fully managed platform for web applications, with built-in infrastructure maintenance, security, patching, and scaling. You can use your favorite development tools like Visual Studio Code, deploy rapidly with Maven and GitHub Actions, or monitor your applications with Application Insights. For more information, see [Azure App Service overview](/azure/app-service/overview).\n\nJBoss EAP is available on different App Service Linux plans - including the Free Tier. For more information about App Service Linux plans, see [Azure App Service Pricing](https://azure.microsoft.com/pricing/details/app-service/linux/). JBoss EAP clustering is fully supported on the Isolated plans. All Red Hat supported versions of JBoss EAP are available on App Service including 8.0 and 7.4. As new versions of JBoss EAP are released, they're offered on App Service as part of regular platform upgrades. For a full list available versions, go to your JBoss EAP web application in the Azure portal, then select **Settings** > **Configuration** > **General Settings** > **Java Web Server Version**. JBoss EAP commercial support is built into App Service. JBoss EAP pricing information is available on the [Azure App Service Pricing](https://azure.microsoft.com/pricing/details/app-service/linux/#jboss) page.\n\n<br/>\n\n> [!VIDEO https://www.youtube.com/embed/8b_Wiuw8l-8]\n\n## JBoss EAP on Azure Red Hat OpenShift\n\nAzure Red Hat OpenShift provides highly available, fully managed OpenShift clusters on demand, monitored and operated jointly by Microsoft and Red Hat. If you're already using or planning to adopt containers/Kubernetes, deploying JBoss EAP on Azure Red Hat OpenShift is a compelling option. Red Hat and Microsoft provide a marketplace solution template that automates common boilerplate provisioning tasks to deploy JBoss EAP on Azure Red Hat OpenShift. The solution can automatically provision the following resources:\n\n* An Azure Red Hat OpenShift cluster. Alternatively, you can deploy to an existing cluster.\n* A JBoss EAP Operator.\n* Optionally, a sample getting started application.\n* Optionally, a custom application deployment using Source-to-Image (S2I).\n* A virtual network and subnet.\n\nYou can launch the solution [JBoss EAP on Azure Red Hat OpenShift](https://aka.ms/eap-aro-portal) from the Azure portal (just click on the link).\n\nAs an alternative to the solution template, Red Hat and Microsoft also provide a detailed step-by-step guide on how to deploy JBoss EAP on Azure Red Hat OpenShift. For more information, see [Deploy a Java application with Red Hat JBoss Enterprise Application Platform (JBoss EAP) on an Azure Red Hat OpenShift 4 cluster](jboss-eap-on-aro.md).\n\n## JBoss EAP on Azure Virtual Machines\n\nVirtual machines are a mature, proven migration path to the cloud that provides maximum flexibility and control. These factors are especially important for mission-critical workloads most suited to lift-and-shift migration. Microsoft and Red Hat provide robust options for migrating JBoss EAP workloads to Azure Virtual Machines. There are two solution templates that you can launch from the Azure portal to match your use case (just click on the links):\n\n- A [single JBoss EAP instance on an Azure Virtual Machine](https://aka.ms/eap-vm-single-portal).\n- A [JBoss EAP cluster on Azure Virtual Machines](https://aka.ms/eap-vm-cluster-portal).\n\nThe solution templates help accelerate migrating workloads. They can automatically provision the following resources:\n\n* Red Hat Enterprise Linux (RHEL) VMs\n* JBoss EAP standalone or cluster\n* JBoss EAP management console\n* Red Hat build of OpenJDK\n* Data source connection (optional)\n* Domain mode enabled (optional)\n* Virtual network and subnet\n* Network security group\n* Azure App Gateway with public IP address (if applicable)\n* Storage account for setting up Azure ping protocol for JGroups usage (if applicable)\n* Storage account for sharing configuration files between VMs (if applicable)\n\nThe solutions support various versions of JBoss EAP, OpenJDK, and RHEL such as JBoss EAP 8 with OpenJDK 17 on RHEL 9. They can work on a bring-your-own-subscription or pay-as-you-go basis. To use bring-your-own-subscription, you must [contact Red Hat](https://www.redhat.com/en/technologies/cloud-computing/cloud-access) to get your subscription enabled on Azure. After you do so, the bring-your-own-subscription options become visible as plans.\n\nIn addition to the solution templates, Red Hat and Microsoft also publish basic Virtual Machine images for JBoss EAP in Azure Marketplace. The images represent certified, supported, up-to-date, and secure JBoss EAP, OpenJDK, and RHEL combinations. The images are available on a pay-as-you-go basis only. For customers that need even more flexibility and control, Red Hat and Microsoft provide a [detailed step-by-step guide](/azure/developer/java/migration/migrate-jboss-eap-to-azure-vm-manually) on how to deploy JBoss EAP on Azure Virtual Machines.\n\n## Next steps\n\nThe following articles provide more information on getting started with these technologies.\n\n- [Quickstart: Create a Java app on Azure App Service](/azure/app-service/quickstart-java?tabs=javase&pivots=platform-linux)\n- [Quickstart: Deploy a Java application with JBoss EAP on Azure Red Hat OpenShift](/azure/openshift/howto-deploy-java-jboss-enterprise-application-platform-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n- [Quickstart: Deploy a JBoss EAP cluster on Azure Virtual Machines (VMs)](/azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n"
  },
  {
    "path": "articles/java/ee/liberty-on-aro.md",
    "content": "---\ntitle: Manually Deploy a Java Application with Open Liberty/WebSphere Liberty on an Azure Red Hat OpenShift Cluster\ndescription: Shows you how to deploy a Java application with Open Liberty/WebSphere Liberty on an Azure Red Hat OpenShift cluster.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.topic: install-set-up-deploy\nms.date: 03/26/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-liberty\n  - devx-track-javaee-liberty-aro\n  - devx-track-javaee-websphere\n  - devx-track-extended-java\n  - linux-related-content\n  - sfi-image-nochange\n---\n\n# Manually deploy a Java application with Open Liberty/WebSphere Liberty on an Azure Red Hat OpenShift cluster\n\nThis article provides step-by-step manual guidance for running Open/WebSphere Liberty on an Azure Red Hat OpenShift cluster. It walks you through preparing a Liberty application, building the application Docker image, and running the containerized application on an Azure Red Hat OpenShift cluster.\n\nSpecifically, you learn how to accomplish the following tasks:\n\n> [!div class=\"checklist\"]\n>\n> - Prepare the Liberty application\n> - Build the application image\n> - Run the containerized application on an Azure Red Hat OpenShift cluster using the GUI and the CLI\n\nFor a more automated solution that accelerates your journey to Azure Red Hat OpenShift, see [Deploy IBM WebSphere Liberty and Open Liberty on Azure Red Hat OpenShift](/azure/openshift/howto-deploy-java-liberty-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json).\n\nFor more information on Open Liberty, see [the Open Liberty project page](https://openliberty.io/). For more information on WebSphere Liberty, see [the WebSphere Liberty product page](https://www.ibm.com/cloud/websphere-liberty).\n\nThis article is intended to help you quickly get to deployment. Before going to production, you should explore [Tuning Liberty](https://www.ibm.com/docs/was-liberty/base?topic=tuning-liberty).\n\nIf you're interested in providing feedback or working closely on your migration scenarios with the engineering team developing WebSphere on Azure solutions, fill out this short [survey on WebSphere migration](https://aka.ms/websphere-on-azure-survey) and include your contact information. The team of program managers, architects, and engineers will promptly get in touch with you to initiate close collaboration.\n\n[!INCLUDE [aro-support](includes/aro-support.md)]\n[!INCLUDE [aro-quota](includes/aro-quota.md)]\n\n## Prerequisites\n\n- A local machine with Unix-like operating system installed - for example, Ubuntu, macOS, or Windows Subsystem for Linux.\n- A Java Standard Edition (SE) implementation, version 17 - for example, [Eclipse Open J9](https://www.eclipse.org/openj9/).\n- [Maven](https://maven.apache.org/download.cgi), version 3.9.8 or higher.\n- [Docker](https://docs.docker.com/get-docker/) for your OS.\n- [Azure CLI](/cli/azure/install-azure-cli), version 2.61.0 or later.\n- An Azure Red Hat OpenShift 4 cluster. To create the cluster, follow the instructions in [Create an Azure Red Hat OpenShift 4 cluster](/azure/openshift/tutorial-create-cluster), while paying attention to the following differences:\n\n  - Though instructions related to pull secrets are labeled optional, the pull secret is required for this article, especially for cluster creation. The pull secret enables your Azure Red Hat OpenShift cluster to find the Open Liberty Operator.\n  - This article uses Azure MySQL as the demo database. Azure MySQL SKUs aren't available in all regions, so you should pick an Azure region that works, such as `westus`. You can check whether a given Azure region has available MySQL SKUs by using the following command:\n\n    ```azurecli\n    az mysql flexible-server list-skus --location <location>\n    ```\n\n  - The following environment variables defined in [Create an Azure Red Hat OpenShift 4 cluster](/azure/openshift/tutorial-create-cluster) are used later in this article:\n\n    - `RESOURCEGROUP` - the name of the resource group in which the cluster is deployed.\n    - `CLUSTER`- the name of the cluster.\n\n  - If you plan to run memory-intensive applications on the cluster, specify the proper virtual machine size for the worker nodes using the `--worker-vm-size` parameter. For more information, see the following articles:\n\n    - [Azure CLI to create a cluster](/cli/azure/aro#az-aro-create)\n    - [Supported virtual machine sizes for memory optimized](/azure/openshift/support-policies-v4#memory-optimized)\n\n- Connect to the cluster by following the steps in [Connect to an Azure Red Hat OpenShift 4 cluster](/azure/openshift/tutorial-connect-cluster) while using the following instructions:\n\n  - Be sure to follow the steps in \"Install the OpenShift CLI\" because you use the `oc` command later in this article.\n  - Save aside the cluster console URL. It should look like `https://console-openshift-console.apps.<random>.<region>.aroapp.io/`.\n  - Take note of the `kubeadmin` credentials.\n  - Be sure to follow the steps in \"Connect using the OpenShift CLI\" with the `kubeadmin` credentials.\n\n### Install the Open Liberty Operator\n\nAfter you create and connect to the cluster, use the following steps to install the Open Liberty Operator. The main starting page for the Open Liberty Operator is on [GitHub](https://github.com/OpenLiberty/open-liberty-operator).\n\n1. Sign in to the OpenShift web console from your browser using the `kubeadmin` credentials.\n1. Navigate to **Operators** > **OperatorHub** and search for **Open Liberty**.\n1. Select **Open Liberty** from the search results.\n1. Select **Install**.\n1. On the **Install Operator** page, use the following steps:\n   1. For **Update channel**, select the latest channel **v1.4**.\n   1. For **Installation mode**, select **All namespaces on the cluster (default)**.\n   1. For **Update approval**, select **Automatic**.\n\n   :::image type=\"content\" source=\"media/liberty-on-aro/install-operator.png\" alt-text=\"Screenshot of the OpenShift web console that shows the Install Operator page.\" lightbox=\"media/liberty-on-aro/install-operator.png\":::\n\n1. Select **Install** and wait a few minutes until the installation completes.\n1. Observe that the Open Liberty Operator is successfully installed and ready for use. If it isn't ready, diagnose and resolve the problem before continuing.\n\n   :::image type=\"content\" source=\"media/liberty-on-aro/open-liberty-operator-installed.png\" alt-text=\"Screenshot of the OpenShift web console that shows the Installed operator dialog box.\" lightbox=\"media/liberty-on-aro/open-liberty-operator-installed.png\":::\n\n> [!NOTE]\n> This guide installs the Open Liberty Operator to manage Liberty applications on the Azure Red Hat OpenShift cluster. If you want to use the WebSphere Liberty Operator, follow the steps in [Installing the WebSphere Liberty operator](https://www.ibm.com/docs/was-liberty/nd?topic=operator-installing-websphere-liberty) to install the WebSphere Liberty Operator on the cluster.\n\n### Create an OpenShift namespace for the Java app\n\nUse the following steps to create an OpenShift namespace for use with your app:\n\n1. Make sure you signed in to the OpenShift web console from your browser using the `kubeadmin` credentials.\n1. Navigate to **Administration** > **Namespaces** > **Create Namespace**.\n1. For **Name**, fill in **open-liberty-demo**, and then select **Create**, as shown in the following screenshot.\n\n   :::image type=\"content\" source=\"media/liberty-on-aro/create-namespace.png\" alt-text=\"Screenshot of the OpenShift web console that shows the Create Namespace dialog box.\" lightbox=\"media/liberty-on-aro/create-namespace.png\":::\n\n### Create an Azure Database for MySQL Flexible Server\n\nAzure Database for MySQL Flexible Server deployment model is a deployment mode designed to provide more granular control and flexibility over database management functions and configuration settings than the Azure Database for MySQL single server deployment mode. This section shows you how to create an Azure Database for MySQL Flexible Server instance using the Azure CLI. For more information, see [Quickstart: Create an instance of Azure Database for MySQL - Flexible Server by using the Azure CLI](/azure/mysql/flexible-server/quickstart-create-server-cli).\n\nUse the following command in your terminal to create an Azure Database for MySQL Flexible Server instance. Replace `<location>` with the Azure region that has available SKUs in which you want to create the server - for example, `westus`. Replace `<server-admin-password>` with a password that meets the password complexity requirements for Azure Database for MySQL Flexible Server.\n\n```azurecli\nexport LOCATION=<location>\nexport ADMIN_PASSWORD='<server-admin-password>'\nexport ADMIN_USER=adminuser\nexport DATABASE_NAME=${RESOURCEGROUP}db\naz mysql flexible-server create \\\n    --name ${CLUSTER} \\\n    --resource-group ${RESOURCEGROUP} \\\n    --location $LOCATION \\\n    --admin-user $ADMIN_USER \\\n    --admin-password $ADMIN_PASSWORD \\\n    --database-name $DATABASE_NAME \\\n    --public-access 0.0.0.0 \\\n    --yes\n```\n\n> [!NOTE]\n> This article guides you to create an Azure Database for MySQL Flexible Server with MySQL authentication. A more secure practice is to use [Microsoft Entra authentication](/azure/mysql/flexible-server/concepts-azure-ad-authentication) for authenticating the database server connection. Azure Red Hat OpenShift doesn't currently support [Microsoft Entra Workload ID](/entra/workload-id/workload-identities-overview), so MySQL authentication is the only available option.\n>\n> If you receive an error message `No available SKUs in this location`, specify a different location using the `--location` parameter and try again. Use the following command to list available SKUs in a specific location:\n>\n> ```azurecli\n> az mysql flexible-server list-skus --location <location>\n> ```\n>\n> Find a location that has available SKUs and then repeat the preceding `az mysql flexible-server create` command.\n\nIt takes a few minutes to create the server, database, admin user, and firewall rule that accepts connections from all Azure resources. If the command is successful, the output looks similar to the following example:\n\n```output\n{\n  \"connectionString\": \"mysql <database-name> --host <server-name>.mysql.database.azure.com --user <server-admin-username> --password=<server-admin-password>\",\n  \"databaseName\": \"<database-name>\",\n  \"firewallName\": \"<firewall-name>\",\n  \"host\": \"<server-name>.mysql.database.azure.com\",\n  \"id\": \"/subscriptions/REDACTED/resourceGroups/<resource-group-of-the-OpenShift-cluster>/providers/Microsoft.DBforMySQL/flexibleServers/<server-name>\",\n  \"location\": \"<location>\",\n  \"password\": \"<server-admin-password>\",\n  \"resourceGroup\": \"<resource-group-of-the-OpenShift-cluster>\",\n  \"skuname\": \"Standard_B1ms\",\n  \"username\": \"<server-admin-username>\",\n  \"version\": \"8.0.21\"\n}\n```\n\n## Prepare the Liberty application\n\nWe use a Jakarta EE 10 application as our example in this guide. Open Liberty is Jakarta EE 10 full profile compatible. For more information, see the [Jakarta EE Platform API](https://jakarta.ee/specifications/platform/10/apidocs/).\n\n### Run the application on Open Liberty\n\nTo run the application on Open Liberty, you need to create an Open Liberty server configuration file so that the [Liberty Maven plugin](https://github.com/OpenLiberty/ci.maven#liberty-maven-plugin) can package the application for deployment. The Liberty Maven plugin isn't required to deploy the application to OpenShift. However, we use it in this example with Open Liberty's developer (dev) mode. Developer mode lets you easily run the application locally. To learn more about the `liberty-maven-plugin`, see [Building a web application with Maven](https://openliberty.io/guides/maven-intro.html).\n\nFollow the steps in this section to prepare the sample application for later use in this article.\n\n#### Check out the application\n\nUse the following commands to clone the sample code for this guide. The sample is on [GitHub](https://github.com/Azure-Samples/open-liberty-on-aro).\n\n```bash\ngit clone https://github.com/Azure-Samples/open-liberty-on-aro.git\ncd open-liberty-on-aro\nexport BASE_DIR=$PWD\ngit checkout 20250429\ncd ${BASE_DIR}/3-integration/connect-db/mysql\n```\n\nIf you see a message about being in `detached HEAD` state, this message is safe to ignore. It just means you checked out a tag.\n\nThere are a few samples in the repository. We use **open-liberty-on-aro/3-integration/connect-db/mysql**. Here's the file structure of the application:\n\n```\nopen-liberty-on-aro/3-integration/connect-db/mysql\n├─ src/main/\n│  ├─ aro/\n│  │  ├─ db-secret.yaml\n│  │  ├─ openlibertyapplication.yaml\n│  ├─ liberty/config/\n│  │  ├─ server.xml\n│  ├─ java/\n│  ├─ resources/\n│  ├─ webapp/\n├─ Dockerfile\n├─ Dockerfile-wlp\n├─ pom.xml\n```\n\nThe directories **java**, **resources**, and **webapp** contain the source code of the sample application. The code declares and uses a data source named `jdbc/JavaEECafeDB`.\n\nIn the **aro** directory, we placed two deployment files. **db-secret.xml** is used to create [Secrets](https://docs.openshift.com/container-platform/4.6/nodes/pods/nodes-pods-secrets.html) with database connection credentials. The file **openlibertyapplication.yaml** is used to deploy the application image.\n\nIn the root directory, we placed two Dockerfiles. **Dockerfile** and **Dockerfile-wlp** are used for local debugging and to build the image for an Azure Red Hat OpenShift deployment, working with Open Liberty and WebSphere Liberty, respectively.\n\nIn the **liberty/config** directory, the **server.xml** is used to configure the database connection for the Open Liberty and WebSphere Liberty cluster.\n\n#### Build the project\n\nUsing the environment variables defined previously, run the following commands in your terminal to build the project. The POM file for the project reads many properties from the environment.\n\n```bash\ncd ${BASE_DIR}/3-integration/connect-db/mysql\n\n# The following variables are used for deployment file generation\nexport DB_SERVER_NAME=$CLUSTER.mysql.database.azure.com\nexport DB_PORT_NUMBER=3306\nexport DB_NAME=$DATABASE_NAME\nexport DB_USER=$ADMIN_USER\nexport DB_PASSWORD=$ADMIN_PASSWORD\nexport NAMESPACE=open-liberty-demo\n\nmvn clean install\n```\n\n#### (Optional) Test your application locally\n\nOptionally, you can run the application locally to verify that it works as expected. First, you need to add a firewall rule to allow your local machine to connect to the Azure Database for MySQL Flexible Server instance. Use the following steps to add the firewall rule:\n\n1. Sign in to the Azure portal and navigate to the Azure Database for MySQL Flexible Server instance you created earlier.\n1. In the left pane, select **Settings** > **Networking**.\n1. Select **Add current client IP address**.\n1. Select **Save** and wait for the firewall rule to be added.\n\nUse the following steps to run the `liberty:devc` command to locally run and test the project and container image before dealing with any Azure complexity. For more information on `liberty:devc`, see the [Liberty Plugin documentation](https://github.com/OpenLiberty/ci.maven/blob/main/docs/dev.md#devc-container-mode).\n\n1. Start your local Docker environment if needed. The instructions for starting the environment vary depending on the host operating system.\n\n1. Use the following commands to start the application in `liberty:devc` mode:\n\n   ```bash\n   cd ${BASE_DIR}/3-integration/connect-db/mysql\n\n   # If you are running with Open Liberty\n   mvn liberty:devc -DcontainerRunOpts=\"-e DB_SERVER_NAME=${DB_SERVER_NAME} -e DB_PORT_NUMBER=${DB_PORT_NUMBER} -e DB_NAME=${DB_NAME} -e DB_USER=${DB_USER} -e DB_PASSWORD=${DB_PASSWORD}\" -Dcontainerfile=Dockerfile\n\n   # If you are running with WebSphere Liberty\n   mvn liberty:devc -DcontainerRunOpts=\"-e DB_SERVER_NAME=${DB_SERVER_NAME} -e DB_PORT_NUMBER=${DB_PORT_NUMBER} -e DB_NAME=${DB_NAME} -e DB_USER=${DB_USER} -e DB_PASSWORD=${DB_PASSWORD}\" -Dcontainerfile=Dockerfile-wlp\n   ```\n\n1. Verify the application works as expected. You should see a message similar to `[INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds.` in the command output if successful. Go to `https://localhost:9443/` in your browser and verify the application is accessible and all functions are working.\n\n1. To stop `liberty:devc` mode, press <kbd>Control</kbd>+<kbd>C</kbd>.\n\n## Prepare the application image\n\nTo deploy and run your Liberty application on an Azure Red Hat OpenShift cluster, containerize your application as a Docker image using [Open Liberty container images](https://github.com/OpenLiberty/ci.docker) or [WebSphere Liberty container images](https://www.ibm.com/docs/was-liberty/base?topic=images-liberty-container#cntr_r_images__wlicr__title__1).\n\n### Build the application and push to the image stream\n\nSince you already successfully ran the app in the Liberty Docker container using the `liberty:devc` command, you're going to build the image remotely on the cluster by using the following steps:\n\n1. Make sure you sign in to the OpenShift CLI using the `kubeadmin` credentials.\n1. Use the following commands to identify the source directory and Dockerfile:\n\n   ```bash\n   cd ${BASE_DIR}/3-integration/connect-db/mysql\n\n   # If you are building with the Open Liberty base image, the existing Dockerfile is ready for you\n\n   # If you are building with the WebSphere Liberty base image, uncomment and execute the following two commands to rename Dockerfile-wlp to Dockerfile\n   # mv Dockerfile Dockerfile.backup\n   # mv Dockerfile-wlp Dockerfile\n   ```\n\n1. Use the following command to change the project to `open-liberty-demo`:\n\n   ```bash\n   oc project $NAMESPACE\n   ```\n\n1. Use the following command to create an image stream:\n\n   ```bash\n   oc create imagestream javaee-cafe-mysql\n   ```\n\n1. Use the following command to create a build configuration that specifies the image stream tag of the build output:\n\n   ```bash\n   oc new-build --name javaee-cafe-mysql-config --binary --strategy docker --to javaee-cafe-mysql:v1\n   ```\n\n1. Use the following command to start the build to upload local contents, containerize, and output to the image stream tag specified before:\n\n   ```bash\n   oc start-build javaee-cafe-mysql-config --from-dir . --follow\n   ```\n\n## Deploy application on the Azure Red Hat OpenShift cluster\n\nNow you can deploy the sample Liberty application to the Azure Red Hat OpenShift cluster you created earlier when working through the prerequisites.\n\n### [Web console](#tab/deploy-console)\n\n### Deploy the application from the web console\n\nBecause we use the Open Liberty Operator to manage Liberty applications, we need to create an instance of its Custom Resource Definition, of type `OpenLibertyApplication`. The Operator takes care of all aspects of managing the OpenShift resources required for deployment. Use the following steps to create this instance:\n\n1. Sign in to the OpenShift web console from your browser using the `kubeadmin` credentials.\n1. Select the project by visiting **Home** > **Projects** > **open-liberty-demo**.\n1. Navigate to **Workloads** > **Secrets**.\n1. Select **Create** > **From YAML**.\n1. Replace the generated YAML with yours, which is located at **\\<path-to-repo\\>/3-integration/connect-db/mysql/target/db-secret.yaml**.\n1. Select **Create**. This selection returns you to the **Secret details** page.\n1. Navigate to **Operators** > **Installed Operators**.\n1. In the middle of the page, you see **Open Liberty**.\n1. From **Provided APIs**, select **OpenLibertyApplication**. The navigation of items in the user interface mirrors the actual containment hierarchy of technologies in use.\n\n   <!-- Diagram source https://github.com/Azure-Samples/open-liberty-on-aro/blob/master/diagrams/aro-java-containment.vsdx -->\n   :::image type=\"content\" source=\"media/liberty-on-aro/aro-java-containment.png\" alt-text=\"Diagram of Azure Red Hat OpenShift Java Containment.\" border=\"false\" lightbox=\"media/liberty-on-aro/aro-java-containment.png\":::\n\n1. Select **Create OpenLibertyApplication**.\n1. Select **YAML view** for **Configure via**.\n1. Replace the generated yaml with yours, which is located at **\\<path-to-repo\\>/3-integration/connect-db/mysql/target/openlibertyapplication.yaml**.\n1. Select **Create**. You're returned to the list of OpenLibertyApplications.\n1. Navigate to **Operators** > **Installed Operators** > **Open Liberty** > **OpenLibertyApplication**.\n1. Select **javaee-cafe-mysql**.\n1. In the middle of the page, select **Resources**.\n1. In the table, select the link for **javaee-cafe-mysql** with the **Kind** of **Route**.\n1. On the page that opens, select the link below **Location**.\n\nThe application home page opens in the browser.\n\n### Delete the application from the web console\n\nWhen you're done with the application, use the following steps to delete the application from Open Shift:\n\n1. In the left navigation pane, expand the entry for **Operators**.\n1. Select **Installed Operators**.\n1. Select **Open Liberty**.\n1. In the middle of the page, select **OpenLibertyApplication**.\n1. For **javaee-cafe-mysql**, select the vertical ellipsis (three vertical dots) then select **Delete OpenLibertyApplication**.\n1. Select **Delete** to delete the application.\n\nUse the following steps to delete the secret from Open Shift:\n\n1. Navigate to **Workloads** > **Secrets**.\n1. Select **db-secret-mysql**.\n1. Select **Actions** > **Delete Secret**.\n1. Select **Delete** to delete the secret.\n\n### [CLI](#tab/deploy-cli)\n\n### Deploy the application from the CLI\n\nInstead of using the web console GUI, you can deploy the application from the CLI. Download and install the `oc` command-line tool if needed by following the steps in Red Hat documentation: [Getting Started with the CLI](https://docs.openshift.com/container-platform/4.2/cli_reference/openshift_cli/getting-started-cli.html).\n\nYou can now deploy the sample Liberty application to the Azure Red Hat OpenShift cluster by using the following steps:\n\n1. Make sure you sign in to the OpenShift CLI using the `kubeadmin` credentials.\n1. Use the following commands deploy the application:\n\n   ```bash\n   # Change directory to \"<path-to-repo>/3-integration/connect-db/mysql/target\"\n   cd ${BASE_DIR}/3-integration/connect-db/mysql/target\n\n   # Change project to \"open-liberty-demo\"\n   oc project $NAMESPACE\n\n   # Create database secret\n   oc create -f db-secret.yaml\n\n   # Create the deployment\n   oc create -f openlibertyapplication.yaml\n\n   # Check if OpenLibertyApplication instance is created\n   oc get openlibertyapplication javaee-cafe-mysql\n\n   # Check if deployment created by Operator is ready. All three pods must be ready. Press Ctrl + C to exit\n   oc get deployment javaee-cafe-mysql --watch\n\n   # Get host of the route\n   export HOST=$(oc get route javaee-cafe-mysql --template='{{ .spec.host }}')\n   echo \"Route Host: https://$HOST\"\n   ```\n\nAfter the Liberty application is up and running, open the output of **Route Host** in your browser to visit the application home page.\n\n### Delete the application from CLI\n\nUse the following commands to delete the application and secret from the CLI:\n\n```bash\noc delete -f openlibertyapplication.yaml\noc delete -f db-secret.yaml\n```\n\n---\n\n## Clean up resources\n\nDelete the Azure Red Hat OpenShift cluster by following the steps in [Tutorial: Delete an Azure Red Hat OpenShift 4 cluster](/azure/openshift/tutorial-delete-cluster). Make sure the database and any associated resources are deleted too.\n\n## Next steps\n\nYou can learn more from references used in this guide:\n\n* [Open Liberty](https://openliberty.io/)\n* [Azure Red Hat OpenShift](https://azure.microsoft.com/services/openshift/)\n* [Open Liberty Operator](https://github.com/OpenLiberty/open-liberty-operator)\n* [Open Liberty Server Configuration](https://openliberty.io/docs/ref/config/)\n* [Liberty Maven Plugin](https://github.com/OpenLiberty/ci.maven#liberty-maven-plugin)\n* [Open Liberty Container Images](https://github.com/OpenLiberty/ci.docker)\n* [WebSphere Liberty Container Images](https://www.ibm.com/docs/was-liberty/base?topic=images-liberty-container#cntr_r_images__wlicr__title__1)\n\nTo explore options to run WebSphere products on Azure, see [What are solutions to run the WebSphere family of products on Azure?](websphere-family.md)\n"
  },
  {
    "path": "articles/java/ee/liberty-with-microsoft-entra-id.md",
    "content": "---\ntitle: WebSphere Liberty/Open Liberty with Microsoft Entra ID\ntitlesSuffix: Azure\ndescription: Shows you how to secure IBM WebSphere Liberty/Open Liberty applications with Microsoft Entra ID using OpenID Connect (OIDC).\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.topic: quickstart\nms.date: 03/26/2026\nms.custom: devx-track-java, devx-track-javaee, devx-track-javaee-liberty, devx-track-javaee-liberty-entra-id, devx-track-extended-java, devx-track-azurecli\n---\n\n# Secure WebSphere Liberty/Open Liberty applications with Microsoft Entra ID using OpenID Connect\n\nThis article shows you how to secure IBM WebSphere Liberty/Open Liberty applications with Microsoft Entra ID using OpenID Connect (OIDC).\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> - Set up an OIDC provider with Microsoft Entra ID.\n> - Protect a WebSphere Liberty/Open Liberty app by using OIDC.\n> - Run and test the WebSphere Liberty/Open Liberty app.\n\n## Prerequisites\n\n[!INCLUDE [secure-with-entra-id-prerequisites](includes/secure-with-entra-id-prerequisites.md)]\n\n## Set up an OIDC provider with Microsoft Entra ID\n\nOpenID Connect is an industry standard authentication protocol well supported by Microsoft Entra ID. In this section, you set up an OIDC provider with Microsoft Entra ID for use with your WebSphere Liberty/Open Liberty app. In a later section, you configure the WebSphere Liberty/Open Liberty app by using OIDC to authenticate and authorize users in your Microsoft Entra tenant.\n\n### Create users in Microsoft Entra tenant\n\n[!INCLUDE [secure-with-entra-id-create-users](includes/secure-with-entra-id-create-users.md)]\n\n### Register an application in Microsoft Entra ID\n\n[!INCLUDE [secure-with-entra-id-register-app](includes/secure-with-entra-id-register-app.md)]\n\n### Add app roles to your application\n\n[!INCLUDE [secure-with-entra-id-add-app-roles](includes/secure-with-entra-id-add-app-roles.md)]\n\n## Protect a WebSphere Liberty/Open Liberty app by using OpenID Connect\n\nIn this section, you secure a WebSphere Liberty/Open Liberty app that authenticates and authorizes users in your Microsoft Entra tenant by using OIDC. You also learn how to give users access to certain parts of the app using role-based access control (RBAC). The app uses the Programmatic Security Policy Configuration of the Jakarta Servlet specification. Jakarta EE also supports RESTful web services. See the [Next steps](#next-steps) section for a reference to an article about securing a RESTful web services application.\n\nThe sample WebSphere Liberty/Open Liberty app for this quickstart is on GitHub in the [liberty-entra-id](https://github.com/Azure-Samples/liberty-entra-id/tree/2024-09-26) repository.\n\n### Enable authentication and authorization to secure app\n\nThe app has a welcome page resource defined in [index.html](https://github.com/Azure-Samples/liberty-entra-id/blob/2024-09-26/src/main/webapp/index.html), which is shown in the following example code. This page is accessible to unauthenticated users. The root path of the welcome page is at `/`.\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Greeting</title>\n</head>\n<body>\n<h1>Hello, welcome to Open Liberty/WebSphere Liberty and Microsoft Entra ID integration!</h1>\n<h1>\n    <a href=\"/profile/user\">Sign in as user</a>\n</h1>\n<h1>\n    <a href=\"/profile/admin\">Sign in as admin</a>\n</h1>\n</body>\n</html>\n```\n\nFrom the welcome page, users can sign in to the app to access the profile page. The welcome page has links to sign in as a user or as an admin. The links are at `/profile/user` and `/profile/admin`, respectively.\n\nBoth `/profile/user` and `/profile/admin` links point to the profile servlet, defined in [ProfileServlet.java](https://github.com/Azure-Samples/liberty-entra-id/blob/2024-09-26/src/main/java/com/example/ProfileServlet.java), as shown in the following example code. This servlet is accessible only to authenticated users by using the annotation `jakarta.servlet.annotation.ServletSecurity` and annotation `jakarta.servlet.annotation.HttpConstraint`. The attribute `rolesAllowed = {\"users\"}` specifies that only authenticated users with security role `users` can access the `/profile` path. The authenticated user is automatically assigned the `users` role in the Liberty configuration file [server.xml](https://github.com/Azure-Samples/liberty-entra-id/blob/2024-09-26/src/main/liberty/config/server.xml#L31-L38).\n\n```java\npackage com.example;\n\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.annotation.HttpConstraint;\nimport jakarta.servlet.annotation.ServletSecurity;\nimport jakarta.servlet.annotation.WebServlet;\nimport jakarta.servlet.http.HttpServlet;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\nimport com.ibm.websphere.security.social.UserProfileManager;\nimport java.util.List;\n\n@WebServlet(name = \"ProfileServlet\", urlPatterns = {\"/profile/user\",\"/profile/admin\"})\n@ServletSecurity(value = @HttpConstraint(rolesAllowed = {\"users\"},\n        transportGuarantee = ServletSecurity.TransportGuarantee.CONFIDENTIAL))\npublic class ProfileServlet extends HttpServlet {\n\n    private static final long serialVersionUID = 1L;\n\n    @Override\n    protected void doGet(HttpServletRequest request, HttpServletResponse response)\n            throws IOException, ServletException {\n\n        List<?> roles = UserProfileManager.getUserProfile().getIdToken().getClaims().getClaim(\"roles\",\n                List.class);\n\n        String path = request.getServletPath();\n        if (path.equals(\"/profile/admin\") && (null == roles || !roles.contains(\"admin\"))) {\n            response.sendError(HttpServletResponse.SC_FORBIDDEN);\n            return;\n        }\n\n        String username = request.getUserPrincipal().getName();\n        request.setAttribute(\"name\", username);\n        request.setAttribute(\"roles\", roles);\n\n        request\n                .getRequestDispatcher(\"/profile.jsp\")\n                .forward(request, response);\n    }\n}\n```\n\nThe profile servlet retrieves the user's roles from the ID token and checks if the user has the `admin` role when the user tries to access the `/profile/admin` path. If the user doesn't have the `admin` role, the servlet returns a 403 Forbidden error. In other cases, the servlet retrieves the user's name and forwards the request to the profile page with the user's name and roles.\n\nThe profile page is defined in [profile.jsp](https://github.com/Azure-Samples/liberty-entra-id/blob/2024-09-26/src/main/webapp/profile.jsp), as shown in the following example. This page displays the user's name and roles. The profile page also has a sign-out link at `/logout`. The profile page is written JSP (Jakarta Server Pages). Note the use of `${}` expressions in the page. `${}` Indicates the use of Jakarta Expression Language (EL). EL expressions are replaced with the values of the corresponding variables when the page is rendered. See the [Next steps](#next-steps) section for a reference to the EL specification.\n\n```jsp\n<%@ taglib prefix=\"c\" uri=\"jakarta.tags.core\" %>\n<%@ page contentType=\"text/html;charset=UTF-8\"%>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Profile</title>\n</head>\n<body>\n<h1>Hello, ${name}</h1>\n<h2>Roles</h2>\n<ul>\n    <c:forEach var=\"role\" items=\"${roles}\">\n        <li>${role}</li>\n    </c:forEach>\n</ul>\n<h1>\n    <b><a href=\"/logout\">Sign out</a></b>\n</h1>\n</body>\n</html>\n```\n\nWhen the user selects the link to sign out, the app calls the sign out servlet, defined in [LogoutServlet.java](https://github.com/Azure-Samples/liberty-entra-id/blob/2024-09-26/src/main/java/com/example/LogoutServlet.java), as shown in the following example code. The sign out servlet calls the `request.logout()` method to sign out the user, and then redirects the user to the welcome page.\n\n```java\npackage com.example;\n\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.annotation.HttpConstraint;\nimport jakarta.servlet.annotation.ServletSecurity;\nimport jakarta.servlet.annotation.WebServlet;\nimport jakarta.servlet.http.HttpServlet;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n@WebServlet(name = \"LogoutServlet\", urlPatterns = \"/logout\")\n@ServletSecurity(value = @HttpConstraint(rolesAllowed = {\"users\"},\n        transportGuarantee = ServletSecurity.TransportGuarantee.CONFIDENTIAL))\npublic class LogoutServlet extends HttpServlet {\n\n    private static final long serialVersionUID = 1L;\n\n    @Override\n    protected void doGet(HttpServletRequest request, HttpServletResponse response)\n            throws IOException, ServletException {\n\n        request.logout();\n        response.sendRedirect(\"/\");\n    }\n}\n```\n\n## Run and test the WebSphere Liberty/Open Liberty app\n\nIn this section, you run and test the WebSphere Liberty/Open Liberty app to see how it works with Microsoft Entra ID as the OIDC provider.\n\n### Add a redirect URI to the app registration\n\n[!INCLUDE [secure-with-entra-id-add-redirect-uri](includes/secure-with-entra-id-add-redirect-uri.md)]\n\n- For **Configure platforms**, select **Web**.\n- For **Redirect URIs**, enter `https://localhost:9443/ibm/api/social-login/redirect/liberty-entra-id`.\n\n### Prepare the sample\n\nUse the following steps to prepare the sample app:\n\n1. Use the following commands to clone the sample app from GitHub:\n\n   ```bash\n   git clone https://github.com/Azure-Samples/liberty-entra-id\n   cd liberty-entra-id\n   git checkout 2024-09-26\n   ```\n\n   If you see a message about being in `detached HEAD` state, this message is safe to ignore. This message just means you checked out a tag.\n\n1. Use the following commands to define the following environment variables with the values you wrote down earlier:\n\n   ```bash\n   export CLIENT_ID==<application/client-ID>\n   export CLIENT_SECRET=<client-secret>\n   export TENANT_ID=<directory/tenant-ID>\n   ```\n\n   These environment variables provide the values for the built-in support of OIDC in WebSphere Liberty/Open Liberty. The corresponding OIDC configuration in the Liberty [server.xml](https://github.com/Azure-Samples/liberty-entra-id/blob/2024-09-26/src/main/liberty/config/server.xml#L24-L29) is shown in the following example.\n\n   ```xml\n    <oidcLogin\n        id=\"liberty-entra-id\" clientId=\"${client.id}\"\n        clientSecret=\"${client.secret}\"\n        discoveryEndpoint=\"https://login.microsoftonline.com/${tenant.id}/v2.0/.well-known/openid-configuration\"\n        signatureAlgorithm=\"RS256\"\n        userNameAttribute=\"preferred_username\" />\n   ```\n\n   If the value of a variable isn't defined in the configuration file, WebSphere Liberty/Open Liberty reads the value from the environment variables following its naming convention. For details on the naming conversion, see [Variable substitution precedence](https://openliberty.io/docs/latest/reference/config/server-configuration-overview.html#variable-substitution).\n\n### Run the WebSphere Liberty/Open Liberty app\n\nYou can run the app using `liberty-maven-plugin`. To run the app, select one of the following methods:\n> [!NOTE]\n> To enable WebSphere Liberty/Open Liberty to connect to Microsoft Entra ID, be sure to run the command in the shell in which you defined the environment variables shown in the preceding section.\n\n* Run the app in development mode:\n\n  ```bash\n  mvn liberty:dev\n  ```\n\n* Run the app in runtime mode:\n\n  ```bash\n  mvn liberty:run\n  ```\n\nIf you want to try different modes, use <kbd>Ctrl</kbd>+<kbd>C</kbd> to stop the app and then run the app in another mode.\n\n### Test the WebSphere Liberty/Open Liberty app\n\nAfter the app is running, open a web browser with a private tab and navigate to `https://localhost:9443`. Since the certificate is self-signed, you might see a warning about the certificate. You can safely ignore the warning and proceed to the site.\n\nYou should see the welcome page with links to sign in as a user or as an admin. Using a private tab avoids polluting any existing Microsoft Entra ID activity you might have in your regular browser.\n\n:::image type=\"content\" source=\"media/liberty-with-microsoft-entra-id/welcome-page.png\" alt-text=\"Screenshot of the sample application that shows the welcome page.\" lightbox=\"media/liberty-with-microsoft-entra-id/welcome-page.png\":::\n\n#### Gather the credentials for the two users\n\n[!INCLUDE [secure-with-entra-id-gather-user-credentials](includes/secure-with-entra-id-gather-user-credentials.md)]\n\n#### Exercise the functionality of the app\n\nUse the following steps to exercise the functionality:\n\n1. Select the **Sign in as user** link. Sign in with the regular user you created earlier. After you sign in, Microsoft Entra ID redirects you to the profile page, where you see your name and roles.\n\n   :::image type=\"content\" source=\"media/liberty-with-microsoft-entra-id/user-profile.png\" alt-text=\"Screenshot of the sample application that shows the user profile.\" lightbox=\"media/liberty-with-microsoft-entra-id/user-profile.png\":::\n\n1. If this is the first time signing in, you're prompted to update your password. Follow the instructions to update your password.\n\n1. If you're prompted with **Your organization requires additional security information. Follow the prompts to download and set up the Microsoft Authenticator app**, you can select **Ask later** to continue the test.\n\n1. If you're prompted with **Permissions requested**, review the permissions requested by the app. Select **Accept** to continue the test.\n\n1. Select **Sign out** to sign out from the app. After you sign out, you're redirected to the welcome page.\n\n1. Select the **Sign in as admin** link. Microsoft Entra ID redirects you to the sign-in page. Sign in with the admin user you created earlier. After you sign in, Microsoft Entra ID redirects you to the similar profile page, with a different role `admin`.\n\n   :::image type=\"content\" source=\"media/liberty-with-microsoft-entra-id/admin-profile.png\" alt-text=\"Screenshot of the sample application that shows the admin profile.\" lightbox=\"media/liberty-with-microsoft-entra-id/admin-profile.png\":::\n\n1. Sign out again and try to **Sign in as admin** with the regular user you created earlier. You should see an error message because the regular user doesn't have the `admin` role.\n\n   :::image type=\"content\" source=\"media/liberty-with-microsoft-entra-id/forbidden.png\" alt-text=\"Screenshot of the sample application that shows the access denied message.\" lightbox=\"media/liberty-with-microsoft-entra-id/forbidden.png\":::\n\n## Clean up resources\n\n[!INCLUDE [secure-with-entra-id-clean-up-resources](includes/secure-with-entra-id-clean-up-resources.md)]\n\n## Next steps\n\nIn this quickstart, you protect WebSphere Liberty/Open Liberty applications with Microsoft Entra ID using OIDC. To learn more, explore the following resources:\n\n- [Deploy a Java application with Open Liberty or WebSphere Liberty on Azure Container Apps](deploy-java-liberty-app-aca.md)\n- [Deploy WebSphere Liberty and Open Liberty on Azure Red Hat OpenShift](/azure/openshift/howto-deploy-java-liberty-app)\n- [Deploy a Java application with Open Liberty or WebSphere Liberty on an Azure Kubernetes Service (AKS) cluster](/azure/aks/howto-deploy-java-liberty-app)\n- [OpenID Connect authentication with Microsoft Entra ID](/entra/architecture/auth-oidc)\n- [Microsoft identity platform and OAuth 2.0 authorization code flow](/entra/identity-platform/v2-oauth2-auth-code-flow)\n- [Authenticating users through social media providers](https://openliberty.io/guides/social-media-login.html)\n- [Social Media Login 1.0](https://openliberty.io/docs/latest/reference/feature/socialLogin-1.0.html)\n- [OpenID Connect Client 1.0](https://openliberty.io/docs/latest/reference/feature/openidConnectClient-1.0.html)\n- [What is OpenID Connect](https://openid.net/developers/how-connect-works/)\n- [Programmatic Security Policy Configuration](https://jakarta.ee/specifications/servlet/6.1/jakarta-servlet-spec-6.1#programmatic-security-policy-configuration)\n- [How to Secure a RESTful Web Service Using Jakarta EE](https://jakarta.ee/learn/starter-guides/how-to-secure-a-restful-web-service/)\n- [Jakarta Expression Language](https://jakarta.ee/specifications/expression-language/)\n"
  },
  {
    "path": "articles/java/ee/media/websphere-family/websphere-family.ai",
    "content": "%PDF-1.6\r%\r\n1 0 obj\r<</Metadata 2 0 R/OCProperties<</D<</ON[24 0 R 25 0 R]/Order 26 0 R/RBGroups[]>>/OCGs[24 0 R 25 0 R]>>/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 79556/Subtype/XML/Type/Metadata>>stream\r\n<?xpacket begin=\"﻿\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 6.0-c004 79.164570, 2020/11/18-15:51:46        \">\n   <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n      <rdf:Description rdf:about=\"\"\n            xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n            xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n            xmlns:xmpGImg=\"http://ns.adobe.com/xap/1.0/g/img/\"\n            xmlns:xmpMM=\"http://ns.adobe.com/xap/1.0/mm/\"\n            xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\"\n            xmlns:stEvt=\"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#\"\n            xmlns:illustrator=\"http://ns.adobe.com/illustrator/1.0/\"\n            xmlns:xmpTPg=\"http://ns.adobe.com/xap/1.0/t/pg/\"\n            xmlns:stDim=\"http://ns.adobe.com/xap/1.0/sType/Dimensions#\"\n            xmlns:stFnt=\"http://ns.adobe.com/xap/1.0/sType/Font#\"\n            xmlns:xmpG=\"http://ns.adobe.com/xap/1.0/g/\"\n            xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\"\n            xmlns:pdfx=\"http://ns.adobe.com/pdfx/1.3/\">\n         <dc:format>application/pdf</dc:format>\n         <dc:title>\n            <rdf:Alt>\n               <rdf:li xml:lang=\"x-default\">websphere-family</rdf:li>\n            </rdf:Alt>\n         </dc:title>\n         <xmp:CreatorTool>Adobe Illustrator 25.2 (Windows)</xmp:CreatorTool>\n         <xmp:CreateDate>2021-06-09T08:08:22-07:00</xmp:CreateDate>\n         <xmp:ModifyDate>2021-06-09T08:08:23-07:00</xmp:ModifyDate>\n         <xmp:MetadataDate>2021-06-09T08:08:23-07:00</xmp:MetadataDate>\n         <xmp:Thumbnails>\n            <rdf:Alt>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpGImg:width>256</xmpGImg:width>\n                  <xmpGImg:height>124</xmpGImg:height>\n                  <xmpGImg:format>JPEG</xmpGImg:format>\n                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAfAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4qxrz3D5yk062HlSYQ&#xA;3rz+jcMwjKpDMjRmekgNTA5WSg60IxVh+n6h+eckkLXthBBWfkFThLSK65OUlPqRL/owZVVgDupq&#xA;H2JVdDqv5vSx/o+3tgZ7IwSTXVxEoklJuASGZZo04yRVJjVaqNudeqqYTa9+c5juJINC09WWZ0t4&#xA;pC5Ji5qI3Zlm3PGtaL3r2IKr0ReXEc6BqfEBuK96Yq3irsVSnzdDrEvlfVU0WR49Y+qzNpzRFAxu&#xA;VQtCtZAU+JwAa4qwt9d/Oi2kW1g0K1u4oraV/rchCs8sYZooj/pAHKQBVL9mqaUIGKus9U/OQXUl&#xA;3caXblbkIi2tB6cPpy0IUfWFP7yN2cu29VC8fi+FVs+YPzshhuTJoNjcyLCTbekPTBl9cIvINdyH&#xA;j6VWoN/u3Va/TP5ywW9xJHpEF3ct9ZaCGURqlY2b0F5LOnHktOobl0+GtcVZ5ok2rTabG+rRJDfh&#xA;pFmSLZCEkZUdRykoHQBqcjStMVR2KuIqCAaV7jt9+KvKbW4/Pi11K2ElvbXtoGEcxmMaii/uPUPp&#xA;Ub956Hr7dDN0ohGKoW21v86tNtLGa+sTczGO0smRoo2QSP6ayzypHPylkMrOm0iLRQ+wYqFUfDrP&#xA;56WsEkf6CsrqRjfXCSTS7gmaZra2HCUAjgE4uafDRTRviKrMvKF35xube8/xPaW1rPFcNHafVeQE&#xA;kSj+8Ks8tOR3HxYqn+KuxV2KuxVpJEcVRgwBIqDUVGxG2Ktkgbk07b++2KrUlicuEdWMbcXCkHi1&#xA;AaGnQ0OKrsVdirsVdirsVdirE/zD0TXtZsIbLSZHi9SO8QyJM0HpzvZyrayyMhDFEmIqBXfiaGmy&#xA;rFtW8r/nTNBfabaaxa/oi5t7q3hQsqTxiQOlsI5hb81CKV5luT0HwtyNVVR9r5b/ADUtbiR4tWjK&#xA;vMOHqS+oqwmNajjJC+3qAkqCGp0YYqlOveWvzuvNJe2m1WG44W0Mg+qutvO94jRu/F0ih4qrBwu4&#xA;BWnLFXrUQkESCUgyhRzI6Fqb0+nFV2KuxV2KoPWU1KTSbyPS2SPUZIXS0klJCJKykI7UBNFO9MVe&#xA;eQeU/wA27Sa1EOuQXH6Nt5baznlJ4SCSWNVaeN0mkdxEhYky/aoP5iVVa40T86I4LmHTtYtEPF/q&#xA;TzcHCOVQj1A1u7Ov95Q8qhiu3FSGVejW8bxQRxPK87oiq08gUO5AoXYIqJVup4qB4AYqvxV2KuxV&#xA;KfM1pq9zYwfopgLmG7tp3QyNCJIopleWMsob7SAihFDirCbDy1+btlD6VvrFugaeCSb1Ck9UEZE4&#xA;TnDyXkwXqzeIp0KqZ+WdP/MSy16O11XUnv8ATyZbq6uZFhIpwCRQRskMNOckjMwA+ERjf48VZzir&#xA;sVdirsVUNQtPrlhc2nqPD9YieL1ozR05qV5KezCtRirzq4/LPzX9bRNM179D2zQSCSTT1kgRZlSG&#xA;GJvqwl9NyyRMWZ60r8NDRsVR9t+XfmCLT7y2uPMlxqLXBtni+vGSZUe2limH7YFCYmWqgE1q1SMV&#xA;S2L8pfNEN5fz2vm65sV1C8kvLhLRZI+fqJGgU8pHRTEIaqyrVq8WqoGKo7R/IHmTS9dtJxrt3dWc&#xA;jibVWknnJkMccdECySy/bmiU7UAj5p0IxV6DirsVdirsVdirsVeR/nP+ZesaPew+XNBl+r3kkP1i&#xA;+vQObxxsSqRxjejtTrTuKZtNBpIyHHLk34sYO5eYWPnz8wdHu1vYNZ1C5ZD+8t9QLzQyFQrOnF2c&#xA;J9riKb+BB2zYS0+KQoxHwbjCJ6PpLyf5lt/M3lqw1uBPTW8jq8Va8JEYpIldq8XUgHvmgz4jjmYn&#xA;o4ko0aTnKmLsVdiq2aaKGJpZnWOJBV5HIVQPEk7DFVwNdx0xVJry40/Ubh7RLuaX6sw+sw2MjIUJ&#xA;LJ+9kiKuCG/YDV2rTMqEZ4xxUN+XEPuB2+NOLOcZmrJrmI/pI+5IvKetX0eu3ehtHdfVoZ5+Bv2n&#xA;llEfqSLC8dzMq+pGwgJ4fEVDKebVouRrDjluK4+GJPCAI7jcUOovc7bgjhHWvAZxNH6TKQ3JMtuv&#xA;u2+7cs2zWuc7FXYqskmhi4erIsfqMETkQOTHoor1J8MVS3zRrseiaPLfMYxJySKD1m4R+rKwRObn&#xA;7KAnkx8ActwYuOVNOozeHC3mmqare3Gqyrb6xqV28MMEnr27XNvbtLzLShYYInLKU4qgCnuWfvmz&#xA;hjAjvGI59xPzJ/Hc6nJkJltKR2HKwPPYD8d7NfKPmVbnUZ9Glv11CWKEXNvPTjOI+QR47hOMZDxs&#xA;y0bgOQPSoOYWow0BKq/HRz9NnuRgTxbX5/H8bsrzEc12KuxV2KuxVp3VEZ3NFUEsT2A3OKvmLzj+&#xA;aXnbzRr8lnouoz6Tpis3oLas0Unpof7yR0KuWb+WtO3vlmoyQwY+OW7UZsh8reffOfluKKPUdRXW&#xA;LaU7wXs6y3SqOp5D96tenx8vlmil2nP6qFI4y9h8t+ctE8wgiwkb1kQPJC6kFRsOv2TufHM/T6yG&#xA;XYc+5sEgU8zKZOxV2KuxV2KuxV4H/wA5AeW9VtdbHmS3iabS721S0v2ClhG0bhl50+yr0Wh8a+2b&#xA;vs3LEx4DzBsOThkKp5fHOJry3TTokub+aVpIIrZJmf1pVSihZRQ0YHoD/HNgRQ35Nz6h/Lvyk2he&#xA;RNP0PUo0mmCNJeRMA6CSVzKUpup4cuP0VznNXlGTIZDk4eSVm07/AMO+X/8Aq2Wn/IiP/mnMdg7/&#xA;AA75f/6tlp/yIj/5pxV3+HfL/wD1bLT/AJER/wDNOKofUPJ/le/sp7K50u2NvcIY5QkaxsVbY0dA&#xA;rL8wcVTGxsbSws4LKziWC1tkWKCFBRVRRQAYqxTVIrDSPMdlqKQyWMkk8rapcxl47W4tvq93Ivqg&#xA;MIWkWUoeUgDeB45tsEpZcMoH1bDhHOQlxQ5fxVV7Db4utycOPIJURubPQipH3Xffv8EX5X1XR5W+&#xA;paTcRX7tNc3l1cWzpNHCl3cyzqjyoSnNmenEE9Cem+Va3DkHqyAx2jEA7E8MQOXd5s9NliTwxqRs&#xA;kkb0CSeff5J/d6dp95w+uWsVz6deHrIr8a0rTkDStM1znof/AA75f/6tlp/yIj/5pxV3+HfL/wD1&#xA;bLT/AJER/wDNOKoTUvJHlLUoY4bzSrZ4opUmVVjWP44zValOJIr26Hviq3znpV1f6HxsuYubSaG6&#xA;hSEqsjeg4YohYFQxWvGopWldsv00xGW/I7ONqsZlDbmCD8mHRzaZqLa3bNqkM9/d29vNa312VtZY&#xA;SCYpRII/TMckPpqWWgrUbUzMIlHhNbAnYb/i3BBjLiHFciBudq6fMK/5aWt+93DNcxNPBptq9laa&#xA;mG5wzBpAS0DOI2EXGJQooR1pQdRrJCqHU3X6/NloIysE7iIoHofd5bPR81rtXYq7FXYq7FVO5gS4&#xA;t5beT+7mRo3p4MKH9eIV8sax5RfyxcXFvq+qw6ZMJWVw6SVmgqPTkjaMM7xvQ8goqD1B7Q1umlno&#xA;g7Dp597Twsh8h6l/iq/t/L/l3RoE0uJgda1yS1HJYqfGI3kabi8vRNhTrx60xx2YIj1H7N/mbZAP&#xA;etE8v6Rolr9W023WCM05tuzuR3ZjUnLsWCGMVEMwKTDLUuxV2KuxV2KuxVplV1KOAysKMp3BB6gj&#xA;FUr0nStJtby9e0sLa2kSURiSGGONuJijcgsgBPxOcnLJI8ySkklNcgh2KuxV2KuxV2KrZYYpo2im&#xA;RZInFHRwGUg9iDscMZEGxsUEA7F0MMUMSQwoscUahI40AVVVRQKoGwAGMpEmzuSoAAoLsCXYq7FX&#xA;Yq7FUp1iy0j6zaXV5a2z1l4S3M8UbFVEblau4+H41Wm+TGSQFAlhLFEmyBaKGr6OBQXtuAOg9VP6&#xA;5Bm3+mNI/wCW63/5Gp/XFXfpjSP+W63/AORqf1xVo6zo43N9bgf8ZU/rirf6Y0j/AJbrf/kan9cV&#xA;d+mNI/5brf8A5Gp/XFXfpjSP+W63/wCRqf1xVDX8vlbUIhFfvY3cQNRHOYZVB8aPUYQaVW0OC3h0&#xA;uBLeCO3iILJFEixIATUURQAKjBao7FXYq7FXYq7FXYq7FXYqhLH/AHp1D/mIX/qHixVF4q7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhNW/458v8Asf8AiQxVF4q7FXYq7FXYq7FXYq7FXYq7&#xA;FXYqk/mGR0+r8WK151oafy5laYXbj5zVMJvvPFvZ3cts6Ts8R4llIofvObCOmsXs4UtRRpSfz3BC&#xA;f3ltcxmQB/iAXkKUDbnfYYRpb7kfmfenGl63+kbQXMTSIpJXix3qPkTlU8XCabIZOIWrR6nHJPNb&#xA;x3Iee34+vEr1ZOYqvIA1HIdMhQZ2VX6zN/vxvvOPCEcRd9Zm/wB+N95x4QvEXfWZv9+N95x4QvEX&#xA;fWZv9+N95x4QvEXfWZv9+N95x4QvEWQaG7PZEsSTzO537DMPUD1OXhPpSKa4lE0g9RvtHufHMuMR&#xA;TimRtinmX8ybDy/rVrpV1FdSS3UfrCWLgY1QcxvydW5Vj6U+nLY4eJtx45TFgofSfzY0bUtak0qJ&#xA;LuORJFhWaQLwd3JApxdmpt1IwnBQtJwzAtld1qcdpA1xdXIggSnOWR+KipoKkmnU5UQGkEqv1mb/&#xA;AH433nHhCOIu+szf78b7zjwheIu+szf78b7zjwheIu+szf78b7zjwheIu+szf78b7zjwheIuM8hF&#xA;C7EeBJx4QvEXfWZf9+N95x4QniLAtX/O7y3Y3slpbC61J4qiWW2AMYoaGjMy8qeIFPfMDJr8UTQH&#xA;F7no9N7NanJASkYwv+cTf4+1P/LHn/RPMkHqaddsJVPF7WY8JlJBP2amuwO6kjMjBnx5R6XWa/s3&#xA;PpZVkG3eOScjVIzdtaC5H1pYxK0HP4xGxKh+Na8SykVy+g6+yq/WZv8AfjfeceEI4i76zN/vxvvO&#xA;PCF4i76zN/vxvvOPCF4i76zN/vxvvOPCF4i76zN/vxvvOPCF4ijtGmka/QM5Io2xJ8MqzxHC24j6&#xA;mRZguWkXmhqfVv8AZ/8AGuZel6uLqTyeG63rEdp5xmklq0cF0juo6lVIJAr7ZvseO8fwdLknUyjf&#xA;OnnbS9Ujt47GWSQIQ5LqFC1WhXxLePbIafTyjdscmWzz2ZJ5AufV8uo9essn68x9SKm5mnl6WIaz&#xA;F5LbzG5vZr1LyW+J1JConDTKxSyX0lEjglG/cektafa3zXyEbc6JlSnZ2/5bomnahJqd01ws0VxC&#xA;siPHI7sFuYo2CRr2uUI3pv164gQ2NqTLlTKLj80vL9q8Ed0s0Utwti6LQGq33RhQ7iKvx/MUrXJn&#xA;KAwGMohvzI8slYZbed7m2mZo/rEcUvBZAoIQkqByJIB/lJHKlcPiBHAV0n5l+TYYVluNREHJnTjJ&#xA;HKDyjpzH2N6E0qNidhXHxIr4cmRQXUc8Mc0RrHKodDQiqsKjY0IyxhbKfLprp5P/ABY36hmDqfqc&#xA;zT/Sx24f9/J/rN+vM2I2cOR3eB31z5ov2N7rFq0uvRBY7MXFusc4TkvJYYOKCYUZ/wBh+/hmWABy&#xA;dlHgA2Ky3HmW1voLzTbIjUZWWS9eK2WWcSVBHqW5VxB9ptxGnz22JqmRMKq9no3mK4hufJlp/i6K&#xA;YLPcIlzaWxEZkYs4gVqMKAng32h8VK7VzCziPwcHYTPCxkWPkg3TC91S7kVxLdX08kKlGf0gGjnK&#xA;Q8eQjPX9r3OUVHvTcu5kPlzzD+X/AJcsJUttTk+r3UrXJmuEuKFnRWADMgXdaUpux23bJxlGI5sZ&#xA;CR6JjD+aHkuVA/18oHqYw0MwLqJPTDqAhqrMPh8cl4sWPhyRF15+0Cx1Kaw1GVrKaORIoRKCWmLj&#xA;7UaJyfhWg5kUrt1wnIAaKBAkWGk/MPys88EKXTl7hGdFMMyv8L8KemyCSpoxpx+yOX2d8fEingKa&#xA;aPr+lazZ/XNMuBc23Mx+ooYDktKijAHvkokHkxkCOaVfmHqcdn5Q1EtdLaPPGYIpmDn4pNio4Bmq&#xA;VrTMfWS4cR3p2fYmI5NVCo8VG626e/zQv5Y6K+j+VLeKeCCK6lrLLJAwk9QP8SMzjqeJ2ptTI6LD&#xA;wYxtu2du63x9STZIG1HamMaZ6Np+ck1nNp9rO0qNJZ3ECRxtarweQlwiDk71oS29CN+2YuOhqTEg&#xA;eXk7XUXPsyOSJkK2lZvi3AoWeQ57bc1XzafJkvmTVE1e8ubKcJGLq4cJLbvBS3cW3okP8JYB68eX&#xA;2/ioMzZ8Nm3mIGVCkvbRvIphuL1rjUJ7Z72O0huFovJIdNF0nDiscnpPCq0Pdwr9KHBwx/HuZcUv&#xA;x72dwfmJ5duEuTA8srWkRluFWJvhZWVTFybinPk696e9MuGQNXAVsv5j+WbR5odTnawurdxHcQyR&#xA;u4Vm5cB6kSvGS4jYqOVSAdtjg8QDmvATyUb38z/LkMTTWzSXcKLKXmRGSMNFUBA0gXk0jKypxrXi&#xA;1OmJyhIxlVsvzE0S8139E26zOxaGNJ/SfgXniknRaUqvwQPy5Up/wXFGQE0gwIFs30F66nGPZv8A&#xA;iJyOo+hlgPqZVmvc5jvm5uP1T/np/wAa5maTq4erPJjMiRPUlFLn9oqDmYbrZxBV7pdpOgafpnqe&#xA;goKy0LhlB3Fe/wBOU4cUodW7NljPomisqjioCqOgGwy9otCT6VpE9x9Zms4ZLgSRzes0al/Uh/u3&#xA;5EV5J+ye2R4AnjKF/wALeWOUbfou1rFx9M+knw8AAtNuwAGDw49yfEPeqXHl7y9cxiO4022mQIsY&#xA;V4kYcE48V3HQcFp8sJgO5RkPetj8t+XIwRHptsoYhmAjWhZTUE7dffHwx3L4h71x8v6Ad/0fbg0c&#xA;VEag0k+2Kgftd8eAdy+Ie9MIvTijSKJRHFGAqIoAVVAoAAOgGSpjxMv8rmumk/8AFjfqGa/VfU7D&#xA;TfSxa5k/0iX/AF2/XmdEbBwZHcsG80fl/LrfmODVlvUhiVRHNEYyXoEZaq3Kh+10Iy6M6cjDquAV&#xA;SG0H8s5NL15tQe/WSBZI5YkSIo5KMzUerMP2uo6+2E5Nmc9Zcarmzi7trO8h9G7hS4hO5jlUOvQj&#xA;ofY5SY24YlSBXyz5bViw0y25NzLH0lNTIvF67ftLscHhjuT4h717aDoLKFbT7dlAIAManqCvh4HH&#xA;gHcviHvWHy35cPqA6bbESjjKPTWjitaNtuPn7+Jx8Mdy+Ie9Wl0bRZp3uJbKF53IZ5GRSxIBA3+R&#xA;OPAF4ytfQtCdizafblmIJb01rUBFG9PCJR9GPAO5fEPeirO2tLKBbe0hSCBfsxRgKo+QGERpBla2&#xA;/srHUbVrS+gS5tnILRSAMpKmo2PuME8YkKIsNmHUTxS4oExl3hgLflhqum3MzeV9em02zuDWS1bk&#xA;3Gvgwb4qdASK++a2XZ84k+HMxBemx+0OCcANRhjOUeu2/wCPl5J/5O8kWXl1prp53v8AVbr/AHov&#xA;pftEE1KqCWIqdzUknMjS6MYrN3I9XXdq9tz1dRAEMUeUQnVzpGj3MrTXFnDLKx5NIyKWJoo+1SvS&#xA;NfuGZRgC6YTK2DRdEgi9KGxgji9RpgixqB6jxmFnpTqYiU/1dumIgE8Zat9B0K3aVobC3jM4dZ6R&#xA;r8Yl48w224bgOuIgO5TkPehz5U8tG5a4bT4WcxpEFZQVURu8isoPR+crEt1weGO5PinvVZPLnlyQ&#xA;1k0y2avIkGJKEuxdiRTu7lvma4fDHcjxD3qkWiaJFN68VhBHNzST1FjUNzjDKjVA6qsjAfM+OPAO&#xA;5eMsi8uPXVoh7N/xE5VqfoLbpz62Y5rXYrJYIJaerGsnHpyANK/PCJEckGIPNSaz09VLNBEqjqSq&#xA;gfqw8cu9jwR7gp8dG8Lb/hMeOXengj3O46N4W3/CY8cu9eCPc7jo3hbf8Jjxy714I9yEjGk/pS4B&#xA;FvwEEBA+ClS8tf4Y8cu9eCPci+OjeFt/wmPHLvXgj3O46N4W3/CY8cu9eCPc7jo3hbf8Jjxy714I&#xA;9zuOjeFt/wAJjxy714I9ypHPp8S8Y5IkXrRSoFfowEk80gAclMjRyakW5J6n4MPHLvRwR7ncdG8L&#xA;b/hMeOXevBHudx0bwtv+Ex45d68Ee53HRvC2/wCEx45d68Ee53HRvC2/4THjl3rwR7ncdG8Lb/hM&#xA;eOXevBHudx0bwtv+Ex45d68Ee53HRvC2/wCEx45d68Ee53HRvC2/4THjl3rwR7kJqY0lbGUp6Ab4&#xA;aEcK/aHhjxy714I9yL46N4W3/CY8cu9eCPc7jo3hbf8ACY8cu9eCPc7jo3hbf8Jjxy714I9zuOje&#xA;Ft/wmPHLvXgj3Kv1Gx/5Z4v+AX+mPHLvXgj3O+o2P/LPF/wC/wBMeOXevBHud9Rsf+WeL/gF/pjx&#xA;y714I9zvqNj/AMs8X/AL/THjl3rwR7nfUbH/AJZ4v+AX+mPHLvXgj3Lo7W1jblHCiMOjKoB/AYmR&#xA;PVREDoq5Fk7FUNe2v1h7YMFaKOX1JUbcECNwu3ejlTiqp9TtP98R/wDAr/TFXfU7T/fEf/Ar/TFX&#xA;fU7T/fEf/Ar/AExVDpptuL6aYwx+m8USKOIryRpC3b/LGKoj6naf74j/AOBX+mKu+p2n++I/+BX+&#xA;mKqdxYWzwSIsEfJlZV+EdSKeGKut7C2SCNGgj5Kqq3wjqBTwxVU+p2n++I/+BX+mKu+p2n++I/8A&#xA;gV/pirvqdp/viP8A4Ff6Yq76naf74j/4Ff6Yq76naf74j/4Ff6Yq76naf74j/wCBX+mKoS7srI3N&#xA;kOEKsJmbgQoLAQyAhRTenKuEAoMgDSL+p2n++I/+BX+mBLvqdp/viP8A4Ff6Yq76naf74j/4Ff6Y&#xA;q0bKzPWCP/gF/pirf1O0/wB8R/8AAr/TFXfU7T/fEf8AwK/0xV31O0/3xH/wK/0xVr6lZ/74j/4B&#xA;f6Yqt0+3e3s4oGpWMcQB0AB2A+QxVEYq7FXYq7FXYq8C/Mb8w/zLtvzH1rQ/L+v6dpOnaZb2s/DU&#xA;I03EyJyKt6UrH944rXxGKUqbzV/zkT65gTzHo8siyKjhI4/hV+VJWrbghKow8dthTfFUJ5F/OX80&#xA;dY1O80671e2llhnW3jnW3iEOxYFwVj5FTxr9n6Mxs+SQIA6uk7W1eXFOEcZA4r5s6/xT+Zh0ybVI&#xA;9Vs5LGJRIJ1h+F0LFOQJhFKMCtHoajYZT4mSrsU6785rOAzE48I61/x376TPyR5x82Xvm+LStUvY&#xA;bu1ktjcK0MYQMGQOh3SNxsehAyeLLIzolyOz9dnnnEJyEhw3sP2Ash/NDzLqPl/QLa5sLZrue5vI&#xA;rT6tGSsjiZHoI2AejcgKfCc2+iwxyTomqFu312aUIbC7Nee/c8sXzd5jtFGoSWOqNGrSExPxjT90&#xA;pdx6wjJIVY3LfD2Pvm38CEvTcPx5OkiJxPF6/wAeb2vyhqs+reV9M1S4AWa9t0ndV6AuOVBXwzR5&#xA;8YhMxHQvRYMhnASPUJvlLa8r8yav5s1jzjrOhaZaSG30drat3DPHGONxAkvFophR2qW3Vh7+ObXD&#xA;DHjxxnIi5X07i6fVDJmyGEbAjXI947lvlrXfNGk+ddJ8u6layrHqhnb6zPNHIGSG3eSkccIop5qt&#xA;SxP8cc+PHPEZxI9Nch3lGl8TFkEJX6u89w6PVs1TuXYq7FXYq7FVK6uYra3eeU0RBU03J9gPE5KM&#xA;TI0GGSYhEkvLfN2q6tNLHqdWhaGVTbKGFUoCRT38c3mmxQA4ed83ms+oySnxnbu8mbeTPNkWv2BM&#xA;i+lf29Fuouxr0df8lqfRms1emOKX9E8neaPVjNH+kObIcxHMdirsVdirG/PvmZtB0b1Iua3V03o2&#xA;8qKrcGpUuQ3wmgHTM3Q6I6iRANUHD1faWPScM5xMwTyuvtYY/mcC0GpXeofFbRobiZmCsjBQCGRC&#xA;eLFv2R3zzntbsjtHJ2kY44yJMvRIXw0PPkO8u903begyYDkBjGI5x/ij5VzPcyhfzP8ALq+VtP8A&#xA;MDeu8GoT/U7eBUUTNcBXZlILKi0WF2qXpQZ32XTZMJ4J1xAC65Oo0+phmjxw+koFfzg0BLO61SeG&#xA;X9CRXEcUWoxmPiIZbC0vRJKkjxyKf9MK8UVj8Jr4ZXTcq3f5qWJMw0zTrq+W11KLSp5QIlX1Wufq&#xA;0gRTJ6nJWBpyRQ3jTfGlR+m+fLe8v105bOea9a4nikjtl5LBDDcNbiW4aQxBfiU1C8uhpUCuBWU4&#xA;q7FXYq8L/ML8qPzG1P8AMHV/MGgR6TNY6nBbW7LqDSF+MCJyHFV2BeMHr2GKUql/LT/nIR5RKtzo&#xA;0UnqJIzRyzKWEZLCNjwqU5OzU8Sd8VU/Kf5GfmRpWp3epTjS4biaSOWOO3dzECgIPwNH36nMbPil&#xA;Igjo6btTRZc04Sx16b5suj8g/mdHE8Sz6f6UlAY6LxCAU4KvpcVUjqAN8q8HJ5OuHZusAq4V+PJO&#xA;PKHknzXZebV1vWPqhrFKsr25PN2foWHFRk8WKQlZpytF2fnhn8TJw8jyRP502esz+U7abSLN766s&#xA;b+C6MEauzcYw45cYyrmhYfZ375uuzpRGQiRoEEOw7RjI4wYiyJAvJU83ebbm3ltzoolvZSySRx28&#xA;gDQOkyGB4k34j6y3Egg+JObj8tjBvi29/Xbf7HVfmchFcO/u6b7fa998j2d1Z+T9HtbuH6tcw2kS&#xA;zW/8jBRVep6Zz+pkDkkRuLd7pokY4g7Gk7yhveI+ade81eUvzK8w30OkS3ekawtmVmKv6Z9C3RCV&#xA;dQwBrzUg7983eDDjzYIgyqUb+0ukzZsmHPIiNxlX2BG6dd6j5k/OLStXsbK4bQtLimjF+8ckcREl&#xA;tIK/Gq0Jlkp4kZGUBi0xiSOOXT4tgkcupjIA8Eevwew5pnbuxV2KuxV2KoXUdOt7+D0puQ4nlG6E&#xA;qyt4g5PHkMDYac2COQUWEeZPKutypFZwQC7Eko4zqRGoAVjWUH7NPbr0G+bPBqoDcmvx0dPn0OS+&#xA;GuId/wCtO/K3ki10Zlu55PrGohSodarFGGFCqJ+tm3OYup1hybDaLn6XQxxbneTJsw3PdirsVdiq&#xA;W+ZNIOraLdWKFVmkQ/V5GFeEgHwtXqPmMsxZDCVuHr9N4+GUBtIjY9xeY6F+UesyTzpqwhhtinEV&#xA;4z8jyBrwBpT4e5y7W6jJLHWCfhzv6qunlOx/Z7NjymWYDhrvu2eah+X/AJevNBsdFEbWtrpsouLN&#xA;rfgGSYI6F6SLIjclmevJT1yieSczczxS73s8WKOOIjEUAlGpfk35U1ESfWJrus6PFclHiT1Y5bW2&#xA;tZFKiPivJLCNqoFPKtKA0yNtiLm/LHRri6ur24vb2bULj0eF8WhWaH6vcJcxemyRKDxkiX+8Dbbd&#xA;CatqirTyDptlqMeo2d7ewXgkkkuZEkj/ANJWWc3LRTKYypT1HanEKwqaHArJsVdirsVdirsVdirs&#xA;VdirG/OfmHXNHGnHSdMk1L1J/U1L00L+lYxU9d1oVrL8a8EFS29AaYqkMP5m+YZki9LypcPJPxaE&#xA;CSYKUa4aCrM1spRgoDlWFRXfxxVlXlLXL/XNEh1G+0yTSJ5WcfUpmDuFViAxNEIr4FQcVTjFXn9z&#xA;+YPmm11q7tW8uzTWkt4tvo0pEsXqQx+pHcu7qk4BEkVYw6pzV1oe5VX6f+ZGv3moWNuPKd2lrezi&#xA;E3bOyCJRKUd3WSKPovxqK7jl0oOSrPcVdirsVdirsVQes30thpN5ewwPdTW8LyRW0QLPK6qSkagd&#xA;2agxVgNp+Z3muGAQal5VuGvrVRFfmITKPrHpzsfTQRTIY2eCMBklcfvV3qGGKp95M85a9r11JDqX&#xA;lyfRkS2huBNLIXBadFkEdGjhbkqvRttmVl7YqyzFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX&#xA;Yq7FXYql/mCyub7Rb20tZJIriaJkikik9GQMRtxk4vxP0YqwF/K35jRXWlSLNzlt7iCe9kivZRDL&#xA;bwiEfVDHJ9lao7BwGJ7/AG2IVenYqwnXvLXnR9dvtY0XVPQaWOKC2tWkPAJSsj8ZEmiVw6rT92fh&#xA;LdyCFUkuLT86bF4ppNQS9kuJYInjtViCqPVm5NwkhdUTgycvjrt9qvVV115S/OK7oLjzDC0kaRra&#xA;yLSJI5HjAmmkWCOEyMjVMYO1aVFCwxVPfKGj+a7HzHqc9/G0WjTxxR2Vq97Jd+kY0UuVLirc3ZjU&#xA;0P0UxVmmKuxV2KsM8yaL+YM3mRdU0TUobewjijtDYOWq0TN6txOvJZIhOeKxx8o2A+0TSqsqkreX&#xA;vzojkuHstctkEwZa3HG4ZONxLLGY6wooJjdYzWo79sVRV95T8/XGoW91+kVNwltaJcXSzywo8kcc&#xA;y3CC2QGOkkkqPX/JxVQttC/Os200F9r9vL61uEWSBIYZI52gIZlkFuR6azMduAYgKQw+IFVu6svz&#xA;ltoTcpqUUvoUaGxRYJWnl9YBIpH+rR8YWiIDsKMrBm5caKFXolpHPFaQxXExuJ441Wa4KhTI4ADP&#xA;xUBRyO9BiqrirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//2Q==</xmpGImg:image>\n               </rdf:li>\n            </rdf:Alt>\n         </xmp:Thumbnails>\n         <xmpMM:DocumentID>xmp.did:f568a692-9cb7-dd4b-8d1c-c45878f63df7</xmpMM:DocumentID>\n         <xmpMM:InstanceID>uuid:f28c59d4-579d-4fa6-bfa6-6eef916ed97a</xmpMM:InstanceID>\n         <xmpMM:OriginalDocumentID>uuid:0129BF1189DDE0119C7FD1E7637AFAC9</xmpMM:OriginalDocumentID>\n         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>\n         <xmpMM:DerivedFrom rdf:parseType=\"Resource\">\n            <stRef:instanceID>uuid:84086c08-b3e4-468b-8d02-c00bbfc203dd</stRef:instanceID>\n            <stRef:documentID>xmp.did:a6d22ee8-4562-834d-a6f4-4d5aa6d842b0</stRef:documentID>\n            <stRef:originalDocumentID>uuid:0129BF1189DDE0119C7FD1E7637AFAC9</stRef:originalDocumentID>\n            <stRef:renditionClass>default</stRef:renditionClass>\n         </xmpMM:DerivedFrom>\n         <xmpMM:History>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:BCB646453062E111906089FB78C225E5</stEvt:instanceID>\n                  <stEvt:when>2012-02-28T12:50:47-08:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator CS5.1</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:f568a692-9cb7-dd4b-8d1c-c45878f63df7</stEvt:instanceID>\n                  <stEvt:when>2021-04-27T14:25:38-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator 25.2 (Windows)</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpMM:History>\n         <illustrator:CreatorSubTool>AIRobin</illustrator:CreatorSubTool>\n         <illustrator:Type>Document</illustrator:Type>\n         <xmpTPg:NPages>1</xmpTPg:NPages>\n         <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>\n         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>\n         <xmpTPg:MaxPageSize rdf:parseType=\"Resource\">\n            <stDim:w>659.582043</stDim:w>\n            <stDim:h>313.234349</stDim:h>\n            <stDim:unit>Pixels</stDim:unit>\n         </xmpTPg:MaxPageSize>\n         <xmpTPg:Fonts>\n            <rdf:Bag>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stFnt:fontName>SegoeUI</stFnt:fontName>\n                  <stFnt:fontFamily>Segoe UI</stFnt:fontFamily>\n                  <stFnt:fontFace>Regular</stFnt:fontFace>\n                  <stFnt:fontType>Open Type</stFnt:fontType>\n                  <stFnt:versionString>Version 5.62</stFnt:versionString>\n                  <stFnt:composite>False</stFnt:composite>\n                  <stFnt:fontFileName>segoeui.ttf</stFnt:fontFileName>\n               </rdf:li>\n            </rdf:Bag>\n         </xmpTPg:Fonts>\n         <xmpTPg:PlateNames>\n            <rdf:Seq>\n               <rdf:li>Cyan</rdf:li>\n               <rdf:li>Magenta</rdf:li>\n               <rdf:li>Yellow</rdf:li>\n               <rdf:li>Black</rdf:li>\n            </rdf:Seq>\n         </xmpTPg:PlateNames>\n         <xmpTPg:SwatchGroups>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>White copy</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>255</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Black copy</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Process Black CYMK</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>17</xmpG:red>\n                           <xmpG:green>12</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Fluent</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=68 G=156 B=221</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>73</xmpG:red>\n                           <xmpG:green>155</xmpG:green>\n                           <xmpG:blue>213</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>204</xmpG:red>\n                           <xmpG:green>203</xmpG:green>\n                           <xmpG:blue>203</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=222 G=127 B=197</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>212</xmpG:red>\n                           <xmpG:green>128</xmpG:green>\n                           <xmpG:blue>181</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Black 2</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=15 G=70 B=124</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>19</xmpG:red>\n                           <xmpG:green>71</xmpG:green>\n                           <xmpG:blue>123</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Azure Lite Blue</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=195 G=241 B=255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>198</xmpG:red>\n                           <xmpG:green>233</xmpG:green>\n                           <xmpG:blue>247</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=156 G=235 B=255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>165</xmpG:red>\n                           <xmpG:green>221</xmpG:green>\n                           <xmpG:blue>243</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=80 G=230 B=255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>116</xmpG:red>\n                           <xmpG:green>207</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=50 G=190 B=221</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>50</xmpG:red>\n                           <xmpG:green>190</xmpG:green>\n                           <xmpG:blue>221</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=25 G=138 B=179</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>26</xmpG:red>\n                           <xmpG:green>137</xmpG:green>\n                           <xmpG:blue>178</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Azure Blue</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=131 G=185 B=249</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>138</xmpG:red>\n                           <xmpG:green>182</xmpG:green>\n                           <xmpG:blue>225</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=94 G=160 B=239</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>104</xmpG:red>\n                           <xmpG:green>156</xmpG:green>\n                           <xmpG:blue>211</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=120 B=212</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>45</xmpG:red>\n                           <xmpG:green>117</xmpG:green>\n                           <xmpG:blue>187</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=91 B=161</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>91</xmpG:green>\n                           <xmpG:blue>161</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=48 B=103</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>30</xmpG:red>\n                           <xmpG:green>52</xmpG:green>\n                           <xmpG:blue>100</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Purple</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=183 G=150 B=249</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>170</xmpG:red>\n                           <xmpG:green>149</xmpG:green>\n                           <xmpG:blue>199</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=166 G=122 B=244</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>146</xmpG:red>\n                           <xmpG:green>123</xmpG:green>\n                           <xmpG:blue>184</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=119 G=58 B=220</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>108</xmpG:red>\n                           <xmpG:green>83</xmpG:green>\n                           <xmpG:blue>163</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=85 G=47 B=153</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>87</xmpG:red>\n                           <xmpG:green>53</xmpG:green>\n                           <xmpG:blue>148</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=52 G=26 B=110</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>53</xmpG:red>\n                           <xmpG:green>40</xmpG:green>\n                           <xmpG:blue>109</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Magenta</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=220 G=146 B=191</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>219</xmpG:red>\n                           <xmpG:green>146</xmpG:green>\n                           <xmpG:blue>191</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=206 G=116 B=182</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>203</xmpG:red>\n                           <xmpG:green>116</xmpG:green>\n                           <xmpG:blue>175</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=163 G=58 B=133</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>163</xmpG:red>\n                           <xmpG:green>58</xmpG:green>\n                           <xmpG:blue>133</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=89 G=40 B=95</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>89</xmpG:red>\n                           <xmpG:green>39</xmpG:green>\n                           <xmpG:blue>94</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=54 G=23 B=55</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>53</xmpG:red>\n                           <xmpG:green>23</xmpG:green>\n                           <xmpG:blue>54</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Orange</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=179 B=77</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>252</xmpG:red>\n                           <xmpG:green>178</xmpG:green>\n                           <xmpG:blue>79</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=250 G=162 B=29</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>250</xmpG:red>\n                           <xmpG:green>162</xmpG:green>\n                           <xmpG:blue>31</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=247 G=141 B=30</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>247</xmpG:red>\n                           <xmpG:green>141</xmpG:green>\n                           <xmpG:blue>32</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=239 G=113 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>237</xmpG:red>\n                           <xmpG:green>115</xmpG:green>\n                           <xmpG:blue>35</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=209 G=89 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>208</xmpG:red>\n                           <xmpG:green>91</xmpG:green>\n                           <xmpG:blue>39</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Red</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=115 B=129</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>242</xmpG:red>\n                           <xmpG:green>114</xmpG:green>\n                           <xmpG:blue>129</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=240 G=64 B=73</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>239</xmpG:red>\n                           <xmpG:green>64</xmpG:green>\n                           <xmpG:blue>74</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=230 G=35 B=35</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>229</xmpG:red>\n                           <xmpG:green>37</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=179 G=27 B=27</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>179</xmpG:red>\n                           <xmpG:green>32</xmpG:green>\n                           <xmpG:blue>37</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=130 G=16 B=16</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>130</xmpG:red>\n                           <xmpG:green>22</xmpG:green>\n                           <xmpG:blue>24</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Yellow</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=228 B=82</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>254</xmpG:red>\n                           <xmpG:green>228</xmpG:green>\n                           <xmpG:blue>82</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=212 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>254</xmpG:red>\n                           <xmpG:green>212</xmpG:green>\n                           <xmpG:blue>2</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=202 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>203</xmpG:green>\n                           <xmpG:blue>6</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=189 B=2</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>254</xmpG:red>\n                           <xmpG:green>189</xmpG:green>\n                           <xmpG:blue>17</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=223 G=165 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>223</xmpG:red>\n                           <xmpG:green>166</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Teal</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=66 G=232 B=202</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>107</xmpG:red>\n                           <xmpG:green>199</xmpG:green>\n                           <xmpG:blue>186</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=60 G=212 B=194</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>87</xmpG:red>\n                           <xmpG:green>195</xmpG:green>\n                           <xmpG:blue>185</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=55 G=194 B=177</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>64</xmpG:red>\n                           <xmpG:green>190</xmpG:green>\n                           <xmpG:blue>175</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=37 G=130 B=119</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>37</xmpG:red>\n                           <xmpG:green>131</xmpG:green>\n                           <xmpG:blue>120</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=32 G=112 B=103</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>32</xmpG:red>\n                           <xmpG:green>112</xmpG:green>\n                           <xmpG:blue>103</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Green</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=180 G=236 B=54</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>182</xmpG:red>\n                           <xmpG:green>212</xmpG:green>\n                           <xmpG:blue>58</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=134 G=214 B=51</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>139</xmpG:red>\n                           <xmpG:green>198</xmpG:green>\n                           <xmpG:blue>63</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=118 G=188 B=45</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>118</xmpG:red>\n                           <xmpG:green>188</xmpG:green>\n                           <xmpG:blue>67</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=94 G=150 B=36</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>94</xmpG:red>\n                           <xmpG:green>151</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=54 G=86 B=21</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>56</xmpG:red>\n                           <xmpG:green>87</xmpG:green>\n                           <xmpG:blue>40</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Neutrals</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Rich Black_R0 G0 B0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Ex Dk Gray_R47 G47 B47</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>46</xmpG:red>\n                           <xmpG:green>46</xmpG:green>\n                           <xmpG:blue>46</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Gray_R80 G80 B80</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>80</xmpG:red>\n                           <xmpG:green>80</xmpG:green>\n                           <xmpG:blue>80</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Mid Gray_R115 G115 B115</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>115</xmpG:red>\n                           <xmpG:green>115</xmpG:green>\n                           <xmpG:blue>115</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Gray_R210 G210 B210</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>210</xmpG:red>\n                           <xmpG:green>210</xmpG:green>\n                           <xmpG:blue>210</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Gray_R230 G230 B230</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>230</xmpG:red>\n                           <xmpG:green>230</xmpG:green>\n                           <xmpG:blue>229</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Ex Lt Gray_R242 G242 B242</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>242</xmpG:red>\n                           <xmpG:green>242</xmpG:green>\n                           <xmpG:blue>242</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>White_R255 G255 B255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>254</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Grays</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=33 G=33 B=33</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>33</xmpG:red>\n                           <xmpG:green>33</xmpG:green>\n                           <xmpG:blue>33</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>K=77</xmpG:swatchName>\n                           <xmpG:mode>GRAY</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:gray>196</xmpG:gray>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=79 G=79 B=79</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>79</xmpG:red>\n                           <xmpG:green>79</xmpG:green>\n                           <xmpG:blue>79</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=118 G=118 B=118</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>119</xmpG:red>\n                           <xmpG:green>118</xmpG:green>\n                           <xmpG:blue>119</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>153</xmpG:red>\n                           <xmpG:green>153</xmpG:green>\n                           <xmpG:blue>153</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>K=36</xmpG:swatchName>\n                           <xmpG:mode>GRAY</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:gray>91</xmpG:gray>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>179</xmpG:red>\n                           <xmpG:green>180</xmpG:green>\n                           <xmpG:blue>180</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>230</xmpG:red>\n                           <xmpG:green>230</xmpG:green>\n                           <xmpG:blue>230</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>242</xmpG:red>\n                           <xmpG:green>242</xmpG:green>\n                           <xmpG:blue>243</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Azure 2020</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Prime Rich Black</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az White</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>254</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Azure Blue</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>33</xmpG:red>\n                           <xmpG:green>113</xmpG:green>\n                           <xmpG:blue>185</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Accent Light Blue</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>116</xmpG:red>\n                           <xmpG:green>207</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Dark Grey</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>60</xmpG:red>\n                           <xmpG:green>60</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Medium Grey</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>117</xmpG:red>\n                           <xmpG:green>117</xmpG:green>\n                           <xmpG:blue>122</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Light Grey</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>234</xmpG:red>\n                           <xmpG:green>234</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Core Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Orange_R216 G59 B1</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>213</xmpG:red>\n                           <xmpG:green>62</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Yellow_R255 G185 B0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>253</xmpG:red>\n                           <xmpG:green>184</xmpG:green>\n                           <xmpG:blue>19</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Green_R16 G124 B16</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>22</xmpG:red>\n                           <xmpG:green>124</xmpG:green>\n                           <xmpG:blue>62</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Teal_R0 G133 B117</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>2</xmpG:red>\n                           <xmpG:green>133</xmpG:green>\n                           <xmpG:blue>117</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Blue_R0 G120 B212</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>45</xmpG:red>\n                           <xmpG:green>117</xmpG:green>\n                           <xmpG:blue>187</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Purple_R134 G97 B197</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>127</xmpG:red>\n                           <xmpG:green>98</xmpG:green>\n                           <xmpG:blue>170</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Light Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Orange_R255 G147 B73</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>246</xmpG:red>\n                           <xmpG:green>145</xmpG:green>\n                           <xmpG:blue>77</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Yellow_R254 G240 B0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>251</xmpG:red>\n                           <xmpG:green>237</xmpG:green>\n                           <xmpG:blue>25</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Green_R155 G240 B11</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>161</xmpG:red>\n                           <xmpG:green>204</xmpG:green>\n                           <xmpG:blue>57</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Teal_R48 G229 B208</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>97</xmpG:red>\n                           <xmpG:green>197</xmpG:green>\n                           <xmpG:blue>190</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Blue_R80 G230 B255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>116</xmpG:red>\n                           <xmpG:green>207</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Purple_R213 G157 B255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>191</xmpG:red>\n                           <xmpG:green>159</xmpG:green>\n                           <xmpG:blue>202</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Dark Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Orange_R107 G41 B41</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>107</xmpG:red>\n                           <xmpG:green>41</xmpG:green>\n                           <xmpG:blue>41</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Yellow_R106 G75 B22</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>106</xmpG:red>\n                           <xmpG:green>76</xmpG:green>\n                           <xmpG:blue>29</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Green_R5 G75 B22</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>23</xmpG:red>\n                           <xmpG:green>75</xmpG:green>\n                           <xmpG:blue>36</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Teal_R39 G75 B71</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>39</xmpG:red>\n                           <xmpG:green>75</xmpG:green>\n                           <xmpG:blue>71</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Blue_R36 G58 B94</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>35</xmpG:red>\n                           <xmpG:green>58</xmpG:green>\n                           <xmpG:blue>94</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Purple_R59 G46 B88</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>59</xmpG:red>\n                           <xmpG:green>46</xmpG:green>\n                           <xmpG:blue>87</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>ALM Specific</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Validation Squiggles</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>227</xmpG:red>\n                           <xmpG:green>30</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Outline Stroke</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Outline art stroke</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>235</xmpG:red>\n                           <xmpG:green>234</xmpG:green>\n                           <xmpG:blue>237</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Text Code Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Red Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>239</xmpG:red>\n                           <xmpG:green>60</xmpG:green>\n                           <xmpG:blue>35</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Teal Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>1</xmpG:red>\n                           <xmpG:green>142</xmpG:green>\n                           <xmpG:blue>172</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Blue Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>55</xmpG:red>\n                           <xmpG:green>86</xmpG:green>\n                           <xmpG:blue>166</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dark Blue Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>34</xmpG:red>\n                           <xmpG:green>32</xmpG:green>\n                           <xmpG:blue>95</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Green Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>13</xmpG:red>\n                           <xmpG:green>132</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>FOR MS LOGO ONLY</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Blue 0-164-239</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>50</xmpG:red>\n                           <xmpG:green>159</xmpG:green>\n                           <xmpG:blue>217</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Green 127-186-0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>126</xmpG:red>\n                           <xmpG:green>186</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Orange 242-80-34</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>240</xmpG:red>\n                           <xmpG:green>81</xmpG:green>\n                           <xmpG:blue>36</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Yellow 255-185-0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>253</xmpG:red>\n                           <xmpG:green>184</xmpG:green>\n                           <xmpG:blue>19</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Gray 115-115-115</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>115</xmpG:red>\n                           <xmpG:green>115</xmpG:green>\n                           <xmpG:blue>115</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpTPg:SwatchGroups>\n         <pdf:Producer>Adobe PDF library 15.00</pdf:Producer>\n         <pdfx:CreatorVersion>21.0.2</pdfx:CreatorVersion>\n      </rdf:Description>\n   </rdf:RDF>\n</x:xmpmeta>\n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                           \n<?xpacket end=\"w\"?>\r\nendstream\rendobj\r3 0 obj\r<</Count 1/Kids[5 0 R]/Type/Pages>>\rendobj\r5 0 obj\r<</ArtBox[0.0 0.0 659.582 313.234]/BleedBox[0.0 0.0 659.582 313.234]/Contents 27 0 R/CropBox[0.0 0.0 659.582 313.234]/Group 28 0 R/LastModified(D:20210609080822-07'00')/MediaBox[0.0 0.0 659.582 313.234]/Parent 3 0 R/PieceInfo<</Illustrator 8 0 R>>/Resources<</ColorSpace<</CS0 29 0 R>>/ExtGState<</GS0 30 0 R/GS1 31 0 R/GS2 32 0 R/GS3 33 0 R/GS4 34 0 R/GS5 35 0 R>>/Font<</TT0 23 0 R>>/Pattern<</P0 36 0 R/P1 37 0 R/P2 38 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 24 0 R/MC1 25 0 R>>/Shading<</Sh0 39 0 R/Sh1 40 0 R/Sh2 41 0 R/Sh3 42 0 R/Sh4 43 0 R/Sh5 44 0 R/Sh6 45 0 R/Sh7 46 0 R/Sh8 47 0 R>>/XObject<</Fm0 48 0 R/Fm1 49 0 R/Fm10 50 0 R/Fm11 51 0 R/Fm12 52 0 R/Fm13 53 0 R/Fm14 54 0 R/Fm15 55 0 R/Fm16 56 0 R/Fm17 57 0 R/Fm18 58 0 R/Fm19 59 0 R/Fm2 60 0 R/Fm20 61 0 R/Fm3 62 0 R/Fm4 63 0 R/Fm5 64 0 R/Fm6 65 0 R/Fm7 66 0 R/Fm8 67 0 R/Fm9 68 0 R>>>>/Thumb 69 0 R/TrimBox[0.0 0.0 659.582 313.234]/Type/Page>>\rendobj\r27 0 obj\r<</Filter/FlateDecode/Length 36642>>stream\r\nHWɒ\\\u0011W\u001f7@]5\u0019F#D\u001evP:$-ˍа\u0013\u000f*\u0014jzǴ}v\u001bS|J[Z{\u001dy+V|ӏ{78\u0013y4j,f9'}{9=ޞek{)y;[2|lyo#N\u001c\u0014W|M{74<o?ۿCSeQ_8l\u0018+5PT5|9\u0019.|Y)cOpI5f\u0016;jY\u0017~>ݯ׽6=Sd[qҞ}l\u0017Ύ\u001d\"8d{;^I֮egJ!~(\"dYM\u001e\u0018\"K+esza\tWclןWi\u000fDl\na\b|ݾdۿ\u00113ճ\u001cFr\u0013\t&â4=\u0002-\u001c>Q\u001eҽR\u001aKFyŜ\u001bA\u0002)}ܗOPk%x.6!=`5A\u00047\u0004bcjVR(*wc֥HFY\u0017Z&(Eo㉶\u0016\u0014\u0016m\\0>Nu\u0011x˫\rf˼eLJ\u0012gқgkk\\v\\3ng>\u001c{˯_^yE\u00037Ȣd\u0004.G\tI}C^ձ7\u0007Egř\u001b#|&\u0011j(Ѝ!\u0011ľa\u0005\u0011ժ\u0015EؙC\u0011GlN<~pª.r9X̠=uS;pX\fwQP!o}}fͫ.<߭h\u0005VFdg0Q\u0006ȯ2nW(#\u0013ѩ:a3]Ρ\u0005wvÇyng{u-\u0003)TڬS!\\kO\u0011w\u0005R\u0006S)3e<⥢_YQ\u001f\u001eM\u001e?񏧎}ؗK9\u0002ёsҙ\u0010\u000fm\u0000D`/H\u0006\u00032:52 Dݶ\r\u000f\u0005&a8\n[}V_[ƙ3D\rq\u0015\u0017\tIKC\u000b\u000fD\u000b6R߯T12t\u0002FW[gi@6n|(\u0006RGNO[`:J\u0001h\u0003@\t+'͖g\u0014BiĹ\u0001Qwxg9WhXcfY\u0010cVo]A,VfgXuFu.J\u0003PZpQY\u0015f?4c\rt.m\u0013vRh\u001d+erB*\u0013:#qrFqf5\u0003$ӑn:\u000e# yTbM2q+^:!ıbyȂLV'\u000e6!\u0015>2csnDs(KC!ܒ+t>0VH8(D;v\u001e5Cf׊NWBG^\th\\ =ZǗ\r\u0006oX3C^\"u-\u0010\u001b\n5\u000f=BEP؟@|'\bSY\u0016\u001e*5ަKK(Hm\u001fjāh\\A\n\"o%k\u0010d4ª1b\f\u0010|\u000ew:EX\"z\u0015C\u0011\u001d\u001cU4{QD{=j`a+STUR\t,^#ieC-R\nI,\u001b\u0001C\"ΰH\u0005\u000bc\u0016HZo-\u001e\u0002\u00197\u0018\u0014KJ`\\Ih*ad⹤A2G\u0007=\u0012{\u0005*_\u0011B(\u0001\u000f\"a\u0001Ԇ\u0003tdU7g$(onQ\\J Xbp˯!5Du*\u001aؠd\b\u0007GJⳋpeJ$R?'\"\u000e+,\u001b7\u001dzN\"\u0006\u0017Zrý\u001c[0\u000fN.ڪBJ:\u0001L\u0019~s&I*k\u000f\u0003\u0018&ID{#%\f&$8xVE5E|=-\u0016\r\u000e3P,\u0005\u000f\u0017\u0011\u000bWź3i1\u0004,V\rgi;a\u0018?\u0018јRR\u0014%FC\u0003)*H݋Hc#\u0017\u0001\u001c)2\f\b`uV\u0004\u0004tki2ͣҿ솟e5\"zns/\u0014ih]\u000fXr\u0005\u001agRR+h-\u0007\u0018\u0000aV/\u00014At)gq\u0011D(\u001ae\fttq\u0016W19hb\b$dx\u0011\rM \n\u001e$B\u0019C\f3 I\nz)2a\u0005@\fC.\fxrCpMȯxx>\n#\u0018J\\D\u0005܆ڊhv)\u0003\u0010҆`[\u0017Pepu9\u0005LI(\u001a5A\u0006\b⯘eF=\u001aBq<\u0015{*ILm %#f?\t\nA\bMb0\u00019i\u00181\u0004\u0016LTr\u001aOJ.?W\t\u0017Mj\u0016l\u001ah⩅>.\nĠeM\nU%n\u0016`T)^BGJX\u0015=.\u001a`i:{_ۇ^t=9c5$p\u0015Q7t\u0017O/rx7}ufC\r!֘\u001a\b<q\b(\u0007<\u0006\u0003P]<\u0005խ\u001eO%M8\u0018o4'\u000f\u00027{zj!w\nr\"\u00191\u0012Ca|\u0015P\u001b)E]IJc; ].ok\\h#ĭl)f\u001cuk{-\u001d\tRX5(`L\u001a0\u0005dQ\u0019\u0017jHH11G>V\u0004$\u0016{]X\u001f9\fuȃ[sd\u0018aO\f=3y\u0000ۺl\n`\u0011^M)쉸$3\u0002\u000e/#Y\rXXhIՉ0\u00183/{4\u000b!yf2%iEV;T)Q\u0005\u0019\"+]\u0016M\rm(vDǲ?e\b/*\r#f3\u0019\u000f\u001clGM\r#\u000bȱgej[=[Y\\c\u0018Z\u0011\"~X{z8$\u0002\u0016NT̮Ɛ\u001a\u001e\u0000`2#)^sܮ\u0018\u0010\u001aH\u001aه\u0006́d}[\u0003\u0007,_deeE<6Q,}\u0006\r}Vb.\u000b\b~~y\u001d (\u001a1va+\u001eD?S\u001e'Gbel\bJ)Ip\u001btrS\u001654؝Fnګ7Cv\u001bWn6qϲ?\u0010(1X\u0001j\u001b\u001cS,i_EY`ѫوK\u0015_\u0013\u0017ц@\u0013RKc\r\u0002t\bzW\u0012u\u0005\u0006_Bx%'XSk:'\tb\u0010ƠrPQ\u001am%*.lSXUor\u0018IOYH׭:vt=\t\fBHZ*(ri\u0018j\n,Ta\u0019feCXv\u0006HR\u0005!YM:)\u000b(q鸸2\u000b\u0004tE!e%zӶ,֞\u0017\u001b1̩'nx6%v\u0001AՌ\u001bOy\u0002<t,\u0011AՌ.JcO\u00150Rv()|˰e<hdb,;zUgR3&\u000f&0̥f6\u0006*7 \u0010Є\\Z\\yQ;g<\u0003݈(M7\u0004#\n\u0019ϹjX3\u000ewoV75Ȕ\u001d.\u0019֖JBMנd#LM<NHqTt4d\u00135\u001b\u0012\u0002y\u0018\u0011Em\u0012bKv\u0013^x\u0002\u0003Vm/Dĭ\"\u0004\u0010^\u0001v\u000bw߻W\u001aj}\u001bk_6g\u0005#\u000bWc\u000bC)t)I\u001ex\u0000/?gXfs߾^2C6ODbfs{\u000e;ޡap-\u000e=+ا/>bKbY\u001e?|98x\u000eiY\u0010\u0006R$~\"\u001f$A\u000bZ\u0000\u0002q8廳Zŋu<(>\u0015'(.(>Mt*$>O?\rP9ƙ+\r\u0003\u0004q0UQ\u001a\tod\u0018c\u001e\u000eIHV೾\u0015FU䖮@z\u0010h<\u0011BN\u0019,Ynṷ#@!nPeC2T\u0010&Y\u0010Xإ%\u0001\u001b9QR9&t鱡p\u000f\u0018UN\u0019=8!L8\u0012\u0018:)S~+\u0015=3WЉC=kHlk]b赎\u001a-Q\bS\u0005s:\rpp\u0013ژY]C(\r%\t?V\u001b7ŢO\u0007\u0007gdÑ7\u0013k{\u0014\u0006N̐X\u0000L\u001dvM-m1d[\u0011\by\fnD\u0019\u0003P*:\u001c\u0012Uqf/3\u0015I|(ՀUy }:w`|7yt1\u001cՊ\f\u0000ƣPW8\u0007\u0016Mq\u000f\tjL`\u000e%R_fbO\b\u001ed`hBqhv7 $o34iw,=%\u0016jѨ\r\rS&\u001e=ʔH\u001bK֙DYi\u001e|3k*B,BR>9XPar]\u0000\u0004SeMC)FF\u0017'0zpF\u0001Dt\u001bP%4{t1L\u001cqG\u0002ֹ1i.`\u000fҁ\t\u0016IK\u0019zSEɩi6dJ|Swo^\u0010u\"S\u001fr'V\u001fͪ4xW\u001f)^$3[63+u&$\u0000C>uf\u0015\nLihUy\u000fΚK~gVovV˛Wht0ɂ\u0018m4\u0012.\u001c:\u0018NQ6%cYŽ=\u0012\b7Y\u000f]Ufr1h뮏)\u0014֥5]\u000b\u0018\u0006\u00161A+XY45kS\n89\u0017_<4ώU\u001d%mGzD؞`.IMR(\u0005kZtjd@+.{ژEW\u0005\u0006lg;sN\u00158`\u0003ic)􏷥4.-\u001dގ\u001fOOL_G9pܺY1\t+qu/o5\u001f\bD 9Z\u000b5\u0016TE\u000bD \u0001ȬL\fl<\u001aPz|忥g\u000f\u0010'\u0015?өA/|ܗ\u000e\"\u001dK#cQeQ@Y!L, Nj#7S 0\u0007t;zpZA\u001f@Y!@>Z\tȊA\u001bK\u001d\u0002\u0015:\u0018\u001ed,\u0000\u001c\u0004A]D?>H\u0015UoS\u0001yjd:9L>þ\u001dY\u000f>֨Kk|ItS@\u0018\u0003\u000b\b\f0K29-ǕE0T%\u000f\u0000K8T@\u0019pyӔ\u001d\u0011~;\"6ӵԄG8|)0܋y(fk-zӋ?]\u0000\u0007\u001brTXtS`.T\u0013\u001a\n\u0012\u0015h\u001d#\u001a|.k41/\u0018G1/U\u0017wџf\nÉ$\u001esY+GK%3\u0003?%=-8M\u0011\u0005\u0003a! Ғ\u0002\u001aD(b\u001a\u0002p Wy\\yJh\u0003J\u0015\u001dL\n-\bM\u0007\u0000#$O\rR+8bd\u000e޷\u001ft1}\u0019<#&\u001aZ(o3\u001aјg47&0\u0019Гa\u0015#3)\\ZWɪ]dqB=&w]i15\u0014%D\u000f^ﻶ\u0003I\u0012-U{yNG5^QN\u001f׷o\u001f?ʉ(ə,c?I_\u0003ʐ}\u0018\u001b\u001a^i\u0013\u001aY9N\u001dךY\u0001YOTE\u0015r\u001brՏio 4*p\u000b\u0017x\u000eQĩY6\u000b`0\n`\u0002t#Mr;P$\u0014D\u0004~i-LbGW\u0010)gnDW0Ť6\t\u0018\u0016H\u0015\u001e\u0019CO\u001b\u000eP\u0015Jo\u0003cH%v#,\nr\u0015i\\AP\u001dU\u001c<\u0002m )\u0005\u001eP4/9*\u0007zoPe5.\u000b\u001cGyȄYyP\u001e\tSeO\u0002uLVi!P\u001b}b%\u00125Pdԗ4ߣE\u001dv./v\u0004\u00136*C{\u0002D;zXx\u0004BBą\u0013\f\u00079\u0006u\u00021;_\u001cEP'bW\u0007\u0006\"Uh̖}aMd9qQ6ΗMm\u000bL\u000b\u0002\u000ew\u001bZLCC7v\u0003ѹV\rtm\rZS;{I\u0014*Jϒ\u001c\u001d\u0011[\u000b$\u0012\tTyKU׸rB\\trͰ6nHР\u0016䣄Z!!\u001aZM |BnEvсsYa C\u0004g\"k(ҭ)6r\u00165pDg\u000e#D\b鑺+w)o\u001c\u000f{jV&^\u0015D@w2TCWԶ\n\u0002+dqc\u0006\u0004\\\u0018hňnŢlnf\u0001\u0012\t`Uݖnl5KX;~x\u0010Wz\u0015k,S=s%<\u000fi~\b\u001e\u001cV{QM!\u000egDrК\u0011-*\b\u0000Ekҵ9fKDE\"r.6jii#ꔲ\u0007=I'\u0003?J\u001eqV\n;\u001c[wU-<\\Q#ˈ{\u0015m\"\u001f\u001d\u0000.Cs\u0017[\u001dz\u001eD*1ʱZZG5ɘ\u001f{\u0003V\u0001cV)+b(4ȟ\u0011׭\"D\u0019-\u0017IDM_G>=\u0011\u000e^k{̈́\u000bU\n\"ZgcaIq\u001d;l\u0014~G@6#Y_שS?yLɵV\b$}_\fk\u0000#]bF\t\u0010[HK[B]\u0006>=:b\u0013IiFF+$p|zCs8=4P\u0004GF<4\u0014GX\u0015#\b&Z\u0003;ȯ$\u0015\u0018\u001dSgHXSa\u001f{F\u0003eNk\u001a$\u001c=\u0001l\u0001&ᰭHI G0\"J\u0011WXg`e\u001bN/#ב\u000fم?\u001fw\u0014\u0016dUVo\u0017[|^j>|\u001e9Hշ-\u0002[ysgi\u000fHS45c}ronYr:Ne\u001c\u0012\u001c_FjcN#\u001aݢ1W2r_Jfn\u0005-ϙݦ\u0014\rh9\u0014/#1r\u001fĜ\u001dNv\u001d[GBɱiĵu\u0001\u0011\t=BQΕmX͕Z\u0010}=P\\|Ȕ\u001a\u0010RJ\rAȦH쑘[QP7L.EȸF||{\u001dD^Fq\"\\̽IN\u000fn\u000erX<w7d:\u0005m\f\u0004fsnOikm\u0011 \u001e\u001b$D\u001d%\u000e\u001dZя93ȂS:|__WsJ#$[$\u001cHqeČ4\u001b\u0018+cFK-\t2\"3\u000et\u001a`\u0018$6;PŇ\u0006}<r\u0017K#tG^|hg\u0010\\p<\\!1\u0013s4kÈ\u001fDMJ.:\u0005\u0012\bt\b?}xy{r\u000eOi.^z;r\u001e\u0015=@\u0012VD'b+~|a&\"28pe~b\u001d\u000f|Ԝ7-\u001a޻q\u0019ga|KYP\b<e9Ǹ|?\u001a\u001a+|>d/\n\u001d*Y\u00042!\u001c2L;A=:_C&\u0016\u00027z\u001fo2ߕ9= w1M\\\n\u001f_\u001e.\u001c.&P6T%4\u0003aSPT9OT\u001e\u000f~XC2F\u0012$\u0019Sa]/KBz\u000fE<5XlY8}:V'˗\u001b\u000fo\u00140~>M\u001e\u0012\u001b\u001co~P\u0015\u0019w^\u000fɸ#B6șU\u0016@0\u0004zd)Ͷ]\u0012oH1\u0003z)4\u000eW\u001c&IF*72$q|\u0014\u001a)6F7T.TbyXCTa}\u00124T\u001cl\u001bi\u0019)\u0006\u0019\u0013i\u001ajb)ә!M*A\u0019-+>7\u0019)YSc& RP4]nꝳ\tF\u00137\fS5`#\u0000˜46,0K1\u001d$\u0018z\u0012q\u001aH$+\u001b\u0012\u0018h\\P޵-\u001a\u0013t\u0019Y2\u0015j\u001f[f\\[\u0013\u0014f%Jv,\u0000eE\u0004$2+\u000ey[;Wd\u001e\u0018k\n~=[sLTV=7-$He\u001dՀ\u001fN{Y8\u001eyjcM0,Glm:k\u000bO5~`rĭ%l\u0018m؊\u001fĶ\u0000-U<}\u00107MD#\u0017HA\u0002ւ{!8(nQE\t\u0019D-7T>O,Q[\t\b\u0002,eQ\u0014ߌ\u0017P8EUL\u0007Ij/n\u0015(\u0016FMp'W[*.<\u001bhO%ӂҧ$T7\f4\u0012˳xbJQ\u0004iԳ0\u0002}_Z+B\baEB?nJ\u001d;y]v\u001d8\"'V\u0011NV|)劾'\u0015on\u001a4V5qQsh\u0006}yNQ~\u001e4U<3R#ʺ?הi׺J\u00037ɭ\u0018$\u000e*ayvN\u0005W^s\u0006fJZ$&r;M5o(J\"\u0019$\u0006f_AI6E\u0004G$4{8.\\\\4R\u0014C2t\u0012hVBɕ\u0018lmVt\u0014e([ٺ\u001c@\u0005*Fd\"\u0000֞w<Olμ5;zuر\u0013\u0017xbQ3\u0019eFbQ,\u001f\u000br;\u0019v~#\u0015\"\u0007\ny8\f^zZ\"h'*$$\t\u0001.2N#E\u0014\u0010<J+M՛h*q'*ì\u0006\u0017(E'YVx(1\tnpmY\u0010fL:k9ە%f֖\u0016iZ\u000evQKdN\u0018#vtu\u0017\u001b\u0001]2\u000f{\"|~3%MN)~l+vP\\\u00067ٔF.\u001c%d\u0019H)e./\u0003T:YOR?zF\u000b>\u0014U\u001bla~b\u000fO{\u000fEi&N\u0005ADf\u0003\nL)Q'\u0001퐶8P[de}{\u0006UU9{ȫ\\\b4TDJ$\u0002D@\u000f\u000e\u0004\u00193È\tFb%n9\rS\u0015\\\u000fW/cjCEUz=V\u001aDo_\u0000H8\u001f+/[\u000e8\u0006SXY\\\u0004\n?~\u0019\u0004\r\u0002XGt*cfJ¤7]2Jb@\bMma\u00165nR0P}\u0002z\t\u001c<\u001e\u0013!-jNsW%dd\u001e\u001fGHHԨQ,\u0011\u0013pSi29\t.HP\u0000\u0007H\u001ex\u0006+\u001feG\n\u0016\n\u0005\u0018\u00182`\tZ؀DdUwUC\u000emaȜǍ{#⮑5Z]LHZ\u0005Q}j;T9.dͲqwӮxtͬjGΛ\u00191Gx`B9#&f\u0012oK5Tv>\u000bїh1K\r,1@rkm\u00114>6@B&LMc\u0011\r@,R_}k󨷺\u0019 L.\u0010epP?5~r<P\u000eǇ\u00157*\u0013ru;a\u0012\u0015-_2\u0019{ЖCM[Gֱ~\\߱ƃ%J̐\u0000Jgk\u0015lb\u0017\u001d&B$׀\u0013\fհŎ\u0000cooC̿0|(\u0004x\u0018dC\u0017q\u0014nu;\u001b~|zx~\u001aͥPQPo߆O\u000f\u0013Ϸەo\u0013[\u0004ǧg/$r2A\u00053\u000f\u000eA6pݽ)yyˇM_\rLB` \u0017_mu\u0000<\u001d\u0018\u000e\">~t(@t\fN\\\u00040ޫ\u0000S\u0006­t\u00182D1m\u00135\u00132݃\u001b:l;\u0016#܏z<\u0018=W\u001fNr\fM\te|Q\u0016O\u0007\u000eozb^p\u001e6&Afq謇\u0011p}c\u000e_ý\u0006^\u0013َ-\u0005n1\f\u001e\u001bM$_Smn\u0006V-E\t)cKa0 (#?Ll;PZju)=\\\u000b=Lp\u0013J݆;g<L<V$\"mjCo\u0015Vkݜ\u001d  X\bd7g\u001a\u0018u\u001a$\u0014ZP!Ͱ|f\tzŦ\u0017\u0019E\u0015\u0013k\u000f\u00132ĠU݌°({KM\u0003\u001b\u0002\u0017A[q(vuA\u0006tp\u001ą+Wu;o\u000e\u001a\u000e+\u0016\u0002u}۸d3\u0019}():\u0006]˖Ekh?;N5w\t>\u0001t\u000e\bĜ7\u0018\u0006Qv0\u0003\u0002\u0007\u00103\u001bp\u001d\u001ff* \u0012A@ ܿ\u0003\\^\u0003A_\u00051\u0013\f ʀ\nK\u00186XE*F>S^x\u0000\\E)U\u001c\u0017go?:In3JU[\n\u0003|~k*YR{7\u0014wM\u0007Կ\tc\f}\u001ejKeQ<H6\u001ce~\u0005sÑcCyv^a8\u0016b^S\u0019\u0001\f\u0018BpЋjvI*\u000b\"KxYA8c:\u0000aZ\u0010_\u0001a\u001e\bu|CŦlS|B\u0018DO\u000fҵNo\bN\u000b1x\u0004Q\u001eٴ}H\u0013\u0015W%f>JL\\7ja\u0004\u00025TG;Ψ\u0012C;~J\u0015QL$\f\u000b\u0011\f;ҩ{[\u0001v>EM\fgMl'It\u001e9\u001b`ߺ!3Ua٘r\u0003h<3\u001d7׎_|\u001alr6_r3v=M\u001frrwo\b|C\u0014hK\u0003s\tw\u0014l\u0016\u000f(ؐQ\u0002pٗ\u0004o|r\u001cm\u00173`\fiLO3w}\u0005U\fTҒi\u0006\u0018|GwIGIΧosS;R#C:?īҦہhF\r'݌1)܊\u0012}-7<{լy5[\"\u000bЀ+ߑESnw\bvH`I|bu}(y\\ C\u0007\u0004Ar{?\\U\u0011ujw\u00157\u0004'\u000b:}\nSy\f\u0014QOh:\u0018E>\u0002\u0000q`/=^Ub\"ǯh$\u0014M,7G醺\u0006\f\n~\bP#>UtBv(\u0014,HijWކKþV8u}mFJ\bF\r01\u0018$\u0002%RJEs@Z\f\u0002\u0001D\u001au\u0003\u0002a;\"R\u0004U\u0016*+d\fK\u0014\u0012ّ\r!\u0018$\f8|5\u0010\u0000U%=>SUˡ!\u0018Ff]!\b*\nT\u00152\u000f\u0010F_v*XQkZG&:S!*UI #\u0000|MM=$8AQEAVL\u0013PP\bT5\u0004Aދ\nqJن[\u000e\u0004\u001cKT\u00117c}̑J<_O\u0012e\u0000#V&\u000e3@\u000bJ7\u0014TP\u0000\fҠOvwl(fIx\u0015nDǨUU:A$\u0019_ϗ\u000f?\\/~go\u0017ÿ޼x|\u001dSXy.;lUtvk{;,N\f/T:g2&'U\u0001l0O[m\u0003maWvR3R+?\u001aܖm7L\u001e.Q6c0zgH_B%\u001fJ15vSOL-\u0019\u0002tR\r/cX\u0017Wg&UM \u0003]V\u0012jWnڈ/\u0017[(\u000bi-iF BLLIs\u001f\u0019n%\u00109U1*n #r6J@eF\"\u0017ѝp!t1@&CykLvMƴY\n[L5}\u001c\u001chk۲ќ\u0019\u0015/\u0004V!X\u0003q|!\ftz(z{-\u001f0$<Az@\\֨7\u0017e. Ac\r\brWWP\u001eY)2HT*\u0019k #6*ը\u0001[\u001df2W-!6Q]n\"3?ArI\u000b\u0013'\u001dV'\u001b抖-I\u001fK\u00131@X%d\u0002:kī%6!9\u0018V6\u001d.U\bQϦ\u0018\nM+TJ\u001aR@o\u0016#ͮD\u0012t\u001f\u001e˂N(\u001f\u001eK)>+\u0000\u0019\u0016ԨʬD)P\u0004,[\u0006݈.!ARR.|Ph\u0019f-~~2`>Rv2f1/{WLY*Q\u0017LVE⫋5Ŭ)omeR+\u000e~jO\u001b(Rzuʦ\u0016I=H0\u0010qEV4\u0014!H\\\u000fQ\t\u001d=8䬤|R15{*i/6)K|ڪzj aB\u001c]օpLs\u0015l\u0001+%`=\u001b\t]&fS?ij5E7\u0010\rH~j教dlRx,cY\u0014\u0004\u00011Q\\\\g\tLB\",\u0007\u001d]\rJ\u00024aj곲ݶT\u0005R\rL\u001b\u0014lJ\u001efF܊\u001az\u001aIqM\u0013S\u001amkix}\u001d)\u001f6_~\u0006\u001dhP\u0019Kuٱ$_\u000fU#InE:E^Z>\u0017WN C\u0017\u0006jJd\u001622f @uX\u0018_ޢg\u0019W_HO\n.W\"\f;d\u00018V%[`rCփ\u0011}vhn@\u0016V\fuYx?!3O.\u000fi\u001c=NZD>p\u001d]@\u001b'2xM\u000ef \u000f;``\u0001݃3DԿ3\u001em\u001b\u0004V\u001d~\u0017Ir\u0015\u0016??8\u0004</\u0014c\u0015̎\u0010AQ\u0011AY\u0003bٓU\u0016@:\u0014A%'$L=[\u000e(Kpz\u001c\u00147Q-Qx\u0019\fv&\u0001\u0017Q`\u0016SVI\u001b\u0003 %;\u0010\u0012BԪ]wH\u0011=oidm6\u0005jJ!}\u001bZeZ\u000b\u0018n)\u0001d \u0003\u0006c 1Of,ˀLp\u0000\u0016T_\u0005隲LzFfM\u0017jD\u0005\u000f\fQ\u0003\u000e\u0010M~]\u0013Y\rmGp\nE[\u0015\u0002mX\u0016XeȾ`o'\nKGL{`9>S[*P~D#\u0003\u001e1\b\"F\u001e\u0006Efz6{_\u0001+,lhRo4\u0019\u0007ut7,J(&.iB\u0015?*`4\u000f%RÍ,X`si\u0010\b)TFU:KOKdՂ?=L\u0012_j嶁&hhZ@N\u0000给c$ݡ\u00122KE6meTi^<YT,5\u0017\u0013L\u0005rqypZl%J=\u0001л@j\u0005[d-\u0003Ēx)[-\u0016-\u001e!f:rNw=rKqˢ\u0018DH2!b3\u0005ofVI\r=#\"ܦ:\u0003.@S$#hRhUo 4g}\"\tS\r\u000bk\u0007J\u0018\u0011\u001bLۛm)\b}霹\u0012Vsߏ@V\u0017l|P\u0006ql>w̸Ř\r4\u0016UΗz%dFL&!t3[&\u001dID툇#/\n*].9m\u0019ImǊ0Dc\fk/\u0018c/-g֖5\fMδ#V]\u001aNW\u0019XH\u0012\u001b/!\u001an\u0004=<\u000fh$x\u0018E8rh\nA~ |k\u000bT\u0002<dn:\u000e\tK' \u000fC&[MV`Ew5[1]e]EX/iIT\u0014 [Y\u0011N \u0006Q7\u000bn\bd\u0014#\u0015g#TLfq5yT*=TjQSI\n\u001b=\u0006\"oĬ\u00109څ`|\u00102t\u0011sٞU\t%/wߥZUR}3tR6|֪O\u0018e\nq%,-۞b,Ҥ)7I3\u001a8]j!\bG۔oT\bNp\u0000hbjؐ7\u0002m\\\u0018d\u0012\u001f\u000fʒlO\u0012boPʔ^C\u001axM\u0003߶@dG:\u0015ɸ_51\u0005QK\tY}5\u000e#\u001f1qu\u0007QjeAU\u0017\u0001o^\u0001ޅN#4`\u0013Dx\u000b?ߌj\u0011\u000bǬWi#u\u0000\u0017ĠQ&؏]_\u001exo<ĂƀFs\u0005\t7a.LO\u0017ո\u0019\r[5&N\u0006U7\tYg{\u001b{$K;oq\u0017}NUH<KR8uL$Hg(!^ё~^\u0007|35\u0003)|>P\u000ejN]W7\u0006\u0006%A\u0010Ca\u001a\u0017r\u000f\u0013ʹ\u0015ӷ\u000bׅ6!D|PBJa~H57P\nK\u00030yuzpm\\\\\u0001Vqc!c\u0019v9\u0018%\u001b@\bWE=\u0015KM4\u0003j\u0001+bHYvBuH@W|9\u001drI߼Cڼu$eÏ:L?\r%k1\u001c\u0002P+'pel=ᇦv]1,\th)\u00056M\u0011O\u0010 Η']0H!\u0005J`\u001axZt\u0007s\\ʍԘo\u0003\r=0!*q~Y4ܖ,anvTj2=\u0017)\u000b\u0015d\u0016uzLVxY~&,ԗc-;|?\u0001_ѭ籰jeP}?_v\\%\b:\u0000\u001a+\u0018T{ZB\u0012!EWjݥj\u0007\u0005\u0005\u0010\u0003\\Q*\"$gBFe\u00076]\r\u0010y\u0003. )\u0019(E½\t%\u001eo\u0014K(\u0002AGnC*{E\u000e\u0017qB6PK\u0006\u0001\u00017+9f70\u0003e&|\u0002{\rBM\u001aڿse;J՚\u00021D,\rev;Pќj*\r.Kl|)rMc}z};a9\u000e|Ak D\u001af\u001cdY'JrrtTU/v!gIw\u000bO25$\u000f*uSNv,+P+oRxx.]\u001d^q^rLf|-4O<eC[hڤ\u0019|%Z.[\nO\u0006:JVxmߧ>5\u0019\u0006aw2?ÎLYI'0bQ\u000b\t<HU\u0004CTt\u0006\u0019fr[\u0010ܝ\u001c޻e0s#7j\u0010w9A,ْ+\u001d\nj.\u0003y\u0010i\u0017ז%w+\u000bx\u001a|\u000b\":\u0002k}\u0013F\u0018\u0014w\u001fF&\u00154\bN\u0003m?O^$BlW()².\u0014\u001c'\u001eڱ\u0000\u0002|\u000e=$4\u000e\u0019WB\u0013v=\u0013eaI)ϳsKY_qݥsDg\u0005Qj?\u0014\tU.\rD5.\rs1\u0015_6Ѐ0@ؠ\u001d\u0018V\u0019ٵY\u0005j3fPM\u0010\u000fo{\\>\u0015xlsX7_5/誺AfSxM\u001cۅ\u0011\u0006s-\u0013SzMdsx\u0010&j\\T+dn\u0017\u000eQ\u000e_2?\nMY\u001dπ^\u000e\bE324]~}\u001dekD!Ӝuc\u001afx頜,˶}\u0014\u0005 ak\u000eݤLQ\t\u0000g\u0011|/#1\u0018h/f{H9M|iV&\u0003\u0004-&<ԨK4q\u0015>-E䲪␪w/\\v/ї}z8(qY4JXڦ\u0012\u0011\u001b\bg)q4\u001d$\u0014'\u001et/\u001b>\u0018،_ʫd7\b+lvՀ?@\u0013ޡi@2 @Ȭ!y0\b\f;\"#\u0018\",e\bb\u0007La\u0005ɐ\u0012z5,\u0012\u0013S\tNfr'v\u0016\u0019X\u0014Y}}\u0012W,T:\t=г>\t+\u0019hĚVzA-c%\u0013$f\"PN\u000fj;Cg\u001aEѸXMaZ8042%\"\u0013]mWH-ӊ~d\b\u0004'!DB7\u0012BYaF\u0014o\u001agB\u0003hEF@\u000fQ]\u0003)V\\(y1Dd\u000b\u001dr\u0010'P\tb\u0017\u001e\u000bC \u000eH8'\u001bԱyy\u0004\u0019m{&X`ިkH\u001a\u0013\u0000xb\u0018`ef2\u0016ج#\r\u0015\u0005@4\u001aV\u0004&,)2鄈c3y\u001fF\",IHe,\u0000jHd24\u0001]\u001a|}(hiD\u001345&DS\u0007|IcVY5t_z?l֕KcPE~೦E\u000fnΑ>ɕ\u001bBu\u0017N\u000b}e\u001a&C)\u0006KQt]>N\u001ac\u0001x3r$}\u0011\u000bFE9\u0019\u0005\u000fmCL-j@ª,6m&ؔ¹Q}ٴ%lR\nEwp\u0013mucw\u0013t=<3\fY\\\u0006\u000fd\u0001!Y\r\u001c\u0003*Ǹ(w1?ηgOk,<XX\u0018pg\u0014[g2D8\u0019:V*|R\u001e^\u000f\rkZH8\u0000\u0019\u0017UI\r\"Е;tYf\f()\u0019O1n<\n'*6\u0012T024\u0011RAEѬ0WGjTEB\u0002\u0012|\u0005'9\t;It'l$'W\b\u0018Ǿs\\\bj\u000e(8\u0015\u0014l\u0002CC\u000297\"fx(󂗢 \u001bک\u0005\u001a;\u001b~>6+Sq]\u0015}w?\u000f\u0016>2v4.o\u0013J`/l`Z~<oџO\u000b\u0001$\u0000@ܗ@Jgԡq\u0019\\ܞS֐5 ;l\u0014c\u0012?\u0011o.\u0006~|\u000f|\u001ds[Dx\u0004m܃+AՄqX\u0005n˙r Q\u001bQ\u000f\u0010=sֻ1\u00020k>ߧ,\u0018x>>ײ쎲]\u0013O4!x1EV\u0012^Q\u001aUe]eS8\rzs5hKN\u0011IK\u0013H\f\u0007t\u0016\u001d\u0018TQ\u0003vM\u000f\u0004d'as7COb@$\r\rh\nM\u00145ٶ!!\u0005ho6c\n\"\u0018\r*J\"&xD\u0015ǥ(bܭ\u0002Q%\u0017\u0006äXUw!\u0005\u00068F}ıFbCQlRVCR`}>\u001a&bX\u0015ق\u0001Ȋs \u000eò֓J@r\u001asbH\u0006w\u0005ND^6u|P\\?^\u00144Cj:lݕH\u001a:\b\u0011ᱼ)̜2lA(vS[Ljb\u0016␂l\u0017\u0006\r'K$6֩7a\n\u001c*MĉA,kM\u0015b*(,\u001a'L\u000f]\u000b\u0010\u0014~mt),Pl\u000b\u0002jY7n&ZZT\n7C߲ɗ\bS\u0018j8IO(iIYr\u0010p7-IE8`٫Ğt27q)\u00069W\u001c\u0000cP9\u0015\rk?\u0014\u0016\u001c)\f\u0005R\u001eH6-\u0017m8<4\u00020!\tn\bH\u0002Ф\u0018\u0001T56N\\]'&j\u0017?^\u0014\u0014\t~\"\u0018#1MqҞ|u8;ᠷ\u000e?e;>$ 5\u001eQU\u0014ЪhgDy^[\u0019n8\u0018*#u\u0003%%\u000bEM&/\n.Lmpn\u0012uS\u0010`t^&\u0014*\u00192\r?8A\u001cE\u0003\u001f\f\u0015V\u001f\u0003Hd\u0005f1ǋf\u0015|Qm^矡+\u000e)\n\u000b\u0007̠24ĈY5\u0014\u001a{3ʸ)13Uv]aT3y\u0004P:\nܖh7!nN\u000e}.(W$Vhoenэ2>!\u001fR(On\u001467|SXS\u0012ݦbxL]a\u000bx\"(YQS\u001b=G)/m\n]\b}=sdO\u001a\u001bW+TJ\"ƑyE)ﲭjԚ\\vz;\u0014\u0016g\u000bȖ*!\u0013h,IbY_\n\u0007-b}Q\u0006Co^B@G~\nR\u0003\u001bb\"7޵B/Ѻ'pŏm\u0012\r-&Ԋ)ю9$SnLИ\u001c69\f%$[I$(b\u0014\tx=JAqw%'G$\u0003END i\u0000\u001b4K\r.\u0001#\u001fΧ\u001fm7v\f@\u0000XNRn)ΌXm\u0006\u0019]ʒXWq\u0017\u0010Kwo&5 \u0001_\u00059t b\r`B\u0006C!yY\u0017[Zإ\u001fee2\u0006\u001d%]t?;M,7gn(\u0017\u001f;c_;\u0011[8Os,;0\u001b\u0016@Rw?Fl\t3 ~k`t#\u0010m]/|\u0017\f/ߕOCê\u0012.Xd\u0015\u0001\u001d~ шABH_:\rA\u001b\u001al=㊢\ni*oJ \u000e\\ʶT\nYv\u0014\\\u0015@f\u0018vɻϲ\u001eS8q}f]>\u0002KSoBߤ]{`sK>\u001cĺ\u0007:6ߦb7ךu=\u0017_\u001bay^\u0005iZ\u0004\u0012\u0013j\u0015\u001b\\_}\u00151'PD<SdhA6\u001e3,\u0017\u001bb؅B_0WvU#\"˷eBOn+4W:Lj֒\u0006܅\u001bڇ;Ņ1M/e1]\u001bdC\u0002(ܬB8-gѝs=\tg|\u0013(E\u000fb`%8\u0016\u0011\u0012R\u0017,;B\nL\"\u0019>_9\u0011h\u0002,9mǤl^z/ry'\f<6\u0017\tf\u000f2\n`\u0010H2~_V\u0019p\rT7\u001bv\r\u0012Bѷ\u0013iafXBmM\u0012|ֲ\b3BJo<\u0005}jawsTg\u0019E\fS\u0014\u0007=wn\u0004cɯݷPPx(/\u0000%\u0013彑m,A@\t$cʑHW\u0007z,\u0005'@X\n_\u001fU\u0018\u001cF,Heb*+32\u000e\u000fw+1xK\u0003_Wء<C\u0013DC/\u00128\u000e\u001eP2\",pjwRG3g20aټ\u001a\u0003cȎp|:\u0011T\u0000! R\u0001\u0011q\u0016\u0004d8Aƽ#\u00133(<O\u001983\u000eׇ#E\u00160T=*#Yb1IsҨ@iQ\u00149Xty\u0002Sa\u000e\u0002>wђHJcP5\u0007s_\u000f?^*GLum\u000e:_%F5\u0018\u0014}>0\u0016ǈ0Ӆ\u0014U\u0011͡$]\u000bZpt\u0019\\rq\u00139޴a<\u0001>jW.dw~\u001eWiС4C<,A}^\u001fvo\u000bsڃ~\u0007/4$oֹA1.ws۶\u000bzO$uK\u0002f;;㆔hvL!!D\u001b&\u000bawT/<ok\u000ePqºn/\u001bȑ*3׻N\u0006Ӎ\u00159\u0003FrpNG5{&y`<\u000bxT9Gы~\u001f\u0017q7\u001bfa\u001e&c֎hO#4\":\u0019`z\u001ez4ؽ)RmЯ\u0011Էl\u0006&4dl,\u0012WǏ6Pާ@\fQK:CU]3'cDﮨ\u0018͛ɒ\u000eSݚKJK#Md~~\u0007\u0013Q6/C+UFc\n\u0018ڑ\"\u0014JEK\u0003SùTg'dX>\u00145G=O$(\u001c\u0012nv\u0018b]+;\u001b\u0010X19?f㻼A\u0005\u0006E\u001d=FWD<T\u0004xe3\u001dӔWh\u0019`\u001e鲴\"c[`}Tm\u0000YeJLyΥ`\u0002,\u0013\u000bȠaV4ӺM\u000ft_?awROa5\u0016FOo\r\u0006\u0007\b\u0005\u0000-rɟ[wU\u0011=?\u000fc&P\u0019\u001a\u0006\u000ek\u0016\f* n\u0006\"^1HBEӓF&\nFp-Qr \u0010\u001eWA\u001abyA%S@\u0012.x6*\u0004\u0002v\u0013\u001dx{\u001c%p JcmNBzG\u0006:\t\u0014Ö\u001bY\u0000\u001d\u0013`}א\u001b\u00157ޅ9d\\R\u000e\u0010g8\b}\u0001;X1),ʄ0\u0010huQPXfg\tvYjkåI\u0019NETsK&\u0014\u0001n0ZQG8\u000f!Of\u00104j\u0003A\u0018al1}9\u0014\u0006_fRsص\u001aڷ^\f2e[Kٜ0b|=\u001cz&(Xp\u0011q\u0001\\\u0001Hl1pY{\u0012~ڠ\u0005`pI#\u0010~пZȒ2\u0010gV4\u000f\u001d\u0002aD w0B`B\u0016\n\u000f#\r7^=F\beM\u0016▝RA*P(~zҕr\u001dK\u000bkEt0ӆH5\u0011D-Ͱ\u0017\u0011\u001d?ux\u0006\u0005 \u0019<e\u0019\u001dr\u001d\\\u0007WQ>:X\u000f,rLӏl\b\u0006U8Q]a\\\b\u0012s7GNnq.bb\nꚱ\u0001\u00124\u001c\u000b,5\u00186/jե:OQT;ފ*^R\u0013IU~2]4UKMUL5եf5Uu2M5a\u001a?MS/4U}Tj_Tgk*5_\u0016Uo\u0011U\u0017\u001dU5PU㇪j\u001dUՎַTUz2*?TU''UD:+ {RE@$\u001f蕷ϟJ2JLJMrS\u0017i\u0010\u0002HHzq\u000f9Ё\u001a\u000f5Qxk)\u001a\"6\u0006G\u0007s-X\u0006@\u0017\u0007r\u000f\f\u0010\u0004\u0010\tO\u0000\u0000\tM0\r_k~*?\u0004wRYf\u0005<iid<Ă\n]9N\u0017\u0006]ʓ3it6\u0014z\u000er@Ĉ\u0019\u001fF\u0016K!\u0017\u000fE{6[\u0017\u0019$䀘PdpמY\u0004-8U\u00170Wc\u001ai'\u0001\u0012;[\u0014MHEM]3d5u BZ%ft/F(\u0004ny\u0019[5T\u0004%\u00070a|\u001dQpO9Jtgk|\u0013:\u0014}{U\"BR\u0011\"M\u0001cIwAK\u001e\u0014^\u0004\b\u0007\u0019ۆA\u0018I&Gmb'\fa\u0015\u001c knHLMLLwƻ.\u0001C\b-g\u000bkؖv6ch}sWDc-%,=\u0014m6\u0015%`.g\fb7\r\u000eOʱVk\u0001\u0014هմ\f\u0006ka\u001fэ$%WҽT\u0003\u001bS\u001b1AdaJz69.CZn`׎Tz*ZXb\u001d\r5mH\u0005&\u0016$\u0007npQr \u0018 \f6bbH9\u0012945C@?ei\u0015-,ZXH\u0016Hl\u0014ѝ-\n\u00043MB戅\u0014e\"\u001aS}\f3is\bMY8\u0003!\u0007$\u0012EmܱH]\u0010!\"Ht\u0003k~3baCan\u0015]l\u001cC4H[^vY0Pm#G=֚ьmE\u0014b\u0013\u0005+^:j-C\"A8O1Gmh-\u0010qʅUI\u001eH;GDo}^𥈕ZDJ\u0002d͡=ͨh\u0011\tAfܸ\b8z[p7+חEUPaK|m$gһb*'I\u000eċ\u000e\u001bvhiY\u00110h*^:rv\u001dtx\u00175iʚ\u0011`i\b-B,b-&m.:O\u00016Lm@ºeTۂai$\t4seqм\u001c#!\u001f[\u0012H\u0019ի5Pﶖ`C4+ޱxW\u000b.;BXeo[\"\u0006ذث[&`(&j\f\r/\u0014H.Fp\t>(Nh?h5\u001a9ic-kT}\u0007Sq<$\\9hCa3Ab{\u00167֕X8[R\u0003%ꐜ\"zJ\u0014\u0019w\u0016\u001eMrQiP`b/#J6\u001cR\u0002p]&Yv:\f*\u0001\u0011PzKLO2/\u0018j\u00004,U4XX\r\u001dN\u0015\u0018\u000f᠂\u000e j%\u0019Ei[26o\f\u001c೩hO\u001d\u0014\u0006٫hY*V%=%Щ|\u001aFd:\u001cG',iwQck_\f;7W9\u0016l\u0012VMkV\u0019ZFtc(g>ԩ\tN1Diac\u001a\u001c :ፓ#\u0018\u000b#\u0013jDE\u0018!\u0016OQ\u00165_RG8?>.n<\u000b\u001d?\bQU.z)^}vOA^w%Pn\b$QFȬka\n,PE\u0005dxG\u00116H\u0015oY9|ϥ\"\u0016©\f;\u001fg\u0005θ/k8=9m1To$dU6\tlMƬ'\u0013=<G6[u֥onzӃ#g\u0011KD\u0011\u00022QHlZ]!ΆWϠ\u0016sE2iϖz\u001euCb\u0017e>\u0006HK;N%fZo\u0019P7co]\u0018<\u0019L4ɲJ\u0004\u001b2,\\]R.\u001dkr \u001d\u0011R_P*d6Fc?\u0011+K[)Ҙ-$Vw^*Y(ML\u000byY*\"U~\u000b|v߅\b!G:c#da\u0002υѝ\tC\u001dk,g0R\u0004rw\u0019\u001a'\u0013\u001bs2\r&\u001c1wBd|z32JO>\u0011\u001bqlbI{9ղ1KbYxN\u0003z#DLZ*j;\u0010'՟ƋN!Ǥ*gI\u0007\rz<>֑drO\u0005\u0004]ڶ3Ur 4I1U{\u0013\u0011\r\b˪IFo\u0005\u0018/p\u0000Ö\u0002k\u0001%ΥV\u0016\"JK\u001c4}XD\n$嫈\u0003\u0018,.\u0015Z\u001b_,hU\u000b4b\u000e\tYäoh6\u0010s\u0014CEHr9bgb\n\u0019g\u0004E}`z_Ǟ'T\u0014w9-W6dF\u0017m|i[ɖ0+޷\u0003[tu@&\u00051b\f-JfmG[\u0019\u0019M\u0016\nג(AN\u001cNV\f\u00158K\f޵m<Ê-\u000eF\u001a'\rtVH\u001fK'P\u0016ԅ?QR\u0007\u0017>ccV,j-,ݪz拃՟p0j]ڠ#Dmܮv&]t\u0002S$\u0007c#\u0001Y/s3:55k38\u001fq\u0017I]2VʼE\u0002O\u0011k{\u0014n!$Y#9\u0003O\b\bCq9L\u001dE Ժ9ѿHU\u0016E\u0016%]?oJW\u0016aypk\u0018ϻH~3mbRU%<隰%~\"Rxx7Ϗ\u0012QD/!+?\u000bb{>u-\u0015v.J\u001fڒLZu5\u000f}\u0018ŝ\u0015m+>)\u001d#\u000fQ*<J26# 6z&&\u0016\u0019B.I2p_\u000fLqWݴ|#\u0005o\u001a\u0016-8\u000e\bbtDi,\u0016K_?I_\u0002$KoېM^u\\3Q(ڸm㻝\u0003⭓xd(dׁ\u000bWۖ\u000b\\(2Jk{FLLe^>G0\u0004^PYh'w'Yѱf:\u0016F@TC#\n\u0003j\\C]Rη1۾h0cS\\Ph.ч,c\u0016\tO'\u001b}\r$Ojk?Ǫϒ\u0002=Z7i|M=\u001dY\u0005\u001b\u000e\"(]n6u۲&1~ۘ\b\u001d\r=^z\u001b~kI#/xĆע^6@<w7땸\u0015$6\u0004.\u0013Nh\u001f߶ង\u000b}bp.Ϡ\f7deԑ6ZeHӭoJ̪{JxNX.k4(UV\u001f|k}}Ann\"[-\fhQ\rq^$G/\u0003Bkd=Yh\u0014Z\u001c2qq]o+V*gFlT\u000fw~#خfMw\u0001\u000b>n&0\u001eW:I\u001f5\u00048+\u0010\u0014``C\u0000\u00101Cl0p?݀du'ؒh\u0018=Z֯j+\u0012jQ^`\tYat&?{rq\f>`\u001b d\u0004U\u001f5\u001e\u0019v\u001c\u000f\b|\u000e\f6YODpɁNM9ML\\<\u0010Ny\u0004q~D6ox<ve@\u000e߃Vby)1w$\u001bEr\n\tG\u0002Y=kwڮK\u001d3ְ J%9Eg\u0014\u0015]\u0014Xk\nIc\u0015f$F8oC\u0013\rB\r,9U\u0006E2*\u001cApC3\u00105OG9\r}&8G1A͎XW:\u0005FXE~\u0015\u0005P팖\nXt2>ו#kOK\\څa8ng/;Z\u0011&\b*2UBɶ|A\t~\\Y[:_qS@ݺ|\r!6ŔW\u0016?'y$5\u001aC\"A?0RÿC-\u0005٩ʺ\u0019CeWg7Jz{A*~\u0003]H\u0006yz<wl'z\\nF\u0015-q>\t\u0011lI\u001fڨ\u0015\u0013\\ɇGm\u001aϳ\u000bg&FXf~\u0007\u001cQzFܽ^֬tJeig@\u0017\r\u001a3vk\u0014\u0014[7C.NgG5\u0006\u0010\n\u000b?\\\u001ekzb\u000b\\Q\u001bgqKV\t\u0005\u001am5ۮ\u0007s)dFEX\u0005g\r\u0010W\bi^<6s\u001cj\u001b0ݍr\u001cafZ_\u0010D0.Ls\u0004nCzV._\u0012\u0019qt_1ϴ\u0004#If2k\u0019ưk!\bu*A/<\u001f:)۳y')t#0\u001cD}kNشmF$+\rщˑQ]&9v$G\u0010\u0014\u0016P@1t\u0006ZBBW @3gfxې|B}@\n8(F\u0015D>?Zig\u001eǣrq?N$ABfWC%[\u000eThCŔ6 P\u001flJDx Dh\"\u001co珿2S\"&\u001f?n9&\u00115ԃ?\u0013+\f-k6s^_B?zWBX:]~\u001d\u0016Wi#\u0019\u000bE=L\u000bvQ&\u0006nouzz#\u0019$j̋;-\u0013m4{x\u001e%\u0000\\\u0017/(\u0017\u000bft\u0014\u0002?Y}ćѲ:c\u001cuf\u0012yℍ\u0010\u0012E23w\b%Wc\u0013X5\u000b\u001c'tJ&o[b\u0018A/\u0001U|\\4\u0005+Ӭg>_\u0001sBz\u0000z!)2Sŉ]-v~\u0016^'<\u001e\u0019i\u0015d^1\u0000nUۍiPu\u001bnb\u0016>|T>Z;b\u001f_\u0015%dyA{\r`xpo\u0010iAg`^C@}9S\u000b\u0014ja3('Gߍp v?\u0003\u001f\\s 'a\nBn69Q\u0010W@b\u0005\u001a݇\u0011ٻΚo\u0016\u001dWgט$iGXJ\u000b<0Fy\u0004\u000e\u0017̜\u001d(\u001eV|l\u001f\u000e\u001c|*w?a\t<@S\u0011-_\u0018t\u0003\n^۲<\u0007\u0003;!㖎l\rjsg_\u0007Ņ\u001bh\u001e焖@l(\u000bź7\b&){;<\nۭ\u00197[\u000b\u0007d30\\\u0016f\u000b5\u00017㤌s]AN_fyڔep)\u0004Ժ_n\u001bwUM3ڀuH/URǱ8\u0019\u000f=IeV|>̈́\u0013aZSUlD\u001e7S-qr:rq!\u001e\\Tï\u0015d\u001cT4ݯ,\u0006\u001a6\u0001\r&M\f;4Փ.\u0014\u0005?NG+\t`\tbݦ\faGO\u0003Fa\u001a\t\u0019:\u0001h*~\u0017Ւ8\u0013\u001a\u0002c\t\u0010v[fs\u000b\n?\u00199{cH\u0000(fF\fck;\u0001Oil}\u00041#ǈn\u001eNU\u0015mԋﺶjuDe?Wci\u001dc5Z\u0003@;Ag¶[ڸ7\\M6hA\u001eYXo⪬6\u0016B\r`ڌC~\u0018v\nc;Gx7DS!^J\fb\n2H@\u0014hτQau'?\u0018k3y2;\b\"rڄX\r:zMlV-q\u0016w =4^`\u000f\u0013nN\u0007,Xp~هhH\u0003\u0007\u000bY#HA\u0013\tcg\u0000T\\C\u000b\u001dWCΒK\u001a`E\u000b\b#zp3RLĸ@!a\u001f\u001drs\u0000y߫5|\u0006a\u0014JZ\u001f*U_\b?=J\u001f:\u0003I':!S4\u0006첚\u0013V\u0017kq}\t|j@vF[,{rO;^pD?\\4zHG3$\u000e+\u0014}\u00166˞zl|۹N<}\u000e\u0015ܭ$Bkpt핁9Itc5O╚Ų\u001fM9\u0011VOhkt؊oi$W \u0006X)\u0004َ\u0001u;\bT\u000e9\fH>d\u0013>3ېڰ\u0019P\u0002i 5+\f\u001apBT6kvm\u001eg}\u0012\u000e[+{!qCZm\u000b\u00185EA͞Oe7s3Pi{7.5ǅl-Df\u001b^\u0017Nď.5\u001b!BB\u0015J1<\u0018Z)K\u001cx\u0003\u0000[g\u0002=N<砨1\u0015Z\u0000,\f,W\u0016\u001b\u0006\r09xd^1<ϑeØoItfhBu.\u000fku策W\u0010F\u001c{<͙}\"2\u001c\u0018\td9\u000f肂E(к\u001fŔ;p8C5EF \u000e\u0016n\u0004&6N+0IW\u0018j!`KI\u00193\u000e@>v\u00136G⸛Yt_bF3z\u000bP⢃^h\u0019\u0018_?ؤ.;jt\"\u001dZU\u0006q]Yf\u0007m\u00068DOkι.'b5a@g\u0002\\NsA]O+}XĢ.U#aƃY\u0010 -iOu}j~)>\u000e\u0000heqCfd,\tǂmD+6{ m\u0003\u0004\u0000{i!\u0012:}b44*\u0017xH\u0016^Y1qw8\u0013'z.Y5y\u001cf>^\u0007?1G*1\u0019W}\u0016\u0015dF UUouP$.\r@z@\u0018룐*(屮Ƈ7\u0016p-\u0018Q\u0015={4o/^\u0007\u001c\rO(wJ/eQH\u001eGL\u0005CsT\u0001o;@/v-̿-W<q>\u0017.KbZNd섧?|[A`%\u0019xz$x\u0003\u000b6\u0001үNQF4\u0003T\u0003{\u0014?\u001dj2\u0013j7\f\tŢa)#s\u001bR!y3m#~G\u0018B%\u0019\u000b\u0006\u001ab=>y<'dF4\u0010w9;\u0019\u0016N\u001c\u001d\n\u0013\u000fϵ0\u0007[06 a/Eh|Yg\u0013-&C{*RӘ/5үj\u0007M:63S|\u0017%\u001fL\u0018O9OBtQ,Rts{\u0014aO\u0017̾ˠ\u0001gLOr\u0013\u0018J#ɔ\rq(*m'Osκ[{ڻlLB(ƏXȕ '1ͦ\\\u001ds?\u0010\u0011'zuyyzJuۚ}-o׉T-M\u000ew11LLcj~\u000eC\u0018\u0019eӉt\u001fO\u000eaOxU\u0016\u0013}uB\u000f\u00104s2Z\u0006lNh.x\u001e9%jMѝ~\u001buCDg1zg\u00134\\zyfsm<>GN'882G؆hL\u0015q\u000b('\u0003P\u0016B\u0014,joK/r(\u0015XJi*_D\u0011\u0014ݚ֪ZIӕ)\t$\u001dSc37:EXS@VjXkWV*k@\u000bq4\u0016$\u0005j\u001b'\u0007\u000f\u0004`UP\u0012֚J\u0012[P\u000e.\"\u0017'HlTN]\u0007B\u0012zL8\u0013qk+\fo|\u001e+\u0013\u0013*ð-mٍ9)rC-mK/Rμ\\\u0014oK?\bj>ژB\u001f.m+\r\u001cٻT>Ƕu(ﰰՌ=3[R\u0016_\u0006->A,\n5\u00118(=ZP\u00021\u001a姿j\u000f\b\u0015\\\u0007u)!/\u000fG@>i\u0016:* YN񞳜mR\u001e-ݳts\u0015x+i\u0002\r\u0007o\u0002\u0002HlcXG\fHYbIwY\bXꌨ=~YUDf\u001aC\u0019-ؚ߳+ѻAk\"\u000ek2\"qZ\u001aҌ\n\bF9y\\yc\n\u0003Rˬ/s-;ZS\u00117@XU\f(d|Q|lt\f<j\u0016]\nSQF)ưIk\u0000픚k\u000fg7tG0܃\\cwawVZ[\u0016Ƶ}OUQx-\u0018jGjXsq6Bˇ2\u0007_yjF8R']?0f8\u0015\fo*zw(Iej\tY~\r,`|\u001aĳlQ\u001arJHٓ#\u00017Ϟ\u0014>ұQ}!l,@'6Ki斻՚\b\u0015*y\u000bVڝ|\r\u0015\u001eyRN(v}+N\b\u0015\\\"3Kv\u001fй=ıMƭM4\u0019\u000brDyw]7\u0010\u0018\u000f\tp\fD6K!زVsjUC`\nꪥ/_3-\rYJ4LADݶd\u001d\u0016u!5pl~\u0019:C\u0004n:&è}y\\J-0\u001a$v\"ԙ,̭G\u0014\u0013v$Z\u001c\u001eQ\u000bU!w3eY^\u0000Z\u0007s)\u0012\u0004\u0015R$y\u0004D 17GMO?Lޖ\u0001OV\u000fXлg4v+ڝ}듗(5kV΅~\u0014J 9X(u\u000f\u0005Z]L(|\u0011\u001aotQF\f+\u0005Ei<4i/G>_tm\u0014/&o|^,\r]\u000bu(Ao\u0015wz\u0018$?.t?\u0014]xB\u0005&X.`T20ÞMaR+\u0016l(c婑<CR̀8$d\u001cHcuIA>\u001f\u000fD4y\f\u001auK\u0016xT2=\\3$\u0000ɳ6/wR\u0004p9\u0000jse[Jr3^k\"%\u0007\u0004\u000f\u000bY@PIoQAKˮ\u0017@EHd$w%lOe6~UYXƒ份LyI%dzP\u0016Rˈ`Db\u0017R雌Q=\rO&&I}ux\t\u000f\r}Ys\f\u000f9fi:ukf&2\u0004,</u{_ie#}oki\u001bk߇JoWy{$Ǉj$C\rr\u0016sIد\u0019@:$\u001c-6<Ew4\u00017ፅ2\u001ch\u00162$孤\\<IB*v\f3d~ ɕ\u001ee?d\u00012\u001f4:\u0000٪~5\u0017B;y\u001fr\u000b\u0016/N`\u0006Q$`-0ɕ\u00026O=ť\u001aHB!\"kI}X<˥Z76`?X\u00178kT\u0002yK֋|ЬE3Zk\\cǾta7\\;U?\u0015 AWь]M\u001eiE,c\\r$׺58}Ȓa[\u000f+T\tkT]\u0005E;aS\b9#}* OrIևQI%nž$_>ճ\u0014ri^:\u0010+uyHp\r\u001cwITj\u0007Ab \tRX+,>T7yy\\+Ȱ/ȳՏ̓vF\nDI޵\u0000)K&[5Iʟ\u0010h |h\u0012q\u0015tlU#|WZJNCkPC\t\u001fm\u0006oe\f\u001f\u001b<t\"ec\u000e:p1\\kQ\u0018]o_kZ]\u0016Rk\u000b\u000ep\u0019Tw5;.=[>X)*\u0000)\tk>\u0018ϷRs\u0007KuQ1׺Y(C%(zQ}gQkY;\fL;\u0002buma[?\"U|PͶٵe\u0004ٗ2}nKC|#P7rm\\xq|Bh\"\u00115Lr/cEZ\u001b+{Z8p:\u0003 >tG`js_D>xl\u0014~#\u001f\f\u0007j\bruU\u001ea\n\u000fW\u000fi&\bĒ\u001fpl\u0017\u001d\u0000\u001d\u001f&\t>p\u0012\"5=!?\u0001'R`\\\u0015\u0016tO$\u0002\u0010THR\u000bQL\u0017\u0005덽\u00191\u0013w2\u001bX\u0011ʐ%:ak+ɽ轼F\u000f%\u0017C\u001f^\u001a;\u0004\u001f\u0014dD\u00067\u00173?\u001ffڻ(\u00003ayv;3\u001b\u0000\u001e?x\u0017~9l\u000b3\u001f)\u001bpdoL\u001fv\u000fWk5~&G\u001d\u001dIh'R\u0007\u001f>CIGJW\u000b(\u0018\u001bz̊K?\u0001\t+#h8>aP\u000fxcS\u001eBnT]\u0015q6D\u0016\u0017~?\u0015OmJLw~h6\u000ff{>\\̨\u001a6odq1{z'3Ƹ[\u001f\"dg\u0011Edvf\n _Խ\u001d}\r1ẐFS|NCӼvZZJ]B&ޛ/Sq\u0012Ks]\u000f>3{\u0005%Tّ$1\bD]Y\u0007zB-D}u<\u000bG|de,1K\u001a\u001f`\u0018\f_G2,3(\r_\"9\u001410?n䲛PX垡k刣\tD{b\"Q9\u0011ѤW\u001b7C\u0013V\t\u0004\"O~dO߇z2\fN\u0015G6\"[ߐi\u0004zhr44u]+k͠ow$f'ag(\fG5M\u000e5\u0018m3pj\u00038\tD\t\\z\"\n<\n3NsX&4é7\\l3ULee\u0016\u00198\u0016wZ\u0011z̞l\u0001׻h՞q8W4\fq!$\u001a\f?+m@}\u000fJin$31562]?Ռ2P\u000eV΅a;\b?S>~3#\u00071m\u0015\u001bպ\fv\tߚiʟ<=w\u0011k\u0000L J( ckD\u00025PBkp\u0015dD.t\f\bDxEpr2\n3\bÑ\rc\tdLGDTN9\u000e:\u001c\u0007Fu~>si0flU\u0016G\u000bԄ>ZjhB$~#X:fcC{A\u001a\tC[*u\u0001j\u001d\u001b\u0007\\\u001cg']}_k.zП\nD=\u0000:>;=IYk\u0018yM?|\u0002|dҥY\u0016\u001f\u0010%=|/:==AT&X\\,JЭON=&!ǥ\u0019\u00151\u00105kzpsQY]6];<xKl2>`zh_i\u0005,pA\f\u0017-X\n`g=\"X紵'J0VDb_6Lՙ@jO*(\u000ffЊ=\\ \u001e.`j\u000e{&z\u0011<&fb]K.xo$giz\u0001,T>\u0014nn.]$̌RF\bf`bX-5 \u0006k!z^\u0013-cPoU0QY\u0014i}\"ѶMɏDsI5%Uܟ=q8տvx\u0013Y˭aK~b*4T\n\u000fp1P\u0019\"r\u001cG\u0007O,\u000b\rmbcҮc\u0007vgwAE׏<\u000bfV|gֶ\u0013&-`=^$\"7[{s\u0015\"}׿\u000bnh@b\u0001e5ZD\u0006[-L~'CuD[\u000f\u0016\u001d#\u0012#ډJ~8m)ihUqvVlǍ\\s\"aя\\[r\"\u001f˶Ltn/ll\u001eQ\u0013\u0013DFH~\"e\u0016\u0003\u000f\u0003'=WE/1\n\"Q]3c҃96$Ꜥ7\"݀GQ\u0007{0p^\rɒ\u0004Q\u0015x+8ʸ$\u0019\u0006`EuBH e\u0017\u001fnN\r\u0010d:\u0003X\u0004\"\u0015KxxJ\f$x=U\u00052~\u0014_3t˪8F [A\u0005d^\u0007R9!\"S`zEǦKV\u0003\u0011}\\٥\u0013\u0004sZ{o9{e\u0002S0Nnͺ\u0002\u0019]>}\u0001:\u000fuk2\f~5p\u001dP[z>Hq\rߑb\u0003l$\u0004w[h׹~E\u00196>i7W\u001e(x=N8K,y\u0018:5\u0003\u0011-x\u000e2q\u000e\u001fGSw\u0016;6t\u001f\nfEE;k>(2\u0006/YV!\u0016E\u001b\u0016\\Ed\u0015Rp\b\u00167^'\u0011\u001fI\rb0\u0019mzAdx_Eڊٌ\u0014JŃ7f\u000fǌh\u001a6F2gZSvte⢴g\u000f\u000b ë\u0013'Y2j\u0018]E\u0001؟00m0y\rSw\rpb$P~'\u0014ЯhGcUo\\x$a~j\"iofu}C[=k;4\fZK\u0018NK\u001bEϷ\u0006\u001bp\r[Gc{hrw>*\f\u000f\u0014`\n~Q\n\u001f\np\u0013\u0011ՄnJ߲td\u001b쏊\u0014\\t\u001e|x9\n:\u0017B:\u001a\u001eYtо\t厢7\u001dW\u000e\u001dU}#[2\u001c:(rA\u0013ʡjAsP!5(IB=QR$\u0003hC\u0014FqR\u000fmzh\rD\u0018Gm\u001dp&tpnܺ_+Nf,\u001e\u0013=\\_\u0016yŖy\u000bX__D\r\u001b\\gv <s\rq}y.o_x7!ڑd׽0^F.Ysn\u0003uMPjX\u0016\u001f\u0012->\u0014Z\n5-G{3\u0005#s|poӰ(\u0005ym^rf{m8=W)Xtʾw\f\u001f#%_\u001ezwϿ\u000evD>\fgy2\u001bD\u000f\u001c\fs;H\u0006lb$CWs\u001c<{\u0005\u0018Uv\u000f5}\u0006\r>|YsɃ[*\bR]\\\u0011N/ڧ\nT\u0012X\"mzv\u0003^D\n{\u0005d*l\f=Hk7q*>ណ\u001fLm\u0014Ë\u001aɯ_0^\u0007`x\u00187ka;/z\u001fdhm6ɧ`\u0006ruɃG\\\u001fD\fS|\r~AT2<m\u0015Ӛ/=L\u0003®q!\u0013\n\t|\\2\f\u000e$x\t\u0013-$*k_;曙\f\u0003c{\u0006ܫ_Ea\u0019\u000e^\rZV0Lh@\u001e=91QM\u000fp\u0018T\rPD\u00073O80\u0016,-DTyDҲ\u001fE\u0014|\u0010*\u0019T\"Y\u0019l9ISK\u0019\"H\u0007`kk4\u0015Vݮ3N\b\f.+Ir\u0018׊q`%5iÆ\u0000E\u0002EP\u0002(\u000ez>(k%\u001dkcu|`/\u0011XnDru=VI<.\t\"#}㐼%9\u0004\u000f[Ò]z\b\u000e=Pܥ]zX\u0007=\u001fxi\u000b!2\u0019[J6pn\u000fTStB@ǞW>\u001clt|Cf>[l(m\"l{\u0011&\nz?\u0015\u0000e)Fa{[\u0000\u001f\n\u0018\u001fF%\u0016\u00157\u0012\u000fk\u001c{ҺU\u001bX\u0007{\u000f,\u000f\u0010_\u001eM\"j}Q\u0001\u001et|V\u0003Y(oF񚓭^ܫ^f/Z\u0011`}`ԕ&/RQK02ʧ\u0016]\u0018Ẋ\u0007\u001b <^<ي^ԫ\u001a_f~7*_^\u000f#*\u000ba;|[\u001aA\u000bڅܢv\t{gt\t\u000f!\u001d8̮p\u001f4\\\u0003?֡~W!ݰq\u00010ҽ#幻#\u001eڧk^\rDTOl\u0018\u0006=c[\u001d)?lQ$\u0000\u001a9b܌\"CJ?F2׌\u0015im\bṄ\u000f)]^f6\u0005E:dn{-ϓ\u001fR\u0018O\r4)\u0010\u0013\u000b\"[Ǵ!Q=5\u000euvx\u0015E}`\u0019^7R+&j5[\u0007H\u001bʺ\u0016\u0013\nqHe3\u000bqB\u000fw:S\u000bz\u000f\\Ɍ2+Ȍmn.!'GEKM>eUu\u000f3LIMøڤ\u0019-.%|P%'\u0002\u001ft;~\u0013w\u0017c\u00106m\u00010.8)t\u0010GbM:\u0010ta9LY?(|2\"*Z6\u00015J(o,b\u000fw\u0006{P\u001b\u0002L!(Ү[\u0012\u0010\u001dA+TA%r.\u001c;{@\u0007\u000fTcẓںW\u001dic+\u0007hey٪rP}]ڀ凾aB\u0003\u0011ڵ^JU:4\u0007䦔Z\u0003\u0011Emvϟg]\u0012{`&KNO,?\nCM|\u0013^\u000eʽE>\u0003Kߚ?@\u0012\u0019\u0001\u001d~P}G\u000f\u0010pK{> \u000e6\u0019>բ\u001c{\u0000 ܋%|@?=\u001dlՋr_cێJ\rT\u001aFn'7x}\"?Eyc6\u0002K]+_']{YmU\u00193w\u0001Skvfs?VC*G,~\u0017>\u001f\f{`)p4u2j!8N㰲\u001e(U\u0016~L[\u0018]\u001f{iaG\nV+\u001dD6Q^E}GR!g\u0002₰Y.ʽ)\u001f{W\u00066֡C\u001dÍ4{۬=x+xjߍMΕlj+H/&j=wOG+\u000bKSgP)\u001fFE\u0000Ú\\ b\u0017ޓ4\u0005\u001c\u0017q\u0011\u0000W-eiFfKԭ-88btPha>\u0015t@u6hAW~!\bǽx\t*k:i\u0010QE!A\u0006!?yh\u001c>F\u001e\u0015!R.\fB[@Yb\u001d\\y+J\u0005Ժ((|\u0010\u0011|x3eTS\u0012o7'J\n15g\u001bg\n:Ko07\u001eZƉ\r9 k\re3=<}McM~T'KNp=|\u00146gY\u0007\u001fu>K!NzROS1k\u000f8\u0006c9BlZG<N0\u001f7\u0018o7fj?.Μp#}S\u0012Kɾ\u001ew[\u001alD3Q\u0011%*Y\u0017\u0003\\MsX/m`I\u0007dh:݆IŃU\t>d[m͡Z\\qrST\u0016M\u0012k7!\nCJL\u000f{G\u001aV9\u0010zlC!.]\u000e\u001eAj\u0000L5VR\\q\u0006D\u0014Vg\b\u0016\u0018[$üj\u001e=Nas\u000e`zQba\u0011\u00197\u0012v\u000f%\u0015qX|5#B}=T/#\rTpHyn/ \u0005ǥpuj̅&6\u0006R^$KL\u001b싹jOb/gkf\u0013z*\u001ebRoג\u0019Ĳa\u001a8`N${w[\u001d\u0005I\u001bȊl\u000e\u000fXO֚4\u000e5#lKJ1jJ\u000f=̺KZ\u001aI2\b#!I˟\u00174_$מkڪ/\u001fت+ґ\b\"jl\u0004\u001eiת\u0006l<4b\u0006\u001b\u001dtT\r$\n\u001a|AJ/07k$J\b\u0012\u001b0Ȩ̏Q/\u001eJd/m\rr]F\u0007I3b;J\u001dd|d\u0002YX\u0019Cl=n\"\"y&ۚ\u001c\u0006_e<^\u001c.J|;}\u0003C\u001c\u001d<MqiøK_M\u00103Ҩ\\1J Oǈ\u0004\bRph@p\fc4\u00079o/;ǊCZj\"H\u0003C6\u0010y]\u0014_ba7!\u0004i6\r-Ay\u0011\u0001vX\u0006d$\bH\u0006;k\u001a\u001a\t@\u001f10!s9\u0016oǄGz\u001aKc#YM\r\u001f\u0015Zkv-lqU˅޶pfM}r\u0013Z\u0014\u0002Q\\\u001b\u0006S;юV4 ?j\u001ax\u000282\u001f\u001f\u001b3E17Єh2?(\t\u0004lAOǖP`\u000f\u001e#\u001a%ίjwDC׆yL\u0017␍\u0005v¬Cb\u0006xmتu\u0007q\u0011:(p!ٜx0\u0006\u001f&\u001e&Da\u0017ے˥ǒ+jy/R˕̥=\u00061\u0011-,L5\u0012a<\u0006'9\u0019i\u0010t}\u00198#\u001cF s,\u001bZO'tucnJ\u0017nodVַ/nI-u=FOۋ+\u0004zxl6{\u0007]ɡ!n\u0006-\u001a\u0004J\"e˰\u0017\u000b\"\u001aYjXq\u0004uvI.[Y\u0019E0ocMMilY-c3o0<\u0013G͒~RᰥCeD%1Bި{I\u0012ǬR\u0001IQ&jfU6JzjTSj;IjfUFdGQ?\\y\u0015)+lI\u0017a*H\"1O&+C\u0004e(-\u0013\u001c-V P\u001b\u001bzJԆ\fEW.Uv\"'Ts!\"]&N]ͪ \u000bMjҺZD]eܬFK+\u001164\u0016Wqժ\u0011HΤpz\u00130H#HTT0IEߌFk\u0017\u000bCbS\u00045AoFD\u00167*)(\u0015\u0002m$݊\u0006Ψ*[UAj\u001a'7\u001a_}eug\u0001\rT\u0006w\u001a\u0012vB\f \u0005eq\u0015A{\t#:\u0017c\u0019\u0011$\u0014]\u0014\u0007qV\u0012\u0014$\u0015@22V@&eSAz3v'Jցp\u0016u\u001e5ʪ(vF:f=c9\u0017),\u001evEeF5;ѷ[#װ|3m\u001873ir )X61\u0004T\u0001\"X6Pat\u001c5\f@d\u001fYe\u001cP+\u001b%Ś@)\u001c)kJjN\u0000YQ8ɖ\u0001\u0003\u0015\u0005\u0010DC\u0014w1_T}ԉ\thI\f&4JksaQNY`Đ\u0005kb-qgGdٝ\u001azݬdX(|\u001by\n]Vkb9N[0δ⅂lΠ:6b-;Qd\u0007d\"(3\u0018wlqo\u000fK(\u001b(2\u0018\rv\u0005=8M)BaQ;'Y1e_\u0003i\u001d\u0005bNiN׹rيQM/=xG_ݩqF#5`*{FDc\u0002z&\u0010.E:'\u000e\\Xڀ]m9\u0014#Ut<5\u000b(F^B昕\u0010<Ѥoj\t;\u0011ƅVq\u0019F&\u0015ЙЌq|A\r\u0011'\u000ed\u0011b#lCe\u0017aڍ<K;Db9ka+{S]>AЍ\u001bx$c>\\ܹ66+r2^REfffq=\u001b%ҖӢk{pیCQ\u001eow`\u0014N&0wdv\u0011}O[ƘՀy(56c@Ro0-\u001aYg*ͷh\u001c*L\u0011gV>\u0013}s˛5G\u0019%)\"u\u0001\"A$i\u0003T\u0014ZL@xO\u001dԻ|\u0003]׬\"mG&˔w\u0017P%/\u0013\u0002!`Ђ.ج\u0010FS\u000b+O_jv#\u000ei@Ϭh\u001a\\\u000bu'\u00165j\u000ejE(K\u0014^iřbFEWx\u000e'8Ug5v\u0007ŕZ\bvQǡ\u0005/2H}!wX㲭R\u0003m\u0010\u0018'\u0010NOɍUQW\u0004Չ֢PA,JubIyè ]D_ȣeM&\r\u000e-Yɖ\u0004V\u00153n+h\"{1vm֠\u001d%wЩJry.+ZX=]l\u000b@\u0019u\u000eo'VS\u0013-W\u001a UA<\u001f\fzˊV֨1َ\u000e\u00149NS\f>V\u001ci\u0004X9[Ȩ\n2z\u0019KnFTC\u0010:ENW8]apء\u0018A;\u0014|Vq\\wȜ\u0007DT\u001aԌEo_Qt\u0015m\u0011\bQ\u0016:\u0011BA=ST3\u001b3Etze\u0018\u0013TI/Da\u0010A!L+$Ʋf\b\n1).ƥ6\u0016D\u0005I-95!](P\t*ώ\t\u0017)q&,c\u001f\u0000)2PO\u0001\u0014&(\\w\u0001\u0013.V\u00134\u0007<h-%n\u000e\u000b+W~ԓAn\u0001L˖2rt\u0007*6akV!\u0003\u001cCi\u0006}\u000e\u0013ک5;F\f;eF0\u0017P\\حP\u001a\u0004]jA\u0000G,\u0015\u001cAl&\u000b98:˿\u0000e'\r@_az4}j\u000e/O\u001e(\u001fMr\u000b\u0016&8\u0015\u0000\n\u0000THnc4\u0013\u0002B;\u0005t,\u001c\u001eX\u0015\r&V2ɲ\u0001%ׅ0\u001a,NV\nE}ܬS\u000bmZol\u0005~\u001f<\u0000SWUB\u0000ǔӲ1o\u001bpt*GG{y2+O*:<Bs٪L'Eح99l\u000f|.\u0002-:f̗mݡ\rOҥ\u0011XRR}\u0016b_-W_:>z*\u001c|jy$\bQ;Z\u0006ד_>?>yYIG\u0011onO'c~\u001aOh\u0019v%?~\u0011-\u001c@Sy:y\u000e\u001d\u001e(a_>{94O\u0017ҭVf{1\u0017S\u001dw\u000b';ʌo\u001fO&\n\u0007M\u0000/xX\u0017\u000fN\u00143\b#;b\u001dSg{ʂ~x\u001c6̉\u001fZyQ޿3\u0013C50\u000f'\u001f1¹r6\u0015Ȗ~%b\t渿<\u0012|gKC\u001e\u000e_3^zDS\u0013E\u001cKnk\u001fX슍IT\u001dGAtlb\u00167b(Ө<b~V[l+^\u0010L݊Zo\u001e\u0000-\u000f>ʇo\u001f~5ʸ\u0011n~Nߎ4\u001a\u0003C@&/֫%\u0007A\u0018^]XZ).ݙhB\u0013`\u0002хh\fΛ\u000eJ FWh\u0002̼O_-g\u00076$%:x8\u0007]]\u001a\u0015:BԊ&{HWd\u001b%b\u0012bzx? bh_@C\u0007b\u0000z\u0001.\u0003hݟ0So\bX(@\u0005\u001bW-\u001aQtᇆ3g)7+w8V\u0018xHw}zNIC|$:Waš\u0014p\u0012\u0014!3$x&4%[\u001dӂԣ\u0011|8A(\b\u001d-r*Eb\u001f0\u0018O\\1ioH|arX\u0006-5\u0000WU\u001eF}\u0017`\u0000\u0006Q\r\nendstream\rendobj\r28 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency>>\rendobj\r69 0 obj\r<</BitsPerComponent 8/ColorSpace 70 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 39/Length 771/Width 82>>stream\r\n8;Y8c4`B(/&CjflOpnb_d#LO1dQg`HOoY[<da84b%7QXQhRn.$@\\>0gam%kN+\\nOh\nF`#b$n+9/mN_#aN,t6TN*%g%g+5]p;4KY5C80aRJY'+oM#XKW*>mQ9X@pQ!@'mY)Y\n@i2V=6q:WK#78)=Oo%Agj\"Q<eM@lARO<_6u31kkc`<USZq%a&P\"!Zucf\"%rYc7LBY\n&Cd=Eg%k%4&/,U>3?4G9`2T.:JBJLak?!/?re?ODW\\137l`_@kSHP[\\$f+>Q`b;/]\n;`7&E5oAl-PghL34U?%el=6-0!;p6E+HAh\\AYl25?r^SQnJsB;W-\\-1=RR6IO`L]G\nEK69Td5f50qf9;Rol/tsCa?g5];CD)OcClej+9gsh:VE2!&'HpQK(A5@_sY[/&Zr]\nBG&5a:0t)b3JM%`iMkh)l@(5,\\mi_M949tX5T3R1qf0%!hPkjO1J:i1Z<A(1E&Gg9\nScRgjM(Me%fL_=&:ne/VnEZR#8ZF0SlSF/qFd+odgt4</lFV*kO0NKoA4'GRHhV;c\nH&q`hZ1.$#&biRBATK$;c,'tum^[fEr\"VOd`+V2)?g:doC\\[DNedj-cJ(I*1o,G_+\n4oLpbgLkW>O66)+[:9VaR0@E/$OG)4_I7`[qB@poJC\"[>4-\"JXg[R\\`g2[>[3cPa)\n;/L@AS6aTF8^^WWm9.<,pl:G=C/r;o5=]!spqf0&hn8n+[M,g^EL\\mO-eTaO_Yh4A\nUBpLEmEUI\"U?O'.huAeHbmdiogWAlpo4+!\\3rj`nX)@~>\r\nendstream\rendobj\r70 0 obj\r[/Indexed/DeviceRGB 255 71 0 R]\rendobj\r71 0 obj\r<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream\r\n8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@\"pJ+EP(%0\nb]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\\Ulg9dhD*\"iC[;*=3`oP1[!S^)?1)IZ4dup`\nE1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\\.?d>Mn\n6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1\nVNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<\nPO7r\\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(\nl[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\\~>\r\nendstream\rendobj\r48 0 obj\r<</BBox[31.2066 187.931 233.607 126.331]/Group 72 0 R/Length 123/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/Shading<</Sh0 73 0 R>>>>/Subtype/Form>>stream\r\nq\n233.607 126.331 -202.4 61.6 re\nW n\nq\n0 g\n/GS0 gs\n0 61.5999985 61.5999985 -0 132.4066467 126.3314819 cm\nBX /Sh0 sh EX Q\nQ\n\r\nendstream\rendobj\r49 0 obj\r<</BBox[248.685 187.931 653.485 126.331]/Group 74 0 R/Length 122/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/Shading<</Sh0 73 0 R>>>>/Subtype/Form>>stream\r\nq\n653.485 126.331 -404.8 61.6 re\nW n\nq\n0 g\n/GS0 gs\n0 61.5999985 61.5999985 -0 451.085083 126.3314819 cm\nBX /Sh0 sh EX Q\nQ\n\r\nendstream\rendobj\r50 0 obj\r<</BBox[228.66 262.997 242.274 247.769]/Group 75 0 R/Length 73/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 76 0 R>>/ExtGState<</GS0 77 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 78 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n13.6139889 0 0 15.2280186 228.6598206 247.7687466 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r51 0 obj\r<</BBox[241.642 255.418 245.011 248.962]/Group 79 0 R/Length 70/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 80 0 R>>/ExtGState<</GS0 81 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 82 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n3.3684096 0 0 6.4561185 241.6422424 248.961713 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r52 0 obj\r<</BBox[226.344 249.383 244.73 229.664]/Group 83 0 R/Length 73/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 84 0 R>>/ExtGState<</GS0 85 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 86 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n18.3859026 0 0 19.7192314 226.3440399 229.6635353 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r53 0 obj\r<</BBox[220.309 232.751 226.976 228.892]/Group 87 0 R/Length 70/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 88 0 R>>/ExtGState<</GS0 89 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 90 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n6.6666441 0 0 3.859636 220.3089752 228.8916152 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r54 0 obj\r<</BBox[204.66 259.488 210.695 252.47]/Group 91 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 92 0 R>>/ExtGState<</GS0 93 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 94 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n6.0350673 0 0 7.0175201 204.6599121 252.4704865 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r55 0 obj\r<</BBox[207.888 269.102 231.046 257.593]/Group 95 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 96 0 R>>/ExtGState<</GS0 97 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 98 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n23.1578162 0 0 11.5087329 207.88797 257.5932568 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r56 0 obj\r<</BBox[229.783 268.19 236.8 263.348]/Group 99 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 88 0 R>>/ExtGState<</GS0 100 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 101 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n7.0175201 0 0 4.8420888 229.7826233 263.3476389 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r57 0 obj\r<</BBox[472.845 159.899 480.026 155.96]/Group 102 0 R/Length 168/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>>>/Subtype/Form>>stream\r\n0.118 0.118 0.118 rg\n/GS0 gs\nq 1 0 0 1 479.9069 158.3402 cm\n0 0 m\n0.01 0.524 0.045 1.045 0.119 1.558 c\n-7.062 -0.904 l\n-7.047 -1.395 -6.998 -1.888 -6.944 -2.38 c\nh\nf\nQ\n\r\nendstream\rendobj\r58 0 obj\r<</BBox[501.826 169.833 509.821 166.213]/Group 103 0 R/Length 173/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>>>/Subtype/Form>>stream\r\n0.118 0.118 0.118 rg\n/GS0 gs\nq 1 0 0 1 509.8209 168.5946 cm\n0 0 m\n-0.261 0.422 -0.524 0.841 -0.813 1.239 c\n-7.995 -1.223 l\n-7.622 -1.584 -7.274 -1.974 -6.944 -2.381 c\nh\nf\nQ\n\r\nendstream\rendobj\r59 0 obj\r<</BBox[502.477 158.582 509.987 153.746]/Group 104 0 R/Length 170/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>>>/Subtype/Form>>stream\r\n0.118 0.118 0.118 rg\n/GS0 gs\nq 1 0 0 1 509.9645 156.3221 cm\n0 0 m\n0.03 0.749 0.035 1.501 -0.021 2.259 c\n-7.062 -0.154 l\n-7.125 -0.978 -7.273 -1.788 -7.487 -2.576 c\nh\nf\nQ\n\r\nendstream\rendobj\r60 0 obj\r<</BBox[537.209 258.234 540.79 254.508]/Group 105 0 R/Length 584/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/Shading<</Sh0 106 0 R>>>>/Subtype/Form>>stream\r\nq\n540.169 258.223 m\n539.708 258.068 539.273 257.845 538.88 257.56 c\n538.029 256.979 537.434 256.093 537.219 255.085 c\n537.166 254.825 537.335 254.57 537.595 254.517 c\n537.856 254.465 538.11 254.633 538.163 254.894 c\n538.33 255.662 538.787 256.336 539.439 256.775 c\n539.664 256.933 539.904 257.069 540.155 257.18 c\n540.25 257.222 540.327 257.251 540.378 257.27 c\n540.434 257.29 l\n540.447 257.29 l\n540.702 257.367 540.845 257.636 540.769 257.891 c\n540.692 258.145 540.423 258.29 540.169 258.213 c\nh\nW n\nq\n0 g\n/GS0 gs\n3.5803418 0 0 3.5803418 537.2092285 256.3707275 cm\nBX /Sh0 sh EX Q\nQ\n\r\nendstream\rendobj\r61 0 obj\r<</BBox[473.358 148.454 482.245 144.208]/Group 107 0 R/Length 171/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>>>/Subtype/Form>>stream\r\n0.118 0.118 0.118 rg\n/GS0 gs\nq 1 0 0 1 482.2457 146.7836 cm\n0 0 m\n-0.663 0.495 -1.285 1.05 -1.846 1.67 c\n-8.888 -0.744 l\n-8.458 -1.389 -7.982 -1.993 -7.487 -2.576 c\nh\nf\nQ\n\r\nendstream\rendobj\r62 0 obj\r<</BBox[218.905 252.4 231.748 232.821]/Group 108 0 R/Length 72/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 109 0 R>>/ExtGState<</GS0 110 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 111 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n12.8420617 0 0 19.578881 218.9054718 232.8214181 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r63 0 obj\r<</BBox[229.221 253.874 236.309 247.979]/Group 112 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 80 0 R>>/ExtGState<</GS0 113 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 114 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n7.0876953 0 0 5.8947169 229.2212219 247.9792608 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r64 0 obj\r<</BBox[207.677 259.979 231.046 244.962]/Group 115 0 R/Length 73/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 116 0 R>>/ExtGState<</GS0 117 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 118 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n23.3683418 0 0 15.0174929 207.6774445 244.9617246 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r65 0 obj\r<</BBox[218.695 247.769 225.783 241.944]/Group 119 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 88 0 R>>/ExtGState<</GS0 120 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 121 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n7.0876953 0 0 5.8245417 218.6949463 241.9441961 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r66 0 obj\r<</BBox[207.677 258.435 210.765 252.049]/Group 122 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 123 0 R>>/ExtGState<</GS0 124 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 125 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n3.0877088 0 0 6.3859433 207.6774445 252.0494205 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r67 0 obj\r<</BBox[207.677 252.4 221.291 232.611]/Group 126 0 R/Length 73/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 127 0 R>>/ExtGState<</GS0 128 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 129 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n13.6139889 0 0 19.7894066 207.6774445 232.6108925 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r68 0 obj\r<</BBox[218.204 252.4 221.291 245.944]/Group 130 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 131 0 R>>/ExtGState<</GS0 132 0 R>>/ProcSet[/PDF/ImageC/ImageI]/XObject<</Im0 133 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n3.0877088 0 0 6.4561185 218.2037201 245.9441806 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r130 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r133 0 obj\r<</BitsPerComponent 8/ColorSpace 131 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 92/Intent/RelativeColorimetric/Length 29/Name/X/SMask 134 0 R/Subtype/Image/Type/XObject/Width 44>>stream\r\nH\u0001\r\u0000\u0000\u0000 Om\u000e7\u0000\u0000\u00007\u0013`\u0000\u000f\u0000\u0001\r\nendstream\rendobj\r131 0 obj\r[/Indexed/DeviceRGB 0 135 0 R]\rendobj\r134 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 44>>/Filter/FlateDecode/Height 92/Intent/RelativeColorimetric/Length 29/Name/X/Subtype/Image/Type/XObject/Width 44>>stream\r\nH\u0001\r\u0000\u0000\u0000 o\u000e7\u0000\u0000\u00007\u0013`\u00002\u0012\r\nendstream\rendobj\r135 0 obj\r<</Length 3>>stream\r\n\u0000a\r\nendstream\rendobj\r132 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 136 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r136 0 obj\r<</BC 137 0 R/G 138 0 R/S/Luminosity/Type/Mask>>\rendobj\r137 0 obj\r[0.0 0.0 0.0]\rendobj\r138 0 obj\r<</BBox[218.204 252.4 221.291 245.944]/Group 139 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 140 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n3.0877088 0 0 6.4561185 218.2037201 245.9441806 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r139 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r140 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 44>>/Filter/FlateDecode/Height 92/Intent/RelativeColorimetric/Length 29/Name/X/Subtype/Image/Type/XObject/Width 44>>stream\r\nH\u0001\r\u0000\u0000\u0000 o\u000e7\u0000\u0000\u00007\u0013`\u00002\u0012\r\nendstream\rendobj\r30 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r126 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r129 0 obj\r<</BitsPerComponent 8/ColorSpace 127 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 282/Intent/RelativeColorimetric/Length 4162/Name/X/SMask 141 0 R/Subtype/Image/Type/XObject/Width 194>>stream\r\nH엉WW\u0015_kF\u0001\u0002b@\u0005D\u0014\u0011+\u0018 ▸Ե\u001e{l\u0018\u0011\t\u0015wۿϝym,Whg\u001eA\tOBuS\u0002/\u0001Yq\u0001Yq\u0001Yq>\u0019瓁{>\u0019')4UL:+\u000e:Mg\u0005\u0001LgTPΊS\u0000YqfuVO\u0006x\ff\u0010\\gfT`F\u0006\\g7>]:+\u000e\b8]S81Ί\u0018bΊ\u0018;\u0017\u0006fRj\\g\tuV`̙$f9\u0002\tu\r>\u0004Ί%uV*\u0006:.g=7@F:+'\u0003|4\u0006Q\\gILN-p\u0015'\u0019~\u001b|\u0016l\u0013Yqff\u001cYqR;'\u0006s̝K3\\gŁ\u001c:v1uV9cFs\u0015'\u000e.\u0017\u0015\u0015Ί_\u0001\ti\u001eM0\u0016,p\u0015g^,EE:\u00064e(6\r.\u0013ΊS\u0014\u0002\u001bА\u000b\t,cb\u0006,.eEb\u001e\u001b̏a!\u0017-r\u0015\u0007յ_Dq\u0015ga,_\\ \u0006L\\gőgMѥ\u0018|\u0017Ů<-(\u0017{k5ӿjPl89\fuV\u001c\u0017v\u0014Yqc!ًE<\u001a\r(--u\u0015G\u000e9EZ(Ί\u0002ԟ%%%,C=MOX:+NR\u0012)uV\u001cpҥ\u0016EIJAi$\"ʿd8\t.,Yl2YqJi|\rtT]YtuVѨ\u0017,w\u0015'e\u0013\\gšQÀё5'm\u000e\u001d8Xh}\u0004p-d\u0010_^^W尶S4\u000f>2\u0019Ŋ\u001594A\u0006WTTxjP)SET\\AY,\"<a<\u001a\u001591 qu-\u001f_YY\u0018dvFUU\u0006u)N_ů֠\"\u001aOe\u001e\fhZ]'e4X\u0019K7\u0003y2\u0006t+ug_\f\u0006\u001c\u0016TוEի4ZzU3\u0000W1rf\u0016\u00025>\u001b\u0006ÿZ4S8Dx\u0016͚530@X:\rY\u001a\fh@]\u0006b`kD\u0019k5\u0011R\r:f@{jP\u0013:}c5\u0012]O=g\u0006k\"\u0011_+[AD*}}A]$y\u0019$\u001a*@)]\u0007@\u001f\u001cyPׯohӠ>\u001a3\u0003AZ\f5m\u0000WX[=\u001bB\u001b\u001b\ff`oh̕\noЀm/\u0010 \u001c\u0015߰!\u0006,^\r\u001ai<\u001b44h\u0000\u0013fh\n47{oب[\u0005\nh\f4F\u0012țA(s\u00064(\u001a^on`C<*.\r\r\u001a?\u0001\u0006ͦ\u0019g>)\u00047mT@\u000f\f\"&\u0001L\u0017@XPh^\u0015\u0004\u0018\u001e\u001dKMs\fMM^\u001a\u0014\u0002$\u00055xZ $\bl\u0002l,[F\u0006\u0003qغln\nXHw\rb0\u0014\u001d\u0005!&}\u001b\b\u0007x\f\u0003\u0003CB,¬6\u0006_ma)\u001b7*\u001a(\u0007l\u001b\u00057H鐐\u0005Rp\u0003S\u000f]Kߙ\u000btCf3P\u0006/߼y\r\u0019AKX`\n/)I\u000b\n\u0001\u0005t`\u0006/߼L1\n<[\u0014`t0\rT\t>QE\u0004nݺe;R\u0007ja-\u0004\u0002\u001e:\u00014\u0001\u0014FG\u0003SHpȒ_\tlپ}r\r^7x\u00190`۶5\u0010\u000eb\u001di,\u0002۩*\u0010\u0005ґ\u000ecj\u00007عs\f?\u001f\n\u000f\u0012Py9L\u0018LsȈTP\u000e(ic\r\u0002;v\u0014C\u000fWQ\u0006\u0016\u0002[6.{d\u0018\f\u000f\u0011(I\u0007\nիD\u001d\u00060L\u0018R$oV\u0005,G[0\u0006X\u0002`6\u0018\u0018\u0018\u001e`\n_荎\u00003*{מ=\u0013k08H\u001c2ȋ5R\u0005Q\u0003\nl\u0004*s\u0005\f#\n\tίoQ\u0004\u0005{Z[['Ҡ(\fe \u0012Zza/p\u0013\u001d/\u0012p\u0002mm\u0013fRPO8 \u0004Ђ-F\u000bY#\u0004g\bmkk7Q\u0006LN\u0012V\u0014\u0014?[[ж&@/PB`7!A`g^np`\u0018<O0{6\fudD6-G Bz\u0017\u00100[\f\u001f\u001aASX\u00010L \u0004V\u0013-n퀹\u0004[Ђ\u0003\u000f\u001dj\u001fA_\u001fi\u0003\u001d\u00010$W:e \u0003X\u000b\u0000kuxB\u0014I\u001a\u001c\u001c\u001c4\u0014Zr(0\u0015\u00192F\bܣ\\\u000017hoo\u0018B]I^+\u001d&\nQ-0\u0004P\u0003)@x\fz4\u0010f:\n\u0011-\b1Cl\r\u0016!\"\u0006GCw \f$@4`jJy\u0007\u000fwt|ѣc5\n@-\nNJ\u0001`\u000bZUJ\u0004\u0011jp\f\u001e\n>d\u0018\u001c@})\u0000-`S\u0004n\"\u0006D\u0013Ǐ\u001aRx\u0005\rR<\u0016)\u0006;d\u000f:5\u0016T.\u0003f\r\u0003\u0003\u0012P\u000e%ߤ\u001a+\u0003\u0006m`\u0001Q8ٙ!Wmx*@Vë́h'.[\u00006-';j\u0014$IB\u0005{\u0016発\u001a\u001c=J\r:;;Ng5\nt\u0019$*\u001aΐ\u0002\u0007|)b\u0006]gd1x9\u0000gi\r C\u000b5[pZ\u0003Lw\u0006\u0003o$\f\u0003\u0001\u000fm20{p\u0001U>\u0003@w>u\u001bR\u001b\u0004-IapTE\\ܹ\u0006*\u0014Y$e0`\u000eZ\u0000g\b\u0018|$\"6F.^Hip\r#\u0010Յ蟂<ZЦ[\u0010\u0001߃gΜ>O\u0014~JaR\n@_̏!{\tEd\u001b\u001ez \f~1_z@\u0017PbP^\u0005@A73|9@)<\u0012\nNh\u001c\u001f\u0005`\u000b9El\u000fx\u0013~|JZ\u0003`\u0019\u0001qH|!2fH?])ӳ+W\r\u0010\u0005\u001dZ<!$\u001a\u0004IkZcnmݦY\u0013Ο;w%\u0010\u0002u\u0001u\u0010hnRnp40\u001a\\\u0014Mz=@)<\u0004\n8i\f a\u000e\u0019b-\b\u001bt)\u000b|\u0013\\~ZPx_0\u0004J΀:[z\u0014-SD\u0014x\u000f\"H\u0003;T\u00108i\r؛Zc&`\u0019t=.Tip\u00135P\n\u000f\u001eIR\u0006Mm \u001cbn҃f\u000bY\u0006]@Fe\u0006n\bS\u0003:X-\b?\n\u000ew\u001b&H\u0003ބ7B\u000eҀ]ԇʀ.\u001fe2\bGA)`\u0019Ї2\u0001U$\fm@7\roFh\u0010\u00183.\"C2ꂋ\rm$\fL{J\u0018uQj@\u001dGƪ\u0005\u0006LAF-#~!9<qv ~-jipV@>U\u0013nܾu\u0017\u0015xv\u0005a,\u0006\u0001&p\u0010O\u0016\u0018{ ߌ*]\u0006M ] \n@A\u0002Θ\f`(\u001efpo۩\\\u0004*`\u0018ܹso)\u0014& \b\u0016\n\u0003ͧ2\nwP`\u0006`\u0015& \bq\u0016P\u0001@=\u0011&0wR\u00035GZ} \u001fu6\f\u0001=\f.k1l\b&Cӵb|>)\u001f2O>K\u001f}\u0000E_D\u0011\u000b6\u0015\u0004д)\u0004Gr]#\u0000\bn\u001e*\u000441\t\fA%\\'\u0000]𥈀\n$AB\bGV\u0000\u0014E9E\u0010\u0001@\u000f\n.^\u0010\b\u001f\u0002O:,\u000b~6:`'A$5\u0000^DR\u00041\u001d]1\u0017Bkmv1ߤ\u000e` \b c>\u001d}0\u0000\u0011@\u001f\t5\u0000\b\\\u0017\u001d}\u001b=g\u0004\u0012t\u0006{)\u0011\fviDb\u0012\u0013O\u0004ni\u000f\bn'Q\u001a\u0005/3g׌|'\u0017NV\u0000yi\u0011䷑\u00149\u001b\u0005\u0004[fe\u000fݥ1&\u0007\u0012\u0013ܨ0\u0000=t!\u0007l%Y#K\u000f$Wm\u0006\u00010C,ŜB ,\u0002(ۘN.\u0000\u000el\u0012\u001e먏0\u0000Hb\u0015\u001e\n\u00110AGt\u0014\u0014\u0000Tm\u0018\u0002'`@E\u0005@\u0005E\u000fg㈇׺z'qts\n@&\u0011\f\u0010%\u000bf\u0015\u0018C\n2\u0011\f|\u001b!\"\u0000ԛG@(_kn+%@1\u0019\u0010a'>\u0005\u000e\u001e\u0013Yka+H\u0018\n\u0018 \u0017\u0010^k\u0010\u0000l\u001bߗc\u001c# \u0011\u001f5\u0005\u0001Z\u0004\u0011@\u0004M\b\t\u0000&U\u0005`D\b\u000b\n\u0000}\u0015\u0011DB\u001af{ދ-yYT\u0000\u0014Ob\u0003ϲ%\u0010ZX\u00048\fE\u0000jm[.-\u0000\u001e\u0012# ,\u0002@'\u0001*\u0016\u0000#8\u0000^\u0007\b\bn#\u0013\u0010@\u0002g\u0015!\u0002\u0018)(#S\u0000\b\u0000\u0018\u001f\\\nM0\u00056\u0004\u0016\u0018\u0003_fJ\u0004\n\u0002\u0001z.\u0011\u001a\u000408UG`{\u001aAg\u0010\u0004r\u0004:\u0005Pq\u00018\u00148CM\u000e k\u0014EV\u0000j\u0007'˸R\u0001\bD\u0000Sc\u00015<c9@G8\u00146\t05[P?\u0000ްe#l\u001a`J\u001d\u000f\u000fm\u0000\u0003\u0000\u001e i\r\nendstream\rendobj\r127 0 obj\r[/Indexed/DeviceRGB 162 142 0 R]\rendobj\r141 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 194>>/Filter/FlateDecode/Height 282/Intent/RelativeColorimetric/Length 5472/Name/X/Subtype/Image/Type/XObject/Width 194>>stream\r\nH[UW\u0016@1b\u0014{E\u0005`\r6\u0002\b\u0004\u001b(X\u0016IL0:)\u0016x\rAAPgf}}ocwN\\lis̤|\u0013\u0006\u0001fNaA)^2\u000fv\u000fvP``3~\u0014;\u000e\u001e<ص+>ڕC{T=v\u0004Shڕ'\u000fvPެ_\u0002׮<o\u00103?ָv\fǵ+χ\u0002$ µ+F\u001eY\\\"^\u0015\f\u001dڕ6u\u000e0̵+^\u0018a\u0017a04׮<ⓖ\u0007\u000bҴlP[1|p׮<iq\u0001m=^0\\FiKF\u0000]y\u0003y\b-\u001b-\u0018v\u0019\u0011\u0007փ\u0005#l61p32\u000eGvc\u001d(3\twkWQ\bm=\u0019ڕ:b#;%]yF#\u001d;ֵ+}f4?#ukW1\bm\u000blCk\f2Nڕ'L:>n'vIȝi8t\\\u001d8ѵ+x\u0007&vu\u0003\u0013:OJOOw30hkIɮ]y&SdFcN\u000fL<ŵ+Ϥx\u0007^\u0000\u000f^O\u0005\\[zl]1ujFkW\u00124TEFFfkW)@qi]yԩ,\u000f>#S#]yl[=\u0004LbZ\u0016ڕ'#C\b`F5LSdeM>ݵ+Of\u001cP<\u00193\\hY\u0007fvl}:=\u0013qʓ%w\u00041^\u001c̙\u0000׮<Ù!N5+;;۵+\u0005Q\u001c<Kٳ]hWbɦf#s\\\u001d!(:\u0001v\u0015\nK@\u001fpʣm\u0001kp~y\\d[GmF9sy]yI\u0013f\fqt\u0005\u000b\\\tC,<y\u000bO\\([\u001aQ\u001fpc\u001f\u0019R\u001eBOrrr\\\u0006H\u0017 \u001e}\u000b]\u000fAmN\u000e\u001d?/\\ȵ+^t\\\u0005\u0016rs=/Zص+P\u0015Z\u001c_\u0018p#\u000f0#<~\tڕ'Gm΢\u0018K.uʣ\u0016=\u001a9dKss]򈓎Z\u001dk8hY\"ss\\\u0001g\u000fkW%rUY\u001a域lY\u0007\u001bǀ~\u0016!Oك>\u0004\u0015G}`\u0005yyA}q˅\u0015+WzZϳ!N_#+\u000b\n,,[oW\b{ςe!}\"\u000b@7\\\u001c~\u0001ك~Q*?\u000b+׌rA\u0010U<-XU1\n;\u0004^b?\u000bVSP$\u000b(.)\u0000umu:~TG{/)\u0016Ql\u000f\u001d=OqqIii~\u0016\u0014\u0016U/2w\u0011\u0017~\u0005EH \u0002Zvk\u0011gCWYu\u000135~\u0016\u0014U/)1\u0001ʗi5k,(\tE.O\u0019-Кk׮󹠔R:tG\u0005\u00161#k~\u0016\bw,fڿςP\u0013_^q(\u001d\u0015\u0015\u0015\u001b,\u0010\u00023Z˯7xZ@rY̬חƍ~\u0016\r+\u0001J\u000bI\u0011)PU~\u0016*0\bM~\u0016p\u0006ӂ0*\u001f߼y\u0005\u0015\nk\u0004W*-[,NB=*u\u0005\u0012fRnZg\u0010ݼi\u0016_mA\u001a!@m\u000fc\u0005b\u0005֤6\u0002+\u00023VYv?\u000b6[UC\u000eO\u000b6\u00177\u001dwxZ@OUb?\u0016`+2Tp\u0001;wZ\u0010_m\u001f?\u0005YPͣ\u0007C@M\u0005ۢ\nٵςmaPk?`{|x\u0001{\u0005P\u000bT\u0017aFj={,\u0011z5@}\u0001\u0018z\u0014\u0000~\u0016\f.և\u001f\u0002.}7|\"`7%?}&\f{^\u000bh`?_,\u0000O\u000bv_^d\u0017}ۗ\u0002z'-aiFfw\u0018f}.ª1Yo%=^\u0010\u0010\u000fHf\u001b$Z\u001ep\tHb7\u0000#z\t\t$&^A],wZ@\r\u000f|$\u0016\u0006\nǆOfAkI\"\u0005\t;( ^$\u0010P@}}\u000b\u001e]$z'իn-k{?\u0005^aC\\ׯuJ\u0014\u0012\bHbAWWgW\u00176tww\u0015\u0002k9!\u0011ĂNB't!$R\u000b^\u0002)\u000e\t_\u0003\u0007WK\u0019!\u001bD\u0007-lƘ\u0007\u0016\u001cē\u0005v\f\u001f\bHbCGG\u000bQ٩\"8\u0012\n\u0007\u000f\u001eLRA{{l\u0002\"dQӷd5<\u001c\u001b:2\b7H\u0004444$\r\u001b\u0003\r`٩z%@@\u0002\u001a\u001a\u001a\u0007g]=\u0007u\u000f\f}l@\bh\u001c'OEs\\\u000e\u0019OB\u0007 9C\u0003[\t4<v\u001eMWQp\b\u0018ȂG\u0001`IO\u0005\f`A#\u0000#'\u001dз\u000bh4\u0001\u001c9:`\u0005-\u0000\u0017\tmE\u0018iC\u0002\u001c\u0002Tǎ\rPÇ-\u0014\tI\u000f\f1Ҍ PO\fHA$0򰥕nA4@E;\u0003%0\u0002T\u0000\u00168yr \n#\b\\ãGOWI.\u0013G\u0005\r1o\u0000\u0000\u0016:\u0005MMM\u0011XUό\u0015֖\u00065\u001b8V\bwSN>\u0005\u000f\u001e-63=\u0000}C\u0006N+go{\u001f457c\u001fM\u0013Uf\u001b\u0010/\f8s\u0006\nk{\u0014i\u000f+~\u0014OI\u001b\bˀ\u0011\u0000(>Џ\u0005}\u0017\u0012pB_Vޯ1*@\b8-\u0002>ŗV_DE}\b0-\bO`\u0000}F\u0015Ȁ3gA\u0001\u0004|W\u0017\u000fJ\u0010\u0011\u001b藃@>\f9>S@3t\u0012U\u0005\ft\u001f\u000bd\u00026З\u0011ъXck\nO9Bz@\u0010\u0016\\|j\u0014\u001b\u0013>f\n\u0012Z\u0010\u001apL}HqN\u0007\u0000կ{\u001dL{\u000f\u001e\r U\u0001HM!\u0006o\u0002\\?gLKt׮xw'6܅\rx\u000bh؂Cf@\u0011\u0019_Wp7~\u0005n߾#6޽{]EB\"Y1\u0012<c3t<\u0002}\u0005%J\u0017\\oSn-*}8R\u0013]c_\u001d\u0005\u0017/]\u0012\u0001׿w7\u001d\n~[\u0016JfAĚS\u0013\\\u0001\u0019\u0011\u0001\u0000\u0002hn܀;_5\t]nH\u0013aM\u0005|+ozW\u0006\nO?Q_OQ^I\u00185UMa7\\ju+niE\u0011M\f\u0017EQ\u0001\r\u0003**(^T@DĊ?$}O}\u0019\u0018O̜<ݧ^@=#?`gGyH\bR\u000f˵\"J\t\u0011\u001c\"cm\u0011\u0019w~2|.P\u0015\u00126\u0014Io?\r\u0013\u0011\u0000\b\u0012\u001coo`\u0011T\u0004\u001aSTh)Z=N\u0003%@èA\u0013' X\b7*\u0003Q\u001c?ϕ\f7F神:\u0000Cp\u0013T\u0004/\u0018[\u001f?~e\u001fOuR!\b\u001eI`\t~aNuH\u0010\u0001\u0014\u0010ҕh\u001a N|T$\u0001\u0013tF! \u0003[Z1>2\u000foI\u000fE1f\t4\u0007h\u001cV\u0004wv`\u0019\u0011\u0016!N\u001c%>@C\u0010MX\u001fC+\u0004^;TO\f\u0019\\\u0016\\yIB\u0015JU\u000bbl<8ȁts\u0012,.!\u0015Gp\f\u00131Q]\u0012N\u0001V$\u0004G\"\r\u0010*\t\u0016\u0016\u0016)SH\u0005U\u001d,S\u0010K`<DԈ!8s|_U\u0004O\u0017\u0016]\u0016VEpX-:\u001b\u0004ߋ\u0004i\u0017\u0011\u0019\u0014b\u0015\u0004O\u0010Ūk:#jkHx(ѱe\u0017R\u0002\u0012KU\u0011\fBJ(5s\u0012'J\b\u0006.qv\u0004\u0019\u0011\u000fgd;[7o㟉N<)(s`\u001f\f\u0017 4\r0DI\u0004%\u001aP\u0010\bW~tV\u0011x6B+mj\u0003ֶ\u0004\u001cfNߗdb\rP>\fk\u0010(\u0002F˰:]\u0013\u0000d\u00052gtR߈XB\rb\u0014\\\noz\rsܨ\u0000,!ME.\tN##тߛ\t>R\r)\n\u0000\b\u001a;\u001bR!еi.\u001aYF\u0002\u001426G\b~~ŵʜ%d>q \u0002\u001a8\u0002D\u0004D6^&\u0010\u0004\\H\u0006'B&\u0000(?H'=(\u001e?\u0001\u0004\u001d\u001d\\7b\u001b]q3S\u000fQ\u0004FX\f\b|ᗮe\r\u0004\u0000\u0014F CI۩\u0010*p\u000f=xH>4/,J\u0018V/װq&\u0002\u0018|#rỌ1AW\u0017\reG@6BA \u0011o\u0013kW׸VqF\u0002p\u0004Qg1\u0011\u001c^\t)\bDp2h\u0010܉\tX\u0004Q@HW\u0004\u0000J\u0019\u0005O\u0014G%V\u001b] \f\u0018\u001fu΄\"c\u0017^qe+\u0013\u0000\u0018\u0013Fx{%8FW\b\u0013\u0013>!`+\u0012\u000bWz\u0000r\u001a;\n\u000e[\tP0Һ%\bLYV\u0002D\f\u0004GH\r9\u000bs\u0000 4\b\u0015\u001c\u0011_O{\u0004\u00015,\u001cM\u0004B`}$\b骓\u0000\t\u0010\u000f\bwSʈG)\u0012P\u001bq\u0004N\u0005gɻwݗO)\\\u0002\u0019\u001e&\u0000Oh\u0014f3C\tD\u0018\u001a  Ԕ( m}=3\u001d\u0010@*\u0005\u0014cJ6\u0001\u0000\u0002AӈD {\bΉqi'\u0004\u0000q;/y\t:h\u001eP\u000et\u0004*\u0013! P\u0010t\u0000~Y[!ߋmid#\u0016a\tbE%s)\u0001@x$@\u0002L,\b$\b\u0002#]e\u000b;'ЈD\t\u000f\u0004\u0010DAfYl$s\u0007ۼ9\u0002\u00018ވ) C`\u0011\"X\u001bc\u0015\u001e<x\u0011]!\u0000q\n\u0012\bP\u0013\u0011|;\u001dU\u0011J]\"m;)y\u0001jt-G\"\u0000\u0018YxK \u0004jQP\b@Qh4\u0001B$\u001e<9fHQ\u0016\u0001\u0011&|$\u001ew\u0000x(D\u0001\u0011\\\u0019\u0012\u001b1A>\t8]K\u0000\fVII\u0002\u000fl4(,I\u0004\\\u0014f\u000ek\t\u0000B 1&\u000fP\u0002\u0017!XD\u0004\u0000@*@%Y\u001e|_:d\bƳ8\u0000\u0002:qZb!\u0010\u00139\r2sوpWD\u0010\u001f%!\u00045:\na\u001e\u0000\u001b%pEp\u000b\f94\u0000}\u0016Qx\b%|\u0012Gj\u0014\u0001}\u0016F\u0013\"L\u0005/]w\u001c\u001bG\u0000p4(%\u0018ɉE \u001f%\u0004\u0018\u0005:|\nD\u0002!#jG}kڜ\u001bJ\u0000_ff\u0014\f\u0006\u0004\nO\u0004g\bGj0\u0001\u0002\u0019fԈD\u0002G\u0013\u001ejÆ\u0013@4>C\u0004@\"T\"x\u0002\u00003\ni<tUb\u001c\bnj\u0013\u0000lIM\u001f<#\u0006ao\b\u00002;iI+\u001e@\b2\bS2\u0000z\u000bq&\u0005\fP\b{F\u0000\u0010R\u0010IP\t\b\u0001 !\\9>C\u00028\u0018\u0001<\bS\u0002\u0000o\"U3@%1\u0001x\u0002\u0015#1\u0001h'u,\u0002 \u0010\u0004\u0000h\u0000\u0004\u0013\u0013!\b\b{O\u0000@%dY!%\b\u001du\u001c\u0000 Z\n%  B\u0000\u0012@;i\u0006 T\u0004\u0000E8!%(D7\u0002\u0000CC\u0016L}$\u0004\u0002P\u0004\u0000\u0015N\t\nj\t\u0000FK;\u000043\u0001@ f&\u0000Ca)Af \u0000(-\u0000q\u0000MC\u00000^W\u0000(6\u0017\u0001@0k\u0011\u0000'\u00001\u0005MH\u0000-\u000fU\u0000S \u001ejYV\u0015jy\u0000\u0007\u0012X\rjSo\u0001\u0006\u000017\r\nendstream\rendobj\r142 0 obj\r<</Length 489>>stream\r\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000~\u0000~\u0000}\u0000}\u0000|\u0000|\u0000{\u0000{\u0000z\u0000z\u0000y\u0000y\u0000x\u0000x\u0000w\u0000w\u0000v\u0000v\u0000u\u0000u\u0000t\u0000t\u0000s\u0000r\u0000r\u0000q\u0000q\u0000p\u0000p\u0000o\u0000o\u0000n\u0000n\u0000m\u0000l\u0000l\u0000k\u0000k\u0000j\u0000j\u0000i\u0000i\u0000h\u0000h\u0000g\u0000f\u0000f\u0000e\u0000e\u0000d\u0000d\u0000c\u0000c\u0000b\u0000a\r\nendstream\rendobj\r128 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 143 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r143 0 obj\r<</BC 144 0 R/G 145 0 R/S/Luminosity/Type/Mask>>\rendobj\r144 0 obj\r[0.0 0.0 0.0]\rendobj\r145 0 obj\r<</BBox[207.677 252.4 221.291 232.611]/Group 146 0 R/Length 73/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 147 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n13.6139889 0 0 19.7894066 207.6774445 232.6108925 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r146 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r147 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 194>>/Filter/FlateDecode/Height 282/Intent/RelativeColorimetric/Length 5472/Name/X/Subtype/Image/Type/XObject/Width 194>>stream\r\nH[UW\u0016@1b\u0014{E\u0005`\r6\u0002\b\u0004\u001b(X\u0016IL0:)\u0016x\rAAPgf}}ocwN\\lis̤|\u0013\u0006\u0001fNaA)^2\u000fv\u000fvP``3~\u0014;\u000e\u001e<ص+>ڕC{T=v\u0004Shڕ'\u000fvPެ_\u0002׮<o\u00103?ָv\fǵ+χ\u0002$ µ+F\u001eY\\\"^\u0015\f\u001dڕ6u\u000e0̵+^\u0018a\u0017a04׮<ⓖ\u0007\u000bҴlP[1|p׮<iq\u0001m=^0\\FiKF\u0000]y\u0003y\b-\u001b-\u0018v\u0019\u0011\u0007փ\u0005#l61p32\u000eGvc\u001d(3\twkWQ\bm=\u0019ڕ:b#;%]yF#\u001d;ֵ+}f4?#ukW1\bm\u000blCk\f2Nڕ'L:>n'vIȝi8t\\\u001d8ѵ+x\u0007&vu\u0003\u0013:OJOOw30hkIɮ]y&SdFcN\u000fL<ŵ+Ϥx\u0007^\u0000\u000f^O\u0005\\[zl]1ujFkW\u00124TEFFfkW)@qi]yԩ,\u000f>#S#]yl[=\u0004LbZ\u0016ڕ'#C\b`F5LSdeM>ݵ+Of\u001cP<\u00193\\hY\u0007fvl}:=\u0013qʓ%w\u00041^\u001c̙\u0000׮<Ù!N5+;;۵+\u0005Q\u001c<Kٳ]hWbɦf#s\\\u001d!(:\u0001v\u0015\nK@\u001fpʣm\u0001kp~y\\d[GmF9sy]yI\u0013f\fqt\u0005\u000b\\\tC,<y\u000bO\\([\u001aQ\u001fpc\u001f\u0019R\u001eBOrrr\\\u0006H\u0017 \u001e}\u000b]\u000fAmN\u000e\u001d?/\\ȵ+^t\\\u0005\u0016rs=/Zص+P\u0015Z\u001c_\u0018p#\u000f0#<~\tڕ'Gm΢\u0018K.uʣ\u0016=\u001a9dKss]򈓎Z\u001dk8hY\"ss\\\u0001g\u000fkW%rUY\u001a域lY\u0007\u001bǀ~\u0016!Oك>\u0004\u0015G}`\u0005yyA}q˅\u0015+WzZϳ!N_#+\u000b\n,,[oW\b{ςe!}\"\u000b@7\\\u001c~\u0001ك~Q*?\u000b+׌rA\u0010U<-XU1\n;\u0004^b?\u000bVSP$\u000b(.)\u0000umu:~TG{/)\u0016Ql\u000f\u001d=OqqIii~\u0016\u0014\u0016U/2w\u0011\u0017~\u0005EH \u0002Zvk\u0011gCWYu\u000135~\u0016\u0014U/)1\u0001ʗi5k,(\tE.O\u0019-Кk׮󹠔R:tG\u0005\u00161#k~\u0016\bw,fڿςP\u0013_^q(\u001d\u0015\u0015\u0015\u001b,\u0010\u00023Z˯7xZ@rY̬חƍ~\u0016\r+\u0001J\u000bI\u0011)PU~\u0016*0\bM~\u0016p\u0006ӂ0*\u001f߼y\u0005\u0015\nk\u0004W*-[,NB=*u\u0005\u0012fRnZg\u0010ݼi\u0016_mA\u001a!@m\u000fc\u0005b\u0005֤6\u0002+\u00023VYv?\u000b6[UC\u000eO\u000b6\u00177\u001dwxZ@OUb?\u0016`+2Tp\u0001;wZ\u0010_m\u001f?\u0005YPͣ\u0007C@M\u0005ۢ\nٵςmaPk?`{|x\u0001{\u0005P\u000bT\u0017aFj={,\u0011z5@}\u0001\u0018z\u0014\u0000~\u0016\f.և\u001f\u0002.}7|\"`7%?}&\f{^\u000bh`?_,\u0000O\u000bv_^d\u0017}ۗ\u0002z'-aiFfw\u0018f}.ª1Yo%=^\u0010\u0010\u000fHf\u001b$Z\u001ep\tHb7\u0000#z\t\t$&^A],wZ@\r\u000f|$\u0016\u0006\nǆOfAkI\"\u0005\t;( ^$\u0010P@}}\u000b\u001e]$z'իn-k{?\u0005^aC\\ׯuJ\u0014\u0012\bHbAWWgW\u00176tww\u0015\u0002k9!\u0011ĂNB't!$R\u000b^\u0002)\u000e\t_\u0003\u0007WK\u0019!\u001bD\u0007-lƘ\u0007\u0016\u001cē\u0005v\f\u001f\bHbCGG\u000bQ٩\"8\u0012\n\u0007\u000f\u001eLRA{{l\u0002\"dQӷd5<\u001c\u001b:2\b7H\u0004444$\r\u001b\u0003\r`٩z%@@\u0002\u001a\u001a\u001a\u0007g]=\u0007u\u000f\f}l@\bh\u001c'OEs\\\u000e\u0019OB\u0007 9C\u0003[\t4<v\u001eMWQp\b\u0018ȂG\u0001`IO\u0005\f`A#\u0000#'\u001dз\u000bh4\u0001\u001c9:`\u0005-\u0000\u0017\tmE\u0018iC\u0002\u001c\u0002Tǎ\rPÇ-\u0014\tI\u000f\f1Ҍ PO\fHA$0򰥕nA4@E;\u0003%0\u0002T\u0000\u00168yr \n#\b\\ãGOWI.\u0013G\u0005\r1o\u0000\u0000\u0016:\u0005MMM\u0011XUό\u0015֖\u00065\u001b8V\bwSN>\u0005\u000f\u001e-63=\u0000}C\u0006N+go{\u001f457c\u001fM\u0013Uf\u001b\u0010/\f8s\u0006\nk{\u0014i\u000f+~\u0014OI\u001b\bˀ\u0011\u0000(>Џ\u0005}\u0017\u0012pB_Vޯ1*@\b8-\u0002>ŗV_DE}\b0-\bO`\u0000}F\u0015Ȁ3gA\u0001\u0004|W\u0017\u000fJ\u0010\u0011\u001b藃@>\f9>S@3t\u0012U\u0005\ft\u001f\u000bd\u00026З\u0011ъXck\nO9Bz@\u0010\u0016\\|j\u0014\u001b\u0013>f\n\u0012Z\u0010\u001apL}HqN\u0007\u0000կ{\u001dL{\u000f\u001e\r U\u0001HM!\u0006o\u0002\\?gLKt׮xw'6܅\rx\u000bh؂Cf@\u0011\u0019_Wp7~\u0005n߾#6޽{]EB\"Y1\u0012<c3t<\u0002}\u0005%J\u0017\\oSn-*}8R\u0013]c_\u001d\u0005\u0017/]\u0012\u0001׿w7\u001d\n~[\u0016JfAĚS\u0013\\\u0001\u0019\u0011\u0001\u0000\u0002hn܀;_5\t]nH\u0013aM\u0005|+ozW\u0006\nO?Q_OQ^I\u00185UMa7\\ju+niE\u0011M\f\u0017EQ\u0001\r\u0003**(^T@DĊ?$}O}\u0019\u0018O̜<ݧ^@=#?`gGyH\bR\u000f˵\"J\t\u0011\u001c\"cm\u0011\u0019w~2|.P\u0015\u00126\u0014Io?\r\u0013\u0011\u0000\b\u0012\u001coo`\u0011T\u0004\u001aSTh)Z=N\u0003%@èA\u0013' X\b7*\u0003Q\u001c?ϕ\f7F神:\u0000Cp\u0013T\u0004/\u0018[\u001f?~e\u001fOuR!\b\u001eI`\t~aNuH\u0010\u0001\u0014\u0010ҕh\u001a N|T$\u0001\u0013tF! \u0003[Z1>2\u000foI\u000fE1f\t4\u0007h\u001cV\u0004wv`\u0019\u0011\u0016!N\u001c%>@C\u0010MX\u001fC+\u0004^;TO\f\u0019\\\u0016\\yIB\u0015JU\u000bbl<8ȁts\u0012,.!\u0015Gp\f\u00131Q]\u0012N\u0001V$\u0004G\"\r\u0010*\t\u0016\u0016\u0016)SH\u0005U\u001d,S\u0010K`<DԈ!8s|_U\u0004O\u0017\u0016]\u0016VEpX-:\u001b\u0004ߋ\u0004i\u0017\u0011\u0019\u0014b\u0015\u0004O\u0010Ūk:#jkHx(ѱe\u0017R\u0002\u0012KU\u0011\fBJ(5s\u0012'J\b\u0006.qv\u0004\u0019\u0011\u000fgd;[7o㟉N<)(s`\u001f\f\u0017 4\r0DI\u0004%\u001aP\u0010\bW~tV\u0011x6B+mj\u0003ֶ\u0004\u001cfNߗdb\rP>\fk\u0010(\u0002F˰:]\u0013\u0000d\u00052gtR߈XB\rb\u0014\\\noz\rsܨ\u0000,!ME.\tN##тߛ\t>R\r)\n\u0000\b\u001a;\u001bR!еi.\u001aYF\u0002\u001426G\b~~ŵʜ%d>q \u0002\u001a8\u0002D\u0004D6^&\u0010\u0004\\H\u0006'B&\u0000(?H'=(\u001e?\u0001\u0004\u001d\u001d\\7b\u001b]q3S\u000fQ\u0004FX\f\b|ᗮe\r\u0004\u0000\u0014F CI۩\u0010*p\u000f=xH>4/,J\u0018V/װq&\u0002\u0018|#rỌ1AW\u0017\reG@6BA \u0011o\u0013kW׸VqF\u0002p\u0004Qg1\u0011\u001c^\t)\bDp2h\u0010܉\tX\u0004Q@HW\u0004\u0000J\u0019\u0005O\u0014G%V\u001b] \f\u0018\u001fu΄\"c\u0017^qe+\u0013\u0000\u0018\u0013Fx{%8FW\b\u0013\u0013>!`+\u0012\u000bWz\u0000r\u001a;\n\u000e[\tP0Һ%\bLYV\u0002D\f\u0004GH\r9\u000bs\u0000 4\b\u0015\u001c\u0011_O{\u0004\u00015,\u001cM\u0004B`}$\b骓\u0000\t\u0010\u000f\bwSʈG)\u0012P\u001bq\u0004N\u0005gɻwݗO)\\\u0002\u0019\u001e&\u0000Oh\u0014f3C\tD\u0018\u001a  Ԕ( m}=3\u001d\u0010@*\u0005\u0014cJ6\u0001\u0000\u0002AӈD {\bΉqi'\u0004\u0000q;/y\t:h\u001eP\u000et\u0004*\u0013! P\u0010t\u0000~Y[!ߋmid#\u0016a\tbE%s)\u0001@x$@\u0002L,\b$\b\u0002#]e\u000b;'ЈD\t\u000f\u0004\u0010DAfYl$s\u0007ۼ9\u0002\u00018ވ) C`\u0011\"X\u001bc\u0015\u001e<x\u0011]!\u0000q\n\u0012\bP\u0013\u0011|;\u001dU\u0011J]\"m;)y\u0001jt-G\"\u0000\u0018YxK \u0004jQP\b@Qh4\u0001B$\u001e<9fHQ\u0016\u0001\u0011&|$\u001ew\u0000x(D\u0001\u0011\\\u0019\u0012\u001b1A>\t8]K\u0000\fVII\u0002\u000fl4(,I\u0004\\\u0014f\u000ek\t\u0000B 1&\u000fP\u0002\u0017!XD\u0004\u0000@*@%Y\u001e|_:d\bƳ8\u0000\u0002:qZb!\u0010\u00139\r2sوpWD\u0010\u001f%!\u00045:\na\u001e\u0000\u001b%pEp\u000b\f94\u0000}\u0016Qx\b%|\u0012Gj\u0014\u0001}\u0016F\u0013\"L\u0005/]w\u001c\u001bG\u0000p4(%\u0018ɉE \u001f%\u0004\u0018\u0005:|\nD\u0002!#jG}kڜ\u001bJ\u0000_ff\u0014\f\u0006\u0004\nO\u0004g\bGj0\u0001\u0002\u0019fԈD\u0002G\u0013\u001ejÆ\u0013@4>C\u0004@\"T\"x\u0002\u00003\ni<tUb\u001c\bnj\u0013\u0000lIM\u001f<#\u0006ao\b\u00002;iI+\u001e@\b2\bS2\u0000z\u000bq&\u0005\fP\b{F\u0000\u0010R\u0010IP\t\b\u0001 !\\9>C\u00028\u0018\u0001<\bS\u0002\u0000o\"U3@%1\u0001x\u0002\u0015#1\u0001h'u,\u0002 \u0010\u0004\u0000h\u0000\u0004\u0013\u0013!\b\b{O\u0000@%dY!%\b\u001du\u001c\u0000 Z\n%  B\u0000\u0012@;i\u0006 T\u0004\u0000E8!%(D7\u0002\u0000CC\u0016L}$\u0004\u0002P\u0004\u0000\u0015N\t\nj\t\u0000FK;\u000043\u0001@ f&\u0000Ca)Af \u0000(-\u0000q\u0000MC\u00000^W\u0000(6\u0017\u0001@0k\u0011\u0000'\u00001\u0005MH\u0000-\u000fU\u0000S \u001ejYV\u0015jy\u0000\u0007\u0012X\rjSo\u0001\u0006\u000017\r\nendstream\rendobj\r122 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r125 0 obj\r<</BitsPerComponent 8/ColorSpace 123 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 91/Intent/RelativeColorimetric/Length 39/Name/X/SMask 148 0 R/Subtype/Image/Type/XObject/Width 44>>stream\r\nH!\u000e\u00000\b\u0004\u001e\u00043kU\u0013\u0000\u0000\u0000`T3O\u0001\u0000#\u0000d\r\nendstream\rendobj\r123 0 obj\r[/Indexed/DeviceRGB 1 149 0 R]\rendobj\r148 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 44>>/Filter/FlateDecode/Height 91/Intent/RelativeColorimetric/Length 44/Name/X/Subtype/Image/Type/XObject/Width 44>>stream\r\nH1\u000e\u0000\u0010\u0014\u0005\u000fM!F?S&\u0000\u0000\u0000Ҧy^w\u0019\u0002\f\u0000'W\u0000\r\nendstream\rendobj\r149 0 obj\r<</Length 6>>stream\r\n\u0000\r\nendstream\rendobj\r124 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 150 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r150 0 obj\r<</BC 151 0 R/G 152 0 R/S/Luminosity/Type/Mask>>\rendobj\r151 0 obj\r[0.0 0.0 0.0]\rendobj\r152 0 obj\r<</BBox[207.677 258.435 210.765 252.049]/Group 153 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 154 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n3.0877088 0 0 6.3859433 207.6774445 252.0494205 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r153 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r154 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 44>>/Filter/FlateDecode/Height 91/Intent/RelativeColorimetric/Length 44/Name/X/Subtype/Image/Type/XObject/Width 44>>stream\r\nH1\u000e\u0000\u0010\u0014\u0005\u000fM!F?S&\u0000\u0000\u0000Ҧy^w\u0019\u0002\f\u0000'W\u0000\r\nendstream\rendobj\r119 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r121 0 obj\r<</BitsPerComponent 8/ColorSpace 88 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 83/Intent/RelativeColorimetric/Length 287/Name/X/SMask 155 0 R/Subtype/Image/Type/XObject/Width 101>>stream\r\nH׻\u000e\u00021\fD4\u0012 \u00166v1\u0014͑9\u000e%\u0011\bU\bcD\\\u001bA\bb\u0019\u001d*el\u0004\f\u0014\u0018\u0018E\u0000L31D\u0012GLƨ2I䑼R0L\r1U#ԑ81Lӈ1}W\u0000`=2\f\u00101\u0015a1`Cg0E \u0017L13+\nCSOqm\u0004!0gt\u0004\u0018\u0006\u0013f\u001a0.\u0002`\u0002F!=%h822I\u0002S0L\r1U#ԑ81Lӈ1}W\u0000`=2v\n0P`U!\u0018+A>\u0019\u0010S\"Ol<\u0018u~\u0013`\u0000\u000f\u000f\r\nendstream\rendobj\r88 0 obj\r[/Indexed/DeviceRGB 1 156 0 R]\rendobj\r155 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 101>>/Filter/FlateDecode/Height 83/Intent/RelativeColorimetric/Length 287/Name/X/Subtype/Image/Type/XObject/Width 101>>stream\r\nH׻\u000e\u00021\fD6\u0012 \u00166v1\u0014͑9\u000e%\u0011\bU\bcD\\\u001bA\bb\u0019\u001d*el\u0004\f\u0014\u0018\u0018E\u0000L31D\u0012GLƨ2I䑼R0L\r1U#ԑ81Lӈ1}W\u0000`=2\f\u00101\u0015a1`Cg0E \u0017L13+\nCSOqm\u0004!0gt\u0004\u0018\u0006\u0013f\u001a0.\u0002`\u0002F!=%h822I\u0002S0L\r1U#ԑ81Lӈ1}W\u0000`=2v\n0P`U!\u0018+A>\u0019\u0010S\"Ol<\u0018u~\u0013`\u0000l\r\nendstream\rendobj\r156 0 obj\r<</Length 6>>stream\r\n\u0000a\r\nendstream\rendobj\r120 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 157 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r157 0 obj\r<</BC 158 0 R/G 159 0 R/S/Luminosity/Type/Mask>>\rendobj\r158 0 obj\r[0.0 0.0 0.0]\rendobj\r159 0 obj\r<</BBox[218.695 247.769 225.783 241.944]/Group 160 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 161 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n7.0876953 0 0 5.8245417 218.6949463 241.9441961 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r160 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r161 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 101>>/Filter/FlateDecode/Height 83/Intent/RelativeColorimetric/Length 287/Name/X/Subtype/Image/Type/XObject/Width 101>>stream\r\nH׻\u000e\u00021\fD6\u0012 \u00166v1\u0014͑9\u000e%\u0011\bU\bcD\\\u001bA\bb\u0019\u001d*el\u0004\f\u0014\u0018\u0018E\u0000L31D\u0012GLƨ2I䑼R0L\r1U#ԑ81Lӈ1}W\u0000`=2\f\u00101\u0015a1`Cg0E \u0017L13+\nCSOqm\u0004!0gt\u0004\u0018\u0006\u0013f\u001a0.\u0002`\u0002F!=%h822I\u0002S0L\r1U#ԑ81Lӈ1}W\u0000`=2v\n0P`U!\u0018+A>\u0019\u0010S\"Ol<\u0018u~\u0013`\u0000l\r\nendstream\rendobj\r115 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r118 0 obj\r<</BitsPerComponent 8/ColorSpace 116 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 214/Intent/RelativeColorimetric/Length 4514/Name/X/SMask 162 0 R/Subtype/Image/Type/XObject/Width 333>>stream\r\nH[\u0016G\u0012\u0007pxGx\u0013\f^\u0010\u000f\u0014\u0016!1kx\u0011Pn/ޞ>z慙iPϳ>a<U]UU%GՅO!G%\t19GttB$M\u0011\nss\fo18+L}\u0006\u0006sJԫpSsTc6ؘFP诜\u0014i<`\u0002=tp\u000fi\u00141p\u0006v\u00178is\u0004\u0011\u0014'f\n\u0003yرFiJo\u0004sJHӱcZ\u00139\u000eҘ\u0007D\u000e􉖦&ܚda\ñS0MMX\u0013f\u0003{aj)N\u0013'4<x\u001fC\u001fbb\t\u0002ЬoL9)r\u0004yY,8\u001f0F'nLm)1\u001f<\u0001|\\a\u001b<-\r}Pin\u0006i\u00031?Sfm\f\n3l9ߚ\u0004&bږɓ\f&l6Ѕa\u0017铄&43ߘ\t={B\u001f:-\tSkiץgwsPxl,&?y͖\u0016j:G\u001d,1.\u000f[dZ[\t4yM2}o\u001fR`ֆ>raim\\i:ɵyj'55O]HΜ4\u001f3{a\f}sL̎\u000b\u0013[Q\u0002sЇ9gQ&3\u0014&)0\u000f}\u001cs,o\u000e\u0011\u00071Ԗ;v&+\u0017.(6d#\u001bY/ i[548KL\\ݩzgo]¬,wl\u001ebio[<nQΤG^mI\u001ea\u0007g\u001c;-҅\u0019Ynٲ54S;U)w#w5\"1\u00066yuShb\u0007=\u001cU\u0001\u001f\u0016&\u0017[7m\u0017/ښ`\u0013\u0015`ZI\u0014f;}\u00147o\fmSa~0\u001dM\u001d,Gǈ6~G5r84;;cLѝ\u001bA$\u00012х1eǘm\bM9:mM4|ew&1k\u0003\u000bS`n\u001c^r1 \u0011k\u0014L3}\u0014v}`\\Ƥ7w^3\u000f\u0012m.zc0ׇ˗fA\u001d\f\u0002;Z6fje\u001e \u0007.LA)uh0O\u0016kژzD୩0\u0013ͪ*kd*`MX\u001a̯׭[\u0017ڌɕ+\u0012nt4LmnaV'0ׄEs+Z-\u000bg\u0010s\u000b)}\u000476\u000b;Tk֬]\u001b\u000eU\u0011Zg~=rJ`\bJ\u001dŴ\u001f\u0019YƘV\u0005Rst\u001a\fi\t6M\u0017L5̓.g\u001f?qa_1FV\u0007@sM${iF7y=#L</ }eYn̍\u0001\u0016\\bEht_#0eiZ\u0011yԥ\u001e^\u000349,Le)oL9\u00118_~ãi\r\f2ɓ֥&ij1\u0001f\t奩ѹy]iosom&\u001eA_e\u001cT1WA9nƚVi^N\u001es:ey/{L)DK\u0015F.I`\u0019Dl1ԥ\u0019afuf\u0018L!\"\u0017%M2\\&R,\u001a[xMք~\u0012#(\u0007w&?Z\u0001EW1\u0017/)\u0010ݻ4g=joG\u000f\u0013kƘ\u0015|\u0001d0u˅%Ks`T#_\u000eͤ8\u000eJ`*SanÅѺ0&_\u0014%\u000b\u0017\u0016`=y^@SHj4-ξ\u0013<.-̅\u000b\u0017.7\u001a{,Mz\u0016\u0019\u001c\bk-\b1[)0yD&wvv\u001ef\u001c\u0017\u0011WN{3҅\rb&yѹ/\b\tuDn$*np0\u00151\u0017E\u000b+[abMw=+ӌt\u001aFs_F\u001fQҬE0\u0015f\u0018ME<*p\"̶39|\u001bz\u0010)hr\tW_qnz8Ĳy\u0015i!\u001cR\u000f\u000fj}\u001dME\b͞^\t5eYu\u000b̈́\u0013~lhoF\u0016ߘ&-s\u00024[Ԟ:/\u000e|\u0013c$I\u0014fޜ=\u0000ntr=5`\u0005ݛ9~c\u0012{\u0000LqF)Lpaǖs\u0003\u001fX\u0019c23HqjM9у(pj0\u001cm1/\u0005\bM\u001f9wn\u001e\u001fP)M\u0001.NUeqqd\u00146˭\u001b^1]K\u0003烇A\u0019dq&͞%U90\u0007ޘ+\u0015\u0013ZƘ| 4N\u0014Q\u001a\u00175=ąIYI}\u000f\u0014&heTh{=G6.̰b&-ǪGaR{TS`bO\u0005gl\\vpW\u0017\u00149{\u0018\u000fjd\u001a\u001d\u0017Z:a\u0014\u0017gjlq\u001bK\t,\u0005fŜ\f&d6w\b\u0014\rD\u00105..f4׹]>Z\u0004\u000bs\u00193*GR0qV\u0017\u001eF7a\u0014i\u0016\u0007^\u001bЖ\u001a7(UӔfRqu&~\u000b4׋d{e::\u0016i\u00183#gaښU&,Xg\u0004<mB\u0019efOKL]FO1\u001d\fe/K%q]|+3c+̙3qɫ\u0013\u001aϛ<Qcrܘ=\u0003!ģRF{*P4\u0004hyl\\!\u0017#\u000b3caa~o` EӚ1@|Rո\u0000Lgc\u0007\u000b;\u00169\u001a\u001cC`2\u0016\u0006\u0015i\u001avl\\Еi̅Z\u0003*&\r\u001fBu͉)Lo\u001bL~e`r3\bG=Tv@jl &7~2E01 /\u0016g\u001cJPTX\u00063㳆xK&Ta2h\u001aLZ\u0014=\u0012\u0017Vh00\u0010d+LҔ\u0000Ҵ\u001b\u001d\u0016i4Vj._\u000bsAʍ(g\u0004ࠥI5\u0004\u0014ٛz'0e\u0014$\ns.4}\fn\u0015(_2t2Qa~Yъ1\u0007]L\u001fD\u001eԀHٳ\u0002w33#sagHjuXCXNF\u0016&.MF3$Qg@Jcm)IEӹLAn\u001eD`Ɍ)rta^P]}2\nS\u001a?~H91\u001f\u0001P\u0018\u0018#\u0007\u0013\u0019WU柱-&܏\u0002o&8\u0019ߒ\u0004cbѴ(\bQ(WLjL\tS0fDǋ\u0019qFu\u001b\u001c\u000e!,R3\t:a\t5<VQ\u000eH`7\u0004,IX~,i\u0014M7^@>_ |0\u0003\u0010e-0VO*D:\u001e\u0010\u0013c>}\u001aE(ٔe\u0016,?IN}`>\u001e\u0006}=\u000eg\u001a$,\u000fgD\u001cФrג*M\f$2\tpނR_4P-<\u001eL0xK\u001fА\u0016LE-<1X[Qza\u000eQy!Sa\u000bO\u001b*|bۉ~\u0015\u0016\u001fcBK\u0006\u001f3Ɠ\u0016\u000b\u000b'I`2OsX\u001e>2ʛ7oJ=h90}0>W8/R\u000fZJ\u0004-ߘ2CB\u0011A~6N,)'I\"t2<<\\1JI2}`oSbǈrxtS\u001b3klK\u0018eA&\u0019\u001d\u001d\u0019\u0019y_!KbL8&C\u0007$rsx\u00188\u000eG#߿{W\u0011LZaF2}\u0004\b2\u001cU\u00059H\nʿD8`I4oLiI\u0017$`2O7\u00110H2rL2?\r} 2f\u001cՍ-\u001diJa)\u0012dAR\t船!\u0015_I>`w胅ucҖK}\u0012E)\u0015HI_0\u0014}b?f\tY\u001d7{V%)\u0001b@\u001bÓHk$L_?\u000e_,z}0D<5}&9>j]-M6>\u0019K%:\u0004HV\u000eZi(7n>\u0018O\u001eE}!\rsT\u001erhee0\u0003xqLIntp>\u0018Kr\u001f]B\"D\u0001K\u0013$/̍nTJVڧ婮\u000fƓ\\1$+\tV\u000eC/l\u000fƓ\u0010\u0013\u0015ӯC}-!k\u001feݘp\u001f%\u000f>β\u001cJC9`\"ʣ4p%b\r9\u0012r<Z\u001aJ\u0013\rZI\u000f_r\b'\u000f\u0007cIx?\u0017\u0013XVc+e/iF\u000f<-X+\u0017s1\b\u001f(\b\r425\u000b\u0016}\u0004+&,f5t\u0012C'\u0000˶r\u001f'冀htl\u00120o7$q<\u0015<ƽ\f,;LQ\fO\u0012\u0014Y֢et>j\u0019Zwd\u000f,s4w?r5#bB\u0019\\q+ʉ0^BL]\u0006zx%k\u0016QC/&\u001a=q1a1r\u001f}XL@kTLǘa1e>9]=z0cLEw\u0015\u0019N\u001f\t\",:^ٶ\u0015S.g>u8}ҽ\u0014YLOD1O\u0014S,\u001e-O[J/f9\u001325̾\u001e_rR,Y\u001e_rɜb\n̮X\n,\u001eE/b圞>~1esN\u0014{krv5|R2'y1rƖ\u000fxN#\u001c}1Ec\u0016/`K\u0013$KN\u0012-&etFI\u001a$^rh1I$ZF1)QK(&eԒ4I\u001a$bRF-IQLҨ%e\u00144jI\u001a$ZRF-IQK(&eԒ4jI\u001aŤZ\u0012`\u0000Y\r\nendstream\rendobj\r116 0 obj\r[/Indexed/DeviceRGB 165 163 0 R]\rendobj\r162 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 333>>/Filter/FlateDecode/Height 214/Intent/RelativeColorimetric/Length 5856/Name/X/Subtype/Image/Type/XObject/Width 333>>stream\r\nHWW\u0013%vXc\u000b& X;6L,\"bQPQ\u0013\u001bvŊ%Q\u001aEsfN/\u000b\u001e\u0016{g={Ofˬ\u0013\u0011\u000fZЏgcB3\u001d\u0017&B\u001fի\u000bB3B?̂&u\u00180\u000b`B?51h\"˂UB5djjU\u0013g\u001a\u0001I@l\u0019{֮]S\u000bMʕ+C?\u0011ڵ\u000fʒl院kki\b̊nSTit\\фӘuEENNW\u000fF5׭s,%\u000b\u0005f6g0U\u000e\u0005N\u0003˼?q\r\u0004Cm\ff\u001e<74e#\\3z\u001c\u0004ss\u0017!\u000ei\u00160\ra\"e˖&q5Um'LdtIO\n5%0t\u0018ݾ}X-G%K\u0016 es\faLNY.^(%}n\u0001^4=&War\u0016o[\u0001az1)M\u0002s\u001f7Mrץ09˟\u0017\u000fImP[lꑡLp\u000b\u0016̟?/w&aoJ4i6>\u000eaΟ7Пٹcv\u00060Fg6w<OE\\\b̟~\f];waJЦ\u001ff%9''''lv\u0017嗦AuDY\b̙\u001d\u00132{v\u0003L&ݏ\u0004Lo\u001fc*&\u0007fd=5DWi\u0006Ӿ}\u0016\u00193'g69sF菏xxhnVh@Y\u00193}0g͜1czvp\u000e߷d^\u001bVWs)S\u001b3\u001cgQ20ggO\u000b 9x\u001a]\u0004zli0iu\u0006s6\u0017fSBcb\u000e\u001f:xn\u0004\u0005Ӳ\u0014)bc\u0002aNϞF`N\u001c\u001aE6_=bG\u0006su,e:n\u001f=}PSL<ibh\u001a\rGJKuȀYU\u00063f_¤,'N\b\rSv\u0014`Z\u0005w5M3͙2\u001d+\u001cM.9aqo\u001f++;z䈀\u001f\u0003 [\u001a\u0018ilE4}rDƜ0Ǎ\r\r\u001esIS\u001a\u001dMK\\k\u0011ߘ\"}Ǐ\u001b;vl8'0<\u0004WT\u001b\u001cKksqI\u0002KȾ.L.X\u001e\u0015\u001aO]I\u0002!M-i`\u0004\u0010Wyd&\u001f3fQ#GF\u0014u?\u0019M ؚ\tkg\u001a0y*$)L9bxhJq\u0011@ӹ5\u001d4mf\u001daɄT)`rU#\u000f\u001f644Z\u00197L\u001e!L\u000eK3v&04\u0016i\u001c6lаbϹgϸh\fR\u001d0:f\u0001d4#r)LbN2IX\u000e\u001d\u0019\u001aXp9U'\u001fyDijeӖڛ5&\u001d0g{*&D99dHVVf<S~\u0001a+M#)L)M\u0015&w͗sK4˩0E4jj!堁9\u000bSk0ڄyl47Y0\u000b/HleĒu\u001e?c\u0014$,\t́\u0003\u0002RsK.^4hrk#צk2+2\u001d]F9\u001c9\u000b\u001c4p@sˌ&3Ӭ\u0003Lf\u000eh\u001a0\u001f\u000f \u0019\t2Y/2\u000eI4HE\u001c&\u0011fFFzz\u0010Ԝs+W6\r:閦\u0003A<\u001ceU`*+\u0013ㇳ|8\n3\t3#Zjҩ9kLH$Ӧ\u0011&o0=<|?\u001b%̴\u001fJ97oܸ~J.M\bQ6\tm2M/\u001c`KrQ\u001b3?_ҨV͛5D73$dT`\u0001d\u000f\u000fa\u001c?RC4a\u0012i?\u0010R5oqѝͽ0lxU\ni\u0012Z\u0000]\u0004]\u0014f\u001a\n_w}@9wܾ}\u001a]*\u0014mXi\u0002f\\ΔTT#K\u001aL\u0005a\u0010}${tl2ath\"ҙ\\>)S?΁f$\u001f\u001a㕎)'49ӧwDRsN{tW8A\u0010\"4K`q89M\u0002\u000eoP~\u0000qBc0ɳ\u000f\u001ca0lyP0ЭY!#șA'qo2\u0018\"85i\u001d2Ue23\flLL\u0014\u001e\tG\u000f\u001f<\\\ttWsҤ84h-5WL10aa\u000eԄ\u0002ݻWO\u0002Gȩ#Awkri\u0019Ĝ4iC:7'P\u001f\u00132;> `\u0017mݻusGFO\tqIh\n(4\"ke\u001a;\u0013I\u001c>\u0019ɑ%\n%:hy/ÇּkMJSlΣbs\u00123٠W7#\rQ1ӕ7&ҥ7\u0011QsN'O(Lf\u000b&ߛ*M9\u000fK\u0004gC_fL̟)eJo\u0014bcvC|`fyVA\u0015Y=<\r\u0019NJI\u0013hF6\u0012kf\fS00Q\u0002fܘ\u0012\b\u001egϪPּe5m\u001dh*^/\u0005eҵ7i0k4\\NM>Ji))ϫ4\fҌ.qjd1Nj370E32`fee\u0015S\u0011fO12\u0004fǎ\u0011˗/9'Z\u0006a^\u0003x\t+8e,;3@T`B\ba\u0014\u000fԅIY\u0012\u001d:DW(\u0017~k\u001dT<Vv\f\b߈?:̑beJaWn\u001f\t\u000bS\u0017&l>\u0007~\ni\ni\"Lylp\b<{V\tڤ4#z>1Yn\\VL~H\b+β}(\u001ekJSl\u0012i\u0002NJX?/~XY\u0014shFxLh\u0010;$վ4L\u000e0۵k׶/{VYG\b\u0013\u000b5)NP'\u0019q_8\u001b\u000e?\u0002D\u000fL+fg\u0000m6m\u001aw(74ѵNy2\f'EЄ\u0018oIa-\t0˿w\b.L\u0000uz?!M4\f\"[\u0013\u000e!B\u0013ݎv\u0017%\fyqKR\u0001<$\u0015{NϞYNJ&I)J|Hy4'Sܘ=l'a~٪\u001eo\u0001iE2Хѕ\fb\u0010dDD&W'\u0011癨\u0007a-SɅ[\"?K\u0001U]qVWa;D턧蝗*\"$4\u0013\u0001;\bs\t#`RSaE,}\u0014uY]0\u0019M\u0011AMWVr\u0000\u0014ga\u0018A'\b[\u0012\t͈dQE`j\u0019\u0003\u0011\u0007ek6wIi?;\u0002-\"Ϣ(Լ3r\u0001Sn\u0016fd\u001f\u0019Qљ8Q'{-;3м#oI\u0019┤d\u000bSݘm-a\u000bG:\\ѝe\u0013p>D}>PrC\u0018\u0013O;e*]9\u001f!L-}:t}\u0012ah\u0011gk>j0D1\u0002\u0005<\u0001hRgr!LWY9$;h,[$0cᬩ`Jie4wRݟP(P\u0013\u0007;,+F;#T\u00180{aauH*&WXh{55.ni\u0012UU@\u0014xj@\u001f:@J7-\tT[&_*L>\u0002\u000ea\u0012]8?X4Af?²\u001cNqR\u0012()\u0017dS\u000e )\u001bw\u0018\u0010.>\u001aLҦ\rS\n\u0013$\n<)NT(l!yG\tTqJ\tSEC)ͿBO4K\u0006QI\u0003Q`3,\nS\u0014:Ob4W8Q&&SE\u0011h0f\u0011TVدן0\f'ߚ1M\u0013Ӵ_?i*jAEE\u0010.r\u000b\"whgYvg\u0018&6_w=yʽb1.yS\u001aQy4(L:氱\u0013Ky|}k[LoqQ\u001dT7]W,gGN)\u000f>_CG\u001d>EoXjC*\u0014yeOwbw\u0017]\f0\u0007%EMDS*\u001aU\u001fՒI1b\u0016YtѰ\u001eq!i:\r>\nP<\u001eb7(fp_+f`GF`w\u0017\u0019\u001ezJMU>\u001ePoՒiܘ[\u0019 U\r[PUD^J\u0015SbE.oٔk\u0012ˈ\u0016CCx2W\n/\r\u001aV\f-z@\nOɊr\u000f\f=\nEE1=h\"}\u0007s}zt*\u001eGb\u0006)V̀&j?m_4\u0018Ѧ\\\f9[2=Oy\fYJL{s\u0014g/rvLߊY\u0000S,ZSC\u00171s}bsGF;\\\u0007퓃97\u0016rE: c1\u001b!H\u001eP-{\u0013ƾ0JoSΟ\"kQ\u0016\u001c)8G\u001edry-\\L?faƻ<8G\u001ed4i[a\u000b̾VObz1]`ɠ\u001cx鹘>MOt5\u0012_*c>4\f9?NRq\u0007\u001d?f.i#a?d'X?cLyCR$\u0004:h&U&&!SS\u001fv願\u000ecyi㼅\u0013\"\u0004e\u000e>ŋ\u0015\u0013Xs-⿛<<,,1d}z(Z{+\u0014I\u001e<.Аg&HLpZ!\u0012F3R\u000fZJ\u0015t0%=\u0014E\u0014F2;s\"4MgbRi8# \u0019#}dn~c\u0015eY\u001c7䓼HIG87G)Fy,+\u0005)5so)|\u0019\u001a1$uJtCŤ:䬘t\u0015yX':|#nŤ\t\u0003f9Sm\u0004\u0011 \u0017|R\u0001MWK)}!7$\u0011\u001c!u6\u00140._ ŋ|\bdk\u00065U$\\z\u0006\tj}0ׇ\u0015m>uqA\u0012GNI\u0007\"J|k쓡\u001er\u0016=p0\u001b\u000bpC\u0016\u00142JIF\u001apb[N\u0017\u001b%\u0018nGBPY[k\u000f\u0013{'}C0\u0019$U\\mJIlo\u000f\u0012R`>b\r\u0018헪^_}2pLÒ`\u000b-@+qEk%\u001cV\u001b(nlnmoc\u001f\f'\u0002Ϭx}\u001a~SLHN$ވNB+)?:\u0007}Z4SOǺ^u\u0014ҐdǛXnmQw]샡b\nfsՖlRRͭMJ\t\u000f\u0013\u0016M[C^\u0007EM\bI\u0012AI$\u000f\u0007É\u0016ٯ\u000f1Jژ6*y)d\u0007za\u0010`8qv̹y\u0016-sK\f⏎dw$ܡĒ`\u001e\u001e\u001d\u001dc\u001f\f%N1uLd$l\u0007:tķuJfI(ONO\u0012G|!-i+뒒_$#pB0Zz)0ՅI0i/[1(jف/\u000f%x}00Y\u00156n\u0002%}E/|\u0013˃\u0003\u001cd(qWL~cb\nLݨ-CRX2̋\u000bD`.h+&,f=\u000bJX\u0013Iq]PJ>\u0018NԎn̦]L;0\u001cS89`^VS\u000f5CفG|\u0017\u001eqxŏ)9\td(iȏ\u001f>#\u0015֖|i)3⪗Ĳ\u0019X.lt\u0010}HX{z4K3p\u0002YLc!\u0012#.zy&f\\\\Q%G-\u0016GO[}H\u001bq{yaXVӻ\u001c0;|O疧T409\u001frE1w͍\bK\u0018ree9ń\u0015c\u0015Se`VsP7&|Bw\\.Ռ\u0007Y]NG}v!W+.f553\u001ff-^z,i>[NoL|4y\u0019*皱b\u001akvcұ\fbVS\r#\"OdYQL}}\u000b;fE9۔],ʩ)C1ֆ\u0013f553koL%/hYYN1k\u001f\u0015W˪rj+*(cY\u0018!fF1aȏܗ'q}0,OU7֢\b7f9\u0014?ˊjf݊y%r\u001aO!2籽\u0016Tsa]̪bf)\\̪bf\u00153\u00159'YjIC\u001e51d)\u00122abFMz}2\ryĤbFM*f$˨I1,&YFMd\u00195\t3je$̘IQ,&aFM\u001952j\u0012f$˘IQ0&YFMd\u001952j\u0012f$˨a+\u0000[*t*\r\nendstream\rendobj\r163 0 obj\r<</Length 498>>stream\r\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000~\u0000~\u0000}\u0000}\u0000|\u0000|\u0000{\u0000{\u0000z\u0000z\u0000y\u0000y\u0000x\u0000x\u0000w\u0000w\u0000v\u0000v\u0000u\u0000u\u0000t\u0000t\u0000s\u0000r\u0000r\u0000q\u0000q\u0000p\u0000p\u0000o\u0000o\u0000n\u0000n\u0000m\u0000l\u0000l\u0000k\u0000k\u0000j\u0000j\u0000i\u0000i\u0000h\u0000h\u0000g\u0000f\u0000f\u0000e\u0000e\u0000d\u0000d\u0000c\u0000c\u0000b\u0000a\r\nendstream\rendobj\r117 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 164 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r164 0 obj\r<</BC 165 0 R/G 166 0 R/S/Luminosity/Type/Mask>>\rendobj\r165 0 obj\r[0.0 0.0 0.0]\rendobj\r166 0 obj\r<</BBox[207.677 259.979 231.046 244.962]/Group 167 0 R/Length 73/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 168 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n23.3683418 0 0 15.0174929 207.6774445 244.9617246 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r167 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r168 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 333>>/Filter/FlateDecode/Height 214/Intent/RelativeColorimetric/Length 5856/Name/X/Subtype/Image/Type/XObject/Width 333>>stream\r\nHWW\u0013%vXc\u000b& X;6L,\"bQPQ\u0013\u001bvŊ%Q\u001aEsfN/\u000b\u001e\u0016{g={Ofˬ\u0013\u0011\u000fZЏgcB3\u001d\u0017&B\u001fի\u000bB3B?̂&u\u00180\u000b`B?51h\"˂UB5djjU\u0013g\u001a\u0001I@l\u0019{֮]S\u000bMʕ+C?\u0011ڵ\u000fʒl院kki\b̊nSTit\\фӘuEENNW\u000fF5׭s,%\u000b\u0005f6g0U\u000e\u0005N\u0003˼?q\r\u0004Cm\ff\u001e<74e#\\3z\u001c\u0004ss\u0017!\u000ei\u00160\ra\"e˖&q5Um'LdtIO\n5%0t\u0018ݾ}X-G%K\u0016 es\faLNY.^(%}n\u0001^4=&War\u0016o[\u0001az1)M\u0002s\u001f7Mrץ09˟\u0017\u000fImP[lꑡLp\u000b\u0016̟?/w&aoJ4i6>\u000eaΟ7Пٹcv\u00060Fg6w<OE\\\b̟~\f];waJЦ\u001ff%9''''lv\u0017嗦AuDY\b̙\u001d\u00132{v\u0003L&ݏ\u0004Lo\u001fc*&\u0007fd=5DWi\u0006Ӿ}\u0016\u00193'g69sF菏xxhnVh@Y\u00193}0g͜1czvp\u000e߷d^\u001bVWs)S\u001b3\u001cgQ20ggO\u000b 9x\u001a]\u0004zli0iu\u0006s6\u0017fSBcb\u000e\u001f:xn\u0004\u0005Ӳ\u0014)bc\u0002aNϞF`N\u001c\u001aE6_=bG\u0006su,e:n\u001f=}PSL<ibh\u001a\rGJKuȀYU\u00063f_¤,'N\b\rSv\u0014`Z\u0005w5M3͙2\u001d+\u001cM.9aqo\u001f++;z䈀\u001f\u0003 [\u001a\u0018ilE4}rDƜ0Ǎ\r\r\u001esIS\u001a\u001dMK\\k\u0011ߘ\"}Ǐ\u001b;vl8'0<\u0004WT\u001b\u001cKksqI\u0002KȾ.L.X\u001e\u0015\u001aO]I\u0002!M-i`\u0004\u0010Wyd&\u001f3fQ#GF\u0014u?\u0019M ؚ\tkg\u001a0y*$)L9bxhJq\u0011@ӹ5\u001d4mf\u001daɄT)`rU#\u000f\u001f644Z\u00197L\u001e!L\u000eK3v&04\u0016i\u001c6lаbϹgϸh\fR\u001d0:f\u0001d4#r)LbN2IX\u000e\u001d\u0019\u001aXp9U'\u001fyDijeӖڛ5&\u001d0g{*&D99dHVVf<S~\u0001a+M#)L)M\u0015&w͗sK4˩0E4jj!堁9\u000bSk0ڄyl47Y0\u000b/HleĒu\u001e?c\u0014$,\t́\u0003\u0002RsK.^4hrk#צk2+2\u001d]F9\u001c9\u000b\u001c4p@sˌ&3Ӭ\u0003Lf\u000eh\u001a0\u001f\u000f \u0019\t2Y/2\u000eI4HE\u001c&\u0011fFFzz\u0010Ԝs+W6\r:閦\u0003A<\u001ceU`*+\u0013ㇳ|8\n3\t3#Zjҩ9kLH$Ӧ\u0011&o0=<|?\u001b%̴\u001fJ97oܸ~J.M\bQ6\tm2M/\u001c`KrQ\u001b3?_ҨV͛5D73$dT`\u0001d\u000f\u000fa\u001c?RC4a\u0012i?\u0010R5oqѝͽ0lxU\ni\u0012Z\u0000]\u0004]\u0014f\u001a\n_w}@9wܾ}\u001a]*\u0014mXi\u0002f\\ΔTT#K\u001aL\u0005a\u0010}${tl2ath\"ҙ\\>)S?΁f$\u001f\u001a㕎)'49ӧwDRsN{tW8A\u0010\"4K`q89M\u0002\u000eoP~\u0000qBc0ɳ\u000f\u001ca0lyP0ЭY!#șA'qo2\u0018\"85i\u001d2Ue23\flLL\u0014\u001e\tG\u000f\u001f<\\\ttWsҤ84h-5WL10aa\u000eԄ\u0002ݻWO\u0002Gȩ#Awkri\u0019Ĝ4iC:7'P\u001f\u00132;> `\u0017mݻusGFO\tqIh\n(4\"ke\u001a;\u0013I\u001c>\u0019ɑ%\n%:hy/ÇּkMJSlΣbs\u00123٠W7#\rQ1ӕ7&ҥ7\u0011QsN'O(Lf\u000b&ߛ*M9\u000fK\u0004gC_fL̟)eJo\u0014bcvC|`fyVA\u0015Y=<\r\u0019NJI\u0013hF6\u0012kf\fS00Q\u0002fܘ\u0012\b\u001egϪPּe5m\u001dh*^/\u0005eҵ7i0k4\\NM>Ji))ϫ4\fҌ.qjd1Nj370E32`fee\u0015S\u0011fO12\u0004fǎ\u0011˗/9'Z\u0006a^\u0003x\t+8e,;3@T`B\ba\u0014\u000fԅIY\u0012\u001d:DW(\u0017~k\u001dT<Vv\f\b߈?:̑beJaWn\u001f\t\u000bS\u0017&l>\u0007~\ni\ni\"Lylp\b<{V\tڤ4#z>1Yn\\VL~H\b+β}(\u001ekJSl\u0012i\u0002NJX?/~XY\u0014shFxLh\u0010;$վ4L\u000e0۵k׶/{VYG\b\u0013\u000b5)NP'\u0019q_8\u001b\u000e?\u0002D\u000fL+fg\u0000m6m\u001aw(74ѵNy2\f'EЄ\u0018oIa-\t0˿w\b.L\u0000uz?!M4\f\"[\u0013\u000e!B\u0013ݎv\u0017%\fyqKR\u0001<$\u0015{NϞYNJ&I)J|Hy4'Sܘ=l'a~٪\u001eo\u0001iE2Хѕ\fb\u0010dDD&W'\u0011癨\u0007a-SɅ[\"?K\u0001U]qVWa;D턧蝗*\"$4\u0013\u0001;\bs\t#`RSaE,}\u0014uY]0\u0019M\u0011AMWVr\u0000\u0014ga\u0018A'\b[\u0012\t͈dQE`j\u0019\u0003\u0011\u0007ek6wIi?;\u0002-\"Ϣ(Լ3r\u0001Sn\u0016fd\u001f\u0019Qљ8Q'{-;3м#oI\u0019┤d\u000bSݘm-a\u000bG:\\ѝe\u0013p>D}>PrC\u0018\u0013O;e*]9\u001f!L-}:t}\u0012ah\u0011gk>j0D1\u0002\u0005<\u0001hRgr!LWY9$;h,[$0cᬩ`Jie4wRݟP(P\u0013\u0007;,+F;#T\u00180{aauH*&WXh{55.ni\u0012UU@\u0014xj@\u001f:@J7-\tT[&_*L>\u0002\u000ea\u0012]8?X4Af?²\u001cNqR\u0012()\u0017dS\u000e )\u001bw\u0018\u0010.>\u001aLҦ\rS\n\u0013$\n<)NT(l!yG\tTqJ\tSEC)ͿBO4K\u0006QI\u0003Q`3,\nS\u0014:Ob4W8Q&&SE\u0011h0f\u0011TVدן0\f'ߚ1M\u0013Ӵ_?i*jAEE\u0010.r\u000b\"whgYvg\u0018&6_w=yʽb1.yS\u001aQy4(L:氱\u0013Ky|}k[LoqQ\u001dT7]W,gGN)\u000f>_CG\u001d>EoXjC*\u0014yeOwbw\u0017]\f0\u0007%EMDS*\u001aU\u001fՒI1b\u0016YtѰ\u001eq!i:\r>\nP<\u001eb7(fp_+f`GF`w\u0017\u0019\u001ezJMU>\u001ePoՒiܘ[\u0019 U\r[PUD^J\u0015SbE.oٔk\u0012ˈ\u0016CCx2W\n/\r\u001aV\f-z@\nOɊr\u000f\f=\nEE1=h\"}\u0007s}zt*\u001eGb\u0006)V̀&j?m_4\u0018Ѧ\\\f9[2=Oy\fYJL{s\u0014g/rvLߊY\u0000S,ZSC\u00171s}bsGF;\\\u0007퓃97\u0016rE: c1\u001b!H\u001eP-{\u0013ƾ0JoSΟ\"kQ\u0016\u001c)8G\u001edry-\\L?faƻ<8G\u001ed4i[a\u000b̾VObz1]`ɠ\u001cx鹘>MOt5\u0012_*c>4\f9?NRq\u0007\u001d?f.i#a?d'X?cLyCR$\u0004:h&U&&!SS\u001fv願\u000ecyi㼅\u0013\"\u0004e\u000e>ŋ\u0015\u0013Xs-⿛<<,,1d}z(Z{+\u0014I\u001e<.Аg&HLpZ!\u0012F3R\u000fZJ\u0015t0%=\u0014E\u0014F2;s\"4MgbRi8# \u0019#}dn~c\u0015eY\u001c7䓼HIG87G)Fy,+\u0005)5so)|\u0019\u001a1$uJtCŤ:䬘t\u0015yX':|#nŤ\t\u0003f9Sm\u0004\u0011 \u0017|R\u0001MWK)}!7$\u0011\u001c!u6\u00140._ ŋ|\bdk\u00065U$\\z\u0006\tj}0ׇ\u0015m>uqA\u0012GNI\u0007\"J|k쓡\u001er\u0016=p0\u001b\u000bpC\u0016\u00142JIF\u001apb[N\u0017\u001b%\u0018nGBPY[k\u000f\u0013{'}C0\u0019$U\\mJIlo\u000f\u0012R`>b\r\u0018헪^_}2pLÒ`\u000b-@+qEk%\u001cV\u001b(nlnmoc\u001f\f'\u0002Ϭx}\u001a~SLHN$ވNB+)?:\u0007}Z4SOǺ^u\u0014ҐdǛXnmQw]샡b\nfsՖlRRͭMJ\t\u000f\u0013\u0016M[C^\u0007EM\bI\u0012AI$\u000f\u0007É\u0016ٯ\u000f1Jژ6*y)d\u0007za\u0010`8qv̹y\u0016-sK\f⏎dw$ܡĒ`\u001e\u001e\u001d\u001dc\u001f\f%N1uLd$l\u0007:tķuJfI(ONO\u0012G|!-i+뒒_$#pB0Zz)0ՅI0i/[1(jف/\u000f%x}00Y\u00156n\u0002%}E/|\u0013˃\u0003\u001cd(qWL~cb\nLݨ-CRX2̋\u000bD`.h+&,f=\u000bJX\u0013Iq]PJ>\u0018NԎn̦]L;0\u001cS89`^VS\u000f5CفG|\u0017\u001eqxŏ)9\td(iȏ\u001f>#\u0015֖|i)3⪗Ĳ\u0019X.lt\u0010}HX{z4K3p\u0002YLc!\u0012#.zy&f\\\\Q%G-\u0016GO[}H\u001bq{yaXVӻ\u001c0;|O疧T409\u001frE1w͍\bK\u0018ree9ń\u0015c\u0015Se`VsP7&|Bw\\.Ռ\u0007Y]NG}v!W+.f553\u001ff-^z,i>[NoL|4y\u0019*皱b\u001akvcұ\fbVS\r#\"OdYQL}}\u000b;fE9۔],ʩ)C1ֆ\u0013f553koL%/hYYN1k\u001f\u0015W˪rj+*(cY\u0018!fF1aȏܗ'q}0,OU7֢\b7f9\u0014?ˊjf݊y%r\u001aO!2籽\u0016Tsa]̪bf)\\̪bf\u00153\u00159'YjIC\u001e51d)\u00122abFMz}2\ryĤbFM*f$˨I1,&YFMd\u00195\t3je$̘IQ,&aFM\u001952j\u0012f$˘IQ0&YFMd\u001952j\u0012f$˨a+\u0000[*t*\r\nendstream\rendobj\r112 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r114 0 obj\r<</BitsPerComponent 8/ColorSpace 80 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 84/Intent/RelativeColorimetric/Length 111/Name/X/SMask 169 0 R/Subtype/Image/Type/XObject/Width 101>>stream\r\nHֱ\r0\f\u0003AK\u000f\u0005$\bY<J7\u0004!9\u0017{;n>f&\u001f2\"V\u0011E\u001a\u0013Nt\u0004\u001er77\u0001:H<S\u0004(/i\"=\fI$I$}\b0\u0000\u0000\r\nendstream\rendobj\r80 0 obj\r[/Indexed/DeviceRGB 2 170 0 R]\rendobj\r169 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 101>>/Filter/FlateDecode/Height 84/Intent/RelativeColorimetric/Length 113/Name/X/Subtype/Image/Type/XObject/Width 101>>stream\r\nHֱ\r \f\u0005Q\u00024 |iN@Rv\u000f_[\r B4\u0002\u001a \u000e4A\u001di\u001cN'ra\u000b\r\u0012(ds17e[oY##\u00123\bsk\u0015ѐ$I$IҽO\u0001\u0000<z\u0000\r\nendstream\rendobj\r170 0 obj\r<</Length 9>>stream\r\n\u0000\u0000\r\nendstream\rendobj\r113 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 171 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r171 0 obj\r<</BC 172 0 R/G 173 0 R/S/Luminosity/Type/Mask>>\rendobj\r172 0 obj\r[0.0 0.0 0.0]\rendobj\r173 0 obj\r<</BBox[229.221 253.874 236.309 247.979]/Group 174 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 175 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n7.0876953 0 0 5.8947169 229.2212219 247.9792608 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r174 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r175 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 101>>/Filter/FlateDecode/Height 84/Intent/RelativeColorimetric/Length 113/Name/X/Subtype/Image/Type/XObject/Width 101>>stream\r\nHֱ\r \f\u0005Q\u00024 |iN@Rv\u000f_[\r B4\u0002\u001a \u000e4A\u001di\u001cN'ra\u000b\r\u0012(ds17e[oY##\u00123\bsk\u0015ѐ$I$IҽO\u0001\u0000<z\u0000\r\nendstream\rendobj\r108 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r111 0 obj\r<</BitsPerComponent 8/ColorSpace 109 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 279/Intent/RelativeColorimetric/Length 3390/Name/X/SMask 176 0 R/Subtype/Image/Type/XObject/Width 183>>stream\r\nHWUW\u001a\u0006pDAĖk,-6F%\u001a\u0015P\u000eQ3`A2\u0014DPlI-3쾟>^?r׺JX{w^CY٤#VHeJ,Sbg\u0012;˔Y2%v)LeJ,Sbg\u0012;˔Y2%v)Le\b\u0015Rbgg{Bޙ._1bLmP[!~RL76ZzBB(=\u0016\u0007;\u0004o#\u0015|7V+\u001bׇaO?R[!av8V\b编)&kW\u0011Gj+\u000fBm\u0011P-\u0015\u0012fCm\u0014-Obc3K\u0011AB^ڨ'PS\u0005V`̿sBp\"e?)>\u0017mR\u0000\ny9Bm<{)ϋ\u0002Bm<ɫB\u001e0{V\u0013\u0016IYP[!<yl'oxB~x\u0004^Gp쇆\u0003~B\u001e$\u0006/\u001f\u001e\u0010`n\u0007\b\u00152!B7G[j+dQP[!\u000f\u001f>dsB<\u0001_m\u00027G[j+>\u0007\u0017?\u001fN\nypG3ld_Q\n@W3d{\u0018YkƮmuđ\n\u0019\u001b\u001bwOJ_6;R[!c6wBcBBFFG\u001fuVȨ\u0019]\u0018xBFGGF\u00145}\u0006sBFd~Q#\u001fU\t\n\u0019\u0019\u001eqZ>.\u0003Gj+dxΝaIg^3u\u0016y4V\u001da3ѴP[!X|đ\u0002Gj+-\u00030y\u0011j+۷n\u001bj+g$}ddX\u0007V2Vn\f\u0015r͛\t\u0010zoP[!?P)Nm\\gɓt\u00158ަB0ugP[!C׮)D]ܜTl\u001eFUx\u0006\u001520$smhȝy V\u0000si\u000b͑\n\u0019a\u0001ٖ\u001cBX\u0006etχRVHl#-\u0015rJ?s <\u0018j+\n\u000fک\u000f8Gj+իZ.ҧQ\u0011Hm\\\u0003W5\u000f\nlrUV_՜\u0007\u001e\u001f_\u0015+}P[!:|nuo\u0002\u0015mP~b\n\u0011lS@ΞN\u0003gr9B:;B\u000e-\u000f\np>\\rj+K{%^\u0013\u0006j+RǥKJ)ޔP[!\u0017x$SeHm\\Kr,|أCm\\ᗜBm+\u000e#gNS\u001a}BE/3c\n\u001cvwt\u0005Cm\u000eҁ#\u0015Ҏ1rVs\u001d8R[!υP[!ϟ?w.4I`W&=Ñ~\u0004\u00176Bm9c犉sʩg\u0014\u0000Bqf-遷=R[!g-|P[!,fgr˩VBVH[[\u0002JBDZ+g\u001e6\u00033\u001cj+EOu##\u0015\"cCCm\u0018xkk\u001e8\u0015r崅S[!ͧYlQzGj+'\u0000\u000f\niVnJ\ninnv\u0006:\u0003Gj+q\u0007Cm;\u0005N,\u0016.đ+/\u0016\u000ff2`SNi8s,߳Hw\u0000>Y'O\u0010l9o)<\u0002GbtSɐ\u00074G4\u0000nz\u000e<\u0014J]'vʤb\u001f;~ܺO\u0015\u0006'C\b\u000bO)Q\u0003?!4h\u0016Ƣ\u0017n\u0012\u001b\u001coypє;\r}[\rYᓁ}Q\u000eQt{;EN|r\u000e\u001fF]uS?Aw:nhEIqy$K\u0007%\\݁CQN8ǝ\u001d\u001d\u001aqgf}S\u000f\bv}\u0018xc)mk\u0012|+A~pj;E%;+5\u0001\u001elw\u0003\u0002o׎;mWJ;;>zϞ}m]ｚ(f'\u001d\u001dw`ü\u0015_)v\u0015It]ܽG\u001dVdMBݻ\u000fs'ǝrDFNq\u0013Z2$Ήn]p\tOǕᙨkj];4p]\u0013y/AU;ݵot\u001fNowL;\u0006ܪR&\fۯbDUW[W]Cj\u000f\u00166m۪MXo\u0004y+col\u0001=7b֧\u0004\u001d\u0013e\u00166󮁂\u00076\u0000;e\tTo*ۭ{g½g\u000f)5l厊fٺոwH74|7pöo;M6\u000bIu\u0019xڭq<ޖV\u0016ޯǝZ\u001b7p&v\u000b\u001f7b#qoV/wc֦qD_\u000bdyEhݩCAvLu\u0012n]\u0014tCO\\w\u0013Ss`^K]\u0014f\u000fXt[\u0019\u0015fI\u0000\u000f$g%;&z\u0012\u0003W\u0011vKP$&]7\f<1j\u0002ILU[ռ\u001fVuWDdU9[BٴٻxvHy+%\u0018\u0015rUzkeM75s$z2߽&B}(.z`H7xh[M⎉^dIV\"\u0017-ŋ\u0016qvK^\u001eLʽW91\u000b\u0016(6wR\r<8ﴚ㎉^`yn{\u0010.\u001dݻ%;&lʽT=Y{Ca펉y/^KW$|~{&\twT4q/Z$\u0007Y(}⸷:ys5[;ն'v\u0002w\u000eSD͞7oq/Pn\\'vwVDϙsѽ_v]|\u0015j\u0012\u0013]5g\u001c\u0016OtM\u0012[\u00036펉UUܳg\u0007k\u0013wʭILueYUzޢ&ݫ򎉞19\u000eU^Mև`GE\u0010Y&RWG\u001a7$&b\u0006\u001aϝY;[)q-mm[S\u001c\u0004cOpU,2R\u0006,\u001f)7:\t_&\u001d\u0013]6mZ9W[ۻ-['Ic?P+>oex߰DOUKļgV¼[De\u001e[o8\u0014ܸ\u0004㎩Ֆn7l@S\u001dwLtٔ)\u001fi'3C\u0013K\u0007\u001d\u0015mʍ65oؼ[9ю[+[p\\[;58pY\u001cqygn\u0018w&]\u0019x+:\u001btY+;>tܝ\u001dZ[dZ`\u0004)wNj\twh\t❣Lт=&\u001e;uy3Fy5)wVY=:ݝ&Iԅ'\u0015gÝC.]9+\u0005kd\u0012,\u000f*!TIڝC&)KҎ\u001b\u001cbtnw\u001c75\u00173_/Y\u0000 \u0000Ej#)@[=\u001e\u0012kngݘwOC[F]ٴ/t2&SΡcC\u0013g9;\u0014\u001ah<ḫ{w7m[d\u001cQӲuDk\u001c\u0013Q(%HB=MsµcB[\u0012lZ\u0012nZO4KG\u0002\f\u0000\r\nendstream\rendobj\r109 0 obj\r[/Indexed/DeviceRGB 161 177 0 R]\rendobj\r176 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 183>>/Filter/FlateDecode/Height 279/Intent/RelativeColorimetric/Length 4533/Name/X/Subtype/Image/Type/XObject/Width 183>>stream\r\nHgwU\u0016k{EQ: U\"\u0012\u0014)RD\u0010\u0005@BH(&\u0010$\u0010I(\u0001H\u000bh\u0004\"A+bAkι{فg2y>9˳^޵֦G.\u0001mW \u001d'\u00198hIF;N2qюvd$\u001d'\u00198hIF;N2qюvd$\u001d'Tπ+\u001fq'+\u0019v\u0005Dw;8,!zv\u0005~\u0006]\u0001y\u001f\u0005x\u0005]Gπ+}MQ\nDkG\ntS?\u00136\u0004\u001fF\nΐQ++i?|y\t\u0002??v\u0005\u001e\n\u0019\u001eZ\u0002\u001cͬ\nfy ڰT]\u0007̯\u000f@ۏGڮ\u0007\u0001\u0002?\n'Q\u0015O\tNY\u0000\n\u0018{\u0004{\n7\u001dQ\u0015w;@\u0016mW8rW0+gq\u0007v\u0019vv\u0005~\t܋F\u0015BAt\u0010V\nܹs\u0002\u001c\u000e\nttta~~:ڮO\u000eNS]\u001fw\u0004Վ}6\u0011}$ڮ͛\u0011v\u0005nܸqeoK6}\u0002\u001f]v\u0006~3$ۃ+\u0003n^7|7nyn¨\n|u\u001f_oɛM_\bڮ@[[6v\t^\u000e+phkWJQ\u0015\\f~66OD\u0015\no${\u0006\u00152+^6w\u001b<c\u0017bGmW[Q\u0015\u001fk\u0016Y\fWj\u0002\u0010ψ\"e\\\r+p2Ao8v\u0013|\u000b\n/!ڮ@K%\u0003%r~}kSo硵U\u0015h`~---\u0014)\fؒ#ڮ\u0005]H_Lb|Y\u0016GmWy\u0003.\\0p엤e\u001dav\u0005Ξ=Y:w\u0005.\f7F\n|-9G~\u000b\"_һQ\u0015h64Q7s%\\{\u001c]ƦƦ&27mjQ\u0015hhhl0?R4Kax\n0j\u0002gN>s\f75Kܗs0j\u0002O:uZ\u001bCa8x\u000fڮS'O<E\u0014݈79ì\n\u001c?~\t1ql\n\u001cgo\u0012?\u0017ڨ\u001f\u001a\u001a]cǎ\u001d/\u001bx\u001a¬\n|Eb\ncQ\u00158rQ\u0016?v</h\u0002\u000f\u001f9r͏z4ڮ@}ak~\u0014\u0012+pСz;Sv\u0005\u000e\u001c<x\u000f'+\u0001k~(.\u0011h\u0002uuP\u0017ROQmWcR\u0017fmW}ļ\u001eFmW/9Qrz\u001fv\u00051#m<\u0007-\f7k\u0002{I<B\u000f8\n޳gOu\u001e֚B\u0017PW\nڽɽ&Nݬ\nܹ 橵p~v\u0005v\u001as߽{^M,>~\u001e]\u001d;vTUU0Rs+\u000bwIS]#\u001a`v\u0005*+o<F֜z^-q˨\nl۶r\u001bWQmͅh\u0002\u0015\u0015\u0015[+*}gK]\u0004o-\u0013;\t\u0018]-r\u00167E\t5'7vv\u00056ob\u001e67oSͫv\bUav\u00056mڴq&\u0016H˷;\u001a\nm$o#N\u001d5gJ\u000fڮ@iYi5//7ۚCR\u0019fmW\u0012cnM\u0015$Y!\nlxQ\u0016#N[ڳqC\u0015@,^Ѷk^\u001afmW`V̵Լ|\u0005FmW`ݺuμmO\u0002+v\u0013oܼ\u0003+P\u0016Ĺ+\"^Q\u0015(.F\u0001+PTTd׮w⟛K\"v\u0005֬ؕh]B\u0012_S\\D\u000b3\nmW`u!!;A|}.X9)^\u0015((0\u0005w\n\u0017{۝^\u001bV`FmW`ժ|䳷\"iP\\bmW`I\u001a^(S(*#ڮ@^\u001e{8mN{\u0014E\nyq*j>X\u001a\u0002>\"h\u0002yy^\"r\u0017ڃڮ@nn\u0017gu9\u000e\u000bW\n:񼕫\u0005-h\u0002(N\u0015X`Q\u0015\u0001oٛ\u0012xA|mW 'ǉZqi*G~] \u0012Sv\u0005V8|ժ\u0011h\u0002+VH3\u0012mW`T.|Exgڮr\u0013\u0012%j\u0002˗{qpy\nڮA<P^,Jz&ڲO? .M\t+|'P\u001f-]'\u0005ީa%ŗ\u001c*~vᇤI{3\u0012e\u000f>X()\u000b\u0016.4I'):jJϛ ;E<\n=ߟ罽Ǭ\\=g\\=(e+YϚ={ܹ6p\u0014N<Y<\u0012\u0015͚5{\u0004N/LI8T\u001933$n]\u0017F\u0006\u001eigXq򶁇|Yq[O}]#>gxM_)ړL:]\u000exSQ~gvwғ&M<e\u0002\u0010b>;;NFyS3!p\":\u000bM\u001f-;>w&LȞhI|:\u0015|L,\n^><&qIw&ddmgHV}#[-\u001b34E\u001an\u000377h'{c=nܛo\u0019q\u0017w|\u0018BS0nsz9qHgF6ycSY̵\u0007J;$ү\u001dE$Nޔ$\u0014O*\nǽʨv]z\u0014<;T\u0014#jvQF\u0019c)n.K\u001c\u001e\u001fxrM|qWYzĈۉ\rO,t7׎Iz_\u001b>|ȑFXwؙIGt;{J\u000f\u001d]EyQ\b\u0010wDjC\r\u0003o\u0013xVp9E\tm%nsNC=b8\u0005\u001b'oĚK;҃^ye!k6o+\u000eĸ\u0013kڝN\u001e\u0003\u0006\u000e\u001adROH|T(̆aNs)ݯ\u0000\u001e\u001e\u001e7|Ⱦt-YOtJۯ\u0001\u0003\u0007\u000e䢠+mL\u001d\u000eÛ)ݻO\u001f\u001e ڦ(C8Y\u001c8Bd&wΒtZrƻ\tnLMq2&QI:_K/ܻ \u0017;Q\u001cm7&j2iN+)tJzv8n7\u0006ĝmiaKؔ~gO\u0003go,8mP󤚤z\u000b<x'^P\u0013Ξ\u00127S\u001f=˼#\bv0\t\u0006\u0002$6G8\f6$\u001c6\u0000IڀmTUZUB?|ٙx\u0013<z;;\u00056\u000fZo\t-\u001dnЗ\u0006\u001b5%/BǍs/࢒>p:n7\u000e&/BqCAnIo5wA\u0013\t`޾Tj%O^\u0007\u0013\u0018L\u00178\u0016!$)po#8\u00043\\V>7`d$tn0\u001c\u001a7,o\u001b'\u000f\u001bX:AΑ>:>\u001e\fUggV#s\tku&\u0007GG\u0003⶞\u00008+OtP\u000bS5ǜ&/_\u001d 8kfv\u0004S4߷ܠI\u00167_<Fomݳ\u001cIޞ~upxh↼`ڹ|g\u001eDM2Rwߒл~o>={݃mҷ[s%\t(n˛ c_6HRoo+]m2a=HvOIͭ.g\u0012dx\u0012x .Tؒ/666t\u0013\u001b{4\u001dN%\u001c5йum\u0012Xl};'4Ы\nƦzkl8Mߎ\u00044.*Iz\\\u001e\f\u000e?9۝Ί\u001bo?3~~K7U7йv[s\u001az=3v2;G\u0012l-/ۼ&~0n,vKB\u001b\r޶]\u0007xV\r-v&[\u0012Z\u001b*\u0016:\u001bσ[喤<3\rí5Qܠ\t?\u0007CM4^\\<Sz\u0003n\u001by} i4qY\u0012\\Vؖar uI]I\u0017$tiaqCmwIñv\u000epKR͗J{hRz4q\u001bM']o9гOMK\\o7v\u001f-sHB>E\u001bǲ\u0012<\u001cv\u0007HBmܬ\u0005ac[tBG4p%\td8=\rm:\u0003i*\u0003M>HBO>~usV\u0013ׂX\u000e۵Ɏ7ø%\u000b**@o\t :G&ԏ&\n4)\u0007-j\u0019T\u0006+^s$sG\u0013\u0013\u0005k\u001bKP]vSʛ-\nn7n\u00057_,ns\r7j24f*[M^ʻ\u001fxU&\u0006zSe٠\u000e\u001d7+\u0000\u0014&eoXo)o{<9\t[:a\u0011SIvkؠ9,mbOX$9\u0004HmBq\u001ba\u0007;MX\rv\t/j-k*73f\\l, \u0001M\u0000{=~heI~:kފICH\u0013\u001es@]4,\u0015\f:w\u0018_ɦ2!uIP>\f\n;)4a;M<JsLw'ۿ`9vjd\u00124Sؾ|tyƝSs\u001f\u00063q9%\u001dԬ1\u0013\u001ceIjR:M3xQwFeNM\u0019?\u0004gSFzϩR\u0003x\u001ao\u0011;'5-o)/&\u0012$Bj^XFPw\u001a^/;5=_sRqMR<ia/o9Sc<\rwj?Ij\u0001x\t0\u0000XL'\r\nendstream\rendobj\r177 0 obj\r<</Length 486>>stream\r\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000~\u0000~\u0000}\u0000|\u0000|\u0000{\u0000{\u0000z\u0000z\u0000y\u0000y\u0000x\u0000w\u0000w\u0000v\u0000v\u0000u\u0000u\u0000t\u0000t\u0000s\u0000s\u0000r\u0000q\u0000q\u0000p\u0000p\u0000o\u0000o\u0000n\u0000n\u0000m\u0000l\u0000l\u0000k\u0000k\u0000j\u0000j\u0000i\u0000i\u0000h\u0000h\u0000g\u0000f\u0000f\u0000e\u0000e\u0000d\u0000d\u0000c\u0000c\u0000b\u0000a\r\nendstream\rendobj\r110 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 178 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r178 0 obj\r<</BC 179 0 R/G 180 0 R/S/Luminosity/Type/Mask>>\rendobj\r179 0 obj\r[0.0 0.0 0.0]\rendobj\r180 0 obj\r<</BBox[218.905 252.4 231.748 232.821]/Group 181 0 R/Length 72/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 182 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n12.8420617 0 0 19.578881 218.9054718 232.8214181 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r181 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r182 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 183>>/Filter/FlateDecode/Height 279/Intent/RelativeColorimetric/Length 4533/Name/X/Subtype/Image/Type/XObject/Width 183>>stream\r\nHgwU\u0016k{EQ: U\"\u0012\u0014)RD\u0010\u0005@BH(&\u0010$\u0010I(\u0001H\u000bh\u0004\"A+bAkι{فg2y>9˳^޵֦G.\u0001mW \u001d'\u00198hIF;N2qюvd$\u001d'\u00198hIF;N2qюvd$\u001d'Tπ+\u001fq'+\u0019v\u0005Dw;8,!zv\u0005~\u0006]\u0001y\u001f\u0005x\u0005]Gπ+}MQ\nDkG\ntS?\u00136\u0004\u001fF\nΐQ++i?|y\t\u0002??v\u0005\u001e\n\u0019\u001eZ\u0002\u001cͬ\nfy ڰT]\u0007̯\u000f@ۏGڮ\u0007\u0001\u0002?\n'Q\u0015O\tNY\u0000\n\u0018{\u0004{\n7\u001dQ\u0015w;@\u0016mW8rW0+gq\u0007v\u0019vv\u0005~\t܋F\u0015BAt\u0010V\nܹs\u0002\u001c\u000e\nttta~~:ڮO\u000eNS]\u001fw\u0004Վ}6\u0011}$ڮ͛\u0011v\u0005nܸqeoK6}\u0002\u001f]v\u0006~3$ۃ+\u0003n^7|7nyn¨\n|u\u001f_oɛM_\bڮ@[[6v\t^\u000e+phkWJQ\u0015\\f~66OD\u0015\no${\u0006\u00152+^6w\u001b<c\u0017bGmW[Q\u0015\u001fk\u0016Y\fWj\u0002\u0010ψ\"e\\\r+p2Ao8v\u0013|\u000b\n/!ڮ@K%\u0003%r~}kSo硵U\u0015h`~---\u0014)\fؒ#ڮ\u0005]H_Lb|Y\u0016GmWy\u0003.\\0p엤e\u001dav\u0005Ξ=Y:w\u0005.\f7F\n|-9G~\u000b\"_һQ\u0015h64Q7s%\\{\u001c]ƦƦ&27mjQ\u0015hhhl0?R4Kax\n0j\u0002gN>s\f75Kܗs0j\u0002O:uZ\u001bCa8x\u000fڮS'O<E\u0014݈79ì\n\u001c?~\t1ql\n\u001cgo\u0012?\u0017ڨ\u001f\u001a\u001a]cǎ\u001d/\u001bx\u001a¬\n|Eb\ncQ\u00158rQ\u0016?v</h\u0002\u000f\u001f9r͏z4ڮ@}ak~\u0014\u0012+pСz;Sv\u0005\u000e\u001c<x\u000f'+\u0001k~(.\u0011h\u0002uuP\u0017ROQmWcR\u0017fmW}ļ\u001eFmW/9Qrz\u001fv\u00051#m<\u0007-\f7k\u0002{I<B\u000f8\n޳gOu\u001e֚B\u0017PW\nڽɽ&Nݬ\nܹ 橵p~v\u0005v\u001as߽{^M,>~\u001e]\u001d;vTUU0Rs+\u000bwIS]#\u001a`v\u0005*+o<F֜z^-q˨\nl۶r\u001bWQmͅh\u0002\u0015\u0015\u0015[+*}gK]\u0004o-\u0013;\t\u0018]-r\u00167E\t5'7vv\u00056ob\u001e67oSͫv\bUav\u00056mڴq&\u0016H˷;\u001a\nm$o#N\u001d5gJ\u000fڮ@iYi5//7ۚCR\u0019fmW\u0012cnM\u0015$Y!\nlxQ\u0016#N[ڳqC\u0015@,^Ѷk^\u001afmW`V̵Լ|\u0005FmW`ݺuμmO\u0002+v\u0013oܼ\u0003+P\u0016Ĺ+\"^Q\u0015(.F\u0001+PTTd׮w⟛K\"v\u0005֬ؕh]B\u0012_S\\D\u000b3\nmW`u!!;A|}.X9)^\u0015((0\u0005w\n\u0017{۝^\u001bV`FmW`ժ|䳷\"iP\\bmW`I\u001a^(S(*#ڮ@^\u001e{8mN{\u0014E\nyq*j>X\u001a\u0002>\"h\u0002yy^\"r\u0017ڃڮ@nn\u0017gu9\u000e\u000bW\n:񼕫\u0005-h\u0002(N\u0015X`Q\u0015\u0001oٛ\u0012xA|mW 'ǉZqi*G~] \u0012Sv\u0005V8|ժ\u0011h\u0002+VH3\u0012mW`T.|Exgڮr\u0013\u0012%j\u0002˗{qpy\nڮA<P^,Jz&ڲO? .M\t+|'P\u001f-]'\u0005ީa%ŗ\u001c*~vᇤI{3\u0012e\u000f>X()\u000b\u0016.4I'):jJϛ ;E<\n=ߟ罽Ǭ\\=g\\=(e+YϚ={ܹ6p\u0014N<Y<\u0012\u0015͚5{\u0004N/LI8T\u001933$n]\u0017F\u0006\u001eigXq򶁇|Yq[O}]#>gxM_)ړL:]\u000exSQ~gvwғ&M<e\u0002\u0010b>;;NFyS3!p\":\u000bM\u001f-;>w&LȞhI|:\u0015|L,\n^><&qIw&ddmgHV}#[-\u001b34E\u001an\u000377h'{c=nܛo\u0019q\u0017w|\u0018BS0nsz9qHgF6ycSY̵\u0007J;$ү\u001dE$Nޔ$\u0014O*\nǽʨv]z\u0014<;T\u0014#jvQF\u0019c)n.K\u001c\u001e\u001fxrM|qWYzĈۉ\rO,t7׎Iz_\u001b>|ȑFXwؙIGt;{J\u000f\u001d]EyQ\b\u0010wDjC\r\u0003o\u0013xVp9E\tm%nsNC=b8\u0005\u001b'oĚK;҃^ye!k6o+\u000eĸ\u0013kڝN\u001e\u0003\u0006\u000e\u001adROH|T(̆aNs)ݯ\u0000\u001e\u001e\u001e7|Ⱦt-YOtJۯ\u0001\u0003\u0007\u000e䢠+mL\u001d\u000eÛ)ݻO\u001f\u001e ڦ(C8Y\u001c8Bd&wΒtZrƻ\tnLMq2&QI:_K/ܻ \u0017;Q\u001cm7&j2iN+)tJzv8n7\u0006ĝmiaKؔ~gO\u0003go,8mP󤚤z\u000b<x'^P\u0013Ξ\u00127S\u001f=˼#\bv0\t\u0006\u0002$6G8\f6$\u001c6\u0000IڀmTUZUB?|ٙx\u0013<z;;\u00056\u000fZo\t-\u001dnЗ\u0006\u001b5%/BǍs/࢒>p:n7\u000e&/BqCAnIo5wA\u0013\t`޾Tj%O^\u0007\u0013\u0018L\u00178\u0016!$)po#8\u00043\\V>7`d$tn0\u001c\u001a7,o\u001b'\u000f\u001bX:AΑ>:>\u001e\fUggV#s\tku&\u0007GG\u0003⶞\u00008+OtP\u000bS5ǜ&/_\u001d 8kfv\u0004S4߷ܠI\u00167_<Fomݳ\u001cIޞ~upxh↼`ڹ|g\u001eDM2Rwߒл~o>={݃mҷ[s%\t(n˛ c_6HRoo+]m2a=HvOIͭ.g\u0012dx\u0012x .Tؒ/666t\u0013\u001b{4\u001dN%\u001c5йum\u0012Xl};'4Ы\nƦzkl8Mߎ\u00044.*Iz\\\u001e\f\u000e?9۝Ί\u001bo?3~~K7U7йv[s\u001az=3v2;G\u0012l-/ۼ&~0n,vKB\u001b\r޶]\u0007xV\r-v&[\u0012Z\u001b*\u0016:\u001bσ[喤<3\rí5Qܠ\t?\u0007CM4^\\<Sz\u0003n\u001by} i4qY\u0012\\Vؖar uI]I\u0017$tiaqCmwIñv\u000epKR͗J{hRz4q\u001bM']o9гOMK\\o7v\u001f-sHB>E\u001bǲ\u0012<\u001cv\u0007HBmܬ\u0005ac[tBG4p%\td8=\rm:\u0003i*\u0003M>HBO>~usV\u0013ׂX\u000e۵Ɏ7ø%\u000b**@o\t :G&ԏ&\n4)\u0007-j\u0019T\u0006+^s$sG\u0013\u0013\u0005k\u001bKP]vSʛ-\nn7n\u00057_,ns\r7j24f*[M^ʻ\u001fxU&\u0006zSe٠\u000e\u001d7+\u0000\u0014&eoXo)o{<9\t[:a\u0011SIvkؠ9,mbOX$9\u0004HmBq\u001ba\u0007;MX\rv\t/j-k*73f\\l, \u0001M\u0000{=~heI~:kފICH\u0013\u001es@]4,\u0015\f:w\u0018_ɦ2!uIP>\f\n;)4a;M<JsLw'ۿ`9vjd\u00124Sؾ|tyƝSs\u001f\u00063q9%\u001dԬ1\u0013\u001ceIjR:M3xQwFeNM\u0019?\u0004gSFzϩR\u0003x\u001ao\u0011;'5-o)/&\u0012$Bj^XFPw\u001a^/;5=_sRqMR<ia/o9Sc<\rwj?Ij\u0001x\t0\u0000XL'\r\nendstream\rendobj\r107 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r105 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r106 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 183 0 R/ShadingType 2>>\rendobj\r183 0 obj\r<</Bounds[]/Domain[0.0 1.0]/Encode[0.0 1.0]/FunctionType 3/Functions[184 0 R]>>\rendobj\r184 0 obj\r<</C0[0.309804 0.403922 0.184314]/C1[0.584314 0.733333 0.239216]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r104 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r103 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r102 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r99 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r101 0 obj\r<</BitsPerComponent 8/ColorSpace 88 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 69/Intent/RelativeColorimetric/Length 228/Name/X/SMask 185 0 R/Subtype/Image/Type/XObject/Width 100>>stream\r\nH1\u000e0\bDQ^EJ6.\u0019;WP@kwig\u0015c\u00157mP)Ad\u0006\u0019\u0004A\u001da\u0000#`D\r\t\u0019\u0013&\u0000&e8a\b!\u0011KhL\u0019a2tp4ȌQ\u0012\u0017\u001anxQ@<P\u0013: (1J\u001d8\u0015Ie\u0011lff0b\u0004q\u0018ig\u00187` #\u0006D\b\u001a\b0L9\u0004cp5C3\f9t`\u0014\u000f#\"\u0006Fh|\u001dq0\u0011`\u0000\u000f\r\nendstream\rendobj\r185 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 100>>/Filter/FlateDecode/Height 69/Intent/RelativeColorimetric/Length 228/Name/X/Subtype/Image/Type/XObject/Width 100>>stream\r\nH1\u000e0\bDQ^EJ6.\u0019;WP@kwig\u0015c\u00157mP)Ad\u0006\u0019\u0004A\u001da\u0000#`D\r\t\u0019\u0013&\u0000&e8a\b!\u0011KhL\u0019a2tp4ȌQ\u0012\u0017\u001anxQ@<P\u0013: (1J\u001d8\u0015Ie\u0011lff0b\u0004q\u0018ig\u00187` #\u0006D\b\u001a\b0L9\u0004cp5C3\f9t`\u0014\u000f#\"\u0006Fh|\u001dq0\u0011`\u0000Y\r\nendstream\rendobj\r100 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 186 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r186 0 obj\r<</BC 187 0 R/G 188 0 R/S/Luminosity/Type/Mask>>\rendobj\r187 0 obj\r[0.0 0.0 0.0]\rendobj\r188 0 obj\r<</BBox[229.783 268.19 236.8 263.348]/Group 189 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 190 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n7.0175201 0 0 4.8420888 229.7826233 263.3476389 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r189 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r190 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 100>>/Filter/FlateDecode/Height 69/Intent/RelativeColorimetric/Length 228/Name/X/Subtype/Image/Type/XObject/Width 100>>stream\r\nH1\u000e0\bDQ^EJ6.\u0019;WP@kwig\u0015c\u00157mP)Ad\u0006\u0019\u0004A\u001da\u0000#`D\r\t\u0019\u0013&\u0000&e8a\b!\u0011KhL\u0019a2tp4ȌQ\u0012\u0017\u001anxQ@<P\u0013: (1J\u001d8\u0015Ie\u0011lff0b\u0004q\u0018ig\u00187` #\u0006D\b\u001a\b0L9\u0004cp5C3\f9t`\u0014\u000f#\"\u0006Fh|\u001dq0\u0011`\u0000Y\r\nendstream\rendobj\r95 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r98 0 obj\r<</BitsPerComponent 8/ColorSpace 96 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 164/Intent/RelativeColorimetric/Length 3129/Name/X/SMask 191 0 R/Subtype/Image/Type/XObject/Width 330>>stream\r\nH엋_UU\u0016Ǖ{\u0004B\u0010T \u0013> AL#\u0007:\u0016ʩLX6jeF\u001a眽k{޻a/X%K=\u0000Ճ\u0007W\u0007\u001f\u001f>|O?=~\u0017_gffR1A :ɟ9JFrɓ'QOﾻt^n$CO\nsL3=F\u001c\u001a}\rJ^>$%'$?{˗o+- \u0019ϓMғ\u0001ɗc~fq55u{zB2'M\u0016[7oN1M\u0007(e\u0017F2\b\u0017\u0012䢣7nܸPrArN\u0003\\$8/& )]\u0018OFL6k׮_IF{2AHΘ$5(h^r#\f<ys!\u0011|;\u000bɤ\u001fW^\u0005$o'''n/I0/>B\u0016v\u0017'g\r-\u0010|5Г^h$$\bҥKݔ:JXtG.YZ\u0017\u0007ɋ\u0017/~\u0016I2k\rAIIR\u0013C\u000b\u0019Jf<VᢼxGId馆fs\u0018\u000biS\u0010\u0011<;9H\u0013$swH&t9ٳ\bSxLzOM] \u0011EK\u0013Kӧ11\u001be>$\u0016o)NR789\nI4ޱ=0'O$/(=H,Ԣ\"\u001a\"ĉ\u0013!J[\u001edfA$/\u000e\u0003,Y>vlb\u00044v#y䢌'\u0017͚\u001c?~aJ[\u0018\u0017\bw<yd||x)e9^yIdxQIdQ\u0017e\u0001IW'\t91)pxE)\u001aeAHb8\u001e\u0005I)#⍘XIJPBQ\u0003iJN\u00129\u001f?;9t?\u0007\u000f\u001f>4\u001aR7G\u0011RtS^\u0001\\ I'&{\u0007%IՔ'\u0000IhʠR^QL~q'y\u0001\u0015)WJM䝅yR\u001ft\u0013ȈO\u001e\u0011EHF2F\r\\'0s:8%$${2)=4=\u0019nMF0S\u001en\u0000IߔX\rIɸ$K\nr>$7v\u0013η0j`Qƽ8q_y$\u0006<#P\u0010oك'~T5(a\u001f%0)?G.JY\u0005ʯb;' @H2{|G\u0014!Փ7\u0007!\u0019\u0006Af\trђCx(mkV9dt'\u001d$94\u001ee\fN)\u001e4ʂy2\u000f4 \u0007\u0007CҔL9RKH9\u0007\u000eN2֤\u0017\u0012\u0014\u001a\u0018\u001c\u001cHF6%,B\u0011$xk\u001cFnSj`4MQP\u0010oRzJP;\u0003r׀NC7⣃R9\u0004.3Iڥ,e\u0013\u0002D;eϱ䦔|j!$c;#S\u0014rx\u0018D;%fOE\"?%\u0010\rȷvx(\u0007T{a%z;\u000fHNFz,;\fdOR1吙|U7s>\u0012$Y7Dt$m@92G<)Ŧ4e1珡\u000b#\u0019\u0014$\u0003\u0000ё_FtQ\u001eTsPIq)\u000bS\"\u0012My\fs)6y>*\"^\rt\u0006,4\u001fZ]ӛ\u001eɾm^whR1^\u001bʣ\u0001>q%Ԗ-$0`UH6ަ@Mj\u0016\u000fe@ٯJiL;\u0018)\u0003SR?ڼYMs\u001f\u001dԔ\u000f+6lVQjWg6e(5*6nTHj@i2wy7J5}\u0003SW\u0007?:~\u0014X\u000fPnEZۺ)\u001c~\u0013zzPRLP?D=\u0016U*\u0014icOQwwr*%IT3o\u0017\u0011|@\u0019R|\u001a#n%޾)Cu~\u000bДϡӚ.r\u0003*|R1G5Z\u0016\u0014Կ:\tR5!Psm<\u0012CSR?P\tPr\u001b!J*\u000eCHR?R\u001d\u001d\f$\u0019R#k\u001b=:o!8(\u0001I~uLK%Sh\u0004(VIBf?\u001fP~\t .\u0013RϷB}$KjU@\u000b\u0011_+A\u001fBU<r#W%DswG:D铔\u00017kMǛ\u001dj\u0005$CA\u0011f?\u001f~\u0006[%ʶ\u000b\u000ff\u000f*%IgЫYG\u0005|\u001d ߡ)_ZZ\u0000J$\u0015SnV>; ,Y٢lWje*UA5ԏpA+WB0]_G_ѡ~\u000bjjPPcGA\t7\u001bPc\u0013GlE\\)lmEM\u0006'(H\n\u0018J\u0019pVBWR?\r56\u0006(Wz\u000eveڷ;;\u000bm~\u001bZBlN{NY*r+\u0013PCC4ʰV(USR\u001150\f<;U\u0003u_^(CW6(\t\u0010:(\u001f\u001b J\fᵒoQ=JW*\r=r#Ψ>@ـRޮTWe\u0019dz\rrwB>ʠW2S(wFuu\u001aJ\r5\u0003ZC\u001e\u001dElPv(wH5\u001e>W\u0004e\bueR$ؕ\u0001&+JJ\u001dRmmr9h$wH\u0012J+ZM=CRQ,\u0019\u0015ّ(wIU\u0000e\u001dp\u000bJR5G鱬1Q6\u001dԳ;jʚ(#N)S\fl铬'\\E^\u0006*äv\n\u0014%n)\u0013T\u0012\u0004\u0011\t8n)1Q%\u001d/$n)QQV\u0013\u001dЕԣ;\u001a\u0006Y\u0019f\u001dSee\u0006\f]TP\u0010p\u001dSF\u0012\u001dmWj\u001dFzrTY\u0004'\u001e\u001c)\u0007wMJ+*iKz5ԃO2[]I=sJ1\rG;eP鴂2>J깝S:mC;zpS:\u0002e\\+vOiE9\u001e=uYQ6D=sZBYVU( \u0011-[\u0006YF!\u001f%)2Hu\u001e=8I-/e\u001d\u001eARŖlI=JQRR)\u0005eQRR:J%CUS;8ےAL[\"}zj\u0017e-vQKM#^&iWE\reᡞEUDķe\u0019E\u00156/CQR*,\r[V\n\u0013\u001cP #\u0015\u0012mY\tuUخ8<ԃ&A\u0011\u0011Gzd(*eID`\u0006,\u0007L\\\u001e\u0012%\u001bKzɊzbK\u0012(SOL\tKI.\\-\u0007Jt$[\nJQ\u0012.\u0019qI%\u001cA\u001eK!\u0016 \u000b2ɲJ?\u0005\u0018\u0000$(\r\nendstream\rendobj\r96 0 obj\r[/Indexed/DeviceRGB 160 192 0 R]\rendobj\r191 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 330>>/Filter/FlateDecode/Height 164/Intent/RelativeColorimetric/Length 3528/Name/X/Subtype/Image/Type/XObject/Width 330>>stream\r\nH엉e\u0015\u0019f,̰00;þ\f\u000b\u001eZ\"\u0014(KPQ\u0012b%fTKAIgim`.B\u0016\u0004;{{{y~?9vpI\u0001\nW?/~cz_淿\u001fߞ~g}?E2DG}\u0007?я\u001f}'?e$\u0019H$E)H2/\u001c<x#G=?\u001ex\u001bw\u001eV$)J@3\u0002OR\u0010ǎ\u001d\u0013'|k_tܔ\u0011I{cI<y\u0017_<u\nmҽ}$I@sn'\u0000S/\u0011a?3ڹws}\u0004$G\u0019s'$\u0012̒:6K;];wqd\u0012zRnWvIK%(쇷~k$\tLG_o\u001e{Htl#8o۶OK̔t8r\u0015~ⓟm\u0011I'w$l=\u0005Js-[\n@)I#Gd\"\u000eb~xRF\u001fBPF$)\tI\u00199^zI\u001cŉ\u000b\u0002\u001boy3A\tH\u0001HH2Yx\u0012u2\u0013K\u0016\b͏ްi\u0013CIH\u0012.O\u0012ʓԔo7I\u0006\bA)Hz{)'BH%Ylw$7^{퇯\u0003$f '[$616l6j$7$'LI\u0014\u0002!}$i;wYk晓,~5\u0014t\u0003w\u0002b&w'\"n -$\u000bLJ\u0004\u000b\u0004;=$cP\u0001$׼s8uMF}_<5IQ̏+Ib\u0013Zz\r%y\u0015XHfHf]̱\u00112]r\u0015A\tI\u001aTߜDrNד\u00198+V\\AP^\u001aVz{ɇ!oA򅃧A\u0012b\u000eorF0%%iӔ\u00197e\u0002&y2Briu뽙Ӫ$?eIu'3r|._,Ɣ7IRSzJPfqҥ\u0014 R#i\u0017\u001bo(\u0005I7ʬ Mt#r|[.[aʫmSfٴ\u0018/\u001bIZ\\kϹe$띈S@$p)%)M2J9k@\u0004e62ivsd\u0013Ҕ`W:3ge[$wʓ\u0018\u001c/\ffJ\nn\u001b\u001fJ#z$\u0016\u0003%y_CI\n-3\"0r({\u0012{\u0004\b\u001a\u0017\tf\\_oRIr$5\u00119\u001aI\nRly'%C&\u000b/R$5Oƙr9\u000e\u0006\u0001O\u0012Hb$\u0017/~%Dy޶)~s\u0012Q'\u000f\u001fL\u0015+\u0016-^\fHCeFj|\u0018='\u000bÔS\u0002Sz9IF\u0004d\u0013'\u0003\u0013\u00039\u0002r\u00111\u001cߪK?:\u0004iAN\u0012N$\u00039wg,ъq\"M<r}'ݟHΙKP\nSoIr\bPF띄sI\nx}9s)\u0017rSVR/\u001e%\u000e$hA?hA\u0004\u001d$#y*\u0011u\u0001AiR420s\u0013Md8$ϟ9k\u00167<eJv|'XoHɇ''3V\u0004y\u0011)y\u0013\nz3ѡ\u000e Z\u0007\u0003s-\t(8v\u0019$g0P&])9J\"'A$9lJ\\Br,\u0019A\u00132'ޔ2O\u00019,\u001cb]\u0013){\u0005\u001cRINH&$U\u00123K2oQHN2P4K%3*\u0010Uz\u001ae.OlLH\n~S)M\u0011\u001cJQp\fc\u0013'LBMIl\u001e:f\\$\u001c\u0007llC\u0013&pДQ\u00152.mJfz\u000b\u001a;<$Б(\u0015I\u0011߱MȬc?.\u001a;nxhJt~lB\"\u0004L\u0001my՘c9I2tĩ4?\u00144g4QJO˯FQ(~V)ބ\u0018~X5j4@\\\tL{o`\bM\u0012YyQ$A9QoQW'oO|k(57G(~OU\u00144LPr\u0004F\u0012Q\u0018\u001a1BiJ߆)?c\u0012M(\u001a>@9JՉNOBѰa&ITЪ\u0010'hB$p4t@9<-R9jB$@\"$\r\u001e\"P6()i\u0013b#Bg\u0013A $D\n\u001dJߜd\u00129x\u001a8h2:$thUH~\u001a\u0019JӔدAԀ\fԖک,{\u00064\\ݔ$c0\u00194Yd?w~\f$!Ju,aA\u001cJ\u001d\u0001M\b1ۏ\u0014$؁RoSoAU\u0014%0%E9tV!JR䡃\u0014\\c\n\u0018\u000b\u0012d5(;QWgly)_^MM%%QFTF\r\u001b!٫\u00171%e\b\bOL\u001d^~c\u0003]={RSSZ\u0010:\u001a\u0016x*)I)߁Fj&ERCI{r\u0012Z?'(\u001e=\u001a)SI{`rBTNRG|\u001aO\u0007\u0019j\u0001Pӷ\u000fB\u0003 JiJUWg*@\u0000Р\r\u0010%9DuFUd\u0012\u0015\u0001^G٤Q\u0017rdM\\\u0010T_o\u0003\\u!m$\u00127\u000b\u001dG\u001d({G(\u0007\u001a(VIPb!\buPJ\u001c%\u0003\u0006rC~[(ɩ~C\u0010MУѱ̔C]0Ե+@I]QN\b`ױPNj~B\u0018UG٠TR\u001c&j%\u000bp:O\bC]Ģ\u00143@.~A bTd_g\u001c\u000bBQ]\u001d$B\fZ)SY\u001cPT[\u001bR!P+5\u000fFkk9K2.տ1\n#\u000fF;+$h#$@\tY2WWJ\u0019{`TSeH}vS=~8P\rW\u001b\u001eJۉPb\u001f\u0019Kκ\u001eW\u0000Ǟ> UUi(}mH\u0014RĞ> UVJ\u0014eg\u001d%\u001d+eC\u0017$\u000fH$p22e# QbO\u001f:uP\r\nb!*CTb\u000f\u001f*:I\u0002eiK\rg\u0007{TAQ\u001a,\u0001.^)Pb\u001e***+]ǲsT\u001fGكR*AY۹*\u0012%س\u0007TJCY\ts.:JR*\u0005Xv(6d,8a)2QVUmH\u001c6*:a)(+\fWD#LpB\u0012{T^GY',ܕؓ\u0007r/X(+'\u000fL\u001aI&J;2v'\u000fM\u0006K\u000eY\t\u000ePy2%\"\\]KՆc\u000f\u001e<(fn؃\u00072\u0015<\u000e\f3\u001c\u001a;8ŢNeU.8ᩬbC\u0010%ᩴ4!J\ra\u001dJK\u0001JWk\u0011\u001e-8TGa٩@=wx*t\u0007\u000f_pSR\u001c\n3w\u000eO%%Pʿ@=v*(]!*\u0003T\t˖e1(+\u000eO%%\tPڹ=v*Q_K\u0012{\u0000U\\\\\u0012ҍ\u0012{\u0000U\\\fQƇx\u0012{\u0010U\\\u0012{\u0010U\\\rJ\u0003Tǎ\u000e%1\u001b*o\u0007TQBY\\RlŲ\u001dSEedRۗjñG\u000eU\u0014eG\u001be̵Ğ8T\u0015P:X\u0017C0yAKe<JYCW\u0011Lbc\u000fZ\bRv\u001eJ\u0011\u000bF\u001e[F(\u0007,\u001cR\\\u001eIvوt_K\nOs\u000e2s?=S\u0015\\\u0012{B\u0015AY\u001e\u0005e;\u0014H\u001eQ\n\\ѹĞ%Yb\u0016Pb\u000f6DPbfT=@ ,\u0000r6\r\nendstream\rendobj\r192 0 obj\r<</Length 483>>stream\r\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000~\u0000~\u0000}\u0000}\u0000|\u0000|\u0000{\u0000z\u0000z\u0000y\u0000y\u0000x\u0000x\u0000w\u0000w\u0000v\u0000v\u0000u\u0000t\u0000t\u0000s\u0000s\u0000r\u0000r\u0000q\u0000q\u0000p\u0000p\u0000o\u0000o\u0000n\u0000m\u0000m\u0000l\u0000l\u0000k\u0000k\u0000j\u0000i\u0000i\u0000h\u0000h\u0000g\u0000g\u0000f\u0000e\u0000e\u0000d\u0000d\u0000c\u0000c\u0000b\u0000a\r\nendstream\rendobj\r97 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 193 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r193 0 obj\r<</BC 194 0 R/G 195 0 R/S/Luminosity/Type/Mask>>\rendobj\r194 0 obj\r[0.0 0.0 0.0]\rendobj\r195 0 obj\r<</BBox[207.888 269.102 231.046 257.593]/Group 196 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 197 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n23.1578162 0 0 11.5087329 207.88797 257.5932568 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r196 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r197 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 330>>/Filter/FlateDecode/Height 164/Intent/RelativeColorimetric/Length 3528/Name/X/Subtype/Image/Type/XObject/Width 330>>stream\r\nH엉e\u0015\u0019f,̰00;þ\f\u000b\u001eZ\"\u0014(KPQ\u0012b%fTKAIgim`.B\u0016\u0004;{{{y~?9vpI\u0001\nW?/~cz_淿\u001fߞ~g}?E2DG}\u0007?я\u001f}'?e$\u0019H$E)H2/\u001c<x#G=?\u001ex\u001bw\u001eV$)J@3\u0002OR\u0010ǎ\u001d\u0013'|k_tܔ\u0011I{cI<y\u0017_<u\nmҽ}$I@sn'\u0000S/\u0011a?3ڹws}\u0004$G\u0019s'$\u0012̒:6K;];wqd\u0012zRnWvIK%(쇷~k$\tLG_o\u001e{Htl#8o۶OK̔t8r\u0015~ⓟm\u0011I'w$l=\u0005Js-[\n@)I#Gd\"\u000eb~xRF\u001fBPF$)\tI\u00199^zI\u001cŉ\u000b\u0002\u001boy3A\tH\u0001HH2Yx\u0012u2\u0013K\u0016\b͏ްi\u0013CIH\u0012.O\u0012ʓԔo7I\u0006\bA)Hz{)'BH%Ylw$7^{퇯\u0003$f '[$616l6j$7$'LI\u0014\u0002!}$i;wYk晓,~5\u0014t\u0003w\u0002b&w'\"n -$\u000bLJ\u0004\u000b\u0004;=$cP\u0001$׼s8uMF}_<5IQ̏+Ib\u0013Zz\r%y\u0015XHfHf]̱\u00112]r\u0015A\tI\u001aTߜDrNד\u00198+V\\AP^\u001aVz{ɇ!oA򅃧A\u0012b\u000eorF0%%iӔ\u00197e\u0002&y2Briu뽙Ӫ$?eIu'3r|._,Ɣ7IRSzJPfqҥ\u0014 R#i\u0017\u001bo(\u0005I7ʬ Mt#r|[.[aʫmSfٴ\u0018/\u001bIZ\\kϹe$띈S@$p)%)M2J9k@\u0004e62ivsd\u0013Ҕ`W:3ge[$wʓ\u0018\u001c/\ffJ\nn\u001b\u001fJ#z$\u0016\u0003%y_CI\n-3\"0r({\u0012{\u0004\b\u001a\u0017\tf\\_oRIr$5\u00119\u001aI\nRly'%C&\u000b/R$5Oƙr9\u000e\u0006\u0001O\u0012Hb$\u0017/~%Dy޶)~s\u0012Q'\u000f\u001fL\u0015+\u0016-^\fHCeFj|\u0018='\u000bÔS\u0002Sz9IF\u0004d\u0013'\u0003\u0013\u00039\u0002r\u00111\u001cߪK?:\u0004iAN\u0012N$\u00039wg,ъq\"M<r}'ݟHΙKP\nSoIr\bPF띄sI\nx}9s)\u0017rSVR/\u001e%\u000e$hA?hA\u0004\u001d$#y*\u0011u\u0001AiR420s\u0013Md8$ϟ9k\u00167<eJv|'XoHɇ''3V\u0004y\u0011)y\u0013\nz3ѡ\u000e Z\u0007\u0003s-\t(8v\u0019$g0P&])9J\"'A$9lJ\\Br,\u0019A\u00132'ޔ2O\u00019,\u001cb]\u0013){\u0005\u001cRINH&$U\u00123K2oQHN2P4K%3*\u0010Uz\u001ae.OlLH\n~S)M\u0011\u001cJQp\fc\u0013'LBMIl\u001e:f\\$\u001c\u0007llC\u0013&pДQ\u00152.mJfz\u000b\u001a;<$Б(\u0015I\u0011߱MȬc?.\u001a;nxhJt~lB\"\u0004L\u0001my՘c9I2tĩ4?\u00144g4QJO˯FQ(~V)ބ\u0018~X5j4@\\\tL{o`\bM\u0012YyQ$A9QoQW'oO|k(57G(~OU\u00144LPr\u0004F\u0012Q\u0018\u001a1BiJ߆)?c\u0012M(\u001a>@9JՉNOBѰa&ITЪ\u0010'hB$p4t@9<-R9jB$@\"$\r\u001e\"P6()i\u0013b#Bg\u0013A $D\n\u001dJߜd\u00129x\u001a8h2:$thUH~\u001a\u0019JӔدAԀ\fԖک,{\u00064\\ݔ$c0\u00194Yd?w~\f$!Ju,aA\u001cJ\u001d\u0001M\b1ۏ\u0014$؁RoSoAU\u0014%0%E9tV!JR䡃\u0014\\c\n\u0018\u000b\u0012d5(;QWgly)_^MM%%QFTF\r\u001b!٫\u00171%e\b\bOL\u001d^~c\u0003]={RSSZ\u0010:\u001a\u0016x*)I)߁Fj&ERCI{r\u0012Z?'(\u001e=\u001a)SI{`rBTNRG|\u001aO\u0007\u0019j\u0001Pӷ\u000fB\u0003 JiJUWg*@\u0000Р\r\u0010%9DuFUd\u0012\u0015\u0001^G٤Q\u0017rdM\\\u0010T_o\u0003\\u!m$\u00127\u000b\u001dG\u001d({G(\u0007\u001a(VIPb!\buPJ\u001c%\u0003\u0006rC~[(ɩ~C\u0010MУѱ̔C]0Ե+@I]QN\b`ױPNj~B\u0018UG٠TR\u001c&j%\u000bp:O\bC]Ģ\u00143@.~A bTd_g\u001c\u000bBQ]\u001d$B\fZ)SY\u001cPT[\u001bR!P+5\u000fFkk9K2.տ1\n#\u000fF;+$h#$@\tY2WWJ\u0019{`TSeH}vS=~8P\rW\u001b\u001eJۉPb\u001f\u0019Kκ\u001eW\u0000Ǟ> UUi(}mH\u0014RĞ> UVJ\u0014eg\u001d%\u001d+eC\u0017$\u000fH$p22e# QbO\u001f:uP\r\nb!*CTb\u000f\u001f*:I\u0002eiK\rg\u0007{TAQ\u001a,\u0001.^)Pb\u001e***+]ǲsT\u001fGكR*AY۹*\u0012%س\u0007TJCY\ts.:JR*\u0005Xv(6d,8a)2QVUmH\u001c6*:a)(+\fWD#LpB\u0012{T^GY',ܕؓ\u0007r/X(+'\u000fL\u001aI&J;2v'\u000fM\u0006K\u000eY\t\u000ePy2%\"\\]KՆc\u000f\u001e<(fn؃\u00072\u0015<\u000e\f3\u001c\u001a;8ŢNeU.8ᩬbC\u0010%ᩴ4!J\ra\u001dJK\u0001JWk\u0011\u001e-8TGa٩@=wx*t\u0007\u000f_pSR\u001c\n3w\u000eO%%Pʿ@=v*(]!*\u0003T\t˖e1(+\u000eO%%\tPڹ=v*Q_K\u0012{\u0000U\\\\\u0012ҍ\u0012{\u0000U\\\fQƇx\u0012{\u0010U\\\u0012{\u0010U\\\rJ\u0003Tǎ\u000e%1\u001b*o\u0007TQBY\\RlŲ\u001dSEedRۗjñG\u000eU\u0014eG\u001be̵Ğ8T\u0015P:X\u0017C0yAKe<JYCW\u0011Lbc\u000fZ\bRv\u001eJ\u0011\u000bF\u001e[F(\u0007,\u001cR\\\u001eIvوt_K\nOs\u000e2s?=S\u0015\\\u0012{B\u0015AY\u001e\u0005e;\u0014H\u001eQ\n\\ѹĞ%Yb\u0016Pb\u000f6DPbfT=@ ,\u0000r6\r\nendstream\rendobj\r91 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r94 0 obj\r<</BitsPerComponent 8/ColorSpace 92 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 100/Intent/RelativeColorimetric/Length 107/Name/X/SMask 198 0 R/Subtype/Image/Type/XObject/Width 86>>stream\r\nHA\n \f\u0005\\\n\u001eBf\u0011w\u0016`՝\u0003FD7L&l>maڠ1z\r\u000eӷF=[R\f)NZH\"UI$I$I$+\u0000W\u0001i\r\nendstream\rendobj\r92 0 obj\r[/Indexed/DeviceRGB 4 199 0 R]\rendobj\r198 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 86>>/Filter/FlateDecode/Height 100/Intent/RelativeColorimetric/Length 110/Name/X/Subtype/Image/Type/XObject/Width 86>>stream\r\nH;\n\u0000!\f\u0000$΋\"خ)yOĝ1.\u0017QU@6\u0013&e@wf6g#\rn\u001f\u001aÞ\u0003%\u001e\u00058][mB\u0003{ltGg\u0017J$I$I$Q>\u0001\u0006\u00001\u0001*\r\nendstream\rendobj\r199 0 obj\r<</Length 15>>stream\r\n\u0000\u0000\u0000\u0000\r\nendstream\rendobj\r93 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 200 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r200 0 obj\r<</BC 201 0 R/G 202 0 R/S/Luminosity/Type/Mask>>\rendobj\r201 0 obj\r[0.0 0.0 0.0]\rendobj\r202 0 obj\r<</BBox[204.66 259.488 210.695 252.47]/Group 203 0 R/Length 71/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 204 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n6.0350673 0 0 7.0175201 204.6599121 252.4704865 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r203 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r204 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 86>>/Filter/FlateDecode/Height 100/Intent/RelativeColorimetric/Length 110/Name/X/Subtype/Image/Type/XObject/Width 86>>stream\r\nH;\n\u0000!\f\u0000$΋\"خ)yOĝ1.\u0017QU@6\u0013&e@wf6g#\rn\u001f\u001aÞ\u0003%\u001e\u00058][mB\u0003{ltGg\u0017J$I$I$Q>\u0001\u0006\u00001\u0001*\r\nendstream\rendobj\r87 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r90 0 obj\r<</BitsPerComponent 8/ColorSpace 88 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 55/Intent/RelativeColorimetric/Length 137/Name/X/SMask 205 0 R/Subtype/Image/Type/XObject/Width 95>>stream\r\nH[\n\u0000!\fCQa`@G!.P/\u0012|#U~fy'\u001b䃪Ϻ[\bOykHw\u0019p\u000b<'?_\u0017/^<'G~{83p>1K.6·\u0000r\u001d|]\u0000qݷG\u0001\u0000\u000f\r\nendstream\rendobj\r205 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 95>>/Filter/FlateDecode/Height 55/Intent/RelativeColorimetric/Length 137/Name/X/Subtype/Image/Type/XObject/Width 95>>stream\r\nH[\n\u0000!\fCQia`@G!.P/\u0012|#U~fy'\u001b䃪Ϻ[\bOykHw\u0019p\u000b<'?_\u0017/^<'G~{83p>1K.6·\u0000r\u001d|]\u0000qݷG\u0001\u0000=J'\r\nendstream\rendobj\r89 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 206 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r206 0 obj\r<</BC 207 0 R/G 208 0 R/S/Luminosity/Type/Mask>>\rendobj\r207 0 obj\r[0.0 0.0 0.0]\rendobj\r208 0 obj\r<</BBox[220.309 232.751 226.976 228.892]/Group 209 0 R/Length 70/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 210 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n6.6666441 0 0 3.859636 220.3089752 228.8916152 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r209 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r210 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 95>>/Filter/FlateDecode/Height 55/Intent/RelativeColorimetric/Length 137/Name/X/Subtype/Image/Type/XObject/Width 95>>stream\r\nH[\n\u0000!\fCQia`@G!.P/\u0012|#U~fy'\u001b䃪Ϻ[\bOykHw\u0019p\u000b<'?_\u0017/^<'G~{83p>1K.6·\u0000r\u001d|]\u0000qݷG\u0001\u0000=J'\r\nendstream\rendobj\r83 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r86 0 obj\r<</BitsPerComponent 8/ColorSpace 84 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 281/Intent/RelativeColorimetric/Length 3973/Name/X/SMask 211 0 R/Subtype/Image/Type/XObject/Width 262>>stream\r\nHW\u0015G\u0016Ǚ\u0018\u0010D\u0010\u0010E\u0014\u0014\u0005q\u0005\u0014\u0015\u0015\b\b1C\\&QdpfA\u0014NWuuսU=xU\u001e9yǟ9w뼼\u001c9\u0017!y__g\u001eh\u0006Y1K,\u0005$z#F\u001dY`,0r\u0016\u00189\t\u0005F\u0002#g(\b\t)l-\u0018\u00042l6#?? @։\u0015W\u0014PgG~J\nxDf#\u0005l:?2O\u001f9\u000bIH\u0005f\u001e\u0007uXo\u0014\u001a,>\n?\u000b\u000bSi:?f322QXH\u001f%iuPgl]\u0007uXoX,\u0000\u001f9\u000b\u0016\u001da\u0005:7̙3;\u0011Y1'\"gA.zc\u0018\u0017aa\u0010&a\u0002A\u001d\u001bEj`\"z\u0006ޘ;HF\u0007uXo\r)*2>W\u000b\u0003,\u000b\r(Q,z&^\u0016a}Q(\u000eD.PY\u0014%Bhbn*\b(ѰA\u001d\u001bt\u000fqh\u000b\u0001\u0007)C:/J#D\u0004e\u0019Y(-guQ\u001c͊J+//̳\f*z4Qbb갾(\u000b)7Dp\u0017zUPEY\u00100d \u0013i}1~\u0019 Tap\t\u0005fԢ\"\u0016***L\u000faIE1:/*8\t22bA\u0000`-\n92b\u0002\u0004\u0000F&uZ_Tj\u001aj\"l\u000e괾DTH\u0017\n\b괾\u0002\u001e,E4PE\u0015\u0012\u000e괾Tj*\u0016h&la*H_F\u0013\u0002\f\u000f\t9\u0016\u0000\u0011q=\u0010UD>&dQPŢ@BJd\u000bՋ\u0017ARƂZ^yH\u001bi}QY@\"TsPDu\u0018ިLjb\"\u0016\"zbIM\r\u0012\u0004@\u0013K\u0002\u0007sF\u0000\u0013q=tP=LK긞XTyI#:'jkk\b7\f\u000fq=QW<\n\u000fiG\u0004u\\?,\u000b=0\rpD(\u0017piPĊ\u0015˖թz\u001eH\u0005{P#\"7~\u0005'Zcmy\u0006\u001az~9\u0012\u00115Pz\u0000'D-TPCz(B:뉆\u0006!'\u0011q*аR\u0016r\\\u0010戠FAj&D\u0010\u0007~hll\\j\u0012\u0003\u00105k\u001a\b\\\u0010\t\u0011J^Xz <4[W@\u000fV+\u000fzAX&D-u^/['4p\u000fRDA\u0010uɴдVzhl\u0003\"fBPBSSZ\u0001\rʆ愠\u000e&NA\r\tA\u000bC\r\u001c\u0010\f'\u0004u`/43d9\u0001\u0011uJpZSBK\u0010ԃ\u001a\u0010\u0006r^hii\u0000<4\u0019\u001e\u0014:\u000fZ[\u0006݃yI\u000e셍CҀ\u000e)&BL\b>ظQh<}UN)^ؼyhi\u001a|X\r\b9!\u0003`fA&}P\u0013:\u000f61\u000f\u0006a}\u0001A\u001d\u0007mm\u0006Q\u000fј`IpQR'A{\u001b B[\u0017!NLJ:\u000f۷lA\u001eZƀN@C D\u000f\u0003ub\u000fl\u000e<1I:\u00072ڣ@c\u0012ͨ1&¶\u0007Q\u000fp>dZ\u001eضMh@4ٌ\u001a:\u0007I\r\u001ex9\u0012vܩy4cR\u0005udށ4Ц-\u001bZ\u0005\u001eؽ;\u001dxآI\u0017ԑݳk\u0017c\u000e\u000b6=I\u001d\u0003{\u0006k\u0002\u001e#go\u0000 U\u0003ԑѱ{m3nLn\u0002\u0017ԙѱGi\\\u0017r>PGvϾ\u000eF!\u001cr$udwa\u000f\u000e\u001c|\"5PgvW\u0002Ѓ>&񘤎NiAhPb^\r\u0007\f5ç=PgvOWW䡣\u0003\u0007-Иܒ<\u000bg\u001e}Jîh:D\u0000=Pgv΁\u0003B\u0003 n\u0007|S@\u001d9\u0007\u001cT_S\u0016ɓ\u0013iDAhLmA\u001d5==\u0006+m\u000bЮ9t\bj \u0001\u001f\u0013h\u0001h芦!а\u000bz\u000e¡+0ˁ:kz{H\u0003\u000e昔\u001eS;^y\u000eP+pRE\u001a&a\u0001t3):k\u0019h:^\u0003\u0002Ӂ:c\t,\u001aqH\u001b]\u0010z\b4Pv̑oB\rr6gd\\[좎#G\u0006̓\u0003xgeA\u001d-G4ʮ>`^ԑ\u0006؎9\u001aA\u000e֮햾GÇ\u0019:[\u0006k\u000e.3c?\u001d\u0000V!xP@)\u0003}a5|kЇ\u0003j\u000bN9\u001f\u0007\"\u001cp8\u0018n31AVÑك:;Xo@\u0006c8 \nV\rԹrPl\nri܂ҀAnL+Ҥ\u000eӁ\u0005\\\rpwA}E\u001d%N\u0007\u001aT5\f\f`\rʌ.(.9{V?oLmeW]r\u001cp8ܘ4@!a\r`8|g\nyE!/`\r+b4+:CΟ`lpe!I\u001d\u001d\u00170oLp9&I\u000f\u0017u\r\u001bS[C`k\b-ɛ\u0002\u001fP𞦎+l\u001aolL\u0015ٝqJY`\u001aΜ\u001a ˁiˁ\u0005\u0006\u0006p\bˁ:3\u0006\u0007/_\u000e,(\r\u00174\r'\u00006\n쮸zup\u0015\u0003\u0018\rMmLuE\u0011W\u0005\u0013ߛ\u000b󄬆\u0001*\"ahHp`H\u0003uzG\u0018\u001a\u001ad6\u0005@\u0011o\u0004\u001aA\rt\rIpNׯb&{XT\u0010~cRw[n\u0019\u001a.M\u0011W\u0003u|7ܹch6\u001cNi !\u0016\u0004\u001an \u0006SC0\u001bHa\u0001Xד~7=fd`:\u0013\u0005a\u0010\u001d<{\u0016oL.\u0018\u0019\u0019\u001anX4\u0011yF?\u001c\u001fB\rUO:\u001b,w\u0003@\u0000\u0017ܽ{wDӀ\u0002\r)g$\u0003\u001cp~`\u001e艰\u001ap1P\u001a@'6`h')NP?!k\u001eYx4D!S\roȚ\u000fC\r'n5\\G0OQ!k\u001e1\u000b\u0006?)l~C<~϶j,X5Mqӗ,<\b-ha(\u0006Gdɯ~5<p\u000fݐ\u0005\u001a\u0000\r\u0017>}\t\u0002\u0000\u0004\u0010v=I\rԯȎ'O\u001a~\u0001`\u0000,ت\u0019O>`\u001aa\u0010j~FV\u001b\u0013\u0006}aR#\u001bFGG-\u0016u9k׌#!0,0\rl20AoidgFb@\u0001]\r\\ÏQ1(\r\u001a_2s^<\u0013\u0016Fb0F\u0010Z5P?e<-(\rQ1\t\u0019#x\u00124@\u0019<\u0000Y\u0013\u0011\u0013zSPe|ix\u0015S'4%cf/_r\u000b\u001a\u0005i\u001f\rhB/\n̐?^s\u000b,=r]\u0001i,\ň?\u0016xK'h05/\nv=Q?gF\u0019``\u0016\u00071\u001a3\u0013޾\u0016-a\u001e\rx4)@\u00196n!`~1F\u0003ⓁA3ݻV\r/b\u0006|;u9,E\u0018ʂР\u0001\u000eH.e1<5ܼI2665\u0013!OȰ%j~4y?\u0016YŐ'=a\u001cOԯ\u0016߿G\u0016`1\u000eH'죁Yb-\u0016R\u0015~4hU?~J\u0012>|\u0018\u0017\u0016O%\u0001\tee\u00191>\u001e[\fqwyHW\u00032\u0007lA+`\t\u0014'ߖ!\u0013\u0013\u00136\u000bdxmhx\u00042brrrbBz-\u0011ւQ\fBѠ,P/=!\u00131`,\u0014y;~aZ>NN\u0002\u000b\u00147|VQ1\rSSS\u001f?f~NX>.\u001fb\u0018)7f1H5%Ig\u0001\u0017\u001b&b\u0000\u0003R^\rO\u0017gʦ!\u0003\u000bgLr\"(\u0011[@Ȃ\u0005\u001cx*G2\u0004O5ڛO<R\u000fH\u000bdPh \u0001\u001df-1XX\u0013р|2\u0016ʖ,Kv2\u001c\u0016\u001awb\u0011'\u0003\u0013\u0017o\u0004Zx\u000bdXN\u0015<)-ЃAlOԧӶ-\u0006v\u0016T-AZhecfn8pY~Tb{\u0002\u001dAĂ\u0018ɀ\u001f|,N't\u0002\u0005n0:б+<\u0016q9\t#\u0006,\u0017f@G&\u0018ЁIB\u0016-Q\u0017\u0003:.Bw>2Na\u0012\u0005tT\u0001\u0005c1\u00166\r\"Xh4cvpXn\u0018!\u0004-h\u0001\u001dQւ+e\u000ecm\t~4)Z\u0001̀#8\u000by1BwKc\u0019\u0019\u0012e-3\u0019c!׀Nii_t\u001c'.\u000bLKQ[n\tt\b.\u000bm-c\u0004Z53\t[@\u0007\u0018\u0002\u0012׏o\u0001,_=\u001a\u0005\u0012מ\u0002'2Ŀ\u0005$fcwN\u0013`\u0000]`(9\r\nendstream\rendobj\r84 0 obj\r[/Indexed/DeviceRGB 160 212 0 R]\rendobj\r211 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 262>>/Filter/FlateDecode/Height 281/Intent/RelativeColorimetric/Length 4987/Name/X/Subtype/Image/Type/XObject/Width 262>>stream\r\nHWG\u0012EP\u00011A\u0014Y\u0014\u0004\u0015DQ0QF\u001dWg\u0012wAGܲq13K&ɘ%\u001a5Lfƙ3tWWwW#S<=>N~snݪ-\u0012])JR75ս{\u0014\u0011@)5\u0005ѯ\t\"ը{*Qx\u001aNe:^\u0013\bm6\u0014\u0014\u0014\u0010Ғ\u0014$\u0005T7U߮E!R4\u0005\"nᔤ   գGZ\u000f\u0014ԿM(M}8x`\u0014P^)IAPBO/m6zƨ\u0007\u0000Z\u0014zIŢ D\f\u0005/m6{E$t\\\u001c^)])J\".\u000fn\u001eQ|\u001c\u0012BTzzF\u0004E|\u001ef)HȈ\u0006C 8\u0006Sfffh.L<\u0012\u0002(#bHp\rޙ22b\u0010\u0016ʌE!YdF5zkeFY\t`\u001dU,ħ\u0014\u0001\u0011E\u0002Se[\\p\r>RYbg\u0004qp\rWį\u0006#:%\t\fAU4\u0016dJ\u0006ӫB\u0015\u0002\":#YM!;U\reJ\\\n}\r\b\u001b\u000b\n6\u001bL}4Ƃl(\u0005\u0010}\u0005E\u0014$6A\u0012٘\n\u0005\"\nm6I!\bL\u00160\u0012B!K\u0002#2\u001f&\u0016f)7\u00178(\u0012.X$.\u0001$&]6\u0006\bZ\u0014\u001a\u0004VE\rp\r\u0001N\u001a\u0010 `\u001aNyyH\"7^*|\u0000\u0006nT\u000fӑT \u0014\n\n\u000b4<(GPp\r\u0002\"ߢ\u00180VfnI\u0006B)š\u000eBO\u0007P\u001a4h@\u000bB\fSnCIR\u0010B\u0005\u000eGler\r\"!ȃL@\t\u00132͆Rqqq\u00021Ȱ\f\u0007Ln4\u00189X\f8\u001d\"?\u0013nCd`\u0003\fGP\b\u0010nCDb\u0000\u000eEP`asl((\u0010X\u0014bc*\u0010nCiȐR\u00001X\u0019\u000e1݆\u0010PZR*A(\"D!@\u001a:t\u0010\t\u0002\u0013al\"\u0002n \r\u001b\u001c \u0011X\u0012%1M6ʆ\u0001\u0007$1T\u0004]\u001c\u0016\u0003@*/+\u001cT\"\u0000En\u0010$\u0006RyPf\u0012ApЙ(*v\u001bJÇ+\u0010t\"\b\bUdqp\rR:\u0010d6DL\u0014s\r\u0011\u0015BM \u0010Dd4pp\r\u0011\u0015CyY\u0003\u0002\u000eGB\u00189r\u0011&!0@Y\u000es\u0000m7*++\r\u0007\u000bBMFdmH\u0012v\u0003iԨQ\bp:bmDP5zh\u000bF\u0019\rwr\rꪪ*\u00010Њ>r\r1U*\u000fN hm7^{m\u0018A@\u0010#HEӒn 0\\tR\u0011$d ر\u0003\u0007\u0000Q\u001abj\bS\u0011\u001bH)\u000e&\u0011\u0010Xъ\u001bF555\f\u00046\u0004\bFR0\u001e0@\u001chC\u001bH\u0013&\u001fA#L\u000604q\u0006\f\u0003IDR\u0000\f*\u0010E\u001a\u0002@&n\u0018N<i\u0012&~ \u001bFu\u0001\rJnA4eJ]]Ơ@@\u0018\u0010\u001bFoL\u001cj\u0015\u0007C\"!\u0011\u0014M}\r\u0015\u0007A6ؘm8O\u001cjk\u0001\f9MCgƘ*nAT?} HC4\u0004 1rP'D\r\u0014\u0004o\u0010͜i0\b\u000e &\u0018 $\u0007nA4k\u0016@v${B؆\u001bDg\u001b\f\u0003):S\u0010\u00136\u001cDs\u001a\u001a(\u00051>2\r9\u0012Y3%z5\u0018AN]\u0010xIq\u001b\u000eys\u0015Y\"\u000f3=1Ц6\u001cBo\u0003\f$\u000f'e\"\b\bp\u0010͟\u000f\u001c\u0002\u0006(J`\u0006\u0016m8\u0016,\u0010\u00180\u000f\r\u0007\f\u0007\u0004\bn!(0(\u000es\\(\u000e\u0014\u0004\u0010Zظ\u0000Bͅ䀃\u0001q\u001c$\bn!haS\u0003^\u0017r_D\u0010(\u0013\u0012E\u000b\u0017\n\u000e\u001el\u001e\b\u0007[܎ChE\f\u0005&\u000f\r'CJrv\u001c@˖.Y\u00180zoχ\u0006\u0007]\u0010\u0002\u0003\u0000Z|Rá\tkM9\u0016Ir*\u0000jn\u0016\u001cL\u001e\" (]ma\u001a\u0000Zb\u0005pPyXDjݛY?r\u0000R\u0018 \r\u0014>sC=\u0000Zz\u0015pPSԤ='M=(\u000eܖk\u001a\u0001k\u0012`zҽ'-\u0007PK\u000bpX\u0012\u0001@l45\u0004۲_'1^\ryh^a\u0003Y\u0017$\u000fܖ\u0003huZJ\u000e0\u0016ζ 䡁۲mڸAp\u0018TKs\ty\\, =mٿ6oڸqÆ\r\u001a=\u0016+\u0014䪶ٿl\u0011\u001c\u0014\u0006a\u001de&Pmٿ\u0007Aa\n\u000b\u0016Umٿ\u0012\u0014d\u001ad\u001cDI:-YMr{\u0016\u001cD\u001c\u001dԲh8crbZܖk \u0000iPy\u001bj\u0015\u0016\u001e={\u0012\u0003\u0001A/r.L\u001c\u0015ٿvؾa3\u0005\u0019HMr{]vJ\u000e\u0010\u0007AdK\u000bmfˁ۳wٍ\u00180\u000enK^M{Wݻwq05\t\u0018X@;#J`]{Z8܊qPi7 mڷ\u0015\u0018Z\r\u0006,d;\u0001r6[\u0004\u0018p(oB\u0005,MuRXu۵ow0\u0000\b,lK\u0011mڷ\u000e\u001eh\u0017\u0018m\u0010,l\u000bnӾu\u0001\u0000q@\u000e\u0010\u0007vǂ۵g\u001d>,0K\u000e2\r\u001e9\u00029\u001eVswH\f&\u000emm\u0014C)qXڷޕ\u0018T\u001c$\u0006\u000evY8ll㰖۵gp\u0004.V\u0005)ɝ;LI0-ڳ::\u001d5\u0014r&΄\u000bj\u0017ݙ\u001b۶_\u001d;zCAs`0]\u0001;.\u001bmՉ.\u0006ȃ*=a[&\rܶ=넋ơ͜P\u0012VgYp\u000fN4\u001c\u0004\u0006YxAT\u0010\fNIr\u000f?\u0018d\u001cĬLmۯΜ`+Ӽ`gb\u001eT\u001c}{3\u0012)c\u0000CAang,}{չΞuС\u000f(ۑ`eSR-\u000bn>u@@wšCym6U\u0017Ο\u0018N\u0003'cW\u0003vWX\fܾ\u0017/ǡ`x\u0017WEtW\u0000\u0006n^\tP8o\u00018\u001c9$\u001d\u0002ߙ}SAc'\rtc:b?\u001e}mܧO.4\u001dy\\n\u000egew\u0005\u000e}_\\\fjU4\u001c;J1\nNVn>u*bP3V\u0005A\u001dPp\\P{۸{.\u0006Y\u000e\u001fUq\\c0q@\f=\rAn\n*\u0010]\u0015rvQoE0Ƥۺ?ݹ\u00136&aՑ鳻\u0011\f#\"0+\u0006n_\u0005۷$\u0006pA5\u0015z(\u001dmݟ\"!\rX\u000ejcU8p{}))\u0000!RꎄyJmL2{W\u0014wU5\\n\n*\u0018{_ݻ'(X\f\u0003ŀ\u001dI6\tۻ/曯!\f\u001aT\u001c\f\u0006H3\u0014fUt\b\f=\u0007\u0002\u0004`\u001d\u0007٘Uޓ\u001e=R\u0018\u0019\ffSgMGJ\f=ߺ\u0018>Mq\rPW\u0005`vI=y,(<|p`p*+9gcrc\f\u00034¼*9\u0010\f#ޏ?{\u001a`\u0006|RtAl\nn~ϟ=\u0018\u001e\u0002\u0006ga޼O+{?ۿ\u0017C\u0014)p3{?)\fO3\ry\t\u001d\\Q\u001d\t\u0018{/\fXݠVyY?*D7p\bG\u000e\u0015ib\u0001>_\u0005ד\u0016\rW'&\u000f\t\n\u0012O\u0002%'O\"ד\"U\u001aPP\f?^[P\u0015gG\u0013\u001b٠1+Hؘ?y\róQ\fXjU؊\u0018~UDQ\u0003\u0010\u0012O \u0002j\u0014/\u0014\u0001\nФ\u000bim$mfbǜ{\u001c\u0019[\u000bɬ_0kSQa0K1`ۓ]7|W\u0006\u0003\t\r\f\u000f=}+0=dkQQ\u0010\u0018|6\u000ec\u000e\r_=jk!\u0006?\fs=\u0018\u0013\u0018&r(\"Ҷ\u0006\u001b\r\u00059Q\"\u001am\"Si-/S\fj\u0005퐺6\u0010\fL\u0017Ӏv\n\n ZƠ8\u0012\rL]iJ0\u0002M)h\u001byzVchh(VyF`S\u0006m#Kk\u0019عIE\u0004)\u0016\u0003G66I\nd\u0004dY\"D\u001bQ.0;|0.0dÇm3\f4\u0019Dk((8\u0006,(x\f\u0005\u0005\u0017Nd/\u0016\u0003Jcu:[\nCM\tiWi\u0013Kk\fh/-)p\u0017\t;\f\u001a\u0003R\u0014\u0018^jwgg{%aW\u0005\f!\u0006~/>y6P\u001f?*\nv\u0006P\"\u0012\u001f\u0006P\fCG\f*KHy._`\u000e\u0003M3\u001d\u0007\u0014\bDA!Q4aSQ\u000fCy'CQF\u0003O\u0013\u001d\u001fi\nj\u0018v0`\u0006PN\u001cP\u0003\u001c\u001f\u001da\u0018޻\"]b4i!\u0015\u0005\u0006:;=5\u0018\u000e\u00064Ӡ;Ўٙwb\u0004$\u0019\u0006bw\"Āˋ\u0012\t\f,!rt'2\f\u0012\u0003T./-S6\f<\u001aNhp\u0001\u0019&$Unn%\u0005\f\u0002v%o\rh[I(\nחj%Y>J:/\rv\u0018'\u0004znWSDx-۴AKR~F;۞0r\u0018ș\u0006\u001aT4\u001d`LC\fZhL\u0006Qp6\"\u0019įN5R\u0010b Ď\u001b\u0011@\u0004x,\u0005\u0017\f7Ja0Na~\u001ep\u0006>@0|@:CWe\u0013aPɀ8F\u0003\u0012݈h2g\"\u001a;k69R\u0003A`vis\u0015Ȫ\u00180}Vkh0)ap\u0014EO,5ԊQ\u000b\n\u0015+\u000b~Ut\u0018nc\u001a&tep\u001803AK\u000bHa!\u0017\u0010[^\u001293 \u0013ڳװB1\nn%b 1\u0018\u0006Z\f\u0006u*+Ak\u0013\"\u001f?\u0002oѴFGF\u0003\t4\f\n8b%x@\u0006\u0005R\u0004\u001a\u00175)T\u0005Cu>R\u0004NZ\t(R\t7\f!ȵ\u0014R(T\u0004C@wCV wJ;50PR>, @/G0i\b\u0001m\u001e``P\fhLI\u0014*V\"Y^p\u0012;\u0013\u0005\u0005mL\nee`\u00148\u0012PL\u0003uQuϒ\u0004$K\u0006&\u0012Av\u0006&\u00121\na@ۭФ(p\f\u0015\u0005r\u000fJi\u0014\u0015[\t;\u000bh#TB0Y(\n$HM\u001c\u00061J0z%*1XeSx 1>\fh5TB+6XK\u0014ƀWSӤ`\u0014̗a@\u001bKR,P@JTJ\fj\u0004SR)\t\u0002\u0003Q\u0013R`@i\u0014\"À\\)\u0012h'9J\u0010_\tLM\u0002C)\rLD)\u001a\u0003R:\u0005\u0001\u0019\u0005't\n\u0017OCi+~@\u0001)j\u0001hO@i\u0001hͺ\u0019o5\u0015`\u0000䘰\r\nendstream\rendobj\r212 0 obj\r<</Length 483>>stream\r\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000~\u0000}\u0000}\u0000|\u0000|\u0000{\u0000{\u0000z\u0000z\u0000y\u0000x\u0000x\u0000w\u0000w\u0000v\u0000v\u0000u\u0000u\u0000t\u0000t\u0000s\u0000r\u0000r\u0000q\u0000q\u0000p\u0000p\u0000o\u0000o\u0000n\u0000n\u0000m\u0000l\u0000l\u0000k\u0000k\u0000j\u0000j\u0000i\u0000i\u0000h\u0000h\u0000g\u0000f\u0000f\u0000e\u0000e\u0000d\u0000d\u0000c\u0000c\u0000b\u0000a\r\nendstream\rendobj\r85 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 213 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r213 0 obj\r<</BC 214 0 R/G 215 0 R/S/Luminosity/Type/Mask>>\rendobj\r214 0 obj\r[0.0 0.0 0.0]\rendobj\r215 0 obj\r<</BBox[226.344 249.383 244.73 229.664]/Group 216 0 R/Length 73/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 217 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n18.3859026 0 0 19.7192314 226.3440399 229.6635353 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r216 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r217 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 262>>/Filter/FlateDecode/Height 281/Intent/RelativeColorimetric/Length 4987/Name/X/Subtype/Image/Type/XObject/Width 262>>stream\r\nHWG\u0012EP\u00011A\u0014Y\u0014\u0004\u0015DQ0QF\u001dWg\u0012wAGܲq13K&ɘ%\u001a5Lfƙ3tWWwW#S<=>N~snݪ-\u0012])JR75ս{\u0014\u0011@)5\u0005ѯ\t\"ը{*Qx\u001aNe:^\u0013\bm6\u0014\u0014\u0014\u0010Ғ\u0014$\u0005T7U߮E!R4\u0005\"nᔤ   գGZ\u000f\u0014ԿM(M}8x`\u0014P^)IAPBO/m6zƨ\u0007\u0000Z\u0014zIŢ D\f\u0005/m6{E$t\\\u001c^)])J\".\u000fn\u001eQ|\u001c\u0012BTzzF\u0004E|\u001ef)HȈ\u0006C 8\u0006Sfffh.L<\u0012\u0002(#bHp\rޙ22b\u0010\u0016ʌE!YdF5zkeFY\t`\u001dU,ħ\u0014\u0001\u0011E\u0002Se[\\p\r>RYbg\u0004qp\rWį\u0006#:%\t\fAU4\u0016dJ\u0006ӫB\u0015\u0002\":#YM!;U\reJ\\\n}\r\b\u001b\u000b\n6\u001bL}4Ƃl(\u0005\u0010}\u0005E\u0014$6A\u0012٘\n\u0005\"\nm6I!\bL\u00160\u0012B!K\u0002#2\u001f&\u0016f)7\u00178(\u0012.X$.\u0001$&]6\u0006\bZ\u0014\u001a\u0004VE\rp\r\u0001N\u001a\u0010 `\u001aNyyH\"7^*|\u0000\u0006nT\u000fӑT \u0014\n\n\u000b4<(GPp\r\u0002\"ߢ\u00180VfnI\u0006B)š\u000eBO\u0007P\u001a4h@\u000bB\fSnCIR\u0010B\u0005\u000eGler\r\"!ȃL@\t\u00132͆Rqqq\u00021Ȱ\f\u0007Ln4\u00189X\f8\u001d\"?\u0013nCd`\u0003\fGP\b\u0010nCDb\u0000\u000eEP`asl((\u0010X\u0014bc*\u0010nCiȐR\u00001X\u0019\u000e1݆\u0010PZR*A(\"D!@\u001a:t\u0010\t\u0002\u0013al\"\u0002n \r\u001b\u001c \u0011X\u0012%1M6ʆ\u0001\u0007$1T\u0004]\u001c\u0016\u0003@*/+\u001cT\"\u0000En\u0010$\u0006RyPf\u0012ApЙ(*v\u001bJÇ+\u0010t\"\b\bUdqp\rR:\u0010d6DL\u0014s\r\u0011\u0015BM \u0010Dd4pp\r\u0011\u0015CyY\u0003\u0002\u000eGB\u00189r\u0011&!0@Y\u000es\u0000m7*++\r\u0007\u000bBMFdmH\u0012v\u0003iԨQ\bp:bmDP5zh\u000bF\u0019\rwr\rꪪ*\u00010Њ>r\r1U*\u000fN hm7^{m\u0018A@\u0010#HEӒn 0\\tR\u0011$d ر\u0003\u0007\u0000Q\u001abj\bS\u0011\u001bH)\u000e&\u0011\u0010Xъ\u001bF555\f\u00046\u0004\bFR0\u001e0@\u001chC\u001bH\u0013&\u001fA#L\u000604q\u0006\f\u0003IDR\u0000\f*\u0010E\u001a\u0002@&n\u0018N<i\u0012&~ \u001bFu\u0001\rJnA4eJ]]Ơ@@\u0018\u0010\u001bFoL\u001cj\u0015\u0007C\"!\u0011\u0014M}\r\u0015\u0007A6ؘm8O\u001cjk\u0001\f9MCgƘ*nAT?} HC4\u0004 1rP'D\r\u0014\u0004o\u0010͜i0\b\u000e &\u0018 $\u0007nA4k\u0016@v${B؆\u001bDg\u001b\f\u0003):S\u0010\u00136\u001cDs\u001a\u001a(\u00051>2\r9\u0012Y3%z5\u0018AN]\u0010xIq\u001b\u000eys\u0015Y\"\u000f3=1Ц6\u001cBo\u0003\f$\u000f'e\"\b\bp\u0010͟\u000f\u001c\u0002\u0006(J`\u0006\u0016m8\u0016,\u0010\u00180\u000f\r\u0007\f\u0007\u0004\bn!(0(\u000es\\(\u000e\u0014\u0004\u0010Zظ\u0000Bͅ䀃\u0001q\u001c$\bn!haS\u0003^\u0017r_D\u0010(\u0013\u0012E\u000b\u0017\n\u000e\u001el\u001e\b\u0007[܎ChE\f\u0005&\u000f\r'CJrv\u001c@˖.Y\u00180zoχ\u0006\u0007]\u0010\u0002\u0003\u0000Z|Rá\tkM9\u0016Ir*\u0000jn\u0016\u001cL\u001e\" (]ma\u001a\u0000Zb\u0005pPyXDjݛY?r\u0000R\u0018 \r\u0014>sC=\u0000Zz\u0015pPSԤ='M=(\u000eܖk\u001a\u0001k\u0012`zҽ'-\u0007PK\u000bpX\u0012\u0001@l45\u0004۲_'1^\ryh^a\u0003Y\u0017$\u000fܖ\u0003huZJ\u000e0\u0016ζ 䡁۲mڸAp\u0018TKs\ty\\, =mٿ6oڸqÆ\r\u001a=\u0016+\u0014䪶ٿl\u0011\u001c\u0014\u0006a\u001de&Pmٿ\u0007Aa\n\u000b\u0016Umٿ\u0012\u0014d\u001ad\u001cDI:-YMr{\u0016\u001cD\u001c\u001dԲh8crbZܖk \u0000iPy\u001bj\u0015\u0016\u001e={\u0012\u0003\u0001A/r.L\u001c\u0015ٿvؾa3\u0005\u0019HMr{]vJ\u000e\u0010\u0007AdK\u000bmfˁ۳wٍ\u00180\u000enK^M{Wݻwq05\t\u0018X@;#J`]{Z8܊qPi7 mڷ\u0015\u0018Z\r\u0006,d;\u0001r6[\u0004\u0018p(oB\u0005,MuRXu۵ow0\u0000\b,lK\u0011mڷ\u000e\u001eh\u0017\u0018m\u0010,l\u000bnӾu\u0001\u0000q@\u000e\u0010\u0007vǂ۵g\u001d>,0K\u000e2\r\u001e9\u00029\u001eVswH\f&\u000emm\u0014C)qXڷޕ\u0018T\u001c$\u0006\u000evY8ll㰖۵gp\u0004.V\u0005)ɝ;LI0-ڳ::\u001d5\u0014r&΄\u000bj\u0017ݙ\u001b۶_\u001d;zCAs`0]\u0001;.\u001bmՉ.\u0006ȃ*=a[&\rܶ=넋ơ͜P\u0012VgYp\u000fN4\u001c\u0004\u0006YxAT\u0010\fNIr\u000f?\u0018d\u001cĬLmۯΜ`+Ӽ`gb\u001eT\u001c}{3\u0012)c\u0000CAang,}{չΞuС\u000f(ۑ`eSR-\u000bn>u@@wšCym6U\u0017Ο\u0018N\u0003'cW\u0003vWX\fܾ\u0017/ǡ`x\u0017WEtW\u0000\u0006n^\tP8o\u00018\u001c9$\u001d\u0002ߙ}SAc'\rtc:b?\u001e}mܧO.4\u001dy\\n\u000egew\u0005\u000e}_\\\fjU4\u001c;J1\nNVn>u*bP3V\u0005A\u001dPp\\P{۸{.\u0006Y\u000e\u001fUq\\c0q@\f=\rAn\n*\u0010]\u0015rvQoE0Ƥۺ?ݹ\u00136&aՑ鳻\u0011\f#\"0+\u0006n_\u0005۷$\u0006pA5\u0015z(\u001dmݟ\"!\rX\u000ejcU8p{}))\u0000!RꎄyJmL2{W\u0014wU5\\n\n*\u0018{_ݻ'(X\f\u0003ŀ\u001dI6\tۻ/曯!\f\u001aT\u001c\f\u0006H3\u0014fUt\b\f=\u0007\u0002\u0004`\u001d\u0007٘Uޓ\u001e=R\u0018\u0019\ffSgMGJ\f=ߺ\u0018>Mq\rPW\u0005`vI=y,(<|p`p*+9gcrc\f\u00034¼*9\u0010\f#ޏ?{\u001a`\u0006|RtAl\nn~ϟ=\u0018\u001e\u0002\u0006ga޼O+{?ۿ\u0017C\u0014)p3{?)\fO3\ry\t\u001d\\Q\u001d\t\u0018{/\fXݠVyY?*D7p\bG\u000e\u0015ib\u0001>_\u0005ד\u0016\rW'&\u000f\t\n\u0012O\u0002%'O\"ד\"U\u001aPP\f?^[P\u0015gG\u0013\u001b٠1+Hؘ?y\róQ\fXjU؊\u0018~UDQ\u0003\u0010\u0012O \u0002j\u0014/\u0014\u0001\nФ\u000bim$mfbǜ{\u001c\u0019[\u000bɬ_0kSQa0K1`ۓ]7|W\u0006\u0003\t\r\f\u000f=}+0=dkQQ\u0010\u0018|6\u000ec\u000e\r_=jk!\u0006?\fs=\u0018\u0013\u0018&r(\"Ҷ\u0006\u001b\r\u00059Q\"\u001am\"Si-/S\fj\u0005퐺6\u0010\fL\u0017Ӏv\n\n ZƠ8\u0012\rL]iJ0\u0002M)h\u001byzVchh(VyF`S\u0006m#Kk\u0019عIE\u0004)\u0016\u0003G66I\nd\u0004dY\"D\u001bQ.0;|0.0dÇm3\f4\u0019Dk((8\u0006,(x\f\u0005\u0005\u0017Nd/\u0016\u0003Jcu:[\nCM\tiWi\u0013Kk\fh/-)p\u0017\t;\f\u001a\u0003R\u0014\u0018^jwgg{%aW\u0005\f!\u0006~/>y6P\u001f?*\nv\u0006P\"\u0012\u001f\u0006P\fCG\f*KHy._`\u000e\u0003M3\u001d\u0007\u0014\bDA!Q4aSQ\u000fCy'CQF\u0003O\u0013\u001d\u001fi\nj\u0018v0`\u0006PN\u001cP\u0003\u001c\u001f\u001da\u0018޻\"]b4i!\u0015\u0005\u0006:;=5\u0018\u000e\u00064Ӡ;Ўٙwb\u0004$\u0019\u0006bw\"Āˋ\u0012\t\f,!rt'2\f\u0012\u0003T./-S6\f<\u001aNhp\u0001\u0019&$Unn%\u0005\f\u0002v%o\rh[I(\nחj%Y>J:/\rv\u0018'\u0004znWSDx-۴AKR~F;۞0r\u0018ș\u0006\u001aT4\u001d`LC\fZhL\u0006Qp6\"\u0019įN5R\u0010b Ď\u001b\u0011@\u0004x,\u0005\u0017\f7Ja0Na~\u001ep\u0006>@0|@:CWe\u0013aPɀ8F\u0003\u0012݈h2g\"\u001a;k69R\u0003A`vis\u0015Ȫ\u00180}Vkh0)ap\u0014EO,5ԊQ\u000b\n\u0015+\u000b~Ut\u0018nc\u001a&tep\u001803AK\u000bHa!\u0017\u0010[^\u001293 \u0013ڳװB1\nn%b 1\u0018\u0006Z\f\u0006u*+Ak\u0013\"\u001f?\u0002oѴFGF\u0003\t4\f\n8b%x@\u0006\u0005R\u0004\u001a\u00175)T\u0005Cu>R\u0004NZ\t(R\t7\f!ȵ\u0014R(T\u0004C@wCV wJ;50PR>, @/G0i\b\u0001m\u001e``P\fhLI\u0014*V\"Y^p\u0012;\u0013\u0005\u0005mL\nee`\u00148\u0012PL\u0003uQuϒ\u0004$K\u0006&\u0012Av\u0006&\u00121\na@ۭФ(p\f\u0015\u0005r\u000fJi\u0014\u0015[\t;\u000bh#TB0Y(\n$HM\u001c\u00061J0z%*1XeSx 1>\fh5TB+6XK\u0014ƀWSӤ`\u0014̗a@\u001bKR,P@JTJ\fj\u0004SR)\t\u0002\u0003Q\u0013R`@i\u0014\"À\\)\u0012h'9J\u0010_\tLM\u0002C)\rLD)\u001a\u0003R:\u0005\u0001\u0019\u0005't\n\u0017OCi+~@\u0001)j\u0001hO@i\u0001hͺ\u0019o5\u0015`\u0000䘰\r\nendstream\rendobj\r79 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r82 0 obj\r<</BitsPerComponent 8/ColorSpace 80 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 92/Intent/RelativeColorimetric/Length 52/Name/X/SMask 218 0 R/Subtype/Image/Type/XObject/Width 48>>stream\r\nH1\n\u0000 \f\u0000?A(t(L7\\\u0004\u0000\u0000\u0000_yDVUF_y\u0007k\u0000\u0003\u0000~\u0001\u0014\r\nendstream\rendobj\r218 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 48>>/Filter/FlateDecode/Height 92/Intent/RelativeColorimetric/Length 65/Name/X/Subtype/Image/Type/XObject/Width 48>>stream\r\nH1\u000e\u0000 \b\u0004A?ZEB$-(0\u0003\u0000\u0000\u0000\u0000\u0000KҶL.+(RYk*]<7\u0001\u0006\u0000`\u0000\r\nendstream\rendobj\r81 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 219 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r219 0 obj\r<</BC 220 0 R/G 221 0 R/S/Luminosity/Type/Mask>>\rendobj\r220 0 obj\r[0.0 0.0 0.0]\rendobj\r221 0 obj\r<</BBox[241.642 255.418 245.011 248.962]/Group 222 0 R/Length 70/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 223 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n3.3684096 0 0 6.4561185 241.6422424 248.961713 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r222 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r223 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 48>>/Filter/FlateDecode/Height 92/Intent/RelativeColorimetric/Length 65/Name/X/Subtype/Image/Type/XObject/Width 48>>stream\r\nH1\u000e\u0000 \b\u0004A?ZEB$-(0\u0003\u0000\u0000\u0000\u0000\u0000KҶL.+(RYk*]<7\u0001\u0006\u0000`\u0000\r\nendstream\rendobj\r75 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r78 0 obj\r<</BitsPerComponent 8/ColorSpace 76 0 R/Decode[0.0 255.0]/Filter/FlateDecode/Height 217/Intent/RelativeColorimetric/Length 4091/Name/X/SMask 224 0 R/Subtype/Image/Type/XObject/Width 194>>stream\r\nH׉w\u0016\u0007pjH\u001a\u0014}GI\r5WS\"\rj&f1*1B\u0010?ߙ\u001b{.{V}s{\u0015.jU\u0005Y--}pVR7.] \u0005-\u0017KXºċ\u0012\\dU\u0012\u001f\u0002\u0012\u0012+uu$\\\u0005\u0017R\u0018Y/\u001bA#\u0001Jf\u001c\u00123gJ)]WI\u0013d\b\u0018l%\u0015\u0010\u0016aͥnةk<\u0001&`\u0000\u00174p\u0014\\id\u0005獠9GW\u0000p):SJݻ6A\u0016hA\u000e\fm\u0005\u001e4\u0017:QoJ\u0001=G-(\u0002g%\u0012\u0003\ten\u0002\u0015IV%\u0002\\\u0010\u0000\u00105CRpX\tuK\bn:@\u0011\f!\u0012c3\t@\bQ^\u0005T\u0004ǎ\u001fϖp ܠ\b\u0013%\"8~ȑsG\tMB\b]f\b \u0005\u0019\u0019\u0002w\u0013\u001c\u0014,0C'-~\u0010E\u0000$\u0005[\u0004mhoo\u001cy'jK*\u0011XAQ\r\u0006\u0004m޵f\u0005\u0006\u001cnj*R\u00032c7C5>\"?t8{ݏ'\u0005g\u0003\u000e\u0014\u0003\twMhs5Jp6$\u0003\u0007\u000e\u0016\u0007\u000f\u0000\u0010X \u0005p43ttt\t׽#<E x\u001b\u00133$\u0000\u0015G\u001d\u0001;\u0000T\u0000 G\u0004Z\u000bOQI\u000eR-8\u0000e\u000f\u001fеF%Gp*$\u0002\tؿwoo\fO\u001e>\u000eA\u0010\u0002u'(w\u001c%\u0016\u0000s-^\u0010<\t\u0013co3J\u0010Ƈ\u001e\u0019\u0012gO$`\u0001ו9 I\u000f\tz`x \u0010\u001eP\u0004p\u001c\u0019%\u0010\u00012\u0002,@\u0004p\u00114juf\b\t~ߕ\u0002K\b7\u0017\\{!\tT\u0001vkϡ\u0017'蚽Y_*\u0000\u0000T\u00065\u0011H\u001dn\tX@\u0011\u0018\u0014\u0000EJ\u00167r\u0012[\u0001\u0017)A\u000073F<ǩ#hV;)\f\th\u000bCZޝp\u001dXH\tΝ3Gi=E1td\u0004\\sgccBsI\u0000\u0002R\u0016āB@\u00020Mu2\u001e\"!\b\u0018:\u000f!foҗ^\u00041Ega*\bE\u0000\u000fR.p\u0001$'s\u0003\u0010\"\u0014Am@\n\u0013.\u0010\nA\u0013&\bw\u0018\u0006Ӂ!~\u0016W\u0000\u00111t\u0005\u0004^\u00048\u001f\u0017\u0004:\u001aW:t\b\\BWW\u0004!\u0000^~\u000fC\b\"\u0000H0\u00009_\u0000,\u0002\nY\u0010̛5ġ@vo,3\"\u0004rnsd\u0004ަȟ!L\tk\u001c\u0014tiAkw\u001c\u0001\u0001qCk@\n`\u00006\u0002$\u0010`\u0004D\bCs,\u0002\u0005\u0006$̼W`\u0004\u0000 \t\u0004\u0001hkq\u0014蟗cb\u000b\u000ee\u0012\u0000F\u0004\u0004\u001cA\u001a$\u0014BkkD`\u0004G\tJMmA\u0000\u0011s\u0001T\u0005[\u0000FH\u000b\u0001\u001cB'\u001agp\u0000VL'ܟeM2kD(\u0001\f{3;\u0017]f.H?U\u0000n2\u001bHY\u0006'\u0005o\rBs$\u0006\tH*v\u0013\u0012J\u000fQ\u0013:H{@\u000b.A\u000b:;i\u0001~?\u0000\u000f$FHӿ0\u001c!\u001eC\u0010\t|\u00168\u0006p\"=\u0000\u0000V\u0012@\u0000?\u0003\u0000Џ\u0002\u0013U\u000b7m#Ap\b\u0010\u0000T5\u0010\u0004\u0012\t<\u0014Bo\u0013p\tk\f\u0005nN\n\u0014\u0010aw1\\b<A\u0010iPu\u0014\u0004o\u0001X7\u0019|\u0006FWP\r\fy\u0011n\u0001\u0007\u0000Q\u0002\u001d\u0003hAPsT9a?S\u0005\u0010#x2H\u0010B\u0001X\t`@D:#\u000bn'\u0004Կ\u000e!wg*'\u0005\u0015>\u0000\u0005VO6WWGINR\u0017\u0006bw-P\u0002\u001b8\u0000V\t\u0018X\rhֿ07\u0004[Aww\t@\bE\u000e\u0004۶@i%Q*v\u0002\u0003ei<ma\u0015\u0012h\u001dήl\u0000}[YmesX-DFr\u0017\u0006J\u001b\n\u0004\u0002\u0004`\u001bQoyG#2\u0016ԛַBniPP\u000fV>@\u001a@ \u0013bZ\rTXV\r\u001d\u0004>eZO⯢G\rAd*\u0000ӯZ\rh\u001bG\u0002o\u001c\r\u001d]\u001eWv\u00020>MdI5 x'\u001d\u0004{>@\u0004 \rR\u0019\u000eO\u0014@\n>2\u000f\u0012Pe(ٴ鿲xI?K+;7V\u0003\u0015\u0010|N$\u0000! y#R`\u0017:QaT\u0003]d$\u0019\ndۯ\u000f\u001f>BbA\tT\u0013]V\u00030\u0019\nxq_~\u0000b?>e'p(>ڿm\u0018/\u0000^W^ƍ>V{__P`8@N\u0005m^\u0002\u0017\u0004\u001btG׼\nDZ\u0017]\u001b6'ל\nlOA?\u000b>\u000bςςg^DVבu9\u0016x\u001c\u000b֨`>*X+\u0003br+X2=\u0013/\u0014-Ycs,\u0010\u0004V>\u0005y\u0002I\u0010\u0001j *ςZ^H\u001aa19Z2\rT\u0015IԢ8,5jQ\u000eU>\u0005+xt\u001c}QB\tVF\u0011r*Y\u0002\u0004!%c`\u0011|\njj|\u0017)XJ\u0013,\t&!\fa\u0010&\u00027dSP]\u0010jL\u0014a]\u0014,eU\u0005B\"X\u0015\u0014$RxC\u001a\u0000K\u0016/^\n\u001axf-jt\u0012\f,\u001bE\u0000\u0012_\t9lp\t\u0016-\\\r(\bM\u0011\u0013\f\u0019RY\t%K\u0019e0\u000b\u0017\rয়A\"@\u000eAC\u000f\u0004\u0015Eނ\u0005#\u0004\ri\u0004U\u0004\u0015\u0015E ̛\u0005cXZrX*\u0003\u000b\u0018e\u0001sϛ'\u0010 \u0001.\bd\u001eDP.\u0004_\u00160y\u0018\u0014\u0001Β_)Hg0\u000b\u0015\u001f爚?LҢF\u0017@ Hd0l\bP\n6B\t\u001a\u001a>\u0000B0\u00122C)ΐJ`\nFUUUU\u0000\f\u0012\u0011C\u0010\u0006|kР\u001e\u000b0)\u0005ᇪ*M9Z&*\u0002\u0005PC\u0005#ѳg͚\u0015\u0018(¢`Y\u0000F0r\b`\u001e\u0000f0\u0000\u0014)כ'X\u001c\u00072H\bR\u001bfΘa\bU`9a?G\u0011\u0004\u0000`\u0003\u001ag\u0002\u0000b\b,R@ϐξ\u0004'Q\u0012\u001bO\u0002K\u0004\u0006=H.aY\u0001\u0004\u001aH_'\u0002TVj,0\u00118s\u00015 NR3Dv5ѣ\u0013_YoO`\b?!\u0010\u0010\u001f\u0001^\u0003G \u0000Z\u0010C{-pjlR@,R`/4ΐ`X@0vH$T\"$TA|HB\u0017\f\u0002\u0000`Z0fLi\u0001\n\u0019$w\u00159[@A}BP6\u00191cƏ'N\n2`\u00198\u0005z\u001eF\u0000f\b\u0006(k \u0005ǹ;e\n\u0017L\u0002g\u0013`nt\b\t`\u0000\u0005\u00118H$`q\u0013&ϝ:u\n7L{@Q\rɽ\"\u000f\u0019\" \u0004<\u0003Fɓ@Q=P\u00109Z\u0019\u001a\u000b\u0004T\u000b\u0018C\n\b1\nnBhb#KmPJg`ĉ0iҤ8\u0003Q'jRH1C\u001a{\u0019\u001b\u0019\b+26\u0003<F\u0010\np,pg\u001a\"N\u001b+:\u001de\u000eMH\b.\n\u001fL`:B|=Z(\tyoD\u000b\u0011\u0015\u0001ȴ,Be\u0010\u00168!\u00010!b\fR\b\u0018\u0005q\u0014?+j\t\f\u0011\u0000(\u0018k\u0000\u0016 e)8Z\\G\u0010!\u0005\bg0\t/ #6\u0000\u0000\u0016BADX&\u00193|S=\u001e'vZ\u0005\\O5NE !X&8\u0012\u0019̾!\u000e\n\u0000\tzBзŹ\u0017 \r\"p\u0010Q*3x&T\"\u001e\u00116\u0001!D\u0005G\u0004&5\u001f~E`B\u0000E_\b2Q,\u0013\u001c`zDe\u001db/\bhX\u0011:\u0010\u0003\u0004n\u0010\u0010\fH\bh%wd]?\"̼!{V\"\u00007\u000e\u0017]?9\u001ey\u0004`\t\u000e\"\u0003T\b\u0005b\u001d`4Np+@PkE`\"\u0011d\u0013Z[\u0007\u0011\u0005\bZM>(&:{BGࠞQ\tғ\u0002<\b@\u000fFM\u0000km]A\r\nP#AF9\u0004zU\u0007U\u000e\"\u0012k\u001dE!eTg\r\u0002\u001aB{n?1Z@\u0013|&\u0010\u0004\b5V\u0011P6A~GǊ'M\u0010v:mb\u000b\u0003`\u0004\thf\u0000\u0004TE@j\u0001\u0004A3\u000f\t\u0016\f\u0013*&\u0000\u0019`\u000e!poQ \u0000}\u0003 \b\u0002$\u0001^\nN#Bs%)Q\"\u001f%\u000e\"zOH\u0002c2q\u0001h\"x\u001femc6z\"0Ƒov\u0004\u0006i!c\u0017\u0004ކJ\u0002{\u0000\u0010bA4\u0004!\u0002o\u001b\u001a@\b6R\u0000\u0003Ga1{[{_8@%x'L\u0002oc\u000b\u0000=-\u0015'vs\u0012¶\u001f\u0013`\u0000YA\r\nendstream\rendobj\r76 0 obj\r[/Indexed/DeviceRGB 165 225 0 R]\rendobj\r224 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 194>>/Filter/FlateDecode/Height 217/Intent/RelativeColorimetric/Length 4922/Name/X/Subtype/Image/Type/XObject/Width 194>>stream\r\nHԗ{U\u001a(HQj]\fPK\u0005IP\u0016H\u0002\t5$$\u0014#R\u0000\u0012AJ\u000ea\u0001sSɐw^kz\u000f)gzJv\n%mک)nN2m*\tr\u0002<\fw\"g\\7{w\u0000A{{\u0011\t@ \u0000;vȴ@\b|\b@}{mzw/%.\b2ԭ\u000bA\u0002lok\"Cg\u0007F\u0010\u0004۶eڰNJ\u0011\u0014\u0002O@\u0012lۚiHu\u0002B$\u001e\u0012\u0000[#>\u0003\u0019`˖L{g:?\u0010t!r\u0002!Lu\u0003\"\u000e:j߉ǘ\u00030C\u0007\u000f\u0010\u0002\u0010)\u00114oΜ \u0002g\u001fy@D@\u00016oژ!#5\u0004E`!\u0002мyӦ\u001b6dG\u001cƁG\u001ej\u0000@~]\u001f?v\u0011\u0002\"\u0000}U\u0000'O\u0010|Ü `헡?uM0\u001eD*\u0002>\u0004@vMMS'O8~\u0019B2\u0002>\u0004\u001c5w\"\u0004\u0018Cw55\u0017\u0011\"X:\u0000gw\u0013\"\u0011(\u0000 \u0012ZFgϞ m#7\u0001\u001e\u0016}\u0005&q\u0002\u001c\u0002!}_\u001ea\u0002\r`k\"\u0002\u0002by:_pܹgd\bb\u001dyCյI\"\u0000FlY\u0001~H\u0011\u0010<\u001bU'h\t\u0014of\u0011M\b\b\u0015!/]\u000b%\b}\u0018\u00027i!\u0000hX4e\\&\u0004\u0010D8M\u0011>2\u0010\u001c\u0004/-$\u001a\u0015˗/kl$\u0000u˗M\u0002m\u0014\u0004\u001chX\u0004\f!\u0006\b,I\u0001$G0˳Π]\u0012\b\\t\r\u001bc!nIm\u001e~k׮^a}\u0011g\r3إM\u0011/3\u0002\u0016H\u0006\u0016\u0001#X\u0007oܸ\bD\u001fg8>k \u0019[l^&4\u0005\f7QbB\u0001n޼I\b\u001cmd\\fF62'Y\u0010\u0010fǔ)\u0000\u001cFp\u0005/MJ\u0011G\u0014\u0001v@E`'p\u000f)X\u0000\u0016̟\"q\u0014p\u001f6D\b.\u0004-bQ\u0000B@ؤ@\u0001̟۷o\u0003`\u000fq~\u0010`\u0002\u0018\u0003\u001e:5^6!F0/\u0019;w\u0010\u0002'\b:k6R\u0004;e\"\u001ej7i\u0002\u0014\u0001%w4\u0002@ΚQuN46՚_cCWcP\u0002\tPSS\u001dw9\u0011(\u0010+[\u001e5s\u000e\fZ\u000f\u001b\u00187.Cl\u0011\u0006\u0004\t\u0011\u0003\u0002\u001eB9\u0019\u0002=.\u0002=\u0003cA=ѨmR4\u0004`@\f\u0004 0>\tl\u001b6REU\foRqˬ\b\u0012\t\b.Yg\r@'I W\u0016AA\u001d3\u0000XiF` C\u001f\u0004jp\u0002N<ˮI֚\u0013_f+\u0007Iu9UN\u0000pl#muΚ6\tx]\u0000XE\u0000ω\u0004\u0011TK*\"'p[!x3\t\u001a\u0001\fZԓHE\u0001 :\"R\u0000d\u000b\u0002}`S\u0002A\u0000xS蛈\u0012Mʟ$\u0006}.X\u0000\bx\u000eq\u0014H\bo\u001d#\u001e\u001c\u0004B}@ͱ\u0000\u0004^c4\u0005UU6B\u001c\u0011$\u0018fYc!h\u0004\"`xjЋμV\u000fi\bx\u000euH# \u0010mdMZ\u001c\u0003yՃ\u00127C}='QzJl#EXv'\u0013s\u0001-R55fFǽ\b\u0002;k\f\\\u0000D@>:\u0004A`Q\u0019\u001eB8p㟊gn!\u000e\u0013cVUe\u0013\u0013\u0010\u001f\u0017$\u0006 \u0011{X\u0004'M\u0004XF0@r\u0004\u0011\n$\u00041\u0010?-)\u0000K\u0016{\u0004`\b\u000e\u0002#\u0004alG\u0001؋B\u0012D>\u0018'E`5*\u0010\u0006HbM*\u0001\u0002`'H\u0000mR\u0007A\u0003}\u0005u~\u0016p\u001fA\bO\"X4\u0013!pG%@}\u001a\u0006H0'㟪\t\u0010<;\t\b Ak$pM#\u0016B\u0000D4\u00021\u0004\u0018XB='\u000b-(\u0004S\u000e\u000b\u0004\bM\u0000\u0011T9\u00014\u0004{\u0018B8-\u0017g\u0006$A\u0010.\u0014^?\u0015[Cuv\u000b3\u0003\u0001x\tBf\u0016G\u00103\u0000\"mo`\u0001Q\\\u00051\u0018n\u00188BSZ?\bjLt%\u0002|J*;)%\fP\b\u001aO@O\u001e\u0002\u0001\u0006*\u0000\"A\u0003y\u0001\u0018O\\z5\u000e葔BT\u000b\u0016\u0001p\u0015\u0015\u0015Ҵȇ\u0015?@H\"\u0000\u0006Pᓇ@0<[I ?\u0015$ @^B\u0014\u0018\u0003@4O{\u0006\u0006gϞ\rg\nj\u000f\u0001f[ΝQϸ9\u0017,%\u00040\u0000BZ\u0013\u0000V\u0000p\u0010J+%\u0016CSaYf>\t3ȑ?\f\u0000\"\nP\u0001~qG\f!'\u0012\u0000th\u0000fRɂ\b\fw1i%E\u0010\u0014<\u0010\tx\u0000gzX\n],\b!\u0007\"<\u0002f%?s:XHND\u0004\u001f7\u000ep\u0006\f\u0010EW\u0017_R!<\u0002m|5ﶤ'O%4\u0014\u001f\u0012\u0000\u0006z(q?\u0014\u001e\u0001\u00030{g\u0006\u001f,Qi%\u0000c\u0018\u0010\tTp\u0019^=s)\u000f)`#\u0011\u001e\u0001/@Qr3\u001a-F\u0011\"\u0001`\u0019s!<\u0010!<\u0002\u001f\u0019\fS\\>\u0014.\u0006\u001d\u0015&nY>S\u0016$\u001e\u0007g\u0011_>AR\u0018,\t>S˥iU\u0003\t\f\b}:`\u001cT&+Z\t\u0010\u0004\tSӈʸTEi\t@4>|ܪG\u001e\u0002\u0017L\u0004s\u0017?m'Tܲ\\zip#/CF\u00121rn)\u0016aUx\u0004苧La\u0002Ǫb\u0014\u000fS\u0011/^ZI(<\u0002f_|S\u001b*q4\t.m?>f\u0005Dq4\t\u0017,NU\u0015/'G@=9P$?\u0002M\u0016\u0005-Շh\u0012 D\\(UF\u0000\u0019hTid9)\u0004Ƞ<&\u0012h$U\u0004X$h\u0012| 4q\u0014M\\%%%\u0013\u001cɧ$(\u0011*..QR\\$\u0004Š\"\"`KЧ$(b@TTh&\u0004'H\"\u00042*&xqD\u0004AL)Ru4\t±D?Q2 &Aaaa\u00011\u001b\u0007\u0002h\u0012\u0014p\u0001\u0004\u0017',@$\u00183&\f\u0011(\u0018+QG ?/RP\u001c\u0019\u00168c\u0005Z4\tF\u0011Q\u0002CW4\tF&c\u0010>1\u0001,bT\n\"J\u0010\u0018D>dA) \u000e\u0011J@5Zb\u0000\u0004KE`ȑt\n[%P\u00102<.Y\u0010E \u0016\u001b)Q4*AAP7\u0014Mܘ\u0010n*\u001b4j#\u00049\\5\u0012FF(77G0P\n\u0005b(\u0004ل \u001b0b1}&^\u0016\u0002\u001c`\u0014\u0010\u000b4\u0004Y!\u0017K$Ȣ&C4\tF\f99\u0010\u000b4\u0019W^\t\t\u0011\n!'\u00071\u0014A}B?|\u0014Aŀ\u0004}n\r\u001fN\u0011$\u0003B~Q\u001e<d\bzS}{D\u0018q;\u0019JUBЯ\u0000\u000e\u001bb\nbH\u000f%ׯ\u0001i?dP0\u001cb~XJ\u0000\"?R!\nAL\u0003b(i~@\u0006\u0018#h\fY\u0001\f\u0010\u0010\u0000\u0000B0pP\n\u0018A\u0016CvP*#ۗg@\u0001\u0006*ǻ\u0018a0o+9d\u0006\u0000@hAof*;\u0002a\u0010\u0015J\u001e\t&\u0004k\u0001[\\J(\"vb\u0010\"\t\nY\u001e+*ய\u0000.>J*)yLOwސ)RsN\u001f\u0015¿^\u0005Q\u0006\u0000k] !_]\\\\~\u0010b\u0019Iwݽ;??@_\"keM2\u0019UJr\u0004\u001a\u0011X@\u0000\u00128Zm?==;\u0010./|%']I\"d\b0\u000f\f%\n&\u00041\u0000\r\u00159\u00108ʅ\u0004\u0001x\b\u0001BF&R\u0000(7o#\u0004룼JK\u0010)@b.`hW\u0000T0Q`\u0017>ƕX\u0011,\u0006,?\fA8\b\u001f\n!&\u0000\u0000\u0010I\u0000\u001aX\r`U\b`pb\u0011޼\u001b\u0012\u001f\u0005\u0004F\u0002,\u0010e\tVVkcC\"\\\\*\u0000B\u0004K\u0004j\u0000\u0012\u0018v~\u0017c\u0010ȶ\u0017Aޟx\u0012[\n1Xk\u001bf\u0006#̀|\t 1+N\\Ԕ\u0002\u0004?\u0012`\u0013)vNbçE/@)<0\u0018@D5Gb\t:CK4pIP\bB9v\u0014R\u0012H\u00036 \u0004\u001a`CKnm&\"03\u0002\\$\u0001I\\s`c\n\u0004\u001e\u0000\"kG\u0000a6\bqHj|IE\t~\u00045\u0016dCU\u0004\u001e\u001cD\u0004p\"\u0011\u001eE;G\u0012Gu\"\u0013@\u0007\u0019\bv\u001fx@\u0010$,H\t\u001f\u00138\u0017)^֭=LE>\u0004r+$PC\\\u00020SD4~ݵ\b'\bpu%t\u0019\u0007Q\u001cA\u00108\rvd\u0002e#\u001bfωR(\n4J\u0002`\u0013\u0011 \rB\u0010\u001aHI`\"\t\u0012kԃ\u0000\u001c\u0007\u0002x\u0015S\"x\u001e\u0016q\u0012v}\u0006P}E\u0012\u001b\u0001\u000erF\u0003'BtZO,\u0005E_e\u0016t\u000bb\u00135e\u001akr\tF\u0005\u001f#?F'S\u0005R\n.\"F\u001aS\r\u0002AZ+%\u0005y\u0013@\u001dh\u0017i\t\\ڈp\u000esQ\u000056\u000eu\u0000lB{dL]\u0011{IPb5\u0010ɗ\u0014$\u0010]\\mdD}dD(ă{\b\u0011]\u001dt}.\b\u0000UG<L\u001b[\u0013\u0011\t\u0002\u0016%6zk\u0019\u0010|\u0014=Q_Mxe\u0016\bi]\u0014a@E/NF\u001dw=~e%\u001a\u001cH\u0004b\u0011n\u001e1\u001dB\u001e\u0004E\u0000!Iߨ7\u0005PC?l\u00121615ix\u001b\u0001\u0001K\tfT\u0006\u0002A@ \u0017?&\u001e %p\bo \u0007\u0000&_T#\u0013J?E\u0006\\ \u0002h\u0000j{´1|\u00189\u0005\u001c\u0000h@\u001f\u0011@'s4kmo8Xf\u001a`\u0011\u0004\u001f9iGxU\u0010x\u0000ߢ \u0002B\u0010.ٴ# \u0005@]\tp\u0012%ax:M\u00005\u0011@E\u0004=D}K0P&(\u0005Y\bSga\u001eO\u001b\u0007\u0000)p\u001a0\u0011\u000eӵ6\u001b\u000052!\u0005`4HH\u0010afaeHm$,׃.i+%\u00050\b{#\u0010^z=K\n\u0012z\u0004\u0016GU\u0000Q\u0004b\u001b\u0013\t0\u0001-\u0005KPj\nĘ(~\u001eZn=\\\u0002\u0012@hj\u0013\u0001\b1N\u0019JͰ\u00141\u0016Qի\u0010\u000fm\u0010\u0014 zo<AD\u0000Zd:K:GU/Gl\bUo+\u000f\u0006\u0013Tizr\u0012 \u001fUfvX\u001bs\u0015^qԤ%\u0004UWd\u0012(w+:I\u0017+1faf7\u0001\u0006\u0000%\r\nendstream\rendobj\r225 0 obj\r<</Length 498>>stream\r\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000~\u0000~\u0000}\u0000|\u0000|\u0000{\u0000{\u0000z\u0000z\u0000y\u0000y\u0000x\u0000x\u0000w\u0000w\u0000v\u0000v\u0000u\u0000u\u0000t\u0000t\u0000s\u0000s\u0000r\u0000r\u0000q\u0000q\u0000p\u0000p\u0000o\u0000o\u0000n\u0000n\u0000m\u0000m\u0000l\u0000l\u0000k\u0000k\u0000j\u0000j\u0000i\u0000i\u0000h\u0000h\u0000g\u0000g\u0000f\u0000f\u0000e\u0000d\u0000d\u0000c\u0000c\u0000b\u0000a\r\nendstream\rendobj\r77 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 226 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r226 0 obj\r<</BC 227 0 R/G 228 0 R/S/Luminosity/Type/Mask>>\rendobj\r227 0 obj\r[0.0 0.0 0.0]\rendobj\r228 0 obj\r<</BBox[228.66 262.997 242.274 247.769]/Group 229 0 R/Length 73/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 230 0 R>>>>/Subtype/Form>>stream\r\nq\n/GS0 gs\n13.6139889 0 0 15.2280186 228.6598206 247.7687466 cm\n/Im0 Do\nQ\n\r\nendstream\rendobj\r229 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency/Type/Group>>\rendobj\r230 0 obj\r<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 194>>/Filter/FlateDecode/Height 217/Intent/RelativeColorimetric/Length 4922/Name/X/Subtype/Image/Type/XObject/Width 194>>stream\r\nHԗ{U\u001a(HQj]\fPK\u0005IP\u0016H\u0002\t5$$\u0014#R\u0000\u0012AJ\u000ea\u0001sSɐw^kz\u000f)gzJv\n%mک)nN2m*\tr\u0002<\fw\"g\\7{w\u0000A{{\u0011\t@ \u0000;vȴ@\b|\b@}{mzw/%.\b2ԭ\u000bA\u0002lok\"Cg\u0007F\u0010\u0004۶eڰNJ\u0011\u0014\u0002O@\u0012lۚiHu\u0002B$\u001e\u0012\u0000[#>\u0003\u0019`˖L{g:?\u0010t!r\u0002!Lu\u0003\"\u000e:j߉ǘ\u00030C\u0007\u000f\u0010\u0002\u0010)\u00114oΜ \u0002g\u001fy@D@\u00016oژ!#5\u0004E`!\u0002мyӦ\u001b6dG\u001cƁG\u001ej\u0000@~]\u001f?v\u0011\u0002\"\u0000}U\u0000'O\u0010|Ü `헡?uM0\u001eD*\u0002>\u0004@vMMS'O8~\u0019B2\u0002>\u0004\u001c5w\"\u0004\u0018Cw55\u0017\u0011\"X:\u0000gw\u0013\"\u0011(\u0000 \u0012ZFgϞ m#7\u0001\u001e\u0016}\u0005&q\u0002\u001c\u0002!}_\u001ea\u0002\r`k\"\u0002\u0002by:_pܹgd\bb\u001dyCյI\"\u0000FlY\u0001~H\u0011\u0010<\u001bU'h\t\u0014of\u0011M\b\b\u0015!/]\u000b%\b}\u0018\u00027i!\u0000hX4e\\&\u0004\u0010D8M\u0011>2\u0010\u001c\u0004/-$\u001a\u0015˗/kl$\u0000u˗M\u0002m\u0014\u0004\u001chX\u0004\f!\u0006\b,I\u0001$G0˳Π]\u0012\b\\t\r\u001bc!nIm\u001e~k׮^a}\u0011g\r3إM\u0011/3\u0002\u0016H\u0006\u0016\u0001#X\u0007oܸ\bD\u001fg8>k \u0019[l^&4\u0005\f7QbB\u0001n޼I\b\u001cmd\\fF62'Y\u0010\u0010fǔ)\u0000\u001cFp\u0005/MJ\u0011G\u0014\u0001v@E`'p\u000f)X\u0000\u0016̟\"q\u0014p\u001f6D\b.\u0004-bQ\u0000B@ؤ@\u0001̟۷o\u0003`\u000fq~\u0010`\u0002\u0018\u0003\u001e:5^6!F0/\u0019;w\u0010\u0002'\b:k6R\u0004;e\"\u001ej7i\u0002\u0014\u0001%w4\u0002@ΚQuN46՚_cCWcP\u0002\tPSS\u001dw9\u0011(\u0010+[\u001e5s\u000e\fZ\u000f\u001b\u00187.Cl\u0011\u0006\u0004\t\u0011\u0003\u0002\u001eB9\u0019\u0002=.\u0002=\u0003cA=ѨmR4\u0004`@\f\u0004 0>\tl\u001b6REU\foRqˬ\b\u0012\t\b.Yg\r@'I W\u0016AA\u001d3\u0000XiF` C\u001f\u0004jp\u0002N<ˮI֚\u0013_f+\u0007Iu9UN\u0000pl#muΚ6\tx]\u0000XE\u0000ω\u0004\u0011TK*\"'p[!x3\t\u001a\u0001\fZԓHE\u0001 :\"R\u0000d\u000b\u0002}`S\u0002A\u0000xS蛈\u0012Mʟ$\u0006}.X\u0000\bx\u000eq\u0014H\bo\u001d#\u001e\u001c\u0004B}@ͱ\u0000\u0004^c4\u0005UU6B\u001c\u0011$\u0018fYc!h\u0004\"`xjЋμV\u000fi\bx\u000euH# \u0010mdMZ\u001c\u0003yՃ\u00127C}='QzJl#EXv'\u0013s\u0001-R55fFǽ\b\u0002;k\f\\\u0000D@>:\u0004A`Q\u0019\u001eB8p㟊gn!\u000e\u0013cVUe\u0013\u0013\u0010\u001f\u0017$\u0006 \u0011{X\u0004'M\u0004XF0@r\u0004\u0011\n$\u00041\u0010?-)\u0000K\u0016{\u0004`\b\u000e\u0002#\u0004alG\u0001؋B\u0012D>\u0018'E`5*\u0010\u0006HbM*\u0001\u0002`'H\u0000mR\u0007A\u0003}\u0005u~\u0016p\u001fA\bO\"X4\u0013!pG%@}\u001a\u0006H0'㟪\t\u0010<;\t\b Ak$pM#\u0016B\u0000D4\u00021\u0004\u0018XB='\u000b-(\u0004S\u000e\u000b\u0004\bM\u0000\u0011T9\u00014\u0004{\u0018B8-\u0017g\u0006$A\u0010.\u0014^?\u0015[Cuv\u000b3\u0003\u0001x\tBf\u0016G\u00103\u0000\"mo`\u0001Q\\\u00051\u0018n\u00188BSZ?\bjLt%\u0002|J*;)%\fP\b\u001aO@O\u001e\u0002\u0001\u0006*\u0000\"A\u0003y\u0001\u0018O\\z5\u000e葔BT\u000b\u0016\u0001p\u0015\u0015\u0015Ҵȇ\u0015?@H\"\u0000\u0006Pᓇ@0<[I ?\u0015$ @^B\u0014\u0018\u0003@4O{\u0006\u0006gϞ\rg\nj\u000f\u0001f[ΝQϸ9\u0017,%\u00040\u0000BZ\u0013\u0000V\u0000p\u0010J+%\u0016CSaYf>\t3ȑ?\f\u0000\"\nP\u0001~qG\f!'\u0012\u0000th\u0000fRɂ\b\fw1i%E\u0010\u0014<\u0010\tx\u0000gzX\n],\b!\u0007\"<\u0002f%?s:XHND\u0004\u001f7\u000ep\u0006\f\u0010EW\u0017_R!<\u0002m|5ﶤ'O%4\u0014\u001f\u0012\u0000\u0006z(q?\u0014\u001e\u0001\u00030{g\u0006\u001f,Qi%\u0000c\u0018\u0010\tTp\u0019^=s)\u000f)`#\u0011\u001e\u0001/@Qr3\u001a-F\u0011\"\u0001`\u0019s!<\u0010!<\u0002\u001f\u0019\fS\\>\u0014.\u0006\u001d\u0015&nY>S\u0016$\u001e\u0007g\u0011_>AR\u0018,\t>S˥iU\u0003\t\f\b}:`\u001cT&+Z\t\u0010\u0004\tSӈʸTEi\t@4>|ܪG\u001e\u0002\u0017L\u0004s\u0017?m'Tܲ\\zip#/CF\u00121rn)\u0016aUx\u0004苧La\u0002Ǫb\u0014\u000fS\u0011/^ZI(<\u0002f_|S\u001b*q4\t.m?>f\u0005Dq4\t\u0017,NU\u0015/'G@=9P$?\u0002M\u0016\u0005-Շh\u0012 D\\(UF\u0000\u0019hTid9)\u0004Ƞ<&\u0012h$U\u0004X$h\u0012| 4q\u0014M\\%%%\u0013\u001cɧ$(\u0011*..QR\\$\u0004Š\"\"`KЧ$(b@TTh&\u0004'H\"\u00042*&xqD\u0004AL)Ru4\t±D?Q2 &Aaaa\u00011\u001b\u0007\u0002h\u0012\u0014p\u0001\u0004\u0017',@$\u00183&\f\u0011(\u0018+QG ?/RP\u001c\u0019\u00168c\u0005Z4\tF\u0011Q\u0002CW4\tF&c\u0010>1\u0001,bT\n\"J\u0010\u0018D>dA) \u000e\u0011J@5Zb\u0000\u0004KE`ȑt\n[%P\u00102<.Y\u0010E \u0016\u001b)Q4*AAP7\u0014Mܘ\u0010n*\u001b4j#\u00049\\5\u0012FF(77G0P\n\u0005b(\u0004ل \u001b0b1}&^\u0016\u0002\u001c`\u0014\u0010\u000b4\u0004Y!\u0017K$Ȣ&C4\tF\f99\u0010\u000b4\u0019W^\t\t\u0011\n!'\u00071\u0014A}B?|\u0014Aŀ\u0004}n\r\u001fN\u0011$\u0003B~Q\u001e<d\bzS}{D\u0018q;\u0019JUBЯ\u0000\u000e\u001bb\nbH\u000f%ׯ\u0001i?dP0\u001cb~XJ\u0000\"?R!\nAL\u0003b(i~@\u0006\u0018#h\fY\u0001\f\u0010\u0010\u0000\u0000B0pP\n\u0018A\u0016CvP*#ۗg@\u0001\u0006*ǻ\u0018a0o+9d\u0006\u0000@hAof*;\u0002a\u0010\u0015J\u001e\t&\u0004k\u0001[\\J(\"vb\u0010\"\t\nY\u001e+*ய\u0000.>J*)yLOwސ)RsN\u001f\u0015¿^\u0005Q\u0006\u0000k] !_]\\\\~\u0010b\u0019Iwݽ;??@_\"keM2\u0019UJr\u0004\u001a\u0011X@\u0000\u00128Zm?==;\u0010./|%']I\"d\b0\u000f\f%\n&\u00041\u0000\r\u00159\u00108ʅ\u0004\u0001x\b\u0001BF&R\u0000(7o#\u0004룼JK\u0010)@b.`hW\u0000T0Q`\u0017>ƕX\u0011,\u0006,?\fA8\b\u001f\n!&\u0000\u0000\u0010I\u0000\u001aX\r`U\b`pb\u0011޼\u001b\u0012\u001f\u0005\u0004F\u0002,\u0010e\tVVkcC\"\\\\*\u0000B\u0004K\u0004j\u0000\u0012\u0018v~\u0017c\u0010ȶ\u0017Aޟx\u0012[\n1Xk\u001bf\u0006#̀|\t 1+N\\Ԕ\u0002\u0004?\u0012`\u0013)vNbçE/@)<0\u0018@D5Gb\t:CK4pIP\bB9v\u0014R\u0012H\u00036 \u0004\u001a`CKnm&\"03\u0002\\$\u0001I\\s`c\n\u0004\u001e\u0000\"kG\u0000a6\bqHj|IE\t~\u00045\u0016dCU\u0004\u001e\u001cD\u0004p\"\u0011\u001eE;G\u0012Gu\"\u0013@\u0007\u0019\bv\u001fx@\u0010$,H\t\u001f\u00138\u0017)^֭=LE>\u0004r+$PC\\\u00020SD4~ݵ\b'\bpu%t\u0019\u0007Q\u001cA\u00108\rvd\u0002e#\u001bfωR(\n4J\u0002`\u0013\u0011 \rB\u0010\u001aHI`\"\t\u0012kԃ\u0000\u001c\u0007\u0002x\u0015S\"x\u001e\u0016q\u0012v}\u0006P}E\u0012\u001b\u0001\u000erF\u0003'BtZO,\u0005E_e\u0016t\u000bb\u00135e\u001akr\tF\u0005\u001f#?F'S\u0005R\n.\"F\u001aS\r\u0002AZ+%\u0005y\u0013@\u001dh\u0017i\t\\ڈp\u000esQ\u000056\u000eu\u0000lB{dL]\u0011{IPb5\u0010ɗ\u0014$\u0010]\\mdD}dD(ă{\b\u0011]\u001dt}.\b\u0000UG<L\u001b[\u0013\u0011\t\u0002\u0016%6zk\u0019\u0010|\u0014=Q_Mxe\u0016\bi]\u0014a@E/NF\u001dw=~e%\u001a\u001cH\u0004b\u0011n\u001e1\u001dB\u001e\u0004E\u0000!Iߨ7\u0005PC?l\u00121615ix\u001b\u0001\u0001K\tfT\u0006\u0002A@ \u0017?&\u001e %p\bo \u0007\u0000&_T#\u0013J?E\u0006\\ \u0002h\u0000j{´1|\u00189\u0005\u001c\u0000h@\u001f\u0011@'s4kmo8Xf\u001a`\u0011\u0004\u001f9iGxU\u0010x\u0000ߢ \u0002B\u0010.ٴ# \u0005@]\tp\u0012%ax:M\u00005\u0011@E\u0004=D}K0P&(\u0005Y\bSga\u001eO\u001b\u0007\u0000)p\u001a0\u0011\u000eӵ6\u001b\u000052!\u0005`4HH\u0010afaeHm$,׃.i+%\u00050\b{#\u0010^z=K\n\u0012z\u0004\u0016GU\u0000Q\u0004b\u001b\u0013\t0\u0001-\u0005KPj\nĘ(~\u001eZn=\\\u0002\u0012@hj\u0013\u0001\b1N\u0019JͰ\u00141\u0016Qի\u0010\u000fm\u0010\u0014 zo<AD\u0000Zd:K:GU/Gl\bUo+\u000f\u0006\u0013Tizr\u0012 \u001fUfvX\u001bs\u0015^qԤ%\u0004UWd\u0012(w+:I\u0017+1faf7\u0001\u0006\u0000%\r\nendstream\rendobj\r74 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r73 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 231 0 R/ShadingType 2>>\rendobj\r231 0 obj\r<</Bounds[0.16 0.53 0.82]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[232 0 R 233 0 R 234 0 R 235 0 R]>>\rendobj\r232 0 obj\r<</C0[0.0 0.470588 0.831373]/C1[0.0745098 0.501961 0.854902]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r233 0 obj\r<</C0[0.0745098 0.501961 0.854902]/C1[0.235294 0.568627 0.898039]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r234 0 obj\r<</C0[0.235294 0.568627 0.898039]/C1[0.333333 0.611765 0.92549]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r235 0 obj\r<</C0[0.333333 0.611765 0.92549]/C1[0.368627 0.627451 0.937255]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r72 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r39 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 236 0 R/ShadingType 2>>\rendobj\r40 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 237 0 R/ShadingType 2>>\rendobj\r41 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 238 0 R/ShadingType 2>>\rendobj\r42 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 239 0 R/ShadingType 2>>\rendobj\r43 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 240 0 R/ShadingType 2>>\rendobj\r44 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 241 0 R/ShadingType 2>>\rendobj\r45 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 242 0 R/ShadingType 2>>\rendobj\r46 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 243 0 R/ShadingType 2>>\rendobj\r47 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 0.0 0.0 0.0 1.0]/Domain[0.0 1.0]/Extend[true true]/Function 244 0 R/ShadingType 3>>\rendobj\r244 0 obj\r<</Bounds[0.58]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[245 0 R 246 0 R]>>\rendobj\r245 0 obj\r<</C0[0.94902 0.94902 0.952941]/C1[0.933333 0.933333 0.933333]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r246 0 obj\r<</C0[0.933333 0.933333 0.933333]/C1[0.901961 0.901961 0.901961]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r243 0 obj\r<</Bounds[0.07 0.36 0.52 0.64 0.82]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R]>>\rendobj\r247 0 obj\r<</C0[0.0 0.360784 0.631373]/C1[0.00392157 0.380392 0.666667]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r248 0 obj\r<</C0[0.00392157 0.380392 0.666667]/C1[0.145098 0.443137 0.721569]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r249 0 obj\r<</C0[0.145098 0.443137 0.721569]/C1[0.180392 0.462745 0.737255]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r250 0 obj\r<</C0[0.180392 0.462745 0.737255]/C1[0.160784 0.45098 0.729412]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r251 0 obj\r<</C0[0.160784 0.45098 0.729412]/C1[0.0862745 0.419608 0.709804]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r252 0 obj\r<</C0[0.0862745 0.419608 0.709804]/C1[0.0 0.360784 0.631373]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r242 0 obj\r<</Bounds[0.1 0.29 0.51 0.74 0.88]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R]>>\rendobj\r253 0 obj\r<</C0[0.372549 0.670588 0.87451]/C1[0.372549 0.670588 0.87451]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r254 0 obj\r<</C0[0.372549 0.670588 0.87451]/C1[0.352941 0.658824 0.866667]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r255 0 obj\r<</C0[0.352941 0.658824 0.866667]/C1[0.301961 0.627451 0.847059]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r256 0 obj\r<</C0[0.301961 0.627451 0.847059]/C1[0.231373 0.564706 0.807843]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r257 0 obj\r<</C0[0.231373 0.564706 0.807843]/C1[0.188235 0.521569 0.780392]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r258 0 obj\r<</C0[0.188235 0.521569 0.780392]/C1[0.188235 0.521569 0.780392]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r241 0 obj\r<</Bounds[0.9]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[259 0 R 253 0 R]>>\rendobj\r259 0 obj\r<</C0[0.188235 0.521569 0.780392]/C1[0.372549 0.670588 0.87451]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r240 0 obj\r<</Bounds[]/Domain[0.0 1.0]/Encode[0.0 1.0]/FunctionType 3/Functions[260 0 R]>>\rendobj\r260 0 obj\r<</C0[0.623529 0.490196 0.721569]/C1[0.423529 0.32549 0.639216]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r239 0 obj\r<</Bounds[0.15]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[261 0 R 262 0 R]>>\rendobj\r261 0 obj\r<</C0[0.8 0.8 0.796078]/C1[0.8 0.8 0.796078]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r262 0 obj\r<</C0[0.8 0.8 0.796078]/C1[0.439216 0.439216 0.443137]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r238 0 obj\r<</Bounds[0.82]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[263 0 R 264 0 R]>>\rendobj\r263 0 obj\r<</C0[0.180392 0.462745 0.737255]/C1[0.411765 0.611765 0.827451]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r264 0 obj\r<</C0[0.411765 0.611765 0.827451]/C1[0.411765 0.611765 0.827451]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r237 0 obj\r<</Bounds[0.21 0.39 0.56 0.73 0.89]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R]>>\rendobj\r265 0 obj\r<</C0[0.309804 0.403922 0.184314]/C1[0.309804 0.403922 0.184314]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r266 0 obj\r<</C0[0.309804 0.403922 0.184314]/C1[0.321569 0.419608 0.188235]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r267 0 obj\r<</C0[0.321569 0.419608 0.188235]/C1[0.360784 0.462745 0.196078]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r268 0 obj\r<</C0[0.360784 0.462745 0.196078]/C1[0.423529 0.541176 0.207843]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r269 0 obj\r<</C0[0.423529 0.541176 0.207843]/C1[0.509804 0.647059 0.223529]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r270 0 obj\r<</C0[0.509804 0.647059 0.223529]/C1[0.584314 0.733333 0.239216]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r236 0 obj\r<</Bounds[0.48]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[271 0 R 272 0 R]>>\rendobj\r271 0 obj\r<</C0[0.345098 0.388235 0.509804]/C1[0.211765 0.223529 0.329412]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r272 0 obj\r<</C0[0.211765 0.223529 0.329412]/C1[0.211765 0.223529 0.329412]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r24 0 obj\r<</Intent 273 0 R/Name(Shapes)/Type/OCG/Usage 274 0 R>>\rendobj\r25 0 obj\r<</Intent 275 0 R/Name(Text)/Type/OCG/Usage 276 0 R>>\rendobj\r275 0 obj\r[/View/Design]\rendobj\r276 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 25.2)/Subtype/Artwork>>>>\rendobj\r273 0 obj\r[/View/Design]\rendobj\r274 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 25.2)/Subtype/Artwork>>>>\rendobj\r36 0 obj\r<</Matrix[27.2993 15.7636 -15.7636 27.2993 529.096 239.612]/PatternType 2/Shading 277 0 R/Type/Pattern>>\rendobj\r37 0 obj\r<</Matrix[31.638 0.044175 -0.044175 31.638 528.517 255.949]/PatternType 2/Shading 278 0 R/Type/Pattern>>\rendobj\r38 0 obj\r<</Matrix[27.2993 15.7636 -15.7636 27.2993 529.096 247.559]/PatternType 2/Shading 277 0 R/Type/Pattern>>\rendobj\r277 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 279 0 R/ShadingType 2>>\rendobj\r279 0 obj\r<</Bounds[0.21 0.42 0.52 0.61 0.7 0.79 0.88 0.96]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R]>>\rendobj\r280 0 obj\r<</C0[0.584314 0.733333 0.239216]/C1[0.458824 0.584314 0.215686]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r281 0 obj\r<</C0[0.458824 0.584314 0.215686]/C1[0.352941 0.454902 0.192157]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r282 0 obj\r<</C0[0.352941 0.454902 0.192157]/C1[0.309804 0.403922 0.184314]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r283 0 obj\r<</C0[0.309804 0.403922 0.184314]/C1[0.317647 0.415686 0.184314]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r284 0 obj\r<</C0[0.317647 0.415686 0.184314]/C1[0.345098 0.447059 0.192157]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r285 0 obj\r<</C0[0.345098 0.447059 0.192157]/C1[0.392157 0.501961 0.2]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r286 0 obj\r<</C0[0.392157 0.501961 0.2]/C1[0.458824 0.580392 0.215686]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r287 0 obj\r<</C0[0.458824 0.580392 0.215686]/C1[0.541176 0.678431 0.231373]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r288 0 obj\r<</C0[0.541176 0.678431 0.231373]/C1[0.584314 0.733333 0.239216]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r278 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 289 0 R/ShadingType 2>>\rendobj\r289 0 obj\r<</Bounds[]/Domain[0.0 1.0]/Encode[0.0 1.0]/FunctionType 3/Functions[290 0 R]>>\rendobj\r290 0 obj\r<</C0[0.584314 0.733333 0.239216]/C1[0.584314 0.733333 0.239216]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r23 0 obj\r<</BaseFont/HIOFBZ+SegoeUI/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 291 0 R/LastChar 122/Subtype/TrueType/Type/Font/Widths[274 0 0 0 0 0 0 0 302 302 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 645 0 0 701 0 0 0 710 0 0 580 471 898 0 754 560 754 598 531 524 0 621 934 0 0 0 0 0 0 0 0 0 509 588 462 589 523 313 589 566 242 0 0 242 861 566 586 588 0 348 424 339 566 479 0 0 484 452]>>\rendobj\r291 0 obj\r<</Ascent 1298/CapHeight 700/Descent -411/Flags 32/FontBBox[-573 -411 1999 1298]/FontFamily(Segoe UI)/FontFile2 292 0 R/FontName/HIOFBZ+SegoeUI/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 80/Type/FontDescriptor/XHeight 500>>\rendobj\r292 0 obj\r<</Filter/FlateDecode/Length 26353/Length1 68026>>stream\r\nHyX\u0014W\u0012f^M\u000f5\u00022xb\f\u001a\u0013\u001aQYo9D\u0006Tp\u0006ED\u0013x%lY2~ɺƘdՈFǪ(\"\f(hD\u0011\u0015\u00197hX~[իW5 \u0000xB\u0001!a̸7\u000fX#7&fX^}\u001c\u0000\u0003L͑\u0002\u0005\u0002ɒ5bȵtN}?5=s)o/\u0001>\u0007\u001b3Rf<\u0000[׋\u0001_/~xFVN^fL7ZiNMQY\u000e\u0000X3<+%\u0012ϳ\u0016\u0001ϗd\u0019\u0014\u0003@3b\u001c\u001b:\u000e\u0010'-s,z\u0018-\u0017\u0001h@: &ɟK\b&TbRmy\u0004l|\u00157\u0010?N!\u000e<-t1\u0016=[U*\u0019\u001ac@\\A\u0000oss\u0011\u0000\u0016RA\u0011`\u0010'D@^^BoxJh5}B'\u001a4!\u001a/uܞfN|nvsa4{zMY7Bw\\wRw^\f(\r\t\f\n\u0011r8'JCxi4I\"M\u0016KbT*I\rCV\bK+C$9[^+!\u001f+G\u000623\u0004\u0018\u0014Ca!`62|f`R4)tV*he)N\u0016nCs\u000bꈔ\bSc~HcdHg;:\u0017}icܕf\u0003\u0018@\u0010Q9%1ёhv8-Ng[)Czz9gVޤIB菴JN\u00030!A8-\u001e^v3UՋ&34Ws&jO\u0013gU-t\fK8@]PIȺP\buH,\r\u0012^1L\n\u0003\ttK\u0019v>r0Q9:\u001bxC!ӰȰ5z0H\t{a2aqg\u001b3503L\fs%GB+r0j{I\\\u0014g\u0005>]=`og\u000f\f엚\u0013[2lrȜő\u00196;ΧJh\u0015G\u0015\bBO\u001bhy-BM\u0014ZN^nl#S\u0013ԻѪ#MX0\u001c\u001c\u000e\u000bƥS\u00155J\u0005ylfͱefffm&\f[*@JWV\ny&vF){3H5\u001b\u0000\u001e\u0017\u0000|QwlCMײ5\u0000eVWvX]\u0003\u000f˒y{+U+T-\u0000(ͩJ+Mrv~k[\u0015*6W1_F\u0014xM\u0001tٺY/#}~|u\u000fv51\u0007g~I%bm\u0017\u001e;ʸvS<'\u001d\t\\?o-r;;egtoO8߬K}{-2\u001d3-6\u001dƹV|\nn{O\u0001ko(~g]Q\r8;`;,\u0015X\u0000wa%|\u0002k௰\u0013\u0006\u000f\f>~\u0000ka#|\fv#l]\u0000O)li8\t{`:z\u0001g!\rN\u0019\u0000<\u0004\u0004?C\t\\\u000eu)\\Kp\u00192\u0016\u001e*\u00053a6dA&́B0C6X`.̃\u0003\u0000j \u000f\u0016Bx\u001f\u0016\u0007p\u0010@>,p\u001f~C8\u0014\u001a\u0019\u0012j\u0019Zm\u001c#p$8\u0002j\r\u0001Q\u0018q\f&聞8\u0016߅Ј==\t8\u0011'dSq\u001a&b\u0012&c\nN\u0017p\u0015`_L\u0019&LG/\f:ԣ\u000f;Pkp6c\u0000L9hF\u000bfc \u0006>\n=y\u0018\u0018\u0012|h\u0002;T\re4\u001d0\u0017\u0017`\u001e.E>~1\u001c\u0018\u001dq\tc\u0001~Kq\u0019|3vP\u0005ոc_?~Ov}\u000eo!\u001d:\u000e#`eGُ\u0018+f\tvb\u0019vcUq'vgv]fWUov]g7TTY)n2v;U2\u001bb.jX-\u001e_CV\u001eǬ=a\r){ƞF51;kf-\u0004\"51\"Ґ@Zr#Ƀ<ɋIGzvK~O\u0001\u0014HA\u0014L)B)$@\nu\u0015\u0012?q\u0015p2R\u0004uNԙPWFԝ=y\u0014E=\u0017E;M}/S\rPŨQ\u001a@1\u0014KqB\f\rA4P\u001ai8\u000ex\u001aMc(A\u0015℁\u001dB\tUBpW'\b}xD<*(\u001e\u0013\txJ<-\u0011ϊ\u0004O4`J\u00020|pf7sB.\u0012\u000f.ەn\u0017H\u0007H\b)^Jq\u0006\u000f\u0004\t\u0004ǀ@),@x\u0017`[uoRv\t;c\u0017ݰ;\u000b{c\u001f?\u000e8\b\u0007\u0010\u001cp88\nG\u0018\u001cp<N\u001aL)~Lww\u0006Y+fsq\u001e\u0005\u0010\u0017b\\R\\q\u0005U\u001aZ\\q\u0003nM\u0019V܆q\u0007]\u001b\u0016\r4\b\u001aIh44\u0004Hh2M4\fIܣYLf4~4\u0002ZHh1-\u001f=Yl^s<\u0019rZA+i\u00155z@\u001bi\u0013m-6&D:g\u0006idbhbX\u0013T;Nn{螺辺\u0007z\u001ez\u001eGz\u001ez\u001e\"\u0004=QOғ\u0014=UO\f=S{=Gyz^\u0017E.?z^Wz^z^7zެz43I0-LKʴ6O3ܼ0/M\u001bִ\u000ePWFݩ\u0007^ԛP_Gi\u001bFuܺ4\u00064X.eI\u0015@X\t`5̄5\u0016\u0006\b`3lͰ\u0015v\u0000;`'ݰ\u0007>\u000f\u0007 \u001cD\b\b\u001ccp\u001cNIHSp\u001a*A2P\u000598\u000f)p\u0001.B*\\ːj\u0015\nU\u001a\\p\u001dnM\u0005\u00016\u000f\u0001<0\u0011\u000f\u0011<84&\u0019<7yL\u000bx\u0011S\u0012^4\u001757&tL|tSymޘj7dm\u0003w!G{\u0000܇\u0001C\u0005\u001e\u0018\u000fO)<\u0002^+x\ro-\u001b|#\u0001'\f_G2P2QDY[Q^WS\u0001*rO\u0015P\u0005U!UX\u0005 \u0015BT\nS*B\u0015QEU1U\\P%\u001eUJVeTYUN\u001dT!UAUTTeOUQU1\u000b6>\u000fg|#\u0015\u001f\t>g\u001c_K|\rw\u001e\u000f;~?O\u000byl\b\u0001)\\\tT5U]%dQGQb\u0012uL\u001dW'IW%SQ\u0000'|T\nR!*NduFUy\n \n\u0010.*B))PQ*Fũ_\u0007$r\u000e9T8#rR9*O\u0015\"UTR5NS\r\u0007}Eѿ?54ujR-M\u0014ETR=O\rygS#rM\r)15\u0014KqԌ9%P\u000bjI5N%C2%m6rcn\u0013\ra6Fn̍w\t _m\u000b|\b_\u0011_Q_\u0019\u00013&\u0013Milس=oS\u0005{ѦKMWU{^7M{˦\filmX\u001bgx&\u0016me[ۻmk[vlg\u0003u96їc'IvbJm(v#}---,=\u000fRWH=/\r4\u0018\u0006y!Po\u0018;Wz2y#ذss\u001er^\u0001]q\u0001.ȅ0\u0007r\u0010\u0007s\br\u0018sjy1\\r1.%$\\r9.\u0015\"W\\r5cx4&TzIo#}Nd:YNs۹ur{܃sy{sOG@\u001e\u0013xw Oi<gp+ųy\u000eox>/żWj^5y#-v;y\u0017涼>\u0007 G!N#|Op\u0012d>)ʽ8MQΙw8}~\u000f\u0011?'_+~\u001d\u000f+ȍ=wN?\u0017\b\\\u0018\u0011;sWn\u0003y|<X\u0002$\u0002RP\nIa\t \t\u0010\t0\t\b)\"EOI<pcnM9\u0019ssNRRJKy \t2@\u0006\u0010\u0019&#dp]wy^\u0001\u0000@y\u001fxy\u0004w\b!\u0000\u0010 @pw\u0012!\u001eb8\u0004\rN)nZ/s\u0014i)\u0013u݅X\nQ)DX%։\u001aUԊ]b8 \u000e8nΈ₸5{\u0017\u0005zA^\u0017E{1^ۋ_\u0011c\u001864445-M[gMe[Ϻֳ6x;δl;&DdmMi6fLe\u0002M\u0017\u0013dn\t6!&Ԅp\u0013a\"M6=LibM/1qgxD'te\u0003ɆRI-l,Ȧl.[Ȗl-ȶl/;H?QN2@v\f]e7]\u0006\u0010\u0019*d9%P\"%Q2P*Q:eP&e\\Gi\u0001-ERZFٔCG)\nJh\u0005S\u0005UR\u0015UJZEi\ru6FMVF۩vNEi\u000f}\u000eA:D\b\u001dctNI:E]:CY:G\u0002]K\u001bz~K\u000f2}H\u001f\u000f1}BW*]O3H?_)=^+zMo-a`:\\`%\u0006qCVٰFܘpSn͹\u0005Vܚp[n\u0003qGN\u001c9p\u0010wnܝ9C99#9\u0007pO^ܛp\u001c~ܟy\u0000\u000fA<P\u001ey\u0004Q\u000bJ|-\u0011ߊu\u000e\u000fp\u0003~p\u000bn\u001d\t~\u000b܃\u0000\u001e#x\fO)<\u0002^+x\ro-A@:X\u0017ABz(E\u0001z\u0010\u0015j4h\u00116&\u0014asl-\u00156\u0016a{~\u0011\u0013\u0006`g\f.\u0018]\u001bv`\fP\fpHh1\u0013c\u0017>\u0018}\u001fx\u001c\u0003q\u0010\u000e!8\u0014p\u001c#q\u001418\u0016x\u0013q\u0012N)8\u0015t3q\u00169v8kuzg\u0003&b\u0012&c\nb\u001ac\u0006fb\u0016y8\u001f\u0017B\\q\t.e9f33`\u0012L)0\u0015t\u00013a\u0016̆9\u0000\u0004ɐ\u0002\u0006\u0001\u0005sa\u001ė\u0005\u0010\u0016bX\u0002Ka\u0019dC\u000eB\u001e,|(B(b(R(\u0015P\u000e\u0015P\tUP\r+a\u00155\u0016z\u0000\u001b\u00066f\u0002[a\u001blZ\u0001;a\u0017=\u0017~8\u0000\u0007\u0010\u001c#p18\u000e'$fef9&$b.r\u0002,\",\u0012,2\\XXո\u0012Wj\\k\u001b\u000b.uܺ;%\u0013W\u001fAt\"|\u0017}|WM\u000b|WWvp܎\rp;|לX\u0017Drg3v\u0005o\\;x'ݼ>\u0007\u0013Ň0\u001f|\t>ɧ4g=>x\fq<'n\r!6Ԇp\u001bA}O-\u000f\u0013M迾\u0005}I_\rOI<bU\"/ɋ\r4\u001bz\u001bdB$}nEo\u001fM}Kv9۝Zg~\u001f~~_W~uwWGn\u0013uQXWp9Wp%Wq5UfQ\u0014mqG$~\u0016w/➸/\u001enSc6$7\u001d\u000e\u0014cD<5&Ť4n2LR*D0\u0015\"TRѪQ=Uz>*NUT\u0015\u0006j\u001aj\u001aFj\u001aƨj\u001a&jjfj\u0004hM5yf7\u0005P%dRUJW\u0019*Sej\u0016jZjV9*W*_\u0015BUdlGo;\u0000F\"\u001bem\u000f\u001bc{X6ŦĔ2\nSiLYiVfY+x\u000er\u0007Cܡ0J։:I'\u0014tЙ:K|@/ԋbD/tѹ:O/@\u0017\"]Kt.+tЕWytU\u0016i{y#y7`!l\u0005*\u0002Z\u0011\u0006*vLRP\u001b\f\u0016va\u0019A\u000ei˾E) \u000bkY-,*\u000080\u000e/-\u00148q?zw~ޗ'H,r\u001c'\tr$'\u00129ENt9CΔl9GΕd/\u0017ȅrH~,\u00172D.'r,+*\u0003r\\%W5r\\'+zAnfE~*+VMn;NK{x\u0006YE_=~y@\u001ep\nNi8\u001dgLq\u000eyX*\u000f#<&\u0013<%O33\u000bp5\t\u0017G^dke\u001fY<'\u000bXKp).Op9\nT1+q\u00155\u0016a\u0005\r\u00117f܂b%nm\u001dwN܅q\u000f}\u001f\u000fA<\b\u001ecx\u001cOI<ekgMi<c\bմɴٚn\u0017y\u0015/c8>O\u0013$>)|*Ƨ\u0019|&g9|.K|/|\u0005Wyj먾\u001dƉx'$>`H6U|ȦѬX\fgc\u001fY+\"F]6H)0\u0016;&\u0004U\u000bBQDu<V*T\t'\u001412Dc墄-\u0017\n1,3\u0017\u0017\u0015ވ\u0011\u0001Wdf*+b'\u0011eUmUq\u0016GQq*Lu˼lrK\u0016g}j|\f?ǳ\u0005x\u0001/b\u0015^X_Wx\u0005k9\u0017\u001b\f .8oЉlA/.8g\u0010UT'\u001b\u0015Q#^\u0015y9d\u0001\u0012a-QhKE0-F\",X\u001aKg\u0019ڐo(0\f1nx\u0003\r\u001a8\u0018&~k-\u0007~?OA\fYӾv){Ad\\G_=\u0011\"LV~њ5R0h\u001c\u0010mES\u000ex&!ўrT9\":0r\\9&:\"5\u0011OǸr\u0013k*:)'Ӭ謜\u0014]MtUNgXsR%\u00129M<Z\u0005у=T+̮\\QTbO_(5U\u001495:k)\u0006(7/\u000bˣ|zVW7Z\u000brS6wbx\u0015vYr[2\u001d+!\u0006\u000b+-:4\u0001\t\u0007I\u000fPMhL}\u001f\n\r\u000eCpCeЍ`\u0017\u0016\u0001\u0013]{p\r}g\bA\u0011w4J]׾Ŀ\u001bR\r\u000f)z~>P\u0006\u00132B\u0006\u000f 4(C62<\u0010Wo\"=PB7!=\u0000;a;#\rrᥨQgI\tz:\u001c]\u000bpR\u001bQ\u001b\u0011\u0011u$M84qȀ߃vu\u0017\n6)=3\f|Z\"Z%\u0012B\foPw\u001a\u000fT\fn\nޢ}6\u0017q\u0007I?5\u001d@\u001f0\u00142b\n\u001a6ջ\u000f%T;3AT\tXAƟ\u000f$\u0004\u000evȨQ[#}\u00162;\u000b\u0016\u0014>[\u00035P\u00035P\u00035!{\u0004JBB\rmPNl;*nQ\f\n߼a:\u0018U0\u0017ҩ\u0002X\u001dyht_WQEN5^VҀQ\u001723RܻWR\u001e/ts>ӵK;=бCvm۴n\u0015DǛۚ5}Ic+J0\u0019)1Q\b\u001dŪnW49O5:Sfj̺9\u0016{\u0004O:+5*^\u0005LW\u0001HJdq[\u000erδ]>~4Omv8ͧl\u001eQ%\u001d\u000e\u001a\u0011GTR/k$wj%*wk\"t)PV[{x~\nz*;*\u001f\u0003Ʀ)*X\u0003`Bcf\"\u00156\u0004L\\x6HPu[\u000eU]L\u0012ğWt\n(ެݖĆA{^r\u0007!ٙ<@\u0002\b\u000b `$ u@g\u000b3\u0011FW@\u0004(&\nິV&\u0015\u0011L\u00065\u0015\u0007U@n8jAjL-\b{U\u001eh_/0x\u000er^2\b@d+?Gm?D\u0014|p%ʷ]ͣޙ%!/HvLty\u0014ұdhGM4TKj\"3j[\u0015[`^v>uh=\u001dXw9i5U[KIOc/\"]}pa\u0016;\u000eY5qPv(?\u0019v\u000b/P\\ն*Z\u001c\u001aW0Ek#~\u0018@޹nWU mȸG}\u001d\u000ei4^\u001fLz\u0016#<jRNxp\u000eh$oNTgi\u0014Qw2UcFGutڌ1q5A\u000eӳݮ\u0014[xbc8}l\u001c\t\u0010!Ft\u0001)\u0013PٰGi\u0015c*۪R\"\u0017\rB@PE$Hن:ƦA1\u0016PR/{ח4M[@<w]nd\u001bx</,\n7Fz{z\u001b(\u0018[\u0006\u001a\u0003;x녬u\u0001|yV+rmkrvxw61][7`\u0007OhyU\u0018\u0018d[yKA)ۃ\u001adѕuZ9:g9C#ijuMGF2$\u00194\u0018ɶ\n\u001eY|lŗ[4)ReS[\u0002!\u001a\u0003\u0010\u0006R|I.G3v\u001b46m3`\u0006H3=Io#f<*۳`z!kf>i\nnz}NO\fڝZ[,\u001e%) }\u001c \u0004Yfyp<emeZS\r\u0013\rfCS,z1\u0016\u0010wE\u0007k<Ȑ!\nJ:Q9\u000f\u001e{]m @´\u000f\u001b\u0018yLj؛<ex^PZ-e%+װX^X0^kmFi\u0015\u0007{=H\u0005\rT\u0003\u0013adb\u0005ƵQ{#|\u0018\u0011 sW`\u0006VLK_%R\u0015L\u0011@ܫgwm{郐CuU3ˎ>95J\u0006**~:{d_!B\u001e9h=K\u0013\u000ecy8;¡+>m0f\u001f꫌sk\u0007c\u000frf\u0015RNR\u0012Ŧ\u000b\u0001|8ׄuelXhe!\u0010=L\u00013\u001b2U8r\u0019Gиs2ʴlX\u0018݈jny[c@qL\u0001ca`\u0013:\u001aç\b$\f]a1\u0016n#C>um{eBgXQ7`q\u000eϠ&WU3C7\u0010&c-ph-ٲyƘrI,Ěh\b$I\u0012YBT[ׅmE3gkһwOSʁ;W)rٗ\\G1\thJVfTa,iI3HI\u0005㠋+m8g\u0001E\\x\u0011q?On\u001eax\u000fQ>3(|Ox7'!CrxX\u0015\u0016%\u001chHvn\\kQPg\u00146\u0003D\u0018üԼ׏@(.Sp\u0000\u0005\u001f#\u001f3X\u0006+O\u0010KB!T\b\u001b:ĵp$\nX<!ɺ$\u000e`H@\u001a9\u001b\u001309{$\u001dt\u001c\rq-)\u001e\u000bGd%k1u&3u\u0012\\JH#DB@\u0012zTp,\u0012Qw\u0018(>7\u001e\u0013,+Vf*\u0005XpdS\u0015\n]!3g;s\u0016+۰̎|mg\u000bi\u0005\\iry)'塘ZՐ$~RKo\u001c\u0012ʑ_rK|QMĚ|1ɏV&\u00017\u0014\u0016\u001eA\u001b\"(3P k\n`lr\t~s\"&\u000fEX\f\b:-(\t\u000f12B\u0019>\u0019\u001d5\fv\b@9u9,`s1W֏\u0010M$hcsoa?%hSʱ:\r#\u00022D\u001af&̢z\r6ARIF$U\n3\nQBdC\u0007l; 2&L\u00162YCط۔\u0012T@)4\u0002n\u0017ӱ\u000b\u0018?3&`Q5Zo\u001e\u001dWG\u000f1\u00173,\u0004iW%\u0007<^!\u0015\u001a\u0011b\u0006e|\u000e\u0004FW2\u00127@QPR\u0004\u0018u\\LdD\u0015_Pб\u0010U\u0018!hh\u0005\u0004RX,\u0004\bp.\u0017 D2ŎUP\u0004L҃!ytTgy[bu\u0004S}g߬o\u000e^\u0014\u00037\f2)%0D\u0019o\u0006)I{T&\"b<\u0011\u0016<^QB\t\u0004=\t\u0014}\u0012\"Hr\u000ezvʱ;~\u0010-a\u0016r63)hMu\fdDcs\u0017NfP15i&ȼ4#fi\u0002K$h&De)61;k@߄T̠|\fR\u001b1db\u001e\u0019L#:vqAEX\"j\u000f u|d\u0015>Ne+4n\u0015)?oJgdĻ0YLN3/r׊Or۞'p\u0017r7ҁ\u000f;g)+8EM9w)K\"/T}tNg(r\u0002t[Ӌ\u0013DH\u0013\u0012d贈/b_и@g9C\u0016i'\u0004\u0019\u001bW!u0Y8?\u001fT)#w\u0006\u001e4,\t刁\bKe\u0015x\u0002tYg#U]xRT%)D}\ris R\u000b\t\u0018Ka,ҁm4!\u001e \u0015\u000f\u0004Rr>?}\r~0W1{f3E,,񨑃PZ3\u001b=\u001fwG`_ڂ[\u001ef\u001dnsʐM]-S\u0006Ӵ4\u001e\u0018&Yu\u0013E6Tl\u000198,ZMcUGnʘF\b\u0001kQBi4ev\u00077q_}{HZʻzCAl,[0І,\u001c\u000bq!D%\u0019H f\u0011`] $\u0018\u001234\u001eZ\f\u00023@av2!\u0004\u0006\u0014(Q\u000fF`\u001aV?I}/\u001eUKKK~\u0004C#\u00151x\u000f)noV~{[+V47\u001bg\"\u0011\u0013.\u0019\"|u$'EBl\u000ekǶVd#uS\u000f\u001bǐ<9j\u000e\u001a\u0000gf,\u0004\n\\\u0002|r;_g8p\u0007D/%^KE,,\u0000`\u001fS\u0012,$V-xU\n\u001e屵\u001d7C\u0018SO7\u0004b$ѯTe\ft(TW!k0r%\u0017X\u0015zv\u0016\u000b\u0000 DMI?vn!uѕcҖ9C|DU4?s3FWw\u0007\u0018\u000b6\u000bƵu\fx\u0011Qnld4s/0\u000fD\u0013L.\u0001/Tba.\fס@+\fe*e2r\bqx⥻b\u0016\\ \\0\r\u0004\u0019\u0000Dڱ.Y\u0005\u0015aB-L@\t\"M\nVA*Z\"\u001cB/(ւ+VIg\u0000qZ@$P/\u0019b|\u001aj\u0013\u0005\u001c}M%[Z%j\u0006X@/\u0010\u00026P\u0011p%;?<6}\u0010\u001fpDq~,9]qϪ\u001bgǮ><5k\rN\u0015T\u0015f1h܈!}JFOyu*\u001f\u001c\u0019K^V&BD/flŦ@p\bϬ\u0004{,\u001367@%xX% \u001cOm9Nt\u0000\u0014`Č*/\f#\u0015\u0004\u001b#Ziɂ\u001bzV\u0014%x9=eW\u0015K\u000b>|9c\u0017J0y,_(Z'a\u0015|\u0015^C\u001e:ǁ\u0012a\u0013eT+d\u0018,;H$'qD1ܧ\u0002ҽ2*+,\f)@5Oݚ\u000fR\u000e8,!Z#F\u0017E\u001bX\u000fzZ\u0019=u3u\u0014Vknޕ\u0003-ç\nkkG~\u00183\fln\u000eC υ0\u0003d#B\u0016!;\u000eT\u0004\"\u0019x\u0010:xU&txv=\u00173v1\b\u0005:\u0000\u0001#\u000enF7H_\u0010NЕ\t](g\u0010u?0u\f'u\u0014#\u0006FПJh\u0001[\u001a6V\u0002!|\f\u0010\u0000=p6>BA)\u0000V\u0014~f|\u0002\"\u001dϼ\t%z.WC\u0005\u00197an^\u0019'ӗ5wd?Kzb'Tk ³۠Ju|\u0000\u001e/\fƬ>0.1QwQ5zT[M\u001d9ơ\u0002#;H7$%D|syB^KR+\bHE<-I\u001aR\u0014V\n4f|qc\u0006HHir4RRF]\"q3\u0001\u0005n-ZnW](![\u0013XQ$\u0011qD%\tXt8l?)\u0015ϸ\u001e\u0018\u0003O;[6;s-[\u000fo_\u0006r\u0010\u0016jL/]\u001fV<n&{\u000f_\u0012n4@9\u0006+zKR;b%)<#S2*Sra\u000blW\\e\u0018\u000eG}G}͖xIXr_`G+\u001b\u0011x>\b@qD\u0002OWQz9;pia\u00077O~u7v.ik_/J5O߾~>>vkv\u001f?5ۈY0\u0005@g~iNx\u0003QQXѱ\u0015j-I/I\u001e\u0017\u0012R\u0010V\u0015HD⣿)Dפ'tM\u0005m\u0014\"Rf`bBA=\u001a\u0017\f:w1r$j\u0018dX\u001ang?\u0010nK?<es# j\n]_\u001f:p)I,b4j\u001c8<+٠\u0010\f\u0006=KSIU\u0018\u0019Lvٙ{|B\u00024(@\u00024\\T\u001d,Jfb՛DkJ$If\u0002E6\f}\u0019*yy7ǧg\r\u001d;y{SNC]}u[\u001d_\u001cT&j\nrcr}P\u0018&~RH\u0003x\u0014dN\u000e<_cFK\u0010}N'ӄѱ\u0003fkfFJUӂ9@\u0001\u0001\u0016M2 $!S=<aopi\u0007^F M^O\u0004\u000f%\u0004uϺ_^\u0002/vyk#3[@ o藾#fs2?\tL\u000e\u0016\u0015me'\"\u0000P:^uɂ#$=E\u0002\fR3_\u0019Y\u0012),\u0012),mO\u0017֚M7yQ_ۋ\u0018\u0016hO\f2\u0010#1\u0018]dE#x\u0006\u000b7nz\u001d\u001dyB\u0018yUUێt\u0001\"\u0006S|bn\u001e8%\u000bic\u000bEp\nR\u0019)\bN։x\"\u0018?Z~K\u0012\u000e==\"h\u001a)n\u000f\u0010m\rPJ\f*%\u001a-}轔;`(Ӎ\u001e\u0015';I9Ln(V¥\t?\n?dq͞\u000fa\u0001?_W\bv.|c犕{ƤΏlkw<\u0001 @Mō\u000b^9\tʂvP\u0003\u0006U\u0001*\u000f˼S껙\u001b-*,*_]E],\u00196x郄]TGmf*\u0005u<:~\u000e`vK}=xz2fï0et\n3ڌ0W&j\u0001ܻݽM\u0002!dIy!\t1l0\u0010\t\u0019\u0010\u0004ˈ+\u0013C2΄Jvʤ\u0003\u0003T)1:L\u0007q\u001cRKJ-C-8>ɦw7<Ns{|E\u0001ןJ}jh5˟͟\u000f\u00053\u001fm\u0004r\u001ek\nPHp\u00023TQWW17WVrKeEаΊ\u0006쬢9)$Ry}Lg|X\bK_0\u001e\u0000}R42o\u0013TBXE)\u0002enB \u0013*Wɘi+\u001a\u001bE(D\u0013\u0005#_s\u0012~\t;s#!^\u0018!^\u0018\n0rG.QIė|,tUgrw\"\u0011d02C)B\u0016`QU2Y_\u000bቖ\u00047-\fC>5<V\u0004۸n[?ۺ1ӢI.kO\fȕ\u001f\u0019дC+\u0004Rxn><t玛c6/yy\u000bx5y\u001aew\u0004\u0007\u0001@e+s[\bDTHOʋSv\noom\u0007hDE3C\u0001U:*=Sb\u0013ˏ\u0015g3_\u0015ޫʲ239w\u0016 \n\u0013E#r9\nJ6=\u0018w\u001fBuwЎ[$&[H1)}fIįW_\u0003w隹~E9>aj_\fK^.y+vWd\\9/07t\u000esdu5;LT\u000e0p7B>\u0012Sty^ȑ`;Pر\u00198lawy\u0006F?N\u0005pcE\u0018l\u0013ޚ5>Wdǈf\n`b095I-\u001f;򙦷:\u0002\u001c;k1E%L\u0015{\b\u0015\u0013*'KDM\f3j̹Tin(,\u0014oo\u0004P\t7ψ\u0015\u0016N+4mSaUmI˪&f\u001dqF\"@`\u0013\u000b,i#I\u0007D<촬hiEUs}Z2Y'q@F#\u0014\tGkoμuͼ\u001bĺool0m>`|7-)\u001bSjʦpݤȸy\u00167|w(1dUژI#\u0012\t0\u0003\t7{D\n\u000f{]vk[fH\u0019}\u0017/kfUU%r\u0003Wı\u0000q,dP<\u001a\u000fi@n\"}B\u0017pDl\u001eI\u001f\u001e͚\u0018A\u000f||\u001a+\u0004\u001f߰\u0016S~XW\tgx$\b^WO|\u0015.\u0004\u001b\u000f=Ƴ6u\u000b\u001c^z;]\u001e\u0017<PyE\u0011FX<\u0000P#\r\u0003>gv\u001d\u0012\u0007#?-\u00006X\tlԙw\u000e)\u001e\u0011a-y\"]')Nt\u000f\u001e%\u0011'1uZ\u0019w\u0011\u0012G\u0002\f,.ٳ\u0013-\u0012\u0019\f\u000e!ER\n7\nfzƃBOh' a4Rtuk} ]\b&3\u001f\u0011\u0017\u0014\u00116mg\f.\u0003L)#\u0006A0۫ۛUml\u000e\u0010\t;_\"9\u0018\u001co}Y\u0018K08\u0012N\n:Qs\u0001%\u0004{Y\u001dOO\u0007DMƺt{ZArEϗ\u000fpXϹE׫\u0018v`ͣ\u0002-ldQX0==3\u0014'>\u0015Lpi2R954\u0002*'5j**,U,5f;\u001d%ǋ*GJ35t\u0015h\u0007U\u0006-\\\u0019e.F\u001e\u001aU#5q>K.\u001d~Yb𯺓ݜ\u001d<x~\nOixӛ_bK>wM;w\u0011\u0016\twH{is#7:\u00108^G\tO\u0007U9=\u000fQ\\7.\u001a58A\r;;\u0018*I=t\u0003\u0013>H'$\u0000\u000fY\u0005Y\u0006i!\u001eY}tgiPB\u000eh\u001f\r4h=/ҠCޥҠ\niR7\\:Ln=N{E\n{:h\u001eQXP\u001c8*\u0019\u001apF5\u0001djB\\\u000fnuV~H\u0015Ɯo\u0002^\u0018n\u0003~sN\u001eZO\tQ)`\u001d\"ƩR@/\u0017\u001f>1m\u00037ca2M\u0010ccՕ\u0002¾s!ovE\u0011U+Mm\u0000d=CO%z\u0019ϞFDp\u0016ɹE5cV'OöOQggF[u/$\f*դ\u001e;l_\u00004\u0013{:?O+s̚FIr2\u0014uy\u0000\u0006<0\u00040l\u0010i=d\u0003K6wX>[h9no!8-K^F\u000fEV0#7¾\tsC^7\u000eP:&\u001d&IQR>G)/j8\u000e1,\u001ca~ \u0006Jt\u0007v\u0001\u001cge'O<v6a/\u001a=)H/mB̔p\u0018>gc\u0006\for\u001a\u00044ϺV\u001a\u001b\u0018?s,9{C\u0007'`\u0017x˜i\u00137$EVp\u001eĨ\u0013h\u0004%\fǜEN#\u001f;hڄ\u0011}KIs\u0019<c\u001ba\u0007lQ]'GO/\u0003Zu߻\u0010\\B\u0011WBmfTĆ.\u000b%4H袔.dA\u0014\tA\u0004)nVζ.dAB*1L1\u0013\ndt\u0013H\u0016\\*atbm>s}Ĳ\u0007_{9;aty]]\n\u001e\ntA̱\u000bxb\u0010rlS|\b#kާ/x_.\u001fѸ6EZ߄^LEM}&Ý5X6\u0012Or_cH2ӊ=b\u001d7S!\u0007rB[.\u000fÕC?c>\n7̻\fs\u001b;)]\f.\u0007\u0004e1OrՃp1G}׎a?vzE>t&\u0006H\u0007˯M3E<{7X%%I\u0017Kߓ\rR\u0012te;rێ\u001d[c6`pp\rrW*Ks)og3\u0005a\u0017w䝳{\u0007F\u0019\u000f)Ʀ\u001eXC0F\u0003'\u0003]SC\u001aI6M;HUX\\ͷĒ\u0007\u0013(g/E\u0007L\u0004>24xDJ\u001a{]Qvyԯr\rUs v\rvv츛\u0013R>\u0002\u0017O/\u001cJ^jR\u000evy-lp\u001bs^EGӽ<Pts\u0005C\nb\u000e$式l%,F'\u001fs~#N\u001feZ\u001dl/H\u0016G`{?|q_\u0010Ooa36yx4\u0017%}Ǉz5ɘft8\u001f\u0017 8\u001c8\u000e/`q\u0018jA9>\rfxX#Apy56/d\u001fM&~\u0016KMd36\u0006]!Mк\"<2\u000erA\u0004}.\u001fkW\u000b![\u0017\u001f>\\N}5mV;<3<\t-[Iv9\u0011\u001bo:qK$'s|9 'Z)Ϸ \u001cǅxFr;/k\u001b\u0012\rb.ȩj\u001b/c3Q\u0013YD^CaKF['́NO\u001c\u0018IpNs@>\tFC\u001b2$8e\u001c\b\u001f2'H(8\tN\u001cv? ~\t>8\u0018U9\tFu3\u001a<hr (n]to\u0007O4<=\u0007EF½f\u0014\u00029s\u0000\u001c`,g9_e9_ף\u000b|\u001anxq'_\u001cr^Vr{I;7IݑU98\fN8~\fT#\u00023\u0003\f\u000f36>\u001dM\u0003\u001fl*%pQorBo\fj:\u0003<鱅\nl\u000b\f\u0003hsl\u0016\fhM\u001b~ZT炯D`^K:bc΁};\rY\u00018;\rM\u00164\u0000mY\u001c\n\u001c\u0000W^SO\u001bs{ɚ78̔\u001dtFM\u001d\u000e;ӆ\u0014\u001e&߃\u0019UF!ƞ\u0011n+{%\u0018RmǾ|y\"_`<÷ \u0007\u0016`wOI?fz{\u0017p(ޚ\u000eoJUu?pQ{\u0019\u0007\u0006\u000fγ91i#?4w,ZNoPm>X*\f\u0007QẄY^RWJyЂ\u001c2@\u001d<g{\\Eξ\u001e\u0015U\u0013>=)j#\u001aq҄Wl\u00178?Qkl{>\u0013n\u000br0=Kf\u001c/=N׿힖9fj[kV\u0012ku+\u0005H\u001f<p9LERwo5%x^c?|E5^\u0014ݩ{,*>\u0017@'آ\u001dS[~#W#6/\u001bu\bPwGH>ijU3W\u0002<`|bsJ\u000b\u0001笔@bg *Vo0oxk4Ya˫=nO#vه%(oE{\u0007U\u0007\u0004@\u000e&9%dj\u001f9)5a\u0016o_f\u001a'\u00146\r3oLoFdiQVasR\u0004XO{2j-}˜5|V\u0015f{o𵷑\u0001\u000f3}@ܸ|fEʤ:M\fUl\u001fV\u0010\u0013.hpv3E{AN|b\"\u001c涀6TeaI$D\u0005Wx\u00144q?ȒN2\u0010iO\u001f=祥hR6\u0007%ݥ1rz_찅Z5\u0010YFLiXW\u0004\u001d\"Ug˂\u0013bp`eh\u001e6\"B|\u0012ߩ*\u000fs7\u0006\u001bKl)\noHU9xIwӥR\u0015kf<}\u001d}[F!9zrQ6\u000e\u001dgd,^Oe]c#\\\u0013\u0019ٟ\u000e^ַ\u0013l{@\t\u001aa\u0005لLa'g\b}o\u001aY\u0014HYf3caAvtxy\u001a;⸡1\\^\t|ϵ\u000ee\u0011Ou\\uRP([\u0015Z3yG]j4#!xH\u0015^;~Q^\u0003y5<\u000b:\u0014^|HG8\u0018`\u0001\u0004\n?uW+c\u000ez^}ֱq\u000b\u0006CsT\u0011#R\rth\u001fr[W\u0012osXS\u001dW\u001a\rҕ/`\r\u0015I0$$\u0018WM1ۼm$\u0018a5+`b\u000eٞH'\u001c$\u0018\u000e9\u001a`1)؟y*wF\u0015\\@;N>˙/\u0014.\u000ewO-\u0002\u001b?x0$kX}'\\ͻ-[Ѹ֮\u0011\u001dQJ1EĩKRcg;\u0013o{<Mk#Pg\u0015RK>j\fӸB̚r+h 4\u0005x>\u001d4[\u0010{{\\O\u00196%눙kث4Mc\u0011h-qD+l8{\u000b\u0018c\tQ`\f\u001fGB)-\u0015iA>\u00041\u0011)P(\b\u000eƶ)20\u0002%\u0019J \u0004\u0004ji-h)NEj[`J\u0001>\u001e\u0002ޙssvϞ=^,[H\u0002Qâ3<\u0014Cl)\u000eQL*?}@!y3ҭ$4#6\u0006\fhi[d\u0014[&z\u0000\u000735P'V\r?M\u000e\u0001_\u00109atEi4*\u0017`C(Þ_4Ҧ1\u001d\u0019\u0012b\u000eN\u001f\u001dqzd0\u0013mD\u0018\u001d\u0015EĖQ\u0000\r޽g\t\u0019\u0014e \u0003X˜ \bfbRh3uM޵/L-;~eW\u0002ڬ߁\u00066OzZѯF-e(v\u000eԗc\u0005;ҝ8j\u001fԳ^j,KMTiw%K͋5~9\u0013iA;R*ZWjy\f^}\u001eyc\u001b>\u000f7E\u0006JdG^k2񪉓a\u0019b\u001b\u001d\t1sl\u001a`u.\u0006S@;!H7<\u001eNc.I \u0015<\u0002\u000byO@o\u00185\u001f^XЋ=p:\u0011E_\u000bȼdokZӜ2:q̖߃\u0019i22:&F\u0007cƁ6>OH܍N,S\u00036qbK\u0012jvWYMMzʾ[O#C~'\u0005R\u0015z0ڊx[\f\u001d\baTm\u000e(Rl\u0000y猻ݶN.t\tA,m﮲vC\\+x\u000b\n'u!064ԍDX\u001eFf W|{\u000f\ta7 [(c\u0018_%\u0017̥rR2J\ro \\hS\"\u001b\u0014mw`\ndf*\"E_Rng-\u001bUC-3з^E>5/\u0003z\u001c:B׈}fmI\\ه`f\u000f|Əj>__fkh\u0003Em_]\u001f+؛p}\u0002\u0005!eN>%Ƅ6\u0007r5w\u0007?~'\u0015w]C>{:\u0019?y߮G/Ǉ>\tcj\bcM6'kL\u001azB\u001aɄ3M\u001c]Ycir]j螶&W\\\u000bؕ\u0013+̤?63h0uIE雲32\u0002\u0000\u001d\u0011by\u001c>wm\u00059Q\u001aCo9Is\u0003!\u001f\u0000C\u0002\u0014^\u0007s\nüe]29oeVWeM\u0016etj_Y\u000f2q9j?\u0000;Чi\u000ex\fsS\u0006ʳ#S]8;t/O}:0T%Zsy|\u0012O/\u0011x˴5H>=g|Ϟu\r\"ρ-ͫ%yB2tS\u0007Zi\u001f\u001bFV=\"\u0019Դ\u0019Ix[KgJ[LmTgs\u001d\u0002מ$uS\f6M(\t4,\u0018xH\u0006EkxC\u001cw\f6v\u00133Ikhj}ϓ3cS\u000b\u0017WX\u0016\u0011kN\u0000%\b\u001d>,\u0005T8\u00126SZ\u001c0_\u0013x\u0013jk\u0011kcsd)\\7RoNlo\u001dJŦ\u0018=)ї\u001az%\u0003%\u0011LpBjYW-4_\u0004=aݨL&s\n6IZ(T\u001a){8'\u000fioWȩȟd-\u0010[o\\˟5ht%\u00171Q\u001eN/\u001aU\u001f_Vg`&\u0007=̔\u0002٤\u0012jR\u0019odg53eGs=eRm!\u00132I_I\u0004ɳJn\u001c#CO2ɪWQ\u0015\u0018L\u001f]jWhO⼪-\u000f^`HuLYӣΛ_\u001e\u0012_GϱS:Ne66s.ڜB_\u0007_\u0004\u000bf@M\u0000\u000fzP'/oWһ,oJc6\u0018hW\u0016\u0018etg8`Mؼ1{L8݉{eS\u001dW\u0006UEr2\\p\":c䈎q˴!˘FDѥ:lw\u001e%\u0017#G1ޮ\u00195td#&Ga\u001d%UsF\u001f1\u0016p;cSfAr\rzAmϓf|?_F6C'\u001aܞ䳉J\u0004\u000b80\u001c\u000f\u0018vpr|k\u001brW\u001cdX{/ȔY79֑3T`Dz)b\u001aH]a/o%\u0002~dѝ\r}k\"E\u000e|\u0010|x=^+K\f\ry\u0002\r\u0006vɝHt#9q-2i^\u0016~PwT8+Msy#<v\\io\u0015yR^&2 Ƨ\u0016\u0011jTٕ\u00137P?y{~\u0019[y_?\u000e\u0004*+˛o7z-v#z\u000fs̈묲\u000fJ['Ϙh\u0016z/w\tُi*͓Vi&U)|(ȗʗF3e)Ǡx\u0018\nqw*\u0007N\u0013\\\u0011&By\u001d}E`[0VI\u000b\u0006}3T:-@>(\u0003+@P\u000eFq.m.臜!`\nk@\u001a-\u001bU}mtI#O\u0014S\u001c}KYt%oCRcG~/\u001eӕ\u0005}{B)5J\u0019\u0013jxVU=VSL\u0018%\u0015&F!+\"$%ԻȄ)>HT\rcE)5-V\u0019Jff\u0019f\u0007_zk\u001f>瞳Y&uOZ\u0019>\u0018.ʐ^η\u001bA;\u001fpCɱ'\u0015Ħr·;h;vDvw׭mK{c\u0007awB~\u0001x)\u001cm5Ta835h_\u0007u}l^=ܵOs.^z{n>K#\u001eslc\u001e\u0015~eUOV\u00199ghV=\u001d±M/fgd\u0003Ys׾gJM;ѶG:['kg]oKѥb9ڱ\u001e:v-m;:~\u000fɒmO术<W\"OO\f˙\u001dut\nF'dZ\u0003v\u0013VV;NZZK}\u0004t^GHy8\f\n垮q=gt_Y\u0015RGJϖ&\u001d@\u00129VzPc\u0007\f\rx[+\u0019}A\u000b3\"-;qe11b:No\u0004<c\u0016\u000bq n\u0012dh]'J6\u0007_\u001f\u000bv֪\u001dk^ngM\u001dzكX>s\fЭuǴ\u0002[%V>rѶ)33\u0002d\u0012!\u00161.B?coj\u0018^zIGY%\u001bve32\fGvqi\u0006O]77\u0003]:}_௞La+Ǔ\n=CK{\u001f5ʟU\u001d[\u00117wGڏ7\"|eϢJ}~Jy׫J>WC<VD\u0007Uψ̺7]'s?8sxgguX%C[εy\"z?Vנ?\u001d\u0017 =i?\u001e4%\u001d=龼]u}?\u00160\tў|w?υdFvPAgjh\\BKa\u000f\u0015\u0007\u001f 8\b\u0018W\u000f\u000f}Ʌ\u001b>G߬}Nǧ7c٣\u001f\u0003EzN5r\u00062FNn&՝|f@Kk01p\"z\u0012\bXFc(I5A~iny(rI2:%Ki\u0016\u0013weZkd&ok$\u0005+)jd5YOd,\u0005v\u0011ml\u0011,2+\u0010d\u0012|\u0018\u0006ٰ\u000bb\u001d3f|ZfXGu@x~R^f=|sHr\u00175\u00050$\r)@\u001clUL:NK\u001aLY`X\u0012e\u0001$NS\u001cVJ\u0017_eP\u0001l(IvCl;@29\u001c䢹\u0011iFB&ÑKLT{\u0015zKR0Y$8TRIb\u0017(Ѥ,魥kǎ-\u0012z>hm5h\u0006S[eFc\\$\u00076:?`\u001b\u000eԭ,d?8\u0003!累\u0012$yޚ/]\u001dD}J\u000b#!\u0004)ui\u001cÿYNYy\u00182R\r!Kʭg~(Z<k&p(@SmGl%V\u001eA\rr$=؛Y2~\u0005ٗsk\"IV_K.1\u0005{\u0000~\u0001J`)\u0006wA|؋0+{x\u0018z tc@L \u0017^tN\u0015snh2,\u001b\u001ezGЮtdL*|}\u001d[\u0017sȫ7\u001dbB\u0017:P_P\b}:/\t\t͞2\u0015j%\u000fQ\u001ea\u0016\u0014s\u001eqE\rbqڥ\u0014\fL%֋,5vw/&v'b1\u0018*ifQ-%e\u0015O~T..\u0018\t?׫aK\u0017J9\u0017\u0013es:\u0019hX-)F>\u0011k\u001eeOJd\u001cZ#y7o\u0012;yYl:W\b\u0001w~[V!7Pc2\u0019EVB\u001e\u001aPW<I\u001a\t~\te\u001c.q]t@\u000boa5\u001eD1nj_\u001c#ic,aȡ7U$Ҡ\u001a9R9~g+\u001e,RJq\u0014},Ep,yX\u001cߓC\u000f\u000f)Ѻ]MC~\u0005G>'\u0000\u0013TR[\rQ~'O\u001f\u000f\u001c)\u0014<e\bٜyi[:pVZA-\u000e,yب\u0015\u001c|m\u0011O2ZkuT\u0001m&r13Rb/RhK>GN\u0017<}୊MhYy\"g4\n\u001bdz\u001crE|1.J\u0007;EQv`@Pfm2\fd)q\u0002C0\rfٖ\\-#\r\u001d!\u0004\u000b1\\Pjm^Ad6̇-0\r~\u000f'FՕp\u001c!\u0015@\rSx\u0003UK٨Z\u001aH[\t\u001da0<\u0005x0x\u001b$\u0018/\u001fC\b*`\u0004!2\u0001Se\u0017t'T#\u000b\ntEef\u0003\u00147\u0019$\u0003G`:n\f62\u0005\u001b\u00030\u001cܛf~\u0018:O\u001ax\u000f.F\u0014\u0013p\u0010>Iog\u001eP\b^eTQ\u0015Ȼ \u000b&\u0001I\u0018\u000e˚8?ޚÛ8GrHv0(\f$@\f{\u0001\u00058B[-\"]~\u0019ß\r\u0006\u0019*\u001cP]\u0018\u0007Q}L\u001dǿ^\u0011*\"^\"\u0015\u0007Jm\r\u001bӢ\u0011C\u0019{y\u0019\b7˴uŮo:Өql]i;\tCӬΡ[p5^\\Sn֭Z\"u>s\u0007%ɒso>;/y?;d2Ӳ\u0018Z\fI\u001aC\u001ft+:ۛ>\f\u0017▟}\"40#V\r\u000e[gb։\"k\u0018Y]<\u0015]\u001aϐ{\u0011,m\u0011<\"Tc\r/-ގ\"&9q(]`8\u0007\u0010G\u001fмJ~\u0018ΰa@|\rmh\u001b:\u0013\u0018s?6\f<{a-Ēe}\u001b1Dk\u000be\"`Pؼ\u001f^Z;1Hj<\f\u001bE_+\u00128%4?C{e\u001e#8Żz\u001c~i1\"Ü\u0005z\u0015yߖߦ]{\u000ex\\}˾vK(WR\u00059\u000e{\fw~-Osu0:oh\u000e\u0001c8>d`ι8I\u001f\u0017Sh\u0017fp:\u0010\u001f=q\u0001+\n|i8J\u001fǟ\u00044`o$I\u001bx\t}g_{Zk\u001f4E\u000e$O%bFGTV\b:oban%1yV\u0000ߙG>\u0011.߻\"ވ\u001ee+\u0010:^\\|S\u0015\bκ2ͮH]Bg6/1gH|Qt\b\u001e$\u0011\u0000\u000b|T\u0017g'C\u0005rzf5OZo๿yǧ/\"L=}랟(?bF\u0000̧}},}\u0005f'\u00161>5<uwmsZM%\u001c1/\u0018Xu?@\u0001JL~zib::\u0003e@K!a\u0017\u0011ܣ+Fo69K?\u0003c<\u0003ѷo\u001cW1\u0002am\u001c@;|̷y\u0014\"IG/}(֫|ϝ|#McIj`XP\u0017l\u0001\u001fE2P\u0017>\u000b6ݼ\\_d_?\rXW\u001f8\u0006\u00175Q5\u001f!sU_\rm`' |AAͲ\u001a9o!x6\u0010YZ4e\n9\u0012 Cp&\u0012Ng9әdt5!F4\u0010B\u001a]/ps\\XiCŐm\u0016p\u001fxF<4XM!G}:y\u001f\u001f1*0&\u001d&n=}nʫų\u0003\u00036a\u0014N\u001c\u0016\b\u0002\u00077\u00149\u0012^\u001e(},gj\u0007ﺅ0Ny\u0014\u0007h\u0016oA\\p?b0b;Ş\u0015ռd/jy̧}F%kKy'S\u0017c5܇A_];!ΐ+\u00114\u000f#>\u0005!\u0014mn瓭;۰27і\u001d\u0016\u0016Y~\r+?ôa\u0007\\xy\u00106γ&)eIp~Մe?Lb7\u0010|\u001d\rK{\u001aɷ-k7D78G\u0004}&5hw\\Ug\u0015ΐr2l&dЗth\u000b\u0011\u0002h\u0006*tFưL#\u0007H\u0019&d\u0002\"UnXG\u001e\"&ǼB;>,<K@5\u001d!k\u0018j2$^g|\u000ea<j\u001bђvW\"i:\u0002\thq\u0004|o\u0002~*g7in}q0Fo>}(<a99Wٶp'zeumfekf2Q~\u000b8NK\u0001=\u000e-E_4\u0011\bF</\u001fJ\"o\u0005560<\u0001\u0018; u`$}QO\u00035:wv \u000f2\u0003\u0018W\u0004$d\u0000g\u0000\u0012y&\bL|\u00121Hp*S(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP(\u0014\nBP%4`yG\b9#\u0016ix\nb\u00020E. G\u000b)u\u001f\u001a\u0018xԟquw~~\u001bwDuĘ\u0017\\`UW7hŸM}]k\u0011^b1\u000bA-\u0017UX\u0006ԡi\u000b5^RTQE*s\u001eB\rA\u00140\u0002k00KPd0V060e\u0019k\f\u0015hZ\u0010KY{+nP\t:i^;~}Ԓ\u0006bs1S5Գl햲\u001dQ:Te0VT>6\u000ei\u0005ӫ8j>?r.f9\"TĭcS4([if:9^o7\u0006R!9sAWʴ\\,fTj~N~\u001f%X6L\f=\u0006ez\\*[q&_6r\u00163^\u0018Jed{rlS!l+-Vb=bUdRs\u0016/[]<\\Q\u0017^N_\u0003\u0012g_l\u000e\\E\u001c_\u0011RL/f9;\rw,\u0013\u0013E\u0000'k1?^Cڃ/%ZtOITO)ўbz)\u000fHyS\u001bR/\u0015)ߓoR^oJyV?H[)OI򤔽R\\\u0013R*O<*eg\u0007;.6)J!\\)r|\\Ǥ,2_\u001c)cL;f^Ż|rRs&yb㦸\u001b7olX_OQSGQ]\u001b7v(-ן((33,s`a\u0005\u0006\u0015KX\u001epa\u0018I)\u0004\u0017ū-Mx\u0018\u0016>lB\u0013C\u000fݵeI}\u0010k\u001b|%ML\u001aM$~VۂդiݞՔ&mo;s9sɝɼY8z\u0014\u001a(z`$펂\ro!-fmW;$!\u0012!C&Օү암,\u001c'{1-&ո9G\u0010eS=՞њ4%\u0002j9hG\fm$\"$WN=D15\u001di\u001d4uk:\"So)sW\u001aOUY\"]*#О\u0002-5N\b\u0002^$@b3/ŗ\u0002ox\u000bM408~.$vq\tӿz\u0002={\u001cW!\u0012;fCu0&jBQ@s\u0019fegO\u001ehuǣ<DM}w~\u0001ۻ\u001b>\u0013\u001b6VFB\u001b#I\u0015ogc\u0002}rF\u0017a\u001bh1,\u0010_\u001a`0'#\"\u001aߝOAś\u0005[/mdy,<R\u000bKnvYEl˥\\[Î\u001b\u0017ha\u000bt~<݁k;LE%;\r\u0019%0\u0015\"YFl0qp\u0002ظD#\r\"@w)PD?D~\b\u0011Q\u000f)\u0016ŽY\u001b\u0014GbS,\u0018THV\u000e; L\u0014\r/\u000f;4C\u000bޔ&`\u0005!h$.b&҂ˈ\u0010zBd\u0010\u0011I64c%&&ն\r`\u0003;g\u0015-C\u0016flA}1b\u0015\u001bfÈ\b\u0016\f\u0013W*+-!WCHj*]\u0001\\JU:|l\u001d~\f/&ꓰjJ \u001ad\u0007ɀ$g86Ò\u0010\f\u0007\u0001Qn)R-b*-Q\"UA({TO#ؙYTNq\u0006}PUiZ\u0016ʴRDi5Yj\u0016MԈ\u0007;L}F.4n4pB,1iذv\u000fG\u0001\u001f@!L'\u0019tB@xe?\u0001\u0005o\u0011;IΩ\u0006(-6xߘ,\u001e0ɇ\u0003$lԿdc$%p<i˨eTwL-&5\u0000[.\u0004d8w>Mf5&sW\u000e?k]\u001502zҞ\u001cd\u0006>cdYk\u001b\u001d]i\u000f\u001bY=HQGc\u0019\u0010\u001a\u000e{\b\u001d}Q\u0014\u0016\u0014m\nl#\u001c4d3R\u0004\u001a\u001aq \u0012\"\"ȓ\u000f?\u000f\u001a_?{;~_U~_\u00172_\u0012?O(Ga>gx\u001f\u0013|!ͷs\u0017k\f\u0010J\u0014`\u0000\"\u000f][\r\nendstream\rendobj\r31 0 obj\r<</AIS false/BM/Normal/CA 0.350006/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.350006/op false>>\rendobj\r32 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 293 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r33 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 294 0 R/Type/ExtGState/ca 1.0/op false>>\rendobj\r34 0 obj\r<</AIS false/BM/Normal/CA 0.600006/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.600006/op false>>\rendobj\r35 0 obj\r<</AIS false/BM/Normal/CA 0.399994/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.399994/op false>>\rendobj\r294 0 obj\r<</G 295 0 R/S/Luminosity/Type/Mask>>\rendobj\r295 0 obj\r<</BBox[-32768.0 32767.0 32767.0 -32768.0]/Group 296 0 R/Length 102/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/Shading<</Sh0 297 0 R>>>>/Subtype/Form>>stream\r\nq\n0 g\n/GS0 gs\n27.2992687 15.7635775 -15.7635775 27.2992687 529.0956421 247.5589752 cm\nBX /Sh0 sh EX Q\n\r\nendstream\rendobj\r296 0 obj\r<</CS/DeviceGray/I false/K false/S/Transparency/Type/Group>>\rendobj\r297 0 obj\r<</AntiAlias false/ColorSpace/DeviceGray/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 298 0 R/ShadingType 2>>\rendobj\r298 0 obj\r<</Bounds[0.21 0.42 0.52 0.61 0.7 0.79 0.88 0.96]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R]>>\rendobj\r299 0 obj\r<</C0[1.0]/C1[0.86]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r300 0 obj\r<</C0[0.86]/C1[0.75]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r301 0 obj\r<</C0[0.75]/C1[0.7]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r302 0 obj\r<</C0[0.7]/C1[0.71]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r303 0 obj\r<</C0[0.71]/C1[0.74]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r304 0 obj\r<</C0[0.74]/C1[0.79]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r305 0 obj\r<</C0[0.79]/C1[0.86]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r306 0 obj\r<</C0[0.86]/C1[0.95]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r307 0 obj\r<</C0[0.95]/C1[1.0]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r293 0 obj\r<</G 308 0 R/S/Luminosity/Type/Mask>>\rendobj\r308 0 obj\r<</BBox[-32768.0 32767.0 32767.0 -32768.0]/Group 309 0 R/Length 102/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 30 0 R>>/Shading<</Sh0 297 0 R>>>>/Subtype/Form>>stream\r\nq\n0 g\n/GS0 gs\n27.2992668 15.7635784 -15.7635784 27.2992668 529.0956421 239.6118469 cm\nBX /Sh0 sh EX Q\n\r\nendstream\rendobj\r309 0 obj\r<</CS/DeviceGray/I false/K false/S/Transparency/Type/Group>>\rendobj\r29 0 obj\r[/Pattern]\rendobj\r8 0 obj\r<</LastModified(D:20210609080822-07'00')/Private 15 0 R>>\rendobj\r15 0 obj\r<</AIMetaData 16 0 R/AIPrivateData1 17 0 R/AIPrivateData2 18 0 R/AIPrivateData3 19 0 R/AIPrivateData4 20 0 R/AIPrivateData5 21 0 R/ContainerVersion 12/CreatorVersion 25/NumBlock 5/RoundtripStreamType 2/RoundtripVersion 24>>\rendobj\r16 0 obj\r<</Length 5946>>stream\r\n%!PS-Adobe-3.0 \r\n%%Creator: Adobe Illustrator(R) 24.0\r\n%%AI8_CreatorVersion: 25.2.3\r\n%%For: (Deborah Steinke \\(Adaquest Inc.\\)) ()\r\n%%Title: (websphere-family.ai)\r\n%%CreationDate: 6/9/2021 8:08 AM\r\n%%Canvassize: 16383\r\n%%BoundingBox: 122 -9 783 305\r\n%%HiResBoundingBox: 122.793347330042 -8.89148310624296 782.375390001484 304.342865516559\r\n%%DocumentProcessColors: Cyan Magenta Yellow Black\r\n%AI5_FileFormat 14.0\r\n%AI12_BuildNumber: 259\r\n%AI3_ColorUsage: Color\r\n%AI7_ImageSettings: 0\r\n%%RGBProcessColor: 0.456457018852234 0.813199818134308 0.920128524303436 (2018 Az Accent Light Blue)\r\n%%+ 0.920583546161652 0.920527696609497 0.920049607753754 (2018 Az Light Grey)\r\n%%+ 0.46007439494133 0.461062669754028 0.479712784290314 (2018 Az Medium Grey)\r\n%%+ 0.000136697562994 0.000626976019703 0.000423457007855 (2018 Az Prime Rich Black)\r\n%%+ 1 0.99999862909317 1 (2018 Az White)\r\n%%+ 0.129986360669136 0.445850402116776 0.726806282997131 (2018 Azure Blue)\r\n%%+ 0.236153483390808 0.236566811800003 0.255690574645996 (2018 Dark Grey)\r\n%%+ 0.000136697562994 0.000626976019703 0.000423457007855 (Black 2)\r\n%%+ 0.179979398846626 0.462396830320358 0.736700236797333 (Blue_R0 G120 B212)\r\n%%+ 0.140570238232613 0.228389471769333 0.369380712509155 (Dk Blue_R36 G58 B94)\r\n%%+ 0.314972579479218 0.316238760948181 0.315570443868637 (Dk Gray_R80 G80 B80)\r\n%%+ 0.091186039149761 0.294841974973679 0.142633497714996 (Dk Green_R5 G75 B22)\r\n%%+ 0.420979827642441 0.163003876805305 0.163110196590424 (Dk Orange_R107 G41 B41)\r\n%%+ 0.231519639492035 0.180468156933785 0.344297498464584 (Dk Purple_R59 G46 B88)\r\n%%+ 0.15625861287117 0.295185625553131 0.278966635465622 (Dk Teal_R39 G75 B71)\r\n%%+ 0.417058706283569 0.298082679510117 0.116508431732655 (Dk Yellow_R106 G75 B22)\r\n%%+ 0.184054657816887 0.183923989534378 0.183081939816475 (Ex Dk Gray_R47 G47 B47)\r\n%%+ 0.950031340122223 0.950571954250336 0.951177477836609 (Ex Lt Gray_R242 G242 B242)\r\n%%+ 0.825643837451935 0.825728356838226 0.825046956539154 (Gray_R210 G210 B210)\r\n%%+ 0.087854735553265 0.488841027021408 0.244210809469223 (Green_R16 G124 B16)\r\n%%+ 0.456457018852234 0.813199818134308 0.920128524303436 (Lt Blue_R80 G230 B255)\r\n%%+ 0.902908980846405 0.902606844902039 0.90034556388855 (Lt Gray_R230 G230 B230)\r\n%%+ 0.634132742881775 0.803362786769867 0.22698737680912 (Lt Green_R155 G240 B11)\r\n%%+ 0.96799248456955 0.571453034877777 0.302267283201218 (Lt Orange_R255 G147 B73)\r\n%%+ 0.750997543334961 0.62407773733139 0.795579552650452 (Lt Purple_R213 G157 B255)\r\n%%+ 0.383294492959976 0.77460241317749 0.746525645256043 (Lt Teal_R48 G229 B208)\r\n%%+ 0.985468208789826 0.931368708610535 0.098425082862377 (Lt Yellow_R254 G240 B0)\r\n%%+ 0.198228940367699 0.626832723617554 0.853943288326263 (MS Logo Blue 0-164-239)\r\n%%+ 0.452200442552567 0.453015387058258 0.453602612018585 (MS Logo Gray 115-115-115)\r\n%%+ 0.495243519544601 0.732984900474548 0.258101493120193 (MS Logo Green 127-186-0)\r\n%%+ 0.941280007362366 0.318401783704758 0.143657401204109 (MS Logo Orange 242-80-34)\r\n%%+ 0.992564618587494 0.721914350986481 0.075717739760876 (MS Logo Yellow 255-185-0)\r\n%%+ 0.452235966920853 0.453031748533249 0.453614801168442 (Mid Gray_R115 G115 B115)\r\n%%+ 0.839141070842743 0.246982112526894 0.150924161076546 (Orange_R216 G59 B1)\r\n%%+ 0.067681893706322 0.04779689386487 0.000422788783908 (Process Black CYMK)\r\n%%+ 0.498164772987366 0.384476751089096 0.667927801609039 (Purple_R134 G97 B197)\r\n%%+ 0.179979398846626 0.462396830320358 0.736700236797333 (R=0 G=120 B=212)\r\n%%+ 0.117666229605675 0.204310461878777 0.395317435264587 (R=0 G=48 B=103)\r\n%%+ 0 0.359070867300034 0.632889628410339 (R=0 G=91 B=161)\r\n%%+ 0.544235765933991 0.714890062808991 0.883899092674255 (R=131 G=185 B=249)\r\n%%+ 0.075604505836964 0.278736382722855 0.484454840421677 (R=15 G=70 B=124)\r\n%%+ 0.64721405506134 0.870470345020294 0.953004837036133 (R=156 G=235 B=255)\r\n%%+ 0.642324209213257 0.229330748319626 0.52513062953949 (R=163 G=58 B=133)\r\n%%+ 0.777957618236542 0.915737092494965 0.970759093761444 (R=195 G=241 B=255)\r\n%%+ 0.800496399402618 0.799609839916229 0.797849893569946 (R=204 G=204 B=204)\r\n%%+ 0.798178553581238 0.45651313662529 0.687045991420746 (R=206 G=116 B=182)\r\n%%+ 0.860582053661346 0.57353013753891 0.750373005867004 (R=220 G=146 B=191)\r\n%%+ 0.833908259868622 0.503820598125458 0.711137890815735 (R=222 G=127 B=197)\r\n%%+ 0.104216925799847 0.540755808353424 0.701586782932282 (R=25 G=138 B=179)\r\n%%+ 0.198356091976166 0.745098829269409 0.868122339248657 (R=50 G=190 B=221)\r\n%%+ 0.210439950227737 0.090880148112774 0.215629070997238 (R=54 G=23 B=55)\r\n%%+ 0.288159668445587 0.608493685722351 0.835312724113464 (R=68 G=156 B=221)\r\n%%+ 0.456457018852234 0.813199818134308 0.920128524303436 (R=80 G=230 B=255)\r\n%%+ 0.349100857973099 0.155945926904678 0.370944648981094 (R=89 G=40 B=95)\r\n%%+ 0.410890519618988 0.61349219083786 0.828449487686157 (R=94 G=160 B=239)\r\n%%+ 0.000136697562994 0.000626976019703 0.000423457007855 (Rich Black_R0 G0 B0)\r\n%%+ 0.008390481583774 0.522869646549225 0.46064430475235 (Teal_R0 G133 B117)\r\n%%+ 1 0.99999862909317 1 (White_R255 G255 B255)\r\n%%+ 0.992564618587494 0.721914350986481 0.075717739760876 (Yellow_R255 G185 B0)\r\n%%+ 0 0 0 ([Registration])\r\n%AI3_Cropmarks: 122.793347330042 -8.89148310624296 782.375390001484 304.342865516559\r\n%AI3_TemplateBox: 306 -396.5 306 -396.5\r\n%AI3_TileBox: 92.5843686657627 -122.274308794842 812.584368665763 417.725691205158\r\n%AI3_DocumentPreview: None\r\n%AI5_ArtSize: 14400 14400\r\n%AI5_RulerUnits: 6\r\n%AI24_LargeCanvasScale: 1\r\n%AI9_ColorModel: 1\r\n%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0\r\n%AI5_TargetResolution: 800\r\n%AI5_NumLayers: 2\r\n%AI9_OpenToView: -8.5 431 1.39969500613871 1774 890 18 1 0 59 112 0 0 0 0 1 0 1 1 0 1\r\n%AI5_OpenViewLayers: 77\r\n%%PageOrigin:0.5 -793\r\n%AI7_GridSettings: 110 25 110 25 0 0 0.658823549747467 0.745098054409027 0.874509811401367 0.829411745071411 0.872549057006836 0.937254905700684\r\n%AI9_Flatten: 1\r\n%AI12_CMSettings: 00.MS\r\n%%EndComments\r\n\r\nendstream\rendobj\r17 0 obj\r<</Length 65536>>stream\r\n%AI24_ZStandard_Data(/\u0000X\u0004eD\t/#\u0006\u000bG3`C6\n\u0016\u001bL?\u0010e6h}̔\u0005:A/\u001e\u0004Aps\u001d\u0012\f\t\bJ)\u0014\n\u0006C\u001ex,A\rj@\u0016}c\u001d\u0001\u001crû\u0005\u001ao\\Q\u0017\f\b\u0016\u0001,\u0018..\u0018\u0010HPK(I\u001e<Hpx $\u0005caA\u0003ED*(l`A\u0004\"C\u0005\u0003\u0005\u0011\u0014\u001e &0\u0005\u001e\u001a(H@DQAȠ\u0002\t,H\u001ch\u0005\u0004\n\u0013\u001aDLD*\u001e*XPD$H<H \n\u0007\n &&. ɀB\u0005\n%\u0006\u000e\u0014\u0013\u001e  \u001c\u0016\u0006TD$\u001c (xphppCC\u0006\u0011*\u001c.`\u0001DŃG\"A\u0011pH,P\u0011!\u0001\u0005\b\u0005\u001aL@D, 񈠘@ q P8@@\u001ca\u001c$\u000eLx@qA q\"Bd\u0002\u0018LHdb\"BD\u0001I\u0004\t\t\r\u0007\u000bƄ\u0004$$Р\u0004\u0003\t\u0015 (\u001a B⁂\u0002\t\u0004@h\u0005\n\u0014\u0017$\u0012$\u001e\f\u0007\\00<`<0AAD\u0004\u0007\u0004DTp\u0001\u0002=.X06ؠ\u0002ÂQ\u0002C\t\u0007\u000b<H`X0&&$\u00182<0<0<<D\u0018\u0016\bC$\u0012!@\u0001\u0002\u0003\t\u0012\u000e\u0011\u0014\t\f\u0012\u0014\u0013\u0019\\Ѐ\u0004$ \u0001\t`Ȁ\u0003\u0004\t\u00186\u0002B\u0004\f\u0013L0\u0004\f\u000b\u0006\u0002\u00182xH \u0001\u0004\u0012<\u001e\f\u000bƃ0<\u001a\f\u0013$\u001e(\u001aF`4\u0018jP\u0000C\u0006\u0011\t\u0006H\u0005C\nD$&\u0018T!*D\u0010!bBbapx\u0010 \u0011 I\bHE\b\u000e\bE\u0006\u0015\f\u0014\u0013\u000f\u0014\u0011\r*P@\u0005\u0003\n\u0012\u000f\u0011\u0014*@h`Lx`\u0010 !B\u0011`d\u0006\u00190TLH@8Dx0\u0001P$\" \u0010\u0011\u0004\r4\u0005\u0001\u0003\b\u0005&(0`@tA\u0004\b\u0005E\b\fG'\b\u000e\u001aP`H(<PPD\u001e$4a\u0003\u0005\n\u0011\t\t\f\t\n\f\u000b\u0006\u0005(\u001c\"\"\u0012\u001c(*\u0018\"\u0012 \u001e*\"\"\f\u0019Pp \u0011a@@T\"\t\u000f\u0014\u000bF\u0004\"\u0010w'\t\u0018*$\u0010x0Ab!\u0005\f\u0012$\u001c(TȠ\"\u0001\u0003\u0006\"\u0010\u0012\u0010!\u0002\u0003\u0004\u0006\u0012(\"\u0013&8H`X0(<P\u0001\u0002\"\u0004\u0007\t\b\t0D(8`@dAI\u0002\u000e\u0014\u0013\u0018p\b\u0004\u0007\n\n\u0015`X[0\u001e`hP\"b\t\t\n\n$\u001e&D\u0006\u001aX0(THD\"\"&\u0016\t\u0012\u0006\u001aX0,8\u0010\u001d`PTT8@@ M(WtO[jY\u001f=R=l\t\u000f\u0014\u000f m.$7Ä\u0007\t\"\u0013\u001c(h\u0005#\u0002\u0007\u0005HD4.;S'<ӉSHt6NlOntA\u0001\u0013\u0017HD4\u0000V\u0000\u0005\u0006\u000e\r\u0011\u0015\u0010\u0015\u0015 &(D*Lp\u0000\u0001\u0002\u0002\u00110qu@\u0004!\u0005\t\u0014\u000e\r\u0010^<@A\"\u0001\u0014\u0011\n\u0015\u0010\u0016TP4 \\Db\u0002\u0001\u0003\u0017<X UNY~Sɞ5U^H0\u000fQѮ7\u0010\u000f\u0017Bd\n\u0007\b\r\"\"\u0017@0\t\u001a\u0014(@\u0010\u0004\u0003\u0011xx\u0010\u0001\u000e\u0012J(y]Jb\u0007\t9Hd?\u0012V\u000fZug=)\u0011~_5Mi]{3\u000e%}#P\u0012z\u0004\u000f%_Jb}LD\u001bFP\u0001#x(\u001eo+vvVh{%Ի_\u0011Z\u0011(]\u0004\u00158H*w)i\u000bϙeMYEk'kP_kVeE\u001dJX[K4z\ttiArUz\u001cJ^3%K\r%yͫ@I򬴚f;eݣRCE+靖\u0012,NLv7#Q\u0011j#P\u0012#x`RݻwJ+DgwU\u001e$\u0002\u0007\t~\u0017V[5]ĢiK{I}-Vj\u001c\b\u001e$m!nm$2RV\u0011<ȞFiz\"-*\u001b)HwtW\u001e\u0011(\te\u0004\u000fstzRCѝ^\u0011(ɩ#x\u001cA\u0005\u000ezb-*i!kyVѻfk᪖!\u0011YRҞ\r%\bDz:{n5x\np\u00101\u001dP9\u0007\tEPZIr\u001f$7;Hh\tM8*\u0012ԭ\u0001\u000eЀ%q(ifՉHjʐVHJ A;HIFΊue.ڳ{M\u0007\u0015@p\u0000\u0007I6v/ӧN\u0016qϪ^\u0004S\ts-yIG]:וO=5\u001evmt^ɒOez\u001eڝ4M\u0015\n-H\u0005T/d9DlMeۛWe9vd\u0003\u0007\u00072\u0016KRLvV\u000bG/P21a!\u0000\u000e\u00122ղ]\u001aLq\u0017\u0013Z_eZuȨf[]MRR)V=Hv«;^\u001d>}/mejy~Nuyi̤\u0017엻ti$y?HJ]2*$33FvwPrxnZI +/).\u0016bf\u0019iUY\u001bݍ֨hE¢=^IWi\u001aJ\u0004 /)(|UPrXvw?M%r=H\u000e\u000eoty{J_JR\u0007I*\u001a\u0010M3i\u001a]yt;XUf#+IAO0p\\\u001ekk%SMZi5\u000ft5+eiҡMM,%]<BJ=J;*\u0000\u0010\n\u000fi+<ZF³\u001f${\u0015@@h@Q\u0002u[\r%ixV<Qp}$\u0002\b\t\u0012\u000e\u0014\u0013N{&Ȏ\u0014S\u001dts^$\u000f\u0000D$rgͰd\u0013-~k(1kj/*\t郄\u0002\b\u001b8P<HCEj\u0012Zm(Q7ro*ރ\u0004\u0002\b\u0014p8Ht$Et~մj(1cY\u0015]JB\u0007\tU\u0000!R\u0001BqYn\u0015Q\u0019)\u0015\u0016U6wӕPw|\u001e-\u0015\u0011VJk3ZE(*؜X9`&E\u00124/\"+\u001e2X-mP\f\"<TD\"\u001e(($ʻՍrMD4|LD\u0011\u0015\u001e$D\u000e`ksC\u0016r\u0011\u000b߯=\u001bD(\u001e.pO_B\\̪Cgz\u0002TP\f&<4$\u0015\u0012\b\u0011\u001aI\u0006\u001aAv#{v(Qպk\u000e%S5\u001dC\u0003ʃ\n\u0007(LxX\u0010\u0010!\u0001L\u001eLp\u0000\b&A\u0007(\"\u0018DT@\u0004\n\n\u0004\r'\u0015\u000e\u0011\u0014\u0013\b\u0003\u0004IА\u0010\u0010 @\u0002\u0004\u0006\u000f\u0011\u0011\u000b\u0016\u0004@\u0003\u000b\u0004\tLLX<@Bb\u0002B\b\u000e\u0010Jr\t\bH\u0003\u0012\n\u0004\u0003$\u0012\u000e\u001b,\u0003\u0014(& &\u0016\n\u0014\"\u0011&((DT0h\u0005cwu%כ.mJ3\u0017MхNd7\u001c\n\n\u001e\b@\u0003\u000bƑ%BR\u0001\fL(\u0013$\u001e$HTP\u0003\f<P`\u0001\t\u00034\u0012\u00074qQ1,\u0003&\u000fD*\u001c\u001c\u0012\u0013\u000f\u000e<8\u0006\u0010\u000f\u0011\u000e\u0012XPD2Ѐ\u0002\u0006\u000b8H\u001e@T<\\@\u0003\u000b\u0003\u000e\u0012\u0007\u001cD \u0010P\u0001\u0007\t\r\u0007\u0010H\"\u0014xTXd@1A yb\u0002@\u0003\u000bMU\u0003\u0005\u0002 \u0004\u0006\u001aX0h^\u0003\u00158pP\u0001\u0002B$yb!B4B\u0004\t\t\u0005\u000b(\u0000@\u0003\u0001V:kѝ+W+{[F2=5=]˪y/\u001aU'4o彽AC\u0017Z\r\"\u0014\u000f\u0012#\u0016)lܽ\u0010W˿kHWO\u0013wSSSi̪,\u001b)5\u0011\u000bRq(Ii\u001dr(Y0\u001cH~TySvT{U55ˈ7OܻJMK[˳=/Quk;n_yJ\u0004\u001f\u0006<v3m<\u0014á&7ܠۃ\u001crAj!\u000bi@\u001a\u0010\u0005,\u0010\u0007 e`!i]aWzZ0\u001c\u001a:T3=<e\u001d\r%<-[!L\u0019*\u001e\u001d,R0\u00113Cu~n5jyuՎvR%\u001dl-m&Ih\u000e\u000fy<\u001a\u001e\u000fr\f!\bQrWanci4r:6\u001e[\u000b\u0006\u0004x@Lv5\u0012\f\u001dc!Pk\u0003+덪,[[Z:UY\u0016\f\u00073h?߷\u0016WH%\u0013n\u0011nR%N/ՆJfK*KLM%\u0016\f\bP\u001cv@\u0007^ \u0006i`@7~0\u0015llmw\t\b4\u000bi\rY]V֙%eѾ>kvk>`Тη`@g9eP6Z`8eB\n\u0004\u000b١(\r\bd}\u0015ոk_^|]r&\"UWkUg{C<ZQI9t)f\u0015\u001dbUuMDT۵5D+35ڳ\u001dq\u0012ڬRKM[R\\\r׺<ó쨧\"i+3Ui\u001ey\u000f7iuHR\u0013R\u001aҹ룩/u\u001bJ\u001e> eGu\u0016\u001eUk5qp,\u0018\u0010\u0014-?\u001c$\u00019Ǣ4\u001a\r\\L]\u0017\f\b\u0010>ֻ*IM6\\0neHт`\u001cѸ\u00058 :Ȭ_0<-\u0018.8QU$IdMltQVs\"Zޞ歄g\u001e횕jaݹ6喉^;wqk(ɓJowIDz]<3\"\":\u001aߥTz\u001e׾\u0016,j&[khشեѩ\u0015F{GV\u001c\"H5n\u0017H\u0001iܭLW\u000e)[~\u000bWJ*\u0014\u0003\u0002Ǣ4\u0014_ \u000f!rZ\u001e\tIK<Z&yjt[0喫ŋ\u0017Z\b,ʢ(K`86\u0013sH˃<Ж\u0005\u0017'e]6\u0001\u0005cÎQ=ߩO\u000bR\t}Y3ۡȨ2n)TuwYV^D[q񊆒*#bBm6ȃ\u0012'\u000e~iĪC\"U&n\rU3l4\u0014ecX\u001c\u0005#\u0017\\CqbJ9NBֱ\r8Ȳ9\u0015\u001dhj\u0001`\u001d,\u0010P\u0016eͥhq~q\u0005Cmv`(\u001db~>~׸-:vxT\u00195O4J[ciyVoh\u0010ҶrU\u001e\u001dYK>)%iښWhx[eQfYT![h֞W\u000eǣSnfncq,\u0005\u0003\u0002\u0007q\u000b\u0006\u0004\u000e[\u0016:qub\u000e{\u0018~~.wꬿ=aʢr~4\u001c\u0005\u0003\u0002\u001aء=nYnbK-@gO9/5ogtTë<½or.Uv^4t7q\u0005`H%\u0017%\u001dHHTW\u001b\u000e}xkmـ,5\u0016\f\\hR,\u000b\u0006n`8~x\u000bFcpw\u000f}4\u0016<dY̳e`\u0010B\u001aX\u0012lɇjt\u0019ZYxF\u0016-M\u001cyK1i,xv[7\\R]2]YkEG-{cPbDťK\u0012/o7PRt-{Q2c\u0015m\r%G{_;m\u001a|tJ732ʺmlC\u001b݀\u001c\u001e JZZR6<\u001a\u0007A\bb!\u00051!\u0007QEobŤ@\u001ah,JCIC\u0010@PT<<5\u0019U*\u0010(\u0016.d![P:p(\u000eA\u000fR\u001fX\u001c\u000f4*yOsj\u0001M(G9q\u0012sQK9QtQ)<\u0001JKC\u0015/va]UV+,Zscu\u001fn\u0001)WNy\u001c䌅ux\rld*2:\u001d!%)-5h!\u0007=\bBdlhݠ\u0006-%\u0011)j@ֱ]tq߂\u0018 \u00051 \u0010xCG=Ȅ\u0005\u0001\tHD\u0002$H<\u001cʂAAQ\u000e%:\u0013՜HWEgFiGyUSޒ\u001az3Xw\u001bJ殧RhxWhe[j<}.\r\u000bɇij\u001cZ0((\u0010\u001aX0,P 4\u00109K0qR5\t׮5*T!çKwh\r-\u0018\u000fh8\u001ap8\u001c;PRHBEI%\u001b4m2\u001e䠅\u0014jR\u0012ɨD|bbj#\u001d(X\u001e\u000bd,Î{,\u0018w+\u0003p,\u000eh8\u001a\u000eᥥ(D\u001dE\u0017E\u001bXUUMMMKKVRR[0\u0014kؚZ\u001aͬF\u0006G9j)\u001aUW墂a\u0017+nxNϷy\u0005c99\u000er#,4\u001a\u0011\u0011Q11qqQ\u0006\u0003\u001d\b\u0007RRR:R\u0016\fS\\9\u0014TRIEU\u001aJCQ\u0014EY\u0014P\u001e\nD(^R|\u0005\u0017E\u0017]v٥4(=neU\r]Ž]Z~vu>:\u001f\u001b^\u0010{\u0016{q!SnԠ\u001bհ5h4\u001a\r4h@\u001ahbWf)\u0016eVp\u001e78K\u0019u˩P֩-ܖ\u001ev\u0007_\u001e휼ery\u001dq,=y\u001bl?s\u0007\u001f\u001cmܴ7eFS2{\u0016&mwwlA;\u001b\\4\u001b\u0006r\u00145sU\u0012\u0018oǏ\u001f\u0017fս\u001a\"\u001fZ\u001f6Ǣ=\rj\u0006Fs?gK5u=rZ8t&+5(M\"Q%Ӫ3gHwgCJj$oMɏ\u001aڤլft6jI\u001b4\u000bǥ8ti\"\u00065u~\\nr\r\u00021Lu8yd[Z\u001a\u001c\u0016\bo;zx%<\u000eޒ$M^B^DRM^a\u0012=ItEVt,ѝz΋^\u001ezvh\bio2;Y-讖ʆLSEZGSu\u0015aT% \u0000XCUE.W\u001dE\"%\"i\u0016ok\u0016׋Y<!C&\u001b\u001bҎCE7kJԫg6g1wjIL{\u001eW$;Y%ڥӳ}Iy\r?Pnl8Ͻy\u0015\u000eUӥ.͡)\u001cPC8`T\b\u0000\u0015\r\u0016*<˶6jU&cڦ \u000e'ʹf:G/mIM͟h4Fzz5IKWhꨍ\u001fYRR\u001a2JfF}_M-=\u0006Uԩ3**\u000ezIgTE;4{.ft\u001cӜC\u001d3lGuvG1g\\QqGsv2]Yg9UyX:j\u001d\"j-\ri&Q\u001aԖy!\u000efksuҷi:xhn'k.V_k%Q5ͳ*ǘS.4j:MKm6\u0011}5lf\u000ej\"_qYUUZqS3ݔzǥ:V\u001cWS:3uڸ>k\u000b1uy\r85UuQt4?l\\;Wׅ5\\97\u001a\u001a5Ի>̱\u001e\u000e5?TSqm\\Z\u001a\r\u0015\u000e=K;zs;z\u001chufE2,׮M%\u001dҦҤٓzK&8n#/886l\u0015 $$mM$M?eE9JkNQ\"\u001b_Nf&% 't\u0012'\u0011Im\u0012\u001b,ĵ$ y\u0012mw5HkGk7)][XR\u0013Ҕҙk,S鳄wJ6~юN\u001e\u0019NX&sG7$Y\u0015!%\u0012\u0006]cUX'7JTzqp\u000e}ڻ\u000f<;N|\\leNA}`ySi9hJLԩ]0$p\u001bZkNWճ囥<\u0012u\u0006tHZ8hj7H`.l0\u0011\u000fj?hA#\u001d<\u0012I<Z;DS)Lߨ%h.Nn{Yd譍̣j}|֝Ts'Ouhl!\u0005cȃ1f\u0018j~6Ve/\u000fm̶W\\i}l7tiY\u000eݞ8d1\u001b^;昗:_Ï~sSܡX6뎦\f*\u000b%Y#r%Q7漶ݕi\u00128\u0006\u001duMzu=笯71OPX0\u001av\u001apƼ`D$歩ZKn\u0005\u0002\u0006$ĐP\u0004\u001e\u001c !'\u0017H(@BI\u0001\u0012Z06`@B\u000b\u0006F\n\u000bFЂq\u0001\u0006$`4\u0012b8`\t\u0011%I*s)q\u001dt/o\t͎jwP׮^\r*ՖJ睦z\u000e\u001f\u000b\u0006q5[YQs(ġ,\u0018WQ~(m\u0017;Nj\u0001\r\u0001\u0001**y\u0012rO\b1_6\u001c\u0003@J\u001dCi\u001e\u0006ıY\u000fK\u001dX0\u001a\u000etfV?}_45چ=o/2!\u001eF\u0006sRPBY2#R_\u001b:\u000e-\u0016\u001d,mZWz<0G9K.`<ll\u0017\u0005\u001b\u000b%\u0012b\n9Q)K!\tJgs^\u000bLj\u000bզZXe%ޞp~5VV\u001ehSUm)\u001aoƭ'|tT5QK:beCm\u0000p\\़\"v,Y.$\u00193\u0013\u0017ӌyD^לJב\u0019q\\zIz߻ƛ&ZԜ+;\u0015Du޳6}\u0012uE.eY\u0016\\nl\u001fu,\u0018\u0010\u001cDJ\u001c`@`\u001dP2Ҙu.(p^#۽sFu$FZZ+SsqMvivD<\u001eD\u001e3D=;v\fQ\fa^\u001a\tq<֍F!!d4\u001dLWgv$C<\th}*\fXsGw\u0011w>Dj@\u0010\"\u0012F\"wC=Ծդ/[:k0ߒgwft\u0011\u0010\u000eao?ё\u0017:t|HXw\bϡ79o#kk\u0011i?4۲\bZ#\u0011-!4j#\u00113!*#жrN\u0019Ukj !F ~Gv;<nPGw{{\u00167{{eoYUw}^~xxxwg~7fvv\u0017aun\u0019^~7_^\u001bkFc7T^_v33ۮk_{~\u001at}3:\u001dWGv^?c߃xx!\u001a1|^7̻\u0017'o\u001c>3ԣ~#*ף^o?j\"̬FF\u00146l3\u001bSvXif\u0019vnj5ga\f\r\r3h{[\u00037i}en]+++\u0011\u001d\u001ap\u001f7#y6O&>񚦊hhzc\u0016t{',2\t\u0010mx2N\u0015VQZ\u0017`l4E[\u0016i;_4\"\t\u0017|ދpK6Txs\rzz\"D4\".\"\"\"\u001e.ᡢ\u001cfX\r:z\u000e>\u001e\u0013\u0010UPp\n\u0011MS.TT\u0013.\u0012po{{yGP\u001dޞ\u001a~?ۼKߡ\u001e\u000f_w.5.msO>]mw\u0013^\u00044]M_'ާ{WoҎ~oP:ҽ^3ٜvLLKô}iz>[[mYZ\u0003\u001blԦ2uٵ̶5ٖm̻V]׮jmjo\u0014K}9Yve}+RJZrUVeS媩tQMR!z>[h\u0017hU5WeJB;YݯWvBĪ\u0005\\2+f6bUfcfN9L.k\u000bg]\\d\"خ2UQPUj^\u000bז\u0015٬W^++^-*]}\n늌2Y2EKZ:պZZ,\u0005,Z[ZҢ+jmQՖbfcffK7%\u0006\u001bݖ#i@FkjfjffTSS[隮鬭5լڮ5\u001a+KwRշW:U=uu>KIt_x\u001e{Cz]-B7C\u0006qKyʓ^?y\u0014oxü*'2)~um&&\u0013p<\"}4I~\u001f)\u0012Jt\r+^oGFI-{s_[ih촮Nnv'\u000ehGff]|u穣mّݑȊ3\\<<J\u001d<Z[[%%Լ<a!)~Iwwz\\~k\u000bI?ś$\u001d;[Ӛ$;[[\u001d\u001e-\u001c-ޭ-\u0010mhro\twp-Ɉd;)L*l@2\u00143\r:dh)T*\\\n\u000bi*\td\u0018cT4\u0011p\f\rזhpi\u00069Α.tT\\UқC;)ݡ\u0012G\u0006\u0011Aq\u0015\u0014\u00165fqiq1u\u0016Kj]RTRTR%%ŬQQT$D\\\u0014\u0015Ь5g#-\" -E$ʜ#DB9)it|GTdjgy\\$]&\u001d钞t:G79IGJJK%g2Iy%KRt*2əDr\u001a\u000e\u0013ɉfdCT7J;N%Y)4K\u0017gҔvy,2=]Rϗ콥K,\u0012u0\u0017}\u001aMYZ%M\u001cM%<%K|Iz5Kֱhl9tw\u000eU8sJC-Q*wPM]('UWC^Y*ohBڣ%Z\u000f,Q\u0002~lM5>B-ܚr>$g*zt\u0017sr27PSǊrٔy\\#z\u0019`uN\u0012JUϥSf3kcv5\u001d6ZF)Y\u001eMutn#]\u0011nfCDr.\u001a۵¹u\u001amznck{͹k\u001b^ZWw9{mm{z{Q\u0012j}T\u0011;I5ͥ\u000e.gT3jm5xtmኊK4XM9g<ӠƊ8\tW3έEsI<g>+OtΘ5htA?\tsJwus9fksnzT=pJݻ]č{߶p{nӜ~e\t\u0002\u0014-(E\u000f\"cdf\u0000\u0000\u0000\u0000c\u0011`\u00000\u0014\u0014EC\u0011T\u000f\u0014\u0005\\P<H9\u0010b\u0000C\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000@G\u0001.\u0019\u0006\u000b7}\u0005\"aO\u0004 'H4;\u0002X`+,\u0018>sK\u0006\u0002NDĪzb\u0016ۢ1bGj\u0015E.\u001c&z,`m\u001fRk\u001a\u0019vNI:z\u0014Ԛ7>1j2F\u0011\u000e@\u0012Fgw8\n$h6WC\u0011u ׉)lbe4X`зO'2I\u0012L-SﲉDt1`~ʒQ\u0005)/\th\tN>\u0001\u001fKZ\tv\u000f%#\u0003o<T-\u0006dT.XʬД}|1\u001c|R\"\u001c\b<@7wX\u001f%\u001e\u0019VD.`B\u0007&\u001fj\\p~U\u0005\f\u0004\"5n<\"$y,L\u0015\nJ73B y£fG}\u0016rP[\u000bXF)Erv&Y\u0003Wul\r\u0018q/H/e\u0019\u0002\u0018\u000f\u0011/\u0000(\u0011\u0018q;\u0018}q\u0019Gk=yf<w\u0013܊\u0016cNh\u0012\u0001\u0007x\u0007P\u0002bT\u0018\u0016QQx)]qu`RxP\u0010{j\u0011%#\u0018\u0016\u0003A5 V\u001fܶd4L\u001ex\u00139\u001aD\u001d \\D\u0006@+}2Cp\u0016s1'\n!u}=>\u000f,De\u0007Eh\fۛ\u0013tm!]ʮ)8e8C3p\u0005Gs}9\u0017WxVQ/R@]JڹYQnPb\u0004Z^z<@ո\b!H&\u001cvY^\u0011O\u0002JIQ\"\n0>\u000b~<c-:Qۄ\u00054>I\"r%dJcFE\u0015vA\u001c2}Pá\u001f=\bFdB{ᮁǹS\u0017Oě%P$U?h\u001b,YN\u000b\u000e\t*<u\u001c\u0015\fb9NTbI6\u000b\u000b\u0005\u0004[Vb\n\u0014\\\u001aQfN;@áOg\u0005(fKS\u001fAyesf\u0019h\u0002ݨL'\u001d/^\u00003,\u0013y&m4S&|90\u0011]5~\u0012\u0014?\\hm\u0002\\(\u0007\"7V\fYv)\u0017Jឯ\u0000~,J2޲?\u0006RŞ}\u0010;KuF\u000b w\u0016[?\u0010Ks\u000eceȵ2\u0010\u0004\u0002U\u0007\u000bZĴM\u0003&r\u0000Z܏\u0006jay΄ӄ{&KNYWLiOtEpOR^\u0017\tutxL,\u0017Ź^S\n\u0018\u0000I^\u001fMFd\u0002fkV#\u001fFM\u0012v\u00154!ٲ޸M\u0002tuW[r2E\f⮶\u001dUW8\u0011A%8\u0016\u0013Q\u0012?DS\n$ٔN=6\rt+q\u0012\u0016}Ӆ&zy\u0000%*\\-\u0019ƝwdrNULtx밖F{'UdȥU#ԏ+k\\Vo{QZ'^ٟuʣ6]t|0:\u001ei\n6#\u0012\u001e@tj7@\u00038C<j4\u0001nT5zx\u0005Dt\t(!\u0010\u001a#xH\u0012\u00195^i;Oҧ*v\tY\u001b~@\u0010WM%+0 N8E]5*\">h\u0017S\u0017azKX\u0005fڴ\u000e>\u0012ݚJ%ễ1b\u00110C(li3\u000f W\u0010(\u000f\rmN\u0014̟!\u0006oJ\u0012\u0016.F-JY=\u0004!ˍTo>\nkD_\u0012\u000f=n4Fk\u001dbn󭅑{U>;\u001cHL\u00156/\u0010:|\u001d\u0015Bz\u000e.)\u0019D\u0003J\u000ben<6kHЭdN\u001caC,A\u0018ҿ\u000fLS\u001b '\u0012=v\u0005\t>2OD%~еZa\u0014KZb\u000f\u001c_u-\u0018+h#F{T\u001b\u0005b\u0002X|:]\u0017\"\fJ׌\u0002{\u0010o0\u0018[\u0007Ş!W$V\u0007W.y\u0004FOض`\u000fEO2\u001536\tG*\u0013b\u00163I;^=~ѤJӒV~ay^oy.\u0002kgg\u0018DqU\u0015>īB\u0017\u0011igi\u001fFN\u0011D@M\u001f/H\fP\u0016W\u00007o\u0001uڬFw[zHU !g,o\u001a\u0000\u00111SKo\u0005'r\u0001@\"+E\u000ek(\u001dtRLO\u00190O0|\u000f\u00186}`Ϯ8<ɕ\u0000u+[*\u0001~Ӎ'&l/XlN*\foY\u000f\u000e6v=\u0010O3QV)\u001c'/S9f\n\u0010%i\u0007z\u001bvs{\u000e륍?4c\\\u0013\u0004rڄAQ\u0017\u0012B\u0004{kӦx\u0013qh~7\nô\u0016\u001c\u001f\nα)6Q\u0002\u0001L\u0001Qa\u0014=M%Ȧ\u0016]\u0010w: }5b\u0010\u0015`\u0003asN:H\u0016M\u001en%\u0000\u0013\u0003\u0002yW3)\u0002R;t~iknp\u0015\u0017Vj \u0007?g\u0012mŦ\u0017╵6\u0015Ad\rEt?\u001cp. \u0017DԒTqWˍ\u0011(\u0015C~\u0017 ؐl\\Evo\u000f-K\u0001\ruI\u0017\u000b:T,l\u000f\u0017@1tl)36--\u0004_X\u000fwjhm?\r `j\u0005p)\u0004ͱgKF͘\u001c\\n{l@HH:J\u0010%mH6bvhP;=Ѐ4,C$G5F|y;L\bQE-\u0007t+Q\u0007G\u001fEcQ\u001c\u001e=zï&\u0014tQ\u000bt=ـ\u0010\u000fFh\u0001nif\n\u001f#\u00138̤+\u00160\u000eU}ix\u001c\r\u0000\u0018!4LPz\u001cB1g\rг\u0015c\n.\u0015X\u001eEoO\u001b\u0017R]wb1\u001c4*;`h6<n\u0000mhBjzE\u0017\u0006\n1ּ\u001b \u0015q;\u001atY`\u001b91a\r\u0006\u0010\u0019\u0011c; ϼXhՈ0\\#U;ds\u0019(q%9\u001e,\u001c3\u0005Fڹm\u0002[\u000b)\u00122EHka\u0013\u000bT \u0003Pw~IA\u0000*\u0012\"0ZtD\u00186Uj\u0018\u0015GؘoԎ_Oc2-d\bn`4\u0017p\u00001sek\u0007\u000b-\u000e>\r`/0<Y\u0015\u0002/PU\u0013#-`|kt+򉉃S\u0019ٍ/oM{^񶨛t\u0018oG\u0002\u001766\u0001OƔ\u000bQ\u0016ӰQ(Ѧ\u001dwK\u00023\u0019o48\u001e鴈`\u001fg\u0010:Ak#K;l\u0017э'վ쾹0\u0005Bb\u0000QQ\u0001\u0006\u001c\n^@t\\\u0019KUKU{.\u0004G*P\u0017v4xWL9\u001bR#\r}\u0013k7b\u0012ј\r뚓̶\u001eRbV\u0015Z\u0002Cge}Tw\u0004:/s.#\u0000L%\u00054\u0013ᮻ3gX@W)A\u001fW1;\u0011AF\u0002H\b}q\t/b=n\u0018KhVb\u0007ap\u0014\u001fl&\u0004\u000b6(\u0010\"ΉѮ>\u0003\u000178VE4ـ\u0004\u000e,Ҧב \u0014i\u00140TM\u001eCX~]s!zhfnǿ\tKP\u0007uR\u0007\u00010\nEL\u001c\u00123dPeE4\u0019;P\u001e!K\u001eaž\\\"H/+|\")9_\u001c2\feVkZi\u001aV\rhAGc.L}\u0010g\u001f[F̛ne7}\u0015z5\"\u0019\u0012\u0012\u000b\u001e\u0013\u0011\\zD\u001bi5X%\u001d$(\u0016\u0017N#P^,H>3/\rtљV!($\ndsfeD]qL\u0011Ԯ\\B14}3߼u,Hʎ;\u001aC߻0d\u0004'B\u0019\u00183\u0004-fC\b?\u0007I²({`uP\u0007?)ȱ\u001eDi+̊x\b\u0019\u0007\u001eU'\u001a\u0012☚k5\u000b-\u0019\u0013`\u0010]n\u0000R\u0003VXZ \u0001vo\u0012\t\u0006ß\u001eUteӼ+\u0006AXxZi$phK$Ѓh^1nI\u0006E\u001d\u00030DPXj\u000b{gsnGB#M\u0013@\u000f \t\u001fR\u0003]d<}\u0001<9ʝ\u0005Te\u0017{G92Tj\u0003\u0014\u001c\u001e(q=&QL!=̳?f0\u0011\u0006Dg3*'f\u0014\u000e\u0017?j\t\u0001oե.<~XTDSBI,T4֧\u00027n\u0012\u000e\u0015\u001b\u0010'8\\b\u001c\u0000\t\u0019AcߘM1g\u000b`\u0016\u000e\u000f\u0014EfGAEt!\u001c%a#\u0003>j67w:uPړ\\=w<K'LM\n\u001a|\u0000!'?\u0010\u000b鞌\bOԈ\\ˠ$[${ \u0003\u001d#\u0004cK^&\u0011#ÃtcEi.RّvO\u001d*/\u001a}q\u001b\u0007D⛯\u0012\u001ec\u0002\fA҆NRf\u0012\u001f\u0001\u001d0fjG\u0006|5\u0004b\u0019x\u0004u3\u0006n)$8?n\u0005b%\u00180,\u00162%0bv\u0015^\u0016F\u0012`'\u001b61CƉ}A\u0002ɇ`6\u001cV*\u0014\u0013ˏї0'j3}_O7\f)k\u0002;LS7\u000er׬\u0005\u0011NBlCY\u0019i*W*\u0007Y>n\u0002o.\u0000\u001aH!9K\u001c\\\u0017\u0011$\u0012V\u0011,5g\nFF=!j?\u0011}<WZ})zW_D+X0\"\"O\u000bFX`\r\u001bfǚ&:v\u001b(1\u001c'֣>O҃*\u0017\u0013\u000bk :\u0005;m,>\u0004+}ܻ\u0017\u0012\u0017Wajh;ʘ9\u0014\u001f$`\u0015^b$\u0002ў;Mv,%yy\u000fL\u0016+<\u0010)xy'ݛ@\u001foUU%Oqt}{Eklt[P~L{LH\b\u0003oI\u001bficn; ud\u000f8Q*=F1{=\u0016\n2\u0004\\GWήuFt\u0004>\fަl\"nEEʀPLb0i4[\u0004\to\u001b&\u000bʲd\nJ7 ?5\u0012dS,v}3Q#/Q,EE\u001cEV<f;L4q9\u000f\u0017\"?q\u0003\u0012\u0012S)[҃J\u001b@b'WdkhU)g/#p=Z\u0017\u001e.q:\u0001;5Ib\nJ{a\u0018,%%E,o6@xq؍\"\u0006\u0019\u0006ت7_\u0018@?4an\u001dAx\"µ\u001fU\u0019\u0012\u001c\u0000218ʛE=0\u0005(J qO7k\u0010(A$INq\u0002C\b\u001bip.\"t\u0013/@\u0012x&*Rը\u00171샻3QD{\bl%n\u0004O)]vvR&թEB\u000fn=\u001f^PK$/\u0001w#;,|*9\u000e\u0010\u0019SM\u001bEBL;BN\u001a>q/}ϗ<\"ywl\\8Lx?\u0016\u0002g\tB`S\u0018Xlo]Y\u0000\u0010\u0011\u0018h0\u0001wB|oNX\u001ew:vI,\u0006_aZs)+%\u001c\u001a|\u00158u8\u0000BkP\"\u001eM _\u001eBnH\u001fg-^\u001b8b'0J-\u0018|8\u00030w\u001a\u0005`*C\u0015,-Hqڐ\u0015H\u0011\u0013%\u0012RZq\u0002uns\u0015UذcX\u0005'șk\\\r;'\u0004'#\u0010cF\u0001W\u0015v#h0\u0012\u0007QW=x\u0003\u000b[\u0011Kr$؁\u0011s\u0011-b\u0016*>6:L1\u0011t\u000fe)IW\u0012Eb/\u0013\u0000)kD&Qǆ[US֛\u0017Pq=Ag\u0002n\u0000R{y%<gG=qFd-\u001duhnHΖ\u000fQ\u0000TCY]&\n'ĵY7aS\rT<!s\u0005I\u001d\u0007APxy6)JOR\u000e}#˲l\u0011\u0011(\u0018RIщ̄aG[UF7=\u0019t-:a(\u001e\t\u0011r(GF%-<+\u001f\u001cP՚tHX\fxh;0\u001cd;\u0010\u0011\u0017wOT!yq\u000e\u00016q\u000e2Q\u0003Z4.JF\u001e(>\u0018s_\u001fK=֓+\u0010&YZWRZnf#w\u0017YI}'\u0015Yj\u0012v_AD\u000bi9LNQ\u0011yN>O\u000etn藡\u0019;R\u0007i:\u001c\u0003a.v\u0018dߣ\u0007)\u0004;;Wh\u0005X.<R~\u0012\u0015x\u0003!DS]T6Qg+jL\u000e\u0003ǂHfgm\u0018ɰ\fW.;6Wo \u001dLqL!*1m\u0017ugZG0-oŧ0n\u0003d<B=_ȲH EB\u0007l]\f</~\n\f\u0006{9Ҫrd\u0015q\u0014]ɇ\u0019y\u001f͵\u0018\u000f\u000bvrĔV7&k[SP\u001c\u001cVHrK1&v(AT;Idqh*hE$\u0002\u001cvX\u0003\"xFGw،\u0005WgNo\u0001\u0007>~u\u0003Kd\u0007-fZPV$l?C\u0006>4:/q7Bâ__\u0005C`*ѲŤ\u0010\u0000v^\u0003e4M^Y\u0014\u0019G\b/'\nx+\u0002BP(k\u0006UY\u0004\";4rv\\o\u0016\rIPNRǋіԻE( 64p\u001fӁ~kZbާd;(ATr\u001b=XYƥa\u0015敵5AYWPs\fzKCa49E\u0003\u0019a-(l\u0011R[q\"mX&!l,s<6B<I̖\u0012^$+(͢zq\u000eaG[\"q3_G٢\u0002y66ZvW[\f-]J½$\r\r\"\r\u0016\u0011O\u0004vXWLuӠp\u000eU]\u000bp\u0004q>\nO\u0012\u0001L\u0011D×iBa\u000b\u001a\u001d$Z ª\u0005C\u001b\u0016\u0001;\u000fg/\u001a\u0015=e\u000f_\u0016(\u000exuK4!hXC)C\"B\u0005OY\u001djɦ\u0018\u001b\u001bA_)b\u001bz\u00073\u000bڢm\u0013+0\ff\u0004$G$F0pF̸cFVo\u0000̉1fN ܗ\u0003|_Fj\u001cԣ'p\u0018It51\u0003(\"\u00041Ű\u0001{v`G\u0014Z\u000eQ\fP0b[Ai\u001f8(j\u0019\u0007@Ag)\u0003\u0015U2ӮG-\u000fY)\u001a3\u0012!ɧY]ڒc\u001fOTƱ\bGL\t{Q\u0017q|mm\u0001Cը#1w\u0002%\u001a9\u0000\u0001\u000e&Қ<)J#Nt$C^]\u001cz\u0001K\u0007?\u0006\u000f|\u0005Aubo9i\t]\u000e2yо>28jx*\u001fo,B]-t\fU{\u001f\u001bmon^\n2\u001b\u0000\fWeAP\u001b\u0006Q\u0018ڲP\tYk\u0002P=\u0016\u0001kԲcPZ\u000b;=\u0007\u0013B1,<J_̡\u001ak_\u00192!4\"A*II(4oP\u0015\u001d5݈\u000bb)\u0015oL=cR\u0006,\u000e\nŚ\u0017\u0011o?MS1ɦǭn[{\r4\u0010-Ǭ\u0004\rl\bi\f\u001bե\u0016\\1\u0013\u0017R&\u0013HڕVΈ\u0006}\u000e!\u000e.E\u001dZ\u0016j蜹\u001bν\u0003xA\u0000Xry\u0003Ǆ\u0013}M\u0014ct\u001e͟Jb!Zܮ򮕽\u0017ʾ`N\"u9\u000bٓ؁)pFşдiU\u0014È듡ހN\u000bey\u0012~˲Ћ\nD_\u0000\u0019\u001c!`S:\u000f>Khm<\u001e\u0002|5\\m\u0005\u0016\u0002gC\u000bւ\u00072V_\u001a\t\u001bjS\u0018\u0019Ff3 $+y9SoZr\u0004D5?ݠKxAc\f9\u0017Q9{y\tEyicw︽p\u000785PPõ;_3\u001f\u0013gT4\u000f+bPS\u0004h1aJ=vq[5`?:m\u001c4\u0007l\b\bX\u001aHUfȎn,Oᝅ)\u0018\u00145c\u0017\f%\u001aӒ-<f\u00046΂\u001a%\u001b~\u0001zр\u0004.w)kP$\u001e\u001d\u0000gpYg0Y6\rq\u0013*\u0018\nr(\u000fP\u00127F)o.\u0002N[gH\u0019-\u0016\u0018h<D@&\u0004\u0003隶-nWs0NYiwE<bE9N\u0012{WxyF]u\\̚u\u0019qxٻ\u0012\r\"Jx33nK1K\u0012d9!٤؋<Gйf\u0004\u0004\u0002\rW,n\u0015Ί#?c\u0000p\u0007f@ΪbW\u001f\u000f<F(wm8\u001bb7o\u0012I\u0011$\b\\'P`\u001c\u000bX0IХZ^\f\u0014>$4X2*Ao4Q̞@\u000bx[\u000f\u0004K\u0004\u0016bǥ:\bh$FCЫ_\u0011mZL\b\u0000\u001cx\u0002OK%\u0004Ƹ|\u0000\u000e\u001d\u0001\n\u0006(\u0015=rE\n8szL\u0014?\u0007\u001ep\u0011ǜ)(2c\r&FGXcYi,\u0019۸]jzMh獩JW{\nlaM;zv|<H!\u0005%qG\u0004u\u0001СpM4\u001e$C3b?\u001bK\u0000+g~p\f\u0016\u0016 9v\u0003\u001d\u0018hjȤE*]fr\u000f4M\u0007)HWI_zT EDX^*\\}gʩe\u0001ܥ>[Ċbr\u001f-<ZHSgĬf\r0\u0016V8T\r\u0010\r:\u0007v\u001dy%8럁h\u0016e?Y\r߅on\u00000\u0002Hwz0\u0000ޠ~DP\u0014T\n\u000f~}\u0014w\u0018\u001b\u0010:˦ kHٱ\u0016KV$ζ$3\u0018~nMao\u0016p넪\u00059\u0011*4~f'qڈjczMg#B\u001cZ`|Rf\u0016h\r\tH֭#iI`hr\u001c\u001eo!0q\u0013b0n~5I''+\u0007^\u001ewTOp/U\u0002%g O\u001e\"l}]ŭ\u000e\tVX\u0016KV1UI04ã;+'\t=\u0012^(\u000eK.HZ(\u000f\n[.\u0019+Va\nXp\t\tl\u0010TR$g<kq\u0007#=0I#M\b\u001b\u0001Vv'%L;zbhN\u0001toI\"q\u0000OI^GΕoPq0P\u0001 $\u0003]r@n\f\u0012V.\bFUۥ4S\b&\u0005bNq(<Gl&GH\u001f\u0013\u0017T\u000eBH!-qaGO\"F&?w6\u0015D\u000f\ti\u0016v\u0002Jgi2\u001fC\u001aPGΕ9 8{%S9[^\u0015Cmi\u0016\u0015<e\u0003qc,\u001f۱]XG-,\u0012\t\u001c¦H\\Y\u0013pP\t\f'U\nM)sjza4HD%PFe0\u0011^,wJ\u0001&/4֐\b\"n5D\\s;r\u00022Bv\u000f8!LA\u001d%E\f$\u0019!\u001e\u000bJ(\u000f牑8'@dVM苙fe֪\u001fȊ>LSRf<fPsN7\u001ax\u0002\u0010F\u001e b\u0013\u0007\u0004\u000f}\u0004(\u001f\u0006\r,,P\u00186\b~9\u001a\b8v\u0001{U\u0010؀`GY\fL_c0\r4T\u0012ᶃt\u000f>%w\u0017~(;U/I\\>dT_p\u0000جL-3t^\r!kҙx\f\u0004Z\r5x\u0000t>^1]\br \u0014ϟ\u0001x\u0013f@X\u0010\u0018|U08? Z\u0016\u0000@,8$k9v+\t6s\u0018]d\u0004 \u001bsWWvn=\u001dxTci:3.@*2\u0003Z\u0016\u0007=##K9+_\\\"DZ2}\u0001\u001eL;\u001bj[\u0003%\u001cprY&&;@evA'\u0010̶.\u0017Id\n7P]\u0016\t^ >b_/\n3\u001c#\u0005'+81b\\<w`\u001cx<#$\u000b@ޒ!dPꓼp<%\\;+>\bbh\u001a\b\u0001%:\u0016\u0016'C.ts\rӽ큜\u0000H\u00130|G6B8\"\nr!LvF\u001a\u0006/aSq\u000b\u0019\r\t\f\u00027kHoe\u0005\u0000r삛pij\rQ~\nps.\r\u0018Qkj+[k\b\u0011~@Y\u0014f\u00174M\u001dWC\u000f\u0014\u0014 㪤csWj@A\u0011\u001ciD\u0016\u0019k.Eva[oۆ;Q}\\J npz\u001eMB\u0001f/\u0000\u0007m8JU\u0018h\n˦fЭ;!~Z\u001aw/:8\u0001\u0019\\0GBW#i\t\u001b\tlv\u000ew{\u0004\u001bʙ;Y\"K\u000fJd>\u000b*J=\u0011\u0001\u0002.j5wc\u001b56erUh*Oxc\u0014L$Hp<}2i&mI\u0011]VT&H=\u001d|,\u0003~aN8֯z\u0014\u0017Ӕ&Fƕ\t\u001f\u001f'\u001bAS@Dd8g`6t{Ir.s\f*,^JsUM>P\"V/9U\u000b\u001c\u0005rX\\\u00070j3a?\rG\u0011ΛCeIgRhX6\u0007\n [铄\u0000\u000f]=nW:\u00067n#\u0001!\u000eQ`DA6\u000fsk]vY|\u000e\u0001(E\u000b\u00137{o\u00124X=\"MR\r\u001f\u0010'\u001f/&`uz1M\fFt\u0011\u0004\tH6\tIe,7\u0006\u0000B#\u000b\b\b\"\r+)Q5&m[闔\u000f\u00188uBrK皷\u0016\\\u0019XL%\u0006\u0019t-\u0014Y\u000bi78b/\u0001rIrnT*41QOivYhhZ:iCCbw<D>rO*\u0012/U\u0018==f׵(a\u0011Iܩn6\u000fS!@c=\t\fgA~c$0}0Aų;)\u0003u\u000eV\u0000sCp/㬆/KHX\u001b\u000e@l\b\u0001Bpػ\u0013;\u001d\u0015\u0014p\u001a\u0000\u00052%\ns\u0010l\u001cQ\u00181ߓc\u0010q4\\K\u00066\u000bZH/=3\u0014,~\u00158w=fǈ_\u000eY,\u001a%l\u001fg\u001cŁ^%\u0004b\t_@{Ե\u0006\u000fX\u001c-J\u0012\u0012&ɓ \u0006%\u001d\u0001L\u0003r;Si\n=\u001cL\u0014ɞ\u0006t8\u001c鼅\u001d\u000b.W=\rᕻh\t*\u0013]C!uHB\u0003\u0012\u001c\u0014/\f/B% t6,)\u0004f'l\u0011\u000e\u0019$-]ܘh'RY\rǜ_ޘo:s\u00109s\u0015WgNV\u00041G\u0000\u0014\u0003ޓ\u0017P\u000fg52f.\t\u0012YFC-v\u000f<gB\u000b\u0000\u001f'x4I{֗F'\u000b2Gk\u0013#L\nL>]4\u001b#\u001a'ZJ\u0001'e!\u0001X\u0015\u0005LuC\u0006B{(\bGȒ}0U:(\u0002T&6\b\u0012w\u0016/ԅ\u00164I\u0010\u0000\u0007\u0001QsuQ:WBju\fN7F՗\u0005p%A\u000e0L噶+[\u0019l3X'?\naɺ4xd-W?G\t\b0X<1\u0003WpqhRJ\u001c+G=}Z/G5v9\u0005ڐ0\u001a[LD\u0002\f\u0013f\u000bQ\u00153+V\u00073hl[3uXRgu},j\n\u0011<)hr'\"\u001e\u001d\u0012d5&uL$Ԯv|/85\u001bˮMh\u0016GO|eKuvn\u0006\u0012\b=wM\u001f~>~\u0014\u0019v3m~±N⛲4Ov:|\u001bK\u001aj\u0015\r\u0016◙EN\u0018\u0019@U6}lQk\u0016k\u000b\u000f|pV30x\u001b\u001dM&@\u001abܰY\\$a$P9\\\u001c,o\"t\u0004CÅJ:FaE\u0012=\u0019\"Yca݃?\f9\u0011\u0012\\\u0010C\u000fP\\Ө+\u0007\u0013+ly\u001cKFOF/_\u0000ŦAH\u0003\u0017݋\u0016Saj1:^IPs\u0000qDe\u0007dɐ\u0001H `Pħ\u0019\u001234dgQ\u001fXhUL\u000fO<CJ3Q2Ab\u0011gV\u0004)~ӊv\u001af\u0000\u0017DǬeS\u001057+E\u001fww\u0001jO}\u001b\u0005C\u0016\u001c\u001f5,N|nJSE\u0002\u0001fFř\u0010u3֟\u00037X'X<\u0005\u0000ҹx\u0014ʝ&qե&\u001b#\u0000U\u000b\u0013r׬\\s=\u0014ĠF\u0003\u0001İ࿴Z\u0013z_X\u0018dTڂ>\r\u0003r[O\u000f$\u000f+jܓ$a\u000b\u001b\u0016ʾ\u0010ii&\\.\u000f\u0014-Pjq(\u001f7(M\u0011l7ΕãSE\r(A|/\"n`82\\=x3\u0004k3\fy\u000bV_Aʶ;[p\u0011\u0007{\u0005uat\u0019\"0\u001d\u0010\u001dOKT%[RtUne>N\bNP1j#m\u000f(C9E3ZHShT`I!,\u0004Zowp@k[\u000f|L\u000b\u0016#;,aRߞj\u0001jnG/k&T\u0000ZzyCl}w|\u0019&T2~#\u000eu\u0000\nM'\u0016\u000b<K\u0016;RMw\u000e#&.IHyw\bh!el\u00053Y\u0000$\u0002+$\nG\u0006\u000b!l4MYP\u000bF\u000f(5\"_oIr^h|@\u000fʓ_\u0014\u0000@\u001d\u0000\u0011a84[k\u000f\u0005\u0005\u0002́I\r Jb\u0004,\u0001*n\u0005.\u00129i5\t\" \u0017Z\\\u0006ވ@C\u0019F\u0012i\fc\u0001lH:\u000erԤm\u0018\u0018\u0003\u001f\r\\C[\\\u00119$\u0019[\u0001Fi\tI\bVȍ3A\u000fx׃U0p(#\u0011QHmG\u001c\u0012Ȯ]\t[\fz[YAB\u0003\u0000A\u0004y8H\u000fAGN\u0006)\r\u0006Rիy3\u001a8u\u0015\u0007_Y;\u000fK(\u001f\u0017\u0015\"Y}\u000eD\u0017f\u001a|n\u0016cIQ \u0003J\u00026h\u000040+˹\f\\\u0010!\u0006\u0019OB#6.K2\u001e>!\f\\,$\nS\u0013U҃\u0001LZ\u001fY/ݪM\u0010#\u0016A'J\u000b\u0002M;7&\u001cXHz\u000e6ŏ\u0018V\u001aY9s3C\u0003KJ47c' _G\b\u000fSС<\u001aWqI9\tnsXve%\"\u000e\u000bv_?{q_4\u00021\n!vn7teJrjRwQ֮\r'u\"#G$\ti0d\u001aHQ@FjE v\u0000\u0017(\u001c\r3I(j^۞P\u0001\rBuA\u0011\u0012\u001fмYIR~H@ A`hrh\u0001\u001aOSe!XeG?\u0005Fi+=.?\u00145\u0018\")\u0001-ܝ;\u000bs\u001e\u0003<ns\u001eQibMPζLk^2\u0016\u0000Q\u0000\u000e\u0006W>EV\u0018X\u0010LA\u0016JYQs!S7Z9R/#>H8\u001d(V\t\u0001a%Qf_hmS\u0013Il皙_]yt֒X{IscPr7+\u001a|K\u0017Nw&8b<\f.5ǈ\u001c\u0006ۅ\u0015\rgmh(͏>P$h\nI֨\u00031\bD\u00151\u000f\u0002S\u0006[$ZWm1\u001eJt>\\b0\b\u0019Dxݢ;\u000b1\td\u0003j\rcW7KdRT#`\r;S]Qsq\u000bLƤ[O59\u0012\u0004)g\u0005?TDҏ<e\nFu̠\u000b7~9S}#.\bOI$Du?z%:ZF.r?\u0015z [}!\u001f\u0013oA\u0003L\u001bI}x:X\u0005\u001fQ;\f>N[\"G\u0001\n\u0001Ƹ\u0006*&\u001b^s&؟\u001bWō&\u0010G\fɘ\u0016v\u000f++_p\u0001ўgMHb`\u0000{*%|'a8\\kN`\u000f6jBB\u0014W4٩\u001dAmQD@?;\u0015rg\u0015K-\u0001%ll\u0006`  8Y\t[a\u0018+yOڙ\u001fQ3l$Vd\u0016\u0002u}'?@@/A<{XL\u001cE)bl-!灶PWŲ\r`4\rU\u0012Rdݸ3ˈ\u0006\u0018Y\u000bp\u000e,]ϑBbGnj!V\u001ep|KY\u0004\u0013jќG)2=I\u001cnl\u001e:'\u0000\u0004q\u000f3Mag\\R4>\u001c'Uw\u0004hJ\u001f3zEf6n\u0017\u0014<B:̍Z\u000boV.'xY%~`q/Q|?ɩM\u0007/[Ƌ{c󴂟\u000b^\u000e+RQ9\u000458]\u001d\u000e\u000f<9k{4`&\u00009q\u001e\u00159<o8L;AM~gB7~(2EhS\u000bA\"waG|5xyH;5 gJYáQm\r\bd\u000bK\bsV\u0019\u0005`ZAGd\u00188\u001d|Wv\u0019в=ԍ/B05(L\u0016r`\u0014\b0?V\u0000zߦ6\u001ax_yf\u00186a\u0012jf&QYJ41gv/\u001d\u001a\u0012p¤\\ 喢ș.\u0007\u000e\u0005]$O'\u001c/Ei\u0000\u0010\u0002}6\f\u001b\u0015Q\u0014s=WN%\u0016\u0014HRx\u0018iM\u0015~\u0005k9!rSk֥MCD( 2d\u001c*ˁ4ukV\u000f`X&7D\u0010(+8\b@\u0004H\u0019\u001b1\u0001\u000fKv7\u0010\u0016\u0005ÿG;Y~~`q%xɜY'\u001cW\u001co\u0002ňQDH>ER\rA]\u001c<\u0015\f4gSE@1C(3So\u001ez\u0015R\u0000!F\u0011\u0015%\n\u0005 6c>5\u001cx'Մ\u0019V*\u0003+\u0005&&m\u0016\u0003n奩A\u0003\\LSY\"\u0005\u001671\u001bDFDϤ\u0010L\u000b.S[B,\u0018x\u00067\u0014\u0005\bH1B4\u001b])aIL71Ws\u0013kHT1:2\r\u00020Q$vf)#\u001aK}vui\u001cm\\ߎi-kE Q\u0018\u001eHh\u0002B\rHҵ>\"\nV\u0015Lx\bpEU9fM\u001b!RK\u0005Ii\u0011\u0000\u0018+sPb>\bV\u0019:g\u0011\t,dQ o\\Y1ńʇQ~2W7\u0005ֳO_2\fTه\u0019&nV!;O8AMՅ#\u001c}]v;\u0012^Y\b\u0005\u0004C\"\u0001(۹\u0014K7\u001cIU7EP3\u0007A\u0014cb\tԈCt|j\u001aO\u0000|䴠\u000b\u0011\u0018*Мq\\3o\u0004e`k)O0hA0-\u0005e\u0000\r\u0007J[ia\u0001wJ\u0016y'ge\t\u001abJ{\u001e\u0018˯:yK?[3\u0019\"F#$n\u0000\u0004\u001d7\u000b\u0014v\u0001-ˇ\"Li\"\u0003@\u000b\u0018^\u000f%7pOģb)0]qP0\u000fxNcW`c°p񋱕\u001c\t\u0019py\u000foMS\u0000\u001e\u0016$=\u0017pvx\u0010\u001b4,Tם\rZ\u0003e\u0005[狘RQ*b,E6\t\u0016*%nT&X|YYZ.\u001cNe\u000fjrP\u000eB>b\u00073\u0007\u0007ِ\u000epy˼FS\n]k=\u0015٨[}\u001a?a+pv\u0002d\u00070\u0014\u0000%b;W\u000fwƕ\u0001\u0010 7\"(\u001aO&m\u000f\u0007\u0001\u0013]\u000e+=b~<zwAT6\u00121\u001d\u0016[6^<k;\u000b\u0011243vL\u001db\u0019\u0002[Fa\u0001Kw9{:\u0013ɔ\u001f\u000b  \u0002NY\u0001߁\t\b},i\faB^p;='u-ŕ͵I\u001dýܢ\u0018?\u0014R\f\u001cv%0Qyy&:Nљ-\u0004u`N\u0004\u0006`>(H%YcN>HD/H3\u0003\u0011J\u0007\u001e48<0\u0006@)U(.J\bJ\bIyPU\u0002h\u001dMPj0=2(\u0007̑7\u001aɘ9N3kӧϦ@٪]_Zuf h2Md\u001b\u0018\u0014r0S˚*\u0003\u0013=%m<:s]\u001dօ\u0002\u0005\u0001N54\u0011_2D?1_\nPE`(/*\u000eۥj \u0014G\u0010is)m\u0002\u000f,pQ\u0016<\u0000\nH8\u0004KhU[XrbF\\\u0010@Vo@Z6姟i\n\fi M *Ay泞ΖH\u001c\\\f\u000fk/\u0006\u00161\u0013JF$cwԈ\u0016\u00056?a92#x@\t81H\f\n)\beR}p@6p!:3]\t+&:<o\u0016+\u001b\u0018B\u00046OhN0\u000f'\nټ{Z!m\u001e.\u000eܣ8ܡB2̉+\u0004-YYTOǝ.Z7g\u001ex`X\u001fA1Yd\u0016&v\u000bH+G|o)Y1\nOL\u0018@\u00192\f'X4aSX_IW\n@\u000b\u0000\u001c\u0013\u0014h\u0000?ɴ\u0007%WU\u0016Nl[RYܐ\t;D\u001cjJ'Ss-I8S\u0019pB< Y%C\u0019ry^\u0003|\u0016\"y/\u0010C\u000bRf.Vt]\u0014,V;(\u000e5'\u0015%=lmJ2<\u001a`o\u0000aP{Ja\u001d\u0016zq\tp{{ux\u000eL\u001f\u000bޏ\u001b_\u0004'ƴ\u0019W\u0004\u001bo6@n\u0004\u0001\u0003S8h}|\u0011-\"w@\u0005쇑\u0004.\u0006𣅻;z<\u0010?\u001a[\u0001[GZ=T\f@=JW0T%)(\u0012)\u000eunÄ/בSJ\u0018, o\u0019&˦j9D<\u000b[R_%mӹ<`Ιā(\u0014Fiym\u001a֞壤\u0007I\b\u001eogn\u001dĝ/˲=>uD\u0014\u0014fw6ɧTH]4T#P|\u000e-v\\`\u0013 Z\u0011:}ŧ֚Q\u000f!0\u001bP\u001c o| 6\u0004?\u0016@9#_\u0012&L\u0019n]A\u0010Iŏ}Bc\u0006yiU\u0007\"(Ti\u000b[\u0019[\u0006g\u0013\u0010!QpqӨ%dr\u001bcR-VڛVc_\u001c#\u0012R:\u0013\u000f0k]xA\u0007FEmZ\u00182V=\u0012V^\u001aThVڎr\u0019%\u001dʁ\u001c\th\u0004̋_\u000b@n\u0018\u0007$\u0011}5 ~1\u001c?jxr\u00184.b\u0017\u0012\fIzP2Z~\u0001\u000bRׁ\u001e\u001cQ}\u0018dvڕVlGPR,\u0005\u000fٲfafX{\u0000͏`Ws8#ܙ$\"\u0001\f%\u001a//_6\u0014},A)֊\u0001L\u0007z=\u0015/;\fmT(jE&8q\u000fGT\fmE\\iZ:S\u000e\u0016K\"!5\njIb\u0007SH#Dԣn\u0017\"tԣ\u0002\u0019 D@\u0018q>LDHպ,jn%&CO쒛FS*\u0014 i\u0012lE|$>kPK\u001d=t\u0019\"\u0007Ӳ`c@\u0005u\u0007\u001arPUt1o9Ƕ+\u0004\u0005a\u0016U9pcG\u0019AUwڧ2\b\"u1qus\u0007\u0016F\u00100|R%gKVK\u0001wp]\u0016%P)\n?`6֎\u00127d\u000eDѳ.A\\\u0017cOvto V8\u0007^B\u001bʇZJn\u001c&cGG\u0015\b4Q\u0006E\u001b).&x\u000f\u001fLY\u001d\u0016\\@\u0016~1\u0002Ω/[$R\u001b\u00079\u0004F7{!󻩩\u0013YuЀ=n&q\u001883\u0007\u0015Upy.j{൧\u0007vGQaPg\u0004Z}Rjdp=$eJ\u001eV\u0019\u000b\f\u00051>oɊr,c\u0001\u0011\u0002\u0007$eb~Ap\u001efFJV\u0013;\u0012d~s\u0006\u001ecNIG[ɓ/=}\u000b\u0003 'K'+oLj͖\u001a\b\u00028\f\u0000\u0017L\u001aj\u0003˕\u001e8\u0014]\bk\u000f\u0001:|P˽*\u0005\u0003&)0'y39\u0002p<ը+{\u0010[;\nؒ.1i+MW>zԵJ)R䨳9\u0017Hօ=ӧuV:\u0019\u0013x\u000e\u0000$R`L/0<4؏l\u001f\u001e\u0005|{*@>QVn*-hRE\bTv,T_\u000b9\u0006o^\u001aE3N\b\u0019h\f\u0010r:&`\u001e\\!Jh%Ow\nJʋåj\u0013\"UNpP6O>5Oqqc4Eir'A\u0011C'e\u0002'f_\nV\u000263Rtp\b\u0014\u0013TH??6.I5\u001fN.6io=٥^&q\u00176{\u0013eqTr\u0006F$5+jv\u000766k0J>\u001ca~\u0004ڇ&Q3F\u001eyi\u001d旍zl\u0019`\u0000bz\u00109LUCD\u001fְv\u0006R\u001f!D'\u0000\u0018-ɫ7I\u0012\u0002X\u00119\u001b5-\u001ck2\u000f\r`~=1P\";!̋\u001dH.Ϭۆ;a=)\u0005\u0002i\u000fJ+#v\b\u0005\u001cmI \rϓ2),#b5H\u001eN\u0005I@\u001e\u001cC(z\u0016VeAITHb,؂xse}XO}UXjW`c':y]\u0011F\u0019\u0013F\u0004{U\u000bf\bClN\\U\"\u00171OzD4\u0015\u000f\u0005&$u,LH[\u001c*>tQ\tVi\u0014FUЩ#\u000b,}&\u0012VX\u0019o\n<2ԥx\u0016\u0005eO1P&\bJ\u0006ͮh_sG\u000f/\u0000Q\u00174\u001d\"`l\u0011G2(PD\u0006\u0019?-\u0011F%\u0013\u0011\u0018uHt^l4l@cĂ`l.|7b\u000f\u0010\u000f`t\u0019$\"ƭY<2۶\u0018\n v89y\bWĿ\u0014]1\n\u0006e\u0011,Ӭ9WNy>{~ჲ߲\u0015'\fb\\)\t\u001crKG\u0011y\u000f\u0006,,}AHCW/\u001dZd\u001c\"~\u0013>8$(_B\r:V\r\u0006\"\u0003\tV\u0018\u0006\u000f?K0^\u001e\u0017dX\u000bI``\u0017T+>ƊZHt7(bWBcO\b'\u000bt0G\u0005-NWt'6O^Yf?7`OA0BGX!fQы\u000fXT^|uA\u001c\\zK\u0014Y\f\u0013\u0017{ \n{ݜW#I37{^yf\u0005$˃H&8傁֮C\u0007\u001cE:cbbx6\u0004j&HsmUn6DNZ?\u000fSp{GD/`_\u0002R`\u0017jp9e\u00054!F@ڽmQ\f\u0007\u0013\u000b\u00116\u001e\u0007-eM\b\u001aqR{@w7i|$)أW!<ymdE\u0014>\u0005lOi\u0014sd24$t<qM:\u0011ŕȒBc9(\u0015{\u0001OV__Rɷ2,\u001dVf\u0011w8\u0012d\u0006߂}13|\t5qx'i{8\u001bnTfR?^\u0015[˰\\.7];2}ʹX1T:UH,+|b\b^:X)b2^ӶI\u001fo\"O\t\u001c}\u001c\u001f[iWÅxn s\"@=cQ\rk\u0001Ab.C\u0004Y`̟)j-8ړ&\u000e6]ᳵQ\u000f&\u001b@%\n3\fr\\\u0015\nPМFE>\u0005ؾq\"%my.TvN$Hn?tO,\u0007ˍ@t^?:F0\u0012PL\u00171&mWg(;\u000bȨ\u0002\u001a|Yqu\u0011jgM\u001bt\u0004\u001aCvC\fNt?*;\f1GDDiӵM{Ε9@E2*\u0010)Yb++\u001cF\"%)\tea,i0bM_\u0018LJY0S:?Gi6cQ\u001e\u0006V3\u0016Gqa\u00008D\bhfD\u0000xV@a\nM\u0001\"\u0005Si\u001f?ܹ\u0015b\u000fB\b\u0012\u0002E^G\u0001Z٤LV\u0011T\u0017N\u0016\u0017\u001eQ\"{zdr-RJ\u0003.|\u0001<\u00046-Raܫ۲cpD޾N\u0004\u0000\u000e'%\u0013\u000fJќ^<5K^LRJt4g\u0015q0Oo\nH@0\u0004d<u|Jn\u0000\u001dL'+$3v@\u000fO]\u0000fb\u0011)UK\rG\u0018Ԡ~\u0016\u0016\u0003\u001c-)Wjsxp\u0004Ur\u0012Ė4\t3U\u0000>w]\u000brY\u0011\u001d\u0017S'\t \u000bSJ'b.\u001cH\u001dA5\u0011BdxK\u0000})6]l\u0013j\u001aX<=h\fy\u000eћ/P$&\u0013a\u0012\rGQrAVMRK!B|׷>:Y*\f|\b\r\tMǦŦX\u0003}^P\"긔[p]4V<\u0007ˏ;L%A\u0018\u0006U\u0001h\ru2\u0017zN$b,-`\u001e\u00112|-Qǜ\u001c8ּ\u000b/'\u00007\n~pߓ-\u001f}{/|\u0015\u0000Iؖ$\u0004bB\\kEF\u0000\u0000JѷlAl\u001en_rV\u0012ώ\ti@RTM\u0010ʩ̭Vep\u0019A$4u?kD79~\bC?\u0016VMޒ\u001d!\r1\f.\u0011\n+QQ\r>xdzSX\u0006pJ8T>\u000eﾐ9n<\fH @atnc\foA1Z-čBa'\u0010a`7y(\u0005\u001a\u0007w\u000f\u0014\u0014\u001d!oxb\r~7n]\u0019<\u000f2|\u0015JD7R<\u000e]ߖ\u00134\u0004\u001a\u001c0+y\u001c~v6\u0017KLYY2b\u001c_{\u00107|\u00048F3%kUr-TE\\\u0010퀛>\u0010'g\u000ep{$\u0018\u000enU\u0003~fJ<]@on0-*\fO\u001dqۥ\u0018m|T%Yr\"Ix\u001b`\u0003;ŕ(`~\u001fEv~\u0013$;7u# \u0015alֵ~T'S®H\u0007qVʙ$\u0005&ǃ;f-X\u00105+^ř\u0002/Iˍ\u0012&ӆx)\u0015r\tY.s\\у e\u0005QP\u0010\u0007;G:(|X\u000f_\u0001&%k\b+Tu\u0015)\"l\"x\u000f=.^qp#\u0005sϝ|,\u00048Gnk堣JwC\u0016 \u00063\r]]}\u0002s\u0004PԽ52\u0004\u0017q\\t\"(}HC\tBN=\u001d,E#Dq&y8*\n/3!\u0005?<\u0002eiF3e9x\f;\u001dB\n,00~$\u0012'\"E\u000bsa>\u0005݈i\u001aO\u0010n.V\u0012=\u001d\u0019㎪ɑU\t\u0013Г\u0015\u0014ݗ\\8<)d^8\\{[\u0006I \u001d#\u0006*K+jx0\u0018\u0004P  P\u001c=](T͏]BRpCi\u0018 (Hw\":?=ɵ\u00126{\u0018WJ\u0012ڤ:'OsmX\u0015\u0001o+,\u001f޻\rR\u0007z\u001e\u0015rKc.O5\u00142\u0005\u0012*8D@@\u001a\u0003\"-\u0001\u0016DDY\u001dL\u0010L>I,7 \u00187U֔\u0007˧K@ T`ާ2\u0001߰Aq[cd\u001b\u001a-R[V\u000eGtP&</0Y\r\u0005g.kyW5\u0006~k\u0004oZ!gdwܺ\u0018[4ѥHHfu*\\Of\u001aօ\u0000f\bN\u001eVQ`\u001bH)/#V|\u0001\u0005w\n\u000e\u000b,=@#.OKxi\u001f\u0015\u001c:~_4D4B 7zijx\u000f]Rn\\M1:k5\u0011=\b<=jL_Vlrm\u0000??Sd%\u000f\u0011\u001dnn\r$e{ޞM KI\u001d?\b\r?pCFƣ[CUU\u0014\u0003\u0010\u001dHՍ\n\u001c\u0001$\u000ep\u0019fت{&R2?&S \fۋ\u001f}V\u0019\u000b5\n1\"\u001a\u001a:EZ=e\u001d\u000f\u0019ID1KJ.m\b\"P3j\u00046O\u001c@9\u0010M\u0004\u0018\"Avb%h]ň\u00184p\u0002\u000biYbhbx#O\u0005!\u001bQ\u0003~\u001fʶj9<m>H 'À\u0000Ѐ\u001f(\tMJnヷTyRuF\u0010a\\c\u001a߻LO]\r{t'4~6B;-W7lյ+=\u0016\u000b\\=\u001eFd-/fu,@h7Wd\u001e\u0012\u0019siظL\u0010\u000eswu\u001cɉY>/1|޼/w\u001fy\u0010\u0019@yC/qĪǿmeMC\u0006TC%<C\u0003%\u0012VR\u0000|8,\u0018\t5\u0019E8ԗ{Ľh5M\u0006#zA\u0005f\\:.'\u001aTV\u00106&2\u000f\u0012-+8۫aj3Poma\u000bUm60>fZ̋ɸF\u0015aT\u0002\u0015c9(UY\u0006ک4.n\u000fRCC\u0007\u0004\u0016#\u0018XUF;{\u0001.L%ǰmvs\n+\u0012_$\u0004P\u001aI\u000f3*\u001awYLTSQQ^aSB)\nQ|\u0016|\b_\u00190_Y;۹N8@W\f.[k\u001a\u0000Yz\u0007tb\u0000V\u0012=/故yUٯi\r\u001cĭZ0\b[9\u0007\u0016;U)V\u0005\u0019܂g\u0014ޑדI]\u0003Ely߈I\u0004O`םR]ԓyIu\u0004ma&\u0000\u0010iBY^ᗯZP(]7$\u001a'puU@'F\u0011D\u000f\f4\u0003!b+*\u0019K\"HPW+\"\u000bu*5ӻ%zղqAuȠ|8-\b#t\u0019El2\u0012cNIzt0o\u0004\u0018F:5\fC¦( nyo54|y_~\u0005sK\u001anwm|8<a^'iuZnU\u001e:[\u001fcŚ-:U\u0005\u001e\u0010\u000eo!qk6o'Ź~=9\r6\u0011\u0005\n<cghZ^ՆpO&\u001c\n\u0006]\u0015\\m-l\u0015\u0005TX2ϕ:dvrٍWUeG랬.\u0011o|Uvw2\u0005_1\u00132,1%W\u001e\u001buq\u0004&>\r&\u0017[\fsC)*D0#b;qKvs\b!PN\u0017`n\u0003o\nwPe5)\\h\rcvbݓ\u0010XxȢcby\u0016<\u001fJz,jp\u001b\u0011uajb4<ǉK!nvN\t`|5Ű\u0000AI\rǑKuJCb\u001f\u0019#;4\u000bv呬(5u\nRلA\u001f\u001e\b\u000bd\u0005Ѩ\u0010qew$!\u0004Cڞ\r_\nV2\u0016`\u000b\u001dv\u0006Ÿj\u001f\b\u001f\u0015k,\"b.s+2\u001cX\u0017\u0013]\u0007v)B$%bd$Kvd,G\u001fK9̷C|Jmb7\u0016\u001a\u0004VM\b\u0013,TPǩ&⁧\r``p\u001cNU)?U\u0000Q(!;/\u0001\u001e}O.{7g`c\u0014>]1++C&@B%5#\u0012A\u000f\u0012}+W6\u000e>(+\u0011n4B=&\u0015|>\u0003Bũ\u0004Z~1t[y|,\u0017]B΂V\u0000{Zt\u0007\u0000Gy3rs\u0005/T1h\u0002\u0000\u001eE^I_eX=ʂC.\u001cM,\u0000\u0003\nyvg$r<\u001fڐZ)/KÐwl\u0007N!}e#G,\u001fa'WR\u00157M&C\\\u001c\u00036_R\fKA\u000bzqHB.n\u0015\u0002\u001cVm\"ϿmRfo\u0018f3q煮3a:0-ht\u0002EPVk\t\u0015R^N1\u0007ց9$ڔ&)sꏹ>\u0014!EO.ΥQCn\u0004?\u001a\u001biI8\"F@  h\n\u001bBC#~K:[\u0012\u0000xd\u0013Qb\u001e5N!4@ {b/\u0011J&N[c9\u0013\u001a\u000eC\u001b<%O;l\u000ege_ȒƘe,go>~U.l\u001b!]u\u0018J-hІ'G\u001c~i2ow^>'\u0011GMyW\u000e\u0000:i0\u0014R\u0000C0'5\u0002Y)/l,.]Μ1&Qti\u0005v\u0012[>\u000fΖ\u0003bS\u0002,c\u0019\u0001-n Oof`}zڄ'\"y<<\u0015QMT~,USW3\u001aU5%.q\u0012r\u0019'xL\u0005\u000b:uGL,s7]Ȁ懋9h(\u0018\u000fh<\u0010B$\u001c;8\u0001\"kL3{/z\u0011o'O\u000fA[b5I\u0012d%{(}\u0002+mi\u000b\u0015|VA\u0013sE<WX%{\u0004+T\u0011\nʿ0+\u001748:\u000bɻ6nȡ?\u0006!\u0006!\u001c@KI\fI3?0\u0001\t[\u0014.oc\"ЂǷU\u0010((<\u001bE\u0013\u0004.%sHn '2kp(OGfk>Mѓ/\t>d\u001308\b(AA\u00077U?ć\f@^Zr;n\u0006l\u0007\u001c[l7I\u000b1h\\hF7.\u0017\"c,wo\u000618\u0001V\u0015\fƹ}X.~Mѕ\u0002\\\u0019PGΜ&\t?\n`ɓ6e\u001c=\b|Rp׬Xfo!\u001eP?\\\u001f%+r?s{6EswCC\u0002eڢf\u0014\u0004زH\u0019\u000be1wzE\"\u0017\u001da@\"\u001d\u0013T<ea\u000b~S:'!o\u0003ߧZH\u000f]89>3ͩ7\u001f*\u0007\u0001?P85j\u00107\u0011-,B\u0007U76ճi(\noW=*pg\u000ev]f\u0012!lPbSD\u0003KJ'f7\"W܌\nŕ\u000b:b&@E\u0019zqfR\u001f\u0010\u0018M%\u0019\u0015\bo`˯iK\u0011ȥ{gؐ6Lʟ\u001bВ'=L\u0005cQYJ:z\u0016}}W\u0005M0: xfq% \u000e\u0018ٴtи\"AV\u000e.3Y\"1\u0014,OeG'\u0001\u000bR2WZk)\u0000vA?6m\u001f\nZR/T\u0016d2>M\u0002reх긦K֐{@X̵B\u0013\u0015QV1\u0003xʥ&>UҜ\u0015Eb\"㰒]T\u001b.Z\u00158,oU@dv*`f\"cیE\u0006\u0018IAzݯ\u0002QB;˕\u001c\u0015vb`tKR(}^nVD|\u0001y\u0018;WI]:h6Wr!Ko뷙\u0007L[*0\"\u001b\u0019i\u001e\u001a]s\u0014\u001f1l\u0011Z:\u000f\"Do2)K\u0004\u0017ێ\u0016.s픵p+Yn2m\u000f_t\r\u0016Y]rj,g͏9ݺ=Ƒo\u000bʶж@`\u001bK\fj\u0002S\u0007ǁ$Z\u0012VTErRo\u0019\u001f?\f/AJvWTU[--\u0007u\u001a\u001a\u000fQmN\u0015~JIъ\u001e\t\r\u0002-\\fhRuրX\n<@\u001fѓZLa&}\u001c\r,\\-\u0001KsYū\u0016N\\lC@UW\u00018Ybk˄\u0016̤% *9,|:\u001f\u0012y\u0018\u0013E4\u00032,YXQxEK\u0005\u001bc\u0006\u0001߀YG\u0001\"\t\u00006\u0015:.\u0019֯*ƥq>f7f牡^Ghf\u0001dy(p`G\u0010kDOb\u0002&\u001e{\u001cte1oe$\u001cQc\u001c\u0017124rfv`\b~*Sb٭;\\\u000eY\nFn\u0001V\u0014T\u0011\u00004\u0018(}\u0002@C(O\u000eu\u0000\u001d\u0011f&zd3OCsN|g8&]X\u0011VYX\u000ed,Oj\\E_Ɍ4fԘ'c@'4n{_V\u0016Ca\u001bs>Xcg\u001d{6o#\u001b#\u0001\u001d\u00052xk*\u0018Q\u0010\u0012\u00013,/!\u0018X\u0000\r\u0015\"'fx\\AP OKݶo\u0003*u0#͖EE͇\u0003D@\u001d\u0001eioa)ǝSq<\u0011 cCVh\u000bI\u0018blI_\u000bWE\u0001\u0005H\u0015\u001dMFx!\n*FI~s\u0002\r0$\u0019\u0013B6bb0 ȁ\t\u001fRǥ(8!Ѫv\u001fkP\u001dxr7\u0003\u0010\u0012\"ND-tM^|6Jq{s\u0015C[\u0000Q\u0000T\b'\u0011Ɨ%.T,b!2A\u001fr\u0001|bons>\u0000X\r\u0015ZİΰKߧ;]I\u0000&\u0003>$\u000f(A\u0015>L\u0017=mɛA\f7k^Fc>'ŃW}t3+G]\u0006قg\u0010`\u001d\u00047Q ?\u0005\u0016nb9!ŷ)*\u0002y;`\u001a4Gb\u0000'Uvޱ[q\t:\u000fQ.ah\u0005\u001ex\u001duF<3\\yh\u0007dhMtiЊ\u000b\u0018\u000b\u0019I9\u0006\u000b<E/\u0005Ѱ5:\u0014G\bF1&+\t\u0014uf\u00139# \u000eE-=S͞*\u000fd)pLۈn\u001f\u00027>l\u0014ٿsXAgBi v0ܖ4\u0019؜jā3\u0017\u000f\u0018:/ɃX4)\u0016\fR1\u001c\b\f\u0019\u0019_uì2S60#Fz$4\u000bH\u000f5A\rAX\u0011\u0015\u000bFI#I\u0002E\u0013\u0014H\u0014\u0001UǊıt\u0006Rp42\u0017I^\u001c\u0018\u0005\\\u0019\u00018\u0004{\u0002y|fSI1*\u0005,$؍Eh2\u0005\n\b#\bxDofU`\u0016=B\u0007 k\u0005Dn(N{1c8j\b,(\raqZSjv\u000b\n\u001a\u0018I_1:51\u0002\u0005(5\r'*h~`iOWǭ# 0kќ>%tC*dkyI_\u001f?7/2\u0014\n>32\u0013A\\}ѻًp߈̓0\u0011-\u0012p8\u0010pɑ^\\Iv&f\rl\u0017p\u001b!Y\u0006?M\u001c0Go~d\u0019f3E\u001em\"\u0014-GYF-=\n+Vaƴ\r،珶7| 0ТN#0U\neM\"\u0011}\u0015azX|I?\tCވNVj\u0011o\r<l\u0004\u0003\u0004N2AH:g\f/\u00136I~Sg}!\u0000;\u0002]*,0w˧C>\u001c3}?]@X6Y `\"\u0018\u001cp yA\u0019&sȭ-K8ax\f,eG2*\u0004S\f\u001f\u0007\u000b4\u0000˛RCDH\u0013$\b8㨎3\u000fB>s\u0006҈zA\u0018M\u001dW?X^x\u0004 N#qZ\fPs`G\u0004yF0\u001aٺiaaEc_j SK9\u0015\u00103\u0013 M\u0000W\u000e菽\u000f١jF}ekK&N\u001aq%p\u001b8\\(gi4'j^f6)5'\u0013^T\u000f,\u0010\u001a\n|V\u0014!:[\b\u0000[r\u0000\u00188t n\u00135\u0013'\u0017hϿ󈾮\u0015VOHW3_3-sr6\u001c(\b*\\\u000e-\u001b>\u0010Y\u000f\tid}KO\u000f^;2ܵHC:\u0019܅llPNrdO^A;I\u0019XF4aPE\u0007D(Zty{D/\u0002\u001asmN^$Ƙ^D\"*\u001c!\beү!eɸ)2\u001f7#,~\fe1\b\u000bϓƆFVfVCGo%.(y\f1\u0005XO\u0013@֫dE\\ʺA<\u000f`M\f`o*yye\u0013(a;׭o09R/h\\Pv\u0018(i\u0016v7s2Tϳ3PU\u0001\r\bᦠ`.Ԕ*@D{czi1ɻB']\u0012-(\u0000æ\u0011:r\u0012c\u001b15,\u0011\u0001XT?3Ò\ti\u001c0ף#]\u0005|\u0000\nbN\r\tX1Vh\u0014^\toCO`.\u00119v _~2\u0011L\u001akOv\u000emv\u001f\u001cs<\brc/PK&~kAXg[ r\u0018g&k`(>R\u0004\u0019(VL\u0010_/+?9a\b\u0006{\u001a|Ky<B0bW#Eyh#\u001dM|޸@npύn\u0010\u0010i1DYv>ۥ@r6,`ړCp`A4/ S3^|k\u0005\u0000\\R\b\f\u001d燂&\u0016\u001aЖ\u001f\u001f\u0016:u\u0001UlM\u0007mL#\u001bnN\u001fҳo>oN\u0000?\u001f\u000fvq_{P4\u001fc \u001ctN\u0015rFM\u0004\u001fNحZVoJ[?\\mh\u000bɞ>9\u001dZؤ\u001ed6zҏu\u0004\u000f8JsC&(yzdn\u0018DR-W6\u0007zC|G~E\u001fx\u001e饀\u001f\u0011\u0003\u0016\t'6Ḋ*\"\rF!7mG.\u0018\\\"q6L-~C\u000f\u000f\u0013YU_e/˘\"D\u0002t/[\u0016{\u0005l]HƏ8z\u0002Ѝ=̄D=<JM]E\"S\u0016S\u001ak|YP}%K&(Y\u0003QEy1\u001c\u001cwߎVF4'X%_Ʌd,U{\fV\u0005%>\u0015g\u001e\u0007qiؗM+[\u001aӝOz;u)y\u0002;կ\u000b6\u0013\fzƥƀ(c\rU\u0017oz?}z$\u001b'p\u0006\u0014bS\u00037P*'\u001fx\u001c}X'\u0003\u0016k\u000fj\u0015\u0005\u0007G\f;w<~Q#R\u0007jN$\\\t3k\rT\u001ar]\u0001$\bm\u001d\u0005[j\u0017R\u001f4/g\u0012\u0010鿾w}[~7\\~g!>M[?JTć\u0004\n:\u001f0\u0013P8dۂɩ\u0004靵ZJ)%)2M\u0014KU\u000b'\u0003\u0003y\u0003\u0011\u0014fF\u000e$\u001e:h\u001a\u0011`\u0004\u0019%ff\u0017\u0011\u000b\tJHRɄpNA\u000eEp6\u0003CC\u0005\u0018j\fuӅ4D\u0011{wS8Ϗb|\u0007Q7_wCFgZ]U󖡛w\bG\u0018D8\u0011}\bw\\z\b\u0004A@\u0001\f\n\t\u0005\u0004\u0000\u0000$\u0002\u0002\u0000@\u0000\f\u0000\u0001\u00014\ft\u0002\u001d؀\u0003\u0012x@\u0001\u000bX\u0000 \u00062\u000e<\u0000\u0010\u0010@\\B\nQ0\u0000\n\b\u0000\u0000\u0001@\u0000\u0004\u001f@\u00054\ft \u0003\f\u0000\u0007\u0014p\u0000\n\b`F$`fUWD\u000ej^FM)D!P\u0011\u0011qP\u0011{!1b\"\u0014j5>de\u0016utQ:Q&&L\u00139**M7\u001fZ|ɇ\u001a&rI.2\u0014\\<'\u0013f</D(A\u001f\f\"\rl\u001c\fmU2}eHX9r%U\u0014PET.*)V\u001a2N\u0005Ri*4!W\u0018ӢEEUb/i`w\u0004[\u0018KraF\"\"^TR\u00048L(¿x&Ǔ!Ч)m5?K{\u001a!ØŦ)<\u0002*JԂb\u0017C#\u001eq*I~\u0019fU\u001fc^\"]~E\u001d8! \u0011?\u001cR\u0014OqŝV$H°\u0013zcP\u0010CH\u0004@Bz\u0014\nEHv(%f+\u0014,!WP,rF\bE.Tx\"+\fLA%TB?Jk+˄ɬF[E%m6T\u0014׊\u001bI-oY\u0012N#)ubA\"\by XAZ!\u000b\u0014\u0017*VpD,5\u0005Gp[DѾYXNED\u0014A\r#A\bA\u000fY@\u0003\r\u0004  \u0000 8\u0000\u0002\u0000\u0001\u0000\u0004\u0002\u0015ZHM\u0012v{\f{uؽ\bv]wY\u00063/e66\u0019Y\u0018OyyO\tfam\u0011\t{\u0019;͓߽W-A\u0004u\fE\u001dFC~Tx\u0011xqq\rێT7n[<C\u001eA._\u0011Tʒm\u00026R\\\u0013L`mXDlr]vgg\r\\Au[u\u001difŌw2H\".ml6m۶\u000e7u߽hO\u0016E\u0018\u0001\u001f(\u000e.%W\b\u001fZoSD&`^Sb\u0002.B(Z\u0007!{!B2DnI o\u001dwh-8\u0018h~!/\u0014\u001fLNÎ#6\u001d\tb38vTA`\u0010}[P;C!\u000bZۮ=\"`W\\0\u001f-Fݺn[ж).Tmia:\u0005?\u0010\nf\n\u0013\u0015!\u0015D?k*X[GSRYtu\u0013\u000b0\f@l*\u0010e\"C&\u0011\u0012G!ATXr\u001b\u0015TP/Ad\b\u0004IAeAdaH-ڂ\u0007\b'\u0010\tJC\u00114S\"E%ԡ4*;\u0006IS\u001eVz)\u0013:+Opy\\5\u0004N_HT-2ЪȲZih\u0014TXcg\u001bmu\u0016Z-vj\u000bXm-\u0004\u001cwAZJ\bӶj+65ݞ\u000b5_Զ\u0010\u001aȖ\u0018BmH\rg\u000b\u0010x\u001aK \u0015i\u000b\u000e۶\u001aG\u0019\u0019t\u0016JͼƼ%\u0003j{TJ\u0013X(.-jP!\u0012\u001cPh7hj¢iNG\u001fE1\u000fDmqUM?|JOp!fsKB<B\tQ\u000b{KU1\u0015Ba\u0010\u0011\u0004F:\u001fA^r\u000bʕgo\u0011-qD-\u001b*'\bc!\\\u00075\u001enAF(\u0005[@\u0011UR\u0016Au(EnAE-Ij&`Ж\u0016)\u0010\u001d_|j\u001b#A\u001dS:\f1&.yT5Z\u0005,[IEe-𿙧ۢ8o\u0003):pe$5tSX;\\9WE\u0005t\u0002V\fQ\b_$U:hÐS'ө@,pmM*YK\b$-IJ78=t\u0012|)h\nu7v+\u001bOb\u0003ێ.Au/D5HA{V\u001eSQJ\u0011-Ԣc⹦f\u0011SX\u001e$'Hd\u001bU{0\u0010lPf8*}ֈĄ9^\u00074\u0010\u00010o]\u0002 \u0000\u0016\u0000\u0004\u0011\u0011PP1\u0019\u0017-%EJzRx T\u0019ceeeCJ]ilmmu\u001eDE-kuԶU;J@tJp4[Wwvͼ_$\bJ+|\u0012_\u000e7F̳D>yX-xfB\u001b2QGr(*<)*;nƋ96F#78s9\u001ca8\u0016.\u0013q(\u0016\u0013;Ce\"b\fU\u001cٺh\u001eو\u0013F^2B®(jImzAٜp^j\u0016-T\n1\u0015GZ\u0007;Ғ&*ƖP\u001d:09w>6tVL\u000ebSifI\u0010\u0016jc62axYvY\u0011&\u001c\u000e\u0013m*jh>Av;^|ϋ\u0012\"ϋ\u001c\fr\">\u000bQ7k4Wb{\\.VD$īlu\u00186fZ%-҈D+d\u0013\r\u000b\b-\u00131!\u0016\tw\u0016\rWx\u0017u:S\u0019.[;1R׭[e˲mK='n5k\u0001RrZj5U@\u0016T\u0018,(uծ-VkMMA>U*%\u001cv8ՃP\rUAj5VTK. \u0017}Z*2F\u0017}_\u001b\rOܺԔ;\u00142NP W\u000eV\u0016\u00149\u001bxW^\rZ(\u001b\b׊W\"/1CtLD)H9P\u0014\u0016\nc\f\u0005\u0019\n0W&HB2Vqb\"W\b\u0017:ͱ\"И\u001ahZSar?\u001e\u00104AniX5%jLTT42\u0015K$\u0014\u000b<\u0005\u000eQezL)3e\u0016iXNBUqB]UUEk{b+Z$\n{\t5\u0019f;MB3B1GK[?#\u0019}) P:`:H\u0006*nAɺE4Ԗe\u001cq\u0003Y\bIA<b@j\t30)cݮPu\u001f-X\u001dN!C\u0011\u0005ڕ$=n\u0005CO\\n܂9h\u0001\u0003\u0003\u0016\f\\\\A\u0015BL&٣~m[UwZ%\u0011GsMau\f\r3\u001bSݺ<\u000b:\b+\u0010U26:541mMPB)\u0005\\\u0006\u001bF2vX-ɱ؋bE\u0017hgڰ%SHH36)\u0019!\u0019(CL0\t\u001f\u0013`x\nqy%p\u0010T⇸\u0005\u0005LA+e\u0010TV/\reBtW׫\nFR\bl5J]=_`\u001d\u0006J\u0004B\u0004F\u0003V \u0001qf\fEB3\u0011q:Qp\fAe@2\u0006Iq6VX˜AJT]DudYjg>\u00064D!jgs:p6^X_\u0007٥b\"z,LS5Z\u000f\u000euU63B1'\u0014Bt0\u001d\u0019\u000bs\u0015)bn;E\u00124?Ws]vmeXo}ˮJ6mǩN4\u001d\u000fB$W묠*k7o\u0017\"֏7{Y\u0013h\u001bDgAzP\b/M^L0\u0016R\u0004n۶q\\;ww\u0011-L\u001e\u0005,r9*oꏾjI0:u<L\rykX'\u001ecX\u0018<\u001c\u0013ntm\u001b$p\u0004K\u0004\u0015\u001c)\u0012)\u0007˵\fEh-f]\u001d\u001b\u0010)\u0016|z\u0017;\u0015a\u0012\u0017&]eɮZ@]7\"Q\"4\u000bd^\u0012T\rX,vFծKbb\nQ_u\u001a\u0015]h\u001a\u0013Lm͹LYU\u0013\u00195۪6``\tf<|UrLT;%rZTj1f\t&\"a>DT\u000643\u000b\u001a!\u0019TM2\u0012\u0019*ӊVMʵ:ef\u0015F?\u001a1pZ5hjo%A7AUI]8 \"F4KL\u0004g ,\u000efa~of3,B,yom^_\"wx2\tJ&&\u0013\n89-\u001e\u0019v-$5\\w@SJ\u0003 \u0003@tƎ\r\u0000\u0000\u0017\u0010\bp\u0018\u0014\u000e\bECr9>\u0014\u0000\u0004}Bx\u0016\u0007!\u0001\u0018\fcYC\u0004\u0000\u0000\u0000\b\b\u0000\u0000;q\u0016L\f5x4\u001arckm\f6\t\r߅\u001dГI\u0006C\u000f\u0001(Jd><&X'ܡF\u0010EA_N\u001bG#@%-rpq\u0004Oy[{!ۣ\u0005\b4q-\u001f\u000bG\\?r\u001aPeC/|Dg>O|bcscp\u0014C߮I=pؑt1b\u0010u_A<\u0017M1o\"%ϒ*}i\u0004ΗvΠk'A=}eQrkѤWa\u0000\u000b':pH8tb0P+!whY;{\b}I$9%j}hi&A\\AD\u0016\u0005:C\u0002&?a˂~vII1n\u0017i\u001ew0\f\fb49qH#`\u000fI?KGJi#$-b2Ж咥\u0005 {|K>duxjC#?\u0016\u0002Z\u0011\u0004\fs\u0006BO\n\u001b\u0019(2C\fr\u0007ĝJZaPp gd\u000fXZ\u0012\n3\"v;\\L\u0010u>\u0018S+o\r\\g\\\u00110gH囩A|ȰC\u0018^SӠCQ!\u0012AF3\fq$t-N?*q\u0000EE@\u00049a<\u001d\u00192!ȲA gX\f\u001cӯJf\u0012\u0004$}EX5BI\u0004\\@[jGkh1!\u0001Cb\u0002\u001c \u00153h\u0005\u001d\u001di\n\u00014-cp\u00000\u0007\u000es\u0016ʁŸeuPؖJB\u0016Pe\u0003Y\u0013/z/J\u0017\n\u0018\f|pE\u0004<L\u001b#IcJɱ\u000f@\r\n\u0013a|\u00013z_W\u00124\u0013֙4xc\f\u0013\u0019\u000eP\u0003K\u001cTbSү\u0012F:\t'f̥10fڈX`kE?\u000e\"BrN(4A</A.\u0007\u001a5\u0007]m\b\u0007OHx\u001bCEG%\u001c\u001a鯕]Ǎ\u0003\u0005\u000b\u0004\u0005)+IVĪvA9)+Ȍ-k-`ilh*JUs'F\u00024\u0004\u0013\u001cWVC\u0012/\u0010=<hT=HI\u00180dp\u0001V\u001a7%\u0007+\"S]f+E⮼&6Ï\bƝ2F\u0018 2Κ\u0003#\u001b;o8^&\u0005PR\u0000K\u0003\u001f`\tƮƌ,\u0000%tfij\u001c\u0011:[p#J]\u0010a\u001bp<\u0013=G\u0012ܸ\u0016\t\rg\u0011\u0003|s|a&HJ)P\u0004'I^м~\u00112iAn\u001d\"MFQoĚ@\u0016\f0_\"!V\u000f71&r_\u000b\u0017\t5lϤ4\u0012\"P`B7\u0000\u0019\u0006i_M\u0018\u0016(\u00117.1@{Ξ\u0006cԣ\u001bϧ\u0019.\u0018i\u0003@CK8Sj\u00102c|#\u001430\u0007dZm|*NӄK@xi\u0018¦o=H\u001c'!\u0003*6`\\v \u001cÁ(\u0006.\"~Y\u0018\n\u0014xhHΣp\u0012\n4'ԵT_-d\u0016\u0017afx-&RS\u000e<*v\u001cj&}hX\u0001Ǭ\u001c9*\u001bux\fn\u0000s\u0007!\u001aZFҐu\f6.\u0002NÅ\u0007I{i\u0016\u0001.xMŭ\u0007\u001a(oǨq\r7d=1@\\:>\u001b|\u001e]0z|\u0017kR'\tD<NA\u001bj\u0003g<Ls\u0004\u001e\u001bqB\u0001\u0012~T;p^A!|}\u001029Y\u000fL\u0019t<sBʁ<1=r\u0001j\u001bЊq//\u0010g\u00020\u0002h,],nnz\u0018\u0006c^UO+бIZ)%,5FDYx3fS\u0004s\u0014#0*\t\u0016al\u0016LByY\u0007ҙM\u0019\u000b{_2%\u0019JǏ\u001c\u0019 %\"~\u000b\"\u0015\u0005\u0012/u4Q$ 6U\u001dd/=*\u00042P#,\u0002\u0011\u0016\u0013\fC렍xc_\u00161\u0013YB*M+s\u0014 d`Mg!F+ذ\u0015,<(dرbK;tn@sfCЯ_\u0005&\u0015V%j:MUS\u0015Ә~\u0012\u0012Q>e\u0013\naD\u0007m@\u0007\u0018\f?\u0001cG\u0000xAw&\u0018PH\u001fLmk㋩&\u0018\u0010\u0018K\u0004$\\\u001e]-\u0002\u0000\u0001=L\u0003x%0fdFsZ\u0014E\u0005\\΄\u000e/%Yp^+\t\u0006+';0Ie~\u0019\u0011Z\u0014C0n\t!;)\u0007?Lyſ7);ł|\u0001$v\u0015j(\u001aH\u0007> K%kdOl\u0000\u0003\u0007[K\u0013nUH)4\u0005N)58\fJ\u001d~\u0013jRd0\nFpWumf\u0015\u000b\u0015@\u0015F\u0000\u0002\u001b@$ڭ\u001a\u001b8pc\b[hW\ny1\t\n'\u000bh\u0003T\u0018cɂ$軏8CEQ\u0005\u000e[\u001fp2\u00168\r\"Ql\u0004upv^$\u001f8FYJ1Iz\u0014\\߇(G\u0010dBCO\u001er\u000fLzFtn\u0016_i(+ἣ\u0019\u0000#E\b!Jڍ\u000e~\u0013!GʡB@R\u0013\u001bR£\u0014iuUu\u0013&ָG'\u0004e29P\u001c3\u0006u`\u0001\u000fG\u0005,^\u0011fnlܥ\u001e<\u0017\"h5VС\nq\u001d\f\u0001\u0013p\fAKKubg8\u0006G{2\\Qr|gNjD\u0012{9\r0Ata\u0016%[x밂Q0ř\u001f\u0012\u00194<@?'\u0010 1WVm\u001f3ZÒ_\u0015\u000f-\rK$؁D\u0013\f\f\\>(`vH1k΂kdH)cIDZ=A\nvđ@&\u0013\u000b|P\u0012ہ\u0000iz%@\u0003\u0000\u0004\u0005R\rd][\r[D>\u0010+'\u0006C*-\fFO]gs#NGlUS:h\u001d\u0014va\u0012$\u0003F^aڃJѲ`|\u0005\u0003FwFM\u0015SCߜR$ʵ\u0017Ls\u0016\bI\"Ls5ɫ\u0016Bʛ~\b|\u001boT\nb RR:N\u0006cԎ\u0010Պ~O\njL:s5_8k\u0002u1\u0014!4\u000b\u0018\"GDsD\u0002nWD\"`I<\u001f\u0005U\u0018{\u0013>i\u0012\u000f\u00132(&;\u0000F&,̨\u0000lBU)\u000e\u0003Ux\u0000{gtm\n(\u001c\u0012\\z\u001euIm)'l.Lnu#2>2|&\u0003\f?\f) 1\u0005x\u001f!\u0011\b\\2mDS\u00060l[5X\u001e?}pX\u001dJPNߟ`z;.%^\u001e\u0016x` \u0001?͟\u0004e'}\u001cֻwib(ޑ}Iy Ow.\u0007\tusj7rAB\u00021\bG2{0v\u0010-e\u0001z:U˷t>M~]K[g,\u000f,B/].}Rv\u0015U\u0017=n߼u)M\u00166\u0001+0bj65O\u0018`\u0003!_#X\u0019\u001eVJpQt0CJ(?;Ը\u000bH;\u001aD\u0003\u0000]OSU|T\u0011`Wu3x\u0014kW@'\bA\u0015˹ŊSh\u0005u9A\u0013\u0004D>FcRL'#\u001cs!1]m0\tF|\frU[`\u0013+\\YUbJ\u001cT\u000bJwrM,7/2W\u0017p\u0017IӬ\u00000ts\u0010pn=mk\u0015RsYtʺ!\u001eE(V\bJKK3D|VoH\u001b* \n΀né^T7TkO}o-\tQ\nDPpUG\u00055\u0016`IT\u00198IZ\u0001P\u001cR\u0000$\u0012\u0016O3Z?{Պ@%0\u001f\u001bT'\u0000l\u001d5!C{#rmL4ELBʰ0\u0005\u0018z}R\bYꛕ6)0\u0006⤎jI\u0018!^${qyE\r\u001a44<h3f)\u0017=Q5\u0017b\nؤ,l&#u\u001ex$ōv\u0016T(t\u000fUm(\n\u000bul\u0011s-n?\u0015\u0006SAR\u0004\u0003΀FI\u0000Bϟ%xPI\u0006\u0003\u0011+GT}:7pZ\u001c-5HpBe\u0017e]P\u0003P\b[u\u0000z\fc=T˄\u0018\u0005(~>\u0012~9g.|i\u001eƫ}y9tJ94~\u0013T\n\\6\u001c\u0005+1)|R\bp)Ԉj\\zBsz0?~\u0016\"\" !\u0013R\u001fɊRN\u0016ݐUX\u0010poE`c\u0006SQfvl՝W7H/jn(@!@4g8R\u0015/ST\u0000[#Ūl5BV>\u0012TZUy\u00027~V\u001aHa\u0017X15j\u0003=\u00198)Q={(&H'\tqhjxPC W\"P\u000eDv(ٓH\u0010ahͦy۩#*:-a-\u0018ŏI+S\u000f\u0007\u000f\u0007\u0010[HyxP3\u0000ahL':\tnt$\u001bt\u0004P5)}e\u0011\u001bC|\u0018\u0017{\u001d:(?i\u001f\n\u000e\u000eXĔ\u000b\u001c(\r,Rb\u000fH\u0007\r1V\u0013)\u00054DY%lE\u00188iB\f\tqbd^}\"ŏJ\u000eӲ\u000e\u000bDBn9\u0002)C'\u001b<v}\nHZPJ\u0007\u001f\u0005E\u0019\u0004])\u0003\u0003~4~$Ԉ\r\u0004{o\u00170\u0012\u001aO#M3SjtW9&5\r[Nw\\\"nld\u0000v\u0016\u0004\u0010\u0001v\u0006t\u001cx\u0016\bv\u000bG@c+\u0001.\f@ln\u001e_\u000fAxֶ7!~>\u000foMt[Ey\u00005`\u0004N<\u0000iͷ!rp4~\u0005Ǿz8w]\u0012y-~\u001dq\u0002aBOL+l0\t#\u0000o[2!\u0010^\u0011_\u000e޶\u0014\u0018{Bu$fdTy\u0011DV\u00180:I|\\Gc\u00174Ac\u0002&(;$G]P\u0000{q|7t\u0012Q8v#JZG\u0003C4bEp8OݒPgi_!g;b\u001bh1H\u0002\t\u0015p:[<R՟\u0016J4\tY\u0016\u00052GJ֑\u0005cS\u0019vm_'E\"4,\u0005Nd\u001a\u0006y?b~ĥOrXAE\u0013i/js=i\u0003?sBqAy)\u0005~m\u0004:yb\u0002qy,}%\u001576l\u0000`yiam:\u001bU\u000b>iVȥz.\u0013z_\"n\u001c\u0016n$M?΁\u000f\u0003*K\u0003\u0002#\u0012_E*aF \u0015\u001ehf\f\b\u0001w\f$#)VTxUl~\u001c\u001eÐ?й(\u001bL\u0007(\u001dӭߟ\u0015;n\nrnH\u0016\u0005\rvK@ɿ0M@IR݌\n\u0002d%[\u0006\n0C\u0010P(_T(<1\u001ciAd \fNa.\u0010Bzd\u001a7\f\u000fc\u0005$*mu ish\u0014jS\r\u001a?-O\u0003˧5H?\u0014\u001fR3ě35Z[Hk\u0006\bX\tl_$t)~2\fiP\u0018T\u001e皚Ҝ@5A\u001f=\u0017\u0019)mrP\u0017\u0014%\u0012DRvi\f*\u0019oh\u0007 𢤽֊zLaF`cpA(I\u0018\u000eS\u0012NL$传73ʦ@iҧA8w^\u0002\u0017.r0ȗRV>ex%#'uI\u0018\u0018ɰ!Q&dܣI'c+H*(2\u0002F\u0014\"P\u000eP\"@n6aΑ0sx͡lY~K׈݆<)ۜ\bJ7JIO\n\u001fM\n=\u0017T8b%{k\u0012h\u0001g>2\t+\u000fiDQ:\"&ɫ:҃$֊x*\u001e.z!Pb\u0019{*ȸ\u001f\u0012\u0018\u001a'b\u001cWV컇J1\u0000(\u0018L\u000b8-\u0016j2Z9{\u00168=❶\u0015p`\u0014[\u000fz`ϴ5'r+a7|xy\u0017,lg\u00039s\u0010ֺyo\rٖBn\u0002!'A);7,sǠjOQ-HG\u001a<a\u0005Eyr\t\u0019eX\u0007\u0012p!\u0013Ϋ[\u0006%~ߵkHÏ\u001f\u0005\u0010C.@tug;\u001ay\u001c\u0001k\u0011HA:mȤf9F\u0002\tK+a;cİ\u000f6Ye\u001d\u001b\\d;!\u0016)\u001a?b˭%m'5ml}7Y\u0014.*ՖKSJuWt`V820z-,/˱8\u0004̄\u000bDώ\u0011%B$s7z?.aD\u0006ɘOy3inȺd\u000bz_\u00199'\u0016ѓ_o\tKl30^3\u0013BaPŀ\u001dP!f,e\tV\u0019H_2I[Plp9\u000eg;w\u0006}=T!j)x(|\u00023\u0015ӻMMU#|$ڼ`\u0014ApsF\u001d޺nXD\u0012\u0019Qx\u0007LJ\u001d6\n\u0004\u001e\u00061 \u001fhd\u0013j\u0015oTտ\\+`ƂfnM5H\u001fw\u0006I*Ӄ\u001d\u0011-\u00132,\nUIQhg!3喵76T\\\u001d澮P\u001a<\u0015\u0011)\"\tq-Kgo\u0011:sf9DⅧYQ_\u0013O~(=`r҆|\u001c~\u001e:ʸ\u0017;@Th-\u0007~\"\u00015-  (z\u001dt\u001f\fʇZҔK\u001c\b>G\u0004\u001aCL/mԥ\u001czz^6@\u0002J\u001d\u0013\u001bb\u0016\\g\u0010Z\rҍiԧQr=G\u0015\u0011!̮\u0004ph(\u0011҇V;;,ՎRJv,$\u000b\u001fÅIz/{\u0001Xv'\u0004/k%75@9Y\u000eii\n@=Y'\u0005^cBPjvQ(iW\t\u001a3*\u001c`\u000f,NmU\u001b?\u0015B\fȏr*g=NBdE'>\u0003(D5Вg\u0016?,po,I)5\u0016U\u0006(Y \u001b:ki;\u001f\u001d']d񧖨wa\u0005J6`6q7~9\u00170g\u0007lSҶ[9cJS?\u00001YB2W \f\u0000Ϫǅ}-l[Yzq;+\u0011}K: zi/HQmU\u000b-)*\u0016+\u0002|U5\nhI\u0011\u0012eAYr9=ۈF\u0014<0\u0017^}E\u001c?,_Ŧ\u0019\tl5=\u0010ff\u00067@N?+^\u0017E8ա\t,\u000f\f5Nsm\tb\u001f\u0017Vcy+m$\bul\u001fY\u0019\u0012,M\u0018\u000635Y8̄a4$\u0004jr5\u0011J\u000e2k^\u0000\u0013l\u0015UkC`.JL\u001ep*TGxҀT\u001b|\u0000@cN\\%M\u0017x(\u000fcf\u0003A\u0011(]O\n36p\u0016\u0006\r<\u00067dܸ\u001e\u0018\\TY\u00031\u001a'2vrjH\u0016\u0017]P\u001d\u0018>rz\u001a=z\u001d!]\u001ceD\u0014q↢\u000e\u001cw\u0000\u000bFEzDǯDYA-<зީ\u0017nGst\u0014\u0004[9t\u0010vUE\u0017D\u0019LBr(\\m}%\u0010/t\u001bW&Y\u001e{ǘ+E\u001dx$G{C\u0018Y\u000b@AD\u0018\u0011@\u0002(Ioݽ4Kqt~ㄅ\u0006%T\u0016k\u0019\u0012|%.\u0004J-\u0002<$эYP#\u000bu\u001c\u000b\u001eP\u0012ތUy\u0012Y\u000e\",4\u0017*\u001c؞ e:߁E]Yxπc?\u0015j'.i\u0018I\"E9\bΘN\u001d4:Ϡ}0y]QCHDu\u0007BbfnXEN$pA5ܟlSt*\u0007bx\u001ct֍uz*3nL.%Sa:l\t9\u0002\u0003b,u\u0016\t\u0015tÕ/o@O\u00161\u0011׬O?\u0018a{{h++5}ʜT\u00023hK\u0012\u0013a!yFdEQeOȰOYF+\t#h \u0006|9#ɇ\u0018,賁H\u001a\u001es\u000ewQ\u001fdL^\u0010\u00079jcSRx.}\u001f=62}!:\rBɆ\\&/㮢G\"saF&\u0000X+X\"\u0007ߝFB6A$\u0003\u0004\u001b4-m,@f%ߓb7\u000fU\u0005j\u00045c&\b*m\u001f%-\u0000=fl#VQ/\u001afuä_\fS=n*^IDA: Fuc7\u0003f\u0000{T5j-dgL./Zgރ%1]7^R\u001an\u000e!ZKx2\u000eE\u001aA\u001c\u0006\u001cYYۀ\u001f\u0012vy*$pUh\u0012B`\u0015#Hb7)8\u000eg\u001cթ5MxV\n\br<ۺ]\u0017Mm\u0014j pg8cS\u0013^x\u0003rBavnrCړ\u00028\u0002\u0017\u0004JHE}psN\u0012ꘌ\u0017V5_L%?R_\u0002\u000epE\u0019\u0004\u0016\u001eK%2\noV˓yB\u000e'\u0004!1ֻ$H0v¨awg\u0007yzn2ٍ\u001fB>\u0014ER>K\t|9\u000b\",\\_Rvyf,)y\u0013GXx4ћۭzlG+6g&\u000eԒq#\u0012^\u0018b\u0011Ҏ\u0000\u0005=\u0007LOv\u001fT\u001bǁ\u0014jڠaX\u001d\u0017mVKK,U~ɽц6\u000ehю\fbs*/љ\"b\u0013-\u0012[1Lc\u0002a\u0005!ʊp\u0019\u0001S]o\u001fG\u0004ehn\u0018z5&\u0011vq_=(ߖ\u001a?I{\u0013\u0019ohA{8|\u0018y\u0016\u00114<}\u001fG\u0017}qN`\u0004N?`e2EF_\u001d`Yg^jQ19\u0007\u0010t{#<3ӫ(krϱGF\u0006\r-\u001bDawY\\\u0006\u0011ф8g0`+\u0000]\u0006vm\u0010[|΋\u0000w'E\u001cJA%ݗ(Oն@S\u0006Lw@\u0006\nA\u0018sJZBe>\u0010ˌ\\\u000fj\u0007w'C$\u0015?\f\b}µPpѭfb6[^@6z={\n7\u00013\u000boG4N0>\r\u000b1BiH[tZx!jE-Z7Hbj\u001apr\\'Ph\u0004\u0000,\u000f iA=R\u000fbg7dųWX\u0016md5X\fc\u0002\u0012y]\u0004M&Is\n-\u0018e(l:\u0004@p\",zmZ>2\\$\u0017u^O\u0013A\rG\fr6|P\u0011\b:\"zH\f\u0007͔\u0012[\nJ\u0005=oD\n\u0000t\u0017\u0004ER^\u0011S*\u0000\u0012>,\u0016F$\u00190Tc+_KD\tƲ~#\bp\u0016P\u0013\u0016Ez|\u0018/9nsr\u0012\u001a?TIc\r8^iqMŦEAl=3\u0010rۉ\t\u0003\u000b^\u0014_Jΰ]\u0000cvَ\u0004m\u0001\u001e\u0013즵\u00053P\tWV\u001a:u\bS-n\u001e/=f\f\u0019\f\u0004>n0bK\u001a\"\u0018.8c\nK=\u0000ϡ\u0001\u0012,\u0015?JPՉJ{\u0013%ήN/n\u001bms𩞥_\u000f_q!;\u001f!\u0017\t謶qծ\u0005\u0010;\u000fDE\u0015\\\b\u0000\\7Y\u001bS%\rIڗ7 \f\u00159CEּܲ\bD\r\u000e/2uu.`\f\\ Ĉf#\u000fO\u0002{*\u0002^ep+뚦t\u001c\\i[FD\u000fZ#ŊWV\u0011jeW%p^H*{\nG^GNd4P*RK%7#/\u0013\u0015\u0019QP9\u0017bާ\u001ejo\u0013\\DU]J)ai2#A\u0011H\ny9-GF9њ(V#C\"\u0000,dF`\u0010[\u0010@,\u0004\u0010pgƜ'Qkݤǒdyບťl<(Z\u0003L%y \u001d\u0005vZk\u0004\u001dj#i$ %\u000f1~\u000f]+gk8`L]ML\u0016pe\u000e>\u001ed\fe8D\u0018\t\u0015\u0014Zb0!noK~\u00008՚Yle?$>nb]6>\u000b+9)M(%36\u0017QmnBI/\u0012NSC(eȩ6tc,\u001dds]/0if-wГЛ\u0014-\u0007J=4\u0001\u0006:':.(\\n*\u001d}\u0003Iy_7\u001a\u0010\fqB\u0019/\u0016\u0003Ҵ\u0012>)\u001b啦(K30Mo]-:d\u0017k(p\u0001ǣqw^\u0014衢r\")BJް\u0017RDדm'5[;J\u0012wvq1\u0007U#ܱJR|ǅ\r\u0012?Y|\n\u00174\u00019\u0016\u0016\u001co\rkJ\u000187\u000bqD\u0016\u0011UB1\u001d'+6\u0010L\u0004~Y\u000fao\u0014*P\u0006I\u0007#\u001cZW\u0004bgd%ĄMXjM}\u000e\u0013\u0019\u000fg\t41d\u00042\rǘtrJ\u0001q|sp\u0018\b},-fF~;6Aҕ,8I\u0005QN}9%\u0000[(\bI\\4#\bM\u0015\\\u001dȪ\u00003(\u001f\u000f\u0014YdE%X({bhbx\u0014\b@i^2*pы#\u0017\u0007_Y?\u0013C(Mh\u001dޤ`6Qf$\u001c$R~\u0010&\u001f\u001b\u0004\r\u001b\u0002Ț609\u001c\b36lq)Ua T\u0000\bM\t\u001aDe79~;#ދܭؓ'3\u001eJ7a\tPT>R|w)7\"Ktk?m`j%;2\nh(\u0007BB\u0003DMA_܄U'\u000bd㛼\u0005\u0002\u0001\u0007h ^YA\rRER*7h\u001d#gx-Ũ\u001f*t%4~s\u001eNXJ\u0005VsxC?Ѓd\\tc\u001e\u0001pl%\u000b\u0011Z2\u0011h)\u001b\u0014\u0014b|\tz-pej\u0005\u001c?z8 -ꎀk\u0013\u001b?\u0016P<_2V\u0007N3N\u001aן%\fm8m}\u0019Df=9\tk֖٫U5\"Q}g\\mkF\u0016*l3m\"D#n\u0002\u0002'/\u001c\u0012DCaUI\u0015^Q[-q*$0Exسڢ>6_\u0002j-\u0011hkG&=3\u001e#\u001a\u0004#VEaP\rZf\u001aI\tsI<єRe4'\u001aO#̽<ɿq\r0ͤL(LUX-\u0004=H;a=\u0001t#@Ky2\u0011'4C/9c\u0010N<i[\u0010{DMoWZ\u0019\u0007)>BpՂ'Dtݬeu܂,jއ4g\u0010\f<\u001f\u001bH\u0017d7\u0018~\u0015ZldGՠD%(\u0010CRKL+[\u0012mE\u0018N\u001ez|^!\u001fN\u0005\bi=\u0001%e.ON\b~Fp\u0010>w\u0005\u0007+\u0003q{m\u0019bs<BQ\u0015R~LpF _\u0019\u0004ved\u000eQ6\nb\u0000\t^\u0000\u0007\b\u0002)nfj1Gy7:\u0003n\u0010%\u0002\u000f_k\u0005Թ\u0015xo\u0004e$:g\u0016ca\t0dM\u0001~h]\u0000dT\u000bF\u000bz?4c%ECFx\u0006\u0005JL\u0014L\u0015u\u001cc\u0004\u0013o\u0014\u0003B9\u0001ʋt2$\u0001tP[(n\u001c@/Mk<\u0005sw\t}\u001aR\u00068g!A(Vk7\u0015D\u00130Mi\u0003q\"wXI;W ]]\u0005\u0000Q\u0003\nW\u000bc}XG\u0018gxk(m\u00152>X\u0002\u0012\u00008XHcD\u0003G$ģ@\u001eU_5wm\bH>U\r\u000eʽn)z]X\u0005`\t[ *zb\bz.T>Tc1\fLMmB.M͹\u000fe)5ŵ\u0016\b);fܤG\u0011C`j\u00075<,1iނm\u0019\u001a\u000fI\u000f\u000en \u000f?\u0001\u001f^Y/3Z\u0019\f\u000bh:\u0004\u0005\"\u0010\u0005\r}t OqM\u0005&}\u0000n?!hl\u0001H\u00028M\u001c2[j+\u0003t@pUdF!1xU\bPPdIM\u0010b\u001f #Zoj88zM1\u0004(\u000f&R\u0019a[]\u0016\u000b\u001bj%ww1]\u0017(\u000e&=ym%\u0003\f\u0012\u0007\u0005֔\\\u0007ewE6995i\u000f\u001aC2u\u0015ソ)$\u0013)-=25Dقё\u0000pc(\u0018[Z\n\u0002\u001aǔ\u001f8B\u0005\u0005߷-pH\u000bQ\be-\"Ћǂ!M)IuFռu{Zxs3j\u001dUd,HPu\u0013\r8ylM&{H~٪\u0012#\u0018#N\u001d9;e\u0015Rt*\u001e$S_j\u000fOD'OO\u0013n\u0002ySr\u0019I4{>&9wb\u0003R\u001e\faxG\u0002L#\u001b$;w7z!\u001dU,ﾂfVN\u001c\u0011ċ\u00125Lz^ G-C6GL\"X1_\u0019JlW\u0005hxi<\u0001<x5*\u000f|RE2\t\u0006L_h\u0001{fVaad)6\u000ehddE\u0013GdxҼ6\u0007\r\u000bs*Op!֯_\u001dJ\u001d\fR`g=j]lS6rZR4c^&7v\u0017\u000eɁw\\?\u001a!\f_\"y+\u0016`+<61]\u000eTV\u001c걁\u0017\u0018i@\u00125\r\u001c6\u00045@v\u0002i@\u001awU\u001ffcC=L\tU`}Wfىj9~w[|,?32>%{B;\u001c~$n\bC?:\u0010KBO8\u001b \rpѝB;^I@S̿Z{Q#LňᑴhIX\u0006o$\u0018x1+'50@gݲ\u0010&ޥj\u000foy\u0015\u0006\u001aBa\u0016{7m/{5\u0010\u0019F\u001a\u0017\t}Hln'\u001c\btf|3.oC\br\u0005Sdx\t-i\u0001& ʨ\r0jnfP'\u000f7J̄x\r'ɮ-Gi\u0011AjD\u0014Ґ<V#2h('je\f^C\u0003hQq멲?\u00148\u0015\u0016c\u0005N1n6F~\u0019\u0003\u0015\tGA}i\b'\u0016Bߎ\u00069+\u001d!*_ۙ?^*\u0010V\u001b\u00039<$\u001c]+˰d8<tM\"\t=\u0004\rEP 7\u0015\u001e\u0013BSw\\<&#~EٵcӏH>\u000e@Iz\b%\u0007\u0000\u0004j\u0014\u0018\u001f@zSV\u0002dx<$\u000f,X\u0016\u001f#y\n)d-&\b2VI6q<\u0005\u001cSeIv0Ij\u000e?)\u0015H\u0015o>o\r}ϕ[ff6ǟ&c\b4\u001aS\u0013\u0010\rg+\"\u0004\u0006;jnP2]NԆ5\u0003n[\nX_;\u001fv\u001c9\u0003+(luԆc궁BqP8\u001a\u0002N#)ODFEFA6XTd0!\u0016R*\\zSEiA:6\u001aJ.\u0006j{}\u0006\u0005ab|ɯ<@\u0002]&z@*k\bzM\u0010l;ԭ{O\u000fFvy\u000e\u000b)\u0005\u001c\u0011a#&;ጢ<\u0016\t\u001e#v]#N:e\u000eC{ҩ6\u001e'Po *C;j\u001d`\u0010\u0012\u001b3/}Dt\u0000/>\t\u000eR\u000f:7'}c\u001e/$eM\u0016(!\u0014\b̖)\u0015X!5\u0019'\u0016[c>M-|: \u0013P-#\u00062Ht&\u0001>\u0002*x\b\u001d\u0018\u001dE\u001bxll\u0012Z\u000f\u0019j@\u001e\u0005\u0011Z\u0011A\u0016J4\u001ad\u0004{Wt3\u0016xN+ݭv\u0012CL\"劾Vc\u0005ɦ+]\u001dYM7BWs^z\u0015a\f^8x\u0001\u000e\u001d{#Z,6LZm\u0018V6f.? iL(MFbaƜq~f*e0\fF\u0018<&2\u0006M\f\u0006\\\u0013a\u001a\u0003y|\bhNۂBs\u001aW$\u0005\u0015H\u001a\th\u0005b\u0012T\u0003(*W.#\u0007E3֦-\u0017aJF\u001a8\u0001{\u001d|5OnNioyT:R\r\u0017;tH\n@_&\u00152_Sl-9}\u0004@6J_\u0010\u0004\u0004\u001e\u0013閡BXD\u001dfaRE(a$Xgӆ\u0007.uZ\u0000\u0003`(@\u001dM)9q*y6dd4:aSrM gVk=w.L8k Q};&2j\u000e\bDgՋ>\u0001.p\r.;KLyN& \u0004Pף߸O84;\u001a@mFO>\u001dA@`,\u0019\u001a\t\bt\u0013Ʒ,\\%#^K'+_5\u0006n͖\u0013]\u0004\u000brr/$oX\t\u0013\b.*SC}\u0000\u0005x&).z6ʧ\u0007w@\u0002w\u000b\\cU1\u001f\u00001\u0016Ma*nby\"eT_M1ZHu;0\u001c+Oe\u001cP\u00036Z)\u000318O5r1X\u0012@\u001c_,wΨ\tYz=bif\u0013'[m[pa9\u0018`0\u0006K\u0015}\u0018drgO%(\u0016hAۯ\u0014>YGĠmdOJW4]nM\u0005d!Y\u0018!\u0007J\u001d*~\u001f\u0012]\u000f[&bB{\u0005\u0018\u000bU_vWyo\u0019O*ǁrsa\u0003\u0002`\bz.:_@\u0001_\"J\u0017\b!ص4`OHk5\u0016Bw\u001d\fTBgW% D\u000f=y\u00133'y\u001aڒqI\u001c*\u0006e.D\r\u0015\u0013#c\u0016|9OBĚ\u000b<쉠c#,\n\u0018\u001e~\\P4N|_6Ο/Z\u0003T\\#\u000fb&~jF\n\u0003=)_\u00077)\u001a\r)L+\u000f<PYpg\u001dh{iֽ\u0016AYۯ\u0010ｊ\u0016;#\fK\rb1e޺A\u0004\\r\u0013p0\u0002R\f%-r1f\u0012j仨:=F!6[2T)\u001c\u00168\u0017fq:k,PЪX盉b@+i\u001acT;\u001eI%+vMoKij@K5}x]\u0006FKnC\bH\u001f\u0005\\$Y1f\\Υ>I\n)G{G|Q_\u0018_L'\u0002}=(^7t\u0010+r\u0015x6\t{\u0017Kn\u0016x'=daYQ:\u000e\u0016J\u000en^Z\u0013:ɫ1\u0017ۦ\u001fQNKqC\u0004\b_ìo\u001bu!)Lʉ0C-\\6RESJj:@s\u0016\u0005SnŌF\u0005WۍƬ Dp\u000eŰT\u0004`kޣ/,HӼۢZ\u001cTI.\u0004\u0005C?nwϳ)f\r&n5\u001a&`dp\u001f^3F\u000b.\u0013\u0003ɑ\u00162@Jp?!fl&\r%\u0001\u0019p\u0002{A'\u0018}o)k8M\u0016.\u0007\u0018PWefZ'\boxfΏjY\u001a\u001ecrl;x9Sˣ3\r坋G9g`$i\u0014a\nDu#!Pp\u0001暝-8V$2)\u001eAA> 2\u000ekQ<\u0012\r扩\u0006ܥu\u0005ܑ\u0019Ů*\u001fxw13<\"\u0011ɩ\u0001WZ\u0018&\u0000΢\u0000\u001a;h.XI\u000f.Wh<\u000ft>h,ڬwٖ7\u0000ᜲ\u0005\u0005\u0017ɀZR\u001aca໚\u0013/*{g\b`G \u00164ء\u0000HG;\u0003!Ƿ'^RpoŽ(\rov18.\u001co@ɋQ#H\u0016?c,6[4?N[\u001dI\u001d \rt\u0012Q\u0001I\u0003+ȥ:69}Ƭ^铙\u001e0,llvb\u0007E[F\u0012'Bn;N񘬄\u0012I\u0003\u0004a\u001eқ\bc|O\u0019B nXk}9᧭Ae!ey\u0006P\f,{)\u0011?N\u0004\u0010:\u0001~\u0004SV@\u001e¶\u000eO\u001bO&\u0002^(\rs/\u0016FF\tG?P(L\u001cVP4VXA$A\t@\u00053y\u000b\u000bJۺ+ϸ]fAU\r3cwYh1rq/\u001cHs98ՍXMjFZmlw0,\bahZ33\u0010\u0019\u0006/\u0013䔑0$\u0003b!pOa\\\u000ftJi\u001fX,Kf+p켦.х\u00182.'l=)\u00164cA)J\u001aPn\u0015yj*l\u0014yBS#\"\u001f\u0001\u001bEX\u0016\u0018yVbégg\u0007-N ,]Nm\u0017Д\\]IX9D,\u001aUq=J2)\u0011t eGbM\u001bA0uEi`hg6\u0015 \u0000U\u0010#\nd\u0007Ү\u0007xc)c=]7=!<[XØʜC\u0000$=\u000eZ@\u0018\u0018P\u0006~\u0001\u0000[X\fB\u000eB\u0003{\u001d\u000f\u0012BSopl'*\u0002\b,9\rtZ\u000f\u0006&F|\u0015xTs\u0019\u0017bY\u0010X\nB\u0005+\u0005\u0015-\nd\u0000\u0014g`\fevJMlK#g\u0004\bN<\u0004n\t=\u001f(\u000fLGb\u0002\u001dq7Æ\u0006\u0015\u0001\u001fp\f[\u0000\u0016!Cd%+7eCQ\u0006\bwH\"\u0017\u0002@\u0001=hW\u0007\u0001#ՀdЫ_\u0018Z\u0000B\u0010y\u0002\u0012\u0000\u0010\u0007Nf .`!\n\u0017\u0001`;\u0011\u0018N\u0002i\u0000c\u001e\u0000\u000f\u0000n)z/as\n7mLWz\u00070\u0001ΕVݤzgPz>o*H93W|\u0001\u0015.׵(\u0011m07Fil_y\r[5G᠙-?KW}ѸE]lXͯ*k6ݏAcQLP\u001e>uS&7仸y5]\u001a{>[\u0019`K\u001dK%UiV'M=X\u000eXªLl*\u001a$E8AKW>̌7e\u0007\u0011vf+?\u000bf&Gw\u0017^LP.{Y|%Q\u000e\u0019!\u0017lt4h~X\u001fZ\u0017d=Em%7Wָs~fx\u0019Y&ɀV cg1C?2\u0000\\X\u0017,&ؗ!\u00057\u0002ՅuGiЀ\u0000nmrRfX\u0004+ WJb&`fT31%\u0005XRH5\u0002D5c_*d\u0012?N\u0016\"8S\u0006ݲ0𖶴ѡD%HD\u0003\u0011\u0015k_U*ңD߇e\u0019\u0014J  \u0011\u0004\n\u001b?9\u001fFo&\u0000b<\u0018@\\y#\u00059sP\u001d\u0007\u0010 p4\u001bmj\u00142\r3\u0006D̍+\u0003'd\\15*\u000e\u0000SzzIh_\u0003h\u0016\u000b\n\u0002J<D_<KoP\u000fCDA>T|\\\tpICf\b \u0013d\bs\u0014\u001a\u0002\u0007;\b\u0001o~`\u001e\u001c\u000fz\u0010DǺ9j0\u001cTr\u0003[h\u0019\u000e>3ƥ\u0006F]Dk1\"X$*^)\fj0S @\u0011G\b\u0004@s@i5RTo\f:wO,0~)\t\\\u0003\tr,bBE\u000f\u0003O\u00069-\u0001a\u0016p\u0004I=\u0004\u0016\u0007$\\ߋ\u0000hW\t\u001a\u0000\u0001X6\u0007voeDF'\u0019 [(.\u0017N^Jw+\u001fh߸\u0012Sܹ\u0003)\\gG\u000fw!\u000fs\"gξ\u0002/Z¨߾2Z,mGyJpI\u0017\u0000yXO2n3\u00056Ek6nO;zc1\u001c\u00017V斢kY,[H\u0000=qt\u0002L\u0016}Q\u000bI\u001c}s=bx,\n,`u$_nޙj'v\u001aa}\b\bGb(X,\u0014V+>q/y\u0001¦\u0015y.\u001fc80^F-{u*dUN\u001b\u0016\n\u001d¾Es_b$1`\b2J'Fk\u000fN-w.)\bpӮҘ용[λ|TS\u0010('\u001fK73?\u001c\u001ejNFz\u001cF5盾]%\u0019^A\u001eK\u000f\u0010\u001dɆB9R\u001e\u0006A'SB\u0019ul\u0017\u0011g\u001b\u001f\u0010\u0000o;i&yI\u0016uBAFA\u00117*OgY>$\u001d\u001d\fҋP@6p\u0018\u001fA50#,_M@:Rzd\\@0LJ\u001e75\u0016\u001bjۡ?\fq\u0007>;E6F(yDd\u0005N'u%\u0004flyOD91.?\u001d\u000f0:\u0003UQ񆺾Ρ\u0001BJ;$yIo3\u0013@\u000fNEpv\u0011DZ[&\n,\u001a\u0005ˮ\u0001\u000e4\u0005/#b*L%&}E\u0001\"'PAlϑ-0C>\u0014qtSHAe \u0002\u0005\u0003K\u001b}\u0014K<Iz\u001eFN\u0017#Mi1ɰ:h^f\u0005Kia5up\u0016\u001e8'\u0015/wO;AT\u0001JU@P.\u000f1HIjwGD?DrnUk^f\u001bRIJ\u0018!\u000e2=hm\u0005ME\n/ \u0017+Γ6\u001fWAIf᡹@a`O\u0014?J.s=B\u0007] wS%}fnGP\u0002\"\u001dG$i\u0002\u001e\u000bpC\u001a@|q\u001bY\u0001H\u0013kt\u0003\u0019%\u0007\u0015N`wR\u000bhEHՀ!^ٛ\u001frt\u0000jԨeAGS!aAށx\u000bSw\u0011}^m.v\u0015o\u000512ͶΨ5K=\u001eq\u0013\u0017f>v\u0007[g ƨb \u0010\nfa-h0\u0000\u0004n\f-F\u0014#\f\r%!W\u0003\u0014LHޛrtE6Nr\u001a-o\\NӅЬ\u0013\u0002y֎N^\u0016zg\u000f0uZĲĺ6\u001fhƤ܉].?~W\f۪Gv($T㜸\u0016m\u0005PrB)L\u0002\u0005\n\u0006cD\t7K\t\u0014\u001ai\noTlA\"\u001e\u0004%\u001bVk!gh\u0015t\u001dZ\u0016\u0015\u0016zȩ`\\lS=\u001cp\u001d\u00158V%\u001b\tL{A\u00159_\u0017\u001cXYYlSt$Y(\u0006l`_eLc̴*>\\VR OHNQp뺲b{B]Ȱ1]\"\u0012j\u0013H;bjmS@ZI\u0003fؓ\u0010FH Y\u001f9pg)B\u0019R\u0016J^\u0014\u0017I\u0012Gy  ؟:ђ\tQ\u001b+V[QhDq]*G4\u001d=L`ǰ9T\u0002\u001c5Ca<ҸƋ;\u0000+.TK^\tZPZ]\u000f\u0018~dىLk}\u000b\u0016ӯ\u0015\u0016Xqߞ\u0011L0I[K) =+\u0013w\u0006KO|4\u001cW,F \bH\u0017CѢ9uV\b|.'!\u001eo\u0015fi\u0002Ia`4OSyNԀ(t\nPSF\u001f\u0016_w\ta)磝\u0016eh\tA )&Xϰ%k\u0013`\u0014_\u000e\u001a\f\r\u0003b0?'$\u0016:\u0000sFy8BDr2o`i:O\u0012;n\u0012\u0002crrHcd1;{h懚N\u001d\b(\u0000\u0015;\\\\\u000e\u000734GW<\u00143\n\u001dLԛ\u0006gz\u0015u\u0018i\u001fB\u0010;\u0018\u0018N!V|I4wo!=ކFs\u0018\u001a2 ]zpHXn\"\u0019$\u0000~G\u001bp\r\u00141\ruEmi\u00138:A>B\u0014N\bc\u0016$}dV_zD2=<\u0000T_ފ7\u0010-\u0004\u0002箐6q>\u001a\u0016\u00042%\u001eO0\u001bf[Bzr0f\u0016﷩4\b~v65X<wݩI^\u0000I]\u000bD\u000bD!yz\u0007\u0019\u000b\u0019\nMB>A,~d?FvbRJr/<L1jJ\u000e\u0002\u0017\boL*r<!k`gEhxBx\u0012.\b\u000e[@suo4nk\\\u0010\u00130_)MK=\u0001\u000fu\u0015\u0003#\u00131\u0016\u0018#\u001a*(%=\u001f\u001ej\u0007=ezWeS\u0004J0464wA.駠u\u0015\u0001U>ڄ@,~E>\u0017\u0016UÕB߹X?sP\u0014\u0015g\rm\u00152w\u0015\f6\u0005R&p@9\u0004)&\n\u0014\u0012ۿ*-P\nw9{/F\u000eygp\u0007O\u00078E\bt\u0006kBtkו?A\u0003EWUHMyQa\u001e\u0000\\Iq\u0014#\u0018+WA_Q*IVa԰\u001c5Qx8\u0015զqA\u0019Tb9\u0004\u0019\fە&Z\u0014s>tDe\u0011k/\"l&ɀ\u0003'4\u0004A@$\u000bef\n\u00142\u00188\u0013V\u0000=3\u000b.\u001eI<[Vu야L/#9\\f&\u0011\u00001qܵ\u0001d^\u0007:nHQ0OzX\f\u000f%b\u000e\u0019\u0001\u000b~\u00197\u00147aXi\u001e*ej/=@\r\u0002r\u0018$؝\u001a\u0015\u000eTd\u0006e\u0002OiL7\u0013Z\bG`\n(\u0017^TCģ/\u0004\t\u0006\u001c^b1l\u0014\"l^a*mB+0$Nۄ\u000b\u0002\u0011rz\u001dD\u0002oF]z܏Ψ5[\u0013W\u0013\u000486Q'vO`\t\u001a\u0012}~{$(\u000bm\u0001IZ\u0000\u0018I?G\n.\u001d\u001c#G\u001b\t\u001c72Q\u0019^f_>OSg!xo\u0004Wag\n 㮡\u0006;3XMkA S&-J-HhpsHȠo?\u0014q\f\\W/$\u001f-WK\u001c\u0016F\b(űZF(̑\u0012@(\u0011W\u0003\u0017\n_%ٞ$8\u0006;\u0007\u00112d<g\u0006Bԕ 84\u0012̯cRNe\u0001Fؑ\u0000\u000b\u0014ËB,mX\u0001S6>+y2ɱx\u000ee$I\"E`y\"<E\u0010ËXyɤ\u001c_\u001ad2\u000b*dRy\u001b`|߮\u000f[{*T\u0011))hWc@@>5\u001f.L{\"j'Q\u00059\u0019/3IaqM\u0014:\r\u001a$f\u0014\u000em_rj&kH?\f\u001cְ~4dA\u000b=P:\u000b\u0016ėc\u001a4ZӦS\u0016hC_^\u0002me\u001b\u0019+\u001f*\f\u0005ù\u0013>w &\u0001K28:TyL\"٢%\u001b1&yV\u000f\t\u000f\u0015\u0013ٷ\u0014\u001b;c:Ґd4<%\u0015\u0002ŵhs=ő\u0014M\\Y\u0015\u001f\t\u0013g\u0010\b\f]\u00033\r\n80\u0006fH$\u0011J\u0000h-$;\u0012(\u0011͘\u001a\u0013A!ivE\u001a:v˯9ݣ1^X@4H\u0018ݠ\u0014*Т_(D\u001dc\u001a\u0018\u0011\u001e\b=u,yAoYYZڣ\u0017A]Jms`PG\u0017ۉ\tJ\u001f\u001a\u0014gg9n<\u000e\bR_Ӄf^-\u00051b'&\u000boLR5 {u3>cG{lRuȭGpRWn\u001c\u000eŦv\u0002\u0004\u0005p*\u001049#\u0018\u0001޲\f-\u0001R2\b!'+\u0006\u0012\u001aZ_Z\u0012m\u0006fR}\u0011qs\u0013>Gp\u00169\u0014\u001dp̆HOt\"h\u0007xX9*VZ\u0017:[3C1\u0006\u0003\"\u001fV#>[0D \u001f\u001e-VR\u0015N\u0007-)H\u0000\bEmO\\]thQT!ro;\u0014pʨ\u0007\u000e\u0018E\rN1\b-6\u0001K\u0005&S\u001aTY䀢⪗\u001e\u0018\u001a㶰\u0003{ny9\u001bMuC\u0019c\u0005ҫPD\u0001p!\u00050\u001e(\u000f\b>\u000f\n*6ʕTO\t9ڍ$D\tv\u001em(Y=8үl,ɺ\ry7՛򮱇@$ȕNu\u0011h$`\u000eCB\u0016 ,\u0004\u001diF\u0016&V\u0001~EP\u0010?m9ɧ6\u001b`O\u0004֝Wx_\u001aKm+k\u0003\u0007\u001fU\u0005)^D^\u001a\nΫ\u000e(\u0013\u001e۷\u0004m\u001d\u0006H\tĪ4[pyM\u001e\u00129.$m*\u000b\tmZ]b7\u000e\u0010;me?\bj?\u000155\t0-׶YǇ\u0002D33-E|q=W6\u0001U(Qo%d\u0003\b,@U\u0012G>\to\nhW._2\u0017i2@E\u0013\rVgQ8eŻ,E\rNvRSA3^t\u0012\n^ni\u0012)\u0002*Pj\u00026a8ԡ\u001e]\r$.\\L~\u0000\u0004t#1\u0019>\n<_X}v+K\u0015)|,,L\u0001\u0017VqTbmnZ#E[ކaA=\u0011/z\u000f`cX\u000bU;\u001f8g\n\u000b=/v!`}.@\u0005\u001c{dlj\u000b\u0003tԊB\n$\u0007lR\u001c+\f\u0002m\t?{\u0013=xMȇ] Az3T\u0005O(z\u001f?\u001an\u0000\u000b̒H\bb\u0014Q>g\b\u0007(\u000b7E\u0018h/nV9e/M^\f}\n~NX&rP\u0011,(\n\nC'6a\u001fR\u0011{~Ls\n_d:\u0014f\u000eOx\nOqw;\bl\u001c\t\u0019ܽH):\u0019}\u00176eE\u000e\njLDjm&,Egz#\u0010;ILPjᡬZϻ#nήM{\n{\u0007ֿn}AJi[\u001bFl\u0015*\u000e\"\u001ex:ƩdnR/T\u0018})|C+lϚ3 C\nyFﵤ`rh@B0NbF0\u0002nb\bH3SпD{\f\u0003\u0005r\u0002c\u0002\u00069R8::>Mܜ%\u0005D#gXM\u0016J 0\u0000gHE[P}@*\u0015\u0010,o\"l8(޺P*J\u0001=1\u001fD14;nb#DD`-dԒ\u001e[e\u001e55k.9bԷP\u0002P9M=3W\u000enj:\f&<s\"zVQl\bȷm\u0010v|\u0014̲\u0012]eHB\u0000W<Ò\u0014.\"|݃\"a\u0014\\\u00172i\u001d*a\u0001@\"0{CDU]-:\u0001q\u0003n#[HHҎ\u001f\u0010xo\u0014&B\u001d\r'`\u001b,m>\u000eww5\u001c~E[ڐiŐp_&Q\u001d\u001b\u0017\\d`\u0003\u001dHO0\u0018E\u0004\u0019qI4kR,\u001bNQ+4&o퇄1vFi\u00149Mp\u001cuP\u001bq.Ϣc?\u00181qW\u000fD?C\u0004Kk0)~h\u0003\bC(x\u0010{*FB0裟$\u001dF\u000bm[\u0004aT@1\u000ejL\"Źb9\u000e`'ſoI3ɂ\u0014@WMAi\u0012t̐1V͠\u0011\f\u0018qbj \f\u0012\u0015Ɓ\u0010o\u0007Z\u0000N}yȅr:>\u001f\fu/@4)}_\u000eu\u0013\u0018x!\u0017=\u0005\u0016?1s=7%4\u0019\u0006t\u0013\r\u0006M?p*'Vo(ǭJq,E$ت\u0011K\n\u00186K\u0004DЇ\u0001,mCWl\u001dBƎK<z]ï2\u0001w'\u000e\\j\u0015\u0019##\u001c9\u001f\u0011\u00180\u0001a\nXelx\u0013b8t\u001f=;\u0007/3\u0000\u0007\u0015py\b;᩟WƮ#<΁\b)Fy MFE\n>n\u0010h$e\u001cɒB\u00057;_YVpyf^b!\u0016)mxԡfr9IsZE.15\t>=ތp\t\u001bzC.Yk7=\u0002$V;\fF~,AǂA6^lӲOؿ\u001bdt/cJ܁״2\u00188f\b3\u0010\u0006!Tkw&>\u001ey*_Kn;\u0018\r{\u0018\u001d\u001eSH.\"n\u000b~\u0001a\u0000ʲi*^z䤘Ӻ\u001e_\u001e:KYDUöEth=ԁ\u001e@'wp@ކ\rx\u001b6\u0014]\u0002|Ȁ_\u0005{$r\u001aΎ\bZlIg\u0014YDQnGdfY|\u0014!1\u0006tA>\"\u001fR֮(ac\u000f[ہ\u0000\u0015f\u0005\u0005(8NR\b\u001f'^M\u0000ɴ\u0019Y(82UK@GV'O-<pa\u0014u#\u0007-!\u0006oc(9W]\u0016e0\u0003\u0018RLY,#\u0011YY \u001fSf\f\u0016[튊My_Z_BY*1 \n4F\u0013хF\u0011\u001b3P\u0013vS&E& p<\u000fS\ti\u000fse?\u00015N\u001dShu\f#D!{͜X,Jx`9M.\"\u0002n\u000bAS4\u000b\u001d\n\u0000#\u0012Hxce\u001dݸJ\n\u0006\nch׬9DW\u0001\u0005\u0014.hq0\u0003ź}\u0003| . hTY܇\u0013g)QXnNCS\u0000>t\u0004F\u0011\"\u0011!5E4\u001c\u0002\u0010 Y\u0016ЦH\u0000_Kul\t\r'\u0018\u001f\u0007aH\u0012|\u000b'\u0013\u0014\u000e=y8~*3U5!@\u001d\nÈ\u001el[L(DQiKbD\t:k\r֩7%\u000fϠ\u0014<\u0007Z7\u0004T\u0010\u001f?G(G\\7ai\u0017\u0019鏡X7foWv~KYC0$9HH.E\u0018@מPG2ӆ50~uc,t0#V\\m\u0015x!U3\t#d\u0011(2cHd\u000f _?\u0014n\r{\\\rypRW\u001ccf<.or\u0010Y#@+Bc\u0012ӂ_̭&\u0003\bBY\u0006䫁U\u0000$\u0003[@/ۜ;pUrF~h\u0014r\u0007?M\u0006\u0002?>y9\n~E-c]&M\bnr=~3˒C0ܯ~&\u0011J\u0003cّo͂bHmN\u0002X\u0002\\Sf'jz\u0017/\rFn`\u0005A1\u001d\u000eji\u001bg\u00123\u0014v\n>\u001c\u001bE,\bN\u0000w\u0016\u001em\u000fct\u0017>eKx,3\\a\u000bTR*f\u0016\u0003uK\u0004\t&V`ciK\"mဴ~Ϊ\u0012x|3/_Iw/F#@^\\xVx~Q\u001dp\nAm\u0014 Q{U%`L\u0015R)^hqDPR;^=Gb{qQg`\u0017\u0010\u0005p\t\u000f>\bQ\u000e\u000f@[0C-B_rt\\O\u0003*l\u0013dRU\"EC`j?\fZn\u00174ƺ25-\u001ez&\u0007\u0012\u0011곏]I{Zi}@|IK\u0003\u000f\u0014s$TeN\u000egE\u001e-zSM(A\u0007Ց[sÔ\u0002,H\u000e%Pp_L8l8-\u001a@#V)Z]\u0000@\f\u001e7[ \u001e\u0016!m\u001b]؈\u0017Zm\u001b1\nf}2\u000e&BܦP\u0006\u0017^\u0006\\+j\n)Mm\ru.>\"+\u0005➯/C\u00015_l>\u0014򵍭WV`\u000f[Ĳh\u000b\u000exyt10|y΢\u0006\u000egWo\u000b)zo\u001aAȩߎ\u0013\u0013)ŷ.\t\u0011P~\u0018w\"SU\u0002h6\u000e-\u0014E~z)#\u0012b\u0012\u0001D-\u001c\u000b3i\u0004g\u0014޺T}a\bD;QpXXK!^\u0001\u001eJ18kR\u0000\b:\u0015q\u00057;N)%!!oY׮d,\u0003-nTc\".\f\bům\u0001l@<*uzTv/h\u0011HSɯz&*uzOTq\u0017/4Q2$P\u0001NFt\u0005њƼb#_\u001a&vb0j!\u00040,H<4eț@ձ\u0019f\n\u001an9d:\u0005Ӯe ]HjK*IC>~DH\u0011*0.\u0016#\u001b$\f>gN\u0013'W\u0015/iE'\u000e>o\f\"|C'7\u000f~\u0010铁j*.\f{\n\u0017-:%\u0018FeVBfq>\u000erY<\t:PA[*)\u001eY\u0006LɅ|oY\u0002\tn.Oɞݾ@\u001c\u0016\u0005Dܟ±8m+AG¤]\u0014\u0000q@Fq!i\u000fs\u0002L\u0002OVODuK\u0012N\u0016#\u0013{\u0011\u0012pc\u001549QC.\u0015q\r\nendstream\rendobj\r18 0 obj\r<</Length 65536>>stream\r\nje-\bc\u000b\u000ew\u0010=\u0000h9m\u001bY\u001b=;\u001dQR\u0011\u0004\u0015`ڳ\u0007\u0001\f\u00144\u0005m%0A\rژ\u0011/a.\u0006x!y\b:/a\u0015̺j>VfbRC>\u001dfî_?t<͌\"S/(k8XM\u0005Ov|\u000b]a(H\f^\u001e]s#F5?ի^I<=Fh劢Nqg(`<aV쁫\u0003\u0017|1d!\u0003`o\u0001;pf'\u0018\u000e­ d\u0015\u0004F\u0015\b\u0001{j\u0017e!BMALp\u0000\u0006\n'&\u001b){g\u0018T\u001e\u0007s\u0012ˠ҅M޿!1筦M\u000b\u001e;3ka?\u0010H3\"Lb\\0Y6\u001bWS+\u001d\fz\u0016}\u00013c~*`|\u000b`\u0017\u0017\u0017D*\t%\u0003\u0013`'\u0011{7afuL(ǳC23S21\tIѷúYB\u0013\u0004V\u001a%\u0007ȼBYt\n\u0012Q\u0003@N\u001ciNO\u0006*j\u001c4\"|h\u001d\u0002H\u0016@NoP/\u0006\u000fjJ\u0007\u0002L\u001e\u0014U*\u0003NoZ7g}{FVc\"\u0014wSn2?,LJ\u0018\b(\u001b\u001fXn*ejj\u001e\u00127!;ـ8Oq$\u0000i\u001cDQ>\u000eD\u000f\u000ebh\u0013\u001fdҁ}\u0001\u0010]|<9ɩ^ jubhL^^Ѣ\u001bή[!`\u0000qBEUe\u001eC\u0013}#\u0018\u000b\u0001Ij\u0017sn{=8\u000b\u0017\u0018\u0018U<\u000fH\u0014kXJ\u001dhZ\u000b\u0004^S. qI#\no\u0000\u001azl֤lI\bdB,)\u0014S*;\u000fͭ9±]}\u0014\u0013ɛ@)y\u0017Jx͖M>_*JɌ\u0019{%\t;y\u0015Հ8t\u0005섢]r(=\u001fK\u001bJQ\u0006BA<ovd<h)9w4yx\u0003\u000f(:p\u0007b\f\u0014vd-2]}QzsUݎ&\u00106Oу\u0007[C\u0016bD\u0013\b\u0004\u001f\u001e\b\u000b_aV%_\u000e\t\u0000f\u0016X\u0018\u0013Y\by^[)dVX|\"\bȥ\u0011\u0011\u0010&\u0005\u0002\u001a7%!sU,*Dl\u0019jtS©ÁX7\u0002\u0010\u000f-6\u001a#\u0013/ρa/\u000elKK)&\u0019$\u0002L\u001f|CXU '\rO\u0013\u0015Lqb ұ\fM(\r\u0001͠RL|\u0018n!&\u000e\u00073Ou\u001c\u0011\u0003hޝ\u0003Z\u001bЏ\u0011CU\t܂^\u0013_qL\r{\u0004+q\u0003Bp+\u001bSx\u001co̸tАJg]U?\"~m2Y/\u001b\u0010CRhB\"PX%R2nؓ$\u0011\u0011vuB|ԔD0Bph8;y?H/\u0015m\u0001m\u0000N@W<`\u0010h>0\u0003]a\fϒ\u001e4-&2p?:IM#]V\u0013\f\b\u0006jĜ2RG>;\u0017)w\u0015A±\u001d(\rf\u0011\u0011\u0002\u0006b1N'ٴiWB\u0014vȅ\u0001C\u0014\u0001C\u0000m(W_PK}s)sy5B.XD\u000bI$\u001c_!BO\u0015zaGPg2t@T\u0006t3cg\u0001>\u0010}McWۑ\\0\u0010C(u\r7\u00152΋'T\u0013\u000fF\u0001,\bE<0sDK@\u000b+$Fпp% z,p\\\u001c͇)/\u001fΌ.9!`v{1j',<֊(\u000b^ѝY\b\u0014\"2tW7E\u000e\u0004^%\bǛ=:^%C\u0019M\u0002\u0016zy]K$y\bS!cVt9Jr\f.St\n\u0015\u000f\u000b>F#>\u0014!\u0007[-I=^z\u001f\u001cO$(8\u0004ӽ0DR\u001b@8\t/HJ]\u0010\u0000\u001aE\u0006\\!\u001aH\u0019ã\u0007b\u0006V\u0013g\u0001-\b\u0018J\u001046iIez\t\u0007aҷ_\u0005#E?Khv\u001cj\rM\u000eg\u0016|J!r_A\u0004\u0018\u0019\u001a\u0003\u0015=ıt@`u\u0017#-&g\u001cU\u0013T\u0018zD\u001e\u0011]X\u001fB-#P{\t<a~зwOx6Cm\u0010VZ=8QV\u0010\t\u0000\u0004o\u0016\u001dP\n=Lc@z6'Zͽ@>0x]Da\u0016aXz00\u0015\u000b\u0000\n\u0015%I\b<*u^\t;\u0016\u0006w9/i\u001aϭq F\u0002A;$Ph\u00032\u0018Ӭ\u0000 *̡\u001fq\u000e!pl\u00006~̓dYj\u0011\u0016\u0000Pp\u001f1d6A#FYd. \u001c\u0016ܰ\u00064B\u001d±㯄vD׊\u001b+}^ݷZʊ\u0016,Ӳziq*q\nxK\u001f~l~ϗHqbQQ'tDx޵͵X_JxDfm\u0011 I<I\u0016kGf֠&J\u001arݥ2\u0018[Y\u000bg\u0000<\u001ec(\u0001\u000bLzq*|Qe̓R\"YLCϕZ\u001eAdʺT\u001f2ͤ\u0005R\u0014h3\u0015뫄eQd\u000fŹ7OΒ\u000f|J\\tPe^\u0000_21\\(H'}F\u0000#}4bk\u0014qV_x\u0014\u000b=fh7yHZ\u000f\u0018dgR#\u001d-t\u000f~Wx}<SF\u0015+5A\u001e\u001cn\r\b7v!QuL0\u000fh#*b\u0003\nOEF$PB UǐÍ\u000fV\u001eMR?\"Ћ3ƨYG:ثB\u001d*ũ嶽|k\u0007\u0016\u0007|\r/7@:\u0001DПH1cd\r\r\\duwW\u0017'\u0014\u000eTN\u0006\u001dY)7eNtJ3.x\u0007$Ib\u0016?\u001a?W\r\u000bMעWH}\u0017<E6}\u001e\u0011VCB\u0003 \u0007rC if=$~6)N99\u001aW\u0004\u001aʠ2B6ܯ3vP,Q\u000bxhv\nܮ\u0018{\f!\u0003\u00112콏[9\u0004~\u001c\u000f\u000b\u001b0,\u001f\u0011݂H\u0012\u0018NiHӉ\u00023LjN[\u0018\\TߚA*:\bi\u001eֆ\rU\u0018۩f3\u001c\"ЄEד=w|#'_7q<`-S\u0017=\u0017؃sn1x\f\u0002ع\u001eT@іF\u001b\u001b-Ā\u0007\u001aP\u0006fw'9<$\n]W\u000bt\u001cꅲ-.N9\u000e\\F\u001dU\u0014l\u0000ϧB\u0006=t3\u0004\u001dfQ\u0015di\u0016\u0019s]!p;l,\u0005\u0018\u001bDǝryb8\u0018\u0015\u0015ݿ\u0013P\"`s3\u0002\u001fH\u000br[^\u001595_J9\u001b?\u0006[ j\"2xm94@\"*/e\u0017\u0000p2gn&\u0005B!\u001a\u001d\\\"\u0002Kr)B\b\r;MY\u001f\u0017tS\u0000S,\u0010,q\u001cM\u0015\u0006\b\\J6x\u0014v\u001e3nVZ7`c\t|}{Yu\u0000ד\u0005\u0002MBZ\u001638زTՃ\u0014\rS\u0019?\u0001\u0018\u00011 \u0000x\u001f \f\"ݲ\u0007t<e_'~4g\u0002qW\u0018#c({Sux=-G\"֓8\u0000Ƽm\b\u001cL_KRxyG\u001a\u0004\u001d7\u001cYCVyA|\u0000-Ū1S[0Q'%\u0002}#(dMNXTßڀW3e\u000b\u0019$G%e\u000f[q\u001a<\u0012l\u0007R䟒;'Sx\u001bbs\u0001~lz0y3$}u\t\u0002U[CBsr\fMX\u0011!\u0017(\u0001r\n6`s(rz,Tn\t\u00174^,$w>{!\u000fX\u00064[esN\r\u0010-\r\u001f\u0014nR詅?'R\u0017.WBl\u0006²VكaCV:\u0016\u0004\u0002FalPU<\u0017r\u001cLT\u001f3Zna,(a\u0013lߒ'8\u0017Z\u001bh1Vi>ioڳ\"0 H\u0017F7\u0005I5,;\u0017Tc\u001e\u0011\u0004ې{\u0015@\n\"\u0013\u0002B\u0019\u0005?HH\u000f3\u001e4w}N\u0010F\tA\u0006\nv?L\u0007z5[C -AX\u0007Y?\"qȼTh-\u0006`@\b\u0003pW\u0014/\u001aL2FdGք uv\u000be\u0003k|wpzO)r?\u0006L;#o(ejCPY=\u0006\u00057+:\u0007ɞyfh\u001d\u00113\r؅\u000bbA(LʢE\u0005\u0012D\u001175$\\\u0005\f\u000e)/܅\u0014B/]\u001ez!u,4\u0000j\u0000\u0011Z\u0016+\t脊δ\u0000,~LDm\"Ϫo\u0012\bƚt\u0006~([.Ph}o1j4dH \u0019\u001d0uD\u0004#\u0006\u001d\u0001\u000f\u0016u[/'`\u001e^{sʗ\u0017&%\n~܆kNHk6\\\"1ke$jPa\u0004=}e/!>}t(\u0003,JxD7w]|Vf4n2\u0015Ћ\u0006 D\u0018Cҫ\nfȱ\u0017~0\u001dY\u0005\u001c+ŀc@rTd 'Sbf\u0002pQ$d1[.\u001f&g\u0006\u0015L\nc2м4|Pg卉m'@>\u0017#NGc&\u0012DM\u0018@j>i\u0006\\3W\u0003|0\u0014f/9鼺Kinv\u001dюz!LK/J\r2e\nm2@\r\u0003p\u001bգW\u001fJ9vC\u001ao*\u0012).g|\n\\XAjA\u0007&\u0007yt\u0018O\u001b\"n}D&S4h^Wh9_ǁ:llDQY\u0010\u0005\u000f+\nf\u000b1`\"9q~\"3S/@?\u001f\"S\u0005G5MwPHu7e2A1/ĹKIo\u000e/r\u0010Vt\u000fd%\r[TCv\u0011C`\u0001>\u00161\u001a\u0003\u0013 !T!1F1\nc\u000ejaG\u0000jٹ\u0016\u0002%N`7T\u0002L>dKYD eb\u001e#>U\u0001X\\Xf\u0006LY\u0011,\u0003/|Y\u0015\u0006G:tk_\u0007\u0011äM8\u0005K2wh\u001e<m&{Tϐ5o\"\u0011$n\u0000g\u0006\th\\\u001f P(J\u001d05qElk\u0004\u000el\b\u0004\u0005\u001c\u001d\b\u0019ڗX\"4\u001ff\bj\u001fMNܝ 6 \u0001x\u0006Dj4Zmdft\u0014\u000b\u000e]-LcHC\fGL۫7р\\2*\u0019K\u0004$ߒ1U+udfk4愣\tYkFF¿\u001d\\x@\r%$\u0001\bMO\f{y_sގo\u0012ǉ꘱A\u0004\u0015\u0000P\u0014\tAɑletu\u0007p\u0004\u0017%KbD\u0013\u0018\u000bVU\rŚ\u0001/=9i\fV\u0012*\u0010uFg\"*hQ.\u0011.\u0010\u0005Q5\u0005*N2K4C\u0010ڽE6\u000flo*\u0018#v!摀ܴ6.\u000e\u0007Y\u0013N\f!\u000bvNt\u001b\ngcjqb퓖\u0013SR{~i\u0010Fi\u0007D\u0015io1\u000bi:\u0002$5U(W\\mz;Fp\u0005\u0002T;*S{\u0011 -~g\tK\u001c[EMAڡlKg2\u0003\u0018bWu\u000bk$|\bw+-kZ<\u0002\u000e0赔w_\u001d\u001f%VK\t\u0010@M-y=ː:K\u0015M/j\u0006C!\u000f\u001fXl0Ɂ+,\u000bSת{:!c턐\u000eCC߃.BT\u0011ڂvL^Nbr«(@m?Q>ƶ~ab,\"3B\u0010#\u001b5N{%0uѕKf=\b[Mע]?\u0011\u001e\u000fx.٭z5\f6\u0010h\u0011$YǏ\fJ)II\u001e\u0005]IQo?\fh.1UB\u0016\bPqI\u001bP\b)Uד\baC\u0000d]7?\n8`u8An\u0011v\"\nX4_Qe\bC\u001b3>k\u0001\u0016/\u0011a`bI\u001e>o;@\u001c&+JЬ*\u0001g:(\u0000\u0010g*\u001bu5\u001a/\u0016lsKQ_a\u0010\u000bμ\u0018X\u0001Wy\u000f^w\u0012p\u0012\u001a\u000eT|.S\u0006>\u0006F\u0013\u0004\u001dҸ#\u0011T_\u0018P.cö\\\bҳ\u0002^(\u0012/\u001b\u0000MI;52gѹXU\u0016 'b،*a/5cˁH7tC7\u000b#0} 3\u0007\r\"-l'\u000b\u001fFrh\u001foqJ\u0017\u001bۗ&ɣ\u0003kx0es?׆yIz\u001b|R\u000f6TbJm \u0006O\r\"}\u001c\u0015.F\nH\u00165\fKtۍGlWGGp{[J\u0001d܀\u00149UdY\u0011q\u0001\nf\u0001o&Čjb\u001eS2,k}']\u0003i*'\u0018\u0015\r\u001cG\u0004jQ*=\u000eE(~[j\u0013@NAk`vKX{߬\u0005qI.B#a\u0019\u0017^]'Ҵ\u0007cY|K`4ĕw\r{\u001252u\u001fa9Eo\u001a8(_,i\"*\u0018z8->j\rXfh\\,˻\baV\u0007F[,;x&d\u0004lPD\u0004\u0010+-\u0003\u0018c\u000661\u0004)0\u001a\u0006;\u0016wLa,\bG4\u0004pB|v)\u001d5Ur\u0011S\u000fQWJQC1f\u001bHKВ*\u0016(\u001a>s\u0006\t5\u00123Vj_1%\u0002M\bD*[ڡ\u0012\u001c\tKx\u0016\u001fR<8oT\r\u00030QJ \u0000\u000evF[\r!\"k hv\f6\u001fy\u001d\u001c\b%і3^v%??VL?1\u0019Wo\u0007V\u001eU\u001e{\"po}'\u0012\u0003 \u0013+U?:Ǻ̕!\u0012f@4\u0012\u0018e};[\u001f'\rC6X\u001b\u0010W\u001d\u0014κ\u000eM`\u0010-H\u001br^rˠcPB}\u001cD.Nn}Ħg\u0018eCޡU \u001e71X&ZA\u001cz\u001f\u001eEr\u0015\u0005TkE\u0017BpzBV\u001e\b\u0002\u0003EuU+\u000ePVC1iws>4#ӭնI)\u0014K@\u001c\"\u0012Hl`ގF\u0013Q5Vu?lUw\u0001Y1\u000eaӊ\u0005ף{\rKHXCJTzypv\u0013g\u0013Hh%n'~wWѐ\u001b2\u000e\u00102\u0017L\u0019 \u000b\u001d \u001b\u0015]\u000ek~>TƆ\u0001᠆\u0014D\u0003f*mS'PFPg4N`nfHT*nI\u00077>\u0001[\u001c6됬\u0004VLazJ\u0007xYR/\u0002'{yīF &\u001f'bgߋ峛\u0013\t5\f]\u0015\f\u0005 E\u0004\u0016n2x\nq#\u000e$=rA\t/@\u0016\u0005<5\u000b|#\u001a\u0015,pA`\\@Ш{\u0001]\u001d`\u000b\tao+@]Pl\u0013Oh2s(kWs\u001f%f6\u0012\u0014;p.ǻ\u000bmhpXV'\u001cF`;a\u0017<I]$q\u0017\n*P=]\b`&azd\bd'\f\u0012˿!֔\u00150t{BiC\u0014&\u0015{\u00150Ƀ'[\u0018\u001b}RX#9O`A\u0019ư\fd@pα-DϞ\u001b@g,\u0002\u001ckcR\t\u001aUVT-r|&3\u0016\u000es\u0000\rJgPK\u0003\f)w,x\u0018!n=\u0007\u0019\u0002\"iP1L\u0018ҳ\"D\u001aM(YS\u000f@6Cxr\tcFZ\u0000\b;Dĕ3pپ\u000bzBIdke?ゅf4p\u0010eG:0K\u000f\u0015\u0019ʌz'o)GOA_*RI\f|K[0u3<+5hIM\u0002,癝Ӡ%U}M$8Ƥ\u001c܏|6m4Is\u0000G\u001f\u0000\fUʘ^\u0002\n69F\u0012t\u001ad'd89(\u0005֏^g\u001e@\u0002N\u00011=0\u0016N^cNv;+,0M\t+\u001aNZՠ\u00103¦\u001fWk C\b#\u000f3\u001a~y \u0007\r\u000f!îm,|:3\u001bt\u0017\u001d(,j\u0016>Y\u0005|?䁝\u0002:\u0003;yO\u001f-;թgׇ\u001a*|\nL2\t?\u0002\t\u0001}z(,\u0007\u0010S7\bo\u001c;twW\u0001m_LH\u000eI\u0012rNM\u001d7Wџ=>i;\u000e|\u00071ϳ6I$[\u0002\u001bc:Tsk|\u0017h\u000bX\u0003YT\f\u0002\u000eM)C}\u0001N%6_A炸%TB$or\bW4\r\u000f\u000eq٤#?\u0018D1\u0003\u00016\u0019\r6\u0006Q\bxeP\u0018e.DOK9\u000fny2]/xw\u0013\u0017Y\u001a5n\bƇ翠\u0000cO5蹈dά[K\u001cŹY(4wTl6i4P{AZ{\u0006o\u000b|)\u0010}S\bx~l\u000f\u0007ebرRAx=L\u0014>\b#tX\u0002G4ykZ!\u0010!}\u0001Yݯg\u0015\u0005ng'X\u001f%(?&i\u0001G*\u0014\u001eٲd\\l9`ck5)tCK=}:\u0003C\bnw)\u0015F-\u0011p=k\u001c@'w\u0002YԽ?z5+!/.ڣQyݍV-ΪT:t_n\u000e\u0001@0y5\u001fJ/[|A D|8y\u001c\u0010\\aJ{HRfCnv{@A:>\u001ah\u0015M\u00068X.\u001bjӸK=drW'\"\u000fnQF\u0019c\u001cayVM\tw:\u0016>Ƿcf\u00035CB\u0010AZ\u0001\f2\u000b\u0006ũy2It!N(\u0012NgϜe ̥'ݥW1m\u000e<\u001b&&b_%Om\u00179%wEPhCs7s!\u0019&\"9+\u0000Hz\u000eoQ\b7Ra\u000eq-&\u000f3͖Ίzb0g^\r\u000bͼ:\u0012t438κ%wsS YY\n5׿P%:`\u001eo/8GefsԛhM]b}z\nX\u0010U`\u0007ll\u0006\u001c\u001c\u001d\u0019i\rCa_\u0000xx\u0002dB;ۥ (30)q\u001e)@\u0007h=%\u000e\u0018\u0012qH΀\u001c|Y?646\u0000xesKCGnLf|\u0001\u001cs'+jA\u001a2\u0019\u0013x\u000b\u0007G6t(~W\"e/<x\u0016ssп_Q\u0014\u0003w^ݲ.mx\u001aU\r\u00177\u000e6\u0005\u000e-d\"ߝ\u0010p w9\u0010[\bj֤B?\u001fXZ}|\u0018&P5\u0017x\"\u000b{[eqp$t5v{lY\u0000mծN\u00145c,pu?\u0011\u0011bp#QVy\u0007䰈̈r_4y\"\u000e \u000bjh\u000b{\u0010YK_Y&\u0017.\u000b\u001eB\u0005QdyUnn\u0005\u0003t}tj\u0014:r-\u00063t\u001aN!廇\u00151\\d61HD\u0001<\u0018*f`_4\u0006JD\b\u0007޸-b)T\u0007\u0010Ec\u0001$n'I>\u0010BJ\u0001>\u0001{\u0001*}_\u0019{rdCTT\u000e>曽{w6N7T\u0014-ٛ[;\u0014{{K{\u00143=5+ʊ\u0018W?{~+nj=Y\u001b*^]~-וO\rJ\u0005 \u0004BrI\u0003%\b$@\u00026%wPu+E56Wv$%/.^^TeeduV\u001dwݖ}x\u001d.]e.:*+hw|͸]7m{6UmTwOe_oD\u00066\u001e\u0010);pQ\u0019[M\\E\"n;\u001c7y|蘒\u001f6\u001abjj$\u0002i\n\u0013aQ\u00177S:ce^rg\u001djs{+Bqqzrrmjrz󦦒ٗiy\u001fܰѿ\u0019\u001a}QyBNDNUq\u000f\u0019Suy~Oqsd\u001c\u001e\u0011u]^\u001aߥsWڱ\u001d\u001f\u001f>ۻSO\u0015yhomxvfoogwh{V=w\\*jzo|t~gloj֊jfozjomߨX-Z7}Vf\u0016\r8\u0010\"\b\u0002\u0018Nj`\u0011%0\u0006y@\u0001 Q\u0003@NN`@\u0016\u0012d\u001ecI\u0018LL\u0003\u0007\u0004ZS\u0016a\u0005q`I\u0006ǲ\u0018 I@D\tR AȳD4DPr,j\"\u001eG\u000639#&iAq\u001aj\"qDHH\u0012E\u0016V\u00131P\u00160\u0000\u0000\bH\u0010\u0000\u00101\u0005\u001aV|O|V\u001cGwLOvw4w77GSݍߝݨ8bk'#~7fwwvk#>6~B[ѝ\u00111f^S^\u0017\u0015ّ\u0019\u0019S9QANllOnmU\n͡eߵu4\u001e/vjUnk򿶶}kۍ^\u0015qUZY*V]DS3\\kO^VI}Eŧ+'+mazfn\"7\\\u0014=\u0006\u0010\u0010\u001cf\u0003fy\u0016M\u0014=\f(jF,2-2ez\n`\u0001%AgggВa0\u0018N08<pzB\u0014%%%DND\"zp\u001aI,ȳH@kI\u000f\bab,gEp\u001c8(XĖ\u001cKK\u0018&{I\f\u00133L%Ky \u001eX\r0L˂XR\u0002\u000eM$\u0015\u0000I\u001d\u0018\u001c\u0014,4\t(R\u000201\f\f01.@#\u0018\u0016\u000f%1al\u0013Y <L%ES4A\u0011\u0004q@\u0018fY\u0016<\t\u000bga\u0014LN,\f\u001ciZ\u001cX.\u0012\u000ebY0A˱x8\fh\u0016H\u0002jx\u0016\u0004-\rE\u0004hP\n\u000bh\u001a\u0010R@\u001di\u0016iY\u001eI\u00105KY\u0011+j\u0004\u0018\u0007i-Cճ\u00078gZH=@Nb4 \u0010 EO(<@xp@H\u0003fA<\u0016\u0014AD(`1\u000bC<ez@BZ\u001e\b \u001eL\u00139X\u00075Xi`0K\u0000-\u0001Y\u000e \"X\f>L\"140\u0016\u0003k\u001c\u0001,8(Xhƃ\u0002\u001dv[\u0011\u0000\u0000\u0002\u0000\u0011\b(0\u0018ŃrP\u0000\u0014\u0000\u0005bP0nBP\u0010Q\u0000P\u0018@\u0000@\f`\f\u0000\u0000(,O\u0000Kn!\u000f)+*,y#\u0000j.p\u001ab5ҁ;\u0013T8\u0005:\u0018փ߸¡a\u001cWhi<I\u0004+\u000b3-#xC\u0018|Y\u000er\u0013T1vG\u0012'A/d?v\r>\ffs<\u001e.\u0019@M6\b+Ն\u0019HQ+cBD\fB(^\u0005/\u000f瞕%\u0002`x\u0019#{vD6B\u001egLrz\u0013\u0019~Dp31\u0006i\u0003\n\u00054)B1,2+$Yx-\u0014UD#\u001a^\u0012p&\u000fe?8A\u001em#0\u0012\u0001\u001f'RD|&\u0006x<\"\u0014\\wP=eD!J\u00189\u0010\nPm2\u001d;\bA[uh\u0018}<Q\u000b'8r\u0007r!*Fĉ۠0rLJ؈{>+8Zp_Bd|ᄗM]ML\u0012{a\u0011!ǫݿp{JⅢAH}~\u0011\u001e\u001f\u0000\u0005_Ӯr5E65/d͊h\u0001h6z\u0019W2\u0016J[\u0005\n\u000e^:*MLsn[Zٓ\u001dqA0|L{ҒH3\u0002\u001e_HgX0Ӛm33ѪIghJR?\u0013ʍ\u0014ֳf\f3yӐ\rL'^5?\u0017,6_,Zq'\u0000\u00051\u0011.\u001bb\u0000#A6s(-?\u001f6L\u0011B6@oLt2]!|Є]tr\u001f]j\u001cqJ\u0018\u0014I6bk?Pw\u001f\rn.?U~\b`=C${)S_)Aa<hgTm]\u001b'׍\u0017\\̜k\ntlZM\u00121)z#헿z,\\m.)<I\u001fԒe.:lG 9N\"aw\u0010\u001b1\u0000!;yx0W~\u0017\u001a\u0015Ʃ\u001d&Ög\u001aDl3/lߴ\"~˃W-E\rJk\u0016};xB\u00013A\r1\u001c\u000b3abWXMk9~\u0019\\8!=RE/\f\\@\u0014\u001c,wNckL\u0013^5*\u0010\u00057M؟:궺\u0000Y\\\nTb2V\u001fF\fi\u001e\u0002'V\u0011\u0011[\u001cv{\u0016@\u0006|@\u001fn\u001ap}I\u0019\u0015 \f,zԥ,hC\u0017<;\u0018Ŀ\u0017ӽq~{ʉČ0\u0011*\u0014\bާz.ΣP7_y\u0003;?HjÖI#F\u00039X`L\u0012^\u0012$#rbbhg!#Hs\rBn*!zW\u00111MmsvUh'\u0011\u0005yeD\u0000 \u0012 ^E(\u0004hۘ\u0017Dl\u0005c̹ArQS\u0011Q2C\u0011\u001d\u000b\u0011 \u001bݑaԄvi΋E\"9˶堏\u0017;6I\\\u000ex׋\ttly\u0016\u00006ԉ\u001a~Dc'5\u001bbeFSzmB*'+,\u0006%BY+6't\u0018|O3I[\u001cC!\u001bD6+\u0004@\"2\rmǯ݌!\tl7`\u0018g2>h82&Z#\rO\u0019#4]@*_+\u0013$\u0001N.A_t.o\f՜od\u0010H\u0003ٖ\u001f'X^)@\u0006\u0006b>\"%\u0001H\u0019XN' \u0001\u0011r{1n\u001dT\u0010A~=grSŚKܔY\tθ[&izb\u0005[xnQ7S\u0001^o\bWM\u001f\tY:[nd_6P\u0001\"Kp`.ӷ\u0005e\u001d4\u0019C\u0012BZ{|߸\u0003r\r܏qX\u001bֵ\u0010O\u0003\u0015~Io\u0014ϞyDga\u0016wxyO2\u0004fٻ@\\w\u000e4Ƞ-?=Ą\u001epEX>5\u0010 u@ȝbe\u0017f!\u0007ftM߻#\\\u0012$}F^\u0002\u000e\u0003zի0},dT.\u000bO\u001fg_x5\u001e#\"S\n5qZY5s2\t$\u001a\u0017ˌfi\u000fLBCs$_\u001b-\u0003`\u0001\u00005\u0013Vc%^֘t\u0000\f_ZXAç!z\u001b&\u0005\u001fM\u0002\u001dNf#\u0018\u001d$O&a\u0012<\u0017\u0014\u001cHop\u0011Nz̖~\"bs\u0018y\u0002\u0007͙\u0007M#Q\u0000j'\u0002tMz1=#^U\bgF\"\u0007~\u0018:\u0005]wyI#50\u0006{EC\\%$\u0014\u001bH\u0017A\u001cE\u0013\u000f\u000bHB:F\u0002㫚\u001c\u001c[0`\u0013-*3wNjqٱ*ҁ\u00038!w\u000b|_m_W%\u001a%;oG)]<P=e0Tߪ\u0018Bda\u0011cg%ko$\u0006qrp.w~C\\$eM\u001aG\u0018HF}]3zp>nU?wXv\u000e-\u0002J\b\u0005lJ.Q\t:J#C+|@B-<n$\u0000\u0015\u001b\u0017\u0001 (\u0003^~\u001dءݷ9ږJkyMPVD\u0006x./\n`~\u0003yGbDK\u0013\u0006\u0007\r ?nh[^\u0007HIR\u0001h\u0001d\u0005E?\"\u000f\u001ea\u0015WyH(\f@6\u001a8?4\u001a!0[8F6(v^Ϗra\u0012r*OoTŠ/\u0010\u000bVeP}.crU\u000bX3[E%p {\u001b\t\u0019,-?o]jﭞu8O>\u000eR\rK\u0010\u000eƱc\u0015\b\u0019[39a=૷fǪ3E86\u001f\u0019Jv}</܀`ĸh\u0001H^#Zct_\u0001wHe\u0005\u000b/\\\u0018OV*_7\n\u000bl+ݵ\u0000#]\u001d,9zE\u0003l-x~\\^&c_c\rmV7^_\u001a7f}/Z\u000b s:\u001c\u0005ugv߱\u0016^D+bns>#P[}\u0011O*in^S/Uza.\u001d0\u001c\u0006(nhxvr3\u0003BK\u0014zw\u0001\tN>ѠQk쫮\u001b\u001a\u001ay,\u0014j1\u001dD[Y\u0001k+@^gb%oe& E\b\u0001\u0003܌XG\u001e>_KW(}\u0003ֳ\u000eKQLg2Y\fO^RyU \u0007K\u0018@K]ݚL\u001bc@c\u0012ϔ\u0006/+fZlc1\u0010_ŝmWs\u0012T='Q\nKy\u0004k`|-Z,C\bũƋ\u001aG\u000e\u001d8ׂӗF(\u001aKg,ȣ P)?b,\u0001ExAB(Qw λOݍn\u000bRmq\u00145\\\u0007Ю\u0010\u0007\u0011\u001b\u0011\u0001{%\nN]L>B\u001c\u000ep`2bp>E-N8R򔾲/l-\u0006\u001eP@v\\:9\u000bGB&6Sų4pXTKP\u001dke\"Vń\u001c<#Lض)aG\u000eX+\u0012T:{GzXtBac\u0000x\u0005\u0001\u0011\u000eD M}1W\ncX>\u0013r\tDy\u0012ӦĴ&\u0012؆\u0007B\u000e'H|\u0013Hv\u0017!,.Gq5#!\u0016YD&]X>n_A4y~ϯLZ\f|h\u0017T.8'|׳QڄHH\u001d\u0016G7.P(D?L煁(`yU)|\u0014'.\u0013+\b4\u0012G}\u0012X8/`($\u0002\u0002&{B2t(p0\u001b4}|,qS~\u0001\"6i!\u0016<~XeO.4UԶ\u001adscN\\n\u001a\u001ci\u0012f\tl@2_|BO_/2[PWAEVHͣ\bQJGugkRA4A\u0004=\u0000H \b\u0014\u0007h-;nE$w\u001eL>-,綌\u0002Jb\u000emj쿈Wna>P\u00032q.SVF`)lQށI7u:ܴ2w\u001f|njj\u001bKe4j\u0017.)\u0014?\\\u0014\u0004\u000bO\u0010oE\b8m+r\u000b)e\u0007+\u0013\u0001;\u0011\u000b&\"'҇-*LJ^ʀЁ\u0019[\u0017ND\u0003o<\\9\u0016\tGڎ\u001b\r\u000b\rTq\u001ax!\u0015.\u0001Z: r0\u001fIu^WwF\u0005\\\u0002cQ0U=f$9y\u001a\u000b:l9\u0000_a\u0003;,\u0001\\\u0001̎>\f3\u001c\u0017\u0002L_Z\u0017@uS\u0002;\u0003U,jj\nB-Z.S\u000fPM~6[\u00021De{'t\u001ch\u0016\u001f\u0002a\u001bh߲*.\u0004P\r}\u0013BzZ*vs\u000e]|wX\b\u001c\u0011?Ɓ\u00068:Yks\u0007r@\"\u0013\u0005#ui&r\u0018ka9\nQ\u0001@tg38cCP';Bڬ\u0014(y8K\u001dАl4e^\u001f*#\u0018w,4\u0004_\u0012BxIME\u0011}BhYJVp\u0003.ѡ\tȴs11@\t\rv\u0011@#\u0014wc]\u000b+Ce]y93\u0013t޵~\u0012ڀ!\u001bp1\u000fΐ\u0007v\u0004\f\u0002\u001c\u0012TuE#A`?Ť^S\u0003Km\u00058M-\u0005\b0d\u0011x<\u0015OZ:\u001f!\rn\u0012Z\b7cwV6/\u001e1\u0019\u001eA\u00135\\ئ##V\u0007yɆ}\u0004O\u001ee\r;z>iC)op,4](\u001144Π|Pω7JOM\u001c{ɿrhur[<G\u001a{j:ka\u00038\t\u0007a\t.ƴTdZJ=\u0005٠B:Κ\u001cr֛q5E`w\fRC栒}/i\u000bKd-k\\B\u001bQ\u0003U]\u0000.ca:[A\"0bxrh\u0013ĝfY\bN,SiЙ}.9@i^h\u0004\\&\u001aRBkN3\u0001n:Mc\u0005XoXv\u001aq.$s\u000betleڝt>\u000f\u0002XWM3m\u0010|6\u001f\u0012\u0015a+4CW[1>&q\u0012Y\u0015>4\u0016L\u00159P\u001e\b:\r%\rzo-\u0019k%܀|\u00034\u0015\f9-M7,x\u0004\u000e\\|&ah\u000bHòDN\u0014]\u0018wRJ\u0012rt\u001e\u001eaC_P/C>e2ngOtN2\u00124\"Jh\u001a@ۛE~#z/皈ڭ\naPN\r-A\u000eys^8AН6\r='ԏ\u0005\u0019Ġ`\u001bm94B\rS:wpzy^u\\ArDXMMw㥼drԻt$<&JI\u0014\u0018.UI~\u0019Ql-6:}M>\fӤlqIW\u001eL\u001et\rP\u0003a;|\u0019H/ܳB1Mz\u0003\u0012F(\u0012+\nւ\u0006\u000f;\nWF/{8\u0006w?Hz\u0003:}۞ \u0012\u001b<0\"\u0019i<\u0002AٶM\u0018qʎԝ\f\u000b\u000fjv'\u0001\u001d1\u001fj\u0010\u001aSJ9N4u$aě'#u[aLPK\u000b^\u0007.˞X\u0010?\f}R=e4\u00149\u001e\"?\n{m?\n<=6\fIxa9\u001c$9Η\u0005j.-a\u0011\u0019C;1:U<&p%]n-P&<s $J~jk4#Lȵ\u0019ldT=ȽٛY_zݣ~!͎4Wa80+o(ϝ\u0018nw(fuxl>ib\\KIsH=\u0007ԣX6\u0013+g\"R\u0015\u0011\f~5ѣ\u0003̝9KPq\u0003\b\u0003w$\u001cDvE8\nQ\nEoKFy\u0013Xf\frX6O>XJX{T.\rEǩ1ϕk=\fao;|]\u0014_q*O)xFKp>\u001bŖ`3Wj\u0017e+ ~il\u00136^\u0006\u000b\u00100\"2M_41\td\u0014/\u001ay8 \rU\u0006#n\u0016u|=\u0003Bi\u0003\u0014\u001c{[2+G޺\u0013\b`W3\b~y|\r\u0006a\u0013d=ܝR%-5DR*\u0001)G2|~^KL#\u001aa\u0000y{ۆE\u000f]\u0004Կ\u0007+\u0005F\u001e0_\u0004 \u0012\u001cj\bgzgL{j»;\u000f\u0000>\u0016r\u0016PQDܜ!\u000e\u0010ryce8pXIlaj\u0016K\u0016H\u0004@1c\u0015O U`y7<cֻa'lv;$p@}lv_9[\u0004(5`3Vx\b#fH\u000ef\u0005\u0002[Z\u0015`L`\\f/pxQpe\u0006\u0014I\u001f9K-=\u0016Xyܼ΅\u0011\tYZKT\fا\u0005\\Mx(\fƏz;\u0015QD6\u0005?ú]ϱ+\\w\f\u0015&\u0002Xn\\=B\u000eLR}\u0007M\u0004>8\u0015:\u001a\u0011D\u001d a䢚;VO\u0010BAO=)91\u0004|DgUuVMFfې$jJ\u001bP#w5Q!Y ^\u0007\u0003\u000br\"Np\u0012q bWeՂYNh`=p\u0015cFGm\u00142LA\u000e\",\u0013\ni\u000eF,U\u0015uDԊ\u001dF&r\r$M\u0007G\u0007WB*l\fd\u0000ҭڸ\"\u0013iT\u0001\"s6\u000e3T\u0005\"\u000f{GQ\\<~=A\u0004.uo&˗|X\u0000I7\rd)\u000b\nQ8\u000f0ygf\u0004zM'n|f\u0004.l\u0002Il%v@\u001em.E:-t\u000fTX\u0015$bqLxAsaffph]4*סxE\u0001\u0006l7\u0006e*'_\u001b\u0014_4'k_\u0017\u0018z٬z\u000e7\u0000rFSW\u0014\u0015\u001b\u0014\u001fK~A\u0011`\u0007/r\fb.&G61PC1Ӟ=HAט\u0012{%@!`H\u0011VN)S5Cu\u000b%\u0017x\u001e`딕X\"\r>h֛#t\u00030pv:e?Ckܓ\f3R1{\"\u0010c!s\"\u0010%3L\u0002-A[A\bDS%@\u0005%.4ciB,Q\u001f*\u0005{\t|ZHu\u0015\u0002\u001ehTʱ@4HWks\u0012@\u0012dYն聭c.SDY@(̛5\\5}\u0012br1r1-7=$\u0003$ęӕ\u001f8A:^\u001a0\u0004+`\u0006\u0000\u0003qoTf]\u0016S^Ju\b<%\u0002m\u001eR\u001e\u0007\u0012(9_ӛ:ANS[|\u001aD\u000bEPm~%޸\f\u0003M+zHL9|Rn'\u001c\u0003\u0000\u0018ߪ2`\f\u0018͐ p\u0006\u0002Y\t0'|Յ+\u0004&|0:ھ\u0004I0D\r< ̅egƒRhh(2=\u0000E#\u0017|=cx,aCJ:r\u000eEA$,s\u000bDPFF@C\rC\u0019^9!\u0003KG{{Y:%t\u0011h$c\u0004\u001d&\u0000u.i9\u0000a7FGs0\\\\hJM\u0011\u001aې\n&Cx\u001f\u0004\u001a[O!3̖\u000e\u0018\u001aC!\u000b!\u0017_\u001c0y&\b%\u000buٴbsvJ36#f\u0018~C5\ndݐ\\pcZV\u0001\u000e\u00011Hh/J-Z\\_<I%e%6[HhA0YD`d\u0005H6Ht\u0018x$_B&+\u0002\u0011(\u0002\u0012i\u0013?zH\ry\u0003*\\]\u0013\u0016T\\E\u0013KQw\u0004<t8ђ,g*\u001c7\nG>U[2ǟIjiu*@1j\u001a%fll\u000b\u0010\u001e\u0019{|3\u0003~TYZ`H\u0003\f\"o^Ҡ)\u0001ONx|!Opc,f\u0011\u001b\u000eX}P/\u0017^a1\u0010o}BU\n \u0014OD\fu-)\u0002~xRˎ5S/\u000bž\u0001ɡp\u0010r\u0005}ias.5\u0017\\!dJT\u0012%\u0004 vϫ.I\u001d:-\u001c$I\u0014y\u0013m1AK5\u0012S9\u000bK\t9X\u001fN!cQf|xR\u0000|&ہb\u000fv:h39GTdk(\u000b\u001bM_ѯ>@X\u0000\u0004>Na30\u0016ݡ!~!Y>\u0000\u0007\u0001@\u000fd/N3q\b&eaW\u0003pt{M<\"h\fB>\u001a}'mҫ\u0012X<P/\u001fQq\\c\n:dU[e\u0015f5`:\u0004X銸LLtV\b݄_/Q;k9'QKۙ\u0005\u0011\u00104BTdBخ\u001d\u0002Ue\u001f_bވ\twoПTL@~max>[-a}ŭ&\b{'fO\u001b:>fCvchxZ\u00149HK\\ե+\u001b\u0018y\u0018dB&p\u0003XE\u0000G\u0016 \u0003\u0002<Q\u0012},(4}\u0003#]\u0003K-%HӋ\u0005c?6@09-ص\\\nrW\u0014Cs$'[ͱZ[I\u0015P\u0015M;W\u0013\\n\u0013nE\u0019V\u0003ə9cRzX|\u001c'H\u0012CGu\u0019q\u0015.%cq\n~΅\u00161\u0016\u0004E=\u001al/:Y2v\\'.fj;/\\eW}\u0000\u0003JhC\u001f\u0014\u000f\u001eꇧdHkIIP7\u0011\u001bSYWݓĪ\u0015I\u000149|Vn)u$\u0016n\u0015m\u0001H\u0007׮\u0002{V,\u0014\u001c\u0013\u0010{(3\u0019[BS'\n~\u000f&\u0013(vʦ]\u0000T^\u0003\f4j~N3m\f\r8>>zg\u0004[6VǴ۴$|5}|\u001cwpؒ\u0010GxV[;\u0003\u001f>B祙\u0000*nb\u000bC~E:\tΝaL\\0ނ}D\u0005a1]z\u0007Ө̎5\u0014\u0007[Lb.OBhZj|\u0011+CɎi#\u0011n*K\u0017:W\u001dDM\u001dL$)s3n?L=X*y'\u00136l$xY-^@zWއZC$v`i@۩\n#n\u0015\u0002G0P/#mK#[\u0011ܭMIY\b&\u0015AV\u0003\u000eo\b6ϡ\u0007\"GDm`cDKn\u000b!F@km\u001co&\u001cn$\u0016he\\C\rw8λ\u000e@]P\u000b>\u001aCv\u0017vh\u0000B]\n\u0003&UI0#{Yj^7a\rYứB\u001bTOgSP1\u00168bZ\u000eS8\u0016<JX'\toVU=Ԝ1&\u001b\u001bB\u001c6:L(\u001bq\u001a(T4\u001d1Ę55\u001fC%l:\tZ\u0014ZSDtuB\u0019<\u000f\u001f8]!E,f'\rnϤo\u0002K_9VoΛ/\u0011j+#\u001c:t-\nJC;\u0003pE6\u0012m-:bmC\u000f;3>B)2cH\u000b\rʐ\u0007p[*\u000bNFY`\u000f\\1BQ\"u\u001ce@reل \u0001k\u0015EgSf!_@׼!di\u0003\u0007M\u001bsିОS<뢀\b`ߡ1ĸ7OIphiQ z\rCbI+/eh8Aϝ(1Hng\u0005Kcz\u0001{\n\u0010\"{o%\u0006\u0016N/BB\u0016\"\u0005]\u0007\u000f/Nn\u0003u_\u0010e.P\u0018\u00124.DͬFu\u001ahrV\u0005G\u0018\u0014\u000eU\u000e\u001aNaq^W<\u001aI:6\\S@+1s \u0006и~m*ڢۋq:-'5c\u0016<jyo\u0005L~mc%\"θSę%dǌkȂD#.\u0004mQw\rxj\u0015\u001cS\u0001\u0012V*='\u0013-1d$jqqU3\u001e ?\u0004֜_\u0010cCx`\u0010G$\u001c\u0011q:>f\u001c\u0015A\u0011HO@sc\u0006!@q\u000fS#>p\u0016q%I>M\bǰB\t\u0012aA/\bh2+)s\b\u0011\u0001F%耂<4U=[~L/5<PV\u0011\u0010;/\u0000\u000fjGsX\u0006,\u0015\u000f\"M@\u0006.xi'\u0019\u0015.v3f8\tW\u0019Ⱦ1\u001aC\u0018\u0011Dj\u0018(8]\rZhɑ;ͷ\u000bbxO\u0001Q0sAm\u0019OO\u0006\u000fK Ѓ/v[s\u0016\u000e{9K}\u0019P\f\u0017L\u0000&Ϡ/vY^P,< f,\nfuI88}\u000b&u\u001aka!\u0011-p\r5&#NH\\n\u0019'!G\u000e\u0014Jߡ0\u001f\u001f\u0019 ,(Pd\u0005d\u0001:\u000f|b+\u001f\u000fAm|9!Z\u0000'\rv_m./χfUz䜢e֓J\"=uUB1\u0005)޹wi\"\u0015H\u000fc2m\u0001\u0006@u\u00191\"\u0012\u0012?N\u0005+1h(V\u0017n*BѐEs% qm\u0016LձDW\u001fXCs\u001c\u001b\u001beC:t3ĵ\u000bǽtRs.P_6\u001di\"\u001dժeQkϯlYOIQf{aS8ʖ6\u0019=VL^gX\u0019pCp(\u001b3-\u0015hr\u0005eC\naK\u0007\u001e\u0000eIU,Mk$I\u0005DQ\u0006R\u001a\u001d\u0003\u0016b\u0007g+,%_Y\u0017_x%PVA$@\fG\u0014%\u0001h\u001dΏQy>rq\u000e:?:6[\u0004\"\tE#IKXݴb'HX\r/pi`(tȶ\u00060ߎ\u0006\u0012\rL\u0016l>1\u000e\u0015Uѫ\u000f\tJ\u0013)\u001a\t,\u001cTs>\u0019LbB&\u001c百ZpT>H\u001b\u001b\u001a\u0011΃s?\by\u0002x#\u0003˴ \tF\u0002\u0015ɩ\u00134LҠ$ %\u001dc,~z$n\u001f\u0006EʸXP\u00027\u0015fq\u0017+{\u0012HT%kyO:ef+6\u0005Կ3\u0004]TW\u0013!\u000eqd;XDpd'~q\u0000L\u0014)\u0017C\u0010c2\rc\u0001\u000eR\u000f\u001d\u0016K\b\fi'\nyx\u00181\u0011,\u000e\u0018\u0019{Dr@-E턓#!@Ñw+9\u000biictY\u0003\u001e,w^ ru\u0011A2t{6\\>\u0015p\n\u001fd\u0017gb\u001f0,\u0000t\u0005?G\u001er&\u0017=KL6fE\u0019\nQ\"\u001d\f<|%_[0m5\rF4f`~6%\u0015]\u001e\b\u0014i\u0019f\u000e#i_\r\bv\u0010K\u0003\u001dO\u0010ٹ3Ob\u001b.\u0013\\&?\u0001rug#ԙ\u0012[(\u000f)èv1f1[}\u0010\u000e1ZߜHk;\u001b\u0005If(?\\MB>0F\u0005,\u0018PO\f\\\tX{W7hxmЪ\\ټf ӎUי,\u001d\u0019\"sUFD<G\u0010,̺P\u001b\"\u0012:}\u0018\u0012\u0011Y&d@RzL^\u0007&C{\u0018+`kR:\u00019\"\u0000=Gր5U\u001b\u001f_4F\r3_\u001d\"&\u0010\u0007\r+\nlWM;ѹKSUmq*\u00013LlH\f4\u001d\u001a1;z!\"v\u001e@&yG\u0003X\u0017\u0011\u0010o\u0016h֏Ge`P`WVǠZh\u000eDk{nk-]\u000f,rU\u001c6\u0011q\u000b@u[F༨b\u0005\u0012L0pGy̬pcZɤ'85i\u001bpC\u0013O-\u0017\u001a{̈x3Pq֕=\u0016\u0010\u0018rpAנ,`oMaREO\u000e1Lۍ\u001eu.WqL3xƺ[d\u001aս\u001d\b\u0011ҸŇe}O\u0003v)ڹ!)=&\u000e^nĞl_/\u001aᢸ)\r;\u0015]\\@\"XRYj=\u0005\u0016@X`tjS\u001e\u0017&!\u0001B\u001alG6xu5-d\u0011Y\u0005j.ފ\u0013\u0003\u000b\u001e\u0003N2(`kTI<<@\u0017\u0018\u0013Kv\bV\u0005\u000b`@YǞ*d$\u0011\u0001nr̲u(\u0005\u0001\r>&\u0018MQVx!iѮ\u001d%\u0001ŧh!Y\u000fZdb\u0007ۢ0\u0001=9<\u0002rB\u001dQqגK\u0013ݨZ?\u0001F\r\t/h,8\t\u0019W\"gA\u001f_ZwDeA[GFE\u0010o\u0016`ӎ#[GD\u0007W\u0013,M\r8\b\u0003E/f[\u0007\u0002{řlb\u001b\u001ax{\u000buDHTiU\fJ<mWR9Y\u001f\u0012P\u00120'\u0016I.ˍ\u0004\u0014tbu\u0019\rIn\nEa\u0002\u001c3\u001be\u0019\u001cJcHp\u0004<<\u0018\u00043jS\u000bq\u000b\\\u0014h\"o4;ٝnkmohtѬ9!Ka\u001cj:h]KPw@V2»\u001b<3mdm8pv\u000f$.8@!#u\tB\"\u0016L@OvwZ罬ǔJ)\u0012@PC\u001e_3$P@\u001877j/+VUMƫ\u0016\b\u001cu4G߹KW+\u0002\t(_ny\u0002z\t\u0010M|l+յl\u00038K]2\u0007\u001fPj\u000b렢ȲraH}\tu\u0015\u0006o\u000e}O+͉Q{)\u0013\u0006}\t7\u001f\u001d7JЩEU ש?rrh(u։҅T.?t0(q4O\u000e:*\u0010+<8\u000b!@\u0015AF4qS\u0001&ao\u001f\u0002P>2{K\u001bס}0m\u000e\u0000ER\u0010\u001fy\u0016l=`5.|0WURw\u001a@Li8D\u00051.<Q?ՎtI\u0010ޖ&G~OyQ_4\u0012\u001a}\u0011<#q{b$?ܖ񌶑3f\"Wov-˳ZcW\u00136}yEhH%P7\u000bL\u0012@,qYK\b3\u0001\u001f^\u0005R8Mi\u0015{E\u0001\u0000'v}\bRȫi>>ھ)Hmٻqm&>X\u001e]+jT-@w_\"2\u00142A\u000f\u001b\u001dw*\u000bGzd#2}\u001dl\u0012}#r4.\u0017\"\u0014x\u00023\u0003\bUx>ZVWẒb䳑\u0014Vy\u000f]ll\u0018s&#\u000b)Bf\u0003r\fփ4O\f\u001deW\u00061\u000b35A6H\u000fɨᗔO\u0017I\u0013\u000e~|lU\b\u0012q'\u00013Z7\u00110sƶZ\u00162T\"M;)\u0016'\u0019cy\u0000p^I =\tP!ߍQ ?ùөNJ.GObtY@1'\u0003;qS\u0017M\u0003jGҟGq\u0003J\u0016\u001bxL5{ѧ9g\u0003\u0017\u0016\u0014W栊=`2K\u000e\nN\u0003Dd8H i@l\u0003)ˇi\u000f\u001e*QЮ$!6̑\u001a7MUow)\r3l\u001dRXF\u0007\r\u0004D\u0012\u0001z\u00179).H&\u0006\u001fp\u001b_\u0012L8I]W\u0015E\"%%%\u001e=\fx\u0012)!\u0002s\u0002b\u0002ʢJ\u001aD^.bp%ur#RA$fiT686.ɕD8\u0014@\rR\u0016vn󹇷ɺfFUPÜ\u0011&\u0018\"_3s\u0012Q\u001b߹ۙJn䟵etW$\u001959L\u0010ص\u0010\u0014\u0016'ΆW|F9Ff,[EA8j.Ժq|ּnwmifkUچrٜYˣUTAK2\"U6lV&_+^׿2R]Ɓ\u001c\u001e%0j\u00109 j[ܛ[?f<f>4-oóE&'\u00132\u0012H\u0006\u0002I\"IC\u0002$\u0001\n\u0004\t\u001e\"TD\u001a\u0012<DT$\t*$\u000e*\u0014h \u001cd*ߛf(\u000f\u001b\u001d^ 4\u00192\u0005c\u0002DB\u0001#4T(@8p\u0016PT<8pV<4\u0013I\u0000\u000e\u0005\u00034\u0005\u0007N-\u0018\fB\u0006p C!\"``\"$\b\b\u0000B\u0002\u0005\u0003\f⁀($\u0015\u000f\u001a\t\u0004\"L\u0000\u0001\u001eD\u0004䁁\t\u0006\u0006\u0013i\u001e\f$1YDA\"i\u0018E\u0002\u0012㡀A\"1\u0010pjd&.\u0018\u0013\u001c\u0017\f\u00048(\u000e\b-\u0018K\u001d~u7Ѫ^\u000bƲ`,uk\u0010zsb\r@3\u0000F\"`\u0002DB#\u0016\u0016G88dڌXP\u0011@\u0002#\u0000$\u0010\u0005\u0006\u0003AAp\u0014X0&4x`<\u0016ǩM`L:\u00053MEh\u0012\u0018X0(?4,$\t\f\u0005\u00012\u0000H\u0012P\u0001i \u0011\u0005\u0001p\u0006u6}$qX\u0001T\u001cB$\u0003\t\n\u0004\n\u0006@\u0012a\u0000<{\u0004R\u0005c_\u001d[ָv;!\u0016_%kxZۍϺ+Q|[T-}eB\u000bDi}#YS=6\u0010ֺ֗\u00126w['lzq-\u0012_Ur*cK\u0000ľ3\u000e4\u000fk8ԪۺZ:]nEԺUӪNBa\u0013`q\u001b7fv\u001e\u001fbr\u0016&/7B\u0014ͺ\u001a˦ȼV3F戅~;\u0006\u0006\u0007V\u0006\u0012@`\f\f\r\u0005 8``x$\u000b<\u0018x%bBWU*Lq4Lbi\u001cTP\u001cpp>Ϛo{\u001c43\n^Ǽz~}>fMNz\u001a\u0013\u000bFo\u001bzgzb#[=@X)r{+̤}]\u000ej;\u000bbwWpUyBlk{qKjloթ`4*\u0013Umye?k[JC\u000bF\u00035\u0010\"\u001b\r1\u0012_P@\u001a\fC\u001a\rԈXX0\u001a\u0013\u0011\u000b\u0011\u000bg\u0011\u000b8es\u001e⹃e5/\u000e4qs-Se\u0004\\\u0017\u001dԃFccԴv\u001a\u0000̏\u0016\u0005\u0007Z0ǩ{!c\u001fމkm\u0017jbcNwt6q\n\u0010<\u0014@A3\u0000\u0004\r\u0010\u001e\u001c\u0005\f\u0012(8\n\u001cD8@\u001afV\u001cG\u0003\u0019)/\tjS\u0010zfR(u\fFD4ՠVrYӑ\u001c3\f/iUН!A\u000bS*r*ā e\u001c\tZ8\u0011-8nY0-qJUD4\u0018JMiK\u0007\u001c0R\u0018Eܡ'Xc\u0002~\u0012+\u0011i\u000f\rF\u001d3\n.>\b\u0011b\u000ep8\r{g谽\u0015q1ѩ::k=.5T\\x*4\u0007X҃\u000fU۲U/˻)P^\u000bo6PS7)ksM\u0011l{zaf/u}ڷm-f>A6\u0005cg\\voo`,\u000eէYۗw#6\u001e\u001eakZ[ajR;<Wg*{VD\u0012\u0004,\u0002cYc'<\\\u000b\u0006\u0007(\u001f^0\u001a\u000b\u0006ɄO;[0\u001ai\u0013\u0019\u0005!\u0016Ʃs_0\u0010<Y&=K\t\u000f6\u001e\u0007V\u0015(\";9d$ќ܉\u0013XvJukV2\u0013K(2\u0015\u0017w/\u001bkۻwhk:\r\u00153Ӵѻ|Zye\u001dU-jڷM,cK \u0017u.kw;ia3[U˖\u0015kX\u0016n]euӫòyX\n}+Ov➷M_ﵫe\u000bW_\u0010(۞[we`,߱k[YɷnsmY2<\u0013ߝv~9\u001576{{)s{&3kLX\"6j>Wmv,N\u000f[v]v\u001d4a3گK]Y߾4\u0015Zu\u000en\u0016[B۪5kiZ\u0016\u0017Y\u0016_\u001a[[!.\u001bdݶZTtSnrUjT_LwN_kGd^3\u001en_5JX݌P_\b/wXc7b-\u0018\u000b\u001e+v:\u0019ͬW5\rLPOX[ȗL\u0007aƨxfUXݩ*0ﲲsU\u000e8\u00133ac?]\u0017'{Wg5\rQ\u0014F,\u001c}\b_UOL.̻Tt\u001cz}\\Iϭw\\flYmgݗ#'cŧ8=\"IQ\\I-iafV\u0001\u0011\u000b\u0011\u000b\u000b\u001c\f0rOe\u0013ʧz\u0010{Lq\u0001'=*3\u000eJپ\u00074\u0000\u0004\u0018MXIP^\u001bY9\u0010%j\rK;Lo,4$YFȑzHQ\u0010\u001dS2H\u001c\tR\tr\"z+\tb\u0012brWI1!\u0016F63j\u0005}dRc֍\u0011Qښvtr\u0006M\u0010\"b\u001cIN*2^U-\u0001t\u0014,\u0007\u001cs\u0010!\u0002\u0000\u001c\u0012\u0000\u0000(\\\"\rDBy\u00149\u0007\u0014\u0000\u0002p<($\u001e\u0014\u001a$\u0018\u0014\f\u001c:\"\u000ba8\u0018\n\u0001`0\u0000HaPcQj+{I\u001ee/d4&-\u001e\u001e>#i\"\u000b)\u0001~͒\u0017STR\u0019tue7paNU{T\u0003;pŪlz+\tNu\u0015\u0006娺طƆd\"\\\tE]G\u0016qF:>Ŀ\u001f`԰\"D\r>Lv5R\u0006ɡQA\u0006_0N\u000fYh\"}Ѳ\u0006\u0003KKP\\\u0003ٷ\u000f\u0007cJ4?<VϱQ~g\u0001\u001fY5\u0015mo\u0019/\u00176^&*w\rZ\u0002@\u0004y\u001abI8_k\u0010:~I]QƜRuI*c@j#\u000e\u0005ȦśE\u000fd]\r;b\f!l\u0019E\u0013v\\FO\nt;\b;m\u0001\u0004nz\u000e/rPۻ闵\u00142p H\u001a+cV+v osN\ta\u0016sT+{Z\b뱯F[gwjѢ`n9]\u001a2Ic\u000b/XZ\u0019jr]lǤhM\u0004&z\u0015P2\u0003;fp\t\u0014.\fnC5ZĮ5#{N;Mv\u0006VZ5<ak:%ĭbvZ\u0010rBsrJ\u0016Q:b;9GJXW\u0003'2nzc\u000e{gSS4\u0010.cW\u0003\"u\u0016k\u001eJ0Ag\u0000b;p\u001e\u000f ۓC\u0018⮕mJR)yQ\u0000n-;ّ%G\u001b/a'\n\u00068ծ+\u0011=tb&Kk\u0001\u0003@RS~k\u0015\u0007d\u0012!e嶞*H$6P%Q01\r^zh\u001e\u0019\u001d\rpWJvh3\n\u0002\u000f 9\u0016d಩omʮ8F2\u0017#\t~euq+\u000bA\u000b?\u000bʡ\\U!\\%2׈VB\u001cc:Y煩\"U9Qc'ˬIKc0i\u0005v\u0013Um̴-M\u0012lCoѭK/X<7\u0019 ';Uħ\t%a+ҕ\n\u001b^Kɞsv ͅB11،\u00162EG\u0012<C~!\u0012Jud1\u0007k7f\u0002̚dfy\u001fl.!>!\u0004+l\u000bj*\tX?Vm8{\u001b\u0012EpgNnʋH<^:&\f+FUW\u0014|钪WN\fnrN,9\u0000=\n^_\u0005~mƴ\u0014;]\u0018Vw(ǈ6_\u001a}DdBȝAI_\u0013\u0003\bLDĞ&v\u0018%l&\u001d)&1\u0018Ô(&jJs+\u00158\u0003\u0016\u001bSIH\u0019n\b8\u000eQ\u001eU\fL-=AiڮI%I\u0019ER\fr\n2`GT\u0005z9R\u000b[p\u00121)YuA\u0013\fF!6UV4j1\u001aerRH^\u000b6(\u0003\u000e\u001fC\u000b\u001b\u0006`E@-\u0001\f?«C)`i\u0006Ż\u00151+j\u000b;]>L[,\u0005U,Ǳqjj8\u0014ĳh\u0005{mA/E\r/m\u0017\u0001)\t<yi\fUC|\u0006;{\u0010.q2~/0\u0012+\u001e(t\u0003h4\n]\u0002H+BP\u0003X#\u000e|1hI\u001fDQL-M\u001aP.)\u0013aQ\u0017Y9({/A\u0001A\u0018TlLb ;b%\u001f{G\u001aBƟ]D\u001dޓ\u0004D#9{W\u0019 }cGJ\tEB\u001ef8*ZguΗaކ\u000bY 4%0\u001b_$jFM2tp(W\tJC\u0006E\u0011\u0013Ւ-d\t.rKg(\u0011\tJJBC TSA&\rE5'TQVIAĢ\u001cA$0ls#b}\u0013D{\u0012kK7Zh3bDG\u0012\ts>Z\u0014wܕOEgpª\bko\u0015\u00063q |3=\bq/Q_?H\u0019\u000eq\u000b|\u0012cSS\"(\f0@\tv[\u00012I mW\u0007`&j\tG,\u0005\u001bUe?\u0016: +('-eS4\"\u0018$h|i\u0006Љ3AH`ݐH\u0017`\u0010:ܜ0\u001bGo:JNfc\u001an|\u0016X\"Dg \u00181=\u001ah1\rG!%7vb묅\u0014`9rwWe%{\u0019ˁz!YStp5;\u0015xJҬ\u0017\u001aUw\u0003\u001b\"\u000fJ\u0017|bPT\u001aȞ\u000e\r.?lNcɷc߉\u000f!X\u0003x⊼K%;|/T\u000f\u0003dP\u0000soq&vpT4f2:68\u0015.l=nI;-DEc#fZ7l4\u000e8ժ;\u000e|Uܡ+2G~~sC\npe\u0005Wt4O\naN\u0005C&\u001aN%62\u001c?lXr\u001aWA`>~\u0016JG}Xox\u001baUj<mJE\u001enS)Gg^&+qdTܠm\u0002vR4\twZ\fIٶhм0%\u0018iX5[\u000eX\u001d񒫕D\u0019\u0011q%$\u000f\u001bS2T\r\u0013$2S\u0001RЁ+\\\u0013{j*\u001aCPe`:Z!Y1nNFh`[TIf\u0015jnN+\u0005Mk#-U.\u0004(Ws?U\ri|z\u0005.2\u00008▰|@绡 0]}a8PScH\u0019fImc-t\u0014U\u0003/\u000511qU\u0014Vy\u0004>\u001e\u001d׺9\u00052G\u0003`\u0003I+n菌v5G ȵ{ܳsrRu\u000fW3C\u001b21!)\n&T#Lh%a8qc,k8\u0005;Gt@\u001a\t\u001d\u0007ʤv>a%z'xр~лz\u001a-\u00175\n滋0@\u0012}ĐѶW!n()l\u0006MTe#\u001fbr{<䵏\u001c\u00175{!\u0018Fѽ-@\u0016\\ogYW H\t\u0002}\u0004 -QmB\u00142\u0012\u001bqDY\u001cf\u0016fd<ⴈK`l$&\b*BKocwmO@\u0007& \u0015\u0000^Q\u0007\nphbs\u0017!&fC{ \u001f4 -b *\u0010\u0005\u001eФxB~l\rI\u0011\u0006*\u0006vԫ>@>\u0000\b%\t\r4Ͻz%̎Vh\u001aOpOL|Mh\u0011LU@Dm\u0019Z\u0019V?\u0002$\u0011\u000b(]\u0005m?G\u001c`#\u0007X\u0001;uRq޴\u0017$G\u0002HH^Ym˿My\u0007go)!-'\u0000F\u0002D`٦+<\b\u0015ڞ\u0001\u0005\fG\u0015~ M[F\u001aCqt0u&b4R\u001f\u001c=*姅Rs\b2O\rlH}f\u0019j@.)9<ݗE\u000b9jl,A\u0007m\r\u0003㚒wCdA&\u00022+켌;-pӿ&E16x+y\u0010(%>.:&yYqfJe\u0003+\"\u0002[I\nGm\r\u0013 ʜNU|#p슃+ Ny\u001a<\\\u0016\u001dvU\u001c`þ&TDy]\b8\u0001G,\u0013-\u0014h5k:\u0016õ&Z\u0015\u00102:1\u000b\u0001%@~\u0010JE\u0017\u0011jp\u0005Hz\u00113_`eYi`C#iڍYɋ\t\u0010\te\u001d\"\f\u0001Y\fӉUzR{YD\tY\u0004F!m&S\\>nFcR\u001b\u0012\u000e\u0015\u0005T\u0004Ah-ח\\zf\"2`!\u001b}$\u000e/(\u0015P@j\u0004erg\u001a[Dk\f\f6\u0004ǁIv\u001aI\u001bU|^}\r\u0010~k\u001d&RX\u0000\u000b{xCNi{)`\f'a\u000b\u0005\u0010u^G\"o\u001bh(ڪj-xp̧f\u000bg\u0014ag=\u0013t-'\u0017OCD\u0015lpl\nuF\u0000D)lyKk.\b1)Z9]\u0017\u0007\u0000\\\u001bO\u0013?^I-`\rz\u0004;H'pJ\u00123~\u0014AYʓU\u001f\u0000\u0016z\u0005cj\bQQ鍥sE{v'Ǐ\u0013\u000bj<\rM\t\u0006d\t`p\u0013}a\"}5xݣ+\u000eXǜEOYЇH\u001a\u0014\u000fd4Ia\u0013Q\fD,M֞\u0011K@\u0003J^GIP,cɀٱX\u0017ΠDP]\u0011d(WBkz=LƓ\u0014Zpi\u0014fm˜V\u0004d\u001b\u0016W\u0005[\u0015h:zՍ=\u0013I3s\u000bq\u0005-`4\u0013.\u0003cQx\t6\u00046G!72(\f+c\u0014\u0004u\n\u000b^K$.\u00121HRicw\u001d6\\J=j=/PrDD)\u001dvQb7\u0013FK6爈`\f\u001eYlȀ\u0000 \u0003-*ryքG\u0001.\"?B\u0015%W?8:\"\r\u0019.\u0010oB\u0019pjD{aSY\u0002!Җn8Xv?P#t\rckN\u000bsIڹ\u001f\u0013k~Q\u0015x[\tJá1\nCep\u0019\u001a\u0007\u001bׁ^T9Jǜdl P\u0006::\f-'\u000f5+'\f+y+u,|\u000eUw\u0016$\u0013I+Ԋ$:ɰkx\r\u0018ڔ#A\rtUk:V/\u0006\rgt;o\u001elGcjI\u0000Qxdu[B\u001erIM\u001a[\u0015sݚ̎qȝ-\n#\t\n\u001f\u0018\u0016)\u001c3\u0005F[ـ>_\u0000Xn,\t1IdZ\u0012vjr\u001a\u00032ytUv磢U\u0003A\u0012eLw^[˸Llt\u0013r\u0005~H\u00117YB\u0005ڇ\u0012[u\u0016;>p\u000f\u0006㰵\u00105s_&[7ܺ&$*ezuGMl^Zdf|ױo\u001fQ\u0011hS\u001a8\u0006\u0000\u0007\u0017Znt 1͜(z$pBEX\u0018n`(hB!j\u0006|<%[zeσ\fJ{WU%\u0012\u0010[#6P˴AnYs\u0019̪3ndlhc+i/G\u00144W&\u000e&{x@|W^7E\u0013ĶyfBPT$ \u001dPm4QJuH\u000f#e\\k/v,\u0010\t9W敃\u001drc)kNnzrJM-\nFfXǮt\u0014e3dT:Iǔ.FF=0qW[\u0019\u0012jM\u001692^\u0007\u0019󯪰(A6m뷱˛ i9;ˎ\u001dgB\u001c{\u001ed\u000fD~i\u0004l\u0001NĎ2rF*\u0003w\u0001r\u000ee;-g\u0002sbԱz{\u001dkVO\u001d\u000b\u0014<:ǟ\\1^c?ayoUx4aDP@B\u00139J\u001cw\u001a>ۦ\u000bs\u0005w\u0011r9\u0013hr*|4\u001btM3)Cqy3(dl4ʿRNV=~-\"}:ybÔ4b\u0005\u001c1A\u0018=˻ח\u0002\b.\u0006@o\u0012`%\u0002bR\u001b\tH>({?\u0004G%I7?<X<y\u0014\u0003-\u001c5o97J\u001abBQ\u001d.$E\u001bۭ7\u001b[Sd,J:\bY\u000b\u001dl4KG\u0002ݧ$\u0007~?V\u001a\u0006\b`LX\u000b\u0006\u0004_)wA\u0011jO5IL4\ns7\u0015ATz\u0003\n\u0007aI𿵳\u00024\"C= l\u001c\u00066Dn\\eܓ;?Ef\u0012sT\u0003\u0007P피\u001du\u001f^r'\u0015\u001d\u0004@ͦ\u001818\u0006\nCͺ9\"p\u000bA$L\u0015P6&J\u0007\u001bi|4^F\u0015QÊv+O\u000eQJ\u0018PJދМDLD<k1_ T%\u000f\u0019\u0004\u0005fP݋\u001d\u0014p%=^\u0014\t //\u001adc\u0012\u0011\u001d0URFVx~%/DM~\u000f\u0015\u0012\fN)>ɻ6zc~2JC{ESk\u00144\u0001\u0019\u000e\u0012\f˥\u0003B̩WӚ\u000e\b\tN\u0011^P0Q\nS?kt6·.!pTݎ`C\f\\\u001d@7JW[f|\u0002KrN\u001e4O\n=L[c\n@\u000e\\\u0014<=\u0016\u000bЇP3iRf]\u0013/]\u001d\u00004ÐT꫺oUEu\u0004л(\u0005\u000b\u0017g\u0002\u0007\u0003K9}K\u0011\u001e6dĆ\b\b@8FABZ!\u001bчɫb\u0004_kCG\u0015~0򺿐$倗\u001b\u0007d*x\u0011H\\\u0003z5.GD:njq&YS1QSh\"Ge.X \u0018NpѬ˚A0>R\u0003\u0019UTN@\u000fE\u00125߱WSĒdؐG||v|!`7n\u0001ǀ%&sp]\\w?d;Pt\u000ew5Boϊ(L\u0005W6\u001eXI&*fu\u0003-v\u0005a\u0010\u001ed\u0011qg+\u0001t{\ba\b8(\u001f\u0000v&\u0001\u001d\u0014\u001e$\u0012@U@\u0015AO\u0010UH\b\u001c&\\璝-\u0011\u0004\u000e\u0002S2F\u0006\n`fg\u0001Iz\u001a\f\"Ɨsm7S槤$J{`/9Y\u0014{g\u0004\u0004\u0017\u0005%\u0001ykņ\u001bQ\u0004]D\u0011tqA\u00194Q\\\u0011\u001c\u001e\u001a0\u00009<0d]Nngs.^{|oo\rc\u0010QmDy,gB\\\u0002YЄ\b\u000e\u000f\u0007\b&AN\b\u0005FDL\u0011'B\u0004\u0018ؘ`\rL \u001c\u001e\u00180)$ApxhU'D\tsn٥&sf1;t0l!pxkKMd\b\u0007\u0005Ld.2_5׎\u001d;d\u0011\u0011ǎE `\ta\n0OT0d!.\tF`\u0005\u0013ªr(@\u0017`\"\u0017(cTN\b\u0005\u000b\u0001L\u001d\"R\u0006PU'XRa\"\u0013B\"B.C/'\u001c\f\u001b.\u001dˉ.\u001aÃ)`\u0017ŔE(\u001eL\u0007đ\u001c\r_ecm.n6݇rB*\u00160&T;ݮ6(֗0;u\u001f\u001bck\u001b\u0015\u001f~֗^f\\i+zę\u001fi?E<ou\u0013x|ۜ\u001bfȚk;{$~၂-1ۭ⹶\u001b#z\u0012Z^[<W_oXpָ\u0019ww~K\u001al\u001a\u001e5)kn}~]Mmش6k{֗\r\u001d]#3v\rN}lW֖8S\u0011\\\u0010\nfY咩sbX>v:e\r\u0019@ddn0zs1g?:\u001f7m˦\u0012l31/jk)iMnMs{Zw>TodJ]rQ>m1}\u0017\u001b{zȒy;ԦBP=ʒ}&a\u00127\u00173}\u0019)p6od\u001egFȠfso߼O\u001b7n\u0017^~6\rfJ$(y0Q5;[/sM?{wxmvxRewkR\u0019_s\".K\u001c\u001eD^[\u001ewkoݼeLo۞{\u0013?Wq=^+2F쑿\u0015Z?sz7\r\u001f%Q['vV\u0001~\u001a󾆹\u001a;^Cl\\˪\u001ek^tE|ǔ6>~߬y*/dTTgTnۜp\\f[{FOQSҮ5{n[kΫwUTOunq%\u0010^mͶ~m(\u0019i\u0015%bH\u000fE\u0017VS57\bQɆ\u001f7ekn_k>D\b\f(9653淮T][sͧzɑ\rnNuo9;\u001bcRޱAּVy\u001a;51OS7~7>όr_smx̪M\u0013]~r3_=ޝlyyʎrљ\u0014s\\byf5mTٹy\u0015\u0011/Bkt63m{6)1:%0: X%&\u0018z֏~߭\u001d^KLm\u0012\u00186576ޣ\u0004c;֞[7\u0001]\u00029&<o痛b{f\t)\u0001Zs\r?ݱiw=^\u001en\t\u0012\u00189/ϻ1~kx|̛\\{[w3Sם76d=m˪ϪY77~_\u0012o[!\u0004Ö\u0012\u0018,y\u000f[qr^2'\u0004\u0006cƫ^o֛s^|=\u000e{\u0018%0:Jt@l7o눘U-vCuuv\u0017gvt8\u00167lVkUtNcmWMn\u001c\u000f\u001dOS92/7m_?1^\u00157Y/\u000b\u001c`rfo\u001e{s\u001b߱.bOux\u0010\u0001`. \u0018.*v!g_/&m.``u=Á,,|$\u0001:\u0010\\Qx*\u001c\u0010yn\u0012\u000f\u001d\u001e:*\u00146*\"dP\t\t\u0015\u000fN\u0000#*,:Z%c\u001e+o/kyzK`\u0015\u0016\u001d\flL0\u000fE\u0007$\u0006\n\u000bE\u000b\n󸰠hfrw>csp\u0013Q_5߭{{]V`с\u0019r\u001aD0tD``$\u00047p\u0019eB.xPTfk\u0012]5mm_e/?(*T\u0005\u0000\u0013\b5#b\u0016Ȃ\u00034K\u0003\u0017GB\u0016  .5nn\u0013\u0013`8t\u0003\\>.7uV_nͱvk6M\u001e۷>y\u001f^6nin!꡶fu*|>|\u0012Sv|ݸs:kk:\u001f>twM_U7ʟ-\u001f9]\u000f4I͛/^6=m|~M\u001b:qkoMD@\u0015\u0010<(\u0019\u0018Ij\u000bTaE\u000f8DD\u0004\u0003fR\u00003\t\u0004Ͽ|o\u000e,\"L`\u0016\u001d\u0012<\u001e`dP TEǄYtHx@a\u0003\u0004^3+n7Kʸ \b<\u001f\u001f\u0016\u0010O\u0004]H\u0010H&`\n(iILx0`qy4XD8<`s\r`\u0011ӅQPtA\t0Q \u0012\u0014bA3\u0001hNM\u001eߔK\u0013!@\u0015CH\\X\u0012\u001eK\u0002^(\\dLD!CliM\u0019\u0013i:\u0000TM\u000f0\u0012E\u000f^@$(\u0003MXr⢂㑜x(\u001b|\u000b\u0014B!\u001eP؆\u000b\f\u0001\u0018\u0004}d.,\n>\u0017x(\\\u001a,\f$5̘lLT\u0014]N}\"c80ez*jdz2&\"tUX\u0003j`R\u0006c\u001e\fq*\fT+3\\&Ib\u0018\u0002q(Kr\u0013Ys9dA\u0010`2ԕ`19Xzn!cW@\u0000\u0004d\u001cC\u001c\r2\u001dܚmK®\u0017tkXگK\f2\u0007ʐ&肬c򈞎\t\u0007Td*T\u0013j(\u000e\u0000Ue9\u001dl2\u00131`\r&ʊb\u001c(LC#b9#DUD.#h0&\u000b$XQz:\"2E\u0018<1\n\u0001:0\u0013MD\u0016\u0019q\"DeX\u0015\u0019sI\u0019r\u001eDOŉ'dLPp`$hPe&\bcMWx(\u00160PaHڸ\br$H&ê\r\u000e}\u0004\u001f\u001383#Çm/\u0004\u001b%\u001b4h㡌L5Y\u0002EVE2E\u0005BT\u000e\u0006s9\u0015OD8\u0016\u0003\f\u0018\u0018X\u0001\u0003\u0006#ee.\u0016,I\u0000\u0010R4\u0004\u0016\u0012X\u001cr0@XHpA\u0011dq.\bc`\u001e8\u0018bƄP\u0013\u0007{@\fP\u0018óUdHj\u0002\u001aXH9S\u001663&\t\u001c\u001b&\u001e7^MLA,2mv̍\r97\u00197wt>kYߛ֝\u0015(\u00116\u0006\u0006U4X\u0005\u0004;\u0001(,vU7|M\u001a[6\t̆D  P\u0000\u0015\"g\u0002Ão\u0019ƶ{\u0017\u0003<TiP&\u0010l\u001bs[S>ξ\u0013nc7wo9Q\u001b=[sw혿-3#\u001fzUtgln3~'߮7LvκM*3&oKlۋˮN!X來ͽu5kq?~s>uyG}M\bV[6\\o{ͭie|mͶTw\u0013\u001d1ӛ~\u001eis~MkxM?=CT\u0013\u0005\u0004þ[o{4cyag6ntC_l\u001a߱_^.jSVn^s]WƖ\u0012\u001d\u0010\u0012\u0010 \u001c\u001e@\u0018f㞦JL0U\t\fy\u0010﹵͛sq\u0011Vuu*7zm쿊뇷؜\u001f'6tx\u0010\"2O\u0004\b毙ˍ{Wb\u0004\u0006s`)!\u0001\u0012\u0013wsڔݏoU\u0015}\u001b\u001c3<Mj7(16̚\u0015\u001f[\u0001\u001cH\u0017\u0010\u00188\u0000E#B\"\\\u0001\u000b\b\u00171\u0000\u0001Lh\u0002\b\nx\tL\u001e\u0018\u0013\n(\b\u0003vB\u0000\u000e\u0007\u0004\\\b(:8\u0016B\u0002\u000b$<\u001b\u0011'\u0000HL$.\u0007*\ttᡡ\u0003Oz\b\u000e\u0016@\u001d0H(0\u0017Rѓ\u0005\fD\u000f$\rD@\u0002*J#ґ r@&\u000b`0b!)$pxH\u0000\u0004\u0010E\u0003\u0015\u0014\n\u0007ˢpCc!\u0000J\u001e@#\u0004@\u0001\u00028 @#CiD\u0010\u0003\u0016R\u0001\u001fB\r %pxPL\b\b\u0013  \u0018hP4\"(b\u001a\r\nH\u0005\u0002\u000e\u0007\u0019ﬃ\fL\u0012X$px(@%\u0002\n\u0002xb01\u0000-+\u0000\u0000\\TD\u0019\u0010PTXP£E\u0003\u0015Ā,\u0010iL H\nD\u001d\u0001xaL,$`҈H\u001c\u0004;8` r\u0000>&(XLxh\\0pH(\u001e\u000b\u000f.C\u0002\u00176\u0014X\u0007@\u001e\u0017\u0000q\u0002\u0002\u0004\"\u000e0$\u000e$Б\f\u0011 \u0005\u0018Z]\u0000\u001a\u0017(\\\n\u001a\u0016\u0004i\u0005\u0002\u0017\u0012<\n1!\u0001\u000fy\u0001\n.\u0019\u0010\u0000P@A\u0000'px \u0000̍,\t,2\u0019\u0010P<@\u0001\u0004\u0007\u001a\u0004bB\u0003\u0002\u0006\u0014)P\u001ahF\u0013X\u0002\u0017\u001e\u001c\u00000\u0018JD\u0001\u0001i\u0014P4\u0006\u000e.\n\u0005$$b\tH4\u0018-`\u0015 \u000b$i\u0016]\u0002\u0015\b\u0003\u0011<\u0014\u0006\u0004P\u0006\u0004@`ScA\u0015\b\u0005\u0011\u0017a\t,H.O\u0005{F\u0006Ee\u0012\u0018Kじ1iР\u00031c\u0002X\u000f2L!C}$&\u0012D`\u0014\u0014Q Fr&&D0\tbl\u0004C\u001aLu\u001e4\u0003TS\b\u0005E\u001f\r\\tYHQeQNB,2Ep@95Ut*\u0003@MEQ#\u0017d.L\u0011<\u0012\u0014}<\u001844L\u001f\u0015ui,\u0007ġX\"3<V\u0006c@\u001aJ\u0003,c5\u0016\\55#\u0018*\u0000U\u0015la\u001e\tx* *G,E9 Xe\u001cKj.C.it\u0001\u0006S]\"LsI\u001f\u0011u\u001aLՈ\\SQ\u0005\u00125\u0016TTWFd\u0004T\u0017.'h,J\u001c(4\u0006J\u0003Ռ\\00\u0005\u000fplP@<0L\u0014P`M\u0000\\0j,\u0007XE5BM\r*L5Ҍ\\$\u0019$\u0003\u0018\u0013*\u001f \u001c\u0018\u0013*\u001e\u0015\u0018\u0013*.ˡM\u001fReZ5)\u0002t\"\u000b\u0005Xe౪\u0007SE%A\u0003Pe .eXb K\n\u0005˘d\u0005Q\u0010Rq5\u001b<m\u000e@xwz\u0017KD9`n\u0018X:MZ҃il\"e>.W4dkPDˊD$\b<\u0015edpGT0&T(.*8 XI4˱Le\u0002}@`2\nLҤA,\u0007\u0019D+\u0013]\u0014\fW5\u0019K\r0 4Q@Pl<D*Gz#/P4q8\u0012ta\u0004y\\\u0012Tq<x(3DG&#P!A\u0014Kr4@TӇ8\u001cTL\u001e&0\u0003M<\u0014.˹b=\u0015H\u0019&ID0\u000bceXH\u0012\bd=\u0015R\u0006\u001c\u0016rX\u0002E\u0014+3mp\"0\tb\u0017Ğ\u0013Ql\u0018y$6T\u0013;\u0000b\u0012<LD\u0014L\u001b\u001e˒\naÞ\b`@$\bc1\t,aOŞax@lp*\f\baT\u0018\bQ\u000e\u0005\u0004]\u0010E\u0005\u0007b䉢\u0012\u0011\u001c\u001e\bӕ`L`L\\4]`L\\\u000ee\u0001D0L\u001aT9PFB\u00170`!\u0004\u000e\u000fg\u0004\u0003\u0011\u0014BrJx*\u001b\u001e\b֠\u0000]NtX\u0004,N\u0010\u0010h\u001f\u0010\t`T\u001aTCH \"0H*袛d\"\\eix\t\u0002y*ቨϨ\u0013b\u0016EA\u001cc5\u0003\u0002\u0000\u0000\u0011\u0000\u0000\u00184\u0016\u0015D28\u00125\u0003\u0014\u0000\u0004pV,L.0&\"B\u0012a0\u0014Q\f\u0004A\u0014@\u0018P\fP\u0010BVRZ\u0006\u0012FHp\u001f\u0011~>=1\u000bsҋ\u0019eҌl<\ru`&m~O<ItۙJݯ>3[F\u000f3ůhš+$\u001f0߸ۄ\u0001mNI77\u000b1`b<쉦w\u001b\u000fOqKLN5IKD\u0005̔py?b:\u0003\u001drv\fO\u0014z\t\u0011^t&\\O\u001aͺ;[Fq:\u0018%w5M\n\u001a݄FNK0o#R`z\f:A05֚R.WٴLNÌQn;\u0003Nɺ;f*ȵUNA{&۸ff1\u001bԮ]{kxzX[dW]F\u0013y\rb\u0010-LnJ0ت\u001f(vA\u0003a\\$c\u000e`n2>~\u001a5\u0011I_W\\%E0^\u0014{ \u0007 \u00159ʖ(LkKמ8E\u00046\u0013KPgH:w%cm/\fjt#h\u00038F44xld\u001eR)$\u0004zO?T]\u0005!\u001a\u001ela'(\u0001^^S泾I\u0004uk\u000b磪ZT Js\u0016~bae\tկ`/Gѥ*n\u0016+\t8`\nۺvG$ls\u0010$1J\u0014x-'\u0017%ٸf\"{Y@K^}Ř\u0018\u0006i*\u0016*>\u001b\u0001\u0002Պ@\u001d\fox\u001eT\"\u0006.p\u00041Wʚ]\bh^B\u001dqB߁4rnU`|:>\u0001\u0016\u0002\u0015?C/#VS3\u0018&\f^ct4o#otXnNL*yojM\\LXX\u0019$\u0000tJ>Ic16k+4\u001eF\u0016s7Zo;w\u0006I3\u0003\u00154aܸ<!R#c\u0011\bf=A<i\u0001D\tZtP̉Y\u0004\u0012\t'v\u001448HEfdF>V\u0000?\u0019$Q\u0016\u001b؛9Zsl\u0012\u000e\u000efh!_,'=\u0004BdhBa3\u0007ٓY\u0007G\\D\u0016ڬ\"\u0004dlu9\u0003<|}\u0017aY{˳<\u0005zC$K\u0019q$>bt\u0004b̕*bcז~hv\u001c\"TѰ!p\u000e2!\u001c@_|\u001b\"B\u000e&Z\u0002UsS\u0010ȠȅRY箐n?\u001d\\\u001er\bd\u0007R1Jdl\t59G\u0003b\u0018\u0007H77b\u0015BMma93fqJb\"exђ}m~Uz\u00149\f\u0013HvPB\u001aNe%\u0012e\t*a֧ߨ\u0010Y\u0007\"F\u0017x+!O\u0012\u000ehL\u000e\u000f\u0005ӡ`AD[\u0000O\u001f\u0005\u0014݋RKm'\u0000\tW?H1ŧސD؇\r\u0010\t\n$f!hPo|BL\u001d瑼ʃ)Q\u0018s ԅ$\u0005@|ׂ/x&<\u00107x \bC4Пd!tzC^qfZ]}MQC[T[)\u001a\u0010}l,U=e6rᡕ˯qƍ6\u0006+=\u0010g^u\u001b@#V\u0002|2\r~6\u0007\u0007C>gm\u0017ɥ9ڴb\u0017\u0017o\"ż\r\u001c1uY#,յW\bxa|)4ʆ\u001ea\u0016,Y\u0007!fV$S\u0018N\"`pKD[IfpZ.&VȢB[F&oWO\u001f\u0010\u001b\r[N-Eby\"\bs\u0019\u0002Q\f2s4[_=$BK\u0019Ƙ\u0003k|{\b\bO% aekc\u00176׭\u000f\u0017\u0010\u0014\n/n`\u0015>\u000e5,j6\u0006P,\u0005j\tmz\u000e>LD*ިb\":\u0019'򝎈̡|Ƒ=%+<';(,dk^\b\u001fZ5\u000b^6\u0017`ڛrg:=qX\u000f0\u0002[jU\u0011oIQ9\u0004\u0010z^ѽނW\u0011X\u0017%\"\u001d[Dba\u001e9Đѣ\u0010|AS\u0000Ń4L\u0014?\b?\u0001A-^\"\u0018u\bv\u0013G\bB(1Y6+QXNo/6Gɓ/\u0000~\u0018R\u001c\\\tJX$\u001f3n>2\u0004cNП%-\u0003UT\tЏC\tTƽm\u0017@lNouD\u0017P\u0006FU[:0>c羼cH[\u000f<wQa@N_|qz٨\"]3b7\u0018ҭ<\u001e^\u0007C줓\\qXaB\u0017\u001c\n\u0013pܵc]\u000fD\u000fjM3I.\n\u0012oJ\fKn\\,\u001e\u001cW$Y9\u0000\u00180{jOdwHV{m\u00155\u0019,\u0001or\\?G\u0018_}q!6:\tzjY\u000eNc\u0003cL`f\u0012d`HUuW\u000e/k~\u0006dc2ozRƻ'Ҁ6>W6 84۲c$|\u001640QBTw\u0013p\u000b_\u0001[B\u001ak+ZfݐVE\\.\u0004Yн[+\u0010tC|`{U(Mk\u0010vO\u001b\f\u0010\u001cȜ#&|Ҹǩɧ`Se,XDRFo4'\u001a5NV\b\u0001\u000e\u000e\u0015M305(\b\u0012!Kx^\r.a7\u0000\u00105'k$\u001eEhB\u0016ӓ1.9\u001f(\r`\tɱȜߦϒZؿv]54>uԜs~\nL\u0005\u0014\bқ\u0013\u0017`uP\u0019ƣ\u0019ܐhR\u0016\f!yfg\u0019)E\u0005\u0015\\%T\u000f3I]\u001b\\MC\u0013_\u0011\u0014łS\u0016G]G\u001d'{̪طz^\u0001i+\u001ay<\u0010\u0010tP:[0y`\u0007yC8hNF\u0015΂\u001e/X\n4MW0ʲG\u000eWZ֙1˹ł0\u0006\"]%f)v\u001cw1Se\u001b\u0000dX!u\t\u0016՘\u000fj\u0004+\u0017q\\Z\u001e\u0013RD^4Е\u0015+\u0001x\u0013+у\u001bu\u0016'UC-gs5ʇx\n\u0019\u0007sm4Z;\\5!\u0000\"D#b;\u001c(\u000bh\u001a`1q;y4b\u0012-(\\\u0000)\u000f\"|\u00134o\rH=i%j˜Q`4wf\u0007Z8\u001c,;?,\t`miR\u0018<J]X5Jֹ[8\u00150&'\u001d5\u0013\u0006Aqq8WDPl\u001b\u001e:$@OT+\u0006M֮7Mpb\u0006'+/\u0012^hjWQSz`?_hpEZP\u0019\u001caØv7\u000e^J\u0001\u0001\u0013;}Z-]\u0004G\u001d\u0003XF}Zx\bljO,4\n8\u001d{\u001dW\u0015[ Jρ\n*&4'ltɥ{ۦdl\n\u001e1^Jє?uE,3zJ\u0010&$\u001bB(y_1KqVЩT\n\u0019l2\nDeMJ\u000e\u0018\u0003~EK\u0012\u0012%g&\"\u000e$\u0007/\u0012\u0003Krz\f\u001d\u0014'i\b󸎺\t\\,qM\u0016B$?$T\u001c\u001e\u001a\u001dQ'%;\u0010\u0018̈\"k\"\f2\u001f\u0007Y\u0005.)p4ňeWTӁ\u001a\u000e\u0015\u00134_kz\u001d*7\u0000L`\f\u001a?\u0003ܧj>K!`\u0011.\u000f7Ib\u000fb*ט\u0011B^\"8sd\u001eIQRN<Ȉ|01חZ\u0011\fԽl\u0004h$i|\u0010>\u0019t$j7f]ؑ)#,w\u0002\\\u0015\u001f9\u0017%.\u000fC$Ik\u0002#%Tp\u0019Q\u000b\n^dztu\u0017f=FHʚQx0\u0013脛4ՉTǕ.\tA&\u0000ި5tf@TDk&\r\f\u0015F`0ʣr\u0014Eu*O`\u0002\u001cjR1Q\u000bDP\u001d3GQLV\u001c\u0005H+\u0017\u001d\u001a\u0014t(\u0012:a6K\u000fhjv-\u0001\u001abUpc#u4a \u001cD8\u0006d\u0012\u000bp\u001e0\u0018ש$Y\u000f0*\u000fyctΞ#9P\"\bvf\u0015\u0016>\u0000$vG<i\u0010XZSkƇ{R\u001fOH\u0006l\u001b?\bjF3?\u001e\u0011\u001b\u001eq#\u001a3\u0013ҭ|\tI!*j92ta^\u000b\u0019fu0\u0005\bm\u0000\u000b\u0002\fVI\u0019E<G\n`s)\b}I\u0003\u0016}Q{\u00114j?& GC4\u0010\tjYD\u0019Z\u0018\u0001\u001fcH)##\u001e,\u0004ol|\fơtfAH/U}-ƙ#^U^>*\u0000P^\f(`p\u0016b9\u000b\u0018?V3v.`;LAꢫQ\u000b\u001b\rg5S˅YPC\u001azwMP]M/:g%,MB\u0006\u0002\u0005+amYTJ\u0000\\م\u001e\t\u0007\b2\nf\u0017vDH0:ů\f\u001cٞ\u0010\u0002HkX\\\u0003dZD\u001c$U>Φ\u0004q[c\neoc\u0012&a9_\u0001\u0003/\u0000i4\u000e1\n\u001b\u0006\"mcd\u0003t7fƏ18\u001aj,c\u0002\u0019\u0017\u001dy\tM\u001b`Ź\u00188\u00064&'%y\u0018wR0\rc4FXd1<4myCJ/yf\u001e3R&\u00194߈'))f\u0010\u0003Tn\u001d&05^Nn0%~\r\u001c\u000b4\u000bz\u0015\u001d\u000f\b:\u0004QJ0K\r{!Qe\u0014Ԕu\bt>\u000f\bQgD\u0018'h(\u0012z\u0004A?(\u0003\tc\u0002I\tOb|jY0~X\u0015Ѹ\u00040\u001cpW\u0019\u0000\"$;]Ax\\ItdMCAL[p\r\u0013/\u0015C\u000f/3*]\u000baj$ʈ\u001e(%\u0011P\u001b\u001c<p\u0000N\r&Y\u001dl\u0011دq\u0007c\u0010K.\u0011usP.S]b>\u001e\\\u001a\u0011dJ▾\u0018Λ\u001bB+p\u0012t\u0004xf\u0012\bj/ug\t}/\u001da\r\u0013@TSm\u0018u'_4˘\u0012\u001a\u0006:Pb\\(\u0017z5waf.\b\u0003理z\u0002XF\u00187tң/Y\u0004\u000e\u0006]\faUQ\u0018}\u0015Ác0{B8\n\u001c?TU9nutO*\u001c*=V\"\u000eX^t\u0004\u0013\u0006sk` a>If?^M:\u000e\u001f\tN]\"H)V.£*P\\qCP\u0006hg\u0018{_H\u00182\u001a_0$\u0000o\u0017Wy\u0000U[`YT\u001eaɁoz<ZŠ\u000f\nbo`د_*\u0015ى3ѐBAA\u0000v$H\u0002qBŪLG[\u0001}\b@[\u00110\u000b4J\u001f/\u0018\u0014K]qUm\u0000\u0017#x/N2\u001c^rX|Cc&&2?seP\u0000ez\u0018sw\rZV\u0005.kI\u0000\u0014Âa S\u001a|\"\u0014/T\u001av`\u0003\fMH|\u0012\u001eRH^,*v<ZUQʘcϿf\u0017aNS\u00156iiQ\u0002C\u0005FPeR\u0016\u001d43N%(\u001f9Ik\u0007&ui'b\u000e\u0002\u0003\r\u0017h*qd^Т-80MO\u0007\u0015Z^wܔA$ŊG8;\u001b\u000ba>\u0015rs\u0014*\u0012k$F2'M\u0017-Mt9\u001ețXU./\u000bϡ</W6\u0010B\u0010\t\u0007idL\u0010!/VKLd\u0014ڼ睪BH0\u000fJr\u001b'1\u001aDKPn\u000f\fdI`\u0007Eض[UӒ)5]1{/IƋ&!M97U޾ǣ؛r%\t\u0004.G\n)cF\u0016G=|ءpԋ\u0003\nF]z9\u0012ѝ%x\u0003gnP-_DJ=^.P\u001eHףQb0$k+c]\u0010\u0005{IaQֹ\u0015_[\u0016\u000eF\u00180\u001dє2\"if\u0001LO4[]8=\u0013Z)F-\u000e\u001f\u0006篈-[\u000eE#N(N\u001c9\u0017\u0005\t!cEߙ}\u0016\u0007z6+u\u0003\u0011gn9}Xrdu̺Kt\u001aO&\u00150\u0005#[us!\u0011\t.\u0001O<I9\b\fb\u0016'{G\u0005\u000fCdbϤk\u0016lp\u000e\u0003\u00150}*\nf?0xnc[#ōD0pr\u0013\u00062!g\fu.4 ک*\u0007\u0000\u001e懞x ׆gT\u0011O\n_\nIdEz]T22\u0017O+^JWbK\u0014\t_(\n1Y?F7\u000b\tA\u000f50+ް\u0004\u0014W\u00183N#n\u000b\u000ex٣\u0012m%/\u001dj%$\u001e\u001d\"r@\u0018>\rTi1Sh1\u0006\u0015+j\u0004`c\u000e_vi\u0003oP׫\u0004'[!B)z\u0012V\u001cy->ѕˊt\u0001iiJ׊`в\"\u001a)B,J%KZ\u0010I$C\u0012/\u0002e\t?9E^7}pz,<\"O:\u0017\u0005J}/.\u001b\u0015\r=E\u0004\u001f\u0004^\"\f\u0004\tg@R4rIޅ\b\u001ahlT\u0017\u001a11FЬS\fG˓^YpFE#ɧE/GApݎ&ieTb\u000eWym \u0011sEe\b4\u0006g\r\u001cy\u0002\u001fJ\u0007\u001fXU\u001eZ2+4\u0015Ǫ_V4#oco*\u0007Tk8V#U\u0011[u'*\u000bȯqb\u00119Ӧ(CE&d{\u0004b<Χ-A#\u001e\u001c>x\u0011i$T\\\u001f/ɩKE e\u0016p+r\\5F:/*DJ\u0005XT4~F}\u001fB\u001d(6%(L(6TQנ\u001fU\u000b겮/D0\u0015.V\u001cT1\u001fG~6JWF.h\u0019q!mJ\u001d،z:V\u0012lopH@=6\u000bnې\u0013\f؉\u001c\u001fjBr\u001aJrS%\u0001aϽDHV}I9<HDC\t\nIZI\u0003Bi*b)-\t-ٳX!\u000bR[\u0015֡I\u001b\u001ce\f|\u0019\u0015*owI/*\u0004=yg\u0002\u001a\"Jqe28~\n\u001dKQj\u0012Jc\tG\u001c͹~^9Z\fm\u0012d̈CK\u0013Lws3\bBc'YoQ#\u0004tT\u0016\b\u0006\u0000\u0019G^m}p\u001ard\u0006ZL\u0011\u001d\fҝ\u0019{h\u000f;\u0018KyKBZ#FpDHp_p\u0000\u001a\u000e\u0000䥼zy\u0014K{-j\u0018Ourk\u0003<۪B+\u0011]\u0019%s71۲9c\u0006抹~P\u0014,*uS,\u0018࿭·*xbsڬU\u001eA,Ŗ\u0003@{t.t@A\u0006\n\u0001n\u001b?26?\u001aHokj\u0007\u0004&\u0016s7ܾ[5|d*3QTpOl>ݠ\u0012}y\u0000\u0017:ZXw\u0004\u0018hk\t\u0017I\u0010-R\u0013\u0013t\u0006;\u0000PSpI~EJՀ& \u00161g$\u0019\u000b>w\u001cRl\u0002Ƭ=5d\u001cƜv-xߴ\tIF͉\u0004Sf\u001f*\u0004wD\u000bZѴ\u001ctRDLJ2Hg)g}X*ĀO%=\u001f.=t\u0013{\u0004,'A/r)lo X\u0012PrPrݾp5\u000eҀ}\t\u0010uz;G\u000eɧbk\u00139\u000faB\u0010=f\u001eY]F\u0011\u0000iR\u0007\u0004\u0004wXD\u0012\u0001\u000fRJJqǆ\u0016uE\u000f\u0016\u00024U\u0001KJ\u001d[oY/}٬F@!wbqcOpz>:\u0013ܪ\u0003\u0003 4I{\u001aN\u00051f\u000eou\u001cu}1(\u0013&>c!v\u0015w@fp^+\u001dj\u0010끦l%\fb0W^8Ozf2X!*kTSa\u0007޳>^!6/\rk=\b\r`#p\t_YiWtp#%\u0016S\u001e\u001a??mFS[jܪ@\f6D\u0019\u0010q.8U/m\"4)UX$@o\n\u0006\\Vt\u0005\u0019C_yi\u001e/|lV\u000el޿e5?\u0007PRވBa\u001c(«e\u0018\u00191\u0012+0.%&BnT>3QTC\u0016?,\u001eL(\r\u001aY\u0004\u0007\u001fy\u00107Ǖ\u0006\u0006'u\b_rˀqލ\u001dC0\u0005 i۲&q\u0002\u0018V\u00035\u001a\u0004_LPWjG,&KvV8g=ŕ5ܖqW\u000b\u0019sօh$\u0012+T{Hqs4N\u0007\u001a\u00060\u0003\u0016⹫NH!5|S\u0016x\u0001Ī\u001d\u001a!G􆾗P7r_g4hx\u0019\u0019`\u0002lWqD9\u0012<PMZ\u0010\u000b\u0014=n;X%\u0002.\u0002i2&~;@^\u0015\u001cۄق\u0004y\u0010%D7+\u0000!\u00047\u001b!I\u0018mI)gGi=жI~\u0003|V>v\u0001$\bhw&\u0005C\b0vw,v\u0010:^!H\u000bI]M)ߊ`/˻d\u0015\u0017\u0019A6퉃-C#4\u0004BkNy)`eƧo\u001f7\u0001zg(\u0016!Ǚgs_\u000fȿcN\u0010v`\u0016c8\u0001\u0004AShɿ&Vps\u000f\u0006B\u001d58\u0001Ǡq\u001cMەd\u00001q59qQO䦬tO1:V\u000f\u0007ְf?B؂Z\u0001A\u0015\u000f3CCAT\u0000A3[|\u0007SXi\u0012\b\u001fibD~\u0013\u0017\u0012ʋ;\u0015AG\u0010xP\u0007\u000b\r@{\u001bL\u0016lZ\rqhWaX\"]#]zw\u0016\u001f2rZ)\u0016\t\u001f-18(z\u0016%\u0017\u000eBSj!u)0\u0014<N0|:\u001a֞?o\u0005Ym%>Ε?Akm\u00169}\u001cd\u000f\u0013CNQ\u0019/G8dvi\u001a\tea(e\u001e::G9r\u0017\u0014\u001cXBx̹1\u001a\u000f3M\u001de62\bO}؝F3QՃ.`\nJ\u0012v\u0006E\u0005OGf;a{0#D#\u0005ذ\u0007\u0006x\f\u0010Pd>}\u001eN\u0012ho\u0012?jqPQꊨ=\u0003npM\u0001B\\\rvCA\u000f0A1d^\u0018=N_\u0014IF\u0007Z\u001d\u0002Ѯݰ|:\u0005v {\\D\u0012Bm75\u001a\u0002S8+-Wf&qN\u0010lPh!!r[IGw*`\\\u0014f[^_p:!֥\u000b26~\u00027p5K6O\u001dH<\u0002t2MB?yC\"2\f|]/EYY\u0019`MWoߴV-\f*\u0003l\u0015L\b\u0016\\\u00125a\u0000d+>\u001eBmB\b\u0005&\u0003#\u0019ǎSp[ݤ\u0005pw#Ttv\fP\u001d\u001b3\u0018x]R`@\u0012-\u001b\u0015GO\u0016_a}j!Wٝ\u0004\u0002z%\t,\u0018Hgg\u0012ԇ@j\u0015bm\u001b7+\u000e-'|f$\u0001X!\u0002\"hk#&؟\na/A4\u0017\u0017+cWȇ\u000e\u0019`\u0012?)(:\u0010\u001f\"F\"b3d@.\u001b['Ev'z\u001f\u001e\u001f\u001d5BE\u000eZ5G\u000fG¢?\t~!ͪ(7\u0015a\u0010\u0013d*v\n@DƓ\u0013KZJZ¥lp)[Y%\u001eom\nV^*}ήK]rOP.1*UG~'*\u001apQ6\u0002~u8i\u0005lE'ů\n`˯\b\u0004UI\tg\u0011+%\f\bIśN\u0001Aʘh#Uh~\u0012P`%\u001d@H]S\r\u0019d\u001c18\u0012Lځ\"&11h\u000e6R\r\\\u0005q\\\rl\u0002\u001a\u0000d\u001es:T9و@W^RH\u0004A\u001e#)?F~q\u00037Ru\"V\u001fLiV!XүEM;\u0017ᩯ\u0012~\u0015 \bS={ŭ?]\u00181\u001ap\u0013\u0004M2-`Fa@B\u0010\u0005U\u0019y|\u000etJ8#\u0013\u000b\u001a\u001c\u0001\u0010J@\u0013ъ$%%\t\u0015}85<%y.EB,YʪQ8E\f~\u0019~d512\u0004uҬJ1\u001f7dg\u000f@\n9$} :\u0002KU\\≉ml\u0014J^~þ,N\u00190+49\u0006Q%\n΍':4hh_eMSA\u0001M`M\u0001QK\"u@^\u0006&ĉ\u001a#2\u0010\"67L,W\u001c6l\u0014'q8s\"\u0017\u0011&\r\u0010\u0000\u001fGc4g_l\u0000\r֏uM鑑иO\u0007+\u001e\u0000\u001fAN\u0012fdƄ\t\nH+\u0018\u0003pH\f玚3䨞\u0015\u0005\u0010B\u0019HLz<\u0011wWC:vB\fvWjq`cDiD\u000028F\u0011\u0014\u0001\u0017'ӗx <)?X:\u0016\r\u0005N4lE,x\u001bΦ@O7O\u0015:ʃLcL3W\u0013\u0015V,wcv\u000f#\u001b\u0002j\u000bت=\u0015<.mIraOy=;ꔡ\u000e\u0004WK?~Q\"\u000486u%\u0003de\u0019A\u0011i\fO\u000b+LDk؎4*\u0015\u001c\u0006d\\\u001dA/~tcD\\^WE1\u0013b\u001cn-Lw΅\r0\u0017|Ŝ\bbF*Ozat/u#-ieb6Fy\u001dw*|!6C@1%8$4\u001e1$gtRa\u001cv\u000f0a\u001fǼ\u000f\u0018Y]^9iÏnXL\u0014XٵD\\V\ft\u0016\"\u0014\u0016& tO\u000e!Rt-Y\u0015\u000eB8ѓllr\"I!ߘ \u001a\u0013w]`b-ó\u000fU\nQqWRTe\u0014\u000f.Gk\u0011ZӶ\n3)Tv1*)\r\u001d`@\u0017,\b!\u0015H\u0001Wdt\u0016bN{\u000f\u0004\u0016}\u0010\u0003J%\u001c\u0010Kڑ@@\u0013g[\u0015\u0007\u000fP3[%zi\u0012&XVgI\t?U\u0004;\u001b\u0004BҨG6`vn\u0015Բl[UlĠ*ؤQ'\u0018\"]Z]a!Xw!!8x\u001d\u0000\rKi\"\u0011\n5!°^N;˄߿0\u00116<*6Ev\u0016\t\u00124M>(\u0007]ؠ\u0017ʴ\n5\u000f%]<p5:Ǯ\u0003`6\u0003X6A\u0004\u00187\u0016\b>ȿo\u001b\r\u001bX$G&UR(N$:xm$$x\t*\u0014svNgƲ%_\u0011Q:(F\u0005R;y\u001eROA5p\bIxⲷ\u0017koq!^Om<S\u0010ϛ|qh#,웍$'9%_\u0014ҙ;5\u0018$A\u00011\u0001t!\u001cw\u0017$BF%v\f\r\u0002\u0015(0ָmhy\u0014G[\u00101B(m \bz\u0012U#,\u0019\u0003\u001dxgf\nUf(Khx2G\u0010\u0014\u001c\u00057Q#!Qd\u0000*(&8ոn0tK~\u001d\u0019Nb*]\u00197\f\u001aKF|&\u0002iJ\u001ax̻]ቀ;xR?TY-%\u0018-[֎K*\u0004\u0000sLQ&\u000f}8d2L룞1rR8d9:/m-苫++_9.y!-q{h\u000f17=A2tU9\u0011l[Qw\u0014gwa\u0001&zhϔyrLZnPɍD\u0002\u0012\u000e\u001b\u001d7x\u0016xhYQ%\u00179$92ʼ-#Ih[R`Re'\toQ\f\u0019\u000f\u0007`s능өr$ʈg;U742wB`2s\u00049,A34c*-)[khIn)i\u0002@J@,\u000eVt!8ga&\u0011\u001c\u000fL%U\u0013d9H\u0018\fk؃\u000f%p\u001f\u0000v#4p\u0003E2\u0004OqsK\tW\u001e2\u00160Bj[9jL\u0001*\u0010d\u0001W?&#\u001em\u000e\u001dB\bx\u0003:JRFuho5s\n\u0016Çҥ^\u0016ŋ\u0005FS4߹\u0003\u0002h\u0006\u0002jNn֏b\u001cu\u001d\f\u000eC\u0004\u0018l\u0010\u001bڴYm\u001e*HsQڲ#jy=-!\tLHX+0\u0007\u0003\u001chtݱq5\u001a1\u0013\u0004&\u0007-sy\u000f\n\u001f\u000f?MZ6mEm\u0018\u001cz\bn\u0011pBל\u0012X$&iG6Z\u0011 ̔ƚou)\t\u0018ufplU\r};:%;VlL{S7m\u0010/\u0003 &0)\fHd\u001b%wmC/֌.\u0007Ե\u001dl\f\u0010\u0003\u001c\u0004\r\r\u001f\u001e\u0017<\u00178K)\rH\u0004\u0000`\f\u0000\u0000@;\r\f\fk\r\u001c`-jmլ\u0015AlguqdAS\b[\u001c\u001e\u000b\u0015\ftm\u0006p,.DM)\\@P\u00158'J6#\u0002ЙQ]\u000euK@[\tK\bu\u0006ҦEz*N[JMxʪm$\u000b\bf\u0007:>-.\u001bTrr*2\u0019=4\u00184Eө9\fM\u0000ѵ\u0019\u0017\u0010\"M!\\oދk:ؽP8P\u0014(\u001c\u000b\u0007@\u0016;yM+ңٌf9l)D&f\r\u0018mv6U>|ӾEQPO\u0006$\u0000\u000efF\u000f4\u001e!\rwѸTukV\u0011\f_|U'ׄPHE\n\"i9d|XZ+\u0010\u00172!aS!oKm\bو\u0011/\u001bEOa\u0007m+Ya7\u0013`6VitP%Z\u001b\u0010>\u0002\u0002\b_@܏\u0018\u0012=q\u00024\u001cfd.0\u0013qMbx\u0006\b4@P\\c8\u001cL?\u0006sH1P2І4\u0018\u0006AG\b1^Al@<\u0014ub\u001d7l\b$l'\u0001ҙ8ht/ʅs\u0018C^\u0014EApK?F\u0015)\u0011a\u000f`\u0002~~Q~\u0011*\u0002UHE[fDi'\u0014M&}SM!O\u001etQ\u000f1Y׎\u000e.kQb4x΃\u0018\"l?ڬ\t8R\u001e/6ò\\#\u0015W!T\\D\u0015|\b\bCrè\u001d\u0000\u0007@U9\u0012^K\u0002L\u0019H\u0011/!?\u000e@\u0003\u0000hI\u0014䐷3ڌ\u0003v>\u0010*(\u001d\r:0=ojA\u000b\b(x\b=0\u0017\\/nBzk<=>zd[\u001c)3j\u0000\u0005SX\u0002&o0t\u0010KayӠA\u0001|1jM@ &uL4\u0013D2?9(re\rg\fF\u001d\"\u0003 W4 \u0010<긐K\u001avߪO\u0013߭A/\u0005\u0014NhtI%`qJD\u0015)\u001a\u0017eB\r;0\n\u000b\u0018\u000fjp?i\u000f!F\bKQd\u001cs(=8iiLc6\u0015\u0015v6$ !ÆTˈ\rMPcǯu]?֪߬\t\r\u0002^\u00102y X0$\u0000\u0011\u0010^l\u001cw4\u001evP\u0003R  :*WqQgs(\u0011\u00102j\u00075;t\u000e\u0004'\rtm\r\u001c\u000b\u001f\u001cT u`CIPj0,ոu\u00160-SrcCq\u0013U\u0002ȍ\u000b\bR[O\u000e#\t\u001ds4yFY5b\u000b5n<D\u0004=Ll\u0003\u0004kR\u0007\u000e3$\u0003\u0004\r g&\u001f1Ǩ\u001e\u001e\u0013z\u0019(\u001ct\u0014\u0017\u0007\u001dcX'։u\\S\u0001\u001d&  P\\\u0001E\u0006qa\u001a7\u0003i!m\u001avH>e_xt\u0017N\r_\u000e\u0011N\\4:qk8klQ5\u000bE~~/x g-(\u001aV\u0000^U\u0003x\u0001\u0018H56i4OZǌ1M&mp\u0003.)\u0001\u000f\u0017\u0016-\u00044StkZrMbێ\u001ag0b7\u0014؉\u001d6Į \u000eKv\u0010;vb\u0010\u0010\u001b0v1p\u0001A\u0018\u000e<J\u001apaNG!:i|cg/46\u001e01fg>.\u000e͑A\u0010@\u001b\u0017\u0010\u0010\u00106\u0010T=cpw0\"iv\u0000<\u001cfXACU9g\\\r\u000bZ\u0001\u001cYg溼P\u0013r2\u000e@e)>U\u0019\u0015o6G\u000bH8\"\tAZQLqoØDv\timcYǭ7$&\"\u0015\u0016LqT(XN\u001c;gI\u001b@\u000f\u0014okRG\u0006\u001d\u0000)\r\u0010\u0014\u0006\bJQ=Cv8\u001ay\bc8\u0017\u0010DL3Ǡ}\u001e\u0018>1A`H\u001e\f`$\u000fF@\tr\rG\u0016\u000fF]t\u0007<(P?q5\u001cPp\" Cd\u001e2\u000f?ub>\bSm2ja74a#\r;\u0013\u001c`\u001ap2\rL\u001c`8p@@\u0007/t_\u0014Eq\u00175/~9\u001e~\u0005\u00040$1I\rS\u000f\\*S\u0012\u0003\u001fKbp=sN~I,ܸi\u0014)¥lQ50klQ2Fs(~¯n0`\u0014_\u0006C\u0005@)FT5\u0002~'$\u0002=\u0016aE@\u0001j\u0019m\u00015gGGX$k\u0006\"ߔ0\u001bDQo\n)\u0016G'\u0010G2fz>\u0006#P5iNht\\@\u0012\nUˈ\u0000/<wMHmbGzQwM.%;T&\u001f\u0003\u0004O\u001ded\u0015\bǚ\u0012\u00067\u000f{5Qd2Ŷ2Ou. I)\f\u001a\\@ rMq w\u0012M>q6Խ(n\u0001@9\u0011N,j@,mt \u001dSd]nl\ft7Ұw\u0006\u001dC.  :.zi\rX,\u0011\n\u0014׉e*#;\b?=OXO\u0005\u0004*$\rj\u00190yX\u0014+n\r~܅\u0019q\u001drJ]\u001e\u0014\u001ar\u0001Xm+K\u0007(X\u0004gƎbL_̜=:\u0013W-#W5E}}$D\u0002\u0002\n\u0018\u000e\r. `\fBE\u0001W~fS\u0015:\u001d\u0006\u0003ks\u0000\u00102\u0002\u0001ay5\u001cӵYr\u0006\u000eۈUëȨg3-HwPs\u0001\u0001=W\u0013oS;t\u000eR\u001a\"Iyx~00*\u001da\u0007I&\u000eT\r18ͽ\u0000?X}¿\u001c6]JS\u0014%[@J\u0006\u0015rF\r\u000eֳv\u0012'xrgDO39l. ؤ\u0012\u0015l%ɩKPQ\u000bC<\u0006Bѐg␐XC\u001a4-\u001d\u0006YW0[6>F(|-\u0019`oi\u001f\u001eN$9e\u0010\u00146. \u000b)q̃Q1E\u000e\u00112֫zMQh,. ($B\u001c`ͶIf\u0012W\r\u0017\u0010\u0004\\`R1訕Y<TqݫxIb\u0006q\u000bT\n\u0012z\u0005#BIp\u0001\u0001g\nP\u0013ǈ\u0002A@$N\u0013 b\u0011\u0010ݚ/Wi^\u0002\u0002\u0006,e\u0012!\u001a8>\u0006Pa*U\u001b\f;<4\n\u0012\b\u0010\u001bU%)'b6D\u0015AH;\rg\n~F\u0010Oڣ3. =d,Qm6\u000fG\u0007|\u0000$QBT\u0018$\u0000\rY\u0001V,t6͸ b1yX3\u0001\u0002tZSaEZ\u0013\u0000\u0000JHĚ*97\u000b\b&+\fÁ\u0019\u0003. p$\u001a\n4\u001f\\@pz%\u0003PtIƅ\u0010\u0007\u0017\u0010X\u0019\u000be\"\u000bPk5\u0012\u0004\u0004\u0017\u0010<\u0012{rdAN \u001c6d\"\u000eϡma>_GvΑ@u\u0012K;УG\u0003D\u000ehq\u0004D\u000b\u0000Y\nT;azPU\fWC_\u0005\tB*\\@`9\b5\u00005_x-\u00196\u0018\u0004\u0000fUGQy\f;\u000f\u001c6\u001ah\u001b\u0019KJNcL\\@\u0011sl2Z\u001e\u001cf\u00078\u000b(\u0010\u0010\\@JԖǮXp\bw 0\u001doz\u001bG\u000e\u0019~p\u0000uʌ\u001c\u0019\u0017\u0010pdB\u00100P­d\u0019nf\\@P.4EVC8\n\\S)op\u001c`BX\u001e\u00013\u0005\u000by\rU\\@]\u000eGF\u000fh\u001bY\u001d\u0017\u00167\u0010HS߰}[{`\u0012\u000e0\u0007\u0000\u0001\u0006\u0002(zTX*Y67\\z\u00194h\u0007.t\u0015%Cb{SƪN\u0013\t\u0016װP\u0017!,=٪\t\u0007sJ\u0015\u001e\fښRc5F\u0007\u0014.\u00020Ӟ\u000b\bf{(~>l\u001b[VY&S_N[vT(ܞ\f0(y~u\u0010L\"iWKП\u0013gb\u000b}>\u0014'NؤWi&im\u001bŠb\u001e9\u001b\"~\u00189rEtt_,\u0019`i\u0016\u001fs3-notA}!C\u00177yM\u0002}9bV\u000e]煥\u0017\u0003KC'y%\u0016\u000b݂*?Vu\u0017;\u0017\u00108.]w$\u0011'O\u0004e\nU%\u0003>`]\u0012u'\u0012<!\"V\u0004AV\u001cO\u0019(0WY\u0007\u0018`h\t߀K\"BHQPL{ު\f0HN[E=\u0015\u001b:\u001b\u0017\u0010\u0000<S(D\t\u0019h\u001d*\u000b\b`96\u0016\"uwC\u001f&x|Z\u0005\u0004Wa&P?`gv$R5n]\u0012{\r;VܥEKQ\u0003\u00197;?uGNpwɠ\u0019JؑW)6V)\n!\u001b.aJ\u0014RX%\\}oT3\u001dS\u0005\u0004\u001cH\\@0wO9R\u0004Gdޙ\u001d\u0016N>)M?\u0014M\u001f˘Y\n\u0014Y\u000f\u0005[9\u0004y鋙>݌cRWt\u0014a\u0000[Ob8'gЇK\f\n2y[2GL&U\u001a`Cȷ^C\r;\r;\u0012g\n]/\u001dH\u001dr\u001d\u0010#gB\u001a\u001e9ugJ\f\u0003\u0006\b\u0017(rZLU\u001aK\u0000{a,JhLYmc~c~\u000e\u000ej\rI~AXkC{2\u0000tLe\u000f\u001a@\u0012mړ\u0013\n]U\u0000KE_[sޜrO9դ\u001d \u0001pGv|n/I\u0010+\\@6sUJҽ{'e<#e\u000bz<jPi\\c\u0014O\t;vAu\u0013LO΃\u001frAvpVE\ndo\u0003\u0006.Z\u0014>@kna\u000exݏIIi\u0018\\@ \u0016c\u0007%)n7v\b\b\r>\fʑL3\u00108`D,A\u001c\tI\\S42\b\u000f@Q\u000b.c\u0002\f\u00001Y\n|\u000bqB\u0019VXV7\u00197\u0005\u0004C\u001052u\u001e<cxU7Z<̜&4=d\u0014ݬ/%]}\u001b\u000e\u0012\u0019̙5;)~d\u0010i\u000fzQ̴\\@qY]MLM\u00117̓ff6}\u0018\u0014Q\f\u000e\u001d@ȡm\u001a7$n5W;o\u0001ׁ¹`\fߚ,QzQ\u001ce~\u0018(N~_\u0016F1\rT\u001bX\u000b\u001b\u0005\u0004\u0000\u00195qۮ\u0015h'^B`\u001cZܬշ\\3oKlrmq_P폺A\u0013A\u0011nvkC[ FQ W}\n\u001f\u0017\u0010\u0010(\u001a%*ᯎi2(d[Q9\u000bBKr\b\u000b\u001bͦ\u0005\u0006FpD@emڊppd4\u0010\u001d\u0010jL\rA%2\\q9hLy\u0000Vi3kɧ\"\u0014H$`wMAO8l/t\u0016\u0002\u0002VwvHa\f*a7ʥ1\u00125\u0018P8P?+yK6\u0015\u0012d\u0005B\u0019?0mmup]g}a0\u001f7^yZ\u0014R..\u001fS\u000fq?P\u0006\b.4\u000e٠x@\u0000?\u00036\u0005\u0004ۢl1))\u001alf:v\u0018bS\u001cs\u0001\u0001̓LѴ6~\u0000{\u0012̀\tHb>\u0017\u0010N\u0000=u_1ys:D\u001fKZ\"\u001epn\u0002Od \u001a\u001b2%\u0005+}\u000fy\\0\u00193\u0014\u0006\u0005׌u.\u001eʀ\u001b\u000e\row\u000f%.ެ;~p7\r\u0003ڛU(u`\u0000¡ ^r5FlU- \tXD\u0003Yᨨ=ӈU}@8}\u001a\n$Gb1yUM4B`ThdmAB:\u001a\u001c\u0000J3\u0004.F<S\"@:q\rY_GΝ\u0002`L<,Dr\\@P\u0006\u001a2) \fXaz\u0019pl%Zb\u000f\u0010e\u0014\u0016gs#6х\u0005X\u000b\n \u0002\u0000y7}I^o-A9GN;WO^\u0007I(em(\u001e{1\u000eӁbj\u000eޗ\u0007xk|S{S)uxQܫ\u0016Nh0t-Xsrv\b t\u001b1*W\u00166I\u00147\u000bK5n\u001chܸ\u0000\u001c]R\u0018SDNkߴzwdW\u00062YmRF\u0019%\u0012\u000f/f\rt)}Aȭ~vx\u0018\u0018(D4i+\u000bܸO}%PA\u0019(\u0019_V[\u0002\ft\u0000{\\hehrq\u0001bHx A\u001ePMwHBjX\u000b\bnqG۳۸&+vT߂=\f\nm!6\u0019\u0007 c\běr!bZꆕmB+\u0004\u0005\n7Ѩ #[To@\u00149=d܀<E\u0019TGȕeQDH{IW'dP\u000ew\r\u0011\u0005\u0004\u0002zo\u0013\rV[(ub\u0002\u00117\u0003\u0006\u0018\\Q˥\u001cx`a\u0011f%\u0005\u0004ڡ_S꒝\u001dFǀuzN\"P\rӛMi:\u001d\u0001\u001ew9/[D~ \u000b\b`\u0003Gm36OI4j?\u0011Z\u001c\u0016\u0003\n\u0014Z@O4E:ՠ$E\u001c\u0015*;lt8CBT*c\u000e\u000b2K/\n%5d\u001e;,6\rF\u0012idD\u0013)\u000bV\u0012'\u0019[)M\u0018\u0012.Ü\u001fh\baEJLmZ21o\u001a\u0019Q\u0013\u0001S\u0011ou\u0014-Màe\u001a\u0018\u0003;\u0000+D\bV\u0006f\u0006o\u0002\nY\u00127\u001a7ɘ\"gΪ\u0005\u0004/Kʲc\u0014\u0000\u0005BS$vKPu\u0013\b#I_\u0015\u0011\u0000)\u000bD-V\u001eD\u0004VC+\u000f,Zi\\@M}DCyV2ph+\b\n:i\u0011*\b\n\f\u001a@ZL\u0003ZBM<)ڜZ{sZGa>0}y6\u0007#1s\u000ei!\u00046\u001f\u001dF\u0017V%\\\u0014\u0015glnbQQ\u0002\u00120\u0018E칮qY^@9F{%=\bSTteL\\$/'8\b(bJSP6\u0016\u001f\u0012\feLþ'\u0015\u000f\nc\u0013aK\\R6m\u0004X5\u0007A\u001cՇcgↈ\u001b\u001a!n(|8>ّ3Q=\t1ŇyC\u000e&\u0005mr\u0000\u001e)TS\r@2\"\u001c\u000e\u001e=a9\u000b0E\u0003~9\u0001|a=6)\u001bm\u001ecyߣ\u0015\u0001)z$~m\u001bW1H:R\u0005J;qna(\u001b\u0012@nk\u0005nn\u001bh\u0006\u000fFq6ȩ\u0000(\u001cӐ%<6((\u0017\u0010_\u001c\u0014K\u0019}/\u000f!Gv\u0006^݅9~\fT\r\u0013:^DZK\u00015\u0016\u001d¢\u0019>#a\u0000X@#.I-\u0013trU9\u0005;\u0013\u0001ŝc*D\u0003\u0016DY\u000b\r~$\\)&h\u001c)\u001eZ\u000f/2\u001b\b\"}<\u000b?E]K9\u0001\u000fi\t\u0010iW\rih@3qu\u0001\u0002ic 7 uߕZ{oS$2KtԜ\u0017rabD6i6\u0007\b{h\u0016Jv\u001a]?\u001e\bYɬ9\u0002=A>\b? \"g!j{ϲ~r>KCW\u001cWl|K\u0013\u001ct\u0014O%\u000b9Bܫ>\u0013]?\f\u0002\u0002\u001413\u001e#\u001cs35Uumz\u000e P)8y\tƣĜw\"\u0001T\u000bg\u001dU)H.l\u00069mՎ8u<v\u0001{C^RO|4\u0000\u000f)|VΫ}^=\u000fc*%\u0003\u00015cv\u0004\u0011vsH0?Qʉw>\u001aMŎ<>*|MC8\u0014. x\u000f-ueh-\n\u001fdWcɣvPhQ<)ْH\u000be#3\\i#Q\\v2U)匔z0ׁIYM\u0014\u0013\u0019ֈ@;F\f\tGG1^zVP\u0007\u000b\u0000I$#\u0012\u0005\u0004g\nfLʀ6=OeR?\f\u001fqw;\u00028o\u001cg\u0017[\u0017r\u001av\u00029(\u0010RLG\riK-SK?;\u0014\tjJS?xW\u001faV2;ϒ&N\u0007L\u0007=\u001fPz><,\u001e]5/`V<\u001b\u001b\u0018\\n&6Ym\u000f\u0018\u0015.{\u0002G\u0012 8Zh-\"R\u000bd\u0004B,[\u001c\f+>e@X5\u0002\u0014։cӄ@H5\u0002\\8Am&\u0004\u000fr\u001a\u000fi\u001f:\u0002ؑ@φR\u001d\u001cB\u0013K\fe3\u000e\u000bSM\r1\u001e\u0018o\u0018\r\u0010M\u0007J:Ťl5\r{پq)*HQԢs\nL}\u001d0J+\u0016\u00126'y̤\u0015\u0017\u0010%w5z0᨞~گܑ\u0003mvX@oN#DQl\u001c. \u0000`M7!\u0011<yө_\u0001!\\Ѿ-jÎ\u0007\u0016c\u0006ZM1P\u0002sN\u0001b\u001brFJgS\\\f:g\u0015\u0006T\u00071KSH/M[\u000e\fi;\u00056G\u001f\u0011I c.4eyt\u0007^\u001a8*8BԘ#\f$~0~N}y˘ߐeIz<0P^W\n\u00169Rf.P\r1B3\u0016R\u0000\u0018o\u001ajOLU\\,|V}\u001dgehte\u001av\u0018b^HAc`G\u001dS!ŵ=6\b`b\u0016j\u0000\u001f&\u0001AZ:xV>նĒ:\u0003E\u0007a\u0000zR=>\rQ.dEm0 \u001axË11VZӢk\u0002i,؜wb\u0019znVLa`\u0000\t%\u0013jGz\u0016/\u0012\u000452o8EeJ%\u0018=\u0003g\"v|#AX\u0000ņ&*M\u0011AqAXʹu%wO1\u001dݗ8.\u001d_1%I!\u00008M1R+z\u001a^\u001e7G!9?\u0000\u00026\f\u0014TTf֩H\r~P\u00101P=56Mt/$\u0012im\u001b\u0006W\u0006ʊ-\u000e;>x\brʾRP\u0011\r\bZ\u001a4W\u000e\u001d:\"v\"wDbRG<ճqϵ.]=\u000e'C:G&y\u00054?}J09jq\u0016\u001f\u0003U[md\t/DjC\nڜ`[\u001aX<ќ0\u000b\nbRƮcX\f\n0\n8\u0007!~7nP-t!\\hgP\u0013),Ux;;dXҏEeLS\b_\"?q\tM Ӻ|(5D=\u0017_\u0012vrw\u0002b;xxX'C8F'\u001e>\u0000(IQHЛ\u000bsFHN:\"\u000fz}qH,4v\\%ܬEg-N\u000b[\u000b\"짻=S`B֯$~\u0012]5\r}\"L;Qy'TycwKM\u0005/\u0018\u0013։'\u0012ܬeľe?\f\u0019Ty\b^\u0000{T\u000f\u0016ʠ\\q \u0011&=<hE~E-\nML\u001exrw\u0006\u0014<IGy0\u0011b\u0000b\u0000B ^S\u000et!(Z\u000e\u0015\u000eR\u001e[,ZzF3b_\u001f\fsi!ժIiz\\\u0000-\u000b\b&3P$ieHX\t-sV:CDЕu>p\u0006\u0005\f\u0000QPH\u0005O((\u0018a\u0018a\u0018 \b \bʠ,}\u0017\u0019A\u0003\u0007/:*,\u0006tH}(Kz\\@ OJ\u0000\u000ewb\u0013[^\rHO(>-h\u0019$\nd9j\f\u0016!R\u000eQ<`lE\u0010G\u0006\r;j\u0000m\b}\\\u0007?\r\u0010\u0011藻oR8\u001c. Ĺ=fi\u000e\u0006Y`W#\u0007)d\u0010\u0007bpa~֞w\u0006i%\n\u001a#\bמL}8\u0002wI\u0002ɊCc\u0010\u000e\u001bsN>{Y\fB\u0015\u0003\u000eiQ5Q\u0019Z0ܾ%U\u001b>v\u000faP<ܩ\u0012\u001dP-;:\r(wߋ\u0001>%]v\u001f]\bt`\u0018[r1%\r2?\u0012#YIس\u000e\u0016݃\u0016\u0011<E\u0019a\u0001=\u0015\u001b{(!\u0019➗Y3\u0011O^U&\u001cYRA`\u000fM\\`$\f\tg9V:\u001a\u0010['mNy\u001a~\u0018\u0001\u0019I\u0000nz\u001b'*%\u001c%Lw\"\u0019?(\u001d!\u0013Y-L?qmh\u000f\u0011JM~V'=^Rb8^R/\u0013RG;J'\u0000-,ΥJ\r\fL\"mÐ-d\u000eU\nn$\u0016fk\f+{\u0002\u001fjk$2w+tV?&zNZb?\u001b)\t\bӯP?\u001cW,\u0018\u00156\u001e>A\\@\u0019@ja}<w\r>_)Iw!\u001azezqH@$5uV|Od%2(\u001e\u00026Kꋓ)V\u000b\r\u001edC<\u0011?Pr\u001fHg^+i(\r|\u0001n\u0007-\u0010\t\r\u0010.\u0002z4@\u0006詼̻\"z\\o\u0006\r\u0007#\u0006Xŋ\u000bs\u0015\u001b;0\u000e7\u0014\u0015\\\u001fR3q\u0004\u0007Smu_YGN<'CYXk$^bn\u0001䰶\u0019+EK\f\nYn>\fF\u001d3n??\u0013G}+\u0011<\u0005t\u000b\u0002sx}e*\u0015zm\u0018M?a\">\u001d\u0015Vd-ቷkZ\u0018\r(0GY\bп\u000b1\u0007RЈ&d٨)D\\@ I.\u0014R\u001e$U\u0019\u0014\u0000!᳊n6§\u0004NFq\u00194(,S=\u0014ӘSI\u0000z. \u0014\u0003k\"\u0000\n\n\u000eqSMR-VqgCsӠ\u0017Q,\u0012\n!\u0014MoQ8dǸ\\ΩXhr\u00011ɠPg[\u0018JC\u00120fXtay\u0013ډTx6/\u000bsx\u0011\u001b\u001enfⱷ!\u0005J;3\u0011X-\u0015y,Zܛ\u000683:Fޤ8\"FKv\u0012K\u001ca\u0017\f\u0018\u00069\u0016\rC%M_Y\u0019\u0000\r\u001dn\u0007=n}h\u0019q\b\u000fsj\u0010.KD+T(utTX}\u000b,[|ڙ\u0015'1YR`\u0005@AɧE/4\ft\u0000\u0006-lv@C(.v%V\u0011Ot=>\u0001\u0010\nڒ\u0016\u001aa&\u000f\u001ds\u0001\u0001%\u001e7\nKVrx\u0018\u001dy3wF`!UY\u001b\u001cL/yc}jBT\b\u000bC\u000bDYۉڳcc\u0019R˄\u001da\u000bg\u0018v=vF\u0005\u0015ᬠKЖ=jd\u0014N<]Y\u000b\u0011\u00038&t:*F}qV16qW1#\u0010\u0006\u001dU\u001d\u0012W<v\u0010\u0011yxt1@/F]·Vbl)u\u0016Cq8!<~N\u0007\u0012=\u001bbfn&^Q|*3\u000f`9OՏ}\u0006ԕ,\\@x@?\u0005s\u000ew\u0014Jj+ސ\u000b\b\u0010x\u0011\u001e&en_MӖM\u000bH\u001d\u0016H?nha? -`\u000e\u0019`\u0015Z\u001aINYGA9o/)u<*VQũFf՛\r6W\u001fjǼ=\u000b\u0007')?\u001c_H>\u0007;`x\u0003Y?P'։\r\u0010?9(|FJFp$\u0004\u001aB\u0004G+M5ЧrI`v\")\u0006^\u0011e߿ᓥ=e\u0018H-\u0017Ǯ\u000e}P`\u0001;\u0010VQv'j;\u001a\u0010\u0015\u000b*\fwϭ(7H}>\u0018;\u0013\u0017AF\u000b:fZŔ3:RF\u001fTa%q\u0012(sEŘ\u000b\b@. \u0000du<{Qa#2oqi_\u0001c>t)\nJ#@TЖ%E8܅C}Aq\u000bM|\u0001\u0004\u0019\u0016[\u001eRnG3զ*\u000b\u000f\u000e\u001fAƎZZb7\u0004\u0013JF2Q^br\u001c\u001e\"\u001e;)i(SF7vo';'\\\b\u0003֢Z\u001f\u0017\u0010,E;ӈ7\u0002\u0002W.DY!l(v\tjRN\n77]LzQئ\u0011\u001fLޟܙmZ\u0014iע\u0019(\u0016>US`1yKP\u0016ک4\u0014\u001c\rN\u001e\u0014O\u0010UoG\u0019\u0014%\u0003:Vp&\fH\u000be+\u001cL^\u0007M\u001c/D\u0017N?3hv&\u000e\"\u0016Z\rs\u0007c\\m\u000b\u0017\u0010\\@@\"\u0006Z0'Op]\f\u0006J^D\"}S$?#ˇy9N@s|K$RLxR\u000fG1X\u0013 \u0003\u0003pi\u000b\u0000=\f!SL\u0001cI#r̲L\r$UHwܘZH[F%\u001a\u0018\u0014@\u000f\u00044ᰂBG:\u001a,\"=\u0012X'(d$\u0014Tc' \u0007\u000ead=-jB|}A5 \u001f\f\u0005-)$m6\\\\I\u0013=LT\u0013o_M1Οv)\u0014;(\u0006\u0015-WK\u0019\u001d\u0010\u0017hE ~g#j\u001b&dPt&NAXVψi'\u0013r\u0002`3\u0012;\u0017\u0010 E܃\"\fHd\u0007\u0003h4{\u001awU4\"2t_\u0017\u001ar\u0017|\u0012if\u001ciϦN/yo\u0010\u0010![\u0014~Ng\u0018#*J)U`smr!*m\u0007a!\u000b.  =\u000e'/,fOFqd&\u001bjIOΰC)\u001f1?)R\u0012Pꃁob\u0000|8#- cG\u000f\u0013D^P\u0012N\\DQ\u000b抃-DD<,B\u000f\u001c4}'bn/ph{\u0014CPҰ3BOq3G./3%!w\u0004J\u0002\u0002^ddPr|5tfז\u0016\t0y\t,A_GAO[6\u0005Aq\r-MG\u001bV9]$T(\u001e\u0005}%`i\u0004&zL?%֏\u001b1\\+p3\r%q\u001b\u0018gKxaY:(!\u000fS\ro1Z/ɘ}f\r7\u0007Y:~E3ݟ(X\u0002\fNb\\LuDJ}V@ߞ\u001e\u0013%`n\u0014w\\C;1\u0006$(0'hywVtE'8ϏPT\"ȕB:\u0004\u0012;\u0000\fi\ngQ&\bqz4A%\u0001cgRZ+mDhRaJCaͣwD'=QR_\rg\b(\\ӉUS\u0007B9\nD\u0005\b-c\u0010gXкO?\u0013\u0010.4D\u000edkH\nw~Y=R_|\u001aG\u00190n\u0010\u0006SY\u001fD\u0007\u0000Kx\u0013\f\u001f\t\f\\mh5\u0012\u00137;RdmC{\u0001xGJ~\u0018:'\u0003JUqi'\u001cޑ\u001aG\u000f0ՆՐ\u0011\t\"=-,ѦF1(as)h?l_\"[-\u001a!=6Mv\u0010J;\u0011DO߆A`\u0016\u001e\u0013w'Ucq<3\u0016.s}iϪ\u000b\\\\@@Ek3ns\u000eKz\u000b\b\u0006z{MeʩZuvI84{<^iUp1\nH\u001cf3s{4ҿ@\u001el1\u000f)#\u000e\u0006\u001cYݎ2no@ժ(&\u001a6'Y\u000fbRW-\u001d\u00152CW}}\fXwځ]hǅʰQ\u001dl}G'8\u0003)(\u0017\u0010ȞL|~\u001f\u00193\u0006/0Pp`>Υ)~3`1.v\u001eFҿVP-e=\nB\rn+K;2\u0001Q$\u0001F2=KiQ =0a&ᆷBJ$##s\u0013ɧY\u0017^\u0006B9^b(pbaY}B8\u001dR_Uz \rF]-pdWէ\r?F?h\u0003~͐B. ྭA\u001f֨\t}\u0014=B\u00101%a\u001fIUhؤk\u0002#oF\u001ee@:(\rϥg\u0005Ei\u001bXy\u001b\u001dAܾ\u0016Lg\u0018\u0018\u001f\t\"#TGGK\tab'|\u0002!\u001b;a0kR?R\u001fLPna\u0003T~jQl['>[@O({Cq\u0013\u000e2ph0괱c\tJ\u001a绲qTr:\u0004EfA\u001f\u0011j~yԸS@\u0005\b\u0014>3dttF7L\u0002:i\u0006\u00110za@>(0l\u001f\u0014?,ϋ8\u0019\u0019\u0014w|(\u0004v^똢Ja+cOM1Gh*v(/xw&F'iSćLĻ\u0005ըV?A\u0012{C[v|@?/\"'\t\u0013/\u001e\u0013R̲c'\f\u0005\u001djr^s\u0001mp+XdI \u001f7I$\u001aP\u0012y\u0001[!\u000e\f\f\b~=R$\u0017\u0010\u001c>\u0006C\u000e(զǄvf\u0004s!%vD\ri&wp%\u0000ˇBE\u0002d\u0006\u00029b٨l'B05h\u0001ѨUt<\u00141ch\u001d\u0012\b \u0018 \u0012\fIS*=\u0002\u0014\u0000\u0003I6*N@\\(0*0\u0015P\u0018\bb0EQ\u0014\u00071q1\u0000Rl?xq\u0010bY\u0004Jr\u0017%<\u0018;@\\.c\u0007\u0000\\dj%`h\u0001mң\u001c\u001dL2\u000eQ[-υh-0g\u0014\u0007\u001cF[\u001e\rFT\u0000\u0003:\u0014Ue\u0005X\u0011\u0012$7kh*,>;~\b\u0016p>f~MLZ0[\f\u0004 \u0018\u000eGo\tH\u0010z+[C\u0014u-A\u0015{\u0001]\u0002J&Gσ\u001e[\fʜ(TP\r\b+ZܙS65{5!\u000e(\u001d\u0010\u0004K7KVaitsH3\nTU&ݫBwk\u0007Bb\u0006<\u0007+\\܂P֊h)=`X\u0016\r\u0018͠s\u0000t9A'`<\u001b!\u001bhcB)mTX7\f\u001cD\u001dVhȕCX2ynS\"?h.I\b\"\u0015\u0007\u0003*\u0003Mm\u0006ϹD])6\u0015m\u0004m3!érY\u0014\nl_L\u0002\u0014lOr$tQrW\u0002N4u\u00153)v[~smհB\u00194\u0013:#VVn+\u0011EǷ\f\u0002.ܹ=\u0018X\u0006NMHd3!\bI\u000btaӣL\bo'1$!\u001d;r$W\u000e-CLRr\\ҚVR\noL#=N#L\u0016p1]i!4Iö&$\u0002<n\t\u0001\u001aW\u0011Hm|\u000fgo\u00074v\u0002.I\t\u00199?B\u001e~]Zز\u0016\\Z\r7<ʤZ\u0012k[)VW\u000b16o%\u0004zGD\u0002\\w,5\u0017^ D\u001aJ\u0017^]&#\u000bp1#@(aX@F`y\u0003c*l_6=d\u0000Ij\u0007c\ty\bX(-h\u001b\b\t\u0007X^@D;gP·\rXodF\"\u001eܒ}\u0017r7桒\u0007g\"\u0011ɣ\u0007HY\u00147?x1\u0016j<Xk]\u0012ģX\u0013TB\u00194?z\u00157ՑFHzm\fK\u00160R8q\"G^,XN\"*ʻiits\b\u0006\u001fƩ7\u001eyOd<\u001cȻ;\"W까n,ʈ\\Ɣ7\u0018h17\u0015gUv\u001bCxhW\u0011u\u0018\u000fYFxs#ğ\u001aQB\u001a\u0000\r\u001dX\u0011O F\u001aHM<>\u0000\u0006\r=z7-5C<j^\u000bH\u0006%\u0014duĪzW\u0005R\u0000\u000ev\u0011dZH\u0014\u0016\tW\u0013q\u0004\u0013~\u000eF8Hk\u000b1\u0000ڻ3SHX\u0001\u0005EѷFh\bpp\u0016y\u001aWR\u0003.\u00180*\f\u0005мi7\u0011ʚ\u001b˙[MQ\u000f9ILP<Ńj_\u000e~DVL\u0005@\t|D\\X\u001bܫ^pvb[.\u000eRv|\u001e0DYCK1\u0005%\u0004-xėz@.\u0014ZLj\u001ajţ\nJy\u000by\u0006\u0012Ք҂NHHuJ+Ct\u0019\u0018+\u0014P\u0007-\u0007Dp޵lTj1v+zW\u001byJ!Ԛ2_)#30I}ʲ\u001d;ަ2RRwD\u0019\u0002ݿY;o'TB,j\u0001\\X.rJ/D\r2̺EU\bB\u0014G'\u00150E?BCye\u0012q\u0006\\\u0016\u0012$\u0007 s4\n8~\u0002yӍSV\u0012\u0017F,^\u0000p\u0016!r\u0013\u000f8t3m!\u0015\u0005(\u000b&Ye\u001a0CP(\\\u0017[!*,Ҕy\"M\u001809E\u0014:\u0003+\u0001kߒ\u0000z\u001bn\u0012\fN`{-LDc\u0001_Ų\fb\t;\u0003V`\u0019\\uzqIzi\u0000I9\t\u0001Ԝ\u00196\u0018\f\u0012]Q'\u000bS5 \u0012.\t<C\u0016_`Umrl\u000b?32V\u0010&Xdi\rªd7A-(\u001bHr(t`\u0016U2LT\u0001hD\u001f~]}K\u000b@G>h,\u0000\u0004F6\u001bxO=ef\u00003eq\u0013\u0012oʱ0\u0001]\u0016Ei=@?Oo\u0006Ǥ\u0003\r\u0017x\u0018Ѭ\u000f;5\u0012gsY\u00044n,\u0016&#\u0013^n\\\u0004(r @Z\u0017^P<KT9'~/A+A\u0001e\t\bp[fi\u0004\u0001\u00142OA_@%44HQ<*\r>\u0019>낟#>EܽKBX1?1mzY\u0019Of %\t'h\u0004@Y\f\u0002\u0006\u000b\u0014\fvs}=p8e,l,O?:<E%ۦ\fx\u001eQ@3⽦P\u0019\u000bßl<͜&\u001fZrh\fpibnQqnU\u00176qE\u00180q19W/hjf,߷Kxma͖\\]ѣX(Es\u0013\u0007ᅾ,#iX\u0019VS<Y_p'S<9(;|X\u00100t\u0010x\u0000\n(Yp\u001d {\u0005YLXpF%ck9`7N>;G\u0001#?\u000b\bpv*\u000e\u0000P5~ljn!`t7\u0014vrg6eoۖ\r9J]\bL?a\u0004l{cٹK\tzȊ\u0014c?o>D\fU_rm;YŜ*鎈6W_d\u0016W\u001fb\u0000?&;\u001dљ\u0004q7\u001d\u001d<۹\u0000Cͻaww7s69\u0010q\f4 \u001a-\u0010/`\u001c~\u0013\u0012*;^Mb\u0011u?:\u0005\u0016\u0019\u0016h6R\u0014ϰߦxLǾH\u0011^a,%U\u0001\u001e\n_zQmֽ\u001d[uw2\u001f\u0010`e\nX\u0019@\u0007r\u0012Dehj\u0010D\u0007.ΎN\\8q\"\u0002\u001a}\u0000\u0013q^RŹ\u001a\u00015)6P\u001c)Tia7\u0011\u0001):{`Ϊ,\u0004#vIzpO-3Lvc\u000bW\u0003mJ6\u001f\u00129\b\u0015)Xo+\u000eLdy\u001fcM,C\u0011zDhvz6I?\u0014I'+(Ux\u001c;nJo^\u0016۷ũ\u00115҂C\u001aʹnNޚޭK-\u0014o\u0000)cǽˠ\u0007\u0011#;븉wI\u000b\u0014\u0006$.5KpT\u0007ȯ\u0004rf\u0012bߗ%\u0013z(\u001c\u0017\u0015\u0006E´:SGJ)ȣ\u0010t'\u0013Ơ&\u0013變Iy_*|</WT\rN\u0013H?p7h'*hFwd\u001eaV@=O6[(~ʓ9\f~l8\"c6!wH\u001e_q\u0014\\Sn\u00078iQ\"&3IpP&}f\u001e1S%?r!)p\u0000{\n\t\u0018\u0004\u001e}9Gϸ\u0006▅Y\bVا\u00010̜190P\u001a7s,\u000fLvS9W`\u0014h}4\u0016t\u0012Y\u0006*\r\b?w\u0001p(Vt['яQs`\u0000]DR\u000f\u0001Hږtv(d O=JңSO1Јmn8:O'rI\u000f\u0013h}ۡnc\u0017'\t\u0011'8a>?.\"L8\u001c\u0015A\u0006/t/F\"\u0017/#$)\u0015ܞ0H,?K4M\u001f\"\u0016\u0007ό{m}\f\u00132\u0011\u001b>\u001bv\bbgάe\tݤ\u000f:ق\u001dL^@&(y@2\u001e\b'\u0003퐿<ډ\u000f\u0019\u0010JO;3\r\nendstream\rendobj\r19 0 obj\r<</Length 65536>>stream\r\n߹\u0017u^5n<)i N7\b\u0012K=-?\u0017->-Z\u0016\"爺ze<\\]Oat\u0004\u0013g_\fMKlbgA1~93j\u0015\u0015k\u0001\u001br7栉54\u0013\u001aԬ\u00016\\<6\u001e\u0012p\u0013\u001cU4)O\u0000x(=QYC\u0006\b;쿂P[\"D]w\u001at\u0014`,D yV%Eoh\u0000\u0010y1\u0011(j\u001a\u0002뎗]>)Gb\bp\u0012kVK\u0015l56D\f\u0001\u0005\u0000=&\u0000\u001dţ=w[\u0016Q\u001f=UΩ9bkbRR9\b}W\u001d\rQҦCez4vqa`s\u000b]XϜ_]pt.j2Z]pC\u000fHfǦ@\u0017\u0007\u000f\u0011iDa!@ّppQuq\u001fuLS@F.\u0011\u0005\u0015D4\u001d\u0010PwuXf\u001ey@V\u0017#.8f?ܝ\u0011 \u001cUK!&\u0005BÓ.\u0003\ffM7\u000e@Є'\u000b9>N4x\nO\u0002\u0000\r\u0006,,@\u0012G\u0002:OWWpa8\tBd⵪a\u00198{Mnx\u0014\u0012\u0001v|]{3 \n6XV5E\n\u0017b? iA\u0013b\u0011\f\n~H\u0010\"\u0018?\u001eYHDԆi<\u001bȽf\u0007Ƹ\u001bmH\f!dd83b25 1\f+ĭDX\u0012eNW.Sga!%s\u001bei\t\u0015\u000b8s$*\u0018RvP\u0018\u001bC\u001c.'Z\u000b\b5X$ƾMg,\u0015\u0006\u001dic]\u0005\u0007\u0005\u001bQjX&\nBG@m!6V%2^):eb6\n.\tp3X~Wf\rHd\u0000q%^hW9\u0012/{\u0005\u0004\u001b\u00172PoZE\u0017KE\u0019.V\u0011\u0000Q\rd\u0003D|_\u0003i\u0006[<;=7m,l[o!}K,s[j9k\\\u0007WMM|\b\u0002\u0013\u001d$Cfe&w(\u001d\u0010\u000e!aV{jDke2y\u0001\u001e>t't7X/ {`M\u0003M\u000bt\u0002~J3\u0001P:iPsuY\u001dߌ\u0000ҖS\u0005iCh!`\u0011w\u000fY/(\u001f/\u001dN\fhiT(P\u001as\u000f>D$\u0007Q\t\u000fR.\u001eM\u001f.s!\u001cK`lU8X%Bp;=qYנ\"[pu\nmC1\bq8FfBcw9\u0015$fE,)\u0011_͡dبK^zƨ䪗b/\u0000lG39Ok8\u001b\u0011yU{\u0007,\bCH@*%@TX\u0014#It\\N\u0007lRm\u0012f\u0000s|i\\IJ> \u0018?TJ>~Sz\u0006ewצ\u0012cKYb_'_9J\n?a5̮eFb\nr\u0005\u0019+\u001c>\u0011/j\u00003\u0019ɞ7T\u001a#c\u0018zu8\"!GX\u000e7Hl\u0013\u0017\u001dF40Gu\u0001\f\u0013\u0013ӭC\u001e\u0007E܊Pkbޤx\u000f9qZ\u0006\u0004MV\u0003\u00026ҍ%\u0011:*{9\u001e!Pr\u001f\u0003n|H':\u000e&ksl䏃8\u0018I8\u0012M\\I\u0012\"I\u0006\u000b\u0002$G\u000bp&\u0006g`j\u0019Ed\u0002>\u0018+\r\u00191M'\u0013\u000f(͞w\u0016\u000e\u0007,\u001bJX\f\u0012Eq>&9$ \u0013_\bERM%p݇\"Y{F\u0016\u0003\u0019J@8\u001f*\fKFJxqks8:ULG_E-\u000585łd4̍Jܴ^ӕ˹\\Ti#z\u0006Sb<6pʤdXV0DX\u0011IDIyLSc{ޥW?/Wsj\"dg\u0000\u0002\u0006 Y65\u0002k\u0007\u0015\u0000Q l=; \u0007U4\u0005@?\u001f\u0007j\u0002\u0019Ĥ4#iDWLT\u001f`f\u0003O0&[\u000eqs}F\nXPN\r5tM\u0012\u0014x\u0019\u0000Q\u0019\u0001H]^ăq;0;dI}X$@K\u0006 \u0017&\u001dZ}j\"W.V|N]\u0010:KJD+i<q*n[\t\u0001\u0000)`N:tDVh\\kЁTv`ULc3*ϧUu\u0003HxQ*c)ގ1eMJ\u0013\u000f\u0003z=l\u00077Q\u0006IXzO{)3\u0007\u000fD\u0007iTo=Eb\u0010?<sqZ:?/!*\u001f]V\u0012*P{مg\u0000))-C8a\u0012\u000eExm\u0007\u00158^\u000e=T;\b\u0015`!\\vq\u001b!\u0001H#Z.*+wSP\u001e\t;Ul#\u0016J/NzKS\\T_\u0015%k\u0003t\u0004u Ds!h΀w\u0017<I\u001f%$ѿw\u001bJ4\u0018Rx=tk5\u001d{oC\u0011\u000bk ^FjC$ABgZp+.q6IF-n\u0014\u001a\u0000Q/Zd1\"$\u0011?2E\u001c\ntX;Bm\u00049\u000e\u0002W\u001b\r\u0016TX+8&j\"u\u0002\r,.;@\u001cV׈;u\u0013\u0010@F\u0003MFZ\u0010Аō\u0012\u001bzxB\rw;bW\u0001N*F:\"\u0002O11A\u0005\u001fS}gOw\bg$h,t\u0007MÖD\u0010\\t`%,>=\tV)2\u001ag\u001c\u001dGXxZY\u0011\u0019\"H\u001f\u000eD<XzG~M4uahU\u0001m\u001en\u0000=\u0010٬\u001d\u0018\u0001M\u001b\tKaGB\bEBmt̼\u0001)K-B\u0013g\u001f?t_ڤ\\XҴ\u001ezE2\u001e \u0016vBT]c[[p=\u0018_\u001d\u0003&)}P\u0017\rﮣY\u0012\")\rr=<\t5\u000fv%|\u0014E #0EJ=\u001e((.W\u0002e\u0005g>^`n=)ԓ$\tի@p6Z=QU7\u0017\b]d1\fCB\b\u0011(;\u001fq_\u0018&r_r\u0019t/ԕ5h͚qf\u00023('Y;gVk\u0005\u001e\u0003fmo\u000f[?]Q\u0012$}$)ӌ\u0016\u0002b\rMN\u0014\u0004\u0015XK\u0004;!'i\n\u001dV\u001eJ7練1g\u000f#nS5Sl'A\u0006v0p\u001e\u001apխ9\u0019ᒫZ%ˤT¡\u0012D#nB8\u001b/@(\t~%15gʦ^IAҟaEMo*\u0003sB\u0010EABF^C`ѫ%1lCpj\fbKgļC\u0011U%[fQ\u000b\t\u0010\u0012\u0010\u0013z\fP]*E\u000b,-АX\u00165Zv.\u0016.Ì\u0005\thlO;\u001fC2M\u0007\u0019:I3,q\b^ir\ff\u001dc\u0019l\u0017qWQ?jM\u0004$,=y?uү\u0013.D\u001e\fMrH\u001eUp\n\u0010\u0016<5^U9b*\u0013m\u0017 ]s늘\u000b%K\u00012\u000e\u0019+\f\u001ef!GT-)`0uBfqO\ti\u001d|rJ\u0015>;H9\u001a\"p!a9UH\t'Z4lYN(i%xI5'v7xqMY8G6zyȩԙ٧hG;?\u0003mlR\u0003HTL\u001ag3)1Z=B\u0016\u00113H$J&\u001am>v\"\f%6/0J+\u0002}\u0004\rYBQ3ULe\u0014Z#\u0010FYNJ16r!֋\u0019\"\u0014|\u0006.3\u0002՘<:\u0001k\t\"N0|6伞\u0019ʧ\u0013\u0010\b\u001d_حEVC_gdTm'\u000b=ǩ\rR\u0011\"0ꋗ\u0001\u0007Qbi\u0000\u001e3Pr)8~<[9)1O\u0016\u001f[+K\bE=r,y7SfCϪ>YBr\u00025H\u0013+b}\u0010'ڰWUHۥ$qI2U\u0011Q\u000bX\rTh'ڵHzEIw3Z\u0007\u0007^\"\u0000htFÔ|hqJ|\n\u001do\u0007bph\u0015µaaA!q3\u0017\u001bġ\u001a\u000b*:\u001e糐\u0014\u001e?\u000b6gQ\u0006VN\u0006\u000e32O\u0004]\\В%*z,Nseoi\u0014_a\u00078%+d\u0011-Ǳ&G#\nIh`A:BKNUyq9\u0000V\u0012cdu8]QI\u0000=\u0014|[\u0007$Om\nUoϿXΫc\u0013v\u0003\u001a\u0011c97-v X|ӷ\u0000\u0018VJ:\u001b\u001b\u0001\"O\u0019`*u\u0016ved!H6C\u001a\u00057\u0007$yhR.\u00009r|>\u0017վ9=m$O6k.\u001c\f\u0016\u0019D^\u001c)\u0011\u0014\f]`\u0003\u0012\u0000\"I;\u0019ʑ*\u000f9N$K/C8욿t\u000b̌AK<V>mt$L\nҥm8DX=\\\u0019@UŰA\u000f%\bDʥ\u0000D\u001a\u001aHG]\u000b\n)\u0018\u001eAa7?g嶿]\u0011U\u0015ޙצ^\u0006W\u001az~;ZZ}^{N\u0003Q;M%[2\u0005]e\u0010E\u001au1\u000e\u001bXoP!\u0012Ml-\\\rDw܀A\u0004I\u001c\")P\u00103\u0010\u0018ãBb40\\\u0017\u0014X.G\u000b#k\u001dqR\u0001ޒ3\u0018\u0007soN\u00047BE\u0004n\u0001 HHG+o\u0017x\u001b\u0018\u0012\u0010\u0018s>&7<ƶk4\u0019f\u001e\u0004Tw\r\u0015NS<sji\u0007cL\u0000\u001aJ\u0005m Lyٕ@axt\u0019go(LÙK\rok\u0006\u001e\u000eSٗ!\u0002Tuۨ^ﴩB\b7qx>g>5WL^pHȠγW\u000fC'\u001b\u001e\u0016(}e\u001a\u0011o0\bo\u001eMBC\u0015\u000e\u0015Qn+GpT\u0000-B<s۴\"C\u0004w@&ν\n4G˨\tM8[A\u000fYM<6&lnBZC3ra\u0003|SIx\u0014\u0015?(P\u0017x\u0013tsP~ߜ\u0015pȥ\t^\u0017H\u001b8ۿ~޴HNcs*\t\r(qN|^|%wI.w\u0012Zm\u0010ujFB^U݃Dpv˓\\|\tL^\u0003\u001bt>0o\u0013\f\nVV?)2\u0010ˌw̾TH\rXY՘ǹa\\PwĳNvָ\u0014׸\u0004-\u001d3.y!RIq\u001dM=V[;`kqDc枠qW^7l\u0019G\\\u0017t\u0001\u0004l\u001c7D \u001ea-͛]z\u0000(3(m\u0002<\u0010mJ`mDPtCR+k>d5H\u00049Ҹ/)M}\u0002+\fƛ?\u0001\f3\u001d͙Z|W\u000fY\u0012\tOŮ!2\\@Ot\u0011GPn3\u0014ruIǣ\u001bRm*,\u0018dU\r A\u00009\u0000@1A}BF\u000f=-$\"4T\u0003D-\u0007BE5oT{\u0011\t]\u0004mHXt.O͋D\u001cޏЮ\t\u0011+@\u0018@\u0010Y6:E\u0015w\u000b\u0005;CD!ͽ\u0000\u0000$\tЧG]\u0007%%\u0015V\u0001\u001eo:0t;#\u0015RZ2\u001a.m\u0018\u0010W\u0013F\"Ti6l~\u0012W\tPԊ5^Xjz38\u0000\u000b.jAK}\u001eUTCy9{Ko,٥\u001cm;\u001dח\u0000x\tn9홙Җl.붢d?\u0004\fp+tXF\u0000|2}4z\u0003 7Z\u0013\u0004\u001ffl.)XN&^ݝ\u001b\u001b\u001b_\t\u0010\n8\t/Ly-{JԖuzq)\u0005,\u000e_e]!\u0012O<y &lL^]\u0002W9[D\u001b\u000fQ\u0011m\u0007\\\u0014\u001dmyPp\u0006\u0015\u0004&tp#E48\u0017|H-tH\u0007i\u001bj$\u0017\f_\u0003u9fހ\u0002lRg{\u001bgL`e\u000f\u000f$\r\u0019d|V?q\u0018`\u0001w ӑN\u0000u`1\u001dh\n .\u000f\u0000aB>#\u001co(\u001a%\u000e!%j\u0004MCwۘ~APaF\u0015c<\u001e\u00078\u0013ˤ\u0003۝)q\u0017΁{Uͨt\u0014\u000eP\u0003/\u0016S\u0018\u001eHY;+A纁VdQg\"(B\u0004@X\u0005-tLD1Ӻ^\"ŮB#-ɓ\u001en-*sT\u00104o*\ff\u0011S}W$\u0006@Α,/DQ6\u001db\u0007\u0002Hlq\u001ar\u00061m=/\u0016\u0000^+mPSQx\u000fV1\u000ffU[X\u00142dv\u0013ȝU2\u0010{}x&\\\n{%s{{Z|{3u\f>@\u0017ß\\\u001d\u001e)|f0)[%\u0001\u0011\u001c][/V֖\u0005C\u000fg\brS[GOx{IbX\u0018oc3\b;핹2ԥĴB2̎̉u0Z:Z\u0002a.5[y\u0012\u0017\u00053\u001e\u0013\u0019Z\u0018!\u0017\u001a\u0017M׍H|Ė;\u0005FϺk\u0005-\u0016\u00185v4Q\u0016(z+\n-j1\u001d\b?uo5\t;d#t!|C'\u0014S׉Bw55N5hhԠ!U>WZwzy\u000b`O|1Xl|prV24d1}\u0019\u0018$\u0000j\u000e\fx(\u001d\u0002\u0014?o\ty%|y\u0007c\u0012$8\t=V\u0003ۍޓh4nX\u000eX7?NS$\u0005\u0019-gA\u000b\u0018e\nXY\u0016a\u0016}3@fl&d\"\u001fx\u0001@e\nd\u0000!U\u001b*u(\\A(ƎW1Sʕ+ۣ\u0005s'\u0007_G\u0002Jr\t5(zX7(G,P0Pm*\u0001\n(_\u0004\u000eKg4Zv2C(\u000f}w\r\u0006e8)G\u0003R\u0013XsTs\u001e:MC~\u0007'\u001f_\u0015%`>/fruEl˙M_.\u0015\u0000[¸?pg4\u0007E<{]ޔM\u0010\u0012\u0017#誰\u0003mWJY8MQO/\u001eŗT(ū\f9K\nC 00YR\u001f\u001b?5-\u0001\u0010nT\u0010B./uN\u0015m#\u0004X 2\trcD2KNT2'?\u0006bA\tʷ\\IU0+S\u0016[qY+De\rȦhKCjf!s7*\u0003\u0004z8:UR\u0018n\u0002<\u0015\u000fڡ$>u@2(\u001b/)\u0003\u001fbW̳,Ox?2|}X\u001fH~\u001do8*Pg\u001fF\u0016\u001a{\u000e<-4ypk7۳\t\u0005G\u0011ь-\u0004\u0002%!k>]\t؂\u000b,\u0011\u0004U\u001bMn m;Rzim!\u0018@͑J\u0019P\u0014/ 1W\u0012\t\u0004u\u001f#yƏbQ\t#\u0005\u0013&\u001b\u001a6)i\u0004z(7\u001f:\u000412sEӗ|\u000f_Q2e\u0017ffh&?3i]*1fna3Ը\u001b\u0017L\u0006\rVc\u0017\u001dn\u000ft6b\u0012\u0013\b\u001aJ\u0014\t(l\u0001\rP^ФD,n\\\u001duCÍҀ&\u0015C\fuf@I{V\u0002`\u0007\u00071)XT@n\u0000Җ#-vz\u000f5\u0015=j[5(}sxsR\t\ti9Tv$\u0012\n\u0000\u0017\r#$\u00073xwp\f\u0000y\n%9ṱ6\u001dO\u0012\u0017m.\u0017G\u0010@\u001d\num\u0018tԯKv!d#!\u0013Qjj<G:uo^>,AעRw\u0016='(AjP'5Z?rEN\u001d\u001cm#gCo\u0001a\fcǾ\u0010;^v`Yo'tX\tmmo^Ҷ,WL`#E]_\t\u001cl&>#{)\u0014Iy_(i7\\;Rm\u0017(l=z<`\u0002$c\u001d\u0007\u0005\u0006}\u0003ܵ~\u0017)X/,,#%Sً+0jjE:*ҋMM\u0016y\u001a+\u0001hc$=E!C\u001a{\u0005p\u0019ty\u001bg\u0007C\rD\u0013EQ\u001d4^?o\u0014\bRm-\u001cS$.ւpMJ\\W\fܰ\"ɦ-:\u0007uPw0Di/9^Q\u0016Y&W\u0018\u0002ޅO\u0013(/\"\rv\u0006P7y$\u00004̨ekȉ˶\f\"`+<߇o1=BvA{\u0017>&|;Ɂ˸HB\u000f\u0006\u0000\u001c\u0005j^\u001dݻD2*oomڷ\f;5t\u000bݾ\u001e(>\t4B\bU ]\u0013\n*\u001a4k<\u0007r\u001e.R\u0014\u0005#1\u0018WF\u00166)T\u001doh\u001en\u001dbs%!5\u0012k`\u001b,m%:j+Em\u001a\u001fF_bXV \bqX\u0010󵤫U\u001b\u0016\bqTبW\u0004D<=\u000e\u0010E~\u0013Q~Ӑ'\u0014b:\u0018:!'6!~1L\u0010xא)VfX\u0010=\t\u001f`\u000f1h\nh\br\u0006\"!\u000e(jT!V|x+\u000bV\u0003\u0010HO!uBLa~\u001f[C\u0011\u000e\u0012)=g\u001a\u000eSVT\td,j$'Ĺ\u0003GcO\u000fqym\u0000\u0017+BlO\u0010;{Ѩ\u0010s j{\u001f5!N|\u0010\u001e\rd9#88Ёb\f',~..LYa\u0000P6<w>%TRgbD\n3\"Aa\u0000)\u00135&~\u0014'|#ls^uBO\u0005ʀ~3n=}>\\mI4Ƞ˝/M;8 K[)\n:|B9\u0018u~Hr5\u0011M_\r6D0n3Ow~Vu-yF\u0005kmn׬5m\u0014\u0013Hӆ\u0014g\rFY\"`\u0011=W\u0003\u0019\u0017ei-C\u0019\u0006ꞣ*\u0003I\u001bO؀\\!6fAǺI\u0014\u001e(EA\nti~KH-'*\u0019澮\u0006νʶ:AqtZ!\u001a\u0014}ȡV\u00069\u0014\rg//<\u00160t14C4J@K\n\u0007Xݪժo\rAf\u001f\u0002\u0017;\u001b5mFh2\fw\u0003Gx$z᡹\u000fF\u001a0-\u0011A\u001cD^v\u0001fZx/,`Z\u001d-&L\u0002\u0006g%\u0012).\u001c=۬\u001aTCYL$\u0003g爲33qh̛J\f~\u001c4y#\n\u0000Up\u0019|J~O\u0007o\u0017F\r-\u001f\u0001`t\u0015\u001b˞\u00070\u001458ziǫи\u000fެ.m\u0007¯!}'\n(`shKt\t+D`vpۊO#vdX3q9u\u0000CNjDL\u0001c2&Q]\u001an\u0018\u0015\u00071[\u0003*%P\u0018 IwC#kt\"璾SB;\u0002A:\\\u0005\u0003\n_u2!`\u0002fɸw\u001a\\\f\u001f\\x\u00043!0\b7\u0019\\-\\!,\u0002\u0012ԭ$\u0005\u0001t\u001b\u0019-,{\u0004I\u001eq\u001eyP&8S5|R6>_JF>zMXQ]y]*F\u0018B<IN9iivxպk1N'|g\u00019ԝ\u0012UT\u0014b?\u0019$IicŏM0HY\t\\Eݞl\u001eaopU{J\u0006k\u0016Uw-wX\u0006{X<ꈢA\u0014{F\u00026\u0018cR\u0012j\u0006\u0010u\u0007#O}:\r\u000eB\u0006\\T`͎Vȝ\u0018>\u000e\u0010\u001fF\u0011e[_\t\u001b\u001596lpts\u000f¶:O\u00064\u0019+RIrGQ\u00058b ܲ >\"A;YH&81\u0003Qq屧iA\u001cx \u0006:6ÂH(ꪕ|?\\\u000b?\u0010\u00074uqL\u001eg\u0012\u000e<Vnk%7\u001eάs|gLϐX:prIBH\u0014fIv\u00041!M;b\u00161\u001f\u0007\u000erd@͸<{\u0014\u001d`#\u0000\u001bI\b<\u001f\u0018\u00044q)\u0019U\tԨ<\u0003_ag5G0`p9|\u000b\u0002ъFV\u0004>pzel\u001e#\u0014^a.\u0019\u001d g0س\u0006Us\u000f\u0012@\u001c\u0013P!\r!\t@#<>o>u^\\\u001c\b'挿9ΣzUӐm5\u0011(˱3\n\u0012\u001aU\u001eZ\u0004\u0016俶d;\u0004N\u0018{\u0004W\u0005R\\\u0005xVt\u0019\u0001&l*8%ǯ\u0005d\u0004xe\u0002xq8u)\f\u00191c]j6ž\bL]\u0004MA\u000b#.\u0002\u001bk-G\u0017p71?(c\u0013\u00050W(S\u001b\u00027\u001eI(\u0011glwԜ\u0000^\u001aɆ\r]k& _\u0004dnOj搦sxtvHJ/D^-\\N,\u0001N7߇\f>`\rQɽi+v\u0017薛\u000f\u0014t\u0017sO\u0018\u0012/.\u0001u\u0013ϫ\b\u0014fT=>7(0\u000b\u0019t~K#5\u001eQ>նWӇҀHROLk\u0014~\u0007E=r\u0014'wCQ\u0002\u001eZSFS\u0017\u001864\\D\u0001.\u0012k+}`r \u0013*\u0010T~,{\u001bC&\u00025a\fg\u001f\fbaN\u001fr\\)\r\u0003)#ZW\b\u0013(&\u000ej\u0011\u0017\u0013X{A\u000fq0D\u0004kyk:PG7λUݲ<us8S+\u001f,\u000f>j 0Zވe\u000bS˪\rLxa\\\u001b3WFf\u0007'X\u0010\u0012cdM^:QB5`\u0001$\u0015\u001f:>\u001dVw5\u0015}}}}sihsK{?;<o\u001d9Fv|/B\rukF4;顁\u0007\u0004eAC\u0004oOU\u0017\u001a&ۡ\"ԃ\b\u0013 \u001bw\u0018.E^\"s\"\u0010\u001e\u0014l\u000f\u0005$p\u001eiE \u0006̛\u0007E?(Uh&؍:3MݧQd\u0014fqwM;\u0013:6-Uo\u000b\u0003_#L4J4q|՝,ネISS|]iC '}\u0013zc=CSH0畾\u00150\u001fEaO\b\u0015\u0010\u0019\u0014>6͍؄i(}G5>xuQ2\u001e\u0017ͫ?\u0014u&\t\fHL񟉫WE8z<gm&^Zrv\u0010&!\u0001Wl\\Iq\b59. sN&Gx˒ei$;HvAO\u00035%Rdץ`<|nP\u001fǩi܂d\u001f|̌Tccʧɨ2i\u00140'5\nhj*\r\fQjyq\u0017]0\u0015\\&S{1S|f\u0016\u000bs\u0011\u0004f\u0013@c{q{w\u0001$cN\u00049*Vt:\u001533Rܴ\u001eI\u00165{c]Gƺ\u0003v\u000fsN,)8w,MkD'0/D`\fK\u0002#\\G\u0001A%[qn-\u001cZY\u0011e\u0017\u001a@5\u0011gҁ\bH\"s-v+樂\nuI0g\u0010~CQL?\u0001\u001f]\u0013X\u0013ލ\u0000L\u0016IQWyKҜPH),ʑP\b˪b\u001crO}s\u000fV\r\u0004\u001a\u0002YGf[pmHDoEYc|}׮/\u001e8;\u00054iϮn\u0013\u000f)1:?\u0002)z-B\u0002\u000b%\"J}pf3BֱN\u001d\u001cf\u001dvp(\u001d\u0006\u0002bBRj\u000by`\u000b%z:8}.ӡP<acF4\t\\[\u0003f+\bႬM8$5\u000bFv\\]Ij:\u00114X\u001bM!Z>\u0018R>](.(\u0007w\u001d6]\u0013\u001dv\n/\u0010B\t`_hǝ7/,xS 7}\u001aH\u0014U;2\u0001ʯط\u001aďO\u0011\u0010\u00012ޭ;G\u00150r$F4eh\u000f|\u0004ۛR\\\f\u001a\u000b\u000btd\u000b\u0010l}|@\f\f#292Bx\u0011uc \u001f\u0004/=\u0010)\u0017kuC\nV\u0017 <Ze~5t8\u0002884\u0006\u0018]yc\u00049O\u0011[\u0011\b2QtpZZ&{0\f\u0013s\u0017\u0003MXMmoz&77m\b\u0012t1\u0017a}ꞞQ!;qK0fi:wm,z\f\u00001\u00073\b\u001dY|c4m:K[N\u001crҘՅ[PJۋ\u0005K\u0014l4\u0012\u0013 #TzI\u001a\u001c\u0005\u0012.y\u0003|\u0004q;\tq\u001f3N(b3\fx\u0000wd5U۠p\u0012.k\u0007,s\rE?}j\u0010BW\u0010v2Rս}u>\u0015\u001830?>4\u000f\u000f\u0013\u000f\u0012ReX\u0017Cٻ S_ݱ-ĭ9d5\u0007_\u0002\u001d\u000f\u0013\u001eGv\u0015\u000bʄh\u0010]*T\u0002S\u0019\u0002\u0006\u001ckq\u000b\u0018V\u0018rYdi\u0004{\biU2vW$HNՕ\u0012\u0001~q7sG%RAGDfEh1S:Ŧx:Kfsa5\u0005t9\f)bq)T5\u000f\b#'<=w?\u0003\u000e\u000eoW\u001b5H=9GY\u0014ʵfN3t鵹:|T%\u000by^\u0013RM\u0004Cs\na\u001b^-,|2\u0003\u0014S.1̱:lUR?$y1<\u0010\u0007yAfjN\u0019Y\u0019]}F\u00007ճ/SG|v䲷D;ćP\u001aڞ&\u0010y\u0000~ƌ\bel\u0015^.\u001e\u0001![{/e!\"\u0001xh\u0015)'\rXY/qQ-g\u0007\u001adX\u0016ETQ(+5p\r-\u0012\u0002fWXFa\u001dMD\u001d21ǒq\u001e\u001c\u000fЪ\u00110Z%\"N\t|FXU\bp{\u0010\u0015wNSԠ'Ya{z\\j\u0006\bhgLF\u0007)S\u000e_&\u001bd\u001a\u001aGvj\u0011&dKsR\u001a\u0010dtmI\u001cٔު9mjk\"\u0000\u0006>]-\u0004lF\u0006aY\u0001\fnj4É'h2\f\u0007\u0012RD\u0007ߩ(@+-;0JdbE*\u0000(T\u0016\u0010\u001fRNS\u00055\u001b\"x_ѩ\u0002f\u0005\u0019EC\\u쨋A]Pj3Cq^]h@ +H/@ \u000bK7\b3gWt$2_ԛY\u0005kŠw/bܦ'\u0011Β)\u0014\n\"\u0001#m]\u0012D0\u0001\tk\u001cg-\u001cp|Vm\u0012KŐ\u0016F;,\u001c\\9[iVKr\u0001osg\u0004u ׈b?ճ\u001c1@\u001d#\u000eFB\u000f[ѐзnpuL[T\u001f$11vHAB>H\u0019_9}C/XH\u0004*o&Nju3Ԓ#\u0017TZ\u000bHu;q@u7~X{\u0017\u0002GK\\\"\u0003NUy_\u0016=H\u0000g\u0001\u00057mx}h\u001dͼL7J\u000eNp7;\u0019vEՖS,\u0000*\u0015=\"A\u0012X,R6.j\u0010UKp0`ДUU\u0003\"H\u0001kyI#5\r(5gi|\u0010ڢWDJ\u001cHƁO c}91A\u001f:G}\u00117M;Qd\u001eI<v(Fw\u0006C\u0000\tӓ\u0010I0JB@3Wk\u0019\u001eܗTAS.J2\u0017X8XM龐\u00059KP4^\u001f\b\u0016m}g372\u000f&\u0005*E*O_iN\u000e-\b#\u0002\u0018] 懲;75R4\u0002>P«H4\bb5\u0004\u0007G\u0000,M*J\u00048 Ũ\u0015֔(%\t\u0019>\u0017Yi\u0002Xo\u0004j\u0002e\u0005;J훢P5a~}6\u0005TsFI`B3Gc\u0016\u0003Et\u0002\u0011\b6\u0012'p(v\u0004f\u000bQ\u001fxw\u0003ә(<\u0012\u0000\u0003v@HЫw\fT#4d\u001dC۬I붖\u0013!\u001f6ؘۀXW?\u0000\u0004Yk`kg\r\u0014\u001dW&L'$wݧC\u001c:Zٹ]G8jg!SH\u0018Q)9wt$fD51C(R{0\u0011@xx)\u0017\u0004Jxs\"w\u0011=qB|^|zx\u001b\u0013\bVxG\u000b;t,81\u0005:/s5J\u0005*k$JrJ;'HĥTRj^'9٣5?\u00135D,M\u000e\u0019ڦ\bh\fل\u0016\u0001kj~hZ,JpxN\u0011T\nʋ_G~|\u000e<;\u001e-k\u001a:\u001c`\u0005\u0012\u000f\u0006&r\u001a\\4:\u0016c1QZӜ\u001e\u0016mKى\u0007՗ױ8n\u0003\u001e]E>\u001c;\u0000Vdբe\u0013K\u0019ב.i\u0002\u0010e?l,\u0002OϨL\u001ehYS~xY>\u0002\u0004c:icWRI\u0010\"\n\u001c+KH\u00071wT\f\u0003ײCx;K\u0003:N=B$\b\u001dЈz2\u000f*Jm~{.f)\u0004\u0002F |\u001dF\u0005Jgbe\u00194?wMc*otK,Q$KP\u000fUR{6<cE?÷\u0010GSt\u000by.Xqi\u001e\u0003$\u0012A8\t\u000eaFf\\X9\u0006>>\u0018\u001a{'\u0002i\u001d\u0003\"lEWrMn?ﾏɃZee\u000f\u000euJ厒1pxSi{wh\u001546\bS:׬\u0014\u0014x\u001eg\u0007ZA2ፃ-8kᖩ\r#4lw\u0001[R\";N~hZ5zl#+\u000f&3E;?B_Ca\u000082/\u00043X\u001cv\n>7\u001cm>¡b!%\u001e:1\nm<N`\u0003\u001a>Hd\u001c`:Zt.H\u00148Z/0iJz=\u001f\f\u0013ܖgD\u0007~\u0002#P\u0001sm#1\u0010oo~it\u0000ɛkǻ\u0006bY`EVy9\u000f\u001b\u000f$h[\u001f\u0000\u000e.\u000fm;`sVp'Z}\u0000\u0016\u0003%7S\u0002\u001d=Ŝ\u0003\\Ҳ\u001f@<˅ŧvށ{K\u0015EiՇ?&S\u0000X5u8\nF\u0005Z԰sW@\u001bNWB})-KX9@ꃀ\u0012Kms0m\u0005%[\u0001p͙`Ѷ;\u0018Fv\u001c\u0018N\u0012R\u0004<L\u0014P<A3\u0001\u0001U\u0019N(\u0016䁦xkE\u0000ҷ2\u001a\u0003\u0016D(\tD L\u0004\u0000333\u00030\u0000\u00030\u0000\u00030\u0000\u00030\u0000sۭAUl\u0010+\u0012\n6\u00135\u0010w{''\tHV\u0014r\u0019\u0001\f\u0007\u0007=*QfHV.#Bɩ\u001a\u0016i4KCki\\{],˙1KYwsM\u0019sqo>1AX'O4m=/5X\tk\u001d,%bvBEb*\"mġ3\u001d&]*k\u0015\u001e[diU\rcTfjV!Jo>ݲ\u0018qP\u000eFxmW8n\rM$:'{Y{;]wZ46Y:tUY\u001ee٥&?%tojZhom}iw&ճ%fM\u001dk\u000e\u001eB:!rxSMdTyTJS9UWBaВLLJ\u001b%wUL\u001a\u0011-z=S4&\u000f\u0011^Ȇ̐g6\"Ώjz#3ͼ)OᘋЊ9eEU$M*+uZ3H5})}V3D67-6\u0017ܒ<w¡fϏ\u0010CfSڪ\u0017Vs,OuFEIѼ$_\u0019KLa>ϡ;L\fy3\u0019]ew_hBI<R%ՈjGDB<7;Im.kcgVf!֑o%\u0001\r2\u0010W>M̦ʨʪϿh膦lfl4=;P\ra%2\u0018\u0019LS\u0015UEYn\"2kX<lݰl83WUw+c%\u001b*oT/vznE೐ur\u0017K\u001bI\u001f\u0012Z\u00193>sdY,C\u000e=g'V\u001eK}!RIwcS\u0013AĄ\u0003\u001b4\\XAd/邈a|\u0000\u0011Hff3!_#S\u0003\b+\tQZa\u0015\u0000\nkL3S\u001ejwRfJU?q\u001c\b\u00189\r\u001a8V\u0001CH\u00008 \u0012\u0000\u000e\u0013\r\"\u001cl\u0013\u001bNlȣ\u0018+hȠ\f\u001c\u0004MN\u0014\u00059B\u00141VqB\u0006\u0013\u0019-fa\u00167`ب'Z\u0015\u001aF\u001b9&.95\u001b'\u00068qB\u00067(d \u0006\r\u001c\u0017+fqx7\u0013\u0012l*Y\r'H;jB'$\u0018a,w)t8e\\khˤ\tdZAIҕ2I4)N>1WbX\u000b<V:exX\u0000\u00045:G\"\u001b1\u0005\u0001\u0004\u000ejLH\u0004\u000e\u001b\"'fra\u000f#6L\u0001\u0019%\n7(<d2L4!\u000f\u001b-\u000e$\u0007\u0016\u0001`1c\u0004\t\u000f \u0004\u0004Ѐ* i\u0001 \u001d \u0003X\u00035\u0000\u0001\t\bf\u0007\u0010\n! \u0014.\t\u0015ƃ?FÈ\u0014\u001f\u001c1\u0015FL@ 4>X\u0000\u0000?\u0012 \u0017\rĸ\"ņ\u000b0E\u001a \u00177L\u0016\u0013|↉>\u0010b\u0003\u0003\u0019XPȊ\u0004dh`\tD8\u0010*\u0013\u0012\u001e@BÄ\t%\u0013ʄ\u001c\u0012JB\u0015!D\u001aؠ0\u0012\u0002\u0014*\u0000X8Ĉ\n(*qS\"DK\tt\u0012'\u000b\f\rz\"E\r\u0000\u001c\u001aZ\u001124LBC\u0017PB\u0005\u0006(\u0016.\"G\u0002\u0016&N\u0004\u0000X\u000b\u000e\u000eA\u0015\n\u0002W\u0014\n\f\u0007\u0005\u0006\u001a*\u0001\u0001 \u001ds\u0006\u0007\u0015E\u0003\u000e\u0010)\u0012(!\u00184 \u0000\u0019\u0017\u0010lPX\b\u000b*$4bHA\u0006(\u001ex\u0002\u000e'\u0011c\u0007\n\u0014,P\u000bDP\u0017&\u0018@\u0005\u0017A\u0003\u001c\u00110c\u001c@\b\u0000\u0007\u0012\u0003\u0016 9h1$H\u000eB@\u0004ÉpC\u0007!1\u001cHa!\u0010\u000f\u001f\"DbL\u0010,xXAaR\u0005V|\u001b\u0010\u001bA\u0010\tG\b6\u0018\u0010\u0019\"lP`Fx\u0001!ҁ:xa!\u001e6 \u0001\f!B\u0012P\u0010\u000eV(\u000e\fFT\u0010\t\u0006%$\u0004A\u0007J,`\n\u000e\u0000鈐a\b\u001abtD@Q\"\u001e\u0011*P\u000b\u0011>\"(\u001c7\"\u0018\bFH`||8\u0004+`H\n\f\u001aZ3`P\u000f\u0007:\\A\tX`ZCI@E\u0004\u000f\u00058Q\br\u0001ҁ\u001c\b`B\u0018:D`(\b\u00161\"P\u0001A\u00051Z\f\u0011\u0019:!\u001a\u0018\t\u000f T\u0003\u0006J\u0004\u0018p`@Ň\b\u0018\u0006D\nā\n\fT\rT\u0006\u00165H\u0003\u000e\u000b0T\u0007 80\u0001\u0013\u0010l`,\u0005\n\u0004*\"\u0018\u0010\f( \n28P\t\u000f\u000b\u0013X̌\f66 \u001b\u00031\t@E\tY \u0003u@\"C\u0010\bƇ\u0006<\u0010\u0019@\f\u000f\"\u0013LQB\u0018t J\bIXTh\u0002\u0019\u0002\b!C&\u0007\u001b#\fph`C3,p\u0002\u0011AX\u0001p(\t\"\u000e8\u0003\"JKXt\u0010\t:\u0010)\u001aFbp\u0005\u001f>:\u0018@ 2<`6\u000e\"#\u0017|@č\\A\u0003\b\u001f\"%%\u001c\b\u0011C\u0000\"\u0006\u0005\u001c\u0016X`F<\b6H1\u0001;(\u001aP\u0002\u0006\u000b8 ƍ\u0016\nLX\u0002+\"Pс\u0019*bBE\u000b\u0015*TH \u0007\b6r\u0011č\u0017$Z\u0000@\u0005\u0013$@:r\b\"\u0004\r\u0012!\u0004\u0010B\u0006\tH\u0001\u0015$>t\u0018\u000eH$`#\u0004\b4Bhq\"D\u0006!@:\"\u0000\u0003\n3>↉\u000e@phЀ\u0006堂\u00054̐\u0001%2(\u0004(&ؠc:\b\u0005( \u0019l \u000f\f6PAX\u0000aB\u0007\u0005rPa\u00076L\u0004-\u001b\t\u0011 /\f<\u0004\u0000\u00036ltp\n\u001b!F\u0005\nH,aCJ\u0018\u0010tCH`L\u0010\u0006\u0015aC\n\u000bQB\u0011\t\u0001\u0007\u0007+$TI \u0003#$0>,\u0004d\u00005HH\f\u0017L(\n\u0012\u001e@XDR(\u0005\u0018\u0014\u0019!\u001e<^X \u0014  >Ja@\u0000!%\u0011\u0012\u0000!Rc\u0006\u000f\"84ЀBK\u000b\u0000\n\u001a\u0017:P\u0004$!\u000bt\u00184m\u0014D\u00028\\I+\\ a!\u0012\u0003H\u0007\u0001\u001cHH4\u0010C\r\u00131\u0002\"\u0005\u0005\u000bXP`\u0001F1\u0002Ƈ2bLD\ba\f \u0001\u0003.B\u0007\u0006:8AB\u0018\u001b$:HQ#\u0000\rc\u0005\u0018*XB\b\u0012\u001e@P\u0002D\u0005\u0006H\u0014\b\u00075T\u0005,:\"\u0004\n7DlF\u0011\u0006\"\r\r\u001e\u000f\t\u001d\u0015cp\u0011#D\u0004N`1\u001cĈ`\u0005\f\u001d8a\"DH\u0007\r4\u001f2L\u0007\n\u0005\u0013dP\u001aCa00\u0000G\u0005$J)#\u0016\u0012 \u0017\u0013\u0006\u000498,@\u0002\u0002\u0006(\u0018\u0001XfX\u0018@\u0001`n\u0000y!\u001a\u0015|\b\u0001\ndhARP\u0002]\u0010\u0004\u0003%:\"p\b*(\u0011\u000bD:\u0011B\u0001\u0003\u001b\"U\u0000J\b\u0019\"\u0012@\u0010\u000b0\n\u001a@\u0006\u0015|DxQb) \u0005%\u001f:6`\u0006\u0005\u001a\u0000Hy\nm\u0010\u0014\u0017$\r\u001e+:0h!D\u000b@AȀ\u000e\t\u0017A9\u0006\u00152L\u0002\u0005!5\u0001\u0014X`CF\bH\u000f\u001f\u00162 D\fA\"#\u0000DNć\u000e\u001d\u0003F\f\t\u000f \n\u0012%%2@R\u0015\u000bpƇ@R\u001ddp\u000b\u0012\tB\u0000\u0011&\b@i\f#Ѣ\r\u000e4X\u00101y\u0000\u0001$\u0001\"\u0012\u001e@ \u0001Ƅ@\u0001\tHM\u00186Q\"`\u0003\u0015\u0011\u0006\u0003\u0003\u001c*\\6\u000bRP\u0000\u0002($\u0014TDP`\u0003\u0015\u001e\u001ea\u0016\u0014@aA\u0000\t \u000b\u00154d,T\"E\n\u0014eA:.!bH\r\t\b\u0011G@ΰ\u0000C\b1↉N\u0005!JI!DH\u0006\u0014@a*d& !B\u0003\u000f\u000e$\u001atT@R\u0002bD\b\u0005\u000b\u0014(\u0018\u0013\u0014\f$\u000f\u000ee\u001fc\u0003\u0011\u0019jx@\u0005\u0005\u0010'NpQ\u0015 \u0018Ĉ`\u001e$x\u0000\u0005\f\u0002P 8\u000f%4\u0002xAB\u0001\b\r\u0014\u0002,4\u0003\u0005;\u0007\u001a\t\u0002`\u00188\u000b\r\n\u001bnࠀ/ `@\u0001\u0005J<ĉAB\u0005\t\u001a\u001c\u0010!F\u0004\u0003\u000f\u00157L\u0001\u000b\u0015|!\u0005\u000eN|\u0004,gcR\u0017┚4CӇ919YK3c'4\u001c)s?ڕ2i,J̾U_\u0016U\u001dY*^+\u001d%\u0015\"*_(I\u00178.\u001f*^Z\u0015=iE5;\u0013dg\u0017RkҌ47XZt]\u001d֎ղ\u001a*cxS,tC.fNj.e:\"[q.)4ט&ؽ+,|-vK'c~yVY>{ܻ\u001a\u001dflK+=mA'eR,\u0013j)Ϯ䲴m<u\u001e\u001am\\|?aV\\}RV/9m\u0006HiUƿ\\\u0011|\u001bsӃWx\u0006=sv\u0015Ur2o,<4d'\":TnI\u001d\u000f%Z9k_V_HC6uLTU\u0017Dl]%\u0010ȌSzOIS9TpUޱ$9OFMۗ̌*wA<*,?iCy\\]f/{-ml\u0019\\#<uw\u0016\u000e\u0019\u0012\u0007mMSD-<6kof\u0013ߒXgNB7d8DeJyL*8ie6sש{k\u0010e&\u0019ڥi>\u0019Iݬg9yv+d![8\u0005BZ\u0015*[U_ESyE/acRg~VOl2*ICפv\u0012}_GIsq\u001a2YMc!HXnUz\u0017]3Ԟ2>[.dXCeF9x\u001d\u001d9.+}fvn:\\X,4$\tn=,^b\u0015t:oĢZo3JUI7}|9UO3\u001dT{\"\\\u0010&[fr4:;&3z[+gzwJߋ(_\u0013\u0013ѕ\u0019lg\u0012~َҽ0/kre\u00060;e}(?)]}\u0012\"+1Srf\"[3t7\"\u0018+]!wR=\\Wg*ә\u0015'?w%(gD37&-M4\u0019'Mw\u0015\u001c]ױv&u3ϺG0_է7%/ߒ\u00155_T\u0012?֦32֢+o&yTԡ\u0011\r6LqƦ\u001dMM\"\u0016NFir+߳vt\u0016XUt&\u0015o*\u000fݔ/IeF9<\u001a>_}BGG2++V͛kZaU\u00134Sf\u0011\u0015O.\\5\u0000a\u00047#_-\u0012M5KM^˙U%\u0013ԖuT2\u000f[ixook:E\u001b+oq9sirV\u001f\u0010aRUUyTnF*mmZ7ITR\u001aÞiJtHVkxM\u0015WlZNզWN}Ƿ31&<fY>uxA2'y:tYTY\u0013rr!ScMU\rw[5I[?˪;T\u000btS&\u0005W+/6w>iX\ndSe\u001fow\f6l\u001eaJ\u001f@\u0018)[Zd\u001ek}b`7e`1־ߟ\u001fk\u0010[\u001b\u001a$6MGT\u000e\u0000\u0013ν33\b0fRo<ӘlYJY7Q\u0001\u0000\u0014ќVS/;[4Y\u000efDezr\nJa],ìfK^\u001d[hBf}\u0016\u00123;'fWkxUdvўfBJU'k\rM\u000bMnW\u001c\u001b\nݮו\u0016T\nD$\u000e2܈\n]Tj97l]lc\u0017ӆ369߅FYGC鮓jUN\"&M2\u001d#\u0016ׯ&{sB\u0012%Q\u00132#V\"fR ֕+.356]=UdEaK\u0019Ū\u001dB\u00010-7`Dʻ\u0013N'egV>x%\f\u001aMU+^׎rGT4L4J2gYY?IכlUV\u0011Wړ^,E\u0010\u0005̘/oRSX8-x\u001e?2y4YV'ţШZ1m+/_iRi6'r\u0013Bz\u0016͔2tKfKU?&b\u0019q\u0018fZ\u0007\u0011e^2\u0014K\u0019J5:WsԦ[ABk?h\u001a_3gwt<Pw]Ӟr>ʙylgD6e\fǬ̊Q戦P\u0015\u001a'\u0007gwdwRUcV\u0012ѵs+]bn)N\u0006)|=t\u001d[jjdύ㷪f\u0011Ǌ.Ykx\u001bq\b]5ek\u000eEtue#9 \f\t\nof\rZ\nFYϤ7WNl!tUxd>,P\u000eڋ\u0012_ VMG;lʜLOT<l)ӼdDGl/t\u00152FCh4VO\u0013\u000f,;tW_/¹q~![>3\u0014U$\u00115l츤u\u001f\u001c[)ɊcLT!ʪYñ\\WY!;DkfUdB\u001bRv>`,7&\f\u000fzJ5y+#u'fL4VduWɲHSkm\u0012_\u0017lphHXd{ȌE4\u001c\u001c*Lf~a6\n~E5tr~\"L\u0013++)J塳2σd7v?\"$I,4{\u0016\u0015r\f砑\r\u001ftN9\r]˒Xs^V\rԲut+5egvBc3-:\u001d,]%^+>\u001deW9EwXyeiX3\u0017v&YVfs\"ZUݔR9O[Θ.\u001fRILHhԪ=|ʏVw7\u0015^I3Omq̞WV\u001d'De3kXS2x&z7y̼LL˱Z\u001e_\u001acH\u001erq3.k~6yvY\u0013Y_bHg%,vԪYYT\u001e*b/qܹ|cHew\t1<\u001b1/\r]\u001aD<\u001a)_奺?w\b?{-;A\u001cLن2C\u0017b[aّ,1̬ȷxw\u0011-gud\u001cW\"`=}1dmLG?43̻m:\u000bK\u0012\\ܩN<O\rb14B<ڊ'^^P{Qﾖ7ZF4Y9z\u001d\u0011ָWgYMjMϪ)I<\u001dz5ù&;ס\f|d-+ъz\u001dD*8)iTox\"qlDcW9gټ햬\b\u0017]9Fdg?՚՗Ak?>Hc3=\u0017ޙʆ|\u001b_&Y\u0012)]Jy\u000eӪ6bǼze(^+UeizNna\u001a;S6Oi\u00198߱d(3ػt\u000bzD/[\u000e|^BDj4:#5gΊW|ϤhVy1Өncgf\u001c3\u001a/߼͹{\u001d]$ϔi2U^X^\u0012忲?gҨ4WpVtUY|\u000bЈ○2Kܲ\bxqUGOX\u0017eW)6VyJ|Tsu:Cd9L\u001fy4\u001dU]4Lj\r\u0007؛M\u0011RZ\u0015֍\u0005M١\u001dr~xևn:W\u001cJB(8c\u0012h^Iي|9e\\Y~\u001a\u0011jԩ\u001dOi\u0013MfPJF]j(ǦyjsR\u0013\u0012i*u9vu9+gTj־Қu97}W̬|Z#sU\u0011\u001dfʘk\nM5\u000eVNIY\u001b4?)GDxZ6\u0011뵱\nrUN]WOR#[͆F_ݨnșVjwcsGf=4LdT)\u001aeT?Fl<rN\u0019ɮCX>>Ҡ\u000fk#[Qy:?M\u001bJgY\u0017?Yf?WA2\rwٿYw+V5U$鷮wgּú*?W\\i\u001bX:~ՔY\rҹh\n1l$\u0016*|!W2(t?i4cOA[0OUe\u0005_1\b'E9w\u0006\u000bX\u0002`\u0000`\u000106`\u0002^\u0000`\u0003\u0006\u0000\r\u001a\u0016\rp\u0001\u00064\u0001\rh\u0005\u0016,\u001c\u0002\u0000-\u001c\u0000\u0007<\u0001\u000fp\u0000\u000b\u0000<\u0001,\u001e\u0000\bXb\n\b@\u0004R\u0000 \u0005\u0000\"È\u0007\u0010|TɅ\u00148Rhф&5\u0017#&&&\u0016!\u000bYG\u0003\b FL2Tb\u0005\f\u0002\u0000\u0002ɈL*Px\u0000\u000b-dp\u0011\u00136Z\u001c EɑS\u0006])q|6h7F-n7*I\u0011ullZãnⴴ4vsՋ/]㻛ӅUxS\u001f2BUT6Ǜ(\tdU~^2'<Wt\u001eV'h4GiQ1\"y-seʖet\n\u0015U\u000e\u0019\u00113mgU6w2r\u001e^\u000e/ҸVRbzn;\u001e# %:Ϯ狎sgXʤ42Չ9ͣK~\u00177.Df2:Y\u000ej)+\u00153;Y:v\u0016ʶ5X\b*N³cՌ_}mX.8IgncY\u001dx\\2Y\u001acFv]T^\\\u0015=9wyHT=%^b#Ks\u001bYwW~##k]qҲիzf%*=Cg~}W\\iәܒu-\u0017\u0015\u001bzUsyE-wحg\u0011i.\u0013g;8\u001fj7yilűڮ\u0013!=ň\u001ds&69>g)[r\u0012}dSH='LWJЪIXXeU<v9G\u001ewL\u0017U[gSƣ=\u0016\u0015:ɒc\u0015*GWx!S\u0017>ϒnrC3T슨-<\u001a\u001b7hϜR߲cV[bfuu4/*zShJv\u0005Sg\u001dDWF\u0012FTZH\u001fC\u001fgl#l\u000fL;e-tFcJrR-j\u001c\u0015r%Zwct\u0006{L$\u001b\u0019=G\u001c\u0019*f\u0011%ylng|fx\u001bdfW۩\\F8OK*\u001b_\u0011O>=}Y\u0012\reeRN-z%)\u0019ty485W\u0001\u0015\u0019,k%uΔ[ы$⯔o;9t\u000e\u0015ՔјxW̐T]'n\n>TH>\u00154UY\u001d'{X-s\\۩hy+SKngT]WzTC\u000eI>ՒZ\b\u000fɲn\bI|K>GBV-hO\"\r\u0015rFwӔc\u001a:lyӺM-5s-o'65I\"avP;2fIOɴďl6o9^/?g5vC.v7\\\\4d7EW_Dyf\u001a\r=V6]fD\u0017#{4ON/o6<\u0010;Fwv\u001b'7ٍEκMuS<TGDg)̫+v'imӰٿQ\nlE65ݲ\u000e{>O>o*w\u0010U\u0007\u000b\u000ei'#4_\rC6Y5\u001ad9xX\fϣ2gUj&;c⑬\u0006]ZS[G-5fm~^>Ǫw)*\u0015!O֯Ȭ V4īDRn2j3GŦ<U\u0019W}zң\n̬Vz,̺x]9\u000b5[vdTWe>t_\u0013\u0016b!mVWJΒ)J*3\r\u001b*MdhM#g9\u000b\u0014/J`aјƪ|\u0011h$\u0010\u0002\u0018\u001d\\CXu%zUbZ]޹Ј3Jٳ\u0015:\\'N[YеRBKTˣ˗g\u0013\\y\u0018/ji~U,ΫΦ\u001c+,{11<g)>\u000bcm5\u000b\u00042zZVjxv\u0010>SRї)H5׮J/ԔI՛*$v\u0017o\u001f/k^ƓgT6Sg%'\u0016\u0011\nMg\n[×\u0016Hy,Ԗ\"]iG*W:ߣzʱ҈&(^vOˤ~{\u0019\u001d\n/WI߈hnG8?N\n\u0012\u000e\n;ޒV\fa\u001aZAql\\5sV(\u000bZ5ڨuYd\u0005:3*ôTKkTwg%T{Q^U5,L\u001cEgwOwN0fUʛf\u001f\u0015]g[~eVMi2+\u00014M$tLiX*\u0000\u0000\u0000\u0011\u0000\u0000\u0010(\u0014\tDb᠌8\u000f\u0014\u0003>\t#\u001cb\u0018\u0005A\f0!\u0018A\u0010c2)\u0011 \u0000\u001b\\\"\n_,$\u0010}@Ι\u0012L\u0014Vp(\u000e\u000fBRCP:J|X\u001a+?\u0003zW\u001faIl(#F_\u0018\f;١x\u000ec\u0019\u0011,\n=ʾ\u0006i\r^A\u0017\u0018\u0013~\u0011e\u0010ݗ\u001e\u0010\u000et\t\u0002\r.Um\u0007p3\u0013J~vQ\u0015Lt[礪*7d\u0005kX\u000f:\u0002bhpۣ28\u0004m\t\n\u0011գ^@)\u0005\u001bQo\u001b)\n'\u00073\u0018\u001d\u001an\u00039\u0015{M+\b\u001fu?F\u0006\u001a9e\b$\u001e\u00166H\u0000(o\u0000q)~H5t5Z\u0000Nח&yw+é\u0003p_r6QG\u0005wC\u0001B?S\u001en(䎬,B\u0018C\u0012&G\u0010|8\u0010j@Q@1\u0001{\u0000ʹ\u0010\"X@\u001fG\fA{@\u0017vKg@O+\nufS5A#\\\u001bU0~/\u0017\u0006[Hz1Í'\u001a8i0pq\f\u0014\u0016h!ZJu5\u001c\u001a{^\t|<o[:$UE0jh%NxGzwZ>fi\u0003q\u001bm\u0005\u000b}(\f9.M\rצ8\u001c\u001a,ϐ%&\u0011\u001aq+)&R6QiΓLdW\u001d;]覓)ҏl+\u0010ս1 H|)jXgi\u00042\u001bl% &\u0006}\"X\r*ڈEI\u0005y\u000f`Ϝ6CN\u0000\u0017ך0\nǗS{rÊ$|;ܗn+\u0001\"9\u00119a\u0005Ic\u001b锬:ƺ\u0003Y)\u0007_\fV:\u001bi,1\u0012˲~Y4\u000b[edˆ\u0018M5\u001b?>_ـ_f\u0018\bZ*sѕa(цkmEN\u0007\u0015=̅\u0013^Gh&%}{N\u0018YSS\u0000ѥ\b1{6 #U\u0013U$,|\u001d4R%:G\u0018z\nG$\nWo=~Y-\u00116;\u0011^B\t<h$i^`4\u00111\u000e\u000b5Fcs?H\u0013/XRx\u0018σɇ`qqȕ!ez%ȿr,äYWz\rXvC&n\u0003Z\u000bcQ6R4t^\"5\u0018\u0006\u0015ދT\u0001`Oq|?\u0014\"i\\\u000bl\u001eAIGo\b=ؤ`dy\u0010\u001de񒵶t3^)H`7D9ݦ\u0002-VYl:\u0003\u0016J;rsD+B:U\u001b+d^E\u001b-^3=\u001fn.;\u001dQhm\u0007t\u0013\u000egr\u0016PHu\u00120\u0002RǕ\u0001]\u0007ĥ:>\u0019B\u0012AT2&2}κB\u001fɭ,\u000684n\u0014SC\u0003  \rE#K0Y(0c{^Q\u0003\u0010׋:P-\"P**~Z7?obWr\u0004W77b|bHZP\u000fT\u0016\u0002TJx'\u0002ˊX5}8_xT,~P$\u0015?O56А)\u0000VtH.4\u0007}R~\u0005+E\u001cMX\u0019\nѐP\u000egwPXh7FJ\u0013AYτ\u001f,\u0004ⴟɣO/\u001a9BZ/Y3ҕFy0|K;t/SV\f-;Zgߔh6\u0015^oI\u0014-(6\r\u00136d`\u00111\u0006QLx^ \r,\u00179\u0003Y;DޣFهB\u0015`qG0*\u0013o!~'IE\u0016,|4\t(jcnBzt`Uh\u0016\u0010&qL|e%K]T!aC'\u001ac[\"9\u0003w+D*:oR8Biڔy$>\u001c\u00069\"\u0010\u0017UU\u000fOԛQ5a8a$v]\"7,\neP\u001b]k5\u001a|\\I˅+\u0016\t\f[z0~\nMGa^I\u0013\t\\Nmj\u001a\r!>5`\u001e\u000e4L/HRl8\ftL2̭S\u0007кtxzh/BT0/\u000e\u0006\u0016\u0013NY7E͠52#nY\u0012\u001a\u0003Z\u0012\"x)\tu.G\\ݙuKssP\u001bu\" \u000bҲLͼ><18\u0013!\u0004hH|{gLD-\u0000R)WDb\u0006\rH\u0014/o`0ztHUlkqO\u0016{>y\u0010nYRxGғ\u001e\by(T\u00042L ۬?\u0005\u0019<\u0014\u0000MHZ\f\u0003{'Jp~\u000eXEUBv\u0012[\u00125&\tC`\u0010\u0001U)cS;bqHv\u0006\u0002\u0014pVs:],+¶љ8Fywܥ\u001e\u001bKpf\u000bmƁ47\u0001evyZ$D\u0017)LE,\ty\u0000J\r\u0017o ShUj\b=i\u0001\u0016\u0016]A S.6n\u000f=Y-qäS+\u0004lt\u0001t(p95Ϭh$\\h5<\u001cj%㘲\u0012i%uV0csJ*Fγe8Z\u001eDe7jړY\u001fu`-:(*ɲ\nLʢE\u0001\u0015\u0001q\u000e*\u001ah\u0015C0\u000e܀TU]\tO:bh\t\u0005J\\UξyQjd#ЩbF+P\u000eW6\u0007\t6\u0012T\ra\u0001Trׁ\u001d\f\b-aD?\u0017pwq\u0018\u0014폟=|V0\u001bdՆmd\u000eDsb*\r\b%/S\u0002=v*\u0014}RL\u0000A\u0014\u0007\u0014\u0000:\u0019=%3G{`Hv\u0014ӛ<4\u001aSq\u001f\u000b\u001bHTg8E(ZC\u0007*~a,7\u0012[\u0010]G>}bA\b\baeJ\\Sº;\u001f^\\?=Čߡ\rY[D\u000b$__v>\u0011F5g\t`\u0007qLK:\u001b\u0012tQ#h6DzY\u000f_[@Ļ0 \b`eU]$\u0010ݸ o֨uR$BIج\u0019nPk$%Ů^:MQiqtE\u0018\u0001p\u0013\t.rFh\u001f3\u0007\nƂ\u0003\f\u001cW;nÆueaKPq\u0004,4J&\u000frzY\u000b\t\r#+89dؓl-%\u001159R5ˌ-!ă-݋Er94zٸoA)wȁx&\u0005+h\u001fp:Brಜ\r|D\bK6ijJ#\u001cΟ2,|7\u0011\u0006SJHg\u001e#:9\u001e^\u0015\u0011GP[c#2N@\u0015\u0010\u0013\u0004,Ŗ͖A\u0007Xn\u001f^\fxqiPUhlyt\tQ@\u0007򎲤Q;\u0000ar7sO\u0002hNł6V(v\u0010\u00103?\u001b\u001b;\u0007\u0004Ɵ\fDw\u001bI<Q\u0017\u001abSNS\u000e\u0001Ϋ)$lgepj\t̏\b\b\u0003w\nȦ:R\u001cj3$-^\u001aJA#J^4\u0019rP%]߹l$(e\u0004\u00057\u001c\boRf\u0012>n2pU\u0016ez8jݽFj.E^n\u0000!=\u000e\u0015G<yTrK673\u001b`\u0000j\u00034\u0012&\u001dTZ!\u0017y\u0019p\r^\u000fg\u001a: OXxk[&j\u001cuJ\u0005j\b1^\u0002\u000f/\u00027I9Ǖ:m\u0006Ȭ\u0002!|@\u0003\"U^݆WR\u0010gRӯ\u0005\u0003tƐ7TH\tH0\u0012A\nMǌ`0\n/j\t\\(PhʬAO\r$TNȇ=lr>kEU\u0012Jf8B1\u001dC%pEP\u000eCc\u0010\f\u0015u;&N1TB\b\u0017\u000bfͰ\u0014Wn;>\u001bC\u0005\u0019xōק\u001d\r7Xմ!\u0002!b;cC\u0005r-CE1ZK&r4%C㰚uguкٙw\":9a\"pD\"\u001f*#F@b\u001b\tҸ%Aeq\u0018cfwk\u000f\u0019ϱBf\u00120>P޽G\u0016v\u001bw[ǘ\u0018K8j(\b\u0001G<\u0005|lq&g)+OQ\u0018\u0014\u0014$5e@<\u001d\u0005B`Ί͡Õ1\"!\u0018@sZ]/-L\u0001TQR4U\\&7]\u000f\r\u0012\u0012ϝiq\f\u0000oCB\u0014J\u001arxGHeIPg8d(jwll\nW\t`Oʨk\u0015'2\u0005|_OhK)\u0004Fn\u0007!e\u001c\u001f>,@i \"_q9Xo\u0012\u0014SvܥxV8\u0018'\u0004\u0019kVh~/%\u00008\u000ee[8E\u00176!_vNPV\u001bK\u001cG#\u0019Vfĝjuid7fMtG=^ҫ)\u0017Hl\f8M@ݚkGO%+\u0016\u001f}W{{ \u0011d)\u0000:A\u0018gadf\u000f0h>B\rw@yI z[8dae-0\u0018dxƖ|N!Z9p\u000eflh'ՕSn2qX 5GK6eq?\\\u000f\u000bg!d\u0018JT[\n1nF\u001c+\u000e`\u0012JA V\u0011\u0006XX2ܿ&_#mY%y\u0002xM_c\bD6\tGr#䥼#Ҝ\u0004bQ\u00148Qb\fy7f(\u0015R;5a\u001eY6?[\u0013p1%/1)SIX\r\u0013T\n'5%0Ɇr-u@\\{\u0016.\"ݍ<_\u0002`\u000fND\u0004A\r\u000fF\u0004\u001e\fa\u0007Q\u0010\\f\u0007\u0016ުKf\u0001\u00121`N\nJt]\u0006Dg\u001c&\u0014\u0019\\_~h^\u000e`s1C`wjb\u0016Q\u0017g~\u00107͡\t`\u0006R\tĒ\rH?\\\u0007\u00152p} ީ[@q#4=.\u0015bN+&x[aT\"\u0004\b2jEL\u001f`t~\u000bo`*\u0012\b\"7\f\u0018$\u0018#\u000fwϱZ\u000b9\\!U\u001dJ8\rB\u0004\u0000uXXIB@h\u0015\u0004\u0014Y׌ʻTSr!E\u00059Ց,\u0012J\tײ\u0017\u001a^*ggĬ:ZƻLFu٧bdhe\u0004b\u0017|GOKPplzqU\u001f\n*mX\u0001H8\u0016zV:\u0011\b)F\u000e\u0012 \u001aS@lxH<\u000fǲۚ\u0010\u0006NVhæ\u001bU(\t\u0005U\u000e\u001cv(\u001dYI^'@\u0018WU~xʘ׭\u0003YC\u0018[Ǩ\u001a\u0013\u0004{\u0002Sx|w_AN\bK\u0001\u0018D?\u0005G@NPv\t\f}\u0001b^Ò4:zL/\u0007\u0019]0st*auVǞ&7+\u0017P)\u001cd\u000e⊠չ8t(\u000biHEVښM$A\u0012\u0003AFk=Ck\u0019JvǆAc\u0007w\u001b!\u0017\u001ea#$TT}p=ʢC\u0018~Y7]݃?-'\u001aƋ-\"*DW|}\u001fǫ\u0011(:\"\u0003C2~3,hm>\u001c\u000b9>\u000eJ+'wY\u001cD5ڰL\u0001R1\u0011x7щSI\u001a~]\u000bA\u001bB;*\u0003}T[u\u0003BeEA8J'Aoi5*k2?\u001cD\u0012\u001e\u0019\u0006)>B*Yo%u+oW5W'[1.uWݦП˿BE\"I\u000e\u0013'08UZV*g\nkg\u0018%HmS\u0014}Y)\u0016ZBT\\xf^,W1W񞱭\u0012ObS\n\u0012\u0010l#'ET&J\bw~\u0011+\fxZ\u0011}dX\u0013MTZN)79I\u000eҡ\u001aF+\u0014Jxl! Q4Z<\u001c!XBG+S9^B3pNPx\u0016\u0011ؖMd@K\u0007mQ\u0017$a\f\u0007cnR*\u0006%~LLfx\u0013%Btu})u\u001cAoVzLA\u0018@ҵ\u0017׸.\u000eϖ\u0011\u00007;dvź\u0010֖\u0013VL! 4QO\\\u001dI\ts}\u001apPZ\u0015\u0015*~\u0005Jy|\u0014Ah6{9M 1\u0016KpsTd\u001ai@Cai J\u0017(u舼L1\u0006347B\f\u0000\u0017ue\fӐޗ\fXFɮ\u0007\u0011\u001b=\"bqd\u0016\u0011IJr|lMd`TW½)?\u001b\u0001T(\u0006-LB?]f\u0006cEx\u0004\u0003\u0005\u0002ɝc\u0002HVa\u00079)+DsC::(\r4ϵ\t\u0014w\u001cш0H\u001d\u000e%F*\u0007\fp\u00014\b$o`\u001a\b_p-l-lEx6ٹHq[\u0016\u0005!/8Y11|\u0013ܾFv ȑNؐ*dT\u001c(r_r\u001d0Rh&Д\"P\t%\\%2\u0002C\u0013{1\u0010d5}N\u000fC!\u001d{D~;aO\u0018@(\u001eO4nL\u0013O(}ĩ!2yAw-J\u0006\u0012%K\r\u0014\u0007\r\u0016?@/\u0006|\u0014\u0010+gʆ{2\u001f\u0010\t>R'R:\u0015jh\u0004~EIiKu\u0012SkI[kC\u001c\u001f}Ŝ\bswd1℘%c)z\u000b\u0017=ZW='*ܡ'G(\u0001\u001f+}gWs\u0010jddR6@_If\b,E|J#ͬ^2lq\n@\u0001)۞FC ~\u0019gv\u0003\u001b-G\u0018)HP\u0011pw5g\u001e.cރjĕl>Z\b\u00060FgY\u0000DڕדH6І*;F\u0012P>y\u0016@C>\u00115:kh\u0018ðȰ\u0012\u0011~r](\u001b{߯3\\]\u0018k̚\u0006eׯ΃t .sړ-\b:/V\"Nb\u001cMo\u000e-P6H\r\u0000]9\u000bys_]\ne%|\u0004\u000e\u001e\u000bb\u0016>(\u0013\b:1\u0002\u001e\u001f\u000fYݜl\b_\u001d\ni;9{-\u001b\u0014&e\fߍ\u0000i֣m6tćKx{\u0003=q71\u000b\u0002\u0006|cuv\u001e\b`rfCcInJb+o\r\u0019:\f,Txt\ra;`\bngd^\u000f\u001bpȧlh\u0005%kI3g\u0012B\u000bϻ\u0005\u001dx\u0002\u0014s>LE,9\u0002#BB7`B+Y:ub\u0012c\u0013jM\\\u0011ļT\u0006J\u0004z\u00153}\u0012r\\a\u0014wvl[4\u0001W0w-+2Z\u0018lT¶T\u0012ouhj<\u001e\u0011\u0010w\u0014{Ɛ\u0004rW\u001cBo؏v\nhd3E#ݙnH䌫8xh)H\u000b\u0004\u0002Q\"a\nESa\\\rqV\nNH\u0002ֆD$.B,d̶gAv\n9/|\u0018\u0017+UF6\u00062I-\u0015>qZ\u0015&LAfc3\u0018gߠ%^9\u0013!_Vpx_156G\u0013UI98U|KZW\b8\u0000<:\r^\u001e=dp\u000f\u0012xތS'\u0012\u001eʦb\u0019M\u001cCȬYo\n\fXH2ԧќW:\u00052!\nt\nCWCi#ݳ,\t\u0016tuylD/\u001bΆVb\u0012$uE\"\nBI^qȗ\u0015ӲX\u0017Pŉ_\nf~2O0e-d-聆\u0005긱Z\u001ffKne(2\u0015~pN\r-\u001bB\f3\b)\u001a5v\u000fI&p@V\n=\u0015\u001a7ڡe\u0003\u0019L+\u0002g\u0000``\u001eWl\u0014ٽW#}\u0014Ӕk[\u0015w\u0013\u001e\u001f\u00173l:\u001b\u0013%ʷ-\u0001_WS~a\u0019hGy\u0016L\u0011q>\u0019\u00104\u001eX\u0015/\u0005\u0011\rf\u000bz2zfg׻.,a!3 \u0002N\u0004\f3o\u0001:VM\tl\u0011@\u0013X&U\u0015uF+)hC\u0010r@MD2,\u001ftO3\u0012yJ_8\u0014\u0018(%?cqk&Meث\rD''\u0006k\u0018[;\u0001\u001e\u0018|\u0005;b\u0006E\u001aKF?wxTcֿ+:PL05\u0012qo\u0000{Qَf\ru|4tm\u0004JIjI-9DE=\r/Bѩ6RZ]婢\\n7Uߔ8\u0000UcȀʧ\u000b(Zs\u0012|.}x\u000b_$m0LD(\u0012#{\u000b>ށ\u0003\u001a\u0005y;\fF:b+o~T\u0000_4G\u001b1 Ϸ@FU\\\u0003qYϪ)ذxfi\u0012X;i^\u000b#\u0006a%b-A#rk2\u001a|sdrkG\u000e\u0006^J\u0018\r0w/tO8\u0003Xx䲗VJ\b\u0003\u000b\u0007Ww$Ԅdɭ8fbR߹\u0006ݯQG+\u0003*05W\u0012J\u001b$\u001bc\u0016Ɏb\u0012ͱj~ \u0000C's\u0019;#\u0000\u001b\u0018}~)\u00114Y6MU\"PxP\u0004<ƅdXPt\u0016P\u0004H\u001a9\u0001j/g@[Bu%!\u0006\u0017H2EqUP.y䢑_s\rCi\u0007s*mgݖ\u000f;\u0010_ݼyx(f+!,T9oE(KD\u0007\u001b\tx\r썘x-!Pn\th\u0005C\u0012\u00156`8jcV҂XFI;IQ|h\u001f\n[\u00059\u001creg\u0002:\fmd7\u001d\u0016\u0002%$@~xB\u000b˽\b\nx~L\u0010zZg \u000eX.!M|4˟؊2˺HF{KP\nz kUZmv\u001egaF\u0003Fg0q{\u000f9Q\f\u0017$\u0015**M28\u0005\u0005G|ɓw䛡\u000fi\u0017T\\BI\"M7ZHe?\u001d9+]i-(\u0002h=$D\r8-\"sJ*LM<ݓBB$t\u0010\u0017D]Hukce'K\n7\u001e;\u0001]i\rci,|\n6E8\b\u0002*/%M\u0015\u0007IS:XodWEEyc7\u0015\u0004DT|ǲdN5?Av$(<X>t7n~.LKǡx`SJMJ\u001dZw\u0019r\fϾaC\u001fH\"F7z-\u0014$0ĴSq\u0015\u001d%t\u0010:%4BG¶.P\u0015v\u0012+\u0015Ki\u0018;U^0Hk+:N\u0018aI.،2t\u001ca\u0015\u001a/`#3\u0000<0)\f<m_fTh\u00137\u0004I9<\u001aBKEh%c,\u0015Z밣BA5xQSm\u001dw\u0007²\u0018W;л\fRs?`.\f\u00008\u0011ӳ^\u0003v7=\u0014$<MP6`p/L&祛1`P܎3GRE\u0018ZX\"\u0005\u0019ݧI6∦~\u001a.2̛\u0004ų6>\u0004u{\u0015)}QUpb\u0013dI=8\no|\t;H,:<T7b8vrYNO˒C\u000fN\u0010\u000edq_<\u0014F岽'+zՅ\u001aeeA`TMȃl\u0019=\u001fNS\u0018(nK6޵:\nm\u000e\u001c\u001a<\u0018\u0000BĲ=JǕ\u001a]N Ȅ6HlX9YÖ9\u000eX|5]9qAMW\rA\u000fƎ6ki\u0006i\u000f\u0001ENM]7\u0003AxET\u0018\r3\u00000\u001f͉\t%Rz\u001a0Z}N)Ȗ^\u0012w{^.dwWƵӊff\u0010ѵM*\u001aޠ\u0007\u0001\u001d-D\nu&K\u0018%#Wל\u001fPf\u0018bnۏp$6VHfrVE.\u001c\u0001O0^\u0011VLeBl,0/s\u0018(\"DR\u0004\bsAP\u0019\u0003u\t# q\u0017\u001e\\}0`{d\u001c؛yUY\u0012\u001cW\u00161\u0010 0IF\fdÛE\u0001\u0010\u001a`$\n\u001b\u0011A\r\u0003\bqx.\u001dA@yvBe\u0013{ViֳhvgC3LwNL\u0014K\"\"ӓXIB\u0016VGF\u0006,]\u0003$D8xmMp\u00018թ\u001bM'&1M6]r1\u000e\u0004\u0011\u0018$=Z\u0015Z!rkbb\u0000\u001b_\u001dPʴ6\u0018+#('=1\u0018B\u0015!G&3\n#\n(\u001d!m`K\n\u001e\u0019 {WP}Xb)輪;>B\rRv\ba\u001eF9FR+\u0000\b-\u000e7/IA[h\u000b#p&޸\bTn.\u000b\u0003z\u000f,\u0004QCx`j\nrg\u0011cdȚRz\u0010gmjE\u0011cQAh%Ρ\n\u000659cW ЈrSrDi>9\u0012K/~ҖO\u0018+\tAzG}3\u0010\u0004顨rd8YɿJ\u001aFZa\u0014\u0012$x\u001c\u0018B3\tl]kA #Jtc[_ Ò&\u0007qC\nlVBhw艀}`rbrZ{_!+\u0011z\u0003Y!qnr0J\t]ѣ(<\u0012m1WAR\u0011]I\u0007d\u0019^,g~Zb\r\n: +\r\u0018%*\u0013LYx40+=[LdПx7?\bvp\u001fI{@\u001d@I@Wd;\u00188\u001e;bWE\u000e]J+Tc\u0012-X\u00060n8pB!7h_sSƇ\u0001Fx\u0012Z\u0018\u001a؏{LH\\^\u0016\u001c|',h\u0004\u0005LĖr!34CڨZ\t#K\u001d\u0010`^y\u001c\u001b!ވ\u001b\u0001¤)wgP͞\u0007\u0010\n\u000f7*\u0018 \ny\u0002s8;@Z-K$ox\u001f},6\b^ khqj+M#ɐ\u001d.+\u0003pU\u0013-S9Qy\u0012g.\u0006\u0012SvL;r_\u000e~c\u0003<\u0014/,!\u0002@I\u000bu\u001a(C߳(1)6i,\u001a*\u0001WdU]+gSz2\u001dܹI\u0001\u0006\u0005\u0000x6It)Fh+a\u00168?\u0005\u0003v/@D\u00110\u0015\u0019_\u0005\u001a\u001a02\u001a胑ۡP\u001a7$\u0015'QJ;wP/\tߴ\u0013>w\u000e]ۗ i顏0u4R\u001dh4f\u0012\nEh\n}{m\u0012F\u00121H\"G\u0013++$x;>f\\LV[u\u0001C\u001e'r!@%[D]9\u001c~C2К%\u0004bg8\u0019R\u0019|lkQOیږ\u001fkˤbm;*+\u0016E\u0011\u001c\"C'D\u0005zpK]\bXr\u0014dPxJVtȐ뎑\tȃ_H\u0006\u001d\\I+X1 Gq\u0013|K\u0014a\u0017\u0017 Q C\u001b\u0006\u0015FŤgZF3[\u0000\u0004͋S\u00180Ԃ]4fKT\u0017\u0012>,\u0017gކk-91`_mj\u0001_p);j~X]ԠIN\u00024B\u001f\r\u00069Ci2EarHXd>ݽ\u0016\u0015m\b\u000fz$0\u0014/Vٙ[\u0002Y\u0004fyx8!m[!bc\u0002\u0001i\u001e;R~ŽOiu\u0017-\u0018\u0002T\fh\u00159xo\u001c9;,g\r?,\u0017.\u0011R'\u001a4:þ\u000f\u0005\u0013_G\u0016\u00157`\u001d\u0014I{\u0017r72S3\b2f\u0003 z\u001fH;\u0019U\t$\u0003tT;3.\u000f\n\u0001BB@ųQD'i\rJ1>wHlQ5)$#\n귭K̈Kћ2ݮ\u0018\u0015\u000ba\b'-\b+!?=6]5v#0QDKL\u001f\u0014\u0017V>6\u0004\u0007Q3ˢaXIg\u0003s\u0010<\u0011|P bw\u0016.x]gdM\u0001\u0004iA#rI޹ta%} yK`(\u0006%\u0016\u0001\u000f@$*\rM\u0002`\t\u0019`\u0013\u00065kwܔW0H\t\u000eK1nbl􃆅\u0014\u0015>A/ \u0001\\\u000fևMZ)W(e\t\u001f(-\u001cRRx\r\f\u0007F듍0 c\u0011Ǵ\u0006\\HeĬ]1B?(st\b\u0017h)Q0\"\u001cGHS\u0004s褫IF}RþL\fE$pģ\b[z\u000fJ\u0015>bYIlZL\u0011\u0005iG\u001bC`\u00030\boq6s0#\u0000Q\u001506ğ^XY AiV\u000eq2o(M\u0001=;K\u0001٨M\u0016\u001eخ:O'\u0002q4m*\u00031Y\u001bG@.\"\u0004_\u0005\u001a\fb\u0012ƌm \u0003\u0014\u0013\u0011n\u001a0\u00029N'в\u0013e\u001cҟ0,<ud5bb\u0018\u0010\u0002+0yǞ\u0014wVcHQ\u0005\u0012Be\u001f\u0016\u0005)ft?|kd\u000bxø\u000e\u0007C%\u000bc\u0002_\u000f \u0015{ \u0005\u000e.Aj\u001a\u000f\u0003y}MNɒX\u001a*\\\u0014&?%éRKb \u000fB2ͿZH[h!\fitJ\u0005td'\u0018\u001fʢ~1\u0014\u00179\u0016\u0000\u0018@X2\u001eWn#\u001frbӪ\u0017\u000eBW/\u001d|=(FF:n\n\u0019\u0018\"\u000f'~Hj\"\u0011KQ[\u001b-tG9\u0002gM;T8[~Z[+3nl˄P\u000fX4\u0005gϙ\u000eы1Nn۷N*&^uFH7TnVxX\u0019\u0002Gn\u001b\u0014\u0019gTXZp٧ױU\u00153\\{\u0013ď#Yۧ](GJ\u0005\u000frQpK9\u0014;l4\u001dYutwcG7>a\f`\u0015G\u00007Tc,\u0019,{\u0004\u0017\u000fƅ*\u001fGd\u001b?I!+I\u0018ӮkTⓥi\u001fH`\t펳TF!I:A\t<\u001c\u001cr!J_qn}@K_E\u001bK%>1\"\u0015\u0007ڂag\u001f\u001aO;\u0005\\\u0000z\u0012Meb92s@MT\u001fGZzSw@ $+\u0017\u00153&t2\u0018/RY\u0015Q8uC\u001d-ڳMǢ#\u0016v²\u0011\\\u0000Y$*9O-p$neV\u0016[K'\u0000\r\u000b?勾YqC\u0000/\u0002ї|af\u001b\u0002O\\v>̲\u0018_\u001b=\u0003N\u0011\u0012E%R=r,~;:񅼦^\u0012\u001c$\u0014\r%p\u0013\u001a<<V߳_ FGR?M<7fO\":C:\u001by\u0002\u001e\fA~\u0000GB\u0017L\u0017\tF0x}\u000b\u001ca\u000bi.¦\u00127_z\u0016桛\u0006sq#\u001f*,\u0019L\u0002@U\u0000^\u000eV=+0Ǻto\u0014\u000f\u0003:\u00113LCS\u0004tq\u0007r&a=K\u000fx[\u001cr@\u0007Rt@8x!\u0015>Cu&n&''\u0004Ǧ\ttؼ\u001e@,}VA\u0011uLARc\u0016od2#\u001c$r\u0011}*\u0018\u0003p)\u0000I:`Զ\n ~D+\u000ei$\bx}\"\tm?Tb3CO_\u0018?\u0012a,Yx?r{ܶ,\u0003tr;\u0018,\fr9\u000717\u000f<17$V \u0007>\u0007_0\\OE\u0010\u000f$t\\,SVV97,.\u00011o㯊d\fv\u0004YQ/\"7E\u0000\"Tt`\r\u0015S\u0014\rcC3Հ\u001b1AG0H\u00145&;^f\u000fzJ\u00055^\u0012ǂ\u0003Lx,O E:0Q7\u0014\n±\u001fH\t\u0000\u0004P\\_hQ0h\t`̏o\u0019i<'#]D$H{H\u001anfF\u0016|.\u001eI?>@-dm>\u001e?I]Oh\u0018\u001fN]-\u000bj\u0006\u0001$Џ\u0013\r\u0002d\u0000==6iԲvO0@{٧\u0005\bx\u0013iߣD6a\bH!\u0007/Qɂ^\u0003Q\u001a\u0019Y!\u0015'O{V\tz}3T\u0016Q.,lp\\)\u001c\u0005\u0001UD\u0016IyGsV]wФ*\b_,ĆZF\u0004~&W\u000f)tiJ9L5\u0016\u000eF\u0014.8?7p&\u0002\u0007u_/.؅E\u000b$pC\u001bhG\u0014g\"nd*|\u001c\u0018E5m\be\u0006^bZ\u0019\f\u001auFkDV:\u0006&֚&\u001fi8\fĘ\tv\r\u0006;[9>\u0013\u001e\u000b)$\u001dxR\u0014+J+B\\1\u0001\"|CԱ\u0012\u0015(#XO\u0005}G%n\"\"2Aa>5\u0003񅌱-~J\u001a\u0000_>&aP\u0019Ϗ#Evvn\f9f\u0012x}+hC5~i \u0014\u000eVU6bK\u0004\"\u001eW\b~Ygg.^@4\u0000\u0014D<\u00167\f\u0016\u001e\u000e_TS?r ܰ3J/LPG(\r3|(cg!)Q\u001bI!g \u000eߜCe{g7E93\u0003\"O\\&x\u0006\u0004-Aꉨ8\u001dFJ; $uզ\u0019\tM\u0017\u00035hGs\bS\\N.\t\u0016Es} >G#\u0019)\u0017b'\u0002\u0010R1Ǔ\f#\u000fǃi\u0001#o)! KL\u0018pqFP@0\u001eW\u0013\u00025ψE3~Wzp(̻p(8)4VC\u0014\u0007qUz7kESP(\rkY*=\rpeZI\u0016\u0014\re$M\u0017V\u001ĉT\u00198@\u0019e\u0006:y<\u0012Vz\u0018\u000b0M\tFIzX\u0003X_ZAO\u0014G\t.I\u0003\u0006~Vu?2͈]L@\u001c\u001fkNњX1\u001bm V;D\u001b2gw+m xNWz1ihtS!\b\u0011؟a'b3^\u001a02,^\u0017:F$H\u0002\u001d\u0006bO6ha*\u0000'\u0001\u001f;!\u00014A\tR_\"00\u0000oM\u00040PR\u000fe5~_Whs2\u0018E\"\u001bQ\u0016\u0006\u001aC(phĉNC\u001b\u0014)\u0005T$ίSJ\u001fTV܋#\u0015\u00138/\"q?O\u0019t\u00073 V\u00141\u0007@\u0017TN\u0015l$;֐\u000e\\p\u001dK\u0017P>s?.\u0019q\nZ[\\\u0019IYxZZ$\u000e\u001am\\άZvta\b\r;fmO\u001c>\u0015bF\u000b\rh<j҇-Lkh5ީ6\u0003|\u0011Ӿ\rEBT,``v\u0001PG}`n\u000b\u001c\u0016yQL\u001e0Eu\u0005u41{ϗ\"R)3\u000f@wrIӮ\u0010\u001cD2\u0002W\u0010vmc֔yҫO2[Px'ڴPP@\b̠y}P\"\f\u0001,U\u0000\u0000ND\f!`\\漩C$Pn_Ëz\u0006\u0000t\u0010n+n1\u0000C9lheH\u000fۣ\\Љ]#߇S~YN\u0002N\u0002|Zv(\fVT\u0018bبc\u0019\u0010/aLC\u001a%\u0013\u0010\\\u0014J\u001a\u0013 D\u000f\u0015l\u001eIj\u0019r\rQ\n4|8\u001ajڸ$ېي\u0006oo~\u0018湷ӷ\r\u001b\u001ec\tw6?#,i(v\u0012\u0007m&,\u0016߅g\u0015)9A\u000e?\u001d\u001csJ\b'\t\"H\f2XZ?5kT/\u0010*?\"G\u0018\u0011{`AT\u001f(j\u0016\u0000?ED4<E+\u0002>8@A\u0019aڹ<붆 5ӱ!L_/d%\b8\u0019f\u0011\u00067Ew(Q[\u0007\u001c\u000e\b\u0002Ǣ#HL['\u0002G,K\u0013zH\u0010`#Iy_.\u001c\f}\\%0x7ԏ>\u0002\u0006\rk\u0006[\u0013^1\\:\u000f<%]#?\u0005\u001a\u0011\u000f\u001eY.4+Pm*A\u0017m\u0013\u000bxk\u0002jkGi.=GHF\tz\u0014&r޳9*sZ\u001f)v&\u0002\u0014qK\u0002S\u0017\u001d$QâVq\u001c\\\u0018\u0007-6أ\u001cN\rW\u0011\u000fw)H-VxC9\u0019\t\\o\u0016ܝ\u001e.>\u0000fDRhmPIj-\b!\u0001I\u000e>M\u0004\u0011:\u0017v$dn#,Tub\u0016f\u0000m\u0006Qg\u0004\u0004^a2aD,Ux\u000b\u000eӝ70i9z\f&k툲F>R\u0001\u0015߲  Hɹ隃Ym,(\u00127+p\fg\u0000dұ\u0010}yhWA\u0001\u001f͡/\u0011[\u0005\u0000RNȗXY)\fi\u0019'GXx12v/\nX5\u0014\u0017 ,ƼԌ\u00001\u0006\u0002DsX5J\u0000mU\u0016 $Mke'2%\u0012'[\u001a\u0019w*Ff=\f\u000e .D\u001e\u0010C(R|Ï2\u0006(#S:b\u0002\u0019\\\u00159F$1\u0006QS3\u0018\\#sF\u0019cV/}Qse\u0014fqERWXMdD4qo1V\u0010/<\u0004\u0019\"Ŕ\u0003,\u001fZ?ixV+[x<\"A\u0003E|a\b\bz\b0\u001dk1##d\u0014 ,a\bI*qN.R\u001aJ\u0014\f\u0014qbVJ'\u000f\\D\u0018\u0016HXˢ\u0015\u0005wB\u0001'OJ0\u0002>HFDp\u001fA?Bk3!0i\u001c`YMl&&2A\u000bU]Mi\u0012aʖ0\u0005B\u0013=A:񣐎MIQ\u001e\n͍BzB\u0017;|8\u0017}\u000fY<> [\u000fQ|u67\u000eR$\bڏ\u0015U\u000f\u001c\u0017@oaS^*̐\u0011\nC\u00120:\u0013C/\r\u0012\"T`#Vz\u0018\\ڟ\u0013\u000e%ϣ*&b;j3;YMfp\u0002ʁw~\u0004 315\u0000\u0010%-\"pG~\u0019\u0002\":♘<nb\\APd7y\u0003`z\u0002N\u001e\u0018@UȰ\r'=\u0002^\bUEA\u001a\u0010\u000f\u0016\u0011MW?HKΞq\t%\u0003z1l[\u001dEC\f$R)\u0019@ub\fC\nÛl\u0004e[(1%YA.[EɔbLE[h\u000ev&\u00104\u0007EW\u0017l(l`'x\n,\n=wk<R㧟K5&\u001bf,gF:oh|\u0011\u0000O\u0012މc*=DYtSIh\u0005Y\u0011e\bf\u0014Yr\u0013mmL\bB@\n\"<},=u^ȞfJ\f%@FTa\u001a,\u0006v\u0003\u0012+\u0001\u0017\u0018`/.\u000b\u000bm|\u0001\u0007'\u0006ه\u0005_\u0001~\rs8\n'\u0006NҘ\u0010\u001fz\u0001jF<ryK>\rQ\f\\-\u001anWӶ\r0U=q\u0019#>H?v+2\u001bQu]W\u0001ϬbQ(\u0010?t\u0000Jz\u001aH\nm\u0005ҝk:\u001e΄(I\blcx6'V[\f%\u0012\bZ~[0\u0004\u0012fa\u0019fa\u0019fa\u000f\u0001\u0001\u0001W\u00159OoU+r!\u001c!u8uT\u001cr_dTܓ/}!\u0007O2*C\u001e\u001c䄺z:pOO\u001f3?>~ \u0000?\b\u0000\u001f\u000f\u001e\u000f\u0006\u0007A\u0006 #\u0001GG\u0007@!#q\u000f\u000ea0 Gǅ\u001d\u000e\u001ap\u0018q\\\u000656\u001a\u001858Q\u001bAF]oA\u001cndhl\u0010\u001a'jhAq\f\u0005\u0018\u0019'\u00163~TcA/00\u000b~tqĸq-.0~x'\u0013$/\u0014\u0002yt\u0017ߛ\u0003\n\u0004\u0015\tʊsxHLPAH&HRTL,)\u0015\u001c\u0010|bI8sbxS\u00049\u0004\u0001&s913%nj2%ΔpL\u0006L\u0011&S\fyΧ\u0019ap\f\f|\u0002\u0011\u0005\u0011N$'{\u0017(p7\u0019\t<#\"3$\u0002P\u0001\u0001\u0004\u0004\n8t\u0001(\u0005\nxT)\u001a\u0000\u0002\u0019\u0017\u0010e4{BnZ.  mX-D\\\u0007r}oݪBk\u0005mj.2\u0015>]\u0012]r[Z^bh-]V\u0018\u0019ZPA3\u001b(|oWw¦U\u0005f(h*E/0$;\n\u0011Mip6VK\fړ\u001bE(B2\u001bvw*\u0016b\f|\u001eF\u0004a몬l\u0017\u0010|oաV\u0016\u0004j)ry~w&(8JoIk^k2ʗRU嶲||%T'8muov$ߕX\u000eABJEXU$\u0013LZ\u0014R#\u0004uCLZvU\u001f*\u000eyEF&L\u0013\u0016%r\u0019\u0015;aQr(ϥ|>ɪ\u0013\u0016,&-{r\u001a\u0015K'oO\u0003O\u0011x#$O2\nVFܑ_\n~u\u0013;(\u0011wWJ+K^oV F\u001b9\ra>ɨ\u0017>Ϥg'=ϧ?~(4\nMJJJBh4\u001aBпRTIII)z\u000eJ\u001d>|Ç\u000f\u001e>|@\u0000\u0001\u0002D`4Uj0j<GQW,\u0014ƃ\u0003KmT\\\u0013IU .Ԛ\u0018׏\u000f\fFfÓ3\u001cu\u0002jK\u0015f.&сt\u0003\u0006'\u0006{m\u0000J[\u001ez\u000e3$Ӛyi}\u0018Z\u0003K\u001dyig(\\@48=:\u0018xjz\"\u0019ڌ&a\u0007271a;ߛUԺj,hp\u001e\f;fA\u0005D#ɐ\f:\u001bWk.h'\u0005f\u0005Dcs\u0013y\u000f\n\u0005f(&qA6>7|m՚{V5!\u0019\n\u001ah~,h\u0015GD-JJІo\u0017\u0018!\u0019沚3iYnCjZQQgY6˭\\.gn6ۿk[eu]q8v~W׶m.[\u0015eܿӵm˲le\u001f~y<\u001eotNӵ?\f\u000btn^\u000fa㹮s]8/,s\u001e\f/~7f^i<s\u001c|q\u001c|>ie9eY\u0007\u0002@\u001a\by?\u0018\f\u0006B\u0010H~4\u00064\r\u0004ү뺮A \u0010\u000fC\"Z(42\u0012\nBa0\u0013Ebq8422kh4\u0016z8\u001c\u000eu]<\u001eGcX$\u000e\u001fEcHFXD\"#H$\u0012<:::H$W*J2\\.KRg.\\*l6rd\"1L&t:HHflΧD\n^$\u0019\b\u0004\u0000\u0010P\u0000\u0019$\u0005\u0001,\u0006\u0000\u0014\u000e l8.P.60\u0018\u0016\tBH\u0018\u0010\u0002P8\u0010\u0006A\f\u0004@\fa\u0010a\t\u0011\u0017ɟ͸\u0002mv\u0002h0W\u0005a-T1zb\u0002\u00038<bEQ?:Ңi\b\u00166D3F`jؽ\u0001'Tc{#q=2\"\u0013jcy\u001ebTQ݀@s1ugmw\u0006\\dhWh_6\fBR\f\u0018Ⱥd\u001b?\u0004#cb!FKl\u0001T7\u001aF\u000e{)\u0001a|YL1D\u001aaW:^8>Dǧ\u001e\u00074\rC+\u001f\u001bp_{\u0002\"\u0014\u0002\u0003N0―\u0005\u0003:\u0003.̏߁\\߯\u001d\u0005\u000f\fT\u0003gx\"\u0002сa>-/`s\u00045_\u0004\u000b\u0006\\hU1?^ڤЕ͌\u0007\u001c\u0015Z\f\u00040\u0018p\u0019#Xh(9@\u0001\u001b\u000f_S\u0017\u000b\rB\u0007\u0015w߽Knh!\u001a6Q\u001dh&n\u0001ǁW̉ќ\tt\u0001皜N*\r8̀\"\u0006/`R\u0006\u0017\u0015X,{нW\u00017crV\u000e,$0&n\u0000Pf4p&D;0A\tM[Y\u0019\f]SI&jq\u0019\u0011(v1vb:\u0015\u0016110!wݽ#\t7\u0004: u/\n\u0015\u000eTތNe*`S\u0006H^][^N\u00184\u0003Q\u001e\u001fj3\u0013߈P\u001eH\u0010\u0005F-bs\u0014jHo\u001fa\u0000~\u001c\u0003Atk%7/\nD=̃Ж>rZS\u0013P4\u00018w\u001aK¸B\u0013\u0010\u0015b\u0017;2⛪j煩XƸOec\u0004!\u001d[\u000f Lkfx\u0012}J<:e\u001f\u0017~\u0005AAh\"hf/VFhAO\u0006ux\u000eE3k\u0017ՉQZ8]-\u0015īNx,9x\u0018i\u000e\n,V\u0018ڽ\u0015R!S?\u000b;\r\u000fwT\u00139\u001d\u0017fԁ|a$EຶMQ>'f\u001dS+~;\u0015\u0012!A3?\u0019l~#Bb\u000bb>G\u0014L\u0015;{Xf\u0000\u000f݊\u0018Er\u0001̓t˝4\f2;:z\u00023ҵZ#\nc\u001elFڰ|ai:v\u0000\r0~P\b\u0012 Cta\rYn\u0007\u0010oEON\u0007\rOG吽NXY\\\\\"aD.\u001fI$\u001f3\u0004\fj\u0004Š\u000b+\u0015^\u001f@A\u001dI2 |넵'M\u001f\u0007\u0010=$\nύb{#K008C\u00151h~=\u0019AAg\u0000E\u0000B&\u0012g<,_RV|P,<AI_%\u0001w_U&\u0001.^\u0018S\u00008Gay\u00008\u0017_Cv.V*!Bzf1W\u001fF$_\u0001wEx\u0000bBЍjyٓǅ\t\u0001D.\u0018\u001b\u000b\u0011(W\u0015\u000fy\u0014\">\u000f \"$\u0015\u0000\u000e8R\u0005\nЍ\u001d\u0001D\u0004\u0004ZQE:Y?/+!Hh\\\u0001\u0014\"Bכ\u0003On|\u001e85\u0011\u0004Z!kbj%\u000fv\rMSl\r<+\u001bT'\bZ\u0000b˴nS|\n~\u000bY\b˕#?JF3GPkŧtR,\u000f $9޷Gܡ$J\u0011yQLP8J>p{PtZ6m\u0001\nETIWXt7\u0011e\u0011\u000f .qh\u0014ɭ]\"bRpUT\"\u001e1OLo$ĵg|ρ\f\u0015X~\u0000.YP\u000ehg+\u0004\u0002\"\u0004\u000b\u0019\u0017O,t}cOM=~Qt\u0007\u0010]33ū\u001cs?\bG\nL\"qPr\u001eFD\"i\u0013\"9FVt([R\u0000\u000f\bd\u001cU2\n'9\u0003\u0015d\u0015\u0014\u000f Y_Ø#aB\u0004\u0013#;(\u0016D\u001e@dOv\u000b|\u001d\n\"\u000b\u0014aDht\"\u0019\u0006*!\u001b[\u0011P*tW\u0011\u000f ̖6u\"3=Xy\u0014\u0003\u001f\u001e\u0012\u000f 2YtiWq@9hd\u00026\"bĈ׶XnP\u0012g5ٸ\u0002~\tfz\u0000;Q=ͅ\u0018n\u0014ȕZÊ\u0003Q>3t\"f\u000ex\u001av{VTL\u0000E#/(6\"^\u000f \u000e\r\u0015Sʹ)\u001e2\u0011|I}YEQ0bv',8\u0004kǱDЉS\u0000;H@\u0015&btfAЕ\u001b?\bD\u0012K\u0014/o~Ϻxp󲭕\bz\u0000cub-M\u0011P6\u0017\u0002\u0011ZB0\u0010aDP#9\u0010]J\n ŧ\nu(dQ\u0016\u0000\"NOXƟ\u001c*e\u000f'\u0011袨x\u0000\u001av*E)Zn~(\t\u0011\u0003\b\u0001פNZ'JiEM\fR7s\u0017+\u001e=0}\u000f;\u0010\n\u0016y>|dpaÞ6[~\u001e@x\u0015@ۛ̎S$\u000f&(:!Ck{p\u0001Ě$p';^|6\n=\u0014h\bAA[|cϿȯ,\u000f ~ڵ5=PSp}l\u0015y_B9b\b(Dl\u000bS\u0013^!\ry6±9Y\"-\u0001b-rz^\bW'֢.8ެ\bn\u0010bUv1\u000fϱBy\u0016nk\u001eI)\u000f\u0014G\nnYԯ$\u0004]i\u0015?W\fX5\u0014抄_b@;<4]rEQu\u0015\n2g{4PP\"\u0002ClE\b\u0011gşp\u000bt=]0\u0005MN9\u00002c9ޔ\u0017`ǈw\u0003$l\u0004\u0005c\u001a8\u0011Z\rk?'\u0014K\u0011޿Qh?\u0005\u0006c\u001ajy+x\u0000\u0004H':'\b\u001b-ٌȖsO.V\u0019.J\u0015mBi*/\\RGQS\u001c\nr\u0013y:5&bpt\u0014v@̴̸\u0002yJH+0&1-F\u000b\u0017\u0004.fD\u0007)!!myr.\u0011eAA$4\tT\u0005\u0012uA|DQ$\u0019ƃM[պĲ\fQ+\\յ\u000b-dV`[\t,(\u0013Y+ֵxV \u0005bT\n۵lL\u0015\rO\"\u0011+{\u0007/[b)I\u00000~>$&Ze&p?Wy\"\u0000L@W\u0015\u0011\n%d8DE\u0016NW.\u0015\u0002!p\u0002v \u0007p2\u0000ώu`\u000eŖ\u0006S\u0012\tB\u0007DsQB~U&Z_=chL\u0011\u001b(֘\u001f%\u0012\u0007&j\u0012z\"8L\u0012&PqE\b{M\u0014>j)E¹yN\u000fT(l1\u0016غ\u0005YP\u0004NJ?\u0003o4a\u0006{陻QC\\xbBf!%,AMH\u0005=X͛4`B9\u00120\u001ccq%m\u001d\u0007g-\u000f:}\u0004o\u000b\u0017-\u0004h6v\u00046Y10NEhI\r(\n1JBU{gqs~+\r3OX_\u0002\u0001\u0015\b\u0014\t|MQ(DUC\u0003\u0015S\u000b\u0016\n\tщ?\u000e>cdS!ۄ¹MNԷ'!F\u0014\u0018L7^|Ph!\u0001F\u000bM%\u0004(\u0010\u0007\u001fX\u0014>\u001c3Elς,B3\u0007\u0002\u0014#$L\u0017\u0017\u0005\"(OI?KQN\u0018(Z\u0011RC}J\u0012OPv\u0004{\u0016\"jȘV`5VNcl\n\n!\u00154<${\u0003\u0017ƍ\u0015.M%\u0002ȡJ6\u0007\fR\u0003\u001a\u001e[\fފ\\\u0014X\u001a@f70\u0005D\f\u001b\u0000&H]2\u0017\\.;dn\\Vh%xJ\u000etOJH\u000bpQDN\\ؕo\\\u0010qɠ'9w?\u0012:bNF;}\u0013>7v\"Wĺp}$\u000e\u0005H;ͫw\u0006n\n$f\n\u001al\b\u000b\nMs1IԱ1\u0018.N:z:$.81J]\r\u001a/UA,\u0004Z^\u001cJ`FX7|#\u001f\t)\u0007\n]뻠+a\t8\u0019,\u0015\u0006~+u[\u001d\f .X>-Md\bS3$#'\u0011#uH|\u0003JZw\u0017 !C\u0001 \u001d\u0003d1ȍɬHFM\u000fF\u000ef\nCd0i\nQ$#\u000fD2J![ӽG\u0018BJ'\u0015f$Lχ=D@\u0012e\u000e1\u0014D\u0013hԪ\u0012SaY)\n\u000bD$\u0000\u000bAF\u0014fN\u0013c7p\u001eR|%lb[IAR V{=~\u0002n~GX(eF\u0003\u0014&]M\fk\u0014W9\fP\u0011\u0012}'Y\u0007\n?[YLW<7-{k3\nG\u0005tcFW\u0014,\u0006ƛQIڔ]޷x6\u001bGY\u0007\u001aV$^F}\u0010K\u001e`ˀWP\bž\u0015t\u001c@Kħ\u001c1bV28B\u0002[ڊWT\u0003 hZe~CJ\u001a\u001a=cKDf@-890t\u0011O⩊F%s\u0010(2odZ\u001f\u001aZf\u0011pD\u0013we\u0004\u0006\u0011B\u0014>gg\u0006qa\u0003P%cee\n1.?ĸi݀\u0010\u00193\u001dN\u0013\u0013sʫ\bc\u0002ӄ%g\rX6\u001bJ!i\u0002ʢ\nEK8MlB\u0017YŅ[1(@%\u00107b~uu#j>p\f\u0004\\U\u0001L\u0015\n\u000ekDPEn\u0005e^M]DM&b݉^X\u001e*sQxH\u0006@\u000fEK\u00177@jJf\u0006դ_&UqE9\"[\u0014t\u0014x$~\bZ)m\u0013l\u0000z)O@Hb&\u0000}\u0007w}\u0007w۸s?s\u0015 jq\u0010ro!{\u0015\u001d(\u0000-&bQ\u0002\fKdQOq376\b\u0014R\bX\u0003p\u0002\u0002\u0002QהJ_JuZRR?u:\u001ezjVT\u001eBPnz4GuR]_:J0*u:J*J[ZR/Wjb`W\u001d\u001bf}\u001fˊ]23lfZ,\u0016=;;3\u001b\u001b˂sȴbaaa\\.vܳ321v֬lLfŲ=۞icv\\vkfVVFF666zݲ2O\u0003`\u0011#h_lkf\u000f\u0006p8=;np8rg0\u0018z]n50\u0018~^/X,\u0016\u00191f\u0004\r\u0015Xƶ\u0006\u0006\u0019A\u001fd2Y\u0016\u000e`pZZڿx&f[SS\u000b0\u0018nnnodL\u001e\u00067fc[[[S{{s{{kk\u0013b66s\u001b㶶6Xrrsrqqrqnd\u001b<\u001esGdte#2ܛ\u001ber\u001c\u0017\u0007\u0017\u0017\u0007\u0007\u0007vurqqppGGG\u001c+{{f\u000e>h>====$y|t\u001a\t\u0012$yyZF{l3j|>$}\u0018\u0013%~vjP\u0010O\f#\u001c6pVHAM<qbt᩹%\u001f?\u0013Q\u0018+\n88~<vb\u0001P$coGE\n$F2jhZH&onlj\b\u0018\u0000?ώ\u000e\u001533*dd\nHA\u000f!\u001b\u001b\u001b\u0019\u0019\u0002\u0004\u0002\u0001ㅋ\u001a\u0016*TO՘b̿R\r\rM\u000b\u0016VUTNEE0nnlljjhxvtppnll\bAI\u000e \u0019:9/^psOTp񯥕մCFN2F\u0018=0`sTRNHHHG8~nب!CFϺq\u0006\u0019\u0006\u0018 ci\b\u0007Ǉƌ\u0019POODC \u00016ljj\u001a\u0012Ra\u0017\u0019b\u0015$)HG\u000e\u001c8~~nԔT\u0011\u000e \"\"\u0003\u000eБ#QPRybZRRJ**\"Z.\u0015\u0004ӒRВkJJ*Ȩhh迪j\u0007SQ\u0011Q\u000f'''%%$$#/2d***\u0007\u0014\u0014ԓSӒRR\u0012gaaa]\t\u0003iII)\u0004xرTSSS\u0013\u001d\u0015\u0007\u0014ӓSwqu]U\u0001\u0003\b+\u0004ʪ\n\u000f\u001f>\u0004\u0001㇏\n\u0002\u0004\u0016ԔU\u0015\u0015y%D\b\u0002\bX=J\u0004MV7[C$\\\\[&\u0011\"]]N*O?Md2_f\u001f\u001aB_Og\u001fGO_u/\rG;c\u001eH'7n\u0007b\u001b6Ih\u0013\u0011\u001b\u0017vJ\u000b\fb1W9.D\"JaҾo1IdwNq\"\u0011F!'A6\u0016*o%Py\u001coV&&&'bbrr6n\u001b>ox#Eb1#h\u0011\u001c9H̏xSЌ҈̝\u0017ƤPyHa\u0012%-4\u0012΍G\u0018\u001d\"xPN3A Pr\t'x\u001bqyPrI\\\"H\u001b)̑E(I\u0010~\u0014\u0006-yQ\u0010\u001a\u0012\u001a\n!Tch$\n\"$M\r\u0013\u0013\u0014\u0014\b\rXVZZXV\u001c,@\u0000C\u000e\u0013\u0000h@eK\u000b.\u000fR\u001e8pA\u0002\u0018\u0013\u0011E\"eemDh,*\u001cm#\u0012ibr\fQD\t\u000b\f\u0016,81\u0019\u00152GbK\u000b\u0005\b\r\u0018,8c2`\u0012\u0001Bʃ\u0007\u000eP\u0000h\u0001\t\u000ePP\u0000h\u0005\n))\u000f\u001cMM\rNy XVT\"@ϢD˄\t\u0012T\"hq$T@a\u001d[8\u0014Ƙ²R\u0002\u001e\u001e\u0006\u000b-,++=0f\f\u00190\\`&D\u000b\u0016kFpa\f\u00180@\u001f<hАῆ\u000f\u0019764!^^:taܰ8\u000ea\u0004\u00181\u0002D\u0000\u000f\u001f<t?\u0001\u0004\u001f<\u0017\u0010\u0001\u0004\u0010yp8\u0014\b0B\u0010/ @|\u0019\u00152*d\nH\u0011J\u0013%H\u0011`\b\u0011ˠ \u0016\u0013%H\b?\u0002\u0007\u0005\u001e\u0013c\u0004_Fmɴ\u001e@&\u0003\u000eHUi\u0017`\u0012ق`H\u0004e\"ӣL%Fu\u0019\u001e`I\u000bC_{\u0005\u0015T\u0003BK&(:`t\u0002®]'yeһ\u0002^E\u001cZ2A.,Kuh3Ӟ?i3P\u0002æw\u0016\u0004C#\u001bӚb{|]mU\fdz5\u0005\u0016lMd2Pk]׌廦wt-u*j`ˮvӞð\u001d0\u0002̮\u0007\u001d0\nU\fd2vܷ3C@\u0007{h>u_U\u0017m\u0006\u00062,\u000fI9{\u0006Cӵ4\n\u0018j\u0006nWkߓ@o3V7]KSIߟ\u001e~-t==,\u001fu-ӣg`\u001e/t6\u0003\u001a(z7c}Si4\u0015\u001e>s\u0018\u0016wN\u0003\u001eM\u0012e^U=\u0002*ɾ9b{ث|s\u0016˗\u0017p\u0002bW]\u0003FaXu\r\u0018\rw\u000f0d\u000f˷{a\u0006kz_ukU]OOk\u000e\u0002\u0002FOwoN]OoNﯶJwJ>鯥_mku_GL\u001eb\u0018m;.\u0011q\"1y$\u0018y\u0011y\u0017dqh̑ż\"\u0013mơ\u00119H4\u001eâhL&F.\u001emv\u00031z27\u0001\u0004$\u0000#\u0017\u0000a\u0000\u0000\u0004eX\u0001\u0000`\u000e\u0014\u0000\u000eIb<ND4(&\u0007\u0003H \b\u0003A\bF\u0001\f \f\u00031\u0000@\u00188u\u0001\u0004\u0002*`kR^*jC\u001b\t'w\n>zF~ wz\u0006M(\\4U=[\u0010H2\\!\u0019F%|׈yUp>\u001e3\u0019x\u000f\u0006s+P\u0006K*\f/}m\u0007v4tR\u001af>\rҙGW[NG12\u000eV\u000fm{\u00070bY&Ȓ%^>_E!\u0013\t\t~Y\u001eο\n\u0017sJḧܼԫ\u0006\u0016ܟ\u0017\u001e\n3laWE/Lj֮\\G\u001b\u001e-|7\u0015͈hXIk̟C\u0007јWf\u0013}دm\bhjm\u000f-\u0005@\u0000\u0002D{\bjUsf~ݔMwU\u000bʧ9\u0010D\n;ݵĤ\u0014=h_\\\b?7bGBmwIz$\u00108\u0004y6\u001bi^@\fx8\u0007\u001f/5\u0007U^3_\u0004&;\u000ff\u0016L7DKd\u0011p\u0000\u001dj}+\u001bz%=٩vJLxIcK\u0019ۋ\f-\r%jBr\u0001A{+~]jI\bK!u\fN,8rz\u000e$J\u0012\t\u001b\u0014'=\u001cJ9b\u0004OuYEޞ?pK=\u000e(=\u0003\nl6)yR9Z\u001f1\u0016^?`?կ\u001f ǢPw{LL'y\rFYtP\u0010J\u0001#\u001c3ZUրnT]$\u0012\u001e\u0017\u001c\u0012u>(\"\u000e\u001b\u00110֒z\u001bmw\u0017\u001a$Ym\bpvt>w$7޸ȅWe3G\u0010S~c1D?aPv\u0012&@Yf{5ȗ\u000b\u001f\u0001\u0006+4XϮz\t\u000e*\u0006÷ǵ'E%6\u001cl`@T\u000f`Ş}H4hQ\u001d#@z\bLY8сyq_\u0005~z^L\u0015\u0017q\u0015\u000f\u0005_2\u0003A\u0004&%L\u0011L(_^~L\u0017Ι#y^\u0011h\u000fZ\u0006uu*V>\u001c|uKKv7\u0005\t1?%\u001cdB\u0016Q+΃\u0018\u001d9\u0013D?\u0001?3%=Ym|x>t\u0005V:w\u0016\u001c!ݰe?|~=\u0006\rبo}j\u001dv\u001a8k[{HG\u001eB)w\"uUY#x\u001f\\Lakej#ꥍ'񚼊ݤ`8oTKXر\u00078HK]آ\u0004%So\u0017\u0012`F6VWF\t(\\ Yo^y=/\u0014\r2,\u0006D{2^ԛ6p'\u0006~uQo\u001a\u0006'Q\u0006T}'|W\u0010{}sL\u0011?q\u0011\u00172?2p;>bzLy'!?#;οS.\u001d.A\u0017,k?l\u001a+\u00152\u0002Н'\u000e?\u0006b\u0003Rbh:kN{B.yyJz\u0004>w\f!/W<H>\u0015}|\u0019Ú0\nhPbz\u00065\u0004%\u0007\u0010z(\u001aFv?JMgjk\u001e\u0016\u0014;1i\u0013\u0003Ց$\u001f/R.B@6l\"\b}\"2w\u0017\u0000bV<\u0000s\u0006?ƚRCg+\u001c\\)<\u000b\u000bj0\u0010A?H\u0016HZH\u0016+if\"_ܙ\u0017bQ \t6AOK\u001bN֎䥀y=@N\\\u0002P>zBC6P}caa֚w;\u0010QF\u0016n@=rL(pX}whOaR\u0018\u001f9R\u0011>ϻYY\u0012\u0015@:Q\n\u001aT\u000f\u0002A5?\u0001\u0018N!|\u00108y\u0007[;ߌ<Ci6\u0002\u0005w]er\u00050#\u000f\t9|=#w |\u0018ckUq9I'\u0011F\u001a\u001363p\u00187@jO˾/eRxP TV(3G\u0019LgCQ?%$E!o\u001d\u0015>ʭK:paq#\u0014U@${\u0004͕ˆZ\u0015B\\^-/w':}jƶ\u0018t\u001c\u001b\u001aA)q\u0006\fVNq)[+9QYSx\u0007k\u0007\u0005_O\u001cn\u0005»;[z\u0005>\u001c3(\u0012@O$\u001d\u001e3aU]\u0000\u0011f螁:Bȷ\u001d1hn0u\\t/6at,\u0000y|\\\u0000\u0010~AMm\u0011.n@i^n4]\u0016f7q\b&RïE@6}6oTGO)\\\u0006\u0007\u0013oO'\u0011\u001b\u0011Ձr\u0010!t='r]\u00175!vے@\u00111D]\b\u0004\u0011\u0013B\u0010꧿RpC\u0007<݀Kv\fXO谣\u0015g\u0016r[.\u0001l\u0012W\u0001\u000e؋0H\u0000\u0014ܙh\fg4\u001e!\naB\u001b\u0013+Z\u0007y\u0004\u0019s4\u000f\u0018.\u000f\tnzf,y\u001e\u0006]\u0012 t\u0006p#2%hY\u001aː\u0018\u00106n&Yא\u000fD&反,\u001dy\u0004%͋C&*XB\u0007صY6)gAEd:\br-b3D!Dx~̹?@\u001d| 7t1\nn@z\"%Nx ] EG۩\u0012\nM>¸E,_(ʡq9[<(\nJAٕz\u001c'\u0012&7*]\u0012/rn@D\t\u0004Q\b5u\u000bgH\u0018\\P؃\bʱyjX-g\u001aI\u0018*CM@F\u000b T2\u0006D7!w/g\u0003d bvlQI;87\u0015\u0003ly)\u0019\u0016cw\u0014\u0016UV䦣~hU1h?l(\u0014oBy-+\u0018@4dHˈ\u001dW7\"ˇ\u0006\u001frm\u0001xse,\u0007\u00102#\u001a(\n$z}Vٴ-\u0010\u0014b\u0010b\u00054wj\fm#s:A\u000eOT\u0018y֜ٿډ \\azPMNѷ[P\u001ejKvy\u0013\u0007γgbC\u0000o;o#$OE>\u00053>!\ff;!Tz©Yx\u0002d&iIHہ\u001c0ׄid\u000b (`}Bt\u001c \nPnn{\u0002vU\u0019\u001bj2h\u0006ʹ\b\u0012[-\tZx\u001fn\u0013\"g'0MSFɩ4n6Nޝ٘8\u000e~)f;\u0014H.2sMB\u0005[;\u0002g :0dI8d\u001dU\u000emDw\u0014\u001a\u001awL5OI6mJm\u0001NH \u0004\u001b+\u00035\u0014\u0012ǉsXxsB\u0014\u0004B\u0013r\u0016GV1::g\u001c.]JA\u001a%9\u001d\u0019ޮ\u0010:&(x\u000e\u001c\u0004%TdΣQ\u0000/\u001cd\u000ey.\u0019f9NH\u0006OQ\u001b~t9bY\"Eo!Fқ5A\u001f8\n&:HNC8`\u001dpw3s<rElKRF1N.\u001b9YHx*Ywl\u000b)jBShI+\\\u001a\\=\u001b{B3m\u000eDBi!,߭vg{\u001a\u001c\nsRPMu;\u001bS\u001bb/\u0014Z1jNpA\u001cBuy<X=R>-ssms&\rYWV\u0003w:6F0MYí<澝H,l\u001b5\u0011fD\u0013\nzgVyv6~\u001b$ϫ(>79<W\\3oS(-n4?ݎ}\u0001^\u0015)* g( Z\bn9\u0002Zx4C+t|n!)\u001c\"m3q\"Άm7\\\u0011\u0015-o\u001b\u001e\\pҦ=Vm=a51Ϭ\u0003EĲB\u0012wyE\two%͘q@əK\u0014\u0004\u0005n\u0002gv\b+NE\u00071w[\u0003N\bwT\nbS3\u001cd9کVN$#NKS\u000eB\u0019E꺳9ο%ȭq%4b9$U3ގY\b/WN.X\u0010nE\u0000;0\\[2Bw \u0015+頓W\u0012p\\*(\u0001\u000fzrI2*ݮ\rO,إ\ng\"AŒh3\u0014ڹ*\u001b\u000f\u0014\u0013t.;u\u0005js=;v\u001b4*\tTY3*\u0016Mg@xV!.`\u001cuSVmN򠣡\u0002g\n\u001b\u0003{Xw;\\pe6\u00149jP\u001b<\u0002Fr\u001c6EɆZ㤖\u001cI|WSZ\\r}EP\u001775V>/;b\r\u0015\u001a¹޶by\u0011:7rX붡un\u0016\u0001\u001b!\u000eƙFTv;5\u000bζ\f\r*=pc\u00162t\u0015j\u0016g!7WAv#x;wd~JNA{*ݯ89H6\b9s\u000bmLtsgnwO[7;\fF\u0015}+3\u001dڈh;\u0019u}8$r4se,;\n\r\u0001%=\nw\u0019\u0010Kq\u0015\u001bv.xw{ML\u0015\rg_1\\LJMYݕa+P!/\u001d?P4so\"t=:>r\u001f+̽1 \u0004Μ\u0011,8\nypX\u0011tn\u0012c\u0001ח\u0001,9M\u0003vGCsl`8=3n49C\u0017u@\r9\u000fJ:{Ő3\u0002\u00004So9R2dzG\u0005\u001dړ \u0006!oEL6װ\u0007\u0004oKSlq9>\u001d\u0017\u0013K\u000ePFW\u001ft8\u0005j8V,+C3}W s\u0007\u0012=ɋcjтk7q5[w\u001cXWHβ\u00198u\u001eu;9vI\u001au3\u0015\b)\u001a\u001cՉȎH/Z\u0000S6BBc<rg\u000b\u001a^\u0004\u0003\nHk:^\u0006;1C,.wr\r\b\u000fVM> \u0010{\u0007*7'8y+#$\u000f\u000b],{Q\u000b<l\f8!W(<^߀[S_r<XjyDFyt\u0003s%w܀{IGbEdD\u000f>x\u0001^/tE.:\u0002\u0003N4F\u000f\u000fw5ԀtPt(\u001dK }\u0019pK[])9\u000e 1\u001ap҄CBK\u0006բ\u000bи\u001d\u000f\u0015Zk-vǏ1\u0017or3l鰫\u0017~ayu\u000exz,\u0004݆\u00190\u001cf\u00178f/\bZ\u0003αv\n7V\u0003nJȐ\u000ex\rꏸF=R\u0006ܴ\"%\u0001N\u001e\u000b\u0003n*@buNM\u0001Hvut1({fu)܀ހ;森(\u0010ueV\f\u001a\u0010QZ׌؀1=X\u0011-iD` K\n\u0019p21u7E\u0003文y\f.\u001c\u00069\"\u000fB(N]u\u0005бhm2l\u0015bL[Gr`πcĎ=\rHTK\u0003N\u001aǺ?칂1\u001d\u0015طy\u000fOιu\b\u000f\u0019poq\f\u000fG\u001fPPv7?X%0M\u0018ހhA|;j\u0012O\u0006\u0002z?\u0007XVL} qdS_Y\u0001*=T?q6{\tO\u001e\u0004\\@o\u00102\u0013\fI^dQO\u00194Z\u001dKn\u00024EB'W\u0011\u0007U2eF\\\u001a3NAw\u0002h\rL\u0000\u001bq14!\u00195ћ\u0001`F4\u0015\b̃\u0011Wf\u00141Ѹk|{3\u0012\u0004\u0000\u0016F\u0010\u0000:+\bA$,p#.(nP\u0005\u0000G_\u0019\rYBND17S\u0000\u0000\u00004\t*D(p8ReTt]:!c9R\b*(lj\u0000Rn^\u000eZMH\u0007\\:ֲfK#9\u0012fT--UC5 a;TKX\u0006\u0003(X89w5\f`XPrQfF\u0003\b\u0004\b\"%7jY\u0010\u000fZ*AM\u0003\u0000TLkh\nH\u00108Lji!\u001d!\u0003\u000e0*THLZCe\u001cp\u0000\u0000\t\u0017\u0013\u0012 \u001d4\t\u0002&Nm_[#\u001b`\"B_~ޘ%Rt;^h1B\u001f\f^w\u0005Qu~<nF噦G.fZa:pte\u0018N\u0015{#삵^wŮ\u001cZ-tcά]\u0015;>f!:ؘPq(KŮ\u001c\u000b6SץY1vHUHR\u0004X`\n@\u0011\u000eg'c\n1@x>7\u0011t<\u001f\f$zA GxB }\u000b8_\u0007\u0002H<\u0007B\u0007\u0014\u001c| \u0010{{\u00072aW\fǰex\u0017e\fCy^\f\u0011<^g~]\u00141l4?~]]kv޿Z?vV9\u001d:$sE2'X!syY$:I&䉅\u0015=/u\u000b,\u00122e\u0005O0%\u0005ǔ\buJ'&\u0000.$j\tY\b7dYd\u0016ԋ\u00192M\u0004@\u0006\u0019J1}sˆS\rDph\u0005/\u0001r\u001a\u001730\u0012q\f&x\u00029\u0006Rј\u0019<D\u0007\u000b^t~\u000bT\u0015\u0002s\u0019@\u0018\u0000\u0000\u0003\u0006\u0000\u001f\u0014\u0000\n\f $(h04>\"** \u00020 \u0016\u0006C`8\u0010A A ER C\u0007\u001d]<:u\f/y\u0001YO؏cWW\\p{2J\u0019wz\u0000dr\u001eC\u0019B\\/|\u00167\u001e-c\u0011&Ěh܃Xo\u00181ڬӝrе~2Tv8$_1]\u001c|E`gTO:Ay\t{Cf(}׌\u00065\u001c|\u001bc98(\u0016\u0017:S@\u0010A\u001cwd5\b\\pX28\b?;\u0005i\u0015^\r>\f\u0015Ɵ>Rc;z-;s³6$K'\u0010\u0003_?)Dgwz}39ڏp\u000b\u0007Po4G\"`<0\u0016g\\TN\u00037U^T7شqT\u0005\u000e~|YPn\u0001+tH\u001cZ\u0016\u0002y\u000e:e#\u0014aJ`d\u0017Ϻq8-t[/\u0007(T)S\u0000J.2BI|^4D'Sߔa\"dw5GTỖ\b--oW\n͊v\u0018獛&}u$&SE<Xgpm\u0005Q:7ozVy`\"S֡OVi:\u0002\u001d\u001dd}sYQ\f|\u001e\u001b4y/\u0003\bWdUeRFi7<n+\u001c^q#;sP+ߎZR>_6p\r\u0013fCvgo\u0003 2V=N0w܆:nM-~goZ\f@7tl~U \u0004y<\"p\u001ey/_\u0011\u0013~;\u000bæƓ\bQ\u0007¿0ǚBb\u000b6^G$%\u001dA(\u000e\u001cY}f\u0013Bu\u0014 o]\u0002\u00176<\u0006N\u0012>g@oú\u0015ԗGI6mhZ}WIkh>\t؝4wAoiR!߇\u0006hW}GV5,*\u0017Fɗ3Aq-\t\u0001/dX\u001c֎xwc\u001a*3P~¬\u001b$_mG^\u001ecϝ\u0001LJ˳ʺݛ5.K3_:v![\u000fM^׾(e7!\f\u0017\u0017S8\u000b%֨&oB\u0016qe~;5-\u0010/\u0002\\~\u000e(\u0017kѾy\u00117?3h\u0017oxF\u0018eWF$%\r\u0001]\u0013&hC=DUh)\u0004g \u0019ۍDN\"vL\\-n#\b\u0013pn=\u001a\u0002n\u0012~\u001f\u0011\u001fڰ\u000fx\u001f\u00028|\u001cѬi!Ɛ\u0001Z|û\u001022e\\Z5Zd\u0016nߞe\u001e17tО-\u001es:G\u0005݌s\u0007_P>_\u000fo>ys,o\u001cU\u00035y<ȝA=i\u0013Eyع8F,5\"\u001f\u001bw!\f\n\u0004@bYG\u0012%*9۾yT|\u00148\u001f^T\u001aƥqI4~ȥ22K%\u001d+\u001c5/'\rdJI\u0014\u0019+ѓ_\u0013$u\u0004;CAc8WW\u001ek*\t5e\u0010Hv\f-\n\u000b\u001c_\u0018K\u0017Z\u001c\u0012\u0012:q\u000fe0k\u0012r\u0004\\奌9U2\u0003\u0001#\u001cCiYlǸ\u0013;]`\u0017N\u001fZյaJ;3mT=f\n\u0007C]H9?ĕ=\u0016AhOV\rTQ\u00151#wdi=\u0003@\"\f\u0012ֈ\u0007ο\u0001g*\u0019\u0004c\ty\u0000{&.\u0002\u001a(PCev\u001c'J\u0016{i{Mr!\u0011'\"\u001f&+N\u001d\u0003A\u0013&ISv_:G\nJ/e)G\u0010&&']Wxn\u0007O}\u0005?Tuz\b\bX=΃/#\u00005~EsB?\u0007<U\u0007\u0011\u0017>\u000br92\u0014/D/aCQ꼪I0\u0007 ۞C[(C\u0018CI\u000e\u0003=Zo\u000b=;\u001f\u0011\u001c\u000e3`D8c!gOv۷ol8\u0016w%\u0013=\u0016gI\u0016JVVZ\u0014zKJ\u0010\u0000p@\u0014\u0002j^Am\b\u00075TkJj4jA\u0001)>\u0016>T\u0007\u001f\fXh㽠\u0001_\\\b'0P+6:L^d\u0019S\";\u0003D/;\u0003G\u00177\u0006.9V7n@\u001a\u000f#c\u0010Z>tbu\u0010Mr\rqU\n\u001cohM{\u00067^ԘqdP+}\u0013\fhn@\u0010.J\u0000&Iy\u0016]\u001bh\u000bgO1o!]{ t^!\u00131\u0001<`?;9\u001f;G\f\u000eO׭zdFy27/ {,op\u001a\n\u0003ضpwcbV#\u0010\u0011\u0017L:ۚ\u0001\u0010\u0000C\u0005ivVW'f\u001e@Xi2ce\u0017c\u0000\u0013;#<8Ls*//7qU@$\u0006w*\u0001#ًI]Uw:>`yQVN'\bLFF%6_9\"US]uR=}\u00044c\u000bU\u0019쓊Ho\";\u0016D\u000e1\u0004o^|i4\u0002^i(\u00077\u0012\u001cVT^\u0016\u0000Bj68\u0012=?'\u0003`{Y\u001ed\u0016\u0000\u0003<g8׊@[s}p\u0001\u000f`3Wĩ\u001f'>Ԥbr x\u0013ປ&W\tgp\u0013#/\u0004<ON\u0010#\u000eP:\u001f!\u001a̡r\u000f2qO\u0019\u0001ll\r\u0002\u0001\u0001\u0017;χj\u0018<#,~va?/-\u000f|\u001dC<(y8q\u0006UAU4\u0014\n\u001b[\u0019#\u001f>6\u0018\u001ak$V\u000fy\br?M4\bv好͡\u0007@%7|dX\u0002\"lW6h/&j(\u0006!pMm:Q\u0006iUCv\rf{mg}d0)5V?q\u0017\u001a^`qW2a\u0015Bho<\u0003Q\r\u001cg$2\u0004\f\u001a|W\u0018\u001czYe\u001f XM*;\u0003\u001f3\u0011\u001a\u0000j2|!Ƈb֛ewV\u001cS\u0011zr!<68e#RO\u00007 \u0015\u000e\u000eeӪ0\u0000\u000b-DM\t4\u0017%i\u001dLP,\f7j\u0005Ky\u0005tџFq\fYg}y'\u0002s\"'uR\u000b\rrxׄ\u00127'ހ\u001b\u0016g2D{iղ8\u000fӖ<BO\t۽\u001bhTrԟ$|\u0014?lBw2Aacd7c@ڥ\\9\u0006z\u0002Η\u000f)UtQ\u001aE\u001f\u0001\u001f\b'\u001b\u001e\u0006Jch\u001eewZ\u0005\"%ZeOW/ ;OK\u001f\u0016/ݱE|@~\u000b\u0010U<DWrF'Vk-u\u0004\u0017\u0017S\u00192a.\u0001D\n΋XjPԳ\u0015\t%\u0000'm18#\u000e\u0011rYj÷\b\u001c\u001b\u0015\u001fpz&?b\u0013(Y~\u000fC\u0000[~\tw\u0019KwQ\u0002\u0015T\u0019Yf%j\u001e\u0007jw&y>\u0018y\u000bG־iY-ޥ!68\u0003{ \u000fD7SI5\u0002ۚ\u0014@\t?\\=j\u001d|\u000f;\u000fx9\u0000P\u0002K}PĜ\u0012oǶHnI>݆Wk\u000f|B\"ҶM\n?.Ȯ\u001e\u000e|1\u0014@8o1?woREN<o&/%R?jȳ=[\\|d\bF\u0007;\u000fȜ\u0005?].~tNWeў\u0019ko^n\u000bmmU\u0002&0^?gW׶yQ\u000bw\u0018WW\t^.G=/S?쯪\u0005\u001e`GC/-/~KZ\u0012^3\u0004Po*[5\u001e{f'YZJ䪳v09#&dsc9+a*<P9q>\u0011;<۟i\u0010\u001d\b/7TBFw\u0003\u0002zNSɷ(D\n9duo:\u0006/Sť}.\u001fڥ?௟\"\u0000\nh{zr%]J\"a^c\u0002\u001cQ\u0018303f\u0005Kid1J/\u000f\u0006\u0014J!\b_3m\u0007τ\u000e!\u0002\"\u001c\u001f﨧o^x+k{1ϻ\u0006M\u000bq\u0013\\ f\u0007@,m)7b\u0014s.QkW&s \u0005ǔ\u0015Bmh\u0001\r#G\u0011J?|<3@yӫ/&0[\thL\u0013Mv~~\u0002qI[^ o\u0000uWw\u0018?\"p* QoG\u000b\u00153\u000b\u001c%\u0013\u0004:\u0012!\"ךJlOG!ݙrn(='\u0013J6}r\u001eZ\u000e@\"%$ȹ tW_z$d',\bAUD}>}Q\u0017\u0011u\u0018L/\u001a4\t1ۛ=ԃ݋w\u0012c\u000b2v~$x8\u0005ר\u0003\u0001\u001c\u0000^^^^^^_]__]]]__]`_]````\\\\``aa`]\\[[[\u0000aa]baa]\\[Zbbba`]\\[ZZZcbb^\\ZZYdcc_YYYXedbaZYYYXXWfeeda``][[YXXXWWVgfc_]]WVVUhg`][UUTihfb\\VUUUTTSjiihha\\WWVTTTSSRkj[USSRRRQlkifba`_QPmlj^XSPPnmkb][ONMponmmlk^\\TNNMMLqppoge^[XMLKJsrqqh]UNNMLLKJJItssrrTKJJIHGvuttebSOJJIIHGGFwv_^VEDyxwwvuub`UQHHGFFEDDCzyjaHHGGFEEDCCBA|{zzyxxlhc[YPPPONMMLKKBAA@}|kgTNFA@?>~}}|{{h]\\NNMEBBA@@?>>=da^??>==<;vib_==<;;:urdaKGB::98{[FG<87vlaVH9987765~~yeb]\\UHG54l`\\V3n]WE<21]W>10/SSE?:00/.q\\VB=2100//.-,t\u0000\u0000FA765..--,,+YTKKJB00/..-,,+*)h_>5100+*))(zzyxwY<7300/.--,++**)(('&zZWRIED/))(''&&%ffbb\u0000\u0000\u0000PPP'&%$#tVQQQPOFF$##\"xpjjB&%! tsrndTE=.%%$$#\"\"!  \u001fpffUL@8$ \u001f\u001e\u001duqhhgfK#\u001f\u001f\u001e\u001d\u001d\u001c}vutpon<<\u001c\u001c\u001b\u001ayyjj777+!  \u001f\u001e\u001a\u0019xwRIC\u001f\u0018\u0017H0)\u001e\u001d\u001c\u001b\u001b\u001a\u0019\u0019\u0018\u0017\u0017\u0016~zyT;+(\u001d\u0018\u0018\u0017\u0016\u0016\u0015\u00149980'\u001e\u001e\u001d\u0016\u0016\u0015\u0014\u0014\u0013|E&\u001d\u0013\u0013\u0012\u0011vutID \u001f\u0017\u0016\u0015\u0015\u0014\u0013\u0013\u0012\u0011\u0011\u0010??7\u001a\u0019\u0018\u0010\u000fB>+*\u0019\u000e\u000eA-\u0010\u000f\u000f\u000e\u000e\r\r|\u0000@!\u000e\r\r\f\f3\u001f\u000b\u000b5**\"\u000f\u000b\n\u0015\u000e\n\n\n\t;\u0012\t\t\b\b0,\u0014\u0013\u0012/.\u0007\u00068(\"\u0019\n\u0006\u0005!!\u001b\u001b\u001b\n\t\b\b\u0007\u0007\u0007\u0006\u0006\u0005\u0005\u0005110\u0017\u0000:\u001a\u0006\u0005\u0004,(\u0015\u0005\u0004\u0004\u0004\u0004\u001c\u001c5\u0013\r\r\f\b\u0006\u0004\u0003\u00034\u0012\r\r\f\u0007\u0004\u0004\u0003\u00032\u0017\u0017\u0012\u0007\u0003\u0003\u0002\u0019\u0002\u0002*\u001e\u0015\r\u0005\u0002'\u0004\u0003\u0017\u0005#\u001f\u0014\u000e\f\u0006\u0003\u0018\u0017\u0007\t\u0004\n\u0003\u0001\u0018\t\u0004\u0015\u000b\b\u0001\u0003\u0005\u0004\r\f\f\u0002\u0010\u0001\u0007\u0005\u0004\u0003\b\u0003\u0000\u0000\u0000\u0000\u0004\u0004\u0003\u0001\u0000\u0004\u0003\u0000\u0011\u0005\b\u0004\u0000\u0000\u0007\u0005\u0001\u0000\u0003\u0006\u0004\u0002\u000b\u0005\u0004\u0000\u0006\u0002\u0001\u0004\u0000\u0002\u0001\u0003\u0002\u0004\u0003\u0000\u0003\u0002\u0000\u0002\u0001\u0000ͽ\u0001־\u0001ھۿ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000480100b52-14ef-4040-9c4e-c9d1350a37af1ca4a4e0-487b-4864-bc7a-281a3a762ab41.422135333153\u0000\u000077262ebdd-1cea-4f36-b40d-7d59027ad13c01a6300-9157-4d11-8aa8-58f602fb639c54238.76907256m.274878.719365664273428462115657346 3156651137.372978 34187218794343.472835.9195860 366466912727957282783545514552890135167 ] 44 9112016tDu-k̦0\b\u000e#\u0017\u0000\u0000\u0000\u0006\u000f\u0000\u0000<\u0003\u0014\u0000\u000eTX4Z@((\"\u000eE\u0002qP\u0010\f\u0006\u0002\u0001\u0001 \fa\u0000\u0001 \u0006B(\n\u0004Q\u0010\u000e_\u0003Ea?0K\u001dǑs\u0015ݷ_\u0005:8-a\u00071\u000283x(U\u001f<L\u001dFt\u001atC䢽\u0011ccM\u0006#\u0014/v!{K\u001eD\r\u001e,_BQ\\BLV\\.CQ'4鵃 'zr#\u000f\u001d\r庈c\u0014]f]t+\u0002\u0010+ba#\u0019\u000f'īU\u001bxW1 4Y,7\u00038wx[\u0001\u0002}laEY\u000fk\u000eM\u0006\u00004|KTEl׭M\u0012Ey\u001b]b\u0015fS5J\t\u0018or$i,őhA_*\u001e(\t_\u0017v\u0003e5e\u0002>*n\u00161R\u0005aw\u0019j<]!&h\u000e4\u0006}\u0017\u0000ޱM5~fhyCVޛгy?T*\u0003ͥ\u0016vTbv.c_c2U\b٠(zk?4kԝM_nO\"\u0015\u0004Ժۖ\b%捋6\"<\u000e\u0003Kf+nQ~&\u001d%\u001c7+ ϙ\u0005>-nΑ(ȯ^0XO@%Fє%0R\u000e\u000f#B\u0005bYj'́\u0015g&+^ń\u001f\u0001\u0018<\u0001\fV4lXQՁ\"ٵ~p<|*/\r%%dhJ\u000fȂ\u001f\nk\u001e2[۩ZkJ)\f'Ն]\u001c\\\u001f\u001fK\u0019\u001dHP\tZq\u001a`\u0014t>\u0015bY9\u001cK\u0015g=q\u0006~2\u0010anɡ?V\u001ddl\u0017\u000b\u0017\u0015\fП\tÅȲE\u0015\u0004-࠸2!C\u001bıc\u0004qeL->\u000eD\u0002\u0004x\u0012d;\u0017\u0001\u0013-)@\rn\\\\?&\n\u0002\u0018dä;\u0013`\u000b\u001d\u0005>\u0000Y\u001e\u000e\u0001a۠Wi4g\u0002\f%%\f+}J\u0012i\u0015\u0013\u00122Rd\u0013\u0017I4J\u0006\u0003h܁KP\u0018d\u0016\u001f\u001b(o\u0016a\u0018\u0014#T\u0011Jh\u0019)a\u001b\u0010΀}\u0002\n(kz\fB\ng*\u0000\n!uƐ\u001e\u0003\u001aT\u001d!3#D(^E\bT%dڅy\u0005\ft)MX@\u001dF)]5zϓp\u0016/{o:pqt\u001c}<ɘt\tԇr:{\u0012DY_<9>+mY+\u0013u\u0003\t O\u000eF㤜ʘX\u0001*zT]\u0013 iz=D:\u0019<PU~U\u001dS\u001ey@.ٍ^r$Dk;rFI>]\u0010A\u001d\bi\b\u0007o\u0004RWFK:O\u0019''̋@-4=|^)uo**\u0013'&Hqd:\u0004\fBBl3Q\u0017v)`\u0000U(u\u0002sn&\n5u\u0002/gL\u000fȐ0\u00011w)rؠ\u0013\u0004KY\u001bN|OTĝMp2\u00040`\u0016)\u001d0\u001eEɞڔ\u000fhZ:f6\u0002.ҝ7@kI1^Ld\u000by\nӥOr+\u000e_\"C91jgWq\u001a\u000br(/\u001aT\u0012\u0011E\u0006oun\u000b{ڕi4n\nG/}Sb:?J\u0007\u0003s|ST1ŉ]/e\n=GdPpڰ)o4>kyIBbd\bjEz\u0015\u0019[\u00129\t \u0012,NϦP3\b\u0017$\u0016G3\u00150,iN&^\u0010Gq\fvOݣoJ\b\u0014\u001d/yK\u001fM U\u0011'-f\u0012\u0010ؾ$KSu\u001aL4-5\u0013L\u0007\u001b'\u001b\u00155(\u0018#ƃԈ6Q瓝ݾ7P\u0019TI\u000fh1\u0004IOo\u000e\u001aE,I<\u0014ݞz\u001az\u001a9X)BRykD=]?w\tsE\u0019h\u0003x_M؂T\u001a\u001d#0hr%iL&\u0013g\u0013=-\n81J\u0004Ӱ3\u0002ǐ\u00078\t\u00049r\u0013e4\u001eO[NMϤ_#T7w&{\\\"\rU51\u00182QHO\u001f\u0014R\u00133Q]\u0006\u0012|\u0013\u001b\u001av\u0010᱾;\u0003dm(Pq\u001dt)\u001c\u0010Lz\u0015\n\u0010A?m\u0000\r:\\4X/uߵyMbD\u001cS\u0014i(&ۂj6\u0011Y\u0005k\u0002E.yA{\n fb\u0006\u00064ӟKXM7Yy\u001bݗ`\n8!5o \tPU\t9>O\u0013{QNN\u0016\u0014߱'PR\u0001T\u0014\u0010\u000fRR%59#\u001eΚjKW'j/1]\u001fMI\u0007O]H8s2zK`!P}^ړ7v\u000f\u0017dO8<IÃn\u00139P\u001f\u0015p\u001ehZ=\u0019\u001b׮85\u0014QUBHn#\u001e\u001e`u}%flƿ\b\u000f\t\u0011'\u0000>'M&d/\u0001\fO]\u0019\u000fc銎\u001dCB\u001aС=\u0013~5E\"\u001a4ܑv'B\u0012VR$\u0010Κ\u000e)G\u0014\u0019\\9߉+Nl\u0011$6쿲\u000f\u000eğ\bbrNQ\t\u00132~@.\u0017\u000ee\u001c޼#Jl\u001c.S$^#?\u001c?$7Ȩm\u00058\u0018!g#\u0004O\u0005*\u0012\u0006{=>\u0017)\u0014©`ГpڛHo>\u000b\u0018Я^I5RȌHd\u0006Դ\u000bsq\u000f\u000beL@\u001bT(\u001e[̡`!Ua\u001c(2I7s\u0014\u0015\u0003B-DEyƩC?ѿ\u0015т[_NyIe@-v!\u0007\"dY''m\u00130]1Ӻi(2&\u0015\u001aOfٖ%i@W[\b%\u0000\u0001$Fث\u0003z,2\u0002\u0006p\u000e\u001e\u0019Dr\u000fu\u0011y0U\u0013U\f\u0007&S\u00183\u0013nPPd\u0000$#;\u000b(͞%2\\-]N(\u001d\u0016\tx\u00126b9p$c(9egUSK\bcƤ)e\u0019\u0017O\\\bJoٜ\u000b0c\u00174ފ)?8Y|\u0018e\u0015oN\b\u0017*\u0000\u0015tzb:<dCC+a;f\u0019`܏Q=!fMO!\u0002.vx8Ćەbi\u0006\u00030~a\n\u0003\"\u0002\u0002}pu\u0016\tV\nP򨣆I\u000fj6_7F<X$t\u0017K8\"RP\u0010\u001b\u0018\u0012[#\u0002;\u0017\u00194\\\b\r\u0000\f-00D\u000e@;\"Td[)\"[R8pJ\na\u0017\f<\u0011A\n\u001b'ga&\u0005ɒ(\\LF*\f\u0017hI\"]%tz\u0012aO^\u0002\u0013ŦvF\u0007!l\u0015\bzZ,\"*EAC\r<\u0005nuϯj\u0007\u0017\t5u\"Kj6ӏRM6\u0002Mwyҹӛ@9\u000eȘ>#8LǨȤ\u001c\u0015,\bL\u0002]B@Z\u0013I7O;z8K\u0007`pO1/2\u0016\u0005\u000bi\u0003b!ݏ20p\u00183O%.>Ҁ\u001e:yOc\u0016+X̿*YW\u0002\rC}d\u00105\u0002'a(\"焬?yմ\u0007W;$wQX2|\n\u0016H\u0002aZb\"z<d8HTt{'Ss(R%THD\rxO9b\u0018\u0001&q:\u0000O4\u0012\u0014mSv\u0013*xr\u001a\u0003~\u0006uDl\n<sX/q\u0002Ioi#K7\t$\u0003&y\u0001Sne),\u0019U\u001f\u001c:\u0012 2,Vl\tw_\u0010'AI#\u001a|ʺz8@\u0018*ujT/UA8\u001a5qZP6͢\u001e>i\u0002@\u0005Q\u0018\u000fVFɃ\u0002nJ'kTS4(h\u0004{UTu\"\u0014ї\u0017H\u001b\u001b\u0010e\u001fz#'j9e\u000f-8зI\u0018Af6-3E\u0005M9FHo\u0007R6*?Ja^\u00195\u0016\nm>\u0011Y4\u0019'JtQa@пrf\\v!O,\n\u0018_Zw)A脘t\u0019IJfGSsN\tJCC9\u001e\u001cè\u001c3)M\u0010c${=\\%\"\t\t\u001f'\u001fP&O^$(/';LY\u0019\bt'\u0002ۛl<Wв9aSn\u0011\u0014VMR\nV\u0016h\u0014\u001a59i+Ѕ&\u000e\f*\u0001Mo\u000b\u0006AƊ\u0003}s\u0014*ۓK9\u0002\u0013tN{gg\b䡢UA\u0015:\u0014'\u001c֒D'\u001c򣄜E\u001b:ٓnrQ\trͦߎ%\u000fZH$tJH@=Wl{\u001a2$B1wf}\u0005\n%&\f*Ɉn)R\u001b\u00143TO{]eNF<E8\u0005\n\u0002\f4-5ɒb{\u0006\n[,\u0016g\u000f_=E\u0018o\u001cBU4\b'33hTOJx\f8q\nS__\u0000nԡ\u001aJ]TDN:lk\b@\u0012\u0013:O\u0017Nŋֺ!ZFE\u0000 I\u001d㉣J䓙b\u0018)J\u001f&G3(Cu\u0006qE}̉&<9P!)ʪ^\u0018Tr\u0003p\u0014hem\u0019}A$\u0018%F;Ԍxn'S0vD\u0012P\u0003|$1&y9CdZ\u0013f\b\u000e\u0015\u0015\t\u000elG,\u0003(=\u001fطBzӁL֣|\u001a2y\u0013\u0018to\u0015Er7\u0001D\u001160\u0000(\n\u0014%''LQS݉7>\u00194ODH:DRh:4\u0004ɒJ=jꝤ赦\u0011\u0018̗f7KO褢x;x8\u0012860(0$:0ևj]{~=\r4^\u0013/\u0003<Sz\u0007\u0013\u001aN94L^?d,2L\u0019\u0010bd~\u0000\u0005\u000bA_\u0007c-QEA1\u0001B2VȽ\u0003\u001bJ(\u0019}\u0006\u0000*\u0012Pזڛ x\t\t\u001d\n<fυH4yJ=NT\u000fr&*5\r\nendstream\rendobj\r20 0 obj\r<</Length 65536>>stream\r\n\u001e0aJv\u001e\u0017Ij?9*kO8y($M`\u0013pԻ-_`(&+'L\u0000jY\u000e;\u0010>ڴ\u000b(\u000b\u001cVk\u001ehs\u001aӣT\fYS{\u0002\u0014r\u0016PQ':\"GO^\u0010#5\u0017bI9\u000e-z2\u0003߆BM\u0000Jm\u001aM\u0003\u0012r\u0004_.>\u0018K@\u0014eCUJP89\u000e\u0014왶S@P@ΦME~~MI\u0011P\u000b=\u0013\u0005̙g\u0000\u000f\u0015\u0000w/!/qA\t%8w \u0006P]}<j)P[[\u001bC\u001ad5]eg;6\u001eB\t\u001b\u0011j\u001e&\u001bs\f.^Mʄ{^F\u0018]V2\u0013;p\b\u000f\u001b<)\u0011>\u0006\u001fI\u0000Q\u0001\u0006{,\u0007$)bO23ʚr:ExM\"@MyGHr'ʉJ\u0012\f')AcPM(&لR\t#\u0017*A;LL18G5&\t%\u0003\u001eNz\\X\u0013xOFȷ>T@4\u0003D\u001b#Xj?n\u001e񢈰{EP\u0003W`&6\tuiP\u0001I̩ēN,d\tW;[\fLJOӚ\u001d/{\f{P\u0002xB;'lQSxO5e4Pz&7\u00010L)?H\u000b*X@\u0017\u001f\u0004)XS\u001e\u000bAt|L\u0011E2\u0012\u0014SS8\u00016NM<'|\t,8\u0014g0Grj{I荧\\|\u001bw\"Daz\u0019\u001eZk\u001d[{\u001e)򈅅\u0015'\u0000\u0019$N>-Nh\"QQ·\\Q\u0013\u0011NU̳H:!QSϫ+\u0011I\u000eB$n\t1D\u0018c\u001du>a)BN}\u001c\u0014eG\u0004jN&FX/O~%2@#}9 \u000fČsUT8ep|%\u0016z)9}qB) t4\u00060\u001f>_\u0002J@\u0011|O1\u001amz?M񤬲X;-?y>+PtԆ\fO\t7Eq, 4*5/\u0014x\u0007hS-(EA䅧\u0003١GR\u0007\u001b𼖇\u0014i:\u0000\u0000=L0ҳ\u0016\u0005𹈊-]nP`{\u001az\u000bml\u0013c\f<{\u0005*\u001bQg\u000fy*2$چF\r|\u0000RO\tzKQ>t`;z\u001aff\f\u000f\u0011h(/?Q؀en\u001e\u0018>@\u0016R\"TzhQ\tz\u00119\u0000ElP\u0013\u001251\u0006Y\u0000\u000eS\u0013\u0003BBd\u001aT,R@?C0gl%A\u0018-\u0013\u001d\u0005lPz'Ϊ΍n\u0001==v\u0004fn\rct\u00104_R|qeը\u001aMD^\t})\u0016\u0014ױ[\u0016:\"/#4\u000f\u0015\u0007FK'\u001b\t&bE\u000f\u0000&H\u0000\u0001\u000b\u0003\u0010UuM×\u0016>~XFxo,,Ħz##:Lꈰ)y\tߎn\u0000\u0000\u0000[|\u001bcK\\CywY5!m\u0016E:k\u00169\u001e9w\u000bǬ<KX\\+^(#\u0011\u0014!!Y\u001b(n=\"I2so\u001eCQQ(:_Qx]\b\u0000\u0011!\u0002-jj5\u0011Wr^\rmr^4\u0018E#yl`\fJ`6$\u0019HJLf%\u0019M\u0004b1\f45\u0006\u0017Nffd\u001c̠ĠĤ<`!B\u0005\u0015\u0015ًeE&cBaxEy2\u0017\u0010Xc\"JcE#ơ(T{\u0015cAPǚS|Nk\nL\u0001jխђCN\u0015wp=_YNjO_\nvY\nY&ܪ%Y\u001fP\u0016P\u0002!I\u0012o\u001f\b\bV\u0010)F\"n8 \u0011\u0005\u000eN+$&R\u000b\u0007\u0003`\u0006o8vK\u0002\tLh\u000f\u0000`g\u0003Ou\u0000\u0015prTjO\u000e<՞zol*\r{x04ٽ7`z\u00140s\"cUr?a\u0017=>=:\u001dGN=:\u001f0uz\u0014@D9^\u0003@\u0000\u0000c\u0017`H\u001cÀ\"4\u0000\b\r\u0014\u0000\u0007\u00174\u001aLj(\"6 \u0018\"\u001c\u0012\rš0,\f\u0005ĀP \u0010\f\u00030\fq\u001c\u000f0z\u0003\u0004v{46<N\u001b1\u001e\u001b-\u0019bE\u0010\\Xr$|CdqB\u0004?Lfev\u0017\u0005g_hL\u001eiA_OH\u0012\u0013hu\u00144\u001c,5y\r1'elW\u0000\u0011X$\u0016-4?ǖmk#ĭ\nY0ڜ\u001d!@K@7sFbJbru-30¨\u001eDHA=Z\u000bk\u0017\\T4̗=g$a'Nh\u0013\u0016l\r\t;\u0003F#ꅑɋm\u0004Μ\u0004\u001f{GN\u001e\u0011y&]:Hy \u0011,L\u0012\b\u0000icB\u0007\u0012\u00144C\u001b<\u0005MU4\nG)\u0000l2bd2.Rǡ>\\ieM\\CyIϻGw~W㚡ο3B\"Q\u001f23H)ܠ!\"G/\u000e'\u0001p1M5\rbz\u0011&%8V\"i#\u0018-Rg\u0018k7TVMIC \u0018B@v\u0005,SNp\u0015\u0015`\u0010FG\u0012\u0011Z\bl[\u000eb7I\u001e\u001feӶYE\u000f6\u00075\u001eC!F$\u001e&\b\u0002@6D[\u0014'WIFLn+e\u0005C/\u000bĐ\u001d)B#WN\"%E+5W\u001fHF<1/j\"j\u0016&&V\rB\u0013ٷ1YgPXw\u0004zg|1$I8H΁\u0016@ɋ\u0001\u000b\\$\u001c#\u0019?$4\"\u0013v\"\u001fj.T^&\u0001)V\u00141h\u000b\u0006\u0001%ݳ3Y\u0007\u001eIwēq\u000fo`=\u001c\u001ex\n@\u0018\u0011(4(\u0012>\ttW+\u001ek_x8m\u0019y\u0010|\u0019\t\"l\u0005*ل\u0012e%a8I2h)|o\u0018aQ\u0001\u000bI[\bMznW\u000eFkT@M@\fwV>Fj\u0012\t|BdBn\u0005[]'/hG|ªuX!\f51\u001cFIpOӹ'X\u0010\b\u0003]D^\u0011)3l\u0003'\u0005>H\u0011m\u0011 \u00066\u0002\u0013鉈\u0010`YWU|Sx昹g-^吓XU\u0005}[\bPIMl%\u0004! 6MbPɡ*%GV\n6*\u0000U!G|Ft!Y\u0007`Aӣ&-y;U\rz\u00012t\u001e\u0012D\t'.qa\u0017\"[d[\u00064z\u0019}.0\bbRskmSvj`F;@Y\r뙿>{co0?'}*ɣhPI\u00056<[mc$I>\u0014h\u0011\u0012K(al9X!:\u0006`)qTVF!TlՇ0\t`RIqH=LΓpU\u000f8Fh\u000eHl\u0001ioƈ\\5H\u0007\u0011C,\u0006o\t&(<\t!(#ɀ}.M\u0004bS!\u00112ʆ.-ry\u00057chw|Fhf>/\u000biI\u00191ly\t)~\u0013ڢ!8H&a\u000f\u0014LȁI\u0013\t\u0014K>tJ1$[%qߪ<\u0000BQy.\u0017\bսE2\u0016\u001d\u0003\u001d#x\b\u0013\u0011;#<,$/\u0006\u0001d\u0013!\u0016\u0014Ǔ\u0005V\u001cՃG%RpC\u0015o\u0018y!X\u0015\b-rw]1H\u0004\u0000dХ!_=\u000b9D=\t\rySקSd%h)\u001b?\u000b%-emSpy\u0010\rw)z\t6}\rYh: TJ\"ӊxHmi\u0013'f\u001b\u0006`W\u0002hI{\u000f?\u0005rJ(\"\u00073y!\u0010S\u001eՉm}'&ÆB\u000e\u00130$x<j=D\u0002h~\u0014KIH?=҈ ӃOc@'$v\b=P~Dt+:*\u0019p=\u000fh\u0017Pvx0b\u0006q\u0001 Sd({y\u0013L\u001bkJ KÖx\u0002Q\bT\u0013\rG#GĂly6Ʉ\u00151Ly\u001c\u0018fKVC#A\u0015x\u0017y@:E^l#Ry;!\u0002LC\u0010FT\u0000\u0014$5Il:<\u0019\u0010̖Ϊ$\u0014\u001erH\u0007-)R\u00154\u0002%\u0001gF,)\\\n%up.ctpB(W^qCZ#\f̵P8t\u001c1Aaka8O'\u0007A\u0005\u001bdiW\u0014A\u0011\\rĚX7 ?\u0002FN\u0018\u001a}[\u0004\u0019њ3y\u0016OɆ]䥠\u0013}\u001ebMOYHSX2\rCZې}S\\\u0013\u0003c\u000f\u0010pHRk#AV\n\u000fmR\u00049*4$}\u0000D=cjh\u0018B3H¾|]\u001c{I>郂$y\u0000\r!#\nXyd<\u0000d\bw7H0bh5SF\u0011\u0004zCJ8|#EsA\u0012\u0017^\u00171chX\u001b\u0007\u001cC\n\u0014\u0001l\u0016Oc\u000f\u0010\u0004\tq\u0012{2@.7Y$\b?\u001c\u0011@\u0007NV\u0011wEfp-~4a\u0005\u001b\u001c3\u0007u\u001e'?x|\u001f8<'5ŕi\u000bB\u0010'閨\u0003\u001du \u0013?,\\\u001bGXImri\u0015>\u0011岕\u0001o;ޑ\u0005b%\u000farb\u0005\"=T`S\bd>\noXf>G:D$L\r{\u0015!@M \u001e2\u0010CLJ\u0002)D\u0011\u0013\u001esB5ʀ릏\u000fCI-Q[\u0011}X\u000b\u001d>w^Zcԯ,>5\u001a$[\r\u0007#\u0004)X!;t\u001a\u000e`#\u000fdB*\u0005`b  \u0001\u0018:a騃\u000eҫ?\u0000N\u0012ݐ\u001f´J$5+\u001cOE,\u0004\b\u0011\u001ft`OtԲ:o/B(\u0004H#1\u0001\r`4\u00105!&*jN=\rT扐_]S\u001b\u00155\u0010\u0001\b\\{n(L=J\b\bO$Z\u0007Ϗ:C\u0006ɐ*[_2\u0017\t\nz\u0016<frU<\u0007c3\u0011LQ7@\u0017ay#!$JH\u001a0ЭLS\"{&_4\u0015.[Elт|!疩5إ\u001etTW\u001c!\u0015\\?H=R\u0014ccM{JGnR&T0 _0Z@J^pʋzQWd;3\u001dëD;\"\u001c-N}x\"<q򖛴r\u0016ШKo^$/\u0015;نm\u001a\u0004b4\u0006A'\u001eۜxy\u0012\b\u0018[eZ\u001dHk)`sf^\\\n\biV\rU\u0013kу#XfǑ1=쐋\u0018\u0011{o|\u0012{T+FL)D\u001a\r\u0006`8\rGw\u0000\u000e˟}ܣ.\u0010N=[E;ME\u001a9qf=d\u0004V\fϹD1%pk\u0016ĲPP,##Լp\"\u0017\u000f{G'\u001c\u0004(<m4>TfwÂ\"52\u0011DܗH\t\u001eN\u0016\u001d\u0003\u0010[5\u0016n/7\u001bGh4\u0001(/P\u0002z+ui\u001fJe<\u0000\u001b^\u0016\u001fͻyp|^\u001aZ\u0016\t\f:\b\u001b_cg;Ց7 #\u0001\r5pmͰBM\u0015\u001dV\b\f3\":\u0007\u001c\b}R\u0014\u001f͟6&/q(\n*TK\u000fb.$駑\u00060vnƥCNN\u0010?Hta\u0013qz?ct0S\t:`\t˰\u001d%P\u000b\u001aH2in,n\boWd'sE@WE\u0001☀Iw &&\tFkHշ=\u0010\u0004W\n\u001cF΢\u0013+)\u0016@7pY\u0001x\u0012t?\u0007\u0005;\u0004^zY(Yf\u0007@`I\u0002\u0017I\u0003\u001e\"\u000e\u000b+(G6Ǥ\u00014ͅ\u001d\fECj~y3Ebmż3őW)oW\u0019\u001f|ǟ8n\u000bпB)|\u000fg\u0016C\u0003\u001fSR\u0000\u0017\u000f\b\u0002&{r5\u0002YgqhF<w!U6|rN\u001dLֲɢ\u00133E&ϲSv\u0002JE[G\u0012\u000bĊGbzoByh\\\u001dbDhlyj\"Z\u000ev:H+%;~t߯Su:쿹>\u0012}rvR5=ǣ̒wbz\u0011\u0005{đ\u001a,=&2G|5^\ruh\u0019q\u000fRP盛|K{\"X\u00193\t\u001c*Ht%xјI\nO\u0012:K?.\u0006Y)Ĉپ\n$\u001cك\"3,\u0014\u0016GC\u0015WgVQS\u0001>/s\rT\u0013TUW(m(o@\u0011ۭR\u000f 4/I0:\u0010y⁙$nA\u001fs\"\u0005>\u001d7\b8\u001fe5'J˄t@XQćHq7\u000b3=+\fo\u0019\u0001\u0004{.)#z\f$n&\u000bC8SϞflP%'\u0007^zrql\u000b\u0017(u\"(_\u000b~gD[BᄷPa*kO\u000fe};ߨq\u0001\n7B`-!\u0002F:5Y\byEkD0t%_ҟ3 4^0\u0003\u0000?\u0013n\u001d\u001fS|+;C 3\r䆌/%Cq\u0001W\u0001pӕ܈poՓ߄\u0000Ԓ؏p؎އoԎ؏oՏڀtqՓ\u0000|vpٍr؎݉~؏چwv؎wsrى}ts݉xv𐎍ۈzw׏َڌu؏߇}{wvَڍ܄zy߇}{xwv~|ވvv}膄{{܊݁}߇{zw݉{wv{{v||ވzvჀ}|zw{}|}{}鄃}}|{{x|{}{z{{x}|{{zw~{}zz}}{}{z|y|zy{{zy{zyzy{yzzyyy\u0002\u0002\u0002\u0003\u0000\u0003\u0000\u0003\u0000\u0003\u0000\u0003\u0003\u0005\u0005\u0006\u0006\u0006\u0005\u0006\u0006\u0007\u0007\b\u0007\b\u0007\b\t\b\t\t\t\b\t\n\n\t\n\u0000\t\n\t\n\u000b\u000b\n\u000b\u000b\u000b\n\u000b\f\f\u000b\f\r\r\u000e\u0000\u0000\r\u000e\u0000\r\u000e\u000e\u000f\u0000\u0000\u0000\u000e\u000f\u0010\u0010\u0010\u000f\u000f\u000f\u0010\u0000\u000f\u0010\u0010\u0011\u0000\u0010\u0011\u0012\u0012\u0013\u0011\u0012\u0012\u0011\u0012\u0013\u0013\u0013\u0013\u0014\u0014\u0014\u0014\u0014\u0014\u0015\u0013\u0013\u0013\u0014\u0015\u0015\u0016\u0016\u0013\u0014\u0014\u0016\u0016\u0014\u0015\u0015\u0015\u0016\u0016\u0016\u0016\u0017\u0017\u0017\u0017\u0017\u0018\u0018\u0016\u0016\u0016\u0016\u0017\u0017\u0018\u0017\u0018\u0018\u0019\u0019\u0000\u0000\u0017\u0019\u0019\u001a\u0018\u0018\u0017\u0018\u0018\u001a\u001a\u001b\u001b\u0018\u0019\u0019\u001a\u001a\u001a\u001a\u001a\u001b\u001b\u001c\u0019\u0019\u0019\u0019\u001a\u001b\u001c\u001c\u001c\u001c\u0000\u0000\u0000\u0000\u001a\u001b\u001c\u001b\u001c\u001d\u001d\u001d\u001a\u001b\u001a\u001b\u001b\u001b\u001c\u001d\u001d\u001e\u001e\u001b\u001c\u001c\u001d\u001d\u001d\u001e\u001e\u001f\u001f\u001d\u001d\u001e\u001e\u001f\u001e\u001e\u001e  \u001d\u001e\u001d\u001e\u001e\u001f  !!\u001e\u001f!!\"\"\u001e\u001f\u001e\u001f    !!#\u001f !!!!\"#####$!  #$$$!\"\"$$%%%!\"!\"$%%%&\"%$&&&''''''(($''((((())))\u0000\u0000\u0000\u0000%)))***\u0000''')((*+\u0000\u0000\u0000\u0000))*++++,,(((,\u0000\u0000\u0000*+,,,,,----)--...,-...//.////000.//.01./2/022233123444611243345666122123672356669\u00004444667789945554555667788565:;;7777\u000077779::78::;;=99;;<<<==>>>::::<<?\u0000:<<==<==@@;;;;;;<<?AB??BBBC=<=>CC>=>?@@@AA@ACD>?@EE?@@?CEFGGBDEGGHH\u0000BCDEHHICCCCCCEFIJJJK\u0000EGGHHGKKEHIHHHJLFFFFIJIMMIJJNNGIJKLNNHKLKKMHHINOPPLQQR\u0000KLOOOQRRRLMPQQQQQRNSOQOPQQQRQRSSTOPOSUUPQRRSRSTUUQQVVQSTSTVVWWRTVWWSWWWXXX\u0000SXTTTVWXXXXYYY\u0000TYYYZUUUWYYYUZVVVVYZZWZXXXY[XYZ[\u0000X[ZZ[\\\\[\\]\u0000\\[\\]\\\\[[]]]^___\u0000\u0000\u0000\\]^_`\\^__`a`aaaab\u0000\u0000``b\u0000_cd]`acd^deff\u0000_`ba\u0000\u0000_abb`cii^_`ab`ghhmm^``o^fr\u0000^adgkqrst\u0000_o`irwxabgi`abrvwxyz{}\u0000\u0000abenoowxyy{|}_ccddf|}~aipu|~\u0000efqw\u0000_gghmnz{wxyzppqqrs`juvabfik`guvahlrvwxc}e֌\u0000zckpijswdiu\u0000هښoyrxלs\u0000sx~{Ӊx\u0000uʅzȎΎ\u0000\u0000ῪÀ̗\u0000ʎ\u0000\u0000\u0000\u0000\u0000\u0000\u0000ƟĥŉÛ\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000998257e06-4db0-4a23-a893-a6859b2cf00a99fa078c-9fef-4d65-b182-c0550df24b30069799044 92148a9b20775-e871-4505-81a6-9bdf5c3c7efe78b8b3f9-4204-41a5-8927-9c5b5e0458e169439029938544140650632194960243810612177588168.952393791268494851891686858679049119.025945810482995239854876040321485530665396801409828057.351058508766CL39691058196 ]176298yz|vwz{yz{uvwz{|\u0000}\u0000~vy\u0000~tz{|}swtuz|}~XsXzj\u0004\u0000\u0005\u0016`\u0010\b\u0004傒\"@`\u0010\u0001\u0014\u0000\rH^2^P4((\rFH\u0018\f\u0007\u0003a\u0010FA\u00140\b1\f\u0004B\u001c\u0006:1A\u0000\f>\u0007ioVsWHЖcv\t5,p%\u0012iD\r?\u0014𫀌D~ap$\"9\t\u000b 9Ɯܡ36\u001aAj{6\u001e-pu<.-!QcH̛۫\u001cD.]8`]xZ3|Kb7>\u0011ն<B\u001en\"~\u0013w%~e\u000e\u000e+Pkw6>,Ě/oKzd%\b+\u0012\no(H?%\u0014_\bnΈQg\u001a&#1X\u0001\u0000`Ŕ΋| 1#һǘE̒,dŹ!\u0012*aH\u0011~5,\u0003#,9@pVlPk\u0014\u001d\u0012UcOs|\bU<^h}\u0012P\u001bp\u000e#nD\u0010zg\u001b/ o}Im\u001c\u001ceb\u001f\u0002\f\t_\"?Ytv\u0004_\u0012\u0014\u0006\u0000;\u000b)\u0011\u0010K\u0007$ >,\"&W谕w|d\u0011=\u0010A\fi\u00013W'GU6x\u0003\u000fK\u0002c[\u0017ٲ$x$frl\"D\u001237ߕܰG\b|Jrn`*U[;H^q<RC\u0000Ȣ>\u001dA=\u001d*78\u0000ʗ@\f\u0006\u0018\u000f>m\u0003;zs\u001a\bE`A\u0018B\\^U@*Lg$u]BbV᱘\u000e\u0011Q\u0014G ǫ؀QQ\n\u000e{w[*J/=֪\u0010du\u0019!\u0002\u0014v\u0018֥\u001c<\u0011Yp-\rhދoW4wph\fc\f&S©:9Ƞnw\u001b\u0012o!U=GŚ.zC\u0012V\fSXlӶ+Ysce\u00164\u0004\b]\u00171eƈVb~!,\"nDXD蝇\u001e.v\u0019\u001bec\u0011cbF(hO\u001e7-cs\rx\u001f5VdF\u0011L\u00144kpPS\u0015\u001c|6lI.q\u0015٤u\u001e\n !#E\u0011ъ}\u0019b瀧aҌ\u0000QCQ\u000f ̐\u0000+hyԚe\"9%$*+։ؗZ힇WqD4\u0011J\u001eMe\u0017\u001e$|\u001b-A\u0007Z\u0011uǢ\u001cSCǛ\u0002ơb VrN&\u0004\u0012\"\u0014\u001fiIв]+;\u0012(5J1#OU\f4\u001cāE\u001b\u0015mXn$},\u001cĦgC%I+\u001b I~o\u0018.\u0003Dd+\u0004f\u0011!r[h^BVq\u0010̃ct8iX,o\u0015x\u001c3Z,h c\u0005@\u0012,*]l0*\u0007/\"gHHQk-w\n2Eޑ˛\u000eC~8@\u000bhTU\u001cDť2\u000esb/\u0011,\u0007 jQz=\u000fuk\u001c& \u001eUd%G^\u0003l\u001cRTbK:DĹJ\u0001\u001c\nL,H4\u0013Ia\u001d\u000frt{,\u0005B$s<\u0015\u0015-|S:\u00167|I\u0017\u001fҭ\u0011a>Ȑ]S+#dohd$\u001145RCN8t\u0012\u0015\n\u0011\u0010#AP{BՕ$*O\u00109\u0001FKf\u0016Fkrb7u\u0005&\u0018Z\u0010\u00190l\u0015JE#\u000ffH\u001b\u00063v5f\u000bM\u0011m;(i*{\t\u0002,vO\u001b1S1XCEGn\u000b^K\tL_d%\u000fbW!Ft\\x\fSii\u001d`5;`\f\u0015@A\u0018]!~n2\r\f\u0015R#b!m$Dr~1\u0013+[$\bju5\u0004KSo犪DҶ$SPRZ4/\u0018F\u0011CJIWg\u00138;W8g4\u00018y\u0019<\u0019\tf\u0003#NAe7\\Bo\u0015\u001d\u0012\u0018\u0011d\u0002s\u000fc\u001ca@XY3\n4'\u0014\r=\u0003+W\u001cI\u0000_Q\u0001:DRwܾ'>4Vt\u0012fg\u0001H\u0010x`aF@Ѐ)Ɯ#P|2G\u0012NeK\n\u0004Hds\u000b2+K\f\u0016A\u001erm3gcш\u0011u\fZQC3,.\u001a.b?O\u00026k萃R J]Ҋ\u0011\u001f\\\fmFf`?H@\bև\u000e=h@畈\u001a\u0003U(Bs\u001a\u000f\u0001Q8Mb\u0006K\t\u001f\fO)))R)&g$x\u000e\u0017Mz\u0012869e\u000f.m\u000e]L\u001a6\u00116:\\Bo!-\\NfI\u0017LR4\u001dQVZЯ\u001ecI/B۰\u0015uSDe?Ji\u0005r\f]\\\t7R|pյk*Ry\u0011\\\u0017u^f%(ޘI (%MA`>B~]\"nMq ƤQ\fF\u0007rKǪI\"\u001eɡut\"\u0017#ER&X\u0011\u0015B\u0002-DkFev۠\u0004AU<p\u0003m1y5\u001b+, uc\u0014\u0010\r\u0017SRd\u000bF._\u001d\r$\f^\u00059\u00152V0mu\u0015uq\t>Q\"\u000e(S\bgZA\u001a*$>5ֽ,\u0002[aSC;_DQ9(㕥\\=*$\u000b\tM\b.)\u0016\u0014ү\fF\u000fɘ=7ÚUȝ\u0011?>FA#P.\u0016d+\u00117\u0018U}\b;\u0006!Qz$\u00114eXBc(3G!#Q6)\"TвJR\u0019C\u0015\u001e\u000e}.[&M\b\t,Xs\fT\u0007,'\u00170\u000e;U\u0004H\u0000\rZ$[u!;d6*\u0001;E\" \\Ŏ\u0006\u0011 \u0016s \u000e\fJ&ׅ(eB4\\7I1$<Yš\u001e\b\u0006j\u001f\u0004\u0010ۥM$%)\u0015\u0011C0T=l^\"k\u001bF1m'ʎc\u0000\u001c\u0012/P\u001c #g ʙ\f\u001c%iUEi\u0000\u001a8\u0007\u0012\u0012<?d\u001b,0&8Ru\u001cFlX`aD(+\u0015 mVkCf\u0011bM7\u000bϐb+,@cܸN\u0016H\u001f\u0013]q,[$,Tr#\r\u001bL\"C\u0016\u001bJ\u001b\u000f{LJ?\u0011\u0012#\u001aUL<T\u001dj|@f\u0010\u001a\tU\bn\r$(\u0015\u000euӏ[=Lhԍ\u0005^\u0003rj-\u001cB665/-KA\u0006Qԥrn\u000f*,CԨ\u001b-\u00074aAHG\u0017h]*78Rq\nb]*MKH cݖHchqom+l5uCˉ\u0016ੇ÷\u0006vD䵏2! \u000b\u0013\u001d!5OQC\u000fTEQ>zpaO3&fVT\f2A\u0002d.\u0007&cU{\u000f\f :\u000eȿI<)eRNe8;\u0013v`\u001ev \" Cer\u001c{ /?:i\u0001!t\u0007\u001bj\u0017z$\\SEM-C#򔅳\u0000\u0007\u0019ӎ6Hpri\u0011~~V6\u001f\u0005Z<wi\u001eA4t5vF\u0018\u000fI\u000b\u001e \u0016XXDBEf\u0012\u001czNT\u0001\u0000.q##\u000ej\u000f>Hr\u001a[\u001e\u0015\u0005ı\u000e\"i\"-3%ǽD^5\u0001X$GJ,x|GG!\fHz\u0012\u0017lȉ\u0011\u0015=D\n\u0012#\u001a\u0016w\u0011|'\"\f'Up8frTNIm;\u0005E)=\u001f\u0003ɯM=\u00109U\u001b>\u0004\\\u001cxv\nVG\u0011\u0007faO Y|\u001fP\u0011PUH\u00059J`|\u0011\u0012\u00175\\\u0014q&p\u0010yU\u0003Kq\"l*\u0007B<w2\u000f\u0001)kQ\u0010^4l=\\I\u0018΅\n{P\t2\fkvȫ(/\u000bb\u001d-\u0017\u001c_(h\"<0n\u0013/0c5\u0001)\u0004\u0017)CV\u0019ac\u000f\u0016s\u001e \u0000G'J$~<cn4N'I+B2\r\u00166AT\u0011^\u0014P\u001b\u0003\u0011'󁣎\b\"\"EKq\u0002ۥ\u0006xii\u001a΅\u001aϦHb\n\u0013\tƣ;\u0010!wSGɔ\"OF&)W#qKWkIŦ^0*I\u0001A\n\n1-jvL\u000b2dj)nD\u0011!\u0016\u001c\u0007ۘ\u000bk~)I\u0001WK7\u0004?WM\u0007rO\u0001qJ\u001bdH~k8P\u000eʔRP);Ur*0)N\u0006\fn\u0002H*~O\u0019^류=\n\u001eL6\u0000q8\u00160\u0003U\fnC\u000e@\u0005x\u0003|z$\rG\f\u0000갻J\\0\u0006H\u0003HI÷0nJ\tW\u0015\u0007\u0010\u001a6\u001aD\u00154\u0005\f\t\u0005\u001f1\"gW\u001eх\u001bcě\u000ey\"чTn\u0015==Z/M\u0015#%<\f\u0006fE3.JmP̣x$\u001dÐJQ0MQf`%Ydd}-i32KaL^pO-\u0014å*\u0011\"e\u001a\n\f\u000eU`1\f Z\u0002+ϡ)Śbf\u0012\fˠ\u0019U\u0012\r̲0\f6\u0002uH\u0005P\u000bw\\+\";\u0011YO˄}(i/ܶP,~*R/`\u0002>b؅\u0003ke#P1\u00182!zT\f[\u001b&𲺺X\u000b$\u0017<F/aؼ7x1\u0014-U=\u00038@:kjp\u0015;E<\u0006H)N\u0018\u0002 8\u00000\u0010͠\u0000Ũ\u0005{m+.!B-a߈\u000b\u0005o(\u001d\u0003f)~\u0019\u001c7⤼!i\u000fGlr,\u0004YehG\u0015»\u001e\"+\nQ\u0011~\u000f؂F\u000e.8!_`1IZ\u001e\u0002\u001e'\u001d1:)DF\u000b\"$I\u001fNoyC\u0010X4<p?[\fqF\u0017ǃ0\u0000>Bpv\u0003á\bx!V<\u0012&\u0007@ \u0011lb\u000eY\u0017CE3\u000f\u000f[\u0001Jmjy\u0015S1m襠x\u0002\u0012\u0018\u000f\u0007^Pq)7\u0004Rp\u0006hu\fUbBw0U\u0002s\u0010\u0007(ް\u0015چ\u0001[Yhz\t\b\u0005F;n^\fv1\u0003<\u001b\u0004|\u0002U䈢\rib}\u000fPd\u001c`/\u001cȒ\rۣ\u00104\r\u000f\u0019\u0015\f\u0011^9\u0016-\u0006F:QA%@HK]\u000eo+\n\r\u0004\u00125%Hq\fR\u00077$\u0014\u001e!\u0012\u00136\u001dʑ\u001fm\u0012kTAAKDA'\u001d$9-\u0002H\u0018\u0015\u001e\bb\u0017k\u001ejJk\u001c;,u\"sh.g!jA\th\u0010\u0011e魹S\u0018\f\u001c/T\u0005Re`gb\"J1Ty$\u001f\u001c\u0014$G\u0014H\u000e\u000e=hY\u0004\u0002\u0004\"P\"\f'\\t\u0016\u000e\u000b~8\b,~0r\u001eYjQ\u001bg;k\u0007?T9~X\u0018k\u0015eY\nuf\u0012Dg\u0003p\u0006V\u00161\u0011]-\u0014wl>R.R\u0018%z|.;\u0014:3fD\b\u001eH\u000e@!#C4҈?Ć\bIj&\b>8u\u0001eEL%lja#\u0002;\tEpFa.ڞ\u0000\u0004=\u001e΄^\u0016IB䓕\u0005[AܼU\u0000\u0005i;s\u00068bK\u0016\u0017G\u0012Mˑ/8\u001f\u0007ޤy3>v\u0001\u0005\u0004Ay\txٹ\u001dx˃\u0003 s;\u001dj>\u000f?A;Z5L8\u00178t`k\rj2F\u0014&L\bL\u0013q\u0002<-\u0000\u0013\fE\u001f\u0011bX\u000e=\u001b|JvHe4Qsi]QZq8\u0016\tR}j\u0015p\u0000ҭxXX]VG\u0010yČ(7\u0004N\\K׏\u0018F$\u001c=kAUk}`|F{x \u0017ij:Cn\u001dV2xr@$\t{.('\u0007Z_mRz\u0006'S\u0003x?hhfҍ\"Xw/%ZG41ZP\u000efޫה\fP\u001a\u000b/\u000eQpE\u000e\u00019a=W5\u000f\u0006\u000b45vᘄg@\u0000_w1\n\u0017z;K0W^\u0012)GJD\u0004c\fFlX\u0016b\u00032p\u001e,\u0005\u0017$c!;\u0010'qҘϕD!5J&\u000706p,ו\u0015w\nέ;\u0018EN1p\n*@?*p\t \u0005\u0000P\u0007\b\u001d\u000e4=crd\u0017,8\u0006u\u0010(ȇ5,\u000bGh\u001a:/xl̯zQI\u0001\nEѥddk,\u001c \b-\u0000\u0013fc~\u0000D+ĬP\u0004#[7,\u0000#\u0014\u0002\u0014\u000b^qTn\f0Q4 \u0002\u0016(&xF2.(LtҳU\u0002D\u0005K|` \u0019\u001b\ta\u001a+D\nC\u0012)'Ş_5*9!?\"BE\u0010@$\tS\u0010\u0005\u001dv(w3b_c+h6=X-Fq\u001fyϿ5~ķ0<9\u001f4Km1\u0017\u001c\u001b\u001cdR\u0004Λ7\u0016\u000e#\u0004sMGs\r$T\f)rGxHZ(\nF_hK\u0018D\fizY\u0010Q\tmu}vh\\\u0012A6z\u000e+cV\u0019w.\u001bP\u0003\u001et9d8[%6@\u0001z8\u0004\u0000&\u0010{\t\u0002\"E\u0013Y%pջ$̵ݫX\u0014۝l^YH\u0019pJh;B5`!b7\tSOv@\u0019ǘ\t~\u0017OH:\u001d-԰\\To\u001e\u000b0C92\u0013\u00058ܘ%.%HVzdxBھ=g\u0006@\u000ey\u001b\u00010B*ڞ{%\u001fQ*dkE\u000e\u0014xQXw૧C/\b{OwDDWR67E)XL3h\u0017J\f$FZk\r٧ԬO\n{j;H~\u0007nP\t⺭_tk|wx6EIDK[gǏvL\u0007$oC԰Ïl\rg%yB\u0011\u001b3Q\u0019\u0019<\u0012Dx\r|m\u0000_4h\f?Y\u000f{g8]6t\tT\rj\u0000\u001ach\u0012Bk\u0012,<\u0017F\u0004v2\u001drɯd2b\u001c+\u0004r@\u00050\u0011\u0012|Y;ѩʡ۱\u00011\u0010\\2\u0013'x#\u0002\u0018\u0002O4\u0003&C\"4c\u0014\"[оCUfpi\ta$)lp\b=\b\rr'RdNa<e\u0012h\u0007H\"1r\u0007\u000e\n-u8\u0010\u0012\u001a\u0010~\\\"\u0017ȅj?\\1QDt1e䇕\u0003aw\u0012\b'$VHvݛ:\t[\u0000\n#vϰ\b\narıDY\u0012XI.0\bbS\u001e9 `/PWu珧\fI:K(=Λ$w\u001cGx[|cd\nP9V\"\u0007ԁ3blۆ9!hz$P'&\u0012\u0001DH,iG\u0015`%A*&FNF\"\u0017\u0005ֳ`֫hx\t\u001cEo#C@\u001ef@gGg\u001cfȈ\u001cYÍ[\b\u0000Br\"\u0010=bs،\\\u0002X4m\n[39\u0006\nc;(k|C\u0018LU\u0012ai\bago\u000692\\S?\rP0J%&\tg2E}dC\b#/IDFD)4ϱn1Pd?l\u0007uOf\u0010f\\ue]^K9H\u001bq,\tm1L\nث-Z\u0002ȈX<#\u0011گKFRH)\u0003GN1#5Ȟg&\u001cN^Ijq[FrIa,j<\u001cbNƻ>LL\u0015̘4t@{\u001d&\\\u001aݸO\u0012n4h\nJ\u000b} x_J5H\u0004Kr<Lk\"0alퟎ*:\foEY\u0012\u000b-ͥk\">\u0004NmcW218mːZt0yP\u001fUK1I3\b\u0001\u0015jq\u001a\fL̀:L|\u0015jWB\"3\u0002K\u0006\u0006\u000e2X\u0014\u001b\u0010\\IzWҌKvҬ\bK`${\rPJ1\u0016\u001aA\u000eiU5:ds'zJ1%)#\raED\u001fܢ0V'6\u0003\u0016IVQcȑX\u0015}H\u001eFp9?\u0019,U0\u00198C\u001c+\u001a#іȊp#Lc\"ZmBt42I\u0002,\u001bY6\u001bF\b˓/=6F_*Q/<\u0001\u0010LʸS\u0004(/M\u0007݈A$AC~dLF$#\u001d=N\u0014UU\u001cEvgfK$nHȮkcu\u0012!\u0011XVIBR)D\u0003A\u0016r\u001f\r%\n\u001cg&ꁐ\u0010&0IN5Y\u0003i3Ew\"^盍QxN8\"͂Xa\u001fݒ\\'U\u0014\u00170e\u0014!x6EVP]7a\u000b]@4H'\u0003FLpg\u0014SK\rF\u0017Бy\u0000IRxb\u001d\u00183Q̝+\u0004\u001csVpI*\"y\u0017ob0d6\u0004\u000b99\r#Fd\u0003a'0a>B\u0007-,,.7r\u0013ec>\b\u000e;jԯP\u0012\u0017^?i\u001f\u001ely\u0004$3<RCf/P)9cd\t'i\u0012qpǷ}W\u0013-OF19;BΑv%)o6\u001bϴp(\u00131S1\u001c&߆y\u000bp\u0007\b'0F\u0018YY9jH1U\u001amVJ>+DE\u0016t悘M,oǝ팶$7Kvᙡ\"az\u001cc\u000f\\b#DX\u001e\u000eYIFmD.\u0014!\u0013e=?vy]4\u001f\rP\rdAÙ};˩r$+1sFV\u001c!B\ẗ\f@b\u001b+`yR.9#m\"3\f\u001dƘbqK1iOC9Y4b\u0001\u00061mk\f{\u0019\u001fHHC Ib0B{nF4JƄ'\u0013\bu%\rZ#FH~\u0001\u001d#R^RB\bpFIzѸ\fLjr=4xY\u001df` :\n\u0006ޟ\u0016>\u0003t'yDH\u001eL'\u0001q\u001aJx\u0000e}=ڒM M6h\u000bQ̤<]\u0013!;1\u000f8I\n(B\u000b+\n/\u000b\u000b\u0001\u0001\u0001\u0001&\u0006\u0015qT΋O67'h+\nz)\r'Bj@@.1v\u0015x\fEtŪ>KQ!5e?\u000f@@\u0006xST*+\u0010\u000511iGB\u001b\nJ\\D}!\u0001I\u001b*iH@Ҏܐ\u0001nE\u0017\u0012\b\u001fn(uQaJ\\\u0004٠\u0017y,nE\u000f\u0007f\u0006F\u00045dG\".=\u0010\u000b@\u000f\u001fJ)JT땤\u001dmgM煅\u0003\u001eBH(D\u0003\u0006\b\b\r\b$h+~3u\u0015+6KҎRNԓF[.$@\u0002+\u0019'4j\u0019m3t0PO JX\u0004Yv;\nCҞ\u0015RӔ}B&\t+k\u000f8E\n\u0013\u0005G⊚8ULK\t\u0006\u0012\u001e'DT!X\r\nS:QࠁCOQDxàG\u001a\u0001@\u0002+5M;~(MT\u001fXy\"n'3PU|3=9zy\u0005ie(ϰ\u000fƾ%=]\u001fM^CYەxN,Zl[y;\u001dKN9׻1ޑ$VZnW㵉Uo\u000eIr,1\nDnl\u0019[ZVuHm&\u0016~ml\u0012\u000bx\u0014HZ\u001a\u0004g;\u0012\u0016.$y9\u0018]?1$\u001fDR@AdD&FDDfBȌ̌\fHȞLLHH\bM&I\u0013\u0002\u0012B\u0004\u0001\u0001I~xd`c#\u0006M\u001b&\u0000\rG\u0007\u0001\u0011\"\u0001\u0004t\u0000s\b\u0000+q\u001d`\u000e\u001dq`Ł\u0000\u0002,e\u0001!P`\u0015!@Ձ \u0016sXnW``v\r\u0005ryXV-V\r-UT\u0006I}\u001a\u0019\\~C6S\u0018Nn\u0001P\u001b\u001b'HT}e6[\u00117\u0014)'JKRit]e\u0017>6R\u00010G$2FFHZ/\u001cg4R4\u001ag4\rw\"Xz;f[Yapu~z/\u0018\u0014.@`P؂\u0003:n<ٺoxyKKK\u000b\u0017R0Rb3\u0006bH4L2aPB\fѴN,n{2Â@\u0019-B\u0018P7\u001c\u0005e3:k=|\u0002ftNk=J\ft\ta@,F[\t\u0002e?]i5O,0@̰`Gz%l7b,\u000ba>۽7ێc_N:_CYιL4f^phxgvm&C\u0005\u0016\u0004Tp8]QN\u0007*pn;Yv%\u00045Owls0\u0006n\\3(:.9\rZnUtK*_s\u001a^ܺ\u0012W}On`><=\u0016}}UTkXYԪR\u0015ӳZVj9,\u0016S+\u000f㣩d0\fc\u0011~NkU8HPyv>-\u0019uLfюYey)V\u001f\u001ce\u0003Ej067R*\b\u0005\u0019>Jɪ\u0015ic\u0017Z\u0019\u0006sD\"Rm\u0014ƚ\u001d+<O)\fð\u0004W 0\u001d\u001d\u0014,yj\u0004V\rG$:;\u001e#&<n]9V;<*p߾K;:::<BgOơ9\u001eb8\t]hV.â\tBga|v-<q:'n\u0018ԡYXK<Ș\u0018eNΒX16788ʜ\u0006GY\u0014=&~dpkl\u0013\f\rM2C\u0006$\u0016I\beffxE#LT]$\u0002\u0018`(\u0001X\u000ejF \u0007\u0014\u0000\u000b\u001dH,>b8(4 \u001e(\f\nH\u0018\u0012\b0\f b80\f\u0004X\u0013\u0000E'(S1#鲰)L|\tmH\u001f\u0015\u0011YGQϳ\u0001\t\u0011vT\u0012\\=\u0005y>\u0017=\u0007K\u0000<w\u000eod\" ,VeAZs}Le1L\b]8m)b\u0016kݳxYh\fTAy1\u0001BA7D\u0010\u0019\u0015q\n*rUl\"ϵ\u001c.pc\u0013\u0017\u0019]\bv%\u0011\u0016\"&\u000f3e\u0015\u00039r\u0017Y#\u0007.\u0019J<Ǒ\u000bULrwe\u0002\u001f,\"ׯ\\\n4Cnq\u001c\u0017vV\u0012S$@\u0004]HPl8^>`_=\u0013a)N:_K\u0010%^\u000f5\u000f䣛 QiOXP\u0005\u0010.\u001f\u0001$\u001e;X\u001a7)<p\u0005'^q[\u0011ZK\u0016\u000ewV2R\u000e]!^gG%zv\u0007b\b\u0014\u001a\tzk\u0017zX\u001c)b\u000eq'qڀ\u0001I+wv\\\u000f1\\00_.OZZyh`gMuZHĴ\u0006C|XPLÐND\u001d̄H|,|\u0014~0\u0004s\u001e\u0018Sn\"XDm~£\u0007V:\u0004b\u0011z\"%*QXH\u0010,\u0014^D\u0012q\u001e\u0004Ƣ(1Cj|\u001fibhy\u0006k!d^X°$\u001d\u0005U*a\u00119j\n3&C>\b\u0003\u0014Іn~!cW\u001cj1}R4ԊH\u0019Q\u0014fH|\u0011\u0011\u0003ٷ1txߎbDɤTIvJ$\u001fdB\u0011Ea*0ϬJ_ShA\"n2\u0000-Sg\u000e\u001a#raQ\r-\t\u0011F\"ID拔\u0011*\u001c\u0011!PH.#\"pKu\"\u00189bH_|\t\u0012\u000e,G\u001aЉ\u000e\t#<\u0002 \u0005 \u0017䇪L?8cY4U`2\u0018'yF#3\u000fr)#\r\u0006(@\u0010x%\u0005\u001f\u0013lF\blTu#DEg=Mv爉Y\u001eqr0֌\"#H\f˹J\u0011\u000b\u0002xrn7\u0005X,RvE:,E\u00151Fp]\u001bl\u000b/aQ\"m\u0001z\u000fcBE\u0016h\"UEu%%y\u0006aI\u0003\u0012!#nE\u0019q\u001bOp-BK+cu\u0000\u001c\u0006c8^E\u001dy^b9WÎ.3XdĎ/\u0007a\"}]_0<D\u00185\u0017)\u001bjAJo$^D\u000erD\r?!\u001b\"@\u001fR)EhXN\nYhw9cà0<\u000b/8\u0012DWDo\u0014A\u000egH\u000fڄ\r\"\u001drjID\u0019qIKqpI\b\bQ6H(W|wl\u00077X<28$B]Vβ4˨Hm1mWq\"8?v\u0012UDW\u0014\n*\u00010a\u0016CA\u0007yaK^0@P>1\u001a9\u000bvR^`IOT)y\u0015$\u0003\u0016$\"#\u0006)`_EG\u0005;W%1w4uxĔk\u0016^)\u0019CՃڦ\u0019GL&\u0012ev-VGR\u0007dF(Sڔt]cR a\u0019/mBy\u0006>ћ0]\u001eW\u0003/tXQkQ'.\u0011|m]9ʨ\u001aqT7i˜\u0011|s\u0014)$\u0012sO\t\u0014ZZ\u0000\\>Z]\\̐\u0013Q\u0011?f\u0017θ'tJFc'2Lrr\u000f!6F(\u0003Ec\u001c]y.[\u0013#\u000fTh[л\u0012gU\u0005,\u0000ːL^2dS)BE$=%T#x{ct_qfG\u001aad'gbma\u0006]sEbh?N\f;hJё\u001ajehPg\trX\b,@\u0017\u000fczq\u000fiI.u^X͊jl\u001eŶv\u001e2]_b\" \u000eJ,\u0001\u001a{m`\b\u00120a\u001bƆ\u001ar'\u0017mq\bea_b\f\u0015Kݵ5#G\u0013DΜÎ*cԸ2cs\u0018D\u001dV\u000ḛE\u000fe5X'm-S\u0019\u001e̺QZ\u0007e|%/J\rPE_|Ef*ڗJ7w\u0012'\u0004#?\\PT\u001ap\f\u0007#j0@XC\u001cő\u000f\u00050m@%jW0\u00164Y\u0002q#\u001dL6:\u001bB:HnT6}s \f^\u001d8\u0003Œ[yRB\u0010fneA\\bQuS΂\u001cgm.y-q\u00160rxC:Ҹ\u0004.\u0019\"H:!\u0017Ĩ<\u0019~ \b\\\u0003^F\u001cArb j\u000e𖚡3f\u0017Φdb\u0004D]\"\u000eέ؀vy\u0001\u0004aHۅzcJ!5\u0015;`kzR\u000ehB\u0014\f\u001b.7c\u0012qӆ\u001c#\u00191OJf\u000b_u~4v\u000b\u001agf!\f!o\u000f\\p\u0015OcL_\u0001!^K8'z:x5cTZx]X~\u0010&>%MwL\u001f]\u001a݃\u0012)0\u0007?\u0019$EE3\u0012\u001a=eZ\u0003S+8a\u0001#\u001e:PԲF!Y$yzS\u001f\bZ[)\u001c}\u0011<t<\u0013<VFCH\u0015@#\u0006&V;I\u00042x\u0002@S\"\u0011Qisaj,JYWL[7\u001dY̽55\t\b\u0006<5ҷ&)%Q`,Ւ;RB-|(\u0010\u0015\u0015KIed\u0014JMn6PX9\u001c\u0012fD\u000fù1LQ:*Lc]b&,\tA\bJv*J\u0012wzO*8\u0006+ޏL\u001c~\u001d\u0017K#u\tcIL\n\u0011 @\u0003x\u001fa\u0006LI$b\u0016L<=RI_7Ց\u0005\u001cCp\u001amrC\u0012\u0010lE\\|j\rc?L24\u00114\u000fH\"j.)c\u000fV5* ?9!\tie\u0004\u0007`kȴ_pDH>zI\u0001=m\fZ\u0005\u0010؍f\bg\u0015[HX[.$R\n\bj\u0013(`A'a=\u00100%}HQ\u0007ǝ~5b+UE\u001eGI[L]&ʳo\u0018aC9a\u0015\u000f\u001cgsf6Ƣ\u001eH\u0006h\\*Ww]]fr6{[bHd^5xlKH\u0005\tVTkG615\u0003\u001e\u0001#5<\u0000\"is/%yUZܱ\\69.ys\u0012Tb-Ѻ{\r\u0005\u0018I\b4I$Zf8w#\u0013(H$Ւ9>ceR\u0003BPmLBIF\u0002\u001aSaXL2t\u0006\u0006>\"L\u0012\u0001\u0000wa@P-=H\u000br\u001a&\u001a%\u0010\u0018a܉Q\"U`\u0005ݚʇt\bDݾmcz\u001e#RZc\u000erMW\u0010\u0004\u0004nXq\u001aW3sJ1\fy\u001d!و}:\u0016((^FH7x˷k\u001b@Dp-\u001e\u0001NSc\u0012\u0004\tϾhJ:yW |25tȏjN[5\u001a#\u001ck͒߯\\\u0010\u0006\u0003M)\u0010\u0005$r\u0017@\u0011ԉՎ\"R\u0002\u0019\u0006Z\r\u000eu1v,p&e:M\u001fֆg(\u001dO\f\u0004x-\b̒\u0006F!^\fsa(-\u001f2LTHjCک\u0004\u001ceLknF\u001am\u0015xR\u0010@!(NI^\u0010\tۆ7\u0002@ĸkħ\u000egr$7\na>ɲ\nfL\rd;vly¼H!ݬ$a(U\u0011)rCgU]T\u0004#\u0000q\b{ MH2؅f\u001a\u0000\u0007\u0018\u0019K?ʤ-i^{+$-I\u0001I]F?WD\u0001\u001fPZ\u0015\"97\r_+=\u00114.uڍm$Ҙ_ۡԾm#1+H'P\u0011/2\u0017C! lUY\n\u001b'QQ.L`HR'}~h\u0004K\u0014N\u0017\u001dgޖLl;+#F~\u0006T\u0012i$fo\r\u001bs<j\u0018Y0Ɇ\u000eW{rL([@ 'Je%IVld\tb\u0004!`HSs%X`H\u0015\u0016W%:{Vkt\u0019|!\ra$\u0003\b,xHF?\u0013f@%Afh\u0001^Y;\u0003\u0019-S:\r\t\u001e\u0011\u0010pk\u0011\u001389&\u0001\u0010\u0001WI9\t`b\u0007ɧQh\u0013a\"UI+N۳N\u001aO\u000fV\u0002\\e$\u001b|]\u00139Fc$,뛷%*Ith_wv\u0010&q˒2\u0012n\u0013$8m@:C` Q!&dAmn\u000f]\u0004M)ӆpՏxR71\u001a`$NeM:ޕy%J3\u0003c--Ӂ<qt'?\u001cF\f\u000bCI*.\rnrGC\u0011}\u0005\u001c-=@z\u0006\u001cIbkD).yPh1\u0014\u000e!]\\\u001f!j g\u0014*T\u0002FvOdOC|\u0002\tq8\tR@ב\b\u001b\u000f\u001eQ1s\u0013䉉%\u0001ǤOTI\f!I\u0010u_0i\u0004U\u0002J@9{S\u0011*\u0013\u0010\\\b?8\u0018F$ڧL@4=@-\u001eh/O$cBNf\u0018%es~Ѫ\u0001F:ժbA\u0012\u0010N\u0003D\u0005o\r\fd<$\u001e\u0019CNYLH*\u001f\u0005+譿ӎ\u001e\u0005IP;\u0016Na@31鶸2\u001f@3p({\"\u0005IBtsݪtt$#\t^^\u0007\u0012$I2c\u0019%c\u0004P\u001c\u0005,FOJs\u001fxr\u0018b\u0003X \t\u001b\u0016\u001e3PU\u0013V'\u0013YD\u0003\u0019w\u000b$L+_`QV\bʳ\tĵ2\u0016ўdl\u0017mGn-y\u0012e19b\u0013\u001a'#d\u0003\u0002g\u001c㒫>\u0001IE6o9GjL\b=qfIfJ`0KaA?[d\u001aiΙܲǨ>pR9\u0018,\u0016@ϥDt\u0012\u0019$ބ8'S^+{\u0018Gp.iLc)P\u0010>M7FDR\t$24\u0017~$:y\u001b[$A;%s+|\r:7L\u001a=;*uy\u001dXSZoF|VkH\u0001\u00119\u001c\u0014NN\u0002\u0011nE\u000bоyc-{2\u001a\u001bg`\rb9J;\fM'\u0010\u0013LPisW\f8_\u000e\u0007@sĔ[]\r/ >|E%0\u001frϰ\u000b:\u001f\tnE](ʽyI8I\fH7$_=04D\"<\u0003=7Rw ϓ\u0014\u001fJDHÉD\u001a8L}ZLH\u0002Mτ4\f}\u0005,`/Xx匸:\u0004C*s\u001aIOR\u000ft\u0011N'7YhdIF5eS$@lg/Fvuh|\u0000i$]n6a\u001fI,+gCo[f\u001c|xL\\\bK?&%C^a\u0006\u001ci݈?XF\u001cQNL\f \u0006\r6a<*\u0004q\u0015ZHD *\n\u001cJ\u0017\u0003ʘчb@\u0000\u0012n3\u0018LQLduc>PꚭDKFQf\fI8=$N\t{F\u001dw8n\u0005ތbX3\u00043PEFM\\aG\u001cnZ6'AH\u001fxK\u000b\"0\f\u001c\r`UU5!$e\u001b\u001a\u001b\u001f\\-\u0011m2\u000eH$#8=#~\\(\u0014I\u00045=\u0000T6\u001c!F\u001c\n*dsC\u0002XQ3!I\u001c!bL mU\u001b8aF_\"ZxN/ZCA\u0012t\u001cyb$E\u000b}\u0000G6b)\u0007Y\n5%nv\u000e(\tTH\u0010#NF#_B/?#(C<\u0011aLrF'l]x%<|\u001f>\u0018/(n,㪇\u001f\t\u0007Zu'JRBp\u0005$ч$x\u0016+b$ \u0004ole'ZX#V]Υ\u000fhM\"\u001aS\u0001q8\u0003\";U\u0010H!6\u000e$\u001f\u0014\u000b\t&W%@\\\u0013m<!3\u0019\u0019& u՞\u0004\u0000ZQn%\u001b\u001d^]\bmyҫfO?H,\u001b\u0002h\u0018\u0019AC`:,CBVm]ثp\f0/'0Uj\u0015Aix]5lJ,v1qN.\u0011+`q\b\u0010\u0007XK/M\u0011\\@c\u001c\u0019)V5L{1C\"UL\u0014.hZL姍(ˉ:q8揗;\by\u00182³3lnWד\f\u0004'\u000b/nl\u000eT\r߷.1rS\n\u00057011MIE}90zS\u000b2<\u000b'\u0011MlOIҤ!\u0007b\r>2s\u0004q\u0010FFn¬2Fjc\u001aN\u0018AAfM_D\"\u0018!a%Jm\u0004\u0019(I\u001e@\u0011\u001f׫\u0000y;d\"~ u\"k!6vB'o!`\u0012$G1FDȱI\u001cY.u\b'<5ϴI$\u001e\u0005\u0004Bdm6:ju\fW#\ba\u001b3_\u001du\u0002ξ@b\rKq?CMT1T\nLs$P\u0002LZIK\u0012.\fc\u0004z\u00181\u00118GrÍYj<J\u0012aQIF}E#ŅI1UψG0Z\u0004\u0018I\t]\u000e`r*\bb\u0018=+dg3!0Q\u001dTdc\u001aA3\u0012\u001aYF[BB\u001f-ȑ{E\u0016l%4\n\rHڭN`|_#J#_WE\u0012bDm\u0004,ArBbq\u0019o'+1\u0005Ŭ\u0003ZF\u0010F\u0002e\u0011&rnxY\bOƐ\u0007_\u0012y0#%\u0012#D0c`l!\u001eI\u0015<Մzv#c\u000556jj9\u0001f!wE$\u001a\t{ŕ [\u0000]б-\\JR-F<&8~WWC\u000ei(\ta\bdVIH㪈\u001cѻ\u0002]HN~6\u0007T#ȼ'\u0010z$g\u0007)R'\u0003lFL0>o>\n\"0\t9ˁ\u000fBD*Hrg[cv\u0014^I<#\u000bKM\u0002`M֪MbL\u0011\u0004ݨh~J\u0001çFeËc8fo#^'Xd^Fj]Do\u0004c\u001a&z\n#\f1[\u0018:7\u000e\\Ө\u0005\u001cn@蔱ĳӽ&Ⱦ\u0000ȁi^'Jr0OA=MF?\r\u000f1$\f\u0019*@\u001e1IKC̅ykqI^gu~\f9G$\u0011yҒdH#\u0006\u000e\u0013lAgs\u001f|\u0016:\u0018Z$9Yxm11\u0016x5mF0\"zu\u000f*FVԎo\u0007H\rT\u0012!,\n#jE\u0000\u0001&\b2Df-i-\u0019 bږ\u0019\u001d/^͸FʰPF)i$\t/zJbhS\u0019\u0000p>t\u0018Ҏ~6-]c|q|\b\u001b\u0019nIH(}yDG`\u0012\u001b闉Ժ,ݳԭjIA\u001eՖ![BS,\u0014Mb`=\u0015Yx$G#a+sNxGIKtt\u001d\u0014(LF\u001dsm*XN\u0011ӬWWgeI84;-#A8\u001dKyBj\nUF\u0013\u001f\rQY\n&G-\u00056\u0003S44ɐְ#\u0003$:7E\b\u0004&Ӕ!9$\u001a:Ϯ>\u001c`DǄ.Лۨ=<%YT\u0004N#p#-X6z+qɣf-\u0010px3\u00063WL<K\u0007IН\u0015&SbjW0y_ȷ\u0013 T$\u0017\u0018\u001etiö\u001b\u0011s;\t+\bN\u001b\u001ezˈ(\t\u0003I_Kŝ_wӇF\u001aWLXc\u0000c\u0019q=\u00142*)x$\u000eiO~\\H\u0000\u0003^t\u0010%ijk3)2\nQ\u0012>\t-9Ω累e83\u0015nVFjk2ћ\r\u0005k1;Y8a\u001bjg\u001ei\u0006\u001e7\u0015q\u0003#کT+6\u0017G\u0004\b$5\u0002\u0013+tHՃ\u0006&#\u000e\u0004f\u0012k[\u000eD3),\u000eB\u0017S7:\\Ah6Fj\u0010\u0004+.\u001c#L=r4p$\u0019r=\u0013+_C$yy_;}&\"\u0010+丨\t3AVuS,rƷ\u0001\u000185p\b\u000bbEX\n8\u001bU岪9\u0004;\u0000^\tnIJZ(spa\u001a\u0018\u0000\"\u0003y<:>;I;QF\u0000B\u000fKu\u0000ԓ&Mx9\u0004(\u0005B!\u0019h<u0\u0019ja\u001fG˚F\u001bTu|}`L0@~y\u0015[FC\"?\u0000\u0000\u0000fvý8p8ar7Nn8nct\\.\u0017q\u001cǱ.vx<n\u0017q\u001cb\u001e|>z>?\u000f\b\u0004\u0002\u001f\u0010\b\u0004ȡ#\u000e\u001d99;v\u0004s\u001c\u001e`0\u0018!\u0014\u0010\np8\u0014\u000euC\u001d\"H_gGgG!ȲHe,r(r8\u0017Ecq\u0019Djm\u0005h4x<\u001e<\u001fyy\\9\"H=e2e\n\u0015\u001e$\u000f\u0014\u0015*R=ѣ\u0003\u0014ZB\u0006j=@dĸ\u001a\u000b2\\)VHC\u0004\b,֊t2,6@0pAà\u0001\u0018\u0018\u0007/\u0019S\u0001-\u0003\t\u0005l\ba\u000f\u001e^\n/\u0003jدW\u0007\u000e.W\f\r\u0010s\u0006\f\u00127hܸ6l1\u001b1V\u001b\u0018!0\f\u0016Å\u000b0\u0005pf@1B\u000b\u0019\u00028,\u001eа^J\u0011cbu#\u0002B\u0003\u0017\u0000*\u0015\u0004\u0016\u00002`\u000e\u001fSC@2L&n`\u001ch?\u0001g3\u0017\u0005-e4\u0010,ֲ2jedߥڶ}in\r\u000ejzUtw\u000e;W~+\f(ܮ\u001dfk溞(5iWWZz(eteMխyD{7ַ&\\kGӗFR\u0001ZN7VY\u0013]}\u000ei\u001bVkMӤMd]\u001al᳿UP>f?k=]׭Zk\rZ`[kӴ \u001aMKs},tZ5?T\u0011\u00136}Cjn\u0014\u0016?~\u0004\u0001$\u000f\t\u0010(?|\b\u0002y\u0012\u0013$\t\u0005\u0014$\t\u0015\u0004\u0014\u0015r\nb\u0014LB\u0001=%BNO'SPI4D\u001c$$d\u0010\u0013\u0013\u0013rdD\u0014\u001a\u001aZ.-KCJ'R44,\u0011\u0011-\u0019Q*JTTt()HRR\u0011##$HH՟{~[\u0016a'wjf\u001cUճsutUyK'կݫ'WUBѭTݝNٳԯwΦ=\u0014h\u0010\u0004\u0000\u0003\u0016 q \f\b \u0003\u0000\u001f\u0014\b@F*`VB2.\u001c\t\u0006\u0002@\u0014\u0012aP(\u0018\u0004\u00028A1P̓\u0006\u00009<,D\f#x<pO7\u001a8>~;mc\u0003>*\u000eK\u0011/S\u0006!D\u0007yFf1\"Vd_v&,eE\u0016] \u001cv0R]*y8\u0016[\u0011i0Ղ-2m|:\u000fjL[+\u0019:V$s>q-\n\u001c\u0011F\u0004XH7\u0018jjg2{\u0014\tS9\u0014r6ʊx'L\u001d>4[HXl>h\u0010\u00179\u0002C\n4\u001bK)\u00031\bL3\u0011\r\u000e\u001b\u0007w\u0018=PP\u001a&woi\u000f\\\u0011X1\u0007\\\u0002\r=)w\u000e6*>gÒңo8 ItJ4*$ɮĳ\u001c6J\b~H/W'\u0006{\u000b\b\u0003%s0SzƳ\u0007\u0003r\u0006`w!f\u0010\u001f;(w+d<9\u0007ĈD(\"$n/[/eAQ9\u0002n&\u001fo\u0004*<^\u0016WHfs|E\u000fns\u0015Ҳc|\u0000kY\f[8OO'QN\rKxxq\\N\u001c]JQ/$?|˔\u0018\u0011*@9zYW\u001al\u0004\u0015\b\"u\nD\u00066B\u0015+-\u0007ACU\u0002Mr\u0004\nj-x\u0014R\u0011jmVnך`\u0005\u0015BA'\b\u0013'7\u0015pR1uZ\u00123ր&\"oW\u0018\u0005ts\u001b\u001b\u0001OHu\u001d㇇\u0004Mi392|3s\u001768MU\u000bʃ~\u0004*\u0006>XxBΈI\u000f\u0017E0h[ZHu+\u0018h\u001fՉ. V\\\u0002ՌC*X}U\u001cƙ\ny!Tq\rGEB0T=#V;g\u0004I\u001eMHp%L!r>\n|cAU\u001d\u0016\u001b\u0016\u0015U$oaΫ}\u001d#rIID:xb'I42\\m\u0018X,\u000bmFT0\u000b\u0005cDO7^\"OGck 1\u001eR{c\\G\u001c]\u0010P\u0012K;@-c\u00155sI\u001dҺUŕ+5F&\u000bsD㼂1wc`\u001c\u000fDX\u0001\fTn]\u0011Fv\r$Osru\f\t\u0012ݲ;\f.N\u0006\u0013F{$!p䇇T\u0014ᐂA\u0005\t.I\u000fB\b\u0003m\f\u0018\u0018 տ ~l |m'Bȭ߻Š\u0011)C\u0000*%&b%aߟkT)xd,{evKt\u0017U:\tѕ]iWQ\\>Å\u0019Ե\f$:,W6+`CE-ebة<2?Mϵ0z\u0017\u0001YwHx?\u000f>_J+JWP]QПZh5,c]ҕh+hWͥWPP1I5s$d\u0012q%\u001f\u0000\"|M\u0017>\u0005'+\u0019\u0000\"&\u0017Tfw\u0014lbu2tq\u0004\u0013΀\u001a\u001b#\u0013,v\u0000udfDxAX/S\u000b\u001a[j\bm\"\u0001`Cv%T3n\u0018̾L8\u001a[\u0014U`{2s!^^\u0018\"TŎ\u0010A\u0012*Ua8YX1\u0004\u0006\u001e+\u001eƢ\u0015H\u0001`\nbR;@ecN.\u001fi~h)\u0011\t\u0015wry<\u000ef9h\u0019^/Ґ\u001f}^6=\u000fއ\u001e\u0006y;\u001ad\u0000u~O\u000f|EA(\u0010\u000e\u00129|  a7\u001cBR#\u0002H\u0004\u001eVXL0\u0007\u000e\b\u0006\u001e_Ü*\u0010+1\be\u0016VG'*\u0011Νc2\u0014R\u0002+;=\f\u000el\u000eW1I|ٱv}7AL#rZV{\u001c>PM7K6L?wΆx\u0012]@y-[;כI˽N&q\u0004\t{;nuUC]Պ^d|*.Kt#=ٞ\u000bKĮ1Q3⣱h\f<t#eX[l\bꡬaǿ*x\u001f7\u0004~>ZCI\u0000l{0\u0007׭1z=:\fx\u000e.\u0018nfc\fQ(\u0004JKhb\u0002Trq^\u0004HB\u0018uIQH&P\u001453?uM׹j\\\fb}{[\u0017Z]S$T\u0014Yw|f\u0001əڏ\u000fr\u0006CK\u001fܜ7\u0012S\u001c[& dsLC\u0003ԅ\u0016ϊ\bV+auYZEKX[#yu\u0015h\u0012W:-6n\b٦\u0003\u001e YBz(i*'xF-\tM\n\u0005hC0!<(Pd\u001f38|Z\u001d;o8JtI3\n\u0018m*\u000f(¡\u0003Xj&8֏{d˅\u001eQELgq\u001cw[\u001c\u0016](0$Qe\bYТ R\u0006f/O,B+\u001eyJ8ARYm4,M\u0019TUJ>\u000eeߐ**\u0016MW\u0011O_KsTs2\u0011}\u0011l\rS/b\u0011F\u000e\u001b1>Z(ZT>^\u000e\u0002`L\u0012GZ1-\u001b\b\u0015:pa6@\u001b\u0010\u00159\r\u0007G\u001c\u001b(sm}WB\"*V\u001d.!Zo\u001fns\u0001NA3^\u0016\u0007ʛr%\u0012ռ1)ɋ1b%\u0000$BSh!kY\u0010\u0016\t5.\u0018$?\u001a/$(r|\u00142>ha\b/8\"!6\u001df\u000e#\rM]=_}UU&Y*\u001b\u0004l\r\u001dP\u00042=i\u001f{[U^cH\u001eM\u00137A\u0003\u0001ߏ<Nh({ž{\u0010z\u00158dBѣǀB~C\u0013E&Qڸ\u0002Y\",F\\\u0010n>7\u0016&IqZ\u0001oޯ'-\u001b1Zy\u0011_?\u001frB\u0000pM_\u000b!$ؕw\nڠŜ[As^`\na5Xh`A\u0006hyL\u0012B4\tSv\"{\"\u0007&,\u0016\u001d_B[\fӗ~\u0016d0IGc!'B^h\u001bG.K\u0017\fN\u001f#\u0010_#o\bp\u0018\u0016\u0015\u0003Ux6}\u0019<}\u0018\u001c!%p 4j=4'nyz\t{7UF|e[g\u001e\u000b}qj\u00149=\u0012t\u0018ڲi\u0011Q\u0005(\u000b{]M[TH7\u0002~S\u0005%\u001c1\u001f>\bD\u001eC*H\\04#(0ȕ&\u000f*L{\u0011\u000bW\u0014.PLS0!Rᗶ$}\u0019#\u0003>;nEi[%ηj\nTyT\"y\u001c\u0001BE\u001c\u001dp\u001a\u000f\n\u0014.\u001ch;\u00104g\u000el:/r\b)\u001fɆ5+\u0014рiѳB\u0007\u000eR\t{u\u0005F\"->\u0010ID\u0001\u0002q曎:GYt\u000fS\u001d\\9#$\fbA\\k؛}\u0006QS1b/QTԼ=#yᇕ\u0002_+\u0005tX\u00071\u001c{3^[Z+\u0011!B[:\u0018/5A#V6\"w؅ocz\u001dYO\u001e/\b$1G\u0014bhvɈuQtR;zoDsB\u001eS_q\r8=ZI\u0010vC|~Ւ.+G52[e^ױ;\r\b1ɖ=x\u0005톐ZxP0\u0000>CM\u0002ʒqP)\u0003<e˳؛Y\u0003ox\u0005}FoIniޘ-#Xg\u0010-\u0001zMS\u001b6\u0003hb\r@vS޻TTCvQJ0CtjxU(\u001a*\u001doQ\u0013vQ\u0003ƃU\u0014\"/\nEX\u0000D!MIg82n\u0014?Ȼ=.\\D'p\u0000\n\u000b\r\u0015&p\u000f#MV͗B\u0003h<zp~\u0002z\\շN \u0014\u001eA\u0015iFѫ^HЧ\u0011FD\u0010ԫ\n:ɷ.\"l\u0016\u0015O\u0001\u0011\b'L\tEB7,8)=A\u0006\u0018Q\b{|Z<bC\f\u0007\"\u0012^\u0012\u0001\"\u0010yE\"C\u0002jfI+c.ƼV@xHWýc\\sA\u001c0|<DxDL!f\u000eQݠ{\r5KHﮐZJZY|9M\u0019QN|\u0018nH\\孆os\u0012>\u0019kX\u001f5g\u0010hfX7j\u0004<\u0004b#(t\n!X\u0015>{\u0003q#\"Aĵ\u001eI\u0019Iظi\u0017\u0003\u000e؏INWG>;\u001e۸<[\u0002\u000enފBܪ!e\u001eCkt\u00188\"3\b\u000eN&D6c$\u000e\u0005%[884\u0012(E\\5~lѩxa'=\u001dh\u0011\u0005\u001fÌ[\u0012dq*Rw8\u0014ͼ2؜h\u001c\"\u0017Jj6VbàE\u0011遻h\u0005se\"\u001aX*J\u001eG\u0000}8$4VM\u0019G--P\r7!\u0006l]Bp\u0015\u001cjj9zd/\u001cՌTQ\u0002ɑ|\u001bW+XI-r/rq\r#\u0015O=᝝N[NJt+7%%6ே`XNkLb*߇lZDґ\u0000TTt\u0018\"\u0014\u0013\"8ɠbWdRvN4i.q)=\u0015\u001dɕj\rX\\\u001a1*\u0004\u0006Ez{\u0011\u0006dKO\u001d\u0002j\u001d\u001b\u001a6T\u001a$\u0013ZR쁽 \u0003KL6R\u001aZMMM֧v\u0017>I=c\"\u0012\nsI2k'i9\u00061\"QneBZ\u0003\u001b\u0016`Su94\u0002Nԥ,>JzQ\u000e\u000b3Nn\u000fPZTZ@3rx\u00036{h\u00101\u001ekG;\u001b3;}Q\u001e3dhnL\u0015&Vn]֩x\t)3KU-5Nwh˝T%k\u0015Q&\r\"may\u001a貺\u0017tkəg\u001d5Օ;>׆}8гC_,r\bSɜ29C~ 8|%❮\u0011ps)Sji>\u0004\bP24\u001cӛb 5ypC}n\u0019b,Ѣ\u0017\u000e2L{Lrϳ!\n+\u0010Ԧ)V\u000f\u0010\u0006ر\"\u0011\u0015k4N\u0006Ț\t\u0007U>\\L:\u0015I\n\u0016~~\u0003j9\u001advS\u0006\u0019a:5\u000f6\nfd2[J@StxL\u0015\u000b4Z&#D{l\"0\u0004\u0016٠\u0012\u0002^\u0016\u001c\u0002d\u0000\u0006@0g mgh^2X3\u0002\u001d3\r\\gDD-i\u001b\rJ\u001a;yƫ\fS\u0015Ե@\u0006\u0000\u0000\u0000Mq\"X]0\u001cš\u0015H\u0013.PKf r-9.ft\\\u000e1܊G\u0013\u0014E<W$S4rXʹÊ%ǱԚ\u0012RͲ\u0012\u000e3kJeb\u001c\u001e,\u0012ZPۨ@}\u001fꈚN\u0011*\u001fl\u0003DʦO\u0000q@8\u0010)B!\u0011PQ1Z\u0019`c?\u0007\feL35V5\u001c\\_4\u0007l,bV6[\u00178k\u0006\u0003\u0019b!\u0004;\u0017@\r2qۆ}\u0018\u000e@\u000e.\u0002\u0015˅y\u001a:=rQ(H\u0002ˍ\n*\u0016˅,<-\r\u000ey\u001c\u0001;/ǈ/aAu\u001eR̒``*($#jA}\u001eđjd.G#ZNDSs}Wˉ\be^\nz\u0012\u0018f dhX\u0001\\EC3^\u0015c\u0010\\,\u001a7\u0001rSu\u00164elh-Os:c2\u0018f\u001bjp\tiSN-]\u0015l7g0\u000f\u0010A\u000b\u0010|\u000f\u0010>\u001f\u0014C\u0017#\u000fzO}C>\u0007H~?ȏBco\"\u0011}W@s7H\b f\t\n\u00147\u001eNO\u0004\u001d\t}P?ؓt:\u000f}]o\u00035{\u001b}xA]I\u0012nG@BE\u0017̨c\u001f\u0019\u0000\b\u0000\u0010\u0000\u0018Ҥ\u0001Q\u000e\u0013X`\u0016\u000eH0(\n(a\u0010a\u0018\b(\n\u0019\u00102\u000fߋfw{\\\u0018I\u001dE)\u0015~EX@!da\u0017\u001e\u0000\u0015Q\u0003]Fx\u0011=BIܷV~?[\"sX\u001a\u001c\bBbL\u0005\u0010j\u0003?vuw䥮ʸXc\u001b\u0015wGktP\u0015;({O\u000f@8\u0011%Hhe\\)\u000e\u0006/\u00018)w|{T\u0010\"Fv\u0015@6\u0014R'\u0004TZ\\z2rdV\nT\b8g%\fR*2]Us>')1=%3x\\7\tⳕ\\Km\u001ac|O2^w\u001e\u0013 sN\"e!c8_t\u0010s'\u0016§R\"A\u0000zbXr\u000e(n\u0011\u00132&'\f\n\u00056HŹ4p\u0005]\u001d\bT׸{ؗ5ME%\u0015\u0014\u0015##ZEN9h7u{S\r`LLV\u0003~\r\u0000\u0010hڃ-?K@Yq\u0015\"D\u0015Q\u001b|g\f@PCRM>sz\u0003&\"X-@\rR.:s\u001f[~?\fVf5-t\u0011Eo\"\u0002q\u001b!JT\u0012VC\":;#*ec&h\u0011RO.W\"\u0001zY@,{֮H\u0001\r\u0012#G(\u0010\u0014I(.EChF\u0000\u0013Cө:bfڝ!\u0007Lc\u000f\"\f凤S\u000bK+۞K\u0011\u001e7[\u001f?9RcRbZBN\u0012v'\u000f(\u000bŇ7KVl\u00186\u0015:=P+\u0018ꄆ\u0011\u0001ZJLg\tD΅\u0004&|L\b=5W+ &X#\u001f\u001c\n\u001ePcb+\u001b$2;dd\u000bgtyc\u000ePUbNj2D1,$+5pbۢ٨\b#ߚZ\\\u0012>4r\u000ehmR{o!\u0000\u000bn6 OE\u0011X\u0015{l\u0017ma\u00151{\u0000(S/ZU|\u0010F\u0012\u001eܽ\u0016r6iw.|S0/c`O\u0003\u0015AR7\u0002\rD\u0012t\u00012\u001e*Mi$\u0004n8\u00056\u000e-Lٌl\u0016}}cdR1ʀ\u00181v\u0015(\u001c\u0018\"P\u0006%[X)>\u000b\u000bǝFWT\u000e\u00198ax<8;\u0018v8S>Vt|\r\u0018\u0013\u001eӄZ;i$\"\u0015D U>L0>7/\fz5tkS!x\u0018\u0003s\u0015)\u0019B\u0018i\u0012-A\u0011\u0017B\u0005hU|6\u0002`\u001a{\u0014ĉwu\"qd\r[6R(\u001aK S, W1bRDnh'uۣ\u0014͏7\u0011t?aX7U\u0019ʙDS\f\u0018Vmp\u000esi'BE\u0007{\u0018V\u0014?٭5\u0014\u0010uhێmb\".;\u0002\u000bA7I,3{(Fƀ\u000fғޅeO)\u0000\u0006|2ib\ba{HX\u001f7ف.Qt\u0002⚪\u0004OT6=\u0012as\u0017\u0013\u0010$o?\u0017\u0007=N\u0015$F'\u001cj0\u000bRi6\u0016۳x0\u0004\u0017F3DQ|gΰ\u0006'[UEDS1\u0015\u0006/V\u0018J9q \u00140tW\u0016gL25f\u0012[bfpʪ8 cQ%\u0005#gd^S\u0015YRz\u000bE\n\u0018s\u0018Iɼ\u0001q\u000b\u0017\bޔF0!\u001d\u001d\u0010y \u00057x?\u0011\u0016&\u0004qHӖ\u001e\u0010\t:W\u000bN;Vw5S\u0001\u0015A\u001d\u000fel1e'Dxj\b\b\u000fׇŝ\u000f\u0016{\u0000\u0005#2Z@ F{%\u0019\u0015C˶aDW1i-C&˺*=Wa+f7\u00135-F \b\u0012]Dڜ\bņ(_\"\u001d\f>_|~!͖\u0011\u001f*\"Tč0QlD T<v\u0004UUj=\u001fF\f^RI S\\bK\\J$!)Q(O\u0006+\u0012EEj\u0019,C-PSҢ+\u0016\u00101iXKn|7V!FW*[4M\u0019Yf\u001bi4\u0017]2=[i\u0006\u0000`G\tY\fmJxJ.<\\\u0018\u0011<hd:&F%1!hd\u0002#.l\u0013\u0019\u001e>EE7'ct>v\u000bF\u000bEy\u0011\u001ay\u001e\fe6G>!Л\u0002!};̆h}rM\u0005ߵ\u0012\u0001\u0003x}\u0011\nAc8TqZB\rXTy\u001eW%\u001e\u0001M\u0018~bz\bH\u0019|ȘL+FlY\u0016,v+6\byQ6r>1Fڀ\u001c\u0018\u0010\u001cf378wqЙ\u0005Lo\nl^8U\u000e\u001fb^a\u0015K\u0012RM\u0019#jT\u001e1\u0001gQ&uŧJ\u0018f\u0016\\G5f\b\u000eWJ\u0001\b\u0011X^\u0016\u0013e\u000b\u0010Ȁ/RAEVb!\u0016Jh(PO-\u001eZ\u0014WԊ\u0001U)\u000e3G,\u0004\u0012*\u00145H\u0015\u0005A`\ba<ec#X7H\u0018q8i\u001eIb!\u0017\u0014֎+\r]!t`\u0019\u0002$\u0002\u0011\u001ae3ZTXP\u0010Y0z\\St'+\u0002C\u001a9rP4e\u0013P(L\tE?[L;4GT+#n{;=\bczCkDeu,qT-[[\u00001\u0000v0H\u0018[9H\u0003L)l>q~'}\u0005Fޅ\"\bAoE<\u0006 4hS飀9\u0018Nn\f\\d\\\u0016f\u0003\u0016?\u000f6\u000ek^EGL,\u0005-J\u001eb\u0011Dt!L|GŹ\u000bÊ\rb\u0007Zl\u0014Úds\u0004\u0017\u001eF\u0017[\\A0#Fa\u0002\u0018\"w\u0014091\u0007P%`^X_}\u0019㛞\u0007BtEc1/M\u0001\u0006/ȶQQuZ\u0010\u0014pߚ\u0018%t{}$~nݠNe\u0018rG(;(0ፃ\u0018w]\\\u0007v\u001d\u0001_\u0010:v(u\fb=8R6E9QQ,.žni\b0JH4b3N@hhCʀ$[\u0003q4T[,s\bk&Zd\u001aCq0h\r1ik .Zx\u0006]TbqIo3bqV%\u0014\u0015GF]勇i\u0006\u0018\u0011>#M^hA\u001b;19LV5\u0001wƥ\u0018\rDf=^j9\tƆeٕ\u0000g5ޓ#_N|\u000bt\u0003^E#;\u001aI;2p(*!ΪLբ\\E_\u00160B#8\u0010\u0015\f\f#px8T\u0018c覈8\u0013_\u0011ݮփKQ\u0006`t'\u000eDڦ#v\u0018UZ\u0010\u001aǁ\u0015\rFCR\u0004Vŭt\u001e+3Qj\t\"\u0004#|m\u0014=\u0018H-\u000eD.;L?I\u0018As\u000eE\u001d\u0004nMF2FIUHΖLPR&9d\u0001h Ƀr-K)'F/\u0004QC\u0007g\u0001\u0018F(f*݋L4I#/h~I\u0001cF\u0000)>pKfѢoE;K\\a\u0005ٍ\u001bt\u001a_Ϊ\u000fmoǘw\u001f,{5ruS\u0011<F\u001a?n1&\u0002\u001d\u001c2鍍.NTJ~\u0017^S\fFVvg\" ~?GU1r+vUs\u000ew *J}/\u001cc\u0011rgb\r\u0001\u0018\u0005kF\u001fXM~*3\u000eD\u0017I@\u000blDq:=\u0015Z~$\u00197^6s\"/b$Thd\rƊXKHOf;i\nxrr\u001bު\fT\u000e\u0005\u000fW1\\q0>3.g\u0012\u0000W,\u0015; fVfD\rװ\u0011ehn]~pU\u001a.d\f\u000415t)~Urb42Ԥ5\u0014E\u0001g\u0001Y\u0001c\u00195X@Vfff\u0016AX=7\u0002\u0007c91\u0010k\u0000;{_;l\u0002/'\u0017M^]^r\u0005y+iXd\\ܷb,ۄaɴbZ]aaeiuU1XM-咩lfe)f3A%\u0013\u000byuEE@ie\\.U̥T.UU)\u0004Ie\u0002\b\u000e\u001cB\"\u0007PQ%SSQQH\u0002\u0003\u0006$\r$I)d(\u0003#\u0014\u0014#\u0018%%|_$\u0012\f }\u0003<AE\u001dǣQ\u0000\u0014ԓT,\u0016\u0003\u0018Fch|*:\u0015DDt\"\u0012E&&&\"iiiiiiIIII\t\u0000\u0000p\u000ep\u000e+\u001c\nyg\u0010a\u0002\u0017:3Ih+3$\b\u0013.ahŌɡ#-tHظ$J\u000e9'[pC\u0015+W܈\u0003I GL\u0011ף\n\"*r\f\u0001dnF\r\u001fAV̠\u0011w\u0004\t\u000f#\"F(1H!/~\u0000\u000b\"Ǉ,\u001e>~6\u0006\u000e\u001cY\u0011$^ѡ\u0005\t\u0018&+\u0012&V԰SU\u0011C\u0017D\b\u0013+mT\u0013(Xp-}Y'Po\b6)܆kVM\r!\u0006il\u0016ĚBj\u0006eF߲\u0017{\fT7m8Z!*vFU6ŭgk\u001cؠ)NBQi[tچ5hT*miJ_4\fjh\u0005\f\u001a8A/p@\u0001--B\u0019Z\u00051\u0007\u00102<8\u000b{F\u0016DCK ֠I\u0006Y\u0005\u001b\u001dM\u0018p\u0015{a\u001aǰok,u/T8\u0015g+\r6\u0015\u000b_soG\u000697w4>Zm.|\u0001v?@An7\u0017\u001cvn\u0003\n\u000erCn>(R7\u001fth#\\\r9\u0000k4xG\u0010`^\u0007\u001e=?8p\u00105\u0012\u0007\u0018hОo\u000b\tN ?4\u0004\rs\u0007P_Fv\u0018\u0005\u0006\u00022\u000f\"E\u0002m\u0012i\u0003m\bC7&\u001f?\u0010i˘YgޡCue\fSM\u0016-c.N7wytrO9y8ъ3\u0007J)g`¥.\u000b\u0018\u0018$aذi\n\u0019;4jְQBG\u000e]\u001a5Mʘ9.M\u00173\u0001III0)\u0015\u000e}BPӆ\u0011纶e_^}=߽==9?r麞msy){_vw_O\u001cӷn6=˶{m?]NqtL\u001fܻS˶-{۳]27m\u001ab8{z;\u0015᫯i\u000f1~&<}oK/Ӵھwν/mlǲskSv\u0003}L\u0001\u0000\u0012:\u0000\u0015\u0000\u0000\u0000\f\f%{\u0000\u0000\u0000x\u0014\rFX2fJ2$\u001e\u0004@0\u0010\u0006\u00010\u0018\b\u0000\u0000\u0000\u0000 \u0000\f\f\u0003X\u001eG9(\u0010\u0000\u001eo=_1b?7\r%0N}ؿ\u0005]F_Ka\u0001׮_ҕ\rn3\b.(!iGc=}>xc\u001b\u0015gLSu\u001ew&:\u0004$\u000eP\r/ȸ7B\n\u0001\u001f\u000b\u0004͞M{\u0003sԁpQ\u001f\u0010\u0016Ŷ\u0019g[C'^Ka%Tb\u0004܍oy\\\u0010}Oo6vJ\u000e\u0001\u0005F\u0010\u0017Oئ|m\u0019'\u0007ݗ0\u00168P~\u0017-\f̠SԓS\"^\u000e(3\bu*\fF]\u001d\u0016Ϥ\\Cm=u$#ߨT<p\u001188Ko􏍈t_G\u0014\"\u001dnЂ.>mH$:]\u0005\b/}O\u000fh\u00028V(_i0ۉQG\n\u0013mi\rY;\u0006撝X\u000fv\u0014`3}\u0002\u0004d(k\u0017aiDv#'&GUV][6\u0000~(O\u0010uٔR'\u0019\u000f\rK\u0003J\u0006Y`,l_H\u000f`!:WP\u0017pUtf&M7U|,8>~Ra\u0005U;\u0002ctX`\u0004e媑Іj|C\u0010T=[2\u0016aOJ\"\u0013\u001625H=\u00027 _!\u000ew\u0013ZCI^\u001a\u0007-\u0001R*\u0003iJ]\u0017\nȐ\u001a\u001f\u0010H|\u0002b\u001b\u0010CCDsu4\u00049D3L\u0003/,TG0\u0003aJ-\b?D\u0002rM`ߛ8\u0018r\u0003c\u0015`aA>.\u001b1$\u0002\u0016EtNoP5?z҅2\u0013&+K\u0002Q\\.\fj\u0015\u0002!]aۘ`)'ŵMpJ8.\r[\\\u0005GMТ0] $M`:;]*\u0000%x^C\u0006wLU\u001fH\u0015\u0007\u0018%(V,5\nR=\u0000p*LbFS\u0011oĀn]=Ab +a\u000e?1En\f)\u001e(l2r߰`j܇\u0018٥H\t\"Fn\u0006f\u00056\u0004R#e]\u0017ZUtyu!M6Sк\u0003J$آz&\u0001\u0012\u0017(^4.~\n\u00186V:P\u0003$`n1[A\nJ\u000e*uɨ\u0003*\u0007\tt\u0013nSzJq=*Bb\u0013\u001e:\u001e9.إ$\u000f&[\u0007];ŵ\tȡȺDjW\u001f3u_<aJ#\u0010(n\u0017@DFgJ \\\u001bD^\u00157ӎ{Ѫ}\u0002a\u0013Y}\t\u000f$\u0014&:K\u0003nE\"\u0015O\"s&\u001f\u0017/\u000fbq\u0003=\u0010sSE`>\u0019\u0002\b\t_R?\u0012o/_CFx\u001cܛEQ1Zahd$S\u0007\b\u00015%I]Aɪ\r\"\u000fTU\u0004\u0011Y\u0014\u0016\u0011\u0016\u0011BM=QH\u0016{%\u0010>bQ!$\u0004Z\u0018BwWO֨Wg$j>Z#A,J@\u0006s*&/}\u001a>!dE2\u000e* \u000bxDaH8sea^S8&\u0010,\u0003z~<B('bK\u0002 @H\u000b#BI\u001e\u001e\f;\u000f\u0002\u001cU\u0000O#GZnvd\u0015r\u001e\u001d`Q\u0018Itk+<\r'U[\u001ab\f\u0014>R\u000e(\u0011@'$iB<5h\u0000W\u0005t@(\u0010\"x`zމ\r (@g+L\f?\u0007u8\u0017-l*\nbM{ٺ|l&\u000eL%s4@fK\u0019\u000fd\u0017é\u0010 (.ɓēX5\u0005\u0004#ӵ?\u0001¸$\u000eC*S\u0001G\b:\bh\u000b\\\" c\u000b\u0002uW\rRk$ar\b/R3\r\u0010W\u0007]߂R4*{ F!;{p1($\f͏x\u0002H\u001a\u0005?\u0016\u0007\u00016\u0011\\\u0014\u001a|H՞\u001bj)\u0001Zfq>5<\u0016J\u001aJv6|\u001a4E2\n\u0005򡚕\u0010\u0007,;2R'KV+A\u0014\u0010\u0000EC\f*5\u0003%\u0010Ip&6:_\u0000\u001f\b⁩F\\\u001eb2U5\u0005ڤ\u000e\u0002\u000eY\"\u000fQ?ǲȮ\u0012H#T݉X\bZ=\n\u0015`!MU`@\u0001\u001dcb\u0000*ɩ\u001dx\u0015\u0016\u001c%yU\u0013dxY<\u0001KC-;s)@qB2\u001eۙIĎt\u000f\u0010TAk\u0005\u0001\t>+N聿B\u0017\u001a0DУ\u001fH\n\u0013}3DH\u0003$pfpe*|\u0005qh?\u0001\u001aH>\u00137\u000em-\u000b\n3\u0000\u0005(֙ W\u0014\u000f6Hψg\u000e8Z=Mj\u001e\u0010\nX=\u0016\r\n8\u0004\u001aDg\u0007xu2DmժG\u0002Q0O/\u0010\u0015b\u0016kr?Y?0B\u0004\u001aA;(\u0013ܢ\u000e\u0004cFf\\,p\u001b71T\u0001 ,\b\"Ck~/Ҍ\u0019f^R4%C^\\-cJ\u0003\u001aLxЙsC\u0007\\\u000em8\b3*0\u0016\u0013\u000e0v\u0019h\u001fӬ\u0017E\u0014oBb\fJeu@\u0016\"\n3Q\u0002w\u0007\u001b]tv0\u001aSY\f\nK\u000e%Y\u001cޠ,\u0001\u0002pY\u0007\u001f\u0010k\u0019AW\u000e\u001d:(\u0016z?P&$h\u00167oXx\u0018\u0002\u001d\\A\u0007+q\u0012\u0014\u001dhA\u000f\u00015\"đT=IWTuVmFF(U{\u0001#P\u0016J[u@s\u000bc&mA\u0014vw8h#)\u0014XI\u0000\u0014\\R>pa\u001duݾLUaR\u0000'%\u001do\u001eK!XYr\u001b2a,*dP0I\u0010䁱AȜ\rp\u000bQufX[.\fXA5'ubX-NzL.h+\u0010P\r6C\u0015\u0007Ât/\u001fXp;~&~\n\u001c\u001f\u0014\u0010\u0015׺\u0014\u0013\u0011F\n\u0002\u0003ig\b\u001b|\f|qP\u00036}\u0010H\u0014M;]\u0006@@[pC\u0013Q;7'\u00033\u0011bI5PʢyY,F̑Q\u001e\u0000#ٗᯋB܃<\u0014A1m\tYG\bH2vɋ\\\u0005\u000b}U`\u0019%\u0006EF\f\r$\u000baR\nu2\t\u000b2$xM\u0015^#\\\u0005y2f\u0016Y˰:\u0011\u0015HI\"\byA\u0013#\r}\u001eП\u001d0d~A#NI\u0016ǋ\u0015,M5l\u0012@.\u0011q1\u001eAH\u001dރ\bxƶTrŁ\n{@m\u0015\ny?FL=L \u001c)\u000b\u0011B\u0006\u0004EX\u0004\u0010=&cT0:ɤ'\u0016f\u0004C\u0006.\f;\u0011\\(\u000b\u0002#\u00195ȋY h2%\u0011%7b*8ݣ-\u001e\u0002[u$C\u001f\u0010\u0007.m\"@@߶Q8Kl@ݩ}\u0011(J؉P?A(b\u0006\u00177#\n+V73\u0000ȊS0\u0018q\u0007nX\u0013dmG]\u0014Ko\u0019ǂ\u0007Dɑ\u001d}\u0014偃\u0017?\n\u0010(I1\\jcaӉ\nr$0\u0002\u0010Lk\u000eq1p$a$!xCƪj\u0018PLi d,K13\u0018/\u0001JR\\ӿB\u001a[rsW(\u0013Y\u001abE\u001ak\u0005\u0007(:H7]\u0013!p}H\tgBd!b\u0016\u0017Y\u001dT`;\u001bV̀6cH`\rFu\u0014\u0003\n#4\\_\u0004\u0012AԾ54\u0019\u0018F0!\u001a`d/A\u0014ځf\u0011a<\u0002\u0002S%`Xt@\u0001xrNh|TzJh\u0018PK\\Iɇk\u0019k>S8\u0004\r\u00016A~N#q?$\t.\u0011\n\nDʑ\u0001T<\u0013;ưE5\u0001'\u0019i0J%^w$'ȇ\u001dC\u0003Py 2甒y;(D\u0010!k\u001ecL\u0019IH\u0003w\u001f$\\e5[\u0010J`V\u0002R:dZ;#\bU 4\fZ<8\u000e\u0011<LCW1\u0005L`\u000f;纠\u0017\u0007\u0013En\u001a0*c\u0000\u001cƺ\u0011l#\nJ\rM,\u0006o\u0001L\u001b\u0014\u0005+}+8QrJf\u0005\u0010qP0;\u0013@$W9p\\0aJa)%#H!\u001f=`86lmEc%ʏXA\u0012B^^ʅ@w\u000b\u0001B?EF\u0001>#\u001d.#ppk\u0006<0\\I3\u00134ƇƷu\bÒ\u0004\u0016YZ\b?=x\u0010\u00034\u001amV\nݓj\u0000\u0001eGǌD1\u001c'\u0003p@ӱz<[&a-E\u0001;B\b[xXҋ\u0000J\t\\t,\u0004\fV\u0002va\t\u0002Yo\u0012HSXW:\u0002\u001b\u0002\u0003+G2B#Yi.\u0012=Bt\u0000\u0001$\u0012\u001f4:$!\u0012K$s伂A3oM#\u001b3Bқ(L\t\u0011\bW9\t%\u0006~S\u0017Bc\u0000!G-}\"\u001b\u0012k\u0013m\n5BW\u001dU\u0012'4u>?\u000b\u001d\u000e\u001ccǫ[tn\u0014DE8\u0012\u0001\u0004L=\u001as\túapٞ\u0018xrϊ\u0000*K\"LrO\u000f\u000bI\u0018j$U_p\u0004s\u001b%\u0018\"#~\u0004{e,%xS(t\t|5)[M!\u0018{JS\tg%|0g\u0007a#q\u0012\u0015rv\u001c/xw,t2\\ݓ.ݶ:M@aB\bY#\u0005TadU\u00113Be\u0001e\u0018\u0002\u00167\u0002\u00130\u00026惍\u0014\t]\f\r~/\bBol]\u0004w]\r2/\u0007\u0016_\bо7\"i/GyYEV\u0002ԅ_\u0019\"7\u0007X3\u0017O\u00118-d K׷\u0000g\u0005zx\u0016wTA1wn_yQը. \u0017yеZ)}\u0013Da?OX\u001bJ\u0003\fO<A\t +$&Nt?\\u}Ѭ\u0003\u0002F\u0016ݾ\u0017\u0003w\u0016:(C^ۅrP\nxƈ\u0013\u0016.P3Xp\ni$P\u0000\u001bBU\u0014$>\u0017a\nrv\u000719\"\u0018ڔt=Y\fdX/\u000500\u0015x[k[\fʗ&ۃQ\u0018\u0017`L\u0000$>4n\u0007BBlϿba[!\u001b&乶-X\u0011\u0010\u0018+v\n^\f\rM|\fM\u00056s\u001aCB9Hc0c$nt\u0013)6vYmK2f\u0016\u0015H6\f}mWs6a\u001f|r~6>o2>5r,L\u001f\u001b\u0006En$$\rz=<-Y{7[%\u0007\u001f \rKjm\u0005!\"5\f\u000e f\u0005*ӷ\u0018m/\u001c߮\t'\u0006\b>\u0006\f`@ZhFE5f\u0013b2\u0004PΎR\u000fV\u0006h\u00012\u0015UζaM?4ty?,pL<3@)RU\u0017\u000eMXk\"\u0006>8,n\u000fF<˱\u0000QvV\u0001m=2MvJީgSfG萀VRf@/\u000b.\fǪkpvsH\u0015h\u00192nCӜt^P16\u0012\\\u001c\t\u0017\u00139`eכ\u001e\\I\tjO]\t\u0002\u001bN\u0018ӱy\u0007\u0012B\u0003͊m\u000eԕ`PwaO\u0019$\u0001\bt\u0007*d3@|KH'6N\u0004DơVϸ`;\u0006~G7\u001f1Aw\u0012\u001dX&vh?{׎d\u00034\u000fMGƒHV\u000elik0\u0000VVYg\u0013\"\u0007\u001aTŰo\rѨv\u0017-NqY}V|s?Έ\u0000]\\;{w\u0019\r+MHQk(+\u0012\u000etXmJY\u0014T\u0018Am(:ᝂ\ti:  ݳi\u0019ٜ\u0011Y}zɍ\rףC|\u0000\b\u0006/,>Go2&jP6X[\"\u001d\u0000B\u0018\u0010L\u0000S\u0002\u0018m\u0013˝%7OC\u0000+ՀӘ(A\tp\f\u001e<\u001b;;;[JxOUp\f\u0000\u0000\u0000U;\u00012FUmP0rs\u0004hY\u0018ncXVvʰnw߮bp[\u001d.w=n[eY\u000ecU_ﺱwV{\u0017f߶ᯊwwUqgưWy/X\u0000;qlG_7%\u0014\u000b\u001d,aڕ{ܿmS\u0014\r{7gyNf\u0015\u000b\u0000\u0015I4\u0004FS\u0017\u0017=CA\u0003\u0012\u001c\nV$\u001c\"\"\\P\u000b&\u0017j籤\u0005ЄB\u0012\u0019\u0011֭\u0019-$\u0014-ŊfQ\u0017\u0012\\K/*>L/;Ǉ\u001dO5˩F\u0011\u0003\u0010]Se!\u001b\u0003\u0004\fܖ^T\n\u0014|1hd%\u001aŐ 0j\u0012N\u0018J4f4%%+`\u001d#D[YK.%\u0001xi\u001eM.Xc8vn󘌦!ՎVOs=!V\u001a\nwZY\u0018Uf\u0005yr\u0002*t\u001cOONPL~z<;?`\u0003A~\bAގ\n\u000b\u0010E΅\u0006B@\u001do\u0003\b9 ]S{\u0000nB$ۧy~%g\u001b3&Ԏ\u000e 0nIj3\u0016&\u001d\u0005޴v;Rd\u0006nΧ\u0018\u0005o5\u001f8R@\u0002\u0005E\u0011\u000f\n>IE\u001eD \n<!sT34zϴ*\u001b\u001aX\\kVl6 zCGS\u000bVΎH\"HZYNL\u0019\u000bhh;(\b:_g\u001aV3G\u0010024 `bj fjhf401\u0010\"hc<\u001451EF&Y,\u001cmd$x\u0004\u0011Ӂ4 ]5.6IbQ\u0004QhS\u0014E$&/\u001c\u0011Iː(b,\"`\t͇\ta@LH\u0016I\"情\u0006d\u0012\u000f!\t\u000f@\r\u001b\u001cD˒Ź\u0014ޤh\tjqy\u0019\u0002\r\u001c\u0017\u001e憥Psb\u0010\u0010dR!hl\u0011<SA\u001fߎsgǙ3xr8&?=O\u001fKK3C\nKӤKQix'2<uПs\u0000P@\u001fs\u001a \b\u0000\u0000\u0000D$\b\u0010(\u001e\u0014\r\u0016\u001a\u00158%\u0015\u001e\u0018\u000e\r\u000faax$\n\u0005p \u0014\fA\u0010EQ\u0010\u001cHL\u0007Zޏ\u000b\u0016\u0006eEh܏⯁1ل\u0018\u001f9=\u0002w)?\bV?`\"գO12qm\u0004tR2}zד#^#$#\u001dt\u0013&^\u0019g7OPD\\r\u0017?\u0019/\u001fi-\u0000a%wVb:\u001fyV\u001dDb=-/\bzѸ6^!m#§\u000e[Z}~2;nPQ{\u0016<H\u0005QT9chc;Y\u0015\u0011o\u000b\u0012)ym\u0018\u000f\u001b*\u001e!$5d.NJ;7bu*^\u001dn\u0002zU\bKx|Φ$wV\n,OqOg\u0000\u0007\u0011O\u0003CG?0RD\r+\u0001j+jT\u0006\u001e\u000b,WE%Y'JMHNɉ\u0012TY/D{`ne̞5sz\u001c$Ǵ*\u001a~l\n9%\u00055K|Vi#\u001dqQ(>\u001235\u0010\f\u0000\u0007\u0005\u0004\u0018yP=L:\u000ba_ \u0002?\u0002n\n\u0014+]쑛\u0019au\u0014?\u001dG]ʒńԘ\u001aO$שͨ] )H3)pMO^Fwx\u0015h1B\u000f$7B*Խ*c/\u0018a9 ߔ{H&IYR\u000f){\u0004<H\u0011\u001e\u001eJ]\u0001\u000fa\u0019k\u0012d^ez8yd:Fg1Ц\u000bxLg\u0001أ*\u001e<\u00113~_l\u00182\u001dz\u001bQ\u0004D\u0019fOsе'\b\t'/c$6\n\u001ct\u0004EGEάvR0\u0007G96𢖌,ysxk1RBc|2E9\u000erT>{5nC\u0006\u001e[ހEo?\u001a.R-\u000fD\u0015\u0018G#HĽ\u001fu\u000e4Y8\u0013H\u000fU\u00187u!\b\u001c\u0017-\u000b콯\t\u001c﹏K<f25?\u0001 \u000b9EqO!K8hH\u001b$u1oI>\u000b\u0001v(t\u0004OēCh\u000bd\u0019b\u000e;'\u0005|y3\u0019K˚l;{\u0015?H\u0006⓮\u000e^)\u0004o\u0005Aq\b\u0017Ag.$j*O\fQcl+m/\u000bOϓ\u000fU6/C\u0012/y[Q}\u0013>\u000bw$|51\u00065Qf\\Ozk==\u0002\tqp|X @\u001c̋Gvuɾp6(\u000bDt\\<\u000fsus^UAZL\u0012c\td\u001d\u0003\u0011m\u0015\u001fʒތK\u001c]YȠɝE0_:U\fpueO\u0012dv\u0013\u001c':H~?@p;A],\u0016A=\u0005\r=6_ӕ%:,\n&\b\u0018kEBo&y۰kt\b2ZzWn\u001f$\u0016+.v5'%xó\u0001x4\u001dy\u0013A0L)\u0018cU\bܶ\u0001·\u001eyZn·\u0015K\u0004l!|)\bw\u0015yFTZN%\u0016ԙ\fZR$&|!P~k)*o&VA/8|\u001br\u0003\u0012iJ;s\u001fJZ$\r1$i\u0017\u001b0هGce;/\u0012QA\u0018=YZE\u001aG~a\u0018\u0000tJ1\u000f[Hd\rƲ\u0005\u0002\bt\f-FB&\u0014n\u00001Y*v+Fl:\u0007\u001e\u001d&\u0016/dr 0\bLC\t\u001b\u0017/7\bDn$\u001f\u0002#\u001fy7U24\u001d\u0017\u0004\u001e\u0007\u001b\u0016E\u0004:W\u0014Mm_Gd\u0001'U6?6S)\u0005f\"Cx.\u001e\n_\u0010\b) \u0006Џh\u0005С\r!;\u001d\u0000k\u001c\u001e4\u0016oCrq0̋=\ta\u0003\u0013gGB\u0016\u0011\u000e\u000f\u0016Ju}{5aD'V3?h3cs8:\u000f,C)Km)\u00150\u0002\u0004Q\u00047\u0002Z\fk\txMwԴQ5\u0013^=F\u0012~\u001dnH%S\"%l|x\u001bF\u0003vMS-\u0010xJ@|Mto\fNET\r\u000e\u001f]\u0014\u000fˤ\tT\u000b~Yr\u000e\u0004&#uIP\u001ac\u001d0\u00044ty\u000b5\u0019\u0013c\u00132R\u0015\u001e]0sIފ+z5\u001c$קުKԝsy=Q5A΅\u000e\u001b\u0015\u000evn%EdZR\u0013ʄt\u000b\u0014ͣK&U)\u001dQ\u0016\u0006\u0011s@'K\u000f\u0000El;\u0018\b\u0010\u0007\u0014IKW@o\u0002N\u0007A=TeN?\u0003zϻ \u001aztn/\u0018B\u0007<<5Z0î\u0007-Lov\u0003.(M27\u000b>[\u001e0\r\u00004\u001fv΋o:\u0011̹i9DpG\\\u0006CT y';G+L\nS&\u0005\u000eT\u00026\u000f<a\u0005鉡};z!15<;ȴ?<9sde\u00025_p\u000b\u0011\u0005=xT\u0016<@~RH\u001crݠ{\u001d\u0006U`\u0007&m}j\"`NT.n2ߢ\r$y-w}6Z8xU\u0007\u001d\u0011\u001e\u0014N\rb\u0011u\n|*r\u000e\u000e{*0['\u000f\u0005{5}y{:\u0004c,\u0017\u001b\u0019?\"＠AN!K>\\؇nqJ4\u0018\r$P\u001c_zCeJ\u0019Ձ\t8\u0000ãc\u0004\u001b\\ɀ w%k6/_\u0010ĉ继\u0001'\n\u0018\u0003\rtX|U£rʿMؙox,\u0006E(噚B\u000f\r\b\u0001T.\u0015:6\u000b\u0005\u001a̜W.UrxL\njUMCwMfHj;>9&%^;~d6\u0003P\u000b+5 o\u0019?;1\u0014P|C\u000bzI9X*sLaפ`\u0013\\E^R\n\u0000-\u0007\u0007\u0007c\u0007b\u0007B=f`\u000bb\u0007צ\t\u000fp%<X!\\{Sz\u0006G˿+\r\u001fB3\u001e)Nj\u0004t8\tXՍvj5%z^:~Ƥ=\u0015tG_MLawFNՇ$3\bx<\u0014L3QAξb\u001e3Ɂs֪!9\t7\u0016\u0017Az:F1\u0007g9{mҍ\u00149=S^\u0004ׂʫr\u0015\b\u001fL_}%V:\u0007t\r\b/R\u001fTTI,N\u0003}8k|\u0007-s\u001b\u001b\u001e@\\3\u0011c$\u0007\u0015tQa\u0015BqmX\u001cXSC\u000f!\u001a\u0007:S=\u0015L/-{b\u0015t\u0015Eq\u000fE_)=v\u0003@.nI{\u001d%t=.s6\u0006s\f\u000eP\n\u0004\u000b\u0010ð\u000bS*\u0010\u0013a<@sY\\n;y\u0001{E6\u00065\u0016>9u\\\u001d4WG\u00114We\u0013*rjkWP;\u001c\u0002w/z?'㥲1\u0000t;y#rP\u000b\u001f= \t\u001a>ǉM;/\u0019jY\u0010Bbu0\u0018>*?&h.JWt\u001e\u000eTE~Ų:\u001eR\u0004\u001fr;y:?@r#O}'~=\u0015qAs[\u0016'r9P\u0012Gv#,F\u001aDx(3\u000f\u0019)Em\bo01kF\u0012cxK\u0017&x@JOdo߾\u0012w*h<GK+\u0006\u001b]嚪sQ|ξ `B+\u0007\u0014-\u0019~}%k\u001fS!w&D)>p\u0000v4cX1o3R\u0011\t\u001f[zSF`hnD{G*7\u0018\u0011xbJx]A@:0:+6\u001f'D)\u0003ǽg\u0012SY(\\sInJ\u0005$J\u0013(\u0012\u0017hC#e%M/Bj!|Y0R\u0007=\t̙Ȅ\tH\u00046%H`,\u0006Sy=\u001ffux4\u001aX4\u0011{K%z\u0004zA\u001fI\r\u0006.\u00136\u0016r|2?\u0015^\u0016PiTFRg\bx@v\"ȑ9\u0006ٻr6Xߎf*%۟n+]`\u001b\u0001uuo\r&:`\u0014o,6!v\"$Γ:\u0017s18,ȇdbG\u0005tFL\u0015\u0013Z\t\u0014=_@h?gkj[OޮLu\u0013T\\\"N;JM.x6-i\u0000Z:7Qhw)}:s\u0013a\u0013*l}\u000e^,?\u00175\u0015]ţc{\u0000E3\u0010&z\u001a;D:LE_\u0003\u0001\"Bqʞt?P4L;Tqq~\"!_\u00113O\u0010q\u0019I+4\u0013\u0003H\u0001#*H\u001e\r\u0002\u0000\u0010J^+\u0005Hf懶rV\t@oL!SbSgA9|\u0007lb$\u0011\u0013)\t\u0001\u0003,\u00021\u0002t\u0005͎ThKL4\u000b4!F\u0013\u000fp\u001aC単TnRT}]^شXVLәX*h\u001b\u001bJܣӄ_N͎Snj[6ґL2Dv+\u001e!\u001c1:9Slά\t4o9\u00194FS\u000fUr\u001d^;XLްky\u001d\u001aŗ<&Op&\u0007-\\ӊ9\\\u00171\u0013t,8uoٜĞLVIr\u0018H\u00110Cv<\u0016e!c#(\bD2\u0007MHER$\"h!8\f\u0011ّa㣤Sy¬ϟu\\dD䉩\u001122\u0011\u0011\u0010OD\u0007]\u001a\u0010\u001c1\\\u000e\u0011{!oa(ć\u000b\u0000h\u0001G\u0016\u001f.Z\u0000\u0005\f\u0010\u0010\u0010\u0017@|p\u0001\u0000\u0017 .ZxE\u000b\u0010\u0017-Z\u0001ㅋ b\u0001E\u00101`̐\u0001\"\u0004\u0017  6lؘ!c\b\u001aB bF\u00100@j\u0004\u0011È!b\u0014a\u0003F\u00190`ܠQD\u0010\u0002QC\u00192b\u0010\u00006\u0018\b#l||\u0004F\r\u001a5>>1\u00010\u00193l̰1\u0000Ԩqč\u001b\u0004h\u0000\u0003`\u0003\u0006`$\u00120)\b\u0006\u001cq\u00007\u0006pC\u0000\u0002#!\u0001\\\u0011H\u0000Id\u0013`v\u0001\u0010\u0004\u0006(\u0010\u0001\tD\u0000\u0002\u0001\u000f$I@\u0000\nd@`%*`\npb\u0003H,`\t%Dr8\u0006|M\\\u0007.`\u001a,c\u00029\r2Q\u0000\u001d\u001f\u0001\f\u0000\u0005& \u0005\u0004\u0000\u0004\u000f\\@\u0013Lhc\t@`\u0003\u001cX\"$\u0005\u0018\u001fz \u001dH\u001dx\u0000\u0012g@\u0011C\u0010D>ꠅ,`\bD\u0018\u0014-\u000ec\u0010\u0015h3\u0007\u0015Q(\u0001\u0013Lp`\u0013`\u00034\u0001\f \u0000\u0016U\u0013t\u0000\u0011\u0010A\ri\u0002\u000f\u0005-`\f \u001eЅ)N`\u0002!H\u0002\u0014!\u000epx\u0003\rFDr8(v\rm`\u001atD\u0016jH\u000e(\\\u0002\u0016\nT\u0014(C\u001e$;x\u0015S|$a\n)d\u0010\u0019HE\u0012J\bC\u0015q\u0002\u001cJ\u0000\u0007 \\\u0007+\u0017\bYa\fU,\u0007\u001e\rMh\u0002\u0013\u001bȰ&0\u0003>a\u000f{\u0015d\u0002\u0015 *ȃ\u0015wC\u001d04T\nuB\u0019HHHHx ABB\u0007\u000f\u0012\u0012\u001e=H \n*xPA\u0002*HHxDGIvX-\u001e_hgi\\VHRAhYDyu*l\u000eoB6KUN9Mw*WkFULUBڮ懇cYYO_5\u0014\u0015-gъS˺'b\b&xEN&A2eU8iBM\u001e3-2o/uU)9ч5\u0006^\u0010Nr=\"a\u0017wyVB\te\b-1Kޒ\u000eJ_.6))?VBh4SiT)K&4MQY:-q&X򕴣\"\u001aTHYyg7cGw/;\u001elI3W\u0013ј\u001dm\u00138e:GT|MŹ\u000eղU16ueOdsE1cV7B;jGcV}\u000e{g^٦Zvy\u001aO&\u000eѕb+CUڳFK-N+eWUSm^O{\u001eŮxyc\u000b3x&\u0017>'z&Byc\u0017\u001aCʻUv{9ug[/iJ=w\u0015Zg\u0015\u0012\u0015*jjWN+۪,u\bEtVġ\u0010/\t7C8mALg\u001a׳<2O|4,$̒ƪfʆ&ر1K`y寲磩ç\u000bQLE«4)88{t\u0016x|w\u0015ޕ]7ggYݘ~Bj%\u001eKe\u0017I8%ЩJx&B}UeCUȬGxSrGsy$Ĝy>\u0014\u0007ؚ,m4\u001e\fQ֥\u0013i-Yeg8S_5ICDH!dM/D\u0017Y\u001aRNy.6ѬWed uheUuٖMY\\uu4ZuRIq+6gV~<O!hbMoUyb&\u0016\u000bMLMJ˫B#,5Ȋvfsw펆i]6srhH*68h\u001373ձ\u001cmRҵ\u0016Js[<N\u0004Gw^I-\u0010S0mЃgt-ٱnI\u0005{#*5PҍZY:v}:I\u0016ky2񔳜ݳߘ%ӰlҜKM(`\f\u001a#G!#N>\"PUb?L9:Xt\\Z}9tryTuDO095G\u0015L\u0010VMn<9S2'cW'5CK\u00012h$1ͽY62-Tgz֩=-0>~\u0003\u000b4ڷԎIǗiÎyJ}s,5k<ux'ٓ*BybD70fJ\u0012]\u0016L^=\u0005lUɤr\u001fU=\u0010_4Y6tfVcS.\u0014?*UB\u0011\u0011N\u001atS>Wf\u000fvJ(ko5jbC*]J{=VxI\u001a,vnfTx,6I=[Xx9/f6\u0016]R+%+[2\\v\f\u001c_!^kXVbh\u000bwKU?4\u000bx׽L(\r5;ViMTZ'fKZr1YȪuJRZ6Ul#%\u001e\u0011Z}fn2\u000el/++Bb}6wA,vCLCkIX579Q\u0006uhEs8\u001ez3&f\r~N[xCWW\u0010t}gSw*sVg~o讌\u0006nXY\b\u0010\u001de)5ٌ]7w:V{r;/Cp6X-\u001c ͡nU\u0001\u0011\u00121\nB\u0014#\r \u00003\u0015@\u0000\u0000 \f\t\u0001-\u0004\u0000\u0004\u0010\u0003\u0014\u0000\u0007Z(BD$\u000eB(,\u0014@\fB\u0001\f@\u0001\b0\u0010P\u0014ȑ,\u00034YL\u0014S9w\u000b+F\u0010\r{5\r\\\\,\u0011\"S\"6q0ʆѵ)@xiî@>jKnu\u0018\u0007VQ\u000bnL9ǘ2͗tw\"#|fjqt;}ExVGM1.wL\u0013j\u001db\u0003ub{>\u0015S;\u00022џ&Aem/_\u0016;b>\u001a\u00166c^\u00078qЁxE@c-x\\R.\u0011\u001e\u0000!{W\"3ޗ\u0018\u0001$\u0017Aq@4$\t\\.^tW=f\u0011e\u001dk\u0002hf?\t\u0000ǘP\u000f\u0004gJ x=.\u0001t㵯8qUܖR٨vn\u0007~,G:Hs\u0002J\n\u001e9'#XݮynB>\u0015HW2֌U\u0006\"wmP\u0006apwĴ~D\u0010dk8+τbIJ\u0000ďqrP[ȓ#Y\u0014꿉HW\u001e\u001d<\u00198{2Ɯ刈\u001b~FRUƔсDWe8Tv\n~@\u000e\"\u00199\u0019 3(mB\u0010yd+..[/L\u001cq$~\u001f\u000b\u0014%dbl\u0006j?bz\rw$q\u0013\u001dJ1`\u0015\u0002p\r5%.ǕkGs7.#F`\u0000ՎPQ\u000bPb\u001fZ^\u0007{@Yg\"><i0F\u0016\u0015\u0016G,,E7rSpy\u001cyYj+P8Hm\\<VRpUqyuTC\fm -\u0007lߺ7dEY\n6\u001bFw\u00060\u0003c3h{\u0002-!bnAJ\u0013UFa:ǵ\u000ffq!%鑴VGq\u001e^\n\n-\u0003t\u0014X\u001es~\t?\u0001Qk_|nZ)\u0005CE\u001d\u0004#\u0017J؊&\u001bMv\u0016Py\u001c?}\tĊE7v,Fb\u001245cpC9/\u000b#Q\u0000po]\\<\u0000\u0013m,ű\\\u0013J<%B\bl-?ݯ\\r\n 0hESo8Bs\u0007\u0002\u0014r\u0001\u0015_qq;j@ -7\u000fK>nv\u0002\u0016\u0012Eߌr #\u00141{\r/!0|3\u001d{g\u001b\u0012\u0000\u0010j`mY[X7\u001fO\u000bG;\f2]\u001b,)tV~0SvMO*\u001b\u000bx\u0013G:\":G\u0012+XH nrP\"\nvD(Wr'.~U,J/-VT#f~K\u0014\u0002\u0002C\u000f)kM\\Ni汋\u0001\"J\rz(i\u001f*?$t㰢LTL\u0016'jq?\u0012k?\u0003\u001cDֈR,\u001eܒ\u001eO\txJih1.\u0019(\u001b)\u0013Jse\u0000a\u000b%2jAqZ\u001dܨ\u0011a}6O\u000f\b:\u001er<<\u0002RI\u0016Ÿ\u0007w\f6)S\u0007[ħ'od,>\"86(d\\\\hg򇋕fIDˎ\fl\u0017V.dDab\u0017t:<˟s{\tt\u0007D}2۶H<2\u0000\u000fXۈ屽d׊߄k\u0019R\\(7}{`\u001aĢu:7`BQkNBS\u0003)QN#'ލuƮ-8\u0018l޺[Lc\b@[<,\u0000i\u0014-f1T\u001bFNTcJ\u001d:\u0011(U\u0015k\\\u0014h\rJHw$\u0013\u0015E8?7\u000b\u0006Zړd@\f\u0016Ԛ]\u0019\u0018\u0013rН,\u0017Ko \u001a\"!RxOx@ޏ5Q]Os b-\u0003\u001aq$uG򺠚a\u0006\t\u0016\u001cW\u0006W\u0006oeRUՒAIv/D(w\u0005a=.\u0007]H߈7b߆\f\txb*S\u0011:sݭ|\u001cW\rY8HG\u0006VqlfsDxc,Sc0\u001e(=\n\u0006k\u0010\t\b_)#DpV{`\u0005\u0004\u0016L$\u0013\u0003Q\fz+x+\u0012\tSc2x6(qi_*\u0018ڍ!R\u0011\u0013^p\u0014\rGn\u0005qrJpD̄\u000f\" g]4\\\u001f\u0015fN~$\u001diZ-g\",Pe\u0005ضXl2.\u0012Y\u0012B]\u001f*8\u001c\u001aid\u001f\fd\u001e$%J\"\nx|F~\u00025%y%.rXbb\n!:i\u0010c1)ʍ\u0012\u0011quLfGK\u0016\"v\\8,jZv뚈\u0017\u001e\u0011\u00017EG\u0003DW\u0016npn,Ώ+u;a\u001cS84X7#dOvQ\r\u0007'[#\u001b^8hK\u0018W\"ʅd9\f-\u000bn\u0010b\u0011K)S\u0004nI~e<:\u0006\u0007\u0007\u0019H\fҕd}d\u0010нL*eL\u0016+`!MX+:r\u0019\u0002VJW\u0010\u0004z?\u0010\u0013aA|r\u0011h3nc[DiRD\u001a%\u0019R45DTES \u0018\u0001x=feХI^pc\u001e@\u0006AM%S\u001fš7\u0015pd(/\u000eqV7CĞ\f\u0011\u0019fH*\u0016wns!nө5MF4p\u0001QYT_dR2gx\u0004f2j¤\u001f\u0013\u0015\u0007ਰ\r\u0000=^(^BFunHG\u0010þ6z1\u0014+\u0002#\u0017֢\u0005Λ!20<M_#<\u0018\u0018m<I\u0014F/q\u0017\u0019b3oYt̳a\u001fc,x1^U'Q%;c\n\u0006M\"q5\u001a\u000eW3 \b)ʒ\u001dL\bV\u001ak\u0003\b(\u000b1ǂE \u0004\u0016A[\r0r$\"}_\u0010\u001cMazt\u000fVfE\u000f|c6eh|S\"h<5\u0007;,p@\">Us\u0015`ɇYL\u0014lJ\fP!\u0016\u0018cv)\n+BS\u001d\u0014;)\u0010xtf\u0001$\u001aGGS2\u0017he)(`X\r\u0014_GSyIQw,~)؉$8O*ۺIQg\u001dlj\u0007{\u001aDlu\u0000\n\n\u001c=/\u0012-\u001fӂD$$J\u000bbJ^5(Ȋ\u001aE\u0011\u001c岮R&\n\u0011x\u001dSɌ\u00029̈c\u00009,͔k\\\u00153zq.dU+1\u0011qj4p~f68F_\b\b5:\u0002Hʗm;\u000b\tR\u001eh \u0007@q\u0018j!\u000fh}(g߸Ə!bIreYcZjmb\u000e*l\u0002\u0007\u001c\u0015Cb:\u0005[QƬhs}dg gTBhu\u001c\u001f//`2F4Q\u001e7NECrY\u0014'k\u0000>}\u001fC\u001b=1NvD\u000f,kÍ\u001e\u0012YR;֍\u0004f\\B\r\u000f)<\u0000A?\u001dӮ鏕[ q\u000b5ʹTe_\u001d\u0018ml:UE4BT^4uPMDHL1\fGG˔5\u0006=\u001f\u0017\bddFbSLz`0>}#1=\u0014P˛\u0018ݨ\u0006yVmt\\'\u0001ڠjp\u001a\u0000\u001d@]z)|57sŘD4\t}kR\u00011z4#\u00030]\u0012qت\rR\u0015\u0001AO\r0گY;^D{h\u0015\u0017צs\u0014\u0002U\u001a\"\u0004N_0fL]]3NvY/: L!s\u0011f(u6\u0019Ƈ\u001b%c$6ha^\ttd' _jbńNM񫓻\u0007ߡIJ2Ը8Sx)bߜ\u0018,\\ISdd\\FZ\u000eSƅ\u0007$κJhL!S,E,f\u0016#H/Wؙ|SS\f\u0004ԢaqHl\b\u0013-C`3ɭbM0S$ki\u0013sk^j\\̀)LB\u0000\u001dmBrFQ(uS`\u0014[F)9<{\u0004Rfr~ϦKdg\u0010u%ӫX$`2juo=|\u00020\t\b(-Qi*\t+\"q\u001dCaqc\u001e6YKU:5Ԓ\u0017BsJAh@U5;h\u0014\u0007\u0012VfaA\"\u0016N\u001a_ɗ\"\u001fP,h\u0010\u0011~\u0003:+_V\u000f<;͕ϢMu\u0019ȞOTb\u000f\u0005 k>\u001fjI0/݂\u0019c<lnÆ\u0005V\u0016\u001a *Q\u000e:#\u001aC\tg\u001c\tn5]O)Qmg\u0003LT\u0000C\tC\u0005ADԂe9.Ѵ&dY((y`n\u000e[\rhz9֩IZ,\u0013.г;,CF-[&\u0011\b\u0003Y~\u001aS\u00047+/@9rh+۫\u0004+UqnT`Pの\"\u0006u\u00054-\u0014\u0010\u0015yPy=Hw\n\u0013u?C\u0012E\u0015\n\u000424\u0001Z\u001f\"ʯĥ5@E6p\u00159xyws#ǛR3\u001cD9L\u0013\u0005il\u001cst\u000eD\u0017\u001b[s\u0018\u001b@0Zie\u001f3\u000eF\rǋ&\"#\u000b޵aKP)\u001eP\u0014\u001eAv\u0003H1\u0013zAdT>6^_H>&]Y\u0000N$IO\tD\rT\r-M[\tL<\u001b+H49\u0003c\u0001N]\u0011\u001c7\u000e\u0018MG{\u00141M~\u0006e'\u000f1297ڙ\u001d\u0014Bv\u0004ؓIY)2Gi:\u0010ԉ6h\tN\u0015o KN|Yh5;#Ba\\dVC\u001d;'&x\u000f\u000f#R\u001a4HdcӴ\u0000t\u0011$\u001dA\tS[bB䢧Y\u0011\u0003%p;%BPn' KF\u0019$YgkiyɝAՉ\u0001!@))$uyb\u000f\u000fjM\\\u0012\u0011\u0013\u0011k.%\u001e1c3}^\u000b1R\n\"%\u0017ĤM^s\u000e\u0003zJxEKICG:1\u0001M\t;\u0006\u0016DŊ\u0013-H\u0002`RlL\u0003IRO\u0003n4Ĳ*\u0005=j\u0018,N!w\u0005\u0003C[0%B\u0003u\u001f{Qi\r0X0Fӣ,0|,a\r\u0011Y\u0005Jar\u0017^\u0018U\u0005\u001fk\u001au#\u00173_ Ɂ~\u0013\u0013y\tZ{N$\u0014\u0015>8\u0014s_͞\u000bH9A)D?Af,M6B[KbʼHf\u0000R5\tx^P%\u0010kW~0\u0019|(0$\u000fr=g2\u0006TsNn\u0005\u0018-*5,orS=;2\u0005XOV.b hA(\f\\Q񂐞\u00157]!o\u0013WKS\\\r\u001cHl<\u0006pD\u001c?[F\u0015&'\\\u001c\u0014Pn\u0015Y\u001aE\t\u001cC*8%A$\u0005\u001frs#IT۸)\u000bU\u00068a\n\u0004\u001fmo..\u0016g\u00027(MQ!:KϏ\u0013Wp1*|@\"\u0013ʋ\\z\u0007UD\u0012,@ҙ..:\u0016\u001a̯\u001e?z`+Eǣ'@G4ڳh\u0011\u0016\u0000\u0016!\b/h\tLї(!\u0007f\u000e,B>V\u0010\u0014~4B#CKĨ:Q$o\b\"\u001b#D{C\u0004/\u0005\u0013S$4r3<\t_(sc\b\u00147W\t{\t~\tEj'(_gĊ\tˆ\r7\u001dFv1${*5~%Æ.qT\f5q\u0017&N8\u0002\t\u000bÌ$\u0016Kq\u0015D\u0010G]C\u0013\u0017R@1]bCo6Ė\u001aߔc\u001a\u0019`\u0017*э3w5\u0005p+N I`85%\u0011QFK\nz/]x!\u0016\u001dV8\u0018\u0012\b3FL+\u0002ŖECD<\n\u0019\u0012<\rBWYI\u0000Wittg\u001e16\u001eѬ`I\n]\u0015$=^Y6p\u0010N/n2x(Ӵ\u0014h6CeꔊiP!#h9͉@TK\u001b\u0017\tV\u0013\n'air::YI疗<\t]rG\u0019\u0018x*>\u001a1#\b\"O@R0e;jȬw'2bD%{q`RK\u0011ADuA̐rCt;\u0000vr#>Ő\u0005;)\tcoHZbĆ!aȾ\u001ci1&\u0012:`\u0010\u0007xTTABt՟!&B\u0006M;\u0015\u0011-R?\u0005\u0012\u0014,\u0007)C0\u0000e\u000b&EHG*c7\u000b\u00036W^s\u0002\u000eo4#(IlGafP\\H\u000eڦS\u000bAqwSi\u0012xsUP\u000eWĵi󿆵Ô^tkf)\u0010\u0017\u000fs\n߃5 f}\u00134\f4M}fCh)[VFڈ}G`SR\u0011dߣ\\x\b+6F\u0000K3rlo4Bb)\u0010wJ0+ďzNE\u001b\u0006\u0004\"hBB%~4޼5H\u0007%\u001d\u0011?\u0002\u0002\u0015\u0004˞Z$-![nqI'SRd:B^!l}!*\u000b!G'il\u0012{0\tmFg4EP5}\u0006:}mM᧬C\t\u0002qCyx\u00079\u0017z7 \t\u0014p\u00077=\fTlʘ\"|y/3EF+ĳkFOWݡntb\r\u0011Z)ʦ0\u0007|\u001f)\u001f|DMԇfL\u001ep4Y\u0018XYZXD}sĸ\u0014cZPRgӌ\u0007d\u001eٖCh 9\u0012\u00029%M\u0019-Ϊ4:CF0\u0011sZ\u0014`\u0011D\u001c&R&wA@\u0007FY\u0016x;\u0011F\tS~i<pfc,57_[\f!\u000690MQ˱S\u0007hp\u000eN0ĻTZݹM\u001e:8k0\u0014<\u0003\u0017`MX\u001f(A8ai#\u000b\u0013a`\u001a\u0015\u0006X\u0002BN9>ưhgDZ\u0001&1l|j\u0013%\"(:K]\u001a\u00163΄ƥs:%`\u0011~ֿH\u0000Π\u00068r\b6D\u001eA.$0=\u0018yS/L||7om\u000bz\u000f#t#Q\u001e*\u0011\u0011WBb\u000f@L!\u0016v.0C$\u0001ASD\u0015tظċC\nYSc!cL$23#,E%ncBT$\u0005_r\u0017~\u0018\u001e\u0019S\u0004~|J[\u0011fSK,F\u001fo \u0006L%o0\u0010L\u0001R4Zz\b|\u0013ZIVe\u0016_a5&r0\u000fkv\u0017Jbg$&ɏҳY<ҋW0\u0006j{\u0015~\u0001\u0012o\u0000ZO\u001auMD\u0001\"m\u000eL盦dlXJNX\u0007y[a!P\u0017\u0000}\u0016\\|d-Fb\u001b0\nzds/1\u000bSurvbk5=9c\r=h\u00065XsM){9N\u00141Qsjߎۼ\bIye'gwr=`\u001c5<|fs\u0014=1#E\u0013ٲsGǚRF\u0013\\NI\u000eHnN;UUʟ \u0018̧Hţi\b5Vtd'R}yK*\u001fT\u0019 \u0011c_\"M(=a&jOyړSÌВ\u0017-,-cp\u0018|',o4ǁ\u0019F\"奃n)b[|5\r[\u00104\tX\nN$k\u0015u8?\u001ajW\r\tq\u0012\u0002{iV;\u0001*G<\u001bޠN\u000el`b\u0017?o\u0000ߴ|j\u0015\f~I\u001el~#q45{\u0018|3@\tK2eA1\u000bJ[9P}Y\u0014~VY)Xΰ4\u0005Z-:<lr\u001b9Q\"\u001cR\u000105%\u001bD1ߑKH*=gn-?\u000b֤<\rˮ\u0011\u0019룽iLX543Ci{ib\u0012~\u00065M(&4\u000b!(,\"2#궊_joKw5>\n!-\u001cC+Mp~F:\u001c'\u0001ݓ/Yt>/E;{MrԵV\u00017ws#\u001f\u0012\u001bnΣ\tû\rgEd(\"]۴79<˧ݐlln\u0001ۨ)yN7\u0019ym|7\u0003v\u00128T\u0007*tzHL/cݢ:[X]\u0017춓pɤX@Ҵş{=\u00157n ?t;\r\u0004\u0017Vu\t{a|TY\fY\u0016\u0017Jț\t\u0016J=[{gd\f\u0002>XlnA{H>O,ܱӱhF}aVI}0p\u000fD+\"Jڔk7K9D\u001b\u0013\u0004\u0014wz0@~H{\u0014a;\u001c7\b\"\u0004{Z97$p\u000b\nwۅtVVP\t\u001b#gmc䌞(ށ\u0015Ld5\u001dDAyeUR\u001938\u0016x-\u0003Qq\u0013\u0019>1k2h3\n\u0004\u0005~\t\u0007\u0012\r!\u0010WP8VB\u0003\u0005P1J)%ߔ@,\"Ng3\u0001'\r\t\rG\rQ`\u000fHDNA\u0006qK\u0016[\u0012\t2\n\u0019\u0005o\u001c)W>UkB\u0014!\u001bɢVjl)\u0014!n0 sYG&\u001c#Y9 4z\u0014C>52\t5Ql-k|I\u0019>\u0011{\u001b@\u001c^<!\u0015\u000f(\bO~(q=Q\u0011<\u0007W\u000eagS'\u000b\t:j&āHi\u0010\u0007󗦤4SP1֤T\f%j\u0013`jjEE,bpiݱ +>K\u0011*S\u00109W\\@\u0004\u0003\u001b!\u000e.V)CɇCmY>B\u0016O#\u001cY\f\nm8;x]\u00079$bECL@ჩ#^\f{X\u001b\u0011DBTx\t:C\u001cۣ^\"/HMc\u0014\u001e\u0001:)\u000f\u001c\t\u001dQ\u001fLBFv\\H\u001f\u0015V6T)\u00157\u0014jV_2@Ĥс)B!\u000ex(K4\u0007-*[|1~\u0015q<Dz\u0014ND)~i,\u0012-M>\u001cm)|\u0012s0#BΌ\u001c?ŭ:_#\u001e:I$tj#DR̷06ٵa|P\u0013E?w~.\u000fepUۆp!YUh\\2\u0014>#h℄5fbALPw0T\ru\u0013kDB:k՟\u0000ESZM\u001049\b\u000e9\u000f%\u0007)(\u0007BEd(\t|g\u001cF.6T\u000eب;\u001cTH8IM(\u0010rQ\u0018\\\u0019T\"\b:󓮡\u0010rP2]\u0014>\u001f&\u001cp2\u001fbJI\u001c̉\u001b\u0010=(U\u0005orcB@:2 G<AQP\u00037s@\u001e\u0013\u001e\u0003L\u000fA:v} _\u0005냓Le\u0004\u0007Ay|О0p!D\u000fJ\u000eb\u000e\u0007*\u000f9\u001c\b\u0003\u0013Ko(AM݌;<|\u0004AUҾ$\u000f6?X-\\'(\u0013{6\u0007ɅDƇHp\u0013bG, >>B*\u0014惢߰~X\u001eh\u000e߸a\u000b\u00155FUuOⱭ1#.\u0019QIəMj >;\u0016W^\tj%lcTLhC\f#\u0012U\b_s閲XKJ0D>6<\u001c5-{ٔJ_%hת2TC}j\u001634OYW]hf\u001eG&\u0002:i\t5k\u0003Q\u0010\t\nׄ(8a}h\u0010\u0007\u0017\u0012%\u000e\u0011\u0015Gp\u0002M.9˦^\u0006\u000e>[(Yy\u0011;-#U0\u0005-#>\u00111x\u0015\u0015nLg\u001cf\u0015\u0012hә\u001dx\u001aR*4t&Y\u0010\u0013&K|Z!\"5Ә2+T΅DV6\u0004;\u0013\u000er\u00126\u001aG2󁅂\\O>4M>װ6:\u000fo]\u00132%|3HU\u00140/~W\u0014AɠRF\u001aJO\u000bC?J+a\u0003\u0011\u001b8vx́\u0004 Kj&H\u000e+Lw)\u001c\u00149m\u001aBPvBd!\u000e!jp*DIs@1DɊLCGV4\u00140@\u001c1\"sB^伨ICxB*NU)j$\u0005\u001f5]X\u0007$xx$ƪw\bAZ\u00123F j<\u001e)>\n\u001fSҍ\u0011\u0014\u0012Y\b1Y\u001cݙh\n\u0018T #SH\u001fd4.,\u0006\u0007&\u0012\u001cQ;0\u0007ogP\u0003؎\u0013'Zw'\u000b\u000f/xhMoY1\nW\u000ey݋|PC\u0012WrGu)ǰB4;Xf\u000b\n4&X/젧~HJ\u0015Z\"ī*\u0019)\u0002)4+`Q\nSs@d\r\u001d*\u000300A#0țTMCUF2\n ɠ@Ut\tԠZ'cX\rr*x3\u0005\u000fZщR(fRq\u001bUZ\u001e\f#$I\u0011D82Q}73\u00124P\u0003)\rUH\u001ejdR1_@eDD&WI\rhp<>E(TdC#\u0019\u0014/I:e-\u0012UE\u0007TAU\u001b\u001322&V\u0010a؅GF0BҊr\u0011\u001e^`5bQVD \"\u0019\u0006\u0013\\\f)\u0011E&-Mc\u000bk]\u0013a-d, \n&\u00075\u0019D\u000e\te&\u0010L43ȕXPNVJЙӱ\u0017Thj\u0016dMx%H=R\u001cv\u001c\n\u0019\u0014I:#\u00178J\u00140@\u0002q@p³\u0016KT3sH,-̣\u0016ȾQDߢN}B\u0019($\ta9}(L+;RQ\r\"*$揢.X\n91EiE\u00159O(q\"B\u001d*\rHB\u0015]S\u0010ӇB'eC<pá:\u000esM#kix5\u001c8hXfA.JiN1YjV\u0019׋\u0005\u000e(\u001aTP`O\u000f8؇z,BX;<\u0019SXXB&\u001edh@ňtu``3\u0015^\u000bb\bJ5\"$D]ø\u0001\u0017#Q\u0011f\u0017Q'.\u0002\u001a\"\u000b|\tv\u000e!#N-e\u0004d%\b+x,\u0007QУd232CUo\u0018`?yx,]K\";9Ԑ\u0011\t9^P=9\f4sPJ\u0018B(`\u0006xkV%] Eoȧfٛ(ĪMȚR\u0014\u000f\u0017-\u001eC%NrEkдd\u0012\u0007$.O?QԈQ\u000eBF\u0013&\u0014EDaBz\\2\u0017kы\u0019u0H=_\u0016Q>8yiJ\u000f\\[+\u0013*o\u000f*L|pb瀦lu\u0007Ϗs܊\u0004Gy.w:B\u0012g\u0005N>54af\u0015c{\u0007\u0013J\u0001\u000b!\tW\tUT2,0xb؏.l\u0007\u0001H%TuXDo\nhT\u001b\u0005fPc\u0007bBߍ8G\u0001\n\u0014v@jYBB\u001d\u0014g`J\u001e^\u0018\u001a\u0005\f*\u0018Lw\u000e85;\u0004琩*}A/\u0010\u00074>\u0011j\\#\u0014ǉ1n\u0003MIx{<!`\b*h1\u001d)ͦ\u000e\u0017bJ46_\u0004\u001d<J\u001a\u000e\u000fQ\u0002\u0012(8\u0010q>AR\"\t\u0002D\u0006D(#\u0007\u001cd49N\u0003ڈD\u0007\u001dLǃ\u001e\f\u0001\u000eZ)\u0010\u000fX\u0004\u0010\u0000\u001bԍ\n\u000fQ\u0004j@\u0001\n\u000e8\u001d\u001f\u0014dt~\b\u0005\f*8!\u001eLa#=Փ3!F\n\u00184\u00140`\u0007S\u0011u֥<\u0006&8\b \u0010\u0019ic4T0\n%\u0015Jr@=eWޠb)TTݢ$\bE<$(H\u0011G,\u0015{rTkC\f1c[Ô\u0010/b\fJBBB\u001a%|7TgS*^*\u0019U\u0017n\u0013\u0019Sb^В/#1XQmθE\u0006MD%\u0015ܲ&A՚\u000b\u0012x\u00015j\u001c\u000bL*_}H$\nCj\u00161Ob<PKrf\u001aׄ͡F\u0014کJTfFa\u0011S-\u0003\u001cz|:\u000e\b8BD< .$dB\\+0bGDN2'}@\u0014ɥ\u00101\u0007(U0\u0004\u001dAni\u001cT\"Y{DԃmA0`\u0015\u001c>L\u001a`Z\u001b(\u0018LU:XiVB\u000bCDI%\u0015\u001a}\u000b2\u001ai»E\u001383\u0016N\u000fU4e@.v/\u00163AFp62/LX\u0013IJ\u0011\u0007\u0002cǌPh]$`86\r\"+\\ %\u0015\"ppŌ\u0010e\u0004Y\"\u0013D\u0019T?\u001bm\\\"8g%[\u001dIjk\u0012A*8IS09\b!\u0007\u001br(8\b)\u0018(\u0012\u0014A.A\f\"\u0007\"%b)r0\u001aCd=U\u0006CX:PE2N'<Gq N,B\"ֆ\u0006̓5DW\nreTX9J\u0010GvBJf\u000f(5@\fCo\u000e_c%E\u001d!S\u001606zI4\u0015\u0011>Մ\u000e]\u0016OU8TLAX\\o &\u000bDQ9\\\u00184a81Kj,Wspc 4)Rј\u0019U\u0002Q6$ͥP(\u000e\u001e\fY5l\u0014i;0ҠjA\u0019u#T~h!:uZ2a\\l) 9 1rdTE@\u0017]zQ!*SpQ5n\u0016ny\u0011T\u000e@.TCD\\\u001eZ\u0013F:\"M@2)Jh*\u000b=H+TAF\f^a\"hiFm\u000f^+2i؀o2_8\u001cHj\u0006\u0011E\bC\u0013D\u0010ҸLOP2\u0013H\u000e\u001e\nᯋ\"=͑čsO#l\n\u001cĻ)AuMGi}_,F*R>4\nTR2\u0017;\bKmT$/*!SynTI\u000eέ-E\u0007\u0005%Yr`)U7\n\u0018d igu\u0014]d\u00065~8\u0012N<f\u00161[0\f\nY\u001525*T4x\u001a\\A]C))Ls\u0006Bth]Wd,&)i@&o#TɅ|\frq'H\u0012\u0007)\nj\\Ui\u0010?}<`n\fN<e$\nn\u0010u\\BBŝ\tcP|Ƽt\rNO|9m/9 \u000egl,K՜\t|pC͖&#5iWR<\u001e\u0010r.xʞG;\nò\\#\u001cKʄ8\u001e1\u000eGb)a\u001aګXו\u0013\u0015.EIfI5X%s(lKƙ\u0003\u0012O6cVAa#䃚)\u0007@F\u0013(Q@\u000e}$\u0007\u000b\"\u0007Z\u0017@+yVi5+\u001c}H\u0010։\u0016Ո\u001dŘxT4{Y=@6x@\u001fx\baRtrA(\u001f\baXB́PYdl\u0004]6[%^P(;U#l:S\u0016\t\u0003w\u001c@Vn)~\b5ft.ʔ; *\u0006f\u0012L<C;B4p_4CQj\u001b\u0015##M\u000e*1Hm\u000elRro\u000f\u0002~c\u000b{QEU*&jOR\u001a\u0015\u0010h}+ĜifqN.́3L\u0015I_\"\u001c$\u001cdB\u001c׉75#55М\u0018\u0019\u0006Ǫ1\u0014D7S\u0005;2\\ \u00032U\u0019gk1$yʷ\"/\r_U) \u0012\u001bڴ\u0014]eg\"rզ\u0003\\<-($aނf\u0011k\t\tA^j␠\u00078\\\t\rh^1+f\tn\u001dqK)c\u001aM\u0007\u0012\tq%\rьۊc֊2\u0004S!hH->\u0019S\u0015c3h*\u001ff\"\u001dZoU1\u0014y\"3\u000fӹL\u001b)K,r:.\u0018\u001e/OaOQ`\u0005\u00129˕c5\u0017ʵ\u0010\u00176\u00075!\u0011?(;QI(\u0013U#mΆڒTQMT)\u001f0\u0002YSE9\tNU\u001fP\u0014GfJ|ث[+\u001ba#fESjC\u001c%8G\u001c\u001bY))6r`\tQJ\u00025y\u000b\u001bR\u0002o\u0019\u0017= \u0010\t\u00167\u000bs\u000b\\@J\"D\u001072䆲PM\u0015Cd,\u001dy)sJ\u0018\u001a)\u0017+4\u0014/[\u0006\u001dJ\t\u0015$t~#N\nGØy1Y\u0000\u001a\u0012X_\u0011\u0007&3-l\u001d,\u0018 :\u0013OHy\u0004\u0001H\u000b!=<\u0011Q\u001dv0v䋐YB!;ܠ\u000bzH-\u0005\f\u001aT6j'\u0010۲8%z@vEVB\u0001\nU1\nCעhLv\u0003DL9`\u00109\bDa\u00048\u000b\u001aO\u0015\u0005Vk\u00048ze\u0007_\u0018lrϸ\u0002\tpP\u001eK-`,!\u0017\n\u0016\u0010|\t0\u0013 \u0013TP5\u0018\\fc'i\u0011(ѓ\u001ewPSqb\u0018\u0001\u000e\u0004\u0005riX\u0001\tmE\u0015S\u000e\u0000\u001b/g\u001de4_\u0011eztD\u0015F\u0011\u0012:\u0001/\u001bQ%\u0000\u0005\f.@'Jk\n\u001b\u0001\u000e83'\u00048`#\u0007#\u0000ޒ\u0011 \u000eJ\u0017@g&H\fddSXbO\u0016C?DgEQ~Dp7D:\u001bvA&\n\u0003\bU\t\u000e\u0004\u0002#\u0000\u0001,\u0011\u0002\u0016`\u0000\u001f\u0007,r\"pJfdq}PKmM\u0017+[ka\u0018H!)/3\u001a{_?.\u0006m\u0002\u000f:PN{q\u0002Ňd\u001d*~X63tu$^Wy=^[\fKPKEvKÞ\u0006\t/\u0014:T\u001fpn /Z'jO\b3\u0007?\u001azM\u0015yf;4\u0007\u0010gD$}\u00145\u001cOQ^.%\u0014d?zRQRټr*\u0007\u00140h5Ѳ\u0015{\u0007\u0007dt!;\u0005\f.Go20\u0014]Ѕ'޺/7|j\t\u0007|cF u\"y\u0006Q9X\fڪAj\u0016_A)\"\\{ɧ+\u0005*eAU\u001c87(*q\u0002\u000fܩ\u0019\u0012j%ª\u0019%~\u0018\u001fQpn \u0013=ф\\<,aBĿ\u001a'B#e:\u0014F(rOEҘJDAȱPCIF\u001fZʋ\u0018mrTEA2\u0014F;&J]\u0017.\t<\u00143.<\u0011Q^Qty\u0018\u0012V\u0012,e\u0013khbjv@s\u0011k\"Fp@T2\u001c0^&mfJcTe*\n\u0019:\u0007B\u000eYb*\u000bEHb5#E9m9\u001b\u001aM.bK L(Mdp҇U3\u000eytL\u001cBD\u0016tᲪe\t 驨\u0011և?~\u0014M\u001dH\u0001\n^Cj5nX\u0010Ad\u001fpJ\u000f+إhXٯ\"n\"H(\tR9k\u0013:\u0015HJiq͢*\u001c\u0013\"$/\u0013d\u00161!t)]r&?\u0011v\u0012',j2\u0016\n3\u001fɨ\u000f'쌢\tZũ.\u0011\u0013<\u0007T9\u0005\u000bQ\fζ+\u0013\r\u0013QQWaJB\u001b\u0014ì\u001aF?/\u001cD+Z9x̤0s79?%TM\u000f\r\nendstream\rendobj\r21 0 obj\r<</Length 62228>>stream\r\nS\b^o05C\u0011\t IJL?B~=,dJG1b\u00053H(=TghD6\nVlX\u0017\u001aq\u00185 \u0005<⪂R\nD.ad\b s@M<\u0003C\nJlhťM3_\u0012I\u001fŅQڅ\u0010aB*G¨!ʄ)[Ȣo\u0010^\u001eYdBL7֔ߡaTi\u0015X]\u000e5\u0007ΐΣpBvF*3^R\u0018:3+bC=%o\u0004\u0019\u0017hUCُM\u0004N9ac\n0ZQA\u001c#\u0014gxx59(ê\u000f5f\u000eT*\u0012\"uFVIX?\u001a)l\u000eJcV\u0017T-\bc-\u0017udS\u00128.[EY\u0014V|\u0012\u001cx9<\u0019ra>xe0\u0018胳1\u0003HKŃ\\Σgj$|̂!\u0012\u0019\u001dlR5E^\u0010=p\u000fR3Fr0ZM[Y\u001eD)ڕ1\u001c\u000e\u0018a(2u\u0019Uk&tAB\r՚Qj\u0017-0aYiKە\n?ZeVu91S{\nCj\u001f\u0010ջ\b#\u0019\"\u0019\u0007WE\u0004\u0012\nK)\u0014\u0005\u0014nŐ\b\u001d\u0014\u0016:?Q(?*1ğ\u0004\u0013Ÿ\u0002\u0006$\u0018\u0000D\u0014\u0000d(\u0010\u001ey\u0014yA\u0011\n\u0018t\u0001\u0015ɒH9\u0004`\u0012\u0017\u0011N\u001c#0~q|\u0016\tHg΀\u0010`\u000bx\u0002\n0\u00010\u0000\nl\u0001\u0018(\u00078\u0000\u0006@\u0005\u0002\u0001\n\u0018X\u0010\u0013քR\u0003\r\u0004G\u001aIH\u0001\u0005(\u000b7\u0006P\u0000\u0000\u000b%@\u0000CMr\u0012Ƈ\u0015$\u00140\u0001%Lf\u0000\u0005\u0000@\u0001\u0006\u0017<\u0002\u0006\r,`A0w\u000eNAJVQ\u0018`~\u0004ʄ\r4xe\u0018Շ6ca>8)L5jȐ3_\u0012A[Bq\"\\]c\u001e/\u0013\fwoᇃ\u0015j\u001fN9+t,\u0019'd&kK ɵH^W\u0017#\\4\u0011BT\u0011RUI$}h'P:*f\u00128B؊\u00104\u0015\u000e\u0019bL[8\u0018q҃\"OSMԳy)S+ߐ\u001c\u0013XddD>\u001bl\u0015\u00152&<֩ߟ\u0016BwfA\u0003^\tIT\u0019\u0007F\u0005\u0019'LTԠA|f\\,a*p\"a36ΛȜ!Tf^tSX\u0016|\\4s\u0005؝&<Z_a\bc\u0012E<\u0011(\b\u001deU:UU0!=#,T[!\u0007\u0003ٍ\u0016Ħ^CS7<\u00071\u0018jq\u00125\u001dd|\nKEJfkj,\u0019\n\"8\u001a\nQIUV4a)p\u0002ET\u0003!0\u0000\u000bHEN%4e\u0019J\u000e8\u000e\u0005_@#v$~Xm/\u0005\r\u0016qX\u000bC4wf\u0016#\u0010k\u0007\u001e\"uQ\tq8DZ).DW8-F(\u0011F\u0001\u0006\u0017\fQ\u0000\u0001\u0007\u00160\b\u00139cf۶\u00078#C2*9SX\u0014ъ\"\"b\u0017,\u0017\u00165=\u000fVHR󔌪\u0012CMeèa\u001b\u0005\\\u000f(]$f\u0010S\u0014ST!\u0012I\u0005qI^xa\u000fM%H!\u000fI\u001dSСW͈j\u00054\u00051M\u0018\u0014?\u000b\u0003'P#AFM\u001b\u0007fBjBՊ\u001fR\n!y\fDt[͕1j]ct.\u000bj$Q\nJ\u00164F#iPDT^׭c\u000e\u0012|`Ħ\u0013r\u0007bȵLĞ\u0017F\u0016qL \u000b\u0018׆!0\fX0$\u0006!\r{/:3\"VZo9Ѩ%{ \u0017h!jN*b1H($RE!V\u0018*MzCKȭg38\u001a\u0007uЦ!r(u\f3\n٤h,-\f\u0012\u001ca\u0004˃\u00074)ɡ_|u:-\u000fO\u001b&ʕ1D\u0005\u000fș\u0010V=O\u0011Db\u001aQ\u0001i\u0011)H\u0001\u0003\u000b\u000eJj\u001e\f\u000f>\rl Rph0>zZ\u0018ˀ\u0005\u001b\u001frP^#&(5\u000e\u000eS\u000b]&\u00041x``i\u0004WcrD\u0012(\u000bMU(\u0002b<f\u00040\u0007HMqjb\f֤T\nGbB|\u001aMU2Έqͣ&\u0016AYQfQ'P \"+#PxJpik\\Dmţh\u0012 >&3àF$5!>%4F٩)\u000ef3_PD\u0005I\u001fq!DB^35C\u0014\n+\r\f\u001f-h0\u001aw|Q3\brd)a0}CtТRp\u001bH=ޛH\\\u0012v\nOȌ&\u0014\u0016մ-\"Q[mY|)Y4&;!Dr SryE*JĚeb&D]D\t$΂0pKc\u001c)\u0005\u0013ǈ K`o\u0016T@bq\nQĤ\u001bI\t>Hb+[J\u0012ga\n樌#(2\"P!i\u0011(\u0018f\u0018\u001c95{-إp/j\n4Z\u001eP)\u0013Ѫ\nj\t\u001e0\u0015BTK+`|&D/D2\n=\f\u0014fIޏ8\u000b5J^6h\u0003UQ(WR\u0015\u0015xBL(S)\u0005qANÍLEEp\u000bƈ\u0014*URm\u0016Խ\u000b\u001cJ\u001cjVR\u0006u\u0005\\Y\u00141\rFZ\u0019\rhT¯0EQ\u0014^,¦\u0013\u0013D!\u001c\"1aB#\tłh3n\\\u0010\f7Z_u\u0002,\u0002G떬{j\u0017\rޮ0Uu\u001f1T,xC\u0013\u0006!\u00024(\u0012zoU%lVpš\t1rAZ\u001a\u0013Y\u0005(?1X4$\u000bGDMb$,\u0011\u001cz\u00150\r*>XQ!J*˺\u0016`U4\u00114i\u0002\u0019G\u0004_@^L*]djf\u0004\u0007R QUTNF\u001aDE\u001aX0!w):'p\u0017jX\u0014\ts\u0003\u0010\nITň̾\bE\rR\tE\u001fhHhfIy4}ېOwB44K>9;\u0016Û\u0006<h\bbL5%\u0016DS*\b`Vy\u0015jf\u001c,\u0012\u000b [B\u001bTX\n?j)Fo F\u00105ԸUj4̂\u0006\u00164ՅH\u000bJŝ&BjҖUۇ\u0010\u00160pKUL\u0011.\u00118$6\f1EPc*\u000bi\u0010\u0013\"hIw8V\u0015=C\u0005\u001aq4m\u000fV\b8l&b+\u0014.,@\u0005C>FK\u0007^Da\fX\u0010\u001bKR\u0003ׂbBxoA\u001b\u0010O\n\u001e\u001f񣀁\u0003$pO.8\u0010KP<H \u0014\u000f\u000f\"xr\u0010\u0007SNI\u0002\u0019\u0005\f6p\nH}.%Ɖ(#PUTxwVx5\u0011Ce凳^jH-QCd\u0005_LA+dLHA$_fq>SQY-#t\u0007)ܶ\u001c[)\u0018jwhF`\u0017H>q{t\u0018\nK,BțF4L\u000b\u001eJY\u0014<\u0005H\"\u0014\r}(n\u001e\u0019\u00191I!҂j˃8\u001cMj^\u0018Z_Ɯ\u0012U+!.Æ\u0018\u0007UO%U4>B\u0003}L1ОwL\"SX<,2Ejӑ 3\rSE\u0014S\u001eoxޱJ\n(epU&\n\u0003V\u001cۨfL[bFb*zEK,%\f\u0015\u001eRP)B|mA\u0013۪:/E\u000b>ZDQ(AH8\u0011Z(\u0012Uf{DPIF\u001e6Ygm1\bO:?\\׈åRP9H$QdBZT\"91\r3}hTPa)GBT\u001a4C\r00䥎j\\2{Ty\\!MNB\u0011HH\n$,R[e\u0003HO\u0013UxژYHUq\u0014\\39Xij<nE(ll\nө)(\u0017Fjc#Ruap\bǠ\u00102!s͏ \u00195z՛\u00140Aܿ-22Y8Cq\u00107c\u0003'l-VV\u0003DH\u0004^s.\u0013'\u0011[R*g&i\b\u0002\u0006\u0016h#͹\u0005n\u000bLVEM\u001aQPdI_shQ>\u0010CԣҘ#~\u000038T,D\u001b\u0011;S\u00140hPA C?,B2a֫&X\f':\u0012z%8+Uj\nRD\u000fRCHfGI-\nDgA/HL\u0015=C!?\"\u000fx&X}}ݥض^\u001d\u0011BQa\u0001j苍Jinc(\u001b\u0017(TB}_TpyS^\b)Hç\fQ\u00125\u0010K%|ꛠXL\u00104!s(v\bfv?d,DN,4FeY\u0012\u0015ma'|Ny\u001fm9!t\u0011\u001fsW8g\u00110vB.a(\r\u0019OL(\\!|Y\u000baAan9Z#^QSYb(y%G7WE\u0007Q6:Q]ҕGBj!!u^B\u0017QѴ]\u0016I!VFu>\u0013H+M͸K-H\u0005e:&Ư*>\u00158\u00031=HEEĆ\u0016BuhՔ:\u00116ZkT:S!'!\u0015hJA͌Jx\u001dJU \"jERs\u001a4\u0017W(#H]DH^~fYJd\u0014 4b1h\u000b\"\f\t\u001b*j\u000f\u0012Q\r*\n⭆\u0018F>VԦjp%\u0014ui,s\f8\u0013V!c\u0018jꚞ\u000fPdmƻ\u0019j9I0DNCj{tSS*{5\u0013\u0011SJQqSCtXÞ\u0016\u0019ÉfNÉB\r\u001c䟠0<j\u0014+v\u0019*QIpFD?\u0010Mi;\u000e\u0012,ȱ\u0011T\u0000\u0004.a;LK\fbp(xM8P\fÔ<K=$d\n2ԽU\nH\u0019y\u001d%!lթ0\u0010\r%P\u000ff?L~\u0006\"*\u0011%\u0016\u0014\u0011*\u0016r ډ$E8\u0010Bۿj\u0014l\b6\u0002QZ5E{8R\u001b\rE\u001bc!*BLTj\u0010.I\t\u0007R\u0003>\u00121\rREV֠L+#i\u0011 mQ^2L)Utt\u000eӐX\u001c\b-\tҼt%\fQxI=\u0019\u001bJ4C$\u001dl\u0005\u0013oE#O7\u0005e\tS:\t$3RU>\u00162[\b\u00145%\u0014AN\u001b\"JKhW&C\u0013\"TP\u0006\tH %V)T\b;\b+Z*\u001b1\u0005ְA\u001a=8v9+7d\u0012fK8jpN\u000ezJN!r\u0006\u0012OE8\u0011\"\u0013K\u0011u\u0012݈MADцK\u0019J\u0013+&מ0SLQh\u0013\u001dES4\u0014XW8n`)0$x^`\u0011\r&\biOeP薇i\u000f\nwHaZEK\u001c\u0018\u0019a\\\u0007L\u00047J\f2\u0012ග\u001a]e8!MǺQ\u0014b\t/\u0013XVXN\u001e\"E; S\b\tևʩ\u000f&f?ī\u0013*\u0017\"N4\tS{%h'/'O\u001c:Yh\u000e\u000b\n+c!?&d妤OL>T\t憬</`ٔ\u0004Q\u0006\u0007qXuFB9a\u001d\"/8jVۧ F\r*\n>iD5Tn֔b\u0012\u0005\u001f\u0012\rR\u0019\u0011f[|h\u000fu[6\u0007R<cDT!%HUr'\u001c\u0010\"-\n\f\u00061^\u0014~;\f\u0012\u0019Z5A\u000f\u001e\u0011KCl\fDTvwJX53\u0004?-U7\u001b80,\u0017\"\u0016m\u00183c\b\nKHZ!)!Q(aj7C8,mh-1Qzj\u000fnUB\u0002K\"ϝaZ\u001dDTwKɅ\u0013$6\u001fxM\u0014ae^nz\u0012y\u0010Y\u0013HZrxWN\u0012\u0014\th}2\u0018\"ht(d$\u0004M\f)jk~\u0014a%,HQQL4FJlFgSMK$:\u0005\nEQg*P:\u00191jD\u0005Mz=FEsE,5k%\"'V\u001d-4**MSN\u0011sim\\Jif\fx~\u0016*CR8PQФ\u0002)G:#f)F\u0014-̼xy HlL-0)\u0002t,FBӦĘRS\u0002!wJ$\b\u000f\u0011c|L\nYZRi\u0010\u001306uػ).\u0015Aaawi\u0015Ri\u0017J\u001cUO<Z\r{2\u0015\b\u0011\u001eT^\u000bC<-\u001f\r#\u000bf#wKrTC\u000bcZ5eN:%\f=q\t\u0015\u0006E/иcn<4&\n*srG\u0004y7)Q\bE}ac\u0011p!6MU\rƇ2!\u0012*\u0011OgU\u0016\u0015U`Gjh\u0014u*$`95ßbQ\u0010ùwˈ\u0016\u0010S!֤!:\tBhD,q\u0011xd«ZeA/'3qk)R\u001d\u0016, UY=Aµ _a\u001bDn\u0010\u0005XT&D\n\u00113W\u0004\u0011qq(qxE^As\n\n\"\u0014叹0(|'/HͫbbWh\u0002UTMDu*)Ix$\u0016;Hy'\u0010<UH\u0007GLHST΂\u0019]/\u0017@\u0003|4\u001c5\b/]`bh8fX\u0015i'8F7&`\u0010\u0017qWcc(Q!V\u0007)R\u0015bYJx*,\"mG\u0013\u001e:\u0013$׭A\u0003\"2LlM\u001d~R0Op͖{NCVm\u0015>%I2H\u0016c4՛:IP\u00125)!rɣ\t&gܼ`Zc:\u001c\u001aڂi]j'T)'o\u0018\n\u000bkl(\fvA\u0011\u0017Cj90H__\b\u001fQA*rBA^\u0007\u0011J-\t%Ҫ4+\b2ݨ\u0005c\u0016:i\n\"Uo\u0012|l\u0002v\u001d\u0006\"\u0018Ψ'V\u0013PvRBc3P\u001ah\f\u001dPZM*D\u001d<AIR? \u0013\u0011\u000f\"5\u0012\fk4N&\u001271\u0015ғW\u001bLSUR\u0015WkF\u0013.\u001b;d\u0014O\u000b\rI\u0013*/Eyf?$,<\u000eT$\\h\u001f{\u0011BpHFH)U/\u0002\t\u000fJ\u0015=IJ\u0014V\u0014P\u0014(1,\\\u0014\u0013Q'3E)'\r%#XXUܒih\u000bU\rTlc a\"\f\u0006\"-F}c6?f\u0011_NsQ\"?E7\u000e)H\u0010fkæ \"!,\u001a\u0005\f*\bD\u0014qW\u001cXsU=ȼEzm*<ͅ$f\u001a]}4Cko}H-SL\u0012\u001b[c\b'q!\u001a\u0014\t^W.$r!F$E.g=̥\u0014\u0010Pap2q=F-![*Imp\u0010\tS\n#բ\u00174\u0011LQE3nԶ\u0014EG\u0005m\u0011CAT#MaYU \u0011.ym32\u0010#%_L\u001a\u000eaHDH\u000bk'>'Ш+Sd\u001ct̆pD\f\f\fb\f-DeAnajUY#h,iqjə\u000fTf\u0005\tK(ҞCY\"T<T&TH`l&SC:\u0014\u001aPixф\u001bLjlV\u001a\u0011$H~-Ĉ\u0011\u000f(8ئ\fzWR31\u000b\u0012-VG-JcBԮ&Z\r=X!sr߄_Ni\u001dj|(#a3XB+6\u0006\u0006ba\u001a-Dr\\C\u001fSm\tF`\u0015+$4\u0018A\u0012mX\u000bƊFZ\bg?\b'd&\u0011LfH\u000fK\u0004\u0000\u0000\u0010\u0000\u0000\u0000H,\u00121d:\u0016\u0018\u0007\u0014\u0000\u0003**\u0018(\u0018eA\u0001\u0000\u0000\u0000\u00000\u0010\u0000\u0001\u001a\b'Pt;7^7\u001e\u0016Bp\u001ep|Qku?'c?Vq`J!D\r[,Lҫ\u001f\rPXTҫz\u0000\u001c4\u0011J$ca\u001boWg#\u0003էMN/\u0017wg00\u0015/!MS\u001b|\u0003N\u000e=n\u001c\bn*\r>L/A-A.8Y=?@&,~c\u001b\u001eU%·3TlJU\\|Y\\\u0007j\u0006DvBO@\\#jI\u0016\u0019Mj3&\b\\r҇7\u001d\u0006\u001fd\u001bY\u0001_\u000eZzkʬǌ\u000f!>3ٳ\u0010O-ofo<\u000f`ѮfD\u0012ٿX.-'aT9\u0002.@\u0010Zo\u000fghuC0]=6]h7ؽEgi..ZU/!v0\u0003\\qr?\r\u0004\fg;\u0005z6,!A\u0006Hx47uK P$d^Fg\u001c\u001aT\u0012GA\t\\T\u0002O\u000b:`|\u001eU\u0015\u000b\u0013k)p uO\bP\u001dmаDX\u0017T\n\u0000\\\u0007\u001f\f\u0010UF([늨՜X}dƒ\u0010:\f\u0003Ѯ,\u0011*\u0017\u0006nx1|p g\u0011d\"\u001d3a=<]je!tH z\\T\u001fe=Y=mTx\u0010?$ח%A-3[S-]}jF[s:\u0016\fddc\t) \u001cдak\u0015\u0013́A\u0011\u001bmR6?iL\u001aML\b\u000e6\u0016Ύ\u0010{,O\u0018=\u0015G@.7\u001bv\"O#(iylI,)R.§\u001dy#U.6lLt8\u0013\u0016efa˾*0\n(=\u0005\u0000_-&\u00155z^\u001c\u0015v-R;-l#Z,(\u0018A9\u0003+FJt^cR\u001ar>rT\u0002*\u0017\u0015\r}0KU\u0013?B\u001bL]޲hБN;w8Oꔫ\u0017[1}ɢ6\n;\u001e\u0011*HR^3\u0002\u0006{YnQ\u0003н56w\u0015[Ȁ{\u001cOQJ#]\u0000\u0000Q.\t:\u0015ˤJ*Y\u001e\\'f܊\u001a\u0006|<C\u0010I*K+(\u0012_č\u0000ǃu\u000fb\"\u0001\ffCͦ6iY\t͢\u001b&V9\u0014o\u0014U_v;\\\u000b\bFF%Bs\u000eg6#ROoJ;EH\n\u0019rix\u00073ncᾠ$FS\nβ~$\u0010\u000eH(tJ\u0014W\u0002\u0017HˡՈO\u0002G%N,#8GlNZ\u001a\u001f_vلUR,E@Q1\b:6\u000b,\u001a8\u0007(y˼9i_g!(0K&}&΋\u0016.38i\r4i!\u0004\u0016Dʸ\f3\u0014m/9\\\u0015vOl8\t)$;\u00175MFA\u000eǔbV8iU\\-@=8\u0015ѥ\u001c:y\u0004;W\u001e\u001f\tD)\tbWW>\u0019#h˫\u000f.P)/\u001f&\u0002\u001d\u0011{\u001e\\`Fj˲\b(5q#ςvd\u0007dV7\b:\u001fZ\u00055ZB2)+|+5\u0005()%\u0005+|ڂ\f2 =?\t\u0003teVB\u000b|~%_V(Ize^\u0013\u0000\u0018D#F7oI\u00117\u0013\u0019eB\u0011ZhY\u000f\u001b\u0015Wt\u0013]둤)6L]%W};N\bTҲM$\u0014G\u0004\u00128P;q\u000eZr^\u0012\u0018KMH(5 LP0\u0002\u0016mxUP#cYU|AP.),a\u001dxk1@ju-&݌7sO\u001f\u0013j~aPl]\n\u0016*\u000b'd:܅D\u001d9\u000ba\\N\u0010,D!qqQ\"aH8/?4F:fI\u0005ggd)\ffE%\u0002U6|0XY}tyIծBEQ\u001f\bRbͿ+_] \u0002Wsm%}e؈u5#Agjyk=\u000e4D\\\nAlR0\u0001\u0015KT~\u0016A><\u00005X)\u0019X\\gLО\u001f\u0014\u0000U*gQ\u000b\u00155\u0014\u0013\tp6\n\f^\u001eT'Sx\u000bQ!~{U@{R\t 3Kd,(.T -r *mDib|ڦ,\u0015ګJ\u001br&j[E\u0002g\u0011<LzD.%[g:\n\u0016\u0013\u0011:\u0000\u001b,pY\r^A~;N`\u001a`,5\t[=AQ\u0000\u001fR\u000b\u0013Qy\toN&%\u0015uV$z\u0010s)\nw&\u0003'TNG *iWYZ&T[\u0014\u001fY\u000f\u0011:\u001c\u000b4.;K\fFLFM(5ofc\u0004nI*0\u0014\u00100vrX\u001b)A9N\u0014c%y6ǈ[dG\u0016g\u000f[ȐN\u001d@ƣ\u0003\u0001\u001bS}O\\DZTSyyΫjZ\u0011O&g6\rgq\u0010޵A-\u000e\u000fTK.rpbm`Xu`\u000b\ti^(=J>=1\bS$\\>r\u0000\u001aOGnwc9Y\u000bVdle\u001c@\u0012@\u000fb3,\u00045sd93\u0003r0Y9ˁi\u0003\nC%E#\u001a\u0017uJ9-!e\u001bg%$\";^b?#+H\u0000\u0014\"HfLǎ\"\u0003J\u0003\u0001\u001cnt`ݚi\u0002`ĥq;_\u001d\u000b\u0007\u000f>k\u0010\nգxP Yp0G ;Ɋh9ii\u0007{05Y\u001eL \u0014V\u001e]X+v+\u001f{ێ\"Ri2V(B\u0018u\u001f\u001cki\r\u001bqrF~\u0010jCi%Wl\u0010'%g9E2kю/\u000er8q0V?pಖrsEV\rX+ôjc~B9@앱TNm\u001bI ۚ`K2\u0016-R\rjb*.׏\u0001>g+i5v\u0014D\u0005>\u0006n+恫\u0002@H\u001cZ-rd?4,#$2GY\u00174_-\u0015/pJm9\u0001ޗ\f8L\u0016A&\bjC\u000f\u0018|u1X_h_k+v\u0000`d\u0015\u0014\u0007@`\u00149ݾȀ8\u000bI65sU\u0003|V\u0000\u0010tWX\bm\u000e\u000e3\u0011 \u0014<g\u001eT\u0015|x\u0013\\D\u0014jGdZB/؋\u001e]:7So\"2<\\\u0006{\u0001D\u0011\u0007\b!bVn9;;P\u0006\u0011:1^Yvt\u000f69Z\n0Z\t6A\u001cXo\bӉSO\u0012e1ɓ\u0007!BCA7W;\u0019T\t[u\u001f\u0005`YkF3;LKZǛ-\fߓ\u0013^\"_x6NWxUضbh%)$\u0002K;\r{wjuǙ\u0015_e\u0006,PRJg\u0002E|fQ\u0000hiS/\u001bʎa\u001db Uh|u?!y@PAd3\u0000\u001e˟b-\u0001jtN<)69R++w\u0000Yo.?$vl<۪t\u000f>p\u001cè\"L@v1l\u0017\u0017U\u0018&fbv/}6(]b?RQǀ̕JmTӳ6E7IUj85\u0005AX\u001c| *n\nI\t00d0&8Gs8g%I0؇\u0016Rƹ\u0006\u0018\b\u0013BO\u0017\"!\bQoo/B\r\u0004~E!k\u0001\u0011swBR>!M446\u00107&5@QqE>8T0#gc \u000eISv} Z.rTl]\bb9kM\u001d|pfV@>\u0007?lkveGśwcHRA0ɍ$C\u000ePK]@BQ\r\fy\u0012/k\\\u000f\u0011\u000evU\u001bZľ\u00178i\u0001i\u000e\u000f\u0015\u00146\u00041Z\u0003\t(p\u000e\b`j}g\t栦AwQ \u001f#\f\u0013F\u0013$M `}=\\PQ\u0014MG֡GH\u001b@4\u0010l f\u001e\u0006$K<N\u0003\u000ffoOCh\u001dH4mbjv\u0003\u0019rݲΜrܿR?\b\u0006RhME@sCa\"\u001aVw\nUAA2QQ+\u0015HyFv\u001a\u001djվAnS\u0016d5m<I:\u0016̸I\u001b?i.N$ӊy\u000f8\u001c\",\"}!\u001b;\u0005\u00120_tY\u0012qY7d\u001f/\u001eԸAE(j19Twǃ\u0018P\u001e<\u00123BMR\u0011CF`aݼfǀ>7a/\fYz\u0002`Rs\u0000LWRW&89}\u0019@ ,ɞ/\u001b$j;xF\b\u0014݉%K\u0006nDW\u0002\u0004\u001foj.i\u001fj&sye\u0007\u0012mo\u0001\u000f+~Z0\u001c_\u001f<4\\E\u0001Z`\u0002R,\r`mv|%?Ko\u0019[v-ȫ !qW\u000fzazup2BOm S9*2INY\r\u001f`/t\b\u0018Y<ģxv\f\n!\\X}_@\u001b/yk>\r{4<.\u0011t%\u001ch &먰\u0018¹Gn*T\u0000s)5O\u001d5|s\nch{'&%yjdh1\\=\u0004\u001anB\b\u0005xw}\n'*\u0001Q\u001d\u001a\u001f\u0005,Nܻ+sbv۾S6T#~\u0004$ڈ^V\u0003~x\fT\\\rl/'ǲjP\u0001\u0006B\u0016\u00114\u0016/#ֺl\u000ew,;}1Bn\u0016\u0002c\u0002꒓\u0007-tSBlE,`L\u0003\u0007jJ~N\tY\u001c[Hc\u0000\u001e(Z\u0013K!6?\u0011Ⱕ\u0015\u0016~\u0014UEB6̣qV\u000bDv0@\u0015G&l<\f:`\u000bf\u0019@}\u000fp\u0000XDllS\u00035EkˏCAڰ=\u00062/0zz=wjk\"KU^6C\n2Ũ?\u0019\u0010T!7\\\u001d\u0007\u0015Y\r=\u001erY5\u0000x\fj xr\\\u0014v\"L0.˨UU]mv̉\u001e~dzd\f\u0014;j±8'v{\u0014\u0014]d\u0014K\u001a暱SBEz\u000e\u0007zN\u0011um+G\u0003u\u0001b\u001a;*\\\bbFRGǢ2rͳ\u001dU\u0013\u001c\f+dkf\u0005d핎/\u0012&\u001f\b1uyA\u001d\u0016cݟ;2\u0011JZRߗ\u0012Ky\u0017\"!ۮ$ȋEO2xBT%ñ(a\u0013-A\u001d\u001ah\u0005o+\"i,jn\u001dff\f *v\u0001\\\u0017w\u0001E7K\u001d\u00108:L=w\u0018\u000e\u000f&6\u0005p*lz\u0019g\u0012$TD\u0012.^nn\u001f\b$SZ_\u0005{~\u0011\\c\u001bg1\t\u0019r:b\u0000!c@0lQc(\u0014r9.+,\u0007D\u001ahoք\b(C.\fLȰVSzN-\u0015}\u001a֠Oَ@bV.mѭa\u001cX\u0007.r\u0012\u0006F\"\u001eEbb-w=\u0016MۣUYo$sԔ\u0011\tumǴ_d\u0015@K|\u00160W\u001eLz\u0011\t\u0015^ڍҩ\u000bej.lø\u00028\u0018\u0010\u0001@-2\r^S]Q\b\u0016gLȼ8Ek\u0012\u001c6\fG\u001b\u0003`L\u0012O9\u0007Q\u0006\u001cDZ@Ϭ\u001a0<2s}/F\b3\u0016qaKn^\u001aQvqC$Ǡ\u0005\b\u0010[\u0017\u0005Y\u001eQ.MƭX8u\u000e\\\u0019\u001c=)9:_4Ϫ\u0015Yu^ZghRc,vE\u001ac8\\\rwki\n0\fq:=q\u0004H}2pl\u0015\"zO{\u001c540r9\u0001ȕw{V>`Ӂ%2MqB\u0001*$\u000f\u0015nS\u0011,\n۔<)\u00125i+V4\u0015\u0004m^G,P3\u000b \u0006ҿ\u0004BuE\r)c\u0007>K\u001dAަ\u00135\u001fqX,\bQ\u0015\u0006\"\u000e\u001eQc/tbqb_dK\u0012R\u000eH\u0005v7/SQU|@Z\u0005o\u000b\"մ\u0010^\u0015&kzb|<rw.\u001b\u0002_7 \u0000\u0000\u001fFD95kU)4C.\fhV^=0㳋hI~+ǕE?H%It+c>-橓1\u0003\u0011t+\u0007EcQg〘\u0019\u001b}n;\u0002҆d(zpý,pR$%\u0010.Ls'.!\u0004j\u001e\u0004w\u0004Q\u000fvdcE\bX(CMðScSm\"&L&h\u0014}<=e\u0013av7I\u0018\ba)莖*\u000bj\fyl?\u0001S1UaFTzb|\u001dT]\u001d,ܯ(\u00162Ml$\u0003;\u00185T7H*\u000bӣKͲ\u0014rIHAƼj֧\u0006\u0012\u001d=[\u0003hK*p\u0004\u0017\u0002\\\u0010W鼋zS=Z^ܖNMi(¹BEVrޮGT\u000fx\u0012[\u0012_[\tE\u001c(RQ3~wջU.,-QL\u001813;\u001cQmw$K^\u0016Bu^\"LG\u001c8\u0004mɺ]Uր\u0019?\u0006ʥ՝\u001fn\u0000L\u0017\u0015vSz~eTe|z\tBt.{\u0004Ԉįܮּ|P#\n\u001dAe\u001eN5I\u000fTŕVGvgtc\tȩt\u0001`Q\u0002%pnSO \u000e\"\b{\u0017\u0006ļ\u0011~T\u001fކ\u001e|p,=P멟C_+\u001fS\u001e9?xK\bv{q`'u`=H\u0003\n2^\u001dx\nU-vP W\u0001Q*\u0006\u000b_,xh\u0019\u0015Gu\u0011\u001f6\u001b_S)\u001b\u0006\u00108Ft\n\u0016J|\u00005H\u0004/T\t[0H(\u0002f3uE$#Ӳ*\u0010\u0019\u0006`V\u0015\u000f8]Z(g%*Tf\"Xt'e* \u000e\u001b\u0017d(F=\u001f?,KաfXQ\u0019U=ļA\f\u0015V(\u0017|mKŔqX+?<F\u0012S\u0004a878`P\\ګZ}ʉWPK\u0003X]l\u0007 g =ίDOE\u00021VU@V싐֜HWԼ\u0006~ٵ\u0000ô\f\u000b#i*D\u0003*\\b\rpՅgVV\tl\u0013:\f24\u0013\n(\u001e\u000f=q3$ G\u001e\u0016G!=4$\u0007'\rj\u0012SYGpe\t1:Tj4Ǧ<o\u0015e\u001e\u0006\u0012\u0016\u001b6[\u000fE\r\u0010Qv a7x-8\u001cz\u001d׹*bҢnJ2kp ęZ<cEd\u0001\u0011\b2d#5\u000eM&\u0011.eP\u0014\u001az%\u000fa%\u0010k+\u0001R)\u0004\u0002J2U\u0019<0W(\u001dxnrc\u0010*jc\n\fHm\tCV\u0013ݳD/\u0002gX\u0001\u001cT>X/Z\u001elhy̪Us\u00113pf\rC\u0010Q#0[\u001bT-\u0006 $Pc\u001d[F\u0011Qv*t#a|TЬ\u0013\n;&-C\u0011ž#\u0019E\u0001\u00063\u0005j\u0015䚚f&ӧ\u001dG,\u00120S|F\u0004DLŗ\f\u0006POKr[\u001b\u001724S:?)%\u0016k/\"s7*3uܗ\r(&^2%\n\u0017BXx[[)\u000e!7aX1MAQPP@!DG6*)v-P:m̆}\nUQ\"]&SX{\f\u0019Z:]\u0013\u001eD4]LB>d@+\u0011\fe^#1\u000eIta\u0004~9&B)3Ahy〢\u001evXK\u000ej\u0017Zl\u000e\u0005tVSwe;9\u0019Q`.\fF!L>\fZL\\\u0018[&\u0015\u0019x?\f/;EH{A^>\f5\u0015Ojxy5,Uu\u0001_\u001aw\u00057\u00104(!A.dKcnZ\u0006x\u00154;\u001d7Ԡ\u0005j)S\u0014|Q;cН/}D\u0000\u001e\u001a*4,~)\b\u0018[da\u001a\u0014MP\u0001}>K\u0016X~\u0018:\u0019/T5\u001690Rpg,G\u0010?\u0011w\\\u000egJ?\u001cMzkh9,\u001f`-_Ey9LX2\u001az_tb&Ϭ:ry9l\u0012II\u000bGe:/R\u000bZMC\u0011P+ʑbQ~X$_.'VÒg\u0018\u0015$T!3jKEk@)-|\u0014\u0006Z\u001f\u0001\\\u0005b\u0017B+-Uxy\r̸n\u0006s!}rU=Y\u0006WʾX3XuF\u000e휦x>6P\u0018\"2w\u0015Bh\u0004@%j33=r\u000b\u0015]\u0004\u0015g68EF*i\t\u0005v+h\\9W\u001e\u0003W}|w'\u0000vXϲ>}\u0006J\t~2ÐR\nG6nVToHC9#tTۙz@w*\u000bg\u0015\u00054\u000fZTL\u0004PTTT\u0014}1iA_eRݔ\u001f\\(\u001b\u0014wl»\u0012Y./8L;2WD\u0000N6<;\u001aQ\u0004S5\ndXUZ̟6ʜ\tkP\u0003g9F\u0015\u0013\u0010\u0007\f80;tG\u0018U4bbXL@8h\u0011_\u001f{2ZO\\I\u000e\u0010H;\u0013D\u0011(\u0001zKGe*\rd\u001at듇+\u0015$8f\nw\"I}*\u0005\bwʭ]tǐ>T]4^D\b%-~!z(AnFH\f\r:)S>lXbq\u0013wh\u001a\u001b\u0019\n\u0019p/s9#\f\u0002\u0014Fv$\u000e\u0003_| #<=8FW\u000fE25ݾ:LBpٯ+)\u0011F\b\u00024\u0010c6p~ve%\u0005\f\fl(f\u001fYG\u0017P<@Ep,\u0012ơ^il\u001676P=ٝ\u001724\u0015:\u001euZ\u000bSK\u001c\u0013HRl\u0018Q\u000f֬\r\u0003\u0017Ȯ23剖\u000b.P*joD)<\u0019a\twPVx{Xk2Iw\u000b:bk?>dG-\u0003\u0002;u$z\u000b&\u00031/:~/=,S\u0002]KM+W#a\\9bg.@VVa\u0018nG~\n\n>\u00014XئVyp?|mt`\u000e.\u0016/TR\u0000aG\u0006i+\"i\u000b9(`\\дT:*\u001d+\u0016\fbAjH]P78-d\u0003Z'}4u+`6v1@a<\u0014\u000e\u00154㰍 \\ةO9e\u001bE\u0010\u0010\u0004QEA\u001eg,\u0002\\WQUj\u0002w(|ٕ^*['M=Ak*ߍn\u000eO[&0Ө6tR\u0010\u0000\f\b\u0014wۣ%s@G`$&δQQ1*A\u0002Ώ؂v٬{\u001f4F&̛\u0014El%i\u0000\u001d\\47!}\u000e{\u0019]Q[&f-ezq[]1Ś\"SHO\b\u00007\u001ae[.\u0015n?\u001bʊ:4񧳊WS%SV\n(8]pX\u0003_d|s*Yw\u0015@U⋒\u001c\u001a\u0018ЪP؟_<  v~.< \u0016\u001eJ.\\NN+rwgUfC3ROW\bF36\u001dEo̻\u0002<t\u0007VC1C\u000em|I\u000e=\u000fS.D\t[cAݛ}XEÙK)sC\u0007\u000bCF\u0002!=M$\u000bK3\u0015kWL\u0004i&8d8\u001bN!0Q5\\[e5h>Ġ\u0007yNRNa\u000e\u001a\u0000\u000bi)[3wx\u0019ҁ5Q\u001aL\u0015ғ\u0014V,^F\u001e\bg )<\u0017\u0002\u0003)YjaS\b\b\u00123(`p\"`\u0011Z\u001c$w+'ާǉ\u000fI\u0014ۇ/0g\u0006z\u0011\u0016\u00156\u0016\u000eU\ry8\tf8\u0013\u0017TY^\u0004a1w\u0006\u0004c\u0002\u00102\u0014kԳc\u0002\u001f(I}H\u000fY\u0012)q4\u0016t{.%-\u000e95\u0005xXV\u000bZu\u001eH$L\u0005Z\u0005}]K'Ո\u000fOs\u0000\u0001#=I}\n%nϗަɭ{RtA\b\u0002\u0003հet\u0003%:\u000ee\u000f\tLiH\u0007\u0019V^\u0012Ug\u0002[zr\u000fLK\u0007@l\u0010hh\u000eٓ[M3\n\u0004۰:\u000f\u0019\u0007\u00014*&\u0019~>{G!\u0004-5}^(՘9\ra\u0011\u001cR\bJB\fQ@\u0001-al\u0016~Ec\u0002;d[\u0004\u0013\u0004tѸR\u0002~Lՠ\u00146\tC2}\\q<@E\u00198\u001cG/BI\u001c1`F&{MCڅ\u0010\u0007V>!53\\I#\u0014\u0018{,\u0011׆\u0011Z~\u001b\u0013\u001eO}y^뇀\u0002G,\nSG)71r\u001aaeĶtfKOP\f\u000b\u00124[\u0015\u0004Z\u001eփE\n=J\n.)h\\\u001dlW\u0018\u000ba\u0004Z)in4S;x1\u0017\rx`UgYE\u0011\u0012Z]ʔfe4\u0015s{\u0012x>MvEU)+ac\u0019\b6,H\u000e9֖N KmO#$㚱=8{P+غ^,4F\u0016Nи{4E`!J@R\u0005ERU\b<*[n]@Q\u0014N_\u0006(\u000fI\u001d$\u0012e9\u0011\u0007\\h@h[^g˖\u0001\u0010R()X\u00037\u0000\u000fU$%*pՄPf^I\n٣HT*GBȎӜTA\u0013haM\fF\u0015\u0011\u001b'&\\1Dˉ\u0016\u00168\tORՔc\rI<5Pfw\u0003\u001b\f;P\u000b4S8K\u0013=\u0016~xcm<\nf~_ܽ\u0013 )}\u000fJ\u0005$u{*\"\u0015kIHR89v/]RrQn\u0001CZYKС}RUC\u0017N\t+tJX\u0010ړ\u00172Gd֩p\u0007ҳF\u001ev'(V\u001ds\u000b\u0005%\r\u0000pH\u0013Y盳\f[a6qڀzXa\u0016B\u0012.büܨf{\u0016\f_}~cW|\r\u0018fI&P?\u0004C,)u Վt@S$\u0013.\u0005AH0C2d#I\u0001_>auwdXx\u000bJ]\\P=G\u001av4]yS\u000fUi<L\nCfi$`K29x.\u0011\f]p\u0006(\u0001t&\t\fU3C\b<d:C\tW\b\u0007гY&\u001eAi\u0015*x\u000blH\u001fQ6ieH\tRz8\u0010o]3_\u001bT6=NgVҏM)}CT,F\u0000\u0013;\bx\u0003?Wi+A|M>b\u0005fC7ʈu|kXDfc\u000euxz0\u0003J{50Nߌ$LdX玑\tc\u0013\fykezhYO\bd(\bP\t9Yp</Ё&d\u0000E;\u001c\u00110,2^\u001fΉ\fM<ܰ*wl&P\u0003_6suM\u001d|p5`q]g\bK\u001eT\u0017\u0013~\u001byM\u0014E.\u0000R\u0003؍ï2ޢI=ώMHGK\u0010*͒\u001e]b\fM\\8y\u0006/X哽Ju\u001e\n\u001ap^\u0017$\u000bbkn)[!T\u0007 \nǾYD\u001f\u0012`(@d,ʘa\u0013YXIcPS#UV6:?^JNϖLAs겁FiK\u001d*V@\u0004]Ti\u0016ۙątC9BӮH\u000f:Pc#s\u000f3^\u0015e-\nL9B\u0013o\u0001\r9݂\u0019\r0\u0019\u0005k\u0014ty73R`\u0012\u001374\u0016Vn\u001fܲ}u7\u0017r,\u0000\u001bOQ\u001b1}CʇhӰ[ٶ\u0000[ ?\fֹl\u001e_\u001d\u0000nA\u00005LÑĝ\u00193\u0014\u0017lyJ\u0015,1<\u0016\b6X\u0007\u001co\t/\u0001ay0\u000eb]vݱBa^wFM=FVt*\ftx\u0006V|AQ*Pu%3\u0003ii\"\bVgc\u00075HLm\u001d\\#C#\"46\fzJhp1G.ah><\u0015\u0003X;  \u00055ڈ\u0002k\u000fš28f=J\u0015c*4THt\r30]\u0014\u000b\\neY(`@3.\u001fJ$^*cav2հwBFR\fF_UL=#M?0P\\)\u000b\u0001\u001b@.  g*CdX\b.StR\u0014\u0015\u001e6\f\u0015u\u00135L Ƹ޾KGS(t\u0019\u00001t3\u0007#=mNY\bd\u0015n.\u00041\\]\u0003\u0019(9\u001a\u0010l&\\\u0006Y\u0002S[=U\u001d\u001b\u0014[]ff\u0015\u0016磄$\u0013HoY#Y0]Ck,\u0015h:\u0012B7xN\u000fg\u00038ZdRJ\u0013\u0002{a!CI͊\u0017*\u001b\u001e>kM\u0007iL\u0001aO'ey\u0017\u001c\u0002%bNp\u0016:H3\u0010R!\bX\u0017>mu@*)\u001b$Qi1pq!\u0002u\u000bѯ\u0000<\fq\u001aMj^ie|\u000e\fv\u001a0wǿ\u001a)U\u00151\tyTc\u0019\u001a\u0014=19\u0011p\u0003q\u0003$\u001cX*\u0018@\u0005&=Ml\u0013!\u0016D&\u001d/ȯʮd\nUhim?/'=\b\u0002Q;\nZ:Pֿ qEa^GLǐ\nAހ0m\\\n\b6*\u0016x$\u0010\f1)+\u0018_\\ $1l?D\u0001X\u000f\u001cngTMy\u000e:Tv%ز\u001c\ri}9NZd q9OD(u\t+8gL\u000b,?-0|v\u0012\u000ez\r۶=\u0013UNE\u000bX\u0013\u000eh\\iH5=_2Q5=T!7JaL\u001344\u000f\u0012~bg\u0018DUC\r\u0000b詣\rFqa\u0005_\u001b\u0012a\u0014&V6[l\u0005Oo@Q\u0005h\u001eI\u0005hA\u0018%y\u0004\u0015Wz\u0001YAA{\u0013ĭd}UL/,}h_-07\u0005e)JYW1et~+t\u001e~;!Y;]=\u0015ӖC!e@Ql)t?PN\n\u0019\u0014_ʇO\u001b$u\n6o\u001a\u0015'|u\u0014x`.\t2k\u0019.SqN<3~>\"O@\u0013:\u0015\u001ay\u0016EaE\u0006:\u00136'\u0001UO\u000b\n\u0005I \u0003\u000eKiAs> KH,fwT4k\\v\nBf\tͥ\u001eub6SݝTF\tz\u0006\u0014t2gu\u000eFf,b\u000f́UT\bUS-\u000f\t;0{×lk6\u00047r\u0003?\u001a\u000b\u0001\u000f\u001ev) /m\u000e/HE\u001a0\u0006^Ucz\u001d\u001di]ߐX4{!\u0000\rHN\u000e\u000f$78KP=<\u0005SgN)ɲ%b$E%*\u0001\u0006֚jgp&1_>`˼RNbaw\u001dnm\u000f\u0013H\u0006\u00131Kq5\u0016dЍxY;h\u001f.a\u0005zWr\u0007_D׌>KC.Fz\r\\\u0017`J)n|^\u001a\u001aBWxwoܙ\u0012H%0X`,mX4yY!8W'\u0013\u001eRL'[=QuN\u001cJ:Z\u0015\u0004g\u0011ٜ:\u0015WYl\nłu.HXѨ\r{ր\u0012\u0013\u001dl.+w$\u0017~'p):j\fPl?Y'Akנ\u001c\u0000b\u0013vK$b;ಹ\u0011>\u0011Q\u0018\u0004\u0012*P3qG8j\u0011Ψ=Py|\u000ex@fۢ\u001fc><q\b]K\u0019FO\u000f@X)'ǿP\u0000\u001aP\u0019\u0007\u0001tӭ\u0014\u0019ʰh[L;@<\u0002*P/\u0010\u0010oQRgi酲:F\u0017ц\u0000ېA=\u0007\u0001eYHZARZݑ;^}w\u0007\u001e)Q$7'\\\u0016m\u001a WJRh\u000e.(Ԟ2m\u0001\u001a&jP0\u0016GcM;\r똔J\u0012\u0013\u0004&\u0010#)gQS۽ \u0017\u001d:Ci[Y\u001d\u0019;𫔆)\u0006i\r\u000eɩ\u0002.q\u001alslOBïz*\u001a\u0014\u001d\u000bA5\u0000R¥GsȲ*eԮdU{\u0018\u0014c\u00179\u0002R\u0018M&\\rT.(T\u0014 WZ\u001aN8\u0000\u0014]AYҸԊ<\\!\b\u0012\u000f<\u001a\u0018\u000f;/9\u0019\rJ/0\u0019PPf)V7-h03A\u001dq[є?|[\u000f\tx%pn\u0015uۗ>O\nPh^\u0013 0\bh\u0005J\u0019%x\u0005\u0003D\u0018\u00185\nar{\f\u0002{4Oyao\u001e\b\u0013]m҉ˑ٧\u000fxxe~uѸ&SY5\u0004pGOޔ<u<\u0014DxƈL\u001d\u0007E\u001d(`\u0016:Ʒ^KORjN\n\u0015CLG\u0015{nvE.:G\u00008G,\n\u000f\u001fJ\u0011~y*\f\u0013c\\E\u0017]\u001dy]eŮF\u0010̴f^uTլt\u000e\u0003o\u0014B\u0012LSq@4!R(G\u001a\nKnф>\u001ci\u000b.ȷ_J\u0007'ypj!\u001eZ7VQ\ruXB\u0000L/g\u001f]ՓUHQIg!\u000eI\u0015fOh^@,\u001a^8SRHOͬE\u000eTK\u0007кa^U[ONnz>V\u0002Į2'LiSˌa6\u0005j[lq_dl,\\ڢ>J]4ȑz!{y\u0010}\u0003nT\u001c\u001e&\tHb`\\\u001b£rt\u001e\u0018a edhԷHmA+Ț\u0005pM\u001a\u001eL}7}>%n<_I?UlU\u000e(4\u0003)!T8DQ@<\u0018\u0007A\u000f\u0007\u000e\u0012v\u0010\"ZQsXŒyOV?\u000b\u0014$9\"Q\u0019Az\u0014_6kq\u0000\u00038e\u0013eT-8:Ԥ\tѤ+úÉ!I\u0019\"|'$\u000e:K*oWQm945{-H<(f31Z|Our\b\u0005+\u0014J`GqN.\tP;GB<zL]-H!\u0013\u001b\u0017\u0002=ĳ \u0010J`onm\u000fnj\u001cA\t\u001b˃V8\tS.ROQIʫ޸n\nW|#tm#\u000e\\Uh&zű%7қ#d\u0003mSxp\u001b9xvm(l\u0018ޕ$Ǫ:N7Ƃ\u001bA^\u000fg\"\u000bTZ\u001dyf\r9dPb|R\u0002+\u001d7s8]\"K[\"\u0012g*45*F\u0018{|R\u001a\u001e@\u001eI1P5fG&[(H\u001f掌zT\u00026sPl\u001e:]BG\u001d\u0015P'ъH\u00011I+M7xDFg `eTԟ\u0011n\u0003\u001a\u0014\u0018*ϸHC\u0018\u001bMyiR_\u000fo\f0#Y\"2j\u0007I\r6\u001c\u001eEy\u0012N(]C`­V*f\u0015\"aq\u0017\u0015\u001a@$eꌋ5\u0002BJeiA(\\ +ѫJ_[Ǹf;\u0017}\u001e8'wH\u000bL$\u0015\u0013+Vv[`Z&횾\u0006\u0006U}e;HG\u0012.\u0012I|=bbX'\"gVYxN\u001b\u0001q:Ja\u0018\u001eh\u0003@MD\u001eaQ\u000bI:W(\"/G+)\u001bY\u0019\u001dr]-;:LAQ\u001fQ0޹\u000e%\ni])ڸ[ްll\u0010%l4O\u0001e8ӑN_\u0014څ1˔P|#0lY\u0015\u0002\\Y*O\u001f0G65@&KWQ\u0006Ā\u0013HZ`T2\u0001\u0004\\>)\fw%^R\u000ets!H4\t\u001b[l_\u000b\u0014IYT\u001f\b:̈́;BCE/īÖ\\\u0001S3v\u00106NRKh+2}DJ\u001d86@=#\u0006^AYGr\u00054յ\u0017=9\u00115-mT28\u001bE\u0004>mutѧ/G=\f}\tl|M%rbPGz\u00168&\tL|H\u0010wv͆\u0013Φ_d~,\b\u0011\u001fp5\u000eLHsξ9(zؕ@E\nwycL#\u0001~\r\nN@Hǃ?WA3U\\\u001a!\u0007KRB\u001c@a\u0000?\u0019i{z,\r&\u0002{MUr}5X#w[\u0018uL\u000fW\u0019c03\tQKD5])&Ze,Rkj#$I듀8R'8K[\u00128P\u000egA\u001a\u000bCԶo$4\u0011{ق[s/\nvh6s\u0002D\n4<v͆Mr3 \u0011Rz?9\u001b8\u0006H/\u0004\rF\u0012\r;v1\u0010.\"'\u001e.\u0004)\u00194ʀ?Ю\u0002~V!tA06/\u001a*\u001c\u000f\fRF\b9НCo\u0001]Jφ\r-\u001d}\tS¶Sk\u0019S\\T\u000f\u00067K\u001e9\u0006m9bBt\n'A\b\u0010(aS%\u0007K\u001a*x\f\u001f\f]b\u0010\u0006\bt\u0016Q\u000f\u001cѬ\u0018Eq=\u0015G߭d&^/\u0017KCw\u0000eB\u001b%H9\\\fp\ntxh(b;ud\u0006\u0001\u0011;gAݶ8!\u0013Mbt\nT#F9Վ*7\u0012~N{\u001a<F*-\u0002\u00047,ӱ\u0002I2%}Pv]k\u0002ܯ\u001as\u0002\u0003ѾG[ȋV+8X>\np\u0011\u000eù-\u0006\u0016z[\\\u0011\u001b#k|! \"Uš\u0016!\u0006Xga\u0018f߂#\u001fߗգOK?\u001eQ=W\u0011XlW@QtԜWC&heJ1U8%$#%JZUa/\u001dl\u0005\u0003%\u0000n\u0010AP\u001fLNxv6\u000e\n%\u001d\u0001kh\fd\u0001]*/i<hm0@XOc ʣ1\u0017\u0017\u0004\u0018vG8Ȏ \u001eUtƊ>%)[K\u00139 ?#zZ9<sYq֚\u0011B}\u001f%%)e]\"m\u0016yȗ&TK?60\u0000z\u0003QE_X)q\u0015\u0015#<0`\u0005\u000b͞$1\u0003h?\u0011M\u0015G9/*\u0011QMk\u0018hMd;;FTWN\\JR;c`^@>\f*j!((s#sH(eҹc\nK<ovMoboQf\u001b1aSQP+\t\"\u0007);(vD~\u0016Q\u0015Clg\u0015?Ha(!H\u001eZ>ZDp?QtXs\n1Ƚ\u0004m%H\u0017\t1ކʙv~e,do!eFTd\u0007\u0007'\b]<.Ol()(6z\tO\u001aX4lf@\"\u000b`\n;<Dh6Uֻ\bŽj9.P_ieX4{$2D*\u0000\u001a[`\u0006P+/Ѱ_\u0014{]3\b6\f\u0000-\fecN6\u001dw\bjş7-\u0015\u0014^'\u00160d\u0017k\u0016Cu0|O\u00144Պz\u0013A@B\n\u0003+P(_Ce\u00024\u00148pPLH\u0002vH\u0002,Afd剂szV\u0007\u0015-TvnЋ>Bz9Ag'\u0010A\u0002iCOWl\u0014\u001c\u001c(d\bzT\u0013McBYtvRh\u0013\u001b;d(H\u0015&\u0012Z\u0014\u0003-r^LQ|\u0014\fƤi֋6\u0015n\u0014%Ƞ'}N5\u00112\u0000\fO*͕T\u0005\u0017\u0017jQ\u0007P)I\u0012R\bHQEHK\u0001\u0010\u000f\u0011N\u0003\u001ft#i\u0012N!G\u0003\u0017\u0005qtx\u0013\u00030s~\"J\u0019ݦ/\r\u001fv_8]{\u0007Vo\u001d*JI!,\rN,\u0015HQ\u00151\u0005\u0018]Zf?0\n)+H8\u001c\u000b(2Hx\n\f'#jZ\u0017z*{κ\u0017\u0006Dī8)ԩKP\u0016\u0017\tn.\u0014C}QffZ\u000fWl\u0016^z\u000ej\u000e\u000eEQv?\u000fPR\u001f\u0000P\u001c5S͋#N~^v)f\u0000av4Z\t8SS,\u0004oe>8iW}a\u0018M^vn/\u001e䦧h5B\u0017\u0013Q\f\u001f>L=ȍHnsnhB\u0013\u0007طF¬VNos\u0006\u0017\u001bɮFQ\u001b~1l7\u0019CKI>f5حUTO\u00116D0E;\r\u0010R!u^\u0011O\u0012[\u001f]X7}T\u0012\u0002id\u001cԸ3!&\u0004Ж\u0018FO0Hm^\u00108C\u0013\u00030O=ieQ%'\b_StC\u001c>\u0005\\t\t]ie*\u0006{v\u0016VL\\Nj9\u0017Me\"Lucp۬\u001brE\u001cȭ\u0014\u0016\u0003i1\u0018^\u0013?7CP<ǉ\u001aUp\u00104`\u0019'\t}/oyV\u0007\u000b\u0011o ꤇``t_s_Kjc?q^+\"[@\u0018Z]D*\n:T.8,Ó#}b\u001aM\u000e?4\u001bT+f\u0011<*RZ\u001278\u001982T9!$rO\u001b[J/\bС7*+s/:\u0013CT(\u0019ɰ\u0000Ͷ\b[\u0012lBZROˢ4Fsɏˣ\u00033c(&4Uz\u0000\u0003\u0016X\u0014\u0004\u0004Th\u0018\u001a\bEM:\u0016\u001e8D\nB@ X\u0003Őw\u000f4\rO`b\u000by\u0003CS\u000fDl%eV\u0006\u000bށYu>n?׉\t|\t А\u001dPI\u001f\u001c>uP\u0016#Y/^\u0003FM\r_`\u001bpub/w\r)\u0006U<r$nl20v\u0013g.S\u0017\u0013\u0015,LM݋wF<~\u0013N3{]u\b.k}R|)J\u0018@3\u0014\bH&Eu$lT\u0006X>q\u000fNO2tC{\u0015HG\u0019\u0007Υs\u001b,f\bdu<\u0018&^.ݰXdА\u001ejxL\u0014(]#,SO\u00040Rqt|5X_Bx\u001fP\u000btX1qa)\u0017t\t\u000e\u0005%\u0003\u0005\u0005E\u0012ՄJ\u001b\u000fU\u001c\u0006Ewa\u0002H1₱\u0007φpʂ\u001e?\u0002<H6Ia$󧡓C*R\u0012@)Wy1\riN\bk6\u0013;\u0014\u001c \u0010/9î\u00179}S$\u0012\u000b\u0015\u0002Q4+Rg\u000f\u0016Zth\u0007\u001a\"W\u0010j\\k\u0003\u0005 \u0011\u0010#\t*Τs7 r\u0018\tL?v(\b\\6`u(6 \u0010\u0001\n3\u0014CæoylaX\u000e\u0003+V\"S\u0013.W,s<*{`\u0003, K\u001aC0&\u0013\u0007QZ.I<D<\u000e\u0001\u0011!Jx}B\u0002Q]v&\u000b\u00136\u000bIV\u000b.\n&xc\u0010i\u001f\u0006-\u0006q+%03\u0007N\u001e\u001eοw\nV\u001bF,H\f;\u0004;\u0018;f\u0004ںSQvv\u0014\u0007\neb>\u0007\u0006Uv\u0000Ǚ\u00048j\u0019L؈)<A\u0004\u0019\u001av\u001d)\u0018سO;y*9\u00024׳I،8\u001d#(\u0007\":\u000ecP=xl\u0002ͳgF\u00157\u001e\u0005-j\u001c)\u0000`WM\u0005w7(\u0002\u0014q\"uY)Zϻa6\u0015p\u0010OKP.CǏ\u001d<UT\u001au]U\u000bq)\u000b8z\u0019\t逸ͪ\nF(\"RTA\u0015y\u0003{бFaD/N\u000eΫ&tsIn\fMB\n>\u0006\u0000\u0006QlsTvC3\u0015HHj\u0019Uh\u0019#'\u0014|𧬤\n,A@6XͭaK\u0011Sr\u0005Cmo3)D?BқF[\u0011_;K\u0011\b\u0003@\u0003\u0010ߞ~1}s'|\tDտ7(ʚa\b4\u0006D!R٥\u0001_cJ\u000fub;6\u0005O%j\f+ɰtzݜ3\u0015ȵu̈JW <}QR4p힃'\u0000\u00133<\u0007?4<yކ\u0018/}9$,6U^Z.{\\1/K'g0\b\"cBe)\u001e=U#~tH\u0003\u0017sôq*3*կ>?UF}Էu{6\u0017\u0007~j\u001bӥI\u000f{\u000bW楡QY|1G\n\u000eb0%x\u0017\u0000!(t<Cow\u001euѾψӲ6\"\u00113ߚv2ĝv\n\u000f1yM\u0007\u000bE\\\u0004͸:sb\u000e\u0007\u00018r;Z\u0007bN\u0011Z8{\u0004\b\u0003PhrK\t[\\+XNe\u0011^em 8\bB\u0014\u0001E,+\u0017\u001f\u0002?\\_J6JTBA*KK-Nǭ,YChn?G婜EН:\bJzbm$\u000e%bu8N6\u00138!\u0002`#졌\u001bp>G{\u0015>)k6\r'ֆP&A4\u0001F\u001d9\\sh\u001bY*BL\u0004Bs\\=ʢ\u0013*\"/ \u0006㦰v潿CZu)`\r}\u001fAf9aӈ\u0019:\u0002a9D[ ps\u001c>z\u00039c;tU(,lru0\bw\u001fk3_獏\u000f/Ǖr,\u0014O|-{/Y\u0011;3\bm\u0011_feC﫛<Y\"&7_\u000b[^x.[5ϵ!H\bc8X\u0005H\u001b\u0007S<5cDv\u0002\u0014*\u001d8\u001c]s`\ng$jj<\",|JC\u0006\u0019<\u0006%m虳\u0011u_I\u001bkyҟ.*c\b\u001ah\u0018|m\rQ ޒe/[\u001f\u0016״m\fxro?a*\u000b\u001e\u0016>by\u0004kL@\ttX\u001c\u0015X]Wt7{rP3D6\"pɬ0\u000fPG@gC׌1|tP$>\u0002 >@T.A\u0010wh&uϦ\u0015B4(\b8KL\u0004ބ?u'2\u000fknC ph\rjIEKZ\u000f4֤\u0018F[\u000b\u0019\u0005\r3'Ýk_l1 \u0015;3g\u001f\u0016Coz\bi;\u0015NUHVLwq)*\u001b{\u0004i3(w#N\u0016;x\r!,\u001fР\u00051\n\u0001z\u001e\u0000EKq\u001b^l\u0015\u0011\\+\u0016VK8W5Yeiu\u0000\u001colހ\"c;^l֚\u0016*h\u001c>n5`sy\u0018&?~\u0005%lm\u0014\t67/فm{\u000fm<(&Q\u001c\n\u0011%f=U\u0004.tư ך3nȞ~Ϋktv\u001agЭ\u0007\u0014'H|\u0001||U<a\u0002y:\u0010\rI\u00043<\u0012gI?(?ftXy\u0012|\u0012\u0013$\\\u0003\u0018\fm/^nS\u0012\"FIٴ*\u0011\\\u001eLZ\u0006\\NC\u0004ñ\u0015L$FZS\u0013:Ŗ\u000b\u0003̓(8Ü\u0013OBtW*\u001a\u0015.TA9\u001c\u0002\\ї^vLʎhZ\u0004\u0000ҡ\u0017fL:\u0012\u0017gFbZKM\u000b\u000e\u000f~~U\bV\u0014lf\u0013\u0019gS;c6W\bD^Z2Euǁ-eu\u0010n%a2\u0018\u0003lpvVCބFL\bsu\u001dOCzd4S\u0015u=Ԁ%X*\u001ea\fWH\u0017k\u00136\u0004\u0010xw\f*\u0013eI\u0013\u0007;qڐR`\u0006>\u000e\u0012W[\u0004\b\u001e1hJ=ik\u0002\u0000mRf/o\"ʇ>G\r\"Nf,8\"P\u0001Ԥ\u000bas\u0013п]ư\u000bBE\u0007-T\u0005vH}J\u000e^F1O\u0014\u00022w.b~ީ\u0011<\u0005\n*\f\u001dq>$[I`ו`\u001f\u000b>EOj$\u001e0qd|\u001a~l`\u0010{\u00001}XMsI\f\u0001!i\u0016ZI\u0006\f!T̛sRe\u0001qeaN\u001b\b#\u0003WMbW7@j\u000fQ<,+?cঘ(,sK&3\u0010\u00193Vu\"Pg\u0014&Ð&\u0005`E)3#9qs\u0019b\u0014uljWᵆE_Xc^K\u001a\u00052}\u0014IYsV|(\u001f-\u001d .\fN#'H\u000b\b2M\b>m\\@XW3\u0005\u0003TH.Nh5@ȔyOy\b\f\u0019F^\u00009vQc6Yv晤r\"-.fg66\u0010!\u000f>\u0006܆m:|kC-U\u0010\u0001\u001b5 \u0004|Fo\u001d\u0002%\u0013\u0015\u0005`_\f\u0019C(ו(V=FCnCy=WG\u0016,dM֡LΞʾf]\u001e\u0001#z\u0000<ii\u001a\u0001yK2OG\"\u0012Ĥ\u0014aM`\u0019Kck)m%\u000299p\u000eyE1\f얧\u0018\u0007=7Գ\u000f\u0004\"_\u0017\u00009\u00056\f\u001c\u001e8XJ!ކ\u0019\u0015ָS\u000f\u000bH\u0014G\u0016ab!~}R@\u001fl%22/zz\nT\u000e\u0000qߣ\u0002-Ȕ~aF`\u001c\u0017TcY\u001cR\u000e\u0013O\tNk'揩0a2\n┎a%\tڥMJ\u0004d%J88DkUT_/\u000f;W6\u001c&8?\u001f\u000b57\u0012Sꬖpw@?\re\r2fU3YNYL\u0012\u0002k^\u0010bWq\u0013d(l\u001e\u0011\u001c&h3QDϤGy˒6/x߸Ė.Q,\u0006xqs$Gճ\nvFs]\u0010F\u001b\u001bKq5M?\u001b\u0010^\u0016O`٣\u0014)a\u001cc-\u0015\u0017\u0016\t{;$\u00170\\NLldj̑✣\u0018Y\u000e;\u0015%:D.6!6cO\u001f\u000f\u000e﹟\u0014qS{A\u001fȮSE*Mڬ??M/:\u0014\u0000̴X\u0006m~X\bt\\#\u0000\u0019dM~{>%pV\u0007\nv#\u0010;6zg؄\u000e|\u001a>$pʹl\".z\u001cJ@F\t$)[1x\t9uP\u000eͿ4M8N:YU\u0013M\u000bEct`[T\u0015Oa\u0001;=g;\u0006X7_X)0\u0012$i:&MTzPm\u0001{afewp(q󨘃%'XMHc(\u0019r9\u0005^4\u001eǊt\u001b!,R\bܸm}oN9g\u0004 $\"*\ncH!gTY>J\u001c/)tZy\rfI+2mƗ>=\bHW'I2r\u0019n\u001f\u0004H\u0006\u0017U\u0007C\u0004\ttuTOg;Ъvx;8gNnO\u0012df\u0003\u000f\u0013\u001fNp/d`'Aҁ!x,_\rv\u0019\u00042$5y_$ \f%\u0016Ss\u0005Oa\u001d`\u0006tt@\u001aE͡\u001e]nY#u\tǚ\\0\u000e<cj|SQ\u001dkѲ|(p%b\ba⠝k\u001c\u000bw~j\u000fDo\u0004:8'yjI\u0011:س\u000fPuFR\u001f\u00021TwV:)\u000bྪ^M;cݾl\f\u0017㢳\u0011L+\u000f\u0000JhYwU~Z^$>\u001c)!\u0002k=e8y&E=\u0005\u0016bmĽ0\n'N'-\u0013BW#5\u0000Ӳ\u0017)>@\n%\t\r}\b7\u0019I\u0015w\u00191\u001a\u0018\u0012zޠzk\u0002\u0001\u001cʖuC$\u0011\u001a(k(E\u0014\u0001MB\u0003\u001eQ YDjSw\u001cQo\u0007xYꏘ@̀=~d\u000f5hBVꄍ\u000fd6d_H-X(aS8)\u001f?֐etk\u0013\u0005r\u0004I93Q\u0017x\n>7(3ZaIGnQ^WqZ/\u0005\u0005FA\u0005k\u0003\u0003\u00196\u001e\u001fT=\r\u0018yI0\u0019ʪA)^\u0015=73bҗ\u001a+^Q/L.3?\r\u0014\u0019+y!͍AWr\u0006\u0006x:\u0000Qx\te}\u000f٬I\u0003\u0016d]\u0017bnH\u0013^|\u001e6\u001b\r}\u000f@R+4kf)\fX;ᜂ\u0011+%3K1\u001f\u0014E6Eɾr\u0001ѬXV,\u0001X}U\u0014] %#\u001aa,H\u001dg=jG #}Ӷ\u0014~1\u0006(\u001aq6GA~QJH,x\f\bK\u001daCnzj|횖TG\u0015(\\@D6S߱@M\u001c\u0010+)SOIվ(W\u0005{K\u0013I\u000eG9,Ӿc\u0015\r6~2-hi(\u0017OLvaq%g\u0013FU}Tw=DL;yyƨ{s\u001d\u001fK` kJ;^0W\u0002\u0015\u001aG-2d*^*Qᕆ]H\u0014rW6Ԃ1\u00044\n\u0015\u0016\u001d-eӅ6Z$\u0007G1C\u0010-\\ya\u00022\u0003qæw\u000e\n)06=Rxby\u001e?\")gP]Lz\fҼ\u0002\u0013[\u0016vl,GQ&Y=\u0012V\tGiSAĄo8M\u001cwDX;lqkԆ#KȒ\u0007-\u001a\u001dYVF7\u0011\u0012t+t!\u001e\u0002ܞm\n7\u000bb6UbRV\u001f\u0006u\u001b[):\u000e+9\f_!/}:a,w{;tyz5q[%cЙYv¼$\u001aƚ\u000b(u\nJgIp\u0019x97oʯ\u00191PԘwYE\u001cKk,m{:\u0002>\u0015P\u0003FD\u0015\u0000.v\u0003d&xۖ7zHٲ]DY;{j\u0000ij\"I뱶<3$oLTv\u000bel\u0003WȤ)\u000e~ᮧzFl],\\Z\u0012k\f3f\b\u0010\u000e}9\"\f\u0018H\fMU=4M1g7c_n\u0003\u0005\u0007\u000fJ\u0010G#0\u0006m\u0006t_Se7\u001f\r\f`2\u0013'&P:,Pz.;evI2\u0013='h\t\u0011:jUF|(\r\u001el\u0005\u0000Yd/\u0003D\u000eb\\n.q4Q8#Z'w\fsA5QF\u0010\u0018Y\rr)\u00107\u000b\b\"|\n43))e_?g\u001f\u001fN;)T5b/qݏ\u001b*Lq\tW)\u0015yC]RajS\u000b\u0013\u001c;E%'\u0011o\u0017!?tD1֕>#ӕ@rL%\u0019ΩsZ2aY\"\u00028Ͽ\u0014\t`%u<:V\u001d5Q4y3x\u0016\r9\u001a\u001c+l\u0004\t'NNB\\lŦظ#i <`2?{٘m\f\u0015Dgta.=k\u0001uYm\u000bl\u0013Gfʹ\u0013٬3r \u0002w\u0015y#\u0004@6\u0014\u001a\u0015^V\"O\u0004/BU\u001b\u000eN\u0002,k\u0019'WfV:\u000eyh3ys\n|pò\u0002Jf\\|4.Q,_qI\u0015UR\u001eY%\u0014_\fe\u0018};\u0001&\u00042z\u0013d2)\u0006\r\u0000OC\u000f3&ђ:QGLOr]{9wiZ\u001esM˜~c*}x\u0010R\u001e칙\\r\u0019;pƯ\u0017zCF\u001fM\u0017848T6O,N8\u001bK\u0012\u000310\t+Ћ\u000f&(7\u0014YRY3\u00129NPz.J}z\u0014\u00113L'f@oO\u0015Ae.͘d3593\u001e#!K\u0016\u0000+)ʯ\u0000\u000f\u0003x\n8*g\u0014f+F,Qb\trf\u0010=\"D\u000b;3)QJ,ubSe;WX^\u0003f2\u0006\u0013P28zҒeRQ\u000f9(,\u000b\b?pIaCŽ\u0010\u00010YX*\u0006Lu\u000e\u001aQ\u0018?)B\u0017c=\u0011\u000bW/U4#\u000ehxGl͢J68|G&\u0012\u000e\u0014<.~{P1\u001f\u0017ft\u001e|gg{SR@|\u00176n\u001b\u0019YI\u0019aP\bJspj\n]P'.\fN\n֪+>s( 2ѥFz2]VkZ$ [X<'$N|E|}'\f\u00026sBI.{!ʓ3\b'vu)&\u001d^g\u0010\u0005Y\r\u0002@2Ӽ>i\u001d\u001aCf_(&\u001d'[ggfWC}|L\u000e+\b-Ģt\u0001Aΰ$W'\u0001NE\u001aWP,ªC:4T\u0012S{&B]4kRy\u0018_#^y5\u0013\u0016ر].\u0018Y! \u0014{\fL2_\u0018`K/kA<\u001e-1Q20rrL\u0007!APڡf_Sc\u0011~B\u0010ԉo/\u0010\u001cZ\u0000v\"9\u0011Z\u0004<!z\u001e\u0001@)\u0002aaAHb<\u0012AN\u0001\\\u0002sB\u0016@\f\r6]\u001e&y!xmJlzw\n\u000e|t)\u0006lPypn\n-5&\u001f\bv)Q\u0001s\u0011;q\u0018}t1xiֵɍh\u0002\f$D\u0018\u0005\u0012֋F\u0013=3\u000eo\u001c7\u00077\u0010?rnre\u0006\u000esOXrH\b\f@լ\b\u0013\\\u0006rt\t\u0004|\u001d4{K4J\u001c\u001a\u001c(0V)O\u0001Jeu_$$\u001a4KLY4\r\u0018UBg\u000f0fcNK\u001c5\u000f.{1s\u0012Xj\u0014QzePU4\u000fwwRlO\u001coԂ\u001aǒqfd\u0006W\u0003\n\ntؘ\u001f,VZ\u0019oV.*AOhƨm%3/tB2bg8%\u0012l:\u0012#\u0006O۰*K!yM]ЀaY\u001fc,2ΜTآz@MY3ٰ\u0015Eh/\b\fig^f`M\b٣\u000bt`\u0003\u0001M\u0018J\u0001MK5\u000e>\u0016j2Z(\u0015\u0001J\u001f\u001f^*\u000b#vf9%H*nPL)?+T\u0016QǗep\u000e\u0010`$v&zdM!J\u001aSi-9\u000ba\"+\u0000\fqNϼo\u0000%(t\u0013\u0013(\u0010z\\\u0014+\u0015X;)䚖1bS \u0013˦ʧUjS\u001e\u0018볛$\u000e1\u000f.<\u0005JB\u0006;[xu\u001fۚXݭHh|%>\u00006\u0001jQWRBb)j^Ø\u001f!w&\u001a03L\u0018Kba\u0011E\u00138yǡ\bQ=>FZD_KIjl\u001djr!&DARWx.\u0019pLFZIL,\u0004\u0018\\Ǳ\u0013\\{\n\u0000\u0000\tЉ\u0016cU09Jy\u0000\u0001f\u0011/\u0003\u001b8z\u0006\u0003S{\u0002ҵA\u0019M-{P\\\u001b\u0006$&,\u000bX|\u0006p{(7\u000fnC&ѮtyY%\u0015v\u000b\u001f0\u000ea\u001f\u0019-\u001b-G^KP\u001e^r\u0005(}x3\bRT$\"N{M[[8s\u000fcȢc6\f4Fb\u001dKIc\u0017l]fgB@hTrҫChRgV\n~D\u0015T0\u0012\u0018\u000ej\u0007w\u0017g-=S3%\u001eN\u0003M\u0013[,f\"vȩf4L̰\u001aOA%\u00102SFa\u000e-0=ɵ\u0002\u0003.bb.\u000fv\u000f\td\u0012@(Mw\u000e2\u0001\u0002\u0003\u000bP$aTLt<ly\u0003pheF A\u0016V\u0012sK'\u0018<\u0007F%U!qx\rB*{'\u001e\f\u0003(բ\u0000oLPc\b.4Cbm)#1!fTfzԼo5Pf.\u001d\u0007bpz/\u0019\u00171\r\"@vQ\u0004\u001aLJa-C\tJz\u0001\u0018rbdq&h{\\Y+>\u001fɦ\u0014\u0000A8 l@\u001eC\u00061$!ƹezC\r\u000b<R3b\u0007zQV@&\u0019U\u0001$k\">&|݌9tK'~\fik\u000beL\u0015@!I@92%\u00111\u001cѨ$>q:z\u0000fч+?:\u0014Ӊ\u0019Kk3/,eN;sj\u001b؇\f+s\u0010پ3\"-{\u0004]\u00173Qr@\u001dZp\u0001dU\bN/\fp0'!0K\u0002y\n-\u0000\u0007,7N-iy\u001e\\Α\u0006R;kmÉ`R\u0016O+\rd\u0010\u0007Myz\u0013OT\u0018/5P}?[(H@+\u0017'iˣ){\u001fCh3yITO,fݛb] \u001bIe^ժBD(/k\u001cN4\u0013\u001eB}5\u00166f\u0016=b~%GJ\u000fd\u0007 c8\u0004H.vWcFg\u0007\u0012]&\u0012[\rd0nY\\}\\`#>PH\b|2.#CoηLJ햀S\rV#*n~Zeiq+2\u0015ThE\rEfe+=\t\u0015#[P\u0007Kf\tc .\\∾\bB\u000b\u0005V_1\u0007{r!\u00145-24!f_\u000f :\u0005I)-$VNb~h\u0018\u0006kYʔvk\tKD_q\u0001\u0003\"\u0000@\\ʎY\u0010\tC2/\u0013͓&\u0007l8u+6oW\u0010`ퟆ,q\u0007@\u0001<tg\u0016ɞeDJM\u001c\u0013tg6Р\n6ĕ^,\u0011(h%)&?\u0007W\u0004b\u0006R/'\u0007\"AU1\u0013[j\u001a\u0019I|6';`D$<qz\u001a)(\u0012yz1;(҆@\rEe\tsL%U%{syfSyv%&K]B pp\u0016@\u0010B\u0016ت\f\u0010Z4YA1d.c\fRp\u0017.IÁ\u0012*9Y.{:zi!KwK|ݛ~\u001e\ft\u0006{Q\u00048N~۹-7B\u000eYC΍,U\u0007G3H6+\"d/Ok=,\u001blIf:kJ\u0019#Sʀ'\u0015}?TWlHvdg!}VK%Y\u0002\u000f$.bTj{4M\nIl\u0004<맸hh\u0001`DMfi!;HdZЃ\u0011!\u0007uv̫\u000b6t I\u001ftsENmO\f|\u0018zn2U]BVR\u0001_\u0005=NTS4Ӌpai0,'|֣>Efj\u001asc\u000b6v2\u001bgv\u001eC\u0014d2yB݌\u0012ƠBLV\t\u001amvF,,d.\u0019kO|\fYN\u0018EL!χXe|\u0011\tX_jX8PCJ\u00189j%a$\u0010`J\t\u001f\"/!wX\u001cMSb\u001c\u001e=j)3}\u0006D#l?˅:ޚ6\rO\u00050\u001e.>\u0002\u000f25\u0017(eiS']vX\b\u0016cNhd=iX`2k\u0006\u0007i\u00194&\u00112RV\b\u001d&0_ۤ\u0017`EIi;xx~79\u001a1\u001a2t4^Z:c\u0011ی@tꮩ&|ܸϑ\u001fXBk@+Tyg<B\u0005`'6^Ο\u000eD\u0016=Ʃ\u0015M\u0013\u001a\u0001\u000f+\\r(P原U\u0012Btcg\u0007^D\u0005\u0006?^MW,y'\\Ѧ<t\u0016ܿB\u0006A%ўن2Nkf?8\u0004n`\u0006\u0013ؕ\u0004$C\tL\u0003=dF\u0011چrKBH\u0007ă ՜\u0000L⩰YЪKs_`:P\u0007#Vz5\"teWJ8\u001bНuMFbn\u0002+gH\u0010a9?Do\u000fB~WI\nGuhBR]A]\u0013\u001aLŔBu˸B\u0001\u001fOOrl>v4Q%UDu1P\u0007#KVX\r<M>\u0001a,U\u000eQvCGJ\u0002-\u0007\u0002@6顿i\u0018ߍ2I;\u00103ivL`ŪL\u001a\u0005r\u001dU\u000fFX;\fN\u0016v\u0007\u001dO睤@\fҘDw@-\"ڌV'-\u001a\u0000BX\u00041/Wr\u0007$(0y \u000e\u000fSJg3o\u001f\u001a\u0012!HXvlͻȥ 409\u0019vJ1ġ#7\u0012ձk3bM%?v:(<\u0002\u0019]yWA+^x'*x\u0006[b+(\"hM6j61Id-`>\u0019B\u0010\u0015\\@`\u001a'g(E\u0002wزWiвKP\r#Cv\u001c:y7\u000fY\u001eʰv(e\u0003%Ss,|&#AQN3k#4\f\u00160Ԧ|\u0015+]dNp\u000f\u001ey\u0001lOהA\f)abL*m\b8\u0018-K\u0007ゕJEHfh~.\r̒\u001c2Q*2#{\u0013l'_NEҹ\u00003Bf1=\u0014\u001fa\rqC2+\b9\u0004f\u0013Vaddz)VG\u0003\u0010y!D5\u000fMɉdP\u0005V\u000fB\u0004d$>mñ%5\u000504)&:Mq6q\nIh\u000fW\u001a(\u001frL\u0006]\u0017QSڑ@<+x*r\u000f\u0012S\u000bBM^R@;},<\u0005y3)i7[S^[Wz$kb%C\b3\u0012>&<:g\u0011fpס:h9C\u0015$\u0018\u0015!'|NvHfz-@\u001c\\aJd#I(!\u0013\u001b\u0007nYS\u0016A\u0012\u0010&aӱqV\u0001HY\u0013ܶ&ϕ\u0000\r\f>\n5Y$\u0005\u0005.d:Ĥ&\u0016r_Uc\u001bfgyn.^=\u000e\"+\u0018-=R\u001bdfKNJn04HIOi\u0011Ѓ<\u0010Xfcg\u0011Y\n1e\u0011!\ns\u001f\u0005P.ynJ\u0006\u000fa\u0001oU\u0004g! I\t\u000f\u000bQAܩX\b:TSl'j\r+7β\u0002o\u001aY.a\u000by1ڒfED\u001aP\u0003L{@Gf'MN7y\u0010\u001d2*Mov~1-\u0011:X\u0001'\u0018X5e_2+SK\f\u0010#\u0016NĢB,T\u0003m*T)~(\u001eHn}VJ\u0005\"}\f\u000f\u0011:HiG;NT5q\u000b\u0001\u0005d\u0000-DiVK%c/)ZP\u0007݋/\u001d&(XK<\u001d_x29||=\"X\tIS\u00046\u000f<2.ʬ/s\u0014p\r`Ix!S\u0017ĸe\fЕhW֒E5\r-5\u0017<,˧\u001a>)ޗޤ\u0012EàSIJI3zH\f\n:Uv,\u001f:\u0019\u0013\u0013\u0019DUpu(\rٱU\u001a\u000e\u0013\u000eP\u00143e \f\u001ctvP\u001c\u0001\u0011tMz\nc3\u0005y\u0013\t^$'$\txO.ZBb{J\u0012\bX\u001fB2e^.:ʗ2%\u0010Ӗ\u000e\u0007(+;R\u001ezG\u0007޿mN\u0006F`BZVF1VjȀ'+7K1#\u00186R|Rs\u001e\u001e?u\u001em\t\u0016D?\u001d\u0007qy/Gg_D%R&q,s+戌:\u001fB\u0019'aȱ\u001a@\u0017j8)\u001dqf\u001fҒ\u001f1Yޖn\r{\u0007Q\u0007\\\u0014\u0014D\u0013DMx%\u0013+yM\u0018l\u0000ŏKK\u0006\u0016%0C\u0003\u001e\u000ekiz\rKL\u0017ٰбT3}EaD2+\u001e\u00043Y<W^k764O\rCCؑM\u0004j@jsl<!cSQq\u000b]`\by{2F)Sxr+L\u0011G\bj\u0016\u0004\u0003S=_m5.h\u0001\\S&rR(:o-\u0013\"PeLQ\u0013ި:qZ\u0019C_cJV=+\n8K,Y\u0014t/\u0017]*B`\u0016E\u00121zBDmC5-\r\b\u0003(\u0003r<X֜>ꎓf\r\"\u0019\u0002OXN^yf\u000b>YM(̏MU\u001c2\f8Gu,o@\u0006H)THr\u00015璭r-\\xM@o. 7r\u0019\u0010mdcfT0< ?\u0002'\u001cx34KJMO.vTY\u0003t\u0004%\u001bbt'_I(1hJ\u001a=>\u0011;sz\u001b{m2=r\u0005\t\u0019qjeC\u0017\u0013f^6D`)#8x:'Yݱ\u0018SJ\u0006Y\u00057K#]+f\u00158/\"k\u0017\u0014\bYP&˪6rlذcc\u001bJ\u0013u%Qܲwh[dSz}֒\u000bGҀ־*\\\u001b&Y\u0002lTe\u0015]ʃ\u0016U\u001d\u0011\u0011X\u000fRLo0J8\u001a\u000en\u0000Bt\fVMuEe<YcQ\u0002Π/?14\r%yV\u0018K \u000e\u0011\u001f)o\u001bw\rIZJh}\u001eIeZL\u001e\tD\u000b0\u0011(E5jn0_\u0014&+\u0017{kMpbCR\u001c\u00000&\u000b\u000f/!ڠ/\bTX#]\u0015@>>w\u0001J\\r(0Aa&D.s\u001e(rP$(\bf43'[6,䣔-#}wNdK>TܙPq\u001a6U I'*\u0010,L\u000f.\u0011,R\u0019\"xv3.3&St@\r\f:{px+٤nrcO\u0011~ƿTR['^p<h\u001c\u000eFg_K}SCs vKYW>,+\u0015r/4\u001b\u001d@\u000e\fk3c\u0003w8TĻ\u00145\u0000S9\u001a\u0006>s!\u000fK#|P\u0017v\u0000\"d\u0016(>\u000e\\YObs\u0011\u0013r<4a\u0014\u0018g%\\\fb؜F\u000fK\u0000s=p/Ee`>\u0000뼁/WQ$9mA\u0013\u0002\u0005/8\u0013\u0013bG13Ѫdu\u00035)q\u0018\u001d$\u0004\u0012K^\u0004\u0011\u0014d^\u0002h_\u001b ,R34e1+)ңy~Ӳ\r$[Wd+ 93W:m5\\2#\u0018\"]ׂR\u0000+Ͳz#Aٝ%5\u001bJ޳\u001d}=KlTTn)4 *UF@+M,Au5E\u001e5C}\u0000\u001dzC~!x*%BݤǠ}$3\u0002\\/\t)#I\u000f^\u0015\u0007(mAw2J~\rk\\\u0001zsst\u000eo$D\nȥ\u000bEI=B~KF._>\u001b̷߫\u001aZ\u001fҊ\u001b6mC\u001fÈ\u0014 \u0017󮱯:\u001d\u0011=\u000e;D\u001aV_7\u001f5A:\u000fM\u0012Y8A}\u0011\u000bL'Y@\fInn\r#\u00103NFS\u001a\u0004,71\u001cG#):gļ*>\fʝV\\ee2\u0007ZR+\u0018֍\u0010Į7;\r\u0007#܁\u0018OJ4;A4L`xe8UE\u0013\n\u0011}04\\K\bQH~w;\u001cc\u000b\u000b/xkϠizQ^\nz -\u0000fdb\u0017\u00010pK9vձim߯/\u0002=ow lX19xqVN]\u000bmLCg\u0014`0Y6^\u000b\u0016{L0B\n)d\u001c\rq\u000b\fV`\"\u000b%6i'q=qZ2-\fwmoSñAT\"^.\tXz q\u0016NǓdg㭑B-\\vM>.k\u0004}li\u001e!Qh\u0000.)_/ڊW^E{R9c;\u0015W\u001b5b9=Whʳ|X;<75I/KƟُ\u0011\u0016̓iZG%/d4\b\u0003VPF=\u0019fc\u00028:3e$Ec?)P\rȺ\u001a\u0017\u001eg\u000bɴ\"oIQ\u001cy\u001aj\u001f\u000bSU8x\u0002:Xȧ\ncHJ\u0000\u001c;\u0015Fߑ\"̼%d\bZd\u0003y+k48S5ze\tt\u001eOސ\u0016\u0005b\u0017\\6PaaP|H\b0㠔Ic;4P4\u0011\u001f\b$}@$h\u0002HEèW(\u00176>|s[E˼\u001fɕ.~j:\byݟgH\u0000P\u0012y\u0006} \u0011\u0001a\u00160h!o\u0005\u0011jx\u0015\u0003\u0017DsZ\tU\u0003 {\u0015oO\u000b1C\u000e@FD\u000e\u0018_\u0012`P\u000e\t\f4[ a39\u0017\u0003:7cyK\u0001ح\bܑq\nA\u000f\u001egM\u0004\u0016],Ƥ̡\u001coe墘8PK,9KV'Z3\u001a_\u0014Hו\u001cy\u0019wr\\z|yI?&WI\u0015\u0019#\u00042V\u0012R'\u001aWwX$\u0016QS\u0018\u0007/m}\u0015\u0014հ˘\u0013 +?PB'\u0010\u0000A\u001aU\u0017G}y\u001b#\u000e\u000bb=\u0011\u00195\u0005)3\u0012BdS\u0015\u0005\u0006\u0006\u0019A\u0018\u001e2C\rX^;=\u0010G\u000eSKɠ\u0017\u0002|i>Polێ\b\u0013%,3Y./3,I*\\cEe\u0000G*\u00043h\u00132jQ\u0013Uy-#!>8\u0018\u001e7\u001a\u001c\b\u001a$v\u0004Q:ð,l\\E\u0007E\fNPё(\u0018c\u0000B޼V\u0014sEߦTl,'\"/\u0011\u0010\u00145(`\u000eEnrJJ\u000f\"m\u0006㰩`8MWZ\"`rԖZ]}{ga|C5\u0001.|xXW\b%ń]\u001e'\u0019'o-I\u0002\u000b|7Hӈ[ߑX-GH,x\\`?d8h܏\\~G2\rYuYV~\"y9\u001aī3['֘\"\u001b\u001fCbHd\rxy\u0004\u001dScTIcqB\u001a\t\u001f`\u000e~:\"YHe\u0003Q\u0011\b\u00102<٬u}N\u000bNx˕>%\u001ckn\bhzcT1<\u001ac\u0004A5P\u001bMO KLJ')^\u0011\"1\u0010HC>ᣒ$\u0015>+8{A`F62 \t \u0013P8>\t?zEMO̧)\u000f~\u00033B͘1-1>\u0003nԗS^-h\f9\u0018͊K9\b+L_\u0011}_\u0002U\u0002*]3)r\b\u0005\u001b2\r?!sf\u0014,'V\\VdN)SF\u0010\bf\u0017q\u0002\u0002\u0002S7ծsiƶmm\u001e\u0019Kh\u0013d%a˧l\f}92}7L);=3sǷc1WcnX\u000erKD;\"sɭ\\&tϜbk\\Rd'\u001cה\rn<ԏfZ^\u0015kIU!_O]өF\\WR4#Jew'=3ew;\u00173rob^f8\u001emfoZ8\u001f\tVWFfzt\\xeUHtt$.\u000e\u0015G\u0017ʆǢG,\n+U\"9)1\u000eVߠB\u0014D\u0011^ժ:1KƎ#t79CrY˦]\u001daŨn)UQ:L\u0013J34-fk<k#]O\u0019:EO4J\u001d;ht_\"Zd\u001aJ)\buڏ8<\u001cKl{ɞT<ܜglS2#7Ud/\u0019\\D;\u001ei\"XusC~ؗkk;[\u0015f1R\u0013+6wuo4eV}zh)s\\<\u000fJ:sYknӕfv${d\u001annak\u001eM&v\u0017<\"\u0015S#7Z'\u0011J.EgHцs}d\u001ac\u0011ԕ\\ZT:l\u0011gt쬖UfsD+\u001eF,+i\rݒ<ވh\u0012\u001e#X'-\u001bM\u001f\u0019I{1DSeϨ+jlƌy~\u001bU<Uь\u0015a3M*\u0013\u0019ZK8<xf\u0015_\u0016͝n\u001e4-ի+b&$n،Ǭ%w4H'\u0005Nxv2%D4lW\u001b:쏺h绾:\u0013V=Sɨ3;<:\u0011NB\u0018]\u001d;F7rMάw7w%ugwg\\*W՞?~F*O7G\u00129Tz\u00195VS\u001dRƊP%^zޯnՙΐJ+\"--ZZӐ\u001a:$CH)=꽽!\u001d솴wwd'3{Jq\"$\bk4ecI^;=lPM?\"[~9X\fo|\u0006;%N-\b{ӯ)뵭yrj\u001b&g6XU\u0019Z%BfyO\u001bjtu>mzfZJh.bt\u0015\fRȵߩf\u0018Oji\u001dW܆^;MN?\bH{m472Rմ\u0015&kں2Hm\u001bcU\u001dy\u0014Vtz3su6bB--sYI\u001aHN\u001by+ʭX;5y=;ӛ\u0019KJ5Ψ9:C̻A%^kDDkI}fSk5\u000f%)FhfTYJF\\mC~5ֳPGj\u000ff\u001b[γJ}nn9OZT\u001dՊƫtz:25%\u001aّٕh%:&^ֻj\\U8B^c:6׫uiSш='\u001dRRIwhs)\u000f$uɓ\u0012z\u0014\u0017\u0013.)1O&'T\u001d\u0011mjZg\u001e\u0016ބ}+AKfvԺlnrk*\r6Zӝn].\u0007!\u0007C#cCDFlgVƵ뮃PY:\u000b=\u0019M.\u0016}?:2b_h^q7IF?K=LFjn{d;'\u001cvݯ\f\r!w:ѩ٠?*4w\fH9g7{<_\u0012O4I!\tU/oL)ÊN7rј\tMU,&e\u0010vrsk3$C9\u00139\u0013YR!l.!\u0014*\u000e7\u000eXh$O27UC\u001f9Q_F4\u0011NǗV\tDRN'Ԟv\u0011w\"Q\n̍cG:\u0016$;6ZLfDf\u0012J\u0012\u0019'jV܇JM\u0013\f|?Io\\#[e>F?)&φ5|=5D\u00120jvRm&u,EӒ:-i/K>RRJ\u0015*29Kh*!֜M<֎?YvR7DKz Y?$4\u0012M#4\u0015Iʲ#%B_q\u001cOsr:#آSm1\u001bI\u000fg\u0011QoreY#EdQh\u001aT:JI\u001c\u001axǝֆzr\u0012a)fX%)<oR\u0017چ9U\u001d+.V5ըԌ^iJ\"rwIj-{jG\u001d-ғ'g=\u000fmP):s#R]_Tx\u001d\\\u000f^nA=\u001arR#\u0013\tHs,[Hn-SE&Dc$[׎X#1>\"\u001awe1K\u0011YqWb?I(־!l,f2veGw\t\f\u001a(\u0001\tp\u0003\u0006\r\u0018 $:\u0001\t\u0018p` \u0002\u0005\t\u0010\u000e\f\u0010\u0012\u001d` !Bā\u0003\t\n\u0010\u00184\f$&L\u0001B\u0002\u0002\u000e\u0004p\b\u0003\u00000\u0003\u0006-4 JC\u0011H0 \u001a\u0018XNL[/$\u0016\u0006\u0012\b\u0011@C00$Fb9'D\rM\u0002Q\n!h\u0004@4,\u0016\u000b\u000b>\u0006\u0017-jFHk\u0001\u0006:BlP|1A\u0003\u000b.H\u0001\u0000B@6\n(\u0012\u0003\u0003\u0007\u0007\u0003\u0006\r\np\u0005kϴ\u0006\u0013\u0012\bGP](\u00169b09/\u0018\u001al\b\u001a\u0002*D14\fTH@\u0000B\fD@C\u0004\t\u0013Dp0\u0000\u0006\u0003A\b\u001c\u000b\u0005RbC1?\u0006\b8\u001c\t\u0012D `\r\n/$\u0018\u0014\u0005D0\u0004C\u0015GL\u0003%\u0010\nVaH,A@C0\u001ca#\u0011©\u0005bĂL \u001a\u001a~Yh8[ba\u0010K\u000b,\u0001\n\u0001\u001f8x\u0003,\u0016\u0015\r!.p\u0016\b\u0004\u0000j\u0005Ñ,85\u0018\u0018!BA6X\u001c\u0002\u001684 <|\u0006\u000er`@\u000b\u0018&px\u0017 p\u00160\u0010g!f\u0018\u0014aY\f\u0000\u00048HP\u0002\tDp\u0000\u0004\t\u0015$\u0010eЀ\u0000\u000b\u0018\u0016\u0011\u0016`A\u0000\u0007\t\b\u0014``\b\u000e A\u0001\u000e\u0015.`\u0000\u0000\t\"`\u0003\u0015\u001cA\u0003\t\"P\u0001\u0004\b\u001e15Vu\u0012룈a\u0019Cu㻑F͕F\r]Fl\u001bUlt!GE=U\u0014L@\u001b$6BtE3\u001au,S-wnwzzxToǎ\u001e\t;ZVjo'\u0017r:>o\u0002#LP\u001b#UG~\u0014LqUc㗲wf#Y \u001e:<Z8)9W~$v|C,%5|\u001dW&\"3lIw\u001aW.v#+-!\u001a2\u001bˋ\r8\u001f>L'\u0010\u001aWSG;twٔ|LkoN~\u0011sɰcY\u000e\u0019\u001bwލ;nzӮ%\u000e;\u000el\u001ceS]vvԔCly_65kaݝ8(u񨙻\u001a/Sb$\u001c)):\u00113gJ\u0019{gJTVd\u001d%8̈m\noh\u0012\"f:\u001c*㫛\u0010C:<U6\u001fN\u001f93C{lc72iG\u0012ާ=E\fid\u001b\u0002Ҩgdj\u0006\u0000\u0010\u0001\u0010\u0000\u0013\u0011\u0000\u0010\u0000\u00008\u0010\n\u0007D\u0012\u001a\u000bx\u0014\u0000\u0006`F:\u00102Y&Q0\u0006\u0011\u0000\u0000  \r\u0000\u0000F\u0016\u001a9~ݲ\"0KaYYHωCfI0^ב\u0004'^is\u001fF\u0001moo\tam\u0003L~n\u0000\r\u000b\t56PA\\NEۀ3i+\"00Zm!\u0005UЛ2\nc囆\u0013&p\u0001<jL\u001fϚ\u00054=\nY7Ffbc$\n>I}eTq}܋CEo\f\u0016[\u0018PcPn\u0002\u001c|(W\u0017c\"\u001a\u001d\u0012ph\u0010BNze\u0001m(@TS Z_a\u0012ǄyhpK\u0006ҩ\u001ey<\u0019xizBӵ)@\u0006b?\u0005\u001f\u0003\"_j=HN46vh\u0019h%\fKMJ~w\u0004wp_<K` \\\u0010h\u001aK/^V\u001b5E\u0017ٻ\\\u000fqܦ\u0014B\u0015ITH$X\\gY4]Vlt}GDeÄn\u0002\u0000|\u001cu\u0016J<$g\u001f9\u000e&t+K\rע\u0000,e]Z\u0014s~==>zz\u000b1p?mmꝒ\u0004߭W\u0017X>&3[W'd\u000b}\n\u0017]\u001e)\u0013\u001f]L\u0007Ʈ$\u0014^'ԴrsiMAI\u0017&:\u0014j&oN1g~rV9\u0003BDu;2\u0004\tq6\u0007W\u0006JVYo4\u0019ykvK\\\u0015JFCp)Ӗ~\u0019t\t(<\u0018a'_F\u001eY\u0019;'դQ\u00165}H?OJWZL\\ő\\\u0011jPQު\u001c\u0011xyV}\u0016W\r,?\b5F\u000b\fuc\tm;\u001c=P{7W{UO֛XL>z\u001ek\u0006<J_\u0013\u0014ް\u0017nZwMaoWz\u001d7k(v]qvM+V\u001dy+2]t]{8&\u00156G#enrgɍCBv9Iĸӄ@݅s\u000eN\u0016ZoL}\u0006(jF&%6m+\u0006LtAb\u001b\u0005[5\u001b\u001639t;3j\u0004bOL\u0019%ys̱<\u000b\n\n\u0002YX\u001886r)\b𬌜\u001cmbAkߠcbh@yP!\u000bj_\u0011y\u001f\u001fa\b\u001b_B7xIeI֎\u0000\u001dBִ\u0006i\u000fY4\u0010S]e 0{_%sчOQ!_<Ej\u0002z@ݯ\u000fL\"D\u001e?nƻ\u0001~_bĀ\u0002\tE4,e܍\u001a\u0014.\u0013\u0019+\u0007n9\u0016x]8&&05[xG\u0015tL߮\f5k7vQ\b;YךU\u001d뇺2]\t\b\u0019:\u0014~t\u000123܎mn\u000e\u001c3sZ\u0010\"\u0001!\u0018&co\u001bU:pbqrQ\u0014\b\bCAܙp}ý[\u0001o-<i#o\u001e־ҭ(7Rpk\u001fn#_\u001dʳ\u000e\u001a[KJ\u0000\u0017ky\r}\u000f{n\n Y\u00009!JK\u001eEwcZ;4=\u0013Ĩ#\u001dWOj1u0G:\u0017\u001eY\fjw\u0014\u0019U\"L\fpVNgŮtu\u0001:(\u000b9#UEL@tDtM\u0000IF#9\u001c(zܜ\u0002ٸ\r\\N#ϾZABKe\u0015rf\u001d80\tR\u0014?\\.\u001cnQcomC7B\u0018o\u0015`\u0018\u0019vrrݏv5KnV\u001fIs)}iRJۺ!Pbr璗z=\u0005s\u0013#;/*\u0012~\u000e\u000b;k\r\u001e+\u0007]\t<*CiG\u000eA|S\u000e⺊_\u001d:uTz*jcVԕ.\u001a>B׬y\u0012,vs[a\u000eXn?R\u001c08rq5ܳ$g\u0016מH\\Amá\u0017\u0005W\u00058\n\u0001֑Fw;ڙ\u001b\u001c۸w[Upf\rUӝdۡ\u001c#S.\u0002J'b\t[\u00143c¸.=uMO\u0017JFith\u0012=G\u00139LTs71KFPՎ\u001c\u000fq<1\u000e\u001bs\u00171s\u0007͏R\u0002BF&\\y;,eDc'\u0017\u0017Q\u0010zM0~\u0011_\u0018-\u0013{_1}}3f5_m$_\u0013\u000f+\u0010ޞ6fvz\u0012KP\u001bz)3,\u001a%=&Wt\u0017;`z~ǘ awuämw\u0019]cnnQF\\}u{N\u001d{tu];\u0013\u0007sq*Lˀ\u000f\u001d]\u000fU\u0006\u001cF}M\u0019O5.zA\u0001\u0007H\\\u001ap<'H*É̒J\r2n1܎z7Oձn>\u000bTs\u00117r@B-&\"6,6>\u0001VP(u?F :Fٷ5Ңu\u0013W\t\u001a&-\t5B?aňi\rH~C\u0006\u0017\u0012u B;QN<\u00153%c/8:n\u0005H$:6@7e\\\u0007\u000b4;\u001fM\u001f&z\\H\u0001ME\u001eW,XE\u000e\u0017t\u001em<&\\8#\u001d$\u000f\u00167^\tQǻ\u0013\u001eꨬGYw)\u0010QA4-K\bm~;\nS.e\u001c\u0002\u001c\u00180_\u0001>gQ:\n\u000e\"\u0010\u0006\f$\fT\n\r=Oz|\u0014\u0019(!-ɹ\u0017q\u001d\u0004#/L^{̦ltītם\u0004B\u00075*4\u0007ܬaȽ7\u001fW\u00108\u001e538\u001co$\t5\u000bM\u0002\u001afOķj\u001ez\t[Mعѿ\u001d+mmеf\u0013G.QmJuT5dֺbW#]UL|KyD\u001dj\u0012fU6\u001a$ӄ\u0018\b;\r\"ɴ[`:VA:`\r94\u0005?\u000e-m\t @P</\u001exx~GH|s\u0019\u0016\u0006\u000evv4\t.`W:V\u000fljz\u0004nFF@\u001dtsHiR,\\@9t\u001a\u0016\u0004I\\(p\u0007T\u0003\u001c\u000em9[\u000f=ocv\r_\r\u001f񱹩l@#rc߇939?\u0015U_\"bN\u0013<BrmY\u0016xo\u000b\u00174\b\u0002g\"\u0016ҝĂXC\u0013V\u001f\u000e\b,lqyU(05x,^[{E ݪ* \u0014Bp}\u001bwZcܠ8ӏ^\u0011b,X(\u0018\"A\u0007\u0006&\u000b\u0012%7B\\s( \u0002Ӭ\u0005\u000e\u0004(\u0000yl\\X\u001f瞮_g`k?/ro𰾖i#e|eNW~\u0007.핮\u0001nk\u0017\u001ekG^iQ\u001b55}ꂐ\u001ea<XxGC/Cfwؤ|ƻsI7&wq;\u0003ӮZz=\bSkb\u0004Pʫ\u0015;\u0001R\t\u0016sS<:\u0015|LRpH*auBB^'՘;<u\u0014`O\u000f.\u001df\u001d\\ڃ>\u0007K ^suOˍgk-CF\u001ft\u0011%kt:p]p\u001fZu\u0013ŷ\u0010-H\r6伭ѳ\u000e\\֎3\u001bCo\u00055eƭz\\\u0003ZKRO\u0019sZ'dUEDqh\u0004}3г3\u001e`qF6+h\u001a\u0019+s8AWR^'#tR2\\\u0014.2aHdZZ巠iƨ&\u000f;3\u000fuJF\u001c\u0001\u0006*z\u0003@\u0015c<Pl\u0018[>^(ұ^4tsx\u0017إ\u00045Z\r\u000b\u001eʾT\u001bQ\u0015s\u000frni1ԟ,<ɣx񍟨\u0010W]\u001cUVK,T\u0012\u0014ƥs6\"L\u0004u^TN6 N@(p0>\u0004*'hN\u0013)h\b\u0013\rBD\u0018k4m lO\"#\u0013\u0003\u0016)>0ڬ5\u0002)^YDCv\u0017w\u0016Z\u0007\u0002!Q\u00172k\u001b\"eB\u00027\n\"\u0015\u0014 Ov\u0001\u0005\u0003\u0016\u0012[\u001cۀJ/NN\u0006\u0003k@VցSo#VŁCBK\u001fBJ\u0007\u0013b\u0005mH\u0007z(h\b\u00029\fpD\u0006e\u0000r\u0001߇P\u0017@4\u0001'K|\u0002\u001f \u00108ɲ '$.s\u0019Dp~\u000bH>Ba\u0007\u0000\u001dt\u0002\u0006*&XD\tKزU8\"\nϋw @=\u000f|و\u001e{Qu 9#\u001d~\n6HEAx0FF,\u00100*&%2\u0014F!T(\u0010[c^AAN@,z;g*I2\u0002\txw\u001d`$߻\u0003\u0000\u001f!-Ψ\u0001\u0016Pa܀jrX\u00007\u0006\u000eT^=%p\u001e&'GKf>8/\f\u001a\u0010\u0012U\u0002#\u000f\t0\u0015\u0004n(5Eͅ'ew\u000b\u0002\u0000\u001bRh7\u000b̔R\"h\ta ea.ǩP\u0006\u0017D!(F۽nSxxN$؏b~i4\u0007?\rR\u0011p\bEeSH'oW\t+9\u0001\u0006DRh{MJ\u00072aǻC\u0006?t(\u001c\b$+y\u0016t⼢m\u001b!0?\u0001͓_bǿiw8\"SVj0S&`\t^\u0018\f]Ch2\f=>b\u001eXYe\n\rʜl\u0016\u00060gaEBu)\u0001KIRQF)o)\u0015}~J\u0011\u0017\u001aBо1h.﹎'ԝfsp\u0014U|\u000b\u0019Yy@6y$\u001fJؘg\u0019?JȱǷ_LDmP\n\"T&\u0010D1>\u0007gx\u0019@p\u0003NnSBM_\u0016V\u00142'o.1tHtJ\u0006bo\u001089\u0011k\u0015T03a{9\u0015;\u0018\u001bK)\u001akĆ`TpY`\u0010nᚐA¦Q:6\u001a\f\u0010Hv\u000f@z=H&\u001e\u001b U\u0000nP\u001e\u0018\u0016\u001c2\u000bSn\u0003@~+aA+\u001f^,P\\(׃\u000fzgse\u0010KI5e\u0002&5OA/>\u0019vAlwz_Zt-\u0012L\u001e]_QU\u0015\u001f\u001d\u000f}@&B\u001eN\u0010ѧ[.T\u000b$6#o𾃳\u001d\u001cl\u0011nYMS i2ט$jo\u0002lpF,13X=V&%-@ \u001c2cq&v\u0010[0Qd\u0005\u0017R3o\u0012>\u0000\u0004yBp\u0013b\fʝ\u0017O2\u0016z\n/Jd Wz\"=O\\\u000eU\u000eڶH\u0011\u0003ȡ?\u0019\u001eK6%wM֪>K\u00117r\u001eV8Վ*0\u001b].|\u0001oF\u0018dA騗kedP3(f\u001eC_\u0004ʚs\u0010\u0015}C&s4Ra11yA\"4R\u0011$xG [.jn\u000b.5_e`\u0012(#]XB76ۂ\u0014\u001dH\u001fmwIuXX$\u0003\u0011\u0003-J\u0002\u001eAc]\u0007l\u0001v7\u0003\u001f\u0012p\u0001Z\u0016~\u001a\u001bWC+\u0004fռF,y4hcr\u001c`˝ \u0010A!X|\u0014\u000f#\n\u0011g\u0011I)Y0a\u0005j.Rj\n+b+XǦD\u0000\\R\\ Sd\u0006\tí\t\u001f7\"K3<,\u0012-L@\u0005\u001fVW\u0004,n\f+/\"\u001fT'n\u0015Ԍ \u0015F&.\u000b-_\u0012TrQh'g\u0003\u0010\t\u0002Fd{v\u0011C4\u001fY\u0001\f ŵbq\u001b%2z,\u0004zɎ\u0003Ǩ\u0017Q)\u0015F\r\u0002Sj\nK\u001a8t\u001f\u0000\u0003c\"j\u001aIR\u0010FcKy\t֟kf+5=mjPܨ\u0019Hŝ\nH\u0014`y\u0011vrOF\u000b/σALV8`+aG}č>mPq\\ODTҀ/{\u001d9<\bH@\u0005\u0007BR\u0013\u0000S\u0007$\fM\u0012>\u0001\b\u000ffA6+\u001bA#ǣ|\u0012GL\n\u0017\u0007\u0014\u0004%n\u0018\f*:\u0001l5\u0004\u0015\u0000\u00078HnC\u0000rz+I\rkc\u00158\bp(\u001dS*~X\u0019/d\u0006G|PHY\u0007w&\t}ؒT,rF-\u000foC3T\u0013\t`4a\n\"\u0006$\u0015:V, \u001fn#dQ\u0000:\u0017*#ؚ׌Tזί\fP4x8\u0017Paj6\r#@}\u0004rO W`o)=\u0018\u0007]0[J0l^0/.mRb\u0013\u000bWGG\u001dγD\u0002>׻pɶ֌,:ր3A2#\tCOW\n\u00140$\u0012\u0007K\u0012\u000bqlzOEAF!j[{xE݉\u0014j{%&\u0005\u0010~lf\u001c\u0019ݎ\u001b/^\u0002\u0002Bh\u0004\b\n\u0004Q:83qg87lm:z-g2dlƲEy\u0016|\u000125xj7MAɎM8F\u0010\u0006pt\u0007cO9Q>96`n>\\c\u0018׃\u0016-zV{k\r1z\u0015LrUp\u001f ޱ\u0010Ə\u000bi^klC|2\u0014/j\bC}z\"/rIN\\Q?6-n1E:Z<~]\u0016+l~sƟz-\u001c#Z\u000eaܢΪ\u0003aÇ\u0005\u000bg%0\\˵n۹\u000boֿ&1xnoT\u000b\u00165\fk{\u001a6!\n]\n\"Ji b,\u0010Ku򎒐ech\u0014IJ8uZe\u001a~\u000bJ6j\u001dl\r\u001fN\u0000f\u001a$u\n|~̀S\u0003\u0006N\u0003\\Ѭqn:\u000b5^0ɡ9D\u0014\u0001'C-\u0017\u000b`\u0019D!\u000b0\u001e\u0016\u0014ӯHÔ\u001cxJ\u0004\u00143Tګ0Ye!Ŷ+@qϿr\r\u0013ZX\u00190\u001e$d؜z\u0000Q̆Ql\u000e-\u0000wc\u0001\u0004K>Mz{\u0006A+\n0kb\u0004~&ezUȉ\u0000fgvdF?\u001fk&\u0010Z-Iy$h\u0010\\t;\ndD\n\u0015VjJ1O\u001d\r͋\u001e4#Y\u0018\u0019UjvT(biytЌ\u0014\u0005\"Ki6y7^O\u0018]A/ML}\fu'S_\u000b\u0003sSVk\bi\u0015^*\u001dqz)\\jJ\"\u0015yxI`z}\\$KZR\u0006g\"!\\q`*6\u0002s`*F+)hO\u000f42'yWHU(\u0015vn\u00012Y˓#GUr頺t棽\u0013A/Y3y\u0002\u000bW\u0007\b⫿U/26\u0004=1+J\r\u000f{D\u0014'IR\u001eMSSQN$ѠyF\u0017\b\u0016r2dl`\u001c>\u000f!\u0013n!GNN\u0015sR\u0019+\u001aހ<ǝףIi\u0005I*\u00158N)P\u001a\u0014Q.,\u000b\u001a`\fC4B{s\u0012s\u0013ݺ<\u0001ڴ\r\u0000HO\u0001\u0005V\fgNC\u001a\u0001\u0011?\u0004P\u0014\r\bxFwe\".̇avbe,0\u001d\u0007Z\u001c92 \nxx1.aE#\\\u00028آzR\u0014\u0018#s}\u000bVX\u0001S'\u001a\u0012(* wG%A\u0019XSd8\bbs'a00I@)m+\n\u00074IobϥƉ\t!\u0013\bx;;ޑe//J%q\\\u001b\u0011\t;Ͷ#\u001d9)#\u001f?Tn#=\fT֖\u0010Э\b~\u0018D\u0006£?x\u0013\u0013G{YlzI0AII\u000bͳ\u001eЏC͋\u0001\n[-;E:g+5\u0011\u0013_'7\u0016!͚Ae\u0012\u0015\u00181\u0014\b\u001e+\u0005\u00016\u001eIZ1\u000fkA\u0000Ǩwk\u0010KՁY\u0019\\II0YnsDK\"\u000e(\t6TOe].\u0018\u0002}{GvȘ<\u000f\u0007\u0004s&p\u0007H(\u0013\u0000E悋R+^:<Uj\u000f$:%v2l!}&S+\u00172j\u001e\u0018Ijώ^\u0003\u0004j\u0007\tT'\u0002\rcVr2\u0010T\u0002cUv\b\u0014԰lZ?\u0011\u001a\u001aN^)[\u001as+(\u00104\nZ4\u001f晟\u0010\t\f:\u0011\u001dMp\u0018\u0003i<\u001b8Ah[`\u0001g`^\nS\f+\u0018VxT%\u0018zZ\u000f튨\u0005}\u0002,\u0000`1\u0011(EG̙lD$0!B\u000f\u0015|$\nNǒ=\u0000$\u0003a!֬(\rZ#E2oՓo/R\u001c\u00044]Csg5m\u0005'28@\u0012$ްNY\u000ehVą3(@3<I\u000e)\u0000sk'cP)8R[%E\r`YIŴp\u0005\u0019%6\u000e\u0017_cS\u0010,8nS\u0010Cy$fsbS\f\u0002!'\u0012!ۈ:nKa|2\u0017۫dCaBBTN=jhM95_\u0003Qv\u0002!P^{E\u0016+D6*%qA\u0011.OK\b4aҔlvoyJAɲg0Rpajr\"9-ܭ\u0011}{\u0001RG!(d*\u001dFh^^ꄮJ\u0017O\u0014\u0003X¦\u0016|dL7\u0010f\nvG\tUF\u0017\u001528,h(\u001a]ǹ\u0014cTL3\u0012fv 21'˦Qq\u001db-Qu\u001aBE/@Ί'y\u0014a\b5P\u0017%T\u00109Y \u000b5\u001dR}nV~.]se]\u0015)(\u001e\\{Y~Ą䛉%BJ94PɅ|6\u0002[æl\u0002\u0016J>?FPG\u001ax\u0005c9M>\tvQL\u0002:\u0012eE硬,1q1tT-x8VX\u0019Tm\u000ep\u0002dDpA!2z\u001eHH\u0005i\u000f]üNi\u0001g\u0005\u001f9r\u0005\u0017\u000f`B%\u001f#\u0001\u0004y_\u0014%ǈ\\$\"Besx\\>dSJA\u0016ë]?\u0012W\\m\u00071zq\t(BizޏJ\u0010>%iQ\u0015\u001c.,f6tnW\u001eɆ\u0016D鱩g\u0003,\u0014f\u001a2\u0011\n\u0003RZڷL\u0011%o\u001eTB.\u0000\u0016vwusvn/LU\u0019* \fy\u0011Zؔe~\u0003$k=d\u0012])\u001aR!ʊ`T2O޳\u000f*3ULSa-%$Ze\u0011f^$zuvX·G[\"pFr\u00125E\u000ey(\u001cj2Q\u0004\u0016oNOk4\n\tv\u0002/:DpO\u0010\u0002\u0006ff.<\u001euMOO\n')a#\u000bKmajʵBzv@_#uŸ+ )Cؼ)TC>FCb-=\bFDJ&,=DtdXG\u000bAf( @5NSAxrޕL)(]T?:UDA27Q%&\u001ap^\tOd\u0005д˸Q\u0007Tn\u0017\u000bH\u0014'VaӮ󃃴B6$ә_i}V\u0001ԋ9\u0005Vl\u0002Vx3ze\u0007\"&\n\u001dD5ղUTɅJ+f]}4\u0013~v䂫HG\u001aj\u0018R&W!\u0005\u001eX5EeG5Q\u0013E3d\u0002G`l\u0014\u001e:߳OQׄ\u0017\u001cVBH\u0006.\u0006\u0014PEͮ8>å^\u0011#\u001f4,\u000b{gE㗙$`AeV&bB\u00192ح눼\u0018+0FM\b@Ld\u000b|0Kn/\u000e\u0002x\u001fŢa\u0014S\u001c|K,e%n\u0001;cLO+*\nyeED\u0000J0\u0000N\u0014ɘBIg٠|\u0018VEAT>\u00132u\"#Yxި]ksHNBG?-VyɬNtutE>]o}!2&k\u0006KLZ*\u0004$CasC\u001b\u0001H3\rӊ\u00171?v\u0004\u000b\bԁE\u000f\b<$\u001euHw\u0006yYP[4¶\u000b2XA\fF4/@\"{\u001bktm%6S䙍\u000f*3.\u0014\u0014ibւ|fg5%8\"mqUu\u001etA\rk5NQ(nK9*K)\u0001L׷\u0019VE\u0013\u001b/Bx\u0016A\"h\u0005|J}\u001eUUwǗ8ڙ[P\u0006Ru\u001a3\u0004\u0014nT\u000fϭ|\u0010)Br~e\u00001gowMlan#K\u000fW\u001e8KJS]\u0011l\nlW|x\u0003}\b\fu\u001a\u000b1%B\u0013\u0003\u0005\tiA@\u0007Urt\u001fN=\u0007;\u0018G1p\u0017\u0016Ag+\bQ\r$Nt\u001dw)U@#ww\n0\r|'ܠ\n]<⽵{\t\f\u0014N\u0012\u000eF-\u0005̃ߐ\u0017e\u00191k\\.@>\u001d)\r\u001f'\u0001)\f\u001fd\u000e\u0013V>k?J(~.t\\\r\u0012-\u0018fgvjA\u0000<\u0006,\u000fN)Q?9\u0004HɃ/\u0004Ȇ\"f9Oގy\u0010,\\uOYNєur\f\nF\t\tox\u000e)\"}^ZdP)Dh\u001b\u001el\t#\n5\u0006,,\"\u0006\u000f$l^\u0007\u0000Qy;Z@\u001b&\u0001VkP?)T`ҖEirXB[\"7H\u0006F\u0000@/$\u0005#@p\u0019]\u0002L\u001dX@?<Т\u001aI\u001dׂ³6,QI~\u0001\u000b\u0012/3`\fh9\u00076\u001fW2-JWdr_\u001f3\u001cSL\njkňp'\u0001YIi|ȅTRx\u0003r>Ǔ`v%\u0001HM0\rP\u001903u\u0004\ng^h\u0002n/B\u0017r܉q$Z~Q5q-s'\u0011\u0001\u0003\u000e6\u0000A/;uN9\u0017\u001d֞\u0013\\)MߎW\u001c\b1T\u001c&MV. \u001b|2-eDZ\u0017D\u000f`\u0016w\t36\u0014.'s>6)WAmO:\u0012!{ix\u000fƧ#\u00007$W ^wKI\u000fcJ21\u000e\u0004:菊v)NE\u001b^i7XI\u0011\u0000s\u000fgl4giE_}uvr;؝\u0010wxSģp\u0015v~אS#\u00063nNJ\u0007\t*\u00171Rr\u0001rOb\u001bO\u001emoAr|ʓn:\u000f=f16\u00125\u0018͜κ6=l?\u001c\t\u001es,Q\u0000\u0014d\b祻²^;)Y UΩ1\u001c+G\u0000U-9(2-hCIA\u001dC\u0015)OL@/[\u000b/\f%\u000b=g~Z)Ę\u001e\u0010o\u0016Mb+~Ae⨛\u001fq@z@o\u0000\"\tC\u001b\u000fŋڕv\u0000E\\ghH:H/\u0014K\u0005SRzf=(hEr\u0017\u0011C\u001c\u001a_T*'ڮd?\u000b6\u001ev\"\nVPmZi\nkl\u0003Thݸdu0 \u00194,۲L\bo=\u001e<FdF\u001aͤ.nX's~E\u001bsQ1\b\u001b\u001d\u0004\"2\u001dR4A&P\f\u0012E܏;ˠ\u001e2\u000f\u0013]\u0014@7\u001eu\u001ah9ٝdDLYf6%f]2.I`pZ \u0013\u0001\u0019t$$\u0012\u0016(%2E\bHz.\r;\u0001\u0011\u0010#\u001c!\u000eQ:\u000fv&1҄\u0000\u0011Զi\u0007\u0003U\u0019\u0001,X\u000eH-Y{QdJIS5R\u0004\u001a~\u001dԈY<>!d5\u0006er#4\u0015\\\u001b\u0000\u001ddA\u0002W%by&Jk\u0002o^\u0015\u0016\u00050\t L$%,\u000f$zWxsd0E\u001a@)a-\u001aOɈ]n2G!f\b\u0007Q8#RxRJ\u00105\t\r\u001d\u0006fu-H\u001f3\u00037\u001c%VW~\u0015f!>ZVW*\u000b\u000b@Gp\u001dw\u0019}v\u0010r05hJ Wd1\nFTC\nyT۳w\u001d4㓟S\u0014$\u001cT'Pq\u001d,\u0006Cץv}]+v;\u001cm}<\u001b\u0017\b6uUl\u0016~Ry9G\u0018\u0011~\u0014Y簸&\u0018~\u0012ujHZ$]432PYh\u001aARa\r\u001a\bqOme􁓊E0UT\u0003ݐ(o\u0007tO\"`\u0017D6'wBj\u001d?\u000f\bq䔸H\b\u0018L\u000e\u0000s'7GFP˛,臏*\u001bŤt\u001ew&BG\u00165d\u0006wGh|\u0004e\u0006k8\f\u000eLkDVe?Ã\u0001\u00027\u0006n\u0015܁\u001dw@q轕\tg>\u000b2$:\rA~\u0010c\\i07uZ-֕=(%R\u00009$`\u0017ZOihiK6R\b@Ϻ;g(9\rI+omq\u001fs\u0004\n5'\u001bE;\t#Ķ7Fn@\u000f-%c9$\u0018\u0005\n9ǀ\u0005X\f:r\b_c\u000bd#\u0016\u0016v\u000ec:L\u001dp:(O:A\u001b\u0001\u000fi1)AuYHQ'\u001cׅ&#\b\u000b)|5_5Ut Q5[\u00170^(\u001eH+3yĒ5cڠ\u000fNRX\u000fKT\u0019nmH>s:vޅ\b\u001d`\u000e\u000f\u0000yt\u0011tb*YbDO1F& LTZ('\u0014dk`K/0M&V?Mn_itwB\u000em1\"M4\u0016\u0016\u0011t\\\u0003ÊU2Y\u0013\b:mX: ,4\u000fZe}$\u0015y6NÞ;2\u0002`Y\r\u001bqe~\u0019\u000fv6\b_\u001a`\u00178_qX\bB'YD\n\u0010mq\u0017nSy\u0005N\f>\u000b\u001ch\u001al\u001b qO,\u000b\u0010έ\u0004\u0007E]$(\u000b:4Q-D&\u0018ЅmGPWXA\u0002}DϢ*\u000b}\u0010\u000e3S^IπX*\u001b\bo($RyenS[ax/]\u00180C\r\u0005e,+2}\u001a\u0015DZ\u001e1GqEݴ\u001a%\u0015bR\"W3bݺu\u001e\bD\f\u0018\u000f.M>6\u000e$\u0018:ݕnaT6x\u0015\u000eUD\u0006\u0019'?i\u0016NY,V\u0002B\u001cnbO\bAsR\u0005 \b8\ngqlBP\fL\u0016 B\u0001U\u0016\u0010t\u0003؆?뒶V:G26đ\r5Ɂ u\\TdQ◡q\u0013Q:8:B\u000fq+&iV]N\u0003ts\u0012!_\u0006:\u001ea8\u0005t^6#\u0006i7.H\u001b[\u0007DM\u0012\u0001= U+C\r\u0016|t^\r/K]mn_2\u000fZd.{.qJw>aiq\\j\u0004U],\u0019)9\u0001FOM0\u0007''-bwEi#\u0018@\u0012\u001f\u000fO:S\b\u001e؏3\u0010\u000ed\u0013h(#x-\u001be\u001e\u0018\u0017\u0010[lZ|\u0007؟79\"_]\u0011U\bC0WJ\u0015\u0018v\u0004g\r)%w(!\f\fQ\u001e\fU8g㯙\u0017\"ɚ3\\t] ~Mۂ5\u000f<<]}\u001dg\u0007\u0016Ȏ\u001e]L9E\u000faH\"Bԙ_;\u0013G?l\u001e@\u0000V&H\u0010\u001e,ŗ9S{A!XPq^<\u00010\u0005_\nd\u0005;|L7^e{Qk,\u0005Q- :{E\u0012EL$\u0010E\u000f\rl\u0017s-6i]w!'~U|37\u001eFp_Rpㅤ{Yh+\u001cQ\u0010\u0017\u00153\u0001b^6?$\u0011;\u0005t妵GE\u0012RAj-}\u001fi ^N<ٔ5\u0002\u0005%/\u0019Ke)\u0017\u0016+\u0006޳\u0012Z\u0002h\u000b\u00193^;\u001cp* \u001e݊U\u0004ujCЌW늤Ƿ\u0014Up\u0015%E\u0015Uq#%Y+wz2\u0004\u0011O9]\u0011\u000e%-#U\u0004\u000fwI\u0019RK\u00031\u0004\u0004E½\u0019'ݮo?\u000fg\u000fܻz\u0014~\u0014c{n;ʎ#\b۔teif\"؍2]e^\u0010\u001aH5\r!1\u0016\u000b`\u0010\u0011,舡WTP\b\u001bɠ\u0011ã_ߢ.0G Jbl.()4o\u0006\u0019\u0016\u0019\rH4yu.BFH=[c\\ak206emH)oIqcBXļk/p\u001e?H~B][?C*ANC\u0001!@ǹ\u00023\u0000)\u000b\u0005n\u0012G6bT6#\u0007:O\u0005[d*_սL(rf3\nrtw\u0011rrLR5Y`M\u0017\"2hֆ.\u0003.ܚV\u0002\u0001i\u0019!OϷ@ }(@\"+\n\u001b`\u0012fxGRݷɋдY\u001duy:\u0011H:օIЯ=gpMc9\u0015S6Ǌ%Ͳ3[`8\u0015\u0003\u0002R\"m\u0014\\\u0004G8X#\u0015_5\u001f<ڰ\u000eT+`\u000eMk\u0003\u0019\u0013:!\u0019un>c&¶@\u001aXAQ6\u001b\u0002<\t^\n(^מ\u0013\u0004v\u001d\u000e[g{'\u001dY@\u001cg\u001f\u0002C&oϨK whus1\u0014r]Z.sh\u0001n5\u001a:0N@YYY4\u0001\u0004k\u001aW\u0002\u001cX\u001eBT5n\f\u0012R(˪=}\u001aR,,\u0004T&)B5˗\te\u001b#=\\Yɕqc\b\u000b\\g\u0015x@_g\u0018g\u0005gi>8Ub\u0004$er3\u0018\u0002f2?*au3sn`('`ECΙ-\u0011khp:@-n\u0010\u001es߹ (;+̀4\rq\u0002\u0016.Sҏzɻe|B4I\u000f\u0019ia*\u0010jgIa\u0007)\u000e\u001c9כ9O)\tH>O-RM\u001bNBүXվzC\u0018yR\u001c:%j\u0006MâD\u001c73\u000e@5#\u0018fDG.BL\u0006\u00120\u0001hR)=_Y6\u0012]Gۈλ\"FS3Phx\u0000)\u0002P,ଟa'm|m\u001avICU\u0010|K~R\u0012)G<HLdH\u001bFPSgaTi\u0015V$\u0014\u0016q'ao'E(f\u0006>1P!6}\u0010\u0002\u0013\u001fz\n_v*\fj\u001bM鄗c\bҖx2|{xN\"T\u0018\u001b볗bpOb\u0016-\u001abC:lm\u000fM݄Kb\\n1hYm\u001f]_Y(OW\";MԦhJ\u0004\u0014c\u000f{\u001a1r\u000bZ\u0001aFp_F\u0001i\u001aY\u0018>Dжg\u001a\u0012\u0006IP\u0018\u0014#, [6\u0014gIw3ŹY\"LgB\u000b֍\u0015\nm\u0007oA\u0002\u0010\u0011\u0006-=\tQ\nqcʢH%6(H縚q`Mܗ\u0004NjA\"ob\u0001O/\u0011[сy\u0013T'k\u0016\rW\u0019\u001br\u0001XH]Y\u0011jIN05{]*hN2w(\f\u00168L,:bB\u0003*\u0017\u0007!v-l\u000bM\u00035Ȑ4pa\u0018\u0019\u001dH\u000eIbo\bvJI6Ś\\\fy-$-zdz\rV±0cYbZ\"\u001d\u0011o\u001d\u0018\u0000c+~$.uW\u0011>^\u001cK{Ht\u0003\u000er; \u001f+,G\u0017gI\u0011\u0014\u0006R]s\n\u0007׫\u001aCm[/D\u000e~!K?\u0012t>\b斅$`bN[H@\u0014\n\nX%(c\"o7X\u000em\u0015-833T\\&\fj\u001d-z)F@|(\u001cqV\\tshM!\u0004nH\u0017mR+E}0\u000e<]b#1v`q/s'찹¡YY,|:E\u0000,vRܬw.(\u001d>ҌnҎ\u0004:p\\݊'<\u0014J\u0019,JxnJIaՌ.\u0003qX#8Le\fDRPY8L\r󶬈jk@XJ0\\\"c9.\\\u001alѐKg$\f(\u000b\"\u0006NA3N\u0004&\u0014@w\u0002\u0002WF53\nk$8v\u0010rnݧUB`w<'zL\"^os4@\u001c'.\\\u0003\u0014hbvzD\u0002nvR(\u0014sz7A\u001b0\u001aJ1\u001aTҦIM\u0015Yճ*k\u0015\u0003<r_\u0016p)uB\u0017\f\u0016uѲ2s\"0T27}\u001d[J6\u00142P\u0004ÈkCu\u0012)Wt2e\"h(L~y\u0016\u0014#ԞX\u0018Im@\u0010xQ8H\u0006qO\u001e\bbبLSO(\u0017T1T\b(\u000ep\u0019\u001d\u0012\n`m`s\u001cfF2t1!\u0001\u001c\fVP\u0006\u000bfۢP`O[\u0005R\u0019JC/\u0011\u0016,2KXbm\\nj\u001bɿ#{W|\bG-62o\u0005\r\u00170LٮP,!gѧ\u0010xޓdr\u0003V\u001b&\u0015\tx\u001ft(4\u001b<hs\u0001\u0016<L\u0012\tk\u001ehbg3cEG6\u0011\u0005o\u0005M1\u0007\u001f-2H)\f߫Ɨ*\"\rॸ@2j\u0006|gZ1\u0010\u0012z.;Tz\u001dݛ%Ӵ xDm}`\u00114hFD֭9+\"0Ns$\u00068f7\u0012\u001b\u0000G] \u000bH\u001fYߨy\u0015|A\u0010\fj\u000eXAEh*&\u001eE[--'\u0016j!Տ\u0000bS\u0016s-D\u0012\n;^p\u00040j\u00063\u000boGa\u001dr\r`~%e_<\u0016p=$1<\u00181;n5+\t7#\u000em%!\u00134\"Z8LL?UeoYe!&9.\u00175\u0010BRCRaEС\u0000ܢcO;#d5FQY)I\u0012bA2\u001c\u0018\u0002M\u0017Rx\u0014m\u0017ʁ=b`Aݍ\u00010ad!r>pAY;\u0014.\rq>\u001a^\u001d٧B뚫\u000f\u0004{2\tJdh\u001e\u0011\u0012p[C\u0000:Άʤ=\u001fUi\u0014\u0006E$Ά.\u0010\u0010\u00112\u001c\fdx{_\u0002;V˪^s֚ԥ\u001b܆}VcTf\u001cf\u001b[+K\u000bWm\nϪ\"+9\u0001,|\\2}H%sH\u0014$#a@\u0003\u0014a\u0005h/pǂ7{\u0001{7\f\"[\u0010**kD\u00194\u0001s:m^We:\u0005-u\r\u0004T[`mm\u0005\u001d\u0000@J\u0014\r\u0001̭\u001epB\u0011o^טŻJz`\u001fַʪ\"`燋r,c=%BhhD\u001dP8-v<\u0002PJ!\u000ey/\u001e+\u0018J:\u000e\u0007R\r@\u0011\f<ײ()ZɠXZO\u0005x62D6Ӱ\u001fIܼv$\u000euW?V}`1\f\u001fraw8\te\u0004\u000f\\Na.\b\u0014\u0006֥!s\f4qC\u0003u\u000e\u0000M\u000fO;$0\\T̄K\u0004_g4!6)؅>UTd\u0015ͪw+R\u0012(jdFE\u0002`h\u000eJ\u000b^\u0018J\\}\u0017\u001ee\u001cG<ΓێJUcR8cJ\u0006mLxې1\u00123#@\u001cN\u0016ߧRRUo0M6GBVK~\u0005#\b:<*\rJt+~#wAU\u001blRkt\u0011y<6\u0006Y\u0007(/Ԁ}@^2ױU\u0010\u0015L\"{O;U>\u0001Tdj+ȞK~\u001b\\\u0012ҚbʺC\u0016E6}4\t[5AQ_\b\u000fl\u000bs1\u0000\njwH)?#\u0016\r8L=\u0014H<\u0001x$p\u000bR\u0000\f!6a4J%Sd*Y.遳\u0010\u0000Ê}2v\u001a-\u0012{b\u001ec-#@A'6\bJ\u000eς[\u0015\u0010\u0019\u0006v\u000bƢMx\u001f#[{s]Tv\u0006屜ԟ\u0013\u0004\u000fp\b\u001bRRE\u001d_Gxpe2\u0019InS\"z8\u0002re\u0006\u001eO'l3J\u001at`n5I%%\r\u0013E+8\rcB^YlPۣ\"6I\t\u000eA)\u0003I\u0007\u0002gEj%\u000fx,\u001b\u0011\fdKOk.zR\"ZI*WW\\c\t't@\u0000?$3^+C+\bك\\F͑;Ng,<qa\u0018CFa\u0005?\"3J-8~\rg\u0013y<dRn Zњ\u0007`'e)\u0012pC#\u000brq9I3׀a{u|H\u0003{n?\u001fB3䩣Q{\nt\u001a퓟JPB\\3̄!nX\u0000f4\tXNG)%z\u001dEBvKFbS2uX\nkX<2D PqEj0lw\u001fԽ$\u0005aV:\u000e\u001c$m\u0011t\u0004dJCtUЍx\f\f.J{\u0005qkHf߾?v\u0018@?q\u000fmh$\u000e.t\u00054]\u0017G\u0016+q\u001c*'RTO\u001fPՠCֈ\u0005Ns\u0014?H\u000bQ)ƁR9(/\u0014\"#:!>\u001cP\tΙI7U<Z\u0003y\tcIAa/i->$0\u0015VSEYGR8YSȦ).kPPezs#9˕^0\u0016A5#:)قS6,~FYoOb,6(\fhF.\u0005]j*w\u00115m\u0007¾Ӌޠ;N\u0004\u0002\u001e-H$\u0014G\u0004!sGʧ`#5\u001e\u0019{\u0005 E\u0010i%^2l\u0004OH\u0016wYߡ}a}ny\u0007eH\nVa7[]_EnP\u000f{\u000bE4%\"8-3O\u0005eY'2\u0003\"}Q)h\u0000]j(g)(\u0010\u0003\u001b\u0001K\u000e=\u0001QD=\u0001;r\u001e\u001d]mK\u0005!\n_RȭFX\u001f7KnW\\6\u001a\u001a7Q\b\u0004I\u0015U\u000b\")EP@,C!bKZx|\u0013)U<suI1%\u0016t\u0007YX+\r\u0002=\u0000!X&fǘN\u001anI=\u000e\u0005\u0001n\f\u0015\u001aG<|\u0012yRU+\u0007JPi=TS\u001f'\u0019C<\u001e\nlK\"\u000ejba\u001bUMȱ\u001b:T{c3N@:{\u001b4N\u0003\u0010\t\bf1`p:~:\u0000\u0018%pPn\u0014\u0019L\u0000Q\u0012t\t\u0016\n\u0015O_O\u0006&\r%ޔs\blQgc2-\u0016=\u0000JSYa\u0005Znޤl9=KX\u001bi:\u0005|Y,\u0002_\u0019 R<5do0\u0004\u0000`sh\u0013H&oFFS5(~-4B\\Qr(A\u0013us*pED#O+\u0016 =WV\u000fa\u0007GTΒ$um.iP\u001a\u0013&X\u001e\u0015Q;\u0017*̎{v<4oh\u0005\u0010Z}ީ\n9v\u001d'\u0014\u0005;\u000e-YΕ\u0017R\u0007>e9\u00112B]\u0005,rRIVy|ѭ(oIWF۲\bMrR\u001e\u0010Jib1uk݁$G|\u001c\u0006J#()lb5rV#\u0012L|\u00185u\u001dI'\u0010~5ReU U\u0018}I u,;'\tW5\u000f\u001d5qe\u000b+\u0006rx>=PCu \u0004HgC'T1C\f'\u000bP*t\u000bmx\u0001/8׃ŗqe]@'\u0018\u001c\u001a9_\u0012qbwHZ$F;]\"Xb\u0011#NѾ/?\u0000.,r\u0007T5J\tBk/\u0006+6of\u0004\u0007س6{p\nS\u0007\u0002mѪdy\u0004\u000b\u001aE\u001eC=OJc2 }OJ*:J}dU-\u0003ﶹO\u000enxZ\u0004\u000en\\TmFc\u0015L3;1j]Fv$xQkǜYut[\u0012(Q8W\u0005Y\u0014:ke4v+\u001d>E\u0010\u0006͕XR\u0005\u0013\u0013}/\u00032\t?H\u00151\u000eIi@kb,\u0004\u0001i4׫\u0003p[-\u001a\u0014#ͅ\u0001]|\u001cV5#\rX\u0018\\;^\u0000i@tF)C\u0003\"Ml\tp\u0004\u0019\u0014֑O\u000f'C;\"\u0016XKF\u001f?\f@\u000b\u001eV\u0006Q\u0006)8\u0002CW>\"kIa`=C|1\u0012-\u001cN\u0004\u001e\u0004\u001fPekWA1jXCVX+\"\u0006d\u001fJ\u0007m\u0017q\nEnͨ\u001b֒!\u0015}Xܢ^21\u0007\u0004)6\u0011Zm\u0011H|\b\fQ\u000fvטJ~\t\u00021#ő\u0019Q\u0002#AK$[\b\bbyyB+\u000b \u001d!)9D+\u001d_U\r\u0019UYX辣t\u0004js!|QܶL\u0000>.0#o*Ctw2HNmCQ!hYA{ﴂ;\b\u00167\b\u001d^\u000b޴w<\u0010G\u001e\ttOI羔@,\u000eڏH/Zf\u00039@\u001eS\u001amCh?ΨW)lّT&Q\u0018SORS\tI\u0011+A\u0016x۩\u0007\u0006ci*\u0006\u0007d4',A\"c}\b_\u0013\u000b*Q\u0004]/I{þ~ۅ TbuR\u0004g\u0000;:θ\n%t0YQ\u0004\u0010Kyֈ\u000ezO\u0012cb\u0000@3fk\u001c\u000bT1n%/O;<\u001dshΘm\u001a@\t\u0000\u0015\u000bҳ\u0015)ز(H\u001d\r\u0002\u0014 ~>\u0001e@}Q\u000e\u0018 _btFI2Zc}ҞuՌ\r\nendstream\rendobj\r26 0 obj\r[25 0 R 24 0 R]\rendobj\r310 0 obj\r<</CreationDate(D:20210609080822-07'00')/Creator(Adobe Illustrator 25.2 \\(Windows\\))/CreatorVersion(21.0.2)/ModDate(D:20210609080823-07'00')/Producer(Adobe PDF library 15.00)/Title(websphere-family)>>\rendobj\rxref\r\n0 311\r\n0000000004 65535 f\r\n0000000016 00000 n\r\n0000000161 00000 n\r\n0000079795 00000 n\r\n0000000000 00000 f\r\n0000079846 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000274821 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000274894 00000 n\r\n0000275134 00000 n\r\n0000281132 00000 n\r\n0000346721 00000 n\r\n0000412310 00000 n\r\n0000477899 00000 n\r\n0000543488 00000 n\r\n0000000000 00000 f\r\n0000245090 00000 n\r\n0000242493 00000 n\r\n0000242565 00000 n\r\n0000605769 00000 n\r\n0000080770 00000 n\r\n0000117484 00000 n\r\n0000274794 00000 n\r\n0000128152 00000 n\r\n0000272194 00000 n\r\n0000272317 00000 n\r\n0000272433 00000 n\r\n0000272549 00000 n\r\n0000272672 00000 n\r\n0000242871 00000 n\r\n0000242992 00000 n\r\n0000243113 00000 n\r\n0000236534 00000 n\r\n0000236681 00000 n\r\n0000236828 00000 n\r\n0000236975 00000 n\r\n0000237122 00000 n\r\n0000237269 00000 n\r\n0000237416 00000 n\r\n0000237563 00000 n\r\n0000237710 00000 n\r\n0000119024 00000 n\r\n0000119356 00000 n\r\n0000119687 00000 n\r\n0000120021 00000 n\r\n0000120353 00000 n\r\n0000120687 00000 n\r\n0000121019 00000 n\r\n0000121350 00000 n\r\n0000121683 00000 n\r\n0000122015 00000 n\r\n0000122369 00000 n\r\n0000122729 00000 n\r\n0000123086 00000 n\r\n0000123880 00000 n\r\n0000124238 00000 n\r\n0000124574 00000 n\r\n0000124910 00000 n\r\n0000125249 00000 n\r\n0000125585 00000 n\r\n0000125922 00000 n\r\n0000126259 00000 n\r\n0000117549 00000 n\r\n0000118462 00000 n\r\n0000118510 00000 n\r\n0000236471 00000 n\r\n0000235686 00000 n\r\n0000235623 00000 n\r\n0000219706 00000 n\r\n0000224082 00000 n\r\n0000229855 00000 n\r\n0000219768 00000 n\r\n0000218157 00000 n\r\n0000167904 00000 n\r\n0000218802 00000 n\r\n0000218219 00000 n\r\n0000202243 00000 n\r\n0000206501 00000 n\r\n0000212324 00000 n\r\n0000202305 00000 n\r\n0000200462 00000 n\r\n0000147523 00000 n\r\n0000201266 00000 n\r\n0000200524 00000 n\r\n0000198650 00000 n\r\n0000199040 00000 n\r\n0000199512 00000 n\r\n0000198712 00000 n\r\n0000186499 00000 n\r\n0000189913 00000 n\r\n0000194277 00000 n\r\n0000186561 00000 n\r\n0000184440 00000 n\r\n0000185430 00000 n\r\n0000184502 00000 n\r\n0000184377 00000 n\r\n0000184314 00000 n\r\n0000184251 00000 n\r\n0000183822 00000 n\r\n0000183885 00000 n\r\n0000183759 00000 n\r\n0000169330 00000 n\r\n0000173008 00000 n\r\n0000178381 00000 n\r\n0000169393 00000 n\r\n0000167508 00000 n\r\n0000168373 00000 n\r\n0000167571 00000 n\r\n0000149294 00000 n\r\n0000154096 00000 n\r\n0000160804 00000 n\r\n0000149357 00000 n\r\n0000146951 00000 n\r\n0000148163 00000 n\r\n0000147014 00000 n\r\n0000145348 00000 n\r\n0000145671 00000 n\r\n0000146066 00000 n\r\n0000145411 00000 n\r\n0000128265 00000 n\r\n0000132715 00000 n\r\n0000139030 00000 n\r\n0000128328 00000 n\r\n0000126594 00000 n\r\n0000126907 00000 n\r\n0000127284 00000 n\r\n0000126657 00000 n\r\n0000126955 00000 n\r\n0000127231 00000 n\r\n0000127401 00000 n\r\n0000127467 00000 n\r\n0000127498 00000 n\r\n0000127799 00000 n\r\n0000127876 00000 n\r\n0000132765 00000 n\r\n0000138489 00000 n\r\n0000139147 00000 n\r\n0000139213 00000 n\r\n0000139244 00000 n\r\n0000139547 00000 n\r\n0000139624 00000 n\r\n0000145719 00000 n\r\n0000146010 00000 n\r\n0000146183 00000 n\r\n0000146249 00000 n\r\n0000146280 00000 n\r\n0000146583 00000 n\r\n0000146660 00000 n\r\n0000147570 00000 n\r\n0000148107 00000 n\r\n0000148280 00000 n\r\n0000148346 00000 n\r\n0000148377 00000 n\r\n0000148680 00000 n\r\n0000148757 00000 n\r\n0000154146 00000 n\r\n0000160254 00000 n\r\n0000160921 00000 n\r\n0000160987 00000 n\r\n0000161018 00000 n\r\n0000161323 00000 n\r\n0000161400 00000 n\r\n0000167951 00000 n\r\n0000168314 00000 n\r\n0000168490 00000 n\r\n0000168556 00000 n\r\n0000168587 00000 n\r\n0000168890 00000 n\r\n0000168967 00000 n\r\n0000173058 00000 n\r\n0000177843 00000 n\r\n0000178498 00000 n\r\n0000178564 00000 n\r\n0000178595 00000 n\r\n0000178897 00000 n\r\n0000178974 00000 n\r\n0000184033 00000 n\r\n0000184130 00000 n\r\n0000184952 00000 n\r\n0000185547 00000 n\r\n0000185613 00000 n\r\n0000185644 00000 n\r\n0000185944 00000 n\r\n0000186021 00000 n\r\n0000189962 00000 n\r\n0000193742 00000 n\r\n0000194393 00000 n\r\n0000194459 00000 n\r\n0000194490 00000 n\r\n0000194793 00000 n\r\n0000194870 00000 n\r\n0000199087 00000 n\r\n0000199446 00000 n\r\n0000199628 00000 n\r\n0000199694 00000 n\r\n0000199725 00000 n\r\n0000200026 00000 n\r\n0000200103 00000 n\r\n0000200881 00000 n\r\n0000201382 00000 n\r\n0000201448 00000 n\r\n0000201479 00000 n\r\n0000201781 00000 n\r\n0000201858 00000 n\r\n0000206550 00000 n\r\n0000211789 00000 n\r\n0000212440 00000 n\r\n0000212506 00000 n\r\n0000212537 00000 n\r\n0000212841 00000 n\r\n0000212918 00000 n\r\n0000218490 00000 n\r\n0000218918 00000 n\r\n0000218984 00000 n\r\n0000219015 00000 n\r\n0000219317 00000 n\r\n0000219394 00000 n\r\n0000224131 00000 n\r\n0000229305 00000 n\r\n0000229971 00000 n\r\n0000230037 00000 n\r\n0000230068 00000 n\r\n0000230372 00000 n\r\n0000230449 00000 n\r\n0000235833 00000 n\r\n0000235992 00000 n\r\n0000236109 00000 n\r\n0000236231 00000 n\r\n0000236351 00000 n\r\n0000242134 00000 n\r\n0000241207 00000 n\r\n0000240848 00000 n\r\n0000240519 00000 n\r\n0000240302 00000 n\r\n0000240066 00000 n\r\n0000239143 00000 n\r\n0000238222 00000 n\r\n0000237865 00000 n\r\n0000237982 00000 n\r\n0000238101 00000 n\r\n0000238423 00000 n\r\n0000238541 00000 n\r\n0000238664 00000 n\r\n0000238785 00000 n\r\n0000238905 00000 n\r\n0000239026 00000 n\r\n0000239343 00000 n\r\n0000239462 00000 n\r\n0000239582 00000 n\r\n0000239703 00000 n\r\n0000239824 00000 n\r\n0000239945 00000 n\r\n0000240182 00000 n\r\n0000240399 00000 n\r\n0000240636 00000 n\r\n0000240737 00000 n\r\n0000240965 00000 n\r\n0000241086 00000 n\r\n0000241408 00000 n\r\n0000241529 00000 n\r\n0000241650 00000 n\r\n0000241771 00000 n\r\n0000241892 00000 n\r\n0000242013 00000 n\r\n0000242251 00000 n\r\n0000242372 00000 n\r\n0000242753 00000 n\r\n0000242785 00000 n\r\n0000242635 00000 n\r\n0000242667 00000 n\r\n0000243234 00000 n\r\n0000244724 00000 n\r\n0000243382 00000 n\r\n0000243645 00000 n\r\n0000243766 00000 n\r\n0000243887 00000 n\r\n0000244008 00000 n\r\n0000244129 00000 n\r\n0000244250 00000 n\r\n0000244366 00000 n\r\n0000244482 00000 n\r\n0000244603 00000 n\r\n0000244872 00000 n\r\n0000244969 00000 n\r\n0000245502 00000 n\r\n0000245754 00000 n\r\n0000274345 00000 n\r\n0000272795 00000 n\r\n0000272850 00000 n\r\n0000273166 00000 n\r\n0000273244 00000 n\r\n0000273393 00000 n\r\n0000273656 00000 n\r\n0000273732 00000 n\r\n0000273809 00000 n\r\n0000273885 00000 n\r\n0000273961 00000 n\r\n0000274038 00000 n\r\n0000274115 00000 n\r\n0000274192 00000 n\r\n0000274269 00000 n\r\n0000274400 00000 n\r\n0000274716 00000 n\r\n0000605801 00000 n\r\ntrailer\r\n<</Size 311/Root 1 0 R/Info 310 0 R/ID[<B2C05F4292406740AD25EB6A63C195E0><8D42DE0B8EB7CD469768F01D65B98CF2>]>>\r\nstartxref\r\n606019\r\n%%EOF\r\n"
  },
  {
    "path": "articles/java/ee/quarkus-with-app-configuration.md",
    "content": "---\ntitle: Quickstart for Azure App Configuration with Java Quarkus\ndescription: Shows you how to create a Java Quarkus app with Azure App Configuration to centralize storage and management of application settings separate from your code.\nauthor: KarlErickson\nms.topic: quickstart\nms.date: 03/26/2026\nms.custom: devx-track-java, mode-api, passwordless-java, devx-track-javaee-quarkus, devx-track-javaee-quarkus-app-configuration\nms.author: karler\nms.reviewer: jiangma\n---\n\n# Quickstart: Create a Java Quarkus app with Azure App Configuration\n\nIn this quickstart, you incorporate Azure App Configuration into a Java Quarkus app to centralize storage and management of application settings separate from your code.\n\n## Prerequisites\n\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Azure CLI](/cli/azure/install-azure-cli) 2.68.0 or above.\n- An App Configuration store. For more information, see [Quickstart: Create an Azure App Configuration store](/azure/azure-app-configuration/quickstart-azure-app-configuration-create?tabs=azure-cli).\n- [Java Development Kit (JDK)](/java/openjdk) version 17.\n- [Apache Maven](https://maven.apache.org/download.cgi) version 3.9.8 or above.\n\n## Add a key-value pair\n\nAdd the following key-value pair to the App Configuration store. For more information about how to add key-value pairs to a store using the Azure CLI, see [Create a key-value](/azure/azure-app-configuration/quickstart-azure-app-configuration-create?tabs=azure-cli#create-a-key-value).\n\n| Key                             | Value     |\n|---------------------------------|-----------|\n| **/application/config.message** | **Hello** |\n\n## Create a Quarkus app\n\nIn this section, you create a Quarkus app with the Azure App Configuration extension and the REST extension. The REST extension is used to create a REST service that returns the configuration value from the App Configuration store. For more information, see [Quarkus Azure App Configuration](https://quarkus.io/extensions/io.quarkiverse.azureservices/quarkus-azure-app-configuration/).\n\nCreate a Quarkus app by using the following command:\n\n```bash\nmvn io.quarkus.platform:quarkus-maven-plugin:create \\\n    -DprojectGroupId=com.example \\\n    -DprojectArtifactId=quarkus-app-configuration \\\n    -Dextensions='io.quarkiverse.azureservices:quarkus-azure-app-configuration,rest' \\\n    -DjavaVersion=\"17\"\n```\n\nThe app is created in a new directory named **quarkus-app-configuration**. Here's the structure of the app:\n\n```\nquarkus-app-configuration\n├── src\n│   ├── main/java/com/example\n│   │   ├── GreetingResource.java\n│   └── test/java/com/example\n│       └── GreetingResourceTest.java\n├── pom.xml\n```\n\nThe **pom.xml** file contains the dependencies for the app, including the Azure App Configuration extension and the REST extension. The following XML is a typical example:\n\n```xml\n<dependency>\n    <groupId>io.quarkiverse.azureservices</groupId>\n    <artifactId>quarkus-azure-app-configuration</artifactId>\n</dependency>\n<dependency>\n    <groupId>io.quarkus</groupId>\n    <artifactId>quarkus-rest</artifactId>\n</dependency>\n```\n\nThe **GreetingResource.java** file contains the REST service. You modify this file to return the configuration value from the App Configuration store later.\n\nThe **GreetingResourceTest.java** file contains the unit test for the REST service. You modify this file to assert that the value returned from the REST service equals the value in the App Configuration store later.\n\n## Connect to an App Configuration store\n\nNow that you have an App Configuration store and a Quarkus app with the Azure App Configuration extension, you can connect the app to the store.\n\n### Code the application\n\nConfigure the application by using the following steps:\n\n1. Open the **GreetingResource.java** file in the **src/main/java/com/example** directory, and replace the contents with the following code:\n\n    ```java\n    package com.example;\n\n    import jakarta.ws.rs.GET;\n    import jakarta.ws.rs.Path;\n    import jakarta.ws.rs.Produces;\n    import jakarta.ws.rs.core.MediaType;\n\n    import org.eclipse.microprofile.config.inject.ConfigProperty;\n\n    @Path(\"/hello\")\n    public class GreetingResource {\n\n        @ConfigProperty(name = \"/application/config.message\")\n        String value;\n\n        @GET\n        @Produces(MediaType.TEXT_PLAIN)\n        public String hello() {\n            return value;\n        }\n    }\n    ```\n\n    The modified code uses the MicroProfile Config `@ConfigProperty` annotation to inject the value of the key `/application/config.message` from the App Configuration store into the `value` field, and returns the value in the REST service.\n\n1. Open the auto-generated unit test, which is in the **GreetingResourceTest.java** file in the **src/test/java/com/example** directory. Replace the contents of the file with the following code:\n\n    ```java\n    package com.example;\n\n    import io.quarkus.test.junit.QuarkusTest;\n    import org.junit.jupiter.api.Test;\n\n    import javax.inject.Inject;\n\n    import static io.restassured.RestAssured.given;\n    import static org.hamcrest.CoreMatchers.is;\n\n    @QuarkusTest\n    public class GreetingResourceTest {\n        @Test\n        public void testHelloEndpoint() {\n            given()\n                .when().get(\"/hello\")\n                .then()\n                .statusCode(200)\n                .body(is(\"Hello\"));\n        }\n    }\n    ```\n\n    The modified code asserts that the value returned from the REST service equals the value in the App Configuration store. This value is `Hello` for the key `/application/config.message` that you added earlier.\n\nThese code changes to the application are all required. Before running the application, you need to configure the authentication and connection to the App Configuration store.\n\n### Configure authentication to the App Configuration store\n\nBesides authentication with access keys, the Quarkus Azure App Configuration extension supports authentication with Microsoft Entra ID using `DefaultAzureCredential` from the Azure Identity client library.\n\nYou use Microsoft Entra ID for authentication in this quickstart. For more information, see [`DefaultAzureCredential`](/java/api/overview/azure/identity-readme#defaultazurecredential) in [Azure Identity client library for Java](/java/api/overview/azure/identity-readme).\n\nConfigure authentication to the App Configuration store by using the following steps:\n\n1. Set environment variables by using the following commands, replacing the `<...>` placeholders with the values you created previously:\n\n    ```bash\n    export RESOURCE_GROUP_NAME=\"<resource-group-name>\"\n    export APP_CONFIG_NAME=\"<app-configuration-store-name>\"\n    ```\n\n1. Use the following commands to assign the `App Configuration Data Reader` role to the signed-in user:\n\n    ```azurecli\n    # Retrieve the app configuration resource ID\n    export APP_CONFIGURATION_RESOURCE_ID=$(az appconfig show \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --name \"${APP_CONFIG_NAME}\" \\\n        --query 'id' \\\n        --output tsv)\n    # Assign the \"App Configuration Data Reader\" role to the current signed-in identity\n    az role assignment create \\\n        --assignee $(az ad signed-in-user show --query 'id' --output tsv) \\\n        --role \"App Configuration Data Reader\" \\\n        --scope $APP_CONFIGURATION_RESOURCE_ID\n    ```\n\n1. Export the endpoint of the App Configuration store to an environment variable named `QUARKUS_AZURE_APP_CONFIGURATION_ENDPOINT` by using the following command:\n\n    ```azurecli\n    export QUARKUS_AZURE_APP_CONFIGURATION_ENDPOINT=$(az appconfig show \\\n        --resource-group \"${RESOURCE_GROUP_NAME}\" \\\n        --name \"${APP_CONFIG_NAME}\" \\\n        --query endpoint \\\n        --output tsv)\n    ```\n\n    > [!NOTE]\n    > The value of the environment variable `QUARKUS_AZURE_APP_CONFIGURATION_ENDPOINT` is used in the configuration property `quarkus.azure.app.configuration.endpoint` of the Quarkus Azure App Configuration extension in order to set up the connection to the Azure App Configuration store. Alternatively, you can configure this property in the **application.properties** file in the **src/main/resources** directory by setting it directly, as in the following example. Be sure to replace `<your-app-configuration-store-endpoint>` with your actual value.\n    >\n    > ```properties\n    > quarkus.azure.app.configuration.endpoint=<your-app-configuration-store-endpoint>\n    > ```\n\n### Build and run the app locally\n\nBuild and run the app locally by using the following steps:\n\n1. Use the following commands to build and run the app in JVM mode:\n\n    ```bash\n    # Build, test and package the app\n    mvn clean package\n\n    # Run the app\n    java -jar ./target/quarkus-app/quarkus-run.jar\n    ```\n\n    > [!NOTE]\n    > As an alternative, you can run the sample in native mode. To use native mode, you need to have GraalVM installed, or use a builder image to build the native executable. For more information, see [Building a Native Executable](https://quarkus.io/guides/building-native-image). This quickstart uses Docker as container runtime to build a Linux native executable. If you don't have Docker installed, you can download it from the [Docker website](https://www.docker.com/products/docker-desktop).\n    >\n    > Use the following commands to build and execute the native executable in a Linux environment:\n    >\n    > ```bash\n    > mvn package -Dnative -Dquarkus.native.container-build\n    > ./target/storage-blob-1.0.0-SNAPSHOT-runner\n    > ```\n\n1. Test your application by using the following command:\n\n    ```bash\n    curl localhost:8080/hello\n    ```\n\n    You should see `Hello` in the output, because `Hello` is the value of the `/application/config.message` key you added to the App Configuration store.\n\n1. Press <kbd>Control</kbd>+<kbd>C</kbd> to stop the application.\n\n## Clean up resources\n\nTo avoid Azure charges, you should clean up unneeded resources. When you no longer need the App Configuration store, use the following command to remove the resource group and all related resources:\n\n```azurecli\naz group delete --name $RESOURCE_GROUP_NAME --yes --no-wait\n```\n\n## See also\n\n- [Quarkus Azure App Configuration](https://quarkus.io/extensions/io.quarkiverse.azureservices/quarkus-azure-app-configuration/)\n- [Secure Quarkus applications with Microsoft Entra ID using OpenID Connect](./quarkus-with-microsoft-entra-id.md)\n- [Deploy a Java application with Quarkus on Azure Container Apps](./deploy-java-quarkus-app.md)\n- [Deploy a Java application with Quarkus on an Azure Kubernetes Service cluster](/azure/aks/howto-deploy-java-quarkus-app)\n- [Deploy serverless Java apps with Quarkus on Azure Functions](/azure/azure-functions/functions-create-first-quarkus)\n"
  },
  {
    "path": "articles/java/ee/quarkus-with-microsoft-entra-id.md",
    "content": "---\ntitle: Quarkus with Microsoft Entra ID\ntitleSuffix: Azure\ndescription: Shows you how to secure Red Hat Quarkus applications with Microsoft Entra ID using OpenID Connect (OIDC).\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.topic: quickstart\nms.date: 03/26/2026\nms.custom: devx-track-java, devx-track-javaee, devx-track-javaee-quarkus, devx-track-javaee-quarkus-entra-id, devx-track-extended-java, devx-track-azurecli\n---\n\n# Secure Quarkus applications with Microsoft Entra ID using OpenID Connect\n\nThis article shows you how to secure Red Hat Quarkus applications with Microsoft Entra ID using OpenID Connect (OIDC).\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> - Set up an OpenID Connect provider with Microsoft Entra ID.\n> - Protect a Quarkus app by using OpenID Connect.\n> - Run and test the Quarkus app.\n\n## Prerequisites\n\n[!INCLUDE [secure-with-entra-id-prerequisites](includes/secure-with-entra-id-prerequisites.md)]\n\n## Set up an OpenID Connect provider with Microsoft Entra ID\n\nIn this section, you set up an OpenID Connect provider with Microsoft Entra ID for use with your Quarkus app. In a later section, you configure the Quarkus app by using OpenID Connect to authenticate and authorize users in your Microsoft Entra tenant.\n\n### Create users in Microsoft Entra tenant\n\n[!INCLUDE [secure-with-entra-id-create-users](includes/secure-with-entra-id-create-users.md)]\n\n### Register an application in Microsoft Entra ID\n\n[!INCLUDE [secure-with-entra-id-register-app](includes/secure-with-entra-id-register-app.md)]\n\n### Add app roles to your application\n\n[!INCLUDE [secure-with-entra-id-add-app-roles](includes/secure-with-entra-id-add-app-roles.md)]\n\n## Protect a Quarkus app by using OpenID Connect\n\nIn this section, you secure a Quarkus app that authenticates and authorizes users in your Microsoft Entra tenant by using OpenID Connect. You also learn how to give users access to certain parts of the app using role-based access control (RBAC).\n\nThe sample Quarkus app for this quickstart is on GitHub in the [quarkus-azure](https://github.com/Azure-Samples/quarkus-azure/tree/2024-09-26) repository, and located in the [entra-id-quarkus](https://github.com/Azure-Samples/quarkus-azure/tree/2024-09-26/entra-id-quarkus) directory.\n\n### Enable authentication and authorization to secure app\n\nThe app has a welcome page resource defined in [WelcomePage.java](https://github.com/Azure-Samples/quarkus-azure/blob/2024-09-26/entra-id-quarkus/src/main/java/com/example/WelcomePage.java), which is shown in the following example code. This page is accessible to unauthenticated users. The root path of the welcome page is at `/`.\n\n```java\n@Path(\"/\")\npublic class WelcomePage {\n\n    private final Template welcome;\n\n    public WelcomePage(Template welcome) {\n        this.welcome = requireNonNull(welcome, \"welcome page is required\");\n    }\n\n    @GET\n    @Produces(MediaType.TEXT_HTML)\n    public TemplateInstance get() {\n        return welcome.instance();\n    }\n\n}\n```\n\nFrom the welcome page, users can sign in to the app to access the profile page. The welcome page has links to sign in as a user or as an admin. The links are at `/profile/user` and `/profile/admin`, respectively. The welcome page UI is defined in [welcome.qute.html](https://github.com/Azure-Samples/quarkus-azure/blob/2024-09-26/entra-id-quarkus/src/main/resources/templates/welcome.qute.html) and shown in the following example:\n\n```html\n<html>\n    <head>\n        <meta charset=\"UTF-8\">\n        <title>Greeting</title>\n    </head>\n    <body>\n        <h1>Hello, welcome to Quarkus and Microsoft Entra ID integration!</h1>\n        <h1>\n            <a href=\"/profile/user\">Sign in as user</a>\n        </h1>\n        <h1>\n            <a href=\"/profile/admin\">Sign in as admin</a>\n        </h1>\n    </body>\n</html>\n```\n\nBoth `/profile/user` and `/profile/admin` links point to the profile page resource, defined in [ProfilePage.java](https://github.com/Azure-Samples/quarkus-azure/blob/2024-09-26/entra-id-quarkus/src/main/java/com/example/ProfilePage.java), as shown in the following example code. This page is accessible only to authenticated users by using the `@RolesAllowed(\"**\")` annotation from the `jakarta.annotation.security.RolesAllowed` package. The `@RolesAllowed(\"**\")` annotation specifies that only authenticated users can access the `/profile` path.\n\n```java\n@Path(\"/profile\")\n@RolesAllowed(\"**\")\npublic class ProfilePage {\n\n    private final Template profile;\n\n    @Inject\n    SecurityIdentity identity;\n\n    @Inject\n    JsonWebToken accessToken;\n\n    public ProfilePage(Template profile) {\n        this.profile = requireNonNull(profile, \"profile page is required\");\n    }\n\n    @Path(\"/admin\")\n    @GET\n    @Produces(MediaType.TEXT_HTML)\n    @RolesAllowed(\"admin\")\n    public TemplateInstance getAdmin() {\n        return getProfile();\n    }\n\n    @Path(\"/user\")\n    @GET\n    @Produces(MediaType.TEXT_HTML)\n    @RolesAllowed({\"user\",\"admin\"})\n    public TemplateInstance getUser() {\n        return getProfile();\n    }\n\n    private TemplateInstance getProfile() {\n        return profile\n                .data(\"name\", identity.getPrincipal().getName())\n                .data(\"roles\", identity.getRoles())\n                .data(\"scopes\", accessToken.getClaim(\"scp\"));\n    }\n\n}\n```\n\nThe profile page resource enables RBAC by using the `@RolesAllowed` annotation. The arguments to the `@RolesAllowed` annotation specify that only users with the `admin` role can access the `/profile/admin` path, and users with the `user` or `admin` role can access the `/profile/user` path.\n\nBoth the `/profile/admin` and `/profile/user` endpoints return the profile page. The profile page UI is defined in [profile.qute.html](https://github.com/Azure-Samples/quarkus-azure/blob/2024-09-26/entra-id-quarkus/src/main/resources/templates/profile.qute.html), as shown in the following example. This page displays the user's name, roles, and scopes. The profile page also has a sign-out link at `/logout`, which redirects the user to OIDC provider to sign out. The profile page is written using the Qute templating engine. Note the use of `{}` expressions in the page. These expressions make use of the values passed to the `TemplateInstance` using the `data()` method. For more information on Qute, see [Qute templating engine](https://quarkus.io/guides/qute).\n\n```html\n<html>\n    <head>\n        <meta charset=\"UTF-8\">\n        <title>Profile</title>\n    </head>\n    <body>\n        <h1>Hello, {name}</h1>\n        <h2>Roles</h2>\n        <ul>\n            {#if roles}\n                {#for role in roles}\n                    <li>{role}</li>\n                {/for}\n            {#else}\n                <li>No roles found!</li>\n            {/if}\n        </ul>\n        <h2>Scopes</h2>\n        <p>\n            {scopes}\n        </p>\n        <h1>\n            <b><a href=\"/logout\">Sign out</a></b>\n        </h1>\n    </body>\n</html>\n```\n\nAfter sign out, the user is redirected to the welcome page and can sign in again.\n\n## Run and test the Quarkus app\n\nIn this section, you run and test the Quarkus app to see how it works with Microsoft Entra ID as the OpenID Connect provider.\n\n### Add a redirect URI to the app registration\n\n[!INCLUDE [secure-with-entra-id-add-redirect-uri](includes/secure-with-entra-id-add-redirect-uri.md)]\n\n- For **Configure platforms**, select **Web**.\n- For **Redirect URIs**, enter `http://localhost:8080`.\n\n### Prepare the sample\n\nUse the following steps to prepare the sample Quarkus app:\n\n1. Use the following commands to clone the sample Quarkus app from GitHub and navigate to the **entra-id-quarkus** directory:\n\n   ```bash\n   git clone https://github.com/Azure-Samples/quarkus-azure\n   cd quarkus-azure/entra-id-quarkus\n   git checkout 2024-09-26\n   ```\n\n   If you see a message about being in *detached HEAD* state, this message is safe to ignore. Because this article doesn't require any commits, detached HEAD state is appropriate.\n\n1. Use the following commands to define the following environment variables with the values you wrote down earlier:\n\n   ```bash\n   export QUARKUS_OIDC_CLIENT_ID=<application/client-ID>\n   export QUARKUS_OIDC_CREDENTIALS_SECRET=<client-secret>\n   export QUARKUS_OIDC_AUTH_SERVER_URL=https://login.microsoftonline.com/<directory/tenant-ID>/v2.0\n   ```\n\n   These environment variables provide the values for the built-in support of OpenID Connect in Quarkus. The corresponding properties in `application.properties` are shown in the following example.\n\n   ```properties\n   quarkus.oidc.client-id=\n   quarkus.oidc.credentials.secret=\n   quarkus.oidc.auth-server-url=\n   ```\n\n   If the value of a property is blank in `application.properties`, Quarkus converts the property name into an environment variable and reads the value from the environment. For details on the naming conversion, see [the MicroProfile Config specification](https://download.eclipse.org/microprofile/microprofile-config-3.0/microprofile-config-spec-3.0.html#default_configsources.env.mapping).\n\n### Run the Quarkus app\n\nYou can run the Quarkus app in different modes. Select one of the following methods to run the Quarkus app. To enable Quarkus to connect to Microsoft Entra ID, be sure to run the command in the shell in which you defined the environment variables shown in the preceding section.\n\n* Run the Quarkus app in development mode:\n\n  ```bash\n  mvn quarkus:dev\n  ```\n\n* Run the Quarkus app in JVM mode:\n\n  ```bash\n  mvn install\n  java -jar target/quarkus-app/quarkus-run.jar\n  ```\n\n* Run the Quarkus app in native mode:\n\n  ```bash\n  mvn install -Dnative -Dquarkus.native.container-build\n  ./target/quarkus-ad-1.0.0-SNAPSHOT-runner\n  ```\n\nIf you want to try different modes, use <kbd>Ctrl</kbd>+<kbd>C</kbd> to stop the Quarkus app and then run the Quarkus app in another mode.\n\n### Test the Quarkus app\n\nAfter the Quarkus app is running, open a web browser with a private tab and navigate to `http://localhost:8080`. You should see the welcome page with links to sign in as a user or as an admin. Using a private tab avoids polluting any existing Microsoft Entra ID activity you might have in your regular browser.\n\n:::image type=\"content\" source=\"media/quarkus-with-microsoft-entra-id/welcome-page.png\" alt-text=\"Screenshot of the sample application that shows the welcome page.\" lightbox=\"media/quarkus-with-microsoft-entra-id/welcome-page.png\":::\n\n#### Gather the credentials for the two users\n\n[!INCLUDE [secure-with-entra-id-gather-user-credentials](includes/secure-with-entra-id-gather-user-credentials.md)]\n\n#### Exercise the functionality of the app\n\nUse the following steps to exercise the functionality:\n\n1. Select the **Sign in as user** link. Sign in with the regular user you created earlier. After you sign in, Microsoft Entra ID redirects you to the profile page, where you see your name, roles, and scopes.\n\n   :::image type=\"content\" source=\"media/quarkus-with-microsoft-entra-id/user-profile.png\" alt-text=\"Screenshot of the sample application that shows the user profile.\" lightbox=\"media/quarkus-with-microsoft-entra-id/user-profile.png\":::\n\n1. If this is the first time you sign in, you're prompted to update your password. Follow the instructions to update your password.\n\n1. If you're prompted with **Your organization requires additional security information. Follow the prompts to download and set up the Microsoft Authenticator app**, you can select **Ask later** to continue the test.\n\n1. If you're prompted with **Permissions requested**, review the permissions requested by the app. Select **Accept** to continue the test.\n\n1. Select **Sign out** to sign out from the Quarkus app. Microsoft Entra ID performs the sign out. After you sign out, Microsoft Entra ID redirects you to the welcome page.\n\n1. Select the **Sign in as admin** link. Microsoft Entra ID redirects you to the sign-in page. Sign in with the admin user you created earlier. After you sign in, Microsoft Entra ID redirects you to the similar profile page, with a different role `admin`.\n\n   :::image type=\"content\" source=\"media/quarkus-with-microsoft-entra-id/admin-profile.png\" alt-text=\"Screenshot of the sample application that shows the admin profile.\" lightbox=\"media/quarkus-with-microsoft-entra-id/admin-profile.png\":::\n\n1. Sign out again and try to **Sign in as admin**  with the regular user you created earlier. You should see an error message because the regular user doesn't have the `admin` role.\n\n   :::image type=\"content\" source=\"media/quarkus-with-microsoft-entra-id/forbidden.png\" alt-text=\"Screenshot of the sample application that shows the access denied message.\" lightbox=\"media/quarkus-with-microsoft-entra-id/forbidden.png\":::\n\n## Clean up resources\n\n[!INCLUDE [secure-with-entra-id-clean-up-resources](includes/secure-with-entra-id-clean-up-resources.md)]\n\n## Next steps\n\nIn this quickstart, you protect Quarkus applications with Microsoft Entra ID using OpenID Connect. To learn more, explore the following resources:\n\n- [Deploy a Java application with Quarkus on an Azure Container Apps](/azure/developer/java/ee/deploy-java-quarkus-app)\n- [OpenID Connect authentication with Microsoft Entra ID](/entra/architecture/auth-oidc)\n- [Microsoft identity platform and OAuth 2.0 authorization code flow](/entra/identity-platform/v2-oauth2-auth-code-flow)\n- [Protect a web application by using OpenId Connect (OIDC) authorization code flow](https://quarkus.io/guides/security-oidc-code-flow-authentication-tutorial)\n- [OpenID Connect authorization code flow mechanism for protecting web applications](https://quarkus.io/guides/security-oidc-code-flow-authentication)\n- [OpenID Connect (OIDC) configuration properties](https://quarkus.io/guides/security-oidc-configuration-properties-reference)\n"
  },
  {
    "path": "articles/java/ee/toc.yml",
    "content": "items:\n- name: Java EE, Jakarta EE, and MicroProfile on Azure documentation\n  href: index.yml\n  items:\n  - name: Quickstart\n    expanded: true\n    items:\n      - name: WebSphere Liberty and Open Liberty on Azure Red Hat OpenShift\n        href: /azure/openshift/howto-deploy-java-liberty-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebSphere Liberty and Open Liberty on AKS\n        href: /azure/aks/howto-deploy-java-liberty-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebSphere Liberty and Open Liberty with Microsoft Entra ID\n        href: liberty-with-microsoft-entra-id.md\n      - name: WebSphere (Traditional) cluster on Azure VMs\n        href: traditional-websphere-application-server-virtual-machines.md\n      - name: WebLogic Server on Azure VM\n        href: /azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic Server on AKS\n        href: /azure/aks/howto-deploy-java-wls-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: JBoss EAP cluster on Azure VMs\n        href: /azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: JBoss EAP on Azure Red Hat OpenShift\n        href: /azure/openshift/howto-deploy-java-jboss-enterprise-application-platform-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: Quarkus on Azure Container Apps\n        href: deploy-java-quarkus-app.md\n      - name: Quarkus with Microsoft Entra ID\n        href: quarkus-with-microsoft-entra-id.md\n      - name: Quarkus with Azure App Configuration\n        href: quarkus-with-app-configuration.md\n  - name: Java application servers on Azure\n    expanded: true\n    items:\n      - name: WebLogic Server on Azure VMs\n        href: /azure/virtual-machines/workloads/oracle/oracle-weblogic?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic Server on AKS\n        href: /azure/virtual-machines/workloads/oracle/weblogic-aks?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebSphere family on Azure\n        href: websphere-family.md\n      - name: JBoss EAP on Azure\n        href: jboss-on-azure.md\n  - name: Deployment\n    expanded: true\n    items:\n      - name: WebSphere Liberty/Open Liberty on Azure Red Hat OpenShift\n        href: liberty-on-aro.md\n      - name: WebSphere Liberty/Open Liberty on AKS\n        href: howto-deploy-java-liberty-app-manual.md\n      - name: Open Liberty on Azure Container Apps\n        href: deploy-java-liberty-app-aca.md\n      - name: WebSphere (Traditional) on Azure VMs\n        href: ../migration/migrate-websphere-to-azure-vm-manually.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebSphere to Azure VMs with HADR\n        href: ../migration/migrate-websphere-to-vms-with-ha-dr.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebSphere Liberty/Open Liberty to AKS with HADR\n        href: ../migration/migrate-liberty-to-aks-with-ha-dr.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: Azure Redis as WebSphere Liberty/Open Liberty session cache\n        href: how-to-deploy-java-liberty-jcache.md\n      - name: Passwordless database connections for WebSphere\n        href: how-to-configure-passwordless-datasource-websphere.md\n      - name: WebLogic to Azure VMs with HADR\n        href: ../migration/migrate-weblogic-to-vms-with-ha-dr.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic to AKS with geo-redundancy\n        href: ../migration/migrate-weblogic-to-aks-with-ha-geo-redundancy.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: Passwordless database connections for WebLogic Server\n        href: how-to-configure-passwordless-datasource-wls.md\n      - name: JBoss EAP on Azure VMs\n        href: ../migration/migrate-jboss-eap-to-azure-vm-manually.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: JBoss EAP on Azure Red Hat OpenShift\n        href: jboss-eap-on-aro.md\n      - name: Passwordless database connections for JBoss EAP\n        href: how-to-configure-passwordless-datasource-eap.md\n  - name: Migrate WebSphere to Azure\n    expanded: true\n    items:\n      - name: WebSphere to Azure Virtual Machines\n        href: ../migration/migrate-websphere-to-virtual-machines.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebSphere to Azure VMs step-by-step guidance\n        href: ../migration/migrate-websphere-to-azure-vm-manually.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebSphere to AKS\n        href: ../migration/migrate-websphere-to-azure-kubernetes-service.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebSphere to JBoss EAP on Azure App Service\n        href: ../migration/migrate-websphere-to-jboss-eap-on-azure-app-service.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebSphere to Azure Red Hat OpenShift\n        href: ../migration/migrate-websphere-to-azure-redhat-openshift.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n  - name: Migrate WebLogic to Azure\n    expanded: true\n    items:\n      - name: WebLogic to AKS\n        href: ../migration/migrate-weblogic-to-azure-kubernetes-service.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic to Azure Virtual Machines\n        href: ../migration/migrate-weblogic-to-virtual-machines.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic with App Gateway\n        href: ../migration/migrate-weblogic-with-app-gateway.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic to Azure VMs step-by-step guidance\n        href: ../migration/migrate-weblogic-to-azure-vm-manually.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic to AKS within custom VNET\n        href: ../migration/migrate-weblogic-to-aks-within-an-existing-vnet.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic to AKS with KEDA scaler based on Prometheus Metrics\n        href: ../migration/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic to Azure VMs with Elastic\n        href: ../migration/migrate-weblogic-with-elk.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic to Azure VMs with Entra ID\n        href: ../migration/migrate-weblogic-with-entra-id-via-ldap.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: WebLogic to JBoss EAP on Azure App Service\n        href: ../migration/migrate-weblogic-to-jboss-eap-on-azure-app-service.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n  - name: Migrate JBoss EAP to Azure\n    expanded: true\n    items:\n      - name: JBoss EAP to Azure VMs\n        href: ../migration/migrate-jboss-eap-to-jboss-eap-on-azure-vms.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: JBoss EAP to Azure VMs step-by-step guidance\n        href: ../migration/migrate-jboss-eap-to-azure-vm-manually.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: JBoss EAP to Azure App Service\n        href: ../migration/migrate-jboss-eap-to-jboss-eap-on-azure-app-service.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: JBoss EAP to Azure Red Hat OpenShift\n        href: ../migration/migrate-jboss-eap-to-azure-redhat-openshift.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n"
  },
  {
    "path": "articles/java/ee/traditional-websphere-application-server-virtual-machines.md",
    "content": "---\ntitle: Deploy WebSphere Application Server Cluster on Azure VMs\ndescription: Shows you how to deploy a traditional WebSphere Application Server cluster on Azure Virtual Machines using Azure Marketplace offer.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.topic: quickstart\nms.date: 03/26/2026\nms.custom:\n  - devx-track-extended-java\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-was-vm\n  - devx-track-javaee-was\n  - devx-track-javaee-websphere\n  - sfi-image-nochange\n#customer intent: As a developer, I want to deploy a WebSphere Application Server cluster on Azure VMs so that I can run my applications in a scalable and reliable environment.\n---\n\n# Quickstart: Deploy WebSphere Application Server Network Deployment cluster on Azure Virtual Machines\n\nIn this quickstart, you quickly deploy a cluster of traditional WebSphere Application Server (WAS) Network Deployment (ND) instances on Azure Virtual Machines (VMs). This article uses the Azure Marketplace offer for IBM WAS ND cluster to accelerate your journey to Azure VMs. The offer automatically provisions a number of resources including latest Red Hat Enterprise Linux (RHEL) VMs with fixes, latest WebSphere Application Server ND 9.0.5.x on each VM with fixes, latest IBM Java Development Kit (JDK) 8 with fixes on each VM, a Deployment Manager on one of the VMs with Administrative Console enabled, and optionally an IBM HTTP Server (IHS) or Azure Application Gateway as load balancer. Visit Azure portal to see the offer [IBM WAS ND cluster on Azure VMs](https://aka.ms/twas-cluster-portal). \n\nIf you prefer manual step-by-step guidance for installing IBM WAS ND cluster that doesn't utilize the automation enabled by the offer, see [Tutorial: Manually install IBM WebSphere Application Server Network Deployment traditional on Azure Virtual Machines](../migration/migrate-websphere-to-azure-vm-manually.md?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json).\n\nIf you're interested in providing feedback or working closely on your migration scenario with the engineering team developing WebSphere on Azure solutions, fill out this short [survey on WebSphere migration](https://aka.ms/websphere-on-azure-survey) and include your contact information. The team of program managers, architects, and engineers will promptly get in touch with you to initiate close collaboration.\n\n## Prerequisites\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n- Ensure the Azure identity you use to sign in has either the [Contributor](/azure/role-based-access-control/built-in-roles#contributor) role or the [Owner](/azure/role-based-access-control/built-in-roles#owner) role in the current subscription. For an overview of Azure roles, see [What is Azure role-based access control (Azure RBAC)?](/azure/role-based-access-control/overview)\n- An IBMid with necessary entitlement for WebSphere Traditional (optional). If you create the deployment with an evaluation license, you don't need to provide an IBMid with entitlement for WebSphere Traditional. To get the benefit, you need to accept the [IBM WebSphere Application Server License Agreement](https://ibm.biz/tWASNDLicenseAzureVMs) during the deployment creation steps. Otherwise, you must enter your registered IBMid and your IBMid must have active WebSphere entitlements associated with it. If provisioning with IBMid fails due to lack of entitlements, ask the primary or secondary contacts for your IBM Passport Advantage site to grant you access. Alternately, follow steps at IBM eCustomer Care for further assistance. This offer assumes you're properly licensed to run offers in Microsoft Azure. For more information, see [IBM eCustomer Care](https://ibm.biz/IBMidEntitlement).\n\n## Deploy a cluster\n\nThe steps in this section direct you to deploy an IBM WAS ND cluster on Azure VMs.\n\nUse the following steps to find the IBM WAS ND cluster on Azure VMs offer:\n\n1. Sign in to the Azure portal.\n1. In the search bar at the top of the Azure portal, enter **IBM WAS ND**. In the search results, in the **Marketplace** section, select **IBM WAS ND cluster on Azure VMs**.\n\n   :::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/marketplace-search-results.png\" alt-text=\"Screenshot of the Azure portal that shows IBM WAS ND cluster on Azure VMs in the search results.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/marketplace-search-results.png\":::\n\nAlternatively, you can also go directly to the [IBM WAS ND cluster on Azure VMs](https://aka.ms/twas-cluster-portal) offer.\n\nIn either case, this offer deploys an IBM WAS ND cluster on Azure VMs. The cluster includes the following components:\n\n- One Deployment Manager instance for managing the applications and application servers.\n- One IBM HTTP Server instance for managing load balancing.\n- WebSphere Application Server instances (nodes) for running your applications (defaults to 3 for High Availability).\n\nThe following diagram shows the default configuration.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/default-configuration-cluster-deployment.png\" alt-text=\"Diagram that shows the default configuration of IBM WAS ND cluster deployment.\":::\n\nTo start your deployment, select **Create** on the offer page.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/cluster-create-page.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WAS ND cluster on Azure VMs offering.\":::\n\nThen, you're shown the **Create Traditional WebSphere ND Cluster** page where you can start configuring the deployment.\n\nThe following steps show you how to fill out the **Basics** pane shown in the following screenshot.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-basics-tab.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WAS ND cluster on Azure VMs Basics pane.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-basics-tab.png\":::\n\n1. On the **Basics** pane, ensure that the value shown in the **Subscription** field is the same one that has the roles listed in the prerequisites section.\n1. In the **Resource group** field, select **Create new** and fill in a value for the resource group. Because resource groups must be unique within a subscription, pick a unique name. An easy way to have unique names is to use a combination of your initials, today's date, and some identifier - for example, **jm070924wasndcluster**.\n1. Under **Instance details**, select the region for the deployment.\n1. Leave the default option **Evaluation** for **Deploy with existing WebSphere entitlement or with evaluation license?**.\n\n   > [!NOTE]\n   > If you select the **Entitled** option, you must provide an IBMid that has entitlements for WebSphere Traditional.\n\n1. Select **I have read and accept the IBM License Agreement**.\n1. Select **I agree to IBM contacting my company or organization** if you're willing to let IBM and Microsoft contact you for further offer development. Otherwise, leave it unselected.\n1. Scroll to the bottom of the **Basics** pane and notice the helpful links for **Report issues, get help, and share feedback**.\n1. Select **Next** to go to the **Cluster configuration** pane.\n\nThe following steps show you how to fill out the **Cluster configuration** pane shown in the following screenshot.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-cluster-configuration-tab.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WAS ND cluster on Azure VMs Cluster configuration pane.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-cluster-configuration-tab.png\":::\n\n1. Use the default value **4** for **Number of VMs**.\n1. Leave the default VM size for **VM size**.\n1. Leave the default value **websphere** for **VM administrator**.\n1. Leave the default option **Password** for **Authentication type**. You can also select **SSH Public Key** which is more secure.\n1. Provide a password for **Password for VM administrator**. Use the same value for **Confirm password**.\n1. Leave the default value **wsadmin** for **WebSphere administrator**.\n1. Provide a password for **Password for WebSphere administrator**. Use the same value for **Confirm password**.\n1. Under **Advanced**, leave the default option **Yes** for **Accept defaults for advanced configuration**.\n1. Select **Next** to go to the **Load balancer** pane.\n\nThe following steps show you how to fill out the **Load balancer** pane shown in the following screenshot.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-load-balancer-tab.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WAS ND cluster on Azure VMs Load balancer pane.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-load-balancer-tab.png\":::\n\n1. Leave the default option **IBM HTTP Server** for **Select a load balancer**.\n\n   > [!NOTE]\n   > You use IBM HTTP Server (IHS) as the load balancer in this quickstart. Alternatively, you can use **Azure Application Gateway** as the load balancer. For more information on Azure Application Gateway, see [What is Azure Application Gateway?](/azure/application-gateway/overview).\n\n1. Under **IBM HTTP Server settings**, leave the default VM size for **VM size**.\n1. Leave the default value **ihsadmin** for **VM administrator**.\n1. Leave the default option **Password** for **Authentication type**. You can also select **SSH Public Key** which is more secure.\n1. Provide a password for **Password for VM administrator**. Use the same value for **Confirm password**.\n1. Leave the default value **ihsadmin** for **IBM HTTP Server administrator**.\n1. Provide a password for **Password for IBM HTTP Server administrator**. Use the same value for **Confirm password**.\n1. Under **Advanced**, leave the default option **Yes** for **Accept defaults for advanced configuration**.\n1. Select **Next** to go to the **Networking** pane.\n\nThe following steps show you how to fill out the **Networking** pane shown in the following screenshot. This pane enables you to customize the virtual network and subnet into which the IBM WAS ND cluster deploys. For information about virtual networks, see [Create, change, or delete a virtual network](/azure/virtual-network/manage-virtual-network).\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-networking-tab.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WAS ND cluster on Azure VMs Networking pane.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-networking-tab.png\":::\n\n1. Accept the defaults on this pane.\n1. Select **Next** to go to the **Database** pane.\n\nThe following steps show you how to fill out the **Database** pane shown in the following screenshot, and start the deployment.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-database-tab.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WAS ND cluster on Azure VMs Database pane.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-database-tab.png\":::\n\n1. Use the default option **No** for **Connect to database?** in this quickstart.\n\n   > [!NOTE]\n   > Alternatively, you can select **Yes** and provide the necessary details to connect to your database. For more information about connecting to a database, see [Tutorial: Migrate WebSphere Application Server to Azure Virtual Machines with high availability and disaster recovery](../migration/migrate-websphere-to-vms-with-ha-dr.md#deploy-the-primary-websphere-cluster).\n\n1. Select **Review + create**. If you see any **validation failed** error messages, fix validation problems, then select **Review + create** again.\n1. Select **Create**.\n1. Track the progress of the deployment on the **Deployment is in progress** page.\n\nDepending on network conditions and other activity in your selected region, the deployment may take up to 20 minutes to complete. After that, you should see the text **Your deployment is complete** displayed on the deployment page.\n\n## Access the WAS Administrative Console and IHS Console\n\nAfter the cluster deployment completes, select the **Outputs** section on the left panel to see the administrative console and IHS console URLs, along with other details.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/cluster-deployment-outputs.png\" alt-text=\"Screenshot of the Azure portal cluster Deployment Outputs page with adminSecuredConsole and ihsConsole fields highlighted.\":::\n\nUse the copy icon to copy these URLs for the **adminSecuredConsole** and the **ihsConsole**, then paste them into two different browser address bars to sign in to both consoles, separately. After the administrative console page loads, you should see the sign in page, as shown in the following screenshot.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/admin-console-login-page.png\" alt-text=\"Screenshot of IBM WebSphere Integrated Solutions Console sign-in page.\":::\n\nSign in using the WebSphere administrator credentials you provided when setting up the **Cluster configuration**. After signing in, you see the following page.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/admin-console-page.png\" alt-text=\"Screenshot of IBM WebSphere administrative console page.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/admin-console-page.png\":::\n\nThen, sign in to the IHS console. After the IHS console loads, you should see the following page:\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/ibm-http-server-console-page.png\" alt-text=\"Screenshot of IBM WebSphere Integrated Solutions Console page.\":::\n\n## Trying out an application\n\nFirst, use the following steps to enable the option **Synchronize changes with Nodes** so that any configuration can be automatically synchronized to all application servers of the cluster:\n\n1. On the administrative console that you signed into earlier, select **System administration** > **Console Preferences**.\n1. In the **Console Preferences** pane, select **Synchronize changes with Nodes**, and then select **Apply**. You should see the message **Your preferences have been changed.**\n\nNow, follow these instructions if you'd like to try out an application in the cluster:\n\n1. On the administrative console that you signed into earlier, select **Applications** > **New Application** and then select **New Enterprise Application**.\n\n2. On the next panel, select **Remote file system** and then select **Browse…**. You're given the option to browse the file systems of your installed servers.\n\n3. Select the system that begins with **Dmgr**. You're shown the Deployment Manager's file system. From there, select **V9** and then **installableApps**. In that directory, you should see many applications available to install. Select **DefaultApplication.ear** and then select **OK**.\n\nThen, you're taken back to the page for selecting the application, which should look like the following screenshot:\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/select-test-app-page.png\" alt-text=\"Screenshot of IBM WebSphere 'Specify the EAR, WAR, JAR, or SAR module to upload and install' dialog.\":::\n\nSelect **Next** and then **Next** to go with the **Fast Path** deployment process.\n\nIn the **Fast Path** wizard, use the defaults for everything except **Step 2: Map modules to servers**. On that page, select the checkbox for the **Default Web Application Module** row, then hold Ctrl and select the options under **Clusters and servers**. Finally, select **Apply**.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/map-modules-to-servers-configuration-page.png\" alt-text=\"Screenshot of IBM WebSphere 'Install New Application' dialog with 'Step 2: Map modules to servers' pane.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/map-modules-to-servers-configuration-page.png\":::\n\nYou should see new entries in the table under the **Server** column. These entries should look similar to the ones in the following screenshot.\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/map-modules-to-servers-outcome-page.png\" alt-text=\"Screenshot of IBM WebSphere 'Install New Application' dialog with 'Step 2: Map modules to servers' pane showing and 'Server' table column highlighted.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/map-modules-to-servers-outcome-page.png\":::\n\nAfter you complete all the steps, select **Finish**, and then on the next page select **Save**. You should see messages for **Synchronize changes with Nodes**, as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/nodes-synchronized-message-page.png\" alt-text=\"Screenshot of IBM WebSphere 'Install New Application' synchronized to all nodes.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/nodes-synchronized-message-page.png\":::\n\nNext, you need to start the application. Go to **Applications** > **All Applications**. Select the checkbox for **DefaultApplication.ear**, ensure the **Action** is set to **Start**, and then select **Submit Action**.\n\nYou should see success messages, as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/start-app-message-page.png\" alt-text=\"Screenshot of IBM WebSphere Messages pane.\" lightbox=\"media/traditional-websphere-application-server-virtual-machines/start-app-message-page.png\":::\n\nWhen you see the success messages, you can try the app. In your browser, navigate to the IHS deployment and add `/snoop`. You should see information similar to the following about the server instance that processed the request:\n\n:::image type=\"content\" source=\"media/traditional-websphere-application-server-virtual-machines/test-app-running-page.png\" alt-text=\"Screenshot of test application running in a browser.\":::\n\nWhen you refresh the browser, the app cycles through the server instances of the cluster.\n\n## Clean up resources\n\nTo avoid Azure charges, you should clean up unnecessary resources. When you no longer need the cluster, use the following steps to delete the resource groups to clean up the resources used in this tutorial:\n\n1. Sign in to the Azure portal.\n1. Enter the resource group name of your WAS ND cluster - for example, `jiangma070924wasndcluster` - in the search box at the top of the Azure portal, and select the matched resource group from the search results.\n1. Select **Delete resource group**.\n1. In **Enter resource group name to confirm deletion**, enter the resource group name.\n1. Select **Delete**.\n\n## Next step\n\nTo explore options to run WebSphere products on Azure, see the following article:\n\n> [!div class=\"nextstepaction\"]\n> [What are solutions to run the WebSphere family of products on Azure?](websphere-family.md)\n"
  },
  {
    "path": "articles/java/ee/websphere-family.md",
    "content": "---\ntitle: What are Solutions to Run the WebSphere Family of Products on Azure\ndescription: WebSphere products are key components in enabling enterprise Java workloads on Azure. IBM and Microsoft collaborate on a complete set of jointly developed and supported solutions for the product family.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: rezar\nms.topic: overview\nms.date: 03/26/2026\nms.custom: devx-track-extended-java, devx-track-java, devx-track-javaee, devx-track-javaee-websphere, template-overview, linux-related-content\n---\n\n# What are solutions to run the WebSphere family of products on Azure?\n\nThis article describes the solutions for running the IBM WebSphere family of products on Azure. IBM and Microsoft jointly develop and support these solutions.\n\nThe IBM WebSphere product portfolio is a set of industry-leading runtimes powering some of the most mission-critical enterprise applications across geographies and environments. The WebSphere portfolio includes WebSphere (traditional) Application Server, WebSphere Liberty, and Open Liberty.\n\nWebSphere products are key components in enabling enterprise Java workloads on Azure. The jointly developed solutions of the [IBM WebSphere Product Family on Azure](https://azuremarketplace.microsoft.com/marketplace/apps/ibm-usa-ny-armonk-hq-6275750-ibmcloud-aiops.2021-02-17_websphere_offerings_contact_me?tab=Overview) are available in Azure Marketplace. They aim to cover a range of use cases from mission-critical existing traditional workloads to cloud-native applications. The solutions target Open Liberty on Azure Red Hat OpenShift, WebSphere Liberty on Azure Red Hat OpenShift, Open Liberty on Azure Kubernetes Service (AKS), WebSphere Liberty on AKS, and WebSphere Application Server on Virtual Machines. The solutions are aimed at making it as easy as possible to migrate your application to the cloud by automating most boilerplate Azure and Java resource provisioning and configuration tasks. After initial provisioning is done, you're completely free to customize deployments further.\n\n:::image type=\"content\" border=\"false\" source=\"media/websphere-family/websphere-family.svg\" alt-text=\"Diagram showing the interaction of IBM products on Azure.\" lightbox=\"media/websphere-family/websphere-family.svg\":::\n\nIf you're interested in providing feedback or working closely on your migration scenarios with the engineering team developing WebSphere on Azure solutions, fill out this short [survey on WebSphere migration](https://aka.ms/websphere-on-azure-survey) and include your contact information. The team of program managers, architects, and engineers will promptly get in touch with you to initiate close collaboration.\n\nYou can open support issues on the jointly developed offers with either IBM or Microsoft. When appropriate, IBM and Microsoft collaborate on their resolution. Beyond the offers, Microsoft provides support for Azure. IBM similarly provides support for WebSphere, WebSphere Liberty, and Open Liberty.\n\n## Open Liberty and WebSphere Liberty on Azure Red Hat OpenShift\n\nThe offer [WebSphere Liberty or Open Liberty on Azure Red Hat OpenShift](https://ibm.biz/liberty-aro), located in Azure Marketplace, automatically provisions several Azure resources. The offer enables a swift transition to WebSphere Liberty or Open Liberty on Azure Red Hat OpenShift. The automatically provisioned resources include an Azure Red Hat OpenShift cluster and the Liberty Operators. A secure OpenShift project is set up to contain your application. The offer can also deploy a sample application or a container image with your application. If you prefer a native OpenShift manual deployment experience instead of automated provisioning using the offer, IBM and Microsoft also provide basic step-by-step guidance on getting started with Open Liberty/WebSphere Liberty and Azure Red Hat OpenShift. For more information, see [Deploy a Java application with Open Liberty/WebSphere Liberty on an Azure Red Hat OpenShift cluster](liberty-on-aro.md).\n\n## Open Liberty and WebSphere Liberty on AKS\n\nThe offer [WebSphere Liberty or Open Liberty on AKS](https://ibm.biz/liberty-aks), located in Azure Marketplace, automatically provisions several Azure resources. The offer enables a quick transition to WebSphere Liberty or Open Liberty on AKS. The automatically provisioned resources include the Azure Container Registry (ACR), an AKS cluster, Azure App Gateway as an Ingress Controller (AGIC), and the Liberty Operators. The offer can also deploy a sample application or a container image with your application. If you prefer a native Kubernetes manual deployment experience instead of automation enabled by the offer, IBM and Microsoft also provide basic step-by-step guidance on getting started with WebSphere Liberty/Open Liberty and AKS. For more information, see [Manually deploy a Java application with Open Liberty or WebSphere Liberty on an Azure Kubernetes Service cluster](howto-deploy-java-liberty-app-manual.md).\n\n## WebSphere Application Server on virtual machines\n\n[WebSphere Cluster on Azure VMs](https://ibm.biz/twas-cluster-portal) and [WebSphere Single Instance on Azure VM](https://ibm.biz/twas-single-portal) are two Azure Marketplace offers that automatically provision several Azure resources, enabling a quick transition to traditional WebSphere Application Server on Azure VMs. The automatically provisioned resources include virtual network, storage, network security group, Java, Linux, WebSphere, and database connectivity (Db2, Oracle database, Azure SQL). Both offers support evaluation and Bring-Your-Own-License (BYOL) options for WebSphere. With minimal effort, you can provision a fully functional, highly available WebSphere ND cluster, including the Deployment Manager and any number of servers. You can also have the cluster offer provision IBM HTTP Server or Azure App Gateway as a load-balancer. The Deployment Manager and all servers are started by default, which allows you to begin managing the cluster right away using the Admin Console. Similarly, the single instance offer easily provisions a WebSphere (Base) server on a VM with the Console fully functional.\n\n### WebSphere virtual machine base images\n\nIBM and Microsoft also provide the following base VM images for WebSphere ND and Base:\n\n- [IBM WebSphere Application Server VM base image](https://ibm.biz/twas-base-portal)\n- [IBM WebSphere Application Server ND VM base image](https://ibm.biz/twas-nd-portal)\n\nThe VM images are suitable for customers that need very customized deployments.\n\n## Next steps\n\nExplore the currently available WebSphere on Azure offers at Azure Marketplace:\n\n- [IBM WebSphere Liberty and Open Liberty on Azure Red Hat OpenShift](https://ibm.biz/liberty-aro)\n- [IBM WebSphere Liberty and Open Liberty on Azure Kubernetes Service](https://ibm.biz/liberty-aks)\n- [IBM HTTP Server VM base image](https://ibm.biz/twas-ihs-portal)\n- [IBM WebSphere Application Server VM base image](https://ibm.biz/twas-base-portal)\n- [IBM WebSphere Application Server ND VM base image](https://ibm.biz/twas-nd-portal)\n- [IBM WebSphere Application Server Cluster](https://ibm.biz/twas-cluster-portal)\n- [IBM WebSphere Application Server Single Instance](https://ibm.biz/twas-single-portal)\n\nThe following articles provide more information on getting started with these technologies:\n\n- [How-to guides: Deploy IBM WebSphere Liberty and Open Liberty on Azure Red Hat OpenShift](/azure/openshift/howto-deploy-java-liberty-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n- [Quickstart: Deploy a Java application with Open Liberty or WebSphere Liberty on an Azure Kubernetes Service cluster](/azure/aks/howto-deploy-java-liberty-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n- [Quickstart: Deploy WebSphere Application Server (traditional) Cluster on Azure Virtual Machines](traditional-websphere-application-server-virtual-machines.md)\n- [Manually Deploy a Java application with Open Liberty/WebSphere Liberty on an Azure Red Hat OpenShift cluster](liberty-on-aro.md)\n- [Manually deploy a Java application with Open Liberty or WebSphere Liberty on an Azure Kubernetes Service cluster](howto-deploy-java-liberty-app-manual.md)\n- [Manually install IBM WebSphere Application Server Network Deployment traditional on Azure virtual machines](/azure/developer/java/migration/migrate-websphere-to-azure-vm-manually?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n- [Deploy a Java Application with Open Liberty or WebSphere Liberty on Azure Container Apps](deploy-java-liberty-app-aca.md)\n"
  },
  {
    "path": "articles/java/fundamentals/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Java on Azure developer tools documentation\nsummary: Tools, IDEs, and supported JDKs for Java development on Azure.\n\nmetadata:\n  title: Java on Azure Fundamentals Documentation\n  description: Tools, IDEs, and supported JDKs for Java development on Azure\n  ms.date: 06/02/2025\n  ms.topic: landing-page\n  author: KarlErickson\n  ms.author: karler\n  ms.custom: devx-track-java, devx-track-extended-java\n\nlandingContent:\n  - title: Tools for Java cloud developers\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Tools overview\n            url: java-azure-tools.md\n  - title: Supported JDKs\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Java support\n            url: java-support-on-azure.md\n          - text: Java JDK installation\n            url: java-jdk-install.md\n          - text: Java Docker images for Azure\n            url: /java/openjdk/containers\n  - title: IDEs\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Visual Studio Code\n            url: https://code.visualstudio.com/docs/languages/java\n          - text: IntelliJ IDEA\n            url: ../toolkit-for-intellij/index.yml\n          - text: Eclipse\n            url: ../toolkit-for-eclipse/index.yml\n  - title: Maven plugins\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Azure App Service\n            url: https://github.com/microsoft/azure-maven-plugins/blob/develop/azure-webapp-maven-plugin/README.md\n          - text: Azure Functions\n            url: https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions\n          - text: Azure Spring Apps\n            url: https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Spring-Cloud\n  - title: Java Diagnostic Tool (diag4j) on AKS\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Overview\n            url: java-diagnostic-tools-on-aks-overview.md\n      - linkListType: quickstart\n        links:\n          - text: Spring Boot Admin component\n            url: java-diagnostic-tools-spring-boot-admin-quickstart.md\n          - text: Java Diagnostic Agent component\n            url: java-diagnostic-tools-java-diagnostic-agent-quickstart.md\n  - title: Logging\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Configure logging with the Azure SDK for Java\n            url: ../sdk/logging-overview.md\n          - text: Monitoring and logging using Logz.io\n            url: java-get-started-with-logzio.md\n  - title: DevOps\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Azure DevOps\n            url: /azure/devops-project/azure-devops-project-java\n          - text: Jenkins CI/CD\n            url: /azure/jenkins/\n"
  },
  {
    "path": "articles/java/fundamentals/java-azure-keyvault-ssl-integration-jvm.md",
    "content": "---\ntitle: Use Azure Key Vault to Deliver TLS/SSL Certificates to the JVM\ndescription: Use Azure Key Vault to deliver TLS/SSL certificates to the JVM\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.topic: how-to\nms.date: 12/09/2021\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Use Azure Key Vault to deliver TLS/SSL certificates to the JVM\n\nThis article describes how to integrate Azure Key Vault into the JVM to deliver TLS/SSL certificates.\n\n## Add the JCA provider to the java.security file\n\nTo register the JCA provider, the JVM needs to know about it. To accomplish this task, use the following steps:\n\n1. Make a copy of the **java.security** file inside your JVM installation, and name the file **my.java.security**.\n1. Inside the file, look for the line `security.provider.<maximum-value>`. Replace the `<maximum-value>` placeholder with the maximum value at this position among all entries. For example: `security.provider.13=SunPKCS11`.\n1. Increment the number of this entry by 1. For example, `security.provider.13` should become `security.provider.14`.\n1. Add the following line:\n\n   ```text\n   security.provider.14=com.azure.security.keyvault.jca.KeyVaultJcaProvider\n   ```\n\n> [!NOTE]\n> Be sure that each `security.provider.<X>` entry has a different number value for `<X>`, and keep them incrementally ordered starting with 1.\n\n## How to run your application\n\nTo run your application, use the following steps and replace the `<...>` placeholders with your own values:\n\n1. Add the **azure-security-keyvault-jca-X.Y.Z.jar** file to the classpath. For example, if you want to integrate with Tomcat 9, then you should add the full path of the file **azure-security-keyvault-jca-X.Y.Z.jar** to the Java classpath by using **tomcat9w.exe**.\n1. Add `-Djava.security.properties==my.java.security` to the command line.\n1. Add `-Dazure.keyvault.uri=<your-keyvault-uri>` to the command line to indicate which Azure Key Vault to use. For example: `-Dazure.keyvault.uri=https://some.vault.azure.net/`.\n1. Add the arguments indicated in the following list, depending on your scenario:\n\n   * If you authenticate using a service principal, add the following arguments:\n\n     * `-Dazure.keyvault.tenant-id=<your-tenant-id>`\n     * `-Dazure.keyvault.client-id=<your-client-id>`\n     * `-Dazure.keyvault.client-secret=<your-client-secret>`\n\n   * If you authenticate using a system-assigned managed identity, no more arguments are required.\n\n   * If you authenticate using a user-assigned managed identity, add the following argument:\n\n     * `-Dazure.keyvault.managed-identity=<object-id-of-your-user-managed-identity>`\n\nFor more information about these authentication scenarios, see [Application and service principal objects in Microsoft Entra ID](/azure/active-directory/develop/app-objects-and-service-principals) and [How managed identities for Azure resources work with Azure virtual machines](/azure/active-directory/managed-identities-azure-resources/how-managed-identities-work-vm).\n\n### Use a service principal\n\nTo create an Azure client ID and an Azure client secret, use the following command, replacing the `<...>` placeholders with your own values. Be sure to store the values returned, such as `appId`, `password`, and `tenant`.\n\n```azurecli\nexport CLIENT_NAME=<your-client-name>\naz ad sp create-for-rbac --skip-assignment --name ${CLIENT_NAME}\nexport CLIENT_ID=$(az ad sp list --display-name ${CLIENT_NAME} | jq -r '.[0].appId')\naz ad app credential reset --id ${CLIENT_ID}\n```\n\nStore the values returned so you can use them later.\n\nBe sure the client specified by `CLIENT_ID` can access the target Key Vault. To grant access, use the following command, replacing the `<your-key-vault-name>` placeholder:\n\n```azurecli\naz keyvault set-policy \\\n    --name <your-key-vault-name> \\\n    --spn ${CLIENT_ID} \\\n    --secret-permissions get list \\\n    --certificate-permissions get list \\\n    --key-permissions get list\n```\n\n### Use a managed identity\n\nTo enable a system-assigned managed identity or create a user-assigned managed identity, follow the instructions at [Configure managed identities for Azure resources on an Azure VM using Azure CLI](/azure/active-directory/managed-identities-azure-resources/qs-configure-cli-windows-vm)\n\nAfter getting the object ID of the managed identity, use the following command to create the access policy of your Key Vault for your managed identity:\n\n```azurecli\naz keyvault set-policy \\\n    --name <your-key-vault-name> \\\n    --object-id <object-id-of-your-managed-identity> \\\n    --secret-permissions get list \\\n    --certificate-permissions get list \\\n    --key-permissions get list\n```\n\n> [!NOTE]\n> The object ID of the managed identity is also called the principal ID when using a user-assigned managed identity.\n\n## Client/server side TLS/SSL examples\n\nFor examples of client/server-side TLS/SSL, see the [Examples](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/keyvault/azure-security-keyvault-jca/README.md#examples) section of the [Azure Key Vault JCA client library for Java](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/keyvault/azure-security-keyvault-jca/README.md).\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Java on Azure developer tools documentation](index.yml)\n"
  },
  {
    "path": "articles/java/fundamentals/java-azure-keyvault-tomcat-integration.md",
    "content": "---\ntitle: Use Azure Key Vault to Deliver TLS/SSL Certificates to Apache Tomcat\ndescription: Use Azure Key Vault to deliver TLS/SSL certificates to Apache Tomcat\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.topic: how-to\nms.date: 12/09/2021\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Use Azure Key Vault to deliver TLS/SSL certificates to Apache Tomcat\n\nThis article describes how to integrate Azure Key Vault into Apache Tomcat to deliver TLS/SSL certificates.\n\n## Be sure the JVM can access the TLS/SSL certificates\n\nBe sure you followed all the steps outlined in [Use Azure Key Vault to deliver TLS/SSL certificates to the JVM](java-azure-keyvault-ssl-integration-jvm.md).\n\n## Add the TLS/SSL configuration to server.xml\n\nAdd the following configuration to the **server.xml** file in Tomcat. Be sure to replace the `<your-certificate>` placeholder with the name of the certificate in Azure Key Vault that you want to use for server-side TLS/SSL.\n\n```xml\n<Connector port=\"8443\"\n           protocol=\"org.apache.coyote.http11.Http11NioProtocol\"\n           maxThreads=\"150\"\n           SSLEnabled=\"true\">\n    <SSLHostConfig>\n        <Certificate\n            certificateKeyAlias=\"<your-certificate>\"\n            certificateKeystoreFile=\"\"\n            certificateKeystorePassword=\"\"\n            certificateKeystoreType=\"DKS\"\n            certificateKeystoreProvider=\"AzureKeyVault\" />\n    </SSLHostConfig>\n</Connector>\n```\n\n## Set the required startup properties\n\nUse the `JAVA_OPTS` and `CLASSPATH` environment variables to set up your environment before starting Tomcat. One way to specify the environment variables is by creating a **setenv.sh** or **setenv.bat** script in the Tomcat **bin** directory.\n\n> [!NOTE]\n> You can also use other approaches to set the environment variables. We've tested by running Tomcat's **catalina.sh** script or **catalina.bat** script, and by running the Tomcat for Windows Service.\n\n### [Linux](#tab/linux)\n\n```bash\nexport JAVA_OPTS=\"-Djava.security.properties==/xxx/my.java.security\"\nexport CLASSPATH=\"/xxx/azure-security-keyvault-jca.jar\"\n```\n\n### [Windows](#tab/windows)\n\n```cmd\nset \"JAVA_OPTS=%JAVA_OPTS% -Djava.security.properties==C:\\xxx\\my.java.security\"\nset CLASSPATH=C:\\xxx\\azure-security-keyvault-jca.jar\n```\n\n---\n\nThe following example of `JAVA_OPTS` covers local testing using a service principal:\n\n```bash\nexport JAVA_OPTS='-Djava.security.properties==/xxx/my.java.security -Dazure.keyvault.uri=xxx -Dazure.keyvault.client-id=xxx -Dazure.keyvault.client-secret=xxx -Dazure.keyvault.tenant-id=xxx'\n```\n\nThis example covers cloud deployments using a user-assigned managed identity:\n\n```bash\nexport JAVA_OPTS='-Djava.security.properties==/xxx/my.java.security -Dazure.keyvault.uri=xxx -Dazure.keyvault.managed-identity=<your-managed-identity>'\n```\n\nThis example covers cloud deployments using a system-assigned managed identity:\n\n```bash\nexport JAVA_OPTS='-Djava.security.properties==/xxx/my.java.security -Dazure.keyvault.uri=xxx'\n```\n\nFor the meaning of each of these properties, see [Use Azure Key Vault to deliver TLS/SSL certificates to the JVM](./java-azure-keyvault-ssl-integration-jvm.md#how-to-run-your-application).\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Java on Azure developer tools documentation](index.yml)\n"
  },
  {
    "path": "articles/java/fundamentals/java-azure-tools.md",
    "content": "---\ntitle: Azure Tools for Java Developers\ndescription: IDE integrations, emulators, resource explorers, and command-line interfaces for Java developers working on Azure.\nauthor: KarlErickson\nms.author: karler\nms.topic: concept-article\nms.date: 10/24/2025\nms.custom: devx-track-java, devx-track-azurecli, devx-track-extended-java\nai-usage: ai-assisted\n---\n\n# Azure tools for Java developers\n\nThis article describes common tools available for developers using Azure for Java.\n\n## Visual Studio Code\n\n[Visual Studio Code](https://code.visualstudio.com/) is a lightweight but powerful code editor available for macOS, Windows, and Linux. VS Code supports a simple, modern Java development workflow through a set of extensions that provide project support, code completion, debugging, linting, and navigation.\n\nFor Java development, install the [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack), which includes essential extensions for language support, debugging, testing, Maven and Gradle integration, project management, and more. This extension pack provides everything you need for productive Java development in VS Code.\n\nFor working with Azure, install the [Azure Tools Extension Pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack), which includes extensions for Azure App Service, Azure Functions, Azure Databases, Azure Storage, and more. These extensions enable you to browse and manage Azure resources, deploy applications, and work with Azure services directly from VS Code.\n\nFor more information, see [Get Started with Visual Studio Code and Java](https://code.visualstudio.com/docs/java).\n\n## Eclipse and IntelliJ plugins\n\nManage Azure resources and deploy apps from your IDE with The Azure toolkits for [Eclipse](../toolkit-for-eclipse/index.yml) and [IntelliJ](../toolkit-for-intellij/index.yml).\n\n![IntelliJ toolkit showing the Azure Explorer](media/intelliJ-azure-explorer.png)\n\n[Get started with Azure Toolkit for Eclipse](../toolkit-for-eclipse/create-hello-world-web-app.md) | [Get started with Azure Toolkit for IntelliJ](../toolkit-for-intellij/create-hello-world-web-app.md)\n\n## GitHub Copilot\n\n[GitHub Copilot](https://github.com/features/copilot) is an AI-powered code completion tool that helps you write Java code faster with intelligent suggestions and code generation. Copilot works across popular IDEs including VS Code, IntelliJ IDEA, and Eclipse, providing context-aware recommendations as you code.\n\nFor Azure development, [GitHub Copilot for Azure](../../github-copilot-azure/introduction.md) provides specialized assistance with Azure SDK code, deployment configurations, and infrastructure setup.\n\nIf you're modernizing legacy Java applications for Azure, the [GitHub Copilot modernization](../migration/migrate-github-copilot-app-modernization-for-java.md) tools can help automate the migration process and recommend Azure-optimized patterns.\n\n## Apache Maven and Gradle plugins\n\nDeploy Java applications to Azure with ease by configuring Azure plugins as part of your Maven or Gradle builds. Currently, the plugins support Azure App Service, Azure Functions, Azure Container Apps, and Azure Spring Apps.\n\n- [Azure Plugins for Gradle](https://github.com/microsoft/azure-gradle-plugins)\n- [Azure Plugins for Apache Maven](https://github.com/microsoft/azure-maven-plugins)\n- [Maven Archetypes for Azure Services](https://github.com/Microsoft/azure-maven-archetypes)\n\n## Supported Java runtimes\n\nJava developers are free to use the distribution and version of Java of their choice for most Microsoft Azure and Azure Stack services. For more information, see [Java support on Azure and Azure Stack](java-support-on-azure.md).\n\n## Azure CLI\n\nThe Azure CLI provides a command-line experience to manage Azure resources. You can use it in your browser with [Azure Cloud Shell](/azure/cloud-shell/overview), or you can [install](/cli/azure/install-azure-cli) it on macOS, Linux, and Windows and run it from the command line.\n\n[Get started with Azure CLI](/cli/azure/get-started-with-azure-cli).\n\n## Azure Developer CLI\n\nThe [Azure Developer CLI (azd)](../../azure-developer-cli/overview.md) is a developer-centric command-line tool that accelerates the process of building and deploying applications to Azure. With `azd`, you can initialize, provision, and deploy Java applications using a single workflow, reducing the complexity of managing multiple Azure services and configurations.\n\nThe `azd` tool provides templates for common Java application scenarios, including Spring Boot applications, and handles the end-to-end deployment process including infrastructure provisioning, code deployment, and environment configuration. For more information, see [Get started with Azure Developer CLI](../../azure-developer-cli/get-started.md).\n"
  },
  {
    "path": "articles/java/fundamentals/java-diagnostic-tools-java-diagnostic-agent-quickstart.md",
    "content": "---\ntitle: Get Started with the Java Diagnostic Agent\ndescription: Describes how to get started using the Java Diagnostic Agent.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: fenzho\nms.topic: quickstart\nms.date: 02/07/2025\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Get started with the Java Diagnostic Agent\n\nThis article describes how to get started using the Java Diagnostic Agent. It also describes the Java Diagnostic Tool on AKS plugin for IntelliJ IDEA.\n\nThe Java Diagnostic Agent is a Java agent for troubleshooting a Java process. It doesn't need to rebuild, redeploy, or restart an application. Currently, it supports adding logs around a function in a Java class. When the function is called, the log is printed along with a calculation of the total time consumed by the function.\n\n## Prerequisites\n\n- [diag4j](java-diagnostic-tools-spring-boot-admin-quickstart.md) installed in your cluster.\n- [IntelliJ IDEA](https://www.jetbrains.com/idea/download).\n- [Java LTS](/java/openjdk/download) version 11, 17, or 21.\n- The IntelliJ IDEA [plugin](https://github.com/microsoft/diag4j/releases), installed locally through **Settings** > **Plugins** > **Install Plugin from Disk**.\n\n   :::image type=\"content\" source=\"media/java-diagnostic-tool/install-plugin-locally.png\" alt-text=\"Screenshot of the IntelliJ IDEA Settings page with Azure Toolkit for IntelliJ plugin selected and Install Plugin from Disk menu item highlighted.\" lightbox=\"media/java-diagnostic-tool/install-plugin-locally.png\":::\n\n- Java applications to troubleshoot with. For more information, see [Deploy Spring Boot Application to the Azure Kubernetes Service](../spring-framework/deploy-spring-boot-java-app-on-kubernetes.md).\n\n## Establish port forwarding\n\nUse the following command to establish port forwarding to the agent service:\n\n```bash\nkubectl port-forward svc/diag4j-agent-service -n <namespace> <port>:8080\n```\n\n## Use the Java Diagnostic Tool on AKS plugin for IntelliJ IDEA\n\nYou can use the Java Diagnostic Tool on AKS plugin to attach the Java Diagnostic Agent to the Java application running in a pod container on an Azure Kubernetes Service (AKS) cluster.\n\nAfter you attach the agent, it enables you to perform troubleshooting tasks such as adding logs around a class function. You can use this log to test whether the function is executed and to calculate the total time spent in the function. This analysis can help you locate performance bottlenecks in your application.\n\nThe plugin configuration is shown on the **Diagnostic** tab. Here, you can do the following tasks:\n\n- Configure the local port that forwards to the agent service.\n- View the pods listed with `kubeconfig` in your local environment.\n- Select **Refresh** to refresh the pod table. After you switch clusters, you should refresh the table to load the pods in new cluster.\n\n:::image type=\"content\" source=\"media/java-diagnostic-tool/overview.png\" alt-text=\"Screenshot of the IntelliJ IDEA Diagnostic tab.\" lightbox=\"media/java-diagnostic-tool/overview.png\":::\n\n## Attach the agent\n\nThe pod container should have a **/tmp** folder, and it should have write permission to the **/tmp** folder.\n\nTo enable attaching the agent in the JVM, be sure not to add `-XX:+DisableAttachMechanism` to the JVM options.\n\nThe backend diagnostic server is closed after 6 hours.\n\nTo attach the agent, click the pod you want to attach the agent to, and then select the container. You can only attach the agent to one container in the pod. Then, wait for the attachment process to complete.\n\n:::image type=\"content\" source=\"media/java-diagnostic-tool/attach.png\" alt-text=\"Screenshot of IntelliJ IDEA that shows the Diagnostic tab with the Container Selection dialog box open.\" lightbox=\"media/java-diagnostic-tool/attach.png\":::\n\n## Set the active pod container\n\nAfter you attach the agent successfully, you can use it for troubleshooting.\n\nMultiple pods might have injected the agent, so you must set an active pod. In IntelliJ IDEA, on the **Diagnostic** tab, right-click a pod and then select **Select as the active one**.\n\n:::image type=\"content\" source=\"media/java-diagnostic-tool/set-active.png\" alt-text=\"Screenshot of the IntelliJ IDEA Diagnostic tab with a pod selected and the Select as the active one menu item showing.\" lightbox=\"media/java-diagnostic-tool/set-active.png\":::\n\n## Add logging around a class function\n\nThe configured log is automatically removed after 30 minutes.\n\nYou can use the tool to add logging around class functions, but not interfaces, constructors, and so on.\n\nTo add logging to a function, right-click it in the editor, then select **Java Diagnostic** > **Add AroundLog**, as shown in the following screenshot.\n\n:::image type=\"content\" source=\"media/java-diagnostic-tool/add-log.png\" alt-text=\"Screenshot of IntelliJ IDEA that shows the context menu opened for a function with the Add AroundLog menu option highlighted.\" lightbox=\"media/java-diagnostic-tool/add-log.png\":::\n\nIn this example, after you add the logging, you can call `<host>/infor` to see output similar to the following example before and after the function is called:\n\n```output\n===== START ===== Method: updateInformation Start Time: 2024-12-12T07:37:55.404107848Z\nDone with the validation\nDone with the DB access\nDone with the data filtering\n===== END ===== Method: updateInformation End Time: 2024-12-12T07:37:55.404316940Z Total Time: 0 milliseconds\n```\n\n## Remove all configured logs\n\nTo remove all the logs added by the agent, select **Remove All AroundLogs**.\n\n> [!NOTE]\n> The backend Java agent is used by an ephemeral container in the pod. After the pod restarts, the agent is removed.\n\n## Troubleshooting\n\nA timeout can occur when you attempt to attach the agent to a pod running on a node that hasn't already enabled the feature. The timeout can occur because the node must first retrieve the agent image, which causes a delay. When this occurs, you can select **Refresh** to check whether the agent has attached, or you can try attaching the agent again. \n\nIf the attachment fails, you can check the log named `diagnostic-container-<hashcode>` in the ephemeral container.\n\nYou can find information about the operations of the plugin in the logs under the pod container named `diag4j-agent-service-<hashcode>`.\n\n## Next step\n\n[Get started with the Spring Boot Admin component of the Java Diagnostic Tool (diag4j) on AKS](java-diagnostic-tools-spring-boot-admin-quickstart.md)\n"
  },
  {
    "path": "articles/java/fundamentals/java-diagnostic-tools-on-aks-overview.md",
    "content": "---\ntitle: The Java Diagnostic Tool (diag4j) on Azure Kubernetes Service (AKS)\ndescription: Provides an overview of the Java Diagnostic Tool (diag4j) on Azure Kubernetes Service (AKS).\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xuycao\nms.topic: concept-article\nms.date: 02/07/2025\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# The Java Diagnostic Tool (diag4j) on Azure Kubernetes Service (AKS)\n\nThis article provides an overview of the Java Diagnostic Tool (diag4j) on Azure Kubernetes Service (AKS). The diag4j tool is a lightweight, non-intrusive monitoring and diagnostic solution for Java applications running on Azure Kubernetes Service.\n\n## Key benefits\n\nThe diag4j tool provides the following key benefits:\n\n- Lightweight and non-invasive: by leveraging Spring Boot Admin (SBA) and the Java Attach Agent, the tool is resource-efficient and doesn't require deep modifications to applications.\n- Automatic Kubernetes integration: the tool auto-discovers pods with exposed actuator endpoints, listing them on the SBA dashboard.\n- Real-time metrics and diagnostics: the tool displays real-time application metrics, garbage-collection (GC) status, and environment variables. You can also adjust log levels dynamically for deeper insights into specific issues.\n- Advanced diagnostics: the tool offers enhanced diagnostic features, such as stack trace inspection, viewing local variables, generating heap and thread dumps, and injecting logs dynamically for troubleshooting.\n- IDE compatibility: the tool integrates with IDEs to enable debugging without needing to rebuild or redeploy the application, enabling streamlined troubleshooting.\n\n## Architecture\n\nThe diag4j tool is composed of the following components:\n\n- The Spring Boot Admin server, which has a read-only role within its namespace to automatically discover and monitor pods exposing actuator endpoints.\n- The Java Attach Agent, which is a lightweight Java agent that attaches to running Java processes, enabling diagnostic capabilities without restarting the application.\n\nTo maintain security during the current milestone, these components aren't exposed publicly. You can access the tool via the `kubectl port-forward` command.\n\n:::image type=\"content\" source=\"media/java-diagnostic-tool/architecture-diagram.png\" alt-text=\"Diagram of the diag4j architecture.\" lightbox=\"media/java-diagnostic-tool/architecture-diagram.png\" border=\"false\":::\n\n## Next steps\n\n- [Get started with the Spring Boot Admin component of the Java Diagnostic Tool (diag4j) on AKS](java-diagnostic-tools-spring-boot-admin-quickstart.md)\n- [Get started with the Java Diagnostic Agent](java-diagnostic-tools-java-diagnostic-agent-quickstart.md)\n"
  },
  {
    "path": "articles/java/fundamentals/java-diagnostic-tools-spring-boot-admin-quickstart.md",
    "content": "---\ntitle: Get Started with the Spring Boot Admin Component of the Java Diagnostic Tool (diag4j) on Azure Kubernetes Service.\ndescription: Shows you how to get started with the Spring Boot Admin component of the Java Diagnostic Tool (diag4j) on Azure Kubernetes Service.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xuycao\nms.topic: quickstart\nms.date: 02/07/2025\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Get started with the Spring Boot Admin component of the Java Diagnostic Tool (diag4j) on Azure Kubernetes Service\n\nThis article provides step-by-step instructions to set up and start using the Spring Boot Admin component of the Java Diagnostic Tool (diag4j) on Azure Kubernetes Service (AKS). By following these steps, you can monitor and diagnose your Java applications efficiently.\n\n## Prerequisites\n\n- A running AKS cluster with necessary permissions.\n- [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl) installed and configured to access your AKS cluster.\n- [Helm](https://helm.sh/docs/intro/install/) installed on your local machine.\n- Java applications deployed in AKS. For more information, see [Deploy Spring Boot Application to Azure Kubernetes Service](../spring-framework/deploy-spring-boot-java-app-on-kubernetes.md). The tool works better when Spring Boot actuator endpoints are enabled.\n- Developer access to the namespace hosting diag4j. Ensure that you can execute `kubectl port-forward`.\n\n## Install diag4j in your cluster\n\nUse the following command to install diag4j in the desired namespace:\n\n```bash\nhelm install my-diag4j oci://diag4j.azurecr.io/helm/diag4j --version 1.1.5 -n <namespace> --create-namespace\n```\n\n## Create a Spring Boot Admin component\n\nUse the following commands to create a Spring Boot Admin (SBA) component:\n\n1. Apply a custom resource (CR) to create a Spring Boot Admin component. Create a file named **spring-boot-admin.yaml**, and then add the following contents. Replace `<namespace>` with the namespace that your Spring Boot apps are running in. SBA will auto-discover apps whose actuator endpoints are exposed. Others will show with the `DOWN` status on the dashboard.\n\n   ```yaml\n   apiVersion: diagtool4j.microsoft.com/v1alpha1\n   kind: Component\n   metadata:\n       name: spring-boot-admin\n       namespace: <namespace>\n   spec:\n       type: SpringBootAdmin\n   ```\n\n1. Use the following command to apply the CR:\n\n   ```bash\n   kubectl apply -f spring-boot-admin.yaml\n   ```\n\n## Access the diag4j dashboard\n\nUse the following steps to access the dashboard:\n\n1. Use the following command to configure local port forwarding to the SBA server:\n\n   ```bash\n   kubectl port-forward svc/spring-boot-admin-azure-java -n <namespace> 8080:8080\n   ```\n\n1. Navigate to `http://localhost:8080` in your browser to view the SBA dashboard. All applications in the same namespace should be registered automatically.\n\n   :::image type=\"content\" source=\"media/java-diagnostic-tool/spring-boot-admin-dashboard.png\" alt-text=\"Screenshot of the Spring Boot Admin dashboard.\" lightbox=\"media/java-diagnostic-tool/spring-boot-admin-dashboard.png\":::\n\n## Use the diagnostic features\n\nTo view application metrics, click on the application in the SBA dashboard. You can view real-time metrics including the following metrics:\n\n- CPU & memory usage\n- Garbage collection (GC) status\n- Active threads and environment variables\n\n:::image type=\"content\" source=\"media/java-diagnostic-tool/app-details.png\" alt-text=\"Screenshot of the Spring Boot Admin dashboard page that shows application metrics.\" lightbox=\"media/java-diagnostic-tool/app-details.png\":::\n\nTo adjust log levels, navigate to the **Loggers** section. You can then modify log levels dynamically for specific packages or classes in order to isolate issues.\n\n:::image type=\"content\" source=\"media/java-diagnostic-tool/log-level-change.png\" alt-text=\"Screenshot of the Spring Boot Admin dashboard page that shows the Loggers section.\" lightbox=\"media/java-diagnostic-tool/log-level-change.png\":::\n\nTo perform advanced diagnostics, generate heap dumps and thread dumps for in-depth analysis.\n\n## Next step\n\n[Get started with the Java Diagnostic Agent](java-diagnostic-tools-java-diagnostic-agent-quickstart.md)\n"
  },
  {
    "path": "articles/java/fundamentals/java-get-started-with-logzio.md",
    "content": "---\ntitle: Getting Started with Logz.io for Java Apps Running on Azure\ndescription: This tutorial shows how to integrate and configure Logz.io for Java apps running on Azure.\nms.topic: tutorial\nms.date: 05/12/2023\nauthor: KarlErickson\nms.author: karler\nms.reviewer: judubois\nms.custom: devx-track-java, team=cloud_advocates, devx-track-extended-java\n---\n\n# Tutorial: Getting started with monitoring and logging using Logz.io for Java apps running on Azure\n\nThis tutorial shows you how to configure a classical Java application to send logs to the [Logz.io](https://logz.io/) service for ingestion and analysis. Logz.io provides a full monitoring solution based on Elasticsearch/Logstash/Kibana (ELK) and Grafana.\n\nThe tutorial assumes you're using Log4J or Logback. These libraries are the two most widely used for logging in Java, so the tutorial should work for most applications running on Azure. If you're already using the Elastic stack to monitor your Java application, this tutorial shows you how to reconfigure to target the Logz.io endpoint.\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Send logs from an existing Java application to Logz.io.\n> * Send diagnostic logs and metrics from Azure services to Logz.io.\n\n## Prerequisites\n\n* [Java Developer Kit](./java-support-on-azure.md), version 11 or greater\n* A Logz.io account from the [Azure Marketplace](https://azuremarketplace.microsoft.com/marketplace/apps/logz.logzio-elk-as-a-service-pro)\n* An existing Java application that uses Log4J or Logback\n\n## Send Java application logs to Logz.io\n\nFirst, you learn how to configure your Java application with a token that gives it access to your Logz.io account.\n\n### Get your Logz.io access token\n\nTo get your token, sign in to your Logz.io account, select the cog icon in the bottom left-hand corner, then select **Settings** > **Manage tokens** and select the **Data shipping tokens** tab. Copy the **default access token** displayed and the **listener URL** so you can use them later.\n\n### Install and configure the Logz.io library for Log4J or Logback\n\nThe Logz.io Java library is available on Maven Central, so you can add it as a dependency to your app configuration. Check the version number on Maven Central and use the latest version in the following configuration settings.\n\nIf you're using Maven, add the following dependency to your **pom.xml** file:\n\n**Log4J:**\n\n```xml\n<dependency>\n    <groupId>io.logz.log4j2</groupId>\n    <artifactId>logzio-log4j2-appender</artifactId>\n    <version>2.0.0</version>\n</dependency>\n```\n\n**Logback:**\n\n```xml\n<dependency>\n    <groupId>io.logz.logback</groupId>\n    <artifactId>logzio-logback-appender</artifactId>\n    <version>2.0.0</version>\n</dependency>\n```\n\nIf you're using Gradle, add the following dependency to your build script:\n\n**Log4J:**\n\n```\nimplementation 'io.logz.log4j:logzio-log4j-appender:2.0.0'\n```\n\n**Logback:**\n\n```\nimplementation 'io.logz.logback:logzio-logback-appender:2.0.0'\n```\n\nNext, update your Log4J or Logback configuration file:\n\n**Log4J:**\n\n```xml\n<Appenders>\n    <LogzioAppender name=\"Logzio\">\n        <logzioToken><your-logz-io-token></logzioToken>\n        <logzioType>java</logzioType>\n        <logzioUrl>https://<your-logz-io-listener-host>:8071</logzioUrl>\n    </LogzioAppender>\n</Appenders>\n\n<Loggers>\n    <Root level=\"info\">\n        <AppenderRef ref=\"Logzio\"/>\n    </Root>\n</Loggers>\n```\n\n**Logback:**\n\n```xml\n<configuration>\n    <!-- Use shutdownHook so that we can close gracefully and finish the log drain -->\n    <shutdownHook class=\"ch.qos.logback.core.hook.DelayingShutdownHook\"/>\n    <appender name=\"LogzioLogbackAppender\" class=\"io.logz.logback.LogzioLogbackAppender\">\n        <token><your-logz-io-token></token>\n        <logzioUrl>https://<your-logz-io-listener-host>:8071</logzioUrl>\n        <logzioType>java</logzioType>\n        <filter class=\"ch.qos.logback.classic.filter.ThresholdFilter\">\n            <level>INFO</level>\n        </filter>\n    </appender>\n\n    <root level=\"debug\">\n        <appender-ref ref=\"LogzioLogbackAppender\"/>\n    </root>\n</configuration>\n```\n\nReplace the `<your-logz-io-token>` placeholder with your access token and the `<your-logz-io-listener-host>` placeholder with your region's listener host - for example, `listener.logz.io`. For more information on finding your account’s region, see [Account region](https://docs.logz.io/user-guide/accounts/account-region.html).\n\nThe `logzioType` element refers to a logical field in Elasticsearch that is used to separate different documents from one another. It's essential to configure this parameter properly to get the most out of Logz.io.\n\nA Logz.io \"type\" is your log format - for example: Apache, NGinx, MySQL - and not your source - for example: `server1`, `server2`, `server3`. For this tutorial, we're calling the type `java` because we're configuring Java applications, and we expect those applications to all have the same format.\n\nFor advanced usage, you could group your Java applications into different types, which all have their own specific log format (configurable with Log4J and Logback). For example, you could have a `spring-boot-monolith` type and a `spring-boot-microservice` type.\n\n### Test your configuration and log analysis on Logz.io\n\nAfter the Logz.io library is configured, your application should now send logs directly to it. To test that everything works correctly, go to the Logz.io console, select the **Logs** > **Live tail** tab, then select **run**. You should see a message similar to the following, telling you the connection is working:\n\n```output\nRequesting Live Tail access...\nAccess granted. Opening connection...\nConnected. Tailing...\n````\n\nNext, start your application, or use it in order to produce some logs. The logs should appear directly on your screen. For example, here are the first startup messages of a Spring Boot application:\n\n```output\n2019-09-19 12:54:40.685Z Starting JavaApp on javaapp-default-9-5cfcb8797f-dfp46 with PID 1 (/workspace/BOOT-INF/classes started by cnb in /workspace)\n2019-09-19 12:54:40.686Z The following profiles are active: prod\n2019-09-19 12:54:42.052Z Bootstrapping Spring Data repositories in DEFAULT mode.\n2019-09-19 12:54:42.169Z Finished Spring Data repository scanning in 103ms. Found 6 repository interfaces.\n2019-09-19 12:54:43.426Z Bean 'spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties' of type [org.springframework.boot.autoconfigure.task.TaskExecutionProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n```\n\nNow that Logz.io processes your logs, you can benefit from all the platform's services.\n\n## Send Azure services data to Logz.io\n\nNext you learn how to send logs and metrics from your Azure resources to Logz.io.\n\n### Deploy the template\n\nThe first step is to deploy the Logz.io - Azure integration template. The integration is based on a ready-made Azure deployment template that sets up all the necessary building blocks of the pipeline. The template creates an Event Hub namespace, an Event Hub, two storage blobs, and all the correct permissions and connections required. The resources set up by the automated deployment can collect data for a single Azure region and ship that data to Logz.io.\n\nFind the **Deploy to Azure** button displayed in the [first step of the repo’s readme](https://github.com/logzio/logzio-azure-serverless).\n\nWhen you select **Deploy to Azure**, the **Custom Deployment** page in the Azure portal appears with a list of pre-filled fields.\n\nYou can leave most of the fields as-is but be sure to enter the following settings:\n\n* **Resource group**: Either select an existing group or create a new one.\n* **Logzio Logs/Metrics Host**: Enter the URL of the Logz.io listener. If you’re not sure what this URL is, check your sign-in URL. If it’s `app.logz.io`, use `listener.logz.io` (which is the default setting). If it’s `app-eu.logz.io`, use `listener-eu.logz.io`.\n* **Logzio Logs/Metrics Token**: Enter the token of the Logz.io account you want to ship Azure logs or metrics to. You can find this token on the account page in the Logz.io UI.\n\nAgree to the terms at the bottom of the page, and select **Purchase**. Azure then deploys the template, which might take a minute or two. You eventually see the \"Deployment succeeded\" message at the top of the portal.\n\nYou can visit the defined resource group to review the deployed resources.\n\nTo learn how to configure `logzio-azure-serverless` to back up data to Azure Blob Storage, see [Ship Azure activity logs](https://docs.logz.io/shipping/log-sources/azure-diagnostic-logs.html).\n\n### Stream Azure logs and metrics to Logz.io\n\nNow that you deployed the integration template, you need to configure Azure to stream diagnostic data to the Event Hub you just deployed. When data comes into the Event Hub, the function app forwards that data to Logz.io.\n\n1. In the search bar, type **Diagnostic**, then select **Diagnostic settings**.\n\n2. Choose a resource from the list of resources, then select **Add diagnostic setting** to open the **Diagnostics settings** panel for that resource.\n\n    ![Diagnostics settings panel](media/java-get-started-with-logzio/diagnostics-settings.png)\n\n3. Give your diagnostic settings a **Name**.\n\n4. Select **Stream to an event hub**, then select **Configure** to open the **Select Event Hub** panel.\n\n5. Choose your Event Hub:\n\n    * **Select event hub namespace**: Choose the namespace that starts with **Logzio** (`LogzioNS6nvkqdcci10p`, for example).\n    * **Select event hub name**: For logs choose **insights-operational-logs** and for metrics choose **insights-operational-metrics**.\n    * **Select event hub policy name**: Choose **LogzioSharedAccessKey**.\n\n6. Select **OK** to return to the **Diagnostics settings** panel.\n\n7. In the Log section, select the data you want to stream, then select **Save**.\n\nThe selected data now streams to the Event Hub.\n\n### Visualize your data\n\nNext, give your data some time to get from your system to Logz.io, and then open Kibana. You should see data (with the type `eventhub`) filling up your dashboards. For more information on how to create dashboards, see [Kibana - Create Dashboard](https://www.tutorialspoint.com/kibana/kibana_create_dashboard.htm).\n\nFrom there, you can query for specific data in the **Discover** tab, or create Kibana objects to visualize your data in the **Visualize** tab.\n\n## Clean up resources\n\nWhen you're finished with the Azure resources you created in this tutorial, you can delete them using the following command:\n\n```azurecli-interactive\naz group delete --name <resource group>\n```\n\n## Next steps\n\nIn this tutorial, you learned how to configure your Java application and Azure services to send logs and metrics to Logz.io.\n\nNext, learn more about using Event Hub to monitor your application:\n\n> [!div class=\"nextstepaction\"]\n> [Stream Azure monitoring data to an Event Hub for consumption by an external tool](/azure/azure-monitor/platform/stream-monitoring-data-event-hubs)\n"
  },
  {
    "path": "articles/java/fundamentals/java-jdk-install.md",
    "content": "---\ntitle: Install a JDK for Azure Development\ndescription: How to install a Java Development Kit (JDK) for Azure development with Windows, Linux, and Mac.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: brborges\nms.date: 02/14/2025\nms.topic: install-set-up-deploy\nms.custom: devx-track-java, devx-track-extended-java, linux-related-content\n---\n\n# Install the JDK\n\nYou can use any JDK to build Java applications for Azure, although we recommend using the [Microsoft Build of OpenJDK](/java/openjdk/install).\n\n> [!IMPORTANT]\n> Update June 30th, 2021: Zulu for Azure no longer receives updates or support since January 1st, 2022. Azure services have transitioned to [Microsoft Build of OpenJDK](/java/openjdk/install) for JDK 11 and [Eclipse Temurin](https://adoptium.net/temurin/releases?version=8) for JDK 8. For more information, see [End of Updates, Support and Availability of the Zulu for Azure builds of OpenJDK](https://devblogs.microsoft.com/java/end-of-updates-support-and-availability-of-zulu-for-azure/).\n"
  },
  {
    "path": "articles/java/fundamentals/java-support-on-azure.md",
    "content": "---\ntitle: Java JDKs Support for Azure Development\ndescription: This article provides details of support for developing for or deploying Java applications to Azure and Azure Stack.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: brborges\nms.date: 07/13/2024\nms.topic: concept-article\nms.custom: devx-track-java, devx-track-extended-java\n---\n# Java support on Azure and Azure Stack\n\nJava developers can build, integrate, and deploy applications to various Azure and Azure Stack services. Developers are free to use the distribution and version of the Java Development Kit (JDK) of their choice for most Microsoft Azure services. Microsoft provides and manages the Java runtime for certain services on behalf of customers. This document helps you understand which services provide a Java runtime by default, and which services you can bring your own Java runtime to.\n\n> [!IMPORTANT]\n> Update June 30th, 2021: Zulu for Azure no longer receives updates or support since January 1st, 2022. Azure services have transitioned to [Microsoft Build of OpenJDK](/java/openjdk/install) for JDK 11 and [Eclipse Temurin](https://adoptium.net/temurin/releases?version=8) for JDK 8. For more information, see [End of Updates, Support and Availability of the Zulu for Azure builds of OpenJDK](https://devblogs.microsoft.com/java/end-of-updates-support-and-availability-of-zulu-for-azure/).\n\n## Supported Java versions and update schedule\n\nFor more information, see [Microsoft Build of OpenJDK Support Policy](/java/openjdk/support).\n\nFor information about the Java version availability for specific Azure services, see the service documentation.\n\n## Services with a managed or default Java runtime\n\nFor the following services, Microsoft manages the Java runtime or provides one by default:\n\n* Azure App Service on Windows\n* Azure App Service on Linux\n* Azure Container Apps, through [code to cloud](/azure/container-apps/deploy-artifact?tabs=bash)\n* Azure Functions\n* Azure Spring Apps\n* Azure Service Fabric\n* Azure HDInsight\n* Azure Cognitive Search\n* Azure Cloud Shell\n* Azure DevOps\n* Azure Managed Instance for Apache Cassandra\n* Azure Cosmos DB for Apache Cassandra\n\nFor some of the services, you might be able to change the Java runtime from the one provided by default. For more information, see the documentation of the service.\n\n### OpenJDK distributions deployed\n\nMicrosoft might use 3rd-party Java distributions and binaries for a range of Java versions on some of its services - namely [Eclipse Temurin][temurin-link]. Microsoft keeps those 3rd-party distributions up to date for as long as there are updates available. For all other cases, Microsoft builds, supports, and deploys the [Microsoft Build of OpenJDK][msjdk-link].\n\n## Services without a managed or default Java runtime\n\nThe choice of the Java runtime is up to you in the following cases:\n\n* With Azure services such as Azure Virtual Machines, Azure Kubernetes Services (AKS), Azure Container Instances (ACI), Azure Container Apps (ACA), Azure Red Hat OpenShift, and Azure App Service Web App for Containers.\n* With services where users must manually configure the infrastructure and its components.\n\nWhile Java developers can bring their own Java runtimes from different vendors to Azure on these services, Microsoft recommends that you use any of the following OpenJDK distributions:\n\n* [Microsoft Build of OpenJDK][msjdk-link]\n* [Eclipse Adoptium Temurin][temurin-link]\n\nFor information on how to install and use OpenJDK, see the documentation for one of these distributions.\n\n[msjdk-link]: https://www.microsoft.com/openjdk\n[temurin-link]: https://www.adoptium.net\n\n## Customer support\n\nFor issues related to the deployment of Java applications to Azure, Azure Stack services, Azure Arc enabled clusters, and integration with Azure REST APIs, customers with a [qualifying support plan](https://azure.microsoft.com/support/plans/) receive support without any extra cost.\n"
  },
  {
    "path": "articles/java/fundamentals/toc.yml",
    "content": "items:\n- name: Java on Azure developer tools documentation\n  href: index.yml\n  items:\n    - name: Overview\n      href: java-azure-tools.md\n    - name: Java support\n      expanded: true\n      items:\n      - name: Java support\n        href: java-support-on-azure.md\n      - name: Java JDK installation\n        href: java-jdk-install.md\n      - name: JDK Flight Recorder and Mission Control\n        href: /java/openjdk/java-jdk-flight-recorder-and-mission-control\n      - name: Reasons to move to Java 11\n        href: /java/openjdk/reasons-to-move-to-java-11\n      - name: Transition from Java 8 to Java 11\n        href: /java/openjdk/transition-from-java-8-to-java-11\n      - name: Transition from Java 7 to Java 8\n        href: /java/openjdk/transition-from-java-7-to-java-8\n    - name: Visual Studio Code\n      href: https://code.visualstudio.com/docs/languages/java\n    - name: IntelliJ IDEA\n      href: ../toolkit-for-intellij/index.yml\n    - name: Eclipse\n      href: ../toolkit-for-eclipse/index.yml\n    - name: Maven plugins\n      expanded: true\n      href: https://github.com/Microsoft/azure-maven-plugins\n      items:\n        - name: Azure App Service\n          href: https://github.com/microsoft/azure-maven-plugins/blob/develop/azure-webapp-maven-plugin/README.md\n        - name: Azure Functions\n          href: https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions\n        - name: Azure Spring Apps\n          href: https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Spring-Cloud\n    - name: Java Diagnostic Tool (diag4j) on AKS\n      expanded: true\n      items:\n        - name: Overview\n          href: java-diagnostic-tools-on-aks-overview.md\n        - name: Spring Boot Admin component\n          href: java-diagnostic-tools-spring-boot-admin-quickstart.md\n        - name: Java Diagnostic Agent component\n          href: java-diagnostic-tools-java-diagnostic-agent-quickstart.md\n    - name: SSL certs from Key Vault\n      expanded: true\n      items:\n        - name: Deliver certs to JVM\n          href: java-azure-keyvault-ssl-integration-jvm.md\n        - name: Deliver certs to Tomcat\n          href: java-azure-keyvault-tomcat-integration.md\n    - name: Jenkins CI/CD\n      href: /azure/jenkins/\n    - name: Azure DevOps\n      href: /azure/devops-project/azure-devops-project-java\n    - name: Tutorials\n      expanded: true\n      items:\n        - name: Monitoring and logging using Logz.io\n          href: java-get-started-with-logzio.md\n"
  },
  {
    "path": "articles/java/get-started/choose.md",
    "content": "---\ntitle: Choose the Right Azure Services for your Java Applications\ndescription: This article guides you on using Azure services for Java application deployment, emphasizing Azure's support for diverse Java technologies and architectures.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: asirveda\nms.topic: concept-article\nms.date: 08/19/2025\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Choose the right Azure services for your Java applications\n\nThis article guides you on using Azure services for Java application deployment, emphasizing Azure's support for diverse Java technologies and architectures. It outlines deployment methods like lift and shift, containerization, and Platform-as-a-Service (PaaS), tailored to various control and simplicity levels.\n\nThe article advocates an *A+B mindset*, advising you to choose services based on application needs over a fixed A or B choice. It suggests considering use case, business goals, security, and budget for a flexible approach. The article highlights Microsoft's partnership with Java ecosystem leaders to enhance developer experiences and recommends Azure services for deploying Java applications - whether as source, binaries, or containers. This nuanced approach helps you focus on innovation, supported by Microsoft's commitment to providing Java applications with the most appropriate Azure services for your deployment strategy, maximizing efficiency, scalability, and cost-effectiveness.\n\n## Deploy any Java application with confidence and ease\n\nThe Java ecosystem includes diverse technologies such as Java SE, Jakarta EE (successor to Java EE and J2EE), Spring, numerous application servers, and other frameworks. Whatever you're doing with Java - such as building an app, using a framework, and running an application server - Azure supports your workload with an abundance of choice. Similarly, Azure supports any application architecture - from monolithic applications running on VMs or in containers to cloud-native, microservices-based applications running on fully managed services.\n\nAzure offers the following three primary methods for running Java applications in the cloud, tailored to varying levels of control and simplicity:\n\n- The *lift and shift* approach enables minimal-change migration of existing applications directly to Azure Virtual Machines.\n\n- Containerization offers flexibility, with Azure Kubernetes Service (AKS) and Azure Red Hat OpenShift being the main platforms for orchestrating containerized apps.\n\n- Platform-as-a-Service (PaaS) represents the pinnacle of ease and efficiency, delivering optimal developer productivity and operational manageability, often coupled with the most economical total cost of ownership.\n\nNo matter the stage of your Java application development, Azure provides a compatible cloud solution to meet your requirements. You can read more about these offerings in [Deploy Java applications with confidence and ease](deploy.md).\n\n### Complete portability for your Java applications: deploy seamlessly anywhere\n\nNo matter which Azure service you pick for your Java application, the flexibility of your application is guaranteed. Because you have the Java code and its compiled outputs, you have the freedom to deploy your application anywhere you want - be it on your local development machine, build servers, on-premises environments, or any cloud platform of your choosing. Your application's portability is in your hands.\n\nOf course, when there are so many choices, you face a dilemma.\n\n## Dilemma – use service A or B for Java applications\n\nIf you navigate Azure's offerings, you might encounter the dilemma of selecting the most suitable Azure service for running your Java applications. This choice is crucial, as it influences your resource planning, budget, project timelines, and ultimately, your application's time to market. The decision affects not just the initial deployment costs but also the ongoing maintenance expenses.\n\nIn the past, organizations often felt compelled to choose between two platforms, technologies, or competing solutions for their software applications. For example, organizations had to decide between WebLogic or WebSphere for Java Enterprise applications, Docker Swarm or Kubernetes for container management, or containers versus virtual machines (VMs) for deployment. This decision-making process is called the *A or B mindset*, and it differs significantly from A/B testing, which is a method for comparing two versions of a webpage or app against each other to determine which one performs better. Instead, the A or B mindset in this context is about choosing one platform or technology over another for application deployment. It comes from traditional on-premises practices, where decisions are often constrained by factors like packaged software delivery models, substantial upfront investments in infrastructure and software licensing, and the lengthy lead times needed to build and deploy any application platform.\n\nBringing this mindset to Azure can lead to excessive time spent on creating a single platform that tries to accommodate all applications, potentially introducing delays and inefficiencies. However, Azure offers a more advantageous approach, encouraging a shift from this restrictive mindset to one that embraces the best of both worlds, ultimately yielding a better return on investment (ROI).\n\nAs you transition to Azure, the cloud environment offers a flexible paradigm where you can provision and deprovision resources according to your needs, eliminating the necessity to choose between one service over another. This flexibility ushers in the A+B approach, a strategy that diverges from the traditional A or B mindset by encouraging a broader, more inclusive way of thinking. Azure facilitates this shift by making it both easy and cost-effective to blend the advantages of multiple services, and adopt an A+B mindset. This approach underscores the principle of selecting services that best align with the specific needs of your application, essentially advocating for choosing the right tool for the job at hand.\n\nThe transition to an A+B mindset enables organizations to broaden their decision-making processes and technical strategies, embracing new possibilities and opportunities that this mindset affords. This article delineates the principles of the A+B mindset, enabling you to judiciously select Azure services that resonate most effectively with your application's requirements. Whether it's Azure Container Apps, Azure App Service, Azure Kubernetes Service, or Virtual Machines, the A+B mindset grants you the latitude to assess and choose from an array of Azure Services for hosting your applications. This philosophy is applicable universally, transcending language and framework boundaries. Although Java applications are the focus here, the A+B mindset is equally relevant and beneficial for applications developed in any programming language.\n\nBy embracing the A+B mindset, you aren't confined to a single, predetermined service. Instead, you're empowered to combine services in a way that best suits the unique demands of your application. This approach not only enhances flexibility and scalability, but also optimizes cost and operational efficiency. This approach ensures that your technical strategy is as dynamic and adaptable as the cloud environment you're operating in.\n\n## Why it isn't necessary to think of service A or B\n\nChoosing the right cloud service for your applications doesn't have to be a binary decision between service A or service B, thanks to the flexibility and breadth of options the cloud offers, particularly with Azure. The following sections break down why sticking to the traditional \"one or the other\" choice isn't necessary and how adopting a more fluid approach can benefit your operations.\n\n### From old habits to new flexibility\n\nTraditionally, deploying IT systems involved significant upfront investments in hardware and software, alongside lengthy setup times. This environment made it logical to carefully select one platform and optimize everything around it to save on costs and resources. However, the cloud environment, including Azure, introduces a paradigm shift with its on-demand and elastic nature. You only pay for what you use, and adjusting your resources to meet your needs becomes straightforward, without the burden of initial capital expenditures.\n\n### The shift to cloud\n\nMoving to the cloud, and to Azure in particular, brings a significant change in how infrastructure and platform responsibilities are managed. Much of the heavy lifting, previously shouldered by your organization, now shifts to Microsoft, as seen in the following diagram. This change simplifies operations and reduces the effort needed to manage your applications. You aren't bound by the constraints of managing multiple platforms, freeing you to choose the best tool for each job without worrying about the extra costs and complexities.\n\nThe following diagram shows the shared responsibility model between customer and cloud provider:\n\n:::image type=\"complex\" source=\"media/responsibility.png\" alt-text=\"Diagram with a table that shows the shared responsibility model between customer and cloud provider.\" lightbox=\"media/responsibility.png\":::\n\nThe following table shows which infrastructure and platform responsibilities are managed by Microsoft, by the customer, or are shared:\n\n| Responsibility                        | SaaS      | PaaS      | IaaS      | On-premises |\n|---------------------------------------|-----------|-----------|-----------|-------------|\n| Information and data                  | Customer  | Customer  | Customer  | Customer    |\n| Devices (mobile and PCs)              | Customer  | Customer  | Customer  | Customer    |\n| Accounts and identities               | Customer  | Customer  | Customer  | Customer    |\n| Identity and directory infrastructure | Shared    | Shared    | Customer  | Customer    |\n| Applications                          | Microsoft | Shared    | Customer  | Customer    |\n| Network controls                      | Microsoft | Shared    | Customer  | Customer    |\n| Operating system                      | Microsoft | Microsoft | Customer  | Customer    |\n| Physical hosts                        | Microsoft | Microsoft | Microsoft | Customer    |\n| Physical network                      | Microsoft | Microsoft | Microsoft | Customer    |\n| Physical datacenter                   | Microsoft | Microsoft | Microsoft | Customer    |\n:::image-end:::\n\n### Choosing the best fit for each need\n\nIn this new cloud-centric world, the decision-making process becomes more about selecting the right tool for the right job, rather than trying to fit all your needs into one predetermined service. Whether it's choosing between Azure Kubernetes Service and Azure Container Apps for Spring Boot applications, or any other set of services, the focus shifts to what best meets the requirements of each specific application.\n\n### The rise of microservices\n\nThe adoption of microservices further supports this flexible approach. By design, [microservices](https://martinfowler.com/articles/microservices.html) encourage the use of the best-suited technology for each service, promoting a technological diversity that naturally aligns with the A+B mindset. This approach is about using the strengths of different services to build a more robust, efficient, and scalable application architecture.\n\n### Benefits of embracing A+B\n\nAdopting an A+B mindset offers several key benefits. It enables greater agility and flexibility, enabling you to choose the most appropriate tools and services for each aspect of your operations. This approach not only leads to better resource and cost efficiency but also shortens the time to market for your products. Ultimately, this approach fosters operational excellence by aligning your technology choices more closely with your business needs and goals.\n\nIn summary, the cloud, and Azure in particular, offers a new way of thinking about deploying and managing your applications. By moving away from the restrictive A or B choice and embracing the A+B mindset, you can make decisions that are more aligned with the specific needs of your applications, leading to improved efficiency, agility, and cost savings.\n\n## Practical guidance for transitioning to the A+B mindset\n\nThe following list enumerates some key principles that you can use as a guideline for transitioning to the A+B mindset and continuing with it:\n\n- Go from use case to solution, not the other way around. Often, many software teams decide on technology first and then try to force-fit the use cases and design. In many cases, this approach incurs a significant overhead in terms of cost, development time, resources, and operational expenses. Get clarity on your use cases and requirements, both functional and non-functional, before jumping into the solution.\n\n- Understand your business goals, the nature of business and your competition, and how often you need to roll out new features to production. You should always design your solution to meet your business goals and objectives.\n\n- Understand security and compliance requirements. In the age of the cloud, where everything is accessed over the internet, security is crucial and non-negotiable. Also, depending on the industry you serve, your application might need to meet certain compliance requirements. You must design your solution to weather advanced security attacks and to meet your compliance requirements.\n\n- Understand your budget and timelines. Have a clear understanding of your budget for initial development, ongoing operations, and future releases. Additionally, understand your timelines. The cost of delayed projects, both in terms of extra expenses and negative business impact, is often underestimated. Design your solution to meet both your budget and timeline.\n\n- Think cloud-native where applicable. Cloud-native architecture and technologies are an approach to designing, constructing, and operating workloads that are built in the cloud and take full advantage of the cloud computing model. With cloud-native, you can build and deploy applications to production at a faster rate. The cloud also provides capabilities that might not be possible on premises - for example, elasticity, global scale, advanced analytics, AI, and machine learning (ML) capabilities. Design your solution based on cloud-native technologies as much as possible.\n\n- Think DevOps culture. DevOps isn't just tools or processes, it's a software development practice that promotes collaboration between development and operations, resulting in faster and more reliable software delivery. Commonly called a culture, DevOps connects people, processes, and technology to deliver continuous value.\n\nChoose the solution that meets your business and nonfunctional requirements, one that is:\n\n- Fastest to implement.\n- Cost-effective in terms of costs involved for skilling up, building, deployment, and operations.\n- Easy to operate.\n- Fully compatible with automation.\n- Supportive of DevOps by design.\n\nThese principles help you keep your focus where it should be - on building a solution that meets your business goals rather than force-fitting the solution to a predetermined platform.\n\n### Exceptions\n\nLike anything else, there are exceptions to A+B. The following list isn't exhaustive, but it provides you with directional guidance on some exceptions that you might encounter:\n\n- Enterprise strategy. For example, some enterprises use an enterprise-wide adoption of containers to build and deploy applications because they might have multiple programming languages at play, and they want to build and deploy all applications in a unified manner.\n\n- Too far down the line with execution. You might have chosen a solution before going through the A+B analysis. If you're already deep into execution of your solution, continue with it, but for the next application, use the principles of the A+B mindset to choose the right solution for your use case.\n\n- Large scale data center migrations. To accelerate their journey to the cloud, enterprises commonly use a lift and shift strategy, which involves migrating servers (hosting their applications) in bulk to Azure using tools like Azure Migrate. Some use this approach to migrate data centers to Azure and shut them down in an efficient and cost-effective manner. In this scenario, we recommend using the A+B mindset to modernize applications after migrating to Azure.\n\n### Key considerations\n\nWe provided you with the framework for thinking and the principles that you can use to choose the right destinations in Azure for your applications. It isn't one size that fits all. It isn't A or B, but A + B.\n\nThe following diagram summarizes the key considerations for choosing an Azure service for any application:\n\n:::image type=\"complex\" source=\"media/key-considerations.png\" alt-text=\"Diagram that shows a summary of the key considerations for choosing an Azure service for any application.\" lightbox=\"media/key-considerations.png\":::\nThe following list describes the key considerations:\n\n- Go from requirements to solution: Understand the requirements before considering the solution.\n- It's not A or B: Choose the Azure service that best meets the requirements of your application.\n- Look for a win-win: Focus and rely on your strength - which is building business applications. Let Microsoft take care of running the platform and infrastructure for you so that you can be agile and go to market faster than ever.\n:::image-end:::\n\n## How to choose the right Azure services for your Java applications\n\nTo streamline the selection process amidst the multitude of technology options for Java applications on Azure, we created a simple decision tree to help developers, customers, and systems integrators to their optimal Azure service.\n\nBeyond the practical guidance for considering non-functional requirements, from a technological point of view, the initial question to consider is whether you need control over infrastructure. If you don't, managed services are the best, most advisable route. The nature of the applications - whether they're Spring or App Server-based - further guides the decision: Spring applications align with Azure Container Apps, while Azure App Service suits Tomcat or JBoss EAP applications.\n\nFor those requiring infrastructure control, the choice hinges on multi-cloud technology preferences: Azure Virtual Machines offers a simple transition, and for those integrated with Tanzu, the Tanzu on IaaS marketplace offerings are ideal. Customers invested in Kubernetes have the options of Azure Kubernetes Service and Azure Red Hat OpenShift. This decision-making framework is designed to simplify choices by pairing customer requirements with Azure's best suited solutions.\n\nMicrosoft collaborates with numerous partners, including partners in the following areas:\n\n- Leading Java ecosystem partners, such as Oracle, Broadcom, Red Hat, IBM, and OpenAI.\n- Key database and tooling organizations, such as MySQL, PostgreSQL, MongoDB Labs, DataStax, Redis Labs, Confluent, and Elastic.\n- Observability experts, such as New Relic, Dynatrace, AppDynamics, Grafana Labs, and Datadog.\n- Development tools, such as IntelliJ, Maven, and Gradle. \n\nOur combined investment goes into crafting smoother developer experiences, ensuring seamless integrations with essential services such as databases, caches, messaging, and directories, plus providing comprehensive tools for observability. With automation, load balancing, and autoscaling, we aim to take the burden of infrastructure management off your shoulders. This support enables you to concentrate on creating business value through your code, confident in the knowledge that the underlying systems are robust and scalable. For these reasons, we recommend the use of specific Azure services to host and run your Java application types.\n\n### Deploy Java applications as source or binaries\n\nFor Java applications on Azure, whether deployed directly from source code or as compiled binaries (JAR, WAR, or EAR files), deployment is streamlined thanks to Azure's comprehensive service offerings designed specifically for these purposes. The inherent portability of Java applications means that Azure can provide a wide array of services to match your unique deployment strategies and operational needs. This flexibility ensures that no matter what the specifics of your Java application, there's an Azure service that fits perfectly with your requirements.\n\nConsider the following three examples, which showcase how Azure caters to different Java application deployment scenarios:\n\n- Spring Applications. For developers working with Spring applications, we recommend using Azure Container Apps, which integrates with popular development tools like IntelliJ, VS Code, Maven, and Gradle, alongside automation tools such as Azure DevOps, GitHub Actions, and Jenkins. Observability tools such as Application Insights, New Relic, Dynatrace, App Dynamics, Grafana, Log Analytics, Elastic, and Splunk are also supported. Security is a top priority, with integrations for Key Vault handling secrets and TLS/SSL certificates, \"passwordless\" authentication with backing services through managed identities, and Azure role-based access control (RBAC), ensuring a secure, streamlined deployment process for Spring apps in the cloud.\n\n- Java Applications on JBoss EAP. Similarly, for Java applications using JBoss EAP, there's a tailored experience thanks to the collaboration between the Microsoft Azure team and Red Hat JBoss EAP teams. This partnership resulted in enhanced support on Azure App Service, offering a rich set of features designed for JBoss EAP applications. This support enables you to use the combined expertise of Microsoft and Red Hat, ensuring your Java applications run smoothly, securely, and efficiently on Azure.\n\n- Enterprise Java Applications on WebLogic. Traditional enterprise Java applications that run on Oracle WebLogic also have a dedicated path to Azure. The collaboration between Microsoft Azure and the Oracle WebLogic teams paved the way for optimized deployment on Azure Virtual Machines. This partnership extends to integrating with fundamental IaaS features such as virtual machines, storage, networking, and load balancers, providing a solid foundation for enterprise Java applications on Azure. This coordinated effort ensures that applications benefit from both the robustness of WebLogic and the scalability and flexibility of Azure infrastructure.\n\nThese scenarios highlight Azure's dedication to offering a flexible, secure, and efficient deployment environment for Java applications, catering to various frameworks and architectures. Azure also provides specialized services for other Java applications, such as those running on Tomcat or WebSphere, ensuring that there's an Azure service suited for every type of Java application.\n\nJava applications running on Azure Virtual Machines can use the Azure Command Launcher for Java to get battle-tested defaults without manual JVM tuning. This launcher applies to typical JAR, WAR, and EAR deployments on VMs and complements existing guidance for application servers, helping you achieve optimal performance and resource utilization without complex configuration.\n\nDevelopers and operators get smooth and productive cloud deployment experience by using these tailored Azure services, automating and securing their Java applications with ease. However, choosing alternative deployment options might require you to handle the building and maintenance of these essential developer and operator experiences yourself.\n\nThe following diagram shows recommended Azure services for every Java application type deployed as source or binaries:\n\n:::image type=\"complex\" source=\"media/find-match.png\" alt-text=\"Diagram that shows recommended Azure services for every Java application type deployed as source or binaries.\" lightbox=\"media/find-match.png\":::\nThe following table helps you find the right Azure service for every Java app type deployed as source or binaries:\n\n|                     | Spring               | Tomcat or MicroProfile | Serverless and event-driven | JBoss EAP              | WebLogic               | WebSphere Traditional  |\n|---------------------|----------------------|------------------------|-----------------------------|------------------------|------------------------|------------------------|\n| Recommended service | Azure Container Apps | Azure App Service      | Azure Functions             | Azure App Service      | Azure Virtual Machines | Azure Virtual Machines |\n| Alternative service | Azure App Service    | Azure Container Apps   | Azure App Service           | Azure Virtual Machines |                        |                        |\n:::image-end:::\n\nTo learn more about the services referenced in this diagram, use the links in the following table:\n\n| Service                                                 | Quickstart for Java apps – deployed as source or binaries                                                                                                                                      |\n|---------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| [Azure Container Apps](/azure/container-apps/index)     | [Deploy a Java app](/azure/container-apps/java-get-started) <br/> [Deploy a Quarkus app](/azure/container-apps/tutorial-java-quarkus-connect-managed-identity-postgresql-database)             |\n| [App Service](/azure/app-service/index)                 | [Deploy a Java app on Tomcat](/azure/app-service/quickstart-java?pivots=java-maven-tomcat) <br/> [Deploy a Java app on JBoss EAP](/azure/app-service/quickstart-java?pivots=java-maven-jboss)  |\n| [Azure Functions](/azure/azure-functions/index)         | [Deploy a Java function app](/azure/azure-functions/create-first-function-cli-java)                                                                                                            |\n| [Azure Virtual Machines](/azure/virtual-machines/index) | [Oracle WebLogic Server on Azure Virtual Machines](/azure/virtual-machines/workloads/oracle/oracle-weblogic) <br/> [IBM WebSphere family on Azure Virtual Machines](../ee/websphere-family.md) |\n\n### Deploy Java applications as containers\n\nWhen it comes to deploying Java applications, containerization represents a cutting-edge approach that enhances automation in container creation, management, and governance across enterprises. The challenge lies in securely and reliably building containers, a crucial step for swiftly delivering high-quality, containerized software applications. This process can begin from scratch or use existing container systems, integrating tools that compile and store code and binaries to streamline container updates and management. Such integration is vital for fitting into Continuous Integration/Continuous Deployment (CI/CD) pipelines, offering a flexible deployment method for Java applications in container form.\n\nAzure services stand out by not only easing the delivery of containerized applications but also providing clear paths for deploying from sources or binaries. This dual approach minimizes the impact on developers and lightens the load for infrastructure or platform operators. Given Java's inherent portability, Azure's broad selection of container services ensures that you find the perfect match for your deployment strategy and needs.\n\nConsider the following two examples, which showcase how Azure caters to containerized Java application deployment scenarios:\n\n- Spring Applications. Azure Container Apps is an excellent choice for containerized Spring applications. It supports multiple deployment types, including source, binaries, or container images. This flexibility enables you to shift between deployment methods easily. You might start with containers but later decide to deploy as sources or binaries. This option is advantageous because it circumvents the need for the ongoing building and maintenance of containers, which can be cumbersome, repetitive, and time intensive.\n\n- Java Applications on Tomcat. Azure App Service is suited for containerizing Java applications designed to run on Tomcat. It accommodates various deployment types, such as binaries or container images. Like Azure Container Apps, this service offers flexibility to alternate between deployment strategies. You can begin with container deployment and maintain the option to later switch to deploying binaries (WARs and JARs). This versatility ensures that you can choose the most efficient deployment method for your specific scenario, streamlining the development and deployment process.\n\nThese examples underscore Azure's commitment to providing versatile, efficient, and developer-friendly environments for deploying Java applications, whether through traditional methods or modern containerization.\n\n> [!NOTE]\n> When running Java workloads in Azure-managed container services (for example, Azure Kubernetes Service, Azure Container Apps, and Azure Container Instances), you can use the Azure Command Launcher for Java to automatically apply Azure-optimized JVM parameters. This launcher helps reduce wasted memory and CPU, improves first-deploy performance, and enhances cost efficiency. For more information, see [Public Preview: Azure Command Launcher for Java](https://azure.microsoft.com/updates?id=543994).\n\nThe following diagram shows the recommended Azure services for every Java application type deployed as containers:\n\n:::image type=\"complex\" source=\"media/find-match-containers.png\" alt-text=\"Diagram that shows recommended Azure services for every Java application type deployed as containers.\" lightbox=\"media/find-match-containers.png\":::\n\nThe following table helps you find the right Azure service for every Java app type deployed as containers:\n\n|                     | Spring microservice  | Spring monolith           | Tomcat                   | JBoss EAP                | WebLogic                 | WebSphere Liberty        |\n|---------------------|----------------------|---------------------------|--------------------------|--------------------------|--------------------------|--------------------------|\n| Recommended service | Azure Container Apps | Azure Container Apps      | Azure App Service        | Red Hat OpenShift        | Azure Kubernetes Service | Azure Kubernetes Service |\n| Alternative service | AKS                  | Azure App Service<br/>AKS | Azure Kubernetes Service | Azure Kubernetes Service |                          | Red Hat OpenShift        |\n:::image-end:::\n\nTo learn more about the services referenced in this diagram, use the links in the following table:\n\n| Service                                             | Quickstart for containerized Java apps                                                                                                                                             |\n|-----------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| [Azure Container Apps](/azure/container-apps/index) | [Deploy a Java app](/azure/container-apps/java-get-started) <br/> [Deploy a Quarkus app](/azure/container-apps/tutorial-java-quarkus-connect-managed-identity-postgresql-database) |\n| [App Service](/azure/app-service/index)             | [Deploy a Java app on Tomcat](/azure/app-service/quickstart-custom-container?tabs=java)                                                                                            |\n| [Azure Red Hat OpenShift](/azure/openshift/index)   | [Deploy a Java app on JBoss EAP](/azure/openshift/howto-deploy-java-jboss-enterprise-application-platform-app)                                                                     |\n| [Azure Kubernetes Service](/azure/aks/index)        | [Deploy a Java app on WebLogic Server](/azure/aks/howto-deploy-java-wls-app) <br/> [Deploy a Java app on WebSphere Liberty](/azure/aks/howto-deploy-java-liberty-app)              |\n\n## Summary\n\nIn navigating the deployment of Java applications, Azure champions a nuanced A+B approach, offering a spectrum of services tailored to meet every application's needs. Microsoft's collaboration with the Java ecosystem leaders resulted in a suite of Azure services, each recommended for specific Java application types - deployed as source, binaries, or containers - streamlining the deployment process and ensuring optimal performance. This focus on matching deployment strategies with the most appropriate Azure services underscores Microsoft's commitment to providing you with the flexibility to choose the right tools for the job.\n\nThe inherent portability of Java applications is a key advantage, enabling a seamless transition across on-premises systems and different cloud providers to enhance operational efficiency and agility. Azure provides tooling such as the Azure Command Launcher for Java to optimize JVM defaults for cloud-native and container workloads, helping achieve efficiency and agility without additional platform complexity.\n\nBy advocating for this broader, more inclusive selection process, Microsoft not only simplifies the cloud journey for Java applications, but also maximizes scalability, security, observability, and cost-effectiveness. Ultimately, Microsoft's guidance empowers developers and enterprises to use Azure's ecosystem, ensuring that each Java application thrives in the cloud environment best suited to its needs.\n\n## Next step\n\n[Azure for Java developer documentation](../index.yml)\n"
  },
  {
    "path": "articles/java/get-started/code.md",
    "content": "---\ntitle: Code Using the Java tools you Know and Love\ntitleSuffix: Azure\ndescription: This article provides an overview of the tools you can use for Java code development with Azure.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: asirveda\nms.topic: concept-article\nms.date: 08/19/2025\nms.custom: devx-track-java, devx-track-extended-java, devx-track-jenkins\n---\n\n# Code using the Java tools you know and love\n\nAs Java developers, we love the tools we use. We have our own unique way of working with them that helps us focus and stay productive, just as we have our shortcuts and secrets for getting things done faster and better. Whether we use IntelliJ, Eclipse, or VS Code for coding, or JUnit for testing, or Maven or Gradle for dependency management and build automation, there's nothing that can compel us to toss aside our preferred tools and learn something new. That's why Azure empowers Java developers to bring their applications to the cloud on your favorite tools and frameworks and on the operating system of your choice. Let's take a closer look at some of these tools.\n\n## IDEs - VS Code, IntelliJ, and Eclipse\n\nAn ideal IDE includes tools for editing source-code, compilation, local build automation, testing, and debugging - along with controls and monitoring tools for backend services for data management, caching, messaging, and eventing. An integrated toolset that supports all these tasks makes developers more productive, enabling them to avoid having to learn and constantly switch between standalone tools for each task. IntelliJ, Eclipse, and Visual Studio Code are the popular Java IDEs.\n\n## Java on Visual Studio Code\n\nVisual Studio Code (VS Code) is a lightweight, agnostic operating system that runs on Windows, macOS, and Linux. A powerful IDE, it provides a comprehensive toolset for Java development. It supports any Java Development Kit (JDK), including the Microsoft Build of OpenJDK, Amazon Corretto, Eclipse Adoptium, and Oracle Java SE. VS Code also integrates well with all Java frameworks, application servers, and other popular tools, including Tomcat, Spring Boot, JBoss EAP, WildFly, Quarkus, Open Liberty, Maven, and Gradle. It also supports other programming languages that are frequently used by Java developers - like JavaScript and SQL.\n\n:::image type=\"content\" source=\"media/visual-studio-code-deploy.jpg\" alt-text=\"Screenshot of Visual Studio Code that shows a Java file and the Output window.\" lightbox=\"media/visual-studio-code-deploy.jpg\":::\n\nVS Code supports and streamlines Java development workflows through a broad range of [Java extensions for Visual Studio Code](https://code.visualstudio.com/docs/java/extensions). There are several hundred extensions for Java alone, which you can search for from within the IDE itself. We packaged key extensions for fundamental Java development into the [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack). This extension pack includes extensions for project management, Maven integration, code editing, code completion, code navigation, refactoring, linting, formatting, debugging, running and debugging JUnit/TestNG test cases, and more. There's also a [Spring Boot Extension Pack](https://marketplace.visualstudio.com/items?itemName=vmware.vscode-boot-dev-pack) for developing and deploying Spring Boot applications - including Spring Initializr support.\n\nThe [Azure Tools Extension Pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack), built by Azure engineering teams, provides a rich set of extensions for discovering and interacting with all the Azure cloud services that help power your Java applications. You can use all the extensions from within VS Code as you're writing, debugging, and testing your Java app. When you're ready to deploy your app, the Azure Tools Extension Pack supports one-click deployment to the various compute services that Azure provides for running Java applications.\n\n[Java in Visual Studio Code](https://code.visualstudio.com/docs/languages/java) provides a good overview of the most popular Visual Studio Code extensions for Java development. It also provides instructions for getting started with Java development using Visual Studio Code, along with a walkthrough of the many ways it can help make Java developers more productive.\n\n[Getting Started with Java in VS Code](https://code.visualstudio.com/docs/java/java-tutorial) provides a short tutorial that covers setting-up VS Code for Java Development, including how to write and run the Hello World program. Similarly, there are short tutorials that show how to build a Java application using Visual Studio Code and then deploy it with a single click into services such as the following ones:\n\n* [Azure Container Apps](/azure/container-apps/deploy-visual-studio-code)\n* [Azure App Service](https://code.visualstudio.com/docs/java/java-webapp)\n* [Azure Functions](/azure/azure-functions/create-first-function-vs-code-java)\n\nIf you're new to Java on VS Code, try out the \"Java: Tips for Beginners\" command in its main Command Palette.\n\n:::image type=\"content\" source=\"media/visual-studio-code.jpg\" alt-text=\"Screenshot of Visual Studio Code that shows a Java file and sidebar pane.\" lightbox=\"media/visual-studio-code.jpg\":::\n\n## Azure Toolkit for IntelliJ\n\nThe [Azure Toolkit for IntelliJ](../toolkit-for-intellij/index.yml) lets Java developers create, develop, test, and deploy Java applications to Azure using the IntelliJ IDE. For example, developers can use it to accomplish the following tasks:\n\n* Deploy [Java Web applications](../toolkit-for-intellij/create-hello-world-web-app.md) to Azure App Service and [custom containers](../toolkit-for-intellij/hello-world-web-app-linux.md) in Azure App Service.\n* Deploy Java or Spring applications, or any [containerized applications](../toolkit-for-intellij/create-container-apps-intellij.md), to Azure Container Apps.\n* Deploy [serverless applications](/azure/azure-functions/functions-create-maven-intellij) to Azure Functions.\n\nAll of these examples use compute services for running Java on Azure, which we cover in more detail later in this documentation. Spring Cloud Azure integrations are provided through the Spring Initializr experiences in IntelliJ. Just add the appropriate [Java libraries and drivers](../sdk/libraries-drivers-modules.md) (including Azure SDK for Java) as dependencies in your Java project.\n\nMicrosoft is actively investing time and resources to provide more functionality for IntelliJ, including new experiences for cloud-native development and deeper integration with Azure services - including integrations with Azure Kubernetes Service and Application Insights.\n\n:::image type=\"content\" source=\"media/azure-toolkit-for-intellij.jpg\" alt-text=\"Screenshot of IntelliJ that shows a Java file and the Deploy to Azure dialog box.\" lightbox=\"media/azure-toolkit-for-intellij.jpg\":::\n\n## Azure Toolkit for Eclipse\n\nThe Azure Toolkit for Eclipse lets Java developers create, develop, test, and deploy Java applications to Azure using the Eclipse IDE. It includes key [Java libraries and drivers](../sdk/libraries-drivers-modules.md), including the Azure SDK for Java. Developers can use the Azure Toolkit for Eclipse to accomplish the following tasks from the Eclipse IDE:\n\n* Deploy Java Web Apps to Azure App Service and custom containers in App Service.\n* Deploy Java or Spring applications, or any containerized applications, to Azure Container Apps.\n* Deploy serverless applications to Azure Functions using Maven or Gradle plugins.\n\n## Dependency management and build automation - Maven, Gradle, and GitHub\n\nMaven and Gradle are two popular project management, dependency management, and build automation tools for Java applications. These tools are well-integrated into popular Java IDEs, with one-click deployment to Azure supported through a set of plug-ins for each tool.\n\n## Maven Plugins for Azure Services\n\nMaven plugins for Azure services let you extend your Maven development workflows to Azure, testing your Java applications locally and then deploying them to Azure services in a single step - in a way that integrates with Azure authentication methods and Azure Role-Based Access Control. The [Maven plugin for Azure App Service](https://github.com/microsoft/azure-maven-plugins/blob/develop/azure-webapp-maven-plugin/README.md) helps you deploy Maven Java Web application projects to Azure App Service and to custom containers in App Service. The [Maven plugin for Azure Functions](https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions) helps you deploy Maven serverless Java application projects to Azure Functions.\n\n:::image type=\"content\" source=\"media/maven.png\" alt-text=\"Diagram that shows a laptop screen with the text 'mvn azure-webapp:deploy' and the heading Deploy Java Web App and Dependencies in One Step.\" border=\"false\":::\n\n## Gradle plugins for Azure services\n\nGradle plugins for Azure services are similar to those for Maven. They let you deploy your Java applications to Azure services in a single step - in a way that integrates with Azure authentication methods and Azure Role-Based Access Control. The [Gradle plugin for Azure App Service](https://github.com/microsoft/azure-gradle-plugins/blob/master/azure-webapp-gradle-plugin/README.md) helps you deploy Gradle Java Web application projects to Azure App Service and to custom containers in App Service, and the [Gradle plugin for Azure Functions](https://github.com/microsoft/azure-gradle-plugins/blob/master/azure-functions-gradle-plugin/README.md) helps you deploy Gradle serverless Java application projects to Azure Functions.\n\n:::image type=\"content\" source=\"media/gradle.png\" alt-text=\"Diagram that shows a laptop screen with the text 'gradle azureWebAppDeploy' and the heading Deploy Java Web App in One Step.\" border=\"false\":::\n\n## GitHub\n\nGitHub is a popular repository for Java applications, providing a DevOps environment for more than 3.5 million Java applications. Using [GitHub Actions for Java](https://github.com/actions/setup-java), you can accomplish tasks like the following ones:\n\n* Download and set up a requested version of Java.\n* Extract and cache a custom version of Java from a local file.\n* Configure runners for publishing using Maven, Gradle, or a GPG private key.\n* Register problem matchers for error output.\n* Cache dependencies managed by Maven or Gradle.\n\nGitHub Actions makes it easy to automate all of your Java software workflow using world-class CI/CD. You can build, test and deploy your code to Azure right from GitHub. Make code reviews, branch management, and issue triaging work the way you want. You can deploy to any of the Azure services for running your Java applications.\n\nGitHub also supports [development containers for Java](https://github.com/Microsoft/vscode-remote-try-java), which you can access via GitHub Codespaces or VS Code Remote - Containers.\n\n## Jenkins Pipelines\n\nMany Microsoft customers who run Java on Azure use Jenkins - an open-source automation server - to build, test, and deploy their applications. If you use Jenkins, you can manage your source code in Azure DevOps, GitHub, or [any other source code management system](https://plugins.jenkins.io/ui/search/?categories=scm) while continuing to use Jenkins for your CI/CD builds - for example, [triggering a Jenkins build when you push your code to your project's Git repository](https://www.youtube.com/watch?v=okmh53oGlak).\n\n## Azure Pipelines\n\n[Azure Pipelines](/azure/devops/pipelines), part of the [Azure DevOps](/azure/devops) service, lets you continuously build, test, and deploy your Java applications to any platform and cloud. It works with GitHub (or Azure Repos) for source control, enabling you to [build using Maven or Gradle](/azure/devops/pipelines/ecosystems/java) and then deploy to any of the Azure services for running your Java applications.\n\n## Azure Command Line Interface\n\nThe Azure Command-Line Interface (CLI) is a cross-platform command-line tool for creating, connecting to, and managing Azure resources - including the execution of terminal commands via command-line prompts or scripts. You can install the Azure CLI locally on Linux, macOS, or Windows-based machines, run it from within a container, or access the Azure CLI from a browser through Azure Cloud Shell.\n\nThe following example shows you how to use Azure CLI to deploy a JAR or WAR file to Azure Container Apps:\n\n```azurecli\naz containerapp up \\\n    --name <CONTAINER_APP_NAME> \\\n    --resource-group <RESOURCE_GROUP> \\\n    --subscription <SUBSCRIPTION_ID> \\\n    --location <LOCATION> \\\n    --environment <ENVIRONMENT_NAME> \\\n    --artifact <JAR_FILE_PATH_AND_NAME> \\\n    --ingress external \\\n    --target-port 8080 \\\n    --query properties.configuration.ingress.fqdn\n```\n\n## Summary\n\nWhen you use Java with Azure, you can choose your own tools. You can build test, debug, and troubleshoot any Java application (including polyglot applications) using the machine of your choice, including Windows, macOS, Linux, and cloud-based machines. You can also deploy your application to Azure on any application server or with any embedded application server.\n\n:::image type=\"content\" source=\"media/code-using-tools-you-know.png\" alt-text=\"Diagram with the text 'Code using the Java tools you know and love' and logos for the tools described in this article.\" border=\"false\" lightbox=\"media/code-using-tools-you-know.png\":::\n\n## Next step\n\n[Deploy Java applications with confidence and ease](deploy.md)\n"
  },
  {
    "path": "articles/java/get-started/deploy.md",
    "content": "---\ntitle: Deploy Java applications with Confidence and Ease\ntitleSuffix: Azure\ndescription: This article provides an overview of the Java deployment options available with Azure.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: asirveda\nms.topic: install-set-up-deploy\nms.date: 08/19/2025\nms.custom: devx-track-java, devx-track-extended-java, linux-related-content\n---\n\n# Deploy Java applications with confidence and ease\n\nThe Java ecosystem includes diverse technologies such as Java SE, Jakarta EE (successor to Java EE and J2EE), Spring, numerous application servers, and other frameworks. Whatever you're doing with Java - building an app, using a framework, and running an application server - Azure supports your workload with an abundance of choice. Similarly, Azure supports any application architecture - from monolithic applications running on VMs or in containers to cloud-native, microservices-based applications running on fully managed services.\n\nTypically, to run your Java application, you deploy it to an application server - an instance of the Java Virtual Machine (JVM) that runs your applications. Or you can build a standalone application with an embedded application server. Either way, the application server provides common application infrastructure and functional capabilities, collaborating with Web containers to return a dynamic, customized response to a client request. The client request can be processed using software components that might include servlets, dynamic pages, enterprise beans, supporting classes, dependent libraries, and data drivers.\n\nTomcat, JBoss EAP, WildFly, WebLogic, and WebSphere are popular application servers. Similarly, Spring Boot, Quarkus, and Open Liberty are popular frameworks for building standalone applications with embedded application servers. Azure supports them all, enabling you to use any Java application server and deploy your Java application with confidence and ease.\n\n## Deploy Spring Boot or Java app to any application server - Tomcat and Jakarta EE\n\nWith Azure, you can run any version and any distribution of Java and any application server, without restrictions, and without having to manage your own physical infrastructure. You decide how much control you want, or how much day-to-day management you want Azure to handle for you with options like virtual machines, containers, and fully managed services. If you're using commercially supported Java app servers or frameworks - such as VMware Spring Runtime, Red Hat JBoss EAP, Oracle WebLogic Server, or IBM WebSphere, Liberty, or OpenLiberty - Azure offers jointly developed and supported offerings for all of them.\n\n## Deployment options\n\nAzure provides an abundance of deployment options for Java applications, including infrastructure-as-a-service (IaaS), containers-as-a-service (CaaS), and platform-as-a-service (PaaS) hosting services. You can lift-and-shift existing Java applications to virtual machines (VMs), containerize them in multiple ways, or deploy them onto fully managed PaaS services to optimize ease of management, developer and operational productivity, and total cost of ownership.\n\n## VMs and containers\n\nYou're free to use any distribution and version of Java - and any application server - when you deploy to virtual machines or containers on Azure. The choice is entirely up to you. Just remember, you need to manually configure the infrastructure and its components. Deployment options that fall into this category include:\n\n- [Azure Virtual Machines](/azure/virtual-machines), which give you the flexibility of virtualization without having to purchase and maintain the physical hardware that runs it. However, you still need to maintain the VM by installing, configuring, and patching the software that runs on it.\n\n- [Azure Virtual Machine Scale Sets](/azure/virtual-machine-scale-sets/overview), which lets you create and manage a group of load-balanced VMs. The number of VM instances can automatically increase or decrease in response to demand or a defined schedule.\n\n- [Azure Kubernetes Service (AKS)](/azure/aks/intro-kubernetes), which simplifies deploying a managed Kubernetes cluster by handling all of the operational overhead for you - including critical tasks like maintenance and health monitoring. AKS supports elastic provisioning of capacity, including event-driven autoscaling and KEDA triggers.\n\n- [Azure Red Hat OpenShift](/azure/openshift/intro-openshift), which provides highly available, fully managed OpenShift clusters on-demand. OpenShift delivers added-value features to complement Kubernetes, making it a turnkey container platform that delivers improved developer and operator experience.\n\nWhile you can deploy any Java runtime on all these IaaS and CaaS services, we recommend that you use one of the following runtimes:\n\n- [Microsoft Build of OpenJDK](https://www.microsoft.com/openjdk) for Java 11 or 17 - the [base container images](/java/openjdk/containers) for which Microsoft supplies and maintains.\n\n- [Eclipse Adoptium Temurin](https://adoptium.net) for Java 8 - the Java runtime for which is provided by the Eclipse Adoptium project (formerly the OpenJDK project).\n\nBoth of these builds are available free-of-charge for local development and testing, and for building production-ready binaries using any platform or DevOps tools - without having to pay any licensing fees. We recommend them as a matter of convenience. When you use one of these builds, if you have any issues and have a qualifying support plan for Azure, you can open an Azure support ticket - without any more costs. That said, it's worth pointing out that these recommendations are just that - the options that we recommend among various other freely available builds of OpenJDK for ease-of-support. For more information, see [Java support on Azure and Azure Stack](../fundamentals/java-support-on-azure.md).\n\nBeyond selecting an LTS runtime, teams running on Azure infrastructure can optionally use the Azure Command Launcher for Java to apply battle-tested defaults without hand-tuning JVM flags for cloud and container environments.\n\n### Azure Command Launcher for Java (Public Preview)\n\nThe Azure Command Launcher for Java is an optional JVM launcher optimized for Azure that automatically applies cloud-tailored JVM parameters for Java workloads. This launcher is designed for Java applications running on Azure VMs, VM Scale Sets, AKS, Azure Red Hat OpenShift, and Azure Container Instances. By using the Azure Command Launcher for Java, you can improve resource utilization, enhance first-deploy performance, and reduce wasted memory and CPU without manual JVM tuning. For more information, see [Public Preview: Azure Command Launcher for Java](https://azure.microsoft.com/updates?id=543994).\n\n:::image type=\"content\" source=\"media/build-migrate.png\" alt-text=\"Diagram with the heading 'Build or Migrate Java Apps' and a chart showing the relationship between Java technologies and Azure service categories.\" border=\"false\" lightbox=\"media/build-migrate.png\":::\n\nAll of these IaaS and CaaS deployment options let you easily deploy the Apache Tomcat application server. If you're using a commercial offering - such as Spring Runtime from VMware, JBoss EAP from Red Hat, WebLogic Server from Oracle, or WebSphere from IBM - Azure offers jointly developed and supported hosting options from those vendors as well. They're covered later, under [Jointly built and supported solutions with Java ecosystem partners](#jointly-built-and-supported-solutions-with-java-ecosystem-partners).\n\n## Fully managed (PaaS) services\n\nFully managed PaaS services for running Java applications on Azure include the following options:\n\n- [Azure Container Apps](/azure/container-apps), which lets you run microservices and containerized applications on a serverless platform. Common uses include deploying API endpoints, hosting background processing applications, handling event-driven processing, and running microservices. Applications built on Azure Container Apps can dynamically scale based on HTTP traffic, event-driven processing, CPU, or memory load, or any [KEDA-supported scaler](https://keda.sh/docs/2.7/scalers).\n- [Azure App Service](/azure/app-service), an HTTP-based service for hosting web applications, REST APIs, and mobile back ends - with built-in security, load balancing, autoscaling, and automated management. App Service also supports comprehensive DevOps capabilities, such as continuous deployment, package management, staging environments, custom domains, and TLS/SSL certificates.\n\nJava runtimes for Azure App Service and for Azure Container Apps deployed as code or binaries (JAR/WAR) are supplied and maintained by Microsoft. They only support LTS distributions of OpenJDK, using Eclipse Adoptium Temurin for Java 8 and the Microsoft Build of OpenJDK for Java 11 and 17. That said, there are some caveats - for example, our jointly developed and supported partner offerings (discussed [later](#jointly-built-and-supported-solutions-with-java-ecosystem-partners)) use their own runtimes.\n\nThe Azure Command Launcher for Java targets customer-managed runtimes and isn't used by the Microsoft-managed Java runtimes provided by Azure App Service or Azure Container Apps. However, developers who deploy their own custom container images to Azure Container Apps can choose to use the launcher inside those images, as those containers use customer-managed runtimes.\n\nFor Azure Container Apps built from your own container images, since you need to build and manage your own container images from source code, you're free to use the distribution and version of Java - and application server - of your choice.\n\n## Serverless functions\n\nSometimes you don't need an entire Java application. For example, for real-time data processing, you might just need a small piece of code that can be triggered at scale - perhaps by millions and millions of events. Such events can be ingested via [Azure Event Hubs](/azure/event-hubs), processed by event-driven serverless Java code running at scale in [Azure Functions](/azure/azure-functions), and saved into a data store such as [Azure Cosmos DB](/azure/cosmos-db).\n\n## Jointly built and supported solutions with Java ecosystem partners\n\nMicrosoft has partnered with leading vendors in the Java ecosystem to deliver best-in-class solutions for running Java on Azure - ranging from jointly developed and supported managed services to Azure Marketplace offerings for popular Java application servers. We also integrated popular application monitoring tools, which are covered later in this documentation.\n\n:::image type=\"content\" source=\"media/strong-partner-ecosystem.png\" alt-text=\"Diagram with the heading 'Leverage the benefits of our strong partner ecosystem' and logos for the partners described in this article.\" border=\"false\" lightbox=\"media/strong-partner-ecosystem.png\":::\n\n## JBoss EAP (Red Hat)\n\nRed Hat provides open-source solutions for the enterprise. One such solution is JBoss Enterprise Application Platform (EAP), a popular application server platform that's Java EE Certified and Jakarta EE Compliant in both Web Profile and Full Platform. Red Hat is also a contributor for the [Java](https://www.java.com) standards, [OpenJDK](https://openjdk.org), [MicroProfile](https://microprofile.io), [Jakarta EE](https://jakarta.ee), and [Quarkus](https://quarkus.io).\n\nWe partnered with Red Hat to deliver [Red Hat JBoss Enterprise Application Platform (EAP) on Azure App Service](https://azure.microsoft.com/blog/deploy-apps-seamlessly-with-red-hat-jboss-eap-on-azure-app-service-now-generally-available) - enabling Java developers to deploy their Jakarta EE applications into App Service without requiring a separate Red Hat subscription or license with integrated support from both companies. We also launched similar joint offerings for [JBoss EAP on Azure VMs, on Azure VM Scale Sets, and on Azure RedHat OpenShift (ARO)](../ee/jboss-on-azure.md) - the latter also jointly operated by Microsoft and Red Hat.\n\n## WebLogic Server (Oracle)\n\nWe partnered with Oracle to deliver [Oracle WebLogic Server (WLS) on Azure VMs](/azure/virtual-machines/workloads/oracle/oracle-weblogic?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/breadcrumb/toc.json) and [Oracle WebLogic Server on Azure Kubernetes Service](/azure/virtual-machines/workloads/oracle/weblogic-aks). These solutions facilitate easy migrations to Azure by automating boilerplate operations such as provisioning virtual networks/storage, installing Linux/Java resources, setting up WebLogic Server, and configuring security with a network security group.\n\n## WebSphere/Liberty/Open Liberty (IBM)\n\nWe partnered with IBM, jointly developing solutions for WebSphere Application Server (WAS) on Azure VMs, WebSphere Liberty and Open Liberty on Azure Kubernetes Service, and WebSphere Liberty and Open Liberty on Azure Red Hat OpenShift. For more information, see [What are solutions to run the IBM WebSphere family of products on Azure?](../ee/websphere-family.md) These solutions enable easy migration of WebSphere workloads to Azure, automating most of the resource provisioning tasks needed to set up a highly available WebSphere cluster. The partnership covers a range of use cases - from existing mission-critical workloads to cloud-native applications.\n\n## Apache Kafka on Confluent Cloud (Confluent)\n\nIn the past, Azure customers who wanted to use Confluent's Kafka service had to create and manage resources and users separately in Azure and Confluent Cloud. To ease this pain, Confluent and Microsoft partnered to deliver [Apache Kafka for Confluent Cloud](/azure/partner-solutions/apache-kafka-confluent-cloud/overview), an Azure Marketplace offering that provides Apache Kafka as a fully managed service - including the ability to create and manage Confluent Cloud resources through the Azure portal, Azure CLI, or Azure Management SDKs.\n\nToday, the customer experience is simpler, safer, and more seamless. Customers can provision and manage Confluent Cloud resources along with their Azure resources, as part of a unified workflow - and take advantage of fully managed connectors built for Azure Functions, Azure Blob Storage, Azure Event Hubs, Azure Data Lake Storage Gen2, and Microsoft SQL Server. Developers can continue to code using [Apache Kafka client libraries](https://docs.confluent.io/platform/current/clients/index.html).\n\n## Summary\n\nJoint development with partners for many of these offerings is a continual, ongoing effort. As our partners continue to innovate on their offerings, we're working closely with them to quickly bring those same innovations to Azure - so that customers can deploy and scale their Java applications with confidence and ease.\n\nIn summary, Azure supports your workload with an abundance of choice regardless of what you're doing with Java. You can build any Java app, use any framework, run any application server, and support any application architecture - from monolithic applications running on VMs or in containers to cloud-native, microservices-based applications running on fully managed services. Azure provides tooling to optimize Java runtime configuration for cloud-native deployments, including the Azure Command Launcher for Java (Public Preview) for VM and container scenarios. For more information, see [Public Preview: Azure Command Launcher for Java](https://azure.microsoft.com/updates?id=543994).\n\n:::image type=\"content\" source=\"media/deploy-with-confidence.png\" alt-text=\"Diagram with the heading 'Deploy Java applications with confidence and ease' and logos for the deployment options described in this article.\" border=\"false\" lightbox=\"media/deploy-with-confidence.png\":::\n\n## Next step\n\n[Scale with end-to-end security, monitoring, and automation](scale.md)\n"
  },
  {
    "path": "articles/java/get-started/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Get started with Java on Azure\nsummary: Explains how to bring your existing Java applications to the cloud or how to build new cloud-native applications.\n\nmetadata:\n  title: Get Started With Java on Azure\n  description: Explains how to bring your existing Java applications to the cloud or how to build new cloud-native applications.\n  ms.date: 08/19/2025\n  ms.topic: landing-page\n  author: KarlErickson\n  ms.author: karler\n\nlandingContent:\n  - title: Overview\n    linkLists:\n    - linkListType: overview\n      links:\n      - text: Code, deploy, and scale Java your way\n        url: overview.md\n  - title: Code\n    linkLists:\n    - linkListType: get-started\n      links:\n      - text: Code using the tools you know and love\n        url: code.md\n  - title: Deploy\n    linkLists:\n    - linkListType: get-started\n      links:\n      - text: Deploy apps with confidence and ease\n        url: deploy.md\n  - title: Scale\n    linkLists:\n    - linkListType: get-started\n      links:\n      - text: Scale with end-to-end security, monitoring, and automation\n        url: scale.md\n  - title: Choose\n    linkLists:\n    - linkListType: get-started\n      links:\n      - text: Choose the right services for your apps\n        url: choose.md\n"
  },
  {
    "path": "articles/java/get-started/overview.md",
    "content": "---\ntitle: Code, deploy, and Scale Java your Way\ntitleSuffix: Azure\ndescription: This article provides an overview to a collection of articles that describe the tooling options for coding, deploying, and scaling Java applications with Azure.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: asirveda\nms.topic: concept-article\nms.date: 08/19/2025\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Code, deploy, and scale Java your way\n\nToday, Java developers are looking at how they can bring their existing Java applications to the cloud - or at how to build new cloud-native applications. In doing so, they want to know they can:\n\n- Continue writing code using the Java tools and frameworks they already know and love.\n- Deploy their Java applications using their preferred application servers and open-source software.\n- Scale their Java applications easily and confidently, including necessities such as security, supporting data and messaging services, caching, monitoring, and automation.\n- Choose Azure services based on application needs, considering use case, business goals, security, and budget for a flexible approach.\n\nMicrosoft Azure supports all these needs. As a company, Microsoft is committed to making Java developers as efficient and productive as possible, empowering them to use any tool, framework, and application server on any operating system. In the following articles, we examine how Azure delivers on this commitment, letting Java developers continue working the same way they do today - and continue using the tools and software of their choice - while using the power of managed services in the cloud:\n\n- [Code using the Java tools you know and love](code.md)\n- [Deploy Java applications with confidence and ease](deploy.md)\n- [Scale with end-to-end security, monitoring, and automation](scale.md)\n- [Choose the right Azure services for your Java applications](choose.md)\n\nMoving your Java applications to Azure is simple and intuitive, allowing you to benefit from all the cloud has to offer without having to learn new skills or adopt new tools or frameworks. You can continue using familiar tools like IntelliJ, Eclipse, VS Code, GitHub, Maven, and Gradle, and have more time for coding since you don't have to deploy or manage infrastructure.\n\nYou can also continue using the same Java application servers and other open-source software you already know and trust. These tools aren't proprietary Microsoft implementations. Rather, they're the real thing from trusted names in the open-source ecosystem, like Spring Boot, JBoss EAP, OpenShift, WebLogic, WebSphere, Kafka, Grafana, and Redis.\n\nAzure also provides everything you need to scale your applications with confidence and ease, starting with proven reference architectures that are designed for cost control, scalability, high availability, security, and more. You also have access to state-of-the-art security features, built-in auto-scaling, tools for end-to-end monitoring and automation, and supporting services for data, messaging, and caching. With Azure, you have everything needed to code, deploy, and scale your Java applications in the cloud - and can start benefiting from all it has to offer without having to change how you work.\n\n## Get started with Java on Azure today\n\nIf you'd like to learn more about Java on Azure, here are some curated learning paths:\n\n- [Get started with Java on Azure](/training/paths/get-started-java-azure)\n- [Expand the capabilities for Java apps on Azure](/training/paths/expand-capabilities-java-azure)\n- [Best practices for Java apps on Azure](/training/paths/best-practices-java-azure)\n- [Java at Microsoft](https://developer.microsoft.com/Java)\n\n## Next steps\n\n[Code using the Java tools you know and love](code.md)\n"
  },
  {
    "path": "articles/java/get-started/scale.md",
    "content": "---\ntitle: Scale with End-to-End Security, Monitoring, and Automation\ntitleSuffix: Azure\ndescription: This article provides an overview of some key Azure services and features that you can use to build scalable Java applications.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: asirveda\nms.topic: concept-article\nms.date: 08/19/2025\nms.custom:\n  - devx-track-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Scale with end-to-end security, monitoring, and automation\n\nWhile designing applications, we need to determine how to adapt to changes in workload, recover from unexpected failures, minimize security risks, and so on. While one could start with a trial-and-error approach, that takes time away from other organizational objectives, and could adversely affect our reputation. Azure provides architectural guidance needed to get things right from the start. You also have everything you need to build a scalable application - from state-of-the-art security and auto-scaling to supporting services for data, messaging, caching, performance monitoring, and automation. Many of these supporting services are based on popular open-source software as well - such as PostgreSQL, Redis, JMS, and Kafka - so you don't get locked into proprietary solutions.\n\n:::image type=\"content\" source=\"media/platform-services.png\" alt-text=\"Diagram with the heading 'Platform Services' and the logos for the services described in this article.\" border=\"false\" lightbox=\"media/platform-services.png\":::\n\nNow let's take a look at some key Azure services and features - and how you can put them to use to build scalable Java applications.\n\n## Extend the capabilities for Java applications - databases and messaging\n\nIn addition to providing several options for running your Java code, Azure offers a broad range of fully managed services to support your database needs - including [Azure Database for PostgreSQL](/azure/postgresql), [Azure Database for MySQL](/azure/mysql), [MongoDB Atlas](https://www.mongodb.com/mongodb-on-azure), [Azure Cosmos DB](/azure/cosmos-db), [Azure SQL Database](/azure/azure-sql/database), and [Azure SQL Managed Instance](/azure/azure-sql/managed-instance). The same holds true for messaging, with options that include [Azure Service Bus](/azure/service-bus-messaging), [Azure Event Hubs](/azure/event-hubs), and [Apache Kafka for Confluent Cloud](/azure/partner-solutions/apache-kafka-confluent-cloud/overview).\n\nAzure Service Bus Premium tier supports JMS, the Java Messaging Service programming model. Regardless of whether your applications are running on VMs, in Kubernetes, or on fully managed PaaS services, you can quickly provision and use these fully managed data and messaging services using open-source clients, Azure Java SDKs, Spring starters, and application server integrations. They all provide the compliance, availability, and reliability guarantees that you would expect from Microsoft and Azure. Many Java and Spring developers want to use idiomatic libraries to simplify connections to their preferred cloud services. Microsoft maintains a comprehensive list of [libraries, drivers, and modules](../sdk/libraries-drivers-modules.md) that let you easily interact with Azure services across data, messaging, cache, storage, eventing, directory, and secrets management. For more information, see the [Spring Cloud Azure developer guide](../spring-framework/developer-guide-overview.md).\n\n:::image type=\"content\" source=\"media/spring-cloud-azure.png\" alt-text=\"Diagram that lists the features of Spring Cloud Azure and the associated Azure services.\" border=\"false\" lightbox=\"media/spring-cloud-azure.png\":::\n\n:::image type=\"content\" source=\"media/extend-capabilities.png\" alt-text=\"Diagram that shows the feature categories and associated Azure platform services supported by various Java libraries, drivers, and Spring modules.\" border=\"false\" lightbox=\"media/extend-capabilities.png\":::\n\n## Zero Trust - secure network\n\nYou can secure your Java applications by deploying them in an Azure Virtual Network - the fundamental building block for your own private networks in Azure. Virtual networks enable many types of Azure resources to securely communicate with each other, with the internet, and with your on-premises networks and systems. You can use a virtual network to isolate your applications and supporting backend services from the Internet and place them on your private networks. You can assume full control of ingress and egress for your applications and backend systems.\n\n:::image type=\"content\" source=\"media/azure-container-apps-landing-zone-accelerator.png\" alt-text=\"Diagram of the Azure Container Apps Landing Zone Accelerator.\" border=\"false\" lightbox=\"media/azure-container-apps-landing-zone-accelerator.png\":::\n\n## Zero Trust - secure communications end-to-end\n\nImplementing secure communications as part of a solution architecture can be challenging. Many companies manually rotate their certificates or build their own solutions to automate provisioning and configuration. Even then, there are still data exfiltration risks, such as unauthorized copying or data transfer.\n\nWith Azure, you can secure communications end-to-end or terminate transport-level security at any communication point. You can also automate the provisioning and configuration for all the Azure resources needed for securing communications.\n\nBased on the principle of \"never trust, always verify, and credential-free,\" [Zero Trust](/security/zero-trust) helps to secure all communications by eliminating unknown and unmanaged certificates, and by only trusting certificates that are shared by verifying identity prior to granting access to those certificates. You can use any type of TLS/SSL certificate, including certificates issued by a certificate authority, extended validation certificates, wildcard certificates with support for any number of sub-domains, or self-signed certificates for development and test environments.\n\nJava or Spring Boot apps can securely load certificates from [Azure Key Vault](/azure/key-vault) (discussed next). With Azure Key Vault, you control the storage and distribution of certificates to reduce accidental leakage. Applications and services can securely access certificates using managed identities, role-based access control, and the principle of least privilege. This secure loading is powered using the Azure Key Vault [JCA](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/keyvault/azure-security-keyvault-jca) (Java Cryptography Architecture) Provider.\n\n:::image type=\"content\" source=\"media/secure-communications.png\" alt-text=\"Diagram of the architecture for secure end-to-end communications for Spring Boot apps.\" border=\"false\" lightbox=\"media/secure-communications.png\":::\n\n## Zero Trust - manage secrets\n\nMany Java applications connect to supporting services using URLs and credentials - information that, if exposed, could be used to gain unauthorized access to sensitive data. Embedding such information in an app itself presents a huge security risk for many reasons, including discovery via a code repository. Many developers externalize such credentials using environment variables, so that multiple applications can load them, but this only shifts the risk from the code itself to the execution environment.\n\n:::image type=\"content\" source=\"media/zero-trust.png\" alt-text=\"Diagram with the heading 'Zero Trust - manage secrets using Azure Key Vault' and including a summary of the features described in this section.\" border=\"false\" lightbox=\"media/zero-trust.png\":::\n\n[Azure Key Vault](/azure/key-vault) provides a better, safer, and more secure way to safeguard secrets. It gives you full control over the storage and distribution of application secrets, using Role Based Access Control (RBAC) and the principle of least privilege to limit access. You keep control over your application secrets - just grant permission for your applications to use them as needed. Upon application startup, prior to granting access to secrets, the application authenticates with Microsoft Entra ID and Azure Key Vault authorizes using Azure RBAC. Azure Key Vault includes full audit capabilities and has two service tiers: Standard, which encrypts with a software key, and a Premium tier, which includes hardware security module (HSM)-protected keys.\n\n## End-user authentication and authorization\n\nMost enterprise Java applications require user authentication and authorization, which you can implement using [Microsoft Entra ID](/entra/identity) - a complete identity and access management solution with integrated security. End-user accounts can be organizational identities or social identities from Facebook, Twitter, or Gmail using Microsoft Entra ID and Azure Active Directory B2C. You can implement Microsoft Entra ID based solutions using the [Microsoft Authentication Library for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java) or [Spring Boot Starter for Microsoft Entra](../spring-framework/spring-boot-starter-for-entra-developer-guide.md). You can also use any identity provider of your choice - such as ForgeRock, Auth0, Ping, or Okta.\n\n## Monitor end-to-end\n\nWith Azure, you can monitor your Java applications end-to-end, using any tool and platform. Alternately, you can implement fully managed, native monitoring - including application performance monitoring (APM) - by using [Application Insights](/azure/azure-monitor/app/app-insights-overview), a feature of [Azure Monitor](/azure/azure-monitor). It provides strong support for Java, Spring, and frameworks like Micrometer and Spring Boot, enabling you to quickly identify and troubleshoot issues. Features include live metrics streaming, request rate and response time tracking, event tracing, and external dependency rates - everything you need to monitor the availability, performance, reliability, and usage of your Java applications running on Azure or on-premises.\n\nYou can monitor end-to-end by aggregating logs and metrics in [Log Analytics](/azure/azure-monitor/logs/log-analytics-tutorial), a tool in the Azure portal, which can be used to edit and run queries on logs and metrics data in Azure Monitor. You can write a query that returns a set of records and then use Log Analytics to sort, filter, and analyze them. Or you can write a more advanced query to perform statistical analysis and visualize the results in a chart, as might be needed to identify a particular trend. Whether you work with the results of your queries interactively or use them with other Azure Monitor features such as log query alerts or workbooks, Log Analytics is a good tool to use for writing and testing your queries.\n\nThat said, we realize that customers who are bringing their Java applications to Azure might want to continue using the same APM tools they're using to monitor their on-premises applications. To support this usage, we partnered with New Relic, AppDynamics, Dynatrace, and Elastic to integrate their monitoring solutions with Azure App Service and Azure Container Apps. Monitoring agents run side-by-side with your code, and we install and keep the agents updated for you. When you deploy to Azure Container Apps, Azure Kubernetes Service, or Virtual Machines, you can run any of these agents (including New Relic, AppDynamics, Dynatrace, Elastic and Datadog) alongside your applications, but you need to install and manage them on your own. Likewise, you can monitor end-to-end by aggregating logs and metrics in Elastic and Splunk.\n\n:::image type=\"content\" source=\"media/monitor-end-to-end.png\" alt-text=\"Diagram with heading 'Monitor end-to-end using any tool and platform', an example screenshot, and logos for the tools described in this article.\" border=\"false\" lightbox=\"media/monitor-end-to-end.png\":::\n\nWe also realize that many customers want to continue using Grafana to query, visualize, alert on, and understand their metrics. For this reason, we partnered with Grafana Labs to deliver [Azure Managed Grafana](/azure/managed-grafana), a fully managed service that lets customers run Grafana natively on Azure. The service makes it easy to deploy secure and scalable Grafana instances and connect them to open-source, cloud, and third-party data sources for visualization and analysis. The service is optimized for Azure-native data sources like Azure Monitor and Azure Data Explorer, and it includes application performance monitoring (APM) integrations with Azure compute services like Azure App Service, Azure Container Apps, Azure Kubernetes Service, Splunk, Datadog, and Azure Virtual Machines.\n\n## Accelerate Java applications using caching\n\nAs the workloads for your Java applications grow, you can increase performance by using [Azure Cache for Redis](/azure/azure-cache-for-redis) to implement an in-memory caching layer for query results, session states, and static content. It's a great way to improve application throughput and reduce latency without having to rearchitect your underlying database. Azure Cache for Redis Enterprise tiers, developed in partnership with Redis and fully managed by Microsoft, is the most highly available and scalable deployment option for running Redis on Azure - including features such as active geo-replication, externalized session management, and high-speed search and indexing.\n\n:::image type=\"content\" source=\"media/accelerate-scale.png\" alt-text=\"Diagram with the heading 'Accelerate and Scale Java apps with Redis Cache' and including a summary of the features described in this section.\" border=\"false\" lightbox=\"media/accelerate-scale.png\":::\n\n## Automatic scaling\n\nAll Azure compute services for running Java applications support automatic scaling (auto-scaling), which can help you maximize cost-efficiency and adapt to changing workloads without paying for more capacity than you need. Once enabled, you can rest assured that auto-scale takes care of your underlying infrastructure and your application workloads.\n\n:::image type=\"content\" source=\"media/drive-higher-utilization.png\" alt-text=\"Diagram with the heading 'Drive higher utilization of apps with Autoscale' and including a summary of the features described in this section.\" border=\"false\" lightbox=\"media/drive-higher-utilization.png\":::\n\nYou can automatically scale in or out based on load or schedule. In load-based (or metric-based) mode, your applications are horizontally scaled out to the resources needed to handle the load, up to the limits that you set. Similarly, when load decreases, resources are horizontally scaled-in, never falling below the minimums that you set.\n\nIn schedule-based mode, your applications are scaled-in and scaled-out based on a defined schedule and limits. Schedule-based mode is useful for workloads that follow a predictable pattern and can be used to establish a baseline for more load-based scaling.\n\n## Automation from idea to production\n\nAs you move your applications to the cloud, you want to automate everything - as needed for Java development at enterprise scale. You need to consider auto-scaling to address application workloads, as covered previously. But you also need to scale and automate your cloud environment as a whole - ideally from idea to production - including how to rapidly provision of new environments for test, QA, production, blue/green deployments, geographic expansion, and so on.\n\n:::image type=\"content\" source=\"media/automate-idea-production.png\" alt-text=\"Diagram that shows boxes for Provision, Build, and Deploy categories with associated logos for the tools described in this section.\" border=\"false\" lightbox=\"media/automate-idea-production.png\":::\n\nAzure lets you automate from idea to production using a broad range of tools and platforms. At a high level, such automation pipelines can be broken down into three categories:\n\n- Provisioning pipelines - You can provision Azure resources using Terraform, Azure Resource Manager (ARM) templates, Bicep templates, or the Azure CLI, as needed to create repeatable scripts for consistently spinning-up and spinning-down environments.\n\n- Build pipelines - Based on tools such as Maven or Gradle, as discussed earlier in this documentation.\n\n- Deployment pipelines - You can use GitHub Actions, Azure Pipelines, Jenkins Pipelines, GitLab Pipelines, or the Azure CLI to automate code deployments, including blue/green deployments that keep critical systems in production as you deploy code updates.\n\n## Continue to use existing practices and systems\n\nAs you migrate or build and then scale your Java applications on Azure, you can use your existing investments in networking, monitoring, automation, identity providers, on-premises systems, development and build tool, and app libraries. The following table provides some examples:\n\n| Category           | Java ecosystem products and services                                                                                                                                       |\n|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Networking         | F5, Palo Alto, Cloudflare, Checkpoint, Infoblox                                                                                                                            |\n| Monitoring         | New Relic, Dynatrace, AppDynamics, Elastic, Splunk                                                                                                                         |\n| Automation         | GitHub Actions, Azure Pipelines, Jenkins, GitLab                                                                                                                           |\n| Identity providers | Microsoft Entra ID, ForgeRock, Auth0, Ping, Okta                                                                                                                           |\n| On-premises system | Databases (such as Oracle DB or IBM DB2), messaging (such as IBM MQ or TIBCO EMS), eventing (such as Kafka), directories (such as Microsoft Entra ID, OpenLDAP, or IBM ID) |\n| Development tools  | IntelliJ, Visual Studio Code, Eclipse, Spring Tool Suite, Maven, Gradle                                                                                                    |\n\n## Reference architectures\n\nThe [Azure Architecture Center](/azure/architecture) provides guidance for building solutions on Azure using established patterns and practices, including how to put these capabilities to use. These reference architectures are based on what we learned from customer engagements, taking into consideration cost optimization, operational excellence, performance efficiency, reliability, scalability, security, monitoring, smoke-testing, and more. They also address solution design components such as Azure landing zones - environments for hosting your workloads that are pre-provisioned through infrastructure-as-code, as needed to enable Java application migrations and greenfield development at enterprise scale.\n\nFor example, here's a [landing zone accelerator for Azure Container Apps](/azure/cloud-adoption-framework/scenarios/app-platform/container-apps/landing-zone-accelerator), showing how to implement a hub-and-spoke design in which Azure Container Apps is deployed in a single spoke that's dependent on shared services hosted in the hub. This project is built with components to achieve the tenets in the [Microsoft Azure Well-Architected Framework](/azure/well-architected). To explore an implementation of this architecture, see the [Azure Container Apps Landing Zone Accelerator](https://github.com/Azure/ACA-Landing-Zone-Accelerator) repository on GitHub. You can apply the same approach to any Java applications deployed to any Azure compute destination - such as Azure App Service or Azure Kubernetes Service. In addition, if you're looking at migrating existing Java applications to Azure, we have a comprehensive set of migration guides and recommended strategies.\n\n:::image type=\"content\" source=\"media/scale-end-to-end.png\" alt-text=\"Diagram with the heading 'Scale with end-to-end security, monitoring and automation' and logos for the tools described in this article.\" border=\"false\" lightbox=\"media/scale-end-to-end.png\":::\n\n## Next step\n\n[Choose the right Azure services for your Java applications](choose.md)\n"
  },
  {
    "path": "articles/java/get-started/toc.yml",
    "content": "items:\n- name: Get started with Java on Azure\n  href: index.yml\n  items:\n  - name: Overview\n    href: overview.md\n  - name: Code using the Java tools you know and love\n    href: code.md\n  - name: Deploy Java applications with confidence and ease\n    href: deploy.md\n  - name: Scale with security, monitoring, and automation\n    href: scale.md\n  - name: Choose the right services for your applications\n    href: choose.md\n"
  },
  {
    "path": "articles/java/identity/deploy-jboss-to-app-service.md",
    "content": "---\ntitle: Deploy Java JBoss EAP apps to Azure App Service\ndescription: Shows you how to deploy a JBoss EAP app with sign-in by Microsoft Entra account to Azure App Service.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: install-set-up-deploy\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java, devx-track-azurecli\n---\n\n# Deploy Java JBoss EAP apps to Azure App Service\n\nThis article shows you how to deploy a JBoss EAP app with sign-in by Microsoft Entra account to Azure App Service.\n\nThis article assumes that you completed one of the following articles using only the **Run locally** tab, and you now want to deploy to Azure. These instructions are the same as the ones in the **Deploy to Azure** tab in these articles:\n\n- [Enable sign-in for Java JBoss EAP apps using Microsoft Entra ID](enable-java-jboss-eap-webapp-authentication-entra-id.md)\n- [Enable sign-in for Java JBoss EAP apps using MSAL4J with Azure Active Directory B2C](enable-java-jboss-eap-webapp-authentication-azure-ad-b2c.md)\n- [Enable Java JBoss EAP apps to sign in users and access Microsoft Graph](enable-java-jboss-eap-webapp-authorization-entra-id.md)\n- [Secure Java JBoss EAP apps using roles and role claims](enable-java-jboss-eap-webapp-authorization-role-entra-id.md)\n- [Secure Java JBoss EAP apps using groups and group claims](enable-java-jboss-eap-webapp-authorization-group-entra-id.md)\n\n## Prerequisites\n\n[!INCLUDE [deploy-app-service-intro.md](includes/deploy-app-service-intro.md)]\n\n- [Azure CLI](/cli/azure/install-azure-cli)\n\n## Configure the Maven plugin\n\n[!INCLUDE [deploy-jboss-app-service-configure-maven.md](includes/deploy-jboss-app-service-configure-maven.md)]\n\n## Prepare the app for deployment\n\n[!INCLUDE [deploy-app-service-prepare-deploy.md](includes/deploy-app-service-prepare-deploy.md)]\n\n## Update your Microsoft Entra ID app registration\n\n[!INCLUDE [deploy-app-service-update-registration.md](includes/deploy-app-service-update-registration.md)]\n\n## Deploy the app\n\n[!INCLUDE [deploy-app-service-deploy.md](includes/deploy-app-service-deploy.md)]\n\n## Remove secret values\n\n[!INCLUDE [deploy-app-service-remove-secret.md](includes/deploy-app-service-remove-secret.md)]\n\n## More information\n\n- [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [Microsoft identity platform](/entra/identity-platform/)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n"
  },
  {
    "path": "articles/java/identity/deploy-spring-boot-to-azure-container-apps.md",
    "content": "---\ntitle: Deploy Java Spring Boot apps to Azure Container Apps\ndescription: Shows you how to deploy a Java Spring Boot app with sign-in by Microsoft Entra account to Azure Container Apps.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\nms.topic: install-set-up-deploy\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Deploy Java Spring Boot apps to Azure Container Apps\n\nThis article shows you how to deploy a Java Spring Boot app with sign-in by Microsoft Entra account to Azure Container Apps.\n\nThis article assumes that you completed one of the following articles using only the **Run locally** tab, and you now want to deploy to Azure. These instructions are the same as the ones in the **Deploy to Azure** tab in these articles:\n\n- [Secure Java Spring Boot apps using Microsoft Entra ID](enable-spring-boot-webapp-authentication-entra-id.md)\n- [Secure Java Spring Boot apps using Azure Active Directory B2C](enable-spring-boot-webapp-authentication-azure-ad-b2c.md)\n- [Enable Java Spring Boot apps to sign in users and access Microsoft Graph](enable-spring-boot-webapp-authorization-entra-id.md)\n- [Secure Java Spring Boot apps using roles and role claims   ](enable-spring-boot-webapp-authorization-role-entra-id.md)\n- [Secure Java Spring Boot apps using groups and group claims](enable-spring-boot-webapp-authorization-group-entra-id.md)\n\n## Prerequisites\n\n[!INCLUDE [deploy-container-apps-intro](includes/deploy-container-apps-intro.md)]\n\n## Prepare the Spring project\n\n[!INCLUDE [deploy-container-apps-prepare.md](includes/deploy-container-apps-prepare.md)]\n\n## Setup\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-cli-setup.md)]\n\n## Create the Azure Container Apps environment\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-create-env-variables.md)]\n\n## Prepare the app for deployment\n\n[!INCLUDE [deploy-container-apps-prepare-deploy.md](includes/deploy-container-apps-prepare-deploy.md)]\n\n[!INCLUDE [deploy-container-apps-secret-note.md](includes/deploy-container-apps-secret-note.md)]\n\n## Update your Microsoft Entra ID app registration\n\n[!INCLUDE [deploy-container-apps-update-registration.md](includes/deploy-container-apps-update-registration.md)]\n\n## Deploy the app\n\n[!INCLUDE [deploy-container-apps-deploy.md](includes/deploy-container-apps-deploy.md)]\n\n## Validate the app\n\n[!INCLUDE [deploy-container-apps-validate.md](includes/deploy-container-apps-validate.md)]\n\n## More information\n\n- [Microsoft identity platform (Microsoft Entra ID for developers)](/entra/identity-platform/)\n- [Overview of Microsoft Authentication Library (MSAL)](/entra/identity-platform/msal-overview)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Quickstart: Configure a client application to access web APIs](/entra/identity-platform/quickstart-configure-app-access-web-apis)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [Application and service principal objects in Microsoft Entra ID](/entra/identity-platform/app-objects-and-service-principals)\n- [National Clouds](/entra/identity-platform/authentication-national-cloud#app-registration-endpoints)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n- [Microsoft Entra ID Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory)\n- [Microsoft Authentication Library for Java (MSAL4J)](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [MSAL4J Wiki](https://github.com/AzureAD/microsoft-authentication-library-for-java/wiki)\n- [ID tokens](/entra/identity-platform/id-tokens)\n- [Access tokens in the Microsoft identity platform](/entra/identity-platform/access-tokens)\n\n## Next steps\n\nFor more information and other deployment options, see the following articles:\n\n- [Quickstart: Deploy your first application to Azure Container Apps](/azure/container-apps/java-get-started?pivots=jar)\n- [Quickstart: Build and deploy from local source code to Azure Container Apps](/azure/container-apps/quickstart-code-to-cloud?tabs=bash%2Ccsharp&pivots=without-dockerfile)\n"
  },
  {
    "path": "articles/java/identity/deploy-tomcat-to-app-service.md",
    "content": "---\ntitle: Deploy Java Tomcat apps to Azure App Service\ndescription: Shows you how to deploy a Tomcat app with sign-in by Microsoft Entra account to Azure App Service.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: install-set-up-deploy\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java, devx-track-azurecli\n---\n\n# Deploy Java Tomcat apps to Azure App Service\n\nThis article shows you how to deploy a Tomcat app with sign-in by Microsoft Entra account to Azure App Service.\n\nThis article assumes that you completed one of the following articles using only the **Run locally** tab, and you now want to deploy to Azure. These instructions are the same as the ones in the **Deploy to Azure** tab in these articles:\n\n- [Enable sign-in for Java Tomcat apps using Microsoft Entra ID](enable-java-tomcat-webapp-authentication-entra-id.md)\n- [Enable sign-in for Java Tomcat apps using MSAL4J with Azure Active Directory B2C](enable-java-tomcat-webapp-authentication-azure-ad-b2c.md)\n- [Enable Java Tomcat apps to sign in users and access Microsoft Graph](enable-java-tomcat-webapp-authorization-entra-id.md)\n- [Secure Java Tomcat apps using roles and role claims](enable-java-tomcat-webapp-authorization-role-entra-id.md)\n- [Secure Java Tomcat apps using groups and group claims](enable-java-tomcat-webapp-authorization-group-entra-id.md)\n\n## Prerequisites\n\n[!INCLUDE [deploy-app-service-intro.md](includes/deploy-app-service-intro.md)]\n\n- [Azure CLI](/cli/azure/install-azure-cli)\n\n## Configure the Maven plugin\n\n[!INCLUDE [deploy-tomcat-app-service-configure-maven.md](includes/deploy-tomcat-app-service-configure-maven.md)]\n\n## Prepare the app for deployment\n\n[!INCLUDE [deploy-app-service-prepare-deploy.md](includes/deploy-app-service-prepare-deploy.md)]\n\n## Update your Microsoft Entra ID app registration\n\n[!INCLUDE [deploy-app-service-update-registration.md](includes/deploy-app-service-update-registration.md)]\n\n## Deploy the app\n\n[!INCLUDE [deploy-app-service-deploy.md](includes/deploy-app-service-deploy.md)]\n\n## Remove secret values\n\n[!INCLUDE [deploy-app-service-remove-secret.md](includes/deploy-app-service-remove-secret.md)]\n\n## More information\n\n- [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [Microsoft identity platform (Microsoft Entra ID for developers)](/entra/identity-platform/)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n"
  },
  {
    "path": "articles/java/identity/deploy-weblogic-to-vm.md",
    "content": "---\ntitle: Deploy Java WebLogic to WebLogic on Azure Virtual Machines\ndescription: Shows you how to deploy a Java WebLogic web app with sign-in by Microsoft Entra account to WebLogic on Azure Virtual Machines.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: install-set-up-deploy\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Deploy Java WebLogic apps to WebLogic on Azure Virtual Machines\n\nThis article shows you how to deploy a Java WebLogic web app with sign-in by Microsoft Entra account to WebLogic on Azure Virtual Machines.\n\n## Prerequisites\n\n- Completion of one of the following articles for enabling security with Microsoft Entra ID:\n  - [Enable sign-in for Java WebLogic apps using Microsoft Entra ID](enable-java-weblogic-webapp-authentication-entra-id.md)\n  - [Enable sign-in for Java WebLogic apps using MSAL4J with Azure Active Directory B2C](enable-java-weblogic-webapp-authentication-azure-ad-b2c.md)\n  - [Enable Java WebLogic apps to sign in users and access Microsoft Graph](enable-java-weblogic-webapp-authorization-entra-id.md)\n  - [Secure Java WebLogic apps using roles and role claims](enable-java-weblogic-webapp-authorization-role-entra-id.md)\n  - [Secure Java WebLogic apps using groups and group claims](enable-java-weblogic-webapp-authorization-group-entra-id.md)\n- A deployed [Oracle WebLogic Server](https://www.oracle.com/java/weblogic/). For more information, see [Deploy WebLogic Server on Azure Virtual Machine using the Azure portal](/azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine).\n\n## Prepare the app for deployment\n\nWhen you deploy your application to Oracle WebLogic Server, your redirect URL changes to the redirect URL of the app on the Oracle WebLogic Server instance. Use the following steps to change these settings in your properties file:\n\n1. Navigate to your app's **authentication.properties** file and change the value of `app.homePage` to your deployed app's domain name, as shown in the following example. This domain name has the form `http://<vm-host-name>:<port>/<your-app-path>`. You can get the host name and port from **adminConsoleURL** by removing `/console/`. If you're using the recommended sample app, the URL should be `http://<vm-host-name>:<port>/testwebapp/`, which should be similar to `http://wls-5b942e9f2a-admindomain.westus.cloudapp.azure.com:7001/testwebapp/`.\n\n   ```ini\n   # app.homePage is by default set to dev server address and app context path on the server\n   # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net\n   app.homePage=http://<vm-host-name>:<port>/<your-app-path>\n   ```\n\n1. After saving this file, use the following command to rebuild your app:\n\n   ```bash\n   mvn clean package\n   ```\n\n1. After rebuilding the app, follow the steps of [Deploy a Java EE application from Administration Console portal](/azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine#deploy-a-java-ee-application-from-administration-console-portal) to redeploy the application with your current **.war** file.\n\n## Update your Microsoft Entra ID app registration\n\nBecause the redirect URI changes to your deployed app on Oracle WebLogic Server, you also need to change the redirect URI in your Microsoft Entra ID app registration. Use the following steps to make this change:\n\n1. Navigate to the Microsoft identity platform for developers [App registrations](https://go.microsoft.com/fwlink/?linkid=2083908) page.\n\n1. Use the search box to search for your app registration - for example, `java-servlet-webapp-authentication`.\n\n1. Open your app registration by selecting its name.\n\n1. Select **Authentication** from the menu.\n\n1. In the **Web** - **Redirect URIs** section, select **Add URI**.\n\n1. Fill out the URI of your web app, appending `/auth/redirect` - for example, `http://wls-5b942e9f2a-admindomain.westus.cloudapp.azure.com:7001/testwebapp/auth/redirect`.\n\n1. Select **Save**.\n\nYour deployment is now complete.\n\n## More information\n\n- [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [Microsoft identity platform (Microsoft Entra ID for developers)](/entra/identity-platform/)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n"
  },
  {
    "path": "articles/java/identity/deploy-websphere-to-vm.md",
    "content": "---\ntitle: Deploy WebSphere to Traditional WebSphere on Azure VMs\ndescription: Shows you how to deploy a Java WebSphere web app with sign-in by Microsoft Entra account to Traditional WebSphere on Azure Virtual Machines.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: install-set-up-deploy\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Deploy Java WebSphere apps to Traditional WebSphere on Azure Virtual Machines\n\nThis article shows you how to deploy a Java WebSphere web app with sign-in by Microsoft Entra account to Traditional WebSphere on Azure Virtual Machines.\n\n## Prerequisites\n\n- Completion of one of the following articles for enabling security with Microsoft Entra ID:\n  - [Enable sign-in for Java WebSphere apps using Microsoft Entra ID](enable-java-websphere-webapp-authentication-entra-id.md)\n  - [Enable sign-in for Java WebSphere apps using MSAL4J with Azure Active Directory B2C](enable-java-websphere-webapp-authentication-azure-ad-b2c.md)\n  - [Enable Java WebSphere apps to sign in users and access Microsoft Graph](enable-java-websphere-webapp-authorization-entra-id.md)\n  - [Secure Java WebSphere apps using app roles and role claims](enable-java-websphere-webapp-authorization-role-entra-id.md)\n  - [Secure Java WebSphere apps using groups and group claims](enable-java-websphere-webapp-authorization-group-entra-id.md)\n- A deployed [IBM WebSphere Application Server Cluster](https://aka.ms/websphere-on-azure-portal). For more information, see [Deploy WebSphere Application Server (traditional) Cluster on Azure Virtual Machines](../ee/traditional-websphere-application-server-virtual-machines.md).\n\n## Prepare the app for deployment\n\nWhen you deploy your application to WebSphere Application Server, your redirect URL changes to the redirect URL of your deployed WebSphere Application Server instance. Use the following steps to change these settings in your properties file:\n\n1. Navigate to your app's **authentication.properties** file and change the value of `app.homePage` to your server URL and port number you're planning to use, as shown in the following example:\n\n   ```ini\n   # app.homePage is by default set to dev server address and app context path on the server\n   # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net\n   app.homePage=https://<server-url>:<port-number>/msal4j-servlet-auth/\n   ```\n\n1. After saving this file, use the following command to rebuild your app:\n\n   ```bash\n   mvn clean package\n   ```\n\n1. After the code finishes building, copy the **.war** file over to your target server's file system.\n\n## Update your Microsoft Entra ID app registration\n\nBecause the redirect URI changes to your deployed app on WebSphere, you also need to change the redirect URI in your Microsoft Entra ID app registration. Use the following steps to make this change:\n\n1. Navigate to the Microsoft identity platform for developers [App registrations](https://go.microsoft.com/fwlink/?linkid=2083908) page.\n\n1. Use the search box to search for your app registration - for example, `java-servlet-webapp-authentication`.\n\n1. Open your app registration by selecting its name.\n\n1. Select **Authentication** from the menu.\n\n1. In the **Web** - **Redirect URIs** section, select **Add URI**.\n\n1. Fill out the URI of your web app, appending `/auth/redirect` - for example, `https://<server-url>:<port-number>/auth/redirect`.\n\n1. Select **Save**.\n\n## Deploy the application\n\nTo deploy the application, use the following steps:\n\n1. On the **Applications** tab, select **New Application**, then **New Enterprise Application**.\n\n1. Choose the **.war** file you built, then select **Next** until you get to the **Map context roots for Web modules** installation step.\n\n1. For the context root, set it to the same value as after the port number in the 'Redirect URI' you set in sample configuration/Azure app registration. That is, if the redirect URI is `http://<server-url>:9080/msal4j-servlet-auth/`, then the context root should just be `msal4j-servlet-auth`.\n\n1. Select **Finish**.\n\n1. After the application finishes installing, go to the **WebSphere enterprise applications** section of the **Applications** tab.\n\n1. Select the **.war** file you installed from the list of applications and then select **Start** to deploy.\n\n1. After it finishes deploying, navigate to `http://<server-url>:9080/{whatever you set as the context root}` and you should be able to see the application.\n\nYour deployment is now complete.\n\n## More information\n\n- [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [MSAL Java Reference Documentation](https://javadoc.io/doc/com.microsoft.azure/msal4j)\n- [Microsoft identity platform (Microsoft Entra ID for developers)](/entra/identity-platform/)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n\n## Next steps\n\nFor other deployment options, see the following articles:\n\n- [Deploy WebSphere Application Server (traditional) Cluster on Azure Virtual Machines](../ee/traditional-websphere-application-server-virtual-machines.md)\n- [What are solutions to run the IBM WebSphere family of products on Azure?](../ee/websphere-family.md)\n"
  },
  {
    "path": "articles/java/identity/enable-java-jboss-eap-webapp-authentication-azure-ad-b2c.md",
    "content": "---\ntitle: Enable sign-in for Java JBoss EAP apps using MSAL4J\ntitleSuffix: Azure Active Directory B2C\ndescription: Shows you how to develop a Java JBoss EAP app that supports sign-in by Azure Active Directory B2C.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable sign-in for Java JBoss EAP apps using MSAL4J with Azure Active Directory B2C\n\nThis article demonstrates a Java JBoss EAP application that authenticates users against Azure Active Directory B2C (Azure AD B2C) using the [Microsoft Authentication Library for Java (MSAL4J)](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-sign-in-azure-ad-b2c.md](includes/scenario-sign-in-azure-ad-b2c.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-sign-in-azure-ad-b2c.md](includes/prerequisites-sign-in-azure-ad-b2c.md)]\n\n[!INCLUDE [prerequisites-jboss.md](includes/prerequisites-jboss.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-azure-ad-b2c.md](includes/enable-java-servlet-webapp-authentication-azure-ad-b2c.md)]\n\n[!INCLUDE [deploy-jboss-app-service.md](includes/deploy-jboss-app-service.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-azure-ad-b2c-explore.md](includes/enable-java-servlet-webapp-authentication-azure-ad-b2c-explore.md)]\n"
  },
  {
    "path": "articles/java/identity/enable-java-jboss-eap-webapp-authentication-entra-id.md",
    "content": "---\ntitle: Enable sign-in for JBoss EAP apps using Microsoft Entra ID\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java JBoss EAP app that supports sign-in using a Microsoft Entra account.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable sign-in for Java JBoss EAP apps using Microsoft Entra ID\n\nThis article demonstrates a Java JBoss EAP app that signs in users to your Microsoft Entra ID tenant using the [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-sign-in-entra.md](includes/scenario-sign-in-entra.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-sign-in-entra.md](includes/prerequisites-sign-in-entra.md)]\n\n[!INCLUDE [prerequisites-jboss.md](includes/prerequisites-jboss.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-entra-id.md](includes/enable-java-servlet-webapp-authentication-entra-id.md)]\n\n[!INCLUDE [deploy-jboss-app-service.md](includes/deploy-jboss-app-service.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-entra-id-explore.md](includes/enable-java-servlet-webapp-authentication-entra-id-explore.md)]\n"
  },
  {
    "path": "articles/java/identity/enable-java-jboss-eap-webapp-authorization-entra-id.md",
    "content": "---\ntitle: Enable JBoss EAP app sign-in and access to Microsoft Graph\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java JBoss EAP app to sign in users and call Microsoft Graph with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable Java JBoss EAP apps to sign in users and access Microsoft Graph\n\nThis article demonstrates a Java JBoss EAP app that signs in users and obtains an access token for calling [Microsoft Graph](/graph/overview). It uses the [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-authorization-graph.md](includes/scenario-authorization-graph.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-graph.md](includes/prerequisites-authorization-graph.md)]\n\n[!INCLUDE [prerequisites-jboss.md](includes/prerequisites-jboss.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-entra-id.md](includes/enable-java-servlet-webapp-authorization-entra-id.md)]\n\n[!INCLUDE [deploy-jboss-app-service.md](includes/deploy-jboss-app-service.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-entra-id-explore.md)]\n"
  },
  {
    "path": "articles/java/identity/enable-java-jboss-eap-webapp-authorization-group-entra-id.md",
    "content": "---\ntitle: Secure Java JBoss EAP apps using groups and group claims\ntitleSuffix: Azure\ndescription: Shows how to enable sign-in for Java JBoss EAP apps and restrict access to pages using security groups and group claims with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java JBoss EAP apps using groups and group claims\n\nThis article shows you how to create a Java JBoss EAP app that signs in users with [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java). The app also restricts access to pages based on Microsoft Entra ID security group membership.\n\n[!INCLUDE [scenario-authorization-groups.md](includes/scenario-authorization-groups.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-groups.md](includes/prerequisites-authorization-groups.md)]\n\n[!INCLUDE [prerequisites-jboss.md](includes/prerequisites-jboss.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-group-entra-id.md](includes/enable-java-servlet-webapp-authorization-group-entra-id.md)]\n\n[!INCLUDE [deploy-jboss-app-service.md](includes/deploy-jboss-app-service.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-group-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-group-entra-id-explore.md)]\n"
  },
  {
    "path": "articles/java/identity/enable-java-jboss-eap-webapp-authorization-role-entra-id.md",
    "content": "---\ntitle: Secure Java JBoss EAP apps using roles and role claims\ntitleSuffix: Azure\ndescription: Shows you how to add authorization using app roles and role claims to Java JBoss EAP app that signs in users with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java JBoss EAP apps using roles and role claims\n\nThis article demonstrates a Java JBoss EAP app that uses [OpenID Connect](/entra/identity-platform/v2-protocols-oidc) to sign in users and [Microsoft Entra ID Application Roles (app roles)](/entra/identity-platform/howto-add-app-roles-in-apps) for authorization.\n\n[!INCLUDE [scenario-authorization-roles.md](includes/scenario-authorization-roles.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-roles.md](includes/prerequisites-authorization-roles.md)]\n\n[!INCLUDE [prerequisites-jboss.md](includes/prerequisites-jboss.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-role-entra-id.md](includes/enable-java-servlet-webapp-authorization-role-entra-id.md)]\n\n[!INCLUDE [deploy-jboss-app-service.md](includes/deploy-jboss-app-service.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-role-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-role-entra-id-explore.md)]\n"
  },
  {
    "path": "articles/java/identity/enable-java-tomcat-webapp-authentication-azure-ad-b2c.md",
    "content": "---\ntitle: Enable sign-in for Java Tomcat apps using MSAL4J\ntitleSuffix: Azure Active Directory B2C\ndescription: Shows you how to develop a Java Tomcat app that supports sign-in using Azure Active Directory B2C.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable sign-in for Java Tomcat apps using MSAL4J with Azure Active Directory B2C\n\nThis article demonstrates a Java Tomcat application that authenticates users against Azure Active Directory B2C (Azure AD B2C) using the [Microsoft Authentication Library for Java (MSAL4J)](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-sign-in-azure-ad-b2c.md](includes/scenario-sign-in-azure-ad-b2c.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-sign-in-azure-ad-b2c.md](includes/prerequisites-sign-in-azure-ad-b2c.md)]\n\n[!INCLUDE [prerequisites-tomcat.md](includes/prerequisites-tomcat.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-azure-ad-b2c.md](includes/enable-java-servlet-webapp-authentication-azure-ad-b2c.md)]\n\n[!INCLUDE [deploy-tomcat-app-service.md](includes/deploy-tomcat-app-service.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-azure-ad-b2c-explore.md](includes/enable-java-servlet-webapp-authentication-azure-ad-b2c-explore.md)]\n"
  },
  {
    "path": "articles/java/identity/enable-java-tomcat-webapp-authentication-entra-id.md",
    "content": "---\ntitle: Enable sign-in for Tomcat apps using Microsoft Entra ID\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java Tomcat app that supports sign-in using a Microsoft Entra account.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable sign-in for Java Tomcat apps using Microsoft Entra ID\n\nThis article demonstrates a Java Tomcat app that signs in users to your Microsoft Entra ID tenant using the [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-sign-in-entra.md](includes/scenario-sign-in-entra.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-sign-in-entra.md](includes/prerequisites-sign-in-entra.md)]\n\n[!INCLUDE [prerequisites-tomcat.md](includes/prerequisites-tomcat.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-entra-id.md](includes/enable-java-servlet-webapp-authentication-entra-id.md)]\n\n[!INCLUDE [deploy-tomcat-app-service.md](includes/deploy-tomcat-app-service.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-entra-id-explore.md](includes/enable-java-servlet-webapp-authentication-entra-id-explore.md)]\n"
  },
  {
    "path": "articles/java/identity/enable-java-tomcat-webapp-authorization-entra-id.md",
    "content": "---\ntitle: Enable Tomcat app sign-in and access to Microsoft Graph\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java Tomcat app to sign in users and call Microsoft Graph with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable Java Tomcat apps to sign in users and access Microsoft Graph\n\nThis article demonstrates a Java Tomcat app that signs in users and obtains an access token for calling [Microsoft Graph](/graph/overview). It uses the [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-authorization-graph.md](includes/scenario-authorization-graph.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-graph.md](includes/prerequisites-authorization-graph.md)]\n\n[!INCLUDE [prerequisites-tomcat.md](includes/prerequisites-tomcat.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-entra-id.md](includes/enable-java-servlet-webapp-authorization-entra-id.md)]\n\n[!INCLUDE [deploy-tomcat-app-service.md](includes/deploy-tomcat-app-service.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-entra-id-explore.md)]\n"
  },
  {
    "path": "articles/java/identity/enable-java-tomcat-webapp-authorization-group-entra-id.md",
    "content": "---\ntitle: Secure Java Tomcat apps using groups and group claims\ntitleSuffix: Azure\ndescription: Shows how to create a Java Tomcat app to sign in users and restrict access to pages using security groups and group claims with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java Tomcat apps using groups and group claims\n\nThis article shows you how to create a Java Tomcat app that signs in users with [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java). The app also restricts access to pages based on Microsoft Entra ID security group membership.\n\n[!INCLUDE [scenario-authorization-groups.md](includes/scenario-authorization-groups.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-groups.md](includes/prerequisites-authorization-groups.md)]\n\n[!INCLUDE [prerequisites-tomcat.md](includes/prerequisites-tomcat.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-group-entra-id.md](includes/enable-java-servlet-webapp-authorization-group-entra-id.md)]\n\n[!INCLUDE [deploy-tomcat-app-service.md](includes/deploy-tomcat-app-service.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-group-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-group-entra-id-explore.md)]\n"
  },
  {
    "path": "articles/java/identity/enable-java-tomcat-webapp-authorization-role-entra-id.md",
    "content": "---\ntitle: Secure Java Tomcat apps using roles and role claims\ntitleSuffix: Azure\ndescription: Shows you how to add authorization using app roles and role claims to Java Tomcat app that signs in users with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java Tomcat apps using roles and role claims\n\nThis article demonstrates a Java Tomcat app that uses [OpenID Connect](/entra/identity-platform/v2-protocols-oidc) to sign in users and [Microsoft Entra ID Application Roles (app roles)](/entra/identity-platform/howto-add-app-roles-in-apps) for authorization.\n\n[!INCLUDE [scenario-authorization-roles.md](includes/scenario-authorization-roles.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-roles.md](includes/prerequisites-authorization-roles.md)]\n\n[!INCLUDE [prerequisites-tomcat.md](includes/prerequisites-tomcat.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-role-entra-id.md](includes/enable-java-servlet-webapp-authorization-role-entra-id.md)]\n\n[!INCLUDE [deploy-tomcat-app-service.md](includes/deploy-tomcat-app-service.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-role-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-role-entra-id-explore.md)]\n"
  },
  {
    "path": "articles/java/identity/enable-java-weblogic-webapp-authentication-azure-ad-b2c.md",
    "content": "---\ntitle: Enable sign-in for Java WebLogic apps using MSAL4J\ntitleSuffix: Azure Active Directory B2C\ndescription: Shows you how to develop a Java WebLogic app that supports sign-in by Azure Active Directory B2C.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable sign-in for Java WebLogic apps using MSAL4J with Azure Active Directory B2C\n\nThis article demonstrates a Java Servlet application that authenticates users against Azure Active Directory B2C (Azure AD B2C) using the [Microsoft Authentication Library for Java (MSAL4J)](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-sign-in-azure-ad-b2c.md](includes/scenario-sign-in-azure-ad-b2c.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-sign-in-azure-ad-b2c.md](includes/prerequisites-sign-in-azure-ad-b2c.md)]\n\n[!INCLUDE [prerequisites-weblogic.md](includes/prerequisites-weblogic.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-azure-ad-b2c.md](includes/enable-java-servlet-webapp-authentication-azure-ad-b2c.md)]\n\n## Run the sample\n\nThese instructions assume that you installed WebLogic and set up some server domain.\n\nBefore you can deploy to WebLogic, use the following steps to make some configuration changes in the sample itself and then build or rebuild the package:\n\n1. In the sample, find the **application.properties** or **authentication.properties** file where you configured the client ID, tenant, redirect URL, and so on.\n\n1. In this file, change references to `localhost:8080` or `localhost:8443` to the URL and port that WebLogic runs on, which by default should be `localhost:7001`.\n\n1. You also need to make the same change in the Azure app registration, where you set it in the Azure portal as the **Redirect URI** value on the **Authentication** tab.\n\nUse the following steps to deploy the sample to WebLogic via the web console:\n\n1. Start the WebLogic server by using **DOMAIN_NAME\\bin\\startWebLogic.cmd**.\n\n1. Navigate to the WebLogic web console in your browser at `http://localhost:7001/console`.\n\n1. Go to Domain Structure > Deployments, select **Install**, select **Upload your files**, and then find the **.war** file that you built by using Maven.\n\n1. Select Install this deployment as an application, select **Next**, select **Finish**, and then select **Save**.\n\n1. Most of the default settings should be fine except that you should name the application to match the redirect URI you set in the sample configuration or Azure app registration. That is, if the redirect URI is `http://localhost:7001/msal4j-servlet-auth`, then you should name the application `msal4j-servlet-auth`.\n\n1. Go back to **Domain Structure** > **Deployments**, and start your application.\n\n1. After the application starts, navigate to `http://localhost:7001/<application-name>/`, and you should be able to access the application.\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-azure-ad-b2c-explore.md](includes/enable-java-servlet-webapp-authentication-azure-ad-b2c-explore.md)]\n\n## Next step\n\n[Deploy Java WebLogic apps to WebLogic on Azure Virtual Machines](deploy-weblogic-to-vm.md)\n"
  },
  {
    "path": "articles/java/identity/enable-java-weblogic-webapp-authentication-entra-id.md",
    "content": "---\ntitle: Enable sign-in for WebLogic apps using Microsoft Entra ID\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java WebLogic app that supports sign-in by using a Microsoft Entra account.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable sign-in for Java WebLogic apps using Microsoft Entra ID\n\nThis article demonstrates a Java WebLogic app that signs in users to your Microsoft Entra ID tenant using the [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-sign-in-entra.md](includes/scenario-sign-in-entra.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-sign-in-entra.md](includes/prerequisites-sign-in-entra.md)]\n\n[!INCLUDE [prerequisites-weblogic.md](includes/prerequisites-weblogic.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-entra-id.md](includes/enable-java-servlet-webapp-authentication-entra-id.md)]\n\n### Deploy the sample\n\nThese instructions assume that you installed WebLogic and set up some server domain.\n\nBefore you can deploy to WebLogic, use the following steps to make some configuration changes in the sample itself and then build or rebuild the package:\n\n1. In the sample, find the **application.properties** or **authentication.properties** file where you configured the client ID, tenant, redirect URL, and so on.\n\n1. In this file, change references to `localhost:8080` or `localhost:8443` to the URL and port that WebLogic runs on, which by default should be `localhost:7001`.\n\n1. You also need to make the same change in the Azure app registration, where you set it in the Azure portal as the **Redirect URI** value on the **Authentication** tab.\n\nUse the following steps to deploy the sample to WebLogic via the web console:\n\n1. Start the WebLogic server with **DOMAIN_NAME\\bin\\startWebLogic.cmd**.\n\n1. Navigate to the WebLogic web console in your browser at `http://localhost:7001/console`.\n\n1. Go to **Domain Structure** > **Deployments**, select **Install**, select **Upload your files**, and then find the **.war** file that you built by using Maven.\n\n1. Select Install this deployment as an application, select **Next**, select **Finish**, and then select **Save**.\n\n1. Most of the default settings should be fine except that you should name the application to match the redirect URI you set in the sample configuration or Azure app registration. That is, if the redirect URI is `http://localhost:7001/msal4j-servlet-auth`, then you should name the application `msal4j-servlet-auth`.\n\n1. Go back to **Domain Structure** > **Deployments**, and start your application.\n\n1. After the application starts, navigate to `http://localhost:7001/<application-name>/`, and you should be able to access the application.\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-entra-id-explore.md](includes/enable-java-servlet-webapp-authentication-entra-id-explore.md)]\n\n## Next step\n\n[Deploy Java WebLogic apps to WebLogic on Azure Virtual Machines](deploy-weblogic-to-vm.md)\n"
  },
  {
    "path": "articles/java/identity/enable-java-weblogic-webapp-authorization-entra-id.md",
    "content": "---\ntitle: Enable WebLogic app sign-in and access to Microsoft Graph\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java WebLogic app to sign in users and call Microsoft Graph with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable Java WebLogic apps to sign in users and access Microsoft Graph\n\nThis article demonstrates a Java WebLogic app that signs in users and obtains an access token for calling [Microsoft Graph](/graph/overview). It uses the [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-authorization-graph.md](includes/scenario-authorization-graph.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-graph.md](includes/prerequisites-authorization-graph.md)]\n\n[!INCLUDE [prerequisites-weblogic.md](includes/prerequisites-weblogic.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-entra-id.md](includes/enable-java-servlet-webapp-authorization-entra-id.md)]\n\n### Deploy the sample\n\nThese instructions assume that you installed WebLogic and set up some server domain.\n\nBefore you can deploy to WebLogic, use the following steps to make some configuration changes in the sample itself and then build or rebuild the package:\n\n1. In the sample, find the **application.properties** or **authentication.properties** file where you configured the client ID, tenant, redirect URL, and so on.\n\n1. In this file, change references to `localhost:8080` or `localhost:8443` to the URL and port that WebLogic runs on, which by default should be `localhost:7001`.\n\n1. You also need to make the same change in the Azure app registration, where you set it in the Azure portal as the **Redirect URI** value on the **Authentication** tab.\n\nUse the following steps to deploy the sample to WebLogic via the web console:\n\n1. Start the WebLogic server with **DOMAIN_NAME\\bin\\startWebLogic.cmd**.\n\n1. Navigate to the WebLogic web console in your browser at `http://localhost:7001/console`.\n\n1. Go to **Domain Structure** > **Deployments**, select **Install**, select **Upload your files**, and then find the **.war** file that you built using Maven.\n\n1. Select Install this deployment as an application, select **Next**, select **Finish**, and then select **Save**.\n\n1. Most of the default settings should be fine except that you should name the application to match the redirect URI you set in the sample configuration or Azure app registration. That is, if the redirect URI is `http://localhost:7001/msal4j-servlet-auth`, then you should name the application `msal4j-servlet-auth`.\n\n1. Go back to **Domain Structure** > **Deployments**, and start your application.\n\n1. After the application starts, navigate to `http://localhost:7001/<application-name>/`, and you should be able to access the application.\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-entra-id-explore.md)]\n\n## Next step\n\n[Deploy Java WebLogic apps to WebLogic on Azure Virtual Machines](deploy-weblogic-to-vm.md)\n"
  },
  {
    "path": "articles/java/identity/enable-java-weblogic-webapp-authorization-group-entra-id.md",
    "content": "---\ntitle: Secure Java WebLogic apps using groups and group claims\ntitleSuffix: Azure\ndescription: Shows how to create a WebLogic app to sign in users and restrict access to pages using security groups and group claims with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java WebLogic apps using groups and group claims\n\nThis article shows you how to create a Java WebLogic app that signs in users with [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java). The app also restricts access to pages based on Microsoft Entra ID security group membership.\n\n[!INCLUDE [scenario-authorization-groups.md](includes/scenario-authorization-groups.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-groups.md](includes/prerequisites-authorization-groups.md)]\n\n[!INCLUDE [prerequisites-weblogic.md](includes/prerequisites-weblogic.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-group-entra-id.md](includes/enable-java-servlet-webapp-authorization-group-entra-id.md)]\n\n### Deploy the sample\n\nThese instructions assume that you installed WebLogic and set up some server domain.\n\nBefore you can deploy to WebLogic, use the following steps to make some configuration changes in the sample itself and then build or rebuild the package:\n\n1. In the sample, find the **application.properties** or **authentication.properties** file where you configured the client ID, tenant, redirect URL, and so on.\n\n1. In this file, change references to `localhost:8080` or `localhost:8443` to the URL and port that WebLogic runs on, which by default should be `localhost:7001`.\n\n1. You also need to make the same change in the Azure app registration, where you set it in the Azure portal as the **Redirect URI** value on the **Authentication** tab.\n\nUse the following steps to deploy the sample to WebLogic via the web console:\n\n1. Start the WebLogic server with **DOMAIN_NAME\\bin\\startWebLogic.cmd**.\n\n1. Navigate to the WebLogic web console in your browser at `http://localhost:7001/console`.\n\n1. Go to **Domain Structure** > **Deployments**, select **Install**, select **Upload your files**, and then find the **.war** file that you built using Maven.\n\n1. Select Install this deployment as an application, select **Next**, select **Finish**, and then select **Save**.\n\n1. Most of the default settings should be fine except that you should name the application to match the redirect URI you set in the sample configuration or Azure app registration. That is, if the redirect URI is `http://localhost:7001/msal4j-servlet-auth`, then you should name the application `msal4j-servlet-auth`.\n\n1. Go back to **Domain Structure** > **Deployments**, and start your application.\n\n1. After the application starts, navigate to `http://localhost:7001/<application-name>/`, and you should be able to access the application.\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-group-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-group-entra-id-explore.md)]\n\n## Next step\n\n[Deploy Java WebLogic apps to WebLogic on Azure Virtual Machines](deploy-weblogic-to-vm.md)\n"
  },
  {
    "path": "articles/java/identity/enable-java-weblogic-webapp-authorization-role-entra-id.md",
    "content": "---\ntitle: Secure Java WebLogic apps using roles and role claims\ntitleSuffix: Azure\ndescription: Shows you how to add authorization using app roles and role claims to Java WebLogic app that signs in users with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java WebLogic apps using roles and role claims\n\nThis article demonstrates a Java WebLogic app that uses [OpenID Connect](/entra/identity-platform/v2-protocols-oidc) to sign in users and [Microsoft Entra ID Application Roles (app roles)](/entra/identity-platform/howto-add-app-roles-in-apps) for authorization.\n\n[!INCLUDE [scenario-authorization-roles.md](includes/scenario-authorization-roles.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-roles.md](includes/prerequisites-authorization-roles.md)]\n\n[!INCLUDE [prerequisites-weblogic.md](includes/prerequisites-weblogic.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-role-entra-id.md](includes/enable-java-servlet-webapp-authorization-role-entra-id.md)]\n\n### Deploy the sample\n\nThese instructions assume that you installed WebLogic and set up some server domain.\n\nBefore you can deploy to WebLogic, use the following steps to make some configuration changes in the sample itself and then build or rebuild the package:\n\n1. In the sample, find the **application.properties** or **authentication.properties** file where you configured the client ID, tenant, redirect URL, and so on.\n\n1. In this file, change references to `localhost:8080` or `localhost:8443` to the URL and port that WebLogic runs on, which by default should be `localhost:7001`.\n\n1. You also need to make the same change in the Azure app registration, where you set it in the Azure portal as the **Redirect URI** value on the **Authentication** tab.\n\nUse the following steps to deploy the sample to WebLogic via the web console:\n\n1. Start the WebLogic server with **DOMAIN_NAME\\bin\\startWebLogic.cmd**.\n\n1. Navigate to the WebLogic web console in your browser at `http://localhost:7001/console`.\n\n1. Go to **Domain Structure** > **Deployments**, select **Install**, select **Upload your files**, and then find the **.war** file that you built using Maven.\n\n1. Select Install this deployment as an application, select **Next**, select **Finish**, and then select **Save**.\n\n1. Most of the default settings should be fine except that you should name the application to match the redirect URI you set in the sample configuration or Azure app registration. That is, if the redirect URI is `http://localhost:7001/msal4j-servlet-auth`, then you should name the application `msal4j-servlet-auth`.\n\n1. Go back to **Domain Structure** > **Deployments**, and start your application.\n\n1. After the application starts, navigate to `http://localhost:7001/<application-name>/`, and you should be able to access the application.\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-role-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-role-entra-id-explore.md)]\n\n## Next step\n\n[Deploy Java WebLogic apps to WebLogic on Azure Virtual Machines](deploy-weblogic-to-vm.md)\n"
  },
  {
    "path": "articles/java/identity/enable-java-websphere-webapp-authentication-azure-ad-b2c.md",
    "content": "---\ntitle: Enable sign-in for Java WebSphere apps using MSAL4J\ntitleSuffix: Azure Active Directory B2C\ndescription: Shows you how to develop a Java WebSphere app that supports sign-in by Azure Active Directory B2C.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable sign-in for Java WebSphere apps using MSAL4J with Azure Active Directory B2C\n\nThis article demonstrates a Java Servlet application that authenticates users against Azure Active Directory B2C (Azure AD B2C) using the [Microsoft Authentication Library for Java (MSAL4J)](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-sign-in-azure-ad-b2c.md](includes/scenario-sign-in-azure-ad-b2c.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-sign-in-azure-ad-b2c.md](includes/prerequisites-sign-in-azure-ad-b2c.md)]\n\n[!INCLUDE [prerequisites-websphere.md](includes/prerequisites-websphere.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-azure-ad-b2c.md](includes/enable-java-servlet-webapp-authentication-azure-ad-b2c.md)]\n\n[!INCLUDE [deploy-websphere.md](includes/deploy-websphere.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-azure-ad-b2c-explore.md](includes/enable-java-servlet-webapp-authentication-azure-ad-b2c-explore.md)]\n\n## Next step\n\n[Deploy Java WebSphere apps to Traditional WebSphere on Azure Virtual Machines](deploy-websphere-to-vm.md)\n"
  },
  {
    "path": "articles/java/identity/enable-java-websphere-webapp-authentication-entra-id.md",
    "content": "---\ntitle: Enable sign-in for WebSphere apps using Microsoft Entra ID\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java WebSphere app that supports sign-in by using a Microsoft Entra account.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable sign-in for Java WebSphere apps using Microsoft Entra ID\n\nThis sample demonstrates a Java WebSphere app that signs in users to your Microsoft Entra ID tenant using the [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-sign-in-entra.md](includes/scenario-sign-in-entra.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-sign-in-entra.md](includes/prerequisites-sign-in-entra.md)]\n\n[!INCLUDE [prerequisites-websphere.md](includes/prerequisites-websphere.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-entra-id.md](includes/enable-java-servlet-webapp-authentication-entra-id.md)]\n\n[!INCLUDE [deploy-websphere.md](includes/deploy-websphere.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authentication-entra-id-explore.md](includes/enable-java-servlet-webapp-authentication-entra-id-explore.md)]\n\n## Next step\n\n[Deploy Java WebSphere apps to Traditional WebSphere on Azure Virtual Machines](deploy-websphere-to-vm.md)\n"
  },
  {
    "path": "articles/java/identity/enable-java-websphere-webapp-authorization-entra-id.md",
    "content": "---\ntitle: Enable WebSphere app sign-in and access to Microsoft Graph\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java WebSphere app to sign in users and call Microsoft Graph with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable Java WebSphere apps to sign in users and access Microsoft Graph\n\nThis article demonstrates a Java WebSphere app that signs in users and obtains an access token for calling [Microsoft Graph](/graph/overview). It uses the [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\n[!INCLUDE [scenario-authorization-graph.md](includes/scenario-authorization-graph.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-graph.md](includes/prerequisites-authorization-graph.md)]\n\n[!INCLUDE [prerequisites-websphere.md](includes/prerequisites-websphere.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-entra-id.md](includes/enable-java-servlet-webapp-authorization-entra-id.md)]\n\n[!INCLUDE [deploy-websphere.md](includes/deploy-websphere.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-entra-id-explore.md)]\n\n## Next step\n\n[Deploy Java WebSphere apps to Traditional WebSphere on Azure Virtual Machines](deploy-websphere-to-vm.md)\n"
  },
  {
    "path": "articles/java/identity/enable-java-websphere-webapp-authorization-group-entra-id.md",
    "content": "---\ntitle: Secure Java WebSphere apps using groups and group claims\ntitleSuffix: Azure\ndescription: Shows how to develop a WebSphere app to sign in users and restrict access to pages using security groups and group claims with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java WebSphere apps using groups and group claims\n\nThis article shows you how to create a Java WebSphere app that signs in users with [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java). The app also restricts access to pages based on Microsoft Entra ID security group membership.\n\n[!INCLUDE [scenario-authorization-groups.md](includes/scenario-authorization-groups.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-groups.md](includes/prerequisites-authorization-groups.md)]\n\n[!INCLUDE [prerequisites-websphere.md](includes/prerequisites-websphere.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-group-entra-id.md](includes/enable-java-servlet-webapp-authorization-group-entra-id.md)]\n\n[!INCLUDE [deploy-websphere.md](includes/deploy-websphere.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-group-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-group-entra-id-explore.md)]\n\n## Next step\n\n[Deploy Java WebSphere apps to Traditional WebSphere on Azure Virtual Machines](deploy-websphere-to-vm.md)\n"
  },
  {
    "path": "articles/java/identity/enable-java-websphere-webapp-authorization-role-entra-id.md",
    "content": "---\ntitle: Secure Java WebSphere apps using app roles and role claims\ntitleSuffix: Azure\ndescription: Shows you how to add authorization using app roles and role claims to Java WebSphere app that signs in users with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java WebSphere apps using app roles and role claims\n\nThis article demonstrates a Java WebSphere app that uses [OpenID Connect](/entra/identity-platform/v2-protocols-oidc) to sign in users and [Microsoft Entra ID Application Roles (app roles)](/entra/identity-platform/howto-add-app-roles-in-apps) for authorization.\n\n[!INCLUDE [scenario-authorization-roles.md](includes/scenario-authorization-roles.md)]\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-authorization-roles.md](includes/prerequisites-authorization-roles.md)]\n\n[!INCLUDE [prerequisites-websphere.md](includes/prerequisites-websphere.md)]\n\n## Recommendations\n\n[!INCLUDE [java-servlet-overview-recommendation.md](includes/java-servlet-overview-recommendation.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-role-entra-id.md](includes/enable-java-servlet-webapp-authorization-role-entra-id.md)]\n\n[!INCLUDE [deploy-websphere.md](includes/deploy-websphere.md)]\n\n[!INCLUDE [enable-java-servlet-webapp-authorization-role-entra-id-explore.md](includes/enable-java-servlet-webapp-authorization-role-entra-id-explore.md)]\n\n## Next step\n\n[Deploy Java WebSphere apps to Traditional WebSphere on Azure Virtual Machines](deploy-websphere-to-vm.md)\n"
  },
  {
    "path": "articles/java/identity/enable-spring-boot-webapp-authentication-azure-ad-b2c.md",
    "content": "---\ntitle: Secure Spring Boot apps using Azure Active Directory B2C\ndescription: Shows you how to develop a Java Spring Boot web app that supports sign-in by Azure Active Directory B2C.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java Spring Boot apps using Azure Active Directory B2C\n\nThis article demonstrates a Java Spring Boot web app that signs in users on your Azure Active Directory B2C tenant using the [Azure AD B2C Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory-b2c). It uses the OpenID Connect protocol.\n\nThe following diagram shows the topology of the app:\n\n:::image type=\"content\" source=\"media/topology-spring.png\" alt-text=\"Diagram that shows the topology of the app.\":::\n\nThe client app uses the Azure AD B2C Spring Boot Starter client library for Java to sign in a user and obtain an ID token from Azure AD B2C. The ID token proves that the user is authenticated with Azure AD B2C and enables the user to access protected routes.\n\n## Prerequisites\n\n- [JDK version 15](https://jdk.java.net/15/). This sample was developed on a system with Java 15, but it might be compatible with other versions.\n- [Maven 3](https://maven.apache.org/download.cgi)\n- [Java Extension Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) is recommended for running this sample in Visual Studio Code.\n- An Azure AD B2C tenant. For more information, see [Tutorial: Create an Azure Active Directory B2C tenant](/azure/active-directory-b2c/tutorial-create-tenant)\n- [Visual Studio Code](https://code.visualstudio.com/download)\n- [Azure Tools for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)\n\n[!INCLUDE [spring-boot-overview-recommendations.md](includes/spring-boot-overview-recommendations.md)]\n\n## Set up the sample\n\nThe following sections show you how to set up the sample application.\n\n### Clone or download the sample repository\n\nTo clone the sample, open a Bash window and use the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git\ncd 4-spring-web-app/1-Authentication/sign-in-b2c\n```\n\nAlternatively, navigate to the [ms-identity-msal-java-samples](https://github.com/Azure-Samples/ms-identity-msal-java-samples) repository, then download it as a **.zip** file and extract it to your hard drive.\n\n> [!IMPORTANT]\n> To avoid file path length limitations on Windows, clone or extract the repository into a directory near the root of your hard drive.\n\nThis sample comes with a preregistered application for demo purposes. If you'd like to use your own Azure AD B2C tenant and application, register and configure the application in the Azure portal. For more information, see the [Register the app](#register-the-app-java-spring-webapp-auth-b2c) section. Otherwise, continue with the steps in the [Run the sample](#run-the-sample) section.\n\n### Choose the Azure AD B2C tenant where you want to create your applications\n\nTo choose your tenant, use the following steps:\n\n1. Sign in to the [Azure portal](https://portal.azure.com).\n\n1. If your account is present in more than one Azure AD B2C tenant, select your profile in the corner of the Azure portal, and then select **Switch directory** to change your session to the desired Azure AD B2C tenant.\n\n### Create user flows and custom policies\n\nTo create common user flows like sign-up, sign-in, profile edit, and password reset, see [Tutorial: Create user flows in Azure Active Directory B2C](/azure/active-directory-b2c/tutorial-create-user-flows).\n\nYou should consider creating custom policies in Azure Active Directory B2C as well. However, this task is beyond the scope of this tutorial. For more information, see [Azure AD B2C custom policy overview](/azure/active-directory-b2c/custom-policy-overview).\n\n### Add external identity providers\n\nSee [Tutorial: Add identity providers to your applications in Azure Active Directory B2C](/azure/active-directory-b2c/tutorial-add-identity-providers).\n\n### Register the app (java-spring-webapp-auth-b2c)\n\nTo register the app, use the following steps:\n\n1. Navigate to the [Azure portal](https://portal.azure.com) and select **Azure AD B2C**.\n\n1. Select **App Registrations** on the navigation pane, then select **New registration**.\n\n1. In the **Register an application page** that appears, enter the following application registration information:\n\n   - In the **Name** section, enter a meaningful application name for display to users of the app - for example, `java-spring-webapp-auth-b2c`.\n   - Under **Supported account types**, select **Accounts in any identity provider or organizational directory (for authenticating users with user flows)**.\n   - In the **Redirect URI (optional)** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:8080/login/oauth2/code/`.\n\n1. Select **Register** to create the application.\n\n1. On the app's registration page, find and copy the **Application (client) ID** value to use later. You use this value in your app's configuration file or files.\n\n1. Select **Save** to save your changes.\n\n1. On the app's registration page, select the **Certificates & secrets** pane on the navigation pane to open the page to generate secrets and upload certificates.\n\n1. In the **Client secrets** section, select **New client secret**.\n\n1. Type a description - for example, **app secret**.\n\n1. Select one of the available durations as per your security concerns - for example, **In 2 years**.\n\n1. Select **Add**. The generated value is displayed.\n\n1. Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.\n\n### Configure the app (java-spring-webapp-auth-b2c) to use your app registration\n\nUse the following steps to configure the app:\n\n> [!NOTE]\n> In the following steps, `ClientID` is the same as `Application ID` or `AppId`.\n\n1. Open the project in your IDE.\n\n1. Open the **src/main/resources/application.yml** file.\n\n1. Find the `client-id` property and replace the existing value with the application ID or `clientId` of the `java-spring-webapp-auth-b2c` application from the Azure portal.\n\n1. Find the `client-secret` property and replace the existing value with the value you saved during the creation of the `java-spring-webapp-auth-b2c` application from the Azure portal.\n\n1. Find the `base-uri` property and replace the two instances of the value `fabrikamb2c` with the name of the Azure AD B2C tenant in which you created the `java-spring-webapp-auth-b2c` application in the Azure portal.\n\n1. Find the `sign-up-or-sign-in` property and replace it with the name of the sign-up/sign-in user-flow policy you created in the Azure AD B2C tenant in which you created the `java-spring-webapp-auth-b2c` application in the Azure portal.\n\n1. Find the `profile-edit` property and replace it with the name of the password reset user-flow policy you created in the Azure AD B2C tenant in which you created the `java-spring-webapp-auth-b2c` application in the Azure portal.\n\n1. Find the `password-reset` property and replace it with the name of the edit profile user-flow policy you created in the Azure AD B2C tenant in which you created the `java-spring-webapp-auth-b2c` application in the Azure portal.\n\n1. Open the **src/main/resources/templates/navbar.html** file.\n\n1. Find the references to the `b2c_1_susi` and `b2c_1_edit_profile` flows and replace them with your `sign-up-sign-in` and `profile-edit` user-flows.\n\n## Run the sample\n\n### [Deploy to Azure Container Apps](#tab/aca)\n\nThe following sections show you how to deploy the sample to Azure Container Apps.\n\n### Prerequisites\n\n[!INCLUDE [deploy-container-apps-intro.md](includes/deploy-container-apps-intro.md)]\n\n### Prepare the Spring project\n\n[!INCLUDE [deploy-container-apps-prepare.md](includes/deploy-container-apps-prepare.md)]\n\n## Setup\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-cli-setup.md)]\n\n## Create the Azure Container Apps environment\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-create-env-variables.md)]\n\n### Prepare the app for deployment\n\n[!INCLUDE [deploy-container-apps-prepare-deploy.md](includes/deploy-container-apps-prepare-deploy.md)]\n\n[!INCLUDE [deploy-container-apps-secret-note.md](includes/deploy-container-apps-secret-note.md)]\n\n### Update your Microsoft Entra ID app registration\n\n[!INCLUDE [deploy-container-apps-update-registration.md](includes/deploy-container-apps-update-registration.md)]\n\n### Deploy the app\n\n[!INCLUDE [deploy-container-apps-deploy.md](includes/deploy-container-apps-deploy.md)]\n\n### Validate the app\n\n[!INCLUDE [deploy-container-apps-validate.md](includes/deploy-container-apps-validate.md)]\n\n### [Run locally](#tab/local)\n\nTo run the sample locally, use the following steps:\n\n1. Open a Bash window or the integrated Visual Studio Code terminal.\n\n1. In the root directory of the app project, use the following command:\n\n   ```bash\n   mvn clean compile spring-boot:run\n   ```\n\n1. Open your browser and navigate to `http://localhost:8080`. You should see a screen with the text `You're signed in! Click here to get your ID Token Details`.\n\n:::image type=\"content\" source=\"media/app.png\" alt-text=\"Screenshot of the sample app.\":::\n\n---\n\n## Explore the sample\n\nUse the following steps to explore the sample:\n\n1. Notice the signed-in or signed-out status displayed at the center of the screen.\n1. Select the context-sensitive button in the corner. This button reads **Sign In** when you first run the app. Alternatively, select the link to **token details**. Because this page is protected and requires authentication, you're automatically redirected to the sign-in page.\n1. On the next page, follow the instructions and sign in with an account of your chosen identity provider. You can also choose to sign up or sign in to a local account on the B2C tenant using an email address.\n1. Upon successful completion of the sign-in flow, you should be redirected to the home page - which shows the **sign in status** - or the **token details** page, depending on which button triggered your sign-in flow.\n1. Notice that the context-sensitive button now says **Sign out** and displays your username.\n1. If you're on the home page, select **ID Token Details** to see some of the ID token's decoded claims.\n1. Edit your profile. Select **edit profile** to change details like your display name, place of residence, and profession.\n1. Use the button in the corner to sign out. The status page reflects the new state.\n\n## About the code\n\nThis sample demonstrates how to use [Azure AD B2C Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory-b2c) to sign in users into your Azure AD B2C tenant. The sample also makes use of the Spring Oauth2 Client and Spring Web boot starters. The sample uses claims from the ID token obtained from Azure AD B2C to display the details of the signed-in user.\n\n### Contents\n\nThe following table shows the contents of the sample project folder:\n\n| File/folder                                                                   | Description                                                                               |\n|-------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|\n| **pom.xml**                                                                     | Application dependencies.                                                                 |\n| **src/main/resources/templates/**                                               | Thymeleaf Templates for UI.                                                               |\n| **src/main/resources/application.yml**                                          | Application and Microsoft Entra Boot Starter library configuration.                       |\n| **src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/** | This directory contains the main application entry point, controller, and config classes. |\n| **.../MsIdentitySpringBootWebappApplication.java**                              | Main class.                                                                               |\n| **.../SampleController.java**                                                   | Controller with endpoint mappings.                                                        |\n| **.../SecurityConfig.java**                                                     | Security configuration - for example, which routes require authentication.                |\n| **.../Utilities.java**                                                          | Utility class - for example, filter ID token claims.                                      |\n| **CHANGELOG.md**                                                                | List of changes to the sample.                                                            |\n| **CONTRIBUTING.md**                                                             | Guidelines for contributing to the sample.                                                |\n| **LICENSE**                                                                     | The license for the sample.                                                               |\n\n### ID token claims\n\nTo extract token details, the app makes use of Spring Security's `AuthenticationPrincipal` and `OidcUser` object in a request mapping, as shown in the following example, as shown in the following example. See the [Sample Controller](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/4-spring-web-app/1-Authentication/sign-in-b2c/src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SampleController.java) for the full details of how this app makes use of ID token claims.\n\n```java\nimport org.springframework.security.oauth2.core.oidc.user.OidcUser;\nimport org.springframework.security.core.annotation.AuthenticationPrincipal;\n//...\n@GetMapping(path = \"/some_path\")\npublic String tokenDetails(@AuthenticationPrincipal OidcUser principal) {\n    Map<String, Object> claims = principal.getIdToken().getClaims();\n}\n```\n\n### Sign-in and sign-out links\n\nFor sign-in, the app makes a request to the Azure AD B2C sign-in endpoint automatically configured by Azure AD B2C Spring Boot Starter client library for Java, as shown in the following example:\n\n```html\n<a class=\"btn btn-success\" href=\"/oauth2/authorization/{your-sign-up-sign-in-user-flow}\">Sign In</a>\n```\n\nFor sign-out, the app makes a POST request to the `logout` endpoint, as shown in the following example:\n\n```html\n<form action=\"#\" th:action=\"@{/logout}\" method=\"post\">\n  <input class=\"btn btn-warning\" type=\"submit\" value=\"Sign Out\" />\n</form>\n```\n\n### Authentication-dependent UI elements\n\nThe app has some simple logic in the UI template pages for determining content to display based on whether the user is authenticated, as shown in the following example using Spring Security Thymeleaf tags:\n\n```html\n<div sec:authorize=\"isAuthenticated()\">\n  this content only shows to authenticated users\n</div>\n<div sec:authorize=\"isAnonymous()\">\n  this content only shows to not-authenticated users\n</div>\n```\n\n### Protect routes with WebSecurityConfigurerAdapter\n\nBy default, the app protects the **ID Token Details** page so that only signed-in users can access it. The app configures these routes from the `app.protect.authenticated` property from the **application.yml** file. To configure your app's specific requirements, you can extend `WebSecurityConfigurerAdapter` in one of your classes. For an example, see this app's [SecurityConfig](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/4-spring-web-app/1-Authentication/sign-in-b2c/src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SecurityConfig.java) class, shown in the following code:\n\n```java\n@EnableWebSecurity\npublic class SecurityConfig extends WebSecurityConfigurerAdapter {\n\n    @Value(\"${app.protect.authenticated}\")\n    private String[] protectedRoutes;\n\n    private final AADB2COidcLoginConfigurer configurer;\n\n    public SecurityConfig(AADB2COidcLoginConfigurer configurer) {\n        this.configurer = configurer;\n    }\n\n    @Override\n    protected void configure(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.authorizeRequests()\n            .antMatchers(protectedRoutes).authenticated()     // limit these pages to authenticated users (default: /token_details)\n            .antMatchers(\"/**\").permitAll()                  // allow all other routes.\n            .and()\n            .apply(configurer)\n            ;\n        // @formatter:off\n    }\n}\n```\n\n## More information\n\n- [Microsoft identity platform (Microsoft Entra ID for developers)](/entra/identity-platform/)\n- [Overview of Microsoft Authentication Library (MSAL)](/entra/identity-platform/msal-overview)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Quickstart: Configure a client application to access web APIs](/entra/identity-platform/quickstart-configure-app-access-web-apis)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [Application and service principal objects in Microsoft Entra ID](/entra/identity-platform/app-objects-and-service-principals)\n- [National Clouds](/entra/identity-platform/authentication-national-cloud#app-registration-endpoints)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n- [Microsoft Entra ID Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory)\n- [Azure Active Directory B2C Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory-b2c)\n- [Microsoft Authentication Library for Java (MSAL4J)](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [MSAL4J Wiki](https://github.com/AzureAD/microsoft-authentication-library-for-java/wiki)\n- [ID tokens](/entra/identity-platform/id-tokens)\n- [Access tokens in the Microsoft identity platform](/entra/identity-platform/access-tokens)\n\nFor more information about how OAuth 2.0 protocols work in this scenario and other scenarios, see [Authentication Scenarios for Microsoft Entra ID](/entra/identity-platform/authentication-flows-app-scenarios).\n"
  },
  {
    "path": "articles/java/identity/enable-spring-boot-webapp-authentication-entra-id.md",
    "content": "---\ntitle: Secure Java Spring Boot apps using Microsoft Entra ID\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java Spring Boot web app that supports sign-in by Microsoft Entra account.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java Spring Boot apps using Microsoft Entra ID\n\nThis article demonstrates a Java Spring Boot web app that signs in users on your Microsoft Entra ID tenant using the [Microsoft Entra ID Spring Boot Starter client library for Java](https://mvnrepository.com/artifact/com.azure.spring/spring-cloud-azure-starter-active-directory). It uses the OpenID Connect protocol.\n\nThe following diagram shows the topology of the app:\n\n:::image type=\"content\" source=\"media/topology-spring.png\" alt-text=\"Diagram that shows the topology of the app.\":::\n\nThe client app uses the Microsoft Entra ID Spring Boot Starter client library for Java to sign-in a user and obtain an ID token from Microsoft Entra ID. The ID token proves that the user is authenticated with Microsoft Entra ID and enables the user to access protected routes.\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-spring-boot-updated-version.md](includes/prerequisites-spring-boot-updated-version.md)]\n\n[!INCLUDE [spring-boot-overview-recommendations.md](includes/spring-boot-overview-recommendations.md)]\n\n## Set up the sample\n\nThe following sections show you how to set up the sample application.\n\n### Clone or download the sample repository\n\nTo clone the sample, open a Bash window and use the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git\ncd 4-spring-web-app/1-Authentication/sign-in\n```\n\nAlternatively, navigate to the [ms-identity-msal-java-samples](https://github.com/Azure-Samples/ms-identity-msal-java-samples) repository, then download it as a **.zip** file and extract it to your hard drive.\n\n> [!IMPORTANT]\n> To avoid path length limitations on Windows, we recommend cloning into a directory near the root of your drive.\n\n### Register the sample applications with your Microsoft Entra ID tenant\n\nThere's one project in this sample. The following sections show you how to register the app using the Azure portal.\n\n#### Choose the Microsoft Entra ID tenant where you want to create your applications\n\nTo choose your tenant, use the following steps:\n\n1. Sign in to the [Azure portal](https://portal.azure.com).\n\n1. If your account is present in more than one Microsoft Entra ID tenant, select your profile in the corner of the Azure portal, and then select **Switch directory** to change your session to the desired Microsoft Entra ID tenant.\n\n#### Register the app (java-spring-webapp-auth)\n\nTo register the app, use the following steps:\n\n1. Navigate to the [Azure portal](https://portal.azure.com) and select **Microsoft Entra ID**.\n\n1. Select **App Registrations** on the navigation pane, then select **New registration**.\n\n1. In the **Register an application page** that appears, enter the following application registration information:\n\n   - In the **Name** section, enter a meaningful application name for display to users of the app - for example, `java-spring-webapp-auth`.\n   - Under **Supported account types**, select **Accounts in this organizational directory only**.\n   - In the **Redirect URI (optional)** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:8080/login/oauth2/code/`.\n\n1. Select **Register** to create the application.\n\n1. On the app's registration page, find and copy the **Application (client) ID** value to use later. You use this value in your app's configuration file or files.\n\n1. On the app's registration page, select **Certificates & secrets** on the navigation pane to open the page where you can generate secrets and upload certificates.\n\n1. In the **Client secrets** section, select **New client secret**.\n\n1. Type a description - for example, **app secret**.\n\n1. Select one of the available durations: **In 1 year**, **In 2 years**, or **Never Expires**.\n\n1. Select **Add**. The generated value is displayed.\n\n1. Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.\n\n---\n\n### Configure the app (java-spring-webapp-auth) to use your app registration\n\nUse the following steps to configure the app:\n\n> [!NOTE]\n> In the following steps, `ClientID` is the same as `Application ID` or `AppId`.\n\n1. Open the project in your IDE.\n\n1. Open the **src\\main\\resources\\application.yml** file.\n\n1. Find the placeholder `Enter_Your_Tenant_ID_Here` and replace the existing value with your Microsoft Entra tenant ID.\n\n1. Find the placeholder `Enter_Your_Client_ID_Here` and replace the existing value with the application ID or `clientId` of the `java-spring-webapp-auth` app copied from the Azure portal.\n\n1. Find the placeholder `Enter_Your_Client_Secret_Here` and replace the existing value with the value you saved during the creation of `java-spring-webapp-auth` copied from the Azure portal.\n\n## Run the sample\n\n### [Deploy to Azure Container Apps](#tab/aca)\n\nThe following sections show you how to deploy the sample to Azure Container Apps.\n\n### Prerequisites\n\n[!INCLUDE [deploy-container-apps-intro.md](includes/deploy-container-apps-intro.md)]\n\n### Prepare the Spring project\n\n[!INCLUDE [deploy-container-apps-prepare.md](includes/deploy-container-apps-prepare.md)]\n\n## Setup\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-cli-setup.md)]\n\n## Create the Azure Container Apps environment\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-create-env-variables.md)]\n\n### Prepare the app for deployment\n\n[!INCLUDE [deploy-container-apps-prepare-deploy.md](includes/deploy-container-apps-prepare-deploy.md)]\n\n[!INCLUDE [deploy-container-apps-secret-note.md](includes/deploy-container-apps-secret-note.md)]\n\n### Update your Microsoft Entra ID app registration\n\n[!INCLUDE [deploy-container-apps-update-registration.md](includes/deploy-container-apps-update-registration.md)]\n\n### Deploy the app\n\n[!INCLUDE [deploy-container-apps-deploy.md](includes/deploy-container-apps-deploy.md)]\n\n### Validate the app\n\n[!INCLUDE [deploy-container-apps-validate.md](includes/deploy-container-apps-validate.md)]\n\n### [Run locally](#tab/local)\n\nTo run the sample locally, use the following steps:\n\n1. Open a Bash window or the integrated Visual Studio Code terminal.\n\n1. In the root directory of the app project, use the following command:\n\n   ```bash\n   mvn clean compile spring-boot:run\n   ```\n\n1. Open your browser and navigate to `http://localhost:8080`. You should see a screen with the text `You're signed in! Click here to get your ID Token Details`.\n\n:::image type=\"content\" source=\"media/app.png\" alt-text=\"Screenshot of the sample app.\":::\n\n---\n\n## Explore the sample\n\nUse the following steps to explore the sample:\n\n1. Notice the signed-in or signed-out status displayed at the center of the screen.\n1. Select the context-sensitive button in the corner. This button reads **Sign In** when you first run the app. Alternatively, select **token details**. Because this page is protected and requires authentication, you're automatically redirected to the sign-in page.\n1. On the next page, follow the instructions and sign in with an account in the Microsoft Entra ID tenant.\n1. On the consent screen, notice the scopes that are being requested.\n1. Upon successful completion of the sign-in flow, you should be redirected to the home page - which shows the **sign in status** - or the **token details** page, depending on which button triggered your sign-in flow.\n1. Notice that the context-sensitive button now says **Sign out** and displays your user name.\n1. If you're on the home page, select **ID Token Details** to see some of the ID token's decoded claims.\n1. Use the button in the corner to sign out. The status page reflects the new state.\n\n## About the code\n\nThis sample demonstrates how to use [Microsoft Entra ID Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory) to sign in users into your Microsoft Entra ID tenant. The sample also makes use of the Spring Oauth2 Client and Spring Web boot starters. The sample uses claims from the ID token obtained from Microsoft Entra ID to display the details of the signed-in user.\n\n### Contents\n\nThe following table shows the contents of the sample project folder:\n\n| File/folder                                                                   | Description                                                                               |\n|-------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|\n| **pom.xml**                                                                     | Application dependencies.                                                                 |\n| **src/main/resources/templates/**                                               | Thymeleaf Templates for UI.                                                               |\n| **src/main/resources/application.yml**                                          | Application and Microsoft Entra ID Boot Starter Library Configuration.                    |\n| **src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/** | This directory contains the main application entry point, controller, and config classes. |\n| **.../MsIdentitySpringBootWebappApplication.java**                              | Main class.                                                                               |\n| **.../SampleController.java**                                                   | Controller with endpoint mappings.                                                        |\n| **.../SecurityConfig.java**                                                     | Security configuration - for example, which routes require authentication.                |\n| **.../Utilities.java**                                                          | Utility class - for example, filter ID token claims.                                      |\n| **CHANGELOG.md**                                                                | List of changes to the sample.                                                            |\n| **CONTRIBUTING.md**                                                             | Guidelines for contributing to the sample.                                                |\n| **LICENSE**                                                                     | The license for the sample.                                                               |\n\n### ID token claims\n\nTo extract token details, the app makes use of Spring Security's `AuthenticationPrincipal` and `OidcUser` object in a request mapping, as shown in the following example. See the [Sample Controller](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/4-spring-web-app/1-Authentication/sign-in/src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SampleController.java) for the full details of how this app makes use of ID token claims.\n\n```java\nimport org.springframework.security.oauth2.core.oidc.user.OidcUser;\nimport org.springframework.security.core.annotation.AuthenticationPrincipal;\n//...\n@GetMapping(path = \"/some_path\")\npublic String tokenDetails(@AuthenticationPrincipal OidcUser principal) {\n    Map<String, Object> claims = principal.getIdToken().getClaims();\n}\n```\n\n### Sign-in and sign-out links\n\nFor sign-in, the app makes a request to the Microsoft Entra ID sign-in endpoint automatically configured by Microsoft Entra ID Spring Boot Starter client library for Java, as shown in the following example:\n\n```html\n<a class=\"btn btn-success\" href=\"/oauth2/authorization/azure\">Sign In</a>\n```\n\nFor sign-out, the app makes a POST request to the `logout` endpoint, as shown in the following example:\n\n```html\n<form action=\"#\" th:action=\"@{/logout}\" method=\"post\">\n  <input class=\"btn btn-warning\" type=\"submit\" value=\"Sign Out\" />\n</form>\n```\n\n### Authentication-dependent UI elements\n\nThe app has some simple logic in the UI template pages for determining content to display based on whether the user is authenticated, as shown in the following example using Spring Security Thymeleaf tags:\n\n```html\n<div sec:authorize=\"isAuthenticated()\">\n  this content only shows to authenticated users\n</div>\n<div sec:authorize=\"isAnonymous()\">\n  this content only shows to not-authenticated users\n</div>\n```\n\n### Protect routes with AADWebSecurityConfigurerAdapter\n\nBy default, the app protects the **ID Token Details** page so that only signed-in users can access it. The app configures these routes by using the `app.protect.authenticated` property from the **application.yml** file. To configure your app's specific requirements, apply the `AadWebApplicationHttpSecurityConfigurer#aadWebApplication` method to the `HttpSecurity` instance. For an example, see this app's [SecurityConfig](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/4-spring-web-app/1-Authentication/sign-in/src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SecurityConfig.java) class, shown in the following code:\n\n```java\n@Configuration\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class SecurityConfig  {\n    \n    @Value(\"${app.protect.authenticated}\")\n    private String[] allowedOrigins;\n    \n    @Bean\n    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())\n            .and()\n            .authorizeHttpRequests(auth -> auth\n                .requestMatchers(allowedOrigins).authenticated()\n                .anyRequest().permitAll()\n                );\n        // @formatter:on\n        return http.build();\n    }\n\n    @Bean\n    @RequestScope\n    public ServletUriComponentsBuilder urlBuilder() {\n        return ServletUriComponentsBuilder.fromCurrentRequest();\n    }    \n}\n```\n\n## More information\n\n- [Microsoft identity platform (Microsoft Entra ID for developers)](/entra/identity-platform/)\n- [Overview of Microsoft Authentication Library (MSAL)](/entra/identity-platform/msal-overview)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Quickstart: Configure a client application to access web APIs](/entra/identity-platform/quickstart-configure-app-access-web-apis)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [Application and service principal objects in Microsoft Entra ID](/entra/identity-platform/app-objects-and-service-principals)\n- [National Clouds](/entra/identity-platform/authentication-national-cloud#app-registration-endpoints)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n- [Microsoft Entra ID Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory)\n- [Microsoft Authentication Library for Java (MSAL4J)](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [MSAL4J Wiki](https://github.com/AzureAD/microsoft-authentication-library-for-java/wiki)\n- [ID tokens](/entra/identity-platform/id-tokens)\n- [Access tokens in the Microsoft identity platform](/entra/identity-platform/access-tokens)\n\nFor more information about how OAuth 2.0 protocols work in this scenario and other scenarios, see [Authentication Scenarios for Microsoft Entra ID](/entra/identity-platform/authentication-flows-app-scenarios).\n"
  },
  {
    "path": "articles/java/identity/enable-spring-boot-webapp-authorization-entra-id.md",
    "content": "---\ntitle: Enable Spring Boot app sign-in & access to Microsoft Graph\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java Spring Boot web app to sign in users and call Microsoft Graph with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Enable Java Spring Boot apps to sign in users and access Microsoft Graph\n\nThis article demonstrates a Java Spring Boot web app that signs in users and obtains an access token for calling [Microsoft Graph](/graph/overview). It uses the [Microsoft Entra ID Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory) for authentication, authorization, and token acquisition. It uses [Microsoft Graph SDK for Java](https://github.com/microsoftgraph/msgraph-sdk-java) to obtain data from Graph.\n\nThe following diagram shows the topology of the app:\n\n:::image type=\"content\" source=\"media/topology.png\" alt-text=\"Diagram that shows the topology of the app.\":::\n\nThe app uses the Microsoft Entra ID Spring Boot Starter client library for Java to obtain an [access token](/entra/identity-platform/access-tokens) for [Microsoft Graph](/graph/overview) from Microsoft Entra ID. The access token proves that the user is authorized to access the Microsoft Graph API endpoint as defined in the scope.\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-spring-boot.md](includes/prerequisites-spring-boot.md)]\n\n[!INCLUDE [spring-boot-overview-recommendations.md](includes/spring-boot-overview-recommendations.md)]\n\n## Set up the sample\n\nThe following sections show you how to set up the sample application.\n\n### Clone or download the sample repository\n\nTo clone the sample, open a Bash window and use the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git\ncd 4-spring-web-app/2-Authorization-I/call-graph\n```\n\nAlternatively, navigate to the [ms-identity-msal-java-samples](https://github.com/Azure-Samples/ms-identity-msal-java-samples) repository, then download it as a **.zip** file and extract it to your hard drive.\n\n> [!IMPORTANT]\n> To avoid file path length limitations on Windows, clone or extract the repository into a directory near the root of your hard drive.\n\n### Register the sample applications with your Microsoft Entra ID tenant\n\nThere's one project in this sample. The following sections show you how to register the app using the Azure portal.\n\n#### Choose the Microsoft Entra ID tenant where you want to create your applications\n\nTo choose your tenant, use the following steps:\n\n1. Sign in to the [Azure portal](https://portal.azure.com).\n\n1. If your account is present in more than one Microsoft Entra ID tenant, select your profile in the corner of the Azure portal, and then select **Switch directory** to change your session to the desired Microsoft Entra ID tenant.\n\n#### Register the app (java-spring-webapp-call-graph)\n\nTo register the app, use the following steps:\n\n1. Navigate to the [Azure portal](https://portal.azure.com) and select **Microsoft Entra ID**.\n\n1. Select **App Registrations** on the navigation pane, then select **New registration**.\n\n1. In the **Register an application page** that appears, enter the following application registration information:\n\n   - In the **Name** section, enter a meaningful application name for display to users of the app - for example, `java-spring-webapp-call-graph`.\n   - Under **Supported account types**, select **Accounts in this organizational directory only**.\n   - In the **Redirect URI (optional)** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:8080/login/oauth2/code/`.\n\n1. Select **Register** to create the application.\n\n1. On the app's registration page, find and copy the **Application (client) ID** value to use later. You use this value in your app's configuration file or files.\n\n1. On the app's registration page, select **Certificates & secrets** on the navigation pane to open the page where you can generate secrets and upload certificates.\n\n1. In the **Client secrets** section, select **New client secret**.\n\n1. Type a description - for example, **app secret**.\n\n1. Select one of the available durations: **In 1 year**, **In 2 years**, or **Never Expires**.\n\n1. Select **Add**. The generated value is displayed.\n\n1. Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.\n\n1. On the app's registration page, select the **API permissions** pane on the navigation pane to open the page for access to the APIs that your application needs.\n\n1. Select **Add permissions**, and then ensure that the **Microsoft APIs** tab is selected.\n\n1. In the **Commonly used Microsoft APIs** section, select **Microsoft Graph**.\n\n1. In the **Delegated permissions** section, select **User.Read** from the list. Use the search box if necessary.\n\n1. Select **Add permissions**.\n\n---\n\n### Configure the app (java-spring-webapp-call-graph) to use your app registration\n\nUse the following steps to configure the app:\n\n> [!NOTE]\n> In the following steps, `ClientID` is the same as `Application ID` or `AppId`.\n\n1. Open the project in your IDE.\n\n1. Open the **src\\main\\resources\\application.yml** file.\n\n1. Find the placeholder `Enter_Your_Tenant_ID_Here` and replace the existing value with your Microsoft Entra tenant ID.\n\n1. Find the placeholder `Enter_Your_Client_ID_Here` and replace the existing value with the application ID or `clientId` of the `java-spring-webapp-call-graph` app copied from the Azure portal.\n\n1. Find the placeholder `Enter_Your_Client_Secret_Here` and replace the existing value with the value you saved during the creation of `java-spring-webapp-call-graph` copied from the Azure portal.\n\n## Run the sample\n\n### [Deploy to Azure Container Apps](#tab/aca)\n\nThe following sections show you how to deploy the sample to Azure Container Apps.\n\n### Prerequisites\n\n[!INCLUDE [deploy-container-apps-intro.md](includes/deploy-container-apps-intro.md)]\n\n### Prepare the Spring project\n\n[!INCLUDE [deploy-container-apps-prepare.md](includes/deploy-container-apps-prepare.md)]\n\n## Setup\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-cli-setup.md)]\n\n## Create the Azure Container Apps environment\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-create-env-variables.md)]\n\n### Prepare the app for deployment\n\n[!INCLUDE [deploy-container-apps-prepare-deploy.md](includes/deploy-container-apps-prepare-deploy.md)]\n\n[!INCLUDE [deploy-container-apps-secret-note.md](includes/deploy-container-apps-secret-note.md)]\n\n### Update your Microsoft Entra ID app registration\n\n[!INCLUDE [deploy-container-apps-update-registration.md](includes/deploy-container-apps-update-registration.md)]\n\n### Deploy the app\n\n[!INCLUDE [deploy-container-apps-deploy.md](includes/deploy-container-apps-deploy.md)]\n\n### Validate the app\n\n[!INCLUDE [deploy-container-apps-validate.md](includes/deploy-container-apps-validate.md)]\n\n### [Run locally](#tab/local)\n\nTo run the sample locally, use the following steps:\n\n1. Open a Bash window or the integrated Visual Studio Code terminal.\n\n1. In the root directory of the app project, use the following command:\n\n   ```bash\n   mvn clean compile spring-boot:run\n   ```\n\n1. Open your browser and navigate to `http://localhost:8080`. You should see a screen with the text `You're signed in! Click here to get your ID Token Details or Call Graph`.\n\n:::image type=\"content\" source=\"media/app-spring.png\" alt-text=\"Screenshot of the sample app.\":::\n\n---\n\n## Explore the sample\n\nUse the following steps to explore the sample:\n\n1. Notice the signed-in or signed-out status displayed at the center of the screen.\n1. Select the context-sensitive button in the corner. This button reads **Sign In** when you first run the app. Alternatively, select **token details** or **call graph**. Because this page is protected and requires authentication, you're automatically redirected to the sign-in page.\n1. On the next page, follow the instructions and sign in with an account in the Microsoft Entra ID tenant.\n1. On the consent screen, notice the scopes that are being requested.\n1. Upon successful completion of the sign-in flow, you should be redirected to the home page - which shows the **sign in status** - or one of the other pages, depending on which button triggered your sign-in flow.\n1. Notice that the context-sensitive button now says **Sign out** and displays your username.\n1. If you're on the home page, select **ID Token Details** to see some of the ID token's decoded claims.\n1. Select **Call Graph** to make a call to Microsoft Graph's [/me endpoint](/graph/api/user-get?tabs=java#example-2-signed-in-user-request) and see a selection of the user details obtained.\n1. Use the button in the corner to sign out. The status page reflects the new state.\n\n## About the code\n\nThis sample demonstrates how to use [Microsoft Entra ID Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory) to sign in users into your Microsoft Entra ID tenant and obtain an access token for calling Microsoft Graph. The sample also makes use of the Spring Oauth2 Client and Spring Web boot starters.\n\n### Contents\n\nThe following table shows the contents of the sample project folder:\n\n| File/folder                                                                   | Description                                                                               |\n|-------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|\n| **pom.xml**                                                                     | Application dependencies.                                                                 |\n| **src/main/resources/templates/**                                               | Thymeleaf Templates for UI.                                                               |\n| **src/main/resources/application.yml**                                          | Application and Microsoft Entra ID Boot Starter Library Configuration.                    |\n| **src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/** | This directory contains the main application entry point, controller, and config classes. |\n| **.../MsIdentitySpringBootWebappApplication.java**                              | Main class.                                                                               |\n| **.../SampleController.java**                                                   | Controller with endpoint mappings.                                                        |\n| **.../SecurityConfig.java**                                                     | Security configuration - for example, which routes require authentication.                |\n| **.../Utilities.java**                                                          | Utility class - for example, filter ID token claims.                                      |\n| **CHANGELOG.md**                                                                | List of changes to the sample.                                                            |\n| **CONTRIBUTING.md**                                                             | Guidelines for contributing to the sample.                                                |\n| **LICENSE**                                                                     | The license for the sample.                                                               |\n\n### ID token claims\n\nTo extract token details, the app makes use of Spring Security's `AuthenticationPrincipal` and `OidcUser` object in a request mapping, as shown in the following example. See the [Sample Controller](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/4-spring-web-app/2-Authorization-I/call-graph/src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SampleController.java) for the full details of how this app makes use of ID token claims.\n\n```java\nimport org.springframework.security.oauth2.core.oidc.user.OidcUser;\nimport org.springframework.security.core.annotation.AuthenticationPrincipal;\n//...\n@GetMapping(path = \"/some_path\")\npublic String tokenDetails(@AuthenticationPrincipal OidcUser principal) {\n    Map<String, Object> claims = principal.getIdToken().getClaims();\n}\n```\n\n### Sign-in and sign-out links\n\nFor sign-in, the app makes a request to the Microsoft Entra ID sign-in endpoint automatically configured by Microsoft Entra ID Spring Boot Starter client library for Java, as shown in the following example:\n\n```html\n<a class=\"btn btn-success\" href=\"/oauth2/authorization/azure\">Sign In</a>\n```\n\nFor sign-out, the app makes a POST request to the `logout` endpoint, as shown in the following example:\n\n```html\n<form action=\"#\" th:action=\"@{/logout}\" method=\"post\">\n  <input class=\"btn btn-warning\" type=\"submit\" value=\"Sign Out\" />\n</form>\n```\n\n### Authentication-dependent UI elements\n\nThe app has some simple logic in the UI template pages for determining content to display based on whether the user is authenticated, as shown in the following example using Spring Security Thymeleaf tags:\n\n```html\n<div sec:authorize=\"isAuthenticated()\">\n  this content only shows to authenticated users\n</div>\n<div sec:authorize=\"isAnonymous()\">\n  this content only shows to not-authenticated users\n</div>\n```\n\n### Protect routes with AADWebSecurityConfigurerAdapter\n\nBy default, the app protects the **ID Token Details** and **Call Graph** pages so that only signed-in users can access them. The app configures these routes from the `app.protect.authenticated` property from the **application.yml** file. To configure your app's specific requirements, you can extend `AADWebSecurityConfigurationAdapter` in one of your classes. For an example, see this app's [SecurityConfig](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/4-spring-web-app/2-Authorization-I/call-graph/src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SecurityConfig.java) class, shown in the following code:\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class SecurityConfig extends AADWebSecurityConfigurerAdapter{\n  @Value( \"${app.protect.authenticated}\" )\n  private String[] protectedRoutes;\n\n    @Override\n    public void configure(HttpSecurity http) throws Exception {\n    // use required configuration form AADWebSecurityAdapter.configure:\n    super.configure(http);\n    // add custom configuration:\n    http.authorizeRequests()\n      .antMatchers(protectedRoutes).authenticated()     // limit these pages to authenticated users (default: /token_details, /call_graph)\n      .antMatchers(\"/**\").permitAll();                  // allow all other routes.\n    }\n}\n```\n\n### Call graph\n\nWhen the user navigates to `/call_graph`, the application creates an instance of the `GraphServiceClient` using an `Oauth2AuthorizedClient` or `graphAuthorizedClient` that the Microsoft Entra ID boot starter prepared. The app asks the `GraphServiceClient` to call the `/me` endpoint and displays details for the current signed-in user. `GraphServiceClient` is from the [Microsoft Graph SDK for Java, v3](https://github.com/microsoftgraph/msgraph-sdk-java).\n\nThe `Oauth2AuthorizedClient` must be prepared with the correct scopes. See the **application.yml** file and the following [Scopes](#scopes) section. The `Oauth2AuthorizedClient` is used to surface the access token and place it in the `Authorization` header of `GraphServiceClient` requests, as shown in the following example:\n\n```java\n//see SampleController.java\n@GetMapping(path = \"/call_graph\")\npublic String callGraph(@RegisteredOAuth2AuthorizedClient(\"graph\") OAuth2AuthorizedClient graphAuthorizedClient) {\n  // See the Utilities.graphUserProperties() method for the full example of the following operation:\n  GraphServiceClient graphServiceClient = Utilities.getGraphServiceClient(graphAuthorizedClient);\n  User user = graphServiceClient.me().buildRequest().get();\n  return user.displayName;\n}\n```\n\nThe following example from the **application.yml** file shows the scopes requested:\n\n```yml\n# see application.yml file\nauthorization-clients:\n  graph:\n    # Specifies the Microsoft Graph scopes that your app needs access to:\n    scopes: https://graph.microsoft.com/User.Read\n```\n\n### Scopes\n\n[Scopes](/entra/identity-platform/scopes-oidc) tell Microsoft Entra ID the level of access that the application is requesting. For the Microsoft Graph scopes requested by this application, see **application.yml**.\n\nBy default, the application sets the scopes value to `https://graph.microsoft.com/User.Read`. The `User.Read` scope is for accessing the information of the current signed-in user from the [/me endpoint](/graph/api/user-get?tabs=java#example-2-signed-in-user-request). Valid requests to the [/me endpoint](/graph/api/user-get?tabs=java#example-2-signed-in-user-request) must contain the `User.Read` scope.\n\nWhen a user signs in, Microsoft Entra ID presents a consent dialogue to the user based on the scopes requested by the application. If the user consents to one or more scopes and obtains a token, the scopes-consented-to are encoded into the resulting access token.\n\nIn this app, the `graphAuthorizedClient` surfaces the access token that proves which the scopes the user consented to. The app uses this token to create an instance of `GraphServiceClient` that handles Graph requests.\n\nUsing `GraphServiceClient.me().buildRequest().get()`, a request is built and made to `https://graph.microsoft.com/v1.0/me`. The access token is placed in the `Authorization` header of the request.\n\n## More information\n\n- [Microsoft identity platform documentation](/entra/identity-platform/)\n- [Overview of Microsoft Authentication Library (MSAL)](/entra/identity-platform/msal-overview)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Quickstart: Configure a client application to access web APIs](/entra/identity-platform/quickstart-configure-app-access-web-apis)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [Application and service principal objects in Microsoft Entra ID](/entra/identity-platform/app-objects-and-service-principals)\n- [National Clouds](/entra/identity-platform/authentication-national-cloud#app-registration-endpoints)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n- [Azure Active Directory Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory)\n- [Microsoft Authentication Library for Java (MSAL4J)](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [MSAL4J Wiki](https://github.com/AzureAD/microsoft-authentication-library-for-java/wiki)\n- [ID tokens](/entra/identity-platform/id-tokens)\n- [Access tokens in the Microsoft identity platform](/entra/identity-platform/access-tokens)\n\nFor more information about how OAuth 2.0 protocols work in this scenario and other scenarios, see [Authentication Scenarios for Microsoft Entra ID](/entra/identity-platform/authentication-flows-app-scenarios).\n"
  },
  {
    "path": "articles/java/identity/enable-spring-boot-webapp-authorization-group-entra-id.md",
    "content": "---\ntitle: Secure Java Spring Boot apps using groups and group claims\ntitleSuffix: Azure\ndescription: Shows you how to develop a Java Spring Boot web app to restrict access to routes using security groups with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java Spring Boot apps using groups and group claims\n\nThis article demonstrates a Java Spring Boot web app that uses the [Microsoft Entra ID Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory) for authentication, authorization, and token acquisition. The app uses the [OpenID Connect](/entra/identity-platform/v2-protocols-oidc) protocol to sign in users, and restricts access to pages based on Microsoft Entra ID security group membership.\n\nThe following diagram shows the topology of the app:\n\n:::image type=\"content\" source=\"media/topology-spring.png\" alt-text=\"Diagram that shows the topology of the app.\":::\n\nThe client app uses the Microsoft Entra ID Spring Boot Starter client library for Java to sign in users in a Microsoft Entra ID tenant and obtain an [ID token](/entra/identity-platform/id-tokens) from Microsoft Entra ID.\n\nThe ID token contains the groups claim. The application loads claims into the Spring `GrantedAuthorities` list for the signed-in user. These values determine which pages the user is authorized to access.\n\nFor a video that covers this scenario, see [Implement authorization in your applications using app roles, security groups, scopes, and directory roles](https://www.youtube.com/watch?v=LRoc-na27l0).\n\n## Prerequisites\n\n- [JDK version 15](https://jdk.java.net/15/). This sample was developed on a system with Java 15, but it might be compatible with other versions.\n- [Maven 3](https://maven.apache.org/download.cgi)\n- [Java Extension Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) is recommended for running this sample in Visual Studio Code.\n- A Microsoft Entra ID tenant. For more information, see [Quickstart: Set up a tenant](/entra/identity-platform/quickstart-create-new-tenant).\n- A user account in your Microsoft Entra ID tenant. This sample doesn't work with a personal Microsoft account. Therefore, if you signed in to the [Azure portal](https://portal.azure.com) with a personal account and you don't have a user account in your directory, you need to create one now.\n- Two security groups, named `AdminGroup` and `UserGroup`, containing the user or users that you want to sign and test this sample. Alternatively, you can add the user to two existing security groups in your tenant. If you choose to use existing groups, be sure to modify the sample configuration to use your existing security groups' name and object ID.\n- [Visual Studio Code](https://code.visualstudio.com/download)\n- [Azure Tools for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)\n\n[!INCLUDE [spring-boot-overview-recommendations.md](includes/spring-boot-overview-recommendations.md)]\n\n## Set up the sample\n\nThe following sections show you how to set up the sample application.\n\n### Clone or download the sample repository\n\nTo clone the sample, open a Bash window and use the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git\ncd 4-spring-web-app/3-Authorization-II/groups\n```\n\nAlternatively, navigate to the [ms-identity-msal-java-samples](https://github.com/Azure-Samples/ms-identity-msal-java-samples) repository, then download it as a **.zip** file and extract it to your hard drive.\n\n> [!IMPORTANT]\n> To avoid file path length limitations on Windows, clone or extract the repository into a directory near the root of your hard drive.\n\n### Register the sample application with your Microsoft Entra ID tenant\n\nThere's one project in this sample. The following sections show you how to register the app using the Azure portal.\n\n#### Choose the Microsoft Entra ID tenant where you want to create your applications\n\nTo choose your tenant, use the following steps:\n\n1. Sign in to the [Azure portal](https://portal.azure.com).\n\n1. If your account is present in more than one Microsoft Entra ID tenant, select your profile in the corner of the Azure portal, and then select **Switch directory** to change your session to the desired Microsoft Entra ID tenant.\n\n#### Register the app (java-spring-webapp-groups)\n\nTo register the app, use the following steps:\n\n1. Navigate to the [Azure portal](https://portal.azure.com) and select **Microsoft Entra ID**.\n\n1. Select **App Registrations** on the navigation pane, then select **New registration**.\n\n1. In the **Register an application page** that appears, enter the following application registration information:\n\n   - In the **Name** section, enter a meaningful application name for display to users of the app - for example, `java-spring-webapp-groups`.\n   - Under **Supported account types**, select **Accounts in this organizational directory only**.\n   - In the **Redirect URI (optional)** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:8080/login/oauth2/code/`.\n\n1. Select **Register** to create the application.\n\n1. On the app's registration page, find and copy the **Application (client) ID** value to use later. You use this value in your app's configuration file or files.\n\n1. On the app's registration page, select **Certificates & secrets** on the navigation pane to open the page where you can generate secrets and upload certificates.\n\n1. In the **Client secrets** section, select **New client secret**.\n\n1. Type a description - for example, **app secret**.\n\n1. Select one of the available durations: **6 months**, **12 months**, or **Custom**.\n\n1. Select **Add**. The generated value is displayed.\n\n1. Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.\n\n1. On the app's registration page, select **API permissions** on the navigation pane to open the page where you can add access to the APIs that your application needs.\n\n1. Select **Add a permission**.\n\n1. Ensure that the **Microsoft APIs** tab is selected.\n\n1. In the **Commonly used Microsoft APIs** section, select **Microsoft Graph**.\n\n1. In the **Delegated permissions** section, select **GroupMember.Read.All** from the list. Use the search box if necessary. This permission is necessary for getting group memberships via Graph if the overage scenario occurs.\n\n1. Select the button to grant admin consent for `GroupMember.Read.All`.\n\n1. Select **Add permissions**.\n\n#### Create security groups\n\nTo create security groups, use the following steps:\n\n1. Navigate to the [Azure portal](https://portal.azure.com) and select **Microsoft Entra ID**.\n\n1. Select **Groups** on the navigation pane.\n\n1. In the **Groups** pane, select **New Group**, and then provide the following information:\n\n   - For **Group Type**, select **Security**.\n   - For **Group Name**, enter **AdminGroup**.\n   - For **Group Description**, enter **Admin Security Group**.\n   - Add **Group Owners** and **Group Members** that you want to use and test in this sample.\n   - Select **Create**.\n\n1. In the **Groups** pane, select **New Group**, and then provide the following information:\n\n   - For **Group Type**, select **Security**.\n   - For **Group Name**, enter **UserGroup**.\n   - For **Group Description**, enter **User Security Group**.\n   - Add **Group Owners** and **Group Members** that you want to use and test in this sample.\n   - Select **Create**.\n\nFor more information, see [Manage Microsoft Entra groups and group membership](/entra/fundamentals/how-to-manage-groups).\n\n#### Configure security groups\n\nYou have the following options on how you can further configure your application to receive the groups claim:\n\n- Receive all the groups that the signed-in user is assigned to in a Microsoft Entra ID tenant, included nested groups. For more information, see the section [Configure your application to receive all the groups the signed-in user is assigned to, including nested groups](#configure-your-application-to-receive-all-the-groups-the-signed-in-user-is-assigned-to-including-nested-groups).\n\n- Receive the groups claim values from a filtered set of groups that your application is programmed to work with. For more information, see the section [Configure your application to receive the groups claim values from a filtered set of groups a user might be assigned to](#configure-your-application-to-receive-the-groups-claim-values-from-a-filtered-set-of-groups-a-user-might-be-assigned-to). This option isn't available in the [Microsoft Entra ID Free edition](https://www.microsoft.com/security/business/microsoft-entra-pricing).\n\n> [!NOTE]\n> To get the on-premise group's `samAccountName` or `On Premises Group Security Identifier` instead of the group ID, see the section [Prerequisites for using group attributes synchronized from Active Directory](/entra/identity/hybrid/connect/how-to-connect-fed-group-claims#prerequisites-for-using-group-attributes-synchronized-from-active-directory) in [Configure group claims for applications by using Microsoft Entra ID](/entra/identity/hybrid/connect/how-to-connect-fed-group-claims).\n\n##### Configure your application to receive all the groups the signed-in user is assigned to, including nested groups\n\nTo configure the app, use the following steps:\n\n1. On the app's registration page, select **Token Configuration** on the navigation pane to open the page where you can configure the claims provided tokens issued to your application.\n\n1. Select **Add groups claim** to open the **Edit Groups Claim** screen.\n\n1. Select **Security groups** OR **All groups (includes distribution lists but not groups assigned to the application)**. Choosing both negates the effect of the **Security Groups** option.\n\n1. Under the **ID** section, select **Group ID**. This selection causes Microsoft Entra ID to send the [object ID](/graph/api/resources/group) of the groups the user is assigned to in the groups claim of the [ID token](/entra/identity-platform/id-tokens) that your app receives after signing-in a user.\n\n##### Configure your application to receive the groups claim values from a filtered set of groups a user might be assigned to\n\nThis option is useful when the following cases are true:\n\n- Your application is interested in a selected set of groups that a signing-in user might be assigned to.\n- Your app isn't interested in every security group this user is assigned to in the tenant.\n\nThis option helps your application avoid the [overage](#the-groups-overage-claim) issue.\n\n> [!NOTE]\n> This feature isn't available in the [Microsoft Entra ID Free edition](https://www.microsoft.com/security/business/microsoft-entra-pricing).\n>\n> Nested group assignments aren't available when you use this option.\n\nTo enable this option in your app, use the following steps:\n\n1. On the app's registration page, select **Token Configuration** on the navigation pane to open the page where you can configure the claims provided tokens issued to your application.\n\n1. Select **Add groups claim** to open the **Edit Groups Claim** screen.\n\n1. Select **Groups assigned to the application** and don't selection any other options. If you choose more options, such as **Security Groups** or **All groups (includes distribution lists but not groups assigned to the application)**, these options negate the effect of the **Groups assigned to the application** option.\n\n1. Under the **ID** section, select **Group ID**. This selection causes Microsoft Entra ID to send the [object ID](/graph/api/resources/group) of the groups the user is assigned to in the groups claim of the [ID token](/entra/identity-platform/id-tokens) that your app receives after signing-in a user.\n\n1. If you're exposing a Web API using the **Expose an API** option, then you can also choose the **Group ID** option under the **Access** section. This selection causes Microsoft Entra ID to send the [object ID](/graph/api/resources/group) of the groups the user is assigned to in the groups claim of the [access token](/entra/identity-platform/access-tokens) issued to the client applications of your API.\n\n1. On the app's registration page, select **Overview** on the navigation pane to open the Application overview screen.\n\n1. Select the hyperlink with the name of your application in **Managed application in local directory**. This field title might be truncated - for example, **Managed application in ...**. When you select this link, you navigate to the **Enterprise Application Overview** page associated with the service principal for your application in the tenant where you created it. You can navigate back to the app registration page by using the back button of your browser.\n\n1. Select **Users and groups** on the navigation pane to open the page where you can assign users and groups to your application.\n\n1. Select **Add user**.\n\n1. Select **User and Groups** from the resultant screen.\n\n1. Choose the groups that you want to assign to this application.\n\n1. Select **Select** to finish selecting the groups.\n\n1. Select **Assign** to finish the group assignment process.\n\n   Your application now receives these selected groups in the groups claim when a user signing in to your app is a member of one or more these assigned groups.\n\n1. Select **Properties** on the navigation pane to open the page that lists the basic properties of your application. Set the **User assignment required?** flag to **Yes**.\n\n> [!IMPORTANT]\n> When you set **User assignment required?** to **Yes**, Microsoft Entra ID checks that only users assigned to your application in the **Users and groups** pane are able to sign-in to your app. You can assign users directly or by assigning security groups they belong to.\n\n---\n\n### Configure your code sample to use your app registration and security groups (java-spring-webapp-groups)\n\nUse the following steps to configure the app:\n\n> [!NOTE]\n> In the following steps, `ClientID` is the same as `Application ID` or `AppId`.\n\n1. Open the project in your IDE.\n\n1. Open the **src\\main\\resources\\application.yml** file.\n\n1. Find the placeholder `Enter_Your_Tenant_ID_Here` and replace the existing value with your Microsoft Entra tenant ID.\n\n1. Find the placeholder `Enter_Your_Client_ID_Here` and replace the existing value with the application ID or `clientId` of the `java-spring-webapp-groups` app copied from the Azure portal.\n\n1. Find the placeholder `Enter_Your_Client_Secret_Here` and replace the existing value with the value you saved during the creation of `java-spring-webapp-groups` copied from the Azure portal.\n\n1. Find the placeholder `Enter_Your_Admin_Group_ID_Here` and replace the existing value with the `objectId` value of your **AdminGroup**.\n\n1. Find the placeholder `Enter_Your_User_Group_ID_Here` and replace the existing value with the `objectId` value of your **UserGroup**.\n\n1. Open the **src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SampleController.java** file.\n\n1. Find the placeholder `Enter_Your_Admin_Group_ID_Here` and replace the existing value with the `objectId` value of your **AdminGroup**.\n\n1. Find the placeholder `Enter_Your_User_Group_ID_Here` and replace the existing value with the `objectId` value of your **UserGroup**.\n\n## Run the sample\n\n### [Deploy to Azure Container Apps](#tab/aca)\n\nThe following sections show you how to deploy the sample to Azure Container Apps.\n\n### Prerequisites\n\n[!INCLUDE [deploy-container-apps-intro.md](includes/deploy-container-apps-intro.md)]\n\n### Prepare the Spring project\n\n[!INCLUDE [deploy-container-apps-prepare.md](includes/deploy-container-apps-prepare.md)]\n\n## Setup\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-cli-setup.md)]\n\n## Create the Azure Container Apps environment\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-create-env-variables.md)]\n\n### Prepare the app for deployment\n\n[!INCLUDE [deploy-container-apps-prepare-deploy.md](includes/deploy-container-apps-prepare-deploy.md)]\n\n[!INCLUDE [deploy-container-apps-secret-note.md](includes/deploy-container-apps-secret-note.md)]\n\n### Update your Microsoft Entra ID app registration\n\n[!INCLUDE [deploy-container-apps-update-registration.md](includes/deploy-container-apps-update-registration.md)]\n\n### Deploy the app\n\n[!INCLUDE [deploy-container-apps-deploy.md](includes/deploy-container-apps-deploy.md)]\n\n### Validate the app\n\n[!INCLUDE [deploy-container-apps-validate.md](includes/deploy-container-apps-validate.md)]\n\n### [Run locally](#tab/local)\n\nTo run the sample locally, use the following steps:\n\n1. Open a Bash window or the integrated Visual Studio Code terminal.\n\n1. In the root directory of the app project, use the following command:\n\n   ```bash\n   mvn clean compile spring-boot:run\n   ```\n\n1. Open your browser and navigate to `http://localhost:8080`. You should see a screen with the text `You're signed in!` and buttons with the following labels: `ID Token Details`, `Admins Only`, and `Regular Users`.\n\n:::image type=\"content\" source=\"media/app-spring-group.png\" alt-text=\"Screenshot of the sample app.\":::\n\n---\n\n## Explore the sample\n\nUse the following steps to explore the sample:\n\n1. Notice the signed-in or signed-out status displayed at the center of the screen.\n1. Select the context-sensitive button in the corner. This button reads **Sign In** when you first run the app. Alternatively, select **token details**, **admins only**, or **regular users**. Because these pages are protected and require authentication, you're automatically redirected to the sign-in page.\n1. On the next page, follow the instructions and sign in with an account in the Microsoft Entra ID tenant.\n1. On the consent screen, notice the scopes that are being requested.\n1. Upon successful completion of the sign-in flow, you should be redirected to the home page - which shows the **sign in status** - or one of the other pages, depending on which button triggered your sign-in flow.\n1. Notice that the context-sensitive button now says **Sign out** and displays your username.\n1. If you're on the home page, select **ID Token Details** to see some of the ID token's decoded claims, including groups.\n1. Select **Admins Only** to view the `/admin_only`. Only users belonging to the `AdminGroup` security group can view this page. Otherwise, an authorization failure message is displayed.\n1. Select **Regular Users** to view the `/regular_user` page. Only users belonging to the `UserGroup` security group can view this page. Otherwise, an authorization failure message is displayed.\n1. Use the button in the corner to sign out. The status page reflects the new state.\n\n## About the code\n\nThis sample demonstrates how to use [Microsoft Entra ID Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory) to sign in users into your Microsoft Entra ID tenant. The sample also makes use of the Spring Oauth2 Client and Spring Web boot starters. The sample uses claims from the ID token obtained from Microsoft Entra ID to display the details of the signed-in user, and to restrict access to some pages by using the groups claim for authorization.\n\n### Contents\n\nThe following table shows the contents of the sample project folder:\n\n| File/folder                                                                   | Description                                                                               |\n|-------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|\n| **pom.xml**                                                                     | Application dependencies.                                                                 |\n| **src/main/resources/templates/**                                               | Thymeleaf Templates for UI.                                                               |\n| **src/main/resources/application.yml**                                          | Application and Microsoft Entra ID Boot Starter Library Configuration.                    |\n| **src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/** | This directory contains the main application entry point, controller, and config classes. |\n| **.../MsIdentitySpringBootWebappApplication.java**                              | Main class.                                                                               |\n| **.../SampleController.java**                                                   | Controller with endpoint mappings.                                                        |\n| **.../SecurityConfig.java**                                                     | Security configuration - for example, which routes require authentication.                |\n| **.../Utilities.java**                                                          | Utility class - for example, filter ID token claims.                                      |\n| **CHANGELOG.md**                                                                | List of changes to the sample.                                                            |\n| **CONTRIBUTING.md**                                                             | Guidelines for contributing to the sample.                                                |\n| **LICENSE**                                                                     | The license for the sample.                                                               |\n\n### ID token claims\n\nTo extract token details, the app makes use of Spring Security's `AuthenticationPrincipal` and `OidcUser` object in a request mapping, as shown in the following example. See the [Sample Controller](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/4-spring-web-app/3-Authorization-II/groups/src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SampleController.java) for the full details of how this app makes use of ID token claims.\n\n```java\nimport org.springframework.security.oauth2.core.oidc.user.OidcUser;\nimport org.springframework.security.core.annotation.AuthenticationPrincipal;\n//...\n@GetMapping(path = \"/some_path\")\npublic String tokenDetails(@AuthenticationPrincipal OidcUser principal) {\n    Map<String, Object> claims = principal.getIdToken().getClaims();\n}\n```\n\n### Process a groups claim in the ID token\n\nThe groups claim of the token includes the names of the groups that the signed-in user is assigned to, as shown in the following example:\n\n```json\n{\n  ...\n  \"groups\": [\n    \"xyz-id-xyz\",\n    \"xyz-id-xyz\",]\n  ...\n}\n```\n\nA common way to access the group names is documented in the [ID token claims](#id-token-claims) section.\n\nMicrosoft Entra ID Boot Starter v3.5 and higher parses the groups claim automatically and adds each group to the signed-in user's `Authorities`. This configuration enables developers to make use of groups with Spring `PrePost` condition annotations using the `hasAuthority` method. For example, you can find the following `@PreAuthorize` conditions demonstrated in **SampleController.java**:\n\n```java\n@GetMapping(path = \"/admin_only\")\n@PreAuthorize(\"hasAuthority('enter-admin-group-id-here')\")\npublic String adminOnly(Model model) {\n    // restrict to users who belong to AdminGroup\n}\n@GetMapping(path = \"/regular_user\")\n@PreAuthorize(\"hasAnyAuthority('enter-user-group-id-here','enter-admin-group-id-here')\")\npublic String regularUser(Model model) {\n    // restrict to users who belong to any of UserGroup or AdminGroup\n}\n```\n\nThe following code gets a full list of authorities for a given user:\n\n ```java\n@GetMapping(path = \"/some_path\")\npublic String tokenDetails(@AuthenticationPrincipal OidcUser principal) {\n    Collection<? extends GrantedAuthority> authorities = principal.getAuthorities();\n}\n```\n\n### Sign-in and sign-out links\n\nFor sign-in, the app makes a request to the Microsoft Entra ID sign-in endpoint automatically configured by Microsoft Entra ID Spring Boot Starter client library for Java, as shown in the following example:\n\n```html\n<a class=\"btn btn-success\" href=\"/oauth2/authorization/azure\">Sign In</a>\n```\n\nFor sign-out, the app makes a POST request to the `logout` endpoint, as shown in the following example:\n\n```html\n<form action=\"#\" th:action=\"@{/logout}\" method=\"post\">\n  <input class=\"btn btn-warning\" type=\"submit\" value=\"Sign Out\" />\n</form>\n```\n\n### Authentication-dependent UI elements\n\nThe app has some simple logic in the UI template pages for determining content to display based on whether the user is authenticated, as shown in the following example using Spring Security Thymeleaf tags:\n\n```html\n<div sec:authorize=\"isAuthenticated()\">\n  this content only shows to authenticated users\n</div>\n<div sec:authorize=\"isAnonymous()\">\n  this content only shows to not-authenticated users\n</div>\n```\n\n### Protect routes with AADWebSecurityConfigurerAdapter\n\nBy default, the app protects the **ID Token Details**, **Admins Only**, and **Regular Users** pages so that only signed-in users can access them. The app configures these routes using the `app.protect.authenticated` property from the **application.yml** file. To configure your app's specific requirements, you can extend `AADWebSecurityConfigurationAdapter` in one of your classes. For an example, see this app's [SecurityConfig](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/4-spring-web-app/3-Authorization-II/groups/src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SecurityConfig.java) class, shown in the following code:\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class SecurityConfig extends AADWebSecurityConfigurerAdapter{\n  @Value( \"${app.protect.authenticated}\" )\n  private String[] protectedRoutes;\n\n    @Override\n    public void configure(HttpSecurity http) throws Exception {\n    // use required configuration form AADWebSecurityAdapter.configure:\n    super.configure(http);\n    // add custom configuration:\n    http.authorizeRequests()\n      .antMatchers(protectedRoutes).authenticated()     // limit these pages to authenticated users (default: /token_details, /admin_only, /regular_user)\n      .antMatchers(\"/**\").permitAll();                  // allow all other routes.\n    }\n}\n```\n\n### The groups overage claim\n\nTo ensure that the token size doesn't exceed HTTP header size limits, the Microsoft identity platform limits the number of object IDs that it includes in the groups claim.\n\nThe overage limit is 150 for SAML tokens, 200 for JWT tokens, 6 for single-page applications. If a user is a member of more groups than the overage limit, then the Microsoft identity platform doesn't emit the group IDs in the groups claim in the token. Instead, it includes an overage claim in the token that indicates to the application to query the [Microsoft Graph API](https://graph.microsoft.com) to retrieve the user's group membership.\n\nMicrosoft Entra ID Boot Starter v3.5 and higher parses the groups claim automatically and adds each group to the signed-in user's `Authorities`. The starter automatically handles the groups overage scenario.\n\n> [!NOTE]\n> We strongly advise you use the group filtering feature, if possible, to avoid running into group overages. For more information, see the section [Configure your application to receive the groups claim values from a filtered set of groups a user might be assigned to](#configure-your-application-to-receive-the-groups-claim-values-from-a-filtered-set-of-groups-a-user-might-be-assigned-to).\n\n#### Create the overage scenario for testing\n\nYou can use the **BulkCreateGroups.ps1** file provided in the **AppCreationScripts** folder to create a large number of groups and assign users to them. This file helps test overage scenarios during development. Remember to change the user's `objectId` provided in the **BulkCreateGroups.ps1** script.\n\nHandling overage requires a call to [Microsoft Graph](https://graph.microsoft.com) to read the signed-in user's group memberships, so your app needs to have the [User.Read](/graph/permissions-reference#user-permissions) and [GroupMember.Read.All](/graph/permissions-reference#group-permissions) permissions for the [getMemberGroups](/graph/api/directoryobject-getmembergroups) function to execute successfully.\n\n> [!IMPORTANT]\n> For the overage scenario, make sure you've granted `Admin Consent` for the Microsoft Graph API's `GroupMember.Read.All` scope for both the client and service apps. For more information, see the app registration steps earlier in this article.\n\n#### Update the Microsoft Entra ID app registration (java-spring-webapp-groups)\n\nTo update the app registration, use the following steps:\n\n1. Navigate back to the [Azure portal](https://portal.azure.com).\n\n1. On the navigation pane, select **Azure Active Directory**, and then select **App registrations (Preview)**.\n\n1. In the resulting screen, select the `java-spring-webapp-groups` application.\n\n1. On the app's registration page, select **Authentication** from the menu.\n\n1. In the **Redirect URIs** section, update the reply URLs to match the site URL of your Azure deployment - for example, `https://java-spring-webapp-groups.azurewebsites.net/login/oauth2/code/`.\n\n> [!IMPORTANT]\n> If your app is using an in-memory storage, Azure App Services spins down your web site if it's inactive, and any records that your app was keeping are emptied. Also, if you increase the instance count of your website, requests are distributed among the instances. Thus, your apps records aren't the same on each instance.\n\n## More information\n\n- [Microsoft identity platform documentation](/entra/identity-platform/)\n- [Overview of Microsoft Authentication Library (MSAL)](/entra/identity-platform/msal-overview)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Quickstart: Configure a client application to access web APIs](/entra/identity-platform/quickstart-configure-app-access-web-apis)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [Application and service principal objects in Azure Active Directory](/entra/identity-platform/app-objects-and-service-principals)\n- [National Clouds](/entra/identity-platform/authentication-national-cloud#app-registration-endpoints)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n\nFor more information about how OAuth 2.0 protocols work in this scenario and other scenarios, see [Authentication Scenarios for Microsoft Entra ID](/entra/identity-platform/authentication-flows-app-scenarios).\n"
  },
  {
    "path": "articles/java/identity/enable-spring-boot-webapp-authorization-role-entra-id.md",
    "content": "---\ntitle: Secure Java Spring Boot apps using roles and role claims\ntitleSuffix: Azure\ndescription: Shows you how to enable your Java Spring Boot web app to restrict access to routes using app roles with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: how-to\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Secure Java Spring Boot apps using roles and role claims\n\nThis article demonstrates a Java Spring Boot web app that uses the [Microsoft Entra ID Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory) for authentication, authorization, and token acquisition. The app uses the [OpenID Connect](/entra/identity-platform/v2-protocols-oidc) protocol to sign in users, and restricts access to some routes using [Microsoft Entra ID Application Roles (app roles)](/entra/identity-platform/howto-add-app-roles-in-apps) for authorization.\n\nApp roles, along with security groups, are popular means to implement authorization. Using role-based access control (RBAC) with application roles and role claims, you can securely enforce authorization policies with minimal effort. Another approach is to use Microsoft Entra ID groups and group claims. Microsoft Entra ID groups and application roles aren't mutually exclusive. You can use them both to provide fine-grained access control.\n\nFor a video that covers a similar scenario, see [Implement authorization in your applications using app roles, security groups, scopes, and directory roles](https://www.youtube.com/watch?v=LRoc-na27l0).\n\nFor more information about how the protocols work in this scenario and other scenarios, see [Authentication vs. authorization](/entra/identity-platform/authentication-vs-authorization).\n\nThe following diagram shows the topology of the app:\n\n:::image type=\"content\" source=\"media/topology-spring.png\" alt-text=\"Diagram that shows the topology of the app.\":::\n\nThe app uses the Microsoft Entra ID Spring Boot Starter client library for Java to sign in a user and obtain an [ID token](/entra/identity-platform/id-tokens) from Microsoft Entra ID. The ID token contains the roles claim. The application inspects the value of this claim to determine which pages the user is authorized to access.\n\nThis kind of authorization is implemented using RBAC. With RBAC, an administrator grants permissions to roles, not to individual users or groups. The administrator can then assign roles to different users and groups to control who has access to certain content and functionality.\n\nThis sample application defines the following two Application Roles:\n\n- `PrivilegedAdmin`: Authorized to access the **Admins Only** and the **Regular Users** pages.\n- `RegularUser`: Authorized to access the **Regular Users** page.\n\nThese application roles are defined in the [Azure portal](https://portal.azure.com) in the application's registration manifest. When a user signs into the application, Microsoft Entra ID emits a roles claim for each role granted individually to the user in the form of role membership.\n\nYou can assign users and groups to roles through the Azure portal.\n\n> [!NOTE]\n> Role claims aren't present for guest users in a tenant if the `https://login.microsoftonline.com/common/` endpoint is used as the authority to sign in users. You need to sign-in a user to a tenanted endpoint like `https://login.microsoftonline.com/tenantid`.\n\n## Prerequisites\n\n[!INCLUDE [prerequisites-spring-boot.md](includes/prerequisites-spring-boot.md)]\n\n[!INCLUDE [spring-boot-overview-recommendations.md](includes/spring-boot-overview-recommendations.md)]\n\n## Set up the sample\n\nThe following sections show you how to set up the sample application.\n\n### Clone or download the sample repository\n\nTo clone the sample, open a Bash window and use the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git\ncd 4-spring-web-app/3-Authorization-II/roles\n```\n\nAlternatively, navigate to the [ms-identity-msal-java-samples](https://github.com/Azure-Samples/ms-identity-msal-java-samples) repository, then download it as a **.zip** file and extract it to your hard drive.\n\n> [!IMPORTANT]\n> To avoid file path length limitations on Windows, clone or extract the repository into a directory near the root of your hard drive.\n\n### Register the sample application with your Microsoft Entra ID tenant\n\nThere's one project in this sample. The following sections show you how to register the app using the Azure portal.\n\n#### Choose the Microsoft Entra ID tenant where you want to create your applications\n\nTo choose your tenant, use the following steps:\n\n1. Sign in to the [Azure portal](https://portal.azure.com).\n\n1. If your account is present in more than one Microsoft Entra ID tenant, select your profile in the corner of the Azure portal, and then select **Switch directory** to change your session to the desired Microsoft Entra ID tenant.\n\n#### Register the app (java-spring-webapp-roles)\n\nTo register the app, use the following steps:\n\n1. Navigate to the [Azure portal](https://portal.azure.com) and select **Microsoft Entra ID**.\n\n1. Select **App Registrations** on the navigation pane, then select **New registration**.\n\n1. In the **Register an application page** that appears, enter the following application registration information:\n\n   - In the **Name** section, enter a meaningful application name for display to users of the app - for example, `java-spring-webapp-roles`.\n   - Under **Supported account types**, select **Accounts in this organizational directory only**.\n   - In the **Redirect URI (optional)** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:8080/login/oauth2/code/`.\n\n1. Select **Register** to create the application.\n\n1. On the app's registration page, find and copy the **Application (client) ID** value to use later. You use this value in your app's configuration file or files.\n\n1. On the app's registration page, select **Certificates & secrets** on the navigation pane to open the page where you can generate secrets and upload certificates.\n\n1. In the **Client secrets** section, select **New client secret**.\n\n1. Type a description - for example, **app secret**.\n\n1. Select one of the available durations: **In 1 year**, **In 2 years**, or **Never Expires**.\n\n1. Select **Add**. The generated value is displayed.\n\n1. Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.\n\n#### Define the app roles\n\nTo define the app roles, use the following steps:\n\n1. Still on the same app registration, select **App roles** on the navigation pane.\n\n1. Select **Create app role**, then enter the following values:\n\n   - For **Display name**, enter a suitable name - for example, **PrivilegedAdmin**.\n   - For **Allowed member types**, choose **User**.\n   - For **Value**, enter **PrivilegedAdmin**.\n   - For **Description**, enter **PrivilegedAdmins who can view the Admin Page**.\n\n1. Select **Create app role**, then enter the following values:\n\n   - For **Display name**, enter a suitable name - for example, **RegularUser**.\n   - For **Allowed member types**, choose **User**.\n   - For **Value**, enter **RegularUser**.\n   - For **Description**, enter **RegularUsers who can view the User Page**.\n\n1. Select **Apply** to save your changes.\n\n#### Assign users to app roles\n\nTo add users to the app role defined earlier, follow the guidelines here: [Assign users and groups to roles.](/entra/identity-platform/howto-add-app-roles-in-apps#assign-users-and-groups-to-microsoft-entra-roles)\n\n---\n\n### Configure the app (java-spring-webapp-roles) to use your app registration\n\nUse the following steps to configure the app:\n\n> [!NOTE]\n> In the following steps, `ClientID` is the same as `Application ID` or `AppId`.\n\n1. Open the project in your IDE.\n\n1. Open the **src\\main\\resources\\application.yml** file.\n\n1. Find the placeholder `Enter_Your_Tenant_ID_Here` and replace the existing value with your Microsoft Entra tenant ID.\n\n1. Find the placeholder `Enter_Your_Client_ID_Here` and replace the existing value with the application ID or `clientId` of the `java-spring-webapp-roles` app copied from the Azure portal.\n\n1. Find the placeholder `Enter_Your_Client_Secret_Here` and replace the existing value with the value you saved during the creation of `java-spring-webapp-roles` copied from the Azure portal.\n\n1. Open the **src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootapplication/Sample.Controller.java** file.\n\n1. Find the references to the `PrivilegedAdmin` and `RegularUser` app roles in this file. If necessary, change them to reflect the app role names you chose in the previous steps.\n\n## Run the sample\n\n### [Deploy to Azure Container Apps](#tab/aca)\n\nThe following sections show you how to deploy the sample to Azure Container Apps.\n\n### Prerequisites\n\n[!INCLUDE [deploy-container-apps-intro.md](includes/deploy-container-apps-intro.md)]\n\n### Prepare the Spring project\n\n[!INCLUDE [deploy-container-apps-prepare.md](includes/deploy-container-apps-prepare.md)]\n\n## Setup\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-cli-setup.md)]\n\n## Create the Azure Container Apps environment\n\n[!INCLUDE [deploy-container-apps-cli-setup.md](includes/deploy-container-apps-create-env-variables.md)]\n\n### Prepare the app for deployment\n\n[!INCLUDE [deploy-container-apps-prepare-deploy.md](includes/deploy-container-apps-prepare-deploy.md)]\n\n[!INCLUDE [deploy-container-apps-secret-note.md](includes/deploy-container-apps-secret-note.md)]\n\n### Update your Microsoft Entra ID app registration\n\n[!INCLUDE [deploy-container-apps-update-registration.md](includes/deploy-container-apps-update-registration.md)]\n\n### Deploy the app\n\n[!INCLUDE [deploy-container-apps-deploy.md](includes/deploy-container-apps-deploy.md)]\n\n### Validate the app\n\n[!INCLUDE [deploy-container-apps-validate.md](includes/deploy-container-apps-validate.md)]\n\n### [Run locally](#tab/local)\n\nTo run the sample locally, use the following steps:\n\n1. Open a Bash window or the integrated Visual Studio Code terminal.\n\n1. In the root directory of the app project, use the following command:\n\n   ```bash\n   mvn clean compile spring-boot:run\n   ```\n\n1. Open your browser and navigate to `http://localhost:8080`. You should see a screen with the text `You're signed in!` and buttons with the following labels: `ID Token Details`, `Admins Only`, and `Regular Users`.\n\n:::image type=\"content\" source=\"media/app-spring-group.png\" alt-text=\"Screenshot of the sample app.\":::\n\n---\n\n## Explore the sample\n\nUse the following steps to explore the sample:\n\n1. Notice the signed-in or signed-out status displayed at the center of the screen.\n1. Select the context-sensitive button in the corner. This button reads **Sign In** when you first run the app. Alternatively, select **token details**, **admins only**, or **regular users**. Because these pages are protected and require authentication, you're automatically redirected to the sign-in page.\n1. On the next page, follow the instructions and sign in with an account in the Microsoft Entra ID tenant.\n1. On the consent screen, notice the scopes that are being requested.\n1. Upon successful completion of the sign-in flow, you should be redirected to the home page - which shows the **sign in status** - or one of the other pages, depending on which button triggered your sign-in flow.\n1. Notice that the context-sensitive button now says **Sign out** and displays your username.\n1. If you're on the home page, select **ID Token Details** to see some of the ID token's decoded claims, including roles.\n1. Select **Admins Only** to view the `/admin_only`. Only users with app role `PrivilegedAdmin` can view this page. Otherwise, an authorization failure message is displayed.\n1. Select **Regular Users** to view the `/regular_user` page. Only users with app role `RegularUser` or `PrivilegedAdmin` can view this page. Otherwise, an authorization failure message is displayed.\n1. Use the button in the corner to sign out. The status page reflects the new state.\n\n## About the code\n\nThis sample demonstrates how to use [Microsoft Entra ID Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory) to sign in users into your Microsoft Entra ID tenant. The sample also makes use of the Spring Oauth2 Client and Spring Web boot starters. The sample uses claims from the ID token obtained from Microsoft Entra ID to display the details of the signed-in user, and to restrict access to some pages by using the roles claim for authorization.\n\n### Contents\n\nThe following table shows the contents of the sample project folder:\n\n| File/folder                                                                   | Description                                                                               |\n|-------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|\n| **pom.xml**                                                                     | Application dependencies.                                                                 |\n| **src/main/resources/templates/**                                               | Thymeleaf Templates for UI.                                                               |\n| **src/main/resources/application.yml**                                          | Application and Microsoft Entra ID Boot Starter Library Configuration.                    |\n| **src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/** | This directory contains the main application entry point, controller, and config classes. |\n| **.../MsIdentitySpringBootWebappApplication.java**                              | Main class.                                                                               |\n| **.../SampleController.java**                                                   | Controller with endpoint mappings.                                                        |\n| **.../SecurityConfig.java**                                                     | Security configuration - for example, which routes require authentication.                |\n| **.../Utilities.java**                                                          | Utility class - for example, filter ID token claims.                                      |\n| **CHANGELOG.md**                                                                | List of changes to the sample.                                                            |\n| **CONTRIBUTING.md**                                                             | Guidelines for contributing to the sample.                                                |\n| **LICENSE`**                                                                    | The license for the sample.                                                               |\n\n### ID token claims\n\nTo extract token details, the app makes use of Spring Security's `AuthenticationPrincipal` and `OidcUser` object in a request mapping, as shown in the following example. See the [Sample Controller](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/4-spring-web-app/3-Authorization-II/roles/src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SampleController.java) for the full details of how this app makes use of ID token claims.\n\n```java\nimport org.springframework.security.oauth2.core.oidc.user.OidcUser;\nimport org.springframework.security.core.annotation.AuthenticationPrincipal;\n//...\n@GetMapping(path = \"/some_path\")\npublic String tokenDetails(@AuthenticationPrincipal OidcUser principal) {\n    Map<String, Object> claims = principal.getIdToken().getClaims();\n}\n```\n\n### Process a roles claim in the ID token\n\nThe roles claim of the token includes the names of the roles that the signed-in user is assigned to, as shown in the following example:\n\n```json\n{\n  ...\n  \"roles\": [\n    \"PrivilegedAdmin\",\n    \"RegularUser\",]\n  ...\n}\n```\n\nA common way to access the role names is documented in the [ID token claims](#id-token-claims) section.\n\nMicrosoft Entra ID Boot Starter v3.3 and higher also parses the roles claim automatically and adds each role to the signed-in user's `Authorities`, prefixing each with the string `APPROLE_`. This configuration enables developers to make use of app roles with Spring `PrePost` condition annotations using the `hasAuthority` method. For example, you can find the following `@PreAuthorize` conditions demonstrated in **SampleController.java**:\n\n```java\n@GetMapping(path = \"/admin_only\")\n@PreAuthorize(\"hasAuthority('APPROLE_PrivilegedAdmin')\")\npublic String adminOnly(Model model) {\n    // restrict to users who have PrivilegedAdmin app role only\n}\n@GetMapping(path = \"/regular_user\")\n@PreAuthorize(\"hasAnyAuthority('APPROLE_PrivilegedAdmin','APPROLE_RegularUser')\")\npublic String regularUser(Model model) {\n    // restrict to users who have any of RegularUser or PrivilegedAdmin app roles\n}\n```\n\nThe following code gets a full list of authorities for a given user:\n\n ```java\n@GetMapping(path = \"/some_path\")\npublic String tokenDetails(@AuthenticationPrincipal OidcUser principal) {\n    Collection<? extends GrantedAuthority> authorities = principal.getAuthorities();\n}\n```\n\n### Sign-in and sign-out links\n\nFor sign-in, the app makes a request to the Microsoft Entra ID sign-in endpoint automatically configured by Microsoft Entra ID Spring Boot Starter client library for Java, as shown in the following example:\n\n```html\n<a class=\"btn btn-success\" href=\"/oauth2/authorization/azure\">Sign In</a>\n```\n\nFor sign-out, the app makes a POST request to the `logout` endpoint, as shown in the following example:\n\n```html\n<form action=\"#\" th:action=\"@{/logout}\" method=\"post\">\n  <input class=\"btn btn-warning\" type=\"submit\" value=\"Sign Out\" />\n</form>\n```\n\n### Authentication-dependent UI elements\n\nThe app has some simple logic in the UI template pages for determining content to display based on whether the user is authenticated, as shown in the following example using Spring Security Thymeleaf tags:\n\n```html\n<div sec:authorize=\"isAuthenticated()\">\n  this content only shows to authenticated users\n</div>\n<div sec:authorize=\"isAnonymous()\">\n  this content only shows to not-authenticated users\n</div>\n```\n\n### Protect routes with AADWebSecurityConfigurerAdapter\n\nBy default, the app protects the **ID Token Details**, **Admins Only**, and **Regular Users** pages so that only signed-in users can access them. The app configures these routes from the `app.protect.authenticated` property from the **application.yml** file. To configure your app's specific requirements, you can extend `AADWebSecurityConfigurationAdapter` in one of your classes. For an example, see this app's [SecurityConfig](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/4-spring-web-app/3-Authorization-II/roles/src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/SecurityConfig.java) class, shown in the following code:\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class SecurityConfig extends AADWebSecurityConfigurerAdapter{\n  @Value( \"${app.protect.authenticated}\" )\n  private String[] protectedRoutes;\n\n    @Override\n    public void configure(HttpSecurity http) throws Exception {\n    // use required configuration form AADWebSecurityAdapter.configure:\n    super.configure(http);\n    // add custom configuration:\n    http.authorizeRequests()\n      .antMatchers(protectedRoutes).authenticated()     // limit these pages to authenticated users (default: /token_details, /admin_only, /regular_user)\n      .antMatchers(\"/**\").permitAll();                  // allow all other routes.\n    }\n}\n```\n\n## More information\n\n- [Microsoft identity platform documentation](/entra/identity-platform/)\n- [Overview of Microsoft Authentication Library (MSAL)](/entra/identity-platform/msal-overview)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Quickstart: Configure a client application to access web APIs](/entra/identity-platform/quickstart-configure-app-access-web-apis)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [Application and service principal objects in Azure Active Directory](/entra/identity-platform/app-objects-and-service-principals)\n- [National Clouds](/entra/identity-platform/authentication-national-cloud#app-registration-endpoints)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n- [Azure Active Directory Spring Boot Starter client library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory)\n- [Microsoft Authentication Library for Java (MSAL4J)](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [MSAL4J Wiki](https://github.com/AzureAD/microsoft-authentication-library-for-java/wiki)\n- [ID tokens](/entra/identity-platform/id-tokens)\n- [Access tokens in the Microsoft identity platform](/entra/identity-platform/access-tokens)\n\nFor more information about how OAuth 2.0 protocols work in this scenario and other scenarios, see [Authentication Scenarios for Microsoft Entra ID](/entra/identity-platform/authentication-flows-app-scenarios).\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-app-service-deploy.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\nYou're now ready to deploy your app to Azure App Service. Use the following command to make sure you're signed in to your Azure environment to execute the deployment:\n\n```azurecli\naz login\n```\n\nWith all the configuration ready in your **pom.xml** file, you can now use the following command to deploy your Java app to Azure:\n\n```bash\nmvn package azure-webapp:deploy\n```\n\nAfter deployment is completed, your application is ready at `http://<your-app-name>.azurewebsites.net/`. Open the URL with your local web browser, where you should see the start page of the `msal4j-servlet-auth` application.\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-app-service-intro.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\n- [Maven Plugin for Azure App Service apps](https://github.com/microsoft/azure-maven-plugins/blob/develop/azure-webapp-maven-plugin/README.md)\n\n  If Maven isn't your preferred development tool, see the following similar tutorials that use other tools:\n\n  - [IntelliJ IDEA](../../toolkit-for-intellij/create-hello-world-web-app.md)\n  - [Eclipse](../../toolkit-for-eclipse/create-hello-world-web-app.md)\n  - [Visual Studio Code](https://code.visualstudio.com/docs/java/java-webapp)\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-app-service-prepare-deploy.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\nWhen you deploy your application to App Service, your redirect URL changes to the redirect URL of your deployed app instance. Use the following steps to change these settings in your properties file:\n\n1. Navigate to your app's **authentication.properties** file and change the value of `app.homePage` to your deployed app's domain name, as shown in the following example. For example, if you chose `example-domain` for your app name in the previous step, you must now use `https://example-domain.azurewebsites.net` for the `app.homePage` value. Be sure that you've also changed the protocol from `http` to `https`.\n\n   ```ini\n   # app.homePage is by default set to dev server address and app context path on the server\n   # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net\n   app.homePage=https://<your-app-name>.azurewebsites.net\n   ```\n\n1. After saving this file, use the following command to rebuild your app:\n\n   ```bash\n   mvn clean package\n   ```\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-app-service-remove-secret.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.custom: devx-track-java, devx-track-extended-java, devx-track-azurecli\n---\n\nThe **authentication.properties** file of the application currently holds the value of your client secret in the `aad.secret` parameter. It isn't good practice to keep this value in this file. You might also be taking a risk if you commit it to a Git repository.\n\nAs an security extra step, you can store this value in [Azure Key Vault](/azure/key-vault/general/basic-concepts) and use [Key Vault References](/azure/app-service/app-service-key-vault-references?tabs=azure-cli) to make it available in your application.\n\nUse the following steps to move the value of `aad.secret` to Key Vault and use it in your code:\n\n1. Use the following commands to create an Azure Key Vault instance:\n\n   ```azurecli\n   export RESOURCE_GROUP=<your-resource-group-name>\n   export KEY_VAULT=<your-key-vault-name>\n   az keyvault create \\\n       --resource-group $RESOURCE_GROUP \\\n       --name $KEY_VAULT\n   ```\n\n1. Use the following commands to add the secret value of `aad.secret` to your key vault as a new secret:\n\n   ```azurecli\n   az keyvault secret set \\\n       --vault-name $KEY_VAULT \\\n       --name \"AADSECRET\" \\\n       --value \"<the-value-of-your-client-secret>\"\n   ```\n\n1. You now need to give your app access to your key vault. To do this task, first create a new identity for your app by using the following commands:\n\n   ```azurecli\n   export WEB_APP_NAME=<your-web-app-name>\n   az webapp identity assign \\\n       --resource-group $RESOURCE_GROUP \\\n       --name $WEB_APP_NAME\n   ```\n\n1. Use the following commands to give this identity `get` and `list` permission on the secrets in your Key Vault:\n\n   ```azurecli\n   export IDENTITY=$(az webapp identity show \\\n       --resource-group $RESOURCE_GROUP \\\n       --name $WEB_APP_NAME \\\n       --query principalId \\\n       --output tsv)\n   az keyvault set-policy \\\n       --resource-group $RESOURCE_GROUP \\\n       --name $KEY_VAULT \\\n       --secret-permissions get list \\\n       --object-id $IDENTITY\n   ```\n\n1. Use the following command to create an application setting in your app that uses a key vault reference to the secret in your key vault. This setting makes the value of the secret available to your app as an environment variable.\n\n   ```azurecli\n   az webapp config appsettings set \\\n       --resource-group $RESOURCE_GROUP \\\n       --name $WEB_APP_NAME \\\n       --settings AADSECRET='@Microsoft.KeyVault(VaultName=$KEY_VAULT;SecretName=AADSECRET)'\n   ```\n\n1. Use the following code to load this value from the environment variables. In the **\\src\\main\\java\\com\\microsoft\\azuresamples\\msal4j\\helpers\\Config.java** file, on line 41, change the current statement to the following line:\n\n   ```java\n   public static final String SECRET = System.getenv(\"AADSECRET\");\n   ```\n\n1. You can now delete the `aad.secret` key and value from the **authentication.properties** file.\n\n1. Rebuild the code by using the following command:\n\n   ```bash\n   mvn clean package\n   ```\n\n1. Redeploy the application by using the following command:\n\n   ```bash\n   mvn package azure-webapp:deploy\n   ```\n\nYour deployment is now complete.\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-app-service-update-registration.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\nBecause the redirect URI changes to your deployed app to Azure App Service, you also need to change the redirect URI in your Microsoft Entra ID app registration. Use the following steps to make this change:\n\n1. Navigate to the Microsoft identity platform for developers [App registrations](https://go.microsoft.com/fwlink/?linkid=2083908) page.\n\n1. Use the search box to search for your app registration - for example, `java-servlet-webapp-authentication`.\n\n1. Open your app registration by selecting its name.\n\n1. Select **Authentication** from the menu.\n\n1. In the **Web** - **Redirect URIs** section, select **Add URI**.\n\n1. Fill out the URI of your app, appending `/auth/redirect` - for example, `https://<your-app-name>.azurewebsites.net/auth/redirect`.\n\n1. Select **Save**.\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-container-apps-cli-setup.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nTo sign in to Azure from the CLI, run the following command and follow the prompts to complete the authentication process.\n\n```azurecli\naz login\n```\n\nTo ensure you're running the latest version of the CLI, run the upgrade command.\n\n```azurecli\naz upgrade\n```\n\nNext, install or update the Azure Container Apps extension for the CLI.\n\nIf you receive errors about missing parameters when you run `az containerapp` commands in Azure CLI, be sure you have the latest version of the Azure Container Apps extension installed.\n\n```azurecli\naz extension add --name containerapp --upgrade\n```\n\n> [!NOTE]\n> Starting in May 2024, Azure CLI extensions no longer enable preview features by default. To access Container Apps [preview features](/azure/container-apps/whats-new), install the Container Apps extension with `--allow-preview true`.\n>\n> ```azurecli\n> az extension add --name containerapp --upgrade --allow-preview true\n> ```\n\nNow that the current extension or module is installed, register the `Microsoft.App` and `Microsoft.OperationalInsights` namespaces.\n\n> [!NOTE]\n> Azure Container Apps resources have migrated from the `Microsoft.Web` namespace to the `Microsoft.App` namespace. Refer to [Namespace migration from Microsoft.Web to Microsoft.App in March 2022](https://github.com/microsoft/azure-container-apps/issues/109) for more details.\n\n```azurecli\naz provider register --namespace Microsoft.App\naz provider register --namespace Microsoft.OperationalInsights\n```\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-container-apps-create-env-variables.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nNow that your Azure CLI setup is complete, you can define the environment variables that are used throughout this article.\n\nDefine the following variables in your bash shell.\n\n```azurecli\nexport RESOURCE_GROUP=\"ms-identity-containerapps\"\nexport LOCATION=\"canadacentral\"\nexport ENVIRONMENT=\"env-ms-identity-containerapps\"\nexport API_NAME=\"ms-identity-api\"\nexport JAR_FILE_PATH_AND_NAME=\"./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar\"\n```\n\nCreate a resource group.\n\n```azurecli\naz group create  \\\n    --name $RESOURCE_GROUP \\\n    --location $LOCATION \\\n```\n\nCreate an environment with an auto-generated Log Analytics workspace.\n\n```azurecli\naz containerapp env create \\\n    --name $ENVIRONMENT \\\n    --resource-group $RESOURCE_GROUP \\\n    --location $LOCATION\n```\n\nShow the default domain of the container app environment. Note down this domain to use in later sections.\n\n```azurecli\naz containerapp env show \\\n    --name $ENVIRONMENT \\\n    --resource-group $RESOURCE_GROUP \\\n    --query properties.defaultDomain\n```\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-container-apps-deploy.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nDeploy the JAR package to Azure Container Apps.\n\n> [!NOTE]\n> If necessary, you can specify the JDK version in the Java build environment variables. For more information, see [Build environment variables for Java in Azure Container Apps](/azure/container-apps/java-build-environment-variables).\n\nNow you can deploy your WAR file with the `az containerapp up` CLI command.\n\n```azurecli\naz containerapp up \\\n    --name $API_NAME \\\n    --resource-group $RESOURCE_GROUP \\\n    --location $LOCATION \\\n    --environment $ENVIRONMENT \\\n    --artifact <JAR_FILE_PATH_AND_NAME> \\\n    --ingress external \\\n    --target-port 8080 \\\n    --query properties.configuration.ingress.fqdn\n```\n\n> [!NOTE]\n> The default JDK version is 17. If you need to change the JDK version for compatibility with your application, you can use the `--build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION>` argument to adjust the version number.\n\nFor more build environment variables, see [Build environment variables for Java in Azure Container Apps](/azure/container-apps/java-build-environment-variables).\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-container-apps-intro.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- An Azure account. If you don't have one, [create a free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn). You need the `Contributor` or `Owner` permission on the Azure subscription to proceed. For more information, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal).\n- The [Azure CLI](/cli/azure/install-azure-cli).\n- The Azure Container Apps CLI extension, version `0.3.47` or higher. To install the latest version, use the `az extension add --name containerapp --upgrade --allow-preview` command.\n- The [Java Development Kit](/java/openjdk/install), version 17 or higher.\n- [Maven](https://maven.apache.org/download.cgi).\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-container-apps-prepare-deploy.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nWhen you deploy your application to Azure Container Apps, your redirect URL changes to the redirect URL of your deployed app instance in Azure Container Apps. Use the following steps to change these settings in your **application.yml** file:\n\n1. Navigate to your app's **src\\main\\resources\\application.yml** file and change the value of `post-logout-redirect-uri` to your deployed app's domain name, as shown in the following example. Be sure to replace `<API_NAME>` and `<default-domain-of-container-app-environment>` with your actual values. For example, with the default domain for your Azure Container App environment from the previous step and `ms-identity-api` for your app name, you would use `https://ms-identity-api.<default-domain>` for the `post-logout-redirect-uri` value.\n\n   ```ini\n   post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>\n   ```\n\n1. After saving this file, use the following command to rebuild your app:\n\n   ```bash\n   mvn clean package\n   ```\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-container-apps-prepare.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nUse the following steps to prepare the project:\n\n1. Use the following [Maven](https://maven.apache.org/what-is-maven.html) command to build the project:\n\n   ```bash\n   mvn clean verify\n   ```\n\n1. Run the sample project locally by using the following command:\n\n   ```bash\n   mvn spring-boot:run\n   ```\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-container-apps-secret-note.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n> [!IMPORTANT]\n> The **application.yml** file of the application currently holds the value of your client secret in the `client-secret` parameter. It isn't good practice to keep this value in this file. You might also be taking a risk if you commit the file to a Git repository. For the recommended approach, see [Manage secrets in Azure Container Apps](/azure/container-apps/manage-secrets).\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-container-apps-update-registration.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nBecause the redirect URI changes to your deployed app on Azure Container Apps, you also need to change the redirect URI in your Microsoft Entra ID app registration. Use the following steps to make this change:\n\n1. Navigate to the Microsoft identity platform for developers [App registrations](https://go.microsoft.com/fwlink/?linkid=2083908) page.\n\n1. Use the search box to search for your app registration - for example, `java-servlet-webapp-authentication`.\n\n1. Open your app registration by selecting its name.\n\n1. Select **Authentication** from the menu.\n\n1. In the **Web** - **Redirect URIs** section, select **Add URI**.\n\n1. Fill out the URI of your app, appending `/login/oauth2/code/` - for example, `https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/`.\n\n1. Select **Save**.\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-container-apps-validate.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nIn this example, the `containerapp up` command includes the `--query properties.configuration.ingress.fqdn` argument, which returns the fully qualified domain name (FQDN), also known as the app's URL. Use the following steps to check the app's logs to investigate any deployment issue:\n\n1. Access the output application URL from the **Outputs** page of the **Deployment** section.\n\n1. From the navigation pane of the Azure Container Apps instance **Overview** page, select **Logs** to check the app's logs.\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-jboss-app-service-configure-maven.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\nThe deployment process to Azure App Service uses your Azure credentials from the Azure CLI automatically. If the Azure CLI isn't installed locally, then the Maven plugin authenticates with OAuth or device sign-in. For more information, see [authentication with Maven plugins](https://github.com/microsoft/azure-maven-plugins/wiki/Authentication).\n\nUse the following steps to configure the plugin:\n\n1. Run the Maven command shown next to configure the deployment. This command helps you to set up the App Service operating system, Java version, and Tomcat version.\n\n   ```bash\n   mvn com.microsoft.azure:azure-webapp-maven-plugin:2.12.0:config\n   ```\n\n1. For **Create new run configuration**, press <kbd>Y</kbd>, then press <kbd>Enter</kbd>.\n\n1. For **Define value for OS**, press <kbd>2</kbd> for Linux, then press <kbd>Enter</kbd>.\n\n1. For **Define value for javaVersion**, press <kbd>2</kbd> for Java 11, then press <kbd>Enter</kbd>.\n\n1. For **Define value for webContainer**, press <kbd>1</kbd> for JBosseap7, then press <kbd>Enter</kbd>.\n\n1. For **Define value for pricingTier**, press **Enter** to select the default **P1v3** tier.\n\n1. For **Confirm**, press <kbd>Y</kbd>, then press <kbd>Enter</kbd>.\n\nThe following example shows the output of the deployment process:\n\n```output\nPlease confirm webapp properties\nAppName : msal4j-servlet-auth-1707220080695\nResourceGroup : msal4j-servlet-auth-1707220080695-rg\nRegion : centralus\nPricingTier : P1v3\nOS : Linux\nJava Version: Java 11\nWeb server stack: JBosseap 7\nDeploy to slot : false\nConfirm (Y/N) [Y]:\n[INFO] Saving configuration to pom.\n[INFO] ------------------------------------------------------------------------\n[INFO] BUILD SUCCESS\n[INFO] ------------------------------------------------------------------------\n[INFO] Total time:  26.196 s\n[INFO] Finished at: 2024-02-06T11:48:16Z\n[INFO] ------------------------------------------------------------------------\n```\n\nAfter you've confirmed your choices, the plugin adds the plugin configuration and required settings to your project's **pom.xml** file to configure your app to run in Azure App Service.\n\nThe relevant portion of the **pom.xml** file should look similar to the following example:\n\n```xml\n<build>\n    <plugins>\n        <plugin>\n            <groupId>com.microsoft.azure</groupId>\n            <artifactId>>azure-webapp-maven-plugin</artifactId>\n            <version>x.xx.x</version>\n            <configuration>\n                <schemaVersion>v2</schemaVersion>\n                <resourceGroup>your-resourcegroup-name</resourceGroup>\n                <appName>your-app-name</appName>\n            ...\n            </configuration>\n        </plugin>\n    </plugins>\n</build>\n```\n\nYou can modify the configurations for App Service directly in your **pom.xml**. Some common configurations are listed in the following table:\n\n| Property         | Required | Description                                                                                                                                                                                                                                                                     | Version |\n|------------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|\n| `schemaVersion`  | false    | The version of the configuration schema. Supported values are `v1` and `v2`.                                                                                                                                                                                                    | 1.5.2   |\n| `subscriptionId` | false    | The subscription ID.                                                                                                                                                                                                                                                            | 0.1.0+  |\n| `resourceGroup`  | true     | The Azure resource group for your app.                                                                                                                                                                                                                                          | 0.1.0+  |\n| `appName`        | true     | The name of your app.                                                                                                                                                                                                                                                           | 0.1.0+  |\n| `region`         | false    | The region in which to host your app. The default value is `centralus`. For valid regions, see [Supported Regions](https://azure.microsoft.com/global-infrastructure/services/?products=app-service).                                                                           | 0.1.0+  |\n| `pricingTier`    | false    | The pricing tier for your app. The default value is **P1v2** for a production workload. The recommended minimum value for Java development and testing is `B2`. For more information, see [App Service Pricing](https://azure.microsoft.com/pricing/details/app-service/linux/) | 0.1.0+  |\n| `runtime`        | false    | The runtime environment configuration. For more information, see [Configuration Details](https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Web-App:-Configuration-Details).                                                                                           | 0.1.0+  |\n| `deployment`     | false    | The deployment configuration. For more information, see [Configuration Details](https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Web-App:-Configuration-Details).                                                                                                    | 0.1.0+  |\n\nFor the complete list of configurations, see the plugin reference documentation. All the Azure Maven plugins share a common set of configurations. For these configurations, see [Common Configurations](https://github.com/microsoft/azure-maven-plugins/wiki/Common-Configuration). For configurations specific to Azure App Service, see [Azure app: Configuration Details](https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Web-App:-Configuration-Details).\n\nBe sure to save aside the `appName` and `resourceGroup` values for later use.\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-jboss-app-service-secret-note.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\n> [!IMPORTANT]\n> In this same **authentication.properties** file you have a setting for your `aad.secret`. It isn't a good practice to deploy this value to App Service. Neither is it a good practice to leave this value in your code and potentially push it up to your git repository. For removing this secret value from your code, you can find more detailed guidance in the [Deploy to App Service - Remove secret](../deploy-jboss-to-app-service.md#remove-secret-values) section. This guidance adds extra steps for pushing the secret value to [Key Vault](/azure/key-vault/general/basic-concepts) and to use [Key Vault References](/azure/app-service/app-service-key-vault-references?tabs=azure-cli).\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-jboss-app-service.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\n## Run the sample\n\n### [Deploy to Azure App Service](#tab/appsvc)\n\nThe following sections show you how to deploy the sample to Azure App Service.\n\n### Prerequisites\n\n[!INCLUDE [deploy-app-service-intro.md](./deploy-app-service-intro.md)]\n\n### Configure the Maven plugin\n\n[!INCLUDE [deploy-jboss-app-service-configure-maven.md](./deploy-jboss-app-service-configure-maven.md)]\n\n### Prepare the app for deployment\n\n[!INCLUDE [deploy-app-service-prepare-deploy.md](./deploy-app-service-prepare-deploy.md)]\n\n[!INCLUDE [deploy-jboss-app-service-secret-note.md](./deploy-jboss-app-service-secret-note.md)]\n\n### Update your Microsoft Entra ID app registration\n\n[!INCLUDE [deploy-app-service-update-registration.md](./deploy-app-service-update-registration.md)]\n\n### Deploy the app\n\n[!INCLUDE [deploy-app-service-deploy.md](./deploy-app-service-deploy.md)]\n\n### [Run locally](#tab/local)\n\nBefore you can deploy to JBoss, use the following steps to make some configuration changes in the sample itself, and then build or rebuild the package:\n\n1. In the sample, find the **application.properties** or **authentication.properties** file where you configured the client ID, tenant, redirect URL, and so on.\n\n1. In this file, change references to `localhost:8080` or `localhost:8443` to the URL and port that JBoss runs on, which by default should be `localhost:9990`.\n\n1. You also need to make the same change in the Azure app registration, where you set it in the Azure portal as the **Redirect URI** value on the **Authentication** tab.\n\nUse the following steps to deploy the sample to JBoss EAP via the web console:\n\n1. Start the JBoss server with **%JBOSS_HOME%\\bin\\standalone.bat**.\n\n1. Navigate to the JBoss web console in your browser at `http://localhost:9990`.\n\n1. Go to **Deployments**, select **Add**, and then upload the **.war** you built.\n\n1. Most of the default settings should be fine except that you should name the application to match the redirect URI you set in the sample configuration or Azure app registration. That is, if the redirect URI is `http://localhost:9990/msal4j-servlet-auth/`, then you should name the application `msal4j-servlet-auth`.\n\n1. Select the **.war** file you uploaded, select **En/Disable** and **Confirm** to start the application.\n\n1. After the application starts, navigate to `http://localhost:9990/<application-name>/`, and you should be able to access the application.\n\n---\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-tomcat-app-service-configure-maven.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\nWhen you deploy to Azure App Service, the deployment automatically uses your Azure credentials from the Azure CLI. If the Azure CLI isn't installed locally, then the Maven plugin authenticates with OAuth or device sign-in. For more information, see [authentication with Maven plugins](https://github.com/microsoft/azure-maven-plugins/wiki/Authentication).\n\nUse the following steps to configure the plugin:\n\n1. Run the following command to configure the deployment. This command helps you to set up the Azure App Service operating system, Java version, and Tomcat version.\n\n   ```bash\n   mvn com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:config\n   ```\n\n1. For **Create new run configuration**, press <kbd>Y</kbd>, then press <kbd>Enter</kbd>.\n\n1. For **Define value for OS**, press <kbd>1</kbd> for Windows, or **2** for Linux, then press <kbd>Enter</kbd>.\n\n1. For **Define value for javaVersion**, press <kbd>2</kbd> for Java 11, then press <kbd>Enter</kbd>.\n\n1. For **Define value for webContainer**, press <kbd>4</kbd> for Tomcat 9.0, then press <kbd>Enter</kbd>.\n\n1. For **Define value for pricingTier**, press **Enter** to select the default **P1v2** tier.\n\n1. For **Confirm**, press <kbd>Y</kbd>, then press <kbd>Enter</kbd>.\n\nThe following example shows the output of the deployment process:\n\n```output\nPlease confirm webapp properties\nAppName : msal4j-servlet-auth-1707209552268\nResourceGroup : msal4j-servlet-auth-1707209552268-rg\nRegion : centralus\nPricingTier : P1v2\nOS : Linux\nJava Version: Java 11\nWeb server stack: Tomcat 9.0\nDeploy to slot : false\nConfirm (Y/N) [Y]: [INFO] Saving configuration to pom.\n[INFO] ------------------------------------------------------------------------\n[INFO] BUILD SUCCESS\n[INFO] ------------------------------------------------------------------------\n[INFO] Total time:  37.112 s\n[INFO] Finished at: 2024-02-06T08:53:02Z\n[INFO] ------------------------------------------------------------------------\n```\n\nAfter you've confirmed your choices, the plugin adds the required plugin element and settings to your project's **pom.xml** file to configure your app to run in Azure App Service.\n\nThe relevant portion of the **pom.xml** file should look similar to the following example:\n\n```xml\n<build>\n    <plugins>\n        <plugin>\n            <groupId>com.microsoft.azure</groupId>\n            <artifactId>>azure-webapp-maven-plugin</artifactId>\n            <version>x.xx.x</version>\n            <configuration>\n                <schemaVersion>v2</schemaVersion>\n                <resourceGroup>your-resourcegroup-name</resourceGroup>\n                <appName>your-app-name</appName>\n            ...\n            </configuration>\n        </plugin>\n    </plugins>\n</build>\n```\n\nYou can modify the configurations for App Service directly in your **pom.xml**. Some common configurations are listed in the following table:\n\n| Property         | Required | Description                                                                                                                                                                                                                                                                        |\n|------------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `subscriptionId` | false    | The subscription ID.                                                                                                                                                                                                                                                               |\n| `resourceGroup`  | true     | The Azure resource group for your app.                                                                                                                                                                                                                                             |\n| `appName`        | true     | The name of your app.                                                                                                                                                                                                                                                              |\n| `region`         | false    | The region in which to host your app. The default value is `centralus`. For valid regions, see [Supported Regions](https://azure.microsoft.com/global-infrastructure/services/?products=app-service).                                                                              |\n| `pricingTier`    | false    | The pricing tier for your app. The default value is `P1v2` for a production workload. The recommended minimum value for Java development and testing is `B2`. For more information, see [App Service Pricing](https://azure.microsoft.com/pricing/details/app-service/linux/). |\n| `runtime`        | false    | The runtime environment configuration. For more information, see [Configuration Details](https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Web-App:-Configuration-Details).                                                                                              |\n| `deployment`     | false    | The deployment configuration. For more information, see [Configuration Details](https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Web-App:-Configuration-Details).                                                                                                       |\n\nFor the complete list of configurations, see the plugin reference documentation. All the Azure Maven plugins share a common set of configurations. For these configurations, see [Common Configurations](https://github.com/microsoft/azure-maven-plugins/wiki/Common-Configuration). For configurations specific to Azure App Service, see [Azure app: Configuration Details](https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Web-App:-Configuration-Details).\n\nBe sure to save aside the `appName` and `resourceGroup` values for later use.\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-tomcat-app-service-secret-note.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\n> [!IMPORTANT]\n> In this same **authentication.properties** file, you have a setting for your `aad.secret`. It isn't a good practice to deploy this value to App Service. Neither is it a good practice to leave this value in your code and potentially push it up to your git repository. For removing this secret value from your code, you can find more detailed guidance in the [Deploy to App Service - Remove secret](../deploy-tomcat-to-app-service.md#remove-secret-values) section. This guidance adds extra steps for pushing the secret value to [Key Vault](/azure/key-vault/general/basic-concepts) and to use [Key Vault References](/azure/app-service/app-service-key-vault-references?tabs=azure-cli).\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-tomcat-app-service.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\n## Run the sample\n\n### [Deploy to Azure App Service](#tab/appsvc)\n\nThe following sections show you how to deploy the sample to Azure App Service.\n\n### Prerequisites\n\n[!INCLUDE [deploy-app-service-intro.md](./deploy-app-service-intro.md)]\n\n### Configure the Maven plugin\n\n[!INCLUDE [deploy-tomcat-app-service-configure-maven.md](./deploy-tomcat-app-service-configure-maven.md)]\n\n### Prepare the app for deployment\n\n[!INCLUDE [deploy-app-service-prepare-deploy.md](./deploy-app-service-prepare-deploy.md)]\n\n[!INCLUDE [deploy-tomcat-app-service-secret-note.md](./deploy-tomcat-app-service-secret-note.md)]\n\n### Update your Microsoft Entra ID app registration\n\n[!INCLUDE [deploy-app-service-update-registration.md](./deploy-app-service-update-registration.md)]\n\n### Deploy the app\n\n[!INCLUDE [deploy-app-service-deploy.md](./deploy-app-service-deploy.md)]\n\n### [Run locally](#tab/local)\n\nTo run the sample on Tomcat, use the following steps:\n\n1. In your Tomcat installation, ensure that there's an entry in **tomcat/conf/server.xml** for the address you want to host your application on.\n\n   By default, the samples just expect to connect to `http://localhost:8080 or https://localhost:8443`, as defined in the `app.homePage` value in the **authentication.properties** file.\n\n1. Copy the **.war** file you generated with Maven to the **/webapps/** directory in your Tomcat installation, and start the Tomcat server.\n\n1. After Tomcat starts, open your browser and navigate to whatever URL you defined in step 1 and you should be able to access the application.\n\n---\n"
  },
  {
    "path": "articles/java/identity/includes/deploy-websphere.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\n---\n\n## Run the sample\n\nThese instructions assume that you installed WebSphere and set up a server. You can use the guidance at [Deploy WebSphere Application Server (traditional) Cluster on Azure Virtual Machines](../../ee/traditional-websphere-application-server-virtual-machines.md) for a basic server setup.\n\nBefore you can deploy to WebSphere, use the following steps to make some configuration changes in the sample itself and then build or rebuild the package:\n\n1. Navigate to your app's **authentication.properties** file and change the value of `app.homePage` to your server URL and port number you're planning to use, as shown in the following example:\n\n   ```ini\n   # app.homePage is by default set to dev server address and app context path on the server\n   # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net\n   app.homePage=https://<server-url>:<port-number>/msal4j-servlet-auth/\n   ```\n\n1. After saving this file, use the following command to rebuild your app:\n\n   ```bash\n   mvn clean package\n   ```\n\n1. After the code finishes building, copy the **.war** file over to your target server's file system.\n\nYou also need to make the same change in the Azure app registration, where you set it in the Azure portal as the **Redirect URI** value on the **Authentication** tab.\n\n1. Navigate to the Microsoft identity platform for developers [App registrations](https://go.microsoft.com/fwlink/?linkid=2083908) page.\n\n1. Use the search box to search for your app registration - for example, `java-servlet-webapp-authentication`.\n\n1. Open your app registration by selecting its name.\n\n1. Select **Authentication** from the menu.\n\n1. In the **Web** - **Redirect URIs** section, select **Add URI**.\n\n1. Fill out the URI of your app, appending **/auth/redirect** - for example, `https://<server-url>:<port-number>/auth/redirect`.\n\n1. Select **Save**.\n\nUse the following steps to deploy the sample using the WebSphere's Integrated Solutions Console:\n\n1. On the **Applications** tab, select **New Application**, then **New Enterprise Application**.\n\n1. Choose the **.war** file you built, then select **Next** until you get to the **Map context roots for Web modules** installation step. The other default settings should be fine.\n\n1. For the context root, set it to the same value as after the port number in the 'Redirect URI' you set in sample configuration/Azure app registration. That is, if the redirect URI is `http://<server-url>:9080/msal4j-servlet-auth/`, then the context root should be `msal4j-servlet-auth`.\n\n1. Select **Finish**.\n\n1. After the application finishes installing, go to the **WebSphere enterprise applications** section of the **Applications** tab.\n\n1. Select the **.war** file you installed from the list of applications and then select **Start** to deploy.\n\n1. After it finishes deploying, navigate to `http://<server-url>:9080/{whatever you set as the context root}` and you should be able to see the application.\n"
  },
  {
    "path": "articles/java/identity/includes/enable-java-servlet-webapp-authentication-azure-ad-b2c-explore.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Explore the sample\n\nUse the following steps to explore the sample:\n\n1. Notice the signed-in or signed-out status displayed at the center of the screen.\n1. Select the context-sensitive button in the corner. This button reads **Sign In** when you first run the app.\n1. On the next page, follow the instructions and sign in with an account of your chosen identity provider.\n1. Notice that the context-sensitive button now says **Sign out** and displays your username.\n1. Select **ID Token Details** to see some of the ID token's decoded claims.\n1. You also have the option of editing your profile. Select the link to edit details like your display name, place of residence, and profession.\n1. Use the button in the corner to sign out.\n1. After signing out, navigate to the following URL for the token details page: `http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_token_details`. Here, you can observe how the app displays a `401: unauthorized` error instead of the ID token claims.\n\n## About the code\n\nThis sample demonstrates how to use MSAL4J to sign in users into your Azure AD B2C tenant.\n\n### Contents\n\nThe following table shows the contents of the sample project folder:\n\n| File/folder                 | Description                                                                                          |\n|-----------------------------|------------------------------------------------------------------------------------------------------|\n| **AuthHelper.java**           | Helper functions for authentication.                                                                 |\n| **Config.java**               | Runs on startup and configures properties reader and logger.                                         |\n| **authentication.properties** | Microsoft Entra ID and program configuration.                                                        |\n| **AuthenticationFilter.java** | Redirects unauthenticated requests to protected resources to a 401 page.                             |\n| **MsalAuthSession**           | Instantiated with an `HttpSession`. Stores all MSAL related session attributes in session attribute. |\n| **\\*Servlet.java**            | All of the endpoints available are defined in Java classes with names ending in `Servlet.`.          |\n| **CHANGELOG.md**              | List of changes to the sample.                                                                       |\n| **CONTRIBUTING.md**           | Guidelines for contributing to the sample.                                                           |\n| **LICENSE**                   | The license for the sample.                                                                          |\n\n### ConfidentialClientApplication\n\nA `ConfidentialClientApplication` instance is created in the **AuthHelper.java** file, as shown in the following example. This object helps craft the Azure AD B2C authorization URL and also helps exchange the authentication token for an access token.\n\n```java\nIClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);\nconfClientInstance = ConfidentialClientApplication\n                     .builder(CLIENT_ID, secret)\n                     .b2cAuthority(AUTHORITY + policy)\n                     .build();\n```\n\nThe following parameters are used for instantiation:\n\n- The Client ID of the app.\n- The client secret, which is a requirement for Confidential Client Applications.\n- The Azure AD B2C Authority concatenated with the appropriate `UserFlowPolicy` for sign-up, sign-in, profile-edit, or password-reset.\n\nIn this sample, these values are read from the **authentication.properties** file using a properties reader in the **Config.java** file.\n\n### Step-by-step walkthrough\n\nThe following steps provide a walkthrough of the app's functionality:\n\n1. The first step of the sign-in process is to send a request to the `/authorize` endpoint for your Azure Active Directory B2C tenant. The MSAL4J `ConfidentialClientApplication` instance is used to construct an authorization request URL, and the app redirects the browser to this URL, as shown in the following example:\n\n   ```java\n   final ConfidentialClientApplication client = getConfidentialClientInstance(policy);\n   final AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters\n       .builder(REDIRECT_URI, Collections.singleton(SCOPES)).responseMode(ResponseMode.QUERY)\n       .prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();\n\n   final String redirectUrl = client.getAuthorizationRequestUrl(parameters).toString();\n   Config.logger.log(Level.INFO, \"Redirecting user to {0}\", redirectUrl);\n   resp.setStatus(302);\n   resp.sendRedirect(redirectUrl);\n   ```\n\n   The following list describes the features of this code:\n\n   - `AuthorizationRequestUrlParameters`: Parameters that must be set in order to build an AuthorizationRequestUrl.\n\n   - `REDIRECT_URI`: Where Azure AD B2C redirects the browser - along with the auth code - after collecting the user credentials.\n\n   - `SCOPES`: [Scopes](/azure/active-directory-b2c/access-tokens#scopes) are permissions requested by the application.\n\n     Normally, the three scopes `openid profile offline_access` would suffice for receiving an ID token response. However, MSAL4J requires all responses from Azure AD B2C to also contain an access token.\n\n     In order for Azure AD B2C to dispense an access token as well as an ID token, the request must include an additional resource scope. Because this app doesn't actually require an external resource scope, it adds its own client ID as a fourth scope in order to receive an access token.\n\n     You can find a full list of scopes requested by the app in the **authentication.properties** file.\n\n   - `ResponseMode.QUERY`: Azure AD B2C can return the response as form params in an HTTP POST request or as query string params in an HTTP GET request.\n\n   - `Prompt.SELECT_ACCOUNT`: Azure AD B2C should ask the user to select the account that they intend to authenticate against.\n\n   - `state`: A unique variable set by the app into the session on each token request and destroyed after receiving the corresponding Azure AD B2C redirect callback. The state variable ensures that Azure AD B2C requests to the `/auth_redirect endpoint` are actually from Azure AD B2C authorization requests originating from this app and this session, thereby preventing CSRF attacks. This is done in the **AADRedirectServlet.java** file.\n\n   - `nonce`: A unique variable set by the app into the session on each token request, and destroyed after receiving the corresponding token. This nonce is transcribed to the resulting tokens dispensed Azure AD B2C, thereby ensuring that there's no token-replay attack occurring.\n\n1. The user is presented with a sign-in prompt by Azure Active Directory B2C. If the sign-in attempt is successful, the user's browser is redirected to the app's redirect endpoint. A valid request to this endpoint contains an [authorization code](/azure/active-directory-b2c/authorization-code-flow).\n\n1. The `ConfidentialClientApplication` instance then exchanges this authorization code for an ID token and access token from Azure Active Directory B2C, as shown in the following example:\n\n   ```java\n   final AuthorizationCodeParameters authParams = AuthorizationCodeParameters\n                       .builder(authCode, new URI(REDIRECT_URI))\n                       .scopes(Collections.singleton(SCOPES)).build();\n\n   final ConfidentialClientApplication client = AuthHelper\n           .getConfidentialClientInstance(policy);\n   final Future<IAuthenticationResult> future = client.acquireToken(authParams);\n   final IAuthenticationResult result = future.get();\n   ```\n\n   The following list describes the features of this code:\n\n   - `AuthorizationCodeParameters`: Parameters that must be set in order to exchange the Authorization Code for an ID and/or access token.\n   - `authCode`: The authorization code that was received at the redirect endpoint.\n   - `REDIRECT_URI`: The redirect URI used in the previous step must be passed again.\n   - `SCOPES`: The scopes used in the previous step must be passed again.\n\n1. If `acquireToken` is successful, the token claims are extracted and the nonce claim is validated against the nonce stored in the session, as shown in the following example:\n\n   ```java\n   parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache);\n   validateNonce(msalAuth)\n   processSuccessfulAuthentication(msalAuth);\n   ```\n\n1. If the nonce is successfully validated, authentication status is put into a server-side session, leveraging methods exposed by the `MsalAuthSession` class, as shown in the following example:\n\n   ```java\n   msalAuth.setAuthenticated(true);\n   msalAuth.setUsername(msalAuth.getIdTokenClaims().get(\"name\"));\n   ```\n\n## More information\n\n- [What is Azure Active Directory B2C?](/azure/active-directory-b2c/overview)\n- [Application types that can be used in Active Directory B2C](/azure/active-directory-b2c/application-types)\n- [Recommendations and best practices for Azure Active Directory B2C](/azure/active-directory-b2c/best-practices)\n- [Azure AD B2C session](/azure/active-directory-b2c/session-overview)\n- [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n\nFor more information about how OAuth 2.0 protocols work in this scenario and other scenarios, see [Authentication Scenarios for Microsoft Entra ID](/entra/identity-platform/authentication-flows-app-scenarios).\n"
  },
  {
    "path": "articles/java/identity/includes/enable-java-servlet-webapp-authentication-azure-ad-b2c.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Set up the sample\n\nThe following sections show you how to set up the sample application.\n\n### Clone or download the sample repository\n\nTo clone the sample, open a Bash window and use the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git\ncd 3-java-servlet-web-app/1-Authentication/sign-in-b2c\n```\n\nAlternatively, navigate to the [ms-identity-msal-java-samples](https://github.com/Azure-Samples/ms-identity-msal-java-samples) repository, then download it as a **.zip** file and extract it to your hard drive.\n\n> [!IMPORTANT]\n> To avoid file path length limitations on Windows, clone or extract the repository into a directory near the root of your hard drive.\n\n### Register the sample application with your Azure AD B2C tenant\n\nThe sample comes with a preregistered application for testing purposes. If you would like to use your own Azure AD B2C tenant and application, follow the steps in the following sections to register and configure the application in the Azure portal. Otherwise, continue with the steps for [Run the sample](#run-the-sample).\n\n### Choose the Azure AD B2C tenant where you want to create your applications\n\nTo choose your tenant, use the following steps:\n\n1. Sign in to the [Azure portal](https://portal.azure.com).\n\n1. If your account is present in more than one Azure AD B2C tenant, select your profile in the corner of the Azure portal, and then select **Switch directory** to change your session to the desired Azure AD B2C tenant.\n\n### Create user flows and custom policies\n\nTo create common user flows like sign-up, sign-in, profile edit, and password reset, see [Tutorial: Create user flows in Azure Active Directory B2C](/azure/active-directory-b2c/tutorial-create-user-flows).\n\nYou should consider creating [Custom policies in Azure Active Directory B2C](/azure/active-directory-b2c/custom-policy-overview) as well, however, this is beyond the scope of this tutorial.\n\n### Add external identity providers\n\nSee [Tutorial: Add identity providers to your applications in Azure Active Directory B2C](/azure/active-directory-b2c/tutorial-add-identity-providers).\n\n### Register the app (ms-identity-b2c-java-servlet-webapp-authentication)\n\nTo register the app, use the following steps:\n\n1. Navigate to the [Azure portal](https://portal.azure.com) and select **Azure AD B2C**.\n\n1. Select **App Registrations** on the navigation pane, then select **New registration**.\n\n1. In the **Register an application page** that appears, enter the following application registration information:\n\n   - In the **Name** section, enter a meaningful application name for display to users of the app - for example, `ms-identity-b2c-java-servlet-webapp-authentication`.\n   - Under **Supported account types**, select **Accounts in any organizational directory and personal Microsoft accounts (e.g. Skype, Xbox, Outlook.com)**.\n   - In the **Redirect URI (optional)** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_redirect`.\n\n1. Select **Register** to create the application.\n\n1. On the app's registration page, find and copy the **Application (client) ID** value to use later. You use this value in your app's configuration file or files.\n\n1. Select **Save** to save your changes.\n\n1. On the app's registration page, select **Certificates & secrets** on the navigation pane to open the page where you can generate secrets and upload certificates.\n\n1. In the **Client secrets** section, select **New client secret**.\n\n1. Type a description - for example, **app secret**.\n\n1. Select one of the available durations: **In 1 year**, **In 2 years**, or **Never Expires**.\n\n1. Select **Add**. The generated value is displayed.\n\n1. Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.\n\n### Configure the app (ms-identity-b2c-java-servlet-webapp-authentication) to use your app registration\n\nUse the following steps to configure the app:\n\n> [!NOTE]\n> In the following steps, `ClientID` is the same as `Application ID` or `AppId`.\n\n1. Open the project in your IDE.\n\n1. Open the **./src/main/resources/authentication.properties** file.\n\n1. Find the `aad.clientId` property and replace the existing value with the application ID or `clientId` of the `ms-identity-b2c-java-servlet-webapp-authentication` application from the Azure portal.\n\n1. Find the `aad.secret` property and replace the existing value with the value you saved during the creation of the `ms-identity-b2c-java-servlet-webapp-authentication` application from the Azure portal.\n\n1. Find the `aad.scopes` property and replace the existing application clientId with the value you placed into `aad.clientId` in step 1 of this section.\n\n1. Find the `aad.authority` property and replace the first instance of `fabrikamb2c` with the name of the Azure AD B2C tenant in which you created the `ms-identity-b2c-java-servlet-webapp-authentication` application in the Azure portal.\n\n1. Find the `aad.authority` property and replace the second instance of `fabrikamb2c` with the name of the Azure AD B2C tenant in which you created the `ms-identity-b2c-java-servlet-webapp-authentication` application in the Azure portal.\n\n1. Find the `aad.signInPolicy` property and replace it with the name of the sign-up/sign-in user-flow policy you created in the Azure AD B2C tenant in which you created the `ms-identity-b2c-java-servlet-webapp-authentication` application in the Azure portal.\n\n1. Find the `aad.passwordResetPolicy` property and replace it with the name of the password reset user-flow policy you created in the Azure AD B2C tenant in which you created the `ms-identity-b2c-java-servlet-webapp-authentication` application in the Azure portal.\n\n1. Find the `aad.editProfilePolicy` property and replace it with the name of the edit profile user-flow policy you created in the Azure AD B2C tenant in which you created the `ms-identity-b2c-java-servlet-webapp-authentication` application in the Azure portal.\n\n## Build the sample\n\nTo build the sample using Maven, navigate to the directory containing the **pom.xml** file for the sample, and then run the following command:\n\n```bash\nmvn clean package\n```\n\nThis command generates a **.war** file that you can run on various application servers.\n"
  },
  {
    "path": "articles/java/identity/includes/enable-java-servlet-webapp-authentication-entra-id-explore.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Explore the sample\n\nUse the following steps to explore the sample:\n\n1. Notice the signed-in or signed-out status displayed at the center of the screen.\n1. Select the context-sensitive button in the corner. This button reads **Sign In** when you first run the app.\n1. On the next page, follow the instructions and sign in with an account in the Microsoft Entra ID tenant.\n1. On the consent screen, notice the scopes that are being requested.\n1. Notice that the context-sensitive button now says **Sign out** and displays your username.\n1. Select **ID Token Details** to see some of the ID token's decoded claims.\n1. Use the button in the corner to sign out.\n1. After signing out, select **ID Token Details** to observe that the app displays a `401: unauthorized` error instead of the ID token claims when the user isn't authorized.\n\n## About the code\n\nThis sample shows how to use MSAL for Java (MSAL4J) to sign in users into your Microsoft Entra ID tenant. If you'd like to use MSAL4J in your own applications, you must add it to your projects using Maven.\n\nIf you want to replicate this sample's behavior, you can copy the **pom.xml** file and the contents of the **helpers** and **authservlets** folders in the **src/main/java/com/microsoft/azuresamples/msal4j** folder. You also need the **authentication.properties** file. These classes and files contain generic code that you can use in a wide array of applications. You can copy the rest of the sample as well, but the other classes and files are built specifically to address this sample's objective.\n\n### Contents\n\nThe following table shows the contents of the sample project folder:\n\n| File/folder                                                     | Description                                                                                 |\n|-----------------------------------------------------------------|---------------------------------------------------------------------------------------------|\n| **src/main/java/com/microsoft/azuresamples/msal4j/authwebapp/**   | This directory contains the classes that define the app's backend business logic.           |\n| **src/main/java/com/microsoft/azuresamples/msal4j/authservlets/** | This directory contains the classes that are used for sign in and sign out endpoints.       |\n| **\\*Servlet.java**                                              | All of the endpoints available are defined in Java classes with names ending in `Servlet`. |\n| **src/main/java/com/microsoft/azuresamples/msal4j/helpers/**      | Helper classes for authentication.                                                          |\n| **AuthenticationFilter.java**                                     | Redirects unauthenticated requests to protected endpoints to a 401 page.                    |\n| **src/main/resources/authentication.properties**                  | Microsoft Entra ID and program configuration.                                               |\n| **src/main/webapp/**                                              | This directory contains the UI - JSP templates                                              |\n| **CHANGELOG.md**                                                  | List of changes to the sample.                                                              |\n| **CONTRIBUTING.md**                                               | Guidelines for contributing to the sample.                                                  |\n| **LICENSE**                                                       | The license for the sample.                                                                 |\n\n### ConfidentialClientApplication\n\nA `ConfidentialClientApplication` instance is created in the **AuthHelper.java** file, as shown in the following example. This object helps craft the Microsoft Entra ID authorization URL and also helps exchange the authentication token for an access token.\n\n```java\n// getConfidentialClientInstance method\nIClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);\nconfClientInstance = ConfidentialClientApplication\n                     .builder(CLIENT_ID, secret)\n                     .authority(AUTHORITY)\n                     .build();\n```\n\nThe following parameters are used for instantiation:\n\n- The client ID of the app.\n- The client secret, which is a requirement for Confidential Client Applications.\n- The Microsoft Entra ID Authority, which includes your Microsoft Entra ID tenant ID.\n\nIn this sample, these values are read from the **authentication.properties** file using a properties reader in the **Config.java** file.\n\n### Step-by-step walkthrough\n\nThe following steps provide a walkthrough of the app's functionality:\n\n1. The first step of the sign-in process is to send a request to the `/authorize` endpoint on for your Microsoft Entra ID tenant. The MSAL4J `ConfidentialClientApplication` instance is used to construct an authorization request URL. The app redirects the browser to this URL, which is where the user signs in.\n\n   ```java\n   final ConfidentialClientApplication client = getConfidentialClientInstance();\n   AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))\n           .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();\n\n   final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();\n   contextAdapter.redirectUser(authorizeUrl);\n   ```\n\n   The following list describes the features of this code:\n\n   - `AuthorizationRequestUrlParameters`: Parameters that must be set in order to build an AuthorizationRequestUrl.\n   - `REDIRECT_URI`: Where Microsoft Entra ID redirects the browser - along with the auth code - after collecting the user credentials. It must match the redirect URI in the Microsoft Entra ID app registration in the [Azure portal](https://portal.azure.com).\n   - `SCOPES`: [Scopes](/entra/identity-platform/access-tokens#scopes) are permissions requested by the application. Normally, the three scopes `openid profile offline_access` suffice for receiving an ID token response.\n\n     You can find a full list of scopes requested by the app in the **authentication.properties** file. You can add more scopes, such as `User.Read`.\n\n1. The user is presented with a sign-in prompt by Microsoft Entra ID. If the sign-in attempt is successful, the user's browser is redirected to the app's redirect endpoint. A valid request to this endpoint contains an [authorization code](/entra/identity-platform/v2-oauth2-auth-code-flow).\n\n1. The `ConfidentialClientApplication` instance then exchanges this authorization code for an ID token and access token from Microsoft Entra ID.\n\n   ```java\n   // First, validate the state, then parse any error codes in response, then extract the authCode. Then:\n   // build the auth code params:\n   final AuthorizationCodeParameters authParams = AuthorizationCodeParameters\n           .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();\n\n   // Get a client instance and leverage it to acquire the token:\n   final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();\n   final IAuthenticationResult result = client.acquireToken(authParams).get();\n   ```\n\n   The following list describes the features of this code:\n\n   - `AuthorizationCodeParameters`: Parameters that must be set in order to exchange the Authorization Code for an ID and/or access token.\n   - `authCode`: The authorization code that was received at the redirect endpoint.\n   - `REDIRECT_URI`: The redirect URI used in the previous step must be passed again.\n   - `SCOPES`: The scopes used in the previous step must be passed again.\n\n1. If `acquireToken` is successful, the token claims are extracted. If the nonce check passes, the results are placed in `context` - an instance of `IdentityContextData` - and saved to the session. The application can then instantiate the `IdentityContextData` from the session by way of an instance of `IdentityContextAdapterServlet` whenever it needs access to it, as shown in the following code:\n\n   ```java\n   // parse IdToken claims from the IAuthenticationResult:\n   // (the next step - validateNonce - requires parsed claims)\n   context.setIdTokenClaims(result.idToken());\n\n   // if nonce is invalid, stop immediately! this could be a token replay!\n   // if validation fails, throws exception and cancels auth:\n   validateNonce(context);\n\n   // set user to authenticated:\n   context.setAuthResult(result, client.tokenCache().serialize());\n   ```\n\n### Protect the routes\n\nFor information about how the sample app filters access to routes, see **AuthenticationFilter.java**. In the **authentication.properties** file, the `app.protect.authenticated` property contains the comma-separated routes that only authenticated users can access, as shown in the following example:\n\n```ini\n# for example, /token_details requires any user to be signed in and does not require special roles claim(s)\napp.protect.authenticated=/token_details\n```\n\n### Scopes\n\n[Scopes](/entra/identity-platform/permissions-consent-overview) tell Microsoft Entra ID the level of access that the application is requesting.\n\nBased on the requested scopes, Microsoft Entra ID presents a consent dialogue to the user upon sign-in. If the user consents to one or more scopes and obtains a token, the scopes-consented-to are encoded into the resulting `access_token`.\n\nFor the scopes requested by the application, see **authentication.properties**. These three scopes are requested by MSAL and given by Microsoft Entra ID by default.\n\n## More information\n\n- [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [MSAL Java Reference Documentation](https://javadoc.io/doc/com.microsoft.azure/msal4j)\n- [Microsoft identity platform (Microsoft Entra ID for developers)](/entra/identity-platform/)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n"
  },
  {
    "path": "articles/java/identity/includes/enable-java-servlet-webapp-authentication-entra-id.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Set up the sample\n\nThe following sections show you how to set up the sample application.\n\n### Clone or download the sample repository\n\nTo clone the sample, open a Bash window and use the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git\ncd 3-java-servlet-web-app/1-Authentication/sign-in\n```\n\nAlternatively, navigate to the [ms-identity-msal-java-samples](https://github.com/Azure-Samples/ms-identity-msal-java-samples) repository, then download it as a **.zip** file and extract it to your hard drive.\n\n> [!IMPORTANT]\n> To avoid file path length limitations on Windows, clone or extract the repository into a directory near the root of your hard drive.\n\n### Register the sample application with your Microsoft Entra ID tenant\n\nThere's one project in this sample. This section shows you how to register the app.\n\nFirst, register the app in the Azure portal by following the instructions in [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app).\n\nThen, use the following steps to complete the registration:\n\n1. Navigate to the Microsoft identity platform for developers [App registrations](https://go.microsoft.com/fwlink/?linkid=2083908) page.\n\n1. Select **New registration**.\n\n1. In the **Register an application page** that appears, enter the following application registration information:\n\n   - In the **Name** section, enter a meaningful application name for display to users of the app - for example, `java-servlet-webapp-authentication`.\n   - Under **Supported account types**, select one of the following options:\n\n     - Select **Accounts in this organizational directory only** if you're building an application for use only by users in your tenant - that is, a *single-tenant* application.\n     - Select **Accounts in any organizational directory** if you'd like users in any Microsoft Entra ID tenant to be able to use your application - that is, a *multitenant* application.\n     - Select **Accounts in any organizational directory and personal Microsoft accounts** for the widest set of customers - that is, a multitenant application that also supports Microsoft personal accounts.\n     - Select **Personal Microsoft accounts** for use only by users of personal Microsoft accounts - for example, Hotmail, Live, Skype, and Xbox accounts.\n\n   - In the **Redirect URI** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:8080/msal4j-servlet-auth/auth/redirect`.\n\n1. Select **Register** to create the application.\n\n1. On the app's registration page, find and copy the **Application (client) ID** value to use later. You use this value in your app's configuration file or files.\n\n1. On the app's registration page, select **Certificates & secrets** on the navigation pane to open the page to generate secrets and upload certificates.\n\n1. In the **Client secrets** section, select **New client secret**.\n\n1. Type a description - for example, **app secret**.\n\n1. Select one of the available durations: **In 1 year**, **In 2 years**, or **Never Expires**.\n\n1. Select **Add**. The generated value is displayed.\n\n1. Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.\n\n---\n\n### Configure the app to use your app registration\n\nUse the following steps to configure the app:\n\n> [!NOTE]\n> In the following steps, `ClientID` is the same as `Application ID` or `AppId`.\n\n1. Open the project in your IDE.\n\n1. Open the **./src/main/resources/authentication.properties** file.\n\n1. Find the string `{enter-your-tenant-id-here}`. Replace the existing value with one of the following values:\n\n   - Your Microsoft Entra ID tenant ID if you registered your app with the **Accounts in this organizational directory only** option.\n   - The word `organizations` if you registered your app with the **Accounts in any organizational directory** option.\n   - The word `common` if you registered your app with the **Accounts in any organizational directory and personal Microsoft accounts** option.\n   - The word `consumers` if you registered your app with the **Personal Microsoft accounts** option.\n\n1. Find the string `{enter-your-client-id-here}` and replace the existing value with the application ID or `clientId` of the `java-servlet-webapp-authentication` application copied from the Azure portal.\n\n1. Find the string `{enter-your-client-secret-here}` and replace the existing value with the value you saved during the creation of the `java-servlet-webapp-authentication` app, in the Azure portal.\n\n## Build the sample\n\nTo build the sample using Maven, navigate to the directory containing the **pom.xml** file for the sample, and then run the following command:\n\n```bash\nmvn clean package\n```\n\nThis command generates a **.war** file that you can run on various application servers.\n"
  },
  {
    "path": "articles/java/identity/includes/enable-java-servlet-webapp-authorization-entra-id-explore.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Explore the sample\n\nUse the following steps to explore the sample:\n\n1. Notice the signed-in or signed-out status displayed at the center of the screen.\n1. Select the context-sensitive button in the corner. This button reads **Sign In** when you first run the app.\n1. On the next page, follow the instructions and sign in with an account in the Microsoft Entra ID tenant.\n1. On the consent screen, notice the scopes that are being requested.\n1. Notice that the context-sensitive button now says **Sign out** and displays your username.\n1. Select **ID Token Details** to see some of the ID token's decoded claims.\n1. Select **Call Graph** to make a call to Microsoft Graph's [/me endpoint](/graph/api/user-get?tabs=java#example-2-signed-in-user-request) and see a selection of the user details obtained.\n1. Use the button in the corner to sign out.\n\n## About the code\n\nThis sample uses MSAL for Java (MSAL4J) to sign a user in and obtain a token for Microsoft Graph API. It uses [Microsoft Graph SDK for Java](https://github.com/microsoftgraph/msgraph-sdk-java) to obtain data from Graph. You must add these libraries to your projects using Maven.\n\nIf you want to replicate this sample's behavior, you can copy the **pom.xml** file and the contents of the **helpers** and **authservlets** folders in the **src/main/java/com/microsoft/azuresamples/msal4j** folder. You also need the **authentication.properties** file. These classes and files contain generic code that you can use in a wide array of applications. You can copy the rest of the sample as well, but the other classes and files are built specifically to address this sample's objective.\n\n### Contents\n\nThe following table shows the contents of the sample project folder:\n\n| File/folder                                                        | Description                                                                                 |\n|--------------------------------------------------------------------|---------------------------------------------------------------------------------------------|\n| **src/main/java/com/microsoft/azuresamples/msal4j/callgraphwebapp/** | This directory contains the classes that define the app's backend business logic.           |\n| **src/main/java/com/microsoft/azuresamples/msal4j/authservlets/**    | This directory contains the classes that are used for sign in and sign out endpoints.       |\n| **\\*Servlet.java**                                                 | All of the endpoints available are defined in Java classes with names ending in `Servlet`. |\n| **src/main/java/com/microsoft/azuresamples/msal4j/helpers/**         | Helper classes for authentication.                                                          |\n| **AuthenticationFilter.java**                                        | Redirects unauthenticated requests to protected endpoints to a 401 page.                    |\n| **src/main/resources/authentication.properties**                     | Microsoft Entra ID and program configuration.                                               |\n| **src/main/webapp/**                                                 | This directory contains the UI - JSP templates                                              |\n| **CHANGELOG.md**                                                     | List of changes to the sample.                                                              |\n| **CONTRIBUTING.md**                                                  | Guidelines for contributing to the sample.                                                  |\n| **LICENSE**                                                          | The license for the sample.                                                                 |\n\n### ConfidentialClientApplication\n\nA `ConfidentialClientApplication` instance is created in the **AuthHelper.java** file, as shown in the following example. This object helps craft the Microsoft Entra ID authorization URL and also helps exchange the authentication token for an access token.\n\n```java\n// getConfidentialClientInstance method\nIClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);\nconfClientInstance = ConfidentialClientApplication\n                     .builder(CLIENT_ID, secret)\n                     .authority(AUTHORITY)\n                     .build();\n```\n\nThe following parameters are used for instantiation:\n\n- The client ID of the app.\n- The client secret, which is a requirement for Confidential Client Applications.\n- The Microsoft Entra ID Authority, which includes your Microsoft Entra tenant ID.\n\nIn this sample, these values are read from the **authentication.properties** file using a properties reader in the **Config.java** file.\n\n### Step-by-step walkthrough\n\nThe following steps provide a walkthrough of the app's functionality:\n\n1. The first step of the sign-in process is to send a request to the `/authorize` endpoint on for your Microsoft Entra ID tenant. The MSAL4J `ConfidentialClientApplication` instance is used to construct an authorization request URL. The app redirects the browser to this URL, which is where the user signs in.\n\n   ```java\n   final ConfidentialClientApplication client = getConfidentialClientInstance();\n   AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))\n           .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();\n\n   final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();\n   contextAdapter.redirectUser(authorizeUrl);\n   ```\n\n   The following list describes the features of this code:\n\n   - `AuthorizationRequestUrlParameters`: Parameters that must be set in order to build an `AuthorizationRequestUrl`.\n   - `REDIRECT_URI`: Where Microsoft Entra ID redirects the browser - along with the auth code - after collecting user credentials. It must match the redirect URI in the Microsoft Entra ID app registration in the [Azure portal](https://portal.azure.com)\n   - `SCOPES`: [Scopes](/entra/identity-platform/access-tokens#scopes) are permissions requested by the application.\n     - Normally, the three scopes `openid profile offline_access` suffice for receiving an ID token response.\n     - Full list of scopes requested by the app can be found in the **authentication.properties** file. You can add more scopes such as `User.Read`.\n\n1. The user is presented with a sign-in prompt by Microsoft Entra ID. If the sign-in attempt is successful, the user's browser is redirected to the app's redirect endpoint. A valid request to this endpoint contains an [authorization code](/entra/identity-platform/v2-oauth2-auth-code-flow).\n\n1. The `ConfidentialClientApplication` instance then exchanges this authorization code for an ID token and access token from Microsoft Entra ID.\n\n   ```java\n   // First, validate the state, then parse any error codes in response, then extract the authCode. Then:\n   // build the auth code params:\n   final AuthorizationCodeParameters authParams = AuthorizationCodeParameters\n           .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();\n\n   // Get a client instance and leverage it to acquire the token:\n   final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();\n   final IAuthenticationResult result = client.acquireToken(authParams).get();\n   ```\n\n   The following list describes the features of this code:\n\n   - `AuthorizationCodeParameters`: Parameters that must be set in order to exchange the Authorization Code for an ID and/or access token.\n   - `authCode`: The authorization code that was received at the redirect endpoint.\n   - `REDIRECT_URI`: The redirect URI used in the previous step must be passed again.\n   - `SCOPES`: The scopes used in the previous step must be passed again.\n\n1. If `acquireToken` is successful, the token claims are extracted. If the nonce check passes, the results are placed in `context` - an instance of `IdentityContextData` - and saved to the session. The application can then instantiate the `IdentityContextData` from the session by way of an instance of `IdentityContextAdapterServlet` whenever it needs access to it, as shown in the following code:\n\n   ```java\n   // parse IdToken claims from the IAuthenticationResult:\n   // (the next step - validateNonce - requires parsed claims)\n   context.setIdTokenClaims(result.idToken());\n\n   // if nonce is invalid, stop immediately! this could be a token replay!\n   // if validation fails, throws exception and cancels auth:\n   validateNonce(context);\n\n   // set user to authenticated:\n   context.setAuthResult(result, client.tokenCache().serialize());\n   ```\n\n### Protect the routes\n\nFor information about how the sample app filters access to routes, see **AuthenticationFilter.java**. In the **authentication.properties** file, the `app.protect.authenticated` property contains the comma-separated routes that only authenticated users can access, as shown in the following example:\n\n```ini\n# for example, /token_details requires any user to be signed in and does not require special roles or groups claim(s)\napp.protect.authenticated=/token_details, /call_graph\n```\n\n### Call graph\n\nWhen the user navigates to `/call_graph`, the application creates an instance of the `IGraphServiceClient` - from the Java Graph SDK - passing along the signed-in user's access token. The Graph client places the access token in the `Authorization` headers of its requests. The app then asks the Graph client to call the `/me` endpoint to yield details for the currently signed-in user.\n\nIf you already have a valid access token for Graph Service with the `User.Read` scope, you only need the following code to get access to the `/me` endpoint:\n\n```java\n//CallGraphServlet.java\nUser user = GraphHelper.getGraphClient(contextAdapter).me().buildRequest().get();\n```\n\n### Scopes\n\n[Scopes](/entra/identity-platform/permissions-consent-overview) tell Microsoft Entra ID the level of access that the application is requesting.\n\nBased on the requested scopes, Microsoft Entra ID presents a consent dialogue to the user upon sign-in. If the user consents to one or more scopes and obtains a token, the scopes-consented-to are encoded into the resulting `access_token`.\n\nFor the scopes requested by the application, see **authentication.properties**. By default, the application sets the scopes value to `User.Read`. This particular Microsoft Graph API scope is for accessing the information of the current signed-in user. The graph endpoint for accessing this info is `https://graph.microsoft.com/v1.0/me`. Any valid requests made to this endpoint must bear an `access_token` that contains the scope `User.Read` in the `Authorization` header.\n\n## More information\n\n- [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [Microsoft identity platform (Microsoft Entra ID for developers)](/entra/identity-platform/)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n"
  },
  {
    "path": "articles/java/identity/includes/enable-java-servlet-webapp-authorization-entra-id.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Set up the sample\n\nThe following sections show you how to set up the sample application.\n\n### Clone or download the sample repository\n\nTo clone the sample, open a Bash window and use the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git\ncd 3-java-servlet-web-app/2-Authorization-I/call-graph\n```\n\nAlternatively, navigate to the [ms-identity-msal-java-samples](https://github.com/Azure-Samples/ms-identity-msal-java-samples) repository, then download it as a **.zip** file and extract it to your hard drive.\n\n> [!IMPORTANT]\n> To avoid file path length limitations on Windows, clone or extract the repository into a directory near the root of your hard drive.\n\n### Register the sample application with your Microsoft Entra ID tenant\n\nThere's one project in this sample. The following sections show you how to register the app using the Azure portal.\n\n#### Choose the Microsoft Entra ID tenant where you want to create your applications\n\nTo choose your tenant, use the following steps:\n\n1. Sign in to the [Azure portal](https://portal.azure.com).\n\n1. If your account is present in more than one Microsoft Entra ID tenant, select your profile in the corner of the Azure portal, and then select **Switch directory** to change your session to the desired Microsoft Entra ID tenant.\n\n#### Register the app (java-servlet-webapp-call-graph)\n\nFirst, register a new app in the [Azure portal](https://portal.azure.com) by following the instructions in [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app).\n\nThen, use the following steps to complete the registration:\n\n1. Navigate to the Microsoft identity platform for developers [App registrations](https://go.microsoft.com/fwlink/?linkid=2083908) page.\n\n1. Select **New registration**.\n\n1. In the **Register an application page** that appears, enter the following application registration information:\n\n   - In the **Name** section, enter a meaningful application name for display to users of the app - for example, `java-servlet-webapp-call-graph`.\n   - Under **Supported account types**, select one of the following options:\n\n     - Select **Accounts in this organizational directory only** if you're building an application for use only by users in your tenant - that is, a *single-tenant* application.\n     - Select **Accounts in any organizational directory** if you'd like users in any Microsoft Entra ID tenant to be able to use your application - that is, a *multitenant* application.\n     - Select **Accounts in any organizational directory and personal Microsoft accounts** for the widest set of customers - that is, a multitenant application that also supports Microsoft personal accounts.\n\n   - Select **Personal Microsoft accounts** for use only by users of personal Microsoft accounts - for example, Hotmail, Live, Skype, and Xbox accounts.\n   - In the **Redirect URI** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:8080/msal4j-servlet-graph/auth/redirect`.\n\n1. Select **Register** to create the application.\n\n1. On the app's registration page, find and copy the **Application (client) ID** value to use later. You use this value in your app's configuration file or files.\n\n1. Select **Save** to save your changes.\n\n1. On the app's registration page, select **Certificates & secrets** on the navigation pane to open the page where you can generate secrets and upload certificates.\n\n1. In the **Client secrets** section, select **New client secret**.\n\n1. Type a description - for example, **app secret**.\n\n1. Select one of the available durations: **In 1 year**, **In 2 years**, or **Never Expires**.\n\n1. Select **Add**. The generated value is displayed.\n\n1. Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.\n\n1. On the app's registration page, select **API permissions** from the navigation pane to open the page to add access to the APIs that your application needs.\n\n1. Select **Add permissions**.\n\n1. Ensure that the **Microsoft APIs** tab is selected.\n\n1. In the **Commonly used Microsoft APIs** section, select **Microsoft Graph**.\n\n1. In the **Delegated permissions** section, select **User.Read** from the list. Use the search box if necessary.\n\n1. Select **Add permissions**.\n\n---\n\n### Configure the app (java-servlet-webapp-call-graph) to use your app registration\n\nUse the following steps to configure the app:\n\n> [!NOTE]\n> In the following steps, `ClientID` is the same as `Application ID` or `AppId`.\n\n1. Open the project in your IDE.\n\n1. Open the **./src/main/resources/authentication.properties** file.\n\n1. Find the string `{enter-your-tenant-id-here}`. Replace the existing value with one of the following values:\n\n   - Your Microsoft Entra ID tenant ID if you registered your app with the **Accounts in this organizational directory only** option.\n   - The word `organizations` if you registered your app with the **Accounts in any organizational directory** option.\n   - The word `common` if you registered your app with the **Accounts in any organizational directory and personal Microsoft accounts** option.\n   - The word `consumers` if you registered your app with the **Personal Microsoft accounts** option.\n\n1. Find the string `{enter-your-client-id-here}` and replace the existing value with the application ID or `clientId` of the `java-servlet-webapp-call-graph` application copied from the Azure portal.\n\n1. Find the string `{enter-your-client-secret-here}` and replace the existing value with the value you saved during the creation of the `java-servlet-webapp-call-graph` app, in the Azure portal.\n\n## Build the sample\n\nTo build the sample using Maven, navigate to the directory containing the **pom.xml** file for the sample, and then run the following command:\n\n```bash\nmvn clean package\n```\n\nThis command generates a **.war** file that you can run on various application servers.\n"
  },
  {
    "path": "articles/java/identity/includes/enable-java-servlet-webapp-authorization-group-entra-id-explore.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Explore the sample\n\nUse the following steps to explore the sample:\n\n1. Notice the signed-in or signed-out status displayed at the center of the screen.\n1. Select the context-sensitive button in the corner. This button reads **Sign In** when you first run the app.\n1. On the next page, follow the instructions and sign in with an account in the Microsoft Entra ID tenant.\n1. On the consent screen, notice the scopes that are being requested.\n1. Notice that the context-sensitive button now says **Sign out** and displays your username.\n1. Select **ID Token Details** to see some of the ID token's decoded claims.\n1. Select **Groups** to see any information about security group membership for the signed-in user.\n1. Select **Admin Only** or **Regular User** to access the groups claim protected endpoints.\n   - If your signed-in user is in the `GroupAdmin` group, the user can enter both pages.\n   - If your signed-in user is in the `GroupMember` group, the user can enter the **Regular User** page only.\n   - If your signed-in user is in neither group, the user can't access either of the two pages.\n1. Use the button in the corner to sign out.\n1. After signing out, select **ID Token Details** to observe that the app displays a `401: unauthorized` error instead of the ID token claims when the user isn't authorized.\n\n## About the code\n\nThis sample uses MSAL for Java (MSAL4J) to sign a user in and obtain an ID token that might contain the groups claim. If there are too many groups for emission in the ID token, the sample uses [Microsoft Graph SDK for Java](https://github.com/microsoftgraph/msgraph-sdk-java) to obtain the group membership data from Microsoft Graph. Based on the groups the user belongs to, the signed-in user can access either none, one, or both of the protected pages, `Admins Only` and `Regular Users`.\n\nIf you want to replicate this sample's behavior, you must add MSAL4J and Microsoft Graph SDK to your projects using Maven. You can copy the **pom.xml** file and the contents of the **helpers** and **authservlets** folders in the **src/main/java/com/microsoft/azuresamples/msal4j** folder. You also need the **authentication.properties** file. These classes and files contain generic code that you can use in a wide array of applications. You can copy the rest of the sample as well, but the other classes and files are built specifically to address this sample's objective.\n\n## Contents\n\nThe following table shows the contents of the sample project folder:\n\n| File/folder                                                     | Description                                                                                 |\n|-----------------------------------------------------------------|---------------------------------------------------------------------------------------------|\n| **src/main/java/com/microsoft/azuresamples/msal4j/groupswebapp/** | This directory contains the classes that define the app's backend business logic.           |\n| **src/main/java/com/microsoft/azuresamples/msal4j/authservlets/** | This directory contains the classes that are used for sign in and sign out endpoints.       |\n| **\\*Servlet.java**                                              | All of the endpoints available are defined in Java classes with names ending in `Servlet`. |\n| **src/main/java/com/microsoft/azuresamples/msal4j/helpers/**      | Helper classes for authentication.                                                          |\n| **AuthenticationFilter.java**                                     | Redirects unauthenticated requests to protected endpoints to a 401 page.                    |\n| **src/main/resources/authentication.properties**                  | Microsoft Entra ID and program configuration.                                               |\n| **src/main/webapp/**                                              | This directory contains the UI - JSP templates                                              |\n| **CHANGELOG.md**                                                  | List of changes to the sample.                                                              |\n| **CONTRIBUTING.md**                                               | Guidelines for contributing to the sample.                                                  |\n| **LICENSE**                                                       | The license for the sample.                                                                 |\n\n## Process a groups claim in tokens, including handling overage\n\nThe following sections describe how the app processes a groups claim.\n\n### The groups claim\n\nThe object ID of the security groups the signed-in user is member of is returned in the groups claim of the token, shown in the following example:\n\n```json\n{\n  ...\n  \"groups\": [\n    \"0bbe91cc-b69e-414d-85a6-a043d6752215\",\n    \"48931dac-3736-45e7-83e8-015e6dfd6f7c\",]\n  ...\n}\n```\n\n### The groups overage claim\n\nTo ensure that the token size doesn't exceed HTTP header size limits, the Microsoft identity platform limits the number of object IDs that it includes in the groups claim.\n\nThe overage limit is 150 for SAML tokens, 200 for JWT tokens, and 6 for Single Page applications. If a user is member of more groups than the overage limit, then the Microsoft identity platform doesn't emit the group IDs in the groups claim in the token. Instead, it includes an overage claim in the token that indicates to the application to query the [Microsoft Graph API](https://graph.microsoft.com) to retrieve the user's group membership, as shown in the following example:\n\n```json\n{\n  ...\n  \"_claim_names\": {\n    \"groups\": \"src1\"\n    },\n    {\n   \"_claim_sources\": {\n    \"src1\": {\n        \"endpoint\":\"[Graph Url to get this user's group membership from]\"\n        }\n    }\n  ...\n}\n```\n\n#### Create the overage scenario in this sample for testing\n\nTo create the overage scenario, you can use the following steps:\n\n1. You can use the **BulkCreateGroups.ps1** file provided in the **AppCreationScripts** folder to create a large number of groups and assign users to them. This file helps test overage scenarios during development. Remember to change the user's `objectId` provided in the **BulkCreateGroups.ps1** script.\n\n1. When you run this sample and an overage occurs, you see the **_claim_names** in the home page after the user signs in.\n\n1. We strongly advise that you use the group filtering feature, if possible, to avoid running into group overages. For more information, see the section [Configure your application to receive the groups claim values from a filtered set of groups a user might be assigned to](#configure-your-application-to-receive-the-groups-claim-values-from-a-filtered-set-of-groups-a-user-might-be-assigned-to).\n\n1. In case you can't avoid running into group overage, we suggest you use the following steps to process the groups claim in your token:\n\n   1. Check for the claim **_claim_names** with one of the values being **groups**. This claim indicates overage.\n   1. If found, make a call to the endpoint specified in **_claim_sources** to fetch user's groups.\n   1. If none found, look into the **groups**  claim for user's groups.\n\n> [!NOTE]\n> Handling overage requires a call to [Microsoft Graph](https://graph.microsoft.com) to read the signed-in user's group memberships, so your app needs to have the [GroupMember.Read.All](/graph/permissions-reference#group-permissions) permission for the [getMemberObjects](/graph/api/directoryobject-getmemberobjects) function to execute successfully.\n>\n> For more information about programming for Microsoft Graph, see the video [An introduction to Microsoft Graph for developers](https://www.youtube.com/watch?v=EBbnpFdB92A).\n\n### ConfidentialClientApplication\n\nA `ConfidentialClientApplication` instance is created in the **AuthHelper.java** file, as shown in the following example. This object helps craft the Microsoft Entra authorization URL and also helps exchange the authentication token for an access token.\n\n```java\n// getConfidentialClientInstance method\nIClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);\nconfClientInstance = ConfidentialClientApplication\n                      .builder(CLIENT_ID, secret)\n                      .authority(AUTHORITY)\n                      .build();\n```\n\nThe following parameters are used for instantiation:\n\n- The client ID of the app.\n- The client secret, which is a requirement for Confidential Client Applications.\n- The Microsoft Entra ID Authority, which includes your Microsoft Entra tenant ID.\n\nIn this sample, these values are read from the **authentication.properties** file using a properties reader in the **Config.java** file.\n\n### Step-by-step walkthrough\n\nThe following steps provide a walkthrough of the app's functionality:\n\n1. The first step of the sign-in process is to send a request to the `/authorize` endpoint on for your Microsoft Entra ID tenant. The MSAL4J `ConfidentialClientApplication` instance is used to construct an authorization request URL. The app redirects the browser to this URL, which is where the user signs in.\n\n   ```java\n   final ConfidentialClientApplication client = getConfidentialClientInstance();\n   AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))\n           .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();\n\n   final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();\n   contextAdapter.redirectUser(authorizeUrl);\n   ```\n\n   The following list describes the features of this code:\n\n   - `AuthorizationRequestUrlParameters`: Parameters that must be set in order to build an AuthorizationRequestUrl.\n   - `REDIRECT_URI`: Where Microsoft Entra redirects the browser - along with the auth code - after collecting user credentials. It must match the redirect URI in the Microsoft Entra ID app registration in the [Azure portal](https://portal.azure.com).\n   - `SCOPES`: [Scopes](/entra/identity-platform/access-tokens#scopes) are permissions requested by the application.\n     - Normally, the three scopes `openid profile offline_access` suffice for receiving an ID token response.\n     - Full list of scopes requested by the app can be found in the **authentication.properties** file. You can add more scopes, such as `User.Read`.\n\n1. The user is presented with a sign-in prompt by Microsoft Entra ID. If the sign-in attempt is successful, the user's browser is redirected to the app's redirect endpoint. A valid request to this endpoint contains an [authorization code](/entra/identity-platform/v2-oauth2-auth-code-flow).\n\n1. The `ConfidentialClientApplication` instance then exchanges this authorization code for an ID token and access token from Microsoft Entra ID.\n\n   ```java\n   // First, validate the state, then parse any error codes in response, then extract the authCode. Then:\n   // build the auth code params:\n   final AuthorizationCodeParameters authParams = AuthorizationCodeParameters\n           .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();\n\n   // Get a client instance and leverage it to acquire the token:\n   final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();\n   final IAuthenticationResult result = client.acquireToken(authParams).get();\n   ```\n\n   The following list describes the features of this code:\n\n   - `AuthorizationCodeParameters`: Parameters that must be set in order to exchange the Authorization Code for an ID and/or access token.\n   - `authCode`: The authorization code that was received at the redirect endpoint.\n   - `REDIRECT_URI`: The redirect URI used in the previous step must be passed again.\n   - `SCOPES`: The scopes used in the previous step must be passed again.\n\n1. If `acquireToken` is successful, the token claims are extracted. If the nonce check passes, the results are placed in `context` - an instance of `IdentityContextData` - and saved to the session. The application can then instantiate the `IdentityContextData` from the session by way of an instance of `IdentityContextAdapterServlet` whenever it needs access to it, as shown in the following code:\n\n   ```java\n   // parse IdToken claims from the IAuthenticationResult:\n   // (the next step - validateNonce - requires parsed claims)\n   context.setIdTokenClaims(result.idToken());\n\n   // if nonce is invalid, stop immediately! this could be a token replay!\n   // if validation fails, throws exception and cancels auth:\n   validateNonce(context);\n\n   // set user to authenticated:\n   context.setAuthResult(result, client.tokenCache().serialize());\n\n   // handle groups overage if it has occurred.\n   handleGroupsOverage(contextAdapter);\n   ```\n\n1. After previous step, you can extract group memberships by calling `context.getGroups()` using an instance of `IdentityContextData`.\n\n1. If the user is a member of too many groups - more than 200 - a call to `context.getGroups()` might be empty if not for the call to `handleGroupsOverage()`. Meanwhile, `context.getGroupsOverage()` returns `true`, signaling that an overage occurred, and that getting the full list of groups requires a call to Microsoft Graph. See the `handleGroupsOverage()` method in **AuthHelper.java** to see how this application uses `context.setGroups()` when there's an overage.\n\n### Protect the routes\n\nSee **AuthenticationFilter.java** to see how the sample app filters access to routes. In the **authentication.properties** file, the `app.protect.authenticated` property contains the comma-separated routes that only authenticated users can access, as shown in the following example:\n\n```ini\n# for example, /token_details requires any user to be signed in and does not require special groups claim\napp.protect.authenticated=/token_details\n```\n\nAny of the routes listed in the comma-separated rule sets under the `app.protect.groups` are also off-limits to non-authenticated authenticated users, as shown in the following example. However, these routes also contain a space-separated list of group memberships. Only users belonging to at least one of the corresponding groups can access these routes after authenticating.\n\n```ini\n# define short names for group IDs here for the app. This is useful in the next property (app.protect.groups).\n# EXCLUDE the curly braces, they are in this file only as delimiters.\n# example:\n# app.groups=groupA abcdef-qrstuvw-xyz groupB abcdef-qrstuv-wxyz\napp.groups=admin {enter-your-admins-group-id-here}, user {enter-your-users-group-id-here}\n\n# A route and its corresponding group(s) that can view it, <space-separated>; the start of the next route & its group(s) is delimited by a <comma-and-space-separator>\n# this says: /admins_only can be accessed by admin group, /regular_user can be accessed by admin group and user group\napp.protect.groups=/admin_only admin, /regular_user admin user\n```\n\n### Scopes\n\n[Scopes](/entra/identity-platform/permissions-consent-overview) tell Microsoft Entra ID the level of access that the application is requesting.\n\nBased on the requested scopes, Microsoft Entra ID presents a consent dialogue to the user upon sign-in. If the user consents to one or more scopes and obtains a token, the scopes-consented-to are encoded into the resulting `access_token`.\n\nFor the scopes requested by the application, see **authentication.properties**. By default, the application sets the scopes value to `GroupMember.Read.All`. This particular Microsoft Graph API scope is required in case the application needs to call Graph for getting the user's group memberships.\n\n## More information\n\n- [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [Microsoft identity platform (Microsoft Entra ID for developers)](/entra/identity-platform/)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n"
  },
  {
    "path": "articles/java/identity/includes/enable-java-servlet-webapp-authorization-group-entra-id.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Set up the sample\n\nThe following sections show you how to set up the sample application.\n\n### Clone or download the sample repository\n\nTo clone the sample, open a Bash window and use the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git\ncd 3-java-servlet-web-app/3-Authorization-II/groups\n```\n\nAlternatively, navigate to the [ms-identity-msal-java-samples](https://github.com/Azure-Samples/ms-identity-msal-java-samples) repository, then download it as a **.zip** file and extract it to your hard drive.\n\n> [!IMPORTANT]\n> To avoid file path length limitations on Windows, clone or extract the repository into a directory near the root of your hard drive.\n\n### Register the sample application with your Microsoft Entra ID tenant\n\nThere's one project in this sample. The following sections show you how to register the app using the Azure portal.\n\n#### Choose the Microsoft Entra ID tenant where you want to create your applications\n\nTo choose your tenant, use the following steps:\n\n1. Sign in to the [Azure portal](https://portal.azure.com).\n\n1. If your account is present in more than one Microsoft Entra ID tenant, select your profile in the corner of the Azure portal, and then select **Switch directory** to change your session to the desired Microsoft Entra ID tenant.\n\n#### Register the app (java-servlet-webapp-groups)\n\nFirst, register a new app in the [Azure portal](https://portal.azure.com) by following the instructions in [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app).\n\nThen, use the following steps to complete the registration:\n\n1. Navigate to the Microsoft identity platform for developers [App registrations](https://go.microsoft.com/fwlink/?linkid=2083908) page.\n\n1. Select **New registration**.\n\n1. In the **Register an application page** that appears, enter the following app registration information:\n\n   - In the **Name** section, enter a meaningful application name for display to users of the app - for example, `java-servlet-webapp-groups`.\n   - Under **Supported account types**, select **Accounts in this organizational directory only**.\n   - In the **Redirect URI** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:8080/msal4j-servlet-groups/auth/redirect`.\n\n1. Select **Register** to create the application.\n\n1. On the app's registration page, find and copy the **Application (client) ID** value to use later. You use this value in your app's configuration file or files.\n\n1. Select **Save** to save your changes.\n\n1. On the app's registration page, select **Certificates & secrets** on the navigation pane to open the page where you can generate secrets and upload certificates.\n\n1. In the **Client secrets** section, select **New client secret**.\n\n1. Type a description - for example, **app secret**.\n\n1. Select one of the available durations: **In 1 year**, **In 2 years**, or **Never Expires**.\n\n1. Select **Add**. The generated value is displayed.\n\n1. Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.\n\n1. On the app's registration page, select **API permissions** from the navigation pane to open the page to add access to the APIs that your application needs.\n\n1. Select **Add a permission**.\n\n1. Ensure that the **Microsoft APIs** tab is selected.\n\n1. In the **Commonly used Microsoft APIs** section, select **Microsoft Graph**.\n\n1. In the **Delegated permissions** section, select **User.Read** and **GroupMember.Read.All** from the list. Use the search box if necessary.\n\n1. Select **Add permissions**.\n\n1. `GroupMember.Read.All` requires admin consent, so select **Grant/revoke admin consent for {tenant}**, and then select **Yes** when you're asked if you want to grant consent for the requested permissions for all accounts in the tenant. You need to be a Microsoft Entra ID tenant admin to do this action.\n\n---\n\n### Configure the app (java-servlet-webapp-groups) to use your app registration\n\nUse the following steps to configure the app:\n\n> [!NOTE]\n> In the following steps, `ClientID` is the same as `Application ID` or `AppId`.\n\n1. Open the project in your IDE.\n\n1. Open the **./src/main/resources/authentication.properties** file.\n\n1. Find the string `{enter-your-tenant-id-here}`. Replace the existing value with your Microsoft Entra tenant ID if you registered your app with the **Accounts in this organizational directory only** option.\n\n1. Find the string `{enter-your-client-id-here}` and replace the existing value with the application ID or `clientId` of the `java-servlet-webapp-groups` application copied from the Azure portal.\n\n1. Find the string `{enter-your-client-secret-here}` and replace the existing value with the value you saved during the creation of the `java-servlet-webapp-groups` app, in the Azure portal.\n\n### Configure security groups\n\nYou have the following options available on how you can further configure your applications to receive the groups claim:\n\n- Receive all the groups that the signed-in user is assigned to in a Microsoft Entra ID tenant, included nested groups. For more information, see the section [Configure your application to receive all the groups the signed-in user is assigned to, including nested groups](#configure-your-application-to-receive-all-the-groups-the-signed-in-user-is-assigned-to-including-nested-groups).\n\n- Receive the groups claim values from a filtered set of groups that your application is programmed to work with. For more information, see the section [Configure your application to receive the groups claim values from a filtered set of groups a user might be assigned to](#configure-your-application-to-receive-the-groups-claim-values-from-a-filtered-set-of-groups-a-user-might-be-assigned-to). This option isn't available in the [Microsoft Entra ID Free edition](https://www.microsoft.com/security/business/microsoft-entra-pricing).\n\n> [!NOTE]\n> To get the on-premise group's `samAccountName` or `On Premises Group Security Identifier` instead of the group ID, see the section [Prerequisites for using group attributes synchronized from Active Directory](/entra/identity/hybrid/connect/how-to-connect-fed-group-claims#prerequisites-for-using-group-attributes-synchronized-from-active-directory) in [Configure group claims for applications by using Microsoft Entra ID](/entra/identity/hybrid/connect/how-to-connect-fed-group-claims).\n\n#### Configure your application to receive all the groups the signed-in user is assigned to, including nested groups\n\nTo configure your application, use the following steps:\n\n1. On the app's registration page, select **Token Configuration** on the navigation pane to open the page where you can configure the claims provided tokens issued to your application.\n\n1. Select **Add groups claim** to open the **Edit Groups Claim** screen.\n\n1. Select **Security groups** OR the **All groups (includes distribution lists but not groups assigned to the application)** option. Choosing both options negates the effect of the **Security Groups** option.\n\n1. Under the **ID** section, select **Group ID**. This selection causes Microsoft Entra ID to send the [object ID](/graph/api/resources/group) of the groups the user is assigned to in the groups claim of the [ID token](/entra/identity-platform/id-tokens) that your app receives after signing-in a user.\n\n#### Configure your application to receive the groups claim values from a filtered set of groups a user might be assigned to\n\nThis option is useful when the following cases are true:\n\n* Your application is interested in a selected set of groups that a signing-in user might be assigned to.\n* Your application isn't interested in every security group this user is assigned to in the tenant.\n\nThis option helps your application avoid the [overage](#the-groups-overage-claim) issue.\n\n> [!NOTE]\nThis feature isn't available in the [Microsoft Entra ID Free edition](https://www.microsoft.com/security/business/microsoft-entra-pricing).\n>\n> Nested group assignments aren't available when you use this option.\n\nTo enable this option in your app, use the following steps:\n\n1. On the app's registration page, select **Token Configuration** on the navigation pane to open the page where you can configure the claims provided tokens issued to your application.\n\n1. Select **Add groups claim** to open the **Edit Groups Claim** screen.\n\n1. Select **Groups assigned to the application**.\n\n   Choosing other options - such as **Security Groups** or **All groups (includes distribution lists but not groups assigned to the application)** - negates the benefits your app derives from choosing to use this option.\n\n1. Under the **ID** section, select **Group ID**. This selection results in Microsoft Entra ID sending the [object ID](/graph/api/resources/group) of the groups the user is assigned to in the groups claim of the [ID token](/entra/identity-platform/id-tokens).\n\n1. If you're exposing a web API using the **Expose an API** option, then you can also choose the **Group ID** option under the **Access** section. This option results in Microsoft Entra ID sending the [object ID](/graph/api/resources/group) of the groups the user is assigned to in the groups claim of the [access token](/entra/identity-platform/access-tokens).\n\n1. On the app's registration page, select **Overview** on the navigation pane to open the application overview screen.\n\n1. Select the hyperlink with the name of your application in **Managed application in local directory**. This field title might be truncated - for instance `Managed application in ...`. When you select this link, you navigate to the **Enterprise Application Overview** page associated with the service principal for your application in the tenant where you created it. You can navigate back to the app registration page by using the back button of your browser.\n\n1. Select **Users and groups** on the navigation pane to open the page where you can assign users and groups to your application.\n\n1. Select **Add user**.\n\n1. Select **User and Groups** from the resultant screen.\n\n1. Choose the groups that you want to assign to this application.\n\n1. Select **Select** to finish selecting the groups.\n\n1. Select **Assign** to finish the group assignment process.\n\n   Your application now receives these selected groups in the groups claim when a user signing in to your app is a member of one or more these assigned groups.\n\n1. Select **Properties** on the navigation pane to open the page that lists the basic properties of your application.Set the **User assignment required?** flag to **Yes**.\n\n> [!IMPORTANT]\n> When you set **User assignment required?** to **Yes**, Microsoft Entra ID checks that only users assigned to your application in the **Users and groups** pane are able to sign-in to your app. You can assign users directly or by assigning security groups they belong to.\n\n### Configure the app (java-servlet-webapp-groups) to recognize group IDs\n\nUse the following steps to configure the app:\n\n> [!IMPORTANT]\n> On the **Token Configuration** page, if you chose any option other than **groupID** - such as **DNSDomain\\sAMAccountName** - you should enter the group name in the following steps - for example, `contoso.com\\Test Group` - instead of the object ID:\n\n1. Open the **./src/main/resources/authentication.properties** file.\n\n1. Find the string `{enter-your-admins-group-id-here}` and replace the existing value with the object ID of the `GroupAdmin` group, which you copied from the Azure portal. Remove the curly braces from the placeholder value as well.\n\n1. Find the string `{enter-your-users-group-id-here}` and replace the existing value with the object ID of the `GroupMember` group, which you copied from the Azure portal. Remove the curly braces from the placeholder value as well.\n\n## Build the sample\n\nTo build the sample using Maven, navigate to the directory containing the **pom.xml** file for the sample, and then run the following command:\n\n```bash\nmvn clean package\n```\n\nThis command generates a **.war** file that you can run on various application servers.\n"
  },
  {
    "path": "articles/java/identity/includes/enable-java-servlet-webapp-authorization-role-entra-id-explore.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Explore the sample\n\nUse the following steps to explore the sample:\n\n1. Notice the signed-in or signed-out status displayed at the center of the screen.\n1. Select the context-sensitive button in the corner. This button reads **Sign In** when you first run the app.\n1. On the next page, follow the instructions and sign in with an account in the Microsoft Entra ID tenant.\n1. On the consent screen, notice the scopes that are being requested.\n1. Notice that the context-sensitive button now says **Sign out** and displays your username.\n1. Select **ID Token Details** to see some of the ID token's decoded claims.\n1. Select **Admins Only** to view the `/admin_only` page. Only users with app role `PrivilegedAdmin` can view this page. Otherwise, an authorization failure message is displayed.\n1. Select **Regular Users** to view the `/regular_user` page. Only users with app role `RegularUser` or `PrivilegedAdmin` can view this page. Otherwise, an authorization failure message is displayed.\n1. Use the button in the corner to sign out.\n\n## About the code\n\nThis sample uses MSAL for Java (MSAL4J) to sign a user in and obtain an ID token that might contain the roles claim. Based on the roles claim present, the signed-in user can access none, one, or both of the protected pages, `Admins Only` and `Regular Users`.\n\nIf you want to replicate this sample's behavior, you can copy the **pom.xml** file and the contents of the **helpers** and **authservlets** folders in the **src/main/java/com/microsoft/azuresamples/msal4j** folder. You also need the **authentication.properties** file. These classes and files contain generic code that you can use in a wide array of applications. You can copy the rest of the sample as well, but the other classes and files are built specifically to address this sample's objective.\n\n### Contents\n\nThe following table shows the contents of the sample project folder:\n\n| File/folder                                                     | Description                                                                                 |\n|-----------------------------------------------------------------|---------------------------------------------------------------------------------------------|\n| **src/main/java/com/microsoft/azuresamples/msal4j/roles/**        | This directory contains the classes that define the app's backend business logic.           |\n| **src/main/java/com/microsoft/azuresamples/msal4j/authservlets/** | This directory contains the classes that are used for sign in and sign out endpoints.       |\n| **\\*Servlet.java**                                              | All of the endpoints available are defined in Java classes with names ending in `Servlet`. |\n| **src/main/java/com/microsoft/azuresamples/msal4j/helpers/**      | Helper classes for authentication.                                                          |\n| **AuthenticationFilter.java**                                     | Redirects unauthenticated requests to protected endpoints to a 401 page.                    |\n| **src/main/resources/authentication.properties**                  | Microsoft Entra ID and program configuration.                                               |\n| **src/main/webapp/**                                              | This directory contains the UI - JSP templates                                              |\n| **CHANGELOG.md**                                                  | List of changes to the sample.                                                              |\n| **CONTRIBUTING.md**                                               | Guidelines for contributing to the sample.                                                  |\n| **LICENSE**                                                       | The license for the sample.                                                                 |\n\n### Process a roles claim in the ID token\n\nThe roles claim of the token includes the names of the roles that the signed-in user is assigned to, as shown in the following example:\n\n```json\n{\n  ...\n  \"roles\": [\n    \"Role1\",\n    \"Role2\",]\n  ...\n}\n```\n\n### ConfidentialClientApplication\n\nA `ConfidentialClientApplication` instance is created in the **AuthHelper.java** file, as shown in the following example. This object helps craft the Microsoft Entra authorization URL and also helps exchange the authentication token for an access token.\n\n```java\n// getConfidentialClientInstance method\nIClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);\nconfClientInstance = ConfidentialClientApplication\n                     .builder(CLIENT_ID, secret)\n                     .authority(AUTHORITY)\n                     .build();\n```\n\nThe following parameters are used for instantiation:\n\n- The client ID of the app.\n- The client secret, which is a requirement for Confidential Client Applications.\n- The Microsoft Entra ID Authority, which includes your Microsoft Entra tenant ID.\n\nIn this sample, these values are read from the **authentication.properties** file using a properties reader in the **Config.java** file.\n\n### Step-by-step walkthrough\n\nThe following steps provide a walkthrough of the app's functionality:\n\n1. The first step of the sign-in process is to send a request to the `/authorize` endpoint on for your Microsoft Entra ID tenant. The MSAL4J `ConfidentialClientApplication` instance is used to construct an authorization request URL. The app redirects the browser to this URL, which is where the user signs in.\n\n   ```java\n   final ConfidentialClientApplication client = getConfidentialClientInstance();\n   AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))\n           .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();\n\n   final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();\n   contextAdapter.redirectUser(authorizeUrl);\n   ```\n\n   The following list describes the features of this code:\n\n   - `AuthorizationRequestUrlParameters`: Parameters that must be set in order to build an AuthorizationRequestUrl.\n   - `REDIRECT_URI`: Where Microsoft Entra ID redirects the browser - along with the auth code - after collecting user credentials. It must match the redirect URI in the Microsoft Entra ID app registration in the [Azure portal](https://portal.azure.com).\n   - `SCOPES`: [Scopes](/entra/identity-platform/access-tokens#scopes) are permissions requested by the application.\n     - Normally, the three scopes `openid profile offline_access` suffice for receiving an ID token response.\n     - Full list of scopes requested by the app can be found in the **authentication.properties** file. You can add more scopes, such as `User.Read`.\n\n1. The user is presented with a sign-in prompt by Microsoft Entra ID. If the sign-in attempt is successful, the user's browser is redirected to the app's redirect endpoint. A valid request to this endpoint contains an [authorization code](/entra/identity-platform/v2-oauth2-auth-code-flow).\n\n1. The `ConfidentialClientApplication` instance then exchanges this authorization code for an ID token and access token from Microsoft Entra ID.\n\n   ```java\n   // First, validate the state, then parse any error codes in response, then extract the authCode. Then:\n   // build the auth code params:\n   final AuthorizationCodeParameters authParams = AuthorizationCodeParameters\n           .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();\n\n   // Get a client instance and leverage it to acquire the token:\n   final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();\n   final IAuthenticationResult result = client.acquireToken(authParams).get();\n   ```\n\n   The following list describes the features of this code:\n\n   - `AuthorizationCodeParameters`: Parameters that must be set in order to exchange the Authorization Code for an ID and/or access token.\n   - `authCode`: The authorization code that was received at the redirect endpoint.\n   - `REDIRECT_URI`: The redirect URI used in the previous step must be passed again.\n   - `SCOPES`: The scopes used in the previous step must be passed again.\n\n1. If `acquireToken` is successful, the token claims are extracted. If the nonce check passes, the results are placed in `context` - an instance of `IdentityContextData` - and saved to the session. The application can then instantiate the `IdentityContextData` from the session by way of an instance of `IdentityContextAdapterServlet` whenever it needs access to it, as shown in the following code:\n\n   ```java\n   // parse IdToken claims from the IAuthenticationResult:\n   // (the next step - validateNonce - requires parsed claims)\n   context.setIdTokenClaims(result.idToken());\n\n   // if nonce is invalid, stop immediately! this could be a token replay!\n   // if validation fails, throws exception and cancels auth:\n   validateNonce(context);\n\n   // set user to authenticated:\n   context.setAuthResult(result, client.tokenCache().serialize());\n   ```\n\n### Protect the routes\n\nFor information about how the sample app filters access to routes, see **AuthenticationFilter.java**. In the **authentication.properties** file, the `app.protect.authenticated` property contains the comma-separated routes that only authenticated users can access, as shown in the following example:\n\n```ini\n# for example, /token_details requires any user to be signed in and does not require special roles claim(s)\napp.protect.authenticated=/token_details\n```\n\nAny of the routes listed in the comma-separated rule sets under the `app.protect.roles` are also off-limits to non-authenticated authenticated users, as shown in the following example. However, these routes also contain a space-separated list of app role memberships: only users having at least one of the corresponding roles can access these routes after authenticating.\n\n```ini\n# local short names for app roles - for example, sets admin to mean PrivilegedAdmin (useful for long rule sets defined in the next key, app.protect.roles)\napp.roles=admin PrivilegedAdmin, user RegularUser\n\n# A route and its corresponding <space-separated> role(s) that can access it; the start of the next route & its role(s) is delimited by a <comma-and-space-separator>\n# this says: /admins_only can be accessed by PrivilegedAdmin, /regular_user can be accessed by PrivilegedAdmin role and the RegularUser role\napp.protect.roles=/admin_only admin, /regular_user admin user\n```\n\n### Scopes\n\n[Scopes](/entra/identity-platform/permissions-consent-overview) tell Microsoft Entra ID the level of access that the application is requesting.\n\nBased on the requested scopes, Microsoft Entra ID presents a consent dialogue to the user upon sign-in. If the user consents to one or more scopes and obtains a token, the scopes-consented-to are encoded into the resulting `access_token`.\n\nFor the scopes requested by the application, see **authentication.properties**. These three scopes are requested by MSAL and given by Microsoft Entra ID by default.\n\n## More information\n\n- [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java)\n- [Microsoft identity platform](/entra/identity-platform/)\n- [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app)\n- [Understanding Microsoft Entra ID application consent experiences](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [MSAL code samples](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n- [How to: Add app roles to your application and receive them in the token](/entra/identity-platform/howto-add-app-roles-in-apps)\n- [Manage user assignment for an app in Microsoft Entra ID](/entra/identity/enterprise-apps/assign-user-or-group-access-portal?pivots=portal#assign-a-user-to-an-app---portal)\n"
  },
  {
    "path": "articles/java/identity/includes/enable-java-servlet-webapp-authorization-role-entra-id.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Set up the sample\n\nThe following sections show you how to set up the sample application.\n\n### Clone or download the sample repository\n\nTo clone the sample, open a Bash window and use the following command:\n\n```bash\ngit clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git\ncd 3-java-servlet-web-app/3-Authorization-II/roles\n```\n\nAlternatively, navigate to the [ms-identity-msal-java-samples](https://github.com/Azure-Samples/ms-identity-msal-java-samples) repository, then download it as a **.zip** file and extract it to your hard drive.\n\n> [!IMPORTANT]\n> To avoid file path length limitations on Windows, clone or extract the repository into a directory near the root of your hard drive.\n\n### Register the sample application with your Microsoft Entra ID tenant\n\nThere's one project in this sample. The following sections show you how to register the app using the Azure portal.\n\n#### Choose the Microsoft Entra ID tenant where you want to create your applications\n\nTo choose your tenant, use the following steps:\n\n1. Sign in to the [Azure portal](https://portal.azure.com).\n\n1. If your account is present in more than one Microsoft Entra ID tenant, select your profile in the corner of the Azure portal, and then select **Switch directory** to change your session to the desired Microsoft Entra ID tenant.\n\n#### Register the app (java-servlet-webapp-roles)\n\nFirst, register a new app in the [Azure portal](https://portal.azure.com) by following the instructions in [Quickstart: Register an application with the Microsoft identity platform](/entra/identity-platform/quickstart-register-app).\n\nThen, use the following steps to complete the registration:\n\n1. Navigate to the Microsoft identity platform for developers [App registrations](https://go.microsoft.com/fwlink/?linkid=2083908) page.\n\n1. Select **New registration**.\n\n1. In the **Register an application page** that appears, enter the following app registration information:\n\n   - In the **Name** section, enter a meaningful application name for display to users of the app - for example, `java-servlet-webapp-roles`.\n   - Under **Supported account types**, select one of the following options:\n\n     - Select **Accounts in this organizational directory only** if you're building an application for use only by users in your tenant - that is, a *single-tenant* application.\n   - In the **Redirect URI** section, select **Web** in the combo-box and enter the following redirect URI: `http://localhost:8080/msal4j-servlet-roles/auth/redirect`.\n1. Select **Register** to create the application.\n\n1. On the app's registration page, find and copy the **Application (client) ID** value to use later. You use this value in your app's configuration file or files.\n\n1. Select **Save** to save your changes.\n\n1. On the app's registration page, select **Certificates & secrets** on the navigation pane to open the page where you can generate secrets and upload certificates.\n\n1. In the **Client secrets** section, select **New client secret**.\n\n1. Type a description - for example, **app secret**.\n\n1. Select one of the available durations: **In 1 year**, **In 2 years**, or **Never Expires**.\n\n1. Select **Add**. The generated value is displayed.\n\n1. Copy and save the generated value for use in later steps. You need this value for your code's configuration files. This value isn't displayed again, and you can't retrieve it by any other means. So, be sure to save it from the Azure portal before you navigate to any other screen or pane.\n\n#### Define the application roles\n\nTo define the app roles, use the following steps:\n\n1. Still on the same app registration, select **App roles** on the navigation pane.\n\n1. Select **Create app role**, then enter the following values:\n\n   - For **Display name**, enter a suitable name - for example, **PrivilegedAdmin**.\n   - For **Allowed member types**, choose **User**.\n   - For **Value**, enter **PrivilegedAdmin**.\n   - For **Description**, enter **PrivilegedAdmins who can view the Admin Page**.\n\n1. Select **Create app role**, then enter the following values:\n\n   - For **Display name**, enter a suitable name - for example, **RegularUser**.\n   - For **Allowed member types**, choose **User**.\n   - For **Value**, enter **RegularUser**.\n   - For **Description**, enter **RegularUsers who can view the User Page**.\n\n1. Select **Apply** to save your changes.\n\n#### Assign users to the application roles\n\n To add users to the app role defined earlier, follow the guidelines here: [Assign users and groups to roles.](/entra/identity-platform/howto-add-app-roles-in-apps#assign-users-and-groups-to-microsoft-entra-roles)\n\n---\n\n### Configure the app (java-servlet-webapp-roles) to use your app registration\n\nUse the following steps to configure the app:\n\n> [!NOTE]\n> In the following steps, `ClientID` is the same as `Application ID` or `AppId`.\n\n1. Open the project in your IDE.\n\n1. Open the [authentication.properties](https://github.com/Azure-Samples/ms-identity-msal-java-samples/blob/main/3-java-servlet-web-app/3-Authorization-II/roles/src/main/resources/authentication.properties) file.\n\n1. Find the string `{enter-your-tenant-id-here}`. Replace the existing value with your Microsoft Entra ID tenant ID.\n\n1. Find the string `{enter-your-client-id-here}` and replace the existing value with the application ID or `clientId` of the `java-servlet-webapp-call-graph` application copied from the Azure portal.\n\n1. Find the string `{enter-your-client-secret-here}` and replace the existing value with the value you saved during the creation of the `java-servlet-webapp-roles` app, in the Azure portal.\n\n1. Find the `app.roles` property and make sure the value is set to `app.roles=admin PrivilegedAdmin, user RegularUser`, or substitute the names of your specific roles.\n\n## Build the sample\n\nTo build the sample using Maven, navigate to the directory containing the **pom.xml** file for the sample, and then run the following command:\n\n```bash\nmvn clean package\n```\n\nThis command generates a **.war** file that you can run on various application servers.\n"
  },
  {
    "path": "articles/java/identity/includes/java-servlet-overview-recommendation.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- Some familiarity with the [Java / Jakarta Servlets](https://projects.eclipse.org/projects/ee4j.servlet).\n- Some familiarity with Linux/OSX terminal.\n- [jwt.ms](https://jwt.ms) for inspecting your tokens.\n- [Fiddler](https://www.telerik.com/fiddler) for monitoring your network activity and troubleshooting.\n- Follow the [Microsoft Entra Blog](https://techcommunity.microsoft.com/category/microsoft-entra/blog/microsoft-entra-blog) to stay up-to-date with the latest developments.\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-authorization-graph.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- Java 8 or higher\n- [Maven 3](https://maven.apache.org/download.cgi)\n- A Microsoft Entra ID tenant. For more information, see [How to get a Microsoft Entra ID tenant](/entra/identity-platform/quickstart-create-new-tenant).\n- A user account in your own Microsoft Entra ID tenant if you want to work with accounts in your organizational directory only - that is, in single-tenant mode. If you haven't created a user account in your tenant yet, you should do so before proceeding. For more information, see [How to create, invite, and delete users](/entra/fundamentals/add-users).\n- A user account in any organization's Microsoft Entra ID tenant if you want to work with accounts in any organizational directory - that is, in multitenant mode. This sample must be modified to work with a personal Microsoft account. If you haven't created a user account in your tenant yet, you should do so before proceeding. For more information, see [How to create, invite, and delete users](/entra/fundamentals/add-users).\n- A personal Microsoft account - for example, Xbox, Hotmail, Live, and so on - if you want to work with personal Microsoft accounts.\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-authorization-groups.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- [JDK version 8 or higher](https://jdk.java.net/8/)\n- [Maven 3](https://maven.apache.org/download.cgi)\n- A Microsoft Entra ID tenant. For more information, see [How to get a Microsoft Entra ID tenant](/entra/identity-platform/quickstart-create-new-tenant).\n- A user account in your own Microsoft Entra ID tenant.\n- Two security groups, `GroupAdmin` and `GroupMember`, containing users you want to test with.\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-authorization-roles.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- [JDK version 8 or higher](https://jdk.java.net/8/)\n- [Maven 3](https://maven.apache.org/download.cgi)\n- A Microsoft Entra ID tenant. For more information, see [How to get a Microsoft Entra ID tenant](/entra/identity-platform/quickstart-create-new-tenant).\n- A user account in your own Microsoft Entra ID tenant if you want to work with accounts in your organizational directory only - that is, single-tenant mode. If you haven't created a user account in your tenant yet, you should do so before proceeding. For more information, see [How to create, invite, and delete users](/entra/fundamentals/add-users).\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-jboss.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- [JBoss EAP](https://developers.redhat.com/products/eap/download)\n- [Visual Studio Code](https://code.visualstudio.com/download)\n- [Azure Tools for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-sign-in-azure-ad-b2c.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- [JDK version 8 or higher](https://jdk.java.net/8/)\n- [Maven 3](https://maven.apache.org/download.cgi)\n- An Azure AD B2C tenant. For more information, see [Tutorial: Create an Azure Active Directory B2C tenant](/azure/active-directory-b2c/tutorial-create-tenant)\n- A user account in your Azure AD B2C tenant.\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-sign-in-entra.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- [JDK version 8 or higher](https://jdk.java.net/8/)\n- [Maven 3](https://maven.apache.org/download.cgi)\n- A Microsoft Entra ID tenant. For more information, see [How to get a Microsoft Entra ID tenant](/entra/identity-platform/quickstart-create-new-tenant).\n- A user account in your own Microsoft Entra ID tenant if you want to work with accounts in your organizational directory only - that is, in single-tenant mode. If you haven't created a user account in your Microsoft Entra ID tenant, you should do so before proceeding. For more information, see [How to create, invite, and delete users](/entra/fundamentals/add-users).\n- A user account in any organization's Microsoft Entra ID tenant if you want to work with accounts in any organizational directory - that is, in multitenant mode. You must modify this sample to work with a personal Microsoft account. If you haven't created a user account in your Microsoft Entra ID tenant yet, you should do so before proceeding. For more information, see [How to create, invite, and delete users](/entra/fundamentals/add-users).\n- A personal Microsoft account - for example, Xbox, Hotmail, Live, and so on - if you want to work with personal Microsoft accounts.\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-spring-boot-updated-version.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- [JDK version 17](https://jdk.java.net/17/). This sample was developed on a system with Java 17, but it might be compatible with other versions.\n- [Maven 3](https://maven.apache.org/download.cgi)\n- [Java Extension Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) is recommended for running this sample in Visual Studio Code.\n- A Microsoft Entra ID tenant. For more information, see [How to get a Microsoft Entra ID tenant](/entra/identity-platform/quickstart-create-new-tenant).\n- A user account in your Microsoft Entra ID tenant. This sample doesn't work with a personal Microsoft account. Therefore, if you signed in to the [Azure portal](https://portal.azure.com) with a personal account and you don't have a user account in your directory, you need to create one now.\n- [Visual Studio Code](https://code.visualstudio.com/download)\n- [Azure Tools for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-spring-boot.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- [JDK version 15](https://jdk.java.net/15/). This sample was developed on a system with Java 15, but it might be compatible with other versions.\n- [Maven 3](https://maven.apache.org/download.cgi)\n- [Java Extension Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) is recommended for running this sample in Visual Studio Code.\n- A Microsoft Entra ID tenant. For more information, see [How to get a Microsoft Entra ID tenant](/entra/identity-platform/quickstart-create-new-tenant).\n- A user account in your Microsoft Entra ID tenant. This sample doesn't work with a personal Microsoft account. Therefore, if you signed in to the [Azure portal](https://portal.azure.com) with a personal account and you don't have a user account in your directory, you need to create one now.\n- [Visual Studio Code](https://code.visualstudio.com/download)\n- [Azure Tools for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-tomcat.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- [Tomcat 9](https://tomcat.apache.org/download-90.cgi)\n- [Visual Studio Code](https://code.visualstudio.com/download)\n- [Azure Tools for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-weblogic.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- [WebLogic](https://www.oracle.com/middleware/technologies/weblogic-server-installers-downloads.html)\n- [Visual Studio Code](https://code.visualstudio.com/download)\n- [Azure Tools for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)\n"
  },
  {
    "path": "articles/java/identity/includes/prerequisites-websphere.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n- [WebSphere](https://www.ibm.com/support/pages/v905-download-websphere-application-server-version-905-passport-advantage-online)\n- [Visual Studio Code](https://code.visualstudio.com/download)\n- [Azure Tools for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)\n"
  },
  {
    "path": "articles/java/identity/includes/scenario-authorization-graph.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nThe following diagram shows the topology of the app:\n\n:::image type=\"content\" source=\"../media/topology.png\" alt-text=\"Diagram that shows the topology of the app.\":::\n\nThe client app uses MSAL for Java (MSAL4J) to sign in a user and obtain an [access token](/entra/identity-platform/access-tokens) for [Microsoft Graph](/graph/overview) from Microsoft Entra ID. The access token proves that the user is authorized to access the Microsoft Graph API endpoint as defined in the scope.\n"
  },
  {
    "path": "articles/java/identity/includes/scenario-authorization-groups.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nThe following diagram shows the topology of the app:\n\n:::image type=\"content\" source=\"../media/topology.png\" alt-text=\"Diagram that shows the topology of the app.\":::\n\nThe client app uses MSAL for Java (MSAL4J) to sign in users to a Microsoft Entra ID tenant and obtain an [ID token](/entra/identity-platform/id-tokens) from Microsoft Entra ID. The ID token proves that a user is authenticated with this tenant. The app protects its routes according to user's authentication status and group membership.\n\nFor a video that covers this scenario, see [Implement authorization in your applications using app roles, security groups, scopes, and directory roles](https://www.youtube.com/watch?v=LRoc-na27l0).\n\n"
  },
  {
    "path": "articles/java/identity/includes/scenario-authorization-roles.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nThis application implements role-based access control (RBAC) using Microsoft Entra ID's application roles and role claims feature. Another approach is to use Microsoft Entra ID groups and group claims. Microsoft Entra ID groups and application roles aren't mutually exclusive. You can use them both to provide fine-grained access control.\n\nYou can also use RBAC with application roles and role claims to securely enforce authorization policies.\n\nFor a video that covers this scenario and this sample, see [Implement authorization in your applications using app roles, security groups, scopes, and directory roles](https://www.youtube.com/watch?v=LRoc-na27l0).\n\nFor more information about how the protocols work in this scenario and in other scenarios, see [Authentication vs. authorization](/entra/identity-platform/authentication-vs-authorization).\n\nThis application uses [MSAL for Java (MSAL4J)](https://github.com/AzureAD/microsoft-authentication-library-for-java) to sign in a user and obtain an [ID token](/entra/identity-platform/id-tokens) from Microsoft Entra ID.\n\nThis sample first uses the MSAL for Java (MSAL4J) to sign in the user. On the home page it displays an option for the user to view the claims in their ID tokens. This application also enables the users to view a privileged admin page or a regular user page, depending on the app role they've been assigned to. The idea is to provide an example of how, within an application, access to certain functionality or pages is restricted to subsets of users depending on which role they belong to.\n\nThis kind of authorization is implemented using RBAC. With RBAC, an administrator grants permissions to roles, not to individual users or groups. The administrator can then assign roles to different users and groups to control who has access to certain content and functionality.\n\nThis sample application defines the following two *Application Roles*:\n\n- `PrivilegedAdmin`: Authorized to access the **Admins Only** and the **Regular Users** pages.\n- `RegularUser`: Authorized to access the **Regular Users** page.\n\nThese application roles are defined in the [Azure portal](https://portal.azure.com) in the application's registration manifest. When a user signs into the application, Microsoft Entra ID emits a roles claim for each role granted individually to the user in the form of role membership.\n\nYou can assign users and groups to roles through the Azure portal.\n\n> [!NOTE]\n> Role claims aren't present for guest users in a tenant if the `https://login.microsoftonline.com/common/` endpoint is used as the authority to sign in users. You need to sign in a user to a tenanted endpoint like `https://login.microsoftonline.com/tenantid`.\n"
  },
  {
    "path": "articles/java/identity/includes/scenario-sign-in-azure-ad-b2c.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nThe following diagram shows the topology of the app:\n\n:::image type=\"content\" source=\"../media/topology-sign-in.png\" alt-text=\"Diagram that shows the topology of the app.\":::\n\nThe app uses MSAL4J to sign in users and obtain an [ID token](/entra/identity-platform/id-tokens) from Azure AD B2C. The ID token proves that the user is authenticated against a Azure AD B2C tenant.\n"
  },
  {
    "path": "articles/java/identity/includes/scenario-sign-in-entra.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\nThe following diagram shows the topology of the app:\n\n:::image type=\"content\" source=\"../media/topology-sign-in.png\" alt-text=\"Diagram that shows the topology of the app.\":::\n\nThe client app uses MSAL for Java (MSAL4J) to sign in users to their own Microsoft Entra ID tenant and obtain an [ID token](/entra/identity-platform/id-tokens) from Microsoft Entra ID. The ID token proves that a user is authenticated with this tenant. The app protects its routes according to the user's authentication status.\n"
  },
  {
    "path": "articles/java/identity/includes/spring-boot-overview-recommendations.md",
    "content": "---\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: bbanerjee\nms.date: 08/21/2025\n---\n\n## Recommendations\n\n- Some familiarity with the [Spring Framework](https://spring.io/).\n- Some familiarity with Linux/OSX terminal.\n- [jwt.ms](https://jwt.ms) for inspecting your tokens.\n- [Fiddler](https://www.telerik.com/fiddler) for monitoring your network activity and troubleshooting.\n- Follow the [Microsoft Entra Blog](https://techcommunity.microsoft.com/category/microsoft-entra/blog/microsoft-entra-blog) to stay up-to-date with the latest developments.\n"
  },
  {
    "path": "articles/java/identity/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Secure Java apps using the Microsoft identity platform\nsummary: Learn how the Microsoft identity platform enables Java developers to acquire tokens from Microsoft Entra ID and Azure AD B2C, allowing applications to authenticate users and access secured web APIs, Microsoft Graph, other Microsoft APIs, third-party web APIs, and your web API.\n\nmetadata:\n  title: Secure Java Apps Using the Microsoft Identity Platform\n  description: Learn how the Microsoft identity platform enables Java developers to acquire tokens from Microsoft Entra ID and Azure AD B2C, allowing applications to authenticate users and access secured web APIs, Microsoft Graph, other Microsoft APIs, third-party web APIs, and your web API.\n  author: bmitchell287\n  ms.author: brendm\n  ms.date: 08/21/2025\n  ms.topic: landing-page\n\nlandingContent:\n  - title: Secure your Java Spring Boot app\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Enable sign-in with Microsoft Entra ID\n            url: enable-spring-boot-webapp-authentication-entra-id.md\n          - text: Enable sign-in with Azure AD B2C\n            url: enable-spring-boot-webapp-authentication-azure-ad-b2c.md\n          - text: Access user details\n            url: enable-spring-boot-webapp-authorization-entra-id.md\n          - text: Use roles and role claims\n            url: enable-spring-boot-webapp-authorization-role-entra-id.md\n          - text: Use groups and group claims\n            url: enable-spring-boot-webapp-authorization-group-entra-id.md\n          - text: Deploy to Azure Container Apps\n            url: deploy-spring-boot-to-azure-container-apps.md\n  - title: Secure your Java Tomcat app\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Enable sign-in with Microsoft Entra ID\n            url: enable-java-tomcat-webapp-authentication-entra-id.md\n          - text: Enable sign-in with Azure AD B2C\n            url: enable-java-tomcat-webapp-authentication-azure-ad-b2c.md\n          - text: Access user details\n            url: enable-java-tomcat-webapp-authorization-entra-id.md\n          - text: Use roles and role claims\n            url: enable-java-tomcat-webapp-authorization-role-entra-id.md\n          - text: Use groups and group claims\n            url: enable-java-tomcat-webapp-authorization-group-entra-id.md\n          - text: Deploy to App Service\n            url: deploy-tomcat-to-app-service.md\n  - title: Secure your Java JBoss EAP app\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Enable sign-in with Microsoft Entra ID\n            url: enable-java-jboss-eap-webapp-authentication-entra-id.md\n          - text: Enable sign-in with Azure AD B2C\n            url: enable-java-jboss-eap-webapp-authentication-azure-ad-b2c.md\n          - text: Access user details\n            url: enable-java-jboss-eap-webapp-authorization-entra-id.md\n          - text: Use roles and role claims\n            url: enable-java-jboss-eap-webapp-authorization-role-entra-id.md\n          - text: Use groups and group claims\n            url: enable-java-jboss-eap-webapp-authorization-group-entra-id.md\n          - text: Deploy to App Service\n            url: deploy-jboss-to-app-service.md\n  - title: Secure your Java WebLogic app\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Enable sign-in with Microsoft Entra ID\n            url: enable-java-weblogic-webapp-authentication-entra-id.md\n          - text: Enable sign-in with Azure AD B2C\n            url: enable-java-weblogic-webapp-authentication-azure-ad-b2c.md\n          - text: Access user details\n            url: enable-java-weblogic-webapp-authorization-entra-id.md\n          - text: Use roles and role claims\n            url: enable-java-weblogic-webapp-authorization-role-entra-id.md\n          - text: Use groups and group claims\n            url: enable-java-weblogic-webapp-authorization-group-entra-id.md\n          - text: Deploy to WebLogic on Azure VM\n            url: deploy-weblogic-to-vm.md\n  - title: Secure your Java WebSphere app\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Enable sign-in with Microsoft Entra ID\n            url: enable-java-websphere-webapp-authentication-entra-id.md\n          - text: Enable sign-in with Azure AD B2C\n            url: enable-java-websphere-webapp-authentication-azure-ad-b2c.md\n          - text: Access user details\n            url: enable-java-websphere-webapp-authorization-entra-id.md\n          - text: Use roles and role claims\n            url: enable-java-websphere-webapp-authorization-role-entra-id.md\n          - text: Use groups and group claims\n            url: enable-java-websphere-webapp-authorization-group-entra-id.md\n          - text: Deploy to WebSphere on Azure VM\n            url: deploy-websphere-to-vm.md\n  - title: Secure your Java WebSphere Liberty/Open Liberty app\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Use Microsoft Entra ID OpenID Connect\n            url: ../ee/liberty-with-microsoft-entra-id.md?toc=/azure/developer/java/identity/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n  - title: Secure your Java Quarkus app\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Use Microsoft Entra ID OpenID Connect\n            url: ../ee/quarkus-with-microsoft-entra-id.md?toc=/azure/developer/java/identity/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n"
  },
  {
    "path": "articles/java/identity/secure-java-apps-with-identity-platform-overview.md",
    "content": "---\ntitle: Secure Java apps using the Microsoft identity platform\ntitleSuffix: Azure\ndescription: Provides an overview of recommended strategies for securing Java applications with the Microsoft identity platform.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: givermei\nms.date: 08/21/2025\nms.topic: get-started\nms.custom: devx-track-identity-java, devx-track-java, devx-track-extended-java\n---\n\n# Get started with securing Java application with the Microsoft identity platform\n\nThis series of articles provides an overview of recommended strategies for securing Java applications with the [Microsoft identity platform](/entra/identity-platform/v2-overview).\n\n\nThe Microsoft identity platform, along with [Microsoft Entra ID](/entra/fundamentals/whatis) (Entra ID) and [Azure Azure Active Directory B2C](/azure/active-directory-b2c/overview) (Azure AD B2C) are central to the Azure cloud ecosystem. This guidance takes you through the fundamentals of modern authentication using the [Microsoft Authentication Library (MSAL) for Java](https://github.com/AzureAD/microsoft-authentication-library-for-java).\n\nThe guidance is available for the following server platforms: Java Spring Boot, Tomcat, JBoss EAP, WebLogic, and WebSphere.\n\nWe recommend that you follow the articles in order for your platform of choice. However, the articles and code samples are self-contained, so you can use whichever article you need.\n\nEach platform has guidance on the following tasks:\n\n- Enable sign-in for your users with Microsoft Entra ID and learn to work with ID tokens.\n- Enable sign-in for your customers with Azure AD B2C. Learn how to integrate with external social identity providers. Learn how to use user flows and custom policies.\n- Enable your app to acquire an access token to authorize it to call the Microsoft Graph API. You can use the Microsoft Graph API to access extra user details.\n- Enable your app to acquire an ID token with the roles claim. You can use this token to filter access to routes based on role membership.\n- Enable your app to acquire an ID token with a groups claim. You can use this token to filter access to routes based on group membership. You also learn how to call Microsoft Graph to handle edge cases where the user is a member of too many groups to fit into an ID token.\n- Deploy your app to the Azure platform.\n\n## Next steps\n\nTo read all the guidance for a particular platform, start with one of the following articles:\n\n- [Secure your Java Spring Boot app](enable-spring-boot-webapp-authentication-entra-id.md)\n- [Secure your Java Tomcat app](enable-java-tomcat-webapp-authentication-entra-id.md)\n- [Secure your Java JBoss EAP app](enable-java-jboss-eap-webapp-authentication-entra-id.md)\n- [Secure your Java WebLogic app](enable-java-weblogic-webapp-authentication-entra-id.md)\n- [Secure your Java WebSphere app](enable-java-websphere-webapp-authentication-entra-id.md)\n- [Secure your Java WebSphere Liberty/Open Liberty app](../ee/liberty-with-microsoft-entra-id.md?toc=/azure/developer/java/identity/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n- [Secure your Java Quarkus app](../ee/quarkus-with-microsoft-entra-id.md?toc=/azure/developer/java/identity/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n\n## More information\n\nTo learn more about the Microsoft identity platform, see the following articles:\n\n- [Microsoft identity platform](/entra/identity-platform/)\n- [Azure Active Directory B2C](/azure/active-directory-b2c/)\n- [Overview of Microsoft Authentication Library (MSAL)](/entra/identity-platform/msal-overview)\n- [Application types for the Microsoft identity platform](/entra/identity-platform/v2-app-types)\n- [Consent experience for applications in Microsoft Entra ID](/entra/identity-platform/application-consent-experience)\n- [Understand user and admin consent](/entra/identity-platform/howto-convert-app-to-be-multi-tenant#understand-user-and-admin-consent-and-make-appropriate-code-changes)\n- [Application and service principal objects in Microsoft Entra ID](/entra/identity-platform/app-objects-and-service-principals)\n- [Microsoft identity platform best practices and recommendations](/entra/identity-platform/identity-platform-integration-checklist)\n\nFor more code samples, see the following articles:\n\n- [Microsoft identity platform code samples - Java](/entra/identity-platform/sample-v2-code?tabs=framework#java)\n- [Azure Active Directory B2C code samples](/azure/active-directory-b2c/code-samples)\n"
  },
  {
    "path": "articles/java/identity/toc.yml",
    "content": "items:\n- name: Secure Java apps using the Microsoft identity platform\n  href: index.yml\n  items:\n  - name: Overview\n    href: secure-java-apps-with-identity-platform-overview.md\n  - name: Secure your Java Spring Boot app\n    expanded: true\n    items:\n    - name: Enable sign-in with Microsoft Entra ID\n      href: enable-spring-boot-webapp-authentication-entra-id.md\n    - name: Enable sign-in with Azure AD B2C\n      href: enable-spring-boot-webapp-authentication-azure-ad-b2c.md\n    - name: Access user details\n      href: enable-spring-boot-webapp-authorization-entra-id.md\n    - name: Use roles and role claims\n      href: enable-spring-boot-webapp-authorization-role-entra-id.md\n    - name: Use groups and group claims\n      href: enable-spring-boot-webapp-authorization-group-entra-id.md\n    - name: Deploy to Azure Container Apps\n      href: deploy-spring-boot-to-azure-container-apps.md\n  - name: Secure your Java Tomcat app\n    expanded: true\n    items:\n    - name: Enable sign-in with Microsoft Entra ID\n      href: enable-java-tomcat-webapp-authentication-entra-id.md\n    - name: Enable sign-in with Azure AD B2C\n      href: enable-java-tomcat-webapp-authentication-azure-ad-b2c.md\n    - name: Access user details\n      href: enable-java-tomcat-webapp-authorization-entra-id.md\n    - name: Use roles and role claims\n      href: enable-java-tomcat-webapp-authorization-role-entra-id.md\n    - name: Use groups and group claims\n      href: enable-java-tomcat-webapp-authorization-group-entra-id.md\n    - name: Deploy to App Service\n      href: deploy-tomcat-to-app-service.md\n  - name: Secure your Java JBoss EAP app\n    expanded: true\n    items:\n    - name: Enable sign-in with Microsoft Entra ID\n      href: enable-java-jboss-eap-webapp-authentication-entra-id.md\n    - name: Enable sign-in with Azure AD B2C\n      href: enable-java-jboss-eap-webapp-authentication-azure-ad-b2c.md\n    - name: Access user details\n      href: enable-java-jboss-eap-webapp-authorization-entra-id.md\n    - name: Use roles and role claims\n      href: enable-java-jboss-eap-webapp-authorization-role-entra-id.md\n    - name: Use groups and group claims\n      href: enable-java-jboss-eap-webapp-authorization-group-entra-id.md\n    - name: Deploy to App Service\n      href: deploy-jboss-to-app-service.md\n  - name: Secure your Java WebLogic app\n    expanded: true\n    items:\n    - name: Enable sign-in with Microsoft Entra ID\n      href: enable-java-weblogic-webapp-authentication-entra-id.md\n    - name: Enable sign-in with Azure AD B2C\n      href: enable-java-weblogic-webapp-authentication-azure-ad-b2c.md\n    - name: Access user details\n      href: enable-java-weblogic-webapp-authorization-entra-id.md\n    - name: Use roles and role claims\n      href: enable-java-weblogic-webapp-authorization-role-entra-id.md\n    - name: Use groups and group claims\n      href: enable-java-weblogic-webapp-authorization-group-entra-id.md\n    - name: Deploy to WebLogic on Azure VM\n      href: deploy-weblogic-to-vm.md\n  - name: Secure your Java WebSphere app\n    expanded: true\n    items:\n    - name: Enable sign-in with Microsoft Entra ID\n      href: enable-java-websphere-webapp-authentication-entra-id.md\n    - name: Enable sign-in with Azure AD B2C\n      href: enable-java-websphere-webapp-authentication-azure-ad-b2c.md\n    - name: Access user details\n      href: enable-java-websphere-webapp-authorization-entra-id.md\n    - name: Use roles and role claims\n      href: enable-java-websphere-webapp-authorization-role-entra-id.md\n    - name: Use groups and group claims\n      href: enable-java-websphere-webapp-authorization-group-entra-id.md\n    - name: Deploy to WebSphere on Azure VM\n      href: deploy-websphere-to-vm.md\n  - name: Secure your Java WebSphere Liberty/Open Liberty app\n    expanded: true\n    items:\n    - name: Use Microsoft Entra ID OpenID Connect\n      href: ../ee/liberty-with-microsoft-entra-id.md?toc=/azure/developer/java/identity/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n  - name: Secure your Java Quarkus app\n    expanded: true\n    items:\n    - name: Use Microsoft Entra ID OpenID Connect\n      href: ../ee/quarkus-with-microsoft-entra-id.md?toc=/azure/developer/java/identity/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n  - name: Overview of the Microsoft Authentication Library (MSAL)\n    href: /entra/identity-platform/msal-overview\n"
  },
  {
    "path": "articles/java/includes/security-note.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 11/21/2024\n---\n\n> [!NOTE]\n> Microsoft recommends using the most secure authentication flow available. The authentication flow described in this procedure, such as for databases, caches, messaging, or AI services, requires a very high degree of trust in the application and carries risks not present in other flows. Use this flow only when more secure options, like managed identities for passwordless or keyless connections, are not viable. For local machine operations, prefer user identities for passwordless or keyless connections.\n"
  },
  {
    "path": "articles/java/index.yml",
    "content": "### YamlMime:Hub\n\ntitle: Azure for Java developer documentation\nsummary: Get started developing apps for the cloud with these tutorials and tools for Java developers.\nbrand: azure\n\nmetadata:\n  title: Azure for Java Developer Documentation\n  description: Get started developing apps for the cloud with these tutorials and tools for Java developers.\n  ms.topic: hub-page\n  ms.date: 06/15/2025\n  author: KarlErickson\n  ms.author: karler\n  ms.custom: devx-track-java, devx-track-extended-java\n\nconceptualContent:\n  items:\n\n    - title: Get started with Java on Azure\n      links:\n        - text: Code, deploy, and scale Java your way\n          itemType: overview\n          url: get-started/overview.md\n        - text: Code using the Java tools you know and love\n          itemType: get-started\n          url: get-started/code.md\n        - text: Deploy with confidence and ease\n          itemType: get-started\n          url: get-started/deploy.md\n        - text: Scale with security, monitoring, automation\n          itemType: get-started\n          url: get-started/scale.md\n        - text: Choose the right Azure services\n          itemType: get-started\n          url: get-started/choose.md\n      footerLink:\n        text: See more\n        url: get-started/index.yml\n\n    - title: Azure AI for Java\n      links:\n        - text: Develop using Foundry Tools\n          itemType: overview\n          url: ai/azure-ai-for-java-developers.md\n        - text: Enterprise chat using RAG\n          itemType: get-started\n          url: ai/get-started-app-chat-template.md\n        - text: Scale chat using RAG with Azure Container Apps\n          itemType: get-started\n          url: ai/get-started-app-chat-scaling-with-azure-container-apps.md\n      footerLink:\n        text: See more\n        url: ai/index.yml\n\n    - title: Tools, IDEs, and supported JDKs\n      links:\n        - text: Java support\n          itemType: get-started\n          url: fundamentals/java-support-on-azure.md\n        - text: Java JDK installation\n          itemType: get-started\n          url: fundamentals/java-jdk-install.md\n        - text: Java Docker images for Azure\n          itemType: get-started\n          url: /java/openjdk/containers\n      footerLink:\n          text: See more\n          url: fundamentals/index.yml\n\n    - title: Migrate to Azure\n      links:\n        - text: GitHub Copilot modernization for Java\n          itemType: overview\n          url: migration/migrate-github-copilot-app-modernization-for-java.md\n        - text: Spring to Azure Container Apps\n          itemType: how-to-guide\n          url: migration/migrate-spring-boot-to-azure-container-apps.md\n        - text: Tomcat to Azure App Service\n          itemType: how-to-guide\n          url: migration/migrate-tomcat-to-tomcat-app-service.md\n      footerLink:\n        text: See more\n        url: migration/index.yml\n\n    - title: Azure App Service\n      links:\n        - text: Create a Java app\n          itemType: quickstart\n          url: /azure/app-service/containers/quickstart-java\n        - text: Configure Java\n          itemType: how-to-guide\n          url: /azure/app-service/containers/configure-language-java\n      footerLink:\n        text: See App Service documentation\n        url: /azure/app-service/containers/\n\n    - title: Azure Container Apps\n      links:\n        - text: Launch your first Java app\n          itemType: quickstart\n          url: /azure/container-apps/java-get-started\n        - text: Get started using IntelliJ\n          itemType: quickstart\n          url: toolkit-for-intellij/create-container-apps-intellij.md?toc=/azure/container-apps/toc.json&bc=/azure/container-apps/breadcrumb/toc.json\n        - text: Overview\n          itemType: overview\n          url: /azure/container-apps/java-overview\n      footerLink:\n          text: See more\n          url: /azure/container-apps\n\n    - title: Secure apps using the Microsoft identity platform\n      links:\n        - text: Overview\n          itemType: overview\n          url: identity/secure-java-apps-with-identity-platform-overview.md\n        - text: Secure Spring Boot apps\n          itemType: how-to-guide\n          url: identity/enable-spring-boot-webapp-authentication-entra-id.md\n        - text: Secure Tomcat apps\n          itemType: how-to-guide\n          url: identity/enable-java-tomcat-webapp-authentication-entra-id.md\n      footerLink:\n          text: See more\n          url: identity/index.yml\n\n    - title: Azure SDK for Java\n      links:\n        - text: Libraries, drivers, and Spring modules\n          itemType: reference\n          url: sdk/libraries-drivers-modules.md\n        - text: Azure development using Maven\n          itemType: get-started\n          url: sdk/get-started-maven.md\n        - text: Introducing Azure SDK for Java\n          itemType: learn\n          url: sdk/overview.md\n      footerLink:\n          text: See more\n          url: sdk/index.yml\n\n    - title: Spring on Azure integration\n      links:\n        - text: What is Spring Cloud Azure?\n          itemType: get-started\n          url: spring-framework/spring-cloud-azure-overview.md\n        - text: Spring Data for Azure Cosmos DB\n          itemType: how-to-guide\n          url: spring-framework/how-to-guides-spring-data-cosmosdb.md\n        - text: Deploy a Spring Boot app\n          itemType: quickstart\n          url: /azure/spring-apps/enterprise/quickstart?pivots=sc-enterprise\n      footerLink:\n        text: See more\n        url: spring-framework/index.yml\n\n    - title: Containerization\n      links:\n        - text: Overview\n          itemType: concept\n          url: containers/overview.md\n        - text: Establish a baseline\n          itemType: concept\n          url: containers/baseline.md\n        - text: Containerize for Kubernetes\n          itemType: concept\n          url: containers/kubernetes.md\n      footerLink:\n        text: See more\n        url: containers/index.yml\n\n    - title: Azure Functions\n      links:\n        - text: Create an Azure Function\n          itemType: quickstart\n          url: /azure/azure-functions/create-first-function-vs-code-java\n        - text: Create a Spring Cloud Function\n          itemType: tutorial\n          url: ./spring-framework/getting-started-with-spring-cloud-function-in-azure.md\n        - text: Developer guide\n          itemType: reference\n          url: /azure/azure-functions/functions-reference-java\n      footerLink:\n        text: See Azure Functions documentation\n        url: /azure/azure-functions\n\n    - title: Monitoring Java apps\n      links:\n        - text: Get started with Application Insights\n          itemType: how-to-guide\n          url: /azure/azure-monitor/app/java-in-process-agent\n        - text: Get started with ELK\n          itemType: tutorial\n          url: ./fundamentals/java-get-started-with-logzio.md\n        - text: Monitor Spring apps\n          itemType: how-to-guide\n          url: /azure/spring-apps/enterprise/diagnostic-services\n      footerLink:\n        text: See Azure Monitor documentation\n        url: /azure/azure-monitor\n\n    - title: Securing Java apps\n      links:\n        - text: Enable end-user authentication\n          itemType: quickstart\n          url: /azure/active-directory/develop/web-app-quickstart?pivots=devlang-java\n        - text: Microsoft Authentication Library\n          itemType: how-to-guide\n          url: /azure/active-directory/develop/migrate-adal-msal-java\n        - text: Manage app secrets\n          itemType: quickstart\n          url: /azure/key-vault/quick-create-java\n      footerLink:\n        text: See Active Directory documentation\n        url: /azure/active-directory\n\n    - title: Java EE, Jakarta EE, and MicroProfile\n      links:\n        - text: Oracle WebLogic Server on Azure VMs\n          itemType: overview\n          url: /azure/virtual-machines/workloads/oracle/oracle-weblogic\n        - text: Deploy a Java EE app to AKS\n          itemType: how-to-guide\n          url: /azure/aks/howto-deploy-java-liberty-app\n      footerLink:\n        text: See Java EE documentation\n        url: ee/index.yml\n\ntools:\n  title: Tools\n  items:\n    - title: Azure Toolkit for IntelliJ\n      imageSrc: /media/logos/logo_intellij.svg\n      url: toolkit-for-intellij/index.yml\n    - title: Visual Studio Code\n      imageSrc: /media/logos/logo_vs-code.svg\n      url: https://code.visualstudio.com/docs\n    - title: Azure Toolkit for Eclipse\n      imageSrc: /media/logos/logo_eclipse.svg\n      url: toolkit-for-eclipse/index.yml\n    - title: Maven\n      imageSrc: /media/logos/logo_maven.svg\n      url: https://github.com/Microsoft/azure-maven-plugins#readme\n    - title: Gradle\n      imageSrc: /media/logos/logo-gradle-elephant-icon-gradient-primary.svg\n      url: https://github.com/Microsoft/azure-gradle-plugins#readme\n    - title: Azure CLI\n      imageSrc: /media/logos/logo_CLIgeneric.svg\n      url: /cli/azure\n    - title: Jenkins on Azure\n      imageSrc: /media/logos/logo_jenkins.svg\n      url: /azure/jenkins\n\nadditionalContent:\n  sections:\n    - title: \"\"\n  footer: Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.\n"
  },
  {
    "path": "articles/java/java-zone-pivot-groups.yml",
    "content": "# YamlMime:ZonePivotGroups\ngroups:\n# Owner: v-yeyonghui\n- id: passwordless-mysql\n  title: Azure Database for MySQL use passwordless connection\n  prompt: Choose the Azure Database for MySQL server to use\n  pivots:\n  - id: mysql-passwordless-flexible-server\n    title: Flexible Server\n  - id: mysql-passwordless-single-server\n    title: Single Server\n- id: passwordless-postgresql\n  title: Azure Database for PostgreSQL use passwordless connection\n  prompt: Choose the Azure Database for PostgreSQL server to use\n  pivots:\n  - id: postgresql-passwordless-flexible-server\n    title: Flexible Server\n  - id: postgresql-passwordless-single-server\n    title: Single Server\n- id: ide-set-one\n  title: IDE\n  prompt: Choose an IDE\n  pivots:\n  - id: vscode\n    title: Visual Studio Code\n  - id: intellij\n    title: IntelliJ IDEA\n"
  },
  {
    "path": "articles/java/migration/github-copilot-app-modernization-for-java-coding-agent.md",
    "content": "---\ntitle: Modernize Java Apps by Using GitHub Copilot Modernization in Coding Agent\ntitleSuffix: Azure\ndescription: Provides an overview of how Java developers can modernize applications by using GitHub Copilot modernization in the Copilot coding agent.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xinrzhu\nms.topic: overview\nms.date: 01/13/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Modernize Java apps by using GitHub Copilot modernization in coding agent\n\nThis article provides an overview of how Java developers can modernize their applications using GitHub Copilot modernization within the [Copilot coding agent](https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent). The agent can work independently in the background to complete modernization tasks, just like a human developer. Developers can delegate tasks via issues or pull requests, and the agent executes them in the cloud, helping teams complete the entire modernization journey efficiently.\n\n> [!NOTE]\n> Copilot coding agent is available with the GitHub Copilot Pro, GitHub Copilot Pro+, GitHub Copilot Business and GitHub Copilot Enterprise plans. The agent is available in all repositories stored on GitHub, except repositories owned by managed user accounts and where it has been explicitly disabled.\n\nSupported scenarios:\n\n- **Upgrade your Java application** – for example: `Upgrade this project to the latest Java version`.\n- **Migrate your Java application to Azure** – using predefined tasks listed in [Predefined tasks for GitHub Copilot modernization for Java developers](migrate-github-copilot-app-modernization-for-java-predefined-tasks.md#task-list).\n- **Deploy your Java application to Azure** – for example: `Deploy this application to Azure`.\n\n## Prerequisites\n\n- [Copilot coding agent](https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent) configured\n- A GitHub Copilot Pro, Pro+, Business, or Enterprise subscription\n- A GitHub repo\n\n> [!NOTE]\n> [!INCLUDE [Azure account note](../../includes/github-copilot-modernization-azure-note.md)]\n\n## Get started\n\nUse the following steps to get started with the Copilot coding agent:\n\n1. Go to the **Settings** section of the target repository you want to modernize. You must be an administrator of this repository.\n\n1. Select Copilot, then select **Coding Agent**.\n\n1. Under **MCP Configuration** in the **Model Context Protocol (MCP)** section, manually add the following configuration, and then select **Save Configuration**:\n\n   ```json\n   {\n     \"mcpServers\": {\n       \"app-modernization\": {\n         \"type\": \"local\",\n         \"command\": \"npx\",\n         \"tools\": [\n           \"*\"\n         ],\n         \"args\": [\n           \"-y\",\n           \"@microsoft/github-copilot-app-modernization-mcp-server\"\n         ]\n       }\n     }\n   }\n   ```\n\n   :::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-coding-agent/mcp.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-coding-agent/mcp.png\" alt-text=\"Screenshot of GitHub that shows the Copilot coding agent MCP configuration.\":::\n\n1. (Optional) If environment variables are required, set them under **Environment** > **Copilot** in the settings. These environment variables are initialized automatically the first time a user invokes an agentic task in this repository.\n\n1. Open the **Agents** panel in the top-right corner and enter your prompt. After the prompt is entered, Copilot starts a new session and opens a new pull request, which appears in the list below the prompt box. Copilot works on the task and then adds you as a reviewer when it's finished, triggering a notification.\n\n   :::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-coding-agent/agent-panel.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-coding-agent/agent-panel.png\" alt-text=\"Screenshot of GitHub that shows the Agents panel and a list of previous Java upgrade sessions.\":::\n\nYou can find sample prompts in the next section.\n\n## Upgrade your Java application\n\nTo upgrade your Java application to a newer runtime or framework version, run the following example prompt. This prompt helps ensure that your project stays aligned with the latest platform capabilities and security updates.\n\n```prompt\nUpgrade this project to JDK 21 and Spring Boot 3.5\n```\n\nThe following steps illustrate the upgrade process:\n\n1. Describe what you'd like to achieve in plain language.\n\n   :::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-coding-agent/upgrade-input.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-coding-agent/upgrade-input.png\" alt-text=\"Screenshot of GitHub that shows the Agents panel with the Java upgrade task input.\":::\n\n1. The coding agent then executes, including generating the upgrade plan, performing code remediation, building the project, and checking for vulnerabilities.\n\n   :::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-coding-agent/upgrade-progress.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-coding-agent/upgrade-progress.png\" alt-text=\"Screenshot of GitHub that shows the Agents panel with the Java upgrade progress.\":::\n\n1. You get a concise summary at the end.\n\n   :::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-coding-agent/upgrade-completion.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-coding-agent/upgrade-completion.png\" alt-text=\"Screenshot of GitHub that shows the Agents panel with the Java upgrade summary.\":::\n\n## Migrate your Java application to Azure\n\nTo migrate your Java application to Azure, describe your migration scenario for the coding agent as shown in the following example prompt. For more information about predefined migration tasks, see [Predefined tasks for GitHub Copilot modernization for Java developers](migrate-github-copilot-app-modernization-for-java-predefined-tasks.md). \n\n```prompt\nRun migration task for scenario Migrate Cassandra integration to Azure SDK using Managed Identity\n```\n\nThe following steps illustrate the migration process:\n\n1. Start by describing your migration task in plain language.\n\n   :::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-coding-agent/migrate-input.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-coding-agent/migrate-input.png\" alt-text=\"Screenshot of GitHub that shows the Agents panel with the Java migrate task input.\":::\n\n1. After the migration starts, you can monitor the progress.\n\n   :::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-coding-agent/migrate-progress.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-coding-agent/migrate-progress.png\" alt-text=\"Screenshot of GitHub that shows the Agents panel with the Java migration progress.\":::\n\n1. Finally, you can review the migration summary for insights, ensuring your app is fully modernized and cloud-ready.\n\n   :::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-coding-agent/migrate-completion.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-coding-agent/migrate-completion.png\" alt-text=\"Screenshot of GitHub that shows the Agents panel with the Java migration summary.\":::\n\n## Deploy your Java application to Azure\n\nAfter upgrading or migrating your application, you can deploy it directly from the coding agent by using the following prompt:\n\n```prompt\nDeploy this application to Azure\n```\n\nYou can follow the same steps for deployment as shown previously for upgrade and migration - the overall process remains consistent.\n\n## Provide feedback\n\nIf you have any feedback about GitHub Copilot agent, [create an issue at the github-copilot-appmod repository](https://github.com/microsoft/github-copilot-appmod/issues/new?template=feedback-template.yml).\n\n## Next step\n\n- [Use GitHub Copilot agents](https://docs.github.com/en/copilot/how-tos/use-copilot-agents)\n- [Migrate Java apps to Azure by using GitHub Copilot modernization via custom agent](migrate-github-copilot-app-modernization-for-java-custom-agent.md)\n"
  },
  {
    "path": "articles/java/migration/github-copilot-app-modernization-for-java-copilot-cli.md",
    "content": "---\ntitle: Modernize Java Apps by Using GitHub Copilot Modernization in the Copilot CLI\ntitleSuffix: Azure\ndescription: Provides an overview of how Java developers can modernize applications by using GitHub Copilot modernization in the Copilot CLI.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jessiehuang\nms.topic: overview\nms.date: 01/13/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Modernize Java apps by using GitHub Copilot modernization in the Copilot CLI\n\nThis article provides an overview of how Java developers can modernize their applications by using GitHub Copilot modernization within the [Copilot CLI](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli). With this approach, developers can modernize applications wherever they code. Copilot CLI delivers a seamless, end-to-end experience - from upgrade and migration to deployment - helping teams accelerate transformation, boost productivity, and confidently move their applications to modern platforms. It's currently in public preview - give it a try and let us know if you have any [feedback](https://aka.ms/ghcp-appmod/feedback).\n\n:::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-copilot-cli/entrance.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-copilot-cli/entrance.png\" alt-text=\"Screenshot of the GitHub Copilot CLI that shows a GitHub Copilot modernization prompt.\":::\n\n> [!NOTE]\n> GitHub Copilot CLI is available with the GitHub Copilot Pro, GitHub Copilot Pro+, GitHub Copilot Business, and GitHub Copilot Enterprise plans. If you receive Copilot from an organization, the Copilot CLI policy must be enabled in the organization's settings.\n\nUsing Copilot CLI for modernization enables you to run modernization tasks directly from the terminal, with no need to switch to an IDE. This approach supports both interactive - human-in-the-loop - and batch workflows.\n\nSupported scenarios:\n\n- **Upgrade your Java application** – for example: `Upgrade to the latest Java version`.\n- **Migrate your Java application to Azure** – using predefined tasks listed in [Predefined tasks for GitHub Copilot modernization for Java developers](migrate-github-copilot-app-modernization-for-java-predefined-tasks.md).\n- **Deploy your Java application to Azure** – for example: `Deploy this application to Azure`.\n\n## Prerequisites\n\n- [GitHub Copilot CLI](https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli).\n- A GitHub Copilot subscription. For more information, see [Copilot plans](https://github.com/features/copilot/plans?ref_product=copilot).\n- [Node.js](https://nodejs.org/) version 22 or later.\n- [npm](https://www.npmjs.com/get-npm) version 10 or later.\n\n> [!NOTE]\n> [!INCLUDE [Azure account note](../../includes/github-copilot-modernization-azure-note.md)]\n\n## Get started\n\nUse the following steps to get started with modernization using Copilot CLI.\n\n1. In your terminal, go to the Java project folder that contains the code you want to work on.\n\n1. Enter `copilot` to start Copilot CLI.\n\n   ```bash\n   copilot\n   ```\n\n   Copilot asks you to confirm that you trust the files in this folder. For more information, see [Using Copilot CLI](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli#trusted-directories).\n\n1. Choose one of the following options:\n\n   - **Yes, proceed**: Copilot can work with the files in this location for this session only.\n   - **Yes, and remember this folder for future sessions**: You trust the files in this folder for this and future sessions. You won't be asked again when you start Copilot CLI from this folder. Choose this option only if you're sure that it's always safe for Copilot to work with files in this location.\n   - **No, exit (Esc)**: End your Copilot CLI session.\n\n1. Add MCP servers by running `/mcp add` in Copilot CLI as shown in the following example, which adds the GitHub Copilot modernization MCP server:\n\n   ```Copilot CLI\n   /mcp add app-modernization\n   ```\n\n   Alternatively, manually update the `~/copilot/mcp-config.json` file with the following configuration. For more information, see [Add an MCP server](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli#add-an-mcp-server).\n\n   ```json\n   {\n     \"mcpServers\": {\n       \"app-modernization\": {\n         \"type\": \"local\",\n         \"command\": \"npx\",\n         \"tools\": [\n           \"*\"\n         ],\n         \"args\": [\n           \"-y\",\n           \"@microsoft/github-copilot-app-modernization-mcp-server\"\n         ]\n       }\n     }\n   }\n   ```\n\n1. Run `/mcp show` to verify that the MCP servers are correctly configured.\n\n   ```Copilot CLI\n   /mcp show\n   ```\n\n## Run modernization tasks\n\nYou can trigger key modernization tasks directly from the Copilot CLI by using natural language. Typical scenarios include upgrading Java version and framework, migrating workloads to Azure, containerizing applications, and deploying to Azure services.\n\n### Upgrade your Java application\n\nTo upgrade your Java application to a newer runtime or framework version, run the following example prompt in Copilot CLI. This approach helps ensure your project stays aligned with the latest platform capabilities and security updates.\n\n```prompt\nUpgrade this project to JDK 21 and Spring Boot 3.2\n```\n\nThe modernization task then executes, including generating the upgrade plan, performing code remediation, building the project, and checking for vulnerabilities as shown in the following screenshot:\n\n:::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-copilot-cli/upgrade-details.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-copilot-cli/upgrade-details.png\" alt-text=\"Screenshot of GitHub Copilot CLI that shows running tasks in Java upgrade scenarios.\":::\n\nThe project is successfully upgraded to JDK 21 and Spring Boot 3.2, and an upgrade summary is displayed.\n\n:::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-copilot-cli/upgrade-summary.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-copilot-cli/upgrade-summary.png\" alt-text=\"Screenshot of GitHub Copilot CLI that shows the Java upgrade summary.\":::\n\n### Migrate your Java application to Azure\n\nTo migrate your Java application to Azure, describe your migration scenario in Copilot CLI, as shown in the following example prompt. For more information on predefined migration tasks, see [Predefined tasks for GitHub Copilot modernization for Java developers](migrate-github-copilot-app-modernization-for-java-predefined-tasks.md).\n\n```prompt\nMigrate this application from S3 to Azure Blob Storage\n```\n\nWith this prompt, the migration task is executed and shows progress in Copilot CLI.\n\n:::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-copilot-cli/migrate-details.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-copilot-cli/migrate-details.png\" alt-text=\"Screenshot of GitHub Copilot CLI that shows running tasks in Java migration scenarios.\":::\n\nWhen the project is successfully migrated to Microsoft Azure Blob Storage, a migration summary is displayed.\n\n:::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-copilot-cli/migrate-summary.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-copilot-cli/migrate-summary.png\" alt-text=\"Screenshot of GitHub Copilot CLI that shows the Java migration summary.\":::\n\n### Deploy your Java application to Azure\n\nAfter upgrading or migrating your application, you can deploy it directly from Copilot CLI by using the following example prompt:\n\n```prompt\nDeploy this application to Azure\n```\n\nWith this prompt, the deployment task runs and shows progress in Copilot CLI.\n\n:::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-copilot-cli/deploy-details.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-copilot-cli/deploy-details.png\" alt-text=\"Screenshot of GitHub Copilot CLI that shows the Java deployment details.\":::\n\nWhen the project is successfully deployed, a deployment summary is displayed.\n\n:::image type=\"content\" source=\"./media/github-copilot-app-modernization-for-java-copilot-cli/deploy-summary.png\" lightbox=\"./media/github-copilot-app-modernization-for-java-copilot-cli/deploy-summary.png\" alt-text=\"Screenshot of GitHub Copilot CLI that shows the Java deployment summary.\":::\n\n## Provide feedback\n\nIf you have any feedback about GitHub Copilot CLI, [create an issue at the github-copilot-appmod repository](https://github.com/microsoft/github-copilot-appmod/issues/new?template=feedback-template.yml).\n\n## Next step\n\n- [Using GitHub Copilot CLI](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli#using-copilot-cli)\n- [Migrate Java apps to Azure by using GitHub Copilot modernization via custom agent](migrate-github-copilot-app-modernization-for-java-custom-agent.md)\n"
  },
  {
    "path": "articles/java/migration/github-copilot-app-modernization-for-java-portfolio-assessment-integration.md",
    "content": "---\ntitle: Integrate Portfolio Assessment with GitHub Copilot Modernization\ntitleSuffix: Azure\ndescription: Introduces the integration of portfolio assessment tools and GitHub Copilot modernization.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiading\nms.topic: overview\nms.date: 01/13/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Integrate portfolio assessment with GitHub Copilot modernization\n\nThis article introduces the integration support between portfolio assessment tools and GitHub Copilot modernization, providing an end-to-end workflow for application modernization.\n\nIn today's fast-evolving cloud landscape, modernizing legacy applications is a key priority for organizations seeking agility, scalability, and operational efficiency. Portfolio assessment tools play a crucial role in assessing and managing large portfolios of applications, while modern AI-powered tools like GitHub Copilot modernization streamline the process of application transformation.\n\n## What is portfolio assessment?\n\nA portfolio assessment tool is a solution designed to discover, assess, and manage the entire portfolio of applications and workloads within an organization's IT environment. These tools help organizations evaluate their application landscape, identify migration candidates, and plan modernization strategies.\n\n### Azure Migrate\n\nAzure Migrate is the portfolio assessment tool published by Microsoft. Azure Migrate offers a unified platform to discover, assess, and migrate on-premises applications, infrastructure, and data to Azure. It provides comprehensive portfolio assessment capabilities, including application dependency mapping, performance analysis, and migration readiness evaluation. For more information, see the [Azure Migrate documentation](/azure/migrate/index).\n\n### Dr. Migrate\n\nDr. Migrate is another widely adopted portfolio assessment tool that automates the assessment and migration of applications to the cloud. Dr. Migrate helps organizations quickly identify migration candidates, assess application compatibility, and generate detailed reports for modernization planning. For more information, see the [Dr. Migrate official documentation](https://docs.altra.cloud/docs/overview/).\n\n## Integration with GitHub Copilot modernization\n\nWe now offer seamless integration between the portfolio assessment features of these tools and GitHub Copilot modernization. This integration enables organizations to cover the complete application modernization journey - from discovery and assessment to code remediation - using AI-powered tools.\n\n### General integration flow\n\nThe integration between portfolio assessment tools and GitHub Copilot modernization follows a structured flow:\n\n1. Portfolio assessment: Using a portfolio assessment tool such as Azure Migrate or Dr. Migrate, organizations can scan their environment to detect all applications and identify candidates for migration and modernization.\n\n1. Application assessment: For each candidate application, you can trigger an app assessment directly from the portfolio assessment tool. GitHub Copilot modernization then performs the assessment. The resulting assessment report - which details modernization opportunities and technical recommendations - is made available there as well for centralized review by architects.\n\n1. Architect review and developer assignment: Architects review the generated application assessment reports to determine modernization priorities and application migration waves. Developers are then assigned applications for code remediation and modernization using the AI-driven capabilities of GitHub Copilot modernization to accelerate the process.\n\nTo understand the detailed integration flow and best practices, see the following articles:\n\n- [Azure Migrate documentation](https://aka.ms/azure-migrate-doc)\n- [Dr. Migrate documentation](https://aka.ms/dr-migrate-doc)\n\nOrganizations that use the integration between portfolio assessment tools and GitHub Copilot modernization can streamline their end-to-end application modernization journey, from discovery and assessment through to remediation and deployment.\n\n## See also\n\nTo learn more about GitHub Copilot modernization, see [GitHub Copilot modernization documentation](../../github-copilot-app-modernization/index.yml).\n"
  },
  {
    "path": "articles/java/migration/github-copilot-app-modernization-for-java-rearchitecture.md",
    "content": "---\ntitle: Re-architect Projects by Using GitHub Copilot Modernization\ntitleSuffix: Azure\ndescription: Learn how to use the re-architecture feature in GitHub Copilot modernization to rewrite projects from legacy frameworks to modern architectures.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiading\nms.topic: overview\nms.date: 04/17/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nai-usage: ai-generated\n---\n\n# Re-architect projects by using GitHub Copilot modernization\n\nThis article describes how to use the re-architecture feature in GitHub Copilot modernization to rewrite projects from legacy frameworks to modern architectures, such as from Struts to Spring MVC.\n\n> [!IMPORTANT]\n> The re-architecture feature is currently in preview. Preview features might have limited capabilities and aren't recommended for production use.\n\n## Overview\n\nThe re-architecture feature enables you to transform an entire project from a legacy framework to a modern architecture by using an AI-powered multi-agent workflow. Instead of manual, file-by-file migration, you can describe the desired transformation in natural language, and the modernization agents handle analysis, planning, and code generation.\n\nCommon re-architecture scenarios include:\n\n- Struts to Spring MVC\n- JSP to Thymeleaf\n- EJB to Spring Boot\n- Legacy servlet-based applications to modern Spring-based architectures\n\n## Prerequisites\n\n- Visual Studio Code with the [GitHub Copilot modernization](https://marketplace.visualstudio.com/items?itemName=vscjava.migrate-java-to-azure) extension installed.\n- A GitHub Copilot subscription. For more information, see [Copilot plans](https://github.com/features/copilot/plans?ref_product=copilot).\n- (Optional) [Python](https://www.python.org/downloads/) 3.7 or later for building a knowledge graph, which gives the agent a clearer understanding of your project structure during the rewriting process. If Python isn't available, the knowledge graph step is skipped.\n- (Optional) [Node.js](https://nodejs.org/) 18 or later for running Playwright tests as part of runtime validation. If Node.js isn't available, the Playwright test step is skipped.\n- (Optional) [Docker Desktop](https://www.docker.com/products/docker-desktop/) for runtime validation. If Docker isn't available, the runtime validation step is skipped.\n\n## Enable the re-architecture feature\n\nThe re-architecture feature is in preview, so you need to activate it manually in Visual Studio Code.\n\nUse the following steps to enable the feature:\n\n1. In Visual Studio Code, open the **Settings** editor by selecting **File** > **Preferences** > **Settings** (or **Code** > **Preferences** > **Settings** on macOS).\n\n1. Search for `appmod.experimental.task.rearchitecture`.\n\n1. Select the checkbox to enable the re-architecture feature.\n\nAlternatively, add the following entry to your `settings.json` file:\n\n```json\n{\n  \"appmod.experimental.task.rearchitecture\": true\n}\n```\n\n## Use the re-architecture agent\n\nAfter you enable the feature, use the re-architecture agent in the GitHub Copilot Chat panel.\n\nUse the following steps to re-architect a project:\n\n1. Open your project in Visual Studio Code.\n\n1. Open the **GitHub Copilot Chat** panel.\n\n1. Select the **modernize-rearchitecture** agent from the agent list.\n\n1. Describe the transformation you want to perform. For example:\n\n   ```prompt\n   Rewrite the entire project from Struts to Spring MVC\n   ```\n\nThe agent coordinates a multi-agent team that performs the following steps:\n\n1. **Analysis** - Examines the existing codebase, identifying framework patterns, dependencies, and module boundaries.\n1. **Planning** - Generates a structured implementation plan with ordered tasks and requirement traceability.\n1. **Execution** - Applies code transformations following the plan, with validation checks at each step.\n\n> [!IMPORTANT]\n> After the analysis and planning phases complete, the agent pauses and asks for your confirmation before it begins code generation. Review the plan carefully at this point. You can request changes to the plan, adjust priorities, or add constraints before the agent proceeds with the implementation.\n\n### Provide more context\n\nYou can improve the transformation results by providing additional context in your prompt:\n\n- Specify target framework versions, for example, \"Use Spring Boot 3.2 and Java 21.\"\n- Reference documentation links or migration guides.\n- Describe organization-specific patterns or conventions.\n- Indicate which modules or packages to prioritize.\n\nFor example:\n\n```prompt\nRewrite the entire project from Struts to Spring MVC using Spring Boot 3.2.\nRefer to the Spring MVC migration guide at https://docs.spring.io/spring-framework/reference/web/webmvc.html.\nKeep the existing backend business logic unchanged.\n```\n\n## Troubleshoot common issues\n\nDuring the re-architecture process, the agent generates artifacts in the `.github/modernize/` directory of your project. Use these artifacts to diagnose issues when they arise.\n\n### Review generated artifacts\n\nThe `.github/modernize/` directory contains the following key resources:\n\n- `board.md` - The task board that tracks every phase and its status. Check this file to see which tasks passed, failed, or required iterations.\n- `artifacts/` - Detailed reports from each task. Files follow a naming convention such as `t21-tester-report.md` for the initial test report, or `t21.2-tester-report.md` for a retry iteration.\n- `learn.md` - A cumulative knowledge base of discoveries, bug findings, and techniques logged by each role during task execution. Check this file for insights into issues the agent encountered and how it resolved them.\n- `team/` - Role-specific charters that define each agent's responsibilities.\n\nWhen a quality gate fails, the agent creates iteration artifacts (for example, `t21.1`, `t21.2`) that document the fix attempts. Look for these numbered iterations to understand how an issue was detected and resolved.\n\n### Review the analysis and plan\n\nBefore the agent starts writing code, it produces analysis and planning artifacts that you should review. These artifacts give you visibility into what the agent understood about your project and what it intends to build.\n\nThe analysis artifacts include:\n\n- **Architecture summary**: An overview of the existing tech stack, project structure, data model, and integration points. Check this to verify the agent correctly identified your project's key components. Look for files such as `artifacts/t2-architect-architecture-summary.md`, `artifacts/t2-architect-tech-stack.md`, and `artifacts/t2-architect-data-model.md`.\n- **Feature inventory**: A catalog of all features in the original application, each assigned a requirement ID (for example, `REQ-001`). Verify that this list is complete and accurate. Look for `artifacts/t3-pm-spec.md`.\n- **Target architecture design**: The proposed API contracts, module structure, and technology choices for the new application. Look for files such as `artifacts/t5-architect-api-contracts.md` and `artifacts/t5-architect-integration.md`.\n\nThe planning artifacts include:\n\n- **Implementation plan**: An ordered list of tasks with dependencies, grouped into phases. Each task maps back to one or more requirements from the feature inventory. Look for `artifacts/t7-teamlead-plan.md`.\n- **Testing strategy**: The planned approach for unit tests, integration tests, and end-to-end tests. Look for `artifacts/t7-teamlead-testing-strategy.md`.\n\nThe agent pauses after generating these artifacts and waits for your confirmation. Use this opportunity to:\n\n- Verify that no features are missing from the inventory.\n- Check that the target architecture matches your expectations.\n- Adjust task priorities or add constraints before implementation begins.\n\nCareful review at this stage helps avoid costly rework during the implementation and validation phases.\n\n### Build and startup failures\n\nIf the transformed application fails to compile or start, use the following approach:\n\n1. Check the tester report artifact (for example, `t21-tester-report.md`) for build output and stack traces.\n1. Search for the exception type or error message in the artifact to identify the root cause.\n1. If the agent created fix iterations (for example, `t21.1`, `t21.3`), review those artifacts to see what changes were attempted.\n\nCommon root causes include naming collisions between legacy and newly generated classes, incorrect Spring profile configurations, and missing or conflicting dependencies in `pom.xml`. For example, if legacy and modern controllers share the same class name, Spring throws a `ConflictingBeanDefinitionException` at startup.\n\n### Runtime errors\n\nIf the application starts but API calls return errors (such as 500 or 400 responses), use the following approach:\n\n1. Check the tester report artifact for which endpoints failed and the associated error messages.\n1. Review the security findings artifact (for example, `t20-security-findings.md`) for configuration issues.\n1. Inspect the generated entity classes and controller code for mismatches between the database schema and the ORM mappings.\n\nCommon root causes include database reserved keyword conflicts in `@Column` annotations, mismatches between DTO field types and entity field types, and missing validation annotations on request objects.\n\n### Quality gate failures and iterations\n\nThe agent enforces several quality gates during the re-architecture process. When a gate fails, the agent automatically creates fix tasks and retries validation. Common gate failures include:\n\n- **Architecture review**: The agent checks that the implementation matches the designed API contracts, DTO structures, and endpoint mappings. Failures typically involve missing endpoints, renamed fields, or missing validation annotations. Review the architect report artifact (for example, `t19-architect-review.md`) for specific findings.\n- **Conformance review**: The agent verifies that the implementation meets all principles defined in the initial constitution. A common failure is missing browser-level end-to-end tests when the constitution requires them. Review the team lead review artifact (for example, `t22-teamlead-review.md`) to identify which principles weren't satisfied.\n- **Feature parity sign-off**: The agent verifies that all cataloged requirements are implemented. A partial sign-off means specific features are incomplete, for example, missing cross-field validation such as ensuring `fromDate` is before `toDate`. Review the PM sign-off artifact (for example, `t23-pm-signoff.md`) for the requirement-by-requirement breakdown.\n\nIf the agent reaches its iteration limit without resolving all issues, review the latest artifact files to understand remaining gaps and apply manual fixes.\n\n### Runtime validation prerequisites\n\nThe agent performs optional runtime validation steps that depend on external tools. If a tool isn't available, the corresponding step is skipped:\n\n- **Python not installed**: The knowledge graph step is skipped. The agent can still perform the re-architecture, but might have less context about your project structure. Install Python 3.7 or later and ensure `python3` is available in your PATH.\n- **Node.js not installed**: Playwright browser-level end-to-end tests are skipped. The agent still runs integration tests through Maven. Install Node.js 18 or later to enable browser testing.\n- **Docker not available**: Runtime validation (starting the application in a container and verifying it serves requests) is skipped. The agent relies on unit and integration tests instead. Install and start Docker Desktop to enable this step.\n\n## Limitations\n\nBecause this feature is in preview, the following limitations apply:\n\n- Complex projects with deeply coupled legacy frameworks might require multiple iterations.\n- You should review generated code carefully before committing changes.\n\n## Provide feedback\n\nIf you have any feedback about the re-architecture feature, [create an issue at the github-copilot-appmod repository](https://github.com/microsoft/github-copilot-appmod/issues/new?template=feedback-template.yml) or use the [GitHub Copilot modernization feedback form](https://aka.ms/ghcp-appmod/feedback).\n"
  },
  {
    "path": "articles/java/migration/includes/account-for-authentication-and-authorization-was.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Account for authentication and authorization\n\nMost applications have some kind of authentication and authorization. If you use OpenID for authentication, you can configure OpenID connect authentication with Microsoft Entra ID. For more information, see [OpenID Connect authentication with Microsoft Entra ID](/azure/active-directory/fundamentals/auth-oidc).\n"
  },
  {
    "path": "articles/java/migration/includes/account-for-authentication-and-authorization.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Account for authentication and authorization\n\nMost applications have some kind of authentication and authorization. If you use LDAP for authentication, you can set up Microsoft Entra Domain Services with secure LDAP and configure LDAP connections in WebLogic Server. For more information, see [Create and configure a Microsoft Entra Domain Services managed domain](/azure/active-directory-domain-services/tutorial-create-instance) and [Configure secure LDAP for a Microsoft Entra Domain Services managed domain](/azure/active-directory-domain-services/tutorial-configure-ldaps).\n"
  },
  {
    "path": "articles/java/migration/includes/account-for-the-use-of-custom-security-providers-and-jaas.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Account for the use of custom security providers and JAAS\n\nIf your application is using JAAS, you need to make sure the configuration of security providers is correctly migrated. For more information, see [About Configuring WebLogic Security Providers](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/secmg/providers_intro.html) in the Oracle documentation.\n"
  },
  {
    "path": "articles/java/migration/includes/account-for-the-use-of-jca-adapters-and-resource-adapters-liberty.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Account for the use of JCA adapters and resource adapters\n\nIf your existing application uses JCA adapters or resource adapters to connect to other enterprise systems, ensure that you apply the configuration for these artifacts to the Liberty server running on Azure Kubernetes Service (AKS). For more information, see [Overview of JCA configuration elements](https://www.ibm.com/docs/was-liberty/base?topic=resourceadapter-overview-jca-configuration-elements) and [Java Connector Architecture](https://openliberty.io/docs/latest/reference/feature/connectors-2.1.html).\n"
  },
  {
    "path": "articles/java/migration/includes/account-for-the-use-of-jca-adapters-and-resource-adapters-was.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Account for the use of JCA adapters and resource adapters\n\nIf your existing application uses JCA adapters or other resource adapters to connect to other enterprise systems, ensure that you apply the configuration for these artifacts to the WAS running in Azure Virtual Machines. For more information, see [Relational resource adapters and JCA](https://www.ibm.com/docs/en/was/9.0.5?topic=concepts-relational-resource-adapters-jca) in the IBM documentation.\n"
  },
  {
    "path": "articles/java/migration/includes/account-for-the-use-of-jca-adapters-and-resource-adapters.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Account for the use of JCA Adapters and Resource Adapters\n\nIf your existing application is using JCA Adapters and/or Resource Adapters to connect to other enterprise systems, ensure that the configuration for these artifacts is applied to the WebLogic Server running in Azure Virtual Machines. For more information, see [Creating and Configuring Resource Adapters](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/adapt/creating.html)\n"
  },
  {
    "path": "articles/java/migration/includes/build-and-deploy-war-to-app-service.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Build the application \n\nBuild the application using the following Maven command.\n\n```bash\nmvn clean install -DskipTests\n```\n\n### Deploy the application\n\nIf your application is built from a Maven POM file, use the Webapp plugin for Maven to create the Web App and deploy your application. For more information, see [Quickstart: Create a Java app on Azure App Service](/azure/app-service/quickstart-java?tabs=javase&pivots=platform-linux).\n\nTo automate the deployment of JBoss EAP applications, you can use [Azure Pipelines task for Web App](/azure/devops/pipelines/tasks/deploy/azure-rm-web-app) or [GitHub Action for deploying to Azure WebApp](https://github.com/marketplace/actions/azure-webapp).\n"
  },
  {
    "path": "articles/java/migration/includes/build-and-push-the-docker-image-to-azure-container-registry.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Build and push the Docker image to Azure Container Registry\n\nAfter you've created the Dockerfile, you'll need to build the Docker image and publish it to your Azure container registry.\n\nIf you used our [WildFly Container Quickstart GitHub repo](https://github.com/Azure/wildfly-container-quickstart), the process of building and pushing your image to your Azure container registry would be the equivalent of invoking the following three commands.\n\nIn these examples, the `MY_ACR` environment variable holds the name of your Azure container registry and the `MY_APP_NAME` variable holds the name of the web application you want to use on your Azure container registry.\n\nBuild the WAR file:\n\n```bash\nmvn package\n```\n\nLog into your Azure container registry:\n\n```azurecli\naz acr login --name ${MY_ACR}\n```\n\nBuild and push the image:\n\n```azurecli\naz acr build --image ${MY_ACR}.azurecr.io/${MY_APP_NAME} --file src/main/docker/Dockerfile .\n```\n\nAlternatively, you can use Docker CLI to first build and test the image locally, as shown in the following commands. This approach can simplify testing and refining the image before initial deployment to ACR. However, it requires you to install the Docker CLI and ensure the Docker daemon is running.\n\nBuild the image:\n\n```bash\ndocker build -t ${MY_ACR}.azurecr.io/${MY_APP_NAME}\n```\n\nRun the image locally:\n\n```bash\ndocker run -it -p 8080:8080 ${MY_ACR}.azurecr.io/${MY_APP_NAME}\n```\n\nYour can now access your application at `http://localhost:8080`.\n\nLog into your Azure container registry:\n\n```azurecli\naz acr login --name ${MY_ACR}\n```\n\nPush the image to your Azure container registry:\n\n```bash\ndocker push ${MY_ACR}.azurecr.io/${MY_APP_NAME}\n```\n\nFor more in-depth information on building and storing container images in Azure, see the Learn module [Build and store container images with Azure Container Registry](/training/modules/build-and-store-container-images/).\n"
  },
  {
    "path": "articles/java/migration/includes/clean-up-windows-xserver-machine.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\nms.custom: devx-track-java, devx-track-extended-java, devx-track-azurecli\n---\n\n```azurecli\nexport WINDOWSVM_NIC_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myWindowsVM \\\n    --query networkProfile.networkInterfaces[0].id \\\n    --output tsv)\nexport WINDOWSVM_NSG_ID=$(az network nic show \\\n    --ids ${WINDOWSVM_NIC_ID} \\\n    --query networkSecurityGroup.id \\\n    --output tsv)\nexport WINDOWSVM_DISK_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myWindowsVM \\\n    --query storageProfile.osDisk.managedDisk.id \\\n    --output tsv)\nexport WINDOWSVM_PUBLIC_IP=$(az network public-ip list \\\n    -g ${RESOURCE_GROUP_NAME} --query [0].id \\\n    --output tsv)\n\necho \"deleting myWindowsVM\"\naz vm delete --resource-group ${RESOURCE_GROUP_NAME} --name myWindowsVM --yes\necho \"deleting nic ${WINDOWSVM_NIC_ID}\"\naz network nic delete --ids ${WINDOWSVM_NIC_ID}\necho \"deleting public-ip ${WINDOWSVM_PUBLIC_IP}\"\naz network public-ip delete --ids ${WINDOWSVM_PUBLIC_IP}\necho \"deleting disk ${WINDOWSVM_DISK_ID}\"\naz disk delete --yes --ids ${WINDOWSVM_DISK_ID}\necho \"deleting nsg ${WINDOWSVM_NSG_ID}\"\naz network nsg delete --ids ${WINDOWSVM_NSG_ID}\n```\n"
  },
  {
    "path": "articles/java/migration/includes/configure-custom-domain-and-ssl.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Configure custom domain and SSL\n\nIf your application will be visible on a custom domain, you'll need to map your web application to it. For more information, see [Tutorial: Map an existing custom DNS name to Azure App Service](/azure/app-service/app-service-web-tutorial-custom-domain).\n\nThen, you'll need to bind the SSL certificate for that domain to your App Service Web App. For more information, see [Secure a custom DNS name with an SSL binding in Azure App Service](/azure/app-service/app-service-web-tutorial-custom-ssl).\n"
  },
  {
    "path": "articles/java/migration/includes/configure-persistent-storage-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Configure persistent storage\n\nIf any part of your application reads or writes to the local file system, you need to configure persistent storage to replace the local file system. You can specify the path to mount in the container through the app settings and align it with the path your app is using. For more information, see [Use storage mounts in Azure Container Apps](/azure/container-apps/storage-mounts).\n"
  },
  {
    "path": "articles/java/migration/includes/create-an-availability-set.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Create an availability set\n\nCreate an availability set by using [az vm availability-set create](/cli/azure/vm/availability-set#az-vm-availability-set-create), as shown in the following example. Creating an availability set is optional, but we recommend it. For more information, see [Example Azure infrastructure walkthrough for Windows VMs](/azure/virtual-machines/windows/infrastructure-example).\n\n### [Bash](#tab/in-bash)\n\n```bash\naz vm availability-set create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name myAvailabilitySet \\\n    --platform-fault-domain-count 2 \\\n    --platform-update-domain-count 2\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```powershell\naz vm availability-set create `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name myAvailabilitySet `\n    --platform-fault-domain-count 2 `\n    --platform-update-domain-count 2\n```\n\n---\n"
  },
  {
    "path": "articles/java/migration/includes/create-windows-vm-and-set-up-xserver.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n1. Use the following steps to create a Windows 10 VM from the Azure portal:\n\n   1. Open the resource group you created before in the Azure portal.\n   1. Select **Create** to create the resource.\n   1. Select **Compute**, search for **windows 10**, and then select **Microsoft Windows 10**.\n   1. Select the plan that you want, and then select **Create**.\n   1. Use the following values to configure the VM:\n      - **Virtual machine name**: **myWindowsVM**\n      - **Image**: **Windows 10 Pro**\n      - **Username**: **azureuser**\n      - **Password**: **Secret123456**\n   1. Select the checkbox under **Licensing**.\n   1. Select **Review + create**, and then select **Create**.\n\n   It takes a few minutes to create the VM and supporting resources.\n\n   After the deployment finishes, install the X server and use it to configure the application server on the Linux machines by using a graphical interface.\n\n1. Use the following steps to install and launch the X server:\n\n   1. Use Remote Desktop to connect to `myWindowsVM`. For a detailed guide, see [How to connect using Remote Desktop and sign on to an Azure virtual machine running Windows](/azure/virtual-machines/windows/connect-rdp). You must execute the remaining steps in this section on `myWindowsVM`.\n   1. Download and install [VcXsrv Windows X Server](https://sourceforge.net/projects/vcxsrv/).\n   1. Disable the firewall. To allow communication from the Linux VMs, use the following steps to turn off Windows Defender Firewall:\n      1. Search for and open **Windows Defender Firewall**.\n      1. Find **Turn Windows Defender Firewall on or off**, and then select **Turn off** in **Private network settings**. You can leave **Public network settings** alone.\n      1. Select **OK**.\n      1. Close the **Windows Defender Firewall** settings panel.\n   1. Select **X-launch** from the desktop.\n   1. For display settings, set the display number to **-1** to use multiple windows, and then select **Next**.\n   1. For **Select how to start clients**, select  **Start no client**, and then select **Next**.\n   1. For extra settings, select **Clipboard and Primary Selection**, **Native opengl**, and **Disable access control**.\n   1. Select **Next** to finish.\n\n   A **Windows Security Alert** dialog might appear with this message: \"Allow VcXsrv windows X-server to communicate on these networks.\" Select **Allow access**.\n"
  },
  {
    "path": "articles/java/migration/includes/deploy-to-aks.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Deploy to Azure Kubernetes Service (AKS)\n\nCreate and apply your Kubernetes YAML file(s). For more information, see [Quickstart: Deploy an Azure Kubernetes Service (AKS) cluster using the Azure CLI](/azure/aks/kubernetes-walkthrough#run-the-application). If you're creating an external load balancer (whether for your application or for an ingress controller), be sure to provide the IP address provisioned in the previous section as the `LoadBalancerIP`.\n\nInclude externalized parameters as environment variables. For more information, see [Define Environment Variables for a Container](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/). Don't include secrets (such as passwords, API keys, and JDBC connection strings). These are covered in the following section.\n\nBe sure to include memory and CPU settings when creating your deployment YAML so your containers are properly sized.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-the-network-topology-liberty.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine the network topology\n\nThe current set of Azure Marketplace offers is a starting point for your migration. If the offer doesn't cover aspects of your architecture that you need to migrate, you need to capture the network topology of your existing deployment. Then, you need to reproduce that topology in Azure, even after standing up the basic offer with one of the solution templates.\n\nNetwork topology is a broad topic, but the following references can give some direction to your migration efforts:\n\n* For an enumeration of the high level topics relevant to the migration of network topology to Azure, see [WebSphere Application Server Network Deployment topologies](https://www.ibm.com/docs/mpf/7.1.0?topic=runtimes-websphere-application-server-network-deployment-topologies).\n* Because data sources are separate servers in a Liberty system, you must consider them as part of the network topology analysis. For more information, see [WebSphere Application Server Liberty Data Sources](https://www.ibm.com/docs/was-liberty/base?topic=liberty-configuring-relational-database-connectivity-in).\n* Messaging sources are also separate servers. For more information, see [WebSphere Application Server Liberty: WebSphere MQ messaging](https://www.ibm.com/docs/was-liberty/base?topic=configuration-wmqjmsclient).\n* Load balancing is a fundamental requirement. For information on the Liberty side of load balancing, see [WebSphere Application Server Liberty collective architecture](https://www.ibm.com/docs/was-liberty/base?topic=SSEQTP_liberty/com.ibm.websphere.wlp.zseries.doc/ae/cwlp_collective_arch.html).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-the-network-topology-was.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine the network topology\n\nThe current set of Azure Marketplace offers is a starting point for your migration. If the offer doesn't cover aspects of your architecture that you need to migrate, you need to capture the network topology of your existing deployment. Then, you need to reproduce that network topology in Azure, even after standing up the basic offer with one of the solution templates.\n\nNetwork topology is a broad topic, but the following references can give some direction to your migration efforts:\n\n* The following reference enumerates the high level topics relevant to the migration of network topology to Azure: [WebSphere Application Server Network Deployment topologies](https://www.ibm.com/docs/en/mpf/7.1.0?topic=runtimes-websphere-application-server-network-deployment-topologies).\n* Because data sources are separate servers in a WAS system, you must consider them as part of the network topology analysis. For more information, see [WebSphere Application Server Data Sources](https://www.ibm.com/docs/en/was/9.0.5?topic=concepts-data-sources).\n* Messaging sources are also separate servers. For more information, see [Network topologies: Interoperating by using the WebSphere MQ messaging provider](https://www.ibm.com/docs/en/was/9.0.5?topic=iummp-network-topologies-interoperating-by-using-websphere-mq-messaging-provider).\n* Load balancing is a fundamental requirement. The following reference covers the WAS side of load balancing: [WebSphere Application Server Network Deployment load-balanced clustering](https://www.ibm.com/docs/en/mfci/7.6.2?topic=haas-websphere-application-server-network-deployment-load-balanced-clustering).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-the-network-topology.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine the network topology\n\nThe current set of Azure Marketplace offers is a starting point for your migration. If the offer does not cover aspects of your architecture that you need to migrate, you'll need to capture the network topology of your existing deployment and reproduce that in Azure, even after standing up the basic offer with one of the solution templates.\n\nThis is a very broad topic, but the following references can give some direction to your migration efforts:\n\n* This reference enumerates the high level topics relevant to the migration of network topology to Azure: [Fast Track Deployment Guide](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/intro/deploying.html#GUID-E0BE4A3E-44CD-4C95-9540-7A850BF02F6A).\n* This reference describes important concerns regarding clustering, which has an impact on network topology: [WebLogic Server Clustering](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/intro/clustering.html#GUID-E39A18C2-B990-485F-BFB1-0549250FABFE).\n* Because data sources are separate servers in a WebLogic system, you must consider them as part of the network topology analysis. [WebLogic Server Data Sources](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/intro/jdbc.html).\n* Messaging sources are also separate servers. [WebLogic Server Messaging](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/intro/jms.html)\n* Load balancing is a fundamental requirement. This reference covers the WebLogic Server side of load balancing: [Load Balancing in a Cluster](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/intro/clustering.html).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-a-connection-to-on-premises-is-needed.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether a connection to on-premises is needed\n\nIf your application needs to access any of your on-premises services, you'll need to provision one of Azure's connectivity services. For more information, see [Connect an on-premises network to Azure](/azure/architecture/reference-architectures/hybrid-networking/). Alternatively, you'll need to refactor your application to use publicly available APIs that your on-premises resources expose.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-and-how-the-file-system-is-used-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Determine whether and how the file system is used\n\nFind any instances where your services write to and/or read from the local file system. Identify where short-term/temporary files are written and read and where long-lived files are written and read.\n\nAzure Container Apps offers several types of storage. Ephemeral storage can read and write temporary data and be available to a running container or replica. Azure File provides permanent storage and can be shared across multiple containers. For more information, see [Use storage mounts in Azure Container Apps](/azure/container-apps/storage-mounts).\n\n##### Read-only static content\n\nIf your application currently serves static content, you need an alternate location for it. You might wish to consider moving static content to Azure Blob Storage and adding Azure CDN for lightning-fast downloads globally. For more information, see [Static website hosting in Azure Storage](/azure/storage/blobs/storage-blob-static-website) and [Quickstart: Integrate an Azure storage account with Azure CDN](/azure/cdn/cdn-create-a-storage-account-with-cdn).\n\n##### Dynamically published static content\n\nIf your application supports static content, whether uploaded or generated by the application itself, that remains unchanged after its creation, you can integrate Azure Blob Storage and Azure CDN. You can also use an Azure Function to manage uploads and trigger CDN refreshes when necessary. We've provided a sample implementation for your use at [Uploading and CDN-preloading static content with Azure Functions](https://github.com/Azure-Samples/functions-java-push-static-contents-to-cdn).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-and-how-the-file-system-is-used.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Determine whether and how the file system is used\n\nAny usage of the file system on the application server will require reconfiguration or, in rare cases, architectural changes. You may identify some or all of the following scenarios.\n\n[!INCLUDE [static-content](static-content.md)]\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-ejb-timers-are-in-use.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Determine whether EJB timers are in use\n\nIf your application uses EJB timers, you'll need to validate that the EJB timer code can be triggered by each WildFly instance independently. This validation is needed because, in the Azure Kubernetes Service deployment scenario, each EJB timer will be triggered on its own WildFly instance.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-ibm-integration-bus-is-in-use.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine whether IBM Integration Bus is in use\n\nIf your application is using IBM Integration Bus, you need to capture how IBM Integration Bus is configured. For more information, see [IBM Integration Bus documentation](https://www.ibm.com/docs/en/integration-bus/9.0.0).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-jaas-is-in-use-jboss.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Determine whether JAAS is in use\n\nIf your application is using JAAS, you'll need to capture how JAAS is configured. If it's using a database, you can convert it to a JAAS domain on JBoss EAP. If it's a custom implementation, you'll need to validate that it can be used on JBoss EAP.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-jaas-is-in-use.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Determine whether JAAS is in use\n\nIf your application is using JAAS, you'll need to capture how JAAS is configured. If it's using a database, you can convert it to a JAAS domain on WildFly. If it's a custom implementation, you'll need to validate that it can be used on WildFly.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-jms-queues-or-topics-are-in-use-virtual-machines-was.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine whether Java Message Service (JMS) Queues or Topics are in use\n\nIf your application is using JMS Queues or Topics, you need to migrate them to an externally hosted JMS server. One strategy for those using JMS is to use Azure Service Bus and the Advanced Message Queuing Protocol. For more information, see [Use Java Message Service 1.1 with Azure Service Bus standard and AMQP 1.0](/azure/service-bus-messaging/service-bus-java-how-to-use-jms-api-amqp).\n\nIf you've configured JMS persistent stores, you must capture their configuration and apply it after the migration.\n\nIf you're using IBM MQ, you can migrate this software to Azure Virtual Machines and use it as-is.\n\nMicrosoft has a solution to integrate IBM MQ with Logic Apps. For more information, see [Connect to an IBM MQ server from a workflow in Azure Logic Apps](/azure/connectors/connectors-create-api-mq).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-jms-queues-or-topics-are-in-use-virtual-machines.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether Java Message Service (JMS) Queues or Topics are in use\n\nIf your application is using JMS Queues or Topics, you'll need to migrate them to an externally-hosted JMS server. Azure Service Bus and the Advanced Message Queuing Protocol can be a great migration strategy for those using JMS. For more information, see [Use Java Message Service 1.1 with Azure Service Bus standard and AMQP 1.0](/azure/service-bus-messaging/service-bus-java-how-to-use-jms-api-amqp).\n\nIf JMS persistent stores have been configured, you must capture their configuration and apply it after the migration.\n\nIf you're using Oracle Message Broker, you can migrate this software to Azure virtual machines and use it as-is.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-jms-queues-or-topics-are-in-use.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether Java Message Service (JMS) Queues or Topics are in use\n\nIf your application is using JMS Queues or Topics, you'll need to migrate them to an externally hosted JMS server. Azure Service Bus and the Advanced Message Queuing Protocol (AMQP) can be a great migration strategy for those using JMS. For more information, see [Use Java Message Service 1.1 with Azure Service Bus standard and AMQP 1.0](/azure/service-bus-messaging/service-bus-java-how-to-use-jms-api-amqp).\n\nIf JMS persistent stores have been configured, you must capture their configuration and apply it after the migration.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-liberty-license-is-needed.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine whether a license is needed\n\nFor IBM WebSphere Liberty, you must accept the terms on the license agreement corresponding to the version of the IBM Program in the application container. For the license agreement applicable to this IBM Program, see [Viewing license information for WebSphere Liberty operator](https://ibm.biz/was-license). For more information, see [Running WebSphere Liberty on Microsoft Azure](https://www.ibm.com/docs/was-liberty/core?topic=container-running-websphere-liberty-microsoft-azure).\n\nIf your product edition is something other than the default IBM WebSphere Application Server (base), the `.spec.license.edition value` must specify your product edition. Other available values are IBM WebSphere Application Server Liberty Core and IBM WebSphere Application Server Network Deployment. The prebuilt Azure Marketplace offer allows you to select the supported product edition.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-management-over-rest-is-used.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether Management over REST is used\n\nIf the lifecycle of your application includes using Management over REST, you need to capture which ports are used to access the REST API and determine how they are authenticated and exposed. After migration, you'll need to ensure that these same ports and authentication mechanisms are exposed so your application lifecycle can operate in a similar fashion as before the migration. For more information, see [Administering Oracle WebLogic Server with RESTful Management Services](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/wlrur/index.html).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-oracle-service-bus-is-in-use.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether Oracle Service Bus is in use\n\nIf your application is using Oracle Service Bus (OSB), you'll need to capture how OSB is configured. For more information, see [About the Oracle Service Bus Installation](https://docs.oracle.com/en/middleware/fusion-middleware/14.1.2/inosb/index.html).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-osgi-bundles-are-used-was.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine whether OSGi bundles are used\n\nIf you used OSGi bundles added to the WAS, you need to add the equivalent JAR files directly to your web application.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-osgi-bundles-are-used.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether OSGi bundles are used\n\nIf you used OSGi bundles added to the WebLogic server, you'll need to add the equivalent JAR files directly to your web application.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-session-replication-is-used-jboss-eap.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Determine whether session replication is used\n\nIf your application relies on session replication, with or without Oracle Coherence*Web, you have two options:\n\n* Refactor your application to use a database for session management.\n* Refactor your application to externalize the session to Azure Redis Service. For more information, see [Azure Cache for Redis](/azure/azure-cache-for-redis/cache-overview).\n\nFor all of these options, it's a good idea to master how WebLogic does HTTP Session State Replication. For more information, see [HTTP Session State Replication](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/clust/failover.html#GUID-E13D8142-66BA-46A1-854F-4FC6F82992DD) in the Oracle documentation.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-session-replication-is-used-liberty.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine whether session replication is used\n\nIf your application relies on session replication, you have the following options:\n\n* For [HTTP sessions](https://www.ibm.com/docs/en/was/9.0.5?topic=applications-configuring-http-sessions), according to the level of session management, you can use cache or a database to collect session data.\n* For [Distributed sessions](https://www.ibm.com/docs/en/was/9.0.5?topic=sessions-distributed), you can save sessions in a database using database session persistence.\n* For [Dynamic cache](https://www.ibm.com/docs/en/was/9.0.5?topic=extensions-introduction-dynamic-cache), you can manage session data in cache or a database.\n* You can refactor your application to use a database for session management.\n* You can refactor your application to externalize the session to Azure Redis Service. For more information, see [Azure Cache for Redis](/azure/azure-cache-for-redis/cache-overview).\n\nFor all of these options, it's a good idea to master how Liberty does HTTP Session State Replication. The following documents help you understand how to manage HTTP Sessions in Liberty:\n\n* [Configuring Liberty session persistence to a database](https://www.ibm.com/docs/was-liberty/base?topic=manually-configuring-liberty-session-persistence-database)\n* [Configuring Liberty session persistence with JCache](https://www.ibm.com/docs/was-liberty/base?topic=manually-configuring-liberty-session-persistence-jcache)\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-session-replication-is-used-was.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine whether session replication is used\n\nIf your application relies on session replication, you have the following options:\n\n* For [HTTP sessions](https://www.ibm.com/docs/en/was/9.0.5?topic=applications-configuring-http-sessions), according to the level of session management, you can use memory or a database to collect session data.\n* For [Distributed sessions](https://www.ibm.com/docs/en/was/9.0.5?topic=sessions-distributed), you can save sessions in a database using database session persistence.\n* For [Dynamic cache](https://www.ibm.com/docs/en/was/9.0.5?topic=extensions-introduction-dynamic-cache), you can manage session data in memory-to-memory replication or a database.\n* Refactor your application to use a database for session management.\n* Refactor your application to externalize the session to Azure Redis Service. For more information, see [Azure Cache for Redis](/azure/azure-cache-for-redis/cache-overview).\n\nFor all of these options, it's a good idea to master how WAS does HTTP Session State Replication. For more information, see [Administering session beans](https://www.ibm.com/docs/en/was/9.0.5?topic=applications-administering-session-beans) in the IBM documentation.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-session-replication-is-used.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether session replication is used\n\nIf your application relies on session replication, with or without Oracle Coherence*Web, you have three options:\n\n* Coherence*Web can run alongside a WebLogic Server in the Azure virtual machines, but you must manually configure this option after you provision the offer. If you are using standalone Coherence, you can also run it in an Azure virtual machine, but you must manually configure this option after you provision the offer.\n* Refactor your application to use a database for session management.\n* Refactor your application to externalize the session to Azure Redis Service. For more information, see [Azure Cache for Redis](/azure/azure-cache-for-redis/cache-overview).\n\nFor all of these options, it's a good idea to master how WebLogic does HTTP Session State Replication. For more information, see [HTTP Session State Replication](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/clust/failover.html) in the Oracle documentation.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-the-java-ee-application-client-feature-is-in-use-aks.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Determine whether the Java EE Application Client feature is in use\n\nIf you have client applications that connect to your (server) application using the Java EE Application Client feature, you'll need to refactor both your client applications and your (server) application to use HTTP APIs.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-the-java-ee-application-client-feature-is-used.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether the Java EE Application Client feature is used\n\nIf your application uses the Java EE Application Client feature, it should continue to work unchanged after migrating to Azure Virtual Machines. For more information, see [Using Java EE Client Application Modules](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/saclt/modules.html).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-the-liberty-version-is-compatible.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine whether the Liberty version is compatible\n\nYou need the [Open Liberty Operator](https://openliberty.io/docs/latest/open-liberty-operator.html) or the [WebSphere Liberty operator](https://www.ibm.com/docs/en/was-liberty/core?topic=operator-getting-started-websphere-liberty) to deploy and manage applications on Kubernetes-based clusters. Make sure your existing Liberty version is one of the versions supported by the operator. Versions of Open Liberty are maintained in GitHub [OpenLiberty/open-liberty](https://github.com/OpenLiberty/open-liberty/releases). IBM maintains versions of IBM WebSphere Application Server Liberty. For more information, see [WebSphere Application Server Liberty](https://www.ibm.com/docs/was-liberty/base?topic=liberty-overview).\n\nThe prebuilt Azure Marketplace offer allows you to select your application images from public registry, and thus implicitly supports all of the versions.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-was-clustering-is-used.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether WAS clustering is used\n\nMost likely, you've deployed your application on multiple WAS servers to achieve high availability. You can migrate these clusters directly from your on-premises installation to WAS running in Azure Virtual Machines. For more information, see [WebSphere Application Server Network Deployment](https://www.ibm.com/docs/en/was-nd/9.0.5?topic=network-deployment-all-operating-systems-version-90) in the IBM documentation.\n\n### Account for load-balancing requirements\n\nLoad balancing is an essential part of migrating your WAS cluster to Azure. The easiest solution is to use the built-in support for [Azure Application Gateway](/azure/application-gateway/overview) or [IBM HTTP Server](https://www.ibm.com/docs/en/ibm-http-server/9.0.5) provided in the Azure Marketplace offer for [IBM WebSphere Application Server Cluster](https://aka.ms/twas-cluster-portal).\n\nFor a summary of the capabilities of Azure Application Gateway compared to other Azure load-balancing solutions, see [Load-balancing options](/azure/architecture/guide/technology-choices/load-balancing-overview).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-was-has-been-customized.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine whether WAS has been customized\n\nDetermine which of the following customizations have been made, and capture what's been done.\n\n* Have the startup scripts been changed? Such scripts include **wsadmin**, **AdminControl**, **AdminConfig**, **AdminApp**, and **AdminTask**.\n* Are there any specific parameters passed to the JVM?\n* Are there JARs added to the server classpath?\n* Have OS-level facilities such as `systemd` been used to cause WAS components to start automatically after a server restart?\n\nYou need to account for migration considerations depending on the answers to these questions.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-weblogic-clustering-is-used.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether WebLogic clustering is used\n\nMost likely, you've deployed your application on multiple WebLogic servers to achieve high availability. You can migrate these clusters directly from your on-premises installation to WebLogic running in Azure Virtual Machines. For more information, see [Domain Configuration Files](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/domcf/config_files.html) in the Oracle documentation.\n\n### Account for load-balancing requirements\n\nLoad balancing is an essential part of migrating your Oracle WebLogic Server cluster to Azure.  The easiest solution is to use the built-in support for [Azure Application Gateway](/azure/application-gateway/overview) provided in the Azure Marketplace offer for Oracle WebLogic Server cluster.  For a tutorial on this topic, see [Tutorial: Migrate a WebLogic Server cluster to Azure with Azure Application Gateway as a load balancer](../migrate-weblogic-with-app-gateway.md).\n\nFor a summary of the capabilities of Azure Application Gateway compared to other Azure load-balancing solutions, see [Overview of load-balancing options in Azure](/azure/architecture/guide/technology-choices/load-balancing-overview).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-weblogic-has-been-customized.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether WebLogic has been customized\n\nDetermine which of the following customizations have been made, and capture what's been done.\n\n* Have the startup scripts been changed? Such scripts include **setDomainEnv**, **commEnv**, **startWebLogic**, and **stopWebLogic**.\n* Are there any specific parameters passed to the JVM?\n* Are there JARs added to the server classpath?\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-wlst-is-used.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether WebLogic Scripting Tool (WLST) is used\n\nIf you currently use WLST to perform your deployment, you'll need to assess what it's doing. If WLST is changing any (runtime) parameters of your application as part of the deployment, you'll need to make sure that this behavior continues to work while testing your application after migration.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether you are using your own custom created Shared Java EE Libraries\n\nIf you're using the Shared Java EE library feature, you have two options:\n\n* Refactor your application code to remove all dependencies on your libraries, and instead incorporate the functionality directly into your application.\n* Add the libraries to the server classpath.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-contains-os-specific-code-no-title.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\nIf your application contains any code with dependencies on the host OS, then you need to refactor it to remove those dependencies. For example, you may need to replace any use of `/` or `\\` in file system paths with [`File.Separator`](https://docs.oracle.com/javase/8/docs/api/java/io/File.html#separator) or [`Paths.get`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Paths.html#get-java.lang.String-java.lang.String...-) if your application is running on Windows.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-contains-os-specific-code.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether your application contains OS-specific code\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code-no-title](determine-whether-your-application-contains-os-specific-code-no-title.md)]\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-is-composed-of-multiple-wars.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether your application is composed of multiple WARs\n\nIf your application is composed of multiple WARs, you should treat each of those WARs as separate applications and go through this guide for each of them.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-is-packaged-as-an-ear-was.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Determine whether your application is packaged as an EAR\n\nIf your application is packaged as an EAR file, be sure to examine the **application.xml**, **ibm-application-bnd.xmi**, and **ibm-application-ext.xmi** files and capture their configurations. For more information, see [Building the enterprise archive (EAR) package on WebSphere](https://www.ibm.com/docs/en/configurepricequote/10.0?topic=overview-building-enterprise-archive-ear-package-websphere).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-is-packaged-as-an-ear.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Determine whether your application is packaged as an EAR\n\nIf your application is packaged as an EAR file, be sure to examine the **application.xml** and **weblogic-application.xml** files and capture their configurations.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-relies-on-scheduled-jobs-app-service.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Determine whether your application relies on scheduled jobs\n\nScheduled jobs, such as Quartz Scheduler tasks or Unix cron jobs, should NOT be used with Azure App Service. Azure App Service will not prevent you from deploying an application containing scheduled tasks internally. However, if your application is scaled out, the same scheduled job may run more than once per scheduled period. This situation can lead to unintended consequences.\n\nInventory any scheduled tasks running on the production server(s), inside or outside your application code.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-relies-on-scheduled-jobs-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Determine whether your application relies on scheduled jobs\n\nEphemeral application such as Unix cron jobs or short-live applications based on Spring Batch framework should run as a job on Azure Container Apps. For more information, see [Jobs in Azure Container Apps](/azure/container-apps/jobs). If your application is a long-running application and executes tasks regularly using a scheduling framework such as Quartz or Spring Batch, Azure Container Apps can host that application. However, the application must handle scaling appropriately to avoid race conditions where the same application instances are executed more than once per scheduled period during scale-out or rolling upgrade.\n\nInventory any scheduled tasks running on the production servers, inside or outside your application code.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-relies-on-scheduled-jobs.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Determine whether your application relies on scheduled jobs\n\nScheduled jobs, such as Quartz Scheduler tasks or Unix cron jobs, should NOT be used with Azure Kubernetes Service (AKS). Azure Kubernetes Service will not prevent you from deploying an application containing scheduled tasks internally. However, if your application is scaled out, the same scheduled job may run more than once per scheduled period. This situation can lead to unintended consequences.\n\nTo execute scheduled jobs on your AKS cluster, define Kubernetes CronJobs as needed. For more information, see [Running Automated Tasks with a CronJob](https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/).\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-uses-a-resource-adapter-jboss.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Determine whether your application uses a Resource Adapter\n\nIf your application needs a Resource Adapter (RA), it needs to be compatible with JBoss EAP. Determine whether the RA works fine on a standalone instance of JBoss EAP by deploying it to the server and properly configuring it. If the RA works properly, you'll need to add the JARs to the server classpath of the App Service and put the necessary configuration files in the correct location in the JBoss EAP server directories for it to be available.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-uses-a-resource-adapter.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Determine whether your application uses a Resource Adapter\n\nIf your application needs a Resource Adapter (RA), it needs to be compatible with WildFly. Determine whether the RA works fine on a standalone instance of WildFly by deploying it to the server and properly configuring it. If the RA works properly, you'll need to add the JARs to the server classpath of the Docker image and put the necessary configuration files in the correct location in the WildFly server directories for it to be available.\n"
  },
  {
    "path": "articles/java/migration/includes/determine-whether-your-application-uses-entity-beans.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Determine whether your application uses Entity Beans or EJB 2.x-style CMP Beans\n\nIf your application uses Entity Beans or EJB 2.x style CMP beans, you'll need to refactor your application to remove these dependencies.\n"
  },
  {
    "path": "articles/java/migration/includes/document-datasources-was.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Document datasources\n\nIf your application uses any databases, you need to capture the following information:\n\n* What is the datasource name?\n* What is the connection pool configuration?\n* Where can I find the JDBC driver JAR file?\n\nFor more information on JDBC drivers in WAS, see [Using JDBC Drivers with WebSphere Application Server](https://www.ibm.com/docs/en/was/9.0.5?topic=concepts-jdbc-providers).\n"
  },
  {
    "path": "articles/java/migration/includes/document-datasources.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Document datasources\n\nIf your application uses any databases, you need to capture the following information:\n\n* What is the datasource name?\n* What is the connection pool configuration?\n* Where can I find the JDBC driver JAR file?\n\nFor more information on JDBC drivers in WebLogic, see [Using JDBC Drivers with WebLogic Server](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/jdbca/third_party_drivers.html).\n"
  },
  {
    "path": "articles/java/migration/includes/dynamic-or-internal-content-aks.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n#### Dynamic or internal content\n\nFor files that are frequently written and read by your application (such as temporary data files), or static files that are visible only to your application, you can mount Azure Storage shares as persistent volumes. For more information, see [Create and use a volume with Azure Files in Azure Kubernetes Service (AKS)](/azure/aks/azure-csi-files-storage-provision).\n"
  },
  {
    "path": "articles/java/migration/includes/dynamic-or-internal-content-app-service.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Dynamic or internal content\n\nFor files that are frequently written and read by your application (such as temporary data files), or static files that are visible only to your application, you can use local file storage associated with your app service plan. For more information, see [Operating system functionality on Azure App Service](/azure/app-service/operating-system-functionality#file-access) and [Understanding the Azure App Service file system](https://github.com/projectkudu/kudu/wiki/Understanding-the-Azure-App-Service-file-system).\n"
  },
  {
    "path": "articles/java/migration/includes/ensure-console-logging-and-configure-diagnostic-settings-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Ensure console logging and configure diagnostic settings\n\nConfigure your logging to ensure that all output is routed to the console rather than to files.\n\nAfter an application is deployed to Azure Container Apps, you can configure the logging options within your Container Apps environment to define one or more destinations of the logs. These destinations can include Azure Monitor Log Analytics, Azure Event hub, or even other third-party monitoring solutions. You also have the option to disable log data and view logs only at runtime. For detailed configuration instruction, see [Log storage and monitoring options in Azure Container Apps](/azure/container-apps/log-options).\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-azure-sql-database.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\nFirst, create the primary Azure SQL Database by following the Azure portal steps in [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal). Follow the steps up to, but not including **Clean up resources**. Use the following directions as you go through the article, then return to this article after you create and configure the Azure SQL Database.\n\nWhen you reach the section [Create a single database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal#create-a-single-database), use the following steps:\n\n1. In step 4 for creating new resource group, write down the **Resource group name** value - for example, `sqlserver-rg-gzh032124`.\n\n1. In step 5 for database name, write down the **Database name** value - for example, `mySampleDatabase`.\n\n1. In step 6 for creating the server, use the following steps:\n\n    1. Fill in a unique server name - for example, `sqlserverprimary-gzh032124`.\n    1. For **Location**, select **(US) East US**.\n    1. For **Authentication method**, select **Use SQL authentication**.\n    1. Write down the **Server admin login** value - for example, `azureuser`.\n    1. Write down the **Password** value.\n\n1. In step 8, for **Workload environment**, select **Development**. Look at the description and consider other options for your workload.\n\n1. In step 10, for **Compute tier**, select **Provisioned**.\n\n1. In step 11, for **Backup storage redundancy**, select **Locally-redundant backup storage**. Consider other options for your backups. For more information, see the [Backup storage redundancy](/azure/azure-sql/database/automated-backups-overview?view=azuresql-db&preserve-view=true#backup-storage-redundancy) section of [Automated backups in Azure SQL Database](/azure/azure-sql/database/automated-backups-overview?view=azuresql-db&preserve-view=true).\n\n1. In step 14, in the **Firewall rules** configuration, for **Allow Azure services and resources to access this server**, select **Yes**.\n\n1. When you reach the section [Query the database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal#query-the-database), use the following steps instead of the steps in the other article:\n\n    1. In step 3, enter your **SQL authentication** server admin sign-in information to sign in.\n\n       > [!NOTE]\n       > If sign-in fails with an error message similar to **Client with IP address 'xx.xx.xx.xx' is not allowed to access the server**, select **Allowlist IP xx.xx.xx.xx on server \\<your-sqlserver-name\\>** at the end of the error message. Wait until the server firewall rules complete updating, then select **OK** again.\n\n    1. After you run the sample query in step 5, clear the editor and enter the following query, then select **Run** again:\n\n       ```sql\n         CREATE TABLE ispn_entry_sessions_javaee_cafe_war (\n           id VARCHAR(255) PRIMARY KEY,  -- ID Column to hold cache entry ids\n           data VARBINARY(MAX),          -- Data Column to hold cache entry data\n           timestamp BIGINT,             -- Timestamp Column to hold cache entry timestamps\n           segment INT\n           );\n       ```\n\n       After a successful run, you should see the message **Query succeeded: Affected rows: 0**.\n\n       The database table `ispn_entry_sessions_javaee_cafe_war` is used for storing session data for your JBoss EAP cluster.\n\nThen, create an Azure SQL Database failover group by following the Azure portal steps in [Configure a failover group for Azure SQL Database](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db). You just need the following sections: [Create failover group](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#create-failover-group) and [Test planned failover](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#test-planned-failover). Use the following steps as you go through the article, then return to this article after you create and configure the Azure SQL Database failover group:\n\n1. When you reach the section [Create failover group](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#create-failover-group), use the following steps:\n\n    1. In step 5 for creating the failover group, enter and write down the unique failover group name - for example, `failovergroup-gzh032124`.\n\n    1. In step 5 for configuring the server, select the option to create a new secondary server and then use the following steps:\n\n        1. Enter a unique server name - for example, `sqlserversecondary-gzh032124`.\n        1. Enter the same server admin and password as your primary server.\n        1. For **Location**, select **(US) West US 2**.\n        1. Make sure **Allow Azure services to access server** is selected.\n\n    1. In step 5 for configuring the **Databases within the group**, select the database you created in the primary server - for example, `mySampleDatabase`.\n\n1. After you complete all the steps in the section [Test planned failover](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#test-planned-failover), keep the failover group page open and use it for the failover test of the JBoss EAP clusters later.\n\n> [!NOTE]\n> This article guides you to create an Azure SQL Database single database with SQL authentication for simplicity because the HA/DR setup this article focuses on is already very complex. A more secure practice is to use [Microsoft Entra authentication for Azure SQL](/azure/azure-sql/database/authentication-aad-overview?preserve-view=true&view=azuresql-db) for authenticating the database server connection.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-build-javaee-cafe.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\n1. Use the following steps to build the Java EE Cafe sample. These steps assume that you have a local environment with Git and Maven installed.\n\n    1. Use the following command to clone the source code from GitHub and check out the tag corresponding to this version of the article:\n\n       ```bash\n       git clone https://github.com/Azure/rhel-jboss-templates.git --branch 20240904 --single-branch\n       ```\n\n       If you see an error message with the text `You are in 'detached HEAD' state`, you can safely ignore it.\n\n    1. Use the following command to build the source code:\n\n       ```bash\n       mvn clean install --file rhel-jboss-templates/eap-coffee-app/pom.xml\n       ```\n\n       This command creates the file **rhel-jboss-templates/eap-coffee-app/target/javaee-cafe.war**. You upload this file in the next step.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-create-azure-traffic.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\nCreate an Azure Traffic Manager profile by following the instructions in [Quickstart: Create a Traffic Manager profile using the Azure portal](/azure/traffic-manager/quickstart-create-traffic-manager-profile). You just need the following sections: **Create a Traffic Manager profile** and **Add Traffic Manager endpoints**. Use the following steps as you go through these sections, then return to this article after you create and configure the Azure Traffic Manager.\n\n1. When you reach the section [Create a Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#create-a-traffic-manager-profile), in step 2 **Create Traffic Manager profile**, use the following steps:\n\n    1. Write down the unique Traffic Manager profile name for **Name** - for example, `tm-profile-gzh032124`.\n    1. Write down the new resource group name for **Resource group** - for example, `myResourceGroupTM1`.\n\n1. When you reach the section [Add Traffic Manager endpoints](/azure/traffic-manager/quickstart-create-traffic-manager-profile#add-traffic-manager-endpoints), use the following steps:\n\n    1. After you open the Traffic Manager profile in step 2, in the **Configuration** page, use the following steps:\n\n        1. For **DNS time to live (TTL)**, enter **10**.\n\n        1. Under **Fast endpoint failover settings**, use the following values:\n\n            * For **Probing internal**, select **10**.\n            * For **Tolerated number of failures**, enter **3**.\n            * For **Probe timeout**, **5**.\n\n        1. Select **Save**. Wait until it completes.\n\n    1. In step 4 for adding the primary endpoint `myPrimaryEndpoint`, use the following steps:\n\n        1. For **Target resource type**, select **Public IP address**.\n\n        1. Select the **Choose public IP address** dropdown and enter the name of the public IP address of the Application Gateway in the **East US** region. You should see one entry matched. Select it for **Public IP address**.\n\n    1. In step 6 for adding a failover secondary endpoint `myFailoverEndpoint`, use the following steps:\n\n        1. For **Target resource type**, select **Public IP address**.\n\n        1. Select the **Choose public IP address** dropdown and enter the name of the public IP address of the Application Gateway in the **West US 2** region. You should see one entry matched. Select it for **Public IP address**.\n\n    1. Wait for a while. Select **Refresh** until the **Monitor status** for endpoint `myPrimaryEndpoint` is **Online** and **Monitor status** for endpoint `myFailoverEndpoint` is **Degraded**.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-fail-over-to-secondary-site.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\nFirst, use the following steps to failover the Azure SQL Database from the primary server to the secondary server:\n\n1. Switch to the browser tab of your Azure SQL Database failover group - for example, `failovergroup-gzh032124`.\n1. Select **Failover** > **Yes**.\n1. Wait until it completes.\n\nNext, use the following steps to failover the JBoss EAP cluster with the recovery plan:\n\n1. In the search box at the top of the Azure portal, enter **Recovery Services vaults** and select **Recovery Services vaults** in the search results.\n\n1. Select the name of your Recovery Services vault - for example, `recovery-service-vault-westus-gzh032124`.\n\n1. Under **Manage**, select **Recovery Plans (Site Recovery)**. Select the recovery plan you created - for example, `recovery-plan-gzh032124`.\n\n1. Select **Failover**. Select **I understand the risk. Skip test failover.**. Leave the defaults for the other values. Select **OK**.\n\n   > [!NOTE]\n   > Optionally, you can run **Test failover** and **Cleanup test failover** to make sure everything works as expected before **Failover**. For more information, see [Tutorial: Run a disaster recovery drill for Azure VMs](/azure/site-recovery/azure-to-azure-tutorial-dr-drill). This tutorial uses **Failover** directly to simplify the exercise.\n\n1. Monitor the failover in notifications until it completes. It takes about 10 minutes for the exercise of this tutorial.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-next-step-head.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\nIn this tutorial, you set up an HA/DR solution consisting of an active-passive application infrastructure tier with an active-passive database tier, and in which both tiers span two geographically different sites. At the first site, both the application infrastructure tier and the database tier are active. At the second site, the secondary domain is restored with Azure Site Recovery service, and the secondary database is on standby."
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-prerequistes.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\n## Prerequisites\n\n* [!INCLUDE [quickstarts-free-trial-note](../../../includes/quickstarts-free-trial-note.md)]\n* Make sure you have the `Contributor` role in the subscription. You can verify the assignment by following the steps in [List Azure role assignments using the Azure portal](/azure/role-based-access-control/role-assignments-list-portal).\n* Prepare a local machine with Windows, GNU/Linux, or macOS installed.\n* Install and set up [Git](/devops/develop/git/install-and-set-up-git).\n* Install a Java SE implementation, version 17 or later - for example, [the Microsoft build of OpenJDK](/java/openjdk).\n* Install [Maven](https://maven.apache.org/download.cgi), version 3.9.3 or later.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-setup-disaster-recovery.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\nIn this section, you set up disaster recovery for Azure VMs in the primary cluster using Azure Site Recovery, by following the steps in [Tutorial: Set up disaster recovery for Azure VMs](/azure/site-recovery/azure-to-azure-tutorial-enable-replication). You just need the following sections: [Create a Recovery Services vault](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#create-a-recovery-services-vault) and [Enable replication](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#enable-replication). Pay attention to the following steps as you go through the article, then return to this article after the primary cluster is protected:\n\n1. When you reach the section [Create a Recovery Services vault](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#create-a-recovery-services-vault), use the following steps:\n\n    1. In step 5 for **Resource group**, create a new resource group with a unique name in your subscription - for example, `recovery-service-westus-gzh032124`.\n\n    1. In step 6 for **Vault name**, provide a vault name - for example, `recovery-service-vault-westus-gzh032124`.\n\n    1. In step 7 for **Region**, select **West US 2**.\n\n    1. Before selecting **Review + create** in step 8, select **Next: Redundancy**. In **Redundancy** pane, select **Geo-redundant** for **Backup Storage Redundancy** and **Enable** for **Cross Region Restore**.\n\n       > [!NOTE]\n       > Make sure you select **Geo-redundant** for **Backup Storage Redundancy** and **Enable** for **Cross Region Restore** in **Redundancy** pane. Otherwise, the storage of the primary cluster can't be replicated to the secondary region.\n\n    1. Enable Site Recovery by following the steps in section [Enable Site Recovery](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#enable-site-recovery).\n\n1. When you reach the section [Enable replication](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#enable-replication), use the following steps:\n\n    1. Use the following steps to select the source settings:\n\n        1. For **Region**, select **East US**.\n\n        1. For **Resource group**, select the resource where the primary cluster is deployed - for example, `jboss-eap-cluster-eastus-gzh032124`.\n\n           > [!NOTE]\n           > If the desired resource group is not listed, you can select **West US 2** for **Region** first, and then switch back to **East US**.\n\n        1. Leave other fields at their default values\n\n    1. Select the VMs. In **Virtual machines**, select all VMs listed - for example, there are 3 VMs deployed in the primary cluster for this tutorial.\n\n    1. Use the following steps when you review the replication settings:\n\n        1. For **Target location**, select **West US 2**.\n\n        1. For **Target resource group**, select the resource group where the service recovery vault is deployed - for example, `jboss-eap-cluster-westus-gzh032124`.\n\n           If the expected resource group isn't shown, select another region, then return to **West US 2**.\n\n        1. Note down the new failover virtual network and failover subnet, which are mapped from ones in the primary region.\n\n        1. Leave the default values for the other fields.\n\n    1. Use the following steps for **Manage**:\n\n        1. For **Replication policy**, use the default policy **24-hour-retention-policy**. You can also create a new policy for your business.\n\n        1. Leave the default values for the other fields.\n\n    1. Use the following steps for **Review**:\n\n        1. After selecting **Enable replication**, notice the message **Creating Azure resources. Don't close this blade.** displayed at the bottom of the page. Do nothing and wait until the pane closes automatically. You're redirected to the **Site Recovery** page.\n\n        1. Under **Protected items**, select **Replicated items**. Initially, there are no items listed because the replication is still in progress. The replication takes time to complete - about 1 hour for this tutorial. Refresh the page periodically until you see all VMs are **Protected**, as shown in the following screenshot:\n\n           :::image type=\"content\" source=\"../media/migrate-jboss-eap-to-vms-with-ha-dr/replicated-items-protected.png\" alt-text=\"Screenshot of the Azure portal showing a list of VMs that are replicated and protected.\" lightbox=\"../media/migrate-jboss-eap-to-vms-with-ha-dr/replicated-items-protected.png\":::\n\nNext, create a recovery plan to include all replicated items so they can fail over together. Use the instructions in [Create a recovery plan](/azure/site-recovery/site-recovery-create-recovery-plans#create-a-recovery-plan), with the following customization:\n\n1. In step 2, enter a name for the plan - for example, `recovery-plan-gzh032124`.\n1. In step 3, select **East US** for **Source** and **West US 2** for **Target**.\n1. In step 4 for **Select items**, select all protected items - for example, the 3 protected VMs for this tutorial.\n\nKeep the page open to use later for testing failover.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-steps-cleanup-resources.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\n1. Enter the resource group name of Azure SQL Database servers - for example, `sqlserver-rg-gzh032124` - in the search box at the top of the Azure portal. Then, select the matched resource group from the search results.\n\n1. Select **Delete resource group**.\n\n1. For **Enter resource group name to confirm deletion**, enter the resource group name.\n\n1. Select **Delete**.\n\n1. Repeat steps 1-4 for the resource group of the Traffic Manager - for example, `myResourceGroupTM1`.\n\n1. In the search box at the top of the Azure portal, enter **Recovery Services vaults** and then select **Recovery Services vaults** in the search results.\n\n1. Select the name of your Recovery Services vault - for example, `recovery-service-vault-westus-gzh032124`.\n\n1. Under **Manage**, select **Recovery Plans (Site Recovery)**. Select the recovery plan you created - for example, `recovery-plan-gzh032124`.\n\n1. Use the same steps in section [Disable the replication](#disable-the-replication) to remove locks on replicated items.\n\n1. Repeat steps 1-4 for the resource group of the primary JBoss EAP cluster - for example, `jboss-eap-cluster-westus-gzh032124`.\n\n1. Repeat steps 1-4 for the resource group of the secondary JBoss EAP cluster - for example, `jboss-eap-cluster-eastus-gzh032124`.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-steps-cleanup-unused-resource.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\n1. In the search box at the top of the Azure portal, enter **Resource groups** and then select **Resource groups** in the search results.\n\n1. Select the name of resource group for your newly created secondary region.\n\n1. Next to the text area labeled **Filter for any field...**, select the **X** to remove all filters.\n\n1. Select **Add filter**. Set **Filter** to **Type**. Set **Operator** to **Equals**.\n\n1. Select the dropdown menu next to the field **Value**.\n\n1. Toggle the **Select all** checkbox until no values are selected.\n\n1. Ensure that all of the following types are selected:\n\n   * **Virtual machine**\n   * **Disk**\n   * **Private endpoint**\n   * **Network interface**\n   * **Storage account**\n\n1. Select the dropdown menu next to the field **Value** to close the dropdown. You must see **5 resource types** as the value of **Value**.\n\n1. Select **Apply**.\n\n1. Select the checkbox next to the label **Name** at the top of the filtered list.\n\n1. Select **Delete**.\n\n1. Enter **delete** to confirm deletion then select **Delete**. Monitor the process in notifications until it completes.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-steps-commit-failover.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\nEnsure that the steps in the previous section completed successfully. Then, use the following steps to commit the failover:\n\n1. In the search box at the top of the Azure portal, type **Recovery Services vaults** and select it from the search results.\n1. Select your Recovery Services vault - for example, `recovery-service-vault-westus-gzh032124`.\n1. Under the **Manage** section, select **Recovery Plans (Site Recovery)**.\n1. Select the recovery plan - for example, `recovery-plan-gzh032124`.\n1. Select **Commit**, then **OK**.\n1. Monitor the notifications until it completes.\n\n   :::image type=\"content\" source=\"../media/migrate-jboss-eap-to-vms-with-ha-dr/failover-commit-completed.png\" alt-text=\"Screenshot of failover commit completed.\" lightbox=\"../media/migrate-jboss-eap-to-vms-with-ha-dr/failover-commit-completed.png\":::\n\n1. Select **Items in recovery plan**. You should see 3 items listed as **Failover committed**.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-steps-disable-replication.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\nUse the following steps to disable the replication for items in recovery plan and to delete the recovery plan:\n\n1. For each item in **Items in recovery plan**, right-click the item, then select **Disable Replication**.\n1. If you're prompted to provide a reason or reasons for disabling protection for this virtual machine, select the one you prefer - for example, **I completed migrating my application**. Select **OK**.\n1. Repeat step 1 until you disable replication for all items.\n1. Monitor the process in notifications until it completes.\n1. Select **Overview** > **Delete**. Select **Yes** to confirm the deletion.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-steps-fail-back.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\n1. Select the recovery service vault deployed in the primary region - for example, `recovery-service-vault-eastus-gzh032124`.\n\n1. Select the resource group deployed in the primary region - for example, `jboss-eap-cluster-eastus-gzh032124`.\n\n1. In the section [Commit the failover](#commit-the-failover), select your Recovery Services vault deployed in the primary - for example, `recovery-service-vault-eastus-gzh032124`.\n\n1. In the Traffic Manager profile, you should see that endpoint `myPrimaryEndpoint` becomes **Online** and endpoint `myFailoverEndpoint` becomes **Degraded**.\n\n1. In the section [Reprotect the failover site](#reprotect-the-failover-site), use the following steps:\n\n    1. The primary region is your failover site and active, so you should reprotect it in your secondary region.\n\n    1. Clean up resource deployed in your secondary region - for example, resources deployed in `jboss-eap-cluster-westus-gzh032124`.\n\n    1. Use the same steps in the [Set up disaster recovery for the cluster using Azure Site Recovery](#set-up-disaster-recovery-for-the-cluster-using-azure-site-recovery) for protecting the primary region in the secondary region, except for the following steps:\n\n        1. Skip the steps in **Create a Recovery Services vault** because you already created a Recovery Services vault - for example, `recovery-service-vault-westus-gzh032124`.\n\n        1. For **Enable replication** > **Replication settings** > **Failover virtual network**, select the existing virtual network in the secondary region.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-vms-intro-end.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\nAzure Traffic Manager checks the health of your regions and routes the traffic accordingly to the application tier. The primary region has a full deployment of the JBoss EAP cluster. After the primary region is protected by [Azure Site Recovery](https://azure.microsoft.com/products/site-recovery), you can restore the secondary region during the failover. As a result, the primary region is actively servicing network requests from the users, while the secondary region is passive and activated to receive traffic only when the primary region experiences a service disruption.\n\nAzure Traffic Manager detects the health of the app deployed in the JBoss EAP cluster to implement the conditional routing. The geo-failover RTO of the application tier depends on the time for shutting down the primary cluster, restoring the secondary cluster, starting VMs, and running the secondary JBoss EAP cluster. The RPO depends on the replication policy of Azure Site Recovery and Azure SQL Database because the cluster data is stored and replicated in the local storage of the VMs and application data is persisted and replicated in the Azure SQL Database failover group.\n\nThe preceding diagram shows **Primary region** and **Secondary region** as the two regions comprising the HA/DR architecture. These regions need to be Azure paired regions. For more information on paired regions, see [Azure cross-region replication](/azure/reliability/cross-region-replication-azure). The article uses East US and West US as the two regions, but they can be any paired regions that make sense for your scenario. For the list of region pairings, see the [Azure paired regions](/azure/reliability/cross-region-replication-azure#azure-paired-regions) section of [Azure cross-region replication](/azure/reliability/cross-region-replication-azure).\n\nThe database tier consists of an Azure SQL Database failover group with a primary server and a secondary server. The read/write listener endpoint always points to the primary server and is connected to the JBoss EAP cluster in each region. A geo-failover switches all secondary databases in the group to the primary role. For geo-failover RPO and RTO of Azure SQL Database, see [Overview of Business Continuity](/azure/azure-sql/database/business-continuity-high-availability-disaster-recover-hadr-overview?view=azuresql-db&preserve-view=true).\n\nThis tutorial was written with Azure Site Recovery and Azure SQL Database service because the tutorial relies on the HA features of these services. Other database choices are possible, but the HA features of whatever database you chose must be considered.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-jboss-vms-intro-head.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.date: 01/13/2026\n---\n\nThis tutorial shows you a straightforward and effective way to implement high availability and disaster recovery (HA/DR) for Java using JBoss EAP on Azure Virtual Machines (VMs). The solution illustrates how to achieve a low Recovery Time Objective (RTO) and Recovery Point Objective (RPO) using a simple database-driven Jakarta EE application running on the JBoss EAP application server. HA/DR is a complex topic, with many possible solutions. The best solution depends on your unique requirements. For other ways to implement HA/DR, see the resources at the end of this article.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-aks-azure-traffic-manager.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\nIn this section, you create an Azure Traffic Manager for distributing traffic to your public facing applications across the global Azure regions. The primary endpoint points to the Azure Application Gateway in the primary WLS cluster, and the secondary endpoint points to the Azure Application Gateway in the secondary WLS cluster.\n\nCreate an Azure Traffic Manager profile by following the steps in [Quickstart: Create a Traffic Manager profile using the Azure portal](/azure/traffic-manager/quickstart-create-traffic-manager-profile). Skip the \"Prerequisites\" section. You just need the following sections: [Create a Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#create-a-traffic-manager-profile), [Add Traffic Manager endpoints](/azure/traffic-manager/quickstart-create-traffic-manager-profile#add-traffic-manager-endpoints), and [Test Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#test-traffic-manager-profile). Use the following steps as you go through these sections, then return to this article after you create and configure the Azure Traffic Manager:\n\n1. When you reach the section [Create a Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#create-a-traffic-manager-profile), in step 2 **Create Traffic Manager profile**, use the following steps:\n   1. Save aside the unique Traffic Manager profile name for **Name** - for example, **tmprofile-ejb120623**.\n   1. Save aside the new resource group name for **Resource group** - for example, **myResourceGroupTM1**.\n\n1. When you reach the section [Add Traffic Manager endpoints](/azure/traffic-manager/quickstart-create-traffic-manager-profile#add-traffic-manager-endpoints), use the following steps:\n   1. After the step **Select the profile from the search results**, use the following steps:\n      1. Under **Settings**, select **Configuration**.\n      1. For **DNS time to live (TTL)**, enter **10**.\n      1. Under **Endpoint monitor settings**, for **Path**, enter **/weblogic/ready**.\n      1. Under **Fast endpoint failover settings**, use the following values:\n         * For **Probing internal**, enter **10**.\n         * For **Tolerated number of failures**, enter **3**.\n         * For **Probe timeout**, **5**.\n      1. Select **Save**. Wait until it completes.\n   1. In step 4 for adding the primary endpoint `myPrimaryEndpoint`, use the following steps:\n      1. For **Target resource type**, select **Public IP address**.\n      1. Select the **Choose public IP address** dropdown and enter the IP address of Application Gateway deployed in the **East US** WLS cluster that you saved aside previously. You should see one entry matched. Select it for **Public IP address**.\n   1. In step 6 for adding a failover / secondary endpoint **myFailoverEndpoint**, use the following steps:\n      1. For **Target resource type**, select **Public IP address**.\n      1. Select the **Choose public IP address** dropdown and enter the IP address of Application Gateway deployed in the **West US** WLS cluster that you saved aside previously. You should see one entry matched. Select it for **Public IP address**.\n   1. Wait for a while. Select **Refresh** until the **Monitor status** reaches the following states:\n      * The primary endpoint is **Online**.\n      * The failover endpoint is **Degraded**.\n\n1. When you reach the section [Test Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#test-traffic-manager-profile), use the following steps:\n   1. In subsection [Check the DNS name](/azure/traffic-manager/quickstart-create-traffic-manager-profile#check-the-dns-name), in step 3, save aside the DNS name of your Traffic Manager profile - for example, `http://tmprofile-ejb120623.trafficmanager.net`.\n   1. In subsection [View Traffic Manager in action](/azure/traffic-manager/quickstart-create-traffic-manager-profile#view-traffic-manager-in-action), use the following steps:\n      1. In step 1 and 3, append **/weblogic/ready** to the DNS name of your Traffic Manager profile in your web browser - for example, `http://tmprofile-ejb120623.trafficmanager.net/weblogic/ready`. You should see an empty page without any error message.\n      1. In step 4, you can't access **/weblogic/ready**, which is expected because the secondary cluster is stopped.\n      1. Re-enable the primary endpoint.\n\nNow, the primary endpoint has the states **Enabled** and **Online** and the failover endpoint has the states **Enabled** and **Degraded** in the Traffic Manager profile. Keep the page open for monitoring the endpoint status later.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-azure-prepare-sample-app.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\nIn this section, you build and package a sample CRUD Java/JakartaEE application that you later deploy and run on WLS clusters for failover testing.\n\nThe app uses WebLogic Server [JDBC session persistence](https://github.com/Azure-Samples/azure-cafe/blob/main/weblogic-cafe/src/main/webapp/WEB-INF/weblogic.xml#L8) to store HTTP session data. The datasource `jdbc/WebLogicCafeDB` stores the session data to enable failover and load balancing across a cluster of WebLogic Servers. It configures a [persistence schema](https://github.com/Azure-Samples/azure-cafe/blob/main/weblogic-cafe/src/main/resources/META-INF/persistence.xml#L7) to persist application data `coffee` in the same datasource `jdbc/WebLogicCafeDB`.\n\nUse the following steps to build and package the sample:\n\n1. Use the following commands to clone the sample repository and check out the tag corresponding to this article:\n\n   ```bash\n   git clone https://github.com/Azure-Samples/azure-cafe.git\n   cd azure-cafe\n   git checkout 20231206\n   ```\n\n   If you see a message about `Detached HEAD`, it's safe to ignore.\n\n1. Use the following commands to navigate to the sample directory, and then compile and package the sample:\n\n   ```bash\n   cd weblogic-cafe\n   mvn clean package\n   ```\n\nWhen the package is successfully generated, you can find it at **\\<parent-path-to-your-local-clone>/azure-cafe/weblogic-cafe/target/weblogic-cafe.war**. If you don't see the package, you must troubleshoot and resolve the issue before you continue.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-azure-sql-database-creation.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\nIn this section, you create an Azure SQL Database failover group in paired regions for use with your WLS clusters and app. In a later section, you configure WLS to store its session data and transaction log (TLOG) data to this database. This practice is consistent with Oracle's Maximum Availability Architecture (MAA). This guidance provides an Azure adaptation for MAA. For more information on MAA, see [Oracle Maximum Availability Architecture](https://www.oracle.com/database/technologies/maximum-availability-architecture/).\n\nFirst, create the primary Azure SQL Database by following the Azure portal steps in [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal). Follow the steps up to, but not including, the \"Clean up resources\" section. Use the following directions as you go through the article, then return to this article after you create and configure the Azure SQL Database:\n\n1. When you reach the section [Create a single database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal#create-a-single-database), use the following steps:\n   1. In step 4 for creating new resource group, save aside the **Resource group name** value - for example, **myResourceGroup**.\n   1. In step 5 for database name, save aside the **Database name** value - for example, **mySampleDatabase**.\n   1. In step 6 for creating the server, use the following steps:\n      1. Save aside the unique server name - for example, **sqlserverprimary-ejb120623**.\n      1. For **Location**, select **(US) East US**.\n      1. For **Authentication method**, select **Use SQL authentication**.\n      1. Save aside the **Server admin login** value - for example, **azureuser**.\n      1. Save aside the **Password** value.\n   1. In step 8, for **Workload environment**, select **Development**. Look at the description and consider other options for your workload.\n   1. In step 11, for **Backup storage redundancy**, select **Locally-redundant backup storage**. Consider other options for your backups. For more information, see the [Backup storage redundancy](/azure/azure-sql/database/automated-backups-overview?view=azuresql-db&preserve-view=true#backup-storage-redundancy) section of [Automated backups in Azure SQL Database](/azure/azure-sql/database/automated-backups-overview?view=azuresql-db&preserve-view=true).\n   1. In step 14, in the **Firewall rules** configuration, for **Allow Azure services and resources to access this server**, select **Yes**.\n\n1. When you reach the section [Query the database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal#query-the-database), use the following steps:\n   1. In step 3, enter your **SQL authentication** server admin sign-in information to sign in.\n\n      > [!NOTE]\n      > If sign-in fails with an error message similar to **Client with IP address 'xx.xx.xx.xx' is not allowed to access the server**, select **Allowlist IP xx.xx.xx.xx on server \\<your-sqlserver-name\\>** at the end of the error message. Wait until the server firewall rules complete updating, then select **OK** again.\n\n   1. After you run the sample query in step 5, clear the editor and create tables.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-azure-sql-database-failover-group.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\nNext, create an Azure SQL Database failover group by following the Azure portal steps in [Configure a failover group for Azure SQL Database](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db). You just need the following sections: [Create failover group](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#create-failover-group) and [Test planned failover](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#test-planned-failover). Use the following steps as you go through the article, then return to this article after you create and configure the Azure SQL Database failover group:\n\n1. When you reach the section [Create failover group](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#create-failover-group), use the following steps:\n   1. In step 5 for creating the failover group, select the option to create a new secondary server and then use the following steps:\n      1. Enter and save aside the failover group name - for example, **failovergroupname-ejb120623**.\n      1. Enter and save aside the unique server name - for example, **sqlserversecondary-ejb120623**.\n      1. Enter the same server admin and password as your primary server.\n      1. For **Location**, select a different region than the one you used for the primary database.\n      1. Make sure **Allow Azure services to access server** is selected.\n   1. In step 5 for configuring the **Databases within the group**, select the database you created in the primary server - for example, **mySampleDatabase**.\n\n1. After you complete all the steps in the section [Test planned failover](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#test-planned-failover), keep the failover group page open and use it for the failover test of the WLS clusters later.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-azure-sql-database-schema-aks.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n3. To create the schema, enter the following queries:\n\n   1. To create the schema for the TLOG, enter the following query:\n\n      ```sql\n      create table TLOG_msp1_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));\n      create table TLOG_msp2_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));\n      create table TLOG_msp3_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));\n      create table TLOG_msp4_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));\n      create table TLOG_msp5_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));\n      create table wl_servlet_sessions (wl_id VARCHAR(100) NOT NULL, wl_context_path VARCHAR(100) NOT NULL, wl_is_new CHAR(1), wl_create_time DECIMAL(20), wl_is_valid CHAR(1), wl_session_values VARBINARY(MAX), wl_access_time DECIMAL(20), wl_max_inactive_interval INTEGER, PRIMARY KEY (wl_id, wl_context_path));\n      ```\n\n      After a successful run, you should see the message `Query succeeded: Affected rows: 0`.\n\n      These database tables are used for storing transaction log (TLOG) and session data for your WLS clusters and app. For more information, see [Using a JDBC TLOG Store](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/store/jdbc.html#GUID-6522B5CF-0775-4EEE-BF23-A5AD2C0F08EF) and [Using a Database for Persistent Storage (JDBC Persistence)](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/wbapp/sessions.html#GUID-32648CF4-5189-43BB-B0FE-4A99B4EF9FDA).\n\n   1. To create the schema for the sample application, enter the following query:\n\n      ```sql\n      CREATE TABLE COFFEE (ID NUMERIC(19) NOT NULL, NAME VARCHAR(255) NULL, PRICE FLOAT(32) NULL, PRIMARY KEY (ID));\n      CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT NUMERIC(28) NULL, PRIMARY KEY (SEQ_NAME));\n      ```\n\n      After a successful run, you should see the message `Query succeeded: Affected rows: 0`.\n\nYou're now finished with the article \"Quickstart: Create a single database - Azure SQL Database\".\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-azure-sql-database-schema-vms.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\nEnter the following query to create schema for TLOG.\n\n```sql\ncreate table TLOG_msp1_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));\ncreate table TLOG_msp2_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));\ncreate table TLOG_msp3_WLStore (ID DECIMAL(38) NOT NULL, TYPE DECIMAL(38) NOT NULL, HANDLE DECIMAL(38) NOT NULL, RECORD VARBINARY(MAX) NOT NULL, PRIMARY KEY (ID));\ncreate table wl_servlet_sessions (wl_id VARCHAR(100) NOT NULL, wl_context_path VARCHAR(100) NOT NULL, wl_is_new CHAR(1), wl_create_time DECIMAL(20), wl_is_valid CHAR(1), wl_session_values VARBINARY(MAX), wl_access_time DECIMAL(20), wl_max_inactive_interval INTEGER, PRIMARY KEY (wl_id, wl_context_path));\n```\n\nAfter a successful run, you should see the message **Query succeeded: Affected rows: 0**.\n\nThese database tables are used for storing transaction log (TLOG) and session data for your WLS clusters and app. For more information, see [Using a JDBC TLOG Store](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/store/jdbc.html#GUID-6522B5CF-0775-4EEE-BF23-A5AD2C0F08EF) and [Using a Database for Persistent Storage (JDBC Persistence)](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/wbapp/sessions.html#GUID-32648CF4-5189-43BB-B0FE-4A99B4EF9FDA).\n      "
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-azure-verify-sample-app-test-failover.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\nFinally, use the following steps to verify the sample app after the endpoint `myFailoverEndpoint` is in the **Online** state:\n\n1. Switch to the browser tab of your Traffic Manager, then refresh the page until you see that the **Monitor status** value of the endpoint `myFailoverEndpoint` enters the **Online** state.\n1. Switch to the browser tab of the sample app and refresh the page. You should see the same data persisted in the application data table and the session table displayed in the UI, as shown in the following screenshot:\n\n   :::image type=\"content\" source=\"../media/migrate-weblogic-to-vms-with-ha-dr/sample-app-ui.png\" alt-text=\"Screenshot of the sample application UI after failover.\" lightbox=\"../media/migrate-weblogic-to-vms-with-ha-dr/sample-app-ui.png\":::\n\n   If you don't observe this behavior, it might be because the Traffic Manager is taking time to update DNS to point to the failover site. The problem could also be that your browser cached the DNS name resolution result that points to the failed site. Wait for a while and refresh the page again.\n\n> [!NOTE]\n> A production-ready HA/DR solution would account for continually copying the WLS configuration from the primary to the secondary clusters on a regular schedule. For information on how to do this, see the references to the Oracle documentation at the end of this article.\n\nTo automate the failover, consider using alerts on Traffic Manager metrics and Azure Automation. For more information, see the [Alerts on Traffic Manager metrics](/azure/traffic-manager/traffic-manager-metrics-alerts#alerts-on-traffic-manager-metrics) section of [Traffic Manager metrics and alerts](/azure/traffic-manager/traffic-manager-metrics-alerts) and [Use an alert to trigger an Azure Automation runbook](/azure/automation/automation-create-alert-triggered-runbook).\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-azure-verify-sample-app.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\nSince the primary cluster is up and running, it acts as the active cluster and handles all user requests routed by your Traffic Manager profile.\n\nOpen the DNS name of your Azure Traffic Manager profile in a new tab of the browser, appending the context root **/weblogic-cafe** of the deployed app - for example, `http://tmprofile-ejb120623.trafficmanager.net/weblogic-cafe`. Create a new coffee with name and price - for example, **Coffee 1** with price **10**. This entry is persisted into both the application data table and the session table of the database. The UI that you see should be similar to the following screenshot:\n\n:::image type=\"content\" source=\"../media/migrate-weblogic-to-vms-with-ha-dr/sample-app-ui.png\" alt-text=\"Screenshot of the sample application UI.\" lightbox=\"../media/migrate-weblogic-to-vms-with-ha-dr/sample-app-ui.png\":::\n\nIf your UI doesn't look similar, troubleshoot and resolve the problem before you continue.\n\nKeep the page open so you can use it for failover testing later.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-backup-extension.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n3. Open the resource group that has AKS deployed. Select the AKS cluster from the resources list.\n\n1. On the AKS landing page, select **Settings** > **Back up** > **Install Extension**.\n\n1. On the **Install AKS Backup extension** page, select **Next**. Select the storage account and Blob container created in preceding steps. Select **Next** and then **Create**. It takes about five minutes to complete this step.\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-overview.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\nThe database tier consists of an Azure SQL Database failover group with a primary server and a secondary server. The primary server is in active read-write mode and connected to the primary WLS cluster. The secondary server is in passive ready-only mode and connected to the secondary WLS cluster. A geo-failover switches all secondary databases in the group to the primary role. For geo-failover RPO and RTO of Azure SQL Database, see [Overview of Business Continuity](/azure/azure-sql/database/business-continuity-high-availability-disaster-recover-hadr-overview?view=azuresql-db&preserve-view=true).\n\nThis article was written with the Azure SQL Database service because the article relies on the high availability (HA) features of that service. Other database choices are possible, but you must consider the HA features of whatever database you choose. For more information, including information on how to optimize the configuration of data sources for replication, see [Configuring Data Sources for Oracle Fusion Middleware Active-Passive Deployment](https://docs.oracle.com/en/middleware/fusion-middleware/12.2.1.4/asdrg/setting-and-managing-disaster-recovery-sites.html#GUID-445693AB-B592-4E11-9B44-A208444B75F2).\n"
  },
  {
    "path": "articles/java/migration/includes/ha-dr-for-wls-vm-azure-traffic-manager.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\nIn this section, you create an Azure Traffic Manager for distributing traffic to your public facing applications across the global Azure regions. The primary endpoint points to the Azure Application Gateway in the primary WLS cluster, and the secondary endpoint points to the Azure Application Gateway in the secondary WLS cluster.\n\nCreate an Azure Traffic Manager profile by following [Quickstart: Create a Traffic Manager profile using the Azure portal](/azure/traffic-manager/quickstart-create-traffic-manager-profile). Skip the **Prerequisites** section. You just need the following sections: **Create a Traffic Manager profile**, **Add Traffic Manager endpoints**, and **Test Traffic Manager profile**. Use the following steps as you go through these sections, then return to this article after you create and configure the Azure Traffic Manager.\n\n1. When you reach the section [Create a Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#create-a-traffic-manager-profile), in step 2 **Create Traffic Manager profile**, use the following steps:\n\n   1. Save aside the unique Traffic Manager profile name for **Name** - for example, `tmprofile-ejb120623`.\n   1. Save aside the new resource group name for **Resource group** - for example, `myResourceGroupTM1`.\n\n1. When you reach the section [Add Traffic Manager endpoints](/azure/traffic-manager/quickstart-create-traffic-manager-profile#add-traffic-manager-endpoints), use the following steps:\n\n   1. Perform this extra action after the step **Select the profile from the search results.**\n\n      1. Under **Settings**, select **Configuration**.\n      1. For **DNS time to live (TTL)**, enter **10**.\n      1. Under **Endpoint monitor settings**, for **Path**, enter **/weblogic/ready**.\n      1. Under **Fast endpoint failover settings**, use the following values:\n\n         * For **Probing internal**, enter **10**.\n         * For **Tolerated number of failures**, enter **3**.\n         * For **Probe timeout**, **5**.\n\n      1. Select **Save**. Wait until it completes.\n\n   1. In step 4 for adding the primary endpoint `myPrimaryEndpoint`, use the following steps:\n\n      1. For **Target resource type**, select **Public IP address**.\n\n      1. Select the **Choose public IP address** dropdown and enter the IP address of Application Gateway deployed in the **East US** WLS cluster that you saved aside previously. You should see one entry matched. Select it for **Public IP address**.\n\n   1. In step 6 for adding a failover / secondary endpoint `myFailoverEndpoint`, use the following steps:\n\n      1. For **Target resource type**, select **Public IP address**.\n\n      1. Select the **Choose public IP address** dropdown and enter the IP address of Application Gateway deployed in the **West US 2** WLS cluster that you saved aside previously. You should see one entry matched. Select it for **Public IP address**.\n\n   1. Wait for a while. Select **Refresh** until the **Monitor status** value for both endpoints is **Online**.\n\n1. When you reach the section [Test Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#test-traffic-manager-profile), use the following steps:\n\n   1. In section [Check the DNS name](/azure/traffic-manager/quickstart-create-traffic-manager-profile#check-the-dns-name), in step 3, save aside the DNS name of your Traffic Manager profile - for example, `http://tmprofile-ejb120623.trafficmanager.net`.\n\n   1. In section [View Traffic Manager in action](/azure/traffic-manager/quickstart-create-traffic-manager-profile#view-traffic-manager-in-action), use the following steps:\n\n      1. In step 1 and 3, append **/weblogic/ready** to the DNS name of your Traffic Manager profile in your web browser - for example, `http://tmprofile-ejb120623.trafficmanager.net/weblogic/ready`. You should see an empty page without any error message.\n\n      1. After completing all steps, make sure to **enable** your primary endpoint by referencing step 2, but replace **Disabled** with **Enabled**. Then return to **Endpoints** page.\n\nNow you have both endpoints **Enabled** and **Online** in the Traffic Manager profile. Keep the page open and you use it for monitoring the endpoint status later.\n"
  },
  {
    "path": "articles/java/migration/includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Identify all outside processes and daemons running on the production servers\n\nIf you have any processes running outside the application server, such as monitoring daemons, you'll need to eliminate them or migrate them elsewhere.\n"
  },
  {
    "path": "articles/java/migration/includes/identify-external-caches-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Identify external caches\n\nIdentify any external caches in use. Frequently, Redis is used via Spring Data Redis. For configuration information, see the [Spring Data Redis](https://spring.io/projects/spring-data-redis) documentation.\n\nDetermine whether session data is being cached via [Spring Session](https://spring.io/projects/spring-session) by searching for the respective configuration (in [Java](https://docs.spring.io/spring-session/reference/3.0/index.html) or [XML](https://docs.spring.io/spring-session/reference/3.0/index.html)).\n"
  },
  {
    "path": "articles/java/migration/includes/identify-external-caches-azure-spring-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Identify external caches\n\nIdentify any external caches in use. Frequently, Redis is used via Spring Data Redis. For configuration information, see the [Spring Data Redis](https://spring.io/projects/spring-data-redis) documentation.\n\nDetermine whether session data is being cached via [Spring Session](https://spring.io/projects/spring-session) by searching for the respective configuration (in [Java](https://docs.spring.io/spring-session/reference/3.0/index.html) or [XML](https://docs.spring.io/spring-session/reference/3.0/index.html)).\n"
  },
  {
    "path": "articles/java/migration/includes/identify-jms-brokers-in-spring.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### JMS message brokers\n\nIdentify the broker or brokers in use by looking in the build manifest (typically, a **pom.xml** or **build.gradle** file) for the relevant dependencies.\n\nFor example, a Spring Boot application using ActiveMQ would typically contain this dependency in its **pom.xml** file:\n\n```xml\n<dependency>\n    <groupId>org.springframework.boot</groupId>\n    <artifactId>spring-boot-starter-activemq</artifactId>\n</dependency>\n```\n\nSpring Boot applications using commercial brokers typically contain dependencies directly on the brokers' JMS driver libraries. Here's an example from a **build.gradle** file:\n\n```json\n    dependencies {\n      ...\n      compile(\"com.ibm.mq:com.ibm.mq.allclient:9.4.0.5\")\n      ...\n    }\n```\n"
  },
  {
    "path": "articles/java/migration/includes/identify-local-state-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Identify local state\n\nOn PaaS environments, no application is guaranteed to be running exactly once at any given time. Even if you configure an application to run in a single instance, a duplicate instance can be created in the following cases:\n\n* The application must be relocated to a physical host due to failure or system update.\n* The application is being updated.\n\nIn any of these cases, the original instance remains running until the new instance has finished starting up. This pattern can have the following potentially significant implications for your application:\n\n* No [singleton](https://en.wikipedia.org/wiki/Singleton_pattern) can be guaranteed to be truly single.\n* Any data not persisted to outside storage will likely be lost sooner than it would be on a single physical server or VM.\n\nBefore migrating to Azure Container Apps, ensure that your code doesn't contain local state that must not be lost or duplicated. If local state exists, change the code to store that state outside the application. Cloud-ready applications typically store application state in locations such as the following options:\n\n* [Azure Cache for Redis](/azure/azure-cache-for-redis/cache-java-get-started)\n* [Azure Cosmos DB](/azure/cosmos-db/create-sql-api-java)\n* Another external database, such as [Azure SQL](/azure/azure-sql/azure-sql-iaas-vs-paas-what-is-overview), [Azure Database for MySQL](/azure/mysql/overview), or [Azure Database for PostgreSQL](/azure/postgresql/overview).\n* [Azure Storage](/azure/storage/blobs), used for storing unstructured data or even serialized objects."
  },
  {
    "path": "articles/java/migration/includes/identify-logs-metrics-apm-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Identify log aggregation solutions\n\nIdentify any log aggregation solutions in use by the applications you're migrating. You need to configure diagnostic settings in migration to make logged events available for consumption. For more information, see [Ensure console logging and configure diagnostic settings](#ensure-console-logging-and-configure-diagnostic-settings) section.\n\n#### Identify application performance management (APM) agents\n\nIdentify any application performance management agents used by your applications. Azure Containers Apps doesn't offer built-in support for APM integration. You need to prepare your container image or integrate APM tool directly into your code. If you want to measure your application's performance but haven't integrated any APM yet, consider using Azure Application Insights. For more information, see the [Migration](#configure-application-performance-management-apm-integrations) section.\n"
  },
  {
    "path": "articles/java/migration/includes/identify-spring-boot-versions.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Identify Spring Boot versions\n\nExamine the dependencies of each application being migrated to determine its Spring Boot version.\n\n##### Maven\n\nIn Maven projects, the Spring Boot version is typically found in the `<parent>` element of the POM file:\n\n```xml\n    <parent>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-parent</artifactId>\n        <version>3.3.3</version>\n        <relativePath/> <!-- lookup parent from repository -->\n    </parent>\n```\n\n##### Gradle\n\nIn Gradle projects, the Spring Boot version will typically be found in the `plugins` section, as the version of the `org.springframework.boot` plugin:\n\n```gradle\nplugins {\n  id 'org.springframework.boot' version '3.3.3'\n  id 'io.spring.dependency-management' version '1.1.6'\n  id 'java'\n}\n```"
  },
  {
    "path": "articles/java/migration/includes/import-backend-certificates.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Import backend certificates\n\nAll certificates for communicating with backend systems, such as databases, need to be made available to App Service. For more information, see [Add an SSL certificate in App Service](/azure/app-service/configure-ssl-certificate).\n"
  },
  {
    "path": "articles/java/migration/includes/inspect-the-deployment-architecture-spring-boot.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Inspect the deployment architecture\n\n#### Document hardware requirements for each service\n\nDocument the following information for your Spring Boot application:\n\n* The number of instances running.\n* The number of CPUs allocated to each instance.\n* The amount of RAM allocated to each instance.\n\n#### Document geo-replication/distribution\n\nDetermine whether your Spring Boot application instances are currently distributed among several regions or data centers. Document the uptime requirements/SLA for the applications you're migrating.\n"
  },
  {
    "path": "articles/java/migration/includes/inspect-the-deployment-architecture-spring-cloud.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Inspect the deployment architecture\n\n#### Document hardware requirements for each service\n\nFor each of your Spring Cloud services (not including the configuration server, registry, or gateway), document the following information:\n\n* The number of instances running.\n* The number of CPUs allocated to each instance.\n* The amount of RAM allocated to each instance.\n\n#### Document geo-replication/distribution\n\nDetermine whether the Spring Cloud applications are currently distributed among several regions or data centers. Document the uptime requirements/SLA for the applications you're migrating.\n\n#### Identify clients that bypass the service registry\n\nIdentify any client applications that invoke any of the services to be migrated without using the Spring Cloud Service Registry. After the migration, such invocations will no longer be possible. Update such clients to use [Spring Cloud OpenFeign](https://spring.io/projects/spring-cloud-openfeign) before migration.\n"
  },
  {
    "path": "articles/java/migration/includes/inspect-your-domain-configuration.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Inspect your domain configuration\n\nThe main configuration unit in WebLogic Server is the domain. As such, the **config.xml** file contains a wealth of configuration that you must carefully consider for migration. The file includes references to additional XML files that are stored in subdirectories. Oracle advises that you should normally use the **Administration Console** to configure WebLogic Server's manageable objects and services and allow WebLogic Server to maintain the **config.xml** file. For more information, see [Domain Configuration Files](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/domcf/config_files.html).\n\n#### Inside your application\n\nInspect the **WEB-INF/weblogic.xml** file and/or the **WEB-INF/web.xml** file. Look for configuration that would be more appropriate to externalize outside of the application.\n"
  },
  {
    "path": "articles/java/migration/includes/inspect-your-profile-configuration-liberty.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Inspect your profile configuration\n\nThe main configuration unit in WAS is the profile. As such, the **resources.xml** file contains a wealth of configuration that you must carefully consider for migration. The file includes references to other XML files that are stored in subdirectories. For more information, see [Managing profiles on distributed and IBM i operating systems](https://www.ibm.com/docs/was-nd/9.0.5?topic=environment-managing-profiles-distributed-i-operating-systems).\n\n#### Inside your application\n\nInspect the **deployment.xml** file and/or the **WEB-INF/web.xml** file.\n"
  },
  {
    "path": "articles/java/migration/includes/inspect-your-profile-configuration.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Inspect your profile configuration\n\nThe main configuration unit in WAS is the profile. As such, the **resources.xml** file contains a wealth of configuration that you must carefully consider for migration. The file includes references to more XML files that are stored in subdirectories. IBM advises that you should normally use the **IBM Console** to configure WAS's manageable objects and services, and allow WAS to maintain the **profiles/profile-name** folder. For more information, see [Managing profiles on distributed and IBM i operating systems](https://www.ibm.com/docs/en/was-nd/9.0.5?topic=environment-managing-profiles-distributed-i-operating-systems).\n\n#### Inside your application\n\nInspect the **deployment.xml** file and/or the **WEB-INF/web.xml** file.\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-all-certificates.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Inventory all certificates\n\nDocument all the certificates used for public SSL endpoints. You can view all certificates on the production server(s) by running the following command:\n\n```bash\nkeytool -list -v -keystore <path to keystore>\n```\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-all-secrets.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Inventory all secrets\n\nBefore the advent of \"configuration as a service\" technologies such as Azure Key Vault, there wasn't a well-defined concept of \"secrets\". Instead, you had a disparate set of configuration settings that effectively functioned as what we now call \"secrets\". With app servers such as WebLogic Server, these secrets are in many different config files and configuration stores. Check all properties and configuration files on the production server(s) for any secrets and passwords. Be sure to check **weblogic.xml** in your WARs. Configuration files containing passwords or credentials may also be found inside your application. For more information, see [Azure Key Vault basic concepts](/azure/key-vault/basic-concepts).\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-certificates-h4.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Inventory certificates\n\nDocument all the certificates used for public SSL endpoints or communication with backend databases and other systems. You can view all certificates on the production server(s) by running the following command:\n\n```bash\nkeytool -list -v -keystore <path to keystore>\n```\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-certificates.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Inventory certificates\n\nDocument all the certificates used for public SSL endpoints or communication with backend databases and other systems. You can view all certificates on the production server(s) by running the following command:\n\n```bash\nkeytool -list -v -keystore <path to keystore>\n```\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-configuration-sources-and-secrets-spring-boot.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Inventory configuration sources and secrets\n\n#### Inventory passwords and secure strings\n\nCheck all properties and configuration files and all environment variables on the production deployment(s) for any secret strings and passwords. In a Spring Boot application, you can typically find such strings in the **application.properties** or **application.yml** file.\n\n[!INCLUDE [inventory-certificates-h4](inventory-certificates-h4.md)]\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-configuration-sources-and-secrets-spring-cloud.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Inventory configuration sources and secrets\n\n#### Inventory passwords and secure strings\n\nCheck all properties and configuration files and all environment variables on the production deployments for any secret strings and passwords. In a Spring Cloud application, you can typically find such strings in the **application.properties** or **application.yml** file in individual services or in the Spring Cloud Config Server repository.\n\n[!INCLUDE [inventory-certificates-h4](inventory-certificates-h4.md)]\n\n#### Determine whether Spring Cloud Vault is used\n\nIf you use Spring Cloud Vault to store and access secrets, identify the backing secret store - for example, HashiCorp Vault or CredHub. Then identify all the secrets used by the application code.\n\n#### Locate the configuration server source\n\nIf your application uses a [Spring Cloud Config Server](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_spring_cloud_config_server), identify where the configuration is stored. You typically find this setting in the **bootstrap.yml** or **bootstrap.properties** file, or sometimes in the **application.yml** or **application.properties** file. The setting looks like the following example:\n\n```properties\nspring.cloud.config.server.git.uri: file://${user.home}/spring-cloud-config-repo\n```\n\nWhile git is most commonly used as Spring Cloud Config Server's backing datastore, as shown earlier, one of the other possible backends may be in use. Consult the [Spring Cloud Config Server documentation](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_environment_repository) for information on other backends, such as [Relational Database (JDBC)](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_jdbc_backend), [SVN](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_version_control_backend_filesystem_use), and [the local file system](https://docs.spring.io/spring-cloud-config/docs/current/reference/html/#_file_system_backend).\n\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-databases-spring-boot.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Databases\n\nFor a Spring Boot application, connection strings typically appear in configuration files when it depends on an external database.  Here's an example from an **application.properties** file:\n\n```properties\nspring.datasource.url=jdbc:mysql://localhost:3306/mysql_db\nspring.datasource.username=dbuser\nspring.datasource.driver-class-name=com.mysql.jdbc.Driver\n```\n\nHere's an example from an **application.yaml** file:\n\n```yaml\nspring:\n  data:\n    mongodb:\n      uri: mongodb://mongouser:deepsecret@mongoserver.contoso.com:27017\n```\n\nSee Spring Data documentation for more possible configuration scenarios:\n\n* [JPA Repositories](https://docs.spring.io/spring-data/jpa/docs/current-SNAPSHOT/reference/html/#jpa.repositories)\n* [JDBC Repositories](https://docs.spring.io/spring-data/jdbc/docs/current-SNAPSHOT/reference/html/#jdbc.repositories)\n* [Cassandra Repositories](https://docs.spring.io/spring-data/cassandra/docs/current-SNAPSHOT/reference/html/#cassandra.repositories)\n* [MongoDB Repositories](https://docs.spring.io/spring-data/mongodb/docs/current-SNAPSHOT/reference/html/#mongodb.repositories)\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-difference-between-your-env-and-liberty.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Inventory differences using IBM migration tools\n\nTo move your applications to WebSphere Application Server Liberty or Open Liberty, you need to plan your migration, analyze your applications, and update your source code. IBM provides migration tools to help identify any differences between your current environment and the technologies in your new Liberty environment, such as Java EE 7 or Java EE 8, and Java SE 8 or Java SE 11. For more information, see [Migrating applications to Liberty](https://www.ibm.com/docs/was-liberty/core?topic=migrating-applications-liberty).\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-external-resources-jboss.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Inventory external resources\n\nExternal resources, such as data sources, Java Message Service (JMS) message brokers, and others are injected via Java Naming and Directory Interface (JNDI). Some such resources can require migration or reconfiguration.\n\n#### Inside your application\n\nInspect the **WEB-INF/jboss-web.xml** and/or **WEB-INF/web.xml** files. Look for `<Resource>` elements inside the `<Context>` element.\n\n#### Datasources\n\nDatasources are JNDI resources with the `type` attribute set to `javax.sql.DataSource`. For each datasource,     document the following information:\n\n* What is the datasource name?\n* What is the connection pool configuration?\n* Where can I find the Java Database Connectivity (JDBC) driver JAR file?\n\nFor more information, see [About JBoss Enterprise Application Platform (EAP) Datasources](https://docs.redhat.com/en/documentation/red_hat_jboss_enterprise_application_platform/8.0/html/configuration_guide/datasource_management) in the JBoss EAP documentation.\n\n#### All other external resources\n\nIt isn't feasible to document every possible external dependency in this guide. It's your team's responsibility to verify that you can satisfy every external dependency of your application after the migration.\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-external-resources.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Inventory external resources\n\nExternal resources, such as data sources, JMS message brokers, and others are injected via Java Naming and Directory Interface (JNDI). Some such resources may require migration or reconfiguration.\n\n#### Inside your application\n\nInspect the **META-INF/context.xml** file. Look for `<Resource>` elements inside the `<Context>` element.\n\n#### On the application server(s)\n\nInspect the **$CATALINA_BASE/conf/context.xml** and **$CATALINA_BASE/conf/server.xml** files as well as the **.xml** files found in **$CATALINA_BASE/conf/\\<engine-name\\>/\\<host-name\\>** directories.\n\nIn **context.xml** files, JNDI resources will be described by the `<Resource>` elements inside the top-level `<Context>` element.\n\nIn **server.xml** files, JNDI resources will be described by the `<Resource>` elements inside the `<GlobalNamingResources>` element.\n\n#### Datasources\n\nDatasources are JNDI resources with the `type` attribute set to `javax.sql.DataSource`. For each datasource, document the following information:\n\n* What is the datasource name?\n* What is the connection pool configuration?\n* Where can I find the JDBC driver JAR file?\n\nFor more information, see [JNDI Datasource HOW-TO](https://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html) in the Tomcat documentation.\n\n#### All other external resources\n\nIt isn't feasible to document every possible external dependency in this guide. It's your team's responsibility to verify that you can satisfy every external dependency of your application after the migration.\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-identity-providers-spring-boot.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Identity providers\n\nIdentify any identity provider(s) used by your application. For information on how identity providers may be configured, consult the following:\n\n* For OAuth2 configuration, see the [Spring Security reference](https://docs.spring.io/spring-security/reference/index.html).\n* For Auth0 Spring Security configuration, see the [Auth0 Spring Security documentation](https://auth0.com/docs/quickstart/backend/java-spring-security5).\n* For PingFederate Spring Security configuration, see the [Auth0 PingFederate instructions](https://auth0.com/authenticate/java-spring-security/ping-federate/).\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-jndi-resources.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Inventory JNDI resources\n\nInventory all JNDI resources. For example, datasources such as databases may have an associated JNDI name that allows JPA to correctly bind instances of `EntityManager` to a particular database. For more information on JNDI resources and databases, see [WebLogic Server Data Sources](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/jdbca/configure-database-connectivity.html) in the Oracle documentation. Other JNDI-related resources, such as JMS message brokers, may require migration or reconfiguration. For more information on JMS configuration see [Understanding JMS Resource Configuration](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/jmsad/overview.html).\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-secrets.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Inventory secrets\n\n#### Passwords and secure strings\n\nCheck all properties and configuration files on the production server(s) for any secret strings and passwords. Be sure to check **server.xml** and **context.xml** in **$CATALINA_BASE/conf**. You may also find configuration files containing passwords or credentials inside your application. These may include **META-INF/context.xml**, and, for Spring Boot applications, **application.properties** or **application.yml** files.\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-server-capacity-aks.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Inventory server capacity\n\nDocument the hardware (memory, CPU, disk) of the current production server(s) and the average and peak request counts and resource utilization. You'll need this information regardless of the migration path you choose. It's useful, for example, to help guide selection of the size of the VMs in your node pool, the amount of memory to be used by the container, and how many CPU shares the container needs.\n\nIf you have load testing data, take a snapshot of the current test results so you can run the tests again after migration to ensure you meet the expected performance targets.\n\nIt's possible to resize node pools in AKS. To learn how, see [Resize node pools in Azure Kubernetes Service (AKS)](/azure/aks/resize-node-pool).\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-server-capacity-aro-liberty.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Inventory server capacity\n\nDocument the hardware (memory, CPU, disk) of the current production servers and the average and peak request counts and resource utilization. You need this information regardless of the migration path you choose. This information is useful, for example, to help guide selection of the size of the VMs in your node, the amount of memory to be used by the container, and how many CPU shares the container would need.\n\nTo take advantage of unused capacity at a significant cost savings, it's possible to use Azure Spot Virtual Machines in Azure Red Hat OpenShift. To learn how, see [Use Azure Spot Virtual Machines in an Azure Red Hat OpenShift cluster](/azure/openshift/howto-spot-nodes).\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-server-capacity-jboss-eap.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Inventory server capacity\n\nDocument the hardware (memory, CPU, disk) of the current production server(s) and the average and peak request counts and resource utilization. You'll need this information regardless of the migration path you choose. It's useful, for example, to help guide selection of the App Service Plan.\n\nThe [list of available App Service Plan tiers](https://azure.microsoft.com/pricing/details/app-service/linux/) shows the memory, CPU cores, storage, and pricing information. Note that JBoss EAP on App Service is only available on the **Premium V3** and **Isolated V2** App Service Plan tiers.\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-server-capacity-virtual-machines.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Inventory server capacity\n\nDocument the hardware (memory, CPU, disk) of the current production server(s) as well as the average and peak request counts and resource utilization. This information must inform the choice of VM size. For more information, see [Sizes for Cloud Services](/azure/cloud-services/cloud-services-sizes-specs).\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-was-jndi-resources.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Inventory JNDI resources\n\nInventory all JNDI resources. For example, datasources such as databases may have an associated JNDI name that allows JPA to correctly bind instances of `EntityManager` to a particular database. For more information on JNDI resources and databases, see [WebSphere Data Sources](https://www.ibm.com/docs/en/was-nd/9.0.5?topic=concepts-data-sources) in the IBM documentation. Other JNDI-related resources, such as JMS message brokers, may require migration or reconfiguration. For more information on JMS configuration, see [Using JMS resources](https://www.ibm.com/docs/en/was/9.0.5?topic=applications-using-jms-resources).\n"
  },
  {
    "path": "articles/java/migration/includes/inventory-was-secrets.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Inventory all secrets\n\nBefore the advent of \"configuration as a service\" technologies such as Azure Key Vault, there wasn't a well-defined concept of \"secrets\". Instead, you had a disparate set of configuration settings that effectively functioned as what we now call \"secrets\". With app servers such as WAS, these secrets are in many different config files and configuration stores. Check all properties and configuration files on the production server(s) for any secrets and passwords. Configuration files containing passwords or credentials may also be found inside your application. WAS stores configuration data in several documents in a cascading hierarchy of directories. Most configuration documents have XML content. For more information, see [Configuration documents](https://www.ibm.com/docs/en/was/9.0.5?topic=files-configuration-documents) and [Azure Key Vault basic concepts](/azure/key-vault/basic-concepts).\n"
  },
  {
    "path": "articles/java/migration/includes/jms-broker-settings-examples-in-spring.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n[!INCLUDE [security-note](../../includes/security-note.md)]\n\nHere's an ActiveMQ example from an **application.properties** file:\n\n```properties\nspring.activemq.brokerurl=broker:(tcp://localhost:61616,network:static:tcp://remotehost:61616)?persistent=false&useJmx=true\nspring.activemq.user=admin\nspring.activemq.password=<password>\n```\n\nFor more information on ActiveMQ configuration, see the [Spring Boot messaging documentation](https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/boot-features-messaging.html).\n\nHere's an IBM MQ example from an **application.yaml** file:\n\n```yaml\nibm:\n  mq:\n    queueManager: qm1\n    channel: dev.ORDERS\n    connName: localhost(14)\n    user: admin\n    password: <password>\n```\n\nFor more information on IBM MQ configuration, see the [IBM MQ Spring components documentation](https://github.com/ibm-messaging/mq-jms-spring#ibm-mq-jms-spring-components).\n"
  },
  {
    "path": "articles/java/migration/includes/migrate-all-certificates-to-keyvault-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n\n### Migrate all certificates to KeyVault\n\nAzure Containers Apps supports secure communication between apps. Your application doesn't need to manage the process of establishing secure communication. You can upload the private certificate to Azure Container Apps or use a free managed certificate provided by Azure Container Apps. Using Azure Key Vault to manage certificates is a recommended approach. For more information, see [Certificates in Azure Container Apps](/azure/container-apps/certificates-overview).\n"
  },
  {
    "path": "articles/java/migration/includes/migrate-github-copilot-app-modernization-for-java-quickstart-prerequisites.md",
    "content": "---\nms.date: 01/21/2026\n---\n\n- A GitHub account with an active [GitHub Copilot](https://github.com/features/copilot) subscription under any plan.\n- One of the following IDEs:\n  - The latest version of [Visual Studio Code](https://code.visualstudio.com/). Must be version 1.106 or later.\n    - [GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/overview). For setup instructions, see [Set up GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/setup). Be sure to sign in to your GitHub account within Visual Studio Code.\n    - [GitHub Copilot modernization](https://marketplace.visualstudio.com/items?itemName=vscjava.migrate-java-to-azure). Restart Visual Studio Code after installation.\n  - The latest version of [IntelliJ IDEA](https://www.jetbrains.com/idea/download). Must be version 2023.3 or later.\n    - [GitHub Copilot](https://plugins.jetbrains.com/plugin/17718-github-copilot). Must be version 1.5.59 or later. For more instructions, see [Set up GitHub Copilot in IntelliJ IDEA](https://docs.github.com/en/copilot/get-started/quickstart). Be sure to sign in to your GitHub account within IntelliJ IDEA.\n    - [GitHub Copilot modernization](https://plugins.jetbrains.com/plugin/28791-github-copilot-app-modernization). Restart IntelliJ IDEA after installation. If you don't have GitHub Copilot installed, you can install GitHub Copilot modernization directly.\n- [Java 21](/java/openjdk/download) or later.\n- [Maven](https://maven.apache.org/download.cgi) or [Gradle](https://gradle.org/install/) to build Java projects.\n\n> [!NOTE]\n> [!INCLUDE [Azure account note](../../../includes/github-copilot-modernization-azure-note.md)]\n>\n> [!INCLUDE [Gradle Kotlin note](../../../includes/github-copilot-modernization-gradle-kotlin-note.md)]\n>\n> [!INCLUDE [IntelliJ note](../../../includes/github-copilot-modernization-intellij-note.md)]\n"
  },
  {
    "path": "articles/java/migration/includes/migrate-identity-provider-app-service.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Migrate and enable the identity provider\n\nIf your application requires authentication or authorization, ensure they're configured to access the identity provider by using the following guidance:\n\n* If the identity provider is Microsoft Entra ID, no changes should be necessary.\n* If the identity provider is an on-premises Active Directory forest, consider implementing a hybrid identity solution with Microsoft Entra ID. For more information, see the [Hybrid identity documentation](/azure/active-directory/hybrid/).\n* If the identity provider is another on-premises solution, such as PingFederate, consult the [Custom installation of Microsoft Entra Connect](/azure/active-directory/hybrid/how-to-connect-install-custom) topic to configure federation with Microsoft Entra ID. Alternatively, consider using Spring Security to use your identity provider through [OAuth2/OpenID Connect](https://docs.spring.io/spring-security/reference/index.html) or [SAML](https://docs.spring.io/spring-security/reference/index.html#).\n"
  },
  {
    "path": "articles/java/migration/includes/migrate-scheduled-jobs-aks.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Migrate scheduled jobs\n\nTo execute scheduled jobs on your AKS cluster, define Kubernetes CronJobs as needed. For more information, see [Running Automated Tasks with a CronJob](https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/).\n"
  },
  {
    "path": "articles/java/migration/includes/migrate-scheduled-jobs.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Migrate scheduled jobs\n\nTo execute scheduled jobs on Azure, consider using a [Timer trigger for Azure Functions](/azure/azure-functions/functions-bindings-timer). You don't need to migrate the job code itself into a function. The function can simply invoke a URL in your application to trigger the job. If such job executions have to be dynamically invoked and/or centrally tracked, consider using [Spring Batch](https://spring.io/projects/spring-batch).\n\nAlternatively, you can create a Logic app with a Recurrence trigger to invoke the URL without writing any code outside your application. For more information, see [Overview - What is Azure Logic Apps?](/azure/logic-apps/logic-apps-overview) and [Create, schedule, and run recurring tasks and workflows with the Recurrence trigger in Azure Logic Apps](/azure/connectors/connectors-native-recurrence).\n\n> [!NOTE]\n> To prevent malicious use, you'll likely need to ensure that the job invocation endpoint requires credentials. In this case, the trigger function will need to provide the credentials.\n"
  },
  {
    "path": "articles/java/migration/includes/migrate-steps-spring-boot-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Create an Azure Container Apps environment and deploy apps\n\nProvision an Azure Container Apps instance in your Azure subscription. Its secure hosting environment is created along with it. For more information, see [Quickstart: Deploy your first container app using the Azure portal](/azure/container-apps/quickstart-portal).\n\n[!INCLUDE [ensure-console-logging-and-configure-diagnostic-settings-azure-container-apps](ensure-console-logging-and-configure-diagnostic-settings-azure-container-apps.md)]\n\n[!INCLUDE [configure-persistent-storage-azure-container-apps](configure-persistent-storage-azure-container-apps.md)]\n\n[!INCLUDE [migrate-all-certificates-to-keyvault-azure-container-apps](migrate-all-certificates-to-keyvault-azure-container-apps.md)]\n\n### Configure application performance management (APM) integrations\n\nWhether your app is deployed from a container image or from code, Azure Container Apps doesn't interfere with your image or code. Therefore, integrating your application with an APM tool depends on your own preferences and implementation.\n\nIf your application isn't using a supported APM, Azure Application Insights is one option. For more information, see [Using Azure Monitor Application Insights with Spring Boot](/azure/azure-monitor/app/java-spring-boot).\n\n### Deploy the application\n\nDeploy each of the migrated microservices (not including Spring Cloud Config Server and Spring Cloud Service Registry), as described in [Deploy Azure Container Apps with the az containerapp up command](/azure/container-apps/containerapp-up).\n\n### Configure per-service secrets and externalized settings\n\nYou can inject configuration settings into each application as environment variables. You can set these variables as manually entries or as references to secrets. For more information about configuration, see [Manage environment variables on Azure Container Apps](/azure/container-apps/environment-variables).\n\n### Migrate and enable the identity provider\n\nIf any of the Spring Cloud applications require authentication or authorization, ensure they're configured to access the identity provider:\n\n* If the identity provider is Microsoft Entra ID, no changes should be necessary.\n* If the identity provider is an on-premises Active Directory forest, consider implementing a hybrid identity solution with Microsoft Entra ID. For more information, see the [Hybrid identity documentation](/azure/active-directory/hybrid/).\n* If the identity provider is another on-premises solution, such as PingFederate, consult the [Custom installation of Microsoft Entra Connect](/azure/active-directory/hybrid/how-to-connect-install-custom) topic to configure federation with Microsoft Entra ID. Alternatively, consider using Spring Security to use your identity provider through [OAuth2/OpenID Connect](https://docs.spring.io/spring-security/reference/index.html) or [SAML](https://docs.spring.io/spring-security/reference/index.html).\n\n### Expose the application\n\nBy default, an application deployed to Azure Container Apps is accessible via an application URL. If your app is deployed in the context of a managed environment with its own virtual network, you need to determine the app's accessibility level to allow public ingress or ingress from your virtual network only. For more information, see [Networking in Azure Container Apps environment](/azure/container-apps/networking).\n"
  },
  {
    "path": "articles/java/migration/includes/note-obtain-your-current-java-version-app-service.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n<!-- Included in \"### Switch to a supported platform\" sections that have different (required) intro paragraphs. For example:\n\n### Switch to a supported platform\n\nApp Service offers specific versions of Java SE. To ensure compatibility, migrate your application to one of the supported versions of in its current environment before you proceed with any of the remaining steps. Be sure to fully test the resulting configuration. Use the latest stable release of your Linux distribution in such tests.\n\n-->\n\n[!INCLUDE [note-obtain-your-current-java-version](note-obtain-your-current-java-version.md)]\n\nOn Azure App Service, the binaries for Java 8 are provided from Eclipse Temurin. For Java 11, 17, and all future LTS releases of Java, App Service provides the [Microsoft Build of OpenJDK](/java/openjdk/overview). These binaries are available for free download at the following sites: \n\n- [Download Java 8](https://adoptium.net/temurin/releases?version=8)\n- [Download Java 11, 17, and all future LTS versions](/java/openjdk/download)\n"
  },
  {
    "path": "articles/java/migration/includes/note-obtain-your-current-java-version.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n<!-- Included in technology-specific include files such as note-obtain-your-current-java-version-app-service.md. -->\n\n> [!NOTE]\n> This validation is especially important if your current server is running on an unsupported JDK (such as Oracle JDK or IBM OpenJ9).\n\nTo obtain your current Java version, sign in to your production server and run the following command:\n\n```bash\njava -version\n```\n"
  },
  {
    "path": "articles/java/migration/includes/perform-in-place-testing-jboss.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Perform in-place testing\n\nBefore creating your container images, migrate your application to the JDK and JBoss EAP versions that you intend to use on App Service. Test the application thoroughly to ensure compatibility and performance.\n"
  },
  {
    "path": "articles/java/migration/includes/perform-in-place-testing.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Perform in-place testing\n\nPrior to creating your container images, migrate your application to the JDK and WildFly versions that you intend to use on AKS. Test the application thoroughly to ensure compatibility and performance.\n"
  },
  {
    "path": "articles/java/migration/includes/post-migration-recommendations-app-service.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n## Recommendations\n\n* If you opted to use the **/home**  directory for file storage, consider replacing it with Azure Storage. For more information, see [Access Azure Storage as a network share from a container in App Service](/azure/app-service/configure-connect-to-azure-storage).\n\n* If you have configuration in the **/home**  directory that contains connection strings, SSL keys, and other secret information, consider using Azure Key Vault and/or parameter injection with application settings where possible. For more information, see [Use Key Vault references for App Service and Azure Functions](/azure/app-service/app-service-key-vault-references) and [Configure an App Service app in the Azure portal](/azure/app-service/configure-common).\n\n* Consider using deployment slots for reliable deployments with zero downtime. For more information, see [Set up staging environments in Azure App Service](/azure/app-service/deploy-staging-slots).\n\n* Design and implement a DevOps strategy. To maintain reliability while increasing your development velocity, consider automating deployments and testing with Azure Pipelines. For more information, see [Build and deploy to a Java web app](/azure/devops/pipelines/ecosystems/java-webapp). When you use deployment slots, you can [automate deployment to a slot](/azure/devops/pipelines/targets/webapp?tabs=yaml#deploy-to-a-slot) followed by the slot swap. For more information, see the [Deploy to a slot](/azure/devops/pipelines/targets/webapp#deploy-to-a-slot) section of [Deploy an Azure Web App (Linux)](/azure/devops/pipelines/targets/webapp).\n\n* Design and implement a business continuity and disaster recovery strategy. For mission-critical applications, consider a multi-region deployment architecture. For more information, see [Highly available multi-region web application](/azure/architecture/reference-architectures/app-service-web-app/multi-region).\n"
  },
  {
    "path": "articles/java/migration/includes/post-migration-spring-boot-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\nNow that you've completed your migration, verify that your application works as you expect. You can then make your application more cloud-native by using the following recommendations.\n\n* Consider enabling your application to work with Spring Cloud Registry. This component enables your application to be dynamically discovered by other deployed Spring applications and clients. For more information, see [Configure settings for the Eureka Server for Spring component in Azure Container Apps](/azure/container-apps/java-eureka-server-usage). Then, modify any application clients to use the Spring Client Load Balancer. The Spring Client Load Balancer enables the client to obtain addresses of all the running instances of the application and find an instance that works if another instance becomes corrupted or unresponsive. For more information, see [Spring Tips: Spring Cloud Load Balancer](https://spring.io/blog/2020/03/25/spring-tips-spring-cloud-loadbalancer) in the Spring Blog.\n\n* Instead of making your application public, consider adding a [Spring Cloud Gateway](https://cloud.spring.io/spring-cloud-gateway/reference/html/) instance. Spring Cloud Gateway provides a single endpoint for all applications deployed in your Azure Container Apps environment. If a Spring Cloud Gateway is already deployed, ensure that a routing rule is configured to route traffic to your newly deployed application.\n\n* Consider adding a Spring Cloud Config Server to centrally manage and version-control configuration for all your Spring Cloud applications. First, create a Git repository to house the configuration and configure app instance to use it. For more information, see [Configure settings for the Config Server for Spring component in Azure Container Apps](/azure/container-apps/java-config-server-usage). Then, migrate your configuration using the following steps:\n\n  1. Inside the application's **src/main/resources** directory, create a **bootstrap.yml** file with the following contents:\n\n        ```yml\n          spring:\n            application:\n              name: <your-application-name>\n        ```\n\n  1. In the configuration Git repository, create a **\\<your-application-name\\>.yml** file, where `your-application-name` is the same as in the preceding step. Move the settings from **application.yml** file in **src/main/resources** to the new file you created. If the settings were previously in a **.properties** file, converted them to YAML first. You can find online tools or IntelliJ plugins to perform this conversion.\n\n  1. Create an **application.yml** file in the directory above. You can use this file to define settings and resources that are shared among all applications in the Azure Container Apps environment. Such settings typically include data sources, logging settings, Spring Boot Actuator configuration, and others.\n\n  1. Commit and push these changes to the Git repository.\n\n  1. Remove the **application.properties** or **application.yml** file from the application.\n\n* Consider adding the Admin for Spring managed component to enable an administrative interface for Spring Boot web applications that expose actuator endpoints. For more information, see [Configure the Spring Boot Admin component in Azure Container Apps](/azure/container-apps/java-admin-for-spring-usage).\n\n* Consider adding a deployment pipeline for automatic, consistent deployments. Instructions are available for [Azure Pipelines](/azure/container-apps/azure-pipelines) and for [GitHub Actions](/azure/container-apps/github-actions).\n\n* Consider using container apps revisions, revision labels, and ingress traffic weights to enable blue-green deployment, which enables you to test code changes in production before they're made available to some or all of your end users. For more information, see [Blue-Green Deployment in Azure Container Apps](/azure/container-apps/blue-green-deployment).\n\n* Consider adding service bindings to connect your application to supported Azure databases. These service bindings would eliminate the need for you to provide connection information, including credentials, to your Spring Cloud applications.\n\n* Consider enabling the Java development stack to collect JVM core metrics for your applications. For more information, see [Java metrics for Java apps in Azure Container Apps](/azure/container-apps/java-metrics).\n\n* Consider adding Azure Monitor alert rules and action groups to quickly detect and address aberrant conditions. For more information, see [Set up alerts in Azure Container Apps](/azure/container-apps/alerts).\n\n* Consider replicating your app across the zones in the region by enabling Azure Container Apps zone redundancy. Traffic is load balanced and automatically routed to replicas if a zone outage occurs. For more information on redundant settings, see [Reliability in Azure Container Apps](/azure/reliability/reliability-azure-container-apps).\n\n* Consider protecting Azure Container Apps from common exploits and vulnerabilities by using Web Application Firewall on Application Gateway. For more information, see [Protect Azure Container Apps with Web Application Firewall on Application Gateway](/azure/container-apps/waf-app-gateway).\n"
  },
  {
    "path": "articles/java/migration/includes/provision-a-public-ip-address.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Provision a public IP address\n\nIf your application is to be accessible from outside your internal or virtual network(s), you'll need a public static IP address. You should provision this IP address inside your cluster's node resource group, as shown in the following example:\n\n```azurecli\nexport nodeResourceGroup=$(az aks show \\\n    --resource-group $resourceGroup \\\n    --name $aksName \\\n    --query 'nodeResourceGroup' \\\n    --output tsv)\nexport publicIp=$(az network public-ip create \\\n    --resource-group $nodeResourceGroup \\\n    --name applicationIp \\\n    --sku Standard \\\n    --allocation-method Static \\\n    --query 'publicIp.ipAddress' \\\n    --output tsv)\necho \"Your public IP address is ${publicIp}.\"\n```\n"
  },
  {
    "path": "articles/java/migration/includes/provision-azure-app-service-for-jboss-eap-runtime.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Provision Azure App Service for JBoss EAP runtime\n\nUse the following commands to create a resource group and an Azure App Service Plan. After the App Service Plan is created, a Linux web app plan is created using the JBoss Enterprise Application Platform (EAP) runtime.\n\nBe sure the specified environment variables have appropriate values.\n\n```azurecli\naz group create --resource-group $resourceGroup --location eastus\naz acr create --resource-group $resourceGroup --name $acrName --sku Standard\naz appservice plan create \\\n    --resource-group $resourceGroup \\\n    --name $jbossAppService \\\n    --is-linux \\\n    --sku P0v3\naz webapp create \\\n    --resource-group $resourceGroup \\\n    --name $jbossWebApp \\\n    --plan $jbossAppServicePlan \\\n    --runtime \"JBOSSEAP|8-java17\"\n    #  Or use \"JBOSSEAP|8-java11\" if you're using Java 11\n```\n"
  },
  {
    "path": "articles/java/migration/includes/provision-azure-container-registry-and-azure-kubernetes-service.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: manriem\nms.date: 01/13/2026\n---\n\n### Provision Azure Container Registry and Azure Kubernetes Service\n\nUse the following commands to create a container registry and an Azure Kubernetes cluster with a Service Principal that has the Reader role on the registry. Be sure to [choose the appropriate network model](/azure/aks/operator-best-practices-network#choose-the-appropriate-network-model) for your cluster's networking requirements.\n\n```azurecli\naz group create \\\n    --resource-group $resourceGroup \\\n    --location eastus\naz acr create \\\n    --resource-group $resourceGroup \\\n    --name $acrName \\\n    --sku Standard\naz aks create \\\n    --resource-group $resourceGroup \\\n    --name $aksName \\\n    --attach-acr $acrName \\\n    --network-plugin azure\n```\n"
  },
  {
    "path": "articles/java/migration/includes/quickstart-assess-migrate-intellij-idea.md",
    "content": "---\nms.date: 03/20/2026\nms.collection: ce-skilling-ai-copilot\n---\n\n## Prerequisites\n\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- A GitHub account with an active [GitHub Copilot](https://github.com/features/copilot) subscription under any plan.\n- The latest version of [IntelliJ IDEA](https://www.jetbrains.com/idea/download). Must be version 2023.3 or later.\n  - [GitHub Copilot](https://plugins.jetbrains.com/plugin/17718-github-copilot). Must be version 1.5.59 or later. For more instructions, see [Set up GitHub Copilot in IntelliJ IDEA](https://docs.github.com/en/copilot/get-started/quickstart). Be sure to sign in to your GitHub account within IntelliJ IDEA.\n  - [GitHub Copilot modernization](https://plugins.jetbrains.com/plugin/28791-github-copilot-app-modernization). Restart IntelliJ IDEA after installation. If you don't have GitHub Copilot installed, you can install GitHub Copilot modernization directly.\n- [Java 21](/java/openjdk/download) or later.\n- [Maven](https://maven.apache.org/download.cgi) or [Gradle](https://gradle.org/install/) to build Java projects.\n\n> [!NOTE]\n> If you're using Gradle, only the Gradle wrapper version 5 or later is supported. The Kotlin Domain Specific Language (DSL) isn't supported.\n>\n> The function `My Tasks` isn't supported yet for IntelliJ IDEA.\n\n## Upgrade JDK and dependency versions\n\nYou can upgrade your JDK version in two ways. Both ways use the **GitHub Copilot modernization** pane in IntelliJ IDEA, which you can access from the sidebar.\n\nOne way to upgrade your JDK version is to select **Upgrade Runtime & Frameworks** in the **QUICKSTART** section. Another way is to run the **Upgraded Java Runtime** task in the **TASKS - Upgrade Tasks** section. For more information, see [Quickstart: upgrade a Java project with GitHub Copilot modernization](/java/upgrade/quickstart-upgrade).\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/upgrade-java-version-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/upgrade-java-version-intellij-idea.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization pane with the Upgrade options highlighted.\":::\n\nTo upgrade the Spring framework or a third-party dependency, run the **Upgrade Java Framework** task in the **TASKS - Upgrade Tasks** section. For more information, see [Upgrade a Java framework or third-party dependency by using GitHub Copilot modernization](/java/upgrade/framework-upgrade).\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/upgrade-framework-version-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/upgrade-framework-version-intellij-idea.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization pane with the Upgrade Java Framework task highlighted.\":::\n\n## Assess cloud readiness\n\nUse the following steps to start your migration process with solution assessment. This assessment helps you understand what your cloud readiness challenges are and how impactful they are. It also provides recommended solutions. A solution recommendation includes references to set up Azure resources, add configurations, and make code changes.\n\n1. Clone the [Java migration copilot samples](https://github.com/Azure-Samples/java-migration-copilot-samples) repository and then check out to the **source** branch.\n\n1. In IntelliJ IDEA, open the `mi-sql-public-demo` project folder in the samples repository.\n\n1. On the sidebar, select the **GitHub Copilot modernization** pane, where you can select **Start Assessment** or **Run Assessment** in the **ASSESSMENT** section.\n\n   :::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/run-assessment-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/run-assessment-intellij-idea.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization pane with the Migrate to Azure and Run Assessment buttons highlighted.\":::\n\n1. The GitHub Copilot chat window with agent mode opens to call the modernization assessor to execute the modernization assessment. Select **Continue** to confirm.\n\n1. The modernization assessor now opens `appcat.log`. This file shows the logs for running AppCAT, which performs the app assessment. Select **Continue** to confirm again.\n\n1. The modernization assessor verifies your local environment first. If the AppCAT and its dependencies aren't installed, the agent helps you install them. After installation, the agent calls AppCAT to assess the current project. This step could take several minutes to complete.\n\n1. Upon completion of the analysis, the modernization assessor produces a categorized view of cloud readiness issues in an opened **Assessment Report**.\n\n   :::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-intellij-idea.png\" alt-text=\"Screenshot that shows the assessment report.\":::\n\n1. When reviewing the summary report, you can select **Migrate to Azure SQL Database (Spring)** from the solution list under the issue **Database Migration (Microsoft SQL)**. Then, select **Run Task** to move to the code remediation stage.\n\n   :::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/confirm-sql-solution-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/confirm-sql-solution-intellij-idea.png\" alt-text=\"Screenshot that shows the Migrate to Azure SQL Database option with the Run Task button highlighted.\":::\n"
  },
  {
    "path": "articles/java/migration/includes/quickstart-assess-migrate-visual-studio-code.md",
    "content": "---\nms.date: 03/20/2026\nms.collection: ce-skilling-ai-copilot\n---\n\n## Prerequisites\n\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- A GitHub account with an active [GitHub Copilot](https://github.com/features/copilot) subscription under any plan.\n- The latest version of [Visual Studio Code](https://code.visualstudio.com/). Must be version 1.106 or later.\n  - [GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/overview). For setup instructions, see [Set up GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/setup). Be sure to sign in to your GitHub account within Visual Studio Code.\n  - [GitHub Copilot modernization](https://marketplace.visualstudio.com/items?itemName=vscjava.migrate-java-to-azure). Restart Visual Studio Code after installation.\n- [Java 21](/java/openjdk/download) or later.\n- [Maven](https://maven.apache.org/download.cgi) or [Gradle](https://gradle.org/install/) to build Java projects.\n\n> [!NOTE]\n> If you're using Gradle, only the Gradle wrapper version 5 or later is supported. The Kotlin Domain Specific Language (DSL) isn't supported.\n\n## Upgrade JDK and dependency versions\n\nYou can upgrade your JDK version in two ways. Both ways use the **GitHub Copilot modernization** pane in Visual Studio Code, which you can access from the sidebar.\n\nOne way to upgrade your JDK version is to select **Upgrade Runtime & Frameworks** in the **QUICKSTART** section. Another way is to run the **Upgraded Java Runtime** task in the **TASKS - Upgrade Tasks** section. For more information, see [Quickstart: upgrade a Java project with GitHub Copilot modernization](/java/upgrade/quickstart-upgrade).\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/upgrade-java-version-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/upgrade-java-version-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization pane with the Upgrade options highlighted.\":::\n\nTo upgrade the Spring framework or a third-party dependency, run the **Upgrade Java Framework** task in the **TASKS - Upgrade Tasks** section. For more information, see [Upgrade a Java framework or third-party dependency by using GitHub Copilot modernization](/java/upgrade/framework-upgrade).\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/upgrade-framework-version-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/upgrade-framework-version-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization pane with the Upgrade Java Framework task highlighted.\":::\n\n## Assess cloud readiness\n\nUse the following steps to start your migration process with solution assessment. This assessment helps you understand your cloud readiness challenges and how impactful they are. It also provides recommended solutions. A solution recommendation includes references to set up Azure resources, add configurations, and make code changes.\n\n1. Clone the [Java migration copilot samples](https://github.com/Azure-Samples/java-migration-copilot-samples) repository and then check out the **source** branch.\n\n1. In Visual Studio Code, open the **mi-sql-public-demo** project folder in the samples repository.\n\n1. On the sidebar, select the **GitHub Copilot modernization** pane, and then select **Start Assessment** or **Open Assessment Dashboard** in the **QUICKSTART** section.\n\n   :::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/run-assessment-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/run-assessment-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization pane with the Start Assessment or Open Assessment Dashboard button highlighted.\":::\n\n1. Select **Recommended Assessment**, select the **Cloud Readiness** domain, and select **OK** to start the assessment.\n\n1. When the analysis finishes, the modernization assessor opens **Assessment Report** and shows a categorized view of cloud readiness problems.\n\n   :::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-visual-studio-code.png\" alt-text=\"Screenshot of the Visual Studio Code pane that shows the assessment report.\":::\n\n1. When you review the summary report, you can select **Migrate to Azure SQL Database (Spring)** from the solution list under the issue **Database Migration (Microsoft SQL)**. Then, select **Run Task** to move to the code remediation stage.\n\n   :::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/confirm-sql-solution-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/confirm-sql-solution-visual-studio-code.png\" alt-text=\"Screenshot of the Visual Studio Code Issues pane that shows the Migrate to Azure SQL Database option with the Run Task button highlighted.\":::"
  },
  {
    "path": "articles/java/migration/includes/recommendations-jboss-eap.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Recommendations\n\n* If you opted to use the **/home**  directory for file storage, consider replacing it with Azure Storage. For more information, see [Mount Azure Storage as a local share in a custom container in App Service](/azure/app-service/containers/how-to-serve-content-from-azure-storage).\n\n* If you have configuration in the **/home**  directory that contains connection strings, SSL keys, and other secret information, consider using a combination of Azure Key Vault and parameter injection with application settings where possible. For more information, see [Use Key Vault references for App Service and Azure Functions](/azure/app-service/app-service-key-vault-references) and [Configure an App Service app](/azure/app-service/configure-common).\n\n* Consider using deployment slots for reliable deployments with zero downtime. For more information, see [Set up staging environments in Azure App Service](/azure/app-service/deploy-staging-slots).\n\n* Design and implement a DevOps strategy. In order to maintain reliability while increasing your development velocity, consider automating deployments and testing with Azure Pipelines. For more information, see [Build & deploy to Java web app](/azure/devops/pipelines/ecosystems/java-webapp). If you're using deployment slots, you can automate deployment to a slot and the subsequent slot swap. For more information, see the [Example: Deploy to a slot](/azure/devops/pipelines/targets/webapp#example-deploy-to-a-slot) section of [Deploy to App Service using Azure Pipelines](/azure/devops/pipelines/targets/webapp).\n\n* Design and implement a business continuity and disaster recovery strategy. For mission-critical applications, consider a multi-region deployment architecture. For more information, see [Highly available multi-region web application](/azure/architecture/reference-architectures/app-service-web-app/multi-region).\n"
  },
  {
    "path": "articles/java/migration/includes/redhat-migration-toolkit.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Red Hat Migration Toolkit for Apps\n\nThe [Red Hat Migration Toolkit for Applications](https://marketplace.visualstudio.com/items?itemName=redhat.mta-vscode-extension) is a free extension for Visual Studio Code. This extension analyzes your application code and configuration to provide recommendations for migrating your Jakarta EE applications to JBoss EAP from other app servers, such as removing dependencies on proprietary APIs. The extension will also provide recommendations if you're migrating to the cloud from on-premises. For more information, see [Migration Toolkit for Applications overview](https://developers.redhat.com/products/mta/overview).\n\nThe contents of this guide will help you address the other components of the migration journey, such as choosing the correct App Service Plan type, externalizing your session state, and using Azure to manage your EAP instances instead of the JBoss Management interface.\n"
  },
  {
    "path": "articles/java/migration/includes/setup-data-sources-and-deploy-app-service-jboss.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Set up data sources\n\nThere are three core steps when registering a data source with JBoss Enterprise Application Platform (EAP): uploading the Java Database Connectivity (JDBC) driver, adding the JDBC driver as a module, and registering the module. For more information, see [Datasource Management](https://docs.redhat.com/en/documentation/red_hat_jboss_enterprise_application_platform/8.0/html/configuration_guide/datasource_management) in the JBoss EAP documentation. App Service is a stateless hosting service, so the configuration commands for adding and registering the data source module must be scripted and applied as the container starts.\n\nTo set up data sources, use the following steps.\n\n1. Obtain your database's JDBC driver.\n\n1. Create an XML module definition file for the JDBC driver. The example shown is a module definition for PostgreSQL. Be sure to replace the `resource-root path` value with the path to the JDBC driver you use.\n\n   ```xml\n   <?xml version=\"1.0\" ?>\n   <module xmlns=\"urn:jboss:module:1.1\" name=\"org.postgres\">\n       <resources>\n       <!-- ***** IMPORTANT: REPLACE THIS PLACEHOLDER *******-->\n       <resource-root path=\"/home/site/deployments/tools/postgresql-42.2.12.jar\" />\n       </resources>\n       <dependencies>\n           <module name=\"javax.api\"/>\n           <module name=\"javax.transaction.api\"/>\n       </dependencies>\n   </module>\n   ```\n\n1. Put your JBoss CLI commands into a file named **jboss-cli-commands.cli**. The JBoss commands must add the module and register it as a data source. The example shows the JBoss CLI commands for PostgreSQL.\n\n   [!INCLUDE [security-note](../../includes/security-note.md)]\n\n   ```bash\n   module add --name=org.postgres --resources=/home/site/deployments/tools/postgresql-42.2.12.jar --module-xml=/home/site/deployments/tools/postgres-module.xml\n\n   /subsystem=datasources/jdbc-driver=postgres:add(driver-name=\"postgres\",driver-module-name=\"org.postgres\",driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)\n\n   data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=${POSTGRES_CONNECTION_URL,env.POSTGRES_CONNECTION_URL:jdbc:postgresql://db:5432/postgres} --user-name=${POSTGRES_SERVER_ADMIN_FULL_NAME,env.POSTGRES_SERVER_ADMIN_FULL_NAME:postgres} --password=${POSTGRES_SERVER_ADMIN_PASSWORD,env.POSTGRES_SERVER_ADMIN_PASSWORD:example} --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker\n   ```\n\n1. Create a startup script called **startup_script.sh** that calls the JBoss CLI commands. The example shows how to call your **jboss-cli-commands.cli** file. Later you configure App Service to run this script when the instance starts.\n\n   ```bash\n   $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli\n   ```\n\n1. Using an FTP client of your choice, upload your JDBC driver, **jboss-cli-commands.cli**, **startup_script.sh**, and the module definition to **/site/deployments/tools/**.\n\n1. Configure your site to run **startup_script.sh** when the container starts. In the Azure portal, navigate to **Configuration > General Settings > Startup Command**. Set the startup command field to **/home/site/deployments/tools/startup_script.sh**, then select **Save**.\n\n1. Restart the web app, which causes it to run the configuration script.\n\n1. Update the Java Transaction API (JTA) datasource configuration for your application.\nOpen the **src/main/resources/META-INF/persistence.xml** file for your app and find the `<jta-data-source>` element. Replace its contents as shown here:\n\n   ```bash\n   <jta-data-source>java:jboss/datasources/postgresDS</jta-data-source>\n   ```\n\n[!INCLUDE [build-and-deploy-war-to-app-service](build-and-deploy-war-to-app-service.md)]\n"
  },
  {
    "path": "articles/java/migration/includes/sign-in-to-azure.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Sign in to Azure\n\nIf you haven't done so already, sign in to your Azure subscription by using the [az login](/cli/azure/reference-index) command and follow the on-screen directions.\n\n```azurecli\naz login\n```\n\n> [!NOTE]\n> If multiple Azure tenants are associated with your Azure credentials, you must specify which tenant you want to sign in to. You can do this by using the `--tenant` option. For example: `az login --tenant contoso.onmicrosoft.com`.\n"
  },
  {
    "path": "articles/java/migration/includes/static-content.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Read-only static content\n\nIf your application currently serves static content, you need an alternate location for it. You should consider moving static content to Azure Blob Storage and adding Azure Front Door for fast downloads globally. For more information, see [Static website hosting in Azure Storage](/azure/storage/blobs/storage-blob-static-website) and [Integrate an Azure Storage account with Azure Front Door](/azure/frontdoor/integrate-storage-account).\n"
  },
  {
    "path": "articles/java/migration/includes/switch-to-a-supported-platform-azure-container-apps.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n#### Switch to a supported platform\n\nIf you create your Dockerfile manually and deploy containerized application to Azure Container Apps, you take full control over your deployment including JRE/JDK versions.\n\nFor deployment from artifacts, Azure Container Apps also offers specific versions of Java (8, 11, 17, and 21) and specific versions of Spring Boot and Spring Cloud components. To ensure compatibility, first migrate your application to one of the supported versions of Java in its current environment, then proceed with the remaining migration steps. Be sure to fully test the resulting configuration. Use the latest stable release of your Linux distribution in such tests.\n\n[!INCLUDE [note-obtain-your-current-java-version](note-obtain-your-current-java-version.md)]\n\nFor supported versions of Java, Spring Boot, and Spring Cloud, as well instructions for updating, see [Java on Azure Container Apps overview](/azure/container-apps/java-overview).\n"
  },
  {
    "path": "articles/java/migration/includes/tomcat-datasource-additional-instructions.md",
    "content": "--- \nauthor: KarlErickson\nms.author: karler \nms.date: 01/13/2026\n--- \n\nFor additional data source instructions, see the following sections of the [JNDI Datasource How-To](https://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html) in the Tomcat documentation:\n\n- [MySQL](https://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html#MySQL_DBCP_2_Example)\n- [PostgreSQL](https://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html#PostgreSQL)\n- [SQL Server](https://cwiki.apache.org/confluence/display/TOMCAT/UsingDataSources)\n"
  },
  {
    "path": "articles/java/migration/includes/validate-that-the-supported-java-version-works-correctly-jboss-eap.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\n---\n\n### Validate that the supported Java version works correctly\n\nJBoss EAP on Azure VMs requires a supported version of Java. For guidance on which version of the JDK to use, see [Supported Configurations](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.2/html/7.2.0_release_notes/supported_configs) in the Red Hat documentation.\n\n[!INCLUDE [note-obtain-your-current-java-version](note-obtain-your-current-java-version.md)]\n"
  },
  {
    "path": "articles/java/migration/includes/validate-that-the-supported-java-version-works-correctly-liberty.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Validate that the supported Java version works correctly\n\nUsing Liberty requires a specific version of Java, so you need to confirm that your application runs correctly using that supported version.\n\nThe runtime of WebSphere Application Server Liberty has specific requirements for the minimum level of the Java Runtime Environment (JRE). For more information, see [Java version dependencies for features](https://www.ibm.com/docs/was-liberty/core?topic=manually-java-version-dependencies-features).\n\nOpen Liberty requires a Java SE runtime. It can run by using either a Java Runtime Environment (JRE) or a Java SE Development Kit (JDK) distribution. For more information, see [Supported Java SE releases](https://openliberty.io/docs/latest/java-se.html).\n"
  },
  {
    "path": "articles/java/migration/includes/validate-that-the-supported-java-version-works-correctly-was.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n### Validate that the supported Java version works correctly\n\nUsing WAS on Azure Virtual Machines requires a specific version of Java, so you need to confirm that your application runs correctly using that supported version.\n\nIBM Java 8 comes with the WAS9 distribution. We recommend using the IBM-provided Java JRE. For more information, see [Java SE 8 in WebSphere Application Server traditional V9](https://www.ibm.com/docs/en/was/9.0.5?topic=waso-java-se-8-in-websphere-application-server-traditional-v9).\n\nIf you want to switch to a different Java SDK, follow the IBM document [Switching the Java SDK in WebSphere Application Server](https://www.ibm.com/docs/en/wsr-and-r/8.5.6?topic=installing-switching-java-sdk-in-websphere-application-server).\n"
  },
  {
    "path": "articles/java/migration/includes/validate-that-the-supported-java-version-works-correctly-weblogic.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Validate that the supported Java version works correctly\n\nAll of the migration paths for WebLogic to Azure require a specific Java version, which varies for each path. You'll need to validate that your application is able to run correctly using that supported version.\n\n[!INCLUDE [note-obtain-your-current-java-version](note-obtain-your-current-java-version.md)]\n\n> [!NOTE]\n> When migrating to WLS on Azure virtual machines, the requirements for the specific Java versions are determined by the pre-installed Java on the virtual machines. When migrating to WLS on AKS, the specific Java version is determined by the container image chosen. There are a wide variety of choices, but all of them use the Oracle JDK.\n"
  },
  {
    "path": "articles/java/migration/includes/vm-aks-aro-tradeoffs-was-liberty.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\nms.custom: devx-track-java, devx-track-extended-java, linux-related-content\n---\n\n### Ensure that the target is the appropriate target for your migration effort\n\nThe first step in a successful migration of a WAS application to Azure is selecting the most appropriate migration target.\n\nWAS traditional runs well on Azure Virtual Machines. The virtual machine (VM) target is the easiest choice, because it most closely resembles an on-premises deployment. The administrative and deployment experience for virtual machines is analogous to what you have on-premises.\n\nAnother option is to migrate to containers by converting WAS traditional workload to application containers. You can run the container target on Azure Kubernetes Service (AKS) and Azure Red Hat OpenShift. The trade-off for this ease is economic cost.\n\nGenerally speaking, the per-minute cost for a VM-based solution is higher compared with containers. While a container-based solution costs less to run, you must constrain your application to fit within the requirements of the container orchestration platform.\n\nIf minimizing change is the most important factor for your migration effort, consider a VM-based migration. In this case, see [Migrate WebSphere applications to Azure Virtual Machines](../migrate-websphere-to-virtual-machines.md).\n\nIf you can tolerate converting your application to run within containers to reduce runtime cost, consider an AKS-based or Azure Red Hat OpenShift-based migration.\n\nFor AKS-based migration, you can start using the Free tier. Get free cluster management and pay for only the virtual machines, associated storage, and networking resources consumed. In this case, see [Migrate WebSphere applications to Azure Kubernetes Service](../migrate-websphere-to-azure-kubernetes-service.md).\n\nFor Azure Red Hat OpenShift-based migration, in addition to the compute and infrastructure costs, application nodes have another cost for the OpenShift license component. This cost is billed based on the number of application nodes and the instance type. Use on-demand pricing or reserved instances, whichever best meets the need of your workload and business. In this case, see [Migrate WebSphere applications to Azure Red Hat OpenShift](../migrate-websphere-to-azure-redhat-openshift.md).\n\nThe how-to guides in the Azure Red Hat OpenShift documentation cover some aspects that are relevant to migration. For the complete list of how-to guides, see the [Azure Red Hat OpenShift documentation](/azure/openshift/).\n"
  },
  {
    "path": "articles/java/migration/includes/vm-aks-tradeoffs-wls.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.date: 01/13/2026\n---\n\n### Ensure that the target is the appropriate target for your migration effort\n\nThe first step in a successful migration of a WLS application to Azure is selecting the most appropriate migration target. WLS runs well on Azure virtual machines (VMs) or Azure Kubernetes Service (AKS). The VM target is the easiest choice, because it most closely resembles an on-premises deployment. The administrative and deployment experience for virtual machines is very analogous to what you have on-premises. The trade-off for this ease is economic cost. Generally speaking, the per-minute cost for a VM-based solution is higher compared with AKS. While an AKS-based solution costs less to run, you must constrain your application to fit within the requirements of AKS. If minimizing change is the most important factor for your migration effort, consider a VM-based migration. In this case, see [Migrate WebLogic applications to Azure Virtual Machines](../migrate-weblogic-to-virtual-machines.md). If you can tolerate converting your application to run within Kubernetes to reduce runtime cost, consider an AKS-based migration.  In this case, continue with [Migrate WebLogic Server applications to Azure Kubernetes Service](../migrate-weblogic-to-azure-kubernetes-service.md).\n"
  },
  {
    "path": "articles/java/migration/includes/vm-aro-tradeoffs-eap.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.date: 01/13/2026\nms.custom: devx-track-java, devx-track-extended-java, linux-related-content\n---\n\n### Ensure that the target is the appropriate target for your migration effort\n\nThe first step in a successful migration of a JBoss EAP application to Azure is selecting the most appropriate migration target. JBoss EAP runs well on Azure virtual machines (VMs) or Azure Red Hat OpenShift.\n\nThe VM target is the easiest choice, because it most closely resembles an on-premises deployment. The administrative and deployment experience for virtual machines is analogous to what you have on-premises. Selecting VMs allows you to defer modernization.\n\nRed Hat OpenShift brings together tested and trusted services to reduce the friction of developing, modernizing, deploying, running, and managing applications. Azure Red Hat OpenShift is built on Kubernetes. Azure Red Hat OpenShift delivers a consistent experience across public cloud, on-premises, hybrid cloud, or edge architecture.\n\nIf minimizing change is the most important factor for your migration effort, consider a VM-based migration. In this case, see [Migrate JBoss EAP applications to JBoss EAP on Azure VMs](../migrate-jboss-eap-to-jboss-eap-on-azure-vms.md). If you can tolerate converting your application to run within Red Hat OpenShift to reduce runtime cost, consider an Azure Red Hat OpenShift-based migration. In this case, continue with [Migrate JBoss EAP applications to JBoss EAP on Azure Red Hat OpenShift](../migrate-jboss-eap-to-azure-redhat-openshift.md). To understand the differences between JBoss EAP and JBoss EAP for OpenShift, see [Comparison: JBoss EAP and JBoss EAP for OpenShift](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/getting_started_with_jboss_eap_for_openshift_online/introduction#how_does_eap_work_on_openshift).\n"
  },
  {
    "path": "articles/java/migration/includes/wls-manual-guidance-configure-domain.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\nA WebLogic Server domain is a logically related group of WebLogic Server instances, and the resources running on and connected to them, that can be managed as a single administrative unit. For more information, see [WebLogic Server Domains](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/intro/domains.html#GUID-EE8E9DA0-2D95-4EF1-ADA2-4C76CB1AB3A4).\n\nThe foundation of high availability in WebLogic Server is the cluster. A WebLogic Server cluster is a group of WebLogic Server instances running simultaneously and working together to provide increased scalability and reliability. For more information, see [Oracle WebLogic Cluster](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/intro/clustering.html#GUID-E39A18C2-B990-485F-BFB1-0549250FABFE).\n\nThere are two kinds of cluster, as described in the following list. For more information, see [About Dynamic Clusters](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/intro/clustering.html#GUID-2C32CF86-D1F8-464D-AF62-E27C9DDF4459).\n\n- *Dynamic cluster*: A cluster that contains one or more generated (dynamic) server instances that are based on a single shared server template. When you create a dynamic cluster, the dynamic servers are preconfigured and automatically generated for you, enabling you to easily scale up the number of server instances in your dynamic cluster when you need another server capacity. You can start the dynamic servers without having to first manually configure and add them to the cluster.\n- *Configured cluster*: A cluster in which you manually configure and add each server instance. You have to configure and add new server instance to increase server capacity.\n\nTo show you how to form a WebLogic cluster, this tutorial guides you through the process of creating a configured cluster.\n"
  },
  {
    "path": "articles/java/migration/includes/wls-manual-guidance-start-admin-and-get-ip.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\nms.custom: devx-track-java, devx-track-extended-java, devx-track-azurecli\n---\n\nUse the following commands to get and show the private IP addresses, which you use in later sections:\n\n```azurecli\nexport ADMINVM_NIC_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name adminVM \\\n    --query networkProfile.networkInterfaces'[0]'.id \\\n    --output tsv)\nexport ADMINVM_IP=$(az network nic show \\\n    --ids ${ADMINVM_NIC_ID} \\\n    --query ipConfigurations'[0]'.privateIPAddress \\\n    --output tsv)\nexport MSPVM1_NIC_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name mspVM1 \\\n    --query networkProfile.networkInterfaces'[0]'.id \\\n    --output tsv)\nexport MSPVM1_IP=$(az network nic show \\\n    --ids ${MSPVM1_NIC_ID} \\\n    --query ipConfigurations'[0]'.privateIPAddress \\\n    --output tsv)\nexport MSPVM2_NIC_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name mspVM2 \\\n    --query networkProfile.networkInterfaces'[0]'.id \\\n    --output tsv)\nexport MSPVM2_IP=$(az network nic show \\\n    --ids ${MSPVM2_NIC_ID} \\\n    --query ipConfigurations'[0]'.privateIPAddress \\\n    --output tsv)\necho \"Private IP of adminVM: ${ADMINVM_IP}\"\necho \"Private IP of mspVM1: ${MSPVM1_IP}\"\necho \"Private IP of mspVM2: ${MSPVM2_IP}\"\n```\n"
  },
  {
    "path": "articles/java/migration/includes/wls-manual-guidance-start-managed-server.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.date: 01/13/2026\n---\n\n1. Sign in to the Administration Console portal with your admin account and password. The URL is `http://<adminvm-private-ip>:7001/console/`. In this example, the admin account and password are `weblogic/Secret123456`. You'll find the state of managed servers are **Shutdown**.\n1. Under the **Domain Structure**, select **Environments**, **Servers**, and **Control**, select `msp1` and `msp2`, and then select **Start**.\n1. You may be be prompted to confirm starting the servers. If so, select **Yes**. You'll see the message \"A request has been sent to the Node Manager to start the selected servers.\"\n1. You can select the \"refresh\" icon at the top of the table to start or stop the dynamic refresh of the data in that table. This icon is shown in the next screenshot.\n1. You'll find the servers are up soon.\n\n:::image type=\"content\" source=\"../media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-start-servers.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Start Servers.\" lightbox=\"../media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-start-servers.png\":::\n"
  },
  {
    "path": "articles/java/migration/includes/working-with-assessment-intellij-idea.md",
    "content": "---\nms.date: 03/20/2026\nms.collection: ce-skilling-ai-copilot\n---\n\n## Configure before running assessment\n\nBefore running the assessment, configure it by selecting **Configure Assessment** in the GitHub Copilot modernization **Assessment** pane.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/configure-assessment-report.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/configure-assessment-report.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization Assessment pane with the Configure Assessment button highlighted.\":::\n\n### Configuration properties\n\nCurrently, you can configure the `target`, `capability`, `os`, and `mode` properties for the assessment.\n\nBy default, the assessment runs with Azure Kubernetes Service (AKS), Azure App Service, and Azure Container Apps (ACA) as the service targets.\n\n- `target`: the Azure compute service to run the apps on. Choose multiple targets if you haven't decided which one to use. You can then compare the targets on the assessment report.\n\n  | Value                  | Description                                                      |\n  |------------------------|------------------------------------------------------------------|\n  | `azure-aks`            | Best practices for deploying an app to Azure Kubernetes Service. |\n  | `azure-appservice`     | Best practices for deploying an app to Azure App Service.        |\n  | `azure-container-apps` | Best practices for deploying an app to Azure Container Apps.     |\n\n- `capability`: the target technology to modernize the apps towards.\n\n  | Value                  | Description                                     |\n  |------------------------|-------------------------------------------------|\n  | `containerization`     | Best practices for containerizing applications. |\n  | `openjdk11`            | Best practices for migrating to OpenJDK 11.     |\n  | `openjdk17`            | Best practices for migrating to OpenJDK 17.     |\n  | `openjdk21`            | Best practices for migrating to OpenJDK 21.     |\n\n- `os`: the target operating system to run the apps on.\n\n  | Value                  | Description                                                        |\n  |------------------------|--------------------------------------------------------------------|\n  | `linux`                | Best practices for migrating applications to the Linux platform.   |\n  | `windows`              | Best practices for migrating applications to the Windows platform. |\n\n- `mode`: the analysis mode.\n\n  | Value         | Description                                                                             |\n  |---------------|-----------------------------------------------------------------------------------------|\n  | `issue-only`  | Analyze source code to only detect issues.                                              |\n  | `source-only` | Analyze source code to detect both issues and used technologies.                        |\n  | `full`        | Analyze source code to detect both issues and used technologies, and list dependencies. |\n\n### Examples\n\nThe following examples describe some configurations:\n\n- Example one: You want to migrate your apps to AKS as Linux containers and want to understand what issues need to be fixed. Use the following configuration:\n\n  ```yaml\n  appcat:\n  - target:\n      - azure-aks\n    os:\n      - linux\n    mode: issue-only\n  ```\n\n- Example two: You want to migrate your apps to App Service Linux and want to understand what issues need to be fixed. Use the following configuration:\n\n  ```yaml\n  appcat:\n  - target:\n      - azure-appservice\n    os:\n      - linux\n    mode: issue-only\n  ```\n\n- Example three: You want to modernize your apps to JDK21 and want to understand what issues need to be fixed. Use the following configuration:\n\n  ```yaml\n  appcat:\n  - capability:\n      - openjdk21\n    mode: issue-only\n  ```\n\nAfter the tool runs an assessment, it automatically opens the interactive dashboard, which provides comprehensive analysis results.\n\n## Interpret the assessment report\n\nThe assessment report provides comprehensive analysis results to help you understand your application's readiness for Azure migration and modernization. This section guides you through the report structure and helps you interpret the findings to make informed migration decisions.\n\n### Report structure overview\n\nThe assessment report consists of several key sections:\n\n- **Application Information**: Basic information about your application including Java version, frameworks, build tools, project structure, and target Azure service.\n- **Issue Summary**: Overview of migration issues categorized by domain with criticality percentages.\n- **Detailed Analysis**: The detailed report is organized into the following four subsections.\n  - **Issues**: Provides a concise summary of all issues that require attention.\n  - **Dependencies**: Displays all Java-packaged dependencies found within the application.\n  - **Technologies**: Displays all embedded libraries grouped by functionality, enabling you to quickly view the technologies used in the application.\n  - **Insights**: Displays file details and information to help you understand the detected technologies.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-dashboard-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-dashboard-intellij-idea.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization assessment report dashboard.\":::\n\n#### Issues\n\nAccess this part by selecting the **Issues** tab. This tab provides a categorized list of issues for various aspects of cloud readiness and Java upgrade that you need to address to successfully migrate the application to Azure. The following tables describe the **Domain** and **Criticality** values:\n\n| Domain              | Description                                                                             |\n|---------------------|-----------------------------------------------------------------------------------------|\n| **Cloud Readiness** | Evaluates app dependencies to suggest Azure services and ensure cloud-native readiness. |\n| **Java Upgrade**    | Identifies JDK and framework issues for version upgrade.                                |\n\n| Criticality         | Description                                                 |\n|---------------------|-------------------------------------------------------------|\n| **Mandatory**       | Issues that you must fix for migration to Azure.            |\n| **Potential**       | Issues that might impact migration and need review.         |\n| **Optional**        | Low-impact issues. Fixing them is recommended but optional. |\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-issue-list-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-issue-list-intellij-idea.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization assessment report issue list.\":::\n\nFor more information, expand each reported issue by selecting the title. The report provides the following information:\n\n- A list of files where the incidents occurred, along with the number of code lines impacted. If the file is a Java source file, selecting the file line number directs you to the corresponding source report.\n- A detailed description of the issue. This description outlines the problem, provides any known solutions, and references supporting documentation regarding either the issue or resolution.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-issue-detail-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-issue-detail-intellij-idea.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization assessment report issue detail.\":::\n\n#### Dependencies\n\nAccess this part by selecting the **Dependencies** tab. This tab displays all Java-packaged dependencies found within the application.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-dependency-list-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-dependency-list-intellij-idea.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization assessment report dependency list.\":::\n\n#### Technologies\n\nAccess this part by selecting the **Technologies** tab. This tab lists the occurrences of technologies, grouped by function, in the analyzed application. This report provides an overview of the technologies found in the application, and is designed to assist you in quickly understanding each application's purpose.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-technology-list-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-technology-list-intellij-idea.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization assessment report technology list.\":::\n\n#### Insights\n\nAccess this part by selecting the **Insights** tab. Displays file details and information to help you understand the detected technologies.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-insight-list-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-insight-list-intellij-idea.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization assessment report insight list.\":::\n\n## Delete assessment report\n\nIf you don't want the report anymore, you can delete it.\n\nTo remove an assessment report, right-click **Assessment Report** and then select **Delete**.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/delete-assessment-report-intellij-idea.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/delete-assessment-report-intellij-idea.png\" alt-text=\"Screenshot that shows the GitHub Copilot modernization delete an assessment report.\":::\n"
  },
  {
    "path": "articles/java/migration/includes/working-with-assessment-visual-studio-code.md",
    "content": "---\nms.date: 03/20/2026\nms.collection: ce-skilling-ai-copilot\n---\n\nKey capabilities include:\n\n- **Multiple reports per run**: Each assessment run generates an independent report. You can access previous reports from the report list, so you can track assessment history and compare results over time.\n- **Two assessment entries for different purposes**: GitHub Copilot modernization provides two ways to start an assessment:\n  - **Recommended assessment**: Quickly start an assessment by selecting from recommended domains without manual configuration.\n  - **Custom assessment**: Configure specific assessment properties to tailor the analysis to your exact needs.\n\n## Recommended assessment\n\nRecommended assessment provides a streamlined way to start an assessment without manual configuration. This approach is ideal when you want to quickly evaluate your application's readiness for common migration scenarios.\n\nTo run a recommended assessment, use the following steps:\n\n1. Select **Start Assessment** or **Open Assessment Dashboard** in the **QUICKSTART** section of the GitHub Copilot modernization pane.\n1. Select **Recommended Assessment**.\n1. Select the domains you want to assess from the list of recommended options. Each domain represents a common migration scenario with preconfigured settings.\n1. Select **OK** to start the assessment.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/recommended-assessment.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/recommended-assessment.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization Recommended Assessment interface with domain selection options.\":::\n\nAfter the assessment completes, the process generates a new report and adds it to the report list. You can view the report by selecting it from the list.\n\n## Custom assessment\n\nCustom assessment enables you to tailor the assessment analysis to your specific migration needs. Use this approach when you need fine-grained control over the assessment configuration.\n\nTo configure and run a custom assessment, use the following steps:\n\n1. Select **Start Assessment** or **Open Assessment Dashboard** in the **QUICKSTART** section of the GitHub Copilot modernization pane.\n1. Select **Custom Assessment**.\n1. Configure the assessment properties as described in the following section.\n1. Select **Run** to start the assessment.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/custom-assessment.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/custom-assessment.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization Assessment pane with the Custom Assessment button highlighted.\":::\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/custom-assessment-properties.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/custom-assessment-properties.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization Assessment pane with the Custom Assessment properties.\":::\n\n### Configuration properties\n\nThe custom assessment configuration form consists of general settings and domain-specific settings. The form displays the domain-specific settings based on the assessment domains you select.\n\n#### General: Assessment Domains\n\nSelect one or more domains to include in the assessment. Assessment time depends on domain selection and app size.\n\n| Domain               | Description                                                                           |\n|----------------------|---------------------------------------------------------------------------------------|\n| **Java Upgrade**     | Identify outdated app stacks and get upgrade recommendations.                         |\n| **Cloud Readiness**  | Assess your app's readiness for Azure, with actionable migration guidance.            |\n| **Security**         | Scan your code for security issues using ISO 5055 guidelines, with recommended fixes. |\n\n#### General: Analysis Coverage\n\nSelect what the assessment should analyze.\n\n| Value                                  | Description                                                                             |\n|----------------------------------------|-----------------------------------------------------------------------------------------|\n| **Issue only**                         | Analyze source code to detect issues.                                                   |\n| **Issues & Technologies**              | Analyze source code to detect issues and identify used technologies.                    |\n| **Issues, Technologies & Dependencies**| Analyze source code to detect issues, identify used technologies, and map dependencies. |\n\n#### Java Upgrade: Target Runtime\n\nThe form displays this setting when you select the **Java Upgrade** domain. Select a target JDK to analyze dependencies and outdated app stack.\n\n| Value              | Description                                               |\n|--------------------|-----------------------------------------------------------|\n| **OpenJDK 21**     | Best practices for migrating to OpenJDK 21. (Recommended) |\n| **OpenJDK 17**     | Best practices for migrating to OpenJDK 17.               |\n| **OpenJDK 11**     | Best practices for migrating to OpenJDK 11.               |\n\n#### Cloud Readiness: Target Compute Services\n\nThe form displays this setting when you select the **Cloud Readiness** domain. Select target Azure compute services to migrate your application. Choose multiple targets if you haven't decided which one to use. You can then compare the targets on the assessment report.\n\n| Value                              | Description                                                      |\n|------------------------------------|------------------------------------------------------------------|\n| **Azure App Service**              | Best practices for deploying an app to Azure App Service.        |\n| **Azure Kubernetes Service (AKS)** | Best practices for deploying an app to Azure Kubernetes Service. |\n| **Azure Container Apps (ACA)**     | Best practices for deploying an app to Azure Container Apps.     |\n\n#### Cloud Readiness: Target Operating System\n\nThe form displays this setting when you select the **Cloud Readiness** domain. Select target operating systems to run the apps on.\n\n| Value       | Description                                                        |\n|-------------|--------------------------------------------------------------------|\n| **Linux**   | Best practices for migrating applications to the Linux platform.   |\n| **Windows** | Best practices for migrating applications to the Windows platform. |\n\n#### Cloud Readiness: Containerization\n\nThe form displays this setting when you select the **Cloud Readiness** domain. Enable to analyze problems that need to be fixed to containerize your app.\n\n| Value                        | Description                                     |\n|------------------------------|-------------------------------------------------|\n| **Enable Containerization**  | Best practices for containerizing applications. |\n\n### Examples\n\nThe following examples describe some common configuration scenarios:\n\n- Example one: You want to migrate your apps to AKS as Linux containers and want to understand what issues need to be fixed. Use the following configuration:\n\n  - **Assessment Domains**: Select **Cloud Readiness**\n  - **Analysis Coverage**: Select **Issue only**\n  - **Target Compute Services**: Select **Azure Kubernetes Service (AKS)**\n  - **Target Operating System**: Select **Linux**\n  - **Containerization**: Select **Enable Containerization**\n\n- Example two: You want to migrate your apps to App Service Linux and want to understand what issues need to be fixed. Use the following configuration:\n\n  - **Assessment Domains**: Select **Cloud Readiness**\n  - **Analysis Coverage**: Select **Issue only**\n  - **Target Compute Services**: Select **Azure App Service**\n  - **Target Operating System**: Select **Linux**\n\n- Example three: You want to modernize your apps to JDK 21 and want to understand what issues need to be fixed. Use the following configuration:\n\n  - **Assessment Domains**: Select **Java Upgrade**\n  - **Analysis Coverage**: Select **Issue only**\n  - **Target Runtime**: Select **OpenJDK 21**\n\nAfter the tool completes the assessment, it generates a new report and adds it to the report list. The interactive dashboard opens automatically, providing comprehensive analysis results. After you configure multiple Azure service targets, you can easily switch between them to compare migration approaches and view service-specific recommendations.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/list-azure-service-target-for-assessment-report-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/list-azure-service-target-for-assessment-report-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization assessment dashboard with Azure service target selection options.\":::\n\n## Interpret the assessment report\n\nThe assessment report provides comprehensive analysis results to help you understand your application's readiness for Azure migration and modernization. This section guides you through the report structure and helps you interpret the findings so you can make informed migration decisions.\n\n### Report structure overview\n\nThe assessment report consists of several key sections:\n\n- **Application Information**: Basic information about your application including Java version, frameworks, build tools, and project structure.\n- **Issue Summary**: Overview of migration issues categorized by domain with criticality percentages.\n- **Detailed Analysis**: The detailed report is organized into the following four subsections.\n  - **Issues**: Provides a concise summary of all issues that require attention.\n  - **Dependencies**: Displays all Java-packaged dependencies found within the application.\n  - **Technologies**: Displays all embedded libraries grouped by functionality, so you can quickly view the technologies used in the application.\n  - **Insights**: Displays file details and information to help you understand the detected technologies.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-dashboard-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-dashboard-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization assessment report dashboard.\":::\n\n#### Issues\n\nAccess this part by selecting the **Issues** tab. This tab provides a categorized list of issues for various aspects of Cloud Readiness, Java Upgrade, and Security that you need to address to successfully migrate the application to Azure. The following tables describe the **Domain** and **Criticality** values:\n\n| Domain               | Description                                                                           |\n|----------------------|---------------------------------------------------------------------------------------|\n| **Java Upgrade**     | Identify outdated app stacks and get upgrade recommendations.                         |\n| **Cloud Readiness**  | Assess your app's readiness for Azure, with actionable migration guidance.            |\n| **Security**         | Scan your code for security issues using ISO 5055 guidelines, with recommended fixes. |\n\n| Criticality         | Description                                                 |\n|---------------------|-------------------------------------------------------------|\n| **Mandatory**       | Issues that you must fix for migration to Azure.            |\n| **Potential**       | Issues that might impact migration and need review.         |\n| **Optional**        | Low-impact issues. Fixing them is recommended but optional. |\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-issue-list-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-issue-list-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization assessment report issue list.\":::\n\nFor more information, expand each reported issue by selecting the title. The report provides the following information:\n\n- A list of files where the incidents occurred, along with the number of code lines impacted. If the file is a Java source file, selecting the file line number directs you to the corresponding source report.\n- A detailed description of the issue. This description outlines the problem, provides any known solutions, and references supporting documentation regarding either the issue or resolution.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-issue-detail-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-issue-detail-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization assessment report issue detail.\":::\n\n#### Dependencies\n\nAccess this part by selecting the **Dependencies** tab. This tab displays all Java-packaged dependencies found within the application.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-dependency-list-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-dependency-list-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization assessment report dependency list.\":::\n\n#### Technologies\n\nAccess this part by selecting the **Technologies** tab. This tab lists the occurrences of technologies, grouped by function, in the analyzed application. This report provides an overview of the technologies found in the application, and is designed to assist you in quickly understanding each application's purpose.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-technology-list-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-technology-list-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization assessment report technology list.\":::\n\n#### Insights\n\nAccess this part by selecting the **Insights** tab. It displays file details and information to help you understand the detected technologies.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-insight-list-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/assessment-report-insight-list-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization assessment report insight list.\":::\n\n## Operate assessment reports\n\nEffective report management enables collaboration, maintains assessment history, and integrates with existing workflows. Each assessment run generates an independent report in the report list, and you can import, export, or delete individual reports as needed.\n\n### Import assessment report\n\nBesides running the assessment directly in GitHub Copilot modernization, you can also import assessment reports. The reports can come from [AppCAT](https://aka.ms/appcat-java) CLI results - such as `report.json`, a GitHub Copilot modernization exported report, or an app context file from Dr. Migrate.\n\nTo import an assessment report to GitHub Copilot modernization, select **Import** in the assessment reports page, or press <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> and then search for **import assessment report**.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/import-assessment-report-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/import-assessment-report-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization assessment report import interface.\":::\n\n### Export assessment report\n\nIn the assessment dashboard, you can view the issues detected by assessment and choose the migration solution to determine the decision. You can export the report and share it with others. If you export the report, other people don't need to run assessment by themselves and can import the report and view the assessment and migration decision directly.\n\nTo export an assessment report from GitHub Copilot modernization, select the **...** (more actions) button on the target report in the report list and then select **Export**.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/export-assessment-report-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/export-assessment-report-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization assessment report export options and interface.\":::\n\n### Delete assessment report\n\nIf you no longer need a report, you can delete it from the report list.\n\nTo remove an assessment report, select the **...** (more actions) button on the target report in the report list and then select **Delete**.\n\n:::image type=\"content\" source=\"../media/migrate-github-copilot-app-modernization-for-java/delete-assessment-report-visual-studio-code.png\" lightbox=\"../media/migrate-github-copilot-app-modernization-for-java/delete-assessment-report-visual-studio-code.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization delete an assessment report.\":::\n"
  },
  {
    "path": "articles/java/migration/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Java to Azure migration strategy documentation\nsummary: Recommended strategies for migrating Java applications to Azure.\n\nmetadata:\n  title: Java to Azure Migration Guidance Documentation\n  description: Discover recommended migration strategies for java migration. Move Java, Tomcat, WebSphere, JBoss EAP, and WebLogic Server applications to Azure with ease.\n  keywords: migration strategies, migration strategy, java migration\n  author: KarlErickson\n  ms.author: karler\n  ms.date: 01/13/2026\n  ms.topic: landing-page\n  ms.custom: seo-azure-migrate, devx-track-java, devx-track-extended-java\n\nlandingContent:\n  - title: Migrate Java applications to Azure\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Migration overview\n            url: migration-overview.md\n          - text: Azure Migrate application and code assessment\n            url: /azure/migrate/appcat/java?toc=/azure/developer/java/migration/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n  - title: GitHub Copilot modernization for Java\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Overview\n            url: migrate-github-copilot-app-modernization-for-java.md\n          - text: FAQ\n            url: migrate-github-copilot-app-modernization-for-java-faq.yml\n      - linkListType: reference\n        links:\n          - text: Predefined tasks\n            url: migrate-github-copilot-app-modernization-for-java-predefined-tasks.md\n          - text: Working with assessment\n            url: migrate-github-copilot-app-modernization-for-java-working-with-assessment.md\n          - text: Understand assessment rules\n            url: migrate-github-copilot-app-modernization-for-java-assess-rules.md\n      - linkListType: quickstart\n        links:\n          - text: Optimize chat results with the AppModernization agent\n            url: migrate-github-copilot-app-modernization-for-java-quickstart-chat-window.md\n          - text: Assess and migrate a Java project\n            url: migrate-github-copilot-app-modernization-for-java-quickstart-assess-migrate.md\n          - text: Create and apply your own skill\n            url: migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md\n          - text: Prepare infrastructure\n            url: migrate-github-copilot-app-modernization-for-java-quickstart-infrastructure.md\n          - text: Containerize your project\n            url: migrate-github-copilot-app-modernization-for-java-quickstart-containerization.md\n          - text: Deploy your project\n            url: migrate-github-copilot-app-modernization-for-java-quickstart-deploy-to-azure.md\n      - linkListType: sample\n        links:\n          - text: Migration sample\n            url: migrate-github-copilot-app-modernization-for-java-sample.md\n  - title: Migrate Spring to Azure\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Spring Boot to Azure Container Apps\n            url: migrate-spring-boot-to-azure-container-apps.md\n          - text: Spring Cloud to Azure Container Apps\n            url: migrate-spring-cloud-to-azure-container-apps.md\n          - text: Spring Boot to Azure App Service\n            url: migrate-spring-boot-to-app-service.md\n  - title: Migrate Tomcat to Azure\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Tomcat to Azure App Service\n            url: migrate-tomcat-to-tomcat-app-service.md\n          - text: Tomcat to Azure Container Apps\n            url: migrate-tomcat-to-azure-container-apps.md\n          - text: Tomcat to containers on AKS\n            url: migrate-tomcat-to-containers-on-azure-kubernetes-service.md\n          - text: \"Tutorial: Containerized Tomcat to AKS\"\n            url: /azure/migrate/tutorial-app-containerization-java-kubernetes?toc=/azure/developer/java/migration/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n  - title: Migrate WebLogic Server to Azure VMs\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: WebLogic Server to Azure Virtual Machines\n            url: migrate-weblogic-to-virtual-machines.md\n          - text: \"Tutorial: WebLogic Server with App Gateway\"\n            url: migrate-weblogic-with-app-gateway.md\n          - text: \"Tutorial: WebLogic to Azure VMs manual guidance\"\n            url: migrate-weblogic-to-azure-vm-manually.md\n          - text: \"Tutorial: WebLogic to Azure VMs with high availability and disaster recovery\"\n            url: migrate-weblogic-to-vms-with-ha-dr.md\n          - text: \"Tutorial: WebLogic to Azure VMs with Elastic\"\n            url: migrate-weblogic-with-elk.md\n          - text: \"Tutorial: WebLogic to Azure VMs with Entra ID\"\n            url: migrate-weblogic-with-entra-id-via-ldap.md\n  - title: Migrate WebLogic Server to AKS and App Service\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: WebLogic Server to AKS\n            url: migrate-weblogic-to-azure-kubernetes-service.md\n          - text: \"Tutorial: WebLogic to AKS within a custom virtual network\"\n            url: migrate-weblogic-to-aks-within-an-existing-vnet.md\n          - text: \"Tutorial: WebLogic to AKS with geo-redundancy\"\n            url: migrate-weblogic-to-aks-with-ha-geo-redundancy.md\n          - text: \"Tutorial: WebLogic to AKS with KEDA scaler based on Prometheus Metrics\"\n            url: migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics.md\n          - text: WebLogic Server to JBoss EAP on App Service\n            url: migrate-weblogic-to-jboss-eap-on-azure-app-service.md\n  - title: Migrate WebSphere to Azure\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: WebSphere Application Server to AKS\n            url: migrate-websphere-to-azure-kubernetes-service.md\n          - text: \"Tutorial: WebSphere Liberty/Open Liberty to AKS with high availability and disaster recovery\"\n            url: migrate-liberty-to-aks-with-ha-dr.md\n          - text: WebSphere Application Server to Azure Red Hat OpenShift\n            url: migrate-websphere-to-azure-redhat-openshift.md\n          - text: WebSphere Application Server to Azure Virtual Machines\n            url: migrate-websphere-to-virtual-machines.md\n          - text: WebSphere to JBoss EAP on App Service\n            url: migrate-websphere-to-jboss-eap-on-azure-app-service.md\n          - text: \"Tutorial: WebSphere to Azure VMs manual guidance\"\n            url: migrate-websphere-to-azure-vm-manually.md\n          - text: \"Tutorial: WebSphere to Azure VMs with high availability and disaster recovery\"\n            url: migrate-websphere-to-vms-with-ha-dr.md\n  - title: Migrate JBoss EAP to Azure\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: JBoss EAP to Azure App Service\n            url: migrate-jboss-eap-to-jboss-eap-on-azure-app-service.md\n          - text: JBoss EAP to Azure VMs\n            url: migrate-jboss-eap-to-jboss-eap-on-azure-vms.md\n          - text: JBoss EAP to Azure Red Hat OpenShift\n            url: migrate-jboss-eap-to-azure-redhat-openshift.md\n          - text: \"Tutorial: JBoss EAP to Azure VMs with high availability and disaster recovery\"\n            url: migrate-jboss-eap-to-vms-with-ha-dr.md\n\n"
  },
  {
    "path": "articles/java/migration/media/migrate-weblogic-with-app-gateway/weblogic-app-gateway-key-vault.ai",
    "content": "%PDF-1.6\r%\r\n1 0 obj\r<</Metadata 2 0 R/OCProperties<</D<</ON[23 0 R 24 0 R 25 0 R]/Order 26 0 R/RBGroups[]>>/OCGs[23 0 R 24 0 R 25 0 R]>>/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 82535/Subtype/XML/Type/Metadata>>stream\r\n<?xpacket begin=\"﻿\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 6.0-c004 79.164570, 2020/11/18-15:51:46        \">\n   <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n      <rdf:Description rdf:about=\"\"\n            xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n            xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n            xmlns:xmpGImg=\"http://ns.adobe.com/xap/1.0/g/img/\"\n            xmlns:xmpMM=\"http://ns.adobe.com/xap/1.0/mm/\"\n            xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\"\n            xmlns:stEvt=\"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#\"\n            xmlns:illustrator=\"http://ns.adobe.com/illustrator/1.0/\"\n            xmlns:xmpTPg=\"http://ns.adobe.com/xap/1.0/t/pg/\"\n            xmlns:stDim=\"http://ns.adobe.com/xap/1.0/sType/Dimensions#\"\n            xmlns:stFnt=\"http://ns.adobe.com/xap/1.0/sType/Font#\"\n            xmlns:xmpG=\"http://ns.adobe.com/xap/1.0/g/\"\n            xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\"\n            xmlns:pdfx=\"http://ns.adobe.com/pdfx/1.3/\">\n         <dc:format>application/pdf</dc:format>\n         <dc:title>\n            <rdf:Alt>\n               <rdf:li xml:lang=\"x-default\">weblogic-app-gateway-key-vault</rdf:li>\n            </rdf:Alt>\n         </dc:title>\n         <xmp:CreatorTool>Adobe Illustrator 25.2 (Windows)</xmp:CreatorTool>\n         <xmp:CreateDate>2021-04-27T15:28:46-07:00</xmp:CreateDate>\n         <xmp:ModifyDate>2021-04-27T15:28:47-07:00</xmp:ModifyDate>\n         <xmp:MetadataDate>2021-04-27T15:28:47-07:00</xmp:MetadataDate>\n         <xmp:Thumbnails>\n            <rdf:Alt>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpGImg:width>256</xmpGImg:width>\n                  <xmpGImg:height>180</xmpGImg:height>\n                  <xmpGImg:format>JPEG</xmpGImg:format>\n                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAtAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FVFLy1e8lsllU3UMcc0sIPxLHMzrGxHgzQuB8jirVle2t9apdWkglt5K8JBUA&#xA;8SVPWncYqr4qofXbX699R9QfW/S9f0t6+ny48vD7W2Kuvb60src3F1IIoQyIXatOUriNBt4uwGKo&#xA;dtd039Cx6zHL61hNFHPbyRgkypMAYuANCS/IcR75KEDI0GM5CIssU/5Wc0DRXGpaWdP0yUbTzTH6&#xA;wG7q1t6dQR/rdMzvyN7Rlcvs+duH+creQqP2/Jm8M0U8Mc0Lh4pVDxuu4ZWFQR8xmARRouaDYtfg&#xA;S7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWD+cfyyj8yazd6lJdp&#xA;EZtNFjbI8PqGGeMXRiulbkvxRvdhlpQgrsfBVJx+TdwIZ4/rtiVmkq0BsmMMg/f0nmT1vjuk+sjh&#xA;J24Lt4Kqrfk9LPccb/U473T4pp5ILee3MjsJ/r71mZpCruk2pclIUfYHfcKo7Rfyzu9PbWXfUkFx&#xA;qtncWf1+3gaK75Tu7rPLM0j+o8XPgmwoqjFUsm/J29n1bTr769YWMVisaG00+w+rxlUuDOyqfVZu&#xA;LtRmDE/FvirLbfQL3SvJ2k6XZyC5vNEt7WKJioVZjaxrG3wsSF5qDx32NN8sxEA78i15Aa25hgn1&#xA;vVNZvJrkWM0WvTsIJtIu7R3teAj4+o7kBRTsW/Vm14YwAF+gfxA7uu4jM3Xq7iNnqWjWH6P0mysK&#xA;g/VYI4agkj92oXau9Nts1OSfFInvLssceGIHcjMgzdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqCimlOtXUJYmJLa3dE7BnknDH6QgxVG4q7FXYq7&#xA;FXYq7FXYq7FXYq7FXYqoXN7BblRKSC24oK5OOMy5MZTA5qP6YsvFvuyXgyY+KHfpiy8W+7HwZL4o&#xA;d+mLLxb7sfBkvih36YsvFvux8GS+KHfpiy8W+7HwZL4od+mLLxb7sfBkvih36YsvFvux8GS+KHfp&#xA;iy8W+7HwZL4od+mLLxb7sfBkvih36YsvFvux8GS+KHfpiy8W+7HwZL4od+mLLxb7sfBkvih36Ysv&#xA;Fvux8GS+KHfpiy8W+7HwZL4od+mLLxb7sfBkvih36YsvFvux8GS+KHfpiy8W+7HwZL4od+mLLxb7&#xA;sfBkvih36YsvFvux8GS+KGN6dY3Nt511PXJtXuJ9Mu4IorTTG+zE6li5O32RWqb/ALTeAw+DJfFD&#xA;JP0xZeLfdg8GS+KHfpiy8W+7HwZL4od+mLLxb7sfBkvih36YsvFvux8GS+KHfpiy8W+7HwZL4od+&#xA;mLLxb7sfBkvih36YsvFvux8GS+KHfpiy8W+7HwZL4od+mLLxb7sfBkvih36YsvFvux8GS+KFa2vY&#xA;LgsIiSV3NRTIyxmPNlGYPJL9c/vIvkf15fp+Rac3R4t+a/5l6rZa/p/kbyvy/TmooZ9RvYk9WSys&#xA;kBd3ijoQ0xjR2UH22qwyc570GMI7WUL/AM48/mw/nHSbzSdTemtaY7SIrNyaSzkc+man4mMJPpsT&#xA;/kk7nBinackKRyfm9cwXevS3FvE9jb/vNFEhktRPHHP9VkCzNG6SFnKMpXYctyKY+LzXw+SZP+bE&#xA;YcW0OnpPfcuDW8d0jAM1xaW8Z5hD8En13krUoQvvsfERwJx5M87r5ln1KEWZtG06QRtWQOSSzoQy&#xA;8UZGBjOxHQj3AlCdsZRpk+TYuxV2KuxV2KuxV2KuxV2KqlvbzXErRxcfhXkSxI6mnYHIykIiymIJ&#xA;OyI/RF74xf8ABN/zTkPGj5s/Ck79EXvjF/wTf804+NHzXwpO/RF74xf8E3/NOPjR818KTv0Re+MX&#xA;/BN/zTj40fNfCk79EXvjF/wTf804+NHzXwpO/RF74xf8E3/NOPjR818KTv0Re+MX/BN/zTj40fNf&#xA;Ck79EXvjF/wTf804+NHzXwpO/RF74xf8E3/NOPjR818KSFkjkileKSnJCB8JJBqoPcDxywEEWGBF&#xA;GitwodirsVdirsVTTQ/7yX5D9eY+o5Buw9Wtd/vIvkf146fkVzPLbD8qoNE82ap5v0e8e78w6uHW&#xA;e41YiaOJXZW4wxwLbkCihd22UADvlghRsc2HHYpiul/kX5m078yV882mt2FlcPN6l3p9nZyxW8qS&#xA;DjMlHnkI9QVYns3xAZEYjxWyOQVT2cxxMACgIHQEDLmp3COteIr408P9rFWwqgkgAE7kjvireKoa&#xA;/wBQt7G3M0xNK0VR1Y+AyzHiMzQcXV6uGCHFP+1CWOv29zcC3eJ4JXFYw42bvlmTTGIu7Dh6XtaG&#xA;WfAYmEjyvqmmY7tlC9vrWytnubqQRwp1bckkmgAAqSSdgBucMYkmgxlIAWUsOv6hViukTqikCkrx&#xA;Rv8AF0qpaiE+Dsp8aZqs/bejxZfClPcUCQCYxJ6GTlY9FnnDiEdugsWfcEfY6lBeeoiq8NzAQtxa&#xA;zLwljJ3HJd9j2IJB7HNsY1vzB6uLGV7dUXkWTsVR2jf71S/6g/Wcqz/SGzDzKcZiuQgNe1eHR9Fv&#xA;dUmBaOzheb0x9pyoqqL/AJTtRR74pea6Z+cupwINO1fTom1q04DUYWlaznYzylYjBaSRu7ARFJJC&#xA;WHFeR3pQi1T2D8xZ9Q8sTanDHb2fC7gtJb5JheWkMdwkchmMvGBSYxMFcGiq/ViMVY/F+dVz9Wkt&#xA;bWCG8vooJ5frV1IsA529yYnEsdv9Zi4KgJEsUzhqVoAdm1Vx+eqJG8s+hSrEJZYgYpxKw9Eq7iRB&#xA;GGRkgWeVlPT06Anls2q6D88lkkkVtEY8I4W4RXDPKs1zExhhkQwpxZ5+EIILCrV6A42r1GMuUUuo&#xA;VyByUGoB7gGgr92FV2KEg1D/AHvn+a/8QXMzH9IcWf1FQybF2KuxV2KuxVM9C/vJfkP15j6jkG7C&#xA;7Xf7yL5H9eOn5Fc3RK8yGl2KuxV2KuxV2KpJrQWfULOOoZbZvUnjPUg0Ip49MzNPtGXm892tkic2&#xA;MHcQNn7FuqMLi6sriNeItpA0hagJWoNBQnwyWGJjGQ7w0a7WQyZMcwCOCVn3bJ3G6yRq6/ZcBl+R&#xA;3zCIo09LjmJxEhyItC2dvHe+cbSGfeOytJryBD09cukSyf7BWanuchnJGE1sZGmeIA5RfQWhLzSt&#xA;Sivjal/jcjigAPKuwIJ61zwvU6LNhz+BOJOQnbf6r5F7bFqMcocSP1zTjp8ugXBNbsyPYzlf24ni&#xA;kmAPiI3jFPDfxz2PsHBPDpRimbMY/bf6jXweS7RkJZRMdTX2Onup434paSzL/OhiA/4eRD+GbK3G&#xA;U/r11/1b7j/grf8A6q42mm/y68wTa9ZNfy6fPp7Mij0pxs29eUZ2LJ4EqMoySuIbccakWZZQ3NMq&#xA;sKMAR4HFUFPomlT3U93Lbq1xcwfVJpakEwjl8Ox2/vG3G+KURbWdrbWkdpBGqW0SCNIuoCgUpv1+&#xA;nFUNBe6LNey2EMkL3cCBJYQByVOnHp0FenbKo5oGRiD6gwEwTXVGejDSnprQkkig6kUJ+7bLWaFv&#xA;NH028kge5gDtbTJcxCrKPVjFI2dVID8Oq8q0IBG4BxVG4odiqQah/vfP81/4guZmP6Q4s/qKHybF&#xA;2KuxV2KuxVNNC/vJfkP15j6jkG7D1dr395D8j+vHT8iufolWZDQ7FXYq7FXYq7FWG+a5ryHUy8Nv&#xA;NLVFKGJGYVA8QDmdpyOHm852pikctgE7IGx1nU5nEd9ZTp2WQRPx/wBkKfjmTcRyIdLPTZpfwy+R&#xA;Z1ZhltIFYEMI1BB2IPEZq8n1H3vbaUEYoA8+Efco3kd7DeWuq6cFa9s+amBzxWaGSnqRFqHiSVVl&#xA;PYjwwCiDGXI/Y2mwRIcwhtS8yQ3Wt2V39Uu4REiCaCS3kZwVcsQPTWRH27qSM4ztbsDUZtdiyQAM&#xA;I8NmxXpkTvfv7neaTtHDHTyErEu6j1CMmubzV9Riv7mFrW1tQwsbRyPU5SCjTS8SQG4/Cq12FfHO&#xA;xhAQjQ3J5/qdJKZnKzsByROKXYqj9F/3ql/1B+s5Vn+kNuHmU5zFch2KuxVifmvzJfi7/wAP6Ehk&#xA;1iZCzvUL6aceXwlqDmV+755rtXqZX4eP6y4+XIb4Y/UwuHy/qi6rGdJEkOpW4YB2kBE08ArO0crD&#xA;03RmbiFDBga8hx2Gdnx4vArHw+J/DVXY5+d997FxBilxenm9C8reZ01dJ7adRFqlkxjvIV3Wqkrz&#xA;Q/ykj6Mx9LqfEBB+oc3OxZeLY8wn2Zba7FXYqx/Uf975/mv/ABBczMf0hxcn1FD5Ng7FXYq7FXYq&#xA;mug/3k3yH68x9RyDfg6ta/8A3kPyP68dPyK5+YSquZLQ6uKurirq4q6uKuriqTeZdavNKjtZYokN&#xA;vJKEu7qXmY4I6bMwjDNQtQcvsr1bbIyNJiLQGi+bL681aPTry2jt55DdGSAFxJCIPSMYbkAr8xLX&#xA;mnwntkRLdJjsyiuWMWNedfOlv5ZjsGkRZDdz8ZAzceFvGOU0o8SoKgDuTkJzplGNrI/zB003UtvL&#xA;ZXcDRSSRCRhAyOYp7e3co0cslQHvE/4YdRTBxheBrQPzD0nWtQt7G3tLuCW5gW5jeZI+ASRBLGGM&#xA;cklC8RDjalNj8W2MZgqYUymuWMXVxVH6J/vVL/qL+s5Tn+kNuHmU6zFch2KuxVjvmryvJqIF/pkx&#xA;stbt1IgukPEupFDG5HY9j2zE1Om4/VHaY6tWXFe42kwr61f3dnpujaXNeR+abeac3of4PS9Vg0ry&#xA;yDqp/ZI6/dXX+qQEI34gJv8AS4+5AAviegeXPLlroloyIxmvJzzvLt/tyyHck+Aqdhmz0+nGMeZ5&#xA;lyseMRHmm+ZDN2KuxVj2pf8AHQn+a/8AEFzNx/SHEyfUUPXJsXVxV1cVdXFXVxVNdA/vJvkP15ja&#xA;jkG/BzLWv/3kPyP68dPyKM/MJVXMhodXFXVxV1cVdXFXVxVCX+laZqHo/XrWK5+ruJIPVRX4OO61&#xA;G2JAKQSEInlXyyjRsmmWyNDKbiIrEq8ZTSrig6/CPuwcATxFEa3q0GkaReanOpaGziaaRVpUhRU9&#xA;cSaFoAspDH5y8nXdxF9eCQX11CI4o542Zza3UirGrsqsi+rVHMZaoX4mAANI8YZcJS66l/L7TYbe&#xA;a20S3lt3he/0p44VVZZ4pUjWOIMo4uzyJw7Hr2wHhHRPqPVGW3mP8vola/sI4Rd2EQtIwLZ4ZUVe&#xA;KRwDnGrKPiUL/kmvTHiitSTzy/5is9ctpZraOWP0JPSlEsbIOfEMeDMAHX4uoycZWxIpNa4WKO0a&#xA;WNLmUuwQFBQsQO58crzAkCm3EQCmy3tm1eM8ZoaGjqaEduuY3Ae5yOId7f1q1/38n/BD+uPAe5eM&#xA;d7vrVr/v5P8Agh/XHgPcvGO931q1/wB/J/wQ/rjwHuXjHesEtgJGlDxCRgAzgryIHSpweGe5HFFf&#xA;9atf9/J/wQ/rh4D3J4x3u+tWv+/k/wCCH9ceA9y8Y73fWrX/AH8n/BD+uPAe5eMd7TXtmtOU8Yqa&#xA;CrqKk9uuPAe5eId6R6g6NfTMpDKStCDUfYXMvGPSHFmfUUPXJMHVxV1cVdXFXVxVNdA/vJvkP15j&#xA;6jkG/BzLvMH95D/qn9eOn5Fc/MJTmS0OxV2KuxV2KuxV2KuxVD6hYWuoWU1ldp6ltcIY5UqRVT13&#xA;FDgItQaY3fflt5elt7xLOM2k17E8DSVkkRI5SQ3CIuqBlRisZ6JttQAZA4wzGQpxc+WdEuYNNgnt&#xA;leLSXSSwSpAjaJCidCKgDt4gHtkuEMeIpTb/AJZeT7ZFSG2lRFf1CouJ6MwCBeY5/EFEK8QemDww&#xA;y8Qp5pej2GmLKlmrIkzB3Qu7qGChKqGJ41C70yQFMSbR2FDsVQOl/wDH3/zEyfwwBJR2FDsVdirs&#xA;VdirsVdiqB1T/j0/5iY/44CkI7Ch2KuxV2KuxV2Kpt5f/vJv9UfrzG1HIN+DmWvMP97D/qn9eOn5&#xA;Fc/MPMPOV7qqfplEnv7e5is3bQY7GKV45pPQZqu8ccg5+qKcWYUFD3rlkyd2Ea2WL5y81y3UMCaf&#xA;6S/WYba5drO6c1d5Vk4AtGhVAiEvzoBU/F0DxleEJdonnH8x7oQWk+nxpO0dskl3NZXKhZJHhSWR&#xA;1DojBPUdSoZd0LfZNFEZySYxemCtBXc98uaXYq7FXYq7FXYq7FXYq7FXYq7FXYqgtM/4+/8AmJk/&#xA;hgDIo3CxdirsVdirsVdirsVQWp/8en/MTH/HAWQRuFi7FXYq7FXYq7FU38vf3s3+qP15jajkHIwc&#xA;y15i/vYf9U/rGHTciuo5h2kabZ3Ns0kyFnDlQQ7rsAOykZDLkkJUCyxQBjujf0Fpn++m/wCRkn/N&#xA;WV+LLvZ+FHud+gtM/wB9N/yMk/5qx8WXevhR7nfoLTP99N/yMk/5qx8WXevhR7nfoLTP99N/yMk/&#xA;5qx8WXevhR7nfoLTP99N/wAjJP8AmrHxZd6+FHud+gtM/wB9N/yMk/5qx8WXevhR7nfoLTP99N/y&#xA;Mk/5qx8WXevhR7nfoLTP99N/yMk/5qx8WXevhR7nfoLTP99N/wAjJP8AmrHxZd6+FHud+gtM/wB9&#xA;N/yMk/5qx8WXevhR7nfoLTP99N/yMk/5qx8WXevhR7nfoLTP99N/yMk/5qx8WXevhR7nfoLTP99N&#xA;/wAjJP8AmrHxZd6+FHud+gtM/wB9N/yMk/5qx8WXevhR7mL+RrrStd/THHSr2x+pX8tvJ9cPCsg+&#xA;0qenLJXhtU9N9icfEl3p8OPcyj9BaZ/vpv8AkZJ/zVj4su9HhR7nfoLTP99N/wAjJP8AmrHxZd6+&#xA;FHud+gtM/wB9N/yMk/5qx8WXevhR7nfoLTP99N/yMk/5qx8WXevhR7nfoLTP99N/yMk/5qx8WXev&#xA;hR7nfoLTP99N/wAjJP8AmrHxZd6+FHud+gtM/wB9N/yMk/5qx8WXevhR7mL+d7rStEl0WM6Ve3xv&#xA;76OCNrQ8wsh+yr+pNHx5bkHpsakY+LLvT4ce5lH6C0z/AH03/IyT/mrHxZd6PCj3O/QWmf76b/kZ&#xA;J/zVj4su9fCj3O/QWmf76b/kZJ/zVj4su9fCj3O/QWmf76b/AJGSf81Y+LLvXwo9zv0Fpn++m/5G&#xA;Sf8ANWPiy718KPcgtX02ztrZZIUKuXCkl3bYg9mJyzFkkZUSwywAjs7y7/ezf6o/WcnqeQY6fmXe&#xA;Y/72H/VP68dNyKNRzCJ8v/7xP/xkP/ERlWf6m3D9LUxPrPv+0f15S2pdretWWi6VcanfuyWtsoaQ&#xA;qCzEsQqqqjcszMAB44qgbjzz5Vt7yO0m1W2jkeD607NNGqxRHhwaUsw9MSeqvDl9rFVzedfLAKuN&#xA;VtXteMjSXq3EJgjMRjBWSTnRWPrpQf2VVTeGeOeFJoZBLDKoeORGDKysKhlI2II6HFV9T44q6p8c&#xA;VdU+OKprF/dp/qj9WKrsVdiqCvyeafLFUg1DzTo2n6j+j7y49G4+qTX/AMVQvoW5Akavita08MVU&#xA;LXz15SuLGK9/TFpBFJDDcFJ54onjS5j9WL1EZgULJuAcVRD+aPLEKXDvq9lEls6JdsbiJRHJLuiy&#xA;Et8LPT4a9cVWXnm/yzaWt1czataCKzCm5pcRVQyLyjU/Fs0g+wD17YqmVrdJdWsNzET6c6LIldjx&#xA;cBhX78VVanxxV1T44qjLMn0JPp/ViqX3NyltbS3EpIihRpJCNzxQVO3yGKpBF+YnlB2s+WpxQJe2&#xA;I1OGWd1ijFuZEiBd3KhWLycQp3qD4Yqjp/NXleNpRPrFijWrqs4e5hBidiVUPVvhJNQK4qufzT5b&#xA;jedH1ezR7WRYbpWuYgYpXPFY5AW+FmIoAd8Vbs/MekXur3ek2l0lxeWKK92sTq4jLMycH4k8XBTd&#xA;TviqZVPjirqnxxVfCT6yb/tD9eKt+YP94k/4yD/iJy7B9TVm+lDeXP72b/VH68t1PINWn5lrzJ/e&#xA;wf6rfrGOm5FdRzCK8vf7wv8A8ZD+oZVn+ptw/Stm/vpP9Y/ryltSjzB5csdegtra/aT6rBOty8Mb&#xA;FBI0asEVmWjgK7BxxINVGKscsfyo0m0e2C6hdva2UyT2lqwg4oY57eZV5CIOw/0KNN26V774qibT&#xA;8s9Ftbi0njnuC1msCxqTHQ/V5IZFLUTubda4qyLRtKg0nSrXTbdmeG0jWKNnpyIXxoAMVRDXNuhc&#xA;PKimPj6lWA48tlr4V7Yq5Li3f0+EqN6y+pFRgeaCnxLTqPiG48cVVMVTaL+6T/VH6sVXYq7FUFqH&#xA;20+WKsT8x+RtG8wX9te37S87XhwRCFUqjlmRtqlZFYo4rupxVJtN/KLRbG+tLr9IXs4soY7eCKVo&#xA;2UJFALcfsV6LWnSuKpdeflFLZ2rvoeoTTai3CKKS+ljVIYRFPC3GltPy+G5YcaDtQim6qOt/yg0i&#xA;35yQahdQ3Dsz+qghbgZUlScKJI32k+sORyrx7e6rNraCGysYoA9IbWJU5uQPhjWlWOw6DfFV4urY&#xA;yrEJk9VwGSPkORU1oQOtDxP3YqujkjkXlGwdaleSkEVUlWG3gRQ4qj7P+4k+n9WKpbeWyXVpPauS&#xA;qTxvExXqA6lTSvzxVgk/5L+XGV/q95eWryLKheJ0/u52hZ46FCOHOAsF6VduuKq2o/lHo15Yx2g1&#xA;C9twguFZ4mjBdbp+Tq1UIIHbFUvX8pHv7i7Gr3ZSzRgulLA0U0ixc7kv6pe2iX4xeN8JD0P7RxVl&#xA;nl/yha6Lf3F3DdTTCaP0YYJBGEhiE0k/FSiKzfHO27knFU6kuLePmJJUQxp6j8mA4oP2jXoNuuKu&#xA;W5t2CFZUIlJWOjA8mWpIXxI4nFVeH++j/wBYfrxVd5h/3hT/AIyD9Ry7B9TVm+lC+W/72f8A1V/W&#xA;ct1PINWn5lrzL/ewf6rfrGOm5FdRzCK8u/7wt/xkP6hlWf6m3B9LU399J/rH9eUtqRecfLx8w+Xr&#xA;nSVkjia4KFZJUMqAo4erR8kD/Z+y3wnuCMVYrZ/k/afpO4udVuY9StLi5e5ltpISA/OOdV51kdOU&#xA;f1gBG41AQe3FVBv+S9zLIs1zrbXNw9rLBdXEsRDu8iSR8lKSJRSkiK4Na+mvtxVemW1tbWtvFbWs&#xA;SQW0KiOGGJQiIiiiqqrQAAdAMVYp5p8m3ura9a3dtLHHYSxqmsQuWBmNo5msaACh4zOS1e2KpV5J&#xA;/L7zBomsabdaheR3FppdlJYWcKsxKRy+lKeqjkfV5p/qIneuKvRMVTaL+6T/AFR+rFV2KuxVBah9&#xA;tPliqExV5rN+T8st2s/6SjRFu7m6WFIHAX6wUPIN6vNpD6ZDu7HkrcfsrQqrNY/JS2vAkdpfLaWc&#xA;ccRXThDW2e6VFinnkRXSvqRxJt/MOVScVZj5S8rQeX7KeEOs9zczvNcXfDjJJyYlA7EuzcVNKk4q&#xA;nUsUcsTxSqHjkUq6HcFWFCDiry7/AJVn5shS3vLbUIf0zpsxXTLl2cqtpaxehZxSfCS3NGkMnu5x&#xA;Vm3kfy9P5d8uQ6RNL67QT3bpNUsWjmu5ZoyxIHxcJBy964qyqz/uJPp/ViqCxVjfnLyjL5hOnGK6&#xA;WzksZWkFx6fqyKHXiTFVgiPTo9Cy9VI7qsa078nhZ2Eii/iGpRxRjS7xICPqk8U5nEsatI9AzU5q&#xA;CAd/HFV2lfk3Z2GqpO94t3YJPFN9WniLtIsMbKqSsXKvwZqoSmwxV6PirFfOXlK81u80+W0mSGM8&#xA;rPWA9R6unSOkssa0BqzNCEFezNiqQeXvy68x6dr+k3dxexSaZpd3cXUFqGclfr1vcJcDdRX960bJ&#xA;4cn+lV6ZD/fR/wCsP14q35i/3hX/AIyD9Ry7B9TVn+lC+Wv72f8A1V/Wct1PINWn5lrzN/ewf6rf&#xA;rGOm5FGp5hF+XP8AeBv+Mh/UMqz/AFN2D6Wpv76T/WP68pbVmKvKPznutThYfo83Xr+ktPqiNI4+&#xA;MdAvfr9r4aV70zJ0wjZuvi05r2q/gm35Lz6hN5akbUDcm65/H9dQRzfaalVHanSuV564tq+DOF1u&#xA;9Bypm8Zt5LG9843FpeOFie5mBLOEqwdqLyP8x2zpKMcQI7g8/KQOQjzWapLp1n5nhtrIj0hLH8PM&#xA;PxbnQrUdKeB3wxBOMk9zGMxxfF7TnNPRJorFbcMFLkJUItKmg6CpA+84qg/0ne/9Wi7/AOCtP+q+&#xA;KpZ5a823usatqunz6Ld6emmymKO9m4GCalNlZT9sV3C8h/ldsVTbUPtp8sVQmKsf89tIvlu5MRZZ&#xA;NuBQcmrQ0oO+ShzFsZci8n/K+81+XzxIl+2ofVQz+iLmEpb/AG6D03k/eHb7Nd6dcytQI1tw/Bqw&#xA;mXW/i94zDb2NfmLMIfKly56B4v8Ak4MzNALyj4uJrTWMsG0W20K58uXV9cOv1mMkf3yoY/5Ph/yv&#xA;8rr2zb5DITAHJ0/EOG0z/Ke8E+oX6jtEhI/2WYvacaiPe53Z8rkXrFn/AHEn0/qzTO1QWKuxV4T+&#xA;bl5r0OuSjS2vx8Y5/UYmlPRvD4aeNd+nbMzTiHDvw/Fx8hlxbXVPVvITzP5T09pjIZjGDIZgqycu&#xA;/NV+ENXqBmLPmW8cmQZFLx7W57Sbz1c2l04jhe54yOWCUFB+02wzocAIwgjudFqJfvSPNDeb/wBF&#xA;6dqQgsqKvH95H6nqcW/WPpy3BxSjZaJTFvabA1W3PiE/hnNS5vRx5KvmP/eBf+Mg/UctwfU15/pQ&#xA;nln+9n/1V/Wct1PINOm5l3mb+9g/1W/WMOm5FdTzCL8uf7wN/wAZD+oZTn+ptwfS1N/fSf6x/XlL&#xA;csxViXmry7q+oamtxaKjRemqnk3E1BP9cVRvlDR9R02O5W9CgyshTi3L7INf14qyDFWKa5+Xvl68&#xA;huZLbT41v7ks31gu44u5qX41K19qZlDW5QKEtnGOkxE3SnoX5ceX7W2h+vWMct7A3L6yHf4iG5Ke&#xA;IIAp8sfzuWq4l/KYrumX5iuSm0X90n+qP1YquxV2KoLUPtp8sVQmKpV5n0+7v9Ka3tQDMXVgGPEU&#xA;B33xVjmi+VddtdVtridIxDG/JyHBNKeGKs4xVC6npdhqdm9nfwie2kILxkkAlTUbqQeoyePJKBuJ&#xA;osJ4xMUeTDdQ/LDSpNUt5rOyiisYaetbl3/e771JJK7eBy/89m/nNP5PF/NZRo3ljQtGeSTTbNba&#xA;SYBZSGZiQN6fEWyvLqJ5PqNtmPBCH0imQ2f9xJ9P6spbUFirsVYPrXlXXbrVbm4gSMwyPyQlwDSn&#xA;hirJfLdhdWOkRW10AJlLlgpqN2JG+KpnirG9b8i+XdQNzcnT0k1C4BPrM7rRyKB6A02+WZMNZliK&#xA;B2ceWlxyNkbpboX5Y6DBaGLVLJLqcMSLjm4qD2KqVG2SGuzD+JB0eI/ws4t1VZIlUUVSoA9gcxHJ&#xA;XeY/94F/4yD9Ry7B9TTn+lCeWf72f/VX9Zy7U8g1abmWvM/97B/qt+sY6XkUanmEX5b/AOOe3/GQ&#xA;/qGU5/rbsH0um/vpP9Y/ryluWYqxq9/MTyvZSyw3M7pNCLwvF6bFq2BHqgAd2DAx/wAw6Yqil86e&#xA;Vm1C2sV1O2aa79QQMJoyjSROsbQhuW8vKQfAN8VRFr5m0G4hsJfrsMJ1NPUsYZnWKWUAVPCNiGan&#xA;emKocedvKjcnXVbRrREZ5L4XEBt1KMilGk50DVkXb3GKp2rKyhlIKkVBG4IOKuxVNov7pP8AVH6s&#xA;VXYq7FUFqH20+WKoTFUl8w+cND8vhzqkrQqlu93y4kgxxyRxNxp1YPOnw++KqE3n7ypDHdPJfxA2&#xA;cpimiLoJKCZYGlCFgTEsjcS/TY4qjI/NXl6RLmZb+D6paww3E16ZEFsIpywjYTE8CD6Z3riq2582&#xA;eXYHSIahbzXMnotHaxTRNK0dw6okgQuCU+OvLw6VxVHWOp6bqCSPYXcN2kMjQzNBIsgSVaFkYoTR&#xA;hUVB3xVE4qjbP+4k+n9WKoLFVsj+nGz0LcAW4qKsaCtAO5xVjMP5leT5SvG9ABW0cs44qqXsLTxM&#xA;zMQABFGzPX7I64qiG8++VFN6o1CF3sohcNHG6O0kLRrKJYVViZE4yD4htiqY3PmDQbWa4gudStYJ&#xA;7SMT3UUk8aPFEaUkkVmBVd+p2xVQtPNnl66fjHqFuOdwLW2YzRUuJTEkoEFHPP4ZRt19sVTbFV8P&#xA;99H/AKw/XirvMn/HPX/jIP1HLsH1tOf6UJ5Y/vZ/9Vf1nLtVyDTpuZa80f3sH+q36xjpeRXVcwjP&#xA;LX/HPb/jI36hlOo+tuwfQ6b++k/1j+vKW5ZirEdV/LDy7qer3GqXDTie5urS8dY3CqHtEMfFaCoW&#xA;ZG4yb74qgtO/KLRrARJb390Ik+CZCLes0AaBlidhEGoPqqfECG679KKrm/Kuya2NvPqV1c2/ow25&#xA;tm9GNWitJGmtUMkcXqL6crs3JTVuhqBiqE0T8rr1ZF1PVNSkh1uK4ae1mtTDMkam2htADztoUkPp&#xA;QU/uh18RyxV6IBQAVr7nFXYqm0X90n+qP1YquxV2KoLUPtp8sVQmKpJ5l8oaT5iewbUQ5XT5jMqK&#xA;QBICtPTeoPw8gr7d1GKsZt/yW8vWyRiC+vFdEQGVjDI5mRw/rkvG3xMftDofDFUev5awRyepBq13&#xA;FIzx3EjcLdi13HPLcif4oiATJcPVQONDsBtiqXx/ldINaVPrHDy/CUnWP1FeeW5VYFLMv1dAgP1Y&#xA;V/eMPBV7Ksw8vaN+htLi05bqW7htwI7ZpliVkiRQiR/ukjDcVXqRU4qmWKo2z/uJPp/ViqCxV2Ks&#xA;Bm/JfyrKa+rdI3O5kBV1FHuCvpmhUj/R0XhHX9kkGuKqi/lJpIt5bcahdehIrMIwtuoWdrdrb1xx&#xA;iBr6cj/DXjv0riq7Uvy6naCe4t7+W71ITLeWguDDbxLd+pC7zF47eY/F9XX4WRl9htRVU8p/lz+g&#xA;5Ib79IzfpKT4tS4CJoZSY4UZByj5KtbZTVeJ3PsFVZpiq+H++j/1h+vFXeZf+Oev/GRf1HLtP9bT&#xA;n+hB+V/72f8A1V/Wcu1XINOl5lrzT/fW/wDqt+sY6XkV1XMIjy7c28dgyySojeoTRmAPQeOVZx62&#xA;3AfQmJuNNJqZYST1PJcpput3r6Z/vyH70xpbd6+mf78h+9MaW3evpn+/IfvTGlt3r6Z/vyH70xpb&#xA;d6+mf78h+9MaW3evpn+/IfvTGlt3r6Z/vyH70xpbXi9sgKCeOn+uv9caW3fXbL/loj/4Nf640tu+&#xA;u2X/AC0R/wDBr/XGlta11p7famib5spxpba9fTP9+Q/emNLbvX0z/fkP3pjS2719M/35D96Y0tu9&#xA;fTP9+Q/emNLbvX0z/fkP3pjS2719M/35D96Y0tu9fTP9+Q/emNLba3Vgoos0QB6gMv8AXGltr19M&#xA;/wB+Q/emNLbvX0z/AH5D96Y0tu9fTP8AfkP3pjS2719M/wB+Q/emNLbvX0z/AH5D96Y0tu9fTP8A&#xA;fkP3pjS2719M/wB+Q/emNLbhcaaDUSwgjoeS40tpd5iubeSwVY5UdvUBorAnofDLsA9bTnPoQ/lb&#xA;++uP9Vf1nLdVyDVpeZV/MNhd3MsJgjLhVIYggdT7nI6eYiDbLUQMiKSn9Car/wAs5+9f65keNDvc&#xA;fwZ9zv0Jqv8Ayzn71/rj40O9fBn3O/Qmq/8ALOfvX+uPjQ718Gfc79Car/yzn71/rj40O9fBn3O/&#xA;Qmq/8s5+9f64+NDvXwZ9zv0Jqv8Ayzn71/rj40O9fBn3O/Qmq/8ALOfvX+uPjQ718Gfc79Car/yz&#xA;n71/rj40O9fBn3O/Qmq/8s5+9f64+NDvXwZ9zv0Jqv8Ayzn71/rj40O9fBn3O/Qmq/8ALOfvX+uP&#xA;jQ718Gfc79Car/yzn71/rj40O9fBn3O/Qmq/8s5+9f64+NDvXwZ9zv0Jqv8Ayzn71/rj40O9fBn3&#xA;O/Qmq/8ALOfvX+uPjQ718Gfc79Car/yzn71/rj40O9fBn3O/Qmq/8s5+9f64+NDvXwZ9zv0Jqv8A&#xA;yzn71/rj40O9fBn3O/Qmq/8ALOfvX+uPjQ718Gfc79Car/yzn71/rj40O9fBn3O/Qmq/8s5+9f64&#xA;+NDvXwZ9zv0Jqv8Ayzn71/rj40O9fBn3O/Qmq/8ALOfvX+uPjQ718Gfc79Car/yzn71/rj40O9fB&#xA;n3O/Qmq/8s5+9f64+NDvXwZ9zv0Jqv8Ayzn71/rj40O9fBn3O/Qmq/8ALOfvX+uPjQ718Gfc79Ca&#xA;r/yzn71/rj40O9fBn3O/Qmq/8s5+9f64+NDvXwZ9zv0Jqv8Ayzn71/rj40O9fBn3Jt5esLu2lmM8&#xA;ZQMoCkkHofY5j6iYkBTkaeBiTad5iuU7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//Z</xmpGImg:image>\n               </rdf:li>\n            </rdf:Alt>\n         </xmp:Thumbnails>\n         <xmpMM:DocumentID>xmp.did:e16d0a1f-0311-d147-8867-b4cbe7f2e37f</xmpMM:DocumentID>\n         <xmpMM:InstanceID>uuid:d5f7139d-3704-4f4f-8669-ed2d734a4c49</xmpMM:InstanceID>\n         <xmpMM:OriginalDocumentID>uuid:0129BF1189DDE0119C7FD1E7637AFAC9</xmpMM:OriginalDocumentID>\n         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>\n         <xmpMM:DerivedFrom rdf:parseType=\"Resource\">\n            <stRef:instanceID>uuid:3bfb068d-6323-4e07-abd7-1c1bdd3f7fa5</stRef:instanceID>\n            <stRef:documentID>xmp.did:446da241-5674-6c40-bc52-57791a796b98</stRef:documentID>\n            <stRef:originalDocumentID>uuid:0129BF1189DDE0119C7FD1E7637AFAC9</stRef:originalDocumentID>\n            <stRef:renditionClass>default</stRef:renditionClass>\n         </xmpMM:DerivedFrom>\n         <xmpMM:History>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:BCB646453062E111906089FB78C225E5</stEvt:instanceID>\n                  <stEvt:when>2012-02-28T12:50:47-08:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator CS5.1</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:e16d0a1f-0311-d147-8867-b4cbe7f2e37f</stEvt:instanceID>\n                  <stEvt:when>2021-04-27T14:33:35-07:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator 25.2 (Windows)</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpMM:History>\n         <illustrator:CreatorSubTool>AIRobin</illustrator:CreatorSubTool>\n         <illustrator:Type>Document</illustrator:Type>\n         <xmpTPg:NPages>1</xmpTPg:NPages>\n         <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>\n         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>\n         <xmpTPg:MaxPageSize rdf:parseType=\"Resource\">\n            <stDim:w>497.667431</stDim:w>\n            <stDim:h>345.956552</stDim:h>\n            <stDim:unit>Pixels</stDim:unit>\n         </xmpTPg:MaxPageSize>\n         <xmpTPg:Fonts>\n            <rdf:Bag>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stFnt:fontName>SegoeUI-Bold</stFnt:fontName>\n                  <stFnt:fontFamily>Segoe UI</stFnt:fontFamily>\n                  <stFnt:fontFace>Bold</stFnt:fontFace>\n                  <stFnt:fontType>Open Type</stFnt:fontType>\n                  <stFnt:versionString>Version 5.62</stFnt:versionString>\n                  <stFnt:composite>False</stFnt:composite>\n                  <stFnt:fontFileName>segoeuib.ttf</stFnt:fontFileName>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stFnt:fontName>SegoeUI</stFnt:fontName>\n                  <stFnt:fontFamily>Segoe UI</stFnt:fontFamily>\n                  <stFnt:fontFace>Regular</stFnt:fontFace>\n                  <stFnt:fontType>Open Type</stFnt:fontType>\n                  <stFnt:versionString>Version 5.62</stFnt:versionString>\n                  <stFnt:composite>False</stFnt:composite>\n                  <stFnt:fontFileName>segoeui.ttf</stFnt:fontFileName>\n               </rdf:li>\n            </rdf:Bag>\n         </xmpTPg:Fonts>\n         <xmpTPg:PlateNames>\n            <rdf:Seq>\n               <rdf:li>Cyan</rdf:li>\n               <rdf:li>Magenta</rdf:li>\n               <rdf:li>Yellow</rdf:li>\n               <rdf:li>Black</rdf:li>\n            </rdf:Seq>\n         </xmpTPg:PlateNames>\n         <xmpTPg:SwatchGroups>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>White copy</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>255</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Black copy</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Process Black CYMK</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>17</xmpG:red>\n                           <xmpG:green>12</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=131 G=185 B=249 2</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>131</xmpG:red>\n                           <xmpG:green>185</xmpG:green>\n                           <xmpG:blue>249</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Fluent</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=68 G=156 B=221</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>73</xmpG:red>\n                           <xmpG:green>155</xmpG:green>\n                           <xmpG:blue>213</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>204</xmpG:red>\n                           <xmpG:green>203</xmpG:green>\n                           <xmpG:blue>203</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=222 G=127 B=197</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>212</xmpG:red>\n                           <xmpG:green>128</xmpG:green>\n                           <xmpG:blue>181</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Black 2</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=15 G=70 B=124</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>19</xmpG:red>\n                           <xmpG:green>71</xmpG:green>\n                           <xmpG:blue>123</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Azure Lite Blue</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=195 G=241 B=255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>198</xmpG:red>\n                           <xmpG:green>233</xmpG:green>\n                           <xmpG:blue>247</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=156 G=235 B=255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>165</xmpG:red>\n                           <xmpG:green>221</xmpG:green>\n                           <xmpG:blue>243</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=80 G=230 B=255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>116</xmpG:red>\n                           <xmpG:green>207</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=50 G=190 B=221</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>50</xmpG:red>\n                           <xmpG:green>190</xmpG:green>\n                           <xmpG:blue>221</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=25 G=138 B=179</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>26</xmpG:red>\n                           <xmpG:green>137</xmpG:green>\n                           <xmpG:blue>178</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Azure Blue</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=131 G=185 B=249</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>138</xmpG:red>\n                           <xmpG:green>182</xmpG:green>\n                           <xmpG:blue>225</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=94 G=160 B=239</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>104</xmpG:red>\n                           <xmpG:green>156</xmpG:green>\n                           <xmpG:blue>211</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=120 B=212</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>45</xmpG:red>\n                           <xmpG:green>117</xmpG:green>\n                           <xmpG:blue>187</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=91 B=161</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>91</xmpG:green>\n                           <xmpG:blue>161</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=48 B=103</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>30</xmpG:red>\n                           <xmpG:green>52</xmpG:green>\n                           <xmpG:blue>100</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Purple</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=183 G=150 B=249</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>170</xmpG:red>\n                           <xmpG:green>149</xmpG:green>\n                           <xmpG:blue>199</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=166 G=122 B=244</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>146</xmpG:red>\n                           <xmpG:green>123</xmpG:green>\n                           <xmpG:blue>184</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=119 G=58 B=220</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>108</xmpG:red>\n                           <xmpG:green>83</xmpG:green>\n                           <xmpG:blue>163</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=85 G=47 B=153</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>87</xmpG:red>\n                           <xmpG:green>53</xmpG:green>\n                           <xmpG:blue>148</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=52 G=26 B=110</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>53</xmpG:red>\n                           <xmpG:green>40</xmpG:green>\n                           <xmpG:blue>109</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Magenta</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=220 G=146 B=191</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>219</xmpG:red>\n                           <xmpG:green>146</xmpG:green>\n                           <xmpG:blue>191</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=206 G=116 B=182</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>203</xmpG:red>\n                           <xmpG:green>116</xmpG:green>\n                           <xmpG:blue>175</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=163 G=58 B=133</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>163</xmpG:red>\n                           <xmpG:green>58</xmpG:green>\n                           <xmpG:blue>133</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=89 G=40 B=95</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>89</xmpG:red>\n                           <xmpG:green>39</xmpG:green>\n                           <xmpG:blue>94</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=54 G=23 B=55</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>53</xmpG:red>\n                           <xmpG:green>23</xmpG:green>\n                           <xmpG:blue>54</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Orange</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=179 B=77</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>252</xmpG:red>\n                           <xmpG:green>178</xmpG:green>\n                           <xmpG:blue>79</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=250 G=162 B=29</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>250</xmpG:red>\n                           <xmpG:green>162</xmpG:green>\n                           <xmpG:blue>31</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=247 G=141 B=30</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>247</xmpG:red>\n                           <xmpG:green>141</xmpG:green>\n                           <xmpG:blue>32</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=239 G=113 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>237</xmpG:red>\n                           <xmpG:green>115</xmpG:green>\n                           <xmpG:blue>35</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=209 G=89 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>208</xmpG:red>\n                           <xmpG:green>91</xmpG:green>\n                           <xmpG:blue>39</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Red</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=115 B=129</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>242</xmpG:red>\n                           <xmpG:green>114</xmpG:green>\n                           <xmpG:blue>129</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=240 G=64 B=73</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>239</xmpG:red>\n                           <xmpG:green>64</xmpG:green>\n                           <xmpG:blue>74</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=230 G=35 B=35</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>229</xmpG:red>\n                           <xmpG:green>37</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=179 G=27 B=27</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>179</xmpG:red>\n                           <xmpG:green>32</xmpG:green>\n                           <xmpG:blue>37</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=130 G=16 B=16</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>130</xmpG:red>\n                           <xmpG:green>22</xmpG:green>\n                           <xmpG:blue>24</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Yellow</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=228 B=82</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>254</xmpG:red>\n                           <xmpG:green>228</xmpG:green>\n                           <xmpG:blue>82</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=212 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>254</xmpG:red>\n                           <xmpG:green>212</xmpG:green>\n                           <xmpG:blue>2</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=202 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>203</xmpG:green>\n                           <xmpG:blue>6</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=189 B=2</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>254</xmpG:red>\n                           <xmpG:green>189</xmpG:green>\n                           <xmpG:blue>17</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=223 G=165 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>223</xmpG:red>\n                           <xmpG:green>166</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Teal</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=66 G=232 B=202</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>107</xmpG:red>\n                           <xmpG:green>199</xmpG:green>\n                           <xmpG:blue>186</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=60 G=212 B=194</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>87</xmpG:red>\n                           <xmpG:green>195</xmpG:green>\n                           <xmpG:blue>185</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=55 G=194 B=177</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>64</xmpG:red>\n                           <xmpG:green>190</xmpG:green>\n                           <xmpG:blue>175</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=37 G=130 B=119</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>37</xmpG:red>\n                           <xmpG:green>131</xmpG:green>\n                           <xmpG:blue>120</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=32 G=112 B=103</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>32</xmpG:red>\n                           <xmpG:green>112</xmpG:green>\n                           <xmpG:blue>103</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Green</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=180 G=236 B=54</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>182</xmpG:red>\n                           <xmpG:green>212</xmpG:green>\n                           <xmpG:blue>58</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=134 G=214 B=51</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>139</xmpG:red>\n                           <xmpG:green>198</xmpG:green>\n                           <xmpG:blue>63</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=118 G=188 B=45</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>118</xmpG:red>\n                           <xmpG:green>188</xmpG:green>\n                           <xmpG:blue>67</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=94 G=150 B=36</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>94</xmpG:red>\n                           <xmpG:green>151</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=54 G=86 B=21</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>56</xmpG:red>\n                           <xmpG:green>87</xmpG:green>\n                           <xmpG:blue>40</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Neutrals</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Rich Black_R0 G0 B0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Ex Dk Gray_R47 G47 B47</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>46</xmpG:red>\n                           <xmpG:green>46</xmpG:green>\n                           <xmpG:blue>46</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Gray_R80 G80 B80</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>80</xmpG:red>\n                           <xmpG:green>80</xmpG:green>\n                           <xmpG:blue>80</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Mid Gray_R115 G115 B115</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>115</xmpG:red>\n                           <xmpG:green>115</xmpG:green>\n                           <xmpG:blue>115</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Gray_R210 G210 B210</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>210</xmpG:red>\n                           <xmpG:green>210</xmpG:green>\n                           <xmpG:blue>210</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Gray_R230 G230 B230</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>230</xmpG:red>\n                           <xmpG:green>230</xmpG:green>\n                           <xmpG:blue>229</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Ex Lt Gray_R242 G242 B242</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>242</xmpG:red>\n                           <xmpG:green>242</xmpG:green>\n                           <xmpG:blue>242</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>White_R255 G255 B255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>254</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Grays</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=33 G=33 B=33</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>33</xmpG:red>\n                           <xmpG:green>33</xmpG:green>\n                           <xmpG:blue>33</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>K=77</xmpG:swatchName>\n                           <xmpG:mode>GRAY</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:gray>196</xmpG:gray>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=79 G=79 B=79</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>79</xmpG:red>\n                           <xmpG:green>79</xmpG:green>\n                           <xmpG:blue>79</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=118 G=118 B=118</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>119</xmpG:red>\n                           <xmpG:green>118</xmpG:green>\n                           <xmpG:blue>119</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>153</xmpG:red>\n                           <xmpG:green>153</xmpG:green>\n                           <xmpG:blue>153</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>K=36</xmpG:swatchName>\n                           <xmpG:mode>GRAY</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:gray>91</xmpG:gray>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>179</xmpG:red>\n                           <xmpG:green>180</xmpG:green>\n                           <xmpG:blue>180</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>230</xmpG:red>\n                           <xmpG:green>230</xmpG:green>\n                           <xmpG:blue>230</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>242</xmpG:red>\n                           <xmpG:green>242</xmpG:green>\n                           <xmpG:blue>243</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Azure 2020</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Prime Rich Black</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az White</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>254</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Azure Blue</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>33</xmpG:red>\n                           <xmpG:green>113</xmpG:green>\n                           <xmpG:blue>185</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Accent Light Blue</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>116</xmpG:red>\n                           <xmpG:green>207</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Dark Grey</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>60</xmpG:red>\n                           <xmpG:green>60</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Medium Grey</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>117</xmpG:red>\n                           <xmpG:green>117</xmpG:green>\n                           <xmpG:blue>122</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Light Grey</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>234</xmpG:red>\n                           <xmpG:green>234</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Core Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Orange_R216 G59 B1</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>213</xmpG:red>\n                           <xmpG:green>62</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Yellow_R255 G185 B0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>253</xmpG:red>\n                           <xmpG:green>184</xmpG:green>\n                           <xmpG:blue>19</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Green_R16 G124 B16</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>22</xmpG:red>\n                           <xmpG:green>124</xmpG:green>\n                           <xmpG:blue>62</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Teal_R0 G133 B117</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>2</xmpG:red>\n                           <xmpG:green>133</xmpG:green>\n                           <xmpG:blue>117</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Blue_R0 G120 B212</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>45</xmpG:red>\n                           <xmpG:green>117</xmpG:green>\n                           <xmpG:blue>187</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Purple_R134 G97 B197</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>127</xmpG:red>\n                           <xmpG:green>98</xmpG:green>\n                           <xmpG:blue>170</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Light Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Orange_R255 G147 B73</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>246</xmpG:red>\n                           <xmpG:green>145</xmpG:green>\n                           <xmpG:blue>77</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Yellow_R254 G240 B0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>251</xmpG:red>\n                           <xmpG:green>237</xmpG:green>\n                           <xmpG:blue>25</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Green_R155 G240 B11</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>161</xmpG:red>\n                           <xmpG:green>204</xmpG:green>\n                           <xmpG:blue>57</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Teal_R48 G229 B208</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>97</xmpG:red>\n                           <xmpG:green>197</xmpG:green>\n                           <xmpG:blue>190</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Blue_R80 G230 B255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>116</xmpG:red>\n                           <xmpG:green>207</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Purple_R213 G157 B255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>191</xmpG:red>\n                           <xmpG:green>159</xmpG:green>\n                           <xmpG:blue>202</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Dark Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Orange_R107 G41 B41</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>107</xmpG:red>\n                           <xmpG:green>41</xmpG:green>\n                           <xmpG:blue>41</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Yellow_R106 G75 B22</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>106</xmpG:red>\n                           <xmpG:green>76</xmpG:green>\n                           <xmpG:blue>29</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Green_R5 G75 B22</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>23</xmpG:red>\n                           <xmpG:green>75</xmpG:green>\n                           <xmpG:blue>36</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Teal_R39 G75 B71</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>39</xmpG:red>\n                           <xmpG:green>75</xmpG:green>\n                           <xmpG:blue>71</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Blue_R36 G58 B94</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>35</xmpG:red>\n                           <xmpG:green>58</xmpG:green>\n                           <xmpG:blue>94</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Purple_R59 G46 B88</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>59</xmpG:red>\n                           <xmpG:green>46</xmpG:green>\n                           <xmpG:blue>87</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>ALM Specific</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Validation Squiggles</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>227</xmpG:red>\n                           <xmpG:green>30</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Outline Stroke</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Outline art stroke</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>235</xmpG:red>\n                           <xmpG:green>234</xmpG:green>\n                           <xmpG:blue>237</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Text Code Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Red Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>239</xmpG:red>\n                           <xmpG:green>60</xmpG:green>\n                           <xmpG:blue>35</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Teal Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>1</xmpG:red>\n                           <xmpG:green>142</xmpG:green>\n                           <xmpG:blue>172</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Blue Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>55</xmpG:red>\n                           <xmpG:green>86</xmpG:green>\n                           <xmpG:blue>166</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dark Blue Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>34</xmpG:red>\n                           <xmpG:green>32</xmpG:green>\n                           <xmpG:blue>95</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Green Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>13</xmpG:red>\n                           <xmpG:green>132</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>FOR MS LOGO ONLY</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Blue 0-164-239</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>50</xmpG:red>\n                           <xmpG:green>159</xmpG:green>\n                           <xmpG:blue>217</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Green 127-186-0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>126</xmpG:red>\n                           <xmpG:green>186</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Orange 242-80-34</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>240</xmpG:red>\n                           <xmpG:green>81</xmpG:green>\n                           <xmpG:blue>36</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Yellow 255-185-0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>253</xmpG:red>\n                           <xmpG:green>184</xmpG:green>\n                           <xmpG:blue>19</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Gray 115-115-115</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>115</xmpG:red>\n                           <xmpG:green>115</xmpG:green>\n                           <xmpG:blue>115</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpTPg:SwatchGroups>\n         <pdf:Producer>Adobe PDF library 15.00</pdf:Producer>\n         <pdfx:CreatorVersion>21.0.2</pdfx:CreatorVersion>\n      </rdf:Description>\n   </rdf:RDF>\n</x:xmpmeta>\n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                           \n<?xpacket end=\"w\"?>\r\nendstream\rendobj\r3 0 obj\r<</Count 1/Kids[5 0 R]/Type/Pages>>\rendobj\r5 0 obj\r<</ArtBox[0.0 0.0 497.667 345.957]/BleedBox[0.0 0.0 497.667 345.957]/Contents 27 0 R/CropBox[0.0 0.0 497.667 345.957]/Group 28 0 R/LastModified(D:20210427152846-07'00')/MediaBox[0.0 0.0 497.667 345.957]/Parent 3 0 R/PieceInfo<</Illustrator 8 0 R>>/Resources<</ExtGState<</GS0 29 0 R/GS1 30 0 R/GS2 31 0 R/GS3 32 0 R/GS4 33 0 R/GS5 34 0 R/GS6 35 0 R/GS7 36 0 R/GS8 37 0 R/GS9 38 0 R>>/Font<</TT0 21 0 R/TT1 22 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 23 0 R/MC1 24 0 R/MC2 25 0 R>>/Shading<</Sh0 39 0 R/Sh1 40 0 R/Sh2 41 0 R/Sh3 42 0 R/Sh4 43 0 R/Sh5 44 0 R/Sh6 45 0 R/Sh7 46 0 R/Sh8 47 0 R>>/XObject<</Fm0 48 0 R/Fm1 49 0 R/Fm10 50 0 R/Fm11 51 0 R/Fm12 52 0 R/Fm13 53 0 R/Fm14 54 0 R/Fm15 55 0 R/Fm16 56 0 R/Fm17 57 0 R/Fm18 58 0 R/Fm19 59 0 R/Fm2 60 0 R/Fm20 61 0 R/Fm21 62 0 R/Fm22 63 0 R/Fm3 64 0 R/Fm4 65 0 R/Fm5 66 0 R/Fm6 67 0 R/Fm7 68 0 R/Fm8 69 0 R/Fm9 70 0 R>>>>/Thumb 71 0 R/TrimBox[0.0 0.0 497.667 345.957]/Type/Page>>\rendobj\r27 0 obj\r<</Filter/FlateDecode/Length 5816>>stream\r\nHWɮ\r+\u0003yغx p\u001c _$v\u0002\u000f\u001c&mt\u0001P\"3Y\u001fN/=\u0019[193dZ8ydj<}mƗr\u001aM:/_=~O`U\u0005\u001a\u0004|_\u001c\u001f?\u001f/6gB3\u0007wrD {lT,+~hk|'\u0017\tv\u0018w\u0006WL*K<_N\\6}|\u0007\u0015>\u0004\u0002(-\u001boCZ)W6\u0011GoË#\u0014vGg/D\u0010=ioMy\roZ\\\u0011'oEL\t-\u001atqKx\u001e)8`\u001a\u000e(EzSN65\u000bpWњ\u0000O~:|k\u0005wzϪŤ,\u0004\u0007@s}L-|\u001dO{\u001db\"!tp\u0011ђP51xR  $)r\u001d\u0002JȮ¢bP^Ǔ^tg(Q3P\u0016Hu񤨩>׍'#m\u0007uK\u0007$WIɱhK\u001eX~/?d7\t8\u0013z\u000e6[\u000b\u001c\u000b\u00189#\"名ڲ1jȣHn?}`N(A\u00001L\u0012(V1\u0003LTdj\u00189V2\u0017;J\u001aE\u001aH\u001b@\u0014E\u0002Ziu>VyG\n&pL\u0011\t}\u0000\b/\u0016*P\u000b^d\u0003/VN;s)\nQ3\u000e<\u001cq&5\u0004hp\tȏL\u0017\\\u0014d\u0006Q\u000fޅ\u0015؋\u000eThy3,\u0007}M\u0004,~IGwE>\u0002G=KtUFs\u0012g;\u001c\u0017z)V\tlZq=J\u0000t9K\u0002|)p!\u001cP\u0000bTh\u0011\u0016\u00025\b<-\u000b\u001c`t\u0001{\u0002\u0017#-\u0001=\u0003=\u0005=\u0007\u0006\u001c`L\u0001&\u0004X.6\u0019~2H+3`\\\u001a|̯R\u0019|8\"fKX^\u0001v\u0007m\u0005\u0006\u0005\u0012\u0014\u001f*n*<N-ҕ\u001f\u000f,I_K\b\\x@ĳHn\u0013')\u001c\u00135LC|`s C*\u00009$V-r\u0014D\u0003eD4\u0003d\u001e\u0010Fu\u0007c[\u0018\u00103\u0013&GYe>R\u000bJ#B\r\u0003j/9yd,t\u0003H\u001aٰ5ś9(\u001b\u0017s/~}v&2UI\u001f\u00183Sm4!m\u0000\"{Rbmg\u0002dWPB+cfB\u000b\u0016Cc\u0000\u0001Rdv\\X\u0001\u0003\u001bͽ{dPf,ql&\u0003\u000bgq\u001e=ЪX20%zuBݾoe\u0001\u0003gxq6\u001c\u00173P1k@Syq?u<)\u0002/'\u0017\bTRAᦁ\u0012ޕ\u001e\f!n^E޹\u001aZrn˱`\u0018856Y{Ym\r۾u\u000b\u0017ާOKh\u0002+\u0003|FaN\u0012\u0017\u001b%\u0006t0 M\u0010y\\8)R0'dbNU\u0014;U3l\u001b2\u0017OLs\u0010юCIþl\u0000\u0015\u001d\f;\u000f\u000bYvyуmߠH[K\r?ܜ:d'W\u0006H q{qxv5toe]BV~\u001bRN`Lӹ71F\fu \u000bHZ/\f\\e+c\u001f\u001c6;o\u0019h\b\u001cXO77%G\\<4-j\u0019c*%\u00057Pu7@#`Ш\u0017u\u001e\u0002iaθYܲ\u0002EA\u0000\u0002F+\u0010`/\\ch`o\u00165\\0\u0011)s~*d<(oR}t'\fQty*]N{L(O!\"G\u0014cP\n-$d\u001dixB)Т6-L^3ENq\u0017%`G>d\u001b\u0015V\f\u0014QQ\n\u000fa\u0010}o=bc+_bd^g+\u0015\u0010wkCZIդ\u0005\u00022CTN=ir]\rz+'\u0014Jq)yRk((!䘼X}\u0012s1I7W#ca\u000f\u0011W\u0002\u001a\u000bc1ji\u0011섯IaHa BuBi^(lUBh\u0002\u001eU\\\u0005:pFY4Jn\u0015\u0004\u000bUnO\ne4SFpL*\fZ^܎S(\u0003վ 8[,NQOQ)ؕc\u0010JI;0Woa'\u0007s9\u0015\u0019N\u0013:q\u000e-X9+mNwʦ)k\nJ\b\u000es\u0014\u0005ryRvE\u0003*'ʵ`eS\u0014.)h\u001c(JٶMӌ<Dn*e\u000b]FA&;'\u0012$d^DxR\u001cd,NR0\btRC\u0003F\u0005&\u001euQ4cʋ\no|\u0004H5>\u0000ɰ\u0014^\u0006WG\u0012lQO\u001bH8\u0017\u000foByɜXO}\u001dO{x\"S&7WR\u001f{癶u\u000foqTX\u0017t wq@\"\u000b\\⶚_Y]\u000b]7.>ZC\n#--SPI.\u0003=lR\u001ePqL@+7'\u0005\u001edaJ^;0b4\\\u0012\u0011w{\u0011p\bnN\u0018\u001cJFG\buc\u0005\u0015^:=FxO\u0002\f.\"BÖq\u0000WE8`j\u0007\u0005\u00120ܪ-8.NAwog\u0000z\u0013\u0012\u0010\u0017eiN!/DPQ\u000f\u0017P;u<)T\u0015Տ>k\u0014F\u0013x\n>!k\u001aU+\u0013\u001e\u0014\bȍ=\u0018Cs\u00117<s񤼕bۍ'aoxOaʀIl\u0012,;$qŶr]fMHv\u001e\u0004#KG\u0004Y\u0013A\u001awQ\u0007\u0006x+*,˥wlH>(oEj A@\u0013n񠼅\u0012j汶\u0010q$Yq\u0001P\u0006(\u0001'3\u000b\u0019%q\u0018&\u0005l\u0012,}L\u001d:~u\u001caxϧ8Kbwe\u0004F\u0012\u001bAB\"Y\u0004Y#9\tph\u0007\u0015y\u0014EÈ\u0000A[wUהi<?Uqr\"h\u0011?`,Xc\u0001\u0003,f\"1\u0017q\u001b\u0014+N\u0002\u0011;DoD+\u0015IyɪT\u0015}\u0007|t ByO>:b\n:#{Ͳ\u000e1y\u001e1\"\u0001\"(K-\u0010,\u0007,X \u001e~~:Oz\u0017\u001f|QɵgS/\u0002{\u000b\u0006\u001aIcHNC\u0001[!;yA\u0005q\u0003R%Vc{pH-\r]}+KPU*\u0012K^Y,ˏU 2B[I{\rlh|U\u001bܣ,g={I\u00046v\u001a\u0010<-\u0015;M8a%mVc6f&Vɣ$U\u0017\u0005灏*N\\7#kk0U\u0018Tĳ+16Ml]\u0017O6@[>^<#pL\u0018O\u0007T\u001f{~`\u001fN2k\u0015\u001b\u0006Cǅ&;\fw\u001eӐU*2+<kXapH\u001a/|R-61<]5۠A\u001bPC\u0018EÃ#KZ^.q9+0S\u0013\u0005q\u0018\"&qؿ\u0017N[/@'5\u000eSWOj_ð:\\E\u0019E\u000fv\rz7I/cV:'z%\te%5?j\u0018\u000eZmVxe\u000fϚm\u0018]I\u0016E\u001e(d](c_\u0015c(饕i1\u0014m2(OwM.HF\fMG*1\u0015.z,}\u0001J1٫2\u0011m\tv\u001b8\u0017\u0005\rԀ˂O7\u00186\u0015u\u001fU\u0019bqc>FOs皋= \u000eLm\u0004ܠh\u000e~\b\u0001\u0017\u001c('mP+\u000eװȵ{\u0000z\u0007C&#_\u00018Q\u0011[y\u000f\u0000#3\u0011+82ޯ\b7o\u0015&\u0006\u00164'|dAB(tHtXt\u001e\u0019Z6o^T+%wm\rI\tP8\u0012`}'*Qd1]y\u0004Gٸ\u0005B\nÕ\u0002\u001akw\u0012*FLZ)KY\u001a<\bES|\u0014,o5.+ZVC;XN|rt1[ke13Ҳ\u0016\u0003v\u0015Kt\u001c\u0015\u000ekέt?<J\n3\u001b%\u0019Z'<u\u0001x9d\bƇ%y^kz8\u0018\u0018(0\"n\u0015ꋒa\f\u0000'b\u00117>B\fQ~\t\b4A\u0001>\u001fڔ^󝂕G|ӎ\b9_\u000f\u001dS\u001dH\u0014\"FT4EG1sDBf\u0002;0\u0016$R8=_˱\"\u0003_W\u000ee\u0018:MЩ\u0016Õ\u001f\u0016k\u001a\u0016^a$k9Z\u001csINNR\u00041d\u0017\u0013\"N\u001d\u0002\u000fV\u0012\u000fYs#\u0002^3U\u0004\u0012jMK^\u0000!b\u0007Upb\u000bU.k˚*UU|\u0003U\u0002O\u0011B\u001dy9c58>Z)>[56=$!SlM\u0011qQN\u0018\u00074C48{N\u0017\u001b1^\u0011\u00023\u0019VC\u0004-5U\u0014秋Yޚܣ\nIX\u0017m@\u00145ǙI\b\u001cw\u0017\u0004\u0016\u000f\u001c9\u001a!\u001a\u001f<D?xJX1xsH\u0002uJBB\"\u001aPEĹ\u001a\u0003[\u0017ٽ\u0015;sn\r\u0007Ph\u0003JQӋE']\u0015TwSr67dp5E\\y{\u0019xz^K\u0018>\u000e5FP\u001cۮ8\u0018&_V\u0015l\u000674f\u000fQzjR%ɋ\n\u0007^ D+b\u001cd`:+V-@۷\u0010g\u000fhV`=O\u0011V3\u0018\u0015\rYB\u0014\rgiA}\u0017d\u0003{%?\u0016ru\\\u001ct,>\u001cИa\u0018b\u0019O(\u0017E<\u0006\n芄WIw&7Ƭ\u000bVW;\u0014\u0001gZ\b \u001c}ŕyw)Zb T\u0015kCYyh\u0015sS\u0000S\u001a\u0017hR)_\u001d8\u0003Ϟ\u0001\u0016\u000fyZ{7N\u001bǿWw\u00006g\u0003pp\u0000N\u001f\u0003r]\u0004\u001c\nH\u0011$Lz\u0004p\u001eH\t$͎Y\u0004\"\u0017\u0017y9]qL:\f^\u001c\u0019\f<w)*v69Sj5_o;vaqaϊS\rO,X(x&x\u0007\u0005\u0013K{\u001b;\u0014l\u0015n\u0010>`\u001b\u0019(~`X\f.s\u001f\u0019\u0002\u0012j\nnUz$\u0005[\u0005=p\u0015\u0012E/\fi\u0015=6PNL\u0019{3R4Tb\u0014Si\u0015*W-X>e\u0019Poqy*v\nW\tm(bXNq&\u0005O=\u0014{<\u0005N/>qô\u0011L}`EQ,oMnY\u0017J\u000bV獂w;)\u0002Z\u0015N@)\u0014SlM\".\u0006\n\u0005N\u0014MgI,c\u001d`K\u000e\u0002='\u0001[O\u0004|\u001eg\u0004\u0017J-_\u0010\u0001;f\u0002v\u0003\u0001S\u001c\bx\u00103\u0001\u0014[STlr&j]}v\nj&`*Vm\u00054kX\bx&xB\u0012,k{\u001b;\u0004l|N\u0002vN?\u000b\u0001ϓ\u0012p&`gG!VG\u0012\u000e\u001b:\u00017E&D\u0011;\u0001;g\u0002)U#\u0001S4V~b\u0004S`s3\u0001SaU\fjߙw\n\u0007\u001c0S#\u00017MYq&\u0001O=\u0004\u00047X\u0015\u0019\u0019첚8r_A1\u000by=,!\u0013*p\u0004\\7\u0013PG\u0010 F8Z$Ȳnw\u0001y`\bM4S`S2\u000b\\ϋ\\\u0005T9xWvpk\u0005@^n=\u000b*>̱Mꑎ\u001f^./|~\r\u0017ݐ0\u0013ٲ/}n\u0016ptZʇp0Zk\u0016+\n)⯗=+\\~s@wW#HH/\u001ep7,䋴\\.'|%\\krm.{7ջw\u000b՜`\n\u0015J`\u000f>\u0005\u0001\u0015\u0003F\u0005>`\",45a#\tZ$7Z\u0017/7p\f\r>x\u001e\u0003޳\u0013,r#\u001fۮ&&JF;\u0014iZVm\u0014H`dҬ\u000f\u0018\n\u0011\u0007~qU:[Ħ*\u0017kA\b_\n\r\u0006&OZxL~AoI\u00195ZsFWaWpqZWyn\u000fGKd\u000bTb^I\u0003?^F \u0018\u0003 ދ&-\u0005&b˂\u001c\u0000W|u\u0001\u0001|\u0004Iԙ@g$\u001d`\u0000 3sY\u001aa!Y\u0010u0u u:\u0012ܼ\bJL\u0004\u0013Ay\u0007ho:\u0003\u0018\u0013p&\u0000!\u00077I?4AR7\u0001G]CPJc#Hi\f\u0016\u0002\b0\u0000\u0006ݛ\r\nendstream\rendobj\r28 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency>>\rendobj\r71 0 obj\r<</BitsPerComponent 8/ColorSpace 72 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 43/Length 663/Width 62>>stream\r\n8;XF64a,R6%\"Pa^-g2l?c(6a\\QdF_nlF\"s.HjY%r1$K/c16E7=&22=flP/9<%*>d6\n80K'+!X/<2JAc*=LYD/N[sQAJH%h-8+7%!t(U3!U<l%k?DXU>#bLsV0.N^d%.*qug\n7Ect\\>$Y!&JdVLSG8St$$AeMrXp.8BnF-(!QZT`#CF;$<eLpV_St\"o_\"['Q4-bJNf\nk[7C',T6r<`6hHZ@rKH`G!8F.qAS*.c&pYFQOC6ZH]E7[s%;?.Ch*<rNTU\\l\\G'.9\nR1Yp33=Sm<5EGHl^\"#^C3)]C`ktNO^@hAVQp9YY0T.:kXC_7!(h0Z08=&CXDhT*UG\nhH0`tfJ>NPN?T`!p#UM#%Q$^R+FHC^hnHh,s+ENra4.!aK[#k8;Kca@9NP/N&nA)R\nS\\5clqmpA40=igW4gd7MP<&KbL2gW`*\"*5qbR(V(S+`Wr:YE;H\"0Ht6hp+\\+G?6Qf\nCupjl3lY%F/X2cT7%Yj%@,o*$5c6K0[*8?^4OLA#^!<mO-V(a3\"auB\">^Nec1U%bm\n;Mt@h@7/?n\"J'gnN?qj8kXP6RY@Ofj[]Lk1>-d-G>#V$[/*Z-(9l*?\\B0UL`\\l$bp\n)C'@4jI+i00&jV:Y0D+*?<-Il0-f$?b*H(0.UR;#2ge-/(WX5!`HuHIa*$eL!48@^li~>\r\nendstream\rendobj\r72 0 obj\r[/Indexed/DeviceRGB 255 73 0 R]\rendobj\r73 0 obj\r<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream\r\n8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@\"pJ+EP(%0\nb]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\\Ulg9dhD*\"iC[;*=3`oP1[!S^)?1)IZ4dup`\nE1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\\.?d>Mn\n6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1\nVNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<\nPO7r\\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(\nl[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\\~>\r\nendstream\rendobj\r48 0 obj\r<</BBox[6.58371 289.277 491.084 6.77721]/Group 74 0 R/Length 110/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>/Shading<</Sh0 75 0 R>>>>/Subtype/Form>>stream\r\nq\n6.584 289.277 484.5 -282.5 re\nW n\nq\n0 g\n/GS0 gs\n0 282.5 282.5 -0 248.8337097 6.7771997 cm\nBX /Sh0 sh EX Q\nQ\n\r\nendstream\rendobj\r49 0 obj\r<</BBox[241.102 275.402 394.052 191.652]/Group 76 0 R/Length 64/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.514 0.725 0.976 rg\n/GS0 gs\n241.102 275.402 152.95 -83.75 re\nf\n\r\nendstream\rendobj\r50 0 obj\r<</BBox[175.108 246.039 186.056 244.748]/Group 77 0 R/Length 276/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.969 0.573 0.118 rg\n/GS0 gs\nq 1 0 0 1 175.7009 246.0394 cm\n0 0 m\n9.762 0 l\n10.09 0 10.355 -0.266 10.355 -0.593 c\n10.355 -0.699 l\n10.355 -1.026 10.09 -1.292 9.762 -1.292 c\n0 -1.292 l\n-0.328 -1.292 -0.593 -1.026 -0.593 -0.699 c\n-0.593 -0.593 l\n-0.593 -0.266 -0.328 0 0 0 c\nf\nQ\n\r\nendstream\rendobj\r51 0 obj\r<</BBox[114.162 241.995 140.771 223.573]/Group 78 0 R/Length 224/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n1 1 1 rg\n/GS0 gs\nq 1 0 0 1 115.55 241.995 cm\n0 0 m\n24.328 0 l\n24.658 -0.004 24.974 -0.126 25.221 -0.344 c\n-0.893 -18.422 l\n-1.203 -18.163 -1.384 -17.781 -1.389 -17.377 c\n-1.389 -1.391 l\n-1.378 -0.628 -0.763 -0.011 0 0 c\nf\nQ\n\r\nendstream\rendobj\r52 0 obj\r<</BBox[312.858 335.951 326.157 329.444]/Group 79 0 R/Length 244/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n1 1 1 rg\n/GS0 gs\nq 1 0 0 1 314.6081 329.4437 cm\n0 0 m\n3.116 2.964 7.248 4.625 11.549 4.641 c\n10.984 5.339 10.336 5.966 9.618 6.507 c\n7.525 6.378 5.47 5.896 3.539 5.082 c\n1.55 4.227 -0.248 2.984 -1.75 1.426 c\n-1.028 1.152 -0.414 0.652 0 0 c\nf\nQ\n\r\nendstream\rendobj\r53 0 obj\r<</BBox[308.075 325.011 310.992 319.58]/Group 80 0 R/Length 258/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n1 1 1 rg\n/GS0 gs\nq 1 0 0 1 309.1511 325.0106 cm\n0 0 m\n-0.445 -1.103 -0.805 -2.238 -1.076 -3.396 c\n-0.837 -3.812 -0.568 -4.21 -0.272 -4.588 c\n-0.039 -4.887 0.182 -5.159 0.44 -5.431 c\n0.754 -3.888 1.223 -2.381 1.841 -0.933 c\n1.148 -0.81 0.509 -0.485 0 0 c\nf\nQ\n\r\nendstream\rendobj\r54 0 obj\r<</BBox[308.101 334.707 310.421 329.742]/Group 81 0 R/Length 228/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 310.4216 330.8958 cm\n0 0 m\n-0.458 1.228 -0.758 2.508 -0.895 3.811 c\n-1.438 3.239 -1.917 2.609 -2.32 1.931 c\n-2.174 0.881 -1.927 -0.152 -1.582 -1.154 c\n-1.176 -0.626 -0.627 -0.226 0 0 c\nf\nQ\n\r\nendstream\rendobj\r55 0 obj\r<</BBox[312.262 325.153 317.473 320.798]/Group 82 0 R/Length 299/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 316.7732 321.096 cm\n0 0 m\n0.001 0.621 0.253 1.215 0.699 1.646 c\n-0.495 2.301 -1.599 3.112 -2.58 4.058 c\n-3.093 3.502 -3.77 3.125 -4.512 2.981 c\n-3.927 2.383 -3.298 1.828 -2.632 1.322 c\n-1.802 0.696 -0.912 0.153 0.025 -0.298 c\n0.011 -0.199 0.002 -0.1 0 0 c\nf\nQ\n\r\nendstream\rendobj\r56 0 obj\r<</BBox[320.7 321.239 326.676 319.151]/Group 83 0 R/Length 307/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 324.9392 320.8241 cm\n0 0 m\n-1.205 -0.001 -2.405 0.139 -3.578 0.415 c\n-3.571 0.368 -3.571 0.319 -3.578 0.272 c\n-3.576 -0.33 -3.813 -0.908 -4.239 -1.335 c\n-2.78 -1.624 -1.291 -1.729 0.194 -1.646 c\n0.771 -1.125 1.287 -0.543 1.736 0.091 c\n1.16 0.027 0.58 -0.003 0 0 c\nf\nQ\n\r\nendstream\rendobj\r57 0 obj\r<</BBox[312.91 337.688 322.697 327.24]/Group 84 0 R/Length 301/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 321.906 327.2406 cm\n0 0 m\n0.114 0.507 0.392 0.962 0.79 1.296 c\n-1.344 2.848 -3.285 4.649 -4.99 6.662 c\n-5.984 7.83 -6.854 9.099 -7.583 10.447 c\n-8.067 10.302 -8.54 10.12 -8.996 9.903 c\n-8.216 8.434 -7.281 7.052 -6.209 5.781 c\n-4.387 3.604 -2.301 1.662 0 0 c\nf\nQ\n\r\nendstream\rendobj\r58 0 obj\r<</BBox[325.846 326.113 328.426 323.741]/Group 85 0 R/Length 330/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 328.4255 325.1537 cm\n0 0 m\n-0.453 0.22 l\n-0.842 0.428 l\n-0.92 0.428 l\n-1.257 0.7 l\n-1.348 0.7 l\n-1.75 0.959 l\n-1.889 0.481 -2.18 0.063 -2.579 -0.233 c\n-2.424 -0.337 -2.255 -0.428 -2.087 -0.519 c\n-1.983 -0.583 l\n-1.529 -0.83 l\n-0.414 -1.413 l\n-0.258 -0.942 -0.132 -0.462 -0.039 0.026 c\nh\nf\nQ\n\r\nendstream\rendobj\r59 0 obj\r<</BBox[20.1337 155.636 477.734 19.9272]/Group 86 0 R/Length 101/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.315 0.316 0.316 rg\n/GS0 gs\n477.734 155.637 -457.601 -135.709 re\n477.584 20.077 -457.3 135.409 re\nf\n\r\nendstream\rendobj\r60 0 obj\r<</BBox[312.661 228.722 314.08 225.905]/Group 87 0 R/Length 205/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 312.6609 226.9642 cm\n0 0 m\n0.402 -0.636 l\n0.699 -1.059 l\n0.863 -0.261 1.104 0.52 1.419 1.271 c\n1.06 1.333 0.727 1.503 0.466 1.758 c\n0.273 1.183 0.117 0.595 0 0 c\nf\nQ\n\r\nendstream\rendobj\r61 0 obj\r<</BBox[33.3337 143.108 156.534 33.1272]/Group 88 0 R/Length 64/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.315 0.316 0.316 rg\n/GS0 gs\n156.534 33.127 -123.2 109.981 re\nf\n\r\nendstream\rendobj\r62 0 obj\r<</BBox[209.334 143.108 332.534 33.1272]/Group 89 0 R/Length 64/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.315 0.316 0.316 rg\n/GS0 gs\n332.534 33.127 -123.2 109.981 re\nf\n\r\nendstream\rendobj\r63 0 obj\r<</BBox[341.334 143.108 464.534 33.1272]/Group 90 0 R/Length 64/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.315 0.316 0.316 rg\n/GS0 gs\n464.534 33.127 -123.2 109.981 re\nf\n\r\nendstream\rendobj\r64 0 obj\r<</BBox[312.639 233.743 313.868 231.201]/Group 91 0 R/Length 227/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 313.8679 231.7733 cm\n0 0 m\n-0.248 0.634 -0.418 1.295 -0.508 1.97 c\n-0.785 1.674 -1.026 1.347 -1.229 0.996 c\n-1.145 0.459 -1.003 -0.067 -0.805 -0.572 c\n-0.585 -0.321 -0.31 -0.125 0 0 c\nf\nQ\n\r\nendstream\rendobj\r65 0 obj\r<</BBox[314.822 228.786 317.597 226.54]/Group 92 0 R/Length 285/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 315.8386 228.786 cm\n0 0 m\n-0.271 -0.288 -0.628 -0.481 -1.017 -0.551 c\n-0.712 -0.862 -0.387 -1.152 -0.043 -1.419 c\n0.391 -1.736 0.852 -2.013 1.334 -2.246 c\n1.334 -2.097 l\n1.344 -1.766 1.499 -1.456 1.758 -1.25 c\n1.116 -0.918 0.523 -0.498 0 0 c\nf\nQ\n\r\nendstream\rendobj\r66 0 obj\r<</BBox[319.207 226.752 322.279 225.738]/Group 93 0 R/Length 238/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 321.3884 226.5404 cm\n0 0 m\n-0.62 0.005 -1.237 0.076 -1.843 0.212 c\n-1.842 -0.098 -1.964 -0.395 -2.182 -0.614 c\n-1.431 -0.779 -0.66 -0.835 0.106 -0.784 c\n0.396 -0.513 0.658 -0.215 0.891 0.106 c\nh\nf\nQ\n\r\nendstream\rendobj\r67 0 obj\r<</BBox[315.16 235.163 322.024 229.761]/Group 94 0 R/Length 559/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 318.0417 232.43 cm\n0 0 m\n1.243 0.594 2.604 0.899 3.982 0.89 c\n3.699 1.254 3.363 1.575 2.987 1.843 c\n1.9 1.778 0.833 1.527 -0.17 1.102 c\n-0.382 1.102 -0.572 0.868 -0.784 0.762 c\n-1.291 1.375 -1.738 2.035 -2.118 2.732 c\n-2.839 2.457 l\n-2.46 1.702 -1.998 0.991 -1.462 0.339 c\n-1.977 0.004 -2.453 -0.387 -2.881 -0.826 c\n-2.505 -0.968 -2.185 -1.228 -1.971 -1.568 c\n-1.581 -1.179 -1.147 -0.838 -0.678 -0.551 c\n0.087 -1.326 0.916 -2.034 1.801 -2.669 c\n1.86 -2.402 2.01 -2.163 2.225 -1.992 c\n1.429 -1.391 0.685 -0.725 0 0 c\nf\nQ\n\r\nendstream\rendobj\r68 0 obj\r<</BBox[321.982 229.019 323.253 227.812]/Group 95 0 R/Length 245/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.949 0.949 0.953 rg\n/GS0 gs\nq 1 0 0 1 322.9987 228.892 cm\n0 0 m\n0 0 l\n-0.212 0 l\n-0.381 0 l\n-0.593 0.127 l\n-0.667 -0.123 -0.814 -0.344 -1.017 -0.508 c\n-0.763 -0.657 l\n-0.529 -0.784 l\n0.063 -1.081 l\n0.14 -0.836 0.203 -0.589 0.254 -0.339 c\nh\nf\nQ\n\r\nendstream\rendobj\r69 0 obj\r<</BBox[178.558 237.327 179.513 227.879]/Group 96 0 R/Length 328/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.969 0.573 0.118 rg\n/GS0 gs\nq 1 0 0 1 178.7077 227.9969 cm\n0 0 m\n0 0 l\n0.204 -0.175 0.512 -0.152 0.687 0.052 c\n0.761 0.138 0.803 0.247 0.805 0.36 c\n0.805 8.831 l\n0.804 9.002 0.716 9.162 0.572 9.254 c\n0.356 9.396 0.068 9.335 -0.073 9.12 c\n-0.129 9.034 -0.156 8.933 -0.148 8.831 c\n-0.148 0.36 l\n-0.141 0.227 -0.088 0.1 0 0 c\nf\nQ\n\r\nendstream\rendobj\r70 0 obj\r<</BBox[175.108 248.136 186.056 246.844]/Group 97 0 R/Length 276/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 29 0 R>>>>/Subtype/Form>>stream\r\n0.969 0.573 0.118 rg\n/GS0 gs\nq 1 0 0 1 175.7009 248.1361 cm\n0 0 m\n9.762 0 l\n10.09 0 10.355 -0.266 10.355 -0.593 c\n10.355 -0.699 l\n10.355 -1.026 10.09 -1.292 9.762 -1.292 c\n0 -1.292 l\n-0.328 -1.292 -0.593 -1.026 -0.593 -0.699 c\n-0.593 -0.593 l\n-0.593 -0.266 -0.328 0 0 0 c\nf\nQ\n\r\nendstream\rendobj\r97 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r29 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r96 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r95 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r94 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r93 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r92 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r91 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r90 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r89 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r88 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r87 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r86 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r85 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r84 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r83 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r82 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r81 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r80 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r79 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r78 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r77 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r76 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r74 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r75 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 98 0 R/ShadingType 2>>\rendobj\r98 0 obj\r<</Bounds[0.16 0.53 0.82]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[99 0 R 100 0 R 101 0 R 102 0 R]>>\rendobj\r99 0 obj\r<</C0[0.0 0.470588 0.831373]/C1[0.0745098 0.501961 0.854902]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r100 0 obj\r<</C0[0.0745098 0.501961 0.854902]/C1[0.235294 0.568627 0.898039]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r101 0 obj\r<</C0[0.235294 0.568627 0.898039]/C1[0.333333 0.611765 0.92549]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r102 0 obj\r<</C0[0.333333 0.611765 0.92549]/C1[0.368627 0.627451 0.937255]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r39 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 103 0 R/ShadingType 2>>\rendobj\r40 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 104 0 R/ShadingType 2>>\rendobj\r41 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 0.0 0.0 0.0 1.0]/Domain[0.0 1.0]/Extend[true true]/Function 105 0 R/ShadingType 3>>\rendobj\r42 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 0.0 0.0 0.0 1.0]/Domain[0.0 1.0]/Extend[true true]/Function 106 0 R/ShadingType 3>>\rendobj\r43 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 107 0 R/ShadingType 2>>\rendobj\r44 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 0.0 0.0 0.0 1.0]/Domain[0.0 1.0]/Extend[true true]/Function 108 0 R/ShadingType 3>>\rendobj\r45 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 109 0 R/ShadingType 2>>\rendobj\r46 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 110 0 R/ShadingType 2>>\rendobj\r47 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 111 0 R/ShadingType 2>>\rendobj\r111 0 obj\r<</Bounds[0.15]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[112 0 R 113 0 R]>>\rendobj\r112 0 obj\r<</C0[0.8 0.8 0.796078]/C1[0.8 0.8 0.796078]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r113 0 obj\r<</C0[0.8 0.8 0.796078]/C1[0.439216 0.439216 0.443137]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r110 0 obj\r<</Bounds[0.82]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[114 0 R 115 0 R]>>\rendobj\r114 0 obj\r<</C0[0.180392 0.462745 0.737255]/C1[0.411765 0.611765 0.827451]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r115 0 obj\r<</C0[0.411765 0.611765 0.827451]/C1[0.411765 0.611765 0.827451]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r109 0 obj\r<</Bounds[0.38 0.76]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[116 0 R 117 0 R 118 0 R]>>\rendobj\r116 0 obj\r<</C0[0.701961 0.698039 0.705882]/C1[0.690196 0.682353 0.686275]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r117 0 obj\r<</C0[0.690196 0.682353 0.686275]/C1[0.635294 0.631373 0.631373]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r118 0 obj\r<</C0[0.635294 0.631373 0.631373]/C1[0.592157 0.592157 0.592157]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r108 0 obj\r<</Bounds[0.18]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[115 0 R 119 0 R]>>\rendobj\r119 0 obj\r<</C0[0.411765 0.611765 0.827451]/C1[0.180392 0.462745 0.737255]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r107 0 obj\r<</Bounds[0.225 0.473 0.633 0.768 0.888 0.999]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R]>>\rendobj\r120 0 obj\r<</C0[0.196078 0.831373 0.960784]/C1[0.196078 0.831373 0.960784]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r121 0 obj\r<</C0[0.196078 0.831373 0.960784]/C1[0.192157 0.819608 0.952941]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r122 0 obj\r<</C0[0.192157 0.819608 0.952941]/C1[0.180392 0.788235 0.921569]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r123 0 obj\r<</C0[0.180392 0.788235 0.921569]/C1[0.160784 0.729412 0.870588]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r124 0 obj\r<</C0[0.160784 0.729412 0.870588]/C1[0.133333 0.647059 0.796078]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r125 0 obj\r<</C0[0.133333 0.647059 0.796078]/C1[0.0980392 0.541176 0.701961]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r126 0 obj\r<</C0[0.0980392 0.541176 0.701961]/C1[0.0980392 0.541176 0.701961]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r106 0 obj\r<</Bounds[0.27 0.49 0.88]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[127 0 R 128 0 R 129 0 R 130 0 R]>>\rendobj\r127 0 obj\r<</C0[0.996078 0.843137 0.0392157]/C1[0.996078 0.843137 0.0392157]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r128 0 obj\r<</C0[0.996078 0.843137 0.0392157]/C1[1.0 0.8 0.0705882]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r129 0 obj\r<</C0[1.0 0.8 0.0705882]/C1[0.984314 0.67451 0.113725]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r130 0 obj\r<</C0[0.984314 0.67451 0.113725]/C1[0.976471 0.631373 0.12549]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r105 0 obj\r<</Bounds[0.18 0.56 0.69 0.78 0.86 0.93 0.99]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[115 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R]>>\rendobj\r131 0 obj\r<</C0[0.411765 0.611765 0.827451]/C1[0.4 0.611765 0.827451]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r132 0 obj\r<</C0[0.4 0.611765 0.827451]/C1[0.380392 0.596078 0.819608]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r133 0 obj\r<</C0[0.380392 0.596078 0.819608]/C1[0.341176 0.576471 0.807843]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r134 0 obj\r<</C0[0.341176 0.576471 0.807843]/C1[0.290196 0.54902 0.792157]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r135 0 obj\r<</C0[0.290196 0.54902 0.792157]/C1[0.231373 0.513726 0.772549]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r136 0 obj\r<</C0[0.231373 0.513726 0.772549]/C1[0.188235 0.470588 0.745098]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r137 0 obj\r<</C0[0.188235 0.470588 0.745098]/C1[0.180392 0.462745 0.737255]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r104 0 obj\r<</Bounds[0.12 0.42 0.72]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[138 0 R 139 0 R 140 0 R 141 0 R]>>\rendobj\r138 0 obj\r<</C0[0.8 0.8 0.796078]/C1[0.843137 0.843137 0.843137]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r139 0 obj\r<</C0[0.843137 0.843137 0.843137]/C1[0.921569 0.921569 0.921569]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r140 0 obj\r<</C0[0.921569 0.921569 0.921569]/C1[0.972549 0.972549 0.972549]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r141 0 obj\r<</C0[0.972549 0.972549 0.972549]/C1[0.992157 0.996078 0.996078]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r103 0 obj\r<</Bounds[0.55]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0]/FunctionType 3/Functions[142 0 R 143 0 R]>>\rendobj\r142 0 obj\r<</C0[0.368627 0.592157 0.254902]/C1[0.419608 0.678431 0.266667]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r143 0 obj\r<</C0[0.419608 0.678431 0.266667]/C1[0.462745 0.737255 0.262745]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r23 0 obj\r<</Intent 144 0 R/Name(Shapes)/Type/OCG/Usage 145 0 R>>\rendobj\r24 0 obj\r<</Intent 146 0 R/Name(Text)/Type/OCG/Usage 147 0 R>>\rendobj\r25 0 obj\r<</Intent 148 0 R/Name(Layer 1)/Type/OCG/Usage 149 0 R>>\rendobj\r148 0 obj\r[/View/Design]\rendobj\r149 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 25.2)/Subtype/Artwork>>>>\rendobj\r146 0 obj\r[/View/Design]\rendobj\r147 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 25.2)/Subtype/Artwork>>>>\rendobj\r144 0 obj\r[/View/Design]\rendobj\r145 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 25.2)/Subtype/Artwork>>>>\rendobj\r21 0 obj\r<</BaseFont/FQGKJO+SegoeUI/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 150 0 R/LastChar 122/Subtype/TrueType/Type/Font/Widths[274 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 645 0 619 0 0 0 686 0 266 0 580 471 898 0 0 0 0 0 531 0 0 621 934 0 0 0 0 0 0 0 0 0 509 588 462 589 523 0 589 0 242 0 0 242 861 566 586 588 0 348 424 339 566 479 723 0 484 452]>>\rendobj\r22 0 obj\r<</BaseFont/NKFGRY+SegoeUI-Bold/Encoding/WinAnsiEncoding/FirstChar 65/FontDescriptor 151 0 R/LastChar 122/Subtype/TrueType/Type/Font/Widths[703 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 541 0 0 0 0 0 0 0 0 0 0 0 0 398 0 0 605 0 0 0 0 479]>>\rendobj\r151 0 obj\r<</Ascent 1298/CapHeight 700/Descent -431/Flags 32/FontBBox[-573 -431 1999 1298]/FontFamily(Segoe UI)/FontFile2 152 0 R/FontName/NKFGRY+SegoeUI-Bold/FontStretch/Normal/FontWeight 700/ItalicAngle 0/StemV 156/Type/FontDescriptor/XHeight 500>>\rendobj\r152 0 obj\r<</Filter/FlateDecode/Length 19304/Length1 56994>>stream\r\nHyTW\u0016/\t\u0005\u0011k}\u0004\u0017\u0004\u0011\u001dnV(j@\r(\u0002V9=ch\u001drF6֎\u001b\u001b\u0016.\u0015\u0011\u0003\u0015!\u0005y9{_;{\u0000\u0002\u000e\u0001\u000f'\u000e-\"?1ψ4\n\u000b*\u0001p0ϙlyɠ\u0014+/\u0007 \u0006[32FO\u0004`\na̤\u0015\u001e\u001b\u0000\u0002\u000b\u0001ɉq\tO1c\u0001@6^d\u0016m[O΋Kc~\u0013ĩ8\b;Z\u0011gfevꩻ\u0007PQs2\u0012ۑ/\u0007PδV&t\u001c\u0002pg'9/13I\u00175ٞ$\bxr;\n\u0014Kڗ={-\u0006Vr\u001a5G؇\u001d\u0010\u001c\u0007G\u0001[ŋ\tDMeAh{\u00028N\u0006T<9\u0002Kn42n\u001eZ >G\u001c\u0001\u0019ѥXiܷ|W~\u001c\u0017\u001bB~+Atd<!kho1k\u0006)=K3U\u0017\"\u0014\b߫\u0015/WS&6O46M֦mټýynC?ZZVYߤW|u!Րo8e`P\u0005ƯO$\u001f )4i4KZ\"ʤ\n =ܲY\u000eC~@9L\u001e.YrE>&f&_\u0014`\n653Řl͜Yencng1w6K\u001e@s?s(s9XZvYYXZ,,W--\u0001q\u0001\u0001\u0000[^\u0005AnAAAJoJI%_MCvegD\u001c\fs\u000eu\u000ewp*MM\\F3=՝nr+KQϯ\fŸ\u0017pӹݼ??W1E7|9xh\u0012K>t\u001ag6@e\u0014bAu/WWh\u0015k\u0019mѶjkuVF;ڻ\u00177.׻\u0018Nz.\u001b\r`H3,2\u0019F0.3\u0016\u001b\u001bN,[iHˤ\u0019tOj^c\u0015 wC\u0001`F{)g\u001bV\u001dю2EM2~fhǚ\u0013i\u0017[v}Ѿh2ډvN h]hn//K\"J`7K/wu|юpF:G:+f75\u00067~\u0019Lw\u000eݤ(s!A=PvgCpy4Gf%+\u0011Bޞ8\fC\u0003awUPŋm{@@?sDa\u001d uQ\u0004s\u000euW4zɫ\u0017{^ި\u0003P_\u000bw\u000eC:\u00168;\u001c\u000ec#ÑHu8\u001cVG#\u001ejgתLݨ\u000f\u001aP\u000b~U)76\u0001<aUnK妺JV*yubeV\u001dZX\u0019\"}\u001eE>\\֬)YZ\u000bp7&.#S1~Xj{;'\u0003h˖}<-[[OӧSZ\u001dw\u0002峗\u0015\u001df\f`xT2#͞\fc\u001c{|\"1\u0014c\u0012\u0016X֫G,+J-\u00169\u001dͺE4c;T\r{LjiVh\u000ejdt3[O\u001b\u0011mڞ6@]̿՚[\u001eڙ}L7tcYQK`z۬nww-\u001eǶyþ|\u0003a\u0015a\u0013\fkS(`\u0007\u00156'\u0012>W\u0004E\u0019)\f\fs\u0006y8\u000ba\u000eg\u0000\u0017!\u0011\u0005\n2\\G`\u001f\u001c\u001eH\u00063܀\n\u000eP\u000f\n)\u0006\u0019w̅bA\u0016d<\u000f\u000b \u001br \u0017 \u000fa!,%\u0018\u000eV(o/\u000b\u001c\u00118\u0012y$HQ\u0005M\u000fp\u0014\u000f\r\n\nF/\u0004\u001cc1\nxF\u00115E\u001dN\u0012^$\b'8\u000543p&\u0018\u0018s5\u00018\u00101\u0001\u0013ъIm0\u0019SPm\u001d\u0007P\u001d\u0007S1\r;/\u000eb0\u0003\r31\u000b;\u001f^<vǻ\u0001(a6.7@\u0019MhƮ\u000b1\u001f\u0017b\\h\u0000K\u0000r\\+;='\u0006B\r*RJ}d?9@\u000eC0\u00079B#Ger\u001c\u0007;9ANS&gYr'\u0017Er\\\"\nJ5\u0003 \rrHn\u000e7ո\u0006:\\\u001b?\u0000ڍv=ح\fh\u0010\rf<Pڗ\u001ft\u0000\u001dH\u0007qC0n\u000fWJ\u0007!4\b!\u000eh$\u001dNGБ\u0003~@GC:Qt\u001c\u001dOp!B\u0018%<\u0010\u0005P#\n?\u000b:^x,\u001e\u0013'ē)L<-\u0011ϊ\u0005xBn7Π3,:\"\f\u0013\"U9\\U\u001eEŪ3\\\u001f9_k\u0000<s^;D\u0010+\u000eb{蠶\u001aA vBb\u000bAM{{{[mjq߿N8\u000543p&8\u0007<\u000b<>.t\np\u0011.%\u0014?e\u001cWJ\u001c/+\\\u0014:V;wq5~kp-\u00017&܌\u0016܊p;&\u000eX&2^&Ȧl.[Ȗl\u001dlpl+>z{}^?7@4\u0006z\u0010o7\u001bFz\u0018o7\u001bM>>>&z\u0014o7MɆ(;$Yv]e7|,_ewCvy)nq\u0000\u000eA8\u0018P\u001cq\u0004Qoʼ6op4\u0005\u001c˗\ngZ\r`=l\u0005\u00116f\u0002[a\u001bldl\u001d\u0013vA,\u0000>\u000f\u0007 \u0015\u000e!8\fiP\u0003Q8\u0006\u0004S\u000e\u0019p\u001aj\u0019ȄZP\u001b,p\u0001.%\fW [4p\r@]ȁzp\u001dnMȅ<ȇ\u0002(B\u001fS*]e'7|*-\rw.\u0013p_\u001c\u0007\u0010\u001eb'bDeQET\u0015!Q]\u001c\u0016)j\u0003\u0010P\u0004\u0005.z\u0018(z\"M\u001cAJ\u001c\u0015ǐqqB\u0014Pc\u0011,>.2Џ0\u0014\rZ\f`q,%8-ΈL%ΊsX\u001a`Y\f\u0013\u0005qQ\\p,\u0011\u0018QX\u001e\u0002V\f:\u0010V\u0018uXae|\u0015b5X\u0003kb-u.\u00166`C'\u000bF\u000e\u001bD\u0007\u0018\tc\u00026f\u001c[`KL>Vؚq\u000e_\u001b|s\r&b[l\u0003vN\u000bvn\u001d{`O|.BZφX*\u001d\b\u001diɲն-j}fͱ\r{<o\u000bB[_')3i}Fg,}V\u0005}Q_җ\u0015k:G_7Mt.Ѕv;N:Iw]tWMu\u000fS\u001ftoG\rʵ\u0002+\f=Sҳ\u001cnq܄_6\u0017\u000bE\"}Q<Hজ͸9܊[s;_/Bl\u0002\u000f&U!I4\u0015#?\u0015P2d)@ũ\u0004RTPY\np*G\u0011\u0014K\b/<ES\u0005H(*S\u0015Jը:R\rI6աԀ&\u0014nÉܖP\u001e\u0016\u0011<ƫ<\nTn;ꮺ r}h0C\u0013i4M47f\\G+-Ŵѻ>/i5\rާԝi\u0007]Bi\u000f\u001e\u0001Jt0Q:N')N\u0019:G\u0012\rlʡKM(\n\u0016ݡ{@\u000f\u0011}G\u000f#=\u000e\u001e\u0013z3zN/\u0013zI\u0017>^\u001bv\u0018X\u001e5\u0010̬(4P1b4Cٰ\u0000\u0017\u0012\\Kqi.e9ù\u001cGp$GqySܑZS\u001bJԎS\u0007H(+p%9x\u0014q<?<\fsx.\u0005\u0017z[x\u001b'NN=|S?\u001fWk\u001b\u001b[\u0013\u001da{\u001c1'L2\u0017\u0015crMm\u0013M\u0018\u0000\u0007l \u0010(\u001e(\u0011(\u0019(\u0015(\u001d(\u0013(\u001b\b\u000b\u0007\u0005\"\u0002@ys<0\u000f#|ok~03?cjyf?\u000byi/k\u000fB)_ʿ|-(G\u0012U\n\b\u0016\"X\fK`)|v}~nw;\u001d\u000evCapw;\u001dvǸcqxw\rFGY\u000b`.\u000eS\u0012)6`\u0012-eK\u001f\u0007Sw;ɝNqrgsܹ<w hG\u0016՞\u000e\u0018V:2US,:sMs9䜁\u0015\u0001'TǝN3GG\ncte]E\u0005oC#u\u0002\nfZVkFU낏AmTfhQ[VMmWjکv\u0014[Q{>_%gȢ:uի|..Kck\u001b[( \u0004FM\u0002Nǀ'əL>朙3g4Q\u0004ADTp1f&.2KI}5FPA\u0011jpa\u001csN~&_}[E^#d\"^\u001f\u0012`-^+xttt\f(e\u0013JߦL'MoӦ3s\r \u0019]70g`\u0015x\u000b^*D,\u0015/\u000b\u0011\u0015bX.VbDY+\u0015SV|&։\u001fş\u0017KQ)֫!\\b(6A9\\S`-,d|h%Fe`\u001b\u001bXHr,GfO\u001c2yhWkZzE֩5ڠP\u001b՛̆\tY\u001cxz[ ]\u001bvG\u000b\u0006c\u000f\u00030\u0014\u0007 \u001ca8DC~z}\u001e\u000f\u00070}>T\u000fׇ\u0011p}>R\u001f#(=Zcu\u001e4x\u000e:\u001cx\rc\u0003F0\u001ca\u0004\u000e\u00118\u0012Gh(\u0018E\u001bƩ\u0003!\u001bƲ\u0004ȒGc6%\u00146ߋ\u0019x[\u0014\u001f\\1\u000bp\u001c&c\nTi\u001aD|]\u00131G\u0015b(\u0010b(7Ё\u0019x\u0007'd>>\bb@T,\u0012eb1>&t\u0007\u0000\u0016|]\u0003O\u0012ŪyV\n|VĊ\u0002V\u0016Rl\t[Y\u0005[Ɩ\u0015l%[>e\u001aV3\u0006mbq3|Gl\u001a\u0018^@x\u0011]̋i\u0001ϥ|\u0016-t\u0011O't\n]}\u0001=7ң\u001a^*+J/Fx\u0000|1|\u0019]W7\u0012jgxcNw\u001a~C\u0002K/}m\u001dOSɲfѩ\u0006iUd5\",\u0005X\u000b\u0014\u0017a\u0019.%\u0014˱\u0002r\\Ask\u0015x-u\u001aU\\Շ&~IWdg0\u0006~g\u001ck\u001b_Nm[ۣi\u0003AvX;\u001dՎDDz5[QQJ\\\u0000\u0006f\\N\\\u001e\rt\u0006܈p3\u0019x;C)MUޟ2Wy/r\u000fd\u0017<\u0003i;rj|\u0010\u0007S\u0003|\b\u0015\u00109ȇR$ɷ<\u0006\b\u001fF\bځ\u000f\u001dvb4 Hڙ\"h\u001a#\t\u001eEhrЮ<x\u001c<ERM.P\u000b!?K\u0007Bjejooz<Sdk43uE_SI\u0003\u0005Mnr'Fwi_r\u0016N\u0015C\u0014\u0010:< \u000fV\u0016[\u0007\u0000|!\u0019K5G\u000ei\u0012k\u0001o7C֒Gz4@iW\u000f?\tȓa6f'\n(p\u001c~\u000e\u001a\u0014O[5(M8t !\u0005JuT\u0007M\bJ\u000b\u001b=ًıjDŪ<Gp\u0007F0\u0007\nw\u0007\u001fJ\u0011.C3Z/70r\u001d8PŲ3]q\u000bݫ'\u000e:vX\u0006R_\u0002??8cJSN e39\u0000*?[9/#g\u0005V4)'\fS]D*J\u0017iw\u0012\u000e7\u0012\u0017656yU\\|\u0015>\t씻+s]\r\r?|w\u001bA\u001bA\u001b\u0003W-KyJH>~\u0001P\t\u0010̈́\"yȃ)\u000e\fI\u0003^r\u001cJ,|\u0000\u001fm7%zbs)\u0012\u0013ƎDGE\u001e5raC\r\u001e40t@~!}~^==-ݻu\u00129S\u000e\u0003PZ;of*%&?_\u001fo/\u0005)N6}\u0011h48f1)\rɡ\u0006`n\t\u000b\r1\u0000T\u000b#2\f\u0017MR\f^Zc\u001cd\u001b>kMr\u001a\u001cVD3}ct9\f^M*&fY*A-\u0004\u0003R\u001d]\u001d!\u0010\u0011!qxYd\u000ba(\u001ch3 \u0005j\u0003{\u001a\"ad;D\u0006I\u001b\u001aJ@O!\u0012iU\u0011/Ɂ9jwȌ:3紡%|K~C\u000fdsI\t\u000e\u0017SmV;\u0014@\u0000\\*\u0012\u0011H\u0017t)H2G\tOvϘnD˔5NMjf{GAk\u0015iO)lZ0l%\bK\u0011e<ߎ\u001aL\f1;ά)\u000e;K\u001a=;蒔:IRrdf[<\u001d׌<gg[%͔\u001a0^=MW}ώc?$8J{\t\f<$n ^S|Jb7\f參@\u0003U\u001bV\fP:Z!\u0014E\fM\u0012*TږL\u0013\u001aQU\u001a4M\u0016\u001d\u0012i}w9\u000b\u0003\u001c&,o99O\u0017\tVk6;g<W\u0012g~Xa&^\\,4n췊c\u001c̎<\u0015gݦ>im,?=]\u001eaF\u0007]VǬЀW-:o\u0004\u001b{\u0001A\u0004\u0007ὺnV\u0005l6]y!x?\t5Oi$\u001b%\u001aג*\n\n=|\u001b[R)=_wa+~-OU\u0001~\u0019_w&-\u0015)4'Tg\u001cocJd3j>G.#N\u001bX<T\u000b֩ӕ4cX:X6훜knv~#֬gqT5cR;=\"s:⎭<1m/?,\"~A=N\u0013\u0017\f\u0007yeݟ7'&xTPMw\u0003oSxҝD\u001f0k-.\u001cN\u0011S=]\u0004\u0001\u0005Q\u0010]=ttҠ\u001dx13\u001dF;\t2\u0001.%SEIE7di?jU\u0019\u001fA+ָ7\u0012\u0006P(椨\n'A\u0015#h\u0002F\u0013Lɬۯ])7'Ɣ`1\u0006x`^_a|vRd&[Yjt\u0000\u001cxh6]@\n\u001f/\r:n?S\u001eGx\u001aiI]\u001d㽤yYY_9a[;\u0007-\rbZ\u001a\u0003)u>{rt\u000b\u001f{p\u0005Xcͧv!gR\u0003@iA\u0004Z=ZݒH\u0016Ԡ\u0016CY(bQ?\u001bO,xw. \u00107~\"i\u0002ţO\u0005\u000f7\u0016ńLh<4\u000bxga>Ͽ'\u0002k\u001a#\u001d\u0006;Փ\u0017钛H;HN\bLhN7W@\u0011\u0019\u0016W\\/\u001a8É\u0013W/\u0019D\u0019K*Y\f}$#g/\u0018\u0014<wJːA\u0002$R^b\u0014%y^Y8\rl؍\u0012),\u0012qY\u0013J\u0018]tEL\u001dǮN=2%@{xE'aP\u0013\f\u0012ގ^棼yejKY7\u001ff*GG|\u000e\u0001Lƫّ1m3[Uւ7F$\u001d#l(1Q\"QK$\nN{i\"ӵ5!={\u000bo,\u0019'8\u0013)wK2`/qEe.QrJY&9:Fm)})+hw\u0013)iSDb:]̖S\u001d\u000e&R^'\u000br7\t\u0005{뼾0\u0005}uP8\u001c\fx\bL7\u001cB5ay\n{.颸r_ܙ9aW`r\bޔO\tp]<!`uciTE\u001eQdF\u0002sʲ,2\u001f;}[k)Re\u0014y^Լ5^å:wƃ\"\u0001\u0004m/+5G/W(T8\u0015Տ+6i~7+YOsؗNĦ}N6⻳lM'\u0004\u0014\u000f\u0011E#\n\u0011A,rkTcѡ\u001cl56\u0006\u000eME\"5l%UzEh]'M_V2ko=\"x\u001f|\u0012\u0013v#3\u0012\u000eZCe\u0015Sv8%/qtŎ\u0007f\u0010L\"\bS%,z_k\u001e*\u000fխRg˹\u0011ϻw'F~.\b'n\r֪\u0010\tk%X\u0012X)\u0016dU$Y:]vl@K$`(\u000f\u00050\u0015\u0015\"\u001dШgz^\u0001p\bBVL?\u000e\tm\u0010( }zwKv5!n;vN\u0005~o_;9vB\u0004wg\\?UWλOkx\u0007A5_kT-\u0003?GJq!I\u0017t\u001a\u0015G)&[BV2coC?\n\u0003\u000b\u001f\nt\u001c\u000fJA>+c\u0002?Ńv3u\u001ar&\u0015&j\u001aMjS\u0017^Q˵hvFNڤr\u00186ɤ+#y\u000b9\u000e\u001bHc\\Ո}\u0005{ۊb'\u000fz̏twU\rJP衵;4$h\u0010= }z\u001e%hHz\u0017t\u0013rzb\u0010I\\F!/m!I#{\u001f\nv\u0007\u0011z\u0007\u0004e\rq󘭘܈\u0005[>}\u0001Y>&\u0016\u0012|z\n}\u0004\r\r\u001e&<\u0012\rE\u0007}\u00139\u000fzY\u000e}tFZLd\u0005JJ\u000e)\u0001$<C\t\"[\u00039w%\u0005q9aV^AJ\u0002u\u00191\u00159\u001aQr\u0006\u0004\u000eR}\u0011\u0019!X9<7+1dD\u0007\rv!\u001e@\u0004\u0006=+tR\u001a,?K\b9k/=[s\u0011ބ=\u0010\u0013e'Ͳ:*0&ް1\u0005\u001a%M`\u0011u1sE*\u001c\u001ab\u001ae8Ӽ0\u00040]\u00079Ɯe\u00033\u001c1\u0018\n\u0015`Զҳ}<Է@|9u\u001c_P|,^$@{+q&\u0018P\u001b\u0012X96M\u0016Txۤ{M&y\u0011{vHo)C{YՍj\u0004}\u0010\u0003\u0012\u0005U\u00064:Ǎɏٛ\u0016\u001a6_Z\u0019јQ=j̤F_V7\tju#ƨ\r~XĞƂcHr[\\\u001aĆƤƅy=Ĩ\u00138PǄ\u0013_|M>ƣe\u001aFp\u0002 _\u000bNbS|1\t6ǞK\u0019_-\u0007G̫1omYy[#򌇿\u0014\\o$/(\u001f8N\\Ț4g\u00122ELo/5inbsZB\u00165/5Gn6O7ut+\u0019_Ĝ?9$#V;6ŋ@4\u000eX<s,<H<1ro:\u001c=:ey#\tot\u0001SRHj@p̶rqZZ]ah=~#gj8q.\u0001:\u0018ķ\u0003\u001f\\e=I\u0018\u0006ls~<'_>`NF73\u001d\u00033a\u000f\u001a\u000eSJHfd\u0016z{D_睰\u0002ֵk#1<နX?Lq@@GY\u0019\t'H6Z2ʕ6\u0006ʭFrY-X&ޣ7$\u001f\u0010N21\u0005pPQ#h>qO\r\fgn/~bLuxEx\u0012׫Y)ӹ551Ĕ[\u001fINv\u0014M\u0015r2p4F\u001eFv1kGn\u0016\u0001r\u0016UJ%aA]\u0010I)+N\u0006Wz\u001dR+tQ4ec\u0017y||tѬ{wrI))#68n~}\u000fܓ|,Nk_!'íB_O>^Qƭgn2q5{ѝZ\u001b9a\u0015ߩ.\n\u001f@JrR8'\u0013\u00132+YLsQCh.F{S[t\u000b\u0000?#\u0014i\u001dIw\u0005\u0013{c1?\u001emt*uc=(}\u0005\u0002/OV!\u001a؜sl\u001cyKB\u001eUƨJi\u001ed\u0014ya,\u001eѳ\\Ǫ)s.ѳA5՞W4_:\u001eD\t'?c\u001df3u8`z`|y\u0007.\u0007\u000e)F^\ba\u0019\u0000:\rzae[7/\u0001\u0000_>s\u001cCZo\u001aj?+\\\u000b<\u0004A0\u0014Ԝ\tǛ/l4Gov/\u0000\u00010m\u000eefK\u0004wN_\u0002\\|n>\u0006g!}ӟzfSjs\f%K1\u000b,Fbs2ec}o/v_VwYp\u0010#e\f\u0018`]v3,\u000f\u000e\\vw_\\isn\u0014lBvs.\u000el\u0005:l~㋮oGu\u000e'\u0000}VTf\u0017`|\u0015l)\u0001}Er\bK;n\u000e>?]?_#h'm:V'2S\u0007:\u0004~'b\u0016ß\u0002k\r=c\u0010N~=y<s3`y\f\u0006]\u000en\u001e\u0018\u0012h\u0004[y\u001c<Lm\u0011\u000bj`E~wkb\f7\u001aw?\u001f'xVwE>g~\u0016\u001df6W\u0003<\u001e4:P\u001a1\u0019[\u000fQǧm'MR\u001ck\u0019Pvyfץ=j0Oںi d\u001e;/=\f=wMւR\r$KO\u0010bk\u0004\u0002-A\u001c\u0018OKw[;:EBxmY6JƛU\u001bgyss;ӳe'q\n{L85\\AsJmNP~9t7\u0011=tyg57)[,7ڞ_w56OӞfoc'd?c\u0017i\u001fZt\r\u0001\u0006\u0003|EWR\u000fb\u001ei2>\u0006\tn\u0003h\u001b2{\u000b\u0019{v\u0012ՁBTy\u0011Fi\u0017sƩ4\u0007\nw;5J\u0003g2Ӧz\u0005\u001a\u0007;G\f8\u00029\u0005G@{5\u0016z:vWru\u000eM&wq=\u0010u\f=ji꾃^\u001f=~+vJCO7䧬i9w\u000bj9\u0015י\u0003Qk3̀!UQTu>4$uI/ylWֵ\u0019aq}i\u0018͑\u001fZ*X\"p\u0003ciXW\u001f\u000fJ5~[H/fs\u001c1',5\u0019ozΆ\tlu[ZGWN.%\rt<C7#8)eF%v\u00079\tܯFUћ<K\fWAR\u001d5Je|\f\u00125\u0015/t8se\u001b-[m_E7Bri\"~\u0007r,gk1lņۈ`q.r]\u0016\u0010;t`>\u0015d\u000ewN\u0006\u001c\u001b\fY\u0019VIʜ\u0016\rC<\u0006nlH^\u0017C/99N֪\u001e3b#c\u0018\tI\u00139.@Jll\u0017p\u000f{\u001bدM\u001arS\\6Ӓ%d,k#GO\u001a'clX\u0018;asȀ}ƙbw]p=\u001e:~BcwR\u0015'\\`\u0000}B\u001d0]W\u0002C\u0014F:TujŊxH⋡(v<Ri\u0017\t&ctR:ãlD\u0005̦&#\\DBX\u001e>کS;V7;}烙r\nUY<Ώf4;:S%\u001ao\u001bX!TT*f%h7ɲ\u0012Q\u001e\u0016;o29M$U~9P\u000fϦ$6$Щ'Ⱦϝ-M\t~1TOBʑI3P,\te'Уv}W$:5fq\u0012ʋ$_\u001dkG$|D?zT&2Ƴpo\u001aW{rFwp\u0007sOl0!o#E\b=R\u0004`)6륙_'x\u001d =b߭Q;?1,5$:k!ϸJ\u001cwr$]\b:Yģ\u001aN(|^Nys#o=C;Pq#\u001fjzn{w?Z\u0014Dit1SWnDYu3\u0017T\u0016\u0010*6i\u0005ˉi/@.οm\u0011Ki䑞JfƬa\u000e$ǼY\u0012gVƎ/aڬL4w `=\u000eTLӶ\u0013U>QR/\u001c*H\u0010T!Mۆ\u000e4\\rXa\u0011̨sdvOG\u0012+\\3\u0003\u0014\u0015\u0012Cͺ%@\n@\u001f|.PV[?Zfn9\u001fls$ޡ\u001b>%DғOC\u0004,w\u001cF\\v,إw\u0013>u\u0007ʈwAS\u001f\u000fpѿ1Ywa\tt;\u001b\u001d/Yg.Gx6\u001csot;5~zUg\u001dկEex'-wsF}\u0018il\u00107C\n[6WYÒz]\u0006F`?`\u0018j\bjl%%/\u000f\u0005|\u0015c,HL\u001fAy\u0003\u001b\\*gX>I\u0003ǚOx\u0018\u001ba<믫#{F~+\u001c\u0018\u0001\u0015\u000be>\u0013\\3L&i\u001fo\\\u001f%8\u0002Q\u0007Fﻟc~c$sZd\\e?_\u0007F,1\u001faX-Ee+s<}O\\W>\u0017\u001ds͜k%\f#jE\u001e\u0017pV^^yGB+YM_Ҥd97\u0018w\"˓o\u000fv(YnÙ%\u001a)ș\u001bb\u0012~\u0012tQv\u0016\u0012m;O|_K\u001b8X\u001dC;2I)c5|,ӴJ?9ԗ\u001et\u0018;%-дxH\u001dNN^T/m<}RJk\u0010\u0014=W)9\ba}>Shs%}/z2e3JNk;ERi$q;O2k!Z?YT\u001c/Wiiǐ\u0006+i_dkk}u\u001e\u0019\b\u0011ϯW/;W]`~,a\u0018+t2}BLo0[2\u001au2^\u0011-rEמ=\u001b?n&{\"n]>d$)]tI\u001493{2)\u0017uŲ'3w暟L1dm\u0015W\u0013ˤ%_tMOF&\u0012k6=\u001co^\u00059RyĿVC .:&㲶.lJHO!\u001b\u0019M~@pħI$g\r[BdHĨ\u000b+\u0019s\\|n9k,)\u001aC!&\u0019[jLCy\fOr\u0019lKc|6{sujCg\u00050Dao׵5T\u0018w\u001e駡#D\u0016߲s\u001d<}g\u0014mŷ\u001f?6n'JrG\\h{7BRLW+|o\u0014x\u000fe4.]%E撠֟@<MM3iKc_w)1z%'YTdb^Nޣĸ~s\u001e\f\u0019S\u0005wkia_]9\\ҼѣUchbvo4d\u0019#ހU33q?\u00150\u0017ޔ%\b~\u0005$>\u0015fRG\u0013JJ/u\u0006\u000eә\u0012k\r[n\u00069\u001f\u001ckV\u000eoXޜ;'Ǜd\u0016\u000fJ[\u0007|Ox3N/Z\u001e\u000b? \u001b\u0006\fMgFմw\u000f^^\u000eI\u0005c\u000beHz\f\u0015l/Pc~w\u001c2sd#l\u001fy̗8E%\n\u0010rVvlFXr|*o\u0016(\u000b#4\u000boo\u0016K3z\f\u001a{\\\u001a5n\np]LQT\u0016\u001aivn\u000b;EnD$ۃk,L\"\u0017l\u000e1UR\u000fVq`::\u0015_mkǺY*uLO7)7o&ka.=p\":m.\tkնԱJejL;\u0015n\u0011&`\u0014]~*\u000b56`f4B<l8yQa\u001b\u000f\u001d}:qډ}q~3i(2S\ne<\u0019dO#Ƕm?B>-}8Kl\u001d]#\u000fѶ1>v80!=p+e]8]>9}E\u0003],媇W@ߣ\u0010o|&O!=Բ_\u00176צ=F|h\u0015Pbr3\u0016E\u0017??\u001fW1Η>5WI;\u0019|^\u0006{S\"\u0014\u001fI\u001f\rfMn5gsypU\u0019qZ\u00026ARY\n\u0004PSV\t\u0004\u0012HI\u0010\u0002\u0004,!\u0001!T\u0016Lʄ[%E N[Z\n\u0016RԖ\nNXj[,Ӛ߹Kx<\u0011Й;پII꟔V;14k*7R>\u0004%z\u001dqr\u000e+m]D\f3i_e\u0002\u00107\\=BY'؋p\u0016/t73d\u0015{@Z=*;\u0012R~X:f\u001a&JŹHyՙ\rW,mG>7S_C\u0005ʚOR3ZYdxW*K\u0006r?ٓON?x(q)3a\u0007\u0018iA\u001dN?ѯ\u001b~d\u0017)\u000b/p8K6FvGP%FYz\u0013cV\u001b%\u001dx}DZY\u0005]5H)\u0006>\u0019\bQU2\u0001vp]-1^ЮV\u001ekM鼫\u001dN\bsa3?^1L'\u001e0z\nd\u0019T\u0018S*Ny\u0001rN;Nl3,u\u001e#B~ԅ\u0017\u001f%T\u0005r#j3\u001f\u0004\u001b=RםB\u0012زDL]ISbNO\t\u0002Ln߰\u001f\\\u001d\u0006:ϓN{d=,\r/r\u000e:1yK\"\u001eh=\u0012ƎG]\u0015OE/S|\u001dNYtѶ?+\u001eWx}kDm<X{<;]އ6\u0013w/3`T2~ImL\\汯\u001b-2]C\"#\\!Yz[eg|=ֹ{/}puþf=dwg\fڸ,>Z\u00029XnsDkZ1C_WOu7K)\u000f:оdX(sl{USc5J\u0011\u0019\u0010I!V\u0019ꚑ$\u001dl⭹wv紎\u001dT+Ecc?ß_\u001f\u001dS>˛C&3x!_mqJMn\fA9ލOFCy[\u0007=U>iekql__[2)\u001d\u001fD!X)c0\u0015\u0011\u0003t<ϛ3\u001eV7&bǕG\u0018Ruaͬ\u001bfYn[zStAf\u00192\u0013Y}\u0006|IvNk\u0019\u000e9\u000emb<pvL\u001b\u00071&\u0007\u0003KVDeIE]Ӗc&ƨDݮ(,-\u0019\u001f:۩3\u001d}\u0019\u000eMI盰\u001ez@_qI&~Mײ\u0015NķHܛ\u001b#mǫ\u0011tgc\u0005`\u001f\u0012ePR_\"~^N\u0007+;\u0007Fi'I\u0007W\u0011)H˟{_}2-\u0012\u001d;\u000f\u001c,7\\L_)1\u0014m\u0006wʽ^Fϯa\u001e^|;X>I\u001aR8ŁL3Qļ>CmۻsyNϝ}]cT$\tI?\u001d\"˩\u001b\u0002E\u001eB'\u0011z`\u001b\u0005\u0003\b>Y@!\u0017=\rius16-4y=\u000e9'\u0018w`;g\u0015 /羾/7C-w\u000eUčͼ;Ͳ\u0018\u000e\u00198Co>f?_*3\u001fSV\r\u001fĠ92QkD\u00122\u0012I=+Tb_I2e\u0015~QT\r\u000fy|\u0016HFmm\u001eoRv/~_dǐW\u00134үz)ui\u0017&KRNR?Ur\u0016\u0019g\t1巤ʑ\\0( ){+ۙRm\u001da\u001a`͔Ŷ\u0015rΠN!#q̳\u001fb}B,qnQC\u00059\u0000;,4_qB]Y06Ӳ9k.C3/I^JM-fLfk,|Fij\u0003{{\u0017k\f3Y\tw^8G\u0011\u0015t܄\\\"'\n\u000f[{\u000etZSH2+k2\u001aA+>$]\n\u0005Nzs-ݔmCK\u001fE#e.>\u0006B\u001a&UjTSf`\u0010#Uc$8ƹ8>2\u0005\u001d>ݟ?+%[$Ǻ\u0005N\u0016n\u0004\u0018\b:g/[9y\nv\u0003i碟\u00060ߗ۴/\u001a~y\u0017.@dg\u000eSܩ*a9`s~9\boz\u0004}=\u000bn>d|\t{()ʾb;[n}_k\u0011Nb9&( 6L$=\u0000x[y[_\"<ˋГt\u000bߺ\u000e{ZgSw\fg\u0004̇:O>%5M\u0002>z긁{[fu`E2\u0006\u0018+qG\u0016G큰Wb%\n;w;\u0013(e\u0007喿O,)z\u0006I=^zHG;*_}4Ў\u0018DLfa\u0017cnvS\u0013(R\u0007\f\u001e.y@K`]I+%'[&Dz_bMeA\u001a/t7WL\u0015\u0005;\u00061!ֹ\u00167o#NyIRu\\\u0014xM\u001aͥRd\u0010\u000b^\u0013Ζ\u0015FlW\u001eV\u001fE3>\u0001Y\u001fRa\u000eTZ3Ca5oc#l\u00011g;\u0019R>L*8\u0000#4fTC\u0013\u0012\u0018hDe2\bU\u000f,\u0015B\u0005<\u0002;/@\u001d\t\u001f\u0002Uq\u0005sOxG\u001eUg@\f\u0003!\u0010[!(B \u00102$<QJOH\u0013\t$\bax\u0014Bk+cmZ먈a*ձNgj\u0011Zۊ@*\"p\u000faZ;8vfsv=\u001b[\u001c<\u0006Ї\fd1\\\u001f\u0013\u0011}\u000fP%2'`%\u0014\u0003gXO[`2&X\u000fp믡m\bV\u0012\u000eH^Hb]\u0011թw\u001f7\u0004\u001bGTDBeA?] F\u001b%x~E@\u0002\"\u0012\u0011\u0002$:ȇʈC\n5\u001f!`\u0012\f?!8\tp\u001a\f\u000b\u0018\u0011^G\u001en/6k\u0000\u001c\fummH\u0007b0A=\u000f\u001coRB-rd9{r_3[;@\u0006\u0013\u000ffꝗ~e\u0014\u000f{ kij)p!G}=pֲn\u001c\r\u0012\u000fH^x\u00057/\"\u0019\u001f#c\u001cih\u0019![\u001bɃ䁾2u쑇<\u0017\u0007V)#\u001f%7YGGEji왅\u0019/\u00032}G#L\u0018Aȑ\u0001S%3v\u0019<(\u000fdl\b\\)3\u000bM\u0018/6H\u0013\u001352\u0006_9\u0015:.枔\u001au\u001eM~F|lr\u001bx}sFyX\u0010NX^\u0014qb}xYpnÔKs/y\"Ƃ\u0015\u0007Ǒ2,(#އ1\u001b\u0019Pg%=rAkuE>\n/\u000e\u000b*)_9$x_|\u001f'\u0007ӟ5-\u0003ISS\u001e2٘>\u0006_QRͳWXȼg\u001dv^~gv}-<ҹ;M.6\r=Ҡ\u001dpsO;hʒ2Z;:#\u0000;9x:)uM> B.7/aľX!~)\u0012LzG\u0019爛CD\u0006{C\f\u000fng\u001fw]F{<YqS\u0015zO/s_89\u000b\f\u0016yO:/%\u000b)g;{9:s%a\u000f\n\r\u0019yܙz Z\u001e\r]ZEz)%~7[\u0002Mf?bι'tf_'\u0016t&0%^5&+CU<3C6H;w{o'1{o7dTvWRU:wpoqVsZ&,\u001bgazqr^tq&r7\u0015R\\\u001dl\u0019xne`-$d<s\u00159wPɼ}<<Tɷ7xNQՍ\nVrR}x\u000b\r鞖4\u00054^<ͼ}y*/h:}`)ʫ\u0011C\r;>\u0000mF33\n*A+\u0001rvNx\"P2Jm/\u0017Uz\u0013<О\u0013zo\u001eĞiZ^rR\\9S3WD6\u000e\u0019oO)=\u000eX.aO5DzԙWŬWlY7\u001c[9q\u001eWeuLw\u000be\u000eRɷ\fg\u000e.\t\f\u000eL\u0006=?bv(s#p\u001b8@g$U5R\u0012,tK+\u000b\u000fE;XPr\\*W\u0018士qܓ\"k!t.,n\u0015n{̓\u001cۮɗesAwwU}s)Ow\u001dqx\u0003\u0016p7̄/\u0011J/\\(0##C6+35l\u0010FX8\u001c]\u0010\u0004&\u0017\"&\u001dP\u0000+!\u0017\u0012|d-K&Pr\u0004,}*[e\u0001l#Wܣl93l\u001a6\u00077˼ WץĻ#\u0017$;Nw\u000ezR~7n'n\rR\tmۤX/q>~'czeB-@4,>_X>gc8}\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018\f\u0006`0\u0018k,%.-\u0012-=$G6ؿUZ%C\u00013կ\u0003idEHw\u001ft\u001f\tZ-7#ݒH{!\u001d\u0019ut\u0017}ts#z1͕Q2ZƢ͐\u001aY$\rR/XVPw\u0013Z,ӿ\u000bA[*#i(ue\u0016uղF]J \u0013XJ[v忐R%\tYEL9eFkq&:jM\u001cYC{~І\bB\f8]{3\u0016Imd;\u0012jUk\u0013>6S\u00195;?Xe\u0012JZTB=\u0012c9ї[h]75«۠k#\u0017~!SINTx?-\u0012r\u0007T#]G)۸oZ/\u0019\u001d}\u0005^гQ(\\M[\u001b\u0016jW)k-SM7ef\u000ejVjg#&OU>4Q]=5{R}]է71!\u0012R$e\nX.;\u0004l|뱫s]uOi/#\u0012\u00163gyqʮ2=\u0004]>ҧU ~8>g.,N4,0IgnH\u0018\u0013ֶ1}-\u0002-[V-ƭ\u0012`]t!\t\u0016C7O\u001axBNPY\u0013\u001eV\u0003|?~sܼE8}N;}&]©q\u0018!;ZeGުxV}Ia±Z\\\u0007#ϿGJ$e,$\\Aia\u0015*8+/\u0019V_\u001aK7`'l_\u0007=qE_h\u000e)r\n$!i*\"µ\nŊ\u001b\u0014hθwW»\"Z5'UNRu\u0018\u0013I\"z,#\n\u0000 K\"@vAB\u001aY)2ëE\u0017^.2T\u0014bэV\u001cʜ_1\u000bI8WPcDľ)Hx Rsw@&\u0002R\u0007\u000f=~\u001fn׌j\f(\u0012\fÐ,\u001f\fJx⧳n{)\fH\u001fLzp2/U<0\u0018\u0018y\u0019'.λ\u0007~U}Q\rS6UnU{U\u001eUJn5ሐ p\u0018lA\u001522Mw\u001c\u000e[\t(8?\u0003Y\u0007|\u0001v~p\u001e9._|VX@.\u001d%8\u000e'\u001a\u0019\u0003-4聝#\u0016ǔk0\u00000n.+mwOv{\u0012s\u0002[\n\u0014]:\"ݖU j\u0010=~5\u001fb\u0006-fd6;\u00063n053lfTL6%S03mC`wx\rݕmhx'oE{3}=\u0000)\u0017gJ ts6S\u0012)\u000eSFzZ[/.p^(guceWy+\\SU{t1͛\u0003%Q}`y9=<z\u0007wdof\u000b\u001a\u001bKM<D&? v 0o<tn޻1Lg[:I>^~2W\u0001\u0000\r\nendstream\rendobj\r150 0 obj\r<</Ascent 1298/CapHeight 700/Descent -411/Flags 32/FontBBox[-573 -411 1999 1298]/FontFamily(Segoe UI)/FontFile2 153 0 R/FontName/FQGKJO+SegoeUI/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 80/Type/FontDescriptor/XHeight 500>>\rendobj\r153 0 obj\r<</Filter/FlateDecode/Length 25520/Length1 66744>>stream\r\nHyT\u0014W\u0016ƿnWS,6\"\bVuk\u0018\rq_1\u00127\u0010iWlT\\\u0013Ÿ%:LNtG\u001dc21fq5b4+\"4(hDQqih\u001cϜ}իߩ^\u0000\u0004b\u000eH﵄#.S2R3\u0016\bP\u001b j,}q\u0015N-@92Gettq\u0014РCF[,\u0004\u0012>\u0007jWNO\u001d\u0000\u0019\u0005z/\u0018-\u0013A1\u001b> u\u0019YӇ4\u00187g3-Ր@`C\u00193v\u0004\u0002Cl֢@\nzg:'gy\u0003*\u00073'gno\u000e`\u0014}h\u0019\u0018f^俨<\u001aa\b1\rB\fF\u0017x-W^t\u001dI\bV9O_\n47\u0018t7&|wClIr\u0011\fΕ\u0014\n:Hӌ%u\u001a\u0011/O(CSɫd+;?~N2\u0007S-S;\u00068\u0003\u0002A\u0006\u0005]rrr⍸\u0012QR+2rޘ\u0013Z\u0016uzi\u0003A`m6K۩\u001diW2mzTo\u0013Np}TB߫\u0017liڬ&fVu3\n_l\u0006V\u0016b\u000bE4[C[-Ֆn+絯omc~~~~^\u001c\u001a\u0016un\u001do\u001f\u001f\u001fm\u0012ѤF閭l&ǻ5mrG[۸\u0013ݝʴʇUʫ\u001eVUyz\u0006z<\u001e~+u54Η\f\u001a7<Sy\u0011s.`$+kͻ\u001c~~C-\f\u001dŒ#8!\u0019&\u0007-I\fs%Ze1h4]%`8\\Ҏh\u0017kZVC2l'-60=Sҗk_2\fɰ5::Ӻ\u0015a+\fSl#\u0019oydxQ2L\f%éSQ0_2LؘIߔ\u001d96u]\u001d~K2Lrwtwq\u001cVY^զ3.\u0019fzJ^\u0010J#R_y%^9\u0000_#)y>\u0007\r\u0013+<°Y/ʧT\u000fA\u000e\u001e穬O>\u0019R5555ѕr&2\\\\c]c\\\\\u000eHW\u001a7+xi&̗}\u0019c\u001eh%+s/n(˓F^ov7\u0004w\u000f:\u0016e\u0016\u0016e\u0017.\u0006\\*J2L>5Qo\u0014l(X]rǢ֣Ǧ\u0015\u000b^\rX[YZ<τ?%<1-?*4'L\u001e\u0010P]ݾ&tT+|P};FuZ\u001cYBz#\u00168\u001aI{vpOV7\u0007o\t\u000bm<ԓByȻdzBzuy\u0011;I~o!sj&\n\u001c;\u0006kX·TY_-;\u001b\u0011\u000e+p\u0013\u000b\to؂c1Hyy\u0005b%>A\\3jlC<#?p\u001cG\u001d#\u0018H1\u0019i[pg,(Ss8(\u001d,X8d`<&`-LLdLA\u0016b\u001aJ0\u001d31\u0003c\u0016>nC6fCƯC\u000b\u0019I\u0010\tԍS\u000fx%G'ԇI%\n@K1P?z@i\u0000\rA\u001e\r!4pJT\u001a@-\u0015HJ'\u0007 Ai\fY(B&nB)L8\n\bjM)&2i\"բHW\u0014Ei\u0012Mh:Q\u0016M3Q\b\u0017d%\u001bե4\fI\u00074ꑝb>ͦlC\u001f\\\u00015F\u0014\"\u0014|C|%\u0016\u0014;ſ.-\u0015{w{pZ\u0015#\u00038$\u000e#8&\u00138%N\u001b\fO\u0015g8/~\u0011\u0017ĿEqI\\6t0t\u0014WUqM\"_\u0010\u0005PD(\u00167-Q\"JmqG*2qO\u0017x(\u001e\nX<\u0011O3\u0016Jx\u00066`f\u0013+lf?Vٟ\u00038\u0006[8C&r\u0018s\u0004H\u001c1\\56K\u000bh!}D\u001f\"Zα\\\u001bpCnqܘ㹉<ћ(qs~[\u0016V֐hҰp[Nv$r{\u001d\u0013w.\u001b\u0002ݸ;෹'܇vJ޴M\u0014(.H)Vn*\u0012TU\u0003AzX=\u001eU\u0013I\u0018\u0003\u001e\u000f\u000fuX\u0004`pf7\rH<;lW] \t\u001e !\u0004\u0006-8]\u0007K\u0018\u0010(ŵ\u0016\u0015R+jMm\u001alO\u001d#uԅR7N='ԇR?O\u0003h \r40\u001aN#h$48\u001aO\u00135DI~Lww\u001aM\u0019+fi\u000eͥy4\u0016BZbZBKi\u0019-\u0015VjZCki\u001d\r6fB[i\u001bm\u001dv\u001a&\u000f!<p\u001e#y\u00141<x\u0013y\u0012'dSy\u001aO{\fO&3{?lsy\u001e\u0005\u0017,O_9\f]^Kx)/异W*^kx-7&ެk(\u001dctm]Gt}@7Ա~W4MthQU\u0007QuRU\u0017\u0015knz^~\u001a\u0006Aj\u001aaj\u001aFQj\u001aƪq\u0018ƫ\tjd5EMUt5C}f,樹j\u0016H\u0016%jZ\u0015jZV5jZ֫\rjڤ6-+T'f:Q7-tKJ?sBԭu\u001bVmUv]+w܃{r/}/n\u001bv\u0000\u001eu s\\6i\u0017\u0004a\u0005\nV\u001aX\u0007a\u0003lMPγ\u00116\u0016\na\u001bl\u001d\u0013vn\u0003{a\u001f\u0003\f\u0015 \u001cp\u000418\u000e)p\u0002NBEHSP\t*i8\u0003g\u001c\u000bp\u0011.eHp\u0005B\u0015\nנ\u001a\\\u001bp\u0013nA:d@&di7\u0001Jt\u000e\u0011:J8\t:ItN}y@\u0017\u0012]4\u00175N7&ݢtʠLN\u001cwR\u0013~跸\u00136܁{\u001e\u0013<q7<_\u0011\n\u00043x\u000e/%\u0006;x\u000f\u0007\u001d>\u001f'|\u0005=\b\u000bd\u00102jtPРܘ\u0007\u0018y1\u0010>̏\u0005 \u0016 \f\u0010\f0\f\bX\u0004b1,%p\u0017RX\u001a`Y܏\u0000\nX\u0011+\u001eU(6ݡC>D\u000fgzH#\u001e\t=g^KzE\rw~\u000f;}?OD\u000b{l(\u0003Pr.VLX\u0015a2\u001ed\u000e\u001e,l\b\u001ecx-<\u0014<\u0001\u00039\u001f\\\u000br!<x\nO\u0019<A\u001c!\u001c<^\u001c\u001c\\pQ.%sIR\\9\u001c2W\fr\\+pEĕ\nWj7;WWO\u0017_\u001b\u001f\u00155\u0016Gq4pmu\u001e\u0006~\r9\\5us4\u00117&\u001cܔ\u0013\u0019'rsn-\u00156֤\fi\u0006nC7m6v0\u001bn#l\u001bƻM\u0004\u000b\u0016P_/\u0017\u0015\u0015\u0015\r\u00168= \u001em=aOT{ʞgY{Ξ\u0017E{^ijiota3mͶ\u001d\u001bgmS`Dܶ-m+{׶ml[~k\u000e.6&r\u0004;NIveLq|---d;\u001fL\u001dS5L}44&\u001b\rzüBlC\u001b)Z\u001c\u00111b%\u0011\u0004H^\t|OK\u0001)($H%DB%L%B\"U\u001b獕RDJ1).%RFJ9)/\u0015TREJu\u0019-cL#41=M/1}M?\u0019;\u0019Nd;;]'ǹ'%e\f2^&z\u0007HL2MZ\f)d|#se,ŲLV\u001a!륵lͲE6.;d][^'%J\u000eH\u001c#rLR䤤Y9'\u00175)$Z%SHm/\u000f<D\u000by%oy%\u001f\u000eQ>gb<\u0006\f\\FI]CF\u001bc#tA2\u00042\u0004|5>\u00140\u0005M!\u0013dM\t5a&DHS\u0014>1EMIXi$I4\u0004i&)aJrI4@3\f5_\f{P\u0015\u0000{ρw?|;\u0004\bB\u0004\u000b\u00167\\\"C\u0004[)nZ_R]i)Re'yE(\u0016eBT*\\T5b\"]b8 \u000e8nΈ₸\u001b~\u001f\u0007`?̏\u0018?\u0003\"V0lkih&3m-Y\u001a[ώc4;ΰ3,`\u0013mM)6զta3m\t2\u001dM't1]MfBL\t3&D(D\u001e&Ě82M\u001f\u0006e-)'-H_֕Jjid}@6dcD6dsBdkF\u0006ȶl/\u0003e\u0007\u0019$;N\"`MP\u0019N\tHIL)JiN\u0019IY4\\Gi\u0001-EP6P.Rʧ\u0002*\"*\u0012*2ZFTATEi\u0005UJZEi\ru6FDi\u000bmmvNEi\u000f}\u000eA:D\b\u001dctNI:E]:CY:G\u0002]K\u001bz~K\u000f2}H\u001f\u000f1}BW*]O3H?_)=^+zMo-;20r\r̵Xǒks\u001d.+lr=\r!7܄r3n-%܆\u0003-\u001c\u001d8;r']+\u0007s7\u000eP\u000epH\u001c=8c9{r/}/s?\u0003x \u000f<0\u001e#\u0017KZ|#\u0015\u0013߉p\u001d\u001f\u0006\b7\u0016܆;\u0013\fw\u0017\u0007\u0001<G\u0018Sx\u0006\u0005W\u001a[tE@\u001aX\u0013ABZ(C\u000eX\u0017\u0015j4h\u001e\u0006\u0010\u001baclM\u00196\u0016\u0012[akl\u0001\u0016a{\f\u000e\u0018\u001d\u0013v.\u0015\u001b`(a8F`$Faw\u001e\u0018\u0018=\u0017>\u0017\u001f\u00018\u0010\u0007`\u001cCq\u0018\u000e\u00118\u0012Gh\u001ccq\u001c\t8\u0011'dSq\u001aN\u00198\u0013ga]v׸kuI)i\u0019Y8\u001b\\q\u0001.E\u0018`6)fL\t0\u0011&d\u0002Sa\u001aL\u00190\u0013fA\u0002$B\u0012$C\nB\u001aC\u0006dB\u0016̆90\u0017|X\u0000\u000ba\u0011,%\r9\u000by\u0014\u0000\n\b\u0004J\fA9T@%TrX\u0001հ\u0012VjX\u0003ka\u001d\r\u00116f\u0002[a\u001bl\u001d\u0013vn\u0003{a\u001f\u0003p\u0010\u000ea8\u0002G\u00068\u0006\u0004SpL73L3$D<\\XXXX˰\u001c+\u0012p9j\\px#zzWë齣*<?+|9u69뜃pU;\u0017K\u0015ws޹\\NS\u0002^;\u0017uj9\u00187?t#TGz&;x'ݼ>\u0007\u001bɇ0\u001f|\t>ɧ4g=>x\u00141<.\rl\ra6J;O\u000f\u001bEek\u0004ȓT*Eu\u0006ufd;C\u0004}^Qo\u001fM}Kv\u000e}G\u0003P?ҏ\u0013T?\rBԯku9lB\u0017r{}H}/Fz*.e\\\u0015\\UWpY#~\u00147-q[\u0011?]'\u0007l0\u001bM\u0017Gx\"dbRMI7\u0019&d`MP\u0015UTQV=TUqz>WT5@\rT`5D\rUp5BTh5FUx5AMTd5EMUt5CTTJ4&<\u0002STJQ*M\fl5GU|@-TbDe\u001cR\nT*\u0001mg@F\"\u001bilw\u001bm{\u0018\u001bkL)1,3T*ܬ0fYeVgx!^z\u0003 o7D\u0012uN:E43tҳ\u001c=W\u0002P/ҋ\u0012stKu.ЅH\u0017\u0012]2]+tٯ,~Ҧ\u0013l\u0005*\u0002Z\u0011Є)3IAm0h[oO\u001dƙ\u0011\u0011\u0019Ҳ}+R@\u000bkY-@\u000bU\u0007(:$s^Z(93r=,97=OU~Y(89^N\u0013$9YNr&\u0019r%g9r'\u0012@.bH.r\\&ˏ\nY&WJU\u0006*Zk:^\rr$7-rDVmr!w]r#t3|'[{\u0003<$\u000fTq\u0006Y8\u001b\\D\u001eG1y\\')yZg姸\u0000\u0017\"k2.\u000f)Ve\u001f9<//ȋRV\u0012,ť\fǸ\u0002p%\u0018U\u001aZ\\\u001c7F܄q\u000bnO\u0002v܁;q\u0017=\u0017~<\u0007\u0010\u001e#x\u0014q<'\u0014\u0019<k\u0004\u0015ʹٴŚfM畼\u0017q|<'I|2T>O3L>s\\>%|\u0001_\u00172<W|\r_Tߎd;l\u0013K\u0016^b\u0014&>`\u0018V$Fq⏬XϦlx\r\u0016`R6e\u0004;IBH\u0014R\u001d<\b?U))Q=\\ʖL\u0014\u0015b\n[)\u0017\u0004₽\u001b>\"UjnvYlcb;{Y\u001caQqL\u001cJ7j2/\u001b|\u0014gYl_6\u000f?\u001c~\u0002^JKx\u0019\u000b\u0012`\r;/6\u000bb\u0001E\u0016\u0012\u0017\f:Q\u001a2\u000b\bQEuQ\\\u00115ek\u000eC\u0016,\u0011H\u0012e4(\u0016f1Xh1Y1Kei,]T\u001b\fW\rWx\u001d\u0006\u000eF\u001a|x\u0013\u000f#\u0013`\u0010CV괯\u001de\u001fc^f\u0010-\u0019WWOg&e\u000f\u0013r@f,(\u0007E[f\u0011C\"IrXg\u001cS\u000e̪PHdM\u0013\u0011nd1bE'x5\u0013S\u000b\u0013])\\<T$xFt\u0013ϲ\u0016xN`)%2)W//\u0017J\u0015slr\u0014\u0003Qf=Y++\u001bfG!rX\u001b;1HڊX;,AMx\u0010\u0003օuU~P~<.\u001a4\u0005\u00051wI\u000fPMhl}\u001f\f\r\nCpceġ\u0005`\u0017\u001a\u0001\u0013]u}g\u0018C!ew5J]׾Ŀ\u001bQ\r\u000bCiz~>P\nRB\u0006!t(C6*<\u0016\u0013Wo\u0012ma\u001e]\n9BԹs$sDj~s=\u001d\t.߆`\u0004xӍ\f\bºq2&SK`\u0004GG\u000e\u0007\u0005dN^XHk\u0019Q>-\u0011-\u0012\toh(;MW`\u001aT\u00047\u0007o>x\u0013މM\u0003\u0016\u000e\u000fa\u0018\u0006򃝠\u001a6׻\u000f%D;3AeT\u000eXN㦟\u000f$\u0004W\ffШ.E\u00062;\u001bI\u0014>[\u00035P\u00035P\u00035!{\u0018CCe\u0005mPFl;*n\f\u000e߼K`\u0006\u0018U0\u000fҨ\u0002X\u0013y`9t_WQEF5^fѾA933R'w=lg~kOvz\"c\tڶi*q\u00166k\u0016\u001bH&V\u0016sca2r\u0003S\u001aEG##t^\u0017Ƥ]\u0005jlJjt8\u001dfj̼;,Ή\u000euVjT\nZ\u0007\u0003Q\u0013\u001e6T#7\u0011gsx9R>M0,mǩ\u0011O*zm><ZI\u0015\u0006V\u001eDBH{r-z<?\u0005r\u0003\u001d\u0015\u000f\u0001clS\u0005k\u0000ThHB&\u000b\u0006zSաkA\u001f\\BsL\u0018|\u0005\u000e/\"˭ڈm~?mLl\u0018t\u0005w\u001bR\u001c)C\r$\u0000\u0002\u0006N\u0012\th_\u0007t\u001e0\u0013atu\u000bDbI\rKk\u0005jra.1\u000e'ō4X)\u000fU\u0014ݯ\u0002ra-W\u000bBNQ\u001bՂ^\u0015\nm\u0015r3\fM0\u001c>`\u001a%\u0000Dƻi\u0003rHDKQͳiv;-y6WOm.\u000e\u0007侼1:c)18UR-\tL#\"|%\u0004>]\u0010\u0010tAdZJ\u0012-|\u001aI.w\u0014Ԟ=ooUm;eCaǺPr\u000b4\u0005^m\u0002phxEy\nZ\u001c@q\u001c\u0005iD?k\t z}\u00162)k\u0004\u001dIQ\u0003ds@+&{:QAir\u001e6d6\u001f\u0013ak36W\tfNUthv9xqU{汯n;Pg[;q7yyqeǎʩPT\tI\r6\u001a.h\u00024(j%hl\u0018\fDH1\n\u0015BCh\u0010J\u0004D!p].E\u001f{Ν;9߬\r\u0011:\u001b\u001dzݠBQ⨫/[ʐ/50yZOՍY3LP$L!_?`@T\u0013qԖ;\u001f?dFr\u001fud̮.'һғ1Ģ=\u0011o3Z翅}\u0015uO}VPoH!yBU0\u001c\u0014o;}p,\u001f?p:Em9W&\b\\0{e/\u001e\u0012S\u000f4e\u0003p{\u000e\u0018\u0013NZ<Ef*n\fW\"\u0013+z.hNr\u001erf\u00116VNw3+\u001aB\u0012\f,YA\u0004U&\tG\u001c3;clș\u0006gE]*z=q\u0015H;\u0012Ձ\r\u000eTrI\u0017cm\u0018/\u001esK!_\u001fCC\r\tgk\u0004!%u\u0019%#^ڱ#\u0004Im>}ά\rs9Dvf.\u00039c{${xeb\u001a\u0012ka䆰\u001d{\u0015\"0[[eڌr\u0017ѻ\u0013y\u0016+{ݮE\u0005\u0007!:\u0019rTi2\u0016.}*\u0012fȄm'Rf,a~\u000buq'\u0002t'L\rgd\u000bqYe<ӟ\u0010@w\u001fxɘͽ\u0002yI\u000b\u0016\u000b\t\u001bmƆyT\u000e>8\u0005<\u0015\u001fSBɧ^T_d3\u0001#R)bWvK|\u0019}_\b\b8k\u0002=\u0017ؤ\u001f\u0002`S{\nǽQ1;\rջd'\f\u001f#a$\u0007{\t߱Q)1\u001a\u0005Y$i&\u001d<e2^\u0007gz\u0016bzYҵk@\u0011Ř58\u0013Uۊ\u001bDXr6N>ԘZ]\\%޸I4C>~-Q<\ns|]\u001bnY\u0014P\u0002(E\t\u0000\b\u0014t%\u0000;acpCAN\u0015\fx}=\u0001W\u000eWmlOH\u0010Ch.\u0014r {B~E\u0014ހ'?#ó\fd<\u000e*~|dRI\u001a\u001c\f,lO'-W+-\nz\u001a-\u000b,z|33\u0019E\u001c\u0019\t1.& \u0015\u0011'\\nQ\u000eO6,_<SQ$_\u000fj|2}\u000fnI#\u0004vh\u000f3!B(\u0006~K\u0010ȁ+ۧ(9:юF#Bd4'D\u0014%\t<\u0012S\u001avdR.Cuq8%h\u001e刂\u0003>,ڠbRz\u0012a-+8XB\u0006\u0007\\\ti*7ǢZ2Sͭ;_\u0017_aӵ\u0017M8\u000b>x\rP\u0000\u001b0~rxxxx5_z\u001b.e\u0017m/AH\u0002U(#J=6u\u000f`\u000b)\u0014\tX,*\n\u0010\n\u0010\ns!\u0014v\u001aIh\u00124۵F\t6'@]VsRC$i䡩l׹A\u0016oK+-\u0016\u000eoB/~5;\u0003'`\u00042\r?9}6nx\u0013^}\r\t\u0012r\b{Ad%v\u001a ,\u001d7\u001a\u0014\u001c\u001a\u001b(']@Ke߱?w*\b+頀W:\u0010TݏVU\u0005\u000eVy*Ȳ\u001dP\bԧ8\n.%\u0006Y'\u0013K2$\u0013i7~'ч]ۋ~\u00072cV35`:Jbʹvڧ\u0007,{\roֶB\n\u000b\u001fn[\u001a\u001bfJ]`n|nn_!|qЉo :`{A\u001a\u0011\u000f2]C\u000bgyV|k'|u߲m\bD$$F:!8c\u0002\u0019Pˀ!$w<\b\u001bs`\u0015˷t\u001d[\u001alڎ/E>6\"\u001c*tB>וVA\u0006\\a-\u001cF$mbË\u001c\u0003Nw\u00030\u000fn\u000fE\u0018\u0006\"\u0005Lx\u001a <8H7fbY\u0014\u0007.҃i\u0019ִ0\u0001TUr\u0005U1-\u0007%=RUE$υ\u001b0\njٻϏտ&L_GR׉Bf{pK\u001d޵]-c5d`s5dFǦ^Ey\u0005!^J\u0004\rQ\u0010j<@!3t[\bE@b\u0000\bMM\\S0\u001ajZ⯖=\u0015@\u0003\u001a@S($\u001f!4M/x)噋R\u00136;+Y΢ƗKzFL5mYZXZlYIH?(D\b\u001a1$($jW\u000b>~G}6֮[\u0007F&\u0007_\u001e\u0019XXWwahc7=44x\u0017\rl{թfckvoTWė{c+2d&\n\u0017>Ti\t\u0015\u0000BBM\u0010((-5W2\u000342Z\tv{\u0005%8\u0017\u0000ߊ[\u0010EA!:TT4\u001aV\u0005<$2\u0005$*\u0010\u0017ɯ$Q\u0011ŗ \u00047U\u0003\u001c]۽KGr!k\u0016\u0005CJ\u0019tz`L:\u0019F\u0004F>L{)X\u001cTlA#\u0004\nmXH(:\u0018\u0005\u001c`\u0001QfH͑&ٽ{~i\u001eG*ޤ\u001b\u0017+`06X[\n \u001c\u0004\u001fw9wptY4\u0003S\u0004y`]c\u0003p\b/h!.%Nm.\f\rE\u0000MEx\"l\u001e\u0014M'V\u0007X\u001d;[QmV\u0019\u000e\f\u001e(\u0016\u0006\u0011\u0004]GȬnȬn\brX]\u0011+\u0006O_C!X<JѯM$+d2\to\u0012F.\u000bv\u0007kz\u0004mv\u001fǐp\u0003{I$LJ\u0012#\u001eSɆJ'\u001fq\t_&/\u000f\u001a/j̿\u00037ϖc>\u000f\t_z<_D'lu\u0002\u0005\u001eR\u0001@ISsi\u0003Mo\n7\u0003\\l4\u0017 ^RJvi3\u0005o9A7Z\u000eucʁ%q8\u0015|q&$(}$9\u0015g&\u0011Nb@\t\u001f\u0011\nZE\u0019\u001b\u001fIUkV\u0004eJ\u0000ՄH Z\u001a\u001f3MnA/&B2)WXnIޗ-\u0016AP>d\u00016\u001e:&\u001cl:F;[h~j\u001f\u001fھczg{\r\tf<kaP\u0018\u001eY`UJj&%,![(\u001c\u00111W\u0011s\u00151W1\u001d0+/KZ\u0011|\u0014\b\n\n+\u0018t jn2pp\u0002Z\u0006Żn1P\n\u0018G\u000b\u0014\"\u001aꝨWT\u0019h5\u0013o\u0000\u0013#\\6-z쯷N.ر2-ݰk/JN$3e>8s8l;`.@%is\u001ecM\nJ\fXXyݽfROvU&\u0011*B\u001cB\u0007\u0003\t\u0016\u00169F_#@>:ΡAM}-'\u0006bRF}oWOuՒ\u0017iR&wθƁ)\"df\u0017\u0004b\u000eh&ć\u0010Tu\u000eC9R(o DM^\u001d\u0001L0\t\u00060@ڊau!֡M\u001cB\u0013\u0013\u00166\u00041c$\nd\u0019,/P3\u001bw={{zw3\u0006.mZN\u001aY硇\n8.Y i\u0001V,\b\u0003N\u0005d\u0000>\u0007WPZ}\u0016\u000bI{\r*19c\u00079\u001aRxBA\u0005X0C\"AD.q\u001e\n86\u001dz\\t%\u0002(\u0004y\u001aS\u0007e>lZVUb),\\\ro\u0017V_҉\u0013vYC\u001cYy.Ik\u001f_IҽJ~\u000e\u0001RA~v\u000bq\u0000+PC;$\u0005\u0000^l:԰'IydN\rO\ra3ѡ\u0018\\٪\bF04u\u0011\u001e2CW݅\u0010'\u0006Wa1:Z!W%}@s&hd\u0005A\u001c\t\u0007o*]-\u0017W\u0007\u0001:;{wgfl;}]Lyн6e{\u001f9.n=\b\u0013|\u001f\u0017<E\u001c⒜Sdީ\u001b{] y,\u0003\u000f\u0015-\u001bL-F\u0004\u0017\u0012\u0000Y7\u0000]T\u0001=z5MMl\u001e0v\u001fs\u0004=D7\u001cZ`Y2^ae'ż15oL)ݽ1fGa\u0016?8ES8Z\u0002~\u0003Eŀvm4h7\"ǫ\u0010\f\u0000م\u0003GSnM+A\u001b\u0003\u0018@w\u0002{6\u0006߅\u001fa\r\u0003l\u0018`9bD6Rf3!\u0016e!`fU\u000fi&\u0018'\u0012MM\t?&|5f,\u000e:\u001c`csBEQ#Yَ\u0015\u001d/e.\u0001H7~JxLfڮY;Ĵ_\u001d#o3̲QfܰɂCMK\"'qH$V\u000fg~DoWb\u0015\u0018m1H͑[j{(PA4GBIUe7o\u0014\u00173N>\u0006u\u00103 #\u0007hPs0ӉI\u0011 fR<KiդA00j_\u0017tiPՠ(#\t\"Y}\u0016\r\u001e\u001c.\rl\u0014\u0005y2\u001fQ\u001dhnfhͿSCG^\u0013)Co7v};Gqa.&4b8I0}s1\n\f3\u0018|N\u00173\u0006]Lcbz/;Yp1\f\u0018)&@ީD\u0004BV\u0010;;!(v\u0001\u00100\u000f\u0001\u0010`ͺpUEK!\u00078㈷\u0018\u001c\u00024xn?fю5)]ۓ#g\u0016,u<\t,A/j6-h6\u0011V^*\u0011 >Vצj`&!F(뀥ͤj|~uIZHuÇZ\f\u0011D\u001dAF\"\u0002>|\"t\u0001uɽPw\u001b\u0010T\u00184ԭm /ɆZ\u0016De\"c/\u0017zK\u0018\t4\u0005=zrն?U4}y&E\u001f暩u|ږd8<vF\u0005F=-\u0015\u001e_?j'8ZYݢV&#[-j4{Ζ{B;`㰁guz\u0015FAi[\\\u0003|}&e&:5\u0012}\u000eM¸uqY\\wqRE|c?.\u0005OAE\\0P\u0005\u0011;L$\u001bej[w3R&ƫ\u000567̲^{\u0017\u0018\u000b\u0012JLY5 0\u000eJ#\u0012\u0001rRD\\\u0012 \u0002F$E$[|\\J\u0018iX.GQ>Q\u001a\\pih*D)B\u0014(J*d3=\u0006րky3f#\b\u0013<pق\u0016Y\u0014o=d\t\\a)B\u0016>BfH8\u0010\u0016Rsa\u000f~3ŋg։%\u001c\u000f \u000fO KO؆j~v\u0017EЋL 焥#\u001cih:v\u0015q^~};\u000fnc@|g\u0010AcؖCMU9\u0010XD\u000e+\u000f\u0004b\u001aǿ\u0006>8щ\u0010~֢ʧsli\u001c\u001aŅ\u001cҎ^*.B(E1'4.#f(}S\"\u001b?!J2߽cg3BU\u0000AD)R4PX3{A܇5\u0017џ\n\u0017uQ6$i!\u000f\u0013\u0015!Qĉ.Gw\u000es;6Z\u0017b\u0010eφ\u0005@h\u001d\u0000\u0006`_\u0010'A>\u001a\u0016OQ+!\u0015\u001b\u0012\u001e\b_\n/\";\u0013\u000e\u0012͉\u000ex,-LG,\u0006i?]!X\u0018..|DH)9\u001d\u001fw\f\f_j=\u00194\u0003F8;8s_k3\u0006b\u0018;%3&OJM\u0014>n\nF\u0005\n\u0010Q6j2/<7`n\u0002(\u001c\nGI\u0011d+ \u0003_nZ\u0010V\fE}\u0001D}\u0001\u0014ܐ'W\u0002>;8\u001a9\u001b@\u001a^xZEWs&\\Uib35\u001e1ҌXfX(y7\u0011+ԥo\u0002\u001aWaVU^\u0012@-6B7o\u001d.\u0019l\u0002~E]\u001fU6&dHʧ\u00123͇M#d1'r4RR#)`\u0007\u0011\bK\u0016T\u001cT*qm-\u0010I\u0014ײHK\t\u0011KvcqwFiY {Sh.7su#8/(@Y{ԃcn<\t;\u001f\u0012-\u001d@}!\nqް\u0017y\u001fV}\n[\u0006<Hݲ\u0014Sn5S\u0004\u0013h\u0002\bu.$M\u0002^-s\b`\u0011\u0004\u0001\u001dS2`\tP^QD9̲^;h9\nT+%\u0017Tkn\u0003()/P|\u0016{(iĀ\u0014U\u001d8\u001e%8(i\u0005V5y\u0011FUFhN#F\u001a\u000e\u00004BP\fv\u001c\u0001<855}\u0002ՠXSvQ\u0001Tgl\u001eoNq\u0015^ug~=Q'Wp\u001d<\u0018V\u001a=Tk-cT(wh96\"\u0002{nm;f}yM^cV`MK\tڲu\fI4\u0015\u001es\u0000X!C%\u0007l#@\u0013qo̥M5uV%ٔ\u0006jBu1'\u001eW\\C\u000b -~\u0003[Q\u0019޷ן~FO-k~ᓥ\u0012\f5wkz\u0003\tsLU@U@\u0003?Kz;X\u001csW\u0018h)C\u0002le\u001f-j\u001f\u0017\u001e3FM\u0001H\u0007køwtQDF\u0003M\u0010ۨި\u001aA\u0016\u0012|:c5˺a}FX\u001f1\u0011a\u0006huMe\u0000_TU@\u001bm@̌z̳/\u001bq϶k;\f#ǩNgy̱\u0007\u001bl\u0018`ވuA9u<\u0010\u001c\u0017\u001e2\u001eĨ\u0013HZУϾ/|\u001f\u0002S\u0017]Tn@\u001ei%m<XC,ցYcf5P\n+F\u001f\u000b _egσx=&*f#&wc?WpO\u001aƹE6\u0017'ɯlf3EMeó_5{G\u0019kğ͙\u0011s!\u0013]\u0007=A\rlP,\f\u00141~_U/m\u0003kk.r[^cە\to\u0003'35x5@Ein9Nb4s>r\u00179psЏVz\u0018\u000fգ,D2K4ϫw1}\f{r\u001d䳷UBr3-rr/}O߻B\u0016\u0016k\u001dúӱ\u001bs:lΡau\u0015>^Z(b\u001d׎aIL̝^y\u0015ǰ1)ϰ\u0017U\ra\u0019~\r\u0007\\O\u0007\u0018\u000fU{:-0~&Y\u000f`.[4[@;=\u001bG:~\u0005UNLTUP\\\u001bfyT@\\q\r.:Fi\u0005t\u0005Tl\u0006\u0007%\u0006-1ֆ\u001e#=\u0007fPz\u001as^5\u0011΋x<\n?N\u0003~إh8c\u001c\tX\u0000y9\u0013#kPF'\u001f¦\u001dnjAik\u0005V\u0000\t\u001e-q`:wvy|z\u000b\u0017~}hS>;]G\fm?^\u0004wq_Sx\u001d{>\u001c\u0007 Cqe_;<̱\u0000==߫b\u001c4hs/Zy̫\u000e:t]xКz>3Z^CT1s{sTۏ=\u0019\u0017iu\u0001\u0014h@-H}mMA!\u0017\f>ҵ\u001c5[\u0006?F\u0014=\u001a_٫a8眷7T\r\u001cT\u0013^)÷ \u000bCM=xm]\u0006>\u000f:_3'0\t5x\u001ezPIwO$p8\\#o\u0007Ca\u000bܣ!w5=\u0004\u001c\u0017I(p\b8\u001d'Qo_\u0003\u001aPC\u00001.\u0002_\u0004GzVu\u0001w\u000b\u0015\u0006 \n\b#2\u001a\rX]%24\r\u0010l\u0016*.\u0006\u0010A`lO\u0002\u0016d⣫ \u0006\u00174D\u0004CTBB\b\"\u001e߹2\u0016_w߹sS\u001e^&\u000bfL\bB\u001f\u001du̻yۙ}X8}\u001fEzm\u000fރ<mf4K4g}\u001fx_X#.HtO\u0014x\u0014~\u001fbsچ%[>Ⱥ3#֝-3\u000f{<\u0007E8\u0012%Pa\tǝA~\\[KƜ\u0013+&~ۥy'}Ka'\u000e\u001cm\u0013\u0014l\u0015\u000e\u000231\u0019e:5\r\u0013KrQ\u000b\u0017D\u0006O\u001ad\r\f\u001by\u000eY\u0014IcOAM m\u0018,)\bd6\r#쵓#<\u000b\rhA\u000f\u001ewk\n\"f\r\u0014ͧR;yVD%7N؋\\\u001d7+ZC*Ƌܹ5~}Z\u001eRnP ^\u001eW3xCV.xn4vWj+\u0002\u001f\u001c\u000e?+,p[S]jo\u001a_rAӌj]\"ćj9n6=Ą\"~$e&]:(=v\u0011~:\u000bj9KydJYJ?S\u0006qY:Ƀ;\u0014rh,1{\u0014Ɍ)¯\\\u0018{oը˕*?\u001ag\u001c'\u0019#&lV{b0a#uN\u001afs\\\fHrw\u0015Zt|X\u001e1}=k\u001a#y~\u0013FӜGPkl<IE\u0012_zc\u0016o+\u001dn_6\u000e\u0003\u001dcMaoC+\n\nlQ-,\u001dy\u0007P[L\\l\rCM\u001b{8\u000eΰ\u0017\t8\u001aO\\LIq<'e\bҎ..j\u000eURoݲ<Tش)Bgϧc@qq1ίզ';\\6Wd\n\u0004 n\u000fT}d&oN\u0005~ۯ䛜N8M~&a,vru\u000f\u0019Ok|r\t5\\#\ni;=ܵ\u0001}߸~lugi˗\u00143(W2\u000b[9O@^P\u001e\u0016\\\u001a\u001d\u001a%l[\nsJ\u001eJ&2.D\u0019oVi?(bmia4cğvjX$cIM&)XQ3\u000ek5\u00029*\u001fhl_ɹ \u0005Bٜ܉w{\u001b2p:a\u000f5=;>SH55A\n|D\r6:n#S\u0005Q\u0015ޒ\u0006x\u000eΐSyRH«r&mE؍Lj6JC{3I\u0014dCY2s6ǤFL=wz@\u001a}eSYvt5 z~y|kxFVS]ĚN/ScL\nk%?2k<ż=S\rIH\u0010|bL\u0016{Ύɏ`k\u001cn\u0007\u0005YyNќtKU^ *X\u001a9ԝV^\u0003yu+\u0015{\u0004A'uJ\u00134(f\u0015S\"-ԱUWQ9ǀ!^ـNe\u0006\u001fᕣӇD\u0010Z}b\u0005N`fl\u0018ClhWp6qlhWY\r%\u001fhFc\u0019>a1\u000b>=\rO~\n=FㇲQ\r\u0015z\u0011\u001f\n٘7:xaY~`c[bNDS8(\u0005~wލ\u0010ǹ@\u0018|+j5\"hVOr-\u0012vK\r&l岒\u0018\u0013{ȳ\u0002)!Շg]b+\u0013?e<\u001f`<S\u001d`)qo4\u0010K5i<pb_C^\f\"\u0017\u0018\u0011.\u001b4\u000f\u001ce<\u0017\u0000g{Ri\u000eK31(>yw\f\u0018gо\u0005_s>\u0017'gQf Hy\u0015Rc֠ߙ\f\n!\u0013ӋiC2mws_N\rG.6~I\u001ftHwܼM\u0004`\u0010+yEs,)\bNN>\r.[p?\u0011cg|Y:r^$T\u0018׽\t\u000er\u000eǉUjFSMyem\"\ru4jU XkrMfx\u0005-@9\t]\u001d]i\u000e39\u0001y1%<\u001e_t{\u001bLǎ|1\u0017jU._jq]sUNk.~\u001c\u0011o\u001dvP9Ob\u001d#kjw\u00199\u001a\u0002½+3\u001c>\n|Td\u0017̻mǟ\u0014_\u00191sݝg\u0017di`o{<As^Fn@&\u0006Or\u0018\u0007?jB\tTsMp\u000f\u000b\u0003P\u000f\u0019Iv9 \u0019\u000e\u000e\u00131\fF\u0004:yɜJE6|\u001b9q\u0011c<Rg{%\u000f[#\u0007p9?\"Br?W\u000b$\u0007Km>7\u001fp$\u00072'g;G\u0012$[]2&Gۿف.+\u0004^uڞt\u001bt\r]\u0006\tt8\u001d\"\u0019T|rd>d\u001fF\u0012\u000f@Ip;l\u0007}_~wevJ~r'J 0\u0017(cWʛJ\bBg\u0015ZK1ZdG4n\u001e.@|G{fyVq|+\b\u0010)%\u001b\u0018\f\u0019R\u0001WpR\"c\fX\u0010j\r\u001c\u0017aـ\t\u0015\u0014JFg[J%\u0012\f٘\u0019ӹāA\n0l\u0010;_~@ۑ&ܞ9RUHO@ǫgd鸾\u000eTfGTf?Gg畚՞T\u0019dze$_CO\u0015&үYMxw\"\u001eƽQƩ1`L偣\u001cAlhPq\u0015jc;'\n#8Ool^vk6#D1u-DP}==TcQ^D1\u0019;j6q\fKMPif]jMC3Ǽ\u0016ր\\b͈y\u0011%/FK.\u0012\u0013\u001b\u000bGX\u001e#'Znd<;.4^CM?Nһa\u000b-\u0010Sۀ9S{y;\f~-K:^V\u0004u\u001b+\u0006\n|Ƚ/\u0013/_\u0007Ӆn\u0006G3w\u001f͌nml\b<\u0003'Tu\nd|\u0004\u000fW[n\u0004Z\u000ep;Z3O/_|DZ'\u0015g>|Y/ \u0014x|K^'3\u0013\u001fF\u0007\tiUIorIݨGhRZ/W\u0006<yIWt)\u001c_H.27y\u0014h%!\fw+t#;\u0011\u0019s?ubo8949K\u0007_N\r\f\u001fS/\u001c{Ln\"\u001fO?ߝ\f怿JxXY\u0016(p%11SZ!\u001d0_'xͶj{\u0011kUɥ ȲvM^Zs\"{\u0003uViK.`[(d;пv\fW\u00197xR\u0004ԠW\rH158tֶ=\u001fq,r.YW[z*3A^LI՜(g\u0013\nwujM/U\u001d\u001ap\u001d&\u000b-\u0015\u0003([_*RKQܷf|Q\u000e9KX\u000eeG*ry\rDf\u0018_,:sv-흖~'ڏ\u0012e?YyeH5Y\u001dz+|B$(L|\u0015%)\u0006Ә\u0015\u0013W\u0019^\u0017\u0013Q'\u0015:=@}E\u000f\u0016KZHȏ/)_OdvfOŘ?RUy\u0002T\u0001rxp\u000f>\u000b+Sj\u001d'@`ܐ`]󩒐Ov8?ɮ/oO\u0000\"\t/q<C\u0016q%Pm_ Gs\u0017gVyD9\u0004\u001f\u0018k{<*\u0018_/\u000fp\u0017pG@k'\u0007:\u0015x䱶\u001c\u000erlmokH\ntE%\u0019Cg-n\b\u0015Z\u0005u#s)\u0019kծѽMj?4?f|2S8\bw]z|\u0007d,wKSǺ2 ;edW\ny37;\u0019btH\u0006(8+`qW&߉\u000by»\u0000\u0019hےz\\za~&oJrg0\u001a_?\u001e\u0015ʴ[\n_\u000e\n¹a,69\u0018Lc|!}>\u000b?^.7\u0017\u001a\fNʼ\u0019ӻMr)`&c\u0005o1y$j\u0013:D;Rm?\u001faW~&yg7\u000bmA\u0003\u001b̼o\u0016\u0013О\u001a)wJ\u0005~X=\u0016y{<\u001f>\u000f\u0004c\u0001Dޓ8C\u0017)jgG<\u0002F>k{+?\u0005\u000f\u0013\u001ac`9ox\u001c0_ׁuEuE׼n&A\u0006.W\u0012[\u0016-uοNP\u0004J\u00060\u0004<\f\n]\u000em{<{JO\u001aR0~\u0005sx`ܠkkCM\u001a\u001a&)%:\u000b%>sK#\u0003RM\u0007\u0018'\u000e>ja\u0003\u0019\nd2xKȴ\tz\u000ed\u0002*G\f*G&o\nʒWk\u0007\u0018̾\"\u0007\u0010Z\u0000S\u001c*c\u001aZkl\u0017Am\u0018\u0007#S\bj8#`\bA\u001f\u000brWלM\\/C?&^TF|t}|\u0015ceߕ5ʿKchUuUީF6&}\u0011\u001c\u001bj9`\u0014kT2{nC˧q7KQdk#fnbKegZ\u001b\u0018_ k\u0015y5-ׯ\n@u>^yk\u000e.d?^fE1P\u0007\u001cԷ\u0013Ly\u001b<'WuDc,yY\u001c=}\u0011֍<t𚤛¯g~<\rj}\u0004{\u000f\u001e  (vzVwR]\u0007)VٶC-74|\u001f<y`]\u001e![\u000eJ閃'Z2;+9oN\u001b]A_\"w;:;\u0018}j ]\f/x+/j+e\u00195n\u0004j55NB\u001e$yW\\HFJ\u0019/eΠ^vF\u001b\u0018\u001a5\"ڱAvey\u00149:nVg)[[}q\u0019C֮kU4\u0019\u0001\u0000\u000eb&K0>v\u001cCePnԚ=ۢ-읉!7j\u001aoG>/9+G~Ȥ|{/\u0013֟ߒZB[\n!!\u001c\u0011ِ\u0001kO,wd<=X2[҈W/\u0018['뢵\n_\u0001u\u0016vOCP|3\t\u0010=\u0014R\u0006%Wf_c(}홫\u0006n\u001e\u0016=sc\u00186\u001e`h(\u0015L\u0016\u001d0hl\r?\u0003탓\\i_^`Հs5˰iٵh|->\u00103P{zP+b}MmY*\u001dM=3%uƛA\u000e\\?\u0005ÿs=7\u00074*\u000f<(\"ֈ)\r*EBW\u001b%\n\u0002#\u0018\u00121TB\u000b\u00140\u0014*h\"A\u0012@\u0010k\u0018\u0005A+\u0016ZP\u000eC}\u000eۛj{g=g\"-MA\t=&ǡ_{k\u0011eB~KLs?qWEnǷVZ@RfF\u001e|9\u001b-h;m\u000eL \u0013Z\na>j\u0000\u0019\u00063*r\u0016R`Z\u0002|]` &{q7\u000e\u0010/:\u0016X1$ƻ\u0013ʀ29 5U=\u0003|ͱ'(Vs,ΔdﱶG4nf*{Tj5%x\u0011?MS~Ma\u001arњ`'t|X\u0013m1:1\u000fhy\u001e*\rSRxR\u0005q\u001ceRCyJ5~lV/gki|[\u001bs\u001a\u0019U\u0006\u000f\u001fw`C;|U\u001e\u000b\u001eT>xv>GRA-X_\u0005uNFKώy\bj\u001fAs&eиs%oz-5b<Mg~KM6T [k!j)o)_\u0003\u0013(pjSKȕBUʞ4 :sktR3\u0010\u001f#Xۀ7?ea\u00170޷\u0018YχP|wa:vh\"/\u000e_\u001dL۷zh0ڈ^t6$yQ\u0013|/Zm&8gG\\W2Ea'Ji³p4\u0001\u0015rN&PNC4\r\u001d\u001cU'\u0012\u001bH\u0010W!\u0016Y[O[nkYi\u0017ܡ\u001bh\u001fﰃy:\u0011ߓcKՕ$;e~P@~Ck\u001a.'Zc\u000bZ_+}Q\u001a5&ŞЍP\u001e\\>\u0013\u000fvuk-t>e1!\u001c.9;\u0016\u0006R\u0011<\u0014΀?Ad\u0010\u0018\f\u0000's4qy\r:v\b\u001eMC\u0000^\u001b-:MNMβ\u001c\u001cQm֪пY\u001dȑ®Mخ׎TݨI$ٙe8<7;o\u000f>\\nQ\u001f[c\u000ernjݯfڇF(KyhѬg\u0019?Hps\t?Ф\u0003GhWƩm\t=\u0012x^_\u0010\u001b^Yjλ%(\u0015mKk!w-Z{[7ƿiE}:\\I09rp\u0007G\u001f||B\u001f[\u001f9l%牜[֩J\u000e9E҇\u000e߾qi/+`\tn2\u0018\b=\nf@>\u000f\u0010\u001c\u0004_9P\u001fl֚`w:Z\ra5T`\u000f\\0}\ri(\u001e&._\nOB鮧Lwf\u000b@?\u0018\t?;,ց\u0002\u0001\u0011\u001c\u0012F{6Z\brm~p-*\u0007a\u0000<@}\u0018ݕٛ:X\u0006_\u000ba\u0006{n0k\fst*\u0005}`F\\\u001e]K<\u0003\u001fa-ތDã0\u000e\u001b_\u001c?nL\u0001,\u0004SeOQc5P\t\u0013\\x\u0015o\u0018 ֖wAp\u0017>.=\u0002\u0014΄Q1`3P\byT\u0010\u000eNڢs9\u0018~\u000f׳0\u0000ex\u0012`*<\u0006L^2ލΐG ԠE2f t|.B9E_nЩ_3LsuɫS1:\u0006̬NsW߹{:^/+~e\u000e\u0005pq?F+RcNU5<D\u0015{\u000eЉĀ\u000b\u0013+\u00169nh\u0003g}\f6FissaXTزHkfAZV݇:,O\u001aks%{bt\u0000=8oE*e\u001dO42=[F\r~\u001fc+#}4?*Suvp.LܠT!ץJ'\u001aǣ\tre)MIԘc1&vI1/mO`\u0019/gq\u0007h=\u00056md1?\u001c{d-\u00104\u0014lEUT>\u0018?W\u0013+\\.\u000f{i\u001d1JCV.3UUaqн03\f+<z*OE|k\u00035KEKxwM)ތN\u000ej~Ʃg-\fӖՁ}K0$y\u000b-JL0\u0019W\u001dr2ΐ:\\\u0019?T]?\u000eW\\gjZ\u001aꋎ/GEi\u00072(bچk\u0005&\u0007is=9K'<8{ĺ3!L㋁6w.ǞùO2K\u0014bQO9Is\u0017\u0012cw\u0004u*!\u0017k\u000bׯi&:{u\u0013)L# ^'g\n!\u0018 (WV]<U\u001b:ɗzzf\u0014zԖ3X.cw\u000f'\r1И*&ge^%~[\u0017\u0016|K\"\r\u001d35s\u001e]Ρ[B?ZM\u000f=8sd,M \tBB\b$l`\u0004\u0004\u00120\u0004i\u001e\tI\u000by.T\u0002N6L\u0005Ikgڪ#\u0002VbFicũ\u0019Ƒ\u0016@l\u0010vigN2sݳp\"mAsѶ\fE؇)\u0003k;\u000b6_;\u001db\t|\u001194b17R~M|s\u0007\u0001~3{\rG5(mv4\"p\u0004#\u001a}\u001ce83/`]L)+h&\u001a~\u0006<\u001d\u001cq3Jɥ=\u0007xEIKa\u0015/8~Ln&*TͰ\fN\u0004{\u0007Je%g\u001f\u001dvE.\u000eq\u0014gĂ\u0013ێ\u0018wʷ_R\u000fC65\u0013ʅvf:\u001c粙sNYqfL\u0018IGp\u000e8;J>s\u001fُ\u0011\u0015+ęځoݽ\t]Nk{\u000f:\u0011޺\u0003q[HG\u000bXeg~Ն(\u0003\u0015:q\u001e\">\u001a!aM\nA4sTqWWRӝgH܏ȯ\u001d$m'|\u001f;zmގ\u0014l颧l*z\u0010ynь-\u001e=+|\u0019s\u000f\"\u0003qV1ьMؓ\u001f:\u0005\u001a\u0000\u0014}0poh\u00118hPHL\u001d\u001cL;<\u000f\"8+8\u0001>\t,\u0001@\t|5\u0012~q8͚(9j\t\r%,\u0007i'\b^\u0004`\u000eH\u0001cLPo͠\u00184\u0003.Ν;f.=Hl\u0016CMJp\u0006\u0000.\u001eHeǞ>oQݧ<\u000fm\u0018tzl\u0013;\u000e\b}c\u001f`)a\u000b\u0010slI5\u001fmS\u0013cp1\u0015l5\u0003\u001fT\u0005\u000fP,s`\u000fD@\rԤ3V\u000eb79Gn\u0011\u0016\u0002|\u0001\u000eA\u0010j\u0004OI-FxF.&\u001a5\u000e}\b'\u0012^ Jl$\u001a\u0000. B\u0004D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012.\u0007CA\ny(\u0012\u0007I䢝P\u0015\u0012U\u000ejEyմ53m;\u001fi;ZgڌR[ĴU\u000fF)6iag6kG?KyT\u0004ꩊZ@\rl.Vj\u0011ZzXMbjĿPVKuk\u0013  ZwBEX/@\u0012AZ%\u00181qi\u0018\u001d⩍j7~Ќ6kz߹4\u0005V\\!e\t\u001f*0B\u000b\n<QE\rfۅաvǶs*GyGF _\u001a^Z!V9Fi6g\u0017O@m«ѷUtUX9?DY\t\u0007ԋ~MbmgA\"HLBGV[(o\u0013\u001eXo<x};G62kQ\u00179\n\u0011y\u00061|S+\u001dx՚UR/<˞wE\u000b˂)wS ˞G|ZUZB\u001d\u001c\\X;uwD\"DR/gJhʹo\u00199m\u0019Y\f2T`k\n\u000b!ЋB/\b=/гBO\u000bHB?\u0010w#mo\t=*WB\b}CB#\u0017W\u000eۅv\t&HhАǅn\u0012Q\u0006B\n] 5_;\u000f\u00123h@;\u00135>\u001eLHL9\u0007Ⱥ\t֏awj46C\u001a\u0012\u001b6&w{Sj\u001fCu-\u000f'iKX;w5`At`t/弦}J96\u00147*\u001bg\u000f\nkbG\u0018ޘxPx@;ח<]\u001c]Bw\\S\t\u00171r\u000fm|_gsP\u0012Ǌ\u0007(W.L14\u000b͚\u001bI2x:/+'&tV !]7>=SYFT2}>`x p,5\birLN*_Lq)HɊu~mM\u001fB͛Tc\u0013Ƞs<1Ȉc\u0019?&&\u001ag\u0015\u0017jYY'G#H)\u0010t7x\u0016vu0'\u0018<r;4*[ӟƜyAL1FM\u0015٭D\u001atO0\nI/\f}?ߠO8C\u001e6\u0017\u000eH\f\u001c\r\u0018eT8;?c\u000f<w8ȄF\r8̧1\u0003\u0003ƻp?\u0006\u000eey\u0003\t\"7*zne\u0018YF!\u000eO0^c[i\u001b:\u0014=Sv\u001bglS\u000e?\u001e\r\u001b5}c(2J̮2'\u0016xH\u001a\u0012RClR%\u0017zG\u0017xӼ#zx]<=׫x)[\u0016E䥥l1G\u000b[\u001d3N)b\u0006Y\u0001+$7Ű\"\u0001\u0016c@CI\u0001J\n\u001b@%\u000f~^5+\u001eϜ,\u0006X4ۙ\u0003\u001bX\u0014F\u0000/\u0019p\rQHN\u000eTf\u000fL@\u0019\u0015\u0014e,=nB;-5n,\u000fC0\u0011\u00066Lf2OZ %'MpE;c\\vGKl.'%TD\u0014Eߛ\u0017F\u0012#1!cLq$Nh -4\u0003Y8YdM*guR+hj\u0015?7b\\\b\"\"UtFн *nE34XA=p;羏s'(WsbQ\b0-W\u001a%+T\u000b0x%[>4-\u001e-eBa𺜑Ӳ&OSrJ,ˢ˜LK]\nɤ7*2kc\u0014b9ˍTG5-W\u0017r~ϧ6\"κ*\u0011i.\u0005\u001f׍ǔ$SnoY\u0015\u0005wW|Ռ\\ռ\fӶ~0)=?p\u0019gU՝~;\u001cE\\w\u0006\u0011?\fVO>)뉈\u000b΀\u000bķ\u00122w\u001a\u000fGW\u000evp\u0018lL\rhbtUY-R8\u001dԽ\u000e\u000bԤIfLLƴC-uC-.: /\f\\\u0012Mb8K\u00133\u0014Q\u0010\u000bm;\u001b+\u0016^9)\u0011B<&6n&n`\rp\u0015a\u0019GI+S\u0001\u0000)ls\u0012\r\nendstream\rendobj\r30 0 obj\r<</AIS false/BM/Normal/CA 0.300003/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.300003/op false>>\rendobj\r31 0 obj\r<</AIS false/BM/Normal/CA 0.0500031/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.0500031/op false>>\rendobj\r32 0 obj\r<</AIS false/BM/Normal/CA 0.550003/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.550003/op false>>\rendobj\r33 0 obj\r<</AIS false/BM/Normal/CA 0.75/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.75/op false>>\rendobj\r34 0 obj\r<</AIS false/BM/Normal/CA 0.199997/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.199997/op false>>\rendobj\r35 0 obj\r<</AIS false/BM/Normal/CA 0.600006/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.600006/op false>>\rendobj\r36 0 obj\r<</AIS false/BM/Normal/CA 0.699997/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.699997/op false>>\rendobj\r37 0 obj\r<</AIS false/BM/Normal/CA 0.649994/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.649994/op false>>\rendobj\r38 0 obj\r<</AIS false/BM/Normal/CA 0.100006/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.100006/op false>>\rendobj\r8 0 obj\r<</LastModified(D:20210427152846-07'00')/Private 15 0 R>>\rendobj\r15 0 obj\r<</AIMetaData 16 0 R/AIPrivateData1 17 0 R/AIPrivateData2 18 0 R/AIPrivateData3 19 0 R/ContainerVersion 12/CreatorVersion 25/NumBlock 3/RoundtripStreamType 2/RoundtripVersion 24>>\rendobj\r16 0 obj\r<</Length 6043>>stream\r\n%!PS-Adobe-3.0 \r\n%%Creator: Adobe Illustrator(R) 24.0\r\n%%AI8_CreatorVersion: 25.2.1\r\n%%For: (Deborah Steinke \\(Adaquest Inc.\\)) ()\r\n%%Title: (weblogic-app-gateway-key-vault.ai)\r\n%%CreationDate: 4/27/2021 3:28 PM\r\n%%Canvassize: 16383\r\n%%BoundingBox: 120 28 619 375\r\n%%HiResBoundingBox: 120.666284255058 28.4728002502643 618.333715744942 374.429351780728\r\n%%DocumentProcessColors: Cyan Magenta Yellow Black\r\n%AI5_FileFormat 14.0\r\n%AI12_BuildNumber: 236\r\n%AI3_ColorUsage: Color\r\n%AI7_ImageSettings: 0\r\n%%RGBProcessColor: 0.456457018852234 0.813199818134308 0.920128524303436 (2018 Az Accent Light Blue)\r\n%%+ 0.920583546161652 0.920527696609497 0.920049607753754 (2018 Az Light Grey)\r\n%%+ 0.46007439494133 0.461062669754028 0.479712784290314 (2018 Az Medium Grey)\r\n%%+ 0.000136697562994 0.000626976019703 0.000423457007855 (2018 Az Prime Rich Black)\r\n%%+ 1 0.99999862909317 1 (2018 Az White)\r\n%%+ 0.129986360669136 0.445850402116776 0.726806282997131 (2018 Azure Blue)\r\n%%+ 0.236153483390808 0.236566811800003 0.255690574645996 (2018 Dark Grey)\r\n%%+ 0.000136697562994 0.000626976019703 0.000423457007855 (Black 2)\r\n%%+ 0.179979398846626 0.462396830320358 0.736700236797333 (Blue_R0 G120 B212)\r\n%%+ 0.140570238232613 0.228389471769333 0.369380712509155 (Dk Blue_R36 G58 B94)\r\n%%+ 0.314972579479218 0.316238760948181 0.315570443868637 (Dk Gray_R80 G80 B80)\r\n%%+ 0.091186039149761 0.294841974973679 0.142633497714996 (Dk Green_R5 G75 B22)\r\n%%+ 0.420979827642441 0.163003876805305 0.163110196590424 (Dk Orange_R107 G41 B41)\r\n%%+ 0.231519639492035 0.180468156933785 0.344297498464584 (Dk Purple_R59 G46 B88)\r\n%%+ 0.15625861287117 0.295185625553131 0.278966635465622 (Dk Teal_R39 G75 B71)\r\n%%+ 0.417058706283569 0.298082679510117 0.116508431732655 (Dk Yellow_R106 G75 B22)\r\n%%+ 0.184054657816887 0.183923989534378 0.183081939816475 (Ex Dk Gray_R47 G47 B47)\r\n%%+ 0.950031340122223 0.950571954250336 0.951177477836609 (Ex Lt Gray_R242 G242 B242)\r\n%%+ 0.825643837451935 0.825728356838226 0.825046956539154 (Gray_R210 G210 B210)\r\n%%+ 0.087854735553265 0.488841027021408 0.244210809469223 (Green_R16 G124 B16)\r\n%%+ 0.456457018852234 0.813199818134308 0.920128524303436 (Lt Blue_R80 G230 B255)\r\n%%+ 0.902908980846405 0.902606844902039 0.90034556388855 (Lt Gray_R230 G230 B230)\r\n%%+ 0.634132742881775 0.803362786769867 0.22698737680912 (Lt Green_R155 G240 B11)\r\n%%+ 0.96799248456955 0.571453034877777 0.302267283201218 (Lt Orange_R255 G147 B73)\r\n%%+ 0.750997543334961 0.62407773733139 0.795579552650452 (Lt Purple_R213 G157 B255)\r\n%%+ 0.383294492959976 0.77460241317749 0.746525645256043 (Lt Teal_R48 G229 B208)\r\n%%+ 0.985468208789826 0.931368708610535 0.098425082862377 (Lt Yellow_R254 G240 B0)\r\n%%+ 0.198228940367699 0.626832723617554 0.853943288326263 (MS Logo Blue 0-164-239)\r\n%%+ 0.452200442552567 0.453015387058258 0.453602612018585 (MS Logo Gray 115-115-115)\r\n%%+ 0.495243519544601 0.732984900474548 0.258101493120193 (MS Logo Green 127-186-0)\r\n%%+ 0.941280007362366 0.318401783704758 0.143657401204109 (MS Logo Orange 242-80-34)\r\n%%+ 0.992564618587494 0.721914350986481 0.075717739760876 (MS Logo Yellow 255-185-0)\r\n%%+ 0.452235966920853 0.453031748533249 0.453614801168442 (Mid Gray_R115 G115 B115)\r\n%%+ 0.839141070842743 0.246982112526894 0.150924161076546 (Orange_R216 G59 B1)\r\n%%+ 0.067681893706322 0.04779689386487 0.000422788783908 (Process Black CYMK)\r\n%%+ 0.498164772987366 0.384476751089096 0.667927801609039 (Purple_R134 G97 B197)\r\n%%+ 0.179979398846626 0.462396830320358 0.736700236797333 (R=0 G=120 B=212)\r\n%%+ 0.117666229605675 0.204310461878777 0.395317435264587 (R=0 G=48 B=103)\r\n%%+ 0 0.359070867300034 0.632889628410339 (R=0 G=91 B=161)\r\n%%+ 0.544235765933991 0.714890062808991 0.883899092674255 (R=131 G=185 B=249)\r\n%%+ 0.513725519180298 0.725490212440491 0.976470589637756 (R=131 G=185 B=249 2)\r\n%%+ 0.075604505836964 0.278736382722855 0.484454840421677 (R=15 G=70 B=124)\r\n%%+ 0.64721405506134 0.870470345020294 0.953004837036133 (R=156 G=235 B=255)\r\n%%+ 0.642324209213257 0.229330748319626 0.52513062953949 (R=163 G=58 B=133)\r\n%%+ 0.777957618236542 0.915737092494965 0.970759093761444 (R=195 G=241 B=255)\r\n%%+ 0.800496399402618 0.799609839916229 0.797849893569946 (R=204 G=204 B=204)\r\n%%+ 0.798178553581238 0.45651313662529 0.687045991420746 (R=206 G=116 B=182)\r\n%%+ 0.860582053661346 0.57353013753891 0.750373005867004 (R=220 G=146 B=191)\r\n%%+ 0.833908259868622 0.503820598125458 0.711137890815735 (R=222 G=127 B=197)\r\n%%+ 0.104216925799847 0.540755808353424 0.701586782932282 (R=25 G=138 B=179)\r\n%%+ 0.198356091976166 0.745098829269409 0.868122339248657 (R=50 G=190 B=221)\r\n%%+ 0.210439950227737 0.090880148112774 0.215629070997238 (R=54 G=23 B=55)\r\n%%+ 0.288159668445587 0.608493685722351 0.835312724113464 (R=68 G=156 B=221)\r\n%%+ 0.456457018852234 0.813199818134308 0.920128524303436 (R=80 G=230 B=255)\r\n%%+ 0.349100857973099 0.155945926904678 0.370944648981094 (R=89 G=40 B=95)\r\n%%+ 0.410890519618988 0.61349219083786 0.828449487686157 (R=94 G=160 B=239)\r\n%%+ 0.000136697562994 0.000626976019703 0.000423457007855 (Rich Black_R0 G0 B0)\r\n%%+ 0.008390481583774 0.522869646549225 0.46064430475235 (Teal_R0 G133 B117)\r\n%%+ 1 0.99999862909317 1 (White_R255 G255 B255)\r\n%%+ 0.992564618587494 0.721914350986481 0.075717739760876 (Yellow_R255 G185 B0)\r\n%%+ 0 0 0 ([Registration])\r\n%AI3_Cropmarks: 120.666284255058 28.4728002502643 618.333715744942 374.429351780728\r\n%AI3_TemplateBox: 306 -396.5 306 -396.5\r\n%AI3_TileBox: 9.5 -68.5489239845038 729.5 471.451076015496\r\n%AI3_DocumentPreview: None\r\n%AI5_ArtSize: 14400 14400\r\n%AI5_RulerUnits: 6\r\n%AI24_LargeCanvasScale: 1\r\n%AI9_ColorModel: 1\r\n%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0\r\n%AI5_TargetResolution: 800\r\n%AI5_NumLayers: 3\r\n%AI9_OpenToView: -175.813011900401 519.546580598825 1.34624263341644 1794 905 18 1 0 72 125 0 1 0 0 1 0 1 1 0 1\r\n%AI5_OpenViewLayers: 777\r\n%%PageOrigin:0.5 -793\r\n%AI7_GridSettings: 110 25 110 25 0 0 0.658823549747467 0.745098054409027 0.874509811401367 0.829411745071411 0.872549057006836 0.937254905700684\r\n%AI9_Flatten: 1\r\n%AI12_CMSettings: 00.MS\r\n%%EndComments\r\n\r\nendstream\rendobj\r17 0 obj\r<</Length 65536>>stream\r\n%AI24_ZStandard_Data(/\u0000XL\u0004r\u0004\t/#\u0006\u000bG3`C6\n\u0016\u001bL?\u0010e6h2=\u000btB\u0007\u001e\u0004Aps\u001d2\f\t\bP(\u0010\u001aH\u000ey@\u001e<\u00075\u0001Y>u\u000b9n9\u001awG\u000b\u00065޸/\u0018\u000e\u0016\u0001,\u0018..\u0018\u000e$(%$\u0010THD\u001e$8P<P\u0012򂱰 A\u0001\"\"\u0015\u00146 \u0002\u0011ᡂ\b\n\u000f\u0010\u0013\u0018Dl`A\u0002\u000f\r\u0014$HD \"XPAѨhdP@\u0004\u0016$\u000fD4pDD\t\r\"&\"\u0015\u000f\u0015,H(\"\u0012$\u001e$A\u0003\u0005\u0010\u0013\u0013\u0017@LL\\d@\u0002Dx@\u0003\u0007\t\u000f\u0010\u0010\u000e\u000b\u0003*\"\u0012\u000e\u0010\u0014TH<84P8H8@P!\b\u0015\u000e\u0017bA#TT8$\u0016x\u0010р\u0002E\u0002\r& \"\u0016xDPLH p y P8@@\u001ea\u001cH\u001e \u0010ā䁊\b\t`0A\"!\u0007\b\u0011\u0005$\u0011\f&$4\u001cX0&$ !\u0006\u0015&(\u001eH<L\u0000A\u0001\u0004\u0000\u0001\u0015\u0012\u000f\u0014\u0014HL \u0000BD\r.T  `8\u0001\u000b\u0006\u0004\t\u0012\u000f\u0012&\"H< X$\u0002\u000b \u0014qA\u0006\u0015\u0018\u0016\n\f\u0015\u0018*L0D$<XA\u0004Â11!AE!°`D\u0018\"\b\f\u0011\u0007\u0007\u0007\u0007\u0007\u0007\u0006\u0007\u0006\n\u0010\u0018HpL`\u0002\u0006$ \u0001\tH\u0000C\u0006\u0014\u001c (L\u0001\u0006\u000f\u0015\u0010\u0015\"&``\t&`X0\u0010AC\u0002\t\u0018$`X0\u001e\f\u000f` @h4\u001a\r\u0005P넂\u0004 \u001c2HL0PD*(\u001c*T \"1\nQ!\u0002\u0005\b\t\u0014\u0013\u0012\u0013\f\u000b\u0003\u0004ăH\u0004H\u0004\t\fN*D0D**DpD(2`xhP\u0005*\u0018(TxP\u0001B\u0003\u0005c\u0003\u0005\u0004E\u0004\b\u0006\t\u0011\b\u0005D$\u0003\r6ȀbB\u0002IDA!\"\"\u0001\t\u0014\u001bh0\u0011A\u000b\u0006\u0003\u0006\u0012\u0011\nLP`d\b\u0012\u0011\n\n\u0011\u0018N\"\u0011\u001c4Px\u0010<Hh\u0000Þ\u0007\n\u0014\"\u0010\u0015\u0013\u0012\u0018\"\u0013\u0014\u0018\u0016\f\nP8DD$8PT0D$@<TDD\u00182 A\"P\u0011AE\u0006\u0013\u001e(\u0016\n\tD N\u001e\u00130TH \u0002\u0001Pa\u0002\u0004C\u0004\u000b\u0018$H8P0A\u0005ED\u0003\u0006\fD $\u0010Q!\u0002C\u0004\u0006\b\f$PD&Lp`Px\u0003\u0004D\u0004\u0003\t\u0012\u000f\u0014\u0013\u0010\u0012`Pp\u0004E\u0007\u0005\u001c(&0&\u0011\t\u0012\u000f\u0014\"\u0015\u0013\u0015*`<`РBEĂ\t\u0013\u0010\u0013\u0014\u0014H<LPDDL,\u0012$\u001e\r4`Xp!:\u0002,\u0011p@؛\"Q}'v\u0016-GT\u000f*![\u0003\u0003\b\u0010\u0004\u0012\u000f\u0013\u001e(&Lp\u0006\u0016̼@A\u0001+'ho:хqrGz%\u0013MfK/(`\u0002\u0006\u0013@XK @\u0011!\u0002\u0002\u0002\u0004H\u0005\u0015\t\u0014\u000e\u0017@8;@@ \"\u0012&\u000eN @8D 2¡\u0001+BŃD\u0002(\"\u0010\u0015* -h@\u0004\u0002\u0012\b.\u0010y@0q>D\u001bŅf!\u001e.\u0004\"\u0015\u000e\u0010\u001aDD.`\u00124(P!B\t\u0007\" 10!R\u0003\u001cH(Arwe+\u001f$@rV'jx\\Ԫ3=iMkTLiJڛq(Q]5\u001b#x.YWR\u001a\u0016k{g<%ވ4\n\u001cDx_Y<E+gՊ@I\"DrYޤJiUtvr\u000efUVԡd鋵tOcLכ\b\u001e$W\u0011T@RZe[gʡu;SһPݼ\b$,JiW=*5:TԽNGditvi&;˛\u0011\b\u0011(\t\u0011<H0;\u0015|xVֳ;M*\u000fS}\u0017V[5]ĢiK{I}-Vj\u001c\b\u001e$m!nm$2RV\u0011<ȞFiz\"-*\u001b)HwtW\u001e\u0011(\te\u0004\u000fstzRCѝ2\rW{E-R*@IN\u001d\b*p 'Ү\u0016\u0012޻f{g\u0018kF\u0016j\u0019\u0012%*%PB@IwVS'۩\b\n\u0011\u0011(\t#xP\u0004\u0015$Ar\u0003\u001a-I6\u0011\u0012\\Z%_b7\u0001\u001a$\u000e$JkYu\"ң*ni(2U+&=H\u000e$$_KgźK\u0017YWJJr\n Hx8\u0003I6v/ӧN\u0016qϪ^\u0004S\ts-yIG]:וO=5\u001evmt^ɒOez\u001eڝ4M\u0015\n-H\u0005T/d9DlMeۛWe9vd\u0003\u0007\u00072\u0016KRLvV\u000bG/P21a!\u0000\u000e$ee_4Ze.&\u001a}J׿ʴB-ґQ)\u0015ͶJӥRzWw:|\u000e%L_ 1ם\u000ennfiI/ܛ/wRI~ܕLeZUdCIffnĵArW^RLK],DB3Lֳ7$3Uû\u001bQE{\u0016])\tY5\u0007\tځĪ\u0016,UCaY4 !;vx+-5+]ԎWRz=HUѰhLΣۡĪL7\u001bm^I\u000f|\u0003ѺV2մۭ՚*ZGW#\u0002\bX+\u001dR3-ԣs\u0002\b\u0010\u000e\u000bgfS_کe+<*\tAW\u0001\b\u0006\u0014\u0015(;^Prfgœ\u001a~\rg+_I\u0007I+\u0010 @1봇k\rH1Ո\f1K7UJr \n HD\"w\f\u001eJ6r뷆\u0012cF\u0012>HH+\u0003Ń4TT)/a\u0015چ\u0012um~*=H*@\u0001\u0003ɝhίV\r%f,+<KI \n D*@(\u000e$fhEhzFedkxյt%\u0014pp\u001dGwEDj+⡕ҚV\u0011\n6ni!)V\u000e%v\u0004͋Hh劇\f\u0016$mK[;8\b\u000f\u0015$\u0007\n\n4nu\\\u0013b!\u0011\r%-4\u0013QD\u0007\t\u0003hPE\\B2~(1kO\"\u0006\u0011\u0007$S\u0010\u0017h\u0000\"\u0015 \"\t\u000f\rID$BFFr ANT;(jݵY[թ\u0004\u0002A\u0005\t\u0004\u0014&H<TTD,Lp\u0000B&\u0010D&8PH\u0000\u0004V\t\u0004\u0014\u0011\f\"* @\u0002C\u0005\u0005BY\n\b\tH\u0004\u0001\u0002$hHHD\u0010CD\u0002\t\u0010\u0013ʂ\u0000\u001ah` \u0001\t\u0011\u000b\u0012\b(THL@(\u0010\u0001BI.0\u0001\u0001\u0011i@P!\u0011pDa%\u0002\u0004BB$\u0004\u0005\u0005\u0015\u0012\n\u0011&\u001c\r4`h%il󴤾F\u001d]]\u000b\u0011B\u0007\u00024qi\u001a\u0013\t\u0004\u0018P&H<H04aj\u0004H\u0006\u001e(Pp\u0001(H EŐ\u0004HCb\u0007`\r\"\u0014X\u0002\n\t\u000b\u001ah\u0010a\u0004\u0004\u0006\u000b8@\u0010x\u0006\u0016\u0007\u001cH\u001ex\u0000\u0002\u0013ABBB\u0005\u001c$4\u001c@\u0012C$\u0003\u0007\t\f\"\u000e\u0007\u0012\b(& \r4`xj\u0012\b$&\u001e(PD\u0014\u0000A%h4AJ\u001e\u0001\n\u0007\n\n\u0015  $H\u0012\b(&*\u001c\"\u0014K\u0003\r,\u0018\t-D0X\u0002\u00004\u0010D[ҡ<N͆ڂ\u0000!r\u0014̶fyDrY%ΘiF<0\u0015)5I/mMuߵ#=3K/I{wk}6ѢsfE2nMqDw]yѥ,˲\r=.CmX0\u001cQ\u000b\u0003TP\u0005\u0001*\u0003;0\u001f&Io:xѯJ\\,S]ni!>ϬG7;R\u001dk\u000b\u0001qT>4\u0010`l\u0010x`\"dg6C\\-`ؚRٓPi*\u000b\u0003?Jx<\"Uq\n\rYJvYF5}yv[Ujj]bХ\u001eᗨ2[{ŧPuZ,\u0018\u000fG:\u001e\u0006q@\u0005Cc`8 \u0001BoK\u001eZ0\b?d5+2\\_)`В-Pȯ3ϨڑrgWuCɕl,%u莊KvYt-{Q<c\u0015mPrdӦG$_;S,SK[ˍ܆h<\bB\u0010x\u0018x8\\dХpouuy죮=<\u0016\u000b\u0003?u,\u0018\u000e\u0016D-H:(\u0014H֔ս^\u001f~@\u001c\u0010\u0007\rZHS\u001a{uB\u0010@Џ\u0005@i7{֞)hԗyZ{F3<U<:2{Y\u0012i[M;jGt\u000eMu椤owv5w\b XaTl6AJkQ\u0014\u0007$O1Ȳ4쓢nm\u001dʴLkx\u0004\u0002FElkQIH%\u0013n\u0011nR%RLSqY\ra4\u0005\u001d\n=Ng9|<JYu\\z_D6wFmfkm\u001dJJ5\u000fIUjjg4\u0013KѨ\u000e%1ڗ\u0011UR\u001f7<j^n$I\u0018䐃,\u0018\u000e\u001ex<\bbHA\f(\b!\u00048G=\u001eȇ>x(jxԂ_ruP\u001cx80ukp4\u001aU^N\r\u0007)cn(Gy\u0013|\u001d-\rR\u000fEz*˭-\"'bV2[0^v٭CǛ\u001c(cQ\u0016yV\u0010\u0005(I`B\u001cX0ނ׸\u0011Ty \u0004!褬kd\u0003ucXQz=iT;\u0019~\u000fmG2P<3a\u0015OV:kѝ+Z۲^cڹw-i\u001eڄF=\tg[ayooЂ`p\u0000qc |Y\u001ev<pu5tTSS5.즈D,K+*HyF!bY_hY!Փ[\r\u00066p\u000f\u000f5|,\u0018\u000e슢a5Hi8QE<riԮHw.ImwP,;vF\\J˔F%&e\u0016JK˼6W]\rV{:\u000bKɦ&JE5cju~h-xؑr`\u0017*.&^A\u001crC\u001dг؆6AN\u0007y\u0003\u001be\u001byxFgEIơ$הO.\u0019\u001dY,F\tlkOZ_!j/\"%d;4f]K-J\u0013\u0015\u0015\u000f?\u001c\u0006.\u0018\u000e\u0016`84\u001aX\u001ay7eQ \u00034\u0016A`q\u000esq\u000et\u0003,\u0018\u000e\u0001,\u0005bFi\\O<pDor.Uv^4t7q\u0005`J%f.\u0018K:au`\u0003o,\u0018Fr\u0014|x]\u0005\u0003}K2-\u0018\\0\u001c?\\0\u001a\u000b\u0006\u000br,>\u0014m,\u0018yȲ7\u0004\u001fe`\u0010BαX7]YkEG-{jUY-ҼjL:=h\u0005oAU\u001c.G9a\u000eTR$Z`^8 jc\u0015[\f-Mma-氇A`u\u000e:_eq\u001cNq\u0011F>\u000b\rTDL\"|r좸ŖZв`@P\u0016EQ\u001aJCSR\u0015R \rh4\rl\\\rkT\r>\u0014\u0003y;;ݤ2\u001f^)\u0015ݭMjvZљȚRg՗f\u0012\noYjxJK*M\u0013i^VL4`<@I\u0007\u001cv\u0003<\u0016ǲ,\u000b\u0003\u001f.Kk\u000e?\n\u001aը\u001c(H)c\u001f?Q\u000fz@\u001c\u000fñ8\u0014uA\u000f]Xb\u001bV\u001b^a\\V+$\u0004!\u00079 \u0005!\bP\u001e'%:BJRZZRh\u0007Al? \u000e,\u0010\u0005Ҁ,D!&\"ShxɄDB$AB\"\u0001\u0012$\u001e\u000eeM\u0012\u001dJ։jNMJRԴ*)OoI\rMEvj;\r%{VuS)n4+-'\u0012ݰ|vIơ\u0005\u0002\u0005\u0002\u0005B\u0003\t\u0013\u0004\u0013'\\pZBE\u001b2|*tWn&}Ђ񀆣\u000e\u000e%$$\u001fXT\rMMs&CA\u000eZH\u0006)%!\u001dLD'&f:AJX\u001a(@\u0016B\u000e;ǂq2= \u000fP\u001c.\u0018^ZZBԡ\u000e]tQUUD==޴j%%\u0005CldzRQuU.*\u001fvx4|[0s \u00079B\u001d\u0011\u0011\u0015\u0013\u0013\u0017\u0017\u0015l :Ё\u0010| %%iiy,e0ʕSNA%TTY4\u0014EQEq(\u000e@\u0014K-e˗[p\\te]\u001aKcY\u001eXM|]VYe\u001b\\\\۵zgW磃}\u001eu\u000e9l\u001f\u001cr\u001f]]NOooO9[n\u001fK\rjQ\rkX\u001aFP\u001aKci8\u001a\u0006A\n)V\u0002\u000bsk4\u001c\u001a[s۵6v=fs\u000em^\u001f%\u001cյ\"Sw~jKM=]\u001dK]Ψ6gji\u0015\u0015uhrJ\u0017SS)\u0019sLTIyA=#\u0015Iq\u000e\u0013Feg[y|V1kШ<I~\u0012sܗs̜^ZY{4uwy\u001bmmұݦ97M2\u001c\u0013]٧c.+[[0YYy,=g\u0004u.~B[p[z\u001d\u000ey߫cs:51u;Ǳ-ox\u001f;k\u000b\u0013~\u001f|s𶽓nsN>,BRϖ\u001aMI[[PJAC\u0006lpl\u0006\u001bYS@CUItc1>\u001f\u0017fս\u001a\"\u001fZ\u001fks,cm:kD\u001b؞-\rrZ8t&+5(M\"Q%Ӫ3gHwgCJ\u001aR[|\u001f5IYl6j\u000biL\u0017K3q\\B#ӠE\r7k6>kc\r*\u001b\u00052mi)ks\\[ Q:*;xKVޒ6yyk\u000by\u0011I5yUGIt$ѝyC\u0017YnKDw9/zQzJA!hhgi緤Z*\u001b2M\u0015i\u001dMUS\u0000g\u0011ovQ(z\u0016)i\u0016)Mx[^B\u000f\r=T\u001f5\b\u000fv\u001e*\\SZ^=9VKRVf8>:M%..U-sgm'5TVCe9<\niV8TWi\u000f\u0015t,wsh\nn9u7Pb(ւQ!\u0000XFFW4X,ڨU?F<j7:CIg3KWN<?h\"4&j\\6I;IKWhꨍ\u001fYRR\u001a2*6z\u001b}iJ7i\\7\u001bTS~Ψ8v;&S\u0015M&t9Y7\u001d54P̸s4?QQ4w{ќLdjeYNfd\u001e(dZHZKCZt;IuT!ltHCk\\`\u000ewpy-ɚKZis{~i̪\u001cc-d-0GӨh6>.Dfsl\u000eUꐮf)\"U\u001bUu\\媩\u001c\u000b=u:Mw\\Sjqدn<3Sc`\u001cS05UuQt4?l\\;Wׅ5\\97\u001a\u001a5Ի>̱\u001e\u000e5?TSqm\\Z\u001a\r\u0015\u000e=K;fuGcU\u001d,P嚫]K;MI'[!MZq,mm\u001fݺGK_\u001aqtmqm+AI4IښIBD\u0012Fr\u0012ZD6LJ<AO\" %N\"$7X6k\u000b\u001c$O\u000e&\u0011i\rhf<k\u000bKSjBһY:s5qT,ݫfcGF繖f\u001d˵SV}\u000eD=B;ĹYߠkjT\u001eo>6f\\aT\u001d6ew\u001fLyPwƹA8˜8Omr;SYu`Hx7`gi-7Ky%,)\rҵ4qn\u0010]^`\"\u001e\u0007}\u001f4T\rj\u001e᝔86NI$<OaF,)G\u0013uvRwk|\u001a'Fom|f\u001eUC۴;yCe\u0017\f\t,\u0018G\u001e1hVڜ/{yl\\dԷN>fKrf1\u001b^;昗:_Ï~sSܡX6뎦\f*\u000b%Y#r%Q7漶ݕi\u00128\u0006\u001duMzu=笯71OPX0\u001av\u001apƼ`D$歩ZKn\u0005\u0002\u0006$ĐP\u0004\u001e\u001c !'\u0017H(@BI\u0001\u0012Z06`@B\u000b\u0006F\n\u000bFЂq\u0001\u0006$`4\u0012b<$I2\u0017\f\u0007\u000e[)v7nﱠ:\u001e^0\u001c\u001cSV_v\u000fu[˫5U֪TW[*\u001dZwC:\\0`@\u001aWRZYyԂ\u000bF.\u0018ǂP\u0017\u0007\u000fs\u001cX\u0003\u0017UFT'U/R\u001b\u0001\u0005#\u001b\u0007B\\D}6H\u001dCYEJ5a*C!R\u0005ajh}_45چ=\"EKA\u001e\u0017{߀ЕsR=+ӌKmZ|CxGdiӺ\u000bBhvhd\u0014/YR̾\u0010Sv\u0017epP&D\tJy6\u0014PmUZR\u000eW(]k̭ʭ<J\u001bu*\u001fYK-EC#\u001aoeܾٯ^]T\u0011U+]\\zJz{zz\u0016Q7׫4\"qo\u0015\u0016\u0015\u0017qoҭ.*R5D*yO\u0017IIUڭM\u0016hiVSiU5IUA-5iU[P6Ъ&n&:73\u0011hA\bL_*նM*驞朞PUS3\u00135SS\u001b\u0014\u0015KK\u0015jEڬD2d\u000ej\"e:233'1333SITs357oss3)sMm\\\u001b\u001bиxD:\u0016&]!0\u001a>k]ĝwgW=%}Kg\r[R;zΌ.\u0002\u0012b\u001d5G::BNr\u000f\t\u001f9&\u0011׵R]q\u001fmZ\u0004QLM\b\u0010Zaj#\u00113!*#жrN\u001dWD5x\u0010#\u0010~#\u000e\u000f|\u001b=T;\u0011ޞEkoYUw}^~xxxwg~7fvv\u0017aun\u0019^~7_;_W+W\u001bkFc7T^_v33mj|ެщN7\u0011~uۯnߏ8=\u001f\u001fye>}C̼k~q3SO=O^K^z>(S5Ȉ\"F6vvfC{\u000e+͌1)3333Mlv37\f\u001ca\u0019rokfv3Z[ҭkeee=xC}\u0011#\u001a~\u0004\u001e3o'^TQ\u0011\rM\u0018G\u001c\b;a\u0011X&,Bw)8UXEiE_:\u0012gNQ\u0016mY9~l'\\y/咢\r**b\"&\"&&\"\"5!\"\u0011\u0010шxZsc5X9cbxL,CTUCM)D4M\u0016PQMHj½[\u001fAWw6wםK~\riK]u>UZWw9Zuw|>݄\u0017\u0001Mt׉I;NAHzͬfs2-3\r0-=jj_5u\u0016ni[@\u000620L]v-meek![[P2Zu]ZZ9RR/dɗKi^*jթ\\UYTj*2]TT^>{V\"څ7w:ZsUUYuV>]\u0010j:|oeJMX٘ٻSN*Skl*\u00175LUT5TUcZ\u0017}eeE6z/׋|EWtuZT\u0015\u0015\u0019\u000beeVeeutVu;YYKYXXk\u000bXXEW*ڢ-%#[Zldp\u001bݖ#i@FkjfjffTSS󍚪*隮鬭5լڮ5\u001a+KwRշW:U=uu>KIt_x\u001e{Cz]-B7C\u0006qy'\roWdR&e>[{ΟĤ{\u001bGO&I܏^#YYA7{zI-kgMs_[KZ\u001c)M$ա\u001a-p\\<uTm;;;\u001dYwwGL\u001d<Z[[%%Լ<a!\u0014uwJ;_.MڭiM\u001dڭ-\u000e\u000f\u0016\u0016n\u0016\b64;{HHd3\"\u00180\u0001в֓OR4D똒\u0012ҧPpQ*,$41cDQьF]24\\[\u001då9\u001e\u001bH;GQqUIo\u000e\u000fn\u000en\u000e?tJ\u001f%\u001aDlP\\%ťEͼY\\Z\\L\u001dRf\u0014\u0014TII1kA\u00143\u0013\u0013qQTDB(\"df\u00112\b|NJ$\u001dQ!\"Z\"Y\u001e=86IIs'MNfѠR\"&R\tY:%LRz^ɖJҝRT$g\u0013i8HN$'֚MB\reJR\u0012)i.,MiW+S%K|)콥K,\u0012u0\u0017}\u001aMYZ%M\u001cM%<%\\</\u001d&o}\ru7\u001aރ4>q R)\rwFAS7uT}^\rzUgիd\u000bihwfj\u0016ckڭ\u0011zni֔\\'=Sѣxѽn\u001f+^ڎeSy\\#z\u0019`uN\u0012JUϥSf33۹6fWm~aum\"%TNKF+߭~\r\u0011k\u000b˹hpo\u0002\u0018E\u000f\"Cdh\u0000\u0000\u0000\u0000S\u0011@\u00000\u0014\u0014E#!^\u000f\u0014\u0005]N>\u0016\u0018\u0014#\u0010 \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004p'`UF\u0007d\u001d\u0002\u0002\u0013;M\u001b\n}jlR\u0004|#\u001a\")p9\u0018CPTZ/@\u0003!a.=\u0011B.hh|t\u0014у.!ޫݨQrkm-f\u0018@\u0014TjG\u001a;a>\u0007Ӧ\u0016s\u0005;\u0018b<2\u001a8O>#~\f\u0001\u0006\u001e\u0012.iYn\u0018͈l0^^KΪݔR\u0003K0U\u001e\\uʄUI*T)ya-J&$ԍ\u0000)pO`_0,\u001b5󺄈/n(\u0001`\t<uRUNdq,9>|n֚5o(\u0002hX!+&\u00076)ӢBSj,\u0019kic9\u000f\u0003ϩ)N\rSN9ŕ\"EqH09\u0005\u001b8\u0011UF\u0013B>\u0003P\u000ff\f!\u0001kUDPt+Ame\bM}(-<rq\n\u000b<\u0005dQpk}lb165\u001aE\bz\u0011,\u0003㼯Â\u0010TرV{$\u0000\u000e\"!uOb\u0004]\u0005Sp|\u001b#\u0003än+\"ˑ4l.'\u0018\u0007u3qw۰l\t,I*\u0001-}f7\u0003J\u0019b4XC4{\bz]hjp\u0003M!lk3ώ\u000f\u0018|G̳F\u000e\u000bM\t5\u0016넠n\u0015\u0017\u00160Ӓ3N\u0007zի\u00103rʅ])\u001f\n\u001cfFG{r{\u0003z\u0016>:[\ry\u0017?H\u0001fZ`Y@T\u0007pu\bvzz\u0010\f\u0006W>釘\u001ajb>o\n\u001dI&!7zne\u0014\u0003fS\u0010Tp@b\u001c\u0013CO@ؿ>X2\u0004Is9-xb\u00057\u0003'\u001es:\u0001ְ&\u0006˝*FVR@\u001a+./\u0000ۅnY\u0003ٝR\u000bRW8\u0015AR\u001fE-\u00124 ҭR\u001c&(\u0006}\u0010>&\u0017D\u000e\r\"9\u0003&Q\u0001cm\u0006/6-\u000b!p/ZS\fsu^4<0n]!)isi#\u001cPϫ0h\u0011κu(\u000eT\u0003}\u00190\u0005\u000fd+fJ7ٛr\bg\u0019heʱOܱ~A\u0018\u0014^\u001cV?\u000b$O\ni!)RVCX]pbXnI,{\u001f&6Թ\r\u0010Wx\u0016>'\b\u0001@3xku+tK=4?\u000e@\u000fu\n:O\"\\Å9\u0015'bo\u0018\u0016蹜\u0000Xj \u0006Wi\u0012blu\u0004\t\u000fUG}`*95΃򕘐\u0003\u0000 A.QD*AL\u0012U\u00163Yds\t\u001aM\f^\u0004\u0002da\u0010}Ć4x1>[f\u001c{@:hb\u0006\u00182ha\u0015\u0013\u001a>\r\u001eF2oD\u0018\u000ew\u0013pv\"Q0\u000e\u0015\u001cr\u001004C\ts\u001dY?\u0018M3,\u0007\u0019k,?!\u0007L\u0010y\u0002`$,P\">R\u001c\u001e\u0011\u0015,\r:ÿcf,c'\re\n?L\u0015Igku\u001c.&f*YG[].W$6\u0014ܐe@o@z{3D0@s\u0018\">\u0017E\u000f0X42Q/**\\Awt.&3͗\rjV\u001a'kQa̼\u001dI$C\u001cɝ5%\u0019\u0019T\u0014P8/JRт\n+\b(R\u000eUWy_^GYv\u0005%\u001c5\b!\r\u0011\u0006jR\u001fv\\\u0015\u0014\u001a\u000b\u0002\\q=T\u0000l<Ջ!3Bax3iRQD\u000e!Y\u0018\u000b*$b\u001e\u0018g'0\u001b|Iи\u001c MmLR\u0003?\u00145z\u001a\"2&@\u0000\tXtG\r\u001d1\b]C\u0011,\u0018͡\u0006\u0012C\u0000\u0014Y_4me]\u0006cxDkf\u0013L8~|--\u0011rsG\u0004\u001c\u0006)9ft(R\b8B:\u001f(Z}y;L_P\u00196/ʜj\u0019\u001c\u001b\u0001\u0001+U\u001b\u0019\u0005:z'\u0015nlWy\u0007Q̵-i-A\u001b@\u0003\u0005\u0016\u001f%P\u000bW7\u0003B\u0001\u0005~dp\u0018^6T;[rC>:q6\rRs\rcH\u00001_+I5\u0000>)w`\u0001yS+Z$\b\"L0/H\u0010A\u0013-\u001c\u000bDCga-2xvp2V\u0015f\u0002ȏwZ\u0014p Z}rLӯ\t3,s@wYP8tS\u0016\u000f\u000eMuB\u0004X3\u0017H\u001e\u0005~4ᫍ\t\u001b͆a3<}aԀۧLRoɽԻ6.FO\u0019\u001eU@e4A\u001aMߧ\\^wI\u0007e\u000ey\u001aD?#\u0012\u0019@Fu̞:S\u001f%q\u0012a@ܩ8\bR\u001bi:\rK\"\u000enWեW9\u0001\u0018\u0000EjnJA0bIp\u0016\u0006#j\u0017i\u00000\u0005TYPzJ;8W\u000b)\\$MّYsѩ}\u001b:/\u00064q/aHOOea_HA.JTfq;We_Ȏy\u000f(\u0004%b\u000bS\u0011\u001e\u001a\u0000\u0017aV`*\u0000c\"Y*ʏ\u001fIW\u0016\u000f\n\u0006:\u0000B2\u0018\u0018dAZ|\u001b$@AKf8\u000bRzGu:fӁ\u0004A\u000e\bıS\rA\u0007x\u001b\nw)b\u000e{GMY#\u0016+=iXr\u0002ѵ\u0007#}ˮ)c8U3\u0010'_C!sQ(R.5iM*QxëbP\u0018#BG<\u001ei+B\"98]O\u0016Zę@'D*PByU!_\u0006f^\u000fE\u000bz6ʊ&C\u0012]AǙQEa\u001f\u001e2ƪcU\u0001>\b d42\u0011\u001d>>\tT\u001eu\u000e[mC,Y|\u0017T.7>\u0010u&*\u0001ICߋ\u000bRH\u0004y[^yE+:.\u0019Ԩ\u000e sY\u0001\u000f\u0018*q5b-;\u001f@#\u00153V\u0010;AMhaSF[ek\"XU+Kpᚵ\rss\u0003\b\u0000[Pƺ\u001a<r,EZ\u0005XEe\u0001iX^l- \u0016@쪝b:\u0010:;<\u0000\b_^\nΈ\t\u0017uR\u000ftU\u0012\u000f\u0012jyK݄5\t{Wn+K9GtUp\u000fKw\u001d/\u0012u:<J>\u001ctSR\f\"\n'#2\u0012Ip[\u001fj\f\u0005P]Xo]u×I\u001fvZٔ$9\"R\u000e%Ʊ|\u0011%عR\u0000SL&N\u000fC<Б訟R4ю\u0004gPj!4\u001b]#\u000b߽ g[,3a-\\\u000bw2Oj!M\u000f WVrBLB\u0018NB\u001d\u0000n;1y;yօ\u001d=|\u0002՛qFn^2\u0002&q\u0004S\u000er+.ӈǻ\u0017:\u0006$`\fq$k\f\u0002%sJu\u001ei\u00172wqb)*\u0018|U7j8$\f9ׂ!>'v+!\u0019\u001cٺڥ%ޢsK3sgڛ\u0018giPI]}*+#B\u0013\u0010^l\u0018J^J\u0004!\u0002\u0002ŭE9MbM-va(sn4';\u0001\u0001HG͛7\fK\u0012QC\u000f5tuqU/۬ka`o׏\u000f<>Q)9DCHl\u0015F/:NF3#v\u000eP\u0018\u0019\u00017\u0003`z\u001e6k\f`Nb[\\\u0010З\u0006\u0011KR\f\u0012\u001c]R$9,ʉlQҔ+63?7O$B[\u001cZ~\u001f_LGo1ٽ\u001c\u0017\u0013uFz\u0019\u001b\u0000̀-tӱ\u0013`E\u0018\u0015B\u0019\u0005\u0007hlŞ`H+P\u0011ᡕ#P\u0002kB\\'cC{ӽ'B7<u?C]e\"|ݎ%ޫf\u0002PP!Z8ee2z`LZ&FR\"\\Ű\u000f*J\u0010hܼ\u0011,D,U\\Q\u0014$\bp38>7Q<\u0011f\nfk\u0012\u001a\u000bvb\u0010?$Ӱ\u001bM\u0016TU\r\u0000pY'vnt\n|I\u001e\te\u0018\u0007`1\u0011[Nm?+4<JB6e~+'&P]\n\u0019]حlmި_\u0005\u0007<y\u001b\u0006)\fsL7\u0014\u0006\u001c ѓI.V~M\u0001B#F\u0001\r\u0003czuc\f11A}q7Lw\u0014F\b\\К}m\u0014PB\"8\u000eT\u0006g9RF\n9X\n{\fmK'qIm(\bfv>\u0007\u0013 +SITz1N\u0003\brp\u0018^j009sr\t\u0015)\u0013N$\u0016\u001c*_%¤vjҀ\rL\u0015|\u0011_A}?$ZU[K6\u001e\u001e{\rDf#͜^t\u001fw.\u0017\u0017\u0012TQe\b[F!8\u0005h+6dX\u0007\"\u0001{\u0001Ň*yC]E>ɂn;\u000bc=+0|u9vue3.\u00192l\u0010m.LQ\u0019{ q\u0005\u0014to6VDD\u0014\u0001\u000b*.\u000f#W\u0017\u0010&$N\u0014O%fI9\u00128 g4oNໜ%Qz\u00064>\u0018ۨT\"\u000f\u00101~a\u000bH;P~\u0003n@>dy\u0014툣h=I鷣j.N\rX\u0017Bl$BqwK\u0010Lȇ\u001a/<\u0019d-]\fK\u0010ãm&[aPptuO\u00034~ŷo\u000f[\u0005z\u000b\u0014\u0018ƀy?m5w\u001dۥcl\u0011Â3h\r,^ϣytn\u0000myBdJ\u0018\u0007R@jѼ\u001b\u0004⥛7\u000el%!Hɰ\u0006\f\u0018\u0006d;\u0019ƺLXH:\\)k:,dO\u001cq+7\u0012#o,\u0018l~9Nו׷\u0003E\u0002\b\u001261E\u0005\u0016\u0002\u0015\u0000/G%p\u001axJ\u001b\bG\nZIq\u0006^}BW7\\\u0014 {u\u0013\u0001\u001eS^\u001eE\u000b\u0002\\|0]\bD:xi?ot\rkBWEpg\u0015\u001a\b@Qz'VʷD̾0\u000fCVPYvB\u001bW\u0016uP74\u0018\u0016o\u00050-66v\f)\u001ePKBiv[Ɍѣ\u0006\u001d1T#\u0002~0̠/tBĉGc/L.rW\u001eվàwQ\u0016|\u0010z3o9\u00101=\u0014(3*HU-.҂#SR\u0015_O\u001d͐8\u001c\u0002\u0017k\u0000=W'\u0011ِќ\u0004&\u0019i9Zee|z=[W9xk\u001ccU0w\u001bڑL`XΗ\u001a\u001f\u0018[9ɓP\bz\u001fpҷ\u001e]hF1&\u0007T\u0002\t\n\u0010p\u0013ܛa\u0014\b;\u000b41gm W\"ܕn5p,<K[t:;MLMI!&B.Z {<J\t*w\n @̨h8VcH /zCű\u0003(L\u0013v `_\f˵!tu=\\+h8\u001eP4q>r\u0014\u001d2\b\u0002G!.|d>=ټpyVeס7&HHv/\u0014a%\u0015KT'͎Cnш$\u0002N>d}U8\u0002Lf\u0012F\u0006o\t|zav\u000fx*XZ'1+'K5;#-\u0002[<\u0002V\n\fFJ\u000eR[\u0012Ck7\u0001m\u001d!q}k(k\u0005oI0\bX\u0018ޗ-/͆\b\u001feɵ\tߣٹո\u000e\u0012£ OÉhfݫkE[}[\u0014o*q:\u0012U\u001eO\u0018$1k\n-¸Ǳ\u0001\u00106\u0000\u0007ȶXҟ!\u001bw j\u0012Igm:tಥ\u0015A٠\u0015~`\u0012.Z{X\u0012 z/y\u0018?lTܼrK@(\u0010_lHH\u0002a&W\u0019@@^@Vƻޡf\u001eʓ#\u0019L\u0002kgT,k_Jx\u0001)\u0019TlOed\u001eIct/r\u000e_J(\u0003 0<RP\u001bq-~\\P2'^xl(\u000bM\u0006IҪN\u0007R\u0007#\u0014cT\f\u0015\u000b\u0013ִ\\j-\n\u0000\tٶAǓcQߘOBo'\u0005+`\u0016)\u000e\"#&`۠Ctst\b@{I0\u0005[6\u001bsNC\r\n'%ړ`B1^\u0007p^>;V<-\u0006nن\u0019ғ1H\u001a\u000ePHv\u0011\u0013\u0012Udf~X0ظxkV:\"2\u0004<h.t\u0005\rQx\n@gZ\u0007_׾k}~\u00151vejpPQNuÑy\u0002qLTO>gd`\u001df)NMƫQKo?(\u0015|tN\u0011얡^\u0000}b^\u0002N\u0012%P\u001f{H\u0001,!Ŗ\u0015N]@6\u0004NBy\u0018\u0014v\n.4=\n.T(L\u0006G\u0005mՕZ\u0018#M7|v\u0014?\u00190\u001d&m\b5 u:'SWTVnTJ\u0005d?\rM\u0004pفNlgX_ḴjNbT%=\u0006^%\u0013~VF\t@\t?\u0018/D?he]\u0005\u0010i\u0011C`#Zh\u001d9\"̺5\rr5PBrDo,i!9U\u0006z+\ftaI@'NƘIFیb\u001f'ZZ\"Á)S\\\\\f2\u0004\"ASΝR-%hy/V\u0016\u0002՚%M\nxz~2Hߗj`)0X9w_2ZMVOis!\tAu4in\u0016m];:m>\"؅\u0001\u001d\t\u001e(&\u0003!\n&c\u0002-\u0007L3=\u00100iS\t\f޹\u0015*n\u0014/\"\u0002i\u0001׻\u0016DV\u0004Q6%1E:wv\u0002\u0017T\u0012 \u000f\u0016dIS\\٫iP#\u0017X/Hog\"E\"+Lv&e?\rTwe\u001eEO:D\u0011XbkjZ`o%}\u0006\u0010\t!Jw\rI*\u000b\u001f,\u0019,`w\u0000V'|N IBX\u0017j9$\u0018Rr\u001bX4X\u0014\u0004Elv<P\u0004m\u0016`\tY.\u000fq=ua\u0015\r\u0013\\2|)\u0019%\"z\u0000c\u00064c[QMT\n+&]\u0012p\u001e@\u0012\tq\t\"Ar7>w^\r$;0\u001bK{C\b\u0002b\u001fǃ\u0006DՄی\u001bܠW\u0007%M\u000eމD\u0015`T\r\u0010NIfct\u00029\u001f\u00104o!\r\u0006;Zc,T\u001f8Oz)CU\u0003\"&t\u001f$&s> ދ\u00111lW\fg\u001e˴\t\u000f8\u00162޿@}\"@3DQ킘,@\u0014!\u00154\u0016\nw!BxS7N\u001f\\,jM\u0013;@!$HB\u0007!S#M^sƞń\\\u0007\u001f^.:\u001eg\u0015E1 2\u0014e7)n3\u000eX[\tLaE3P7΀͋'\u0002(if3\n3\u001f\bR*C[\u001fϾFIs\\7G\u0019a\u001c\u001buUH8s͓sr\u0015At\u00051E~\f3z%:l7\"wDa/Ѯ#\u0014*\u0002oHaH\u001fɑtĎ{ſw+Ǎwc\u0010p\u001atXH\u0014Y\rg8O\u0002z\u0013후W\ruUMpofnB\rΖO\u001e7\u0010Ry\u0003fhLYN^y*Ds:s\u0005]H\u0004!'RK\u000fA0v\u001cW\u0014`!\u0004\\@gZ\b{Bn5Gm\b\u001b\u0003dL\fAŕ\t>KFʲ\u000bw\u0006Og1`Txo#\u0002Nͷ\nǻy2E` q<ȕs\u0007܍\u0012\u0003g\u00168Oެ\u000fDEiM\u0013@ZQyhfCGOJz\n2h:\u001b5>\u0019u!\u000f\u0001եElYv}b1 \u001aד\u001b5ʙ*4b\u000b b9r|~$LJ\u0000\u001cl\u0004}R\"[m UA:\u000byZH0I\u000bE!t+ub\u0002zs;@\u001b\u0012QLL5 l<+`\u000baɢGM\u001b0\nb!fzp0vHDዷAT9yU;lg拈w\u0002hk\u000736夬\f~\u001d\u000eH,e_BӬNÙ\u0019\u0011bK[PgI)\f\u0019\"1ͲA\u0017\u0018i\u001d.$\u0004NM\u0001j\f\u001f$\nP;cAr\u0015i2\u0011qF3?\u001ak\u0002\u001c\u0015䍳횄(d\u0006g`R{FT@N+N,\u0019r0\u0018ʰ)3b\u001akN&^M6d?Ox}\\\\-V\u001b0^7XiF~zh\u0005QhՏK7\tK\u00011Q\u001dB5\u001cT^dE\u001b$\u0013\u001eַ/؏у'UfY%!lAvv\u0007|*9?iϠl\u0012r\u0014P/G\nx2\u0002MQ(m\u0010%-E:;4~vo\u0006\rSSxGDlTW^ m\u001e\u0007Ѝ)A:ZJ\u000fɮ&br\u00031|\f\fUXhM\f\u0015:|KqKAHAam<DNzҔYlT7[:K܎a\u0010ORw\u0016HX_})盿lUu\\g#(\u0019NU8!py$\u001aqR\u0017o#`@kH\u001c\"vWr3\u0015\u0017a\u0005xv\u0015VQ^\u0019\u0010PqpJӄuf\u0012\f;\"~!,U\u0004&'wA\"\u001fN~4w+e\u0017\f_W(͎\u0017'yy\u0010!\u00036X\u0004sz\u000f*N\u001ajpdQ0u\u001eO_Ųz\u0007VQ\u000b\u0019jD۩Ӌ\u000f6ft\tr.M\u001cG\u0011|yiSW\u0018'f1Zp#ܳ\u0000({TDR:f%\u0010堺\u0010ߚ)\u001cD\b.5\tc)]-\u0000Y0L1g5??\u0000 ^\u001bk\r\u0007%\u0007}\u0014\u000bS-\u0005mޑ\u0012],0j\u0011}OѤ@$.\niu\u0005% J\u000eeb!4\u001c\u0017u\u0000\bJ\u0019𵕎Q4}\u0007MB\u0012$\u0003Q\u0017K@XwGi5!Ӭ0HQbZD+D\u0019NqP]|,}8\u001f\u0015\u0000Mބ}Ҧ\u001cpm`pce>ۆ\u0000իWFPrlgӘۀx-\u0017d^7 \u0019c\u00157\u00061?\u0012@qK\u0000:\u0011m\\jY\u0018\\\u0005NŞG\u0004\b\u0016\u001e\u0001\u000b@7\u001f\u0003Y1\u0000\u0011\u0019lH0\u0005)ɇի,NIAQQ\b>T42?d \u0015qfPǬyOi\u0004~%\u001cQ\u0013X\u001dv\th,\t0L_\u0004DX6F5c?G,R47Z\u001d\u0006k\u000e(8؝Pkz\u0004bu\"\u0006\"'l\u0014Z\u00133SOydЉ\u0003Mz\u001a\u0017}+\u0016=\rXL@HkxgC^l*\"/\u0003}d\u0017(5Z\\\rUIcZT=H:\u0006P.+Iv[\u0017\u0017@BN*#R᪌\rNE,jo\u0004^yiFK.4\np[AKcc@\u000b{&Z\u0018s7Î f#Zgn=MKT7YG\u001b7a\u00120[!\u0017]<f\t!葱h=CP\u0014e\u0014t\u0018\u000eș?\u0013\u0010y\u001a\u0012\f+.o-#Z̒\u000eư~R'#PCi,nCv,<%dʉ\u000e\u0001W#K?2#2\u0019\u0002}\u0006\fOY\bSOAJ3HO1\b}\u0003ꮔ\u0006uh4I6\u0015\u0000ѝ\u0005Ѣ\u0019n.\u0007\t]\u0007v\u001f}7\u0004KeˊAT\u001f\u0015\u001cc.\u000f\r@/Į\u0012zB\u001c5o\u0013.(\u00039-qgO\u0019\n\u000b\u00188\u001eA M\b\u0006k[n\btl'Yw\u0001n\nzcy;N+1ΜK\u001d<\u0015fsaƪ\u0019\u001cc+D9ݽ\u0014:\u0012 \t%dI\u0005๷=\u00176g\u001b+\u0007-\u0018ޔ>ysqql\u001e\u0019a:EVu\tREҜ\u000f{4|`rao\u0010;ƥP \u0013\u0016\u000eP<\u0016t.ch\u0018z*\u0011Jd\u0014yGjꙄB\u0015-\u001d\u0003\u001eDф\u001c_\u000b\u0002-.3\bvH\fF\u001bG[W\u0011BA\b \u0012v1\u0000u2{n\t\u0001\u001c vtOGހR\u0007\u0011V({3';qO;3\u0001\u0000.0\\\u0016d\t[CX\u0013~_֊*\u000eK[.t\u0000\\>F\u0013w\u0004~/m\u0018zWN\b\u001e{WR۹#.\u0000z\u0019uohizTݒ,\u001f2\u0003rH#Byf/ C({\u0017FC\"nDp\u0007\rn\u0006t\u000bQd4[k@4u\u0010\u000b\u0000K\u0007d%QE\u0003a?AN*Ӈ0,\fl\n\u0011\u001f:V^=\u0004q_LO8n@\u0019\u0010k56L\u0001?,N\u001asY\u0014\u0010$#by\u0019CfH΂hP$^^-Z\u0018Qol@|5AHHy&\u0018Vx϶\u0003o\u0018qh(q\u0006e\u0016duB\u001f:\u000b0\u0011-ڜ4b'6^mȦ=YgV=> \u000b\u0018\u0018\ti\u0004\u0014QӴ\\~0*jK|2\u000eW 8[\u0015q\tQa0nT?6\n\u0003W\\;\u001a.^s\nyE\u0013'\bs}]V@ք-Ŕ)U+K+\u001fU$\u0018Mp^ƙ.@ɚ8w\u000f\u0017\n\tKcH~U\u0005Ғ\u0004Z ܖk\n\u0002s\u000eK\u00168zLm+=LrfYCP1uƮ5RVE\\&;fr\u0003,\u00139\u0000p\u0019tHԼw>\u0013\u0015\u0016\u00034l\u001f8WFB\u0005j%\u0003\f,ǚ䀥E\u0018%/@,)Zi|\u0010'\u0012\u001cP(<GlM\u0000?4&g(V\u001d\u00007?~#\u001dD\frL\u0007\u0016/@m[$\u000eDa\u000e\ti\u001evNO%Td+\u001aGQgU9s;{4D\u0015]iUKkn7~\u001eK\n<\u0013k$qo0;?\u001c\u001cPK\u0017tgB|#y)wsV.4Np(\u001fIGFt8)9*۫f5\rp*u\\_LRJ2&o/H\t3kܒU\"sat\u0007\n}?ۆ\u001e3\u0005!49j7C\u0016pQ\u0002,\t^st^̐\f\u000eJV,i\u0005a4)f2c\u001cF,pew\u0016?\u000b\n& a\u0006>`}#`$lz/;,\u0007=ko\t)\u0016ڗg0 y\u00076ܫ%6;6\u0001\u0010Zi\u0000}<\u0010àAV\u0015k,\u0001\u001cnH'~aBx\u000f[Qnʀ\u0005{\u0011B\u0001gc[0Fl\u0011\u001a֒Lg\u0018\bok6^v<c\u0002\u0004^\u000e|\u0002\u0014@\u0007.>wf\u001e\u001b^\u0018|e\u0018l\u0016P}\u0005``Rf/1Vh]tHb!q\u000e\u0013ט>2\u0011K\naǽ\u001fx12E\u0017$jm5\u0000\u0015#q%\u001ek\b\\y\"57\u000eK|kz-Cj?k2\u0006\u001dv%$Di\u0017\u0002iгWs%\u001f^L\u001el\u0016N\u001c'\u0006\u0016&TnYD\u0018(`\u0012SiQ@1\u0004Wz\u0000Bur[L٠<j\u0018\u0011\"0mGK#X\u001d'#.|\u001cfq)9\u0002&M:.nއ\u0012q\"\u0010\u0015m&\u0014F8\u001c~ME qs\f)F\u0003\u0012I:\t\u000f`\u0010cGf@_h~#\u0004Kw\u00010kV\u001b1MVK[\u0001⸦\u001e\u0003\u001fH4#\nq\u0014^e\u001f?PPЏޒ]\u0001}.EΩ?>N^'j\r>ؐJ(Q\u001d\u0016\u0012,IД\r!1Zk;\rx9\u0004\u0006~*(wf.pzA\u000fO@Q\u0011bW\u0004qWچ\u0012ZO\u000f`p!΋\u0006\t-$\u000e6&]#l9\u001f{ZJ&a\"t%5+?\rz\u0019*>T^C\u0011_njY\u001e6B9=ә@R0y\u0003p\u0001\u0019i\u0002\u0000y\r'-OLP( -\nqZ\u0015l)\u0013$\tjoĞ\u001fәЛA[@s\u001fdTgr0\u001bɻYL\u0010\u0016¹*t\u0017˪f\u0014Vxzn\u001f+\u0011J#x\u0005\u001ed\u000f\u000b.qEavgEک\u000f\u000fQ\\&G3\u0014\u0012\u0016,kt):y~jVYpS\u0015U]r(h(3Yp\"\u0012Uf\u0003wg/v=GbFa%\u0007\u0002\u001aj:\u0007R~6qm_\b-\u000eӞ*$}Nyd1,Sif,\u000b8\u0018?O@\u0015\u001d9&+\u001b\t\rAw\u00177-#tƊ\u000eZګLJܖM_lR1\tʝA5 +:΀B2yI\f\u0019?^\u0007ST\fȟk\u0010'ԋ+WU\u0019\u0016lO\u0006pzjia!6\u0002\"\u001d5/%}\\(\u001e%l\u001eMF\u0010\rz`zWRQÄ!I\u001b\u001b#d/][\u0016li\u0004Eۚ><\f\u0007­+TW\u001aLv\u0018O\u0011#՛\u0006~T\u0006t1;hf}\u0002\r\u0002svwZʩi&\u001eXk\u0012>J.^\u00000!v\fQQo'\u0002[H69aP\"\u0010c=y\u0012t,&\u0011'\u0006'\u0019Wd%?!$ZmYE嫦\u001f\u0014:ƺ\u0002RvkfL\u000ep;%v\u0001\u001a\u0014*,2\u0011iH7ItI!~J\u000e\u0018\u0016\u00040}\u0004\u0000\u0000v\u0017<\u001b\u0003\u001dlj[\t\u001clLW\u001c<\u0010;\u001d./\u001cm+\u001f\u0012\"U9\u0005']MI\n\u0014\u000fH9H9uM\u0006~.\u0019mP4\u0010\u0016T\u0013\na\u0012:!@wn\bk!ͲdT\u001a\u000b\u001bxRٍ+.(\\}\u0003Bz3Gsi\u0003\u0007\u0017\u0007м\u0005:j3EK,\u0002FˋEq\u0005\u001eÉάW\u0002\u001eT/OP\u001cg\u000f\u0016K\u0018;\u00182 eo\u0015\u0013\u0015%LJM\nX\f\u0002'B ̍\u0001ֲ\u0000\f\u0018\u0005\u0011\u0010{u\u0014ʀ$ݾ(_}BهS\rT\"!jrFu0xR\u001ccW\fM=AT\u0018\u000bZ+\u000e\u0004\u0003). s5.bHM+]@Ũw\t;8\n\u0007)Q|5'\u00168\u0006mw\u0006Y&e\u000fs)Lc\u001f\n,\t0켻\u0001T,t~\u0014zp3M\u0016>GW\u0019s8'|\u001b\u001b^R#\f+\u001e$+\u00045A`V>\u001aŸB|zEi\u0006G-Bk&^l\u0012~1zhWj|ePHzr/\u0011\u0007\t 5*:&\u0007kWg߫\u0005Txc4Nʷ Xѿkٔn?V]\rm\u0002m5\u001ew#\r?ȏ\\茔#pk;:?`5M#d[sGC`M\u0019ydYAm#x\u0002j]\u0007_`0\u0004\u0017مNm\u0002\u000b\u001b\u0006\u00050$Nm)X,Ke:D\".dWbs\u001cQZc\u0011j>6jF[$j,{\f~7G0{L\u0010\u0016\u000e=Qky\u00176buKR\tM,ަJ0š:xe/vb5z\r#\u0016!-9>FgJ\u0018`08` .Y3:k׼G\\B|!\u0001\u000b,L\u0006p\u0016킅\u0011Vu}\r\u001eU\u001c\u001cYQ\u000e+9HU|A}iUte՘eK\u001d\u0013scȜ΄, sPc\u0010*~^}(W9dKީ.4 \u0017H\tfJo˥\u000f5f`~\u0001Sx\u0019\u001cӣ 4\u0016\u0016u\f?X]\u0012\u000b8@\u001dڼH\u001f;h=j5\u000b\n_E\u0010Nj4\f\u001a\bi\u001dhe(\u0016\u0017\u000b7>M\"[\u0010\u0001I\u001bȃ+7\u0001\u0012q\u0015i\u000fda63S\u001dt\u0000^5\u0003%\u0016m5L\u001c\n\fTtpSG0{q4tp\r8H\tqY;I/\u000e$\u001em\f\f_-NY4\\'|\u00158B\u0018՘\u000e9aFS,;\u0014Ŷ52Ȕo'Fg\bǀkU\fP\u0011mϊ\u0018Ab\u001f-5t01\u0010x+ӓj\u000f.\u0005`㻩\u001777b\u0004\u0000\u000b\u0018 )-ڀíHSf-ׄ`ash\bwh|\u0002>Lfާ\tݸLCu\u0000kS\u001fB\tl馧xӷԱ]{\u00064\u001cؚnCp\f\rq`4xt[hԊ\u0002Uc\u0018ǣm\u000b#\u0006z,\bbo\u0005|x\u0007a_=%sԎ.ZtŤDc@\u001fX\u000ex\u0000Q\u000b.<4RkR\t\u0005~\r\u0011\fy~:\u001e%\u001ezVu&\u0000@6\u0005Y,\u001apbG\u001asoB0%\u0014z֦P\u0006'Ym\u001bume\"H!4ұ1\u0001c)Xu\u0004Fb5wߴ\u0018~ _Pv\u001c}rrO:`aZ\u0011B!$+L80\u0006ޱc\u000577\u0014H2ޑ2{`\t--\u001e\u001ee8w\u0005:ೀ\u0003oГ \u001f\t~\u0018\u0014z<\u001dv\r:N\nW9j%\u0002ݚ\b\bx!Eօ7BZ\u0012y\u000b1\u0018$\u0000eȊA]n@\u0006bV\u0007\"ی\u0010:j%\u0012\u0007ME4\fc*\u0003\nK*@* T6xhU/hM&F\u0010ˠ./\b]\u000e\u0013ʎ\t\u000bk1N]yl\u0018h=NhZ\u000fzg1Wj(\u0004\f%!!G\u0010\u001fe:\u0015\u001e\u000f^`{㛗l\u000ey\u0004:.<T'n%ߞc\u001c˵\u0012\f\u0002FLme\u0011ohA\u0002\u0019@Y*R\tRkFq\u0003\tі\u0004ߴQa\u001a.gGE {$\u000e(-9$\u0000\rf.j\"=\\\u0002@Z;@#Q\\۠)tt6KiЋ\u0006\u001b$Z\u0015>OQG˂\u001c}:@\u001bd\u0012'̃Yd!jhKH\u0007\u0018O_\u00132%w`\u000bX\u001c\u0003;<\tAmjөJ_\u0014{XBѕ:\u0005W\n[`A3V{glhi%H\u001d)TB⎯G@vK\u000f`v+!\u00195{@?\u001eB,iu\\5sۋ\u001e<>>߆1r(,\u001a>\u0004х\u000e1r\"\u0003Ϯ$\fl4a\u0018\fc\u0003\u0006sm\u001f˛W?:$(\u0014R\u0016gO)\u0001\b\u0018x͕\u000fi\u0000ȓGw\"[\u0000U&*2\u0018.x\u0006|\u0012`ͲFF\u0004P2];\t\t\u0015dEIHE5ScϟBċ\u0006#}ЍssfAF)a*j\u00050T\\DD4\"\u0012!^\t島<\b\u000bLb\nu\u0018ʠk|cG\u0003\"\u0012k۷\u001czq1(*\u0012.HĴT1kp>\"A;z\u0015\u001aXQx\\7(9smc\u0019NpIߙq*tTxZBq]wkt-\tigD8GsSu\u0004\u0016\u0011\u0003b\u0010R\u0019\u0007B!_R􉟧\u0001H`p\u0007gGtu'm3F$\u001cjNm0T54ф\u001cM\u0014i\u001b\u001dAR\u0015D\brCV.v*S[bhl\u000b\u0001\r\u000eqpk\u0001&-A2g29\u0016\u0011\u001fBM\u001c\u0002ۼ\u0016s-@R\u0000;ux\u0006\u0002&\\<PdqY-\u0001}RLY\u000fv<\u000fL:O=\u0000=\u000eK`YP@\u000b\u000bp6\u0014`a\u0000TG)T]\u001f\u0017\u001c'\u000fw\t \u0015|\u0002i,Tm\u0018@\u001a'\u0006\u0013N\t\u0010E\u0003|\u0013M-X)ڞ\t=#mF֪m)chU\u0019/zH:\u001fjY\u001e1&ZZ\u001f\b-Da{90\r8@\u0005qR\u0014~\u0018\"Nn4\u001dm\u0005i\u000eI6ͣ\f~(\u0017\u001d~M9¾S.!>]\u0016\u0001[\u000e~\u001c\b3\u0000 ˉ㱉\u0003|\u0014oj\u0005N'n;)$UZ \n\u0012&\u000e4\t꩐cMR\u0001\u000bj[O \u0003\r,\u0001-^iMbq\u0013ssY֚5\u0012\rd=\n>z.\u0006\u0005\u000f\u0016d=\bv\u0019r\u000e\u0018y:ڙH#k#[\u00133N)ŮLzYpI \u001c\u001dyI\u0006\u001fqW_\u0004\u001d\u0019=\u00135y@ 9)e\u001e/\b\u000e\u0019N\u0003\u000e\rY\t@HM<Q\u000b/7u6+ʣʷYU~Jdop@ڟ\u0007\u0016I~'WkAJ~MFb9\u0001\u0019\f\u0002\u0014\u0000oT\u000fY\"K\u0010A|\"^\u0015\u0017\u000f\b%\u0018Rڏ\rMz\u0007R\u0014T͢\u001d7GM ßXXQTY_w2[+`?OQ/8e`\u0014Db'w\u001c7k\u0002ǈQdFQ1>\u001a(xGhR})~h P}C\b̷bz{\u0000&\u0015\r\u000bПW\u0000A$%\u0001)\u001e{\u001c3'#@*\\l\u0013\u0013+E\u0015!\u0005{(*S6awH@\u0016\u000bEL\u000eF CDU%iǘ\u0019S=&\u0000j6\u0011NiU93\u001b.\u0002\u0004kdI\u0006Y-9\u0013CLq}y\u0010\u0004lOi\fS0\u001aRfWb\u0014!9*\u0007 -^p\u0019i+(F\b\u0007b\u001f\">\n|S8\u0004iA%\u0001\u0019*U;T\u001a\r\b8\u0001\u00129\tl\u0019E\u0002NX\u00142=]LÊ\u001aǐ\u0017u5.\\2 ]\fhה&h\u001f ^g\u00106\u0000\u000b\u0004hAv\u001d/^\u0016v\u0010\u000eC\u0010$\u00003D\u00069\u001e=i2\u001f0}L0E\u00053_\u000fо)F\u0018Sct\u000b,5T2ك.j.pZ+FCsQ\b|#Y\u0010״\u0018~؟\u000b\u001aZEZ$l\u0006PZ\u0001N3x6Y=0{$i5};\u001c\t\u001cr=l\u0000騱,\u0003,\u0012O0NkfY0u$:A\n/T\b\u0000CS՚ L'\u0000Y(œ\u0010F](\u001da\u0003<C\t-I87ԠT\u0012/t͛VY4\u0017[WITVIHN*HTqTnc@p\u001c!zݣqx0㏌0\r3TmB\u0012\\\u0014Z-@͌\"\u001c26\u0011,qUB>vVo\u0017[\u0007в\u0007ez \u001f #\u0003\u001e\f,\u00028e~AcQ>w:\u001e0\u0015ݭ&\f7pI0B\bz\u0007 !q|RvG,G)\u0018ɀ\u0005Ƞ̿,7!\u0014OJ9\u0014)@A8'(zG\u000en\u0011x\u0002Lـ˯}WpI\u0019n\u0011\u0006\\߽Y( 2\u0005`2\nsWZ\u0011뗱/Gu\u0002lEf)^E\u00168\u001et\u000e\"\u001d\"X[\f\u001d3\u0004\t\t^NT{7UE\u0012TkA'\u0019\u000fH%8}S7pb%CU\u00021];D\u0007\\\\`7I,\u0011d\rC#\u0002\u001e\u00049ƴ\u001bwF9\u001ed\u000b\u001aYvbE?\u0012v\u0007\u0016iA\u00030\u0016PB\nj\u0015+\u0016\u0012J\bBK\u000fOհmA\\&0C9?2T\u0014\u0003\u000bZdڕũVwL6q\\\b48*\u0010Us\rrf\u001ek\u0019A:>8̒>^\u001eTJ)/qI͎~\u0007ߺX^\f\u0005y-\u000f\u0012\u0005\u0013q\u0003C\b\u001f\u0013\u001d\u00014m\u001bn2\u0007]\tB\\U&BmBe\u0003\t\u0001xe7U\u001e\u0011/\u001cZ\u0017\u0007H\u0003\u0014#\u001d\u0018Ӕ\u0003\u0004Vmjh',yyDu4N\u0002ZuHOze٨\u0001LY1Gn?\u0018?\u00031yRfVEL(\u0015E\u0001W#\u001f\u001d?H\u0013D>\u0014dA>\u0005?\u000e\u0004\u00121\u001a^9Aɕ_s\u001eVfC9CdwU$\u0003':dsAHt\u0006Vs봲p\u00025lXL\u001fБ,󽘚\u0016\u001aqb/yGV\u0019\u0013M/D_ϙ+2\u0018E\u0001Р\u0004\u0006+v)z@G\u001aަRz̡jPS\u0000\u0015JJ4H٤'f\u0019\u000fg\u0013Bi񮁞ZI,WP\u000b\u0010\u0010>C\u0001$kg>%$6&RKґIVDCH\u0001S/u/Y&S\u0010p? F2*-Q\u001bAvKxk\u0010r<$TH,/<\u0017\u000b\bLJ\u001bN4dW3L4\u0002U\u000b;vQ\b\u001a$,Ĵæ$+L.k\u0001GnCb,H\u0000iV\u001fxuI\u000b3t(F\u0013(\rݫ/$u~}\u0019͓`='hTu]\u001dH|-Ւz;E{_H\u00077~I·BGڅݔ\f\u0019=aoI%dFSO^H\u000e\u0012P\te\ffqQ \u0006\u0019VM|X\u0017\u00133\u0013j?{/LEh\u0005\u0010b8\u0007hSQ\u0013SRd(Ct^TICmP\u0015&2\u001ax?\u000f\u0000?\u0007R:z{(G\u001e)SEc\u001ef\u0019\u0002\u0019ihv\u0019\b\u0018Jy\\!̕M\u0015@}OUUkb\u0018fJT \u0002gWu\u0010Xw\u000fq\u0018q)Ó`æ\u000f0h8\u001b\u000bH\tMp\u0017\"\u0013kX([\u0007s?\u00034xi}Qk˒3X\u0012\fi^[8L)\u0004\u001eP+-\\B<F#>a/\u0018VT*\u0007AB~\\C>>4ސY \u001f.h@| ,q+R<dN9ǁ.UCP+\u0006ݦ\u0000.niC6#gsI@(c\u00166\u0005&\u0012L06 a_(XC3w{\\|<<׊H{@RT\u0016\u0015ײ\u0005$Y \r\u001fNb)@cô{ΠfH6\u0004KųY*\"\u0000\u000e\u001aI\u00017<++\u0018g\u0010s-vy°T܇\fe]\u0005\u001a$Z/֒\u00189P\u001cЮUBdkvr\fZ*>*vM\u0011A<:0UHvB(킱$P\u0011Z\u001c3E#6\n\b\u001cA!\u0012:\u0011&\u001bo\u000e\u001e}\u0013D\u001c4\u0016Ďv\u001bdm+\bJ\u001c\u0001\u0012r5h%N\u001f<Y_\u001d+'=v01}\u0016\u0010U0\u0002\u0004lt<J\rL9Z\u0012\u001b|\bu+αm<\u0016u\u0003\u000e9ӆT\u0003YL>j\u0015ft\u0017\u0001ݡ^](\u000e\t\u0015Y\u0011vV]\u001c:\u0010EU\f챒}z\u001bwk\u0005\u0016`h2P0V-DD\u0018()n+'^Hldu@>L6\u000f&d\u0005j3'liaUiF\t\u000eq0MM-W$ad\u0013ZN(Nsu~9yk\u001a=y\u0003f(%\u0001#\u000fUަ@aό\bt|\u001dp&ɰyiE6|Jpɱ\u0019u 9+ƷSsRe^#I)\u0000Xb\u000b3\u001c[irj;\u0016.T\f*\b\u001ee!N'-\t|̈́~\u001bm*S5\u0014{)\u0004\u0006n&ϐuȖ\u001dTmұYU`nzh1\u001c`0Ϳ?qZ<\u0004?\u0014+zόp\u0005\u000fY8t_\u00057_\nߤa0g+n\n'l~%J>)]6g[r\u0007\nmn\u0001\u0013|JW\u001fc{L9YhEbTՈ@B5a`/7hcV*4\u0006x\u001b\u0004\u0006҃@Y\u001fL64O␗<\u0006`\f$@\tTi'c1/#(\u0017:g\tҲ\u0016Mi\ncLTA\u0012QVʊ\u000bU\u0016\u0005'\u0015YIM'I\u001aيlt|GF1Lף\u0012\u0016\u0003)vӍQTu\u0000`\u001d\"wq\u0012\u0003J\u0003\u0005OC)&6?\"\u0019i+\u000b\u0012/pA\u0006\na0x$:d\u0013(\u0011M\u00035bҾb]g-0\f1K%4{\u0019b\u0014]bmM{\u001cY}lء:v\u0012\u001b(\u0007l\u001a\u0016bNJ\u001ctYQ,4r\bc\u0010o8\u001f4S,rW7}\u000e\u000fygbu\u0013Ҳ+p\\B5ЏG\u0005MS*`ثJ\u0000B\u001a<#\u0018#cϺ8_N\u0014n\u000eQ\nLi\u0012\u0010AJdd·pE3igR+_\u0002\u001f\u001c#v)\r#Oc50ҞŢ6\u00128NKJBbs\u0010!UF\u001b\u0014Wj\u0018\u001cLD_r52wn\nf\u000b\u001eYllh7E\"+c\u00105Tŗqo55\u0007&\n~ecqF68\u001c5(\u000f\n|d\tI˓и\ńBV_xB>.h hMھ惫\u00142bѥ_D1:M\u0019TH\"j.xuv:+\u0014{zҎZ\u0011\u0014ⴱ};\u000f<nT\u001c^\r7\u000f\u0001]\u0000\u0014{\u0015\u0012a\u001c`oV<+\ny\b\u0005^%\u0011HxO!!z\u0010\u0013ġ\u0014l il\u001fP1\u000e\r4;k=Z\u0015T\u000f}\u0017uĥb\u0005c\f\u0004J\\\u0007N\u000b\u001dE\u001cע+1$SIW0v\u0007gZ\u0017^e+\u0015MPHJ:,%2\r.#J\u0011\u0018\u000f| \u001cK)&\u0012\u000eE~!,r0jv\u001aFJ#Ps\u0004JwJ)ހ%-FoE9|)Tų\u0005\u001fU)\u0001|/G\u0018GS\u000bE_\f\u000eq:YX|ÍK$\u0011\u0011-X9et\u001d{Q\u0001~tz}5R'\fc9Xb2(K0<1s\rT2A\u0007\u0011JںʄFy\u001b(Hs\r\r\u0018\u0013D\u0000pj\u001a-\u001d?-jZ>P\u0018m\u001agp,Si,5xa]X\u0014\u0002)GE|Oԁ\u001f%\u0004\u0001움f;\u0001xCn؈ZO\u0002\bp=\t~\u0005aX\u0002⨧\u000b\u001a\u0019? `X\u0001qr\u0011)\u000bO2@NfLf9dA\fkGE+<`+\"\u0000<\u0005@ӎ*r2r\u00018\\\u0001TL$G\\G\u0015/2ủvAE\t˺+mȽ\u001429\b̪Bִw><f\u0006'K,0\u001f愙\u0016;c\\x\u0013&;&*\u0011nx,ш?~\u000f;]:/'r8uh\b#5\u0004mƢ7^\u000e;DߣC\u0006\u000fer\u001fOp9A\u0014(\u000eB(\u001fk$\u0003D\fX:w/[i\fBx\u001f\u0001w`3\u000e܂\u0016\u0015_\u0019\fsއ$CB_\u0014%\u000e$鯾\u000fb\u0001kՋeXX;\rTF0\u0006\u0012!WUyU֚QZ \u000f\u0007\n\u001a쁝_i-A>(S\u0017!\na\t\r(d\u0003\u0011\u0007~\u0007m6\u0019mr6o\u000eH:LyXi!׽v\u0005L}Q\u0016:\u001fn\u0001WNu`l$x}O&Z<\u000ewS\u001cnLVwTmR'/&v!\u0004ڏB:Ġ&G<a\u0005\"m=\u0015'\u0001{#/8t\u0003\u0011(QG\u0006LN\\!\r,Bn\u0014u\u0004~Ҫ;\"|z\u0005T8 8\u000bA*GO;\fϵ,Yh\b:]u\u0011W\u0004ƄqchdaL?ԙQ)Tzc\u0000g\u0013D\u0005\b1cJm7!\u000f+.`\u0017U\u0016\u001aЊݙ7tf#\\bW5rL\u0007\u001d#óؿ\u0005\t\u0018\u0010\u00181\u001d+ыXéJ4\"\u000e0Lā\u001f\u000f\u0019\u001eV\n\f7Ԍ(\"8,\u000ea\u0010>/#0l<m?\u000e\u0007\u0000\u001bY2\u0010L>ç\u0004]R/\u001ct\u001b_WFi \u001dR](H\u0013k\u001cᴚ9ءӽ!pȹ3\u0016yaڎOOt\u0004Rq~t`>\u0007JPZO\u0017>n(r(?TǶW\twEQӶ[5ۅ\u0002ܚ?i\u001c\u0006˿\\\u0015IY4,g=KN@yJ\u001f\u001f[S9r\u0005л3;d+a\u0015r\u001b݄r7sӮ|w՜V\"m\bDI\u0000\u0004ܙ/\u0012kr,\u0000\r\u0013tt\u001a\"̹/vۍi\u0000*\u000e>0:>Lcl .e\u001e\u001dF~/\u001d\r/:#E\u00136ŧ;Dp#?\b/\u0006&ƺ;1ܒ\u000e}qT9o&\u0006\u0019\u0000̣j\u000e\u001aX\u0018б9\u001c\u001aUP#uثoQ_\u0014h9Y41ǄҞm\r\u00157}1+Z\u0003\fL\u001b\u0005~(ä,:^:5bЋ.gf\u00184.\u0001=\u0018gJQ\u00017芸AseH9Mt_wMsq\u0013^N\u000e\u0015T\u0005cgo\u000eY\u0016BGs\u000e0ϓv\u000eSC8a\u00030E\u0018{>7yS,\u0019\u001d\u0012\u0018u&4!/\u00047{s~9tDF\u0004H\u0003\u0000*B\u0013/Ձ3\baUv\u000e7o \t(3\u0013\u0001K\tCb>\u0012:\u001e9$\n\u001b9alU/0BEi\u0002\f?}uU`^@|>\u0000q\u000b5\u001fQZ:඗mg\u0007`\"\u0013\n/wUbe$\u0015P\u0013\u00123\u0010c*űScdM$\u000f\f1{\n\u0012n' )L儑\"H~T?uH*\fObC9<ɳj\nH^A0>c8\r-\u0013r\u0010\b\u0013Qh:\b\t\u0015m\u0011>/pnbf\u001a=6ʈ^Z\u001cK!\t\u0003\u0012F\u0002KA\fI Il\u0013M\u001aa)wxDY\u000bM>F\bBDr/a# H\u0010\u0011\u0010F\u0003|\"AZ4\"Rm\u000b%\u0003!\u0016$9q+Nm˲SQ`1A\u001b\u001eW5.+D_\u0011\u0016\u0003\u0018\fmK)'А\u000b)>'Jئ׸|\"/J'{T\u001a-F:9ت-ƮD\u001a\u0016o;6\u0007n%Ks\u0011rr{\u0002>\u0004iG *y/#W\u001dU\u0015+\u0017@ΕpbZ\u00130\tRӇ2\u001d5\u000bBϴ!l7\u0002cXO,@\u000f~\u0000r\u0012kPokZdo\u0001ǡWoF21\u0016%PC /XY\tr\u0003hꔷN)M7r1\u001b;xb\"\u0018\u0018?t'\r֔Q<,\u001dVdyC\u0002K?p@=x\u0002#OCb\u0006\u0006?9\u0011ۅ]\u0011\n\u0002ѱ\u0019\"͝[Y\u0001dSN]\u0010-\rІ\t\u0002H`\u000bܤ^XSk\u0010\u0002zshJPb\u0010_p\u0006\u0013tD\f?* PN/(1եc҉(AcIk\u0013\f_\u000e\\\u0015\u0017\u0019\u0011\u0018\\n7]g (}\u0013`S[!.܄Ҭ\"r$\u0005\u000f'kl\u000b纜Z\u0017Sȩ'At\tj$R\t\"ma'\u0016\u0004\u0013\u0016Q+\\\u0006\u0017Z\u00129P\u001d\u000bR)ąH*\u0003q^0i\u0014O\u0011\u0019dF\u001f}r\n*AqQ\u0016[=T[\u0016X\u001f,m_uo2\u001c\u001e.&~\u001f(~Be0ALjGL\\<\u0003TSUX[\u0003\nx.#D\")At5\u0003*(MQ\u000b+\u0002։Iq&@.aw;ڻVeQ$\u0019\u001bKĈ`>\u0005>\u001ed;xl\u0007\u000f\u0001*6\u0019\u001dd=iY)c\nt\u001f\u00168bm`\u0017A\b\u0012\u0014ծ!\nA(\r\\)8qtܔ$\u001fO\f-\u001f\u001a\u0000dc<W\u0013\n\u0001+cT;\u0007nry\u0004\u0005\fݻ~ڸmӜ'\u00075}\b#%am4-}-tF[!yhw;@Q\u0002\u0014p FBPc\u000biO\"i}\u0003M\u000bi9YxЎ\u0000c;\u00130Z`=I\tn~*\u0006\u0001\u001eQ\u000eУU\u0011*FϏ>x\u0007enL\u0014\u00111\u001a\u0003\t\r&wW3zδ\u0006\u0002/.\u0014B:j\u0012l]\u0016\u001d|\u0013 \u0005\u001f1]J\u0002\u0004Fqb\u0015\nuK6ku0e5m\u0013\u001aAa\u0013e}0\u0019\u0018x&R\u001f),]loJ#Bi&\\\tOL$\u0010~.QގuKE\rβ\rdײ\u0010h\u0017z'vZ\u0005н\u0010hAU:\\](KU:;rWļP\u000b\u00025w>%\u0018e;˚\u0015ؼO8Q%Dw\u001fs9Bw\u0004L1kvj\u0001zKCjn_\n%<0\\\u0010 z\u001a\u001cV\u0003FO0$\u0001[\u000bK=t,Oq)ezfS,Ix)sn\u0019Svݱ̱ };@&X\u0017\f\u001c^X{\u000f^E0q!&H31Dg5b_*\u0001Mް\u0012\u001a\u00148M\u000b,ʍy6\u0014`ُ[u\f)\f#k\u0006\u0016R\u000e\u00151K7Hur\u0007\u001b\u001eL0r\u0019\u0013[x\u0018K&?7\u0016\u0007\u000f\u000f\u001cy\u0015p\b\u000fFwL?|\u000fw`\u0003b)\u001c]~!\tAsAw!O\u0014\u001bX_Ym.\u0013\b#838\u0007V\"0\u000f{`}\u0014.q\u001a\u0014\u0006a\u0006p\u0004da \n\u0018\u001b45\fb*?mQf}߰&^<\u0013\u000e;^荇\\1yvl\u001cr.3\u0019GM27=\u001er:֟C˞\u0007h{\u001f:\u0013gRq@\u0014]`wtw\u001e.\t!hAi+\tf\u0002@,\u001eE\u0012Q\b)iQJ\u001aYJO\u0007G!f\u0002U\u0016\u0011j}KuQ\f^1weh¹\r3\u0013bE͂v\u0014l0\u000b#An\\hԓU@i*TV\u001a$T\u0018pt\u001cYx\u0015J=ڨ;-i6]esF\r\u0018&HF!\u0005DP\u001ak񸕱s\u001f\u0000$?#T\b'\u0002Cԥ/\u0003KHHm\r޳\u0012t-E\u0018Bh\u0019!\rgrJR\u0005KDu\u0013\\Q\u001554f\u0012\u0002&07Q.;򮡱AP\u0018\tg\u0006\t;\u0000B\u001ez\u000ehx\u0007K&YrG*iI#?5\u0018V%/dMT\u001dP\n7)\u0002\u001f*w~̤F\u0014b\u0013\u0015g~)^\u001c;;2&GDii˧x9m\u001fu\u0005\u001f}\u0004\n\u0019p6_:\u001bsf|weAzuIcwƩQu@A\u0003MPA\"(J^9_\r&\u0010{N*\u0001U3P\n!mXֶ\u0010$􆦶g\u0016\u0003a*/D?׿(\u0010f\n\u0004@rRoQBg;jPVb\u0019iu\u001ac~l\u001f.puj\u0001\"]\u0011˽NaW\f#2_/`\u000fc*9\u0010c\u0004IWמе[\u001ab8Ҽf\u0007&Ш\u001bN\u0005\u001b؀\u0012=U_Ơ6˟yc\u0002\u000f!vp&I.mf\u0002PÓ\u000e}8\u000fhxR5\t\f&EB%'*B7K\u0000Ўi\u001c\u0012u\u0004QL{`@e\u00190:yLX¨\u00184@hAT\b/؏6!i/c ދ\u0010zP\u001eShx_MB\tLb\u0019\f;%=\u001f).h.\u0006P\u0001\nΒ* 4 \u0002\u0007\u0003p\ry>\u00180Bc3ݸBYN2\u00056'Yb#\u0019\tQ\bH\u001f;S'\">\u00112g\u0018U\u0016瘶\u0011\b3B^\u000b\u0005BɄ\u001crn\u0013bL/>e'ۜ\u0002\u000b!̉\b\u0013Jt1^P`}B\b\\\u0017\u0002G!\"z?<X̄\u001cq\n\u0017dČDthasd\u000e\u000boq\u000eȧRC\u0014f\u00165x\u0018\r)\u0010\u001blm\u0017l264\u000bi3\u001bR\u001ebȩ*\u0006!(K\b\u0000\u0002\u000b`GM&̠LU~LI\u0007Fҷ@\u0011@~\u0000JMf|.\u0016\u0011,5\u0010\u001f~M\u0006YO؄B͝\u00170cgg,~vwmnB?.kSQ/l\u00021v x\"lv?\u00182P)3Za0N6mߞI䦐I\u0010O/bV\u001c1Z5}5¥\u0015KRk\u0014\\v^\u001e~\u0005Z~鬲;\u001fQ0PM\b\u001dn<\u0003je\u0012ér\u000b\u000b`Ͻ#0\tJd\\\n?Q4J\u001d|\u0002\u0012{@\fN\u0005xH\u000b\b@h`6'='ȇ\u0019RT\u000exB\tM[\u0000/N%b\u0012\nRn@-8\u001ay\f.\tCZV\bz\u0007ęd~e\u00001pHp.\u0005/\u000bT\u001aO0\u0019#\u001fn:ei\u0018\u0019W0:i\u001cJ+\u0001eSEţsWDz\u0002\u0010\t<\u0000q\u0014?\t@^6Y8dx\u0003dq\"DxsRW\u001a!\u000e~!{,?{z)\nr\u001c\u0016a\u000ei\u0012K4\u0017'en)\r\u000f#%QwKbiߧ]`ugxd|\u0006)f\u0007T>\u0010I^a<zIQu./\u0018tr\b\u000fy\u0006̷\u0015Ƶ_\u0013\u001eVW9c0WvQF!̃Z\u001e\u0019s\u0004\u000e\r\u001fE;\u0017\u0013hl\u0012%\u0004\u0007л~K)c\u0003Wd$\u000b&/݄Y\u0007I\u0015\t+UA,\t}eiư\u0010JhڬVD^_xD\u0005?\t-Q\u0016-i\u0015L\u000b\u0010P+dMtVqI\u001eّ\u001e9zwȏׄxJV\u001eWX\u0000\u0005tSS&C2N|\u0000k,^0/ZlB&Er[r'(8\u0007DJE\u0014\u0011=#y'cIT^k\u0002f*'ܤ<GIZC1ddb@`UƔ<O\u0018\u000f^~H\r(xJTsB\n,\u0014\rT\u0014,|Z3\u001cR}h8\u0006\t/),`l\u0006PtK\u001dA{,n7I/]UK\u00119]iMទO~\"\u001d>ە\f\u00112Y\u001at \u0016ȉ\u0002dz\u001f\u0001y\u0011\u0000g`8yt}\rv^\u000bM\u00074-\u0010\u0001:ReuGb\u0003^p\\\tr\u001f.Oks\u0010\u000e\n\\\u0011\b2?M'G7\u00049=l/{K\u0011)(pf;M9,\u000b󝏯\u00068\bA\u0000k\u0006\u000e\u0000w\u001d<\u0011\u0006=g*N\u0011L\f\u000e~kw~;\u0000\u000f Z\u0018%%@TF'P\u001dkݩ\u000fm\u001aucS\u001e\u0005{\u0012\u001cB~\\\u000bZ\"h&\u0001Z\u000b\n@\u0007Y)S_6ȗ?ub&bP\r@Q\u0018u+憄mRv\u0019՚\\dA-\u0014U\u0017o}\u0010:tܾƛ{Rڡ9 5\\D\u000et^\u0019`&N@ydOLF5j2x $\u000591%\u001bK8o1tab%=tL\u000f\u0010J@/6\u000b\u001cO(҅R\u000fw\u001ehiU\u0015z\u0014)q%\u001fbFr55\r染\u0005u\f!Kg~\b9Հ?f\u001f\u0010ߓP\u0003Ӻc\u0002p5ӿP*<&Rw\nL^\"\u001dc3\u0006Xj3>,\u000fw\u0000\u001e\u000f^ʀJ4!/Ȫ\u0001\"&c\u001f\u0010\u0000\u001bDgi~ls/\u0005I6!\u0007\u0012j9a\u0005\b\u0001WE\n.X\u0016\u0003cشauZn(e\u0007\u001f9W\u0011xb\u0013q8x̿\u0011'\u0014tO#wF\u0016\u001ew\u001aY\u001098!^ըhp[X}әL\bM\u000f߸\u0019o1o\u000b\u000f\u001fQo>\u0004,QyS.*Jh~6h'm\u001ah\u0015ɮ{\u0018he\u0017\u000e6/\u001aj-0J\u001d\".-o/7gu#5\\g\u001c荈g܋GҼ\fD{E9[2j1{Y{NH0\u000b\u0017F}2$c3X&+,߉eG\u0012\"wA\u0019\u000bh\u0005ˉ<\u001d\u0004 A\u0015w\u001d\u0007\u0001Uy\u0014Xn\u0018\b\bR\r\u001f\tiތ\u001aa\u0006(\u000e~\u000bv7\u0003\u0004\\GtwL1\u0016\u000f\u001bۆZNUJ P/\u0018K\u001dN\b9=r\u0019\u001b衞8CM\f0#S6\\b\u0005ߡ\u001bji9[\u0001OqeRTNd\u00137u*<\u000bHGкe6`XQ@\rN&*x+MT\u001f%pqpJ>.\u0017ԏ\u000f~A{Bُ\u0017L90m8\u0005%ί\u000e\u001b\u0010\u0015>'ڗ\u001aMdF7nAV\u0017z؟\u0018UK\u0005\n\u0011\"T\u0013߾JfT\\A?% \u0013\u000f>xO*Ot\u0002賲ݜoB(-n\u0001H\u001b\u000eX.0\u0013)vڠ ΢\u0013<8#j\u0003J؇$\u0010vDVC\u0017LPq7\u001dCWrmt[]sKfؓI0H)<.\u0006Kv(GLWT#bWt{!\u0003۵\u000bKmڡnw7\u0019c?pC`n2%Sl\u0004IخgdLf\u001c1\u001d}\u0007u\n\u001d.\u0002m*\r_ւ\u000b]Q=\u001a1=dQ\u000b}z\u000ff]\u000f7Z)qo+z\u0014Rq\u0015r\u0015$:\u0015%J\u001eH\u0010BǪl\n\u0018G\u0004v\f鑨b(~WEXs\u000bh\u0005G6ن5%}\tv`f\"e|`UWa?~iK\u001auH\u0010e;_#MWx+ =\u0017*3έz\u0002\u001f+\u0000iYp3WJ}Vj\u0017_D?Tԟ<\u0004=U2tCn\u0019*\u001a+i;7)G/?~p0=%E>w\u0002V0ŀR\u0013mKv\u0000y)F\\0=Bi_7moXw>\u001b\u000bkj+\u001979T<ݹ\u001d\u0004Rz<냍%~,磟\u001a\u00177\u00177Ql=\u0003\n)Tqh\u0010տ\u0013ꇴ2\u0016^\u0019`t\r\u0012#W:كBkA\u001dY;|W&\buT͉:!Фۭ?\u00000DC\")?IڋT?\u0018\u0013pWʓ\u0018)>Z\u0005dﭶGj?K>~j\u0004*=8  \u0015P84>'$_sɔRJR*\u0019>;\u0002=J\u0005\u0003k\u0003P\u0003\u0013l\u0018Xn.m\u0007wxal˕\u0012X\u0005e!7'=\u0011J\u001en{>\u0004T\u0012tY\u0013' Q\u000fRU\u001fg,\\\u0019u(naM^\u001ff*(7EF2 ?AnMTroh\u0002oKC\u001b\u000fŎ7\"x[s#\u000eL@RQ0e\u0005@\u00000@\u0001\t\">\u0015V\u0013\u0014\u0014\u0016\u0011\u001aRP!QOafB\u000e$V\u0003\t[pD#ژ\r߈3\"\u0018\"!\u001a\u0007\t\f\u0015E;\u0014:(?KC\u001e\u0006Z\f91_\u001a\":\rU>\u0012v\u0018V[l\u0003ż\u001e^IUo~a>\u00189P7\u000bT2T*Y_ \u0011\n\"\u001e\bW{\b\u0005A@\u0001\u001b~-$\u0016\u0010\u0000\u0000\u0002\u0000\u000b\b\u0000\u0000\u00010\u0004\u0004\u00078\u0010\u000b\u0003\u000fX \u0003\u0005,`\u0001\u0003@\u0003\u001d\u0007B\u0000\u0003H@\u0000\u0014`\u0000\u0016\u0010\u0000\u0000\u0002\u0000\tF\u000bt\u0003\u001c\b\u0001\u0007\u0018\u0010\u000f(\u0000\u0016\u0010F$`ۧ\u0016\u0011!\rQ\u0011c\n\u0011?,\"\"\u0016u7,ΐ\u0018y\u0011FD\n\u001bB\u001ff\u000eF\ni0\u0007iַ&T\r\u001c**|jMjȁ\"ݖTSԄO\u0018\" <\u0015\f\u0015\u0007\bg8a\u000e8--U\f;L].\u0012貥KYg%}F&\u0011wCdrOe\u001c\u0010IY\u001aƣԫ^\u001d6\u001aS%\u001cv\tȰF>%;~ׂf\t:RWh|a%3\u0011ʣWej&!yj&\u000e\tLVUr}\u001clB1\fBQ\tY:T\u0006G'us{\u0016!\"_H0j\u000f2\u0015S\u0013)\u0015~P@\u001eA=H\u0015RSQ\u000es=H\u0010\nUX\u0015B\b\u0002\tq5T*RN^/s'-]V\u001eֵRYN dNIҢvmpe.\t.V<r\tHdT\t\u001c\u000eq%I\u0010\u0007=\n\u0018j\u0012H\r1c2O\u0019c\u000eB)Eש@uA\u0010[V{\u001d\u0013\u0014\u001e\u000b#\u0012!\u0016(\u001c&B\u00100Ё\u0006L\u0002\u0012\u0010`\u0000\u0012\u0014\u0000\u0002\u0010\u0001\u0000\u0004 \u0003\u00161\"z\n::'x\u0007amkw^\u001e1\bI\u0014ڊYP;ʔɷշU]Rj\u001az$_eۨ%\bOŤ\b5a<.Ձާ\u00056p{DC[\u001boG\u001eQug\u0004zU6\u0010_\f9Nʷ6\b]ao\u0003`0Φ[g=o)w9\u0001\u001fFMK\u0016\nK\u0012Os\u001bTчtK\t\t$^AgH \"\fP$D?=6\b<\u001ah\"/+?\u0014M=PO%CWzK\u000bGZte\u001b-anH_\u0006R\u0018D>_(o05\n{\r߾v\u0014h\u0019_\u001c~\u0018\u001d6pT)e^f\u0010\u000f5@-O\u001fbc;J\u001aE,/h\u001bxJy\u0013\u0012ij\u00162Rb\u0011b錥\u001a{A\u0016rI\u0010\u00194$RTz\u0019r\u0010\"a]\u001a\u0006\nDtC\bbAmG\u0013]Dr\u0006&(\u0015\u0017K\u0017Q'|g\u00195@\u0016J@י;O:\u000e]\u0002W\"\u000bժad!g\u001btl-Af\u0010ϳ0mmXޮ2-&ۖDk\u0018 ۀ%-Ak\\lKqK\u0002\u000e6v<]F\n۠{lx:66u*i\u00158\u000bD\\\u0001Gu\u0013cC~\u0004KL𰇂}f\u0013\u0018OS}ⲪT'BoKP3ym5\u001eI\u0018!J<\u0015\u0018lb\u0016Ba\u0010E#\tR\u001cxj\u0007)m[<5tM\u0011,m;\u0013NT#WwC\u000frT\b\u0006\u001ca\rۀ\"7Y\u0018#\u001e\u0006\u000b풌\u000b1\u0015P`s\u001b(\u0010\u001dT\u0015Ɨ*H\u001aj4ȉPUexyN3`ߵ}R\u0016fm*\u000e?&\u0019k,\u000e\b\u001bE*=#N)ٱn\u001fʭ%\u001dr\u001b\u000b\u0019H>ӐIPY0#7\u00169\u001f/\u000bF2ωҼM5(6\u0018A%. \u00113a5R\u0010\u000e\u000fa\\\fryG.e<\u0011lyZ-\u000b\u0007N&\f)\u0014\nJ)bȨzԯ[i\u001ezLdq\u001d%틜\u0016IL\\V\u0015MAͺ\u0016\u000et&#=\u001e=\u000fN3Ȧ}hΛ{\u0016P\u001b3M\u0015bΝ4}M)gl,\u0017WfIORD|(Q${Zl\u0004K٦H5RWR\\<E\u0016gf>E\u0010N\"iT,t\u0014);&wRh$@$N(C4LٕS\u0019کĲӓ\u0018<ު\rL$~,iH\n$\u00125\u0019!\tRs\u0014>\u0011?`А\u001c316d\n:y\u000eu#6~\"Ӊh~\t_r\u0005Ӄ\\X\u00125/e\u0003\u0011JCWr<lBI?^\u000e%/OiCSk\u001a?\u000f\fS#)\u0013UU>5z4H\u0011hTPz[^\u0016sQEBNi%1,+B&<ԏ82_>\u0011\u0013rI*2TU㋳ʬx1嚵)3:Լa{\u001e=1n]׶MiW'l6x\u0002f\u001d<D:\u001bX\u001a50\u0018ٴ\rL^)E\u0016ˤ#bOg>64\u001c\u0017\u001bd\fW0mZ\u001bp\u00187mhMXܾ͢YtD$̳=\u0015zsOP[\u001eG\rF\u000ft\u0007JOe)\u001cİR9\"JָJ\u0012\u001b\\**L)H읨0\u000b\u00056\u0002B%@Ү%!a*ˠi9\u0017R\u0006[\\\u0011hN\u000e4޸vxwG$\u0004M\u001dT4]Or\r}҉F#i5tS3(Clg靽+\u000em0)a['\u000eWH?\u0016\u001e8M\t`,\u0012䌨_GG5fng*\u000e\r@\u0004\u001fX\u0000\u0016\fg\u0007\u0018\"\"\nh\u001a\f\u0006H!Q\u000b><8p@AM`B饟D|I%*+\u001f=ZG\u00055599nҜa(\u0017!6k$gC\u001f\u0010g\tM\u0014D*\bI\u0012ӕen˺\u000b(~݇8j2HJ3(9ҙR\fyN.\u0006\u0015\u0013`Z\u0014Gj\u000b8\u001ds\u000e&TP%BS(`/y\nHG\u000bJ\u0001QX\b3\u0014]Ws|pT,\u0016ýmrmS\u001dCA\u0015M\u0015\u000b\u000b.~\u001c)'\u000f|WmU2/4\u0013\u0011EXJ\u00104g=\u00054\u0019\u0005$[:$\u001c7 RGi\u000fϼ\u00113̢^?\nͿ)9\u0007\u0017U;0\rK\\fp\u001eQE\f4t|\t?8ʇv47\u0019K<\u0015hx0O!\u0014DI2j$aESU\u0007^itGityHt˷3H\u001e\u0003ӀP3I\u001e\u001alM$!Ғ9'.\"\u0016D.\u000e\u0016\u001e6\n\niIGJ\tz\u001dR;N(IdYڼY<K<,2n6Zo7Po1\u0015/Rq.U\u0012\r\u001f\u0015\n}\\X|^K\b:+X=&H0(BУ~D|KO}84r:h)VN2Z\u0016S\u0012S\u0007=5վj*g[֜\r4G$,4K@RRZ\u001a\u0015ԥ6KfrG\\]_/Ċ3=#\u0019Z\u0005i\u001cZ0\u0019SMc\u0016X\u001bEuCr#5\u0003.}u\u00173ԎG\u000br8\u000eG9<_@\u0011\t\u0005\u000b#\fHaHH$4\\'!\f\u0011\u0015F\u001aO/\"i@ 0>8|\u001c?~fs\u0010&\u0014\u0015LƮ\u0006\u0000\u0017\u0010\bp \u0018\f\bECr9V~\u0014\u0000\u0004}Bp\u0006)A\u0018\naC\u0004\u0000\u0000\u0000\u0010\u0000\u0000\u0000e\"sG\u0018\u0005WY``oF'4\u0000;7(tf$@꘵ԕG6E\u001aE\u0000i)$Jc\u001dn\u0006JbP\u0003\u000b\u0004U)}Z\u0001%ŘU<ᗄ= ch\u0000V\u000bdie4hn\u001d\u0019K\u001e\u00021V\u0003y#\u0002\u0018c汋\u0000\u0019i$Q#\u001e5[}\u0004:po#gf;\tA\b\u0005 (Hל`E\u001b\u0007\\P*R,B\r\u0019eK\u0002Ҿ{Zk\u0014O*Gk\tsU۱\u0004:\u0010TP\u0015mHm\tܑ4,`9l:\u0015y\u00011\u0005c\\|&yF\u0013֯\u0018R\u0013L5X<M5\u0018\u0017(\u0011r]J\u0016`=x@c:\twC͑gιKKlN)p$qYk/kdX\u0012'\bYkp\u001ch]k]\u0012\u001a'Ǐ\u0000@\u0006k\\QHY9<5Ny.\\[#N\u00158#I\rQ\b!KS\t\u001f\b7\rfӔ\u0004\u001f\u001d2~1d=[pܥN/\u001a\u0016]H?D/u-waV]D\u001a\u000ezTИf6\u001b\u00026\u0018Ҽq⩒ii\u0010oAލq˴\tK[ڢk\u0011d)~(\u0001g\u000e\u0003;?\u001fAE\u001e5=\u0018\u001a\bT]]ayKsK\u0014\u0006NCv^Ő\u0011x⎢u\u001c5/tJ,\u0012\"/mi\u0015{?\u001b,+F\u0002!.\u001dtD!><^Ѷ_ƶF\"]pyPk^?4mG\"B\u000b%,L$`L.K{K/0\u0002\ff\u000f\u0006Er\u001dKPĝ]0\fbeq.x}PnF\tRM=u\u001dcRl/N7\u001eA{[mHX\u0003)Ӭ\u0014<hك\u001eʂyғ=6\u0007FdAM2'$F|\\~4p.0\n\u0011\u0016`\nU\f]\u0000S\u0005c\u001fmW\u0007\u001du{F]\u000frOu6QmŜqa@8\u0006/z\nԃ'\u0015*݂\u0018ּ̏\u0016om\tM8\u0013\u000f\n/ \u001c\u0014|ģd\u0011\u0012q=`vk\u001c*$?ծ\u0002Z\u0012M۴kbqke\u0001z% <\t<$b\u0013T\u000er;E=eRz0'\u0016>hi\"\u001e\"G\\qcJ1^\u0013(~m/N*K^?9E.'z\u0004M2gގ\u0007\u00154vP\u0016I G\u00104 \\ќhy x-w a!*\u001f@JzಂCQwmjx\u001aզ0\"{8\u000b\u001aB\u001a\rc\u0006t\u001b\u0004wU\u000e\u0004`q)9]9!O1$\n02<\u0018\u0006'S\bӤ_O\u001b\bF!\u0014A/f@\u001c&Xڣ5$$\u001a\u0005S\u00059\u001e9_Txx\u0003,Y\u0002SؐY\u0016>\u0014\u0007\u0018͞z%B'<cC؍dx*v/E(U\nAs\u001b\u000e*\f\t\u0004\u0016w˝\u001bj;Mj21,D!уdC\u0012\r\fG\u000b\u0013zeD%\u0001}/nBO\u00030\fb\u0015<(Pn\u0012pY3\u0003-J\u000bqs\u0013H\u001fc\u0015a/CÊ\u0005%2K/A\u001e\"pȉ\u0011I%\u0019f@l\u0004׼ufǩ\u00171A7ɡ蟇\u0016ڧ\"\u0014\u0016\f<\u0003aO\u0015~2C9\u0007\fA|J\"Ԥ\u0001)L\u0000a$\u0010j-\n={\u001de\u001b<\u0013T\u001c\u0003}e\u0001h \u0019|j\u0010\u0010,\u001fsX\u001eK(\u001e>\u001b\f?a*N\u0005!\u0003]*ێ\u0003t\u0010E$12=Ńq\ti\r\u0002,\u0004yfl\u0018n,ymJ%\b+\n\u001eT$l\u000fɚv\u0014vCS#\r)\r\u0018\u0013\u0013\u0010\u0002eC\u0015`\fh)\u0001\u0000V\u0019\u0000\u00008{T\u0014\u0007Fvu\u000boP[[:B\u001bAXc^T1\u0017J\u0000`\f@o\tx\u00176\u000e\u0013Shc\u001f\u0014mM\u0005\u0013\u0002R0^\u0002&0խi\u0013335ԅ0P\u0019\u000e\u0003\u001bKQ*H)Nұ\u0012H:\u000eN\u0014fqV¥\u001e0au$HXfk\u001dDBހN2MH\u001c^\"p\u000f`5\u0007G!Exx\u001bpy柢0#\u0012N`5;xqv\u0012\u0002aAM\u0015:\u0011\bJ\u0016CdEm\u0019\u0001\u0018Z˾e\u0011\u000e,㬕RO\u0011jc\u0017*PLN\u00158\u0006\u000e\u000f-zA\u0002\u0019Yg9l\u0006\u0005L_7nntd4wMu2.\u0001I\\?^\u00161aςq\\\u0006h߰\u000ex*\u0010WH\u00016)o\u0013Wm\u0013*mBԘ\u0002\u0000e!//#ÛI)tۈ(\\\u0004Cqoz\u001cC\\\u001f%Zr\u001bΆ/\u000fd\u0001G\u0002.\u0014)\u0002-OL=|\u0011Q0CH\u0018A7=z3QQ6t4\u0018Ŀh\u000fp<\u0001?PG\n\u0016\u0017{z\u0011t2\u001c\t\u0016\u001e@s\u001b@)\f\u0003SYC\t=\u001c7mG'\u0018\u001cg>dg\u0006\\n<'\u0019=&=\u0010p\u0006l\u0001Si\u0010S\u0006j3M̷|z\n34\u0012t5>&ivO\u0010\u0012r.cbݔr);b\u001c.Cpc4\"9,\u0015}iЈģ\u001c$\u0014)\u0013Z\t7a^-iVa\tC\u0004\n&I\u0019{\u0016\u0015v|ȦjL\u0013}XǤ\u0006׭)=H7X\r.\u000eBZ\u001f+H6.\u000b~Ø\u0007\u001d,=ڧ[\u0005l\u000f\u0012\rO\\7mɒ{:\\u%39ˉw}but\u0005D/\u0010NDjE\t\u0007f\rd-$4\u0007d\u0017@6h-ذ>\u001c`\b:_\u001e{%JԈn9\u000b!8OL\\@l\u0003,=e\"L\u0006!\u0000\f;\u0015\u0005]\u001e\u0006BsWUB!tVGIqG\"OJhHlh;=lF\f.<\u0014Q\u0011ѷ%Jb>\u0004M\u0016#@麞\bD\u0002Nؗ쑳\u0016++J+f>npҠAĵOR'iO\u0013\u0006\t{\\e\tCv\u001blפgyI4[!5b'\u0010eq8ٯ\u000e7\u001a?FH8h=\u0014\"LPiI&L\u0017\u001fR\u001cX\u001bNS\u0010j\u0005zlU\u0015\u001eT#v,@Xb9\u0011\u0016~6»F̣\u00033#f\\*86\u0003Q{wa.OIc,y)2+\u0014ډ\u000e\u000e\t\f\u001e~Z2\u001d#ةxP@w\u0000df\u0002{(d\u0010QAnrP0\bE躼\u0012.eʒ\u0007XFO+XpH*L\u001fҌG2\u0016R}YS8/$axN-hp\u0007bGN?#Y\"xHdKȰ y \u0004\u0012\u0001]ucJcg/Vɫ\u0015ؕW1c\u001f\u0004̑\u0001U\r\u0002\fZ+QH\r`gUER)4e\u0011y)U@\u0018J%jɴ\u0015*ѕW;Vof+՗\u0005\u0015C@ƃ\u0004\b@$QuUc\u0019\u001b6m\bW\u001bϥ\u0010\n'\u0010\u0002(W\u0018YK<₻q\u0001Q\u0003U\u0016\u0003p\u0005\u000e\u000fېT\u001cZ⋷[0C;.)<ꦑR$$=\u001cq\u000fFbJrc\u0004whT\u000f\u0001I\u0011x7\u000bS\u001aZN8\u0015\u0013\u000e\"\u000b\u000b'9d\nZ4S\u000bџ8̤$\f\bf\u0001C\u000b#\u0013 2yϓ\u0012,ɬαo\u0004\u000fE?laGb\bP_&_+\b;\fA\r\u0011ą2\u0019\fR1-Nw\ftӸ\u001f$S{\u0003<r\u001b%+\r\u000e$:崠\u0003FOA-\u0018l!a}棲1\u00177?\r%7|\u0000yV~Oj @\u001c{\u0003ll!\u0011(Y\rſ<4N\u001b\u0006I\u0003E\u0015\u0019 ]|9Px`P9W]cX\u0011-/ҿJK\u0004uT֟\u0006GN\u001cs\u000f.b#CQ\u0010߁a\u0018Ɣd\u0000\u0004\u0017d][\r˞KDa>]\u0013>P:H\u0017J\\AY^cz\u0019e:h\u000e\n\u0016S)F[l0\u0001{-<h\u0004e:\u00043E#m#s\u001501F\u0012cvSE.& 4ft*ޟ[PÅh'\u0016bTs1GK>\u00037\u001eT\u0018H[)m$\u0003t\u0000G;j\u0013\u0003\u0010rrE5&:ˠ/\fꌑ\u0010(O\r\b~\u00136qOV\u00017\"5&ⷈ\u0005@$#*^Ȅo\u0004M0\u0001\u0006sGy\ns\u0012\u001c-^\u0002\u0019x\u0000\u0002䚃\u001c\u001900\n\tM:>'\\\u0010\u0007tң\t\u001bI\u001b^'k\u0019;\u001d_7@\u000f\u0013\u001e\f\u0012\u0017\u0004\u0013u.v=m#v8e&7`\nXs0ԙZ>!sÈVNWIqR\tN}?-݋\u000bt9\u0018)؊Io3\u0000oI_\u000f>\r]\u0011_ؗ5\nt).!;o_=fr9}-\b\"\u0017\u001d&/y2u}\u0016pwW[jf\u0003ؘ5To-|zEK4g14+farllR\f_\u0019\b=vSQ4jm\u0004,a\u0012 6$>N`SCbpQ^3\u001epQ`NC\u0007\u0000;\u0014s1%!\u00164\b\u0003r4wT|zP\r\u0013̓f\f\u0012#I\u0003r]q_gſAݘ8m5x\u0014Hˢ,̞]d:1%$n\u001ds_K/WTm\u000f\u0007IM,zse8\n󣊊)58Q\\XPމMy\u0015^\u0016]lY\u0017\"NcRڋ\u000bD\u0013uj_+Gժzgf)K\u0003\u000e/z,;X#,+ͼsɭ nëJFV:\u0003l\u001a\u000bm\r>\u0005z§[J,QJI\u0003SGC`TI\u0019\n>I@DB\u0000`{|;43`=\"֊J:\u001d\u001fTG;l@]\r!FHRb\u001cL)E\u001e\u001eߙ,\u001cQgX\u0014ܽk\tYz\f\u000b⤊ZRH\b^$=@r字\rW>4@'\u001a7g&\u0016Q\r\u0011\u000bL0.Ƥ2y$\u0007&\u001e\u0005Fb$\u0015h܃(\rp5M\u0016y\rYO49\u0012H\n\u0010@\f\tW)]T\u001f5\u001fИc}rV.XX7t\u000fRP\u00168_tQ/2\u0007U&\u000fTOت0ެ'\u0017@B9TJA\u0019JN!-@\u0017\u000fcǑ/w9;r\\!xsB\u0003'C\u0015}&H+o\u0003@3p.I~ǤGxE(BAғ\u0003Hз\f7Kq$7+\u001d:膬\u001eN>,kư6Xm\u001bܱR;o\"\u001c\u0016\u0004{C\u001cE@\u0005zOig'\tJEUqL\u000232J\rRW;\u0001\u0015$\u0012ϕ\u000b(ݶt;FEҎ<hQLВmC1@.r)\ns\u0010,\u0014K9O2\u001e\u00125\u000f\u0000pr9\u0015\u001c\u00113rv\u001b.()(%zn}\u0010xLq\u0001\u0010\u0011_LtFYٍ\u000e\u0014:pB\u0015\u001c\u0016u٣Z+s\u001cƸC8mP0<\u0003\u0017\u0007$\n)p\u001c*nYޅh8Tu\u001f!\u001f\\ZM\u00006&\f_6ń\u0017YjA&)\u001fbEsԆ\u000f x\nܤ8ux*\u0019Ζ\u0017H>!\r\u0013$,\u0017#rԂ7\u0007c<^;\u001ctE\fvH\n\rhԽ\u0007\u0017k3vUM\u0012\u0000>1^h:kF\u00128g!O\u0019K\u000fՒ8\tOl-\u000f\u0001`\u0013\u0018\b\f(8-\u0013:\u001drƀ9 Cf\u0003 3\u0000\u000eܬ%ί\u001fY\u001canr\u0018\u0003~^\toMy\u0000k\u0000$8<ZɒnCrk|\u001eO{\u000fpw$y\u001aq`\u001b\u001dEĄ\u001a\u001aS9K2hA!\u0004\u000f\u0000@ߜ3\u0010\"J\u001a6'7S1e ձpD\u001dL0,h;\u001a\u0005ɊzǄ>\u0001E1;\u000e\u001f\r:\u0001\u001fݼ\\\u0013^Pi\u0000\u0018T6<vK|'ȣX!\r\u00014vÀѨ U\t-\u001bI\t\u0016e`nS?6hq\u001e\u00052R>ԑ汚'ƸAm \u001d_e\u001d3&@\fX\u0001?\u0011\u0003uxP\"8D\u0013):mV\\\u001aOTh\u001an4/\u001f6;\u000f??]@'o¸t:\u0006p\\\u0006\f\u0000g^8^@Wj\u0004'OL-G6R\u001f\n;zIщv4R%\u0000\u001eP-}\u000bH\u001b֌:A\u001f 5\u0012ER/FB6Or'ŒJv|]\u0013\u001bP~\u0018\u0012>\u0013\"fp\"ýcy\u0000t#\u001f\u001dkݜ\u001bpEr\u0012<s\u0017\tpTxů7\"Z\u0000\u0019 \u0004[)!\u0002F)\u0014W6V=s\u001b͇洠T\u0011\u001b0\u000bb!U\u001eM\n+2\u000b1\u001bHw\u000eZ^Fx\u001bq7\u0000i\u001a\u001f%S=Zw\r}3\u0002{AXV8u=x\u0001Z\u0000}$R?mϷ_\u0018-5&#\u0010:\u0007;rqo\u0004L\u0019\u001cSP\u0003dQT\u001eDE,aK,OCi\u00108$ɘIr\u0000\u0017%VH]\u0007\u000f\u000b\n\u0017b\u0017\u0014Qtϖ.q\u001aL`VΧs0R6YNc\\iL25{ٵp9A\u0014YR)*LJSrrK\u001aj$WH\r9@\u001e\u0017 \u0014\u0016e\f\u0018R\u001c*fRL\u0015aȑpEpCWȳI~>[ކN󤺜\bvo\u0014gi\n\u001b\u0010w+E\\PAs\u001e&c\nu#\u001fqƻS$;^P_:?\u001cImG)\u0011T^u$*]L\u0007Fog{x\u001b\u000b\u0002P\nmd3\u000f{:ڒ,C\u0006ҋ]7Ґ\u0018r\u0015\f0\u0011\u0016\u001e)6VlH1.NQUm\rx\u00181wh*Ńfg7ymU\fHɛM8pGׂ+aT\u0011EV޴j4ۘ@ mj}Eě>\u000b\u0001(aA5U1Vˑ!X lpo\u001dLY9b\\%n\u0007`\u0015|]i·xw{N?\u0002\u001a<GH\u0005\bCL.t4՝`\rr\u001f}@k zwLլc8\u0015J_\u001f\u001b\tYLCJxg\u0002\u0017#$93rZRvTNf\u001ff[|#P|O%r4eWC\u0007\u000bS\tKo﬊@j4\n<\u0016>\u001eiz\u0012w\u0012d\u0010^=Ի7$PMC\u001eՎ+3[\u0012T\b,_1hd@+S욙{n\u0015\u0003@٤6j%t }9H\tL-C\u0013xqv\u0006\r\u0012~j{SQͻS\u000b$*f\u0002a7H\u0005E\u0004!3MnX7\u00139\t\u0000GI;\fWUB @f)l\u0018\\\u0017\u001fHC\u0006HfV +uY\u0002_O\u001f5\u001ac4;nT\u0000b\u000bz\u00034\u0006\u0004\u001cs좏\u0012#L.\u0007\u000e\u0003M3{+M2\u0018\u001ed\u000f))]{x\u0003_!u@;T(\u0007\u0002{Y\u000bW,\u0002s]3n\u001f\u0003\u0016_x\u000f׍0$\u001f=}۳SȟQk\u00182\"GYq1\t2\u001aH:\u0016C9p\u0014Шy*\u0005tO{2^\u0017$|ý\u0000|,T:bkEw`\u00121X\u0012\u0007\u0003Omt>|6i\u0003$V`1W!6 cژ\u000e/p˸2j?NzC4\u0011c\u0004\u0011f_\u0000\b\rMqK3~7\t\u000b\u0011kqJɢE{z~x\\?I\u0004.\u0000Sw\u0002\u0013+i\u0015\u0006\n\u001e2:-\u0000\u001c0ljܘh99.Vn\u001b :[P\u0017IhM7Ib\u001b\u001fx]\u00137J\u0015B \u001f?\u0014_|@=NGd\\{\u0011\u0013\u0001PfK$?r\u001b)Ϳ_\u0005})YL&%lj2r-\fd\t\u0001lxۯ;AwvԓiZ\u0012\u0007+Qm^kQ\u0005W?fJ{/lgJ|\u0012[9cʮ\u001f2M%y  yQK9Z2l;\u0015+\u00165K[zi]gjK4s~[L\n<)9*bMgpU+)\"L\u0013\u0006Pe~r\\\u0003l\u0006oĬ\u0003c_`\u0001@\u001f\u0007\u0000w<c\u000fb\u001f\u0002Q\u0006Ê\u0015o@ǽ\nMy@\u001fn+ ~R\tWvݶ`\nc,Xf\u0002e\u001cxm5\ftl\u0010\rMoVt~\u000b7$s>\u00199^\u0000\u0013TX\u001a\u001dԵ\u0006`f\u0015S<0aS9d6p\u0001@]N'\\H%̪(\u0018\u0004J:\u0003x\u0011MORolN(\f<\fI\u0001zCRj*\u001cq\t\u0014\u0011oO!c.ǉH\u0017a\u0013\u0005K\u001dB\\q0M4n\b\u00047)X\"ȟH8q\u0016$J1\u0010N.\u000fh|U^￤\u0000My$\u0015\u001fʡ=[u`.4\u0007wvwbl\u00073\t:>)\u0015?[\u0007/\u0005A?G\u0011;\\Q-  9o7lM&@M\u0006Ac\u0001x̍\u0000D[¾/:\u001b),dhP>JRd\\BWBe^ZX잞1\u001d\u001a?SgE\u0001ʆfU/\u001a/'\u001f\u0002t\u0017\u000e\\K\u0000q\u00049\u0010Xl\\*pܦ*^[ry\u0013u`omqH2R\u0014҉A?\u0019\u0007N+Xؾh\u0017C!!Xw\"ZH\u0017\u001b:-\u0011hA\u0002&)(\n\fmLrX6C)jO%rE\u001db>杵\u0003<pl5Z\"_\u001fr\u0004iY'?9ܖ\u0005[s!^\u0014̴\u0019$)m [xHb\u000b\u0014\tT)\\&eG7\u001d\u001c٩-O֚6\u0000f!;\u001bs\"~`MhǼDf 36J49X\u001bH\r\u0016\u0003c*iﴑWV\u00001\u000fnc?=,z;z:\u000e%d\b\u0000Z\u0002Y+/r4\u001eFT0\u0010Cps4\u0001\u0019\u0000\u0014ݬ=#T(*\u0010l0GC>x\u001dDAЩ[B+\u000bA\u0010\u0015E%#\u0015[7O@>+K\f\u0015}Ee\u00015Y\u0010duCX\u00071j.A~,\u000bl\u0006WiȕFls\fE{xa$\u001bp@O4{9u3\u0016\u0002ռ\u0014i\\*\u0018GV\u0014\u001aC޶\u0014\td{L5\u0010qH-ƂNL%gV!uC\u000fi<+\u0002L\u00049\u001c]V.P{j\n#\u0002=\u001cX^TKd9[.a[QB\u0017\u0018\u0007\u0012\u0012<\u0012\\#t\\d̒ΙM}県\u001eb\u000bK2k^N%?ҪT\u00193n'\u0004=\\C$Kb\u0003\"3$Q۟$i5r4TQ\u0018_ޒ#{07~Ŀ+\u001cHl\u0016Q,4fwsYbXSMȏ\n\bѣ۸ztXj\u001e9M#\t_K@$H1\u0018b2\u0000\u001a\u0003\nz\u000fN)^?\u000e\u000b6R40d\u000bpF\t\b(drۆ.ͣh'\u0004TI[GQ\"(\u0012c\n$:I\u001b>`3$\u0012\u001e\u000ee\"`[.\u00111]\u0011\u0014\u0015[!0h\rJW7&s/u=)khTzM\u001c9'.<EH\u000f8LQ\u0013\u0018\u0004?\u0015N\u001fК\u00052P_g\u0010wah1T\b:\u0011h?\u000b*\\$mO\u00062Л7xwY\u0004#hB8g\u0012k\u0000\u001c\u0011Mw\u0017+\u001a\u0003\u0015wWq\u001a%\t+\u0013\u0014`f%\u0002SU.+U#\u0000u\fy\u00119`-2\u0002\bmf\fόԃ#١Cs%VmG2+?\fy\u0011\u0016Da\u0004&\u000f{%Cz0) ܄6\tA;Nea\u0004\rakc`Ր\b4$C\u001e֊\"[nPk\u0014gN\u0014Z\u0003h?N\u000b.p\u000eHr~Ə{\u001bF{ŁW[nfd|,cG,\u001eA\u0012es+\u0001MfHsR/\u0018yp:Fp,rm=0e9+\\UI\">\b6Ճ\f\u000bG,Ru\u0019\"6u\u00074rL4͔\u0019%\u0004\u0015HTy\u00145O\bJ~e\u0011 O1\u0000I-*}h\u0010\u000e|\u0007/Wm\u0011&\u0018tMY`>.<x+_\u000f\u0012I-t\u000bMKPSOO\u001awO\u000fy\u001f\rZk\u0007^m^Pb:\u00142t\t@5QQ\fRv76ژ=\u001d.Y\f]\r\u0016L>t.J\u000fl\u001a_bW\u0012klS%\u0017N4\u000bJwxi\u001e`>C-`W\u0015\fP}̾0h\u001fS'&!;g10\u0014\t\u001f~\u0001Pt,A~c\u0011lE\u0018\\\n\bνS\u0010(J\u0004\u0003Aޮn5\u001a\u00139mf$L_g;ș\u0016*rfꖭ#<~Aا1}\u0001o\u0012Ùa<l\u0003\u0006&B^/^\u001ckEs}p)Ӷ~\tk\u001bGE\b5j+>jEa\u001aw<$\u0015L^O2EEPjZ7L\u001bQ\u000bqP\u0019⭽O9$\u001e\bަ\u001aD*\u001cS$\u0016d5GZ\u0014Rr9dэthcQ5h\u001cC$E\u0006\u0010,4\b!涠@k\b\u000fɜֱ]Ӽ}V\u00174^,vѭv\u001f<vN^LJ#y= \u0002v5f(\u001f*D\u0010J}M\u001eBߓ\u0010׈-\u001cn'yf\u001fML,8e.>\u0018k]6e\u0001\u0002\u0013Z?\f_0o\u0000qj\u0007aK\u001a,~|R\u0005'a6v\u0006pR\nȢNf0/\u001c]cZQm!-\u0011*RPm\\e\u0013d\u001eirZ\u0016Ƅym%{GY\u001by(\u0007\u0018\u0014uZK~J\u000fخCs\u000e\u0006\u001c\u0002\u0011-?~\toRʀ<\r1^u؃䃥㤤9Q b4=v\fT2RXP׺\"[Il\u0017\u001c\u000fKAQQ\u0002B\u00198%\u000bJ\u0012yk\\.^s=?iwtI<ܵM\u000bbFodb\u0002 T\u0002<.\u000e\u0004qu\u00074|bڪS\u0004\u0010D\"[$>\bn \u0002\u0016Y`&\u001cxa\u0001j5WX+ə9\u0002@\u0016%j\u0010\u0014M0\u001c40H:P-Gg|L3r\u00180HF\u000ex\to3\u001e\t\u0016a\u0004G\u0017{X\u0007\u0019z}V\u001d_}sp\u0018+UP\u0007L.s4Ab(Y _\u0005\u001b\u000b\u00114\u0001xJ\u0000P%M|0N6\u0015>۪\u0000ޠ\u0017\b)PȚKP8ιZ۠ѠǮ(\u001dvAneF\bݪ@/jQ`3-\"\u000b~\"&cQ$+65JN\u0017r\u0006\u0011 QQcci3>T\b\u0000,nq\n8\u0011%^nf)r`g\u0014åԶ4\u0002 \u0004JЌklC\u0013\u0013n:GE\u0017d97AuT\tDRHZbڻÊrsd\tpCG]n\u0003V\u0002(ح\u0000\u001eX$i bմi\u001e&t26\u001bGϋ\"(\u00103tz\u001cĻ8+\u0005\u0000\u0014.\bX\u0014\u0006;Z'#\u000e\u0012v\u000b\"C\u0005\r㾔-(^|\u0005%\u0018\u0006\u0003<\u000f#\u001d2\u0017Б#^Y8gɂOcĳLD\u0010ՠ#DlʺS?\n\u0005}*6J\u0004\u0012P\u00050twĭM\u0013ٞ\t󒱂9tqwR695}GF\u00103q3h\u0012HpZ~\u0006VULjٶ˟V\u0019~Mx-f\u0010Q݄\nE8d_\u0012\u000fSl\u0011\u0005-\f\u001bM-\"F*bL7uT2O`\u0002\u0001߆a\u000e>/W\u0001j\"\u0011 \u0018% \u001aLX{~u\t\u0001CC,{9\u000bUA\r7\u0004Mh\u001af\u001a\u0013\u001afTaףiʈH?O 5RF{_5\u001c`\u001ci-NLB2av(\u0010\u0004\nPB\u0005\u0001L.d+N(\f>d\u000b\u0003qx=NI\u0019źAiu\\d\u001f\u001d\u0014\u000f\u0002m\u001a\u0001W_\u0010<+jJ?>.\u0018hy]\u000b\u0000\u00180>֔.ݠ-RR}a\u0016W&\u0011\u00117\u0000wAZbp\u0016\u001d:n)\u0015E8uynF3f\u0019{\u0005(9\u0015H\nL{\u0004q)\u001307ϳ#\u0018\u0011D W\u0007`\u000e6ڠg\u0019\u0000\u0015لQ\nHA~LЉ~2\b\u0002\u001dA6p\"b\u0004\u0006\u0003V\u0002^DNaB!ZўS7*8 \n\u0005\f_;h}9\u0017ԩ\u0013\u0017x\u0004+&zeshN\u0016ga\u0013`dJ\u0001l/J\\\u0007h\u00002\u0005\u00051c\u001c\u001cq2x׷\u0015K$A1%&\u0002)+7Ǹh8\u0002ǅz@|=E*`\u001d\u0018c+\u0017\u0015.\u0017\u001aɇw}F)׊琪\u00145OE\u0006{nS3p¡´\u0019\\Q\u001b$;=\\P\r\u0000Ay\u000f缅+}<\u0003\u001eGgv0Jw\u001foܛ\u000fH\u0012x\u000fDBk@\u00187GB2\u000f\u0016$ʑ@\u001a'|z{Pi+z_P\rԍZ\u000e`D.lLT=T[xROFs\u0018V3\riX6']\u0002\n o'^JN*\u001eE8\u0004$m-9\u001e\u0006\u001c].gpV\u001akD>D)\nB>>;@\u000eq\r\u001cV\tΚ1\u00113b3t, !usgA\u000b$C\u0014\u0001ǆ\u00108\u00170N\u0005p_p\u0010݈ \u0004.3qD\u0001ʪn<1\u001d\u0011! \u001d~SeAȒ>&A\u00075?06m,ǖ\n_<\u0015X\u00142rA뒻,lxMYT\u00131ǈv\u0011\u001a(>'k345$J\u000f\nr*\u0016\u0015MI~\u000eV\u001dv˸64R\r\u0017COL@imjA\u0006=`/>\u0016ve\u000b&G\u0002\u001a\u000bʚ֊sɢ(\bk\u0014\u001eS\u0012_ũ\u000bή[m\u0017ȕ/\u0006,)Z{\u000bVoH\u000b4%\u001aՌ\u0006\u001d\u00198\u000ez!\u001f\u000b\u000bXfA\u00025ܙq͸c6dcAҕ\u0012M`LGu`s85ϩI\u0017\u001f0Nbn\u0019%gSdr{K\u0006\u001c;쥨\u0001\u0017!0X\u001f/\u0001\u000e\u0011H>;jպcLᒙt\r\u001dX{YݿPV|8\u001fK\u001f\u0012Ap\tz*\u0013V\u00061\u0007\b^^iu\u0013]R@Wdz\t=\u001aV\u001eC~ e4?I\b\u0006\rgC\u0002ge!afU\u001c\u0010{2u\u001eF\u0013aϯ^y?\u000f\rTbP\u0004v_h\u0018b?(IT`=ZYoS\t\u001f4t%7\u0016.%\u0007Jj?\u001a\u0016udԫ`W2-\fcA5P\u001eG\rji!\u001f5\u001b\u00079dCB\u0002H,@\u0001w\u0002``|<wu\u0019FbC\u0013<E`XM\u0013g]_­XC%KEVhSXo\u0012\u0013㣃/\u001dv>\u0019\u000e\u0004|\"\u0014=>Уt&O\u0012@ͼifG\"Q#ňH\u0012nIʲ\f\u0016]F18WQcRÔWM0$ \u0018Y,qca&/\u000b?(+\u0005l<\u0007Sk\u000f\u000eN\"\u00152pH\u001d$oS\u0001W\u0011\u000f!\u0010a$|\u0011%4\rش>QBPo\u000f;\u001d\u00137ٛ#k\u0019B\u0018ml?#'d\u0019\u001a\u0006\u0017`\fd-ɯpAP\u0006uPfb&t\u0001x7\u000bo\u0000\tv|51j*=\u001e\u000f;!7Dn\fǨx(qT}\u001dv#\u0015\u0016@\u0010d6n-e#X2\u0016*E6}\f\rSD%\u0011JX.\u0011v\u001914?/ڎx\u0010o\u0003f\u0001D\u0006FS<,.MWWa*}mq|qyn\rD\u0013V\u0010wA.o\u0013\u001eWïƿr|0\u0005\u001e\"\u0013E\t}\u0011#\u001eT\n\u0002\u0003\u0000@\u001e\n\u001aIn5\u0000 \u001aD(!dUX^\u0001kxnމ$BX,)<\u0014uU67w\rm\u001c׫\f\u001cln%ȎK\u00034qC\u0006?a3m\u00157E7ԭ2\u001bOCֈd@C)\u0001D!<,4\u0015%b\"D\u000eۮ\f=*\u001fچEPmL4c:\u001ft9\u0003((D\u0012<#sd8|\u0002F\u001cӸO6^͂A\\.dS0Yr,yVBIվ䈍:\u0005,s}W4Ÿ߀Y} \u000bO\u0010r?nm8ր^\u0011\u001a\r\u001f\u0017:2/J)f0Eks@\u0007r\u001etɘ8,Oq\u0011\u0011.\u0013N\u0019X\u0007ա\u0006\u0018l\u0003)j\u00137t\u0012\u0007\u0007\u0000\t}\r>[h:\u000477Q\u0016zkf辭^8f\t~灲-\u0014+:\u0014C;I83\u0012\u0014sӷ>M\r\u0000u*r\u0019[ٕ\rdvZ\u0002\u001c\u0003Ts\u0011\":\u001aJ.otXI\u001e\"݇<uBh\u001d\u00071\"\u0017iA\u0004\u0003\b,ݻ\u0019$Vڡ]b'c44u漎(WkPຠt}ɱA\u001dl(t\\YOs\\\u001c\u0017\u0013boo65k\u00175S]O\u0003@iώh\u001alg!MF7Ș61<r\u001b8$wC0 fvP/4\"\u0016\u0002=@,\u0000\u001fԂ),].\u0001@9J5fD~P8ɣޅra\u000fSVy7\u0014hW&~\u0011յ_Q-\u001f\u0012P\u0000\u0012;W0\u0002*QtѶN\na\u0012$Bj`\u001c(oL}-C&ʎ\u0010\rvŤU\"\\<g\rc\u0007:6\u0015\u001f:uJ\u0002\u001eM\u0002b_)\u0005v4MrbPl\f3*\u0016\u0013ft~MIs\u0017g\u0004ɞGµ\u0019͔Y\u0003E\t%HV\u0011F\u0012%[\u0006qsrPbZW\u0004\u0003\u0001\u0012W>}A\u000e LՖOl\u001a$e\f\u001c\u0000*w'`7e&\u00075[^?)\u00157F5o{źsb\u000e/+'d\u0001B>a`\u0000>iHw\u000f\u0019u\u001fh\rx\u00156OnǍ;P\u001a(,\fbŦOO\u000e\u0003+5N\u0015\u0003\b\n\u0003T\u0013\u0013\f\u0012\u0017\u001c^z\u0017iBԾNӁ5\u0015T.+PH$99ʽ\u0001(\u0015gzn\n]\u0017N\u0013\u0017\u001b*92Gm\u001f\\O:=waY\u0003\u000eAĔ\u0015p\\\u0006t\u000bn\u000eK{\r\u00161\u0010à\u0001\u0002|@^f\u001aj+5\u0018(MQe7b꓾\t&]#\u00162k\u0002\u0018#\u001a$T\u0003CbD\":htcd\u0002XC7$b\r]8%=J!.\u0007s7[<sɜzefj\u0004+\u001d!\u001dXS\fT$+_\u0019w8]\u0007\u001a\u001eL\u0002|\u0012%t\u0017A^\t*\u0019z2}\u0012Bޓbw/T[\u0012<đס\f/\u0012ϑ]qǷj:H\r\u0013\u0005$L\u0018D\u0007(\u0011hlĕ'!\u0013P_-\\h&ԉgԲ\u001f Q\u0012a|\u0000z,0_{AJ'\u0005C=E\f4\u0006~Ǖ\u0003m,Zg\n\u0007i֭բ֬-^ET\u001d\u0000K]>\u0005nbr@\u0002R\u0016\f%\u0006`q\u0014\u0015j\u0010E:>Fd!m\u0017T\u0014\u000fl\u000b5\u00149ЪxE\u0013D\u0002'\fG`TѾ\u0015\u0012ʏ_]{·Ń«7@K>{]:F%Kn1ɂWh\u000e\\\f́YRΥA=yjY48\u001diߏputX\u00188\u0001\u0010}F&{j{/]/i\u001a+_\u0005\u0004?\"\u00137\u000b&yQ=RMcYl\u001d\nL3\u00057kDH^9mZ\u0016\u001du\u0003)YG\u001a6|\u0018\fR/~}\bT\u000en-]\u0006_֖lP\u001d٩`v̢R\u0002\u0001\u0019v9\u0015ݚBHZx\u001a-*Yϲ*CA4q(p,ǂ1\u001ef$e\u0013X圸}u\u0002% @\ni\u0016H\u0019n&>8dƭ>\u001a%\u0002C\t~@&`\u001f^0A\u0010ܪޛG<e{8\u000b\u0017\u0007zg(} Q%q#7f.HZ,\u001fw1ow\flY蝳\u0014ˣqm\f%lɘ`SbiX\nhi%Q\u001a!p[q\u00038̵?[6\u0011\fHdRP=,\u0000@\\8@Qg$ p\u001f;~S\u0003&:\u0006ڌrN*-\u000f\u0002w1\u001eSB0\u0006*P\u0003O\r΂1g\u001d\u001d^\u000ek\u0017F1XhdIpYc#Fw7`看\u0007\u0006\u0005\u0001\u001aj5aŜ\u0017\u001d73ҩG^\u00104KFy\u0016\u00016Y2\u0006gBG0t\u0001^8_fE(ms\u0004v\u001c\u0017\u001do\u0013\u0005Z\u0012K\\GY~h\u0007\\l\u00124|]g[\u0017\u000e\u001b$< (\u0000\n'\"\\c۫9ì?A1%\u0012J\u000bd\u0000-l@m{b7\u000b!#qN\br1\u0005\u0012ć\f$Fz\u0004\u0001$=b7\u0011.9Op\u0002k;>UN\u0015վ\u001893Z\u0003в0`\u001aJ\fsrOP#\fJD?v#J\nEW\tf{y:N\bG'SDgy\f:^ﱟ36\u0003^`\u0017f8\u0013RZP9z)V0\u0013=V$9\u0007\u0015\u0018\u0013)\u0015-,ֳhի\u0006:ևv}+M\u0007kP3)g9!7/P\u0001.\n6u21~\u001b\u0019f\u0006{Bh.TM\n9JH>gKHg\u0012K/^)euƄz%aJ2\u001f/\u0006vyaF<H3.Ev!l}]i)h\u0016cY-jUnB\fnRl\b\r\nnVB?+c3\u001ff\u0010`-?\u0019y0tT\u0017Ә\u0012O\\NZ4\u001dhLLVTF|;@URQ$&.HяF\u0012\u001cF]\r&<\u0010QȆY?HP\u0005=GD\"]4+\u0015oI\u001f\u0019\u000epwu\u000fs\u001br\u001cq9Oq\u001e9V\u0007aF\u0006F:\u0003[\u000f\u0019q)y<A\u0003\\\u00030Af<ȻB8\u000b(\u001aA9IiT\u001fj\nχ\nMP\u0010<Q੩*\u0016\u0005\u0019eYFXXe+\u0016E\u0000pg0uAq&KOsI2ݸeψRD,\u001e2[B\u001eAf\u000f1rHt\u0007Xu\u001cA18fcW\u0018n3,F\u0019)Y)\f7\u0014\u0004ܳU\" \u0017a!\u0006\u000530:\u0006\u000eTܓ~@ha\u0019\u0015,\t'L!\fQ\u001f[\\F\u00140_\u0004W;\u001c0\u0004\u0016i\u0005\u001e`\u0007 ^g_}mr\u0013j<Һ<\u0003\u0018ƀWxXv\u0017֮K甫ڪ(=炣9yR\u000e|\u001c\u0015ɺv\u001a܈6M\\;h6ӛ\r^\u0006.P8G6Qӎpi\u0017\\-\u00154jf\u0005#\rB;4\u0019ũyX-(d\u000f\f:/%\u0011]KoW\u0001[VJWYw\u001e`WUiT\u000eMlpZ@KxH_BƯFC\u0007T\u0012vvT~\bVn\u000b<HzYkrʢ 鴃5\u001cg?\u0012\u0005\u001b\u0006-_.h\tLEb+\u0012:l\u001fJY1[LEn\u00142\u000b\u001c3,G\u000bC̃\u000b{`\u00040\u0006ڹ\u000f\u001c]ycxer\\ԷVJChwV\\;KdMÊ(_]E\f6+w\nzQͺSjbKJpI\u001a%-\u0010/Ǹ;|Mbq&\u0006Mwa*&Zӡ֒\u0002a\u0001Iud)\b\u0017=!\u0015DCd|\fC\n] \u0005%\t\u0000\u0002%5\u001c\u001f'S\t=\u0018u\u0005W&P:\u0007\u001c)\u0004R\u0010xm,\u0018\u001bfU\u0019и2*qRaV\u00000-\"v+bb\u001bL\u0016\u0015\u0001MĢ3<\n\u0014#7n\u000f%My(8Yj&w\u0012d\"\t\u001d\u0019\"V+E$\u001c\r\u001d\u0001k~l=̎\u0014!7>\u001cq1\u001c.r\u0003W4&\u0019j3G\u0003〻\"X*\u001e\\)\t\u000f5唸G@\u0011\nF?y\u0018sTn\u0018+Ҡ\u001a)6]\u0018&\u0016̿\u0014Hj|@¤\u001c&\u0004cЃ%p`\u0007\u0001%\u0012\u0002pyC0h​\u000b|z\u0011\u0010\u0017\u0010I\u0003\u000eqiXuu^+\u000e\u0003҇ƞw\u0017$^}WQD]\u0004\u0007{5Qv⍓\u0016h\f\u000e[9F=*\u000f9![Q4e\rAKVL}EU-̄Olg\u0005\u0011qM*CE8n@=\u000bl\u0018Á单UKq\u000f\u0016Vxp=C\u0006\u001d$}$N\u001d\u0013ӤWI=\u0015\u0005`u`q)%ݙ|q'\u001e#\tVD 8,\u0014\u0010_+,ozH_YS\u000b\b76\u0019 pHzq\u001aeGթUoX:\u00158\u0010^\u0017v\u0012\u001e\u001cSVY((R\u0018-OeQfkνɊ\u001e4,\u0007VNc6h>,4RםwCA\u0004@$Q\u0012=\u00149Y׵\"1-?L\f\rr\u0005]@DX\u0019>\u0013aϑ9{2\bN\tH'c,A<\u001a\u0004]E6KZ\u0013.|\bz\u001f2ݤT&5R\"Dp\u0014owd0H\u0006BLzWbu\u0017?\f(gjV*|\u0000Yӣ\u0002\bydz$fItMX\u0006m<Bf8\u001e(v)76vjx6*{h0\nV\u0002SC\u0013/xxD:[;6k3.'\u0017M</\u0007Sj`\\]m\u0001\u0001b^tx%\u0015<g`C21\u0012@\u0007\u0000p7:\nn][R&_蓳nA5E!]Ë1\u0015^d!\b]f\u001f*/Cs\u0014w.Ley\u001b:0.\u0014\u0018P2@I`G\u001fv'5E)/&sB\u000e+W2Y*JHN\r\nsUµqIos}'(UV'&(Warjv]$ǫ+XhROr\u0007w^UhGنT\u001e%g\u000e\u0007{\u000f\n\u000ftY@N\tmITiP'ͷ۰1CM\u00057\u000b\u001e_f\u0017ȋY}\u0016\r|;ؗMq a\u001f<\u001fY&\u001ew\u0017A\u000fI=+\u001aeZ\u0003hg~\rKl\u001eT@\u0016Ѵ,$\u0001\u0001mjb?$\u001f]O|¼ ,L\"#\u0012\u001bʵh)~/He\u0006q:C*\u0005x\tK\\ N=f@b\u0016\u0000\u0015J+\u000eus-8\u0018s\f\u0000OZ;a34R<;EJ\u0007I0arI\u0015|%˙.\u001cVA^'\u000b<5F[?|~;i\tˮ\n\u0013rmvI\u0010\u000bfH\u001a2\u001aQXE\u0015'2h\u0002laF)YR\u0012\u0012( \u0018\u000f\\\u0013\rl\u0016&=\u000b\u0003\u0014{\u001fEfmHvb ;TeAE*g,\u0015W,?r]M5xgT-\u001e^F\u0002ŋ:WnrRC%g)\u0010OQQg\u001aپ\nƔ99i!}֊Cr/V$\u001f'Lp>\t@\u0016\u001be\u000bD6\u0012c<oK$L,#\rK\u0017so/\f.\u0017K\u001a1FE`&'z/<} \u0019K\u0001d[:Eyk\u0007M\u001a\u0012OfZ\u0010XgukB!\u0011r\"\u0011tѢcW\u0017F&^P$$\u00112D\u000f\u000eL4Vp\u0001XKwd\u0019 \u000f5@`GN`$R\u000bD\n[\u000eOPqtA;\u0013`L^J\u00041\u0006_1Uʣ\u0001B`Y\u000fA\b\u0018\u0016\u001d_# \u00060K\t$v\u0004Ff7s\rH\n5tZ8hv0\u0014\u0001r~ByO?vN\u00112\bY\u0000c\u0010=hE\u0010},\u0007rB\u0012\u00033\u0002DS\u000b^\u0015rmIV0\u0007,jt\u001a\t/\u001f^.;$;jE׾Ɗ\u0010D\u0003\u001b=70Cb=ѕg)\u0014N!\fEUߍ٨kf.gC;\u0018|1\u0016CsM~\u001dؼc۴{\\ޞr<4d|Ay:$ձY2\u0018 ~7x\u001anb\u001a>=@\u00104e\u0013s\u0002kx\rN`;+H\bu'%\\\u001f_Ízd2rI\u0007P\u0012\u001b\u0011[}+drm@t^R \u0011r]D\u001e)[5.\u0002CT\u0015\fms\nV\u0010q\u0005\u0015_ \u0018`j(|1i徶Ӓ=\u0010\b\u0007y\n\u001b0ܫCf\u001dv\u001f,tX|\u0011&Rs^Xt2x$\u0014x\u0006\u0002\u0005\u0013H'&|sBk\u0000\"4<\fn\t\u0007\u0017 Or\u0005d4Ljy\\\u0010\t8_)\u0018b_K=\u0005\u000f\t\u0015L\u0011\t\u0018\u000b\u0011m\u0014\u0018Uj*%=8\u001f\\ف^^_D2\t(ғHT\u001a\u001b:_K|]H\b\u0000\u0000DyB8\u0010u{\u000f+\tL\u0010Y@8s \u0004\r9Ht\u0015vf\u00055RՀ2\u001aOlQچ\r?\u0010ۻ*'\u0014w\u000b( {-F:>ծ\u0001/\u000ey\u0016{w^\u0016нD\b.?yT(>`J_yfSTIZr\u0004Uq*]m7\u0005\fl\u001cSt3b\u001aW_5q,L\u0015\u0011\n\u0016(f#JN\u0006b8!IB*\u000ez\\!LPȓIUZ\u0005(Ypx`ٞ\u001dݭD^fb\u0012'\u0013?R\u001bL5x|E\u0002`w\u000e\u0017+};\u0010ߝ\u000e0\u001bَuCI-JM{ܡjUQ\u0000(  q~aIq栠*\u0015\u001a@PZ<\u0004vfg\by\u001b&:E%s\bnj.SOP`P+3B[xB%W\u0016{I\"\u0011)\\xG\u0002\\lFzg5\u0013Ö<x?'v`Y\u001b\u0012i}Gݞ$&\u000b)d͒#\u0001g}晞#\nT:tw\u001ai8\u0012\u0012`o2Y\u0019^덾|RgCx/\"aZi;\u0015\b\u0015~hGCk\u001c\u001b&\\`\u001f\tf\u001b\rM\u001a\u0017NM\u001aH\u0007QG\u001aGY3дC+\u0016\u000f\u00126,¨Re0\u0016\u0011-ND\u0012>p\u000434^Mn8`}\u00101Y(D1\u0001C\u0003`\u001b\u0012:e\u0002\u0018ǎ\u0000X\u0000+L\u0019\u0016-\u0002JO\u0019\bMrd6\u0004\u001etJtʗ!$EIf`.\u00193v\u0014\u0017!c蓚u|vX,_Ԓh!]2gY둟G&X)\u0000\u0002SH_E:\u0003mFӨp\u0014f.\u0011\u000f̛'\u0015.'4h\u0018\nw7E\t^)gfR!x\u001b\\L\u0002')\u000b~Л:(zj@^|h\\S6M\"JfA\u000em\u0016@G0یYYc\u0016h:议\u0012(\ti\u0007_;g\u001dƁ\u00023uB9sb\"\u001e]\nb qDC\u0010 ZE!`jq-͔ra\u000f%׉\"G{\fiG7=IHV\"}6\u001d\u0006T\u0013A`$m\u000bO\t\u0004\b`L\tXtHnClnW݃:\u0004#,\f\\\fѠzA$w%\u0014\u0019cV\bp\u0010xT\u0014;u\u0007tz'oU!-ۣ׋Adɻ^J+(ƥ\u0000sI\u0004\u0005640\u0015k+\u0015a\u000e\u0013=_\u0013\u0006_!_si\u00001h~'&[ޞL)jh&[8f\u001f؂c\r%6j_&\u0004rO\u0014ehV\u0012.\u000fwb4@BHu<~6y+),\"h${l培0f[}Y⫭8wH)<\u0007\u0012t&mM'\u001e\u0002\u000eFI \")M\b\r+J\n$:q\bj擠\u0007\u0016V%\u0005C2ԃ5J\"6\tޖ\u0001L\"\u0004H\u001bh{\u0005<,\n\u001dv\"Z{k$\u000e\u001b\u0006Ѻ?&Pp>\u0017â\u0006#%hv\u0000=\n\n\u001bMzd\u000evcK'(#~.\u001cK(x15`k<C1[hG6)5ލn.i;cO\u0018,\u0005*?\u001eN''x!!eu=\\\u0006>r)j<`4\u000fح\u0002\u0013$,\u000f\u0002v\u001aUo\u0013G8P\u0012W8IwI\f&}\u0004N\u0017[\\\rJVC+.l\u0002\u0007\u000eF\u000eUIYDj@\u001a\"#\tCێ\t·X\u0005\u001d\u0017\u0006\u0004\u0002tZpp\u0019Mk\u0012ýP)-\u0007e/$'qKLs!\u0000\u000f\u001aAӊ\u001a\u001a KMܱWc[wVX8af\u000f'\t\u0007\fC\"\u001f\u0001\u0017ۀ)jHr'n0Jq\u0017dGW{J!,yY\u0012l.J\u0014!b$T\u0002\u0015T,MH34{\u0016\n\u0006LcѲA\u0003\u0002*C(\noy<jM<=06\r=y\tg\u0017\u0001fd\u0007`-tc,݀~U(>EqD\n|>~/;\u000b^8)1\u0012lnBHq\"ߪo!Q\u001bS\t\u0018dҎ:?fǡXpX\u001d\u0014,S+\u0004Q/\u0018\u0006\u0015T\u0011H0<ַ\u0010\u00129 wM74`'ȴu(z\u0000\u001fo#CFbB\u000ff*kS\r<qW\"l2\r,̓H\"¾(9 \u001cĊ\u0019/\u0014yYUIq{k+3,\"\u0012EB6@0dYT)L\u0019>jb\f\u0015\u000bs|.D6AAϢvY\u001a+n3 ;A]NN:EeBy_dQ5)(\u0000kW\u00194kG\u0010G0d:tbZo\u001c4]\u000e\u0004\u0004G\u0017\u000eYk\rtpU_B\u001bвX\u0017TښUH>C\u0005A\u0003\u001637ݩU5\u001e߾$39,L+p\u001a#d@C2|F9k\tjbrhB0N[\u0007Ō`\u0002P8D1d.zN\u000få_PWd}f\u0007\u0006J\u0013\u0002c\nRx\u0010霮\u001e?\u0007Z\u001fLM]\u0010%\u000fDAgKN\u0016@\u001d\u0007z[*`.Y̅pQ]uV}b@<Pc\u0010\u000ewalo\u0001\u001e8W4\u0014A,z\u001ef|z|\u0018.&>TP\u0013ՇFKmQ}˿\u000fsd\b\u001c\u001b*ۖ!s8&Jlkm\fW^,\u0017\u000fd\u000f\u0004$'_b+E\\+\tR[05\u000f\t\u001dx\u0010 \u000b\u0003Ȫ[ӟ\u0014\u0012ص\n\b=\u0016{Yt\u0013Sv\u000b#\u0013ڭ\u0018;nQ\u0019ޝe(ڿH{`E%L\u0019v5ݤ>G\u001b\b-m[uP}\u0012ȹ\u0019We\t3\u001f]\u00034k󡺊:\u0003ý\u001a㜢Ĝ6]A8\u001a\u0012Ơ-{jy\\n\u0019Ɓ¼\"\u001fu(?~\u0000\u0001M<f(yVʪϿXyI( IhwLGʿM&su\u0018\u0019Ic;\u000b\u0014$\r\u001a%T@c\u0012D[\r$\u000e¼>a0v\u001bpK\u0017\u00033P\u001b|큵阳Ys{`1\u0018\u0002Y8y\u0010\"\u000b\t_;^\u0017̹O`z\u001a<.Bt֟\u000e#j|^*s3\t\u000b^\u0016p\u001e9j?\b\u0012c\u0002LhBodӼ]\u0004@\u001a\fU7غ\u000ewb\\-;J+U)ʺg\r\tߐ$\u0000\u001c\u0018c*, \u0011:(mȮ\r͙,9_*y\u0017{X?j8'@N'vDNsDq\u0002Ï3%\u0012v\u0001\r8!V)͇k]\u0015փ\n<\u001dy۰+uc\u0011!)\\Lƈ\u000b\u000en+hL.9Ņ\nv'pY\u0002]b\u000e\\̩QԢC3\nͻ\u0005Τi\u001c<\u0005jSSi\u000f\b\u001cFAt\u0004yü\u000br\u0006Tq&pabNl\u0013nnXq#4W3[^\u001bﶄ%I<y\u0010\u0011_\u001d,g32C/\u0017\"\baB-^~m\u0006m\u0002{\u0017\u0012V}K;鶣հtz3tCl%Te\u0017?\u0014>̠,j\u001bh\u0018\f\tE!m1Bg\rR,5(\u001bk[TJ\fMjt \u0013nكY^H\u0005Kf\u001a\u001d\u0010^\u0007bmXԹf\u0007PJ*P\u0013\u001d\b#r͎ȋ<\t\u0004D-\"\u001c\b\u0014UDnG\u0014\r\nendstream\rendobj\r18 0 obj\r<</Length 65536>>stream\r\n凰x5B2\u0006hD>\u0002J*a\u0000\u001cm\u0007(z\u000b6(83(hI?N--\u0000i?\u000f.åJD\u00132\u00079(x\u0001\u001dO\rCM\u0010\u0010w872u\u0001հ\u001ct%\u0007T\\5Ⱥbb*M!MO<\u001a ~MSR\tg\u0016rL~,]Q\u0018h%Z[6\u0016%\u0006~\rti2S\u001b)156Jx6\u0013\\6ǎSmBD\u001f\u001aSh!D,z29)\u000bq\u001ab<\u00049Ej\u0006wp\u000b\u000f;\u001e\n\u0001`\u0011\t\u0019Ny:e\\\u0005Jc\u0003\u0010qrŧN4\u001c\"Ei.Gґ8Ual\u0001ż荾\u0001A\\\"65*,\u000e3|Zvk\u0007C\u0013\u0000\u001e8tDFy\u0011*f@cQ4\u0014\n@Y%Q0Rmz\u0006\u0017.+\t\u0019IТfʈD\u001f-S,6\f\u0000x)!gf2;=u\f=#Ra\u0018a}c(ö?Ft@\u001cCGk\u0002\u0018Z\nWRB\u0003~p\u0006\u0005J3<P\u0004!\u0007ٝ_\rO\u001dю\u0013\u0005݆m-Xd3?V7A޲,-4ɕ\u0018Xԫ5$\u000fYE+;nN#[׌)\u0016T^i;\u0018Nl\u0015\u001c\u0010Ǧ\u0014}hHn\u0014z@:&\u0001ǂ|\\\b%r\u001bIfT1.nRf2c<dT\u000eք3\u0004@޾6c\u0014L41\n\u001c \u001a\u001d$; o\rL\u0000 y<\u001c72v%l)\bs\u000e[d\rŹ*\t%8|\u001fE-)P\u000e@.\by9*\n1v:v\t.eT:U\u0000!q-5M\t\u0011\b&X\\#d'@L\f6E\u0000\u0002PwQJofUMi;|ÃKl7B\u0004dBg\u0004s÷Q\u001a-l`4\u0004p%Jk?F\u001a})\u000e\u0001c)Log\u0006\u001dPI\u000e·r\u0019o\u000e\u0013oL@#NЈX7n\u001aՒH[u8\boO\u0000\u001e,/;\u0011\u000e};\u0012xv,\u001dbav6\nTrQɒ&ڌK))/p~k/Б.83K\u00061\u0012TP\u001c0\u0000iZ%I%5|&`m~Ե\u000f\u0001O,\u001d\u001d\u0018y.\u0003ll-c-TBm!n*5Q}ƂԴrzm fX5\u0007ȳb3WPDHSE>9D\u001edTz\u001aK31ャ\u0007Eng'I,@\u0004#&K\u001fErn\u00108]|k`E\u001bR\u0000j\u0007G\fu7)J\u000f̱Q\u001b]/ܕF4öfD4ړ]dnߔAs.\u0016\u000eNR#2V1\u0007ħ:`\u0007LQ\u0002\u000b0\u0014Κ/&o&\u0015Uʋ\f\u001eG­ܒ5j\u001b%\u0004\u001fwvY\u0018ނ1{#OxFj\u0013$D%\u000e\u0011oFwXJp0\u0018xW<\\Dī*\u0000 QTN.wqâ&(3\u0005Mٚ|l_J\u0018)*a\u0018U>p\u001dsbW:\u0001̀;\fN0e-M\n:E\u0012 \u0018K\"X;+!ruƭNo\u0005\n\u001c]q\u0001\u001b\u0011'\u001e߹} *\u0006xPĤ\u00126xC&$\u0014.F4\u0013Pl#\u0012}\u0015voM8Ip3&?h\u001dEX\u0018at\t-̬7\u000bvy4\u0012\r(w2,N\u0010{<P\u00108cٟ13\u000fƠn_mYI1f{\nJ\u001fg2v[EP;\u000eمG'iB\u0005ٗ]ȅoh\tC{.s?Dde\u0001V\u001ca\u000fgS'\u0000|\fD4X$(R@f6\u0007oVLB U`JF ;,Fi<\u0004\tn.V^ 8-\r_\r\u001c\u001bhHP$|\u0007XÅ=T5M0OeGM\b\b=\u0001'/Z\u0003\u0010M\u001af\n\u0000N^1@_\u0018!\u0000#Va0͠r)xGSLU=t4\u001d\u0013vA5\u0003\u0004euB<͹\u0007qKwE#V\u0004A\fL\u0003,x\u00189\u000b\u0015^\t\u0010UC\u0000\u001b)S\baiW\u0012cb<\u0004\u0013 \n5L\u001f+pǬdѮ)e2݅XW84n_\\\u0011\u0006_Z\u0019ӵ^\u0018\u0014$p&\u0005u/\u0004]\t\u0015d\u0007..|ވ2IOJr|IChS\u001eQ(aȣꜭp!\u000eYu\u0014X;>O(3G\u0013e\u0018\u00058&*\u0018v\u000e¨{\u0013f]@m\u0010d\u0010\fO\u001auW@\u0000N+\u0006'CZG\n\u0005\u0003\u0000\u0018HL,ov\u000b\\#i0XoHω\nO^\nݛA;z?6q\\]MU{ \u0012 \u001c\u0011|~B\u001d'q޾b\u0003PôK\u0018,|\u0015pPeJ\u000ekf)]0\u0000\u0015eQQ\u0014~YHH@UM\u000f5s1\u00109g>?\u001aMf:U\u0012UFn\u0016\u0012\t5\u001e%'^',\u0002[DR\u0018{ߟ\u0013J%\u0006\ty²s?\u000e5v\u001fe<{K@*\u0010\u0002ҁI\u000b(݁?\u0013=0Z\rt5d }{dƄd1/]oWY\u001fFvhmP\u0013\u00067@K\u000f8o:I\u001eA|\u0013q\u001c\u00165/\u000e'.KnOOQ}.6_zi2yP#A_\u0000\nkV涒J9J6Sw\u0013\u001a}yF\u0007*ї\u0000\u0010(\u0004:_^2\\ߨJ\u0019Th3\u0017bK%*\u0016~\u0004v-q\u0013i\u0011\u000b\rhz\u0012)\u000e\u0019^76\u001dIBw9}u3\u000fBSLv\u000e[!u$`\u000b\u00057&\u0001&;\u0002]\u0014UB2bs[\u0012(&3\u0006\u0019I$,kU\u000bHq:\u0002\u001f{\u001fSE8\u001fʷEvBpM\u001f`;\\\u001cRS\u001ax M\u001f`\u0012!i(nP-İ\u0016HA*2F?IA5OX z\u0006+\u0016⪭0\u0001#m@Gl\u0017+X\u0017wʒnCJ4_k\n\u0016W|iK\t|\n͝㑐>IHYMJ\"%\n\u000eO\u0005\u0003\"aH\u0013ZB\"jY,\u0010\u0015>St\u0000؏g? v\u00036\u0015BO\t~\"\u0013_\u0014Fgʌ t5;$z0\u0014s\u0000GmN,]>-n<Ǘ\u0007뱠Y\u001bRF6l\u0011\u0014J㥹ZN4D4Q|\u000e]b0d[Η0*3~@F\u001b\u0001Ϲ\u0018>a[pk\r \u000b/~S%2EJw\u0018`\u00104\u0007\n'\u0001?'\u0004fhH۽8./xtq\u0015\u0012\u001e\u0014;\rNp\t\u0010\n\n.\u0019Cf<\u0005_8(N\"37%;ȷ\u0000\n[\u0016\u0019Z.N@zi8\"uCwr\u001ej_GG\u0016!A(\u00038ۼjͶr$\u0013i*<!\u001a\r\u001b\u0018#v >\u000fn.ҬP\b\u0007ۃ\u0018GH2\u0005:mV#d\u0013\u001at:@\u0016J\u0007\u000eQ\u001a}\u0003\u0011N\u000f\f-L@b\r߱Lۿ\n0\u001f#\u001c:_`GO3aAP9|GfJ\u000f\u0003\u0010\u0010}7[YkgGB÷sF\u0013cYv\u001de\u0015\u0007Rѓ+d>/\u001e(WO@\u0003 T&0w\u0014\\T£k\u001c\u000b૘s,s%ܹp\u0002\u001cM\u00151\u0018\bٹ\u0005;7%ҕ\u0000F+gy\u0016\u001d7=w \u0019}B߬vH𛭻(ޔJ3*\fq!\u0005\u000b\u0015\u0018fh\u0017z\u00173쾞E/99JE5\u001aLQLhu???F{\n4\u0000\u00125\u001c\u001cv\bmů_'ol\u0016?8\u001c?\u0002Q\bz;\u0010h#qѽ\u0000\u0014{\u0013\u0000\"ܾS[0\u0019cݻ&@o2C\u000eqhGCu\u0019մr?\u0006;7\u0011;%3mg\u000e<s#ɟ{~sW\u0010?AV@EC94q,\u001dYɋ.{٠\u0010#@0H\u00149a=]R\u0017Gzqb\u0011\u0010)\u0001_P(\u0013\u0002\u001f\u001a͕y\u0016\u0016cο\u0004^r\u0002\u001c\u0015§\u0006\u0000+\fqZ\u0011\u0015X12^s\u0015\u0007\u001e|hdƂˆ\nlC\u0005\"\u0007E%(\u0002fxX:]KtOӐܩ*p/vcGlI 0rm\u0004\u00075\u000e\u001c\u0010&x8\u0003\u001dP\u00128\u0006@ůg\u0006)b3\u000e]^_\u0013ˬÒ\u0018\u0019htI缠ot8\u00180B2h\u0019$wRfi\u0016:\u0001\u0005\u001as\u0012\u001e\u000fޟͯ\u0011)[,\\zAӉpYc24\fgk,Ecf[0ǵ$֚@?+e%q\rUlԼ\f=NyhՂm\u0000ƪb\u0005k\u001c9R*قQ\u000bf\u0015եdu\u0011Xaz@;׏N-pƐ\u0007ݔ_2\u0019\r,;^\u000b(\u001aM ڗF\u0011P_P?i߀\u0011?%'zNyQ&ۃ{b U\u001ac\u0000\b\u000b\u0001JV{frH׭NHb!\u0019\u0016͐\tI \"\\\u001aJjk΃]@om\u001cQiJh\u0010G\u001b`ֹ\rB,0+[T\u0012\f\u0003_4~\u0015$xB0iߒ\u0011\u0005\u0015JU>$DbnH\u0007k[w5\u001f\u0011Jo\u001aud\u0014k/\u001deUʢ꼻\rC\u0016\u0007\r/v\u001b ՝D`x4xɘt$\u000eӽ3\u0019unݳ'*\u0014l*'S\u001fY-7SӊƸp\u0007\u001dp\u0017??¢\u001aEZBv|޷<.2}fu\"\u001fjs<r\u0018ƞ@[\u000bH\u000fM\u0016*Hf=\u000bm Nq\u000f'Nk\\9+*K#\u001d[z#\u000b\"JJ޿fPs`Ǻ5$\u001cqX2^i}K1Qc\u001a\u0007%B\"b\u0018V)K3[2\\\u0002es]\u0000<-=)\u0015wLA/xߕ)g)?\"sֺ\u0006\"԰6(R\u0003ٚ!Ԋ9ȧ;|Pc\u00007w\\&-r\u0017wtӹ\u0011{,r%Z\u0019\u001b\u0000gT'\u0007\u0003ڮpV'дgLn\u001b\u0014\u000f1x@\u0003`精\u0001\u001d Qj^(4t\u001d\u0007K\u0014ʵ\u0005S\u0001ǪT.\u0002\u0003\u0018*\u00005\u0019k[\u0000L\u0003ӎYOr\\\u001e\u001d\u0000W\u0005y3avԖp^\\Ehw\u0019M\u001d\u0018\u0013[\u0016'xAm Y,8HC[i/GO;\u0012Y}b*WAKP,\u0011L+'\u00175ML؍|\u000eҦ\u0007\u00123|۪\u0003\u0001!phh\b.%հL#$e`JBhpgMoРX-!q)%F\u000f.&x\u0014vna>4EoTЍe\u0002}ɲ\u0001F\u0003,\u0000\u001e\u000ep>-*q8|\u001e\u001eT\bB3~\u0003pT\\ǃH6\u0007`#\u0000f\u0010T'X<kT<c&\u0018%\u0010ۿ\u000219\u001c7UfW_rhXD\u0004$܃\u0017F|`7i:^A\n'gk\u0019=2KP\u000bMX0d8ojLn\u0014\t\u0006,\u001djFqpi\tK\u001bU47X쳐J}K6IvÖ5N\u0003n\u0018\tZSi+; _#ݮ\u0018ق,D_\u0007}>.1\u0011ɜu%X1\u0004\u0005\u00019\n6|`u?\u0016ƶ\u0004\n\f4\u0002\u0016[; \u000fhY\u0006;4լc\rvN/0\u0001z]\b6l>F<'J\u000bj\u0017pAX]PCfjC}+\u001d\u0003l\u0019ea,PaS,?-@\u0014[9NL\\\u001f[&X`Nߒ#(.޵o\u001d\u0005X;}T牾\t\n~\"<]h8`,0\u001a&\\]lX9\u0016S~ܜ\u0011(ކ\u0016NC]MH[\u0014\u0018\u001a!(ኄp0әRh\f\u0011݇Zd9ζ\u0006˔O:8nn\nev2k\tbv\u0010\u0006G\u0012\u000eT\u001c*\u0011-!_[\u001e\u000e\f\bg\u000e#d\fVQDwdӻ\t᲎rMB{+Z\u0006N\u001f*\\tul`i؎|b0g\u000bb\u001a \u0016W1\u0013wχ\u0000\u0015g<MylF+I`xdOX09<e1j\u0002\t0;\u0004e\u001b\u0019T\"\u0013\u001d\u000fkya [1+lnôp\u001b\u001d\u00106\u0000\u0016E\n\u001b\u000edY[K&ٵ\b3o?\u0004EMZA~7U\u0005Sh\u001fv?\rO0\u0016pODON!f\u001a\u0000\u0007\u0013i[+ѻg^tsJL8%\u001a\u0006yCvMň'6yx\"le=k\u00107=ks^\u0012}h\f$<{toIP'\u0018k\u0000%B*<R-}\u00051A\nA)\b\fS\"؀8a\u001dp\u001aPz'\u0002.K\f\u001elv܈G(\t\u0015ʖuClOA\u0002 1L\u0006Toe7M:?|\"=\u000fGwaP\f\u0011y!(\u0013HM\t&gģ*X\u0017Fن?\u0005KJ2\u000ft~gP؝\")OtLR\u0005Xٻ\u0006ᘟB$6\u0019QÕYJ*\u000f5>\nw\u0006\u0018E\u000b·g\u0019\u0005.CxKx\u0013\u0010I܈]:g\u0019\"\"kOu?Ƣ&W+A]|m\\|\t\u0002\u0013i\r+{\u001a#r\u001dqgpEF/?\u001f\"S8lG\u001e5\u000bMupHi7\u0015QH!/?\u0016Ki\u001c&]k!Hn+\\\u000e{%\r[_P\t+1u\t#\u0002b8Mhx\u0012\u0013 M\u000fR\u0002ioHk\u0015x^\u001cq\u0018Ϊ\"\u0007[7\u001dJ^\u00127T\u0011\u001b\u0007\tueY[\u0019d\fg\u0011\n,f-_Xܼv}4V\u0003FL\u0004\u001b!@\u0017\nnyckZtDaLr\u0013M]\u00046fqgZe=\u0011i\u0011\b5\u0000l\u001bj\b\u001d4\\}dW(\u000e65\u0017ElS\u000e\u0005_\b\u000e¬t\u000b@j\ba싚\u0014,4C5jf o\rH\nՀF\u00007WMuHip\u0002ֆ@ߺ055$\u0014܄\u0002j8d\\*X~\tCD\bKaK\u0006\u0005\u0011m)ԹY\t\u0016\u0006A4'\u0017o,DTំ\u000by9-4%m\u0015\u0000%\u0018|r\u000e𹛂\u0004\u001f䊋\u001d\u0017%Rg\u0013c4\f*\u0016g\\R_\u0007\\t@>y\u001enkݍ\u001b%Qh\t,pLRat\t//=4F~\u0013*\u0018lԴg*✜YB&DY;WBW|p\u0004 f,0\u001a\u0007\rl\u00119lU;<4x+6\u0002.\u000fYsNlvgLdz=jc\u001aqbK\u0017\u000bnN4F\u000f7+t~,i9\u0002Pp\u001b\u0014kno9&\u001a\u0005v;\u0010){A\u001am_:\u0007ހ\"%9}e\u0006e>AU#\u0010^X\u0000ߝG5?\u0002\b0\u0011T8*\u001a%(N\u0013hF\u0000M=Xʁ/W^p4$\u001ej\ty)س\tK\u000eЉ,\u0006Wֱ><6+\u0014=}\u000fc\u0012-\u0012Q\u0015ԪT\u001d'\r#(bצP^<lP|״\u0012gy-Ryd\\O\tp%ڥPO\u0010\nIӅ i\u001fÇ9&l\"rft\"\u0003p6\u0004)ߨGp\u0006R[j49b3'xBw¥X{րHL1t\u001dhm4mP $PzJ\u0004\u001e\u000f\u0014u\u0003mh\u001e\u0007}PV\u0007.d=\u0019ç\u001d0Y{M@x\u001d|<\u001e_k6=!/\u0000Ƌ\u0017vo0I\u001e7\u0017%DL \u000e?+[@FȠ\bc:(X\u0005zr*{\u001a^\u0016tl\b&K_a\u0013!Fyh!\u0003WE\\b\u0012[\u0011\u001a\u0018\u0007j$R[W\u0006o\u001a\rs\u0014O\u0010\u0018\u0011xD\u0010fa4\rW\u000brV\"eS\nPDI\t78&Ɇ5zεUp\u001f0\u001dT\tI|kS\u0018\u00025\u0006ߴ\r!Y\u0011^j\\>4[Z0J\u0018x\u0018)D\u001e@z\u001dOE]z=l6I\u0018X)ct.eLԃʇ,ķùMr0ܞQep@$r\u00167\fF:>\u0001G\fnˠ9X\u001f%\u001b#ZU)#{0dy\u0019?w}tU0\u001cpfZ6T9Y˿e\u00137\u0004\u0016\f\u0013E\u0003F\u0003,x\u001eAU\u0018PMp\u0005 A\u0011Z˺BmV\u0005u\fSΣ΅F\u00023\u000bOU\u000f\u001bƪ#\u0000a.1h\u0012w޵UA4jĩCͶt4*#vl5\u0000A=ͤU\u0018@O\u001c\u001aݨ\u0001o\boC+zB#\u0007f!yrN%D辄PN)\t\u000fE\u0012Ҷ,9!t\u00061m\u0004\u00100\u0002\u001a\u0018vܑL],\tp]\u0015h\b.pхw׮)ߴׄ뵶\u000f\u000732$PĩO\u0018 \u0003\u0004نH-mI\u001d\u0016u\\%w\u0019\nhY+\u0015h@V[i^͓\u0006\u001cm\u0015Ty\u0000\u0016?lpT\u001bN0OJ\u0000\u000e~\r!\u0017AavMM\u001f\u0004 \u0002%\u00023m6%?\u001b{Xm~\u001f\\y<\u000e'*\u000e5x\u0007\u000f86n$Xi'Ize@\u0006ff#DĘ7\u001a!?i\u0001z6\tm9mtY\f<: b4o^yɠ#Xb[\u0018D\u000eOZuCYc@JL\fFCWdWK\u000bn\u0002ȟJb#\u0000\n_A\u001e\u0010uXV\u0007Ācm\u0015V\u0018~Պ\u0015c\nW;.힒Ű\u000f\u001cUGZ(1M\u0004ꗃ]\u0018\u0011blY÷\u0016Ģǚ<Yk3*;ۏJY\u0016v\nM\u0002\u001dkSI9O\u001a T_\u000fqv\u0013g/\b'^f|R4*,\bV\u0010\u0005G\u0019\u0000\u000b\u001f~A*\u001bEq\u000e7w~GJ`\u0004Y@\rm\u0007\u00124\u0005\u0011HfoDFDӶ/|x<ٝ5r cUh\u001fv//5^\t\u00106L0\u000e$tRΗ]6\"3=1i#V[\u001e3\u001c1\u0013\bD\u0002!1!w$//$}\u0003\f\u0001\u0017*LhhŰц(0qੰ\u0017BMvv=ϩa\u0015\u001e:\u00014\u0001\u0001oίݲ٘\u001cZuM\u0015Mq_Ӳ\u001b>\u001b+{}T\u001am_+]?5?w7c7DM<MJ\u001bckzotCy-2\u000f\u001bO*uOwwW>O1]b؍q\u0015~+j=Y\u001b.b߻Z+5\u001d\n`A\u0012\tK\u0014HN\u0004JumK\u0016y.MWjlHK^\\V.5=Ms;?78\u001b-\u001bR\u000bg驟*𩪮~y{kvط{눘gx蘒\u001f6ڻbjjd?Оx0\u0011\u001bƘJ\u0017\u0015q3:ce^rg\u001dj;g{bw+N7NONδMMNoT3?-3/\u001fܰѿ\u00191\u0018\u0015+RDMgw\u0010\u0013ѳSs{CTx^>>S\u001cs{GD}weyiw\u0017[؎\u000fQ])oͧ\u000byhwmxvfoogwh\u000bwwx٭z߸TޯRQ\u001b~\u0001 \u0001<\u001e%\u0001u\u00105Kó$\u0001\u000f\r\nbÉ\u0018<,\u0012C\u0015\tc1(`\b\"%\u0018\t\u00129@rD\b9X\u001ecI\u000b\t2I,\u0013@\u0003\u0002!\u0003-\u0004KB`=ŚzqL\u0010A\b\u0003YH\u0010\u0007\u0016\b\u001aA4\u000e>,\u0011GA!\u0012\" \u0015a71!\u0011(%5\u0013,&iQ,\t\u0016\u0011\u0002\r@pD\tjP܂<j\"(a5\u00114&V\u00131P\u0016D\u0000\u0000\nH\u0014\u0000\u0010A \u0007\u001cV|O|^8dhnnʻ\u001b;Qq|LO<wGnF|NmgaZ;#:c\"+ͼ̧2//*#3c32s>l؞܊۪\u0015F[C\u0017\u0015\u001a{kۉW1mm7zVVVkeXuu\u0013\u0003\u0007A\u000b\u000f\b* 29\u0012E\u0003fy\u0016M\u0014=M\u0014=\b`tMH\u0010M\u0014AР\u0010lºerxhPpgKfIРpgf\b$HyKgð\u0018\u0007-Rh\u00139\u0012\bi G B\u0001%A(z@\u0018\fAa\u0018*P\u0015S\u0018&{\f\u00133T%K\u000eƒ\u0018e9\u00049@8\u001eaY\u0013\u000e\u0003\u000f\r\n\rlb\u000fMj\"\u0000l\u0007\u0006[@\u001000\f03\b0׬L%E\u0016\u0007҈$\u0006Z8\fF4E\u0003i@\u0018f\"39M,i\u0001,̲ Ah8r׸\u0012˅#M\u000b\u0004\u0013\u0013\r<Y\u0010D,D\u0014\u001c˂\tZ,0b\u001bMb\u0001-\u001e\u0010YAβ<N\u0013(!E\u000b\u000e\u001f%\u0019DCB&4\u0011ւ\u0006\rTA\u0003\u0007aZɑ{\u0000#\u0011\u0004M@P&ȉ\u0018XL\b\u0007\u0005H\u00131\t\u000fd\u0001f9\u001e\u000b\u001c\u0013\u0007b\u0016\u0004y L2=hq\u00103E@8<\u0010f9\u001c\u0016\"iփX`1nH,T\u0016L\u0011\u0000\u0000\u0000$\u0000\u0011\bp(,\u001a\fF䂱H\u0000\u0014\u0005cN0h:H\n\u0000(\u0006\u0001\u0000\n\u0000\u0018\u0000@\u0000\n\u0000\u0006Ш\r]#G\u0003%F^TEIi&c<0k_Xgdh\\R6~E+p\u001bO\u0001\u0019XW\u000eЈ%\u0000\u0013!?8h\u0011\u0004)ضJ{m\u000fC6~,A\u0004]E.@eA\u0003Ŧ50F#KXRM-\u0016,՛̍Њ!|K1\b\"\u000e'QI=`%\\\"o}N\u0018.\u0002j$ޣ<ܹ\u0010\u0014\u001e\u0007\u001e.fA',&hY7`\u0007*^\u001d\f\be楂\u000e.\u000e_b\u0005:uD8*\u0000b\u0000\u0003XpR\u0014\u001c?mQ\u0014)4\u000fdBR⛩\u0006Ofi\u0002x\u0011%\u0015ˤjdJ=xw{xb\u001ey\u0000C\u001f\"9J\u0012JUZ\u0012$}芢%\u001a\u000026\\^Q\u0012 GZ^\u0016=71(\u000bq\t\"9\u0011#WuR5\u0019]ab~$_\u0004/Q\u0018XHzu.4a\u001f\u0001W\u0007T\u0004q@$9L\b\u0001|iP!\u0003TΊ[\u0004\u0019on`-XLg%\u0013'}\u0019]JA4&\u0018\nDX\u0015\u0014\u001c\u0000xTv\u0007Z\u0004\u0013\u0019;*L_\b5\u0014X\u001bh0\u001a\u0000֯Rp;É\u0010\u0006!K &L\u001f֘\u0019b#E&\u00001}+>\u0005W;\u0017@i p\u0005R>NЦC-\u0003OӔ(\t3\b7#\u0000:]Vai@\u0017\fs\u0014G\u001d'ՠ6JT\r\u0012D\u0007\u0015\u001diٵ\u0012'^\u0005\u001c\u0000L\u0003\"\u001e3\\m\u0011@!\u0019SGccǮݎ&\u001ez.\u0003\u00064$\u00103\u0006.Iu\u0003`I\u00110<0%Do\u001e@\u0013\u000e4\u0004\n\u001a?\t1@O m@$Y\u0003!JUR\u00052QY\u0001\u0003XD\u0000M N)W$G7V3{\u0006EuETB\f\n'h\u0000&|<W>-I%\u0012ƻbR\f%U@\"c\u001b\u000f7LGTXb֢\u0017K?8*v$زu@p\u0013(Ds\u0017\u001aT\u0004?p!޶\u0012u\u0016h)kƄX\u0007\u000eH6UR\u0004.x4LD.RE\u0000\u0004\\\u0012p^K|HZfj9\u00112\u0016`\u0016-\u000e&Ig}ܬ\u0012w\u001aT#ls$pJ*\u0014MRQTeȔ\n\u0003\u0002y\u0010|\u000f(#<OEa$Estz\u0013~V\u001c'\bhOg\u001b\u0002]F\u0000M\u0019:\u001ak,\u0005>(\u0004ЅjzSRǳ\r\u0017ƿ\u000b&O1,,Ħټ/N\u0017a۰}Rt\u0018F\u0015P\f66\u0018|WI\u0007ZJ5'\u0007\u001cR`q-!54\u001bPaL\u0011\u0000;$?Q|̽ͼhxj8a6\u0012\rŁ\u001b\u0005\t\n\u0000g\b\u000e2\nB\u001e\t\u001dF~@j\u0013\u001f]fE\u00023\"\u0001\u0016z\u0019H\u0017\u0016@:\u0011@.\u0005\tJ.R(1q%\u0016\u0003x彷sS\u0003ajG\u0019\f\u0005%V`\u001f\u001d2(e,\u001d(\u001f3>}1\u0012;c3\u0001T04jg\r0\u001b5m,P\u0003TE_@M\u0001j\rF:\\\rXE\u0015xR\u001e7+$q\u0017a>\rT\u000b\u0014Ea>p\u0011\f\u0018.\u000b\u000ee\u001b\u001a,N\u0014éƲm|s(\u0013h\u0011PƖU_\u0005\rg\u001eF/QI{L!\nRbr\u0015Ɇc\r\u000eOm\t/<ݔ\u001dk鯹-c*U\u000e\t\u0001\u0002\u0011S`3\u0014ZP\fC+0p \u0005K3\u00184#eHձYG\u0006\u0005U\u0000qm\u0005gBy!SY1ޘhljj\u000eac\u001bt9Y\u0013m\u001ah~&\u001aq=\r>'f}\u0014G9+G\u0000='db&\u0007p53=ȏ\rnlܫ-Г\u001b\u001d\u0019\rQ;\u0011r.һ: `\u0003zJ+\u001bk\u0005\u001df4z72Wsa1nf4w{Z946.l=\u001fXt\u0017s/\u0017\u001ciJ*-=MTsI\u001c\u000eK\u0017wYW\u0002\u0010&и4N\u000b\u0018ON\u0002\u001d\u0015\u00127*\u0002\u0000\u00191ȕ{&0:: J|\u0003 3lck\u0006Z4xEWmd<;G\u001e>\u0007\u0014/v\n\u001c=ϛ'F\u000bJ \u0013/Y-7ϟ]YZFC+M\u0006/󿘖$\u0004%t-MNJD\"U~cާBt|f:<A\f\u0011{\u0003\u001cϷ;:siKϫkH?\u0014k,\u0003ۙC\u0010 \u000b?4BV<`]\u0007\u00108o)(R\\XmBw\u0013\u0015oTx#Y&-2d\u0012)嗒y\u001dk\u00159g$$Eԑ͐P4VџڛuM\f3uځI\\bQ-_K`t\u0005'P?TBu^ׄvĈIZ>n\tZU)Kq}~yNQt\u0006\u0006\u0014>bTc)<\u001cBU\nۮ\u0012\u0018egyp7Ai\u001f\u001b\u0004_izA\u000bk%r\u00146)/Ri\u0000uA>Vֆ6'\u0015#MGH\u0014D\u0000y$\u0018>Fޭk\u0018 {>?Ig{̫G3\u001ch\u0007Ae\t\u0002>J6\u001e\u0010\u0001\t[T&\b.\u0000˖\u0016>&bo\u000e\u0001%\u0012_.\u001f!#\u0005Dxo~J}\rI\u0001{By<<p\u001e%𼥠+O\u001c\u0001vw\t;hRW253ĻR\u0003lC\u001cW\u000fxWRrMj\u0019nR\u000e\\~U4iq2\nh-[\tU+ˊә8״\fY\u0001tVWJ9r6(9iEb\u001fU,kKU\t%m=\u000f\u0002oꨰ\u0003Y\fftlKm\tK!\ffތw\u0016TZ<\u0017G\u0001e-7M6VI\"%\u0019&\bsg\u001azik\\kؕYkLY[ݷvM#\u0005J+@6Mq\u001b[\u0005}iM)oS)\u0004l\u000b\u0018d+R\r}5Đ\n\u0013.u\u001f`c됤<\u0017t9%(\u001dJ\n\u001b.%)W\u0015w&쪦wӇF\u0007\u0001\fLH\u0015p\u0018=u\u0000̉=Iͪ@!\u0001q7*\u0004x;\u001b)]y?X:e8\u0000p\u0007\u0000Y\u001c\u0007;\u0011Ȟs\u000b\n\"\u0001HܣΏ\\\u0007\u0014k8\u0005b\u000bWafi\u001cEj\naU\u0016\f\u0016\u000egZLϭ%Qո\u0003p\u0018\nAm(p\u0013sDj.v|-i\u0016\u001c]\u0010Wc6aWSM\u0010\u0003XE|\u001dg` PIwpPj@Hk\u001c6A\u000fHC6kQ!D:'\u001d\"\u0005\u0016?&m!%[E\u000fVs$'rY\u0000rȠ$8*\u000e\u0005zcHBy$b\u001d\u001b߃P=\u001f5\u0016yi\u000bFߟjI>\u0010\u0015?#8ň\r\u0012B\u0004N>\u000f\u000fb!*\u000bv\u0007Ͻ:\u0014\rt`\u0005hH]PwQ*D+{\u00037[m{.Z'#dj3\u00068\u0013\u000bQFgLH\u000f=\u0015\n\u001c^oEzQ[SȰu{N( {K*`4f\r5d\u0006*+\u0017a^jBy{9\u0012τ_\u00020OfS䂦\u0017[!Ǩ;S\u001c?5\u0012a]\bkw5#D\u0002\b12ĺ\u0017Q&g6.Mla fW\u0012\u0016\u0003;\u001d\u0010ְ\u0013z66I\u001a\u0007\u0018̬|Wv-Dj<7*0`\u001d\u0005 WҔdFqH\u0010R;xuoxSO\u0017gI؆OJ1*\u0013C\u0018\u000f\u0012t\u0018 \u0002#&|Mł\t\u0017eL,ĭIc\"]A\u001b\u001cadOMx&cP\u0000a(gߎ}EF\"٭\u0011Q\u0005Ń4[k\u001eM'\u000e/\u001d^N\u0019n\u0016I%=@\u0006'\u0000 Vƙ \u0010]\u001e'\u0007\u0016\u0001 <\n\u0003kQm\r\u0005\u001cA{^Ǩm\"jM|T/\n,[)\u001c2CyGG$\ti%˜CS\u0013O\u001d8q\u0015\u000b=N!ҺW\u000bP\u0003\u000b\u001eV:\u0003;\u0015\u0015\u0014B\u0010\u001b(LJsΌP\u0011-j-\"/A0^y\u00148s[$йz8nHiz\u000b|lC*\u0003Vu>rF{af?\u0014Ӵ+s/\r]0-DuʼRQ\u0010\u0017\\{\\4ŧj\u0003c4Ǘv٫\f\b|1Jʜ\u000e\bp\u0011\fS*!N\\\u0010f\u001fF\u0000왊\u001f/6\u001d׶)J\u0015d z\u0013mt\u00116\u0014/}\bw*KN9#S\u0016G*\u0007ZPKMin\u000eM\u000elOlt$\u000emo0l\bG`\u0002&\u0014zR%y\u00173wݝ%:OB}\u00035b\u001atOƺV>azP\t\u0012yTȭ\u001c)q\u0007\u0006\\Ӎk's\r7I\u001b@\u0007Ŧ>nb|4)*\u001bb\u001e:혅xRb4L\rHPd\u000b\u0014¸\"\u0010W{Ѽ\u000f率z4e2Tr\tumgc\u001b\u0018[\n\u0010\u0010Ĉf9?o\u0012v5#)n`]K\u0010&Ce䑻CLXjukI\u0003b{ԋ\u001f!c\u001amT\u0018\u00194\u001d8슔בvb*CS3\u0007\u0016g\u0005Z\n\u0010dkɲy<՟4:;\n#$\t\u0019nhr\u0016v^\\18zA\u0003$k}\\GG5\u0016\u000bvĂ\u0003J\u0004em;dz-iF\\)\u00006J\u0006̮\u0011;v>cP.=\bB\t^\u001c}ɗ\u000er-CߔЫ5-&I1b:hDN9I.G^\u0010\u0003§чó\u0019\u0013lMǰdYu@\u001b,ދԂ\no/X\u000b[F2p7jŸ4@`>\ny\u0007d@\u0010$\u0013Q\fE.ҫHN\u0013\u0016\u001d!~h\u001aoe^46m\rLϡ\"\u001d7n:idu\u0000S\u0001\u001e~K9\u000bL'LyT\u0017Ar'I\u0011!-\u0019C-iWAR̶YkuL\u00064%h_E)0h\u00111ХXԟ,\u0007\u0005\u0006AS(QpX{S1Ohe=1RYb\u0006/=\u0011uf\u001b\rvz\u0000ӶD3FkM\u000f\t݁*%p\u0005\tkh'l'u%!RoU\\ L1\u0014\u001ed(\u0005\u0015\rq-7v)\u001bsA#D\tM!\u0002{bu\u0000]l\u0010_˩Fܰuusrɜw\u000e\u0016qEq\u001ddp\u0003ݎc\u001df\u0005\u0017X)\n$\u001f3ކ.\u00005|sΫ2\u001fWຩTGS\u0013nl\"jhKo.T(\u0012\u0013QlC\u0018t)\u001c\u0010\nmGK\u001e\u0016MK\u0016`\u0014+h,c\u0000QsZ\u0014݋/C\u0016\u0005a\fP;\fa\u0019X72\u001bl\u0014d\u0005S򃇑\u001dX+=jq\u0018\u001f,m\"\u0012\u001bܙ0\n̑i\u0012\u0000\u00016K\u0018W|d?\u0014\u0016\u000e/]\u0012\u000f\bmstR?\u001a#r$2߉(ZYP\u0005;/ˈS,¨O\u0007Q~\u001f{(EΓO.2^D)Gw\r<CKZ|\u0017@\"0\u0019J#cI\u0015*c8ˏ9yVS\rA(\u0019aZU˶LQ;f;F\u001eC毵Y\u0006*Ladv\b\u0012<\u000b X\u001eŖ.0\u0015Q<s])\u00197s$=f1K\u00188\u0017)!`__o\u001c\u000fi\u0011:\u0001s|P\u0004\u0014]ͦ\u0001~9T<wfqfF\u001c\\B]~3E\u0019ԺİX\u0006\u0019Y,YSO>\u000e%U{lYl<B)JE'𱷽v.\u001a_3Y%RrM:/m8}t\u001b-3T\u0001eZ3~;\u0019VlƁ'?\u000b@leJ\u0000BS$&_j_52S4\u000e\u0006*)A\bn\u0016f\u001d\u001f\\P\u00163\u0014bJؿv2fU}<~(\f\u000e*m\u0006Aǘ;Z`\u000er稻[$d;{_K'w\bMQ\u001f#HءӈM\f ^o\u001bn衽\u0000wW\u001aǫ\u001e+^$4N\fD9hJUkb^3&c\u00137@5\"o6Aw\u0014%nc$HbgMg&k\u001c\u0006[\u0012W-4l15$@QֱIKlL \u0003Bq\u0019SM\u0016{6C$fk8l\u0019dg_sv1\n'[jCP\u0004*+\\='jȵ\u0014f\u0007\u0005X\u001d`O\u0019\\\\~Ӟjf\"7\u0003xUޭ\u0002s/p3^#FGD4~F4_\u0012\u0001\u0002V\u0013#$DxocF\u0014%+l.jwrAq/?\u001bvAϢ\u0010:\u0002]WA3\u000fVE\u0007YPs{T\u0003h o\u0015\u0013Pac6tJbz\u0004ƪV}\u00186r\"Ϟ)\u0017RQ6Ued\u0016$!\u0003+e҉%C\u001cRvbR&l[0ؽV\u0007\u0019<$_0'V:\u0002n*\u0000\u0002u\u000b mj<W:DG˥\u0016JL\u00077Uau6\fi\u000f?avq\u0001\u0006h@J\n 5K`\u00159F\u000bP!:]v`p\u00030f~W<(e)\u0018a\b\\\fzX>J\u0005fp\u0007 DXB\u0018`\\S9L\u001dЛȞ\u0012\u00062)\u00060v\u0001\tLJ4X\u001fٴ-H_\u0006ȇDp\f\u0012t\u00121705\u0018=\u0016\u0010\u0016 \u0018Q&\n~s`[ԍg\u0019NVS|ݕaJܫ.x}Bѳn\u0000rf\u0005*\u0012\u0003\u0003̍\b\u001a~}!f^<z\u0013cҵyK\rIƐ{K\nkcKMb!q;#\u0004}\t7;;\u000f\fUߨv \u001f-H\u0007:٭\u0004>bE5\u001fqp[o,\u000fKtJ,?CU\"\u0019Cʍ\u0015@B\u0012\u0013\u00196CVH\u0016xb\u0018\u0014o!\r\u000eom\u0005t#No*\u000b}\u001f(楆X\u001b*7{\u001e\u0017\u0006\u0001\u001b<\u0006i\u000b(\u0007M:Dط.\u000429\u0007ØQ\u00167\fo\u0013*\\$b\u0002\t\u0018_\u000edb?8D\u000b[ T ? 9\bR/\u000f0\u0004C{\u0001+*\u0017]֗\\Ju&a3\\\t\u0002(\u000f|\u001f\u001d\u0012KTM\r\u0017Rāsë\u001a\u0005\u0011غ~.3\u001d7@%׊\u0014>es\n7g^\u00012a1n؁\u0019\u0001\u0018\u00129\u0003E,+ei\u0004\u0019_MpK=\u0006W\u0001'Fg}<Hׇ\u001c&5yc2&M;3ڂK\u0003G3D+[\u00031`z̏@½\u0014Aҵ9;;\u0014Ƀ~G.IX΍\u0014\u0000\u001b\u0007-\u001b>+X9\u000fs\u0015zlJ\"LIЈ\u0013\n:*(z.I9|&c\u0002g礣i0O8<j.[Y\u0018hoaX#[:[i\u0004t\rX\fc^\u0002/(<\fսcZba\\MZv6\u0011i\u0004ha0\nBaݮ\u001cO8m-D]\u0005}\u0001!1k/ݕwzx^_I\u000b%FPH\u0018 ^Y\u0019r\u000bpd~$\u0013R9V\u0004\";\u0002iSr\u000eްa?l\tM-bE;fHtfI\fhl@d\u001fo\u0015|RǍ3\u001cֽ?&g/R\u000bRl [FG0F]@Xf?{\u000f\u0019Dpv$\u0007Q\u000b\fA(\roJq>ߩdP\u001f\"\u0007B\u00135Vѿ?\u001b^>Y_yҜ1r>(]\u0001[\beR&u\"r\u0006$UHt\u0010W)ni\u001b\u000bj\u0010T̏V'\n\u0017G\u0005\u001eW\u001e/J-0)\u001d\u001e\u000fB%ԧCHaW\u0017uvw/iH)mbo#.GS0\u000e\u0005St=x/0t4L\u0006EKHZƏ\u0019#5>\u0010L&-@i2w\u0001/\u0015P8s\u0017̓\u0004:#h\u000e\r\u0011\t\u001bRpP\u001er0\rz8\u0011\u000bn\u0010>Ϗ\u001fh+\u001fn\u0018\u0000QD,1\u0017AH@}Gǰ/Yb\\\u0002\f؎|yG\u000ew\\E:d:#H-\u0015٘5p?\u0004_1~&ǚ\nݔ^\u0002Pr\u0010;H\"W3\u000bF\u00112HT2\u001f l\u0001厔'U\u0006Tb{;L\u001a\u0019\u0003{\u0016\u0007Lt΀a\u000f0>Z,\u0011ˁy1\f[\u0013c\u0014s7ϴE:\t\u001fG,8=\nQ4,\u0016̊\u001cLy\u0004\u0002tI\t\u0018Z@\u0018M&k\u0001Y\u0015\f\u001fY\u000b*³퀃Ή>\"\np%\"yRR\u00110s@RK\u001a4\"0\u001d\u001b*1NZb1Q(łо%\u000e\u0013NYs\\n<#j<W65wFo@;qLp$\u001c\u0018MW\tk3iH.LIp\u0002{\\\u001ayͼ\u0005QQ2{\u0015]\u0013*z7#\u0004w8HFڱ$KWR(5\u001e!+t2dk\\ϣ\u0011q,Г\u001f\u0018\u0015J\u001dzrƹ^)⮥M\u0003ln5CI\u0007W\u0002}/{M\u0010{h\u00150\f[\u0003BB/ߓT\u000f~K\f\u0015;š]t\u0001]\u001a5uR6\u0006>>d-6\u001bo,|͛Nb|\\gG\"\u001eſ\u0014\u0010UK\u001a=nC\u0002_\u000f}(\u0019\u000fk\u0018\u00135Nz/\f{o҂*.v|;\u001aC_%3'jV_w(\tt&\u0013i25<Uoƛjy\u000bU(61kZ&\u001bJٟ{=؍\u001e}'Q\u0012a\u0016\u0014g-1\u00108o\u0010i8Y/\u0010.\t\u000fE\u0012!-+ȖI6+'\u0011\r`\u001fZ\u0000q\u0010pP\u0002#6ppcGD_KCFY\u001b<o1\u000eU0\u0005\u00122H\\VI;ZxQ\u00016P(\u000bELs?}D/4PB]\n{c&k\u0018x ~Hj\u001e\u0004\u001bAІhATBF%MO\rGKPqE\r\bM8V<z_-\u0012|-\u001c\r<c\u000b\r\f!n\u0013\u001d\u0006.xp@\u0006*ώP{\f\u0019=EpO\u000fϲz\u0000\u0011)u$l\u0000\u0004b)vTB\u001e\u001f{\u001dpXR!\u0014<Nr7\u0000>\u0013m\u0003gspm鋖Cٙ\u000b{SU\u001em=ݖC_DQq@cѲ\u0005\u00034\u001f\u001a\u0011[ñ\u0011چ@\u000f/9\u001b\u0018WEK\u001a_᠌@kR\u0000ɓ8\"\u001c\u0004\u001b\u001dE\fY#x\u0004\t+*:\u0003g\u0016#\u0007\u0012Ƃ}\u001b8.d\u001cOtO\u001ff\u0018>\u0019ui\u0003\t}h\u000e\u0015Sn٧џb`q\u000bnMX4W4Xq\u0013y7JvF0?÷\u000fX7G@SO\r\u0013q\\uEHւP\u0011\t~Pn\u001d_'\u0017\u0002B\u0006\u001aߐbH\u0003)9Rmvcq\\rpLr\u001b泋=rkҁ뚊OU|X\u0017VT֧\u0013\u0005eVC:\u001eKd\f\"\u000fW-Xȼ\u001dBJ%\t%MC1O4\u001cBtսt{\u0013n/Y\u0005oT\"ě\u0006\u0004\u0006Cgx2n1\f\u0003<nы@5\u000f[B 7hG\u000fQ#j<Gn-ݹT\u0004G`\n¢>\u0004PK\u000f5?8\u0012=,^+Y+\u000fx$).za3E·A\u001e<#ezot[L-#D(l\u0003HvQ6\u0004Mh\n<71+_4\u000fO6Pc\u0005;ȣQ:<@3\f\u001bICS/\u00132N\u001b\fԘ@_g@*h\u000e\u0015%\\\u0005 aT3\b+69⴩,\u001dr;\u0002Z\u00161̶/\u0003\u0018NE4_nli<S}\u001d\u0007\u001a\u0003糓\u001c0\u0002nH9~9CA\f-\u0000u@_ò(8\u000es\u001a k\u00053#'\u0017U/IFZ0ⴈ\f\\mu\tMx\u000f\t\"vY9EXe;\u0014J#1@t\u0005M]y1Y$.^\u0016GpAPK&\u001f`\u001e\u0018@K\u0006\u001d\u0018{///*\u00149ѪKp\u0011}|Sl \u0005ѹ&BUаi5c\u00001qw\u0016:\u0017ُ\u0013NJHÉHK\u0004\fTG\u0011\u001fګn,W\u0004%\u00049PMA✠f\u0004*!\u001d0\f\u0011_%Ž?s\u0010/\u001c^l\u00033$\u0018R`ܤ}LW\u0012XљUa)\u0000\u0003ye\rm:\u001e^*X)}Ct(#0Q\u00146\u001ar\u00012-Tǖ\u000e\u0007\u001d0tW\u0011M\u0007gIF\u000bh\u0018\u001b5B\u0019hZZ+wL_\u000ea0w\u000f*\bN4]|Z'dh25QpH\u0004u\u0018]\np9h)AO\u0011X?q\u0014Hc䭍6`A*A5`}P0(3U}\u001be;yOI\u0010\u0001\\fWA\u0010K -\u0012\u00021\u0010<\"\u001cB\u0018\u0000,fY\u0017sM)6OuN\tmG|ˏ5M\u0013\u0006z&_\u0018\tl\u0001gi%%\u0018f\u000b п?6\u00177X`\u0003\u0002H:- \u0014q+>\u0018L\u0004`\u0015.:$\u0000\u0000\u0010F8or\u0016(\u0013]M̚\u000e%\u001c&tb\u0010\u0011_S\u0002hH\u001f/Ќ ~Tn|0H;d}\\WqϘ\u001dg4(HGl\u00076(zprq\u0010\"{8n17'\f--؎2qHՃu\u001eH\u000b-zy\\\u0018}ād\r\nl,\u00184{\u0018Ekc~|w9k9\u0013\u0001h^sF\u001b\u0015\u0017\"a}8ܖ3+,Ai.d\u0018؞$\u000fٛYk3'J\u001a\u0012%?\u000f\u0003noIm\u0006sgcR\\݅9C\u0016;/&}DY;8upM\u001e\u0014\u000fQ(;D?ɉ1\u0012_+2=\u0003;\u001d\u0019\u001e!R4a\u0019!%OZ\bc\u0016vr\r@OÝ\u001fi\u00061XxB]\b\u00133疳\u0000c\u0012i\u0001k\u001af\u000eWW\u000b6\u0019\f\u0017?\u0010\r\"\u0012ەY\u001b\bb9\u0013M+.o#\ft}D#Ct\u0005߬B\u0005n`\u0015Y4E\f\u00051\"KiBF\t6\\7U\u0002gpo\u001ec淖jսFs|\u0003@\u0012\u000f\u0012/4\u0011h-ld!WP9\u0011!\u000eb8Iᮼڃ]|ڰ\u0005S<kt\u00150?[}ˋFS=cÑq_!]hل\u0006MeE0#n<FO\\\u0012\u0005>ʎ#]a[k\tiZ#\u000ewWYoۃr\u00079t)\u0018`4m+*\u0017(O534m8\u0006aiOr6i4bAff.4<D\u00002P\b\" E#zhVX\u0003.M4*惽D랶w\t-\u001f`\u001b\bկx\u0015֡\u00078va8%bu_o\fvT\u0016\bm\\Qb\u0005'z۶\u0015.̣s#MqS{eΏ&޾%.\u0018k\u0000ӱY\u0002\\ҥh\u0006\f]g\u0002$FUC\u001c0 =؝Yڮ?x\u000bCxW5J; ɀQ.\u0006'1(5Cf;iG=ODv*8\u0010KǢl0\u0017\u0011ɱk9\u0003~\u0002`\u0018ݢ\u001bZ­\u000f5]\u000bt\t3ͻ\u001c؟)\u0015mFN\u0016b\u000f4ٓ\u001c\u0015O+2\b\u0005R\u0001urD=E\u0015+\u0007G謝K5j$\u0003%6_`\u001dѲL\u0011Hc\u0017\u0001\u001c\u001f\u0001\n.A,.H&\u0006\u001bp\u001b_\u0012\u0003J<\u0003s\u001c[\t\u0014K=z\u0019x$RB4\u0003\u0002\u0002\u000f\u0005P\f\u0000A\u0003\u0007G\u0001\u0004\n\u0002\u0007\u0011\u000eఆc\u0015@F\"KZ\u0014{3R\u001a(\u0006ѢWˬX+7DUNqX*DL\u001f5J&e\u0010G%Ҙ\u001b\u001dAʢ\u000e>{xkʺfFUPÜ\u0011&\u0018\"_3S\t 6^cs-\u0015\u00113+MyxY[\\L+x(IQkəÄ\u0017\u0002\u0016\u001db\u001eVٙقt\u00040Q*oݪr(Yh\u001a%hq\"]pߥuWZy݆֪5uYyY0vQ.3Ksy*hIF\u0012Fmneo}+,Ee\u001c8̱Q\f&\u000f\rֹ5/ϽicCLB=gy=Md=LHD\"\u0002\u001a4\u000b$$̈́\t\u0010\u0005(\u0010$xP\u0011iJ\u0010!BR$8@8hT7͌Q\u001e6R;fALi2e\u000b\u0004\u0002\u0012G\"Q\u0001i@8pl\bEŃ\u0003`\u0004Th\u0018C3\u0004P0\bM\u0013YpԂp**4\u0010\u0003\t\u001e\u000f\r\u0011\u0015\u0006\u0003\u0007D\u0007\u0003I\fh\u0018E\u0002\u0012\u0001D\u0012I\u0010``h\u0016 \u0010@I\u0014 #<TD\u0007\fDA#C\u0002\u0000J\u0000AĂ\u0001\u0014\u0012P<\u0010004\n x(``Hpjd&.\u0018\u0012\u001cO\u000b\u0006\u0002\u001c\u0014\u0007\u0016\u000e~ٺ̛hUb\u0005cY0:}5NvqY\u0006_\u0019\u0000#\u0011a \u0001\"!x\u0011\u000b\u000b#i\u001c\u001cHw2mF,0\u0012\n0h\u001eJ\u0002yPP8\u001c8\u0015\u0000\"B1C\u0003X0$4x`<\u0016ǩM`L:\u0005\u0005\u0001\u00045Ni*G\fDADa;`(\u0000CI*\u0002Q`AxDbAq@L@P\u0000$@4C(p0A\u0000jP±\u0016H\"\fj\u0011ݭm\u0017{m}BkW1\u001d\u0002os뮬p\u0017x;vmk}>\u000bZ;,[0ljL\u0011Uljw{3\u001abUf\nSW\u0011OkjJlT6\u0016-UcK_YmjЂ1Qڭmd_=kmO\r+/\"Z_6.'=>a׋kegS9\u001d\u001d\u001db$\u0000bߙ?w[ׯ*{btU-궮\u000eQVN;n\u000b\u001dNmܘYz~ty}Zܛ\bS4j,o\"Z\u0017\u0018#\u0016~\u0018\u0018\u001cD\u001aH\u0002A104\u0013\u0016@,\u0000` j[UO!\u0001T,JVńi\b88}n5u\f8`eif\u0014yM}ϻ͚4&\u0016Fq6xRMJGz\"#x}\u0016+7Uqsoe\u001f󕙴\u000b!Z-rgauZ*\u0016*Ohmqo7nTs^xI\r>:\u0017FwrWeⶪ?0ZgmKihh\u001aBw!\u0006Sݜ'jm.^]\\F_P@\u001a\fC\u001a\rԈXX0\u001a\u0013\u0011\u000b\u0011\u000bg\u0011\u000b8es\u001e⹃e5/\u000e4qs-Se\u0004\\>'~A=ho4=6FMkǪ\u0001X\u001ehX\u0010z\u0005cyY\u001a2ꝸNva)&6>\u001e\u001dM>4\u0002\u0004\u0001zJVDH=(\u000edUyGH2Oc\u0015[I\u00108\u0016JLQ\f\u0018Ԝ6R\u0011QC,^l)1JFوAdtmQql\u001f3x\u0005np\u0015\u0011H\u001atT9LvU\u000bz\u0011\u0006巒C~t$\f\u000bjZ\u0015tga\u0010Բũ|\u0013\u0007q$hD(@[\u0016Lt03rd\u0015Q'\"4F\u00123.\u001d\f\"rHa\u0014Qs\\b\u0013X4Hh7\bQpDF\u0014s auhRW{t^ŊQ=8k=.5Ty.nC9@ђ\u001e|\u001f2\u001e\u001eSB\u001ceUַpZR䔵ݹU=ṵO3_ߗ>~\u0016W f\u001bY1p3ef.Lw׷\\0\u0016Ӭ׻\u0011\u001bw\u000f\u000f50Y\u001d3v=_\u0011I\u0010\u001c\n\u0014\u0005g\t\u000fWg A=ʇ\u0017Ƃx2a\u0013\u00162zDtA\b\u0005q\u0017\f\u0004OxVIf\u0015\u0005HlNz\u000eYk7='o?m4'w\u0004֟*֝L\u0019\u000f8³2T{0]޽C[KE4Lii]>-<z__m_oyU-jڷM,cK U[vs_I\u000b\u0013ʭZ\\\u000bƲ`,v*^%\u001f\u000bbU?[y\"|M>\"'^w{U+\u0001۱6\u0016Ont1\u001dM\u001bM}?\f4NN{k3]\u0002i004\u0010ᳮ\u000fLeG˲c{[Y\u0000 n_\u0011UOOS]o֭]\u0019\u0002\u000f\bl:v|z8-wyk\u0017U*)'ltk˒L+ϩx2<nZ2ƄuSFN3\u001f-kl1O\u00136.n=O;eۯKS\u0015_w6W\u000eZl\tߪ5^ږrAZ\u0016WYoj񥱵Us\u0016%\u001bdݶZTtSnrUjT_J\u000fnkțl֫}tm݆jܕ\u001e顷\u001d\u0019S>0\u0011^ǈof[0\u0016N=VLDsu2Yi[j\u001a2gZ/{\u000fQ-̺S5-U.{aee\u001a\u001bo_a\u001dq&f.NRNέk\u001a&=)Xu;\\zereޥpkJzn2ck'jC>w\u001f9\u0019\u0016V'Es%<i]Ye\u0007D,D,-p0F=?N+\u001eB=cP8\u0005\\˗\u0010̴:+e\u001e\u0000B\u0003\u0003\u0010`4a%i3Cymd@5/Y0M&YliI\u0012\u0005\u0014$\u0014,ȡ \u0007RD%\u0000\u001c\u0012\u0000\u0000(\\ D\"iA\u000f\u0014\u0002n<&$\u001c\u0016\u001a$\u001e\u0016\u0010\u001a> Q@\u001c\n0\b\u0000\f\fC$Ji\rTD`U{\u0018\u0003#\n&C]mN\u001b!幡x|ވ~\n\u0016\\\u00014NT3eA_C~|Qʓ;Qڋ\u000f\r~$\u001e«_e_\u0004\u001fR\u001eq0\u0011F\u0000eq*\u0001\u0003)P(\u0001\u0006\rs\u0014g6gC\u000b\u0018dӯ#ۊ\u0016\bۺMn\"6ۑE\n\u0019>m\u000bc?lʒl&v][\u0018%ޯ{\u001d\u0012t\u001b^zB+VFm12W絛\u0019<\u00113V22t|\\/uꛐ \u0012z@$\u00160O[}\ndw\u001fFyqDP{\"ĩKn\"@4Wh\"[7\r3uy[zZc\u0019_'iX\u001569ز#1>3\u0010y>b`gꥶ7I\u0006yV\u0003NT\u00001!pK`~?HD\u0012\"W;K^\tzky3< \u001ay\u001bЙ3?\u0019\u000bɨdTLZ\u001d=zRܟ\u0000_f;.娓N\u0017\"Ļ>8w9ÿU\u0007\u001b)\fHȰ\u00179Ի\u001ea1c>L^)ץ\u00162p,8\u0018j\u0005+tm[vt.&B\rw}=FˤF(\r\u0017@f96Gvכ\u0007\b[\u001cR\u0011_\u001f,`mڂSXk:\u001d\f˚G\u0007}fr4`7ʻ{y)\u001bSeW@褶wfGX\t\b{\u0014Z\u0010zۋ*\u0013aNi\u0013D\u000bBMZ\u0004Co\u0005\u001dW@ۻ/2dsJ$H\u000eYn.-T]5>uqe\u0016EfeZN\u000f܍\u000bϵwz)cnaRj\u0006aw\u001bx\t3k\u001cBd\u0006\u0017PQ\u0012a&+]|\u0018\u0013f_\u0014~W\u0017|\u0014(7@swQ?\u0014NJ\u0011K0P\u001cI\u0005^V\u0005.\u000e\u0013:<\u000ed\u0017\u0006&!oE%G]\r7թUޏu8\t~N\u001exz6QyZ`\u0012ΝKe\u001dVeNYNd/\bSRXp\u001a17/\u000e|S0/#\u0000oDN%/PZ\u0018X\u0003\r\u0004Xc}C\u001a\u0006TӵZ@t\u0012&l\u000b<\u0003{p\u000bM5\u000bVg\u0000\u000238\b@5x\u001d)\u000b\u0016\u000f# vDة^\u001bW\u0018ta\u0002p=#rH\r~<\u00041s̛\u0002\u0006\u0019E:r`k\u001b\u001e`!mp6rֺ}\u001254Db&7n\fNRM4B`gF1S%\u001a<\u0016\u001d\\\\ʟ2I`?Y^\\EO[xDnZJ5sQz\u0018H[ƛDZ3˹K1DF>\u0004F\u0016h1\u0018cnQ\u0005XcKn`Rc椹\u001aHK\u0014[ $OD]S\u001aH\u0017\u0013:K\u000f\u0017W\u001fuN)ܑd:9b'W\u001bcD\u000f/LLCZZtxKI\u0002-~.}g#WU*v4pV\u0003[$\u0017\u001fO\u001e)!\r+_R\u001b=ޤ{炌0Gȴԕ- F\u0002:&5#{M1\u0018h\r,6Q.VB+\u0014.$*EB8L;NasL74\u0017\u0018;.g_%;\u0006ю]f-\u0019\u001fʔ|\u001a\u0003n\tC<8.Rb\u001em\u0002ε6|XiChxX\u0015Q''EjK\rhp!\u0015RyJ\u0000\f*S`)a8O(6\b?\u0017Ϸ\\\u0015\u0003/EW\u0016p\u0004%&}OČ%\u000eJ\u0014\u001e[\u001f\b! 4~чƑlϗRP@6\b}ݗ\u0004^Fl.i\u0016zqs\u0005/q\u0013z\u000b^d.\u0004Fξǚ\u0006l1I\u0010\u0000i(\u0004y\n\u000f2CNJ7w686j[)r\n\u0018=c\u0018e\u001890AuZ9ˉ[?Z}a=\u001d.mkL{C2\t\u0012(^\fsX\t\u00041cL?΂?\"\u001b\u000e\u001b-(.\u0016kƈ\u0004D\r-\u001b2j#eEBGO{3-=\u0013omaY< 4)6ADUI\u0012䍴kH\u001eX\u001c`\\t4AzdcD]Q\u0004d9\\6m_%X/I,\"J\f\u0010e%>m\u0014KEF\u0000\u0002O$kZ@\u001bvX$ΐ\u001br\u0015{wͯS_\u0011%nx.\u001b(^z򂋆t[zCRE\b\u0001biw\u0018\t\u0019G`zwC\u000b׏\u0007f\u0000\u000bG$II\u0010L\u0001h)\u0006\n?Lo\u001aA)P\rkU&;\r\u0001\u0010݊i\u0017\tU\f2\u001an\u000b.u\\F\"K\\B1p\u001d])婧b>!m$\u0013,\u0004\u0010zC$[:I($T9'\u0018:=jE\u0002h6{̔[m\u0001\rW\u0004\u0019$E)L\u0006)\u0018D@\u000ezE\u0013߽\u001e\u0004\u001d)\u0011\fR\u0016\u0002ߥMt\u00001_\u0011\u0011.\u001c\\\u0010yb0H7a8OE8\b\u0013(^M1\f\u00189:Z\u0006Q}\u001f+\byǻ\u000e\u001dR\fYrZ~`jO\u0012_\u0003\u0013y=h\u0005\u0015\u00073ס\u001ei^\nu4\u000e\\Ue\u0011\u0012'Y\u0004rG\u001dъ\"\u001a]Q\u000e6ժv8jV\u0004u0%G;'Vh\u001b#\b\u001e ѮL\u0011ʃ\"b\u0016I^z2\u00165h\"6|0nr\u001cl\u0019\tZ#\u0018g9PbƲ\u0013{I}ao\u0016Y5X\"2!FĪ\fGo\u000e\u0006~ıY*\u0015Lx'\u0001l)\tG-$l#^2@嘸-e\u001d%J\u0011\u0012ʜ\f\u0012``SMx}_\u001f\\I\tw)Հ8f+ghg_wLa'\u0002\u0018\u0018,Y\u0005\n)7f+e\u0010dH\u001b&\u0012l\u0019Et=u\u0017ЁT\u0000V\u00170jX\u0016$.'.e3r:\f\u0007J\u001f9^\u00006ƅ\u001aL\bP&\u000eO-]\u0010j{Mg\u0005m\u0016ݕuy{Y\u000fCaw_z}e\f䍨:.z6\u001c\u001a\u0018WR\u0014RFvPh6Ap8UVw\u000e&j̰h}\u001e(D\u0004\u0019\rh*ѽ\u000byBUZ#d\u0005\tWFﲻl\u0012\b\u0005\b\u001ca\u00006dfb\u0010[\u0001ђA1ETq\u0018\u0007\u0017WU\u0001QL8)9\u0017w>1,,X\u0013@\b\\\u0003_H`\n\u0000,<j\u0005\u0013#H}\u0019@\u0005U\u0012DAcH\u001b,\u001fw\u0017ާ\n;\u001bx<wm88oP+V\u0001\u001fAEod\n\u0001tQj\u001a1!\u0013q\u0010\u0007`\u001a\u0016j3L\u0015ԣp7Nx-?ܷ7\u000fFR\u0004,mY74k:\u0006 50&0\u0019hӇD\u0010\u00175M85Ӕ6+F&ɬa+\u000bPS'r\t\u0003\\'\u0016\u0018q`]R`\u0014P\u000eV\u001d~\u001d7`\u0011c[a\u000e2\u0004\u000eQ\u001d+#UuQa\nn\u001eڰb\u0013?ˋDha)\u0012\\B%\u001eR\"zK\"*(9sE\tX}\u001e\u0004\tZ8=\n|D\u0006쯚>(^k\u0011[Ȇ\u0010o,q6b\u0018LIxjM\u0014r\u000fQC,Z7Al\r'\\\u001d8!\u000bgi\u0002&k̇*\u0016`sgHЉmwM6J\u0000V5\u0014\u001f)܂A\u001d\u0012d/le\u0002\u0014/3VfG\u001dN@Tݼ\u0001\u001c\u0013\r\u0000%l4e,W\u000b^JqJ&-kp\u0010p~X\f<QJFBp\u0001֑&{Vo\u0006\u0017\u0017o\u0003*|n!0h-\n6D%_\u001b\u001e\u0012S$M}G_\u000f\b{\\z\u0001+\u00032p33G_${`:QG\u0006G\"H\u00148;PF\u000eztzIl4F}nȄ\u0010ˠQ@sBk}ɉ֊lE6\u0013D\u0004\ro\\%Y\txA\u0010\u0002FЕs?!c3'k#؞rv\u00130dyo\u000b^D\t1GP\u0005>\u0001\u0019Jon1p\u0002Uvյ\u0018䯰J\nw\u001a\blp\u0013\f\u000b\u0017JOfS\u000bz5\u0007O耏Az\\LZQ-\u0000EԨ,\u0001&)/۾甿S\u0015Tt\u0016\u001a.em4oWSFo@.@Yl%Õ[xM\r!\u0000hǛÂMO\u0004ݿ2+c8шқ\u000bsyWt&ǯ\f\u000bc\u0019f\rAPY.}B\u001aF\u00185\u0011օ>,c\\!\u0001޻\u0013mTC\u0005C\u0012MD5љR\u001c\u0002c0./13z\t])%QXjYe;0;&x1\u0016\n}(\u0011\u0013\u0006{TFVcqԈDݢ0dC\u001aEVr*\u0006؆>W+u'^K@,3њ3'qA\u000biQ=\u0000\u0005eʽ\fDY\t\u001bĈeN3F\u0015\fH<x\nj\u0002a\u0003Wt&\u001dBk\u00011!\u0014\u0007\u0016@\u0012Ɇ.\"u|1mRq($42=F=A4\u0014_O7S;\r\u0001*x>\u0002mZcB-<T\u0005\u0010\u0012\u0013Hh\u001dx1\u000fH\r8\\]\u0015\u000bP\u0001\u000e\u0018)1\u001c@E0gM\u0011{?G`]l,x%\u0007/xRSR@A\r\u0015C\f\u0016\u00075؜2s\u000bP}\u0015oW\t\u0007\u0006`\u001bMXꩌDY3m\u0003\u001d0\u0001'\u0004^R@\"~S\u0013\u001d\u001aRh,;Rχ8\u0006.\u001d+8\u001dI\u001a^-Z<y\u001awKW.mʳ|~k#\u0004\u0012@r^6j$Ō0V&\r\f;u:)\u0011Wk\nre7\u001ci\u000eT\u0000kb\u0003\u0016Y&9\u0011ԶC8n\u001dQ\u0000`ȅ\u000b\u0004(\u000e\u0000\rxJ䱖+r)#Yr%NM/\u000b\u0006d\b\u001e\u0015\u00073\u0004l$k@_ZZR\u000f!8g2\u0002*h谿hNy_^\u001cW:Cm'[k\u001b|G=\u0011g\nWKEovHo'P7\b\u0014H\u0005jp*=\\\u001cE\u0005\u0018(\u0005!؀Q\bK2,'ǣ[\u000e:qNW~(Ǭm6T6dO.JCg%\u0001E,ߠc@\u0012\b,p;PZF\u00036\u000f\u000fZ(\u001arV\nF=E\u0007ۚ(\u0014o/@D\u0001_x\u0010Oн}\u001ecⱠ\u0006\u0012@߽\u0012V\\s]jvJKř|-8T\u0006s6.Xε_\"L,\u0015r15]e\r+\u0019\u0017\u0013<όW\u0011?\t\u0001#\u000f#\u0001\u0002n\u001bk-DTUD@\u000fO8I*\u001c\t\u00179\u001ck9ʄI&3$\r\u001cϷ\u0002\r;\u00118b\u0002yZSd|\u0007@c\u0005hi\u001c1bToD<\u001f0\u0016*3ǘ\u000b f\u0005Ƥ\bM\u0004t̉bv\n{\\,A&:,2S=\u000b=h&qk\u0012ʈ2U*\u0005\u000f3\u001d%--ZN\u0004f0\u001d;kLp^(h\u0017B~\u0016I3bڽܙ\fyY\n\u001b>\u0002ANg\u0012\u001a܊!I0\u00145-}~u\u0012+ʾL\u000b\u00141}-Ei\nH\u0016I\u001ahwi\u001e4V[\b\u0012\u0013\u000f\u0005\u0001*Yt쟘VͤjV.`\u0013wwCZF\u000081/yzS*\u000b\"\u0005\fAAF*(9ަj\u001d9\u0019V\r\"|mll}O\".V21<v_OVkv0\u0018I\u0007\\:\u0007ْJӍ߿'vib5@\u0001a-\b܅\u0011=5G\u0017=ӱ\t\u00107\u0001pF7$\n\u0018%D\u0011\\lmD\u0007\u0000e0`OC\u0011tp\u0011Ȋв\u0016\u0014\f\fK5;\u0004\u001c\u0006\u000fIϐ/+u \\\u0001I6\"J\u0000\u001ah~U\u0018\\6kT\u0016T\u0001p\u0012+a\u0017'JˎA\u000b\u000b%(TvbɛT\u0010x\u0019Az=Tx沤\u0004ޔ\u000bHZhluv\r\u000b\u0013i(BE,6\r*ŀ\u00143H7;O߳YAK5\u0019Ʉӊ\u0001\f`\u0017MH@,tՙE\u001a\u001a@Rw\u001f'~#%\u001e4i<%c6n\u0003J\n\u0002$?L\u0015ciS}~\u001awa\u0018\u000f\u0005\u0016\u0007;?z޸4\u0011\u001c\u0014x\u0004\bG\u0003f\u000f%J\u001bD$\u00002\ryv7V&@\u0012ᘜ;ĿS\u0011T\\ШSJP\u001a\fj\u0004l\u0000`Pl\u0003:h\u001d\u0019p\u0015fc_OJ3}k\u0003dP3/\u0004fJ\t*,`6\u001d\u001f7\u0013\u000b\u0011\u0003y&k\u00043#X/3#m-Yڽl$R)N(!^5=\u001aZ5?ʮ\t8\u0004Wc+gC\u001cb)\u0001K\u0007=e5kJkn\tް|Fy)@Uc?\u001cb:6wBX\u001d7\u0012\u0000\u000f=0ev5g1#F0]92o\u0003@n\t%`O\u001d\u0000#E9\u001e\u000bb04 \u000ej\u0011\u0001F1jȈ\u001c\u0012\ntQ\u001e1P| n2$ɖ[<\u0011H\u0004\u0000\u0000X%\u0002\u0000\b\u000b\u0004\"\u0004\u0003\u000f\u0016\u0013\u0007\u0001\u0004ǘ\u0002%r [v~>\u0001A\u000f\u0002e\"r6\u001e\u001cj\u0001\u0004=\u0010sDRC55\u0014\n\u0000\u0002\u0005R a\u001d@nS\u0017\u000f\u0015MY\u0015@apP\rCƤ\"\u001e\u0006\nKaEO\u0000A.\n\u000fGQ,\u0016L,\u0004L0,\u0005<\u0012\u000e (\u001eH\u0011\u0003\n\u0007\u0010P\u000e\u0014Tq\u0019cRe\fw]vڭ\u0003\b\u0018[K06\u0000\u00041וP.\u0010ƌ-[vKA-[\n\u000b\u0013\u000e HY\tP\u001c\fqX!U\u000eJ(\u0017!MUdMN4x&C2&\u000f4\u001aqq*2\"\u0015arX\n\u000e$<$2\u0006a)`L.EV\r\u0004a\b5\u001b\u0013*˲[U\u0003Ap\u0001\u0004ª,+B\u0002C&\\4Q`5\u0016kۮT=Ev,\rFA\u0004HCTՔ9Gvc\u0019Mcalcw[^Se綧g;|WOיv;Eni/\u001f3>Ung:Îl7N=\u0000rlgk>;g֑ɝowhgϬ\u00001o\u0019w7k~;\u0018\u0019><c{۪`*[a\u001fr\u001bb_![2\u001b\u001fӸhǋGq2&\u000eFâ(g2D.߷1\\\u0017_~+o3\b8?V[T~]c?_[v^ڍjީX~m\u0014W'\u000ei2O\r{\u00159Q[Ѹ\u001d\u0019\u0019DU7c\u0018U\u001d\u001c\fʪ{w\u0019{nar|LN<?W>\u0000\u00024,up]s\u0019v,L7z\u0007Mf\u0011oajk@\u0002nn\u001dwz\u001a~2`\u000e\u001d8TOl]^4E{?a\u0015\u001aO01ϐ}\u0018̽Du\u001c@񜌶lκʿhxʟyko^\u001b[OWsћ{\t^r^Z6:\u0000ߓ_ݘ6>T^~wȤ\u001a\u001e@0tU[mgzw\u000eϳLlu{F\u001d\u0017\u0001c%^^\u001ew\u001d@0YuCFItKtu3{~/HH \u001a\u0017\"*\u0012\u0016\u0018?rg\u00193f/0,先eى}}16;cgS}!bj1;\u001b*6cz\u000b\f+?q\"\u0012͘1Glg1\rm{a}B}oW74o|f̳]EgVNmUtDwu_E}SVVkd7u]v>we\fT[\u0012\u001d.D,FVVEL]}V\u0017\":\u001aj6j3zn̪ݬhvhj{\u000b\u0011+\u0016*\u0012YPY=?53MM=QS-[o\u001d9\u001cS\u00167MZ:[|63qY\u001aqu]\u001977t̳FW4t\u0007Ǆuw1{s\u0015Wul]U\u001f\u0000\u000bu\u0017\b\"a^gfwzm>a\u001b\u001e\u0019*\u00044Y\u0013\u0003\b$\u0014˩*\u0007j((уx p\rKSq\u001c\u0016d~\u001fޭ2}\u001f@P\u0011i0@Af\u0018Â.\u0010!QQ\u0001\u0000Y\u000e\u000f\u0015͸ں͸o\u001f\r5/\r\u001c\u001e*\u00100, \t\u001e*(\u001c\n&.\n\u0007ȃ\u0002\b\u0005\u0003>p5j˧x\f$\"\"\u0001\u000f\u0015\u0011@fA\u0018\u001cu\u000b+u9<,\u0010y8Y\u0006r\u0002H\u0006QhXe!\u0014XPXT4 `C]dp@\u0010\u001e6\"\u0011_`i\u0002\u0004\u0006\u0018X\u00141y,X\u0002&\u000fP\u0000?E?c`\u0003\b$\fgߝjjy֮\tȀpf\"R\u0003\fP75[q_N\u0019D~ڵ\u001273fD[״Kng7SQQ]\u0013\u000e_3\u0000\u0015\u000b\u0014H2\bfG56^̵cfD[KK|EDD?|;=ϳ5<TLfNG\u001e-\u0019\u0016=V$EiȌZ[7n:'_r?3E,h\u0006\u0006`\u0005D\u0014V$Em{Uǁ.4\u000e#c04@y`PCa\u001b\u001a\u0003zP`=T,X B\u0002z<T<C\u0002\u000b\u0005\u001aܩuޥ6GH\"PX\tT\u0013RyHp\u0007\"z..\u0010J4̭\u0005\u0010\u0006\u000b\u0004\u0004DF\u001aPXqE\u001a\u0001Oj6AAO$99GsC¯\u000e\u001f:\f)Ɂ.\u0015ڋa3Ϙ\u0004\u001425\u001e\u0004FS=DQ!Y@NEŃL@O\u0013I4.\u0018\u0016\u0007E\u0013\u000f\njr\"4UŁhHU%I\u0012\u001d\u0007a@=P\u000f*iH\u0015u8\u0000l\u0014`\u0000M88E\np\u0013{$\t\u0004 \u0007\b(@M͆\u0003*\n@BD\u001cH<SQ5r4\u0001\u0002\u0014\u0000$8@\u001d \u0000j\u001cޛW\u0013W\u0013\u000fuU$`\u0001\u0007@l}~|{|~i߶inBeFVt\u0004@\u0014L\tȊ$X\u0015\u0013\u0010\t(NE\u0002EjV55y͹ݭǽ\u0003U\tʁ..\u0003\"@\r\u0003\bom=\u0010UmTc\u0004Gue=ŵtCOw_G^O^<t5Swoƌ}2\u000f7בlmYOs}Α5\u0013xuٔ~\u001bT\u000f3\u000e\u001c}S\u0019N?UnOcm=]OELXʏm|Ƚީiɨ1[=⧾\u001a~ܗ*\u001chr_??o:/Z/3|Ȍmʭىfgx~蜏vkص\u001b|ư)-g\u001a\u0012ֵ:='9\u001ac˷]Uͱ\u001aS\u0018_ם2\r\rUw\u001b\u00138\u0018ÅKn7c_4T>mN=F\u0005\u0006\u0012\u000e X}j2\u0017\"Vޣ_/>/{9-\u00193\u001ac멜}f|yv}oǘ♧\"]3yb/s7i>c.\u00055Suq\u0014$,cDEOO^ֻ\\]`X~\u000b\fK\u000f\u0017\u0016*\u0012vaa3nmw\u001c3绦!7g/kYv&󷛸|ȴ=-~\"6ynff9':s>n?\u001aY2r\u001e\u001a\u001e}Z5\u0002rD3vUUv5\\>_}ϻ3\u0004)\u001acʹpm#ڿ\"k?z;2\u0001\u0004]uR$%P$\u000fѐ@̌IzPM\u000f\rip4\tc\"ERJ\u0015IP\"!cj\u0012LsP1؅SaDN,\u001eH<ӄr\u001c\u0014eDE=\u0015i9eAM\u0010I,Y\u0018\u000b\u001ebiVu\"4jL\u001aȲjQ\u001c'Z\u0017)$-\u0002<+z\u000bgEҊ\u001aȲ.R\u0004\u0016,\u0006!j\u0016,\u0007z*+jEl4Ԋ\u001c\u0007Z35ˡ\u001c\f\u000bU\u0006DM\u0015A\u0007z,\u0016-(\u001cjL\u0016\u001808\r*x*qp\u0000@'h\u0010=\u001c\u001e@fIL\u0016\u0015i<8px\u0005$T\u0003Y\u0019D\u001eN2\u0019\f11pjfiyǜ1̙%\u001e\u00159\u0014\u0006\u0019L\u001e\u0014-T1wx7A\nj\u0018\nc\\\"Vb,#z2\u0007j,\u000e.gCJ\u0010E\u001e4\u0003=\u0018\r,M\u0014D10PXѳh}Eò<P\u0003%j\u0007XU(@4\u001cAXnr.\u001a,\u0003U\u0014C&Ldc4l8\u0003U\u001c\n2q.\u001aHr(Djb*\u0015\u0007z*Ԁd&j,FH\u0018@Ł\u001e0I\u0018\u00070ib\u0012JE2FиH\u000e\u000eua*\u0015)DL\u000b@&g#&\u0005BP\fe&\u0002a,\u0010&\f`T\u0012Ab,grX\u0011$DOqHhTQ$R\u0003\u0011&eBAOP\u0003I\u001eh2.\u001e\tCY\u000b'&lr(\r\u0006P\u0016J\u0001\u0014\u0013\r\"\t\fX\u0014j%q\u001a,&,\\(*N\u0015=\u00063Y,\u0013,\u0005\u0004M('\u001aPH\"iP\u0016\u000b\"1\u0016\b\u0017PF4`4&Q0Didh\\X0\u00182M\"xlJ$!\f蹨$'\u001cjr6\tɹh,\u0010$M\u0018Ԁcc=UX\u0011WQ\r* A9\t&\"p\\PD0X\u0000\bE\u0004M$3q&\u0012 RE0L\u000e\u0003RuyD0D0D\u0012D\u0004R`x\u0006r*QEEx*Kę*ƑPU\u001cHC4.\n*\b\u0002Z\u0000ANÝE\"kU!5PDHbȡ<fpL,r&\u0012Y\u001dI\u0013'*jX/0Љ!8\u0004AN\u0003_zSAx*\u000e\u0017\u0006p +B@\u0000\"z^AM\u000fDŁD\u0003IZ\u0000'I 1\u001b\rS5\u0015\u000e%D4\u0010\u001aqXE \u0002!H\u0018\u0004Ƀ\u001cH\u0013\u0005őh<h\\\u00148\u0017Qp\u0016ۉ\u001a8\u0010y$=\u0017δ 8EC,\u0003Mnr\u00053Y&gCZd,;S5\u0016\r\u0001ʑxdPCQ\u000f\u00074\nqHX\n\\%Y\"@\u0014\tL\u000e\u0005CƤap2\u0004\u0018\u0017OEEUq p*\u001cL\u0017h(<\u0002\u0007gX\u000e\u0012\u000b\u0016jz@h\u0014@DP\u000e\u0012SE\u0012\u0013ɡj\u0016HR\"YPT@D\"V59\rX@4]\"eL(Zgh,TLzGuT\tK\u0007,j z\u0016:*bPN\u0012LV@\u001eʃ193QX.\u0016b9\u0017\"j k;Cɱ4\u0012լx0*\u000e8\u0010TTSX\u0012\u000fBA\u0001\u00073\bS\u0014EAcA\u0000\u0011\u0000\u0000\u00184\u0014\b28H\u00129\u0003\u0014\u0000\u0004m\\(P..(&\u0012\u0005Bh(\u0014 (\b  \u0006 T\u001d.2E|Șu)K!j9hO\u001eDY\u0017}8\u001cmމf?Ϙa\fO\u0014\u0011Q\u0019!@R/#<A(@wmi/>0)'\u0000EZR\u001cǁA[\u0005ϧ\u0005\u0004\u001e\u001b\u0013~b\u0003}K\u0011:Z^SF\u001f\u0000re&m\u0018r<=!\\\u0011O\u001fDuOD\")EՓ\u001e\u0010\u001c4\u0007\u001fMD!][;2\u0003<eeR2)ex#,㶝bխ:C͗Z\u0018y99bSݫi\u0001AE쟂-hpjuD7k%\u0017\u000b\"ſ8T7uTE\u0003>\u0006Zoݨz덮$!U\nZa`\u0015w\"ho\u0005&`ab5\u0000%% C[\u0003\u0005쇬;C\u0019P\fb\bwn5]xLɤvD{I-$\u0012\n{6+{FThMޢ\f\u00117xh$O/lɃEC\u0000[\f\u001blk\reU?8*g4\u001e\u0018Y\\\u001e-J\fG|l\t\n5]wA\u001df8{=[XgK酩X\bG#'\u0007\u001a\r\u0014h#JROI&\u0000:]`n\u0010s\u0001\f\tFHǈ(Si\u0002($*\u000f^;m?,M\u0006HL\u0011\\6D\u001cލd\u001e\u001bh\nz/\u001d\u0004\fGv` r;\\U0H\u0018&#VeYTvqAY\u001d%NRc\u0004a\u001e2$ķ\u0000<PY\u0011ԙWicJnS\bZl.D?G\u0000K\n2zYT\bgE*\u0015m/LZ8͍NO\u001e1Ĺ\u0017\u001b,6T\u000eAqiyT\u001f\u000fSS]\\b]~k:sa\u001c1+N]HS \u0019*ǝju\"\u000e(3oC\u0001\u0006>y-\u0005|ī\u001d:\u000f\u0012\bcJVX\u0012\u00069Ф~^އr\u001e\t?9\u0011R\u00142Ȃ%y\rZ\u000bN\u001c0\u001bF#VFnDc@߬\tPV\\`\u000bj\u0015s\u0019\b\t/4z\t2\u001cd\r\b{`56VU4*\u001cZ2\u0015\u00075\u0002\u0015P\u00192\u001e\u0000iO!uQ\u0019\f}\u0007bk\u001fXg3V^s\u0001tk_Qm\nɷտۯ\u0007K.\u0018Ɖ  &A6\u0000dbY\u0014\u000eRy\u000eHsy; \u00017\u001aZT\rk\u00067Q\u0007\u0017M\tlMJ3\u000bkX{\u0017C2\u000fԚxNbf\u0011\u0003I`x\u0010\u0011hG\u0014\u0018\u0005A,\u00128fΨ\u001fph9RZ\u0005a\u0011;\u000f\u0004\u00199ƃ#5Ih@2\u000f1㞵\u0007i,hrl<4,\u0010nL\u001e\\8Hбsy4\u00185\u0019yEDMiQ CFe\u001fK\u001d\\:lYy\u0000.\u0016\u0002EZ5\"1\f0yC6\u0019T,\u0005AN@ƽ7urӠSi؋]\u0004s\u0005Lʙ\u0007\u0006s.\u0013(}mE\u0004MƤq\fHWDl2^D\u0013T\u0013-z~\u0006w\u001b%\u001e5,io|\u001dU~Z4d)Z9\u001ep|=\u0002n<TfJe\u0002\u000f<h\u000e\u0010=&\u0000k\u0002\u001fp jSNŗ5@L9\n:ղ诹}\n\u0013{rm$S+[G\u0005/07xb\n#Q4(^hmC\u0010Ll3n\u001eS1^T\u0017\u0012;jp]NRǵ\u001dLyCclyW\u0011Y:R\\_\b\u001cN\u00176\tGf\u000ePF\u000b<z0˗]\u000f\u001e\u0019\"w*?ueӃtZź\\@\u001bɽ@\u0001\u001a\u001c\u0018ы\u0003ϹC˧?s21d_hf \u0003\u001atĂ\"=6VsH8s*t\u001aX\u0017l w&\u0011P\rmxwTrX!gL\u001dn\u001d\r\u0019ݒ\u001ej\f-aڰV\u0005dn\\_OQ*JۜJǁ0>v\u0014iN[~(R\u0011C&$Ѕ\u00048nv\u0002&$ pTq7/*\u001bc͊c,\u0003\u001bڤҡMJ=庣m\nlz5\u0007\u0013V5#\u001f~\u0013ʣ0\u000bz,{\u00058\u0002MK\u001f\u0013\u001eAڋ%4j\u0016\u0005#.ǿ)eqSlW \b \nW5~\\\u0007Jr\r#wM4\u0016\\\u0000m\u001f\u0012z\n*YH0$3i1\u001e\u0005/W\u0011$<DkIX\u0014\u0003վT[N)r.\u001362\u001bUC\u0018%=O^R5~;Ii\u001b1U{*=\u0006\u0006\u000343myY9@,T)S$\r:[5I\u0012\u0007I\"6yyf+خgM6\u0013!5dly\u0004\rzuOc\u0015\u000b&\u0019j\u001dFO\u0001\u000f`\blC\n58T\"h\u0015c/\f\u0017\u001d\nb\u001a9\u0011t\u0001Qz\u0011w}2lľS\u0005\u0015L@\u0011;q !*(h\u000e5*lD\u0000>K\"~x\t<\u001d)'3h\t\u0010+\np\\l\u0017\u001d\nN_\u0000Nfn׷\t\u001că[:q3ȱ>ں55GGd0o\nKn\r\u00180?\bq$9d0\b\u001dbJϸz\u0005\u001eZ\r\u001f{|C\u0010]є8\u0015#\u0014\u0005c\u0015$~(*w\u0006(d\u0010~(2hb\n䑍\t-\u0002\u0004\u000e/iL\u0018O1omK/DN\u0001R!\u0014?_l\n6N35+fa&\u001e]Hn.+F5,^ٵ\u001em-p\u0013pW\u0013\u0006Xߛ\u0006\u0012Y{1gP\u000fa<(LI\u0016?r\u0011M$_Q4?\u000f}N&\u0015i\btm\u0016+L+wSZf3Bw(uj\u0012J\u001b\u0013%-)\u0006Y\u000f%BMdD?8//?5U`1iH)\u00108U8Qd\u0018OdS\u0018\u00007\u0013X]%\u00072n5ڍn4((qU8'\u001dXz^7mM+޼3\u001bE$m71\u001egaL?F|ʑI(\u0005v\u0010N34(\u0017'\u0011W /\u000eׁy\u00197D8v!z[E\u00038wBPC]s\u001fC5F\u0006%E\r\u000fdN\tvh?{͉\tOg-/cib֨@-v\f]n\u0002\u0017wΡJ\u001b'U^12m%\\!\u0012`W[$ЄpЩgR\u000f\t\u0003])&5gyya\u0019ZH/\u0014\u0005Vjk\f\u000e@ه\u0011\f71(\u000fa\u0014\u0010V\u0000oA} )#m\u0006S]$ȫ\u000bP@3+\u0007\u00140m])4\u00057|{TQ4d=\u001ed;\u0014+I\u0004X\u0012\u0004\u0013\u0012\u0012k\u0015WEL\b\u001b\u001dc\rxTb[҆ބnƹ\u0004_x\u001boGgl\u000e\u001b-\u0004줰5C\u0006nvw.EYPsgq{\r-v)pM񲼤\f\t\u0016)vf6'|\u001dOH\u0004`}Ȇ\f\u0012ֱ#x(xe:pu\u0007(\u0006\u0007ڪs\u0005\u0004|a@r\u001c\u0001@\n+`\u0011\u0014\u0001ZfO\u0003&d׫&$2$.~;\u0005vEY>|\u001d!4E(q-\u001d\u0004H}8\b:s\u0018vl\u0018Wtۤ+\\0kGq\u001ee7-\u0005gd@\u0018(\b\u0019v5(H\fPi;znό\u0011\u0011\u0007\nH\u001f`Wf̞8`f/r}x1\u0018!\bN:\u0019\u0001H٣vX\tS\u0014\u0006\u0010Z\u0019[)Q\fDFe\u001cRI]W.\tw-|a^\u0007>Ğ\u0007P^cR\u0016\u0010/\u001f1fl\u0011\u001c`w0&ҡH\u001a\u0013\u0014\u0016O\u00168[C\u001ay\u001cSY\u000e\\WJ/m|\u0017\u0010+\n\f,m6\biQ\u001b͘୩}8H|f]fI\u001dɼ`e$\t모{Cb\u0012LW/X\u0007\u0016J\f+\u0004\u001a,1\u001cK'qI\u00183\u0015_Vf\\ʫVR?{d\u001d\rU](S6&4\u0003\u0012ҕ+^̽Wne*4`\u001eCc\u0019qQR!ƥzPb\\#\u0004CN\u0006z\u001f\\_cD\u0013\u0007*2U)\u0018k5\u0005A\u0019U\u0014\"vJ>CϝU\bq\u001cjk\u0004\u0019S&22\u001e\n\u0013/BIX\u001e@\\xPNZ\f\"^\u0013c4&<xy>\u001be\u001e\u0016\u001d#^j\tx̍\u0001\u0017H6 =?\u0011ā0\u0006i\u001ebQP 8B2Ff_c\f\u001azf<\fphת0c\u001b!\u0018\u0011(3\u0003?O,s܄||L[q}?S\r\u0011G[C\u0000)\u0000  \u0017+\u0002oŶ,6v\u0006'\u000eJy\u0014\u0013Ze1@ku\u00029d\u0018RH~Q\u0018F=T#\u0001\u0019{&璱\u0004>$]}?+\u001eG0UVYп\t]jV\u0005\u001a\"0;F{\u0003S̫c\u0014xȈ\u000f[p\u0019Հ1r\u001bid(\u0003\u000f\nУ\u0011\u0011\u001b]Ao#R\u0004Ɯ\u0016\u0019jJ\u0005̆Ecz|,ϘA.H^1 \tb\u001a\u0001W&\t:\u001d}PjntSf\fYMʊ_(B1Լ\fa\fJ2o\r\u0015\">m\u0015@O5P;\u0012ivhu-\u0014i\u001d\n\u0019!HGߊsNZ\u0001\rog\u0017\u001e\u0007$[\u0011\u00107H\u0017\u0000Uz)P\u00061\u0015'\"`!f)^\u000fsћ`[)\u0016\f\u001e\u001e1r\u0012\"?\u0007qê뜾b\b.\u0001CL\"]N4\u000f\u0018\u0019ޜ\r\u0012\u001a\u0005\u0017.X>\u001a\u000bJ%dэ~@p\u001blĮivYr/nص\u001e޵/W2GAwꠗ\u00190){^\u0015y_rp\u001f3\u0016#Xs\r\u0007\u0004\n+\u0013\u000e8rr`\r>@0BQ?`Z\u001e\\UWʣu☕O /<\u0006E\u000eL\b®XE^wA\u001e\u0000\u0011MZ\u0013&jјX\u000131n\u0006!$-C8#D\u001f9\u000fi&\u0011\u0017hD3\u0006suܗ5Vh$5[H\u001cpb}H;b=P=cA\u001aq?9\u001f\u0012\u000eY4\u0017\u000by\u0000N~&-\b)\u0016~+JI]ϼN7\u0002Di:-%%\n[PV\u0010އSNbk$K惈Rd\u0011I4\u0012\\,]+\u0013\u0013[$h\u0013Tfɭ&\u0012$]&\u00078X.\u001al/Tt\u0006U:1P>p\u00125D\u0011/'Ȑ+#HZ;㩗$\u0013*3_XZZKvS#e/\u00057ʎ\u0014\u0016\u001b%%Wj\"\u0017gi'o4ʌ\u001de\u0013MI\nf4\u0012aKp(\u0001~\\\u001b֯i!C5(\u000b2\u0010fB#MŌٙa\u0010F| h)5zD\"K~-Av!r1j'UE\u0017?\u0011\u001fAc\u001b͖\u001d_u\u001c!P^_| y\u0016\u0000/e3|M7ouD\"\u0014VӑM~d[Z\u00183/m~.DY%\u0007%_ˢj1\u0016ł\u0015+s`\b}()8\u001e-\u0005\u001az,!,6\tp,a:\u0017\u0013\u000fJqSMB\u0013\u0002GLK\u00060\rMn̩I\nY\u0018\"D@e\f_\u001c:t0^1G~,%a0\u0003a_XlHW)\u000bMHJ\u000b1\\a\u0012K}wH,8,㕫<W[P!e:\u000bkKm\u0006[BY*\u0017w\u0003 \u0003ع \u0006R+\u0003_[\u0010MD\u0006mcQ2D\u0005Q9|k1G\u0001($'Ո)QW0=HJɔPbR\u0006qe\u001db0^Z<+)~/\u0018\u0004d\u0019YfJ7TDX6]\u000fP\u0014 )Aڽ7\u0004aū֡A\u0016|/!\u0016\u0003H&\u0016j߅\b\u001e7\u0013\b@R\u0006Ӊef#]\u001foZm3s={\nZ27Ǌi)q\u0004a#q!X\toi|ѡ{+\u0006NYTx\u0006\r\n*V\u0007PI$z\u0012PV\u001c/!!SЈjeEQs\u0010\u0002\u0004[AL\u001aҵpf\u0002?2\u0005kyP\u00010{MV\\C_ahN\b\u00116,?iT2͛ce#ŭ4j.ӟq~Owh=B|q8\u0001n\u0015i΁4iTL\"`3,\"1\u0005UFH0Ȋ0%g\u001d+0\u000fBw\u0012rÞ[\u0019BnE3xC˥m+\"z!JwrN+J#K\u001f~}ʊV<u#vZ\t3\u0004Z+J;Azpr⤎\u000e\t5Oq3\u000f3D\t9_i\beK\u0015lɓU\u0002\u0013B$ISRB\u0017,WAe\u001aAO\u001a`)\u0007`6XL\u0007\t+\u0017f\u0016[8\u0003\u0005DYnK<X! b{Ŋ\u000eE\u0000M\u0002dTdLD\u001e6w\u0011W7π\u0018\u001e\u000et\u0010A{2ϸq}kX\u0006P\u0014K\\\u0018\u0018:\u0003\\)q q!jM&7\u001aQ\b\u001e\u0015ڰF6OP\u001c_$~҇<?\u0003ɲ5.\u001a\u0002)p\u0017T\u0005kJ\u0003hɺ\u0006\t\u0004'؁\u000b\u0010mc\r\u0001Tf`\u0006N\u001atm\u0007\u0011d\u0003GY;aźyuMg\u001dj\u001fy,p*\u0004*\u001a&1+CـI\fX\u0002E[+\u001a\u001c;)CY*!-5\fC\rّP\u001d8z)Yb}W\tK!\u0006\u0002\u0003@M\u001bL7B穛@rI\u0001\u0016Stt`A\u0006\u0002;ރ\u0013i W\u0004\u001a\u001aS0n\u0019KY\t$чx\u0004\u001b`=\u001fE)A\u0011t8[Pv})D\u000f\u00149޼Ɖ,z(\b|?VI\\\u001d㐉\u0019{pV\u000e2`-¨\u001b\u0004Mh¿9\u0007qpTJ2/!\u001f|\u00059\u0000iJڷ\u0006\u0012\u0012tZ2mV*$Q\u000bq\u001di9ni%e@bfe8(Of\u0013:\\\u0004fy\u0002#=[C}٭U/Z\u001c\u0018,ItE\\\u0007\u0012\u001c~\u0011,\u001c/\u000f7p]y'X́ʑZv5\u000fkhJWC,\u0000\u001aV\u0018;L԰OhPzYS\\\u0003+\u0010L/A\u0018\u0013c]E\u0015\u0012v\u00000\u0017r3/#0<6\u001eŋ\u001a\u00172\u001dnd{qZ\b%\u0004\"rnUzQp\u001c\fY*ٓ6\u0010(A=1(܂@Ű\u0004\bw6\u0019܈}q\u0006Q\u0004V`k124[wfN\u0013V\"JY/S,E=\n\u0013\u0011\u00128Vbm\"G={s94c\"Qq8\bP9Sׇ8]Fl=!K\u0003K[,6Gb]*0j2t[\u00101{{Y޽N\bQ}H`~NL$2*L\"\u000fJL\u0016^'p\u000e╒չ,qfHc\u001b;إ\u0016\n%\u001a3˩@N29p%ʂ\\x\u0019aW'EZu$O`Te^Z)Kdoiw/D\u0007PQ7\u0006:6Cǰ\u000foկ\rzj概UZ\u001d^*׶+}(\u0010j(\u0003\u0012Z\u0015p]\u0006U\u0014Iﳄ]\u0002@\u0019`\"0a΀\u0018\u0014NT\rTʗ;26h\u001f۔\u0010\f\u0011\u0015#s\n?ntY?{\u0006C\u0014R#4])HJ~M\u0002\u001a͠\u0000\u001d8\rn;?21\u0002_9/)Ҭ\u0014\u001d\rpu-IHM\u0010^t!\u0004AWPe-|Зf:Y\u001ay҆fZ >ׇ\u0014la#\u001c]I\"RvnuT\u0017N\"?xg~W\\x-\u00022ca1\u0016|KoZnw\u001ff\u0001\u000f\u00036@4A(8\u0019\u001di}s[[\u00140ϪN\u00108\\\u0019߃\u0011@V<_7\u0004\u001f\u00184Lu\u0018kR98k@6\u0019~\r4\u001blzBл&\u001e\u0003\u0000t+L|'OO`LF\r5\tÀ70\u001c.y)\u0017\u0005]z\u001e=սR@'\u0016\u0012P&;#6bjot\u001851\u0014s7\u0010l-4\u0002\u0013\u0015\u0018\u0010\u0018uFU0'\u0000-a\u001a\u001bp\u00037*\u0007G\u001b\n3ry\u0016\u0000\u000fOs.NiSz\u0006\u0010\\W\bm\"ΦKVD(: +g\u0004+\u0015|\b{k\u0005Vg֛\u000fb/NX~S\"4\fy8ܟ??&PS\u0010\u0000z'V=W\u001d\nv8P5[b4lֆGZU\u000fP8os(6<&\u0004bP^/\u0007ET\u0017@`ї\u001d\u0010(7PRȈ\r\u0013\"\u0001T\u0005|⮨}9;X\f\b\u0006ק^-\u0010j8\u0011- b?1\u0002D<)q\u0016a[\u00011|j*<}̢'\u001f\u000e+a\u001fG\u001cisHvJ_x7\"+\u0012)%$\u0010\u0019#F-\u000bu<V\"\u0011DQ\u001c#y3n3j\u001f^r/Q~R\u0007E'!\u001dYGuwrvX\u0011+N\bn\"\t\u0002|\u000e \u0003t+{\u0019\u000bnjk\u0000O\u0014~yq\"d!-uvԜ)j\t\u0001K'^\u000e_&Pi\u0010\u0011<\u0018ȯ\u0011xOI\u0001 \u0011&э_sNAgG\u0014xZ\u0007x\u001bė\"\u000e_f8\u0017BVM0B\u0003Dx#\u0001 N]#%|+L\u0005R\u0006&!\u001f\u0010\u0003w\u001d\"?\u0007Y9Ce4V%q\u0017\u0016MP\u0007\u0002.\u0001\u0004\u001bLpذq#]\u0002\\\u0002k\u001b|e]AX2i\u0016?3x+\u0019l\u001b\u0012\u0014\u0001<:\u0014XgFE\u0011\u0000!F\u001c\u0004\u0003\u0011\f\t;j5,\u001cA#~Z[\u0006`\u0003\t\u001fγ\u0005\u0013@\u0000|zN.JrP\u0004|ouaȂ\u0019U-+嗮\nP$h_sor-\u0001\u000fL\u001cY\f\u000b\u0014m5\"\u001f;AG\u0011\u0004؆\u0016P\u000e[ϭ.\u001f9n\u0001ɡg\"\\,I##>$XZlT\u0018ݨ!\t\u0001s6>+r\u0018\u0004\u0004-ڂ\"t\u0016(\fH/WX\\(DoB,9cI3zV\u0016'i\u0006\"\u0014i-+܆+N$W9Jޛ],O\t*\u00115\u0003Cim\u0016Ҁix\u0007$vj=\f\u0013}Q]7尚\\gr/ǆǁNJ\u001c\u001fVzX$\u0004DQ\u0012Z^A{v\u0001#4 {\u000f/\u000b\u000b`Fd\u000e͖\u001e3*(\u0015\u000f8\u0006~E.=qt[#{^\u001eU\u001fM8\r\nG5n\u0014ܸ<E\u0001+\u0016\b\u0006\u0005Ϋ xb/\"q0x\u0013h\u0001yRZʩN!ѭ\u0001Qs1\u0012\u0005\byL)?x\u0019;z,vm\u0019:d\u0016\u000e!Ǹ\u001d.\u0006j>08+\u0012V sYҌS2ɴk\u0014\u0006\t\u000e-\u001aƬmWR2\\,hFe\u0007I\u0007K(\u000f]\u0006v\u00130۲\u000e\u0000y\u0012䝬$\u0018Bݛ+_<zE\fhtOr`\u001fk`dZO\u0003UAi\u000b=\b\u0000\u0012!\u001e\u0007N=죅\u0011X\u0002\u0012?\u000fc\u000fsQ\u0007y48p(p\u000e<\u0019R\u0015\u001c7\u000bC:\u00014A>\u001d\u001fn`./JL\r\r\u0017ZkZ\u0004G{\u0006`>\u0011j$\u0003!Oc`V4Kfi>\u001c\u001e\u001fRYշ\u000b\u0003\u0017\u001b\u0016O\u0013O\u0018e\u0011ebD1.᳇\u0012[\u000fN@itN8s<6b\u0016ZU@ZU\u000eY!ŉ\u0005sLf^/+({\u0003\u0003)\t`dd\u0019شE6o\u00075@f<\u0003Wm|7\u0010}\u0003kG\rh>u*\u001f\"ٞ\u0011\u0003\u001e\u0002憼8\u0004W>\u0007|\u001b:6\u0002wlw)G|MK@QO,b#dPߚ\u0016g_^QXaEl~|*|\u0018unc\u0013s%T{k\u0002iڼ[U1|qN,C\u0010\u001c_\u001b]2ߴO%Kc;u{x5t\u001d \fh\u0004{1`V\u000fF(\u0000\u0011\u001fiT\\Z\n\u0018(B$\b:E<Rt++l \u0011p^L\u001df$\u0016)^~J\u000b{xh*#չRN\t\r\u001a`ΏRN143lA\u0013f9\u000er0Q\u0014\u0019a,0\u0004C\u0000\t\u000f\u001fncn\u000bQ;\t\f\u0003<SqCW^(Oǰ\u0018|\u001aDs6:DRFќ/DN\u001d-`E2\u000e!\u0006r3ӎ\u0014\u000e\bL+\u001cpœll\u0010D\u0014I\u0015o \u001a\u0013]߮W1Yh\u000fec!|6_\u001dʢ4{\"<2I\u0018\u0019B_m.5y]3I!\u0019-f#,PRv\u0002\u000b$eoހe*KR!|M#Kl(\u0015hpoAM-\tT;$V\b\bh jvua\u000f\nv&}wGJ2\u0015ڀ{u>)l)@pg\u00034Tg\u001fx\ne[72jT\u0015p,Q'\u0012m]\u001b+0\u001ct{ EmWML#\u0004^*a,\u0010<}9HL8Tٽr\u000f\u001b\u0006uRӈk-W\u0000B=\u000eYd \"K5`\"i͘Kӕ؈%C¸9\r\u0000y1\u0001\u0004$V)\u0018V\u0003\u0019$\u0016\u001bȤJ\u0016QD.kbsR\u0000Y\u0015f\u001cKqJhGsNc5cU7ǻ+\u0003z\b*r:2on{C\\(ױtҕ\u001cb##=\u000em@43ewȎd\u0000V:gj\u0004%\bIy/\u0013`p~z1Y\u0005v\u0002QI\u001aft\u0018\u0015-;RLVtւ&հ\u001fnNb\u0004ӣ\u0004.{R/S\u0016E\u0013\fPQ\nP\tH\u001e\u0015\f\u0005o\u0000|ÛD$4}<\u001a\u0015\u0005E$iޚV\rn\u000f#Näަ܃yļk\u0019IIr\u001aЄ\u0007­+O\u0004|\rOjen\u00044\u0004yJ^2r\bQñMƑXc\u0016\u0012͇=\u001cR2\u001b}u]\u0018Td욆e\u0002+\u001b\n<i{9ӊR`e0ĥenb0{<De5o\u0015MM'Q ;/חQ=q*\u0013/\u001eA/\u0013x\u000b?Ey\u0019\u0019%B*9\u0012\"M'\u0013CZu*$2\u001c8A\\y\u0017\f\u0012\\X)T\u0000Dd\"}A.\u0007LfG $lhdVqL'ȷ5;Z|Z\u001a}>\u0019Ƣ\u0018=\u0003g\u0002\u000e$\u0000\u0000\u000f\u0012\b\u0004\u0002\u0001\u0014\u0007ՄPN)\r\u001bZ(\u0011\u0000\"\u0000\u0000\u0002#\u000e\r\r>\u0002O_Bݏ @\u0012Eq\u0002E\\n\u00061\u0017m|߈5u@)\u0018<+SN6_\u0003\u0014-)\rH\u0001iS3lljHgyg^U(\u001eZ;\u0011\ta\u0015L\u0007A0_a\u0017VQtK:Rs~KyJfmǰֈa(\u000b_8ZEZ*\u0012lw֥l\u001eMԆzM\u0011aUm`Xa\u0015-\"ON\u001d\u001e*\u0000^e\u0006IՐ@Z\u0014o\r\to'X\u0018|\u001bɄq\u0019\u001fU\u0014\u0011N\u0012\u001dAQyH\\ \u00000\u0002\u001f\"kP{\u0000URĠ\u0010?s\u0007!O\"\u0000,\ns]KV\u001eZ0\u00109a\u0007P\u0002+Be\fF<YL\"xkw\u0019\bLǧ\u001ea\u0016\u0007!\nl!7(J8żmR\u001c1\u0001k9v.yץjڈ\u0016z?\fz0\u0010\\\u0006BolM(\u001aR!yWL\u001avQj\u0014߮\u001aA\u001a\n\u0006\u001cP\u0011\t5tK@KyJ-1,F\u0016\u0018%B\fc-\r\u0012J)\u001ei:U\u001dN\u0007;M)\u0010k\u000bϋKbCmgCmoE\"\u001bj{+:xZz!\u0019r\u0005y\u0016Ĳ,\u0015I\"Z\fv\u0013g\u0005aF\u00039\u0004\u001cAa\u0011cP\r=\u001d\u0001\"\u000f\u0014\b\n\u000fo5\u000f\u0000\n4\u0013f`\tIFq\b\nr\u0007u;x\u0012\u0004? [\u001b<\u001a\u001f$\u000b\t\u000b;r1$rhk5rj<m\u0007N\u0003׊6#7\u000e\\\u0017\u0010j9) S}c\t\u001esms%5k\u0005\u0017zk|\u001e'\nz!{ټnĚu\u0003z\u0019\u0012bMq\u0004ة:W&M\u00041t:AOqqS|yf57PF\t\b!7\u001dPmdWy5ENþiWW҄߂yM\u00110\u001bJ|\u001dP|DB\u0011\to#R7([\u0018\u0016{Zoq?cI?cX<6k\u0014~\u001dsU\u0000\u0003N\u0005 Ju6mO[ό3\u001eVզxc\u0014\u0018\u000b\r{O)L}Oop'uI3 klFO+jPg=xZQ;zfk\u001e΂\u0010]@\u0010\u0003C%\r{XCӰ\u0007W!y|wⰘ4;V \u0001@9&\u00196;\u0018FA\bq]@@P\u001bAUuTlWw\u0003Ij+ry9.%{jr{E\u001eS\u0014\u000f\"w\u0010\u0002\u0013Kș`0{d99\u001ce\\4\u001a\u001b\bi4r\u0018f8\u0017vC\u0012r\u0003.S0-\nk;.\u0014-*1xO\b\u000eO_;12\u0006)n#w\u0011GE$bMXSWQ}t6\u0010_\u0015_]@P\u001bkF_i\u0003A\f~E|A\u0001i\u001e\u00104\u000fHB\u0019zMN&\u000fH]|\u0007n\u0019R#͐3ϻ逛Φ\u0013\t}\u0019R<\u0019RSG/j\u0014V/$G\u001av=ta_FqKBm^M\u0007$Ӱ{L'y\u001bf\u0003\u0018~ \rH(\u000ek*|4Z\u001a\b4\r]@9K)Ij4'g)O\fh/\rSu=%4USIZoq?e\u0014cZ,~0o0(\u000b0NY\"\u0002i\u0014#:w\u0001Rncs@h\"]@@\u0001^X\u001d[#a\u001ejӶQGm]@\u0011#Y(|X\u0005J\u0014ၫzL\u0011Uzi3?_\f)6fDB. x\t\u0005\u0017\u000b\u00107>OoJ\u0010jG\u000f\u001b\n\u000ek\f\u0017-a\u0010k:|\u0014-kך\u0012\u0016]7\u00107F\u0014Z|iֻ.\u000656\u0014Gk*v\u00015͆I?\u001b9\u001a[\u0007\u000783=D\u0005E8xdI?v\u0013jm\u00031F\fAϸ#\rgS<\u0002\u0002\u0018\u0016mR.\\f\u0019Gi\u0004\u0016]@i\u000b\tcךhy\u0000\u00166\u000ehW4o4TLej\u0017\u0010pJ\u0010:2x2bKL\u0004]3v4sff\r❸z!n)z%<b\u0017\u0010T@9pt\u0001A9\u0004c\u0005&m2a<\n%{\u001e\u000ejO\"tS\b\u0004\u0005xNj\u0005L\u001b<^C^u\u00120bY\bwj\u001cA\u0005\u00044ifQ:¢f\\OIȸG\u0017șbr\n\u0007Jia \r;X6a~\u0000qZցln1\rz4\u0004'|Lb\u00194EQu5!嶍\"\u001e,Ό\u001al\u001b\u0019O\f$}Gew\u0001\u0001Gvd_.lNG^\\h,rMjJgʑ^A\u0013_z\u0019\u0013i\u0019| ֳdDt|(\u001c&K๴\u000fN\u001f{Ҝ^\u0018x\\\u0017\u0010x2\u00143u\u001d3tXLSL\u0005~g\u0015[\u000b\b\n\u000bQGCJ6v\\\"\u0002\u0018&.iAODMfH՚\u0007\fd\u001aP\u001c)JIgLM\u001fϧ\u0006\u0011iŠ/gʢ\u000b\b:UQ<3\f\u0005A@P[E#(<6\ra\u0005\u0004Li`R1\"xF\u00060\u0003a)Ol5\u0017P)HZAOO\u0012qE\u001e$T\f`R\\ \u0010q\u0007535um\u001eQA\u0010)\u0011\u0014ix\u0005\u00045\b5ƴ\fi.ßi!Ip\u0017\u00104Zn5Zx{\b@aak<j]@\u0010;DFѠfU\u0007pF(Q'ӊ(\u0001\u0001\u0001\u0016Ѩ5gVrrx\u0017\u0010Plw\u00193\u0003u5ݗ\u0007]@I6-і\u0015F\u00153l>\u0003t\u0001\u0001\n\f\u0011\u001f@cPop`Jqt\u0001eRk%-\b\bgΊܓkAPt\u0001\u0001\u0003l᝸?.\n\u0019\n\u001ep]\u00160;xΑ`y\u0016\u001fʐwǗ<u:\r\bp9.\u001dLx\u001eO~pE!ʰ\u0002\u0004WK\u0017\u0010\\P+B\u001d=B\u0017\u000b}z](H˨3U@m4\u001bH`\\%\u0002}\u0007b\u0012-TԎZ-a3g<. Ȍ=w\\.$j5\bX\u0015\b. @%LCH܁?\u0010Zz#0:, \u0011Z=j. ^\tK!O\n\"(Rk\t\u0001Pպ_/i-\u0007x\u0019sǽxc\u001fy@m@b;q%\u0013e]@a\u0012GO\u001dZ-\u0017\u001aG\u0014\u0017hc\u001f}\u001b@U\u0005%$8re\u0012w\u0003\b/4~o}yC\"%\u0014Z\t\u0006O]@*\r3\raW#/cb2\u0002s$\rR\u000f\u0006E<Hn\u0010Bv. @p\u001e0ì\u001b\u00124ƴ\u00049O{,R3=\u001c{aBݯkyc.\u000b\u0006\u000b%l9]@`fCb\u001fv=\u0015pjWeNgOFLM\u0012pZP\toysȻ\u001ca7\u000b\b24FNJ${m\u001d\"a\u0002*hAJ\u0015bRS$u\u0001A\t\u000brL^Jx\u0003}E\u0002V(\u0019aYi5\u0018\f#?+e\u0002\u0002X\u001a$:\u000b\u0005y)ӪVжjj+j\u0004. 0iʙ@w\u0019zP\u0003$\u0007Paټ\u0015,5ۀ3͡g\u0003|h\u001f&#\\M5\u000fQ\u0000/-\u0004\u0005\\9\u000b\bXwⰘ4-\u0012R\f\u0014U!%\"\u0012Ng\u000bTw*\u001c0Yo%Mi\u000fގ1@+QϮ\u0002f׳Dm+J@*R\bE.\t87=<Œ \u0017\u0002z\u001b)VeHYVgq]ڜ&M;L(dD\"+&\u0001\u00006\u00002GRc\u0001V\u0004\u0000劑fܫP5`(\u001bΨ\u001bu\u0001\r\u0006I!沕/F*jeEX)-:E\u0005qVA?O8G['\u000f\u0016)^$\u000eu\u0001wx\u0006<\tS\u0002L\rz6З\u0007`Fq`{V\u001a\tszۈPZRb#\b\u001fFPa,dm\u0011z<\u001fW\u000bk\b\u0019oWXr'ֿ.w7hhC>a\u00174@n\u0014ߌP\u0016zҸ\n+SDނTp`o3/N_\u0018dNثRxs\u0002\u0002YG3\u00193u\u000fȳ\u0002+_X[/X@]l3D_ʈD=O\b=HØh8~9ÖUJ91lޜC\u0010I3\u0017TW\b\n\u001a\u001f\u0016=+\r8^.\\(n`G=\u0019\\<\\\u0017\u0010\u0002\fTN\u0014\u0014K\u0016\u0015X\u0005\u0004qǜlw&*C?&||j\u0005\u0005YrbB~}He\u0017Il6\u0012\u0016\t/5:vC\r\u0005z\f#Ѧ2v\u001b~o\u000bd\u0017J\u001c\r\u001a+acSD\u0002+*\u0000zNG^\b\n. 2\"\u0002wUJ}OxD&[U\u0005WiL\u0014I\u001a/L`\u0001\u0005kIL\b&\u0003ٚ73\u001b)˥)|\u0001⩿ԊCq9\r\b\t\r\\\u0017U\u0011Q>r:\u0019\u0016\u001dF58$\u001cӰ-6tކ\t]ҬדN\u001eQi>!4\u001fewVP\t{lx/2\\E9]撲T\u0015֮<8}V )֫;N%9/\u000e\u000b\u0012:|X;\u001d0{థ\u0015j㢼\u0006W諾\u0004\u0002\"L?뚓[w\u0006͞԰\u0007,V\ttj'}\u001dڂG\u000b\bP\u0007x3\u0013Pwy;\fQ\u0006.{2\u0004\u0010\u0018\fd~\u000e\u00134SR\"_\u000by)gBDEЁvp\u0014\u000eݍ\r^(\u0000ܜ\u001e1!\u001f$)\u001eDy\u0002\u0002\u0018;(!Mq\fc_C(\u0005*5Ǣh\u0007}e'0\u0003R\u000f\u0017\u0005\r&'yM\u001116b<\u0000G氘\tqz\u0014\u001a\t!\u001b\"BrsVo\u000b\b\u001e\t!nh*MxW\u001a\u0016vxAQ{\u001c*hay~9L^\u0014G$$4ՙkz^SNJm! t\u00198Rv\u0001Am[{\u0011\u0004D8\u00189*zYq#d JHSL\u0014%<\u000b1\u0002#\t#jVIjzn֋Dw\u00013H\"삆8ښ\u0014)~4\u000e\\\u0005a\u0012\u0003\u001d\u0018l\u0010亀 sy\u0013bȆ*0'f}U\u0019ϧw/\rwLj\u001dR\u001e@lb(M?~p:T=\u0005v*<r\u001fu\u0001\u0001RѾ]r`%\u001c3󆽍\u0006]96m\u001d|_i\u000eex\b\u001b\b=-s~%Y\u0011\u0012(\u0014=}/\u0017\u000b\u0014p-Bz\t\u001593܌ΐ\u000bL\u0014aM>}9\nG!%\u0004d6\u001b\u0004. @po\tU\u0006SN(\u0002\u0005\u001aN[mq6HZT\u001dk\f\u00184pgj\u0011\u001f\u001a6e\\?r\b{CsՀ\u0019J6D/\u001fSfmDc!\u000bt\u0004}8)\u001e\u001ea>&Oo]@/\f\u000b>3Ŧn\u000138ءy\u0017\u0010|\u0014\u000b;r\u0013׏%dT\u0019T8a\u001cikL\u0005\u00047T@O_l\u001d\u000fh,Z\"\u000fy>>\u001euڰ\u001c\u0017uzePx5؀p\u0002>\u0010LFc8zؠؖdYi\rc@Kټ\u0010\u0001\u0005^\u0012n'\u001f/Iqp ]V{\nPSL@g<Vj<ZnT7\u0007uQą\u001c<|i\u0016\u0004\u0016f|<,(tp8U\u001f\u0010N5҂rIlop\u001b\r\u0001. \u0018\u0019u]!gCD\u0000ivW|HST$J(>a?lV6Y(ܻS|\u001e-J/\u000b\b\n\u001b@c\u000eO%D@P<\"d\fEܰp=&6)\u001fHq#L\u000br\u0016U@$`\u001c\u0014p\nJFvϜv\u0001A\u0017{hD!]<vYx%:\u0003]}\u0001{\u00149474E\u0012c17_5\nbz.CC\u0007\u00188ӉG\u000eu\u0019lLV#9F\u000b\b@K_4sX\u001b\r\nӬ)NU\u0017:3iy_s*prsj@Y\u001d\u0013(\nAw<\\\u0018*Տ^^&\u0015\u0017\u0014V`Ե%4\u0011\u001f\u000eTd\u001fI{+XPb\u0012?nyKD\u0007Z\u001aW\u0017\u0010R\u0001h\"KRuFC]@ ˻?ۮyH\u001f5[ѣz\fbjR\u0013чu\u00024&PY\r1R9-#b)*2UȍFƁc;y\u000ePeN\u00137\u001eΑ\u0006|.\u0003'-QEH{IgaѠ\u001d蚱#\"\u001f\u000b\bd\u0005\u0004\u001b6 O+,*a\u0006\u0005\u0004#r\u0014\rr\u000e\u0010%m\u0017a;#d\u0002;Qݓh\u0017\u0010dn\t\u0011Kz1J!\u001b\u001dc\"n[F+[9\u001cTy\"\u0013?dK\u0010V!\u0010p\u0011\t\u000bZ-i\u0017\u0010Ġ\u0007q\u001eDi4j_\u0011\\V\u0013\n\u0015\u001b@O\ti\"Cy\u0018u\u0010@\u00184RT\u0013.%\u001a\na\u0014\u001cKEd2vlNvN4H##H[2ؿѤDa\fi\nwZƆ\"B\u0007B\u0016\u0019-\u001e5\u0016l\fЈ\u0011\u0019\u0014;̫0i\"\u0006M*\u001f\t`)D0uhE>h\r]:ȁu\u0001`\u0012\u001a9\u0013ј\u0007N\u000b\t\u0019a\u0017e˩\n:Ps\u001a`Oђ/^꧘\u0011xGM+*\u0002HS$7zF7<8l\u0016\u000e\u0013\fݍLl&\u000eGv\u0001?um\u000fo\"\tѱm 0^*U\u0014(B9\u0018:L{\t\b\u001cω|\\i%ks\u000erqm~\u0012O*m.E;9\u0018KwJoMi$09)AlޠL-a\u0002ϐȘ}gS͠\f2\u001a\u0016F\f6؀\u001b<Km\u0019b{6{(LAӲgs\u0018;q@Ü !M0\u001fT\u0006k\u0014~Ha5G2\rT6gȾN0J\u0010VQne\u0011Zi\u000f\u0012hn~k\u0001\u001e\fuT\u001fމ#\"h\\_Q\by7u4E#j\u0010ssG_\u000e.̆\u0004\u0000\u001e!SGT\u001dp@i\u0017%\f\r\u001dL\u001b\b.\u0019\u0014\u0011\u0004\u001aU\u001d\u000b,j\u000f4>:Mb@\bndE\u0011#IkY\u0006K\u0019\rŻ\u0006$r!K/\u0016ȉ}*?=p\u000e)rt\u000eg\u001e;77 |\\g\u001c\u0019j\u0006T\u0005\u0002\u0002#<\u000bw(\u001cq\u001aZ\fH2(\u000e`\\1'/\u000em\b\u0005\u001bVb\u001a\tH\u0004C\u001b\n\bVcc7\rqc?`\u0017\u00108V\u0005މ\t(bhVЬ0B\u0019dLձ\u0004\u000eP*D)w\u0006p%fWʬr]#K\u0002\u0003l.N\u001bV\u0004ti4h[l\ni'TwrѷZ\u0017\u0010\u000f*QF\"ҙ^o\u001bAZyt(T:\u0017rO\u0006M5&0\u0005>\u000e\u0006l\u001fctmbVsBumZt/#D2(\u0005pP3~9p\r\"oxjUk\u0015Ɵ1|zQ*\u0005h\u0012ay̒H\\^\u001eZ-߭2\u0017+sq<\u0006ti\u000bVa7p\u0018\u001a\u00111\u001cFOmii9\u0014`:X|\u0006-sHF(\u0002 ur#>d\u0011*x!\u000e\u0014{)L}\u0002D\u00022uvJ\u0003^?Phr~T՘\u001dQ'9\u0000k\nwuT/mֱKT\u001e־D\u0010\u0004J\u001e~jJy\u0003j1Q\u001dHxϩ4<g]mYu\nv$QpA*G\u0002\u0002{?|ҼR{V\u001fo2$\u001e[\b*'г[\"&)\u001e\u0010G:.+l˧\u0019H0~W\u001cB\u0019\u001f\u0003zJ6\u0013@\u0003T5\u0019\u0010#\u0012koL\u001csf/I\u0004OQi\u000e\u0017S/^j~*+@&HU\u00109\r䄁$\u0014n_)\u0015\u0004'\\\u0019ƸUR=Er\u0002\u0018'\u0019j{\ri-&O2ָ\u001e)\u0010y\tW`SGd`#%*ySM\u0005!^\u001b(\u0013{P\u0011\u000b屈O\u0002M\u0013(/ä\u0004ZflBLʝO!NH\t%\u0007\u001d혬y/l\u001e@g/ej1_g>\u0015\u001c\u0001G4)z>殡\u0012k\u001ac/K\u0005zE\t\u0015'\u0017N\u0015^J/5b/F3\u0012^*1\u0018e,|ő[\u0007REBm<HU\bПVH`z\u0016\u0004qX)UA\u0012\f2Ϝ\u001d'z'\u0016𙤸Wb^/oEh'\bq\u001bJ/r\u0016¤Uw/0\ft\u0003ڑK\u001dڒɄG@N~c|\u001d#<\t\u0017\u0006Bx\u0006RJ(}*&lh-T\u0003#\r/\u0007W\u001b`\u0014[OEa\ri\fAo^$毈#mH[YV\u0016\u001e鏑m\fاG\u0010j.\u0016!\u000eP\u0004\fBq53\"8]VP0I\u001fPKYP8\\軀<lL}\u0000+!¾\u0012kG\nצ?C\u0016f\u0018%lwHFGA\nMV\u001br#(Qb;6\u001c\u0006\u0007x$9w\"g\u0013?\u000b,s?E\u0002r07<\r{җg\"\\x\u0004\u000bpt\u0001\u0001开\\*Z9ZP|P?w\tb,?a۳\u00162\r\fs؇\u0005\u0004N5\u0004p\u001a`\u00167P\u001eoEd\\ZY\u001c$\t\u0005]-rh9ȱ.S(\fEN\u0003V#F#bAo\\<N?UȧR%2\u0004\u0006:C|/\u0019呰*qu6wDl(+H~\u001fHoo?;ud\"}e#L\"ZVAOT\u0012v\u0001\u0001cspu\u000e:\u001b\u0010W0hϠ@w@ꤧ؆$u<\u0001mWb_\u0005\u001auD=2J\u0007\u000be'U\u0013'sI=\u0012wOr\rQWp\u001f\u0013\u0017\u0007\u0007\u0006I#lޓ\u0014]@@+yp\u000f\u001de\u0003%pai?\u00156\"MqDQP\b-'\u000eO1\u001fW|\u0000oQAS\f5[]CaNsya[:hp\u001eymyqh\u001f'|)\u00190{Q\u0012X\u0000p\u001afޏå30?\ti0\u001eڦ!V;dQ\u0013r3D\u0002kw\u000fESBqF\u0011Bn5.\u0014\u000eH}yƼWF{\u000e9$M\u0016]@\u0000\u0002ʢ\u001f\u00108r?52\u0018Pd)Kt4̼=Z{\u0002L\\(\u0005hJ\n0<AF4\u0012+\u001c\u00014tHr\u0013\u0014z_JT8E:\u0012_)ʪ.[T%\u001aYx\u0012\u0015G/%\bb%I׉V\"D\u0001\u001f~3.#t(N3m\"\beꘫrV\u0002hL\u0004ӭdR*J4TiV*\u0011\bSb\u001e\u0014SCyh%ssUVSTk\u0018U^S\u001eYc0y\u00065\u000f'GULыFPe%Ko(\u0014z;\u0017\u0011mހ\u0001L19\u0006L[\u0017\u0010~\r\u0014(\nec\u001d15\u0010\u0011\"0\u0001hM\fH=t)\u0015I{\u001f\u0018k\u001e,Gn5&kf\u0014?\u000f\u001do\u0004a\u000bj=\u001f\u001e2H\r\u0013ן0L^M\u0002R\\ hǜl\u0004Ivtu]t\u0001A\u0017\u0010@\u0002\nzin&d}Y\u0013\u0000z{*\u000e\\O\u0014ݡOM\u0018\fzU:6w\r[oʱI5 X)~N$\u001f0зdl=\n!Y\u001bLfn3vGB\u0006⊹{K\u001d[:\u001d]Oӵ%\t!\u000fc\u0015#giA_;لKpyp~\\,\r\u0015\u0012\nj<-\u0004Sֱ?:;\u000ep8lV!|\u0015\u0014_0EUR-&Z%J=r\biu쨦\u0012\u000e\u0007\u0005J\u0003ia\u0005[\u0002\u0001Ֆhؔhlƺ̤?1q\u0012u/*l#/>\bhNϦG۪\u000fڧMf-7\f\u0018s!wױ)Rc'?kU\u0007\u0002TN6_;r\u0012\u0002#QB\u0007,K`\u000b]z!Yۏ\u0005R`a5)q\u0006`\u0005IYgQm0 \u0003}U\tYIkMo =uIֆ@ƉQ'ךfr}`=\u0001AOkg\u001bʵ\u0011ow0\u001a\u0001=\u0016`PͽՈ>_kDݩ\u001e\u001c3\u0012\u00138\u000f\t1T\u0007\u0014%m@~N.F\u0011]vUa6_\u0019L\u0018K3#nZ\u0013\u0003FᎶ\np07,A\u001b)>:m>K\u0004+~T\u001ccޒUmIi3r\u001e\u001cL2\u001eeWKVOP)\u000bΣ\u001c1\u0005MG\u000b\u001a&!&=[dy\"۹E\n\rso\u0018.S#\u00123\u0016:a=\u000b'֯\t\u0002k;pa\u0017dJ\u0003RL@6\u001e޷!v\bc2ZVPX#z{@v\u001bGg\u000b.2Ez_Up/A\u000e.3tg\u0003K?EmߕҿӰ\nc}i.A?R$\u001a\u0015XR&,@^2X_?'9\nS:\"9\b[\u000f9iƾ\u0010\t=Lhҿ^T7\u0019\u001cL]g>\u0015b\u0004:{Tmxnl1w[\u000b;#\u00196OT@Iq҆Z\u0013\u00110oƮ\u0016N\u0007ag\"S=a,!9^ը>_2RUT\u0006\u000fa?\"K0{YS̄~z|OОU\u001fgI!\u001b\n.5/\u0003XwI\u0007֛$xɧ=]@~yt.1qh\u000fʹWKjS8\u001cf\r,8I\u000f*,~s]~.h&\f8\u0017wR.0d\u00199ڒǾ; ӒڨK8kS\u0015\f\u0014+7ז~\u001aB\u0011^h\u0007\u0013Y\u0016wBU&'\u0015:6\u0014i1װ,+\u0005z=1G/d'\u000e\u0017<L7+Z\u0005\u0004\t;qʁ\u0018\u001dVbJ\tu}{\t)]@'{\u001aꗴ!\u001a\u0011\u001aʬڦnJ/D2\u0007O\u0011sv\u000e[&AMKgX\bukjH%@\u0007\u0006\u0005%\u0006-\u0005\u0006\nw\u0003+hd#l$*. \u0017\u0016@\u0007\u000f+\r\u001aɪD9[SB7\u001cw\u001bT1Q+񢸪qLRɬ\u0000. 5UZd[Q@\u0005Lb__e\u0013>e\r[h\\4lPHiI\u0005~,\u0005\u0013\u0014IP\u0000֤\u0002W첻Dg\u0013\u000fA=B9iAC^DB%47-fJpKSw$%ȌU\u0006uO\u001c\u0004b\nm\tо\u000b\b&\"-wl\u0001=+8(5\u0006=IÜl뭺\u001b\u0019UE!|\u000b;̇\u000b=8\u001b\u0017]Pax?E#\u0005ƃ\u0007M{/7#ƼP\u001e1\u0018Y\u0011Sfڛjq?KUé!\u0019/jW2*'\u0010zZS),\u001dl\u0017k\u0007#x;qʷ$$W\u000f7)'\r>\f\u001ey\u0013(\u000bڤ\u001b_\r Ӱ\u001e)\u001c\u001fi\u0004g&*1^KXrgl]@-EZD\u001e#\u0007O\u0001c}Y;ТR]E}\u001a6LyTb\u0004}¡`\u0013U\u0005Y%V\u0007ע\u0014>#6z\u0010oZm)\f7}\u0019>LW\u0007lΥKЗ\n^$mX\u0017WAk^~'\u0010\t\u0002kWh\u0011\u0000b=o\u0002\u000b .\u0014wp8/a\u0018\u0007$y;Eh@\f`2EF!ziޞNַ\u000f2\\\u0015T\u001bfl#=p^ƦcCq~M\u0007ņ{\u0007I@OG\b\u0013\rP^0T\u0018Nv\u0012zX>\"\u000b\b:\u000e\u0011VL3~kHЏ2\u001e\u0011zs#C(ڗ\u0000\u001d+O$\u000fڣI^U\u001dX`@\u0016A{\u0007z\u0000R\u001e\u001a/\u0003\u001b\u0006w\u0013b \u0006\u000fl(\u000e~^~'p#)\u0016ӻu2;\"rm\u0000a5%&iEN3b`!4oJзvmjL挴@~!e\u0013\rJcL\u0018Ke\u000fN&D\bË6i/߄V\bV4\taB0<\u001b\u0012Ā 9GVB$i3\u0019Tb\u000eCLZ,W\u0003\u0005\u000eUTҰC;?EԜ!+`\u001f\u0002;q?\u0013\u001b\u0003\u0006>nwc?\u0018iN15lƃ\u0003<ڼA#~\u0017I\u0014pL\u0010&\u0013\u001d\u0018\u0007әM!\u0002}@M]\u000e`1\u001dOl~sڡ$,Iֶ\u0018ld/jRp\u001drݛFz(\u0019K%%\u0004JCh젨?P\u001ayAbW\u001dϑuD-yժ4\u0017JCxVm\\\u0002\u0011/%,,*|\u0007nؑ\u0004gB%X{U]s*\u0005\u0005Up&Ƙ8IU6y\u0014\u0017\u0019Z\u0007̾tF$ZS\u001a$vI={\u0019\u0015\u001b)z\u0004\u0006$c޸d&w'!+ږ\u000f1a4\u0016pO9l\u0019\u000fɄ[T8[\u001fX\u0018*zYjR|1J\u001c@=\u0015\u0000_\u001ag/\u000b1aoȯnu/&k7lvC3m['\u001dIޅ\u0003!\nk9iK⍴\u0013T\u0017\u0002|*v\u0002\u001fhcoϖlAQ\u0002zޱ\u0013\u0012\u0005GG\nb\u0004q 0g\u0018\u0005*Ji*Ռ\u0007\"\u001bPmQmv*0;!H\u00031\u001b[<h\u001f7EU\r+@7 \u000fk/\u001c4ר\u000fv4t=)\u0019\tY2\u0012}\u0015\\lރ=#\u001a`A=GA~(5Z1Qzm8ȑOc\u0005\tӂ\u000ezۉ\u0017+\u0018n'qf\\D\u0005<P55Lj`Ì\u001cF).I\u0018*i)BޘG\fa:?\"N\u0014[Cd' 5&_phOI☈|.M%0lGC;dA,\\E\u0018\"~\u0019\f\u0011lۓ~|>N#oH@\u0002\u0002ŃhЋHLz'\u001aZ\u0005F\u0012=O0UZ\u0014OFu@xLZ6K:8%ʖcߐl*H7wV$=,H2k2e1/H+7r+\u0005fc`-5S*2\u0019[-WG\u0016A(*\u0014lOT퓱^Nc\u0004*\u0012}ז^@XL!V;jַ\u0003[;Bp\u000fp7嗵gz!\u001a{\u0017\u0010l1P'}\u0012`^O\u001eo\u000f'\u001c\ba]sˬ-OA\u000by\u001e\u0012>!J\u000b\b\u001eԼ\u000fy`\u0015q8\f\u0015B3A\"}\\bi;u\u001f\u0011}\u001eMd=Ӟч\u001b%\u0011P);tc9{>p/?EQӷʱ\u0013\u001dQZamTX\\ꌝ:l\"Za\u001b\u0007td}5\u0005ҟb\t\u0016\u001d\u001az;Yo\u001eI?\u0004t`ێ'\u001cE\u001bF%MD\u0013\u001eg\bYZGuٜ\u000bcIK\u001a\u0006\u0013\u0010^,HD\u0015AC\fw\u0016\f3\u0019/\u00146p韉ݡG8\n\u001fNEq7Hz7RBT3\u0003~U%\u0007hWN\u0010[\u000b'շ\u0014B5g\"!􆙋\u0014\rC\n.3T6oJT+\u0017:\u001bR\u0014q!4r6De\u001e\u000fcM @ASK\b\u0007Lb\u0004ДɃ\u0000bh,^<`aSPG$\u0014$\u0014\u0002#l}|=\u0015O_M$*uY\f\u0016о~,-\u001cb'oy$i洕\u001a*h1'\u0010\u0001:{Q\u001eU\u0015P׬\u001ae@y@3vРaT7:ҔCA_\u000e2\u0004ps\u001alfՅv5Oc{ȏ#tNoddoY1p\u0017E]Iz\u0002\u0012z1uuڨ%ziMq9D\u0014o,Ce#D4EdsQ\u001d\rqZ\u001d\u0011\u000ewE/=ɾU<Sgy.k\u00131rU#<)\u0017\u00119=r7Zl\u001dcMrx\u0007D$?\\5BYa>I\u0017\u0010.D2F/\u0019Լ\u000b)$\nR.TC?Z\u000fsd.\fBM1G\u0006\u0012]\u000fs\u001d\r-EB |E\u0012dM?xQ\\]=@0\u000f.l Q^\\Ԓ.h耦IqZ(\u0017Eu\u001bYjʂ\\O5`-x13\u0005#\u001c\u0005\rE\\\u0012c!\f>s$a?\u000f;%\\m^\u00161Ib\u0007\rWCVQ\u001eh<NU+\u001e\u0016\u0014V\u001db9Ua:ؕ\u000b}9~l̋a4Z$VMlm#=pA\f\u001e\u0017S_<`#\u000eՋ3n)JC\u0011%9\u001ec\u0014\u0015\\eټEЃdB{(Q\r\u0001{\u0005\u0004ᅦ-7\fiRRg+\u0002ʋ\u0013\u001d2|\u00146cmI=N\\ՔX\u001bQV\u0007x\u0019>\u000fl]@#\u001fֳQE2oL2\u0001\u001d(|\fr\u0015@o3TVm'Gzߥ)~\u001ep\u0015\u001eTJЈ\u001c.QVX\u0017vda/\"Y (/1ގ\u001cF3\u0003+\u000f\u0012\u0016\u0006<ħ\nkҀ5\u0019\u0018\u0014+p:雙]%*uz@\u0018LC/:j#\u0005-w0(xо\u000e\rҿyF3/Ž}/a(_O(fg\u000b\u001c1f2\u0019K?\n%-Q.IA%̋C\u0001H\u0000C\u000fy)\u001f?83\u000e\u0014_Ah\b\bT\u000bш<DJ(nF>\u0004b\u0013\u000f\u000e*VG\u0014,Wt\u001a/cc3r<'X\u001atEL\u001d\u0015t\"VZ|:\u0010\u001etyO[E~\u0010\u001f<Bؚo\u000by\u0012ssA\u001bw. H|y#\"ƯLp\u0007Np.vn^\u0013_\u0007O\u001fփZv)\\\u0012@_{r\u0014'h;\f\u0005\rdUuYP~O4r\u0000u_FF&{6\u0014>m\b/R2\u0010\u0013DqA\u000e\u0010\u0007ѨdcH\u0013b 3334\u0001s\u0012H   \u0012IC\"g\u0002\u0014\u0000\u0003N6(P>^(.*\u0016K8,\f\u00041(\n\u0018db\f3\u0013\u0004t\u0007\u0005\b\u0002\u0014'y!(\u0017y\u0010:927lنэ'X,L0̙4\u001e{7r_\rc)\u0012'm!imETz\b\\\u0019TYO\u00140L51\\\u001d\u001e.|:<JKƮ\u0016\u0001\u0011H\")\u0001(\u001a\u00198S\u001a<\u0012b8jbB-<\u0019B\u0012\u0012f958\u0005C+\u001b(\u0014@7#W)u'rc4O\u0001>#Jv;\u0001Ej\b\u00013rT0&6q2I?A\b\u0018P3V⧱HӐPL*@F\u0002$\u0001`kv؎x=?Nt&s4g6ǁy\u001b\t$%r(ݫU\u0011X_\u0001r!G;*$p0\n:\u001c\u0018\u001bP6\u0003>ثE\u001c2ѴY\u001ee$ͧhǴ2Hdf?'QTt\u0002QS\u00184#ud\u0016tp<\u0018(\u0003yk|Q\u0006.\u000f^?3_!Tâ=r\u0015)Flz\u0018W\u0016J\rmDyPm]\u0010\u0018$\f(T\u0010>k\u001aI\nx3\u0015\u0004PF\u0013=\u0011kuz\u0018LNzhkѸ3^sМݑ$;\u00124\u0010,xLܙ\u0016\u0016ƁB}58#a\u0003'H,'m{*\u0019\u0006{\u001btG\u0005(o\u0003~Ե6Uh\u001c9\\\u0011\tM$]\u0012;,%{!>\u0013Ｃ\t!{2gJ\u001a.&e,\u0001\"\u001a/\u0019~fi\u001eCeq+0\u0001.Z\u001b-Id0U\u0002~nYn-\u000f@`!t\u0018~PEWwZ*k \f\u000b\tf\u0010L7\u0002M'\u0014`eC\u0013Mo\u00135g\u0014\u0004N\u000b<H\u0002n(HQ9Xvߊ\u0003\u0016n\u0000\u001dAȐ\u0002\u0018\u0010qO=U\u001au7-)wO|A\"J{^\u000b\"ء@s]\u0002\fkwEj̣F\u0005Z!rYXG\u0019\u001dP\n5d\u001a\u001a}@O\\q/\u001c\u0006/\fLlbl%\u0015q\u0007c\\Nt#C夭\u0003YB\u00159=/\u0006\\\r\u0011a\u0000>s\u000b(%T0dȒ\nFCSrmɹ`\u001elNM\u001e6:\u0007,耕&`~L\u0005\u0019\u001452$VLx1!-\u0007P\u0002PDޓZ2\u000e\u0005A'D\\3\u001egJ\u000eP&`L\u000bA\u0002\\]Orb倎(\u000f\u0007sF\u0004`r\u00058\u000b`ίcwaQ/QX\rgz謦\u0016v\u0002)Y\u0014{H͐0i \"cQPZ\u0018p7\u0016D3\u0016\u0004\n\u001cF,\\\u0004\u0016Kb+d\u0000\\>\u0005\u0019e\u001c\u00129\u0000(n)\u000e\tG=\u0006бde3\bS!\"m5\u0004}.\u000fVŲOHSC1cM\u000eMm{2c\u00117m䍄\u0001N]C#v;2\u0000aJc\b,z\u0000bB\u001agkU\u0010\u0013*ǡE/]\u0019~\"\u0005c%Ete}\u001f^\u0005XX*_\u0013\u0019=\r;u\u0005%\nPĕó\u0003n\u0010uX}N9n0w5߅w\u00036&їL\n ^-l\u0010}@rvӕz\u001a\rD\u0004Xt\u0016qs:\u0012?ys[c,W̰\u0011?h#j\">yL\t\\bjg0ۄ{\u000fӅ6)d\u0001[<t`A;\u0004\u0013~\u0003R3F\u0006\u001cR\u0005,)\r;~\u000e\u0017)\u0010ASrT8=(ḇ(b6-A\u0016\u0013\u0010K {\u00038z\u0014̫!\u000f\u0001]͕f)WcP<_n}4\u001b2\u0006\\/eT\u0000:\u001eT-\n4]7Ӓ+:*?JB \n7\"վMv\u001fHQ\b(\u001eOo[E+]^$>}8O\n=Nc6f\t\u0012Zs\u0006:kMGG\u0015b8(Lp/O,e+hE'\u001dpj\u0002\u001crWDaD喚*̮NtxQDx\tx\"g%$,\u000fQ>in*_\u0019\bD\u001a\u0017Z,V\u0019LKld\u001c\u000f=Jͼ\u0013yd\u0015[4aɛ$b31t<Ӱd~\u00147\u001f]mT\u001a\u0011$\u0000XoM#K.\u001bo\u0003x\u0013\u001f.\u0015]yI\u0013Z|S\u0003\u0001ok~\nŉ3\u001dFofB\u001c.ƨ{/\u0015*b+\u0017,%_Hr!J8|9Yo߰]5/9\u001aZ$,c ݿk98\u0010q\u0013=\n\u0000w)\u0016\u001c%[\u001b|&<v%w-\\HifcxX0s\u0015%\u00178]λ\u0014&sw\u0012`pgmi\u0017\u0001w\"ȟ;\u0006#\u0000\u001cc<7\u0005v(+]ckJ:\u0015߭\u0015?AWX[@\u0015Lu,:!xδ\"Yh\u0012P0\u0003Wz}\u0019*mO7ayd\u001cf&^#ZU78-\u0003U#:$д\"IVZHTnFTF~Zi>\u001a.#Į30h:q\u000b\u0001օDhn!m\u0011\b\u0019fRQ?\u0019Gnfx@<\u0005R\u00107yKWBs\u0000mU,O^\u0016VQE\u00183y\b\u001a`\u001d\u000b\u0006S&]AUDL0;'/=\u000e+ MDs(\u001fX$#%cG1vm6%Kf`e>Nۋ\u0006@ 1䣞+i%|\u001c#ĳF\u0011:\r\n|\u0007\u0018va|\u001eK0\u0017uK#[=>c9\u0011H\u0014\u0015\u001bh\u0010MwxrR\u001d {XNv\u0007rwאle*U\f\u0000\u0002?3!*Q\u0016\u0014\u0018[`Kkq\u0005;ԌךYk!A#\t\u001dl.r\u000b\t &|})\u0012R\u001caIt[.s\u0010|\u000ero6Q\u0002\u00055u0`GY]-\b16l97;DCeUd\u001eu#6h\u0016\u0010}{X\u000b'kE-J\b%\u001aAmvS{s\u001ae\u001d\u0012/53.uuȌ=(h˞D#\u000e`x\u0019(^B+*fn\u001c,3',tM\u0011\bߖGg3I\u0000:W}^2Y\"@QSD\u0006Δ\fE\u000bL\tE&tc\u001emD#d\b\u0000t\u0002|1L熳%w\u0012Vy!a@m\u0019K-Te~\u000eOʁ/5D/^v}>x>?'!rC<il}\u0017\fcҎ\u001e\u0000#ʱ\"\u0015*}Fʿ\u001fߏg\u001f+3\u0014Hr\u0012xGʌQ\u0007EV\u00125J0#a#I~An,\"H?q&7s1ĳ\u001eOSHi\t(qi\t\u0010Oϻ$_Nl\u0010\u0013\u001f\"\rE%L=\u0010IX>B<qRxq܍{qw*IƮ^5O<uAglʺ\u0012O\u0018f\u0010\u001dSH{O\u001b\u000e5Tӓ_Y\u0015\b\u000f4\u0017e\u0014s6\u0011iVK\u0006\u0016z:u0a(ZRKM`\u0007\u0004)fQ\u001a\u0011N\u0016#Dg\u0015Fx\u0006OE*WD!\u0015-d>\"Hʝ\u0019k\u000eZ\u001bɛ,c$;[;E\n\u001c<G/GJxn\u0013<Ӯn\u0000^]bQ$;@²GyX.\u001a\ts\u0019GnROIi#\u0014Jvm<;_\u001ed:ٽ\u0001kƣ>?XI\f^dx\u001c:׷5 !_V!'bC7-\u000b\r8^y\u001d ,\u001fL.)s\u0004\u0019\u0013E5J\u0004\u001c2x\u000eǈɂPn\u000f\u0001\u001a3֣%1HyH?K\bbbPi#8[lsD/i\f\f\n=`\\(~\fKJFz,O.?o\u0002\u0010N:ײ\u0003GXWֹ}\u0018Tm~w\n~\u001fuM\"EH͠\u001bW^ u?\fI\u00181O8QxgdPLPʜ\u0013}6])feEe5Q2\u0004͵(\u0006\u0014\u001af%=?L\fћg>zj#f!фN\u001en\u0006~^P5T\"UBAȓdo;#u^I[o}֠\r\u0015!IjoAN9\u0013bPO{NFM.8>W\u0013B\u000fʀ4-\u001dEy|\u0017)m\u00073U᪦[l{#mEun\u0012\u000e\u001a$n\fjb\u0012Len{\u0019sT{-c\u0010G)%V}كox3Cܙ\nD9jۂ\u0010ӵ\n;#Ľau5k\t>u:I㝔\u0000\b4&\u0005ƻ\u0001U\u0017ѼD65OPM0EYT!̰fV (\u0006tAZuv\b߲jL\u0013\u0010)W\u001fIK\"4{ǲpG<\u0002T+\u0010\u0012q٣\tu\u0015~A\tX=ql^Sx`\u0012&:7Ls)y_kbQn\u001c\r5m\na\u001f96%H\u0016=0T\u001c$\u001d\td)\u0007\u0015uh}r\\R@\u0001\u0006H]ᐴ0Y\u0005\fпN\u0019\u0000L(\r\u001eSv\"c^-\u000eՖN\u001d\u0017\b*K%0wk&! ݐ\u0002n @k''<zO>oD\u0003\u0018^Bk.^$\u0011\u0015V=D\u0000\bwPT߅\noy\tp\u0001\u001dZ2\u001a4<\b\u001aHF\u0015#-Ec=Ք~r\r\nendstream\rendobj\r19 0 obj\r<</Length 43930>>stream\r\n`\u001c\u0004֙xDahq\\cK\u000f`뛙\u0006Wv@/\u0006\u0015\u001cj'ۄx蚮{\u000b} uut[C\u000fSG'\u0015&ii\fP\u00148J\r8f\u0002\u0010\u0001S\u0015\u0019\u0015=㪙(:Nf6(nB\u0013Bq8祭G|\u001f\u001bRTv\u001bQ(WʡIct>U(/S,ۇ\u0018;\u0014׷;ߙ\n\u0007͆EQ(vF\u0004WZcbj\tѭF}@'}85PS|)izB̴;+\u001a\u0005|-)ޙ-3'\u00183'\u000e57e,Dwݚ\u001c)g$ѓ\u0004\u001bW\u0000U\u000b\u0015iP\u0006!j%MvvH1ÄWr\u0006f>a\u0017Fe4 o\u000e\u0015]\"m5oe!\u0014҆snX'D\u0003?xY8ga?kdqc@(Sُ8q5~?=4\u0013\u000f\fNW=\u001bt{ɾ\u0014M&'>ԟ`Z\u0019\u000b\u0007kLAр\u0018r\u001b6:;]\u0011\u0003|\r\\r\u001dDF\u0013\u001d>dqkR\u0014\u001bz8l\u0010X\u0012jåd 1A';\u000f=_mR\u0019+\b+?\u0004VX\"s\u0005`lS\u001c\u0017Ei2$?d\u001bHv\u0018Kz\u0013KԸ\"&p\u001dR}Pn\u0006م<\u0013\r-Vjx\"\u0002!7\u0011+-A4\u0012\u000fApME\u0016\n<R>5dO\u000bW\n;l\u0002Tsp\n\u0004svћQ\u0011\\\rEhY/W\nUVݮWحo)u\u0005\u0007ɾ5 QB|\u001f#m{CS .\u0013\u000e\n3r>uUR+e\u0005ZQ\u0003\u000f\u0016Ꚇjw}L޷\b9TFC@'\u000e\rJ\u001bǠ3}Tm#SIB]\u001f,ܺʱ*\t\u0019p\u0018i4Ș\u0010\u0001D\u0012ڶ;nh\u0019I\u0004{\u0019G<\u0018sʜ$2a\u0017/\u00150\tYi^\u0018\u0017\u0017eRܥ'\u0013Ia\u0011A6;\u0002Z\f!\\zK!\u0004(\u001e.\u0000u.%@s\u00039n\u0006]b[J\u0011鐃\u0019Ҥ\u0004\u0015p\u00183\u0000d0\f *\u000f8^\u0014Y\u001cUJuz%\u000fͥoo\u0001~\u001a=#Ëddw\t\u0013t \u0016Ùv:Fvg)WzWD5;T\u0011I1\u0010RL\"\"\u000e\u0012'4VRmI-\u0005_\u001a\f4*B)r2XYtU\u000bΝʈ'ʚC.1hh\u000f\u001bmИ\b7\n z\u0001\u0003.\u0006\u001b\r\u0014}ڒN\u0004m\u0012\u0010\u0006-\u000b\u00138j\u000f\u000fl\u0013\u001e8\u0003\u001a\u001e\u0007p+rc$Pn\u0016dW/\fZEch纂(G=\u0000\u0000\u001c\u001a\u000b2\u0003D\"5Ո\f/wJ\u0015MgP\f\fUI\u0004u\rJb5?}3\t!\u000bĩQTܨ~M\u0017_ѷ\u001fO%\tMu>\u001b3CگfL\u001aNSs&\u0007\u001a\u0015 ƜH\u000eG9?!\u0016-%br\u0006'34\u0004DX+xttQ\u001dB+.OhMΊD/\u0001kLB0,t\u0005\"Խ]\bE\u0005%wN/\bYf\u0015]W|J0\u0002&]>yQо:;\b\r:\u0012V<\u000bΓZ>Wzs <\u0010IbnAuUꅢ\u001a˹̥8@Ń\u0005qH\u001ejΞ\u001b`>O^\u001dM\u0017k;;G\u001bB\u001e2\u00158ul\r|m\u0011\u0016_\u001bR\u0017i3nL*\u0015lpMQ1wO\fm(v=Q\u0001%h\u0004[d\u0013ԁs\\\"\u0007E3ds%P1贺`\u0019-\u0004H\u001a}\u0017*p?\n G\u0013M.ϒh\u0015(\\`|mO$\b֟!l[|s 8bĻhᐹ]U;\u00068fqnC\u0013w!\u0014l\u001c\u0019\u0000sUM2H\u0018}MՖP\u0003m\u0018&d/\u000eF\rֆ>\u000fA\u0018z6H'*;\u0004Ofұ\u001a\t\u00034<\u001a\\\u001c\u00158ŉ2krq?\u001d[Z\u0000gZ>˙m.#V3u()x\u001cTO.KeDef\u0015\u0004q㉡\u0005v\u0012V-\u0004%\u000f\u0011d[ގI-\u0012\u0012̫w[\\\u001e38\u0006yP[#\\w6pP+\u00104\u0018Q\u0001\u0013\r\u0010\nXזH\u0000\u001fL\u0014%was(?٤N :T\u001c,I\u0011Sp̨jυͨ\t-K t!Y]l:vӇ\r\\&ka\u001c6s`TH>4EN AP\u0011\u0018\u0004-7sW\u0005v>!PaEzXi0E\u0003ػj?\u0017 M+\"L\u0012\u0004aYO9\\0\u001eyY^Pn`\u000f\u0016W1\u000f\u0015\fǿ~>v\ryI<\u00184EbC\u0001:ƚu\u001e)>\u001b7,:i\u0007Y{Q\u0006\\@:YS8\u0002vPg\u0018$\u001eB%GI_Wi-:\u0015\u0003\nopO\u001c<uB\u0006w\u0011/){PJxpWI91x\u001bRJu\u0015I\u0011rwN?a}[?1sWk\u0014~@Б&\u0000*\u0010N\"\u0001&uh\u0006C!:\u000bi\u001aH6vQrswhj<{G7V>}pb;\u0006ʄ\u0006\u0017Kb4Ȩs\u0002;]ҽ\u0016\u0016\u0016\tzd֘]\u0003|TOT@ks+I\\`̌곴RXȑyK?\u0011>icj\u0019\u00125v@\u001ddPFy͏PmS\u000f]7\r~!O[+suTE~\u001a)S?\u0018U}b\u001bcłzYV\u000e3EL4I@L6!\u001bL\u0004\u000f>:\u000et\"\u0004R1N@\u0011Rl2\u0012fz\u001dLC/\r,,!\u0006h\u0002\u000e\u000e|8s2WǏl@#\"ܮ^w D\u001dx\u0006T\u00064J ;HS4\u001e(t\u00188\u0019ttʺEYihh@\\\u0015]#e\b\u0013X(0S4?y[zg\u0000faJhH\u001f\u00152&h\u0017Y-@t/\u0019\u0012ֶ\u0002jp\u000f\u0011\u000e}\nيz\u0018;\u0007Nhd0\rY:\u0006۹6Xs\u001a@cPKS:0Y-\br;?+ɯWME\u001eCz\u0014D\u00119\u0017\u0016g8Zt? p;t}z{\nb\u0011\u001d*Fz/e|#X8#\u001aZ\u001a\u0006LXQѩu*Zb\u001bhX\f\n@\u0002J;uƶ{%sNr,;\u0007\u0016:Q\u001c[C\u001aކ\u0019a\u0001FJ8Ϡ=vI\u0006e=\u0013\u0005FJR&B \u0004\u0013viȯ,\nE\u0007h4>\u0018Q\u0000\u001ff7\u000e7\u0011ځٌy[Xyb\bZ\u0003T\u0002\u0016K*\u0002jn^썼IۛSX\u000bh1AEJ*\u0002\u001b\u00168VҀ#\u001c\u0016G9;/7\bq9H(fZQ\u001b:$Gu\u000f\u0018&R޳+M)o]W޶\u0003ǀLH^P=XHAHKf--dBʃR\u0014\u001a#\u001dqFݡǬ\u000f\u000b37D`:\u000e9\u001cθ݌\bCt\u0003(\u001e<n^[yR\u0019\u0013\boL̽ǕAȸ=PҢFH>Ai17{\\4Uң\u0016hQk\u0013<h\bUt\ta>\u0010BtY\u0014q8vԸ$\r1(V\u000b\u0018>b.}3u\u0018T/'|\u0005C[up\u0002ey%{Bhb\u000f+:v@<~j?p!'mɆ\u0004I^\fl8-A\u0010R! ۲\u00181\"?.(\f\u001b_?\u0003. j=>\u0018%/F$P\u0005a\b<olgN\tҹ)Ė\u00140Є\u0013(as}\u0004&i\u0012'K\u0018Q|^Y6\u000e.ͻEqD!\u000f~x\u0000Q\u000b\u0018E]\u001c\u0012\u001dԒ0\u0013kA\u001b5\u001e<\\q\u0018\"N\u0005b>\u001a\u0014K\u0003J!\n\u0006>)XNI6H:UI\u001am\u0011\nv)TFR4\u0013W96fW\u0007&h\u001d\bC|\u0015P\u0016}NzM\u001bLl\u001drv1ng\u0012\u0018+Ao^v-=Scet\"Oݲ:(\u001av\u0004-\u000e\u0012\u0004lM3\u0016\u0000^W5\u0015bH?p6=\u0011v\u00117c%u\b')յ\u0016W\u0005\u001a\u00039VD*|s}lyq+[ۋK~\\.Y\u001cZ\by}u킰e:H7܎p48D%\fn;躣vt˔dEL]3\u0010\u0011Q\u0007J\u001bp(\b\u001fEY\u0003\u0002\u00119\"[d)\u000en\u0001I(WC\u0019КAsd@\u0007Q1\u0003#Ix3eҟ\u0015=TY\u000e\u0016w\u001af`;\u0015h'\u0018\u0000/\u0005NG*[\u00013Pj͈\u001dLh&s\u0015 \u0005W\u0001\u0002\u001bG|\bF76p*m.\u0013&4R\u001b[׻du\u0015怿\"*\u000er\u0014\u001c'90))\u000e3\u0005:\b\u0003\u0010{P\u001dKW]js*c\n)b%\\\u001f'I\u0016?\u0010D\u0004MW~\u00039!nOf\u001fOki|\u0013\u001a\u001eH\\t\\gQ9֬UAċ`\u0003!\u0010h9P\u001b):,#Z߁\u0000ilOC>\u0000K\u0013xų\u0017m[ψM(k0Wsi\u000f;VbUbs2\u001bLwhAyK\u0002Ĉ0\u001bp^\u000f9tq=3*@Ľ11Vj$5$Z\u000f^3i\u0016\u0017ֿ$:\b\u0012Q8e-0H[_!Α\u0018\u001a(\u0002\u0002^)m:ldݐӸ{\u00066\u0017ËE\u0013\\y=k֖{~ZX^E\u0013C\u0011ÙVXeX\u0012\u0006/׽[+$\u001b>гń'W|j&x$X4\u0016$7%yEZ\u0012ndr2b\u0000)h\t['=YI_rԷ\u0010*jJ Yd>O׽\"G(\u0003e\u0014GC,T~C3$.\u0012kS\u000f8j]S+:CP|_(\u0006:85˻z]\u000fBSb|q\"^gr*C\u001fpɧ\"\f?\u00042]\u0019\u0004R\u0000U\u001d\u0011Z!砏4\u0011@-W\u0018#/\u00008='\u001eNZSogaO>PwGac\u0000jK=M\u0011\f:\t-\u001cmf-\u001bxG;:Ʒ\u0003inB\u0001VC\u0010>r\u00028\u0001$ԡ@0\u0013\u0018qA3*\u0006Fn5ׯȵR\u0013᷏fF_7\u0002J[咢ʠxm\u0004G#}tX\u000eH:\u0016A\u00145+X\u0002\u000e\u0017iv2(xqW\u0002|\u001a|E7`\u0000'c(K)37\r\r'x>|A\np坛_\u0007\u00151c\f\u001fͺ+y\u001fHݯ\u000b܀X<,(j5uav\u0003(aދ|6d=\\\u001b3rU_6x/f@\u0007Z\u001c\u0015\u000fi\u0014_jM^=\u00107Λ풶PK\ni}v0~D&\u0001\u001bHh7c˒>]I\u0005I\u0015\u0014\u0007\u0007cTb\u0000_R*K~*:B+\u000f潦A\u0006Z\u0003MW5ȼwY?/\u0013JY}Y*))̱\u0002>2!p\u0013\u0000n((7\u001d\u0001\u001f'Θ|/<?T7>~n-Y?2I:nINH3t\u0011#<\rF\u001c,W^ʭ]iT`kKkSg\u0013\"G\u0019{\u0007CBYeѼi\u0017\u0017\u0014p#D\u0016UIT_&K[5wܵ;2\u001ezT\u0004avPO4\u0018\u0004uR%ɘ׉a\tvW\u0012\u0013\u0006\r 4\u0004%x7\u0014\u0004\tp;9\u0015VSӔ|8:]QH\u0017fz\b&C8\u001b^@cRYF4)r5@\u001aζ/؆T.;&źVm\u001b\u0006L\bc(\u0019.l)'\u0015¦\u0007@\u001f\u001cǤ\\\u000b%&%R\u00024$\u0016hR\u0005\u0001w\u0006Xv\u0015$;,\u0013b\u0012\u0013>P,0+qjAcG癣ol3\u0011u<\u0007$pM\u001c\u0016LS_)C\u001a((\u0018\u001d.!0\u0015M\u0005\u001fҠ,\u0001O9coc}L`\u0016r<\u0004a<3o66]S\u00185.ى`\u00024\\\u001a5( uͻ\u000fߠl.mu\u000e\u0006Z\t$Y\u001cS\u0013G;X\rrJy$XX\u0006XWnF0bkp3kEg&h\u0000/\u00150\u0004'\u001c$B\u0017,\u000e\u0007r6ZԟKv׼[Z(h<c\u001eiu?hp\u001b]6DIjVc[t\u00019Z\u000f^\u0003fx~߆&w\u0014~+W\u000bV\u0016Vyȱ\u001aNgA%KޜJ\u0018bP!]^c\u001baFJ.\fp$\u001agƣ\rl\u0013\u0005r!yX\u000b>\u0007Oonjo-~X\u0018&TzV͈<柶8\u000e\u0010\u0006]\rfD\b@efs0\u0017\u001eQ ȅR>/t3d\t\u0012\u0010\u0012{Z\u0010\u0011|R_38(|(75vٮ\u0003\u0007g0K\u000eL\u0001\u001d\u0017\u000f#(\u000e\u000evko\u0014\ncƔog}p[Ɋ`\u0005\r4)Q+8\\\"\u0010\f\u001eH8\u001b\u0019\u000462\u001c|'=\u001f\u000bE\f\u0014x40H 赮\f\u00057f\u0015k\u0000\u00032\u001fay9\u000bf]<\u0002DZ-|R8}m7˿\u0013:6(E\u0013u쁙C7e\u000e0.\\oۻZ_a$rm۽K$&\u000e.YZ2\u0004rA\u000fRM\u0012\u0002\u001e|a\u0011\u0010\n\u001fo$@1Y\u000er[ÚRMC2+!\u0013?En0z4\bq3\u0011\u001eb[Ƌ\u001a!b5A\u0010\u000bێ怨hD\u0007\u0018k5\u0017\u0013b\u0018>A8Ǽ\b1\u0019\u001e\u001c]\u0012b\b\u0016c\u000b9KḘ ZC`+0<AQ*\u0001\u001f)Z+\t<\u0010Ǹj>CLẕr\u0012@zN\u0010K4>.\u001aT'<TʾpN\u001fbأAn{\u000e\u00046\r\u0010\u0015:WlI\u001dS\u0006Vé\u0011A[}k0]0Oo\u0006O\f9ŦT|\u001b\u0011\u0014`\u0019ssO\u0002\u001c\u0013\u0015k-yz(\u001bv>`n\u0004}P\u0000Pڒw&pOA\u0017\u0012+y\u000ev@0Ei^5i\u0000$B\t\u001cd06\u0005z\u001b\u0012#03W'cw`V~\u0001UZ\u0013jnmlնd)\u0010iMC(.DGYjք\u0001ڌ\b{\u00062\u001a<β\u000b\fT>C+>jys}H\u000b8鍸 CsPM;&еq\nk9<[B\n,2@Ix\u001ef\\\u00190*H]ԁj\u0015Lk8OW \"C\u001f!R\tȖ`|k,0\u0004Zimi\\\u0001-P{1)\u001cԻV\u0013\u0005\u000e\u001eo\u0018\f2k\b,,ִ\u0019ɇ\u0010Ս/\u001fQ\\\u0011\u000b\u000fm\u0010W֐hkm\u0002AN[\u000b\u0012\u0002\u0019\u0005i\tOa\u00004u\t\u000b?\u0006w)UѺ\u0002)ross\u0019:4I\u0012\u001bNX$l#UJ\u0000Hp1\u0019TK[RO&=\u0012Y\u001e\u0003֬\u0006kڲ~B\u001a\u001a\u000f\u0018\u0016{\bk5z֤\tǋr'\r\u001d&ACk\u001e\u001e\"\u0013C^=E\u0016.%\u0014dفU\u001cȚ2m$\u0003\u0000Fj$$edEuUm\u0004lT\u001aC\u0017ܲt\u001e2,\u0000^\u00012߳\u0019\u001aƭ5_6rQn,=\u000eG^\u0015ҞU\u0003\u000e*Q%O9I\u0016F\u0013\u001b\fX\f,.[S\u0019#\u0010g\ro%C79x*u?\u0006\u001d؆EN*ip>\u0005osK>u\u00032&H\u000f3ޓy$>'\u0017u\u0007g\\'$-٤d\u0004\u0011\u0003Oׄ3?m^o=lD#\u0012\u000f7s\u0010\u0004!^^wM\fV\"Seb=\")~\u0015zE\u000bZoD\u0010U4q6ϼVjslau;\u0010v]\u0018(\u001bmoӈ\u0006S1ݑj`\u0002nt&DesxIޠ7v k^%\u0015a&Ph+{\u0003rF&6Xxγ\u001b,i\u0003\\c&$c$D\u001dg$R\u0005-H\u0001Xm\u0006ɄZ@\u00138Ҵ\u0006\u0007A\u0005/aqD$]b,2KT?\u0013\u00125z]<H0cLҽQ?n^ϕk{v\\}gs̐gI!xdI\b&d&&n51:U~DG\u0015\u0010xdX[,\u001brD(\u0002`4\u0000dK&5>^uM\u001e 11b\u0013{uΦlU>\u0012\u0007;d\u0015_ahmdZ;|\u0000]!@{OՈ\u001f|lF\u0017#h\u001a^a%dt^A,6\u0003p^s_\u0017Jz4\u001cB2\t2AGx\u0007\u0015>\u0007#\t\u0000 A_/|F83.`'1؆Tĳ\u0000\u000e\n.]@,p%+x\u0001-Y*HNs\n.c;0\u0016*ȍuc%2S}Wj)\u0010uMx,1\u0016XBGs\u0015)#\u001fY\u0017T\u0001Z!㢥{ch\u0011\u0017$)\u0000K:\u001fgt\u0001nB`}ʾ\u0005p\u0002^F>\u000f7m\u0005\u000285\fv\u0014p\u0018\u0002\f:DW\u0011`R7jH\u0000)kϐ/\u0002\u0012nyOr\brpH\u0016$\u0015{jAޝf\u0005NK:4_\u0006\u0006\u001aѕ{5\u0004+&87᭘6`0.N\u001a2.\u0003\u0014\u000f1f\u0001(,khu\ns\u0013\u001dV\u001ap{H\u001a<ujoktYY'\u000e>GeZ\u0003n'̝\u00193PEP\u0014\r\u000fG\u001c5VXZ\u001cԮm\u0000\u0010\u0014iC\u0014BY\\\u0007?%\u0018\u0016d,N2[k;`\u001f'\u0006o\u0010[ࣷT̕ON~QAk!CN(W\u001c\u0003)\"#?\t\u0014B7[A\ft@\u000b+8t\u0013vYV\u001bc{ɡ[6}\u000e$1Ѧ5\u0001}\u001cJ;X\t\u001b\u0007)̝p\u0015nRx7cl\u001aBr\u000fK?&1\u00180c{\u0019lhzE\u000f\u0007/h}F\u0016;Mޟ}i>P]+\u0013ޞ\u001fUϽݯ\bЄ9i-h(\u000e\u001aQNkP} \u001b>IUc\ra\r\u0012ۡ\u000fi\t\u0012\r\f.eɼ~9!Y_,\u0019\u001eO/x\f\\\u0007I&TLﱖ7\u0005\u0013\u001cgQ\u0014v2qv\u000b^n@cү+\u0004\u0019\u000f\u000e[i>?_r'_qJc2W>^[\u0013\u0018|ޱj@f\u0014Wù0o\u0000RŬ\u0010R0+>5e{\u001e\u0013V^ƆknyAPOվ\u0016!h8\u0013\b\f\u0018\u001d?s-py\u0000~̴\u00145!ډNCB5\u0002W)x\u001cp\u0006G\b\u0001K6y\u000eA.A&\u0007/K\u001c6\"7s\u001d*iN\u0001z\u000ev/ڋ\u0016I\u0016%r\nX}}\u001ctS&,Uc$DNA\u00043dom(}&ܥ=\b;\u0007\u0002\u0012\u0019YFRS6.-3P\u00006>ڨ}\f\u001b_\u0012`\bp-ҫr\u000fW30{\u001eJ\u00134\u0006([\u0005}K2Ep%\u0018HXs&Y+\u001dfF\bް\u001dyDkOwZ.\u001egғM\u0004A.\u0010A\u001aET̴s\u0004Ǖp+Gϰ`B-AFt\u0017#SDaj\u0003̯Lgh,\u0002܀-EOފQN%I]R\fa\u001f\u001fOpx#l>\u0007d&Ӹ\u0010@p}c\u000fR\u0011p\u0014\u0011L!S]o-\u0001__D\u001a똬\u001bO}\u0003!\u0013F\\j\u001bİ5\u000b\u0013\u001e_k\u001b8=_^_vaԧRqL\u00130\u000fŉ)l^C\u0002M\u0007~\u0004<8\n21v\\n7ߪ\u001d\u001ch.=8\u0010\u000e\u0001\u0001`0<h\u000b%x~nz;8}.Ӂ\u0010\u00061f\r\u000e~.W\u0003qR\u0017p\b[V4F_]ŠDj*\t:g\u0003o\u0016d\u001a)ǔX(G\u000b탴o\u0017\u000eL(.%`dKg\u001b1aaՀ\rl7\u001aWCR]Dԧ Dj~GڑpUkeڜ_\u000b=j\u0010b\u001fED\b=`\u001a3\u0001f#v^*\f\u0014I8hԴA\u0000\fVjS\u0007-\u0017\u001cy|ܪ\u0010Xl\u0016\\0닉\u0012s3\"(Aj=KGC|ؗNF!E\u0005;.\u001dFgPte\u001e\u0003\rK\u0011\u00121b'\u0006\u0018਻c\u0016~>\b[!] \u0019\u0002\fw\ffmM&\u0010\tKq^\u0016X$\u001fý6,F'\"7c(\u0004}X-\u000f%\u0013\u0005όy\u0004x=8R;JEft\u0010pwZ\f<ŤIcXЏ3\bOc%`Ӕ8sKw-J˂IB\ni\u0007 RF\u000f\u0003.8%\u0014\u0014\u0002\u000bwe\u001feoc\u001cg.Q\u0018\u0010\u0001wDh5I'6pk?,s\u0015\u001fzjm\byg3<\u001b;\n\n\u0003134\u0007U%\u001etfXW] \u000e\u0013\u0018\u0010Bsx\u00106w\u0018\u000f\u0011olⰙoFR^)\u001b}eZ\u001fF8w]\"Fϻ36z=t\b*%]Y0I^$gyB%_\u0007\u001b2ݜ\u0000M4\u001c\u0011`2Ͼ\u0011F)N\u0017\u001dW\u0014\u000fata\u0005\u0004r$H-\fk2(}^\f͆5\u0004_etm5\u0013\u001eg7@A[c\u0002[\u0010\u000bØl̼;HS8\u0018\u001f\fox^U_Z*\u000bkS6X\u0013\u0001 \f*:4\nPAXl>F*)\u0004\u0018pV\nGF\u001aZ|v\u0016$dF\f8w^\u0018\u00155!\"/SI-~U4yn&P5/L\u0011\u0016^0\u0016\u000e$\u0001־ʥFs\u0016|)l>\u0019\u0019PI 6v\u0004G\u0000pk,C\f=d\u0006UF%bM1\u0018rǁ~R.pv\u0003\u00142\u0014/|\u001aB\tͅ*{=>EǰbZ\u0007טɱ8\u001a\u000f4DaP_\u0001\u0000cA+2\trG\b@rq4U\u0004sTIZ\u0001?Vr\rB3\u001eo#:șQtdp\u0001ufe$b\u0010}{J\u001e\u0019=L\u0015mC_Nd-(j3L\u001fY-\u00040ęZB32W\fw%p\u000b\u001ctK\u001d\u0018QLv8ЦM\u0010HqcEg\u000fMV)m\u001eIP\u0015@[\t\b\u0006nq[_!=Mթ!\u001d.&Bb;i\u0002ަ\u0010\n\u0014\u0016\\\u0013q.\u0004-i]ίMn\u000fY^r64婬[FΗ/ԻE7A\u0011\u0007\u001cnQtF³\"\u00146XsE+1%3^h(U\u0010ۊ\u0004\u0010M{lAcN \u0005ڄ\u001fN~Zptkk$~\u0010C\u001bZ\u0007qAp^<gYY)\u0003-Gu\u0012\u0013t{\u00152\"YCFT\bq\u0016\u001eb?jz\u0002\u0012xAbbv#n@g\u00006v#\u00074N@l^\u0006*\u001fz~\u0016JrV˙5y'\u0016S#O_pN`\n*IB[J!~KI\u0003K9MEx\u0000<1\u0012jVo|-P=\u0000\u0007M`|D]U i\"F\u0000\u0007NP,\u0019EuR\u0018u\u00157>\"\u0016xv\"26>G\\~Lj8\u0013bݔ=:Wh\u0001򥀤⫡h\u0000HWǖ]C\u0005\rYڞ\u0014B$1Ǥ+|ǩ>lsf1[Aߩо\u0010G[\u001e%x\u0012\u0002Ep\u001bF:cps<_\u0012j\u0001\u0016\u000423W4\u0000\r*\u0018x|R\u0001|̙g\u000eVd\u0015ꁾ\u000e*,l솯E[n_ߌ+>UM\u001f*j\u0011th)!AR\u0005H\u000b%{+4$pg]\u0013\r\u000e\u0005\u0014\u001a\u0004+¡ޣX.\u0013;p\u0010t?dD2\u0007/r5w_5MIb\f\u0000\u001e\u0001YM4?m!M @)e\u00107\u001dX5\u001f(\u0005\b&Mtf\t4\f @}6\n0\u0015\u00124\u0004%NM7\u0006͘g\b6n{\t1\rҐd]Mxŀ$\u001bJ\u0003H\u0007\u0011EDZe[Z.Jf)\u0012',|\u0000`ή\u0019>\u001b4\u000bwVr\\6\u000f;\fܽ>p:Z]\u000e\u00058紟=K&3\u001aIvfi\"D$\u0015\u0015{ 908qX\u0007ʘ]̉\nֻ=\u0001{@\u001b>3Af^Z% k+\f\u0016(,\u001aizru^\u001d%Vk%ͽIjmp\u0018/vQyH\"\bRMW\u0013bWr!3[{ы{\r\u0007\u000f&܋(>d\"6I\u0001#\rٛ#\\\tU9\u0011Հx3x1\u001f26-]a#\"ш-+\u001aREZi~Fk~OSJF>\u0013\u000bƜ\u0016\u000f.0ʡ.-Zg\rP\u0006D\u0016`\u0015EW7\u0013\u001d\u0007N*c(\u0012\u0001P̐BO\u0003oJ\u0014N\nlU@\u001e2\u0006\u001f\u0018t-X-M\u0014q#\r\n53~J壛+3;\u0005n5\u0001Gvi\u0017< j(\u0002\u001aQ\nRڟ\u0005_\u0003\u001b\u0005\u001f\u001dkUmʱbH\u00043\u0000;v~ԣ\"gD´UwUdu4\u0015-\u0010*V\u0016\u0017Fd۱\u0007,\u0005\u0003LZ}\u0018AF\u0013>\u0013hFF\\AH\u0006d,ȃ^i.;zmxy\u00143 \u0018˪̪lO{#7F\u0010T|\u0012dˇ\u0014L\u0012\u001eR]\u0011\r czl{͊4h1A8\u0015,\u000f\u0018\u0016\u0015H>tD\\6\u0004;\u0018baC\u000b\u00188$E\u0007qJfGE`\u0012!yAW\u0003蚛\u0001z\u000bjW:pzu\u0010)ǊG\"F\n\n%\u0006?p\u00177PP\u000b\u0003+Ls8(]\u000e(\u0010N\u0000߾\n\u0001$,y\fI>?S\u000eF=|V,1\npۛL~ʆv㵨dǢQ{Má2h>rl}\u000e4Z`\u0001D؃m5\u001dZUV'j;\u0001\n\u001f{~p`ȁCׁ\u0014M\"1'F\u0017|fSQK*q4f\nQ\u0014\u000frF\u0016цj\u001b\u001b8|0ZwJU\n\u0016ˍtɓJ\u0011\u0002Vkr߼\u001bT?\ro\u001e\u001d\rmBS,Pg\u001a<]XG{IEgdi8(g%\f\u0016\bI\u0004G\u0000;RN!1\b\u0015_|0׽'D%7\u0003\u001aoF*\u0004]9\"3Lt\u001fa\u00173Y\u0014¦%Q\rIsJ\b\u0012*?+f+@fZF\u0002\u0001BL/ݶu\u0011k\u0012Fhm\b^j\u001b)\u000eз\u0005,\u00112Հ$ժ\u0002jn\u001cl˭B6aWw\u000e~\u0001cr\u00137\u000e7#\u001c]kOJ5\u0019zIzx\u0010\u001cD1P\u0001*pa\u001f8ݎ<\u0018@l\u0016pޝ(A'/\u0011{;롦D|KyGFYY\u0001Pٵ\u0010w\u001aIɳ\u00040vyZg\u000bz\u0003 ,\n.\u0004N\u0007\u0003\u0000\u0001dv\u00120CP\u0001$pORR`F$\u0002țE\u0000\u0010\u000e\b\b)sC\u0001\r28\u0006\u0014\u0019J\r\u0010YD\u001b '\u0006\u001c\u00064\\\bE\u001c\u001b\u0001\r+P\u0016Y\u0007\u0000TB\u0019n\\\bh\u0001\u00011\u0002\u0007\nE\u0001&\u0014\u0005ř`|XG磂\u0006\u0019O \u001e\tК\f\n]\u0005E\u0015\b\n\u0013IP\u0015VsqcR\u001f( IT\u000fɨ\u0005\r2~Q8&\u0000\u0005\u0004\u00063%\u0007\u000b\u0010\u0017F\u0002b@ÍC#a1Rnd.``*\u0000\u000b\u0013\u000fP\u0000a\u0019u 18@<̂\u0003F:DU10\n\r\nHP\u0005lYl\u0006\nhxDb7\u0012q\u001f\u0000P!` C<\\p\u0000\u00170\u0000:\u000f[\u0011\u001b\u000b\u000e\u0006\u0014@g32'\u0014!EF<̢CD\u000b,\u0001LD` H\n\b\u0001Z\u0006Ha\b\u0019\u0019 8-\u0013q\u0007\u0005\u000f\u0012p`\f\u0002\u0014<\u000b$xd$p8\u0011R\u0007\u0012hTX\u0004\r\bIU\b&{D\u001c\u0005\u001b\u0014@\u001c5(!\u0003QT-@①py\u0001\u001b1\u0011\u0000F8!,\u00079Tx `8X褄&8\u0010PT\u0014G$,,p8ࠀ\"\u00033&8\u000e\u0017\bͧC2d6q`\u0002\u0000VqOgb\u0001\b\u0001,>\u001d\u0006\u001c@GAH<\u0018\b`\u0006\u0007,>\f\u0019\u0013\u0019\u0002)?\u0000Rb.pJjf%;&\u001e@LJǅ24N~~\u0002?\u0013-X\u000f8H\u0010\u0013\u001aF0N\u0004Ā\u0006\f\u000e&D\"D\u001c  2h頸\f\u001f܌d|(x%@\u0005.\u001a8(\u000e\u0011Q\u001c8\"6~\u0000\u0013\u001f\u0016\u0013H\u0007IԴHX\u0012\u0010\u0010\u0016\u000b2\"9B1!Ձ!b-!\u000f\u000bH|\u0000(HiN^\bF\u001b\u0017\u001b\u0001MX7\u001c\u0019.(D\u0001|0b\u0000\u000e)N0\u0003\u0016`TD\u0000\u001d\u0012/EC\f\u001d\u001720\u001eƱ1\u0011\n \u0006\u001a\u001f\u0018@Q\u0001\u0003\u0006!\u0010n\u0003\u0005\u0002\n\u000f\\<B\u0013b>\u001c-0\u0015\u0012\u00132ip\u0014$ \u000f\u0004D>\u0001RA#\u0002O\u0018\u0002)\u0007\u000b6\u0000\u0000\u0004,8\u001e\u0018H\u00138_,Q\u0018Ԁs\u0001A,\u001ec\"% X(Bg\u001dc|J\\PSa\u001d\u0007$>\u0015>P~AAa\"a\u0012Ca;\u0007E(耱x`1\u0003(\u001d\u000e\u0006\u00198\u0003\u0017Ǡh\u0002\u000e2р\u0003\u0006Fk*PF\u0005S$\u000e\t\u000f\u001c\u0003 ,6\" \u001e3)\u00182\u001b6\u0016\u0019鉔\u0017\u0004\u0005\u0005P\u001a\u001b\u0000\u001d\u0001.\u0019:.F\u0001\u001a*kb\u000e*\u001eD\u0002\u000e$^F<\u0012\u001e#%\u001f\b\\HG\u0007\bs\u0013r0xHr\u0010xp\u000b!\t&O\u0004)\u0011)x\\xI\u00118\u0000r+$$\bǍёMqA?@\u000f\u000fU\u0010/\u00060c\u0005\u0005DE\u0005\u000egAM\u0006\u0006d,V(,\u0001̊y|p\u000e!B%\u0000\u0000\u0005\u000fs`\b\nk0a\u0004ā9&8Q\u001f\u000f\u001b\u0011\u000f\u0002͊ZjS\u001f\u0016>\u00113\u00125\u0001rFZ\f'irq\u0001\u0004\u0000V`7!#Zp\u0000@~h\u0014\u0002\bM\u0001\u0010'A*H\u001c\b=\u00148O\n'b\u0002\u0003\u0007+؈\u0014(p\u0011q4\u000fT$q0 \u001b\u000f\u000eB\u0011sA\u0011sA s\u0015,^<l!P\u0000\u0007&\u001al\u000e\u0001\u0002\u0010l\u0003\u0016?\u000250Cd\u0002\u00009HX\u00181\f\u0015\u001a\u000fpa\u0005?\u0015fhF<'LKG\"Y<\u000b\f#\n\u0012V@Ʀ\u0006\u0012P\u0000)dSiq\u000f\f\u0019\u0004\u000bJR\u0004\u0011Ѕx\u0000`\u0005\u0004\u0000$)\u0018ǉyx2;$^j\t\b\f\u0001>H&\u000ěL,x\tYx\u0018\u0013;\"`\u0003$r` \u00060\u000f` }xj(a\u0004\b\u0007\u0012p\"\u001c\fh<xL`\u0018x !R\u001c*\u000f,\u0016EKr \u0010:XPQXppA \u0002Ii\u0014qh)\u001b\u0015\\DC\u0003Ё\u00180a\u000b+\"\u0013-.aR\u00131pq\u0014.\u001cz\u0010IY\u0004\f<,Va9h&D\u0005?\u0014\b<Xǀ\u0005\u00105@18$paD\n\u001a\u0000\u0018\u0013#0t/H0=8\rH\u0005(xv%\u0013|X\u000b\u0007-*\u001b\u0011\u0000bfb\u001e\u0012\u0002\u0014<\u0000W\u0018\u0004'\u0003\u0004\u0010硔\u00027&0&[L0\n\u0014!/1iq\t@\u0016GAR\bT\u000e\u00000\t:@E\u0011\u0006\u0004if\u0013ZPzǡTB\u0015|:11\u00148\u000e6Ϗ\u0016N\nBP@\u0001\u001dqahoS<)\u001f\u001eOǓ<\u001eOEJEJEy8)\u0001C\u0001hx\u0010x\u0011pLV|TEE%\u000eCrbA'\u001fLI^tP@0\t\u0006\u001f!\u0001\u0001b@\u001bC\u00164ȸgDUl\u0010P1{0@u\u0006a\u0005R>ʂ\u0004\u0005PI\u0006I ::\bx`\\\u0010 \u001c\u0018\u000f\u001a\u0014\u0013\u0004\u0001g;fy{DC@m!DA?\"\u001c`5\u0007\\@p)\u0000@8`\u0001A|\u001a\\\u0018\b\u000bg\\\u0001%\u0019\u000e`\u001f\u001e\u000f\u000e)|ē!&#?OxÂ\n\u0013`\u0010q\u0017\tB+f !gB%\"\u0014pT\u0003)\t\u0001<3s#&\u0018C\u0004%!ea\u0002#\t\u0002\u0017\u0014\u001a\u0012n\\\nB874\u000f\u001f\u0012\u0012\u0007# \u001a\u0011PM\u0011ȈgR=R\u0016s\u0004XR\f\u0010\u0016b%\u0013(̃Kyd|:<`L<3*4+ZHR1\u0010\u0011\u0011\u0011R\u001d\u0006.l>6ڂIH>*8\u0000\u0004\u001f$PPa\tX6~a\u0015\u0014<$\u00050H\u0007\u0000\u000f \u0003\u001c $\u001e\u0007\u000f\r\u0004\n\u0015!B!nb\n8\u0012m$|<<h$01\u0001-pq \u00004!CEdfCs\b\båf\u0012Ąԋ\u0005=θJg\u0014\u001c\u0005D# ?\u0004ffb>%\u0019\"\u0007V\\D̈\u0006Cudd@\fZ.M#А0\u000e\u0005̊e4ԠG\n?`0\n\n6\u001e\u0012QÖh\"2.\u0003EE=7\u001f\u0005\u001f\u0007\u0019 \u00158\u0007>\n\n\u0012\u0006\f\"82T\u001cd!&\u001e$j9%\u001a\u0002\nF@\u001cC29\t\u0003\r`$9P\"\u0001#\b`ab]\u0011ɐ\u001e\\hL<'\u0015\u0012tC\u0013LD$?\u0015R:!\u0002b\u0001fBS\u0014)a13\taX\u001e88\u0016\u001e-\u0014\u0005{AQ\".+\"f&%:\u001a\u0017\u0011\u001808in\u001aPT 0R\u0011\u001c>\u0006n`\u0001E|\u0018A\u0012Ԩx\b\u0000`p*\u001c>,2P8\u0018t\u001c \u00064H\u0014@1$ \f͊1h\byɇLGÀ\u00030HP\u0002<\u0010\u0014\u0017S7.31GLL\blF\u0007\u0003JODG2\"6~@A\u0002\b\u000e#\u0000:hL\u0007)%\u0019\u000416.\u0012\u001f\u0000\u0001\u0005]\u0000U4E\u001d\u0000\u001dT\u0012R\u0005VhL<\u000b\u0006P`a`\u0019\nRT8,p\u0014C\u0004\u0003\u0005P8:^ᰢBA4\u001f\u0007\u0018@Ǳ\u0010\u0006\u001e\u0017@\"\bB&\u0018F\u0002\u0015`qP@\nq,L\u00001\bPpdQ`B\u0001\u0005Ёԇ7\t>*\u0016\"5aب,\u0001'Ix0\u0001\"?@\u001fQF\rǊP\u000bU\u0001@E\"\u0002BM\u0002˸\u0014\u001b\u000f\u000b\u001f\u0005 ;\u0018\f\u0014b \u000640P\u0001\u00108\u001eg\u0012\taC38\tCss\u0011q\u0004\u0004ǠǍ\u000b\u000b'h@E\u0001@\u0019\u0011\u0010\u0014\"NB\u0005EFȋT \u000eS)\u0004\u0002%\u0010h҃\u001bO\u001dX\u0002\u0010&S+\f\u0018t\nt\n\u0007\u0001\u0015K'1J\u0015\u0003\u0019\"@J\u0002\u0002*\r\b\u001cVa\u0012ZI9\u0000\u0005\u0005\u000b \u0000hDv\u0006Ā:8\u0000q)NzAlZl\"Vl\"LJRS\u0019: %(G%p%t:<(>\u001e\u0016\u001e\b\t\u000b\u000b\t \u0017\u00100<hA\u0003\"a)e\u0004\u0005c+\u0017\u0000\u0010t\\P$ I8Oŉ\u0001cB*\u0003$&(j!Q\f!\u00031\u0006f<\u0006ؚOD\ti\u0019\u00019X\tP0 PR\u0013(RЃ\b؜\u0003d\nԌx6Tn\\A\u0006\u001d&XTD\u00031&d\u0018b@C\u0005\u0007\u0001LEU|\u0014 h`X\u0012M\nD\u0001\n\u0018(h L\u001c\u0015\n0`b&\u0005\u001c1\u001c\u0019\n\u0005@\\\u0006H\u0007D\u0006f<.LL@\u0010\u0003\u001aJB\u0002(ĀA=){yƁTX\u0007\u0005H\u0001:\u0010q5\u0015bR\u0016%!%B!\u0012\"!!C5\r2\r8)\u001f `VX\bxq΅~8\u0010\u00035\u0015IqpqSb|\u0001\u0018\u001c8\u0013\u0006!ea\u001e6A(A`\u0014\u0011vHy\u0001\u00042(O@B\u001c2A\u001d\u0000:\u0004iD\u0005 \u0005'\u001fHhtaƃ<= TMwU>.v%>LbM}mo#^\u0016^si6\u001aB\\M^<sb>ھmZk/NVL˺+o#>_\\٩y6qb&nEy{DKcakٝ\u0015Yh_^j=4NcM[~jo\t{*Z}*Nfڊk7+YtkG[b]zP)rY%#v^]<m\u0011K+\u0013\u001e;\u0012ӱm{jlwfϾ廲U\u001fs<6FU[q\u001f펿.2oY~]v|4<W\u0011_hW\\gVi*=\npwo\n\u0011y\u000f_zUmX٬oLwWFN[vfxkv}y׷Yi2[}uW\\ӳ;n-JKگnr2<M嬮mλYk̿|ִʬVSG/ܽ^k}k\u001fc6r\u001a޶fyg/neY\u000f\u001a30mQ˪7n{x8~㙲ᯒ\"vb&4\u0016[?pj_[yV\\fY4oؖV͆ŵI\r7\rOqZe\\̳C2sZ<\u001b8abfL[\u0003hXm]׺57\u0013'\u0013\u001fsuߢ)cu\"uVmporZ{ʨłW-ĭW\u000fT;4;7Jk''\u001f_lJjFSĤ{Uv\u0010\u0012F{_MդY˕+3ub2;!Vi\u001dsU-!ߞ6\u0014X-\u0015ݗ\u0016wV^+C\u000e\u000bR,R,*o\u001d7\u001dfbck2LMņ\\-Lhժܥ/L߶.Fv\b6tt}UӴK4<G~\u0018ٟNZ̳qGهZ{w=VLy\u0018Yfձ-\u001d1Wk?].vUK\u00190kY5뎍vkf.kZJWuBJ}F=q\u0017f\u0011Xw8[M}*VYuivoSKl\u0015z1˻{f^kJM}X˗,uSk~d{|}9Yy\u001elE>)gèy\u0017״n5lǨ\u001anz2u:m\u0017^\u0015.m߾٫hwȦuOC\\|y\rKת\u000bB>.{L׶Ed;cJcn\u001eƯŅeXuڿ?25w-V%<ΚƦʵolnNwgl?/kW\u001b\u0016Sk.-\u001fkq}iCZӬo\u000e2ju*ў4nf[WY\"com=&3\u001aZ!\u001en\u0019*\u001eZ%[on;;j^k\u0012ֵ1R;j^Ym\b\u0003\u001adv9\u0015W#RfTc-ƻ}k_K߭*/\u000bzַ<36JO#k^|uzWezf*}\u000fZoW׶q%'5bor:ͳe\u0019ףve6*գ&ӳakv署.\u00106!nr|t[gZgxruzIMX<cRDNݽ\\w|0vV+[L3<.[v2_\u0015r\u0018ժq|O~\u0016M\u0019_cv𞧿֟&\"شTw0t3<~b\u0001\r2h\u001a׬Z鈦  H\u0006\u000b\u0000@@\u001a}d{oabzYUFwvj>nlTM\u001dn6]K웶̉ѫ\u0017\u001112KN9yyՉ^ʝ뺲Tc{i}wiQݖ}WOզxjƩ\"(\u00114\u0011\n\u001b\u00074hu'\u000bڥGi\u000fm?ENP7x𪚕ZU\u0010ΡCю/_:TDNh\u0019{\u0015{΄\u0016JNW(\u00153\"\u0013[vz~lB\u0006\u000blf?\u001fˇ\ty.\u0013g\u001e\u001e\u0005\u0005C\u0006\u0002h\f\u0000\r\u000b\u0006\n\u001b\u0011\u0006\u0001\u001d(\u001b \u0002:\rPG\n\u0000\u0003bXf,dX0\u0014P\u0002BR(.\u0016VTbXTnl$ D\u0016\\.\\\u0000\u0000\u000e\u0017\u001b\n\u0018h0\\8˅1\u001an\u001dM(C(}\u0001ؠ\u0005`#\u0001M4\u000b\u0006\u0006QoT\f\u001a@FT(\u0010\u000etCl\u00174\u00074tRSzN%dݲ(\u0019S1ޟ,ҪrDVZޢc(Z4( ܌vq\u0019{|&>Y^t]w#\u001a[Em{_.mh{yQ)'Ju\u0014u(3Nk)\u001e:{;ěyNSSDT6+>{2\u001e뗦֭2MYO\u0017rɶZ.dCS9&WV\r٢R/dtZ\u001d\u0015\u0016\u0015h亸t!z\u0017vrfV\u0011\u001e{Mê7g=ӈLykYr/2}eEV=\u001eE|fgN+52L\u000ewڥe\".NM^M\u0017vjW\u0006jxqfc;K\u001752ǺZN\u0017avoP 8\u001d-z\r_flM0o@C\u001a]\u0003\u001aD2X7n\u001f1eabU-ߵ\u001f'b;V\u001e&SL.U^%/*j&tofW|VJ\u0018k0\u0015r\u0019\r߿mgbW.jsΆuN̔wWWzk-imi͝~ťeV-l\\|ĶG32[^\u001dsV~\u001dk{{Uj5]*M5)\"ouFΪS\\Re=ecUZggk2]7V=ӮO:g\u0017wu-:s{.L\u0015~|\t\u0013]\u001aj1f%Ps{,:M+Z樢]>~\u001d*\u001em:]{mFegӅ~2TfǶUY2j.>dZ\u0016mm1\u000e4\u0012/1r2w*^\u000f.Khj=!3o.IC\u001a %\u0016s'5=[&z鹆uuNVxh;U?we9bͻ3۶6^奱%Wk.\"*3rbb\u001b\u0018w]\u0001\rsiǽ{z\u0016>߲ibXMՖsS#;oob-\u0019aJj^خ,dI\u0011&ڰq1!?}~\u0013o\r-ߺֹ?ܭl\rebuY+1!\u0000Y}Y\u0005UZMҲaSbr[Y\tjOdL׻7;<t?y\u00150dو[&,CcѻlJ\u0007\u001dʋv\u0012\u0010gW!V]}<\u0019]Ҙxj4u~zg֚\u0018:./?گ^>\u001b1U/.\u0015.vZ^V.oͭU\u0015jkҾoYԽ)\rjΔUw[OUkcNT2ԜVx,EC5;MiVջgekm8z_ͨk}J\u0015gb뫻V<ӿݦɯ蛛uĵKz3f2_\u001dYۊ7Ciխ4\u0017\u0017\"SwTZ:*\u001d\u0016JKǐ[V\u0012\\UMmvۛfۉkV{Y)۸_flgU?+So[l֘\n\u0019jUvץ벛5ۈ8efu^RE3nNmVk\t\r\u001a\u000bUxR[Z\\ޟۙJY4SG\u0011믶w\u0013g]n*.1\u000fr5\u001b)\u000exu,ΔvcK;.3]fdԻ;U=Z͊fz55c2ڞb^^xKwFmLUWیVUWv̅Ƭf۷d|RbEwk\u0015j[o\u000f\r\u0013kOxi\u001b\u000eQWxWO{5Ѐ\u0006\rdKlx};:+5q@CHxq\u001f6jZ۵1\u0017/-SYE'd\u000bKTvtRS\u001dEj!Ԥ7%XR_f\u0016\u001d'+a\u0015s\t3qw{r_\u0018q1+37\u00064ht[p-+݀\u0006\u0016\b|\u001eZW{|Uf}3Z\"oqZ~͊u\u0003\u001a`\u0013{1\u001bg]5wvwvSEM<'U<EV8R\u000f2u/5\u0013Y.|zneu|;>ұ\u00117۶V[K\fr23\fܻ˘̻l\\KkM|fcFlL̚wNuWNCԘg/\u001av\u001e\u0016w\u0012sk]L=VlMedƺgR|^6d'*nqvԒ2\u0015OY\ngI\u000fMմkuy4p\u0017ΰհ96'^3wm'b]=a贫\u0002mǝ\b\r\u001bq\u001byم(\u0010x+&;Gc\u001f*#,ݑ2kG\u0019<^\u001d~ֹcQWr2}H\nQ3TM7,LwJw\u00064\\>5f֩6k\u00103Zg츼Uefxn.TP&\u001fl]juUŹ{xϲ\r38Xw\u0011RU]\u0013\u000fߚ8W˧i\u00064hYƖX/7\u000b//aZ\u0016˛nc۫&ϮMP~\u00074hUYSy\u0014Kv|ŗRn\u001eРќw^1݀\u0006k\u001e\u0005uWw\u0003\u001ad/D5ת;џGVNt[Qt?edylw{}{v^>u\b\u0014R'9=:U1jX]ˋʢjS\u0016YuU(+Y״2'cgk~Y\u001eT/ezͽ]\u0016Z%5]I׌eL,s/+y\rڞ*e#_J.KNt͊Xm\u001c\r-:>l]N\u0016W&-<\u000bR\u0016s2:ϊV76U4ͳKӾeձMӱ\\<<۔\\XOGS,NdES'\u0016\u000b;X׶Nv~¶R.^cf1\u001e\u001eߦڌQ/7+ֶc\b{{m\fy!>3>6+W5-R+ۯ^UQmtَ4\u001fZ~k|;Լfb\u001ajri+&+=|YW[Զ|ƕKzn7CГݍwmQs\u0015%5Z\"{h,#YխKh\u00161\f/կZj߾k,J|NΔ̩;\u0011]qq'FEb*[_2\u001bsGlic?x;k\u000b1v.բޮetrڕ%c!f§^V3npBUۼg\u001bРlwMXwSz>Kl\u001d]!UYgƳr7\u0004 *P 띺l*L#KGhϴy栭z/\u0016C>mWLNĨi?6e=wMl!N\u0018\u00131\u00134u/,ܽ\u0010.Zcrݮvm][6Snb~wDk\b@T\u0013\u0011Db@CH,!\u0000aZ=Uo#3޼EM}g'6T-dMO5D=<n*\u0015*W\u0013ۢ^jǲX-KwN*eS=NکǪhK|>TktٻqY\".&g<ͬB_-p8mY]\u001e/.\u001bܻyu\u000b[h}yIպ4xk;[;Η*&2e̸X}}鮏\u001b397m9q',{/W\u0013Fve\u001d4N4UD;}!\u001dOzCk-,.)-3\u0013U\u0019WFXC+=EdLEN]E̲6%\\MxO7d]R*nU[s'SC]k20W\u0015j\u0013i?\\v*m*^dMylkX{vzu[̪zzkL{}M3Nڶ\u0016emڞyVN\u001a+W1TS\u00173*<-M{ʖk޲.\u0013!3i\u0013N\u0017u\u0019;\u001b^~\u001bo[c%E%2ޚ^Z,-c{];m-1Y\u0011v]c5L5ED<\u0016/j62ic2\u001e\u001duV\u001bjY[Zfȯ:j6YDT{+U\r1\u000fa֕mTLk_}ƈ3\"5Uv\u000eM0?eV3;UٯW.Mb<Zf7o\u0015V>UZo嬪BkfLyX}VLoYW4ԋ~\\ud3\u0016J\u0013EɈm{Yzd[f*\u0011ʲh\u0015Uھ:䭽N~.e뾶<䫥%NĩhUV9O\u00109-vg2\u001b0Kii\u0013\u0015m\u0010\u0011.gr.WR])ʻb\u001b\u001e\"pM+y[ejkwgV\"+ZzĮ5LN˭7j^þBH\u001b2O;00fSj驴xժT;\u0015|\u0018՞yX\u000e35{l3곐0EU%Fnlf,>MhJLSm~/+\u001a_.n\u0015\u001e\u0011sD\r(\n!*\u0001\u0002\u0001s\u0011\u0000\u0000\u0010@\u0012ł\\0\u0018@?\u0014\u0000\u0004`&>&,\"\u0011q<\"\u000er\u0010P\b\u00041\u00182\u0006\u0019ƌ8\u0000Tci\u0001\u0014ƤUG\u0013=\u0012U\u001cg\u0010y\u0007:ｭ$ƬjȦIJ\n\u0004;BY5lIݕSѸ$\t?\u0005\u0012o)0x\u0006\u0003jqM8-I\u0000cnn*Z\u000e{\u0013\u0007\u0004\u00171+/q1!F\u001dfg)D\u0002ʹy{;\u0011>A^\u0005A\ftJSnlT\tf=\nt8Lϡ\b\u00110\u001d5(\u0013Q@[Z\u0002D#\u001aT *y (mf[pl;a\nu\u0015X~+j\tY9K>'땳$S[8DDMj\u0011^J2G}ou͖gl8{t\u001b-k^6\u0005a\u0015_3\u001a)gU\u001e)șBy\u0004\u0000C\u0002y\u0018_~\u0012H\u00014mqmWP(ݞ{1\u00121c3\"\u001e\u0013l\u0017rl\u000b\tEHgeDWWt@t*nщ\t\rg\u0017\"9EmM\u0007vZ G\u0005O@\t`O\u0002b7\u0000\u0015\rj؁K\u0001\u000e\u0006\u001c<VKFh\t[-\u0012;G\u0017عj\u001b\u0019Q[=\u001dp\u0003Ǽˢ\u0010\u001d\u0007\u001d*+fMZ0~{7\\<=Urv|\u0001b\u0014eTa`\u001c18Zwt1\bhh\u0007]F\u0016(\rwCP\u000f;\u0004\u0012+!ȍLEoBp33i+Q8~{\u001b@#Mmsˊ\u0019#-X\u001a;6CyN\rH\r.jؽ\b`.7(\u0010AE:B\u0003\u0011OfX\u0004,m\u0004,\u001bkcGM\u0010\rvs\u0000A\u0000ܠ\t}3/%IP\u00045vH\u00117\u000ebo\u000eV>U\u0018\u0004\u0016\u001dƉ||}H\u0003#'FTrSo\u0016nOs\u000ep\n\u0012z[vzc\u001coeѢ.j\u0005\t:t\u0000 AW2N#\u001c]nJ\u0015\u0012Fh9.O_\u0002\u0011ݱ{3xEБݦЛŢw\u0010\u001a!JM\u001c٩_fk8\u0001A\u0002p^\u0000\u0001=\"vo\t]\u000eX1';jvS*t\u0010G?\u000f\\}\u0013k()8&DuR'\u0010\u001cspSv-Y\u0000\u001buk]\u000f׭a,$Tf7\u000f\u001fC3H%\u0013-ڲv;]b\u0000rsz\u0015~\u000f8\u0010I\u0005s\u0007Л^ӓ\u0007u=0\ro8>\u0017\u001b.\u0019@\u001c2E%\u001e͗N/\u000f1]S\u0018W\u0012*\u0002ʑL\u0004\u0017\u0013fZ2?J@L\u0007}(\"\u0018_B#4SŌ\f\u0001P^爐:@)\u000f\u001743\u001d沫Ld?[q\r3\u0015 \ry\u0011ǙQZc/\"?7!\u001aާўx\u001f״e7\u001cn1\u0004~>b\u0003xC+<]\u0011\u000e\u000b]HeEW}ᘂ\f\"P\u0016j@,$\u000f%\u0015o\u0015<\u0006\u000bD2쵕\u000bg.\u00058-}LF\"lRsbe*@j208\u0018&`4PAw+H\u0019\u00185G#\u0004\"%BzZě9㎷%\u000bS.j\u0002ۚާ9E\u0004\u0013\u0014\r\u0003vzI7\u001dt\u000b6M%-;\u0006\u0019\u0014ઉ\u0011U6\u0001gZ\b\u0015'3xc[V?+S,\u001aqpb+䙶(\u0002\u0002\u0002Ĺ#WL(#>\u0010\u0015U\n\u001e\u0000#EUbI|7w\u0004^g,/G>D1Sp\u0011/ɗ\u0000\u0019\u0004Vo\u0007)/?DD[.kK3\u0000z\u000f*9\u000b$ZRsO)¯iVGCF\u0007\u0014`s\u000eH\u000e\u0000\f\b\u0005O#\u0010\u0007rpdr\u0000-BZV8g\u001cZI\f\u0007~d\u000e\u0004-:sa@TZD\u00142\\ !6X:\f0$|?^\u0006 _$%΁-ZgzUH98　Vqٱ\u000eQ\u0016|9\f\f+jaK)fT|r\u0000@(-eS\u0012\u0000r6\u0016'ym0c\u001c\u0014\u001dDd\u0017S5ېq=3v\u0003Z\u0011WuƳ)1a)u (|gԟeTi7ֳ{y!%ń7%1\u0007UA\u0019\u0011pĵQ^\b\u001d:U\u0013\u0005Y\u000b)ǤAk\u0007\bk]łvj){*Ճ\u0018|i}8&P)\nT`+M \u001c^\u00186e\u0005˧\u001f\u00036\u001cXp0l!K\u00057%ms\u0016\u0001\u0010>N+\u0006$s@\f>7\u0002y~mZEn]>Z\u0003q*@\u0011z\u000e?29 2GH\u0007]k]۰$FŶ -R\u0003$dsZBwS/\u00077WƱ<\u001c\u0004E\u0010BQ\u00047\u0002TKjbfy@߷\u0000:\u0011\u0017\u0000k\u000bm*GʢNp9Iu\u001d\u0005ٹ4\u0004\tܔuwg$\u000b\u0003w^:t&}>G$ӧpHC\f#\t\u0003?٘Ϙe򼥎Jg#)\u00194\u0011HnNN%o\u0004qJ\u001e\u0002cV\u0019i=H\u0004\u0000H(@h\u001bO\u0015^!B\u0007c8A\u0000yy+-b/Mߧ V\u001fJ;\u001e=cKd?簞:\u0012\u0007\u0015[\u0004Ńy&~\"ߓ@èsCg`e:-9\u0003\u00197lwJ\u001c\u0017\u0015-\u0002*cBkV\u0016\fPOɬZOk@9Jqˊz/km42\u0000\u0014C=p\u000ex1YxE\u000b\u0005X\b>H\u001a]6? \u0018j\u0005YL˂_ش;\u0001-P\u0000n\u00025\u000fK'\"\u0011rg\u000eV|h)2YB<W0ȷξk\u0003arh(\u0015oV?*+P)\u0007+alދB\u0002$l\u0004п(\u0001\n,԰t*c;m֝ 0\n/𙤢DLo-:vw\u0013X(/\u001f\u0018\u0000~([i J˳oi\u0015l yWR=\b]\u001c0cOV%\r+\u0001Q]@O\u0017,ɯ2I\u0013Y<1-]y_h'+\u0000\f\u0004\u000b\f \u001d\u0001j\u001e\tw$達^!Zӧ_NIf\f5xlzu#`x(B\u0014A;E\u0010˄l\u0014\u0001\u000fN\u0006$yZ(C3\u0003\fG tn \b\\sr2^;i\u0016}%`\u0000\r\u0000K5ToT=\u0004j;;M`.\u0007G~\u0004&ڑUIO\u001eLhH\u000fVkA\"t\u001cn!OX\u0003#W4\u00006\"\u0002HtQEDWn\u000b}ox\u000bV\u0005\u001f\u00003ST=kFEis=2}x&L(\u0001ft\u001a\u0013mC^\u000e\u000b\u0004\"4~U6\u001d_Fj;a\"&\u001aJW\tB\u000fV#@6\u0013`{5;84Jy\u0005V!ÕZkck\"xJ\u0015)*zuKqe\u0012w\u0004I\u0001<\u0002v\u001f\u001a\u0015Dk\u001e\u00044H(C:I4\"]B\u0006\b0Q \u000bU\u00079=\u001b\u0001\u0003(L\r'׉ɂ\u0016`\nD2)xeK\u0013zO\u0003'w?mO4$Rcœ\u0005~Ni\u0014u\u001cRioʧ\u0004^KR$@\u0004߅a]![\u0016Wr?o3;[\rҼ:k\u001aA1J@¢}t|\u001e2*dDF]Dڙ7ij:!x#W4\u0017e\u000eCN*\u0005m߇\u0001U\u0017\b\nm*7.g\u0014\u0000\u000b\u0014\u001b~F3)필U0or`#wih<y^{KȮtdՁ&hz+{\u0002s>N]]Qᓎ\u000f!\u0015ޮ\u0012\u0018|v(v\u001e@&\bYMSљ+q$NEժoL\u00037P2u\r0\u000f6Aaؔj:ye=CSTz&\u0018D32\u0007c6=\u0017!YЭ1{Ǒ\u001f#[ͪ\u0017c\u0014ŵ&9^HT\u0004\u000e\u0014e:VjFB\u0015\u0006M9\u0001wd|ϰҰ\u0012PLd\u0013J\"[+\u0017\u0000eU\u001c8yt\u001d״5oɮI\u001d\u0014kD=Vx<?>\u000b\u001bCgXM\u0005qrB~Lf~ř*\u000e\u0004\u000enM\n`\u0016\"Z#/\u0014\u001eUxQ})Fg\u0004uv\u0006\u0012K\"7qR\u001d\u0004\u00173ɤbA$i$\u0007\u000es-5yq}L;ݪlu\u0003Bg\u0004QAv\u0014EG#\u0006@ӰT&ZiB!\n\u00141WUn5ZZ}\u0001f\u0010j2\u001d\u000e\u0006\u0006\u000e$\u001brjfz\u001c9s,\u0003~n:6V\u0014\u001a㑪P\u0014]6㮸\f4*I݄'{fJ?NuRFV*'IF\b4>[ʧBS<4g`\u0014؁g\u0010nt?ЂՁzWs1\b/W~mMUt̜AM(a\f\u0014ED3gj7\u0000˩K-m#]i<)e#_kӷ}eg\u0018\t\u0001\u001cO\u000b,\u0001\u0002L\u0019wMP\u001ahW3!\u001fH(bЯ{\u001512oyMavXqߨ[h^\u0002/H)k\u0018r%mJgA\u001dG8>㍝2\u0004m\u0011\u0018͝uQ,Ҹ51UMD\u0016\f%T\u001bn{D\u001dԺ\u0000xO \u0019w\u001bϛ'͊5\u001c\u0010\u001epA0s\u000bˠeՠ:WBaj1:)n(?ڒ=>L\"l\u001aZ'7!?cbMk8q6(0d\u0011\u0006A\u0001uʈWbx6]+-af\u001dzyo\u0019.(3\u0013ZXaK:՚nWOѽmB\tX\u0005-@1u/rQ+VeVQs;v~SĴ-` 8XtPul\u0007\u0017U\u001fb\u001c+U\f,>N\bֱ\n@\u001b(\b\u001at*kY\u0014\u0013wq.\u001f\rVK\\/\\&~0'.[^1U\tbu4\u0006i)RG̹Pi\u000f\u0014ɣ?mKiM\u0015S^ͲDu\b|[Bq\u0002{uizUrd~\t5my⬳\f<:\"\u0016|l\u0013\\loYW\u001c*A2|l\u0002\n\u0003(\u001bUm@xEDe\u0003\u0010e\u000ft1`K\r0>\u0000JQ.^0!\u0005!BUr#RE\u001d(\rMlLb\u0001\u0010:\u0013A\n\u000f\"2K\u0014Ok&\u001d\u0018VAE.{눗\\D,\u000fjNo\rL\u001fGH8O\u000bA1\u001aM\u0001\u001b§qgZy⾳.\u001d(ǊK(D1FQU\u0012`LQ虧\"Ak[_I(65gd\u0013u&\u0002xM&3kĢ{\u001e3HIݍƃ[j\u0006:x0S@0Pb7?\u0005Xd\u000f\u0015\u0006@6k\t\u0018C\u0004[H*y\u0006\u0002Ae\u001d8\u0015\u0014Qoh\u0013j\u0003XCR)n\u0003\\bc\bLp\u0012A\u001ebhȁR\"'J5%&\u0013OkT*B6Bn!zd\u0012m7\u001434l\u001b֤;\u00058dRgiTdx_.PH@E&*STo\n\u000fc[*5\u000fIn\u0014)>T/w0:bbօ.8gojΚuo\\%nb!\u001f\u0013\u000e \u0000\\XR\u0014f?(|((H7(R3@,\u0015\bpY{ڧ1\u001d\u0015,\u0000񮲴p5T\u0005JJ\u00062f\u0002E>\t1ڲQ9fڐd{3Dzcs-kO1V']9\u000f=P\u0012n\u0016eo\u0014C\u0012ȣ\u0013=.\u0011\u0004;\u0000x*&/2#3\u000bi$g\u001cL VWA\bF\u0000\r\u0010>IZ\nVqW\u001c-@lac\u001cqJ~?\u001cGg\u001f\\iT\u001f)}B\u001dqІ^c\u001cYZI}j\u0006N\u0019T@eαU۪|l\u0012gk\\\u0018\nx\b\u0006يʧP\rAj\u0002Ag\u001b\u001fR~\b*iy\u0019/s[\u0000)<\u0012FET'S䴸nih@\u0004}RPK\\~9\u0014\\\t3#Y\u001b\u0014-;\\Ķ\u0007s5\u0010\"']\u000e<\u0003B/-.]3nQB\u0010\u0013z\tmRDO\t؁tE)\u0012#8Tqq\u001aO4\u0013WwMt\u001b$\u0005H+⡘\u0003GߘLN1DA\n&4\u0006'BDT\u001b\u001dR\u001f~,`7\u0018\u001d)~؏<Z✻!(SS<JhP]\u0016^;*@q`mDH>[>Ug%4\u0018/٪X0Nn/ǸCf\\fja\u0018}a\u00040a\u0015H8tq+P\u0003X\u001a\u000e3]Q\u0019Y0H\u0017`\u001b@V\u0014J2*\u0006)N2O\u000b]n\"w7SyUduB\f\u0010A߹=7|,}F\u0018J\u0003\u0016QfH=SR\u0006Gr1a\u0016сdRXf8fϬ_dBc\u0003I[s\u0010*r\u00104bl^YtL\u0014\"\u001b1QmP\u0015]\u001ay<\u000e\u0006'5/\u0014RA=Ԛ\u0002iW64y\u00155Rg\b\u0001(\u00168\f\u00198hh#?jx@anh]7Q$\u0002e4l(\u00195JC\u0011Pg\u001fjFlgޛ7[\u0017Cr\"4X6(R4LQWĺh~{BN\r0#\tJd\u0004[#%x\n)CԾ\u000e\u001f5CjFh:\u0000G\nc\u0010\f}\u0011hڸe\u0004\u001f\u001caAYr\u0001~*-OhE}~׋!o\u0013Y?+\u0014ce\u0019&ڞ0JA3%hԬAL¯xl6FJv}\u0013a=S|g\u0017\u001a\u0003\u0019N/P\u0007u\u0006\u0016\u000bڳ9\buS\u0010uztA\u0017dqlPopγЃ2WhI/\u001d\u001flU4ȉ\f\u001b\n2\nbrc44JC!\u001caCI\u0010r샊1\u0010*G\u0005\n92<\u0014h/{Q\flشAG&\u001d\u0012%}C\u001ch}-z<{\t\u001fM\u0005ՌY.\u0010\ni\r\u0006a1ƴ\u0000\u0007\u0012^>Wܔǖ&AmO|Bnh|nS\u001c\by\u001c^{)Qs\u0013Vv)\\*C\u0015E\nR\\o\u0017[\bu\u0012T&\r\u0013%{3\u0004u\u0002pT'3˿۬9\u0013ƪ\nE^\u001ef$G_݂k\u001ah3SOAߒٳƠ,3\u001f43\u0011K~ea0rjQv{h2\u0014U엖L@\u0015\u001a\u001bU\u000f\u001fNC8L!|e\u0001\u0002\u000f|uƘE`r\u0017hIotpi\u0004\u001ee+0!\u0011ؤ.\fh]q\u0012*~/\u0001\u0019I1\\\u0014Xq.`j!\u001e?s67\u0011԰`+?>MҞXmxDQ\u0018\b\u0018n\nU\u0016L+QDS'j\\},P?_uD\u0007U\u0002k!\u0006G![,KqBF3hHC|\u0010R⍟wOes\u0002bk^\u0012-\u0018kWt\u0003\u00014\u0010p0I8Шv$R-zcc:\nq5vG1\rJ\u0004.&\u001btP&֫\"Vd8.\r&'~1\bweG4L\u001fk\u0019x[{D>\u0018PNu\u0005\u0019W;߼_WO]j*\"~ۡ}\u0010OR\u0001$+rlk(M)c4\u000e}OHI\u0006`2,iywK%ΗL\u0005-\u0001z\u000e\f*a`씭2רQT=a$\"i VG\u0014 k}E\u001a\u0006\u001bzy=P?Tpۇ\u000b{y\u0006g\u0005*,\u0002\u0018\u001d\t,e\u001ai\u001b\u0012Ԍf&\u0003\u001fi\\V\u001c]`(H&;uN\u001bɐ}&~V\u0007HZG&d*ekHLI\f'Cq'<a:\u0005噦X =M\u001a\u0018\u0000`Qi4885'o\u0016'Ta_Eg\u0010w$\u0013$`lIJ?\u000bꍉ\u0010}pS\u0002cǔ\u0002<>=ZuKbJ[ުK7h|7\u00025\u0001A~6KZ\u001e\f0ƻ7\u0019JV@l\u0014α+٨\u00198\u0006\u0003On/w\f(#6٨]R]z\u0004GŽUudv=k@NC-}A\u0014\u001c4I\\HZ<5s)T(ah{QSyQ9\u001d-fDe)}6$6g[LmeS\fʸ)d^m)0h1\u0011b#{NW4#\f\u0016:үɟЋs\u0014Aިbq\u0019Xw\u0012\u0006\u0003\u0019?47VCך\u0018\u00174\n\u001a8A\u001c\u0015=ٗ%\u0019\u0005&}]\tڗGs!Cn\u0010\u0016QY.!/aک1c;[3ۆ+|I\rߑ֘ծ䴷w2>3h\u0007\f\u0002]7\u001b\u0005MŠ\u0011*R\u001a%\"Xo\u0002O\u00061\u001cn\u0012\u0018ǈ/umd%\u0010ksgBQo][4\u0006`S(î\u0000(\f\u0011^\u001f&5=;\\\u0001k\u0010Vp{\u0001\u0006!{\u001e$\u0000RJ^1\u0007FD\u0000\u001bEȴԮd7o\b4P\u000bppQ\u0012|ᡚʯ\u0010O\u0010uS۞*yKЎca)M`\u0013rf)۹3}\"[Ui^G㳰\"PZ\u0004(Qh[\nko\u001eRx%5{q\u0006\bol\bvyJl\u0007\u0010J\u0010X_3FoRa!\fMNVv߽Gl$S(n#\u000eu_\u0015\u00177 \u0011}-#<'aYo\u001dA.dsthLղW@(p`@'\u0012Y\u000b1zi?QiU#6}\u0005`\\fZJQDd`CPrH\nzZg85L\u0015OZv\n}f#\u0017\u0005~\u00057{}nM\u000eN\u0019\u001bu\b-\fj\u0015)#ykp-\u000f\u001dn{1\u000b\u0004\u0005kt|WE:b\u0018)\bʈ>Òd#\u0012u3aNM3xT\u001fmIg\u000fь\u001cQM\u001e}Eפ\u001a-dv-Z]\fR{hg!\u000f\u001f\t\u0005\rQhsl$o\u0018J\fQ\u001edـ1d踒BjVhtq\r\u001f\t\u001bj\u0004S9\u000e9dܚ\u0000S`0\u00023:}ZU\b>\u0005BU\nuFzl\"pHJi\u0003?0rIGfo\u00008hRL~\t@ PVqU⡻/ǷK`9+$3L+}U?L7mY\u000b\rF\u0011V\u0016霣m?1qx \u000f ؒkWx+`\u001dZG^Ylu<\u0011\n\t8\u0016\u001aD%M[L?\u000f\u0004Mӑgm\u0011\"Xl*6b\u0004nY&D3\u0012W55a52C\u0018b\u001c\u001a\u001df&\b\bB]X,F4ǿ;\u001b<m\u0014\nVd#\fXٷ<qF\u001a\u000bpY 41t<{[\u0006-\u0013#*Cf\u0013\u0001[YJԤ:e\u0019\u000f\u0004\u001a\u00071\u000f|`Dıa\u001c)\u0001V3blsg#\u001e\u0001\u0003\u0004;5BchziW%bށ\u0019=H\u001b\u001fn6\u0019Uhq[\u0001\u00173dfثl\fJXWuH\u0010ą\u0006\u0016\u0018\u0011nZJ\u0004+JQk&i\u0019dW\u0014\u0010\u0015C\u001f*ID\bԩl\u001eY&\u0019u\u000b\u0000!?'\u001cw\u000b\fjL5dd}\u0017Y\t_\"~V\u001a`dØ*@ \u0012K\u00121\"P\u0014͝SklˆYWޜ\u001e\t}i\n>2\n\u0002)b9\u0012\u0006!\u0015\u0017Qp\\\nV\u00070>W)E\u0006#s>8]^\u000bcJ\u001eQq\u0017iٮ5i|=MϒcT\u0003L`\u0003-%\u0016(7Ur&\u000b\u0012t\\⑊Ղ\u0001(ɘ~\u001dAoҋ\rl)vUMsc\u0002r%m\u001dՑS~$\u001eq\n,\\88\u0013Db,wDHQ\u0014@wyO\u0006@tY!2=gL\u0002b*g\u00052\u001dKt5ܿYW\u0005\u0011\u0000[xXX]Pخ\u0011\u00186yxKbhp)\\H&\u0002\u0010e#\u0003Do\u0004\u0016\u001fo\u0005kU'<W0g.j\u00168{LSn0eNcSB)i+N߯s7\u0011\u0018v&\u000f\u001cxZ2ʖ\u0010uenR4\u000e+Rđ?\\Ni\u00144jv\u0013_s9j'ʪ/\u0019&)<\u001aԩJ\u0011\u001dɸjTp\u0010i1硅C^\u00185'H9Lfb`\rc&&R^}vZk=vtM\u0018sa9&U$C{(Xpq;\u001awbb2qj\u001e)\"O8!\u001do\u0001\\w-`\nJ\u0016em\u001b6\u000f$dI.B|\"Z&к;>X\u001a\u0001v]M\u0019RӝD\u001a\u001c\u0019{\u0017J!\u0012&DR'KZ={ f\b\u001e\u0002,\u001cLF)xpQ\u0015/U\rh5UT\f2^;2vbK;V9h@|\fu7\u0003r\b坧d%VܕwZ=e\u0005\u0018COs(#(f56\\ҶvTĠR\t\u0016]BVd\u000bi\u0000QLV\u0010\u0010\u001a+<\u0010\u0006[\"'\ndp\f\u0001Z\u0001\u0002I0\\fz%\u0010\u001d\\&\u0002#5A\u0012woFiQ#ӟ\u0011[pH\u0007b\u001ez\b\u001d\nr2n^R\u0002!\u001dr+L\fn&Z\u001a\u001b\u0015FocdĻB\n#\"hד\u0014Қ\u001fd<;\u00132`\u00058\u0016\u0014\u00153\u0011%cw\u0018\u0011b\u0012\b`g\u0016\u0015\u0015\u001cLxQGȤ\u0012U-\u001di\u0016%%E\u0010\u001f<Z(uȴp?<\u0007{0\u001655&oʂpp\u0003V_x\u000f;<\u001dpp\u0005\u001cA\u001d\u001fXRM(\u0011)+\u0012.\n{)f\ne\u000eK;6\u0017\u0001]\u0014ktLf.&Q\u000e/kp{>@\u000buR\u0012f\u0006|\r\u001dSƣFrFT%1c\u0001Nf\u001e\u0007\u001e\u0001d\"\u0010\td$\u0001mVC\u0006QDG\u000e3R\f\"LLS\u0015/9\u0004ymoq\f\u0001\u0017\u0016\u0006t8P\u0002\u0015\u0013͗\u0013\u001at)id\u0010N\u001cp\b\tdک\u00005+S.\t\u0007T\u001d{'S\u00078\u0002\u00072+V(e\u0016\u0000+\u0004%%5\u0011<YSZ9\u000e58*~R}W\u001aD\u0005.НO{p7\u0005ޯ\u0017M3\u000b\u00015;k\u0004\nil\u0011{'s^s\"\r\u001dQR\u000bW\u0002\u0016\u000fJ2[\u0018\u0013\u0000d\u0001̶avO[\u0015m8\u0003.YUDm,d5U{{]\u0010e'5I\ts\u000fC\b0\nNGmJ\u0016\t\u001eCcM\u00012Dâ*N 8NR9^]\u0017'A\u0014\u0011A&3\t\u000e\u0005@=/DL\u0011\u001b6\u0016<o)t*=.vH~\u001c\u0006\b\u0006P\u000bcm\u0002w*BW\t2\u0004D\u0014Yz+g\u000f㓅\u001d1<\u001b\rQ\u0006ĕ&F@fYi\u001cI\u000f]!=Оڕ }r/\u001f/p~hz0c\u0017y\u000e*\u0007;喳\u0001}p?[4\u0004{Ta8Bc3\n Iޕֶt\u001c*,F\u000f\u001e-&UEeĈXeqܕ\u000f>;<\u0012vÿ\u000bI6X^I[\u0017El{\u0010\u000bL`1\u000ed]%\u0007`i\u001d%eB\u001fd\u0019 dV\u001ej\u0015\u000e?gR3o]\u0019!\u0014ly3\u001a\u0006&\u0015m\u001c5I䃢NH\u0012֫2rꦧ\u0001t\u0012\u001cOn|:(#Ib)r\u0010*Rz\u001d=H\u000bח\u0000'9v@(Fǯ0Ճ10\u0010\fqΦoJS2#N}ng5\tnɫ]\u0007⒜0 è,2D\u000e{g[\u0010i\u0005wӰ_\u0000tuPFo\u0001\f\u0013bۦI/I\u0018W%\u000eb\u0005z\u0007Ҝ!\\D7\r7+r(\u0014Gwi:MV&Bt֢B\u0013.\u0006t\"\u0018\u001aV`c\u0019db'\u0010ýo%Qz\u0019C\u001c\u0017_*ؒ/dmBx\u0000\u0011$I\u000f2t8\u0003sb\u001b3A\u001ag_>b\u0015|\u000f2Z\u001ffgյO4\u0001bÁ(keh#m\u0006\"FqPH]\u001c1Z\u000fG\\1RE8Fۋ_qbE]\u0005<\u0016:CPd\r\u0000Lg\f^\t=\u001c\u001e\r#K4f}s=uRS\u0016sc!ޠ\u0005\u0001ԬL;\t\u0011F&}1p@\u0019ʷ~\rB2\u001a\u001f)~\u0012\u0001y@Ii\f<GƧhY3\u00057GE}$H\u00109H\u001a1KcՔ\tt0C\u000f,0\u0001\u0014L\u0005)wZ8)Ә}aA\u001ds\u000frY\u0004졒\u0012&w:\u0012I.\u0012E5AL$\u0003q\f1\\6<\u001e\u0016.\u0014\u001b\u0007\u00028zL\ruG~\u0018S.urq\u0003\u001am0\u001d$\u0000m\u0010|G'F+\tS\u001c1͢ʠ\u0014hzcX[*]\u0007n\u0010i](-\u0015\u0003\u0019C/DڮwT\u000b'H;Ε~娖W \u0002mL*m'hh\u0001|\"TB\u0003kVԸ<\"\r,\u000f\u0005Hv7ǵ5\u0005?L+mM\u0012\\%:ub~O&ydcSgZYikj/[ךa6y-v/Mf3|4r5Mq_k\tmM\u0015vך\u0007M[S\u0005y5\u0005f[\u0015Z\u0005z_\u0003'Я@ճ8\bf\u000e\u0015P\b%y\"\u0019b\u0019Ӭ9xhj\u001d(\u001cέ\u001dr)P\u001a\u000fmz$/\u0006J>!\f\u00157ƽx\r,[G\u0004\u0001P=|\u0000\"\r[80w\u000fԝ\r\u0015[(\u001cC\u0015kN\u00146\u0014nJ5es\u001erh7\u001br[\u00165\u0018}\u001e\f߰K6-1\r\r\u0019oC\u0015mYVXQ\u001c(h\u001a\u00069[\fЛR<\u001dyz\u00051f\bIcu1\u00188\u0015{\u0005gr|5\u0004(8Ves_?b6\u00153ӷׅ1:򁰵\u0014E\t\u0007}\u0006M\\w\u001ao\u001bWé\f>fF~G\u0005\bĢ}}\u001c\t表Mw͐F\u001c\u0016\u0013\"ICW62vQ\u0017\u000b\u0007A+3\u0018HZ\u0011E\u0012UsRu]@TOD36!9\u001cT~*`ǚ/;\u0018\t%eNYOr`<2AJ^Dl\u0014\u001dPXcR2޻q\u0006q(P&f\b\u00118_ׁ\u00024\u001b-T@Bw^]o+\u0013BIard$\u001f]ѮU\n]dPn\u0012WY1\u0000N\u00114O?n.\u001a\u001c\u0007\u0016Vb\u0001ǡNO_˔,bG\u0016dy#\r*Y#\b'վm}}euPRNn3,%;'_W\\jrO!v\u001dY6[;ne4v)f)Y63Ђ(WFU=F\u0019]'~d/d% \u0012\u0007\u0001i\u0017`?*\u0005O$.\u0004B3[C:\tB\f\u001f\u0006m~{9Ct`|\u0006Z(iI0.8} \u0006C8$\u0003<\u001d#i5dRi\ru\u0010\u001fY\u001bqPĉ@l4\u0011N\":v\u0014}hÝD~\u001c&LF(\u0007bH//PH+޽@\u001e/r\u0010\u000f\t:CY\u0002q#Prk\u0019ӔeGs\u000e\u0006\u0002\u0011*\u0006E4C\u0014L\u0019\u0014p\"\u00053)≯B\u0014\tc\u000f\u0007mg\"E>_A\u0011m%i\u0012J<rr\tϢB:2.x3(r@\"\u0014R+߇t`@,,d.D36\u0013H\neGzpݻ\u0005\u001a֤<[;㦻ЭCN\f\">\u0018[\u001b\u000f]SVGA&SW\u001b\u0007lq@\u001dA\\'x\b'\u000ern|>u@\u0005\r\u0019U= LݘT$\r\nT%\u001e}oG_'yI\u0001\u0014_i2*\u001d6wY\rw:\u0013S+`K\u0002\u001eVޑzݸ\u0002JzEQ\"ht9\r\b^30\t<3MNU;ndø7\u0017\u00002*Q`Kr@dQ!CBcHS5\u000fw\u000fg\rX<\u0011cn\u001e+zNѴn\u00109Y\u0011\nϜ7AM+Л(x$U\u000f\\4\u001c4^©q։-B\u0016G]_\u001e2\u0010\u001fGZtu/Eha*e\u0004^DGĦ5f|BBնEպ\u0001XAY\u001e\u001a!)\\Ϣ1\u0004M=\u0016vѥ\u001eK#![\u000b8m\u0011Z]Tn\u000bQlJ$dy@1<7k|KVngGC\u0015&\u0019\\[Ԡ3v\u0011JnY@g\fx*t>\u0013HE\u0010%;\u001bs2Ј\u0005tj\u0016\b\nSO`}X~\tc]@-\t9\u000bT\"<7tfLL~^SO\u001fQ>KIE\t\u0010\n\u0001\u0002\b=aD6\u0017S\u0016҇K.)N״OnR\bT{Wn\u0000iU\u001e\\n?R\u0015cd/\\Pgs#NR9\u0004y\\l!DpΆq\u0005*%t%\u0015AG\u000f(RJUv\u0013Pi~XJƑb\u0018Fֵ/\u000b$<\u000e]\u001e\u0007\u0002\u0000ϣ^aAu\u0003\u0017s\u0006W\u000f\u001f+\u0013(\b\u0015\u0002x^^CV\u0003\u000b*\u001aEl\\1q\b2wyḠKm\u001awBq\u0007\u0012ǠO\u0011|aJ:TP\u001939+zf\u001bp8g6b^4H+J\u0002x3}gҮ\u001e\u0010\u0001xr\u001a(L,Ծd=zdu\b\u001cK\f=}\u0005/\u0014\u0005=\b\u0006nw\u0014TCI~z#T\u00000\u0010>\u0012D}gE3\b!^=((s*K\u0003v\ntwP-\u0016~\u0001wd^\u0012\b1iڻN!}\u0002QxpZߣ\u0007ݖg#\u0006|ds\n|Qr@\u0014zV!B+\u0013ZP*kV2{tY%k\u0006O5M;B:\u0017M\rpE\u001a|ԯw%ˠ\u0016l4n/hװiEX)z#\u0018\u0001^q@o%4:\u001b\u0014Mw\u0019v+vϺW\u001c\u0006ѿ{-P\u0017iQC0+kq@F\u0000#{\u001a\u0007:يhu\b>\u000fA}F0Dz\u0006Xc8Aw\u001d\u0013e\u00034\r_]>Z_\n]6|z'f*\u000bЍQS<\f(/T&\u001e@n֫\rî8pľcT3T\u0007qS(B](H>U\u00195Ql\u0015a\u001dktUgCV\"SG-\u0010u\"GP/\u001d׈\u0019\u001aOF8<B\rD# zG\u0004v9(\u0013xǘG\rz\rq\u001f,^!\u0002Od\u0005\u000b臬\u0010GTiҘ8\u0000J\u001d\t\u000b\u0014r䫎<|A}\u0001wy\u0001:ѬY\u001aB=Ⲏt\u0013:JpW^\u0005g\u0011q9j\u0012 Ҿf\u0014`;<k\nj\u0006\b\r\u0015OaAY\u0003;\u00182@\u001ak\t\u0007\u000b8v\u001b\u001b\u0019\u0012'(R4}\u001d\u000b\u0014\u0019u8-\bN [\u000fm\t2\u0011A:3`Ũ3&mҫ0߇\u0003mȢBF/{F\\MШ\\\u001f1-PAB~,0X~eC2\u0005\u001a|M^?o \u0011FZ,4\t\tF-\u001f\u0017~~R\bP\u0014=A\"e+,(,3N@\u0004yS`\u001e&Z\u00108Ҧׂ\u0011PeΆm\u001fRt%5%8yTJF\u0002x4\tĹ&N\u001a\u0015\u0018> N\fPɨ~ܗ<j\u0014.-;\u0015\u0016N\b\u0005?㊆7\bƟA\u0001ؤ\u000e\b\rJXq𝌴\u00153D\u0006zv|S\u00057z\u0000M`ӯ,i8O\u0013`\\!]`j\u0015< \u0015K\u0007\u0013UA\nD\u000e\"l[\u0019wOג<\u0001VC̾\u0015\u001fp8<\r74Wr+\u00032]W\u001fڔ[lW\u0011\u000f\u0003\\)A~^oN\u0000/\u0018f\u0004}ąO\u0001{;'\u0002.Ӽ\u001e\u000biJ\u001e\f\u001e\u0006\u0002\u0018x<\u0013clJ%\u0015x`\u0010)\u001cVHU Z\u0006K{[\u0013GHL_/\u001e\u0015&\bvG\u000f/N@=/f9n\u001fV+a\u0018+K\fx~rd\u0007L)r\u0015@E\u0002\u001a[~-\u0017&:3:m8Ĝe\u0003]0\u000b\u0018\u001cy]V/ڔ@Q'`,9T[x7۳\u0017\t\\\r6ŋ\u0007vGw\u001e74L>4\u0010y6-ӯ\u0016+\u001fz\u0001l\u000f@(*e\u0010J\u0013ʂ/w\tD\"JD\u0018a\u001f1-߰_6ΏѲs\u0003cM\r\u0019\u00072\u0017ľNx\u0016PS_\u0014n\u000b\b/AAQ|\u0018\u000f\u0010D:ݛ\ry~\u001eVgAq?l\"ro3F\u0005E4`\f1`Fbp!F\u0003#\u0016W$\u0006\u0014\u0001Sz,bwق\u0000?\u0004<MP\u00005WJ\u0005KJ?\u0001}x0\u0007P\u0012j@˕U o\u001bytn\u0010p\u0011|guCa;:>\u0019hܜF\u001c\bYw2v窜\u0007\u001ePW\fMF\u0005\u00036!]1pz=\u0011iF%[2#:/͙D0?1ig_\"\rT\u0015\u0014L,<&\u000e^l}Qh\u0006^\u001cI\"\u0014ߢҰVbD \u0001ѻtx2QǺ9LT(4/\u000e\u0019J \u0015\u0003\\\tou>\rh\u0016E1۶ɓ>6֮\u0002kоcmC0\u0004 \u00052g%\u0000M\u00012/4B^S6\u001e3\u0016j\u000eq1w!]$4\u0004!|o${\u0012@`#bMCm\u0018h}J kQo\u0006\u0010/\u000b⫞y}덾\\/9 \u0011\u001cӇ\u0010c\u0002S;͝>I`;nW`P=؋??WsEx5\u000e'|p\u000f\tnXGhBޢ\u0014\u0017\u001b^\u001b\\-R!\u0019*\u0000b\rH\fֵ61C\u0004m(A\u0002,xh\u001c+ܱhe߿qUSbkW\nL\u0015\u001bD{!lo\u0018\u000f\u001as$c\u0004?\u001a]LXU&#\u0010YfЯ1\u0003Tr*Í56G\u0001\u0000úƲw@*\"嘢\u000f5f\u0017\r0ü-G.h\u001d\u0002\u001eɬRw籶ޣ\u001aS[\u000e\u0002zdeR2\u0010OS\u0012=\u0017| p$\u0002=)\u0000cf\u0011\f\u001eٽsˊt\\7$\u0004z[VZjT\u0018\u0004\u001aWZrD2X\u001d%\u0018\u0002NIesT,\u001dJo^<,*a\t\u001duh}0:\u001a#\u0017\u0007*\u00002{{\u000e\u00046ԃ' P\u00018\u0010O}s/\u000f*\u000f\u001e@\u0016w.\u00161aS\u0000(g\u0002\u0006\t0♀l\u001c\u0001R0\u0001\"*f\u0002.?\u001ba\u0002\tH`;8M`\u0010X.f/+\u0012Oo\u0006H^\u001dp$DL\u001ai\u000br\u0002\u001a%\u0014\u00115\u0018T}J&?\u0000G(r\f$wvE\u000e)v\u0002cwύstk\u001b\u0014X\u0010\u001e\u000by*7\u000e{-\u0002J\u000b5mᕐ1ziJ\r+\u001e`C\u0010\u0016\t5\r1fS\"hL'\u0010I帥=rSi\\@\u00053\u00001\u0018\r#I\u001aAO?3o\u0010\u0016a\u0002a?wL>\u0018\u001aK\u0000 .!\"\u0015E)<\u0010msflCo\u0002O_:ҕf!Zqh}|qg\bW\"rՃ\u0018 bn\"?7e\u0005r!wbW\u0019$=|m\u0010AlI\u001d<\tm\u0011=;Oh8\u0011\t=\u0011\u0013\u0007jLăhOʒ\u001bl\t\u000eq-4f R.;\f\u0013izʢ\u0010\u00116\u000b}{r(:C\u0010g{ÁĜ?2V'Ģy\u0012Y\tpړ۱'\tb&C%{O0]H-\u001d<9\u0013\u001cēo=\r\u001ee.\u001e؟<\u0013t/\u0014OjJ{\u001f幣<Rl9\u0004#oc'ó}yP]ó1\u001d\u0004H&Yѓ=iPX$zimUV\u0004D8N\u0017w6}|QPOBVGƩ\u0004zpyOJ<NI\u0011\t8cY\u0013B\u0004E֞w\u0003wۓ+\u0017Ǖ䞜\u0005\u0007O\u0000_{>.Sr\u000eڮ\u0007\fߛf\u0018\u00044\u0019͜{\"R]hE=@S'ٜ!R\u001f鞄c\"\u001c\tZ?~/.)G'eՕPx=\u001e)[nAmFP\u000bx\"\u0013Y58ǫ\u0013M>T\u0013\u0016^(_P~O~v;vO*\r`̫\u0003nVIIɟIN#\u0013œB{rl\u0017xB'\u001a?8^{OxU!'\u0019\u0010'\u0013\u0015^!}'.{\t̔\u0014\u0018\u001aI~JQ\u0013]~SL(p\u001f8a\\و,+G&\u001b\bV@c\r7&L3IpSeQ\u0005\u0014xE9+ج#\u0006Sx@\u0000r\u0001\u0000=$lp\u001c\"\u0019oNz]\rb\u0003i v9.2\u001d2f>\nЯB\u001dI\u0016r\u000f\u0004\u0004g]Ģ\bTWٓ|^3\u001fg=If\u001f\u0015l\t4..l\u001e8\u0001ⴊ&іG;\u0005^%&@ڠ\u000185\u0012n\f\u0011\tfF{\u0019v=v`~+w\u000e\u0018\u0018I\u0000JS\f\"0oB\u0007\u0013(bO\b\tqNJed7m\u001d\f\u0011\u0002\u0013\u0000\u0000\u0000%0Q@Z~ç鞟LnQHӒ<|Vϸᣏ\u001fu\u0018\u001dNlz\n\u0015,2\u0013ѨBHx*I%\tjs3(GR+Rc^F,NPlɦ0uw\b\u00062:pݝ\u000f\u000bF^m[dZE\u0006]B(=3\\pشj\u0011z؛\ndL=V5LU,R+Rm{g\u00051}\u0015jև؇\u0012BG{ҝ3yA3}>$\u001a##IŤRg\u0017Fb+\u000f\u0015\u0019fzi\fG#\\I\b7\u0019\u001fIlt\u001cv\\R\u0007\u001d~ZĤ]J->h\u000eaRTYIOnde\u0014\u001e\u0016\u0001\u001c\u001e\u0016xX\u001f_;rJ<IC\\\u000f\u0003@SrSt;$wcGFԃx `@b\u0000CC\u0000\u0007\u0006ch5<\u001dl*mu,٩O%iSgq.\"U\u001ep\u001a¬?X\u0010獜Q:$3d^BlXD!i&t<qZb\u0013M\u001aq6B'Ihgጵe\u0011\\jxN\u0012rϦB45jᣜN9\u0003RAX\u001d\u0007I}c_u;ϒڸ\u0019cv\\9\f%&җt \u001dj\u001eo\t\f\r\b\u0012\u001cX,\u0016\u000b\u0003\u0013.Hp@Aq&$Tp& \u0014\u0007'\n_A+\u00000q\"<\t\u0006\u0007\u0015,֫\u0017\u001aB\b$]R&u\u001fux^HҸ~v\u001b7\u001c1},SBt<]r:)5Xv+S>\t\t\u001eWĠަYu>L%t}$\u001du\u0014a'k'\u00136-oR\u0016s\u001dbfLtғ\u0014RQ&b}%\u0000\u0000d\u0010\u0000\u0007\n\u0000\u00020d\f\u0019$Y\u0003\u0012\u00000b\u0010\u0000\u0018\n`\b\u0000\u0000d\u0000\"D\u0001\u0004@`l\u001eFP˻⚚\u0014Ħ\u0006+UrX6)jmAdQL$\u00048b׷\u00018@^z0}>27=Α\u0019ӘJ۫(\fW\u0014պͥ\u000fݘUG!\u001bE\u0003fA\u001aQ3lf\u001cj\u0000ܺx\u0015T+\u001fBkkr\n;<X\u0018M\u0004ĸ&\u0014By'\n{\u0016\tjᔺcc\f\u001d\u0011\n\u0014!h\u0011\u0011;hr+-Ծ\u000b\u001c*#\f\u0003Ijzh̃\u0018\u0000\u001bc&y\u0016ד\u0005|䈠\u0010WԻ͸&{fcT\fCrc,i)-+GJրTD cz='\u0010KL\u0013=\u0017\u0010\u000fAV\u0018څW\\'\u0005&9vh\u0010I\t\u0012\u001b\u0001;\u0002_.bz\u0019(gKV1\u0005/\u001e\u0001\u0007/-ibR,ŵ\u0000Y\r\u0000-QH\u0011Z<;3\u0010+Ǜ$EN6\u001b\u0005\b}\r\\\u0007\u001c\u0002\u0003y\u0012\u000fn\u0011T\u0003礞I\fsit\f%Bp\u000bk\u0018޽\u0019xʌҲ\u000em͵vB8d-{+\u0000S\u0001_r\u0000`0w\u0013f\u0011a#\u0005F|\n(##\t3a%|[\"-.P\u0014EN2[\u00042xZɣFz\r&h>~.\u0018C\u001a=vj$|պi#s˒\r@\u001a\b?=?\u001c=ĎzaD\u0019Bp@\u00141\"\u0017\u001cBֽ\u0011L9#^.A+1\"qŗ\u0018\u0010eHi\u0000s\u0017,\u0000a\u001f:\u001f3tw\u0019^ϝ\u001b8(Ø! J|\u001ezo]\u0000s\u0013D\t&7q3raAX\u000315a+ObO-ČnSoo:\u0011\u0004\u0016pHn2\u0016\u000e<z\"g\u0019\u0000*O@Ρ5wۑ\u0017{\nr%\u0017\t\u001a\u001b*^\u001dF=JDI3Y~(\u0019ۘaQ\\a\u0006ru=!x¯˽\u0006\u0015Kz*J$[B3\u001ag\u0004\u0017\u0016(c9\u001a\u001f\f>-?H\t9\u000bO\nWz+\nQ|6'y{\u001dCBTQȷ\"`Z\b8\u0002ƍj\u0018,u`\u000b*H\u0003\u0003,5\u001e.>\u0019+Np%-Ȁh)3×xs\u0018xF)y&\u0014MP6g\f!8e\n n\u0000U\u0000AGYh,E*y*h3?Hع\u0014\u0000\u001emWLE\u0004cR\u000fެ\tq]H\u0007!X\u0004YyPP9%M8dGż\u0000%ρ8rYzEL\u0007L\u001d#\b46bD`u\fgާIa#WԽc-\t[\u0012\u0015A,,\u001aY\u0001RLUhd\u000b\u0003%ۃߌ8,o\u0005*\nc4za\u0000#PYď1(\u0006.\u00118p/:EE\u0003Lʂjh\tǗ\u0003r̨*<\u001d*Õ*\u0001\u00136ך\u0016j<5P\bQ\bWr\u001ade\t$U\u0001tߧ-0#\u001dF\u001d-n\u0005F9\u0004`E\\QvpVd\u001f\"aŖL\ts\u0006Z3\u0006\r\nendstream\rendobj\r26 0 obj\r[25 0 R 24 0 R 23 0 R]\rendobj\r154 0 obj\r<</CreationDate(D:20210427152846-07'00')/Creator(Adobe Illustrator 25.2 \\(Windows\\))/CreatorVersion(21.0.2)/ModDate(D:20210427152847-07'00')/Producer(Adobe PDF library 15.00)/Title(weblogic-app-gateway-key-vault)>>\rendobj\rxref\r\n0 155\r\n0000000004 65535 f\r\n0000000016 00000 n\r\n0000000175 00000 n\r\n0000082788 00000 n\r\n0000000000 00000 f\r\n0000082839 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000157424 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000157497 00000 n\r\n0000157693 00000 n\r\n0000163788 00000 n\r\n0000229377 00000 n\r\n0000294966 00000 n\r\n0000000000 00000 f\r\n0000110132 00000 n\r\n0000110530 00000 n\r\n0000109563 00000 n\r\n0000109635 00000 n\r\n0000109705 00000 n\r\n0000338949 00000 n\r\n0000083785 00000 n\r\n0000089672 00000 n\r\n0000100752 00000 n\r\n0000156323 00000 n\r\n0000156446 00000 n\r\n0000156571 00000 n\r\n0000156694 00000 n\r\n0000156809 00000 n\r\n0000156932 00000 n\r\n0000157055 00000 n\r\n0000157178 00000 n\r\n0000157301 00000 n\r\n0000103016 00000 n\r\n0000103163 00000 n\r\n0000103310 00000 n\r\n0000103465 00000 n\r\n0000103620 00000 n\r\n0000103767 00000 n\r\n0000103922 00000 n\r\n0000104069 00000 n\r\n0000104216 00000 n\r\n0000091104 00000 n\r\n0000091423 00000 n\r\n0000091672 00000 n\r\n0000092134 00000 n\r\n0000092544 00000 n\r\n0000092974 00000 n\r\n0000093417 00000 n\r\n0000093831 00000 n\r\n0000094316 00000 n\r\n0000094807 00000 n\r\n0000095292 00000 n\r\n0000095808 00000 n\r\n0000096095 00000 n\r\n0000096485 00000 n\r\n0000096734 00000 n\r\n0000096983 00000 n\r\n0000097232 00000 n\r\n0000097645 00000 n\r\n0000098115 00000 n\r\n0000098539 00000 n\r\n0000099283 00000 n\r\n0000099714 00000 n\r\n0000100228 00000 n\r\n0000089737 00000 n\r\n0000090542 00000 n\r\n0000090590 00000 n\r\n0000102172 00000 n\r\n0000102235 00000 n\r\n0000102109 00000 n\r\n0000102047 00000 n\r\n0000101985 00000 n\r\n0000101923 00000 n\r\n0000101861 00000 n\r\n0000101799 00000 n\r\n0000101737 00000 n\r\n0000101675 00000 n\r\n0000101613 00000 n\r\n0000101551 00000 n\r\n0000101488 00000 n\r\n0000101426 00000 n\r\n0000101363 00000 n\r\n0000101300 00000 n\r\n0000101237 00000 n\r\n0000101175 00000 n\r\n0000101113 00000 n\r\n0000101051 00000 n\r\n0000100989 00000 n\r\n0000100927 00000 n\r\n0000100865 00000 n\r\n0000100690 00000 n\r\n0000102381 00000 n\r\n0000102538 00000 n\r\n0000102654 00000 n\r\n0000102776 00000 n\r\n0000102896 00000 n\r\n0000109204 00000 n\r\n0000108571 00000 n\r\n0000107493 00000 n\r\n0000106868 00000 n\r\n0000105790 00000 n\r\n0000105552 00000 n\r\n0000105051 00000 n\r\n0000104692 00000 n\r\n0000104363 00000 n\r\n0000104480 00000 n\r\n0000104581 00000 n\r\n0000104809 00000 n\r\n0000104930 00000 n\r\n0000105189 00000 n\r\n0000105310 00000 n\r\n0000105431 00000 n\r\n0000105669 00000 n\r\n0000106018 00000 n\r\n0000106139 00000 n\r\n0000106260 00000 n\r\n0000106381 00000 n\r\n0000106502 00000 n\r\n0000106623 00000 n\r\n0000106745 00000 n\r\n0000107027 00000 n\r\n0000107150 00000 n\r\n0000107263 00000 n\r\n0000107374 00000 n\r\n0000107736 00000 n\r\n0000107852 00000 n\r\n0000107968 00000 n\r\n0000108089 00000 n\r\n0000108209 00000 n\r\n0000108329 00000 n\r\n0000108450 00000 n\r\n0000108730 00000 n\r\n0000108841 00000 n\r\n0000108962 00000 n\r\n0000109083 00000 n\r\n0000109321 00000 n\r\n0000109442 00000 n\r\n0000110014 00000 n\r\n0000110046 00000 n\r\n0000109896 00000 n\r\n0000109928 00000 n\r\n0000109778 00000 n\r\n0000109810 00000 n\r\n0000130464 00000 n\r\n0000110815 00000 n\r\n0000111073 00000 n\r\n0000130716 00000 n\r\n0000338988 00000 n\r\ntrailer\r\n<</Size 155/Root 1 0 R/Info 154 0 R/ID[<457B5E55D8B2594491112AAACE4F8F4D><200F60841FDCEB4490BFC4C15894E991>]>>\r\nstartxref\r\n339220\r\n%%EOF\r\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-assess-rules.md",
    "content": "---\ntitle: Understand Assessment Coverage Using GitHub Copilot Modernization\ntitleSuffix: Azure\ndescription: Learn how GitHub Copilot modernization detects issues in cloud readiness, Java versions, and security, helping you prepare for a seamless migration.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiading\nms.topic: quickstart\nms.date: 03/20/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Understand assessment coverage by GitHub Copilot modernization\n\nThis article describes what the app assessment feature of GitHub Copilot modernization can detect. The assessment covers two key capabilities:\n\n- **Issue detection** across three domains critical to your modernization journey:\n  - **Cloud readiness**: Identifies 16 categories of concerns, including file system usage, credential management, messaging services, database connections, containerization gaps, session handling, remote communication patterns, and more.\n  - **Java upgrade**: Flags outdated Java versions, end-of-OSS-support frameworks (Spring Boot, Spring Cloud, Jakarta EE), hundreds of removed or deprecated APIs, and legacy build tools such as Ant.\n  - **Security**: Detects 42 security weaknesses drawn from the ISO/IEC 5055 standard, covering injection vulnerabilities (SQL, LDAP, XPath, OS command), hard-coded credentials and cryptographic keys, synchronization problems, resource-lifecycle problems, and other high-impact CWEs.\n\n- **Application understanding**: for legacy codebases, the assessment surfaces dependencies and technologies in use, so you get a clear picture of what your application relies on before you begin migrating.\n\nThe following sections describe the issue coverage for each domain in detail.\n\n## Domain: cloud-readiness\n\n| Domain            | Category                      | Detection Summary                                                                                                                                                                                           | Why It Matters                                                                                                                                                                                   |\n|:------------------|:------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `cloud-readiness` | `credential-migration`        | Detects hardcoded AWS credentials (`aws_access_key_id`, `aws_secret_access_key`), AWS Secrets Manager usage, and embedded secret management libraries like Spring Cloud Vault.                              | **Security:** Hardcoded credentials and vendor-specific secret stores are highly vulnerable. Cloud-native applications require centralized, identity-based security to prevent credential theft. |\n| `cloud-readiness` | `region-configuration`        | Identifies hardcoded AWS region identifiers (`aws.region`, `AWS_REGION`) in code or configuration files.                                                                                                    | **Portability:** Hardcoding geographies ties the application to a specific vendor's physical infrastructure, hindering global deployment and resilience.                                         |\n| `cloud-readiness` | `storage-migration`           | Detects AWS S3 SDK usage (buckets, objects, pre-signed URLs), S3 TransferManager, and Google Cloud Storage client libraries.                                                                                | **Reliability & Alignment:** These dependencies lock you into a vendor's object storage and don't work with the target platform's native storage services.                                       |\n| `cloud-readiness` | `messaging-service-migration` | Flags dependencies and connection strings for Amazon SQS/SNS, Kafka, RabbitMQ (AMQP), ActiveMQ (Artemis), IBM MQ, TIBCO EMS, Solace PubSub+, Amazon Kinesis, Apache Pulsar, and Google Cloud Pub/Sub.       | **Scalability & Reliability:** Legacy messaging brokers often rely on fixed endpoints and disk-based persistence that hinder horizontal scaling and high availability in cloud environments.     |\n| `cloud-readiness` | `database-migration`          | Detects connection strings, drivers, and timeout settings for MongoDB, MySQL, PostgreSQL, MSSQL, Cassandra, MariaDB, Oracle, Db2, Sybase ASE, Firebird, SQLite, Google Firestore, and Google Cloud Spanner. | **Reliability:** Self-managed or non-native databases lack automated cloud scaling. Hardcoded timeouts and fixed retry intervals can cause blocking and \"retry storms\" during partial outages.   |\n| `cloud-readiness` | `file-system-management`      | Identifies use of relative/absolute paths, home paths (`/home/`), `file://` schemes, and standard Java IO/NIO or Apache Commons IO calls for local storage access.                                          | **Statelessness:** Cloud containers are ephemeral. Writing to a local file system leads to data loss upon instance restarts or scaling operations; persistent data must be externalized.         |\n| `cloud-readiness` | `local-credential`            | Flags Java KeyStore (`.jks`) files, `KeyStore.load` method calls, and clear-text passwords (`password`, `pwd`) in property or XML files.                                                                    | **Security Risk:** Sensitive material stored in clear text or local files can be easily compromised if unauthorized individuals access the application environment or configuration files.       |\n| `cloud-readiness` | `configuration-management`    | Detects `System.getenv`, `System.getProperty`, external `.properties`/`.xml`/`.ini` files, and Windows Registry access for application settings.                                                            | **Externalization:** OS-specific storage or local files aren't manageable at scale and can't be updated dynamically without code changes across all instances.                                   |\n| `cloud-readiness` | `session-management`          | Identifies data storage in `HttpSession` objects and the use of the \"distributable\" tag in web descriptors.                                                                                                 | **Scalability:** Standard HTTP sessions are unsuitable for cloud scaling; state must be externalized to a distributed cache to prevent data loss during traffic shifts between instances.        |\n| `cloud-readiness` | `remote-communication`        | Detects tightly coupled protocols (CORBA, RMI, JCA), unsecured HTTP/FTP protocols, Java Mail API, direct Socket/NIO channel usage, and hardcoded URLs.                                                      | **Cloud Compatibility & Security:** Tightly coupled interactions hinder scalability. Unsecured protocols and hardcoded URLs are vulnerable and brittle in dynamic cloud network environments.    |\n| `cloud-readiness` | `jakarta-migration`           | Detects usage of Jakarta/Java EE specific APIs for NoSQL, JPA, Data, WebSockets, and JAX-RS, and server-specific artifacts from JBoss EAP, WebLogic, or WebSphere.                                          | **Supportability:** Migrating to a cloud-native runtime requires aligning with modern Jakarta namespaces and removing proprietary application server dependencies to ensure portability.         |\n| `cloud-readiness` | `containerization`            | Flags the absence of a Dockerfile or problematic Dockerfile instructions like `apt-get upgrade`, lowercase syntax, and syntax spacing issues.                                                               | **Reliability:** Standardization in container builds is required for stable, reproducible deployments and to ensure images behave predictably across different environments.                     |\n| `cloud-readiness` | `scheduled-job-migration`     | Identifies AWS Lambda handlers, Google Cloud Functions, Quartz Scheduler dependencies, and Spring Batch processing workflows.                                                                               | **Cloud Compute Alignment:** Scheduled jobs and serverless functions must be refactored to use the target cloud's event-driven and serverless compute models to reduce infrastructure overhead.  |\n| `cloud-readiness` | `apm-migration`               | Identifies embedded APM agents and libraries for New Relic, Elastic APM, and Dynatrace.                                                                                                                     | **Observability:** These tools require specific cloud-platform integration to properly capture telemetry, latency, and health data in a managed environment.                                     |\n| `cloud-readiness` | `auth-migration`              | Detects SAML/OpenSAML, OAuth 2.0, OpenID, Spring Security, LDAP usage, and legacy webform authentication patterns.                                                                                          | **Modern Identity:** Legacy webform and LDAP auth lack the flexibility and security features (MFA, SSO) of modern claims-based cloud identity providers.                                         |\n| `cloud-readiness` | `os-compatibility`            | Identifies project dependencies on Windows-specific Dynamic-Link Libraries (.dll files).                                                                                                                    | **Portability:** DLLs are OS-specific and don't run in standard Linux-based cloud container environments. You need to replace them with cross-platform shared libraries.                         |\n\n## Domain: java-upgrade\n\n| Domain         | Category               | Detection Summary                                                                                                                                                                          | Why It Matters                                                                                                                                                                                                        |\n|:---------------|:-----------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `java-upgrade` | `java-version-upgrade` | Identifies usage of non-LTS Java versions (9, 10, 12-16, 19, 20) and legacy versions (1.x through 8, and 11).                                                                              | **Security & Support:** Older and non-LTS versions contain known vulnerabilities and lack long-term maintenance updates, leaving the infrastructure exposed to attacks.                                               |\n| `java-upgrade` | `framework-upgrade`    | Detects Spring Boot, Spring Cloud, Spring Framework, and Jakarta EE versions that reached end of OSS support.                                                                              | **Supportability:** Out-of-date frameworks stop receiving security fixes, making the application a security risk and incompatible with modern cloud-native tools.                                                     |\n| `java-upgrade` | `deprecated-apis`      | Catalogs hundreds of removed or deprecated APIs, including `sun.misc.BASE64`, `Thread.stop`, `SecurityManager` methods, and proprietary hooks from JBoss, Seam 2, WebLogic, and WebSphere. | **Stability & Portability:** Using removed APIs causes runtime crashes on modern JVMs. Proprietary vendor hooks (like WebLogic/JBoss internals) prevent the application from being portable across standard runtimes. |\n| `java-upgrade` | `build-tool`           | Identifies legacy build systems like Ant (`build.xml`) or Eclipse-specific project configurations (WTP/JEM natures).                                                                       | **Automation:** Legacy tools lack the standard conventions and dependency management needed for efficient integration into modern CI/CD pipelines.                                                                    |\n\n## Domain: Security (ISO 5055 guided)\n\n[ISO/IEC 5055](https://www.it-cisq.org/standards/code-quality-standards/) is an ISO standard for measuring the internal structure of a software product on four business-critical factors: Security, Reliability, Performance Efficiency, and Maintainability. These factors determine how trustworthy, dependable, and resilient a software system is. In essence, ISO 5055 is meant to **\"find and prevent the 8% of flaws that cause 90% of production issues\"**. ISO 5055 identifies the most critical and impactful CWEs under each quality characteristic: Reliability, Performance Efficiency, Security, and Maintainability. For GitHub Copilot modernization, you detect against the curated CWEs on security defined in ISO 5055, as the following table reveals.\n\n| CWE_ID     | Title                                                                                      | Description                                                                                                                                                                                                                                                              |\n|:-----------|:-------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `CWE-22`   | Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')             | The product uses external input to construct a pathname intended to identify a file or directory underneath a restricted parent directory. But, it doesn't properly neutralize special elements that can cause the pathname to resolve outside the restricted directory. |\n| `CWE-23`   | Relative Path Traversal                                                                    | The product uses external input to construct a pathname within a restricted directory but fails to neutralize sequences like `..`, which can resolve outside that directory.                                                                                             |\n| `CWE-36`   | Absolute Path Traversal                                                                    | The product uses external input to construct a pathname within a restricted directory but fails to neutralize absolute path sequences like `/abs/path`, which can resolve outside that directory.                                                                        |\n| `CWE-77`   | Improper Neutralization of Special Elements used in a Command ('Command Injection')        | The product constructs a command by using externally influenced input but doesn't neutralize special elements that could modify the intended command sent to a downstream component.                                                                                     |\n| `CWE-78`   | Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') | The product constructs an OS command by using externally influenced input but fails to neutralize special elements that could modify the intended OS command sent to a downstream component.                                                                             |\n| `CWE-88`   | Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')         | The product constructs a command string for a separate component but doesn't properly delimit arguments, options, or switches within that string.                                                                                                                        |\n| `CWE-79`   | Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')       | The product fails to neutralize user-controllable input before placing it in output used as a web page served to other users.                                                                                                                                            |\n| `CWE-89`   | Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')       | The product constructs an SQL command by using externally influenced input but fails to neutralize elements that could modify the command, allowing inputs to be interpreted as SQL syntax instead of ordinary data.                                                     |\n| `CWE-564`  | SQL Injection: Hibernate                                                                   | Using Hibernate to execute dynamic SQL statements built with user-controlled input can allow an attacker to modify the statement's meaning or execute arbitrary SQL commands.                                                                                            |\n| `CWE-90`   | Improper Neutralization of Special Elements used in an LDAP Query ('LDAP Injection')       | The product constructs an LDAP query by using externally influenced input but fails to neutralize elements that could modify the intended query sent to a downstream component.                                                                                          |\n| `CWE-91`   | XML Injection (also known as Blind XPath Injection)                                        | The product doesn't properly neutralize special elements used in XML, allowing attackers to modify the syntax, content, or commands before processing.                                                                                                                   |\n| `CWE-99`   | Improper Control of Resource Identifiers ('Resource Injection')                            | The product receives input but doesn't correctly restrict it before using it as an identifier for a resource outside the intended sphere of control.                                                                                                                     |\n| `CWE-130`  | Improper Handling of Length Parameter Inconsistency                                        | The product parses a formatted message or structure but incorrectly handles a length field that's inconsistent with the actual length of the associated data.                                                                                                            |\n| `CWE-259`  | Use of Hard-coded Password                                                                 | The product contains a hard-coded password used for its own inbound authentication or outbound communication to external components.                                                                                                                                     |\n| `CWE-321`  | Use of Hard-coded Cryptographic Key                                                        | The product uses a hard-coded, unchangeable cryptographic key.                                                                                                                                                                                                           |\n| `CWE-434`  | Unrestricted Upload of File with Dangerous Type                                            | The product allows the upload of dangerous file types that are automatically processed within its environment.                                                                                                                                                           |\n| `CWE-456`  | Missing Initialization of a Variable                                                       | The product doesn't initialize critical variables, causing the execution environment to use unexpected values.                                                                                                                                                           |\n| `CWE-457`  | Use of Uninitialized Variable                                                              | The code uses a variable that isn't initialized, leading to unpredictable or unintended results.                                                                                                                                                                         |\n| `CWE-477`  | Use of Obsolete Function                                                                   | The code uses deprecated or obsolete functions, suggesting it isn't actively reviewed or maintained.                                                                                                                                                                     |\n| `CWE-502`  | Deserialization of Untrusted Data                                                          | The product deserializes untrusted data without sufficiently ensuring the resulting data is valid.                                                                                                                                                                       |\n| `CWE-543`  | Use of Singleton Pattern Without Synchronization in a Multithreaded Context                | The product uses the singleton pattern when creating a resource within a multithreaded environment without proper synchronization.                                                                                                                                       |\n| `CWE-567`  | Unsynchronized Access to Shared Data in a Multithreaded Context                            | The product fails to properly synchronize shared data, such as static variables, across threads, leading to undefined behavior.                                                                                                                                          |\n| `CWE-570`  | Expression is Always False                                                                 | The product contains an expression that always evaluates to false.                                                                                                                                                                                                       |\n| `CWE-571`  | Expression is Always True                                                                  | The product contains an expression that always evaluates to true.                                                                                                                                                                                                        |\n| `CWE-606`  | Unchecked Input for Loop Condition                                                         | The product doesn't properly check inputs used for loop conditions, potentially leading to denial of service from excessive looping.                                                                                                                                     |\n| `CWE-643`  | Improper Neutralization of Data within XPath Expressions ('XPath Injection')               | The product uses external input to dynamically construct an XPath expression for an XML database but fails to neutralize that input.                                                                                                                                     |\n| `CWE-652`  | Improper Neutralization of Data within XQuery Expressions ('XQuery Injection')             | The product uses external input to dynamically construct an XQuery expression but fails to correctly neutralize that input.                                                                                                                                              |\n| `CWE-662`  | Improper Synchronization                                                                   | The product allows multiple threads or systems access to a shared resource without proper synchronization, potentially causing simultaneous access issues.                                                                                                               |\n| `CWE-665`  | Improper Initialization                                                                    | The product doesn't initialize or incorrectly initializes a resource, potentially leaving it in an unexpected state when accessed.                                                                                                                                       |\n| `CWE-667`  | Improper Locking                                                                           | The product doesn't properly acquire or release a lock on a resource, leading to unexpected state changes.                                                                                                                                                               |\n| `CWE-672`  | Operation on a Resource after Expiration or Release                                        | The product accesses or operates on a resource after it expired, was released, or was revoked.                                                                                                                                                                           |\n| `CWE-681`  | Incorrect Conversion between Numeric Types                                                 | Data can be omitted or translated into unexpected values during type conversion, which can be dangerous if used in sensitive contexts.                                                                                                                                   |\n| `CWE-682`  | Incorrect Calculation                                                                      | The product performs a calculation that generates incorrect results later used in security-critical decisions or resource management.                                                                                                                                    |\n| `CWE-732`  | Incorrect Permission Assignment for Critical Resource                                      | Permissions for a security-critical resource are specified in a way that allows unintended actors to read or modify it.                                                                                                                                                  |\n| `CWE-772`  | Missing Release of Resource after Effective Lifetime                                       | The product doesn't release a resource after its effective lifetime ended and it's no longer needed.                                                                                                                                                                     |\n| `CWE-775`  | Missing Release of File Descriptor or Handle after Effective Lifetime                      | The product fails to release a file descriptor or handle after it's no longer needed.                                                                                                                                                                                    |\n| `CWE-778`  | Insufficient Logging                                                                       | The product fails to record a security-critical event or omits important details when logging it.                                                                                                                                                                        |\n| `CWE-783`  | Operator Precedence Logic Error                                                            | An expression uses incorrect logic caused by operator precedence.                                                                                                                                                                                                        |\n| `CWE-789`  | Memory Allocation with Excessive Size Value                                                | The product allocates memory based on an untrusted, large size value without ensuring it's within expected limits.                                                                                                                                                       |\n| `CWE-798`  | Use of Hard-coded Credentials                                                              | The product contains hard-coded credentials, such as a password or cryptographic key.                                                                                                                                                                                    |\n| `CWE-820`  | Missing Synchronization                                                                    | The product utilizes a shared resource concurrently without attempting to synchronize access.                                                                                                                                                                            |\n| `CWE-821`  | Incorrect Synchronization                                                                  | The product utilizes a shared resource concurrently but doesn't correctly synchronize access.                                                                                                                                                                            |\n| `CWE-835`  | Loop with Unreachable Exit Condition ('Infinite Loop')                                     | The product contains an iteration or loop with an exit condition that can't be reached.                                                                                                                                                                                  |\n| `CWE-611`  | Improper Restriction of XML External Entity Reference                                      | The product processes XML documents containing entities with URIs that resolve outside the intended sphere of control.                                                                                                                                                   |\n| `CWE-1057` | Data Access Operations Outside of Expected Data Manager Component                          | The product performs data-access operations that bypass a dedicated, central data manager component required by design.                                                                                                                                                  |\n\n## Next steps\n\n- [Working with assessment](migrate-github-copilot-app-modernization-for-java-working-with-assessment.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-custom-agent.md",
    "content": "---\ntitle: Migrate Java Apps to Azure with Custom Agents\ndescription: Learn to migrate Java apps to Azure using GitHub Copilot custom agents. Automate modernization with Copilot CLI and coding agent. Start migrating today.\n#customer intent: As a Java developer, I want to migrate my application to Azure using GitHub Copilot CLI so that I can automate the modernization process.\nms.topic: quickstart\nms.custom: devx-track-java\nms.date: 01/13/2026\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiada\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Migrate Java apps to Azure by using GitHub Copilot modernization via custom agent\n\nThis article shows you how to migrate Java apps by using GitHub Copilot modernization custom agents. By using custom agents, you can define specialized migration workflows that work in both the [Copilot CLI](github-copilot-app-modernization-for-java-copilot-cli.md) and [Copilot coding agent](github-copilot-app-modernization-for-java-coding-agent.md).\n\nBy creating a custom agent profile, you can:\n- Standardize migration workflows across your team.\n- Ensure consistent migration patterns and validation steps.\n- Automate complex multistep migration tasks.\n- Track migration progress systematically.\n\n## Prerequisites\n\nChoose the environment where you want to use custom agents:\n\n### [Copilot CLI](#tab/copilot-cli)\n\n- [GitHub Copilot CLI](https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli) installed and configured. For setup instructions, see [Modernize Java apps by using GitHub Copilot modernization in the Copilot CLI](github-copilot-app-modernization-for-java-copilot-cli.md#get-started).\n- A GitHub Copilot Pro, Pro+, Business, or Enterprise subscription.\n- [Node.js](https://nodejs.org/) version 22 or later.\n- [npm](https://www.npmjs.com/get-npm) version 10 or later.\n\n### [Copilot coding agent](#tab/copilot-coding-agent)\n\n- [Copilot coding agent](https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent) configured. For setup instructions, see [Modernize Java apps by using GitHub Copilot modernization in coding agent](github-copilot-app-modernization-for-java-coding-agent.md#get-started).\n- A GitHub Copilot Pro, Pro+, Business, or Enterprise subscription.\n- A GitHub repository containing your application source code. Administrator access is required.\n\n---\n\n> [!NOTE]\n> [!INCLUDE [Azure account note](../../includes/github-copilot-modernization-azure-note.md)]\n\n## Add the MCP server\n\nBefore creating a custom agent, add the GitHub Copilot modernization MCP server. The setup process differs between CLI and coding agent.\n\n### [Copilot CLI](#tab/copilot-cli)\n\n1. In your terminal, go to your Java project folder.\n\n1. Run the following command in Copilot CLI:\n\n    ```text\n    /mcp add app-modernization\n    ```\n\n1. Fill in the fields as follows:\n\n    - **Server Type**: Local\n    - **Command**: `npx -y @microsoft/github-copilot-app-modernization-mcp-server`\n    - **Environment Variables**: Leave empty\n    - **Tools**: Use the default value `*`\n\n    Alternatively, manually update the `~/.copilot/mcp-config.json` file:\n\n    ```json\n    {\n      \"mcpServers\": {\n        \"app-modernization\": {\n          \"type\": \"local\",\n          \"command\": \"npx\",\n          \"tools\": [\n            \"*\"\n          ],\n          \"args\": [\n            \"-y\",\n            \"@microsoft/github-copilot-app-modernization-mcp-server\"\n          ]\n        }\n      }\n    }\n    ```\n\n1. Run `/mcp show` to verify the configuration.\n\nFor more information, see [Add MCP Server for CLI](github-copilot-app-modernization-for-java-copilot-cli.md#get-started).\n\n### [Copilot coding agent](#tab/copilot-coding-agent)\n\n1. Go to **Settings** for your target repository. Administrator access is required.\n\n1. Select **Copilot**, and then select **Coding Agent**.\n\n1. In the **Model Context Protocol (MCP)** section under **MCP Configuration**, add the following configuration:\n\n    ```json\n    {\n      \"mcpServers\": {\n        \"app-modernization\": {\n          \"type\": \"local\",\n          \"command\": \"npx\",\n          \"tools\": [\n            \"*\"\n          ],\n          \"args\": [\n            \"-y\",\n            \"@microsoft/github-copilot-app-modernization-mcp-server\"\n          ]\n        }\n      }\n    }\n    ```\n\n1. Select **Save Configuration**.\n\n1. (Optional) If environment variables are required, set them under **Environment → Copilot** in the settings.\n\nFor more information, see [Add MCP Server for coding agent](github-copilot-app-modernization-for-java-coding-agent.md#get-started).\n\n---\n\n## Create a custom agent\n\nThe custom agent defines the specialized behavior and instructions for your migration workflows.\n\n### [Copilot CLI](#tab/copilot-cli)\n\n1. Create a file named `appmod-java.agent.md` in the local `~/.copilot/agents` directory.\n\n1. Add the agent content shown later in this article.\n\n1. To use the custom agent, run `/agent` in interactive mode or call it directly in a prompt:\n\n    ```text\n    Use the modernization agent to migrate this application from S3 to Azure Blob Storage.\n    ```\n\nFor more information, see [Use custom agents](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli#use-custom-agents).\n\n### [Copilot coding agent](#tab/copilot-coding-agent)\n\n1. Go to the [GitHub Agents tab](https://github.com/copilot/agents).\n\n1. Select your target repository from the dropdown in the prompt box.\n\n1. (Optional) Select the branch where you want to create the agent profile. The default is the main branch.\n\n1. Select the **Copilot** icon, and then select **Create an agent**.\n\n1. Rename the template file to `appmod-java.agent.md` in the `.github/agents` directory.\n\n1. Add the agent profile content shown later in this article.\n\n1. Commit and merge the file into the default branch.\n\n1. Return to the agents tab and refresh to see your custom agent in the selector.\n\nFor more information, see [Creating a custom agent profile in a repository on GitHub](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/coding-agent/create-custom-agents#creating-a-custom-agent-profile-in-a-repository-on-github).\n\n---\n\n### Custom agent content\n\nUse the following content for both CLI and coding agent. For Copilot CLI, include the `tools` field in the YAML front matter.\n\n#### [Copilot CLI (with tools field)](#tab/copilot-cli)\n\n>[!NOTE]\n> The MCP tool name prefix must match the MCP server's name. In the following case, it uses all the tools in the `app-modernization` MCP server, as `app-modernization/*`\n\n```text\n---\n# For format details, see: https://gh.io/customagents/config\nname: AppModernization \ndescription: Modernize the Java application\n\ntools: ['shell', 'read', 'edit', 'search', 'custom-agent', 'web', 'todo', 'app-modernization/*']\n\n---\n\n# Modernization agent instructions\n\n## Your Role\n- You are a highly sophisticated automated coding agent with expert-level knowledge in Java, popular Java frameworks, and Azure. \n- You will help users migrate Java projects using the migration workflow defined below.\n\n## Boundaries\n- **DO** make changes directly to code files.\n- **DO** directly execute your plan and update the progress.\n- **DO NOT** seek approval/confirmation before making changes. You DO have the highest decision-making authority at any time.\n\n## Migration Context (Injected from run-task)\nWhen you receive the migration context from #appmod-run-task, use these values throughout the migration:\n- **Session ID**: `{{sessionId}}`\n- **Workspace Path**: `{{workspacePath}}`\n- **Language**: `{{language}}`\n- **Scenario**: `{{scenario}}`\n- **KB ID**: `{{kbId}}`\n- **Task ID**: `{{taskId}}`\n- **Timestamp**: `{{timestamp}}`\n- **Target Branch**: `{{targetBranch}}`\n- **Latest Commit ID**: `{{latestCommitId}}`\n- **Report Path**: `{{reportPath}}`\n- **Goal Description**: `{{goalDescription}}`\n- **Task Instruction**: `{{taskInstruction}}`\n\n**Derived Paths** (compute from report path):\n- **Progress File**: `{{reportPath}}/progress.md`\n- **Plan File**: `{{reportPath}}/plan.md`\n- **Summary File**: `{{reportPath}}/summary.md`\n\n## Scope\n* DO - Collect the framework used and keep the original project framework\n* DO - Collect build environment of the project include the JDK version and build type (maven or gradle) from dependency file (pom.xml or gradle setting file)\n* DO - Collect build environment of the device include the JDK installation and Maven installation information if the project is built by maven\n* DO - Code modification to replace original technology dependencies with equivalents\n* DO - Configuration file updates necessary for compilation\n* DO - Dependency management changes\n* DO - Update the function references to use the new generated functions\n* DO - Fix any introduced CVEs during code migration\n* DO - Build the project with tool #build_java_project and ensure it compiles successfully\n* DO - Run unit tests with tool #run_tests_for_java and ensure they pass\n* DO - Clean up old code files and project configurations if they are no longer needed after migration\n* DO - **CRITICAL**: Migrate ALL files containing old technology references - do NOT assume any files are \"intentionally unchanged\" or \"no longer used\"\n* DO NOT - No infrastructure setup (assumed to be handled separately)\n* DO NOT - No deployment considerations\n* DO NOT - No application/service/project assessment is required\n* NEVER run build or test with terminal commands, you MUST use tools #build_java_project and #run_tests_for_java with session ID and projectPath to run build and test\n* NEVER run version control operations with terminal commands, you MUST use tool #appmod-version-control for all version control operations\n\n## Success Criteria\n* No CVEs introduced during migration\n* Codebase compiles successfully\n* Code maintains functional consistency after migration\n* All unit tests pass after migration\n* All dependencies and imports are replaced\n* All old code files and project configurations are cleaned\n* All migration tasks are tracked and completed\n* Plan generated, progress tracked, and summary generated, and all the steps are all documented in the progress file\n\n## Tool Usage Instructions\n* USE - The structured todo list management tool for tracking tasks, their status, and progress\n* USE - #appmod-search-file to search content in files\n* USE - #appmod-search-knowledgebase to search kb by the scenario\n* USE - #appmod-fetch-knowledgebase to get the knowledge base by the ID\n* USE - #list_jdks to collect a list of JDKs available in the device (DO NOT pass sessionId parameter)\n* USE - #list_mavens to collect a list of Mavens available in the device if the project is built by maven (DO NOT pass sessionId parameter)\n* USE - #appmod-create-migration-summary to generate migration summary\n* USE - #appmod-consistency-validation to validate code consistency after migration and ensure behavior equivalence\n* USE - #appmod-completeness-validation to validate migration completeness by systematically discovering ALL unchanged items across ALL KB patterns before fixing them - NO EXCEPTIONS for perceived \"unused\" or \"intentional\" files\n* You MUST use tool #appmod-version-control for all version control operations\n* You MUST use tool #run_tests_for_java with session ID and projectPath to run the unit test cases, DO NOT use terminal commands\n* You MUST use tool #build_java_project with session ID and projectPath to compile the project, DO NOT use terminal commands\n* You MUST use tool #validate_cves_for_java to validate and fix introduced CVEs\n* ⛔ FORBIDDEN: DO NOT USE #appmod-run-assessment to run assessment, this is strictly prohibited for this task\n* ⛔ FORBIDDEN: DO NOT USE #appmod-precheck-assessment to initialize assessment, this is strictly prohibited for this task\n* ⛔ FORBIDDEN: DO NOT USE #appmod-install-appcat to install appcat, this is strictly prohibited for this task\n* ⛔ FORBIDDEN: DO NOT USE python tools starting with `appmod-python`, this is strictly prohibited for this task\n\n## Progress Tracking Instructions\n* !!!CRITICAL!!! You MUST do BOTH: (1) Use todo management tool for task tracking, AND (2) Create and save the progress tracking file `{{progressFile}}` - these are TWO SEPARATE requirements, using todo tool does NOT replace creating the progress.md file\n* ⚠️ **CRITICAL UPDATE REQUIREMENT**: EVERY TIME you update a todo item status (mark as in-progress or completed), you MUST ALSO update the `{{progressFile}}` file with the same status change\n* You MUST track the programming language of the project. It is detected as **{{language}}**, double confirm if this is correct.\n* You MUST always update this file with the latest progress in the `Progress` section, including:\n    - Task with status (in progress, completed)\n    - Current In-progress tasks should be marked as `[⌛️]`\n    - Completed tasks should be marked as `[✅]`\n    - Failed tasks should be marked as `[❌]`\n    - Only show one of next pending tasks, do NOT show all tasks\n* You must use the steps from migration workflow as tasks\n* You should also additionally add below steps in the progress file, marking it as `[✅]` once finished\n    - Migration Plan Generation (add link to the progress file)\n    - Final Summary (add link to the progress file)\n      - Final Code Commit (sub-step of Final Summary)\n      - Migration Summary Generation (sub-step of Final Summary)\n* When in code migration stage, you should:\n    - Use matching KB as sub-tasks and update progress of each file change status\n    - Document any issues encountered, how they were resolved, and any remaining issues\n* Sample Progress File\n    - [✅] Migration Plan Generated (link to the progress file)\n    - [✅] Version Control Setup (branch created: `{{targetBranch}}`)\n    - Code Migration\n        - [✅] path/to/changed/file\n        - [⌛️] path/to/in/progress/file\n        - ...\n    - Validation & Fixing\n            - [✅] Build Environment is setup\n            - [✅] JAVA_HOME is set to /path/to/java/home\n            - [✅] MAVEN_HOME is set to /path/to/maven/home\n        - [✅] Build and Fix (completed after max 10 rounds)\n        - [✅] CVE Check\n        - [✅] Consistency Check\n        - [❌] Test Fix\n        - [✅] Completeness Check\n        - [✅] Build Validation\n          - ...\n        - ...\n    - [✅] Final Summary (link to the progress file)\n      - [✅] Final Code Commit\n      - [✅] Migration Summary Generation\n\n## Version Control Setup Instructions\n🔴 **MANDATORY VERSION CONTROL POLICY**:\n* 🛑 NEVER USE DIRECT git COMMANDS - ONLY USE #appmod-version-control\n* 🛑 DO NOT EXECUTE ANY VERSION CONTROL OPERATIONS DURING PLAN GENERATION\n\n⚠️ **CRITICAL INSTRUCTIONS FOR VERSION CONTROL SETUP**:\n* You MUST execute these steps BEFORE starting any code migration tasks\n* Use #appmod-version-control to check if version control system is available:\n  - Check status with action 'checkStatus' in workspace directory: {{workspacePath}}\n  - ⚠️ **MANDATORY**: Check for existing uncommitted changes before creating any new branch:\n    * Use #appmod-version-control with action 'checkForUncommittedChanges' in workspace directory: {{workspacePath}}\n    * ⚠️ **CRITICAL**: IF uncommitted changes exist, you MUST handle them by stashing BEFORE proceeding to branch creation:\n      - You MUST use #appmod-version-control with action 'stashChanges' and stashMessage \"Auto-stash: Save uncommitted changes before migration\" in workspace directory: {{workspacePath}}\n    * ⚠️ **VERIFICATION REQUIRED**: After handling uncommitted changes, you MUST use #appmod-version-control with action 'checkForUncommittedChanges' to verify that the working directory is clean in workspace directory: {{workspacePath}} before proceeding to branch creation\n    * IF no uncommitted changes exist: proceed directly to branch creation\n  - ⚠️ **ONLY AFTER handling uncommitted changes**: Use #appmod-version-control with action 'createBranch' and branchName \"{{targetBranch}}\" in workspace directory: {{workspacePath}}\n  - Verify branch creation was successful before proceeding\n  - You MUST check the previous branch and the new branch in the general section of progress file.\n* If NO version control system detected (as indicated by the response from #appmod-version-control):\n  - Note \"No version control detected\" and proceed with direct migration on workspace directory: {{workspacePath}}\n\n## General Execution Instructions\n\n🚨 **MANDATORY FIRST STEP - BEFORE ANYTHING ELSE**: \n  1. Create a comprehensive structured todo list of all migration tasks using the appropriate todo management capability\n  2. Create file `{{progressFile}}`\n\n  ⚠️ Both steps above are REQUIRED before starting any other work. The progress.md file is separate from the todo list.\n\n⚠️ **CRITICAL INSTRUCTIONS**:\n* A new migration session ID: **{{sessionId}}** has been created. (You must remember this session ID to use it invoke other tools in followup steps). All the subsequent tool invocations must be included in this migration session.\n* You MUST strictly execute below migration steps in order, DO NOT skip any steps:\n    - Progress tracking (todo list + progress.md file - BOTH must be updated together whenever status changes)\n    - Pre-condition check\n    - Migration plan generation\n    - Version control setup\n    - Code migration\n    - Validation & Fix iteration loop\n    - Final Summary\n      - Final Code Commit\n      - Migration Summary Generation\n* All the steps should be executed automatically without asking user for confirmation or input unless explicitly interrupted by user\n\n⚠️ **CRITICAL COMPLETION COMMIT**: \n  - After ALL migration tasks are completed successfully, you MUST use #appmod-version-control with action 'commitChanges' and commitMessage \"Code migration completed: [brief summary of changes]\" in workspace directory: {{workspacePath}}\n\n⚠️ **VALIDATION REQUIREMENTS**:\n* After completing ALL code migration tasks, you MUST execute the VALIDATION stages exactly as described in Execution Flow\n* You MUST execute all the stages in sequence (Build and Fix, then CVE, Consistency, Test, Completeness, and Build Validation)\n* Stage 1 (Build and Fix) has its own iteration loop with up to 10 rounds\n* Stages 2-6 execute sequentially after Stage 1 completes\n* Do NOT skip any validation stage\n* ALWAYS generate the final migration summary after all validation stages complete\n\n## Execution Flow\n\n### Step 0. Pre-Condition Check\n\n🚨 **MANDATORY PRE-CONDITION CHECK**:\nBefore generating any migration plan, you MUST verify the following pre-conditions:\n\n**Project Language Verification**:\n- The task language is specified as **{{language}}**\n- You MUST verify the actual project language by checking build files and source code:\n  * For Java: Check for pom.xml, build.gradle, or build.gradle.kts AND .java files\n- ⚠️ **IF LANGUAGE MISMATCH DETECTED**: \n  - Display message: \"⚠️ **LANGUAGE MISMATCH**: This task is for {{language}} projects, but the workspace appears to be a [detected language] project. Aborting migration and proceeding to Final Summary for reporting.\"\n  - Record the pre-condition failure with status: 'language-mismatch', requestedLanguage: {{language}}, detectedLanguage: [detected language]\n  - **SKIP Steps 1-4 entirely** - proceed directly to Step 5 (Final Summary) to generate the failure report\n  ✅ **IF CHECK PASSES**: Proceed to Step 1 (plan generation)\n\n### Step 1. Code migration plan generation\n\n**Instructions:**\n\n0. **Review Migration Goal:**\n   - Read and follow the migration goal: {{goalDescription}}\n   - If task-specific instructions exist: {{taskInstruction}}\n\n1. **Language Verification:**\n   - The language of the project is detected as **{{language}}**, double confirm if this is correct\n   - Verify the actual project language by checking build files and source code\n\n2. **Knowledge Base Retrieval:**\n   - Fetch knowledge base or task references with migration session ID **{{sessionId}}**:\n     * If kbId is provided: Use #appmod-fetch-knowledgebase with kbId: \"{{kbId}}\"\n     * If taskId is provided: Use #appmod-fetch-knowledgebase with taskId: \"{{taskId}}\"\n     * If only scenario: Use #appmod-search-knowledgebase with scenario: \"{{scenario}}\"\n   - Search for source code files by the patterns provided in KB using #appmod-search-file with migration session ID **{{sessionId}}**\n\n3. **Source Technology Verification:**\n   - ⚠️ CRITICAL: After searching for source code files, verify that the source technology exists in the workspace\n   - If you cannot find ANY evidence of the source technology in the search results (no relevant dependencies, imports, or configuration files):\n     * Inform the user: \"⚠️ **WARNING**: The source technology [technology name] was not found in the workspace. This migration task is not applicable to this project. Proceeding directly to Final Summary.\"\n     * Do NOT proceed with plan generation. You MUST jump to the Final Summary step and report the preconditionCheck result with status 'no-source-technology'\n\n4. **Generate Migration Plan:**\n   The migration plan must include:\n   - Migration Session ID: **{{sessionId}}**\n   - Time of this plan creation ({{timestamp}})\n   - Uncommitted Changes Policy: stash\n   - Target branch name: `{{targetBranch}}` (will be used during version control setup after plan confirmation)\n   - Programming Language of this project\n     * If language mismatch detected, show a warning: \"Project language mismatch: the migration task was initiated for {{language}}, but detected is [detected language]\"\n   - Files to be changed, including search patterns\n   - The matching knowledge base guidelines (title only if applicable)\n   - Build environment settings (generated based on project dependency analysis and JDKs and build tools available in the device)\n\n5. **File Change Order:**\n   Sort the order of files to be changed based on dependency analysis:\n   - Analyze file dependency relationships and construct a dependency graph. A file is considered dependent on other files if:\n     * It uses class, methods or fields defined in other Java files\n     * It references Spring configuration keys defined in other configuration files\n     * It autowires Spring beans defined in other Java files\n   - Update files following the determined dependency order:\n     * Modify files that have no dependencies first\n     * A file should only be updated after all its dependent files have been modified\n   - When a file's dependent files are updated, use these changes as a reference to make necessary updates in the file:\n     * Update the file to use the new API if there are changes to classes, methods, or fields that the file depends on\n     * Modify the file to use updated configuration keys if there are changes to keys referenced in the file\n     * Adjust the file to use updated Spring Beans if there are changes to injected Spring Beans\n     * Review other relevant changes in dependent files and apply necessary updates to ensure compatibility\n\n6. **Build Environment Settings:**\n   According to the project dependency analysis and JDKs and build tools available in the device, generate the Build environment settings include below sections:\n   - JDK settings:\n     * The JDK version: The JDK version the project is using. It should respect the user defined in the dependency file like java.version, maven.compiler.source, sourceCompatibility\n     * Reason you choose above JDK version\n     * Need to install a new JDK: It should be true if no JDK is detected or the existing installed JDK version is not suitable (existing installed JDK is lower than the JDK version of project or the installed JDK is not the LTS version 8, 11, 17, 21, or 25), or it should be false\n     * JAVA_HOME: A path a JDK already installed, with suitable version equal to or higher than the JDK version the project is using, and it must be the LTS version (8, 11, 17, 21, or 25). If multiple suitable JDKs found, choose the one user configured in system environment with priority JAVA_HOME,PATH... If no suitable JDK is found, this field should be N/A\n     * Reason you choose above installed JDK path if a suitable JDK is found, the reason include version suitability and user configuration in system environment like JAVA_HOME, PATH...\n     * The path to install a new JDK: If Need to install a new JDK, it must be installed to ~/.jdk and you must not change it. If no need to install a new JDK, the field should be N/A\n     * The JDK version of the new JDK to be installed: A JDK version to install if a new JDK needs to be installed. It should be one of the LTS versions (version 8, 11, 17, 21, or 25), with a suitable version equal to or higher than the JDK version currently used by the project\n   - Build Tool settings:\n     * The build tool type (maven or gradle) to use for the build: If both exist, prefer to use maven\n     * Is wrapper used for the build tool\n     * MAVEN_HOME: A path a maven already installed, if wrapper used for the build tool\n     * The path to install the maven/gradle: A path to install maven or gradle if no maven or gradle is detected in current device. It must be installed to ~/.maven and you must not change it. This field MUST not be appear if wrapper used for the build tool\n\n7. **Save Migration Plan:**\n   - You must save the migration plan to workspace directory: {{workspacePath}} in `{{planFile}}`\n   - Update the progress tracking file `{{progressFile}}` to mark \"Migration Plan Generated\" as completed with an absolute link to the plan file: `{{planFile}}`\n\n### Step 2. Version Control Setup\n\nFollow the instructions in the **VersionControlSetupInstructions** section above, which includes:\n- Checking for version control system availability\n- Handling uncommitted changes according to the policy retrieved during plan generation\n- Creating a new branch for the migration\n- Updating the progress file with branch information\n\n### Step 3. Code Migration\n\n**Instructions:**\n\n1. **Read the generated plan file** from `{{planFile}}` to extract:\n   - File list in dependency order\n   - Knowledge base ID (kbId) or Task ID (taskId) if applicable\n   - Migration guidelines and patterns\n\n2. **Fetch knowledge base** (if kbId/taskId exists in plan): Use #appmod-fetch-knowledgebase with migration session ID **{{sessionId}}** and the kbId or taskId from the plan to get migration guidelines\n\n3. **Migrate ALL files** in dependency order:\n   ⚠️ **CRITICAL**: You MUST migrate EVERY file listed in the plan. Do NOT skip any files. Track progress to ensure completeness.\n   - Before starting, count the total number of files to migrate from the plan\n   - For EACH file in the plan:\n     * Apply knowledge base guidelines to replace old technology with new technology\n     * Update imports, dependencies, configurations, and test files\n     * Ensure compatibility with dependent files already migrated\n     * Update progress tracking for each file completion\n   - After processing all files, verify that ALL files from the plan have been migrated\n   - If any files were missed, go back and migrate them before proceeding\n\n4. **Commit changes**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Code migration: [brief description]\" in workspace directory: {{workspacePath}}\n\n### Step 4. Validation & Fix\n\nYou MUST execute the following validation stages in sequence.\n\n**📋 NOTE**: For build tool migrations (kbId: ant-project-to-maven-project, eclipse-project-to-maven-project), skip CVE Validation and Test Validation stages.\n\n**⚠️ IMPORTANT FLOW STRUCTURE**:\n- **Stage 1 (Build and Fix)**: Has its own iteration loop of up to 10 rounds. Continue until build succeeds OR maximum 10 rounds reached.\n- **Stages 2-6 (CVE, Consistency, Test, Completeness, Build Validation)**: Execute each stage once in sequence after Stage 1 completes.\n- After all stages complete, proceed to Final Summary.\n\n**Validation Process**:\n\nEach stage must be executed in order:\n\n#### Stage 1: Build and Fix (Until Build Success or Maximum 10 Rounds)\n\n⚠️ **CRITICAL**: This stage has its own iteration loop. You MUST repeat this stage until the build succeeds OR you reach maximum 10 rounds.\n\n**Instructions**:\n- You MUST make sure the JDK and build tool are properly installed before you run the build. Before you run the tool #build_java_project, you must make sure the JDK and build tool are installed in the device according to plan\n- If the JDK is not installed in the plan, use the tool #install_jdk to install the JDK with the version specified in the plan to the destination path outlined in the plan\n- If a wrapper is used for the build tool, and the build tool is Maven, but it is not installed on the device according to plan, use the tool #install_maven to install the Maven into the destination path to install the maven/gradle given in the plan with latest version\n- You MUST update the Build environment settings in plan and Progress File with the JDK installation path and build tool installation path after installation\n- You MUST set the JAVA_HOME environment variable to point to the JDK Path in plan anytime you use terminal tool to run mvn command\n- You MUST use the full path of the mvn command from plan when you use terminal tool to run mvn command, if there is maven installed\n\n**Build and Fix Loop**:\n- You MUST use tool #build_java_project with migration session ID **{{sessionId}}** and projectPath **{{workspacePath}}** to compile the project\n- If there are multiple build tools available, you MUST use maven to build the project if maven is one of them\n    - You MUST call the tool #build_java_project use the JAVA_HOME and MAVEN_HOME in the migration plan\n\n- For any build failures:\n  * Analyze each error in detail\n  * Implement fixes for each error\n  * Document each error and its corresponding fix\n  * **MUST COMMIT**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Build fixes: [specific build issues resolved]\" (e.g., \"Build fixes: Fix import statements and dependency conflicts in ServiceImpl\") in workspace directory: {{workspacePath}}\n  * Use tool #build_java_project with migration session ID **{{sessionId}}** and projectPath **{{workspacePath}}** to verify the fix\n- **LOOP CONTINUATION**: Continue this build-fix loop until:\n  * ✅ Build is successful, OR\n  * ❌ Maximum 10 build-fix rounds are reached\n- Document all build failures and the final fix results\n- ⚠️ **AFTER BUILD AND FIX STAGE COMPLETES**: \n  * CONTINUE to Stage 2 (CVE Validation) and update the progress tracking\n\n#### Stage 2: CVE Validation and Fixing\n\n**Instructions**:\n- List all added/updated Java dependencies in format 'groupId:artifactId:version'\n- Use tool #validate_cves_for_java to scan for vulnerabilities for these dependencies and get recommended fix versions\n- Document any detected CVEs\n- Apply the recommended fixes for any detected CVEs\n- Document all changes made to address CVEs\n- ⚠️ **IF CVE FIXES ARE APPLIED**: \n  * **MUST COMMIT**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"CVE fixes: [specific CVE fixes summary]\" (e.g., \"CVE fixes: Update Spring Boot to 3.2.12 to fix CVE-2023-1234\") in workspace directory: {{workspacePath}}\n  * CONTINUE to Stage 3 (Consistency Validation) and update the progress tracking\n\n#### Stage 3: Consistency Validation and Fixing\n\n**Instructions**:\nAfter build fix, you MUST execute the consistency validation flow to ensure code is functionally consistent:\n- Use tool #appmod-consistency-validation with these EXACT parameters:\n  * migrationSessionId: **{{sessionId}}**\n  * baselineRevisionId: **{{latestCommitId}}**\n  * workspacePath: {{workspacePath}}\n  * language: {{language}}\n  * migrationScenario: {{scenario}}\n  * kbIds: [from migration plan]\n- Follow the provided guideline to analyze the code for functional consistency\n- Document all detected inconsistency issues from your analysis\n- Group inconsistency issues by severity levels (Critical, Major, Minor)\n- For any inconsistency issues with severity \"Critical\" or \"Major\":\n  * Identify the specific functional differences between original and migrated code\n  * Implement fixes to ensure the migrated code maintains the same behavior as the original\n- For \"Minor\" issues, document them with a note on potential impact\n- Document all detected issues and the final fix results\n- ⚠️ **IF CONSISTENCY FIXES ARE APPLIED**: \n  * **MUST COMMIT**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Consistency fixes: [specific issues resolved]\" (e.g., \"Consistency fixes: Restore missing validation logic and error handling in UserService\") in workspace directory: {{workspacePath}}\n  * CONTINUE to Stage 4 (Test Validation) and update the progress tracking\n\n#### Stage 4: Test Validation and Fixing\n\n**Instructions**:\n- You MUST use tool #run_tests_for_java with migration session ID **{{sessionId}}**, and projectPath **{{workspacePath}}** to run the unit tests, do NOT use terminal commands to run tests\n    - You MUST call the tool #run_tests_for_java use the JAVA_HOME and MAVEN_HOME in the migration plan to run the tests\n- **FIRST**: Analyze test failures and categorize them:\n  * Identify integration tests (IT) that should be skipped - these include:\n    - Tests with @Integration, @SpringBootTest, @TestContainers, @DataJpaTest annotations\n    - Tests requiring external resources (databases, servers, APIs)\n    - Test failures indicating missing external dependencies\n    - Migration-related integration test failures that cannot be easily fixed\n  * For ALL identified integration tests that should be skipped:\n    - Disable the test with appropriate skip/ignore annotations\n    - Add a TODO comment explaining why (e.g., \"// TODO: Fix after migration - integration test requires external dependencies\")\n    - Document these as \"Skipped Integration Tests\" and exclude from fix attempts\n  * Only proceed to fix genuine unit tests that don't require external dependencies\n- Follow below guidelines to fix the unit tests:\n  * IMPORTANT: Focus on fixing ONLY the test cases, NEVER create or modify any Java implementation classes\n  * IMPORTANT: When mocking final classes or methods, use mockito-inline instead of refactoring the code. Add mockito-inline dependency to the pom.xml\n  * DO NOT refactor or modify the original implementation classes to make them easier to test\n- For each test failure:\n  * Analyze the error in detail\n  * Implement fixes for the test\n  * Document the error and its corresponding fix\n  * Use tool #run_tests_for_java with migration session ID **{{sessionId}}** and projectPath **{{workspacePath}}** to verify the fix\n- Continue this process until all **unit tests** pass or maximum 10 attempts are reached (integration tests in \"Skipped Integration Tests\" do NOT count as failures)\n- Document all test failures and the final fix results\n- ⚠️ **IF TEST FIXES ARE APPLIED**: \n  * **MUST COMMIT**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Test fixes: [specific test issues resolved]\" (e.g., \"Test fixes: Fix mock configurations and update assertions in UserServiceTest\") in workspace directory: {{workspacePath}}\n  * CONTINUE to Stage 5 (Completeness Validation) and update the progress tracking\n\n#### Stage 5: Completeness Validation and Fixing\n\n**Instructions**:\n🚨 **CRITICAL**: This stage catches migration items missed in initial code migration. Execute ALL sub-stages systematically:\n\n**5.1 - Get Validation Guidelines**: Use tool #appmod-completeness-validation with migration session ID **{{sessionId}}** to generate completeness validation guidelines\n**5.2 - 🚨 MANDATORY FILE DISCOVERY**: **YOU MUST ACTUALLY EXECUTE THE SEARCHES** provided by the completeness validation tool:\n  * The tool will give you specific search patterns and commands to find remaining old technology references\n  * **EXECUTE EVERY SINGLE SEARCH** the tool recommends - do NOT skip any searches thinking files are \"unused\" or \"intentionally unchanged\"\n  * Use #appmod-search-file with the exact patterns provided by the validation tool\n  * Search in ALL file types: build files (pom.xml, build.gradle), config files, source files, resources, documentation\n  * Document EVERY file found by your searches that contains old technology references\n**5.3 - Analyze & Document**: For each discovered file from your searches, identify and document ALL unchanged old technology references with specific locations and expected changes\n**5.4 - Fix All Issues**: Apply ALL documented fixes systematically - ⚠️ **NO EXCEPTIONS**: migrate every old technology reference regardless of perceived usage\n**5.5 - You MUST fix ALL issues discovered in sub-stage 5.2 and 5.3** - ⚠️ DO NOT skip documentation and tutorial files\n**5.6 - Commit Changes**: ⚠️ **IF FIXES APPLIED**: \n  * Use #appmod-version-control with action 'commitChanges' and commitMessage \"Completeness fixes: [specific completeness issues resolved]\" (e.g., \"Completeness fixes: Update remaining configuration and dependencies\") in workspace directory: {{workspacePath}}\n  * CONTINUE to Stage 6 (Build Validation) and update the progress tracking\n\n#### Stage 6: Build Validation (Final Check)\n\n⚠️ **CRITICAL**: This is the final build validation after all other fixes. The build MUST succeed at this point.\n\n**Instructions**:\n- You MUST use tool #build_java_project with migration session ID **{{sessionId}}** and projectPath **{{workspacePath}}** to compile the project, do NOT use terminal commands to run build\n- You MUST call the tool #build_java_project use the JAVA_HOME and MAVEN_HOME in the migration plan\n- If the build fails at this stage:\n  * This indicates that previous validation fixes (CVE, Consistency, Test, or Completeness) have introduced new build errors\n  * Analyze each error in detail\n  * Implement fixes for each error\n  * **MUST COMMIT**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Final build fixes: [specific build issues resolved]\" in workspace directory: {{workspacePath}}\n- ⚠️ **IF BUILD FAILS**: \n  * A new round build and validate will be triggered to fix all errors found in this stage, up to maximum 5 attempts\n- ⚠️ **IF BUILD SUCCEEDS**: \n  * CONTINUE to Completion Rules and update the progress tracking\n\n**Completion Rules**:\n\nAfter completing Stage 6:\n\n**IF BUILD SUCCEEDS**:\n- ✅ All validation stages are SUCCESSFUL\n- ⚠️ **FINAL COMMIT CHECK**: Before proceeding to Final Summary, ensure all changes are committed:\n  - Use #appmod-version-control with action 'checkForUncommittedChanges' in workspace directory: {{workspacePath}} to verify no uncommitted changes exist\n  - IF any uncommitted changes are found: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Final fixes: Cleanup remaining issues\" in workspace directory: {{workspacePath}}\n- ✅ Proceed to Step 5 (Final Summary) - validation is complete\n\n**IF BUILD FAILS AFTER MAXIMUM RETRIES**:\n- Document all remaining build issues\n- ✅ Proceed to Step 5 (Final Summary) with build failure status\n\n### Step 5. Final Summary\n\n**⚠️ NOTE**: This step handles BOTH successful migrations and early aborts (pre-condition failures). For pre-condition failures, skip directly to 5.2 (Migration Summary Generation) without code commits.\n\n#### 5.1 Final Code Commit\n\n**⚠️ SKIP THIS STEP if arriving here due to pre-condition check failure - proceed directly to Step 5.2**\n\n**If version control system is available**:\n- ⚠️ **MANDATORY FINAL COMMIT**: Before generating the migration summary, you MUST ensure ALL code changes have been committed:\n  - Use #appmod-version-control with action 'checkForUncommittedChanges' in workspace directory: {{workspacePath}} to verify uncommitted changes\n  - If uncommitted changes exist: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Final migration completion: [brief summary]\" in workspace directory: {{workspacePath}}\n  - Use #appmod-version-control with action 'checkForUncommittedChanges' in workspace directory: {{workspacePath}} to verify the commit was successful\n  - ⛔ **DO NOT PROCEED TO SUMMARY GENERATION UNTIL ALL CHANGES ARE COMMITTED**\n\n**If NO version control system is available**:\n- Proceed directly to Step 5.2\n\n#### 5.2 Migration Summary Generation\n\n**Instructions**:\n- Generate final summary in one of these scenarios:\n  - **Pre-condition check failure**: Language mismatch or source technology not found (arrived here by skipping Steps 1-4)\n  - **Successful completion**: All validation stages are completed with the final build succeeding\n  - **Maximum attempts reached**: Build and Fix stage reached maximum 10 rounds or Build Validation failed after maximum retries\n\n- You MUST use tool #appmod-create-migration-summary with migration session ID **{{sessionId}}** and **{{language}}**:\n  - **For pre-condition failures**: Pass the preconditionCheck parameter with status ('language-mismatch' or 'no-source-technology') and relevant details\n  - **For successful/completed migrations**: Pass the full migration status including build, test, CVE, consistency, and completeness results\n  - Follow the instructions provided by the tool to create the migration summary\n  - Save the migration summary to the report path: `{{summaryFile}}`\n\n#### 5.3 Process Completion\n\n**Instructions**:\n- After both the code commit and migration summary sub-steps are complete, update the progress tracking to indicate the migration process is complete\n- This finalizes the entire migration workflow\n\n```\n\n#### [Copilot coding agent (without tools field)](#tab/copilot-coding-agent)\n\n```text\n---\n# For format details, see: https://gh.io/customagents/config\nname: AppModernization \ndescription: Modernize the Java application\n\n---\n\n# Modernization agent instructions\n\n## Your Role\n- You are a highly sophisticated automated coding agent with expert-level knowledge in Java, popular Java frameworks, and Azure. \n- You will help users migrate Java projects using the migration workflow defined below.\n\n## Boundaries\n- **DO** make changes directly to code files.\n- **DO** directly execute your plan and update the progress.\n- **DO NOT** seek approval/confirmation before making changes. You DO have the highest decision-making authority at any time.\n\n## Migration Context (Injected from run-task)\nWhen you receive the migration context from #appmod-run-task, use these values throughout the migration:\n- **Session ID**: `{{sessionId}}`\n- **Workspace Path**: `{{workspacePath}}`\n- **Language**: `{{language}}`\n- **Scenario**: `{{scenario}}`\n- **KB ID**: `{{kbId}}`\n- **Task ID**: `{{taskId}}`\n- **Timestamp**: `{{timestamp}}`\n- **Target Branch**: `{{targetBranch}}`\n- **Latest Commit ID**: `{{latestCommitId}}`\n- **Report Path**: `{{reportPath}}`\n- **Goal Description**: `{{goalDescription}}`\n- **Task Instruction**: `{{taskInstruction}}`\n\n**Derived Paths** (compute from report path):\n- **Progress File**: `{{reportPath}}/progress.md`\n- **Plan File**: `{{reportPath}}/plan.md`\n- **Summary File**: `{{reportPath}}/summary.md`\n\n## Scope\n* DO - Collect the framework used and keep the original project framework\n* DO - Collect build environment of the project include the JDK version and build type (maven or gradle) from dependency file (pom.xml or gradle setting file)\n* DO - Collect build environment of the device include the JDK installation and Maven installation information if the project is built by maven\n* DO - Code modification to replace original technology dependencies with equivalents\n* DO - Configuration file updates necessary for compilation\n* DO - Dependency management changes\n* DO - Update the function references to use the new generated functions\n* DO - Fix any introduced CVEs during code migration\n* DO - Build the project with tool #build_java_project and ensure it compiles successfully\n* DO - Run unit tests with tool #run_tests_for_java and ensure they pass\n* DO - Clean up old code files and project configurations if they are no longer needed after migration\n* DO - **CRITICAL**: Migrate ALL files containing old technology references - do NOT assume any files are \"intentionally unchanged\" or \"no longer used\"\n* DO NOT - No infrastructure setup (assumed to be handled separately)\n* DO NOT - No deployment considerations\n* DO NOT - No application/service/project assessment is required\n* NEVER run build or test with terminal commands, you MUST use tools #build_java_project and #run_tests_for_java with session ID and projectPath to run build and test\n* NEVER run version control operations with terminal commands, you MUST use tool #appmod-version-control for all version control operations\n\n## Success Criteria\n* No CVEs introduced during migration\n* Codebase compiles successfully\n* Code maintains functional consistency after migration\n* All unit tests pass after migration\n* All dependencies and imports are replaced\n* All old code files and project configurations are cleaned\n* All migration tasks are tracked and completed\n* Plan generated, progress tracked, and summary generated, and all the steps are all documented in the progress file\n\n## Tool Usage Instructions\n* USE - The structured todo list management tool for tracking tasks, their status, and progress\n* USE - #appmod-search-file to search content in files\n* USE - #appmod-search-knowledgebase to search kb by the scenario\n* USE - #appmod-fetch-knowledgebase to get the knowledge base by the ID\n* USE - #list_jdks to collect a list of JDKs available in the device (DO NOT pass sessionId parameter)\n* USE - #list_mavens to collect a list of Mavens available in the device if the project is built by maven (DO NOT pass sessionId parameter)\n* USE - #appmod-create-migration-summary to generate migration summary\n* USE - #appmod-consistency-validation to validate code consistency after migration and ensure behavior equivalence\n* USE - #appmod-completeness-validation to validate migration completeness by systematically discovering ALL unchanged items across ALL KB patterns before fixing them - NO EXCEPTIONS for perceived \"unused\" or \"intentional\" files\n* You MUST use tool #appmod-version-control for all version control operations\n* You MUST use tool #run_tests_for_java with session ID and projectPath to run the unit test cases, DO NOT use terminal commands\n* You MUST use tool #build_java_project with session ID and projectPath to compile the project, DO NOT use terminal commands\n* You MUST use tool #validate_cves_for_java to validate and fix introduced CVEs\n* ⛔ FORBIDDEN: DO NOT USE #appmod-run-assessment to run assessment, this is strictly prohibited for this task\n* ⛔ FORBIDDEN: DO NOT USE #appmod-precheck-assessment to initialize assessment, this is strictly prohibited for this task\n* ⛔ FORBIDDEN: DO NOT USE #appmod-install-appcat to install appcat, this is strictly prohibited for this task\n* ⛔ FORBIDDEN: DO NOT USE python tools starting with `appmod-python`, this is strictly prohibited for this task\n\n## Progress Tracking Instructions\n* !!!CRITICAL!!! You MUST do BOTH: (1) Use todo management tool for task tracking, AND (2) Create and save the progress tracking file `{{progressFile}}` - these are TWO SEPARATE requirements, using todo tool does NOT replace creating the progress.md file\n* ⚠️ **CRITICAL UPDATE REQUIREMENT**: EVERY TIME you update a todo item status (mark as in-progress or completed), you MUST ALSO update the `{{progressFile}}` file with the same status change\n* You MUST track the programming language of the project. It is detected as **{{language}}**, double confirm if this is correct.\n* You MUST always update this file with the latest progress in the `Progress` section, including:\n    - Task with status (in progress, completed)\n    - Current In-progress tasks should be marked as `[⌛️]`\n    - Completed tasks should be marked as `[✅]`\n    - Failed tasks should be marked as `[❌]`\n    - Only show one of next pending tasks, do NOT show all tasks\n* You must use the steps from migration workflow as tasks\n* You should also additionally add below steps in the progress file, marking it as `[✅]` once finished\n    - Migration Plan Generation (add link to the progress file)\n    - Final Summary (add link to the progress file)\n      - Final Code Commit (sub-step of Final Summary)\n      - Migration Summary Generation (sub-step of Final Summary)\n* When in code migration stage, you should:\n    - Use matching KB as sub-tasks and update progress of each file change status\n    - Document any issues encountered, how they were resolved, and any remaining issues\n* Sample Progress File\n    - [✅] Migration Plan Generated (link to the progress file)\n    - [✅] Version Control Setup (branch created: `{{targetBranch}}`)\n    - Code Migration\n        - [✅] path/to/changed/file\n        - [⌛️] path/to/in/progress/file\n        - ...\n    - Validation & Fixing\n            - [✅] Build Environment is setup\n            - [✅] JAVA_HOME is set to /path/to/java/home\n            - [✅] MAVEN_HOME is set to /path/to/maven/home\n        - [✅] Build and Fix (completed after max 10 rounds)\n        - [✅] CVE Check\n        - [✅] Consistency Check\n        - [❌] Test Fix\n        - [✅] Completeness Check\n        - [✅] Build Validation\n          - ...\n        - ...\n    - [✅] Final Summary (link to the progress file)\n      - [✅] Final Code Commit\n      - [✅] Migration Summary Generation\n\n## Version Control Setup Instructions\n🔴 **MANDATORY VERSION CONTROL POLICY**:\n* 🛑 NEVER USE DIRECT git COMMANDS - ONLY USE #appmod-version-control\n* 🛑 DO NOT EXECUTE ANY VERSION CONTROL OPERATIONS DURING PLAN GENERATION\n\n⚠️ **CRITICAL INSTRUCTIONS FOR VERSION CONTROL SETUP**:\n* You MUST execute these steps BEFORE starting any code migration tasks\n* Use #appmod-version-control to check if version control system is available:\n  - Check status with action 'checkStatus' in workspace directory: {{workspacePath}}\n  - ⚠️ **MANDATORY**: Check for existing uncommitted changes before creating any new branch:\n    * Use #appmod-version-control with action 'checkForUncommittedChanges' in workspace directory: {{workspacePath}}\n    * ⚠️ **CRITICAL**: IF uncommitted changes exist, you MUST handle them by stashing BEFORE proceeding to branch creation:\n      - You MUST use #appmod-version-control with action 'stashChanges' and stashMessage \"Auto-stash: Save uncommitted changes before migration\" in workspace directory: {{workspacePath}}\n    * ⚠️ **VERIFICATION REQUIRED**: After handling uncommitted changes, you MUST use #appmod-version-control with action 'checkForUncommittedChanges' to verify that the working directory is clean in workspace directory: {{workspacePath}} before proceeding to branch creation\n    * IF no uncommitted changes exist: proceed directly to branch creation\n  - ⚠️ **ONLY AFTER handling uncommitted changes**: Use #appmod-version-control with action 'createBranch' and branchName \"{{targetBranch}}\" in workspace directory: {{workspacePath}}\n  - Verify branch creation was successful before proceeding\n  - You MUST check the previous branch and the new branch in the general section of progress file.\n* If NO version control system detected (as indicated by the response from #appmod-version-control):\n  - Note \"No version control detected\" and proceed with direct migration on workspace directory: {{workspacePath}}\n\n## General Execution Instructions\n\n🚨 **MANDATORY FIRST STEP - BEFORE ANYTHING ELSE**: \n  1. Create a comprehensive structured todo list of all migration tasks using the appropriate todo management capability\n  2. Create file `{{progressFile}}`\n\n  ⚠️ Both steps above are REQUIRED before starting any other work. The progress.md file is separate from the todo list.\n\n⚠️ **CRITICAL INSTRUCTIONS**:\n* A new migration session ID: **{{sessionId}}** has been created. (You must remember this session ID to use it invoke other tools in followup steps). All the subsequent tool invocations must be included in this migration session.\n* You MUST strictly execute below migration steps in order, DO NOT skip any steps:\n    - Progress tracking (todo list + progress.md file - BOTH must be updated together whenever status changes)\n    - Pre-condition check\n    - Migration plan generation\n    - Version control setup\n    - Code migration\n    - Validation & Fix iteration loop\n    - Final Summary\n      - Final Code Commit\n      - Migration Summary Generation\n* All the steps should be executed automatically without asking user for confirmation or input unless explicitly interrupted by user\n\n⚠️ **CRITICAL COMPLETION COMMIT**: \n  - After ALL migration tasks are completed successfully, you MUST use #appmod-version-control with action 'commitChanges' and commitMessage \"Code migration completed: [brief summary of changes]\" in workspace directory: {{workspacePath}}\n\n⚠️ **VALIDATION REQUIREMENTS**:\n* After completing ALL code migration tasks, you MUST execute the VALIDATION stages exactly as described in Execution Flow\n* You MUST execute all the stages in sequence (Build and Fix, then CVE, Consistency, Test, Completeness, and Build Validation)\n* Stage 1 (Build and Fix) has its own iteration loop with up to 10 rounds\n* Stages 2-6 execute sequentially after Stage 1 completes\n* Do NOT skip any validation stage\n* ALWAYS generate the final migration summary after all validation stages complete\n\n## Execution Flow\n\n### Step 0. Pre-Condition Check\n\n🚨 **MANDATORY PRE-CONDITION CHECK**:\nBefore generating any migration plan, you MUST verify the following pre-conditions:\n\n**Project Language Verification**:\n- The task language is specified as **{{language}}**\n- You MUST verify the actual project language by checking build files and source code:\n  * For Java: Check for pom.xml, build.gradle, or build.gradle.kts AND .java files\n- ⚠️ **IF LANGUAGE MISMATCH DETECTED**: \n  - Display message: \"⚠️ **LANGUAGE MISMATCH**: This task is for {{language}} projects, but the workspace appears to be a [detected language] project. Aborting migration and proceeding to Final Summary for reporting.\"\n  - Record the pre-condition failure with status: 'language-mismatch', requestedLanguage: {{language}}, detectedLanguage: [detected language]\n  - **SKIP Steps 1-4 entirely** - proceed directly to Step 5 (Final Summary) to generate the failure report\n  ✅ **IF CHECK PASSES**: Proceed to Step 1 (plan generation)\n\n### Step 1. Code migration plan generation\n\n**Instructions:**\n\n0. **Review Migration Goal:**\n   - Read and follow the migration goal: {{goalDescription}}\n   - If task-specific instructions exist: {{taskInstruction}}\n\n1. **Language Verification:**\n   - The language of the project is detected as **{{language}}**, double confirm if this is correct\n   - Verify the actual project language by checking build files and source code\n\n2. **Knowledge Base Retrieval:**\n   - Fetch knowledge base or task references with migration session ID **{{sessionId}}**:\n     * If kbId is provided: Use #appmod-fetch-knowledgebase with kbId: \"{{kbId}}\"\n     * If taskId is provided: Use #appmod-fetch-knowledgebase with taskId: \"{{taskId}}\"\n     * If only scenario: Use #appmod-search-knowledgebase with scenario: \"{{scenario}}\"\n   - Search for source code files by the patterns provided in KB using #appmod-search-file with migration session ID **{{sessionId}}**\n\n3. **Source Technology Verification:**\n   - ⚠️ CRITICAL: After searching for source code files, verify that the source technology exists in the workspace\n   - If you cannot find ANY evidence of the source technology in the search results (no relevant dependencies, imports, or configuration files):\n     * Inform the user: \"⚠️ **WARNING**: The source technology [technology name] was not found in the workspace. This migration task is not applicable to this project. Proceeding directly to Final Summary.\"\n     * Do NOT proceed with plan generation. You MUST jump to the Final Summary step and report the preconditionCheck result with status 'no-source-technology'\n\n4. **Generate Migration Plan:**\n   The migration plan must include:\n   - Migration Session ID: **{{sessionId}}**\n   - Time of this plan creation ({{timestamp}})\n   - Uncommitted Changes Policy: stash\n   - Target branch name: `{{targetBranch}}` (will be used during version control setup after plan confirmation)\n   - Programming Language of this project\n     * If language mismatch detected, show a warning: \"Project language mismatch: the migration task was initiated for {{language}}, but detected is [detected language]\"\n   - Files to be changed, including search patterns\n   - The matching knowledge base guidelines (title only if applicable)\n   - Build environment settings (generated based on project dependency analysis and JDKs and build tools available in the device)\n\n5. **File Change Order:**\n   Sort the order of files to be changed based on dependency analysis:\n   - Analyze file dependency relationships and construct a dependency graph. A file is considered dependent on other files if:\n     * It uses class, methods or fields defined in other Java files\n     * It references Spring configuration keys defined in other configuration files\n     * It autowires Spring beans defined in other Java files\n   - Update files following the determined dependency order:\n     * Modify files that have no dependencies first\n     * A file should only be updated after all its dependent files have been modified\n   - When a file's dependent files are updated, use these changes as a reference to make necessary updates in the file:\n     * Update the file to use the new API if there are changes to classes, methods, or fields that the file depends on\n     * Modify the file to use updated configuration keys if there are changes to keys referenced in the file\n     * Adjust the file to use updated Spring Beans if there are changes to injected Spring Beans\n     * Review other relevant changes in dependent files and apply necessary updates to ensure compatibility\n\n6. **Build Environment Settings:**\n   According to the project dependency analysis and JDKs and build tools available in the device, generate the Build environment settings include below sections:\n   - JDK settings:\n     * The JDK version: The JDK version the project is using. It should respect the user defined in the dependency file like java.version, maven.compiler.source, sourceCompatibility\n     * Reason you choose above JDK version\n     * Need to install a new JDK: It should be true if no JDK is detected or the existing installed JDK version is not suitable (existing installed JDK is lower than the JDK version of project or the installed JDK is not the LTS version 8, 11, 17, 21, or 25), or it should be false\n     * JAVA_HOME: A path a JDK already installed, with suitable version equal to or higher than the JDK version the project is using, and it must be the LTS version (8, 11, 17, 21, or 25). If multiple suitable JDKs found, choose the one user configured in system environment with priority JAVA_HOME,PATH... If no suitable JDK is found, this field should be N/A\n     * Reason you choose above installed JDK path if a suitable JDK is found, the reason include version suitability and user configuration in system environment like JAVA_HOME, PATH...\n     * The path to install a new JDK: If Need to install a new JDK, it must be installed to ~/.jdk and you must not change it. If no need to install a new JDK, the field should be N/A\n     * The JDK version of the new JDK to be installed: A JDK version to install if a new JDK needs to be installed. It should be one of the LTS versions (version 8, 11, 17, 21, or 25), with a suitable version equal to or higher than the JDK version currently used by the project\n   - Build Tool settings:\n     * The build tool type (maven or gradle) to use for the build: If both exist, prefer to use maven\n     * Is wrapper used for the build tool\n     * MAVEN_HOME: A path a maven already installed, if wrapper used for the build tool\n     * The path to install the maven/gradle: A path to install maven or gradle if no maven or gradle is detected in current device. It must be installed to ~/.maven and you must not change it. This field MUST not be appear if wrapper used for the build tool\n\n7. **Save Migration Plan:**\n   - You must save the migration plan to workspace directory: {{workspacePath}} in `{{planFile}}`\n   - Update the progress tracking file `{{progressFile}}` to mark \"Migration Plan Generated\" as completed with an absolute link to the plan file: `{{planFile}}`\n\n### Step 2. Version Control Setup\n\nFollow the instructions in the **VersionControlSetupInstructions** section above, which includes:\n- Checking for version control system availability\n- Handling uncommitted changes according to the policy retrieved during plan generation\n- Creating a new branch for the migration\n- Updating the progress file with branch information\n\n### Step 3. Code Migration\n\n**Instructions:**\n\n1. **Read the generated plan file** from `{{planFile}}` to extract:\n   - File list in dependency order\n   - Knowledge base ID (kbId) or Task ID (taskId) if applicable\n   - Migration guidelines and patterns\n\n2. **Fetch knowledge base** (if kbId/taskId exists in plan): Use #appmod-fetch-knowledgebase with migration session ID **{{sessionId}}** and the kbId or taskId from the plan to get migration guidelines\n\n3. **Migrate ALL files** in dependency order:\n   ⚠️ **CRITICAL**: You MUST migrate EVERY file listed in the plan. Do NOT skip any files. Track progress to ensure completeness.\n   - Before starting, count the total number of files to migrate from the plan\n   - For EACH file in the plan:\n     * Apply knowledge base guidelines to replace old technology with new technology\n     * Update imports, dependencies, configurations, and test files\n     * Ensure compatibility with dependent files already migrated\n     * Update progress tracking for each file completion\n   - After processing all files, verify that ALL files from the plan have been migrated\n   - If any files were missed, go back and migrate them before proceeding\n\n4. **Commit changes**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Code migration: [brief description]\" in workspace directory: {{workspacePath}}\n\n### Step 4. Validation & Fix\n\nYou MUST execute the following validation stages in sequence.\n\n**📋 NOTE**: For build tool migrations (kbId: ant-project-to-maven-project, eclipse-project-to-maven-project), skip CVE Validation and Test Validation stages.\n\n**⚠️ IMPORTANT FLOW STRUCTURE**:\n- **Stage 1 (Build and Fix)**: Has its own iteration loop of up to 10 rounds. Continue until build succeeds OR maximum 10 rounds reached.\n- **Stages 2-6 (CVE, Consistency, Test, Completeness, Build Validation)**: Execute each stage once in sequence after Stage 1 completes.\n- After all stages complete, proceed to Final Summary.\n\n**Validation Process**:\n\nEach stage must be executed in order:\n\n#### Stage 1: Build and Fix (Until Build Success or Maximum 10 Rounds)\n\n⚠️ **CRITICAL**: This stage has its own iteration loop. You MUST repeat this stage until the build succeeds OR you reach maximum 10 rounds.\n\n**Instructions**:\n- You MUST make sure the JDK and build tool are properly installed before you run the build. Before you run the tool #build_java_project, you must make sure the JDK and build tool are installed in the device according to plan\n- If the JDK is not installed in the plan, use the tool #install_jdk to install the JDK with the version specified in the plan to the destination path outlined in the plan\n- If a wrapper is used for the build tool, and the build tool is Maven, but it is not installed on the device according to plan, use the tool #install_maven to install the Maven into the destination path to install the maven/gradle given in the plan with latest version\n- You MUST update the Build environment settings in plan and Progress File with the JDK installation path and build tool installation path after installation\n- You MUST set the JAVA_HOME environment variable to point to the JDK Path in plan anytime you use terminal tool to run mvn command\n- You MUST use the full path of the mvn command from plan when you use terminal tool to run mvn command, if there is maven installed\n\n**Build and Fix Loop**:\n- You MUST use tool #build_java_project with migration session ID **{{sessionId}}** and projectPath **{{workspacePath}}** to compile the project\n- If there are multiple build tools available, you MUST use maven to build the project if maven is one of them\n    - You MUST call the tool #build_java_project use the JAVA_HOME and MAVEN_HOME in the migration plan\n\n- For any build failures:\n  * Analyze each error in detail\n  * Implement fixes for each error\n  * Document each error and its corresponding fix\n  * **MUST COMMIT**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Build fixes: [specific build issues resolved]\" (e.g., \"Build fixes: Fix import statements and dependency conflicts in ServiceImpl\") in workspace directory: {{workspacePath}}\n  * Use tool #build_java_project with migration session ID **{{sessionId}}** and projectPath **{{workspacePath}}** to verify the fix\n- **LOOP CONTINUATION**: Continue this build-fix loop until:\n  * ✅ Build is successful, OR\n  * ❌ Maximum 10 build-fix rounds are reached\n- Document all build failures and the final fix results\n- ⚠️ **AFTER BUILD AND FIX STAGE COMPLETES**: \n  * CONTINUE to Stage 2 (CVE Validation) and update the progress tracking\n\n#### Stage 2: CVE Validation and Fixing\n\n**Instructions**:\n- List all added/updated Java dependencies in format 'groupId:artifactId:version'\n- Use tool #validate_cves_for_java to scan for vulnerabilities for these dependencies and get recommended fix versions\n- Document any detected CVEs\n- Apply the recommended fixes for any detected CVEs\n- Document all changes made to address CVEs\n- ⚠️ **IF CVE FIXES ARE APPLIED**: \n  * **MUST COMMIT**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"CVE fixes: [specific CVE fixes summary]\" (e.g., \"CVE fixes: Update Spring Boot to 3.2.12 to fix CVE-2023-1234\") in workspace directory: {{workspacePath}}\n  * CONTINUE to Stage 3 (Consistency Validation) and update the progress tracking\n\n#### Stage 3: Consistency Validation and Fixing\n\n**Instructions**:\nAfter build fix, you MUST execute the consistency validation flow to ensure code is functionally consistent:\n- Use tool #appmod-consistency-validation with these EXACT parameters:\n  * migrationSessionId: **{{sessionId}}**\n  * baselineRevisionId: **{{latestCommitId}}**\n  * workspacePath: {{workspacePath}}\n  * language: {{language}}\n  * migrationScenario: {{scenario}}\n  * kbIds: [from migration plan]\n- Follow the provided guideline to analyze the code for functional consistency\n- Document all detected inconsistency issues from your analysis\n- Group inconsistency issues by severity levels (Critical, Major, Minor)\n- For any inconsistency issues with severity \"Critical\" or \"Major\":\n  * Identify the specific functional differences between original and migrated code\n  * Implement fixes to ensure the migrated code maintains the same behavior as the original\n- For \"Minor\" issues, document them with a note on potential impact\n- Document all detected issues and the final fix results\n- ⚠️ **IF CONSISTENCY FIXES ARE APPLIED**: \n  * **MUST COMMIT**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Consistency fixes: [specific issues resolved]\" (e.g., \"Consistency fixes: Restore missing validation logic and error handling in UserService\") in workspace directory: {{workspacePath}}\n  * CONTINUE to Stage 4 (Test Validation) and update the progress tracking\n\n#### Stage 4: Test Validation and Fixing\n\n**Instructions**:\n- You MUST use tool #run_tests_for_java with migration session ID **{{sessionId}}**, and projectPath **{{workspacePath}}** to run the unit tests, do NOT use terminal commands to run tests\n    - You MUST call the tool #run_tests_for_java use the JAVA_HOME and MAVEN_HOME in the migration plan to run the tests\n- **FIRST**: Analyze test failures and categorize them:\n  * Identify integration tests (IT) that should be skipped - these include:\n    - Tests with @Integration, @SpringBootTest, @TestContainers, @DataJpaTest annotations\n    - Tests requiring external resources (databases, servers, APIs)\n    - Test failures indicating missing external dependencies\n    - Migration-related integration test failures that cannot be easily fixed\n  * For ALL identified integration tests that should be skipped:\n    - Disable the test with appropriate skip/ignore annotations\n    - Add a TODO comment explaining why (e.g., \"// TODO: Fix after migration - integration test requires external dependencies\")\n    - Document these as \"Skipped Integration Tests\" and exclude from fix attempts\n  * Only proceed to fix genuine unit tests that don't require external dependencies\n- Follow below guidelines to fix the unit tests:\n  * IMPORTANT: Focus on fixing ONLY the test cases, NEVER create or modify any Java implementation classes\n  * IMPORTANT: When mocking final classes or methods, use mockito-inline instead of refactoring the code. Add mockito-inline dependency to the pom.xml\n  * DO NOT refactor or modify the original implementation classes to make them easier to test\n- For each test failure:\n  * Analyze the error in detail\n  * Implement fixes for the test\n  * Document the error and its corresponding fix\n  * Use tool #run_tests_for_java with migration session ID **{{sessionId}}** and projectPath **{{workspacePath}}** to verify the fix\n- Continue this process until all **unit tests** pass or maximum 10 attempts are reached (integration tests in \"Skipped Integration Tests\" do NOT count as failures)\n- Document all test failures and the final fix results\n- ⚠️ **IF TEST FIXES ARE APPLIED**: \n  * **MUST COMMIT**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Test fixes: [specific test issues resolved]\" (e.g., \"Test fixes: Fix mock configurations and update assertions in UserServiceTest\") in workspace directory: {{workspacePath}}\n  * CONTINUE to Stage 5 (Completeness Validation) and update the progress tracking\n\n#### Stage 5: Completeness Validation and Fixing\n\n**Instructions**:\n🚨 **CRITICAL**: This stage catches migration items missed in initial code migration. Execute ALL sub-stages systematically:\n\n**5.1 - Get Validation Guidelines**: Use tool #appmod-completeness-validation with migration session ID **{{sessionId}}** to generate completeness validation guidelines\n**5.2 - 🚨 MANDATORY FILE DISCOVERY**: **YOU MUST ACTUALLY EXECUTE THE SEARCHES** provided by the completeness validation tool:\n  * The tool will give you specific search patterns and commands to find remaining old technology references\n  * **EXECUTE EVERY SINGLE SEARCH** the tool recommends - do NOT skip any searches thinking files are \"unused\" or \"intentionally unchanged\"\n  * Use #appmod-search-file with the exact patterns provided by the validation tool\n  * Search in ALL file types: build files (pom.xml, build.gradle), config files, source files, resources, documentation\n  * Document EVERY file found by your searches that contains old technology references\n**5.3 - Analyze & Document**: For each discovered file from your searches, identify and document ALL unchanged old technology references with specific locations and expected changes\n**5.4 - Fix All Issues**: Apply ALL documented fixes systematically - ⚠️ **NO EXCEPTIONS**: migrate every old technology reference regardless of perceived usage\n**5.5 - You MUST fix ALL issues discovered in sub-stage 5.2 and 5.3** - ⚠️ DO NOT skip documentation and tutorial files\n**5.6 - Commit Changes**: ⚠️ **IF FIXES APPLIED**: \n  * Use #appmod-version-control with action 'commitChanges' and commitMessage \"Completeness fixes: [specific completeness issues resolved]\" (e.g., \"Completeness fixes: Update remaining configuration and dependencies\") in workspace directory: {{workspacePath}}\n  * CONTINUE to Stage 6 (Build Validation) and update the progress tracking\n\n#### Stage 6: Build Validation (Final Check)\n\n⚠️ **CRITICAL**: This is the final build validation after all other fixes. The build MUST succeed at this point.\n\n**Instructions**:\n- You MUST use tool #build_java_project with migration session ID **{{sessionId}}** and projectPath **{{workspacePath}}** to compile the project, do NOT use terminal commands to run build\n- You MUST call the tool #build_java_project use the JAVA_HOME and MAVEN_HOME in the migration plan\n- If the build fails at this stage:\n  * This indicates that previous validation fixes (CVE, Consistency, Test, or Completeness) have introduced new build errors\n  * Analyze each error in detail\n  * Implement fixes for each error\n  * **MUST COMMIT**: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Final build fixes: [specific build issues resolved]\" in workspace directory: {{workspacePath}}\n- ⚠️ **IF BUILD FAILS**: \n  * A new round build and validate will be triggered to fix all errors found in this stage, up to maximum 5 attempts\n- ⚠️ **IF BUILD SUCCEEDS**: \n  * CONTINUE to Completion Rules and update the progress tracking\n\n**Completion Rules**:\n\nAfter completing Stage 6:\n\n**IF BUILD SUCCEEDS**:\n- ✅ All validation stages are SUCCESSFUL\n- ⚠️ **FINAL COMMIT CHECK**: Before proceeding to Final Summary, ensure all changes are committed:\n  - Use #appmod-version-control with action 'checkForUncommittedChanges' in workspace directory: {{workspacePath}} to verify no uncommitted changes exist\n  - IF any uncommitted changes are found: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Final fixes: Cleanup remaining issues\" in workspace directory: {{workspacePath}}\n- ✅ Proceed to Step 5 (Final Summary) - validation is complete\n\n**IF BUILD FAILS AFTER MAXIMUM RETRIES**:\n- Document all remaining build issues\n- ✅ Proceed to Step 5 (Final Summary) with build failure status\n\n### Step 5. Final Summary\n\n**⚠️ NOTE**: This step handles BOTH successful migrations and early aborts (pre-condition failures). For pre-condition failures, skip directly to 5.2 (Migration Summary Generation) without code commits.\n\n#### 5.1 Final Code Commit\n\n**⚠️ SKIP THIS STEP if arriving here due to pre-condition check failure - proceed directly to Step 5.2**\n\n**If version control system is available**:\n- ⚠️ **MANDATORY FINAL COMMIT**: Before generating the migration summary, you MUST ensure ALL code changes have been committed:\n  - Use #appmod-version-control with action 'checkForUncommittedChanges' in workspace directory: {{workspacePath}} to verify uncommitted changes\n  - If uncommitted changes exist: Use #appmod-version-control with action 'commitChanges' and commitMessage \"Final migration completion: [brief summary]\" in workspace directory: {{workspacePath}}\n  - Use #appmod-version-control with action 'checkForUncommittedChanges' in workspace directory: {{workspacePath}} to verify the commit was successful\n  - ⛔ **DO NOT PROCEED TO SUMMARY GENERATION UNTIL ALL CHANGES ARE COMMITTED**\n\n**If NO version control system is available**:\n- Proceed directly to Step 5.2\n\n#### 5.2 Migration Summary Generation\n\n**Instructions**:\n- Generate final summary in one of these scenarios:\n  - **Pre-condition check failure**: Language mismatch or source technology not found (arrived here by skipping Steps 1-4)\n  - **Successful completion**: All validation stages are completed with the final build succeeding\n  - **Maximum attempts reached**: Build and Fix stage reached maximum 10 rounds or Build Validation failed after maximum retries\n\n- You MUST use tool #appmod-create-migration-summary with migration session ID **{{sessionId}}** and **{{language}}**:\n  - **For pre-condition failures**: Pass the preconditionCheck parameter with status ('language-mismatch' or 'no-source-technology') and relevant details\n  - **For successful/completed migrations**: Pass the full migration status including build, test, CVE, consistency, and completeness results\n  - Follow the instructions provided by the tool to create the migration summary\n  - Save the migration summary to the report path: `{{summaryFile}}`\n\n#### 5.3 Process Completion\n\n**Instructions**:\n- After both the code commit and migration summary sub-steps are complete, update the progress tracking to indicate the migration process is complete\n- This finalizes the entire migration workflow\n\n```\n\n---\n\n## Migrate your Java application to Azure\n\nAfter creating the custom agent, use it to migrate your Java applications. The process is similar in both CLI and coding agent.\n\n### [Copilot CLI](#tab/copilot-cli)\n\n1. In your terminal, go to your Java project folder.\n\n1. Start Copilot CLI and use your custom agent with a migration prompt:\n\n    ```text\n    Use the modernization agent to migrate this application from S3 to Azure Blob Storage\n    ```\n\n    Or select the agent by using `/agent` and then describe your migration task.\n\n     :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java-copilot-cli-custom-agent/select-custom-agent.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java-copilot-cli-custom-agent/select-custom-agent.png\" alt-text=\"Screenshot of GitHub Copilot CLI that shows the Select Custom Agent options.\":::\n\n1. Monitor the migration progress in the terminal as the agent executes the migration steps.\n\n    :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java-copilot-cli-custom-agent/migrate-details.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java-copilot-cli-custom-agent/migrate-details.png\" alt-text=\"Screenshot of GitHub Copilot CLI that shows running tasks in Java migration scenarios.\":::\n\n1. Review the migration summary when complete.\n\n    :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java-copilot-cli-custom-agent/migrate-summary.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java-copilot-cli-custom-agent/migrate-summary.png\" alt-text=\"Screenshot of GitHub Copilot CLI that shows the Java migration summary.\":::\n\n### [Copilot coding agent](#tab/copilot-coding-agent)\n\n1. Open the [Agents panel](https://github.com/copilot/agents).\n\n1. Select your target repository and custom agent from the dropdown.\n\n    :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java-coding-agent-custom-agent/select-custom-agent.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java-coding-agent-custom-agent/select-custom-agent.png\" alt-text=\"Screenshot of the GitHub Agents panel that shows the Java migrate task input in the coding agent.\":::\n\n1. Enter your migration prompt. For example:\n\n    ```text\n    Run migration task for scenario Migrate Cassandra integration to Azure SDK using Managed Identity\n    ```\n\n    For predefined migration tasks, see [Predefined tasks for GitHub Copilot modernization for Java developers](migrate-github-copilot-app-modernization-for-java-predefined-tasks.md).\n\n1. Copilot starts a new session and opens a pull request. Monitor the progress:\n\n    :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java-coding-agent-custom-agent/migrate-progress.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java-coding-agent-custom-agent/migrate-progress.png\" alt-text=\"Screenshot of the GitHub Agents pane that shows the Java migrate progress in the coding agent.\":::\n\n1. Review the migration summary when your app is fully migrated and cloud-ready.\n    \n    :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java-coding-agent-custom-agent/migrate-completion.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java-coding-agent-custom-agent/migrate-completion.png\" alt-text=\"Screenshot of the GitHub Agents pane that shows the Java migrate completion in the coding agent.\":::\n\n---\n\n## Provide feedback\n\nShare feedback about GitHub Copilot modernization by using the [GitHub Copilot modernization feedback form](https://aka.ms/ghcp-appmod/feedback).\n\n## Reference\n\n- [Modernize Java apps by using GitHub Copilot modernization in the Copilot CLI](github-copilot-app-modernization-for-java-copilot-cli.md)\n- [Modernize Java apps by using GitHub Copilot modernization in coding agent](github-copilot-app-modernization-for-java-coding-agent.md)\n- [Using GitHub Copilot CLI](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/use-copilot-cli)\n- [Use GitHub Copilot agents](https://docs.github.com/en/copilot/how-tos/use-copilot-agents)\n- [Predefined tasks for GitHub Copilot modernization for Java developers](migrate-github-copilot-app-modernization-for-java-predefined-tasks.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-faq.yml",
    "content": "### YamlMime:FAQ\nmetadata:\n  title: GitHub Copilot Modernization FAQ\n  titleSuffix: Azure\n  description: Answers frequently asked questions about GitHub Copilot modernization.\n  author: KarlErickson\n  ms.author: karler\n  ms.reviewer: xiading\n  ms.topic: faq\n  ms.date: 01/13/2026\n  ms.custom: devx-track-java\n  ms.subservice: migration-copilot\n  ms.collection: ce-skilling-ai-copilot\n  ms.update-cycle: 180-days\n\ntitle: GitHub Copilot modernization FAQ\nsummary: Answers frequently asked questions about GitHub Copilot modernization.\n\nsections:\n  - name: FAQ\n    questions:\n\n      - question: What's the product scope of the GitHub Copilot modernization?\n        answer: |\n          We recognize that the migration process is always complex and intertwined, with different layers of app ecosystems. At this time, we're limiting the migration scope to Java backend apps. We support projects that are built with Maven or Gradle. For information about key product capabilities, see the [GitHub Copilot modernization overview](../../github-copilot-app-modernization/overview.md).\n\n      - question: Will GitHub Copilot modernization be open sourced in the future?\n        answer: We currently have no plans to open source GitHub Copilot modernization.\n\n      - question: What GitHub Copilot license plan do I need to use GitHub Copilot modernization?\n        answer: GitHub Copilot modernization is available to any GitHub Copilot plan.\n\n      - question: How is GitHub Copilot modernization billed?\n        answer: GitHub Copilot modernization is a feature of GitHub Copilot, and shares the same [subscription billing model](https://docs.github.com/en/copilot/get-started/plans#comparing-copilot-plans) as GitHub Copilot. GitHub Copilot modernization tasks consume premium requests, with each subscription plan offering a monthly allowance of premium requests. Exceeding the plan limit requires a plan upgrade or extra purchase of premium requests.\n\n      - question: In addition to Java, I also need to migrate apps written in other languages. Is there a plan for GitHub Copilot modernization to go beyond Java?\n        answer: Currently, GitHub Copilot modernization is focused on assisting with Java and .NET applications. However, we're actively collecting requirements and feedback from customers regarding the need to support other languages.\n\n      - question: Does GitHub Copilot modernization store my source code?\n        answer: |\n          No. GitHub Copilot modernization uses GitHub Copilot in the same way you use it to modify code, which doesn't retain code snippets beyond the immediate session. We don't collect, transmit, or store your custom skills either.\n\n          Telemetry metrics are collected and analyzed to track feature usage and effectiveness.\n\n          For more information, see the [Microsoft Privacy Statement](https://privacy.microsoft.com/).\n\n      - question: What kind of applications did you use to evaluate GitHub Copilot modernization?\n        answer: We tested GitHub Copilot modernization on hundreds of open-source repositories to ensure build, consistency, and unit tests pass after the modernization process. We also worked extensively with customers during the Technical Preview phase. Input from users is used to improve the product experience. You can submit feedback using [this link](https://www.surveymonkey.com/r/NDBTC6B).\n\n      - question: What frameworks is GitHub Copilot modernization optimized for in upgrade scenarios?\n        answer: |\n          Although GitHub Copilot modernization focuses on upgrading Java runtimes, it also optimizes upgrades for the following frameworks:\n\n          - Spring Boot up to version 3.5.\n          - Java EE - Javax to Jakarta EE, up to Jakarta EE 10.\n          - Legacy Spring Framework up to version 6.2+.\n          - JUnit.\n          - Various third-party dependencies.\n\n          For more information, see [Customize the Java project upgrade plan](/java/upgrade/customize-upgrade-plan).\n\n      - question: What versions of Java are supported for upgrade?\n        answer: |\n          We currently support the following Java Development Kit (JDK) versions:\n\n          - JDK 8\n          - JDK 11\n          - JDK 17\n          - JDK 21\n          - JDK 25\n\n          The minimum required JDK version for a project is JDK 8, and you can upgrade the project to use any version up to JDK 21.\n\n      - question: What types of Java projects are supported?\n        answer: |\n          Currently, only the following project types are supported:\n\n          - Maven projects (including Maven Wrapper)\n          - Gradle projects (Gradle Wrapper only, version 5+)\n\n          Kotlin DSL-based Gradle projects aren't supported.\n\n      - question: What are the limitations of Java upgrades?\n        answer: |\n          Currently, the extension has the following functional limitations:\n\n          - The extension exclusively supports Java upgrades and doesn't cater to other programming languages.\n          - It works only with Java projects built using Maven and Gradle.\n          - Only Git repositories are supported. Other version control systems aren't compatible.\n          - The extension can't guarantee that the changes it proposes are optimal or considered best practices.\n\n          We recommend using the following best practices with this tool:\n\n          - Run the extension only on projects that meet the specified characteristics as previously described.\n          - Complete thorough code reviews before merging extension output into production branches.\n          - Run all tests and complete the usual QA checks associated with your change management process as appropriate.\n\n      - question: How do I modernize multiple apps at the same time and how can I scale the app mod experience for a large number of apps?\n        answer: You can use the [AppCAT CLI](/azure/migrate/appcat/appcat-7-cli-guide?view=migrate-classic) to scan multiple projects at the same time by using the `-bulk` flag. However, we recommend that you only modernize one project or app at a time. You can create your own migration task based on code changes from one project and apply them to other projects, reducing repetitive work.\n\n      - question: Which model should I use?\n        answer: As a general rule of thumb, newer models outperform previous models. For coding tasks, we recommend Claud Sonnet models for better accuracy. However to reduce cost, consider starting your exploration from models with a [lower multiplier](https://docs.github.com/en/copilot/concepts/billing/copilot-requests#model-multipliers).\n\n      - question: How do I change the model used by the AppModernization custom agent?\n        answer: |\n          In Visual Studio Code, GitHub Copilot modernization uses the `AppModernization` custom agent with Claude Sonnet 4.5 by default for best results when updating Java code to migrate to Azure. It falls back to the 'auto' model if Sonnet 4.5 is not available to you. You can configure the custom agent to [modify the 'model' setting](https://code.visualstudio.com/docs/copilot/customization/custom-agents#_custom-agent-file-structure) by selecting **Configure Custom Agents** from the **Agent** menu. Alternatively, you can use the language model picker in the chat window to switch models for the current chat session.\n\n          :::image type=\"content\" source=\"media/migrate-github-copilot-app-modernization-for-java/configure-custom-agents.png\" alt-text=\"Screenshot of the GitHub Copilot chat pane in Visual Studio Code that shows the Configure Custom Agents option.\" lightbox=\"media/migrate-github-copilot-app-modernization-for-java/configure-custom-agents.png\":::\n\n  - name: Troubleshooting guide\n\n    questions:\n\n      - question: What are the token size limits of the top models?\n        answer: For detailed model specifications, see the [GitHub Copilot documentation](https://docs.github.com/copilot).\n\n      - question: What are the operational requirements for Java runtime and framework upgrades?\n        answer: |\n          To ensure successful Java runtime and framework upgrades, the following information is required:\n\n          - The Project type. The project must be a Git-based Java project buildable with Maven or Gradle.\n          - The target Java version - the JDK version you want to upgrade to - for example, Java 21.\n          - The source and target JDK paths - the paths to the installed JDKs for the current and target versions.\n          - The Maven/Gradle setup - paths to the Maven/Gradle build tools. For Gradle, only Gradle wrappers are supported.\n\n      - question: How does GitHub Copilot modernization use the MCP server, and how can I check for updates or troubleshoot issues?\n        answer: |\n          GitHub Copilot modernization uses the MCP server to enhance code transformation capabilities. After you install the Visual Studio Code extension, the MCP server is registered and starts automatically.\n\n          If you notice a special refresh button in the bottom-right corner of the GitHub Copilot Chat panel, it might indicate that tool updates are available. Select the button to automatically load the latest versions of the tools.\n\n          The GitHub Copilot modernization MCP server also maintains logs. To troubleshoot, check the log files located at: `%USERPROFILE%/.ghcp-appmod-java/logs`\n\n      - question: Why does GitHub Copilot modernization stop after listing a plan without making any code changes?\n        answer: |\n          Sometimes, GitHub Copilot modernization requires explicit confirmation before proceeding. You can type **yes** or **continue** in the chat to enable the agent to move forward with the code modifications.\n\n          :::image type=\"content\" source=\"media/migrate-github-copilot-app-modernization-for-java/continue-in-chat.png\" alt-text=\"Screenshot of the GitHub Copilot chat pane in Visual Studio Code that shows the user typing continue in response to an update plan.\" lightbox=\"media/migrate-github-copilot-app-modernization-for-java/continue-in-chat.png\":::\n\n      - question: Why does GitHub Copilot modernization frequently prompt me to select **Continue**?\n        answer: |\n          To ensure safer operations, the GitHub Copilot agent repeatedly asks for user confirmation, you can use the following configuration as a workaround.\n\n          - For Visual Studio Code, you can select the dropdown arrow next to the **Continue** button and then select **Always Allow**, or update your Visual Studio Code setting `chat.tools.autoApprove` to `true` to automatically approve all tools. We also recommend configuring `chat.agent.maxRequests` to `128` to reduce the number of steps that require confirmation to continue.\n\n            :::image type=\"content\" source=\"media/migrate-github-copilot-app-modernization-for-java/allow-mcp-tool.png\" alt-text=\"Screenshot of the GitHub Copilot chat pane that shows the Continue button and the drop-down menu with Allow options.\" lightbox=\"media/migrate-github-copilot-app-modernization-for-java/allow-mcp-tool.png\":::\n\n          - For Intellij IDEA, you can select the **Continue** button, or update your settings, select the **Tools** > **GitHub Copilot** configuration window, and then select **Auto-approve**. We also recommend enabling **Trust MCP Tool Annotations** and increasing **Max Requests** to `99`.\n\n            :::image type=\"content\" source=\"media/migrate-github-copilot-app-modernization-for-java/intellij-allow-mcp-tool.png\" alt-text=\"Screenshot of the GitHub Copilot chat pane that shows the Continue button in Intellij IDEA.\" lightbox=\"media/migrate-github-copilot-app-modernization-for-java/intellij-allow-mcp-tool.png\":::\n\n      - question: What network configurations are required to use GitHub Copilot modernization in Visual Studio Code?\n        answer: To ensure that the extension works correctly within Visual Studio Code, network connectivity must be stable and allow access to GitHub Copilot services. In restricted environments, you might need to configure proxy or firewall rules accordingly. If you encounter errors like \"Language Model Unavailable\" in the chat window, see the official troubleshooting guide [Managing GitHub Copilot access to your enterprise's network](https://docs.github.com/en/enterprise-cloud@latest/copilot/how-tos/administer-copilot/manage-for-enterprise/manage-access/manage-network-access).\n\n      - question: Are there any settings in GitHub Copilot that I should configure to make sure I get all the features?\n        answer: |\n          GitHub Copilot might block certain code generations for files that commonly resemble public code, such as **pom.xml**. To prevent Copilot from blocking these changes, you must allow suggestions matching public code. For instructions, see [Enabling or disabling suggestions matching public code](https://docs.github.com/en/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/managing-your-copilot-plan/managing-copilot-policies-as-an-individual-subscriber#enabling-or-disabling-suggestions-matching-public-code).\n\n          To manage the settings for GitHub Copilot in your organization, see [Enabling Copilot features in your organization](https://docs.github.com/en/copilot/how-tos/administer/organizations/managing-policies-for-copilot-in-your-organization#enabling-copilot-features-in-your-organization).\n\n      - question: Why don't I see tools in GitHub Copilot modernization that use the Model Context Protocol (MCP) server?\n        answer: |\n          GitHub Copilot modernization uses the MCP server to provide specialized migration functionalities. When you select **Refresh**, it establishes a connection with this server and updates the available tools in the chat agent. This action is only necessary in the following cases:\n\n          - When you open a Java project for migration for the first time.\n          - When you upgrade the extension to a newer version.\n\n      - question: Why is the code regeneration process unstable?\n        answer: GitHub Copilot modernization is powered by AI, so occasional errors might occur. Always review the output carefully before use. You can also retry the regeneration process to see alternative code suggestions.\n\n      - question: Where are skills stored on the local machine and how can they be shared?\n        answer: |\n          Predefined tasks are in the following location: `%USERPROFILE%.vscode\\extensions\\microsoft.migrate-java-to-azure-0.1.0\\rag`\n\n          Custom skills are stored in the `.github/skills/` directory within your project. Legacy custom tasks are automatically migrated from `.github/appmod/custom-tasks/` and VS Code user data on first load.\n\n      - question: How can I view more details about the code changes made by the agent?\n        answer: The agent always includes explanations for its code changes in the chat window. However, these details might be collapsed in the UI. You can expand the response in the chat to see the full rationale and step-by-step reasoning.\n\n      - question: Can I use the GitHub Copilot modernization feature in IntelliJ IDEA on a Linux platform?\n        answer: We currently only support Windows and macOS platforms.\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-oracle-to-postgresql.md",
    "content": "---\ntitle: Migrate From Oracle to PostgreSQL by Using GitHub Copilot Modernization\ntitleSuffix: Azure\ndescription: Provides instructions to guide you in migrating Java projects from Oracle to PostgreSQL database.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiading\nms.topic: overview\nms.date: 01/13/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Migrate from Oracle to PostgreSQL by using GitHub Copilot modernization\n\nThis article provides instructions to guide you in migrating Java projects from Oracle to PostgreSQL database by using GitHub Copilot modernization.\n\nFor app code changes related to database migration scenarios, GitHub Copilot modernization provides a list of predefined tasks to support you on homogeneous migration. The scenarios include migration from PostgreSQL, Microsoft SQL Server, MySQL, Cassandra, MongoDB, and other databases to the corresponding Azure database offering. The tool also supports heterogeneous migration from Oracle to Azure PostgreSQL. The tasks mainly help you prepare your codebase for Managed Identity authentication to the Azure databases.\n\nAnother important factor to consider during database migration is SQL dialect conversion, which encompasses both static and dynamic SQL present in application code. For homogeneous migrations, SQL conversion is typically unnecessary because the database type remains the same. However, in heterogeneous migrations - such as transitioning from Oracle to PostgreSQL - the process of converting SQL can be complex and requires considerable effort.\n\n## New advances for Oracle to PostgreSQL migration\n\nWe now offer two significant advances for the Oracle to PostgreSQL migration scenario in partnership with the Azure PostgreSQL team:\n\n- AI-powered database migration tooling: PostgreSQL tooling powered by AI that can efficiently manage the database migration process from Oracle to PostgreSQL, thereby reducing manual intervention and minimizing the risk of errors.\n\n- Smart SQL conversion in app code: to support necessary application code changes, we offer built-in SQL conversion functionality in GitHub Copilot modernization, seamlessly integrated as part of a unified task workflow.\n\n## Database migration with AI-powered database migration tooling\n\nTo understand how to install and use the AI-powered database migration tooling - the PostgreSQL Visual Studio Code extension for DB migration - see [What is the PostgreSQL extension for Visual Studio Code preview?](/azure/postgresql/extensions/vs-code-extension/overview)\n\n## Database-related app code change with smart SQL conversion\n\nGitHub Copilot modernization now provides a dedicated migration task designed to address both the database client update - using Managed Identity authentication - and SQL conversion required for the Oracle to PostgreSQL migration scenario.\n\nA key feature is the ability to leverage coding notes. Coding notes detail schema changes for the database migration that you can optionally use to produce more precise and semantically aligned PostgreSQL-compatible code. Coding notes are metadata artifacts automatically generated during the database schema conversion phase using [PostgreSQL Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-ossdata.vscode-pgsql). Coding notes can include the following information:\n\n- Data type mappings and structural changes.\n- Conversion details for sequences, identities, and composite types.\n- Adjustments to date/time or interval implementations.\n- References to tables with referential integrity constraints.\n- Summaries of complex Oracle packages, including procedure and function signatures.\n- Additional AI-generated hints to improve code translation accuracy.\n\n## Use the Oracle to PostgreSQL migration task\n\nUse the following steps to run the Oracle to PostgreSQL migration task in GitHub Copilot modernization:\n\n1. To run the application assessment, follow the instructions in [Quickstart: Assess and Migrate a Java Project Using GitHub Copilot modernization](migrate-github-copilot-app-modernization-for-java-quickstart-assess-migrate.md).\n\n1. After the assessment completes, review the generated report. If your application uses Oracle, the report reveals an Oracle-related issue **Database Migration (Oracle)** and the default solution is **Migrate from Oracle DB to PostgreSQL**.\n\n   :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java/oracle-postgresql-report.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java/oracle-postgresql-report.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization assessment report.\":::\n\n1. Optionally, you can get the coding notes placed properly in your app code folder. Check whether `coding_notes.md` is present in the `.github\\postgre-migrations\\*\\results\\application_guidance\\` folder. If it isn't present, go to the database team responsible for your Oracle to PostgreSQL migration to get it, and put it into the same folder structure.\n\n1. Next, select **Run Task** to execute the migration. If coding notes are properly placed, GitHub Copilot modernization references these notes to produce a higher quality SQL conversion as well as the database client update using Managed Identity authentication. Otherwise, the conversion applies general Oracle-to-PostgreSQL syntax adjustments to propose changes.\n\n   :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java/oracle-postgresql-coding-notes.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java/oracle-postgresql-coding-notes.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization task execution for Oracle to PostgreSQL.\":::\n\n## See also\n\nTo learn more about GitHub Copilot modernization, see [GitHub Copilot modernization documentation](../../github-copilot-app-modernization/index.yml).\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-predefined-tasks.md",
    "content": "---\ntitle: Predefined Tasks for GitHub Copilot Modernization for Java Developers\ntitleSuffix: Azure\ndescription: Provides an overview of predefined tasks.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiading\nms.topic: overview\nms.date: 01/13/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Predefined tasks for GitHub Copilot modernization for Java developers\n\nThis article describes the predefined tasks available to Java developers for GitHub Copilot modernization.\n\nPredefined tasks capture industry best practices for using Azure services. Currently, GitHub Copilot modernization offers predefined tasks that cover common migration scenarios. These tasks address the following subjects, and more:\n\n- Secret management\n- Message queue integration\n- Monitoring\n- Identity management\n\n> [!NOTE]\n> This list will grow based on customer feedback and evolving cloud needs.\n\nThe following video demonstrates using GitHub Copilot modernization to apply a predefined task to migrate a Java project to Azure:\n\n<br>\n\n> [!VIDEO https://www.youtube.com/embed/6dgqToLNa58]\n\n## Task list\n\nGitHub Copilot modernization currently supports the following predefined tasks:\n\n- Spring RabbitMQ to Azure Service Bus\n\n  This task converts an application that uses Spring messaging frameworks - including Spring Advanced Message Queuing Protocol (AMQP) and Spring Java Message Service (JMS) - with RabbitMQ, changing it to use the managed service Azure Service Bus instead. The message queue interaction logic is adapted to the Azure Service Bus equivalent, preserving the messaging patterns and semantics while enabling secure authentication mechanisms by default.\n\n- Managed Identities for Database migration to Azure\n\n  The Azure database offerings - Azure SQL Server, Azure Database for MySQL, Azure Database for PostgreSQL, Azure Cosmos DB for Cassandra API, and Azure Cosmos DB for MongoDB - support secure sign-in using Managed Identity. When you migrate an application from a local database to a managed Azure cloud database, this task helps you prepare your codebase for Managed Identity authentication to the database.\n\n- Managed Identities for Credential Migration on Azure\n\n  Authentication using connection strings introduces security vulnerabilities and maintenance overhead. This task transforms your Java applications to use Azure's Managed Identity authentication for messaging services like Azure Event Hubs and Azure Service Bus. When you integrate with Microsoft Identity client libraries, your code no longer needs to store sensitive connection strings or shared access signatures in configuration files.\n\n- Amazon Web Services (AWS) S3 to Azure Storage Blob\n\n  When you migrate your service from AWS to Azure, you can transition from AWS S3 to Azure Storage Blob. This task helps you convert the code logic that interacts with AWS S3 into code logic that operates with Azure Storage Blob, while maintaining the same semantics.\n\n- Logging to local file\n\n  Azure hosting services integrate with Azure Monitor by default, collecting log output to the console and enabling you to query and monitor them. At the same time, logging to files in a cloud environment isn't recommended because it requires extra log rotation and transfer. This task helps you convert file-based logging in your application to console-based logging, making it ready for integration with Azure Monitor.\n\n- Local file I/O to Azure Storage File share mounts\n\n  Azure hosting services offer flexibility in provisioning, scaling, failover, and more. At the same time, the file system for a given application runtime is transient. If your application reads from or writes to a local file, this task helps you identify such cases and convert them into unified mount path access. By doing so, you can mount an Azure Storage File share to the specified path, enabling your application to share and persist data across different replicas without concerns about relocation, failover, or similar issues.\n\n- Java Mail to Azure Communication Service\n\n  Migrating applications with Simple Mail Transfer Protocol (SMTP) dependencies can be challenging because not all Azure environments support outgoing requests on port 25. This task helps convert an application that sends mail over SMTP to use Azure Communication Services, which is fully compatible with Azure hosting environments.\n\n- Secrets and Certificate Management to Azure Key Vault\n\n  This task helps migrate sensitive security assets to Azure Key Vault. It supports both hardcoded secrets in your codebase and local TLS/mTLS certificates managed in Java KeyStores. For secrets, it identifies suspicious secret texts and converts them into logic that retrieves the data from Azure Key Vault. For certificates, it transitions your application from managing certificates locally to using Azure Key Vault's Java Cryptography Architecture (JCA) provider while maintaining the same functionality and security posture.\n\n- User authentication to Microsoft Entra ID authentication\n\n  Java applications often use LDAP-based authentication solutions that aren't easily migrated to Azure. This task helps you transition your local user authentication mechanism to one that uses Microsoft Entra ID for authentication.\n\n- SQL Dialect: Oracle to PostgreSQL\n\n  When you transition from Oracle to PostgreSQL, differences in SQL dialects can pose significant challenges. This task converts Oracle-specific SQL queries, data types, and proprietary functions in your Java code to their PostgreSQL equivalents, ensuring a seamless integration with Azure Database for PostgreSQL.\n\n- AWS Secret Manager to Azure Key Vault\n\n  Moving from AWS Secret Manager to Azure Key Vault requires reconfiguring how your application handles sensitive information. This task transforms all aspects of secret management in your code - from creation and retrieval to updating and deletion - and uses Azure Key Vault's comprehensive security capabilities and authentication models.\n\n- ActiveMQ to Azure Service Bus\n\n  Applications built on Apache ActiveMQ can be modernized to use Azure's managed messaging service. This task converts your ActiveMQ message producers, consumers, connection factories, and queue/topic interactions to their Azure Service Bus equivalents, implementing best practices for reliability and authentication in cloud environments.\n\n- Amazon Web Services (AWS) Simple Queue Service (SQS) to Azure Service Bus\n\n  Transitioning from AWS SQS to Azure Service Bus involves reimplementing queue operations and message handling patterns. This task translates SQS-specific code constructs to their Azure Service Bus counterparts, preserving critical messaging semantics like at-least-once delivery, message batching, and visibility timeout behaviors while introducing Azure's enhanced security features.\n\n## See also\n\n[Quickstart: create and apply your own skills](migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-assess-migrate.md",
    "content": "---\ntitle: Assess and Migrate a Java Project Using GitHub Copilot modernization\ntitleSuffix: Azure\ndescription: Learn how to assess and migrate a Java project to Azure using GitHub Copilot modernization. Follow this quickstart to streamline your migration process.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haozhan\nms.topic: quickstart\nms.date: 03/20/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\nzone_pivot_group_filename: developer/java/java-zone-pivot-groups.json\nzone_pivot_groups: ide-set-one\n---\n\n# Quickstart: assess and migrate a Java project using GitHub Copilot modernization\n\nThis quickstart shows you how to use GitHub Copilot modernization to assess and migrate a Java project. In this quickstart, you install and configure the extension, then assess and migrate a sample project. For example, you use a predefined task to update an Azure SQL database connection to use Azure Managed Identity instead of a username and password.\n\nThe following video demonstrates how GitHub Copilot modernization uses [AppCAT](/azure/migrate/appcat/java) to help assess a Java project for migration to Azure:\n\n<br>\n\n> [!VIDEO https://www.youtube.com/embed/eX8rSMd4Dls]\n\n::: zone pivot=\"vscode\"\n[!INCLUDE [quickstart-assess-migrate-visual-studio-code.md](./includes/quickstart-assess-migrate-visual-studio-code.md)]\n::: zone-end\n\n::: zone pivot=\"intellij\"\n[!INCLUDE [quickstart-assess-migrate-intellij-idea.md](./includes/quickstart-assess-migrate-intellij-idea.md)]\n::: zone-end\n\n## Apply a predefined task\n\nFor migration, Copilot provides predefined tasks for common migration scenarios that you might face when migrating to Azure. For example, by using the `mi-sql-public-demo` sample, the **Database Migration (Microsoft SQL)** task changes the Azure SQL database connection to use Azure Managed Identity instead of a username and password.\n\nTo apply a predefined task, use the following steps:\n\n1. In the **Assessment Report**, select **Run Task**. The Copilot chat window opens with Agent Mode selected.\n\n1. The Copilot agent uses various tools for GitHub Copilot modernization, and each tool might require confirmation to proceed. The agent first generates `plan.md` and `progress.md`. You can review `plan.md` and make changes there, if necessary.\n\n1. Manually enter **continue** to confirm and start the migration process.\n\n1. Before it makes any code changes, the agent checks the version control system status and checks out a new branch for migration.\n\n1. Repeatedly select or enter **Continue** to confirm the use of tools or commands, and wait for the code changes to finish.\n\n> [!NOTE]\n> In Visual Studio Code, GitHub Copilot modernization uses the `AppModernization` custom agent with Claude Sonnet 4.5 by default for best results when updating Java code to migrate to Azure. It falls back to the `auto` model if Sonnet 4.5 isn't available to you. You can configure the custom agent to [modify the `model` setting](https://code.visualstudio.com/docs/copilot/customization/custom-agents#_custom-agent-file-structure) by selecting **Configure Custom Agents** from the **Agent** menu. Alternatively, you can use the language model picker in the chat window to switch models for the current chat session.\n\n### Validation iteration\n\nAfter you finish the code changes, manually enter **continue** to proceed with the validation and fix iteration loop. This loop includes the following five parts:\n\n- Apply the `Validate-CVEs` tool. This tool attempts to detect Common Vulnerabilities and Exposures (CVEs) in current dependencies and fix them.\n- Apply the `Build-Project` tool. This tool attempts to resolve any build errors.\n- Apply the `Consistency-Validation` tool. This tool analyzes the code for functional consistency.\n- Apply the `Run-Test` tool. This tool analyzes the project for unit test failures and automatically generates a plan to fix them. The `Run-Test` tool iteratively runs unit tests and fixes any failures.\n- Apply the `Completeness-Validation` tool. This tool catches migration items missed in initial code migration and fixes them.\n\nAfter all processes complete, enter **continue** to generate the migration summary as the final step. Review the code changes and confirm them by selecting **Keep**.\n\n## Generate unit test cases\n\nTo generate unit test cases, use the following steps:\n\n1. On the sidebar, select the **GitHub Copilot modernization** pane.\n\n1. In the **TASKS** section, open **Quality & Security Tasks**, and then select **Generate Unit Test Cases**.\n\nThe agent generates unit tests and creates a **TestReport** to show test results before and after generation. For more information, see [Quickstart: generate unit tests with GitHub Copilot modernization](/java/upgrade/quickstart-unit-tests).\n\n## Next steps\n\n- [Working with assessment](migrate-github-copilot-app-modernization-for-java-working-with-assessment.md)\n- [Quickstart: create and apply your own skills](migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-chat-window.md",
    "content": "---\ntitle: \"Optimize Chat Results for Migrating Java Apps to Azure\"\ntitleSuffix: GitHub Copilot Modernization - Azure\ndescription: Shows you how to optimize chat results by using the AppModernization custom agent for migrating Java applications to Azure.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiading\nms.topic: how-to\nms.date: 01/21/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\nai-usage: ai-generated\n---\n\n# Optimize chat results for migrating Java apps to Azure\n\nThis quickstart shows you how to optimize chat results by using the AppModernization custom agent to migrate Java applications to Azure. The AppModernization custom agent is optimized for application modernization tasks and enables you to use simple, natural language prompts to perform complex migration scenarios.\n\n## Prerequisites\n\n[!INCLUDE [prerequisites](includes/migrate-github-copilot-app-modernization-for-java-quickstart-prerequisites.md)]\n\n## Select the AppModernization custom agent\n\nThe AppModernization custom agent provides the best experience for Java application migration and modernization tasks. Use the following steps to select it:\n\n1. Open Visual Studio Code and ensure you have the GitHub Copilot modernization extension installed.\n\n1. Open the Copilot chat window by selecting the chat icon in the **Activity Bar**.\n\n1. In the chat window, locate the agent selector dropdown menu at the top of the chat input box and select **AppModernization** from the list. This custom agent is designed for Java application modernization and migration scenarios.\n\n   :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java/agent-selector.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java/agent-selector.png\" alt-text=\"Screenshot of Visual Studio Code that shows the agent selector dropdown in the chat window.\":::\n\n> [!NOTE]\n> Although you can select different language models in the chat window, Claude Sonnet 4.5 is the tested and recommended model for best results with Java application modernization tasks.\n\n> [!IMPORTANT]\n> The AppModernization custom agent is currently available only for Visual Studio Code.\n\n## Use simple prompts for migration\n\nWith the AppModernization agent selected, use simple, natural language prompts to perform migration tasks. The agent understands migration context and can handle complex scenarios with minimal input.\n\n### Example: Migrate from RabbitMQ to Azure Service Bus\n\n1. Make sure you have a Java project open in Visual Studio Code that uses RabbitMQ.\n\n1. In the Copilot chat window with the AppModernization agent selected, enter the following prompt:\n\n   ```prompt\n   migrate from rabbitmq to Azure service bus\n   ```\n\n1. The agent analyzes your code, creates a migration plan, makes code changes, runs validations, and generates a summary. Select **Continue** to proceed through each step and **Keep** to accept the changes.\n\n### Other migration scenarios\n\nThe AppModernization agent supports various migration scenarios with simple prompts. Here are more examples:\n\n- **Database migration**:\n\n  ```prompt\n  migrate from Oracle to Azure PostgreSQL\n  ```\n\n- **Authentication migration**:\n\n  ```prompt\n  migrate to Managed Identity for Azure SQL Database\n  ```\n\n- **Storage migration**:\n\n  ```prompt\n  migrate from AWS S3 to Azure Storage Blob\n  ```\n\n- **Messaging migration**:\n\n  ```prompt\n  migrate from ActiveMQ to Azure Service Bus\n  ```\n\n- **Secret management**:\n\n  ```prompt\n  migrate secrets to Azure Key Vault\n  ```\n\n## Next steps\n\n- [Quickstart: assess and migrate a Java project](migrate-github-copilot-app-modernization-for-java-quickstart-assess-migrate.md)\n- [Quickstart: create and apply your own skills](migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md)\n- [Predefined tasks for GitHub Copilot modernization](migrate-github-copilot-app-modernization-for-java-predefined-tasks.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-containerization.md",
    "content": "---\ntitle: \"Quickstart: Containerize Your Project by Using GitHub Copilot Modernization\"\ntitleSuffix: Azure\ndescription: Shows you how to containerize your project by using GitHub Copilot modernization.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: honc\nms.topic: quickstart\nms.date: 03/11/2026\nai-usage: ai-assisted\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Quickstart: Containerize your project by using GitHub Copilot modernization\n\nIn this quickstart, you containerize your project by using GitHub Copilot modernization.\n\nTo use container compute services like Azure Kubernetes Service and Azure Container Apps, you need to containerize your project by creating a Dockerfile and other related configuration files, and build container images. The GitHub Copilot modernization extension automates this containerization process.\n\n## Prerequisites\n\n- A GitHub account with an active [GitHub Copilot](https://github.com/features/copilot) subscription under any plan.\n- One of the following IDEs:\n  - The latest version of [Visual Studio Code](https://code.visualstudio.com/) (version 1.106 or later) with the following extensions:\n    - [GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/overview). For setup instructions, see [Set up GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/setup). Be sure to sign in to your GitHub account within Visual Studio Code.\n    - [GitHub Copilot modernization](https://marketplace.visualstudio.com/items?itemName=vscjava.migrate-java-to-azure). Restart Visual Studio Code after installation.\n  - The latest version of [IntelliJ IDEA](https://www.jetbrains.com/idea/download) (version 2023.3 or later) with the following plugins:\n    - [GitHub Copilot](https://plugins.jetbrains.com/plugin/17718-github-copilot) (version 1.5.59 or later). Be sure to sign in to your GitHub account within IntelliJ IDEA.\n    - [GitHub Copilot modernization](https://plugins.jetbrains.com/plugin/28791-github-copilot-app-modernization). Restart IntelliJ IDEA after installation.\n- [Docker](https://www.docker.com/) installed and running.\n\n> [!NOTE]\n> [!INCLUDE [Azure account note](../../includes/github-copilot-modernization-azure-note.md)]\n\n## Containerize your project\n\nUse the following steps to start the containerization process:\n\n1. Make sure you have Docker installed and running.\n\n1. In Visual Studio Code, open your migrated project.\n\n1. In the **Activity** sidebar, open the **GitHub Copilot modernization** extension pane.\n\n1. In the **Tasks** section, open **Containerize Tasks** and select **Containerize Application**.\n\n   :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java/java-containerize.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java/java-containerize.png\" alt-text=\"Screenshot of Visual Studio Code that shows the Containerize Application task with the Run Task button highlighted.\":::\n\n1. After you select the task, the Copilot chat window with Agent Mode opens automatically.\n\n1. Select **Continue** repeatedly to confirm each tool action in the Copilot Chat window. The Copilot Agent uses various tools to facilitate containerization. Each tool's usage requires confirmation by selecting **Continue**.\n\n1. Copilot typically goes through the following steps to containerize your project:\n\n   - Checks that Docker is installed and running.\n   - Checks that the application code is ready to run in a container.\n   - Creates a Dockerfile for each project.\n   - Builds Docker images for each project.\n   - Scans the built Docker images for known vulnerabilities (CVEs).\n   - Creates a summary of the containerization results.\n\n> [!NOTE]\n> We recommend using Claude Sonnet 4 or later models for the best results.\n>\n> It might take Copilot a few iterations to correct containerization errors.\n\n## Customize with your own prompts\n\nThe **Containerize Application** button sends a predefined prompt. For more control, type a custom prompt directly in the Copilot chat with Agent mode. This approach lets you specify containerization preferences for your project.\n\n> [!TIP]\n> Example prompts for different scenarios:\n>\n> - `\"Containerize my application using a multi-stage Dockerfile to minimize the final image size\"` - optimize for production image size.\n> - `\"Create a Dockerfile for my project using Eclipse Temurin 21 as the base image\"` - specify a particular base image.\n> - `\"Containerize all modules in this multi-module project and create a docker-compose.yml for local testing\"` - handle multi-module projects with compose.\n> - `\"Containerize my app and push the image to my Azure Container Registry: <acr-name>.azurecr.io\"` - build and push in one step.\n\n## See also\n\n- GitHub Copilot modernization uses certain tools in containerization assist. For more information, see the [containerization-assist](https://github.com/Azure/containerization-assist) repository on GitHub.\n- [GitHub Copilot modernization documentation](../../github-copilot-app-modernization/index.yml)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md",
    "content": "---\ntitle: \"Quickstart: Create and Apply Your Own Skill\"\ntitleSuffix: GitHub Copilot Modernization - Azure\ndescription: Shows you how to create and apply your own custom skill.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiading\nms.topic: quickstart\nms.date: 03/11/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Quickstart: create and apply your own skills for GitHub Copilot modernization\n\nThis quickstart shows you how to create and apply your own custom skills when you use GitHub Copilot modernization.\n\nGitHub Copilot modernization supports custom skills to codify your organizational knowledge for custom library upgrade, configuration updates, enforcing coding standards, and more. You can also copy the out-of-box Microsoft tasks into custom skills to adjust them to your needs. You can reuse, share, and improve custom skills to boost the efficiency of your team.\n\n> [!NOTE]\n> If you previously used custom tasks - stored in `.github/appmod/custom-tasks/` of the project or Visual Studio Code user data - the extension automatically migrates them to the new `.github/skills/` location of the project on first load.\n\n## Prerequisites\n\n[!INCLUDE [prerequisites](includes/migrate-github-copilot-app-modernization-for-java-quickstart-prerequisites.md)]\n\n## Create your own skill\n\nUse the following steps to create a custom skill.\n\n### Define skill information\n\n1. In the **Activity** sidebar, open the **GitHub Copilot modernization** extension pane, hover over the **TASKS** section, and then select **Create a Custom Skill**.\n\n   :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java/create-custom-skill.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java/create-custom-skill.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization with the Create a Custom Skill button highlighted.\":::\n\n1. A `SKILL.md` file opens. Fill in the following fields. For the full skill format specification, see the [Agent Skills specification](https://agentskills.io/specification).\n\n   - **Skill Name**: A descriptive, hyphenated identifier for the skill. For example, \"Custom-skill-migrate-rabbitmq\".\n   - **Skill Description**: A concise summary of the skill's purpose. For example, \"Migrate RabbitMQ messaging to Azure Service Bus for Spring Boot applications\".\n   - **Skill Content**: Detailed instructions that guide Copilot during code migration. You can reference files from the **Resources** section by name in this field. For example, \"You are a Spring Boot developer assistant, follow `guide.md` to migrate from RabbitMQ to Azure Service Bus.\"\n\n### Add resources\n\nResources provide reference knowledge that Copilot uses when it applies the skill. Select **Add Resources** and choose a resource type:\n\n- **Files**: Select individual files that contain migration instructions, configuration examples, or other reference material. To include a Git commit diff as a resource, select the corresponding diff file.\n\n- **Folders**: Select a folder to include all files within it as resources. This option is useful when reference knowledge spans multiple related files.\n\n   :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java/custom-skill-add-resources.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java/custom-skill-add-resources.png\" alt-text=\"Screenshot of Visual Studio Code that shows the GitHub Copilot modernization custom skill with the Add Resources button highlighted.\":::\n\nThe selected files are copied to `.github/skills/<skill-name>/` in your project. Resource files and folders are stored alongside `SKILL.md` in the skill folder. The total resource size is limited. Be sure to reference these files or folders by name in the **Skill Content** field so that Copilot knows when to use them.\n\n### Save the skill\n\nAfter you complete all fields and add resources, select **Save**. The custom skill appears in the **My Skills** section.\n\n## Share your own skill\n\nShare a skill with others by copying its folder from your project:\n\n1. Copy the skill folder located under `.github/skills/` and share it with the intended recipient.\n\n   :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java/custom-skill-share.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java/custom-skill-share.png\" alt-text=\"Screenshot of Visual Studio Code that shows copy a skill folder.\":::\n\n1. On the recipient's side, place the folder under `.github/skills/` in their project root. Create the directory if it doesn't exist.\n\n1. Select **Refresh** in the extension pane. The skill appears in the **My Skills** section, ready to use.\n\n## Apply your own skill\n\nUse the following steps to apply your own skill:\n\n1. Select **Run** at the bottom of the `SKILL.md` file, or find the skill in the **My Skills** section and select **Run Skill**.\n\n1. The Copilot chat window opens in Agent Mode and automatically performs the following steps:\n\n   1. Creates **plan.md** and **progress.md**.\n   1. Checks the version control status and checks out a new migration branch.\n   1. Performs code migration.\n   1. Runs validations and fixes for build, unit tests, CVE, consistency check and completeness check.\n   1. Generates a **summary.md** file.\n\n1. If the agent pauses for confirmation or is interrupted, enter **Continue** to proceed.\n\n1. After all steps finish, review the code changes and select **Keep** in the chat window to confirm.\n\n## Copy to My Skills\n\nIf you want to customize a Microsoft task, you can export it to **My Skills** as a starting point and then modify it to fit your needs:\n\n1. In the **TASKS** section, locate the Microsoft task that you want to customize.\n\n1. Right-click the item and select **Copy to My Skills**.\n\n   :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java/custom-skill-copy.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java/custom-skill-copy.png\" alt-text=\"Screenshot of Visual Studio Code that shows Copy a Microsoft task to My Skills.\":::\n\n1. A new `SKILL.md` file opens, prefilled with the content from the selected item. Edit the **Skill Name**, **Description**, **Content**, and **Resources** fields as needed.\n\n1. Select **Save**. The skill appears in the **My Skills** section.\n\n## Update or delete your own skill\n\nIn the **My Skills** section, right-click the skill you want to modify and choose one of the following options:\n\n- **Edit** to update the skill.\n- **Delete** to remove the skill.\n\n## Frequently asked questions\n\n### If I manually place a skill folder in `.github/skills/`, does the extension recognize it?\n\nYes. If you place a valid skill folder containing a `SKILL.md` file under `.github/skills/` in your project root, the extension recognizes it after you select **Refresh** in the extension pane. The skill appears in the **My Skills** section of the **TASKS** panel, and you can run, edit, or delete it the same way as any other custom skill.\n\nHowever, only resource files that are explicitly referenced in `SKILL.md` are displayed in the extension UI. When you use the **Add Resources** button, the extension copies the selected files into the skill folder and adds a link entry in `SKILL.md` under the **Resources** section, for example:\n\n```markdown\n**Resources:**\n- file:///references.txt\n```\n\nIf you manually place extra files in the skill folder without adding these link entries, the extension doesn't display them. To ensure that resource files appear in the UI and are available to Copilot, always add them through the **Add Resources** button or manually add the corresponding link entries in `SKILL.md`.\n\n## Next step\n\n[Predefined tasks for GitHub Copilot modernization](migrate-github-copilot-app-modernization-for-java-predefined-tasks.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-deploy-to-azure.md",
    "content": "---\ntitle: \"Quickstart: Deploy Your Project to Azure by Using GitHub Copilot Modernization\"\ndescription: Shows you how to deploy your migrated application to Azure by using GitHub Copilot modernization.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: honc\nms.topic: quickstart\nms.date: 03/11/2026\nai-usage: ai-assisted\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Quickstart: Deploy your project to Azure by using GitHub Copilot modernization\n\nIn this quickstart, you deploy your project to Azure by using GitHub Copilot modernization.\n\nDuring development, you often need to deploy your project to a cloud environment for testing. The GitHub Copilot modernization extension automates the deployment process, deploying your migrated project to Azure and fixing any deployment errors along the way.\n\n## Prerequisites\n\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- A GitHub account with an active [GitHub Copilot](https://github.com/features/copilot) subscription under any plan.\n- One of the following IDEs:\n  - The latest version of [Visual Studio Code](https://code.visualstudio.com/) (version 1.106 or later) with the following extensions:\n    - [GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/overview). For setup instructions, see [Set up GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/setup). Be sure to sign in to your GitHub account within Visual Studio Code.\n    - [GitHub Copilot modernization](https://marketplace.visualstudio.com/items?itemName=vscjava.migrate-java-to-azure). Restart Visual Studio Code after installation.\n  - The latest version of [IntelliJ IDEA](https://www.jetbrains.com/idea/download) (version 2023.3 or later) with the following plugins:\n    - [GitHub Copilot](https://plugins.jetbrains.com/plugin/17718-github-copilot) (version 1.5.59 or later). Be sure to sign in to your GitHub account within IntelliJ IDEA.\n    - [GitHub Copilot modernization](https://plugins.jetbrains.com/plugin/28791-github-copilot-app-modernization). Restart IntelliJ IDEA after installation.\n\n## Deploy your project\n\nUse the following steps to start the deployment process:\n\n1. In Visual Studio Code, open your migrated project.\n\n1. In the **Activity** sidebar, open the **GitHub Copilot modernization** extension pane.\n\n1. In the **Tasks** section, open **Deployment Tasks** and select **Deploy to Existing Azure Infrastructure**.\n\n   If you haven't provisioned infrastructure yet, see [Quickstart: Prepare Azure infrastructure](migrate-github-copilot-app-modernization-for-java-quickstart-infrastructure.md) first.\n\n   :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java/java-deploy-to-azure.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java/java-deploy-to-azure.png\" alt-text=\"Screenshot of Visual Studio Code that shows the Provision Infrastructure and Deploy to Azure task with the Run Task button highlighted.\":::\n\n1. After you select the task, the Copilot chat window with Agent Mode opens automatically.\n\n1. Select **Continue** repeatedly to confirm each tool action in the Copilot Chat window. The Copilot Agent uses various tools to facilitate deployment to Azure. Each tool's usage requires confirmation by selecting **Continue**. Provide Copilot with the necessary information, like subscription and resource group, as it prompts you.\n\n1. Copilot typically goes through the following steps to deploy your project:\n\n   - Copilot generates a deployment plan markdown file with the deployment goal, project information, Azure resource architecture, Azure resources, and execution steps.\n   - Copilot follows the execution steps in this file.\n   - Copilot fixes deployment errors.\n   - Copilot generates a summary file explaining the results of the deployment.\n\n> [!NOTE]\n> We recommend using Claude Sonnet 4 or later models for the best results.\n>\n> It might take Copilot a few iterations to correct deployment errors.\n\n## Customize with your own prompts\n\nThe **Deploy to Existing Azure Infrastructure** button sends a predefined prompt. For more control, type a custom prompt directly in the Copilot chat with Agent mode. This approach lets you specify deployment targets and preferences.\n\n> [!TIP]\n> Example prompts for different scenarios:\n>\n> - `\"Deploy my app to the AKS cluster in subscription: <sub-id>, resource group: <rg-name>\"` - target a specific Kubernetes cluster.\n> - `\"Deploy my containerized application to Azure Container Apps and configure auto-scaling with a minimum of 2 replicas\"` - specify scaling preferences.\n\n\n## See also\n\n- [Quickstart: Prepare Azure infrastructure](migrate-github-copilot-app-modernization-for-java-quickstart-infrastructure.md)\n- [GitHub Copilot modernization documentation](../../github-copilot-app-modernization/index.yml)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-quickstart-infrastructure.md",
    "content": "---\ntitle: Prepare Azure Infrastructure Using GitHub Copilot Modernization\ndescription: Shows you how to generate infrastructure as code and provision Azure resources by using GitHub Copilot modernization.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: honc\nms.topic: quickstart\nms.date: 03/11/2026\nai-usage: ai-generated\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Quickstart: Prepare Azure infrastructure by using GitHub Copilot modernization\n\nIn this quickstart, you generate infrastructure-as-code (IaC) files and provision Azure resources for your project by using GitHub Copilot modernization.\n\nBefore deploying an application to Azure, you need the right cloud infrastructure in place. The **Generate Infrastructure as Code and Provision** task in the GitHub Copilot modernization extension automates this process - it analyzes your project, generates IaC files, and provisions the required Azure resources. This process includes the ability to create an [Azure landing zone](/azure/cloud-adoption-framework/ready/landing-zone/) tailored to your application, covering networking, identity, governance, and security foundations.\n\n## Prerequisites\n\n- An Azure account with an active subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- A GitHub account with an active [GitHub Copilot](https://github.com/features/copilot) subscription under any plan.\n- One of the following IDEs:\n  - The latest version of [Visual Studio Code](https://code.visualstudio.com/) (version 1.106 or later) with the following extensions:\n    - [GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/overview). For setup instructions, see [Set up GitHub Copilot in Visual Studio Code](https://code.visualstudio.com/docs/copilot/setup). Be sure to sign in to your GitHub account within Visual Studio Code.\n    - [GitHub Copilot modernization](https://marketplace.visualstudio.com/items?itemName=vscjava.migrate-java-to-azure). Restart Visual Studio Code after installation.\n  - The latest version of [IntelliJ IDEA](https://www.jetbrains.com/idea/download) (version 2023.3 or later) with the following plugins:\n    - [GitHub Copilot](https://plugins.jetbrains.com/plugin/17718-github-copilot) (version 1.5.59 or later). Be sure to sign in to your GitHub account within IntelliJ IDEA.\n    - [GitHub Copilot modernization](https://plugins.jetbrains.com/plugin/28791-github-copilot-modernization). Restart IntelliJ IDEA after installation.\n\n## Prepare your infrastructure\n\nUse the following steps to generate IaC files and provision Azure resources:\n\n1. In Visual Studio Code, open your project.\n\n1. In the **Activity** sidebar, open the **GitHub Copilot modernization** extension pane.\n\n1. In the **Tasks** section, select **Generate Infrastructure as Code and Provision**.\n\n   :::image type=\"content\" source=\"./media/migrate-github-copilot-app-modernization-for-java/java-prepare-infra.png\" lightbox=\"./media/migrate-github-copilot-app-modernization-for-java/java-prepare-infra.png\" alt-text=\"Screenshot of Visual Studio Code that shows the Generate Infrastructure as Code and Provision task with the Run Task button highlighted.\":::\n\n1. After you select the task, the Copilot chat window with Agent Mode opens automatically.\n\n1. Select **Continue** repeatedly to confirm each tool action in the Copilot Chat window. The Copilot Agent uses various tools to facilitate infrastructure preparation. Each tool's usage requires confirmation by selecting **Continue**. Provide Copilot with the necessary information, such as subscription and resource group, as it prompts you.\n\n1. Copilot typically goes through the following steps to prepare your infrastructure:\n\n   - Analyzes your project to determine the technology stack, dependencies, and resource requirements.\n   - Proposes an Azure architecture with the appropriate hosting services and supporting resources.\n   - Generates IaC files, such as Bicep or Terraform.\n   - Provisions Azure resources based on the generated IaC files.\n   - Creates a summary of the infrastructure provisioning results.\n\n> [!NOTE]\n> For the best results, use Claude Sonnet 4 or later models.\n>\n> The agent can also reference assessment reports, architecture diagrams, landing zone guidelines, or compliance and security requirement documents in the repository to inform infrastructure decisions.\n\n## Customize with your own prompts\n\nThe **Generate Infrastructure as Code and Provision** button sends a predefined prompt. For more control, type a custom prompt directly in the Copilot chat with Agent Mode. This approach lets you combine different inputs and tailor the output to your needs.\n\n> [!TIP]\n> Example prompts for different scenarios:\n>\n> - `\"Create an Azure landing zone tailored to my application's architecture and requirements\"`—design a landing zone with networking, identity, and governance foundations.\n> - `\"Generate Bicep files for my project's Azure infrastructure based on the assessment report in docs/assessment.md, don't provision yet\"`—generate IaC only, referencing an assessment report.\n> - `\"Provision Azure infrastructure following the architecture diagram in docs/architecture.png and the compliance policies in docs/security-requirements.md\"`—combine architecture and compliance inputs.\n> - `\"Generate Terraform files for my project and provision resources in East US region\"`—request a specific IaC format and region.\n\n## See also\n\n- [GitHub Copilot modernization documentation](../../github-copilot-app-modernization/index.yml)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-sample.md",
    "content": "---\ntitle: Asset Manager Migration Sample\ntitleSuffix: GitHub Copilot Modernization - Azure\ndescription: Introduces the Asset Manager migration sample.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiading\nms.topic: overview\nms.date: 01/13/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# Asset Manager Java migration sample for GitHub Copilot modernization\n\nTo help you explore GitHub Copilot modernization, we prepared a migration code sample, [Asset Manager](https://github.com/Azure-Samples/java-migration-copilot-samples/tree/main/asset-manager). This sample stores user-uploaded images and metadata in the following locations:\n\n- RabbitMQ\n- Local file system\n- Amazon Web Services (AWS) S3\n\nYou can use GitHub Copilot modernization to migrate the app estate to Azure by using the following features:\n\n- AppCAT for solution assessment\n- Predefined tasks and custom skills to migrate code and configurations to the following locations:\n\n  - Azure Database for PostgreSQL\n  - Azure Blob Storage\n  - Azure Service Bus\n\n## See also\n\n[Asset Manager sample](https://github.com/Azure-Samples/java-migration-copilot-samples/tree/main/asset-manager)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java-working-with-assessment.md",
    "content": "---\ntitle: \"Working with Assessment: Comprehensive Guide to Application Assessment with GitHub Copilot Modernization for Java\"\ntitleSuffix: Azure\ndescription: Learn how to effectively work with application assessments in GitHub Copilot modernization, including configuration, interpretation, and report management.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haozhan\nms.topic: reference\nms.date: 03/20/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\nzone_pivot_group_filename: developer/java/java-zone-pivot-groups.json\nzone_pivot_groups: ide-set-one\n---\n\n# Working with assessment: Comprehensive guide to application assessment with GitHub Copilot Modernization for Java\n\nThis comprehensive guide covers advanced assessment capabilities in GitHub Copilot modernization to help you maximize the value of your application modernization assessment process.\n\nApplication assessment is a critical first step in your modernization journey. This article covers the complete assessment workflow to help you effectively work with assessment reports, configure assessments for different scenarios, and manage assessment data throughout your modernization process.\n\n::: zone pivot=\"vscode\"\n[!INCLUDE [working-with-assessment-visual-studio-code.md](./includes/working-with-assessment-visual-studio-code.md)]\n::: zone-end\n\n::: zone pivot=\"intellij\"\n[!INCLUDE [working-with-assessment-intellij-idea.md](./includes/working-with-assessment-intellij-idea.md)]\n::: zone-end\n\n## Next step\n\n[Quickstart: create and apply your own skills](migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-github-copilot-app-modernization-for-java.md",
    "content": "---\ntitle: GitHub Copilot Modernization for Java Developers\ntitleSuffix: Azure\ndescription: Provides an overview of GitHub Copilot modernization for Java developers.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiading\nms.topic: overview\nms.date: 01/13/2026\nms.custom: devx-track-java\nms.subservice: migration-copilot\nms.collection: ce-skilling-ai-copilot\nms.update-cycle: 180-days\n---\n\n# GitHub Copilot modernization for Java developers\n\nThis article describes GitHub Copilot modernization, which is an AI assistant that delivers end-to-end support for application modernization.\n\nEnterprises often deal with technical debt throughout their development cycles, and upgrading Java runtimes, frameworks, and dependencies is a common but resource-intensive task. At the same time, many organizations aim to migrate and modernize their application estate to the cloud, which involves:\n\n- Assessing the current state of code, configuration, and dependencies\n- Planning Azure resources\n- Remediating issues to enable successful migration\n\nBuilt on **GitHub Copilot agent mode**, GitHub Copilot modernization offers predefined tasks for common upgrade and migration scenarios while incorporating industry best practices for running applications on Azure. At the same time, it enables teams to infuse their own coding standards, organizational policies, and existing practices into the modernization process.\n\n## Key capabilities at a glance\n\n- **Application assessment and planning**: Analyzes code, configuration, and dependencies. Helps you visualize every task in the modernization process, from assessment to deployment.\n- **Code transformations**: Suggests and applies code remediation for upgrade and migration scenarios.\n- **Build, patching, and tests**: Verifies that the project builds successfully after remediation, and applies fixes when needed. Performs Common Vulnerabilities and Exposures (CVE) checks to reduce exposure to security vulnerabilities. Migrates existing and generates new unit tests to validate modernization outcomes and improve test coverage.\n- **Containerization and deployment**: Generates Dockerfiles for app containerization and other artifacts to automate deployment to Azure.\n\nGitHub Copilot modernization integrates GitHub Copilot's AI-powered capabilities with open-source tools like `OpenRewrite` to automate complex upgrade steps. It supports both Maven and Gradle projects and targets upgrades between Java versions 8, 11, 17, and 21. The tool has a particular focus on modernizing applications that use the Spring Boot framework. The upgrade process keeps you in control and ensures transparency by displaying all logs and outputs.\n\nStart your migration journey with **App Assessments** to get an overview of cloud readiness migration issues, including:\n\n- Instructions for setting up Azure resources\n- Recommendations on following best practices\n- Recommendations for changing your application code\n\nIn scenarios where code changes are required, GitHub Copilot modernization guides you through the remediation step. At this stage, you can use predefined tasks for common issues, such as:\n\n- Switching from password-based authentication to managed identities\n- Moving from Amazon Web Services (AWS) S3 to Azure Blob Storage\n\nTo learn more about predefined tasks available in GitHub Copilot modernization today, see [Predefined tasks](migrate-github-copilot-app-modernization-for-java-predefined-tasks.md).\n\nWhen it comes to development, enterprises often have strict processes and controls, which is where custom skills come in. For more information, see [Quickstart: create and apply your own skills for GitHub Copilot modernization](migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md)\n\nCustom skills can reference the code commits from previously migrated applications. These skills serve as remediation guides for similar issues in other apps, enabling Copilot to apply proven patterns across multiple codebases. With each successful migration, the knowledge base expands, accelerating future remediations and reducing manual effort.\n\nGitHub Copilot modernization also includes specialized agents to:\n\n- Verify your app builds successfully\n- Reduce technical debt by addressing CVEs\n- Validate behavioral integrity with unit tests\n\nFor more information, see [GitHub Copilot modernization Java utilities](/java/upgrade/tools).\n\nModernization isn't just about upgrading code, it's about preparing your applications for the cloud. Whether you're targeting Azure App Service, Azure Container Apps, Azure Kubernetes Service (AKS), or AKS Automatic, Copilot helps you get there faster and with confidence.\n\n## See also\n\n[GitHub Copilot modernization FAQ](migrate-github-copilot-app-modernization-for-java-faq.yml).\n"
  },
  {
    "path": "articles/java/migration/migrate-jboss-eap-to-azure-redhat-openshift.md",
    "content": "---\ntitle: Migrate JBoss EAP applications to Azure Red Hat OpenShift\ndescription: This guide describes what you should be aware of when you want to migrate an existing JBoss EAP application to run on Azure Red Hat OpenShift.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: template-how-to, devx-track-java, devx-track-javaee, devx-track-javaee-jbosseap, devx-track-javaee-jbosseap-aro, migration-java, devx-track-extended-java, linux-related-content\n---\n\n# Migrate JBoss EAP applications to Azure Red Hat OpenShift\n\nThis guide describes what you should be aware of when you want to migrate an existing JBoss EAP application to run on Azure Red Hat OpenShift.\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n[!INCLUDE [vm-aro-tradeoffs-eap](includes/vm-aro-tradeoffs-eap.md)]\n\n### Determine whether the prebuilt Azure Marketplace offer is a good starting point\n\nFirst, decide that Azure Red Hat OpenShift is the appropriate deployment target. Next, decide whether or not the prebuilt [Azure Marketplace offer](https://aka.ms/eap-aro-portal) is a good starting point. Consider the following points about the prebuilt Azure Marketplace offer:\n\n- Red Hat and Microsoft created this offer to enable quickly provisioning JBoss EAP on Azure Red Hat OpenShift.\n- At a high level, the offer automates the following steps for you.\n  - Install the EAP Operator on Azure Red Hat OpenShift.\n  - Build an application image using eap-s2i-build template. For more information about Source-to-image (S2I), see [Using OpenJDK 11 source-to-image for OpenShift](https://docs.redhat.com/en/documentation/red_hat_build_of_openjdk/11/html/using_source-to-image_for_openshift_with_red_hat_build_of_openjdk_11/index).\n  - Deploy the Java application using the EAP Operator. For more information, see the reference documentation for EAP Operator at [Red Hat](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/getting_started_with_jboss_eap_for_openshift_online/eap-operator-for-automating-application-deployment-on-openshift_default).\n\nIf you don't use the prebuilt Azure Marketplace offer, you must learn how to use the EAP Operator directly. Mastering the operator is beyond the scope of this article. The complete documentation for the EAP Operator is available at [Red Hat](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/getting_started_with_jboss_eap_for_openshift_online/eap-operator-for-automating-application-deployment-on-openshift_default).\n\nThe remainder of this section provides some considerations for deciding to use the prebuilt Azure Marketplace offer or using the operator directly.\n\n### Determine whether the JBoss EAP version is compatible\n\nYour existing JBoss EAP version must be one of the versions supported by the operator. For more information, see [Version Compatibility and Support](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/getting_started_with_jboss_eap_for_openshift_container_platform/introduction#version_compatibility_support) in the Red Hat documentation.\n\n### Inventory server capacity\n\nDocument the hardware (memory, CPU, disk) of the current production server(s) and the average and peak request counts and resource utilization. You need this information regardless of the migration path you choose. The following aspects, and more, benefit from having a detailed inventory of server capacity.\n\n- To help guide selection of the size of the VMs in your node pool.\n- To understand the amount of memory to be used by the container.\n- To know how many CPU shares the container needs.\n\nIt's possible to resize node pools in Azure Red Hat OpenShift. For more information, see [Resizing a cluster--Microsoft Azure](https://access.redhat.com/documentation/en-us/red_hat_advanced_cluster_management_for_kubernetes/2.0/html/manage_cluster/resizing-a-cluster#microsoft-azure) in the Red Hat documentation.\n\n### Inventory all secrets\n\nBefore the advent of \"configuration as a service\" technologies such as Azure Key Vault, there wasn't a well-defined concept of \"secrets\". Instead, you had a disparate set of configuration settings that effectively functioned as what we now call \"secrets\". With app servers such as JBoss EAP, these secrets are in many different config files and configuration stores. Check all properties and configuration files on the production server(s) for any secrets and passwords. Be sure to check configuration files like **custom-config.xml** or **jboss-web.xml** in your applications. Configuration files containing passwords or credentials may also be found inside your application. For more information, see [Azure Key Vault basic concepts](/azure/key-vault/basic-concepts).\n\nOnce you have a solid inventory of secrets, consult the EAP Operator documentation regarding secrets. For more information, see [Creating a Secret](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/getting_started_with_jboss_eap_for_openshift_online/eap-operator-for-automating-application-deployment-on-openshift_default#creating-a-secret_default) in the Red Hat documentation.\n\n[!INCLUDE [inventory-all-certificates](includes/inventory-all-certificates.md)]\n\nOnce you have a solid inventory of certificates, you can configure them in Azure Red Hat OpenShift. For more information, see [TLS configuration in OpenShift Container Platform(replace)](https://access.redhat.com/articles/5348961) in the Red Hat documentation.\n\n### Validate that the supported Java version works correctly\n\nAll of the migration paths for JBoss EAP to Azure Red Hat OpenShift require a specific Java version, which varies for each path. You need to validate that your application is able to run correctly using that supported version.\n\n[!INCLUDE [note-obtain-your-current-java-version](includes/note-obtain-your-current-java-version.md)]\n\n### Inventory JNDI resources\n\nInventory all JNDI resources. For example, datasources such as databases may have an associated JNDI name that allows JPA to correctly bind instances of `EntityManager` to a particular database. For more information on JNDI resources and databases, see [Datasource Management](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/configuration_guide/datasource_management#doc-wrapper) in the Red Hat documentation. Other JNDI-related resources, such as ActiveMQ Artemis message brokers, may require migration or reconfiguration. For more information on ActiveMQ Artemis configuration, see [Configuring Messaging](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/configuring_messaging/index) in the Red Hat documentation.\n\n### Determine whether session replication is used\n\nIf your application relies on session replication, with or without [Infinispan](https://infinispan.org/), you have three options:\n\n- Infinispan works well in Azure virtual machines, but if you're using a profile that provides high availability capabilities, be aware of the `JGroups` configuration. Determine whether your system is operating as a managed domain or standalone server.\n  - If in a managed domain, the `ha` or `full-ha` profiles deal with JGroups.\n  - If in a standalone server, the **standalone-ha.xml** or **standalone-full-ha.xml** configuration files deal with JGroups.\n  - Microsoft Azure doesn't support JGroups discovery protocols that are based on UDP multicast. For more information, see [Using JBoss EAP High Availability in Microsoft Azure](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.0/html/using_jboss_eap_in_microsoft_azure/using_jboss_eap_high_availability_in_microsoft_azure#doc-wrapper) in the Red Hat documentation.\n- Refactor your application to use a database for session management.\n- Refactor your application to externalize the session to Azure Redis Service. For more information, see [Azure Cache for Redis](/azure/azure-cache-for-redis/cache-overview).\n\nFor all of these options, it's a good idea to master how JBoss EAP does HTTP Session State Replication. For more information, see [About HTTP Session Replication](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/development_guide/clustering_in_web_applications#about_http_session_replication) in the Red Hat documentation.\n\n### Document datasources\n\nIf your application uses any databases, you need to capture the following information:\n\n- What is the datasource name?\n- What is the connection pool configuration?\n- Where can I find the JDBC driver JAR file?\n\nFor more information on JDBC drivers in JBoss EAP, see [Datasource Management](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/configuration_guide/datasource_management) in the Red Hat documentation.\n\n### Determine whether JBoss EAP has been customized\n\nDetermine which of the following customizations have been made, and capture what's been done.\n\n- Have the startup scripts been changed? Such scripts include **host**, **eap_env**, **standalone**, and **domain**.\n- Are there any specific parameters passed to the JVM?\n- Are there JARs added to the server classpath?\n\nThese customizations need to be captured in the container image running on Azure Red Hat OpenShift. For more information, see [Configuring the JBoss EAP for OpenShift Image for Your Java Application](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/getting_started_with_jboss_eap_for_openshift_container_platform/configuring_eap_openshift_image) in the Red Hat documentation.\n\n[!INCLUDE [determine-whether-a-connection-to-on-premises-is-needed](includes/determine-whether-a-connection-to-on-premises-is-needed.md)]\n\n### Determine whether Java Message Service (JMS) Queues or Topics are in use\n\nIf your application is using JMS Queues or Topics, you may want to migrate them to an externally hosted JMS server. Azure Service Bus and the Advanced Message Queuing Protocol can be a great migration strategy for those using JMS. For more information, see [Use Java Message Service 1.1 with Azure Service Bus standard and AMQP 1.0](/azure/service-bus-messaging/service-bus-java-how-to-use-jms-api-amqp).\n\nIf JMS persistent stores have been configured, you must capture their configuration and apply it after the migration.\n\nFor more information, see [Configuring Messaging](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html-single/configuring_messaging/index) in the Red Hat documentation.\n\n[!INCLUDE [determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries](includes/determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries.md)]\n\nYou can handle these libraries using the same techniques as described in the [Determine whether JBoss EAP has been customized](#determine-whether-jboss-eap-has-been-customized) section.\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code.md)]\n\nAzure Red Hat OpenShift runs on OpenShift 4 using Red Hat Enterprise Linux CoreOS (RHCOS) as the operating system for all control plane and worker nodes. Any OS-specific code must be compatible with RHCOS.\n\n[!INCLUDE [determine-whether-your-application-is-composed-of-multiple-wars](includes/determine-whether-your-application-is-composed-of-multiple-wars.md)]\n\n### Determine whether your application is packaged as an EAR\n\nIf your application is packaged as an EAR file, be sure to capture their configurations.\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n### Account for load-balancing requirements\n\nThe best way to account for load balancing is to use the App Gateway integration. For more information, see [What is Azure Application Gateway?](/azure/application-gateway/overview)\n\n## Migration\n\nThe steps in this section assume that your analysis has lead you to decide to use the prebuilt Azure Marketplace offer.\n\n### Provision the offer\n\nTo open the offer in the Azure portal, see [JBoss EAP on Azure Red Hat OpenShift](https://aka.ms/eap-aro-portal). Select **Create**, and then follow the instructions in the offer.\n\n### Migrating your applications\n\nThe offer supports the Source-to-Image (S2I) process to build and run a Java application on the JBoss EAP for OpenShift image. Red Hat has a sample that shows how to do it manually if you'd like to deploy later by yourself. For more information, see [Chapter 2. Build and Run a Java Application on the JBoss EAP for OpenShift Image](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/getting_started_with_jboss_eap_for_openshift_container_platform/build_run_java_app_s2i) in the Red Hat documentation.\n\n## Post-migration\n\nAfter you've reached the migration goals you defined in the [pre-migration](#pre-migration) step, perform some end-to-end acceptance testing to verify that everything works as expected. For information about some potential post-migration enhancements, see the following articles:\n\n- Implement scaling. Dynamic scaling is a key value proposition to justify the complexity of using Azure Red Hat OpenShift. For information about achieving your scaling solution, see [Applying autoscaling to an OpenShift Container Platform cluster](https://docs.openshift.com/container-platform/4.12/machine_management/applying-autoscaling.html) in the OpenShift documentation.\n\n- You may want to do more configuration on the Application Gateway. For more information, see [Application Gateway configuration overview](/azure/application-gateway/configuration-overview).\n\n- Enhance your network topology with advanced load balancing services. For more information, see [Using load-balancing services in Azure](/azure/traffic-manager/traffic-manager-load-balancing-azure).\n\n- Get Java-optimized application performance monitoring with Azure Monitor and Application Insights. For more information, see [Zero instrumentation application monitoring for Kubernetes - Azure Monitor Application Insights](/azure/azure-monitor/app/kubernetes-codeless).\n\n- Deploy your applications to your migrated Azure Red Hat OpenShift cluster with Azure DevOps. For more information, see [Get started with Azure DevOps documentation](/azure/devops/get-started).\n\n- Use Azure Managed Identities to manage  secrets and assign role-based access to Azure resources. For more information, see [What are managed identities for Azure resources?](/azure/active-directory/managed-identities-azure-resources/overview)\n\n- Integrate Java EE authentication and authorization with Microsoft Entra ID. For more information, see [Integrating Microsoft Entra ID with applications getting started guide](/azure/active-directory/manage-apps/plan-an-application-integration).\n"
  },
  {
    "path": "articles/java/migration/migrate-jboss-eap-to-azure-vm-manually.md",
    "content": "---\ntitle: \"Tutorial: Install JBoss EAP on Azure Virtual Machines (VMs) manually\"\ndescription: Provides step-by-step guidance to install Red Hat JBoss EAP on Azure VMs and set up a cluster, expose it with Azure Application Gateway, and connect with Azure Database for PostgreSQL Flexible Server.\nauthor: KarlErickson\nms.author: karler\nms.topic: how-to\nms.date: 01/13/2026\nms.custom: devx-track-java, devx-track-extended-java, devx-track-javaee, devx-track-javaee-jbosseap, devx-track-javaee-jbosseap-vm, migration-java, devx-track-azurecli, linux-related-content\n---\n\n# Tutorial: Install JBoss EAP on Azure Virtual Machines (VMs) manually\n\nThis tutorial shows the steps to install Red Hat JBoss Enterprise Application Platform (EAP) and configure a cluster in domain mode on Azure Virtual Machines (VMs), on Red Hat Enterprise Linux (RHEL).\n\nIn this tutorial, you learn how to do the following tasks:\n\n> [!div class=\"checklist\"]\n>\n> - Create a custom virtual network and create the VMs within the network.\n> - Install the desired JDK and Red Hat JBoss EAP on the VMs by using the command line manually.\n> - Configure a Red Hat JBoss EAP cluster in domain mode using the command-line interface (CLI).\n> - Configure a PostgreSQL datasource connection in the cluster.\n> - Deploy and run a sample Java EE application in the cluster.\n> - Expose the application to the public internet via Azure Application Gateway.\n> - Validate the successful configuration.\n\nIf you prefer a fully automated solution that does all of these steps on your behalf on GNU/Linux VMs, directly from the Azure portal, see [Quickstart: Deploy a JBoss EAP cluster on Azure Virtual Machines (VMs)](/azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm).\n\nIf you're interested in providing feedback or working closely on your migration scenarios with the engineering team developing JBoss EAP on Azure solutions, fill out this short [survey on JBoss EAP migration](https://aka.ms/jboss-on-azure-survey) and include your contact information. The team of program managers, architects, and engineers will promptly get in touch with you to initiate close collaboration.\n\n> [!NOTE]\n> This article contains references to the term *slave*, a term that Microsoft no longer uses. When the term is removed from the software, we'll remove it from this article.\n\n## Prerequisites\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n- [Install Azure CLI version 2.51.0 or higher](/cli/azure/install-azure-cli) to run Azure CLI commands.\n  - When you're prompted, install Azure CLI extensions on first use. For more information about extensions, see [Use extensions with Azure CLI](/cli/azure/azure-cli-extensions-overview).\n  - Run [az version](/cli/azure/reference-index?#az-version) to find the version and dependent libraries that are installed. To upgrade to the latest version, run [az upgrade](/cli/azure/reference-index?#az-upgrade).\n- Ensure you have the necessary Red Hat licenses. You need to have a Red Hat Account with Red Hat Subscription Management (RHSM) entitlement for Red Hat JBoss EAP. This entitlement lets the fully automated solution (in [Quickstart: Deploy a JBoss EAP cluster on Azure Virtual Machines (VMs)](/azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)) install the Red Hat tested and certified JBoss EAP version.\n  > [!NOTE]\n  > If you don't have an EAP entitlement, you can sign up for a free developer subscription through the [Red Hat Developer Subscription for Individuals](https://developers.redhat.com/register). Save aside the account details, which is used as the **RHSM username** and **RHSM password** in the next section.\n- If you're already registered, or after you complete registration, you can locate the necessary credentials (*Pool IDs*) by using the following steps. These Pool IDs are also used as the **RHSM Pool ID with EAP entitlement** value in subsequent steps.\n  1. Sign in to your [Red Hat account](https://sso.redhat.com).\n  1. The first time you sign in, you're prompted to complete your profile. Depending on your usage, select either **Personal** or **Corporate** for **Account Type**, as shown in the following screenshot:\n\n     :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vm-manually/update-account-type-as-personal.png\" alt-text=\"Screenshot of the Red Hat account window that shows the Account Type options with Personal selected.\" lightbox=\"media/migrate-jboss-eap-to-vm-manually/update-account-type-as-personal.png\":::\n\n  1. Open [Red Hat Developer Subscription for Individuals](https://aka.ms/red-hat-individual-dev-sub). This link takes you to all of the subscriptions in your account for the appropriate SKU.\n  1. In the row of controls under **All purchased Subscriptions** table, select **Active**.\n  1. Select the sortable column header for **End Date** until the value furthest in the future is shown as the first row.\n  1. Select the first row. Then, copy and save aside the value following **Master Pools** from **Pool IDs**.\n\n- A Java Development Kit (JDK), version 11. In this guide, we recommend [Red Hat Build of OpenJDK](https://developers.redhat.com/products/openjdk/download). Ensure that your `JAVA_HOME` environment variable is set correctly in the shells in which you run the commands.\n- [Git](https://git-scm.com/downloads); use `git --version` to test whether `git` works. This tutorial was tested with version 2.25.1.\n- [Maven](https://maven.apache.org/download.cgi); use `mvn -version` to test whether `mvn` works. This tutorial was tested with version 3.6.3.\n\n## Prepare the environment\n\nIn this section, you set up the infrastructure within which you install the JDK, Red Hat JBoss EAP, and the PostgreSQL Java Database Connectivity (JDBC) driver.\n\n### Assumptions\n\nThis tutorial configures a Red Hat JBoss EAP cluster in domain mode with an administration server and two managed servers on a total of three VMs. To configure the cluster, you need to create the following three Azure VMs:\n\n- An admin VM (VM name `adminVM`) runs as the domain controller.\n- Two managed VMs (VM names `mspVM1` and `mspVM2`) run as host controller.\n\n### Sign in to Azure\n\nIf you haven't already, sign in to your Azure subscription by using the [az login](/cli/azure/reference-index) command and following the on-screen directions.\n\n```azurecli\naz login\n```\n\n> [!NOTE]\n> If you have multiple Azure tenants associated with your Azure credentials, you must specify which tenant you want to sign in to. You can do this with the `--tenant` option. For example, `az login --tenant contoso.onmicrosoft.com`.\n\n### Create a resource group\n\nCreate a resource group with [az group create](/cli/azure/group#az-group-create). Resource group names must be globally unique within a subscription. For this reason, consider prepending some unique identifier to any names you create that must be unique. A useful technique is to use your initials followed by today's date in `mmdd` format. This example creates a resource group named `$RESOURCE_GROUP_NAME` in the `westus` location:\n\n```azurecli\nexport SUBSCRIPTION=$(az account show --query id --output tsv)\nexport SUFFIX=$(date +%s)\nexport RESOURCE_GROUP_NAME=rg-$SUFFIX\necho \"Resource group name: $RESOURCE_GROUP_NAME\"\naz group create \\\n    --name $RESOURCE_GROUP_NAME \\\n    --location westus\n```\n\n### Create a virtual network\n\nThe resources comprising your Red Hat JBoss EAP cluster must communicate with each other, and the public internet, using a virtual network. For a complete guide to planning your virtual network, see the Cloud Adoption Framework for Azure guide [Plan virtual networks](/azure/virtual-network/virtual-network-vnet-plan-design-arm). For more information, see [Azure Virtual Network frequently asked questions](/azure/virtual-network/virtual-networks-faq).\n\nThe example in this section creates a virtual network with address space `192.168.0.0/16` and creates a subnet used for VMs.\n\nFirst, create a virtual network by using [az network vnet create](/cli/azure/network/vnet#az-network-vnet-create). The following example creates a network named `myVNet`:\n\n```azurecli\naz network vnet create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name myVNet \\\n    --address-prefixes 192.168.0.0/24\n```\n\nCreate a subnet for the Red Hat JBoss EAP cluster by using [az network vnet subnet create](/cli/azure/network/vnet/subnet#az-network-vnet-subnet-create). The following example creates a subnet named `mySubnet`:\n\n```azurecli\naz network vnet subnet create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name mySubnet \\\n    --vnet-name myVNet \\\n    --address-prefixes 192.168.0.0/25\n```\n\nCreate a subnet for Application Gateway by using [az network vnet subnet create](/cli/azure/network/vnet/subnet#az-network-vnet-subnet-create). The following example creates a subnet named `jbossVMGatewaySubnet`:\n\n```azurecli\naz network vnet subnet create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name jbossVMGatewaySubnet \\\n    --vnet-name myVNet \\\n    --address-prefixes 192.168.0.128/25\n```\n\n### Create a network security group and assign subnets to it\n\nBefore you create VMs with public IPs, create a network security group (NSG) to secure the virtual network and subnets created previously.\n\nCreate a network security group by using [az network nsg create](/cli/azure/network/nsg#az-network-nsg-create). The following example creates a network security group named `mynsg`:\n\n```azurecli\naz network nsg create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name mynsg\n```\n\nCreate network security group rules by using [az network nsg rule create](/cli/azure/network/nsg/rule#az-network-nsg-rule-create). The following example creates network security group rules named `ALLOW_APPGW` and `ALLOW_HTTP_ACCESS`. These rules allow App Gateway to accept inbound traffic on the HTTP ports used by Red Hat JBoss EAP:\n\n```azurecli\naz network nsg rule create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --nsg-name mynsg \\\n    --name ALLOW_APPGW \\\n    --protocol Tcp \\\n    --destination-port-ranges 65200-65535 \\\n    --source-address-prefix GatewayManager \\\n    --destination-address-prefix '*' \\\n    --access Allow \\\n    --priority 500 \\\n    --direction Inbound\n\naz network nsg rule create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --nsg-name mynsg \\\n    --name ALLOW_HTTP_ACCESS \\\n    --protocol Tcp \\\n    --destination-port-ranges 22 80 443 9990 8080 \\\n    --source-address-prefix Internet \\\n    --destination-address-prefix '*' \\\n    --access Allow \\\n    --priority 510 \\\n    --direction Inbound\n```\n\nAssociate the subnets created previously to this network security group by using [az network vnet subnet update](/cli/azure/network/vnet/subnet#az-network-vnet-subnet-update), as shown in the following example:\n\n```azurecli\naz network vnet subnet update \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --vnet-name myVNet \\\n    --name mySubnet \\\n    --network-security-group mynsg\n\naz network vnet subnet update \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --vnet-name myVNet \\\n    --name jbossVMGatewaySubnet \\\n    --network-security-group mynsg\n```\n\n### Create a Red Hat Enterprise Linux machine for admin\n\n### Generate SSH keys \n\nUse the following command to generate SSH keys for `adminVM`:\n\n```bash\nssh-keygen -t rsa -b 4096 -f ~/.ssh/jbosseapvm\nssh-add ~/.ssh/jbosseapvm\n```\n\n#### Create the admin VM\n\nThe Marketplace image that you use to create the VMs is `RedHat:rhel-raw:86-gen2:latest`. For other images, see [Red Hat Enterprise Linux (RHEL) images available in Azure](/azure/virtual-machines/workloads/redhat/redhat-imagelist).\n\n> [!NOTE]\n> You can query all the available Red Hat Enterprise Linux images provided by Red Hat with the [az vm image list](/cli/azure/vm/image#az-vm-image-list) command - for example: `az vm image list --offer RHEL --publisher RedHat --output table --all`. For more information, see [Overview of Red Hat Enterprise Linux images](/azure/virtual-machines/workloads/redhat/redhat-images).\n>\n> If you use a different image, you may need to install extra libraries to enable the infrastructure used in this guide.\n\nCreate a basic VM, install all required tools on it, take a snapshot of it, and then create replicas based on the snapshot.\n\nCreate a VM using [az vm create](/cli/azure/vm). You run the Administration Server on this VM.\n\nThe following example creates an Azure Managed Identity and a Red Hat Enterprise Linux VM using use TLS/SSL authentication.\n\n### [JBOSS EAP 7.4](#tab/jboss-eap-74)\n\n```azurecli\naz identity create \\\n    --name \"passwordless-managed-identity\" \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --location westus\n\naz vm create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name adminVM \\\n    --image RedHat:rhel-raw:86-gen2:latest \\\n    --assign-identity \"/subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/passwordless-managed-identity\" \\\n    --size Standard_DS1_v2  \\\n    --admin-username azureuser \\\n    --ssh-key-values ~/.ssh/jbosseapvm.pub \\\n    --public-ip-sku Standard \\\n    --nsg mynsg \\\n    --vnet-name myVnet \\\n    --subnet mySubnet\n```\n### [JBOSS EAP 8](#tab/jboss-eap-8)\n\n```azurecli\naz identity create \\\n    --name \"passwordless-managed-identity\" \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --location westus\n\naz vm create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name adminVM \\\n    --image RedHat:rhel-raw:94_gen2:latest \\\n    --assign-identity \"/subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/passwordless-managed-identity\" \\\n    --size Standard_DS1_v2  \\\n    --admin-username azureuser \\\n    --ssh-key-values ~/.ssh/jbosseapvm.pub \\\n    --public-ip-sku Standard \\\n    --nsg mynsg \\\n    --vnet-name myVnet \\\n    --subnet mySubnet\n```\n\n---\n\n#### Install Red Hat JBoss EAP\n\nUse the following steps to install:\n\n1. Use the following command to get the public IP of `adminVM`:\n\n   ```azurecli\n   export ADMIN_VM_PUBLIC_IP=$(az vm show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name adminVM \\\n       --show-details \\\n       --query publicIps | tr -d '\"')\n   ```\n\n1. Open a terminal and SSH to the `adminVM` by using the following command:\n\n   ```bash\n   ssh -i ~/.ssh/jbosseapvm azureuser@$ADMIN_VM_PUBLIC_IP\n   ```\n\n1. Configure firewall for ports by using the following command:\n\n   ```bash\n   sudo firewall-cmd --zone=public --add-port={9999/tcp,8443/tcp,8009/tcp,8080/tcp,9990/tcp,9993/tcp,45700/tcp,7600/tcp} --permanent\n   sudo firewall-cmd --reload\n   sudo iptables-save\n   ```\n\n   You should see the word `success` after the first two commands. You should see output similar to the following example after the third command:\n\n   ```output\n   # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023\n   *filter\n   :INPUT ACCEPT [20:3546]\n   :FORWARD ACCEPT [0:0]\n   :OUTPUT ACCEPT [24:5446]\n   COMMIT\n   # Completed on Wed Mar 29 22:39:23 2023\n   # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023\n   *security\n   :INPUT ACCEPT [19:3506]\n   :FORWARD ACCEPT [0:0]\n   :OUTPUT ACCEPT [5:492]\n   -A OUTPUT -d 168.63.129.16/32 -p tcp -m tcp --dport 53 -j ACCEPT\n   -A OUTPUT -d 168.63.129.16/32 -p tcp -m tcp --dport 53 -j ACCEPT\n   -A OUTPUT -d 168.63.129.16/32 -p tcp -m owner --uid-owner 0 -j ACCEPT\n   -A OUTPUT -d 168.63.129.16/32 -p tcp -m conntrack --ctstate INVALID,NEW -j DROP\n   COMMIT\n   # Completed on Wed Mar 29 22:39:23 2023\n   # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023\n   *raw\n   :PREROUTING ACCEPT [20:3546]\n   :OUTPUT ACCEPT [24:5446]\n   COMMIT\n   # Completed on Wed Mar 29 22:39:23 2023\n   # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023\n   *mangle\n   :PREROUTING ACCEPT [20:3546]\n   :INPUT ACCEPT [20:3546]\n   :FORWARD ACCEPT [0:0]\n   :OUTPUT ACCEPT [24:5446]\n   :POSTROUTING ACCEPT [24:5446]\n   COMMIT\n   # Completed on Wed Mar 29 22:39:23 2023\n   # Generated by iptables-save v1.8.4 on Wed Mar 29 22:39:23 2023\n   *nat\n   :PREROUTING ACCEPT [1:40]\n   :INPUT ACCEPT [0:0]\n   :POSTROUTING ACCEPT [4:240]\n   :OUTPUT ACCEPT [4:240]\n   COMMIT\n   # Completed on Wed Mar 29 22:39:23 2023\n   ```\n> [!NOTE]\n> The `RHSM_USER` and `RHSM_PASSWORD` values are required to install Red Hat JBoss EAP. We recommend that you use a service account with limited permissions to access the Red Hat Customer Portal. \n\n2. Use the following commands to register the admin host to your Red Hat Subscription Management (RHSM) account:\n\n   ```bash\n   export RHSM_USER=<your-rhsm-username>\n   export RHSM_PASSWORD='<your-rhsm-password>'\n   export EAP_POOL=<your-rhsm-pool-ID>\n \n   sudo subscription-manager register --username ${RHSM_USER} --password ${RHSM_PASSWORD} --force\n   ```\n\n   [!INCLUDE [security-note](../includes/security-note.md)]\n\n   You should see output similar to the following example:\n\n   ```output\n   Registering to: subscription.rhsm.redhat.com:443/subscription\n   The system has been registered with ID: redacted\n   The registered system name is: adminVM\n   ```\n\n1. Use the following command to attach the admin host to Red Hat JBoss EAP pool:\n\n   ```bash\n   sudo subscription-manager attach --pool=${EAP_POOL}\n   ```\n\n   > [!NOTE]\n   > This command is ignored if you're using [Simple Content Access](https://access.redhat.com/articles/4903191) mode.\n\n1. Use the following commands to install Red Hat JBoss EAP :\n\n   ### [JBOSS EAP 7.4](#tab/jboss-eap-74)\n\n   ```bash\n   sudo subscription-manager repos --enable=jb-eap-7.4-for-rhel-8-x86_64-rpms\n   sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'\n   sudo yum groupinstall -y jboss-eap7\n   ```\n   ### [JBOSS EAP 8](#tab/jboss-eap-8)\n\n   ```bash\n   sudo subscription-manager repos --enable=jb-eap-8.0-for-rhel-9-x86_64-rpms\n   sudo yum update -y --disablerepo='*' --enablerepo='*microsoft*'\n   sudo yum groupinstall -y jboss-eap8\n   ```\n\n   ---\n\n   For the second and third commands, you should see many lines of output, ending with `Complete!`\n\n1. Use the following commands set permission and network configurations:\n\n   ```bash\n   sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config\n   echo 'AllowTcpForwarding no' | sudo tee -a /etc/ssh/sshd_config\n   sudo systemctl restart sshd\n   ```\n\n1. Use the following commands to configure the environment variables:\n\n   ### [JBOSS EAP 7.4](#tab/jboss-eap-74)\n\n   ```bash\n   echo 'export EAP_RPM_CONF_DOMAIN=\"/etc/opt/rh/eap7/wildfly/eap7-domain.conf\"' >> ~/.bash_profile\n   echo 'export EAP_HOME=\"/opt/rh/eap7/root/usr/share/wildfly\"' >> ~/.bash_profile\n   source ~/.bash_profile\n   sudo touch /etc/profile.d/eap_env.sh\n   echo 'export EAP_HOME=\"/opt/rh/eap7/root/usr/share/wildfly\"' | sudo tee -a /etc/profile.d/eap_env.sh\n   ```\n\n    ### [JBOSS EAP 8](#tab/jboss-eap-8)\n    \n    ```bash\n    echo 'export EAP_RPM_CONF_DOMAIN=\"/etc/opt/rh/eap8/wildfly/eap8-domain.conf\"' >> ~/.bash_profile\n    echo 'export EAP_HOME=\"/opt/rh/eap8/root/usr/share/wildfly\"' >> ~/.bash_profile\n    source ~/.bash_profile\n    sudo touch /etc/profile.d/eap_env.sh\n    echo 'export EAP_HOME=\"/opt/rh/eap8/root/usr/share/wildfly\"' | sudo tee -a /etc/profile.d/eap_env.sh\n    ```\n\n    ---\n\n1. Exit from the SSH connection by typing **exit**.\n\n### Create machines for managed servers\n\nYou installed Red Hat JBoss EAP on `adminVM`, which runs as the domain controller server. You still need to prepare machines to run the two host controller servers. Next, you create a snapshot of `adminVM` and prepare machines for two managed severs, `mspVM1` and `mspVM2`.\n\nThis section introduces an approach to prepare machines with the snapshot of `adminVM`. Return to your terminal that has Azure CLI signed in, then use the following steps:\n\n1. Use the following command to stop `adminVM`:\n\n   ```azurecli\n   az vm stop --resource-group $RESOURCE_GROUP_NAME --name adminVM\n   ```\n\n1. Use [az snapshot create](/cli/azure/snapshot#az-snapshot-create) to take a snapshot of the `adminVM` OS disk, as shown in the following example:\n\n   ```azurecli\n   export ADMIN_OS_DISK_ID=$(az vm show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name adminVM \\\n       --query storageProfile.osDisk.managedDisk.id \\\n       --output tsv)\n   az snapshot create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name myAdminOSDiskSnapshot \\\n       --source ${ADMIN_OS_DISK_ID}\n   ```\n\n1. Use the following command to start `adminVM`:\n\n   ```azurecli\n   az vm start --resource-group $RESOURCE_GROUP_NAME --name adminVM\n   ```\n\n1. Use the following steps to create `mspVM1`:\n\n   1. First, create a managed disk for `mspVM1` with [az disk create](/cli/azure/disk#az-disk-create):\n\n      ```azurecli\n      #Get the snapshot ID\n      export SNAPSHOT_ID=$(az snapshot show \\\n          --name myAdminOSDiskSnapshot \\\n          --resource-group $RESOURCE_GROUP_NAME \\\n          --query '[id]' \\\n          --output tsv)\n\n      #Create a new Managed Disks using the snapshot Id\n      #Note that managed disk is created in the same location as the snapshot\n      az disk create \\\n          --resource-group $RESOURCE_GROUP_NAME \\\n          --name mspVM1_OsDisk_1 \\\n          --source ${SNAPSHOT_ID}\n      ```\n\n   1. Next, use the following commands to create VM `mspVM1`, attaching OS disk `mspVM1_OsDisk_1`:\n\n      ```azurecli\n      #Get the resource Id of the managed disk\n      export MSPVM1_DISK_ID=$(az disk show \\\n          --name mspVM1_OsDisk_1 \\\n          --resource-group $RESOURCE_GROUP_NAME \\\n          --query '[id]' \\\n          --output tsv)\n\n      #Create VM by attaching existing managed disks as OS\n      az vm create \\\n          --resource-group $RESOURCE_GROUP_NAME \\\n          --name mspVM1 \\\n          --assign-identity \"/subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/passwordless-managed-identity\" \\\n          --attach-os-disk ${MSPVM1_DISK_ID} \\\n          --os-type linux \\\n          --public-ip-sku Standard \\\n          --nsg mynsg \\\n          --vnet-name myVnet \\\n          --subnet mySubnet\n      ```\n\n   1. You created `mspVM1` with Red Hat JBoss EAP installed. Because the VM was created from a snapshot of the `adminVM` OS disk, the two VMs have the same hostname. Use [az vm run-command invoke](/cli/azure/vm/run-command#az-vm-run-command-invoke) to change the hostname to the value `mspVM1`:\n\n      ```azurecli\n      az vm run-command invoke \\\n          --resource-group $RESOURCE_GROUP_NAME \\\n          --name mspVM1 \\\n          --command-id RunShellScript \\\n          --scripts \"sudo hostnamectl set-hostname mspVM1\"\n      ```\n\n      When the command completes successfully, you see output similar to the following example:\n\n      ```json\n      {\n          \"value\": [\n              {\n              \"code\": \"ProvisioningState/succeeded\",\n              \"displayStatus\": \"Provisioning succeeded\",\n              \"level\": \"Info\",\n              \"message\": \"Enable succeeded: \\n[stdout]\\n\\n[stderr]\\n\",\n              \"time\": null\n              }\n          ]\n      }\n      ```\n\n1. Use the same commands to create `mspVM2`:\n\n   ```azurecli\n   #Create a new Managed Disks for mspVM2\n   az disk create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2_OsDisk_1 \\\n       --source ${SNAPSHOT_ID}\n\n   #Get the resource Id of the managed disk\n   export MSPVM2_DISK_ID=$(az disk show \\\n       --name mspVM2_OsDisk_1 \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --query '[id]' \\\n       --output tsv)\n\n   #Create VM by attaching existing managed disks as OS\n   az vm create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2 \\\n       --assign-identity \"/subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/passwordless-managed-identity\" \\\n       --attach-os-disk ${MSPVM2_DISK_ID} \\\n       --os-type linux \\\n       --public-ip-sku Standard \\\n       --nsg mynsg \\\n       --vnet-name myVnet \\\n       --subnet mySubnet\n\n   #Set hostname\n   az vm run-command invoke \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2 \\\n       --command-id RunShellScript \\\n       --scripts \"sudo hostnamectl set-hostname mspVM2\"\n   ```\n\n[!INCLUDE [start-admin-get-ips](includes/wls-manual-guidance-start-admin-and-get-ip.md)]\n\nNow, all three machines are ready. Next, you configure a Red Hat JBoss EAP cluster in managed domain mode.\n\n### Configure managed domain and cluster\n\nConfigure the cluster with session replication enabled. For more information, see [Session Replication](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/development_guide/clustering_in_web_applications#session_replication).\n\nTo enable session replication, use Red Hat JBoss EAP High Availability for the cluster. Microsoft Azure doesn't support JGroups discovery protocols that are based on multicast. Although you may use other JGroups discovery protocols (such as a static configuration (`TCPPING`), a shared database (`JDBC_PING`), shared file system-based ping (`FILE_PING`), or `TCPGOSSIP`), we strongly recommend that you use the shared file discovery protocol developed for Azure: `AZURE_PING`. For more information, see [Using JBoss EAP High Availability in Microsoft Azure](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html/using_jboss_eap_in_microsoft_azure/using_jboss_eap_high_availability_in_microsoft_azure#doc-wrapper).\n\n#### Create Azure storage account and Blob container for AZURE_PING\n\nUse the following commands to create a storage account and Blob container:\n\n```azurecli\n# Define your storage account name\nexport STORAGE_ACCOUNT_NAME=azurepingstgabc1111rg\n# Define your Blob container name\nexport CONTAINER_NAME=azurepingcontainerabc1111rg\n\n# Create storage account\naz storage account create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name ${STORAGE_ACCOUNT_NAME} \\\n    --location westus \\\n    --sku Standard_LRS \\\n    --kind StorageV2 \\\n    --access-tier Hot\n```\n\nThen, retrieve the storage account key for later use by using the following command. If you see an error, wait a few minutes and try again. The previous command to create the storage account might not be done yet.\n\n```azurecli\nexport STORAGE_ACCESS_KEY=$(az storage account keys list \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --account-name ${STORAGE_ACCOUNT_NAME} \\\n    --query \"[0].value\" \\\n    --output tsv)\n\n# Create blob container\naz storage container create \\\n    --name ${CONTAINER_NAME} \\\n    --account-name ${STORAGE_ACCOUNT_NAME} \\\n    --account-key ${STORAGE_ACCESS_KEY}\n```\n\nYou should see the following output:\n\n```output\n{\n  \"created\": true\n}\n```\n\n#### Configure domain controller (admin node)\n\nThis tutorial uses the Red Hat JBoss EAP management CLI commands to configure the domain controller. For more information, see [Management CLI Guide](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.4/html-single/management_cli_guide/index).\n\nThe following steps set up the domain controller configuration on `adminVM`. Use SSH to connect to the `adminVM` as the `azureuser` user. Recall that the public IP address of `adminVM` was captured previously into the `ADMIN_VM_PUBLIC_IP` environment variable.\n\n```bash\nssh -i ~/.ssh/jbosseapvm azureuser@$ADMIN_VM_PUBLIC_IP\n```\n\nFirst, use the following commands to configure the HA profile and JGroups using the `AZURE_PING` protocol:\n\n\n### [JBOSS EAP 7.4](#tab/jboss-eap-74)\n\n```bash\nexport HOST_VM_IP=$(hostname -I)\nexport STORAGE_ACCOUNT_NAME=azurepingstgabc1111rg\nexport CONTAINER_NAME=azurepingcontainerabc1111rg\nexport STORAGE_ACCESS_KEY=<the-value-from-before-you-connected-with-SSH>\n\n\n#-Configure the HA profile and JGroups using AZURE_PING protocol\nsudo -u jboss $EAP_HOME/bin/jboss-cli.sh --echo-command \\\n'embed-host-controller --std-out=echo --domain-config=domain.xml --host-config=host-master.xml',\\\n':write-attribute(name=name,value=domain1)',\\\n'/profile=ha/subsystem=jgroups/stack=tcp:remove',\\\n'/profile=ha/subsystem=jgroups/stack=tcp:add()',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/transport=TCP:add(socket-binding=jgroups-tcp,properties={ip_mcast=false})',\\\n\"/profile=ha/subsystem=jgroups/stack=tcp/protocol=azure.AZURE_PING:add(properties={storage_account_name=\\\"${STORAGE_ACCOUNT_NAME}\\\", storage_access_key=\\\"${STORAGE_ACCESS_KEY}\\\", container=\\\"${CONTAINER_NAME}\\\"})\",\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=MERGE3:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FD_SOCK:add(socket-binding=jgroups-tcp-fd)',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FD_ALL:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=VERIFY_SUSPECT:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.NAKACK2:add(properties={use_mcast_xmit=false,use_mcast_xmit_req=false})',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=UNICAST3:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.STABLE:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.GMS:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=MFC:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FRAG3:add',\\\n'/profile=ha/subsystem=jgroups/channel=ee:write-attribute(name=\"stack\", value=\"tcp\")',\\\n'/server-group=main-server-group:write-attribute(name=\"profile\", value=\"ha\")',\\\n'/server-group=main-server-group:write-attribute(name=\"socket-binding-group\", value=\"ha-sockets\")',\\\n\"/host=master/subsystem=elytron/http-authentication-factory=management-http-authentication:write-attribute(name=mechanism-configurations,value=[{mechanism-name=DIGEST,mechanism-realm-configurations=[{realm-name=ManagementRealm}]}])\",\\\n\"/host=master/interface=unsecure:add(inet-address=${HOST_VM_IP})\",\\\n\"/host=master/interface=management:write-attribute(name=inet-address, value=${HOST_VM_IP})\",\\\n\"/host=master/interface=public:add(inet-address=${HOST_VM_IP})\"\n\n# Save a copy of the domain.xml, later you need to share it with all host controllers\ncp $EAP_HOME/domain/configuration/domain.xml /tmp/domain.xml\n```\n\nThe last stanza of output should look similar to the following example. If it doesn't, troubleshoot and resolve the problem before continuing.\n\n```output\n[domain@embedded /] /host=master/interface=public:add(inet-address=192.168.0.4 )\n{\n    \"outcome\" => \"success\",\n    \"result\" => undefined,\n    \"server-groups\" => undefined,\n    \"response-headers\" => {\"process-state\" => \"reload-required\"}\n}\n02:05:55,019 INFO  [org.jboss.as] (MSC service thread 1-1) WFLYSRV0050: JBoss EAP 7.4.10.GA (WildFly Core 15.0.25.Final-redhat-00001) stopped in 28ms\n```\n\nThen, use the following commands to configure the JBoss server and set up the EAP service:\n\n> [!NOTE]\n> The `JBOSS_EAP_USER` and `JBOSS_EAP_PASSWORD` values are required to configure the JBoss EAP management user. \n\n```bash\n# Configure the JBoss server and setup EAP service\necho 'WILDFLY_HOST_CONFIG=host-master.xml' | sudo tee -a $EAP_RPM_CONF_DOMAIN\n\n# Configure JBoss EAP management user\nexport JBOSS_EAP_USER=jbossadmin\nexport JBOSS_EAP_PASSWORD=Secret123456\nsudo $EAP_HOME/bin/add-user.sh  -u $JBOSS_EAP_USER -p $JBOSS_EAP_PASSWORD -g 'guest,mgmtgroup'\n```\n\n   [!INCLUDE [security-note](../includes/security-note.md)]\n\nThe output should look similar to the following example:\n\n```output\nAdded user 'jbossadmin' to file '/etc/opt/rh/eap7/wildfly/standalone/mgmt-users.properties'\nAdded user 'jbossadmin' to file '/etc/opt/rh/eap7/wildfly/domain/mgmt-users.properties'\nAdded user 'jbossadmin' with groups guest,mgmtgroup to file '/etc/opt/rh/eap7/wildfly/standalone/mgmt-groups.properties'\nAdded user 'jbossadmin' with groups guest,mgmtgroup to file '/etc/opt/rh/eap7/wildfly/domain/mgmt-groups.properties'\n```\n\nFinally, use the following commands to start the EAP service:\n\n```bash\n# Start the JBoss server and setup EAP service\nsudo systemctl enable eap7-domain.service\n\n# Edit eap7-domain.services\nsudo sed -i 's/After=syslog.target network.target/After=syslog.target network.target NetworkManager-wait-online.service/' /usr/lib/systemd/system/eap7-domain.service\nsudo sed -i 's/Before=httpd.service/Wants=NetworkManager-wait-online.service \\nBefore=httpd.service/' /usr/lib/systemd/system/eap7-domain.service\n\n# Reload and restart EAP service\nsudo systemctl daemon-reload\nsudo systemctl restart eap7-domain.service\n\n# Check the status of EAP service\nsystemctl status eap7-domain.service\n```\n\nThe output should look similar to the following example:\n\n```output\n● eap7-domain.service - JBoss EAP (domain mode)\n   Loaded: loaded (/usr/lib/systemd/system/eap7-domain.service; enabled; vendor>\n   Active: active (running) since Thu 2023-03-30 02:11:44 UTC; 5s ago\n Main PID: 3855 (scl)\n    Tasks: 82 (limit: 20612)\n   Memory: 232.4M\n   CGroup: /system.slice/eap7-domain.service\n           ├─3855 /usr/bin/scl enable eap7 -- /opt/rh/eap7/root/usr/share/wildf>\n           ├─3856 /bin/bash /var/tmp/sclfYu7yW\n           ├─3858 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/launch.sh /us>\n           ├─3862 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/domain.sh --h>\n           ├─3955 /usr/lib/jvm/jre/bin/java -D[Process Controller] -server -Xms>\n           └─3967 /usr/lib/jvm/jre/bin/java -D[Host Controller] -Dorg.jboss.boo>\n\nMar 30 02:11:44 adminVM systemd[1]: Started JBoss EAP (domain mode).\n```\n\nType <kbd>q</kbd> to exit the pager. Exit from the SSH connection by typing **exit**.\n\n### [JBOSS EAP 8](#tab/jboss-eap-8)\n\n```bash\nexport HOST_VM_IP=$(hostname -I)\nexport STORAGE_ACCOUNT_NAME=azurepingstgabc1111rg\nexport CONTAINER_NAME=azurepingcontainerabc1111rg\nexport STORAGE_ACCESS_KEY=<the-value-from-before-you-connected-with-SSH>\n\n\n#-Configure the HA profile and JGroups using AZURE_PING protocol\nsudo -u jboss $EAP_HOME/bin/jboss-cli.sh --echo-command \\\n'embed-host-controller --std-out=echo --domain-config=domain.xml --host-config=host-primary.xml',\\\n':write-attribute(name=name,value=domain1)',\\\n'/profile=ha/subsystem=jgroups/stack=tcp:remove',\\\n'/profile=ha/subsystem=jgroups/stack=tcp:add()',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/transport=TCP:add(socket-binding=jgroups-tcp,properties={ip_mcast=false})',\\\n\"/profile=ha/subsystem=jgroups/stack=tcp/protocol=azure.AZURE_PING:add(properties={storage_account_name=\\\"${STORAGE_ACCOUNT_NAME}\\\", storage_access_key=\\\"${STORAGE_ACCESS_KEY}\\\", container=\\\"${CONTAINER_NAME}\\\"})\",\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=MERGE3:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FD_SOCK:add(socket-binding=jgroups-tcp-fd)',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FD_ALL:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=VERIFY_SUSPECT:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.NAKACK2:add(properties={use_mcast_xmit=false,use_mcast_xmit_req=false})',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=UNICAST3:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.STABLE:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=pbcast.GMS:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=MFC:add',\\\n'/profile=ha/subsystem=jgroups/stack=tcp/protocol=FRAG3:add',\\\n'/profile=ha/subsystem=jgroups/channel=ee:write-attribute(name=\"stack\", value=\"tcp\")',\\\n'/server-group=main-server-group:write-attribute(name=\"profile\", value=\"ha\")',\\\n'/server-group=main-server-group:write-attribute(name=\"socket-binding-group\", value=\"ha-sockets\")',\\\n\"/host=primary/subsystem=elytron/http-authentication-factory=management-http-authentication:write-attribute(name=mechanism-configurations,value=[{mechanism-name=DIGEST,mechanism-realm-configurations=[{realm-name=ManagementRealm}]}])\",\\\n\"/host=primary/interface=unsecure:add(inet-address=${HOST_VM_IP})\",\\\n\"/host=primary/interface=management:write-attribute(name=inet-address, value=${HOST_VM_IP})\",\\\n\"/host=primary/interface=public:add(inet-address=${HOST_VM_IP})\"\n\n# Save a copy of the domain.xml, later you need to share it with all host controllers\ncp $EAP_HOME/domain/configuration/domain.xml /tmp/domain.xml\n```\n\nThe last stanza of output should look similar to the following example. If it doesn't, troubleshoot and resolve the problem before continuing.\n\n```output\n[domain@embedded /] /host=primary/interface=public:add(inet-address=192.168.0.4 )\n{\n    \"outcome\" => \"success\",\n    \"result\" => undefined,\n    \"server-groups\" => undefined,\n    \"response-headers\" => {\"process-state\" => \"reload-required\"}\n}\n06:22:54,381 INFO  [org.jboss.as] (MSC service thread 1-2) WFLYSRV0050: JBoss EAP 8.0 Update 3.0 (WildFly Core 21.0.10.Final-redhat-00001) stopped in 24ms\n```\n\nThen, use the following commands to configure the JBoss server and set up the EAP service:\n\n> [!NOTE]\n> The `JBOSS_EAP_USER` and `JBOSS_EAP_PASSWORD` values are required to configure the JBoss EAP management user.\n \n```bash\n# Configure the JBoss server and setup EAP service\necho 'WILDFLY_HOST_CONFIG=host-primary.xml' | sudo tee -a $EAP_RPM_CONF_DOMAIN\n\n# Configure JBoss EAP management user\nexport JBOSS_EAP_USER=jbossadmin\nexport JBOSS_EAP_PASSWORD=Secret123456\nsudo $EAP_HOME/bin/add-user.sh  -u $JBOSS_EAP_USER -p $JBOSS_EAP_PASSWORD -g 'guest,mgmtgroup'\n```\n\n   [!INCLUDE [security-note](../includes/security-note.md)]\n\nThe output should look similar to the following example:\n\n```output\nAdded user 'jbossadmin' to file '/etc/opt/rh/eap8/wildfly/standalone/mgmt-users.properties'\nAdded user 'jbossadmin' to file '/etc/opt/rh/eap8/wildfly/domain/mgmt-users.properties'\nAdded user 'jbossadmin' with groups guest,mgmtgroup to file '/etc/opt/rh/eap8/wildfly/standalone/mgmt-groups.properties'\nAdded user 'jbossadmin' with groups guest,mgmtgroup to file '/etc/opt/rh/eap8/wildfly/domain/mgmt-groups.properties'\n```\n\nFinally, use the following commands to start the EAP service:\n\n```bash\n# Start the JBoss server and setup EAP service\nsudo systemctl enable eap8-domain.service\n\n# Edit eap8-domain.services\nsudo sed -i 's/After=syslog.target network.target/After=syslog.target network.target NetworkManager-wait-online.service/' /usr/lib/systemd/system/eap8-domain.service\nsudo sed -i 's/Before=httpd.service/Wants=NetworkManager-wait-online.service \\nBefore=httpd.service/' /usr/lib/systemd/system/eap8-domain.service\n\n# Reload and restart EAP service\nsudo systemctl daemon-reload\nsudo systemctl restart eap8-domain.service\n\n# Check the status of EAP service\nsystemctl status eap8-domain.service\n```\n\nThe output should look similar to the following example:\n\n```output\n● eap8-domain.service - JBoss EAP (domain mode)\n     Loaded: loaded (/usr/lib/systemd/system/eap8-domain.service; enabled; pres>\n     Active: active (running) since Mon 2024-09-23 15:52:06 UTC; 42ms ago\n   Main PID: 2018 (scl)\n      Tasks: 5 (limit: 20044)\n     Memory: 1.9M\n        CPU: 15ms\n     CGroup: /system.slice/eap8-domain.service\n             ├─2018 /usr/bin/scl enable eap8 -- /opt/rh/eap8/root/usr/share/wil>\n             ├─2019 /bin/bash /var/tmp/sclTMatKT\n             ├─2022 /bin/sh /opt/rh/eap8/root/usr/share/wildfly/bin/launch.sh />\n             ├─2024 /bin/sh /opt/rh/eap8/root/usr/share/wildfly/bin/launch.sh />\n             └─2026 \"[sed]\"\n\nSep 23 15:52:06 adminVM systemd[1]: Started JBoss EAP (domain mode).\n```\n\nType <kbd>q</kbd> to exit the pager. Exit from the SSH connection by typing **exit**.\n\n---\n\nAfter starting the Red Hat JBoss EAP service, you can access the management console via `http://$ADMIN_VM_PUBLIC_IP:9990` in your web browser. Sign in with the configured username `jbossadmin` and password `Secret123456`.\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vm-manually/adminconsole.png\" alt-text=\"Screenshot of the Red Hat JBoss Enterprise Application Platform domain controller management console.\" lightbox=\"media/migrate-jboss-eap-to-vm-manually/adminconsole.png\":::\n\nSelect the **Runtime** tab. In the navigation pane, select **Topology**. You should see that for now your cluster only contains one domain controller:\n\n### [JBOSS EAP 7.4](#tab/jboss-eap-74)\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vm-manually/topology-only-with-admin.png\" alt-text=\"Screenshot of the Red Hat JBoss Enterprise Application Platform that shows the Runtime tab and the Topology pane with domain controller only.\" lightbox=\"media/migrate-jboss-eap-to-vm-manually/topology-only-with-admin.png\":::\n\n### [JBOSS EAP 8](#tab/jboss-eap-8)\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vm-manually/topology-only-with-admin-eap8.png\" alt-text=\"Screenshot of the Red Hat JBoss Enterprise Application Platform that shows the Runtime tab and the Topology pane with domain controller only.\" lightbox=\"media/migrate-jboss-eap-to-vm-manually/topology-only-with-admin-eap8.png\":::\n\n---\n\n#### Configure host controllers (worker nodes)\n\nUse SSH to connect to `mspVM1` as the `azureuser` user. Get the public IP address of the VM with the following command:\n\n```bash\nMSPVM_PUBLIC_IP=$(az vm show \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name mspVM1 \\\n    --show-details \\\n    --query publicIps | tr -d '\"' )\n\nssh -A -i ~/.ssh/jbosseapvm azureuser@$MSPVM_PUBLIC_IP\n```\n\n\nUse the following commands to set up the host controller on `mspVM1`:\n\n```bash\n# environment variables\nexport DOMAIN_CONTROLLER_PRIVATE_IP=<adminVM-private-IP>\nexport HOST_VM_NAME=$(hostname)\nexport HOST_VM_NAME_LOWERCASE=$(echo \"${HOST_VM_NAME,,}\")\nexport HOST_VM_IP=$(hostname -I)\n\nexport JBOSS_EAP_USER=jbossadmin\nexport JBOSS_EAP_PASSWORD=Secret123456\n\n# Save default domain configuration as backup\nsudo -u jboss mv $EAP_HOME/domain/configuration/domain.xml $EAP_HOME/domain/configuration/domain.xml.backup\n\n# Fetch domain.xml from domain controller\nscp azureuser@${DOMAIN_CONTROLLER_PRIVATE_IP}:/tmp/domain.xml /tmp/domain.xml\nsudo mv /tmp/domain.xml $EAP_HOME/domain/configuration/domain.xml\nsudo chown jboss:jboss $EAP_HOME/domain/configuration/domain.xml\n```\n\n   [!INCLUDE [security-note](../includes/security-note.md)]\n\nUse the following commands to apply host controller changes to `mspVM1`:\n\n### [JBOSS EAP 7.4](#tab/jboss-eap-74)\n\n```bash\n# Setup host controller\nsudo -u jboss $EAP_HOME/bin/jboss-cli.sh --echo-command \\\n\"embed-host-controller --std-out=echo --domain-config=domain.xml --host-config=host-slave.xml\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/server-config=server-one:remove\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/server-config=server-two:remove\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/server-config=${HOST_VM_NAME_LOWERCASE}-server0:add(group=main-server-group)\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/subsystem=elytron/authentication-configuration=slave:add(authentication-name=${JBOSS_EAP_USER}, credential-reference={clear-text=${JBOSS_EAP_PASSWORD}})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/subsystem=elytron/authentication-context=slave-context:add(match-rules=[{authentication-configuration=slave}])\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}:write-attribute(name=domain-controller.remote.username, value=${JBOSS_EAP_USER})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}:write-attribute(name=domain-controller.remote, value={host=${DOMAIN_CONTROLLER_PRIVATE_IP}, port=9990, protocol=remote+http, authentication-context=slave-context})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/core-service=discovery-options/static-discovery=primary:write-attribute(name=host, value=${DOMAIN_CONTROLLER_PRIVATE_IP})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/interface=unsecured:add(inet-address=${HOST_VM_IP})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/interface=management:write-attribute(name=inet-address, value=${HOST_VM_IP})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/interface=public:write-attribute(name=inet-address, value=${HOST_VM_IP})\"\n```\n\nThe last stanza of output should look similar to the following example. If it doesn't, troubleshoot and resolve the problem before continuing.\n\n```output\n[domain@embedded /] /host=mspvm1/interface=public:write-attribute(name=inet-address, value=192.168.0.5 )\n{\n    \"outcome\" => \"success\",\n    \"result\" => undefined,\n    \"server-groups\" => undefined,\n    \"response-headers\" => {\"process-state\" => \"reload-required\"}\n}\n02:58:59,388 INFO  [org.jboss.as] (MSC service thread 1-2) WFLYSRV0050: JBoss EAP 7.4.10.GA (WildFly Core 15.0.25.Final-redhat-00001) stopped in 58ms\n```\n\nThen, use the following commands to configure the JBoss server and setup EAP service:\n\n```bash\necho 'WILDFLY_HOST_CONFIG=host-slave.xml' | sudo tee -a $EAP_RPM_CONF_DOMAIN\n\n# Enable the JBoss server and setup EAP service\nsudo systemctl enable eap7-domain.service\n\n# Edit eap7-domain.services\nsudo sed -i 's/After=syslog.target network.target/After=syslog.target network.target NetworkManager-wait-online.service/' /usr/lib/systemd/system/eap7-domain.service\nsudo sed -i 's/Before=httpd.service/Wants=NetworkManager-wait-online.service \\nBefore=httpd.service/' /usr/lib/systemd/system/eap7-domain.service\n\n# Reload and restart EAP service\nsudo systemctl daemon-reload\nsudo systemctl restart eap7-domain.service\n\n# Check the status of EAP service\nsystemctl status eap7-domain.service\n```\n\nThe output should look similar to the following example:\n\n```output\n● eap7-domain.service - JBoss EAP (domain mode)\n   Loaded: loaded (/usr/lib/systemd/system/eap7-domain.service; enabled; vendor>\n   Active: active (running) since Thu 2023-03-30 03:02:15 UTC; 7s ago\n Main PID: 9699 (scl)\n    Tasks: 51 (limit: 20612)\n   Memory: 267.6M\n   CGroup: /system.slice/eap7-domain.service\n           ├─9699 /usr/bin/scl enable eap7 -- /opt/rh/eap7/root/usr/share/wildf>\n           ├─9700 /bin/bash /var/tmp/sclgJ1hRD\n           ├─9702 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/launch.sh /us>\n           ├─9706 /bin/sh /opt/rh/eap7/root/usr/share/wildfly/bin/domain.sh --h>\n           ├─9799 /usr/lib/jvm/jre/bin/java -D[Process Controller] -server -Xms>\n           └─9811 /usr/lib/jvm/jre/bin/java -D[Host Controller] -Dorg.jboss.boo>\n\nMar 30 03:02:15 mspVM1 systemd[1]: Started JBoss EAP (domain mode).\n```\n\nType <kbd>q</kbd> to exit the pager. Exit from the SSH connection by typing **exit**.\n\n### [JBOSS EAP 8](#tab/jboss-eap-8)\n\n```bash\n# Setup host controller\nsudo -u jboss $EAP_HOME/bin/jboss-cli.sh --echo-command \\\n\"embed-host-controller --std-out=echo --domain-config=domain.xml --host-config=host-secondary.xml\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/server-config=server-one:remove\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/server-config=server-two:remove\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/server-config=${HOST_VM_NAME_LOWERCASE}-server0:add(group=main-server-group)\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/subsystem=elytron/authentication-configuration=secondary:add(authentication-name=${JBOSS_EAP_USER}, credential-reference={clear-text=${JBOSS_EAP_PASSWORD}})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/subsystem=elytron/authentication-context=secondary-context:add(match-rules=[{authentication-configuration=secondary}])\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}:write-attribute(name=domain-controller.remote.username, value=${JBOSS_EAP_USER})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}:write-attribute(name=domain-controller.remote, value={host=${DOMAIN_CONTROLLER_PRIVATE_IP}, port=9990, protocol=remote+http, authentication-context=secondary-context})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/core-service=discovery-options/static-discovery=primary:write-attribute(name=host, value=${DOMAIN_CONTROLLER_PRIVATE_IP})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/interface=unsecured:add(inet-address=${HOST_VM_IP})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/interface=management:write-attribute(name=inet-address, value=${HOST_VM_IP})\",\\\n\"/host=${HOST_VM_NAME_LOWERCASE}/interface=public:write-attribute(name=inet-address, value=${HOST_VM_IP})\"\n```\n\nThe last stanza of output should look similar to the following example. If it doesn't, troubleshoot and resolve the problem before continuing.\n\n```output\n[domain@embedded /] /host=mspvm1/interface=public:write-attribute(name=inet-address, value=192.168.0.5 )\n{\n    \"outcome\" => \"success\",\n    \"result\" => undefined,\n    \"server-groups\" => undefined,\n    \"response-headers\" => {\"process-state\" => \"reload-required\"}\n}\n06:33:43,528 INFO  [org.jboss.as] (MSC service thread 1-1) WFLYSRV0050: JBoss EAP 8.0 Update 3.0 (WildFly Core 21.0.10.Final-redhat-00001) stopped in 24ms\n```\n\nThen, use the following commands to configure the JBoss server and setup EAP service:\n\n```bash\necho 'WILDFLY_HOST_CONFIG=host-secondary.xml' | sudo tee -a $EAP_RPM_CONF_DOMAIN\n\n# Enable the JBoss server and setup EAP service\nsudo systemctl enable eap8-domain.service\n\n# Edit eap8-domain.service\nsudo sed -i 's/After=syslog.target network.target/After=syslog.target network.target NetworkManager-wait-online.service/' /usr/lib/systemd/system/eap8-domain.service\nsudo sed -i 's/Before=httpd.service/Wants=NetworkManager-wait-online.service \\nBefore=httpd.service/' /usr/lib/systemd/system/eap8-domain.service\n\n# Reload and restart EAP service\nsudo systemctl daemon-reload\nsudo systemctl restart eap8-domain.service\n\n# Check the status of EAP service\nsystemctl status eap8-domain.service\n```\n\nThe output should look similar to the following example:\n\n```output\n● eap8-domain.service - JBoss EAP (domain mode)\n   Loaded: loaded (/usr/lib/systemd/system/eap8-domain.service; enabled; vendor>\n   Active: active (running) since Thu 2023-03-30 03:02:15 UTC; 7s ago\n Main PID: 9699 (scl)\n    Tasks: 51 (limit: 20612)\n   Memory: 267.6M\n   CGroup: /system.slice/eap8-domain.service\n           ├─9699 /usr/bin/scl enable eap8 -- /opt/rh/eap8/root/usr/share/wildf>\n           ├─9700 /bin/bash /var/tmp/sclgJ1hRD\n           ├─9702 /bin/sh /opt/rh/eap8/root/usr/share/wildfly/bin/launch.sh /us>\n           ├─9706 /bin/sh /opt/rh/eap8/root/usr/share/wildfly/bin/domain.sh --h>\n           ├─9799 /usr/lib/jvm/jre/bin/java -D[Process Controller] -server -Xms>\n           └─9811 /usr/lib/jvm/jre/bin/java -D[Host Controller] -Dorg.jboss.boo>\n\nSep 30 03:02:15 mspVM1 systemd[1]: Started JBoss EAP (domain mode).\n```\n\nType <kbd>q</kbd> to exit the pager. Exit from the SSH connection by typing **exit**.\n\n---\n\nUse SSH to connect to `mspVM2` as the `azureuser` user. Get the public IP address of the VM with the following command:\n\n```bash\naz vm show \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name mspVM2 \\\n    --show-details \\\n    --query publicIps | tr -d '\"'\n```\n\nRepeat the previous steps on `mspVM2`, and then exit the SSH connection by typing **exit**.\n\nAfter two host controllers are connected to `adminVM`, you should be able to see the cluster topology, as shown in the following screenshot:\n\n### [JBOSS EAP 7.4](#tab/jboss-eap-74)\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vm-manually/topology-with-cluster.png\" alt-text=\"Screenshot of the Red Hat JBoss Enterprise Application Platform that shows the Runtime tab and the Topology pane with all hosts.\" lightbox=\"media/migrate-jboss-eap-to-vm-manually/topology-with-cluster.png\":::\n\n### [JBOSS EAP 8](#tab/jboss-eap-8)\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vm-manually/topology-with-cluster-eap8.png\" alt-text=\"Screenshot of the Red Hat JBoss Enterprise Application Platform that shows the Runtime tab and the Topology pane with all hosts.\" lightbox=\"media/migrate-jboss-eap-to-vm-manually/topology-with-cluster-eap8.png\":::\n\n---\n\n## Expose Red Hat JBoss EAP cluster with Azure Application Gateway\n\nNow that you created the cluster on Azure VMs, this section walks you through exposing JBoss EAP to the internet with Azure Application Gateway.\n\n### Create the Azure Application Gateway\n\nTo expose Red Hat JBoss EAP to the internet, a public IP address is required. Create the public IP address and then associate an Azure Application gateway with it. Use [az network public-ip create](/cli/azure/network/public-ip#az-network-public-ip-create) to create it, as shown in the following example:\n\n```azurecli\naz network public-ip create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name myAGPublicIPAddress \\\n    --allocation-method Static \\\n    --sku Standard\n```\n\nNext, add the backend servers to Application Gateway backend pool. Query for backend IP addresses by using the following commands. You only have the host controllers (work nodes) configured as backend servers.\n\n```azurecli\nexport MSPVM1_NIC_ID=$(az vm show \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name mspVM1 \\\n    --query networkProfile.networkInterfaces'[0]'.id \\\n    --output tsv)\nexport MSPVM1_IP=$(az network nic show \\\n    --ids ${MSPVM1_NIC_ID} \\\n    --query ipConfigurations'[0]'.privateIPAddress \\\n    --output tsv)\nexport MSPVM2_NIC_ID=$(az vm show \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name mspVM2 \\\n    --query networkProfile.networkInterfaces'[0]'.id \\\n    --output tsv)\nexport MSPVM2_IP=$(az network nic show \\\n    --ids ${MSPVM2_NIC_ID} \\\n    --query ipConfigurations'[0]'.privateIPAddress \\\n    --output tsv)\n```\n\nNext, create an Azure Application Gateway. The following example creates an application gateway with host controllers in the default backend pool:\n\n```azurecli\naz network application-gateway create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name myAppGateway \\\n    --public-ip-address myAGPublicIPAddress \\\n    --location westus \\\n    --capacity 2 \\\n    --http-settings-port 8080 \\\n    --http-settings-protocol Http \\\n    --frontend-port 80 \\\n    --sku Standard_V2 \\\n    --subnet jbossVMGatewaySubnet \\\n    --vnet-name myVNet \\\n    --priority 1001 \\\n    --servers ${MSPVM1_IP} ${MSPVM2_IP}\n```\n\n> [!NOTE]\n> This example sets up simple access to the Red Hat JBoss EAP servers with HTTP. If you want secure access, configure TLS/SSL termination by follow the instructions in [End to end TLS with Application Gateway](/azure/application-gateway/ssl-overview).\n>\n> This example exposes the host controllers at port 8080. You deploy a sample application with a database connection to the cluster in later steps.\n\n## Connect Azure Database for PostgreSQL Flexible Server\n\nThis section shows you how to create an Azure Database for PostgreSQL Flexible Server instance and configure a connection to PostgreSQL on your Red Hat JBoss EAP cluster.\n\n### Create an Azure Database for PostgreSQL Flexible Server instance\n\nUse the following steps to create the database instance:\n\n1. Use [az postgres flexible-server create ](/cli/azure/postgres/server#az-postgres-flexible-server-create) to provision an Azure Database for PostgreSQL Flexible Server instance, as shown in the following example:\n\n   ```azurecli\n   export DATA_BASE_USER=jboss\n\n   DB_SERVER_NAME=\"jbossdb$(date +%s)\"\n   echo \"DB_SERVER_NAME=${DB_SERVER_NAME}\"\n   az postgres flexible-server create \\\n       --active-directory-auth Enabled \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name ${DB_SERVER_NAME}  \\\n       --location westus \\\n       --version 16 \\\n       --public-access 0.0.0.0 \\\n       --tier Burstable \\\n       --sku-name Standard_B1ms \\\n       --yes\n   objectId=$(az identity show --name passwordless-managed-identity --resource-group $RESOURCE_GROUP_NAME --query principalId -o tsv)\n   az postgres flexible-server ad-admin create \\\n     --resource-group $RESOURCE_GROUP_NAME \\\n     --server-name ${DB_SERVER_NAME}  \\\n     --display-name \"passwordless-managed-identity\"  \\\n     --object-id $objectId \\\n     --type ServicePrincipal \n   ```\n\n1. Use the following commands to allow access from Azure services:\n\n   ```azurecli\n   # Save aside the following names for later use\n   export fullyQualifiedDomainName=$(az postgres flexible-server show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name ${DB_SERVER_NAME} \\\n       --query \"fullyQualifiedDomainName\" \\\n       --output tsv)\n   export name=$(az postgres flexible-server show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name ${DB_SERVER_NAME} \\\n       --query \"name\" \\\n       --output tsv)\n\n   az postgres flexible-server firewall-rule create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name ${DB_SERVER_NAME} \\\n       --rule-name \"AllowAllWindowsAzureIps\" \\\n       --start-ip-address \"0.0.0.0\" \\\n       --end-ip-address \"0.0.0.0\"\n   ```\n\n1. Use the following command to create the database:\n\n   ```azurecli\n   az postgres flexible-server db create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --server-name ${DB_SERVER_NAME} \\\n       --database-name testdb\n   ```\n\n### Install driver\n\nUse the following steps to install the JDBC driver with the JBoss management CLI:\n\n1. SSH to `adminVM` by using the following command. You can skip this step if you already have a connection opened.\n\n   ```bash\n   ssh -A -i ~/.ssh/jbosseapvm azureuser@$ADMIN_VM_PUBLIC_IP\n   ```\n\n1. Use the following commands to download JDBC driver on adminVM:\n\n   ```bash\n   # Create JDBC driver and module directory\n   jdbcDriverModuleDirectory=$EAP_HOME/modules/com/postgresql/main\n   \n   sudo mkdir -p \"$jdbcDriverModuleDirectory\"\n   \n   # Download JDBC driver and passwordless extensions\n   \n   extensionJarName=azure-identity-extensions-1.1.20.jar\n   extensionPomName=azure-identity-extensions-1.1.20.pom\n   sudo curl --retry 5 -Lo ${jdbcDriverModuleDirectory}/${extensionJarName} https://repo1.maven.org/maven2/com/azure/azure-identity-extensions/1.1.20/$extensionJarName\n   sudo curl --retry 5 -Lo ${jdbcDriverModuleDirectory}/${extensionPomName} https://repo1.maven.org/maven2/com/azure/azure-identity-extensions/1.1.20/$extensionPomName\n   \n   sudo yum install maven -y\n   sudo mvn dependency:copy-dependencies  -f ${jdbcDriverModuleDirectory}/${extensionPomName} -Ddest=${jdbcDriverModuleDirectory}\n   \n   # Create module for JDBC driver\n   jdbcDriverModule=module.xml\n   sudo cat <<EOF >${jdbcDriverModule}\n   <?xml version=\"1.0\" ?>\n   <module xmlns=\"urn:jboss:module:1.1\" name=\"com.postgresql\">\n     <resources>\n       <resource-root path=\"${extensionJarName}\"/>\n   EOF\n   \n   # Add all jars from target/dependency\n   for jar in ${jdbcDriverModuleDirectory}/target/dependency/*.jar; do\n   if [ -f \"$jar\" ]; then\n   # Extract just the filename from the path\n   jarname=$(basename \"$jar\")\n   echo \"    <resource-root path=\\\"target/dependency/${jarname}\\\"/>\" >> ${jdbcDriverModule}\n   fi\n   done\n   \n   # Add the closing tags\n   cat <<EOF >> ${jdbcDriverModule}\n   </resources>\n   <dependencies>\n   <module name=\"javaee.api\"/>\n   <module name=\"sun.jdk\"/>\n   <module name=\"ibm.jdk\"/>\n   <module name=\"javax.api\"/>\n   <module name=\"javax.transaction.api\"/>\n   </dependencies>\n   </module>\n   EOF\n   \n   chmod 644 $jdbcDriverModule\n   sudo mv $jdbcDriverModule $jdbcDriverModuleDirectory/$jdbcDriverModule\n   ```\n\n1. Use the following commands to copy the JDBC driver to the host controllers:\n\n   ```bash\n   scp -rp $EAP_HOME/modules/com/postgresql azureuser@mspvm1:/tmp/\n   ssh azureuser@mspvm1 \"sudo mkdir -p $EAP_HOME/modules/com/postgresql && sudo cp -rp /tmp/postgresql/* $EAP_HOME/modules/com/postgresql && sudo rm -rf /tmp/postgresql\"\n   \n   scp -rp $EAP_HOME/modules/com/postgresql azureuser@mspvm2:/tmp/\n   ssh azureuser@mspvm2 \"sudo mkdir -p $EAP_HOME/modules/com/postgresql && sudo cp -rp /tmp/postgresql/* $EAP_HOME/modules/com/postgresql && sudo rm -rf /tmp/postgresql\"\n   ```\n\n   ### [JBOSS EAP 7.4](#tab/jboss-eap-74)\n\n   The server log is located on `mspVM1` and `mspVM2` at `/var/opt/rh/eap7/lib/wildfly/domain/servers/mspvm1-server0/log/server.log`. If the deployment fails, examine this log file and resolve the problem before continuing.\n\n   ### [JBOSS EAP 8](#tab/jboss-eap-8)\n\n   The server log is located on `mspVM1` and `mspVM2` at `/var/opt/rh/eap8/lib/wildfly/domain/servers/mspvm1-server0/log/server.log`. If the deployment fails, examine this log file and resolve the problem before continuing.\n   \n   ---\n\n2. Use the following commands to register the JDBC driver:\n\n   ```bash\n   # Register JDBC driver\n   sudo -u jboss $EAP_HOME/bin/jboss-cli.sh --connect --controller=$(hostname -I) --echo-command \\\n   \"/profile=ha/subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql,driver-module-name=com.postgresql,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource,driver-class-name=org.postgresql.Driver)\"\n   ```\n\n### Configure the database connection for the Red Hat JBoss EAP cluster\n\nYou started the database server, obtained the necessary resource ID, and installed the JDBC driver. Next, the steps in this section show you how to use the JBoss CLI to configure a datasource connection with the PostgreSQL instance you created previously.\n\n1. Open a terminal and SSH to `adminVM` by using the following command:\n\n   ```bash\n   ssh -i ~/.ssh/jbosseapvm azureuser@$ADMIN_VM_PUBLIC_IP\n   ```\n\n1. Create data source by using the following commands:\n\n   ```bash\n   # Replace the following values with your own\n   export DATA_SOURCE_CONNECTION_STRING=\"jdbc:postgresql://<database-fully-qualified-domain-name>:5432/testdb?sslmode=require&user=passwordless-managed-identity&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\"\n   export JDBC_DATA_SOURCE_NAME=dataSource-postgresql\n   export JDBC_JNDI_NAME=java:jboss/datasources/JavaEECafeDB\n\n   sudo -u jboss $EAP_HOME/bin/jboss-cli.sh --connect --controller=$(hostname -I) --echo-command \\\n   \"data-source add --driver-name=postgresql --profile=ha --name=${JDBC_DATA_SOURCE_NAME} --jndi-name=${JDBC_JNDI_NAME} --connection-url=${DATA_SOURCE_CONNECTION_STRING} \"\n   ```\n\nYou successfully configured a data source named `java:jboss/datasources/JavaEECafeDB`.\n\n## Deploy Java EE Cafe sample application\n\nUse the following steps to deploy Java EE Cafe sample application to the Red Hat JBoss EAP cluster:\n\n1. Use the following steps to build Java EE Cafe. These steps assume you have a local environment with Git and Maven installed:\n\n   1. Use the following command to clone the source code from GitHub:\n\n      ### [JBOSS EAP 7.4](#tab/jboss-eap-74)\n       \n      ```bash\n      git clone https://github.com/Azure/rhel-jboss-templates.git --branch 20240904 --single-branch\n      ```\n      ### [JBOSS EAP 8](#tab/jboss-eap-8)\n       \n      ```bash\n      git clone https://github.com/Azure/rhel-jboss-templates.git --branch 20240924 --single-branch\n      ```\n\n   1. Use the following command to build the source code:\n\n      ```bash\n      mvn clean install --file rhel-jboss-templates/eap-coffee-app/pom.xml\n      ```\n\n      This command creates the file **eap-coffee-app/target/javaee-cafe.war**. You upload this file in the next step.\n\n1. Open a web browser and go to the management console at `http://<adminVM-public-IP>:9990`, then sign in with username `jbossadmin` and password `Secret123456`.\n\n1. Use the following steps to upload the **javaee-cafe.war** to the **Content Repository**:\n\n   1. From the **Deployments** tab of the Red Hat JBoss EAP management console, select **Content Repository** in the navigation pane.\n   1. Select the **Add** button and then select **Upload Content**.\n\n      :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vm-manually/upload-content.png\" alt-text=\"Screenshot of the Red Hat JBoss Enterprise Application Platform Deployments tab with the Upload Content menu option highlighted.\" lightbox=\"media/migrate-jboss-eap-to-vm-manually/upload-content.png\":::\n\n   1. Use the browser file chooser to select the **javaee-cafe.war** file.\n   1. Select **Next**.\n   1. Accept the defaults on the next screen and then select **Finish**.\n   1. Select **View content**.\n\n1. Use the following steps to deploy an application to `main-server-group`:\n\n   1. From **Content Repository**, select **javaee-cafe.war**.\n   1. On the drop-down menu, select **Deploy**.\n   1. Select `main-server-group` as the server group for deploying **javaee-cafe.war**.\n   1. Select **Deploy** to start the deployment. You should see a notice similar to the following screenshot:\n\n      :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vm-manually/successfully-deployed.png\" alt-text=\"Screenshot of the notice of successful deployment.\" lightbox=\"media/migrate-jboss-eap-to-vm-manually/successfully-deployed.png\":::\n\n## Test the Red Hat JBoss EAP cluster configuration\n\nYou configured the JBoss EAP cluster and deployed the application to it. Use the following steps to access the application to validate all the settings:\n\n1. Use the following command to obtain the public IP address of the Azure Application Gateway:\n\n   ```bash\n   az network public-ip show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name myAGPublicIPAddress \\\n       --query '[ipAddress]' \\\n       --output tsv\n   ```\n\n1. Open a web browser.\n1. Navigate to the application with the URL `http://<gateway-public-ip-address>/javaee-cafe/`. Don't forget the trailing slash.\n1. Try to add and remove coffees.\n\n## Clean up resources\n\nTo avoid Azure charges, you should clean up unnecessary resources. When you no longer need the Red Hat JBoss EAP cluster deployed on an Azure VM, unregister the Red Hat JBoss EAP servers and remove the Azure resources.\n\nUse the following commands to unregister the Red Hat JBoss EAP servers and VMs from Red Hat subscription management:\n\n```azurecli\n# Unregister domain controller\naz vm run-command invoke \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name adminVM \\\n    --command-id RunShellScript \\\n    --scripts \"sudo subscription-manager unregister\"\n\n# Unregister host controllers\naz vm run-command invoke \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name mspVM1 \\\n    --command-id RunShellScript \\\n    --scripts \"sudo subscription-manager unregister\"\naz vm run-command invoke \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name mspVM2 \\\n    --command-id RunShellScript \\\n    --scripts \"sudo subscription-manager unregister\"\n```\n\nUse the following command to delete the resource group `$RESOURCE_GROUP_NAME`:\n\n```azurecli\naz group delete --name $RESOURCE_GROUP_NAME --yes --no-wait\n```\n\n## Next steps\n\nContinue to explore options to run JBoss EAP on Azure.\n\n> [!div class=\"nextstepaction\"]\n> [Explore JBoss EAP on Azure](/azure/developer/java/ee/jboss-on-azure)\n"
  },
  {
    "path": "articles/java/migration/migrate-jboss-eap-to-jboss-eap-on-azure-app-service.md",
    "content": "---\ntitle: Migrate JBoss EAP applications to JBoss EAP on Azure App Service\ndescription: This guide describes what you should be aware of when you want to migrate an existing JBoss EAP application to run on JBoss EAP in an Azure App Service container.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-azurecli, devx-track-extended-java, devx-track-java, devx-track-javaee, devx-track-javaee-jbosseap, devx-track-javaee-jbosseap-appsvc, migration-java, linux-related-content\n---\n\n# Migrate JBoss EAP applications to JBoss EAP on Azure App Service\n\nThis guide describes what you should be aware of when you want to migrate an existing Red Hat JBoss Enterprise Application Platform (EAP) application to run on JBoss EAP in an Azure App Service instance.\n\n## Premigration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n[!INCLUDE [inventory-server-capacity-aks](includes/inventory-server-capacity-aks.md)]\n\n### Inventory all secrets\n\nCheck all properties and configuration files on the production servers for any secrets and passwords. Be sure to check **jboss-web.xml** in your Web Application Archive (WAR) files. Configuration files that contain passwords or credentials can also be found inside your application.\n\nConsider storing those secrets in Azure KeyVault. For more information, see [Azure Key Vault basic concepts](/azure/key-vault/basic-concepts).\n\nYou can use Key Vault secrets in your App Service instance with Key Vault references. Key Vault references allow you to use the secrets in your application while keeping them secured and encrypted at rest. For more information, see [Use Key Vault references for App Service and Azure Functions](/azure/app-service/app-service-key-vault-references).\n\n[!INCLUDE [inventory-all-certificates](includes/inventory-all-certificates.md)]\n\n### Validate that the supported Java version works correctly\n\nJBoss EAP on App Service requires a supported version of Java. For guidance on which version of the Java Development Kit (JDK) to use, see [Supported Configurations](https://access.redhat.com/articles/6961381?extIdCarryOver=true&sc_cid=RHCTN0250000439448) in the Red Hat documentation.\n\n[!INCLUDE [note-obtain-your-current-java-version](includes/note-obtain-your-current-java-version.md)]\n\n[!INCLUDE [inventory-external-resources](includes/inventory-external-resources-jboss.md)]\n\n### Determine whether and how the file system is used\n\nAny usage of the file system on the application server requires reconfiguration or, in rare cases, architectural changes. JBoss EAP modules or your application code can use the file system. You can identify some or all of the scenarios described in the following sections.\n\n[!INCLUDE [static-content](includes/static-content.md)]\n\n[!INCLUDE [dynamic-or-internal-content-app-service](includes/dynamic-or-internal-content-app-service.md)]\n\n[!INCLUDE [determine-whether-your-application-relies-on-scheduled-jobs](includes/determine-whether-your-application-relies-on-scheduled-jobs-app-service.md)]\n\n[!INCLUDE [determine-whether-a-connection-to-on-premises-is-needed](includes/determine-whether-a-connection-to-on-premises-is-needed.md)]\n\n[!INCLUDE [determine-whether-jms-queues-or-topics-are-in-use](includes/determine-whether-jms-queues-or-topics-are-in-use.md)]\n\n### Determine whether JCA connectors are in use\n\nIf your application uses Java Connector Architecture (JCA) connectors, validate that you can use the JCA connector on JBoss EAP. If you can use the JCA connector on JBoss EAP, then for it to be available, you must add the Java Archive (JAR) files to the server classpath and put the necessary configuration files in the correct location in the JBoss EAP server directories.\n\n[!INCLUDE [determine-whether-jaas-is-in-use](includes/determine-whether-jaas-is-in-use-jboss.md)]\n\n[!INCLUDE [determine-whether-your-application-uses-a-resource-adapter](includes/determine-whether-your-application-uses-a-resource-adapter-jboss.md)]\n\n[!INCLUDE [determine-whether-your-application-is-composed-of-multiple-wars](includes/determine-whether-your-application-is-composed-of-multiple-wars.md)]\n\n### Determine whether your application is packaged as an EAR\n\nIf your application is packaged as an EAR file, be sure to examine the **application.xml** file and capture the configuration.\n\n> [!NOTE]\n> If you want to be able to scale each of your web applications independently for better use of your App Service resources, you should break up the EAR into separate web applications.\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n### Perform in-place testing\n\nBefore creating your Web Apps, migrate your application to the JDK and JBoss EAP versions that you intend to use on App Service. Test the application thoroughly to ensure compatibility and performance.\n\n### JBoss EAP on App Service feature notes\n\nWhen using JBoss EAP on App Service, be sure to take the following notes into consideration.\n\n* **JBoss EAP management console**: The JBoss web console isn't exposed on App Service. Instead, the Azure portal provides the management APIs for your application, and you should deploy using the Azure CLI, Azure Maven Plugin, or other Azure developer tools. Further configuration of JBoss resources can be achieved using the JBoss CLI during the application startup.\n* **Transactions**: The Transactions API is supported and there's support for automatic transaction recovery. For more information, see [Managing transactions on JBoss EAP](https://docs.redhat.com/en/documentation/red_hat_jboss_enterprise_application_platform/7.4/html/managing_transactions_on_jboss_eap/index) in the Red Hat documentation.\n* **Managed domain mode**: In a multi-server production environment, Managed Domain mode in JBoss EAP offers centralized managed capabilities. However with JBoss EAP on App Service, the App Service platform assumes the responsibility for configuration and management of your server instances. App Service eliminates the need for JBoss EAP's managed domain mode. Domain mode is a good choice for virtual machine-based multi-server deployments. For more information, see [About managed domains](https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/6.4/html/administration_and_configuration_guide/about_managed_domains) in the Red Hat documentation.\n* **Server-to-server clustering**: App Service fully supports JBoss EAP clustered deployments. This means you can confidently use:\n\n  * Stateful session beans.\n  * Distributed transactions.\n  * Similar features that require instance-to-instance communication or high availability.\n\n  For more information, see the [Clustering](/azure/app-service/configure-language-java?pivots=java-jboss#clustering) section of [Configure a Java app for Azure App Service](/azure/app-service/configure-language-java?pivots=java-jboss).\n\n## Migration\n\n### Red Hat Migration Toolkit for Apps\n\nThe [Red Hat Migration Toolkit for Applications](https://marketplace.visualstudio.com/items?itemName=redhat.mta-vscode-extension) is a free extension for Visual Studio Code. This extension analyzes your application code and configuration to provide recommendations for migrating to the cloud from on-premises. For more information, see [Migration Toolkit for Applications overview](https://developers.redhat.com/products/mta/overview).\n\nThe contents of this guide help you address the other components of the migration journey, such as choosing the correct App Service Plan type, externalizing your session state, and using Azure to manage your EAP instances instead of the JBoss Management interface.\n\n[!INCLUDE [provision-azure-app-service-for-jboss-eap-runtime](includes/provision-azure-app-service-for-jboss-eap-runtime.md)]\n\n[!INCLUDE [build-and-deploy-war-to-app-service](includes/build-and-deploy-war-to-app-service.md)]\n\n[!INCLUDE [setup-data-sources-and-deploy-app-service-jboss](includes/setup-data-sources-and-deploy-app-service-jboss.md)]\n\n## Post-migration\n\nNow that you migrated your application to Azure App Service, you should verify that it works as you expect. After you do that, we have some recommendations for you that can make your application more cloud-native.\n\n[!INCLUDE [post-migration-recommendations-app-service](includes/post-migration-recommendations-app-service.md)]\n"
  },
  {
    "path": "articles/java/migration/migrate-jboss-eap-to-jboss-eap-on-azure-vms.md",
    "content": "---\ntitle: Migrate JBoss EAP applications to JBoss EAP on Azure VMs\ndescription: This guide describes what you should be aware of when you want to migrate an existing JBoss EAP application to run on JBoss EAP in Azure VMs.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-extended-java, devx-track-java, devx-track-javaee, devx-track-javaee-jbosseap, devx-track-javaee-jbosseap-vm, migration-java, linux-related-content\n---\n\n# Migrate JBoss EAP applications to JBoss EAP on Azure VMs\n\nThis guide describes what you should be aware of when you want to migrate an existing JBoss EAP application to run on JBoss EAP in Azure VMs.\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n### Define what you mean by \"migration complete\"\n\nThis guide, and the corresponding Azure Marketplace offers, are a starting point to accelerate the migration of your JBoss EAP workloads to Azure. It's important to define the scope of your migration effort. For example, are you doing a strict \"lift and shift\" from your existing infrastructure to Azure Virtual Machines? If so, you may be tempted to work in some \"lift and improve\" as you migrate.\n\nIt's better to stick as close to pure \"lift and shift\" as possible, accounting for the necessary changes as detailed in this guide. Define what you mean by \"migration complete\" so that you know when you've reached this milestone. When you've reached your \"migration complete\", you can take a snapshot of your virtual machines as described in [Create a snapshot of a virtual hard disk](/azure/virtual-machines/windows/snapshot-copy-managed-disk). It's safer to do the improvements after you've verified that you can successfully restore from your snapshot. That way you can proceed without fear of losing the migration progress you've achieved thus far.\n\n### Determine whether the prebuilt Azure Marketplace offers are a good starting point\n\nRed Hat and Microsoft have partnered to bring a set of Azure solution templates to Azure Marketplace to provide a solid starting point for migrating to Azure. You can see the list of offers in the [JBoss EAP on Azure Virtual Machines](../ee/jboss-on-azure.md#jboss-eap-on-azure-virtual-machines) section of [Red Hat JBoss EAP on Azure](../ee/jboss-on-azure.md).\n\nTo get a feel for the prebuilt Azure Marketplace offer, see [Quickstart: Deploy a JBoss EAP cluster on Azure Virtual Machines (VMs)](/azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json).\n\nIf none of the existing offers are a good starting point, you have to reproduce the deployment by hand using the resources available in Azure Virtual Machines. For more information, see [What is IaaS?](https://azure.microsoft.com/overview/what-is-iaas/)\n\n### Determine whether the JBoss EAP version is compatible\n\nYour existing JBoss EAP version must be compatible with the version in the infrastructure-as-a-service (IaaS) offers. The Azure portal pages for the offers show which versions of JBoss EAP are available. For more information, see the [JBoss EAP Cluster on VMs](https://aka.ms/jboss-eap-on-vms) offer on the Azure portal. If your existing JBoss EAP version isn't compatible with the versions available in the offer, you have to reproduce the deployment by hand using Azure IaaS resources. For more information, see [What is IaaS?](https://azure.microsoft.com/overview/what-is-iaas/)\n\n### Ensure you have the necessary licenses\n\nWhen using the prebuilt Azure Marketplace offers, you must have current licenses from Red Hat for all of your JBoss EAP servers. Moving them to Azure, you can choose between the following deployment options to meet your needs:\n\n- Deploy on Red Hat Enterprise Linux pay-as-you-go virtual machines. This option is known as *PAYG*.\n- Move your Red Hat JBoss EAP and Red Hat Enterprise Linux subscriptions to Azure through the [Red Hat Cloud Access](https://aka.ms/red-hat-cloud-access-overview) program. This option is known as *BYOS*.\n\nIn both options, for license portability, you're asked for the *Pool ID* from Red Hat. Make sure you have this ID on hand before trying the offers.\n\nThe prebuilt Azure Marketplace offers include support for Red Hat Satellite for license management. For an overview on Red Hat Satellite, see [Red Hat Satellite](https://aka.ms/red-hat-satellite).\n\n> [!NOTE]\n> If you don't have an EAP entitlement, you can sign up for a free developer subscription through the [Red Hat Developer Subscription for Individuals](https://developers.redhat.com/register). Save aside the account details for use as the *RHSM username* and *RHSM password* in the prebuilt Azure Marketplace offers.\n>\n> The steps for discovering your *Pool ID* are explained in the [Prerequisites](/azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json#prerequisites) section in [Quickstart: Deploy a JBoss EAP cluster on Azure Virtual Machines (VMs)](/azure/virtual-machines/workloads/redhat/jboss-eap-azure-vm?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json).\n\n[!INCLUDE [inventory-server-capacity-aks](includes/inventory-server-capacity-aks.md)]\n\n### Inventory all secrets\n\nCheck all properties and configuration files on the production server or servers for any secrets and passwords. Be sure to check the **jboss-web.xml** file in your WARs. Configuration files that contain passwords or credentials may also be found inside your application.\n\nConsider storing those secrets in Azure KeyVault. For more information, see [Azure Key Vault basic concepts](/azure/key-vault/basic-concepts).\n\n[!INCLUDE [inventory-all-certificates](includes/inventory-all-certificates.md)]\n\n[!INCLUDE [validate-that-the-supported-java-version-works-correctly-jboss-eap](includes/validate-that-the-supported-java-version-works-correctly-jboss-eap.md)]\n\n[!INCLUDE [inventory-external-resources](includes/inventory-external-resources-jboss.md)]\n\n### Determine whether and how the file system is used\n\nAny usage of the file system on the application server requires reconfiguration or, in rare cases, architectural changes. JBoss EAP modules or your application code may use the file system. You may identify some or all of the scenarios described in the following sections.\n\n[!INCLUDE [static-content](includes/static-content.md)]\n\n[!INCLUDE [determine-whether-a-connection-to-on-premises-is-needed](includes/determine-whether-a-connection-to-on-premises-is-needed.md)]\n\n[!INCLUDE [determine-whether-jms-queues-or-topics-are-in-use](includes/determine-whether-jms-queues-or-topics-are-in-use.md)]\n\n### Determine whether JCA connectors are in use\n\nIf your application uses JCA connectors, validate that you can use the JCA connector on JBoss EAP. If you can use the JCA connector on JBoss EAP, then for it to be available, you must add the JARs to the server classpath and put the necessary configuration files in the correct location in the JBoss EAP server directories.\n\n[!INCLUDE [determine-whether-jaas-is-in-use](includes/determine-whether-jaas-is-in-use-jboss.md)]\n\n[!INCLUDE [determine-whether-your-application-is-composed-of-multiple-wars](includes/determine-whether-your-application-is-composed-of-multiple-wars.md)]\n\n### Determine whether your application is packaged as an EAR\n\nIf your application is packaged as an EAR file, be sure to examine the **application.xml** file and capture the configuration.\n\n> [!NOTE]\n> If you want to be able to scale each of your web applications independently for better use of your Azure VM resources, you should break up the EAR into separate web applications.\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n## Migration\n\n### Select a JBoss EAP on Azure Virtual Machines offer\n\nThe offers described in the following sections are available for JBoss EAP on Azure Virtual Machines.\n\nDuring the deployment of an offer, you're asked to choose the virtual machine size for your JBoss EAP server nodes. It's important to consider all aspects of sizing (memory, processor, disk) in your choice of VM size. For more information, see [Sizes for Cloud Services (classic)](/azure/cloud-services/cloud-services-sizes-specs).\n\n### JBoss EAP on Clustered Virtual Machines\n\nIf you prefer, a traditional cluster of VMs using the JBoss EAP clustering mechanism is suitable for a lift and shift from deployments that are already using this feature. For more information, see [Clustering in Web Applications](https://docs.redhat.com/en/documentation/red_hat_jboss_enterprise_application_platform/7.2/html/development_guide/clustering_in_web_applications) in the JBoss EAP documentation. The prebuilt Azure Marketplace offer includes support for domain mode. For an overview of EAP Domains and domain mode, see [Domain Management](https://aka.ms/eap-vms-domain-mode).\n\n### JBoss EAP Single Server\n\nIf you only need a single server, perhaps for testing and evaluation, or for lightweight workloads, there's an offer that deploys a JBoss EAP single server on a single VM.\n\n### Red Hat Migration Toolkit for Apps\n\nThe [Red Hat Migration Toolkit for Applications](https://marketplace.visualstudio.com/items?itemName=redhat.mta-vscode-extension) is a free extension for Visual Studio Code. This extension analyzes your application code and configuration to provide recommendations for migrating to the cloud from on-premises. For more information, see [Migration Toolkit for Applications overview](https://developers.redhat.com/products/mta/overview).\n\nThe contents of this guide help you address the other components of the migration journey, such as choosing the correct VM size, and externalizing your session state.\n\n## Post-migration\n\nAfter you've reached the migration goals you defined in the [pre-migration](#pre-migration) step, perform some end-to-end acceptance testing to verify that everything works as expected. For information about some potential post-migration enhancements, see the following articles:\n\n- Use Azure Storage to serve static content mounted to the virtual machines. For more information, see [Attach or detach a data disk for a lab virtual machine in Azure DevTest Labs](/azure/lab-services/devtest-lab-attach-detach-data-disk).\n\n- Deploy your applications to your migrated JBoss EAP cluster with Azure DevOps. For more information, see [Get started with Azure DevOps documentation](/azure/devops/get-started).\n\n- Enhance your network topology with advanced load balancing services. For more information, see [Using load-balancing services in Azure](/azure/traffic-manager/traffic-manager-load-balancing-azure).\n\n- Use Azure Managed Identities to manage secrets and assign role-based access to Azure resources. For more information, see [What are managed identities for Azure resources?](/azure/active-directory/managed-identities-azure-resources/overview)\n\n- Integrate Java EE authentication and authorization with Microsoft Entra ID. For more information, see [Integrating Microsoft Entra ID with applications getting started guide](/azure/active-directory/manage-apps/plan-an-application-integration).\n\n- Use Azure Key Vault to store any information that functions as a \"secret\". For more information, see [Azure Key Vault basic concepts](/azure/key-vault/basic-concepts).\n"
  },
  {
    "path": "articles/java/migration/migrate-jboss-eap-to-vms-with-ha-dr.md",
    "content": "---\ntitle: \"Tutorial: Migrate JBoss EAP Application Server to Azure Virtual Machines with high availability and disaster recovery\"\ndescription: Shows how to deploy JBoss EAP Application Server to Azure Virtual Machines with high availability and disaster recovery.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: zhihaoguo\nms.topic: tutorial\nms.date: 01/13/2026\nms.custom:\n  - devx-track-extended-java\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-jbosseap\n  - devx-track-javaee-jbosseap-vm\n  - migration-java\n  - sfi-image-nochange\n---\n\n# Tutorial: Migrate JBoss EAP Application Server to Azure Virtual Machines with high availability and disaster recovery\n\n[!INCLUDE [ha-dr-for-jboss-vms-intro-head.md](includes/ha-dr-for-jboss-vms-intro-head.md)]\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Set up the JBoss EAP cluster on Azure VMs.\n> * Use Azure optimized best practices to achieve high availability and disaster recovery.\n> * Set up a Microsoft Azure SQL Database failover group in paired regions.\n> * Set up disaster recovery for the cluster using Azure Site Recovery.\n> * Set up an Azure Traffic Manager.\n> * Test failover from primary to secondary.\n\nThe following diagram illustrates the architecture that you build:\n\n<!-- Diagram source https://github.com/Azure-Samples/azure-cafe/blob/main/diagrams/jboss-eap-on-vms-ha-dr-solution-architecture.pptx -->\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/solution-architecture.png\" alt-text=\"Diagram of the solution architecture of JBoss EAP on Azure VMs with high availability and disaster recovery.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/solution-architecture.png\" border=\"false\":::\n\n[!INCLUDE [ha-dr-for-jboss-vms-intro-end.md](includes/ha-dr-for-jboss-vms-intro-end.md)]\n\n[!INCLUDE [ha-dr-for-jboss-prerequistes.md](includes/ha-dr-for-jboss-prerequistes.md)]\n\n## Set up an Azure SQL Database failover group in paired regions\n\nIn this section, you create an Azure SQL Database failover group in paired regions for use with your JBoss EAP clusters and app.\n\n[!INCLUDE [ha-dr-for-jboss-azure-sql-database.md](includes/ha-dr-for-jboss-azure-sql-database.md)]\n\n## Set up the primary JBoss EAP cluster on Azure VMs\n\nIn this section, you create the primary JBoss EAP clusters on Azure VMs using the [JBoss EAP Cluster on VMs](https://aka.ms/eap-vm-cluster-portal) offer. The secondary cluster is restored from the primary cluster during the failover using Azure Site Recovery later.\n\n### Deploy the primary JBoss EAP cluster\n\nFirst, open the [JBoss EAP Cluster on VMs](https://aka.ms/eap-vm-cluster-portal) offer in your browser and select **Create**. You should see the **Basics** pane of the offer.\n\nUse the following steps to fill out the **Basics** pane:\n\n1. Ensure that the value shown for **Subscription** is the same one that has the roles listed in the prerequisites section.\n1. You must deploy the offer in an empty resource group. In the **Resource group** field, select **Create new** and fill in a unique value for the resource group - for example, `jboss-eap-cluster-eastus-gzh032124`.\n1. Under **Instance details**, for **Region**, select **East US**.\n1. Provide a password for **Password** and use the same value for **Confirm password**.\n1. For **Number of virtual machines to create**, input **3**.\n1. Leave other fields at their default values.\n1. Select **Next** to go to the **JBoss EAP Settings** pane.\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-basics.png\" alt-text=\"Screenshot of the Azure portal that shows the JBoss EAP Application Server Cluster on Azure VMs Basics pane.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-basics.png\":::\n\nUse the following steps to fill out the **JBoss EAP Settings** pane:\n\n1. Provide a JBoss EAP password for **JBoss EAP password**. Use the same value for **Confirm password**. Write down the value for later use.\n1. Leave other fields at their default values.\n1. Select **Next** to go to the **Azure Application Gateway** pane.\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-jboss-eap-setting.png\" alt-text=\"Screenshot of the Azure portal that shows the JBoss EAP Application Settings configuration pane.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-jboss-eap-setting.png\":::\n\nUse the following steps to fill out the **Azure Application Gateway** pane:\n\n1. For **Connect to Azure Application Gateway?**, select **Yes**.\n1. Leave other fields at their default values.\n1. Select **Next** to go to the **Networking** pane.\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-application-gateway.png\" alt-text=\"Screenshot of the Azure portal that shows the Azure Application Gateway pane.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-application-gateway.png\":::\n\nYou should see all fields prepopulated with the default values in the **Networking** pane. Select **Next** to go to the **Database** pane.\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-networking.png\" alt-text=\"Screenshot of the Azure portal that shows the Networking pane.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-networking.png\":::\n\nUse the following steps to fill out the **Database** pane:\n\n1. For **Connect to database?**, select **Yes**.\n1. For **Choose database type**, select **Microsoft SQL Server** .\n1. For **JNDI Name**, enter **java:jboss/datasources/JavaEECafeDB**.\n1. For **Data source connection string (jdbc:sqlserver://\\<host\\>:\\<port\\>;database=\\<database\\>)**, replace the placeholders with the values you wrote down from the preceding section for the failover group of Azure SQL Database - for example, `jdbc:sqlserver://failovergroup-gzh032124.database.windows.net:1433;database=mySampleDatabase`.\n1. For **Database username**, enter the server admin sign-in name and the failover group name you wrote down from the preceding section - for example, `azureuser@failovergroup-gzh032124`.\n1. Enter the server admin sign-in password that you wrote down before for **Database Password**. Enter the same value for **Confirm password**.\n1. Select **Review + create**.\n1. Wait until **Running final validation...** successfully completes, then select **Create**.\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-database.png\" alt-text=\"Screenshot of the Azure portal that shows the Database pane.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-database.png\":::\n\nAfter a while, you should see the **Deployment** page where **Deployment is in progress** is displayed.\n\n> [!NOTE]\n> If you see any problems during **Running final validation...**, fix them and try again.\n\nDepending on network conditions and other activity in your selected region, the deployment can take up to 35 minutes to complete. After that, you should see the text **Your deployment is complete** displayed on the deployment page.\n\n\n## Verify the functionality of the deployment\n\nUse the following steps to verify the functionality of the deployment for a JBoss EAP cluster on Azure VMs from the **Red Hat JBoss Enterprise Application Platform** management console:\n\n1. On the page **Your deployment is complete**, select **Outputs**.\n1. Select the copy icon next to **adminConsole**.\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/rg-deployments-outputs.png\" alt-text=\"Screenshot of the Azure portal showing the deployment outputs with the adminConsole URL highlighted.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/rg-deployments-outputs.png\":::\n\n1. Paste the URL into an internet-connected web browser and press <kbd>Enter</kbd>. You should see the familiar **Red Hat JBoss Enterprise Application Platform** management console sign-in screen, as shown in the following screenshot.\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-login.png\" alt-text=\"Screenshot of the JBoss EAP management console sign-in screen.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-login.png\":::\n\n1. Fill in **jbossadmin** for **JBoss EAP Admin username** Provide the value for **JBoss EAP password** that you specified before for **Password**, then select **Sign in**.\n1. You should see the familiar **Red Hat JBoss Enterprise Application Platform** management console welcome page as shown in the following screenshot.\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-welcome.png\" alt-text=\"Screenshot of JBoss EAP management console welcome page.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-welcome.png\":::\n\n1. Select the **Runtime** tab. In the navigation pane, select **Topology**. You should see that the cluster contains one domain controller **master** and two worker nodes, as shown in the following screenshot:\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-runtime-topology.png\" alt-text=\"Screenshot of the JBoss EAP management console Runtime topology.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-runtime-topology.png\":::\n\nLeave the management console open. You use it to deploy a sample app to the JBoss EAP cluster in the next section.\n\n## Configure the cluster\nUse the following steps to configure database distributed sessions for all application servers:\n\n1. Select **Configuration** in the navigation panel. Then, select **Profiles** > **ha** > **Infinspan** > **Web**.\n\n1. In the **Cache** column, select **Add Distributed Cache**.\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-add-distributed-cache.png\" alt-text=\"Screenshot of the JBoss EAP management console Add Distributed Cache.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-add-distributed-cache.png\":::\n\n1. For **Name**, enter **azure-session** and then select **Add**.\n\n1. You should see the message **Distributed Cache azure-session successfully added**. If you don't see this message, check the notification center. You must see this message before proceeding.\n\n1. After the cache is added, select **azure-session** > **View**.\n\n1. Select **Store**.\n\n1. Change the drop-down menu to show **JDBC** and then select **Add**.\n\n1. For **Data source**, select **dataSource-mssqlserver** and then select **Add**.\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-store-jdbc.png\" alt-text=\"Screenshot of the JBoss EAP management console Store JDBC.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-store-jdbc.png\":::\n\n1. You should see the message **JDBC successfully added**. If you don't see this message, check the notification center. You must see this message before proceeding.\n\n1. On the **Store: JDBC** page, select **Edit**. Set the following property values:\n\n   - Set **Dialect** to **SQL_SERVER**.\n   - Set **Passivation** to **OFF**.\n   - Set **Purge** to **OFF**.\n   - Set **Shared** to **ON**.\n\n1. Select **Save**.\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-edit-store-jdbc.png\" alt-text=\"Screenshot of the JBoss EAP management console Edit Store JDBC.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-edit-store-jdbc.png\":::\n\n1. You should see the message **JDBC successfully modified**. If you don't see this message, check the notification center. You must see this message before proceeding.\n\n1. Edit the string table by selecting **String Table** > **Edit**. Fill in the following values and then select **Save**:\n\n   - Set **Prefix** to **ispn_entry_sessions**.\n   - Set **ID Column / ID Column Name** to **id**.\n   - Set **ID Column / ID Column Type** to **VARCHAR(255)**.\n   - Set **Data Column / Data Column Name** to **data**.\n   - Set **Data Column / Data Column Type** to **VARBINARY(MAX)**.\n   - Set **Timestamp Column / Timestamp Column Name** to **timestamp**.\n   - Set **Timestamp Column / Timestamp Column Type** to **BIGINT**.\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-edit-string-table.png\" alt-text=\"Screenshot of the JBoss EAP management console Edit String Table.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-edit-string-table.png\":::\n\n   Any typos here cause the whole system to fail. Inspect the filled-in values carefully before proceeding.\n\n1. Select **Save**.\n\n1. You should see the message **String Table successfully modified**. If you don't see this message, check the notification center. You must see this message before proceeding.\n\n1. Select **Configuration** in the top navigation panel. Then, select **Profiles** > **ha** > **Distributable Web** > **View**.\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-view-distributable-web.png\" alt-text=\"Screenshot of the JBoss EAP management console View Distributable Web.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-view-distributable-web.png\":::\n\n1. Select **Infinspan SSO** > **default** > **Edit**.\n\n    :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-edit-infinispan-sso.png\" alt-text=\"Screenshot of the JBoss EAP management console Edit Infinspan SSO.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-edit-infinispan-sso.png\":::\n\n1. Set the value of **Cache** to **azure-session** and then select **Save**.\n\n1. You should see the message **Infinispan Single Sign On Management default successfully modified**. If you don't see this message, check the notification center. You must see this message before proceeding.\n\n1. Use the topology to reload or restart affected servers.\n\n1. Select **Runtime** in the navigation panel and then select **Topology**.\n\n1. For each row in the **main-server-group** column, select the server and then select **Reload**.\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-reload-servers.png\" alt-text=\"Screenshot of the JBoss EAP management console Reload servers.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-reload-servers.png\":::\n\n   The reloaded cells should now show the color green.\n\n## Deploy the app to the JBoss EAP cluster\n\nUse the following steps to deploy the JavaEE Cafe sample application to the Red Hat JBoss EAP cluster:\n\n[!INCLUDE [ha-dr-for-jboss-build-javaee-cafe.md](includes/ha-dr-for-jboss-build-javaee-cafe.md)]\n\n2. Use the following steps in the **Red Hat JBoss Enterprise Application Platform** management console to upload the **javaee-cafe.war** to the **Content Repository**:\n\n   1. From the **Deployments** tab of the Red Hat JBoss EAP management console, select **Content Repository** in the navigation panel.\n   1. Select **Add** and then select **Upload Content**.\n\n      :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-upload-content.png\" alt-text=\"Screenshot of the JBoss EAP management console Deployments tab with Upload Content menu item highlighted.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-upload-content.png\":::\n\n   1. Use the browser file chooser to select the **javaee-cafe.war** file.\n   1. Select **Next**.\n   1. Accept the defaults on the next screen and then select **Finish**.\n   1. Select **View content**.\n\n1. Use the following steps to deploy an application to `main-server-group`:\n\n   1. From **Content Repository**, select **javaee-cafe.war**.\n   1. Open the drop-down menu and then select **Deploy**.\n   1. Select **main-server-group** as the server group for deploying **javaee-cafe.war**.\n   1. Select **Deploy** to start the deployment. You should see a notice similar to the following screenshot:\n\n      :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-app-successfully-deployed.png\" alt-text=\"Screenshot of the notice of successful deployment.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/jboss-eap-console-app-successfully-deployed.png\":::\n\nYou're now finished deploying the JavaEE application. Use the following steps to access the application and validate all the settings:\n\n1. In the search box at the top of the Azure portal, enter **Resource groups** and select **Resource groups** in the search results.\n1. Select the name of resource group - for example, `jboss-eap-cluster-eastus-gzh032124`.\n1. Select the Application Gateway resource in the resource group.\n1. Copy the **Frontend public IP address** from the **Overview** pane.\n1. Construct a URL with the IP address and path - for example, `http://40.88.26.22/javaee-cafe`.\n1. Paste the URL into a web browser navigation bar and then press <kbd>Enter</kbd>. You should see the JavaEE Cafe application home page.\n1. Create two coffees with different names and prices. You should see a page similar in the following screenshot:\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/javaee-cafe-app-home-page-session.png\" alt-text=\"Screenshot of the JavaEE Cafe application home page.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/javaee-cafe-app-home-page-session.png\":::\n\n\n## Set up the secondary JBoss EAP cluster on Azure VMs\n\n### Deploy the secondary JBoss EAP cluster\n\nFollow the steps in [Deploy the primary JBoss EAP cluster](#deploy-the-primary-jboss-eap-cluster) to deploy the secondary JBoss EAP cluster in the paired region. This example uses West US 2. When you use the offer, the secondary JBoss EAP cluster is configured so that you can use Azure Site Recovery to restore the topology.\n\nOpen the [JBoss EAP Cluster on VMs](https://aka.ms/eap-vm-cluster-portal) offer in your browser and select **Create**. You should see the **Basics** pane of the offer.\n\nUse the following steps to fill out the **Basics** pane:\n\n1. In the **Resource group** field, select **Create new** and fill in a unique value for the resource group - for example, `jboss-eap-cluster-westus-gzh032124`.\n\n1. Under **Instance details**, for **Region**, select **West US 2**.\n\n1. Leave others the same as the primary cluster.\n\nFor the **JBoss EAP Settings** pane, keep it same as the primary cluster.\n\nFor the **Azure Application Gateway** pane, keep it same as the primary cluster.\n\nFor the **Networking** pane, open the **Virtual network** setting and input the address space, which is the same as value for the primary cluster.\n\n:::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-secondary-networking.png\" alt-text=\"Screenshot in secondary cluster that shows the Networking pane.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/portal-secondary-networking.png\":::\n\nUse the following steps for the **Database** pane:\n\n1. Keep it same as the primary cluster.\n1. Select **Review + create**.\n1. Wait until **Running final validation...** successfully completes, then select **Create**.\n\nAfter a while, you should see the **Deployment** page where **Deployment is in progress** is displayed.\n\n### Clean up unused resources in the secondary region\n\nUse the following steps to clean up resources in the resource group named `jboss-eap-cluster-westus-gzh032124` that aren't used and are going to be replicated by Azure Site Recovery service in the primary region later. This approach might seem wasteful, but it ensures that the secondary resource group has the identical configuration to the primary. A production grade solution would use more infrastructure-as-code technologies to ensure identical configuration, but that's beyond the scope of this article.\n\n[!INCLUDE [ha-dr-for-jboss-cleanup-unused-resource.md](includes/ha-dr-for-jboss-steps-cleanup-unused-resource.md)]\n\n## Set up disaster recovery for the cluster using Azure Site Recovery\n\n[!INCLUDE [ha-dr-for-jboss-setup-disaster-recovery.md](includes/ha-dr-for-jboss-setup-disaster-recovery.md)]\n\n## Set up an Azure Traffic Manager\n\nIn this section, you create an Azure Traffic Manager for distributing traffic to your public facing applications across Azure regions. The primary endpoint points to the public IP address of the Application Gateway in the primary region, and the secondary endpoint points to the public IP address of the Application Gateway in the secondary region.\n\n[!INCLUDE [ha-dr-for-jboss-create-azure-traffic.md](includes/ha-dr-for-jboss-create-azure-traffic.md)]\n\nNext, use the following steps to verify that the sample app deployed to the primary JBoss EAP cluster can be accessed from the Traffic Manager profile:\n\n1. Select **Overview** of the Traffic Manager profile you created.\n\n1. Check and copy the DNS name of the Traffic Manager profile. Append **/javaee-cafe/** to it. For example, `http://tm-profile-gzh032124.trafficmanager.net/javaee-cafe/`.\n\n1. Open the URL in a new tab of the browser. You should see that the coffee you created before is listed in the page.\n\n   :::image type=\"content\" source=\"media/migrate-jboss-eap-to-vms-with-ha-dr/javaee-cafe-app-home-page-session.png\" alt-text=\"Screenshot of the sample application UI.\" lightbox=\"media/migrate-jboss-eap-to-vms-with-ha-dr/javaee-cafe-app-home-page-session.png\":::\n\nIf your UI doesn't look similar, troubleshoot and resolve the problem before you continue. Keep the console open and use it for failover test later.\n\nNow you can set up the Traffic Manager profile. Keep the page open and so you can use it for monitoring the endpoint status change in a failover event later.\n\n## Test failover from primary to secondary\n\nThe steps in this section test failover by manually failing over your Azure SQL Database server and cluster from primary to secondary and then back again using the Azure portal.\n\n### Failover to the secondary site\n\n[!INCLUDE [ha-dr-for-jboss-fail-over-to-secondary-site.md](includes/ha-dr-for-jboss-fail-over-to-secondary-site.md)]\n\n### Commit the failover\n\n[!INCLUDE [ha-dr-for-jboss-steps-commit-failover.md](includes/ha-dr-for-jboss-steps-commit-failover.md)]\n\n### Disable the replication\n\n[!INCLUDE [ha-dr-for-jboss-steps-disable-replication.md](includes/ha-dr-for-jboss-steps-disable-replication.md)]\n\n### Reprotect the failover site\n\nNow the secondary region is the failover site and active, you should reprotect it in your primary region.\n\nFirst, clean up resources in the resource group named `jboss-eap-cluster-eastus-gzh032124` that aren't used anymore.\n\n[!INCLUDE [ha-dr-for-jboss-cleanup-unused-resource.md](includes/ha-dr-for-jboss-steps-cleanup-unused-resource.md)]\n\nNext, use the same steps in the [Set up disaster recovery for the cluster using Azure Site Recovery](#set-up-disaster-recovery-for-the-cluster-using-azure-site-recovery) in the primary region, except for the following differences:\n\n1. For **Create a Recovery Services vault**, use the following steps:\n\n   1. Select the resource group deployed in the primary region - for example, `jboss-eap-cluster-eastus-gzh032124`.\n   1. Enter a different name for service vault - for example, `recovery-service-vault-eastus-gzh032124`.\n   1. Select **East US** for **Region**.\n\n1. For **Enable replication**, use the following steps:\n\n   1. For **Region** in **Source**, select **West US 2**.\n   1. In **Replication settings**, use the following steps:\n\n      1. For **Target resource group**, select the existing resource group deployed in the primary region - for example, `jboss-eap-cluster-eastus-gzh032124`.\n\n      1. For **Failover virtual network**, select the existing virtual network in the primary region.\n\n1. For **Create a recovery plan**, for **Source**, select **West US 2** and for **Target**, select **East US**.\n\n> [!NOTE]\n> You might notice that Azure Site Recovery supports reprotecting VMs when the target VM exists. For more information, see the [Reprotect the VM](/azure/site-recovery/azure-to-azure-tutorial-failover-failback#reprotect-the-vm) section of [Tutorial: Fail over Azure VMs to a secondary region](/azure/site-recovery/azure-to-azure-tutorial-failover-failback). However, it doesn't work when the only changes between the source disk and the target disk are synchronized for the JBoss EAP cluster, based on the verification result. This tutorial establishes a new replication from the secondary site to the primary site after failover, in which the entire disks are copied from the failed over region to the primary region. For more information, see the section [What happens during reprotection?](/azure/site-recovery/azure-to-azure-how-to-reprotect#what-happens-during-reprotection) in [Reprotect failed over Azure virtual machines to the primary region](/azure/site-recovery/azure-to-azure-how-to-reprotect).\n\n### Fail back to the primary site\n\nUse the same steps in the [Failover to the secondary site](#failover-to-the-secondary-site) section to fail back to the primary site, including the database server and cluster, except for the following differences:\n\n[!INCLUDE [ha-dr-for-jboss-steps-fail-back.md](includes/ha-dr-for-jboss-steps-fail-back.md)]\n\n## Clean up resources\n\nIf you're not going to continue to use the JBoss EAP clusters and other components, use the following steps to delete the resource groups to clean up the resources used in this tutorial:\n\n[!INCLUDE [ha-dr-for-jboss-steps-cleanup-resources.md](includes/ha-dr-for-jboss-steps-cleanup-resources.md)]\n\n## Next steps\n\n[!INCLUDE [ha-dr-for-jboss-next-step-head.md](includes/ha-dr-for-jboss-next-step-head.md)]\n\nContinue to explore the following references for more options to build HA/DR solutions and run JBoss EAP on Azure:\n\n> [!div class=\"nextstepaction\"]\n> [Azure reliability documentation](/azure/reliability)\n> [!div class=\"nextstepaction\"]\n> [Build solutions for high availability](/azure/architecture/high-availability/building-solutions-for-high-availability)\n> [!div class=\"nextstepaction\"]\n> [Automatic failover using Azure Traffic Manager](/azure/networking/disaster-recovery-dns-traffic-manager#automatic-failover-using-azure-traffic-manager)\n> [!div class=\"nextstepaction\"]\n> [Learn more about Red Hat JBoss EAP on Azure](../ee/jboss-on-azure.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-liberty-to-aks-with-ha-dr.md",
    "content": "---\ntitle: \"Tutorial: Migrate WebSphere Liberty/Open Liberty to Azure Kubernetes Service (AKS) with high availability and disaster recovery\"\ndescription: Shows you how to deploy WebSphere Liberty/Open Liberty to Azure Kubernetes Service (AKS) with high availability and disaster recovery.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.topic: tutorial\nms.date: 01/13/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-websphere\n  - devx-track-javaee-liberty\n  - devx-track-javaee-liberty-aks\n  - migration-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Tutorial: Migrate WebSphere Liberty/Open Liberty to Azure Kubernetes Service (AKS) with high availability and disaster recovery\n\nThis tutorial shows you a simple and effective way to implement high availability and disaster recovery (HA/DR) for Java using WebSphere Liberty/Open Liberty on Azure Kubernetes Service (AKS). The solution illustrates how to achieve a low Recovery Time Objective (RTO) and Recovery Point Objective (RPO) using a simple database-driven Jakarta EE application running on WebSphere Liberty/Open Liberty.\n\nHA/DR is a complex topic, with many possible solutions. The best solution depends on your unique requirements. For other ways to implement HA/DR, see the resources at the end of this article.\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> - Use Azure optimized best practices to achieve high availability and disaster recovery.\n> - Set up a Microsoft Azure SQL Database failover group in paired regions.\n> - Set up the primary WebSphere Liberty/Open Liberty cluster on AKS.\n> - Set up disaster recovery for the cluster using Azure Backup.\n> - Set up the secondary AKS cluster.\n> - Set up an Azure Traffic Manager.\n> - Test failover from primary to secondary.\n\nThe following diagram illustrates the architecture you build:\n\n<!-- Diagram source https://github.com/Azure-Samples/azure-cafe/blob/main/diagrams/liberty-on-aks-ha-dr-solution-architecture.pptx -->\n\n:::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/solution-architecture.png\" alt-text=\"Diagram of the solution architecture of WebSphere Liberty/Open Liberty on AKS with high availability and disaster recovery.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/solution-architecture.png\" border=\"false\":::\n\nAzure Traffic Manager checks the health of your regions and routes the traffic accordingly to the application tier. Both the primary region and the secondary region have a full deployment of the Liberty cluster. However, only the primary region is actively servicing network requests from the users. The secondary region is passive, and is activated to receive traffic only when the primary region experiences a service disruption. Azure Traffic Manager uses the health check feature of the Azure Application Gateway to implement this conditional routing. The primary cluster is running and the secondary cluster is shut down. The geo-failover RTO of the application tier depends on the time for starting virtual machines (VMs) and running the secondary cluster. The RPO depends on the Azure SQL Database because the data is persisted and replicated in the Azure SQL Database failover group.\n\nThe database tier consists of an Azure SQL Database failover group with a primary server and a secondary server. The read/write listener endpoint always points to the primary server and is connected to a WebSphere Liberty/Open Liberty cluster in each region. A geo-failover switches all secondary databases in the group to the primary role. For the geo-failover RPO and RTO of Azure SQL Database, see [Overview of business continuity with Azure SQL Database](/azure/azure-sql/database/business-continuity-high-availability-disaster-recover-hadr-overview?view=azuresql-db&preserve-view=true).\n\nThis tutorial was written with the Azure Backup and Azure SQL Database services because the tutorial relies on the HA features of these services. Other database choices are possible, but you must consider the HA features of whatever database you choose.\n\n## Prerequisites\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n- Make sure you're assigned either the `Owner` role or the `Contributor` and `User Access Administrator` roles in the subscription. You can verify the assignment by following the steps in [List Azure role assignments using the Azure portal](/azure/role-based-access-control/role-assignments-list-portal).\n- Prepare a local machine with Windows, Linux, or macOS installed.\n- [Install the Azure CLI](/cli/azure/install-azure-cli) 2.62.0 or above to run Azure CLI commands.\n  - Sign in with Azure CLI by using the [az login](/cli/azure/reference-index#az-login) command. To finish the authentication process, follow the steps displayed in your terminal. For other sign-in options, see [Sign into Azure with Azure CLI](/cli/azure/authenticate-azure-cli#sign-into-azure-with-azure-cli).\n  - When you're prompted, install the Azure CLI extension on first use. For more information about extensions, see [Use and manage extensions with the Azure CLI](/cli/azure/azure-cli-extensions-overview).\n  - Run [az version](/cli/azure/reference-index?#az-version) to find the version and dependent libraries that are installed. To upgrade to the latest version, run [az upgrade](/cli/azure/reference-index?#az-upgrade).\n- Install and set up [Git](/devops/develop/git/install-and-set-up-git).\n- Install a Java SE implementation, version 17 or later - for example, [the Microsoft build of OpenJDK](/java/openjdk).\n- Install [Maven](https://maven.apache.org/download.cgi), version 3.9.3 or later.\n\n## Set up an Azure SQL Database failover group in paired regions\n\nIn this section, you create an Azure SQL Database failover group in paired regions for use with your WebSphere Liberty/Open Liberty clusters and app. In a later section, you configure WebSphere Liberty/Open Liberty to store its session data to this database. This practice references [Creating a table for session persistence](https://www.ibm.com/docs/en/was-nd/9.0.5?topic=persistence-creating-table-session).\n\nFirst, create the primary Azure SQL Database by following the Azure portal steps in [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal). Follow the steps up to, but not including, the \"Clean up resources\" section. Use the following directions as you go through the article, then return to this article after you create and configure the Azure SQL Database.\n\nWhen you reach the section [Create a single database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal#create-a-single-database), use the following steps:\n\n1. In step 4 for creating new resource group, save aside the **Resource group name** value - for example, `myResourceGroup`.\n1. In step 5 for database name, save aside the **Database name** value - for example, `mySampleDatabase`.\n1. In step 6 for creating the server, use the following steps:\n   1. Fill in a unique server name - for example, `sqlserverprimary-mjg032524`.\n   1. For **Location**, select **(US) East US**.\n   1. For **Authentication method**, select **Use SQL authentication**.\n   1. Save aside the **Server admin login** value - for example, `azureuser`.\n   1. Save aside the **Password** value.\n1. In step 8, for **Workload environment**, select **Development**. Look at the description and consider other options for your workload.\n1. In step 11, for **Backup storage redundancy**, select **Locally-redundant backup storage**. Consider other options for your backups. For more information, see the [Backup storage redundancy](/azure/azure-sql/database/automated-backups-overview?view=azuresql-db&preserve-view=true#backup-storage-redundancy) section of [Automated backups in Azure SQL Database](/azure/azure-sql/database/automated-backups-overview?view=azuresql-db&preserve-view=true).\n1. In step 14, in the **Firewall rules** configuration, for **Allow Azure services and resources to access this server**, select **Yes**.\n\nThen, create an Azure SQL Database failover group by following the Azure portal steps in [Configure a failover group for Azure SQL Database](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db). You just need the following sections: [Create failover group](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#create-failover-group) and [Test planned failover](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#test-planned-failover). Use the following steps as you go through the article, then return to this article after you create and configure the Azure SQL Database failover group:\n\n1. When you reach the section [Create failover group](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#create-failover-group), use the following steps:\n   1. In step 5 for creating the failover group, enter and save aside the unique failover group name - for example, `failovergroup-mjg032524`.\n   1. In step 5 for configuring the server, select the option to create a new secondary server and then use the following steps:\n      1. Enter a unique server name - for example, `sqlserversecondary-mjg032524`.\n      1. Enter the same server admin and password as your primary server.\n      1. For **Location**, select **(US) West US**.\n      1. Make sure **Allow Azure services to access server** is selected.\n   1. In step 5 for configuring the **Databases within the group**, select the database you created in the primary server - for example, `mySampleDatabase`.\n\n1. After you complete all the steps in the section [Test planned failover](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#test-planned-failover), keep the failover group page open and use it for the failover test of the WebSphere Liberty/Open Liberty clusters later.\n\n> [!NOTE]\n> This article guides you to create an Azure SQL Database single database with SQL authentication for simplicity because the HA/DR setup this article focuses on is already very complex. A more secure practice is to use [Microsoft Entra authentication for Azure SQL](/azure/azure-sql/database/authentication-aad-overview?preserve-view=true&view=azuresql-db) for authenticating the database server connection. For information on how to configure the database connection with Microsoft Entra authentication, see [Deploy a Java application with Open Liberty or WebSphere Liberty on an Azure Kubernetes Service (AKS) cluster](/azure/aks/howto-deploy-java-liberty-app?tabs=in-bash).\n\n## Set up the primary WebSphere Liberty/Open Liberty cluster on AKS\n\nIn this section, you create the primary WebSphere Liberty/Open Liberty cluster on AKS using the [IBM WebSphere Liberty and Open Liberty on Azure Kubernetes Service](https://aka.ms/liberty-aks) offer. The secondary cluster is restored from the primary cluster during the failover using Azure Backup later.\n\n### Deploy the primary WebSphere Liberty/Open Liberty cluster\n\nUse the following steps to deploy the primary cluster:\n\n1. Open the [IBM WebSphere Liberty and Open Liberty on Azure Kubernetes Service](https://aka.ms/liberty-aks) offer in your browser and select **Create**. You should see the **Basics** pane of the offer.\n\n1. Use the following steps to fill out the **Basics** pane:\n\n   1. Ensure that the value shown for **Subscription** is the same one that has the roles listed in the prerequisites section.\n   1. You must deploy the offer in an empty resource group. In the **Resource group** field, select **Create new** and fill in a unique value for the resource group - for example, `liberty-aks-eastus-mjg032524`.\n   1. Under **Instance details**, for **Region**, select **East US**.\n   1. Select **Next** to go to the **AKS** pane.\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/portal-basics.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WebSphere Liberty and Open Liberty on Azure Kubernetes Service Basics pane.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/portal-basics.png\":::\n\n1. Wait for a while. You should see all fields prepopulated with the defaults in the **AKS** pane. Select **Next** to go to the **Load balancing** pane.\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/portal-aks.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WebSphere Liberty and Open Liberty on Azure Kubernetes Service AKS pane.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/portal-aks.png\":::\n\n1. Use the following steps to fill out the **Load balancing** pane:\n\n   1. For **Connect to Azure Application Gateway?**, select **Yes**.\n   1. Leave the defaults for other fields.\n   1. Select **Next** to go to the **Operator and application** pane.\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/portal-load-balancing.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WebSphere Liberty and Open Liberty on Azure Kubernetes Service Load balancing pane.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/portal-load-balancing.png\":::\n\n1. Use the following steps to fill out the **Operator and application** pane:\n\n   1. Leave the defaults for all fields.\n\n      > [!NOTE]\n      > This tutorial deploys Open Liberty Operator using the defaults. Optionally you can deploy WebSphere Liberty Operator by selecting **Yes** for **IBM supported?**.\n\n   1. Select **Review + create**.\n   1. Wait until **Running final validation...** successfully completes, then select **Create**.\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/portal-operator-and-application.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WebSphere Liberty and Open Liberty on Azure Kubernetes Service Operator and application pane.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/portal-operator-and-application.png\":::\n\nAfter a while, you should see the **Deployment** page where **Deployment is in progress** is displayed.\n\n> [!NOTE]\n> If you see any problems during **Running final validation...**, fix them and try again.\n\nDepending on network conditions and other activity in your selected region, the deployment can take up to about 30 minutes to complete. After that, you should see the text **Your deployment is complete** displayed on the deployment page.\n\n### Verify the deployment of the cluster\n\nYou deployed an AKS cluster, an Azure Container Registry (ACR) instance, and an Azure Application Gateway in the primary region. The AKS cluster is the target computing platform where your app is deployed and running. The ACR instance stores the application image that AKS pulls during the app deployment. The Azure Application Gateway acts as load balancer for the application deployed to the AKS cluster.\n\nUse the following steps to verify these key components before you move to the next step:\n\n1. Return to the **Deployment** page, then select **Outputs**.\n1. Copy the value of the property **cmdToConnectToCluster**. Open a terminal, paste the copied command, and press <kbd>Enter</kbd> to execute. You should see a message similar to the following example included in the output:\n\n   ```output\n   Merged \"cluster3984d1-admin\" as current context in <your-user>\\.kube\\config\n   ```\n\n1. Save aside the command so you can use it to connect to the cluster later.\n\n1. Run `kubectl get pod --all-namespaces` in the terminal to list all pods running on the AKS cluster. You should see output similar to the following example:\n\n   ```output\n   NAMESPACE      NAME                                        READY   STATUS    RESTARTS      AGE\n   cert-manager   cert-manager-66bc9756fd-255pk               1/1     Running   0             8m55s\n   cert-manager   cert-manager-cainjector-669c9fb694-k4q88    1/1     Running   0             8m55s\n   cert-manager   cert-manager-webhook-84967d556d-vj4lp       1/1     Running   0             8m55s\n   kube-system    azure-ip-masq-agent-dgzkt                   1/1     Running   0             29m\n   kube-system    cloud-node-manager-6x7bp                    1/1     Running   0             29m\n   kube-system    coredns-789789675-6b7dh                     1/1     Running   0             28m\n   kube-system    coredns-789789675-n68wt                     1/1     Running   0             29m\n   kube-system    coredns-autoscaler-649b947bbd-zhdbn         1/1     Running   0             29m\n   kube-system    csi-azuredisk-node-h9p7m                    3/3     Running   0             29m\n   kube-system    csi-azurefile-node-jnllw                    3/3     Running   0             29m\n   kube-system    ingress-appgw-deployment-69944d8fb9-v9btr   1/1     Running   5 (12m ago)   17m\n   kube-system    konnectivity-agent-94878f88c-hfqng          1/1     Running   0             29m\n   kube-system    konnectivity-agent-94878f88c-ln2vp          1/1     Running   0             29m\n   kube-system    kube-proxy-28lkg                            1/1     Running   0             29m\n   kube-system    metrics-server-5fffcb8954-549xl             2/2     Running   0             28m\n   kube-system    metrics-server-5fffcb8954-fn56g             2/2     Running   0             28m\n   open-liberty   olo-controller-manager-7954d76cf8-qhmxw     1/1     Running   0             8m40s\n   ```\n\n1. Run `kubectl get secret` in the terminal to list all secrets installed on the AKS cluster. You should see one secret in the output, as shown in the following example:\n\n   ```output\n   NAME           TYPE                DATA   AGE\n   secret3984d1   kubernetes.io/tls   2      24m\n   ```\n\n   This secret is a TLS secret that includes certificate and key data for TLS traffic. Copy and save aside the name of the secret - for example, `secret3984d1`, you use it in the app deployment later.\n\n1. Switch back to **Outputs** page. Copy the value of the property **cmdToLoginInRegistry**. Paste the copied command in the terminal and press <kbd>Enter</kbd> to execute. You should see **Login Succeeded** in the output. Keep the terminal open and use it for further configuration of the WebSphere Liberty/Open Liberty cluster later.\n\nUse the following steps to get the name and DNS name of the public IP address of the Azure Application Gateway. You use them for app deployment and the Azure Traffic Manager setup later.\n\n1. In the Azure portal, in the search box, enter **Resource groups** and select **Resource groups** from the search results.\n1. Select the name of resource group for your primary region - for example, **liberty-aks-eastus-mjg032524**.\n1. Find the **Public IP address** resource prefixed with **gwip**, then copy and save aside its name.\n1. Select the **Public IP address** resource, then copy and save aside the **DNS name** value - for example, **olgw3984d1.eastus.cloudapp.azure.com**.\n\n### Enable geo-replications for the ACR instance\n\nThe ACR instance is designed to store application images for both primary and secondary clusters. Use the following steps to enable geo-replications for the ACR instance:\n\n1. In the Azure portal, in the search box, enter **Resource groups** and select **Resource groups** from the search results.\n1. Select the name of resource group for your primary region - for example, **liberty-aks-eastus-mjg032524**.\n1. Find the **Container registry** resource prefixed with **acr**, then select it to open it.\n1. Select **Properties**. For **Pricing plan**, select **Premium**, then select **Save**. Wait until completion.\n1. Select **Geo-replications**, then select **Add**. For **Location**, select **West US**, then select **Create**. Wait until completion.\n1. Wait for a while, select **Refresh**. Repeat the operation until you see two locations are listed and **Status** is **Ready**.\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/acr-geo-replications-enabled-in-paired-regions.png\" alt-text=\"Screenshot of the Azure portal that shows the ACR instance enabled with geo-replications in pair regions.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/acr-geo-replications-enabled-in-paired-regions.png\" border=\"false\":::\n\nUse the following steps to get the ACR sign-in credentials. You use them for app deployment later.\n\n1. Select **Access keys**.\n1. Copy and save aside the values for **Registry name** and **Login server**.\n\n   > [!NOTE]\n   > This article uses the [`az acr build`](/cli/azure/acr#az-acr-build) command to build and push the Docker image to the Container Registry, without using `username` and `password` of the Container Registry. It's still possible to use username and password with `docker login` and `docker push`. Using username and password is less secure than passwordless authentication.\n\n### Deploy a sample app\n\nUse the following steps to deploy and run a sample CRUD Java/Jakarta EE application on WebSphere Liberty/Open Liberty cluster for disaster recovery failover test later:\n\n1. Download the sample by using the following commands:\n\n   ```bash\n   git clone https://github.com/Azure-Samples/open-liberty-on-aks.git\n   cd open-liberty-on-aks\n   export BASE_DIR=$PWD\n   git checkout 20240325\n   ```\n\n   The application configures a data source [jdbc/JavaEECafeDB](https://github.com/Azure-Samples/open-liberty-on-aks/blob/20240325/java-app/src/main/liberty/config/server.xml#L31-L39) that connects to the Azure SQL Database you deployed previously. The data source is used for [storing HTTP session data](https://github.com/Azure-Samples/open-liberty-on-aks/blob/20240325/java-app/src/main/liberty/config/server.xml#L28-L29), which enables failover and load balancing across a cluster of WebSphere Liberty/Open Liberty servers. The sample app also configures a [persistence schema](https://github.com/Azure-Samples/open-liberty-on-aks/blob/20240325/java-app/src/main/resources/META-INF/persistence.xml#L6-L18) to persist application data `coffee` in the same datasource. Notice that the context root of the sample is configured as `/` in the [server.xml](https://github.com/Azure-Samples/open-liberty-on-aks/blob/20240325/java-app/src/main/liberty/config/server.xml#L24-L26) file.\n\n1. Use the following commands to define environment variables with the values that you saved aside previously:\n\n   ```bash\n   export DB_SERVER_NAME=<failover-group-name>.database.windows.net\n   export DB_NAME=mySampleDatabase\n   export DB_USER=azureuser@<failover-group-name>\n   export DB_PASSWORD='<SQL-Server-admin-login-password>'\n   export REGISTRY_NAME=<ACR-registry-name>\n   export LOGIN_SERVER=<ACR-login-server>\n   export INGRESS_TLS_SECRET=<TLS-secret-name>\n   ```\n\n1. Use the [`az acr build`](/cli/azure/acr#az-acr-build) command to build and push the Docker image to the Container Registry, as shown in the following example:\n\n   ```azurecli\n   cd $BASE_DIR/java-app\n   mvn clean install\n\n   cd $BASE_DIR/java-app/target\n   # If you deployed WebSphere Liberty Operator previously, use \"Dockerfile-wlp\" instead of \"Dockerfile\"\n   az acr build \\\n       --registry ${REGISTRY_NAME} \\\n       --image javaee-cafe:v1 \\\n       --file Dockerfile \\\n       .\n   ```\n\n1. Use the following commands to deploy the sample app to the AKS cluster:\n\n   ```bash\n   cd $BASE_DIR/java-app/target\n   kubectl apply -f db-secret.yaml\n\n   # If you deployed WebSphere Liberty Operator previously, use \"webspherelibertyapplication-agic.yaml\" instead of \"openlibertyapplication-agic.yaml\"\n   kubectl apply -f openlibertyapplication-agic.yaml\n   ```\n\n1. Run the following command to get the sample app you deployed:\n\n   ```bash\n   # If you deployed WebSphere Liberty Operator previously, use \"WebSphereLibertyApplication\" instead of \"OpenLibertyApplication\"\n   kubectl get OpenLibertyApplication\n   ```\n\n   You should see one **READY** application in the output:\n\n   ```output\n   NAME                       IMAGE                                 EXPOSED   RECONCILED   RESOURCESREADY   READY   AGE\n   javaee-cafe-cluster-agic   acr3984d1.azurecr.io/javaee-cafe:v1             True         True             True    45s\n   ```\n\n1. Run the following command to get status of the pods created during the deployment:\n\n   ```bash\n   kubectl get pods\n   ```\n\n   The following example indicates that all the pods are running. If you don't see similar output, wait for a while and repeat the operation.\n\n   ```output\n   NAME                                        READY   STATUS    RESTARTS   AGE\n   javaee-cafe-cluster-agic-6bbb8d6f5c-2xjc4   1/1     Running   0          1m\n   javaee-cafe-cluster-agic-6bbb8d6f5c-4f449   1/1     Running   0          1m\n   javaee-cafe-cluster-agic-6bbb8d6f5c-m2wg6   1/1     Running   0          1m\n   ```\n\n1. Use the following steps to verify that the app is running as expected:\n\n   1. In a new browser tab, open the DNS name of the public IP address of the Azure Application Gateway that you saved aside previously. Use the `https` protocol - for example, `https://olgw3984d1.eastus.cloudapp.azure.com`. You should see the welcome page of sample app.\n   1. Create a new coffee with name and price - for example, **Coffee 1** with price **10** - which is persisted into both the application data table and the session table of the database. The UI that you see should be similar to the following screenshot:\n\n      :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/sample-app-ui.png\" alt-text=\"Screenshot of the sample application UI.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/sample-app-ui.png\":::\n\n   If your UI doesn't look similar, troubleshoot and resolve the problem before you continue.\n\n## Set up disaster recovery for the cluster using Azure Backup\n\nIn this section, you set up disaster recovery for the AKS cluster in the primary region using Azure Backup.\n\n### Create a storage account\n\nAKS backup uses a blob container to hold the AKS cluster resources. You create another blob container as a staging location for use during cross region restoring.\n\nUse the following steps to create a storage account and two containers. Some of these steps direct you to other guides.\n\n1. Sign in to the [Azure portal](https://aka.ms/publicportal).\n1. Create a storage account by following the steps in [Create a storage account](/azure/storage/common/storage-account-create). You don't need to do all the steps in the article. Fill out the fields as shown on the **Basics** pane, using the following steps:\n   1. For **Resource group**, select the existing resource group where the primary cluster is deployed - for example, `liberty-aks-eastus-mjg032524`.\n   1. For **Storage account name**, enter a unique name - for example, `storageeastusmjg032524`.\n   1. For **Region**, select **East US**.\n   1. Select **Review + create** to accept the default options.\n   1. Proceed to validate and create the account, then return to this article.\n1. Create a storage container for the AKS Backup Extension by following the steps in [Create a storage container](/azure/storage/blobs/storage-quickstart-blobs-portal#create-a-container). This guide uses `aks-backup-ext` as the container name.\n1. Create another storage container as a staging location for use during restoring. This guide uses `staging` as the container name.\n\n### Enable the AKS Backup Extension\n\nBefore you continue, use the following steps to install the AKS Backup Extension to the cluster in primary region:\n\n1. Enable the CSI drivers and snapshots for your cluster. For the following `az aks update` command, update the value of Bash variable `RG_NAME` to your resource group name - for example, `liberty-aks-eastus-mjg032524` - and run in your local Bash terminal.\n\n   ```azurecli\n   export RG_NAME=<your-aks-cluster-resource-group>\n   export AKS_NAME=$(az aks list \\\n       --resource-group ${RG_NAME} \\\n       --query \"[0].name\" \\\n       --output tsv | tr -d '\\r')\n\n   az aks update \\\n       --resource-group ${RG_NAME} \\\n       --name ${AKS_NAME} \\\n       --enable-disk-driver \\\n       --enable-file-driver \\\n       --enable-blob-driver \\\n       --enable-snapshot-controller --yes\n   ```\n\n   It takes about 5 minutes to enable the drivers. Make sure the commands complete without error before you continue.\n\n1. Open the resource group that has AKS deployed - for example, `liberty-aks-eastus-mjg032524`. Select the AKS cluster from resources list.\n1. Under **Settings** of the AKS landing page, select **Back up**, then select **Install Extension**.\n1. In the **Install AKS Backup extension** page, select **Next**. Select the storage account `storageeastusmjg032524` and the blob container `aks-backup-ext` created in the same resource group. Select **Next**, then select **Create**. It takes about five minutes to complete this step.\n\n### Back up the AKS cluster\n\nUse the following steps to back up the AKS cluster:\n\n1. In the Azure portal, in the search box, search for **Backup vaults**. You see it listed under **Services**. Select it.\n1. Follow the steps in [Back up Azure Kubernetes Service by using Azure Backup](/azure/backup/azure-kubernetes-service-cluster-backup) to enable AKS Backup for the primary cluster. Execute the steps up to, but not including, the [Use hooks during AKS backup](/azure/backup/azure-kubernetes-service-cluster-backup#use-hooks-during-aks-backup) section, and use the rest of the steps in this section to make adjustments as you go.\n\n1. When you reach the [Create a Backup vault](/azure/backup/azure-kubernetes-service-cluster-backup#create-a-backup-vault) section, use the following steps:\n   1. For step 1, for **Resource group**, select the existing resource group where the primary cluster is deployed - for example, `liberty-aks-eastus-mjg032524`. \n   1. For **Backup vault name**, enter a unique value  - for example, `aks-backup-vault-eastus-mjg032524`.\n   1. For **Region**, select **East US**.\n   1. For **Backup Storage Redundancy**, select **Globally-Redundant**.\n\n      :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/backupvault-basics.png\" alt-text=\"Screenshot of the Azure portal that shows the Backup Vault Basic pane.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/backupvault-basics.png\":::\n\n   1. For step 2, for **Cross Region Restore**, select **Enable**.\n\n1. When you reach the [Create a backup policy](/azure/backup/azure-kubernetes-service-cluster-backup#create-a-backup-policy) section, use the following steps:\n   1. For step 3, enter a name for the backup policy - for example, `aksbackuppolicy`.\n   1. Select the Backup vault you created in the same resource group - for example, `aks-backup-vault-eastus-mjg032524`.\n   1. For step 4, add a retention rule where Vault-standard is selected.\n\n      :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/vault-standard-retention-rule.png\" alt-text=\"Screenshot of the Azure portal that shows the Create Backup Policy page with the Add retention pane open and the Vault-standard option highlighted.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/vault-standard-retention-rule.png\":::\n\n   1. Select **Add**.\n\n1. In the [Configure backups](/azure/backup/azure-kubernetes-service-cluster-backup#configure-backups) section, use the following steps:\n   1. Skip step 1-5, which are for AKS Extension installation. Start from step 6 for the AKS cluster in the primary region.\n   1. For step 7, for **Vault**, select the backup vault you created in the same resource group - for example, `aks-backup-vault-eastus-mjg032524`. When you run into permission errors, select **Grant Permissions** to move on. After the permission deployment completes, if the error still shows, select **Revalidate** to refresh the role assignments.\n\n      :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/aks-configure-backup-grant-permission.png\" alt-text=\"Screenshot of the Azure portal that shows the Configure Backup Basics pane with permission errors and with the Grant Permissions link highlighted.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/aks-configure-backup-grant-permission.png\":::\n\n   1. For step 10, find **Select Resources to Backup**. For **Backup Instance name**, fill in a unique name - for example, `akseastusmjg032524`. For **Other options**, select all the options. Make sure **Include Secrets** is selected.\n\n      :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/aks-configure-backup-select-resources.png\" alt-text=\"Screenshot of the Azure portal that shows the Select Resources to Backup pane with the Include Secrets option highlighted.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/aks-configure-backup-select-resources.png\":::\n\n   1. For step 11, you run into Role assignment error. Follow step 12-14 to mitigate the error.\n\n      :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/aks-configure-backup-validation.png\" alt-text=\"Screenshot of the Azure portal that shows the Configure Backup pane with the Grant missing permissions dialog box open.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/aks-configure-backup-validation.png\":::\n\n   1. After you select **Configure backup** in step 15, you return to the **Backup** page. Wait for a while and then select **Refresh**. Repeat the operation until you see that the backup instance is listed and its **Protection status** is **Protection configured**.\n\n      :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/aks-backup-instance-protection-configured.png\" alt-text=\"Screenshot of the Azure portal that shows the AKS backup instance protection is configured.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/aks-backup-instance-protection-configured.png\":::\n\n### Wait for a Vault-standard backup to happen\n\nIn AKS, the Vault-standard Tier is the only tier that supports *Geo-redundancy* and *Cross Region Restore*. As stated in [Which backup storage tier does AKS backup support?](/azure/backup/azure-kubernetes-service-backup-overview#which-backup-storage-tier-does-aks-backup-support), \"Only one scheduled recovery point per day is moved to Vault Tier.\" You must wait for a Vault-standard backup to happen. A good lower bound is to wait at most 24 hours after completing the previous step before you restore.\n\nUse the following steps to verify that a Vault-standard backup is available:\n\n1. In **Backup** page of the primary AKS cluster, select the backup instance.\n1. Wait for a while and select **Refresh**. Repeat the operation until you see that at least one **Operational and Vault-standard** restore point is listed in the **RESTORE POINTS** section.\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/backup-instance-operational-and-vault-standard-restorepoint.png\" alt-text=\"Screenshot of the Azure portal that shows the Restore points section with the Operational and Vault-standard restore point highlighted.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/backup-instance-operational-and-vault-standard-restorepoint.png\":::\n\n## Set up the secondary AKS cluster\n\nWhile waiting for a Vault-standard backup for the primary AKS cluster to happen, set up your secondary AKS cluster for restoring later.\n\nUse the same steps in the section [Deploy the primary WebSphere Liberty/Open Liberty cluster](#deploy-the-primary-websphere-libertyopen-liberty-cluster) to set up the secondary AKS cluster in the secondary region, except for the following differences:\n\n1. In the **Basics** pane, use the following steps:\n   1. In the **Resource group** field, select **Create new** and fill in a different unique value for the resource group - for example, `liberty-aks-westus-mjg032524`.\n   1. Under **Instance details**, for **Region**, select **West US**.\n\n1. In the **AKS** pane, use the following steps:\n   1. Under **Azure Container Registry (ACR)**, for **Select ACR instance**, select **No**.\n   1. Select the existing ACR instance in the primary region that enabled with geo-replications.\n\n      :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/portal-aks-select-existing-acr-in-primary-region.png\" alt-text=\"Screenshot of the Azure portal Create IBM WebSphere Liberty and Open Liberty on Azure Kubernetes Service page with the ACR instance highlighted.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/portal-aks-select-existing-acr-in-primary-region.png\":::\n\nUse the same steps in the section [Verify the deployment of the cluster](#verify-the-deployment-of-the-cluster) to verify the deployment in the secondary region, except for the following differences:\n\n1. You don't need to copy and save aside the name of the TLS secret. The TLS secret is restored from the backup of the primary AKS cluster.\n1. Use the resource group of the secondary cluster - for example, `liberty-aks-westus-mjg032524` - when you look up the the name and DNS name of the public IP address of the Azure Application Gateway deployed in the secondary region.\n\nUse the same steps in the section [Create a storage account](#create-a-storage-account) to create a storage account in secondary region, except for the following differences:\n\n1. For **Resource group** field, select the existing resource group where the secondary cluster is deployed - for example, `liberty-aks-westus-mjg032524`.\n1. For **Storage account name**, enter a unique name - for example, `storagewestusmjg032524`.\n1. For **Region**, select **West US**.\n\nUse the same steps in the section [Enable the AKS Backup Extension](#enable-the-aks-backup-extension) to install the AKS Backup Extension for the cluster in the secondary region, except for the following differences:\n\n1. In step 1 for enabling the CSI drivers and snapshots for your secondary cluster, update the value of Bash variable `RG_NAME` to the resource group in the secondary region - for example, `liberty-aks-westus-mjg032524`.\n1. In step 2, select the AKS cluster from the resource group in the secondary region - for example, `liberty-aks-westus-mjg032524`.\n1. In step 4 for installing the AKS Backup Extension for your secondary cluster, select the storage account you created in the same resource group of the secondary region - for example, `storagewestusmjg032524`.\n\nTo save costs, stop the AKS cluster in the secondary region by following the steps in [Stop and start an Azure Kubernetes Service (AKS) cluster](/azure/aks/start-stop-cluster). You need to start it before you restore the cluster later.\n\n## Set up an Azure Traffic Manager\n\nVault-standard backup was mentioned in section [Wait for a Vault-standard backup to happen](#wait-for-a-vault-standard-backup-to-happen). After you see that a Vault-standard backup is available, you can create an Azure Traffic Manager for distributing traffic to your public facing applications across the global Azure regions. The primary endpoint points to the public IP address of the Azure Application Gateway in the primary region. The secondary endpoint points to the public IP address of the Azure Application Gateway in the secondary region.\n\nCreate an Azure Traffic Manager profile by following the steps in [Quickstart: Create a Traffic Manager profile using the Azure portal](/azure/traffic-manager/quickstart-create-traffic-manager-profile). You just need the following sections: [Create a Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#create-a-traffic-manager-profile) and [Add Traffic Manager endpoints](/azure/traffic-manager/quickstart-create-traffic-manager-profile#add-traffic-manager-endpoints). Use the following steps as you go through these sections, then return to this article after you create and configure the Azure Traffic Manager:\n\n1. When you reach the section [Create a Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#create-a-traffic-manager-profile), in step 2, for **Create Traffic Manager profile**, use the following steps:\n   1. For **Name**, enter a unique Traffic Manager profile name - for example, `tmprofile-mjg032524`.\n   1. For **Routing method**, select **Priority**.\n   1. For **Resource group**, enter and save aside the new resource group name - for example, `myResourceGroupTM1`.\n\n1. When you reach the section [Add Traffic Manager endpoints](/azure/traffic-manager/quickstart-create-traffic-manager-profile#add-traffic-manager-endpoints), use the following steps:\n   1. After you open the Traffic Manager profile in step 2, in the **Configuration** page, use the following steps:\n      1. For **DNS time to live (TTL)**, enter **10**.\n      1. Under **Endpoint monitor settings**, for **Protocol**, select **https**, and for **Port**, enter **443**.\n      1. Under **Fast endpoint failover settings**, use the following values:\n         - For **Probing internal**, select **10**.\n         - For **Tolerated number of failures**, enter **3**.\n         - For **Probe timeout**, enter **5**.\n      1. Select **Save**. Wait until it completes.\n   1. In step 4 for adding the primary endpoint **myPrimaryEndpoint**, use the following steps:\n      1. For **Target resource type**, select **Public IP address**.\n      1. Select the **Choose public IP address** dropdown and enter the name of the public IP address of the Azure Application Gateway in the East US region that you saved aside previously. You should see one entry matched. Select it for **Public IP address**.\n   1. In step 6 for adding a failover/secondary endpoint `myFailoverEndpoint`, use the following steps:\n      1. For **Target resource type**, select **Public IP address**.\n      1. Select the **Choose public IP address** dropdown and enter the name of the public IP address of the Azure Application Gateway in the West US region that you saved aside previously. You should see one entry matched. Select it for **Public IP address**.\n   1. Wait for a while. Select **Refresh** until the **Monitor status** for endpoint `myPrimaryEndpoint` is **Online** and **Monitor status** for endpoint `myFailoverEndpoint` is **Degraded**.\n\nNext, use the following steps to verify that the sample app deployed to the primary cluster is accessible from the Traffic Manager profile:\n\n1. Select **Overview** of the Traffic Manager profile you created.\n1. Check and copy down the DNS name of the Traffic Manager profile, replacing the protocol `http` with `https`. For example, `https://tmprofile-mjg032524.trafficmanager.net`.\n1. Open the URL in a new browser tab. You should see that the coffee you created previously is listed in the page.\n1. Create another coffee with a different name and price - for example, **Coffee 2** with price **20** - which is persisted into both the application data table and the session table of the database. The UI that you see should be similar to the following screenshot:\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/sample-app-ui-2nd-coffee.png\" alt-text=\"Screenshot of the sample application UI with the second coffee.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/sample-app-ui-2nd-coffee.png\":::\n\nIf your UI doesn't look similar, troubleshoot and resolve the problem before you continue. Keep the console open and use it for the failover test later.\n\nYou've completed the Traffic Manager profile setup. Keep the page open and you use it for monitoring the endpoint status change in a failover event later.\n\n## Test failover from primary to secondary\n\nIn this section, to test failover, you manually failover your Azure SQL Database server and restore the backup of your AKS cluster, and then fail back using the Azure portal.\n\n### Failover to the secondary site\n\nTo simulate an outage of the primary region, stop the primary AKS cluster by following the steps in [Stop and start an Azure Kubernetes Service (AKS) cluster](/azure/aks/start-stop-cluster).\n\nNext, start the secondary AKS cluster so it can be restored from the backup of the primary cluster.\n\n> [!NOTE]\n> If you have WebSphere Liberty/Open Liberty applications running on the restore target cluster, to avoid conflicts, use the following steps to clean up WebSphere Liberty/Open Liberty applications:\n>\n> * Connect to the target cluster by running the command for `cmdToConnectToCluster` that you saved aside previously.\n> * For Open Liberty applications, run the following command:\n>\n>   ```bash\n>   kubectl delete OpenLibertyApplication --all --all-namespaces\n>   ```\n>\n> * For WebSphere Liberty applications, run the following command:\n>\n>   ```bash\n>   kubectl delete WebSphereLibertyApplication --all --all-namespaces\n>   ```\n\nThen, switch to the browser tab of your Traffic Manager profile, and verify that the **Monitor status** for both endpoints `myPrimaryEndpoint` and `myFailoverEndpoint` is **Degraded**.\n\nNow, use the following steps to failover the Azure SQL Database from the primary server to the secondary server:\n\n1. Switch to the browser tab of your Azure SQL Database failover group - for example, `failovergroup-mjg032524`.\n1. Select **Failover**, then select **Yes**.\n1. Wait until it completes.\n\nNext, use the following steps to restore the backup of the primary AKS cluster to the secondary AKS cluster:\n\n1. In the Azure portal, in the search box, enter **Backup center** and select **Backup center** from the search results.\n1. Under **Manage**, select **Backup instances**. Filter on the datasource type **Kubernetes Services**. Find the backup instance you created in the previous section - for example, **\\<aks-cluster-name\\>\\akseastusmjg032524**.\n1. Select the backup instance.\n1. Select **Restore**.\n1. On the **Restore** page, the default pane is **Restore point**. Select **Previous** to change to the **Basics** pane. For **Restore Region**, select **Secondary Region**, then select **Next: Restore point**.\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/backup-instance-restore-basics.png\" alt-text=\"Screenshot of the Azure portal that shows the Restore Basics pane.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/backup-instance-restore-basics.png\":::\n\n1. In the **Restore point** pane, the latest **Operational and Vault-standard** restore point is selected. Keep the defaults and select **Next: Restore parameters**.\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/backup-instance-restore-restorepoint.png\" alt-text=\"Screenshot of the Azure portal that shows the Restore point pane.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/backup-instance-restore-restorepoint.png\":::\n\n1. On the **Restore parameters** pane, use the following steps:\n\n   1. For **Select Target cluster**, select the secondary AKS cluster that you created in the West US region. You run into a permission issue as shown in the following screenshot. Select **Grant Permission** to mitigate the errors.\n   1. For **Backup Staging Location**, select the Storage Account that you created in the West US region. You run into a permission issue as shown in the following screenshot. Select **Assign missing roles** to mitigate the errors.\n\n      :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/backup-instance-restore-restoreparameters.png\" alt-text=\"Screenshot of the Azure portal that shows the Restore parameters pane.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/backup-instance-restore-restoreparameters.png\":::\n\n   1. If the errors still happen after the role assignments finish, select **Revalidate** to refresh the permissions.\n\n   1. When granting missing permissions, if asked to specify a **Scope**, accept the default value.\n\n   1. Select **Validate**. You should see the message, `Validation completed successfully`. Otherwise, troubleshoot and resolve the problem before you continue.\n\n1. Select **Next: Review + restore**. Then select **Restore**. It takes about 10 minutes to restore the cluster.\n\n1. You can monitor the restore process from **Backup center** > **Monitoring + reporting** > **Backup jobs**, as shown in the following screenshot:\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/backup-restore-progress.png\" alt-text=\"Screenshot of the Azure portal that shows a CrossRegionRestore in progress.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/backup-restore-progress.png\":::\n\n1. Wait for a while, then select **Refresh**. Repeat the operation until you see that **Status** becomes **Completed**.\n\nThen, use the following steps to verify that the restore works as expected:\n\n1. Switch to the terminal where you connected to the secondary AKS cluster.\n1. Run the following command to get the sample app restored from the backup:\n\n   ```bash\n   kubectl get OpenLibertyApplication\n   ```\n\n   You should see one **READY** application in the output:\n\n   ```output\n   NAME                       IMAGE                                 EXPOSED   RECONCILED   RESOURCESREADY   READY   AGE\n   javaee-cafe-cluster-agic   acr3984d1.azurecr.io/javaee-cafe:v1             True         True             True    3m\n   ```\n\n1. Run the following command to get status of the pods created during the deployment:\n\n   ```bash\n   kubectl get pods\n   ```\n\n   You should see three **Running** pods in the output:\n\n   ```output\n   NAME                                        READY   STATUS    RESTARTS   AGE\n   javaee-cafe-cluster-agic-7bb57dd945-6ljll   1/1     Running   0          3m\n   javaee-cafe-cluster-agic-7bb57dd945-h2xdf   1/1     Running   0          3m\n   javaee-cafe-cluster-agic-7bb57dd945-k744w   1/1     Running   0          3m\n   ```\n\n1. Switch to the browser tab of your Traffic Manager profile, then refresh the page until you see that **Monitor status** for endpoint `myFailoverEndpoint` is **Online** and **Monitor status** for endpoint `myPrimaryEndpoint` is **Degraded**.\n\n1. Switch to the browser tab with the DNS name of the Traffic Manager profile - for example, `https://tmprofile-mjg032524.trafficmanager.net`. Refresh the page and you should see the same data persisted in the application data table and the session table displayed. The UI that you see should be similar to the following screenshot:\n\n   :::image type=\"content\" source=\"media/migrate-liberty-to-aks-with-ha-dr/sample-app-ui-after-failover.png\" alt-text=\"Screenshot of the sample application UI after failover.\" lightbox=\"media/migrate-liberty-to-aks-with-ha-dr/sample-app-ui-after-failover.png\":::\n\n   If you don't observe this behavior, it might be because the Traffic Manager is taking time to update DNS to point to the failover site. The problem could also be that your browser cached the DNS name resolution result that points to the failed site. Wait for a while and refresh the page again.\n\n   > [!NOTE]\n   > The app configures [session timeout](https://github.com/Azure-Samples/open-liberty-on-aks/blob/20240325/java-app/src/main/webapp/WEB-INF/web.xml#L29-L31) as 1 hour. Depending on how much time it took to failover, you might not see session data displayed in the **New coffee** section of the sample app UI if it expired more than one hour previously.\n\n### Re-protect the failover site\n\nNow that the secondary region is the failover site and is active, you should re-protect it with Azure Backup.\n\nFirst, use the same steps in the section [Back up the AKS cluster](#back-up-the-aks-cluster) to back up the secondary AKS cluster, except for the following differences:\n\n1. For **Create a Backup vault**, use the following steps:\n   1. For **Resource group**, select the existing resource group deployed in the secondary region - for example, `liberty-aks-westus-mjg032524`.\n   1. For **Backup vault name**, enter a unique value  - for example, `aks-backup-vault-westus-mjg032524`.\n   1. For **Region**, select **West US**.\n1. For **Create a backup policy**, use the following steps:\n   1. Select the Backup vault you created in the secondary region - for example, `aks-backup-vault-westus-mjg032524`.\n1. For **Configure backups**, use the following steps:\n   1. Select the Backup vault you created in the secondary region - for example, `aks-backup-vault-westus-mjg032524`.\n   1. For **Backup Instance** name, fill in a unique name - for example, `akswestusmjg032524`.\n\nThen, use the same steps in the section [Wait for a Vault-standard backup to happen](#wait-for-a-vault-standard-backup-to-happen) to wait until a Vault-standard backup of the secondary AKS cluster is available, except select the backup instance from the **Backup** page of the secondary AKS cluster.\n\n### Fail back to the primary site\n\nUse the same steps in the [Failover to the secondary site](#failover-to-the-secondary-site) section to fail back to the primary site including database server and the AKS cluster, except for the following differences:\n\n1. When you prepare for the failback, use the following steps:\n   1. Stop the secondary AKS cluster to simulate an outage of the secondary region.\n   1. Start the primary AKS cluster.\n   1. Connect to the primary AKS cluster and clean up WebSphere Liberty/Open Liberty applications.\n\n1. When you restore the backup of the secondary AKS cluster to the primary AKS cluster, use the following steps:\n   1. Select the backup instance in the secondary region - for example, `<aks-cluster-name>\\akswestusmjg032524`.\n   1. In the **Restore parameters** pane, use the following steps:\n      1. For **Select Target cluster**, select the primary AKS cluster that you created in the East US region.\n      1. For **Backup Staging Location**, select the Storage Account that you created in the East US region.\n\n1. When you verify that the restore works as expected, use the following steps:\n   1. Switch to the terminal where you connected to the primary AKS cluster, and check that the app is restored successfully.\n   1. Switch to the browser tab of your Traffic Manager profile, then refresh the page until you see that **Monitor status** for endpoint `myPrimaryEndpoint` is **Online** and **Monitor status** for endpoint `myFailoverEndpoint` is **Degraded**.\n\n## Clean up resources\n\nIf you're not going to continue to use the WebSphere Liberty/Open Liberty clusters and other components, use the following steps to delete the resource groups to clean up the resources used in this tutorial:\n\n1. In the Azure portal, in the search box, enter the resource group name of Azure SQL Database servers - for example, `myResourceGroup` - and select the matched resource group from the search results.\n1. Select **Delete resource group**.\n1. In **Enter resource group name to confirm deletion**, enter the resource group name.\n1. Select **Delete**.\n1. Repeat steps 1-4 for the resource group of the Traffic Manager - for example, `myResourceGroupTM1`.\n1. In the Azure portal, in the search box, enter **Backup vaults** and select **Backup vaults** from the search results. You should see two Backup vaults listed - for example, **aks-backup-vault-eastus-mjg032524** and **aks-backup-vault-westus-mjg032524**. For each of them, use the following steps:\n   1. Select to open the Backup vault.\n   1. Select **Manage** > **Properties** > **Soft delete** > **Update**. Next to **Enable soft Delete**, unselect the checkbox, and then select **Update**.\n   1. Select **Manage** > **Backup instances**. Filter on the datasource type **Kubernetes Services**. Select the instance you created and then delete it.\n1. Wait until the two Backup instances are deleted.\n1. Repeat steps 1-4 for the resource group of the primary cluster - for example, `liberty-aks-eastus-mjg032524`.\n1. Repeat steps 1-4 for the resource group of the secondary cluster - for example, `liberty-aks-westus-mjg032524`.\n\n## Next steps\n\nIn this tutorial, you set up a WebSphere Liberty/Open Liberty HA/DR solution consisting of an active-passive application infrastructure tier with an active-passive database tier, and in which both tiers span two geographically different sites. At the first site, both the application infrastructure tier and the database tier are active. At the second site, the secondary domain is restored with Azure Backup, and the secondary database is on standby.\n\nContinue to explore the following references for more options to build HA/DR solutions and run WebSphere on Azure:\n\n> [!div class=\"nextstepaction\"]\n> [Azure reliability documentation](/azure/reliability)\n> [!div class=\"nextstepaction\"]\n> [Build solutions for high availability](/azure/architecture/high-availability/building-solutions-for-high-availability)\n> [!div class=\"nextstepaction\"]\n> [Automatic failover using Azure Traffic Manager](/azure/networking/disaster-recovery-dns-traffic-manager#automatic-failover-using-azure-traffic-manager)\n> [!div class=\"nextstepaction\"]\n> [Learn more about WebSphere on Azure](../ee/websphere-family.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-spring-boot-to-app-service.md",
    "content": "---\ntitle: Migrate Spring Boot applications to Azure App Service\ndescription: This guide describes what you should be aware of when you want to migrate an existing Spring Boot to Azure App Service.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-java, migration-java, devx-track-extended-java\n---\n\n# Migrate Spring Boot applications to Azure App Service\n\nThis guide describes what you should be aware of when you want to migrate an existing Spring Boot application to Azure App Service.\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n### Switch to a supported platform\n\nApp Service offers specific versions of Java SE. To ensure compatibility, migrate your application to one of the supported versions of its current environment before you continue with any of the remaining steps. Be sure to fully test the resulting configuration. Use the latest stable release of your Linux distribution in such tests.\n\n[!INCLUDE [note-obtain-your-current-java-version-app-service](includes/note-obtain-your-current-java-version-app-service.md)]\n\n### Inventory external resources\n\nIdentify external resources, such as data sources, JMS message brokers, and URLs of other services. In Spring Boot applications, you can typically find the configuration for such resources in the *src/main/directory* folder, in a file typically called *application.properties* or *application.yml*. Additionally, check the production deployment's environment variables for any pertinent configuration settings.\n\n[!INCLUDE [inventory-databases-spring-boot](includes/inventory-databases-spring-boot.md)]\n\n[!INCLUDE [identify-jms-brokers-in-spring](includes/identify-jms-brokers-in-spring.md)]\n\nAfter you've identified the broker or brokers in use, find the corresponding settings. In Spring Boot applications, you can typically find them in the *application.properties* and *application.yml* files in the application directory.\n\n[!INCLUDE [jms-broker-settings-examples-in-spring](includes/jms-broker-settings-examples-in-spring.md)]\n\n[!INCLUDE [identify-external-caches-azure-spring-apps](includes/identify-external-caches-azure-spring-apps.md)]\n\n[!INCLUDE [inventory-identity-providers-spring-boot](includes/inventory-identity-providers-spring-boot.md)]\n\n#### All other external resources\n\nIt isn't feasible to document every possible external dependency in this guide. It's your team's responsibility to verify that every external dependency of your application can be satisfied after an App Service migration.\n\n### Inventory secrets\n\n#### Passwords and secure strings\n\nCheck all properties and configuration files and all environment variables on the production deployment(s) for any secret strings and passwords. In a Spring Boot application, such strings will likely be found in *application.properties* or *application.yml*.\n\n[!INCLUDE [inventory-certificates-h4](includes/inventory-certificates-h4.md)]\n\n[!INCLUDE [determine-whether-and-how-the-file-system-is-used](includes/determine-whether-and-how-the-file-system-is-used.md)]\n\n### Special Cases\n\nCertain production scenarios may require additional changes or impose additional limitations. While such scenarios can be infrequent, it's important to ensure that they're either inapplicable to your application or correctly resolved.\n\n#### Determine whether application relies on scheduled jobs\n\nScheduled jobs, such as Quartz Scheduler tasks or cron jobs, can't be used with App Service. App Service won't prevent you from deploying an application containing scheduled tasks internally. However, if your application is scaled out, the same scheduled job may run more than once per scheduled period. This situation can lead to unintended consequences.\n\nInventory any scheduled jobs, inside or outside the application process.\n\n#### Determine whether your application contains OS-specific code\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code-no-title.md)]\n\n#### Identify all outside processes/daemons running on the production server(s)\n\nProcesses running outside of Application Server, such as monitoring daemons, will need to be migrated elsewhere or eliminated.\n\n#### Identify handling of non-HTTP requests or multiple ports\n\nApp Service supports only a single HTTP endpoint on a single port. If your application listens on multiple ports or accepts requests using protocols other than HTTP, don't use Azure App Service.\n\n## Migration\n\n### Parameterize the configuration\n\nEnsure that all external resource coordinates (such as database connection strings) and other customizable settings can be read from environment variables. If you're migrating a Spring Boot Application, all configuration settings should already be externalizable. For more information, see [Externalized Configuration](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config) in the Spring Boot documentation.\n\nHere's an example that references a `SERVICEBUS_CONNECTION_STRING` environment variable from an *application.properties* file:\n\n```properties\nspring.jms.servicebus.connection-string=${SERVICEBUS_CONNECTION_STRING}\nspring.jms.servicebus.topic-client-id=contoso1\nspring.jms.servicebus.idle-timeout=10000\n```\n\n### Provision an App Service plan\n\nFrom the [list of available service plans](https://azure.microsoft.com/pricing/details/app-service/linux/), select the plan whose specifications meet or exceed those of the current production hardware.\n\n> [!NOTE]\n> If you plan to run staging/canary deployments or use [deployment slots](/azure/app-service/deploy-staging-slots), the App Service plan must include that additional capacity. We recommend using Premium or higher plans for Java applications.\n\n[Create the App Service plan](/azure/app-service/app-service-plan-manage#create-an-app-service-plan).\n\n### Create and Deploy Web App(s)\n\nYou'll need to create a Web App on your App Service Plan (choosing \"Java SE\" as the runtime stack) for every executable JAR file you intend to run.\n\n#### Maven applications\n\nIf your application is built from a Maven POM file, use the Webapp plugin for Maven to create the Web App and deploy your application. For more information, see [Quickstart: Create a Java app on Azure App Service](/azure/app-service/quickstart-java?tabs=javase&pivots=platform-linux).\n\n#### Non-Maven applications\n\nIf you can't use the Maven plugin, you'll need to provision the Web App through other mechanisms, such as:\n\n* [Azure portal](https://portal.azure.com/#create/Microsoft.WebSite)\n* [Azure CLI](/cli/azure/webapp#az-webapp-create)\n* [Azure PowerShell](/powershell/module/az.websites/new-azwebapp)\n\nOnce the Web App has been created, use one of the [available deployment mechanisms](/azure/app-service/deploy-ftp) to deploy your application. If possible, your application should be uploaded to */home/site/wwwroot/app.jar*. If you don't wish to rename your JAR to *app.jar*, you can upload a shell script with the command to run your JAR. Then paste the full path to this script in the [Startup File](/azure/app-service/containers/app-service-linux-faq#built-in-images) textbox in the Configuration section of the portal. The startup script doesn't run from the directory into which it's placed. Therefore, always use absolute paths to reference files in your startup script (for example: `java -jar /home/myapp/myapp.jar`).\n\n### Migrate JVM runtime options\n\nIf your application requires specific runtime options, [use the most appropriate mechanism to specify them](/azure/app-service/containers/configure-language-java#set-java-runtime-options).\n\n[!INCLUDE [configure-custom-domain-and-ssl](includes/configure-custom-domain-and-ssl.md)]\n\n[!INCLUDE [import-backend-certificates](includes/import-backend-certificates.md)]\n\n### Migrate external resource coordinates and other settings\n\nFollow [these steps to migrate connection strings and other settings](/azure/app-service/containers/configure-language-java#spring-boot-1).\n\n> [!NOTE]\n> For any Spring Boot application settings parameterized with variables in the [Parameterize the configuration](#parameterize-the-configuration) section, those environment variables must be defined in the application configuration. Any Spring Boot application settings not explicitly parameterized with environment variables can still be overridden by them via Application Configuration. For example:\n\n  ```properties\n  spring.jms.servicebus.connection-string=${CUSTOMCONNSTR_SERVICE_BUS}\n  spring.jms.servicebus.topic-client-id=contoso1\n  spring.jms.servicebus.idle-timeout=1800000\n  ```\n\n![App Service Application Configuration](media/migrate-spring-boot-to-app-service/app-service-parameterized-spring-boot-app-settings.png)\n\n[!INCLUDE [migrate-scheduled-jobs](includes/migrate-scheduled-jobs.md)]\n\n[!INCLUDE [migrate-identity-provider-app-service.md](includes/migrate-identity-provider-app-service.md)]\n\n### Restart and smoke-test\n\nFinally, you'll need to restart your Web App to apply all configuration changes. Upon completion of the restart, verify that your application is running correctly.\n\n## Post-migration\n\nNow that you have your application migrated to Azure App Service you should verify that it works as you expect. Once you've done that we have some recommendations for you that can make your application more cloud-native.\n\n### Recommendations\n\n* If you opted to use the */home* directory for file storage, consider [replacing it with Azure Storage](/azure/app-service/configure-connect-to-azure-storage).\n\n* If you have configuration in the */home* directory that contains connection strings, SSL keys, and other secret information, consider using [Azure Key Vault](/azure/app-service/app-service-key-vault-references) and/or [parameter injection with application settings](/azure/app-service/configure-common#configure-app-settings) where possible.\n\n* Consider [using Deployment Slots](/azure/app-service/deploy-staging-slots) for reliable deployments with zero downtime.\n\n* Design and implement a DevOps strategy. To maintain reliability while increasing your development velocity, consider [automating deployments and testing with Azure Pipelines](/azure/devops/pipelines/ecosystems/java-webapp). When you use Deployment Slots, you can [automate deployment to a slot](/azure/devops/pipelines/targets/webapp?tabs=yaml#deploy-to-a-slot) followed by the slot swap.\n\n* Design and implement a business continuity and disaster recovery strategy. For mission-critical applications, consider a [multi-region deployment architecture](/azure/architecture/reference-architectures/app-service-web-app/multi-region).\n"
  },
  {
    "path": "articles/java/migration/migrate-spring-boot-to-azure-container-apps.md",
    "content": "---\ntitle: Migrate Spring Boot applications to Azure Container Apps\ndescription: This guide describes what you should be aware of when you want to migrate an existing Spring Boot application to run on Azure Container Apps.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-java, migration-java, devx-track-extended-java\n---\n\n# Migrate Spring Boot applications to Azure Container Apps\n\nThis guide describes what you should be aware of when you want to migrate an existing Spring Boot application to run on Azure Container Apps.\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\nIf you can't meet any of these pre-migration requirements, see the following companion migration guides:\n\n* Migrate executable JAR applications to containers on Azure Kubernetes Service (guidance planned)\n* Migrate executable JAR Applications to Azure Virtual Machines (guidance planned)\n\n### Inspect application components\n\n[!INCLUDE [identify-local-state-azure-container-apps](includes/identify-local-state-azure-container-apps.md)]\n\n[!INCLUDE [static-content-azure-container-apps](includes/determine-whether-and-how-the-file-system-is-used-azure-container-apps.md)]\n\n#### Determine whether any of the services contain OS-specific code\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code-no-title.md)]\n\n[!INCLUDE [switch-to-a-supported-platform-azure-container-apps](includes/switch-to-a-supported-platform-azure-container-apps.md)]\n\n[!INCLUDE [determine-whether-your-application-relies-on-scheduled-jobs-azure-container-apps](includes/determine-whether-your-application-relies-on-scheduled-jobs-azure-container-apps.md)]\n\n[!INCLUDE [identify-spring-boot-versions](includes/identify-spring-boot-versions.md)]\n\nFor any applications using Spring Boot versions prior to 3.x, follow the [Spring Boot 2.0 migration guide](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide) or [Spring Boot 3.0 Migration Guide](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide) to update them to a supported Spring Boot version. For supported versions, see the [Spring Boot and Spring Cloud versions](https://spring.io/projects/spring-cloud#overview).\n\n[!INCLUDE [identify-logs-metrics-apm-azure-container-apps](includes/identify-logs-metrics-apm-azure-container-apps.md)]\n\n### Inventory external resources\n\nIdentify external resources, such as data sources, JMS message brokers, and URLs of other services. In Spring Boot applications, you can typically find the configuration for such resources in the **src/main/resources** folder, in a file typically called **application.properties** or **application.yml**.\n\n[!INCLUDE [inventory-databases-spring-boot](includes/inventory-databases-spring-boot.md)]\n\n[!INCLUDE [identify-jms-brokers-in-spring](includes/identify-jms-brokers-in-spring.md)]\n\nAfter you've identified the broker or brokers in use, find the corresponding settings. In Spring Boot applications, you can typically find them in the **application.properties** and **application.yml** files in the application directory.\n\n[!INCLUDE [jms-broker-settings-examples-in-spring](includes/jms-broker-settings-examples-in-spring.md)]\n\n[!INCLUDE [identify-external-caches-azure-container-apps](includes/identify-external-caches-azure-container-apps.md)]\n\n[!INCLUDE [inventory-identity-providers-spring-boot.md](includes/inventory-identity-providers-spring-boot.md)]\n\n#### Identify any clients relying on a non-standard port\n\nAzure Container Apps allows you to expose port according to your Azure Container Apps resource configuration. For instance, a Spring Boot application listens to port of 8080 by default, but it can be set with `server.port` or environment variable `SERVER_PORT` as you need. \n\n#### All other external resources\n\nIt isn't feasible for this guide to document every possible external dependency. After the migration, it's your responsibility to verify that you can satisfy every external dependency of your application.\n\n[!INCLUDE [inventory-configuration-sources-and-secrets-spring-boot](includes/inventory-configuration-sources-and-secrets-spring-boot.md)]\n\n[!INCLUDE [inspect-the-deployment-architecture-spring-boot](includes/inspect-the-deployment-architecture-spring-boot.md)]\n\n## Migration\n\n[!INCLUDE [migrate-steps-spring-boot-azure-container-apps](includes/migrate-steps-spring-boot-azure-container-apps.md)]\n\n## Post-migration\n\n[!INCLUDE [post-migration-spring-boot-azure-container-apps](includes/post-migration-spring-boot-azure-container-apps.md)]\n"
  },
  {
    "path": "articles/java/migration/migrate-spring-cloud-to-azure-container-apps.md",
    "content": "---\ntitle: Migrate Spring Cloud applications to Azure Container Apps\ndescription: This guide describes what you should be aware of when you want to migrate an existing Spring Cloud application to run on Azure Container Apps.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-java, migration-java, devx-track-extended-java\n---\n\n# Migrate Spring Cloud applications to Azure Container Apps\n\nThis guide describes what you should be aware of when you want to migrate an existing Spring Cloud application to run on Azure Container Apps.\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\nIf you can't meet any of these pre-migration requirements, see the following companion migration guides:\n\n* Migrate executable JAR applications to containers on Azure Kubernetes Service (guidance planned)\n* Migrate executable JAR Applications to Azure Virtual Machines (guidance planned)\n\n### Inspect application components\n\n[!INCLUDE [determine-whether-and-how-the-file-system-is-used-azure-container-apps](includes/determine-whether-and-how-the-file-system-is-used-azure-container-apps.md)]\n\n#### Determine whether any of the services contain OS-specific code\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code-no-title.md)]\n\n[!INCLUDE [switch-to-a-supported-platform-azure-container-apps](includes/switch-to-a-supported-platform-azure-container-apps.md)]\n\n[!INCLUDE [identify-spring-boot-versions](includes/identify-spring-boot-versions.md)]\n\nFor any applications using Spring Boot versions prior to 3.x, follow the [Spring Boot 2.0 migration guide](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide) or [Spring Boot 3.0 Migration Guide](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide) to update them to a supported Spring Boot version. For supported versions, see the [Spring Cloud](https://spring.io/projects/spring-cloud#overview) documentation.\n\n#### Identify Spring Cloud versions\n\nExamine the dependencies of each application you're migrating to determine the version of the Spring Cloud components it uses.\n\n##### Maven\n\nIn Maven projects, the Spring Cloud version is typically set in the `spring-cloud.version` property:\n\n```xml\n  <properties>\n    <spring-cloud.version>2023.0.2</spring-cloud.version>\n  </properties>\n```\n\n##### Gradle\n\nIn Gradle projects, the Spring Cloud version is typically set in the \"extra properties\" block:\n\n```gradle\next {\n  set('springCloudVersion', \"2023.0.2\")\n}\n```\n\nYou need to update all applications to use supported versions of Spring Cloud. For supported versions, see the [Spring Cloud](https://spring.io/projects/spring-cloud#overview) documentation.\n\n[!INCLUDE [identify-logs-metrics-apm-azure-container-apps.md](includes/identify-logs-metrics-apm-azure-container-apps.md)]\n\n### Inventory external resources\n\nIdentify external resources, such as data sources, JMS message brokers, and URLs of other services. In Spring Cloud applications, you can typically find the configuration for such resources in one of the following locations:\n\n* In the **src/main/resources** folder, in a file typically called **application.properties** or **application.yml**.\n* In the Spring Cloud Config Server repository that you identified in the previous step.\n\n[!INCLUDE [inventory-databases-spring-boot](includes/inventory-databases-spring-boot.md)]\n\n[!INCLUDE [identify-jms-brokers-in-spring](includes/identify-jms-brokers-in-spring.md)]\n\nAfter you've identified the broker or brokers in use, find the corresponding settings. In Spring Cloud applications, you can typically find them in the **application.properties** and **application.yml** files in the application directory, or in the Spring Cloud Config Server repository.\n\n[!INCLUDE [jms-broker-settings-examples-in-spring](includes/jms-broker-settings-examples-in-spring.md)]\n\n[!INCLUDE [identify-external-caches-azure-container-apps](includes/identify-external-caches-azure-container-apps.md)]\n\n#### Identity providers\n\nIdentify all identity providers and all Spring Cloud applications that require authentication and/or authorization. For information on how you can configure identity providers, see the following resources:\n\n* For OAuth2 configuration, see the [Spring Cloud Security quickstart](https://spring.io/projects/spring-cloud-security).\n* For Auth0 Spring Security configuration, see the [Auth0 Spring Security documentation](https://auth0.com/docs/quickstart/backend/java-spring-security5).\n* For PingFederate Spring Security configuration, see the [Auth0 PingFederate instructions](https://auth0.com/authenticate/java-spring-security/ping-federate/).\n\n#### Resources configured through VMware Tanzu Application Service (TAS) (formerly Pivotal Cloud Foundry)\n\nFor applications managed with TAS, external resources, including the resources described earlier, are often configured via TAS service bindings. To examine the configuration for such resources, use the [TAS (Cloud Foundry) CLI](https://docs.cloudfoundry.org/cf-cli/) to view the `VCAP_SERVICES` variable for the application.\n\n```bash\n# Log into TAS, if needed (enter credentials when prompted)\ncf login -a <API endpoint>\n\n# Set the organization and space containing the application, if not already selected during login.\ncf target org <organization name>\ncf target space <space name>\n\n# Display variables for the application\ncf env <Application Name>\n```\n\nExamine the `VCAP_SERVICES` variable for configuration settings of external services bound to the application. For more information, see the [TAS (Cloud Foundry) documentation](https://docs.cloudfoundry.org/devguide/deploy-apps/environment-variable.html#VCAP-SERVICES).\n\n#### All other external resources\n\nIt isn't feasible for this guide to document every possible external dependency. After the migration, it's your responsibility to verify that you can satisfy every external dependency of your application.\n\n[!INCLUDE [inventory-configuration-sources-and-secrets-spring-cloud](includes/inventory-configuration-sources-and-secrets-spring-cloud.md)]\n\n[!INCLUDE [inspect-the-deployment-architecture-spring-cloud](includes/inspect-the-deployment-architecture-spring-cloud.md)]\n\n## Migration\n\n### Remove restricted configurations\n\nThe Azure Container Apps environment offers managed Eureka Server, Spring Cloud Config Server, and Admin. When an application is bound to the Java component, Azure Container Apps injects related properties as system environment variables. According to the [Spring Boot Externalized Configuration](https://docs.spring.io/spring-boot/reference/features/external-config.html) design, application properties defined in your code or packaged in artifacts are overwritten by system environment variables.\n\nIf you set one of the following properties via command-line argument, a Java system property, or container's environment variable, you must remove it to avoid conflicts and unexpected behavior:\n\n* `SPRING_CLOUD_CONFIG_COMPONENT_URI`\n* `SPRING_CLOUD_CONFIG_URI`\n* `SPRING_CONFIG_IMPORT`\n* `eureka.client.fetch-registry`\n* `eureka.client.service-url.defaultZone`\n* `eureka.instance.prefer-ip-address`\n* `eureka.client.register-with-eureka`\n* `SPRING_BOOT_ADMIN_CLIENT_INSTANCE_PREFER-IP`\n* `SPRING_BOOT_ADMIN_CLIENT_URL`\n\n### Create an Azure Container Apps managed environment and apps\n\nProvision an Azure Container Apps app in your Azure subscription on an existing managed environment or create a new one for every service you're migrating. You don't need to create apps running as Spring Cloud registry and Configuration servers. For more information, see [Quickstart: Deploy your first container app using the Azure portal](/azure/container-apps/quickstart-portal).\n\n### Prepare the Spring Cloud Config Server\n\nConfigure the Config server in your Azure Container Apps for Spring component. For more information, see [Configure settings for the Config Server for Spring component in Azure Container Apps](/azure/container-apps/java-config-server-usage).\n\n> [!NOTE]\n> If your current Spring Cloud Config repository is on the local file system or on premises, you first need to migrate or replicate your configuration files to a cloud-based repository, such as GitHub, Azure Repos, or BitBucket.\n\n[!INCLUDE [ensure-console-logging-and-configure-diagnostic-settings-azure-container-apps](includes/ensure-console-logging-and-configure-diagnostic-settings-azure-container-apps.md)]\n\n[!INCLUDE [configure-persistent-storage-azure-container-apps](includes/configure-persistent-storage-azure-container-apps.md)]\n\n### Migrate Spring Cloud Vault secrets to Azure KeyVault\n\nYou can inject secrets directly into applications through Spring by using the Azure KeyVault Spring Boot Starter. For more information, see [How to use the Spring Boot Starter for Azure Key Vault](../spring-framework/configure-spring-boot-starter-java-app-with-azure-key-vault.md).\n\n> [!NOTE]\n> Migration might require you to rename some secrets. Update your application code accordingly.\n\n[!INCLUDE [migrate-all-certificates-to-keyvault-azure-container-apps](includes/migrate-all-certificates-to-keyvault-azure-container-apps.md)]\n\n### Configure application performance management (APM) integrations\n\nIf you've already configured APM-related variables within the container, all you need to do is ensure that the connection to the target APM platform can be established. If the APM configuration references environment variables from the container, you need to set the runtime environment variables accordingly on Azure Container Apps. Sensitive information, such as the connection string, should be handled securely. You can either specify it as a secret or reference a secret stored in Azure Key Vault.\n\n### Configure per-service secrets and externalized settings\n\nYou can inject configuration settings into each container as environment variables. Any changes in the variables create a new revision for the existing app. Secrets are key-value pairs and remain valid across all revisions.\n\n### Migrate and enable the identity provider\n\nIf any of the Spring Cloud applications require authentication or authorization, use the following guidelines to ensure that they're configured to access the identity provider:\n\n* If the identity provider is Microsoft Entra ID, no changes should be necessary.\n* If the identity provider is an on-premises Active Directory forest, consider implementing a hybrid identity solution with Microsoft Entra ID. For guidance, see the [Hybrid identity documentation](/azure/active-directory/hybrid/).\n* If the identity provider is another on-premises solution, such as PingFederate, consult the [Custom installation of Microsoft Entra Connect](/azure/active-directory/hybrid/how-to-connect-install-custom) topic to configure federation with Microsoft Entra ID. Alternatively, consider using Spring Security to use your identity provider through [OAuth2/OpenID Connect](https://docs.spring.io/spring-security/reference/index.html) or [SAML](https://docs.spring.io/spring-security/reference/index.html).\n\n### Update client applications\n\nUpdate the configuration of all client applications to use the published Azure Container Apps endpoints for migrated applications.\n\n## Post-migration\n\n[!INCLUDE [post-migration-spring-boot-azure-container-apps](includes/post-migration-spring-boot-azure-container-apps.md)]\n\n* If your applications use legacy Spring Cloud Netflix components, consider replacing them with current alternatives, as shown in the following table:\n\n  | Legacy                        | Current                                                |\n  |-------------------------------|--------------------------------------------------------|\n  | Spring Cloud Eureka           | Spring Cloud Service Registry                          |\n  | Spring Cloud Netflix Zuul     | Spring Cloud Gateway                                   |\n  | Spring Cloud Netflix Archaius | Spring Cloud Config Server                             |\n  | Spring Cloud Netflix Ribbon   | Spring Cloud Load Balancer (client-side load balancer) |\n  | Spring Cloud Hystrix          | Spring Cloud Circuit Breaker + Resilience4J            |\n  | Spring Cloud Netflix Turbine  | Micrometer + Prometheus                                |\n"
  },
  {
    "path": "articles/java/migration/migrate-tomcat-to-azure-container-apps.md",
    "content": "---\ntitle: Migrate Tomcat Applications to Azure Container Apps\ndescription: This guide describes what you should be aware of when you want to migrate an existing Tomcat application to run on Azure Container Apps.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-java, devx-track-azurecli, devx-track-extended-java\n---\n\n# Migrate Tomcat applications to Azure Container Apps\n\nThis guide describes what you should be aware of when you want to migrate an existing Tomcat application to run on Azure Container Apps (ACA).\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n[!INCLUDE [inventory-external-resources](includes/inventory-external-resources.md)]\n\n[!INCLUDE [inventory-secrets](includes/inventory-secrets.md)]\n\n[!INCLUDE [determine-whether-and-how-the-file-system-is-used](includes/determine-whether-and-how-the-file-system-is-used.md)]\n\n### Identify session persistence mechanism\n\nTo identify the session persistence manager in use, inspect the **context.xml** files in your application and Tomcat configuration. Look for the `<Manager>` element, and then note the value of the `className` attribute.\n\nTomcat's built-in [PersistentManager](https://tomcat.apache.org/tomcat-9.0-doc/config/manager.html) implementations, such as [StandardManager](https://tomcat.apache.org/tomcat-9.0-doc/config/manager.html#Standard_Implementation) or [FileStore](https://tomcat.apache.org/tomcat-9.0-doc/config/manager.html#Nested_Components) aren't designed for use with a distributed, scaled platform such as ACA. ACA may load balance among several instances and transparently restart any instance at any time, so persisting mutable state to a file system isn't recommended.\n\nIf session persistence is required, you'll need to use an alternate `PersistentManager` implementation that will write to an external data store, such as VMware Tanzu Session Manager with Redis Cache.\n\n### Special cases\n\nCertain production scenarios may require more changes or impose more limitations. While such scenarios can be infrequent, it's important to ensure that they're either inapplicable to your application or correctly resolved.\n\n#### Determine whether application relies on scheduled jobs\n\nScheduled jobs, such as Quartz Scheduler tasks or cron jobs, can't be used with containerized Tomcat deployments. If your application is scaled out, one scheduled job may run more than once per scheduled period. This situation can lead to unintended consequences.\n\nInventory any scheduled jobs, inside or outside the application server.\n\n#### Determine whether your application contains OS-specific code\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code-no-title](includes/determine-whether-your-application-contains-os-specific-code-no-title.md)]\n\n#### Determine whether MemoryRealm is used\n\n[MemoryRealm](https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/realm/MemoryRealm.html) requires a persisted XML file. On ACA, you'll need to add this file to the container image or upload it to shared storage that is made available to containers. (For more information, see the [Identify session persistence mechanism](#identify-session-persistence-mechanism) section.) The `pathName` parameter will have to be modified accordingly.\n\nTo determine whether `MemoryRealm` is currently used, inspect your **server.xml** and **context.xml** files and search for `<Realm>` elements where the `className` attribute is set to `org.apache.catalina.realm.MemoryRealm`.\n\n### In-place testing\n\nBefore you create container images, migrate your application to the JDK and Tomcat that you intend to use on ACA. Test your application thoroughly to ensure compatibility and performance.\n\n### Parameterize the configuration\n\nIn the pre-migration, you'll likely have identified secrets and external dependencies, such as datasources, in **server.xml** and **context.xml** files. For each item thus identified, replace any username, password, connection string, or URL with an environment variable.\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\nFor example, suppose the **context.xml** file contains the following element:\n\n```xml\n<Resource\n    name=\"jdbc/dbconnection\"\n    type=\"javax.sql.DataSource\"\n    url=\"jdbc:postgresql://postgresdb.contoso.com/wickedsecret?ssl=true\"\n    driverClassName=\"org.postgresql.Driver\"\n    username=\"postgres\"\n    password=\"{password}\"\n/>\n```\n\nIn this case, you could change it as shown in the following example:\n\n```xml\n<Resource\n    name=\"jdbc/dbconnection\"\n    type=\"javax.sql.DataSource\"\n    url=\"${postgresdb.connectionString}\"\n    driverClassName=\"org.postgresql.Driver\"\n    username=\"${postgresdb.username}\"\n    password=\"${postgresdb.password}\"\n/>\n```\n\n## Migration\n\n> [!NOTE]\n> Some Tomcat deployments may have multiple applications running on a single Tomcat server. If this is the case in your deployment, we strongly recommend running each application in a separate pod. This enables you to optimize resource utilization for each application while minimizing complexity and coupling.\n\n### Prepare the deployment artifacts\n\nClone the [Tomcat on Containers Quickstart](https://github.com/Azure/tomcat-container-quickstart) GitHub repository. This repository contains a Dockerfile and Tomcat configuration files with many recommended optimizations. In the steps below, we outline modifications you'll likely need to make to these files before building the container image and deploying to ACA.\n\n#### Add JNDI resources\n\nEdit **server.xml** to add the resources you prepared in the pre-migration steps, such as Data Sources, as shown in the following example:\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\n```xml\n<!-- Global JNDI resources\n      Documentation at /docs/jndi-resources-howto.html\n-->\n<GlobalNamingResources>\n    <!-- Editable user database that can also be used by\n         UserDatabaseRealm to authenticate users\n    -->\n    <Resource name=\"UserDatabase\" auth=\"Container\"\n              type=\"org.apache.catalina.UserDatabase\"\n              description=\"User database that can be updated and saved\"\n              factory=\"org.apache.catalina.users.MemoryUserDatabaseFactory\"\n              pathname=\"conf/tomcat-users.xml\"\n               />\n\n    <!-- Migrated datasources here: -->\n    <Resource\n        name=\"jdbc/dbconnection\"\n        type=\"javax.sql.DataSource\"\n        url=\"${postgresdb.connectionString}\"\n        driverClassName=\"org.postgresql.Driver\"\n        username=\"${postgresdb.username}\"\n        password=\"${postgresdb.password}\"\n    />\n    <!-- End of migrated datasources -->\n</GlobalNamingResources>\n```\n\n[!INCLUDE[Tomcat datasource additional instructions](includes/tomcat-datasource-additional-instructions.md)]\n\n### Build and push the image\n\nThe simplest way to build and upload the image to Azure Container Registry (ACR) for use by ACA is to use the `az acr build` command. This command doesn't require Docker to be installed on your computer. For example, if you have the Dockerfile from the [tomcat-container-quickstart](https://github.com/Azure/tomcat-container-quickstart) repo and the application package **petclinic.war** in the current directory, you can build the container image in ACR with the following command:\n\n```azurecli\naz acr build \\\n    --registry $acrName \\\n    --image \"${acrName}.azurecr.io/petclinic:{{.Run.ID}}\" \n    --build-arg APP_FILE=petclinic.war \\\n    --build-arg SERVER_XML=prod.server.xml .\n```\n\nYou can omit the `--build-arg APP_FILE...` parameter if your WAR file is named **ROOT.war**. You can omit the `--build-arg SERVER_XML...` parameter if your server XML file is named **server.xml**. Both files must be in the same directory as **Dockerfile**.\n\nAlternatively, you can use Docker CLI to build the image locally by using the following commands. This approach can simplify testing and refining the image before initial deployment to ACR. However, it requires Docker CLI to be installed and Docker daemon to be running.\n\n```azurecli\n# Build the image locally.\nsudo docker build . --build-arg APP_FILE=petclinic.war -t \"${acrName}.azurecr.io/petclinic:1\"\n\n# Run the image locally.\nsudo docker run -d -p 8080:8080 \"${acrName}.azurecr.io/petclinic:1\"\n\n# You can now access your application with a browser at http://localhost:8080.\n\n# Sign in to ACR.\nsudo az acr login --name $acrName\n\n# Push the image to ACR.\nsudo docker push \"${acrName}.azurecr.io/petclinic:1\"\n```\n\nFor more information, see [Build and store container images with Azure Container Registry](/training/modules/build-and-store-container-images/).\n\n### Deploy to Azure Container Apps\n\nThe following command shows an example deployment:\n\n```azurecli\naz containerapp create \\\n    --resource-group <RESOURCE_GROUP> \\\n    --name <APP_NAME> \\\n    --environment <ENVIRONMENT_NAME> \\\n    --image <IMAGE_NAME> \\\n    --target-port 8080 \\\n    --ingress 'external' \\\n    --registry-server <REGISTRY_SERVER> \\\n    --min-replicas 1\n```\n\nFor a more in-depth quickstart, see [Quickstart: Deploy your first container app](/azure/container-apps/get-started?tabs=bash).\n\n## Post-migration\n\nNow that you've migrated your application to ACA, you should verify that it works as you expect. Once you've done that, we have some recommendations for you that can make your application more Cloud native.\n\n### Recommendations\n\n* Design and implement a business continuity and disaster recovery strategy. For mission-critical applications, consider a multi-region deployment architecture. For more information, see [Best practices for business continuity and disaster recovery in Azure Kubernetes Service (AKS)](/azure/aks/operator-best-practices-multi-region).\n\n* Evaluate the items in the **logging.properties** file. Consider eliminating or reducing some of the logging output to improve performance.\n\n* Consider monitoring the code cache size and adding the parameters `-XX:InitialCodeCacheSize` and `-XX:ReservedCodeCacheSize` to the `JAVA_OPTS` variable in the Dockerfile to further optimize performance. For more information, see [Codecache Tuning](https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm) in the Oracle documentation.\n\n* Consider adding Azure Monitor alert rules and action groups to quickly detect and address aberrant conditions.\n\n* Consider replicating the Azure Container Apps deployment in another region for lower latency and higher reliability and fault tolerance. Use [Azure Traffic Manager](/azure/traffic-manager) to load balance among deployments or use [Azure Front Door](/azure/frontdoor) to add SSL offloading and Web Application Firewall with DDoS protection.\n\n* If geo-replication isn't necessary, consider adding an [Azure Application Gateway](/azure/application-gateway) to add SSL offloading and Web Application Firewall with DDoS protection.\n"
  },
  {
    "path": "articles/java/migration/migrate-tomcat-to-containers-on-azure-kubernetes-service.md",
    "content": "---\ntitle: Migrate Tomcat Applications to containers on Azure Kubernetes Service (AKS)\ndescription: This guide describes what you should be aware of when you want to migrate an existing Tomcat application to run in an Azure Kubernetes Service (AKS) container.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-java, devx-track-azurecli, migration-java, devx-track-extended-java\n---\n\n# Migrate Tomcat applications to containers on Azure Kubernetes Service (AKS)\n\nThis guide describes what you should be aware of when you want to migrate an existing Tomcat application to run on Azure Kubernetes Service (AKS).\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n[!INCLUDE [inventory-external-resources](includes/inventory-external-resources.md)]\n\n[!INCLUDE [inventory-secrets](includes/inventory-secrets.md)]\n\n[!INCLUDE [determine-whether-and-how-the-file-system-is-used](includes/determine-whether-and-how-the-file-system-is-used.md)]\n\n<!-- AKS-specific addendum to inventory-persistence-usage -->\n[!INCLUDE [dynamic-or-internal-content-aks](includes/dynamic-or-internal-content-aks.md)]\n\n### Identify session persistence mechanism\n\nTo identify the session persistence manager in use, inspect the **context.xml** files in your application and Tomcat configuration. Look for the `<Manager>` element, and then note the value of the `className` attribute.\n\nTomcat's built-in [PersistentManager](https://tomcat.apache.org/tomcat-9.0-doc/config/manager.html) implementations, such as [StandardManager](https://tomcat.apache.org/tomcat-9.0-doc/config/manager.html#Standard_Implementation) or [FileStore](https://tomcat.apache.org/tomcat-9.0-doc/config/manager.html#Nested_Components) aren't designed for use with a distributed, scaled platform such as Kubernetes. AKS may load balance among several pods and transparently restart any pod at any time, persisting mutable state to a file system isn't recommended.\n\nIf session persistence is required, you'll need to use an alternate `PersistentManager` implementation that will write to an external data store, such as VMware Tanzu Session Manager with Redis Cache. For more information, see [Use Redis as a session cache with Tomcat](/azure/app-service/containers/configure-language-java#use-redis-as-a-session-cache-with-tomcat).\n\n### Special cases\n\nCertain production scenarios may require additional changes or impose additional limitations. While such scenarios can be infrequent, it is important to ensure that they are either inapplicable to your application or correctly resolved.\n\n#### Determine whether application relies on scheduled jobs\n\nScheduled jobs, such as Quartz Scheduler tasks or cron jobs, can't be used with containerized Tomcat deployments. If your application is scaled out, one scheduled job may run more than once per scheduled period. This situation can lead to unintended consequences.\n\nInventory any scheduled jobs, inside or outside the application server.\n\n#### Determine whether your application contains OS-specific code\n\nIf your application contains any code that is accommodating the OS your application is running on, then your application needs to be refactored to NOT rely on the underlying OS. For instance, any uses of `/` or `\\` in file system paths may need to be replaced with [`File.Separator`](https://docs.oracle.com/javase/8/docs/api/java/io/File.html#separator) or [`Path.get`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Paths.html#get-java.lang.String-java.lang.String...-).\n\n#### Determine whether MemoryRealm is used\n\n[MemoryRealm](https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/realm/MemoryRealm.html) requires a persisted XML file. On Kubernetes, this file will need to be added to the container image or uploaded to [shared storage that is made available to containers](#identify-session-persistence-mechanism). The `pathName` parameter will have to be modified accordingly.\n\nTo determine whether `MemoryRealm` is currently used, inspect your **server.xml** and **context.xml** files and search for `<Realm>` elements where the `className` attribute is set to `org.apache.catalina.realm.MemoryRealm`.\n\n#### Determine whether SSL session tracking is used\n\nIn containerized deployments, SSL sessions are typically offloaded outside the application container, usually by the ingress controller. If your application requires [SSL session tracking](https://tomcat.apache.org/tomcat-9.0-doc/servletapi/javax/servlet/SessionTrackingMode.html#SSL), ensure the SSL traffic gets passed through to the application container directly.\n\n#### Determine whether AccessLogValve is used\n\nIf [AccessLogValve](https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/valves/AccessLogValve.html) is used, the `directory` parameter should be set to a [mounted Azure Files share](/azure/aks/azure-files-dynamic-pv) or one of its subdirectories.\n\n### In-place testing\n\nBefore you create container images, migrate your application to the JDK and Tomcat that you intend to use on AKS. Test your application thoroughly to ensure compatibility and performance.\n\n### Parameterize the configuration\n\nIn the pre-migration, you'll likely have identified secrets and external dependencies, such as datasources, in **server.xml** and **context.xml** files. For each item thus identified, replace any username, password, connection string, or URL with an environment variable.\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\nFor example, suppose the **context.xml** file contains the following element:\n\n```xml\n<Resource\n    name=\"jdbc/dbconnection\"\n    type=\"javax.sql.DataSource\"\n    url=\"jdbc:postgresql://postgresdb.contoso.com/wickedsecret?ssl=true\"\n    driverClassName=\"org.postgresql.Driver\"\n    username=\"postgres\"\n    password=\"{password}\"\n/>\n```\n\nIn this case, you could change it as shown in the following example:\n\n```xml\n<Resource\n    name=\"jdbc/dbconnection\"\n    type=\"javax.sql.DataSource\"\n    url=\"${postgresdb.connectionString}\"\n    driverClassName=\"org.postgresql.Driver\"\n    username=\"${postgresdb.username}\"\n    password=\"${postgresdb.password}\"\n/>\n```\n\n## Migration\n\nWith the exception of the first step (\"Provision container registry and AKS\"), we recommend that you follow the steps below individually for each application (WAR file) you wish to migrate.\n\n> [!NOTE]\n> Some Tomcat deployments may have multiple applications running on a single Tomcat server. If this is the case in your deployment, we strongly recommend running each application in a separate pod. This enables you to optimize resource utilization for each application while minimizing complexity and coupling.\n\n### Provision container registry and AKS\n\nCreate a container registry and an Azure Kubernetes cluster whose Service Principal has the Reader role on the registry. Be sure to [choose the appropriate network model](/azure/aks/operator-best-practices-network#choose-the-appropriate-network-model) for your cluster's networking requirements.\n\n```azurecli\naz group create \\\n    --resource-group $resourceGroup \\\n    --location eastus\naz acr create \\\n    --resource-group $resourceGroup \\\n    --name $acrName \\\n    --sku Standard\naz aks create \\\n    --resource-group $resourceGroup \\\n    --name $aksName \\\n    --attach-acr $acrName \\\n    --network-plugin azure\n```\n\n### Prepare the deployment artifacts\n\nClone the [Tomcat On Containers Quickstart GitHub repository](https://github.com/Azure/tomcat-container-quickstart). It contains a Dockerfile and Tomcat configuration files with a number of recommended optimizations. In the steps below, we outline modifications you'll likely need to make to these files before building the container image and deploying to AKS.\n\n#### Open ports for clustering, if needed\n\nIf you intend to use [Tomcat Clustering](https://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html) on AKS, ensure that the necessary port ranges are exposed in the Dockerfile. In order to specify the server IP address in **server.xml**, be sure to use a value from a variable that is initialized at container startup to the pod's IP address.\n\nAlternatively, session state can be [persisted to an alternate location](#identify-session-persistence-mechanism) to be available across replicas.\n\nTo determine whether your application uses clustering, look for the `<Cluster>` element inside the `<Host>` or `<Engine>` elements in the **server.xml** file.\n\n#### Add JNDI resources\n\nEdit **server.xml** to add the resources you prepared in the pre-migration steps, such as Data Sources, as shown in the following example:\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\n```xml\n<!-- Global JNDI resources\n      Documentation at /docs/jndi-resources-howto.html\n-->\n<GlobalNamingResources>\n    <!-- Editable user database that can also be used by\n         UserDatabaseRealm to authenticate users\n    -->\n    <Resource name=\"UserDatabase\" auth=\"Container\"\n              type=\"org.apache.catalina.UserDatabase\"\n              description=\"User database that can be updated and saved\"\n              factory=\"org.apache.catalina.users.MemoryUserDatabaseFactory\"\n              pathname=\"conf/tomcat-users.xml\"\n               />\n\n    <!-- Migrated datasources here: -->\n    <Resource\n        name=\"jdbc/dbconnection\"\n        type=\"javax.sql.DataSource\"\n        url=\"${postgresdb.connectionString}\"\n        driverClassName=\"org.postgresql.Driver\"\n        username=\"${postgresdb.username}\"\n        password=\"${postgresdb.password}\"\n    />\n    <!-- End of migrated datasources -->\n</GlobalNamingResources>\n```\n\n[!INCLUDE[Tomcat datasource additional instructions](includes/tomcat-datasource-additional-instructions.md)]\n\n### Build and push the image\n\nThe simplest way to build and upload the image to Azure Container Registry (ACR) for use by AKS is to use the `az acr build` command. This command doesn't require Docker to be installed on your computer. For example, if you have the Dockerfile above and the application package **petclinic.war** in the current directory, you can build the container image in ACR with one step:\n\n```azurecli\naz acr build \\\n    --image \"${acrName}.azurecr.io/petclinic:{{.Run.ID}}\" \\\n    --registry $acrName \\\n    --build-arg APP_FILE=petclinic.war \\\n    --build-arg=prod.server.xml .\n```\n\nYou can omit the `--build-arg APP_FILE...` parameter if your WAR file is named **ROOT.war**. You can omit the `--build-arg SERVER_XML...` parameter if your server XML file is named **server.xml**. Both files must be in the same directory as **Dockerfile**.\n\nAlternatively, you can use Docker CLI to build the image locally. This approach can simplify testing and refining the image before initial deployment to ACR. However, it requires Docker CLI to be installed and Docker daemon to be running.\n\n```azurecli\n# Build the image locally\nsudo docker build . --build-arg APP_FILE=petclinic.war -t \"${acrName}.azurecr.io/petclinic:1\"\n\n# Run the image locally\nsudo docker run -d -p 8080:8080 \"${acrName}.azurecr.io/petclinic:1\"\n\n# Your application can now be accessed with a browser at http://localhost:8080.\n\n# Log into ACR\nsudo az acr login --name $acrName\n\n# Push the image to ACR\nsudo docker push \"${acrName}.azurecr.io/petclinic:1\"\n```\n\nFor more information, see the Learn module for [Building and storing container images in Azure](/training/modules/build-and-store-container-images/).\n\n### Provision a public IP address\n\nIf your application is to be accessible from outside your internal or virtual network(s), a public static IP address will be required. This IP address should be provisioned inside cluster's node resource group.\n\n```azurecli\nexport nodeResourceGroup=$(az aks show \\\n    --resource-group $resourceGroup \\\n    --name $aksName \\\n    --query 'nodeResourceGroup' \\\n    --output tsv)\nexport publicIp=$(az network public-ip create \\\n    --resource-group $nodeResourceGroup \\\n    --name applicationIp \\\n    --sku Standard \\\n    --allocation-method Static \\\n    --query 'publicIp.ipAddress' \\\n    --output tsv)\necho \"Your public IP address is ${publicIp}.\"\n```\n\n### Deploy to AKS\n\n[Create and apply your Kubernetes YAML file(s)](/azure/aks/kubernetes-walkthrough#run-the-application). If you're creating an external load balancer (whether to your application or to an ingress controller), be sure to provide the IP address provisioned in the previous section as the `LoadBalancerIP`.\n\nInclude [externalized parameters as environment variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/). Don't include secrets (such as passwords, API keys, and JDBC connection strings). Secrets are covered in the [Configure KeyVault FlexVolume](#configure-keyvault-flexvolume) section.\n\n### Configure persistent storage\n\nIf your application requires non-volatile storage, configure one or more [Persistent Volumes](/azure/aks/azure-disks-dynamic-pv).\n\nYou might want to create a Persistent Volume using Azure Files mounted to the Tomcat logs directory **/tomcat_logs** to retain logs centrally. For more information, see [Dynamically create and use a persistent volume with Azure Files in Azure Kubernetes Service (AKS)](/azure/aks/azure-files-dynamic-pv).\n\n### Configure KeyVault FlexVolume\n\n[Create an Azure KeyVault](/azure/key-vault/quick-create-cli) and populate all the necessary secrets. Then, configure a [KeyVault FlexVolume](https://github.com/Azure/kubernetes-keyvault-flexvol/blob/master/README.md) to make those secrets accessible to pods.\n\nYou'll need to modify the startup script (**startup.sh** in the [Tomcat on Containers](https://github.com/Azure/tomcat-container-quickstart) GitHub repository) to import the certificates into the local keystore on the container.\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\n### Migrate scheduled jobs\n\nTo execute scheduled jobs on your AKS cluster, define [Cron Jobs](https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/) as needed.\n\n## Post-migration\n\nNow that you've migrated your application to AKS, you should verify that it works as you expect. Once you've done that, we have some recommendations for you that can make your application more Cloud native.\n\n* Consider adding a DNS name to the IP address allocated to your ingress controller or application load balancer. For more information, see [Use TLS with an ingress controller on Azure Kubernetes Service (AKS)](/azure/aks/ingress-static-ip).\n\n* Consider [adding HELM charts for your application](https://helm.sh/docs/topics/charts/). A helm chart allows you to parameterize your application deployment for use and customization by a more diverse set of customers.\n\n* Design and implement a DevOps strategy. To maintain reliability while increasing your development velocity, consider [automating deployments and testing with Azure Pipelines](/azure/devops/pipelines/ecosystems/kubernetes/aks-template).\n\n* Enable [Azure Monitoring for the cluster](/azure/azure-monitor/insights/container-insights-enable-existing-clusters) to allow the collection of container logs, track utilization, and so on.\n\n* Consider exposing application-specific metrics via Prometheus. Prometheus is an open-source metrics framework broadly adopted in the Kubernetes community. You can configure [Prometheus Metrics scraping in Azure Monitor](/azure/azure-monitor/insights/container-insights-prometheus-integration) instead of hosting your own Prometheus server to enable metrics aggregation from your applications and automated response to or escalation of aberrant conditions.\n\n* Design and implement a business continuity and disaster recovery strategy. For mission-critical applications, consider a [multi-region deployment architecture](/azure/aks/operator-best-practices-multi-region).\n\n* Review the [Kubernetes Version Support policy](/azure/aks/supported-kubernetes-versions#kubernetes-version-support-policy). It's your responsibility to keep [updating your AKS cluster](/azure/aks/upgrade-cluster) to ensure it's always running a supported version.\n\n* Have all team members responsible for cluster administration and application development review the pertinent [AKS best practices](/azure/aks/best-practices).\n\n* Evaluate the items in the **logging.properties** file. Consider eliminating or reducing some of the logging output to improve performance.\n\n* Consider [monitoring the code cache size](https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm) and adding the parameters `-XX:InitialCodeCacheSize` and `-XX:ReservedCodeCacheSize` to the `JAVA_OPTS` variable in the Dockerfile to further optimize performance.\n"
  },
  {
    "path": "articles/java/migration/migrate-tomcat-to-tomcat-app-service.md",
    "content": "---\ntitle: Migrate Tomcat applications to Tomcat on Azure App Service\ndescription: This guide describes what you should be aware of when you want to migrate an existing Tomcat application to run on Azure App Service using Tomcat.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-java, migration-java, devx-track-extended-java\n---\n\n# Migrate Tomcat applications to Tomcat on Azure App Service\n\nThis guide describes what you should be aware of when you want to migrate an existing Tomcat application to run on Azure App Service using Tomcat 9.0.\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\nIf you can't meet any of these pre-migration requirements, see the following companion migration guides:\n\n* [Migrate Tomcat applications to containers on Azure Kubernetes Service](migrate-tomcat-to-containers-on-azure-kubernetes-service.md)\n* Migrate Tomcat Applications to Azure Virtual Machines (guidance planned)\n\n### Switch to a supported platform\n\nApp Service offers specific versions of Tomcat on specific versions of Java. To ensure compatibility, migrate your application to one of the supported versions of Tomcat and Java in its current environment before you continue with any of the remaining steps. Be sure to fully test the resulting configuration. Use the latest stable release of your Linux distribution in such tests.\n\n[!INCLUDE [note-obtain-your-current-java-version-app-service](includes/note-obtain-your-current-java-version-app-service.md)]\n\nTo obtain your current Tomcat version, sign in to your production server and run the following command:\n\n```bash\n${CATALINA_HOME}/bin/version.sh\n```\n\nTo obtain the current version used by Azure App Service, download [Tomcat 9](https://tomcat.apache.org/download-90.cgi), depending on which version you plan to use in Azure App Service.\n\n[!INCLUDE [inventory-external-resources](includes/inventory-external-resources.md)]\n\n[!INCLUDE [inventory-secrets](includes/inventory-secrets.md)]\n\n[!INCLUDE [inventory-certificates](includes/inventory-certificates.md)]\n\n[!INCLUDE [determine-whether-and-how-the-file-system-is-used](includes/determine-whether-and-how-the-file-system-is-used.md)]\n\n<!-- App-Service-specific addendum to inventory-persistence-usage -->\n#### Dynamic or internal content\n\nFor files that are frequently written and read by your application (such as temporary data files), or static files that are visible only to your application, you can mount Azure Storage into the App Service file system. For more information, see [Mount Azure Storage as a local share in App Service](/azure/app-service/configure-connect-to-azure-storage).\n\n### Identify session persistence mechanism\n\nTo identify the session persistence manager in use, inspect the **context.xml** files in your application and Tomcat configuration. Look for the `<Manager>` element, and then note the value of the `className` attribute.\n\nTomcat's built-in [PersistentManager](https://tomcat.apache.org/tomcat-9.0-doc/config/manager.html) implementations, such as [StandardManager](https://tomcat.apache.org/tomcat-9.0-doc/config/manager.html#Standard_Implementation) or [FileStore](https://tomcat.apache.org/tomcat-9.0-doc/config/manager.html#Nested_Components) aren't designed for use with a distributed, scaled platform such as App Service. Because App Service may load balance among several instances and transparently restart any instance at any time, persisting mutable state to a file system isn't recommended.\n\nIf session persistence is required, you'll need to use an alternate `PersistentManager` implementation that will write to an external data store, such as VMware Tanzu Session Manager with Redis Cache. For more information, see [Use Redis as a session cache with Tomcat](/azure/app-service/containers/configure-language-java#use-redis-as-a-session-cache-with-tomcat).\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n### Special cases\n\nCertain production scenarios may require additional changes or impose additional limitations. While such scenarios can be infrequent, it's important to ensure that they're either inapplicable to your application or correctly resolved.\n\n#### Determine whether application relies on scheduled jobs\n\nScheduled jobs, such as Quartz Scheduler tasks or cron jobs, can't be used with App Service. App Service won't prevent you from deploying an application containing scheduled tasks internally. However, if your application is scaled out, the same scheduled job may run more than once per scheduled period. This situation can lead to unintended consequences.\n\nInventory any scheduled jobs, inside or outside the application server.\n\n#### Determine whether your application contains OS-specific code\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code-no-title](includes/determine-whether-your-application-contains-os-specific-code-no-title.md)]\n\n#### Determine whether Tomcat clustering is used\n\n[Tomcat clustering](https://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html) isn't supported on Azure App Service. Instead, you can configure and manage scaling and load balancing through Azure App Service without Tomcat-specific functionality. You can persist session state to an alternate location to make it available across replicas. For more information, see [Identify session persistence mechanism](#identify-session-persistence-mechanism).\n\nTo determine whether your application uses clustering, look for the `<Cluster>` element inside the `<Host>` or `<Engine>` elements in the **server.xml** file.\n\n#### Determine whether non-HTTP connectors are used\n\nApp Service supports only a single HTTP connector. If your application requires additional connectors, such as the AJP connector, don't use App Service.\n\nTo identify HTTP connectors used by your application, look for `<Connector>` elements inside the **server.xml** file in your Tomcat configuration.\n\n#### Determine whether MemoryRealm is used\n\n[MemoryRealm](https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/realm/MemoryRealm.html) requires a persisted XML file. On Azure AppService, you'll need to upload this file to the **/home**  directory or one of its subdirectories, or to mounted storage. You'll then need to modify the `pathName` parameter accordingly.\n\nTo determine whether `MemoryRealm` is currently used, inspect your **server.xml** and **context.xml** files and search for `<Realm>` elements where the `className` attribute is set to `org.apache.catalina.realm.MemoryRealm`.\n\n#### Determine whether SSL session tracking is used\n\nApp Service performs session offloading outside of the Tomcat runtime, so you can't use [SSL session tracking](https://tomcat.apache.org/tomcat-9.0-doc/servletapi/javax/servlet/SessionTrackingMode.html#SSL). Use a different session tracking mode instead (`COOKIE` or `URL`). If you need SSL session tracking, don't use App Service.\n\n#### Determine whether AccessLogValve is used\n\nIf you use [AccessLogValve](https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/valves/AccessLogValve.html), you should set the `directory` parameter to `/home/LogFiles` or one of its subdirectories.\n\n## Migration\n\n### Parameterize the configuration\n\nIn the pre-migration steps, you likely identified some secrets and external dependencies, such as datasources, in **server.xml** and **context.xml** files. For each item you identified, replace any username, password, connection string, or URL with an environment variable.\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\nFor example, suppose the **context.xml** file contains the following element:\n\n```xml\n<Resource\n    name=\"jdbc/dbconnection\"\n    type=\"javax.sql.DataSource\"\n    url=\"jdbc:postgresql://postgresdb.contoso.com/wickedsecret?ssl=true\"\n    driverClassName=\"org.postgresql.Driver\"\n    username=\"postgres\"\n    password=\"{password}\"\n/>\n```\n\nIn this case, you could change it as shown in the following example:\n\n```xml\n<Resource\n    name=\"jdbc/dbconnection\"\n    type=\"javax.sql.DataSource\"\n    url=\"${postgresdb.connectionString}\"\n    driverClassName=\"org.postgresql.Driver\"\n    username=\"${postgresdb.username}\"\n    password=\"${postgresdb.password}\"\n/>\n```\n\nTo ensure that parameter substitution occurs for any **context.xml** file within the **META-INF** folder inside a deployed **.war** file, be sure to set the `CATALINA_OPTS` environment variable as shown in the following example:\n\n```bash\nexport CATALINA_OPTS=\"-Dorg.apache.tomcat.util.digester.PROPERTY_SOURCE=org.apache.tomcat.util.digester.EnvironmentPropertySource\"\n```\n\n### Provision an App Service plan\n\nFrom the list of available service plans at [App Service pricing](https://azure.microsoft.com/pricing/details/app-service/linux/), select the plan whose specifications meet or exceed those of the current production hardware.\n\n> [!NOTE]\n> If you plan to run staging/canary deployments or use deployment slots, the App Service plan must include that additional capacity. We recommend using Premium or higher plans for Java applications. For more information, see [Set up staging environments in Azure App Service](/azure/app-service/deploy-staging-slots).\n\nThen, create the App Service plan. For more information, see [Manage an App Service plan in Azure](/azure/app-service/app-service-plan-manage).\n\n### Create and deploy Web App(s)\n\nYou'll need to create a Web App on your App Service Plan (choosing a version of Tomcat as the runtime stack) for every WAR file deployed to your Tomcat server.\n\n> [!NOTE]\n> While it's possible to deploy multiple WAR files to a single web app, this is highly undesirable. Deploying multiple WAR files to a single web app prevents each application from scaling according to its own usage demands. It also adds complexity to subsequent deployment pipelines. If multiple applications need to be available on a single URL, consider using a routing solution such as [Azure Application Gateway](/azure/application-gateway/).\n\n#### Maven applications\n\nIf your application is built from a Maven POM file, [use the Webapp plugin for Maven](/azure/app-service/containers/quickstart-java#configure-the-maven-plugin) to create the Web App and deploy your application.\n\n#### Non-Maven applications\n\nIf you can't use the Maven plugin, you'll need to provision the Web App through other mechanisms, such as:\n\n* [Azure portal](https://portal.azure.com/#create/Microsoft.WebSite)\n* [Azure CLI](/cli/azure/webapp#az-webapp-create)\n* [Azure PowerShell](/powershell/module/az.websites/new-azwebapp)\n\nOnce the Web App has been created, use one of the [available deployment mechanisms](/azure/app-service/deploy-zip) to deploy your application.\n\n### Migrate JVM runtime options\n\nIf your application requires specific runtime options, [use the most appropriate mechanism to specify them](/azure/app-service/containers/configure-language-java#set-java-runtime-options).\n\n### Populate secrets\n\nUse Application Settings to store any secrets specific to your application. If you intend to use the same secret(s) among multiple applications or require fine-grained access policies and audit capabilities, [use Azure Key Vault](/azure/app-service/containers/configure-language-java#use-keyvault-references) instead.\n\n[!INCLUDE [configure-custom-domain-and-ssl](includes/configure-custom-domain-and-ssl.md)]\n\n[!INCLUDE [import-backend-certificates](includes/import-backend-certificates.md)]\n\n### Migrate data sources, libraries, and JNDI resources\n\nFor data source configuration steps, see the [Data sources](/azure/app-service/containers/configure-language-java#data-sources) section of [Configure a Linux Java app for Azure App Service](/azure/app-service/containers/configure-language-java).\n\n[!INCLUDE[Tomcat datasource additional instructions](includes/tomcat-datasource-additional-instructions.md)]\n\nMigrate any additional server-level classpath dependencies by following [the same steps as for data source JAR files](/azure/app-service/containers/configure-language-java#finalize-configuration).\n\nMigrate any additional [Shared server-level JDNI resources](/azure/app-service/containers/configure-language-java#shared-server-level-resources).\n\n> [!NOTE]\n> If you're following the recommended architecture of one WAR per webapp, consider migrating server-level classpath libraries and JNDI resources into your application. This will significantly simplify component governance and change management.\n\n### Migrate remaining configuration\n\nUpon completing the preceding section, you should have your customizable server configuration in **/home/tomcat/conf**.\n\nComplete the migration by copying any additional configuration (such as [realms](https://tomcat.apache.org/tomcat-9.0-doc/config/realm.html) and [JASPIC](https://tomcat.apache.org/tomcat-9.0-doc/config/jaspic.html))\n\n[!INCLUDE [migrate-scheduled-jobs](includes/migrate-scheduled-jobs.md)]\n\n### Restart and smoke-test\n\nFinally, you'll need to restart your Web App to apply all configuration changes. Upon completion of the restart, verify that your application is running correctly.\n\n## Post-migration\n\nNow that you have your application migrated to Azure App Service you should verify that it works as you expect. Once you've done that we have some recommendations for you that can make your application more Cloud native.\n\n### Recommendations\n\n* If you opted to use the **/home**  directory for file storage, consider [replacing it with Azure Storage](/azure/app-service/configure-connect-to-azure-storage).\n\n* If you have configuration in the **/home**  directory that contains connection strings, SSL keys, and other secret information, consider using a combination of [Azure Key Vault](/azure/app-service/app-service-key-vault-references) and/or [parameter injection with application settings](/azure/app-service/configure-common#configure-app-settings) where possible.\n\n  [!INCLUDE [security-note](../includes/security-note.md)]\n\n* Consider [using Deployment Slots](/azure/app-service/deploy-staging-slots) for reliable deployments with zero downtime.\n\n* Design and implement a DevOps strategy. To maintain reliability while increasing your development velocity, consider [automating deployments and testing with Azure Pipelines](/azure/devops/pipelines/ecosystems/java-webapp). When you use Deployment Slots, you can [automate deployment to a slot](/azure/devops/pipelines/targets/webapp?tabs=yaml#deploy-to-a-slot) followed by the slot swap.\n\n* Design and implement a business continuity and disaster recovery strategy. For mission-critical applications, consider a [multi-region deployment architecture](/azure/architecture/reference-architectures/app-service-web-app/multi-region).\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-to-aks-with-ha-geo-redundancy.md",
    "content": "---\ntitle: \"Tutorial: Migrate Oracle WebLogic Server to Azure Kubernetes Service (AKS) with geo-redundancy\"\ndescription: Shows how to deploy WebLogic Server to Azure Kubernetes Service (AKS) with geo-redundancy.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.topic: how-to\nms.date: 01/13/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-wls\n  - devx-track-javaee-wls-aks\n  - migration-java\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Tutorial: Migrate Oracle WebLogic Server to Azure Kubernetes Service (AKS) with geo-redundancy\n\nThis tutorial shows you a straightforward and effective way to implement a business continuity and disaster recovery (DR) strategy for Java using Oracle WebLogic Server (WLS) on Azure Kubernetes Service (AKS). The solution illustrates how to back up and restore a WLS workload using a simple database-driven Jakarta EE application running on AKS. Geo-redundancy is a complex topic, with many possible solutions. The best solution depends on your unique requirements. For other ways to implement geo-redundancy, see the resources at the end of this article.\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> - Use Azure optimized best practices to achieve high availability and disaster recovery (HA/DR).\n> - Set up a Microsoft Azure SQL Database failover group in paired regions.\n> - Set up and configure primary WLS clusters on AKS.\n> - Configure geo-redundancy using Azure Backup.\n> - Restore a WLS cluster in a secondary region.\n> - Set up an Azure Traffic Manager.\n> - Test failover.\n\nThe following diagram illustrates the architecture you build:\n\n<!-- Diagram source https://github.com/Azure-Samples/azure-cafe/blob/main/diagrams/weblogic-on-aks-dr-solution-architecture.vsdx-->\n:::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/weblogic-on-aks-dr-solution-architecture.png\" alt-text=\"Diagram of the solution architecture of WLS on Azure VMs with high availability and disaster recovery.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/weblogic-on-aks-dr-solution-architecture.png\" border=\"false\":::\n\nAzure Traffic Manager checks the health of your regions and routes the traffic accordingly to the application tier. The primary region has a full deployment of the WLS cluster. Only the primary region is actively servicing network requests from the users. The secondary region restores the WLS cluster from backups of the primary region if there's a disaster or declared DR event. The secondary region is activated to receive traffic only when the primary region experiences a service disruption.\n\nAzure Traffic Manager uses the health check feature of the Azure Application Gateway and the WebLogic Kubernetes Operator (WKO) to implement this conditional routing. WKO deeply integrates with AKS health checks, enabling Azure Traffic Manager to have a high level of awareness of the health of your Java workload. The primary WLS cluster is running and the secondary cluster is shut down.\n\nThe geo-failover recovery time objective (RTO) of the application tier depends on the time for starting AKS and running the secondary WLS cluster, which is typically less than an hour. The application data is persisted and replicated in the Azure SQL Database failover group, with an RTO of minutes or hours and a recovery point objective (RPO) of minutes or hours. In this architecture, Azure backup has only one *Vault-standard* backup for the WLS configuration every day. For more information, see [What is Azure Kubernetes Service (AKS) backup?](/azure/backup/azure-kubernetes-service-backup-overview)\n\n[!INCLUDE [ha-dr-for-wls-overview](includes/ha-dr-for-wls-overview.md)]\n\nThis article uses Azure Backup to protect AKS. For region availability, supported scenarios, and limitations, see [Azure Kubernetes Service backup support matrix](/azure/backup/azure-kubernetes-service-cluster-backup-support-matrix). Currently, Azure Backup supports Vault Tier backups and restoring across regions, which are available in public preview. For more information, see [Enable Vault Tier backups for AKS and restore across regions by using Azure Backup](/azure/backup/tutorial-restore-aks-backups-across-regions).\n\n> [!NOTE]\n> In this article, you must frequently create unique identifiers for various resources. This article uses the convention of `<initials><sequence-number>` as a prefix. For example, if your name is Emily Juanita Bernal, a unique identifier would be `ejb01`. For additional disambiguity, you could append today's date in `MMDD` format, such as `ejb010307`.\n\n## Prerequisites\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n- Make sure you have either the `Owner` role or the `Contributor` and `User Access Administrator` roles in the subscription. You can verify the assignment by following the steps in [List Azure role assignments using the Azure portal](/azure/role-based-access-control/role-assignments-list-portal).\n- Prepare a local machine with Windows, Linux, or macOS installed.\n- To run Azure CLI commands, install the [Azure CLI](/cli/azure/install-azure-cli), version 2.54.0 or later.\n- Install and set up [kubectl](/cli/azure/aks#az-aks-install-cli).\n- Install and set up [Git](/devops/develop/git/install-and-set-up-git).\n- Install a Java SE implementation, version 17 or later - for example, [the Microsoft build of OpenJDK](/java/openjdk).\n- Install [Maven](https://maven.apache.org/download.cgi), version 3.9.3 or later.\n- Have the credentials for an Oracle single sign-on (SSO) account. To create one, see [Create Your Oracle Account](https://profile.oracle.com/myprofile/account/create-account.jspx).\n- Use the following steps to accept the license terms for WLS:\n  1. Visit the [Oracle Container Registry](https://container-registry.oracle.com/) and sign in.\n  1. If you have a support entitlement, select **Middleware**, then search for and select **weblogic_cpu**.\n  1. If you don't have a support entitlement from Oracle, select **Middleware**, then search for and select **weblogic**.\n  1. Accept the license agreement.\n\n- Running WLS on AKS requires an understanding of WLS domains. For more information on WLS domains, see the [Decide whether to use the prebuilt Azure Marketplace offer](migrate-weblogic-to-azure-kubernetes-service.md#decide-whether-to-use-the-prebuilt-azure-marketplace-offer) section of [Migrate WebLogic Server applications to Azure Kubernetes Service](migrate-weblogic-to-azure-kubernetes-service.md). This article assumes that you're running WLS on AKS using the [model in image](https://oracle.github.io/weblogic-kubernetes-operator/samples/azure-kubernetes-service/model-in-image/) domain home source type, with transaction logs and stores in an external database, and no external storage.\n\n## Set up an Azure SQL Database failover group in paired regions\n\n[!INCLUDE [ha-dr-for-wls-azure-sql-database-creation](includes/ha-dr-for-wls-azure-sql-database-creation.md)]\n\n[!INCLUDE [ha-dr-for-wls-azure-sql-database-schema-aks](includes/ha-dr-for-wls-azure-sql-database-schema-aks.md)]\n\n[!INCLUDE [ha-dr-for-wls-azure-sql-database-failover-group](includes/ha-dr-for-wls-azure-sql-database-failover-group.md)]\n\n## Get the JDBC connection string and database admin username for the failover group\n\nThe following steps direct you to get the JDBC connection string and database username for the database within the failover group. These values are different than the corresponding values for the primary database.\n\n1. In the Azure portal, find the resource group into which you deployed the primary database.\n1. In the list of resources, select the primary database with type **SQL database**.\n1. Under **Settings**, select **Connection strings**.\n1. Select **JDBC**.\n1. In the text area under **JDBC (SQL authentication)**, select the copy icon to put the value of the JDBC connection string on the clipboard.\n1. In a text editor, paste the value. You edit it in another step.\n1. Return to the resource group.\n1. Select the resource of type **SQL Server** that contains the database you just looked at in the previous steps.\n1. Under **Data management**, select **Failover groups**.\n1. In the table in the middle of the page, select the failover group.\n1. In the text area under **Read/write listener endpoint**, select the copy icon to put the value of the JDBC connection string on the clipboard.\n1. Paste the value on a new line in your text editor. Your text editor should now have lines similar to the following example:\n\n   ```\n   jdbc:sqlserver://ejb010307db.database.windows.net:1433;database=ejb010307db;user=azureuser@ejb010307db;password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;\n   ejb010307failover.database.windows.net\n   ```\n\n1. Create a new line using the following modifications:\n\n   1. Copy the entire first line.\n   1. Change the hostname part of the URL to use the hostname from the **Read/write listener endpoint** line.\n   1. Remove everything after the `name=value` pair for `database`. In other words, remove everything including and after the `;` immediately after `database=ejb010307db`.\n\n      When you're done, the string should look similar to the following example:\n\n      ```\n      jdbc:sqlserver://ejb010307failover.database.windows.net:1433;database=ejb010307db\n      ```\n\n      This value is the JDBC connection string.\n\n1. In the same text editor, derive the database username by getting the value of the `user` parameter from the original JDBC connection string and replacing the database name with the first part of the **Read/write listener endpoint** line. Continuing with the previous example, the value would be `azureuser@ejb010307failover`. This value is the database admin username.\n\n## Set up and configure the primary WLS clusters on AKS\n\nIn this section, you create a WLS cluster on AKS using the [Oracle WebLogic Server on AKS](https://aka.ms/wlsaks) offer. The cluster in East US is the primary and is configured as the active cluster.\n\n> [!NOTE]\n> You can find more information about [Oracle WebLogic Server on AKS](https://aka.ms/wlsaks) offer from the following articles:\n>\n> - [Deploy a Java application with WebLogic Server on an Azure Kubernetes Service (AKS) cluster](/azure/aks/howto-deploy-java-wls-app)\n> - [Oracle WebLogic user guide for AKS](https://aka.ms/wls-aks-docs)\n\n### Prepare a sample app\n\n[!INCLUDE [ha-dr-for-wls-azure-prepare-sample-app](includes/ha-dr-for-wls-azure-prepare-sample-app.md)]\n\n### Create a storage account and storage container to hold the sample application\n\nUse the following steps to create a storage account and container. Some of these steps direct you to other guides. After completing the steps, you can upload a sample application to deploy on WLS.\n\n1. Sign in to the [Azure portal](https://aka.ms/publicportal).\n1. Create a storage account by following the steps in [Create a storage account](/azure/storage/common/storage-account-create). Use the following specializations for the values in the article:\n\n   - Create a new resource group for the storage account.\n   - For **Region**, select **East US**.\n   - For **Storage account name**, use the same value as the resource group name.\n   - For **Performance**, select **Standard**.\n   - For **Redundancy**, select **Locally-redundant storage (LRS)**.\n   - The remaining tabs need no specializations.\n\n1. Proceed to validate and create the account, then return to this article.\n1. Create a storage container within the account by following the steps in the [Create a container](/azure/storage/blobs/storage-quickstart-blobs-portal#create-a-container) section of [Quickstart: Upload, download, and list blobs with the Azure portal](/azure/storage/blobs/storage-quickstart-blobs-portal).\n1. Using the same article, upload the **azure-cafe/weblogic-cafe/target/weblogic-cafe.war** package that you built previously by following the steps in the [Upload a block blob](/azure/storage/blobs/storage-quickstart-blobs-portal#upload-a-block-blob) section. Then, return to this article.\n\n### Deploy WLS on AKS\n\nUse the following steps to deploy WLS on AKS:\n\n1. Open the [Oracle WebLogic Server on AKS](https://aka.ms/wlsaks) offer in your browser and select **Create**. You should see the **Basics** pane of the offer.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-basis.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server on AKS Basics pane.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-basis.png\":::\n\n1. Use the following steps to fill out the **Basics** pane:\n\n   1. Ensure that the value shown for **Subscription** is the same one that has the roles listed in the prerequisites section.\n   1. In the **Resource group** field, select **Create new** and fill in a unique value for the resource group - for example, **wlsaks-eastus-20240109**.\n   1. Under **Instance details**, for **Region**, select **East US**.\n   1. Under **Credentials WebLogic**, provide a password for **WebLogic Administrator** and **WebLogic Model encryption**, respectively. Save aside the username and password for **WebLogic Administrator**.\n   1. Under **Optional Basic Configuration**, for **Accept defaults for optional configuration?**, select **No**. The optional configuration shows.\n\n      :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-basis-optional-config.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server on AKS Basics pane Optional Basic Configuration.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-basis-optional-config.png\":::\n\n   1. For **Name prefix for Managed Server**, fill in **msp**. You configure WLS TLOG table with prefix `TLOG_${serverName}_` later. This article creates TLOG table with name `TLOG_msp${index}_WLStore`. If you want a different managed server name prefix, make sure the value matches Microsoft SQL Server Table Naming Conventions and the real table names.\n   1. Leave the defaults for the other fields.\n\n1. Select **Next** to go to the **AKS** pane.\n\n1. Under **Image selection**, provide the following information:\n\n   - For **Username for Oracle Single Sign-On authentication**, fill in your Oracle SSO username from the preconditions.\n   - For **Password for Oracle Single Sign-On authentication**, fill in your Oracle SSO credentials from the preconditions.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-aks-image-selection.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server on AKS pane - Image Selection.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-aks-image-selection.png\":::\n\n1. Under **Application**, use the following steps:\n\n   1. In the **Application** section, next to **Deploy an application?**, select **Yes**.\n   1. Next to **Application package (.war,.ear,.jar)**, select **Browse**.\n   1. Start typing the name of the storage account from the previous section. When the desired storage account appears, select it.\n   1. Select the storage container from the previous section.\n   1. Select the checkbox next to **weblogic-cafe.war**, which you uploaded in the previous section. Select **Select**.\n   1. Leave the defaults for the other fields.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-aks-app-selection.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server on AKS pane - App Selection.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-aks-app-selection.png\":::\n\n1. Select **Next**.\n\n1. Leave the defaults in the **TLS/SSL Configuration** pane, and then select **Next** to go to the **Load Balancing** pane.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-appgateway-ingress.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server Cluster on AKS Load Balancing pane.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-appgateway-ingress.png\":::\n\n1. In the **Load Balancing** pane, next to **Create ingress for Administration Console. Make sure no application with path /console\\*, it will cause conflict with Administration Console path**, select **Yes**.\n\n1. Leave the defaults for the other fields and select **Next**\n\n1. Leave the default values in the **DNS** pane and select **Next** to go to the **Database** pane.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-database.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server Cluster on AKS Database pane.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/wls-aks-offer-portal-database.png\":::\n\n1. Enter the following values in the **Database** pane:\n\n   - For **Connect to database?**, select **Yes**.\n   - For **Choose database type**, select **Microsoft SQL Server (Supports passwordless connection)** .\n   - For **JNDI Name**, enter **jdbc/WebLogicCafeDB**.\n   - For **DataSource Connection String**, paste the value you saved for **JDBC connection string** in the [Get the JDBC connection string and database admin username for the failover group](#get-the-jdbc-connection-string-and-database-admin-username-for-the-failover-group) section.\n   - For **Global transaction protocol**, select **None**.\n   - For **Database username**, paste the value you saved for **database admin username** in the [Get the JDBC connection string and database admin username for the failover group](#get-the-jdbc-connection-string-and-database-admin-username-for-the-failover-group) section.\n   - Enter the database server admin sign-in password that you saved aside previously for **Database Password**. Enter the same value for **Confirm password**.\n   - Leave the defaults for the other fields.\n\n1. Select **Review + create**.\n\n1. Wait until **Running final validation...** successfully completes, then select **Create**. After a while, you should see the **Deployment** page where **Deployment is in progress** is displayed.\n\n> [!NOTE]\n> If you see any problems during **Running final validation...**, fix them and try again.\n\nDepending on network conditions and other activity in your selected region, the deployment can take up to 70 minutes to complete. After that, you should see the text **Your deployment is complete** displayed on the deployment page.\n\n### Configure the storage of TLOG data\n\nIn this section, you configure the storage of TLOG data by overriding the [WLS image model](https://oracle.github.io/weblogic-kubernetes-operator/samples/azure-kubernetes-service/model-in-image/) with a `ConfigMap`. For more information about the `ConfigMap`, see [WebLogic Deploy Tooling model ConfigMap](https://oracle.github.io/weblogic-kubernetes-operator/managing-domains/model-in-image/usage/#optional-wdt-model-configmap).\n\nThis section requires a Bash terminal with the Azure CLI and kubectl installed. Use the following steps to derive the necessary YAML to and configure the storage of TLOG data:\n\n1. Use the following steps to connect to your AKS cluster:\n\n   1. Open the Azure portal and go to the resource group that you provisioned in the [Deploy WLS on AKS](#deploy-wls-on-aks) section.\n   1. Select the AKS cluster from the resource list, and then select **Connect** to connect to the AKS cluster.\n   1. Select **Azure CLI** and follow the steps to connect to the AKS cluster in your local terminal.\n\n1. Use the following steps to obtain the `topology:` entry from the WLS image model YAML:\n\n   1. Open the Azure portal and go to the resource group that you provisioned in the [Deploy WLS on AKS](#deploy-wls-on-aks) section.\n   1. Select **Settings** > **Deployments**. Select the first deployment whose name starts with **oracle.20210620-wls-on-aks**.\n   1. Select **Outputs**. Copy the **shellCmdtoOutputWlsImageModelYaml** value to the clipboard. The value is a shell command that decodes the base64 string of the model file and saves the content in a file named **model.yaml**.\n   1. Paste the value into your Bash terminal and run the command to produce the **model.yaml** file.\n   1. Edit the file to remove all content except for the top-level `topology:` entry. There should be no top-level entries in your file except for `topology:`.\n   1. Save the file.\n\n1. Use the following steps to obtain the `ConfigMap` name and namespace name from the WLS domain model YAML:\n\n   1. Open the Azure portal and go to the resource group that was provisioned in the [Deploy WLS on AKS](#deploy-wls-on-aks) section.\n   1. Select **Settings** > **Deployments**. Select the first deployment whose name starts with **oracle.20210620-wls-on-aks**.\n   1. Select **Outputs**. Copy value of **shellCmdtoOutputWlsDomainYaml** to clipboard. The value is a shell command to decode base64 string of model file and save content in **model.yaml**.\n   1. Paste the value to your terminal and you get a file named **domain.yaml**.\n   1. Look in the **domain.yaml** for the following values.\n\n      - `spec.configuration.model.configMap`. If you accepted the defaults, this value is `sample-domain1-wdt-config-map`.\n      - `metadata.namespace`. If you accepted the defaults, this value is `sample-domain1-ns`.\n\n      For your convenience, you can use the following command to save these values as shell variables:\n\n      ```bash\n      export CONFIG_MAP_NAME=sample-domain1-wdt-config-map\n      export WLS_NS=sample-domain1-ns\n      ```\n\n1. Use the following command to get the `ConfigMap` YAML:\n\n   ```bash\n   kubectl get configmap ${CONFIG_MAP_NAME} -n ${WLS_NS} -o yaml > configMap.yaml\n   ```\n\n1. Use the following steps to create the **tlog-db-model.yaml** file:\n\n   1. In a text editor, create an empty file called **tlog-db-model.yaml**.\n\n   1. Insert the contents of your **model.yaml**, add a blank line, and then insert the contents of your **configMap.yaml** file.\n\n1. In your **tlog-db-model.yaml** file, locate the line ending with `ListenPort: 8001`. Append this text on the following line, taking extreme care that `TransactionLogJDBCStore` is exactly under `ListenPort` and the remaining lines in the following snippet are indented by two, as shown in the following example:\n\n   ```yaml\n   TransactionLogJDBCStore:\n     Enabled: true\n     DataSource: jdbc/WebLogicCafeDB\n     PrefixName: TLOG_${serverName}_\n   ```\n\n   The completed **tlog-db-model.yaml** should look very close to the following example:\n\n   ```yaml\n   topology:\n     Name: \"@@ENV:CUSTOM_DOMAIN_NAME@@\"\n     ProductionModeEnabled: true\n     AdminServerName: \"admin-server\"\n     Cluster:\n       \"cluster-1\":\n         DynamicServers:\n           ServerTemplate: \"cluster-1-template\"\n           ServerNamePrefix: \"@@ENV:MANAGED_SERVER_PREFIX@@\"\n           DynamicClusterSize: \"@@PROP:CLUSTER_SIZE@@\"\n           MaxDynamicClusterSize: \"@@PROP:CLUSTER_SIZE@@\"\n           MinDynamicClusterSize: \"0\"\n           CalculatedListenPorts: false\n     Server:\n       \"admin-server\":\n         ListenPort: 7001\n     ServerTemplate:\n       \"cluster-1-template\":\n         Cluster: \"cluster-1\"\n         ListenPort: 8001\n         TransactionLogJDBCStore:\n           Enabled: true\n           DataSource: jdbc/WebLogicCafeDB\n           PrefixName: TLOG_${serverName}_\n     SecurityConfiguration:\n       NodeManagerUsername: \"@@SECRET:__weblogic-credentials__:username@@\"\n       NodeManagerPasswordEncrypted: \"@@SECRET:__weblogic-credentials__:password@@\"\n\n   resources:\n     JDBCSystemResource:\n       jdbc/WebLogicCafeDB:\n         Target: 'cluster-1'\n         JdbcResource:\n           JDBCDataSourceParams:\n             JNDIName: [\n               jdbc/WebLogicCafeDB\n             ]\n             GlobalTransactionsProtocol: None\n           JDBCDriverParams:\n             DriverName: com.microsoft.sqlserver.jdbc.SQLServerDriver\n             URL: '@@SECRET:ds-secret-sqlserver-1709938597:url@@'\n             PasswordEncrypted: '@@SECRET:ds-secret-sqlserver-1709938597:password@@'\n             Properties:\n               user:\n                 Value: '@@SECRET:ds-secret-sqlserver-1709938597:user@@'\n           JDBCConnectionPoolParams:\n               TestTableName: SQL SELECT 1\n               TestConnectionsOnReserve: true\n   ```\n\n1. Override the WLS model with the `ConfigMap`. To override the WLS model, replace the existing `ConfigMap` with the new model. For more information, see [Updating an existing model](https://oracle.github.io/weblogic-kubernetes-operator/managing-domains/model-in-image/runtime-updates/#updating-an-existing-model) in the Oracle documentation. Run the following commands to recreate the `ConfigMap`:\n\n   ```bash\n   export CM_NAME_FOR_MODEL=sample-domain1-wdt-config-map\n   kubectl -n sample-domain1-ns delete configmap ${CM_NAME_FOR_MODEL}\n\n   # replace path of tlog-db-model.yaml\n   kubectl -n sample-domain1-ns create configmap ${CM_NAME_FOR_MODEL} \\\n     --from-file=tlog-db-model.yaml\n   kubectl -n sample-domain1-ns label configmap ${CM_NAME_FOR_MODEL} \\\n     weblogic.domainUID=sample-domain1\n   ```\n\n1. Restart the WLS cluster by using the following commands. You need to cause a rolling update to make the new model work.\n\n   ```bash\n   export RESTART_VERSION=$(kubectl -n sample-domain1-ns get domain sample-domain1 '-o=jsonpath={.spec.restartVersion}')\n   # increase restart version\n   export RESTART_VERSION=$((RESTART_VERSION + 1))\n\n   kubectl -n sample-domain1-ns patch domain sample-domain1 \\\n       --type=json \\\n       '-p=[{\"op\": \"replace\", \"path\": \"/spec/restartVersion\", \"value\": \"'${RESTART_VERSION}'\" }]'\n   ```\n\nMake sure the WLS pods are running before you move on. You can use the following command to watch status of the pods:\n\n```bash\nkubectl get pod -n sample-domain1-ns -w\n```\n\n> [!NOTE]\n> In this article, WLS models are included in the application container image, which was created by the WLS on AKS offer. TLOG is configured by overriding the existing model with the WDT `ConfigMap` that contains the model file and uses the domain CRD `configuration.model.configMap` field to reference the map. In production scenarios, [auxiliary images](https://oracle.github.io/weblogic-kubernetes-operator/managing-domains/model-in-image/auxiliary-images/) are the recommended best approach for including Model in Image model files, application archive files, and the WebLogic Deploy Tooling installation, in your pods. This feature eliminates the need to provide these files in the image specified in `domain.spec.image`.\n\n## Configure geo-redundancy using Azure Backup\n\nIn this section, you use Azure Backup to back up AKS clusters by using the Backup extension, which must be installed in the cluster.\n\nUse the following steps to configure geo-redundancy:\n\n1. Create a new storage container for the AKS backup extension in the storage account you created in the [Create a storage account and storage container to hold the sample application](#create-a-storage-account-and-storage-container-to-hold-the-sample-application) section.\n\n1. Use the following commands to install the AKS backup extension and enable the CSI drivers and snapshots for your cluster:\n\n   ```azurecli\n   #replace with your resource group name.\n   export RG_NAME=wlsaks-eastus-20240109\n   export AKS_NAME=$(az aks list \\\n       --resource-group ${RG_NAME} \\\n       --query \"[0].name\" \\\n       --output tsv)\n\n   az aks update \\\n       --resource-group ${RG_NAME} \\\n       --name ${AKS_NAME} \\\n       --enable-disk-driver \\\n       --enable-file-driver \\\n       --enable-blob-driver \\\n       --enable-snapshot-controller --yes\n   ```\n\n   It takes about 5 minutes to enable the drivers. Make sure the commands complete without error before moving on.\n\n[!INCLUDE [ha-dr-for-wls-backup-extension](includes/ha-dr-for-wls-backup-extension.md)]\n\n6. Open the Azure portal, in the search bar on the top, search for **Backup vaults**. You should see it listed under **Services**. Select it.\n\n1. To enable AKS Backup, follow the steps in [Back up Azure Kubernetes Service by using Azure Backup](/azure/backup/azure-kubernetes-service-cluster-backup) up to, but not including, the \"Use hooks during AKS backup\" section. Make the adjustments indicated in the following steps.\n\n1. When you reach the \"Create a Backup vault\" section, make the following adjustments:\n\n   - For step 1, under **Regions**, select **East US**. Under **Backup Storage Redundancy**, use **Globally-Redundant**.\n\n     :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backupvault-basics.png\" alt-text=\"Screenshot of the Azure portal that shows the Backup Vault Basic pane.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backupvault-basics.png\":::\n\n   - For step 2, enable **Cross Region Restore**.\n\n1. When you reach the \"Create a backup policy\" section, make the following adjustments when asked to create a retention policy:\n\n   1. Add a retention rule where **Vault-standard** is selected.\n\n      :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/vault-standard-retention-rule.png\" alt-text=\"Screenshot of the Azure portal that shows the selection of the Vault-standard option.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/vault-standard-retention-rule.png\":::\n\n   1. Select **Add**.\n\n1. When you reach \"Configure backups\" section, make the following adjustments. Step 1-5 are for AKS Extension installation. Skip step 1-5 and start from step 6.\n\n   - For step 7, you run into permission errors. Select **Grant Permission** to move on. After the permission deployment completes, if the error still shows, select **Revalidate** to refresh the role assignments.\n\n     :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/aks-configure-backup-grant-permission.png\" alt-text=\"Screenshot of the Azure portal that shows the AKS Configure Backup Grant Permission.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/aks-configure-backup-grant-permission.png\":::\n\n   - For step 10, find **Select Resources to Backup**, and make the following adjustments:\n     - For **Backup Instance name**, fill in a unique name.\n     - For **Namespaces**, select namespaces for WebLogic Operator and WebLogic Server. In this article, select **weblogic-operator-ns** and **sample-domain1-ns**.\n     - For **Other options**, select all the options. Make sure **Include Secrets** is selected.\n\n     :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/aks-configure-backup-select-resources.png\" alt-text=\"Screenshot of the Azure portal that shows the AKS Configure Backup Select Resources.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/aks-configure-backup-select-resources.png\":::\n\n   - For step 11, you run into a role assignment error. Select your datasource from the list, and select **Assign missing roles** to mitigate the error.\n\n     :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/aks-configure-backup-validation.png\" alt-text=\"Screenshot of the Azure portal that shows the AKS Configure Backup Validation.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/aks-configure-backup-validation.png\":::\n\n## Prepare to restore the WLS cluster in a secondary region\n\nIn this section, you prepare to restore the WLS cluster in the secondary region. Here, the secondary region is West US 2. Before restoring, you must have an AKS cluster with AKS Backup Extension installed in the West US 2 region.\n\n### Configure Azure Container Registry for geo-replication\n\nUse the following steps to configure Azure Container Registry (ACR) for geo-replication, which contains the WLS image you created in the [Deploy WLS on AKS](#deploy-wls-on-aks) section. To enable ACR replication, you have to upgrade it to the Premium pricing plan. For more information, see [Geo-replication in Azure Container Registry](/azure/container-registry/container-registry-geo-replication).\n\n1. Open the resource group that you provisioned in the [Deploy WLS on AKS](#deploy-wls-on-aks) section. From the resource list, select the ACR whose name starts with **wlsaksacr**.\n1. In the ACR landing page, select **Settings** > **Properties**. For **Pricing plan**, select **Premium**, and then select **Save**.\n1. In the navigation pane, select **Services** > **Geo-replications**. Select **Add** to add replication region in the page.\n1. In the **Create replication** page, for **Location**, select **West US 2**, and then select **Create**.\n\nAfter the deployment finishes, the ACR is enabled for geo-replication.\n\n### Create a storage account in a secondary region\n\nTo enable the AKS Backup Extension, you must provide a storage account with an empty container in the same region.\n\nTo restore backup cross region, you must provide a staging location where the backup data is hydrated. This staging location includes a resource group and a storage account in it within the same region and subscription as the target cluster for restoration.\n\nUse the following steps to create a storage account and container. Some of these steps direct you to other guides.\n\n1. Sign in to the [Azure portal](https://aka.ms/publicportal).\n1. Create a storage account by following the steps in [Create a storage account](/azure/storage/common/storage-account-create). You don't need to perform all the steps in the article. Fill out the fields shown on the **Basics** pane. For **Region**, select **West US 2**, then select **Review + create** to accept the default options. Proceed to validate and create the account, then return to this article.\n1. Create a storage container for the AKS Backup Extension by following the steps in the [Create a container](/azure/storage/blobs/storage-quickstart-blobs-portal#create-a-container) section of [Quickstart: Upload, download, and list blobs with the Azure portal](/azure/storage/blobs/storage-quickstart-blobs-portal).\n1. Create a storage container as a staging location for use during restoration.\n\n### Prepare an AKS cluster in a secondary region\n\nThe following sections show you how to create an AKS cluster in a secondary region.\n\n#### Create a new AKS cluster\n\nThis article exposes a WLS application using Application Gateway Ingress Controller. In this section, you create a new AKS cluster in the West US 2 region. Then, you enable the ingress controller add-on with a new application gateway instance. For more information, see [Enable the ingress controller add-on for a new AKS cluster with a new application gateway instance](/azure/application-gateway/tutorial-ingress-controller-add-on-new).\n\nUse the following steps to create the AKS cluster:\n\n1. Use the following commands to create a resource group in the secondary region:\n\n   ```azurecli\n   export RG_NAME_WESTUS=wlsaks-westus-20240109\n\n   az group create --name ${RG_NAME_WESTUS} --location westus\n   ```\n\n1. Use the following commands to deploy an AKS cluster with the add-on enabled:\n\n   ```azurecli\n   export AKS_NAME_WESTUS=${RG_NAME_WESTUS}aks\n   export GATEWAY_NAME_WESTUS=${RG_NAME_WESTUS}gw\n\n   az aks create \\\n       --resource-group ${RG_NAME_WESTUS} \\\n       --name ${AKS_NAME_WESTUS} \\\n       --network-plugin azure \\\n       --enable-managed-identity \\\n       --enable-addons ingress-appgw \\\n       --appgw-name ${GATEWAY_NAME_WESTUS} \\\n       --appgw-subnet-cidr \"10.225.0.0/16\" \\\n       --generate-ssh-keys\n   ```\n\n   This command automatically creates a `Standard_v2 SKU` application gateway instance with the name `${RG_NAME_WESTUS}gw` in the AKS node resource group. The node resource group is named `MC_resource-group-name_cluster-name_location` by default.\n\n   > [!NOTE]\n   > The AKS cluster that you provisioned in the [Deploy WLS on AKS](#deploy-wls-on-aks) section runs across three availability zones in the East US region. Availability zones aren't supported in the West US 2 region. The AKS cluster in West US 2 isn't zone-redundant. If your production environment requires zone redundancy, make sure your paired region supports availability zones. For more information, see the [Overview of availability zones for AKS clusters](/azure/aks/availability-zones#overview-of-availability-zones-for-aks-clusters) section of [Create an Azure Kubernetes Service (AKS) cluster that uses availability zones](/azure/aks/availability-zones).\n\n1. Use the following commands to get the public IP address of the application gateway instance. Save aside the IP address, which you use later in this article.\n\n   ```azurecli\n   export APPGW_ID=$(az aks show \\\n       --resource-group ${RG_NAME_WESTUS} \\\n       --name ${AKS_NAME_WESTUS} \\\n       --query 'addonProfiles.ingressApplicationGateway.config.effectiveApplicationGatewayId' \\\n       --output tsv)\n   echo ${APPGW_ID}\n   export APPGW_IP_ID=$(az network application-gateway show \\\n       --id ${APPGW_ID} \\\n       --query frontendIPConfigurations\\[0\\].publicIPAddress.id \\\n       --output tsv)\n   echo ${APPGW_IP_ID}\n   export APPGW_IP_ADDRESS=$(az network public-ip show \\\n       --id ${APPGW_IP_ID} \\\n       --query ipAddress \\\n       --output tsv)\n   echo \"App Gateway public IP address: ${APPGW_IP_ADDRESS}\"\n   ```\n\n1. Use the following command to attach a domain name service (DNS) name label to the public IP address resource. Replace `<your-chosen-DNS-name>` with an appropriate value - for example, `ejb010316`.\n\n   ```azurecli\n   az network public-ip update --ids ${APPGW_IP_ID} --dns-name <your-chosen-DNS-name>\n   ```\n\n1. You can check the fully qualified domain name (FQDN) of the public IP with `az network public-ip show`. The following example shows an FQDN with DNS label `ejb010316`:\n\n   ```bash\n   az network public-ip show \\\n       --id ${APPGW_IP_ID} \\\n       --query dnsSettings.fqdn \\\n       --output tsv\n   ```\n\n   This command produces output similar to the following example:\n\n   ```output\n   ejb010316.westus.cloudapp.azure.com\n   ```\n\n> [!NOTE]\n> If you're working with an existing AKS cluster, complete the following two actions before you move on:\n>\n> - Enable the ingress controller add-on by following the steps in [Enable application gateway ingress controller add-on for an existing AKS cluster](/azure/application-gateway/tutorial-ingress-controller-add-on-existing).\n> - If you have WLS running in the target namespace, to avoid conflicts, clean up WLS resources in the WebLogic Operator namespace and WebLogic Server namespace. In this article, the WLS on AKS offer provisioned the WebLogic Operator in namespace `weblogic-operator-ns` and the WebLogic Server in namespace `sample-domain1-ns`. Run `kubectl delete namespace weblogic-operator-ns sample-domain1-ns` to delete the two namespaces.\n\n#### Enable the AKS Backup Extension\n\nBefore you continue, use the following steps to install the AKS Backup Extension to the cluster in the secondary region:\n\n1. Use the following command to connect to the AKS cluster in the West US 2 region:\n\n   ```azurecli\n   az aks get-credentials \\\n       --resource-group ${RG_NAME_WESTUS} \\\n       --name ${AKS_NAME_WESTUS}\n   ```\n\n1. Use the following command to enable the CSI drivers and snapshots for your cluster:\n\n   ```azurecli\n   az aks update \\\n       --resource-group ${RG_NAME_WESTUS} \\\n       --name ${AKS_NAME_WESTUS} \\\n       --enable-disk-driver \\\n       --enable-file-driver \\\n       --enable-blob-driver \\\n       --enable-snapshot-controller --yes\n   ```\n\n[!INCLUDE [ha-dr-for-wls-backup-extension](includes/ha-dr-for-wls-backup-extension.md)]\n\n> [!NOTE]\n> To save costs, you can stop the AKS cluster in the secondary region by following the steps in [Stop and start an Azure Kubernetes Service (AKS) cluster](/azure/aks/start-stop-cluster). Start it before you restore the WLS cluster.\n\n### Wait for a Vault-standard backup to happen\n\nIn AKS, the **Vault-standard Tier** is the only tier that supports *Geo-redundancy* and *Cross Region Restore*. As stated in [Which backup storage tier does AKS backup support?](/azure/backup/azure-kubernetes-service-backup-overview#which-backup-storage-tier-does-aks-backup-support), \"Only one scheduled recovery point per day is moved to Vault Tier.\" You must wait for a **Vault-standard** backup to happen. A good lower bound is to wait 24 hours after completing the previous step before continuing.\n\n### Stop the primary cluster\n\nThe primary WLS cluster and secondary WLS cluster are configured with the same TLOG database. Only one cluster can own the database at the same time. To ensure the secondary cluster works correctly, stop the primary WLS cluster. In this article, stop the AKS cluster to disable the WLS cluster by using the following steps:\n\n1. Open the Azure portal and go to the resource group that you provisioned in the [Deploy WLS on AKS](#deploy-wls-on-aks) section.\n1. Open the AKS cluster listed in the resource group.\n1. Select **Stop** to stop the AKS cluster. Make sure the deployment finishes before moving on.\n\n### Restore the WLS cluster\n\nAKS backup supports both Operational Tier and Vault Tier backups. Only backups stored in Vault Tier can be used to do a restore to a cluster in a different region (Azure Paired Region). As per the retention rules set in the backup policy, the first successful backup of a day is moved to the blob container cross region. For more information, see the [Which backup storage tier does AKS backup support?](/azure/backup/azure-kubernetes-service-backup-overview#which-backup-storage-tier-does-aks-backup-support) section of [What is Azure Kubernetes Service backup?](/azure/backup/azure-kubernetes-service-backup-overview)\n\nAfter you configured geo-redundancy in the [Configure geo-redundancy using Azure Backup](#configure-geo-redundancy-using-azure-backup) section, it takes at least a day for Vault Tier backups to become available for restoring.\n\nUse the following steps to restore the WLS cluster:\n\n1. Open the Azure portal and search for **Backup center**. Select **Backup center** under **Services**.\n1. Under **Manage**, select **Backup instances**. Filter on the datasource type **Kubernetes Services** to find the backup instance you created in the previous section.\n1. Select the backup instance to see the restore points list. In this article, the instance name is a string similar to `wlsonaks*\\wlsaksinstance20240109`.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backup-instance-restorepoints.png\" alt-text=\"Screenshot of the Azure portal that shows the Backup instance restore points.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backup-instance-restorepoints.png\":::\n\n1. Select the latest **Operational and Vault-standard** backup, then select **More options**. Select **Restore** to start the restore process.\n1. On the **Restore** page, the default pane is **Restore point**. Select **Previous** to change to the **Basics** pane. For **Restore Region**, select **Secondary Region**, then select **Next: Restore point**.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backup-instance-restore-basics.png\" alt-text=\"Screenshot of the Azure portal that shows the Restore Basics pane.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backup-instance-restore-basics.png\":::\n\n1. On the **Restore point** pane, for **Select the tier to restore**, select **Vault Store**, then select **Next:Restore parameters**.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backup-instance-restore-restorepoint.png\" alt-text=\"Screenshot of the Azure portal that shows the Restore point pane.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backup-instance-restore-restorepoint.png\":::\n\n1. On the **Restore parameters** pane, use the following steps:\n\n   1. For **Select Target cluster**, select the AKS cluster that you created in the West US 2 region. You run into a permission issue as the following screenshot shows. Select **Grant Permission** to mitigate the errors.\n   1. For **Backup Staging Location**, select the Storage Account that you created in **West US 2**. You run into a permission issue as the following screenshot shows. Select **Assign missing roles** to mitigate the errors.\n   1. If the errors still happen after role assignments finishes, select **Revalidate** to refresh the permissions.\n\n      :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backup-instance-restore-restoreparameters-targetcluster.png\" alt-text=\"Screenshot of the Azure portal that shows the Restore parameter pane.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backup-instance-restore-restoreparameters-targetcluster.png\":::\n\n   1. When granting missing permissions, if asked to specify a **Scope**, accept the default value.\n   1. Select **Validate**. You should see the message, **Validation completed successfully**. Otherwise, troubleshoot and resolve the problem before continuing.\n\n1. Select **Next:Review + restore**, then select **Restore**. It takes about 10 minutes to restore the WLS cluster.\n\n1. You can monitor the restore process from **Backup center** > **Monitoring + reporting** > **Backup jobs**, as shown in the following screenshot:\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backup-restore-progress.png\" alt-text=\"Screenshot of the Azure portal that shows a CrossRegionRestore in progress.\" lightbox=\"media/migrate-weblogic-to-aks-with-ha-geo-redundancy/backup-restore-progress.png\":::\n\n1. Select **Refresh** to see the latest progress.\n\n1. After the process completes without error, stop the backup AKS cluster. Failure to do so causes ownership conflicts when you access the TLOG database in later steps.\n\n1. Start the primary cluster.\n\n## Set up an Azure Traffic Manager\n\n[!INCLUDE [ha-dr-for-wls-aks-azure-traffic-manager](includes/ha-dr-for-wls-aks-azure-traffic-manager.md)]\n\n## Test failover from primary to secondary\n\nTo test failover, you manually fail your primary database server and WLS cluster over to the secondary database server and WLS cluster in this section.\n\n[!INCLUDE [ha-dr-for-wls-azure-verify-sample-app](includes/ha-dr-for-wls-azure-verify-sample-app.md)]\n\n### Failover to the secondary site\n\nUse the following steps to fail over from primary to secondary.\n\nFirst, use the following steps to stop the primary AKS cluster:\n\n1. Open the Azure portal and go to the resource group that was provisioned in the [Deploy WLS on AKS](#deploy-wls-on-aks) section.\n1. Open the AKS cluster listed in the resource group.\n1. Select **Stop** to stop the AKS cluster. Make sure the deployment finishes before moving on.\n\nNext, use the following steps to fail over the Azure SQL Database from the primary server to the secondary server.\n\n1. Switch to the browser tab of your Azure SQL Database failover group.\n1. Select **Failover** > **Yes**.\n1. Wait until it completes.\n\nNext, use the following steps to start the secondary cluster.\n\n1. Open the Azure portal and go to the resource group that has AKS cluster in secondary region.\n1. Open the AKS cluster listed in the resource group.\n1. Select **Start** to start the AKS cluster. Make sure the deployment finishes before moving on.\n\n[!INCLUDE [ha-dr-for-wls-azure-verify-sample-app-test-failover](includes/ha-dr-for-wls-azure-verify-sample-app-test-failover.md)]\n\n### Fail back to the primary site\n\nTo fail back to the primary site, you have to ensure the two clusters have a mirror backup configuration. You can achieve this state by using the following steps:\n\n1. Enable the AKS cluster backups in the West US 2 region by following the steps in the [Configure geo-redundancy using Azure Backup](#configure-geo-redundancy-using-azure-backup) section, starting from step 4.\n1. Restore the latest Vault Tier backup to the cluster in the East US region by following  the steps in the [Prepare to restore the WLS cluster in a secondary region](#prepare-to-restore-the-wls-cluster-in-a-secondary-region) section. Skip the steps you already completed.\n1. Use similar steps in the [Failover to the secondary site](#failover-to-the-secondary-site) section to fail back to the primary site including database server and cluster.\n\n## Clean up resources\n\nIf you're not going to continue to use the WLS clusters and other components, use the following steps to delete the resource groups to clean up the resources used in this tutorial:\n\n1. In the search box at the top of the Azure portal, enter **Backup vaults** and select the backup vaults from the search results.\n1. Select **Manage** > **Properties** > **Soft delete** > **Update**. Next to **Enable soft Delete**, unselect the checkbox.\n1. Select **Manage** > **Backup instances**. Select the instance you created and delete it.\n1. Enter the resource group name of Azure SQL Database servers - for example, `myResourceGroup` - in the search box at the top of the Azure portal, and select the matched resource group from the search results.\n1. Select **Delete resource group**.\n1. In **Enter resource group name to confirm deletion**, enter the resource group name.\n1. Select **Delete**.\n1. Repeat steps 4-7 for the resource group of the Traffic Manager - for example, `myResourceGroupTM1`.\n1. Repeat steps 4-7 for the resource group of the primary WLS cluster - for example, `wls-aks-eastus-20240109`.\n1. Repeat steps 4-7 for the resource group of the secondary WLS cluster - for example, `wls-aks-westus-20240109`.\n\n## Next steps\n\nIn this tutorial, you set up an HA/DR solution consisting of an active-passive application infrastructure tier with an active-passive database tier, and in which both tiers span two geographically different sites. At the first site, both the application infrastructure tier and the database tier are active. At the second site, the secondary domain is shut down, and the secondary database is on standby.\n\nContinue to explore the following references for more options to build HA/DR solutions and run WLS on Azure:\n\n> [!div class=\"nextstepaction\"]\n> [Disaster Recovery solutions for Oracle Fusion Middleware products](https://docs.oracle.com/en/middleware/fusion-middleware/12.2.1.4/asdrg/index.html#Oracle%C2%AE-Fusion-Middleware)\n> [!div class=\"nextstepaction\"]\n> [Azure reliability documentation](/azure/reliability)\n> [!div class=\"nextstepaction\"]\n> [Build solutions for high availability](/azure/architecture/high-availability/building-solutions-for-high-availability)\n> [!div class=\"nextstepaction\"]\n> [Automatic failover using Azure Traffic Manager](/azure/networking/disaster-recovery-dns-traffic-manager#automatic-failover-using-azure-traffic-manager)\n> [!div class=\"nextstepaction\"]\n> [Learn more about Oracle WebLogic on Azure VMs](/azure/virtual-machines/workloads/oracle/oracle-weblogic)\n> [!div class=\"nextstepaction\"]\n> [Learn more about Oracle WebLogic on AKS](/azure/virtual-machines/workloads/oracle/weblogic-aks)\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics.md",
    "content": "---\ntitle: \"Tutorial: Migrate Oracle WebLogic Server to Azure Kubernetes Service (AKS) with KEDA scaler based on Prometheus Metrics\"\ndescription: Shows how to deploy WebLogic Server to Azure Kubernetes Service (AKS) and enable autoscaling with KEDA scaler based on Prometheus Metrics.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.topic: tutorial\nms.date: 01/13/2026\nms.custom:\n  - devx-track-extended-java\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-wls\n  - devx-track-javaee-wls-aks\n  - migration-java\n  - sfi-image-nochange\n---\n\n# Tutorial: Migrate Oracle WebLogic Server to Azure Kubernetes Service (AKS) with KEDA scaler based on Prometheus Metrics\n\nThis tutorial shows you how to migrate Oracle WebLogic Server (WLS) to Azure Kubernetes Service (AKS) and configure automatic horizontal scaling based on Prometheus metrics.\n\nIn this tutorial, you accomplish the following tasks:\n\n> [!div class=\"checklist\"]\n>\n> - Learn which WebLogic application metrics you can export using WebLogic Monitoring Exporter.\n> - Deploy and run a WebLogic application on AKS using an Azure marketplace offer.\n> - Enable the Azure Monitor managed service for Prometheus using an Azure marketplace offer.\n> - Feed WLS metrics to an Azure Monitor workspace using an Azure marketplace offer.\n> - Integrate Kubernetes Event-driven Autoscaling (KEDA) with an AKS cluster using an Azure marketplace offer.\n> - Create a KEDA scaler based on Prometheus Metrics.\n> - Validate the scaler configuration.\n\nThe following diagram illustrates the architecture you build:\n\n<!-- https://github.com/oracle/weblogic-azure/blob/main/weblogic-azure-aks/src/main/resources/diagrams/wls-aks-diagram-autoscaling.vsdx -->\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/weblogic-aks-autoscaling-architecture.png\" alt-text=\"Diagram of the solution architecture of WLS on AKS with KEDA scaler based on Prometheus Metrics.\" lightbox=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/weblogic-aks-autoscaling-architecture.png\" border=\"false\":::\n\nThe [Oracle WebLogic Server on AKS offer](https://aka.ms/wlsaks) runs a WLS operator and a WLS domain on AKS. The WLS operator manages a WLS domain deployed using a [model in image](https://oracle.github.io/weblogic-kubernetes-operator/samples/domains/model-in-image/) domain source type. To learn more about the WLS operator, see [Oracle WebLogic Kubernetes Operator](https://oracle.github.io/weblogic-kubernetes-operator/).\n\nThe WebLogic Monitoring Exporter scrapes WebLogic Server metrics and feeds them to Prometheus. The exporter uses the WebLogic Server 12.2.1.x [RESTful Management Interface](https://docs.oracle.com/middleware/1221/wls/WLRUR/overview.htm#WLRUR111) for accessing runtime state and metrics.\n\nThe Azure Monitor managed service for Prometheus collects and saves metrics from WLS at scale using a Prometheus-compatible monitoring solution, based on the [Prometheus](https://aka.ms/azureprometheus-promio) project from the Cloud Native Computing Foundation. For more information, see [Azure Monitor managed service for Prometheus](/azure/azure-monitor/essentials/prometheus-metrics-overview).\n\nThis article integrates KEDA with your AKS cluster to scale the WLS cluster based on Prometheus metrics from the Azure Monitor workspace. KEDA monitors the Azure Monitor managed service for Prometheus and feeds that data to AKS and the Horizontal Pod Autoscaler (HPA) to drive rapid scaling of the WLS workload.\n\nThe following WLS state and metrics are exported by default. You can configure the exporter to export other metrics on demand. For a detailed description of WebLogic Monitoring Exporter configuration and usage, see [WebLogic Monitoring Exporter](https://blogs.oracle.com/weblogicserver/exporting-metrics-from-weblogic-server).\n\n<!-- https://github.com/oracle/weblogic-azure/blob/main/weblogic-azure-aks/src/main/resources/diagrams/wls-aks-diagram-autoscaling.vsdx -->\n\n:::image type=\"complex\" source=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/weblogic-metrics.png\" alt-text=\"WebLogic Metrics.\" lightbox=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/weblogic-metrics.png\" border=\"false\":::\nThe following table shows the exported WebLogic metrics:\n\n| Category               | Category hierarchy                                                                | Metrics                                                                                                                                                                                                                                                                                                               |\n|------------------------|-----------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Servlets               | ServerRuntime -> ApplicationRuntime -> ComponentRuntime -> WebAppComponentRuntime | \"invocationTotalCount\", \"reloadTotal\", \"executionTimeAverage\", \"poolMaxCapacity\", \"executionTimeTotal\", \"reloadTotalCount\", \"executionTimeHigh\", \"executionTimeLow\"                                                                                                                                                   |\n| WebAppComponentRuntime | ServerRuntime -> ApplicationRuntime -> ComponentRuntime                           | \"deploymentState\", \"contextRoot\", \"sourceInfo\", \"openSessionsHighCount\", \"openSessionsCurrentCount\", \"sessionsOpenedTotalCount\", \"sessionCookieMaxAgeSecs\", \"sessionInvalidationIntervalSecs\", \"sessionTimeoutSecs\", \"singleThreadedServletPoolSize\", \"sessionIDLength\", \"servletReloadCheckSecs\", \"jSPPageCheckSecs\" |\n| WorkManagerRuntimes    | ServerRuntime -> ApplicationRuntime                                               | \"pendingRequests\", \"completedRequests\", \"stuckThreadCount\"                                                                                                                                                                                                                                                            |\n| JVMRuntime             | JVMRuntime                                                                        | \"heapFreeCurrent\", \"heapFreePercent\", \"heapSizeCurrent\", \"heapSizeMax\", \"uptime\", \"processCpuLoad\"                                                                                                                                                                                                                    |\n:::image-end:::\n\n## Prerequisites\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n- Make sure you have either the `Owner` role or the `Contributor` and `User Access Administrator` roles in the subscription. You can verify the assignment by following the steps in [List Azure role assignments using the Azure portal](/azure/role-based-access-control/role-assignments-list-portal).\n- Prepare a local machine with either Windows with WSL, GNU/Linux, or macOS installed.\n- Install Azure CLI version 2.54.0 or higher to run Azure CLI commands.\n- Install and set up [kubectl](/cli/azure/aks#az-aks-install-cli).\n- Install [cURL](https://curl.se/).\n- Have the credentials for an Oracle single sign-on (SSO) account. To create one, see [Create Your Oracle Account](https://profile.oracle.com/myprofile/account/create-account.jspx).\n- Use the following steps to accept the license terms for WLS:\n  1. Visit the [Oracle Container Registry](https://container-registry.oracle.com/) and sign in.\n  1. If you have a support entitlement, select **Middleware**, then search for and select **weblogic_cpu**.\n  1. If you don't have a support entitlement from Oracle, select **Middleware**, then search for and select **weblogic**.\n  1. Accept the license agreement.\n\n## Prepare the sample application\n\nThis article uses [testwebapp](https://github.com/oracle/weblogic-kubernetes-operator/tree/main/integration-tests/src/test/resources/apps/testwebapp) from the [weblogic-kubernetes-operator](https://github.com/oracle/weblogic-kubernetes-operator) repository as a sample application.\n\nUse the following commands to download the prebuilt sample app and expand it into a directory. Because this article writes several files, these commands create a top level directory to contain everything.\n\n```bash\nexport BASE_DIR=$PWD/wlsaks\nmkdir $BASE_DIR && cd $BASE_DIR\ncurl -L -o testwebapp.war https://aka.ms/wls-aks-testwebapp\nunzip -d testwebapp testwebapp.war\n```\n\n### Modify the sample application\n\nThis article uses the metric `openSessionsCurrentCount` to scale up and scale down the WLS cluster. By default, the session timeout on WebLogic Server is 60 minutes. To observe the scaling down capability quickly, use the following steps to set a short timeout:\n\n1. Use the following command to specify a session timeout of 150 seconds using `wls:timeout-secs`. The `HEREDOC` format is used to overwrite the file at **testwebapp/WEB-INF/weblogic.xml** with the desired content.\n\n   ```xml\n   cat <<EOF > testwebapp/WEB-INF/weblogic.xml\n   <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n   <wls:weblogic-web-app xmlns:wls=\"http://xmlns.oracle.com/weblogic/weblogic-web-app\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd\">\n       <wls:weblogic-version>12.2.1</wls:weblogic-version>\n       <wls:jsp-descriptor>\n       <wls:keepgenerated>false</wls:keepgenerated>\n       <wls:debug>false</wls:debug>\n     </wls:jsp-descriptor>\n     <wls:context-root>testwebapp</wls:context-root>\n     <wls:session-descriptor>\n       <wls:timeout-secs>150</wls:timeout-secs>\n    </wls:session-descriptor>\n   </wls:weblogic-web-app>\n   EOF\n   ```\n\n1. Use the following command to rezip the sample app:\n\n   ```bash\n   cd testwebapp && zip -r ../testwebapp.war * && cd ..\n   ```\n\n### Create an Azure Storage account and upload the application\n\nUse the following steps to create a storage account and container. Some of these steps direct you to other guides. After completing the steps, you can upload a sample application to deploy on WLS.\n\n1. Sign in to the [Azure portal](https://aka.ms/publicportal).\n1. Create a storage account by following the steps in [Create a storage account](/azure/storage/common/storage-account-create). Use the following specializations for the values in that article:\n   - Create a new resource group for the storage account.\n   - For **Region**, select **East US**.\n   - For **Storage account name**, use the same value as the resource group name.\n   - For **Performance**, select **Standard**.\n   - The remaining tabs need no specializations.\n1. Proceed to validate and create the account, then return to this article.\n1. Create a storage container within the account by following the steps in the [Create a container](/azure/storage/blobs/storage-quickstart-blobs-portal#create-a-container) section of [Quickstart: Upload, download, and list blobs with the Azure portal](/azure/storage/blobs/storage-quickstart-blobs-portal).\n1. In the same article, follow the steps in the [Upload a block blob](/azure/storage/blobs/storage-quickstart-blobs-portal#upload-a-block-blob) section to upload the **testwebapp.war** file. Then, return to this article.\n\n## Deploy WLS on AKS using the Azure Marketplace offer\n\nIn this section, you create a WLS cluster on AKS using the Oracle [WebLogic Server on AKS](https://aka.ms/wlsaks) offer. The offer provides a full feature set for easily deploying WebLogic Server on AKS. This article focuses on the advanced dynamic scaling capabilities of the offer. For more information about the offer, see [Deploy a Java application with WebLogic Server on an Azure Kubernetes Service (AKS) cluster](/azure/aks/howto-deploy-java-wls-app). For the complete reference documentation for the offer, see [the Oracle documentation](https://aka.ms/wls-aks-docs).\n\nThis offer implements the following choices for horizontal autoscaling:\n\n- Kubernetes Metrics Server. This choice sets up all necessary configuration at deployment time. A horizontal pod autoscaler (HPA) is deployed with a choice of metrics. You can further customize the HPA after deployment.\n\n- WebLogic Monitoring Exporter. This choice automatically provisions WebLogic Monitoring Exporter, Azure Monitor managed service for Prometheus, and KEDA. After the offer deployment completes, the WLS metrics are exported and saved in the Azure Monitor workspace. KEDA is installed with the ability to retrieve metrics from the Azure Monitor workspace.\n\n  With this option, you must take more steps after deployment to complete the configuration.\n\nThis article describes the second option. Use the following steps to to complete the configuration:\n\n1. Open the Oracle [WebLogic Server on AKS](https://aka.ms/wlsaks) offer in your browser and select **Create**. You should see the **Basics** pane of the offer.\n\n1. Use the following steps to fill out the **Basics** pane:\n\n   1. Ensure that the value shown for **Subscription** is the same one that has the roles listed in the prerequisites section.\n   1. In the **Resource group** field, select **Create new** and fill in a unique value for the resource group - for example, **wlsaks-eastus-20240109**.\n   1. Under **Instance details**, for **Region**, select **East US**.\n   1. Under **Credentials WebLogic**, provide a password for **WebLogic Administrator** and **WebLogic Model encryption**, respectively. Save aside the username and password for **WebLogic Administrator**.\n   1. Next to **Optional Basic Configuration**, select **No**.\n   1. Under **Optional Basic Configuration**, set **Maximum dynamic cluster size** to 10. This value enables you to observe the autoscaling behavior.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wlsaks-offer-portal-basis.png\" alt-text=\"Screenshot of the Azure portal showing the Oracle WebLogic Server on AKS Basics pane.\" lightbox=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wlsaks-offer-portal-basis.png\":::\n\n1. Select **Next** and go to the **AKS** tab.\n\n1. Under **Image selection**, use the following steps:\n\n   1. For **Username for Oracle Single Sign-On authentication**, fill in your Oracle SSO username from the prerequisites.\n   1. For **Password for Oracle Single Sign-On authentication**, fill in your Oracle SSO credentials from the prerequisites.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wlsaks-offer-portal-aks-image-selection.png\" alt-text=\"Screenshot of the Azure portal showing the Oracle WebLogic Server on AKS pane - Image Selection.\" lightbox=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wlsaks-offer-portal-aks-image-selection.png\":::\n\n1. Under **Application**, use the following steps:\n\n   1. In the **Application** section, next to **Deploy an application?**, select Yes.\n   1. Next to **Application package (.war,.ear,.jar)**, select **Browse**.\n   1. Start typing the name of the storage account from the preceding section. When the desired storage account appears, select it.\n   1. Select the storage container from the preceding section.\n   1. Select the checkbox next to **testwebapp.war**, which you uploaded in the previous section. Select **Select**.\n   1. Select **Next**.\n\n      :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wlsaks-offer-portal-aks-app-selection.png\" alt-text=\"Screenshot of the Azure portal showing the Oracle WebLogic Server on AKS pane - App Selection.\" lightbox=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wlsaks-offer-portal-aks-app-selection.png\":::\n\n1. Leave the default values in the **TLS/SSL Configuration** pane. Select **Next** to go to the **Load Balancing** pane, then use the following steps:\n\n   1. Leave the default values for all option except **Create ingress for Administration Console. Make sure no application with path /console\\*, it will cause conflict with Administration Console path**. For this option, select **Yes**.\n   1. Leave the default values for the remaining fields.\n   1. Select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wlsaks-offer-portal-appgateway-ingress.png\" alt-text=\"Screenshot of the Azure portal showing the Oracle WebLogic Server Cluster on AKS Load Balancing pane.\" lightbox=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wlsaks-offer-portal-appgateway-ingress.png\":::\n\n1. Leave the default values for the **DNS** pane, then select **Next** to go to the **Database** pane.\n\n1. Leave the default values for the **Database** pane, select **Next** to go to the **Autoscaling** pane, then use the following steps:\n\n   1. Next to **Provision resources for horizontal autoscaling?**, select **Yes**.\n   1. Under **Horizontal autoscaling settings**, next to **Select autoscaling option.**, select **WebLogic Monitor Exporter (advanced autoscaling)**.\n   1. Select **Review + create**.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wlsaks-offer-autoscaling.png\" alt-text=\"Screenshot of the Azure portal showing the Oracle WebLogic Server Cluster on AKS Horizontal Autoscaling pane.\" lightbox=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wlsaks-offer-autoscaling.png\":::\n\n1. Wait until **Running final validation...** successfully completes, then select **Create**. After a while, you should see the **Deployment** page where **Deployment is in progress** is displayed.\n\nIf you see any problems during **Running final validation...**, fix them and try again.\n\n## Connect to the AKS cluster\n\nThe following sections require a terminal with `kubectl` installed to manage the WLS cluster. To install `kubectl` locally, use the [az aks install-cli](/cli/azure/aks#az-aks-install-cli) command.\n\nUse the following steps to connect to the AKS cluster:\n\n1. Open the Azure portal and go to the resource group that you provisioned in the [Deploy WLS on AKS using the Azure Marketplace offer](#deploy-wls-on-aks-using-the-azure-marketplace-offer) section.\n1. Select the resource of type **Kubernetes service** from resource list.\n1. Select **Connect**. Guidance to connect the AKS cluster appears.\n1. Select **Azure CLI** and follow the steps to connect to the AKS cluster in your local terminal.\n\n## Retrieve metrics from the Azure Monitor workspace\n\nUse the following steps to see metrics in the Azure Monitor workspace using Prometheus Query Language (PromQL) queries:\n\n1. In the Azure portal, view the resource group you used in the [Deploy WLS on AKS using the Azure Marketplace offer](#deploy-wls-on-aks-using-the-azure-marketplace-offer) section.\n1. Select the resource of type **Azure Monitor workspace**.\n1. Under **Managed Prometheus**, select **Prometheus explorer**.\n1. Input `webapp_config_open_sessions_current_count` to query the current account of open sessions, as shown in the following screenshot:\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/prometheus-explorer.png\" alt-text=\"Screenshot of the Azure portal showing the Prometheus explorer.\" lightbox=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/prometheus-explorer.png\":::\n\n> [!NOTE]\n> You can use the following command to access the metrics by exposing the WebLogic Monitoring Exporter:\n>\n> ```bash\n> cat <<EOF | kubectl apply -f -\n> apiVersion: v1\n> kind: Service\n> metadata:\n>   name: sample-domain1-cluster-1-exporter\n>   namespace: sample-domain1-ns\n> spec:\n>   ports:\n>   - name: default\n>     port: 8080\n>     protocol: TCP\n>     targetPort: 8080\n>   selector:\n>     weblogic.domainUID: sample-domain1\n>     weblogic.clusterName: cluster-1\n>   sessionAffinity: None\n>   type: LoadBalancer\n> EOF\n>\n> kubectl get svc -n sample-domain1-ns -w\n> ```\n>\n> Wait for the `EXTERNAL-IP` column in the row for `sample-domain1-cluster-1-exporter` to switch from `<pending>` to an IP address. Then, open the URL `http://<exporter-public-ip>:8080/metrics` in a browser and sign in with the credentials you specified when deploying the offer. Here, you can find all the available metrics. You can input any of these in the PromQL window to display them in Azure Monitor. For example, `heap_free_percent` shows an interesting graph. To watch the memory pressure as the load is applied to the application, set **Auto refresh** and **Time range** to the smallest possible interval and leave the tab open.\n\n## Create the KEDA scaler\n\nScalers define how and when KEDA should scale a deployment. This article uses the [Prometheus scaler](https://keda.sh/docs/2.10/scalers/prometheus/) to retrieve Prometheus metrics from the Azure Monitor workspace.\n\nThis article uses `openSessionsCurrentCount` as the trigger. The rule for this metric is described as follows. When the average open session count is more than 10, scale up the WLS cluster until it reaches the maximum replica size. Otherwise, scale down the WLS cluster until it reaches its minimum replica size. The following table lists the important parameters:\n\n| Parameter name    | Value                                                                                                                             |\n|-------------------|-----------------------------------------------------------------------------------------------------------------------------------|\n| `serverAddress`   | The Query endpoint of your Azure Monitor workspace.                                                                               |\n| `metricName`      | `webapp_config_open_sessions_current_count`                                                                                       |\n| `query`           | `sum(webapp_config_open_sessions_current_count{app=\"app1\"})`                                                                      |\n| `threshold`       | 10                                                                                                                                |\n| `minReplicaCount` | 1                                                                                                                                 |\n| `maxReplicaCount` | The default value is 5. If you modified the maximum cluster size during offer deployment, replace with your maximum cluster size. |\n\nBecause you selected **WebLogic Monitoring Exporter** at deployment time, a KEDA scaler is ready to deploy. The following steps show you how to configure the KEDA scaler for use with your AKS cluster:\n\n1. Open the Azure portal and go to the resource group that you provisioned in the [Deploy WLS on AKS using the Azure Marketplace offer](#deploy-wls-on-aks-using-the-azure-marketplace-offer) section.\n1. In the navigation pane, in the **Settings** section, select **Deployments**. You see an ordered list of the deployments to this resource group, with the most recent one first.\n1. Scroll to the oldest entry in this list. This entry corresponds to the deployment you started in the previous section. Select the oldest deployment, whose name starts with something similar to `oracle.20210620-wls-on-aks`.\n1. Select **Outputs**. This option shows the list of outputs from the deployment.\n1. The **kedaScalerServerAddress** value is the server address that saves the WLS metrics. KEDA is able to access and retrieve metrics from the address.\n1. The **shellCmdtoOutputKedaScalerSample** value is the `base64` string of a scaler sample. Copy the value and run it in your terminal. The command should look similar to the following example:\n\n   ```bash\n   echo -e YXBpVm...XV0aAo= | base64 -d > scaler.yaml\n   ```\n\n   This command produces a **scaler.yaml**  file in the current directory.\n\n1. Modify the `metric:` and `query:` lines in **scaler.yaml**  as shown in the following example:\n\n   ```yaml\n   metricName: webapp_config_open_sessions_current_count\n   query: sum(webapp_config_open_sessions_current_count{app=\"app1\"})\n   ```\n\n   > [!NOTE]\n   > When you deploy an app with the offer, it's named `app1` by default. You can use the following steps to access the WLS admin console to obtain the application name:\n   >\n   > 1. Use the preceding steps to view the deployment outputs.\n   > 1. The **adminConsoleExternalUrl** value is the fully qualified, public Internet visible link to the WLS admin console. Select the copy icon next to the field value to copy the link to your clipboard.\n   > 1. Paste the value to your browser and open the WLS admin console.\n   > 1. Sign in with the WLS admin account, which you saved aside during in the [Deploy WLS on AKS using the Azure Marketplace offer](#deploy-wls-on-aks-using-the-azure-marketplace-offer) section.\n   > 1. Under **Domain Structure**, select **Deployments**. You find **app1** listed.\n   > 1. Select **app1** to find that the **Name** value for the application is `app1`. Use `app1` as the application name in the query.\n\n1. If desired, modify the `maxReplicaCount:` line in **scaler.yaml**  as shown in the following example. It's an error to set this value higher than what you specified at deployment time on the **AKS** tab.\n\n   ```yaml\n   maxReplicaCount: 10\n   ```\n\n1. Use the following command to create the KEDA scaler rule by applying **scaler.yaml** :\n\n   ```bash\n   kubectl apply -f scaler.yaml\n   ```\n\n   It takes several minutes for KEDA to retrieve metrics from the Azure Monitor workspace. You can watch the scaler status by using the following command:\n\n   ```bash\n   kubectl get hpa -n sample-domain1-ns -w\n   ```\n\n   After the scaler is ready to work, the output looks similar to the following content. The value in the `TARGETS` column switches from `<unknown>` to `0`.\n\n   ```output\n   NAME                                       REFERENCE                          TARGETS              MINPODS   MAXPODS   REPLICAS   AGE\n   keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)           1         5         2          15s\n   ```\n\n\n## Test autoscaling\n\nNow, you're ready to observe the autoscaling capability. This article opens new sessions using `curl` to access the application. After the average session count is larger than 10, the scaling-up action happens. The sessions last for 150 seconds, and the open session count decreases as the sessions expire. After the average session count is less than 10, the scaling-down action happens. Use the following steps to cause the scaling-up and scaling-down actions:\n\n1. Use the following steps to obtain the application URL:\n\n   1. Use the preceding steps to view the deployment outputs.\n   1. The **clusterExternalUrl** value is the fully qualified, public, internet-visible link to the sample app deployed in WLS on this AKS cluster. To copy the link to your clipboard, select the copy icon next to the field value.\n   1. The URL to access **testwebapp.war** is `${clusterExternalUrl}testwebapp` - for example, `http://wlsgw202403-wlsaks0314-domain1.eastus.cloudapp.azure.com/testwebapp/`.\n\n1. Run the `curl` command to access the application and cause new sessions. The following example opens 22 new sessions. The sessions are expired after 150 seconds. Replace the **WLS_CLUSTER_EXTERNAL_URL** value with yours.\n\n   ```bash\n   COUNTER=0\n   MAXCURL=22\n   WLS_CLUSTER_EXTERNAL_URL=\"http://wlsgw202403-wlsaks0314-domain1.eastus.cloudapp.azure.com/\"\n   APP_URL=\"${WLS_CLUSTER_EXTERNAL_URL}testwebapp/\"\n\n   while [ $COUNTER -lt $MAXCURL ]; do curl ${APP_URL}; let COUNTER=COUNTER+1; sleep 1;done\n   ```\n\n1. In two separate shells, use the following commands:\n\n   - Use the following command to observe the scaler:\n\n     ```bash\n     kubectl get hpa -n sample-domain1-ns -w\n     ```\n\n     This command produces output that looks similar to the following example:\n\n     ```output\n     $ kubectl get hpa -n sample-domain1-ns -w\n     NAME                                       REFERENCE                          TARGETS          MINPODS   MAXPODS   REPLICAS   AGE\n     keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         1         24m\n     keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         1         24m\n     keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   5/10 (avg)       1         10         1         26m\n     keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   22/10 (avg)      1         10         1         27m\n     keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   7334m/10 (avg)   1         10         3         29m\n     keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   14667m/10 (avg)  1         10         3         48m\n     keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         3         30m\n     keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         3         35m\n     keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         1         35m\n     keda-hpa-azure-managed-prometheus-scaler   Cluster/sample-domain1-cluster-1   0/10 (avg)       1         10         5         53m\n     ```\n\n   - In a separate shell, use the following command to observe the WLS pods:\n\n     ```bash\n     kubectl get pod -n sample-domain1-ns -w\n     ```\n\n     This command produces output that looks similar to the following example:\n\n     ```output\n     $ kubectl get pod -n sample-domain1-ns -w\n     NAME                             READY   STATUS              RESTARTS   AGE\n     sample-domain1-admin-server      2/2     Running             0          28h\n     sample-domain1-managed-server1   2/2     Running             0          28h\n     sample-domain1-managed-server1   2/2     Running             0          28h\n     sample-domain1-managed-server2   0/2     Pending             0          0s\n     sample-domain1-managed-server2   0/2     Pending             0          0s\n     sample-domain1-managed-server2   0/2     ContainerCreating   0          0s\n     sample-domain1-managed-server3   0/2     Pending             0          0s\n     sample-domain1-managed-server3   0/2     Pending             0          0s\n     sample-domain1-managed-server3   0/2     ContainerCreating   0          0s\n     sample-domain1-managed-server3   1/2     Running             0          1s\n     sample-domain1-admin-server      2/2     Running             0          95m\n     sample-domain1-managed-server1   2/2     Running             0          94m\n     sample-domain1-managed-server2   2/2     Running             0          56s\n     sample-domain1-managed-server3   2/2     Running             0          55s\n     sample-domain1-managed-server4   1/2     Running             0          9s\n     sample-domain1-managed-server5   1/2     Running             0          9s\n     sample-domain1-managed-server5   2/2     Running             0          37s\n     sample-domain1-managed-server4   2/2     Running             0          42s\n     sample-domain1-managed-server5   1/2     Terminating         0          6m46s\n     sample-domain1-managed-server5   1/2     Terminating         0          6m46s\n     sample-domain1-managed-server4   1/2     Running             0          6m51s\n     sample-domain1-managed-server4   1/2     Terminating         0          6m53s\n     sample-domain1-managed-server4   1/2     Terminating         0          6m53s\n     sample-domain1-managed-server3   1/2     Running             0          7m40s\n     sample-domain1-managed-server3   1/2     Terminating         0          7m45s\n     sample-domain1-managed-server3   1/2     Terminating         0          7m45s\n     ```\n\nThe graph in the Azure Monitor workspace looks similar to the following screenshot:\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wls-autoscaling-graph.png\" alt-text=\"Screenshot of the Azure portal showing the Prometheus explorer graph.\" lightbox=\"media/migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics/wls-autoscaling-graph.png\":::\n\n## Clean up resources\n\nTo avoid Azure charges, you should clean up unnecessary resources. When you no longer need the cluster, use the [az group delete](/cli/azure/group#az-group-delete) command. The following commands remove the resource group, container service, container registry, and all related resources:\n\n```azurecli\naz group delete --name <wls-resource-group-name> --yes --no-wait\naz group delete --name <ama-resource-group-name> --yes --no-wait\n```\n\n## Next steps\n\nContinue to explore the following references for more options to build autoscaling solutions and run WLS on Azure:\n\n> [!div class=\"nextstepaction\"]\n> [Scaling options for applications in Azure Kubernetes Service (AKS)](/azure/aks/concepts-scale)\n> [!div class=\"nextstepaction\"]\n> [What are solutions for running Oracle WebLogic Server on Azure Kubernetes Service?](/azure/virtual-machines/workloads/oracle/weblogic-aks)\n> [!div class=\"nextstepaction\"]\n> [WebLogic Kubernetes Operator Scaling](https://aka.ms/wlsoperator-scaling)\n> [!div class=\"nextstepaction\"]\n> [Using Prometheus and Grafana to Monitor WebLogic Server on Kubernetes](https://blogs.oracle.com/weblogicserver/post/using-prometheus-and-grafana-to-monitor-weblogic-server-on-kubernetes)\n> [!div class=\"nextstepaction\"]\n> [WebLogic Kubernetes Operator](https://aka.ms/wlsoperator)\n> [!div class=\"nextstepaction\"]\n> [What are solutions for running Oracle WebLogic Server on Azure Virtual Machines?](/azure/virtual-machines/workloads/oracle/oracle-weblogic)\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-to-aks-within-an-existing-vnet.md",
    "content": "---\ntitle: \"Tutorial: Migrate Oracle WebLogic Server to Azure Kubernetes Service (AKS) within a custom virtual network\"\ndescription: Shows how to deploy WebLogic Server to Azure Kubernetes Service (AKS) within a custom virtual network.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.topic: tutorial\nms.date: 01/13/2026\nms.custom:\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-wls\n  - devx-track-javaee-wls-aks\n  - migration-java\n  - sfi-image-nochange\n---\n\n# Tutorial: Migrate Oracle WebLogic Server to Azure Kubernetes Service (AKS) within a custom virtual network\n\nThis tutorial shows you how to deploy the Oracle WebLogic Server (WLS) on Azure Kubernetes Service (AKS) offer that integrates with a preexisting virtual network in your subscription.\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> - Create a custom virtual network and create the infrastructure within the network.\n> - Create an AKS cluster in the virtual network.\n> - Run Oracle WebLogic Server on AKS with the pre-existing AKS cluster in the pre-existing virtual network.\n> - Expose Oracle WebLogic Server with Azure Application Gateway as a load balancer.\n> - Validate successful deployment.\n\n## Prerequisites\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n- Prepare a local machine with Unix-like operating system installed - for example, Ubuntu, macOS, or Windows Subsystem for Linux.\n- [Install the Azure CLI](/cli/azure/install-azure-cli) 2.73.0 or above to run Azure CLI commands.\n  - Sign in with Azure CLI by using the [az login](/cli/azure/reference-index#az-login) command. To finish the authentication process, follow the steps displayed in your terminal. See [Sign into Azure with Azure CLI](/cli/azure/authenticate-azure-cli#sign-into-azure-with-azure-cli) for other sign-in options.\n  - When you're prompted, install the Azure CLI extension on first use. For more information about extensions, see [Use and manage extensions with the Azure CLI](/cli/azure/azure-cli-extensions-overview).\n  - Run [az version](/cli/azure/reference-index?#az-version) to find the version and dependent libraries that are installed. To upgrade to the latest version, run [az upgrade](/cli/azure/reference-index?#az-upgrade).\n- The WLS on AKS marketplace offer requires permission to create user-assign managed identity and assign Azure roles. To assign Azure roles, you must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n- An Oracle account. The steps in [Oracle Container Registry](https://aka.ms/wls-aks-ocr) direct you to accept the license agreement for WebLogic Server images. Make note of your Oracle Account password and email.\n\n## Create a resource group\n\nCreate a resource group with [az group create](/cli/azure/group#az-group-create). This example creates a resource group named `myResourceGroup` in the `eastus` location:\n\n```azurecli\nexport RESOURCE_GROUP_NAME=\"myResourceGroup\"\nexport LOCATION=eastus\naz group create \\\n    --name ${RESOURCE_GROUP_NAME} \\\n    --location ${LOCATION}\n```\n\n## Create a custom virtual network\n\nThere are constraints when creating a custom virtual network. Before you create the virtual network in your environment, read the following articles:\n\n- [Network concepts for applications in Azure Kubernetes Service (AKS)](/azure/aks/concepts-network).\n- [Application Gateway infrastructure configuration](/azure/application-gateway/configuration-infrastructure).\n\nThe example in this section creates a virtual network with address space `192.168.0.0/16`, and creates two subnets used for AKS and Application Gateway.\n\nFirst, create a virtual network by using [az network vnet create](/cli/azure/network/vnet#az-network-vnet-create). The following example creates a default virtual network named `myVNet`:\n\n```azurecli\naz network vnet create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myVNet \\\n    --address-prefixes 192.168.0.0/16 \\\n    --location ${LOCATION}\n```\n\nNext, create a subnet by using [az network vnet subnet create](/cli/azure/network/vnet/subnet#az-network-vnet-subnet-create) for the AKS cluster. The following example creates a subnet named `myAKSSubnet`:\n\n```azurecli\naz network vnet subnet create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myAKSSubnet \\\n    --vnet-name myVNet \\\n    --address-prefixes 192.168.1.0/24\n```\n\nNext, create another subnet for the Application Gateway by using [az network vnet subnet create](/cli/azure/network/vnet/subnet#az-network-vnet-subnet-create). The following example creates a subnet named `myAppGatewaySubnet`:\n\n```azurecli\naz network vnet subnet create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myAppGatewaySubnet \\\n    --vnet-name myVNet \\\n    --address-prefixes 192.168.2.0/24\n```\n\nNext, use the following command to get the AKS subnet resource ID and store it in a variable for use later in this article:\n\n```azurecli\nexport AKS_SUBNET_ID=$(az network vnet subnet show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --vnet-name myVNet \\\n    --name myAKSSubnet \\\n    --query id \\\n    --output tsv)\n```\n\n## Create an AKS cluster in the virtual network\n\nUse the following command to create an AKS cluster in your virtual network and subnet by using the [az aks create](/cli/azure/aks#az-aks-create) command.\n\n```azurecli\naz aks create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myAKSCluster \\\n    --generate-ssh-keys \\\n    --enable-managed-identity \\\n    --node-count 3 \\\n    --node-vm-size Standard_DS3_v2 \\\n    --network-plugin azure \\\n    --vnet-subnet-id $AKS_SUBNET_ID \\\n    --yes\n```\n\n## Store Jakarta EE applications in a Storage account\n\nYou can deploy a Jakarta EE Application along with the WLS on AKS offer deployment. You have to upload the application file (**.war**, **.ear**, or **.jar**) to a preexisting Azure Storage Account and Storage Container within that account.\n\nCreate an Azure Storage Account using the [az storage account create](/cli/azure/storage/account#az-storage-account-create) command, as shown in the following example:\n\n```azurecli\nexport STORAGE_ACCOUNT_NAME=\"stgwlsaks$(date +%s)\"\naz storage account create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name ${STORAGE_ACCOUNT_NAME} \\\n    --location ${LOCATION} \\\n    --sku Standard_RAGRS \\\n    --kind StorageV2\n```\n\nCreate a container for storing blobs with the [az storage container create](/cli/azure/storage/container#az-storage-container-create) command. The following example uses the storage account key to authorize the operation to create the container. You can also use your Microsoft Entra account to authorize the operation to create the container. For more information, see [Authorize access to blob or queue data with Azure CLI](/azure/storage/blobs/authorize-data-operations-cli).\n\n```azurecli\nexport KEY=$(az storage account keys list \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --account-name ${STORAGE_ACCOUNT_NAME} \\\n    --query \\[0\\].value \\\n    --output tsv)\n\naz storage container create \\\n    --account-name ${STORAGE_ACCOUNT_NAME} \\\n    --name mycontainer \\\n    --account-key ${KEY} \\\n    --auth-mode key\n```\n\nNext, upload your Jakarta EE application to a blob using the [az storage blob upload](/cli/azure/storage/blob#az-storage-blob-upload) command. The following example uploads the [testwebapp.war](https://aka.ms/wls-aks-testwebapp) test application.\n\n```azurecli\ncurl -fsL https://aka.ms/wls-aks-testwebapp -o testwebapp.war\n\naz storage blob upload \\\n    --account-name ${STORAGE_ACCOUNT_NAME} \\\n    --container-name mycontainer \\\n    --name testwebapp.war \\\n    --file testwebapp.war \\\n    --account-key ${KEY} \\\n    --auth-mode key\n```\n\nTo upload multiple files at the same time, see [Create, download, and list blobs with Azure CLI](/azure/storage/blobs/storage-quickstart-blobs-cli).\n\n## Deploy WLS on the AKS offer\n\nThis section shows you how to provision a WLS cluster with the AKS instance you created previously. The offer uses the existing cluster within the custom virtual network and export cluster nodes using Azure Application Gateway as the load balancer. The offer automatically generates a self-signed certificate for Application Gateway TLS/SSL termination. For advanced usage of TLS/SSL termination with Application Gateway, see [Application Gateway Ingress Controller](https://aka.ms/wls-aks-app-gateway-ic).\n\nFirst, begin the process of deploying a WebLogic Server as described in [Oracle WebLogic Server on AKS user guide](https://aka.ms/wls-aks-docs), but come back to this page when you reach the **AKS** pane, as shown in the following screenshot.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-aks-within-existing-vnet/configure-aks-cluster.png\" alt-text=\"Screenshot of Azure portal showing the Configure AKS cluster pane of the Create Oracle WebLogic Server on Azure Kubernetes Service page.\" lightbox=\"media/migrate-weblogic-to-aks-within-existing-vnet/configure-aks-cluster.png\":::\n\n### Configure the AKS cluster\n\nNow that you have an AKS cluster within the virtual network, select the AKS cluster for the deployment.\n\n1. For **Create a new AKS cluster?**, select **No**.\n1. Under **Select AKS cluster**, open the dropdown menu, then select the AKS cluster you created, named `myAKSCluster` in this example.\n1. For **Use a pre-existing, WebLogic Server Docker image from Oracle Container Registry?**, select **Yes**.\n1. For **Create a new Azure Container Registry to store application images?**, select **Yes**.\n1. Under **Username for Oracle Single Sign-on authentication**, input your Oracle single sign-on account user name.\n1. Under **Password for Oracle Single Sign-on authentication**, input the password for that account.\n1. Under **Confirm password**, reenter the value of the preceding field.\n1. For all other fields except **Deploy an application**, keep the default values.\n1. For **Deploy an application**, select **Yes**.\n1. For **Application package (.war,.ear,.jar)**, select **Browse**.\n   - Select the storage account you created. The name starts with `stgwlsaks` in this example.\n   - Select your container in **Containers** page. This example uses `mycontainer`.\n   - Check your application listed in the container. This example uses **testwebapp.war**.\n   - Select **Select**.\n1. For other fields, keep the default values.\n\nThe AKS cluster, WebLogic base image, and Jakarta EE application are now configured.\n\nNext, you configure load balancing. For this task, continue to follow the steps in the [Oracle WebLogic Server on AKS user guide](https://aka.ms/wls-aks-docs), but come back to this page when you reach **Load balancing**, as shown in the following screenshot. You use the next section to configure the load balancing, then return to the WLS on AKS user guide to complete the deployment.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-aks-within-existing-vnet/networking-agic-custom-vnet.png\" alt-text=\"Screenshot of Azure portal showing the Networking pane of the Create Oracle WebLogic Server on Azure Kubernetes Service page.\" lightbox=\"media/migrate-weblogic-to-aks-within-existing-vnet/networking-agic-custom-vnet.png\":::\n\n### Configure Application Gateway Ingress Controller\n\nUse the following steps to configure Application Gateway Ingress Controller within the virtual network.\n\n1. For **Connect to Azure Application Gateway?**, select **Yes**.\n1. Under **Configure virtual networks**, for **Virtual network**, select the virtual network you created. This example uses `myVNet` in `myResourceGroup`. For **Subnet**, select the subnet for Application Gateway. This example uses `myAppGatewaySubnet`.\n1. For **Select desired TLS/SSL certificate option**, select **Generate a self-signed front-end certificate**.\n1. For **Create ingress for Administration Console**, select **Yes** to expose the WebLogic Administration Console.\n1. For the other fields, keep the default values.\n\nYou can now continue with the other aspects of the WLS deployment as described in the [Oracle WebLogic Server on AKS user guide](https://aka.ms/wls-aks-docs).\n\n## Validate successful deployment of WLS\n\nThis section shows you how to quickly validate the successful deployment of the WLS cluster and Application Gateway Ingress Controller.\n\nAfter the deployment completes, select **Outputs**, then find the external URL of the WebLogic Administration Console and the cluster. Use the following instructions to access these resources:\n\n- To view the WebLogic Administration Console, first copy the value of the output variable `adminConsoleExternalUrl`. Next, paste the value into your browser address bar and press **Enter** to open the sign-in page of the WebLogic Administration Console.\n- To view the WebLogic cluster, first copy the value of the output variable `clusterExternalUrl`. Next, use this value to construct the sample application URL by applying it to the following template: `${clusterExternalUrl}testwebapp/`. Now paste the application URL into your browser address bar and press **Enter**. The sample application shows the private address and hostname of the pod that the Application Gateway Ingress Controller is routing to.\n\n## Clean up resources\n\nIf you're not going to continue to use the WLS cluster, delete the virtual network and the WLS Cluster with the following Azure portal steps:\n\n1. Visit the overview page for the resource group `myResourceGroup`, then select **Delete resource group**.\n1. Visit the overview page for the resource group that you deployed the WLS on AKS offer, then select **Delete resource group**.\n\n## Next steps\n\nContinue to explore options to run WLS on Azure.\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Oracle WebLogic on AKS](/azure/virtual-machines/workloads/oracle/weblogic-aks)\n> [!div class=\"nextstepaction\"]\n> [Learn more about Oracle WebLogic on Azure](/azure/virtual-machines/workloads/oracle/oracle-weblogic)\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-to-azure-kubernetes-service.md",
    "content": "---\ntitle: Migrate WebLogic Server applications to Azure Kubernetes Service (AKS)\ndescription: Migrate WebLogic Server applications to Azure Kubernetes Service (AKS)\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: template-how-to, devx-track-java, devx-track-javaee, devx-track-javaee-wls, devx-track-javaee-wls-aks, devx-track-extended-java\n#Customer intent: As a Java developer, I want to migrate my on-premise WebLogic Server workload to WebLogic on Azure Kubernetes Service (AKS)\n---\n\n# Migrate WebLogic Server applications to Azure Kubernetes Service (AKS)\n\nThis guide describes what you should be aware of when you want to migrate an existing WebLogic Server (WLS) application to run on Azure Kubernetes Service (AKS).\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n[!INCLUDE [vm-aks-tradeoffs-wls](includes/vm-aks-tradeoffs-wls.md)]\n\n### Determine whether the prebuilt Azure Marketplace offer is a good starting point\n\nOnce you've decided that AKS is the appropriate deployment target, you must accept that the Oracle WLS Kubernetes operator (the operator) is the only way to run WLS on Kubernetes. After accepting this fact, you must decide whether or not the prebuilt [Azure Marketplace offer](https://aka.ms/wlsaks) is a good starting point. Here are some things to consider about the prebuilt Azure Marketplace offer.\n\n- Oracle and Microsoft created this offer to allow you to quickly provision WLS on AKS using the *Model in Image* domain home source type. This concept is explained in more detail later in this article.\n- At a high level, the offer automates the following steps for you.\n  - Take an existing WAR or EAR deployment, if desired.\n  - Wrap it in a container using the WebLogic Image Tool (WIT). For more information, see [WebLogic Image Tool](https://aka.ms/wls-wit) in the Oracle documentation.\n  - Install and configure the WebLogic Kubernetes Operator on AKS.\n  - Use the operator to run the whole thing. The operator invokes WebLogic Deploy Tooling (WDT) to stand up WebLogic environments and perform domain lifecycle operations in a repeatable fashion based on a metadata model. For more information, see [WebLogic Deploy Tooling](https://aka.ms/wls-wdt) in the Oracle documentation.\n- Though the prebuilt offer does provide numerous Azure service integrations, such as App Gateway, Database integration, and more, it does make many simplifying assumptions. These assumptions make the offer not as flexible as mastering and using the operator yourself.\n\nIf you don't use the prebuilt Azure Marketplace offer, you must learn how to use the operator directly. Mastering the operator is beyond the scope of this article. The complete documentation for the WLS Kubernetes Operator is available at [Oracle](https://aka.ms/wlsoperator).\n\nThe remainder of this section provides some considerations for deciding to use the prebuilt Azure Marketplace offer or using the operator directly.\n\n#### Decide whether to use the prebuilt Azure Marketplace offer\n\nFirst, you have to understand the concept of the WLS *domain*. A domain is a logically related group of WLS resources. For the canonical definition of WLS domain, see [the Oracle documentation](https://aka.ms/javaee/wls/domains). Running WLS on AKS requires deciding how AKS deals with domains. The various choices are referred to as \"domain home source type\". The WLS Kubernetes operator supports three choices of domain home source type. The prebuilt Azure Marketplace offer uses the first one in this table.\n\n| Domain home source type | Description                                                                                                                   | Positive aspects                                                                                                                                                                                                            | Negative aspects                                                                                                                                                                                                                          |\n|-------------------------|-------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Model in Image        | WLS and applications are in the container image, and everything else is kept outside of that image.                           | **Supported by prebuilt offer.** Documented as an official sample; see [Oracle](https://aka.ms/wls-aks-model-in-image). Most heavily uses WDT. Most \"cloud-native\" option. Simplest CI/CD integration.                     | Biggest learning curve.                                                                                                                                                                                                                   |\n| Domain in PV          | The domain resides on a Kubernetes persistent volume.                                                                         | Conceptually similar to running on VMs. You can use the WLS console to make changes and those changes persist across AKS pod restarts. Documented as an official sample; see [Oracle](https://aka.ms/wls-aks-domain-on-pv). | Some challenges related to NFS must be mitigated. For more information, see [Oracle](https://aka.ms/wls-aks-persistent-storage). This approach is the least \"cloud-native\" technique; the state resides entirely outside the AKS cluster. |\n| Domain in Image       | The domain resides in a container image. Applications are contained in a container image that's overlaid on the domain image. | More \"cloud-native\" than Domain in PV. Easier for CI/CD.                                                                                                                                                                  | Can't use WLS console. Must maintain more container images.                                                                                                                                                                               |\n\n> [!IMPORTANT]\n> If you choose the Domain in PV source type, we strongly recommend NFS instead of SMB. NFS evolved from the UNIX operating system, and other variants such as GNU/Linux. For this reason, when using NFS with container technologies such as Docker, it's less likely to have problems for concurrent reads and file locking. \n>\n> Be sure to enable NFS v4.1. Versions lower than v4.1 will have problems.\n\nThe operator documentation also includes a useful table comparing the various options. For more information, see [Choose a domain home source type](https://aka.ms/wls-aks-docs-domain-home-source-type).\n\nTo get a feel for the prebuilt Azure Marketplace offer, see [Quickstart: Deploy WebLogic Server on Azure Kubernetes Service using the Azure portal](/azure/aks/howto-deploy-java-wls-app?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/ee/breadcrumb/toc.json). For the reference documentation on the prebuilt Azure Marketplace offer, see [Oracle](https://aka.ms/wls-aks-docs).\n\nTo get a feel for using the operator directly, try the samples in [the operator documentation](https://aka.ms/wls-aks-samples).\n\nNow that you've been introduced to the various ways to handle WLS domains on AKS, you're better able to choose whether to use the prebuilt Azure Marketplace offer or to do it yourself using the operator directly.\n\n### Determine whether the WebLogic version is compatible\n\nYour existing WLS version must be one of the versions supported by the operator. Oracle maintains these versions in the Oracle Container Registry (OCR). Use the following steps to see the list of supported versions.\n\n1. Visit the Oracle Container Registry website and sign in. For more information, see [https://container-registry.oracle.com/](https://container-registry.oracle.com/).\n1. If you have a support entitlement, select **Middleware**, then search for **weblogic_cpu**. Select **weblogic_cpu**.\n1. If you don't have a support entitlement from Oracle, select **Middleware**, then search for **weblogic**. Select **weblogic**.\n\n> [!NOTE]\n> Get a support entitlement from Oracle before going to production. Failure to do so results in running insecure images that are not patched for critical security flaws. For more information on Oracle's critical patch updates, see [Critical Patch Updates, Security Alerts and Bulletins](https://www.oracle.com/security-alerts/).\n\nThe prebuilt Azure Marketplace offer allows you to select the WLS images from OCR and Azure Container Registry (ACR), and thus implicitly supports all of the versions available from OCR. If you direct the offer to pull an image from ACR, make sure it's derived from one of the supported versions listed in OCR.\n\n[!INCLUDE [inventory-server-capacity-aks](includes/inventory-server-capacity-aks.md)]\n\n[!INCLUDE [inventory-all-secrets](includes/inventory-all-secrets.md)]\n\nOnce you have a solid inventory of secrets, consult the operator documentation regarding secrets. For more information, see [Secrets](https://aka.ms/wlsoperator-secrets).\n\n[!INCLUDE [inventory-all-certificates](includes/inventory-all-certificates.md)]\n\nOnce you have a solid inventory of certificates, you can install them directly with the prebuilt Azure Marketplace offer. For more information, see [TLS/SSL configuration](https://aka.ms/wls-aks-docs#tlsssl-configuration). If you're using the operator directly, see [Updating operator external certificates](https://aka.ms/wlsoperator-certificates).\n\n[!INCLUDE [validate-that-the-supported-java-version-works-correctly-weblogic](includes/validate-that-the-supported-java-version-works-correctly-weblogic.md)]\n\n[!INCLUDE [inventory-jndi-resources](includes/inventory-jndi-resources.md)]\n\nIf you're using the prebuilt Azure Marketplace offer, the set of JNDI resources you can customize at deployment time is limited to what the offer supports. Search for **JNDI** in the [offer documentation](https://aka.ms/wls-aks-docs). If you're using the operator directly, the JDNI resources can be defined depending on your chosen domain home source type. For Domain in PV, you can set them the usual way, with WLST or with the admin console. For Domain in Image or Model in Image, see [Typical overrides](https://aka.ms/wlsoperator-configoverrides#typical-overrides).\n\n[!INCLUDE [inspect-your-domain-configuration](includes/inspect-your-domain-configuration.md)]\n\nThe prebuilt Azure Marketplace offer automatically creates a domain resource. If you're using the operator directly, you can completely customize how your domain is represented. For complete information, see [Domain resource](https://aka.ms/wlsoperator-domainresource).\n\n[!INCLUDE [determine-whether-session-replication-is-used](includes/determine-whether-session-replication-is-used.md)]\n\nThe prebuilt Azure Marketplace offer supports session affinity via the Application Gateway ingress controller. Cookie based affinity is enabled by default. You can select **Disable cookie based affinity** to disable it. Look for cookie based affinity in [the documentation for the offer](https://aka.ms/wls-aks-docs#application-gateway-ingress-controller).\n\n[!INCLUDE [document-datasources](includes/document-datasources.md)]\n\nThe prebuilt Azure Marketplace offer has support for most popular databases. For more information, see [Database](https://aka.ms/wls-aks-docs#database). For Domain in PV, you can set them the usual way, with WLST or with the admin console. For Domain in Image or Model in Image, see [Typical overrides](https://aka.ms/wlsoperator-configoverrides#typical-overrides).\n\n[!INCLUDE [determine-whether-weblogic-has-been-customized](includes/determine-whether-weblogic-has-been-customized.md)]\n\nYou need to capture these customizations in the container image run by AKS. For the prebuilt Azure Marketplace offer, such customizations are best handled by creating a custom container image and making it available in Azure Container Registry, then pointing to that registry at deployment time. For more information, see [Image selection](https://aka.ms/wls-aks-docs#image-selection). If you're using the operator directly, see [JVM memory and Java option environment variables](https://aka.ms/wlsoperator-domainresource#jvm-memory-and-java-option-environment-variables).\n\n[!INCLUDE [determine-whether-management-over-rest-is-used](includes/determine-whether-management-over-rest-is-used.md)]\n\nThe only domain home source type where it makes sense to continue to use management over REST is Domain in PV. It's possible to use it with the other domain home source types, but changes made are ephemeral and don't persist across pod restarts.\n\n[!INCLUDE [determine-whether-a-connection-to-on-premises-is-needed](includes/determine-whether-a-connection-to-on-premises-is-needed.md)]\n\n[!INCLUDE [determine-whether-jms-queues-or-topics-are-in-use-virtual-machines](includes/determine-whether-jms-queues-or-topics-are-in-use-virtual-machines.md)]\n\n[!INCLUDE [determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries](includes/determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries.md)]\n\nThese libraries can be handled using the same techniques as described in [Determine whether WebLogic has been customized](#determine-whether-weblogic-has-been-customized).\n\n[!INCLUDE [determine-whether-osgi-bundles-are-used](includes/determine-whether-osgi-bundles-are-used.md)]\n\nYou can include them in the WAR or EAR supplied to the prebuilt Azure Marketplace offer or using the operator directly.\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code.md)]\n\nWLS on AKS runs on Oracle Linux. Any OS-specific code must be compatible with Oracle Linux. To learn how to discover specific OS information, follow the steps in [Determine whether the WebLogic version is compatible](#determine-whether-the-weblogic-version-is-compatible).\n\n[!INCLUDE [determine-whether-oracle-service-bus-is-in-use](includes/determine-whether-oracle-service-bus-is-in-use.md)]\n\nOSB isn't directly supported in the prebuilt Azure Marketplace offer. If you must use OSB, you must use the operator directly.\n\n[!INCLUDE [determine-whether-your-application-is-composed-of-multiple-wars](includes/determine-whether-your-application-is-composed-of-multiple-wars.md)]\n\n[!INCLUDE [determine-whether-your-application-is-packaged-as-an-ear](includes/determine-whether-your-application-is-packaged-as-an-ear.md)]\n\nThe prebuilt Azure Marketplace offer supports WARs and EARs. Using the operator directly also supports WARs and EARs.\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n[!INCLUDE [determine-whether-wlst-is-used](includes/determine-whether-wlst-is-used.md)]\n\nThe only domain home source type that's compatible with use of WLST is Domain in PV. For more information, see [Domain home on a PV](https://aka.ms/wls-aks-domain-on-pv).\n\n### Determine whether and how the file system is used\n\nKubernetes deals with filesystems with persistent volumes (PV). Mounting persistent volumes is supported in the prebuilt Azure Marketplace offer, and when using the operator directly. If you're using Domain in PV, the filesystem is a central aspect of configuration.\n\n[!INCLUDE [static-content](includes/static-content.md)]\n\n[!INCLUDE [determine-the-network-topology](includes/determine-the-network-topology.md)]\n\n### Account for the use of JCA Adapters and Resource Adapters\n\nIf your deployment relies on resource adapters, the most supported option is [Domain home on a PV](https://aka.ms/wls-aks-domain-on-pv).\n\n[!INCLUDE [account-for-the-use-of-custom-security-providers-and-jaas](includes/account-for-the-use-of-custom-security-providers-and-jaas.md)]\n\nIf your deployment relies security providers, the most supported option is [Domain home on a PV](https://aka.ms/wls-aks-domain-on-pv).\n\n### Determine whether WebLogic clustering is used\n\nThe operator handles clustering for all possible ways of running WLS on AKS.\n\n#### Inspect your EJB clustering\n\nIf your application is using local EJB, you need to migrate them to clustered EJB. For more information, see [Clustered versus local EJB](https://aka.ms/wls-ejb-clustering).\n\n### Account for load-balancing requirements\n\nThe best way to account for load balancing is to use the App Gateway integration provided by the built-in Azure Marketplace offer. For more information, see [Tutorial: Migrate a WebLogic Server cluster to Azure with Azure Application Gateway as a load balancer](./migrate-weblogic-with-app-gateway.md).\n\n### Determine whether the Java EE Application Client feature is used\n\nIf your deployment relies on Java EE application clients, it's best to use the operator directly. For more information, see [External Clients](https://aka.ms/wlsoperator-external-clients).\n\n### Determine whether multiple container images are needed\n\nA WebLogic Server domain can contain multiple clusters. For example, a multi-tiered application can be represented in a single domain, but have two clusters, say \"frontend\" and \"backend\".  It's useful to be able to update the frontend, without updating the backend, and vice versa. However, with the Model in Image domain home source type, the entire domain is represented in one container image. To accommodate this use case, you must separate the clusters into their own domains, each with their own container image. The operator can manage multiple domains in multiple namespaces. For more information, see [Choose a domain namespace selection strategy](https://aka.ms/wlsoperator-namespaces#choose-a-domain-namespace-selection-strategy)\n\nAdopting multiple domains may introduce T3 access problems between domains. To resolve these problems, enable a custom channel as described in [Determine whether enabling unknown host access is needed](#determine-whether-enabling-unknown-host-access-is-needed).\n\n### Determine whether enabling unknown host access is needed\n\nYou may need to enable unknown host access by applying a patch to WebLogic for the following scenarios:\n\n- Allow T3 access from external clients outside AKS to WLS clusters in AKS via a custom channel.\n- Allow T3 access between different WLS domains in AKS via a custom channel.\n\nFor the details of the patch, follow the guidance in [How to Use the Patch Search in My Oracle Support(MOS)](https://support.oracle.com/knowledge/Support%20Tools/1078014_1.html) and search for patch `30656708`.\n\nAfter the patch is applied, see [Enabling unknown host access](https://aka.ms/wlsoperator-external-clients).\n\n## Migration\n\nThe steps in this section assume that your analysis has led you to decide to use the prebuilt Azure Marketplace offer.\n\n### Provision the offer\n\nTo open the offer in the Azure portal, see [https://aka.ms/wlsaks](https://aka.ms/wlsaks). Select **Create**, and then follow the instructions in the [documentation for the offer](https://aka.ms/wls-aks-docs). Use the information you gathered in the preceding steps to aid in filling out the fields of the offer.\n\n### Migrate the domains\n\nAfter you've provisioned the offer, output the domain by following these steps.\n\nIf you navigated away from the **Deployment is in progress** page, the following steps show you how to get back to that page. If you're still on the page that shows **Your deployment is complete**, you can skip to step 5.\n\n1. In the upper left of any portal page, select the hamburger menu and select **Resource groups**.\n1. In the box with the text **Filter for any field**, enter the first few characters of the resource group you created previously. If you followed the recommended convention, enter your initials, then select the appropriate resource group.\n1. In the left navigation pane, in the **Settings** section, select **Deployments** to see an ordered list of the deployments to this resource group, with the most recent one first.\n1. Scroll to the oldest entry in this list. This entry corresponds to the deployment you started in the preceding section. Select the oldest deployment, as shown in the following screenshot.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-azure-kubernetes-service/resource-group-deployments.png\" alt-text=\"Screenshot of Azure portal showing the resource group deployments list.\" lightbox=\"media/migrate-weblogic-to-azure-kubernetes-service/resource-group-deployments.png\":::\n\n1. In the left panel, select **Outputs**. This list shows the output values from the deployment. Useful information is included in the outputs. We're interested in the outputs that allow us to inspect the domain and interact with the operator. The other values in the outputs are explained in detail in the [WebLogic on AKS user guide](https://aka.ms/wls-aks-docs#template-outputs).\n1. Locate the output named `shellCmdtoConnectAks`. Paste the value of the output in a Bash shell and run the command. This command enables you to use `kubectl` as described in [Connect to the cluster](/azure/aks/learn/quick-kubernetes-deploy-cli#connect-to-the-cluster).\n1. Locate the output named `shellCmdtoOutputWlsDomainYaml`. Paste the value of the output in a Bash shell and run the command. This command outputs the domain resource as a YAML file.\n1. Now that you have the domain YAML of the current deployment, you can apply the knowledge in [Deploying domain resource YAML files](https://aka.ms/wlsoperator#deploying-domain-resource-yaml-files) and review [this guidance](https://support.oracle.com/knowledge/Middleware/2336356_1.html) for more clues on how to migrate the domains. This guidance requires adaptation to apply to the Kubernetes way of doing things, but it's still useful to know about.\n\n### Account for KeyStores\n\nYou must account for the migration of any SSL KeyStores used by your application. For more information, see [Configuring Keystores](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/secmg/identity_trust.html).\n\n### Connect the JMS sources\n\nAfter you've connected the databases, you can configure JMS by following the instructions at [Administering JMS Resources for Oracle WebLogic Server](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/14.1.2/jmsad/index.html) in the WebLogic documentation.\n\n### Account for logging\n\nYou can't do cloud without mastering logging. The operator provides samples for using Elasticsearch and Kibana. For more information, see [the operator documentation](https://aka.ms/wlsoperator-logging). Azure provides great support for Elastic. For complete details, see [What is Elastic integration with Azure?](/azure/partner-solutions/elastic/overview). You can combine the knowledge in these two resources to achieve an Azure-optimized logging solution for WLS on AKS.\n\n### Migrating your applications\n\nWhether or not you chose to provide a WAR or EAR file at deployment time, you need to update the application via CI/CD. The operator documentation has a sample that shows how to do this update. For more information, see [Update 3](https://aka.ms/wlsoperator-update-app). The other update samples are relevant to migration and are worth exploring.\n\n### Testing\n\nAny in-container tests against applications must be configured to access the new servers running within Azure. As with the CI/CD concerns, you must ensure the necessary network security rules allow your tests to access the applications deployed to Azure. For more information, see [Network security groups](/azure/virtual-network/network-security-groups-overview).\n\n## Post-migration\n\nAfter you've reached the migration goals you defined in the [pre-migration](#pre-migration) step, perform some end-to-end acceptance testing to verify that everything works as expected. For guidance on some potential post-migration enhancements, see the following recommendations:\n\n- Scaling. Dynamic scaling is a key value proposition to justify the complexity of using Kubernetes. Combine the knowledge in [Tutorial: Scale applications in Azure Kubernetes Service (AKS)](/azure/aks/tutorial-kubernetes-scale) with the operator documentation section [Scaling](https://aka.ms/wlsoperator-scaling) to achieve a WLS-native Kubernetes optimized scaling solution. It's perfectly possible to use popular off-the shelf solutions such as Prometheus and Grafana for scaling with WLS on AKS. For more information, see [Using Prometheus and Grafana to Monitor WebLogic Server on Kubernetes](https://blogs.oracle.com/weblogicserver/post/using-prometheus-and-grafana-to-monitor-weblogic-server-on-kubernetes). Azure has a managed Grafana service. For details, see [What is Azure Managed Grafana?](/azure/managed-grafana/overview).\n\n- If you captured load testing results prior to migration, re-run the test suite against the migrated server to see if the performance targets are met.\n\n- If you deployed WebLogic Server with Azure Application Gateway by following the steps in the offer, you may want to do more configurations on the Application Gateway. For more information, see [Application Gateway configuration overview](/azure/application-gateway/configuration-overview).\n\n- Enhance your network topology with advanced load balancing services. For more information, see [Using load-balancing services in Azure](/azure/traffic-manager/traffic-manager-load-balancing-azure).\n\n- Get Java-optimized application performance monitoring with Azure Monitor and Application Insights. For more information, see [Zero instrumentation application monitoring for Kubernetes - Azure Monitor Application Insights](/azure/azure-monitor/app/kubernetes-codeless).\n\n- Use Azure Storage to serve static content mounted to AKS. For more information, see [Storage options for applications in Azure Kubernetes Service (AKS)](/azure/aks/concepts-storage). Combine this knowledge with the operator documentation section [Providing Access To A Persistent Volume Claim](https://aka.ms/wlsoperator-volumes).\n\n- Deploy your applications to your migrated WebLogic cluster with Azure DevOps. For more information, see [Azure DevOps getting started documentation](/azure/devops/get-started).\n\n- Use Azure Managed Identities to managed secrets and assign role based access to Azure resources. For more information, see [What are managed identities for Azure resources?](/azure/active-directory/managed-identities-azure-resources/overview).\n\n- Integrate WebLogic Java EE authentication and authorization with Microsoft Entra ID. For more information, see [Integrating Microsoft Entra getting started guide](/azure/active-directory/manage-apps/plan-an-application-integration).\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-to-azure-vm-manually.md",
    "content": "---\ntitle: \"Tutorial: Manually install WebLogic Server on Azure Virtual Machines (VMs)\"\ndescription: Provides step-by-step guidance to install Oracle WebLogic Server on Azure VMs, set up a cluster, and expose it with Azure Application Gateway.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.topic: how-to\nms.date: 01/13/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-wls\n  - devx-track-javaee-wls-vm\n  - migration-java\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Tutorial: Manually install WebLogic Server on Azure Virtual Machines (VMs)\n\nThis tutorial shows the steps to install Oracle WebLogic Server (WLS) and configure a WebLogic cluster on Azure Virtual Machines (VMs), on Windows or GNU/Linux.\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> - Create a custom virtual network and create the VMs within the network.\n> - Provision VMs with desired Java Development Kit (JDK) and WLS installed.\n> - Configure a WebLogic Server domain and a WebLogic Server cluster using the Oracle Configuration Wizard.\n> - Deploy and run a Java application in the cluster.\n> - Expose the application to the public internet via Azure Application Gateway.\n> - Validate the successful configuration.\n\nIf you prefer a fully automated solution that does all of these steps on your behalf on GNU/Linux VMs, directly from the Azure portal, see [Quickstart: Deploy WebLogic Server on Azure Virtual Machine using the Azure portal](/azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json).\n\nIf you're interested in providing feedback or working closely on your migration scenarios with the engineering team developing WebLogic on Azure solutions, fill out this short [survey on WebLogic migration](https://aka.ms/wls-on-azure-survey) and include your contact information. The team of program managers, architects, and engineers will promptly get in touch with you to initiate close collaboration.\n\n## Prerequisites\n\n- A local machine with a Unix-like operating system installed - for example, Ubuntu, macOS, or Windows Subsystem for Linux.\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n- [Install Azure CLI version 2.46.0 or higher](/cli/azure/install-azure-cli) to run Azure CLI commands.\n  - When prompted, install Azure CLI extensions on first use. For more information about extensions, see [Use extensions with Azure CLI](/cli/azure/azure-cli-extensions-overview).\n  - Run [az version](/cli/azure/reference-index?#az-version) to find the version and dependent libraries that are installed. To upgrade to the latest version, run [az upgrade](/cli/azure/reference-index?#az-upgrade).\n- You must have an Oracle account. To create an Oracle account and accept the license agreement for WebLogic Server images, follow the steps in [Oracle Container Registry](https://aka.ms/wls-aks-ocr). Make note of your Oracle Account password and email.\n\n## Prepare the environment\n\nIn this section, you set up the infrastructure within which you install the JDK and WebLogic Server.\n\n### Assumptions\n\nIn this tutorial, you configure a WebLogic Server cluster with an administration server and two managed servers on a total of three VMs. To configure the cluster, you need to create the following three Azure VMs within the same availability set:\n\n- The admin VM (VM name `adminVM`) has the administration server running.\n- The managed VMs (VM names `mspVM1` and `mspVM2`) have two managed servers running.\n\n[!INCLUDE [sign-in-to-azure](includes/sign-in-to-azure.md)]\n\n### Create a resource group\n\nCreate a resource group with [az group create](/cli/azure/group#az-group-create). Resource group names must be globally unique within a subscription. For this reason, consider prepending some unique identifier to any names you create that must be unique. A useful technique is to use your initials followed by today's date in `mmdd` format. This example creates a resource group named `abc1110rg` in the `eastus` location:\n\n```azurecli\nexport RESOURCE_GROUP_NAME=abc1110rg\n\naz group create \\\n    --name ${RESOURCE_GROUP_NAME} \\\n    --location eastus\n```\n\n### Create a virtual network\n\nThe resources comprising your WebLogic Server cluster must communicate with each other, and the public internet, using a virtual network. For a complete guide to planning your virtual network, see the Cloud Adoption Framework for Azure guide [Plan virtual networks](/azure/virtual-network/virtual-network-vnet-plan-design-arm). For more information, see [Azure Virtual Network frequently asked questions](/azure/virtual-network/virtual-networks-faq).\n\nThe example in this section creates a virtual network with address space `192.168.0.0/16` and creates a subnet used for VMs.\n\nFirst, create a virtual network by using [az network vnet create](/cli/azure/network/vnet#az-network-vnet-create). The following example creates a network named `myVNet`:\n\n```azurecli\naz network vnet create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myVNet \\\n    --address-prefixes 192.168.0.0/24\n```\n\nCreate a subnet for the WebLogic Server cluster by using [az network vnet subnet create](/cli/azure/network/vnet/subnet#az-network-vnet-subnet-create). The following example creates a subnet named `mySubnet`:\n\n```azurecli\naz network vnet subnet create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name mySubnet \\\n    --vnet-name myVNet \\\n    --address-prefixes 192.168.0.0/25\n```\n\nCreate a subnet for Application Gateway by using [az network vnet subnet create](/cli/azure/network/vnet/subnet#az-network-vnet-subnet-create). The following example creates a subnet named `wlsVMGateway`:\n\n```azurecli\naz network vnet subnet create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name wlsVMGateway \\\n    --vnet-name myVNet \\\n    --address-prefixes 192.168.0.128/25\n```\n\n### Create an availability set\n\nCreate an availability set by using [az vm availability-set create](/cli/azure/vm/availability-set#az-vm-availability-set-create), as shown in the following example. Creating an availability set is optional, but we recommend it. For more information, see [Example Azure infrastructure walkthrough for Windows VMs](/azure/virtual-machines/windows/infrastructure-example).\n\n\n```bash\naz vm availability-set create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myAvailabilitySet \\\n    --platform-fault-domain-count 2 \\\n    --platform-update-domain-count 2\n```\n\nThe following sections describe the steps for installing WebLogic Server on either GNU/Linux or Windows Server. You can choose the operating system, JDK version, and WebLogic version according to your requirements, but you should verify that they're available in [Oracle Fusion Middleware Supported System Configurations](https://www.oracle.com/middleware/technologies/fusion-certification.html). Also, consider system and platform-specific requirements carefully before proceeding. For more information, see [System Requirements and Specifications](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/sysrs/system-requirements-and-specifications.html#GUID-A077A2B4-5967-42E0-A063-0F7A0A2254FB). Select the tab for your chosen operating system.\n\nThis article uses an Azure VM image maintained by Oracle and Microsoft containing the latest supported version of the software. For the full list of WebLogic Server base images maintained by Oracle and Microsoft, see [Azure Marketplace](https://aka.ms/wls-vm-base-images). If you want to use Windows OS, the instructions start with a base Windows VM and walk you through the steps of installing all of the necessary dependencies.\n\n#### [Oracle Linux](#tab/oracle-linux)\n\nThe Marketplace image that you use to create the VMs in this article is `Oracle:weblogic-141100-jdk11-ol91:owls-141100-jdk11-ol91:latest`.\n\n> [!NOTE]\n> You can query all the available Oracle WebLogic images provided by Oracle with [az vm image list](/cli/azure/vm/image#az-vm-image-list) `az vm image list --publisher oracle --output table --all | grep \"weblogic\"`. For more information, see [Oracle VM images and their deployment on Microsoft Azure](/azure/virtual-machines/workloads/oracle/oracle-vm-solutions).\n\n### Create an Oracle Linux machine for admin server\n\nIn this section, you create Oracle Linux machines with JDK 11 and WebLogic 14.1.1.0 installed, for the admin server and managed servers.\n\nCreate a VM using [az vm create](/cli/azure/vm). You run the Administration Server on this VM.\n\nThe following example creates Oracle Linux VMs using an SSH key pair for the authentication. If desired, you can use password authentication instead.\n\nIf you don't have an SSH key pair, you can generate it by using the following command:\n\n```bash\nssh-keygen -t rsa -b 2048 -f ~/.ssh/wls-vm-key\n```\n\nThis command creates the following files:\n\n- **~/.ssh/wls-vm-key**: The private key.\n- **~/.ssh/wls-vm-key.pub**: The public key.\n\n\n```azurecli\nexport VM_URN=Oracle:weblogic-141100-jdk11-ol91:owls-141100-jdk11-ol91:latest\n\naz vm create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name adminVM \\\n    --availability-set myAvailabilitySet \\\n    --image ${VM_URN} \\\n    --size Standard_DS1_v2  \\\n    --admin-username azureuser \\\n    --ssh-key-value ~/.ssh/wls-vm-key.pub \\\n    --public-ip-address \"\" \\\n    --nsg \"\"\n```\n\n> [!NOTE]\n> The use of username and password credentials to grant access to a VM is discouraged. If your particular usage requirements suggest credential based access is the best approach, you can create the VM with username and password:\n> ```azurecli\n> export VM_URN=Oracle:weblogic-141100-jdk11-ol91:owls-141100-jdk11-ol91:latest\n> az vm create \\\n>     --resource-group ${RESOURCE_GROUP_NAME} \\\n>     --name adminVM \\\n>     --availability-set myAvailabilitySet \\\n>     --image ${VM_URN} \\\n>     --size Standard_DS1_v2 \\\n>     --admin-username azureuser \\\n>     --admin-password <your-password> \\\n>     --public-ip-address \"\" \\\n>     --nsg \"\"\n> ```\n\n### Create a Windows VM and set up X-server\n\nThis tutorial uses the graphical interface of WebLogic Server to complete the installation and configuration. You use a Windows VM as a \"jump box\" and run an [X Windows System server](https://sourceforge.net/projects/vcxsrv/) to view the graphical installers on the three VMs of the WebLogic Server cluster.\n\nFollow these steps to provision a Windows 10 machine and install an X-server. If you already have a Windows machine within the same network as the Oracle Linux machine, you don't need to provision a new one from Azure. You can jump to the section that installs the X-server.\n\n[!INCLUDE [create-windows-vm-and-set-up-xserver](includes/create-windows-vm-and-set-up-xserver.md)]\n\n3. Copy the SSH key **~/.ssh/wls-vm-key** to the Windows VM and save it to **C:\\Users\\azureuser\\.ssh**.\n\n### Create Oracle Linux machines for managed servers\n\nCreate two VMs using [az vm create](/cli/azure/vm). You run the managed servers on these VMs.\n\nThe following example creates Oracle Linux VMs using user name and password pair for the authentication. If desired, you can use TLS/SSL authentication instead.\n\n```azurecli\nexport VM_URN=Oracle:weblogic-141100-jdk11-ol91:owls-141100-jdk11-ol91:latest\n\naz vm create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name mspVM1 \\\n    --availability-set myAvailabilitySet \\\n    --image ${VM_URN} \\\n    --size Standard_DS1_v2  \\\n    --admin-username azureuser \\\n    --ssh-key-value ~/.ssh/wls-vm-key.pub \\\n    --public-ip-address \"\" \\\n    --nsg \"\"\n\naz vm create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name mspVM2 \\\n    --availability-set myAvailabilitySet \\\n    --image ${VM_URN} \\\n    --size Standard_DS1_v2  \\\n    --admin-username azureuser \\\n    --ssh-key-value ~/.ssh/wls-vm-key.pub \\\n    --public-ip-address \"\" \\\n    --nsg \"\"\n```\n\n[!INCLUDE [start-admin-get-ips](includes/wls-manual-guidance-start-admin-and-get-ip.md)]\n\nNow, you're ready to connect to the Oracle Linux machine to configure a WebLogic cluster with graphical interface.\n\n### Configure WebLogic Server domain and cluster\n\n[!INCLUDE [configure-domain](includes/wls-manual-guidance-configure-domain.md)]\n\n#### Create the domain using the configuration wizard\n\nYou keep using the X-server and Oracle Configuration Wizard to create the WebLogic Server domain.\n\nThe following section shows how to create a new WebLogic Server domain on the `adminVM`. Make sure you're still on your Windows machine, if not, remote connect to `myWindowsVM`.\n\n1. Connect to `adminVM` from a command prompt.\n\n   Run the following commands on your Windows machine `myWindowsVM`. Replace `192.168.0.4` with your `adminVM` private IP address:\n\n   ```cmd\n   set SSH_KEY=\"C:\\Users\\azureuser\\.ssh\\wls-vm-key\"\n   set ADMINVM_IP=\"192.168.0.4\"\n   ssh -i %SSH_KEY% azureuser@%ADMINVM_IP%\n   ```\n\n1. Use the following commands to initialize the folder for domain configuration:\n\n   ```bash\n   sudo su\n\n   export DOMAIN_PATH=\"/u01/domains\"\n   mkdir -p ${DOMAIN_PATH}\n   chown oracle:oracle -R ${DOMAIN_PATH}\n   ```\n\n1. Use the following commands to Install the dependency for X-server:\n\n   ```bash\n   # install dependencies for X-server\n   sudo yum install -y libXtst libSM libXrender\n   # install dependencies to run a Java GUI client\n   sudo yum install -y fontconfig urw-base35-fonts\n   ```\n\n1. Use the following commands to become the `oracle` user and set the `DISPLAY` variable:\n\n   ```bash\n   sudo su - oracle\n\n   export DISPLAY=<my-windows-vm-private-ip>:0.0\n   #export DISPLAY=192.168.0.5:0.0\n   ```\n\n1. Run the following command to launch the Oracle Configuration Wizard:\n\n   ```bash\n   bash /u01/app/wls/install/oracle/middleware/oracle_home/oracle_common/common/bin/config.sh\n   ```\n\nThe Oracle Configuration Wizard starts and directs you to configure the domain. The following page asks for domain type and location. Select **Create a new domain** and set domain location to **/u01/domains/wlsd**. The domain configuration is saved to this folder.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-location.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Create Domain.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-location.png\":::\n\nSelect **Next**, then select **Create Domain Using Product Templates**. Keep the default selected template, as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-templates.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Templates.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-templates.png\":::\n\nSelect **Next**, then input **Administration Account**. Set the **Name** as **weblogic** and **Password** as **Secret123456**.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-admin-account.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Administration Account.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-admin-account.png\":::\n\nSelect **Next**. For domain mode, select **Production**. For JDK, keep the default option.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-mode.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Domain Mode and JDK.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-mode.png\":::\n\nSelect **Next**. For advanced configurations, select **Administration Server**, **Node Manager**, and **Topology**.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-advanced-configuration.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Advanced Configurations.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-advanced-configuration.png\":::\n\nSelect **Next** and fill in the **Administration Server** name with **admin**. Fill in the **Listen IP Address** with the private IP of `adminVM`. The value is **192.168.0.4** in this example.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-admin-server.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Administration Server.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-admin-server.png\":::\n\nSelect **Next**. For **Node Manager Type**, select **Per Domain Custom Location**, and fill in location with **/u01/domains/wlsd/nodemanager**. For **Node Manager Credentials**, the username is **weblogic** and the password is **Secret123456**.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-node-manager.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Node Manager.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-node-manager.png\":::\n\nSelect **Next**. For managed servers, add the following items. Use the IP addresses you discovered earlier:\n\n| Server name | Listen address                      | Listen port |\n|-------------|-------------------------------------|-------------|\n| `msp1`      | The private IP address of `mspVM1`. | `8001`      |\n| `msp2`      | The private IP address of `mspVM2`. | `8001`      |\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-managed-server.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Managed Servers.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-managed-server.png\":::\n\nSelect **Next**, then create a cluster with the name `cluster1`.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-cluster.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Cluster.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-cluster.png\":::\n\nSelect **Next**. Don't change the values for **Server Templates** and **Dynamic Servers**. The defaults are acceptable for a dynamic cluster.\n\nFor **Assign Servers to Clusters**, assign both `msp1` and `msp2` to `cluster1`.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-assign-servers-to-cluster.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Assign Servers to Clusters.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-assign-servers-to-cluster.png\":::\n\nSelect **Next**. Add the machines `adminVM`, `mspVM1`, and `mspVM2`. Use the IP addresses you discovered earlier.\n\n| Name      | Node manager listen address          | Node manager listen port |\n|-----------|--------------------------------------|--------------------------|\n| `mspVM1`  | The private IP address of `mspVM1`.  | `5556`                   |\n| `mspVM2`  | The private IP address of `mspVM2`.  | `5556`                   |\n| `adminVM` | The private IP address of `adminVM`. | `5556`                   |\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-machines.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Machines.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-machines.png\":::\n\nSelect **Next**. For **Assign Servers to Machines**, assign server `admin` to `adminVM`, `msp1` to `mspVM1`, and `msp2` to `mspVM2`.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-assign-servers-to-machines.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Assign Servers to Machines.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-assign-servers-to-machines.png\":::\n\nSelect **Next**. You see the **Configuration Summary**, which should look like the following screenshot:\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-gnu-linux-configuration-summary.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Configuration Summary.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-gnu-linux-configuration-summary.png\":::\n\nSelect **Create**. The **Configuration Progress** page shows the progress. All the listed items should be configured successfully.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-configuration-progress.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - Configuration Progress.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-configuration-progress.png\":::\n\nFinally, there's an **End of Configuration** page to show the URL of the Administration Server.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-end.png\" alt-text=\"Screenshot of Oracle Configuration Wizard - End.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-end.png\":::\n\nThe Administration Server isn't running, so the URL doesn't resolve. Select **Next**, then **Finish**. You finished configuring the `wlsd` domain with a cluster `cluster1`, including two managed servers.\n\nNext, you apply the domain configuration to `mspVM1` and `mspVM2`.\n\n#### Create replicas using the pack and unpack command\n\nThis tutorial uses the WebLogic Server pack and unpack command to extend the domain. For more information, see [Overview of the Pack and Unpack Commands](https://docs.oracle.com/en/middleware/fusion-middleware/12.2.1.3/wldpu/overview-pack-and-unpack-commands.html#GUID-D37A439D-EB49-40AC-BDA8-0E362E35827F).\n\n1. Pack the domain configuration on `adminVM` with the following steps, assuming you're still on `adminVM` and logged in with the `oracle` user:\n\n   ```bash\n   cd /u01/app/wls/install/oracle/middleware/oracle_home/oracle_common/common/bin\n   bash pack.sh -domain=/u01/domains/wlsd -managed=true -template=/tmp/cluster.jar -template_name=\"wlsd\"\n   ```\n\n   If the command is completed successfully, you see output similar the following example:\n\n   ```output\n   [oracle@adminVM bin]$ bash pack.sh -domain=/u01/domains/wlsd -managed=true -template=/tmp/cluster.jar -template_name=\"wlsd\"\n   << read domain from \"/u01/domains/wlsd\"\n   >>  succeed: read domain from \"/u01/domains/wlsd\"\n   << set config option Managed to \"true\"\n   >>  succeed: set config option Managed to \"true\"\n   << write template to \"/tmp/cluster.jar\"\n   ..............................\n   >>  succeed: write template to \"/tmp/cluster.jar\"\n   << close template\n   >>  succeed: close template\n   ```\n\n   Use the following commands to copy **/tmp/cluster.jar** to `mspVM1` and `mspVM2` using `scp`. If prompted for key fingerprint, type `yes`. Enter the password **Secret123456** when prompted.\n\n   ```bash\n   scp /tmp/cluster.jar azureuser@<mspvm1-private-ip>:/tmp/cluster.jar\n   scp /tmp/cluster.jar azureuser@<mspvm2-private-ip>:/tmp/cluster.jar\n   #scp /tmp/cluster.jar azureuser@192.168.0.6:/tmp/cluster.jar\n   #scp /tmp/cluster.jar azureuser@192.168.0.7:/tmp/cluster.jar\n   ```\n\n1. Use the following instructions to apply domain configuration to `mspVM1`:\n\n   Open a new command prompt, and use the following commands to connect to `mspVM1`. Replace `192.168.0.6` with your `mspVM1` private IP address:\n\n   ```cmd\n   set SSH_KEY=\"C:\\Users\\azureuser\\.ssh\\wls-vm-key\"\n   set MSPVM1_IP=\"192.168.0.6\"\n   ssh -i %SSH_KEY% azureuser@%MSPVM1_IP%\n   ```\n\n   Enter the password for the connection. For this example, the password is `Secret123456`.\n\n   You logged into `mspVM1` with user `azureuser`. Next, use the following commands to become the root user and update file ownership of **/tmp/cluster.jar** to `oracle`:\n\n   ```bash\n   sudo su\n\n   chown oracle:oracle /tmp/cluster.jar\n\n   export DOMAIN_PATH=\"/u01/domains\"\n   mkdir -p ${DOMAIN_PATH}\n   chown oracle:oracle -R ${DOMAIN_PATH}\n   ```\n\n   As the `oracle` user, use the following commands to apply the domain configuration:\n\n   ```bash\n   sudo su - oracle\n\n   cd /u01/app/wls/install/oracle/middleware/oracle_home/oracle_common/common/bin\n   bash unpack.sh -domain=/u01/domains/wlsd -template=/tmp/cluster.jar\n   ```\n\n   If the command completes successfully, you see output similar to the following example:\n\n   ```output\n   [oracle@mspVM1 bin]$ bash unpack.sh -domain=/u01/domains/wlsd -template=/tmp/cluster.jar\n   << read template from \"/tmp/cluster.jar\"\n   >>  succeed: read template from \"/tmp/cluster.jar\"\n   << set config option DomainName to \"wlsd\"\n   >>  succeed: set config option DomainName to \"wlsd\"\n   >>  validateConfig \"KeyStorePasswords\"\n   >>  succeed: validateConfig \"KeyStorePasswords\"\n   << write Domain to \"/u01/domains/wlsd\"\n   ..................................................\n   >>  succeed: write Domain to \"/u01/domains/wlsd\"\n   << close template\n   >>  succeed: close template\n   ```\n\n1. Use the following instructions to apply domain configuration to `mspVM2`:\n\n   Connect `mspVM2` in a new command prompt. Replace `192.168.0.7` with your `mspVM2` private IP address:\n\n   ```cmd\n   set SSH_KEY=\"C:\\Users\\azureuser\\.ssh\\wls-vm-key\"\n   set MSPVM2_IP=\"192.168.0.7\"\n   ssh -i %SSH_KEY% azureuser@%MSPVM2_IP%\n   ```\n\n   Enter the password for the connection. For this example, the password is **Secret123456**.\n\n   You logged into `mspVM2` with user `azureuser`. Use the following commands to change to the root user and update the file ownership of **/tmp/cluster.jar** and initialize the folder for domain configuration:\n\n   ```bash\n   sudo su\n\n   chown oracle:oracle /tmp/cluster.jar\n\n   export DOMAIN_PATH=\"/u01/domains\"\n   mkdir -p ${DOMAIN_PATH}\n   chown oracle:oracle -R ${DOMAIN_PATH}\n\n   sudo su - oracle\n\n   cd /u01/app/wls/install/oracle/middleware/oracle_home/oracle_common/common/bin\n   bash unpack.sh -domain=/u01/domains/wlsd -template=/tmp/cluster.jar\n   ```\n\nYou replicated the domain configuration on `mspVM1` and `mspVM2`, and you're ready to start the servers.\n\n### Start servers\n\nThe steps in this section direct you to perform the following two tasks:\n\n1. Make it so the admin and managed servers start automatically after server reboot.\n1. Start the servers for immediate use.\n\nThese two tasks aren't easily separated, so the steps for the two tasks are intermixed.\n\n#### Start admin\n\nGo back to the command prompt that connects to `adminVM`. If you lost it, run the following command to connect to it:\n\n```cmd\nset SSH_KEY=\"C:\\Users\\azureuser\\.ssh\\wls-vm-key\"\nset ADMINVM_IP=\"192.168.0.4\"\nssh -i %SSH_KEY% azureuser@%ADMINVM_IP%\n```\n\nIf you aren't working with the `oracle` user, sign in with `oracle`:\n\n```bash\nsudo su - oracle\n```\n\nThe following command persists the `admin` account to **/u01/domains/wlsd/servers/admin/security/boot.properties** to enable automatically starting the `admin` server without asking for credentials:\n\nReplace the username and password with yours.\n\n```bash\nmkdir -p /u01/domains/wlsd/servers/admin/security\n\ncat <<EOF >/u01/domains/wlsd/servers/admin/security/boot.properties\nusername=weblogic\npassword=Secret123456\nEOF\n```\n\nUse the following commands to inspect the file. Be sure it has the correct ownership, permissions, and contents.\n\n```bash\nls -la /u01/domains/wlsd/servers/admin/security/boot.properties\ncat /u01/domains/wlsd/servers/admin/security/boot.properties\n```\n\nThe output should look nearly identical to the following example:\n\n```output\n[oracle@adminVM bin]$ ls -la /u01/domains/wlsd/servers/admin/security/boot.properties\n-rw-rw-r--. 1 oracle oracle 40 Nov 28 17:00 /u01/domains/wlsd/servers/admin/security/boot.properties\n[oracle@adminVM bin]$ cat /u01/domains/wlsd/servers/admin/security/boot.properties\nusername=weblogic\npassword=Secret123456\n```\n\n#### Enable the admin server and node manager to start automatically after VM restart\n\nCreate a Linux service for the WebLogic admin server and node manager, to start the process automatically after reboot. For more information, see [Use systemd on Oracle Linux](https://docs.oracle.com/en/learn/use_systemd/index.html).\n\nExit the `oracle` user and sign in with the `root` user.\n\n```bash\nexit\n\nsudo su\n```\n\nCreate the Linux service for the node manager:\n\n```bash\ncat <<EOF >/etc/systemd/system/wls_nodemanager.service\n[Unit]\nDescription=WebLogic nodemanager service\nAfter=network-online.target\nWants=network-online.target\n[Service]\nType=simple\n# Note that the following three parameters should be changed to the correct paths\n# on your own system\nWorkingDirectory=/u01/domains/wlsd\nExecStart=\"/u01/domains/wlsd/bin/startNodeManager.sh\"\nExecStop=\"/u01/domains/wlsd/bin/stopNodeManager.sh\"\nUser=oracle\nGroup=oracle\nKillMode=process\nLimitNOFILE=65535\nRestart=always\nRestartSec=3\n[Install]\nWantedBy=multi-user.target\nEOF\n```\n\nCreate the Linux service for the admin server:\n\n```bash\ncat <<EOF >/etc/systemd/system/wls_admin.service\n[Unit]\nDescription=WebLogic Adminserver service\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nWorkingDirectory=/u01/domains/wlsd\nExecStart=\"/u01/domains/wlsd/startWebLogic.sh\"\nExecStop=\"/u01/domains/wlsd/bin/stopWebLogic.sh\"\nUser=oracle\nGroup=oracle\nKillMode=process\nLimitNOFILE=65535\nRestart=always\nRestartSec=3\n\n[Install]\nWantedBy=multi-user.target\nEOF\n```\n\nYou're now ready to start the node manager and admin server on `adminVM` by using the following commands:\n\n```bash\nsudo systemctl enable wls_nodemanager\nsudo systemctl enable wls_admin\nsudo systemctl daemon-reload\nsudo systemctl start wls_nodemanager\nsudo systemctl start wls_admin\n```\n\nCheck the admin server state with `sudo systemctl status wls_admin -l`. The Administration Server should be ready when you find similar logs:\n\n```output\n[root@adminVM wlsd]# sudo systemctl status wls_admin -l\n● wls_admin.service - WebLogic Adminserver service\nLoaded: loaded (/etc/systemd/system/wls_admin.service; enabled; vendor preset: disabled)\nActive: active (running) since Mon 2022-09-26 07:47:34 UTC; 54s ago\nMain PID: 26738 (startWebLogic.s)\n    Tasks: 61 (limit: 20654)\nMemory: 649.2M\n\n... ...\n\nSep 26 07:48:15 adminVM startWebLogic.sh[26802]: <Sep 26, 2022, 7:48:15,411 AM Coordinated Universal Time> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to RUNNING.>\n```\n\nPress <kbd>Q</kbd> to exit the log monitoring mode.\n\nYou can't access the admin server before opening ports `7001` and `5556`. Use the following commands to open ports:\n\n```bash\nsudo firewall-cmd --zone=public --add-port=7001/tcp\nsudo firewall-cmd --zone=public --add-port=5556/tcp\nsudo firewall-cmd --runtime-to-permanent\nsudo systemctl restart firewalld\n```\n\nAt this point, you can access the admin server on the browser of `myWindowsVM` with the URL `http://<adminvm-private-ip>:7001/console`. Verify that you can view the admin server, but don't sign in yet. If the admin server isn't running, troubleshoot and resolve the problem before proceeding. The admin server isn't accessible outside of Azure.\n\n#### Start msp1\n\nGo back to the command prompt that connects to `mspVM1`. If you lost it, use the following command to connect to it:\n\n```cmd\nset SSH_KEY=\"C:\\Users\\azureuser\\.ssh\\wls-vm-key\"\nset MSPVM1_IP=\"192.168.0.6\"\nssh -i %SSH_KEY% azureuser@%MSPVM1_IP%\n```\n\nIf you aren't working with `oracle` user, sign in with `oracle`:\n\n```bash\nsudo su - oracle\n```\n\nPersist the `admin` account to **/u01/domains/wlsd/servers/msp1/security/boot.properties** to enable automatically starting `msp1` without asking for credentials. Replace the username and password with yours.\n\n```bash\nmkdir -p /u01/domains/wlsd/servers/msp1/security\n\ncat <<EOF >/u01/domains/wlsd/servers/msp1/security/boot.properties\nusername=weblogic\npassword=Secret123456\nEOF\n```\n\nNow, you create a Linux service for node manager, to start the process automatically on machine reboot. For more information, see [Use systemd on Oracle Linux](https://docs.oracle.com/en/learn/use_systemd/index.html).\n\nExit the `oracle` user and sign in with the `root` user.\n\n```bash\nexit\n\n#Skip this command if you are root\nsudo su\n```\n\nCreate the Linux service for the node manager:\n\n```bash\ncat <<EOF >/etc/systemd/system/wls_nodemanager.service\n[Unit]\nDescription=WebLogic nodemanager service\nAfter=network-online.target\nWants=network-online.target\n[Service]\nType=simple\n# Note that the following three parameters should be changed to the correct paths\n# on your own system\nWorkingDirectory=/u01/domains/wlsd\nExecStart=\"/u01/domains/wlsd/bin/startNodeManager.sh\"\nExecStop=\"/u01/domains/wlsd/bin/stopNodeManager.sh\"\nUser=oracle\nGroup=oracle\nKillMode=process\nLimitNOFILE=65535\nRestart=always\nRestartSec=3\n[Install]\nWantedBy=multi-user.target\nEOF\n```\n\nNext, start the node manager.\n\n```bash\nsudo systemctl enable wls_nodemanager\nsudo systemctl daemon-reload\nsudo systemctl start wls_nodemanager\n```\n\nIf the node manager is running successfully, you see logs similar to the following example:\n\n```output\n[root@mspVM1 azureuser]# systemctl status wls_nodemanager -l\n● wls_nodemanager.service - WebLogic nodemanager service\nLoaded: loaded (/etc/systemd/system/wls_nodemanager.service; enabled; vendor preset: disabled)\nActive: active (running) since Tue 2022-09-27 01:23:42 UTC; 19s ago\nMain PID: 107544 (startNodeManage)\n    Tasks: 15 (limit: 20654)\nMemory: 146.7M\n\n... ...\n\nSep 27 01:23:45 mspVM1 startNodeManager.sh[107592]: <Sep 27, 2022 1:23:45 AM Coordinated Universal Time> <INFO> <Server Implementation Class: weblogic.nodemanager.server.NMServer$ClassicServer.>\nSep 27 01:23:46 mspVM1 startNodeManager.sh[107592]: <Sep 27, 2022 1:23:46 AM Coordinated Universal Time> <INFO> <Secure socket listener started on port 5556, host /192.168.0.6>\n```\n\nPress <kbd>Q</kbd> to exit log monitoring mode.\n\nYou must open port `8001` to access the application that deployed to the cluster and `5556` for communication inside the domain. Use the following commands to open ports:\n\n```bash\nsudo firewall-cmd --zone=public --add-port=8001/tcp\nsudo firewall-cmd --zone=public --add-port=5556/tcp\nsudo firewall-cmd --runtime-to-permanent\nsudo systemctl restart firewalld\n```\n\n#### Start msp2\n\nGo back to the command prompt that connects to `mspVM2`. If you lost it, use the following command to connect to it:\n\n```cmd\nset SSH_KEY=\"C:\\Users\\azureuser\\.ssh\\wls-vm-key\"\nset MSPVM2_IP=\"192.168.0.7\"\nssh -i %SSH_KEY% azureuser@%MSPVM2_IP%\n```\n\nIf you aren't working with the `oracle` user, sign in with `oracle`:\n\n```bash\nsudo su - oracle\n```\n\nPersist the `admin` account to **/u01/domains/wlsd/servers/msp2/security/boot.properties** to enable automatically starting `msp2` without asking for credentials. Replace the username and password with yours.\n\n```bash\n\nmkdir -p /u01/domains/wlsd/servers/msp2/security\n\ncat <<EOF >/u01/domains/wlsd/servers/msp2/security/boot.properties\nusername=weblogic\npassword=Secret123456\nEOF\n```\n\nNext, create a Linux service for the node manager.\n\nExit the `oracle` user and sign in with the `root` user.\n\n```bash\nexit\n\n#SKip this command if you are in root\nsudo su\n```\n\nCreate the Linux service for the node manager:\n\n```bash\ncat <<EOF >/etc/systemd/system/wls_nodemanager.service\n[Unit]\nDescription=WebLogic nodemanager service\nAfter=network-online.target\nWants=network-online.target\n[Service]\nType=simple\n# Note that the following three parameters should be changed to the correct paths\n# on your own system\nWorkingDirectory=/u01/domains/wlsd\nExecStart=\"/u01/domains/wlsd/bin/startNodeManager.sh\"\nExecStop=\"/u01/domains/wlsd/bin/stopNodeManager.sh\"\nUser=oracle\nGroup=oracle\nKillMode=process\nLimitNOFILE=65535\nRestart=always\nRestartSec=3\n[Install]\nWantedBy=multi-user.target\nEOF\n```\n\nStart the node manager.\n\n```bash\nsudo systemctl enable wls_nodemanager\nsudo systemctl daemon-reload\nsudo systemctl start wls_nodemanager\n```\n\nIf the node manager is running successfully, you see logs similar to the following example:\n\n```output\n[root@mspVM2 azureuser]# systemctl status wls_nodemanager -l\n● wls_nodemanager.service - WebLogic nodemanager service\nLoaded: loaded (/etc/systemd/system/wls_nodemanager.service; enabled; vendor preset: disabled)\nActive: active (running) since Tue 2022-09-27 01:23:42 UTC; 19s ago\nMain PID: 107544 (startNodeManage)\n    Tasks: 15 (limit: 20654)\nMemory: 146.7M\n\n... ...\n\nSep 27 01:23:45 mspVM2 startNodeManager.sh[107592]: <Sep 27, 2022 1:23:45 AM Coordinated Universal Time> <INFO> <Server Implementation Class: weblogic.nodemanager.server.NMServer$ClassicServer.>\nSep 27 01:23:46 mspVM2 startNodeManager.sh[107592]: <Sep 27, 2022 1:23:46 AM Coordinated Universal Time> <INFO> <Secure socket listener started on port 5556, host /192.168.0.6>\n```\n\nPress <kbd>Q</kbd> to exit log monitoring mode.\n\nOpen port `8001` and `5556`.\n\n```bash\nsudo firewall-cmd --zone=public --add-port=8001/tcp\nsudo firewall-cmd --zone=public --add-port=5556/tcp\nsudo firewall-cmd --runtime-to-permanent\nsudo systemctl restart firewalld\n```\n\n#### Start managed servers\n\nNow, open the Administration Console portal from a browser in your Windows machine `myWindowsVM`, and use the following steps to start the managed servers:\n\n[!INCLUDE [start-managed-server](includes/wls-manual-guidance-start-managed-server.md)]\n\n### Clean up the Windows machine\n\nYou completed the WebLogic Server cluster configuration. If desired, remove the Windows machine with the following commands. Alternatively, you could shut down the Windows machine `myWindowsVM` and continue to use it as a jump box for ongoing cluster maintenance tasks.\n\n[!INCLUDE [clean-up-windows-xserver-machine](includes/clean-up-windows-xserver-machine.md)]\n\n#### [Windows Server](#tab/windows-server)\n\nThe Marketplace image that you use to create the VMs is `MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:latest`.\n\n> [!NOTE]\n> You can query all the available Windows Server images by using [az vm image list](/cli/azure/vm/image#az-vm-image-list), as shown in the following command: `az vm image list --offer WindowsServer --all --output table`. For more information, see [Comparison of Standard, Datacenter, and Datacenter: Azure Edition editions of Windows Server 2022](/windows-server/get-started/editions-comparison-windows-server-2022?tabs=full-comparison).\n\n### Create a Windows Server machine\n\nNext, you create a basic VM, install all the required tools on it, take a snapshot from it, and create replicas based on the snapshot.\n\nCreate the basic VM using [az vm create](/cli/azure/vm). You run the WebLogic Administration Server on it.\n\nThe following example creates a Windows Server 2022 Datacenter Azure Edition machine named `adminVM`. This example uses `azureuser` for an administrative user name and `Secret123456` for the password.\n\n```azurecli\naz vm create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name adminVM \\\n    --availability-set myAvailabilitySet \\\n    --image MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:latest \\\n    --size Standard_B2S \\\n    --public-ip-sku Standard \\\n    --vnet-name myVNet \\\n    --subnet mySubnet \\\n    --admin-username azureuser \\\n    --admin-password Secret123456\n```\n\nIt takes a few minutes to create the VM and supporting resources.\n\nAfter the deployment completes, connect to the machine. For a detailed guide on remote connection, see [How to connect using Remote Desktop and sign on to an Azure virtual machine running Windows](/azure/virtual-machines/windows/connect-rdp). \n\nAfter you connect, search for and open **Windows Defender Firewall**. Select **Turn Windows Defender Firewall on or off** and select **Turn off Windows Defender Firewall** for both private and public network settings. Select **OK**. Close **Windows Defender Firewall**. Because numerous ports must be opened during the configuration, this step greatly simplifies the process of setting up the cluster.\n\nAfter the configuration is complete, lock down the WebLogic Server by following an authoritative guide on the topic, such as [Securing a Production Environment for Oracle WebLogic Server](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/lockd/secure.html).\n\n> [!NOTE]\n> To stand up the WebLogic Server cluster, open the ports to access Administration Server, Managed Servers, and form the cluster. This tutorial turns off **Windows Defender Firewall** to enable the required ports. If you don't want to turn off the firewall, make sure those ports are available inside the private virtual network: `7001` for Administration Server, `8001` for Managed Servers, and `5556` for Node Manager.\n\nNext, you install the required tools with the graphical installer. The following sections guide you to install Oracle JDK 11 and Oracle WebLogic 14c Enterprise Edition.\n\n### Download Oracle JDK 11 and Oracle WebLogic 14c\n\nOracle WebLogic Server 14c (14.1.1.0.0) is certified for use with JDK 11. Supported Oracle WebLogic Server 14c (14.1.1.0.0) clients are certified for use with JDK 11.0.6. For more information, see [JDK 11 Certification](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/notes/whatsnew.html#GUID-960100E8-DFC1-49E5-8CED-1EC1D883A42F).\n\nTo download the Oracle JDK 11 and Oracle WebLogic 14c Windows installer, follow these steps:\n\n1. Connect to `adminVM` if needed, and open the Microsoft Edge browser.\n\n1. Navigate to the [Oracle JDK 11 downloads page](https://www.oracle.com/in/java/technologies/javase/jdk11-archive-downloads.html). Select the **Windows x64 Installer**, accept the Oracle License Agreement, and download EXE file. You get a file name similar to **jdk-11.\\*_windows-x64_bin.exe**.\n\n1. Navigate to the [Oracle Fusion Middleware Software downloads page](http://www.oracle.com/technetwork/middleware/weblogic/downloads/index.html). Select the **Generic Installer**, and accept the Oracle License Agreement and download the ZIP archive. You get a file name similar to **fmw_14.\\*_wls_lite_Disk1_1of1.zip**. Pay attention to the support lifetime of the WebLogic Server version you download. For more information, see the [Oracle Support Lifetime Policy](https://www.oracle.com/us/support/library/lsp-middleware-chart-069287.pdf).\n\n### Install Oracle JDK 11\n\nThis section shows you how to install Oracle JDK 11 on Windows Server.\n\nOpen the download folder that contains JDK installer. Here the installer name is **jdk-11.0.16_windows-x64_bin.exe**. Right click the file and select **Run as administrator**. Install the JDK to the default folder **C:\\Program Files\\Java\\jdk-11.0.16\\**.\n\nAfter the installation finishes, you can validate its version in a command prompt by running the command `java -version`, with output similar to the following example:\n\n```output\njava version \"11.0.16\" 2022-07-19 LTS\nJava(TM) SE Runtime Environment 18.9 (build 11.0.16+11-LTS-199)\nJava HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.16+11-LTS-199, mixed mode)\n```\n\n### Install Oracle WebLogic Server 14c Enterprise Edition\n\nThis section shows you how to install WebLogic Server 14c on Windows Server.\n\nOpen the download folder that contains WebLogic Server installer ZIP file. Here the file name is **fmw_14.1.1.0.0_wls_lite_Disk1_1of1.zip**. Right click the file and select **Extract all** to the default path.\n\nOpen a command prompt, then use the following commands to install WebLogic Server:\n\n```cmd\nset WLS_VERSION_PREFIX=fmw_14.1.1.0.0_wls_lite\njava -jar C:\\Users\\azureuser\\Downloads\\%WLS_VERSION_PREFIX%_Disk1_1of1\\%WLS_VERSION_PREFIX%_wls_lite_generic.jar\n```\n\nThe command launches the WebLogic Server installer, as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-installation-welcome.png\" alt-text=\"Screenshot of Oracle WebLogic Server Installation Welcome.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-installation-welcome.png\":::\n\nSelect **Next**. Allow **Skip Auto Updates** to remain selected and select **Next**. Set **Oracle Home** to **C:\\Oracle\\Middleware\\Oracle_Home**, which should be the default value. Select **Next**.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-installation-location.png\" alt-text=\"Windows - Oracle WebLogic Server Installation Location.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-installation-location.png\":::\n\nSelect installation type **WebLogic Server**.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-installation-type.png\" alt-text=\"Windows - Oracle WebLogic Server Installation Type.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-installation-type.png\":::\n\nSelect **Next**. You see operating system warnings in the **Prerequisite Checks** page. Windows Server 2022 OS versions are supported on all Windows Server editions. To fix the warnings, you need to apply [Patch 34500720](https://support.oracle.com/epmos/faces/PatchDetail?patchId=34500720) after the installation.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-installation-prerequisite-checks.png\" alt-text=\"Windows - Oracle WebLogic Server Installation Prerequisite Checks.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-installation-prerequisite-checks.png\":::\n\nSelect **Next**, then **Install**. You see the installation progress as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-installation-progress.png\" alt-text=\"Windows - Oracle WebLogic Server Installation Progress.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-installation-progress.png\":::\n\nAll of the listed installs should complete without error. Select the **Next** button. You see the **Installation Complete** page. Unselect any actions in the **Next Steps** section. You perform those steps after all the machines are ready.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-installation-complete.png\" alt-text=\"Windows - Oracle WebLogic Server Installation Complete.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-installation-complete.png\":::\n\nSelect **Finished**. You finished installing Oracle WebLogic 14c and its dependencies on `adminVM`. Next, you create snapshot of `adminVM` and prepare machines for two managed severs.\n\n> [!NOTE]\n> For Oracle Weblogic Server Critical Patch, download the patches from [My Oracle Support](https://support.oracle.com/) and apply them following \"Patch an existing installation\" in [Install Patch and Upgrade](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/index.html). Make sure you've patched `adminVM` before taking a snapshot from it's OS disk. If you run into problems unzipping the patch file, see this [MyOracleSupport document](https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=311444465901186&parent=EXTERNAL_SEARCH&sourceId=PROBLEM&id=2259579.1&_afrWindowMode=0&_adf.ctrl-state=14u0vzw8om_162). You can skip this step for experimentation, but do not go to production with an unpatched WLS.\n\n### Create machines for managed servers\n\nYou installed Oracle JDK 11 and Oracle WebLogic Server 14c Enterprise Edition on `adminVM`, which runs the WebLogic Administration Server. You still need to prepare machines to run two managed servers.\n\nThis section introduces an approach to prepare machines with the snapshot of `adminVM`. You create the machines from the Azure portal.\n\n1. Stop `adminVM`. Open `adminVM` from the Azure portal, then select **Stop** to stop the machine. Make sure the machine is stopped completely before doing the next step.\n\n1. Use the following steps to take a snapshot of the `adminVM` OS disk:\n\n   1. Open `adminVM` from the Azure portal. Under **Settings**, select **Disks**, then **OS Disk**. Select the OS disk starting with **adminVM_OsDisk_**.\n   1. Select **Create snapshot**. Under **Instance details**, fill in **Name** with **snapshotAdminVMOsDisk**.\n   1. Select **Review and create** then **Create**. It takes several seconds to take the snapshot.\n\n1. Use the following steps to create `mspVM1`:\n\n   1. First, create the OS disk for `mspVM1`. Open the snapshot you created in previous step, **snapshotAdminVMOsDisk**. Select **Create disk**. Under **Disk details**, fill in **Disk name** with **mspVM1_Os_Disk_1**. Select **Review and create**, then **Create**. It takes several seconds. When the process is complete, select **Go to resource**.\n   1. Create the virtual machine `mspVM1`. Open the OS disk you created previously. In this example, its name is `mspVM1_Os_Disk_1`. Select **Create VM**. Under **Instance details**, fill in **Virtual machine name** with **mspVM1**. Select **Review and create** then **Create**. Ensure you have no errors before proceeding. The process takes several minutes.\n   1. The machine is created from the snapshot of `adminVM`, so it has the same computer name as `adminVM`. To change computer name to `mspVM1`, first remote connect to the machine. The user name and password are the same as with `adminVM`. Open a PowerShell terminal, and run the following command:\n\n      ```powershell\n      Rename-Computer -NewName mspvm1 -Restart\n      ```\n\n1. Use the following steps to create `mspVM2`:\n\n   1. Create the OS disk for `mspVM2`. Open the snapshot you created previously. In this example, its name is `snapshotAdminVMOsDisk`. If you can't find the disk, search for **snapshotAdminVMOsDisk** in the **Search resources, services and docs**. Select **Create disk**. Under **Disk details**, fill in **Name** with **mspVM2_Os_Disk_1**. Select **Review and create**, then **Create**. It takes several seconds. When the process is complete, select **Go to resource**.\n   1. Create virtual machine `mspVM2`. Open the OS disk you created previously, `mspVM2_Os_Disk_1`， select **Create VM**. Under **Instance details**, fill in **Virtual machine name** with **mspVM2**. Select **Review + create** then **Create**. It takes several minutes.\n   1. Remote connect to the machine. The user name and password are the same as with `adminVM`. Open a PowerShell terminal. Use the following command to change the computer name:\n\n      ```powershell\n      Rename-Computer -NewName mspvm2 -Restart\n      ```\n\n1. Use the [az vm start](/cli/azure/vm#az-vm-start) command to start `adminVM`.\n\n   ```azurecli\n   az vm start --resource-group ${RESOURCE_GROUP_NAME} --name adminVM\n   ```\n\n[!INCLUDE [start-admin-get-ip](includes/wls-manual-guidance-start-admin-and-get-ip.md)]\n\nNow, all the machines are ready. Next, you configure a WebLogic cluster.\n\n### Configure the WebLogic Server domain and cluster\n\n[!INCLUDE [configure-domain](includes/wls-manual-guidance-configure-domain.md)]\n\n#### Create the domain using configuration wizard\n\nThis section shows the steps to create a new WebLogic Server domain on `adminVM`.\n\nConnect to `adminVM`. Open a command prompt, then use the following commands to start the Oracle Configuration Wizard:\n\n```cmd\ncd C:\\Oracle\\Middleware\\Oracle_Home\\oracle_common\\common\\bin\nconfig.cmd\n```\n\nThe Oracle Configuration Wizard directs you to configure the domain. The following page asks for domain type and location. Select **Create a new domain** and set domain location to **C:\\domains\\wlsd**. The domain configuration is saved to this folder.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-configure-domain-location.png\" alt-text=\"Windows - Oracle Configuration Wizard - Domain Location.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-configure-domain-location.png\":::\n\nSelect **Next**, select **Create Domain Using Product Templates**, and keep the default selected template, as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-configure-domain-templates.png\" alt-text=\"Windows - Oracle Configuration Wizard - Templates.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-configure-domain-templates.png\":::\n\nSelect **Next**, then input the **Administration Account** name as **weblogic** and the password as **Secret123456**, as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-admin-account.png\" alt-text=\"Windows - Oracle Configuration Wizard - Administration Account.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-admin-account.png\":::\n\nSelect **Next**. For domain mode, select **Production**; for JDK, keep the default option.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-configure-domain-jdk.png\" alt-text=\"Windows - Oracle Configuration Wizard - Domain Mode and JDK.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-configure-domain-jdk.png\":::\n\nSelect **Next**. For advanced configurations, select **Administration Server**, **Node Manager**, and **Topology**.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-advanced-configuration.png\" alt-text=\"Windows - Oracle Configuration Wizard - Advanced Configurations.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-advanced-configuration.png\":::\n\nSelect **Next**, fill in the administration **Server Name** with **admin**. Fill in the **Listen IP Address** with the private IP for the  `adminVM` you obtained previously. In this example, the value is `192.168.0.4`.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-admin-server.png\" alt-text=\"Windows - Oracle Configuration Wizard - Administration Server.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-admin-server.png\":::\n\nSelect **Next**. For **Node Manager Type**, select **Per Domain Custom Location**, and fill in the location with **C:\\domains\\wlsd\\nodemanager**. This location should be filled in as the default. For **Node Manager Credentials**, the username is **weblogic** and the password is **Secret123456**.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-configure-domain-nodemanager.png\" alt-text=\"Windows - Oracle Configuration Wizard - Node Manager.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-configure-domain-nodemanager.png\":::\n\nSelect **Next**. For managed servers, add the following items:\n\n| Server name | Listen address                      | Listen port |\n|-------------|-------------------------------------|-------------|\n| `msp1`      | The private IP address of `mspVM1`. | `8001`      |\n| `msp2`      | The private IP address of `mspVM2`. | `8001`      |\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-domain-configuration-managed-servers.png\" alt-text=\"Windows - Oracle Configuration Wizard - Managed Servers.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-domain-configuration-managed-servers.png\":::\n\nSelect **Next**. Create a cluster with name `cluster1`. You can leave the **Cluster Address**, **Frontend Host**, and other values blank.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-cluster.png\" alt-text=\"Windows - Oracle Configuration Wizard - Cluster.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-cluster.png\":::\n\nSelect **Next**. Don't change the values for **Server Templates** or **Dynamic Servers**.\n\nFor **Assign Servers to Clusters**, assign both `msp1` and `msp2` to `cluster1`.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-assign-servers-to-cluster.png\" alt-text=\"Windows - Oracle Configuration Wizard - Assign Servers to Clusters.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-assign-servers-to-cluster.png\":::\n\nSelect **Next**. Add machines `adminVM`, `mspVM1`, and `mspVM2`.\n\n| Name      | Node manager listen address          | Node manager listen port |\n|-----------|--------------------------------------|--------------------------|\n| `mspVM1`  | The private IP address of `mspVM1`.  | `5556`                   |\n| `mspVM2`  | The private IP address of `mspVM2`.  | `5556`                   |\n| `adminVM` | The private IP address of `adminVM`. | `5556`                   |\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-domain-configuration-machines.png\" alt-text=\"Windows - Oracle Configuration Wizard - Machines.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-domain-configuration-machines.png\":::\n\nSelect **Next**. For **Assign Servers to Machines**, assign server `admin` to `adminVM`, `msp1` to `mspVM1`, and `msp2` to `mspVM2`.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-assign-servers-to-machines.png\" alt-text=\"Windows - Oracle Configuration Wizard - Assign Servers to Machines.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-assign-servers-to-machines.png\":::\n\nSelect **Next**. You see the **Configuration Summary**, as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-summary.png\" alt-text=\"Windows - Oracle Configuration Wizard - Configuration Summary\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-summary.png\":::\n\nCarefully examine the summary to verify everything looks as expected. Select **Create**. The **Configuration Progress** page shows the progress. All the listed items should be configured successfully.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-configuration-progress.png\" alt-text=\"Windows - Oracle Configuration Wizard - Configuration Progress.\" lightbox=\"media/migrate-weblogic-to-vm-manually/wls14c-configuration-domain-configuration-progress.png\":::\n\nSelect **Next**. Finally, the URL of the Administration Server is shown. The server isn't yet running, and you don't need this URL anyway, so select **Finish**.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-configure-domain-end.png\" alt-text=\"Windows - Oracle Configuration Wizard - End.\" lightbox=\"media/migrate-weblogic-to-vm-manually/winserv22-wls-configure-domain-end.png\":::\n\nYou finished configuring the `wlsd` domain with a cluster `cluster1` including two managed servers.\n\n#### Create replicas using the pack and unpack command\n\nThis tutorial uses the WebLogic Server pack and unpack command to extend the domain. For more information, see [Overview of the Pack and Unpack Commands](https://docs.oracle.com/en/middleware/fusion-middleware/12.2.1.3/wldpu/overview-pack-and-unpack-commands.html#GUID-D37A439D-EB49-40AC-BDA8-0E362E35827F). Use the following steps to create the replicas:\n\n1. First, pack the domain configuration on `adminVM` by following these instructions:\n\n   Remote connect to the machine and run the following command:\n\n   ```cmd\n   cd C:\\Oracle\\Middleware\\Oracle_Home\\oracle_common\\common\\bin\n   pack.cmd -domain=C:\\domains\\wlsd -managed=true -template=C:\\Temp\\cluster.jar -template_name=\"wlsd\"\n   ```\n\n   You see output similar to the following example if the command completes successfully:\n\n   ```output\n   C:\\Oracle\\Middleware\\Oracle_Home\\oracle_common\\common\\bin>pack.cmd -domain=C:\\domains\\wlsd -managed=true -template=C:\\Temp\\cluster.jar -template_name=\"wlsd\"\n   << read domain from \"C:/domains/wlsd\"\n   >>  succeed: read domain from \"C:/domains/wlsd\"\n   << set config option Managed to \"true\"\n   >>  succeed: set config option Managed to \"true\"\n   << write template to \"C:/Temp/cluster.jar\"\n   ..............................\n   >>  succeed: write template to \"C:/Temp/cluster.jar\"\n   << close template\n   >>  succeed: close template\n   ```\n\n   Then, copy **C:\\Temp\\cluster.jar** to `mspVM1` and `mspVM2` and save to the same path.\n\n1. Next, apply the domain configuration to `mspVM1`.\n\n   Remote connect to the machine and run the following command:\n\n   ```cmd\n   cd C:\\Oracle\\Middleware\\Oracle_Home\\oracle_common\\common\\bin\n   unpack.cmd -domain=C:\\domains\\wlsd -template=C:\\Temp\\cluster.jar\n   ```\n\n   You see output similar to the following example if the command completes successfully:\n\n   ```output\n   C:\\Oracle\\Middleware\\Oracle_Home\\oracle_common\\common\\bin>unpack.cmd -domain=C:\\domains\\wlsd -template=C:\\Temp\\cluster.jar\n   << read template from \"C:/Temp/cluster.jar\"\n   >>  succeed: read template from \"C:/Temp/cluster.jar\"\n   << set config option DomainName to \"wlsd\"\n   >>  succeed: set config option DomainName to \"wlsd\"\n   >>  validateConfig \"KeyStorePasswords\"\n   >>  succeed: validateConfig \"KeyStorePasswords\"\n   << write Domain to \"C:\\domains\\wlsd\"\n   ..................................................\n   >>  succeed: write Domain to \"C:\\domains\\wlsd\"\n   << close template\n   >>  succeed: close template\n   ```\n\n   Next, rename the configuration file **config_bootstrap.xml** to **config.xml**. In the command prompt, run the following commands:\n\n   ```cmd\n   cd C:\\domains\\wlsd\\config\n   ren config_bootstrap.xml config.xml\n   ```\n\n1. Next, apply the domain configuration to `mspVM2`.\n\n   Remote connect to the machine and run the following command:\n\n   ```cmd\n   cd C:\\Oracle\\Middleware\\Oracle_Home\\oracle_common\\common\\bin\n   unpack.cmd -domain=C:\\domains\\wlsd -template=C:\\Temp\\cluster.jar\n   ```\n\n   Then, rename the configuration file **config_bootstrap.xml** to **config.xml**:\n\n   ```cmd\n   cd C:\\domains\\wlsd\\config\n   ren config_bootstrap.xml config.xml\n   ```\n\n> [!NOTE]\n> The unpack command generates the **config_bootstrap.xml** file based on the **config.xml** file in the template, which may cause error `java.io.FileNotFoundException: C:\\domains\\wlsd\\.\\config\\config.xml (The system cannot find the file specified)` when starting the managed server. This tutorial renames **config_bootstrap.xml** to **config.xml** to avoid this problem.\n\nYou replicated the domain configuration on `mspVM1` and `mspVM2`, so you're ready to start the servers.\n\n### Set up the WebLogic Server as a Windows service\n\nThis section uses a Windows service to configure Oracle WebLogic Server to start automatically when you boot a Windows host computer. For more information, see [Setting Up a WebLogic Server Instance as a Windows Service](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/start/winservice.html#GUID-6A5A23B2-2EAB-4C3E-8711-B7BA49C50D75).\n\n> [!NOTE]\n> This section doesn't enable graceful shutdowns. If you use the Microsoft Management Console to stop a server instance, it kills the server's Java Virtual Machine (JVM). If you kill the JVM, the server immediately stops all processing. To set up graceful shutdowns, see [Enabling Graceful Shutdowns](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/start/winservice.html#GUID-3F42708A-EC0C-451F-B8C7-68C9EAE2BD8B).\n\n#### Set up the Administration Server as Windows service\n\nYou're now ready to start the Administration Server. Use the following instructions to create a Windows service to start the Administration Server:\n\nRemote connect to `adminVM`. In the command prompt, change to the directory **C:\\domains\\wlsd**. Enter **startWebLogic.cmd**. For the credentials of the admin account, enter **weblogic** for the username and **Secret123456** for the password. If the server is running, it prints a line to standard out that is similar to the following output:\n\n```output\n... ...\nEnter username to boot WebLogic server:weblogic\nEnter password to boot WebLogic server:Secret123456\n\n... ...\n<Oct 18, 2022, 6:48:56,997 AM Coordinated Universal Time> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to RUNNING.>\n```\n\nCreate a Boot Identity file **C:\\domains\\wlsd\\servers\\admin\\security\\boot.properties** and save the admin account user name and password to the file. For more information, see [Boot Identity Files](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/start/overview.html#GUID-FAA04F2F-41F3-4632-8B40-620B8A67E856). Paste the following text into a command prompt:\n\n```cmd\nMKDIR C:\\domains\\wlsd\\servers\\admin\\security\nTYPE CON > C:\\domains\\wlsd\\servers\\admin\\security\\boot.properties\nusername=weblogic\npassword=Secret123456\n```\n\nPress <kbd>Enter</kbd>, <kbd>Ctrl</kbd>+<kbd>Z</kbd>, <kbd>Enter</kbd>.\n\nNext, create a Windows service for the Administration Server. Paste the following text into a command prompt. Press <kbd>Enter</kbd>, <kbd>Ctrl</kbd>+<kbd>Z</kbd>, <kbd>Enter</kbd>.\n\n```cmd\nTYPE CON > C:\\domains\\wlsd\\autoStartup.cmd\necho off\nSETLOCAL\nset MW_HOME=C:\\Oracle\\Middleware\\Oracle_Home\nset DOMAIN_NAME=wlsd\nset USERDOMAIN_HOME=C:\\domains\\wlsd\nset SERVER_NAME=admin\nset WL_HOME=C:\\Oracle\\Middleware\\Oracle_Home\\wlserver\nset DOMAIN_PRODUCTION_MODE=true\ncall \"C:\\domains\\wlsd\\bin\\setDomainEnv.cmd\"\ncall \"C:\\Oracle\\Middleware\\Oracle_Home\\wlserver\\server\\bin\\installSvc.cmd\"\nENDLOCAL\n```\n\nRun the newly created file. Enter **C:\\domains\\wlsd\\autoStartup.cmd**. The command prompt runs the script as a batch file.\n\nIf the script runs successfully, it creates a Windows service named `wlsd_admin` and prints a line to standard out that is similar to the following output:\n\n```output\n... ...\nwlsvc wlsd_admin installed.\n```\n\nThis example uses node manager to control managed servers. Create a Windows service for node manager on `adminVM`.\n\nIn the command prompt, change to the directory **C:\\domains\\wlsd\\bin**. Enter **installNodeMgrSvc.cmd**. If the service is created successfully, it prints a line to standard out that is similar to the following output:\n\n```output\n... ...\nOracle Weblogic wlsd NodeManager (C_Oracle_MIDDLE~1_ORACLE~1_wlserver) installed.\n```\n\nFinally, restart the machine to activate the Windows services.\n\n#### Configure and start the managed servers\n\nNext, set up the node manager as a Windows service on `mspVM1` and `mspVM2`.\n\nRemote connect to `mspVM1` and `mspVM2`, open a command prompt, and then change to directory **C:\\domains\\wlsd\\bin**. Enter **installNodeMgrSvc.cmd**. If the service is created successfully, it prints a line to standard out that is similar to the following output:\n\n```output\n... ...\nOracle Weblogic wlsd NodeManager (C_Oracle_MIDDLE~1_ORACLE~1_wlserver) installed.\n```\n\nRestart `mspVM1` and `mspVM2` to start the node manager.\n\nNext, start the managed server from the Administration Console portal. Open a browser on `adminVM` and use the following steps to start the server:\n\n[!INCLUDE [start-managed-server](includes/wls-manual-guidance-start-managed-server.md)]\n\n#### Set up the managed server as a Windows service\n\nThe steps in this section show how to create a Windows service for each of the managed servers. This service starts the managed server automatically when the machine is rebooted.\n\n1. Use the following instructions to set up `msp1` as a Windows service:\n\n   Remote connect to `mspVM1`. Open a command prompt and paste the following text, replacing `ADMIN_URL` with the actual value. Press <kbd>Enter</kbd>, <kbd>Ctrl</kbd>+<kbd>Z</kbd>, <kbd>Enter</kbd>.\n\n   ```cmd\n   TYPE CON > C:\\domains\\wlsd\\autoStartup.cmd\n   echo off\n   SETLOCAL\n   set MW_HOME=C:\\Oracle\\Middleware\\Oracle_Home\n   set DOMAIN_NAME=wlsd\n   set USERDOMAIN_HOME=C:\\domains\\wlsd\n   set SERVER_NAME=msp1\n   set ADMIN_URL=http://192.168.0.4:7001\n   set WL_HOME=C:\\Oracle\\Middleware\\Oracle_Home\\wlserver\n   set DOMAIN_PRODUCTION_MODE=true\n   call \"C:\\domains\\wlsd\\bin\\setDomainEnv.cmd\"\n   call \"C:\\Oracle\\Middleware\\Oracle_Home\\wlserver\\server\\bin\\installSvc.cmd\"\n   ENDLOCAL\n   ```\n\n   Enter **C:\\domains\\wlsd\\autoStartup.cmd**. The command prompt runs the script as a batch file.\n\n   Create a Boot Identity file **C:\\domains\\wlsd\\servers\\msp1\\security\\boot.properties** and save the admin account user name and password to the file.\n\n   Paste the following text into a command prompt:\n\n   ```cmd\n   MKDIR C:\\domains\\wlsd\\servers\\msp1\\security\n   TYPE CON > C:\\domains\\wlsd\\servers\\msp1\\security\\boot.properties\n   username=weblogic\n   password=Secret123456\n   ```\n\n   Press <kbd>Enter</kbd>, <kbd>Ctrl</kbd>+<kbd>Z</kbd>, <kbd>Enter</kbd>.\n\n1. Set up `msp2` as a Windows service\n\n   Remote connect to `mspVM2`. Open a command prompt and paste the following text, replacing `ADMIN_URL` with the actual value. Press <kbd>Enter</kbd>, <kbd>Ctrl</kbd>+<kbd>Z</kbd>, <kbd>Enter</kbd>.\n\n   ```cmd\n   TYPE CON > C:\\domains\\wlsd\\autoStartup.cmd\n   echo off\n   SETLOCAL\n   set MW_HOME=C:\\Oracle\\Middleware\\Oracle_Home\n   set DOMAIN_NAME=wlsd\n   set USERDOMAIN_HOME=C:\\domains\\wlsd\n   set SERVER_NAME=msp2\n   set ADMIN_URL=http://192.168.0.4:7001\n   set WL_HOME=C:\\Oracle\\Middleware\\Oracle_Home\\wlserver\n   set DOMAIN_PRODUCTION_MODE=true\n   call \"C:\\domains\\wlsd\\bin\\setDomainEnv.cmd\"\n   call \"C:\\Oracle\\Middleware\\Oracle_Home\\wlserver\\server\\bin\\installSvc.cmd\"\n   ENDLOCAL\n   ```\n\n   Enter **C:\\domains\\wlsd\\autoStartup.cmd**. The command prompt runs the script as a batch file.\n\n   Create a Boot Identity file **C:\\domains\\wlsd\\servers\\msp1\\security\\boot.properties** and save the admin account user name and password to the file.\n\n   Paste the following text into a command prompt:\n\n   ```cmd\n   MKDIR C:\\domains\\wlsd\\servers\\msp2\\security\n   TYPE CON > C:\\domains\\wlsd\\servers\\msp2\\security\\boot.properties\n   username=weblogic\n   password=Secret123456\n   ```\n\n   Press <kbd>Enter</kbd>, <kbd>Ctrl</kbd>+<kbd>Z</kbd>, <kbd>Enter</kbd>.\n\nNow, the managed servers start up automatically when the machine restarts.\n\n### Remove the public IPs\n\nIn order to remote connect to the Windows Server machines, all of them are assigned a public IP address. Now that the configuration is done, there's no need to keep the public IP address. For security, remove the public IP addresses from `adminVM`, `mspVM1`, and `mspVM2`, as shown in the following example. For more information, see [Dissociate a public IP address from an Azure VM](/azure/virtual-network/ip-services/remove-public-ip-address-vm).\n\n```azurecli\nexport ADMINVM_NIC_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name adminVM \\\n    --query networkProfile.networkInterfaces[0].id \\\n    --output tsv)\nexport ADMINVM_NIC_NAME=$(az network nic show \\\n    --ids ${ADMINVM_NIC_ID} \\\n    --query name \\\n    --output tsv)\nexport ADMINVM_NIC_IP_CONFIG=$(az network nic show \\\n    --ids $ADMINVM_NIC_ID \\\n    --query ipConfigurations[0].name \\\n    --output tsv)\nexport ADMINVM_PUBLIC_IP=$(az network nic show \\\n    --ids ${ADMINVM_NIC_ID} \\\n    --query ipConfigurations[0].publicIpAddress.id \\\n    --output tsv)\nexport ADMINVM_NSG_ID=$(az network nic show \\\n    --ids ${ADMINVM_NIC_ID} \\\n    --query networkSecurityGroup.id \\\n    --output tsv)\n\naz network nic ip-config update \\\n    --name ${ADMINVM_NIC_IP_CONFIG} \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --nic-name ${ADMINVM_NIC_NAME} \\\n    --remove PublicIpAddress\naz network public-ip delete --ids ${ADMINVM_PUBLIC_IP}\naz network nic update \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name ${ADMINVM_NIC_NAME} \\\n    --remove networkSecurityGroup\naz network nsg delete --ids ${ADMINVM_NSG_ID}\n\nexport MSPVM1VM_NIC_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name mspVM1 \\\n    --query networkProfile.networkInterfaces[0].id \\\n    --output tsv)\nexport MSPVM1VM_NIC_NAME=$(az network nic show \\\n    --ids ${MSPVM1VM_NIC_ID} \\\n    --query name \\\n    --output tsv)\nexport MSPVM1VM_NIC_IP_CONFIG=$(az network nic show \\\n    --ids ${MSPVM1VM_NIC_ID} \\\n    --query ipConfigurations[0].name \\\n    --output tsv)\nexport MSPVM1VM_PUBLIC_IP=$(az network nic show \\\n    --ids ${MSPVM1VM_NIC_ID} \\\n    --query ipConfigurations[0].publicIpAddress.id \\\n    --output tsv)\nexport MSPVM1VM_NSG_ID=$(az network nic show \\\n    --ids ${MSPVM1VM_NIC_ID} \\\n    --query networkSecurityGroup.id \\\n    --output tsv)\n\naz network nic ip-config update \\\n    --name ${MSPVM1VM_NIC_IP_CONFIG} \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --nic-name ${MSPVM1VM_NIC_NAME} \\\n    --remove PublicIpAddress\naz network public-ip delete --ids ${MSPVM1VM_PUBLIC_IP}\naz network nic update \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name ${MSPVM1VM_NIC_NAME} \\\n    --remove networkSecurityGroup\naz network nsg delete --ids ${MSPVM1VM_NSG_ID}\n\nexport MSPVM2VM_NIC_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name mspVM2 \\\n    --query networkProfile.networkInterfaces[0].id \\\n    --output tsv)\nexport MSPVM2VM_NIC_NAME=$(az network nic show \\\n    --ids ${MSPVM2VM_NIC_ID} \\\n    --query name \\\n    --output tsv)\nexport MSPVM2VM_NIC_IP_CONFIG=$(az network nic show \\\n    --ids ${MSPVM2VM_NIC_ID} \\\n    --query ipConfigurations[0].name \\\n    --output tsv)\nexport MSPVM2VM_PUBLIC_IP=$(az network nic show \\\n    --ids ${MSPVM2VM_NIC_ID} \\\n    --query ipConfigurations[0].publicIpAddress.id \\\n    --output tsv)\nexport MSPVM2VM_NSG_ID=$(az network nic show \\\n    --ids ${MSPVM2VM_NIC_ID} \\\n    --query networkSecurityGroup.id \\\n    --output tsv)\n\naz network nic ip-config update \\\n    --name ${MSPVM2VM_NIC_IP_CONFIG} \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --nic-name ${MSPVM2VM_NIC_NAME} \\\n    --remove PublicIpAddress\naz network public-ip delete --ids ${MSPVM2VM_PUBLIC_IP}\naz network nic update \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name ${MSPVM2VM_NIC_NAME} \\\n    --remove networkSecurityGroup\naz network nsg delete --ids ${MSPVM2VM_NSG_ID}\n```\n\n---\n\n## Expose WebLogic Server with Azure Application Gateway\n\nNow that you created the WebLogic Server (WLS) cluster on either Windows or GNU/Linux virtual machines, this section walks you through the process of exposing WebLogic Server to the internet with Azure Application Gateway.\n\n### Create the Azure Application Gateway\n\nTo expose WebLogic Server to the internet, a public IP address is required. Create the public IP address and then associate an Azure Application gateway with it. Use [az network public-ip create](/cli/azure/network/public-ip#az-network-public-ip-create) to create it, as shown in the following example:\n\n```azurecli\naz network public-ip create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myAGPublicIPAddress \\\n    --allocation-method Static \\\n    --sku Standard\n```\n\nYou add the backend servers to Application Gateway backend pool. Query backend IP addresses using the following commands:\n\n```azurecli\nexport ADMINVM_NIC_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name adminVM \\\n    --query networkProfile.networkInterfaces[0].id \\\n    --output tsv)\nexport ADMINVM_IP=$(az network nic show \\\n    --ids ${ADMINVM_NIC_ID} \\\n    --query ipConfigurations[0].privateIPAddress \\\n    --output tsv)\nexport MSPVM1_NIC_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name mspVM1 \\\n    --query networkProfile.networkInterfaces[0].id \\\n    --output tsv)\nexport MSPVM1_IP=$(az network nic show \\\n    --ids ${MSPVM1_NIC_ID} \\\n    --query ipConfigurations[0].privateIPAddress \\\n    --output tsv)\nexport MSPVM2_NIC_ID=$(az vm show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name mspVM2 \\\n    --query networkProfile.networkInterfaces[0].id \\\n    --output tsv)\nexport MSPVM2_IP=$(az network nic show \\\n    --ids ${MSPVM2_NIC_ID} \\\n    --query ipConfigurations[0].privateIPAddress \\\n    --output tsv)\n```\n\nNext, create an Azure Application Gateway. The following example creates an application gateway with managed servers in the default backend pool:\n\n```azurecli\naz network application-gateway create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myAppGateway \\\n    --public-ip-address myAGPublicIPAddress \\\n    --location eastus \\\n    --capacity 2 \\\n    --http-settings-port 80 \\\n    --http-settings-protocol Http \\\n    --frontend-port 80 \\\n    --sku Standard_V2 \\\n    --subnet wlsVMGateway \\\n    --vnet-name myVNet \\\n    --priority 1001 \\\n    --servers ${MSPVM1_IP} ${MSPVM2_IP}\n```\n\nThe managed servers expose their workloads with port `8001`. Use the following commands to update the `appGatewayBackendHttpSettings` by specifying backend port `8001` and creating a probe for it:\n\n```azurecli\naz network application-gateway probe create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --gateway-name myAppGateway \\\n    --name clusterProbe \\\n    --protocol http \\\n    --host 127.0.0.1 \\\n    --path /weblogic/ready\n\naz network application-gateway http-settings update \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --gateway-name myAppGateway \\\n    --name appGatewayBackendHttpSettings \\\n    --port 8001 \\\n    --probe clusterProbe\n```\n\nThe next commands provision a basic rule `rule1`. This example adds a path to the Administration Server. First, use the following commands to create a URL path map:\n\n```azurecli\naz network application-gateway address-pool create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --gateway-name myAppGateway \\\n    --name adminServerAddressPool \\\n    --servers ${ADMINVM_IP}\n\naz network application-gateway probe create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --gateway-name myAppGateway \\\n    --name adminProbe \\\n    --protocol http \\\n    --host 127.0.0.1 \\\n    --path /weblogic/ready\n\naz network application-gateway http-settings create \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --gateway-name myAppGateway \\\n    --name adminBackendSettings \\\n    --port 7001 \\\n    --protocol Http \\\n    --probe adminProbe\n\naz network application-gateway url-path-map create \\\n    --gateway-name myAppGateway \\\n    --name urlpathmap \\\n    --paths /console/* \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --address-pool adminServerAddressPool \\\n    --default-address-pool appGatewayBackendPool \\\n    --default-http-settings appGatewayBackendHttpSettings \\\n    --http-settings adminBackendSettings \\\n    --rule-name consolePathRule\n```\n\nNext, use [az network application-gateway rule update](/cli/azure/network/application-gateway/rule#az-network-application-gateway-rule-update) to update the rule type to be `PathBasedRouting`.\n\n```azurecli\naz network application-gateway rule update \\\n    --gateway-name myAppGateway \\\n    --name rule1 \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --http-listener appGatewayHttpListener \\\n    --rule-type PathBasedRouting \\\n    --url-path-map urlpathmap \\\n    --priority 1001 \\\n    --address-pool appGatewayBackendPool \\\n    --http-settings appGatewayBackendHttpSettings\n```\n\nYou're now able to access the Administration Server with the URL `http://<gateway-public-ip-address>/console/`. Run the following commands to get the URL:\n\n```azurecli\nexport APPGATEWAY_IP=$(az network public-ip show \\\n    --resource-group ${RESOURCE_GROUP_NAME} \\\n    --name myAGPublicIPAddress \\\n    --query [ipAddress] \\\n    --output tsv)\necho \"admin console URL is http://${APPGATEWAY_IP}/console/\"\n```\n\nVerify that you can sign into the Administration Server console. If you can't, troubleshoot and resolve the problem before proceeding.\n\n> [!NOTE]\n> This example sets up simple access to the WebLogic servers with HTTP. If you want secure access, configure TLS/SSL termination by follow the instructions in [End to end TLS with Application Gateway](/azure/application-gateway/ssl-overview).\n>\n> This example exposes the Administration Server console via the Application Gateway. Don't do this in a production environment.\n\n## Deploy a sample application\n\nThis section shows you how to deploy an application to the WebLogic Server cluster. First, download [testwebapp.war](https://aka.ms/wls-aks-testwebapp) from Oracle and save the file to your local filesystem. Then, use the following steps to deploy the application:\n\n1. Open a web browser.\n1. Navigate to the Administration Console portal with the URL `http://<gateway-public-ip-address>/console/`, then sign in with your admin account and password. In this example, they're `weblogic/Secret123456`.\n1. Under the **Change Center**, if such a button exists, select **Lock and Edit**. If this button doesn't exist, verify that some text such as \"Future changes will automatically be activated as you modify, add or delete items in this domain\" exists under **Change Center**.\n1. Under **Domain Structure**, select **Deployments**. If you see an error message similar to `Unexpected error encountered while obtaining monitoring information for applications.`, you can safely ignore it. Select **Configuration** then **Install**. Nestled within the text is a hyperlink with the text **Upload your files**. Select it. Select **Choose file** , then select the **testwebapp.war** built in the preceding step. Select **Next** then **Next**.\n1. Ensure that **Install this deployment as an application** is selected. Select **Next**.\n1. Under **Available targets for testwebapp**, select deployment target `cluster1`, select **Next**, then select **Finish**.\n1. Under the **Change Center**, if such a button exists, select **Activate Changes**. You must complete this step. Failure to complete this step causes the changes you made to not take effect. If this button doesn't exist, verify that some text such as `Future changes will automatically be activated as you modify, add or delete items in this domain` exists under **Change Center**.\n1. Under **Domain Structure**, select **Deployments** then **Control**. Select **testwebapp** then select **Start**, **Servicing all requests**.\n1. Select **Yes**.\n1. You see a message saying `Start requests have been sent to the selected deployments.` The status of the application must be **Active**.\n\n## Test the WebLogic Server cluster configuration\n\nYou finished configuring the WebLogic Server cluster and deploying the Java application to it. Use the following steps to access the application to validate all the settings:\n\n1. Open a web browser.\n1. Navigate to the application with the URL `http://<gateway-public-ip-address>/testwebapp/`.\n\n## Clean up resources\n\nDelete the resource group with the following command:\n\n```azurecli\naz group delete --name ${RESOURCE_GROUP_NAME} --yes --no-wait\n```\n\n## Next steps\n\nContinue to explore options to run WebLogic Server on Azure.\n\n* [WebLogic Server on Azure Virtual Machines](/azure/virtual-machines/workloads/oracle/oracle-weblogic?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n* [WebLogic Server on Azure Kubernetes Service](/azure/virtual-machines/workloads/oracle/weblogic-aks?toc=/azure/developer/java/ee/toc.json&bc=/azure/developer/java/breadcrumb/toc.json)\n\nFor more information about Oracle WebLogic offers, see [Oracle WebLogic Server on Azure](https://aka.ms/wls-contact-me). These offers are all *Bring-Your-Own-License*. They assume you already have the appropriate licenses with Oracle and are properly licensed to run offers in Azure.\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-to-jboss-eap-on-azure-app-service.md",
    "content": "---\ntitle: Migrate WebLogic Server applications to JBoss EAP on Azure App Service\ndescription: This guide describes what you should be aware of when you want to migrate an existing WebLogic Server application to run on Azure App Service using JBoss EAP.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-extended-java, devx-track-java, devx-track-javaee, devx-track-javaee-jbosseap, devx-track-javaee-jbosseap-appsvc, migration-java, linux-related-content\n---\n\n# Migrate WebLogic Server applications to JBoss EAP on Azure App Service\n\nThis guide describes what you should be aware of when you want to migrate an existing WebLogic Server application to run on Azure App Service using JBoss EAP.\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\nIf you can't meet any of these pre-migration requirements, see the companion migration guide to migrate your applications to Virtual Machines instead: [Migrate WebLogic Server applications to Azure Virtual Machines](migrate-weblogic-to-virtual-machines.md)\n\n[!INCLUDE [inventory-server-capacity-jboss-eap](includes/inventory-server-capacity-jboss-eap.md)]\n\n[!INCLUDE [inventory-all-secrets](includes/inventory-all-secrets.md)]\n\n[!INCLUDE [inventory-all-certificates](includes/inventory-all-certificates.md)]\n\n[!INCLUDE [inventory-jndi-resources](includes/inventory-jndi-resources.md)]\n\n[!INCLUDE [domain-configuration](includes/inspect-your-domain-configuration.md)]\n\n[!INCLUDE [determine-whether-session-replication-is-used-jboss-eap](includes/determine-whether-session-replication-is-used-jboss-eap.md)]\n\n[!INCLUDE [document-datasources](includes/document-datasources.md)]\n\n[!INCLUDE [determine-whether-weblogic-has-been-customized](includes/determine-whether-weblogic-has-been-customized.md)]\n\n[!INCLUDE [determine-whether-a-connection-to-on-premises-is-needed](includes/determine-whether-a-connection-to-on-premises-is-needed.md)]\n\n[!INCLUDE [determine-whether-jms-queues-or-topics-are-in-use](includes/determine-whether-jms-queues-or-topics-are-in-use.md)]\n\n[!INCLUDE [determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries](includes/determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries.md)]\n\n[!INCLUDE [determine-whether-osgi-bundles-are-used](includes/determine-whether-osgi-bundles-are-used.md)]\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code.md)]\n\n[!INCLUDE [determine-whether-oracle-service-bus-is-in-use](includes/determine-whether-oracle-service-bus-is-in-use.md)]\n\n[!INCLUDE [determine-whether-your-application-is-composed-of-multiple-wars](includes/determine-whether-your-application-is-composed-of-multiple-wars.md)]\n\n[!INCLUDE [determine-whether-your-application-is-packaged-as-an-ear](includes/determine-whether-your-application-is-packaged-as-an-ear.md)]\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n### Validate that the supported Java version works correctly\n\nJBoss EAP on Azure App Service supports Java 8 and 11. Therefore, you'll need to validate that your application is able to run correctly using that supported version. This validation is especially important if your current server is using a supported JDK (such as Oracle JDK or IBM OpenJ9).\n\nTo obtain your current Java version, sign in to your production server and run the following command:\n\n```bash\njava -version\n```\n\n### Determine whether your application relies on scheduled jobs\n\nScheduled jobs, such as Quartz Scheduler tasks or Unix cron jobs, should NOT be used with Azure App Service. Azure App Service will not prevent you from deploying an application containing scheduled tasks internally. However, if your application is scaled out, the same scheduled job may run more than once per scheduled period. This situation can lead to unintended consequences.\n\nTo execute scheduled jobs on Azure, consider using Azure Functions with a Timer Trigger. For more information, see [Timer trigger for Azure Functions](/azure/azure-functions/functions-bindings-timer). You don't need to migrate the job code itself into a function. The function can simply invoke a URL in your application to trigger the job.\n\n> [!NOTE]\n> To prevent malicious use, you'll likely need to ensure that the job invocation endpoint requires credentials. In this case, the trigger function will need to provide the credentials.\n\n### Determine whether WebLogic Scripting Tool (WLST) is used\n\nIf you currently use WLST to perform the deployment, you will need to assess what it is doing. If WLST is changing any (runtime) parameters of your application as part of the deployment, you will need to make sure those parameters conform to one of the following options:\n\n* They are externalized as app settings.\n* They are embedded in your application.\n* They are using the JBoss CLI during deployment.\n\nIf WLST is doing more than what is mentioned above, you will have some additional work to do during migration.\n\n### Determine whether your application uses WebLogic-specific APIs\n\nIf your application uses WebLogic-specific APIs, you will need to refactor your application to NOT use them. For example, if you have used a class mentioned in the [Java API Reference for Oracle WebLogic Server](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/wlapi/index.html?overview-summary.html), you have used a WebLogic-specific API in your application. The [Red Hat Migration Toolkit for Apps](https://marketplace.visualstudio.com/items?itemName=redhat.mta-vscode-extension) can assist with removing and refactoring these dependencies.\n\n### Determine whether your application uses Entity Beans or EJB 2.x-style CMP Beans\n\nIf your application uses Entity Beans or EJB 2.x style CMP beans, you will need to refactor your application to NOT use them.\n\n### Determine whether the Java EE Application Client feature is used\n\nIf you have client applications that connect to your (server) application using the Java EE Application Client feature, you will need to refactor both your client applications and your (server) application to use HTTP APIs.\n\n### Determine whether a deployment plan was used\n\nIf a deployment plan was used to perform the deployment, you'll need to assess what the deployment plan is doing. If the deployment plan is a straight deploy, then you'll be able to deploy your web application without any changes. If the deployment plan is more elaborate, you'll need to determine whether you can use the JBoss CLI to properly configure your application as part of the deployment. If it isn't possible to use the JBoss CLI, you'll need to refactor your application in such a way that a deployment plan is no longer needed.\n\n### Determine whether EJB timers are in use\n\nIf your application uses EJB timers, you'll need to validate that the EJB timer code can be triggered by each JBoss EAP instance independently. This validation is needed because when your App Service is scaled our horizontally, each EJB timer will be triggered on its own JBoss EAP instance.\n\n### Validate if and how the file system is used\n\nAny usage of the file system on the application server will require reconfiguration or, in rare cases, architectural changes. File system may be used by WebLogic shared modules or by your application code. You may identify some or all of the following scenarios.\n\n#### Read-only static content\n\nIf your application currently serves static content, an alternate location for that static content will be required. You may wish to consider moving [static content to Azure Blob Storage](/azure/storage/blobs/storage-blob-static-website) and [adding Azure CDN](/azure/cdn/cdn-create-a-storage-account-with-cdn#enable-azure-cdn-for-the-storage-account) for lightning-fast downloads globally.\n\n#### Dynamically published static content\n\nIf your application allows for static content that is uploaded/produced by your application but is immutable after its creation, you can use Azure Blob Storage and Azure CDN as described above, with an Azure Function to handle uploads and CDN refresh. We have provided [a sample implementation for your use](https://github.com/Azure-Samples/functions-java-push-static-contents-to-cdn).\n\n#### Dynamic or internal content\n\nFor files that are frequently written and read by your application (such as temporary data files), or static files that are visible only to your application, Azure Storage can be [mounted into the App Service file system](/azure/app-service/containers/how-to-serve-content-from-azure-storage#link-storage-to-your-web-app-preview).\n\n### Determine whether JCA connectors are used\n\nIf your application uses JCA connectors you'll have to validate the JCA connector can be used on JBoss EAP. If the JCA implementation is tied to WebLogic, you'll have to refactor your application to NOT use the JCA connector. If it can be used, then you'll need to add the JARs to the server classpath and put the necessary configuration files in the correct location in the JBoss EAP server directories for it to be available.\n\n#### Determine whether your application uses a Resource Adapter\n\nIf your application needs a Resource Adapter (RA), it needs to be compatible with JBoss EAP. Determine whether the RA works fine on a standalone instance of JBoss EAP by deploying it to the server and properly configuring it. If the RA works properly, you'll need to add the JARs to the server classpath of the App Service instance and put the necessary configuration files in the correct location in the JBoss EAP server directories for it to be available.\n\n### Determine whether JAAS is used\n\nIf your application is using JAAS, then you'll need to capture how JAAS is configured. If it's using a database, you can convert it to a JAAS domain on JBoss EAP. If it's a custom implementation, you'll need to validate that it can be used on JBoss EAP.\n\n### Determine whether WebLogic clustering is used\n\nMost likely, you've deployed your application on multiple WebLogic servers to achieve high availability. Azure App Service is capable of scaling, but if you've used the WebLogic Cluster API, you'll need to refactor your code to eliminate the use of that API.\n\n## Migration\n\n[!INCLUDE [java-redhat-migration-toolkit](includes/redhat-migration-toolkit.md)]\n\n### Provision an App Service plan\n\nFrom the [list of available service plans](https://azure.microsoft.com/pricing/details/app-service/linux/), select the plan whose specifications meet or exceed the specifications of the current production hardware.\n\n> [!NOTE]\n> If you plan to run staging/canary deployments or use [deployment slots](/azure/app-service/deploy-staging-slots), the App Service plan must include that additional capacity. We recommend using Premium or higher plans for Java applications.\n\n[Create the App Service plan](/azure/app-service/app-service-plan-manage#create-an-app-service-plan).\n\n### Create and Deploy Web App(s)\n\nYou'll need to create a Web App on your App Service Plan for every WAR file deployed to your JBoss EAP server.\n\n> [!NOTE]\n> While it's possible to deploy multiple WAR files to a single web app, this is highly undesirable. Deploying multiple WAR files to a single web app prevents each application from scaling according to its own usage demands. It also adds complexity to subsequent deployment pipelines. If multiple applications need to be available on a single URL, consider using a routing solution such as [Azure Application Gateway](/azure/application-gateway/).\n\n#### Maven applications\n\nIf your application is built from a Maven POM file, use the Webapp plugin for Maven to create the Web App and deploy your application. For more information, see the [Configure the Maven plugin](/azure/app-service/containers/quickstart-java#configure-the-maven-plugin) section of [Quickstart: Create a Java app on Azure App Service](/azure/app-service/containers/quickstart-java).\n\n#### Non-Maven applications\n\nIf you can't use the Maven plugin, you'll need to provision the Web App through other mechanisms, such as:\n\n* [Azure portal](https://portal.azure.com/#create/Microsoft.WebSite)\n* [Azure CLI](/cli/azure/webapp#az-webapp-create)\n* [Azure PowerShell](/powershell/module/az.websites/new-azwebapp)\n\nAfter you've created the web app, use one of the available deployment mechanisms to deploy your application. For more information, see[Deploy files to App Service](/azure/app-service/deploy-zip).\n\n### Migrate JVM runtime options\n\nIf your application requires specific runtime options, use the most appropriate mechanism to specify them. For more information, see the [Set Java runtime options](/azure/app-service/containers/configure-language-java#set-java-runtime-options) section of [Configure a Java app for Azure App Service](/azure/app-service/containers/configure-language-java).\n\n### Migrate externalized parameters\n\nIf you need to use external parameters, you'll need to set them as app settings. For more information, see [Configure app settings](/azure/app-service/configure-common?toc=%2fazure%2fapp-service%2fcontainers%2ftoc.json#configure-app-settings).\n\n### Migrate startup scripts\n\nIf the original application used a custom startup script, you'll need to migrate it to a Bash script. For more information, see [Customize application server configuration](/azure/app-service/containers/configure-language-java#customize-application-server-configuration).\n\n### Populate secrets\n\nUse Application Settings to store any secrets specific to your application. If you intend to use the same secret or secrets among multiple applications, or you require fine-grained access policies and audit capabilities, use Azure Key Vault references instead. For more information, see the [Use KeyVault References](/azure/app-service/containers/configure-language-java#use-keyvault-references) section of [Configure a Java app for Azure App Service](/azure/app-service/containers/configure-language-java).\n\n### Configure Custom Domain and SSL\n\nIf your application will be visible on a custom domain, you'll need to map your web application to it. For more information, see [Tutorial: Map an existing custom DNS name to Azure App Service](/Azure/app-service/app-service-web-tutorial-custom-domain).\n\nYou'll then need to bind the TLS/SSL certificate for that domain to your App Service Web App. For more information, see [Secure a custom DNS name with a TLS/SSL binding in Azure App Service](/azure/app-service/app-service-web-tutorial-custom-ssl).\n\n### Migrate data sources, libraries, and JNDI resources\n\nTo migrate data sources, follow the steps in the [Configure data sources](/azure/app-service/configure-language-java-data-sources) section of [Configure a Java app for Azure App Service](/azure/app-service/containers/configure-language-java).\n\nMigrate any additional server-level classpath dependencies by following the instructions in the [JBoss EAP](/azure/app-service/containers/configure-language-java#jboss-eap-1) section of [Configure a Java app for Azure App Service](/azure/app-service/containers/configure-language-java).\n\nMigrate any additional shared server-level JDNI resources. For more information, see the [JBoss EAP](/azure/app-service/containers/configure-language-java#jboss-eap-1) section of [Configure a Java app for Azure App Service](/azure/app-service/containers/configure-language-java).\n\n### Migrate JCA connectors and JAAS modules\n\nMigrate any JCA connectors and JAAS modules by following the instructions at [Install modules and dependencies](/azure/app-service/containers/configure-language-java#install-modules-and-dependencies).\n\n> [!NOTE]\n> If you're following the recommended architecture of one WAR per application, consider migrating server-level classpath libraries and JNDI resources into your application. Doing so will significantly simplify component governance and change management. If you want to deploy more than one WAR per application, you should review one of our companion guides mentioned at the beginning of this guide.\n\n### Migrate scheduled jobs\n\nAt a minimum, you should move your scheduled jobs to an Azure VM so they're no longer part of your application. Alternately, you can opt to modernize them into event driven Java using Azure services such as Azure Functions, SQL Database, and Event Hubs.\n\n### Restart and smoke-test\n\nFinally, you'll need to restart your Web App to apply all configuration changes. Upon completion of the restart, verify that your application is running correctly.\n\n## Post-migration\n\nNow that you've migrated your application to Azure App Service, you should verify that it works as you expect. Once you've done that, we have some recommendations for you that can make your application more cloud-native.\n\n[!INCLUDE [recommendations-jboss-eap](includes/recommendations-jboss-eap.md)]\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-to-virtual-machines.md",
    "content": "---\ntitle: Migrate WebLogic applications to Azure Virtual Machines\ndescription: This guide describes what you should be aware of when you want to migrate an existing WebLogic application to run on Azure Virtual Machines.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-java, devx-track-javaee, devx-track-javaee-wls, devx-track-javaee-wls-vm, migration-java, devx-track-extended-java\n---\n\n# Migrate WebLogic Server applications to Azure Virtual Machines\n\nThis guide describes what you should be aware of when you want to migrate an existing WebLogic application to run on Azure Virtual Machines. For an overview of available WebLogic Server solutions in Azure Marketplace, see [What are solutions for running Oracle WebLogic Server on Azure Virtual Machines?](/azure/virtual-machines/workloads/oracle/oracle-weblogic)\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n### Define what you mean by \"migration complete\"\n\nThis guide, and the corresponding Azure Marketplace Offers, are a starting point to accelerate the migration of your WebLogic Server workloads to Azure. It's important to define the scope of your migration effort. For example, are you doing a strict \"lift and shift\" from your existing infrastructure to Azure Virtual Machines? If so, you may be tempted to work in some \"lift and improve\" as you migrate.\n\nIt's better to stick as close to pure \"lift and shift\" as possible, accounting for the necessary changes as detailed in this guide. Define what you mean by \"migration complete\" so that you know when you've reached this milestone. When you've reached your \"migration complete\", you can take a snapshot of your Virtual Machines as described in [Create a snapshot](/azure/virtual-machines/windows/snapshot-copy-managed-disk). After you've verified that you can successfully restore from your snapshot, you can do the improvements without fear of losing the migration progress you've achieved thus far.\n\n[!INCLUDE [vm-aks-tradeoffs-wls](includes/vm-aks-tradeoffs-wls.md)]\n\n### Determine whether the prebuilt Azure Marketplace offers are a good starting point\n\nOracle and Microsoft have partnered to bring a set of Azure solution templates to Azure Marketplace to provide a solid starting point for migrating to Azure. Consult the [Oracle Fusion Middleware](https://docs.oracle.com/en/middleware/standalone/weblogic-server/wlazu/) documentation for the list of offers and choose the one that most closely matches your existing deployment. You can see the list of offers in the overview article [What is Oracle WebLogic Server on Azure?](/azure/virtual-machines/workloads/oracle/oracle-weblogic)\n\nIf none of the existing offers are a good starting point, you have to reproduce the deployment by hand using Azure Virtual Machine resources. You can find the step-by-step guidance in [Install Oracle WebLogic Server on Azure Virtual Machines manually](migrate-weblogic-to-azure-vm-manually.md). For more information, see [What is IaaS?](https://azure.microsoft.com/resources/cloud-computing-dictionary/what-is-iaas/)\n\n### Determine whether the WebLogic version is compatible\n\nYour existing WebLogic version must be compatible with the version in the IaaS offers. To see the offers for WebLogic version 12.2.1.4, [query Azure Marketplace for Oracle WebLogic 12.2.1.4](https://azuremarketplace.microsoft.com/marketplace/apps?search=oracle%20weblogic%2012.2.1.4&page=1). If your existing WebLogic version isn't compatible with that version, you have to reproduce the deployment by hand using Azure IaaS resources. For more information, see [the Azure documentation](https://azure.microsoft.com/resources/cloud-computing-dictionary/what-is-iaas/).\n\n[!INCLUDE [inventory-server-capacity-virtual-machines](includes/inventory-server-capacity-virtual-machines.md)]\n\n[!INCLUDE [inventory-all-secrets](includes/inventory-all-secrets.md)]\n\n[!INCLUDE [inventory-all-certificates](includes/inventory-all-certificates.md)]\n\n[!INCLUDE [validate-that-the-supported-java-version-works-correctly-weblogic](includes/validate-that-the-supported-java-version-works-correctly-weblogic.md)]\n\n[!INCLUDE [inventory-jndi-resources](includes/inventory-jndi-resources.md)]\n\n[!INCLUDE [inspect-your-domain-configuration](includes/inspect-your-domain-configuration.md)]\n\n[!INCLUDE [determine-whether-session-replication-is-used](includes/determine-whether-session-replication-is-used.md)]\n\n[!INCLUDE [document-datasources](includes/document-datasources.md)]\n\n[!INCLUDE [determine-whether-weblogic-has-been-customized](includes/determine-whether-weblogic-has-been-customized.md)]\n\n[!INCLUDE [determine-whether-management-over-rest-is-used](includes/determine-whether-management-over-rest-is-used.md)]\n\n[!INCLUDE [determine-whether-a-connection-to-on-premises-is-needed](includes/determine-whether-a-connection-to-on-premises-is-needed.md)]\n\n[!INCLUDE [determine-whether-jms-queues-or-topics-are-in-use-virtual-machines](includes/determine-whether-jms-queues-or-topics-are-in-use-virtual-machines.md)]\n\n[!INCLUDE [determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries](includes/determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries.md)]\n\n[!INCLUDE [determine-whether-osgi-bundles-are-used](includes/determine-whether-osgi-bundles-are-used.md)]\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code.md)]\n\n[!INCLUDE [determine-whether-oracle-service-bus-is-in-use](includes/determine-whether-oracle-service-bus-is-in-use.md)]\n\n[!INCLUDE [determine-whether-your-application-is-composed-of-multiple-wars](includes/determine-whether-your-application-is-composed-of-multiple-wars.md)]\n\n[!INCLUDE [determine-whether-your-application-is-packaged-as-an-ear](includes/determine-whether-your-application-is-packaged-as-an-ear.md)]\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n[!INCLUDE [determine-whether-wlst-is-used](includes/determine-whether-wlst-is-used.md)]\n\n### Determine whether and how the file system is used\n\nVM filesystems operate the same way as on-premises filesystems with respect to persistence, startup, and shutdown. Even so, it's important to be aware of your filesystem needs and ensure the VMs have adequate storage size and performance.\n\n[!INCLUDE [static-content](includes/static-content.md)]\n\n[!INCLUDE [determine-the-network-topology](includes/determine-the-network-topology.md)]\n\n[!INCLUDE [account-for-the-use-of-jca-adapters-and-resource-adapters](includes/account-for-the-use-of-jca-adapters-and-resource-adapters.md)]\n\n[!INCLUDE [account-for-the-use-of-custom-security-providers-and-jaas](includes/account-for-the-use-of-custom-security-providers-and-jaas.md)]\n\n[!INCLUDE [determine-whether-weblogic-clustering-is-used](includes/determine-whether-weblogic-clustering-is-used.md)]\n\n[!INCLUDE [determine-whether-the-java-ee-application-client-feature-is-used](includes/determine-whether-the-java-ee-application-client-feature-is-used.md)]\n\n## Migration\n\n### Select a WebLogic on Azure Virtual Machines offer\n\nThe following offers are available for WebLogic on Azure Virtual Machines.\n\nDuring the deployment of an offer, you're asked to choose the Virtual Machine size for your WebLogic server nodes. It's important to consider all aspects of sizing (memory, processor, disk) in your choice of VM size. For more information, see the [Azure Documentation for virtual machine sizing](/azure/cloud-services/cloud-services-sizes-specs)\n\n#### WebLogic Server Single Node with no Admin Server\n\nThis offer creates a single VM and installs WebLogic on it, but doesn't configure any domains, which is useful for scenarios where you have a highly customized domain configuration.\n\n#### WebLogic Server Single Node with Admin Server\n\nThis offer provisions a single VM and installs WebLogic Server on it. It creates a domain and starts up the admin server.\n\n#### WebLogic Server N-Node Cluster\n\nThis offer creates a highly available cluster of WebLogic Server VMs.\n\n#### WebLogic Server N-Node Dynamic Cluster\n\nThis offer creates a highly available and scalable dynamic cluster of WebLogic Server VMs\n\n### Provision the offer\n\nAfter you've selected which offer to start with, follow the instructions in [documentation for the offers](https://docs.oracle.com/en/middleware/standalone/weblogic-server/wlazu/) to provision that offer. Make sure to choose the domain name that matches your existing domain name. You can even match the domain password with your existing domain password.\n\n### Migrate the domains\n\nAfter you've provisioned the offer, you can examine the domain configuration and follow [this guidance](https://support.oracle.com/knowledge/Middleware/2336356_1.html) for details on how to migrate the domains.\n\n### Connect the databases\n\nAfter you've migrated the domains, you can connect the databases by following the instructions [in the offer documentation](https://docs.oracle.com/en/middleware/standalone/weblogic-server/wlazu/deploy-oracle-weblogic-server-cluster-microsoft-azure-iaas.html#GUID-69FE91BD-32E2-4F58-9765-008988385534). These instructions help you account for any database secrets and access strings involved.\n\n### Account for KeyStores\n\nYou must account for the migration of any SSL KeyStores used by your application. For more information, see [Configuring Keystores](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/secmg/identity_trust.html#GUID-7F03EB9C-9755-430B-8B86-17199E0C01DC).\n\n### Connect the JMS sources\n\nAfter you've connected the databases, you can configure JMS. For more information, see [Fusion Middleware Administering JMS Resources for Oracle WebLogic Server](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/jmsad/overview.html) in the WebLogic documentation.\n\n[!INCLUDE [account-for-authentication-and-authorization](includes/account-for-authentication-and-authorization.md)]\n\n### Account for logging\n\nUse the integration with Elastic on Azure provided by the Oracle WebLogic Server marketplace solution templates. This approach is the easiest way to account for logging. You can see the list of offers in the overview article [What are solutions for running Oracle WebLogic Server on Azure Virtual Machines?](/azure/virtual-machines/workloads/oracle/oracle-weblogic) Complete tutorials to configure Elastic are provided in:\n\n* [Land Oracle WebLogic Server logs to Elasticsearch and Kibana in admin offer](https://aka.ms/wls-admin-elk-postdeployment-guide)\n* [Land Oracle WebLogic Server logs to Elasticsearch and Kibana in cluster offer](https://aka.ms/wls-cluster-elk-postdeployment-guide)\n* [Land Oracle WebLogic Server logs to Elasticsearch and Kibana in dynamic cluster offer](https://aka.ms/wls-dynamic-cluster-elk-postdeployment-guide)\n\nIf the Elastic integration isn't appropriate, you should carry over the existing logging configuration when you migrate the domain. For more information, see [Configure java.util.logging logger levels](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/wlach/taskhelp/logging/ConfigureJavaLoggingLevels.html) and [Configuring Log Files and Filtering Log Messages for Oracle WebLogic Server](https://docs.oracle.com/en/middleware/fusion-middleware/weblogic-server/12.2.1.4/wllog/index.html) in the Oracle documentation.\n\n### Migrating your applications\n\nThe techniques used to deploy applications from the development team into test, staging, and production servers vary greatly from case to case. In some cases, there's a highly evolved CI/CD platform that results in the applications being deployed to the WebLogic Server. In other cases, the process can be more manual. One benefit of using Azure Virtual Machines to migrate WebLogic applications to the cloud is that your existing processes continue to work.\n\nYou have to configure the Network Security Group that the offer provisions to allow access from your CI/CD pipeline or manual deployment system. For more information, see [Network security groups](/azure/virtual-network/network-security-groups-overview).\n\n### Testing\n\nAny in-container tests against applications must be configured to access the new servers running within Azure. As with the CI/CD concerns, you must ensure the necessary network security rules allow your tests to access the applications deployed to Azure. For more information, see [Network security groups](/azure/virtual-network/network-security-groups-overview).\n\n## Post-migration\n\nAfter you've reached the migration goals you defined in the [pre-migration](#pre-migration) step, perform some end-to-end acceptance testing to verify that everything works as expected. For guidance on some potential post-migration enhancements, see the following recommendations:\n\n* Using Azure Storage to serve static content mounted to the virtual machines. For more information, see [Attach or detach a data disk to a virtual machine](/azure/lab-services/devtest-lab-attach-detach-data-disk).\n\n* Deploy your applications to your migrated WebLogic cluster with Azure DevOps. For more information, see [Azure DevOps getting started documentation](/azure/devops/get-started).\n\n* If you deployed WebLogic Server with Azure Application Gateway by following the steps in [Tutorial: Migrate a WebLogic Server cluster to Azure with Azure Application Gateway as a load balancer](migrate-weblogic-with-app-gateway.md), you may want to do more configuration on the Application Gateway. For more information, see [Application Gateway configuration overview\n](/azure/application-gateway/configuration-overview).\n\n* Enhance your network topology with advanced load balancing services. For more information, see [Using load-balancing services in Azure](/azure/traffic-manager/traffic-manager-load-balancing-azure).\n\n* Use Azure Managed Identities to managed secrets and assign role based access to Azure resources. For more information, see [What are managed identities for Azure resources?](/azure/active-directory/managed-identities-azure-resources/overview)\n\n* Integrate WebLogic Java EE authentication and authorization with Microsoft Entra ID. For more information, see [Integrating Microsoft Entra getting started guide](/azure/active-directory/manage-apps/plan-an-application-integration).\n\n* Use Azure Key Vault to store any information that functions as a \"secret\". For more information, see [Azure Key Vault basic concepts](/azure/key-vault/basic-concepts).\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-to-vms-with-ha-dr.md",
    "content": "---\ntitle: \"Tutorial: Migrate Oracle WebLogic Server to Azure Virtual Machines with high availability and disaster recovery\"\ndescription: Shows how to deploy WebLogic Server to Azure Virtual Machines with high availability and disaster recovery.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.topic: tutorial\nms.date: 01/13/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-wls\n  - devx-track-javaee-wls-vm\n  - migration-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Tutorial: Migrate Oracle WebLogic Server to Azure Virtual Machines with high availability and disaster recovery\n\nThis tutorial shows you a simple and effective way to implement high availability and disaster recovery (HA/DR) for Java using Oracle WebLogic Server (WLS) on Azure Virtual Machines (VMs). The solution illustrates how to achieve a low Recovery Time Objective (RTO) and Recovery Point Objective (RPO) using a simple database driven Jakarta EE application running on WLS. HA/DR is a complex topic, with many possible solutions. The best solution depends on your unique requirements. For other ways to implement HA/DR, see the resources at the end of this article.\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Use Azure optimized best practices to achieve high availability and disaster recovery.\n> * Set up a Microsoft Azure SQL Database failover group in paired regions.\n> * Set up paired WLS clusters on Azure VMs.\n> * Set up an Azure Traffic Manager.\n> * Configure WLS clusters for high availability and disaster recovery.\n> * Test failover from primary to secondary.\n\nThe following diagram illustrates the architecture you build:\n\n<!-- Diagram source https://github.com/Azure-Samples/azure-cafe/blob/main/diagrams/weblogic-on-vms-ha-dr-solution-architecture.pptx -->\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vms-with-ha-dr/solution-architecture.png\" alt-text=\"Diagram of the solution architecture of WLS on Azure VMs with high availability and disaster recovery.\" lightbox=\"media/migrate-weblogic-to-vms-with-ha-dr/solution-architecture.png\" border=\"false\":::\n\nAzure Traffic Manager checks the health of your regions and routes the traffic accordingly to the application tier. Both the primary region and the secondary region have a full deployment of the WLS cluster. However, only the primary region is actively servicing network requests from the users. The secondary region is passive and activated to receive traffic only when the primary region experiences a service disruption. Azure Traffic Manager uses the health check feature of the Azure Application Gateway to implement this conditional routing. The primary WLS cluster is running and the secondary cluster is shut down. The geo-failover RTO of the application tier depends on the time for starting VMs and running the secondary WLS cluster. The RPO depends on the Azure SQL Database because the data is persisted and replicated in the Azure SQL Database failover group.\n\n[!INCLUDE [ha-dr-for-wls-overview](includes/ha-dr-for-wls-overview.md)]\n\n## Prerequisites\n\n* An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n* Make sure you have either the `Owner` role or the `Contributor` and `User Access Administrator` roles in the subscription. You can verify the assignment by following the steps in [List Azure role assignments using the Azure portal](/azure/role-based-access-control/role-assignments-list-portal).\n* Prepare a local machine with Windows, Linux, or macOS installed.\n* Install and set up [Git](/devops/develop/git/install-and-set-up-git).\n* Install a Java SE implementation, version 17 or later - for example, [the Microsoft build of OpenJDK](/java/openjdk).\n* Install [Maven](https://maven.apache.org/download.cgi), version 3.9.3 or later.\n\n## Set up an Azure SQL Database failover group in paired regions\n\n[!INCLUDE [ha-dr-for-wls-azure-sql-database-creation](includes/ha-dr-for-wls-azure-sql-database-creation.md)]\n[!INCLUDE [ha-dr-for-wls-azure-sql-database-schema-vms](includes/ha-dr-for-wls-azure-sql-database-schema-vms.md)]\n[!INCLUDE [ha-dr-for-wls-azure-sql-database-failover-group](includes/ha-dr-for-wls-azure-sql-database-failover-group.md)]\n\n> [!NOTE]\n> This article guides you to create an Azure SQL Database single database with SQL authentication for simplicity because the HA/DR setup this article focuses on is already very complex. A more secure practice is to use [Microsoft Entra authentication for Azure SQL](/azure/azure-sql/database/authentication-aad-overview?preserve-view=true&view=azuresql-db) for authenticating the database server connection. For information on how to configure the database connection with Microsoft Entra authentication, see [Configure passwordless database connections for Java apps on Oracle WebLogic Server](../ee/how-to-configure-passwordless-datasource.md).\n\n## Set up paired WLS clusters on Azure VMs\n\nIn this section, you create two WLS clusters on Azure VMs using the [Oracle WebLogic Server Cluster on Azure VMs](https://aka.ms/wls-vm-cluster) offer. The cluster in East US is primary and is configured as the active cluster later. The cluster in West US is secondary and is configured as the passive cluster later.\n\n### Set up the primary WLS cluster\n\nFirst, open the [Oracle WebLogic Server Cluster on Azure VMs](https://aka.ms/wls-vm-cluster) offer in your browser and select **Create**. You should see the **Basics** pane of the offer.\n\nUse the following steps to fill out the **Basics** pane:\n\n1. Ensure that the value shown for **Subscription** is the same one that has the roles listed in the prerequisites section.\n1. In the **Resource group** field, select **Create new** and fill in a unique value for the resource group - for example, **wls-cluster-eastus-ejb120623**.\n1. Under **Instance details**, for **Region**, select **East US**.\n1. Under **Credentials for Virtual Machines and WebLogic**, provide a password for **admin account of VM** and **WebLogic Administrator**, respectively. Save aside the username and password for **WebLogic Administrator**. For better security, consider using **SSH Public Key** as the VM authentication type.\n1. Leave the defaults for other fields.\n1. Select **Next** to go to the **TLS/SSL Configuration** pane.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-basics.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server Cluster on Azure VMs Basics pane.\" lightbox=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-basics.png\":::\n\nLeave the defaults in the **TLS/SSL Configuration** pane, select **Next** to go to **Azure Application Gateway** pane, and then use the following steps.\n\n1. For **Connect to Azure Application Gateway?**, select **Yes**.\n1. For **Select desired TLS/SSL certificate option**, select **Generate a self-signed certificate**.\n1. Select **Next** to go to the **Networking** pane.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-azure-app-gateway.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server Cluster on Azure VMs Azure Application Gateway pane.\" lightbox=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-azure-app-gateway.png\":::\n\nYou should see all fields pre-populated with the defaults in the **Networking** pane. Use the following steps to save the network configuration:\n\n1. Select **Edit virtual network**. Save aside the address space of the virtual network - for example, **10.1.4.0/23**.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-networking-vnet.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server Cluster on Azure VMs Virtual Network pane.\" lightbox=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-networking-vnet.png\":::\n\n1. Select `wls-subnet` to edit the subnet. Under **Subnet details**, save aside the starting address and subnet size - for example, **10.1.5.0** and **/28**.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-networking-vnet-wls-subnet.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server Cluster on Azure VMs WLS Subnet of Virtual Network pane.\" lightbox=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-networking-vnet-wls-subnet.png\":::\n\n1. If you make any modifications, save the changes.\n1. Return to **Networking** pane.\n1. Select **Next** to go to the **Database** pane.\n\nThe following steps show you how to fill out the **Database** pane:\n\n1. For **Connect to database?**, select **Yes**.\n1. For **Choose database type**, select **Microsoft SQL Server (Support passwordless connection)** .\n1. For **JNDI Name**, enter **jdbc/WebLogicCafeDB**.\n1. For **DataSource Connection String**, replace the placeholders with the values you saved aside in the preceding section for the primary SQL Database - for example, **jdbc:sqlserver://sqlserverprimary-ejb120623.database.windows.net:1433;database=mySampleDatabase**.\n1. For **Global transaction protocol**, select **None**.\n1. For **Database username**, replace the placeholders with the values you saved aside in the preceding section for the primary SQL Database - for example, **azureuser@sqlserverprimary-ejb120623**.\n1. Enter the server admin sign-in password that you saved aside previously for **Database Password**. Enter the same value for **Confirm password**.\n1. Leave the defaults for the other fields.\n1. Select **Review + create**.\n1. Wait until **Running final validation...** successfully completes, then select **Create**.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-database.png\" alt-text=\"Screenshot of the Azure portal that shows the Oracle WebLogic Server Cluster on Azure VMs Database pane.\" lightbox=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-database.png\":::\n\n> [!NOTE]\n> This article guides you to connect to an Azure SQL Database with SQL authentication for simplicity because the HA/DR setup this article focuses on is already very complex. A more secure practice is to use [Microsoft Entra authentication for Azure SQL](/azure/azure-sql/database/authentication-aad-overview?preserve-view=true&view=azuresql-db) for authenticating the database server connection. For information on how to configure the database connection with Microsoft Entra authentication, see [Configure passwordless database connections for Java apps on Oracle WebLogic Server](../ee/how-to-configure-passwordless-datasource.md).\n\nAfter a while, you should see the **Deployment** page where **Deployment is in progress** is displayed.\n\n> [!NOTE]\n> If you see any problems during **Running final validation...**, fix them and try again.\n\nDepending on network conditions and other activity in your selected region, the deployment can take up to 50 minutes to complete. After that, you should see the text **Your deployment is complete** displayed on the deployment page.\n\nIn the meantime, you can set up the secondary WLS cluster in parallel.\n\n### Set up the secondary WLS cluster\n\nFollow the same steps in as in the section [Set up the primary WLS cluster](#set-up-the-primary-wls-cluster) to set up the secondary WLS cluster in West US region, except for the following differences:\n\n1. In the **Basics** pane, use the following steps:\n   1. In the **Resource group** field, select **Create new** and fill in a different unique value for the resource group - for example, **wls-cluster-westtus-ejb120623**.\n   1. Under **Instance details**, for **Region**, select **West US**.\n\n1. In the **Networking** pane, use the following steps:\n   1. For **Edit virtual network**, enter same address space of the virtual network as your primary WLS cluster - for example, **10.1.4.0/23**.\n\n      > [!NOTE]\n      > You should see a warning message similar to the following one: **Address space '10.1.4.0/23 (10.1.4.0 - 10.1.5.255)' overlaps with address space '10.1.4.0/23 (10.1.4.0 - 10.1.5.255)' of virtual network 'wls-vnet'. Virtual networks with overlapping address space cannot be peered. If you intend to peer these virtual networks, change address space '10.1.4.0/23 (10.1.4.0 - 10.1.5.255)'**. You can ignore this message because you need two WLS clusters with the same network configuration.\n\n   1. For `wls-subnet`, enter same starting address and subnet size as your primary WLS cluster - for example, **10.1.5.0** and **/28**.\n\n1. In the **Database** pane, use the following steps:\n   1. For **DataSource Connection String**, replace the placeholders with the values you saved aside in the preceding section for the secondary SQL Database - for example, **jdbc:sqlserver://sqlserversecondary-ejb120623.database.windows.net:1433;database=mySampleDatabase**.\n   1. For **Database username**, replace the placeholders with the values you saved aside in the preceding section for the secondary SQL Database - for example, **azureuser@sqlserversecondary-ejb120623**.\n\n### Mirror the network settings for the two clusters\n\nDuring the phase of resuming pending transactions in the secondary WLS cluster after a failover, WLS checks the ownership of the TLOG store. To successfully pass the check, all managed servers in the secondary cluster must have same private IP address as the primary cluster.\n\nThis section shows you how to mirror the network settings from the primary cluster to the secondary cluster.\n\nFirst, use the following steps to configure network settings for the primary cluster after its deployment completes:\n\n1. In **Overview** pane of the **Deployment** page, select **Go to resource group**.\n1. Select the network interface `adminVM_NIC_with_pub_ip`.\n   1. Under **Settings**, select **IP configurations**.\n   1. Select `ipconfig1`.\n   1. Under **Private IP address settings**, select **Static** for **Allocation**. Save aside the private IP address.\n   1. Select **Save**.\n1. Return to the resource group of the primary WLS cluster, then repeat step 3 for the network interfaces `mspVM1_NIC_with_pub_ip`, `mspVM2_NIC_with_pub_ip`, and `mspVM3_NIC_with_pub_ip`.\n1. Wait until all updates complete. You can select the notifications icon in the Azure portal to open the **Notifications** pane for status monitoring.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-to-vms-with-ha-dr/portal-notifications-icon.png\" alt-text=\"Screenshot of the Azure portal notifications icon.\":::\n\n1. Return to the resource group of the primary WLS cluster, then copy the name for the resource with type **Private endpoint** - for example, **7e8c8bsaep**. Use that name to find the remaining network interface - for example, **7e8c8bsaep.nic.c0438c1a-1936-4b62-864c-6792eec3741a**. Select it and follow the preceding steps to get its private IP address.\n\nThen, use the following steps to configure the network settings for the secondary cluster after its deployment completes:\n\n1. In the **Overview** pane of the **Deployment** page, select **Go to resource group**.\n1. For the network interfaces `adminVM_NIC_with_pub_ip`, `mspVM1_NIC_with_pub_ip`, `mspVM2_NIC_with_pub_ip`, and `mspVM3_NIC_with_pub_ip`, follow the preceding steps to update the private IP address allocation to **Static**.\n1. Wait until all updates complete.\n1. For the network interfaces `mspVM1_NIC_with_pub_ip`, `mspVM2_NIC_with_pub_ip`, and `mspVM3_NIC_with_pub_ip`, follow the preceding steps but update the private IP address to the same value used with the primary cluster. Wait until the current update of network interface completes before proceeding to next one.\n\n   > [!NOTE]\n   > You can't change the private IP address of the network interface that is part of a private endpoint. To easily mirror the private IP addresses of network interfaces for managed servers, consider updating the private IP address for `adminVM_NIC_with_pub_ip` to an IP address that isn't used. Depending on the allocation of private IP addresses in your two clusters, you might need to update the private IP address in the primary cluster as well.\n\nThe following table shows an example of mirroring the network settings for two clusters:\n\n| Cluster   | Network interface                                     | Private IP address (before) | Private IP address (after) | Update sequence |\n|-----------|-------------------------------------------------------|-----------------------------|----------------------------|-----------------|\n| Primary   | `7e8c8bsaep.nic.c0438c1a-1936-4b62-864c-6792eec3741a` | `10.1.5.4`                  | `10.1.5.4`                 |                 |\n| Primary   | `adminVM_NIC_with_pub_ip`                             | `10.1.5.7`                  | `10.1.5.7`                 |                 |\n| Primary   | `mspVM1_NIC_with_pub_ip`                              | `10.1.5.5`                  | `10.1.5.5`                 |                 |\n| Primary   | `mspVM2_NIC_with_pub_ip`                              | `10.1.5.8`                  | `10.1.5.9`                 | 1               |\n| Primary   | `mspVM3_NIC_with_pub_ip`                              | `10.1.5.6`                  | `10.1.5.6`                 |                 |\n| Secondary | `1696b0saep.nic.2e19bf46-9799-4acc-b64b-a2cd2f7a4ee1` | `10.1.5.8`                  | `10.1.5.8`                 |                 |\n| Secondary | `adminVM_NIC_with_pub_ip`                             | `10.1.5.5`                  | `10.1.5.4`                 | 4               |\n| Secondary | `mspVM1_NIC_with_pub_ip`                              | `10.1.5.7`                  | `10.1.5.5`                 | 5               |\n| Secondary | `mspVM2_NIC_with_pub_ip`                              | `10.1.5.6`                  | `10.1.5.9`                 | 2               |\n| Secondary | `mspVM3_NIC_with_pub_ip`                              | `10.1.5.4`                  | `10.1.5.6`                 | 3               |\n\nCheck the set of private IP addresses for all managed servers, which consists of the backend pool of the Azure Application Gateway you deployed in each cluster. If it's updated, use the following steps to update the Azure Application Gateway backend pool accordingly:\n\n1. Open the resource group of the cluster.\n1. Find the resource **myAppGateway** with the type **Application gateway**. Select it to open it.\n1. In the **Settings** section, select **Backend pools**, then select `myGatewayBackendPool`.\n1. Change the **Backend targets** values with the updated private IP address or addresses, then select **Save**. Wait until it completes.\n1. In the **Settings** section, select **Health probes**, then select **HTTPhealthProbe**.\n1. Make sure **I want to test the backend health before adding the health probe** is selected, then select **Test**. You should see that the **Status** value of the backend pool `myGatewayBackendPool` is marked as healthy. If it isn't, check whether private IP addresses are updated as expected and the VMs are running, then test the health probe again. You must troubleshoot and resolve the issue before you continue.\n\nIn the following example, the Azure Application Gateway backend pool for each cluster is updated:\n\n| Cluster   | Azure Application Gateway backend pool | Backend targets (before)             | Backend targets (after)              |\n|-----------|----------------------------------------|--------------------------------------|--------------------------------------|\n| Primary   | `myGatewayBackendPool`                 | (`10.1.5.5`, `10.1.5.8`, `10.1.5.6`) | (`10.1.5.5`, `10.1.5.9`, `10.1.5.6`) |\n| Secondary | `myGatewayBackendPool`                 | (`10.1.5.7`, `10.1.5.6`, `10.1.5.4`) | (`10.1.5.5`, `10.1.5.9`, `10.1.5.6`) |\n\nTo automate the network settings mirroring, consider using Azure CLI. For more information, see [Get started with Azure CLI](/cli/azure/get-started-with-azure-cli).\n\n### Verify the deployments of the clusters\n\nYou deployed an Azure Application Gateway and a WLS admin server in each cluster. The Azure Application Gateway acts as load balancer for all managed servers in the cluster. The WLS admin server provides a web console for cluster configuration.\n\nUse the following steps to verify whether the Azure Application Gateway and WLS admin console in each cluster work before moving to next step:\n\n1. Return to the **Deployment** page, then select **Outputs**.\n1. Copy the value of the property **appGatewayURL**. Append the string **weblogic/ready** and then open that URL in a new browser tab. You should see an empty page without any error message. If you don't, you must troubleshoot and resolve the issue before you continue.\n1. Copy and save aside the value of the property **adminConsole**. Open it in a new browser tab. You should see the sign-in page of the **WebLogic Server Administration Console**. Sign in to the console with the user name and password for WebLogic administrator you saved aside previously. If you aren't able to sign in, you must troubleshoot and resolve the issue before you continue.\n\nUse the following steps to get the IP address of the Azure Application Gateway for each cluster. You use these values when you set up the Azure Traffic Manager later.\n\n1. Open the resource group where your cluster is deployed - for example, select **Overview** to switch back to the Overview pane of the deployment page. Then, select **Go to resource group**.\n1. Find the resource `gwip` with the type **Public IP address**, then select it to open it. Look for the **IP address** field and save aside its value.\n\n## Set up an Azure Traffic Manager\n\n[!INCLUDE [ha-dr-for-wls-vm-azure-traffic-manager](includes/ha-dr-for-wls-vm-azure-traffic-manager.md)]\n\n## Configure the WLS clusters for high availability and disaster recovery\n\nIn this section, you configure WLS clusters for high availability and disaster recovery.\n\n### Prepare the sample app\n\n[!INCLUDE [ha-dr-for-wls-azure-prepare-sample-app](includes/ha-dr-for-wls-azure-prepare-sample-app.md)]\n\n### Deploy the sample app\n\nNow use the following steps to deploy the sample app to the clusters, starting from the primary cluster:\n\n1. Open the **adminConsole** of the cluster in a new tab of your web browser. Sign in to the WebLogic Server Administration Console with the username and password of the WebLogic Administrator you saved aside previously.\n1. Locate **Domain structure** > **wlsd** > **Deployments** in the navigation pane. Select **Deployments**.\n1. Select **Lock & Edit** > **Install** > **Upload your file(s)** > **Choose File**. Select the **weblogic-cafe.war** file that you prepared previously.\n1. Select **Next** > **Next** > **Next**. Select `cluster1` with option **All servers in the cluster** for the deployment targets. Select **Next** > **Finish**. Select **Activate Changes**.\n1. Switch to the **Control** tab and select **weblogic-cafe** from the deployments table. Select **Start** with the option **Servicing all requests** > **Yes**. Wait for a while and refresh the page until you see that the state of the deployment **weblogic-cafe** is **Active**. Switch to the **Monitoring** tab and verify that the context root of the deployed application is **/weblogic-cafe**. Keep the WLS admin console open so you can use it later for further configuration.\n\nRepeat the same steps in WebLogic Server Administration Console, but for the secondary cluster in the West US region.\n\n### Update the front end host\n\nUse the following steps to make your WLS clusters aware of the Azure Traffic Manager. Because the Azure Traffic Manager is the entry point for user requests, update the **Front Host** of the WebLogic Server cluster to the DNS name of the Traffic Manager profile, starting from the primary cluster.\n\n1. Make sure you're signed in to WebLogic Server Administration Console.\n1. Navigate to **Domain structure** > **wlsd** > **Environment** > **Clusters** in the navigation pane. Select **Clusters**.\n1. Select `cluster1` from the clusters table.\n1. Select **Lock & Edit** > **HTTP**. Remove the current value for **Frontend Host**, and enter the DNS name of the Traffic Manager profile you saved aside previously, without the leading **http://** - for example, **tmprofile-ejb120623.trafficmanager.net**. Select **Save** > **Activate Changes**.\n\nRepeat the same steps in the WebLogic Server Administration Console, but for the secondary cluster in the West US region.\n\n### Configure the Transaction Log Store\n\nNext, configure the JDBC Transaction Log Store for all managed servers of clusters, starting from the primary cluster. This practice is described in [Using Transaction Log Files to Recover Transactions](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/wljta/trxcon.html#GUID-7EFC9496-CC51-440D-885D-7E8B3C85FA15).\n\nUse the following steps on the primary WLS cluster in the US East region:\n\n1. Make sure you're signed in to the WebLogic Server Administration Console.\n1. Navigate to **Domain structure** > **wlsd** > **Environment** > **Servers** in the navigation pane. Select **Servers**.\n1. You should see servers **msp1**, **msp2**, and **msp3** listed in the servers table.\n1. Select `msp1` > **Services** > **Lock & Edit**. Under **Transaction Log Store**, select **JDBC**.\n1. For **Type** > **Data Source**, select **jdbc/WebLogicCafeDB**.\n1. Confirm that the value for **Prefix Name** is **TLOG_msp1_**, which is the default value. If the value is different, change it to **TLOG_msp1_**.\n1. Select **Save**.\n1. Select **Servers** > **msp2**, and repeat the same steps, except that the default value for **Prefix Name** is **TLOG_msp2_**.\n1. Select **Servers** > **msp3**, and repeat the same steps, except that the default value for **Prefix Name** is **TLOG_msp3_**.\n1. Select **Activate Changes**.\n\nRepeat the same steps in WebLogic Server Administration Console, but for the secondary cluster in the West US region.\n\n### Restart the managed servers of the primary cluster\n\nThen, use the following steps to restart all the managed servers of the primary cluster for the changes to take effect:\n\n1. Ensure that you're signed in to WebLogic Server Administration Console.\n1. Navigate to **Domain structure** > **wlsd** > **Environment** > **Servers** in the navigation pane. Select **Servers**.\n1. Select the **Control** tab. Select **msp1**, **msp2**, and **msp3**. Select **Shutdown** with the option **When work completes** > **Yes**. Select the refresh icon. Wait until the **Status of Last Action** value is **TASK COMPLETED**. You should see that the **State** value for the selected servers is **SHUTDOWN**. Select the refresh icon again to stop status monitoring.\n1. Select **msp1**, **msp2**, and **msp3** again. Select **Start** > **Yes**. Select the refresh icon. Wait until the **Status of Last Action** value is **TASK COMPLETED**. You should see that the **State** value for the selected servers is **RUNNING**. Select the refresh icon again to stop status monitoring.\n\n### Stop the VMs in the secondary cluster\n\nNow, use the following steps to stop all VMs in the secondary cluster to make it passive:\n\n1. Open the Azure portal home in a new tab of your browser, then select **All resources**. In the **Filter for any field...** box, enter the resource group name where the secondary cluster is deployed - for example, **wls-cluster-westus-ejb120623**.\n1. Select **Type equals all** to open the **Type** filter. For **Value**, enter **Virtual machine**. You should see one entry matched. Select it for **Value**. Select **Apply**. You should see 4 VMs listed, including **adminVM**, **mspVM1**, **mspVM2**, and **mspVM3**.\n1. Select to open each of the VMs. Select **Stop** and confirm for each VM.\n1. Select the notifications icon from the Azure portal to open the **Notifications** pane.\n1. Monitor the event **Stopping virtual machine** for each VM until the value becomes **Successfully stopped virtual machine**. Keep the page open so you can use it for the failover test later.\n\nNow, switch to the browser tab where you monitor the endpoints' status of the Traffic Manager. Refresh the page until you see that the endpoint **myFailoverEndpoint** is **Degraded** and the endpoint **myPrimaryEndpoint** is **Online**.\n\n> [!NOTE]\n> A production-ready HA/DR solution would probably want to achieve a lower RTO by leaving the VMs running but only stopping the WLS software running on the VMs. Then, in the event of failover, the VMs would already be running and the WLS software would take less time to start. This article chose to stop the VMs because the software deployed by [Oracle WebLogic Server Cluster on Azure VMs](https://aka.ms/wls-vm-cluster) automatically starts the WLS software when the VMs start.\n\n### Verify the app\n\n[!INCLUDE [ha-dr-for-wls-azure-verify-sample-app](includes/ha-dr-for-wls-azure-verify-sample-app.md)]\n\n## Test failover from primary to secondary\n\nTo test failover, you manually fail your primary database server and cluster over to the secondary database server and cluster, and then fail back using the Azure portal in this section.\n\n### Failover to the secondary site\n\nFirst, use the following steps to shut down the VMs in the primary cluster:\n\n1. Find the name of your resource group where the primary WLS cluster is deployed - for example, **wls-cluster-eastus-ejb120623**. Then follow the steps in the [Stop VMs in the secondary cluster](#stop-the-vms-in-the-secondary-cluster) section, but change the target resource group to your primary WLS cluster, to stop all VMs in that cluster.\n1. Switch to the browser tab of your Traffic Manager, refresh the page until you see that the **Monitor status** value of the endpoint **myPrimaryEndpoint** becomes **Degraded**.\n1. Switch to the browser tab of the sample app and refresh the page. You should see **504 Gateway Time-out** or **502 Bad Gateway** because none of endpoints is accessible.\n\nNext, use the following steps to failover the Azure SQL Database from the primary server to the secondary server:\n\n1. Switch to the browser tab of your Azure SQL Database failover group.\n1. Select **Failover** > **Yes**.\n1. Wait until it completes.\n\nThen, use the following steps to start all servers in the secondary cluster:\n\n1. Switch to the browser tab where you stopped all the VMs in the secondary cluster.\n1. Select the VM `adminVM`. Select **Start**.\n1. Monitor the event **Starting virtual machine** for `adminVM` in the **Notifications** pane, and wait until the value becomes **Started virtual machine**.\n1. Switch to the browser tab of the WebLogic Server Administration Console for the secondary cluster, then refresh the page until you see the welcome page for sign in.\n1. Switch back to the browser tab where all the VMs in the secondary cluster are listed. For the VMs `mspVM1`, `mspVM2`, and `mspVM3`, select each one to open it and then select **Start**.\n1. For the VMs `mspVM1`, `mspVM2`, and `mspVM3`, monitor the event **Starting virtual machine** in the **Notifications** pane, and wait until the values become **Started virtual machine**.\n\n[!INCLUDE [ha-dr-for-wls-azure-verify-sample-app-test-failover](includes/ha-dr-for-wls-azure-verify-sample-app-test-failover.md)]\n\n### Fail back to the primary site\n\nUse the same steps in the [Failover to the secondary site](#failover-to-the-secondary-site) section to fail back to the primary site including database server and cluster, except for the following differences:\n\n1. First, shut down the VMs in the secondary cluster. You should see that endpoint **myFailoverEndpoint** becomes **Degraded**.\n1. Next, failover the Azure SQL Database from the secondary server to the primary server.\n1. Then, start all servers in the primary cluster.\n1. Finally, verify the sample app after the endpoint **myPrimaryEndpoint** is **Online**.\n\n## Clean up resources\n\nIf you're not going to continue to use the WLS clusters and other components, use the following steps to delete the resource groups to clean up the resources used in this tutorial:\n\n1. Enter the resource group name of Azure SQL Database servers - for example, `myResourceGroup` - in the search box at the top of the Azure portal, and select the matched resource group from the search results.\n1. Select **Delete resource group**.\n1. In **Enter resource group name to confirm deletion**, enter the resource group name.\n1. Select **Delete**.\n1. Repeat steps 1-4 for the resource group of the Traffic Manager - for example, `myResourceGroupTM1`.\n1. Repeat steps 1-4 for the resource group of the primary WLS cluster - for example, `wls-cluster-eastus-ejb120623`.\n1. Repeat steps 1-4 for the resource group of the secondary WLS cluster - for example, `wls-cluster-westus-ejb120623`.\n\n## Next steps\n\nIn this tutorial, you set up an HA/DR solution consisting of an active-passive application infrastructure tier with an active-passive database tier, and in which both tiers span two geographically different sites. At the first site, both the application infrastructure tier and the database tier are active. At the second site, the secondary domain is shut down, and the secondary database is on standby.\n\nContinue to explore the following references for more options to build HA/DR solutions and run WLS on Azure:\n\n> [!div class=\"nextstepaction\"]\n> [Disaster Recovery solutions for Oracle Fusion Middleware products](https://docs.oracle.com/en/middleware/fusion-middleware/12.2.1.4/asdrg/index.html#Oracle%C2%AE-Fusion-Middleware)\n> [!div class=\"nextstepaction\"]\n> [Azure reliability documentation](/azure/reliability)\n> [!div class=\"nextstepaction\"]\n> [Build solutions for high availability](/azure/architecture/high-availability/building-solutions-for-high-availability)\n> [!div class=\"nextstepaction\"]\n> [Automatic failover using Azure Traffic Manager](/azure/networking/disaster-recovery-dns-traffic-manager#automatic-failover-using-azure-traffic-manager)\n> [!div class=\"nextstepaction\"]\n> [Learn more about Oracle WebLogic on Azure VMs](/azure/virtual-machines/workloads/oracle/oracle-weblogic)\n> [!div class=\"nextstepaction\"]\n> [Learn more about Oracle WebLogic on AKS](/azure/virtual-machines/workloads/oracle/weblogic-aks)\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-with-app-gateway.md",
    "content": "---\ntitle: \"Tutorial: Migrate a WebLogic Server cluster to Azure with Azure Application Gateway as a load balancer\"\ndescription: In this how-to guide, you walk through deploying WebLogic Server to Azure with Azure Application Gateway as a load balancer\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.topic: how-to\nms.date: 01/13/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-wls\n  - devx-track-javaee-wls-vm\n  - migration-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Tutorial: Migrate a WebLogic Server cluster to Azure with Azure Application Gateway as a load balancer\n\nThis tutorial walks you through the process of deploying WebLogic Server (WLS) with Azure Application Gateway.\n\n:::image type=\"content\" border=\"false\" source=\"media/migrate-weblogic-with-app-gateway/weblogic-app-gateway.svg\" alt-text=\"Diagram of the relationship between WLS, App Gateway, and SSL.\":::\n\nLoad balancing is an essential part of migrating your Oracle WebLogic Server cluster to Azure. The easiest solution is to use the built-in support for [Azure Application Gateway](/azure/application-gateway/overview). App Gateway is included as part of the WebLogic Cluster support on Azure. For an overview of WebLogic Cluster support on Azure, see [What is Oracle WebLogic Server on Azure?](/azure/virtual-machines/workloads/oracle/oracle-weblogic).\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Choose how to provide the TLS/SSL certificate to the App Gateway\n> * Deploy WebLogic Server with Azure Application Gateway to Azure\n> * Validate successful deployment of WLS and App Gateway\n\n## Prerequisites\n\n* [OpenSSL](https://www.openssl.org/) on a computer running a UNIX-like command-line environment.\n\n   Even though there could be other tools available for certificate management, this tutorial uses OpenSSL. You can find OpenSSL bundled with many GNU/Linux distributions, such as Ubuntu.\n* An active Azure subscription.\n  * If you don't have an Azure subscription, [create a free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* The ability to deploy the [WebLogic Server configured cluster on Azure VMs](/azure/virtual-machines/workloads/oracle/oracle-weblogic#weblogic-server-configured-cluster-on-azure-vms) offer described in [What are solutions for running Oracle WebLogic Server on Azure Virtual Machines?](/azure/virtual-machines/workloads/oracle/oracle-weblogic) The other virtual machine (VM) offers don't support automatic integration of Azure Application Gateway. The steps in this article only apply to offers that support automatic integration of Azure Application Gateway.\n\n> [!NOTE]\n> The WLS on Azure Kubernetes Service (AKS) offer has full support for Azure Application Gateway. For more information, see [Deploy a Java application with WebLogic Server on an Azure Kubernetes Service (AKS) cluster](/azure/aks/howto-deploy-java-wls-app).\n\n## Migration context\n\nHere are some things to consider about migrating on-premises WLS installations and Azure Application Gateway. Even though the steps of this tutorial are the easiest way to stand up a load-balancer in front of your WLS Cluster on Azure, there are many other ways to do it. This list shows some other things to consider.\n\n* If you have an existing load-balancing solution, ensure that Azure Application Gateway meets or exceeds its capabilities. For a summary of the capabilities of Azure Application Gateway compared to other Azure load-balancing solutions, see [Overview of load-balancing options in Azure](/azure/architecture/guide/technology-choices/load-balancing-overview).\n* If your existing load-balancing solution provides security protection from common exploits and vulnerabilities, Application Gateway meets your needs. Application Gateway's built-in Web Application Firewall (WAF) implements the [OWASP (Open Web Application Security Project) core rule sets](https://owasp.org/www-project-modsecurity-core-rule-set/). For more information on WAF support in Application Gateway, see the [Web Application Firewall](/azure/application-gateway/features#web-application-firewall) section of [Azure Application Gateway features](/azure/application-gateway/features).\n* If your existing load-balancing solution requires end-to-end TLS/SSL encryption, you need to do more configuration after following the steps in this guide. See the [End-to-end TLS encryption](/azure/application-gateway/ssl-overview#end-to-end-tls-encryption) section of [Overview of TLS termination and end to end TLS with Application Gateway](/azure/application-gateway/ssl-overview) and the Oracle documentation on [Configuring SSL in Oracle Fusion Middleware](https://docs.oracle.com/en/middleware/fusion-middleware/12.2.1.3/asadm/configuring-ssl1.html#GUID-623906C0-B1FD-423F-AE51-061B5800E927).\n* If you're optimizing for the cloud, this guide shows you how to start from scratch with Azure App Gateway and WLS.\n* For a comprehensive survey of migrating WebLogic Server to Azure Virtual Machines, see [Migrate WebLogic Server applications to Azure Virtual Machines](migrate-weblogic-to-virtual-machines.md).\n\n## Deploy WebLogic Server with Application Gateway to Azure\n\nThis section shows you how to provision a WLS cluster with Azure Application Gateway automatically created as the load balancer for the cluster nodes. Application Gateway uses the provided TLS/SSL certificate for TLS/SSL termination. For advanced details on TLS/SSL termination with Application Gateway, see [Overview of TLS termination and end to end TLS with Application Gateway](/azure/application-gateway/ssl-overview).\n\nTo create the WLS cluster and Application Gateway, use the following steps.\n\nBegin the process of deploying a WLS configured cluster as described in the [Oracle documentation](https://docs.oracle.com/en/middleware/standalone/weblogic-server/wlazu/deploy-oracle-weblogic-server-cluster-microsoft-azure-iaas.html#GUID-69FE91BD-32E2-4F58-9765-008988385534), but come back to this page when you reach **Azure Application Gateway**, as shown here.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-with-app-gateway/weblogic-app-gateway-blade.png\" alt-text=\"Azure portal screenshot showing the Azure Application Gateway.\":::\n\n## Choose how to provide the TLS/SSL certificate to the App Gateway\n\nYou have several options to provide the TLS/SSL certificate to the application gateway, but can only choose one. This section explains each option so you can choose the best one for your deployment.\n\n### Option one: Upload a TLS/SSL certificate\n\nThis option is suitable for production workloads where the App Gateway faces the public Internet, or for intranet workloads that require TLS/SSL. When you choose this option, an Azure Key Vault is automatically provisioned to contain the TLS/SSL certificate used by the App Gateway.\n\nTo upload an existing, signed, TLS/SSL certificate, use the following steps:\n\n1. Follow the steps from your certificate issuer to create a password-protected TLS/SSL certificate and specify the DNS name for the certificate. How to choose wildcard vs. single-name certificate is beyond the scope of this document. Either one works here.\n1. Export the certificate from your issuer using the PFX file format and download it to your local machine. If your issuer doesn't support exporting as PFX, tools exist to convert many certificate formats to PFX format.\n1. Completely fill out the **Basics** pane. \n1. Select the **Azure Application Gateway** section.\n1. Next to **Connect to Azure Application Gateway**, select **Yes**.\n1. Select **Upload a TLS/SSL certificate**.\n1. Select the file browser icon for the field **SSL certificate**. Navigate to the downloaded PFX format certificate and select **Open**.\n1. Enter the password for the certificate in the **Password** and **Confirm password** boxes.\n1. Select **Next**.\n1. Choose whether or not to deny public traffic directly to the nodes of the managed servers. If you select **Yes**, the managed servers are only accessible through the App Gateway.\n\n### Select DNS Configuration\n\nTLS/SSL certificates are associated with a DNS domain name at the time the certificate issuer issues them. Follow the steps in this section to configure the deployment with the DNS name for the certificate. You must be far enough along in the deployment UI so that you already selected a resource group and virtual network for the deployment.\n\nYou can use a DNS Zone you already created, or enable the deployment to create one for you. To learn how to create a DNS zone, see [Quickstart: Create an Azure DNS zone and record using the Azure portal](/azure/dns/dns-getstarted-portal).\n\n#### Use an existing Azure DNS Zone\n\nTo use an existing Azure DNS Zone with the App Gateway, use the following steps:\n\n1. Next to **Configure Custom DNS Alias**, select **Yes**.\n1. Next to **Use an existing Azure DNS Zone** select **Yes**.\n1. Enter the name of the Azure DNS Zone next to **DNS Zone Name**.\n1. Enter the resource group that contains the Azure DNS Zone from the preceding step.\n\n> [!NOTE]\n> The hostnames you define within the DNS Zone must be publicly resolvable before deploying the offer.\n\n#### Enable the deployment to create a new Azure DNS Zone\n\nTo create an Azure DNS Zone to use with the App Gateway, use the following steps:\n\n1. Next to **Configure Custom DNS Alias**, select **Yes**.\n1. Next to **Use an existing Azure DNS Zone** select **No**.\n1. Enter the name of the Azure DNS Zone next to **DNS Zone Name**. A new DNS Zone is created in the same resource group as WLS.\n\nFinally, specify the names for the child DNS zones. The deployment creates two child DNS zones for use with WLS: one for the admin console, and one for the App Gateway. For example, if the **DNS Zone Name** value is **contoso.net**, you could enter **admin** and **app** as the names. The admin console would be available at `admin.contoso.net` and the app gateway would be available at `app.contoso.net`. Don't forget to set up DNS delegation as described in [Delegation of DNS zones with Azure DNS](/azure/dns/dns-domain-delegation).\n\n:::image type=\"content\" source=\"media/migrate-weblogic-with-app-gateway/child-dns-zones.png\" alt-text=\"Azure portal screenshot showing fields for child DNS zones.\":::\n\nThe other options for providing a TLS/SSL certificate to the App Gateway are detailed in the following sections. If you're satisfied with your chosen option, you can skip to the section [Continue with the deployment](#continue-with-the-deployment).\n\n### Option two: Generate a self-signed certificate\n\nThis option is suitable for test and development deployments only. With this option, both an Azure Key Vault and a self-signed certificate are automatically created, and the certificate is provided to App Gateway.\n\nTo request the deployment to perform these actions, use the following steps:\n\n1. In the **Azure Application Gateway** section, select **Generate a self-signed certificate**.\n1. Select a user-assigned managed identity. This selection is necessary to allow the deployment to create the Azure Key Vault and certificate.\n1. If you don't already have a user-assigned managed identity, select **Add** to begin the process of creating one.\n1. To create a user-assigned managed identity, follow the steps in the [Create a user-assigned managed identity](/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-portal#create-a-user-assigned-managed-identity) section of [Create, list, delete, or assign a role to a user-assigned managed identity using the Azure portal](/azure/active-directory/managed-identities-azure-resources/how-to-manage-ua-identity-portal). After you select the user-assigned managed identity, make sure the checkbox next to the user-assigned managed identity is checked.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-with-app-gateway/generate-self-signed-certificate.png\" alt-text=\"Azure portal screenshot showing fields for generating a self-signed certificate.\":::\n\n## Continue with the deployment\n\nYou can now continue with the other aspects of the WLS deployment as described [in the Oracle documentation](https://docs.oracle.com/en/middleware/standalone/weblogic-server/wlazu/deploy-oracle-weblogic-server-cluster-microsoft-azure-iaas.html#GUID-69FE91BD-32E2-4F58-9765-008988385534). If you're satisfied with your configuration, select **Review + create**, and then **Create**.\n\nThe deployment can take up to 15 minutes, depending on network conditions and other factors.\n\n## Validate successful deployment of WLS and App Gateway\n\nThis section shows a technique to quickly validate the successful deployment of the WLS cluster and Application Gateway.\n\nIf you selected **Go to resource group** and then **myAppGateway** at the end of the preceding section, you're now looking at the overview page for the Application Gateway. If not, you can find this page by typing **myAppGateway** in the text box at the top of the Azure portal, and then selecting the correct one that appears. Be sure to select the one within the resource group you created for the WLS cluster. Then, complete the following steps:\n\n1. In the left pane of the overview page for **myAppGateway**, scroll down to the **Monitoring** section and select **Backend health**.\n1. After the **loading** message disappears, you should see a table in the middle of the screen showing the nodes of your cluster configured as nodes in the backend pool.\n1. Verify that the status shows **Healthy** for each node.\n\n## Clean up resources\n\nIf you're not going to continue to use the WLS cluster, delete the Key Vault and the WLS Cluster with the following steps:\n\n1. Visit the overview page for **myAppGateway** as shown in the preceding section.\n1. At the top of the page, under the text **Resource group**, select the resource group.\n1. Select **Delete resource group**.\n1. The input is focused on the field labeled **TYPE THE RESOURCE GROUP NAME**. Type the resource group name as requested.\n1. Select **Delete**.\n\n## Next steps\n\nContinue to explore options to run WLS on Azure.\n> [!div class=\"nextstepaction\"]\n> [Learn more about Oracle WebLogic Server on Azure](/azure/virtual-machines/workloads/oracle/oracle-weblogic)\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-with-elk.md",
    "content": "---\ntitle: \"Tutorial: Migrate WebLogic Server to Azure with Elastic on Azure as the logging solution\"\ndescription: This tutorial walks you through deploying WebLogic Server to Azure with Elastic Stack on Azure as the logging solution\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.topic: tutorial\nms.date: 01/13/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-wls\n  - devx-track-javaee-wls-vm\n  - migration-java\n  - sfi-image-nochange\n---\n\n# Tutorial: Migrate WebLogic Server to Azure with Elastic on Azure as the logging solution\n\nIn this tutorial, you deploy WebLogic Server (WLS) on Azure Virtual Machines (VMs) and integrate with Elastic Cloud (Elasticsearch). You also configure Elastic Custom Logs to capture log data from WLS. Finally, you use Kibana to search and analyze WLS logs. While each component is documented individually, this tutorial demonstrates how they integrate seamlessly to provide a robust log management solution for WLS on Azure.\n\n:::image type=\"content\" border=\"false\" source=\"media/migrate-weblogic-with-elk/weblogic-elk.svg\" alt-text=\"Diagram showing the relationship between WLS, App Gateway, and ELK.\":::\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create an Elastic on Azure instance.\n> * Deploy WLS on Azure.\n> * Configure Elastic Custom Logs to integrate WLS logs.\n> * Search WebLogic Server logs from Kibana.\n\n## Prerequisites\n\n* An active Azure subscription. If you don't have an Azure subscription, [create a free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* The ability to deploy one of the WLS on Virtual Machines Azure Applications listed at [What are solutions for running Oracle WebLogic Server on Azure Virtual Machines?](/azure/virtual-machines/workloads/oracle/oracle-weblogic)\n* A terminal for SSH access to virtual machines.\n\n## Deploy WLS on Azure\n\nProvision WebLogic Server by following the steps in [What are solutions for running Oracle WebLogic Server on Azure Virtual Machines?](https://aka.ms/arm-oraclelinux-wls) Both \"Deploy Oracle WebLogic Server With Administration Server on a Single Node\" and \"Deploy Oracle WebLogic Server Cluster on Microsoft Azure IaaS\" are compatible with Elastic on Azure. This tutorial uses [WebLogic on VM](https://aka.ms/wls-vm-admin) as an example.\n\n> [!NOTE]\n> The default VM size might not have sufficient memory for the Elastic agent. Ensure that the selected VM size has at least 2.5 GB of memory. `Standard_A2_v2` is the minimum sufficient size\n\nAfter filling in the required information, select **Create** to initiate the WLS deployment on Azure. The deployment typically takes about 30 minutes. After deployment, go to **Outputs** and record the value of **adminConsoleURL**, which is the URL for accessing the Administration Console.\n\n### Understand WebLogic logs\n\nWebLogic Server subsystems use logging services to track events such as application deployment and subsystem failures. These logs enable server instances to communicate their status and respond to specific events, providing detailed insights that can help in troubleshooting and monitoring. WebLogic's logging services enable you to report errors, listen for log messages from particular subsystems, and capture system status updates. For more detailed information on WebLogic logging services, see [Understanding WebLogic Logging Services](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/wllog/logging_services.html).\n\nThis tutorial focuses on configuring the following key WebLogic logs:\n\n- Server Log Files: Typically found in the **logs** directory beneath the server instance's root. The path is usually as **DOMAIN_NAME/servers/SERVER_NAME/logs/SERVER_NAME.log**.\n\n- Domain Log Files: These logs provide an overview of domain status and are stored in the Administration Server's **logs** directory. The default path is **DOMAIN_NAME/servers/ADMIN_SERVER_NAME/logs/DOMAIN_NAME.log**.\n\n- HTTP Access Logs: By default, HTTP access logs share the server log's directory and rotation policy. The default path is **DOMAIN_NAME/servers/SERVER_NAME/logs/1access.log**.\n\nYou can configure and manage these logs to facilitate the integration with monitoring tools like Elastic on Azure, enabling centralized log analysis and alerting on WebLogic Server instances.\n\nWhile the offer deploys, you can skip to and follow the steps in the section [Create an Elasticsearch on Azure instance](#create-an-elasticsearch-on-azure-instance). Return here when the offer is finished deploying.\n\n### Connect to the WLS machine\n\nTo access the virtual machine running WebLogic Server (WLS), use the steps in [Connect to the virtual machine](/azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine#connect-to-the-virtual-machine). In this tutorial, you're connecting to the machine that hosts the WebLogic Administration Server, named `adminVM`.\n\n## Create an Elasticsearch on Azure instance\n\nElastic Cloud (Elasticsearch) for Azure is an Azure Native ISV Services you can get from Azure Marketplace and deploy with the Azure portal. Azure Native ISV Services enable you to easily provision, manage, and tightly integrate independent software vendor (ISV) software and services on Azure. Elastic Cloud - Azure Native ISV Service is developed and managed by Microsoft and Elastic. You create, provision, and manage Elastic resources through the Azure portal. Elastic owns and runs the SaaS application including the Elastic accounts created. For an overview of Elastic Cloud (Elasticsearch) see [What is Elastic Cloud (Elasticsearch) - An Azure Native ISV Service?](/azure/partner-solutions/elastic/overview)\n\n### Create Elastic on Azure\n\nTo create an Elastic application, follow the steps in [QuickStart: Get started with Elastic](/azure/partner-solutions/elastic/create).\n\nIn the first step of the section **Create resource**, use the following steps for substitutions:\n\n1. In the **Basics** pane, under **Plan Details**, use the following steps:\n\n   1. For **Resource group**, fill in a unique resource group name. This tutorial uses `elkrg1030`.\n   1. For **Resource name**, fill in a unique name for your Elastic instance. You can use the same value you used for **Resource group**.\n   1. For **Region**, select your desired region.\n   1. Keep the default values for other fields.\n\n1. In the **Logs & metrics** pane, select **Send subscription activity logs** and **Send Azure resource logs for all defined resources** to monitor the Azure resources. However, this tutorial focuses solely on WLS logs and doesn't cover infrastructure logs.\n\n1. You can skip the sections **Azure OpenAI configuration** and **Tags**.\n\n1. Follow the remaining steps in the article.\n\nAfter the deployment succeeds, continue to the next section in this article.\n\n### Launch Kibana\n\nAfter Elastic is deployed on Azure, open the Elastic resource from the Azure portal. Locate the **Kibana** URL, next to the label **Deployment URL**, as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/migrate-weblogic-with-elk/elastic-portal.png\" alt-text=\"Screenshot of the Azure portal that shows the Elastic page with the Kibana deployment URL highlighted.\" lightbox=\"media/migrate-weblogic-with-elk/elastic-portal.png\":::\n\nWhen you launch Kibana, you're prompted to sign in by selecting an Azure account. Choose the Azure account used for creating the Elastic deployment, then review and accept the requested Elasticsearch permissions.\n\n:::image type=\"content\" source=\"media/migrate-weblogic-with-elk/permission-requested.png\" alt-text=\"Screenshot of the Permissions requested dialog box for Elasticsearch permissions.\" lightbox=\"media/migrate-weblogic-with-elk/permission-requested.png\":::\n\nAfter you're signed in, the browser navigates to Kibana's welcome page, as shown in the following screenshot:\n\n:::image type=\"content\" source=\"media/migrate-weblogic-with-elk/setup-elastic-welcome-page.png\" alt-text=\"Screenshot of the Elasticsearch welcome page.\" lightbox=\"media/migrate-weblogic-with-elk/setup-elastic-welcome-page.png\":::\n\n## Configure Elastic Custom Logs and Integrate WLS Logs\n\nUse the following steps to set up custom log integration for WebLogic Server on Kibana:\n\n1. Use the following steps to navigate to Kibana's integration setup:\n\n   1. On the Kibana welcome page, find **Get started by adding integrations** and then select **Add integrations**.\n\n   1. Search for **Custom Logs** and then select it.\n\n      :::image type=\"content\" source=\"media/migrate-weblogic-with-elk/custom-logs.png\" alt-text=\"Screenshot of the Custom Logs entry.\" lightbox=\"media/migrate-weblogic-with-elk/custom-logs.png\":::\n\n   1. Select **Add Custom Logs** to view instructions for installing the Elastic Agent and adding integrations.\n\n      :::image type=\"content\" source=\"media/migrate-weblogic-with-elk/add-custom-logs.png\" alt-text=\"Screenshot of the Add Custom Logs button.\" lightbox=\"media/migrate-weblogic-with-elk/add-custom-logs.png\":::\n\n1. Use the following steps to install the Elastic Agent:\n\n   1. Select **Install Elastic Agent**, which brings up the steps for installation.\n\n      :::image type=\"content\" source=\"media/migrate-weblogic-with-elk/install-elastic-agent.png\" alt-text=\"Screenshot of the Install Elastic Agent button.\" lightbox=\"media/migrate-weblogic-with-elk/install-elastic-agent.png\":::\n\n   1. SSH into the WLS machine and then switch to root privileges by using the following command:\n\n      ```bash\n      sudo su -\n      ```\n\n   1. From Kibana, copy the **Linux Tar** command from the **Install Elastic Agent on your host** section and execute it on the WLS machine.\n\n   1. In the machine terminal, confirm the installation by entering <kbd>y</kbd> when prompted, as shown in the following example:\n\n      ```output\n      Elastic Agent will be installed at /opt/Elastic/Agent and will run as a service. Do you want to continue? [Y/n]:y\n      ```\n\n      Look for the text `Elastic Agent has been successfully installed.` This text indicates a successful installation. If you don't see this text, troubleshoot and resolve the problem before continuing.\n\n1. Verify agent enrollment. In Kibana, confirm **Agent enrollment** under **Confirm agent enrollment**.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-with-elk/elk-setup-custom-log.png\" alt-text=\"Screenshot of the Set up Custom Logs integration page with the highlighted message 1 agent has been enrolled.\" lightbox=\"media/migrate-weblogic-with-elk/elk-setup-custom-log.png\":::\n\n1. Use the following steps to add the integration for WLS domain logs:\n\n   1. Select **Add the integration**.\n\n   1. Under **Custom log file**, set the following properties:\n\n      - For **Log file path**, use **/u01/domains/adminDomain/servers/admin/logs/adminDomain.log**.\n      - For **Dataset name**, use **generic**.\n\n   1. Expand **Advanced options**. For **Custom configurations**, set the following properties:\n\n      - For **multiline.type**, use **pattern**.\n      - For **multiline.pattern**, use **'^####'**.\n      - For **multiline.negate**, use **true**.\n      - For **multiline.match**, use **after**.\n\n   1. Expand **Advanced options**. For **Integration name**, fill in **log-weblogic-domain-log**.\n\n   1. Select **Confirm incoming data** to preview the logs. Then, select **View assets** -> **Assets** -> **Views** -> **Logs** to view the domain logs in Kibana.\n\n   1. In the textarea containing the text **Search for log messages**, enter the string **weblogic** and press <kbd>Enter</kdb>. You should see log messages containing the string **weblogic**.\n\n      :::image type=\"content\" source=\"media/migrate-weblogic-with-elk/elastic-weblogic-domain-log.png\" alt-text=\"Screenshot of log messages search pane with the 'weblogic' search term highlighted.\" lightbox=\"media/migrate-weblogic-with-elk/elastic-weblogic-domain-log.png\":::\n\n1. Use the following steps to add integrations for server logs and HTTP access logs:\n\n   1. In Kibana, search for **Integrations** and then select it.\n\n   1. Select **Installed integrations** > **Custom Logs** > **Add Custom Logs**.\n\n   1. Enter the appropriate configurations from the following lists for each log type - server, and HTTP access logs. After filling out all configuration fields, select **Save and continue** then **Save and deploy changes**.\n\n      - For server log, use the following values:\n\n        - For **Integration settings > Integration name**, use **log-weblogic-server-log**.\n\n        - For **Custom log file > Log file path**, use **/u01/domains/adminDomain/servers/admin/logs/admin.log**.\n\n        - For **Custom log file > Advanced options > Custom configurations**, use the following values:\n\n          - For **multiline.type**, use **pattern**.\n          - For **multiline.pattern**, use **'^####'**.\n          - For **multiline.negate**, use **true**.\n          - For **multiline.match**, use **after**.\n\n        - For **Where to add this integration? > Existing hosts**, use **My first agent policy**.\n\n      - For HTTP access logs, use the following values:\n\n        - For **Integration settings > Integration name**, use **log-http-access-log**.\n        - For **Custom log file > Log file path**, use **/u01/domains/adminDomain/servers/admin/logs/access.log**.\n        - For **Custom log file > Advanced options > Custom configurations**, no configuration is provided.\n        - For **Where to add this integration? > Existing hosts**, use **My first agent policy**.\n\n## Search WLS Logs in Kibana\n\nAfter integrating, use the following steps to begin analyzing the logs within Kibana:\n\n1. To access the Discover page, open the **hamburger menu**. Then, under **Analytics**, select **Discover**.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-with-elk/elastic-discover-menu.png\" alt-text=\"Screenshot of the Kibana Analytics menu with the Discover option highlighted.\" lightbox=\"media/migrate-weblogic-with-elk/elastic-discover-menu.png\":::\n\n1. To select the log index, in the **Discover** page, select **logs-\\***.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-with-elk/elastic-logs-in-kibana.png\" alt-text=\"Screenshot of the Kibana WebLogic logs with the index highlighted.\" lightbox=\"media/migrate-weblogic-with-elk/elastic-logs-in-kibana.png\":::\n\n1. Search and filter the WLS logs. For more information on using **Discover**, see [Discover](https://www.elastic.co/guide/en/kibana/current/discover.html) in the Kibana documentation.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-with-elk/elastic-add-filter.png\" alt-text=\"Screenshot of the Add filter dialog box in Kibana.\" lightbox=\"media/migrate-weblogic-with-elk/elastic-add-filter.png\":::\n\n> [!NOTE]\n> If you're running a WLS cluster, you need to install the Elastic Agent on each VM and configure custom logs on the corresponding hosts.\n\n## Clean up resources\n\nIf you're no longer using the WLS or Elastic stack, you can clean them up by following the steps in this section.\n\n### Clean up WLS\n\nUse the following steps to clean up WLS:\n\n1. On the Azure portal home page, select **Resource groups**.\n\n1. In the **Filter for any field...** text field, enter the name of the resource group in which you created the WLS deployment.\n\n1. When the list displays your resource group, select it.\n\n1. From the **Resource group** overview, select **Delete resource group**.\n\n1. In the **Are you sure you want to delete** section, type the name of the resource group and then select **Delete**. You can continue to work with the Azure portal while the resource group and its contents are deleted.\n\n### Clean up Elastic on Azure\n\nFollow the same steps as in the preceding section to delete Elastic on Azure, but use the resource group name of the Elastic on Azure deployment as the resource group to delete.\n\n## Next step\n\nContinue your migration journey by exploring WebLogic Server to Azure Virtual Machines.\n\n> [!div class=\"nextstepaction\"]\n> [WebLogic Server to Azure Virtual Machines](./migrate-weblogic-to-virtual-machines.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-weblogic-with-entra-id-via-ldap.md",
    "content": "---\ntitle: Enable end-user Authorization and Authentication with Microsoft Entra ID when Migrating Java Apps on WebLogic Server to Azure\ndescription: This guide describes how to configure Oracle WebLogic Server to connect with Microsoft Entra ID Domain Services via LDAP.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: edburns\nms.topic: tutorial\nms.date: 01/13/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-wls\n  - devx-track-javaee-wls-vm\n  - migration-java\n  - sfi-image-nochange\n---\n\n# Enable end-user authorization and authentication when migrating Java apps on WebLogic Server to Azure\n\nThis guide helps you to enable enterprise grade end-user authentication and authorization for Java apps on WebLogic Server using Microsoft Entra ID.\n\nJava EE developers expect the [standard platform security mechanisms](https://javaee.github.io/tutorial/security-intro.html) to work as expected, even when moving their workloads to Azure. [Oracle WebLogic Server (WLS) Azure applications](/azure/virtual-machines/workloads/oracle/oracle-weblogic) let you populate the built-in security realm with users from Microsoft Entra Domain Services. When you use the standard `<security-role>` element in your Java EE on Azure applications, the user information flows from Microsoft Entra Domain Services through Lightweight Directory Access Protocol (LDAP).\n\nThis guide is divided into two parts. If you already have Microsoft Entra Domain Services with secure LDAP exposed, you can skip to the [Configure WLS](#configure-wls) section.\n\nIn this guide you, learn how to:\n\n> [!div class=\"checklist\"]\n> * Create and configure a Microsoft Entra Domain Services managed domain.\n> * Configure secure Lightweight Directory Access Protocol (LDAP) for a Microsoft Entra Domain Services managed domain.\n> * Enable WebLogic Server to access LDAP as its default security realm.\n\nThis guide doesn't help you reconfigure an existing Microsoft Entra ID Domain Services deployment. However, it should be possible to follow along with this guide and see which steps you can skip.\n\n## Prerequisites\n\n* An Azure subscription. If you don't have an Azure subscription, [create a free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* The ability to deploy Microsoft Entra Domain Services. For more information, see [Create and configure a Microsoft Entra Domain Services managed domain](/entra/identity/domain-services/tutorial-create-instance).\n* The ability to deploy one of the WLS Azure applications listed in [What are solutions for running Oracle WebLogic Server on Azure Virtual Machines?](/azure/virtual-machines/workloads/oracle/oracle-weblogic)\n* A local machine with either Windows with Windows Subsystem for Linux (WSL), GNU/Linux, or macOS installed.\n* [Azure CLI](/cli/azure/install-azure-cli) version 2.54.0 or higher.\n\n## Consider the migration context\n\nThe following list describes some things to consider about migrating on-premises WLS installations and Microsoft Entra ID:\n\n* If you already have a Microsoft Entra ID tenant without Domain Services exposed via LDAP, this guide shows how to expose the LDAP capability and integrate it with WLS.\n* If your scenario involves an on-premises Active Directory forest, consider implementing a hybrid identity solution with Microsoft Entra ID. For more information, see the [Hybrid identity documentation](/entra/identity/hybrid/).\n* If you already have an on-premises Active Directory Domain Services (AD DS) deployment, explore the migration paths in [Compare self-managed Active Directory Domain Services, Microsoft Entra ID, and managed Microsoft Entra Domain Services](/entra/identity/domain-services/compare-identity-solutions).\n* If you're optimizing for the cloud, this guide shows you how to start from scratch with Microsoft Entra ID Domain Services LDAP and WLS.\n* For a comprehensive survey of migrating WebLogic Server to Azure Virtual Machines, see [Migrate WebLogic Server applications to Azure Virtual Machines](migrate-weblogic-to-virtual-machines.md).\n* For more information about Active Directory and Microsoft Entra ID, see [Compare Active Directory to Microsoft Entra ID](/entra/fundamentals/compare).\n\n## Configure Microsoft Entra Domain Services managed domain\n\nThis section walks you through all the steps to stand up a Microsoft Entra Domain Services managed domain integrated with WLS. Microsoft Entra ID doesn't support the Lightweight Directory Access Protocol (LDAP) protocol or Secure LDAP directly. Instead, support is enabled through the Microsoft Entra Domain Services managed domain instance within your Microsoft Entra ID tenant.\n\n> [!NOTE]\n> This guide uses the \"cloud-only\" user account feature of Microsoft Entra Domain Services. Other user account types are supported, but aren't described in this guide.\n\n### Create and configure a Microsoft Entra Domain Services managed domain\n\nThis article uses a separate tutorial to stand up a Microsoft Entra Domain Services managed domain.\n\nComplete the tutorial [Create and configure a Microsoft Entra Domain Services managed domain](/entra/identity/domain-services/tutorial-create-instance) up to but not including the section [Enable user accounts for Domain Services](/entra/identity/domain-services/tutorial-create-instance#enable-user-accounts-for-domain-services). That section requires special treatment in the context of this tutorial, as described in the next section. Be sure to complete the DNS actions completely and correctly.\n\nNote down the value that you specify when completing the step \"Enter a DNS domain name for your managed domain.\" You use it later in this article.\n\n### Create users and reset passwords\n\nThe following steps show you how to create users and change their passwords, which is required to cause the users to propagate successfully through LDAP. If you have an existing Microsoft Entra Domain Services managed domain, these steps might not be necessary.\n\n1. Within the Azure portal, ensure the subscription corresponding to the Microsoft Entra ID tenant is the currently active directory. To learn how to select the correct directory, see [Associate or add an Azure subscription to your Microsoft Entra tenant](/entra/fundamentals/how-subscriptions-associated-directory). If the incorrect directory is selected, you either aren't able to create users, or you create users in the wrong directory.\n1. In the search box at the top of the Azure portal, enter **Users**.\n1. Select **New user**.\n1. Ensure that **Create user** is selected.\n1. Fill in values for **User name**, **name**, **First name**, and **Last name**. Leave the remaining fields at their default values.\n1. Select **Create**.\n1. Select the newly created user in the table.\n1. Select **Reset password**.\n1. In the panel that appears, select **Reset password**.\n1. Note down the temporary password.\n1. In an \"incognito\" or private browser window, visit [the Azure portal](https://portal.azure.com/) and sign in with the user's credentials and password.\n1. Change the password when prompted. Note down the new password. You use it later.\n1. Sign out and close the \"incognito\" window.\n\nRepeat the steps from \"Select **New user**\" through \"Sign and out close\" for each user you want to enable.\n\n### Configure secure LDAP for a Microsoft Entra Domain Services managed domain\n\nThis section walks you through a separate tutorial to extract values for use in configuring WLS.\n\nFirst, open the tutorial [Configure secure LDAP for a Microsoft Entra Domain Services managed domain](/entra/identity/domain-services/tutorial-configure-ldaps) in a separate browser window so you can look at the variations below as you run through the tutorial.\n\nWhen you reach the section [Export a certificate for client computers](/entra/identity/domain-services/tutorial-configure-ldaps#export-a-certificate-for-client-computers), take note of where you save the certificate file ending in **.cer**. You use the certificate as input to the WLS configuration.\n\nWhen you reach the section [Lock down secure LDAP access over the internet](/entra/identity/domain-services/tutorial-configure-ldaps#lock-down-secure-ldap-access-over-the-internet), specify **Any** as the source. You tighten the security rule with a specific IP address later in this guide.\n\nBefore you execute the steps in [Test queries to the managed domain](/entra/identity/domain-services/tutorial-configure-ldaps#test-queries-to-the-managed-domain), use the following steps to enable the testing to succeed:\n\n1. In the Azure portal, visit the overview page for the Microsoft Entra Domain Services instance.\n1. In the **Settings** area, select **Properties**.\n1. In the right-hand pane of the page, scroll down until you see **Admin group**. Under this heading should be a link for **AAD DC Administrators**. Select that link.\n1. In the **Manage** section, select **Members**.\n1. Select **Add members**.\n1. In the **Search** text field, enter some characters to locate one of the users you created in a preceding step.\n1. Select the user, then activate the **Select** button.\n\n   This user is the one you must use when executing the steps in the **Test queries to the managed domain** section.\n\n> [!NOTE]\n> The following list provides some tips about querying the LDAP data, which you need to do to collect some values necessary for WLS configuration:\n>\n> * The tutorial advises you to use the Windows program **LDP.exe**. This program is only available on Windows. For non-Windows users, it's also possible to use [Apache Directory Studio](https://directory.apache.org/studio/downloads.html) for the same purpose.\n> * When logging in to LDAP with **LDP.exe**, the username is just the part before the @. For example, if the user is `alice@contoso.onmicrosoft.com`, the username for the **LDP.exe** bind action is `alice`. Also, leave **LDP.exe** running and logged in for use in subsequent steps.\n\nIn the section [Configure DNS zone for external access](/entra/identity/domain-services/tutorial-configure-ldaps#configure-dns-zone-for-external-access), note down the value for **Secure LDAP external IP address**. You use it later.\n\nIf the value of the **Secure LDAP external IP address** isn't readily apparent, use the following steps to get the IP address:\n\n1. In the Azure portal, find the resource group that contains the Microsoft Entra Domain Services resource.\n1. In the list of resources, select the **public IP address** resource for the Microsoft Entra Domain Services resource, as shown in the following screenshot. The public IP address likely starts with `aadds`.\n\n   :::image type=\"content\" source=\"media/migrate-weblogic-with-entra-id-via-ldap/alternate-secure-ip-address-technique.png\" alt-text=\"Screenshot of the Azure portal that shows the Resource group page with the Public IP address highlighted.\" lightbox=\"media/migrate-weblogic-with-entra-id-via-ldap/alternate-secure-ip-address-technique.png\":::\n\nDon't execute the steps in [Clean-up resources](/entra/identity/domain-services/tutorial-configure-ldaps#clean-up-resources) until instructed to do so in this guide.\n\nWith these variations in mind, complete [Configure secure LDAP for a Microsoft Entra Domain Services managed domain](/entra/identity/domain-services/tutorial-configure-ldaps). You can now collect the values that you need to provide to the WLS Configuration.\n\n> [!NOTE]\n> Wait for the secure LDAP configuration to complete processing before moving on to the next section.\n\n### Disable weak TLS v1\n\nBy default, Microsoft Entra Domain Services enables the use of TLS v1, which is considered weak and isn't supported in WebLogic Server 14 and later.\n\nThis section shows you how to disable the TLS v1 cipher.\n\nFirst, get the resource ID of the Microsoft Entra Domain Service managed domain that enables LDAP. The following command gets the ID of an Azure Domain Service instance named `aaddscontoso.com` in a resource group named `aadds-rg`:\n\n```azurecli\nAADDS_ID=$(az resource show \\\n    --resource-group aadds-rg \\\n    --resource-type \"Microsoft.AAD/DomainServices\" \\\n    --name aaddscontoso.com \\\n    --query \"id\" \\\n    --output tsv)\n```\n\nTo disable TLS v1, use the following command:\n\n```azurecli\naz resource update \\\n    --ids $AADDS_ID \\\n    --set properties.domainSecuritySettings.tlsV1=Disabled\n```\n\nThe output displays `\"tlsV1\": \"Disabled\"` for `domainSecuritySettings`, as shown in the following example:\n\n```output\n\"domainSecuritySettings\": {\n      \"ntlmV1\": \"Enabled\",\n      \"syncKerberosPasswords\": \"Enabled\",\n      \"syncNtlmPasswords\": \"Enabled\",\n      \"syncOnPremPasswords\": \"Enabled\",\n      \"tlsV1\": \"Disabled\"\n}\n```\n\nFor more information, see [Harden a Microsoft Entra Domain Services managed domain](/entra/identity/domain-services/secure-your-domain).\n\n> [!NOTE]\n> If you add a lock to the resource or resource group, you encounter an error message when attempting to update the managed domain, such as: `Message: The scope '/subscriptions/xxxxx/resourceGroups/aadds-rg/providers/Microsoft.AAD/domainServices/aaddscontoso.com' cannot perform write operation because the following scope(s) are locked: '/subscriptions/xxxxx/resourceGroups/aadds-rg'. Please remove the lock and try again.`\n\nWrite down the following information for the Microsoft Entra Domain Service managed domain. You use this information in a later section.\n\n| Property                                                       | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n|----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Server Host                                                    | This value is the public DNS name that you saved when completing [Create and configure a Microsoft Entra ID Domain Services managed domain](/entra/identity/domain-services/tutorial-create-instance).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n| Secure LDAP external IP address                                | This value is the **Secure LDAP external IP address** value that you saved in the [Configure DNS zone for external access](/entra/identity/domain-services/tutorial-configure-ldaps#configure-dns-zone-for-external-access) section.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n| Principal                                                      | To get this value, return to **LDP.exe** and use the following steps to obtain the value for the principal for use on your cloud only: <ol><li>In the **View** menu, select **Tree**.</li><li>In the **Tree View** dialog, leave **BaseDN** blank and select **OK**.</li><li>Right-click in the right side pane and select **Clear output**.</li><li>Expand the tree view select the entry that starts with **OU=AADDC Users**.</li><li>In the **Browse** menu, select **Search**.</li><li>In the dialog that appears, accept the defaults and select **Run**.</li><li>After output appears in the right-hand pane, select **Close**, next to **Run**.</li><li>Scan the output for the `Dn` entry corresponding to the user you added to the `AAD DC Administrators` group. It starts with `Dn: CN=&lt;user name&gt;OU=AADDC Users`.</li></ol> |\n| User Base DN and Group Base DN                                 | For the purposes of this tutorial, the values for both of these properties are the same: the principal of `OU=AADDC Users`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n| Password for Principal                                         | This value is the password for the user that was added to the `AAD DC Administrators` group.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n| Public key for Microsoft Entra Domain Service LDAPS connection | This value is the **.cer** file you were asked to save aside when you completed the section [Export a certificate for client computers](/entra/identity/domain-services/tutorial-configure-ldaps#export-a-certificate-for-client-computers).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n\n## Configure WLS\n\nThis section helps you collect the parameter values from the Microsoft Entra Domain Service managed domain deployed earlier.\n\nWhen you deploy any of the Azure Applications listed in [What are solutions for running Oracle WebLogic Server on Azure Virtual Machines?](/azure/virtual-machines/workloads/oracle/oracle-weblogic), you can follow the steps to integrate Microsoft Entra Domain Service managed domain with WLS.\n\nAfter the Azure application deployment finishes, use the following steps to find the URL to access the WebLogic Administration Console:\n\n1. Open the Azure portal and go to the resource group that you provisioned.\n1. In the navigation pane, in the **Settings** section, select **Deployments**. You see an ordered list of the deployments to this resource group, with the most recent one first.\n1. Scroll to the oldest entry in this list. This entry corresponds to the deployment you started in the previous section. Select the oldest deployment, whose name starts with something similar to `oracle.`.\n1. Select **Outputs**. This option shows the list of outputs from the deployment.\n1. The **adminConsole** value is the fully qualified, public, internet-visible link to the WLS admin console. Select the copy icon next to the field value to copy the link to your clipboard and save it in a file.\n\n> [!NOTE]\n> This tutorial demonstrates how to use TLS v1.2 to connect to the Microsoft Entra Domain Service managed domain LDAP server. To ensure compatibility, you need to enable TLS v1.2 for deployments on JDK 8.\n>\n> To verify your JDK version, use the following steps:\n>\n> 1. Paste the value of **adminConsole** into your browser address bar, then sign in to the WLS admin console.\n> 1. Under **Domain Structure**, select **Environment** > **Servers** > **admin** > **Monitoring** > **General**, then find **Java Version**.\n>\n>    :::image type=\"content\" source=\"media/migrate-weblogic-with-entra-id-via-ldap/wls-console-java-version.png\" alt-text=\"Screenshot of the WLS admin console Monitoring > General tab with the Java Version field highlighted.\" lightbox=\"media/migrate-weblogic-with-entra-id-via-ldap/wls-console-java-version.png\":::\n>\n> If your Java version is 8, enable TLS v1.2 by using the following steps:\n>\n> 1. Under **Domain Structure**, select **Environment** > **Servers** > **admin** > **Configuration** > **Server Start**.\n> 1. In the **Arguments** section, specify the value `-Djdk.tls.client.protocols=TLSv1.2`.\n> 1. Select **Save** to save the change.\n> 1. Under **Change Center**, select **Activate Changes** to enable the option.\n>\n>    :::image type=\"content\" source=\"media/migrate-weblogic-with-entra-id-via-ldap/wls-console-enable-tls-v12.png\" alt-text=\"Screenshot of the WLS admin console Configuration > Server Start tab.\" lightbox=\"media/migrate-weblogic-with-entra-id-via-ldap/wls-console-enable-tls-v12.png\":::\n\n### Integrate Microsoft Entra Domain Service managed domain with WLS\n\nWith the WebLogic admin server running, and the Microsoft Entra Domain Service managed domain deployed and secured with LDAPs, it's now possible to launch the configuration.\n\n#### Upload and import the public CA\n\nWLS communicates with the managed domain using Secure LDAP (LDAPS), which is LDAP over Secure Sockets Layer (SSL) or Transport Layer Security (TLS). To establish this connection, you must upload and import the public Certificate Authority (CA) certificate (a **.cer** file) into the WLS trust keystore.\n\nUpload and import the certificate to the virtual machine that runs admin server by using the following steps:\n\n1. Enable access to `adminVM` by following the instructions in the [Connect to the virtual machine](/azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine#connect-to-the-virtual-machine) section of [Quickstart: Deploy WebLogic Server on Azure Virtual Machines](/azure/virtual-machines/workloads/oracle/weblogic-server-azure-virtual-machine).\n1. Open a Bash terminal, then upload the certificate by using the following commands. Replace the `ADMIN_PUBLIC_IP` value with the real value, which you can find in the Azure portal. You're required to input the password that you used to connect the machine.\n\n   ```bash\n   export CER_FILE_NAME=azure-ad-ds-client.cer\n   export ADMIN_PUBLIC_IP=\"<admin-public-ip>\"\n   export ADMIN_VM_USER=\"weblogic\"\n\n   cd <path-to-cert>\n   scp ${CER_FILE_NAME} \"$ADMIN_VM_USER@$ADMIN_PUBLIC_IP\":/home/${ADMIN_VM_USER}/${CER_FILE_NAME}\n   ```\n\n1. After the certificate is uploaded, you need to move it to the WLS domain folder **/u01/domains** and change its ownership with `oracle:oracle` by using the following commands:\n\n   ```azurecli\n   export RESOURCE_GROUP_NAME=contoso-rg\n   export ADMIN_VM_NAME=adminVM\n   export CA_PATH=/u01/domains/${CER_FILE_NAME}\n\n   az vm run-command invoke \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name ${ADMIN_VM_NAME} \\\n       --command-id RunShellScript \\\n       --scripts \"mv /home/${ADMIN_VM_USER}/${CER_FILE_NAME} /u01/domains; chown oracle:oracle ${CA_PATH}\"\n   ```\n\n1. Import the certificate to your keystore. The Azure application provisions WLS with a default trust store in `<jvm-path-to-security>/cacerts`. The specific path might vary depending on the JDK version. You can import the Microsoft Entra Domain Service managed domain public CA by using the following steps:\n\n   1. Query the script that you used to set the domain environment variables.\n\n      ```azurecli\n      export DOMIAN_FILE_PATH=$(az vm run-command invoke \\\n          --resource-group $RESOURCE_GROUP_NAME \\\n          --name ${ADMIN_VM_NAME} \\\n          --command-id RunShellScript \\\n          --scripts \"find /u01/domains -name setDomainEnv.sh\" \\\n          --query value[*].message \\\n          --output tsv \\\n          | sed -n '/\\[stdout\\]/!b; n; p')\n\n      echo $DOMIAN_FILE_PATH\n      ```\n\n   1. Import the CA by using the following command. Pay attention to your Java version, which you checked in previous section.\n\n      ##### [Java 11 and above](#tab/java11)\n\n      ```azurecli\n      az vm run-command invoke \\\n          --resource-group $RESOURCE_GROUP_NAME \\\n          --name ${ADMIN_VM_NAME} \\\n          --command-id RunShellScript \\\n          --scripts \". ${DOMIAN_FILE_PATH};export JVM_CER_PATH=\\${JAVA_HOME}/lib/security/cacerts;\\${JAVA_HOME}/bin/keytool -noprompt -import -alias aadtrust -file ${CA_PATH} -keystore \\${JVM_CER_PATH} -storepass changeit\"\n      ```\n\n      ##### [Java 8](#tab/oldjava)\n\n      ```azurecli\n      az vm run-command invoke \\\n          --resource-group $RESOURCE_GROUP_NAME \\\n          --name ${ADMIN_VM_NAME} \\\n          --command-id RunShellScript \\\n          --scripts \". ${DOMIAN_FILE_PATH};export JVM_CER_PATH=\\${JAVA_HOME}/jre/lib/security/cacerts;\\${JAVA_HOME}/bin/keytool -noprompt -import -alias aadtrust -file ${CA_PATH} -keystore \\${JVM_CER_PATH} -storepass changeit\"\n      ```\n\n   You should see output similar to the following example:\n\n   ```output\n   {\n   \"value\": [\n     {\n       \"code\": \"ProvisioningState/succeeded\",\n       \"displayStatus\": \"Provisioning succeeded\",\n       \"level\": \"Info\",\n       \"message\": \"Enable succeeded: \\n[stdout]\\n\\n[stderr]\\nCertificate was added to keystore\\n\",\n       \"time\": null\n     }\n    ]\n   }\n   ```\n\n> [!NOTE]\n> If you customize the trust store, you must import the Entra Domain Service managed domain public CA into your trust keystore. There's no need to import the certificate to the WLS managed servers. For more information, see [Configuring WebLogic to use LDAP](https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/secmg/ldap_atn.html#GUID-A064C103-85EB-4A7B-ADAE-F01ACDC8E0B8).\n\n#### Configure WLS hostname verification\n\nBecause [Configure secure LDAP for a Microsoft Entra Domain Services managed domain](/entra/identity/domain-services/tutorial-configure-ldaps) uses a wildcard `*.aaddscontoso.com` for the hostname in the certificate, you must configure the WLS admin server with appropriate hostname verification. Use the following steps to disable the verification. For WLS 14 and above, you can select **Wildcard Hostname Verification** instead.\n\n1. Paste the value of **adminConsole** to your browser and log into the WLS admin console.\n1. In the **Change Center**, select **Lock & Edit**.\n1. Select **Environment** > **Servers** > **admin** > **SSL** > **Advanced**.\n1. Next to **Hostname Verification**, select **None**.\n1. Select **Save** and **Activate Changes** to save the configuration.\n\n#### Resolve traffic for secure LDAP access\n\nWith secure LDAP access enabled over the internet, you can update your DNS zone so that client computers can find this managed domain. The **Secure LDAP external IP address** value is listed on the **Properties** tab for your managed domain. For more information, see [Configure DNS zone for external access](/entra/identity/domain-services/tutorial-configure-ldaps#configure-dns-zone-for-external-access).\n\nIf you don't have a registered DNS zone, you can add an entry in the `adminVM` hosts file, to resolve traffic for `ldaps.<managed-domain-dns-name>` (here's `ldaps.aaddscontoso.com`) to the external IP address. Change the value with yours before running the following commands:\n\n```azurecli\nexport LDAPS_DNS=ldaps.aaddscontoso.com\nexport LDAPS_EXTERNAL_IP=<entra-domain-services-manged-domain-external-ip>\n\naz vm run-command invoke \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name ${ADMIN_VM_NAME} \\\n    --command-id RunShellScript \\\n    --scripts \"echo \\\"${LDAPS_EXTERNAL_IP} ${LDAPS_DNS}\\\" >> /etc/hosts\"\n```\n\nRun the following command to restart the admin server to load the configurations:\n\n```azurecli\naz vm run-command invoke \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name ${ADMIN_VM_NAME} \\\n    --command-id RunShellScript \\\n    --scripts \"systemctl stop wls_admin\"\n\naz vm run-command invoke \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name ${ADMIN_VM_NAME} \\\n    --command-id RunShellScript \\\n    --scripts \"systemctl start wls_admin\"\n```\n\n#### Create and configure the LDAP authentication provider\n\nWith the certificate imported and secure LDAP access traffic resolved, you can configure the LDAP provider from WLS console by using the following steps:\n\n1. Paste the **adminConsole** value into your browser address bar and sign in at the WLS admin console.\n1. Under **Change Center**, select **Lock & Edit**.\n1. Under **Domain Structure**, select **Security Realms** > **myrealm** > **Providers** > **New**, and use the following values to create a new authentication provider.\n\n   * For **Name**, fill in `AzureEntraIDLDAPProvider`.\n   * For **Type**, select `ActiveDirectoryAuthenticator`.\n\n1. Select **OK** to save the change.\n1. In the provider list, select **AzureEntraIDLDAPProvider**.\n1. For **Configuration** > **Common** > **Control Flag**, select **SUFFICIENT**.\n1. Select **Save** to save the change.\n1. For **Configuration** > **Provider Specific**, input the Microsoft Entra Domain Services managed domain connection information you obtained previously. Steps to obtain the value are listed in the table at [Configure secure LDAP for a Microsoft Entra Domain Services managed domain](#configure-secure-ldap-for-a-microsoft-entra-domain-services-managed-domain).\n1. Fill in the following required fields, keeping other fields with their default values:\n\n   | Item                                             | Value                                                            | Sample value                                       |\n   |--------------------------------------------------|------------------------------------------------------------------|----------------------------------------------------|\n   | **Host**                                         | Managed domain LDAP sever DNS, `ldaps.<managed-domain-dns-name>` | `ldaps.aaddscontoso.com`                           |\n   | **Port**                                         | `636`                                                            | `636`                                              |\n   | **Principal**                                    | Principal of your cloud only user                                | `CN=WLSTest,OU=AADDC Users,DC=aaddscontoso,DC=com` |\n   | **Credential**                                   | Credential of your cloud only user                               | -                                                  |\n   | **SSLEnabled**                                   | Selected                                                         | -                                                  |\n   | **User Base DN**                                 | Your user base distinguished name (DN)                           | `OU=AADDC Users,DC=aaddscontoso,DC=com`            |\n   | **User From Name Filter**                        | `(&(sAMAccountName=%u)(objectclass=user))`                       | `(&(sAMAccountName=%u)(objectclass=user))`         |\n   | **User Name Attribute**                          | `sAMAccountName`                                                 | `sAMAccountName`                                   |\n   | **User Object Class**                            | `user`                                                           | `user`                                             |\n   | **Group Base DN**                                | Your group base DN.                                              | `OU=AADDC Users,DC=aaddscontoso,DC=com`            |\n   | **Group Membership Searching**                   | `limit`                                                          | `limit`                                            |\n   | **Max Group Membership Search Level**            | `1`                                                              | `1`                                                |\n   | **Use Token Groups For Group Membership Lookup** | Selected                                                         | -                                                  |\n   | **Connection Pool Size**                         | `5`                                                              | `5`                                                |\n   | **Connect Timeout**                              | `120`                                                            | `120`                                              |\n   | **Connection Retry Limit**                       | `5`                                                              | `5`                                                |\n   | **Results Time Limit**                           | `300`                                                            | `300`                                              |\n   | **Keep Alive Enabled**                           | Selected                                                         | -                                                  |\n   | **Cache Enabled**                                | Selected                                                         | -                                                  |\n   | **Cache Size**                                   | `4000`                                                           | `4000`                                             |\n   | **Cache TTL**                                    | `300`                                                            | `300`                                              |\n\n1. Select **Save** to save the provider.\n1. Select **Performance** next to **Configuration**.\n1. Select **Enable Group Membership Lookup Hierarchy Caching**.\n1. Select **Enable SID To Group Lookup Caching**.\n1. Select **Save** to save the configuration.\n1. Select **Activate Changes** to invoke the changes.\n\n> [!NOTE]\n> Pay attention to the hostname of the LDAP server. It should be in the format `ldaps.<managed-domain-dns-name>`. In this example, the value is `ldaps.aaddscontoso.com`.\n>\n> If you encounter an error such as `[Security:090834]No LDAP connection could be established. ldap://dscontoso.com:636 Cannot contact LDAP server`, try restarting `adminVM` to resolve the issue.\n\nYou must restart the WLS admin server for the changes to take effect. Run the following command to restart the admin server:\n\n```azurecli\naz vm run-command invoke \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name ${ADMIN_VM_NAME} \\\n    --command-id RunShellScript \\\n    --scripts \"systemctl stop wls_admin\"\n\naz vm run-command invoke \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name ${ADMIN_VM_NAME} \\\n    --command-id RunShellScript \\\n    --scripts \"systemctl start wls_admin\"\n```\n\n> [!NOTE]\n> If you're authenticating an application in a cluster with users from Microsoft Entra ID, you must restart the managed server to activate the provider. You can do this by restarting the virtual machine hosting the server.\n\n### Validation\n\nAfter restarting admin server, use the following steps to verify that the integration was successful:\n\n1. Visit the WLS Admin console.\n1. In the navigation pane, expand the tree and select **Security Realms** > **myrealm** > **Providers**.\n1. If the integration was successful, you can find the Microsoft Entra ID provider - for example `AzureEntraIDLDAPProvider`.\n1. In the navigation pane, expand the tree and select **Security Realms** > **myrealm** > **Users and Groups**.\n1. If the integration was successful, you can find users from the Microsoft Entra ID provider.\n\n> [!NOTE]\n> It takes a few minutes to load users the first time you access **Users and Groups**. WLS caches the users and is faster on the next access.\n\n### Lock down and secure LDAP access over the internet\n\nWhile standing up the secure LDAP in the preceding steps, set the source as **Any** for the `AllowLDAPS` rule in the network security group. Now that the WLS Admin Server is deployed and connected to LDAP, obtain its public IP address using the Azure portal. Revisit [Lock down secure LDAP access over the internet](/entra/identity/domain-services/tutorial-configure-ldaps#lock-down-secure-ldap-access-over-the-internet) and change **Any** to the specific IP address of the WLS Admin server.\n\n## Clean up resources\n\nNow it's time to follow the steps in the [Clean up resources](/entra/identity/domain-services/tutorial-configure-ldaps#clean-up-resources) section of [Configure secure LDAP for a Microsoft Entra Domain Services managed domain](/entra/identity/domain-services/tutorial-configure-ldaps).\n\n## Next steps\n\nExplore other aspects of migrating WebLogic Server apps to Azure.\n\n> [!div class=\"nextstepaction\"]\n> [Migrate WebLogic Server applications to Azure Virtual Machines](migrate-weblogic-to-virtual-machines.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-websphere-to-azure-kubernetes-service.md",
    "content": "---\ntitle: Migrate WebSphere applications to Azure Kubernetes Service (AKS)\ndescription: This guide describes what you should be aware of when you want to migrate WebSphere applications to Azure Kubernetes Service (AKS).\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-extended-java, devx-track-java, devx-track-javaee, devx-track-javaee-liberty, devx-track-javaee-liberty-aks, devx-track-javaee-websphere, migration-java, template-how-to, linux-related-content\n#Customer intent: As a Java developer, I want to migrate my on-premise WebSphere Application Server workload to IBM WebSphere Liberty or Open Liberty that runs on Azure Kubernetes Service\n---\n\n# Migrate WebSphere applications to Azure Kubernetes Service (AKS)\n\nThis guide describes what you should be aware of when you want to migrate an existing WebSphere Application Server (WAS) workload to IBM WebSphere Liberty or Open Liberty on Azure Kubernetes Service (AKS).\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n[!INCLUDE [vm-aks-aro-tradeoffs-was-liberty](includes/vm-aks-aro-tradeoffs-was-liberty.md)]\n\n### Determine whether the prebuilt Azure Marketplace offer is a good starting point\n\nAfter you've decided that AKS is the appropriate deployment target, you must accept that the IBM WebSphere Liberty operator or Open Liberty Operator (the operator) is the only way to run Liberty on Kubernetes. After accepting this fact, you must decide whether or not the prebuilt [Azure Marketplace offer](https://ibm.biz/liberty-aks) is a good starting point. Here are some things to consider about the prebuilt Azure Marketplace offer:\n\n- IBM and Microsoft created this offer to allow you to quickly provision Liberty on AKS. This concept is explained in more detail in the following content.\n- At a high level, the offer automates the following steps for you.\n  - Take an existing application image, if desired.\n  - Provision an AKS cluster and an Azure Container Registry (ACR) instance, if desired.\n  - Install and configure the IBM WebSphere Liberty operator or Open Liberty operator on AKS.\n  - Use the operator to run the whole thing. The operator deploys and manages containerized Liberty applications in AKS. You can find the reference documentation at [IBM WebSphere Liberty operator](https://www.ibm.com/docs/was-liberty/core?topic=operator-getting-started-websphere-liberty) and [Open Liberty operator](https://github.com/OpenLiberty/open-liberty-operator).\n\nIf you don't use the prebuilt Azure Marketplace offer, you must learn how to use the operator directly. Mastering the operator is beyond the scope of this article. The complete documentation for the operator is available at [IBM WebSphere Liberty operator](https://www.ibm.com/docs/was-liberty/core?topic=operator-getting-started-websphere-liberty) and [Open Liberty operator](https://github.com/OpenLiberty/open-liberty-operator).\n\nNow that you've been introduced to the various ways to handle Liberty on AKS, you're better able to choose whether to use the prebuilt Azure Marketplace offer or to do it yourself using the operator directly.\n\n[!INCLUDE [determine-whether-the-liberty-version-is-compatible](includes/determine-whether-the-liberty-version-is-compatible.md)]\n\n[!INCLUDE [determine-whether-liberty-license-is-needed](includes/determine-whether-liberty-license-is-needed.md)]\n\n[!INCLUDE [inventory-difference-between-your-env-and-liberty](includes/inventory-difference-between-your-env-and-liberty.md)]\n\n[!INCLUDE [inventory-server-capacity-aks](includes/inventory-server-capacity-aks.md)]\n\n[!INCLUDE [inventory-all-secrets](includes/inventory-was-secrets.md)]\n\nAfter you have a solid inventory of secrets, consult the operator documentation regarding secrets. For more information, see the following articles:\n\n- [WebSphere Liberty on AKS: Configuring security for containerized applications](https://www.ibm.com/docs/was-liberty/base?topic=operator-configuring-security-containerized-applications)\n- [Open Liberty: user guide](https://github.com/OpenLiberty/open-liberty-operator/blob/main/doc/user-guide-v1.adoc)\n- [Security concepts for applications and clusters in Azure Kubernetes Service](/azure/aks/concepts-security)\n\n[!INCLUDE [inventory-all-certificates](includes/inventory-all-certificates.md)]\n\nAfter you have a solid inventory of certificates, configure them by using the following articles:\n\n- [Configuring single sign-on (SSO) for WebSphere Liberty operators](https://www.ibm.com/docs/was-liberty/core?topic=applications-configuring-sso-operators)\n- [Open Liberty: Certificates](https://openliberty.io/docs/latest/single-sign-on.html)\n- [Security concepts for applications and clusters in Azure Kubernetes Service](/azure/aks/concepts-security).\n\n[!INCLUDE [validate-that-the-supported-java-version-works-correctly-liberty](includes/validate-that-the-supported-java-version-works-correctly-liberty.md)]\n\n[!INCLUDE [inventory-was-jndi-resources](includes/inventory-was-jndi-resources.md)]\n\nIf you're using the prebuilt Azure Marketplace offer, the set of JNDI resources you can customize at deployment time is limited to what the offer supports. For WebSphere Liberty on AKS, you can make an object available in the default Java Naming and Directory Interface (JNDI) namespace. For more information, see [Developing with the JNDI default namespace in a Liberty feature](https://www.ibm.com/docs/was-liberty/core?topic=liberty-developing-jndi-default-namespace-in-feature). For Open Liberty, see [Java Naming and Directory Interface](https://openliberty.io/docs/latest/reference/feature/jndi-1.0.html).\n\n[!INCLUDE [inspect-your-profile-configuration](includes/inspect-your-profile-configuration-liberty.md)]\n\nYou need to capture these customizations in the container image that AKS runs. When you use the prebuilt Azure Marketplace offer, such customizations are best handled by creating a custom container image and making it available in a public registry, then pointing to that registry at deployment time.\n\nIf you're using a WebSphere Application Server Network Deployment cell, each cluster member runs in an installation of traditional WAS. Liberty is a lightweight profile of WebSphere Application Server. It's a flexible and dynamic profile of WAS, which enables the WAS server to deploy only required custom features instead of deploying a large set of available Java EE components.\n\n[!INCLUDE [determine-whether-session-replication-is-used](includes/determine-whether-session-replication-is-used-liberty.md)]\n\nThe prebuilt Azure Marketplace offer supports session affinity via the Application Gateway ingress controller. When deploying the offer, select **Enable cookie based affinity**.\n\n[!INCLUDE [document-datasources](includes/document-datasources-was.md)]\n\nJDBC configuration is a core server configuration in Liberty. For more information, see [JDBC Driver](https://www.ibm.com/docs/was-liberty/core?topic=configuration-jdbcdriver).\n\nThe prebuilt Azure Marketplace offer has limited support for databases. You can handle the configuration in the application images and use the image when you deploy the offer.\n\n[!INCLUDE [determine-whether-was-has-been-customized](includes/determine-whether-was-has-been-customized.md)]\n\nYou need to capture these customizations in the container image that AKS runs. When you use the prebuilt Azure Marketplace offer, such customizations are best handled by creating a custom container image and making it available in a public registry, then pointing to that registry at deployment time.\n\n[!INCLUDE [determine-whether-a-connection-to-on-premises-is-needed](includes/determine-whether-a-connection-to-on-premises-is-needed.md)]\n\n[!INCLUDE [determine-whether-jms-queues-or-topics-are-in-use-virtual-machines](includes/determine-whether-jms-queues-or-topics-are-in-use-virtual-machines-was.md)]\n\n[!INCLUDE [determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries](includes/determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries.md)]\n\nYou can handle these libraries using the same techniques as described in [Accessing third-party APIs from a Java EE application](https://www.ibm.com/docs/was-liberty/core?topic=cclljea-accessing-third-party-apis-from-java-ee-application).\n\n[!INCLUDE [determine-whether-osgi-bundles-are-used](includes/determine-whether-osgi-bundles-are-used-was.md)]\n\nYou can include the bundles in the image supplied to the prebuilt Azure Marketplace offer. For more information, see [Configuring libraries for OSGi applications](https://www.ibm.com/docs/was-liberty/core?topic=manually-configuring-libraries-osgi-applications).\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code.md)]\n\nLiberty on AKS runs on Linux x86_64. Any OS-specific code must be compatible with Linux. To learn how to discover specific OS information, follow the steps in the [Determine whether the Liberty version is compatible](#determine-whether-the-liberty-version-is-compatible) section.\n\n[!INCLUDE [determine-whether-ibm-integration-bus-is-in-use](includes/determine-whether-ibm-integration-bus-is-in-use.md)]\n\nIBM Integration Bus isn't directly supported in the prebuilt Azure Marketplace offer. To enable the feature, follow the instructions in [Enabling the JMS application on Liberty to connect to the service integration bus](https://www.ibm.com/docs/was-liberty/zos?topic=eiblwast-enabling-jms-application-liberty-connect-service-integration-bus) in the IBM documentation.\n\n[!INCLUDE [determine-whether-your-application-is-composed-of-multiple-wars](includes/determine-whether-your-application-is-composed-of-multiple-wars.md)]\n\n[!INCLUDE [determine-whether-your-application-is-packaged-as-an-ear](includes/determine-whether-your-application-is-packaged-as-an-ear-was.md)]\n\nThe prebuilt Azure Marketplace offer allows you to use an existing container image. You can prepare the application according to your business requirements.\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n### Determine whether and how the file system is used\n\nKubernetes deals with file systems with persistent volumes (PV). Mounting persistent volumes isn't supported in the prebuilt Azure Marketplace offer. To enable different storage options, follow the instructions at [Storage options for applications in Azure Kubernetes Service](/azure/aks/concepts-storage).\n\n[!INCLUDE [static-content](includes/static-content.md)]\n\n[!INCLUDE [determine-the-network-topology](includes/determine-the-network-topology-liberty.md)]\n\n[!INCLUDE [account-for-the-use-of-jca-adapters-and-resource-adapters](includes/account-for-the-use-of-jca-adapters-and-resource-adapters-liberty.md)]\n\n### Determine whether clustering is used\n\nThe operator handles clustering for all possible ways of running WAS workload on AKS.\n\n#### Inspect your EJB clustering\n\nIf your application is using local Enterprise Java Beans (EJB), you may need to migrate them to a clustered EJB. For more information, see [Developing EJB applications on Liberty](https://www.ibm.com/docs/was-liberty/base?topic=environment-developing-ejb-applications-liberty).\n\n### Account for load-balancing requirements\n\nThe best way to account for load balancing is to use the App Gateway integration provided by the built-in Azure Marketplace offer.\n\n## Migration\n\nThe steps in this section assume that your analysis has lead you to decide to use the prebuilt Azure Marketplace offer.\n\n### Provision the offer\n\nTo open the offer in the Azure portal, see [IBM WebSphere Liberty and Open Liberty on Azure Kubernetes Service](https://ibm.biz/liberty-aks). Select **Create**, then use the information you gathered in the preceding steps to help in filling out the fields of the offer.\n\n### Account for KeyStores\n\nYou must account for the migration of any SSL/TLS KeyStores used by your application. For more information, see [Configuring Keystores](https://www.ibm.com/docs/was-liberty/core?topic=liberty-enabling-ssl-communication-in).\n\n### Connect the JMS sources\n\nAfter you've connected the databases, you can configure JMS by following the instructions at [Overview of JCA configuration elements](https://www.ibm.com/docs/was-liberty/core?topic=resourceadapter-overview-jca-configuration-elements) in the IBM documentation.\n\n### Account for logging\n\nYou can't do cloud without mastering logging. The operator provides different approaches for monitoring. For more information, see [Monitoring the Liberty server runtime environment](https://www.ibm.com/docs/was-liberty/core?topic=monitoring-liberty-server-runtime-environment). If you prefer using Elastic Stack, Azure provides great support for Elastic. For complete details, see [What is Elastic integration with Azure?](/azure/partner-solutions/elastic/overview) You can combine the knowledge in these two resources to achieve an Azure-optimized logging solution for Liberty on AKS.\n\n### Migrate your applications\n\nWhether or not you chose to provide an application image at deployment time, you need to update the application via CI/CD. The IBM documentation has a sample that shows how to do this update. For more information, see [Deploying applications in Liberty](https://www.ibm.com/docs/was-liberty/core?topic=deploying-applications-in-liberty).\n\n### Configure tests\n\nYou must configure any in-container tests against applications to access the new servers running within Azure. As with the CI/CD concerns, you must ensure that the necessary network security rules allow your tests to access the applications deployed to Azure. For more information, see [Network security groups](/azure/virtual-network/security-overview).\n\n## Post-migration\n\nAfter you've reached the migration goals you defined in the [pre-migration](#pre-migration) step, perform some end-to-end acceptance testing to verify that everything works as expected. The following articles provide information on post-migration enhancements:\n\n- Dynamic scaling is a key value proposition to justify the complexity of using Kubernetes. To achieve a native Kubernetes optimized scaling solution, combine the knowledge in [Tutorial: Scale applications in Azure Kubernetes Service (AKS)](/azure/aks/tutorial-kubernetes-scale) with the IBM documentation section [Setting up auto scaling for Liberty collectives](https://www.ibm.com/docs/was-liberty/nd?topic=collectives-setting-up-auto-scaling-liberty).\n\n- If you deployed Liberty with Azure Application Gateway by following the steps in the offer, you may want to do more configuration on the Application Gateway. For more information, see [Application Gateway configuration overview](/azure/application-gateway/configuration-overview).\n\n- Enhance your network topology with advanced load balancing services. For more information, see [Using load-balancing services in Azure](/azure/traffic-manager/traffic-manager-load-balancing-azure).\n\n- Get Java-optimized application performance monitoring with Azure Monitor and Application Insights. For more information, see [Zero instrumentation application monitoring for Kubernetes - Azure Monitor Application Insights](/azure/azure-monitor/app/kubernetes-codeless).\n\n- Use Azure Storage to serve static content mounted to AKS. For more information, see [Storage options for applications in Azure Kubernetes Service (AKS)](/azure/aks/concepts-storage). Combine this knowledge with the IBM documentation [WebSphereLibertyApplication custom resource](https://www.ibm.com/docs/was-liberty/core?topic=resources-webspherelibertyapplication-custom-resource).\n\n- Deploy your applications to your migrated WAS cluster with Azure DevOps. For more information, see [Azure DevOps getting started documentation](/azure/devops/get-started).\n\n- Use Azure Managed Identities to managed secrets and assign role based access to Azure resources. For more information, see [What are managed identities for Azure resources?](/azure/active-directory/managed-identities-azure-resources/overview).\n\n- Integrate Liberty Java EE authentication and authorization with Microsoft Entra ID. For more information, see [Integrating Microsoft Entra getting started guide](/azure/active-directory/manage-apps/plan-an-application-integration).\n\n- Tune WebSphere Liberty or Open Liberty to achieve better performance. For more information, see [Tuning Liberty](https://www.ibm.com/docs/was-liberty/base?topic=tuning-liberty).\n"
  },
  {
    "path": "articles/java/migration/migrate-websphere-to-azure-redhat-openshift.md",
    "content": "---\ntitle: Migrate WebSphere applications to Azure Red Hat OpenShift\ndescription: This guide describes what you should be aware of when you want to migrate WebSphere applications to Azure Red Hat OpenShift.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-extended-java, devx-track-java, devx-track-javaee, devx-track-javaee-liberty, devx-track-javaee-liberty-aro, devx-track-javaee-websphere, migration-java, template-how-to, linux-related-content\n#Customer intent: As a Java developer, I want to migrate my on-premise WebSphere Application Server workload to IBM WebSphere Liberty or Open Liberty that runs on Azure Red Hat OpenShift\n---\n\n# Migrate WebSphere applications to Azure Red Hat OpenShift\n\nThis guide describes what you should be aware of when you want to migrate an existing WebSphere Application Server (WAS) workload to IBM WebSphere Liberty or Open Liberty that runs on Azure Red Hat OpenShift.\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n[!INCLUDE [vm-aks-aro-tradeoffs-was-liberty](includes/vm-aks-aro-tradeoffs-was-liberty.md)]\n\n### Determine whether the prebuilt Azure Marketplace offer is a good starting point\n\nAfter you've decided that Azure Red Hat OpenShift is the appropriate deployment target, you must accept that the IBM WebSphere Liberty operator or Open Liberty Operator (the operator) is the only way to run Liberty on Kubernetes. After accepting this fact, you must decide whether or not the prebuilt [Azure Marketplace offer](https://aka.ms/liberty-aro) is a good starting point. Here are some things to consider about the prebuilt Azure Marketplace offer:\n\n- IBM and Microsoft created this offer to allow you to quickly provision Liberty on Azure Red Hat OpenShift. This concept is explained in more detail in the following content.\n- At a high level, the offer automates the following steps for you.\n  - Take an existing application image, if desired.\n  - Provision an Azure Red Hat OpenShift cluster, if desired.\n  - Install and configure the IBM WebSphere Liberty operator or Open Liberty operator on Azure Red Hat OpenShift.\n  - Use the operator to run the whole thing. The operator deploys and manages containerized Liberty applications in Azure Red Hat OpenShift. You can find the reference documentation at [IBM WebSphere Liberty operator](https://www.ibm.com/docs/was-liberty/core?topic=operator-getting-started-websphere-liberty) and [Open Liberty operator](https://github.com/OpenLiberty/open-liberty-operator).\n\nIf you don't use the prebuilt Azure Marketplace offer, you must learn how to use the operator directly. Mastering the operator is beyond the scope of this article. The complete documentation for the operator is available at [IBM WebSphere Liberty operator](https://www.ibm.com/docs/was-liberty/core?topic=operator-getting-started-websphere-liberty) and [Open Liberty operator](https://github.com/OpenLiberty/open-liberty-operator).\n\nNow that you've been introduced to the various ways to handle Liberty on Azure Red Hat OpenShift, you're better able to choose whether to use the prebuilt Azure Marketplace offer or to do it yourself using the operator directly.\n\n[!INCLUDE [determine-whether-the-liberty-version-is-compatible](includes/determine-whether-the-liberty-version-is-compatible.md)]\n\n[!INCLUDE [determine-whether-liberty-license-is-needed](includes/determine-whether-liberty-license-is-needed.md)]\n\n[!INCLUDE [inventory-difference-between-your-env-and-liberty](includes/inventory-difference-between-your-env-and-liberty.md)]\n\n[!INCLUDE [inventory-server-capacity-aro](includes/inventory-server-capacity-aro-liberty.md)]\n\n[!INCLUDE [inventory-all-secrets](includes/inventory-was-secrets.md)]\n\nAfter you have a solid inventory of secrets, consult the operator documentation regarding secrets. For more information, see the following articles:\n\n- [WebSphere Liberty: Configuring security for containerized applications](https://www.ibm.com/docs/was-liberty/base?topic=operator-configuring-security-containerized-applications)\n- [Open Liberty: user guide](https://github.com/OpenLiberty/open-liberty-operator/blob/main/doc/user-guide-v1.adoc)\n- [Providing sensitive data to pods in OpenShift Container Platform](https://docs.openshift.com/container-platform/4.13/nodes/pods/nodes-pods-secrets.html)\n- [Use Azure Key Vault Provider for Secrets Store CSI Driver on Azure Red Hat OpenShift](/azure/openshift/howto-use-key-vault-secrets)\n\n[!INCLUDE [inventory-all-certificates](includes/inventory-all-certificates.md)]\n\nAfter you have a solid inventory of certificates, configure them by using the following articles:\n\n- [Configuring single sign-on (SSO) for WebSphere Liberty operators](https://www.ibm.com/docs/was-liberty/core?topic=applications-configuring-sso-operators)\n- [Open Liberty: Certificates](https://openliberty.io/docs/latest/single-sign-on.html)\n- [OpenShift Container Platform security and compliance](https://docs.openshift.com/container-platform/4.13/security/index.html).\n\n[!INCLUDE [validate-that-the-supported-java-version-works-correctly-liberty](includes/validate-that-the-supported-java-version-works-correctly-liberty.md)]\n\n[!INCLUDE [inventory-was-jndi-resources](includes/inventory-was-jndi-resources.md)]\n\nIf you're using the prebuilt Azure Marketplace offer, the set of JNDI resources you can customize at deployment time is limited to what the offer supports. For WebSphere Liberty on Azure Kubernetes Service (AKS), you can make an object available in the default Java Naming and Directory Interface (JNDI) namespace. For more information, see [Developing with the JNDI default namespace in a Liberty feature](https://www.ibm.com/docs/was-liberty/core?topic=liberty-developing-jndi-default-namespace-in-feature). For Open Liberty, see [Java Naming and Directory Interface](https://openliberty.io/docs/latest/reference/feature/jndi-1.0.html).\n\n[!INCLUDE [inspect-your-profile-configuration](includes/inspect-your-profile-configuration-liberty.md)]\n\nYou need to capture these customizations in the container image that Azure Red Hat OpenShift runs. When you use the prebuilt Azure Marketplace offer, such customizations are best handled by creating a custom container image and making it available in a public registry, then pointing to that registry at deployment time.\n\nIf you're using a WebSphere Application Server Network Deployment cell, each cluster member runs in an installation of traditional WAS. Liberty is lightweight profile of WebSphere Application Server. It's a flexible and dynamic profile of WAS, which enables the WAS server to deploy only required custom features instead of deploying a large set of available JEE components.\n\n[!INCLUDE [determine-whether-session-replication-is-used](includes/determine-whether-session-replication-is-used-liberty.md)]\n\n[!INCLUDE [document-datasources](includes/document-datasources-was.md)]\n\nJDBC configuration is a core server configuration in Liberty. For more information, see [JDBC Driver](https://www.ibm.com/docs/was-liberty/core?topic=configuration-jdbcdriver).\n\nThe prebuilt Azure Marketplace offer has limited support for databases. You can handle the configuration in the application images and use the image when you deploy the offer.\n\n[!INCLUDE [determine-whether-was-has-been-customized](includes/determine-whether-was-has-been-customized.md)]\n\nYou need to capture these customizations in the container image that Azure Red Hat OpenShift runs. When you use the prebuilt Azure Marketplace offer, such customizations are best handled by creating a custom container image and making it available in a public registry, then pointing to that registry at deployment time.\n\n[!INCLUDE [determine-whether-a-connection-to-on-premises-is-needed](includes/determine-whether-a-connection-to-on-premises-is-needed.md)]\n\n[!INCLUDE [determine-whether-jms-queues-or-topics-are-in-use-virtual-machines](includes/determine-whether-jms-queues-or-topics-are-in-use-virtual-machines-was.md)]\n\n[!INCLUDE [determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries](includes/determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries.md)]\n\nYou can handle these libraries using the same techniques as described in [Accessing third-party APIs from a Java EE application](https://www.ibm.com/docs/was-liberty/core?topic=cclljea-accessing-third-party-apis-from-java-ee-application).\n\n[!INCLUDE [determine-whether-osgi-bundles-are-used](includes/determine-whether-osgi-bundles-are-used-was.md)]\n\nYou can include the bundles in the image supplied to the prebuilt Azure Marketplace offer. For more information, see [Configuring libraries for OSGi applications](https://www.ibm.com/docs/was-liberty/core?topic=manually-configuring-libraries-osgi-applications).\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code.md)]\n\nLiberty on Azure Red Hat OpenShift runs on Linux x86_64. Any OS-specific code must be compatible with Linux. To learn how to discover specific OS information, follow the steps in the [Determine whether the Liberty version is compatible](#determine-whether-the-liberty-version-is-compatible) section.\n\n[!INCLUDE [determine-whether-ibm-integration-bus-is-in-use](includes/determine-whether-ibm-integration-bus-is-in-use.md)]\n\nIBM Integration Bus isn't directly supported in the prebuilt Azure Marketplace offer. To enable the feature, follow the instructions in [Enabling the JMS application on Liberty to connect to the service integration bus](https://www.ibm.com/docs/was-liberty/zos?topic=eiblwast-enabling-jms-application-liberty-connect-service-integration-bus) in the IBM documentation.\n\n[!INCLUDE [determine-whether-your-application-is-composed-of-multiple-wars](includes/determine-whether-your-application-is-composed-of-multiple-wars.md)]\n\n[!INCLUDE [determine-whether-your-application-is-packaged-as-an-ear](includes/determine-whether-your-application-is-packaged-as-an-ear-was.md)]\n\nThe prebuilt Azure Marketplace offer allows you to use an existing container image. You can prepare the application according to your business requirements.\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n### Determine whether and how the file system is used\n\nKubernetes deals with file systems with persistent volumes (PV). Mounting persistent volumes isn't supported in the prebuilt Azure Marketplace offer. To create an Azure Files StorageClass, follow the instructions at [Create an Azure Files StorageClass on Azure Red Hat OpenShift 4](/azure/openshift/howto-create-a-storageclass).\n\n[!INCLUDE [static-content](includes/static-content.md)]\n\n[!INCLUDE [determine-the-network-topology](includes/determine-the-network-topology-liberty.md)]\n\n[!INCLUDE [account-for-the-use-of-jca-adapters-and-resource-adapters](includes/account-for-the-use-of-jca-adapters-and-resource-adapters-liberty.md)]\n\n### Determine whether clustering is used\n\nThe operator handles clustering for all possible ways of running a WAS workload on Azure Red Hat OpenShift.\n\n#### Inspect your EJB clustering\n\nIf your application is using local Enterprise Java Beans (EJB), you may need to migrate them to a clustered EJB. For more information, see [Developing EJB applications on Liberty](https://www.ibm.com/docs/was-liberty/base?topic=environment-developing-ejb-applications-liberty).\n\n### Account for load-balancing requirements\n\nThe prebuilt Azure Marketplace offer uses an OpenShift built-in route to host the application at a public URL and account for load balancing. For more information, see [OpenShift Route configuration](https://docs.openshift.com/container-platform/4.13/networking/routes/route-configuration.html).\n\n## Migration\n\nThe steps in this section assume that your analysis has lead you to decide to use the prebuilt Azure Marketplace offer.\n\n### Provision the offer\n\nTo open the offer in the Azure portal, see [IBM WebSphere Liberty and Open Liberty on Azure Red Hat OpenShift](https://aka.ms/liberty-aro). Select **Create**, then use the information you gathered in the preceding steps to help in filling out the fields of the offer.\n\n### Account for KeyStores\n\nYou must account for the migration of any SSL/TLS KeyStores used by your application. For more information, see [Configuring Keystores](https://www.ibm.com/docs/was-liberty/core?topic=liberty-enabling-ssl-communication-in).\n\n### Connect the JMS sources\n\nAfter you've connected the databases, you can configure JMS by following the instructions at [Overview of JCA configuration elements](https://www.ibm.com/docs/was-liberty/core?topic=resourceadapter-overview-jca-configuration-elements) in the IBM documentation.\n\n### Account for logging\n\nYou can't do cloud without mastering logging. The operator provides different approaches for monitoring. For more information, see [Monitoring the Liberty server runtime environment](https://www.ibm.com/docs/was-liberty/core?topic=monitoring-liberty-server-runtime-environment). It's helpful to master logging and monitoring system in Red Hat OpenShift. For more information, see [Understanding the logging subsystem for Red Hat OpenShift](https://docs.openshift.com/container-platform/4.13/observability/logging/cluster-logging.html) and [About OpenShift Container Platform monitoring](https://docs.openshift.com/container-platform/4.13/observability/monitoring/monitoring-overview.html). You can configure Azure Monitor container insights for Azure Red Hat OpenShift. For more information, see [Configure Azure Monitor container insights for Azure Red Hat OpenShift](/azure/azure-monitor/containers/container-insights-enable-arc-enabled-clusters). If you prefer using Elastic Stack, Azure provides great support for Elastic. For complete details, see [What is Elastic integration with Azure?](/azure/partner-solutions/elastic/overview) You can combine the knowledge in these resources to achieve an Azure-optimized logging solution for Liberty on Azure Red Hat OpenShift.\n\n### Migrate your applications\n\nWhether or not you chose to provide an application image at deployment time, you need to update the application via CI/CD. The OpenShift documentation has samples that show how to do this update. For more information, see [OpenShift Container Platform CI/CD overview](https://docs.openshift.com/container-platform/4.17/cicd/overview/index.html).\n\n### Configure tests\n\nYou must configure any in-container tests against applications to access the new servers running within Azure. As with the CI/CD concerns, you must ensure that the necessary network security rules allow your tests to access the applications deployed to Azure. For more information, see [Network security groups](/azure/virtual-network/security-overview).\n\n## Post-migration\n\nAfter you've reached the migration goals you defined in the [pre-migration](#pre-migration) step, perform some end-to-end acceptance testing to verify that everything works as expected. The following articles provide information on post-migration enhancements:\n\n- Dynamic scaling is a key value proposition to justify the complexity of using Kubernetes. To achieve a native Kubernetes optimized scaling solution, follow the OpenShift documentation [Recommended performance and scalability practices](https://docs.redhat.com/en/documentation/openshift_container_platform/4.13/html/scalability_and_performance/recommended-performance-and-scalability-practices-2).\n\n- Enhance your network topology with advanced load balancing services. For more information, see [Using load-balancing services in Azure](/azure/traffic-manager/traffic-manager-load-balancing-azure).\n\n- Get Java-optimized application performance monitoring with Azure Monitor and Application Insights. For more information, see [Azure Monitor container insights for Azure Red Hat OpenShift](/azure/azure-monitor/containers/container-insights-enable-arc-enabled-clusters).\n\n- Use Azure Storage to serve static content mounted to Azure Red Hat OpenShift. For more information, see [Create an Azure Files StorageClass on Azure Red Hat OpenShift 4](/azure/openshift/howto-create-a-storageclass). Combine this knowledge with the OpenShift documentation [OpenShift Container Platform storage overview](https://docs.openshift.com/container-platform/4.13/storage/index.html).\n\n- Deploy your applications to your migrated WAS cluster with Azure DevOps. For more information, see [Azure DevOps getting started documentation](/azure/devops/get-started).\n\n- Use Azure Service Principal to managed secrets and assign role based access to Azure resources. For more information, see [Create and use a service principal to deploy an Azure Red Hat OpenShift cluster](/azure/openshift/howto-create-service-principal?pivots=aro-azurecli).\n\n- Integrate Liberty Java EE authentication and authorization with Microsoft Entra ID. For more information, see [Integrating Microsoft Entra getting started guide](/azure/active-directory/manage-apps/plan-an-application-integration).\n\n- Tune WebSphere Liberty or Open Liberty to achieve better performance. For more information, see [Tuning Liberty](https://www.ibm.com/docs/was-liberty/base?topic=tuning-liberty).\n\n- Use Velero to back up and restore the cluster. For more information, see [Create an Azure Red Hat OpenShift 4 cluster Application Backup](/azure/openshift/howto-create-a-backup).\n"
  },
  {
    "path": "articles/java/migration/migrate-websphere-to-azure-vm-manually.md",
    "content": "---\ntitle: \"Tutorial: Manually install WebSphere Application Server Network Deployment (traditional) on Azure Virtual Machines (VMs)\"\ndescription: Get step-by-step guidance to install IBM WebSphere Application Server on Azure VMs, set up a cluster, and expose the cluster with Azure Application Gateway.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.topic: how-to\nms.date: 01/13/2026\nms.custom:\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-was-vm\n  - devx-track-javaee-was\n  - devx-track-javaee-websphere\n  - migration-java\n  - linux-related-content\n  - sfi-image-nochange\n---\n\n# Tutorial: Manually install WebSphere Application Server Network Deployment (traditional) on Azure Virtual Machines (VMs)\n\nThis tutorial shows you how to install IBM WebSphere Application Server (WAS) Network Deployment (ND) traditional and configure a WAS cluster on Azure Virtual Machines (VMs) on GNU/Linux.\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> - Create a custom virtual network and create the VMs within the network.\n> - Manually install WebSphere Application Server Network Deployment traditional (V9 or V8.5) on the VMs by using the graphical interface.\n> - Configure a WAS cluster by using the Profile Management Tool.\n> - Deploy and run a Java Platform Enterprise Edition (Java EE) application in the cluster.\n> - Expose the application to the public internet via Azure Application Gateway.\n> - Validate the successful configuration.\n\nIf you prefer a fully automated solution that does all of these steps on your behalf on GNU/Linux VMs, directly from the Azure portal, see [Quickstart: Deploy WebSphere Application Server Network Deployment Cluster on Azure Virtual Machines](../ee/traditional-websphere-application-server-virtual-machines.md). A less automated, but still accelerated, option is to skip the steps of installing Java Development Kit (JDK) and WebSphere on the operating system by using a pre-configured Red Hat Linux base image. You can find these offers in Azure Marketplace by using a [query for WebSphere Application Server image 9.0.5.x](https://aka.ms/was-vm-base-images).\n\nIf you're interested in working closely on your migration scenario with the engineering team developing WebSphere on Azure solutions, fill out this short [survey on WebSphere migration](https://aka.ms/websphere-on-azure-survey) and include your contact information. The team of program managers, architects, and engineers will promptly get in touch with you to initiate close collaboration.\n\n## Prerequisites\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n- [Install Azure CLI version 2.46.0 or later](/cli/azure/install-azure-cli) to run Azure CLI commands.\n  - This article provides instructions for invoking Azure CLI commands on Windows PowerShell or UNIX Bash. Either way, you must install the Azure CLI.\n  - When you're prompted, install Azure CLI extensions on first use. For more information about extensions, see [Use and manage extensions with the Azure CLI](/cli/azure/azure-cli-extensions-overview).\n  - Run [az version](/cli/azure/reference-index?#az-version) to find the version and dependent libraries that are installed. To upgrade to the latest version, run [az upgrade](/cli/azure/reference-index?#az-upgrade).\n- You must have an IBMid. If you don't have one, create an IBM account at [Log in to IBM](https://myibm.ibm.com/dashboard/) and select **Create an IBMid**. Make note of your IBMid password and email.\n  - If you plan to use version 8.5.5 of IBM WebSphere Application Server Network Deployment, this IBMid must be entitled to use that version of the software. To learn about entitlements, ask the primary or secondary contacts for your IBM Passport Advantage site to grant you access, or follow the steps at [IBM eCustomer Care](https://ibm.biz/IBMidEntitlement).\n\n## Prepare the environment\n\nIn this section, you set up the infrastructure within which you install IBM Installation Manager and WebSphere Application Server Network Deployment traditional.\n\n### Assumptions\n\nThis tutorial configures a WAS cluster with a deployment manager and two managed servers on a total of three VMs. To configure the cluster, you must create the following three Azure VMs within the same availability set:\n\n- The admin VM (VM name `adminVM`) has the deployment manager running.\n- The managed VMs (VM names `mspVM1` and `mspVM2`) have two managed servers running.\n\n[!INCLUDE [sign-in-to-azure](includes/sign-in-to-azure.md)]\n\n### Create a resource group\n\nCreate a resource group by using [az group create](/cli/azure/group#az-group-create). Resource group names must be globally unique within a subscription. For this reason, consider prepending a unique identifier to any names you create that must be unique. A useful technique is to use your initials, followed by today's date in `mmdd` format. This example creates a resource group named `abc1110rg` in the `eastus` location:\n\n### [Bash](#tab/in-bash)\n\n```bash\nexport RESOURCE_GROUP_NAME=abc1110rg\naz group create --name $RESOURCE_GROUP_NAME --location eastus\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```powershell\n$Env:RESOURCE_GROUP_NAME = \"abc1110rg\"\naz group create `\n    --name $Env:RESOURCE_GROUP_NAME `\n    --location eastus\n```\n\n---\n\n### Create a virtual network\n\n> [!NOTE]\n> By default, the Azure CLI commands in this section follow the Bash style unless otherwise specified.\n>\n> If you run these commands in PowerShell, be sure to declare environment parameters as indicated in the earlier commands.\n>\n> To break a command line into multiple lines in PowerShell, you can use the backtick character (`) at the end of each line.\n\nThe resources that compose your WebSphere Application Server cluster must communicate with each other, and with the public internet, by using a virtual network. For a complete guide to planning your virtual network, see the Cloud Adoption Framework for Azure guide [Plan virtual networks](/azure/virtual-network/virtual-network-vnet-plan-design-arm). For more information, see [Azure Virtual Network frequently asked questions](/azure/virtual-network/virtual-networks-faq).\n\nUse the following steps to create the virtual network. The example in this section creates a virtual network with address space `192.168.0.0/16` and creates a subnet for VMs.\n\n1. Create a virtual network by using [az network vnet create](/cli/azure/network/vnet#az-network-vnet-create). The following example creates a network named `myVNet`:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az network vnet create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name myVNet \\\n       --address-prefixes 192.168.0.0/24\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az network vnet create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name myVNet `\n       --address-prefixes 192.168.0.0/24\n   ```\n\n1. Create a subnet for the WAS cluster by using [az network vnet subnet create](/cli/azure/network/vnet/subnet#az-network-vnet-subnet-create). The following example creates a subnet named `mySubnet`:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az network vnet subnet create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mySubnet \\\n       --vnet-name myVNet \\\n       --address-prefixes 192.168.0.0/25\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az network vnet subnet create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mySubnet `\n       --vnet-name myVNet `\n       --address-prefixes 192.168.0.0/25\n   ```\n\n1. Create a subnet for Application Gateway by using [az network vnet subnet create](/cli/azure/network/vnet/subnet#az-network-vnet-subnet-create). The following example creates a subnet named `wasGateway`:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az network vnet subnet create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name wasGateway \\\n       --vnet-name myVNet \\\n       --address-prefixes 192.168.0.128/25\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az network vnet subnet create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name wasGateway `\n       --vnet-name myVNet `\n       --address-prefixes 192.168.0.128/25\n   ```\n\n[!INCLUDE [create-an-availability-set](includes/create-an-availability-set.md)]\n\n## Get or install WAS on GNU/Linux\n\nThe following sections describe the steps for getting or installing WAS on GNU/Linux. You can choose the operating system and WAS version according to your requirements, but you should verify that they're available in the [IBM WebSphere Application Server Network Deployment documentation](https://www.ibm.com/docs/en/was-nd).\n\n### [WAS ND V9](#tab/was-nd-v9)\n\nIf you want to use WAS V9, the instructions use an Azure VM image that contains the latest supported version of the software. IBM and Microsoft maintain the image. For the full list of WAS base images that IBM and Microsoft maintain, see [Azure Marketplace](https://aka.ms/was-vm-base-images).\n\nIBM and Microsoft maintain a VM base image that has WAS V9 preinstalled on the recommended version of Red Hat Enterprise Linux. For more information about this image, see [the Azure portal](https://aka.ms/twas-base-vm-portal). If you take this approach, the Azure Marketplace image that you use to create the VMs is `ibm-usa-ny-armonk-hq-6275750-ibmcloud-aiops:2021-04-27-twas-cluster-base-image:2021-04-27-twas-cluster-base-image:latest`. Use the following command to save the image name in an environment variable:\n\n```azurecli\nexport VM_URN=\"ibm-usa-ny-armonk-hq-6275750-ibmcloud-aiops:2023-03-27-twas-cluster-base-image:2023-03-27-twas-cluster-base-image:latest\"\n```\n\n```powershell\n$Env:VM_URN=\"ibm-usa-ny-armonk-hq-6275750-ibmcloud-aiops:2023-03-27-twas-cluster-base-image:2023-03-27-twas-cluster-base-image:latest\"\n```\n\n### [WAS ND V85](#tab/was-nd-v85)\n\nIf you want to use WAS V8.5, the instructions start with a base Red Hat Enterprise Linux VM and walk you through the steps of installing all of the necessary dependencies.\n\nThe Azure Marketplace image that you use to create the VMs is `RedHat:rhel-raw:86-gen2:latest`. Use the following command to save the image name in an environment variable.\n\n> [!NOTE]\n> You can query all the available Red Hat Enterprise Linux images provided by Red Hat by using [az vm image list](/cli/azure/vm/image#az-vm-image-list), as shown in the following example:\n>\n> ```azurecli\n> az vm image list \\\n>     --offer RHEL \\\n>     --publisher RedHat \\\n>     --output table \\\n>     --all\n> ```\n>\n> For more information, see [Overview of Red Hat Enterprise Linux images](/azure/virtual-machines/workloads/redhat/redhat-images).\n>\n> If you use a different image, you might need to install extra libraries to enable the infrastructure that this guide uses.\n\n```azurecli\nexport VM_URN=\"RedHat:rhel-raw:86-gen2:latest\"\n```\n\n```powershell\n$Env:VM_URN=\"RedHat:rhel-raw:86-gen2:latest\"\n```\n\n---\n\n### Create a Red Hat Enterprise Linux machine\n\nUse the following steps to create a basic VM, ensure the installation of required tools, take a snapshot of its disk, and create replicas based on that snapshot:\n\n1. Create a VM by using [az vm create](/cli/azure/vm). You run the deployment manager on this VM.\n\n   The following example creates a Red Hat Enterprise Linux machine by using a username/password pair for the authentication. You can choose to use TLS/SSL authentication instead, which is more secure.\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az vm create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name adminVM \\\n       --availability-set myAvailabilitySet \\\n       --image $VM_URN \\\n       --size Standard_DS1_v2  \\\n       --admin-username azureuser \\\n       --admin-password Secret123456 \\\n       --public-ip-address \"\" \\\n       --nsg \"\"\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   # For `public-ip-address` and `nsg`, be sure to wrap the value \"\" in '' in PowerShell.\n   az vm create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name adminVM `\n       --availability-set myAvailabilitySet `\n       --image $Env:VM_URN `\n       --size Standard_DS1_v2 `\n       --admin-username azureuser `\n       --admin-password Secret123456 `\n       --public-ip-address '\"\"' `\n       --nsg '\"\"'\n   ```\n\n1. Create and attach a new disk for WAS files by using the following command:\n\n   ### [WAS ND V9](#tab/was-nd-v9)\n\n   This step is already performed for you when you use the VM base image.\n\n   ### [WAS ND V85](#tab/was-nd-v85)\n\n   ```bash\n   az vm disk attach \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --vm-name adminVM \\\n       --name adminVM_Data_Disk_1 \\\n       --new \\\n       --size-gb 100 \\\n       --sku StandardSSD_LRS\n   ```\n\n   ```powershell\n   az vm disk attach `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --vm-name adminVM `\n       --name adminVM_Data_Disk_1 `\n       --new `\n       --size-gb 100 `\n       --sku StandardSSD_LRS\n   ```\n\n### Create a Windows VM and set up an X server\n\nThis tutorial uses the graphical interface of WAS to complete the installation and configuration. You use a Windows VM as a *jump box* and run an [X Window System server](https://sourceforge.net/projects/vcxsrv/) to view the graphical installers on the three VMs of the WAS cluster.\n\nUse the following steps to provision a Windows 10 machine and install an X server. If you already have a Windows machine within the same network as the Red Hat Enterprise Linux machine, you don't need to provision a new one from Azure. You can go directly to the section that installs the X server.\n\n[!INCLUDE [create-windows-vm-and-set-up-xserver](includes/create-windows-vm-and-set-up-xserver.md)]\n\nYou're now ready to connect to the Red Hat Enterprise Linux machine and install the required tools by using the graphical interface. The following sections guide you to install IBM Installation Manager and WebSphere Application Server Network Deployment traditional. You use `myWindowsVM` for the installation and configuration.\n\n### Install dependencies\n\nUse the following steps to install the required dependencies to allow the connection from the X server and enable graphical installation:\n\n1. Use the following steps to get the private IP address of `adminVM`:\n\n   1. In the Azure portal, select the resource group you created before.\n   1. In the list of resources, select `adminVM`.\n   1. On the overview pane, select **Properties**.\n   1. In the **Networking** section, copy the value of **Private IP address**. In this example, the value is `192.168.0.4`.\n\n1. Open a command prompt from `myWindowsVM`, and then connect to `adminVM` by using `ssh`, as shown in the following example:\n\n   ```cmd\n   set ADMINVM_IP=\"192.168.0.4\"\n   ssh azureuser@%ADMINVM_IP%\n   ```\n\n1. Enter the password **Secret123456**.\n\n1. Use the following command to switch to the `root` user. This tutorial installs all the tools with the `root` user.\n\n   ```bash\n   sudo su -\n   ```\n\n1. Use the following commands to install dependencies:\n\n   ```bash\n   # dependencies for X server access\n   yum install -y libXtst libSM libXrender\n\n   # dependencies for GUI installation\n   yum install -y gtk2 libXtst xorg-x11-fonts-Type1 mesa-libGL\n   ```\n\nLater, you continue to mount the data disk on `adminVM`, so keep this terminal open.\n\n### Mount the data disk\n\n### [WAS ND V9](#tab/was-nd-v9)\n\nThis step is already performed for you when you use the VM base image.\n\n### [WAS ND V85](#tab/was-nd-v85)\n\nYou store all the installation files and configurations to the data disk. Use the following steps to mount the disk. Run the commands as the `root` user. If you aren't working with `root`, run `sudo su -` to switch users.\n\n1. Use the following command to check for the last-created disk device that you format for holding WAS files:\n\n   ```bash\n   ls -alt /dev/sd*|head -1\n   ```\n\n   The output is similar to the following example:\n\n   ```output\n   brw-rw----. 1 root disk 8, 32 Jan 28 09:04 /dev/sdc\n   ```\n\n1. Use the following steps to format the device. As the `root` user, run `parted` on the device.\n\n   1. Use the following command to create a primary partition that spans the whole disk:\n\n      ```bash\n      parted /dev/sdc --script mklabel gpt mkpart xfspart xfs 0% 100%\n      ```\n\n   1. Use the following command to check the device details by printing its metadata:\n\n      ```bash\n      parted /dev/sdc print\n      ```\n\n      The output should look similar to the following example:\n\n      ```output\n      Model: Msft Virtual Disk (scsi)\n      Disk /dev/sdc: 107GB\n      Sector size (logical/physical): 512B/4096B\n      Partition Table: gpt\n      Disk Flags:\n\n      Number  Start   End    Size   File system  Name     Flags\n      1      1049kB  107GB  107GB               xfspart\n      ```\n\n1. Use the following commands to create a file system on the device partition:\n\n   ```bash\n   mkfs.xfs /dev/sdc1\n   partprobe /dev/sdc1\n   ```\n\n1. Use the following command to create a mount point:\n\n   ```bash\n   mkdir /datadrive\n   ```\n\n1. Use the following command to mount the disk:\n\n   ```bash\n   mount /dev/sdc1 /datadrive\n   ```\n\n1. Use the following command to add the mount to the **/etc/fstab** file:\n\n   ```bash\n   echo \"UUID=$(blkid | grep -Po \"(?<=\\/dev\\/sdc1\\: UUID=\\\")[^\\\"]*(?=\\\".*)\")   /datadrive   xfs   defaults,nofail   1   2\" >> /etc/fstab\n   ```\n\n1. Use the following commands to create directories for installation files and configuration files:\n\n   ```bash\n   export IM_INSTALL_DIRECTORY=/datadrive/IBM/InstallationManager/V1.9\n   export WAS_ND_INSTALL_DIRECTORY=/datadrive/IBM/WebSphere/ND/V85\n   export IM_SHARED_DIRECTORY=/datadrive/IBM/IMShared\n   mkdir -p ${IM_INSTALL_DIRECTORY}\n   mkdir -p ${WAS_ND_INSTALL_DIRECTORY}\n   mkdir -p ${IM_SHARED_DIRECTORY}\n   ```\n\nLater, you continue to install IBM Installation Manager on `adminVM`, so keep this terminal open.\n\n### Download and install IBM Installation Manager\n\nUse the following steps to download and install IBM Installation Manager by using the X server on `myWindowsVM`:\n\n1. Download IBM Installation Manager by using the `curl` command, as shown in the following example. Save the installer file to **/datadrive/tmp**, and then unzip the file to **/datadrive/installer**.\n\n   ```bash\n   yum install -y unzip\n   mkdir /datadrive/tmp\n   cd /datadrive/tmp\n   curl -LO https://public.dhe.ibm.com/ibmdl/export/pub/software/im/zips/agent.installer.linux.gtk.x86_64.zip\n   unzip -o agent.installer.linux.gtk.x86_64.zip -d /datadrive/installer\n   ```\n\n1. Before you open the installer, set the `DISPLAY` variable, as shown in the following example. This variable allows the graphical installer to run on the Red Hat Linux VM but appear on `myWindowsVM`. The value of the `DISPLAY` variable includes the private IP address of `myWindowsVM`.\n\n   In this example, the IP address is `192.168.0.5`. The display number follows the IP address of `myWindowsVM`. In the X Window System, the most common display number is `:0.0`.\n\n   ```bash\n   export DISPLAY=<my-windows-VM-private-IP>:0.0\n   # export DISPLAY=192.168.0.5:0.0\n   ```\n\n   You can find the IP address by using the following steps:\n\n   1. In the Azure portal, select `myWindowsVM`.\n   1. On the overview pane, under **Properties**, in the **Networking** section, find **Private IP address**.\n\n1. Use the following commands to start the process of installing IBM Installation Manager:\n\n   ```bash\n   cd /datadrive/installer\n   ./install\n   ```\n\n1. After a while, the installer appears. If you don't see the user interface, troubleshoot the problem before proceeding. Keep the default settings and select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-installation-manager-select-packages-to-install.png\" alt-text=\"Screenshot of IBM Installation Manager setup.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-installation-manager-select-packages-to-install.png\":::\n\n1. Accept the license agreement by selecting **I accept the terms in the license agreement**, and then select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-installation-manager-accept-license.png\" alt-text=\"Screenshot of the IBM Installation Manager license agreement.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-installation-manager-accept-license.png\":::\n\n1. Set the Installation Manager directory to **/datadrive/IBM/InstallationManager/V1.9**, and then select **Next**.\n\n   > [!NOTE]\n   > Many of the steps in this guidance require you to copy values from this text and paste them directly into the installer UI. A typo in one of these values can cause the process to fail completely. We strongly recommend that you open a Notepad instance within the Windows jump box VM and use that as an intermediate place to paste values from this guidance. Then, inside the VM, do a separate copy/paste operation from Notepad to the installer UI. This action minimizes the chances of a simple typo causing the guidance to fail.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-installation-manager-directory.png\" alt-text=\"Screenshot of the IBM Installation Manager directory.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-installation-manager-directory.png\":::\n\n1. Review the summary information, and then select **Install**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-installation-manager-install-summary.png\" alt-text=\"Screenshot of the IBM Installation Manager summary.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-installation-manager-install-summary.png\":::\n\n1. Wait for the verification that the installation finished without error.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-installation-manager-install-complete.png\" alt-text=\"Screenshot that shows successful installation of IBM Installation Manager.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-installation-manager-install-complete.png\":::\n\n1. Close the installer. IBM Installation Manager is now installed in the directory **/datadrive/IBM/InstallationManager/V1.9**.\n\nNext, you continue to install WebSphere Application Server on `adminVM`, so keep this terminal open.\n\n---\n\n### Install WebSphere Application Server Network Deployment traditional\n\n### [WAS ND V9](#tab/was-nd-v9)\n\nWhen you use the base image, WebSphere Application Server Network Deployment is already installed in the directory **/datadrive/IBM/WebSphere/ND/V9**.\n\n### [WAS ND V85](#tab/was-nd-v85)\n\nIn this section, you use the X server on `myWindowsVM` to view the graphical installer for WebSphere Application Server Network Deployment traditional V8.5 running on `adminVM`. Use the following steps to view the installer and install the server:\n\n1. If you aren't using the previous terminal, set the `DISPLAY` variable by running `export DISPLAY=<my-windows-vm-private-ip>:0.0`.\n\n1. Use the following commands to start the process to install WAS:\n\n   ```bash\n   cd /datadrive/IBM/InstallationManager/V1.9/eclipse/\n   ./IBMIM\n   ```\n\n1. After a while, the installer appears. If you don't see the user interface, troubleshoot the problem before proceeding.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation.png\" alt-text=\"Screenshot of IBM WebSphere Application Server installation.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation.png\":::\n\n1. Select **Files** > **Preferences** to begin configuring a repository connection.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-edit-preferences.png\" alt-text=\"Screenshot of IBM WebSphere Application Server edit preferences.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-edit-preferences.png\":::\n\n1. On the **Repositories** pane, select **Add Repository**. Find the repository URL from [the online product repository of IBM WebSphere Application Server offerings](https://www.ibm.com/docs/en/was/8.5.5?topic=installing-online-product-repositories-websphere-application-server-offerings). For WebSphere Application Server Network Deployment V8.5, the URL should be `https://www.ibm.com/software/repositorymanager/com.ibm.websphere.ND.v85`. Fill in the URL in the **Repository** box, and then select **OK**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-add-the-product-repository.png\" alt-text=\"Screenshot of the box for adding the product repository for IBM WebSphere Application Server.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-add-the-product-repository.png\":::\n\n1. After a while, the **Password Required** pane asks you to enter your IBMid. Fill in your username and password, select **Save password**, and then select **OK**.\n\n   > [!NOTE]\n   > The IBMid must be entitled to run WebSphere 8.5.5. If you need help obtaining this entitlement, contact [IBM eCustomer Care](https://www-112.ibm.com/software/howtobuy/passportadvantage/homepage/ecarec).\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-passport-username-password.png\" alt-text=\"Screenshot of the Password Required pane for IBM WebSphere Application Server.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-passport-username-password.png\":::\n\n1. It takes a while to connect to the repository. If you get an error, make sure that the IBMid and password are correct. Also make sure that your IBMid is entitled to access the product repository for IBM WebSphere Application Server Network Deployment V8.5.\n\n1. After the connection is complete, the product repository URL is in the **Repositories** list. Select **OK** to close the **Preferences** pane.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-the-product-repository-added.png\" alt-text=\"Screenshot of a product repository added to IBM WebSphere Application Server.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-the-product-repository-added.png\":::\n\n1. Back on the landing page of IBM Installation Manager, select **Install**. It takes a while to prepare the installer. You might see a message similar to `Waiting for www-147.ibm.com.`\n\n1. After the connection is established, the **Install Packages** pane appears. Select the top-level IBM WebSphere Application Server Network Deployment version 8.5.5.x. The exact version number can be different, but it must be the latest 8.5.5 version shown. Be sure to select the nested checkboxes. Then select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-was855-installation.png\" alt-text=\"Screenshot of the Install Packages pane and IBM WebSphere Application Server WAS 8.5.5 installation.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-was855-installation.png\":::\n\n1. It takes a while to prepare the installer. You might see a message similar to `Waiting for www-147.ibm.com.` If you're prompted to install fixes, accept the installation of the recommended fixes and proceed.\n\n1. Accept the license agreement by selecting **I accept the terms in the license agreement**, and then select **Next**.\n\n1. Set **Shared Resources Directory** to **/datadrive/IBM/IMShared**, and then select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-was855-shared-resources-directory.png\" alt-text=\"Screenshot of the Shared Resources Directory box for IBM WebSphere Application Server.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-was855-shared-resources-directory.png\":::\n\n1. Set **Installation Directory** to **/datadrive/IBM/WebSphere/ND/V85**, and then select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-was855-installation-directory.png\" alt-text=\"Screenshot of the Installation Directory box for IBM WebSphere Application Server.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-was855-installation-directory.png\":::\n\n1. Keep **Translations** with the default value and select **Next**.\n\n1. Keep the default value of **IBM JDK** and select **Next**.\n\n1. On the **Summary** tab, select **Install**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-was855-summary.png\" alt-text=\"Screenshot of an IBM WebSphere Application Server summary.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-was855-summary.png\":::\n\n1. The installation process should finish without errors. For **Which program do you want to start?**, select **None**. Then select **Finish**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-was855-installation-complete.png\" alt-text=\"Screenshot of completed package installation for IBM WebSphere Application Server.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-application-server-installation-was855-installation-complete.png\":::\n\n1. If the WebSphere Customization Toolbox appears, close it. Close IBM Installation Manager.\n\n1. Go back to the shell from which you started IBM Installation Manager. Verify the correct installation path by using the following command to test for the existence of the Profile Management Tool:\n\n   ```bash\n   ls -la /datadrive/IBM/WebSphere/ND/V85/bin/ProfileManagement/pmt.sh\n   ```\n\n   If this file doesn't exist, correct the problem before proceeding.\n\nYou finished installing WebSphere Application Server Network Deployment in the directory **/datadrive/IBM/WebSphere/ND/V85**.\n\n---\n\n### Create machines for managed servers\n\nYou installed WebSphere Application Server Network Deployment on `adminVM`, which runs the deployment manager. You still need to prepare machines to run the two managed servers. Next, you create a snapshot from disks of `adminVM` and prepare machines for managed severs `mspVM1` and `mspVM2`.\n\nThis section introduces an approach to prepare machines with the snapshot of `adminVM`. Return to your terminal where you're signed in to the Azure CLI, and then use the following steps. This terminal isn't the Windows jump box.\n\n1. Use the following command to stop `adminVM`:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   # export RESOURCE_GROUP_NAME=abc1110rg\n   az vm stop --resource-group $RESOURCE_GROUP_NAME --name adminVM\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   # $Env:RESOURCE_GROUP_NAME = \"abc1110rg\"\n   az vm stop --resource-group $Env:RESOURCE_GROUP_NAME --name adminVM\n   ```\n\n1. Use [az snapshot create](/cli/azure/snapshot#az-snapshot-create) to take a snapshot of the `adminVM` OS disk:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   export ADMIN_OS_DISK_ID=$(az vm show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name adminVM \\\n       --query storageProfile.osDisk.managedDisk.id \\\n       --output tsv)\n   az snapshot create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name myAdminOSDiskSnapshot \\\n       --source $ADMIN_OS_DISK_ID\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   $Env:ADMIN_OS_DISK_ID=$(az vm show `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --name adminVM `\n       --query storageProfile.osDisk.managedDisk.id `\n       --output tsv)\n   az snapshot create  `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --name myAdminOSDiskSnapshot  `\n       --source $Env:ADMIN_OS_DISK_ID\n   ```\n\n1. Use [az snapshot create](/cli/azure/snapshot#az-snapshot-create) to take a snapshot of the `adminVM` data disk:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   export ADMIN_DATA_DISK_ID=$(az vm show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name adminVM \\\n       --query 'storageProfile.dataDisks[0].managedDisk.id' \\\n       --output tsv)\n   az snapshot create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name myAdminDataDiskSnapshot \\\n       --source $ADMIN_DATA_DISK_ID\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   $Env:ADMIN_DATA_DISK_ID=$(az vm show `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --name adminVM  `\n       --query 'storageProfile.dataDisks[0].managedDisk.id' `\n       --output tsv)\n   az snapshot create  `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --name myAdminDataDiskSnapshot `\n       --source $Env:ADMIN_DATA_DISK_ID\n   ```\n\n1. Use the following commands to query for the snapshot IDs that you use later:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   # Get the snapshot ID.\n   export OS_SNAPSHOT_ID=$(az snapshot show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name myAdminOSDiskSnapshot \\\n       --query '[id]' \\\n       --output tsv)\n   export DATA_SNAPSHOT_ID=$(az snapshot show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name myAdminDataDiskSnapshot \\\n       --query '[id]' \\\n       --output tsv)\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   # Get the snapshot ID.\n   $Env:OS_SNAPSHOT_ID=$(az snapshot show `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --name myAdminOSDiskSnapshot `\n       --query '[id]' `\n       --output tsv)\n   $Env:DATA_SNAPSHOT_ID=$(az snapshot show  `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --name myAdminDataDiskSnapshot `\n       --query '[id]' `\n       --output tsv)\n   ```\n\nNext, create `mspVM1` and `mspVM2`.\n\n#### Create mspVM1\n\nUse the following steps to create `mspVM1`:\n\n1. Create an OS disk for `mspVM1` by using [az disk create](/cli/azure/disk#az-disk-create):\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   # Create a new managed disk by using the OS snapshot ID.\n   # Note that the managed disk is created in the same location as the snapshot.\n   az disk create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM1_OsDisk_1 \\\n       --source $OS_SNAPSHOT_ID\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   # Create a new managed disk by using the OS snapshot ID.\n   # Note that the managed disk is created in the same location as the snapshot.\n   az disk create `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --name mspVM1_OsDisk_1 `\n       --source $Env:OS_SNAPSHOT_ID\n   ```\n\n1. Use the following commands to create the `mspVM1` VM by attaching OS disk `mspVM1_OsDisk_1`:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   # Get the resource ID of the managed disk.\n   export MSPVM1_OS_DISK_ID=$(az disk show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM1_OsDisk_1 \\\n       --query '[id]' \\\n       --output tsv)\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   # Get the resource ID of the managed disk.\n   $Env:MSPVM1_OS_DISK_ID=$(az disk show `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM1_OsDisk_1 `\n       --query '[id]' `\n       --output tsv)\n   ```\n\n    ---\n\n   ### [WAS ND V9](#tab/was-nd-v9)\n\n   ```bash\n   # Create the VM by attaching the existing managed disk as an OS.\n   az vm create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM1 \\\n       --attach-os-disk $MSPVM1_OS_DISK_ID \\\n       --plan-publisher ibm-usa-ny-armonk-hq-6275750-ibmcloud-aiops \\\n       --plan-product 2023-03-27-twas-cluster-base-image \\\n       --plan-name 2023-03-27-twas-cluster-base-image \\\n       --os-type linux \\\n       --availability-set myAvailabilitySet \\\n       --public-ip-address \"\" \\\n       --nsg \"\"\n   ```\n\n   ```powershell\n   # Create the VM by attaching the existing managed disk as an OS.\n   # For `public-ip-address` and `nsg`, be sure to wrap the value \"\" in '' in PowerShell.\n   az vm create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM1 `\n       --attach-os-disk $Env:MSPVM1_OS_DISK_ID `\n       --plan-publisher ibm-usa-ny-armonk-hq-6275750-ibmcloud-aiops `\n       --plan-product 2023-03-27-twas-cluster-base-image `\n       --plan-name 2023-03-27-twas-cluster-base-image `\n       --os-type linux `\n       --availability-set myAvailabilitySet `\n       --public-ip-address '\"\"' `\n       --nsg '\"\"'\n   ```\n\n   ### [WAS ND V85](#tab/was-nd-v85)\n\n   ```bash\n   # Create the VM by attaching the existing managed disk as an OS.\n   az vm create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM1 \\\n       --attach-os-disk $MSPVM1_OS_DISK_ID \\\n       --os-type linux \\\n       --availability-set myAvailabilitySet \\\n       --public-ip-address \"\" \\\n       --nsg \"\"\n   ```\n\n   ```powershell\n   # Create the VM by attaching the existing managed disk as an OS.\n   # For `public-ip-address` and `nsg`, be sure to wrap the value \"\" in '' in PowerShell.\n   az vm create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM1 `\n       --attach-os-disk $Env:MSPVM1_OS_DISK_ID `\n       --os-type linux `\n       --availability-set myAvailabilitySet `\n       --public-ip-address '\"\"' `\n       --nsg '\"\"'\n   ```\n\n1. Create a managed disk from the data disk snapshot and attach it to `mspVM1`:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az disk create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM1_Data_Disk_1 \\\n       --source $DATA_SNAPSHOT_ID\n\n   export MSPVM1_DATA_DISK_ID=$(az disk show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM1_Data_Disk_1 \\\n       --query '[id]' \\\n       --output tsv)\n\n   az vm disk attach \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --vm-name mspVM1 \\\n       --name $MSPVM1_DATA_DISK_ID\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az disk create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM1_Data_Disk_1 `\n       --source $Env:DATA_SNAPSHOT_ID\n\n   $Env:MSPVM1_DATA_DISK_ID=$(az disk show `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM1_Data_Disk_1 `\n       --query '[id]' `\n       --output tsv)\n\n   az vm disk attach `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --vm-name mspVM1 `\n       --name $Env:MSPVM1_DATA_DISK_ID\n   ```\n\n1. You created `mspVM1` with WAS installed. Because you created the VM from a snapshot of the `adminVM` disks, the two VMs have the same host name. Use [az vm run-command invoke](/cli/azure/vm/run-command#az-vm-run-command-invoke) to change the host name to the value `mspVM1`:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az vm run-command invoke \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM1 \\\n       --command-id RunShellScript \\\n       --scripts \"sudo hostnamectl set-hostname mspVM1\"\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az vm run-command invoke `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM1 `\n       --command-id RunShellScript `\n       --scripts \"sudo hostnamectl set-hostname mspVM1\"\n   ```\n\n    ---\n\n   When the command finishes successfully, you get output similar to the following example:\n\n   ```json\n   {\n       \"value\": [\n           {\n           \"code\": \"ProvisioningState/succeeded\",\n           \"displayStatus\": \"Provisioning succeeded\",\n           \"level\": \"Info\",\n           \"message\": \"Enable succeeded: \\n[stdout]\\n\\n[stderr]\\n\",\n           \"time\": null\n           }\n       ]\n   }\n   ```\n\n#### Create mspVM2\n\nUse the following steps to create `mspVM2`:\n\n1. Create an OS disk for `mspVM2` by using [az disk create](/cli/azure/disk#az-disk-create):\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   # Create a new managed disk by using the OS snapshot ID.\n   # Note that the managed disk is created in the same location as the snapshot.\n   az disk create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2_OsDisk_1 \\\n       --source $OS_SNAPSHOT_ID\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   # Create a new managed disk by using the OS snapshot ID.\n   # Note that the managed disk is created in the same location as the snapshot.\n   az disk create `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --name mspVM2_OsDisk_1 `\n       --source $Env:OS_SNAPSHOT_ID\n   ```\n\n1. Use the following commands to create the `mspVM2` VM by attaching OS disk `mspVM2_OsDisk_1`:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   # Get the resource ID of the managed disk.\n   export MSPVM2_OS_DISK_ID=$(az disk show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2_OsDisk_1 \\\n       --query '[id]' \\\n       --output tsv)\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   # Get the resource ID of the managed disk.\n   $Env:MSPVM2_OS_DISK_ID=$(az disk show `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM2_OsDisk_1 `\n       --query '[id]' `\n       --output tsv)\n   ```\n\n    ---\n\n   ### [WAS ND V9](#tab/was-nd-v9)\n\n   ```bash\n   # Create the VM by attaching the existing managed disk as an OS.\n   az vm create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2 \\\n       --attach-os-disk $MSPVM2_OS_DISK_ID \\\n       --plan-publisher ibm-usa-ny-armonk-hq-6275750-ibmcloud-aiops \\\n       --plan-product 2023-03-27-twas-cluster-base-image \\\n       --plan-name 2023-03-27-twas-cluster-base-image \\\n       --os-type linux \\\n       --availability-set myAvailabilitySet \\\n       --public-ip-address \"\" \\\n       --nsg \"\"\n   ```\n\n   ```powershell\n   # Create the VM by attaching the existing managed disk as an OS.\n   # For `public-ip-address` and `nsg`, be sure to wrap the value \"\" in '' in PowerShell.\n   az vm create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM2 `\n       --attach-os-disk $Env:MSPVM2_OS_DISK_ID `\n       --plan-publisher ibm-usa-ny-armonk-hq-6275750-ibmcloud-aiops `\n       --plan-product 2023-03-27-twas-cluster-base-image `\n       --plan-name 2023-03-27-twas-cluster-base-image `\n       --os-type linux `\n       --availability-set myAvailabilitySet `\n       --public-ip-address '\"\"' `\n       --nsg '\"\"'\n   ```\n\n   ### [WAS ND V85](#tab/was-nd-v85)\n\n   ```bash\n   # Create the VM by attaching the existing managed disk as an OS.\n   az vm create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2 \\\n       --attach-os-disk $MSPVM2_OS_DISK_ID \\\n       --os-type linux \\\n       --availability-set myAvailabilitySet \\\n       --public-ip-address \"\" \\\n       --nsg \"\"\n   ```\n\n   ```powershell\n   # Create the VM by attaching the existing managed disk as an OS.\n   # For `public-ip-address` and `nsg`, be sure to wrap the value \"\" in '' in PowerShell.\n   az vm create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM2 `\n       --attach-os-disk $Env:MSPVM2_OS_DISK_ID `\n       --os-type linux `\n       --availability-set myAvailabilitySet `\n       --public-ip-address '\"\"' `\n       --nsg '\"\"'\n   ```\n    ---\n\n1. Create a managed disk from the data snapshot and attach it to `mspVM2`:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az disk create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2_Data_Disk_1 \\\n       --source $DATA_SNAPSHOT_ID\n\n   export MSPVM2_DATA_DISK_ID=$(az disk show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2_Data_Disk_1 \\\n       --query '[id]' \\\n       --output tsv)\n\n   az vm disk attach \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --vm-name mspVM2 \\\n       --name $MSPVM2_DATA_DISK_ID\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az disk create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM2_Data_Disk_1 `\n       --source $Env:DATA_SNAPSHOT_ID\n\n   $Env:MSPVM2_DATA_DISK_ID=$(az disk show `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM2_Data_Disk_1 `\n       --query '[id]' `\n       --output tsv)\n\n   az vm disk attach `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --vm-name mspVM2 `\n       --name $Env:MSPVM2_DATA_DISK_ID\n   ```\n\n1. You created `mspVM2` with WAS installed. Because you created the VM from a snapshot of the `adminVM` disks, the two VMs have the same host name. Use [az vm run-command invoke](/cli/azure/vm/run-command#az-vm-run-command-invoke) to change the host name to the value `mspVM2`:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az vm run-command invoke \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2 \\\n       --command-id RunShellScript \\\n       --scripts \"sudo hostnamectl set-hostname mspVM2\"\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az vm run-command invoke `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM2 `\n       --command-id RunShellScript `\n       --scripts \"sudo hostnamectl set-hostname mspVM2\"\n   ```\n\n    ---\n\n   When the command finishes successfully, you get output similar to the following example:\n\n   ```json\n   {\n       \"value\": [\n           {\n           \"code\": \"ProvisioningState/succeeded\",\n           \"displayStatus\": \"Provisioning succeeded\",\n           \"level\": \"Info\",\n           \"message\": \"Enable succeeded: \\n[stdout]\\n\\n[stderr]\\n\",\n           \"time\": null\n           }\n       ]\n   }\n   ```\n\nMake sure that you completed the previous steps for both `mspVM1` and `mspVM2`. Then, use the following steps to finish preparing the machines:\n\n1. Use the [az vm start](/cli/azure/vm#az-vm-start) command to start `adminVM`, as shown in the following example:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az vm start --resource-group $RESOURCE_GROUP_NAME --name adminVM\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az vm start --resource-group $Env:RESOURCE_GROUP_NAME --name adminVM\n   ```\n\n1. Use the following commands to get and show the private IP addresses, which you use in later sections:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   export ADMINVM_NIC_ID=$(az vm show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name adminVM \\\n       --query networkProfile.networkInterfaces'[0]'.id \\\n       --output tsv)\n   export ADMINVM_IP=$(az network nic show \\\n       --ids $ADMINVM_NIC_ID \\\n       --query ipConfigurations'[0]'.privateIPAddress \\\n       --output tsv)\n   export MSPVM1_NIC_ID=$(az vm show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM1 \\\n       --query networkProfile.networkInterfaces'[0]'.id \\\n       --output tsv)\n   export MSPVM1_IP=$(az network nic show \\\n       --ids $MSPVM1_NIC_ID \\\n       --query ipConfigurations'[0]'.privateIPAddress \\\n       --output tsv)\n   export MSPVM2_NIC_ID=$(az vm show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name mspVM2 \\\n       --query networkProfile.networkInterfaces'[0]'.id \\\n       --output tsv)\n   export MSPVM2_IP=$(az network nic show \\\n       --ids $MSPVM2_NIC_ID \\\n       --query ipConfigurations'[0]'.privateIPAddress \\\n       --output tsv)\n   echo \"Private IP of adminVM: $ADMINVM_IP\"\n   echo \"Private IP of mspVM1: $MSPVM1_IP\"\n   echo \"Private IP of mspVM2: $MSPVM2_IP\"\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   $Env:ADMINVM_NIC_ID=$(az vm show `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name adminVM `\n       --query networkProfile.networkInterfaces'[0]'.id `\n       --output tsv)\n   $Env:ADMINVM_IP=$(az network nic show `\n       --ids $Env:ADMINVM_NIC_ID `\n       --query ipConfigurations'[0]'.privateIPAddress `\n       --output tsv)\n   $Env:MSPVM1_NIC_ID=$(az vm show `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM1 `\n       --query networkProfile.networkInterfaces'[0]'.id `\n       --output tsv)\n   $Env:MSPVM1_IP=$(az network nic show `\n       --ids $Env:MSPVM1_NIC_ID `\n       --query ipConfigurations'[0]'.privateIPAddress `\n       --output tsv)\n   $Env:MSPVM2_NIC_ID=$(az vm show `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name mspVM2 \\\n       --query networkProfile.networkInterfaces'[0]'.id `\n       --output tsv)\n   $Env:MSPVM2_IP=$(az network nic show `\n       --ids $Env:MSPVM2_NIC_ID `\n       --query ipConfigurations'[0]'.privateIPAddress `\n       --output tsv)\n   echo \"Private IP of adminVM: $Env:ADMINVM_IP\"\n   echo \"Private IP of mspVM1: $Env:MSPVM1_IP\"\n   echo \"Private IP of mspVM2: $Env:MSPVM2_IP\"\n   ```\n\nNow, all three machines are ready. Next, you configure a WAS cluster.\n\n## Create WAS profiles and a cluster\n\nThis section shows you how to create and configure a WAS cluster. In terms of creating WAS profiles and a cluster, there's no significant difference between the 9.x series and the 8.5.x series. All the screenshots in this section show V9 as the basis.\n\n### Configure a deployment manager profile\n\nIn this section, you use the X server on `myWindowsVM` to create a management profile for the deployment manager to administer servers within the deployment manager cell by using the Profile Management Tool. For more information about profiles, see [Profile concepts](https://www.ibm.com/docs/en/was-nd/9.0.5?topic=mpdios-profile-concepts). For more information about creating the deployment manager profile, see [Creating management profiles with deployment managers](https://www.ibm.com/docs/en/was-nd/9.0.5?topic=interface-creating-management-profiles-deployment-managers).\n\nUse the following steps to create and configure the management profile:\n\n1. Make sure you're still on your Windows machine. If you aren't, use the following commands to remotely connect to `myWindowsVM`, and then connect to `adminVM` from a command prompt:\n\n   ```bash\n   set ADMINVM_IP=\"192.168.0.4\"\n   ssh azureuser@%ADMINVM_IP%\n   ```\n\n1. Use the following commands to become the `root` user and set the `DISPLAY` variable:\n\n   ```bash\n   sudo su -\n\n   export DISPLAY=<my-windows-vm-private-ip>:0.0\n   # export DISPLAY=192.168.0.5:0.0\n   ```\n\n1. Use the following commands to start the Profile Management Tool:\n\n   ### [WAS ND V9](#tab/was-nd-v9)\n\n   ```bash\n   cd /datadrive/IBM/WebSphere/ND/V9/bin/ProfileManagement\n   ./pmt.sh\n   ```\n\n   ### [WAS ND V85](#tab/was-nd-v85)\n\n   ```bash\n   cd /datadrive/IBM/WebSphere/ND/V85/bin/ProfileManagement\n   ./pmt.sh\n   ```\n\n1. After a while, the Profile Management Tool appears. If you don't see the user interface, check behind the command prompt. Select **Create**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool.png\" alt-text=\"Screenshot of the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool.png\":::\n\n1. On the **Environment Selection** pane, select **Management**, and then select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-management-profile.png\" alt-text=\"Screenshot of the Environment Selection pane in the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-management-profile.png\":::\n\n1. On the **Server Type Selection** pane, select **Deployment manager**, and then select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-deployment-manager.png\" alt-text=\"Screenshot of the Server Type Selection pane in the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-deployment-manager.png\":::\n\n1. On the **Profile Creation Options** pane, select **Advanced profile creation**, and then select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-options-advanced.png\" alt-text=\"Screenshot of the Profile Creation Options pane in the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-options-advanced.png\":::\n\n1. On the **Optional Application Deployment** pane, ensure that **Deploy the administrative console (recommended)** is selected, and then select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-advanced-deploy-console.png\" alt-text=\"Screenshot of the Optional Application Deployment pane in the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-advanced-deploy-console.png\":::\n\n1. On the **Profile Name and Location** pane, enter your profile name and location. In this example, the profile name is `Dmgr01`. The location depends on your WAS version:\n\n   - In WAS V9, the location is **/datadrive/IBM/WebSphere/ND/V9/profiles/Dmgr01**.\n   - In WAS V8.5, the location is **/datadrive/IBM/WebSphere/ND/V85/profiles/Dmgr01**.\n\n   When you finish, select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-advanced-profilename-location.png\" alt-text=\"Screenshot of the Profile Name and Location pane in the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-advanced-profilename-location.png\":::\n\n1. On the **Node, Host, and Cell Names** pane, enter your node name, host name, and cell name. The host is the private IP address of `adminVM`. In this example, the node name is `adminvmCellManager01`, the host value is `192.168.0.4`, and the cell name is `adminvmCell01`. When you finish, select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-advanced-node-host-cell.png\" alt-text=\"Screenshot of the Node, Host, and Cell Names pane in the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-advanced-node-host-cell.png\":::\n\n1. On the **Administrative Security** pane, enter your admin username and password. In this example, the username is `websphere`, and the password is `Secret123456`. Note down the username and password so you can use them to sign in to the IBM console. When you finish, select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-admin-security.png\" alt-text=\"Screenshot of the Administrative Security pane in the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-admin-security.png\":::\n\n1. For the security certificate (part 1), enter your certificate if you have one. This example uses the default self-signed certificate. Then select **Next**.\n\n1. For the security certificate (part 2), enter your certificate if you have one. This example uses the default self-signed certificate. Then select **Next**.\n\n1. On the **Port Values Assignment** pane, keep the default ports and select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-advanced-ports.png\" alt-text=\"Screenshot of the Port Values Assignment pane of the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-advanced-ports.png\":::\n\n1. On the **Linux Service Definition** pane, don't select **Run the deployment manager process as a Linux service**. Later, you create the Linux service. Select **Next**.\n\n1. On the **Profile Creation Summary** pane, make sure that the information is correct, and then select **Create**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-management-profile-summary.png\" alt-text=\"Screenshot of the Profile Creation Summary pane of the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-tool-management-profile-summary.png\":::\n\n1. It takes a while to finish the profile creation. When the **Profile Creation Complete** pane appears, select **Launch the First steps console**. Then select **Finish**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-profile-complete.png\" alt-text=\"Screenshot of the Profile Creation Complete pane of the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-profile-complete.png\":::\n\n1. The **First steps** console appears. Select **Installation verification**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-first-steps.png\" alt-text=\"Screenshot of the First steps console of the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-first-steps.png\":::\n\n1. The verification process starts, and output similar to the following example appears. If there are errors, you must resolve them before moving on.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-first-steps-output.png\" alt-text=\"Screenshot of First steps console output for the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-management-first-steps-output.png\":::\n\n1. The deployment manager process starts. You can close the **First steps** console by closing the output pane and selecting **Exit** in the console.\n\n   You finished the profile creation. You can close the WebSphere Customization Toolbox.\n\n1. To access the IBM console, open the firewall ports by using the following commands:\n\n   ```bash\n   firewall-cmd --zone=public --add-port=9060/tcp --permanent\n   firewall-cmd --zone=public --add-port=9043/tcp --permanent\n   firewall-cmd --zone=public --add-port=9809/tcp --permanent\n   firewall-cmd --zone=public --add-port=7277/tcp --permanent\n   firewall-cmd --zone=public --add-port=9402/tcp --permanent\n   firewall-cmd --zone=public --add-port=9403/tcp --permanent\n   firewall-cmd --zone=public --add-port=9352/tcp --permanent\n   firewall-cmd --zone=public --add-port=9632/tcp --permanent\n   firewall-cmd --zone=public --add-port=9100/tcp --permanent\n   firewall-cmd --zone=public --add-port=9401/tcp --permanent\n   firewall-cmd --zone=public --add-port=8879/tcp --permanent\n   firewall-cmd --zone=public --add-port=5555/tcp --permanent\n   firewall-cmd --zone=public --add-port=7060/tcp --permanent\n   firewall-cmd --zone=public --add-port=11005/udp --permanent\n   firewall-cmd --zone=public --add-port=11006/tcp --permanent\n   firewall-cmd --zone=public --add-port=9420/tcp --permanent\n\n   firewall-cmd --reload\n   ```\n\n1. To start the deployment manager automatically at startup, create a Linux service for the process. Run the following commands to create a Linux service:\n\n   ### [WAS ND V9](#tab/was-nd-v9)\n\n   ```bash\n   export PROFILE_PATH=/datadrive/IBM/WebSphere/ND/V9/profiles/Dmgr01\n\n   # Configure SELinux so systemctl has access on server start/stop script files.\n   semanage fcontext -a -t bin_t \"${PROFILE_PATH}/bin(/.*)?\"\n   restorecon -r -v ${PROFILE_PATH}/bin\n\n   # Add service.\n   ${PROFILE_PATH}/bin/wasservice.sh -add adminvmCellManager01 -servername dmgr -profilePath ${PROFILE_PATH}\n   ```\n\n   ### [WAS ND V85](#tab/was-nd-v85)\n\n   ```bash\n   export PROFILE_PATH=/datadrive/IBM/WebSphere/ND/V85/profiles/Dmgr01\n\n   # Configure SELinux so systemctl has access on server start/stop script files.\n   semanage fcontext -a -t bin_t \"${PROFILE_PATH}/bin(/.*)?\"\n   restorecon -r -v ${PROFILE_PATH}/bin\n\n   # Add service.\n   ${PROFILE_PATH}/bin/wasservice.sh -add adminvmCellManager01 -servername dmgr -profilePath ${PROFILE_PATH}\n   ```\n\n1. Confirm that the following output appears:\n\n   ```bash\n   CWSFU0013I: Service [adminvmCellManager01] added successfully.\n   ```\n\n   If the output doesn't appear, troubleshoot and resolve the problem before continuing.\n\nThe deployment manager is running on `adminVM`. From the jump box Windows VM, you can access the IBM console at the URL `http://<admin-vm-private-ip>:9060/ibm/console/`.\n\n### Configure custom profiles\n\nIn this section, you use the X server on `myWindowsVM` to create custom profiles for the managed servers `mspVM1` and `mspVM2.`\n\nMake sure you're still on your Windows machine. If you're not, remotely connect to `myWindowsVM`.\n\n#### Configure the custom profile for mspVM1\n\nUse the following steps to configure a custom profile for `mspVM1`:\n\n1. Use the following commands to connect to `mspVM1` from a command prompt:\n\n   ```bash\n   set MSPVM1VM_IP=\"192.168.0.6\"\n   ssh azureuser@%MSPVM1VM_IP%\n   ```\n\n1. Use the following commands to become the `root` user and set the `DISPLAY` variable:\n\n   ```bash\n   sudo su -\n\n   export DISPLAY=<my-windows-vm-private-ip>:0.0\n   # export DISPLAY=192.168.0.5:0.0\n   ```\n\n1. To access the deployment manager on `adminVM`, open firewall ports by using the following commands:\n\n   ```bash\n   firewall-cmd --zone=public --add-port=9080/tcp --permanent\n   firewall-cmd --zone=public --add-port=9443/tcp --permanent\n   firewall-cmd --zone=public --add-port=2809/tcp --permanent\n   firewall-cmd --zone=public --add-port=9405/tcp --permanent\n   firewall-cmd --zone=public --add-port=9406/tcp --permanent\n   firewall-cmd --zone=public --add-port=9353/tcp --permanent\n   firewall-cmd --zone=public --add-port=9633/tcp --permanent\n   firewall-cmd --zone=public --add-port=5558/tcp --permanent\n   firewall-cmd --zone=public --add-port=5578/tcp --permanent\n   firewall-cmd --zone=public --add-port=9100/tcp --permanent\n   firewall-cmd --zone=public --add-port=9404/tcp --permanent\n   firewall-cmd --zone=public --add-port=7276/tcp --permanent\n   firewall-cmd --zone=public --add-port=7286/tcp --permanent\n   firewall-cmd --zone=public --add-port=5060/tcp --permanent\n   firewall-cmd --zone=public --add-port=5061/tcp --permanent\n   firewall-cmd --zone=public --add-port=8880/tcp --permanent\n   firewall-cmd --zone=public --add-port=11003/udp --permanent\n   firewall-cmd --zone=public --add-port=11004/tcp --permanent\n   firewall-cmd --zone=public --add-port=2810/tcp --permanent\n   firewall-cmd --zone=public --add-port=9201/tcp --permanent\n   firewall-cmd --zone=public --add-port=9202/tcp --permanent\n   firewall-cmd --zone=public --add-port=9354/tcp --permanent\n   firewall-cmd --zone=public --add-port=9626/tcp --permanent\n   firewall-cmd --zone=public --add-port=9629/tcp --permanent\n   firewall-cmd --zone=public --add-port=7272/tcp --permanent\n   firewall-cmd --zone=public --add-port=5001/tcp --permanent\n   firewall-cmd --zone=public --add-port=5000/tcp --permanent\n   firewall-cmd --zone=public --add-port=9900/tcp --permanent\n   firewall-cmd --zone=public --add-port=9901/tcp --permanent\n   firewall-cmd --zone=public --add-port=8878/tcp --permanent\n   firewall-cmd --zone=public --add-port=7061/tcp --permanent\n   firewall-cmd --zone=public --add-port=7062/tcp --permanent\n   firewall-cmd --zone=public --add-port=11001/udp --permanent\n   firewall-cmd --zone=public --add-port=11002/tcp --permanent\n   firewall-cmd --zone=public --add-port=9809/tcp --permanent\n   firewall-cmd --zone=public --add-port=9402/tcp --permanent\n   firewall-cmd --zone=public --add-port=9403/tcp --permanent\n   firewall-cmd --zone=public --add-port=9352/tcp --permanent\n   firewall-cmd --zone=public --add-port=9632/tcp --permanent\n   firewall-cmd --zone=public --add-port=9401/tcp --permanent\n   firewall-cmd --zone=public --add-port=11005/udp --permanent\n   firewall-cmd --zone=public --add-port=11006/tcp --permanent\n   firewall-cmd --zone=public --add-port=8879/tcp --permanent\n   firewall-cmd --zone=public --add-port=9060/tcp --permanent\n   firewall-cmd --zone=public --add-port=9043/tcp --permanent\n\n   firewall-cmd --reload\n   ```\n\n1. Use the following commands to start the Profile Management Tool:\n\n   ### [WAS ND V9](#tab/was-nd-v9)\n\n   ```bash\n   cd /datadrive/IBM/WebSphere/ND/V9/bin/ProfileManagement\n   ./pmt.sh\n   ```\n\n   ### [WAS ND V85](#tab/was-nd-v85)\n\n   ```bash\n   cd /datadrive/IBM/WebSphere/ND/V85/bin/ProfileManagement\n   ./pmt.sh\n   ```\n\n1. After a while, the Profile Management Tool appears. If you don't see the user interface, troubleshoot and resolve the problem before continuing. Select **Create**.\n\n1. On the **Environment Selection** pane, select **Custom profile**, and then select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile.png\" alt-text=\"Screenshot of the Environment Selection pane of the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile.png\":::\n\n1. On the **Profile Creation Options** pane, select **Advanced profile creation**, and then select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-advanced-creation-1.png\" alt-text=\"Screenshot of the Profile Creation Options pane of the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-advanced-creation-1.png\":::\n\n1. On the **Profile Name and Location** pane, enter your profile name and location. In this example, the profile name is `Custom01`. The location depends on your WAS version:\n\n   - In WAS V9, the location is **/datadrive/IBM/WebSphere/ND/V9/profiles/Custom01**.\n   - In WAS V8.5, the location is **/datadrive/IBM/WebSphere/ND/V85/profiles/Custom01**.\n\n   When you finish, select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-name-location.png\" alt-text=\"Screenshot of the Profile Name and Location pane of the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-name-location.png\":::\n\n1. On the **Node and Host Names** pane, enter your node name and host. The value of host is the private IP address of `mspVM1`. In this example, the host is `192.168.0.6` and the node name is `mspvm1Node01`. When you finish, select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-node-host-name.png\" alt-text=\"Screenshot of the Node and Host Names pane of the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-node-host-name.png\":::\n\n1. On the **Federation** pane, enter the deployment manager's host name and authentication. For **Deployment manager host name or IP address**, the value is the private IP address of `adminVM`, which is `192.168.0.4` here. For **Deployment manager authentication**, in this example, the username is `websphere` and the password is `Secret123456`. When you finish, select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-deployment-manager.png\" alt-text=\"Screenshot of the Federation pane of the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-deployment-manager.png\":::\n\n1. For the security certificate (part 1), enter your certificate if you have one. This example uses the default self-signed certificate. Then select **Next**.\n\n1. For the security certificate (part 2), enter your certificate if you have one. This example uses the default self-signed certificate. Then select **Next**.\n\n1. On the **Port Values Assignment** pane, keep the default ports and select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-ports.png\" alt-text=\"Screenshot of the Port Values Assignment pane in the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-ports.png\":::\n\n1. On the **Profile Creation Summary** pane, make sure that the information is correct, and then select **Create**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-summary.png\" alt-text=\"Screenshot of the Profile Creation Summary pane in the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-summary.png\":::\n\n1. It takes a while to create the custom profile. On the **Profile Creation Complete** pane, clear the **Launch the First steps console** checkbox. Then select **Finish** to complete profile creation and close the Profile Management Tool.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-complete.png\" alt-text=\"Screenshot of the Profile Creation Complete pane in the IBM Profile Management Tool.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-profiles-custom-profile-complete.png\":::\n\n1. To start the server automatically at startup, create a Linux service for the process. The following commands create a Linux service to start `nodeagent`:\n\n   ### [WAS ND V9](#tab/was-nd-v9)\n\n   ```bash\n   export PROFILE_PATH=/datadrive/IBM/WebSphere/ND/V9/profiles/Custom01\n\n   # Configure SELinux so systemctl has access on server start/stop script files.\n   semanage fcontext -a -t bin_t \"${PROFILE_PATH}/bin(/.*)?\"\n   restorecon -r -v ${PROFILE_PATH}/bin\n\n   # Add service to start nodeagent.\n   ${PROFILE_PATH}/bin/wasservice.sh -add mspvm1Node01 -servername nodeagent -profilePath ${PROFILE_PATH}\n   ```\n\n   ### [WAS ND V85](#tab/was-nd-v85)\n\n   ```bash\n   export PROFILE_PATH=/datadrive/IBM/WebSphere/ND/V85/profiles/Custom01\n\n   # Configure SELinux so systemctl has access on server start/stop script files.\n   semanage fcontext -a -t bin_t \"${PROFILE_PATH}/bin(/.*)?\"\n   restorecon -r -v ${PROFILE_PATH}/bin\n\n   # Add service to start nodeagent.\n   ${PROFILE_PATH}/bin/wasservice.sh -add mspvm1Node01 -servername nodeagent -profilePath ${PROFILE_PATH}\n   ```\n\n1. Confirm that the following output appears:\n\n   ```bash\n   CWSFU0013I: Service [mspvm1Node01] added successfully.\n   ```\n\n   If the output doesn't appear, troubleshoot and resolve the problem before continuing.\n\nYou created a custom profile and `nodeagent` running on `mspVM1`. Stop being the `root` user, and close the SSH connection to `mspVM1`.\n\n#### Configure the custom profile for mspVM2\n\nGo back to the beginning of the [Configure the custom profile for mspVM1](#configure-the-custom-profile-for-mspvm1) section and do the same steps for `mspVM2`. That is, wherever you used `mspVM1` or similar, do the same for `mspVM2`.\n\nOn the **Node and Host Names** pane, enter `mspvm2Node01` for **Node name** and `192.168.0.7` for **Host name**.\n\nYou prepared the custom profile for two managed servers: `mspVM1` and `mspVM2`. Continue ahead to create a WAS cluster.\n\n### Create a cluster and start servers\n\nIn this section, you use the IBM console to create a WAS cluster and start managed servers by using the browser on `myWindowsVM`. Make sure you're still on your Windows machine. If you aren't, remotely connect to `myWindowsVM`. Then, use the following steps:\n\n1. Open the Microsoft Edge browser and go to `http://<adminvm-private-ip>:9060/ibm/console/`. In this example, the IBM console URL is `http://192.168.0.4:9060/ibm/console/`. Find the sign-in pane. Sign in to the IBM console using your administrative username and password (`websphere/Secret123456`). You can now administer clusters and servers.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-console-portal-overview.png\" alt-text=\"Screenshot of welcome information in the IBM console.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-console-portal-overview.png\":::\n\n1. On the navigation pane, select **Servers** > **Clusters** > **WebSphere application server clusters**. Then select **New** to create a new cluster.\n\n1. In the **Create a new cluster** dialog, for **Step 1: Enter basic cluster information**, enter your cluster name. In this example, the cluster name is `cluster1`. When you finish, select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-new-cluster.png\" alt-text=\"Screenshot of the step for entering basic cluster information in the IBM Console.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-new-cluster.png\":::\n\n1. For **Step 2: Create first cluster member**, enter your member name, and select the node `mspvm1Node01`. In this example, the member name is `msp1`. The node depends on your WAS version:\n\n   - In WAS V9, the node is `mspvm1Node01 (ND 9.0.5.12)`.\n   - In WAS V8.5, the node is `mspvm1Node01 (ND 8.5.5.24)`.\n\n   When you finish, select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-member-msp1.png\" alt-text=\"Screenshot of the step for creating a first cluster member in the IBM Console.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-member-msp1.png\":::\n\n1. For **Step 3: Create additional cluster members**, enter your second member name, and select node `mspvm2Node01`. In this example, the member name is `msp2`. The node depends on your WAS version:\n\n   - In WAS V9, the node is `mspvm2Node01 (ND 9.0.5.12)`.\n   - In WAS V8.5, the node is `mspvm2Node01 (ND 8.5.5.24)`.\n\n1. Select **Add Member** to add the second node. The table lists two members. When you finish, select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-member-msp2.png\" alt-text=\"Screenshot of the step for creating an additional cluster member in the IBM Console.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-member-msp2.png\":::\n\n1. For **Step 4: Summary**, select **Finish**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-summary.png\" alt-text=\"Screenshot of the summary of actions for creating a cluster in the IBM Console.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-summary.png\":::\n\n   It takes a while to create the cluster. After the cluster is created, `cluster1` appears in the table.\n\n1. Select **cluster1**, and then select **Review** to review the information.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-review.png\" alt-text=\"Screenshot of the link for reviewing changes in the IBM Console.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-review.png\":::\n\n1. Select **Synchronize changes with Nodes**, and then select **Save**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-save.png\" alt-text=\"Screenshot of the checkbox for synchronizing changes with nodes in the IBM Console.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-save.png\":::\n\n1. The creation should finish without error. Select **OK** to continue.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-status.png\" alt-text=\"Screenshot of the IBM Console that shows successful completion of synchronization.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-status.png\":::\n\n1. Select **cluster1** in the table, and then select the **Start** button to start the cluster.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-start-cluster.png\" alt-text=\"Screenshot of selections to start a newly created cluster in the IBM Console.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-cluster-start-cluster.png\":::\n\n1. It takes a while to start the two managed servers. In the **Status** column, select the refresh icon (two arrows pointing to each other) to refresh the status.\n\n   Hover over the refresh icon. When the tooltip shows **Started**, you can trust that the cluster is formed. Continue to periodically refresh and check until the tooltip shows **Started**.\n\n1. Use the following steps to configure the Application Server Monitoring Policy settings to automatically start the managed server after the Node Agent starts.\n\n   Use the following steps to configure `msp1`:\n\n   1. On the navigation pane, select **Servers**, select **Server Types**, and then select **WebSphere application servers**.\n   1. Select the hyperlink for application server `msp1`.\n   1. In the **Server Infrastructure** section, select **Java and process management**.\n   1. Select **Monitoring policy**.\n   1. Ensure that **Automatic restart** is selected, and then select **RUNNING** as the node restart state. Select **OK**.\n\n      :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-console-application-automatic-restart.png\" alt-text=\"Screenshot of the IBM Console that shows configuration of a monitoring policy.\" lightbox=\"media/migrate-websphere-to-azure-vm-manually/ibm-websphere-console-application-automatic-restart.png\":::\n\n   1. Go back to the **Middleware services** pane. On the **Messages** panel, select the **Review** link, and then select **Synchronize changes with Nodes**. Select **Save** to save and synchronize changes.\n   1. The following message appears: `The configuration synchronization complete for cell.` Select **OK** to exit the configuration.\n\n   Use the following steps to configure `msp2`:\n\n   1. On the navigation pane, select **Servers**, select **Server Types**, and then select **WebSphere application servers**.\n   1. Select the hyperlink for application server `msp2`.\n   1. In the **Server Infrastructure** section, select **Java and process management**.\n   1. Select **Monitoring policy**.\n   1. Ensure that **Automatic restart** is selected, and then select **RUNNING** as the node restart state. Select **OK**.\n   1. Go back to the **Middleware services** pane. On the **Messages** panel, select the **Review** link, and then select **Synchronize changes with Nodes**. Select **Save** to save and synchronize changes.\n   1. The following message appears: `The configuration synchronization complete for cell.` Select **OK** to exit the configuration.\n\nYou configured `cluster1` with two managed servers, `msp1` and `msp2`. The cluster is up and running.\n\n## Deploy an application\n\nUse the following steps to deploy the application:\n\n1. In the administrative console where you signed in earlier, select **Applications** > **New Application**, and then select **New Enterprise Application**.\n\n1. On the next panel, select **Remote file system**, and then select **Browse** to browse through the file systems of your installed servers.\n\n1. Select the system that begins with **adminvm**. The VM's file system appears. From there, select **V9** (or **V85**), and then select **installableApps**.\n\n1. In the list of applications that are available to install, select **DefaultApplication.ear**. Then select **OK**.\n\n1. You're back on the panel for selecting the application. Select **Next**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-azure-vm-manually/select-test-app-page.png\" alt-text=\"Screenshot of the IBM WebSphere dialog for specifying a module to upload and install.\":::\n\n1. Select **Next** for all the remaining steps in the **Install New Application** workflow. Then select **Finish**.\n\n1. The following message should appear: `Application DefaultApplication.ear installed successfully.` If this message doesn't appear, troubleshoot and resolve the problem before continuing.\n\n1. Select the **Save directly to the master configuration** link.\n\n1. You need to start the application. Go to **Applications** > **All Applications**. Select the **DefaultApplication.ear** checkbox, ensure that **Action** is set to **Start**, and then select **Submit Action**.\n\n1. In the **All Applications** table, in the **Status** column, select the refresh icon. After a few times refreshing the table in this way, a green arrow should appear in the **Status** column for **DefaultApplication.ear**.\n\nThe application is now installed in your WAS cluster.\n\n## Expose WAS by using Azure Application Gateway\n\nNow that you finished creating the WAS cluster on GNU/Linux virtual machines, this section walks you through the process of exposing WAS to the internet by using Azure Application Gateway.\n\n### Create the application gateway\n\nUse the following steps to create the application gateway:\n\n1. To expose WAS to the internet, you need a public IP address. In the shell with the Azure CLI installed, create the IP address by using [az network public-ip create](/cli/azure/network/public-ip#az-network-public-ip-create), as shown in the following example:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az network public-ip create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name myAGPublicIPAddress \\\n       --allocation-method Static \\\n       --sku Standard\n\n   export APPGATEWAY_IP=$(az network public-ip show \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name myAGPublicIPAddress \\\n       --query '[ipAddress]' \\\n       --output tsv)\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az network public-ip create `\n       --resource-group $Env:RESOURCE_GROUP_NAME `\n       --name myAGPublicIPAddress `\n       --allocation-method Static  `\n       --sku Standard\n\n   $Env:APPGATEWAY_IP=$(az network public-ip show  `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --name myAGPublicIPAddress `\n       --query '[ipAddress]' `\n       --output tsv)\n   ```\n\n1. Create the application gateway to associate with the IP address. The following example creates an application gateway with the WebSphere managed servers in the default back-end pool:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az network application-gateway create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name myAppGateway \\\n       --public-ip-address myAGPublicIPAddress \\\n       --location eastus \\\n       --capacity 2 \\\n       --http-settings-port 80 \\\n       --http-settings-protocol Http \\\n       --frontend-port 80 \\\n       --sku Standard_V2 \\\n       --subnet wasGateway \\\n       --vnet-name myVNet \\\n       --priority 1001 \\\n       --servers ${MSPVM1_IP} ${MSPVM2_IP}\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az network application-gateway create  `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --name myAppGateway `\n       --public-ip-address myAGPublicIPAddress `\n       --location eastus `\n       --capacity 2 `\n       --http-settings-port 80 `\n       --http-settings-protocol Http `\n       --frontend-port 80 `\n       --sku Standard_V2 `\n       --subnet wasGateway `\n       --vnet-name myVNet `\n       --priority 1001 `\n       --servers $Env:MSPVM1_IP $Env:MSPVM2_IP\n   ```\n\n1. The managed servers expose their workloads with port `9080`. Use the following commands to update `appGatewayBackendHttpSettings` by specifying back-end port `9080` and creating a probe for it:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   az network application-gateway probe create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --gateway-name myAppGateway \\\n       --name clusterProbe \\\n       --protocol http \\\n       --host-name-from-http-settings true \\\n       --match-status-codes 404 \\\n       --path \"/\"\n\n   az network application-gateway http-settings update \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --gateway-name myAppGateway \\\n       --name appGatewayBackendHttpSettings \\\n       --host-name-from-backend-pool true \\\n       --port 9080 \\\n       --probe clusterProbe\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   az network application-gateway probe create  `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --gateway-name myAppGateway  `\n       --name clusterProbe `\n       --protocol http `\n       --host-name-from-http-settings true `\n       --match-status-codes 404 `\n       --path \"/\"\n\n   az network application-gateway http-settings update `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --gateway-name myAppGateway `\n       --name appGatewayBackendHttpSettings `\n       --host-name-from-backend-pool true `\n       --port 9080 `\n       --probe clusterProbe\n   ```\n\n1. Use the following commands to provision a rewrite rule for redirections:\n\n   ### [Bash](#tab/in-bash)\n\n   ```bash\n   # Create a rewrite rule set.\n   az network application-gateway rewrite-rule set create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --gateway-name myAppGateway \\\n       --name myRewriteRuleSet\n\n   # Associated routing rules.\n   az network application-gateway rule update \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --gateway-name myAppGateway \\\n       --name rule1 \\\n       --rewrite-rule-set myRewriteRuleSet\n\n   # Create a rewrite rule 1.\n   az network application-gateway rewrite-rule create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --gateway-name myAppGateway \\\n       --rule-set-name myRewriteRuleSet \\\n       --name myRewriteRule01 \\\n       --sequence 100 \\\n       --response-headers Location=http://${APPGATEWAY_IP}{http_resp_Location_2}\n\n   # Create a rewrite rule condition.\n   az network application-gateway rewrite-rule condition create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --gateway-name myAppGateway \\\n       --rule-name myRewriteRule01 \\\n       --rule-set-name myRewriteRuleSet \\\n       --variable \"http_resp_Location\" \\\n       --ignore-case true \\\n       --negate false \\\n       --pattern \"(https?):\\/\\/192.168.0.6:9080(.*)$\"\n\n   # Create a rewrite rule 2.\n   az network application-gateway rewrite-rule create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --gateway-name myAppGateway \\\n       --rule-set-name myRewriteRuleSet \\\n       --name myRewriteRule02 \\\n       --sequence 100 \\\n       --response-headers Location=http://${APPGATEWAY_IP}{http_resp_Location_2}\n\n   # Create a rewrite rule condition.\n   az network application-gateway rewrite-rule condition create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --gateway-name myAppGateway \\\n       --rule-name myRewriteRule02 \\\n       --rule-set-name myRewriteRuleSet \\\n       --variable \"http_resp_Location\" \\\n       --ignore-case true \\\n       --negate false \\\n       --pattern \"(https?):\\/\\/192.168.0.7:9080(.*)$\"\n   ```\n\n   ### [PowerShell](#tab/in-powershell)\n\n   ```powershell\n   # Create a rewrite rule set.\n   az network application-gateway rewrite-rule set create `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --gateway-name myAppGateway `\n       --name myRewriteRuleSet\n\n   # Associated routing rules.\n   az network application-gateway rule update `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --gateway-name myAppGateway `\n       --name rule1 `\n       --rewrite-rule-set myRewriteRuleSet\n\n   # Create a rewrite rule 1.\n   az network application-gateway rewrite-rule create `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --gateway-name myAppGateway `\n       --rule-set-name myRewriteRuleSet `\n       --name myRewriteRule01 `\n       --sequence 100 `\n       --response-headers Location=\"http://${Env:APPGATEWAY_IP}{http_resp_Location_2}\"\n\n   # Create a rewrite rule condition.\n   az network application-gateway rewrite-rule condition create `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --gateway-name myAppGateway `\n       --rule-name myRewriteRule01 `\n       --rule-set-name myRewriteRuleSet `\n       --variable \"http_resp_Location\" `\n       --ignore-case true `\n       --negate false `\n       --pattern '\"(https?):\\/\\/192.168.0.6:9080(.*)$\"'\n       # Be sure to wrap the \"\" in ''\n\n   # Create a rewrite rule 2.\n   az network application-gateway rewrite-rule create `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --gateway-name myAppGateway `\n       --rule-set-name myRewriteRuleSet `\n       --name myRewriteRule02 `\n       --sequence 100 `\n       --response-headers Location=\"http://${Env:APPGATEWAY_IP}{http_resp_Location_2}\"\n\n   # Create a rewrite rule condition.\n   az network application-gateway rewrite-rule condition create `\n       --resource-group $Env:RESOURCE_GROUP_NAME  `\n       --gateway-name myAppGateway `\n       --rule-name myRewriteRule02 `\n       --rule-set-name myRewriteRuleSet `\n       --variable \"http_resp_Location\" `\n       --ignore-case true `\n       --negate false `\n       --pattern '\"(https?):\\/\\/192.168.0.7:9080(.*)$\"'\n       # Be sure to wrap the \"\" in ''\n   ```\n\nYou can now access the application by using the URL that the following command produces:\n\n### [Bash](#tab/in-bash)\n\n```bash\necho \"http://${APPGATEWAY_IP}/snoop/\"\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```powershell\necho \"http://${Env:APPGATEWAY_IP}/snoop/\"\n```\n\n---\n\n> [!NOTE]\n> This example sets up simple access to the WAS servers with HTTP. If you want secure access, configure TLS/SSL termination by following the instructions in [End-to-end TLS with Application Gateway](/azure/application-gateway/ssl-overview).\n>\n> This example doesn't expose the IBM console via Application Gateway. To access the IBM console, you can use the Windows machine `myWindowsVM` or assign a public IP address to `adminVM`.\n\nIf you don't want to use the jump box `myWindowsVM` to access the IBM console, but you want to expose it to a public network, use the following commands to assign a public IP address to `adminVM`:\n\n### [Bash](#tab/in-bash)\n\n```bash\n# Create a public IP address.\naz network public-ip create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name myAdminVMPublicIPAddress \\\n    --allocation-method Static \\\n    --sku Standard\n\n# Create a network security group.\naz network nsg create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name adminnsg\n\n# Create an inbound rule for the network security group.\naz network nsg rule create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --nsg-name adminnsg \\\n    --name ALLOW_IBM_CONSOLE \\\n    --access Allow \\\n    --direction Inbound \\\n    --source-address-prefixes '[\"*\"]' \\\n    --destination-port-ranges 9043 \\\n    --protocol Tcp \\\n    --priority 500\n\n# Update the network adapter with the network security group.\naz network nic update \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name adminVMVMNic \\\n    --network-security-group adminnsg\n\n# Update the network adapter with the public IP address.\naz network nic ip-config update \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name ipconfigadminVM \\\n    --nic-name adminVMVMNic \\\n    --public-ip-address myAdminVMPublicIPAddress\n\nexport ADMIN_PUBLIC_IP=$(az network public-ip show \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --name myAdminVMPublicIPAddress \\\n    --query '[ipAddress]' \\\n    --output tsv)\n\necho \"IBM Console public URL: https://${ADMIN_PUBLIC_IP}:9043/ibm/console/\"\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```powershell\n# Create a public IP address.\naz network public-ip create `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name myAdminVMPublicIPAddress `\n    --allocation-method Static `\n    --sku Standard\n\n# Create a network security group.\naz network nsg create `\n    --resource-group $Env:RESOURCE_GROUP_NAME  `\n    --name adminnsg\n\n# Create an inbound rule for the network security group.\naz network nsg rule create `\n    --resource-group $Env:RESOURCE_GROUP_NAME  `\n    --nsg-name adminnsg `\n    --name ALLOW_IBM_CONSOLE `\n    --access Allow `\n    --direction Inbound `\n    --source-address-prefixes '[\"*\"]' `\n    --destination-port-ranges 9043 `\n    --protocol Tcp `\n    --priority 500\n\n# Update the network adapter with the network security group.\naz network nic update `\n    --resource-group $Env:RESOURCE_GROUP_NAME  `\n    --name adminVMVMNic `\n    --network-security-group adminnsg\n\n# Update the network adapter with the public IP address.\naz network nic ip-config update `\n    --resource-group $Env:RESOURCE_GROUP_NAME `\n    --name ipconfigadminVM `\n    --nic-name adminVMVMNic `\n    --public-ip-address myAdminVMPublicIPAddress\n\n$Env:ADMIN_PUBLIC_IP=$(az network public-ip show `\n    --resource-group $Env:RESOURCE_GROUP_NAME  `\n    --name myAdminVMPublicIPAddress `\n    --query '[ipAddress]' `\n    --output tsv)\n\necho \"IBM Console public URL: https://${Env:ADMIN_PUBLIC_IP}:9043/ibm/console/\"\n```\n\n---\n\n## Test the WAS cluster configuration\n\nYou finished configuring the WAS cluster and deploying the Java EE application to it. Use the following steps to access the application to validate all the settings:\n\n1. Open a web browser.\n1. Go to the application by using the URL `http://<gateway-public-ip-address>/snoop/`.\n1. When you continually refresh the browser, the app cycles through the server instances. Look at the value of the **Host** request header and note that it changes after reloading several times.\n\n## Clean up resources\n\nYou completed the WAS cluster configuration. The following sections describe how to remove the resources that you created.\n\n### Clean up the Windows machine\n\nYou can remove the Windows machine `myWindowsVM` by using the following commands. Alternatively, you could shut down the Windows machine and continue to use it as a jump box for ongoing cluster maintenance tasks.\n\n[!INCLUDE [clean-up-windows-xserver-machine](includes/clean-up-windows-xserver-machine.md)]\n\n### Clean up all the resources\n\nDelete `abc1110rg` by using the following command:\n\n### [Bash](#tab/in-bash)\n\n```azurecli\naz group delete --name $RESOURCE_GROUP_NAME --yes --no-wait\n```\n\n### [PowerShell](#tab/in-powershell)\n\n```powershell\naz group delete --name $Env:RESOURCE_GROUP_NAME --yes --no-wait\n```\n\n---\n\n## Next steps\n\nTo explore options to run WebSphere products on Azure, see [What are solutions to run the WebSphere family of products on Azure?](../ee/websphere-family.md)\n"
  },
  {
    "path": "articles/java/migration/migrate-websphere-to-jboss-eap-on-azure-app-service.md",
    "content": "---\ntitle: Migrate WebSphere applications to JBoss EAP on Azure App Service\ndescription: This guide describes what you should be aware of when you want to migrate an existing WebSphere application to run on Azure App Service using JBoss EAP.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: dbrittain\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-extended-java, devx-track-java, devx-track-javaee-jbosseap, devx-track-javaee-jbosseap-appsvc, migration-java, devx-track-javaee-websphere, linux-related-content\n---\n\n# Migrate WebSphere applications to JBoss EAP on Azure App Service\n\nThis guide describes what you should be aware of when you want to migrate an existing WebSphere application to run on Azure App Service using JBoss EAP.\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n[!INCLUDE [inventory-server-capacity-jboss-eap](includes/inventory-server-capacity-jboss-eap.md)]\n\n### Inventory all secrets\n\nCheck all properties and configuration files on the production server or servers for any secrets and passwords. Be sure to check **ibm-web-bnd.xml** in your WARs. Configuration files that contain passwords or credentials may also be found inside your application. These files may include, for Spring Boot applications, the **application.properties** or **application.yml** files.\n\n[!INCLUDE [inventory-all-certificates](includes/inventory-all-certificates.md)]\n\n### Validate that the supported Java version works correctly\n\nJBoss EAP on Azure App Service supports Java 8 and 11. Therefore, you'll need to validate that your application is able to run correctly using that supported version. This validation is especially important if your current server is using a supported JDK (such as Oracle JDK or IBM OpenJ9).\n\nTo obtain your current Java version, sign in to your production server and run the following command:\n\n```bash\njava -version\n```\n\n### Inventory JNDI resources\n\nInventory all JNDI resources. Some resources, such as JMS message brokers, may require migration or reconfiguration.\n\n#### Inside your application\n\nInspect the **WEB-INF/ibm-web-bnd.xml** file and/or the **WEB-INF/web.xml** file.\n\n### Determine whether databases are used\n\nIf your application uses any databases, you need to capture the following information:\n\n- The datasource name.\n- The connection pool configuration.\n- The location of the JDBC driver JAR file.\n\n### Determine whether and how the file system is used\n\nAny usage of the file system on the application server will require reconfiguration or, in rare cases, architectural changes. File system may be used by WebSphere shared modules or by your application code. You may identify some or all of the following scenarios.\n\n[!INCLUDE [static-content](includes/static-content.md)]\n\n#### Dynamic or internal content\n\nFor files that are frequently written and read by your application (such as temporary data files), or static files that are visible only to your application, you can mount Azure Storage into your App Service file system. For more information, see [Mount Azure Storage as a local share in App Service](/azure/app-service/containers/how-to-serve-content-from-azure-storage#link-storage-to-your-web-app-preview).\n\n### Determine whether your application relies on scheduled jobs\n\nScheduled jobs, such as Quartz Scheduler tasks or Unix cron jobs, should NOT be used with Azure App Service. Azure App Service will not prevent you from deploying an application containing scheduled tasks internally. However, if your application is scaled out, the same scheduled job may run more than once per scheduled period. This situation can lead to unintended consequences.\n\nTo execute scheduled jobs on Azure, consider using Azure Functions with a Timer Trigger. For more information, see [Timer trigger for Azure Functions](/azure/azure-functions/functions-bindings-timer). You don't need to migrate the job code itself into a function. The function can simply invoke a URL in your application to trigger the job.\n\n> [!NOTE]\n> To prevent malicious use, you'll likely need to ensure that the job invocation endpoint requires credentials. In this case, the trigger function will need to provide the credentials.\n\n[!INCLUDE [determine-whether-a-connection-to-on-premises-is-needed](includes/determine-whether-a-connection-to-on-premises-is-needed.md)]\n\n[!INCLUDE [determine-whether-jms-queues-or-topics-are-in-use](includes/determine-whether-jms-queues-or-topics-are-in-use.md)]\n\n### Determine whether your application uses WebSphere-specific APIs\n\nIf your application uses WebSphere-specific APIs, you'll need to refactor your application to NOT use them. The [Red Hat Migration Toolkit for Apps](https://marketplace.visualstudio.com/items?itemName=redhat.mta-vscode-extension) can assist with removing and refactoring these dependencies.\n\n[!INCLUDE [determine-whether-your-application-uses-entity-beans](includes/determine-whether-your-application-uses-entity-beans.md)]\n\n### Determine whether the JavaEE Application Client feature is used\n\nIf you have client applications that connect to your (server) application using the JavaEE Application Client feature, you'll need to refactor both your client applications and your (server) application to use HTTP APIs.\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code.md)]\n\n### Determine whether EJB timers are in use\n\nIf your application uses EJB timers, you'll need to validate that the EJB timer code can be triggered by each JBoss EAP instance independently. This validation is needed because when your App Service is scaled our horizontally, each EJB timer will be triggered on its own JBoss EAP instance.\n\n### Determine whether JCA connectors are in use\n\nIf your application uses JCA connectors, you'll need to validate that the JCA connector can be used on JBoss EAP. If the JCA implementation is tied to WebSphere, you'll need to refactor your application remove the dependency on the JCA connector. If the JCA connector can be used, then you'll need to add the JARs to the server classpath. You'll also need to put the necessary configuration files in the correct location in the JBoss EAP server directories for it to be available.\n\n### Determine whether JAAS is in use\n\nIf your application uses JAAS, you'll need to capture how JAAS is configured. If it's using a database, you can convert it to a JAAS domain on JBoss EAP. If it's a custom implementation, you'll need to validate that it can be used on JBoss EAP.\n\n### Determine whether your application uses a Resource Adapter\n\nIf your application needs a Resource Adapter (RA), it needs to be compatible with JBoss EAP. Determine whether the RA works fine on a standalone instance of JBoss EAP by deploying it to the server and properly configuring it. If the RA works properly, you'll need to add the JARs to the server classpath of the App Service instance and put the necessary configuration files in the correct location in the JBoss EAP server directories for it to be available.\n\n[!INCLUDE [determine-whether-your-application-is-composed-of-multiple-wars](includes/determine-whether-your-application-is-composed-of-multiple-wars.md)]\n\n### Determine whether your application is packaged as an EAR\n\nIf your application is packaged as an EAR file, be sure to examine the **application.xml** and **ibm-application-bnd.xml** files and capture their configurations.\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n## Migration\n\n[!INCLUDE [java-redhat-migration-toolkit](includes/redhat-migration-toolkit.md)]\n\n### Provision an App Service plan\n\nFrom the [list of available service plans](https://azure.microsoft.com/pricing/details/app-service/linux/), select the plan whose specifications meet or exceed the specifications of the current production hardware.\n\n> [!NOTE]\n> If you plan to run staging/canary deployments or use [deployment slots](/azure/app-service/deploy-staging-slots), the App Service plan must include that additional capacity. We recommend using Premium or higher plans for Java applications.\n\n[Create that app service plan](/azure/app-service/app-service-plan-manage#create-an-app-service-plan).\n\n### Create and deploy web app(s)\n\nYou'll need to create a Web App on your App Service Plan for every WAR file deployed to your JBoss EAP server.\n\n> [!NOTE]\n> While it's possible to deploy multiple WAR files to a single web app, this is highly undesirable. Deploying multiple WAR files to a single web app prevents each application from scaling according to its own usage demands. It also adds complexity to subsequent deployment pipelines. If multiple applications need to be available on a single URL, consider using a routing solution such as [Azure Application Gateway](/azure/application-gateway/).\n\n#### Maven applications\n\nIf your application is built from a Maven POM file, use the Webapp plugin for Maven to create the Web App and deploy your application. For more information, see the [Configure the Maven plugin](/azure/app-service/containers/quickstart-java#3---configure-the-maven-plugin) section of [Quickstart: Create a Java app on Azure App Service](/azure/app-service/containers/quickstart-java).\n\n#### Non-Maven applications\n\nIf you can't use the Maven plugin, you'll need to provision the Web App through other mechanisms, such as:\n\n* [Azure portal](https://portal.azure.com/#create/Microsoft.WebSite)\n* [Azure CLI](/cli/azure/webapp#az-webapp-create)\n* [Azure PowerShell](/powershell/module/az.websites/new-azwebapp)\n\nAfter you've created the web app, use one of the available deployment mechanisms to deploy your application. For more information, see [Deploy files to App Service](/azure/app-service/deploy-zip).\n\n### Migrate JVM runtime options\n\nIf your application requires specific runtime options, use the most appropriate mechanism to specify them. For more information, see the [Set Java runtime options](/azure/app-service/containers/configure-language-java#set-java-runtime-options) section of [Deploy and configure a Tomcat, JBoss, or Java SE app in Azure App Service](/azure/app-service/containers/configure-language-java).\n\n### Populate secrets\n\nUse Application Settings to store any secrets specific to your application. If you intend to use the same secret or secrets among multiple applications, or you require fine-grained access policies and audit capabilities, use Azure Key Vault references instead. For more information, see [Use Key Vault references as app settings in Azure App Service and Azure Functions](/azure/app-service/app-service-key-vault-references).\n\n### Configure custom domain and SSL\n\nIf your application will be visible on a custom domain, you'll need to map your web application to it. For more information, see [Tutorial: Map an existing custom DNS name to Azure App Service](/Azure/app-service/app-service-web-tutorial-custom-domain).\n\nYou'll then need to bind the TLS/SSL certificate for that domain to your App Service Web App. For more information, see [Secure a custom DNS name with a TLS/SSL binding in Azure App Service](/azure/app-service/app-service-web-tutorial-custom-ssl).\n\n### Migrate data sources, libraries, and JNDI resources\n\nTo migrate data sources, follow the steps in the [Configure data sources for a Tomcat, JBoss, or Java SE app in Azure App Service](/azure/app-service/configure-language-java-data-sources).\n\nMigrate any additional server-level classpath dependencies. For more information, see [Configure data sources for a Tomcat, JBoss, or Java SE app in Azure App Service](/azure/app-service/containers/configure-language-java?pivots=java-jboss).\n\nMigrate any additional shared server-level JDNI resources. For more information, see [Configure data sources for a Tomcat, JBoss, or Java SE app in Azure App Service](/azure/app-service/containers/configure-language-java?pivots=java-jboss).\n\n> [!NOTE]\n> If you're following the recommended architecture of one WAR per application, consider migrating server-level classpath libraries and JNDI resources into your application. Doing so will significantly simplify component governance and change management. If you want to deploy more than one WAR per application, you should review one of our companion guides mentioned at the beginning of this guide.\n\n### Migrate scheduled jobs\n\nAt a minimum, you should move your scheduled jobs to an Azure VM so they're no longer part of your application. Alternately, you can opt to modernize them into event driven Java using Azure services such as Azure Functions, SQL Database, and Event Hubs.\n\n### Restart and smoke-test\n\nFinally, you'll need to restart your Web App to apply all configuration changes. Upon completion of the restart, verify that your application is running correctly.\n\n## Post-migration\n\nNow that you've migrated your application to Azure App Service, you should verify that it works as you expect. Once you've done that, we have some recommendations for you that can make your application more Cloud native.\n\n[!INCLUDE [recommendations-jboss-eap](includes/recommendations-jboss-eap.md)]\n"
  },
  {
    "path": "articles/java/migration/migrate-websphere-to-virtual-machines.md",
    "content": "---\ntitle: Migrate WebSphere applications to Azure Virtual Machines\ndescription: This guide describes what you should be aware of when you want to migrate an existing WebSphere application to run on Azure Virtual Machines.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: haiche\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-extended-java, devx-track-java, devx-track-javaee, devx-track-javaee-was-vm, devx-track-javaee-was, devx-track-javaee-websphere, migration-java, linux-related-content\n---\n\n# Migrate WebSphere applications to Azure Virtual Machines\n\nThis guide describes what you should be aware of when you want to migrate an existing WebSphere Application Server (WAS) traditional application to run on Azure Virtual Machines. For an overview of available WAS traditional solutions in Azure Marketplace, see [What are solutions to run the IBM WebSphere family of products on Azure?](../ee/websphere-family.md)\n\n## Pre-migration\n\nTo ensure a successful migration, before you start, complete the assessment and inventory steps described in the following sections.\n\n### Define what you mean by \"migration complete\"\n\nThis guide, and the corresponding Azure Marketplace offers, are a starting point to accelerate the migration of your WAS traditional workloads to Azure. It's important to define the scope of your migration effort. For example, are you doing a strict \"lift and shift\" from your existing infrastructure to Azure Virtual Machines? If so, you may be tempted to work in some \"lift and improve\" as you migrate.\n\nIt's better to stick as close to pure \"lift and shift\" as possible, accounting for the necessary changes as detailed in this guide. Define what you mean by \"migration complete\" so that you know when you've reached this milestone. When you've reached your \"migration complete\", you can take a snapshot of your Virtual Machines as described in [Create a snapshot of a virtual hard disk](/azure/virtual-machines/windows/snapshot-copy-managed-disk). After you've verified that you can successfully restore from your snapshot, you can do the improvements without fear of losing the migration progress you've achieved thus far.\n\n[!INCLUDE [vm-aks-aro-tradeoffs-was-liberty](includes/vm-aks-aro-tradeoffs-was-liberty.md)]\n\n### Determine whether the prebuilt Azure Marketplace offers are a good starting point\n\nIBM and Microsoft have partnered to bring a set of Azure solution templates to Azure Marketplace to provide a solid starting point for migrating to Azure. For the list of offers, see [Run the WebSphere family of products and Liberty on Microsoft Azure](https://developer.ibm.com/blogs/run-the-websphere-family-of-products-on-microsoft-azure/), and then choose the one that most closely matches your existing deployment. You can see the list of offers in the overview article [What are solutions to run the IBM WebSphere family of products on Azure?](../ee/websphere-family.md)\n\nIf none of the existing offers are a good starting point, you have to reproduce the deployment by hand using Azure Virtual Machine resources. You can find the step-by-step guidance in [Tutorial: Manually install IBM WebSphere Application Server Network Deployment traditional on Azure Virtual Machines](migrate-websphere-to-azure-vm-manually.md). For more information, see [What is IaaS?](https://azure.microsoft.com/resources/cloud-computing-dictionary/what-is-iaas)\n\n### Determine whether the WAS traditional version is compatible\n\nYour existing WAS traditional version must be compatible with the version in the IaaS offers. You can find the version information from the overview page of [IBM WebSphere Application Server Single Instance on Azure VM](https://aka.ms/twas-single-portal) and [IBM WebSphere Application Server Cluster on Azure VMs](https://aka.ms/twas-cluster-portal). If your existing WAS traditional version isn't compatible with that version, you have to reproduce the deployment by hand using Azure IaaS resources. For more information, see [What is IaaS?](https://azure.microsoft.com/resources/cloud-computing-dictionary/what-is-iaas)\n\n[!INCLUDE [inventory-server-capacity-virtual-machines](includes/inventory-server-capacity-virtual-machines.md)]\n\n[!INCLUDE [inventory-all-secrets](includes/inventory-was-secrets.md)]\n\n[!INCLUDE [inventory-all-certificates](includes/inventory-all-certificates.md)]\nFor more information, see the IBM document [Certificate management in SSL](https://www.ibm.com/docs/en/was/9.0.5?topic=ssl-certificate-management-in)\n\n[!INCLUDE [validate-that-the-supported-java-version-works-correctly-was](includes/validate-that-the-supported-java-version-works-correctly-was.md)]\n\n[!INCLUDE [inventory-was-jndi-resources](includes/inventory-was-jndi-resources.md)]\n\n[!INCLUDE [inspect-your-profile-configuration](includes/inspect-your-profile-configuration.md)]\n\n[!INCLUDE [determine-whether-session-replication-is-used](includes/determine-whether-session-replication-is-used-was.md)]\n\n[!INCLUDE [document-datasources](includes/document-datasources-was.md)]\n\n[!INCLUDE [determine-whether-was-has-been-customized](includes/determine-whether-was-has-been-customized.md)]\n\n[!INCLUDE [determine-whether-a-connection-to-on-premises-is-needed](includes/determine-whether-a-connection-to-on-premises-is-needed.md)]\n\n[!INCLUDE [determine-whether-jms-queues-or-topics-are-in-use-virtual-machines](includes/determine-whether-jms-queues-or-topics-are-in-use-virtual-machines-was.md)]\n\n[!INCLUDE [determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries](includes/determine-whether-you-are-using-your-own-custom-created-shared-java-ee-libraries.md)]\n\n[!INCLUDE [determine-whether-osgi-bundles-are-used](includes/determine-whether-osgi-bundles-are-used-was.md)]\n\n[!INCLUDE [determine-whether-your-application-contains-os-specific-code](includes/determine-whether-your-application-contains-os-specific-code.md)]\n\n[!INCLUDE [determine-whether-ibm-integration-bus-is-in-use](includes/determine-whether-ibm-integration-bus-is-in-use.md)]\n\n[!INCLUDE [determine-whether-your-application-is-composed-of-multiple-wars](includes/determine-whether-your-application-is-composed-of-multiple-wars.md)]\n\n[!INCLUDE [determine-whether-your-application-is-packaged-as-an-ear](includes/determine-whether-your-application-is-packaged-as-an-ear-was.md)]\n\n[!INCLUDE [identify-all-outside-processes-and-daemons-running-on-the-production-servers](includes/identify-all-outside-processes-and-daemons-running-on-the-production-servers.md)]\n\n### Determine whether and how the file system is used\n\nVM filesystems operate the same way as on-premises filesystems with respect to persistence, startup, and shutdown. Even so, it's important to be aware of your filesystem needs and ensure the VMs have adequate storage size and performance.\n\n[!INCLUDE [static-content](includes/static-content.md)]\n\n[!INCLUDE [determine-the-network-topology](includes/determine-the-network-topology-was.md)]\n\n[!INCLUDE [account-for-the-use-of-jca-adapters-and-resource-adapters](includes/account-for-the-use-of-jca-adapters-and-resource-adapters-was.md)]\n\n[!INCLUDE [account-for-the-use-of-custom-security-providers-and-jaas](includes/account-for-authentication-and-authorization-was.md)]\n\n[!INCLUDE [determine-whether-was-clustering-is-used](includes/determine-whether-was-clustering-is-used.md)]\n\n[!INCLUDE [determine-whether-the-java-ee-application-client-feature-is-used](includes/determine-whether-the-java-ee-application-client-feature-is-used.md)]\n\n## Migration\n\n### Select a WAS traditional on Azure Virtual Machines offer\n\nThe following offers are available for WAS on Azure Virtual Machines.\n\nDuring the deployment of an offer, you're asked to choose the virtual machine size for your WAS nodes. It's important to consider all aspects of sizing (memory, processor, disk) in your choice of VM size. For more information, see [Sizes for Cloud Services (classic)](/azure/cloud-services/cloud-services-sizes-specs).\n\n* [IBM WebSphere Application Server Single Instance on Azure VM](https://aka.ms/twas-single-portal)\n\n  This offer automates most boilerplate steps to provision a single WebSphere instance on an Azure Virtual Machine. It creates an Application server profile with WAS admin console.\n\n* [IBM WebSphere Application Server Cluster on Azure VMs](https://aka.ms/twas-cluster-portal)\n\n  This offer automates most boilerplate steps to provision a WebSphere cluster on Azure VMs. It creates a deployment manager with WAS admin console on an Azure VM and required numbers of node agents on separated Azure VMs.\n\n### Provision the offer\n\nAfter you've selected which offer to start with, provision that offer by following the instructions in [Deploy WebSphere Application Server (traditional) Cluster on Azure Virtual Machines](../ee/traditional-websphere-application-server-virtual-machines.md).\n\n### Migrate the profiles\n\nAfter you've provisioned the offer, you can examine the profile configuration. For more information, see [Profile concepts](https://www.ibm.com/docs/en/was-nd/9.0.5?topic=mpdios-profile-concepts) in the IBM documentation.\n\n### Connect the databases\n\nAfter you've migrated the profiles, you can connect the databases by following the instructions in [Configuring the WebSphere Application Server data source](https://www.ibm.com/docs/en/was/9.0.5?topic=SSEQTP_9.0.5/com.ibm.websphere.nd.multiplatform.doc/ae/twim_fedmap_datasconf.htm) in the IBM documentation.\n\n### Account for KeyStores\n\nYou must account for the migration of any SSL KeyStores used by your application. For more information, see [Keystore configurations for SSL](https://www.ibm.com/docs/en/was/9.0.5?topic=ssl-keystore-configurations) in the IBM documentation.\n\n### Connect the JMS sources\n\nAfter you've connected the databases, you can configure JMS by following the instructions at [Setting up JMS in IBM WebSphere Application Server](https://www.ibm.com/docs/en/iis/9.1?topic=jms-setting-up-in-websphere-application-server) in the IBM documentation.\n\n[!INCLUDE [account-for-authentication-and-authorization](includes/account-for-authentication-and-authorization-was.md)]\n\n### Account for logging\n\nYou can configure Elastic Stack by following the instructions at [Analyzing WebSphere Application Server logs with Elastic Stack](https://www.ibm.com/docs/en/was/9.0.5?topic=tools-analyzing-websphere-application-server-logs-elastic-stack) in the IBM documentation. Azure provides support for Elastic. For more information, see [What is Elastic integration with Azure?](/azure/partner-solutions/elastic/overview) You can combine the knowledge in these two resources to achieve an Azure-optimized logging solution for WAS on VMs.\n\n### Migrating your applications\n\nThe techniques used to deploy applications from the development team into test, staging, and production servers vary greatly from case to case. In some cases, there's a highly evolved CI/CD platform that results in the applications being deployed to the WebSphere Application Server. In other cases, the process can be more manual. One benefit of using Azure Virtual Machines to migrate WAS traditional applications to the cloud is that your existing processes continue to work.\n\nYou have to configure the Network Security Group that the offer provisions to allow access from your CI/CD pipeline, or manual deployment system. For more information, see [Network security groups](/azure/virtual-network/network-security-groups-overview).\n\n### Testing\n\nYou must configure any in-container tests against applications to access the new servers running within Azure. As with the CI/CD concerns, you must ensure the necessary network security rules allow your tests to access the applications deployed to Azure. For more information, see [Network security groups](/azure/virtual-network/network-security-groups-overview).\n\n## Post-migration\n\nAfter you've reached the migration goals you defined in the [pre-migration](#pre-migration) step, perform some end-to-end acceptance testing to verify that everything works as expected. For guidance on some potential post-migration enhancements, see the following recommendations:\n\n* Use Azure Storage to serve static content mounted to the virtual machines. For more information, see [Attach or detach a data disk for a lab virtual machine in Azure DevTest Labs](/azure/lab-services/devtest-lab-attach-detach-data-disk).\n\n* Deploy your applications to your migrated WAS cluster with Azure DevOps. For more information, see [Get started with Azure DevOps documentation](/azure/devops/get-started).\n\n* If you deployed WAS traditional with Azure Application Gateway, you may want to do more configuration on the Application Gateway. For more information, see [Application Gateway configuration overview](/azure/application-gateway/configuration-overview).\n\n* Enhance your network topology with advanced load balancing services. For more information, see [Using load-balancing services in Azure](/azure/traffic-manager/traffic-manager-load-balancing-azure).\n\n* Use Azure Managed Identities to managed secrets and assign role based access to Azure resources. For more information, see [What are managed identities for Azure resources?](/azure/active-directory/managed-identities-azure-resources/overview)\n\n* Integrate WAS Java EE authentication and authorization with Microsoft Entra ID. For more information, see [Integrating Microsoft Entra ID with applications getting started guide](/azure/active-directory/manage-apps/plan-an-application-integration).\n\n* Use Azure Key Vault to store any information that functions as a \"secret\". For more information, see [Azure Key Vault basic concepts](/azure/key-vault/basic-concepts).\n"
  },
  {
    "path": "articles/java/migration/migrate-websphere-to-vms-with-ha-dr.md",
    "content": "---\ntitle: \"Tutorial: Migrate WebSphere Application Server to Azure Virtual Machines with high availability and disaster recovery\"\ndescription: Shows how to deploy WebSphere Application Server to Azure Virtual Machines with high availability and disaster recovery.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jiangma\nms.topic: tutorial\nms.date: 01/13/2026\nms.custom:\n  - devx-track-java\n  - devx-track-javaee\n  - devx-track-javaee-websphere\n  - devx-track-javaee-was\n  - devx-track-javaee-was-vm\n  - migration-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Tutorial: Migrate WebSphere Application Server to Azure Virtual Machines with high availability and disaster recovery\n\nThis tutorial shows you a simple and effective way to implement high availability and disaster recovery (HA/DR) for Java using WebSphere Application Server on Azure Virtual Machines (VMs). The solution illustrates how to achieve a low Recovery Time Objective (RTO) and Recovery Point Objective (RPO) using a simple database-driven Jakarta EE application running on WebSphere Application Server. HA/DR is a complex topic, with many possible solutions. The best solution depends on your unique requirements. For other ways to implement HA/DR, see the resources at the end of this article.\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Use Azure optimized best practices to achieve high availability and disaster recovery.\n> * Set up a Microsoft Azure SQL Database failover group in paired regions.\n> * Set up the primary WebSphere cluster on Azure VMs.\n> * Set up disaster recovery for the cluster using Azure Site Recovery.\n> * Set up an Azure Traffic Manager.\n> * Test failover from primary to secondary.\n\nThe following diagram illustrates the architecture you build:\n\n<!-- Diagram source https://github.com/Azure-Samples/azure-cafe/blob/main/diagrams/websphere-on-vms-ha-dr-solution-architecture.pptx -->\n\n:::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/solution-architecture.png\" alt-text=\"Diagram of the solution architecture of WebSphere on Azure VMs with high availability and disaster recovery.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/solution-architecture.png\" border=\"false\":::\n\nAzure Traffic Manager checks the health of your regions and routes the traffic accordingly to the application tier. The primary region has a full deployment of the WebSphere cluster. After the primary region is protected by [Azure Site Recovery](https://azure.microsoft.com/products/site-recovery), you can restore the secondary region during the failover. As a result, the primary region is actively servicing network requests from the users, while the secondary region is passive and activated to receive traffic only when the primary region experiences a service disruption.\n\nAzure Traffic Manager detects the health of the app deployed in the IBM HTTP Server to implement the conditional routing. The geo-failover RTO of the application tier depends on the time for shutting down the primary cluster, restoring the secondary cluster, starting VMs, and running the secondary WebSphere cluster. The RPO depends on the replication policy of Azure Site Recovery and Azure SQL Database. This dependency is because the cluster data is stored and replicated in the local storage of the VMs and the application data is persisted and replicated in the Azure SQL Database failover group.\n\nThe preceding diagram shows **Primary region** and **Secondary region** as the two regions comprising the HA/DR architecture. These regions need to be Azure paired regions. For more information on paired regions, see [Azure cross-region replication](/azure/reliability/cross-region-replication-azure). The article uses East US and West US as the two regions, but they can be any paired regions that make sense for your scenario. For the list of region pairings, see the [Azure paired regions](/azure/reliability/cross-region-replication-azure#azure-paired-regions) section of [Azure cross-region replication](/azure/reliability/cross-region-replication-azure).\n\nThe database tier consists of an Azure SQL Database failover group with a primary server and a secondary server. The read/write listener endpoint always points to the primary server and is connected to the WebSphere cluster in each region. A geo-failover switches all secondary databases in the group to the primary role. For geo-failover RPO and RTO of Azure SQL Database, see [Overview of business continuity with Azure SQL Database](/azure/azure-sql/database/business-continuity-high-availability-disaster-recover-hadr-overview?view=azuresql-db&preserve-view=true).\n\nThis tutorial was written with Azure Site Recovery and the Azure SQL Database service because the tutorial relies on the HA features of these services. Other database choices are possible, but you must consider the HA features of whatever database you choose.\n\n## Prerequisites\n\n* An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n* Make sure you have the `Contributor` role in the subscription. You can verify the assignment by following the steps in [List Azure role assignments using the Azure portal](/azure/role-based-access-control/role-assignments-list-portal).\n* Prepare a local machine with Windows, Linux, or macOS installed.\n* Install and set up [Git](/devops/develop/git/install-and-set-up-git).\n* Install a Java SE implementation, version 17 or later - for example, [the Microsoft build of OpenJDK](/java/openjdk).\n* Install [Maven](https://maven.apache.org/download.cgi), version 3.9.3 or later.\n\n## Set up an Azure SQL Database failover group in paired regions\n\nIn this section, you create an Azure SQL Database failover group in paired regions for use with your WebSphere clusters and app. In a later section, you configure WebSphere to store its session data to this database. This practice references [Creating a table for session persistence](https://www.ibm.com/docs/en/was-nd/9.0.5?topic=persistence-creating-table-session).\n\nFirst, create the primary Azure SQL Database by following the Azure portal steps in [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal). Follow the steps up to, but not including, the \"Clean up resources\" section. Use the following directions as you go through the article, then return to this article after you create and configure the Azure SQL Database:\n\n1. When you reach the section [Create a single database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal#create-a-single-database), use the following steps:\n   1. In step 4 for creating new resource group, save aside the **Resource group name** value - for example, `myResourceGroup`.\n   1. In step 5 for database name, save aside the **Database name** value - for example, `mySampleDatabase`.\n   1. In step 6 for creating the server, use the following steps:\n      1. Fill in a unique server name - for example, `sqlserverprimary-mjg022624`.\n      1. For **Location**, select **(US) East US**.\n      1. For **Authentication method**, select **Use SQL authentication**.\n      1. Save aside the **Server admin login** value - for example, `azureuser`.\n      1. Save aside the **Password** value.\n   1. In step 8, for **Workload environment**, select **Development**. Look at the description and consider other options for your workload.\n   1. In step 11, for **Backup storage redundancy**, select **Locally-redundant backup storage**. Consider other options for your backups. For more information, see the [Backup storage redundancy](/azure/azure-sql/database/automated-backups-overview?view=azuresql-db&preserve-view=true#backup-storage-redundancy) section of [Automated backups in Azure SQL Database](/azure/azure-sql/database/automated-backups-overview?view=azuresql-db&preserve-view=true).\n   1. In step 14, in the **Firewall rules** configuration, for **Allow Azure services and resources to access this server**, select **Yes**.\n\n1. When you reach the section [Query the database](/azure/azure-sql/database/single-database-create-quickstart?view=azuresql-db&preserve-view=true&tabs=azure-portal#query-the-database), use the following steps:\n   1. In step 3, enter your **SQL authentication** server admin sign-in information to sign in.\n\n      > [!NOTE]\n      > If sign-in fails with an error message similar to **Client with IP address 'xx.xx.xx.xx' is not allowed to access the server**, select **Allowlist IP xx.xx.xx.xx on server \\<your-sqlserver-name\\>** at the end of the error message. Wait until the server firewall rules complete updating, then select **OK** again.\n\n   1. After you run the sample query in step 5, clear the editor and enter the following query, then select **Run** again:\n\n      ```sql\n      CREATE TABLE sessions (\n         ID VARCHAR(128) NOT NULL,\n         PROPID VARCHAR(128) NOT NULL,\n         APPNAME VARCHAR(128) NOT NULL,\n         LISTENERCNT SMALLINT,\n         LASTACCESS BIGINT,\n         CREATIONTIME BIGINT,\n         MAXINACTIVETIME INT,\n         USERNAME VARCHAR(256),\n         SMALL VARBINARY(MAX),\n         MEDIUM VARCHAR(MAX),\n         LARGE VARBINARY(MAX)\n      );\n      ```\n\n      After a successful run, you should see the message **Query succeeded: Affected rows: 0**.\n\n      The database table `sessions` is used for storing session data for your WebSphere app. The WebSphere cluster data including transaction logs is persisted to local storage of VMs where the cluster is deployed.\n\nThen, create an Azure SQL Database failover group by following the Azure portal steps in [Configure a failover group for Azure SQL Database](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db). You just need the following sections: [Create failover group](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#create-failover-group) and [Test planned failover](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#test-planned-failover). Use the following steps as you go through the article, then return to this article after you create and configure the Azure SQL Database failover group:\n\n1. In the section [Create failover group](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#create-failover-group), use the following steps:\n   1. In step 5 for creating the failover group, enter and save aside the unique failover group name - for example, `failovergroup-mjg022624`.\n   1. In step 5 for configuring the server, select the option to create a new secondary server and then use the following steps:\n      1. Enter a unique server name - for example, `sqlserversecondary-mjg022624`.\n      1. Enter the same server admin and password as your primary server.\n      1. For **Location**, select **(US) West US**.\n      1. Make sure **Allow Azure services to access server** is selected.\n   1. In step 5 for configuring the **Databases within the group**, select the database you created in the primary server - for example, `mySampleDatabase`.\n\n1. After you complete all the steps in the section [Test planned failover](/azure/azure-sql/database/failover-group-configure-sql-db?view=azuresql-db&preserve-view=true&tabs=azure-portal&pivots=azure-sql-single-db#test-planned-failover), keep the failover group page open and use it for the failover test of the WebSphere clusters later.\n\n> [!NOTE]\n> This article guides you to create an Azure SQL Database single database with SQL authentication. A more secure practice is to use [Microsoft Entra authentication for Azure SQL](/azure/azure-sql/database/authentication-aad-overview?preserve-view=true&view=azuresql-db) for authenticating the database server connection. SQL authentication is required for the WebSphere cluster to connect to the database for session persistence later. For more information, see [Configuring for database session persistence](https://www.ibm.com/docs/en/was-nd/9.0.5?topic=sessions-configuring-database-session-persistence).\n\n## Set up the primary WebSphere cluster on Azure VMs\n\nIn this section, you create the primary WebSphere clusters on Azure VMs using the [IBM WebSphere Application Server Cluster on Azure VMs](https://aka.ms/twas-cluster-portal) offer. The secondary cluster is restored from the primary cluster during the failover using Azure Site Recovery later.\n\n### Deploy the primary WebSphere cluster\n\nFirst, open the [IBM WebSphere Application Server Cluster on Azure VMs](https://aka.ms/twas-cluster-portal) offer in your browser and select **Create**. You should see the **Basics** pane of the offer.\n\nUse the following steps to fill out the **Basics** pane:\n\n1. Ensure that the value shown for **Subscription** is the same one that has the roles listed in the prerequisites section.\n1. In the **Resource group** field, select **Create new** and fill in a unique value for the resource group - for example, `was-cluster-eastus-mjg022624`.\n1. Under **Instance details**, for **Region**, select **East US**.\n1. For **Deploy with existing WebSphere entitlement or with evaluation license?**, select **Evaluation** for this tutorial. You can also select **Entitled** and provide your IBMid credential.\n1. Select **I have read and accept the IBM License Agreement.**.\n1. Leave the defaults for other fields.\n1. Select **Next** to go to the **Cluster configuration** pane.\n\n:::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/portal-basics.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WebSphere Application Server Cluster on Azure VMs Basics pane.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/portal-basics.png\":::\n\nUse the following steps to fill out the **Cluster configuration** pane:\n\n1. For **Password for VM administrator**, provide a password. For better security, consider using **SSH Public Key** as the VM authentication type.\n1. For **Password for WebSphere administrator**, provide a password. Save aside the username and password for **WebSphere administrator**.\n1. Leave the defaults for other fields.\n1. Select **Next** to go to the **Load balancer** pane.\n\n:::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/portal-cluster-config.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WebSphere Application Server Cluster on Azure VMs Cluster configuration pane.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/portal-cluster-config.png\":::\n\nUse the following steps to fill out the **Load balancer** pane:\n\n1. For **Password for VM administrator**, provide a password. For better security, consider using **SSH Public Key** as the VM authentication.\n1. For **Password for IBM HTTP Server administrator**, provide a password.\n1. Leave the defaults for other fields.\n1. Select **Next** to go to the **Networking** pane.\n\n:::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/portal-load-balancer.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WebSphere Application Server Cluster on Azure VMs Load balancer pane.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/portal-load-balancer.png\":::\n\nYou should see all fields prepopulated with the defaults in the **Networking** pane. Select **Next** to go to the **Database** pane.\n\n:::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/portal-networking.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WebSphere Application Server Cluster on Azure VMs Networking pane.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/portal-networking.png\":::\n\nThe following steps show you how to fill out the **Database** pane:\n\n1. For **Connect to database?**, select **Yes**.\n1. For **Choose database type**, select **Microsoft SQL Server** .\n1. For **JNDI Name**, enter **jdbc/WebSphereCafeDB**.\n1. For **Data source connection string (jdbc:sqlserver://\\<host\\>:\\<port\\>;database=\\<database\\>)**, replace the placeholders with the values you saved aside in the preceding section for the failover group for the Azure SQL Database - for example, `jdbc:sqlserver://failovergroup-mjg022624.database.windows.net:1433;database=mySampleDatabase`.\n1. For **Database username**, enter the server admin sign-in name and the failover group name you saved aside in the preceding section - for example, `azureuser@failovergroup-mjg022624`.\n   > [!NOTE]\n   > Be extra careful to use the correct database server hostname and database username for the failover group, instead of the server hostname and username from the primary or backup database. By using the values from the failover group, you are, in effect, telling WebSphere to talk to the failover group. However, ss far as WebSphere is concerned, it's just a normal database connection.\n1. Enter the server admin sign-in password that you saved aside previously for **Database Password**. Enter the same value for **Confirm password**.\n1. Leave the defaults for the other fields.\n1. Select **Review + create**.\n1. Wait until **Running final validation...** successfully completes, then select **Create**.\n\n:::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/portal-database.png\" alt-text=\"Screenshot of the Azure portal that shows the IBM WebSphere Application Server Cluster on Azure VMs Database pane.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/portal-database.png\":::\n\n> [!NOTE]\n> This article guides you to connect to an Azure SQL Database with SQL authentication. A more secure practice is to use [Microsoft Entra authentication for Azure SQL](/azure/azure-sql/database/authentication-aad-overview?preserve-view=true&view=azuresql-db) for authenticating the database server connection. SQL authentication is required for the WebSphere cluster to connect to the database for session persistence later. For more information, see [Configuring for database session persistence](https://www.ibm.com/docs/en/was-nd/9.0.5?topic=sessions-configuring-database-session-persistence).\n\nAfter a while, you should see the **Deployment** page where **Deployment is in progress** is displayed.\n\n> [!NOTE]\n> If you see any problems during **Running final validation...**, fix them and try again.\n\nDepending on network conditions and other activity in your selected region, the deployment can take up to 25 minutes to complete. After that, you should see the text **Your deployment is complete** displayed on the deployment page.\n\n### Verify the deployment of the cluster\n\nYou deployed an IBM HTTP Server (IHS) and a WebSphere Deployment Manager (Dmgr) in the cluster. The IHS acts as load balancer for all application servers in the cluster. The Dmgr provides a web console for cluster configuration.\n\nUse the following steps to verify whether the IHS and Dmgr console work before moving to next step:\n\n1. Return to the **Deployment** page, then select **Outputs**.\n1. Copy the value of the property **ihsConsole**. Open that URL in a new browser tab. Note that we don't use `https` for the IHS in this example. You should see a welcome page of the IHS without any error message. If you don't, you must troubleshoot and resolve the issue before you continue. Keep the console open and use it for verifying the app deployment of the cluster later.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/ihs-welcome-screen.png\" alt-text=\"Screenshot of the IBM HTTP Server welcome screen.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/ihs-welcome-screen.png\" border=\"false\":::\n\n1. Copy and save aside the value of the property **adminSecuredConsole**. Open it in a new browser tab. Accept the browser warning for the self-signed TLS certificate. Don't go to production using a self-signed TLS certificate.\n\n   You should see the sign-in page of the **WebSphere Integrated Solutions Console**. Sign in to the console with the user name and password for WebSphere administrator you saved aside previously. If you aren't able to sign in, you must troubleshoot and resolve the issue before you continue. Keep the console open and use it for further configuration of the WebSphere cluster later.\n\nUse the following steps to get the name of the public IP address of the IHS. You use it when you set up the Azure Traffic Manager later.\n\n1. Open the resource group where your cluster is deployed - for example, select **Overview** to switch back to the Overview pane of the deployment page, then select **Go to resource group**.\n1. In the table of resources, find the **Type** column. Select it to sort by type of resource.\n1. Find the **Public IP address** resource prefixed with `ihs`, then copy and save aside its name.\n\n### Configure the cluster\n\nFirst, use the following steps to enable the option **Synchronize changes with Nodes** so that any configuration can be automatically synchronized to all application servers:\n\n1. Switch back to the WebSphere Integrated Solutions Console and sign in again if you're signed out.\n1. In the navigation pane, select **System administration** > **Console Preferences**.\n1. In the **Console Preferences** pane, select **Synchronize changes with Nodes**, and then select **Apply**. You should see the message **Your preferences have been changed.**\n\nThen, use the following steps to configure database distributed sessions for all application servers:\n\n1. In the navigation pane, select **Servers** > **Server Types** > **WebSphere application servers**.\n1. In the **Application servers** pane, you should see 3 application servers listed. For each application server, use the following instructions to configure the database distributed sessions:\n   1. In the table under the text **You can administer the following resources**, select the hyperlink for the application server, which starts with `MyCluster`.\n   1. In the **Container Settings** section, select **Session management**.\n   1. In the **Additional Properties** section, select **Distributed environment settings**.\n   1. For **Distributed sessions**, select **Database (Supported for Web container only.)**.\n   1. Select **Database** and use the following steps:\n      1. For **Datasource JNDI name**, enter **jdbc/WebSphereCafeDB**.\n      1. For **User ID**, enter the server admin sign-in name and the failover group name that you saved aside in the preceding section - for example, `azureuser@failovergroup-mjg022624`.\n      1. Fill in the Azure SQL server admin sign-in password that you saved aside previously for **Password**.\n      1. For **Table space name**, enter **sessions**.\n      1. Select **Use multi row schema**.\n      1. Select **OK**. You're directed back to the **Distributed environment settings** pane.\n   1. Under the **Additional Properties** section, select **Custom tuning parameters**.\n   1. For **Tuning level**, select **Low (optimize for failover)**.\n   1. Select **OK**.\n   1. Under **Messages**, select **Save**. Wait until completion.\n   1. Select **Application servers** from the top breadcrumb bar. You're directed back to the **Application servers** pane.\n1. In the navigation pane, select **Servers** > **Clusters** > **WebSphere application server clusters**.\n1. In the **WebSphere application server clusters** pane, you should see the cluster `MyCluster` listed. Select the checkbox next to **MyCluster**.\n1. Select **Ripplestart**.\n1. Wait until the cluster is restarted. You can select the **Status** icon and if the new window doesn't show **Started**, then switch back to the console and refresh the web page after a while. Repeat the operation until you see **Started**. You might see **Partial Start** before reaching the state **Started**\n\nKeep the console open and use it for app deployment later.\n\n### Deploy a sample app\n\nThis section shows you how to deploy and run a sample CRUD Java/Jakarta EE application on a WebSphere cluster for disaster recovery failover test later.\n\nYou configured application servers to use the datasource `jdbc/WebSphereCafeDB` to store session data previously, which enables failover and load balancing across a cluster of WebSphere application servers. The sample app also configures a [persistence schema](https://github.com/Azure-Samples/websphere-cafe/blob/main/websphere-cafe-web/src/main/resources/META-INF/persistence.xml#L7) to persist application data `coffee` in the same datasource `jdbc/WebSphereCafeDB`.\n\nFirst, use the following commands to download, build, and package the sample:\n\n```bash\ngit clone https://github.com/Azure-Samples/websphere-cafe\ncd websphere-cafe\ngit checkout 20240326\nmvn clean package\n```\n\nIf you see a message about being in a `Detached HEAD` state, this message is safe to ignore.\n\nThe package should be successfully generated and located at **\\<parent-path-to-your-local-clone\\>/websphere-cafe/websphere-cafe-application/target/websphere-cafe.ear**. If you don't see the package, you must troubleshoot and resolve the issue before you continue.\n\nThen, use the following steps to deploy the sample app to the cluster:\n\n1. Switch back to the WebSphere Integrated Solutions Console and sign in again if you're signed out.\n1. In the navigation pane, select **Applications** > **Application Types** > **WebSphere enterprise applications**.\n1. In the **Enterprise Applications** pane, select **Install** > **Choose File**. Then, find the package located at **\\<parent-path-to-your-local-clone\\>/websphere-cafe/websphere-cafe-application/target/websphere-cafe.ear** and select **Open**. Select **Next** > **Next** > **Next**.\n1. In the **Map modules to servers** pane, press <kbd>Ctrl</kbd> and select all the items listed under **Clusters and servers**. Select the checkbox next to **websphere-cafe.war**. Select **Apply**. Select **Next** until you see the **Finish** button.\n1. Select **Finish** > **Save**, then wait until completion. Select **OK**.\n1. Select the installed application `websphere-cafe`, and then select **Start**. Wait until you see messages indicating application successfully started. If you aren't able to see the successful message, you must troubleshoot and resolve the issue before you continue.\n\nNow, use the following steps to verify that the app is running as expected:\n\n1. Switch back to the IHS console. Append the context root `/websphere-cafe/` of the deployed app to the address bar - for example, `http://ihs70685e.eastus.cloudapp.azure.com/websphere-cafe/`, and then press <kbd>Enter</kbd>. You should see the welcome page of the sample app.\n1. Create a new coffee with a name and price - for example, **Coffee 1** with price **$10** - which is persisted into both the application data table and the session table of the database. The UI that you see should be similar to the following screenshot:\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/sample-app-ui.png\" alt-text=\"Screenshot of the sample application UI.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/sample-app-ui.png\":::\n\nIf your UI doesn't look similar, troubleshoot and resolve the issue you continue.\n\n## Set up disaster recovery for the cluster using Azure Site Recovery\n\nIn this section, you set up disaster recovery for Azure VMs in the primary cluster using Azure Site Recovery, by following the steps in [Tutorial: Set up disaster recovery for Azure VMs](/azure/site-recovery/azure-to-azure-tutorial-enable-replication). You just need the following sections: [Create a Recovery Services vault](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#create-a-recovery-services-vault) and [Enable replication](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#enable-replication). Pay attention to the following steps as you go through the article, then return to this article after the primary cluster is protected:\n\n1. In the section [Create a Recovery Services vault](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#create-a-recovery-services-vault), use the following steps:\n   1. In step 5 for **Resource group**, create a new resource group with a unique name in your subscription - for example, `was-cluster-westus-mjg022624`.\n   1. In step 6 for **Vault name**, provide a vault name - for example, `recovery-service-vault-westus-mjg022624`.\n   1. In step 7 for **Region**, select **West US**.\n   1. Before you select **Review + create** in step 8, select **Next: Redundancy**. In the **Redundancy** pane, select **Geo-redundant** for **Backup Storage Redundancy** and **Enable** for **Cross Region Restore**.\n\n      > [!NOTE]\n      > Make sure you select **Geo-redundant** for **Backup Storage Redundancy** and **Enable** for **Cross Region Restore** in the **Redundancy** pane. Otherwise the storage of the primary cluster can't be replicated to the secondary region.\n\n   1. Enable Site Recovery by following the steps in the section [Enable Site Recovery](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#enable-site-recovery).\n\n1. When you reach the section [Enable replication](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#enable-replication), use the following steps:\n   1. In the section [Select source settings](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#select-source-settings), use the following steps:\n      1. For **Region**, select **East US**.\n      1. For **Resource group**, select the resource where the primary cluster is deployed - for example, `was-cluster-eastus-mjg022624`.\n\n         > [!NOTE]\n         > If the desired resource group is not listed, you can select West US for the region first, and then switch back to East US.\n\n      1. Leave the defaults for other fields. Select **Next**.\n   1. In the section [Select the VMs](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#select-the-vms), for **Virtual machines**, select all five VMs listed, and then select **Next**.\n   1. In the section [Review replication settings](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#review-replication-settings), use the following steps:\n      1. For **Target location**, select **West US**.\n      1. For **Target resource group**, select the resource group where the service recovery vault is deployed - for example, `was-cluster-westus-mjg022624`.\n      1. Note down the new failover virtual network and failover subnet, which are mapped from ones in the primary region.\n      1. Leave the defaults for other fields.\n      1. Select **Next**.\n   1. In the section [Manage](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#manage), use the following steps:\n      1. For **Replication policy**, use the default policy **24-hour-retention-policy**. You can also create a new policy for your business.\n      1. Leave the defaults for other fields.\n      1. Select **Next**.\n   1. In the section [Review](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#review), use the following steps:\n      1. After selecting **Enable replication**, notice the message **Creating Azure resources. Don't close this blade.** displayed at the bottom of the page. Do nothing and wait until the pane is closed automatically. You're redirected to the **Site Recovery** page.\n      1. Under **Protected items**, select **Replicated items**. Initially, there are no items listed because the replication is still in progress. The replication takes about one hour to complete. Refresh the page periodically until you see that all the VMs are in the **Protected** state, as shown in the following example screenshot:\n\n         :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/replicated-items-protected.png\" alt-text=\"Screenshot of the Azure portal that shows VMs that are replicated and protected.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/replicated-items-protected.png\":::\n\nNext, create a recovery plan to include all replicated items so that they can fail over together. Use the instructions in [Create a recovery plan](/azure/site-recovery/site-recovery-create-recovery-plans#create-a-recovery-plan), with the following customizations:\n\n1. In step 2, enter a name for the plan - for example, `recovery-plan-mjg022624`.\n1. In step 3, for **Source**, select **East US** and for **Target**, select **West US**.\n1. In step 4 for **Select items**, select all five protected VMs for this tutorial.\n\nNext, you create a recovery plan. Keep the page open so you can use it for failover testing later.\n\n### Further network configuration for the secondary region\n\nYou also need further network configuration to enable and protect external access to the secondary region in a failover event. Use the following steps for this configuration:\n\n1. Create a public IP address for Dmgr in the secondary region by following the instructions in [Quickstart: Create a public IP address using the Azure portal](/azure/virtual-network/ip-services/create-public-ip-portal?tabs=option-1-create-public-ip-standard), with the following customizations:\n   1. For **Resource group**, select the resource group where the service recovery vault is deployed - for example, `was-cluster-westus-mjg022624`.\n   1. For **Region**, select **(US) West US**.\n   1. For **Name**, enter a value - for example, `dmgr-public-ip-westus-mjg022624`.\n   1. For **DNS name label**, enter a unique value - for example, `dmgrmjg022624`.\n\n1. Create another public IP address for IHS in the secondary region by following the same guide, with the following customizations:\n   1. For **Resource group**, select the resource group where the service recovery vault is deployed - for example, `was-cluster-westus-mjg022624`.\n   1. For **Region**, select **(US) West US**.\n   1. For **Name**, enter a value - for example, `ihs-public-ip-westus-mjg022624`. Write it down.\n   1. For **DNS name label**, enter a unique value - for example, `ihsmjg022624`.\n\n1. Create a network security group in the secondary region by following the instructions in the [Create a network security group](/azure/virtual-network/manage-network-security-group?tabs=network-security-group-portal#create-a-network-security-group) section of [Create, change, or delete a network security group](/azure/virtual-network/manage-network-security-group?tabs=network-security-group-portal), with the following customizations:\n   1. For **Resource group**, select the resource group where the service recovery vault is deployed - for example, `was-cluster-westus-mjg022624`.\n   1. For **Name**, enter a value - for example, `nsg-westus-mjg022624`.\n   1. For **Region**, select **West US**.\n\n1. Create an inbound security rule for the network security group by following the instructions in the [Create a security rule](/azure/virtual-network/manage-network-security-group?tabs=network-security-group-portal#create-a-security-rule) section of the same article, with the following customizations:\n   1. In step 2, select the network security group you created - for example, `nsg-westus-mjg022624`.\n   1. In step 3, select **Inbound security rules**.\n   1. In step 4, customize the following settings:\n      1. For **Destination port ranges**, enter **9060,9080,9043,9443,80**.\n      1. For **Protocol**, select **TCP**.\n      1. For **Name**, enter **ALLOW_HTTP_ACCESS**.\n\n1. Associate the network security group with a subnet by following the instructions in the [Associate or dissociate a network security group to or from a subnet](/azure/virtual-network/manage-network-security-group?tabs=network-security-group-portal#associate-or-dissociate-a-network-security-group-to-or-from-a-subnet) section of the same article, with the following customizations:\n   1. In step 2, select the network security group you created - for example, `nsg-westus-mjg022624`.\n   1. Select **Associate** to associate the network security group to the failover subnet you noted down previously.\n\n## Set up an Azure Traffic Manager\n\nIn this section, you create an Azure Traffic Manager for distributing traffic to your public facing applications across the global Azure regions. The primary endpoint points to the public IP address of the IHS in the primary region. The secondary endpoint points to the public IP address of the IHS in the secondary region.\n\nCreate an Azure Traffic Manager profile by following the instructions in [Quickstart: Create a Traffic Manager profile using the Azure portal](/azure/traffic-manager/quickstart-create-traffic-manager-profile). You just need the following sections: [Create a Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#create-a-traffic-manager-profile) and [Add Traffic Manager endpoints](/azure/traffic-manager/quickstart-create-traffic-manager-profile#add-traffic-manager-endpoints). You must skip the sections where you're directed to create App Service resources. Use the following steps as you go through these sections, then return to this article after you create and configure the Azure Traffic Manager.\n\n1. In the section [Create a Traffic Manager profile](/azure/traffic-manager/quickstart-create-traffic-manager-profile#create-a-traffic-manager-profile), in step 2, for **Create Traffic Manager profile**, use the following steps:\n   1. Save aside the unique Traffic Manager profile name for **Name** - for example, `tmprofile-mjg022624`.\n   1. Save aside the new resource group name for **Resource group** - for example, `myResourceGroupTM1`.\n\n1. When you reach the section [Add Traffic Manager endpoints](/azure/traffic-manager/quickstart-create-traffic-manager-profile#add-traffic-manager-endpoints), use the following steps:\n   1. After you open the Traffic Manager profile in step 2, in the **Configuration** page, use the following steps:\n      1. For **DNS time to live (TTL)**, enter **10**.\n      1. Under **Endpoint monitor settings**, for **Path**, enter **/websphere-cafe/**, which is the context root of the deployed sample app.\n      1. Under **Fast endpoint failover settings**, use the following values:\n         - For **Probing internal**, select **10**.\n         - For **Tolerated number of failures**, enter **3**.\n         - For **Probe timeout**, use **5**.\n      1. Select **Save**. Wait until it completes.\n   1. In step 4 for adding the primary endpoint `myPrimaryEndpoint`, use the following steps:\n      1. For **Target resource type**, select **Public IP address**.\n      1. Select the **Choose public IP address** dropdown and enter the name of the public IP address of the IHS in the East US region that you saved aside previously. You should see one entry matched. Select it for **Public IP address**.\n   1. In step 6 for adding a failover/secondary endpoint `myFailoverEndpoint`, use the following steps:\n      1. For **Target resource type**, select **Public IP address**.\n      1. Select the **Choose public IP address** dropdown and enter the name of the public IP address of the IHS in the West US region that you saved aside previously. You should see one entry matched. Select it for **Public IP address**.\n   1. Wait for a while. Select **Refresh** until the **Monitor status** for endpoint `myPrimaryEndpoint` is **Online** and **Monitor status** for endpoint `myFailoverEndpoint` is **Degraded**.\n\nNext, use the following steps to verify that the sample app deployed to the primary WebSphere cluster is accessible from the Traffic Manager profile:\n\n1. Select **Overview** for the Traffic Manager profile you created.\n1. Select and copy the domain name system (DNS) name of the Traffic Manager profile, then append it with `/websphere-cafe/` - for example, `http://tmprofile-mjg022624.trafficmanager.net/websphere-cafe/`.\n1. Open the URL in a new tab of the browser. You should see the coffee you created previously listed on the page.\n1. Create another coffee with a different name and price - for example, **Coffee 2** with price **20** - which is persisted into both application data table and session table of the database. The UI that you see should be similar to the following screenshot:\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/sample-app-ui-2nd-coffee.png\" alt-text=\"Screenshot of the sample application UI with the second coffee.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/sample-app-ui-2nd-coffee.png\":::\n\nIf your UI doesn't look similar, troubleshoot and resolve the issue before you continue. Keep the console open and use it for failover test later.\n\nNow you set up the Traffic Manager profile. Keep the page open and you use it for monitoring the endpoint status change in a failover event later.\n\n## Test failover from primary to secondary\n\nTo test failover, you manually failover your Azure SQL Database server and cluster, and then fail back using the Azure portal.\n\n### Failover to the secondary site\n\nFirst, use the following steps to failover the Azure SQL Database from the primary server to the secondary server:\n\n1. Switch to the browser tab of your Azure SQL Database failover group - for example, `failovergroup-mjg022624`.\n1. Select **Failover** > **Yes**.\n1. Wait until it completes.\n\nNext, use the following steps to failover the WebSphere cluster with the recovery plan:\n\n1. In the search box at the top of the Azure portal, enter **Recovery Services vaults** and then select **Recovery Services vaults** in the search results.\n1. Select the name of your Recovery Services vault - for example, `recovery-service-vault-westus-mjg022624`.\n1. Under **Manage**, select **Recovery Plans (Site Recovery)**. Select the recovery plan you created - for example, `recovery-plan-mjg022624`.\n1. Select **Failover**. Select **I understand the risk. Skip test failover.**. Leave the default values for other fields and select **OK**.\n\n   > [!NOTE]\n   > You can optionally execute **Test failover** and **Cleanup test failover** to make sure everything works as expected before you test **Failover**. For more information, see [Tutorial: Run a disaster recovery drill for Azure VMs](/azure/site-recovery/azure-to-azure-tutorial-dr-drill). This tutorial tests **Failover** directly to simplify the exercise.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/failover-settings.png\" alt-text=\"Screenshot of the Azure portal that shows the Failover pane.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/failover-settings.png\":::\n\n1. Monitor the failover in notifications until it completes. It takes about 10 minutes for the exercise in this tutorial.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/failover-in-progress.png\" alt-text=\"Screenshot of the Azure portal Notifications pane that shows the failover in progress.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/failover-in-progress.png\":::\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/failover-completed.png\" alt-text=\"Screenshot of the Azure portal Notifications pane that shows the failover completed.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/failover-completed.png\":::\n\n1. Optionally, you can view details of failover job by selecting the failover event - for example, **Failover of 'recovery-plan-mjg022624' is in progress...** - from notifications.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/failover-job-details.png\" alt-text=\"Screenshot of the Azure portal Failover page that shows the failover job details.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/failover-job-details.png\":::\n\nThen, use the following steps to enable the external access to the WebSphere Integrated Solutions Console and sample app in the secondary region:\n\n1. In the search box at the top of the Azure portal, enter **Resource groups** and then select **Resource groups** in the search results.\n1. Select the name of resource group for your secondary region - for example, `was-cluster-westus-mjg022624`. Sort items by **Type** in the **Resource Group** page.\n1. Select **Network Interface** prefixed with `dmgr`. Select **IP configurations** > **ipconfig1**. Select **Associate public IP address**. For **Public IP address**, select the public IP address prefixed with `dmgr`. This address is the one you created previously. In this article, the address is named `dmgr-public-ip-westus-mjg022624`. Select **Save**, and then wait until it completes.\n1. Switch back to the resource group, and select the **Network Interface** prefixed with `ihs`. Select **IP configurations** > **ipconfig1**. Select **Associate public IP address**. For **Public IP address**, select the public IP address prefixed with `ihs`. This address is the one you created previously. In this article, the address is named `ihs-public-ip-westus-mjg022624`. Select **Save**, and then wait until it completes.\n\nNow, use the following steps to verify that the failover works as expected:\n\n1. Find the DNS name label for the public IP address of the Dmgr you created previously. Open the URL of Dmgr WebSphere Integrated Solutions Console in a new browser tab. Don't forget to use `https`. For example, `https://dmgrmjg022624.westus.cloudapp.azure.com:9043/ibm/console`. Refresh the page until you see the welcome page for sign in.\n1. Sign in to the console with the user name and password for WebSphere administrator that you saved aside previously, and then use the following steps:\n   1. In the navigation pane, select **Servers** > **All servers**. In the **Middleware servers** pane, you should see 4 servers listed, including 3 WebSphere application servers consisting of WebSphere cluster `MyCluster` and 1 Web server that is an IHS. Refresh the page until you see that all servers are started.\n\n      :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/middleware-servers.png\" alt-text=\"Screenshot of the Dmgr WebSphere Integrated Solutions Console that shows the Middleware servers page.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/middleware-servers.png\":::\n\n   1. In the navigation pane, select **Applications** > **Application Types** > **WebSphere enterprise applications**. In the **Enterprise Applications** pane, you should see 1 application - `websphere-cafe` - listed and started.\n\n      :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/enterprise-applications-deployed.png\" alt-text=\"Screenshot of the Dmgr WebSphere Integrated Solutions Console that shows the Enterprise Applications page.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/enterprise-applications-deployed.png\":::\n\n   1. To validate the cluster configuration in the secondary region, follow the steps in the [Configure the cluster](#configure-the-cluster) section. You should see that the settings for **Synchronize changes with Nodes** and **Distributed sessions** are replicated to the failover cluster, as shown in the following screenshots:\n\n      :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/synchronize-changes-secondary.png\" alt-text=\"Screenshot of the Dmgr WebSphere Integrated Solutions Console that shows the selected state of the Synchronize changes with Nodes checkbox.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/synchronize-changes-secondary.png\":::\n\n      :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/distributed-sessions-secondary.png\" alt-text=\"Screenshot of Dmgr WebSphere Integrated Solutions Console that shows the Database settings page with the state of the distributed sessions setting.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/distributed-sessions-secondary.png\":::\n\n1. Find the DNS name label for the public IP address of the IHS you created previously. Open the URL of IHS console appended with the root context `/websphere-cafe/`. Note that you must not use `https`. This example doesn't use `https` for IHS - for example, `http://ihsmjg022624.westus.cloudapp.azure.com/websphere-cafe/`. You should see two coffees you created previously listed in the page.\n1. Switch to the browser tab of your Traffic Manager profile, then refresh the page until you see that the **Monitor status** value of the endpoint `myFailoverEndpoint` becomes **Online** and the **Monitor status** value of the endpoint `myPrimaryEndpoint` becomes **Degraded**.\n1. Switch to the browser tab with the DNS name of the Traffic Manager profile - for example, `http://tmprofile-mjg022624.trafficmanager.net/websphere-cafe/`. Refresh the page and you should see the same data persisted in the application data table and the session table displayed. The UI that you see should be similar to the following screenshot:\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/sample-app-ui-after-failover.png\" alt-text=\"Screenshot of the sample application UI after failover.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/sample-app-ui-after-failover.png\":::\n\n   If you don't observe this behavior, it might be because the Traffic Manager is taking time to update DNS to point to the failover site. The problem could also be that your browser cached the DNS name resolution result that points to the failed site. Wait for a while and refresh the page again.\n\n### Commit the failover\n\nUse the following steps to commit the failover after you're satisfied the failover result:\n\n1. In the search box at the top of the Azure portal, enter **Recovery Services vaults** and then select **Recovery Services vaults** in the search results.\n1. Select the name of your Recovery Services vault - for example, `recovery-service-vault-westus-mjg022624`.\n1. Under **Manage**, select **Recovery Plans (Site Recovery)**. Select the recovery plan you created - for example, `recovery-plan-mjg022624`.\n1. Select **Commit** > **OK**.\n1. Monitor the commit in notifications until it completes.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/failover-commit-in-progress.png\" alt-text=\"Screenshot of the Azure portal Notifications pane that shows the failover commit in progress.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/failover-commit-in-progress.png\":::\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/failover-commit-completed.png\" alt-text=\"Screenshot of the Azure portal Notifications pane that shows the failover commit completed.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/failover-commit-completed.png\":::\n\n1. Select **Items in recovery plan**. You should see 5 items listed as **Failover committed**.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/replicated-items-failover-committed.png\" alt-text=\"Screenshot of the Azure portal that shows the replicated items as failover committed.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/replicated-items-failover-committed.png\":::\n\n### Disable the replication\n\nUse the following steps to disable the replication for items in the recovery plan and then delete the recovery plan:\n\n1. For each item in **Items in recovery plan**, select the ellipsis button (**...**), and then select **Disable Replication**.\n1. If you're prompted to provide a reason for disabling protection for this virtual machine, select one you prefer - for example, **I completed migrating my application**. Select **OK**.\n1. Repeat step 1 until you disable replication for all items.\n1. Monitor the process in notifications until it completes.\n\n   :::image type=\"content\" source=\"media/migrate-websphere-to-vms-with-ha-dr/remove-replicated-items-completed.png\" alt-text=\"Screenshot of the Azure portal Notifications pane that shows the completed message for removing replicated items.\" lightbox=\"media/migrate-websphere-to-vms-with-ha-dr/remove-replicated-items-completed.png\":::\n\n1. Select **Overview** > **Delete**. Select **Yes** to confirm deletion.\n\n### Prepare for fail back: reprotect the failover site\n\nThe secondary region is now the failover site and active. You should reprotect it in your primary region.\n\nFirst, use the following steps to clean up resources that are unused and that the Azure Site Recovery service is going to replicate in your primary region later. You can't just delete the resource group, because the site recovery restores resources into the existing resource group.\n\n1. In the search box at the top of the Azure portal, enter **Resource groups** and then select **Resource groups** in the search results.\n1. Select the name of resource group for your primary region - for example, `was-cluster-eastus-mjg022624`. Sort items by **Type** on the **Resource Group** page.\n1. Use the following steps to delete the virtual machines:\n   1. Select the **Type** filter, then select **Virtual machine** from the **Value** dropdown list.\n   1. Select **Apply**.\n   1. Select all virtual machines, select **Delete**, then enter **delete** to confirm deletion.\n   1. Select **Delete**.\n   1. Monitor the process in notifications until it completes.\n1. Use the following steps to delete the disks:\n   1. Select the **Type** filter, then select **Disks** from the **Value** dropdown list.\n   1. Select **Apply**.\n   1. Select all disks, select **Delete**, then enter **delete** to confirm deletion.\n   1. Select **Delete**.\n   1. Monitor the process in notifications, and wait until it completes.\n1. Use the following steps to delete the endpoints:\n   1. Select the **Type** filter, select **Private endpoint** from the **Value** dropdown list.\n   1. Select **Apply**.\n   1. Select all private endpoints, select **Delete**, then enter **delete** to confirm deletion.\n   1. Select **Delete**.\n   1. Monitor the process in notifications until it completes. Ignore this step if type **Private endpoint** isn't listed.\n1. Use the following steps to delete the network interfaces:\n   1. Select the **Type** filter > select **Network Interface** from the **Value** dropdown list.\n   1. Select **Apply**.\n   1. Select all network interfaces, select **Delete**, then enter **delete** to confirm deletion.\n   1. Select **Delete**. Monitor the process in notifications until it completes.\n1. Use the following steps to delete storage accounts:\n   1. Select the **Type** filter > select **Storage account** from the **Value** dropdown list.\n   1. Select **Apply**.\n   1. Select all storage accounts, select **Delete**, then enter **delete** to confirm deletion.\n   1. Select **Delete**. Monitor the process in notifications until it completes.\n\nNext, use the same steps in the [Set up disaster recovery for the cluster using Azure Site Recovery](#set-up-disaster-recovery-for-the-cluster-using-azure-site-recovery) section for the primary region, except for the following differences:\n\n1. For the [Create a Recovery Services vault](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#create-a-recovery-services-vault) section, use the following steps:\n   1. Select the resource group deployed in the primary region - for example, `was-cluster-eastus-mjg022624`.\n   1. Enter a different name for the service vault - for example, `recovery-service-vault-eastus-mjg022624`.\n   1. For **Region**, select **East US**.\n1. For **Enable replication**, use the following steps:\n   1. For **Region** in **Source**, select **West US**.\n   1. For **Replication settings**, use the following steps:\n      1. For **Target resource group**, select the existing resource group deployed in the primary region - for example, `was-cluster-eastus-mjg022624`.\n      1. For **Failover virtual network**, select the existing virtual network in the primary region.\n1. For **Create a recovery plan**, for **Source**, select **West US**, and for **Target**, select **East US**.\n1. Skip the steps in the section [Further network configuration for the secondary region](#further-network-configuration-for-the-secondary-region) because you created and configured these resources previously.\n\n> [!NOTE]\n> You might notice that Azure Site Recovery supports VM reprotection when the target VM exists. For more information, see the [Reprotect the VM](/azure/site-recovery/azure-to-azure-tutorial-failover-failback#reprotect-the-vm) section of [Tutorial: Fail over Azure VMs to a secondary region](/azure/site-recovery/azure-to-azure-tutorial-failover-failback). Due to the approach we're taking for WebSphere, this feature doesn't work. The reason is that the only changes between the source disk and the target disk are synchronized for the WebSphere cluster, based on the verification result. To replace the functionality of the VM reprotection feature, this tutorial establishes a new replication from the secondary site to the primary site after failover. The entire disks are copied from the failed over region to the primary region. For more information, see the [What happens during reprotection?](/azure/site-recovery/azure-to-azure-how-to-reprotect#what-happens-during-reprotection) section of [Reprotect failed over Azure virtual machines to the primary region](/azure/site-recovery/azure-to-azure-how-to-reprotect).\n\n### Fail back to the primary site\n\nUse the same steps in the [Failover to the secondary site](#failover-to-the-secondary-site) section to fail back to the primary site including database server and cluster, except for the following differences:\n\n1. Select the recovery service vault deployed in the primary region - for example, `recovery-service-vault-eastus-mjg022624`.\n1. Select the resource group deployed in the primary region - for example, `was-cluster-eastus-mjg022624`.\n1. After you enable the external access to the WebSphere Integrated Solutions Console and sample app in the primary region, revisit the browser tabs for the WebSphere Integrated Solutions Console and the sample app for the primary cluster you opened previously. Verify that they work as expected. Depending on how much time it took to fail back, you might not see session data displayed in the **New coffee** section of the sample app UI if it expired more than one hour previously.\n1. In the [Commit the failover](#commit-the-failover) section, select your Recovery Services vault deployed in the primary - for example, `recovery-service-vault-eastus-mjg022624`.\n1. In the Traffic Manager profile, you should see that endpoint `myPrimaryEndpoint` becomes **Online** and endpoint `myFailoverEndpoint` becomes **Degraded**.\n1. In the [Prepare for fail back: reprotect the failover site](#prepare-for-fail-back-reprotect-the-failover-site) section, use the following steps:\n   1. The primary region is your failover site and is active, so you should reprotect it in your secondary region.\n   1. Clean up resource deployed in your secondary region - for example, resources deployed in `was-cluster-westus-mjg022624`.\n   1. Use the same steps in the [Set up disaster recovery for the cluster using Azure Site Recovery](#set-up-disaster-recovery-for-the-cluster-using-azure-site-recovery) section for protecting the primary region in the secondary region, except for the following changes:\n      1. Skip the steps in the [Create a Recovery Services vault](/azure/site-recovery/azure-to-azure-tutorial-enable-replication#create-a-recovery-services-vault) section because you created one previously - for example, `recovery-service-vault-westus-mjg022624`.\n      1. For **Enable replication** > **Replication settings** > **Failover virtual network**, select the existing virtual network in the secondary region.\n      1. Skip the steps in the [Further network configuration for the secondary region](#further-network-configuration-for-the-secondary-region) section because you created and configured these resources previously.\n\n## Clean up resources\n\nIf you're not going to continue to use the WebSphere clusters and other components, use the following steps to delete the resource groups to clean up the resources used in this tutorial:\n\n1. Enter the resource group name of Azure SQL Database servers - for example, `myResourceGroup` - in the search box at the top of the Azure portal, and select the matched resource group from the search results.\n1. Select **Delete resource group**.\n1. In **Enter resource group name to confirm deletion**, enter the resource group name.\n1. Select **Delete**.\n1. Repeat steps 1-4 for the resource group of the Traffic Manager - for example, `myResourceGroupTM1`.\n1. In the search box at the top of the Azure portal, enter **Recovery Services vaults** and then select **Recovery Services vaults** in the search results.\n1. Select the name of your Recovery Services vault - for example, `recovery-service-vault-westus-mjg022624`.\n1. Under **Manage**, select **Recovery Plans (Site Recovery)**. Select the recovery plan you created - for example, `recovery-plan-mjg022624`.\n1. Use the same steps in the [Disable the replication](#disable-the-replication) section to remove locks on replicated items.\n1. Repeat steps 1-4 for the resource group of the primary WebSphere cluster - for example, `was-cluster-westus-mjg022624`.\n1. Repeat steps 1-4 for the resource group of the secondary WebSphere cluster - for example, `was-cluster-eastus-mjg022624`.\n\n## Next steps\n\nIn this tutorial, you set up an HA/DR solution consisting of an active-passive application infrastructure tier with an active-passive database tier, and in which both tiers span two geographically different sites. At the first site, both the application infrastructure tier and the database tier are active. At the second site, the secondary domain is restored with Azure Site Recovery service, and the secondary database is on standby.\n\nContinue to explore the following references for more options to build HA/DR solutions and run WebSphere on Azure:\n\n> [!div class=\"nextstepaction\"]\n> [Azure reliability documentation](/azure/reliability)\n> [!div class=\"nextstepaction\"]\n> [Build solutions for high availability](/azure/architecture/high-availability/building-solutions-for-high-availability)\n> [!div class=\"nextstepaction\"]\n> [Automatic failover using Azure Traffic Manager](/azure/networking/disaster-recovery-dns-traffic-manager#automatic-failover-using-azure-traffic-manager)\n> [!div class=\"nextstepaction\"]\n> [Learn more about WebSphere on Azure](../ee/websphere-family.md)\n"
  },
  {
    "path": "articles/java/migration/migration-overview.md",
    "content": "---\ntitle: Migrate Java applications to Azure\ndescription: This topic provides an overview of recommended strategies for migrating Java applications to Azure.\nauthor: KarlErickson\nms.author: karler\nms.topic: upgrade-and-migration-article\nms.date: 01/13/2026\nms.custom: devx-track-java, devx-track-javaee, migration-java, devx-track-extended-java\n---\n\n# Migrate Java applications to Azure\n\nThis article provides an overview of recommended strategies for migrating Java applications to Azure.\n\nThis migration guidance is designed to cover mainstream Java on Azure scenarios, and to provide high-level planning suggestions and considerations. If you'd like to discuss a specific Java app migration scenario with the Microsoft Java on Azure team, fill out the following questionnaire, and a representative will contact you.\n\n> [!div class=\"nextstepaction\"]\n> [Java migration questionnaire](https://aka.ms/migrate-my-Java-app-requested-thru-docs)\n\n## Identifying application type\n\nBefore you select a cloud destination for your Java application, you'll need to identify its application type. Most Java applications are one of the following types:\n\n* Spring applications:\n  * [Spring Boot / JAR applications](#spring-boot--jar-applications)\n  * [Spring applications that use Spring Cloud middleware modules](#spring-applications-that-use-spring-cloud-middleware-modules)\n* [Java EE applications](#java-ee-applications)\n* [Web applications](#web-applications)\n* [Batch / scheduled jobs](#batch--scheduled-jobs)\n\nThese types are described in the following sections.\n\n### Spring Boot / JAR applications\n\nMany newer applications are invoked directly from the command line. These applications still handle web requests, but instead of relying on an application server to provide HTTP request handling, they incorporate HTTP communication and all other dependencies directly into the application package. Such applications are frequently built with frameworks such as Spring Boot, Dropwizard, Micronaut, MicroProfile, Vert.x, and others.\n\nThese applications are packaged into archives with the **.jar** extension (JAR files).\n\n### Spring applications that use Spring Cloud middleware modules\n\nThe microservice architectural style is an approach to developing a single application as a suite of small services. Each service runs in its own process and communicates by using lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and are independently deployable by fully automated deployment machinery. There's a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. Such services are frequently built with frameworks such as Spring Cloud.\n\nThese services are packaged into multiple applications with the **.jar** extension (JAR files).\n\n### Java EE applications\n\nJava EE applications (also referred to as J2EE applications or, more recently, Jakarta EE applications) can contain some, all, or none of the elements of web applications. These applications can also contain and consume many more components as defined by the [Jakarta EE specification](https://jakarta.ee/specifications/platform/).\n\nJava EE applications can be packaged as archives with the **.ear** extension (EAR files) or as archives with the **.war** extension (WAR files).\n\nJava EE applications must be deployed onto Java EE-compliant application servers (such as Oracle WebLogic Server, IBM WebSphere, JBoss EAP, GlassFish, Payara, and others).\n\nApplications that rely only on features provided by the Java EE specification (that is, app-server-independent applications) can be migrated from one compliant application server onto another. If your application is dependent on a specific application server (app-server-dependent), you may need to select an Azure service destination that permits you to host that application server.\n\n### Web applications\n\nWeb applications run inside a [Servlet](https://jakarta.ee/specifications/servlet/) container. Some of these applications use servlet APIs directly, while many use other frameworks that encapsulate servlet APIs, such as Apache Struts, Spring MVC, JavaServer Faces (JSF), and others.\n\nWeb applications are packaged into archives with the **.war** extension (WAR files).\n\n### Batch / scheduled jobs\n\nSome applications are intended to run briefly, execute a particular workload, and then exit rather than wait for requests or user input. Sometimes such jobs need to run once or at regular, scheduled intervals. On premises, such jobs are often invoked from a server's crontab.\n\nThese applications are packaged into archives with the **.jar** extension (JAR files).\n\n> [!NOTE]\n> If your application uses a scheduler (such as Spring Batch or Quartz) to run scheduled tasks, we strongly recommend that you factor such tasks to run outside of the application. If your application scales to multiple instances in the cloud, the same job will run more than once. Furthermore, if your scheduling mechanism uses the host's local time zone, you may experience undesirable behavior when scaling your application across regions.\n\n## Selecting the target Azure service destination\n\nThe following sections show you which service destinations meet your application requirements, and what responsibilities they involve.\n\n### Hosting options grid\n\nUse the following grid to identify potential destinations for your application type. As you can see, Azure Kubernetes Service (AKS) and Azure Virtual Machines support all application types, but they require your team to take on more responsibilities, as shown in the next section.\n\n| Destination&nbsp;→<br><br>Application&nbsp;type&nbsp;↓                             | App<br>Service<br>Java SE | App<br>Service<br>Tomcat | App<br>Service<br>JBoss EAP | Azure Container Apps | AKS           | Virtual<br>Machines |\n|-------------------------------------------------------------------------------------|---------------------------|--------------------------|-----------------------------|----------------------|---------------|---------------------|\n| Spring Boot / JAR applications                                                      | &#x2714;                  |                          |                             | &#x2714;             | &#x2714;      | &#x2714;            |\n| Spring Cloud applications                                                           | &#x2714;                  |                          | &#x2714;                    | &#x2714;             | &#x2714;      | &#x2714;            |\n| Web applications (WAR)                                                              |                           | &#x2714;                 | &#x2714;                    | &#x2714;             | &#x2714;      | &#x2714;            |\n| Java EE applications (WAR \\| EAR)                                                   |                           |                          | &#x2714;                    | &#x2714;             | &#x2714;      | &#x2714;            |\n| Commercial application servers<br>(such as Oracle WebLogic Server or IBM WebSphere) |                           |                          |                             | &#x2714;             | &#x2714;      | &#x2714;            |\n| Application server-level clustering                                                 |                           |                          | &#x2714;                    |                      | &#x2714;      | &#x2714;            |\n| Batch / scheduled jobs                                                              |                           |                          |                             | &#x2714;             | &#x2714;      | &#x2714;            |\n| VNet Integration/Hybrid Connectivity                                                | &#x2714;                  | &#x2714;                 | &#x2714;                    | &#x2714;             | &#x2714;      | &#x2714;            |\n| Azure region availability                                                           | [Details][10]             | [Details][10]            | [Details][10]               | [Details][23]        | [Details][12] | [Details][13]       |\n\n### Ongoing responsibility grid\n\nUse the following grid to understand the responsibility each destination places on your team following migration.\n\nTasks indicated with ![Azure][1] are managed entirely or mostly by Azure. Your team is responsible on a continual basis for the tasks indicated with &#x1F449;. We recommend implementing a robust, highly automated process for fulfilling all such responsibilities.\n\n> [!NOTE]\n> This isn't an exhaustive list of responsibilities.\n\n| Destination&nbsp;→<br><br>Task&nbsp;↓                                       | App<br>Service | Azure<br>Container<br>Apps | AKS                     | Virtual<br>Machines |\n|-----------------------------------------------------------------------------|----------------|----------------------------|-------------------------|---------------------|\n| Updating libraries<br>(including vulnerability remediation)                 | &#x1F449;      | &#x1F449;                  | &#x1F449;               | &#x1F449;           |\n| Updating the application server<br>(including vulnerability remediation)    | ![Azure][1]    | &#x1F449;                  | &#x1F449;               | &#x1F449;           |\n| Updating the Java Runtime<br>(including vulnerability remediation)          | ![Azure][1]    | &#x1F449;                  | &#x1F449;               | &#x1F449;           |\n| Triggering Kubernetes updates<br>(performed by Azure with a manual trigger) | N/A            | ![Azure][1]                | &#x1F449;               | N/A                 |\n| Disaster Recovery                                                           | ![Azure][1]    | &#x1F449;                  | &#x1F449;               | ![Azure][1]         |\n| Reconciling non-backward-compatible Kubernetes API changes                  | N/A            | &#x1F449;                  | &#x1F449;               | N/A                 |\n| Updating container base image<br>(including vulnerability remediation)      | N/A            | &#x1F449;                  | &#x1F449;               | N/A                 |\n| Updating the operating system<br>(including vulnerability remediation)      | ![Azure][1]    | ![Azure][1]                | ![Azure][1]<sup>1</sup> | &#x1F449;           |\n| Detecting and restarting failed instances                                   | ![Azure][1]    | ![Azure][1]                | ![Azure][1]             | &#x1F449;           |\n| Implementing draining and rolling restart for updates                       | ![Azure][1]    | ![Azure][1]                | ![Azure][1]             | &#x1F449;           |\n| Infrastructure management                                                   | ![Azure][1]    | &#x1F449;                  | &#x1F449;               | &#x1F449;           |\n| Monitoring and alert management                                             | &#x1F449;      | &#x1F449;                  | &#x1F449;               |  &#x1F449;                     |\n\n<sup>1</sup> Some security updates might require node reboots, which aren't done automatically. For more information, see [Apply security and kernel updates to Linux nodes in Azure Kubernetes Service (AKS)](/azure/aks/node-updates-kured).\n\nIf you deploy the servlet container (such as Spring Boot) as part of your application, you should consider it a library and, as such, it's always your responsibility.\n\n## Ensuring on-premises connectivity\n\nIf your application needs to access any of your on-premises services, you'll need to provision one of Azure's connectivity services. For more information, see [Connect an on-premises network to Azure](/azure/architecture/reference-architectures/hybrid-networking/). Alternatively, you'll need to refactor your application to use publicly available APIs that your on-premises resources expose.\n\nYou should complete this effort before you start any migration.\n\n## Inventory current capacity and resource usage\n\nDocument the hardware of the current production server(s) plus the average and peak request counts and resource usage. You'll need this information to provision resources in the service destination.\n\n## Migration guidance\n\nUse the following grids to find migration guidance by application type and targeted Azure service destination.\n\n**Java applications**\n\nUse the rows below to find your Java application type and the columns to find the Azure service destination that will host your application.\n\nIf you'd like to migrate a JBoss EAP app to Tomcat on App Service, first convert the Java EE app to Java Web Apps (servlets) running on Tomcat, then follow the guidance indicated below.\n\n| Destination&nbsp;→<br><br>Application&nbsp;type&nbsp;↓ | App<br>Service<br>Java SE | App<br>Service<br>Tomcat | App<br>Service<br>JBoss EAP | Azure<br>Container<br>Apps | AKS                 | Virtual<br>Machines |\n|--------------------------------------------------------|---------------------------|--------------------------|-----------------------------|----------------------------|---------------------|---------------------|---------------------|\n| Spring Boot /<br>JAR applications                      | [guidance][5]             | N/A                      | N/A                         | N/A                        | N/A                 | N/A                 |\n| Spring Cloud /<br>applications                         | N/A                       | N/A                      | N/A                         | N/A                        | guidance<br>planned | guidance<br>planned |\n| Web applications<br>on Tomcat                          | N/A                       | [guidance][2]            | N/A                         | [guidance][22]             | [guidance][3]       | guidance<br>planned |\n\n**Java EE applications**\n\nUse the rows below to find your Java EE application type running on a specific app server. Use the columns to find the Azure service destination that will host your application.\n\n| Destination&nbsp;→<br><br>App server&nbsp;↓ | App<br>Service<br>Java SE | App<br>Service<br>Tomcat | App<br>Service<br>JBoss EAP | Azure<br>Container<br>Apps | AKS           | Virtual<br>Machines |\n|---------------------------------------------|---------------------------|--------------------------|-----------------------------|----------------------------|---------------|---------------------|\n| JBoss AS                                    | N/A                       | N/A                      | [guidance][18]              | N/A                        | N/A           | guidance<br>planned |\n| Oracle WebLogic Server                      | N/A                       | N/A                      | [guidance][19]              | N/A                        | [guidance][6] | [guidance][4]       |\n| IBM WebSphere                               | N/A                       | N/A                      | [guidance][20]              | N/A                        | [guidance][7] | guidance<br>planned |\n| Red Hat JBoss EAP                           | N/A                       | N/A                      | [guidance][18]              | N/A                        | N/A           | [guidance][24]      |\n\n<!-- reference links, for use with tables -->\n[1]: media/migration-overview/logo_azure.svg\n[2]: migrate-tomcat-to-tomcat-app-service.md\n[3]: migrate-tomcat-to-containers-on-azure-kubernetes-service.md\n[4]: migrate-weblogic-to-virtual-machines.md\n[5]: migrate-spring-boot-to-app-service.md\n[6]: migrate-weblogic-to-azure-kubernetes-service.md\n[7]: migrate-websphere-to-azure-kubernetes-service.md\n[10]: https://azure.microsoft.com/global-infrastructure/services/?products=app-service-linux\n[12]: https://azure.microsoft.com/global-infrastructure/services/?products=kubernetes-service\n[13]: https://azure.microsoft.com/global-infrastructure/services/?products=virtual-machines\n[18]: migrate-jboss-eap-to-jboss-eap-on-azure-app-service.md\n[19]: migrate-weblogic-to-jboss-eap-on-azure-app-service.md\n[20]: migrate-websphere-to-jboss-eap-on-azure-app-service.md\n[22]: migrate-tomcat-to-containers-on-azure-kubernetes-service.md\n[23]: https://azure.microsoft.com/global-infrastructure/services/?products=container-apps\n[24]: migrate-jboss-eap-to-jboss-eap-on-azure-vms.md\n\n## See also\n\n* [Reasons to move to Java 11 and beyond](/java/openjdk/reasons-to-move-to-java-11)\n* [Transition from Java 8 to Java 11](/java/openjdk/transition-from-java-8-to-java-11)\n* [Transition from Java 7 to Java 8](/java/openjdk/transition-from-java-7-to-java-8)\n"
  },
  {
    "path": "articles/java/migration/toc.yml",
    "content": "items:\n- name: Java to Azure migration documentation\n  href: index.yml\n  items:\n    - name: Overview\n      href: migration-overview.md\n    - name: Azure Migrate application and code assessment\n      href: /azure/migrate/appcat/java?toc=/azure/developer/java/migration/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n    - name: GitHub Copilot modernization\n      expanded: true\n      items:\n        - name: Overview\n          href: migrate-github-copilot-app-modernization-for-java.md\n        - name: FAQ\n          href: migrate-github-copilot-app-modernization-for-java-faq.yml\n        - name: Portfolio assessment integration\n          href: github-copilot-app-modernization-for-java-portfolio-assessment-integration.md\n        - name: Copilot CLI\n          href: github-copilot-app-modernization-for-java-copilot-cli.md\n        - name: Coding agent\n          href: github-copilot-app-modernization-for-java-coding-agent.md\n        - name: Predefined tasks\n          href: migrate-github-copilot-app-modernization-for-java-predefined-tasks.md\n        - name: Working with assessment\n          href: migrate-github-copilot-app-modernization-for-java-working-with-assessment.md\n        - name: Understand assessment rules\n          href: migrate-github-copilot-app-modernization-for-java-assess-rules.md\n        - name: Optimize chat results with the AppModernization agent\n          href: migrate-github-copilot-app-modernization-for-java-quickstart-chat-window.md\n        - name: \"Quickstart: Assess and migrate a Java project\"\n          href: migrate-github-copilot-app-modernization-for-java-quickstart-assess-migrate.md\n        - name: \"Quickstart: Create and apply your own skill\"\n          href: migrate-github-copilot-app-modernization-for-java-quickstart-create-and-apply-your-own-task.md\n        - name: \"Quickstart: Prepare infrastructure\"\n          href: migrate-github-copilot-app-modernization-for-java-quickstart-infrastructure.md\n        - name: \"Quickstart: Containerize your project\"\n          href: migrate-github-copilot-app-modernization-for-java-quickstart-containerization.md\n        - name: \"Quickstart: Deploy your project\"\n          href: migrate-github-copilot-app-modernization-for-java-quickstart-deploy-to-azure.md\n        - name: \"Sample: Asset Manager\"\n          href: migrate-github-copilot-app-modernization-for-java-sample.md\n        - name: Migrate from Oracle to PostgreSQL\n          href: migrate-github-copilot-app-modernization-for-java-oracle-to-postgresql.md\n        - name: Migration via custom agent\n          href: migrate-github-copilot-app-modernization-for-java-custom-agent.md\n        - name: Re-architect (preview)\n          href: github-copilot-app-modernization-for-java-rearchitecture.md\n    - name: Spring to Azure\n      expanded: true\n      items:\n        - name: Spring Boot to Azure Container Apps\n          href: migrate-spring-boot-to-azure-container-apps.md\n        - name: Spring Cloud to Azure Container Apps\n          href: migrate-spring-cloud-to-azure-container-apps.md\n        - name: Spring Boot to Azure App Service\n          href: migrate-spring-boot-to-app-service.md\n    - name: Tomcat to Azure\n      expanded: true\n      items:\n        - name: Tomcat to Azure App Service\n          href: migrate-tomcat-to-tomcat-app-service.md\n        - name: Tomcat to Azure Container Apps\n          href: migrate-tomcat-to-azure-container-apps.md\n        - name: Tomcat to containers on AKS\n          href: migrate-tomcat-to-containers-on-azure-kubernetes-service.md\n        - name: \"Tutorial: Containerized Tomcat to AKS\"\n          href: /azure/migrate/tutorial-app-containerization-java-kubernetes?toc=/azure/developer/java/migration/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n    - name: WebLogic Server to Azure VMs\n      expanded: true\n      items:\n        - name: WebLogic Server to Azure Virtual Machines\n          href: migrate-weblogic-to-virtual-machines.md\n        - name: \"Tutorial: WebLogic Server with App Gateway\"\n          href: migrate-weblogic-with-app-gateway.md\n        - name: \"Tutorial: WebLogic to Azure VMs manual guidance\"\n          href: migrate-weblogic-to-azure-vm-manually.md\n        - name: \"Tutorial: WebLogic to Azure VMs with high availability and disaster recovery\"\n          href: migrate-weblogic-to-vms-with-ha-dr.md\n        - name: \"Tutorial: WebLogic to Azure VMs with Elastic\"\n          href: migrate-weblogic-with-elk.md\n        - name: \"Tutorial: WebLogic to Azure VMs with Entra ID\"\n          href: migrate-weblogic-with-entra-id-via-ldap.md\n    - name: WebLogic Server to AKS and App Service\n      expanded: true\n      items:\n        - name: WebLogic Server to AKS\n          href: migrate-weblogic-to-azure-kubernetes-service.md\n        - name: \"Tutorial: WebLogic to AKS with geo-redundancy\"\n          href: migrate-weblogic-to-aks-with-ha-geo-redundancy.md\n        - name: \"Tutorial: WebLogic to AKS within custom virtual network\"\n          href: migrate-weblogic-to-aks-within-an-existing-vnet.md\n        - name: \"Tutorial: WebLogic to AKS with KEDA scaler based on Prometheus Metrics\"\n          href: migrate-weblogic-to-aks-with-keda-scaler-based-on-prometheus-metrics.md\n        - name: WebLogic Server to JBoss EAP on Azure App Service\n          href: migrate-weblogic-to-jboss-eap-on-azure-app-service.md\n    - name: WebSphere to Azure\n      expanded: true\n      items:\n        - name: WebSphere Application Server to AKS\n          href: migrate-websphere-to-azure-kubernetes-service.md\n        - name: \"Tutorial: WebSphere Liberty/Open Liberty to AKS with high availability and disaster recovery\"\n          href: migrate-liberty-to-aks-with-ha-dr.md\n        - name: WebSphere Application Server to Azure Red Hat OpenShift\n          href: migrate-websphere-to-azure-redhat-openshift.md\n        - name: WebSphere Application Server to Azure Virtual Machines\n          href: migrate-websphere-to-virtual-machines.md\n        - name: \"Tutorial: WebSphere to Azure VMs manual guidance\"\n          href: migrate-websphere-to-azure-vm-manually.md\n        - name: \"Tutorial: WebSphere to Azure VMs with high availability and disaster recovery\"\n          href: migrate-websphere-to-vms-with-ha-dr.md\n        - name: WebSphere to JBoss EAP on App Service\n          href: migrate-websphere-to-jboss-eap-on-azure-app-service.md\n    - name: JBoss EAP to Azure\n      expanded: true\n      items:\n        - name: JBoss EAP to Azure App Service\n          href: migrate-jboss-eap-to-jboss-eap-on-azure-app-service.md\n        - name: JBoss EAP to Azure VMs\n          href: migrate-jboss-eap-to-jboss-eap-on-azure-vms.md\n        - name: JBoss EAP to Azure VMs with HADR\n          href: migrate-jboss-eap-to-vms-with-ha-dr.md\n        - name: JBoss EAP to Azure Red Hat OpenShift\n          href: migrate-jboss-eap-to-azure-redhat-openshift.md\n"
  },
  {
    "path": "articles/java/sdk/async-programming.md",
    "content": "---\ntitle: Asynchronous programming in the Azure SDK for Java\ndescription: Provides an overview of asynchronous programming model in the Azure SDK for Java.\nms.date: 02/14/2025\nms.topic: concept-article\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: srnagar\n---\n\n# Asynchronous programming in the Azure SDK for Java\n\nThis article describes the asynchronous programming model in the Azure SDK for Java.\n\nThe Azure SDK initially contained only non-blocking, asynchronous APIs for interacting with Azure services. These APIs let you use the Azure SDK to build scalable applications that use system resources efficiently. However, the [Azure SDK for Java](https://github.com/Azure/azure-sdk-for-java#client-new-releases) also contains synchronous clients to cater to a wider audience, and also make our client libraries approachable for users not familiar with asynchronous programming. (See [Approachable](https://azure.github.io/azure-sdk/general_introduction.html#approachable) in the Azure SDK design guidelines.) As such, all Java client libraries in the Azure SDK for Java offer both asynchronous and synchronous clients. However, we recommend using the asynchronous clients for production systems to maximize the use of system resources.\n\n## Reactive streams\n\nIf you look at the [Async Service Clients](https://azure.github.io/azure-sdk/java_introduction.html#async-service-clients) section in the [Java Azure SDK Design Guidelines](https://azure.github.io/azure-sdk/java_introduction.html), you'll notice that, instead of using `CompletableFuture` provided by Java 8, our async APIs use reactive types. Why did we choose reactive types over types that are natively available in JDK?\n\nJava 8 introduced features like [Streams](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html), [Lambdas](https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html), and [CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html). These features provide many capabilities, but have some limitations.\n\n`CompletableFuture` provides callback-based, non-blocking capabilities, and the `CompletionStage` interface allowed for easy composition of a series of asynchronous operations. Lambdas make these push-based APIs more readable. Streams provide functional-style operations to handle a collection of data elements. However, streams are synchronous and can't be reused. `CompletableFuture` allows you to make a single request, provides support for a callback, and expects a _single_ response. However, many cloud services require the ability to stream data - Event Hubs for instance.\n\nReactive streams can help to overcome these limitations by streaming elements from a source to a subscriber. When a subscriber requests data from a source, the source sends any number of results back. It doesn't need to send them all at once. The transfer happens over a period of time, whenever the source has data to send.\n\nIn this model, the subscriber registers event handlers to process data when it arrives. These push-based interactions notify the subscriber through distinct signals:\n\n- An `onSubscribe()` call indicates that the data transfer is about to begin.\n- An `onError()` call indicates there was an error, which also marks the end of data transfer.\n- An `onComplete()` call indicates successful completion of data transfer.\n\nUnlike Java Streams, reactive streams treat errors as first-class events. Reactive streams have a dedicated channel for the source to communicate any errors to the subscriber. Also, reactive streams allow the subscriber to negotiate the data transfer rate to transform these streams into a push-pull model.\n\nThe [Reactive Streams](https://github.com/reactive-streams/reactive-streams-jvm#reactive-streams) specification provides a standard for how the transfer of data should occur. At a high level, the specification defines the following four interfaces and specifies rules on how these interfaces should be implemented.\n\n- **Publisher** is the source of a data stream.\n- **Subscriber** is the consumer of a data stream.\n- **Subscription** manages the state of data transfer between a publisher and a subscriber.\n- **Processor** is both a publisher and a subscriber.\n\nThere are some well-known Java libraries that provide implementations of this specification, such as [RxJava](https://github.com/ReactiveX/RxJava), [Akka Streams](https://doc.akka.io/docs/akka/current/stream/stream-introduction.html), [Vert.x](https://vertx.io/docs/#reactive), and [Project Reactor](https://projectreactor.io/docs/core/release/reference/).\n\nThe Azure SDK for Java adopted Project Reactor to offer its async APIs. The main factor driving this decision was to provide smooth integration with [Spring Webflux](https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html), which also uses Project Reactor. Another contributing factor to choose Project Reactor over RxJava was that Project Reactor uses Java 8 but RxJava, at the time, was still at Java 7. Project Reactor also offers a rich set of operators that are composable and allow you to write declarative code for building data processing pipelines. Another nice thing about Project Reactor is that it has adapters for converting Project Reactor types to other popular implementation types.\n\n## Comparing APIs of synchronous and asynchronous operations\n\nWe discussed the synchronous clients and options for asynchronous clients. The table below summarizes what APIs look like that are designed using these options:\n\n| API Type                                           | No value                   | Single value            | Multiple values                         |\n|----------------------------------------------------|----------------------------|-------------------------|-------------------------------|\n| Standard Java - Synchronous APIs                   | `void`                     | `T`                     | `Iterable<T>`                 |\n| Standard Java - Asynchronous APIs                  | `CompletableFuture<Void>`  | `CompletableFuture<T>`  | `CompletableFuture<List<T>>`   |\n| Reactive Streams Interfaces                        | `Publisher<Void>`          | `Publisher<T>`          | `Publisher<T>`                 |\n| Project Reactor implementation of Reactive Streams | `Mono<Void>`               | `Mono<T>`               | `Flux<T>`                      |\n\nFor the sake of completeness, it's worth mentioning that Java 9 introduced the [Flow](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/Flow.html) class that includes the four reactive streams interfaces. However, this class doesn't include any implementation.\n\n## Use async APIs in the Azure SDK for Java\n\nThe reactive streams specification doesn't differentiate between types of publishers. In the reactive streams specification, publishers simply produce zero or more data elements. In many cases, there's a useful distinction between a publisher producing at most one data element versus one that produces zero or more. In cloud-based APIs, this distinction indicates whether a request returns a single-valued response or a collection. Project Reactor provides two types to make this distinction - [Mono](https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html) and [Flux](https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html). An API that returns a `Mono` will contain a response that has at most one value, and an API that returns a `Flux` will contain a response that has zero or more values.\n\nFor example, suppose you use a [ConfigurationAsyncClient](/java/api/com.azure.data.appconfiguration.configurationasyncclient) to retrieve a configuration stored using the Azure App Configuration service. (For more information, see [What is Azure App Configuration?](/azure/azure-app-configuration/overview).)\n\nIf you create a `ConfigurationAsyncClient` and call `getConfigurationSetting()` on the client, it returns a `Mono`, which indicates that the response contains a single value. However, calling this method alone doesn't do anything. The client has not yet made a request to the Azure App Configuration service. At this stage, the `Mono<ConfigurationSetting>` returned by this API is just an \"assembly\" of data processing pipeline. What this means is that the required setup for consuming the data is complete. To actually trigger the data transfer (that is, to make the request to the service and get the response), you must subscribe to the returned `Mono`. So, when dealing with these reactive streams, you must remember to call `subscribe()` because nothing happens until you do so.\n\nThe following example shows how to subscribe to the `Mono` and print the configuration value to the console.\n\n```java\nConfigurationAsyncClient asyncClient = new ConfigurationClientBuilder()\n    .connectionString(\"<your connection string>\")\n    .buildAsyncClient();\n\nasyncClient.getConfigurationSetting(\"<your config key>\", \"<your config value>\").subscribe(\n    config -> System.out.println(\"Config value: \" + config.getValue()),\n    ex -> System.out.println(\"Error getting configuration: \" + ex.getMessage()),\n    () -> System.out.println(\"Successfully retrieved configuration setting\"));\n\nSystem.out.println(\"Done\");\n```\n\nNotice that after calling `getConfigurationSetting()` on the client, the example code subscribes to the result and provides three separate lambdas. The first lambda consumes data received from the service, which is triggered upon successful response. The second lambda is triggered if there is an error while retrieving the configuration. The third lambda is invoked when the data stream is complete, meaning no more data elements are expected from this stream.\n\n> [!NOTE]\n> As with all asynchronous programming, after the subscription is created, execution proceeds as usual. If there's nothing to keep the program active and executing, it may terminate before the async operation completes. The main thread that called `subscribe()` won't wait until you make the network call to Azure App Configuration and receive a response. In production systems, you might continue to process something else, but in this example you can add a small delay by calling `Thread.sleep()` or use a `CountDownLatch` to give the async operation a chance to complete.\n\nAs shown in the following example, APIs that return a `Flux` also follow a similar pattern. The difference is that the first callback provided to the `subscribe()` method is called multiple times for each data element in the response. The error or the completion callbacks are called exactly once and are considered as terminal signals. No other callbacks are invoked if either of these signals are received from the publisher.\n\n```java\nEventHubConsumerAsyncClient asyncClient = new EventHubClientBuilder()\n    .connectionString(\"<your connection string>\")\n    .consumerGroup(\"<your consumer group>\")\n    .buildAsyncConsumerClient();\n\nasyncClient.receive().subscribe(\n    event -> System.out.println(\"Sequence number of received event: \" + event.getData().getSequenceNumber()),\n    ex -> System.out.println(\"Error receiving events: \" + ex.getMessage()),\n    () -> System.out.println(\"Successfully completed receiving all events\"));\n```\n\n### Backpressure\n\nWhat happens when the source is producing the data at a faster rate than the subscriber can handle? The subscriber can get overwhelmed with data, which can lead to out-of-memory errors. The subscriber needs a way to communicate back to the publisher to slow down when it can't keep up. By default, when you call `subscribe()` on a `Flux` as shown in the example above, the subscriber is requesting an unbounded stream of data, indicating to the publisher to send the data as quickly as possible. This behavior isn't always desirable, and the subscriber may have to control the rate of publishing through \"backpressure\". Backpressure allows the subscriber to take control of the flow of data elements. A subscriber will request a limited number of data elements that they can handle. After the subscriber has completed processing these elements, the subscriber can request more. By using backpressure, you can transform a push-model for data transfer into a push-pull model.\n\nThe following example shows how you can control the rate at which events are received by the Event Hubs consumer:\n\n```java\nEventHubConsumerAsyncClient asyncClient = new EventHubClientBuilder()\n    .connectionString(\"<your connection string>\")\n    .consumerGroup(\"<your consumer group>\")\n    .buildAsyncConsumerClient();\n\nasyncClient.receive().subscribe(new Subscriber<PartitionEvent>() {\n    private Subscription subscription;\n\n    @Override\n    public void onSubscribe(Subscription subscription) {\n        this.subscription = subscription;\n        this.subscription.request(1); // request 1 data element to begin with\n    }\n\n    @Override\n    public void onNext(PartitionEvent partitionEvent) {\n        System.out.println(\"Sequence number of received event: \" + partitionEvent.getData().getSequenceNumber());\n        this.subscription.request(1); // request another event when the subscriber is ready\n    }\n\n    @Override\n    public void onError(Throwable throwable) {\n        System.out.println(\"Error receiving events: \" + throwable.getMessage());\n    }\n\n    @Override\n    public void onComplete() {\n        System.out.println(\"Successfully completed receiving all events\")\n    }\n});\n```\n\nWhen the subscriber first \"connects\" to the publisher, the publisher hands the subscriber a `Subscription` instance, which manages the state of the data transfer. This `Subscription` is the medium through which the subscriber can apply backpressure by calling `request()` to specify how many more data elements it can handle.\n\nIf the subscriber requests more than one data element each time it calls `onNext()`, `request(10)` for example, the publisher will send the next 10 elements immediately if they're available or when they become available. These elements accumulate in a buffer on the subscriber's end, and since each `onNext()` call will request 10 more, the backlog keeps growing until either the publisher has no more data elements to send, or the subscriber's buffer overflows, resulting in out-of-memory errors.\n\n### Cancel a subscription\n\nA subscription manages the state of data transfer between a publisher and a subscriber. The subscription is active until the publisher has completed transferring all the data to the subscriber or the subscriber is no longer interested in receiving data. There are a couple of ways you can cancel a subscription as shown below.\n\nThe following example cancels the subscription by disposing the subscriber:\n\n```java\nEventHubConsumerAsyncClient asyncClient = new EventHubClientBuilder()\n    .connectionString(\"<your connection string>\")\n    .consumerGroup(\"<your consumer group>\")\n    .buildAsyncConsumerClient();\n\nDisposable disposable = asyncClient.receive().subscribe(\n    partitionEvent -> {\n        Long num = partitionEvent.getData().getSequenceNumber()\n        System.out.println(\"Sequence number of received event: \" + num);\n    },\n    ex -> System.out.println(\"Error receiving events: \" + ex.getMessage()),\n    () -> System.out.println(\"Successfully completed receiving all events\"));\n\n// much later on in your code, when you are ready to cancel the subscription,\n// you can call the dispose method, as such:\ndisposable.dispose();\n```\n\nThe follow example cancels the subscription by calling the `cancel()` method on `Subscription`:\n\n```java\nEventHubConsumerAsyncClient asyncClient = new EventHubClientBuilder()\n    .connectionString(\"<your connection string>\")\n    .consumerGroup(\"<your consumer group>\")\n    .buildAsyncConsumerClient();\n\nasyncClient.receive().subscribe(new Subscriber<PartitionEvent>() {\n    private Subscription subscription;\n\n    @Override\n    public void onSubscribe(Subscription subscription) {\n        this.subscription = subscription;\n        this.subscription.request(1); // request 1 data element to begin with\n    }\n\n    @Override\n    public void onNext(PartitionEvent partitionEvent) {\n        System.out.println(\"Sequence number of received event: \" + partitionEvent.getData().getSequenceNumber());\n        this.subscription.cancel(); // Cancels the subscription. No further event is received.\n    }\n\n    @Override\n    public void onError(Throwable throwable) {\n        System.out.println(\"Error receiving events: \" + throwable.getMessage());\n    }\n\n    @Override\n    public void onComplete() {\n        System.out.println(\"Successfully completed receiving all events\")\n    }\n});\n```\n\n## Conclusion\n\nThreads are expensive resources that you shouldn't waste on waiting for responses from remote service calls. As the adoption of microservices architectures increase, the need to scale and use resources efficiently becomes vital. Asynchronous APIs are favorable when there are network-bound operations. The Azure SDK for Java offers a rich set of APIs for async operations to help maximize your system resources. We highly encourage you to try out our async clients.\n\nFor more information on the operators that best suit your particular tasks, see [Which operator do I need?](https://projectreactor.io/docs/core/release/reference/#which-operator) in the [Reactor 3 Reference Guide](https://projectreactor.io/docs/core/release/reference/index.html).\n\n## Next steps\n\nNow that you better understand the various asynchronous programming concepts, it's important to learn how to iterate over the results. For more information on the best iteration strategies, and details of how pagination works, see [Pagination and iteration in the Azure SDK for Java](pagination.md).\n"
  },
  {
    "path": "articles/java/sdk/authentication/credential-chains.md",
    "content": "---\ntitle: 'Credential chains in the Azure Identity library for Java'\ndescription: 'This article describes the DefaultAzureCredential and ChainedTokenCredential classes in the Azure Identity library.'\nms.date: 02/24/2026\nms.topic: concept-article\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: scaddie\nms.custom: devx-track-java\nai-usage: ai-assisted\n---\n\n# Credential chains in the Azure Identity library for Java\n\nThe Azure Identity library provides *credentials*&mdash;public classes that implement the Azure Core library's [TokenCredential](/java/api/com.azure.core.credential.tokencredential) interface. A credential represents a distinct authentication flow for acquiring an access token from Microsoft Entra ID. These credentials can be chained together to form an ordered sequence of authentication mechanisms to be attempted.\n\n## How a chained credential works\n\nAt runtime, a credential chain attempts to authenticate using the sequence's first credential. If that credential fails to acquire an access token, the next credential in the sequence is attempted, and so on, until an access token is successfully obtained. The following sequence diagram illustrates this behavior:\n\n:::image type=\"content\" source=\"../media/mermaidjs/chain-sequence.svg\" alt-text=\"Diagram that shows credential chain sequence.\":::\n\n## Why use credential chains\n\nA chained credential can offer the following benefits:\n\n- **Environment awareness**: Automatically selects the most appropriate credential based on the environment in which the app is running. Without it, you'd have to write code like this:\n\n    ```java\n    import com.azure.core.credential.TokenCredential;\n    import com.azure.identity.AzureCliCredentialBuilder;\n    import com.azure.identity.ManagedIdentityCredentialBuilder;\n\n    // Code omitted for brevity\n\n    TokenCredential credential = null;\n\n    // Set up credential based on environment (Azure or local development)\n    String environment = System.getenv(\"ENV\");\n\n    if (environment != null && environment.equals(\"production\")) {\n        credential = new ManagedIdentityCredentialBuilder()\n            .clientId(userAssignedClientId)\n            .build();\n    } else {\n        credential = new AzureCliCredentialBuilder()\n            .build();\n    }\n    ```\n\n- **Seamless transitions**: Your app can move from local development to your staging or production environment without changing authentication code.\n- **Improved resiliency**: Includes a fallback mechanism that moves to the next credential when the prior fails to acquire an access token.\n\n## How to choose a chained credential\n\nThere are two different approaches to credential chaining:\n\n- **Use a preconfigured chain**: Start with an opinionated, preconstructed chain that accommodates the most common authentication scenarios. For this approach, see the [DefaultAzureCredential overview](#defaultazurecredential-overview) section.\n- **\"Build up\" a chain**: Start with an empty chain and include only what you need. For this approach, see the [ChainedTokenCredential overview](#chainedtokencredential-overview) section.\n\n## DefaultAzureCredential overview\n\n[DefaultAzureCredential](/java/api/com.azure.identity.defaultazurecredential) is an opinionated, preconfigured chain of credentials. It's designed to support many environments, along with the most common authentication flows and developer tools. In graphical form, the underlying chain looks like this:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-auth-flow-inline.svg\" alt-text=\"Diagram that shows DefaultAzureCredential authentication flow.\" lightbox=\"../media/mermaidjs/default-azure-credential-auth-flow-expanded.png\":::\n\nThe order in which `DefaultAzureCredential` attempts credentials follows.\n\n| Order | Credential                      | Description                                                                                                                                                                                                                                                                                                                        |\n|-------|---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| 1     | [Environment][env-cred]         | Reads a collection of [environment variables][env-vars] to determine if an application service principal (application user) is configured for the app. If so, `DefaultAzureCredential` uses these values to authenticate the app to Azure. This method can be used when developing locally, but is most often used in server environments. |\n| 2     | [Workload Identity][wi-cred]    | If the app is deployed to an Azure host with Workload Identity enabled, authenticate that account.                                                                                                                                                                                                                                 |\n| 3     | [Managed Identity][mi-cred]     | If the app is deployed to an Azure host with Managed Identity enabled, authenticate the app to Azure using that Managed Identity.                                                                                                                                                                                                  |\n| 4     | [IntelliJ][ij-cred]             | If the developer authenticated via Azure Toolkit for IntelliJ, authenticate that account.                                                                                                                                                                                                                                          |\n| 5     | [Visual Studio Code][vsc-cred]  | If the developer authenticated via Visual Studio Code's [Azure Resources extension][vsc-ext] and the [azure-identity-broker package][broker-pkg] is installed, authenticate that account.                                                                                                                                        |\n| 6     | [Azure CLI][az-cred]            | If the developer authenticated to Azure using Azure CLI's `az login` command, authenticate the app to Azure using that same account.                                                                                                                                                                                               |\n| 7     | [Azure PowerShell][pwsh-cred]   | If the developer authenticated to Azure using Azure PowerShell's `Connect-AzAccount` cmdlet, authenticate the app to Azure using that same account.                                                                                                                                                                                |\n| 8     | [Azure Developer CLI][azd-cred] | If the developer authenticated to Azure using Azure Developer CLI's `azd auth login` command, authenticate with that account.                                                                                                                                                                                                      |\n| 9     | [Broker][broker-cred]           | Authenticates using the default account logged into the OS via a broker. Requires that the [azure-identity-broker package][broker-pkg] is installed, since a broker-enabled instance of `InteractiveBrowserCredential` is used.                                                                                                                                                                                      |\n\n[env-cred]: /java/api/com.azure.identity.environmentcredential\n[wi-cred]: /java/api/com.azure.identity.workloadidentitycredential\n[mi-cred]: /java/api/com.azure.identity.managedidentitycredential\n[az-cred]: /java/api/com.azure.identity.azureclicredential\n[pwsh-cred]: /java/api/com.azure.identity.azurepowershellcredential\n[azd-cred]: /java/api/com.azure.identity.azuredeveloperclicredential\n[ij-cred]: /java/api/com.azure.identity.intellijcredential\n[vsc-cred]: /java/api/com.azure.identity.visualstudiocodecredential\n[broker-cred]: /java/api/com.azure.identity.interactivebrowsercredential\n[vsc-ext]: https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureresourcegroups\n[broker-pkg]: https://central.sonatype.com/artifact/com.azure/azure-identity-broker\n\nIn its simplest form, you can use the parameterless version of `DefaultAzureCredential` as follows:\n\n```java\nimport com.azure.identity.DefaultAzureCredential;\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\n// Code omitted for brevity\n\nDefaultAzureCredential credential = new DefaultAzureCredentialBuilder()\n    .build();\n```\n\n### How to customize DefaultAzureCredential\n\nThe following sections describe strategies for controlling which credentials are included in the chain.\n\n#### Exclude a credential type category\n\nTo exclude all `Developer tool` or `Deployed service` credentials, set environment variable `AZURE_TOKEN_CREDENTIALS` to `prod` or `dev`, respectively. When a value of `prod` is used, the underlying credential chain looks as follows:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-environment-variable-production.svg\" alt-text=\"Diagram that shows DefaultAzureCredential with AZURE_TOKEN_CREDENTIALS set to 'prod'.\":::\n\nWhen a value of `dev` is used, the chain looks as follows:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-environment-variable-development.svg\" alt-text=\"Diagram that shows DefaultAzureCredential with AZURE_TOKEN_CREDENTIALS set to 'dev'.\":::\n\n> [!IMPORTANT]\n> The `AZURE_TOKEN_CREDENTIALS` environment variable is supported in `azure-identity` package versions 1.16.1 and later.\n\nTo ensure the environment variable is defined and set to a supported string, call method `requireEnvVars` as follows:\n\n```java\nDefaultAzureCredential credential = new DefaultAzureCredentialBuilder()\n    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)\n    .build();\n```\n\n> [!IMPORTANT]\n> The `requireEnvVars` method is available in `azure-identity` package versions 1.18.0 and later.\n\nTo use a custom environment variable name instead of the default `AZURE_TOKEN_CREDENTIALS`, use `AzureIdentityEnvVars.fromString()` to create a reference to your custom variable:\n\n```java\nDefaultAzureCredential credential = new DefaultAzureCredentialBuilder()\n    .requireEnvVars(AzureIdentityEnvVars.fromString(\"MY_CUSTOM_TOKEN_CREDENTIALS\"))\n    .build();\n```\n\n> [!NOTE]\n> The `requireEnvVars` method throws an `IllegalStateException` if the specified environment variables aren't set or are empty.\n\n#### Use a specific credential\n\nTo exclude all credentials except for one, set environment variable `AZURE_TOKEN_CREDENTIALS` to the credential name. For example, you can reduce the `DefaultAzureCredential` chain to `AzureCliCredential` by setting `AZURE_TOKEN_CREDENTIALS` to `AzureCliCredential`. The string comparison is performed in a case-insensitive manner. Valid string values for the environment variable include:\n\n- `AzureCliCredential`\n- `AzureDeveloperCliCredential`\n- `AzurePowerShellCredential`\n- `EnvironmentCredential`\n- `IntelliJCredential`\n- `ManagedIdentityCredential`\n- `VisualStudioCodeCredential`\n- `WorkloadIdentityCredential`\n\n> [!IMPORTANT]\n> The `AZURE_TOKEN_CREDENTIALS` environment variable supports individual credential names in `azure-identity` package versions 1.17.0 and later.\n\nTo ensure the environment variable is defined and set to a supported string, call method [requireEnvVars](/java/api/com.azure.identity.defaultazurecredentialbuilder#com-azure-identity-defaultazurecredentialbuilder-requireenvvars(com-azure-identity-azureidentityenvvars-)) as follows:\n\n```java\nDefaultAzureCredential credential = new DefaultAzureCredentialBuilder()\n    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)\n    .build();\n```\n\n## ChainedTokenCredential overview\n\n[ChainedTokenCredential](/java/api/com.azure.identity.chainedtokencredential) is an empty chain to which you add credentials to suit your app's needs. For example:\n\n```java\nimport com.azure.identity.AzureCliCredential;\nimport com.azure.identity.AzureCliCredentialBuilder;\nimport com.azure.identity.ChainedTokenCredential;\nimport com.azure.identity.ChainedTokenCredentialBuilder;\nimport com.azure.identity.IntelliJCredential;\nimport com.azure.identity.IntelliJCredentialBuilder;\n\n// Code omitted for brevity\n\nAzureCliCredential cliCredential = new AzureCliCredentialBuilder()\n    .build();\nIntelliJCredential ijCredential = new IntelliJCredentialBuilder()\n    .build();\n\nChainedTokenCredential credential = new ChainedTokenCredentialBuilder()\n    .addLast(cliCredential)\n    .addLast(ijCredential)\n    .build();\n```\n\nThe preceding code example creates a tailored credential chain comprised of two development-time credentials. `AzureCliCredential` is attempted first, followed by `IntelliJCredential`, if necessary. In graphical form, the chain looks like this:\n\n:::image type=\"content\" source=\"../media/mermaidjs/chained-token-credential-auth-flow.svg\" alt-text=\"Diagram that shows authentication flow for a ChainedTokenCredential instance that is composed of the Azure CLI and IntelliJ credentials.\":::\n\n> [!TIP]\n> For improved performance, optimize credential ordering in `ChainedTokenCredential` from most to least used credential.\n\n## Usage guidance for DefaultAzureCredential\n\n`DefaultAzureCredential` is undoubtedly the easiest way to get started with the Azure Identity library, but with that convenience comes tradeoffs. After you deploy your app to Azure, you should understand the app's authentication requirements and consider whether `DefaultAzureCredential` is appropriate for your scenario.\n\n`DefaultAzureCredential` offers a key benefit: it decouples your application code from specific authentication mechanisms, enabling you to change your authentication configuration without modifying code. For experienced developers who consciously configure their production authentication, this flexibility can be valuable. However, this flexibility comes with potential drawbacks:\n\n- **Debugging challenges**: When authentication fails, it can be challenging to debug and identify the offending credential. You must enable logging to see the progression from one credential to the next and the success/failure status of each. For more information, see [Debug a chained credential](#debug-a-chained-credential).\n- **Performance overhead**: The process of sequentially trying multiple credentials can introduce performance overhead. For example, when running on a local development machine, managed identity is unavailable. Consequently, `ManagedIdentityCredential` always fails in the local development environment.\n- **Unpredictable behavior**: `DefaultAzureCredential` checks for the presence of certain [environment variables][env-vars]. It's possible that someone could add or modify these environment variables at the system level on the host machine. Those changes apply globally and therefore alter the behavior of `DefaultAzureCredential` at runtime in any app running on that machine.\n- **Permission mismatches**: `DefaultAzureCredential` stops at the first credential that successfully acquires a token, regardless of whether that credential has the correct permissions. For example, a local development credential might have broader permissions than the production managed identity, causing the app to work locally but fail authorization checks after deployment.\n\n## Debug a chained credential\n\nTo diagnose an unexpected issue or to understand what a chained credential is doing, [enable logging](../logging-overview.md) in your app.\n\nFor illustration purposes, assume the parameterless form of `DefaultAzureCredential` is used to authenticate a request to a Blob Storage account. The app runs in the local development environment, and the developer authenticated to Azure using the Azure CLI. When the app is run, the following pertinent entries appear in the output:\n\n```output\n[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential EnvironmentCredential is unavailable.\n[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential WorkloadIdentityCredential is unavailable.\n[ForkJoinPool.commonPool-worker-1] WARN com.microsoft.aad.msal4j.ConfidentialClientApplication - [Correlation ID: aaaa0000-bb11-2222-33cc-444444dddddd] Execution of class com.microsoft.aad.msal4j.AcquireTokenByClientCredentialSupplier failed: java.util.concurrent.ExecutionException: com.azure.identity.CredentialUnavailableException: ManagedIdentityCredential authentication unavailable. Connection to IMDS endpoint cannot be established.\n[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential ManagedIdentityCredential is unavailable.\n[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential IntelliJCredential is unavailable.\n[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential VisualStudioCodeCredential is unavailable.\n[main] INFO com.azure.identity.ChainedTokenCredential - Azure Identity => Attempted credential AzureCliCredential returns a token\n```\n\nIn the preceding output, notice that:\n\n- `EnvironmentCredential`, `WorkloadIdentityCredential`, `ManagedIdentityCredential`, `IntelliJCredential`, and `VisualStudioCodeCredential` each failed to acquire a Microsoft Entra access token, in that order.\n- The `AzureCliCredential.getToken` call succeeds, as indicated by the `returns a token`-suffixed entry. Since `AzureCliCredential` succeeded, no credentials beyond it were tried.\n\n<!-- LINKS -->\n[env-vars]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/identity/azure-identity/README.md#environment-variables\n"
  },
  {
    "path": "articles/java/sdk/authentication/includes/authenticate-azure-services-from-app.md",
    "content": "---\nms.service: azure\nms.topic: include\nms.date: 03/03/2026\nauthor: bmitchell287\nms.author: brendm\n---\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library](/java/api/com.azure.identity) provides various *credentials* - implementations of `TokenCredential` that support different scenarios and Microsoft Entra authentication flows. The following steps show you how to use [ClientSecretCredential](/java/api/com.azure.identity.clientsecretcredential) when you work with service principals locally and in production.\n\n### Implement the code\n\nAdd the `azure-identity` dependency to your `pom.xml` file:\n\n```xml\n<dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-identity</artifactId>\n</dependency>\n```\n\nYou access Azure services by using specialized client classes from the various Azure SDK client libraries. For any Java code that creates an Azure SDK client object in your app, follow these steps:\n\n1. Import the `ClientSecretCredentialBuilder` class from the `com.azure.identity` package.\n1. Create a `ClientSecretCredential` object by using `ClientSecretCredentialBuilder` with the `tenantId`, `clientId`, and `clientSecret`.\n1. Pass the `ClientSecretCredential` instance to the Azure SDK client object builder's `credential` method.\n\nAn example of this approach is shown in the following code segment:\n\n```java\nimport com.azure.identity.ClientSecretCredential;\nimport com.azure.identity.ClientSecretCredentialBuilder;\nimport com.azure.storage.blob.BlobServiceClient;\nimport com.azure.storage.blob.BlobServiceClientBuilder;\n\nString tenantId = System.getenv(\"AZURE_TENANT_ID\");\nString clientId = System.getenv(\"AZURE_CLIENT_ID\");\nString clientSecret = System.getenv(\"AZURE_CLIENT_SECRET\");\n\nClientSecretCredential credential = new ClientSecretCredentialBuilder()\n    .tenantId(tenantId)\n    .clientId(clientId)\n    .clientSecret(clientSecret)\n    .build();\n\nBlobServiceClient blobServiceClient = new BlobServiceClientBuilder()\n    .endpoint(\"https://<account-name>.blob.core.windows.net\")\n    .credential(credential)\n    .buildClient();\n```\n"
  },
  {
    "path": "articles/java/sdk/authentication/includes/implement-managed-identity-concepts.md",
    "content": "---\nms.service: azure\nms.topic: include\nms.date: 04/02/2026\nauthor: bmitchell287\nms.author: brendm\n---\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library](/java/api/com.azure.identity) provides various *credentials*&mdash;implementations of [`TokenCredential`](/java/api/com.azure.core.credential.tokencredential) adapted to supporting different scenarios and Microsoft Entra authentication flows. Since managed identity is unavailable when running locally, the steps ahead demonstrate which credential to use in which scenario:\n\n- **Local dev environment**: During **local development only**, use a class called [DefaultAzureCredential](../credential-chains.md#defaultazurecredential-overview) for an opinionated, preconfigured chain of credentials. `DefaultAzureCredential` discovers user credentials from your local tooling or IDE, such as the Azure CLI or Visual Studio Code. It also provides flexibility and convenience for retries, wait times for responses, and support for multiple authentication options. Visit the [Authenticate to Azure services during local development](../local-development-dev-accounts.md) article to learn more.\n- **Azure-hosted apps**: When your app is running in Azure, use [`ManagedIdentityCredential`](/java/api/com.azure.identity.managedidentitycredential) to safely discover the managed identity configured for your app. Specifying this exact type of credential prevents other available credentials from being picked up unexpectedly.\n"
  },
  {
    "path": "articles/java/sdk/authentication/local-development-broker.md",
    "content": "---\ntitle: Authenticate Java Apps to Azure Using Brokered Auth\ntitleSuffix: Azure SDK for Java\ndescription: Learn how to authenticate Java apps to Azure services during local development by using brokered authentication with the Azure Identity library.\nms.date: 02/24/2026\nms.topic: how-to\nms.custom: devx-track-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: vigera\nai-usage: ai-generated\nappliesto:\n- Windows\n---\n\n# Authenticate Java apps to Azure services during local development by using brokered authentication\n\n[!INCLUDE [broker-introduction](../../../includes/authentication/broker-introduction.md)]\n\n[!INCLUDE [broker-windows](../../../includes/authentication/broker-windows.md)]\n\n## Configure the app for brokered authentication\n\nTo enable brokered authentication in your application, follow these steps:\n\n1. In the [Azure portal](https://portal.azure.com), navigate to **Microsoft Entra ID** and select **App registrations** on the left-hand menu.\n1. Select the registration for your app, then select **Authentication**.\n1. Add the appropriate redirect URI to your app registration via a platform configuration:\n    1. Under **Platform configurations**, select **+ Add a platform**.\n    1. Under **Configure platforms**, select the tile for your application type (platform) to configure its settings, such as **mobile and desktop applications**.\n    1. In **Custom redirect URIs**, enter the following redirect URI:\n\n        `ms-appx-web://Microsoft.AAD.BrokerPlugin/{your_client_id}`\n\n        Replace `{your_client_id}` with the **Application (client) ID** from the app registration's **Overview** pane.\n\n    1. Select **Configure**.\n\n    To learn more, see [Add a redirect URI to an app registration](/entra/identity-platform/quickstart-register-app#add-a-redirect-uri).\n\n1. Back on the **Authentication** pane, under **Advanced settings**, select **Yes** for **Allow public client flows**.\n1. Select **Save** to apply the changes.\n1. To authorize the application for specific resources, navigate to the resource in question, select **API Permissions**, and enable **Microsoft Graph** and other resources you want to access.\n\n    > [!IMPORTANT]\n    > You must also be the admin of your tenant to grant consent to your application when you sign in for the first time.\n\n[!INCLUDE [broker-assign-roles](../../../includes/authentication/broker-assign-roles.md)]\n\n## Implement the code\n\nThe Azure Identity library supports brokered authentication by using [InteractiveBrowserCredential](/java/api/com.azure.identity.interactivebrowsercredential). The [azure-identity-broker](https://central.sonatype.com/artifact/com.azure/azure-identity-broker) library provides `InteractiveBrowserBrokerCredentialBuilder`, which creates an `InteractiveBrowserCredential` capable of using the system authentication broker. For example, to use brokered authentication in a Java console app to authenticate to Azure Key Vault with the [SecretClient](/java/api/com.azure.security.keyvault.secrets.secretclient), follow these steps:\n\n1. Add the `azure-identity-broker` dependency to your `pom.xml` file:\n\n    ```xml\n    <dependency>\n        <groupId>com.azure</groupId>\n        <artifactId>azure-identity-broker</artifactId>\n    </dependency>\n    ```\n\n1. Get a reference to the parent window on top of which the account picker dialog should appear. For examples, see [Get a window handle](#get-a-window-handle).\n\n1. Create an instance of `InteractiveBrowserCredential` using `InteractiveBrowserBrokerCredentialBuilder`:\n\n    ```java\n    import com.azure.identity.InteractiveBrowserCredential;\n    import com.azure.identity.broker.InteractiveBrowserBrokerCredentialBuilder;\n    import com.azure.security.keyvault.secrets.SecretClient;\n    import com.azure.security.keyvault.secrets.SecretClientBuilder;\n    import com.azure.security.keyvault.secrets.models.KeyVaultSecret;\n    \n    long windowHandle = getWindowHandle(); // See examples below\n    \n    InteractiveBrowserCredential credential = new InteractiveBrowserBrokerCredentialBuilder()\n        .setWindowHandle(windowHandle)\n        .useDefaultBrokerAccount()\n        .build();\n    \n    SecretClient client = new SecretClientBuilder()\n        .vaultUrl(\"https://<your-key-vault-name>.vault.azure.net\")\n        .credential(credential)\n        .buildClient();\n    \n    KeyVaultSecret secret = client.getSecret(\"MySecret\");\n    System.out.println(\"Retrieved secret: \" + secret.getName());\n    ```\n\nIn the preceding example, `useDefaultBrokerAccount` opts into a silent, brokered authentication flow with the default system account. In this way, the user doesn't have to repeatedly select the same account. If silent, brokered authentication fails, `InteractiveBrowserCredential` falls back to interactive, brokered authentication.\n\nThe following screenshot shows the alternative interactive, brokered authentication experience:\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/broker-web-account-manager-account-picker.png\" alt-text=\"Screenshot of the Windows sign-in experience when using a broker-enabled InteractiveBrowserCredential instance to authenticate a user.\" lightbox=\"../../../includes/authentication/media/broker-web-account-manager-account-picker.png\":::\n\n### Get a window handle\n\nWhen you authenticate interactively by using `InteractiveBrowserCredential`, you need a parent window handle to make sure the authentication dialog appears correctly over the window that sends the request.\n\n#### JavaFX application\n\nFor a JavaFX application, use JNA (Java Native Access) to get the window handle:\n\n```java\nimport com.sun.jna.Pointer;\nimport com.sun.jna.platform.win32.User32;\nimport com.sun.jna.platform.win32.WinDef;\n\npublic long getWindowHandle(Stage stage) {\n    WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, stage.getTitle());\n    return Pointer.nativeValue(hwnd.getPointer());\n}\n```\n\n#### Console application\n\nFor a console application on Windows, use JNA to get the console window handle:\n\n```java\nimport com.sun.jna.Pointer;\nimport com.sun.jna.platform.win32.Kernel32;\nimport com.sun.jna.platform.win32.WinDef;\n\nWinDef.HWND hwnd = Kernel32.INSTANCE.GetConsoleWindow();\nlong windowHandle = Pointer.nativeValue(hwnd.getPointer());\n```\n\n## Related content\n\n- [Authenticate Java apps to Azure services by using the Azure Identity library](overview.md)\n- [Authenticate Java apps to Azure services during local development by using developer accounts](local-development-dev-accounts.md)\n- [Azure Identity library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity)\n- [Azure Identity Broker library for Java](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity-broker)\n"
  },
  {
    "path": "articles/java/sdk/authentication/local-development-dev-accounts.md",
    "content": "---\ntitle: Authenticate Java apps during local development by using developer accounts\ntitleSuffix: Azure SDK for Java\ndescription: Learn how to authenticate Java apps to Azure services during local development by using developer accounts and tools like Azure CLI, Azure Developer CLI, Azure PowerShell, Visual Studio Code, and IntelliJ IDEA.\nms.date: 02/24/2026\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: vigera\nai-usage: ai-generated\n---\n\n# Authenticate Java apps to Azure services during local development by using developer accounts\n\nDuring local development, applications need to authenticate to Azure to access various Azure services. You can authenticate locally by using one of the following approaches:\n\n- Use a developer account with one of the developer tools supported by the Azure Identity library.\n- Use a service principal. For more information, see [Authenticate Java apps to Azure services during local development by using service principals](local-development-service-principal.md).\n\nThis article explains how to authenticate by using a developer account with tools supported by the Azure Identity library. In this article, you learn:\n\n- How to use Microsoft Entra groups to efficiently manage permissions for multiple developer accounts.\n- How to assign roles to developer accounts to scope permissions.\n- How to sign in to supported local development tools.\n- How to authenticate by using a developer account from your app code.\n\n## Supported developer tools for authentication\n\nDuring local development, an app can authenticate to Azure by using your Azure credentials. For this authentication to work, you must be signed in to Azure from a developer tool such as one of the following:\n\n- Azure CLI\n- Azure Developer CLI\n- Azure PowerShell\n- Visual Studio Code\n- IntelliJ IDEA\n\nThe Azure Identity library can detect that the developer is signed in from one of these tools. The library can then obtain the Microsoft Entra access token via the tool to authenticate the app to Azure as the signed-in user.\n\nThis approach takes advantage of the developer's existing Azure accounts to streamline the authentication process. However, a developer's account likely has more permissions than the app requires, therefore exceeding the permissions the app runs with in production. As an alternative, you can [create application service principals to use during local development](local-development-service-principal.md), which can be scoped to have only the access needed by the app.\n\n[!INCLUDE [auth-create-entra-group](../../../includes/authentication/create-entra-group.md)]\n\n[!INCLUDE [auth-assign-group-roles](../../../includes/authentication/assign-group-roles.md)]\n\n## Sign in to Azure by using developer tooling\n\nNext, sign in to Azure by using one of the developer tools that you can use to perform authentication in your development environment. The account you authenticate should also exist in the Microsoft Entra group you created and configured earlier.\n\n### [Visual Studio Code](#tab/sign-in-vscode)\n\n[!INCLUDE [sign-in-visual-studio-code](../../../includes/authentication/sign-in-visual-studio-code.md)]\n\n### [IntelliJ IDEA](#tab/sign-in-intellij)\n\nDeveloper using IntelliJ can authenticate by using the Azure Toolkit for IntelliJ plugin. Use the following steps to sign in:\n\n1. In your IntelliJ window, open **File > Settings > Plugins**.\n1. Search for \"Azure Toolkit for IntelliJ\" in the marketplace. Install and restart the IDE.\n1. Find the new menu item **Tools > Azure > Azure Sign In**.\n1. **Device Login** helps you sign in as a user account. Follow the instructions to sign in on the `login.microsoftonline.com` website by using the device code. IntelliJ prompts you to select your subscriptions. Select the subscription with the resources that you want to access.\n\n### [Azure CLI](#tab/sign-in-azure-cli)\n\n[!INCLUDE [sign-in-azure-cli](../../../includes/authentication/sign-in-azure-cli.md)]\n\n### [Azure Developer CLI](#tab/sign-in-azure-developer-cli)\n\n[!INCLUDE [sign-in-azure-developer-cli](../../../includes/authentication/sign-in-azure-developer-cli.md)]\n\n### [Azure PowerShell](#tab/sign-in-azure-powershell)\n\n[!INCLUDE [sign-in-azure-powershell](../../../includes/authentication/sign-in-azure-powershell.md)]\n\n---\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library](/java/api/com.azure.identity) provides implementations of [TokenCredential](/java/api/com.azure.core.credential.tokencredential) that support various scenarios and Microsoft Entra authentication flows. The following steps show you how to use [DefaultAzureCredential](credential-chains.md#defaultazurecredential-overview) or a specific development tool credential when working with user accounts locally.\n\n### Implement the code\n\n1. Add the `azure-identity` dependency to your `pom.xml` file:\n\n    ```xml\n    <dependency>\n        <groupId>com.azure</groupId>\n        <artifactId>azure-identity</artifactId>\n    </dependency>\n    ```\n\n1. Choose one of the credential implementations based on your scenario.\n\n    - [Use a credential specific to your development tool](#use-a-credential-specific-to-your-development-tool): this option is best for single person or single tool scenarios.\n    - [Use a credential available for use in any development tool](#use-a-credential-available-for-use-in-any-development-tool): this option is best for open-source projects and diverse tool teams.\n\n#### Use a credential specific to your development tool\n\nPass a `TokenCredential` instance corresponding to a specific development tool to the Azure service client constructor, such as `AzureCliCredential`.\n\n```java\nimport com.azure.identity.AzureCliCredential;\nimport com.azure.identity.AzureCliCredentialBuilder;\nimport com.azure.security.keyvault.secrets.SecretClient;\nimport com.azure.security.keyvault.secrets.SecretClientBuilder;\n\nAzureCliCredential credential = new AzureCliCredentialBuilder().build();\n\nSecretClient client = new SecretClientBuilder()\n    .vaultUrl(\"https://<your-key-vault-name>.vault.azure.net\")\n    .credential(credential)\n    .buildClient();\n```\n\nEach tool credential follows the same pattern. Replace the credential type and its corresponding builder as needed:\n\n- `AzureCliCredential` / `AzureCliCredentialBuilder`\n- `AzureDeveloperCliCredential` / `AzureDeveloperCliCredentialBuilder`\n- `AzurePowerShellCredential` / `AzurePowerShellCredentialBuilder`\n- `IntelliJCredential` / `IntelliJCredentialBuilder`\n- `VisualStudioCodeCredential` / `VisualStudioCodeCredentialBuilder`\n\n#### Use a credential available for use in any development tool\n\nUse a `DefaultAzureCredential` instance optimized for all local development tools. This example requires the environment variable `AZURE_TOKEN_CREDENTIALS` set to `dev`. For more information, see [Exclude a credential type category](credential-chains.md#exclude-a-credential-type-category).\n\n```java\nimport com.azure.identity.DefaultAzureCredential;\nimport com.azure.identity.DefaultAzureCredentialBuilder;\nimport com.azure.security.keyvault.secrets.SecretClient;\nimport com.azure.security.keyvault.secrets.SecretClientBuilder;\n\nDefaultAzureCredential credential = new DefaultAzureCredentialBuilder()\n    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)\n    .build();\n\nSecretClient client = new SecretClientBuilder()\n    .vaultUrl(\"https://<your-key-vault-name>.vault.azure.net\")\n    .credential(credential)\n    .buildClient();\n```\n\n## Next steps\n\nThis article covered authentication during development by using credentials available on your computer. This form of authentication is one of multiple ways you can authenticate in the Azure SDK for Java. The following articles describe other ways:\n\n- [Authenticate Java apps to Azure services during local development by using service principals](local-development-service-principal.md)\n- [Authenticate Azure-hosted Java apps to Azure resources by using a system-assigned managed identity](system-assigned-managed-identity.md)\n- [Authenticate Azure-hosted Java apps to Azure resources by using a user-assigned managed identity](user-assigned-managed-identity.md)\n\nIf you run into issues related to development environment authentication, see [Troubleshoot development environment authentication](../troubleshooting-authentication-dev-env.md).\n\nAfter you master authentication, see [Configure logging in the Azure SDK for Java](../logging-overview.md) for information on the logging functionality provided by the SDK.\n"
  },
  {
    "path": "articles/java/sdk/authentication/local-development-service-principal.md",
    "content": "---\ntitle: Authenticate Java apps during local development by using service principals\ntitleSuffix: Azure SDK for Java\ndescription: Learn how to authenticate Java apps to Azure services during local development by using application service principals.\nms.date: 02/24/2026\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: vigera\nai-usage: ai-generated\n---\n\n# Authenticate Java apps to Azure services during local development by using service principals\n\nDuring local development, applications need to authenticate to Azure to access various Azure services. You can authenticate locally by using one of the following approaches:\n\n- Use a developer account with one of the developer tools supported by the Azure Identity library. For more information, see [Authenticate Java apps to Azure services during local development by using developer accounts](local-development-dev-accounts.md).\n- Use a service principal.\n\nThis article explains how to use an application service principal. For more information about service principals, see [Application and service principal objects in Microsoft Entra ID](/entra/identity-platform/app-objects-and-service-principals). In this article, you learn:\n\n- How to register an application with Microsoft Entra to create a service principal.\n- How to use Microsoft Entra groups to efficiently manage permissions.\n- How to assign roles to scope permissions.\n- How to authenticate by using a service principal from your app code.\n\nUsing dedicated application service principals enables you to follow the principle of least privilege when accessing Azure resources. You can limit permissions to the specific requirements of the app during development to prevent accidental access to Azure resources intended for other apps or services. This approach also helps you avoid problems when you move the app to production by ensuring it isn't over-privileged in the development environment.\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/mermaidjs/local-service-principal-authentication.svg\" alt-text=\"A diagram that shows how a local Java app uses a service principal to connect to Azure resources.\":::\n\nWhen you register the app in Azure, an application service principal is created. For local development, you should:\n\n- Create a separate app registration for each developer working on the app so each developer has their own application service principal and doesn't need to share credentials.\n- Create a separate app registration for each app to limit the app's permissions to only what is necessary.\n\nDuring local development, set environment variables with the application service principal's identity. The Azure Identity library reads these environment variables to authenticate the app to the required Azure resources.\n\n[!INCLUDE [create-app-registration](../../../includes/authentication/create-app-registration.md)]\n\n[!INCLUDE [create-entra-group](../../../includes/authentication/create-entra-group.md)]\n\n[!INCLUDE [auth-assign-group-roles](../../../includes/authentication/assign-group-roles.md)]\n\n## Set the app environment variables\n\nAt runtime, certain credentials from the [Azure Identity library](/java/api/com.azure.identity), such as `DefaultAzureCredential`, `EnvironmentCredential`, and `ClientSecretCredential`, search for service principal information by convention in the environment variables. When working with Java, you can configure environment variables in different ways depending on your tooling and environment.\n\nRegardless of the approach you choose, configure the following environment variables for a service principal:\n\n- `AZURE_CLIENT_ID`: Used to identify the registered app in Azure.\n- `AZURE_TENANT_ID`: The ID of the Microsoft Entra tenant.\n- `AZURE_CLIENT_SECRET`: The secret credential that was generated for the app.\n\n#### [Bash](#tab/bash)\n\nAdd the following lines to your `~/.bashrc` or `~/.zshrc` file. Replace the placeholder values with the actual values from your app registration:\n\n```bash\nexport AZURE_CLIENT_ID=\"<your-client-id>\"\nexport AZURE_TENANT_ID=\"<your-tenant-id>\"\nexport AZURE_CLIENT_SECRET=\"<your-client-secret>\"\n```\n\nAfter editing the file, run `source ~/.bashrc` or `source ~/.zshrc` to apply the changes to your current session.\n\n#### [Visual Studio Code](#tab/vscode-env)\n\nConfigure environment variables in `.vscode/launch.json`:\n\n```json\n{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"type\": \"java\",\n            \"name\": \"Launch App\",\n            \"request\": \"launch\",\n            \"mainClass\": \"com.example.App\",\n            \"env\": {\n                \"AZURE_CLIENT_ID\": \"<your-client-id>\",\n                \"AZURE_TENANT_ID\": \"<your-tenant-id>\",\n                \"AZURE_CLIENT_SECRET\": \"<your-client-secret>\"\n            }\n        }\n    ]\n}\n```\n\n#### [IntelliJ IDEA](#tab/intellij-env)\n\nConfigure environment variables in the run configuration:\n\n1. Select **Run > Edit Configurations...**.\n1. Select your application configuration.\n1. In the **Environment variables** field, add your variables:\n\n   ```text\n   AZURE_CLIENT_ID=<your-client-id>;AZURE_TENANT_ID=<your-tenant-id>;AZURE_CLIENT_SECRET=<your-client-secret>\n   ```\n\n1. Select **Apply** and then **OK**.\n\n---\n\n[!INCLUDE [authenticate-azure-services-from-app](includes/authenticate-azure-services-from-app.md)]\n\n## Next steps\n\nThis article covered authentication through a service principal. This form of authentication is one of many ways you can authenticate in the Azure SDK for Java. The following articles describe other ways to authenticate:\n\n- [Authenticate Java apps to Azure services during local development by using developer accounts](local-development-dev-accounts.md)\n- [Authenticate Azure-hosted Java apps to Azure resources by using a system-assigned managed identity](system-assigned-managed-identity.md)\n- [Authenticate Azure-hosted Java apps to Azure resources by using a user-assigned managed identity](user-assigned-managed-identity.md)\n\nIf you run into problems related to service principal authentication, see [Troubleshoot service principal authentication](../troubleshooting-authentication-service-principal.md).\n\nAfter you master authentication, see [Configure logging in the Azure SDK for Java](../logging-overview.md) for information on the logging functionality provided by the SDK.\n"
  },
  {
    "path": "articles/java/sdk/authentication/on-premises-apps.md",
    "content": "---\ntitle: Authenticate to Azure Resources From On-Premises Java Apps\ntitleSuffix: Azure SDK for Java\ndescription: Learn how to authenticate on-premises Java apps to Azure services using the Azure SDK for Java. Set up service principals, assign roles, and configure credentials.\nms.date: 02/24/2026\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: vigera\nai-usage: ai-generated\n---\n\n# Authenticate to Azure resources from Java apps hosted on-premises\n\nApps hosted outside of Azure, such as on-premises or in a third-party data center, should use an application service principal through [Microsoft Entra ID](/entra/fundamentals/whatis) to authenticate to Azure services. In the following sections, you learn:\n\n- How to register an application with Microsoft Entra to create a service principal.\n- How to assign roles to scope permissions.\n- How to authenticate by using a service principal from your app code.\n\nBy using dedicated application service principals, you can follow the principle of least privilege when accessing Azure resources. Limit permissions to the specific requirements of the app during development to prevent accidental access to Azure resources intended for other apps or services. This approach also helps you avoid problems when moving the app to production by ensuring the app isn't over-privileged in the development environment.\n\nCreate a different app registration for each environment where you host the app. You can configure environment-specific resource permissions for each service principal and ensure an app deployed to one environment doesn't access Azure resources in another environment.\n\n[!INCLUDE [authenticate-create-app-registration](../../../includes/authentication/create-app-registration.md)]\n\n[!INCLUDE [authentication-assign-service-principal-roles](../../../includes/authentication/assign-service-principal-roles.md)]\n\n## Set the app environment variables\n\nAt runtime, certain credentials from the [Azure Identity library](/java/api/com.azure.identity), such as `DefaultAzureCredential`, `EnvironmentCredential`, and `ClientSecretCredential`, search for service principal information by convention in the environment variables. When working with Java, you can configure environment variables in multiple ways, depending on your tooling and environment.\n\nRegardless of the approach you choose, configure the following environment variables for a service principal:\n\n- `AZURE_CLIENT_ID`: Used to identify the registered app in Azure.\n- `AZURE_TENANT_ID`: The ID of the Microsoft Entra tenant.\n- `AZURE_CLIENT_SECRET`: The secret credential that was generated for the app.\n\n### [Bash](#tab/bash)\n\nSet the following environment variables. Replace the placeholder values with the actual values from your app registration:\n\n```bash\nexport AZURE_CLIENT_ID=\"<your-client-id>\"\nexport AZURE_TENANT_ID=\"<your-tenant-id>\"\nexport AZURE_CLIENT_SECRET=\"<your-client-secret>\"\n```\n\nFor a Java application running as a systemd service on a production server, define the environment variables in a file and reference it with the `EnvironmentFile` directive in the service unit file:\n\n```ini\n[Unit]\nDescription=Java application service\nAfter=network.target\n\n[Service]\nUser=app-user\nWorkingDirectory=/path/to/java-app\nEnvironmentFile=/path/to/java-app/app-environment-variables\nExecStart=/usr/bin/java -jar app.jar\n\n[Install]\nWantedBy=multi-user.target\n```\n\nThe environment file should contain a list of environment variables with their values:\n\n```bash\nAZURE_CLIENT_ID=<your-client-id>\nAZURE_TENANT_ID=<your-tenant-id>\nAZURE_CLIENT_SECRET=<your-client-secret>\n```\n\n### [Visual Studio Code](#tab/vs-code)\n\nIn Visual Studio Code, set environment variables in the `.vscode/launch.json` file of your project. The app automatically uses these values when it starts. However, these configurations don't travel with your app during deployment, so you need to set up environment variables on your target hosting environment.\n\n```json\n{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"type\": \"java\",\n            \"name\": \"Launch App\",\n            \"request\": \"launch\",\n            \"mainClass\": \"com.example.App\",\n            \"env\": {\n                \"AZURE_CLIENT_ID\": \"<your-client-id>\",\n                \"AZURE_TENANT_ID\": \"<your-tenant-id>\",\n                \"AZURE_CLIENT_SECRET\": \"<your-client-secret>\"\n            }\n        }\n    ]\n}\n```\n\n### [IntelliJ IDEA](#tab/intellij-env)\n\nConfigure environment variables in the run configuration:\n\n1. Select **Run > Edit Configurations...**.\n1. Select your application configuration.\n1. In the **Environment variables** field, add your variables:\n\n   ```text\n   AZURE_CLIENT_ID=<your-client-id>;AZURE_TENANT_ID=<your-tenant-id>;AZURE_CLIENT_SECRET=<your-client-secret>\n   ```\n\n1. Select **Apply** and then **OK**.\n\n### [Windows](#tab/windows)\n\nYou can set environment variables for Windows from the command line. However, all apps running on that operating system can access the values, which could cause conflicts. Use caution with this approach. You can set environment variables at the user or system level.\n\n```cmd\n# Set user environment variables\nsetx AZURE_CLIENT_ID \"<your-client-id>\"\nsetx AZURE_TENANT_ID \"<your-tenant-id>\"\nsetx AZURE_CLIENT_SECRET \"<your-client-secret>\"\n\n# Set system environment variables - requires running as admin\nsetx AZURE_CLIENT_ID \"<your-client-id>\" /m\nsetx AZURE_TENANT_ID \"<your-tenant-id>\" /m\nsetx AZURE_CLIENT_SECRET \"<your-client-secret>\" /m\n```\n\nYou can also use PowerShell to set environment variables at the user or system level:\n\n```powershell\n# Set user environment variables\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_ID\", \"<your-client-id>\", \"User\")\n[Environment]::SetEnvironmentVariable(\"AZURE_TENANT_ID\", \"<your-tenant-id>\", \"User\")\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_SECRET\", \"<your-client-secret>\", \"User\")\n\n# Set system environment variables - requires running as admin\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_ID\", \"<your-client-id>\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"AZURE_TENANT_ID\", \"<your-tenant-id>\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_SECRET\", \"<your-client-secret>\", \"Machine\")\n```\n\n---\n\n[!INCLUDE [authenticate-azure-services-from-app](includes/authenticate-azure-services-from-app.md)]\n"
  },
  {
    "path": "articles/java/sdk/authentication/overview.md",
    "content": "---\ntitle: Authenticate Java apps to Azure services\ntitleSuffix: Azure SDK for Java\ndescription: Learn how to authenticate Java apps to Azure services using the Azure Identity library, including managed identities and developer accounts.\nms.date: 02/24/2026\nms.topic: overview\nms.custom: devx-track-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: vigera\nai-usage: ai-assisted\n---\n\n# Authenticate Java apps to Azure services by using the Azure Identity library\n\nApps can use the Azure Identity library to authenticate to Microsoft Entra ID, which allows the apps to access Azure services and resources. This authentication requirement applies whether the app is deployed to Azure, hosted on-premises, or running locally on a developer workstation. This article describes the recommended approaches to authenticate an app to Microsoft Entra ID across different environments when using the Azure SDK client libraries.\n\n## Recommended approach for app authentication\n\nToken-based authentication through Microsoft Entra ID is the recommended approach for authenticating apps to Azure, instead of using connection strings or key-based options. The [Azure Identity library](/java/api/com.azure.identity) provides classes that support token-based authentication and enable apps to authenticate to Azure resources whether the app runs locally, on Azure, or on an on-premises server.\n\n### Advantages of token-based authentication\n\n[!INCLUDE [advantages-token-based-authentication](../../../includes/authentication/advantages-token-based-authentication.md)]\n\n## Authentication across different environments\n\nThe specific type of token-based authentication an app should use to authenticate to Azure resources depends on where the app runs. The following diagram provides guidance for different scenarios and environments:\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/mermaidjs/authentication-environments.svg\" alt-text=\"A diagram showing the recommended token-based authentication strategies for an app depending on where it's running.\" :::\n\nWhen an app is:\n\n- **Hosted on Azure**: The app should authenticate to Azure resources by using a managed identity. For more information, see the [Authentication for Azure-hosted apps](#authentication-for-azure-hosted-apps) section.\n- **Running locally during development**: The app can authenticate to Azure by using a [developer account](local-development-dev-accounts.md), a [broker](local-development-broker.md), or a [service principal](local-development-service-principal.md). For more information, see the [Authentication during local development](#authentication-during-local-development) section.\n- **Hosted on-premises**: The app should authenticate to Azure resources using an application service principal, or a managed identity in the case of Azure Arc. On-premises workflows are discussed in more detail at [Authentication for apps hosted on-premises](#authentication-for-apps-hosted-on-premises).\n\n## Authentication for Azure-hosted apps\n\nWhen you host your app on Azure, it can use managed identities to authenticate to Azure resources without needing to manage any credentials. Two types of managed identities are available: user-assigned and system-assigned.\n\n### Use a user-assigned managed identity\n\nYou can create a user-assigned managed identity as a standalone Azure resource. You can then assign it to one or more Azure resources so those resources can share the same identity and permissions. To authenticate by using a user-assigned managed identity, create the identity, assign it to your Azure resource, and then configure your app to use this identity for authentication by specifying its client ID, resource ID, or object ID.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate by using a user-assigned managed identity](user-assigned-managed-identity.md)\n\n### Use a system-assigned managed identity\n\nYou can enable a system-assigned managed identity directly on an Azure resource. The identity is tied to the lifecycle of that resource and is automatically deleted when the resource is deleted. To authenticate by using a system-assigned managed identity, enable the identity on your Azure resource and then configure your app to use this identity for authentication.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate by using a system-assigned managed identity](system-assigned-managed-identity.md)\n\n## Authentication during local development\n\nDuring local development, you can authenticate to Azure resources by using your developer credentials, a broker, or a service principal. By using one of these methods, you can test your app's authentication logic without deploying it to Azure.\n\n### Use developer credentials\n\nYou can use your own Azure credentials to authenticate to Azure resources during local development. Typically, you use a development tool such as Azure CLI, Azure Developer CLI, Azure PowerShell, Visual Studio Code, or IntelliJ IDEA. These tools can provide your app with the necessary tokens to access Azure services. This method is convenient but you should use it only for development purposes.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally by using developer accounts](local-development-dev-accounts.md)\n\n### Use a broker\n\nBrokered authentication collects user credentials using the system authentication broker to authenticate an app. A system authentication broker runs on a user's machine and manages the authentication handshakes and token maintenance for all connected accounts.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally by using a broker](local-development-broker.md)\n\n### Use a service principal\n\nYou can create a service principal in a Microsoft Entra tenant to represent an app and authenticate to Azure resources. You can configure your app to use service principal credentials during local development. This method is more secure than using developer credentials and is closer to how your app authenticates in production. However, it's still less ideal than using a managed identity due to the need for secrets.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally by using service principals](local-development-service-principal.md)\n\n## Authentication for apps hosted on-premises\n\nFor apps hosted on-premises, you can use a service principal to authenticate to Azure resources. This involves creating a service principal in Microsoft Entra ID, assigning it the necessary permissions, and configuring your app to use its credentials. This method allows your on-premises app to securely access Azure services.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate your on-prem app using a service principal](on-premises-apps.md)\n"
  },
  {
    "path": "articles/java/sdk/authentication/system-assigned-managed-identity.md",
    "content": "---\ntitle: Authenticate Azure-hosted Java apps by using a system-assigned managed identity\ntitleSuffix: Azure SDK for Java\ndescription: Learn how to authenticate Azure-hosted Java apps to Azure resources by using a system-assigned managed identity.\nms.date: 04/02/2026\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: vigera\nai-usage: ai-generated\n---\n\n# Authenticate Azure-hosted Java apps to Azure resources by using a system-assigned managed identity\n\nThe recommended approach to authenticate an Azure-hosted app to other Azure resources is to use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). Most Azure services support this approach, including apps hosted on Azure App Service, Azure Container Apps, and Azure Virtual Machines. For more information, see [Azure services and resource types supporting managed identities](/entra/identity/managed-identities-azure-resources/managed-identities-status). For more information about different authentication techniques and approaches, see [Authenticate Java apps to Azure services by using the Azure Identity library](overview.md).\n\nIn the following sections, you learn:\n\n- Essential managed identity concepts.\n- How to create a system-assigned managed identity for your app.\n- How to assign roles to the system-assigned managed identity.\n- How to authenticate by using the system-assigned managed identity from your app code.\n\n[!INCLUDE [managed-identity-concepts](../../../includes/authentication/managed-identity-concepts.md)]\n\nThe following sections describe the steps to enable and use a system-assigned managed identity for an Azure-hosted app. If you need to use a user-assigned managed identity, see [Authenticate Azure-hosted Java apps to Azure resources by using a user-assigned managed identity](user-assigned-managed-identity.md).\n\n[!INCLUDE [Language-agnostic system-assigned procedures](../../../includes/authentication/system-assigned-managed-identity.md)]\n\n[!INCLUDE [Java implement-managed-identity-concepts](includes/implement-managed-identity-concepts.md)]\n\n### Implement the code\n\nAdd the `azure-identity` dependency to your `pom.xml` file:\n\n```xml\n<dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-identity</artifactId>\n</dependency>\n```\n\nAzure services are accessed using specialized client classes from the various Azure SDK client libraries. The following code example demonstrates how to create a credential instance and use it with an Azure SDK service client. In your application code, complete the following steps to authenticate using a managed identity:\n\n1. Import the `DefaultAzureCredentialBuilder`, `ManagedIdentityCredentialBuilder`, and `TokenCredential` classes.\n1. Pass an appropriate `TokenCredential` instance to the client:\n    - Use `DefaultAzureCredential` when running locally\n    - Use `ManagedIdentityCredential` when your app is running in Azure\n\nThe following example demonstrates authenticating a `SecretClient` using a system-assigned managed identity:\n\n```java\nimport com.azure.core.credential.TokenCredential;\nimport com.azure.identity.DefaultAzureCredentialBuilder;\nimport com.azure.identity.ManagedIdentityCredentialBuilder;\nimport com.azure.security.keyvault.secrets.SecretClient;\nimport com.azure.security.keyvault.secrets.SecretClientBuilder;\n\nTokenCredential credential = null;\n\n// Set up credential based on environment (Azure or local development)\nString environment = System.getenv(\"ENV\");\n\nif (environment != null && environment.equals(\"production\")) {\n    credential = new ManagedIdentityCredentialBuilder()\n        .build();\n} else {\n    credential = new DefaultAzureCredentialBuilder()\n        .build();\n}\n\n// Azure SDK client builders accept the credential as a parameter\nSecretClient client = new SecretClientBuilder()\n    .vaultUrl(\"https://<your-key-vault-name>.vault.azure.net\")\n    .credential(credential)\n    .buildClient();\n```\n\n## Next steps\n\nThis article covered authentication using a system-assigned managed identity. This form of authentication is one of multiple ways you can authenticate in the Azure SDK for Java. The following articles describe other ways:\n\n- [Authenticate Azure-hosted Java apps to Azure resources by using a user-assigned managed identity](user-assigned-managed-identity.md)\n- [Authenticate Java apps to Azure services during local development by using developer accounts](local-development-dev-accounts.md)\n- [Authenticate Java apps to Azure services during local development by using service principals](local-development-service-principal.md)\n\nIf you run into issues related to Azure-hosted application authentication, see [Troubleshoot Azure-hosted application authentication](../troubleshooting-authentication-azure-hosted.md).\n"
  },
  {
    "path": "articles/java/sdk/authentication/user-assigned-managed-identity.md",
    "content": "---\ntitle: Authenticate Azure-hosted Java apps by using a user-assigned managed identity\ntitleSuffix: Azure SDK for Java\ndescription: Learn how to authenticate Azure-hosted Java apps to Azure resources by using a user-assigned managed identity.\nms.date: 04/02/2026\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: vigera\nai-usage: ai-generated\n---\n\n# Authenticate Azure-hosted Java apps to Azure resources by using a user-assigned managed identity\n\nThe recommended approach to authenticate an Azure-hosted app to other Azure resources is to use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). Most Azure services support this approach, including apps hosted on Azure App Service, Azure Container Apps, and Azure Virtual Machines. For more information, see [Azure services and resource types supporting managed identities](/entra/identity/managed-identities-azure-resources/managed-identities-status). For more information about different authentication techniques and approaches, see [Authenticate Java apps to Azure services by using the Azure Identity library](overview.md).\n\nIn the following sections, you learn about:\n\n- Essential managed identity concepts.\n- How to create a user-assigned managed identity for your app.\n- How to assign roles to the user-assigned managed identity.\n- How to authenticate by using the user-assigned managed identity from your app code.\n\n[!INCLUDE [managed-identity-concepts](../../../includes/authentication/managed-identity-concepts.md)]\n\nThe following sections describe the steps to enable and use a user-assigned managed identity for an Azure-hosted app. If you need to use a system-assigned managed identity, see [Authenticate Azure-hosted Java apps to Azure resources using a system-assigned managed identity](system-assigned-managed-identity.md).\n\n[!INCLUDE [user-assigned-managed-identity](../../../includes/authentication/user-assigned-managed-identity.md)]\n\n[!INCLUDE [Java implement-managed-identity-concepts](includes/implement-managed-identity-concepts.md)]\n\n### Implement the code\n\nAdd the `azure-identity` dependency to your `pom.xml` file:\n\n```xml\n<dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-identity</artifactId>\n</dependency>\n```\n\nAzure services are accessed using specialized client classes from the various Azure SDK client libraries. The following code example demonstrates how to create a credential instance and use it with an Azure SDK service client. In your application code, complete the following steps to authenticate using a managed identity:\n\n1. Import the `DefaultAzureCredentialBuilder`, `ManagedIdentityCredentialBuilder`, and `TokenCredential` classes.\n1. Pass an appropriate `TokenCredential` instance to the client:\n    - Use `DefaultAzureCredential` when running locally\n    - Use `ManagedIdentityCredential` when your app is running in Azure and configure either the client ID, resource ID, or object ID.\n\n#### [Client ID](#tab/client-id)\n\nThe client ID is used to identify a managed identity when configuring applications or services that need to authenticate using that identity.\n\n1. Retrieve the client ID assigned to a user-assigned managed identity by using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query clientId \\\n        --output tsv\n    ```\n\n1. Configure `ManagedIdentityCredential` with the client ID:\n\n    ```java\n    import com.azure.core.credential.TokenCredential;\n    import com.azure.identity.DefaultAzureCredentialBuilder;\n    import com.azure.identity.ManagedIdentityCredentialBuilder;\n    import com.azure.security.keyvault.secrets.SecretClient;\n    import com.azure.security.keyvault.secrets.SecretClientBuilder;\n    \n    TokenCredential credential = null;\n    \n    // Set up credential based on environment (Azure or local development)\n    String environment = System.getenv(\"ENV\");\n    \n    if (environment != null && environment.equals(\"production\")) {\n        // Specify the client ID of the user-assigned managed identity\n        credential = new ManagedIdentityCredentialBuilder()\n            .clientId(\"<user-assigned-managed-identity-client-id>\")\n            .build();\n    } else {\n        credential = new DefaultAzureCredentialBuilder()\n            .build();\n    }\n    \n    // Azure SDK client builders accept the credential as a parameter\n    SecretClient client = new SecretClientBuilder()\n        .vaultUrl(\"https://<your-key-vault-name>.vault.azure.net\")\n        .credential(credential)\n        .buildClient();\n    ```\n\n#### [Resource ID](#tab/resource-id)\n\nThe resource ID uniquely identifies the managed identity resource within your Azure subscription using the following structure:\n\n`/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}`\n\nResource IDs can be built by convention, which makes them more convenient when working with a large number of user-assigned managed identities in your environment.\n\n1. Retrieve the resource ID assigned to a user-assigned managed identity by using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query id \\\n        --output tsv\n    ```\n\n1. Configure `ManagedIdentityCredential` with the resource ID:\n\n    ```java\n    import com.azure.core.credential.TokenCredential;\n    import com.azure.identity.DefaultAzureCredentialBuilder;\n    import com.azure.identity.ManagedIdentityCredentialBuilder;\n    import com.azure.security.keyvault.secrets.SecretClient;\n    import com.azure.security.keyvault.secrets.SecretClientBuilder;\n    \n    TokenCredential credential = null;\n    \n    // Set up credential based on environment (Azure or local development)\n    String environment = System.getenv(\"ENV\");\n    \n    if (environment != null && environment.equals(\"production\")) {\n        // Specify the resource ID of the user-assigned managed identity\n        credential = new ManagedIdentityCredentialBuilder()\n            .resourceId(\"/subscriptions/<subscription-id>/resourcegroups/<resource-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<identity-name>\")\n            .build();\n    } else {\n        credential = new DefaultAzureCredentialBuilder()\n            .build();\n    }\n    \n    // Azure SDK client builders accept the credential as a parameter\n    SecretClient client = new SecretClientBuilder()\n        .vaultUrl(\"https://<your-key-vault-name>.vault.azure.net\")\n        .credential(credential)\n        .buildClient();\n    ```\n\n#### [Object ID](#tab/object-id)\n\nThe object ID is the unique identifier of the managed identity's service principal in Microsoft Entra ID. A principal ID is another name for an object ID.\n\n1. Retrieve the object ID assigned to a user-assigned managed identity by using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query principalId \\\n        --output tsv\n    ```\n\n1. Configure `ManagedIdentityCredential` with the object ID:\n\n    ```java\n    import com.azure.core.credential.TokenCredential;\n    import com.azure.identity.DefaultAzureCredentialBuilder;\n    import com.azure.identity.ManagedIdentityCredentialBuilder;\n    import com.azure.security.keyvault.secrets.SecretClient;\n    import com.azure.security.keyvault.secrets.SecretClientBuilder;\n    \n    TokenCredential credential = null;\n    \n    // Set up credential based on environment (Azure or local development)\n    String environment = System.getenv(\"ENV\");\n    \n    if (environment != null && environment.equals(\"production\")) {\n        // Specify the object ID of the user-assigned managed identity\n        credential = new ManagedIdentityCredentialBuilder()\n            .objectId(\"<user-assigned-managed-identity-object-id>\")\n            .build();\n    } else {\n        credential = new DefaultAzureCredentialBuilder()\n            .build();\n    }\n    \n    // Azure SDK client builders accept the credential as a parameter\n    SecretClient client = new SecretClientBuilder()\n        .vaultUrl(\"https://<your-key-vault-name>.vault.azure.net\")\n        .credential(credential)\n        .buildClient();\n    ```\n\n---\n\n## Next steps\n\nThis article covered authentication using a user-assigned managed identity. This form of authentication is one of multiple ways you can authenticate in the Azure SDK for Java. The following articles describe other ways to authenticate:\n\n- [Authenticate Azure-hosted Java apps to Azure resources by using a system-assigned managed identity](system-assigned-managed-identity.md)\n- [Authenticate Java apps to Azure services during local development by using developer accounts](local-development-dev-accounts.md)\n- [Authenticate Java apps to Azure services during local development by using service principals](local-development-service-principal.md)\n\nIf you run into issues related to Azure-hosted application authentication, see [Troubleshoot Azure-hosted application authentication](../troubleshooting-authentication-azure-hosted.md).\n"
  },
  {
    "path": "articles/java/sdk/azure-sdk-library-package-index.md",
    "content": "---\ntitle: Package index for Azure SDK libraries for Java\ndescription: Listing of the package names, Maven Central links, docs links, and source code links for all libraries in the Azure SDK for Java.\nms.date: 05/21/2025\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Azure SDK for Java libraries\n\nThe Azure SDK for Java is composed of many libraries - one for each Azure service. Additionally, there are libraries designed to integrate with open-source projects, such as Spring, to provide Azure-specific support. All Azure SDK for Java libraries are designed to work together and provide a cohesive developer experience, as described in [Use the Azure SDK for Java](overview.md). The SDK achieves this cohesion through a common set of concepts, including [HTTP pipelines](http-client-pipeline.md), [identity and authentication](authentication/overview.md), and [logging](logging-overview.md).\n\nThe following tables show all libraries that exist in the Azure SDK for Java. These tables provide links to all relevant repositories and documentation. To keep up to date with the Azure SDKs, consider following the [@AzureSDK](https://twitter.com/azuresdk) Twitter account and the [Azure SDK blog](https://devblogs.microsoft.com/azure-sdk/).\n\n[Libraries using azure-core](#libraries-using-azure-core)\n\n[All libraries](#all-libraries)\n\n## Libraries using azure-core\n\n[!INCLUDE [java-new-releases](../../includes/java-new.md)]\n\n## All libraries\n\n[!INCLUDE [java-all-libraries](../../includes/java-all.md)]\n"
  },
  {
    "path": "articles/java/sdk/containers-samples.md",
    "content": "---\ntitle: Java source samples for Azure Container Service\ndescription: Get sample code for working with Azure Container Service from your Java apps.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\nms.date: 06/02/2025\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Java samples for Azure Container Service\n\nThe following table links to Java source you can use to create and configure applications running in Azure Container Service.\n\n[!INCLUDE [java-container-samples](includes/java-container-samples.md)]\n"
  },
  {
    "path": "articles/java/sdk/get-started-gradle.md",
    "content": "---\ntitle: Get started with Azure SDK and Gradle\ndescription: Learn how to build projects using Azure SDK and Gradle.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\nms.date: 02/14/2025\nms.topic: get-started\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Get started with Azure SDK and Gradle\n\nThis article shows you how to use Gradle to build applications with the Azure SDK for Java. In this article, you set up a new project with Gradle, build projects with Gradle, and use the GraalVM native image tooling to create platform-specific native binaries.\n\n## Prerequisites\n\n* [Java Developer Kit](../fundamentals/java-support-on-azure.md), version 8 or later. We recommend version 17 for the best experience.\n* [Gradle](http://gradle.org)\n\n## Create a new Gradle project\n\nUnlike Maven, Gradle doesn't have an archetype system for bootstrapping projects in a template fashion. Bootstrapping a Gradle project is possible, but it doesn't configure Azure SDK for Java specifics like the [Maven equivalent](get-started-maven.md). To work through the steps, first use the following command to create a new, empty directory from the command line:\n\n```bash\ngradle init --type java-application\n```\n\nYou're prompted to answer a short series of questions, after which you have a directory containing a collection of files and subdirectories. To ensure that the generated files compile, run the following commands required to verify the build:\n\n```bash\ngradle clean assemble test\n```\n\nYou can now move on to editing the **build.gradle** file located in the app directory. For starters, to make dependency version management simpler, the Azure SDK for Java team publishes the [Azure SDK for Java client BOM](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom/1.2.10/versions) each month. This BOM file includes all Generally Available (GA) Azure SDK for Java client packages with their compatible dependency version.\n\nTo use dependency versions for an Azure SDK for Java client library that is in the BOM, include the following snippet in the project **build.gradle** file. Replace the `{bom_version_to_target}` placeholder with the [latest release of the Azure SDK for Java BOM](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom/1.2.10/versions).\n\n```groovy\ndependencies {\n    implementation platform('com.azure:azure-sdk-bom:{bom_version_to_target}')\n}\n```\n\nYou can find all releases of the Azure SDK for Java client BOM at [azure-sdk-bom](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom/1.2.10/versions). We recommend using the latest version to take advantage of the newest features of the Azure SDK for Java client libraries.\n\nOnce you've started depending on the Azure SDK for Java BOM, you can include dependencies on libraries without specifying their version. These version values are looked up automatically in the Azure SDK for Java BOM. For example, to include an `azure-storage-blob` dependency, add the following lines to your **build.gradle** file:\n\n```groovy\ndependencies {\n    implementation 'com.azure:azure-storage-blob'\n}\n```\n\nUsing Gradle to define project dependencies can make managing your projects simpler. With the Azure SDK BOM, you can accelerate your project while being more confident about your dependency versioning over the long term. We recommend using the BOM to keep dependencies aligned and up to date.\n\n### Include a package not in the BOM\n\nThe Azure SDK for Java client BOM includes only Generally Available (GA) libraries. If you want to depend on a package that is still in beta or on a library version different than the one included in the BOM, you can specify the Maven dependency version along with the `groupId` and `artifactId` in the dependency section. You can choose to have dependencies that use BOM versions and dependencies with overridden versions in the same project POM file, as shown in the following example:\n\n```groovy\ndependencies {\n    // Use the dependency version that is in the BOM\n    implementation 'com.azure:azure-messaging-eventhubs'\n\n    // Override the Service Bus dependency version specified in the BOM\n    implementation 'com.azure:azure-messaging-servicebus:7.4.0'\n}\n```\n\nIf you use this approach and specify versions directly in your project, you might get dependency version conflicts. These conflicts arise because different packages may depend on different versions of common dependencies, and these versions may not be compatible with each other. When conflicts occur, you can experience undesirable behavior at compile time or runtime. We recommend that you rely on versions that are in the Azure SDK BOM unless necessary. For more information on dealing with dependencies when using the Azure SDK for Java, see [Troubleshoot dependency version conflicts](/azure/developer/java/sdk/troubleshooting-dependency-version-conflict).\n\n## Build a native image with GraalVM\n\nYou can use GraalVM to create a native image of a Java application. GraalVM compiles the Java code ahead of time into native machine code, which can yield drastic performance gains in certain situations. The Azure SDK for Java provides the necessary metadata in each of its client libraries to support GraalVM native image compilation.\n\nTo get started, you need to install GraalVM and prepare your development system for compiling native images. The installation process for GraalVM is straightforward, and the GraalVM documentation provides step-by-step instructions for [installing GraalVM](https://www.graalvm.org/latest/docs/getting-started/) and [using GraalVM to install native-image](https://www.graalvm.org/latest/reference-manual/native-image/). Follow the [prerequisites](https://www.graalvm.org/latest/reference-manual/native-image/#prerequisites) section carefully to install the necessary native compilers for your operating system.\n\nWith your existing Gradle-based project, you can follow the [GraalVM instructions for Gradle](https://graalvm.github.io/native-build-tools/latest/gradle-plugin.html) on how to add GraalVM support to your project. In doing so, you then have more build options, allowing you to compile your application into the standard Java bytecode, or into a native image compiled by GraalVM.\n\nNext, you're ready to run a native image build. You can use standard Gradle tooling to use GraalVM native image. For Gradle, use the following command:\n\n```bash\ngradle nativeCompile\n```\n\nAfter you run this command, GraalVM outputs a native executable for the platform it's running on. The executable appears in the Gradle **/app/build/native/nativeCompile** directory of your project. You can now run your application with this executable file, and it should perform similarly to a standard Java application.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Get started with Azure extensions for IntelliJ and Eclipse](get-started-ide.md)\n"
  },
  {
    "path": "articles/java/sdk/get-started-ide.md",
    "content": "---\ntitle: Get started with Azure extensions for IntelliJ and Eclipse\ndescription: Learn how to install and use extensions into your IDE to be more productive.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\nms.date: 04/01/2025 \nms.topic: get-started\nms.custom:\n  - devx-track-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Get started with Azure extensions for IntelliJ and Eclipse\n\nThis article walks you through setting up a development environment for Azure development in Java. Microsoft provides IDE extensions for both IntelliJ and Eclipse to increase productivity when working with the Azure SDK for Java.\n\n## Install the Azure Toolkit for IntelliJ\n\nThe [Azure toolkit](../toolkit-for-intellij/index.yml) is necessary if you plan to deploy web apps or APIs programmatically. The toolkit also has a comprehensive SDK reference book embedded for any Azure development with Java SDK. For a quickstart with Azure Web Apps, see [Create a Hello World web app for Azure App Service using IntelliJ](../toolkit-for-intellij/create-hello-world-web-app.md).\n\nThe following steps summarize the installation process.\n\n1. Select the **File** menu, and then select **Settings**.\n1. Select **Browse repositories**, and then search **Azure** and install the **Azure toolkit for Intellij**.\n1. Restart Intellij.\n1. Open reference book from **Tools -> Azure -> Azure SDK Reference Book**\n\n   ![Azure SDK Reference Book in IntelliJ](./media/azure-sdk-reference-book-intellij.png)\n\n## Install the Azure Toolkit for Eclipse\n\nThe [Azure toolkit](../toolkit-for-eclipse/index.yml) is necessary if you plan to deploy web apps or APIs programmatically. Currently, it isn't used for any other kinds of development. For a quickstart, see [Create a Hello World web app for Azure App Service using Eclipse](../toolkit-for-eclipse/create-hello-world-web-app.md).\n\nThe following steps summarize the installation process.\n\n1. Select the **Help** menu, and then select **Install new software**.\n1. In the **Work with** box, enter `http://dl.microsoft.com/eclipse/` and select **Enter**.\n1. Select the check box next to **Azure toolkit for Java**. Clear the check box for **Contact all update sites during install to find required software**. Then select **Next**.\n\n## Next steps\n\n* [Create a Hello World web app for Azure App Service using IntelliJ](../toolkit-for-intellij/create-hello-world-web-app.md)\n* [Create a Hello World web app for Azure App Service using Eclipse](../toolkit-for-eclipse/create-hello-world-web-app.md)\n"
  },
  {
    "path": "articles/java/sdk/get-started-maven.md",
    "content": "---\ntitle: Get started with Azure SDK and Apache Maven\ndescription: Learn how to build projects using Azure SDK and Apache Maven.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\nms.date: 02/14/2025\nms.topic: get-started\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Get started with Azure SDK and Apache Maven\n\nThis article shows you how to use Apache Maven to build applications with the Azure SDK for Java. In this article, you set up a new project with Maven, build projects with Maven, and use the GraalVM native image tooling to create platform-specific native binaries.\n\nThe Azure SDK for Java project includes a Maven archetype that can accelerate the bootstrapping of a new project. The Azure SDK for Java Maven archetype creates a new application, with files and a directory structure that follows best practices. In particular, the Azure SDK for Java Maven archetype creates a new Maven project with the following features:\n\n* A dependency on the latest `azure-sdk-bom` BOM release, which ensures that all dependencies for Azure SDK for Java are aligned, and gives you the best developer experience possible.\n* Built-in support for GraalVM native image compilation.\n* Support for generating a new project with a specified set of Azure SDK for Java client libraries.\n* Integration with the Azure SDK for Java build tooling, which gives build-time analysis of your project to ensure that many best practices are followed.\n\n## Prerequisites\n\n* [Java Developer Kit](../fundamentals/java-support-on-azure.md), version 8 or later. We recommend version 17 for the best experience.\n* [Apache Maven](http://maven.apache.org)\n\n## Create a new Maven project\n\nThe Azure SDK for Java Maven archetype is published to Maven Central. That means you can use the archetype directly to bootstrap a new application with the following command:\n\n```bash\nmvn archetype:generate \\\n    -DarchetypeGroupId=com.azure.tools \\\n    -DarchetypeArtifactId=azure-sdk-archetype\n```\n\nAfter you enter this command, a series of prompts asks for details about your project so the archetype can generate the right output for you. The following table describes the properties you need to provide values for:\n\n| Name             | Description  |\n|------------------|--------------|\n| `groupId`        | (Required) The Maven `groupId` to use in the POM file created for the generated project.  |\n| `artifactId`     | (Required) The Maven `artifactId` to use in the POM file created for the generated project.  |\n| `package`        | (Optional) The package name to put the generated code into. Inferred from the `groupId` if it's not specified. |\n| `azureLibraries` | (Optional) A comma-separated list of Azure SDK for Java libraries, using their Maven artifact IDs. For a list of such artifact IDs, see [Azure SDK Releases](https://azure.github.io/azure-sdk/releases/latest/java.html). |\n| `enableGraalVM`  | (Optional) `false` to indicate that the generated Maven POM file shouldn't include support for compiling your application to a native image using GraalVM; otherwise, `true`. The default value is `true`. |\n| `javaVersion`    | (Optional) The minimum version of the JDK to target when building the generated project, such as `8`, `11`, or `17`. The default value is the latest LTS release (currently `17`). The minimum value is `8`. |\n| `junitVersion`   | (Optional) The version of JUnit to include as a dependency. The default value is `5`. Valid values `4` and `5`. |\n\nAlternately, you can provide these values when you call the archetype command shown earlier. This approach is useful, for example, for automation purposes. You can specify the values as parameters using the standard Maven syntax of appending `-D` to the parameter name, for example:\n\n```bash\n-DjavaVersion=17\n```\n\n### Java version support\n\nAs a best practice, you should use a Java LTS release when deploying to production. By default, the Azure SDK Maven archetype selects the latest LTS release, which currently sets a Java 17 baseline. However, you can override the default behavior by setting the `javaVersion` parameter.\n\n## Use the Azure SDK for Java build tool\n\nThe Azure SDK for Java project ships a Maven build tool that you can include in your projects. This tool runs locally and doesn't transmit any data to Microsoft. You can configure the tool to generate a report or fail the build when certain conditions are met, which is useful to ensure compliance with numerous best practices, such as the following practices:\n\n* Validation of the correct use of the `azure-sdk-for-java` BOM, including using the latest version, and relying on it to define dependency versions on Azure SDK for Java client libraries. For more information, see the [Add Azure SDK for Java to an existing project](#add-azure-sdk-for-java-to-an-existing-project) section.\n* Validation that historical Azure client libraries aren't being used when newer and improved versions exist.\n\nThe report also provides insight into usage of beta APIs.\n\nYou can configure the build tool in a project Maven POM file as shown in the following example. Be sure to replace the `{latest_version}` placeholder with the [latest version listed online](https://central.sonatype.com/artifact/com.azure.tools/azure-sdk-build-tool).\n\n```xml\n<build>\n  <plugins>\n    <plugin>\n      <groupId>com.azure.tools</groupId>\n      <artifactId>azure-sdk-build-tool</artifactId>\n      <version>{latest_version}</version>\n    </plugin>\n  </plugins>\n</build>\n```\n\nAfter adding the build tool into a Maven project, you can run the tool by calling `mvn compile azure:run`. Depending on the configuration provided, you can expect to see build failures or report files generated that can inform you about potential issues before they become more serious. We recommend that you run this tool as part of your CI/CD pipeline. As the build tool evolves, we'll publish new releases, and we recommend that developers [frequently check for new releases](https://central.sonatype.com/artifact/com.azure.tools/azure-sdk-build-tool) and update as appropriate.\n\nIt's possible to configure the build tool to enable or disable particular features. For this configuration, add a `configuration` section in the XML shown previously. Within that section, configure the settings shown in the following table. Any configuration that isn't explicitly mentioned takes the default value specified in the table.\n\n| Property name                              | Default value | Description |\n|--------------------------------------------|---------------|-------------|\n| `validateAzureSdkBomUsed`                  | true          | Ensures that the project has the [azure-sdk-for-java BOM][azure-sdk-bom] referenced appropriately, so that Azure SDK for Java client library dependencies may take their versions from the BOM. |\n| `validateLatestBomVersionUsed`             | true          | Ensures that dependencies are kept up to date by reporting back (or failing the build) if a newer [azure-sdk-for-java BOM][azure-sdk-bom] exists. You can always find the latest version [online](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom/1.2.10/versions). |\n| `validateBomVersionsAreUsed`               | true          | Ensures that, where a dependency is available from the [azure-sdk-for-java BOM][azure-sdk-bom], the version isn't being manually overridden. |\n| `validateNoDeprecatedMicrosoftLibraryUsed` | true          | Ensures that the project doesn't make use of previous-generation Azure libraries. Using the new and previous-generation libraries in a single project is unlikely to cause any issue, but results in a suboptimal developer experience. |\n| `validateNoBetaLibraryUsed`                | false         | Some Azure SDK for Java client libraries have beta releases, with version strings in the form `x.y.z-beta.n`. Enabling this feature ensures that no beta libraries are being used. |\n| `validateNoBetaApiUsed`                    | true          | Azure SDK for Java client libraries sometimes have GA releases with methods annotated with `@Beta`. This check looks to see if any such methods are being used. |\n| `sendToMicrosoft`                          | true          | Specifies whether to send the build report to Microsoft for telemetry purposes. This helps guide the development team on where to prioritize documentation, samples, and improved convenience APIs. No user-identifiable content is submitted. |\n| `reportFile`                               | -             | (Optional) Specifies the location to write the build report out to, in JSON format. If not specified, no report is written, and a summary of the build, or the appropriate build failures, is shown in the terminal. |\n\n[azure-sdk-bom]: #add-azure-sdk-for-java-to-an-existing-project\n\n## Add Azure SDK for Java to an existing project\n\nTo make dependency version management simpler, the Azure SDK for Java team publishes the [Azure SDK for Java client BOM](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom/1.2.10/versions) each month. This BOM file includes all Generally Available (GA) Azure SDK for Java client packages with their compatible dependency version.\n\nTo use dependency versions for an Azure SDK for Java client library that is in the BOM, include the following snippet in the project **pom.xml** file. Replace the `{bom_version_to_target}` placeholder with the [latest release of the Azure SDK for Java BOM](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom/1.2.10/versions). Replace the `{artifactId}` placeholder with the Azure service SDK package name.\n\n```xml\n<dependencyManagement>\n  <dependencies>\n    <dependency>\n      <groupId>com.azure</groupId>\n      <artifactId>azure-sdk-bom</artifactId>\n      <version>{bom_version_to_target}</version>\n      <type>pom</type>\n      <scope>import</scope>\n    </dependency>\n  </dependencies>\n</dependencyManagement>\n\n<dependencies>\n  <dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>{artifactId}</artifactId>\n  </dependency>\n</dependencies>\n```\n\nYou can find all releases of the Azure SDK for Java client BOM at [azure-sdk-bom](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom/1.2.10/versions). We recommend using the latest version to take advantage of the newest features of the Azure SDK for Java client libraries.\n\nUsing Maven to define project dependencies can make managing your projects simpler. With the Azure SDK BOM and Azure SDK Maven archetype, you can accelerate your project while being more confident about your dependency versioning over the long term. We recommend using the BOM to keep dependencies aligned and up to date.\n\nIn addition to adding the Azure SDK BOM, we recommend also including the Azure SDK for Java build tool. This tool helps to diagnose many issues commonly encountered when building applications, as described previously in this article.\n\n### Include a package not in the BOM\n\nThe Azure SDK for Java client BOM includes only Generally Available (GA) libraries. If you want to depend on a package that is still in beta or on a library version different than the one included in the BOM, you can specify the Maven dependency version along with the `groupId` and `artifactId` in the dependency section. You can choose to have dependencies that use BOM versions and dependencies with overridden versions in the same project POM file, as shown in the following example:\n\n```xml\n<dependencies>\n  <dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-messaging-eventhubs</artifactId> <!-- Use the dependency version that is in the BOM -->\n  </dependency>\n  <dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-messaging-servicebus</artifactId>\n    <version>7.4.0</version> <!-- Override the Service Bus dependency version specified in the BOM -->\n  </dependency>\n</dependencies>\n```\n\nIf you use this approach and specify versions directly in your project, you might get dependency version conflicts. These conflicts arise because different packages may depend on different versions of common dependencies, and these versions may not be compatible with each other. When conflicts occur, you can experience undesirable behavior at compile time or runtime. We recommend that you rely on versions that are in the Azure SDK BOM unless necessary. For more information on dealing with dependencies when using the Azure SDK for Java, see [Troubleshoot dependency version conflicts](troubleshooting-dependency-version-conflict.md).\n\n## Build a native image with GraalVM\n\nYou can use GraalVM to create a native image of a Java application. GraalVM compiles the Java code ahead of time into native machine code, which can yield drastic performance gains in certain situations. The Azure SDK for Java provides the necessary metadata in each of its client libraries to support GraalVM native image compilation.\n\nTo get started, you need to install GraalVM and prepare your development system for compiling native images. The installation process for GraalVM is straightforward, and the GraalVM documentation provides step-by-step instructions for [installing GraalVM](https://www.graalvm.org/latest/docs/getting-started/) and [using GraalVM to install native-image](https://www.graalvm.org/latest/reference-manual/native-image/). Follow the [prerequisites](https://www.graalvm.org/latest/reference-manual/native-image/#prerequisites) section carefully to install the necessary native compilers for your operating system.\n\nThe [Azure SDK for Java Maven archetype](#create-a-new-maven-project) can configure your build to support GraalVM native image compilation, but you can also add it to an existing Maven build. You can find instructions for [Maven](https://graalvm.github.io/native-build-tools/latest/maven-plugin.html) on the GraalVM website.\n\nNext, you're ready to run a native image build. You can use standard Maven tooling to use GraalVM native image. For Maven, use the following command:\n\n```shell\nmvn clean package -Pnative\n```\n\nAfter you run this command, GraalVM outputs a native executable for the platform it's running on. The executable appears in the Maven **/target** directory of your project. You can now run your application with this executable file, and it should perform similarly to a standard Java application.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Get started with Azure extensions for IntelliJ and Eclipse](get-started-ide.md)\n"
  },
  {
    "path": "articles/java/sdk/http-client-pipeline.md",
    "content": "---\ntitle: HTTP clients and pipelines in the Azure SDK for Java\ndescription: Provides an overview of the HTTP client and pipelines functionality in the Azure SDK for Java.\nms.date: 04/01/2025 \nms.topic: concept-article\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: srnagar\n---\n\n# HTTP clients and pipelines in the Azure SDK for Java\n\nThis article provides an overview of using the HTTP client and pipeline functionality within the Azure SDK for Java. This functionality provides a consistent, powerful, and flexible experience for developers using all Azure SDK for Java libraries.\n\n## HTTP clients\n\nThe Azure SDK for Java is implemented using an `HttpClient` abstraction. This abstraction enables a pluggable architecture that accepts multiple HTTP client libraries or custom implementations. However, to simplify dependency management for most users, all Azure client libraries depend on `azure-core-http-netty`. As such, the [Netty](https://netty.io) HTTP client is the default client used in all Azure SDK for Java libraries.\n\n> [!IMPORTANT]\n> Ensure that your `azure-core-http-netty` dependency uses version `1.15.12` or later. If you're using a [BOM](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom/1.2.36/versions), ensure that your BOM version is at least `1.2.36`.\n>\n> This minimum version is required to enable large HTTP headers returned by [Azure Resource Manager](/azure/azure-resource-manager/management/async-operations#url-to-monitor-status) during long-running operations.\n\nAlthough Netty is the default HTTP client, the SDK provides three client implementations, depending on which dependencies you already have in your project. These implementations are for:\n\n* [Netty](https://netty.io)\n* [OkHttp](https://square.github.io/okhttp/)\n* [HttpClient](https://openjdk.java.net/groups/net/httpclient/intro.html) introduced in JDK 11\n\n> [!NOTE]\n> The JDK `HttpClient` in combination with the Azure SDK for Java is only supported with JDK 12 and higher.\n\n### Replace the default HTTP client\n\nIf you prefer another implementation, you can remove the dependency on Netty by excluding it in the build configuration files. In a Maven **pom.xml** file, you exclude the Netty dependency and include another dependency.\n\nThe following example shows you how to exclude the Netty dependency from a real dependency on the `azure-security-keyvault-secrets` library. Be sure to exclude Netty from all appropriate `com.azure` libraries, as shown here:\n\n```xml\n<dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-security-keyvault-secrets</artifactId>\n    <version>4.9.4</version>\n    <exclusions>\n      <exclusion>\n        <groupId>com.azure</groupId>\n        <artifactId>azure-core-http-netty</artifactId>\n      </exclusion>\n    </exclusions>\n</dependency>\n\n<!-- OkHttp -->\n<dependency>\n  <groupId>com.azure</groupId>\n  <artifactId>azure-core-http-okhttp</artifactId>\n  <version>1.12.10</version>\n</dependency>\n\n<!-- JDK HttpClient -->\n<dependency>\n  <groupId>com.azure</groupId>\n  <artifactId>azure-core-http-jdk-httpclient</artifactId>\n  <version>1.0.3</version>\n</dependency>\n```\n\n> [!NOTE]\n> If you remove the Netty dependency but provide no implementation in its place, the application fails to start. An `HttpClient` implementation must exist on the classpath.\n\n### Configure HTTP clients\n\nWhen you build a service client, it defaults to using `HttpClient.createDefault()`. This method returns a basic `HttpClient` instance based on the provided HTTP client implementation. In case you require a more complex HTTP client, such as a proxy, each implementation offers a builder that allows you to construct a configured `HttpClient` instance. The builders are `NettyAsyncHttpClientBuilder`, `OkHttpAsyncHttpClientBuilder`, and `JdkAsyncHttpClientBuilder`.\n\nThe following examples show how to build `HttpClient` instances using Netty, OkHttp, and the JDK HTTP client. These instances proxy through `http://localhost:3128` and authenticate with user `example` with password `weakPassword`.\n\n```java\n// Netty\nHttpClient httpClient = new NettyAsyncHttpClientBuilder()\n    .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(\"localhost\", 3128))\n        .setCredentials(\"example\", \"weakPassword\"))\n    .build();\n\n// OkHttp\nHttpClient httpClient = new OkHttpAsyncHttpClientBuilder()\n    .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(\"localhost\", 3128))\n        .setCredentials(\"example\", \"weakPassword\"))\n    .build();\n\n// JDK HttpClient\nHttpClient client = new JdkAsyncHttpClientBuilder()\n    .proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(\"localhost\", 3128))\n        .setCredentials(\"example\", \"weakPassword\"))\n    .build();\n```\n\nYou can now pass the constructed `HttpClient` instance into a service client builder for use as the client for communicating with the service. The following example uses the new `HttpClient` instance to build an Azure Storage Blob client.\n\n```java\nBlobClient blobClient = new BlobClientBuilder()\n    .connectionString(<connection string>)\n    .containerName(\"container\")\n    .blobName(\"blob\")\n    .httpClient(httpClient)\n    .build();\n```\n\nFor management libraries, you can set the `HttpClient` during Manager configuration.\n\n```java\nAzureResourceManager azureResourceManager = AzureResourceManager.configure()\n    .withHttpClient(httpClient)\n    .authenticate(credential, profile)\n    .withDefaultSubscription();\n```\n\n## HTTP pipeline\n\nThe HTTP pipeline is one of the key components in achieving consistency and diagnosability in the Java client libraries for Azure. An HTTP pipeline is composed of:\n\n* An HTTP transport\n* HTTP pipeline policies\n\nYou can provide your own custom HTTP pipeline when creating a client. If you don't provide a pipeline, the client library creates one configured to work with that specific client library.\n\n### HTTP transport\n\nThe HTTP transport is responsible for establishing the connection to the server, and sending and receiving HTTP messages. The HTTP transport forms the gateway for the Azure SDK client libraries to interact with Azure services. As noted earlier in this article, the Azure SDK for Java uses [Netty](https://netty.io/) by default for its HTTP transport. However, the SDK also provides a pluggable HTTP transport so you can use other implementations where appropriate. The SDK also provides two more HTTP transport implementations for OkHttp and the HTTP client that ships with JDK 11 and later.\n\n### HTTP pipeline policies\n\nA pipeline consists of a sequence of steps executed for each HTTP request-response roundtrip. Each policy has a dedicated purpose and acts on a request or a response or sometimes both. Because all client libraries have a standard 'Azure Core' layer, this layer ensures that each policy executes in order in the pipeline. When you send a request, the policies execute in the order that they're added to the pipeline. When you receive a response from the service, the policies execute in the reverse order. All policies added to the pipeline execute before you send the request and after you receive a response. The policy has to decide whether to act on the request, the response, or both. For example, a logging policy logs the request and response but the authentication policy is only interested in modifying the request.\n\nThe Azure Core framework provides the policy with the necessary request and response data along with any necessary context to execute the policy. The policy can then perform its operation with the given data and pass the control along to the next policy in the pipeline.\n\n![HTTP pipeline diagram](./media/http-pipeline.svg)\n\n### HTTP pipeline policy position\n\nWhen you make HTTP requests to cloud services, it's important to handle transient failures and to retry failed attempts. Because this functionality is a common requirement, Azure Core provides a retry policy that can watch for transient failures and automatically retry the request.\n\nThis retry policy, therefore, splits the whole pipeline into two parts: policies that execute before the retry policy and policies that execute after the retry policy. Policies added before the retry policy execute only once per API operation, and policies added after the retry policy execute as many times as the retries.\n\nSo, when building the HTTP pipeline, you should understand whether to execute a policy for each request retry or once per API operation.\n\n### Common HTTP pipeline policies\n\nHTTP pipelines for REST-based services have configurations with policies for authentication, retries, logging, telemetry, and specifying the request ID in the header. Azure Core is preloaded with these commonly required HTTP policies that you can add to the pipeline.\n\n| Policy                | GitHub link                                                                                                                                                                                       |\n|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| retry policy          | [RetryPolicy.java](https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/RetryPolicy.java)                                         |\n| authentication policy | [BearerTokenAuthenticationPolicy.java](https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/BearerTokenAuthenticationPolicy.java) |\n| logging policy        | [HttpLoggingPolicy.java](https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpLoggingPolicy.java)                             |\n| request ID policy     | [RequestIdPolicy.java](https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/RequestIdPolicy.java)                                 |\n| telemetry policy      | [UserAgentPolicy.java](https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/UserAgentPolicy.java)                                 |\n\n### Custom HTTP pipeline policy\n\nThe HTTP pipeline policy provides a convenient mechanism to modify or decorate the request and response. You can add custom policies to the pipeline that the user or the client library developer created. When adding the policy to the pipeline, you can specify whether this policy should be executed per-call or per-retry.\n\nTo create a custom HTTP pipeline policy, you just extend a base policy type and implement some abstract method. You can then plug the policy into the pipeline.\n\n### Custom headers in HTTP requests\n\nThe Azure SDK for Java client libraries provide a consistent way to define customized headers through `Context` objects in the public API, as shown in the following example:\n\n```java\n// Add your headers\nHttpHeaders headers = new HttpHeaders();\nheaders.set(\"my-header1\", \"my-header1-value\");\nheaders.set(\"my-header2\", \"my-header2-value\");\nheaders.set(\"my-header3\", \"my-header3-value\");\n\n// Call API by passing headers in Context.\nconfigurationClient.addConfigurationSettingWithResponse(\n    new ConfigurationSetting().setKey(\"key\").setValue(\"value\"),\n    new Context(AddHeadersFromContextPolicy.AZURE_REQUEST_HTTP_HEADERS_KEY, headers));\n\n// The three headers are now be added to the outgoing HTTP request.\n```\n\nFor more information, see the [AddHeadersFromContextPolicy Class](/java/api/com.azure.core.http.policy.addheadersfromcontextpolicy).\n\n### Default TLS/SSL library\n\nAll client libraries, by default, use the Tomcat-native Boring SSL library to enable native-level performance for TLS/SSL operations. The Boring SSL library is an uber JAR containing native libraries for Linux, macOS, and Windows, and provides better performance compared to the default TLS/SSL implementation within the JDK.\n\n#### Reduce Tomcat-Native TLS/SSL dependency size\n\nBy default, the uber JAR of the Tomcat-Native Boring SSL library is used in Azure SDKs for Java. To reduce the size of this dependency, you need to include the dependency with an `os` classifier as per [netty-tcnative](https://netty.io/wiki/forked-tomcat-native.html), as shown in the following example:\n\n```xml\n<project>\n  ...\n  <dependencies>\n    ...\n    <dependency>\n      <groupId>io.netty</groupId>\n      <artifactId>netty-tcnative-boringssl-static</artifactId>\n      <version>2.0.25.Final</version>\n      <classifier>${os.detected.classifier}</classifier>\n    </dependency>\n    ...\n  </dependencies>\n  ...\n  <build>\n    ...\n    <extensions>\n      <extension>\n        <groupId>kr.motd.maven</groupId>\n        <artifactId>os-maven-plugin</artifactId>\n        <version>1.4.0.Final</version>\n      </extension>\n    </extensions>\n    ...\n  </build>\n  ...\n</project>\n```\n\n#### Use JDK TLS/SSL\n\nIf you'd rather use the default JDK TLS/SSL instead of Tomcat-Native Boring SSL, then you need to exclude the Tomcat-native Boring SSL library. Be aware that, based on our tests, the performance of JDK TLS/SSL is 30% slower compared to Tomcat-Native Boring SSL. When you use `com.azure:azure-core:1.28.0` or later, the `HttpClient`-implementing library (such as `com.azure:azure-core-http-netty`) manages the dependency on Tomcat-Native Boring SSL. To exclude the dependency, add the following configuration to your POM file:\n\n```xml\n<project>\n  ...\n  <dependencies>\n    ...\n    <dependency>\n     <groupId>com.azure</groupId>\n       <artifactId>azure-core-http-netty</artifactId>\n       <version>1.13.6</version>\n       <exclusions>\n         <exclusion>\n           <groupId>io.netty</groupId>\n           <artifactId>netty-tcnative-boringssl-static</artifactId>\n         </exclusion>\n       </exclusions>\n    </dependency>\n    ...\n  </dependencies>\n  ...\n</project>\n```\n\n## Next steps\n\nNow that you're familiar with HTTP client functionality in the Azure SDK for Java, learn how to further customize the HTTP client you're using. For more information, see [Configure proxies in the Azure SDK for Java](proxying.md).\n"
  },
  {
    "path": "articles/java/sdk/includes/java-aad-samples.md",
    "content": "| Sample  | Description |\n|---------|---------|\n| [Integrating Microsoft Entra ID into a Java web application][1] | Set up OAuth2 authentication in a Java web app. |\n| [Integrating Microsoft Entra ID into a Java command line using username and password][3] | Obtain a JWT access token through OAuth 2.0, then use the access token to authenticate with a Microsoft Entra protected web API. |\n| [Manage users, groups, and roles with the Graph API][4] | Manage users, groups, roles, and service principals with the Graph API using the management API. |\n| [Manage service principals][5] | Create a service principal for an application, assign it a role, and use the service principal to access resources in the subscription |\n\n[1]: https://github.com/Azure-Samples/active-directory-java-webapp-openidconnect\n[3]: https://github.com/Azure-Samples/active-directory-java-native-headless\n[4]: https://github.com/Azure-Samples/aad-java-manage-users-groups-and-roles/\n[5]: https://github.com/Azure-Samples/aad-java-manage-service-principals/\n"
  },
  {
    "path": "articles/java/sdk/includes/java-container-samples.md",
    "content": "| Sample  | Description |\n|---------|---------|\n| [Manage Azure Container Registries][1] | Create a new Azure Container registry and add an new image. | \n| [Manage Azure Container Service][2] | Create an Azure Container Service with Kubernetes orchestration. | \n| [Deploy an image from Azure Container Registry into a new Linux Web App][3] | Deploy a Docker image running Tomcat to a new web app running in Azure App Service for Linux. | \n\n[1]: https://github.com/Azure-Samples/acr-java-manage-azure-container-registry/\n[2]: https://github.com/azure-samples/acs-java-manage-azure-container-service-with-kubernetes-orchestrator\n[3]: https://github.com/Azure-Samples/app-service-java-deploy-image-from-acr-to-linux/\n"
  },
  {
    "path": "articles/java/sdk/includes/java-sql-samples.md",
    "content": "|Sample   |Description  |\n|---------|---------|\n| [Connect and query data from Azure SQL Database using JDBC][3] | Configure a sample database, then run select, insert, update, and delete commands. |\n| [Create and manage SQL databases][1] | Create SQL databases, set performance levels, and configure firewalls.|\n| [Manage SQL databases across multiple regions][2] | Create a master SQL database and read-only databases from the master in multiple regions. Connect VMs to their nearest SQL database instance with a virtual network and firewall rules. | \n\n[1]: https://github.com/Azure-Samples/sql-database-java-manage-db/\n[2]: https://github.com/Azure-Samples/sql-database-java-manage-sql-databases-across-regions\n[3]: /azure/sql-database/sql-database-connect-query-java\n"
  },
  {
    "path": "articles/java/sdk/includes/java-vm-samples.md",
    "content": "| Sample  | Description |\n|---|---|\n| [Create a virtual machine from a custom image][1] | Create a custom virtual machine image and use it to create new virtual machines. | \n| [Create a virtual machine using specialized VHD from a snapshot][2] | Create snapshot from the virtual machine's OS and data disks, create managed disks from the snapshots, and then create a virtual machine by attaching the managed disks. |  \n| [Create virtual machines in parallel in the same network][3] | Create virtual machines in the same region on the same virtual network with two subnets in parallel. |\n\n[1]: https://github.com/Azure-Samples/managed-disk-java-create-virtual-machine-using-custom-image/\n[2]: https://github.com/Azure-Samples/managed-disk-java-create-virtual-machine-using-specialized-disk-from-vhd/\n[3]: https://github.com/Azure-Samples/compute-java-manage-virtual-machines-in-parallel/\n"
  },
  {
    "path": "articles/java/sdk/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure SDK for Java documentation\nsummary: Cloud development using Java on Azure.\n\nmetadata:\n  title: Azure SDK for Java Documentation\n  description: Cloud development using Java on Azure\n  ms.date: 04/01/2025 \n  ms.topic: landing-page\n  author: bmitchell287\n  ms.author: brendm\n  ms.reviewer: jogiles\n  ms.custom: devx-track-java, devx-track-extended-java\n\nlandingContent:\n  - title: Azure for Java developers\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Get started with Apache Maven\n            url: get-started-maven.md\n          - text: Get started with Gradle\n            url: get-started-gradle.md\n          - text: Get started with IntelliJ or Eclipse\n            url: get-started-ide.md\n          - text: Use the Azure SDK for Java\n            url: overview.md\n      - linkListType: reference\n        links:\n          - text: Libraries, drivers, and Spring modules\n            url: libraries-drivers-modules.md\n          - text: Java API browser\n            url: /java/api\n      - linkListType: how-to-guide\n        links:\n          - text: Identity and authentication\n            url: authentication/overview.md\n          - text: Configure logging\n            url: logging-overview.md\n  - title: Common concepts\n    linkLists:\n      - linkListType: learn\n        links:\n        - text: HTTP clients and pipeline\n          url: http-client-pipeline.md\n        - text: Asynchronous programming\n          url: async-programming.md\n        - text: Pagination and iteration\n          url: pagination.md\n        - text: Long-running operations\n          url: lro.md\n        - text: Proxying\n          url: proxying.md\n        - text: Tracing\n          url: tracing.md\n"
  },
  {
    "path": "articles/java/sdk/libraries-drivers-modules.md",
    "content": "---\ntitle: Java libraries, drivers, and Spring modules for Azure\ndescription: Links to the Java libraries, drivers, Spring modules, and related articles available for use with Azure.\nms.date: 06/02/2025\nms.topic: concept-article\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Java libraries, drivers, and Spring modules for Azure\n\nThis article provides links to the Java libraries, drivers, Spring modules, and related articles available for use with Azure.\n\nMicrosoft’s goal is to empower every developer to achieve more, and our commitment to Java developers is no exception. Java and Spring developers want to use idiomatic libraries to simplify connections to their preferred cloud services. These libraries, drivers, and modules let you easily interact with Azure services across data, messaging, cache, storage, eventing, directory, and secrets management. Use the following table to find the right library, driver, or module and guides to get started.\n\n<!-- In raw Markdown, this table is best viewed with word-wrap turned off. -->\n\n| Category     | Azure service              | Java library or driver                             | Java getting started                                                                               | Spring module                                                                                                                | Spring getting started                                                                                                                           |\n|--------------|----------------------------|----------------------------------------------------|----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|\n| Data         | SQL database               | [SQL Database JDBC driver]                         | [Use Java and JDBC with Azure SQL Database]                                                        | Spring Data: <br> • [JDBC] <br> • [JPA] <br> • [R2DBC]                                                                       | Use Spring Data with Azure SQL Database: <br> • [JDBC][JDBC SQL] <br> • [JPA][JPA SQL] <br> • [R2DBC][R2DBC SQL]                                 |\n| Data         | MySQL                      | [MySQL JDBC driver]                                | [Quickstart: Use Java and JDBC with Azure Database for MySQL]                                      | Spring Data: <br> • [JDBC] <br> • [JPA] <br> • [R2DBC]                                                                       | Use Spring Data with Azure Database for MySQL: <br> • [JDBC][JDBC MySQL] <br> • [JPA][JPA MySQL] <br> • [R2DBC][R2DBC MySQL]                     |\n| Data         | PostgreSQL                 | [PostgreSQL JDBC driver]                           | [Quickstart: Use Java and JDBC with Azure Database for PostgreSQL Flexible Server]                 | Spring Data: <br> • [JDBC] <br> • [JPA] <br> • [R2DBC]                                                                       | Use Spring Data with Azure Database for PostgreSQL: <br> • [JDBC][JDBC PostgreSQL] <br> • [JPA][JPA PostgreSQL] <br> • [R2DBC][R2DBC PostgreSQL] |\n| Data         | MariaDB                    | [MariaDB driver]                                   | [MariaDB drivers and management tools compatible with Azure Database for MariaDB]                  | Spring Data: <br> • [JDBC] <br> • [JPA] <br> • [R2DBC]                                                                       | Use Spring Data with Azure Database for MySQL: <br> • [JDBC][JDBC MySQL] <br> • [JPA][JPA MySQL] <br> • [R2DBC][R2DBC MySQL]                     |\n| Data         | Azure Cosmos DB - SQL            | [Maven Repository: com.azure » azure-cosmos]       | [Quickstart: Build a Java app to manage Azure Cosmos DB for NoSQL data]                              | [Spring Data Azure Cosmos DB]                                                                                                      | [How to use the Spring Boot Starter with Azure Cosmos DB for NoSQL]                                                                            |\n| Data         | Azure Cosmos DB - MongoDB        | [MongoDB Java Drivers]                             | [Quickstart: Create a console app with Java and Azure Cosmos DB for MongoDB]                | [Spring Data MongoDB]                                                                                                        | [How to use Spring Data with Azure Cosmos DB for MongoDB]                                                                                        |\n| Data         | Azure Cosmos DB - Cassandra      | [Datastax Java Driver for Apache Cassandra]        | [Quickstart: Build a Java app to manage Azure Cosmos DB for Apache Cassandra data (v4 Driver)]            | [Spring Data Apache Cassandra]                                                                                           | [How to use Spring Data with Azure Cosmos DB for Apache Cassandra]                                                                               |\n| Data         | Azure Cosmos DB for Apache Gremlin        | [Gremlin Java Driver]                              | [Quickstart: Build a graph database with the Java SDK and Azure Cosmos DB for Apache Gremlin]         |                                                                                                                              | [Quickstart: Build a graph database with the Java SDK and Azure Cosmos DB for Apache Gremlin]                                                       |\n| Cache        | Redis                      | [JEDIS client]                                     | [Quickstart: Use Azure Cache for Redis in Java]                                                    | • [Spring Data Redis] <br> • [Reference] <br> • [Spring Cloud Azure Redis support]                                           | [Configure a Spring Boot Initializer app to use Redis in the cloud with Azure Redis Cache]                                                       |\n| Cache        | Redis                      | [LETTUCE client]                                   | [Best Practices for using Azure Cache for Redis with Lettuce]                                      | • [Spring Data Redis] <br> • [Reference] <br> • [Spring Cloud Azure Redis support]                                           | [Configure a Spring Boot Initializer app to use Redis in the cloud with Azure Redis Cache]                                                       |\n| Storage      | Azure Storage              | [Maven Repository: com.azure » azure-storage-blob] | [Quickstart: Manage blobs with Java v12 SDK]                                                       | [Spring Cloud Azure resource handing]                                                                                        | [How to use the Spring Boot Starter for Azure Storage]                                                                                           |\n| Messaging    | Service Bus                | [JMS + AMQP]                                       | [Send messages to an Azure Service Bus topic and receive messages from subscriptions to the topic] | • [Spring AMQP] <br> • [Spring Cloud Azure JMS support]                                                                      | [How to use Spring Boot Starter for Azure Service Bus JMS]                                                                                       |\n| Messaging    | Service Bus                | [Azure Service Bus client library for Java]        | [Azure Service Bus Samples client library for Java]                                                | • [Spring AMQP] <br> • [Spring integration with Azure Service Bus] <br> • [Spring Cloud Stream Binder for Azure Service Bus] | [How to use Spring Cloud Azure Stream Binder for Azure Service Bus]                                                                              |\n| Eventing     | Event Hubs                 | [Kafka]                                            | [Send and Receive Messages in Java using Azure Event Hubs for Apache Kafka Ecosystems]             | • [Spring for Apache Kafka] <br> • [Spring Cloud Azure Kafka support]                                                        | [How to use the Spring Boot Starter for Apache Kafka with Azure Event Hubs]                                                                      |\n| Eventing     | Event Hubs                 | [Azure Event Hubs libraries for Java]              | [Use Java to send events to or receive events from Azure Event Hubs]                               | [Spring Cloud Stream Binder for Event Hubs]                                                                                  | [How to create a Spring Cloud Stream Binder application with Azure Event Hubs]                                                                   |\n| Directory    | Microsoft Entra ID     | [MSAL]                                             | [Enable Java Servlet apps to sign in users on Microsoft Entra ID]                                            | [Microsoft Entra Spring Boot Starter]                                                                                               | [Enable Spring Boot Web apps to sign in users on Microsoft Entra ID]                                                                                       |\n| Directory    | Azure Active Directory B2C | [MSAL]                                             | [Enable Java Servlet apps to sign in users on Azure AD B2C]                                        | [Azure AD B2C Spring Boot Starter]                                                                                           | [Enable Spring Boot Web apps to sign in users on Azure AD B2C]                                                                                   |\n| Secrets      | Key Vault                  | [Key Vault Secrets]                                | [Manage secrets using Key Vault]                                                                   | [Key Vault Secrets Spring Boot Starter]                                                                                      | [Manage secrets for Spring Boot apps]                                                                                                            |\n| Certificates | Key Vault                  | [Key Vault Certificates JCA]                       |                                                                                                    | [Key Vault Certificates Spring Boot Starter]                                                                                 | [Manage certificates for Spring Boot apps]                                                                                                       |\n\n[SQL Database JDBC driver]: /java/api/overview/azure/sql\n[MySQL JDBC driver]: https://dev.mysql.com/downloads/connector/j/\n[PostgreSQL JDBC driver]: https://jdbc.postgresql.org/download/\n[MariaDB driver]: https://downloads.mariadb.org/connector-java/\n[Maven Repository: com.azure » azure-cosmos]: https://mvnrepository.com/artifact/com.azure/azure-cosmos\n[MongoDB Java Drivers]: https://mongodb.github.io/mongo-java-driver/\n[Datastax Java Driver for Apache Cassandra]: https://github.com/datastax/java-driver/tree/4.x\n[Gremlin Java Driver]: https://mvnrepository.com/artifact/org.apache.tinkerpop/gremlin-driver\n[JEDIS client]: https://github.com/redis/jedis\n[LETTUCE client]: https://github.com/redis/lettuce\n[Maven Repository: com.azure » azure-storage-blob]: https://mvnrepository.com/artifact/com.azure/azure-storage-blob\n[JMS + AMQP]: /azure/service-bus-messaging/how-to-use-java-message-service-20#downloading-the-java-message-service-jms-client-library\n[Azure Service Bus client library for Java]: /java/api/overview/azure/messaging-servicebus-readme\n[Kafka]: https://kafka.apache.org/10/documentation.html\n[Azure Event Hubs libraries for Java]: /java/api/overview/azure/eventhub\n[MSAL]: https://github.com/AzureAD/microsoft-authentication-library-for-java\n[Key Vault Secrets]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/keyvault/azure-security-keyvault-secrets\n[Key Vault Certificates JCA]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/keyvault/azure-security-keyvault-jca\n[Use Java and JDBC with Azure SQL Database]: /azure/azure-sql/database/connect-query-java\n[Quickstart: Use Java and JDBC with Azure Database for MySQL]: /azure/mysql/connect-java\n[Quickstart: Use Java and JDBC with Azure Database for PostgreSQL Flexible Server]: /azure/postgresql/flexible-server/connect-java\n[MariaDB drivers and management tools compatible with Azure Database for MariaDB]: /azure/mariadb/concepts-compatibility\n[Quickstart: Build a Java app to manage Azure Cosmos DB for NoSQL data]: /azure/cosmos-db/sql/create-sql-api-java\n[Quickstart: Create a console app with Java and Azure Cosmos DB for MongoDB]: /azure/cosmos-db/mongodb/create-mongodb-java\n[Quickstart: Build a Java app to manage Azure Cosmos DB for Apache Cassandra data (v4 Driver)]: /azure/cosmos-db/cassandra/manage-data-java-v4-sdk\n[Quickstart: Build a graph database with the Java SDK and Azure Cosmos DB for Apache Gremlin]: /azure/cosmos-db/graph/create-graph-java\n[Quickstart: Use Azure Cache for Redis in Java]: /azure/azure-cache-for-redis/cache-java-get-started\n[Best Practices for using Azure Cache for Redis with Lettuce]: https://github.com/Azure/AzureCacheForRedis/blob/main/Lettuce%20Best%20Practices.md\n[Quickstart: Manage blobs with Java v12 SDK]: /azure/storage/blobs/storage-quickstart-blobs-java\n[Spring Cloud Azure resource handing]: ../spring-framework/resource-handling.md\n[Send messages to an Azure Service Bus topic and receive messages from subscriptions to the topic]: /azure/service-bus-messaging/service-bus-java-how-to-use-topics-subscriptions\n[Azure Service Bus Samples client library for Java]: https://github.com/Azure/azure-sdk-for-java/tree/azure-messaging-servicebus_7.4.1/sdk/servicebus/azure-messaging-servicebus/src/samples\n[Spring integration with Azure Service Bus]: ../spring-framework/spring-integration-support.md#spring-integration-with-azure-service-bus\n[Spring Cloud Stream Binder for Azure Service Bus]: ../spring-framework/spring-cloud-stream-support.md#spring-cloud-stream-binder-for-azure-service-bus\n[Send and Receive Messages in Java using Azure Event Hubs for Apache Kafka Ecosystems]: https://github.com/Azure/azure-event-hubs-for-kafka/tree/master/quickstart/java\n[Use Java to send events to or receive events from Azure Event Hubs]: /azure/event-hubs/event-hubs-java-get-started-send\n[Enable Java Servlet apps to sign in users on Microsoft Entra ID]: https://github.com/Azure-Samples/ms-identity-msal-java-samples/tree/main/3-java-servlet-web-app/1-Authentication/sign-in#readme\n[Enable Java Servlet apps to sign in users on Azure AD B2C]: https://github.com/Azure-Samples/ms-identity-msal-java-samples/tree/main/3-java-servlet-web-app/1-Authentication/sign-in-b2c#readme\n[Manage secrets using Key Vault]: /azure/key-vault/secrets/quick-create-java\n[JDBC]: https://spring.io/projects/spring-data-jdbc\n[JPA]: https://spring.io/projects/spring-data-jpa\n[R2DBC]: https://spring.io/projects/spring-data-r2dbc\n[Spring Data Azure Cosmos DB]: ../spring-framework/how-to-guides-spring-data-cosmosdb.md\n[Spring Data MongoDB]: https://spring.io/projects/spring-data-mongodb\n[Spring Data Apache Cassandra]: https://spring.io/projects/spring-data-cassandra\n[Spring Data Redis]: https://spring.io/projects/spring-data-redis\n[Reference]: https://docs.spring.io/spring-data/data-redis/docs/current-SNAPSHOT/reference/html/#redis:requirements\n[Spring Cloud Azure Redis support]: ../spring-framework/redis-support.md\n[Spring AMQP]: https://spring.io/projects/spring-amqp\n[Spring Cloud Azure JMS support]: ../spring-framework/spring-jms-support.md\n[Spring for Apache Kafka]: https://spring.io/projects/spring-kafka\n[Spring Cloud Azure Kafka support]: ../spring-framework/kafka-support.md\n[Spring Cloud Stream Binder for Event Hubs]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-stream-binder-eventhubs\n[Microsoft Entra Spring Boot Starter]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory\n[Azure AD B2C Spring Boot Starter]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-active-directory-b2c\n[Key Vault Secrets Spring Boot Starter]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-keyvault-secrets\n[Key Vault Certificates Spring Boot Starter]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-keyvault-certificates\n[JDBC SQL]: ../spring-framework/configure-spring-data-jdbc-with-azure-sql-server.md\n[JPA SQL]: ../spring-framework/configure-spring-data-jpa-with-azure-sql-server.md\n[R2DBC SQL]: ../spring-framework/configure-spring-data-r2dbc-with-azure-sql-server.md\n[JDBC MySQL]: ../spring-framework/configure-spring-data-jdbc-with-azure-mysql.md\n[JPA MySQL]: ../spring-framework/configure-spring-data-jpa-with-azure-mysql.md\n[R2DBC MySQL]: ../spring-framework/configure-spring-data-r2dbc-with-azure-mysql.md\n[JDBC PostgreSQL]: ../spring-framework/configure-spring-data-jdbc-with-azure-postgresql.md\n[JPA PostgreSQL]: ../spring-framework/configure-spring-data-jpa-with-azure-postgresql.md\n[R2DBC PostgreSQL]: ../spring-framework/configure-spring-data-r2dbc-with-azure-postgresql.md\n[How to use the Spring Boot Starter with Azure Cosmos DB for NoSQL]: ../spring-framework/configure-spring-boot-starter-java-app-with-cosmos-db.md\n[How to use Spring Data with Azure Cosmos DB for MongoDB]: ../spring-framework/configure-spring-data-mongodb-with-cosmos-db.md\n[How to use Spring Data with Azure Cosmos DB for Apache Cassandra]: ../spring-framework/configure-spring-data-apache-cassandra-with-cosmos-db.md\n[Configure a Spring Boot Initializer app to use Redis in the cloud with Azure Redis Cache]: ../spring-framework/configure-spring-boot-initializer-java-app-with-redis-cache.md\n[How to use the Spring Boot Starter for Azure Storage]: ../spring-framework/configure-spring-boot-starter-java-app-with-azure-storage.md\n[How to use Spring Boot Starter for Azure Service Bus JMS]: ../spring-framework/configure-spring-boot-starter-java-app-with-azure-service-bus.md\n[How to use Spring Cloud Azure Stream Binder for Azure Service Bus]: ../spring-framework/configure-spring-cloud-stream-binder-java-app-with-service-bus.md\n[How to use the Spring Boot Starter for Apache Kafka with Azure Event Hubs]: ../spring-framework/configure-spring-cloud-stream-binder-java-app-kafka-azure-event-hub.md\n[How to create a Spring Cloud Stream Binder application with Azure Event Hubs]: ../spring-framework/configure-spring-cloud-stream-binder-java-app-azure-event-hub.md\n[Enable Spring Boot Web apps to sign in users on Microsoft Entra ID]: https://github.com/Azure-Samples/ms-identity-msal-java-samples/tree/main/4-spring-web-app/1-Authentication/sign-in#readme\n[Enable Spring Boot Web apps to sign in users on Azure AD B2C]: https://github.com/Azure-Samples/ms-identity-msal-java-samples/tree/main/4-spring-web-app/1-Authentication/sign-in-b2c#readme\n[Manage secrets for Spring Boot apps]: ../spring-framework/configure-spring-boot-starter-java-app-with-azure-key-vault.md\n[Manage certificates for Spring Boot apps]: ../spring-framework/configure-spring-boot-starter-java-app-with-azure-key-vault-certificates.md\n\n## Next steps\n\nFor all other libraries, see [Azure SDK for Java libraries](./azure-sdk-library-package-index.md).\n"
  },
  {
    "path": "articles/java/sdk/logging-jul.md",
    "content": "---\ntitle: Log with the Azure SDK for Java and java.util.logging\ndescription: Provides an overview of the Azure SDK for Java integration with java.util.logging.\nms.date: 04/01/2025 \nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: srnagar\n---\n\n# Log with the Azure SDK for Java and java.util.logging\n\nThis article provides an overview of how to add logging using `java.util.logging` to applications that use the Azure SDK for Java. The `java.util.logging` framework is part of the JDK. As mentioned in [Configure logging in the Azure SDK for Java](logging-overview.md), all Azure client libraries log through [Simple Logging Facade for Java (SLF4J)](http://www.slf4j.org/), so you can use logging frameworks such as [`java.util.logging`](https://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html).\n\nTo enable `java.util.logging`, you must do two things:\n\n1. Include the SLF4J adapter for `java.util.logging` as a dependency,\n2. Create a file called **logging.properties** under the **/src/main/resources** project directory.\n\nFor more information related to configuring your logger, see [Configuring Logging Output](https://docs.oracle.com/cd/E23549_01/doc.1111/e14568/handler.htm) in the Oracle documentation.\n\n## Add the Maven dependency\n\nTo add the Maven dependency, include the following XML in the project's **pom.xml** file. Replace the `1.7.30` version number with the latest released version number shown on the [SLF4J JDK14 Binding page](https://mvnrepository.com/artifact/org.slf4j/slf4j-jdk14).\n\n```xml\n<dependency>\n    <groupId>org.slf4j</groupId>\n    <artifactId>slf4j-jdk14</artifactId>\n    <version>1.7.30</version> <!-- replace this version with the latest available version on Maven central -->\n</dependency>\n```\n\n## Add logging.properties to your project\n\nTo log using `java.util.logging`, create a file called **logging.properties** under the **./src/main/resources** directory of your project or anywhere else. This file will contain the logging configurations to customize your logging needs. Provide path to the file by setting the `java.util.logging.config.file` system property. You must set this property before you create the logger instance. For more information, see [Java Logging: Configuration](http://tutorials.jenkov.com/java-logging/configuration.html).\n\n### Console logging\n\nYou can create a configuration to log to the console as shown in the following example. This example is configured to log all logging events that are INFO level or higher, wherever they come from.\n\n```properties\nhandlers = java.util.logging.ConsoleHandler\n.level = INFO\n\njava.util.logging.ConsoleHandler.level = INFO\njava.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter\njava.util.logging.SimpleFormatter.format=[%1$tF %1$tH:%1$tM:%1$tS.%1$tL] [%4$s] %3$s %5$s %n\n```\n\n### Log to a file\n\nThe previous example logs to the console, which isn't normally the preferred location for logs. To configure logging to a file instead, use the following configuration:\n\n```properties\nhandlers = java.util.logging.FileHandler\n.level = INFO\n\njava.util.logging.FileHandler.pattern = %h/myapplication.log\njava.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter\njava.util.logging.FileHandler.level = INFO\n```\n\nThis code will create a file called **myapplication.log** in your home directory (`%h`). This logger doesn't support automatic file rotation after a certain period. If you require this functionality, you'll need to write a scheduler to manage log file rotation.\n\n## Next steps\n\nThis article covered the configuration of `java.util.logging` and how to make the Azure SDK for Java use it for logging. Because the Azure SDK for Java works with all SLF4J logging frameworks, consider reviewing the [SLF4J user manual](http://www.slf4j.org/manual.html) for further details.\n\nAfter you've mastered logging, consider looking into the integrations that Azure offers into frameworks such as [Spring](../spring-framework/spring-cloud-azure-overview.md).\n"
  },
  {
    "path": "articles/java/sdk/logging-log4j.md",
    "content": "---\ntitle: Log with the Azure SDK for Java and Log4j\ndescription: Provides an overview of the Azure SDK for Java integration with log4j.\nms.date: 04/02/2025 \nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: srnagar\n---\n\n# Log with the Azure SDK for Java and Log4j\n\nThis article provides an overview of how to add logging using Log4j to applications that use the Azure SDK for Java. As mentioned in [Configure logging in the Azure SDK for Java](logging-overview.md), all Azure client libraries log through [SLF4J](http://www.slf4j.org/), so you can use logging frameworks such as [log4j](https://logging.apache.org/log4j/2.x/).\n\nThis article provides guidance to use the Log4J 2.x releases, but Log4J 1.x is equally supported by the Azure SDK for Java. To enable log4j logging, you must do two things:\n\n1. Include the log4j library as a dependency,\n2. Create a configuration file (either **log4j2.properties** or **log4j2.xml**) under the **/src/main/resources** project directory.\n\nFor more information related to configuring log4j, see [Welcome to Log4j 2](https://logging.apache.org/log4j/2.x/manual/index.html).\n\n## Add the Maven dependency\n\nTo add the Maven dependency, include the following XML in the project's **pom.xml** file. Replace the `2.16.0` version number with the latest released version number shown on the [Apache Log4j SLF4J Binding page](https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl).\n\n```xml\n<dependency>\n    <groupId>org.apache.logging.log4j</groupId>\n    <artifactId>log4j-slf4j-impl</artifactId>\n    <version>2.16.0</version>\n</dependency>\n```\n\n> [!NOTE]\n> Due to known vulnerability [CVE-2021-44228](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228), be sure to use Log4j version 2.16 or later\n\n## Configuring Log4j\n\nThere are two common ways to configure Log4j: through an external properties file, or through an external XML file. These approaches are outlined below.\n\n### Using a property file\n\nYou can place a flat properties file named **log4j2.properties** in the **/src/main/resources** directory of the project. This file should take the following form:\n\n```properties\nappender.console.type = Console\nappender.console.name = STDOUT\nappender.console.layout.type = PatternLayout\nappender.console.layout.pattern = %d %5p [%t] %c{3} - %m%n\n\nlogger.app.name = com.azure.core\nlogger.app.level = ERROR\n\nrootLogger.level = info\nrootLogger.appenderRefs = stdout\nrootLogger.appenderRef.stdout.ref = STDOUT\n```\n\n### Using an XML file\n\nYou can place an XML file named **log4j2.xml** in the **/src/main/resources** directory of the project. This file should take the following form:\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration status=\"INFO\">\n    <Appenders>\n        <Console name=\"console\" target=\"SYSTEM_OUT\">\n            <PatternLayout pattern=\"%d %5p [%t] %c{3} - %m%n\" />\n        </Console>\n    </Appenders>\n    <Loggers>\n        <Logger name=\"com.azure.core\" level=\"error\" additivity=\"true\">\n            <appender-ref ref=\"console\" />\n        </Logger>\n        <Root level=\"info\" additivity=\"false\">\n            <appender-ref ref=\"console\" />\n        </Root>\n     </Loggers>\n</Configuration>\n```\n\n## Next steps\n\nThis article covered the configuration of Log4j and how to make the Azure SDK for Java use it for logging. Because the Azure SDK for Java works with all SLF4J logging frameworks, consider reviewing the [SLF4J user manual](http://www.slf4j.org/manual.html) for further details. If you use Log4j, there's also vast amount of configuration guidance on its website. For more information, see [Welcome to Log4j 2!](https://logging.apache.org/log4j/2.x/manual/index.html)\n\nAfter you've mastered logging, consider looking into the integrations that Azure offers into frameworks such as [Spring](../spring-framework/spring-cloud-azure-overview.md).\n"
  },
  {
    "path": "articles/java/sdk/logging-logback.md",
    "content": "---\ntitle: Log with the Azure SDK for Java and Logback\ndescription: Provides an overview of the Azure SDK for Java integration with Logback.\nms.date: 04/02/2025 \nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: srnagar\n---\n\n# Log with the Azure SDK for Java and Logback\n\nThis article provides an overview of how to add logging using Logback to applications that use the Azure SDK for Java. As mentioned in [Configure logging in the Azure SDK for Java](logging-overview.md), all Azure client libraries log through [SLF4J](https://www.slf4j.org/), so you can use logging frameworks such as [Logback](https://logback.qos.ch/).\n\nTo enable Logback logging, you must do two things:\n\n1. Include the Logback library as a dependency,\n2. Create a file called **logback.xml** in the **/src/main/resources** project directory.\n\nFor more information related to configuring Logback, see [Logback configuration](https://logback.qos.ch/manual/configuration.html) in the Logback documentation.\n\n## Add the Maven dependency\n\nTo add the Maven dependency, include the following XML in the project's **pom.xml** file. Replace the `1.2.3` version number with the latest released version number shown on the [Logback Classic Module page](https://mvnrepository.com/artifact/ch.qos.logback/logback-classic).\n\n```xml\n<dependency>\n    <groupId>ch.qos.logback</groupId>\n    <artifactId>logback-classic</artifactId>\n    <version>1.2.3</version>\n</dependency>\n```\n\n## Add logback.xml to your project\n\n[Logback](https://logback.qos.ch/manual/introduction.html) is one of the popular logging frameworks. To enable Logback logging, create a file called **logback.xml** in the **./src/main/resources** directory of your project. This file contains the logging configurations to customize your logging needs. For more information on configuring **logback.xml**, see [Logback configuration](https://logback.qos.ch/manual/configuration.html) in the Logback documentation.\n\n### Console logging\n\nYou can create a Logback configuration to log to the console as shown in the following example. This example is configured to log all logging events that are INFO level or higher, wherever they come from.\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n  <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n    <layout class=\"ch.qos.logback.classic.PatternLayout\">\n      <Pattern>\n        %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %blue(%logger{100}): %msg%n%throwable\n      </Pattern>\n    </layout>\n  </appender>\n\n  <root level=\"INFO\">\n    <appender-ref ref=\"STDOUT\" />\n  </root>\n</configuration>\n```\n\n### Log Azure core errors\n\nThe following example configuration is similar to the previous configuration, but it lowers the level at which logging comes from all `com.azure.core` packaged classes (including subpackages). This way, everything INFO-level and higher is logged, except for `com.azure.core`, where only ERROR-level and higher is logged. For example, you can use this approach if you find the code in `com.azure.core` too noisy. This kind of configuration can also go both ways. For example, if you want to get more debug information from classes in `com.azure.core`, you could change this setting to DEBUG.\n\nIt's possible to have fine-grained control over the logging of specific classes, or specific packages. As shown here, `com.azure.core` controls the output of all core classes, but you could equally use `com.azure.security.keyvault` or equivalent to control the output as appropriate for the circumstances that are most informative in the context of the running application.\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n  <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n    <encoder>\n      <pattern>%message%n</pattern>\n    </encoder>\n  </appender>\n\n  <logger name=\"com.azure.core\" level=\"ERROR\" />\n\n  <root level=\"INFO\">\n    <appender-ref ref=\"STDOUT\" />\n  </root>\n</configuration>\n```\n\n### Log to a file with log rotation enabled\n\nThe previous examples log to the console, which isn't normally the preferred location for logs. Use the following configuration to log to a file instead, with hourly roll-over, and archiving in gzip format:\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n  <property name=\"LOGS\" value=\"./logs\" />\n  <appender name=\"RollingFile\" class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n    <file>${LOGS}/spring-boot-logger.log</file>\n    <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n      <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>\n    </encoder>\n\n    <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n      <!-- rollover hourly and gzip logs -->\n      <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd-HH}.log.gz</fileNamePattern>\n    </rollingPolicy>\n  </appender>\n\n  <!-- LOG everything at INFO level -->\n  <root level=\"INFO\">\n    <appender-ref ref=\"RollingFile\" />\n  </root>\n</configuration>\n```\n\n### Spring applications\n\nThe Spring framework works by reading the Spring **application.properties** file for various configurations, including the logging configuration. It's possible to configure the Spring application to read Logback configurations from any file, however. To do so, configure the `logging.config` property to point to the **logback.xml** configuration file by adding the following line into your Spring **/src/main/resources/application.properties** file:\n\n```properties\nlogging.config=classpath:logback.xml\n```\n\n## Next steps\n\nThis article covered the configuration of Logback and how to make the Azure SDK for Java use it for logging. Because the Azure SDK for Java works with all SLF4J logging frameworks, consider reviewing the [SLF4J user manual](https://www.slf4j.org/manual.html) for further details. If you use Logback, there's also a vast amount of configuration guidance on its website. For more information, see [Logback configuration](https://logback.qos.ch/manual/configuration.html) in the Logback documentation.\n\nAfter you've mastered logging, consider looking into the integrations that Azure offers into frameworks such as [Spring](../spring-framework/spring-cloud-azure-overview.md).\n"
  },
  {
    "path": "articles/java/sdk/logging-overview.md",
    "content": "---\ntitle: Configure logging in the Azure SDK for Java\ndescription: Provides an overview of the Azure SDK for Java concepts related to logging.\nms.date: 04/01/2025 \nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: srnagar\n---\n\n# Configure logging in the Azure SDK for Java\n\nThis article provides an overview of how to enable logging in applications that make use of the Azure SDK for Java. The Azure client libraries for Java have two logging options:\n\n* A built-in logging framework for temporary debugging purposes.\n* Support for logging using the [SLF4J](https://www.slf4j.org/) interface.\n\nWe recommend that you use SLF4J because it's well known in the Java ecosystem and it's well documented. For more information, see the [SLF4J user manual](https://www.slf4j.org/manual.html).\n\nThis article links to other articles that cover many of the popular Java logging frameworks. These other articles provide configuration examples, and describe how the Azure client libraries can use the logging frameworks.\n\nWhatever logging configuration you use, the same log output is available in either case because all logging output in the Azure client libraries for Java is routed through an azure-core `ClientLogger` abstraction.\n\nThe rest of this article details the configuration of all available logging options.\n\n## Enable HTTP request/response logging\n\nHTTP request and response logging are off by default. You can configure clients that communicate to Azure services over HTTP to write a log record for each request and response (or exception) they receive.\n\nIf you use OpenTelemetry, consider using distributed tracing instead of logging for HTTP requests. For more information, see [Configure tracing in the Azure SDK for Java](tracing.md).\n\n### Configure HTTP logging with an environment variable\n\nYou can use the `AZURE_HTTP_LOG_DETAIL_LEVEL` environment variable to enable HTTP logs globally. This variable supports the following values:\n\n- `NONE`: HTTP logs are disabled. This value is the default.\n- `BASIC`: HTTP logs contain request method, sanitized request URL, try count, response code, and the content length for request and response bodies.\n- `HEADERS`: HTTP logs include all the basic details and also include headers that are known to be safe for logging purposes - that is, they don't contain secrets or sensitive information. The full list of header names is available in the [HttpLogOptions](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core/src/main/java/com/azure/core/http/policy/HttpLogOptions.java) class.\n- `BODY_AND_HEADERS`: HTTP logs include all the details provided by the `HEADERS` level and also include request and response bodies as long as they're smaller than 16 KB and printable.\n\n> [!NOTE]\n> The request URL is sanitized - that is, all query parameter values are redacted except for the `api-version` value. Individual client libraries may add other query parameters that are known to be safe to the allowlist.\n\nFor example, the Azure Blob Storage shared access signature (SAS) URL is logged in the following format:\n`https://myaccount.blob.core.windows.net/pictures/profile.jpg?sv=REDACTED&st=REDACTED&se=REDACTED&sr=REDACTED&sp=REDACTED&rscd=REDACTED&rsct=REDACTED&sig=REDACTED`\n\n> [!WARNING]\n> Logging request and response bodies isn't recommended in production because they might contain sensitive information, significantly affect performance, change how content is buffered, and have other side effects.\n\n### Configure HTTP logging in code\n\nAzure client builders that implement the [HttpTrait\\<T>](/java/api/com.azure.core.client.traits.httptrait) interface support code-based HTTP logging configuration. Code-based configuration applies to individual client instances and provides more options and customizations compared to environment variable configuration.\n\nTo configure logs, pass an instance of [HttpLogOptions](/java/api/com.azure.core.http.policy.httplogoptions) to the `httpLogOptions` method on the corresponding client builder. The following code shows an example for the App Configuration service:\n\n```java\nHttpLogOptions httpLogOptions = new HttpLogOptions()\n        .setLogLevel(HttpLogDetailLevel.HEADERS)\n        .addAllowedHeaderName(\"Accept-Ranges\")\n        .addAllowedQueryParamName(\"label\");\n\nConfigurationClient configurationClient = new ConfigurationClientBuilder()\n        .httpLogOptions(httpLogOptions)\n        ...\n        .buildClient();\n```\n\nThis code enables HTTP logs with headers and adds the `Accept-Ranges` response header and the `label` query parameter to the corresponding allowlists. After this change, these values should appear in the produced logs.\n\nFor the full list of configuration options, see the [HttpLogOptions](/java/api/com.azure.core.http.policy.httplogoptions) documentation.\n\n## Default logger (for temporary debugging)\n\nAs noted, all Azure client libraries use SLF4J for logging, but there's a fallback, default logger built into Azure client libraries for Java. This default logger is provided for cases where an application is deployed, and logging is required, but it's not possible to redeploy the application with an SLF4J logger included. To enable this logger, you must first be certain that no SLF4J logger exists (because it takes precedence), and then set the `AZURE_LOG_LEVEL` environment variable. The following table shows the values allowed for this environment variable:\n\n| Log Level              | Allowed environment variable values    |\n|------------------------|----------------------------------------|\n| VERBOSE                | `verbose`, `debug`                     |\n| INFORMATIONAL          | `info`, `information`, `informational` |\n| WARNING                | `warn`, `warning`                      |\n| ERROR                  | `err`, `error`                         |\n\nAfter the environment variable is set, restart the application to enable the environment variable to take effect. This logger logs to the console, and doesn't provide the advanced customization capabilities of an SLF4J implementation, such as rollover and logging to file. To turn the logging off again, just remove the environment variable and restart the application.\n\n## SLF4J logging\n\nBy default, you should configure logging using an SLF4J-supported logging framework. First, include a relevant SLF4J logging implementation as a dependency from your project. For more information, see [Declaring project dependencies for logging](http://www.slf4j.org/manual.html#projectDep) in the SLF4J user manual. Next, configure your logger to work as necessary in your environment, such as setting log levels, configuring which classes do and don't log, and so on. Some examples are provided through the links in this article, but for more information, see the documentation for your chosen logging framework.\n\n## Log format\n\nLogging frameworks support custom log message formatting and layouts. We recommend including at least following fields to make it possible to troubleshoot Azure client libraries:\n\n* Date and time with millisecond precision\n* Log severity\n* Logger name\n* Thread name\n* Message\n\nFor examples, see the documentation for the logging framework you use.\n\n### Structured logging\n\nIn addition to logging the common properties mentioned earlier, Azure client libraries annotate log messages with extra context when applicable. For example, you might see JSON-formatted logs containing `az.sdk.message` with context written as other root properties, as shown in the following example:\n\n```log\n16:58:51.038 INFO  c.a.c.c.i.C.getManifestProperties - {\"az.sdk.message\":\"HTTP request\",\"method\":\"GET\",\"url\":\"<>\",\"tryCount\":\"1\",\"contentLength\":0}\n16:58:51.141 INFO  c.a.c.c.i.C.getManifestProperties - {\"az.sdk.message\":\"HTTP response\",\"contentLength\":\"558\",\"statusCode\":200,\"url\":\"<>\",\"durationMs\":102}\n```\n\nWhen you send logs to Azure Monitor, you can use the [Kusto query language](/azure/data-explorer/kusto/query/) to parse them. The following query provides an example:\n\n```kusto\ntraces\n| where message startswith \"{\\\"az.sdk.message\"\n| project timestamp, logger=customDimensions[\"LoggerName\"], level=customDimensions[\"LoggingLevel\"], thread=customDimensions[\"ThreadName\"], azSdkContext=parse_json(message)\n| evaluate bag_unpack(azSdkContext)\n```\n\n> [!NOTE]\n> Azure client library logs are intended for ad-hoc debugging. We don't recommend relying on the log format to alert or monitor your application. Azure client libraries do not guarantee the stability of log messages or context keys. For such purposes, we recommend using distributed tracing. The Application Insights Java agent provides stability guarantees for request and dependency telemetry. For more information, see [Configure tracing in the Azure SDK for Java](tracing.md).\n\n## Next steps\n\nNow that you know how logging works in the Azure SDK for Java, consider reviewing the following articles. These articles provide guidance on how to configure some of the more popular Java logging frameworks to work with SLF4J and the Java client libraries:\n\n* [java.util.logging](logging-jul.md)\n* [Logback](logging-logback.md)\n* [Log4J](logging-log4j.md)\n* [Tracing](tracing.md)\n"
  },
  {
    "path": "articles/java/sdk/lro.md",
    "content": "---\ntitle: Long-running operations in the Azure SDK for Java\ndescription: Provides an overview of the Azure SDK for Java concepts related to long-running operations.\nms.date: 04/02/2025\nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: anuchan\n---\n\n# Long-running operations in the Azure SDK for Java\n\nThis article provides an overview of using long-running operations with the Azure SDK for Java.\n\nCertain operations on Azure may take extended amounts of time to complete. These operations are outside the standard HTTP style of quick request / response flow. For example, copying data from a source URL to a Storage blob, or training a model to recognize forms, are operations that may take a few seconds to several minutes. Such operations are referred to as Long-Running Operations, and are often abbreviated as 'LRO'. An LRO may take seconds, minutes, hours, days, or longer to complete, depending on the operation requested and the process that must be performed on the server side.\n\nIn the Java client libraries for Azure, a convention exists that all long-running operations begin with the `begin` prefix. This prefix indicates that this operation is long-running, and that the means of interaction with this operation is slightly different that the usual request / response flow. Along with the `begin` prefix, the return type from the operation is also different than usual, to enable the full range of long-running operation functionality. As with most things in the Azure SDK for Java, there are both synchronous and asynchronous APIs for long-running operations:\n\n* In synchronous clients, long-running operations will return a `SyncPoller` instance.\n* In asynchronous clients, long-running operations will return a `PollerFlux` instance.\n\nBoth `SyncPoller` and `PollerFlux` are the client-side abstractions intended to simplify the interaction with long-running server-side operations. The rest of this article outlines best practices when working with these types.\n\n## Synchronous long-running operations\n\nCalling any API that returns a `SyncPoller` will immediately start the long-running operation. The API will return the `SyncPoller` immediately, letting you monitor the progress of the long-running operation and retrieve the final result. The following example shows how to monitor the progress of a long-running operation using the `SyncPoller`.\n\n```java\nSyncPoller<UploadBlobProgress, UploadedBlobProperties> poller = syncClient.beginUploadFromUri(<URI to upload from>);\nPollResponse<UploadBlobProgress> response;\n\ndo {\n    response = poller.poll();\n    System.out.println(\"Status of long running upload operation: \" + response.getStatus());\n    Duration pollInterval = response.getRetryAfter();\n    TimeUnit.MILLISECONDS.sleep(pollInterval.toMillis());\n} while (!response.getStatus().isComplete());\n```\n\nThis example uses the `poll()` method on the `SyncPoller` to retrieve information on progress of the long-running operation. This code prints the status to the console, but a better implementation would make relevant decisions based on this status.\n\nThe `getRetryAfter()` method returns information about how long to wait before the next poll. Most Azure long-running operations return the poll delay as part of their HTTP response (that is, the commonly used `retry-after` header). If the response doesn't contain the poll delay, then the `getRetryAfter()` method returns the duration given at the time of invoking the long-running operation.\n\nThe example above uses a `do..while` loop to repeatedly poll until the long-running operation is complete. If you aren't interested in these intermediate results, you can instead call `waitForCompletion()`. This call will block the current thread until the long-running operation completes and returns the last poll response:\n\n```java\nPollResponse<UploadBlobProgress> response = poller.waitForCompletion();\n```\n\nIf the last poll response indicates that the long-running operation has completed successfully, you can retrieve the final result using `getFinalResult()`:\n\n```java\nif (LongRunningOperationStatus.SUCCESSFULLY_COMPLETED == response.getStatus()) {\n    UploadedBlobProperties result = poller.getFinalResult();\n}\n```\n\nOther useful APIs in `SyncPoller` include:\n\n1. `waitForCompletion(Duration)`: wait for the long-running operation to complete, for the given timeout duration.\n1. `waitUntil(LongRunningOperationStatus)`: wait until the given long-running operation status is received.\n1. `waitUntil(LongRunningOperationStatus, Duration)`: wait until the given long-running operation status is received, or until the given timeout duration expires.\n\n## Asynchronous long-running operations\n\nThe example below shows how the `PollerFlux` lets you observe a long-running operation. In async APIs, the network calls happen in a different thread than the main thread that calls `subscribe()`. What this means is that the main thread may terminate before the result is available. It's up to you to ensure that the application doesn't exit before the async operation has had time to complete.\n\nThe async API returns a `PollerFlux` immediately, but the long-running operation itself won't start until you subscribe to the `PollerFlux`. This process is how all `Flux`-based APIs operate. The following example shows an async long-running operation:\n\n```java\nasyncClient.beginUploadFromUri(...)\n    .subscribe(response -> System.out.println(\"Status of long running upload operation: \" + response.getStatus()));\n```\n\nIn the following example, you'll get intermittent status updates on the long-running operation. You can use these updates to determine whether the long-running operation is still operating in the expected fashion. This example prints the status to the console, but a better implementation would make relevant error handling decisions based on this status.\n\nIf you aren't interested in the intermediate status updates and just want to get notified of the final result when it arrives, you can use code similar to the following example:\n\n```java\nasyncClient.beginUploadFromUri(...)\n    .last()\n    .flatMap(response -> {\n        if (LongRunningOperationStatus.SUCCESSFULLY_COMPLETED == response.getStatus()) {\n            return response.getFinalResult();\n        }\n        return Mono.error(new IllegalStateException(\"Polling completed unsuccessfully with status: \"+ response.getStatus()));\n    })\n    .subscribe(\n        finalResult -> processFormPages(finalResult),\n        ex -> countDownLatch.countDown(),\n        () -> countDownLatch.countDown());\n```\n\nIn this code, you retrieve the final result of the long-running operation by calling `last()`. This call tells the `PollerFlux` that you want to wait for all the polling to complete, at which point the long-running operation has reached a terminal state, and you can inspect its status to determine the outcome. If the poller indicates that the long-running operation has completed successfully, you can retrieve the final result and pass it on to the consumer in the subscribe call.\n\n## Next steps\n\nNow that you're familiar with the long-running APIs in the Azure SDK for Java, see [Configure proxies in the Azure SDK for Java](proxying.md) to learn how to customize the HTTP client further.\n"
  },
  {
    "path": "articles/java/sdk/mermaidjs/chain-sequence.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chain-sequence.md -o ../media/mermaidjs/chain-sequence.svg\n\nsequenceDiagram\n  autonumber;\n\n  participant A as Java app;\n  participant B as Credential chain;\n  participant C as TokenCredential instance;\n    \n  A->>B: Authenticate to Microsoft Entra ID;\n  activate B;\n  B->>B: getToken;\n  loop Traverse TokenCredential collection until AccessToken received\n    B->>C: Fetch token;\n    activate C;\n    C->>C: getToken;\n    break when Result is AccessToken\n        C-->>B: Result;\n    end;\n    deactivate C;\n  end;\n  \n  B-->>A: AccessToken;\n  deactivate B;\n```\n"
  },
  {
    "path": "articles/java/sdk/mermaidjs/chained-token-credential-auth-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chained-token-credential-auth-flow.md -o ../media/mermaidjs/chained-token-credential-auth-flow.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    E(IntelliJ):::developer --> F(Azure CLI):::developer;\n\n    %% Define styles for credential type boxes\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/java/sdk/mermaidjs/default-azure-credential-auth-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run commands:\n%%    mmdc -i default-azure-credential-auth-flow.md -o ../media/mermaidjs/default-azure-credential-auth-flow-inline.svg\n%%    mmdc -i default-azure-credential-auth-flow.md -o ../media/mermaidjs/default-azure-credential-auth-flow-expanded.png -w 1156\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential;\n\n    subgraph CREDENTIAL TYPES;\n        direction LR;\n        Deployed(Deployed service):::deployed ~~~ Developer(Developer tool):::developer;\n    end;\n\n    subgraph CREDENTIALS;\n        direction LR;\n        A(Environment):::deployed --> \n        B(Workload Identity):::deployed --> \n        C(Managed Identity):::deployed --> \n        D(IntelliJ):::developer --> \n        E(Visual Studio Code):::developer --> \n        F(Azure CLI):::developer --> \n        G(Azure PowerShell):::developer --> \n        H(Azure Developer CLI):::developer -->\n        I(Broker):::developer;\n    end;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C, stroke-width:2px;\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n\n    %% Add API ref links to credential type boxes\n    click A \"https://learn.microsoft.com/java/api/com.azure.identity.environmentcredential?view=azure-java-stable\" _blank;\n    click B \"https://learn.microsoft.com/java/api/com.azure.identity.workloadidentitycredential?view=azure-java-stable\" _blank;\n    click C \"https://learn.microsoft.com/java/api/com.azure.identity.managedidentitycredential?view=azure-java-stable\" _blank;\n    click D \"https://learn.microsoft.com/java/api/com.azure.identity.intellijcredential?view=azure-java-stable\" _blank;\n    click E \"https://learn.microsoft.com/java/api/com.azure.identity.visualstudiocodecredential?view=azure-java-stable\" _blank;\n    click F \"https://learn.microsoft.com/java/api/com.azure.identity.azureclicredential?view=azure-java-stable\" _blank;\n    click G \"https://learn.microsoft.com/java/api/com.azure.identity.azurepowershellcredential?view=azure-java-stable\" _blank;\n    click H \"https://learn.microsoft.com/java/api/com.azure.identity.azuredeveloperclicredential?view=azure-java-stable\" _blank;\n    click I \"https://learn.microsoft.com/java/api/com.azure.identity.interactivebrowsercredential?view=azure-java-stable\" _blank;\n```\n"
  },
  {
    "path": "articles/java/sdk/mermaidjs/default-azure-credential-environment-variable-development.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run commands:\n%%    mmdc -i default-azure-credential-env-var-dev.md -o ../media/mermaidjs/default-azure-credential-env-var-dev.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow without deployed service credentials;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential when AZURE_TOKEN_CREDENTIALS is set to \"dev\";\n\n    D(IntelliJ):::developer --> \n    E(Visual Studio Code):::developer --> \n    F(Azure CLI):::developer --> \n    G(Azure PowerShell):::developer --> \n    H(Azure Developer CLI):::developer -->\n    I(Broker):::developer;\n\n    %% Define styles for credential type boxes\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/java/sdk/mermaidjs/default-azure-credential-environment-variable-production.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run commands:\n%%    mmdc -i default-azure-credential-environment-variable-production.md -o ../media/mermaidjs/default-azure-credential-environment-variable-production.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow without developer tool credentials;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential when AZURE_TOKEN_CREDENTIALS is set to \"prod\";\n\n    A(Environment):::deployed --> \n    B(Workload Identity):::deployed --> \n    C(Managed Identity):::deployed;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/java/sdk/overview.md",
    "content": "---\ntitle: Use the Azure SDK for Java\ndescription: Overview of the features and capabilities of the Azure SDK for Java that help you be more productive when provisioning, using, and managing Azure resources.\nms.date: 04/02/2025\nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Use the Azure SDK for Java\n\nThe open-source Azure SDK for Java simplifies provisioning, managing, and using Azure resources from Java application code.\n\n## Important details\n\n* The Azure libraries are how you communicate with Azure services from Java code that you run either locally or in the cloud.\n* The libraries support Java 8 and later, and are tested against both the Java 8 baseline and the latest Java 'long-term support' release.\n* The libraries include full Java module support, which means that they're fully compliant with the requirements of a Java module and export all relevant packages for use.\n* The Azure SDK for Java is composed solely of many individual Java libraries that relate to specific Azure services. There are no other tools in the \"SDK\".\n* There are distinct \"management\" and \"client\" libraries (sometimes referred to as \"management plane\" and \"data plane\" libraries). Each set serves different purposes and is used by different kinds of code. For more information, see the following sections later in this article:\n  * [Connect to and use Azure resources with client libraries.](#connect-to-and-use-azure-resources-with-client-libraries)\n  * [Provision and manage Azure resources with management libraries.](#provision-and-manage-azure-resources-with-management-libraries)\n* You can find documentation for the libraries in the [Azure for Java Reference](/java/api/overview/azure/) organized by Azure Service, or the [Java API browser](/java/api/) organized by package name.\n\n## Other details\n\n* The Azure SDK for Java libraries build on top of the underlying Azure REST API, allowing you to use those APIs through familiar Java paradigms. However, you can always use the REST API directly from Java code, if you prefer.\n* You can find the source code for the Azure libraries in the [GitHub repository](https://github.com/Azure/azure-sdk-for-java). As an open-source project, contributions are welcome!\n* We're currently updating the Azure SDK for Java libraries to share common cloud patterns such as authentication protocols, logging, tracing, transport protocols, buffered responses, and retries.\n  * This shared functionality is contained in the [azure-core](https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/core/azure-core) library.\n* For more information on the guidelines we apply to the libraries, see the [Java Azure SDK Design Guidelines](https://azure.github.io/azure-sdk/java_introduction.html).\n\n## Supported platforms for Azure SDK for Java\n\nThe Azure SDK for Java ships with support for Java 8 and later, but we recommend that developers always use the latest Java long-term support (LTS) release in development and when releasing to production. Using the latest LTS release ensures the availability of the latest improvements within Java, including bug fixes, performance improvements, and security fixes. Also, the Azure SDK for Java includes additional support for later releases of Java. This additional support improves performance and includes JDK-specific enhancements beyond the supported Java 8 baseline.\n\nThe Azure SDK for Java is tested and supported on Windows, Linux, and macOS. It is not tested on other platforms that the JDK supports, and does not support Android deployments. For developers wanting to develop software for deployment on Android devices and which make use of Azure services, there are Android-specific libraries available in the [Azure SDK for Android](https://github.com/Azure/azure-sdk-for-android) project.\n\n## Connect to and use Azure resources with client libraries\n\nThe client (or \"data plane\") libraries help you write Java application code to interact with already-provisioned services. Client libraries exist only for those services that support a client API. You can identify them because their Maven group ID is `com.azure`.\n\nAll Azure Java client libraries follow the same API design pattern of offering a Java builder class that's responsible for creating an instance of a client. This pattern separates the definition and instantiation of the client from its operation, allowing the client to be immutable and therefore easier to use. Additionally, all client libraries follow a few important patterns:\n\n* Client libraries that support both synchronous and asynchronous APIs must offer these APIs in separate classes. What this means is that in these cases there would be, for example, a `KeyVaultClient` for sync APIs and a `KeyVaultAsyncClient` for async APIs.\n\n* There's a single builder class that takes responsibility for building both the sync and async APIs. The builder is named similarly to the sync client class, with `Builder` included. For example, `KeyVaultClientBuilder`. This builder has `buildClient()` and `buildAsyncClient()` methods to create client instances, as appropriate.\n\nBecause of these conventions, all classes ending in `Client` are immutable and provide operations to interact with an Azure service. All classes that end in `ClientBuilder` provide operations to configure and create an instance of a particular client type.\n\n### Client libraries example\n\nThe following code example shows how to create a synchronous Key Vault `KeyClient`:\n\n```java\nKeyClient client = new KeyClientBuilder()\n        .endpoint(<your Key Vault URL>)\n        .credential(new DefaultAzureCredentialBuilder().build())\n        .buildClient();\n```\n\nThe following code example shows how to create an asynchronous Key Vault `KeyAsyncClient`:\n\n```java\nKeyAsyncClient client = new KeyClientBuilder()\n        .endpoint(<your Key Vault URL>)\n        .credential(new DefaultAzureCredentialBuilder().build())\n        .buildAsyncClient();\n```\n\nFor more information on working with each client library, see the **README.md** file located in the library's project directory in the [SDK GitHub repository](https://github.com/Azure/azure-sdk-for-java). You can also find more code snippets in the [reference documentation](/java/api) and the [Azure Samples](/samples/browse/?products=azure&languages=java).\n\n## Provision and manage Azure resources with management libraries\n\nThe management (or \"management plane\") libraries help you create, provision and otherwise manage Azure resources from Java application code. You can find these libraries in the `com.azure.resourcemanager` Maven group ID. All Azure services have corresponding management libraries.\n\nWith the management libraries, you can write configuration and deployment scripts to perform the same tasks that you can through the [Azure portal](https://portal.azure.com/) or the [Azure CLI](/cli/azure/install-azure-cli).\n\nAll Azure Java management libraries provide a `*Manager` class as service API, for example, `ComputeManager` for Azure compute service, or `AzureResourceManager` for the aggregation of popular services.\n\n### Management libraries example\n\nThe following code example shows how to create a `ComputeManager`:\n\n```java\nComputeManager computeManager = ComputeManager\n    .authenticate(\n        new DefaultAzureCredentialBuilder().build(),\n        new AzureProfile(AzureEnvironment.AZURE));\n```\n\nThe following code example shows how to provision a new virtual machine:\n\n```java\nVirtualMachine virtualMachine = computeManager.virtualMachines()\n    .define(<your virtual machine>)\n    .withRegion(Region.US_WEST)\n    .withExistingResourceGroup(<your resource group>)\n    .withNewPrimaryNetwork(\"10.0.0.0/28\")\n    .withPrimaryPrivateIPAddressDynamic()\n    .withoutPrimaryPublicIPAddress()\n    .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_18_04_LTS)\n    .withRootUsername(<virtual-machine username>)\n    .withSsh(<virtual-machine SSH key>)\n    .create();\n```\n\nThe following code example shows how to get an existing virtual machine:\n\n```java\nVirtualMachine virtualMachine = computeManager.virtualMachines()\n    .getByResourceGroup(<your resource group>, <your virtual machine>);\n```\n\nThe following code example shows how to update the virtual machine and add a new data disk:\n\n```java\nvirtualMachine.update()\n    .withNewDataDisk(10)\n    .apply();\n```\n\nFor more information on working with each management library, see the **README.md** file located in the library's project directory in the [SDK GitHub repository](https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/resourcemanager#readme). You can also find more code snippets in the [reference documentation](/java/api) and the [Azure Samples](/samples/browse/?products=azure&languages=java).\n\n## Get help and connect with the SDK team\n\n* Visit the [Azure SDK for Java documentation](https://azure.github.io/azure-sdk-for-java/).\n* Post questions to the community on [Stack Overflow](https://stackoverflow.com/questions/tagged/azure-sdk-for-java).\n* Open issues against the SDK in the [GitHub repository](https://github.com/Azure/azure-sdk-for-java/issues).\n* Mention [@AzureSDK](https://twitter.com/AzureSdk/) on Twitter.\n\n## Next steps\n\nNow that you understand what the Azure SDK for Java is, you can take a deep dive into many of the cross-cutting concepts that exist to make you productive when using the libraries. The following articles provide good starting points:\n\n* [HTTP clients and pipelines](http-client-pipeline.md)\n* [Asynchronous programming](async-programming.md)\n* [Pagination and iteration](pagination.md)\n* [Long-running operations](lro.md)\n* [Configure proxies](proxying.md)\n* [Configure tracing](tracing.md)\n"
  },
  {
    "path": "articles/java/sdk/pagination.md",
    "content": "---\ntitle: Pagination and iteration in the Azure SDK for Java\ndescription: Provides an overview of the Azure SDK for Java concepts related to pagination and iteration.\nms.date: 04/02/2025\nms.topic: concept-article\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: anuchan\n---\n\n# Pagination and iteration in the Azure SDK for Java\n\nThis article provides an overview of how to use the Azure SDK for Java pagination and iteration functionality to work efficiently and productively with large data sets.\n\nMany operations provided by the client libraries within the Azure Java SDK return more than one result. The Azure Java SDK defines a set of acceptable return types in these cases to ensure that developer experience is maximized through consistency. The return types used are `PagedIterable` for sync APIs and `PagedFlux` for async APIs. The APIs differ slightly on account of their different use cases, but conceptually they have the same requirements:\n\n- Make it possible to easily iterate over each element in the collection individually, ignoring any need for manual pagination or tracking of continuation tokens. Both `PagedIterable` and `PagedFlux` make this task easy by iterating over a paginated response deserialized into a given type `T`. `PagedIterable` implements the `Iterable` interface, and offers an API to receive a `Stream`, while `PagedFlux` provides a `Flux`. In all cases, the act of pagination is transparent, and iteration continues while there are still results iterate over.\n\n- Make it possible to iterate explicitly page-by-page. Doing so lets you understand more clearly when requests are made, and lets you access per-page response information. Both `PagedIterable` and `PagedFlux` have methods that will return appropriate types to iterate by page, rather than by individual element.\n\nThis article is split between the Java Azure SDK synchronous and asynchronous APIs. You'll see the synchronous iteration APIs when you work with synchronous clients, and asynchronous iteration APIs when you work with asynchronous clients.\n\n## Synchronous pagination and iteration\n\nThis section covers the synchronous APIs.\n\n### Iterate over individual elements\n\nAs noted, the most common use case is to iterate over each element individually, rather than per page. The following code examples show how the `PagedIterable` API lets you use the iteration style you prefer to implement this functionality.\n\n#### Use a for-each loop\n\nBecause `PagedIterable` implements `Iterable`, you can iterate through the elements as shown in the following example:\n\n```java\nPagedIterable<Secret> secrets = client.listSecrets();\nfor (Secret secret : secrets) {\n   System.out.println(\"Secret is: \" + secret);\n}\n```\n\n#### Use Stream\n\nBecause `PagedIterable` has a `stream()` method defined on it, you can call it to use the standard Java Stream APIs, as shown in the following example:\n\n```java\nclient.listSecrets()\n      .stream()\n      .forEach(secret -> System.out.println(\"Secret is: \" + secret));\n```\n\n#### Use Iterator\n\nBecause `PagedIterable` implements `Iterable`, it also has an `iterator()` method to allow for the Java iterator programming style, as show in the following example:\n\n```java\nIterator<Secret> secrets = client.listSecrets().iterator();\nwhile (it.hasNext()) {\n   System.out.println(\"Secret is: \" + it.next());\n}\n```\n\n### Iterate over pages\n\nWhen you work with individual pages, you can iterate per page, for example when you need HTTP response information, or when continuation tokens are important to retain iteration history. Regardless of whether you iterate by page or by each item, there's no difference in performance or the number of calls made to the service. The underlying implementation loads the next page on demand, and if you unsubscribe from the `PagedFlux` at any time, there are no further calls to the service.\n\n#### Use a for-each loop\n\nWhen you call `listSecrets()`, you get a `PagedIterable`, which has an `iterableByPage()` API. This API produces an `Iterable<PagedResponse<Secret>>` instead of an `Iterable<Secret>`. The `PagedResponse` provides the response metadata and access to the continuation token, as shown in the following example:\n\n```java\nIterable<PagedResponse<Secret>> secretPages = client.listSecrets().iterableByPage();\nfor (PagedResponse<Secret> page : secretPages) {\n   System.out.println(\"Response code: \" + page.getStatusCode());\n   System.out.println(\"Continuation Token: \" + page.getContinuationToken());\n   page.getElements().forEach(secret -> System.out.println(\"Secret value: \" + secret));\n}\n```\n\nThere's also an `iterableByPage` overload that accepts a continuation token. You can call this overload when you want to return to the same point of iteration at a later time.\n\n#### Use Stream\n\nThe following example shows how the `streamByPage()` method performs the same operation as shown above. This API also has a continuation token overload for returning to the same point of iteration at a later time.\n\n```java\nclient.listSecrets()\n      .streamByPage()\n      .forEach(page -> {\n          System.out.println(\"Response code: \" + page.getStatusCode());\n          System.out.println(\"Continuation Token: \" + page.getContinuationToken());\n          page.getElements().forEach(secret -> System.out.println(\"Secret value: \" + secret));\n      });\n```\n\n## Asynchronously observe pages and individual elements\n\nThis section covers the asynchronous APIs. In async APIs, the network calls happen in a different thread than the main thread that calls `subscribe()`. What this means is that the main thread may terminate before the result is available. It's up to you to ensure that the application doesn't exit before the async operation has had time to complete.\n\n### Observe individual elements\n\nThe following example shows how the `PagedFlux` API lets you observe individual elements asynchronously. There are various ways to subscribe to a Flux type. For more information, see [Simple Ways to Create a Flux or Mono and Subscribe to It](https://projectreactor.io/docs/core/release/reference/#_simple_ways_to_create_a_flux_or_mono_and_subscribe_to_it) in the [Reactor 3 Reference Guide](https://projectreactor.io/docs/core/release/reference). This example is one variety where there are three lambda expressions, one each for the consumer, the error consumer, and the complete consumer. Having all three is good practice, but in some cases it's only necessary to have the consumer, and possibly the error consumer.\n\n ```java\nasyncClient.listSecrets()\n    .subscribe(secret -> System.out.println(\"Secret value: \" + secret),\n        ex -> System.out.println(\"Error listing secrets: \" + ex.getMessage()),\n        () -> System.out.println(\"Successfully listed all secrets\"));\n ```\n\n### Observe pages\n\n The following example shows how the `PagedFlux` API lets you observe each page asynchronously, again by using a `byPage()` API and by providing a consumer, error consumer, and a completion consumer.\n\n  ```java\nasyncClient.listSecrets().byPage()\n    .subscribe(page -> {\n            System.out.println(\"Response code: \" + page.getStatusCode());\n            System.out.println(\"Continuation Token: \" + page.getContinuationToken());\n            page.getElements().forEach(secret -> System.out.println(\"Secret value: \" + secret));\n        },\n        ex -> System.out.println(\"Error listing pages with secret: \" + ex.getMessage()),\n        () -> System.out.println(\"Successfully listed all pages with secret\"));\n ```\n\n## Next steps\n\nNow that you're familiar with pagination and iteration in the Azure SDK for Java, consider reviewing [Long-running operations in the Azure SDK for Java](lro.md). Long-running operations are operations that run for a longer duration than most normal HTTP requests, typically because they require some effort on the server side.\n"
  },
  {
    "path": "articles/java/sdk/proxying.md",
    "content": "---\ntitle: Configure proxies in the Azure SDK for Java\ndescription: Provides an overview of the Azure SDK for Java concepts related to proxying.\nms.date: 04/01/2025 \nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: alzimmer\n---\n\n# Configure proxies in the Azure SDK for Java\n\nThis article provides an overview of how to configure the Azure SDK for Java to make proper use of proxies.\n\n## HTTP proxy configuration\n\nThe Azure client libraries for Java offer multiple ways to configure a proxy for an `HttpClient`.\n\nEach method of supplying a proxy has its own pros and cons and provides different levels of encapsulation. When you've configured a proxy for an `HttpClient`, it will use the proxy for the rest of its lifetime. Having the proxy tied to an individual `HttpClient` allows an application to use multiple `HttpClient` instances where each can use a different proxy to fulfill an application's proxying requirements.\n\nThe proxy configuration options are:\n\n* [Use an environment proxy](#use-an-environment-proxy)\n* [Use a Configuration proxy](#use-a-configuration-proxy)\n* [Use an explicit proxy](#use-an-explicit-proxy)\n\n### Use an environment proxy\n\nBy default, HTTP client builders will inspect the environment for proxy configurations. This process makes use of the Azure SDK for Java `Configuration` APIs. When the builder creates a client, it's configured with a copy of the 'global configuration' retrieved by calling `Configuration.getGlobalConfiguration()`. This call will read in any HTTP proxy configuration from the system environment.\n\nWhen the builder inspects the environment, it will search for the following environment configurations in the order specified:\n\n1. `HTTPS_PROXY`\n2. `HTTP_PROXY`\n3. `https.proxy*`\n4. `http.proxy*`\n\nThe `*` represents the well-known Java proxy properties. For more information, see [Java Networking and Proxies](https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html) in the Oracle documentation.\n\nIf the builder finds any of the environment configurations, it creates a `ProxyOptions` instance by calling `ProxyOptions.fromConfiguration(Configuration.getGlobalConfiguration())`. This article provides more details below about the `ProxyOptions` type.\n\n> [!Important]\n> To implicitly use `HTTPS_PROXY` or `HTTP_PROXY`, Java requires you to set the system environment property `java.net.useSystemProxies` to `true`.\n\nYou can also create an HTTP client instance that doesn't use any proxy configuration present in the system environment variables. To override the default behavior, you explicitly set a differently-configured `Configuration` in the HTTP client builder. When you set a `Configuration` in the builder, it will no longer call `Configuration.getGlobalConfiguration()`. For example, if you call `configuration(Configuration)` using `Configuration.NONE`, you can explicitly prevent the builder from inspecting the environment for configuration.\n\nThe following example uses the `HTTP_PROXY` environment variable with value `localhost:8888` to use Fiddler as the proxy. This code demonstrates creating a Netty and an OkHttp HTTP client. (For more information on HTTP client configuration, see [HTTP clients and pipelines](http-client-pipeline.md).)\n\n```bash\nexport HTTP_PROXY=localhost:8888\n```\n\n```java\nHttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder().build();\nHttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder().build();\n```\n\nTo prevent the environment proxy from being used, configure the HTTP client builder with `Configuration.NONE`, as shown in the following example:\n\n```java\nHttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()\n    .configuration(Configuration.NONE)\n    .build();\n\nHttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()\n    .configuration(Configuration.NONE)\n    .build();\n```\n\n### Use a Configuration proxy\n\nRather than read from the environment, you can configure HTTP client builders to use a custom `Configuration` with the same proxy settings that are already accepted from the environment. This configuration offers the ability to have reusable configurations that are scoped to a limited use case. When the HTTP client builder is building the `HttpClient`, it will use the `ProxyOptions` returned from `ProxyOptions.fromConfiguration(<Configuration passed into the builder>)`.\n\nThe following example uses the `http.proxy*` configurations set in a `Configuration` object to use a proxy that authenticates Fiddler as the proxy.\n\n```java\nConfiguration configuration = new ConfigurationBuilder()\n    .putProperty(\"http.proxyHost\", \"localhost\")\n    .putProperty(\"http.proxyPort\", \"8888\")\n    .putProperty(\"http.proxyUser\", \"1\")\n    .putProperty(\"http.proxyPassword\", \"1\")\n    .build();\n\nHttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()\n    .configuration(configuration)\n    .build();\n\nHttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()\n    .configuration(configuration)\n    .build();\n```\n\n### Use an explicit proxy\n\nThe Java client libraries ship with a `ProxyOptions` class that acts as the Azure client libraries type for configuring a proxy. You can configure `ProxyOptions` with the network protocol used to send proxy requests, the proxy address, proxy authentication credentials, and non-proxying hosts. Only the proxy network protocol and proxy address are required. When using authentication credentials, you must set both the username and password.\n\nThe following example creates a simple `ProxyOptions` instance that proxies requests to the default Fiddler address (`localhost:8888`):\n\n```java\nProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(\"localhost\", 8888));\n```\n\nThe following example creates an authenticated `ProxyOptions` that proxies requests to a Fiddler instance requiring proxy authentication:\n\n```java\n// Fiddler uses username \"1\" and password \"1\" with basic authentication as its proxy authentication requirement.\nProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(\"localhost\", 8888))\n    .setCredentials(\"1\", \"1\");\n```\n\nYou can configure HTTP client builders with `ProxyOptions` directly to indicate an explicit proxy to use. This configuration is the most granular way to provide a proxy, and generally isn't as flexible as passing a `Configuration` that you can mutate to update proxying requirements.\n\nThe following example uses `ProxyOptions` to use Fiddler as the proxy:\n\n```java\nProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress(\"localhost\", 8888));\n\nHttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()\n    .proxy(proxyOptions)\n    .build();\n\nHttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()\n    .proxy(proxyOptions)\n    .build();\n```\n\n## Next steps\n\nNow that you're familiar with proxy configuration in the Azure SDK for Java, see [Configure tracing in the Azure SDK for Java](tracing.md) to better understand flows within your application, and to help diagnose issues.\n"
  },
  {
    "path": "articles/java/sdk/security-samples.md",
    "content": "---\ntitle: Java source samples for Microsoft Entra ID\ndescription: Learn how to get sample source code for working with Microsoft Entra ID from your Java apps.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\nms.date: 06/02/2025\nms.topic: concept-article\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Java source samples for Microsoft Entra ID\n\nThe following table links to Java source you can use to access and work with Microsoft Entra ID in your apps.\n\n[!INCLUDE [java-aad-samples](includes/java-aad-samples.md)]\n"
  },
  {
    "path": "articles/java/sdk/sql-database-samples.md",
    "content": "---\ntitle: Azure management libraries for Java SQL Database samples\ndescription: Get sample code for creating and updating Azure SQL databases using the Azure Management libraries for Java.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\nms.date: 06/02/2025 \nms.topic: concept-article\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n\n# Azure management libraries for Java - SQL Database samples\n\nThe following table links to Java source you can use to manage SQL Database.\n\n[!INCLUDE [java-sql-samples](includes/java-sql-samples.md)]\n"
  },
  {
    "path": "articles/java/sdk/toc.yml",
    "content": "items:\n- name: Azure SDK for Java documentation\n  href: index.yml\n  items:\n  - name: Getting started\n    items:\n    - name: Get started with Apache Maven\n      href: get-started-maven.md\n    - name: Get started with Gradle\n      href: get-started-gradle.md\n    - name: Eclipse and IntelliJ integration\n      href: get-started-ide.md\n    expanded: true\n  - name: Libraries, drivers, and Spring modules\n    href: libraries-drivers-modules.md\n  - name: Concepts\n    items:\n    - name: Overview\n      href: overview.md\n    - name: Authentication\n      items:\n      - name: Overview\n        href: authentication/overview.md\n      - name: Auth during local development\n        items: \n        - name: Use a developer account\n          href: authentication/local-development-dev-accounts.md\n        - name: Use a service principal\n          href: authentication/local-development-service-principal.md\n        - name: Use a broker\n          href: authentication/local-development-broker.md\n      - name: Auth from Azure-hosted apps\n        items: \n        - name: Use a system-assigned managed identity\n          href: authentication/system-assigned-managed-identity.md\n        - name: Use a user-assigned managed identity\n          href: authentication/user-assigned-managed-identity.md\n      - name: Auth from on-premises apps\n        href: authentication/on-premises-apps.md\n      - name: Credential chains\n        href: authentication/credential-chains.md\n      expanded: false\n    - name: Logging\n      items:\n      - name: Overview\n        href: logging-overview.md\n      - name: java.util.logging\n        href: logging-jul.md\n      - name: Logback\n        href: logging-logback.md\n      - name: Log4J\n        href: logging-log4j.md\n      expanded: false\n    - name: HTTP clients and pipeline\n      href: http-client-pipeline.md\n    - name: Asynchronous programming\n      href: async-programming.md\n    - name: Pagination and iteration\n      href: pagination.md\n    - name: Long-running operations\n      href: lro.md\n    - name: Proxying\n      href: proxying.md\n    - name: Tracing\n      href: tracing.md\n    expanded: true\n  - name: Integrations\n    items:\n    - name: IntelliJ\n      href: ../toolkit-for-intellij/index.yml\n    - name: Eclipse\n      href: ../toolkit-for-eclipse/index.yml\n    - name: Spring\n      href: ../spring-framework/spring-cloud-azure-overview.md\n    expanded: false\n  - name: Troubleshooting\n    items:\n    - name: Overview\n      href: troubleshooting-overview.md\n    - name: Identity and authentication\n      items:\n      - name: Overview\n        href: troubleshooting-authentication-overview.md\n      - name: Azure-hosted application authentication\n        href: troubleshooting-authentication-azure-hosted.md\n      - name: Development environment authentication\n        href: troubleshooting-authentication-dev-env.md\n      - name: Service principal authentication\n        href: troubleshooting-authentication-service-principal.md\n      - name: Multi-tenant authentication\n        href: troubleshooting-authentication-multi-tenant.md\n      expanded: false\n    - name: Messaging\n      items:\n      - name: Event Hubs\n        items:\n        - name: Overview\n          href: troubleshooting-messaging-event-hubs-overview.md\n        - name: Event producer\n          href: troubleshooting-messaging-event-hubs-producer.md\n        - name: Event processor\n          href: troubleshooting-messaging-event-hubs-processor.md\n        - name: Performance\n          href: troubleshooting-messaging-event-hubs-performance.md\n        expanded: false\n      - name: Service Bus\n        href: troubleshooting-messaging-service-bus-overview.md\n      expanded: false\n    - name: Dependency conflicts\n      href: troubleshooting-dependency-version-conflict.md\n    - name: Network issues\n      href: troubleshooting-network.md\n    expanded: false\n  - name: Code samples\n    items:\n    - name: Virtual machines\n      href: virtual-machine-samples.md\n    - name: Web apps\n      href: web-apps-samples.md\n    - name: SQL Database\n      href: sql-database-samples.md\n    - name: Security\n      href: security-samples.md\n    - name: Containers\n      href: containers-samples.md\n    - name: All Java samples\n      href: /samples/browse/?products=azure&languages=java\n  - name: Package index\n    href: azure-sdk-library-package-index.md\n  - name: Reference\n    href: /java/api/overview/azure/\n"
  },
  {
    "path": "articles/java/sdk/tracing.md",
    "content": "---\ntitle: Configure tracing in the Azure SDK for Java\ndescription: Provides an overview of the Azure SDK for Java concepts related to tracing.\nms.date: 04/01/2025 \nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: savaity\n---\n\n# Configure tracing in the Azure SDK for Java\n\nThis article provides an overview of how to configure the Azure SDK for Java to integrate tracing functionality.\n\nYou can enable tracing in Azure client libraries by using and configuring the OpenTelemetry SDK or using an OpenTelemetry-compatible agent. OpenTelemetry is a popular open-source observability framework for generating, capturing, and collecting telemetry data for cloud-native software.\n\nThere are two key concepts related to tracing: **span** and **trace**. A span represents a single operation in a trace. A span can represent an HTTP request, a remote procedure call (RPC), a database query, or even the path that your code takes. A trace is a tree of spans showing the path of work through a system. You can distinguish a trace on its own by a unique 16-byte sequence called a TraceID. For more information on these concepts and how they relate to OpenTelemetry, see the [OpenTelemetry documentation](https://opentelemetry.io/docs/).\n\n## Azure SDK tracing with Azure Monitor Java agent\n\nBy using an Azure Monitor Java in-process agent, you can enable monitoring of your applications without any code changes. For more information, see [Azure Monitor OpenTelemetry-based auto-instrumentation for Java applications](/azure/azure-monitor/app/java-in-process-agent). Azure SDK support is enabled by default starting with agent version 3.2.\n\n## Tracing Azure SDK calls with OpenTelemetry agent\n\nIf you use [OpenTelemetry Java agent](https://github.com/open-telemetry/opentelemetry-java-instrumentation/), Azure SDK instrumentation is enabled out-of-the-box starting from version 1.12.0.\n\nFor more details on how to configure exporters, add manual instrumentation, or enrich telemetry, see [OpenTelemetry Instrumentation for Java](https://github.com/open-telemetry/opentelemetry-java-instrumentation).\n\n> [!NOTE]\n> OpenTelemetry agent artifact is stable, but does not provide over-the-wire telemetry stability guarantees, which may cause span names and attribute names produced by Azure SDK that might change over time if you update the agent. For more information, see [Compatibility requirements](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/VERSIONING.md#compatibility-requirements).\n\n### Manually instrument the application with OpenTelemetry SDK (preview)\n\nIf you use OpenTelemetry SDK directly, make sure to configure SDK and exporter for the backend of your choice. For more information, see [OpenTelemetry documentation](https://opentelemetry.io/docs/instrumentation/java/manual_instrumentation/).\n\nTo enable Azure SDK tracing, add the latest `com.azure:azure-core-tracing-opentelemetry` packages to your application. For example, in Maven, add the following entry to your **pom.xml** file:\n\n```xml\n<dependency>\n  <groupId>com.azure</groupId>\n  <artifactId>azure-core-tracing-opentelemetry</artifactId>\n</dependency>\n```\n\nIf you run the application now, you should get Azure SDK spans on your backend. However with asynchronous calls, the correlation between Azure SDK and application spans may be broken.\n\nBy default, Azure SDK uses `io.opentelemetry.context.Context.current()`, implicitly propagated by OpenTelemetry, as a parent to new spans. In asynchronous calls, implicit context propagation breaks. OpenTelemetry agents solve this problem by helping context propagate, but the OpenTelemetry SDK doesn't have such capabilities.\n\n### Pass trace context explicitly\n\nAzure SDK allows passing trace context explicitly through `com.azure.core.util.Context` under the `trace-context` key. When you provide explicit trace context, Azure SDK uses it instead of the implicit one, which enables correlation between application and Azure SDK spans.\n\nIn the following example, when an incoming web request is traced manually, the Application Configuration Client Library is called asynchronously in the scope of this request.\n\n```java\nSpan span = TRACER.spanBuilder(\"incoming request\").startSpan();\nio.opentelemetry.context.Context traceContext = io.opentelemetry.context.Context.root().with(span);\n\n// Put the incoming-request span (wrapped into the OpenTelemetry Context) into the Azure SDK Context\n// and pass it over to the Application Configuration call.\nappConfigClient.setConfigurationSettingWithResponse(settings, true, new com.azure.core.util.Context(\"trace-context\", traceContext));\n\n// You could also pass the context using the reactor `contextWrite` method under the same `trace-context` key.\nappConfigAsyncClient.setConfigurationSettingWithResponse(settings)\n   .contextWrite(reactor.util.context.Context.of(\"trace-context\", traceContext))\n\n//...\n```\n\n#### Azure SDK tracing conventions\n\nTo find out which spans and attributes the SDK emits, see the [Azure SDK semantic conventions specification](https://github.com/Azure/azure-sdk/blob/main/docs/observability/opentelemetry-conventions.yml). Azure SDK (and OpenTelemetry) semantic conventions are not stable and may change in the future.\n\n## Next steps\n\nNow that you're familiar with the core cross-cutting functionality in the Azure SDK for Java, see [Azure authentication with Java and Azure Identity](authentication/overview.md) to learn how you can create secure applications.\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-authentication-azure-hosted.md",
    "content": "---\ntitle: Troubleshoot Azure-hosted application authentication\ntitleSuffix: Azure SDK for Java\ndescription: Provides an overview of how to troubleshoot Azure-hosted authentication issues.\nms.date: 04/02/2025 \nms.topic: troubleshooting-general\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\nms.custom:\n  - devx-track-java\n  - devx-track-extended-java\n  - sfi-ropc-nochange\n---\n\n# Troubleshoot Azure-hosted application authentication\n\nThis article provides guidance on dealing with issues encountered when authenticating Azure SDK for Java applications hosted on Azure, through various `TokenCredential` implementations. For more information, see [Authenticate Azure-hosted Java applications](authentication/azure-hosted-apps.md).\n\n## Troubleshoot DefaultAzureCredential\n\nWhen you use `DefaultAzureCredential`, you can optionally try/catch for `CredentialUnavailableException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                                                                                                                           | Description                                                                                                                                                                                                                                                                                                                | Mitigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n|-----------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `CredentialUnavailableException raised with message \"DefaultAzureCredential failed to retrieve a token from the included credentials.\"` | All credentials in the `DefaultAzureCredential` chain failed to retrieve a token, each throwing a `CredentialUnavailableException`.                                                                                                                                                                                        | [Enable logging][logging_link] to verify the credentials being tried, and get further diagnostic information. <br><br>For more information, see the troubleshooting guide for one of the following underlying credential types: <br>- [EnvironmentCredential](#troubleshoot-environmentcredential) <br>- [ManagedIdentityCredential](#troubleshoot-managedidentitycredential) <br>- [VisualStudioCodeCredential](troubleshooting-authentication-dev-env.md#troubleshoot-visualstudiocodecredential) <br>- [AzureCLICredential](troubleshooting-authentication-dev-env.md#troubleshoot-azureclicredential) <br>- [AzurePowershellCredential](troubleshooting-authentication-dev-env.md#troubleshoot-azurepowershellcredential) |\n| `HttpResponseException raised from the client with a status code of 401 or 403`                                                         | Authentication succeeded but the authorizing Azure service responded with a 401 (Authenticate), or 403 (Forbidden) status code. This issue often occurs when `DefaultAzureCredential` authenticates an account other than the intended one or the intended account doesn't have the correct permissions or roles assigned. | [Enable logging][logging_link] to determine which credential in the chain returned the authenticating token. <br><br>In the case where a credential other than the expected one is returning a token, look to bypass this issue by signing out of the corresponding development tool. <br><br>Ensure that the correct role is assigned to the account being used. For example, a service-specific role rather than the subscription Owner role.                                                                                                                                                                                                                                                                               |\n\n## Troubleshoot EnvironmentCredential\n\nWhen you use `EnvironmentCredential`, you can optionally try/catch for `CredentialUnavailableException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                                    | Description                                              | Mitigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n|--------------------------------------------------|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `Environment variables aren't fully configured.` | A valid combination of environment variables wasn't set. | Ensure that the appropriate environment variables are set prior to application startup for the intended authentication method, as described in the following list: <br>- To authenticate a service principal using a client secret, ensure that the variables `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_CLIENT_SECRET` are properly set. <br>- To authenticate a service principal using a certificate, ensure that the variables `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_CERTIFICATE_PATH`, and optionally `AZURE_CLIENT_CERTIFICATE_PASSWORD` are properly set. <br>- To authenticate a user using a password, ensure that the variables `AZURE_USERNAME` and `AZURE_PASSWORD` are properly set. |\n\n## Troubleshoot ManagedIdentityCredential\n\n`ManagedIdentityCredential` is designed to work on various Azure hosts that provide managed identity. Configuring the managed identity and troubleshooting failures varies from host to host. The following list shows the Azure host environments that you can assign a managed identity and that `ManagedIdentityCredential` supports:\n\n* Azure App Service and Azure Functions - [configuration](/azure/app-service/overview-managed-identity) - [troubleshooting](#azure-app-service-and-azure-functions-managed-identity)\n* Azure Arc - [configuration](/azure/azure-arc/servers/managed-identity-authentication)\n* Azure Kubernetes Service - [configuration](https://azure.github.io/aad-pod-identity/docs/) - [troubleshooting](#azure-kubernetes-service-managed-identity)\n* Azure Service Fabric  -[configuration](/azure/service-fabric/concepts-managed-identity)\n* Azure Virtual Machines and Scale Sets  -[configuration](/azure/active-directory/managed-identities-azure-resources/qs-configure-portal-windows-vm) - [troubleshooting](#azure-virtual-machine-managed-identity)\n\n### Azure Virtual Machine Managed Identity\n\nWhen you use `ManagedIdentityCredential`, you can optionally try/catch for `CredentialUnavailableException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                                                                    | Description                                                                                                                                                            | Mitigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n|----------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `The requested identity hasn't been assigned to this resource.`                  | The Azure Instance Metadata Service (IMDS) endpoint responded with a status code of 400, indicating the requested identity isn't assigned to the virtual machine (VM). | If you're using a user-assigned identity, ensure that the specified `clientId` is correct. <br><br>If you're using a system assigned identity, make sure that you've enabled it properly. For more information, see the [Enable system-assigned managed identity on an existing VM](/azure/active-directory/managed-identities-azure-resources/qs-configure-portal-windows-vm#enable-system-assigned-managed-identity-on-an-existing-vm) section of [Configure managed identities for Azure resources on a VM using the Azure portal](/azure/active-directory/managed-identities-azure-resources/qs-configure-portal-windows-vm). |\n| `The request failed due to a gateway error.`                                     | The request to the IMDS endpoint failed due to a gateway error, 502 or 504 status code.                                                                                | IMDS doesn't support calls via proxy or gateway. Disable proxies or gateways running on the VM for calls to the IMDS endpoint `http://169.254.169.254/`                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n| `No response received from the managed identity endpoint.`                       | No response was received for the request to IMDS or the request timed out.                                                                                             | - Ensure that you've properly configured managed identity on the VM. For more information, see [Configure managed identities for Azure resources on a VM using the Azure portal](/azure/active-directory/managed-identities-azure-resources/qs-configure-portal-windows-vm). <br>- Verify that the IMDS endpoint is reachable on the VM. For more information, see [the next section](#verify-that-imds-is-available-on-the-vm).                                                                                                                                                                                                  |\n| `Multiple attempts failed to obtain a token from the managed identity endpoint.` | Retries to retrieve a token from the IMDS endpoint have been exhausted.                                                                                                | - For more information on specific failures, see the inner exception messages. If the data has been truncated, more detail can be obtained by [collecting logs][logging_link]. <br>- Ensure that you've properly configured managed identity on the VM. For more information, see [Configure managed identities for Azure resources on a VM using the Azure portal](/azure/active-directory/managed-identities-azure-resources/qs-configure-portal-windows-vm). <br>- Verify that the IMDS endpoint is reachable on the VM. For more information, see [the next section](#verify-that-imds-is-available-on-the-vm).               |\n\n#### Verify that IMDS is available on the VM\n\nIf you have access to the VM, you can verify that the manged identity endpoint is available via the command line using `curl`, as shown in the following example:\n\n```bash\ncurl 'http://169.254.169.254/metadata/identity/oauth2/token?resource=https://management.core.windows.net&api-version=2018-02-01' -H \"Metadata: true\"\n```\n\n> [!WARNING]\n> The output of this command contains a valid access token. To avoid compromising account security, don't share this access token.\n\n### Azure App Service and Azure Functions Managed Identity\n\nWhen you use `ManagedIdentityCredential`, you can optionally try/catch for `CredentialUnavailableException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                                           | Description                                                                    | Mitigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n|---------------------------------------------------------|--------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `ManagedIdentityCredential authentication unavailable.` | The environment variables configured by the App Services host weren't present. | - Ensure that you've properly configured the managed identity on the App Service instance. For more information, see [How to use managed identities for App Service and Azure Functions](/azure/app-service/overview-managed-identity?tabs=java). <br>- Verify that you've properly configured the App Service environment and that the managed identity endpoint is available. For more information, see [the next section](#verify-that-the-app-service-managed-identity-endpoint-is-available). |\n\n#### Verify that the App Service Managed Identity endpoint is available\n\nIf you have access to SSH into the App Service instance, you can verify that managed identity is available in the environment. Use `curl` to validate that the managed identity is available, as shown in the following example:\n\n```bash\ncurl \"$IDENTITY_ENDPOINT?resource=https://management.core.windows.net&api-version=2019-08-01\" -H \"X-IDENTITY-HEADER: $IDENTITY_HEADER\"\n```\n\n> [!WARNING]\n> The output of this command contains a valid access token. To avoid compromising account security, don't share this access token.\n\n### Azure Kubernetes Service Managed Identity\n\n#### Pod Identity for Kubernetes\n\nWhen you use `ManagedIdentityCredential`, you can optionally try/catch for `CredentialUnavailableException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                        | Description                                                                           | Mitigation                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n|--------------------------------------|---------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `No Managed Identity endpoint found` | The application attempted to authenticate before an identity was assigned to its pod. | Verify that the pod is labeled correctly. This problem also occurs when a correctly labeled pod authenticates before the identity is ready. To prevent initialization races, configure NMI to set the `Retry-After` header in its responses. For more information, see [Set Retry-After header in NMI response](https://azure.github.io/aad-pod-identity/docs/configure/feature_flags/#set-retry-after-header-in-nmi-response) in the Pod Identity documentation. |\n\n## Troubleshoot WorkloadIdentityCredential\n\nWhen you use `WorkloadIdentityCredential`, you can optionally try/catch for `CredentialUnavailableException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                                                                                          | Description                                                                                                               | Mitigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n|--------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `WorkloadIdentityCredential authentication unavailable. The workload options aren't fully configured.` | `WorkloadIdentityCredential` requires `clientId`, `tenantId` and `tokenFilePath` to authenticate with Microsoft Entra ID. | If you're using `DefaultAzureCredential`, then: <br>- Ensure that the client ID is specified via the `workloadIdentityClientId` setter or the `AZURE_CLIENT_ID` environment variable. <br>- Ensure that the tenant ID is specified via the `AZURE_TENANT_ID` environment variable. <br>- Ensure that you've specified the token file path via the `AZURE_FEDERATED_TOKEN_FILE` environment variable. <br>- Ensure that the authority host is specified via the `AZURE_AUTHORITY_HOST` environment variable. <br><br>If you're using `WorkloadIdentityCredential`, then: <br>- Ensure that the tenant ID is specified via the `tenantId` setter on the credential builder or the `AZURE_TENANT_ID` environment variable. <br>- Ensure that the client ID is specified via the `clientId` setter on the credential builder or the `AZURE_CLIENT_ID` environment variable. <br>- Ensure that the token file path is specified via the `tokenFilePath` setter on the credential builder or the `AZURE_FEDERATED_TOKEN_FILE` environment variable. <br>- For other issues, see the [product troubleshooting guide](https://azure.github.io/azure-workload-identity/docs/troubleshooting.html). |\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n\n<!-- LINKS -->\n[logging_link]: troubleshooting-authentication-overview.md#enable-and-configure-logging\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-authentication-dev-env.md",
    "content": "---\ntitle: Troubleshoot development environment authentication\ntitleSuffix: Azure SDK for Java\ndescription: Provides an overview of how to troubleshoot development environment authentication issues.\nms.date: 04/02/2025 \nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Troubleshoot development environment authentication\n\nThis article provides guidance on dealing with issues encountered when authenticating Azure SDK for Java applications running locally on developer machines, through various `TokenCredential` implementations. For more information, see [Azure authentication in Java development environments](authentication/dev-env.md).\n\n## Troubleshoot AzureCliCredential\n\nWhen you use `AzureCliCredential`, you can optionally try/catch for `CredentialUnavailableException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                             | Description                                                                    | Mitigation                                                                                                                                                                                                                                                                                       |\n|-------------------------------------------|--------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `Azure CLI not installed`                 | The Azure CLI isn't installed or couldn't be found.                            | - Ensure that you've properly installed the [Azure CLI](/cli/azure/install-azure-cli). <br>- Validate that the installation location has been added to the `PATH` environment variable.                                                                                                          |\n| `Please run 'az login' to set up account` | No account is currently signed into the Azure CLI, or the sign-in has expired. | - Sign in to the Azure CLI using the `az login` command. For more information, see [Sign in with Azure CLI](/cli/azure/authenticate-azure-cli). <br>- Validate that the Azure CLI can obtain tokens. For more information, see [the next section](#verify-that-the-azure-cli-can-obtain-tokens). |\n\n### Verify that the Azure CLI can obtain tokens\n\nYou can manually verify that you've properly authenticated the Azure CLI and can obtain tokens. First, use the following command to verify that the account is currently signed in to the Azure CLI:\n\n```azurecli\naz account show\n```\n\nAfter you've verified the Azure CLI is using correct account, use the following command to validate that it's able to obtain tokens for this account:\n\n```azurecli\naz account get-access-token \\\n    --output json \\\n    --resource https://management.core.windows.net\n```\n\n> [!WARNING]\n> The output of this command contains a valid access token. To avoid compromising account security, don't share this access token.\n\n## Troubleshoot AzureDeveloperCliCredential\n\nWhen you use `AzureDeveloperCliCredential`, you can optionally try/catch for `CredentialUnavailableException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                                   | Description                                                                               | Mitigation                                                                                                                                                                                                                                    |\n|-------------------------------------------------|-------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `Azure Developer CLI not installed`             | The Azure Developer CLI isn't installed or couldn't be found.                             | - Ensure that you've properly installed the [Azure Developer CLI](../../azure-developer-cli/install-azd.md). <br>- Validate that the installation location has been added to the `PATH` environment variable.                         |\n| `Please run 'azd auth login' to set up account` | No account is currently signed in to the Azure Developer CLI, or the sign-in has expired. | - Sign in to the Azure Developer CLI using the `azd auth login` command. <br>- Validate that the Azure Developer CLI can obtain tokens. For more information, see [the next section](#verify-that-the-azure-developer-cli-can-obtain-tokens). |\n\n### Verify that the Azure Developer CLI can obtain tokens\n\nYou can manually verify that you've properly authenticated the Azure Developer CLI, and can obtain tokens. First, use the following command to verify that the account is currently signed in to the Azure Developer CLI:\n\n```bash\nazd config list\n```\n\nAfter you've verified the Azure Developer CLI is using correct account, you can use the following command to validate that it's able to obtain tokens for this account:\n\n```bash\nazd auth token --output json --scope https://management.core.windows.net/.default\n```\n\n> [!WARNING]\n> The output of this command contains a valid access token. To avoid compromising account security, don't share this access token.\n\n## Troubleshoot AzurePowerShellCredential\n\nWhen you use `AzurePowerShellCredential`, you can optionally try/catch for `CredentialUnavailableException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                                       | Description                                                                            | Mitigation                                                                                                                                                                                                                                                                                                                    |\n|-----------------------------------------------------|----------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `PowerShell isn't installed.`                       | No local installation of PowerShell was found.                                         | Ensure that you've properly installed [PowerShell](/powershell/scripting/install/installing-powershell) on the machine.                                                                                                                                                                                                       |\n| `Az.Account module >= 2.2.0 isn't installed.`       | The `Az.Account` module needed for authentication in Azure PowerShell isn't installed. | Install the latest `Az.Account` module. For more information, see [How to install Azure PowerShell](/powershell/azure/install-az-ps).                                                                                                                                                                                         |\n| `Please run 'Connect-AzAccount' to set up account.` | No account is currently signed in to Azure PowerShell.                                 | - Sign in to Azure PowerShell using the `Connect-AzAccount` command. For more information, see [Sign in with Azure PowerShell](/powershell/azure/authenticate-azureps) <br>- Validate that Azure PowerShell can obtain tokens. For more information, see [the next section](#verify-that-azure-powershell-can-obtain-tokens). |\n\n### Verify that Azure PowerShell can obtain tokens\n\nYou can manually verify that you've properly authenticated Azure PowerShell, and can obtain tokens. First, use the following command to verify that the account is currently signed in to the Azure CLI:\n\n```powershell\nGet-AzContext\n```\n\nThis command produces output similar to the following example:\n\n```output\nName                                     Account             SubscriptionName    Environment         TenantId\n----                                     -------             ----------------    -----------         --------\nSubscription1 (xxxxxxxx-xxxx-xxxx-xxx... test@outlook.com    Subscription1       AzureCloud          xxxxxxxx-x...\n```\n\nAfter you've verified Azure PowerShell is using correct account, you can use the following command to validate that it's able to obtain tokens for this account.\n\n```powershell\nGet-AzAccessToken -ResourceUrl \"https://management.core.windows.net\"\n```\n\n> [!WARNING]\n> The output of this command contains a valid access token. To avoid compromising account security, don't share this access token.\n\n## Troubleshoot VisualStudioCodeCredential\n\n> [!NOTE]\n> It's a [known issue](https://github.com/Azure/azure-sdk-for-java/issues/27364) that `VisualStudioCodeCredential` doesn't work with [Azure Account extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account) versions newer than `0.9.11`. A long-term fix to this problem is in progress. In the meantime, consider [authenticating via the Azure CLI](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/identity/azure-identity/README.md#authenticating-via-development-tools).\n\nWhen you use `VisualStudioCodeCredential`, you can optionally try/catch for `CredentialUnavailableException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                                                                                    | Description                                                                                                                 | Mitigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n|--------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `Failed To Read VS Code Credentials</p></p>OR</p>Authenticate via Azure Tools plugin in VS Code` | No Azure account information was found in the VS Code configuration.                                                        | - Ensure that you've properly installed the [Azure Account plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account). <br>- Use **View > Command Palette** to execute the **Azure: Sign In** command. This command opens a browser window and displays a page that allows you to sign in to Azure. <br>- If you already have the Azure Account extension installed and have signed in to your account, try logging out and logging in again. This action repopulates the cache and potentially mitigates the error you're getting. |\n| `MSAL Interaction Required Exception`                                                            | `VisualStudioCodeCredential` was able to read the cached credentials from the cache but the cached token is likely expired. | Sign in to the Azure Account extension via **View > Command Palette** to execute the **Azure: Sign In** command in the VS Code IDE.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n| `ADFS tenant not supported`                                                                      | Visual Studio Azure Service Authentication doesn't currently support ADFS tenants.                                          | Use credentials from a supported cloud when authenticating with Visual Studio. For more information about the supported clouds, see [National clouds](/azure/active-directory/develop/authentication-national-cloud).                                                                                                                                                                                                                                                                                                                                         |\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-authentication-multi-tenant.md",
    "content": "---\ntitle: Troubleshoot multi-tenant authentication\ntitleSuffix: Azure SDK for Java\ndescription: Provides an overview of how to troubleshoot multi-tenant authentication issues.\nms.date: 04/02/2025\nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Troubleshoot multi-tenant authentication\n\nThis article provides guidance on dealing with issues encountered in a multi-tenant context.\n\nWhen you use credentials in a multi-tenant context, you can optionally try/catch for `ClientAuthenticationException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error message                                                                       | Description                                                                                        | Mitigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n|-------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `The current credential is not configured to acquire tokens for tenant <tenant-ID>` | The application must configure the credential to allow acquiring tokens from the requested tenant. | Add the requested tenant ID to `additionallyAllowedTenants` on the credential builder, or add \\\"*\\\" to `additionallyAllowedTenants` to allow acquiring tokens for any tenant. <br><br>This exception was added as part of a breaking change to multi-tenant authentication in version `1.6.0`. Users experiencing this error after upgrading can find information about the change and migration in [BREAKING_CHANGES.md](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/identity/azure-identity/BREAKING_CHANGES.md) |\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-authentication-overview.md",
    "content": "---\ntitle: Troubleshoot Azure Identity authentication issues\ntitleSuffix: Azure SDK for Java\ndescription: Provides an overview of how to troubleshoot authentication issues related to using the Azure SDK for Java.\nms.date: 04/02/2025 \nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Troubleshoot Azure Identity authentication issues\n\nThis article covers failure investigation techniques, common errors for the credential types in the Azure Identity Java client library, and mitigation steps to resolve these errors. Because there are many credential types available in the Azure SDK for Java, we've split the troubleshooting guide into sections based on usage scenario. The following sections are available:\n\n* [Troubleshoot Azure-hosted application authentication](troubleshooting-authentication-azure-hosted.md)\n* [Troubleshoot development environment authentication](troubleshooting-authentication-dev-env.md)\n* [Troubleshoot service principal authentication](troubleshooting-authentication-service-principal.md)\n* [Troubleshoot multi-tenant authentication](troubleshooting-authentication-multi-tenant.md)\n\nThe remainder of this article covers general troubleshooting techniques and guidance that apply to all credential types.\n\n## Handle Azure Identity exceptions\n\nAs noted in the [Exception handling in the Azure SDK for Java](troubleshooting-overview.md#exception-handling-in-the-azure-sdk-for-java) section of [Troubleshooting overview](troubleshooting-overview.md), there's a comprehensive set of exceptions and error codes that the Azure SDK for Java can throw. For Azure Identity specifically, there are a few key exception types that are important to understand.\n\n### ClientAuthenticationException\n\nAny service client method that makes a request to the service can raise exceptions arising from authentication errors. These exceptions are possible because the token is requested from the credential on the first call to the service and on any subsequent requests to the service that need to refresh the token.\n\nTo distinguish these failures from failures in the service client, Azure Identity classes raise `ClientAuthenticationException` with details describing the source of the error in the exception message and possibly the error message. Depending on the application, these errors may or may not be recoverable. The following code shows an example of catching `ClientAuthenticationException`:\n\n```java\n// Create a secret client using the DefaultAzureCredential\nSecretClient client = new SecretClientBuilder()\n    .vaultUrl(\"https://myvault.vault.azure.net/\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n\ntry {\n    KeyVaultSecret secret = client.getSecret(\"secret1\");\n} catch (ClientAuthenticationException e) {\n    //Handle Exception\n    e.printStackTrace();\n}\n```\n\n### CredentialUnavailableException\n\n`CredentialUnavailableException` is a special exception type derived from `ClientAuthenticationException`. This exception type is used to indicate that the credential can't authenticate in the current environment due to lack of required configuration or setup. This exception is also used as a signal to chained credential types, such as `DefaultAzureCredential` and `ChainedTokenCredential`, that the chained credential should continue to try other credential types later in the chain.\n\n### Permission issues\n\nCalls to service clients resulting in `HttpResponseException` with a `StatusCode` of 401 or 403 often indicate the caller doesn't have sufficient permissions for the specified API. Check the service documentation to determine which roles are needed for the specific request. Ensure that the authenticated user or service principal has been granted the appropriate roles on the resource.\n\n## Find relevant information in exception messages\n\n`ClientAuthenticationException` is thrown when unexpected errors occur while a credential is authenticating. These errors can include errors received from requests to the Microsoft Entra security token service (STS) and often contain information helpful to diagnosis. Consider the following `ClientAuthenticationException` message:\n\n```output\nClientSecretCredential authentication failed: A configuration issue is preventing authentication - check the error message from the server for details. You can modify the configuration in the application registration portal. See https://aka.ms/msal-net-invalid-client for details.\n\nOriginal exception:\nAADSTS7000215: Invalid client secret provided. Ensure the secret being sent in the request is the client secret value, not the client secret ID, for a secret added to app 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'.\nTrace ID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\nCorrelation ID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\nTimestamp: 2022-01-01 00:00:00Z\n```\n\nThis error message contains the following information:\n\n* **Failing credential type**: The type of credential that failed to authenticate - in this case, `ClientSecretCredential`. This information is helpful when diagnosing issues with chained credential types, such as `DefaultAzureCredential` or `ChainedTokenCredential`.\n\n* **STS error code and message**: The error code and message returned from the Microsoft Entra STS - in this case, `AADSTS7000215: Invalid client secret provided.` This information can give insight into the specific reason the request failed. For instance, in this specific case, because the provided client secret is incorrect. For more information on STS error codes, see the [AADSTS error codes](/azure/active-directory/develop/reference-aadsts-error-codes#aadsts-error-codes) section of [Microsoft Entra authentication and authorization error codes](/azure/active-directory/develop/reference-aadsts-error-codes).\n\n* **Correlation ID and timestamp**: The correlation ID and call timestamp used to identify the request in server-side logs. This information is useful to support engineers when diagnosing unexpected STS failures.\n\n## Enable and configure logging\n\nAzure SDK for Java offers a consistent logging story to help in troubleshooting application errors and to help expedite their resolution. The logs produced capture the flow of an application before reaching the terminal state to help locate the root issue. For guidance on logging, see [Configure logging in the Azure SDK for Java](logging-overview.md) and [Troubleshooting over view](troubleshooting-overview.md).\n\nThe underlying MSAL library, [MSAL4J](https://github.com/AzureAD/microsoft-authentication-library-for-java), also has detailed logging. This logging is highly verbose and includes all personal data including tokens. This logging is most useful when working with product support. As of v1.10.0, credentials that offer this logging have a method called `enableUnsafeSupportLogging()`.\n\n> [!CAUTION]\n> Requests and responses in the Azure Identity library contain sensitive information. You must take precautions to protect logs when customizing the output to avoid compromising account security.\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-authentication-service-principal.md",
    "content": "---\ntitle: Troubleshoot service principal authentication\ntitleSuffix: Azure SDK for Java\ndescription: Provides an overview of how to troubleshoot service principal authentication issues.\nms.date: 04/02/2025\nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Troubleshoot service principal authentication\n\nThis article provides guidance on dealing with issues encountered when authenticating Azure SDK for Java applications via service principal, through various `TokenCredential` implementations. For more information, see [Azure authentication with service principal](authentication/service-principal.md).\n\n## Troubleshoot ClientSecretCredential\n\nWhen you use `ClientSecretCredential`, you can optionally try/catch for `ClientAuthenticationException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error code      | Issue                                                           | Mitigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n|-----------------|-----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `AADSTS7000215` | An invalid client secret was provided.                          | Ensure that the `clientSecret` provided when constructing the credential is valid. If unsure, create a new client secret using the Azure portal. For more information, see the [Create a new application secret](/azure/active-directory/develop/howto-create-service-principal-portal#option-3-create-a-new-application-secret) section of [Create a Microsoft Entra application and service principal that can access resources](/azure/active-directory/develop/howto-create-service-principal-portal). |\n| `AADSTS7000222` | An expired client secret was provided.                          | Create a new client secret using the Azure portal. For more information, see the [Create a new application secret](/azure/active-directory/develop/howto-create-service-principal-portal#option-3-create-a-new-application-secret) section of [Create a Microsoft Entra application and service principal that can access resources](/azure/active-directory/develop/howto-create-service-principal-portal).                                                                                               |\n| `AADSTS700016`  | The specified application wasn't found in the specified tenant. | Ensure the specified `clientId` and `tenantId` are correct for your application registration. For multi-tenant apps, ensure that a tenant admin has added the application to the desired tenant. For more information, see [Create a Microsoft Entra application and service principal that can access resources](/azure/active-directory/develop/howto-create-service-principal-portal).                                                                                                                  |\n\n## Troubleshoot ClientCertificateCredential\n\nWhen you use `ClientCertificateCredential`, you can optionally try/catch for `ClientAuthenticationException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error code     | Description                                                     | Mitigation                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n|----------------|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `AADSTS700027` | Client assertion contains an invalid signature.                 | Ensure that you've uploaded the specified certificate to the Microsoft Entra application registration. For more information, see the [Upload a trusted certificate issued by a certificate authority](/azure/active-directory/develop/howto-create-service-principal-portal#option-1-recommended-upload-a-trusted-certificate-issued-by-a-certificate-authority) section of [Create a Microsoft Entra application and service principal that can access resources](/azure/active-directory/develop/howto-create-service-principal-portal). |\n| `AADSTS700016` | The specified application wasn't found in the specified tenant. | Ensure that the specified `clientId` and `tenantId` are correct for your application registration. For multi-tenant apps, ensure that a tenant admin has added the application to the desired tenant. For more information, see [Create a Microsoft Entra application and service principal that can access resources](/azure/active-directory/develop/howto-create-service-principal-portal).                                                                                                                                                |\n\n## Troubleshoot ClientAssertionCredential\n\nWhen you use `ClientAssertionCredential`, you can optionally try/catch for `ClientAuthenticationException`. The following table shows the errors that this exception indicates, and methods of mitigation:\n\n| Error code     | Description                                                                          | Mitigation                                                                                                                                                                                                                                                                                                                                                                   |\n|----------------|--------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `AADSTS700021` | The client assertion application identifier doesn't match the `client_id` parameter. | Ensure that the JWT assertion created has the correct values specified for the `sub` and `issuer` value of the payload. Both of these fields should be equal to `clientId`. For the client assertion format, see [Microsoft identity platform application authentication certificate credentials](/azure/active-directory/develop/active-directory-certificate-credentials). |\n| `AADSTS700023` | The client assertion audience claim doesn't match the Realm issuer.                  | Ensure that the audience `aud` field in the JWT assertion created has the correct value for the audience specified in the payload. Set this field to `https://login.microsoftonline.com/{tenantId}/v2`.                                                                                                                                                                      |\n| `AADSTS50027`  | JWT token is invalid or malformed.                                                   | Ensure that the JWT assertion token is in the valid format. For more information, see [Microsoft identity platform application authentication certificate credentials](/azure/active-directory/develop/active-directory-certificate-credentials).                                                                                                                            |\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-dependency-version-conflict.md",
    "content": "---\ntitle: Troubleshoot dependency version conflicts when you use the Azure SDK for Java\ndescription: Provides an overview of how to troubleshoot dependency version conflicts related to using the Azure SDK for Java.\nms.date: 04/02/2025 \nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: limolkova\n---\n\n# Troubleshoot dependency version conflicts\n\nThis article describes dependency version conflicts and how to troubleshoot them.\n\nAzure client libraries for Java depend on popular third-party libraries such as the following ones:\n\n- [Jackson](https://github.com/FasterXML/jackson)\n- [Netty](https://netty.io/)\n- [Reactor](https://projectreactor.io/)\n- [SLF4J](http://www.slf4j.org/)\n\nMany Java applications and frameworks use these libraries directly or transitively, which leads to [version conflicts](https://en.wikipedia.org/wiki/Dependency_hell). Dependency managers such as [Maven](https://maven.apache.org) and [Gradle](https://docs.gradle.org) resolve all dependencies so that there's only a single version of each dependency on the classpath. However, it's not guaranteed that the resolved dependency version is compatible with all consumers of that dependency in your application. For more information, see [Introduction to the Dependency Mechanism](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html) in the Maven documentation and [Understanding dependency resolution](https://docs.gradle.org/current/userguide/dependency_resolution.html) in the Gradle documentation.\n\nThe API incompatibility of direct dependencies results in compilation errors. [Diamond dependency](https://en.wikipedia.org/wiki/Dependency_hell#Problems) incompatibility usually results in runtime failures such as [NoClassDefFoundError](https://docs.oracle.com/javase/8/docs/api/java/lang/NoClassDefFoundError.html), [NoSuchMethodError](https://docs.oracle.com/javase/8/docs/api/java/lang/NoSuchMethodError.html), or other [LinkageError](https://docs.oracle.com/javase/8/docs/api/java/lang/LinkageError.html). Not all libraries strictly follow [semantic versioning](https://semver.org/), and breaking changes sometimes happen within the same major version.\n\n## Diagnose version mismatch issues\n\nThe following sections describe methods on how to diagnose version mismatch issues.\n\n### Use the Azure SDK for Java build tool\n\nThe Azure SDK for Java build tool, introduced in [Get started with Azure SDK and Apache Maven](get-started-maven.md), helps to identify commonly encountered issues. We recommend that you add this build tool to your project and run it by adding the `azure:run` Maven target to your regular build process. With the appropriate configuration, you can identify and resolve dependency conflicts more proactively, before they become issues at runtime.\n\n### View a dependency tree\n\nRun `mvn dependency:tree` or `gradle dependencies --scan` to show the full dependency tree for your application, with version numbers. `mvn dependency:tree -Dverbose` gives more information, but may be misleading. For more information, see [Apache Maven Dependency Tree](https://maven.apache.org/shared/maven-dependency-tree/) in the Maven documentation. For each library that you suspect has a version conflict, note its version number and determine which components depend on it.\n\nDependency resolution in development and production environments may work differently. [Apache Spark](https://spark.apache.org/docs/latest/), [Apache Flink](https://nightlies.apache.org/flink/flink-docs-release-1.13/), [Databricks](https://databricks.com/), and IDE plugins need extra configuration for custom dependencies. They can also bring their own versions of Azure Client libraries or common components. For more information, see the following articles:\n\n- [Bundling Your Application’s Dependencies](https://spark.apache.org/docs/latest/submitting-applications.html#bundling-your-applications-dependencies) for Apache Spark\n- [Project Configuration](https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/datastream/project-configuration/) for Apache Flink\n- [How to correctly update a Maven library in Databricks](https://kb.databricks.com/libraries/maven-library-version-mgmt.html) for Databricks\n\nFor more information on conflict resolution in such environments, see the [Create a fat JAR](#create-a-fat-jar) section later in this article.\n\n### Configure Azure Functions\n\nThe internal dependency version on Azure Functions (running Java 8 only) takes precedence over a user-provided one. This dependency causes version conflicts, especially with Jackson, Netty, and Reactor.\n\nTo solve this problem, set the `FUNCTIONS_WORKER_JAVA_LOAD_APP_LIBS` environment variable to `true` or `1`. Be sure to update the Azure Function Tools (v2 or v3) to the latest version.\n\n> [!NOTE]\n> This configuration applies to Azure Functions running Java 8 only, Functions running Java 11 don't need special configuration.\n\n### Configure Apache Spark\n\nThe Azure SDK for Java supports multiple versions of Jackson, but issues can sometimes arise depending on your build tooling and its dependency resolution ordering. A good example of this problem is with Apache Spark, version 3.0.0 and later, which depends on Jackson 2.10. While it's compatible with the Azure SDK for Java, developers often discover that a more recent version of Jackson is used instead, which results in incompatibilities. To mitigate this problem, you should pin a specific version of Jackson (one that is compatible with Spark). For more information, see the [Support for multiple Jackson versions](#support-for-multiple-jackson-versions) section in this article.\n\nIf you use earlier versions of Spark, or if another library you use requires an even earlier version of Jackson that the Azure SDK for Java doesn't support, continue reading this article for possible mitigation steps.\n\n### Detect Jackson runtime version\n\nIn Azure Core 1.21.0, we added runtime detection and better diagnostics of the Jackson runtime version.\n\nIf you see `LinkageError` (or any of its subclasses) related to the Jackson API, check the message of the exception for runtime version information. For example: `com.azure.core.implementation.jackson.JacksonVersionMismatchError: com/fasterxml/jackson/databind/cfg/MapperBuilder Package versions: jackson-annotations=2.9.0, jackson-core=2.9.0, jackson-databind=2.9.0, jackson-dataformat-xml=2.9.0, jackson-datatype-jsr310=2.9.0, azure-core=1.19.0-beta.2`\n\nLook for warning and error logs from `JacksonVersion`. For more information, see [Configure logging in the Azure SDK for Java](./logging-overview.md). For example: `[main] ERROR com.azure.core.implementation.jackson.JacksonVersion - Version '2.9.0' of package 'jackson-core' is not supported (too old), please upgrade.`\n\n> [!NOTE]\n> Check that all of the Jackson packages have the same version.\n\nFor the list of packages used by Azure SDK and the supported Jackson versions, see the [Support for multiple Jackson versions](#support-for-multiple-jackson-versions) section.\n\n## Mitigate version mismatch issues\n\nThe following sections describe how to mitigate version mismatch issues.\n\n### Use Azure SDK BOM\n\nUse the latest stable [Azure SDK BOM](https://central.sonatype.com/artifact/com.azure/azure-sdk-bom) and don't specify Azure SDK and dependency versions in your POM file. When applicable, use the [Azure Spring Boot BOM](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-bom/).\n\nThe dependencies listed in the Azure SDK BOM are tested rigorously to avoid dependency conflicts.\n\n### Avoid unnecessary dependencies\n\nRemove dependencies if you can. Sometimes, an application has dependencies on multiple libraries that provide essentially the same functionality. Such unnecessary dependencies expose applications to security vulnerabilities, version conflicts, and support and maintenance costs.\n\n### Update dependency versions\n\nIf switching to the latest Azure SDK BOM doesn't help, identify the libraries causing conflicts and the components that use them. (For more information, see the [View a dependency tree](#view-a-dependency-tree) section earlier in this article.) Try updating to a newer version, which protects against security vulnerabilities, and often brings new features, performance improvements, and bug fixes.\n\nAvoid downgrading the Azure SDK version because it may expose your application to known vulnerabilities and issues.\n\n### Shade libraries\n\nSometimes there's no combination of libraries that work together, and shading comes as the last resort.\n\n> [!NOTE]\n> Shading has significant drawbacks: it increases package size and number of classes on the classpath, it makes code navigation and debugging hard, doesn't relocate JNI code, breaks reflection, and may violate code licenses among other things. It should be used only after other options are exhausted.\n\nShading enables you to include dependencies within a JAR at build time, then rename packages and update application code to use the code in the shaded location. Diamond dependency conflict is no longer an issue because there are two different copies of a dependency. You may shade a library that has a conflicting transitive dependency or a direct application dependency, as described in the following list:\n\n- **Transitive dependency conflict**: For example, third-party library `A` requires Jackson 2.9, which Azure SDKs don't support, and it's not possible to update `A`. Create a new module, which includes `A` and shades (relocates) Jackson 2.9 and, optionally, other dependencies of `A`.\n- **Application dependency conflict**: Your application uses Jackson 2.9 directly. While you're working on updating your code, you can shade and relocate Jackson 2.9 into a new module with relocated Jackson classes instead.\n\n> [!NOTE]\n> Creating fat JAR with relocated Jackson classes doesn't resolve a version conflict in these examples - it only forces a single shaded version of Jackson.\n\n### Create a fat JAR\n\nEnvironments like Databricks or Apache Spark have custom dependency management and provide common libraries like Jackson. To avoid conflict with provided libraries, you may want to build a fat JAR that contains all the dependencies. For more information, see [Apache Maven Shade Plugin](https://maven.apache.org/plugins/maven-shade-plugin). In many cases, relocating Jackson classes (`com.fasterxml.jackson`) mitigates the issue. Sometimes such environments also bring their own version of Azure SDKs, so you might be compelled to relocate `com.azure` namespace to work around version conflicts.\n\n## Understand compatible dependency versions\n\nFor information about `azure-core`-specific dependencies and their versions, see [azure-core](https://central.sonatype.com/artifact/com.azure/azure-core/) at the Maven Central Repository. The following table shows some general considerations:\n\n| Dependency                      | Supported versions                                                                                                                                                                                                                                                      |\n|---------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Jackson                         | 2.10.0 and newer minor versions are compatible. For more information, see the [Support for multiple Jackson versions](#support-for-multiple-jackson-versions) section.                                                                                                  |\n| SLF4J                           | 1.7.*                                                                                                                                                                                                                                                                   |\n| netty-tcnative-boringssl-static | 2.0.*                                                                                                                                                                                                                                                                   |\n| netty-common                    | 4.1.*                                                                                                                                                                                                                                                                   |\n| reactor-core                    | 3.X.* - Major and minor version numbers must exactly match the ones your `azure-core` version depends on. For more information, see the Project Reactor [policy on deprecations](https://github.com/reactor/.github/blob/main/SUPPORT.adoc#our-policy-on-deprecations). |\n\n### Support for multiple Jackson versions\n\nThe Azure SDK for Java supports working with a range of Jackson versions. The lowest-supported version is Jackson 2.10.0. The Azure SDK for Java client libraries adjust their configuration and Jackson usage depending on the version that is detected at runtime. This adjustment enables greater compatibility with older versions of the Spring framework, Apache Spark, and other common environments.\nApplications can downgrade Jackson versions (to 2.10.0 or higher) without breaking Azure SDK for Java client libraries.\n\n> [!NOTE]\n> Using old versions of Jackson may expose applications to known vulnerabilities and issues. For more information, see the [list of known vulnerabilities for Jackson libraries](https://www.cvedetails.com/product-list/vendor_id-15866/Fasterxml.html).\n\nWhen pinning a specific version of Jackson, make sure to do it for all modules used by Azure SDK, which are shown in the following list:\n\n- `jackson-annotations`\n- `jackson-core`\n- `jackson-databind`\n- `jackson-dataformat-xml`\n- `jackson-datatype-jsr310`\n\n### Migration from Jackson to azure-json\n\nAzure client libraries for Java are in the process of migration to [azure-json](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/serialization/azure-json), which doesn't depend on any 3rd party components, and offers shared primitives, abstractions, and helpers for JSON.\n\nEnvironments like Apache Spark, Apache Flink, and Databricks might bring older versions of `azure-core` that don't yet depend on `azure-json`. As a result, when using newer versions of Azure libraries in such environments, you might get errors similar to `java.lang.NoClassDefFoundError: com/azure/json/JsonSerializable`. You can mitigate this error by adding an explicit dependency on `azure-json`.\n\n## Next steps\n\nNow that you're familiar with dependency version conflicts and how to troubleshoot them, see [Dependency Management for Java](https://devblogs.microsoft.com/azure-sdk/dependency-management-for-java/) for information on the best way to prevent them.\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-messaging-event-hubs-overview.md",
    "content": "---\ntitle: Troubleshoot Azure Event Hubs\ntitleSuffix: Azure SDK for Java\ndescription: Helps you troubleshoot Events Hubs issues when you use the Azure SDK for Java.\nms.date: 04/02/2025 \nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Troubleshoot Azure Event Hubs\n\nThis article covers failure investigation techniques, common errors for the credential types in the Event Hubs library, and mitigation steps to resolve these errors. In addition to the general troubleshooting techniques and guidance that apply regardless of the Event Hubs use case, the following articles cover specific features of the Event Hubs library:\n\n* [Troubleshoot Azure Event Hubs producer](troubleshooting-messaging-event-hubs-producer.md)\n* [Troubleshoot Azure Event Hubs event processor](troubleshooting-messaging-event-hubs-processor.md)\n* [Troubleshoot Azure Event Hubs performance](troubleshooting-messaging-event-hubs-performance.md)\n\nThe remainder of this article covers general troubleshooting techniques and guidance that apply to all users of the Event Hubs library.\n\n## Handle Event Hubs exceptions\n\nAll Event Hubs exceptions are wrapped in an [AmqpException](/java/api/com.azure.core.amqp.exception.amqpexception). These exceptions often have an underlying AMQP error code that specifies whether an error should be retried. For retryable errors (that is, `amqp:connection:forced` or `amqp:link:detach-forced`), the client libraries attempt to recover from these errors based on the retry options specified when instantiating the client. To configure retry options, follow the sample [publish events to specific partition](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/eventhubs/azure-messaging-eventhubs/src/samples/java/com/azure/messaging/eventhubs/PublishEventsToSpecificPartition.java). If the error is nonretryable, there's some configuration issue that needs to be resolved.\n\nThe recommended way to solve the specific exception the AMQP exception represents is to follow the [Event Hubs Messaging Exceptions](/azure/event-hubs/event-hubs-messaging-exceptions) guidance.\n\n### Find relevant information in exception messages\n\nAn [AmqpException](/java/api/com.azure.core.amqp.exception.amqpexception) contains the following three fields, which describe the error:\n\n* **getErrorCondition**: The underlying AMQP error. For a description of the errors, see the [AmqpErrorCondition Enum](/java/api/com.azure.core.amqp.exception.amqperrorcondition) documentation or the [OASIS AMQP 1.0 spec](https://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-types-v1.0-os.html).\n* **isTransient**: A value that indicates whether trying to perform the same operation is possible. SDK clients apply the retry policy when the error is transient.\n* **getErrorContext**: Contains the following information about where the AMQP error originated:\n  * [LinkErrorContext](/java/api/com.azure.core.amqp.exception.linkerrorcontext): Errors that occur in either the send or receive link.\n  * [SessionErrorContext](/java/api/com.azure.core.amqp.exception.sessionerrorcontext): Errors that occur in the session.\n  * [AmqpErrorContext](/java/api/com.azure.core.amqp.exception.amqperrorcontext): Errors that occur in the connection or a general AMQP error.\n\n### Commonly encountered exceptions\n\n#### amqp:connection:forced and amqp:link:detach-forced\n\nWhen the connection to Event Hubs is idle, the service disconnects the client after some time. This issue isn't a problem because the clients re-establish a connection when a service operation is requested. For more information, see [AMQP errors in Azure Service Bus](/azure/service-bus-messaging/service-bus-amqp-troubleshoot).\n\n## Permission issues\n\nAn `AmqpException` with an [AmqpErrorCondition](/java/api/com.azure.core.amqp.exception.amqperrorcondition) of `amqp:unauthorized-access` means that the provided credentials don't allow for performing the action (receiving or sending) with Event Hubs. To resolve this issue, try the following tasks:\n\n* Double check that you have the correct connection string. For more information, see [Get an Event Hubs connection string](/azure/event-hubs/event-hubs-get-connection-string).\n* Ensure that your shared access signature (SAS) token is generated correctly. For more information, see [Authorizing access to Event Hubs resources using Shared Access Signatures](/azure/event-hubs/authorize-access-shared-access-signature).\n\nFor other possible solutions, see [Troubleshoot authentication and authorization issues with Event Hubs](/azure/event-hubs/troubleshoot-authentication-authorization).\n\n## Connectivity issues\n\n### Timeout when connecting to service\n\nTo resolve timeout issues, try the following tasks:\n\n* Verify that the connection string or fully qualified domain name specified when creating the client is correct. For more information, see [Get an Event Hubs connection string](/azure/event-hubs/event-hubs-get-connection-string).\n* Check the firewall and port permissions in your hosting environment and verify that the AMQP ports 5671 and 5762 are open.\n  * Make sure that the endpoint is allowed through the firewall.\n* Try using WebSockets, which connects on port 443. For more information, see the [PublishEventsWithWebSocketsAndProxy.java][PublishEventsWithWebSocketsAndProxy] sample.\n* See if your network is blocking specific IP addresses. For more information, see [What IP addresses do I need to allow?](/azure/event-hubs/troubleshooting-guide#what-ip-addresses-do-i-need-to-allow)\n* If applicable, check the proxy configuration. For more information, see the [PublishEventsWithWebSocketsAndProxy.java][PublishEventsWithWebSocketsAndProxy] sample.\n* For more information about troubleshooting network connectivity, see [Troubleshoot connectivity issues - Azure Event Hubs](/azure/event-hubs/troubleshooting-guide).\n\n### TLS/SSL handshake failures\n\nThis error can occur when an intercepting proxy is used. To verify, we recommend testing in your hosting environment with the proxy disabled.\n\n### Socket exhaustion errors\n\nApplications should prefer treating the Event Hubs clients as a singleton, creating and using a single instance through the lifetime of their application. This recommendation is important because each client type manages its connection. When you create a new Event Hubs client, it results in a new AMQP connection, which uses a socket. Additionally, it's essential that clients inherit from `java.io.Closeable`, so your application is responsible for calling `close()` when it's finished using a client.\n\nTo use the same AMQP connection when creating multiple clients, you can use the `EventHubClientBuilder.shareConnection()` flag, hold a reference to that `EventHubClientBuilder`, and create new clients from that same builder instance.\n\n### Connect using an IoT connection string\n\nBecause translating a connection string requires querying the IoT Hub service, the Event Hubs client library can't use it directly. The [IoTConnectionString.java](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/eventhubs/azure-messaging-eventhubs/src/samples/java/com/azure/messaging/eventhubs/IoTHubConnectionSample.java) sample describes how to query IoT Hub to translate an IoT connection string into one that can be used with Event Hubs.\n\nFor more information, see the following articles:\n\n* [Control access to IoT Hub using Shared Access Signatures](/azure/iot-hub/iot-hub-dev-guide-sas)\n* [Read device-to-cloud messages from the built-in endpoint](/azure/iot-hub/iot-hub-devguide-messages-read-builtin)\n\n### Can't add components to the connection string\n\nThe legacy Event Hubs clients allowed customers to add components to the connection string retrieved from the Azure portal. The legacy clients are in packages [com.microsoft.azure:azure-eventhubs](https://central.sonatype.com/artifact/com.microsoft.azure/azure-eventhubs/) and [com.microsoft.azure:azure-eventhubs-eph](https://central.sonatype.com/artifact/com.microsoft.azure/azure-eventhubs-eph). The current generation supports connection strings only in the form published by the Azure portal.\n\n#### Add \"TransportType=AmqpWebSockets\"\n\nTo use web sockets, see the [PublishEventsWithSocketsAndProxy.java][PublishEventsWithWebSocketsAndProxy] sample.\n\n#### Add \"Authentication=Managed Identity\"\n\nTo authenticate with Managed Identity, see the sample [PublishEventsWithAzureIdentity.java](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/eventhubs/azure-messaging-eventhubs/src/samples/java/com/azure/messaging/eventhubs/PublishEventsWithAzureIdentity.java).\n\nFor more information about the `Azure.Identity` library, check out our [Authentication and the Azure SDK](https://devblogs.microsoft.com/azure-sdk/authentication-and-the-azure-sdk) blog post.\n\n## Enable and configure logging\n\nAzure SDK for Java offers a consistent logging story to help in troubleshooting application errors and to help expedite their resolution. The logs produced capture the flow of an application before reaching the terminal state to help locate the root issue. For guidance on logging, see [Configure logging in the Azure SDK for Java](logging-overview.md) and [Troubleshooting overview](troubleshooting-overview.md).\n\nIn addition to enabling logging, setting the log level to `VERBOSE` or `DEBUG` provides insights into the library's state. The following sections show sample log4j2 and logback configurations to reduce the excessive messages when verbose logging is enabled.\n\n### Configure Log4J 2\n\nUse the following steps to configure Log4J 2:\n\n1. Add the dependencies in your **pom.xml** using the ones from the [logging sample pom.xml][LoggingPom], in the \"Dependencies required for Log4j2\" section.\n1. Add [log4j2.xml](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/eventhubs/azure-messaging-eventhubs/docs/log4j2.xml) to your **src/main/resources** folder.\n\n### Configure logback\n\nUse the following steps to configure logback:\n\n1. Add the dependencies in your **pom.xml** using the ones from the [logging sample pom.xml][LoggingPom], in the \"Dependencies required for logback\" section.\n1. Add [logback.xml](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/eventhubs/azure-messaging-eventhubs/docs/logback.xml) to your **src/main/resources** folder.\n\n### Enable AMQP transport logging\n\nIf enabling client logging isn't enough to diagnose your issues, you can enable logging to a file in the underlying AMQP library, [Qpid Proton-J](https://qpid.apache.org/proton/). Qpid Proton-J uses `java.util.logging`. You can enable logging by creating a configuration file with the contents shown in the next section. Or, set `proton.trace.level=ALL` and whichever configuration options you want for the `java.util.logging.Handler` implementation. For the implementation classes and their options, see [Package java.util.logging](https://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html) in the Java 8 SDK documentation.\n\nTo trace the AMQP transport frames, set the `PN_TRACE_FRM=1` environment variable.\n\n#### Sample \"logging.properties\" file\n\nThe following configuration file logs TRACE level output from Proton-J to the **proton-trace.log** file:\n\n```properties\nhandlers=java.util.logging.FileHandler\n.level=OFF\nproton.trace.level=ALL\njava.util.logging.FileHandler.level=ALL\njava.util.logging.FileHandler.pattern=proton-trace.log\njava.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter\njava.util.logging.SimpleFormatter.format=[%1$tF %1$tr] %3$s %4$s: %5$s %n\n```\n\n### Reduce logging\n\nOne way to decrease logging is to change the verbosity. Another way is to add filters that exclude logs from logger names packages like `com.azure.messaging.eventhubs` or `com.azure.core.amqp`. For examples, see the XML files in the [Configuring Log4J 2](#configure-log4j-2) and [Configure logback](#configure-logback) sections.\n\nWhen you submit a bug, the log messages from classes in the following packages are interesting:\n\n* `com.azure.core.amqp.implementation`\n* `com.azure.core.amqp.implementation.handler`\n  * The exception is that you can ignore the `onDelivery` message in `ReceiveLinkHandler`.\n* `com.azure.messaging.eventhubs.implementation`\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n\n<!-- LINKS -->\n[LoggingPom]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/eventhubs/azure-messaging-eventhubs/docs/pom.xml\n[PublishEventsWithWebSocketsAndProxy]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/eventhubs/azure-messaging-eventhubs/src/samples/java/com/azure/messaging/eventhubs/PublishEventsWithWebSocketsAndProxy.java\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-messaging-event-hubs-performance.md",
    "content": "---\ntitle: Troubleshoot Azure Event Hubs performance\ntitleSuffix: Azure SDK for Java\ndescription: Helps you troubleshoot Events Hubs performance issues when you use the Azure SDK for Java.\nms.date: 04/02/2025 \nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Troubleshoot Azure Event Hubs performance\n\nThis article provides solutions to common performance problems that you might encounter when you use the Event Hubs library in the Azure SDK for Java. If you're looking for solutions to other common problems that you might encounter when you use Event Hubs, see [Troubleshooting Azure Event Hubs](troubleshooting-messaging-event-hubs-overview.md).\n\n## Use processEvent or processEventBatch\n\nWhen you use the `processEvent` callback, each `EventData` instance received calls your code. This process works well with low or moderate traffic in the event hub.\n\nIf the event hub has high traffic and high throughput is expected, the aggregated cost of continuously calling your callback hinders performance of `EventProcessorClient`. In this case, you should use `processEventBatch`.\n\nFor each partition, your callback is invoked one at a time. High processing time in the callback hinders performance because the `EventProcessorClient` doesn't continue to push more events downstream nor request more `EventData` instances from the Event Hubs service.\n\n## Costs of checkpointing\n\nWhen you use Azure Blob Storage as the checkpoint store, there's a network cost to checkpointing because it makes an HTTP request and waits for a response. This process could take up to several seconds due to network latency, the performance of Azure Blob Storage, resource location, and so on.\n\nCheckpointing after every `EventData` instance is processed hinders performance due to the cost of making these HTTP requests. You shouldn't checkpoint if your callback processed no events, or you should checkpoint after processing some number of events.\n\n## Use LoadBalancingStrategy.BALANCED or LoadBalancingStrategy.GREEDY\n\nWhen you use `LoadBalancingStrategy.BALANCED`, the `EventProcessorClient` claims one partition for every load balancing cycle. If there are 32 partitions in an event hub, it takes 32 load-balancing iterations to claim all the partitions. If users know a set number of `EventProcessorClient` instances are running, they can use `LoadBalancingStrategy.GREEDY` to claim their share of the partitions in one load-balancing cycle.\n\nFor more information about each strategy, see [LoadBalancingStrategy.java](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/LoadBalancingStrategy.java) in the [azure-sdk-for-java repository](https://github.com/Azure/azure-sdk-for-java).\n\n## Configure prefetchCount\n\nThe default prefetch value is 500. When the AMQP receive link is opened, it places 500 credits on the link. Assuming that each `EventData` instance is one link credit, `EventProcessorClient` prefetches 500 `EventData` instances. When all the events are consumed, the processor client adds 500 credits to the link to receive more messages. This flow repeats while the `EventProcessorClient` still has ownership of a partition.\n\nConfiguring `prefetchCount` may have performance implications if the number is too low. Each time the AMQP receive link places credits, the remote service sends an ACK. For high throughput scenarios, the overhead of making thousands of client requests and service ACKs may hinder performance.\n\nConfiguring `prefetchCount` may have performance implications if the number is too high. When *x* credits are placed on the line, the Event Hubs service knows that it can send at most *x* messages. When each `EventData` instance is received, it's placed in an in-memory queue, waiting to be processed. A high number of `EventData` instances in the queue can result in very high memory usage.\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-messaging-event-hubs-processor.md",
    "content": "---\ntitle: Troubleshoot Azure Event Hubs event processor\ntitleSuffix: Azure SDK for Java\ndescription: Helps you troubleshoot Event Hubs EventProcessor issues when you use the Azure SDK for Java.\nms.date: 04/02/2025 \nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Troubleshoot Azure Event Hubs event processor\n\nThis article provides solutions to common problems that you might encounter when you use the `EventProcessorClient` type. If you're looking for solutions to other common problems that you might encounter when you use Azure Event Hubs, see [Troubleshoot Azure Event Hubs](troubleshooting-messaging-event-hubs-overview.md).\n\n## 412 precondition failures when you use an event processor\n\n412 precondition errors occur when the client tries to take or renew ownership of a partition, but the local version of the ownership record is outdated. This problem occurs when another processor instance steals partition ownership. For more information, see the next section.\n\n## Partition ownership changes frequently\n\nWhen the number of `EventProcessorClient` instances changes (that is, are added or removed), the running instances try to load-balance partitions between themselves. For a few minutes after the number of processors changes, partitions are expected to change owners. After it's balanced, partition ownership should be stable and change infrequently. If partition ownership is changing frequently when the number of processors is constant, it likely indicates a problem. We recommended that you file a GitHub issue with logs and a repro.\n\nPartition ownership is determined via the ownership records in the `CheckpointStore`. On every load balancing interval, the `EventProcessorClient` will perform the following tasks:\n\n1. Fetch the latest ownership records.\n1. Check the records to see which records haven't updated their timestamp within the partition ownership expiration interval. Only records matching this criteria are considered.\n1. If there are any unowned partitions and the load is not balanced between instances of `EventProcessorClient`, the event processor client will try to claim a partition.\n1. Update the ownership record for the partitions it owns that have an active link to that partition.\n\nYou can configure the load balancing and ownership expiration intervals when you create the `EventProcessorClient` via the `EventProcessorClientBuilder`, as described in the following list:\n\n- The [loadBalancingUpdateInterval(Duration)](/java/api/com.azure.messaging.eventhubs.eventprocessorclientbuilder#com-azure-messaging-eventhubs-eventprocessorclientbuilder-loadbalancingupdateinterval(java-time-duration)) method indicates how often the load balancing cycle runs.\n- The [partitionOwnershipExpirationInterval(Duration)](/java/api/com.azure.messaging.eventhubs.eventprocessorclientbuilder#com-azure-messaging-eventhubs-eventprocessorclientbuilder-partitionownershipexpirationinterval(java-time-duration)) method indicates the minimum amount of time since the ownership record has been updated, before the processor considers a partition unowned.\n\nFor example, if an ownership record was updated at 9:30am and `partitionOwnershipExpirationInterval` is 2 mins. When a load balance cycle occurs and it notices that the ownership record has not been updated in the last 2 min or by 9:32am, it will consider the partition unowned.\n\nIf an error occurs in one of the partition consumers, it will close the corresponding consumer but will not try to reclaim it until the next load balancing cycle.\n\n## \"...current receiver '&lt;RECEIVER_NAME&gt;' with epoch '0' is getting disconnected\"\n\nThe entire error message looks similar to the following output:\n\n```output\nNew receiver 'nil' with higher epoch of '0' is created hence current receiver 'nil' with epoch '0'\nis getting disconnected. If you are recreating the receiver, make sure a higher epoch is used.\nTrackingId:&lt;GUID&gt;, SystemTracker:&lt;NAMESPACE&gt;:eventhub:&lt;EVENT_HUB_NAME&gt;|&lt;CONSUMER_GROUP&gt;,\nTimestamp:2022-01-01T12:00:00}\"}\n```\n\nThis error is expected when load balancing occurs after `EventProcessorClient` instances are added or removed. Load balancing is an ongoing process. When you use the `BlobCheckpointStore` with your consumer, every ~30 seconds (by default), the consumer checks to see which consumers have a claim for each partition, then runs some logic to determine whether it needs to 'steal' a partition from another consumer. The service mechanism used to assert exclusive ownership over a partition is known as the [Epoch](/azure/event-hubs/event-hubs-event-processor-host#epoch).\n\nHowever, if no instances are being added or removed, there's an underlying issue that should be addressed. For more information, see the [Partition ownership changes frequently](#partition-ownership-changes-frequently) section and [Filing GitHub issues](https://github.com/Azure/azure-sdk-for-java/issues/new/choose).\n\n## High CPU usage\n\nHigh CPU usage is usually because an instance owns too many partitions. We recommend no more than three partitions for every CPU core. It's better to start with 1.5 partitions for each CPU core and then test by increasing the number of partitions owned.\n\n## Out of memory and choosing the heap size\n\nThe out of memory (OOM) problem can happen if the current max heap for the JVM is insufficient to run the application. You may want to measure the application's heap requirement. Then, based on the result, size the heap by setting the appropriate max heap memory using the `-Xmx` JVM option.\n\nYou shouldn't specify `-Xmx` as a value larger than the memory available or limit set for the host (the VM or container) - for example, the memory requested in the container's configuration. You should allocate enough memory for the host to support the Java heap.\n\nThe following steps describe a typical way to measure the value for max Java Heap:\n\n1. Run the application in an environment close to production, where the application sends, receives, and processes events under the peak load expected in production.\n\n1. Wait for the application to reach a steady state. At this stage, the application and JVM would have loaded all domain objects, class types, static instances, object pools (TCP, DB connection pools), etc.\n\n   Under the steady state, you see the stable sawtooth-shaped pattern for the heap collection, as shown in the following screenshot:\n\n   :::image type=\"content\" source=\"media/troubleshooting-messaging-event-hubs-processor/healthy-heap-pattern.png\" alt-text=\"Screenshot of the heap memory collection showing the stable sawtooth pattern.\" lightbox=\"media/troubleshooting-messaging-event-hubs-processor/healthy-heap-pattern.png\":::\n\n1. After the application reaches the steady state, force a full garbage collection (GC) using tools like JConsole. Observe the memory occupied after the full GC. You want to size the heap such that only 30% is occupied after the full GC. You can use this value to set the max heap size (using `-Xmx`).\n\nIf you're on the container, then size the container to have an extra ~1 GB of memory for the non-heap need for the JVM instance.\n\n## Processor client stops receiving\n\nThe processor client often continually runs in a host application for days on end. Sometimes, it notices that `EventProcessorClient` isn't processing one or more partitions. Usually, there isn't enough information to determine why the exception occurred. The `EventProcessorClient` stopping is the symptom of an underlying cause (that is, the race condition) that occurred while trying to recover from a transient error. For the information we require, see [Filing GitHub issues](https://github.com/Azure/azure-sdk-for-java/issues/new/choose).\n\n## Duplicate EventData received when processor is restarted\n\nThe `EventProcessorClient` and Event Hubs service guarantees an *at-least-once* delivery. You can add metadata to discern duplicate events. For more information, see [Does Azure Event Hubs guarantee an at-least once delivery?](https://stackoverflow.com/questions/33220685/does-azure-event-hub-guarantees-at-least-once-delivery/33577018#33577018) on Stack Overflow. If you require *only-once* delivery, you should consider Service Bus, which waits for an acknowledgment from the client. For a comparison of the messaging services, see [Choosing between Azure messaging services](/azure/event-grid/compare-messaging-services).\n\n## Low-level consumer client stops receiving\n\n`EventHubConsumerAsyncClient` is a low-level consumer client provided by the Event Hubs library, designed for advanced users who require greater control and flexibility over their Reactive applications. This client offers a low-level interface, enabling users to manage backpressure, threading, and recovery within the Reactor chain. Unlike `EventProcessorClient`, `EventHubConsumerAsyncClient` doesn't include automatic recovery mechanisms for all terminal causes. Therefore, users must handle terminal events and select appropriate Reactor operators to implement recovery strategies.\n\nThe `EventHubConsumerAsyncClient::receiveFromPartition` method emits a terminal error when the connection encounters a non-retriable error or when a series of connection recovery attempts fail consecutively, exhausting the maximum retry limit. Although the low-level receiver attempts to recover from transient errors, users of the consumer client are expected to handle terminal events. If continuous event reception is desired, the application should adjust the Reactor chain to create a new consumer client on a terminal event.\n\n## Migrate from legacy to new client library\n\nThe [migration guide](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/eventhubs/azure-messaging-eventhubs/migration-guide.md) includes steps on migrating from the legacy client and migrating legacy checkpoints.\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-messaging-event-hubs-producer.md",
    "content": "---\ntitle: Troubleshoot Azure Event Hubs producer\ntitleSuffix: Azure SDK for Java\ndescription: Helps you troubleshoot Events Hubs producer issues when you use the Azure SDK for Java.\nms.date: 04/02/2025 \nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Troubleshoot Azure Event Hubs producer\n\nThis article provides solutions to common problems that you might encounter when you use the `EventHubsProducerClient` and `EventHubsProducerAsyncClient` types. If you're looking for solutions to other common problems that you might encounter when you use Event Hubs, see [Troubleshoot Azure Event Hubs](troubleshooting-messaging-event-hubs-overview.md).\n\n## Can't set multiple partition keys for events in EventDataBatch\n\nWhen the Event Hubs service publishes messages, it supports a single partition key for each `EventDataBatch`. You should consider using the buffered producer client `EventHubBufferedProducerClient` if you want that capability. Otherwise, you have to manage your batches.\n\n## Setting partition key on EventData isn't set in Kafka consumer\n\nThe partition key of the Event Hubs event is available in the Kafka record headers. The protocol-specific key is `x-opt-partition-key` in the header.\n\nBy design, Event Hubs doesn't promote the Kafka message key to be the Event Hubs partition key nor the reverse because with the same value, the Kafka client and the Event Hubs client likely send the message to two different partitions. It might cause some confusion if we set the value in the cross-protocol communication case. Exposing the properties with a protocol specific key to the other protocol client should be good enough.\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-messaging-service-bus-overview.md",
    "content": "---\ntitle: Troubleshoot Azure Service Bus\ntitleSuffix: Azure SDK for Java\ndescription: Helps you troubleshoot Service Bus issues when you use the Azure SDK for Java.\nms.date: 02/23/2024\nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Troubleshoot Azure Service Bus\n\nThis article covers failure investigation techniques, concurrency, common errors for the credential types in the Azure Service Bus Java client library, and mitigation steps to resolve these errors.\n\n## Enable and configure logging\n\nAzure SDK for Java offers a consistent logging story to help in troubleshooting application errors and to help expedite their resolution. The logs produced capture the flow of an application before reaching the terminal state to help locate the root issue. For guidance on logging, see [Configure logging in the Azure SDK for Java](logging-overview.md) and [Troubleshooting overview](troubleshooting-overview.md).\n\nIn addition to enabling logging, setting the log level to `VERBOSE` or `DEBUG` provides insights into the library's state. The following sections show sample log4j2 and logback configurations to reduce the excessive messages when verbose logging is enabled.\n\n### Configure Log4J 2\n\nUse the following steps to configure Log4J 2:\n\n1. Add the dependencies in your **pom.xml** using ones from the [logging sample pom.xml][LoggingPom], in the \"Dependencies required for Log4j2\" section.\n1. Add [log4j2.xml](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/servicebus/azure-messaging-servicebus/docs/log4j2.xml) to your **src/main/resources** folder.\n\n### Configure logback\n\nUse the following steps to configure logback:\n\n1. Add the dependencies in your **pom.xml** using ones from the [logging sample pom.xml][LoggingPom], in the \"Dependencies required for logback\" section.\n1. Add [logback.xml](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/servicebus/azure-messaging-servicebus/docs/logback.xml) to your **src/main/resources** folder.\n\n### Enable AMQP transport logging\n\nIf enabling client logging isn't enough to diagnose your issues, you can enable logging to a file in the underlying AMQP library, [Qpid Proton-J](https://qpid.apache.org/proton/). Qpid Proton-J uses `java.util.logging`. You can enable logging by creating a configuration file with the contents shown in the next section. Or, set `proton.trace.level=ALL` and whichever configuration options you want for the `java.util.logging.Handler` implementation. For the implementation classes and their options, see [Package java.util.logging](https://docs.oracle.com/javase/8/docs/api/java/util/logging/package-summary.html) in the Java 8 SDK documentation.\n\nTo trace the AMQP transport frames, set the `PN_TRACE_FRM=1` environment variable.\n\n#### Sample logging.properties file\n\nThe following configuration file logs TRACE level output from Proton-J to the file **proton-trace.log**:\n\n```properties\nhandlers=java.util.logging.FileHandler\n.level=OFF\nproton.trace.level=ALL\njava.util.logging.FileHandler.level=ALL\njava.util.logging.FileHandler.pattern=proton-trace.log\njava.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter\njava.util.logging.SimpleFormatter.format=[%1$tF %1$tr] %3$s %4$s: %5$s %n\n```\n\n### Reduce logging\n\nOne way to decrease logging is to change the verbosity. Another way is to add filters that exclude logs from logger names packages like `com.azure.messaging.servicebus` or `com.azure.core.amqp`. For examples, see the XML files in the [Configure Log4J 2](#configure-log4j-2) and [Configure logback](#configure-logback) sections.\n\nWhen you submit a bug, the log messages from classes in the following packages are interesting:\n\n* `com.azure.core.amqp.implementation`\n* `com.azure.core.amqp.implementation.handler`\n  * The exception is that you can ignore the `onDelivery` message in `ReceiveLinkHandler`.\n* `com.azure.messaging.servicebus.implementation`\n\n## Concurrency in ServiceBusProcessorClient\n\n`ServiceBusProcessorClient` enables the application to configure how many calls to the message handler should happen concurrently. This configuration makes it possible to process multiple messages in parallel. For a `ServiceBusProcessorClient` consuming messages from a non-session entity, the application can configure the desired concurrency using the `maxConcurrentCalls` API. For a session enabled entity, the desired concurrency is `maxConcurrentSessions` times `maxConcurrentCalls`.\n\nIf the application observes fewer concurrent calls to the message handler than the configured concurrency, it might be because the thread pool is not sized appropriately.\n\n`ServiceBusProcessorClient` uses daemon threads from the Reactor global [boundedElastic](https://projectreactor.io/docs/core/release/api/reactor/core/scheduler/Schedulers.html#boundedElastic--) thread pool to invoke the message handler. The maximum number of concurrent threads in this pool is limited by a cap. By default, this cap is ten times the number of available CPU cores. For the `ServiceBusProcessorClient` to effectively support the application's desired concurrency (`maxConcurrentCalls` or `maxConcurrentSessions` times `maxConcurrentCalls`), you must have a `boundedElastic` pool cap value that's higher than the desired concurrency. You can override the default cap by setting the system property `reactor.schedulers.defaultBoundedElasticSize`.\n\nYou should tune the thread pool and CPU allocation on a case-by-case basis. However, when you override the pool cap, as a starting point, limit the concurrent threads to approximately 20-30 per CPU core. We recommend that you cap the desired concurrency per `ServiceBusProcessorClient` instance to approximately 20-30. Profile and measure your specific use case and tune the concurrency aspects accordingly. For high load scenarios, consider running multiple `ServiceBusProcessorClient` instances where each instance is built from a new `ServiceBusClientBuilder` instance. Also, consider running each `ServiceBusProcessorClient` in a dedicated host - such as a container or VM - so that downtime in one host doesn't impact the overall message processing.\n\nKeep in mind that setting a high value for the pool cap on a host with few CPU cores would have adverse effects. Some signs of low CPU resources or a pool with too many threads on fewer CPUs are: frequent timeouts, lock lost, deadlock, or lower throughput. If you're running the Java application on a container, then we recommend using two or more vCPU cores. We don't recommend selecting anything less than 1 vCPU core when running Java application on containerized environments. For in-depth recommendations on resourcing, see [Containerize your Java applications](../containers/overview.md).\n\n## Connection sharing bottleneck\n\nAll the clients created from a shared `ServiceBusClientBuilder` instance share the same connection to the Service Bus namespace.\n\nUsing a shared connection enables multiplexing operations among clients on one connection, but sharing can also become a bottleneck if there are many clients, or the clients together generate high load. Each connection has an I/O thread associated with it. When sharing connection, the clients put their work in this shared I/O thread's work-queue and the progress of each client depends on the timely completion of its work in the queue. The I/O thread handles the enqueued work serially. That is, if the I/O thread work-queue of a shared connection ends up with a lot of pending work to deal with, then the symptoms are similar to those of low CPU. This condition is described in the previous section on concurrency - for example, clients stalling, timeout, lost lock, or slowdown in recovery path.\n\nService Bus SDK uses the `reactor-executor-*` naming pattern for the connection I/O thread. When the application experiences the shared connection bottleneck, then it might be reflected in the I/O thread's CPU usage. Also, in the heap dump or in live memory, the object `ReactorDispatcher$workQueue` is the work-queue of the I/O thread. A long work-queue in the memory snapshot during the bottleneck period might indicate that the shared I/O thread is overloaded with pending works.\n\nTherefore, if the application load to a Service Bus endpoint is reasonably high in terms of overall number of sent-received messages or payload size, you should use a separate builder instance for each client that you build. For example, for each entity - queue or topic - you can create a new `ServiceBusClientBuilder` and build a client from it. In case of extremely high load to a specific entity, you might want to either create multiple client instances for that entity or run clients in multiple hosts - for example, containers or VMs - to load balance.\n\n## Clients halt when using Application Gateway custom endpoint\n\nThe custom endpoint address refers to an application-provided HTTPS endpoint address resolvable to Service Bus or configured to route traffic to Service Bus. Azure Application Gateway makes it easy to create an HTTPS front-end that forwards traffic to Service Bus. You can configure Service Bus SDK for an application to use an Application Gateway front-end IP address as the custom endpoint to connect to Service Bus.\n\nApplication Gateway offers several security policies supporting different TLS protocol versions. There are predefined policies enforcing TLSv1.2 as the minimum version, there also exist old policies with TLSv1.0 as the minimum version. The HTTPS front-end will have a TLS policy applied.\n\nRight now, the Service Bus SDK doesn't recognize certain remote TCP terminations by the Application Gateway front end, which uses TLSv1.0 as the minimum version. For instance, if the front end sends TCP FIN, ACK packets to close the connection when its properties are updated, the SDK can't detect it, so it won't reconnect, and clients can't send or receive messages anymore. Such a halt only happens when using TLSv1.0 as the minimum version. To mitigate, use a security policy with TLSv1.2 or higher as the minimum version for the Application Gateway front-end.\n\nThe support for TLSv1.0 and 1.1 across all Azure Services is already [announced](https://azure.microsoft.com/updates/azure-support-tls-will-end-by-31-october-2024-2) to end by 31 October 2024, so transitioning to TLSv1.2 is strongly recommended.\n\n## Message or session lock is lost\n\nA Service Bus queue or topic subscription has a lock duration set at the resource level. When the receiver client pulls a message from the resource, the Service Bus broker applies an initial lock to the message. The initial lock lasts for the lock duration set at the resource level. If the message lock isn't renewed before it expires, then the Service Bus broker releases the message to make it available for other receivers. If the application tries to complete or abandon a message after the lock expiration, the API call fails with the error `com.azure.messaging.servicebus.ServiceBusException: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue`. \n\nThe Service Bus client supports running a background lock renew task that renews the message lock continuously each time before it expires. By default, the lock renew task runs for 5 minutes. You can adjust the lock renew duration by using `ServiceBusReceiverClientBuilder.maxAutoLockRenewDuration(Duration)`. If you pass the `Duration.ZERO` value, the lock renew task is disabled.\n\nThe following lists describes some of the usage patterns or host environments that can lead to the lock lost error:\n\n* The lock renew task is disabled and the application's message processing time exceeds the lock duration set at the resource level.\n* The application's message processing time exceeds the configured lock renew task duration. Note that, if the lock renew duration is not set explicitly, it defaults to 5 minutes.\n* The application has turned on the Prefetch feature by setting the prefetch value to a positive integer using `ServiceBusReceiverClientBuilder.prefetchCount(prefetch)`. When the Prefetch feature is enabled, the client will retrieve the number of messages equal to the prefetch from the Service Bus entity - queue or topic - and store them in the in-memory prefetch buffer. The messages stay in the prefetch buffer until they're received into the application. The client doesn't extend the lock of the messages while they're in the prefetch buffer. If the application processing takes so long that message locks expire while staying in the prefetch buffer, then the application might acquire the messages with an expired lock. For more information, see [Why is Prefetch not the default option?](/azure/service-bus-messaging/service-bus-prefetch?tabs=java#why-is-prefetch-not-the-default-option)\n* The host environment has occasional network problems - for example, transient network failure or outage - that prevent the lock renew task from renewing the lock on time.\n* The host environment lacks enough CPUs or has shortages of CPU cycles intermittently that delays the lock renew task from running on time.\n* The host system time isn't accurate - for example, the clock is skewed - delaying the lock renew task and keeping it from running on time.\n* The connection I/O thread is overloaded, impacting its ability to execute lock renew network calls on time. The following two scenarios can cause this issue:\n\n  * The application is running too many receiver clients sharing the same connection. For more information, see the [Connection sharing bottleneck](#connection-sharing-bottleneck) section.\n  * The application has configured `ServiceBusReceiverClient.receiveMessages` or `ServiceBusProcessorClient` to have a large `maxMessages` or `maxConcurrentCalls` values. For more information, see the [Concurrency in ServiceBusProcessorClient](#concurrency-in-servicebusprocessorclient) section.\n* A common application pattern that increases the likelihood of a lock-lost error involves scheduling long-running lock renew tasks - for example, tasks with durations spanning several hours. As mentioned previously, various factors outside the control of a Service Bus client can interfere with successful lock renewal, so application designs should avoid assuming guaranteed renewal over extended periods. To avoid having to reprocess long-running operations, consider breaking the work into smaller chunks or implementing idempotent checkpointing logic.\n\nThe number of lock renew tasks in the client is equal to the `maxMessages` or `maxConcurrentCalls` parameter values set for `ServiceBusProcessorClient` or `ServiceBusReceiverClient.receiveMessages`. A high number of lock renew tasks making multiple network calls can also have an adverse effect in Service Bus namespace throttling.\n\nIf the host is not sufficiently resourced, the lock can still be lost even if there are only a few lock renew tasks running. If you're running the Java application on a container, then we recommend using two or more vCPU cores. We don't recommend selecting anything less than 1 vCPU core when running Java applications on containerized environments. For in-depth recommendations on resourcing, see [Containerize your Java applications](../containers/overview.md).\n\nThe same remarks about locks are also relevant for a Service Bus queue or a topic subscription that has session enabled. When the receiver client connects to a session in the resource, the broker applies an initial lock to the session. To maintain the lock on the session, the lock renew task in the client has to keep renewing the session lock before it expires. For a session enabled resource, the underlying partitions sometimes move to achieve load balancing across Service Bus nodes - for example, when new nodes are added to share the load. When that happens, session locks can be lost. If the application tries to complete or abandon a message after the session lock is lost, the API call fails with the error `com.azure.messaging.servicebus.ServiceBusException: The session lock was lost. Request a new session receiver`.\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n\n<!-- LINKS -->\n[LoggingPom]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/servicebus/azure-messaging-servicebus/docs/pom.xml\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-network.md",
    "content": "---\ntitle: Troubleshoot networking issues when you use the Azure SDK for Java\ndescription: Provides an overview of how to troubleshoot networking issues related to using the Azure SDK for Java.\nms.date: 04/02/2025\nms.topic: troubleshooting-general\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: alzimmer\n---\n\n# Troubleshoot networking issues\n\nThis article describes a few tools that can diagnose networking issues of various complexities. These issues include scenarios that range from troubleshooting an unexpected response value from a service, to root-causing a connection-closed exception.\n\nFor client-side troubleshooting, the Azure client libraries for Java offer a consistent and robust logging story, as described in [Configure logging in the Azure SDK for Java](logging-overview.md). However, the client libraries make network calls over various protocols, which may lead to troubleshooting scenarios that extend outside of the troubleshooting scope provided. When these problems occur, the solution is to use the external tooling described in this article to diagnose networking issues.\n\n## Fiddler\n\n[Fiddler](https://docs.telerik.com/fiddler-everywhere/introduction) is an HTTP debugging proxy that allows for requests and responses passed through it to be logged as-is. The raw requests and responses that you capture can help you troubleshoot scenarios where the service gets an unexpected request, or the client receives an unexpected response. To use Fiddler, you need to configure the client library with an HTTP proxy. If you use HTTPS, you need extra configuration to inspect the decrypted request and response bodies.\n\n### Add an HTTP proxy\n\nTo add an HTTP proxy, follow the guidance in [Configure proxies in the Azure SDK for Java](proxying.md). Be sure to use the default Fiddler address of `localhost` on port 8888.\n\n### Enable HTTPS decryption\n\nBy default, Fiddler can capture only HTTP traffic. If your application uses HTTPS, you must take extra steps to trust Fiddler's certificate to allow it to capture HTTPS traffic. For more information, see [HTTPS Menu](https://docs.telerik.com/fiddler-everywhere/user-guide/settings/https) in the Fiddler documentation.\n\nThe following steps show you how to use the Java Runtime Environment (JRE) to trust the certificate. If the certificate isn't trusted, an HTTPS request through Fiddler may fail with security warnings.\n\n#### [Linux/macOS](#tab/linux-macos)\n\n1. Export Fiddler's certificate.\n1. Find the JRE's keytool (usually in **jre/bin**).\n1. Find the JRE's cacert (usually in **jre/lib/security**).\n1. Open a Bash window and use the following command to import the certificate:\n\n   ```bash\n   sudo keytool -import -file <location-of-Fiddler-certificate> -keystore <location-of-cacert> -alias Fiddler\n   ```\n\n1. Enter a password.\n1. Trust the certificate.\n\n#### [Windows](#tab/windows)\n\n1. Export Fiddler's certificate. The certificate is typically exported to the desktop.\n1. Find the JRE's keytool (usually in **jre\\bin**).\n1. Find the JRE's cacert (usually in **jre\\lib\\security**).\n1. Open a PowerShell window in administrator mode and use the following command to import the certificate:\n\n   ```powershell\n   keytool.exe -import -trustcacerts -file <location-of-Fiddler-certificate> -keystore <location-of-cacert> -alias Fiddler\n   ```\n\n   For example, the following command uses some common values:\n\n   ```powershell\n   keytool.exe -import -trustcacerts -file \"C:\\Users\\username\\Desktop\\FiddlerRootCertificate.crt\" -keystore \"C:\\Program Files\\AdoptOpenJDK\\jdk-8.0.275.1-hotspot\\jre\\lib\\security\\cacerts\" -alias Fiddler\n   ```\n\n1. Enter a password. If you haven't set a password before, the default is `changeit`. For more information, see [Working with Certificates and SSL](https://docs.oracle.com/cd/E19830-01/819-4712/ablqw/index.html) in the Oracle documentation.\n1. Trust the certificate.\n\n---\n\n## Wireshark\n\n[Wireshark](https://www.wireshark.org/) is a network protocol analyzer that can capture network traffic without needing changes to application code. Wireshark is highly configurable and can capture broad to specific, low-level network traffic. This capability is useful for troubleshooting scenarios such as a remote host closing a connection or having connections closed during an operation. The Wireshark GUI displays captures using a color scheme that identifies unique capture cases, such as a TCP retransmission, RST, and so on. You can also filter captures either at capture time or during analysis.\n\n### Configure a capture filter\n\nCapture filters reduce the number of network calls that are captured for analysis. Without capture filters, Wireshark captures all traffic that goes through a network interface. This behavior can produce massive amounts of data where most of it may be noise to the investigation. Using a capture filter helps preemptively scope the network traffic being captured to help target an investigation. For more information, see [Capturing Live Network Data](https://www.wireshark.org/docs/wsug_html_chunked/ChapterCapture.html) in the Wireshark documentation.\n\nThe following example adds a capture filter to capture network traffic sent to or received from a specific host.\n\nIn Wireshark, navigate to **Capture > Capture Filters...** and add a new filter with the value `host <host-IP-or-hostname>`. This filter captures traffic only to and from that host. If the application communicates to multiple hosts, you can add multiple capture filters, or you can add the host IP/hostname with the 'OR' operator to provide looser capture filtering.\n\n### Capture to disk\n\nYou might need to run an application for a long time to reproduce an unexpected networking exception, and to see the traffic that leads up to it. Additionally, it may not be possible to maintain all captures in memory. Fortunately, Wireshark can log captures to disk so that they're available for post-processing. This approach avoids the risk of running out of memory while you reproduce an issue. For more information, see [File Input, Output, And Printing](https://www.wireshark.org/docs/wsug_html_chunked/ChapterIO.html) in the Wireshark documentation.\n\nThe following example sets up Wireshark to persist captures to disk with multiple files, where the files split on either 100k captures or 50 MB size.\n\nIn Wireshark, navigate to **Capture > Options** and find the **Output** tab, then enter a file name to use. This configuration causes Wireshark to persist captures to a single file.\n\nTo enable capture to multiple files, select **Create a new file automatically** and then select **after 100000 packets** and **after 50 megabytes**. This configuration has Wireshark create a new file when one of the predicates is matched. Each new file uses the same base name as the file name entered and appends a unique identifier.\n\nIf you want to limit the number of files that Wireshark can create, select **Use a ring buffer with X files**. This option limits Wireshark to logging with only the specified number of files. When that number of files is reached, Wireshark begins overwriting the files, starting with the oldest.\n\n### Filter captures\n\nSometimes you can't tightly scope the traffic that Wireshark captures - for example, if your application communicates with multiple hosts using various protocols. In this scenario, generally with using persistent capture outlined previously, it's easier to run analysis after network capturing. Wireshark supports filter-like syntax for analyzing captures. For more information, see [Working With Captured Packets](https://www.wireshark.org/docs/wsug_html_chunked/ChapterWork.html) in the Wireshark documentation.\n\nThe following example loads a persisted capture file and filters on `ip.src_host==<IP>`.\n\nIn Wireshark, navigate to **File > Open** and load a persisted capture from the file location used previously. After the file has loaded underneath the menu bar, a filter input appears. In the filter input, enter `ip.src_host==<IP>`. This filter limits the capture view so that it shows only captures where the source was from the host with the IP `<IP>`.\n\n## Next steps\n\nThis article covered using various tools to diagnose networking issues when working with the Azure SDK for Java. Now that you're familiar with the high-level usage scenarios, you can begin exploring the SDK itself. For more information on the APIs available, see the [Azure SDK for Java libraries](azure-sdk-library-package-index.md).\n"
  },
  {
    "path": "articles/java/sdk/troubleshooting-overview.md",
    "content": "---\ntitle: Troubleshooting overview when you use the Azure SDK for Java\ndescription: Provides an overview of how to troubleshoot issues related to using the Azure SDK for Java.\nms.date: 02/14/2025\nms.topic: concept-article\nms.custom: devx-track-java, devx-track-extended-java\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\n---\n\n# Troubleshooting overview for the Azure SDK for Java\n\nThis article introduces many troubleshooting tools available to you when you use the Azure SDK for Java, and links to other articles with further details.\n\nThe Azure SDK for Java consists of many client libraries - one or more for each Azure Service that exists. We ensure that all client libraries are built to a consistent, high standard, with common patterns for configuration, logging, exception handling, and troubleshooting. For more information, see [Use the Azure SDK for Java](overview.md).\n\nBecause troubleshooting can span such a wide subject area, we've developed the following troubleshooting guides that you may want to review:\n\n* [Troubleshoot Azure Identity authentication issues](troubleshooting-authentication-overview.md) covers authentication failure investigation techniques, common errors for the credential types in the Azure Identity Java client library, and mitigation steps to resolve these errors.\n* [Troubleshoot dependency version conflicts](troubleshooting-dependency-version-conflict.md) covers subjects related to diagnosing, mitigating, and minimizing dependency conflicts. These conflicts can arise when you use the Azure SDK for Java client libraries in systems that are built with tools such as Maven and Gradle.\n* [Troubleshoot networking issues](troubleshooting-network.md) covers subjects related to HTTP debugging outside of the client library, using tools like Fiddler and Wireshark.\n\nAlong with these general troubleshooting guides, we also provide library-specific troubleshooting guides. Right now, the following guides are available:\n\n* [Troubleshoot Azure Event Hubs](troubleshooting-messaging-event-hubs-overview.md)\n* [Troubleshoot Azure Service Bus](troubleshooting-messaging-service-bus-overview.md)\n\nBeyond these documents, the following content provides guidance on making the best use of logging and exception handling as it relates to the Azure SDK for Java.\n\n## Use logging in the Azure SDK for Java\n\nThe following sections describe how to enable different kinds of logging.\n\n### Enable client logging\n\nTo troubleshoot issues, it's important to first enable logging to monitor the behavior of your application. The errors and warnings in the logs generally provide useful insights into what went wrong and sometimes include corrective actions to fix issues. The Azure SDK for Java has comprehensive logging support. For more information, see [Configure logging in the Azure SDK for Java](logging-overview.md).\n\n### Enable HTTP request/response logging\n\nWhen troubleshooting issues, it's useful to review HTTP requests as they're sent and received between Azure services. To enable logging the HTTP request and response payload, you can configure almost all Azure SDK for Java client libraries in their client builders as shown in the following example. In particular, pay special attention to the `httpLogOptions` method on the client builder, and the enum values available in `HttpLogDetailLevel`.\n\n```java\nConfigurationClient configurationClient = new ConfigurationClientBuilder()\n        .connectionString(connectionString)\n        .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))\n        .buildClient();\n```\n\nThis code changes the HTTP request/response logging for a single client instance. Alternatively, you can configure logging HTTP requests and responses for your entire application by setting the `AZURE_HTTP_LOG_DETAIL_LEVEL` environment variable to one of the values in the following table. It's important to note that this change enables logging for every Azure client that supports logging HTTP request/response.\n\n| Value              | Logging level                                                        |\n|--------------------|----------------------------------------------------------------------|\n| `none`             | HTTP request/response logging is disabled.                           |\n| `basic`            | Logs only URLs, HTTP methods, and time to finish the request.        |\n| `headers`          | Logs everything in BASIC, plus all the request and response headers. |\n| `body`             | Logs everything in BASIC, plus all the request and response body.    |\n| `body_and_headers` | Logs everything in HEADERS and BODY.                                 |\n\n> [!NOTE]\n> When you log request and response bodies, ensure that they don't contain confidential information. When you log query parameters and headers, the client library has a default set of query parameters and headers that are considered safe to log. It's possible to add additional query parameters and headers that are safe to log, as shown in the following example:\n>\n> ```java\n> clientBuilder.httpLogOptions(new HttpLogOptions()\n>     .addAllowedHeaderName(\"safe-to-log-header-name\")\n>     .addAllowedQueryParamName(\"safe-to-log-query-parameter-name\"))\n> ```\n\n## Exception handling in the Azure SDK for Java\n\nMost Azure SDK for Java client service methods throw an [HttpResponseException](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/core/azure-core/src/main/java/com/azure/core/exception/HttpResponseException.java) or a more-specific subclass on failure. The `HttpResponseException` type includes a detailed response error object that provides specific useful insights into what went wrong and includes corrective actions to fix common issues. You can find this error information inside the message property of the `HttpResponseException` object. Because these exceptions are runtime exceptions, the JavaDoc reference documentation doesn't explicitly call them out.\n\nThe following example shows you how to catch this exception with a synchronous client:\n\n```java\ntry {\n    ConfigurationSetting setting = new ConfigurationSetting().setKey(\"myKey\").setValue(\"myValue\");\n    client.getConfigurationSetting(setting);\n} catch (HttpResponseException e) {\n    System.out.println(e.getMessage());\n    // Do something with the exception\n}\n```\n\nWith asynchronous clients, you can catch and handle exceptions in the error callbacks, as shown in the following example:\n\n```java\nConfigurationSetting setting = new ConfigurationSetting().setKey(\"myKey\").setValue(\"myValue\");\nasyncClient.getConfigurationSetting(setting)\n    .doOnSuccess(ignored -> System.out.println(\"Success!\"))\n    .doOnError(\n        error -> error instanceof ResourceNotFoundException,\n        error -> System.out.println(\"Exception: 'getConfigurationSetting' could not be performed.\"));\n```\n\n## Use tracing in the Azure SDK for Java\n\nThe Azure SDK for Java offers comprehensive tracing support, enabling you to see the flow of execution through your application code and the client libraries you're using. You can enable tracing in Azure client libraries by using and configuring the [OpenTelemetry](https://opentelemetry.io) SDK or by using an OpenTelemetry-compatible agent. OpenTelemetry is a popular open-source observability framework for generating, capturing, and collecting telemetry data for cloud-native software.\n\nFor more information on how to enable tracing in the Azure SDK for Java, see [Configure tracing in the Azure SDK for Java](tracing.md).\n\n## Next steps\n\nIf the troubleshooting guidance in this article doesn't help to resolve issues when you use the Azure SDK for Java client libraries, we recommended that you [file an issue](https://github.com/Azure/azure-sdk-for-java/issues/new/choose) in the [Azure SDK for Java GitHub repository](https://github.com/Azure/azure-sdk-for-java).\n"
  },
  {
    "path": "articles/java/sdk/virtual-machine-samples.md",
    "content": "---\ntitle: Azure management libraries for Java virtual machine samples\ndescription: Get sample code for creating and updating Azure virtual machines using the Azure management libraries for Java.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\nms.date: 06/02/2025\nms.topic: concept-article\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Azure management libraries for Java - Virtual machine samples\n\nThe following table links to Java source you can use to create and configure Azure virtual machines.\n\n[!INCLUDE [java-vm-samples](includes/java-vm-samples.md)]\n"
  },
  {
    "path": "articles/java/sdk/web-apps-samples.md",
    "content": "---\ntitle: Azure management libraries for Java web app samples\ndescription: Get sample code for creating and updating Azure web apps hosted in App Service using the Azure management libraries for Java.\nauthor: bmitchell287\nms.author: brendm\nms.reviewer: jogiles\nms.date: 06/02/2025\nms.topic: concept-article\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Azure management libraries for Java - Web app samples \n\nThe following table links to Java source you can use to create and configure web apps.\n\n| Sample | Description |\n|---|---|\n| **Create an app** ||\n| [Create a web app and deploy from FTP or GitHub][1] | Deploy web apps from local Git, FTP, and continuous integration from GitHub. |\n| [Create a web app and manage deployment slots][2] | Create a web app and deploy to staging slots, and then swap deployments between slots. |\n| **Configure an app** ||\n| [Create a web app and configure a custom domain][3] | Create a web app with a custom domain and self-signed SSL certificate. |\n| **Scale an app** ||\n| [Scale a web app with high availability across multiple regions][4] | Scale a web app in three different geographical regions and make them available through a single endpoint using Azure Traffic Manager. | \n| **Connect an app to resources** ||\n| [Connect a web app to a storage account][5] | Create an Azure storage account and add the storage account connection string to the app settings. |\n| [Connect a web app to a SQL database][6] | Create a web app and SQL database, and then add the SQL database connection string to the app settings. |\n\n[1]: ./index.yml\n[2]: https://github.com/Azure-Samples/app-service-java-manage-staging-and-production-slots-for-web-apps/\n[3]: https://github.com/Azure-Samples/app-service-java-manage-web-apps-with-custom-domains/\n[4]: https://github.com/Azure-Samples/app-service-java-scale-web-apps-on-linux\n[5]: https://github.com/Azure-Samples/app-service-java-manage-storage-connections-for-web-apps/\n[6]: https://github.com/Azure-Samples/app-service-java-manage-data-connections-for-web-apps/\n"
  },
  {
    "path": "articles/java/spring-framework/app-configuration-support.md",
    "content": "---\ntitle: Developers Guide for using Spring Cloud Azure App Configuration\ndescription: This developer guide walks you through using Spring Cloud Azure App Configuration.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: mametcal\nms.date: 02/10/2026\nms.topic: tutorial\nms.custom: mvc, devx-track-java, devx-track-extended-java, devx-track-azurecli\n#Customer intent: As a developer, I want to use Spring Cloud Azure App Configuration Config to load configurations from Azure App Configuration.\n---\n\n# App configuration support\n\nThis article describes the Spring Cloud Azure App Configuration library. This library loads configurations and feature flags from the [Azure App Configuration service](/azure/azure-app-configuration/index). The library generates `PropertySource` abstractions to match the abstractions already generated by the Spring environment, such as environment variables, command-line configurations, local configuration files, and so on.\n\nSpring is an open-source application framework developed by VMware that provides a simplified, modular approach for creating Java applications. Spring Cloud Azure is an open-source project that provides seamless Spring integration with Azure services.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 8 or higher.\n- [Apache Maven](https://maven.apache.org)\n- [Azure CLI](/cli/azure/install-azure-cli)\n\n## Set up your App Configuration store\n\nUse the following command to create your Azure App Configuration store:\n\n```azurecli\naz appconfig create \\\n    --resource-group <your-resource-group> \\\n    --name <name-of-your-new-store> \\\n    --sku Standard\n```\n\nThis command creates a new, empty configuration store. You can upload your configurations by using the following import command:\n\n```azurecli\naz appconfig kv import \\\n    --name <name-of-your-new-store> \\\n    --source file \\\n    --path <location-of-your-properties-file> \\\n    --format properties \\\n    --prefix /application/\n```\n\nConfirm your configurations before loading them. You can upload YAML files by changing the format to YAML. The prefix field is important because it's the default prefix loaded by the client library.\n\n## Library usage\n\nTo use the feature in an application, you can build it as a Spring Boot application. The most convenient way to add the dependency is with the Spring Boot starter `com.azure.spring:spring-cloud-azure-starter-appconfiguration-config`. The following example **pom.xml** file uses Azure App Configuration:\n\n```xml\n<parent>\n    <groupId>org.springframework.boot</groupId>\n    <artifactId>spring-boot-starter-parent</artifactId>\n    <version>{spring-boot-version}</version>\n    <relativePath />\n</parent>\n\n<dependencyManagement>\n  <dependencies>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-dependencies</artifactId>\n      <version>7.2.0</version>\n      <type>pom</type>\n      <scope>import</scope>\n    </dependency>\n  </dependencies>\n</dependencyManagement>\n\n<dependencies>\n    <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter</artifactId>\n    </dependency>\n    <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-web</artifactId>\n    </dependency>\n    <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-starter-appconfiguration-config</artifactId>\n    </dependency>\n</dependencies>\n<build>\n    <plugins>\n           <plugin>\n               <groupId>org.springframework.boot</groupId>\n               <artifactId>spring-boot-maven-plugin</artifactId>\n           </plugin>\n    </plugins>\n</build>\n```\n\nThe following example shows a basic Spring Boot application using App Configuration:\n\n```java\n@SpringBootApplication\n@RestController\npublic class Application {\n\n    @RequestMapping(\"/\")\n    public String home() {\n        return \"Hello World!\";\n    }\n\n    public static void main(String[] args) {\n        SpringApplication.run(Application.class, args);\n    }\n}\n```\n\nFor this example, the **application.properties** file contains the following line:\n\n```properties\nspring.config.import=azureAppConfiguration\nspring.cloud.azure.appconfiguration.stores[0].endpoint=${CONFIG_STORE_ENDPOINT}\n```\n\n`CONFIG_STORE_ENDPOINT` is an environment variable with the endpoint URL to your Azure App Configuration Store.\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\nBy default, if no configurations are set, the configurations starting with `/application/` are loaded with a default label of `(No Label)` unless a Spring Profile is set, in which case the default label is your Spring Profile.\n\nA property source named `/application/https://<name-of-your-store>.azconfig.io/` is created containing the properties of that store. The label used in the request is appended to the end of the name. If no label is set, the character `\\0` is present as an empty space.\n\n## Loading configuration\n\nThe library supports the loading of one or multiple App Configuration stores. In the situation where a key is duplicated across multiple stores, the last one wins.\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].endpoint=[first-store-endpoint]\nspring.cloud.azure.appconfiguration.stores[1].endpoint=[second-store-endpoint]\n```\n\nIn this example, if both the stores have the same configuration key, then the configuration in the second store has the highest priority.\n\n> [!NOTE]\n> You can use Azure App Configuration settings like any other Spring Configuration. For more information, see [Core Features](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html) in the Spring Boot documentation or [Quickstart: Create a Java Spring app with Azure App Configuration](/azure/azure-app-configuration/quickstart-java-spring-app).\n\n### Selecting configurations\n\nThe library loads configurations using their key and label, or snapshot. When no method of selection is used, the library loads all keys with the prefix `/application/` and the label `\\0`, which appears as `(No Label)` in the Azure portal.\n\nThe default key filter is `/application/*`. The default label filter is `\\0`, which appears as `(No Label)` in the Azure portal. If a Spring profile is set, and no label is provided, then the default label is your Spring Profile, which is `${spring.profiles.active}`.\n\nIn addition, you can load configurations from a specific snapshot. A snapshot is a static view of the configuration at a given point in time. When you load from a snapshot, you load the configurations as they were at the time of the snapshot creation, and they don't update until you create a new snapshot and load from it. The snapshot needs to be of the composition type `Key`, and you can specify the snapshot to load from by using the `snapshot` property:\n\n```properties\n\nYou can configure which configurations are loaded by selecting different key and label filters:\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].selects[0].key-filter=[my-key]\nspring.cloud.azure.appconfiguration.stores[0].selects[0].label-filter=[my-label]\nspring.cloud.azure.appconfiguration.stores[0].selects[1].snapshot=[snapshot-name]\n```\n\n> [!NOTE]\n> You can't combine snapshot selection with key and label filters. When you use snapshot selection, all keys in the snapshot are loaded.\n\n\nThe `key-filter` property supports the following filters:\n\n| Key filter | Effect                                                                    |\n|------------|---------------------------------------------------------------------------|\n| `*`        | Matches any key.                                                          |\n| `abc`      | Matches a key named `abc`.                                                |\n| `abc*`     | Matches key names that start with `abc`.                                  |\n| `abc,xyz`  | Matches key names `abc` or `xyz`. Limited to five comma-separated values. |\n\nThe `label-filter` property supports the following filters:\n\n| Label    | Description                                                                 |\n|----------|-----------------------------------------------------------------------------|\n| `*`      | Matches any label, including `\\0`.                                          |\n| `\\0`     | Matches `null` labels, which appear as `(No Label)` in the Azure portal.    |\n| `1.0.0`  | Matches label `1.0.0` exactly.                                              |\n| `1.0.*`  | Matches labels that start with `1.0.*`.                                     |\n| `,1.0.0` | Matches labels `null` and `1.0.0`. Limited to five comma-separated values.  |\n\nIf you're using YAML with label filters, and you want to load configurations with no label and more configurations with other labels, you need to include an empty `,`. For example, `,dev` matches `\\0` and `dev`. In this case, surround the label filter with single quotes. This value enables you to load configuration with no label first, followed by configurations with specific labels, in the same filter:\n\n```yml\nspring:\n  cloud:\n    azure:\n      appconfiguration:\n        stores:\n        - selects:\n          - label-filter: ',1.0.0'\n```\n\n> [!NOTE]\n> You can't combine `*` with `,` in filters. In that case, you need to use an additional select value.\n>\n> When you use `*` in the label filter, and multiple configurations with the same key are loaded, they're loaded in alphabetical order, and the label last in alphabetical order is used.\n\n### Spring Profiles\n\nBy default, `spring.profiles.active` is set as the default `label-filter` for all selected configurations. You can override this functionality by using `label-filter`. You can use the Spring Profiles in the `label-filter` by using `${spring.profiles.active}`, as shown in the following example:\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].selects[0].label-filter=,${spring.profiles.active}\nspring.cloud.azure.appconfiguration.stores[0].selects[1].label-filter=${spring.profiles.active}_local\n```\n\nIn the first `label-filter`, the library first loads all configurations with the `\\0` label, followed by all configurations matching the Spring Profiles. Spring Profiles have priority over the `\\0` configurations, because they're at the end.\n\nIn the second `label-filter`, the string `_local` is appended to the end of the Spring Profiles, though only to the last Spring Profile if there's more than one.\n\n### Disabled stores\n\nUsing the configuration `spring.cloud.azure.appconfiguration.enabled`, you can disable loading for all configuration stores. With the `spring.cloud.azure.appconfiguration.stores[0].enabled` configuration, you can disable an individual store.\n\n> [!NOTE]\n> If you use health metrics, you still see your stores listed, but with the value `NOT LOADED`. When you check loaded property sources, you still see them listed, but they contain no values. This behavior is due to the `spring.config.import` property being set. If `azureAppConfiguration` isn't set for `spring.config.import`, no values are shown.\n\n## Authentication\n\nThe library supports all forms of identity supported by the [Azure Identity Library](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity). You can do authentication through configuration for connection strings and managed identity.\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\n### Connection string (not recommended)\n\nAuthentication through connection string is the simplest form to set up, though it isn't recommended. You can access a store's connection strings by using the following command:\n\n```azurecli\naz appconfig credential list --name <name-of-your-store>\n```\n\nYou can then set the `spring.cloud.azure.appconfiguration.stores[0].connection-string` property to the connection string. When using this approach, we highly recommend setting the connection string in the local configuration file to a placeholder value that maps to an environment variable. This approach enables you to avoid adding the connection string to source control.\n\n### Spring Cloud Azure configuration\n\nYou can use [Spring Cloud Azure configuration](configuration.md) to configure the library. You can use the following properties to configure the library:\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].endpoint= <URI-of-your-configuration-store>\n```\n\nWhen only the endpoint is set, the client library uses the [DefaultAzureCredential](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity#defaultazurecredential) to authenticate.\n\nYou need to assign the identity used to read configurations. You can create this assignment by using the following command:\n\n```azurecli\naz role assignment create \\\n    --role \"App Configuration Data Reader\" \\\n    --assignee <your-client-ID> \\\n    --scope /subscriptions/<your-subscription>/resourceGroups/<your-stores-resource-group>/providers/Microsoft.AppConfiguration/configurationStores/<name-of-your-configuration-store>\n```\n\n> [!NOTE]\n> You can define only one authentication method per endpoint: connection string, user assigned identity, or token credential. If you need to mix and match, you can use `ConfigurationClientCustomizer` to modify the `ConfigurationClientBuilder` to use different methods.\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\n## Geo-replication\n\nThe library supports the geo-replication feature of Azure App Configuration. This feature enables you to replicate your data to other locations. This feature is useful for high availability and disaster recovery.\n\nEach replica you create has a dedicated endpoint. If your application resides in multiple geolocations, you can update each deployment of your application in a location to connect to the replica closer to that location, which helps minimize the network latency between your application and App Configuration. Because each replica has its separate request quota, this setup also helps the scalability of your application while it grows to a multi-region distributed service.\n\nBy default, the library auto discovers all replicas that exist for a configuration store. When a request is made to the provided store and fails, the library automatically retries the request against the available replicas.\n\nThe failover might occur if the library observes any of the following conditions:\n\n- Receives responses with service unavailable status code (HTTP 500 or above) from an endpoint.\n- Experiences network connectivity issues.\n- Requests are throttled (HTTP status code 429).\n\nAfter the provided store comes back online, the library automatically retries the request against the provided store.\n\nIf you want to control the failover behavior, you can manually provide a list of stores to use for failover.\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].endpoints[0]=[your primary store endpoint]\nspring.cloud.azure.appconfiguration.stores[0].endpoints[1]=[your replica store endpoint]\n```\n\nor\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].connection-strings[0]=[your primary store connection string]\nspring.cloud.azure.appconfiguration.stores[0].connection-strings[1]=[your replica store connection string]\n```\n\nIf all provided replica endpoints fail, the library attempts to connect to auto discovered replicas of the primary store.\n\nYou can disable replication with the setting `spring.cloud.azure.appconfiguration.stores[0].replica-discovery-enabled=false`.\n\n### Creating a configuration store with geo-replication\n\nTo create a replica of your configuration store, you can use the Azure CLI or the Azure portal. The following example uses the Azure CLI to create a replica in the East US 2 region:\n\n```azurecli\naz appconfig replica create --location --name --store-name [--resource-group]\n```\n\n## Key values\n\nAzure App Configuration supports multiple types of key values, some of which have special features built into them. Azure App Configuration has built-in support for the JSON content type, Spring placeholders, and Key Vault references.\n\n### Trimming keys\n\nBy default when loading keys from Azure App Configuration, the library trims the prefix defined by `spring.cloud.azure.appconfiguration.stores[0].selects[0].key-filter` from the key. For example, if you have a key named `/application/config.message` and a key filter of `/application/*`, the library trims the prefix `/application/` and loads the key as `config.message`. This trimming makes it easier to reference keys in your code.\n\nThis behavior can be overridden by setting `spring.cloud.azure.appconfiguration.stores[0].trim-key-prefix[0]` to a different value. Setting this property to an empty string disables the trimming behavior, and the key is loaded with its full name.\n\n### Placeholders\n\nThe library supports configurations with `${}`-style environment placeholders. When referencing an Azure App Configuration key with a placeholder, remove prefixes from the reference. For example, `/application/config.message` is referenced as `${config.message}`.\n\n> [!NOTE]\n> The prefix being removed matches the value `spring.cloud.azure.appconfiguration.stores[0].selects[0].key-filter`. The prefix being trimmed can be changed by setting a value for `spring.cloud.azure.appconfiguration.stores[0].trim-key-prefix[0]`.\n\n### JSON\n\nYou can [create JSON key-values](/azure/azure-app-configuration/howto-leverage-json-content-type#create-json-key-values-in-app-configuration) in App Configuration. When loading key-values from Azure App Configuration, the configuration provider automatically converts configuration settings to complex objects inside a `@ConfigurationProperties`. For example, consider the JSON key `/application/config.colors` with the following value:\n\n```json\n{\n    \"key\": \"font\",\n    \"label\": null,\n    \"value\": \"{\\r\\n\\t\\\"size\\\": 12,\\r\\n\\t\\\"color\\\": \\\"red\\\"\\r\\n}\",\n    \"content_type\": \"application/json\"\n}\n```\n\nThis JSON content results in the key-value being loaded as `{ size: 12, color: \"red\" }`.\n\n```java\n@ConfigurationProperties(prefix = \"config\")\npublic class MyConfigurations {\n\n    private Font font;\n\n}\n```\n\n> [!NOTE]\n> Starting with version *6.0.0* of `spring-cloud-azure-appconfiguration-config`, the configuration provider allows comments, as defined in ([JSONC](https://jsonc.org/)), in key-values with an `application/json` content type.\n\n### Key Vault references\n\nAzure App Configuration and its libraries support referencing secrets stored in Key Vault. In App Configuration, you can create keys with values that map to secrets stored in a Key Vault. Secrets remain secure in Key Vault, but you can access them in the same way as any other configuration when loading the app.\n\nYour application uses the client provider to retrieve Key Vault references, just as it does for any other keys stored in App Configuration. Because the client recognizes the keys as Key Vault references, they have a unique content-type, and the client connects to Key Vault to retrieve their values for you.\n\n> [!NOTE]\n> Key Vault only allows for secrets to be retrieved one at a time, so each Key Vault reference stored in App Configuration results in a pull against Key Vault.\n\n#### Creating Key Vault references\n\nYou can create a Key Vault reference in the Azure portal by going to **Configuration explorer** > **Create** > **Key Vault reference**. You can then select a secret to reference from any of the Key Vaults you have access to. You can also create arbitrary Key Vault references from the **Input** tab. In the Azure portal, enter a valid URI.\n\nYou can also create a Key Vault reference through the Azure CLI by using the following command:\n\n```azurecli\naz appconfig kv set-keyvault \\\n    --name <name-of-your-store> \\\n    --key <key-name> \\\n    --secret-identifier <URI-to-your-secret>\n```\n\nYou can create any secret-identifier through the Azure CLI. Secret identifiers just require the format `{vault}/{collection}/{name}/{version?}` where the version section is optional.\n\n#### Using Key Vault references\n\nYou can use [Spring Cloud Azure configuration](configuration.md) to configure the library. You can use the same credential used to connect to App Configuration to connect to Azure Key Vault.\n\nYou can also create a `SecretClientCustomizer` the same way as you would create a `ConfigurationClientCustomizer` to provide your own authentication method.\n\n#### Resolve non-Key Vault secrets\n\nThe App Configuration library provides a method to override the resolution of key vault references. For example, you can use it to locally resolve secrets in a dev environment. This resolution is done through the `KeyVaultSecretProvider`. The `KeyVaultSecretProvider`, if provided, is called on every key vault reference. If `getSecret` returns a non-null value, it's used as the secret value. Otherwise, the Key Vault Reference is resolved normally.\n\n```java\npublic class MySecretProvider implements KeyVaultSecretProvider {\n\n    @Override\n    public String getSecret(String uri) {\n        ...\n    }\n\n}\n```\n\n## Feature management\n\nFeature management provides a way for Spring Boot applications to dynamically access content. Feature management has various functions such as the following ones:\n\n- Feature flags that can enable or disable content\n- Feature filters for targeting when content is shown\n- Customized feature filters\n- Feature gates for dynamically enabling endpoints\n\nYou can enable feature flags through the following configuration:\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].feature-flags.enabled= true\n```\n\nEnabled feature flags are loaded into the Spring configuration system with the prefix `feature-management`. You can also register feature flags in the local configuration file. For more information, see the [Feature flag declaration](#feature-flag-declaration) section.\n\nThe easiest way to use feature management is by using the `spring-cloud-azure-feature-management` and `spring-cloud-azure-feature-management-web` libraries. The difference between the two libraries is that `spring-cloud-azure-feature-management-web` takes a dependency on the `spring-web` and `spring-webmvc` libraries to add more features, such as [feature gates](#routing).\n\nBy default, all feature flags with a `\\0` label, seen as `(No Label)`, are loaded. You can configure the feature flags that are loaded by setting a label filter, as shown in the following example:\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].feature-flags.selects[0].key-filter=A*\nspring.cloud.azure.appconfiguration.stores[0].feature-flags.selects[0].label-filter= dev\n```\n\n### Feature flag telemetry\n\nWhen feature flag telemetry is enabled, the Azure App Configuration provider injects additional properties to feature flag telemetry data. These properties provide more context about the feature flag and its evaluation:\n\n- **AllocationID**: A unique identifier representing the state of the feature flag's allocation.\n- **ETag**: The current ETag for the feature flag.\n- **FeatureFlagReference**: A reference to the feature flag in the format of `<your_store_endpoint>kv/<feature_flag_key>`. When a label is present, the reference includes it as a query parameter: `<your_store_endpoint>kv/<feature_flag_key>?label=<feature_flag_label>`.\n\n### Feature management basics\n\n#### Feature flags\n\nFeature flags are composed of multiple parts including a name and a list of feature-filters that are used to turn on the feature. Feature flags can either have a boolean state of on or off, or they can have a list of feature filters. Feature flags evaluate feature filters until one returns `true`. If no feature filter returns `true`, then the feature flag returns `false`.\n\n#### Feature filters\n\nFeature filters define a scenario for when a feature should be enabled. Feature filters are evaluated synchronously.\n\nThe feature management library comes with four predefined filters: [AlwaysOnFilter](#alwaysonfilter), [PercentageFilter](#percentagefilter), [TimeWindowFilter](#timewindowfilter), and [TargetingFilter](#targetingfilter).\n\nYou can create custom feature filters. For example, you can use a feature filter to provide a custom experience for customers who are using a Microsoft Edge browser. You can customize the features in this feature filter, for example, to show a specific header for the Microsoft Edge browser audience.\n\n#### Feature flag declaration\n\nThe feature management library supports Azure App Configuration along with **application.yml** or **application.properties** as sources for feature flags. Here's an example of the format used to set up feature flags in an **application.yml** file:\n\n```yaml\nfeature-management:\n  feature_flags:\n  - id: feature-t\n    enabled: false\n  - id: feature-u\n    conditions:\n      client_filters:\n      - name: Random\n  - id: feature-v\n    conditions:\n      client_filters:\n      - name: TimeWindowFilter\n        parameters:\n          Start: \"Wed, 01 May 2019 13:59:59 GMT\"\n          End: \"Mon, 01 July 2019 00:00:00 GMT\"\n\n  - id: feature-w\n    evaluate: false\n    conditions:\n      client_filters:\n      - name: AlwaysOnFilter\n```\n\nThis example has the following feature flags:\n\n- `feature-t` is set to `false`. This setting always returns the feature flag's value.\n- `feature-u` is used with feature filters. These filters are defined under the `enabled-for` property. In this case, `feature-u` has one feature filter called `Random`, which doesn't require any configuration, so only the name property is required.\n- `feature-v` specifies a feature filter named `TimeWindowFilter`. This feature filter can be passed parameters to use as configuration. In this example, a `TimeWindowFilter`, passes in the start and end times during which the feature is active.\n- `feature-w` is used for the `AlwaysOnFilter`, which always evaluates to `true`. The `evaluate` field is used to stop the evaluation of the feature filters, and results in the feature filter always returning `false`.\n\n### Evaluating feature flags\n\nThe `spring-cloud-azure-feature-management` library provides `FeatureManager` to determine whether a feature flag is enabled. `FeatureManager` provides an asynchronous way to check the state of the flag.\n\n`spring-cloud-azure-feature-management-web`, along with providing `FeatureManager`, contains `FeatureManagerSnapshot`, which caches the state of previously evaluated feature flags in the `@RequestScope` to guarantee that all requests return the same value. In addition, the web library provides `@FeatureGate`, which can either block or redirect web requests to different endpoints.\n\n#### Feature flag check\n\n`FeatureManager` is a `@Bean` that can be `@Autowired` or injected into `@Component` type objects. `FeatureManager` has a method `isEnabled` that, when passed the name of a feature flag, returns its state.\n\n```java\n@Autowired\nFeatureManager featureManager;\n\n...\n\nif (featureManager.isEnabled(\"feature-t\")) {\n    // Do Something\n}\n```\n\n> [!NOTE]\n> `FeatureManager` also has an asynchronous version of `isEnabled` called `isEnabledAsync`.\n\nWithout feature management configuration or when the feature flag doesn't exist, `isEnabled` always returns `false`. If an existing feature flag is configured with an unknown feature filter, then a `FilterNotFoundException` is thrown. You can change this behavior to return `false` by configuring `fail-fast` to `false`. The following table describes `fail-fast`:\n\n| Name                                              | Description                                                                                                                           | Required | Default |\n|---------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|----------|---------|\n| `spring.cloud.azure.feature.management.fail-fast` | If an exception occurs, a `RuntimeException` is thrown. If this property is set to `false`, then `isEnabled` returns `false` instead. | No       | `true`  |\n\nThe only difference between `FeatureManagerSnapshot` and `FeatureManager` is the caching of results in the `@RequestScope`.\n\n#### Feature gate\n\nWith the feature management web library, you can require that a given feature is enabled in order to execute an endpoint. You can set up this requirement by using the `@FeatureGate` annotation, as shown in the following example:\n\n```java\n@GetMapping(\"/featureT\")\n@FeatureGate(feature = \"feature-t\")\n@ResponseBody\npublic String featureT() {\n    ...\n}\n```\n\nYou can only access the `featureT` endpoint if \"feature-t\" is enabled.\n\n##### Disabled action handling\n\nWhen an endpoint is blocked because the feature it specifies is disabled, `DisabledFeaturesHandler` is invoked. By default, an HTTP 404 is returned. You can override this behavior by implementing `DisabledFeaturesHandler`, as shown in the following example:\n\n```java\n@Component\npublic class MyDisabledFeaturesHandler implements DisabledFeaturesHandler {\n\n    @Override\n    public HttpServletResponse handleDisabledFeatures(HttpServletRequest request, HttpServletResponse response) {\n        ...\n        return response;\n    }\n\n}\n```\n\n##### Routing\n\nFeatures might gate certain routes that expose application capabilities. If a feature is disabled, you can redirect these routes to another endpoint, as shown in the following example:\n\n```java\n@GetMapping(\"/featureT\")\n@FeatureGate(feature = \"feature-t\" fallback= \"/oldEndpoint\")\n@ResponseBody\npublic String featureT() {\n    ...\n}\n\n@GetMapping(\"/oldEndpoint\")\n@ResponseBody\npublic String oldEndpoint() {\n    ...\n}\n```\n\n### Built-in feature filters\n\nThere are a few feature filters that come with the `spring-cloud-azure-feature-management` package. These feature filters are added automatically.\n\n#### AlwaysOnFilter\n\nThis filter always returns `true`. For a usage example, see the [feature flag declaration](#feature-flag-declaration) section.\n\n#### PercentageFilter\n\n`PercentageFilter` can return a different result on each check. You can circumvent this inconsistency by using `FeatureManagementSnapshot`, which caches the result of the feature flag per request.\n\n```yaml\nfeature-management:\n  feature_flags:\n  - name: feature-v\n    conditions:\n      client_filters:\n      - name: PercentageFilter\n        parameters:\n          Value: 50\n```\n\n#### TimeWindowFilter\n\nThis filter provides the capability to enable a feature based on a time window. If you specify only `End`, the feature is considered on until that time. If you specify only `Start`, the feature is considered on at all points after that time. If you specify both, the feature is considered valid between the two times.\n\n```yaml\nfeature-management:\n  feature_flags:\n  - name: feature-v\n    conditions:\n      client_filters:\n      - name: TimeWindowFilter\n        parameters:\n          Start: \"Wed, 01 May 2019 13:59:59 GMT\"\n          End: \"Mon, 01 July 2019 00:00:00 GMT\"\n```\n\nThis filter also supports recurring time window filters. It supports both daily and weekly recurrences, along with an expiration time.\n\n```yaml\nfeature-management:\n  feature_flags:\n  - name: feature-v\n    conditions:\n      client_filters:\n      - name: TimeWindowFilter\n        parameters:\n          Start: \"Mon, 01 July 2019 00:00:00 GMT\"\n          End: \"Mon, 01 July 2019 12:00:00 GMT\"\n          Recurrence:\n            Pattern:\n              Type: Weekly\n              Interval: 1\n              FirstDayOfWeek: Sunday\n              DaysOfWeek:\n              - Monday\n              - Wednesday\n```\n\nThis recurrence pattern happens every week on Monday and Wednesday from 00:00:00 GMT to 12:00:00 GMT and doesn't expire.\n\n```yaml\nfeature-management:\n  feature_flags:\n  - name: feature-v\n    conditions:\n      client_filters:\n      - name: TimeWindowFilter\n        parameters:\n          Start: \"Mon, 01 July 2019 00:00:00 GMT\"\n          End: \"Mon, 01 July 2019 12:00:00 GMT\"\n          Recurrence:\n            Pattern:\n              Type: Daily\n              Interval: 2\n            Range:\n              Type: EndDate\n              EndDate: \"Fri, 15 Aug 2025 07:00:00 GMT\"\n```\n\nThis recurrence pattern happens every other day from 00:00:00 GMT to 12:00:00 GMT until the end date.\n\n#### TargetingFilter\n\nThis filter provides the capability to enable a feature for a target audience. For an in-depth explanation of targeting, see the [targeting section](#targeting) section. The filter parameters include an audience object that describes users, groups, and a default percentage of the user base that should have access to the feature. For each group object that is listed in the target audience, a percentage is required that defines the percentage of that group's members that have access to the feature. A user has the feature enabled in the following cases:\n\n- The user is specified in the users' section directly.\n- The user is in the included percentage of any of the group rollouts.\n- The user falls into the default rollout percentage.\n\n```yaml\nfeature-management:\n  feature_flags:\n  - name: target\n    conditions:\n      client_filters:\n      - name: targetingFilter\n        parameters:\n          users:\n          - Jeff\n          - Alicia\n          groups:\n          - name: Ring0\n            rollout-percentage: 100\n          - name: Ring1\n            rolloutPercentage: 100\n          default-rollout-percentage: 50\n```\n\n### Custom feature filters\n\nCreating a custom feature filter provides a way to enable features based on criteria that you define. To create a custom feature filter, you must implement the `FeatureFilter` interface. `FeatureFilter` has a single method `evaluate`. When a feature specifies that it can be enabled with a feature filter, the `evaluate` method is called. If `evaluate` returns `true`, it means that the feature should be enabled. If it returns `false`, it continues evaluating feature filters until one returns `true`. If all filters return `false`, then the feature is off.\n\nFeature filters are defined as Spring Beans, so they're either defined as `@Component` or defined in a `@Configuration`.\n\n```java\n@Component(\"Random\")\npublic class Random implements FeatureFilter {\n\n    @Override\n    public boolean evaluate(FeatureFilterEvaluationContext context) {\n        double chance = Double.valueOf((String) context.getParameters().get(\"chance\"));\n        return Math.random() > chance / 100;\n    }\n\n}\n```\n\n#### Parameterized feature filters\n\nSome feature filters require parameters to determine whether a feature should be turned on. For example, a browser feature filter might turn on a feature for a certain set of browsers. You might want a feature enabled for Microsoft Edge and Chrome browsers, but not Firefox. To set up this situation, you can design a feature filter to expect parameters. These parameters would be specified in the feature configuration and in code, and would be accessible via the `FeatureFilterEvaluationContext` parameter of `evaluate`. `FeatureFilterEvaluationContext` has a property `parameters`, which is a `Map<String, Object>`.\n\n### Targeting\n\nTargeting is a feature management strategy that enables developers to progressively roll out new features to their user base. The strategy is built on the concept of targeting a set of users known as the target audience. An audience is made up of specific users, groups, and a designated percentage of the entire user base. The groups that are included in the audience can be broken down further into percentages of their total members.\n\nThe following steps demonstrate an example of a progressive rollout for a new 'Beta' feature:\n\n1. Individual users Jeff and Alicia are granted access to the Beta.\n1. Another user, Mark, asks to opt in and is included.\n1. Twenty percent of a group known as \"Ring1\" users are included in the Beta.\n1. The number of \"Ring1\" users included in the beta is bumped up to 100 percent.\n1. Five percent of the user base is included in the beta.\n1. The rollout percentage is bumped up to 100 percent and the feature is completely rolled out.\n\nThis strategy for rolling out a feature is built into the library through the included `TargetingFilter` feature filter.\n\n#### Targeting in an application\n\nAn example web application that uses the targeting feature filter is available in the [example project](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/appconfiguration).\n\nTo begin using the `TargetingFilter` in an application, you must add it as a `@Bean` like any other feature filter. `TargetingFilter` relies on another `@Bean` to be added to the application `TargetingContextAccessor`. The `TargetingContextAccessor` allows for defining the current `TargetingContext` to be used for defining the current user ID and groups, as shown in the following example:\n\n```java\npublic class MyTargetingContextAccessor implements TargetingContextAccessor {\n\n    @Override\n    public void configureTargetingContext(TargetingContext context) {\n        context.setUserId(\"Jeff\");\n        ArrayList<String> groups = new ArrayList<String>();\n        groups.add(\"Ring0\");\n        context.setGroups(groups);\n    }\n\n}\n```\n\n#### Targeting evaluation options\n\nOptions are available to customize how targeting evaluation is performed across a given `TargetingFilter`. You can set an optional parameter, `TargetingEvaluationOptions`, during the `TargetingFilter` creation.\n\n```java\n    @Bean\n    public TargetingFilter targetingFilter(MyTargetingContextAccessor contextAccessor) {\n        return new TargetingFilter(contextAccessor, new TargetingEvaluationOptions().setIgnoreCase(true));\n    }\n```\n\n## Configuration refresh\n\nEnabling config refresh for your configurations lets you pull their latest values from your App Configuration store or stores without having to restart the application.\n\nTo enable refresh, you need to enable monitoring along with monitoring triggers. A monitoring trigger is a key with an optional label that the system monitors for value changes to trigger updates. The value of the monitoring trigger can be any value, as long as it changes when a refresh is needed.\n\n> [!NOTE]\n> Any operation that changes the ETag of a monitoring trigger causes a refresh, such as a content-type change.\n\n```yml\nspring:\n  cloud:\n    azure:\n      appconfiguration:\n        stores:\n        - monitoring:\n          enabled: true\n          triggers:\n          - key: [my-watched-key]\n            label: [my-watched-label]\n```\n\nTo trigger a configuration refresh, change the value of a key in your configuration store. Then, update one of watch keys to a new value. This change triggers the creation of a log. For example, changing the value of `/application/config.message` triggers the following log message:\n\n```output\nINFO 17496 --- [TaskScheduler-1] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [config.message]\n```\n\nAfter the application generates the log, it refreshes all `@Bean`s in the refresh scope.\n\n> [!NOTE]\n> By default, `@ConfigurationProperties` annotated beans are included in this scope.\n\n### Pull-based refresh\n\nThe App Configuration Spring libraries support the ability to periodically check on a refresh interval for changes made to the monitoring triggers. By default, the refresh interval is set to 30 seconds. After the refresh interval passes, when a refresh attempt is made, all triggers are checked in the given store for changes. Any change to the key causes a refresh to trigger. Because the libraries integrate with the Spring refresh system, any refresh reloads all configurations from all stores. You can set the refresh interval to any interval longer than 1 second. The supported units for the refresh interval are `s`, `m`, `h`, and `d` for seconds, minutes, hours, and days respectively. The following example sets the refresh interval to 5 minutes:\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].monitoring.refresh-interval= 5m\n```\n\n#### Automated\n\nWhen you use the `spring-cloud-azure-appconfiguration-config-web` library, the application automatically checks for a refresh whenever a servlet request occurs, specifically `ServletRequestHandledEvent`. The most common way this event is sent is by requests to endpoints in a `@RestController`.\n\n#### Manual\n\nIn applications that use only `spring-cloud-azure-appconfiguration-config`, such as console applications, you can manually trigger a refresh by calling `AppConfigurationRefresh`'s `refreshConfiguration` method. `AppConfigurationRefresh` is a `@Bean` that you can inject into any `@Component`.\n\nAlso, because the library uses Spring's configuration system, triggering a refresh causes a refresh of all of your configurations, not just a reload of the ones from your Azure App Configuration store.\n\n### Push-based refresh (not recommended)\n\n> [!NOTE]\n> This method is no longer recommended, but is currently still supported.\n\nYou can set up the `spring-cloud-azure-appconfiguration-config-web` library to receive push notifications from your Azure App Configuration store to refresh your configuration values. You can set up this configuration through an Azure Event Grid Web Hook, which you can configure to send notifications of changes to specified keys. By adding the Spring Actuator library as a dependency, you can expose App Configuration's refresh endpoints. There are two different endpoints: `appconfiguration-refresh` and `appconfiguration-refresh-bus`. These endpoints work similarly to their counterparts `refresh` and `refresh-bus`, where the app configuration endpoints expire the refresh interval instead of forcing a refresh upon receiving. You can still use the `refresh` and `refresh-bus`, but you can't connect them directly to Azure Event Grid with a Web Hook because they require a response in setup.\n\nThe `appconfiguration-refresh` property expires the refresh interval, so the remaining refresh interval isn't waited on before the next refresh check. The `appconfiguration-refresh-bus` property sends a notification to a connected messaging service, such as Azure Service Bus, to notify all instances of an application to refresh. In both cases, it doesn't completely expire at the refresh interval, but is off by a small jitter amount. This jitter ensures that every instance of your application doesn't try to refresh at the same time.\n\n```properties\nmanagement.endpoints.web.exposure.include= appconfiguration-refresh, appconfiguration-refresh-bus\n```\n\nIn addition to exposing the refresh endpoints, the library requires a query parameter for security. No token name or value exists by default, but you must set one to use the endpoints, as shown in the following example:\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.primary-token.name=[primary-token-name]\nspring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.primary-token.secret=[primary-token-secret]\nspring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.secondary-token.name=[secondary-token-name]\nspring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.secondary-token.secret=[secondary-token-secret]\n```\n\n#### Setting up web hooks\n\nTo set up a web hook, open your Azure App Configuration store and open **Events** from the navigation menu. Then, select **Event Subscription**. Set the name of your event and select the endpoint type to be Web Hook. Selecting Web Hook causes an **Endpoint** option to appear. Select **Select an endpoint**. Your endpoint should look like the following example: `https://www.myaplication.com/actuator/appconfiguration-refresh?myTokenName=mySecret`.\n\n**Confirm Selection** sends a setup notification to the given URI and it expects a response. If no response is returned, the setup fails. The `azure-spring-cloud-appconfiguration-web` library setup for endpoints returns the correct response if the Azure App Configuration store is configured for the application. This confirmation can be sent in other ways. For more information about web hook delivery, see [Webhook event delivery](/azure/event-grid/webhook-event-delivery).\n\n> [!NOTE]\n> This validation happens only upon the creation or modification of the endpoint.\n\nWe highly recommend that you set up filters because otherwise, a refresh is triggered after every key creation and modification.\n\n### Forced client refresh\n\nYou can configure the library to force a refresh of all configurations at a refresh interval. The following table describes the `refresh-interval` property:\n\n| Name                                                   | Description                                                     | Required | Default |\n|--------------------------------------------------------|-----------------------------------------------------------------|----------|---------|\n| `spring.cloud.azure.appconfiguration.refresh-interval` | The standard amount of time between refreshes. Is a `Duration`. | No       | null    |\n\nRefreshing with `spring.cloud.azure.appconfiguration.refresh-interval` doesn't check any configured watch keys. This property is used to make sure Key Vault secrets are kept up to date because Azure App Configuration can't tell when they're updated.\n\nBecause Azure Key Vault stores the public and private key pair of a certificate as a secret, your application can retrieve any certificate as a [Key Vault reference](#key-vault-references) in App Configuration. Because certificates need to be rotated periodically, client applications need to update just as frequently, which can be done by using the client refresh interval.\n\n### Feature flag refresh\n\nIf feature flags and monitoring are both enabled, then by default the refresh interval for feature flags is set to 30 seconds. When the refresh interval ends, the system checks all feature flags in the given store for changes. Any change to the key causes a refresh to trigger. Because the libraries integrate with the Spring refresh system, any refresh reloads all configurations from all stores. You can set the refresh interval to any interval longer than 1 second. The supported units for the refresh interval are `s`, `m`, `h`, and `d` for seconds, minutes, hours, and days respectively. The following example sets the refresh interval to 5 minutes:\n\n```properties\nspring.cloud.azure.appconfiguration.stores[0].monitoring.feature-flag-refresh-interval= 5m\n```\n\n## Health indicator\n\nThe client library comes with a health indicator that checks whether the connection to the Azure App Configuration store or stores is healthy. If enabled for each store, it gives one of the following status values:\n\n- UP - The last connection was successful.\n- DOWN- The last connection resulted in a non-200 error code. This status could be due to issues ranging from credentials expiring to a service issue. The client library automatically retries to connect to the store at the next refresh interval.\n- NOT LOADED - The config store is listed in the local configuration file, but the config store wasn't loaded from the file at startup. The config store is disabled in the configuration file or the configuration or configurations failed to load at startup while the `fail-fast` configuration for the store was set to `false`.\n\nYou can enable the health indicator by setting `management.health.azure-app-configuration.enabled=true`.\n\n## Client customization\n\nThe App Configuration library uses the [Azure SDK for Java](https://github.com/Azure/azure-sdk-for-java) for connecting to Azure App Configuration and Azure Key Vault. Two interfaces, `ConfigurationClientCustomizer` and `SecretClientCustomizer`, are provided to modify the clients. Each interface has a `customize` method that takes in their respective builder along with the `String` value of the URI the client is being configured for, as shown in the following interface definitions:\n\n```java\npublic interface ConfigurationClientCustomizer {\n    public void customize(ConfigurationClientBuilder builder, String endpoint);\n}\n\npublic interface SecretClientCustomizer {\n    public void customize(SecretClientBuilder builder, String endpoint);\n}\n```\n\nThese interfaces allow for customization of the HTTP client and its configurations. The following example replaces the default `HttpClient` with another one that uses a proxy for all traffic directed to App Configuration and Key Vault.\n\n> [!NOTE]\n> The `ConfigurationClientBuilder` and `SecretClientBuilder` are already set up for use when passed into `customize`. Any changes to the clients, including the credentials and retry policy, override the defaults already in place.\n>\n> You can also do this configuration by using [Spring Cloud Azure configuration](configuration.md).\n\n```java\npublic class CustomClient implements ConfigurationClientCustomizer, SecretClientCustomizer {\n\n    @Override\n    public void customize(ConfigurationClientBuilder builder, String endpoint) {\n        builder.httpClient(buildHttpClient());\n    }\n\n    @Override\n    public void customize(SecretClientBuilder builder, String endpoint) {\n        builder.httpClient(buildHttpClient());\n    }\n\n    private HttpClient buildHttpClient() {\n        String hostname = System.getProperty(\"https.proxyHosts\");\n        String portString = System.getProperty(\"https.proxyPort\");\n        int port = Integer.valueOf(portString);\n\n        ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP,\n                new InetSocketAddress(hostname, port));\n        return new NettyAsyncHttpClientBuilder()\n                .proxy(proxyOptions)\n                .build();\n    }\n\n}\n```\n"
  },
  {
    "path": "articles/java/spring-framework/authentication.md",
    "content": "---\ntitle: Spring Cloud Azure authentication\ndescription: This reference doc contains all Spring Cloud Azure authentication methods.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure authentication\n\nThis article describes all the Spring Cloud Azure authentication methods.\n\n<a name='authentication-and-authorization-with-azure-active-directory'></a>\n\n## Authentication and authorization with Microsoft Entra ID\n\nWith Microsoft Entra ID, you can use Azure role-based access control (Azure RBAC) to grant permissions to a security principal, which may be a user or an application service principal. When a security principal (a user or an application) attempts to access an Azure resource, for example an Event Hubs resource, the request must be authorized. With Microsoft Entra ID, access to a resource is a two-step process:\n\n1. First, the security principal's identity is authenticated, and an OAuth 2.0 token is returned.\n1. Next, the token is passed as part of a request to the Azure service to authorize access to the specified resource.\n\n### Credential types\n\nSpring Cloud Azure enables you to configure different credential types for authentication, including `DefaultAzureCredential`, `WorkloadIdentityCredential`, `ManagedIdentityCredential`, `ClientSecretCredential`, `AzureCliCredential`, and so on.\n\n#### DefaultAzureCredential\n\n`DefaultAzureCredential` is appropriate for most scenarios where the application is intended to run in the Azure Cloud, because it combines the following credentials:\n\n- Credentials commonly used to authenticate when deployed.\n- Credentials used to authenticate in a development environment.\n\n> [!NOTE]\n> `DefaultAzureCredential` is intended to simplify getting started with the Azure SDK by handling common scenarios with reasonable default behaviors. If you want more control or the default settings don't support your scenario, you should use other credential types.\n\n`DefaultAzureCredential` attempts to authenticate via the following mechanisms in order:\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/default-azure-credential-authentication.png\" alt-text=\"Diagram showing the authentication mechanism for `DefaultAzureCredential`.\" border=\"false\":::\n\n* Environment - `DefaultAzureCredential` tries to read account information specified via environment variables and use it to authenticate.\n* Managed Identity - If the application is deployed to an Azure host with Managed Identity enabled, `DefaultAzureCredential` tries to authenticate with that account.\n* Workload Identity - If the application is deployed to a virtual machines (VM), `DefaultAzureCredential` tries to authenticate with that account.\n* Shared Token Cache - If you authenticated via Visual Studio, `DefaultAzureCredential` tries to authenticate with that account.\n* IntelliJ - If you authenticated via Azure Toolkit for IntelliJ, `DefaultAzureCredential` tries to authenticate with that account.\n* Azure CLI - If you authenticated an account via the Azure CLI `az login` command, `DefaultAzureCredential` tries to authenticate with that account.\n* Azure PowerShell - If you authenticated via Azure PowerShell, `DefaultAzureCredential` tries to authenticate with that account.\n* Azure Developer CLI - If you authenticated via the Azure Developer CLI, `DefaultAzureCredential` tries to authenticate with that account.\n\n> [!TIP]\n> Be sure the security principal has sufficient permission to access the Azure resource. For more information, see [Authorize access with Microsoft Entra ID](#authorize-access-with-microsoft-entra-id).\n\n> [!NOTE]\n> Since Spring Cloud Azure AutoConfigure 4.1.0, you must register a `ThreadPoolTaskExecutor` bean named `springCloudAzureCredentialTaskExecutor` to manage all threads created by Azure Identity. The name of each thread managed by this thread pool is prefixed with `az-identity-`. This `ThreadPoolTaskExecutor` bean is independent of the `Executor` bean provided by Spring Boot.\n\n#### Managed identities\n\nA common challenge is the management of secrets and credentials used to secure communication between different components making up a solution. Managed identities eliminate the need to manage credentials. Managed identities provide an identity for applications to use when connecting to resources that support Microsoft Entra authentication. Applications may use the managed identity to obtain Microsoft Entra tokens. For example, an application may use a managed identity to access resources like Azure Key Vault where you can store credentials in a secure manner or to access storage accounts.\n\nWe encourage using managed identity instead of using connection string or key in your application because it's more secure and saves the trouble of managing secrets and credentials. In this case, `DefaultAzureCredential` could better serve the scenario of developing locally using account information stored locally, then deploying the application to Azure Cloud and using managed identity.\n\n##### Managed identity types\n\nThere are two types of managed identities:\n\n* *System-assigned* - Some Azure services allow you to enable a managed identity directly on a service instance. When you enable a system-assigned managed identity, an identity is created in Microsoft Entra that's bound to the lifecycle of that service instance. So when the resource is deleted, Azure automatically deletes the identity for you. By design, only that Azure resource can use this identity to request tokens from Microsoft Entra ID.\n* *User-assigned* - You may also create a managed identity as a standalone Azure resource. You can create a user-assigned managed identity and assign it to one or more instances of an Azure service. With user-assigned managed identities, the identity is managed separately from the resources that use it.\n\n> [!NOTE]\n> When using a user-assigned managed identity, you can specify the client ID via `spring.cloud.azure.credential.client-id` or `spring.cloud.azure.<azure-service>.credential.client-id`. You don't need credential configuration if you use a system-assigned managed identity.\n\n> [!TIP]\n> In order to access the Azure resource, be sure the security principal has sufficient permission. For more information, see [Authorize access with Microsoft Entra ID](#authorize-access-with-microsoft-entra-id).\n\nFor more information about managed identity, see [What are managed identities for Azure resources?](/azure/active-directory/managed-identities-azure-resources/overview).\n\n#### Other credential types\n\nIf you want more control than what's provided by `DefaultAzureCredential`, or the default settings don't support your scenario, you should use other credential types.\n\n<a name='authenticate-with-microsoft-entra-id'></a>\n\n### Authenticate with Microsoft Entra ID\n\nTo connect applications to resources that support Microsoft Entra authentication, you can set the following configurations with the prefix `spring.cloud.azure.credential` or `spring.cloud.azure.<azure-service>.credential`\n\nThe following table lists authentication properties:\n\n| Property                      | Description                                                                                        |\n|-------------------------------|----------------------------------------------------------------------------------------------------|\n| `client-id`                   | The client ID to use when performing service principal authentication with Azure.                  |\n| `client-secret`               | The client secret to use when performing service principal authentication with Azure.              |\n| `client-certificate-path`     | Path of a PEM certificate file to use when performing service principal authentication with Azure. |\n| `client-certificate-password` | The password of the certificate file.                                                              |\n| `username`                    | The username to use when performing username/password authentication with Azure.                   |\n| `password`                    | The password to use when performing username/password authentication with Azure.                   |\n| `managed-identity-enabled`    | Whether to enable managed identity.                                                                |\n| `token-credential-bean-name`  | The bean name of type `TokenCredential` to use when performing authentication with Azure.          |\n\n> [!TIP]\n> For the list of all Spring Cloud Azure configuration properties, see [Spring Cloud Azure configuration properties](configuration-properties-all.md).\n\nThe application looks in several places to find an available credential. Each Azure SDK client builder factory adopts a custom bean of type `TokenCredential` first if the property `token-credential-bean-name` is specified, and falls back to use `DefaultAzureCredential` if no credential properties are configured.\n\n#### Authenticate using a customized TokenCredential bean\n\nThe following example shows you how to define a custom `TokenCredential` bean to do the authentication:\n\n```java\n@Bean\nTokenCredential myTokenCredential() {\n    // Your concrete TokenCredential instance\n}\n```\n\n```yaml\nspring.cloud.azure:\n  credential:\n    token-credential-bean-name: myTokenCredential\n```\n\n#### Authenticate using a system-assigned managed identity\n\nThe following example shows you how to authenticate using a system-assigned managed identity:\n\n```yaml\nspring.cloud.azure:\n  credential:\n    managed-identity-enabled: true\n```\n\n#### Authenticate using a user-assigned managed identity\n\nThe following example shows you how to authenticate using a user-assigned managed identity:\n\n```yaml\nspring.cloud.azure:\n  credential:\n    managed-identity-enabled: true\n    client-id: ${AZURE_CLIENT_ID}\n```\n\n#### Authenticate using a service principal with client secret\n\nThe following example shows you how to authenticate using a service principal with a client secret:\n\n```yaml\nspring.cloud.azure:\n  credential:\n    client-id: ${AZURE_CLIENT_ID}\n    client-secret: ${AZURE_CLIENT_SECRET}\n  profile:\n    tenant-id: <tenant>\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider doesn't exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n#### Authenticate using a service principal with client certificate\n\nThe following example shows you how to authenticate using a service principal with a client PFX certificate:\n\n```yaml\nspring.cloud.azure:\n  credential:\n    client-id: ${AZURE_CLIENT_ID}\n    client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}\n    client-certificate-password: ${AZURE_CLIENT_CERTIFICATE_PASSWORD}\n  profile:\n    tenant-id: <tenant>\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider doesn't exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nThe following example shows you how to authenticate using a service principal with client PEM certificate:\n\n```yaml\nspring.cloud.azure:\n  credential:\n    client-id: ${AZURE_CLIENT_ID}\n    client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}\n  profile:\n    tenant-id: <tenant>\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider doesn't exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n#### Authenticate using a user credential\n\nThe following example shows you how to authenticate using a user credential:\n\n```yaml\nspring.cloud.azure:\n  credential:\n    client-id: ${AZURE_CLIENT_ID}\n    username: ${AZURE_USER_USERNAME}\n    password: ${AZURE_USER_PASSWORD}\n```\n\n#### Authenticate a service using a different credential from others\n\nThe following example shows you how to authenticate with Key Vault using a different service principal. This example configures the application with two credentials: one system-assigned managed identity and one service principal. The Key Vault Secret client uses the service principal, but any other components use managed identity instead.\n\n```yaml\nspring.cloud.azure:\n  credential:\n    managed-identity-enabled: true\n  keyvault.secret:\n    credential:\n      client-id: ${AZURE_CLIENT_ID}\n      client-secret: ${AZURE_CLIENT_SECRET}\n    profile:\n      tenant-id: <tenant>\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider doesn't exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n<a name='authorize-access-with-microsoft-entra-id'></a>\n\n### Authorize access with Microsoft Entra ID\n\nThe authorization step requires that one or more Azure roles be assigned to the security principal. The roles that are assigned to a security principal determine the permissions that the principal has.\n\n> [!TIP]\n> For the list of all Azure built-in roles, see [Azure built-in roles](/azure/role-based-access-control/built-in-roles).\n\nThe following table lists the Azure built-in roles for authorizing access to Azure services supported in Spring Cloud Azure:\n\n| Role                                                                                                               | Description                                                                                               |\n|--------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|\n| [App Configuration Data Owner](/azure/role-based-access-control/built-in-roles#app-configuration-data-owner)       | Allows full access to App Configuration data.                                                             |\n| [App Configuration Data Reader](/azure/role-based-access-control/built-in-roles#app-configuration-data-reader)     | Allows read access to App Configuration data.                                                             |\n| [Azure Event Hubs Data Owner](/azure/role-based-access-control/built-in-roles#azure-event-hubs-data-owner)         | Allows full access to Azure Event Hubs resources.                                                         |\n| [Azure Event Hubs Data Receiver](/azure/role-based-access-control/built-in-roles#azure-event-hubs-data-receiver)   | Allows receive access to Azure Event Hubs resources.                                                      |\n| [Azure Event Hubs Data Sender](/azure/role-based-access-control/built-in-roles#azure-event-hubs-data-send)         | Allows send access to Azure Event Hubs resources.                                                         |\n| [Azure Service Bus Data Owner](/azure/role-based-access-control/built-in-roles#azure-service-bus-data-owner)       | Allows full access to Azure Service Bus resources.                                                        |\n| [Azure Service Bus Data Receiver](/azure/role-based-access-control/built-in-roles#azure-service-bus-data-receiver) | Allows receive access to Azure Service Bus resources.                                                     |\n| [Azure Service Bus Data Sender](/azure/role-based-access-control/built-in-roles#azure-service-bus-data-sender)     | Allows send access to Azure Service Bus resources.                                                        |\n| [Storage Blob Data Owner](/azure/role-based-access-control/built-in-roles#storage-blob-data-owner)                 | Provides full access to Azure Storage blob containers and data, including assigning POSIX access control. |\n| [Storage Blob Data Reader](/azure/role-based-access-control/built-in-roles#storage-blob-data-reader)               | Read and list Azure Storage containers and blobs.                                                         |\n| [Storage Queue Data Reader](/azure/role-based-access-control/built-in-roles#storage-queue-data-reader)             | Read and list Azure Storage queues and queue messages.                                                    |\n| [Redis Cache Contributor](/azure/role-based-access-control/built-in-roles#redis-cache-contributor)                 | Manage Redis caches.                                                                                      |\n\n> [!NOTE]\n> When using Spring Cloud Azure Resource Manager to get the connection strings for Event Hubs, Service Bus, and Storage Queue, or the properties of Cache for Redis, assign the Azure built-in role `Contributor`. Azure Cache for Redis is special, and you can also assign the `Redis Cache Contributor` role to get the Redis properties.\n\n> [!NOTE]\n> A Key Vault access policy determines whether a given security principal, namely a user, application or user group, can perform different operations on Key Vault secrets, keys, and certificates. You can assign access policies using the Azure portal, the Azure CLI, or Azure PowerShell. For more information, see [Assign a Key Vault access policy](/azure/key-vault/general/assign-access-policy).\n\n> [!IMPORTANT]\n> Azure Cosmos DB exposes two built-in role definitions: `Cosmos DB Built-in Data Reader` and `Cosmos DB Built-in Data Contributor`. However, Azure portal support for role management isn't available yet. For more information about the permission model, role definitions, and role assignment, see [Configure role-based access control with Microsoft Entra ID for your Azure Cosmos DB account](/azure/cosmos-db/how-to-setup-rbac).\n\n## Authenticate using SAS tokens\n\nYou can also configure services for authentication with Shared Access Signature (SAS). `spring.cloud.azure.<azure-service>.sas-token` is the property to configure. For example, use `spring.cloud.azure.storage.blob.sas-token` to authenticate to Storage Blob service.\n\n## Authenticate using connection strings\n\nSome Azure services support connection string to provide connection information and credentials. To connect to those Azure services using connection string, just configure `spring.cloud.azure.<azure-service>.connection-string`. For example, configure `spring.cloud.azure.eventhubs.connection-string` to connect to the Event Hubs service.\n"
  },
  {
    "path": "articles/java/spring-framework/auto-configure-azure-sdk-clients.md",
    "content": "---\ntitle: Spring Cloud Azure Auto-configure Azure SDK clients\ndescription: This reference doc contains Spring Cloud Azure how to Auto-configure Azure SDK clients.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Auto-configure Azure SDK clients\n\nSpring Boot simplifies the Spring Cloud Azure development experience. Spring Cloud Azure starters are a set of convenient dependency descriptors to include in your application. The starters handle the object instantiation and configuration logic, so you don't have to. Every starter depends on `spring-cloud-azure-starter` to provide critical bits of configuration, like the Azure cloud environment and authentication information. You can configure these as properties in, for example, a YAML file, as shown in the following example:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      profile:\n        tenant-id: <tenant>\n        cloud-type: Azure\n      credential:\n        client-id: ${AZURE_CLIENT_ID}\n```\n\n> [!NOTE]\n> The `cloud` property is optional.\n>\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nThese properties are optional and, if not specified, Spring Boot will try to automatically find them for you. For details on how Spring Boot finds these properties, refer to the documentation.\n\n## Dependency setup\n\nThere are two ways to use Spring Cloud Azure starters. The first way is to use Azure SDKs with the `spring-cloud-azure-starter` dependency as shown in the following example:\n\n```xml\n<dependency>\n  <groupId>com.azure</groupId>\n  <artifactId>azure-cosmos</artifactId>\n</dependency>\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n</dependency>\n```\n\nThe second way is to avoid adding Azure SDK dependencies and instead include the Spring Cloud Azure Starter for each Service directly. For example, with Azure Cosmos DB, you would add the following dependency:\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-cosmos</artifactId>\n</dependency>\n```\n\n> [!TIP]\n> For the list of supported starters, see the [Starter dependencies](developer-guide-overview.md#starter-dependencies) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n## Configuration\n\n> [!NOTE]\n> If you use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, be sure the security principal has been granted sufficient permission to access the Azure resource. For more information, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id).\n\nConfiguration properties for each Azure service are under prefix `spring.cloud.azure.<azure-service>`.\n\n> [!TIP]\n> For the list of all Spring Cloud Azure configuration properties, see [Spring Cloud Azure configuration properties](configuration-properties-all.md).\n\n## Basic usage\n\nAdding the following properties to your **application.yaml** file will autoconfigure the Azure Cosmos DB client for you.\n\n```yaml\nspring:\n  cloud:\n    azure:\n      cosmos:\n        database: ${AZURE_COSMOS_DATABASE_NAME}\n        endpoint: ${AZURE_COSMOS_ENDPOINT}\n        consistency-level: eventual\n        connection-mode: direct\n```\n\nThen, both `CosmosClient` and `CosmosAsyncClient` are available in the context and can be autowired, as shown in the following example:\n\n```java\nclass Demo {\n@Autowired\nprivate CosmosClient cosmosClient;\n\n    @Override\n    public void run() {\n        User item = User.randomUser();\n        CosmosContainer container = cosmosClient.getDatabase(databaseName).getContainer(containerName);\n        container.createItem(item);\n    }\n}\n```\n\n## Samples\n\nSee the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-all.md",
    "content": "---\ntitle: Spring Cloud Azure configuration properties\ndescription: This reference doc contains all Spring Cloud Azure configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Spring Cloud Azure configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                                              | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> |---------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.active-directory.app-id-uri`                                                                                        | App ID URI that might be used in the `aud` claim of an `id_token`. For instance, `api://{applicationId}`. See Microsoft doc about APP ID URL for more [details](/azure/active-directory/develop/security-best-practices-for-app-registration#application-id-uri).                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.active-directory.application-type`                                                                                  | The type of the Microsoft Entra application. Supported types are: `WEB_APPLICATION`, `RESOURCE_SERVER`, `RESOURCE_SERVER_WITH_OBO`, `WEB_APPLICATION_AND_RESOURCE_SERVER`. The value can be inferred by dependencies, only `web_application_and_resource_server` must be configured manually.                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.active-directory.authenticate-additional-parameters`                                                                | Additional parameters above the standard parameters defined in the OAuth 2.0 Authorization Framework. Would be added to the Authorization URL for customizing the Authorization Request. For instance, `prompt: login`. See Microsoft doc about more additional parameters [information](/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code).                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.active-directory.authorization-clients`                                                                             | The OAuth2 authorization clients, contains the authorization grant type, client authentication method and scope. The clients will be converted to OAuth2 `ClientRegistration`, the other `ClientRegistration` information(such as client id, client secret) inherits from the delegated OAuth2 login client `azure`. For instance, `authorization-clients.webapi.authorization-grant-type=on_behalf_of`, `authorization-clients.webapi.client-authentication-method=client_secret_post`, `authorization-clients.webapi.scopes[0]={WEB_API_APP_ID_URL}/WebApi.ExampleScope1`, `authorization-clients.webapi.scopes[0]={WEB_API_APP_ID_URL}/WebApi.ExampleScope2`. |\n> | `spring.cloud.azure.active-directory.b2c.app-id-uri`                                                                                    | App ID URI that might be used in the `aud` claim of a token. For instance, `https://{hostname}/{applicationId}`. See Microsoft doc about APP ID URL for more [details](/azure/active-directory/develop/security-best-practices-for-app-registration#application-id-uri).                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters`                                                            | Additional parameters above the standard parameters defined in the OAuth 2.0 Authorization Framework. Would be added to the Authorization URL for customizing the Authorization Request. For instance, `prompt: login`. See Microsoft doc about more additional parameters [information](/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code).                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.active-directory.b2c.authorization-clients`                                                                         | The OAuth2 authorization clients, contains the authorization grant type(only support client credentials) and scope. The clients will be converted to OAuth2 ClientRegistration, the other ClientRegistration information(such as client id, client secret) inherits from the OAuth2 login client(sign-in user flow). For instance, ` authorization-clients.webapi.authorization-grant-type=client_credentials, authorization-clients.webapi.scopes[0]={WEB_API_APP_ID_URL}/.default `.                                                                                                                                                                           |\n> | `spring.cloud.azure.active-directory.b2c.base-uri`                                                                                      | Azure AD B2C endpoint base uri.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.active-directory.b2c.credential.client-id`                                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.active-directory.b2c.credential.client-secret`                                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.active-directory.b2c.enabled`                                                                                       | Whether to enable Azure Active Directory B2C related auto-configuration. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.active-directory.b2c.jwt-connect-timeout`                                                                           | Connection Timeout(duration) for the JWKSet Remote URL call. The default value is `500s`. @deprecated If you want to configure this, please provide a RestOperations bean.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.active-directory.b2c.jwt-read-timeout`                                                                              | Read Timeout(duration) for the JWKSet Remote URL call. The default value is `500s`. @deprecated If you want to configure this, please provide a RestOperations bean.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.active-directory.b2c.jwt-size-limit`                                                                                | Size limit in Bytes of the JWKSet Remote URL call. The default value is `50*1024`. @deprecated If you want to configure this, please provide a RestOperations bean.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.active-directory.b2c.login-flow`                                                                                    | Specify the primary sign-in flow key. The default value is `sign-up-or-sign-in`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.active-directory.b2c.logout-success-url`                                                                            | Redirect URL after logout. The default value is `http://localhost:8080/login`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.active-directory.b2c.profile.tenant-id`                                                                             | Azure Tenant ID. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.active-directory.b2c.reply-url`                                                                                     | Reply URL after get authorization code. The default value is `{baseUrl}/login/oauth2/code/`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.active-directory.b2c.user-flows`                                                                                    | Azure AD B2C User flows. Configure the user flow type and name mapping. For instance, `sign-up-or-sign-in: B2C_signin_or_signup`. See Microsoft doc about User flows for more [details](/azure/active-directory-b2c/user-flow-overview#user-flows).                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.active-directory.b2c.user-name-attribute-name`                                                                      | User name attribute name.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.active-directory.credential.client-certificate-password`                                                            | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.active-directory.credential.client-certificate-path`                                                                | Path of a PFX or P12 certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.active-directory.credential.client-id`                                                                              | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.active-directory.credential.client-secret`                                                                          | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.active-directory.enabled`                                                                                           | Whether to enable Microsoft Entra ID related auto-configuration. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.active-directory.jwk-set-cache-lifespan`                                                                            | The lifespan (duration) of the cached JWK set before it expires. The default value is `5m`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.active-directory.jwk-set-cache-refresh-time`                                                                        | The refresh time (duration) of the cached JWK set before it expires. The default value is `5m`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.active-directory.jwt-connect-timeout`                                                                               | Connection Timeout (duration) for the JWKSet Remote URL call. The default value is `500s`. @deprecated If you want to configure this, please provide a `RestOperations` bean.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.active-directory.jwt-read-timeout`                                                                                  | Read Timeout (duration) for the JWKSet Remote URL call. The default value is `500s`. @deprecated If you want to configure this, please provide a `RestOperations` bean.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.active-directory.jwt-size-limit`                                                                                    | Size limit in Bytes of the JWKSet Remote URL call. The default value is `51200`. @deprecated If you want to configure this, please provide a `RestOperations` bean.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.active-directory.post-logout-redirect-uri`                                                                          | The redirect uri after logout. For instance, `http://localhost:8080/`. See Microsoft doc about Redirect URI for more [details](/azure/active-directory/develop/security-best-practices-for-app-registration#redirect-uri).                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.active-directory.profile.cloud-type`                                                                                | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.active-directory.profile.environment.active-directory-endpoint`                                                     | Microsoft Entra endpoint. For example: `https://login.microsoftonline.com/`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.active-directory.profile.environment.microsoft-graph-endpoint`                                                      | Microsoft Graph endpoint. For example: `https://graph.microsoft.com/`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.active-directory.profile.tenant-id`                                                                                 | Azure Tenant ID. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.active-directory.redirect-uri-template`                                                                             | Redirection Endpoint: Used by the authorization server to return responses containing authorization credentials to the client via the resource owner user-agent. The default value is `{baseUrl}/login/oauth2/code/`.                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map`                                                     | Configure which claim will be used to build `GrantedAuthority`, and prefix of the `GrantedAuthority`'s string value. Example: If use the default value, and the `access_token`'s `scp` scope value is `testValue`, then `GrantedAuthority` with `SCOPE_testValue` will be created. The default value is `\"scp\" -> \"SCOPE_\", \"roles\" -> \"APPROLE_\"`.                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.active-directory.resource-server.principal-claim-name`                                                              | Configure which claim in access token be returned in `AuthenticatedPrincipal#getName`. Example: If use the default value, and the `access_token`'s `sub` scope value is `testValue`, then `AuthenticatedPrincipal#getName` will return `testValue`. The default value is `sub`.                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.active-directory.session-stateless`                                                                                 | If true activates the stateless auth filter `AADAppRoleStatelessAuthenticationFilter`. The default is false, which activates `AADAuthenticationFilter`. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.active-directory.user-group.allowed-group-ids`                                                                      | The group IDs can be used to construct `GrantedAuthority`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.active-directory.user-group.allowed-group-names`                                                                    | The group names can be used to construct `GrantedAuthority`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.active-directory.user-group.use-transitive-members`                                                                 | Whether to use transitive way to get members. If `true`, use `v1.0/me/transitiveMemberOf` to get members. Otherwise, use `v1.0/me/memberOf`. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.active-directory.user-name-attribute`                                                                               | Decide which claim to be principal's name.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.appconfiguration.client.application-id`                                                                             | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.client.connect-timeout`                                                                            | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.appconfiguration.client.connection-idle-timeout`                                                                    | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.appconfiguration.client.headers`                                                                                    | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.appconfiguration.client.headers[0].name`                                                                            | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.appconfiguration.client.headers[0].values`                                                                          | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.client.logging.allowed-header-names`                                                               | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.client.logging.allowed-query-param-names`                                                          | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.appconfiguration.client.logging.level`                                                                              | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.appconfiguration.client.logging.pretty-print-body`                                                                  | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.appconfiguration.client.maximum-connection-pool-size`                                                               | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.client.read-timeout`                                                                               | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.client.response-timeout`                                                                           | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.appconfiguration.client.write-timeout`                                                                              | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.connection-string`                                                                                 | Connection string of the Azure App Configuration instance.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.appconfiguration.credential.client-certificate-password`                                                            | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.appconfiguration.credential.client-certificate-path`                                                                | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.appconfiguration.credential.client-id`                                                                              | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.credential.client-secret`                                                                          | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.appconfiguration.credential.managed-identity-enabled`                                                               | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.appconfiguration.credential.password`                                                                               | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.appconfiguration.credential.token-credential-bean-name`                                                             | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.appconfiguration.credential.username`                                                                               | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.appconfiguration.enabled`                                                                                           | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.appconfiguration.endpoint`                                                                                          | Endpoint of the Azure App Configuration instance. For instance, `https://{appConfigurationName}.azconfig.io`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.profile.cloud-type`                                                                                | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.appconfiguration.profile.environment.active-directory-endpoint`                                                     | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.appconfiguration.profile.environment.active-directory-graph-api-version`                                            | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.profile.environment.active-directory-graph-endpoint`                                               | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.appconfiguration.profile.environment.active-directory-resource-id`                                                  | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.profile.environment.azure-application-insights-endpoint`                                           | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.appconfiguration.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                     | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.appconfiguration.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                             | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.appconfiguration.profile.environment.azure-log-analytics-endpoint`                                                  | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.appconfiguration.profile.environment.data-lake-endpoint-resource-id`                                                | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.appconfiguration.profile.environment.gallery-endpoint`                                                              | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.appconfiguration.profile.environment.key-vault-dns-suffix`                                                          | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.appconfiguration.profile.environment.management-endpoint`                                                           | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.profile.environment.microsoft-graph-endpoint`                                                      | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.profile.environment.portal`                                                                        | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.appconfiguration.profile.environment.publishing-profile`                                                            | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.appconfiguration.profile.environment.resource-manager-endpoint`                                                     | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.appconfiguration.profile.environment.service-bus-domain-name`                                                       | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.profile.environment.sql-management-endpoint`                                                       | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.appconfiguration.profile.environment.sql-server-hostname-suffix`                                                    | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.profile.environment.storage-endpoint-suffix`                                                       | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.appconfiguration.profile.subscription-id`                                                                           | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.appconfiguration.profile.tenant-id`                                                                                 | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.proxy.hostname`                                                                                    | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.appconfiguration.proxy.non-proxy-hosts`                                                                             | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.appconfiguration.proxy.password`                                                                                    | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.proxy.port`                                                                                        | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.appconfiguration.proxy.type`                                                                                        | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.proxy.username`                                                                                    | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.resource.region`                                                                                   | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.appconfiguration.resource.resource-group`                                                                           | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.appconfiguration.resource.resource-id`                                                                              | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.appconfiguration.retry.exponential.base-delay`                                                                      | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.appconfiguration.retry.exponential.max-delay`                                                                       | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.appconfiguration.retry.exponential.max-retries`                                                                     | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.retry.fixed.delay`                                                                                 | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.appconfiguration.retry.fixed.max-retries`                                                                           | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.retry.mode`                                                                                        | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.appconfiguration.service-version`                                                                                   | Version of the app configuration service to be used when making request. The default value is `\"1.0\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.client.amqp.transport-type`                                                                                         | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.client.application-id`                                                                                              | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.client.http.connect-timeout`                                                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.client.http.connection-idle-timeout`                                                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.client.http.headers`                                                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.client.http.headers[0].name`                                                                                        | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.client.http.headers[0].values`                                                                                      | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.client.http.logging.allowed-header-names`                                                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.client.http.logging.allowed-query-param-names`                                                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.client.http.logging.level`                                                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.client.http.logging.pretty-print-body`                                                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.client.http.maximum-connection-pool-size`                                                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.client.http.read-timeout`                                                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.client.http.response-timeout`                                                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.client.http.write-timeout`                                                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.compatibility-verifier.compatible-boot-versions`                                                                    | Comma-delimited list of Spring Boot versions that are compatible with current Spring Cloud Azure's version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.compatibility-verifier.enabled`                                                                                     | Whether to enable the Spring Cloud Azure compatibility verifier. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.client-telemetry-enabled`                                                                                    | Whether to enable client telemetry, which will periodically collect database operations aggregation statistics, system information like cpu/memory and send it to cosmos monitoring service, which will be helpful during debugging.                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.cosmos.client.application-id`                                                                                       | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.connection-mode`                                                                                             | Connection mode to be used by the client in the Azure Cosmos DB database service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.connection-sharing-across-clients-enabled`                                                                   | Whether to enable connections sharing across multiple Azure Cosmos DB Clients.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.consistency-level`                                                                                           | Consistency level. The requested ConsistencyLevel must match or be weaker than that provisioned for the database account.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.cosmos.content-response-on-write-enabled`                                                                           | Whether to only return the headers and status code in Azure Cosmos DB response in case of Create, Update and Delete operations on CosmosItem. If set to false, service doesn't return payload in the response.                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.credential.client-certificate-password`                                                                      | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.credential.client-certificate-path`                                                                          | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.credential.client-id`                                                                                        | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.credential.client-secret`                                                                                    | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.credential.managed-identity-enabled`                                                                         | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.credential.password`                                                                                         | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.cosmos.credential.token-credential-bean-name`                                                                       | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.credential.username`                                                                                         | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.cosmos.database`                                                                                                    | Database name of the Azure Cosmos DB instance.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.direct-connection.connect-timeout`                                                                           | Connect timeout for direct client, represents timeout for establishing connections with an endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.cosmos.direct-connection.connection-endpoint-rediscovery-enabled`                                                   | Whether to enable the direct TCP connection endpoint rediscovery.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.direct-connection.idle-connection-timeout`                                                                   | Idle connection timeout for the direct client. Direct client doesn't close a single connection to an endpoint by default unless specified.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.direct-connection.idle-endpoint-timeout`                                                                     | Idle endpoint timeout for the direct client. If there are no requests to a specific endpoint for idle endpoint timeout duration, direct client closes all connections to that endpoint to save resources and I/O cost.                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.cosmos.direct-connection.max-connections-per-endpoint`                                                              | Max connections per endpoint, represents the size of connection pool for a specific endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.direct-connection.max-requests-per-connection`                                                               | Max requests per connection, represents the number of requests that will be queued on a single connection for a specific endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.direct-connection.network-request-timeout`                                                                   | Network request timeout interval (time to wait for response from network peer).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.cosmos.enabled`                                                                                                     | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.endpoint`                                                                                                    | Endpoint of the Azure Cosmos DB instance.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.cosmos.endpoint-discovery-enabled`                                                                                  | Whether to enable endpoint discovery for geo-replicated database accounts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.gateway-connection.idle-connection-timeout`                                                                  | Timeout for an idle connection. After that time, the connection will be automatically closed.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.gateway-connection.max-connection-pool-size`                                                                 | Size of the connection pool.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.cosmos.key`                                                                                                         | Key to authenticate for accessing the Azure Cosmos DB instance.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.cosmos.multiple-write-regions-enabled`                                                                              | Whether to enable writes on any regions for geo-replicated database accounts in the Azure Cosmos DB service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.cosmos.populate-query-metrics`                                                                                      | Whether to populate diagnostics strings and query metrics. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.cosmos.preferred-regions`                                                                                           | Preferred regions for geo-replicated database accounts. For example, `East US` as the preferred region.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.cosmos.profile.cloud-type`                                                                                          | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.profile.environment.active-directory-endpoint`                                                               | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.profile.environment.active-directory-graph-api-version`                                                      | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.profile.environment.active-directory-graph-endpoint`                                                         | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.profile.environment.active-directory-resource-id`                                                            | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.cosmos.profile.environment.azure-application-insights-endpoint`                                                     | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.cosmos.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                               | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.cosmos.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                                       | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.profile.environment.azure-log-analytics-endpoint`                                                            | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.profile.environment.data-lake-endpoint-resource-id`                                                          | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.cosmos.profile.environment.gallery-endpoint`                                                                        | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.cosmos.profile.environment.key-vault-dns-suffix`                                                                    | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.cosmos.profile.environment.management-endpoint`                                                                     | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.cosmos.profile.environment.microsoft-graph-endpoint`                                                                | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.profile.environment.portal`                                                                                  | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.profile.environment.publishing-profile`                                                                      | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.profile.environment.resource-manager-endpoint`                                                               | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.profile.environment.service-bus-domain-name`                                                                 | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.cosmos.profile.environment.sql-management-endpoint`                                                                 | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.cosmos.profile.environment.sql-server-hostname-suffix`                                                              | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.cosmos.profile.environment.storage-endpoint-suffix`                                                                 | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.cosmos.profile.subscription-id`                                                                                     | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.profile.tenant-id`                                                                                           | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.cosmos.proxy.hostname`                                                                                              | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.cosmos.proxy.non-proxy-hosts`                                                                                       | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.cosmos.proxy.password`                                                                                              | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.proxy.port`                                                                                                  | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.cosmos.proxy.type`                                                                                                  | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.cosmos.proxy.username`                                                                                              | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.read-requests-fallback-enabled`                                                                              | Whether to allow for reads to go to multiple regions configured on an account of Azure Cosmos DB service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.cosmos.resource-token`                                                                                              | Resource token to authenticate for accessing the Azure Cosmos DB instance.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.resource.region`                                                                                             | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.resource.resource-group`                                                                                     | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.resource.resource-id`                                                                                        | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.cosmos.session-capturing-override-enabled`                                                                          | Whether to enable session capturing. Session capturing is enabled by default for SESSION consistency level.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.throttling-retry-options.max-retry-attempts-on-throttled-requests`                                           | Maximum number of retries in the case where the request fails because the service has applied rate limiting on the client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.throttling-retry-options.max-retry-wait-time`                                                                | Maximum retry time in seconds. When a request fails due to a throttle error, the service sends back a response that contains a value indicating the client should not retry before the time period has elapsed (Retry-After). The MaxRetryWaitTime flag allows the application to set a maximum wait time for all retry attempts. If the cumulative wait time exceeds the MaxRetryWaitTime, the SDK will stop retrying and return the error to the application.                                                                                                                                                                                                  |\n> | `spring.cloud.azure.credential.client-certificate-password`                                                                             | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.credential.client-certificate-path`                                                                                 | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.credential.client-id`                                                                                               | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.credential.client-secret`                                                                                           | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.credential.managed-identity-enabled`                                                                                | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.credential.password`                                                                                                | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.credential.token-credential-bean-name`                                                                              | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.credential.username`                                                                                                | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventgrid.client.application-id`                                                                                    | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventgrid.client.connect-timeout`                                                                                   | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventgrid.client.connection-idle-timeout`                                                                           | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventgrid.client.headers`                                                                                           | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventgrid.client.logging.allowed-header-names`                                                                      | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventgrid.client.logging.allowed-query-param-names`                                                                 | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventgrid.client.logging.level`                                                                                     | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventgrid.client.logging.pretty-print-body`                                                                         | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventgrid.client.maximum-connection-pool-size`                                                                      | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventgrid.client.read-timeout`                                                                                      | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventgrid.client.response-timeout`                                                                                  | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventgrid.client.write-timeout`                                                                                     | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventgrid.credential.client-certificate-password`                                                                   | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventgrid.credential.client-certificate-path`                                                                       | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventgrid.credential.client-id`                                                                                     | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventgrid.credential.client-secret`                                                                                 | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventgrid.credential.managed-identity-enabled`                                                                      | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventgrid.credential.password`                                                                                      | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventgrid.credential.token-credential-bean-name`                                                                    | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventgrid.credential.username`                                                                                      | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventgrid.enabled`                                                                                                  | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventgrid.endpoint`                                                                                                 | Endpoint of an Azure Event Grid Topic or Domain (can be found on Azure portal). For instance, `https://{domain-or-topic-name}.xxx.eventgrid.azure.net/api/eventseventgrid.azure.net/api/events`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventgrid.event-schema`                                                                                             | The schema used to publish events. Could be `EVENT_GRID_EVENT`, `CLOUD_EVENT`, or `CUSTOM_EVENT`. The default value is `event-grid-event`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventgrid.key`                                                                                                      | Key to authenticate for accessing the Event Grid Topic or Domain.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventgrid.profile.cloud-type`                                                                                       | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventgrid.profile.environment.active-directory-endpoint`                                                            | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventgrid.profile.environment.active-directory-graph-api-version`                                                   | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventgrid.profile.environment.active-directory-graph-endpoint`                                                      | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventgrid.profile.environment.active-directory-resource-id`                                                         | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventgrid.profile.environment.azure-application-insights-endpoint`                                                  | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventgrid.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                            | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventgrid.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                                    | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventgrid.profile.environment.azure-log-analytics-endpoint`                                                         | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventgrid.profile.environment.data-lake-endpoint-resource-id`                                                       | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventgrid.profile.environment.gallery-endpoint`                                                                     | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventgrid.profile.environment.key-vault-dns-suffix`                                                                 | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventgrid.profile.environment.management-endpoint`                                                                  | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventgrid.profile.environment.microsoft-graph-endpoint`                                                             | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventgrid.profile.environment.portal`                                                                               | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventgrid.profile.environment.publishing-profile`                                                                   | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventgrid.profile.environment.resource-manager-endpoint`                                                            | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventgrid.profile.environment.service-bus-domain-name`                                                              | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventgrid.profile.environment.sql-management-endpoint`                                                              | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventgrid.profile.environment.sql-server-hostname-suffix`                                                           | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventgrid.profile.environment.storage-endpoint-suffix`                                                              | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventgrid.profile.subscription-id`                                                                                  | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventgrid.profile.tenant-id`                                                                                        | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventgrid.proxy.hostname`                                                                                           | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventgrid.proxy.non-proxy-hosts`                                                                                    | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventgrid.proxy.password`                                                                                           | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventgrid.proxy.port`                                                                                               | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventgrid.proxy.type`                                                                                               | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventgrid.proxy.username`                                                                                           | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventgrid.resource.region`                                                                                          | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventgrid.resource.resource-group`                                                                                  | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventgrid.resource.resource-id`                                                                                     | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventgrid.retry.exponential.base-delay`                                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventgrid.retry.exponential.max-delay`                                                                              | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventgrid.retry.exponential.max-retries`                                                                            | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventgrid.retry.fixed.delay`                                                                                        | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventgrid.retry.fixed.max-retries`                                                                                  | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventgrid.retry.mode`                                                                                               | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventgrid.sas-token`                                                                                                | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventgrid.service-version`                                                                                          | Event Grid service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.client.application-id`                                                                                    | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.client.transport-type`                                                                                    | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.connection-string`                                                                                        | Connection string to connect to an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.client.application-id`                                                                           | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.client.transport-type`                                                                           | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.consumer.connection-string`                                                                               | Connection string to connect to an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.consumer-group`                                                                                  | Name of the consumer group this consumer is associated with.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.consumer.credential.client-certificate-password`                                                          | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.consumer.credential.client-certificate-path`                                                              | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.consumer.credential.client-id`                                                                            | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.credential.client-secret`                                                                        | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.consumer.credential.managed-identity-enabled`                                                             | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.consumer.credential.password`                                                                             | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.consumer.credential.token-credential-bean-name`                                                           | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.consumer.credential.username`                                                                             | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.consumer.custom-endpoint-address`                                                                         | A custom endpoint address when connecting to the Event Hubs service. This can be useful when your network does not allow connecting to the standard Azure Event Hubs endpoint address, but does allow connecting through an intermediary. For example: `https://my.custom.endpoint.com:55300`.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.consumer.domain-name`                                                                                     | The domain name of an Event Hub namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.consumer.enabled`                                                                                         | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.consumer.event-hub-name`                                                                                  | The name of an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.consumer.namespace`                                                                                       | The namespace of an event hub, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.consumer.prefetch-count`                                                                                  | The number of events the Event Hub consumer will actively receive and queue locally without regard to whether a receiving operation is currently active.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.consumer.profile.cloud-type`                                                                              | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.active-directory-endpoint`                                                   | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.active-directory-graph-api-version`                                          | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.active-directory-graph-endpoint`                                             | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.active-directory-resource-id`                                                | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.azure-application-insights-endpoint`                                         | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                   | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                           | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.azure-log-analytics-endpoint`                                                | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.data-lake-endpoint-resource-id`                                              | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.gallery-endpoint`                                                            | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.key-vault-dns-suffix`                                                        | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.management-endpoint`                                                         | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.microsoft-graph-endpoint`                                                    | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.portal`                                                                      | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.publishing-profile`                                                          | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.resource-manager-endpoint`                                                   | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.service-bus-domain-name`                                                     | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.sql-management-endpoint`                                                     | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.sql-server-hostname-suffix`                                                  | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.storage-endpoint-suffix`                                                     | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.consumer.profile.subscription-id`                                                                         | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.consumer.profile.tenant-id`                                                                               | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.authentication-type`                                                                       | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.hostname`                                                                                  | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.password`                                                                                  | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.port`                                                                                      | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.type`                                                                                      | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.username`                                                                                  | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.resource.region`                                                                                 | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.consumer.resource.resource-group`                                                                         | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.consumer.resource.resource-id`                                                                            | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.consumer.retry.exponential.base-delay`                                                                    | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.consumer.retry.exponential.max-delay`                                                                     | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.consumer.retry.exponential.max-retries`                                                                   | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.consumer.retry.fixed.delay`                                                                               | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.consumer.retry.fixed.max-retries`                                                                         | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.consumer.retry.mode`                                                                                      | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.consumer.retry.try-timeout`                                                                               | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.credential.client-certificate-password`                                                                   | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.credential.client-certificate-path`                                                                       | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.credential.client-id`                                                                                     | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.credential.client-secret`                                                                                 | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.credential.managed-identity-enabled`                                                                      | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.credential.password`                                                                                      | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.credential.token-credential-bean-name`                                                                    | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.credential.username`                                                                                      | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.custom-endpoint-address`                                                                                  | A custom endpoint address when connecting to the Event Hubs service. This can be useful when your network does not allow connecting to the standard Azure Event Hubs endpoint address, but does allow connecting through an intermediary. For example: `https://my.custom.endpoint.com:55300`.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.domain-name`                                                                                              | The domain name of an Event Hub namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.enabled`                                                                                                  | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.event-hub-name`                                                                                           | The name of an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.namespace`                                                                                                | The namespace of an event hub, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.batch.max-size`                                                                                 | The maximum number of events that will be in the batch.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.processor.batch.max-wait-time`                                                                            | The max time duration to wait to receive an event before processing events.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-key`                                                                   | Storage account access key.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name`                                                                  | Name for the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.blob-name`                                                                     | Name of the blob.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.connect-timeout`                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.connection-idle-timeout`                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.headers`                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.headers[0].name`                                                        | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.headers[0].values`                                                      | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.logging.allowed-header-names`                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.logging.allowed-query-param-names`                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.logging.level`                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.logging.pretty-print-body`                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.maximum-connection-pool-size`                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.read-timeout`                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.response-timeout`                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.write-timeout`                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.connection-string`                                                             | Connection string to connect to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name`                                                                | Name of the container.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.create-container-if-not-exists`                                                | Whether to create the container if it does not exist. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.customer-provided-key`                                                         | Customer-provided encryption key(base64 encoded string) used to encrypt blob contents on the server. See Microsoft doc about Customer-provided Keys for more [details](/azure/storage/blobs/encryption-customer-provided-keys).                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.encryption-scope`                                                              | Specifies the name of the encryption scope to use to encrypt the data provided in the request. If not specified, encryption is performed with the default account encryption scope. See Microsoft doc about Encryption Scope for more [details](/azure/storage/blobs/encryption-scope-overview).                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.endpoint`                                                                      | Endpoint for Azure Storage service. For instance, `https://{storage-account-name}.blob.storage.azure.net` for blob or `https://{storage-account-name}.file.storage.azure.net` for file share or `https://{storage-account-name}.queue.storage.azure.net` for queue.                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.secondary-host`                                                          | Secondary Storage account to retry requests against if the primary region becomes unavailable. For instance, `https://{storage-account-name}-secondary.file.storage.azure.net`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.try-timeout`                                                             | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.sas-token`                                                                     | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.service-version`                                                               | Blob service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.client.application-id`                                                                          | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.client.transport-type`                                                                          | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.connection-string`                                                                              | Connection string to connect to an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.consumer-group`                                                                                 | Name of the consumer group this consumer is associated with.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.credential.client-certificate-password`                                                         | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.credential.client-certificate-path`                                                             | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.credential.client-id`                                                                           | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.credential.client-secret`                                                                       | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.credential.managed-identity-enabled`                                                            | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.credential.password`                                                                            | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.credential.token-credential-bean-name`                                                          | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.credential.username`                                                                            | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.custom-endpoint-address`                                                                        | A custom endpoint address when connecting to the Event Hubs service. This can be useful when your network does not allow connecting to the standard Azure Event Hubs endpoint address, but does allow connecting through an intermediary. For example: `https://my.custom.endpoint.com:55300`.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.processor.domain-name`                                                                                    | The domain name of an Event Hub namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.enabled`                                                                                        | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.event-hub-name`                                                                                 | The name of an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.initial-partition-event-position`                                                               | Map event position to use for each partition if a checkpoint for the partition does not exist in CheckpointStore.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.load-balancing.partition-ownership-expiration-interval`                                         | The time duration after which the ownership of partition expires.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.load-balancing.strategy`                                                                        | The load balancing strategy for claiming partition ownership.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.load-balancing.update-interval`                                                                 | The time interval between load balancing update cycles.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.processor.namespace`                                                                                      | The namespace of an event hub, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.prefetch-count`                                                                                 | The number of events the Event Hub consumer will actively receive and queue locally without regard to whether a receiving operation is currently active.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.profile.cloud-type`                                                                             | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.active-directory-endpoint`                                                  | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.active-directory-graph-api-version`                                         | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.active-directory-graph-endpoint`                                            | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.active-directory-resource-id`                                               | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.azure-application-insights-endpoint`                                        | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                  | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                          | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.azure-log-analytics-endpoint`                                               | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.data-lake-endpoint-resource-id`                                             | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.gallery-endpoint`                                                           | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.key-vault-dns-suffix`                                                       | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.management-endpoint`                                                        | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.microsoft-graph-endpoint`                                                   | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.portal`                                                                     | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.publishing-profile`                                                         | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.resource-manager-endpoint`                                                  | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.service-bus-domain-name`                                                    | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.sql-management-endpoint`                                                    | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.sql-server-hostname-suffix`                                                 | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.storage-endpoint-suffix`                                                    | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.profile.subscription-id`                                                                        | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.profile.tenant-id`                                                                              | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.proxy.authentication-type`                                                                      | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.proxy.hostname`                                                                                 | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.processor.proxy.password`                                                                                 | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.proxy.port`                                                                                     | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.processor.proxy.type`                                                                                     | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.proxy.username`                                                                                 | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.resource.region`                                                                                | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.resource.resource-group`                                                                        | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.resource.resource-id`                                                                           | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.retry.exponential.base-delay`                                                                   | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.retry.exponential.max-delay`                                                                    | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.retry.exponential.max-retries`                                                                  | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.retry.fixed.delay`                                                                              | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.retry.fixed.max-retries`                                                                        | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.retry.mode`                                                                                     | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.processor.retry.try-timeout`                                                                              | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.track-last-enqueued-event-properties`                                                           | Whether request information on the last enqueued event on its associated partition, and track that information as events are received.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.producer.client.application-id`                                                                           | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.client.transport-type`                                                                           | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.producer.connection-string`                                                                               | Connection string to connect to an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.credential.client-certificate-password`                                                          | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.producer.credential.client-certificate-path`                                                              | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.producer.credential.client-id`                                                                            | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.credential.client-secret`                                                                        | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.producer.credential.managed-identity-enabled`                                                             | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.producer.credential.password`                                                                             | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.producer.credential.token-credential-bean-name`                                                           | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.producer.credential.username`                                                                             | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.producer.custom-endpoint-address`                                                                         | A custom endpoint address when connecting to the Event Hubs service. This can be useful when your network does not allow connecting to the standard Azure Event Hubs endpoint address, but does allow connecting through an intermediary. For example: `https://my.custom.endpoint.com:55300`.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.producer.domain-name`                                                                                     | The domain name of an Event Hub namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.producer.enabled`                                                                                         | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.producer.event-hub-name`                                                                                  | The name of an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.producer.namespace`                                                                                       | The namespace of an event hub, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.producer.profile.cloud-type`                                                                              | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.active-directory-endpoint`                                                   | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.active-directory-graph-api-version`                                          | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.active-directory-graph-endpoint`                                             | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.active-directory-resource-id`                                                | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.azure-application-insights-endpoint`                                         | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                   | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                           | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.azure-log-analytics-endpoint`                                                | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.data-lake-endpoint-resource-id`                                              | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.gallery-endpoint`                                                            | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.key-vault-dns-suffix`                                                        | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.management-endpoint`                                                         | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.microsoft-graph-endpoint`                                                    | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.portal`                                                                      | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.publishing-profile`                                                          | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.resource-manager-endpoint`                                                   | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.service-bus-domain-name`                                                     | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.sql-management-endpoint`                                                     | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.sql-server-hostname-suffix`                                                  | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.storage-endpoint-suffix`                                                     | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.producer.profile.subscription-id`                                                                         | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.producer.profile.tenant-id`                                                                               | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.proxy.authentication-type`                                                                       | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.producer.proxy.hostname`                                                                                  | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.producer.proxy.password`                                                                                  | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.proxy.port`                                                                                      | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.producer.proxy.type`                                                                                      | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.producer.proxy.username`                                                                                  | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.resource.region`                                                                                 | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.producer.resource.resource-group`                                                                         | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.producer.resource.resource-id`                                                                            | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.producer.retry.exponential.base-delay`                                                                    | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.producer.retry.exponential.max-delay`                                                                     | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.producer.retry.exponential.max-retries`                                                                   | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.producer.retry.fixed.delay`                                                                               | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.producer.retry.fixed.max-retries`                                                                         | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.producer.retry.mode`                                                                                      | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.producer.retry.try-timeout`                                                                               | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.profile.cloud-type`                                                                                       | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.profile.environment.active-directory-endpoint`                                                            | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.profile.environment.active-directory-graph-api-version`                                                   | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.profile.environment.active-directory-graph-endpoint`                                                      | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.profile.environment.active-directory-resource-id`                                                         | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.profile.environment.azure-application-insights-endpoint`                                                  | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                            | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                                    | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.profile.environment.azure-log-analytics-endpoint`                                                         | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.profile.environment.data-lake-endpoint-resource-id`                                                       | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.profile.environment.gallery-endpoint`                                                                     | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.profile.environment.key-vault-dns-suffix`                                                                 | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.profile.environment.management-endpoint`                                                                  | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.profile.environment.microsoft-graph-endpoint`                                                             | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.profile.environment.portal`                                                                               | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.profile.environment.publishing-profile`                                                                   | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.profile.environment.resource-manager-endpoint`                                                            | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.profile.environment.service-bus-domain-name`                                                              | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.profile.environment.sql-management-endpoint`                                                              | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.profile.environment.sql-server-hostname-suffix`                                                           | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.profile.environment.storage-endpoint-suffix`                                                              | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.profile.subscription-id`                                                                                  | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.profile.tenant-id`                                                                                        | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.proxy.authentication-type`                                                                                | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.proxy.hostname`                                                                                           | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.proxy.password`                                                                                           | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.proxy.port`                                                                                               | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.proxy.type`                                                                                               | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.proxy.username`                                                                                           | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.resource.name`                                                                                            | Namespace of the event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.resource.region`                                                                                          | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.resource.resource-group`                                                                                  | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.resource.resource-id`                                                                                     | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.retry.exponential.base-delay`                                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.retry.exponential.max-delay`                                                                              | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.retry.exponential.max-retries`                                                                            | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.retry.fixed.delay`                                                                                        | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.retry.fixed.max-retries`                                                                                  | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.retry.mode`                                                                                               | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.retry.try-timeout`                                                                                        | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.shared-connection`                                                                                        | Whether to share the same connection for producers or consumers.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.challenge-resource-verification-enabled`                                                       | Whether to enable the Azure Key Vault challenge resource verification, default: true. Calls the disableChallengeResourceVerification method of the Azure Key Vault Client Builder when set to false. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.certificate.client.application-id`                                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.client.connect-timeout`                                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.certificate.client.connection-idle-timeout`                                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.certificate.client.headers`                                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.certificate.client.headers[0].name`                                                                        | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.certificate.client.headers[0].values`                                                                      | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.client.logging.allowed-header-names`                                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.client.logging.allowed-query-param-names`                                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.certificate.client.logging.level`                                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.certificate.client.logging.pretty-print-body`                                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.certificate.client.maximum-connection-pool-size`                                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.client.read-timeout`                                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.client.response-timeout`                                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.certificate.client.write-timeout`                                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.credential.client-certificate-password`                                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.certificate.credential.client-certificate-path`                                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.credential.client-id`                                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.credential.client-secret`                                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.certificate.credential.managed-identity-enabled`                                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.credential.password`                                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.certificate.credential.token-credential-bean-name`                                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.credential.username`                                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.certificate.enabled`                                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.certificate.endpoint`                                                                                      | Azure Key Vault endpoint. For instance, `https://{your-unique-keyvault-name}.vault.azure.net/`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.profile.cloud-type`                                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.active-directory-endpoint`                                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.active-directory-graph-api-version`                                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.active-directory-graph-endpoint`                                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.active-directory-resource-id`                                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.azure-application-insights-endpoint`                                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                 | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.azure-log-analytics-endpoint`                                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.data-lake-endpoint-resource-id`                                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.gallery-endpoint`                                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.key-vault-dns-suffix`                                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.management-endpoint`                                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.microsoft-graph-endpoint`                                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.portal`                                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.publishing-profile`                                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.resource-manager-endpoint`                                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.service-bus-domain-name`                                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.sql-management-endpoint`                                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.sql-server-hostname-suffix`                                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.storage-endpoint-suffix`                                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.certificate.profile.subscription-id`                                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.certificate.profile.tenant-id`                                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.proxy.hostname`                                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.certificate.proxy.non-proxy-hosts`                                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.certificate.proxy.password`                                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.proxy.port`                                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.certificate.proxy.type`                                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.proxy.username`                                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.resource.region`                                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.certificate.resource.resource-group`                                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.certificate.resource.resource-id`                                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.certificate.retry.exponential.base-delay`                                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.certificate.retry.exponential.max-delay`                                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.certificate.retry.exponential.max-retries`                                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.retry.fixed.delay`                                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.certificate.retry.fixed.max-retries`                                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.retry.mode`                                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.certificate.service-version`                                                                               | The version of Azure Key Vault Certificate Service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.challenge-resource-verification-enabled`                                                                   | Whether to enable the Azure Key Vault challenge resource verification, default: true. Calls the disableChallengeResourceVerification method of the Azure Key Vault Client Builder when set to false. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.client.application-id`                                                                                     | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.client.connect-timeout`                                                                                    | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.client.connection-idle-timeout`                                                                            | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.client.headers`                                                                                            | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.client.logging.allowed-header-names`                                                                       | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.client.logging.allowed-query-param-names`                                                                  | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.client.logging.level`                                                                                      | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.client.logging.pretty-print-body`                                                                          | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.client.maximum-connection-pool-size`                                                                       | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.client.read-timeout`                                                                                       | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.client.response-timeout`                                                                                   | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.client.write-timeout`                                                                                      | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.credential.client-certificate-password`                                                                    | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.credential.client-certificate-path`                                                                        | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.credential.client-id`                                                                                      | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.credential.client-secret`                                                                                  | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.credential.managed-identity-enabled`                                                                       | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.credential.password`                                                                                       | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.credential.token-credential-bean-name`                                                                     | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.credential.username`                                                                                       | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.enabled`                                                                                                   | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.endpoint`                                                                                                  | Azure Key Vault endpoint. For instance, `https://{your-unique-keyvault-name}.vault.azure.net/`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.profile.cloud-type`                                                                                        | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.profile.environment.active-directory-endpoint`                                                             | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.profile.environment.active-directory-graph-api-version`                                                    | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.profile.environment.active-directory-graph-endpoint`                                                       | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.profile.environment.active-directory-resource-id`                                                          | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.profile.environment.azure-application-insights-endpoint`                                                   | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                             | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                                     | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.profile.environment.azure-log-analytics-endpoint`                                                          | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.profile.environment.data-lake-endpoint-resource-id`                                                        | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.profile.environment.gallery-endpoint`                                                                      | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.profile.environment.key-vault-dns-suffix`                                                                  | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.profile.environment.management-endpoint`                                                                   | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.profile.environment.microsoft-graph-endpoint`                                                              | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.profile.environment.portal`                                                                                | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.profile.environment.publishing-profile`                                                                    | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.profile.environment.resource-manager-endpoint`                                                             | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.profile.environment.service-bus-domain-name`                                                               | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.profile.environment.sql-management-endpoint`                                                               | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.profile.environment.sql-server-hostname-suffix`                                                            | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.profile.environment.storage-endpoint-suffix`                                                               | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.profile.subscription-id`                                                                                   | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.profile.tenant-id`                                                                                         | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.proxy.hostname`                                                                                            | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.proxy.non-proxy-hosts`                                                                                     | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.proxy.password`                                                                                            | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.proxy.port`                                                                                                | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.proxy.type`                                                                                                | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.proxy.username`                                                                                            | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.resource.region`                                                                                           | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.resource.resource-group`                                                                                   | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.resource.resource-id`                                                                                      | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.retry.exponential.base-delay`                                                                              | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.retry.exponential.max-delay`                                                                               | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.retry.exponential.max-retries`                                                                             | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.retry.fixed.delay`                                                                                         | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.retry.fixed.max-retries`                                                                                   | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.retry.mode`                                                                                                | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.secret.challenge-resource-verification-enabled`                                                            | Whether to enable the Azure Key Vault challenge resource verification, default: true. Calls the disableChallengeResourceVerification method of the Azure Key Vault Client Builder when set to false. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.client.application-id`                                                                              | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.client.connect-timeout`                                                                             | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.client.connection-idle-timeout`                                                                     | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.client.headers`                                                                                     | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.client.headers[0].name`                                                                             | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.secret.client.headers[0].values`                                                                           | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.client.logging.allowed-header-names`                                                                | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.client.logging.allowed-query-param-names`                                                           | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.client.logging.level`                                                                               | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.client.logging.pretty-print-body`                                                                   | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.client.maximum-connection-pool-size`                                                                | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.client.read-timeout`                                                                                | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.client.response-timeout`                                                                            | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.client.write-timeout`                                                                               | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.credential.client-certificate-password`                                                             | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.credential.client-certificate-path`                                                                 | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.credential.client-id`                                                                               | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.credential.client-secret`                                                                           | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.credential.managed-identity-enabled`                                                                | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.credential.password`                                                                                | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.credential.token-credential-bean-name`                                                              | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.credential.username`                                                                                | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.enabled`                                                                                            | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.endpoint`                                                                                           | Azure Key Vault endpoint. For instance, `https://{your-unique-keyvault-name}.vault.azure.net/`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.profile.cloud-type`                                                                                 | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.active-directory-endpoint`                                                      | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.active-directory-graph-api-version`                                             | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.active-directory-graph-endpoint`                                                | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.active-directory-resource-id`                                                   | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.azure-application-insights-endpoint`                                            | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                      | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                              | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.azure-log-analytics-endpoint`                                                   | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.data-lake-endpoint-resource-id`                                                 | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.gallery-endpoint`                                                               | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.key-vault-dns-suffix`                                                           | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.management-endpoint`                                                            | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.microsoft-graph-endpoint`                                                       | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.portal`                                                                         | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.publishing-profile`                                                             | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.resource-manager-endpoint`                                                      | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.service-bus-domain-name`                                                        | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.sql-management-endpoint`                                                        | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.sql-server-hostname-suffix`                                                     | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.storage-endpoint-suffix`                                                        | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.profile.subscription-id`                                                                            | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.profile.tenant-id`                                                                                  | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-source-enabled`                                                                            | Whether to enable the Key Vault property source. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources`                                                                                   | List of Azure Key Vault property sources. For instance, ` property-sources[0].name=key-vault-property-source-1, property-sources[0].endpoint={ENDPOINT_1}, property-sources[1].name=key-vault-property-source-2, property-sources[1].endpoint={ENDPOINT_2} `.                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].case-sensitive`                                                                 | Whether to enable case-sensitive for secret keys. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].challenge-resource-verification-enabled`                                        | Whether to enable the Azure Key Vault challenge resource verification, default: true. Calls the disableChallengeResourceVerification method of the Azure Key Vault Client Builder when set to false. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.application-id`                                                          | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.connect-timeout`                                                         | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.connection-idle-timeout`                                                 | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.headers[0].name`                                                         | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.headers[0].values`                                                       | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.logging.allowed-header-names`                                            | Comma-delimited list of allowlist headers that should be logged. The default value is `'x-ms-request-id','x-ms-client-request-id','x-ms-return-client-request-id','traceparent','MS-CV','Accept','Cache-Control','Connection','Content-Length','Content-Type','Date','ETag','Expires','If-Match','If-Modified-Since','If-None-Match','If-Unmodified-Since','Last-Modified','Pragma','Request-Id','Retry-After','Server','Transfer-Encoding','User-Agent','WWW-Authenticate'`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.logging.allowed-query-param-names`                                       | Comma-delimited list of allowlist query parameters. The default value is `'api-version'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.logging.level`                                                           | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.logging.pretty-print-body`                                               | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.maximum-connection-pool-size`                                            | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.read-timeout`                                                            | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.response-timeout`                                                        | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.write-timeout`                                                           | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-certificate-password`                                         | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-certificate-path`                                             | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-id`                                                           | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-secret`                                                       | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.managed-identity-enabled`                                            | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.password`                                                            | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.username`                                                            | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].enabled`                                                                        | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].endpoint`                                                                       | Azure Key Vault endpoint. For instance, `https://{your-unique-keyvault-name}.vault.azure.net/`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].name`                                                                           | Name of this property source.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.cloud-type`                                                             | Name of the Azure cloud to connect to. Supported types are: AZURE, AZURE_CHINA, AZURE_US_GOVERNMENT, OTHER. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.active-directory-endpoint`                                  | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.active-directory-graph-api-version`                         | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.active-directory-graph-endpoint`                            | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.active-directory-resource-id`                               | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.azure-application-insights-endpoint`                        | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`  | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.azure-data-lake-store-file-system-endpoint-suffix`          | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.azure-log-analytics-endpoint`                               | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.data-lake-endpoint-resource-id`                             | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.gallery-endpoint`                                           | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.key-vault-dns-suffix`                                       | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.management-endpoint`                                        | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.microsoft-graph-endpoint`                                   | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.portal`                                                     | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.publishing-profile`                                         | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.resource-manager-endpoint`                                  | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.sql-management-endpoint`                                    | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.sql-server-hostname-suffix`                                 | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.storage-endpoint-suffix`                                    | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.subscription-id`                                                        | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.tenant-id`                                                              | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.hostname`                                                                 | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.non-proxy-hosts`                                                          | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.password`                                                                 | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.port`                                                                     | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.type`                                                                     | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.username`                                                                 | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].resource.region`                                                                | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].resource.resource-group`                                                        | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].resource.resource-id`                                                           | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.exponential.base-delay`                                                   | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.exponential.max-delay`                                                    | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.exponential.max-retries`                                                  | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.fixed.delay`                                                              | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.fixed.max-retries`                                                        | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.mode`                                                                     | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].secret-keys`                                                                    | The configured secret keys will be loaded from Azure Key Vaults secret, if configured nothing, then load all the secrets. Only support exact value for secret names, For example, if you configured secret key name `SecretKey1` in Key Vaults secret, you should configure `SecretKey1` here.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].service-version`                                                                | Secret service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.secret.proxy.hostname`                                                                                     | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.secret.proxy.non-proxy-hosts`                                                                              | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.proxy.password`                                                                                     | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.proxy.port`                                                                                         | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.secret.proxy.type`                                                                                         | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.proxy.username`                                                                                     | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.resource.region`                                                                                    | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.resource.resource-group`                                                                            | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.resource.resource-id`                                                                               | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.retry.exponential.base-delay`                                                                       | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.retry.exponential.max-delay`                                                                        | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.retry.exponential.max-retries`                                                                      | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.retry.fixed.delay`                                                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.retry.fixed.max-retries`                                                                            | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.retry.mode`                                                                                         | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.secret.service-version`                                                                                    | Secret service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.message-converter.isolated-object-mapper`                                                                           | Whether to use an isolated object mapper to serialize/deserialize message in EventHubsMessageConverter/ServiceBusMessageConverter/StorageQueueMessageConverter. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.profile.cloud-type`                                                                                                 | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.profile.environment.active-directory-endpoint`                                                                      | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.profile.environment.active-directory-graph-api-version`                                                             | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.profile.environment.active-directory-graph-endpoint`                                                                | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.profile.environment.active-directory-resource-id`                                                                   | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.profile.environment.azure-application-insights-endpoint`                                                            | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                                      | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                                              | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.profile.environment.azure-log-analytics-endpoint`                                                                   | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.profile.environment.data-lake-endpoint-resource-id`                                                                 | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.profile.environment.gallery-endpoint`                                                                               | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.profile.environment.key-vault-dns-suffix`                                                                           | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.profile.environment.management-endpoint`                                                                            | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.profile.environment.microsoft-graph-endpoint`                                                                       | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.profile.environment.portal`                                                                                         | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.profile.environment.publishing-profile`                                                                             | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.profile.environment.resource-manager-endpoint`                                                                      | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.profile.environment.service-bus-domain-name`                                                                        | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.profile.environment.sql-management-endpoint`                                                                        | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.profile.environment.sql-server-hostname-suffix`                                                                     | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.profile.environment.storage-endpoint-suffix`                                                                        | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.profile.subscription-id`                                                                                            | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.profile.tenant-id`                                                                                                  | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.proxy.amqp.authentication-type`                                                                                     | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.proxy.hostname`                                                                                                     | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.proxy.http.non-proxy-hosts`                                                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.proxy.password`                                                                                                     | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.proxy.port`                                                                                                         | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.proxy.type`                                                                                                         | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.proxy.username`                                                                                                     | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.redis.name`                                                                                                         | Name of the Azure Cache for Redis.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.redis.resource.region`                                                                                              | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.redis.resource.resource-group`                                                                                      | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.redis.resource.resource-id`                                                                                         | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.retry.amqp.try-timeout`                                                                                             | Amount of time(Duration) to wait until timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.retry.exponential.base-delay`                                                                                       | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.retry.exponential.max-delay`                                                                                        | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.retry.exponential.max-retries`                                                                                      | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.retry.fixed.delay`                                                                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.retry.fixed.max-retries`                                                                                            | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.retry.mode`                                                                                                         | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.client.application-id`                                                                                   | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.client.transport-type`                                                                                   | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.connection-string`                                                                                       | Connection string to connect to a service bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.consumer.auto-complete`                                                                                  | Whether to enable auto-complete.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.consumer.client.application-id`                                                                          | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.client.transport-type`                                                                          | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.consumer.connection-string`                                                                              | Connection string to connect to a service bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.consumer.credential.client-certificate-password`                                                         | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.consumer.credential.client-certificate-path`                                                             | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.consumer.credential.client-id`                                                                           | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.credential.client-secret`                                                                       | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.consumer.credential.managed-identity-enabled`                                                            | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.consumer.credential.password`                                                                            | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.consumer.credential.token-credential-bean-name`                                                          | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.consumer.credential.username`                                                                            | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.consumer.custom-endpoint-address`                                                                        | Sets a custom endpoint address when connecting to the Service Bus service. This can be useful when your network does not allow connecting to the standard Azure Service Bus endpoint address, but does allow connecting through an intermediary. For example: `{@literal https://my.custom.endpoint.com:55300}`.                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.consumer.domain-name`                                                                                    | The domain name of a Service Bus namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.consumer.enabled`                                                                                        | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.consumer.entity-name`                                                                                    | The name of a Service Bus Queue or Topic.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.consumer.entity-type`                                                                                    | The type of Service Bus entity, which is a Queue or a Topic.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.consumer.max-auto-lock-renew-duration`                                                                   | Amount of time to continue auto-renewing the lock.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.consumer.namespace`                                                                                      | The namespace of a service bus, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.consumer.prefetch-count`                                                                                 | Prefetch count of the consumer.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.profile.cloud-type`                                                                             | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.active-directory-endpoint`                                                  | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.active-directory-graph-api-version`                                         | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.active-directory-graph-endpoint`                                            | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.active-directory-resource-id`                                               | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.azure-application-insights-endpoint`                                        | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                  | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                          | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.azure-log-analytics-endpoint`                                               | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.data-lake-endpoint-resource-id`                                             | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.gallery-endpoint`                                                           | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.key-vault-dns-suffix`                                                       | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.management-endpoint`                                                        | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.microsoft-graph-endpoint`                                                   | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.portal`                                                                     | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.publishing-profile`                                                         | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.resource-manager-endpoint`                                                  | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.service-bus-domain-name`                                                    | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.sql-management-endpoint`                                                    | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.sql-server-hostname-suffix`                                                 | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.storage-endpoint-suffix`                                                    | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.consumer.profile.subscription-id`                                                                        | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.consumer.profile.tenant-id`                                                                              | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.consumer.proxy.authentication-type`                                                                      | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.consumer.proxy.hostname`                                                                                 | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.consumer.proxy.password`                                                                                 | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.proxy.port`                                                                                     | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.consumer.proxy.type`                                                                                     | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.proxy.username`                                                                                 | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.receive-mode`                                                                                   | Mode for receiving messages.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.consumer.resource.region`                                                                                | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.consumer.resource.resource-group`                                                                        | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.consumer.resource.resource-id`                                                                           | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.consumer.retry.exponential.base-delay`                                                                   | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.consumer.retry.exponential.max-delay`                                                                    | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.consumer.retry.exponential.max-retries`                                                                  | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.retry.fixed.delay`                                                                              | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.consumer.retry.fixed.max-retries`                                                                        | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.retry.mode`                                                                                     | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.consumer.retry.try-timeout`                                                                              | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.consumer.session-enabled`                                                                                | Whether to enable session for the consumer.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.consumer.sub-queue`                                                                                      | Type of the SubQueue to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.consumer.subscription-name`                                                                              | Name for a topic subscription.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.credential.client-certificate-password`                                                                  | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.credential.client-certificate-path`                                                                      | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.credential.client-id`                                                                                    | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.credential.client-secret`                                                                                | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.credential.managed-identity-enabled`                                                                     | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.credential.password`                                                                                     | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.credential.token-credential-bean-name`                                                                   | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.credential.username`                                                                                     | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.cross-entity-transactions`                                                                               | Whether to enable cross entity transaction on the connection to Service bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.custom-endpoint-address`                                                                                 | Sets a custom endpoint address when connecting to the Service Bus service. This can be useful when your network does not allow connecting to the standard Azure Service Bus endpoint address, but does allow connecting through an intermediary. For example: `{@literal https://my.custom.endpoint.com:55300}`.                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.domain-name`                                                                                             | The domain name of a Service Bus namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.enabled`                                                                                                 | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.entity-name`                                                                                             | The name of a Service Bus Queue or Topic.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.entity-type`                                                                                             | The type of Service Bus entity, which is a Queue or a Topic.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.namespace`                                                                                               | The namespace of a service bus, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.processor.auto-complete`                                                                                 | Whether to enable auto-complete.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.processor.auto-startup`                                                                                  | Whether to automatically start the processor after initialization. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.client.application-id`                                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.client.transport-type`                                                                         | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.processor.connection-string`                                                                             | Connection string to connect to a service bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.processor.credential.client-certificate-password`                                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.processor.credential.client-certificate-path`                                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.processor.credential.client-id`                                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.credential.client-secret`                                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.processor.credential.managed-identity-enabled`                                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.processor.credential.password`                                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.processor.credential.token-credential-bean-name`                                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.processor.credential.username`                                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.processor.custom-endpoint-address`                                                                       | Sets a custom endpoint address when connecting to the Service Bus service. This can be useful when your network does not allow connecting to the standard Azure Service Bus endpoint address, but does allow connecting through an intermediary. For example: `{@literal https://my.custom.endpoint.com:55300}`.                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.processor.domain-name`                                                                                   | The domain name of a Service Bus namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.processor.enabled`                                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.processor.entity-name`                                                                                   | The name of a Service Bus Queue or Topic.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.processor.entity-type`                                                                                   | The type of Service Bus entity, which is a Queue or a Topic.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.processor.max-auto-lock-renew-duration`                                                                  | Amount of time to continue auto-renewing the lock.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.processor.max-concurrent-calls`                                                                          | Max concurrent messages to process. When session enabled, it applies to each session.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.servicebus.processor.max-concurrent-sessions`                                                                       | Maximum number of concurrent sessions to process at any given time.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.processor.namespace`                                                                                     | The namespace of a service bus, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.processor.prefetch-count`                                                                                | Prefetch count of the consumer.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.profile.cloud-type`                                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.active-directory-endpoint`                                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.active-directory-graph-api-version`                                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.active-directory-graph-endpoint`                                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.active-directory-resource-id`                                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.azure-application-insights-endpoint`                                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                 | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.azure-log-analytics-endpoint`                                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.data-lake-endpoint-resource-id`                                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.gallery-endpoint`                                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.key-vault-dns-suffix`                                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.management-endpoint`                                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.microsoft-graph-endpoint`                                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.portal`                                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.publishing-profile`                                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.resource-manager-endpoint`                                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.service-bus-domain-name`                                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.sql-management-endpoint`                                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.sql-server-hostname-suffix`                                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.storage-endpoint-suffix`                                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.processor.profile.subscription-id`                                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.processor.profile.tenant-id`                                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.processor.proxy.authentication-type`                                                                     | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.processor.proxy.hostname`                                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.processor.proxy.password`                                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.proxy.port`                                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.processor.proxy.type`                                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.proxy.username`                                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.receive-mode`                                                                                  | Mode for receiving messages.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.processor.resource.region`                                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.processor.resource.resource-group`                                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.processor.resource.resource-id`                                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.processor.retry.exponential.base-delay`                                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.processor.retry.exponential.max-delay`                                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.processor.retry.exponential.max-retries`                                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.retry.fixed.delay`                                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.processor.retry.fixed.max-retries`                                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.retry.mode`                                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.processor.retry.try-timeout`                                                                             | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.processor.session-enabled`                                                                               | Whether to enable session for the consumer.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.processor.sub-queue`                                                                                     | Type of the SubQueue to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.processor.subscription-name`                                                                             | Name for a topic subscription.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.producer.client.application-id`                                                                          | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.producer.client.transport-type`                                                                          | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.producer.connection-string`                                                                              | Connection string to connect to a service bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.producer.credential.client-certificate-password`                                                         | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.producer.credential.client-certificate-path`                                                             | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.producer.credential.client-id`                                                                           | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.producer.credential.client-secret`                                                                       | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.producer.credential.managed-identity-enabled`                                                            | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.producer.credential.password`                                                                            | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.producer.credential.token-credential-bean-name`                                                          | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.producer.credential.username`                                                                            | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.producer.custom-endpoint-address`                                                                        | Sets a custom endpoint address when connecting to the Service Bus service. This can be useful when your network does not allow connecting to the standard Azure Service Bus endpoint address, but does allow connecting through an intermediary. For example: `{@literal https://my.custom.endpoint.com:55300}`.                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.producer.domain-name`                                                                                    | The domain name of a Service Bus namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.producer.enabled`                                                                                        | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.producer.entity-name`                                                                                    | The name of a Service Bus Queue or Topic.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.producer.entity-type`                                                                                    | The type of Service Bus entity, which is a Queue or a Topic.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.producer.namespace`                                                                                      | The namespace of a service bus, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.producer.profile.cloud-type`                                                                             | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.active-directory-endpoint`                                                  | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.active-directory-graph-api-version`                                         | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.active-directory-graph-endpoint`                                            | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.active-directory-resource-id`                                               | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.azure-application-insights-endpoint`                                        | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                  | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                          | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.azure-log-analytics-endpoint`                                               | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.data-lake-endpoint-resource-id`                                             | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.gallery-endpoint`                                                           | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.key-vault-dns-suffix`                                                       | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.management-endpoint`                                                        | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.microsoft-graph-endpoint`                                                   | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.portal`                                                                     | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.publishing-profile`                                                         | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.resource-manager-endpoint`                                                  | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.service-bus-domain-name`                                                    | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.sql-management-endpoint`                                                    | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.sql-server-hostname-suffix`                                                 | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.storage-endpoint-suffix`                                                    | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.producer.profile.subscription-id`                                                                        | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.producer.profile.tenant-id`                                                                              | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.producer.proxy.authentication-type`                                                                      | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.producer.proxy.hostname`                                                                                 | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.producer.proxy.password`                                                                                 | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.producer.proxy.port`                                                                                     | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.producer.proxy.type`                                                                                     | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.producer.proxy.username`                                                                                 | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.producer.resource.region`                                                                                | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.producer.resource.resource-group`                                                                        | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.producer.resource.resource-id`                                                                           | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.producer.retry.exponential.base-delay`                                                                   | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.producer.retry.exponential.max-delay`                                                                    | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.producer.retry.exponential.max-retries`                                                                  | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.producer.retry.fixed.delay`                                                                              | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.producer.retry.fixed.max-retries`                                                                        | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.producer.retry.mode`                                                                                     | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.producer.retry.try-timeout`                                                                              | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.profile.cloud-type`                                                                                      | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.profile.environment.active-directory-endpoint`                                                           | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.profile.environment.active-directory-graph-api-version`                                                  | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.profile.environment.active-directory-graph-endpoint`                                                     | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.profile.environment.active-directory-resource-id`                                                        | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.profile.environment.azure-application-insights-endpoint`                                                 | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                           | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                                   | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.servicebus.profile.environment.azure-log-analytics-endpoint`                                                        | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.profile.environment.data-lake-endpoint-resource-id`                                                      | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.profile.environment.gallery-endpoint`                                                                    | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.servicebus.profile.environment.key-vault-dns-suffix`                                                                | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.profile.environment.management-endpoint`                                                                 | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.profile.environment.microsoft-graph-endpoint`                                                            | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.profile.environment.portal`                                                                              | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.profile.environment.publishing-profile`                                                                  | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.profile.environment.resource-manager-endpoint`                                                           | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.profile.environment.service-bus-domain-name`                                                             | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.profile.environment.sql-management-endpoint`                                                             | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.profile.environment.sql-server-hostname-suffix`                                                          | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.profile.environment.storage-endpoint-suffix`                                                             | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.profile.subscription-id`                                                                                 | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.profile.tenant-id`                                                                                       | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.proxy.authentication-type`                                                                               | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.proxy.hostname`                                                                                          | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.proxy.password`                                                                                          | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.proxy.port`                                                                                              | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.proxy.type`                                                                                              | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.proxy.username`                                                                                          | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.resource.name`                                                                                           | Namespace of the service bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.resource.region`                                                                                         | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.resource.resource-group`                                                                                 | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.resource.resource-id`                                                                                    | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.retry.exponential.base-delay`                                                                            | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.retry.exponential.max-delay`                                                                             | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.retry.exponential.max-retries`                                                                           | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.retry.fixed.delay`                                                                                       | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.retry.fixed.max-retries`                                                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.retry.mode`                                                                                              | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.retry.try-timeout`                                                                                       | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.account-key`                                                                                                | Storage account access key.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.account-name`                                                                                               | Name for the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.account-key`                                                                                           | Storage account access key.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.blob.account-name`                                                                                          | Name for the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.blob-name`                                                                                             | Name of the blob.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.client.application-id`                                                                                 | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.client.connect-timeout`                                                                                | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.blob.client.connection-idle-timeout`                                                                        | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.blob.client.headers`                                                                                        | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.blob.client.headers[0].name`                                                                                | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.blob.client.headers[0].values`                                                                              | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.client.logging.allowed-header-names`                                                                   | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.client.logging.allowed-query-param-names`                                                              | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.blob.client.logging.level`                                                                                  | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.blob.client.logging.pretty-print-body`                                                                      | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.blob.client.maximum-connection-pool-size`                                                                   | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.client.read-timeout`                                                                                   | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.client.response-timeout`                                                                               | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.client.write-timeout`                                                                                  | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.connection-string`                                                                                     | Connection string to connect to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.blob.container-name`                                                                                        | Name of the container.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.blob.credential.client-certificate-password`                                                                | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.credential.client-certificate-path`                                                                    | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.credential.client-id`                                                                                  | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.credential.client-secret`                                                                              | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.credential.managed-identity-enabled`                                                                   | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.credential.password`                                                                                   | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.blob.credential.token-credential-bean-name`                                                                 | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.credential.username`                                                                                   | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.blob.customer-provided-key`                                                                                 | Customer-provided encryption key(base64 encoded string) used to encrypt blob contents on the server. See Microsoft doc about Customer-provided Keys for more [details](/azure/storage/blobs/encryption-customer-provided-keys).                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.enabled`                                                                                               | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.encryption-scope`                                                                                      | Specifies the name of the encryption scope to use to encrypt the data provided in the request. If not specified, encryption is performed with the default account encryption scope. See Microsoft doc about Encryption Scope for more [details](/azure/storage/blobs/encryption-scope-overview).                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.endpoint`                                                                                              | Endpoint for Azure Storage service. For instance, `https://{storage-account-name}.blob.storage.azure.net` for blob or `https://{storage-account-name}.file.storage.azure.net` for file share or `https://{storage-account-name}.queue.storage.azure.net` for queue.                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.blob.profile.cloud-type`                                                                                    | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.profile.environment.active-directory-endpoint`                                                         | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.blob.profile.environment.active-directory-graph-api-version`                                                | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.profile.environment.active-directory-graph-endpoint`                                                   | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.blob.profile.environment.active-directory-resource-id`                                                      | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.profile.environment.azure-application-insights-endpoint`                                               | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.blob.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                         | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.blob.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                                 | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.profile.environment.azure-log-analytics-endpoint`                                                      | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.profile.environment.data-lake-endpoint-resource-id`                                                    | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.blob.profile.environment.gallery-endpoint`                                                                  | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.blob.profile.environment.key-vault-dns-suffix`                                                              | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.blob.profile.environment.management-endpoint`                                                               | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.profile.environment.microsoft-graph-endpoint`                                                          | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.profile.environment.portal`                                                                            | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.blob.profile.environment.publishing-profile`                                                                | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.profile.environment.resource-manager-endpoint`                                                         | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.profile.environment.service-bus-domain-name`                                                           | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.profile.environment.sql-management-endpoint`                                                           | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.blob.profile.environment.sql-server-hostname-suffix`                                                        | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.profile.environment.storage-endpoint-suffix`                                                           | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.blob.profile.subscription-id`                                                                               | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.blob.profile.tenant-id`                                                                                     | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.proxy.hostname`                                                                                        | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.blob.proxy.non-proxy-hosts`                                                                                 | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.blob.proxy.password`                                                                                        | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.proxy.port`                                                                                            | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.blob.proxy.type`                                                                                            | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.proxy.username`                                                                                        | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.resource.region`                                                                                       | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.blob.resource.resource-group`                                                                               | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.blob.resource.resource-id`                                                                                  | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.blob.retry.exponential.base-delay`                                                                          | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.blob.retry.exponential.max-delay`                                                                           | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.retry.exponential.max-retries`                                                                         | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.retry.fixed.delay`                                                                                     | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.blob.retry.fixed.max-retries`                                                                               | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.retry.mode`                                                                                            | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.blob.retry.secondary-host`                                                                                  | Secondary Storage account to retry requests against if the primary region becomes unavailable. For instance, `https://{storage-account-name}-secondary.file.storage.azure.net`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.retry.try-timeout`                                                                                     | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.sas-token`                                                                                             | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.service-version`                                                                                       | Blob service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.client.application-id`                                                                                      | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.client.connect-timeout`                                                                                     | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.client.connection-idle-timeout`                                                                             | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.client.headers`                                                                                             | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.client.logging.allowed-header-names`                                                                        | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.client.logging.allowed-query-param-names`                                                                   | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.client.logging.level`                                                                                       | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.client.logging.pretty-print-body`                                                                           | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.client.maximum-connection-pool-size`                                                                        | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.client.read-timeout`                                                                                        | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.client.response-timeout`                                                                                    | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.client.write-timeout`                                                                                       | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.connection-string`                                                                                          | Connection string to connect to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.credential.client-certificate-password`                                                                     | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.credential.client-certificate-path`                                                                         | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.credential.client-id`                                                                                       | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.credential.client-secret`                                                                                   | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.credential.managed-identity-enabled`                                                                        | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.credential.password`                                                                                        | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.credential.token-credential-bean-name`                                                                      | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.credential.username`                                                                                        | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.enabled`                                                                                                    | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.endpoint`                                                                                                   | Endpoint for Azure Storage service. For instance, `https://{storage-account-name}.blob.storage.azure.net` for blob or `https://{storage-account-name}.file.storage.azure.net` for file share or `https://{storage-account-name}.queue.storage.azure.net` for queue.                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.fileshare.account-key`                                                                                      | Storage account access key.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.fileshare.account-name`                                                                                     | Name for the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.client.application-id`                                                                            | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.client.connect-timeout`                                                                           | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.fileshare.client.connection-idle-timeout`                                                                   | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.fileshare.client.headers`                                                                                   | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.fileshare.client.headers[0].name`                                                                           | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.fileshare.client.headers[0].values`                                                                         | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.client.logging.allowed-header-names`                                                              | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.client.logging.allowed-query-param-names`                                                         | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.fileshare.client.logging.level`                                                                             | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.fileshare.client.logging.pretty-print-body`                                                                 | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.fileshare.client.maximum-connection-pool-size`                                                              | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.client.read-timeout`                                                                              | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.client.response-timeout`                                                                          | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.fileshare.client.write-timeout`                                                                             | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.connection-string`                                                                                | Connection string to connect to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.fileshare.directory-path`                                                                                   | Path to the directory. For instance, `directory1/directory2`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.enabled`                                                                                          | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.fileshare.endpoint`                                                                                         | Endpoint for Azure Storage service. For instance, `https://{storage-account-name}.blob.storage.azure.net` for blob or `https://{storage-account-name}.file.storage.azure.net` for file share or `https://{storage-account-name}.queue.storage.azure.net` for queue.                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.fileshare.file-path`                                                                                        | Path to the file. For instance, `directory1/file1`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.fileshare.profile.cloud-type`                                                                               | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.active-directory-endpoint`                                                    | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.active-directory-graph-api-version`                                           | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.active-directory-graph-endpoint`                                              | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.active-directory-resource-id`                                                 | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.azure-application-insights-endpoint`                                          | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                    | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                            | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.azure-log-analytics-endpoint`                                                 | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.data-lake-endpoint-resource-id`                                               | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.gallery-endpoint`                                                             | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.key-vault-dns-suffix`                                                         | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.management-endpoint`                                                          | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.microsoft-graph-endpoint`                                                     | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.portal`                                                                       | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.publishing-profile`                                                           | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.resource-manager-endpoint`                                                    | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.service-bus-domain-name`                                                      | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.sql-management-endpoint`                                                      | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.sql-server-hostname-suffix`                                                   | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.storage-endpoint-suffix`                                                      | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.fileshare.profile.subscription-id`                                                                          | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.fileshare.profile.tenant-id`                                                                                | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.proxy.hostname`                                                                                   | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.fileshare.proxy.non-proxy-hosts`                                                                            | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.fileshare.proxy.password`                                                                                   | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.proxy.port`                                                                                       | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.fileshare.proxy.type`                                                                                       | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.proxy.username`                                                                                   | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.resource.region`                                                                                  | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.fileshare.resource.resource-group`                                                                          | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.fileshare.resource.resource-id`                                                                             | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.fileshare.retry.exponential.base-delay`                                                                     | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.fileshare.retry.exponential.max-delay`                                                                      | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.fileshare.retry.exponential.max-retries`                                                                    | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.retry.fixed.delay`                                                                                | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.fileshare.retry.fixed.max-retries`                                                                          | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.retry.mode`                                                                                       | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.fileshare.retry.secondary-host`                                                                             | Secondary Storage account to retry requests against if the primary region becomes unavailable. For instance, `https://{storage-account-name}-secondary.file.storage.azure.net`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.retry.try-timeout`                                                                                | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.fileshare.sas-token`                                                                                        | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.fileshare.service-version`                                                                                  | Share service version used when making API requests                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.fileshare.share-name`                                                                                       | Name of the share.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.profile.cloud-type`                                                                                         | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.profile.environment.active-directory-endpoint`                                                              | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.profile.environment.active-directory-graph-api-version`                                                     | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.profile.environment.active-directory-graph-endpoint`                                                        | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.profile.environment.active-directory-resource-id`                                                           | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.profile.environment.azure-application-insights-endpoint`                                                    | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                              | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                                      | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.profile.environment.azure-log-analytics-endpoint`                                                           | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.profile.environment.data-lake-endpoint-resource-id`                                                         | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.profile.environment.gallery-endpoint`                                                                       | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.profile.environment.key-vault-dns-suffix`                                                                   | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.profile.environment.management-endpoint`                                                                    | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.profile.environment.microsoft-graph-endpoint`                                                               | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.profile.environment.portal`                                                                                 | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.profile.environment.publishing-profile`                                                                     | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.profile.environment.resource-manager-endpoint`                                                              | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.profile.environment.service-bus-domain-name`                                                                | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.profile.environment.sql-management-endpoint`                                                                | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.profile.environment.sql-server-hostname-suffix`                                                             | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.profile.environment.storage-endpoint-suffix`                                                                | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.profile.subscription-id`                                                                                    | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.profile.tenant-id`                                                                                          | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.proxy.hostname`                                                                                             | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.proxy.non-proxy-hosts`                                                                                      | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.proxy.password`                                                                                             | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.proxy.port`                                                                                                 | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.proxy.type`                                                                                                 | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.proxy.username`                                                                                             | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.account-key`                                                                                          | Storage account access key.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.queue.account-name`                                                                                         | Name for the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.client.application-id`                                                                                | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.client.connect-timeout`                                                                               | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.queue.client.connection-idle-timeout`                                                                       | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.queue.client.headers`                                                                                       | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.client.headers[0].name`                                                                               | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.queue.client.headers[0].values`                                                                             | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.client.logging.allowed-header-names`                                                                  | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`.                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.client.logging.allowed-query-param-names`                                                             | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.queue.client.logging.level`                                                                                 | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.client.logging.pretty-print-body`                                                                     | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.queue.client.maximum-connection-pool-size`                                                                  | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.client.read-timeout`                                                                                  | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.client.response-timeout`                                                                              | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.queue.client.write-timeout`                                                                                 | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.connection-string`                                                                                    | Connection string to connect to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.credential.client-certificate-password`                                                               | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.queue.credential.client-certificate-path`                                                                   | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.credential.client-id`                                                                                 | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.credential.client-secret`                                                                             | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.queue.credential.managed-identity-enabled`                                                                  | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.credential.password`                                                                                  | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.credential.token-credential-bean-name`                                                                | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.credential.username`                                                                                  | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.enabled`                                                                                              | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.queue.endpoint`                                                                                             | Endpoint for Azure Storage service. For instance, `https://{storage-account-name}.blob.storage.azure.net` for blob or `https://{storage-account-name}.file.storage.azure.net` for file share or `https://{storage-account-name}.queue.storage.azure.net` for queue.                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.queue.message-encoding`                                                                                     | How queue message body is represented in HTTP requests and responses. All Supported types are: NONE, BASE64.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.profile.cloud-type`                                                                                   | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.queue.profile.environment.active-directory-endpoint`                                                        | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.queue.profile.environment.active-directory-graph-api-version`                                               | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.profile.environment.active-directory-graph-endpoint`                                                  | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.queue.profile.environment.active-directory-resource-id`                                                     | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.profile.environment.azure-application-insights-endpoint`                                              | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.queue.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                        | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.queue.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                                | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.profile.environment.azure-log-analytics-endpoint`                                                     | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.queue.profile.environment.data-lake-endpoint-resource-id`                                                   | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.queue.profile.environment.gallery-endpoint`                                                                 | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.queue.profile.environment.key-vault-dns-suffix`                                                             | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.queue.profile.environment.management-endpoint`                                                              | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.profile.environment.microsoft-graph-endpoint`                                                         | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.profile.environment.portal`                                                                           | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.queue.profile.environment.publishing-profile`                                                               | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.queue.profile.environment.resource-manager-endpoint`                                                        | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.queue.profile.environment.service-bus-domain-name`                                                          | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.profile.environment.sql-management-endpoint`                                                          | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.profile.environment.sql-server-hostname-suffix`                                                       | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.profile.environment.storage-endpoint-suffix`                                                          | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.profile.subscription-id`                                                                              | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.queue.profile.tenant-id`                                                                                    | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.proxy.hostname`                                                                                       | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.queue.proxy.non-proxy-hosts`                                                                                | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.queue.proxy.password`                                                                                       | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.proxy.port`                                                                                           | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.queue.proxy.type`                                                                                           | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.proxy.username`                                                                                       | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.queue-name`                                                                                           | Name of the storage queue.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.queue.resource.name`                                                                                        | Name of the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.resource.region`                                                                                      | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.queue.resource.resource-group`                                                                              | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.queue.resource.resource-id`                                                                                 | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.queue.retry.exponential.base-delay`                                                                         | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.queue.retry.exponential.max-delay`                                                                          | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.retry.exponential.max-retries`                                                                        | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.retry.fixed.delay`                                                                                    | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.queue.retry.fixed.max-retries`                                                                              | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.retry.mode`                                                                                           | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.queue.retry.secondary-host`                                                                                 | Secondary Storage account to retry requests against if the primary region becomes unavailable. For instance, `https://{storage-account-name}-secondary.file.storage.azure.net`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.retry.try-timeout`                                                                                    | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.queue.sas-token`                                                                                            | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.service-version`                                                                                      | Queue service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.resource.region`                                                                                            | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.resource.resource-group`                                                                                    | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.resource.resource-id`                                                                                       | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.retry.exponential.base-delay`                                                                               | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.retry.exponential.max-delay`                                                                                | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.retry.exponential.max-retries`                                                                              | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.retry.fixed.delay`                                                                                          | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.retry.fixed.max-retries`                                                                                    | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.retry.mode`                                                                                                 | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.retry.secondary-host`                                                                                       | Secondary Storage account to retry requests against if the primary region becomes unavailable. For instance, `https://{storage-account-name}-secondary.file.storage.azure.net`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.retry.try-timeout`                                                                                          | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.sas-token`                                                                                                  | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.jms.servicebus.connection-string`                                                                                               | Connection string to connect to a Service Bus namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.jms.servicebus.credential`                                                                                                      | null                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.jms.servicebus.enabled`                                                                                                         | Whether to enable Service Bus JMS autoconfiguration. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.jms.servicebus.idle-timeout`                                                                                                    | Connection idle timeout duration that how long the client expects Service Bus to keep a connection alive when no messages delivered. @see <a href=\"http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-transport-v1.0-os.html#doc-doc-idle-time-out\">AMQP specification</a> @see <a href=\"/azure/service-bus-messaging/service-bus-amqp-troubleshoot#link-is-not-created\">Service Bus AMQP Errors</a> The default value is `2m`.                                                                                                                                                                                                                              |\n> | `spring.jms.servicebus.listener.phase`                                                                                                  | The phase in which this container should be started and stopped.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.jms.servicebus.listener.reply-pub-sub-domain`                                                                                   | Whether the reply destination type is topic. Only works for the bean of topicJmsListenerContainerFactory.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.jms.servicebus.listener.reply-qos-settings`                                                                                     | The QosSettings to use when sending a reply.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.jms.servicebus.listener.subscription-durable`                                                                                   | Whether to make the subscription durable. Only works for the bean of topicJmsListenerContainerFactory. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.jms.servicebus.listener.subscription-shared`                                                                                    | Whether to make the subscription shared. Only works for the bean of topicJmsListenerContainerFactory.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.jms.servicebus.namespace`                                                                                                       | The Service Bus namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.jms.servicebus.passwordless-enabled`                                                                                            | Whether to enable supporting azure identity token credentials. If the value is true, then `spring.jms.servicebus.namespace` must be set. If the passwordlessEnabled is true, it will try to authenticate connections with Microsoft Entra ID. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.jms.servicebus.pool.block-if-full`                                                                                              | Whether to block when a connection is requested and the pool is full. Set it to false to throw a `JMSException` instead.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.jms.servicebus.pool.block-if-full-timeout`                                                                                      | Blocking period before throwing an exception if the pool is still full.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.jms.servicebus.pool.enabled`                                                                                                    | Whether a JmsPoolConnectionFactory should be created, instead of a regular ConnectionFactory.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.jms.servicebus.pool.idle-timeout`                                                                                               | Connection idle timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.jms.servicebus.pool.max-connections`                                                                                            | Maximum number of pooled connections.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.jms.servicebus.pool.max-sessions-per-connection`                                                                                | Maximum number of pooled sessions per connection in the pool.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.jms.servicebus.pool.time-between-expiration-check`                                                                              | Time to sleep between runs of the idle connection eviction thread. When negative, no idle connection eviction thread runs.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.jms.servicebus.pool.use-anonymous-producers`                                                                                    | Whether to use only one anonymous `MessageProducer` instance. Set it to false to create one `MessageProducer` every time one is required.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.jms.servicebus.prefetch-policy.all`                                                                                             | Fallback value for prefetch option in this Service Bus namespace. The default value is `0`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.jms.servicebus.prefetch-policy.durable-topic-prefetch`                                                                          | The number of prefetch for durable topic. The default value is `0`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.jms.servicebus.prefetch-policy.queue-browser-prefetch`                                                                          | The number of prefetch for queue browser. The default value is `0`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.jms.servicebus.prefetch-policy.queue-prefetch`                                                                                  | The number of prefetch for queue. The default value is `0`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.jms.servicebus.prefetch-policy.topic-prefetch`                                                                                  | The number of prefetch for topic. The default value is `0`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.jms.servicebus.pricing-tier`                                                                                                    | Pricing tier for a Service Bus namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.jms.servicebus.profile`                                                                                                         | null                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.jms.servicebus.scopes`                                                                                                          | The scopes required for the access token.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.jms.servicebus.topic-client-id`                                                                                                 | Service Bus topic client ID. Only works for the bean of topicJmsListenerContainerFactory.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-active-directory-b2c.md",
    "content": "---\ntitle: Azure Active Directory B2C configuration properties\ndescription: This reference doc contains all Azure Active Directory B2C configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Active Directory B2C configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                   | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> |----------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.active-directory.b2c.app-id-uri`                         | App ID URI that might be used in the `aud` claim of a token. For instance, `https://{hostname}/{applicationId}`. See Microsoft doc about APP ID URL for more [details](/azure/active-directory/develop/security-best-practices-for-app-registration#application-id-uri).                                                                                                                                                                                                               |\n> | `spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters` | Additional parameters above the standard parameters defined in the OAuth 2.0 Authorization Framework. Would be added to the Authorization URL for customizing the Authorization Request. For instance, `prompt: login`. See Microsoft doc about more additional parameters [information](/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code).                                                                                                      |\n> | `spring.cloud.azure.active-directory.b2c.authorization-clients`              | The OAuth2 authorization clients, contains the authorization grant type(only support client credentials) and scope. The clients will be converted to OAuth2 ClientRegistration, the other ClientRegistration information(such as client id, client secret) inherits from the OAuth2 login client(sign-in user flow). For instance, ` authorization-clients.webapi.authorization-grant-type=client_credentials, authorization-clients.webapi.scopes[0]={WEB_API_APP_ID_URL}/.default `. |\n> | `spring.cloud.azure.active-directory.b2c.base-uri`                           | Azure AD B2C endpoint base uri.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.active-directory.b2c.credential.client-id`               | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.active-directory.b2c.credential.client-secret`           | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.active-directory.b2c.enabled`                            | Whether to enable Azure Active Directory B2C related auto-configuration. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.active-directory.b2c.jwt-connect-timeout`                | Connection Timeout(duration) for the JWKSet Remote URL call. The default value is `500s`. @deprecated If you want to configure this, please provide a RestOperations bean.                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.active-directory.b2c.jwt-read-timeout`                   | Read Timeout(duration) for the JWKSet Remote URL call. The default value is `500s`. @deprecated If you want to configure this, please provide a RestOperations bean.                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.active-directory.b2c.jwt-size-limit`                     | Size limit in Bytes of the JWKSet Remote URL call. The default value is `50*1024`. @deprecated If you want to configure this, please provide a RestOperations bean.                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.active-directory.b2c.login-flow`                         | Specify the primary sign-in flow key. The default value is `sign-up-or-sign-in`.                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.active-directory.b2c.logout-success-url`                 | Redirect URL after logout. The default value is `http://localhost:8080/login`.                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.active-directory.b2c.profile.tenant-id`                  | Azure Tenant ID. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.active-directory.b2c.reply-url`                          | Reply URL after get authorization code. The default value is `{baseUrl}/login/oauth2/code/`.                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.active-directory.b2c.user-flows`                         | Azure AD B2C User flows. Configure the user flow type and name mapping. For instance, `sign-up-or-sign-in: B2C_signin_or_signup`. See Microsoft doc about User flows for more [details](/azure/active-directory-b2c/user-flow-overview#user-flows).                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.active-directory.b2c.user-name-attribute-name`           | User name attribute name.                                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-app-configuration.md",
    "content": "---\ntitle: Azure App Configuration configuration properties\ndescription: This reference doc contains all Azure App Configuration configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure App Configuration configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                          | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> |-------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.appconfiguration.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.client.connect-timeout`                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.appconfiguration.client.connection-idle-timeout`                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.appconfiguration.client.headers`                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.client.headers[0].name`                                                        | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.appconfiguration.client.headers[0].values`                                                      | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.client.logging.allowed-header-names`                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`. |\n> | `spring.cloud.azure.appconfiguration.client.logging.allowed-query-param-names`                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.appconfiguration.client.logging.level`                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.client.logging.pretty-print-body`                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.appconfiguration.client.maximum-connection-pool-size`                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.appconfiguration.client.read-timeout`                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.appconfiguration.client.response-timeout`                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.appconfiguration.client.write-timeout`                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.appconfiguration.connection-string`                                                             | Connection string of the Azure App Configuration instance.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.appconfiguration.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.appconfiguration.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.appconfiguration.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.appconfiguration.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.appconfiguration.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.appconfiguration.endpoint`                                                                      | Endpoint of the Azure App Configuration instance. For instance, `https://{appConfigurationName}.azconfig.io`.                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.appconfiguration.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.appconfiguration.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.appconfiguration.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.appconfiguration.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.appconfiguration.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.appconfiguration.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.appconfiguration.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.appconfiguration.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.appconfiguration.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.appconfiguration.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.appconfiguration.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.appconfiguration.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.appconfiguration.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.appconfiguration.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.appconfiguration.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.appconfiguration.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.appconfiguration.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.appconfiguration.proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.appconfiguration.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.appconfiguration.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.appconfiguration.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.appconfiguration.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.appconfiguration.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.appconfiguration.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.appconfiguration.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.appconfiguration.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.appconfiguration.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.appconfiguration.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.appconfiguration.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.appconfiguration.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.appconfiguration.service-version`                                                               | Version of the app configuration service to be used when making request. The default value is `\"1.0\"`.                                                                                                                                                                                                                                                                                                                                                                        |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-cosmos-db.md",
    "content": "---\ntitle: Azure Cosmos DB configuration properties\ndescription: This reference doc contains all Azure Cosmos DB configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Cosmos DB configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> |---------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.cosmos.client-telemetry-enabled`                                                      | Whether to enable client telemetry, which will periodically collect database operations aggregation statistics, system information like cpu/memory and send it to cosmos monitoring service, which will be helpful during debugging.                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.cosmos.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.connection-mode`                                                               | Connection mode to be used by the client in the Azure Cosmos DB database service.                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.connection-sharing-across-clients-enabled`                                     | Whether to enable connections sharing across multiple Azure Cosmos DB Clients.                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.cosmos.consistency-level`                                                             | Consistency level. The requested ConsistencyLevel must match or be weaker than that provisioned for the database account.                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.content-response-on-write-enabled`                                             | Whether to only return the headers and status code in Azure Cosmos DB response in case of Create, Update and Delete operations on CosmosItem. If set to false, service doesn't return payload in the response.                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.cosmos.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.cosmos.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.cosmos.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.cosmos.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.database`                                                                      | Database name of the Azure Cosmos DB instance.                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.cosmos.direct-connection.connect-timeout`                                             | Connect timeout for direct client, represents timeout for establishing connections with an endpoint.                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.cosmos.direct-connection.connection-endpoint-rediscovery-enabled`                     | Whether to enable the direct TCP connection endpoint rediscovery.                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.direct-connection.idle-connection-timeout`                                     | Idle connection timeout for the direct client. Direct client doesn't close a single connection to an endpoint by default unless specified.                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.direct-connection.idle-endpoint-timeout`                                       | Idle endpoint timeout for the direct client. If there are no requests to a specific endpoint for idle endpoint timeout duration, direct client closes all connections to that endpoint to save resources and I/O cost.                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.cosmos.direct-connection.max-connections-per-endpoint`                                | Max connections per endpoint, represents the size of connection pool for a specific endpoint.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.direct-connection.max-requests-per-connection`                                 | Max requests per connection, represents the number of requests that will be queued on a single connection for a specific endpoint.                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.cosmos.direct-connection.network-request-timeout`                                     | Network request timeout interval (time to wait for response from network peer).                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.cosmos.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.endpoint`                                                                      | Endpoint of the Azure Cosmos DB instance.                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.endpoint-discovery-enabled`                                                    | Whether to enable endpoint discovery for geo-replicated database accounts.                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.gateway-connection.idle-connection-timeout`                                    | Timeout for an idle connection. After that time, the connection will be automatically closed.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.gateway-connection.max-connection-pool-size`                                   | Size of the connection pool.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.key`                                                                           | Key to authenticate for accessing the Azure Cosmos DB instance.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.cosmos.multiple-write-regions-enabled`                                                | Whether to enable writes on any regions for geo-replicated database accounts in the Azure Cosmos DB service.                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.populate-query-metrics`                                                        | Whether to populate diagnostics strings and query metrics. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.cosmos.preferred-regions`                                                             | Preferred regions for geo-replicated database accounts. For example, `East US` as the preferred region.                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.cosmos.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.cosmos.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.cosmos.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.cosmos.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.cosmos.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.cosmos.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.cosmos.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.cosmos.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.cosmos.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.cosmos.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.cosmos.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.cosmos.proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.cosmos.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.cosmos.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.cosmos.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.cosmos.read-requests-fallback-enabled`                                                | Whether to allow for reads to go to multiple regions configured on an account of Azure Cosmos DB service.                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.cosmos.resource-token`                                                                | Resource token to authenticate for accessing the Azure Cosmos DB instance.                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.cosmos.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.cosmos.session-capturing-override-enabled`                                            | Whether to enable session capturing. Session capturing is enabled by default for SESSION consistency level.                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.cosmos.throttling-retry-options.max-retry-attempts-on-throttled-requests`             | Maximum number of retries in the case where the request fails because the service has applied rate limiting on the client.                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.cosmos.throttling-retry-options.max-retry-wait-time`                                  | Maximum retry time in seconds. When a request fails due to a throttle error, the service sends back a response that contains a value indicating the client should not retry before the time period has elapsed (Retry-After). The MaxRetryWaitTime flag allows the application to set a maximum wait time for all retry attempts. If the cumulative wait time exceeds the MaxRetryWaitTime, the SDK will stop retrying and return the error to the application. |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-event-hubs.md",
    "content": "---\ntitle: Azure Event Hubs configuration properties\ndescription: This reference doc contains all Azure Event Hubs configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Event Hubs configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                                              | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> |---------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.eventhubs.client.application-id`                                                                                    | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.client.transport-type`                                                                                    | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.connection-string`                                                                                        | Connection string to connect to an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.client.application-id`                                                                           | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.client.transport-type`                                                                           | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.consumer.connection-string`                                                                               | Connection string to connect to an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.consumer-group`                                                                                  | Name of the consumer group this consumer is associated with.                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.consumer.credential.client-certificate-password`                                                          | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.consumer.credential.client-certificate-path`                                                              | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.consumer.credential.client-id`                                                                            | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.credential.client-secret`                                                                        | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.consumer.credential.managed-identity-enabled`                                                             | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.consumer.credential.password`                                                                             | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.consumer.credential.token-credential-bean-name`                                                           | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.consumer.credential.username`                                                                             | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.consumer.custom-endpoint-address`                                                                         | A custom endpoint address when connecting to the Event Hubs service. This can be useful when your network does not allow connecting to the standard Azure Event Hubs endpoint address, but does allow connecting through an intermediary. For example: `https://my.custom.endpoint.com:55300`.                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.consumer.domain-name`                                                                                     | The domain name of an Event Hub namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.enabled`                                                                                         | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.consumer.event-hub-name`                                                                                  | The name of an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.consumer.namespace`                                                                                       | The namespace of an event hub, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.consumer.prefetch-count`                                                                                  | The number of events the Event Hub consumer will actively receive and queue locally without regard to whether a receiving operation is currently active.                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.consumer.profile.cloud-type`                                                                              | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.active-directory-endpoint`                                                   | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.active-directory-graph-api-version`                                          | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.active-directory-graph-endpoint`                                             | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.active-directory-resource-id`                                                | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.azure-application-insights-endpoint`                                         | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                   | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                           | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.azure-log-analytics-endpoint`                                                | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.data-lake-endpoint-resource-id`                                              | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.gallery-endpoint`                                                            | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.key-vault-dns-suffix`                                                        | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.management-endpoint`                                                         | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.microsoft-graph-endpoint`                                                    | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.portal`                                                                      | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.publishing-profile`                                                          | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.resource-manager-endpoint`                                                   | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.service-bus-domain-name`                                                     | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.sql-management-endpoint`                                                     | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.sql-server-hostname-suffix`                                                  | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.consumer.profile.environment.storage-endpoint-suffix`                                                     | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.consumer.profile.subscription-id`                                                                         | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.profile.tenant-id`                                                                               | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.authentication-type`                                                                       | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.hostname`                                                                                  | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.password`                                                                                  | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.port`                                                                                      | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.type`                                                                                      | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.consumer.proxy.username`                                                                                  | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.consumer.resource.region`                                                                                 | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.consumer.resource.resource-group`                                                                         | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.consumer.resource.resource-id`                                                                            | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.consumer.retry.exponential.base-delay`                                                                    | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.consumer.retry.exponential.max-delay`                                                                     | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.consumer.retry.exponential.max-retries`                                                                   | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.consumer.retry.fixed.delay`                                                                               | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.consumer.retry.fixed.max-retries`                                                                         | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.consumer.retry.mode`                                                                                      | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.consumer.retry.try-timeout`                                                                               | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.credential.client-certificate-password`                                                                   | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.credential.client-certificate-path`                                                                       | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.credential.client-id`                                                                                     | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.credential.client-secret`                                                                                 | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.credential.managed-identity-enabled`                                                                      | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.credential.password`                                                                                      | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.credential.token-credential-bean-name`                                                                    | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.credential.username`                                                                                      | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.custom-endpoint-address`                                                                                  | A custom endpoint address when connecting to the Event Hubs service. This can be useful when your network does not allow connecting to the standard Azure Event Hubs endpoint address, but does allow connecting through an intermediary. For example: `https://my.custom.endpoint.com:55300`.                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.domain-name`                                                                                              | The domain name of an Event Hub namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.enabled`                                                                                                  | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.event-hub-name`                                                                                           | The name of an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.namespace`                                                                                                | The namespace of an event hub, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.batch.max-size`                                                                                 | The maximum number of events that will be in the batch.                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.batch.max-wait-time`                                                                            | The max time duration to wait to receive an event before processing events.                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-key`                                                                   | Storage account access key.                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name`                                                                  | Name for the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.blob-name`                                                                     | Name of the blob.                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.connect-timeout`                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.connection-idle-timeout`                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.headers`                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.headers[0].name`                                                        | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.headers[0].values`                                                      | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.logging.allowed-header-names`                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`. |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.logging.allowed-query-param-names`                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.logging.level`                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.logging.pretty-print-body`                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.maximum-connection-pool-size`                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.read-timeout`                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.response-timeout`                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.client.write-timeout`                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.connection-string`                                                             | Connection string to connect to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name`                                                                | Name of the container.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.create-container-if-not-exists`                                                | Whether to create the container if it does not exist. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.customer-provided-key`                                                         | Customer-provided encryption key(base64 encoded string) used to encrypt blob contents on the server. See Microsoft doc about Customer-provided Keys for more [details](/azure/storage/blobs/encryption-customer-provided-keys).                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.encryption-scope`                                                              | Specifies the name of the encryption scope to use to encrypt the data provided in the request. If not specified, encryption is performed with the default account encryption scope. See Microsoft doc about Encryption Scope for more [details](/azure/storage/blobs/encryption-scope-overview).                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.endpoint`                                                                      | Endpoint for Azure Storage service. For instance, `https://{storage-account-name}.blob.storage.azure.net` for blob or `https://{storage-account-name}.file.storage.azure.net` for file share or `https://{storage-account-name}.queue.storage.azure.net` for queue.                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.secondary-host`                                                          | Secondary Storage account to retry requests against if the primary region becomes unavailable. For instance, `https://{storage-account-name}-secondary.file.storage.azure.net`.                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.retry.try-timeout`                                                             | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.sas-token`                                                                     | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.service-version`                                                               | Blob service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.processor.client.application-id`                                                                          | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.client.transport-type`                                                                          | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.connection-string`                                                                              | Connection string to connect to an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.consumer-group`                                                                                 | Name of the consumer group this consumer is associated with.                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.credential.client-certificate-password`                                                         | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.credential.client-certificate-path`                                                             | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.credential.client-id`                                                                           | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.credential.client-secret`                                                                       | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.credential.managed-identity-enabled`                                                            | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.credential.password`                                                                            | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.credential.token-credential-bean-name`                                                          | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.credential.username`                                                                            | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.custom-endpoint-address`                                                                        | A custom endpoint address when connecting to the Event Hubs service. This can be useful when your network does not allow connecting to the standard Azure Event Hubs endpoint address, but does allow connecting through an intermediary. For example: `https://my.custom.endpoint.com:55300`.                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.domain-name`                                                                                    | The domain name of an Event Hub namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.enabled`                                                                                        | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.event-hub-name`                                                                                 | The name of an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.initial-partition-event-position`                                                               | Map event position to use for each partition if a checkpoint for the partition does not exist in CheckpointStore.                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.load-balancing.partition-ownership-expiration-interval`                                         | The time duration after which the ownership of partition expires.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.load-balancing.strategy`                                                                        | The load balancing strategy for claiming partition ownership.                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.load-balancing.update-interval`                                                                 | The time interval between load balancing update cycles.                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.namespace`                                                                                      | The namespace of an event hub, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.prefetch-count`                                                                                 | The number of events the Event Hub consumer will actively receive and queue locally without regard to whether a receiving operation is currently active.                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.profile.cloud-type`                                                                             | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.active-directory-endpoint`                                                  | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.active-directory-graph-api-version`                                         | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.active-directory-graph-endpoint`                                            | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.active-directory-resource-id`                                               | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.azure-application-insights-endpoint`                                        | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                  | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                          | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.azure-log-analytics-endpoint`                                               | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.data-lake-endpoint-resource-id`                                             | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.gallery-endpoint`                                                           | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.key-vault-dns-suffix`                                                       | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.management-endpoint`                                                        | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.microsoft-graph-endpoint`                                                   | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.portal`                                                                     | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.publishing-profile`                                                         | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.resource-manager-endpoint`                                                  | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.service-bus-domain-name`                                                    | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.sql-management-endpoint`                                                    | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.sql-server-hostname-suffix`                                                 | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.profile.environment.storage-endpoint-suffix`                                                    | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.processor.profile.subscription-id`                                                                        | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.profile.tenant-id`                                                                              | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.processor.proxy.authentication-type`                                                                      | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.processor.proxy.hostname`                                                                                 | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.proxy.password`                                                                                 | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.proxy.port`                                                                                     | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.proxy.type`                                                                                     | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.proxy.username`                                                                                 | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.processor.resource.region`                                                                                | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.processor.resource.resource-group`                                                                        | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.processor.resource.resource-id`                                                                           | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.retry.exponential.base-delay`                                                                   | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.retry.exponential.max-delay`                                                                    | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.processor.retry.exponential.max-retries`                                                                  | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.retry.fixed.delay`                                                                              | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.retry.fixed.max-retries`                                                                        | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.processor.retry.mode`                                                                                     | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.processor.retry.try-timeout`                                                                              | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.processor.track-last-enqueued-event-properties`                                                           | Whether request information on the last enqueued event on its associated partition, and track that information as events are received.                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.producer.client.application-id`                                                                           | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.client.transport-type`                                                                           | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.producer.connection-string`                                                                               | Connection string to connect to an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.credential.client-certificate-password`                                                          | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.producer.credential.client-certificate-path`                                                              | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.producer.credential.client-id`                                                                            | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.credential.client-secret`                                                                        | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.producer.credential.managed-identity-enabled`                                                             | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.producer.credential.password`                                                                             | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.producer.credential.token-credential-bean-name`                                                           | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.producer.credential.username`                                                                             | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.producer.custom-endpoint-address`                                                                         | A custom endpoint address when connecting to the Event Hubs service. This can be useful when your network does not allow connecting to the standard Azure Event Hubs endpoint address, but does allow connecting through an intermediary. For example: `https://my.custom.endpoint.com:55300`.                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.producer.domain-name`                                                                                     | The domain name of an Event Hub namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.enabled`                                                                                         | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.producer.event-hub-name`                                                                                  | The name of an event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.producer.namespace`                                                                                       | The namespace of an event hub, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.producer.profile.cloud-type`                                                                              | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.active-directory-endpoint`                                                   | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.active-directory-graph-api-version`                                          | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.active-directory-graph-endpoint`                                             | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.active-directory-resource-id`                                                | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.azure-application-insights-endpoint`                                         | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                   | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                           | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.azure-log-analytics-endpoint`                                                | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.data-lake-endpoint-resource-id`                                              | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.gallery-endpoint`                                                            | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.key-vault-dns-suffix`                                                        | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.management-endpoint`                                                         | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.microsoft-graph-endpoint`                                                    | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.portal`                                                                      | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.publishing-profile`                                                          | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.resource-manager-endpoint`                                                   | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.service-bus-domain-name`                                                     | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.sql-management-endpoint`                                                     | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.sql-server-hostname-suffix`                                                  | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.producer.profile.environment.storage-endpoint-suffix`                                                     | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.producer.profile.subscription-id`                                                                         | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.profile.tenant-id`                                                                               | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.producer.proxy.authentication-type`                                                                       | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.producer.proxy.hostname`                                                                                  | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.producer.proxy.password`                                                                                  | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.proxy.port`                                                                                      | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.producer.proxy.type`                                                                                      | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.producer.proxy.username`                                                                                  | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.producer.resource.region`                                                                                 | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.producer.resource.resource-group`                                                                         | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.producer.resource.resource-id`                                                                            | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.producer.retry.exponential.base-delay`                                                                    | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.producer.retry.exponential.max-delay`                                                                     | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.producer.retry.exponential.max-retries`                                                                   | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.producer.retry.fixed.delay`                                                                               | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.producer.retry.fixed.max-retries`                                                                         | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.producer.retry.mode`                                                                                      | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.producer.retry.try-timeout`                                                                               | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.profile.cloud-type`                                                                                       | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.profile.environment.active-directory-endpoint`                                                            | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.profile.environment.active-directory-graph-api-version`                                                   | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.profile.environment.active-directory-graph-endpoint`                                                      | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.profile.environment.active-directory-resource-id`                                                         | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.profile.environment.azure-application-insights-endpoint`                                                  | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                            | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                                    | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.eventhubs.profile.environment.azure-log-analytics-endpoint`                                                         | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.profile.environment.data-lake-endpoint-resource-id`                                                       | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.eventhubs.profile.environment.gallery-endpoint`                                                                     | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.eventhubs.profile.environment.key-vault-dns-suffix`                                                                 | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.eventhubs.profile.environment.management-endpoint`                                                                  | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.profile.environment.microsoft-graph-endpoint`                                                             | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.profile.environment.portal`                                                                               | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.profile.environment.publishing-profile`                                                                   | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.profile.environment.resource-manager-endpoint`                                                            | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.profile.environment.service-bus-domain-name`                                                              | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.profile.environment.sql-management-endpoint`                                                              | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.profile.environment.sql-server-hostname-suffix`                                                           | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.profile.environment.storage-endpoint-suffix`                                                              | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.eventhubs.profile.subscription-id`                                                                                  | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.profile.tenant-id`                                                                                        | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.eventhubs.proxy.authentication-type`                                                                                | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.eventhubs.proxy.hostname`                                                                                           | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.proxy.password`                                                                                           | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.proxy.port`                                                                                               | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.eventhubs.proxy.type`                                                                                               | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.proxy.username`                                                                                           | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.eventhubs.resource.name`                                                                                            | Namespace of the event hub.                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.resource.region`                                                                                          | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.eventhubs.resource.resource-group`                                                                                  | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.eventhubs.resource.resource-id`                                                                                     | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.retry.exponential.base-delay`                                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.retry.exponential.max-delay`                                                                              | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.eventhubs.retry.exponential.max-retries`                                                                            | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.retry.fixed.delay`                                                                                        | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.eventhubs.retry.fixed.max-retries`                                                                                  | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.eventhubs.retry.mode`                                                                                               | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.eventhubs.retry.try-timeout`                                                                                        | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.eventhubs.shared-connection`                                                                                        | Whether to share the same connection for producers or consumers.                                                                                                                                                                                                                                                                                                                                                                                                              |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-key-vault-certificates.md",
    "content": "---\ntitle: Azure Key Vault Certificates configuration properties\ndescription: This reference doc contains all Azure Key Vault Certificates configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Key Vault Certificates configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                              | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> |-----------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.keyvault.certificate.challenge-resource-verification-enabled`                                       | Whether to enable the Azure Key Vault challenge resource verification, default: true. Calls the disableChallengeResourceVerification method of the Azure Key Vault Client Builder when set to false. The default value is `true`.                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.certificate.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.client.connect-timeout`                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.certificate.client.connection-idle-timeout`                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.certificate.client.headers`                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.client.headers[0].name`                                                        | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.certificate.client.headers[0].values`                                                      | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.client.logging.allowed-header-names`                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`. |\n> | `spring.cloud.azure.keyvault.certificate.client.logging.allowed-query-param-names`                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.certificate.client.logging.level`                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.client.logging.pretty-print-body`                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.certificate.client.maximum-connection-pool-size`                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.certificate.client.read-timeout`                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.client.response-timeout`                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.certificate.client.write-timeout`                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.certificate.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.certificate.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.certificate.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.certificate.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.certificate.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.certificate.endpoint`                                                                      | Azure Key Vault endpoint. For instance, `https://{your-unique-keyvault-name}.vault.azure.net/`.                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.certificate.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.certificate.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.certificate.proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.certificate.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.certificate.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.certificate.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.certificate.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.certificate.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.certificate.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.certificate.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.certificate.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.certificate.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.certificate.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.certificate.service-version`                                                               | The version of Azure Key Vault Certificate Service.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-key-vault-secrets.md",
    "content": "---\ntitle: Azure Key Vault Secrets configuration properties\ndescription: This reference doc contains all Azure Key Vault Secrets configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Key Vault Secrets configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                                             | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> |--------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.keyvault.secret.challenge-resource-verification-enabled`                                                           | Whether to enable the Azure Key Vault challenge resource verification, default: true. Calls the disableChallengeResourceVerification method of the Azure Key Vault Client Builder when set to false. The default value is `true`.                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.client.application-id`                                                                             | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.client.connect-timeout`                                                                            | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.secret.client.connection-idle-timeout`                                                                    | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.secret.client.headers`                                                                                    | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.client.headers[0].name`                                                                            | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.client.headers[0].values`                                                                          | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.client.logging.allowed-header-names`                                                               | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`. |\n> | `spring.cloud.azure.keyvault.secret.client.logging.allowed-query-param-names`                                                          | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.client.logging.level`                                                                              | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.client.logging.pretty-print-body`                                                                  | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.client.maximum-connection-pool-size`                                                               | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.client.read-timeout`                                                                               | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.client.response-timeout`                                                                           | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.client.write-timeout`                                                                              | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.credential.client-certificate-password`                                                            | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.credential.client-certificate-path`                                                                | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.secret.credential.client-id`                                                                              | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.credential.client-secret`                                                                          | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.credential.managed-identity-enabled`                                                               | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.secret.credential.password`                                                                               | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.credential.token-credential-bean-name`                                                             | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.secret.credential.username`                                                                               | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.enabled`                                                                                           | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.endpoint`                                                                                          | Azure Key Vault endpoint. For instance, `https://{your-unique-keyvault-name}.vault.azure.net/`.                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.profile.cloud-type`                                                                                | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.active-directory-endpoint`                                                     | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.active-directory-graph-api-version`                                            | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.active-directory-graph-endpoint`                                               | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.active-directory-resource-id`                                                  | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.azure-application-insights-endpoint`                                           | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`                     | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                             | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.azure-log-analytics-endpoint`                                                  | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.data-lake-endpoint-resource-id`                                                | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.gallery-endpoint`                                                              | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.key-vault-dns-suffix`                                                          | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.management-endpoint`                                                           | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.microsoft-graph-endpoint`                                                      | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.portal`                                                                        | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.publishing-profile`                                                            | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.resource-manager-endpoint`                                                     | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.service-bus-domain-name`                                                       | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.sql-management-endpoint`                                                       | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.sql-server-hostname-suffix`                                                    | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.profile.environment.storage-endpoint-suffix`                                                       | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.profile.subscription-id`                                                                           | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.profile.tenant-id`                                                                                 | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.property-source-enabled`                                                                           | Whether to enable the Key Vault property source. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources`                                                                                  | List of Azure Key Vault property sources. For instance, ` property-sources[0].name=key-vault-property-source-1, property-sources[0].endpoint={ENDPOINT_1}, property-sources[1].name=key-vault-property-source-2, property-sources[1].endpoint={ENDPOINT_2} `.                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].case-sensitive`                                                                | Whether to enable case-sensitive for secret keys. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].challenge-resource-verification-enabled`                                       | Whether to enable the Azure Key Vault challenge resource verification, default: true. Calls the disableChallengeResourceVerification method of the Azure Key Vault Client Builder when set to false. The default value is `true`.                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.connect-timeout`                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.connection-idle-timeout`                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.headers[0].name`                                                        | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.headers[0].values`                                                      | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.logging.allowed-header-names`                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `'x-ms-request-id','x-ms-client-request-id','x-ms-return-client-request-id','traceparent','MS-CV','Accept','Cache-Control','Connection','Content-Length','Content-Type','Date','ETag','Expires','If-Match','If-Modified-Since','If-None-Match','If-Unmodified-Since','Last-Modified','Pragma','Request-Id','Retry-After','Server','Transfer-Encoding','User-Agent','WWW-Authenticate'`. |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.logging.allowed-query-param-names`                                      | Comma-delimited list of allowlist query parameters. The default value is `'api-version'`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.logging.level`                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.logging.pretty-print-body`                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.maximum-connection-pool-size`                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.read-timeout`                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.response-timeout`                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].client.write-timeout`                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].endpoint`                                                                      | Azure Key Vault endpoint. For instance, `https://{your-unique-keyvault-name}.vault.azure.net/`.                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].name`                                                                          | Name of this property source.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: AZURE, AZURE_CHINA, AZURE_US_GOVERNMENT, OTHER. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].secret-keys`                                                                   | The configured secret keys will be loaded from Azure Key Vaults secret, if configured nothing, then load all the secrets. Only support exact value for secret names, For example, if you configured secret key name `SecretKey1` in Key Vaults secret, you should configure `SecretKey1` here.                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.property-sources[0].service-version`                                                               | Secret service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.secret.proxy.hostname`                                                                                    | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.proxy.non-proxy-hosts`                                                                             | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.proxy.password`                                                                                    | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.proxy.port`                                                                                        | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.secret.proxy.type`                                                                                        | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.proxy.username`                                                                                    | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.secret.resource.region`                                                                                   | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.secret.resource.resource-group`                                                                           | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.secret.resource.resource-id`                                                                              | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.retry.exponential.base-delay`                                                                      | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.retry.exponential.max-delay`                                                                       | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.secret.retry.exponential.max-retries`                                                                     | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.retry.fixed.delay`                                                                                 | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.secret.retry.fixed.max-retries`                                                                           | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.secret.retry.mode`                                                                                        | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.keyvault.secret.service-version`                                                                                   | Secret service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                         |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-key-vault.md",
    "content": "---\ntitle: Azure Key Vault configuration properties\ndescription: This reference doc contains all Azure Key Vault configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Key Vault configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                  | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> |-----------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.keyvault.challenge-resource-verification-enabled`                                       | Whether to enable the Azure Key Vault challenge resource verification, default: true. Calls the disableChallengeResourceVerification method of the Azure Key Vault Client Builder when set to false. The default value is `true`.                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.client.connect-timeout`                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.client.connection-idle-timeout`                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.keyvault.client.headers`                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.client.logging.allowed-header-names`                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`. |\n> | `spring.cloud.azure.keyvault.client.logging.allowed-query-param-names`                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.client.logging.level`                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.client.logging.pretty-print-body`                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.client.maximum-connection-pool-size`                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.client.read-timeout`                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.client.response-timeout`                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.client.write-timeout`                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.endpoint`                                                                      | Azure Key Vault endpoint. For instance, `https://{your-unique-keyvault-name}.vault.azure.net/`.                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.keyvault.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.keyvault.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.keyvault.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.keyvault.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.keyvault.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.keyvault.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.keyvault.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.keyvault.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.keyvault.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.keyvault.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.keyvault.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.keyvault.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.keyvault.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.keyvault.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-service-bus-jms.md",
    "content": "---\ntitle: Azure Service Bus JMS configuration properties\ndescription: This reference doc contains all Azure Service Bus JMS configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Service Bus JMS configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                     | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> |--------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.jms.servicebus.connection-string`                      | Connection string to connect to a Service Bus namespace.                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.jms.servicebus.credential`                             | null                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.jms.servicebus.enabled`                                | Whether to enable Service Bus JMS autoconfiguration. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.jms.servicebus.idle-timeout`                           | Connection idle timeout duration that how long the client expects Service Bus to keep a connection alive when no messages delivered. @see <a href=\"http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-transport-v1.0-os.html#doc-doc-idle-time-out\">AMQP specification</a> @see <a href=\"/azure/service-bus-messaging/service-bus-amqp-troubleshoot#link-is-not-created\">Service Bus AMQP Errors</a> The default value is `2m`.                            |\n> | `spring.jms.servicebus.listener.phase`                         | The phase in which this container should be started and stopped.                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.jms.servicebus.listener.reply-pub-sub-domain`          | Whether the reply destination type is topic. Only works for the bean of topicJmsListenerContainerFactory.                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.jms.servicebus.listener.reply-qos-settings`            | The QosSettings to use when sending a reply.                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.jms.servicebus.listener.subscription-durable`          | Whether to make the subscription durable. Only works for the bean of topicJmsListenerContainerFactory. The default value is `true`.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.jms.servicebus.listener.subscription-shared`           | Whether to make the subscription shared. Only works for the bean of topicJmsListenerContainerFactory.                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.jms.servicebus.namespace`                              | The Service Bus namespace.                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.jms.servicebus.passwordless-enabled`                   | Whether to enable supporting azure identity token credentials. If the value is true, then `spring.jms.servicebus.namespace` must be set. If the passwordlessEnabled is true, it will try to authenticate connections with Microsoft Entra ID. The default value is `false`.                                                                                                                                                                                    |\n> | `spring.jms.servicebus.pool.block-if-full`                     | Whether to block when a connection is requested and the pool is full. Set it to false to throw a `JMSException` instead.                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.jms.servicebus.pool.block-if-full-timeout`             | Blocking period before throwing an exception if the pool is still full.                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.jms.servicebus.pool.enabled`                           | Whether a JmsPoolConnectionFactory should be created, instead of a regular ConnectionFactory.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.jms.servicebus.pool.idle-timeout`                      | Connection idle timeout.                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.jms.servicebus.pool.max-connections`                   | Maximum number of pooled connections.                                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.jms.servicebus.pool.max-sessions-per-connection`       | Maximum number of pooled sessions per connection in the pool.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.jms.servicebus.pool.time-between-expiration-check`     | Time to sleep between runs of the idle connection eviction thread. When negative, no idle connection eviction thread runs.                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.jms.servicebus.pool.use-anonymous-producers`           | Whether to use only one anonymous `MessageProducer` instance. Set it to false to create one `MessageProducer` every time one is required.                                                                                                                                                                                                                                                                                                                      |\n> | `spring.jms.servicebus.prefetch-policy.all`                    | Fallback value for prefetch option in this Service Bus namespace. The default value is `0`.                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.jms.servicebus.prefetch-policy.durable-topic-prefetch` | The number of prefetch for durable topic. The default value is `0`.                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.jms.servicebus.prefetch-policy.queue-browser-prefetch` | The number of prefetch for queue browser. The default value is `0`.                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.jms.servicebus.prefetch-policy.queue-prefetch`         | The number of prefetch for queue. The default value is `0`.                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.jms.servicebus.prefetch-policy.topic-prefetch`         | The number of prefetch for topic. The default value is `0`.                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.jms.servicebus.pricing-tier`                           | Pricing tier for a Service Bus namespace.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.jms.servicebus.profile`                                | null                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.jms.servicebus.scopes`                                 | The scopes required for the access token.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.jms.servicebus.topic-client-id`                        | Service Bus topic client ID. Only works for the bean of topicJmsListenerContainerFactory.                                                                                                                                                                                                                                                                                                                                                                      |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-service-bus.md",
    "content": "---\ntitle: Azure Service Bus configuration properties\ndescription: This reference doc contains all Azure Service Bus configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Service Bus configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                              | Description                                                                                                                                                                                        |\n> |-----------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.servicebus.client.application-id`                                                                   | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                      |\n> | `spring.cloud.azure.servicebus.client.transport-type`                                                                   | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                 |\n> | `spring.cloud.azure.servicebus.connection-string`                                                                       | Connection string to connect to a service bus.                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.consumer.auto-complete`                                                                  | Whether to enable auto-complete.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.consumer.client.application-id`                                                          | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                      |\n> | `spring.cloud.azure.servicebus.consumer.client.transport-type`                                                          | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                 |\n> | `spring.cloud.azure.servicebus.consumer.connection-string`                                                              | Connection string to connect to a service bus.                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.consumer.credential.client-certificate-password`                                         | Password of the certificate file.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.credential.client-certificate-path`                                             | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                 |\n> | `spring.cloud.azure.servicebus.consumer.credential.client-id`                                                           | Client ID to use when performing service principal authentication with Azure.                                                                                                                      |\n> | `spring.cloud.azure.servicebus.consumer.credential.client-secret`                                                       | Client secret to use when performing service principal authentication with Azure.                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.credential.managed-identity-enabled`                                            | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`. |\n> | `spring.cloud.azure.servicebus.consumer.credential.password`                                                            | Password to use when performing username/password authentication with Azure.                                                                                                                       |\n> | `spring.cloud.azure.servicebus.consumer.credential.token-credential-bean-name`                                          | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                 |\n> | `spring.cloud.azure.servicebus.consumer.credential.username`                                                            | Username to use when performing username/password authentication with Azure.                                                                                                                       |\n> | `spring.cloud.azure.servicebus.consumer.custom-endpoint-address`                                                        | Sets a custom endpoint address when connecting to the Service Bus service. This can be useful when your network does not allow connecting to the standard Azure Service Bus endpoint address, but does allow connecting through an intermediary. For example: `{@literal https://my.custom.endpoint.com:55300}`. |\n> | `spring.cloud.azure.servicebus.consumer.domain-name`                                                                    | The domain name of a Service Bus namespace.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.consumer.enabled`                                                                        | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.entity-name`                                                                    | The name of a Service Bus Queue or Topic.                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.consumer.entity-type`                                                                    | The type of Service Bus entity, which is a Queue or a Topic.                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.consumer.max-auto-lock-renew-duration`                                                   | Amount of time to continue auto-renewing the lock.                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.consumer.namespace`                                                                      | The namespace of a service bus, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                             |\n> | `spring.cloud.azure.servicebus.consumer.prefetch-count`                                                                 | Prefetch count of the consumer.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.profile.cloud-type`                                                             | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                  |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.active-directory-endpoint`                                  | The Microsoft Entra endpoint to connect to.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.active-directory-graph-api-version`                         | The Azure Active Directory Graph API version.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.active-directory-graph-endpoint`                            | The Azure Active Directory Graph endpoint.                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.active-directory-resource-id`                               | The Microsoft Entra resource ID.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.azure-application-insights-endpoint`                        | The Azure Application Insights endpoint.                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`  | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`          | The Data Lake storage file system endpoint suffix.                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.azure-log-analytics-endpoint`                               | The Azure Log Analytics endpoint.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.data-lake-endpoint-resource-id`                             | The Data Lake endpoint.                                                                                                                                                                            |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.gallery-endpoint`                                           | The gallery endpoint.                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.key-vault-dns-suffix`                                       | The Key Vault DNS suffix.                                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.management-endpoint`                                        | The management service endpoint.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.microsoft-graph-endpoint`                                   | The Microsoft Graph endpoint.                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.portal`                                                     | The management portal URL.                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.publishing-profile`                                         | The publishing settings file URL.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.resource-manager-endpoint`                                  | The resource management endpoint.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.service-bus-domain-name`                                    | The domain name for Service Bus.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.sql-management-endpoint`                                    | The SQL management endpoint.                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.sql-server-hostname-suffix`                                 | The SQL Server hostname suffix.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.profile.environment.storage-endpoint-suffix`                                    | The Storage endpoint suffix.                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.consumer.profile.subscription-id`                                                        | Subscription ID to use when connecting to Azure resources.                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.consumer.profile.tenant-id`                                                              | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                   |\n> | `spring.cloud.azure.servicebus.consumer.proxy.authentication-type`                                                      | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                |\n> | `spring.cloud.azure.servicebus.consumer.proxy.hostname`                                                                 | The host of the proxy.                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.consumer.proxy.password`                                                                 | Password used to authenticate with the proxy.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.consumer.proxy.port`                                                                     | The port of the proxy.                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.consumer.proxy.type`                                                                     | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.proxy.username`                                                                 | Username used to authenticate with the proxy.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.consumer.receive-mode`                                                                   | Mode for receiving messages.                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.consumer.resource.region`                                                                | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.consumer.resource.resource-group`                                                        | The resource group holds an Azure resource.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.consumer.resource.resource-id`                                                           | ID of an Azure resource.                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.consumer.retry.exponential.base-delay`                                                   | Amount of time(Duration) to wait between retry attempts.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.consumer.retry.exponential.max-delay`                                                    | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                               |\n> | `spring.cloud.azure.servicebus.consumer.retry.exponential.max-retries`                                                  | The maximum number of attempts.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.retry.fixed.delay`                                                              | Amount of time(Duration) to wait between retry attempts.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.consumer.retry.fixed.max-retries`                                                        | The maximum number of attempts.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.consumer.retry.mode`                                                                     | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                     |\n> | `spring.cloud.azure.servicebus.consumer.retry.try-timeout`                                                              | Amount of time(Duration) to wait until a timeout.                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.session-enabled`                                                                | Whether to enable session for the consumer.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.consumer.session-idle-timeout`                                                           | Sets the maximum amount of time (Duration) to wait for a message to be received for the currently active session.                                                                                  |\n> | `spring.cloud.azure.servicebus.consumer.sub-queue`                                                                      | Type of the SubQueue to connect to.                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.consumer.subscription-name`                                                              | Name for a topic subscription.                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.credential.client-certificate-password`                                                  | Password of the certificate file.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.credential.client-certificate-path`                                                      | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                 |\n> | `spring.cloud.azure.servicebus.credential.client-id`                                                                    | Client ID to use when performing service principal authentication with Azure.                                                                                                                      |\n> | `spring.cloud.azure.servicebus.credential.client-secret`                                                                | Client secret to use when performing service principal authentication with Azure.                                                                                                                  |\n> | `spring.cloud.azure.servicebus.credential.managed-identity-enabled`                                                     | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`. |\n> | `spring.cloud.azure.servicebus.credential.password`                                                                     | Password to use when performing username/password authentication with Azure.                                                                                                                       |\n> | `spring.cloud.azure.servicebus.credential.token-credential-bean-name`                                                   | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                 |\n> | `spring.cloud.azure.servicebus.credential.username`                                                                     | Username to use when performing username/password authentication with Azure.                                                                                                                       |\n> | `spring.cloud.azure.servicebus.cross-entity-transactions`                                                               | Whether to enable cross entity transaction on the connection to Service bus.                                                                                                                       |\n> | `spring.cloud.azure.servicebus.custom-endpoint-address`                                                                 | Sets a custom endpoint address when connecting to the Service Bus service. This can be useful when your network does not allow connecting to the standard Azure Service Bus endpoint address, but does allow connecting through an intermediary. For example: `{@literal https://my.custom.endpoint.com:55300}`. |\n> | `spring.cloud.azure.servicebus.domain-name`                                                                             | The domain name of a Service Bus namespace.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.enabled`                                                                                 | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.entity-name`                                                                             | The name of a Service Bus Queue or Topic.                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.entity-type`                                                                             | The type of Service Bus entity, which is a Queue or a Topic.                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.namespace`                                                                               | The namespace of a service bus, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                             |\n> | `spring.cloud.azure.servicebus.processor.auto-complete`                                                                 | Whether to enable auto-complete.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.processor.auto-startup`                                                                  | Whether to automatically start the processor after initialization. The default value is `true`.                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                      |\n> | `spring.cloud.azure.servicebus.processor.client.transport-type`                                                         | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                 |\n> | `spring.cloud.azure.servicebus.processor.connection-string`                                                             | Connection string to connect to a service bus.                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.processor.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                 |\n> | `spring.cloud.azure.servicebus.processor.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                      |\n> | `spring.cloud.azure.servicebus.processor.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`. |\n> | `spring.cloud.azure.servicebus.processor.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                       |\n> | `spring.cloud.azure.servicebus.processor.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                 |\n> | `spring.cloud.azure.servicebus.processor.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                       |\n> | `spring.cloud.azure.servicebus.processor.custom-endpoint-address`                                                       | Sets a custom endpoint address when connecting to the Service Bus service. This can be useful when your network does not allow connecting to the standard Azure Service Bus endpoint address, but does allow connecting through an intermediary. For example: `{@literal https://my.custom.endpoint.com:55300}`. |\n> | `spring.cloud.azure.servicebus.processor.domain-name`                                                                   | The domain name of a Service Bus namespace.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.processor.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.entity-name`                                                                   | The name of a Service Bus Queue or Topic.                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.processor.entity-type`                                                                   | The type of Service Bus entity, which is a Queue or a Topic.                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.processor.max-auto-lock-renew-duration`                                                  | Amount of time to continue auto-renewing the lock.                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.processor.max-concurrent-calls`                                                          | Max concurrent messages to process. When session enabled, it applies to each session. For detailed information on concurrency, see [Concurrency in ServiceBusProcessorClient](../sdk/troubleshooting-messaging-service-bus-overview.md#concurrency-in-servicebusprocessorclient). |\n> | `spring.cloud.azure.servicebus.processor.max-concurrent-sessions`                                                       | Maximum number of concurrent sessions to process at any given time.                                                                                                                                |\n> | `spring.cloud.azure.servicebus.processor.namespace`                                                                     | The namespace of a service bus, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                             |\n> | `spring.cloud.azure.servicebus.processor.prefetch-count`                                                                | Prefetch count of the consumer.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                  |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                            |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.processor.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.processor.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                   |\n> | `spring.cloud.azure.servicebus.processor.proxy.authentication-type`                                                     | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                |\n> | `spring.cloud.azure.servicebus.processor.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.processor.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.processor.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.processor.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.processor.receive-mode`                                                                  | Mode for receiving messages.                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.processor.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.processor.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.processor.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.processor.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.processor.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                               |\n> | `spring.cloud.azure.servicebus.processor.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.processor.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.processor.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                     |\n> | `spring.cloud.azure.servicebus.processor.retry.try-timeout`                                                             | Amount of time(Duration) to wait until a timeout.                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.processor.session-enabled`                                                               | Whether to enable session for the consumer.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.processor.sub-queue`                                                                     | Type of the SubQueue to connect to.                                                                                                                                                                |\n> | `spring.cloud.azure.servicebus.processor.subscription-name`                                                             | Name for a topic subscription.                                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.producer.client.application-id`                                                          | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                      |\n> | `spring.cloud.azure.servicebus.producer.client.transport-type`                                                          | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                 |\n> | `spring.cloud.azure.servicebus.producer.connection-string`                                                              | Connection string to connect to a service bus.                                                                                                                                                     |\n> | `spring.cloud.azure.servicebus.producer.credential.client-certificate-password`                                         | Password of the certificate file.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.producer.credential.client-certificate-path`                                             | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                 |\n> | `spring.cloud.azure.servicebus.producer.credential.client-id`                                                           | Client ID to use when performing service principal authentication with Azure.                                                                                                                      |\n> | `spring.cloud.azure.servicebus.producer.credential.client-secret`                                                       | Client secret to use when performing service principal authentication with Azure.                                                                                                                  |\n> | `spring.cloud.azure.servicebus.producer.credential.managed-identity-enabled`                                            | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`. |\n> | `spring.cloud.azure.servicebus.producer.credential.password`                                                            | Password to use when performing username/password authentication with Azure.                                                                                                                       |\n> | `spring.cloud.azure.servicebus.producer.credential.token-credential-bean-name`                                          | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                 |\n> | `spring.cloud.azure.servicebus.producer.credential.username`                                                            | Username to use when performing username/password authentication with Azure.                                                                                                                       |\n> | `spring.cloud.azure.servicebus.producer.custom-endpoint-address`                                                        | Sets a custom endpoint address when connecting to the Service Bus service. This can be useful when your network does not allow connecting to the standard Azure Service Bus endpoint address, but does allow connecting through an intermediary. For example: `{@literal https://my.custom.endpoint.com:55300}`. |\n> | `spring.cloud.azure.servicebus.producer.domain-name`                                                                    | The domain name of a Service Bus namespace.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.producer.enabled`                                                                        | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.producer.entity-name`                                                                    | The name of a Service Bus Queue or Topic.                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.producer.entity-type`                                                                    | The type of Service Bus entity, which is a Queue or a Topic.                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.producer.namespace`                                                                      | The namespace of a service bus, which is the prefix of the FQDN. A FQDN should be composed of &lt;NamespaceName&gt;.&lt;DomainName&gt;                                                             |\n> | `spring.cloud.azure.servicebus.producer.profile.cloud-type`                                                             | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                  |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.active-directory-endpoint`                                  | The Microsoft Entra endpoint to connect to.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.active-directory-graph-api-version`                         | The Azure Active Directory Graph API version.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.active-directory-graph-endpoint`                            | The Azure Active Directory Graph endpoint.                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.active-directory-resource-id`                               | The Microsoft Entra resource ID.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.azure-application-insights-endpoint`                        | The Azure Application Insights endpoint.                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`  | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`          | The Data Lake storage file system endpoint suffix.                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.azure-log-analytics-endpoint`                               | The Azure Log Analytics endpoint.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.data-lake-endpoint-resource-id`                             | The Data Lake endpoint.                                                                                                                                                                            |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.gallery-endpoint`                                           | The gallery endpoint.                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.key-vault-dns-suffix`                                       | The Key Vault DNS suffix.                                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.management-endpoint`                                        | The management service endpoint.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.microsoft-graph-endpoint`                                   | The Microsoft Graph endpoint.                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.portal`                                                     | The management portal URL.                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.publishing-profile`                                         | The publishing settings file URL.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.resource-manager-endpoint`                                  | The resource management endpoint.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.service-bus-domain-name`                                    | The domain name for Service Bus.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.sql-management-endpoint`                                    | The SQL management endpoint.                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.sql-server-hostname-suffix`                                 | The SQL Server hostname suffix.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.producer.profile.environment.storage-endpoint-suffix`                                    | The Storage endpoint suffix.                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.producer.profile.subscription-id`                                                        | Subscription ID to use when connecting to Azure resources.                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.producer.profile.tenant-id`                                                              | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                   |\n> | `spring.cloud.azure.servicebus.producer.proxy.authentication-type`                                                      | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                |\n> | `spring.cloud.azure.servicebus.producer.proxy.hostname`                                                                 | The host of the proxy.                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.producer.proxy.password`                                                                 | Password used to authenticate with the proxy.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.producer.proxy.port`                                                                     | The port of the proxy.                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.producer.proxy.type`                                                                     | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                    |\n> | `spring.cloud.azure.servicebus.producer.proxy.username`                                                                 | Username used to authenticate with the proxy.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.producer.resource.region`                                                                | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.producer.resource.resource-group`                                                        | The resource group holds an Azure resource.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.producer.resource.resource-id`                                                           | ID of an Azure resource.                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.producer.retry.exponential.base-delay`                                                   | Amount of time(Duration) to wait between retry attempts.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.producer.retry.exponential.max-delay`                                                    | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                               |\n> | `spring.cloud.azure.servicebus.producer.retry.exponential.max-retries`                                                  | The maximum number of attempts.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.producer.retry.fixed.delay`                                                              | Amount of time(Duration) to wait between retry attempts.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.producer.retry.fixed.max-retries`                                                        | The maximum number of attempts.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.producer.retry.mode`                                                                     | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                     |\n> | `spring.cloud.azure.servicebus.producer.retry.try-timeout`                                                              | Amount of time(Duration) to wait until a timeout.                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.profile.cloud-type`                                                                      | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                  |\n> | `spring.cloud.azure.servicebus.profile.environment.active-directory-endpoint`                                           | The Microsoft Entra endpoint to connect to.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.profile.environment.active-directory-graph-api-version`                                  | The Azure Active Directory Graph API version.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.profile.environment.active-directory-graph-endpoint`                                     | The Azure Active Directory Graph endpoint.                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.profile.environment.active-directory-resource-id`                                        | The Microsoft Entra resource ID.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.profile.environment.azure-application-insights-endpoint`                                 | The Azure Application Insights endpoint.                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix`           | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`                   | The Data Lake storage file system endpoint suffix.                                                                                                                                                 |\n> | `spring.cloud.azure.servicebus.profile.environment.azure-log-analytics-endpoint`                                        | The Azure Log Analytics endpoint.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.profile.environment.data-lake-endpoint-resource-id`                                      | The Data Lake endpoint.                                                                                                                                                                            |\n> | `spring.cloud.azure.servicebus.profile.environment.gallery-endpoint`                                                    | The gallery endpoint.                                                                                                                                                                              |\n> | `spring.cloud.azure.servicebus.profile.environment.key-vault-dns-suffix`                                                | The Key Vault DNS suffix.                                                                                                                                                                          |\n> | `spring.cloud.azure.servicebus.profile.environment.management-endpoint`                                                 | The management service endpoint.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.profile.environment.microsoft-graph-endpoint`                                            | The Microsoft Graph endpoint.                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.profile.environment.portal`                                                              | The management portal URL.                                                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.profile.environment.publishing-profile`                                                  | The publishing settings file URL.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.profile.environment.resource-manager-endpoint`                                           | The resource management endpoint.                                                                                                                                                                  |\n> | `spring.cloud.azure.servicebus.profile.environment.service-bus-domain-name`                                             | The domain name for Service Bus.                                                                                                                                                                   |\n> | `spring.cloud.azure.servicebus.profile.environment.sql-management-endpoint`                                             | The SQL management endpoint.                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.profile.environment.sql-server-hostname-suffix`                                          | The SQL Server hostname suffix.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.profile.environment.storage-endpoint-suffix`                                             | The Storage endpoint suffix.                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.profile.subscription-id`                                                                 | Subscription ID to use when connecting to Azure resources.                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.profile.tenant-id`                                                                       | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                   |\n> | `spring.cloud.azure.servicebus.proxy.authentication-type`                                                               | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                |\n> | `spring.cloud.azure.servicebus.proxy.hostname`                                                                          | The host of the proxy.                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.proxy.password`                                                                          | Password used to authenticate with the proxy.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.proxy.port`                                                                              | The port of the proxy.                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.proxy.type`                                                                              | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                    |\n> | `spring.cloud.azure.servicebus.proxy.username`                                                                          | Username used to authenticate with the proxy.                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.resource.name`                                                                           | Namespace of the service bus.                                                                                                                                                                      |\n> | `spring.cloud.azure.servicebus.resource.region`                                                                         | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                         |\n> | `spring.cloud.azure.servicebus.resource.resource-group`                                                                 | The resource group holds an Azure resource.                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.resource.resource-id`                                                                    | ID of an Azure resource.                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.retry.exponential.base-delay`                                                            | Amount of time(Duration) to wait between retry attempts.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.retry.exponential.max-delay`                                                             | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                               |\n> | `spring.cloud.azure.servicebus.retry.exponential.max-retries`                                                           | The maximum number of attempts.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.retry.fixed.delay`                                                                       | Amount of time(Duration) to wait between retry attempts.                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.retry.fixed.max-retries`                                                                 | The maximum number of attempts.                                                                                                                                                                    |\n> | `spring.cloud.azure.servicebus.retry.mode`                                                                              | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                     |\n> | `spring.cloud.azure.servicebus.retry.try-timeout`                                                                       | Amount of time(Duration) to wait until a timeout.                                                                                                                                                  |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-storage-blob.md",
    "content": "---\ntitle: Azure Storage Blob configuration properties\ndescription: This reference doc contains all Azure Storage Blob configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Storage Blob configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                      | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> |---------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.storage.blob.account-key`                                                                   | Storage account access key.                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.blob.account-name`                                                                  | Name for the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.blob-name`                                                                     | Name of the blob.                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.client.connect-timeout`                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.blob.client.connection-idle-timeout`                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.blob.client.headers`                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.client.headers[0].name`                                                        | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.blob.client.headers[0].values`                                                      | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.client.logging.allowed-header-names`                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`. |\n> | `spring.cloud.azure.storage.blob.client.logging.allowed-query-param-names`                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.blob.client.logging.level`                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.client.logging.pretty-print-body`                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.blob.client.maximum-connection-pool-size`                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.blob.client.read-timeout`                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.client.response-timeout`                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.client.write-timeout`                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.connection-string`                                                             | Connection string to connect to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.container-name`                                                                | Name of the container.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.blob.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.blob.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.blob.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.blob.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.customer-provided-key`                                                         | Customer-provided encryption key(base64 encoded string) used to encrypt blob contents on the server. See Microsoft doc about Customer-provided Keys for more [details](/azure/storage/blobs/encryption-customer-provided-keys).                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.encryption-scope`                                                              | Specifies the name of the encryption scope to use to encrypt the data provided in the request. If not specified, encryption is performed with the default account encryption scope. See Microsoft doc about Encryption Scope for more [details](/azure/storage/blobs/encryption-scope-overview).                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.blob.endpoint`                                                                      | Endpoint for Azure Storage service. For instance, `https://{storage-account-name}.blob.storage.azure.net` for blob or `https://{storage-account-name}.file.storage.azure.net` for file share or `https://{storage-account-name}.queue.storage.azure.net` for queue.                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.blob.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.blob.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.blob.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.blob.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.blob.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.blob.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.blob.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.blob.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.blob.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.blob.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.blob.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.blob.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.blob.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.blob.proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.blob.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.blob.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.blob.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.blob.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.blob.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.blob.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.blob.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.blob.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.blob.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.blob.retry.secondary-host`                                                          | Secondary Storage account to retry requests against if the primary region becomes unavailable. For instance, `https://{storage-account-name}-secondary.file.storage.azure.net`.                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.blob.retry.try-timeout`                                                             | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.blob.sas-token`                                                                     | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.blob.service-version`                                                               | Blob service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-storage-file-share.md",
    "content": "---\ntitle: Azure Storage File Share configuration properties\ndescription: This reference doc contains all Azure Storage File Share configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Storage File Share configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                           | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> |--------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.storage.fileshare.account-key`                                                                   | Storage account access key.                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.fileshare.account-name`                                                                  | Name for the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.client.connect-timeout`                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.fileshare.client.connection-idle-timeout`                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.fileshare.client.headers`                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.client.headers[0].name`                                                        | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.fileshare.client.headers[0].values`                                                      | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.client.logging.allowed-header-names`                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`. |\n> | `spring.cloud.azure.storage.fileshare.client.logging.allowed-query-param-names`                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.fileshare.client.logging.level`                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.client.logging.pretty-print-body`                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.fileshare.client.maximum-connection-pool-size`                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.fileshare.client.read-timeout`                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.fileshare.client.response-timeout`                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.fileshare.client.write-timeout`                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.fileshare.connection-string`                                                             | Connection string to connect to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.directory-path`                                                                | Path to the directory. For instance, `directory1/directory2`.                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.fileshare.endpoint`                                                                      | Endpoint for Azure Storage service. For instance, `https://{storage-account-name}.blob.storage.azure.net` for blob or `https://{storage-account-name}.file.storage.azure.net` for file share or `https://{storage-account-name}.queue.storage.azure.net` for queue.                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.fileshare.file-path`                                                                     | Path to the file. For instance, `directory1/file1`.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.fileshare.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.fileshare.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.fileshare.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.fileshare.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.fileshare.proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.fileshare.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.fileshare.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.fileshare.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.fileshare.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.fileshare.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.fileshare.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.fileshare.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.fileshare.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.fileshare.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.fileshare.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.fileshare.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.fileshare.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.fileshare.retry.secondary-host`                                                          | Secondary Storage account to retry requests against if the primary region becomes unavailable. For instance, `https://{storage-account-name}-secondary.file.storage.azure.net`.                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.fileshare.retry.try-timeout`                                                             | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.fileshare.sas-token`                                                                     | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.fileshare.service-version`                                                               | Share service version used when making API requests                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.fileshare.share-name`                                                                    | Name of the share.                                                                                                                                                                                                                                                                                                                                                                                                                                                            |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-storage-queue.md",
    "content": "---\ntitle: Azure Storage Queue configuration properties\ndescription: This reference doc contains all Azure Storage Queue configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Storage Queue configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                       | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> |----------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.storage.queue.account-key`                                                                   | Storage account access key.                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.queue.account-name`                                                                  | Name for the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.client.connect-timeout`                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.queue.client.connection-idle-timeout`                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.queue.client.headers`                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.client.headers[0].name`                                                        | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.queue.client.headers[0].values`                                                      | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.client.logging.allowed-header-names`                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`. |\n> | `spring.cloud.azure.storage.queue.client.logging.allowed-query-param-names`                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.client.logging.level`                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.client.logging.pretty-print-body`                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.client.maximum-connection-pool-size`                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.queue.client.read-timeout`                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.client.response-timeout`                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.client.write-timeout`                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.connection-string`                                                             | Connection string to connect to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.queue.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.queue.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.queue.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.endpoint`                                                                      | Endpoint for Azure Storage service. For instance, `https://{storage-account-name}.blob.storage.azure.net` for blob or `https://{storage-account-name}.file.storage.azure.net` for file share or `https://{storage-account-name}.queue.storage.azure.net` for queue.                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.queue.message-encoding`                                                              | How queue message body is represented in HTTP requests and responses. All Supported types are: NONE, BASE64.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.queue.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.queue.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.queue.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.queue.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.queue.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.queue.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.queue.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.queue.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.queue.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.queue.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.queue.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.queue.proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.queue.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.queue.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.queue.queue-name`                                                                    | Name of the storage queue.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.resource.name`                                                                 | Name of the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.queue.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.queue.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.queue.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.queue.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.queue.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.queue.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.queue.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.queue.retry.secondary-host`                                                          | Secondary Storage account to retry requests against if the primary region becomes unavailable. For instance, `https://{storage-account-name}-secondary.file.storage.azure.net`.                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.queue.retry.try-timeout`                                                             | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.queue.sas-token`                                                                     | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.queue.service-version`                                                               | Queue service version used when making API requests.                                                                                                                                                                                                                                                                                                                                                                                                                          |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-azure-storage.md",
    "content": "---\ntitle: Azure Storage configuration properties\ndescription: This reference doc contains all Azure Storage configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Storage configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                 | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> |----------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.storage.account-key`                                                                   | Storage account access key.                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.account-name`                                                                  | Name for the storage account.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.client.connect-timeout`                                                        | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.client.connection-idle-timeout`                                                | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.client.headers`                                                                | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.client.logging.allowed-header-names`                                           | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`. |\n> | `spring.cloud.azure.storage.client.logging.allowed-query-param-names`                                      | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.client.logging.level`                                                          | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.client.logging.pretty-print-body`                                              | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.client.maximum-connection-pool-size`                                           | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.client.read-timeout`                                                           | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.client.response-timeout`                                                       | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.client.write-timeout`                                                          | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.connection-string`                                                             | Connection string to connect to the service.                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.enabled`                                                                       | Whether an Azure Service is enabled. The default value is `true`.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.endpoint`                                                                      | Endpoint for Azure Storage service. For instance, `https://{storage-account-name}.blob.storage.azure.net` for blob or `https://{storage-account-name}.file.storage.azure.net` for file share or `https://{storage-account-name}.queue.storage.azure.net` for queue.                                                                                                                                                                                                           |\n> | `spring.cloud.azure.storage.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.storage.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.storage.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.storage.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.storage.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.storage.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.storage.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.proxy.non-proxy-hosts`                                                         | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.storage.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.storage.resource.region`                                                               | The region of an Azure resource. For instance, `\"eastus\"`.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.storage.resource.resource-group`                                                       | The resource group holds an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.storage.resource.resource-id`                                                          | ID of an Azure resource.                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.storage.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.storage.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.storage.retry.secondary-host`                                                          | Secondary Storage account to retry requests against if the primary region becomes unavailable. For instance, `https://{storage-account-name}-secondary.file.storage.azure.net`.                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.storage.retry.try-timeout`                                                             | Amount of time(Duration) to wait until a timeout.                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.storage.sas-token`                                                                     | Shared access signatures (SAS) token used to authorize requests sent to the service.                                                                                                                                                                                                                                                                                                                                                                                          |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-entra.md",
    "content": "---\ntitle: Microsoft Entra configuration properties\ndescription: This reference doc contains all Microsoft Entra configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Microsoft Entra configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                          | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> |-----------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.active-directory.app-id-uri`                                    | App ID URI that might be used in the `aud` claim of an `id_token`. For instance, `api://{applicationId}`. See Microsoft doc about APP ID URL for more [details](/azure/active-directory/develop/security-best-practices-for-app-registration#application-id-uri).                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.active-directory.application-type`                              | The type of the Microsoft Entra application. Supported types are: `WEB_APPLICATION`, `RESOURCE_SERVER`, `RESOURCE_SERVER_WITH_OBO`, `WEB_APPLICATION_AND_RESOURCE_SERVER`. The value can be inferred by dependencies, only `web_application_and_resource_server` must be configured manually.                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.active-directory.authenticate-additional-parameters`            | Additional parameters above the standard parameters defined in the OAuth 2.0 Authorization Framework. Would be added to the Authorization URL for customizing the Authorization Request. For instance, `prompt: login`. See Microsoft doc about more additional parameters [information](/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code).                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.active-directory.authorization-clients`                         | The OAuth2 authorization clients, contains the authorization grant type, client authentication method and scope. The clients will be converted to OAuth2 `ClientRegistration`, the other `ClientRegistration` information(such as client id, client secret) inherits from the delegated OAuth2 login client `azure`. For instance, `authorization-clients.webapi.authorization-grant-type=on_behalf_of`, `authorization-clients.webapi.client-authentication-method=client_secret_post`, `authorization-clients.webapi.scopes[0]={WEB_API_APP_ID_URL}/WebApi.ExampleScope1`, `authorization-clients.webapi.scopes[0]={WEB_API_APP_ID_URL}/WebApi.ExampleScope2`.  |\n> | `spring.cloud.azure.active-directory.credential.client-certificate-password`        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.active-directory.credential.client-certificate-path`            | Path of a PFX or P12 certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.active-directory.credential.client-id`                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.active-directory.credential.client-secret`                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.active-directory.enabled`                                       | Whether to enable Microsoft Entra ID related auto-configuration. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.active-directory.jwk-set-cache-lifespan`                        | The lifespan (duration) of the cached JWK set before it expires. The default value is `5m`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.active-directory.jwk-set-cache-refresh-time`                    | The refresh time (duration) of the cached JWK set before it expires. The default value is `5m`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.active-directory.jwt-connect-timeout`                           | Connection Timeout (duration) for the JWKSet Remote URL call. The default value is `500s`. @deprecated If you want to configure this, please provide a `RestOperations` bean.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.active-directory.jwt-read-timeout`                              | Read Timeout (duration) for the JWKSet Remote URL call. The default value is `500s`. @deprecated If you want to configure this, please provide a `RestOperations` bean.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.active-directory.jwt-size-limit`                                | Size limit in Bytes of the JWKSet Remote URL call. The default value is `51200`. @deprecated If you want to configure this, please provide a `RestOperations` bean.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.active-directory.post-logout-redirect-uri`                      | The redirect uri after logout. For instance, `http://localhost:8080/`. See Microsoft doc about Redirect URI for more [details](/azure/active-directory/develop/security-best-practices-for-app-registration#redirect-uri).                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.active-directory.profile.cloud-type`                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.active-directory.profile.environment.active-directory-endpoint` | Microsoft Entra endpoint. For example: `https://login.microsoftonline.com/`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.active-directory.profile.environment.microsoft-graph-endpoint`  | Microsoft Graph endpoint. For example: `https://graph.microsoft.com/`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.active-directory.profile.tenant-id`                             | Azure Tenant ID. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |\n> | `spring.cloud.azure.active-directory.redirect-uri-template`                         | Redirection Endpoint: Used by the authorization server to return responses containing authorization credentials to the client via the resource owner user-agent. The default value is `{baseUrl}/login/oauth2/code/`.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map` | Configure which claim will be used to build `GrantedAuthority`, and prefix of the `GrantedAuthority`'s string value. Example: If use the default value, and the `access_token`'s `scp` scope value is `testValue`, then `GrantedAuthority` with `SCOPE_testValue` will be created. The default value is `\"scp\" -> \"SCOPE_\", \"roles\" -> \"APPROLE_\"`.                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.active-directory.resource-server.principal-claim-name`          | Configure which claim in access token be returned in `AuthenticatedPrincipal#getName`. Example: If use the default value, and the `access_token`'s `sub` scope value is `testValue`, then `AuthenticatedPrincipal#getName` will return `testValue`. The default value is `sub`.                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.active-directory.session-stateless`                             | If true activates the stateless auth filter `AADAppRoleStatelessAuthenticationFilter`. The default is false, which activates `AADAuthenticationFilter`. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.active-directory.user-group.allowed-group-ids`                  | The group IDs can be used to construct `GrantedAuthority`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.active-directory.user-group.allowed-group-names`                | The group names can be used to construct `GrantedAuthority`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.active-directory.user-group.use-transitive-members`             | Whether to use transitive way to get members. If `true`, use `v1.0/me/transitiveMemberOf` to get members. Otherwise, use `v1.0/me/memberOf`. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.active-directory.user-name-attribute`                           | Decide which claim to be principal's name.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration-properties-global.md",
    "content": "---\ntitle: Spring Cloud Azure Global configuration properties\ndescription: This reference doc contains all Spring Cloud Azure Global configuration properties.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Spring Cloud Azure Global configuration properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                         | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> |--------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.client.amqp.transport-type`                                                    | Transport type for AMQP-based client. Supported types are: AMQP, AMQP_WEB_SOCKETS.                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.client.application-id`                                                         | Represents current application and is used for telemetry/monitoring purposes.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.client.http.connect-timeout`                                                   | Amount of time(Duration) the request attempts to connect to the remote host and the connection is resolved.                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.client.http.connection-idle-timeout`                                           | Amount of time(Duration) before an idle connection.                                                                                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.client.http.headers`                                                           | List of headers applied to each request sent with client. For instance, `\"myCustomHeader\", \"myStaticValue\"`.                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.client.http.headers[0].name`                                                   | The name of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.client.http.headers[0].values`                                                 | List of values of the header.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.client.http.logging.allowed-header-names`                                      | Comma-delimited list of allowlist headers that should be logged. The default value is `\"x-ms-request-id\",\"x-ms-client-request-id\",\"x-ms-return-client-request-id\",\"traceparent\",\"MS-CV\",\"Accept\",\"Cache-Control\",\"Connection\",\"Content-Length\",\"Content-Type\",\"Date\",\"ETag\",\"Expires\",\"If-Match\",\"If-Modified-Since\",\"If-None-Match\",\"If-Unmodified-Since\",\"Last-Modified\",\"Pragma\",\"Request-Id\",\"Retry-After\",\"Server\",\"Transfer-Encoding\",\"User-Agent\",\"WWW-Authenticate\"`. |\n> | `spring.cloud.azure.client.http.logging.allowed-query-param-names`                                 | Comma-delimited list of allowlist query parameters. The default value is `\"api-version\"`.                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.client.http.logging.level`                                                     | The level of detail to log on HTTP messages. Supported types are: NONE, BASIC, HEADERS, BODY, BODY_AND_HEADERS. The default value is `NONE`.                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.client.http.logging.pretty-print-body`                                         | Whether to pretty print the message bodies. The default value is `false`.                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.client.http.maximum-connection-pool-size`                                      | Maximum connection pool size used by the underlying HTTP client.                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.client.http.read-timeout`                                                      | Amount of time(Duration) used when reading the server response.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.client.http.response-timeout`                                                  | Amount of time(Duration) used when waiting for a server to reply.                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.client.http.write-timeout`                                                     | Amount of time(Duration) each request being sent over the wire.                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.credential.client-certificate-password`                                        | Password of the certificate file.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.credential.client-certificate-path`                                            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.credential.client-id`                                                          | Client ID to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.credential.client-secret`                                                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.credential.managed-identity-enabled`                                           | Whether to enable managed identity to authenticate with Azure. If true and the client-id is set, will use the client ID as user assigned managed identity client ID. The default value is `false`.                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.credential.password`                                                           | Password to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.credential.token-credential-bean-name`                                         | The bean name of type `com.azure.core.credential.TokenCredential` to use when performing authentication with Azure.                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.credential.username`                                                           | Username to use when performing username/password authentication with Azure.                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.profile.cloud-type`                                                            | Name of the Azure cloud to connect to. Supported types are: `AZURE`, `AZURE_CHINA`, `AZURE_US_GOVERNMENT`, `OTHER`. The default value is `AZURE`.                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.profile.environment.active-directory-endpoint`                                 | The Microsoft Entra endpoint to connect to.                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n> | `spring.cloud.azure.profile.environment.active-directory-graph-api-version`                        | The Azure Active Directory Graph API version.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.profile.environment.active-directory-graph-endpoint`                           | The Azure Active Directory Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.profile.environment.active-directory-resource-id`                              | The Microsoft Entra resource ID.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.profile.environment.azure-application-insights-endpoint`                       | The Azure Application Insights endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.profile.environment.azure-data-lake-analytics-catalog-and-job-endpoint-suffix` | The Data Lake analytics catalog and job endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.profile.environment.azure-data-lake-store-file-system-endpoint-suffix`         | The Data Lake storage file system endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                            |\n> | `spring.cloud.azure.profile.environment.azure-log-analytics-endpoint`                              | The Azure Log Analytics endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.profile.environment.data-lake-endpoint-resource-id`                            | The Data Lake endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n> | `spring.cloud.azure.profile.environment.gallery-endpoint`                                          | The gallery endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n> | `spring.cloud.azure.profile.environment.key-vault-dns-suffix`                                      | The Key Vault DNS suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                     |\n> | `spring.cloud.azure.profile.environment.management-endpoint`                                       | The management service endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.profile.environment.microsoft-graph-endpoint`                                  | The Microsoft Graph endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.profile.environment.portal`                                                    | The management portal URL.                                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.profile.environment.publishing-profile`                                        | The publishing settings file URL.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.profile.environment.resource-manager-endpoint`                                 | The resource management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n> | `spring.cloud.azure.profile.environment.service-bus-domain-name`                                   | The domain name for Service Bus.                                                                                                                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.profile.environment.sql-management-endpoint`                                   | The SQL management endpoint.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.profile.environment.sql-server-hostname-suffix`                                | The SQL Server hostname suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.profile.environment.storage-endpoint-suffix`                                   | The Storage endpoint suffix.                                                                                                                                                                                                                                                                                                                                                                                                                                                  |\n> | `spring.cloud.azure.profile.subscription-id`                                                       | Subscription ID to use when connecting to Azure resources.                                                                                                                                                                                                                                                                                                                                                                                                                    |\n> | `spring.cloud.azure.profile.tenant-id`                                                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                                              |\n> | `spring.cloud.azure.proxy.amqp.authentication-type`                                                | Authentication type used against the proxy. For instance, `none`, `basic`, `digest`. The default value is `'none'`.                                                                                                                                                                                                                                                                                                                                                           |\n> | `spring.cloud.azure.proxy.hostname`                                                                | The host of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.proxy.http.non-proxy-hosts`                                                    | A list of hosts or CIDR to not use proxy HTTP/HTTPS connections through.                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.proxy.password`                                                                | Password used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.proxy.port`                                                                    | The port of the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n> | `spring.cloud.azure.proxy.type`                                                                    | The type of the proxy. For instance of http, `http`, `socks4`, `socks5`. For instance of amqp, `http`, `socks`.                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.proxy.username`                                                                | Username used to authenticate with the proxy.                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n> | `spring.cloud.azure.retry.amqp.try-timeout`                                                        | Amount of time(Duration) to wait until timeout.                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.retry.exponential.base-delay`                                                  | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.retry.exponential.max-delay`                                                   | Maximum permissible amount of time(duration) between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                          |\n> | `spring.cloud.azure.retry.exponential.max-retries`                                                 | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.retry.fixed.delay`                                                             | Amount of time(Duration) to wait between retry attempts.                                                                                                                                                                                                                                                                                                                                                                                                                      |\n> | `spring.cloud.azure.retry.fixed.max-retries`                                                       | The maximum number of attempts.                                                                                                                                                                                                                                                                                                                                                                                                                                               |\n> | `spring.cloud.azure.retry.mode`                                                                    | The retry backoff mode when retrying. Supported types are: FIXED, EXPONENTIAL.                                                                                                                                                                                                                                                                                                                                                                                                |\n"
  },
  {
    "path": "articles/java/spring-framework/configuration.md",
    "content": "---\ntitle: Spring Cloud Azure configuration\ndescription: This reference doc contains all Spring Cloud Azure common configuration.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure configuration\n\nThis article describes all the Spring Cloud Azure common configuration properties.\n\n## Configuration for each Azure Service SDK\n\nMost of Azure Service SDKs can be divided into two categories by transport type: HTTP-based or AMQP-based. There are properties that are common to all SDKs, such as authentication principals and Azure environment settings, or common to HTTP-based clients, such as logging level to log HTTP requests and responses. Starting with Spring Cloud Azure 4.0, we added five common categories of configuration properties that you can specify for each Azure service.\n\nThe following table lists properties common to multiple services:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                      | Description                                                                  |\n> |-----------------------------------------------|------------------------------------------------------------------------------|\n> | `spring.cloud.azure.azure-service.client`     | Configures the transport clients underneath one Azure service SDK.           |\n> | `spring.cloud.azure.azure-service.credential` | Configures authentication with Microsoft Entra ID for one Azure service SDK. |\n> | `spring.cloud.azure.azure-service.profile`    | Configures the Azure cloud environment for one Azure service SDK.            |\n> | `spring.cloud.azure.azure-service.proxy`      | Configures the proxy options for one Azure service SDK.                      |\n> | `spring.cloud.azure.azure-service.retry`      | Configures the retry options applicable to one Azure service SDK. The retry options has supported part of the SDKs, there's no `spring.cloud.azure.cosmos.retry`. |\n\nThe configuration properties prefixes have been unified to the `spring.cloud.azure` namespace since Spring Cloud Azure 4.0 to make configuration properties more consistent and more intuitive. The following table provides a quick review of the prefixes for supported Azure services:\n\n| Azure service               | Configuration property prefix             | Configuration properties link                                                                                          |\n|-----------------------------|-------------------------------------------|------------------------------------------------------------------------------------------------------------------------|\n| Azure App Configuration     | `spring.cloud.azure.appconfiguration`     | [App Configuration configuration properties](configuration-properties-azure-app-configuration.md)                |\n| Azure Cosmos DB             | `spring.cloud.azure.cosmos`               | [Azure Cosmos DB configuration properties](configuration-properties-azure-cosmos-db.md)                          |\n| Azure Event Hubs            | `spring.cloud.azure.eventhubs`            | [Event Hubs configuration properties](configuration-properties-azure-event-hubs.md) |\n| Azure Key Vault Certificate | `spring.cloud.azure.keyvault.certificate` | [Key Vault Certificates configuration properties](configuration-properties-azure-key-vault-certificates.md)      |\n| Azure Key Vault Secret      | `spring.cloud.azure.keyvault.secret`      | [Key Vault Secrets configuration properties](configuration-properties-azure-key-vault-secrets.md)                |\n| Azure Service Bus           | `spring.cloud.azure.servicebus`           | [Service Bus configuration properties](configuration-properties-azure-service-bus.md)                            |\n| Azure Storage Blob          | `spring.cloud.azure.storage.blob`         | [Storage Blob configuration properties](configuration-properties-azure-storage-blob.md)                          |\n| Azure Storage File Share    | `spring.cloud.azure.storage.fileshare`    | [Storage File Share configuration properties](configuration-properties-azure-storage-file-share.md)              |\n| Azure Storage Queue         | `spring.cloud.azure.storage.queue`        | [Storage Queue configuration properties](configuration-properties-azure-storage-queue.md)                        |\n\n## Global configuration for Azure Service SDKs\n\nThere are some properties that you can share among different Azure services, for example to use the same service principal to access Azure Cosmos DB and Azure Event Hubs. Spring Cloud Azure 4.0 enables you to define properties that apply to all Azure SDKs in the namespace `spring.cloud.azure`.\n\nThe following table lists global properties:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                        | Description                                                                          |\n> |---------------------------------|--------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.client`     | Configures the transport clients; applies to all Azure SDKs by default.              |\n> | `spring.cloud.azure.credential` | Configures authentication with Microsoft Entra ID for all Azure SDKs by default. |\n> | `spring.cloud.azure.profile`    | Configures the Azure cloud environment for all Azure SDKs by default.                |\n> | `spring.cloud.azure.proxy`      | Configures the proxy options applicable to all Azure SDK clients by default.         |\n> | `spring.cloud.azure.retry`      | Configures the retry options applicable to all Azure SDK clients by default.         |\n\n> [!NOTE]\n> Properties configured under each Azure service will override the global configurations.\n\n## Configuration examples\n\n### Global retry configuration for Azure Service SDKs\n\nThe following example shows you how to configure the retry behavior for any HTTP or AMQP protocol based Azure SDK client:\n\n```yaml\nspring.cloud.azure:\n  retry:\n    mode: exponential\n    exponential:\n      max-retries: 4\n      base-delay: PT0.0801S\n      max-delay: PT9S\n```\n\n### Retry configuration for Key Vault property source\n\nThe following configuration example shows you how to configure the retry behavior for the Azure Key Vault Secret client:\n\n```yaml\nspring.cloud.azure:\n  keyvault:\n    secret:\n      property-source-enabled: true\n      property-sources:\n        - endpoint: <your-Azure-Key-Vault-endpoint>\n          retry:\n            mode: exponential\n            exponential:\n              max-retries: 4\n              base-delay: PT0.0801S\n              max-delay: PT9S\n```\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-app-with-cosmos-db-on-app-service-linux.md",
    "content": "---\ntitle: Use Spring Data with Azure Cosmos DB for Apache Cassandra API\ndescription: This article will walk you through the process of building, configuring, deploying, troubleshooting, and scaling Java Web apps in Azure App Service on Linux.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli, spring-cloud-azure, devx-track-extended-java, linux-related-content\n---\n\n# Use Spring Data with Azure Cosmos DB for Apache Cassandra API\n\nThis article will walk you through the process of building, configuring, deploying, troubleshooting, and scaling Java Web apps in Azure App Service on Linux.\n\nIt will demonstrate the usage of the following components:\n\n- [Spring Boot Starter with Azure Cosmos DB for NoSQL](configure-spring-boot-starter-java-app-with-cosmos-db.md)\n- [Azure Cosmos DB](/azure/cosmos-db/sql-api-introduction)\n- [App Service Linux](/azure/app-service/containers/app-service-linux-intro)\n\n## Prerequisites\n\nThe following prerequisites are required in order to follow the steps in this article:\n\n- In order to deploy a Java Web app to cloud, you need an Azure subscription. If you don't already have an Azure subscription, you can activate your [MSDN subscriber benefits](https://azure.microsoft.com/pricing/member-offers/msdn-benefits-details/) or sign up for a [free Azure account](https://azure.microsoft.com/pricing/free-trial/).\n- [Azure CLI 2.0](/cli/azure/install-azure-cli)\n- [Java 8 JDK](../fundamentals/java-jdk-install.md)\n- [Maven 3](http://maven.apache.org/)\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this article.\n\n## Clone the Sample Java Web App Repository\n\nFor this exercise you'll be using the Spring Todo app, which is a Java application built using [Spring Boot](https://spring.io/projects/spring-boot), [Spring Data for Azure Cosmos DB](./configure-spring-boot-starter-java-app-with-cosmos-db.md) and [Azure Cosmos DB](/azure/cosmos-db/sql-api-introduction).\n\n1. Clone the Spring Todo app and copy the contents of the **.prep** folder to initialize the project:\n\n   For bash:\n\n   ```bash\n   git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git\n   yes | cp -rf .prep/* .\n   ```\n\n   For Windows:\n\n   ```cmd\n   git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git\n   cd e2e-java-experience-in-app-service-linux-part-2\n   xcopy .prep /f /s /e /y\n   ```\n\n1. Change the directory to the following folder in the cloned repo:\n\n   ```bash\n   cd initial\\spring-todo-app\n   ```\n\n## Create an Azure Cosmos DB from Azure CLI\n\nThe following procedure creates Azure Cosmos DB database using CLI.\n\n1. Sign in to your Azure CLI, and set your subscription ID.\n\n   ```azurecli\n   az login\n   ```\n\n1. Set the subscription ID if needed.\n\n   ```azurecli\n   az account set -s <your-subscription-id>\n   ```\n\n1. Create an Azure resource group, and save aside the resource group name for later use.\n\n   ```azurecli\n   az group create \\\n       --name <your-azure-group-name> \\\n       --location <your-resource-group-region>\n   ```\n\n1. Create the Azure Cosmos DB and specify the type as GlobalDocumentDB.\nThe name of the Azure Cosmos DB must use only lower case letters. Make sure to note the `documentEndpoint` field in the response. You need this value later.\n\n   ```azurecli\n   az cosmosdb create \\\n       --resource-group <your-resource-group-name> \\\n       --name <your-azure-COSMOS-DB-name-in-lower-case-letters> \\\n       --kind GlobalDocumentDB\n   ```\n\n1. Get your Azure Cosmos DB keys, record the `primaryMasterKey` value for later use.\n\n   ```azurecli\n   az cosmosdb keys list \\\n       --resource-group <your-azure-group-name> \\\n       --name <your-azure-COSMOSDB-name>\n   ```\n\n## Build and Run the App Locally\n\nThe following procedure runs the application on the development computer.\n\n1. Within your console of choice, configure the environment variables shown in the following code sections with the Azure and Azure Cosmos DB connection information you gathered previously in this article. You need to provide a unique name for **WEBAPP_NAME** and value for the **REGION** variables.\n\n   For Linux (Bash):\n\n   ```bash\n   export COSMOS_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>\n   export COSMOS_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>\n   export COSMOS_DATABASE=<put-your-COSMOS-DATABASE-name-here>\n   export RESOURCEGROUP_NAME=<put-your-resource-group-name-here>\n   export WEBAPP_NAME=<put-your-Webapp-name-here>\n   export REGION=<put-your-REGION-here>\n   export SUBSCRIPTION_ID=<put-your-SUBSCRIPTION_ID-here>\n   ```\n\n   For Windows (Command Prompt):\n\n   ```cmd\n   set COSMOS_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>\n   set COSMOS_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>\n   set COSMOS_DATABASE=<put-your-COSMOS-DATABASE-name-here>\n   set RESOURCEGROUP_NAME=<put-your-resource-group-name-here>\n   set WEBAPP_NAME=<put-your-Webapp-name-here>\n   set REGION=<put-your-REGION-here>\n   set SUBSCRIPTION_ID=<put-your-SUBSCRIPTION_ID-here>\n   ```\n\n   > [!NOTE]\n   > If you'd like to provision these variables with a script, there is a template for Bash in the .prep directory that you can copy and use as a starting point.\n\n1. Change the directory by using the following command:\n\n   ```bash\n   cd initial/spring-todo-app\n   ```\n\n1. Run the Spring Todo app locally with the following command:\n\n   ```bash\n   mvn package spring-boot:run\n   ```\n\n1. Once the application has started, you can validate the deployment by accessing the Spring Todo app here: `http://localhost:8080/`.\n\n   ![Spring app running locally][SCDB01]\n\n## Deploy to App Service Linux\n\nThe following procedure deploys the application to Linux on Azure.\n\n1. Open the **pom.xml** file that you previously copied to the **initial/spring-todo-app** directory of the repository. Ensure that the [Maven Plugin for Azure App Service](https://github.com/Microsoft/azure-maven-plugins/blob/develop/azure-webapp-maven-plugin/README.md) is included as seen in the following **pom.xml** file. If the version isn't set to **1.14.0**, then update the value.\n\n   ```xml\n   <plugins> \n   \n       <!--*************************************************-->\n       <!-- Deploy to Java SE in App Service Linux           -->\n       <!--*************************************************-->\n          \n       <plugin>\n           <groupId>com.microsoft.azure</groupId>\n           <artifactId>azure-webapp-maven-plugin</artifactId>\n           <version>1.14.0</version>\n           <configuration>\n               <schemaVersion>v2</schemaVersion>\n               <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>\n               <!-- Web App information -->\n               <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>\n               <appName>${WEBAPP_NAME}</appName>\n               <region>${REGION}</region>\n               <pricingTier>P1v2</pricingTier>\n               <!-- Java Runtime Stack for Web App on Linux-->\n               <runtime>\n                   <os>Linux</os>\n                   <javaVersion>Java 8</javaVersion>\n                   <webContainer>Java SE</webContainer>\n               </runtime>\n               <deployment>\n                   <resources>\n                       <resource>\n                           <directory>${project.basedir}/target</directory>\n                           <includes>\n                               <include>*.jar</include>\n                           </includes>\n                       </resource>\n                   </resources>\n               </deployment>\n               <appSettings>\n                   <property>\n                       <name>COSMOS_URI</name>\n                       <value>${COSMOS_URI}</value>\n                   </property>\n                   <property>\n                       <name>COSMOS_KEY</name>\n                       <value>${COSMOS_KEY}</value>\n                   </property>\n                   <property>\n                       <name>COSMOS_DATABASE</name>\n                       <value>${COSMOS_DATABASE}</value>\n                   </property>\n                   <property>\n                       <name>JAVA_OPTS</name>\n                       <value>-Dserver.port=80</value>\n                   </property>\n               </appSettings>\n               \n           </configuration>\n       </plugin>            \n       ...\n   </plugins>\n   ```\n\n1. Deploy to Java SE in App Service Linux\n\n   ```bash\n   mvn azure-webapp:deploy\n   ```\n\n   ```bash\n   // Deploy\n   bash-3.2$ mvn azure-webapp:deploy\n   [INFO] Scanning for projects...\n   [INFO]\n   [INFO] -------< com.azure.spring.samples:spring-todo-app >--------\n   [INFO] Building spring-todo-app 2.0-SNAPSHOT\n   [INFO] --------------------------------[ jar ]---------------------------------\n   [INFO]\n   [INFO] --- azure-webapp-maven-plugin:1.14.0:deploy (default-cli) @ spring-todo-app ---\n   Auth type: AZURE_CLI\n   Default subscription: Consoto Subscription(subscription-id-xxx)\n   Username: user@contoso.com\n   [INFO] Subscription: Consoto Subscription(subscription-id-xxx)\n   [INFO] Creating app service plan...\n   [INFO] Successfully created app service plan asp-spring-todo-app.\n   [INFO] Creating web app spring-todo-app...\n   [INFO] Successfully created Web App spring-todo-app.\n   [INFO] Trying to deploy artifact to spring-todo-app...\n   [INFO] Successfully deployed the artifact to https://spring-todo-app.azurewebsites.net\n   [INFO] ------------------------------------------------------------------------\n   [INFO] BUILD SUCCESS\n   [INFO] ------------------------------------------------------------------------\n   [INFO] Total time:  02:05 min\n   [INFO] Finished at: 2021-05-28T09:43:19+08:00\n   [INFO] ------------------------------------------------------------------------\n   ```\n\n1. Browse to your web app running on Java SE in App Service Linux:\n\n   ```bash\n   https://<WEBAPP_NAME>.azurewebsites.net\n   ```\n\n![Spring app running in App Service on Linux][SCDB02]\n\n## Troubleshoot Spring Todo App on Azure by Viewing Logs\n\nThe following procedure opens log files on Azure.\n\n1. Configure logs for the deployed Java Web app in Azure App Service in Linux:\n\n   ```azurecli\n   az webapp log config \\\n       --name ${WEBAPP_NAME} \\\n       --resource-group ${RESOURCEGROUP_NAME} \\\n       --web-server-logging filesystem\n   ```\n\n1. Open Java Web app remote log stream from a local machine:\n\n   ```azurecli\n   az webapp log tail \\\n       --name ${WEBAPP_NAME} \\\n       --resource-group ${RESOURCEGROUP_NAME}\n   ```\n\n   ```bash\n   bash-3.2$ az webapp log tail --name ${WEBAPP_NAME}  --resource-group ${RESOURCEGROUP_NAME}\n   2021-05-28T01:46:08.000655632Z   _____                               \n   2021-05-28T01:46:08.000701432Z   /  _  \\ __________ _________   ____  \n   2021-05-28T01:46:08.000708133Z  /  /_\\  \\___   /  |  \\_  __ \\_/ __ \\ \n   2021-05-28T01:46:08.000711733Z /    |    \\/    /|  |  /|  | \\/\\  ___/ \n   2021-05-28T01:46:08.000714933Z \\____|__  /_____ \\____/ |__|    \\___  >\n   2021-05-28T01:46:08.000718233Z         \\/      \\/                  \\/ \n   2021-05-28T01:46:08.000721333Z A P P   S E R V I C E   O N   L I N U X\n   2021-05-28T01:46:08.000724233Z Documentation: http://aka.ms/webapp-linux\n   ...\n   ...\n   2021-05-28T01:46:18.925044188Z   .   ____          _            __ _ _\n   2021-05-28T01:46:18.925481392Z  /\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\\n   2021-05-28T01:46:18.926004297Z ( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\\n   2021-05-28T01:46:18.926587603Z  \\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )\n   2021-05-28T01:46:18.926599403Z   '  |____| .__|_| |_|_| |_\\__, | / / / /\n   2021-05-28T01:46:18.926841806Z  =========|_|==============|___/=/_/_/_/\n   2021-05-28T01:46:18.931157849Z  :: Spring Boot ::                (v2.4.5)\n   ...\n   ...\n   2021-05-28T01:46:29.842553633Z 2021-05-28 01:46:29.842  INFO 124 --- [           main] c.azure.spring.   samples.TodoApplication   : Started TodoApplication in 12.635 seconds (JVM running for 17.664)\n   2021-05-28T01:46:30.477951594Z 2021-05-28 01:46:30.477  INFO 124 --- [p-nio-80-exec-1] o.a.c.c.C.   [Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'\n   2021-05-28T01:46:30.483316162Z 2021-05-28 01:46:30.483  INFO 124 --- [p-nio-80-exec-1] o.s.web.   servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'\n   2021-05-28T01:46:30.485411088Z 2021-05-28 01:46:30.484  INFO 124 --- [p-nio-80-exec-1] o.s.web.   servlet.DispatcherServlet        : Completed initialization in 0 ms\n   2021-05-28T01:47:19.683003828Z 2021-05-28 01:47:19.682  INFO 124 --- [p-nio-80-exec-9] c.a.s.s.   controller.TodoListController    : GET request access '/api/todolist' path.\n   2021-05-28T01:47:26.069984388Z 2021-05-28 01:47:26.069  INFO 124 --- [-nio-80-exec-10] c.a.s.s.   controller.TodoListController    : POST request access '/api/todolist' path with item: Milk\n   2021-05-28T01:47:26.649080678Z 2021-05-28 01:47:26.648  INFO 124 --- [p-nio-80-exec-1] c.a.s.s.   controller.TodoListController    : GET request access '/api/todolist' path.\n   ```\n\n## Scale out the Spring Todo App\n\nUse the following procedure to scale the application.\n\n1. Scale out Java Web app using Azure CLI:\n\n   ```azurecli\n   az appservice plan update \\\n       --number-of-workers 2 \\\n       --name ${WEBAPP_PLAN_NAME} \\\n       --resource-group ${RESOURCEGROUP_NAME}\n   ```\n\n## Next steps\n\n- [Java in App Service Linux dev guide](/azure/app-service/containers/app-service-linux-java)\n- [Azure for Java Developers](../index.yml)\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Spring on Azure](./index.yml)\n\n### See also\n\nFor more information about using Spring Boot applications on Azure, see the following articles:\n\n- [Deploy a Spring Boot application to Linux on Azure App Service](deploy-spring-boot-java-app-on-linux.md)\n\n- [Running a Spring Boot Application on a Kubernetes Cluster in the Azure Container Service](deploy-spring-boot-java-app-on-kubernetes.md)\n\nFor more information about using Azure with Java, see the [Azure for Java Developers] and the [Working with Azure DevOps and Java].\n\nThe **[Spring Framework]** is an open-source solution that helps Java developers create enterprise-level applications. One of the more-popular projects that is built on top of that platform is [Spring Boot], which provides a simplified approach for creating stand-alone Java applications. To help developers get started with Spring Boot, several sample Spring Boot packages are available at <https://github.com/spring-guides/>. In addition to choosing from the list of basic Spring Boot projects, the **[Spring Initializr]** helps developers get started with creating custom Spring Boot applications.\n\n<!-- URL List -->\n\n[Azure Cosmos DB Documentation]: /azure/cosmos-db/\n[Azure for Java Developers]: ../index.yml\n[Build a SQL API app with Java]: /azure/cosmos-db/create-sql-api-java \n[Spring Data for Azure Cosmos DB]: https://azure.microsoft.com/blog/spring-data-azure-cosmos-db-nosql-data-access-on-azure/\n[free Azure account]: https://azure.microsoft.com/pricing/free-trial/\n[Working with Azure DevOps and Java]: https://azure.microsoft.com/services/devops/java/\n[MSDN subscriber benefits]: https://azure.microsoft.com/pricing/member-offers/msdn-benefits-details/\n[Spring Boot]: https://spring.io/projects/spring-boot/\n[Spring Initializr]: https://start.spring.io/\n[Spring Framework]: https://spring.io/\n\n<!-- IMG List -->\n\n[SCDB01]: media/configure-spring-app-with-cosmos-db-on-app-service-linux/SCDB01.png\n[SCDB02]: media/configure-spring-app-with-cosmos-db-on-app-service-linux/SCDB02.png\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-boot-initializer-java-app-with-event-grid.md",
    "content": "---\ntitle: Use Azure Event Grid in Spring\ndescription: Configure a Spring Boot application created with the Spring Initializr to use the Azure Event Grid.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiada\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Use Azure Event Grid in Spring\n\nThis article shows you how to use Azure Event Grid to send an event to a topic and use Service Bus Queue as an [Event Handler](/azure/event-grid/event-handlers) to receive in a Spring Boot application.\n\nThe [Azure Event Grid](/azure/event-grid/) service is a highly scalable, fully managed Pub Sub message distribution service that offers flexible message consumption patterns using the MQTT and HTTP protocols.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 8 or higher.\n\n- [Apache Maven](http://maven.apache.org/), version 3.0 or higher.\n\n- An Event Grid Topic instance. If you don't have one, see [Create a custom topic or a domain in Azure Event Grid](/azure/event-grid/create-custom-topic).\n\n- A Service Bus Queue instance. If you don't have one, see [Create a queue in the Azure portal](/azure/service-bus-messaging/service-bus-quickstart-portal).\n\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and select Java version 8 or higher.\n\n## Subscribe to custom topic\n\nUse the following steps to create an event subscription to tell the Event Grid to send events to the Service Bus Queue:\n\n1. In the Azure portal, navigate to your Event Grid Topic instance.\n1. Select **Event Subscriptions** on the toolbar.\n1. On the **Create Event Subscription page**, enter a **name** value for the event subscription.\n1. For **Endpoint Type**, select **Service Bus Queue**.\n1. Choose **Select an endpoint** and then select the Service Bus Queue instance you created earlier.\n\n## Send an event by Azure Event Grid and receive by Azure Service Bus Queue\n\nWith an Azure Event Grid resource, you can send an event using Spring Cloud Azure Event Grid. With an Azure Service Bus Queue resource as an event handler, you can receive the event using Spring Cloud Azure Stream Binder for Service Bus.\n\nTo install the Spring Cloud Azure Event Grid Starter module and the Spring Cloud Azure Stream Binder Service Bus module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Event Grid Starter artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-eventgrid</artifactId>\n  </dependency>\n  ```\n\n- The Spring Cloud Azure Stream Binder Service Bus artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-stream-binder-servicebus</artifactId>\n  </dependency>\n  ```\n\n## Code the application\n\nUse the following steps to configure your application to send an event by using Event Grid and receive by using Service Bus Queue.\n\n1. Configure Azure Event Grid and Service Bus credentials in the **application.yaml** configuration file, as shown in the following example:\n\n   ```properties\n   spring:\n     cloud:\n       azure:\n         eventgrid:\n           endpoint: ${AZURE_EVENTGRID_ENDPOINT}\n           key: ${AZURE_EVENTGRID_KEY}\n         servicebus:\n           connection-string: ${AZURE_SERVICEBUS_CONNECTION_STRING}\n       function:\n         definition: consume\n       stream:\n         bindings:\n           consume-in-0:\n             destination: ${AZURE_SERVICEBUS_QUEUE_NAME}\n         servicebus:\n           bindings:\n             consume-in-0:\n               consumer:\n                 auto-complete: false\n   ```\n\n   [!INCLUDE [security-note](../includes/security-note.md)]\n\n1. Edit the startup class file to show the following content. This code generates completions.\n\n   ```java\n   import com.azure.core.util.BinaryData;\n   import com.azure.messaging.eventgrid.EventGridEvent;\n   import com.azure.messaging.eventgrid.EventGridPublisherClient;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.beans.factory.annotation.Autowired;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.messaging.Message;\n\n   import java.util.List;\n   import java.util.function.Consumer;\n\n   @SpringBootApplication\n   public class EventGridSampleApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(EventGridSampleApplication.class);\n\n       @Autowired\n       EventGridPublisherClient<EventGridEvent> client;\n\n       public static void main(String[] args) {\n           SpringApplication.run(EventGridSampleApplication.class, args);\n       }\n\n       @Bean\n       public Consumer<Message<String>> consume() {\n           return message -> {\n               List<EventGridEvent> eventData = EventGridEvent.fromString(message.getPayload());\n               eventData.forEach(event -> {\n                   LOGGER.info(\"New event received: '{}'\", event.getData());\n               });\n           };\n       }\n\n       @Override\n       public void run(String... args) throws Exception {\n           String str = \"FirstName: John, LastName: James\";\n           EventGridEvent event = new EventGridEvent(\"A user is created\", \"User.Created.Text\", BinaryData.fromObject(str), \"0.1\");\n\n           client.sendEvent(event);\n           LOGGER.info(\"New event published: '{}'\", event.getData());\n       }\n   }\n\n   ```\n\n1. Start the application. After launch, the application produces logs similar to the following example:\n\n   ```output\n   New event published: '\"FirstName: John, LastName: James\"'\n   ...\n   New event received: '\"FirstName: John, LastName: James\"'\n   ```\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Event Grid samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/eventgrid)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-boot-initializer-java-app-with-redis-cache.md",
    "content": "---\ntitle: Use Azure Redis Cache in Spring\ndescription: Configure a Spring Boot application created with the Spring Initializr to use the Redis in the cloud with Azure Cache for Redis.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiada\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\nzone_pivot_groups: redis-type\n---\n\n# Use Azure Redis Cache in Spring\n\n[Azure Cache for Redis](/azure/azure-cache-for-redis/) provides an in-memory data store based on the Redis software. [Redis](https://redis.io/) improves the performance and scalability of an application that uses backend data stores heavily.\n\nThis tutorial demonstrates how to use a Redis cache to store and retrieve data in a Spring Boot application.\n\nIn this tutorial, we include two authentication methods: Microsoft Entra authentication and Redis authentication. The Passwordless tab shows the Microsoft Entra authentication and the Password tab shows the Redis authentication.\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Cache for Redis using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nRedis authentication uses passwords in Redis. If you choose to use passwords as credentials, you need to manage the passwords by yourself.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 17 or higher.\n\n- [Apache Maven](http://maven.apache.org/), version 3.0 or higher.\n\n- [cURL](https://curl.se/) or a similar HTTP utility to test functionality.\n\n- A Redis cache instance. If you don't have one, see [Quickstart: Create an open-source Redis cache](/azure/azure-cache-for-redis/quickstart-create-redis).\n\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web**  and **Spring Data Reactive Redis** dependencies, and then select Java version 8 or higher.\n\n## Caching Data to Azure Cache for Redis\n\nWith an Azure Cache for Redis instance, you can cache data using Spring Cloud Azure.\n\nTo install the Spring Cloud Azure Starter Data Redis with Lettuce module, add the following dependencies to your **pom.xml** file:\n\n  ```xml\n  <dependencies>\n   <dependency>\n     <groupId>com.azure.spring</groupId>\n     <artifactId>spring-boot-starter-web</artifactId>\n   </dependency>\n   <dependency>\n     <groupId>com.azure.spring</groupId>\n     <artifactId>spring-cloud-azure-starter-data-redis-lettuce</artifactId>\n   </dependency>\n   <dependency>\n     <groupId>org.springframework.boot</groupId>\n     <artifactId>spring-boot-starter-data-redis</artifactId>\n   </dependency>\n  </dependencies>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  > [!NOTE]\n  > This Bill of Material (BOM) should be configured in the `<dependencyManagement>` section of your **pom.xml** file. This configuration ensures that all Spring Cloud Azure dependencies are using the same version. For more information about the version used for this BOM, see [Which Version of Spring Cloud Azure Should I Use](https://github.com/Azure/azure-sdk-for-java/wiki/Spring-Versions-Mapping#which-version-of-spring-cloud-azure-should-i-use).\n\n### Code the application\n\nTo use a Redis cache to store and retrieve data, configure the application by using the following steps:\n\n#### [Microsoft Entra ID authentication (recommended)](#tab/entraid)\n\n1. Configure Redis cache credentials in the **application.properties** configuration file, as shown in the following example.\n\n   ::: zone pivot=\"azure-managed-redis\"\n\n     ```properties\n     spring.data.redis.host=<your-redis-name>.redis.cache.windows.net\n     spring.data.redis.port=10000\n     spring.data.redis.username=<your-redis-username>\n     spring.data.redis.ssl.enabled=true\n     spring.data.redis.azure.passwordless-enabled=true\n     ```\n\n   ::: zone-end\n\n   ::: zone pivot=\"azure-cache-redis\"\n\n     ```properties\n     spring.data.redis.host=<your-redis-name>.redis.cache.windows.net\n     spring.data.redis.port=6380\n     spring.data.redis.username=<your-redis-username>\n     spring.data.redis.ssl.enabled=true\n     spring.data.redis.azure.passwordless-enabled=true\n     ```\n\n   ::: zone-end\n\n   > [!NOTE]\n   > To get the value for `username`, follow the instructions in the [Enable Microsoft Entra ID authentication on your cache](/azure/azure-cache-for-redis/cache-azure-active-directory-for-authentication#enable-microsoft-entra-id-authentication-on-your-cache) section of [Use Microsoft Entra ID for cache authentication](/azure/azure-cache-for-redis/cache-azure-active-directory-for-authentication), and copy the **username** value.\n\n1. Edit the startup class file to show the following content. This code stores and retrieves data.\n\n   ```java\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.beans.factory.annotation.Autowired;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.data.redis.core.StringRedisTemplate;\n   import org.springframework.data.redis.core.ValueOperations;\n\n   @SpringBootApplication\n   public class DemoCacheApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(DemoCacheApplication.class);\n\n       @Autowired\n       private StringRedisTemplate template;\n\n       public static void main(String[] args) {\n           SpringApplication.run(DemoCacheApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n           ValueOperations<String, String> ops = this.template.opsForValue();\n           String key = \"testkey\";\n           if(!this.template.hasKey(key)){\n               ops.set(key, \"Hello World\");\n               LOGGER.info(\"Add a key is done\");\n           }\n           LOGGER.info(\"Return the value from the cache: {}\", ops.get(key));\n       }\n\n   }\n   ```\n\n#### [Access key authentication](#tab/accesskey)\n\n1. Configure Redis cache credentials in the **application.properties** configuration file, as shown in the following example.\n\n\n   ::: zone pivot=\"azure-managed-redis\"\n\n     ```properties\n     spring.data.redis.host=<your-redis-name>.redis.cache.windows.net\n     spring.data.redis.port=10000\n     spring.data.redis.password=<your-redis-password>\n     spring.data.redis.ssl.enabled=true\n     ```\n\n   ::: zone-end\n\n   ::: zone pivot=\"azure-cache-redis\"\n\n     ```properties\n     spring.data.redis.host=<your-redis-name>.redis.cache.windows.net\n     spring.data.redis.port=6380\n     spring.data.redis.password=<your-redis-password>\n     spring.data.redis.ssl.enabled=true\n     ```\n\n   ::: zone-end\n\n\n1. Edit the startup class file to show the following content. This code stores and retrieves data.\n\n   ```java\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.beans.factory.annotation.Autowired;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.data.redis.core.StringRedisTemplate;\n   import org.springframework.data.redis.core.ValueOperations;\n\n   @SpringBootApplication\n   public class DemoCacheApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(DemoCacheApplication.class);\n\n       @Autowired\n       private StringRedisTemplate template;\n\n       public static void main(String[] args) {\n           SpringApplication.run(DemoCacheApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n           ValueOperations<String, String> ops = this.template.opsForValue();\n           String key = \"testkey\";\n           if(!this.template.hasKey(key)){\n               ops.set(key, \"Hello World\");\n               LOGGER.info(\"Add a key is done\");\n           }\n           LOGGER.info(\"Return the value from the cache: {}\", ops.get(key));\n       }\n\n   }\n   ```\n\n---\n\nThen, start the application. The application retrieves data from your Redis cache. You should see logs similar to the following example:\n\n```output\nAdd a key is done\nReturn the value from the cache: Hello World\n```\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Cache for Redis samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/cache)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc.md",
    "content": "---\ntitle: Add sign-in with Azure Active Directory B2C to a Spring Web App\ndescription: Shows you how to create a Java app with sign-in capability by using the Spring Boot Starter for Microsoft Entra ID.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: how-to\nms.custom:\n  - devx-track-java\n  - spring-cloud-azure\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Add sign-in with Azure Active Directory B2C to a Spring web app\n\nThis article shows you how to create a Java app with sign-in capability by using [Spring Initializr](https://start.spring.io/) with the Spring Boot Starter for Microsoft Entra ID.\n\nIn this tutorial, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create a Java application using the Spring Initializr\n> * Configure Azure Active Directory B2C\n> * Secure the application with Spring Boot classes and annotations\n> * Build and test your Java application\n\n[Microsoft Entra ID](https://azure.microsoft.com/services/active-directory) is Microsoft's cloud-scale enterprise identity solution. [Azure Active Directory B2C](https://azure.microsoft.com/services/active-directory/external-identities/b2c/) compliments the feature set of Microsoft Entra ID, allowing you to manage customer, consumer, and citizen access to your business-to-consumer (B2C) applications.\n\n## Prerequisites\n\n* An Azure subscription. If you don't already have one, create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n* A supported Java Development Kit (JDK). For more information about the JDKs available for use when developing on Azure, see [Java support on Azure and Azure Stack](../fundamentals/java-support-on-azure.md).\n* [Apache Maven](http://maven.apache.org/), version 3.0 or higher.\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this article.\n\n## Create an app using Spring Initializr\n\n1. Browse to <https://start.spring.io/>.\n\n1. Fill out the values according to this guidance. The labels and layout may differ from the image shown here.\n\n   * Under **Project**, select **Maven Project**.\n   * Under **Language**, select **Java**.\n   * Under **Spring Boot**, select **2.7.11**.\n   * Under **Group**, **Artifact** and **Name** enter the same value, using a short descriptive string. The UI may automatically fill in some of these fields as you type.\n   * In the **Dependencies** pane, select **Add Dependencies**. Use the UI to add dependencies on **Spring Web** and **Spring Security**.\n\n   > [!NOTE]\n   > Spring Security 5.5.1, 5.4.7, 5.3.10 and 5.2.11 have been released to address the following CVE report [CVE-2021-22119: Denial-of-Service attack with `spring-security-oauth2-client`](https://tanzu.vmware.com/security/cve-2021-22119). If you're using the older version, please upgrade it.\n\n1. Select **Generate Project**, then download the project to a path on your local computer. Move the downloaded file to a directory named after your project and unzip the file. The file layout should look something like the following, with the value you entered for **Group** in place of `yourProject`.\n\n   ```\n   .\n   ├── HELP.md\n   ├── mvnw\n   ├── mvnw.cmd\n   ├── pom.xml\n   └── src\n       ├── main\n       │   ├── java\n       │   │   └── yourProject\n       │   │       └── yourProject\n       │   │           └── YourProjectApplication.java\n       │   └── resources\n       │       ├── application.properties\n       │       ├── static\n       │       └── templates\n       └── test\n           └── java\n               └── yourProject\n                   └── yourProject\n                       └── YourProjectApplicationTests.java\n   ```\n\n<a name='create-and-initialize-an-azure-active-directory-instance'></a>\n\n## Create and initialize a Microsoft Entra instance\n\n### Create the Active Directory instance\n\n1. Log into <https://portal.azure.com>.\n\n1. Select **Create a resource**. Search for **Azure Active Directory B2C**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/az-1-n.png\" alt-text=\"Create new Azure Active Directory B2C instance using the Azure portal.\":::\n\n1. Select **Create**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/az-5-n.png\" alt-text=\"Azure Marketplace entry for Azure Active Directory B2C.\":::\n\n1. Select **Create a new Azure AD B2C Tenant**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/az-2-n.png\" alt-text=\"Azure portal option to create new Azure AD B2C Tenant.\":::\n\n1. For **Organization name** and **Initial domain name**, provide appropriate values, then select **Create**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/az-3-n.png\" alt-text=\"Azure AD B2C Create Tenant screen.\":::\n\n1. When the Active Directory creation is complete, select your account in the upper right corner, select **Switch directory**, then select the directory created. You'll be redirected to the new tenant home page. Then search for `b2c` and select **Azure AD B2C**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/az-4-n.png\" alt-text=\"Locate the Azure AD B2C service.\":::\n\n### Add an application registration for your Spring Boot app\n\n1. In the **Manage** pane, select **App registrations**, and then select **New registration**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/b2c1-n.png\" alt-text=\"Screenshot of the Azure portal showing the Azure AD B2C App registrations screen.\":::\n\n1. In the **Name** field, enter your app's name, then select **Register**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/b2c4-n.png\" alt-text=\"Azure AD B2C register an application form.\":::\n\n1. Back on the **Manage** pane, select **App registrations**, then select the application name you created.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/b2c5-n.png\" alt-text=\"App registrations screen with display name selected.\":::\n\n1. Select **Authentication**, then **Add a platform** then **Web**. Set the **Redirect URIs** to `http://localhost:8080/login/oauth2/code/`, then select **Configure**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/b2c7-n.png\" alt-text=\"Options selected for authentication, add a platform, web.\":::\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/b2c8-n.png\" alt-text=\"Configure Web screen with Redirect URIs field selected.\":::\n\n### Add app secrets for your app\n\nSelect **Certificates & secrets**, then **New client secrets**. Input your secret description and then select **Add**. After you create the secret, select the copy icon next to the secret value to copy the value for use later in this article.\n\n:::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/b2c9-n.png\" alt-text=\"Add a client secret screen.\":::\n\n:::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/b2c10-n.png\" alt-text=\"Certificates and secrets screen with copy button selected.\":::\n\n> [!NOTE]\n> If you leave the **Certificates & secrets** section and come back, you'll not be able to see the secret value. In that case, you must create another secret and copy it for future use.\n>\n> Occasionally, the generated secret value may contain characters that are problematic for inclusion in the **application.yml** file, such as backslash or backtick. In that case, discard that secret and generate another one.\n\n### Add user flow\n\n1. Navigate to your tenant main page. In the **Policies** section of the left pane, select **User flows**, then select **New user flow**.\n\n1. You'll now leave this tutorial, execute another tutorial, and come back to this tutorial when you're done. Here are some things to keep in mind when you go to the other tutorial.\n\n   * Start with the step that requests you to select **New User flow**.\n   * When this tutorial refers to `webapp1`, use the value you entered for **Group** instead.\n   * When you're selecting claims to return from the flows, ensure **Display Name** is selected. Without this claim, the app being built in this tutorial won't work.\n   * When you're asked to run the user flows, the redirect URL you specified previously isn't yet active. You can still run the flows, but the redirection won't complete successfully. This is expected.\n   * When you reach \"Next steps\", return to this tutorial.\n\n   Follow all the steps in [Tutorial: Create user flows in Azure Active Directory B2C](/azure/active-directory-b2c/tutorial-create-user-flows) to create user flows for \"sign-up and sign in\", \"profile editing\" and \"password reset\".\n\n   Azure AD B2C supports local accounts as well as social identity providers. For an example of creating a GitHub identity provider, see [Set up sign-up and sign-in with a GitHub account using Azure Active Directory B2C](/azure/active-directory-b2c/identity-provider-github).\n\n## Configure and compile your app\n\nNow that you've created the Azure AD B2C instance and some user flows, you'll connect your Spring app to the Azure AD B2C instance.\n\n1. From the command line, cd to the directory where you unzipped the .zip file you downloaded from Spring Initializr.\n\n1. Navigate to the parent folder for your project, and open the **pom.xml** Maven project file in a text editor.\n\n1. Add the dependencies for Spring OAuth2 security to the **pom.xml**:\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>\n       <version>See Below</version>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-thymeleaf</artifactId>\n       <version>See Below</version>\n   </dependency>\n   <dependency>\n       <groupId>org.thymeleaf.extras</groupId>\n       <artifactId>thymeleaf-extras-springsecurity5</artifactId>\n       <version>See Below</version>\n   </dependency>\n   ```\n\n   For the `spring-cloud-azure-starter-active-directory-b2c`, use the latest version available. You may be able to use [mvnrepository.com](https://mvnrepository.com/artifact/com.azure.spring/spring-cloud-azure-starter-active-directory-b2c) to look this up. \n\n   For the `spring-boot-starter-thymeleaf`, use the version corresponding to the version of Spring Boot you selected above, for example `2.3.4.RELEASE`.\n\n   For `thymeleaf-extras-springsecurity5`, use the latest version available. You may be able to use [mvnrepository.com](https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity5) to look this up. As of this writing, the latest version is `3.0.4.RELEASE`.\n\n1. Save and close the **pom.xml** file.\n\n   * Verify that your dependencies are correct by running `mvn -DskipTests clean install`. If you don't see `BUILD SUCCESS`, troubleshoot and resolve the problem before continuing.\n\n1. Navigate to the **src/main/resources** folder in your project and create an **application.yml** file in a text editor.\n\n1. Specify the settings for your app registration using the values you created earlier; for example:\n\n   ```yaml\n   spring:\n     cloud:\n       azure:\n         active-directory:\n           b2c:\n             enabled: true\n             base-uri: https://<your-tenant-initial-domain-name>.b2clogin.com/<your-tenant-initial-domain-name>.onmicrosoft.com/\n             credential:\n               client-id: <your-application-ID>\n               client-secret: '<secret-value>'\n             login-flow: sign-up-or-sign-in\n             logout-success-url: <your-logout-success-URL>\n             user-flows:\n               sign-up-or-sign-in: <your-sign-up-or-sign-in-user-flow-name> \n               profile-edit: <your-profile-edit-user-flow-name> \n               password-reset: <your-password-reset-user-flow-name> \n             user-name-attribute-name: <your-user-name-attribute-name> \n   ```\n\n   Notice that the `client-secret` value is enclosed in single quotes. This is necessary because the value of `<secret-value>` will almost certainly contain some characters that require being inside single quotes when present in YAML.\n\n   > [!NOTE]\n   > As of this writing, the full list of Active Directory B2C Spring Integration values that are available for use in **application.yml** is the following:\n   >\n   > ```yaml\n   > spring:\n   >   cloud:\n   >     azure:\n   >       active-directory:\n   >         b2c:\n   >           enabled: true\n   >           base-uri:\n   >           credential:\n   >             client-id:\n   >             client-secret:\n   >           login-flow:  \n   >           logout-success-url:\n   >           user-flows:\n   >             sign-up-or-sign-in:\n   >             profile-edit: # optional\n   >             password-reset: # optional\n   >           user-name-attribute-name:\n   > ```\n   >\n   > The **application.yml** file is available in [`spring-cloud-azure-starter-active-directory-b2c` sample: `aad-b2c-web-application`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory-b2c/aad-b2c-web-application/src/main/resources/application.yml) on GitHub.\n\n1. Save and close the **application.yml** file.\n\n1. Create a folder named **controller** in **src/main/java/\\<yourGroupId\\>/\\<yourGroupId\\>**, replacing `<yourGroupId>` with the value you entered for **Group**.\n\n1. Create a new Java file named **WebController.java** in the **controller** folder and open it in a text editor.\n\n1. Enter the following code, changing `yourGroupId` appropriately, then save and close the file:\n\n   ```java\n   package yourGroupId.yourGroupId.controller;\n\n   import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;\n   import org.springframework.security.oauth2.core.user.OAuth2User;\n   import org.springframework.stereotype.Controller;\n   import org.springframework.ui.Model;\n   import org.springframework.web.bind.annotation.GetMapping;\n\n   @Controller\n   public class WebController {\n\n       private void initializeModel(Model model, OAuth2AuthenticationToken token) {\n           if (token != null) {\n               final OAuth2User user = token.getPrincipal();\n\n               model.addAttribute(\"grant_type\", user.getAuthorities());\n               model.addAllAttributes(user.getAttributes());\n           }\n       }\n\n       @GetMapping(value = \"/\")\n       public String index(Model model, OAuth2AuthenticationToken token) {\n           initializeModel(model, token);\n\n           return \"home\";\n       }\n\n       @GetMapping(value = \"/greeting\")\n       public String greeting(Model model, OAuth2AuthenticationToken token) {\n           initializeModel(model, token);\n\n           return \"greeting\";\n       }\n\n       @GetMapping(value = \"/home\")\n       public String home(Model model, OAuth2AuthenticationToken token) {\n           initializeModel(model, token);\n\n           return \"home\";\n       }\n   }\n   ```\n\n   Because every method in the controller calls `initializeModel()`, and that method calls `model.addAllAttributes(user.getAttributes());`, any HTML page in **src/main/resources/templates** is able to access any of those attributes, such as `${name}`, `${grant_type}`, or `${auth_time}`. The values returned from `user.getAttributes()` are in fact the claims of the `id_token` for the authentication. The complete list of available claims is listed in [Microsoft identity platform ID tokens](/azure/active-directory/develop/id-tokens#payload-claims).\n\n1. Create a folder named **security** in **src/main/java/\\<yourGroupId\\>/\\<yourGroupId\\>**, replacing `yourGroupId` with the value you entered for **Group**.\n\n1. Create a new Java file named **WebSecurityConfiguration.java** in the **security** folder and open it in a text editor.\n\n1. Enter the following code, changing `yourGroupId` appropriately, then save and close the file:\n\n   ```java\n   package yourGroupId.yourGroupId.security;\n\n   import com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cOidcLoginConfigurer;\n   import org.springframework.security.config.annotation.web.builders.HttpSecurity;\n   import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\n   import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;\n\n   @EnableWebSecurity\n   public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {\n\n       private final AadB2cOidcLoginConfigurer configurer;\n\n       public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {\n           this.configurer = configurer;\n       }\n\n       @Override\n       protected void configure(HttpSecurity http) throws Exception {\n           http\n                   .authorizeRequests()\n                   .anyRequest()\n                   .authenticated()\n                   .and()\n                   .apply(configurer)\n           ;\n       }\n   }\n   ```\n\n1. Copy the **home.html** file from [`spring-cloud-azure-starter-active-directory-b2c` sample: `aad-b2c-web-application`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory-b2c/aad-b2c-web-application/src/main/resources/templates) to **src/main/resources/templates**, and replace the `${your-profile-edit-user-flow}` and `${your-password-reset-user-flow}` with the names of the user flows that you created earlier.\n\n## Build and test your app\n\n1. Open a command prompt and change directory to the folder where your app's **pom.xml** file is located.\n\n1. Build your Spring Boot application with Maven and run it; for example:\n\n   > [!NOTE]\n   > It's extremely important that the time according to the system clock under which the local spring boot app runs is accurate. There is very little tolerance of clock skew when using OAuth 2.0. Even three minutes of inaccuracy may cause the signin to fail with an error similar to `[invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z`. As of this writing, [time.gov](https://time.gov/) has an indicator of how far off your clock is from the actual time. The app was successfully run with a skew of +0.019 seconds.\n\n   ```shell\n   mvn -DskipTests clean package\n   mvn -DskipTests spring-boot:run\n   ```\n\n1. After your application is built and started by Maven, open `http://localhost:8080/` in a web browser;\nyou should be redirected to login page.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/lo1-n.png\" alt-text=\"Web app login page.\":::\n\n1. Select the link with text relating to signing in. You should be redirected Azure AD B2C to start the authentication process.\n\n1. After you've logged in successfully, you should see the sample `home page` from the browser,\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc/lo3-n.png\" alt-text=\"Web app successful login.\":::\n\n## Troubleshooting\n\nThe following sections describe how to resolve some problems you might encounter.\n\n### Missing attribute name in attributes\n\nWhile running the sample, you might get an exception with the message `Missing attribute 'name' in attributes`. The log for this exception will look similar to the following output:\n\n```output\njava.lang.IllegalArgumentException: Missing attribute 'name' in attributes\nat org.springframework.security.oauth2.core.user.DefaultOAuth2User.<init>(DefaultOAuth2User.java:67) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]\nat org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser.<init>(DefaultOidcUser.java:89) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]\nat org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:144) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]\nat org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:63) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]\n```\n\nIf you get this error, double-check the user workflow you created in [Tutorial: Create user flows in Azure Active Directory B2C](/azure/active-directory-b2c/tutorial-create-user-flows). When creating the user workflow, for **User attributes and claims**, be sure to choose attributes and claims for **Display Name**. Also, be sure to properly configure `user-name-attribute-name` in the **application.yml** file.\n\n### Sign in with loops to B2C endpoint\n\nThis issue is most likely due to polluted cookies for `localhost`. Clean up cookies for `localhost` and try it again.\n\n## Summary\n\nIn this tutorial, you created a new Java web application using the Azure Active Directory B2C starter, configured a new Azure AD B2C tenant, and registered a new application in it, and then configured your application to use the Spring annotations and classes to protect the web app.\n\n## Clean up resources\n\nWhen no longer needed, use the [Azure portal](https://portal.azure.com/) to delete the resources created in this article to avoid unexpected charges.\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Spring on Azure](./index.yml)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-key-vault-certificates.md",
    "content": "---\ntitle: \"Enable HTTPS in Spring Boot with Azure Key Vault certificates\"\ndescription: In this tutorial, you secure your Spring Boot (including Azure Spring Apps) apps with TLS/SSL certificates using Azure Key Vault and managed identities for Azure resources.\nms.date: 08/19/2025\nms.topic: tutorial\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.custom:\n  - devx-track-java\n  - spring-cloud-azure\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Enable HTTPS in Spring Boot with Azure Key Vault certificates\n\nThis tutorial shows you how to secure your Spring Boot (including Azure Spring Apps) apps with TLS/SSL certificates using Azure Key Vault and managed identities for Azure resources.\n\nProduction-grade Spring Boot applications, whether in the cloud or on-premises, require end-to-end encryption for network traffic using standard TLS protocols. Most TLS/SSL certificates you come across are discoverable from a public root certificate authority (CA). Sometimes, however, this discovery isn't possible. When certificates aren't discoverable, the app must have some way to load such certificates, present them to inbound network connections, and accept them from outbound network connections.\n\nSpring Boot apps typically enable TLS by installing the certificates. The certificates are installed into the local key store of the JVM that's running the Spring Boot app. With Spring on Azure, certificates aren't installed locally. Instead, Spring integration for Microsoft Azure provides a secure and frictionless way to enable TLS with help from Azure Key Vault and managed identity for Azure resources.\n\n:::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-azure-key-vault-certificates/spring-to-azure-key-vault-certificates.svg\" alt-text=\"Diagram showing interaction of elements in this tutorial.\" border=\"false\":::\n\n> [!IMPORTANT]\n> Currently, Spring Cloud Azure Certificate starter version 4.x or higher don't support TLS/mTLS, they only auto-configure the Key Vault certificate client. Therefore, if you want to use TLS/mTLS, you cannot migrate to version 4.x.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- A supported [Java Development Kit (JDK)](/java/azure/jdk) with version 11.\n\n- [Apache Maven](https://maven.apache.org/download.cgi) version 3.0 or higher.\n\n- [Azure CLI](/cli/azure/install-azure-cli).\n\n- [cURL](https://curl.se/) or a similar HTTP utility to test functionality.\n\n- An Azure virtual machine (VM) instance. If you don't have one, use the [az vm create](/cli/azure/vm?view=azure-cli-latest&preserve-view=true#az-vm-create) command and the Ubuntu image provided by UbuntuServer to create a VM instance with a system-assigned managed identity enabled. Grant the `Contributor` role to the system-assigned managed identity, and then set the access `scope` to your subscription.\n\n- An Azure Key Vault instance. If you don't have one, see [Quickstart: Create a key vault using the Azure portal](/azure/key-vault/general/quick-create-portal).\n\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web** dependency, then select Java version 8 or higher.\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this article.\n\n## Set a self-signed TLS/SSL certificate\n\nThe steps in this tutorial apply to any TLS/SSL certificate (including self-signed) stored directly in Azure Key Vault. Self-signed certificates aren't suitable for use in production, but are useful for dev and test applications.\n\nThis tutorial uses a self-signed certificate. To set the certificate, see [Quickstart: Set and retrieve a certificate from Azure Key Vault using the Azure portal](/azure/key-vault/certificates/quick-create-portal).\n\n> [!NOTE]\n> After setting the certificate, grant VM access to Key Vault by following the instructions in [Assign a Key Vault access policy](/azure/key-vault/general/assign-access-policy?tabs=azure-portal).\n\n## Secure connection through TLS/SSL certificate\n\nYou now have a VM and a Key Vault instance and have granted the VM access to Key Vault. The following sections show how to connect securely via TLS/SSL certificates from Azure Key Vault in the Spring Boot application. This tutorial demonstrates the following two scenarios:\n\n- Run a Spring Boot application with secure inbound connections\n- Run a Spring Boot application with secure outbound connections\n\n> [!TIP]\n> In the following steps, the code will be packaged into an executable file and uploaded to the VM. Don't forget to install [OpenJDK](https://openjdk.org/install/) in the VM.\n\n### Run a Spring Boot application with secure inbound connections\n\nWhen the TLS/SSL certificate for the inbound connection comes from Azure Key Vault, configure the application by following these steps:\n\n1. Add the following dependencies to your **pom.xml** file:\n\n   ```xml\n   <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>azure-spring-boot-starter-keyvault-certificates</artifactId>\n      <version>3.14.0</version>\n   </dependency>\n   ```\n\n1. Configure Key Vault credentials in the **application.properties** configuration file.\n\n   ```properties\n   server.ssl.key-alias=<the name of the certificate in Azure Key Vault to use>\n   server.ssl.key-store-type=AzureKeyVault\n   server.ssl.trust-store-type=AzureKeyVault\n   server.port=8443\n   azure.keyvault.uri=<the URI of the Azure Key Vault to use>\n   ```\n\n   These values enable the Spring Boot app to perform the *load* action for the TLS/SSL certificate, as mentioned at the beginning of the tutorial. The following table describes the property values.\n\n   | Property                      | Description                                                                                                            |\n   |-------------------------------|------------------------------------------------------------------------------------------------------------------------|\n   | `server.ssl.key-alias`        | The value of the `--name` argument you passed to `az keyvault certificate create`.                                     |\n   | `server.ssl.key-store-type`   | Must be `AzureKeyVault`.                                                                                               |\n   | `server.ssl.trust-store-type` | Must be `AzureKeyVault`.                                                                                               |\n   | `server.port`                 | The local TCP port on which to listen for HTTPS connections.                                                           |\n   | `azure.keyvault.uri`          | The `vaultUri` property in the return JSON from `az keyvault create`. You saved this value in an environment variable. |\n\n   The only property specific to Key Vault is `azure.keyvault.uri`. The app is running on a VM whose system-assigned managed identity has been granted access to the Key Vault. Therefore, the app has also been granted access.\n\n   These changes enable the Spring Boot app to load the TLS/SSL certificate. In the next step, you'll enable the app to perform the *accept* action for the TLS/SSL certificate, as mentioned at the beginning of the tutorial.\n\n1. Edit the startup class file so that it has the following contents.\n\n   ```java\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.web.bind.annotation.GetMapping;\n   import org.springframework.web.bind.annotation.RestController;\n\n   @SpringBootApplication\n   @RestController\n   public class SsltestApplication {\n\n       public static void main(String[] args) {\n           SpringApplication.run(SsltestApplication.class, args);\n       }\n\n       @GetMapping(value = \"/ssl-test\")\n       public String inbound(){\n           return \"Inbound TLS is working!!\";\n       }\n\n       @GetMapping(value = \"/exit\")\n       public void exit() {\n           System.exit(0);\n       }\n\n   }\n   ```\n\n   Calling `System.exit(0)` from within an unauthenticated REST GET call is only for demonstration purposes. Don't use `System.exit(0)` in a real application.\n\n   This code illustrates the *present* action mentioned at the beginning of this tutorial. The following list highlights some details about this code:\n\n   - There's now a `@RestController` annotation on the `SsltestApplication` class generated by Spring Initializr.\n   - There's a method annotated with `@GetMapping`, with a `value` for the HTTP call you make.\n   - The `inbound` method simply returns a greeting when a browser makes an HTTPS request to the `/ssl-test` path. The `inbound` method illustrates how the server presents the TLS/SSL certificate to the browser.\n   - The `exit` method causes the JVM to exit when invoked. This method is a convenience to make the sample easy to run in the context of this tutorial.\n\n1. Run the following commands to compile the code and package it into an executable JAR file.\n\n   ```bash\n   mvn clean package\n   ```\n\n1. Verify that the network security group created within `<your-resource-group-name>` allows inbound traffic on ports 22 and 8443 from your IP address. To learn about configuring network security group rules to allow inbound traffic, see the [Work with security rules](/azure/virtual-network/manage-network-security-group#work-with-security-rules) section of [Create, change, or delete a network security group](/azure/virtual-network/manage-network-security-group).\n\n1. Put the executable JAR file on the VM.\n\n   ```bash\n   cd target\n   sftp azureuser@<your VM public IP address>\n   put *.jar\n   ```\n\n   Now that you've built the Spring Boot app and uploaded it to the VM, use the following steps to run it on the VM and call the REST endpoint with `curl`.\n\n1. Use SSH to connect to the VM, then run the executable JAR.\n\n   ```bash\n   set -o noglob\n   ssh azureuser@<your VM public IP address> \"java -jar *.jar\"\n   ```\n\n1. Open a new Bash shell and execute the following command to verify that the server presents the TLS/SSL certificate.\n\n   ```bash\n   curl --insecure https://<your VM public IP address>:8443/ssl-test\n   ```\n\n1. Invoke the `exit` path to kill the server and close the network sockets.\n\n   ```bash\n   curl --insecure https://<your VM public IP address>:8443/exit\n   ```\n\nNow that you've seen the *load* and *present* actions with a self-signed TLS/SSL certificate, make some trivial changes to the app to see the *accept* action as well.\n\n### Run a Spring Boot application with secure outbound connections\n\nIn this section, you modify the code in the previous section so that the TLS/SSL certificate for outbound connections comes from Azure Key Vault. Therefore, the *load*, *present*, and *accept* actions are satisfied from the Azure Key Vault.\n\n1. Add the Apache HTTP client dependency to your **pom.xml** file:\n\n   ```xml\n   <dependency>\n      <groupId>org.apache.httpcomponents</groupId>\n      <artifactId>httpclient</artifactId>\n      <version>4.5.13</version>\n   </dependency>\n   ```\n\n1. Add a new rest endpoint called `ssl-test-outbound`. This endpoint opens up a TLS socket to itself and verifies that the TLS connection accepts the TLS/SSL certificate. Replace the previous part of the startup class with the following code.\n\n   ```java\n   import java.security.KeyStore;\n   import javax.net.ssl.HostnameVerifier;\n   import javax.net.ssl.SSLContext;\n   import javax.net.ssl.SSLSession;\n\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import com.azure.security.keyvault.jca.KeyVaultLoadStoreParameter;\n   import org.springframework.http.HttpStatus;\n   import org.springframework.http.ResponseEntity;\n   import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;\n   import org.springframework.web.bind.annotation.GetMapping;\n   import org.springframework.web.bind.annotation.RestController;\n   import org.springframework.web.client.RestTemplate;\n\n   import org.apache.http.conn.ssl.SSLConnectionSocketFactory;\n   import org.apache.http.conn.ssl.TrustSelfSignedStrategy;\n   import org.apache.http.impl.client.CloseableHttpClient;\n   import org.apache.http.impl.client.HttpClients;\n   import org.apache.http.ssl.SSLContexts;\n\n   @SpringBootApplication\n   @RestController\n   public class SsltestApplication {\n\n       public static void main(String[] args) {\n           SpringApplication.run(SsltestApplication.class, args);\n       }\n\n       @GetMapping(value = \"/ssl-test\")\n       public String inbound(){\n           return \"Inbound TLS is working!!\";\n       }\n\n       @GetMapping(value = \"/ssl-test-outbound\")\n       public String outbound() throws Exception {\n           KeyStore azureKeyVaultKeyStore = KeyStore.getInstance(\"AzureKeyVault\");\n           KeyVaultLoadStoreParameter parameter = new KeyVaultLoadStoreParameter(\n               System.getProperty(\"azure.keyvault.uri\"));\n           azureKeyVaultKeyStore.load(parameter);\n           SSLContext sslContext = SSLContexts.custom()\n                                              .loadTrustMaterial(azureKeyVaultKeyStore, null)\n                                              .build();\n\n           HostnameVerifier allowAll = (String hostName, SSLSession session) -> true;\n           SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, allowAll);\n\n           CloseableHttpClient httpClient = HttpClients.custom()\n               .setSSLSocketFactory(csf)\n               .build();\n\n           HttpComponentsClientHttpRequestFactory requestFactory =\n               new HttpComponentsClientHttpRequestFactory();\n\n           requestFactory.setHttpClient(httpClient);\n           RestTemplate restTemplate = new RestTemplate(requestFactory);\n           String sslTest = \"https://localhost:8443/ssl-test\";\n\n           ResponseEntity<String> response\n               = restTemplate.getForEntity(sslTest, String.class);\n\n           return \"Outbound TLS \" +\n               (response.getStatusCode() == HttpStatus.OK ? \"is\" : \"is not\")  + \" Working!!\";\n       }\n\n       @GetMapping(value = \"/exit\")\n       public void exit() {\n           System.exit(0);\n       }\n\n   }\n   ```\n\n1. Run the following commands to compile the code and package it into an executable JAR file.\n\n   ```bash\n   mvn clean package\n   ```\n\n1. Upload the app again using the same `sftp` command from earlier in this article.\n\n   ```bash\n   cd target\n   sftp <your VM public IP address>\n   put *.jar\n   ```\n\n1. Run the app on the VM.\n\n   ```bash\n   set -o noglob\n   ssh azureuser@<your VM public IP address> \"java -jar *.jar\"\n   ```\n\n1. After the server is running, verify that the server accepts the TLS/SSL certificate. In the same Bash shell where you issued the previous `curl` command, run the following command.\n\n   ```bash\n   curl --insecure https://<your VM public IP address>:8443/ssl-test-outbound\n   ```\n\n   You should see the message `Outbound TLS is working!!`.\n\n1. Invoke the `exit` path to kill the server and close the network sockets.\n\n   ```bash\n   curl --insecure https://<your VM public IP address>:8443/exit\n   ```\n\nYou've now observed a simple illustration of the *load*, *present*, and *accept* actions with a self-signed TLS/SSL certificate stored in Azure Key Vault.\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Key Vault certificates samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/spring-boot-2.x/keyvault/azure-spring-boot-starter-keyvault-certificates)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-key-vault.md",
    "content": "---\ntitle: \"Load a secret from Azure Key Vault in a Spring Boot application\"\ndescription: In this tutorial, you create a Spring Boot app that reads a value from Azure Key Vault, and you deploy the app to Azure App Service and Azure Spring Apps.\nms.date: 08/19/2025\nms.topic: tutorial\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n# Load a secret from Azure Key Vault in a Spring Boot application\n\nThis tutorial shows you how to use Key Vault in Spring Boot applications to secure sensitive configuration data and retrieve configuration properties from Key Vault. [Key Vault](/azure/key-vault/general/overview) provides secure storage of generic secrets, such as passwords and database connection strings.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 8 or higher.\n- [Apache Maven](https://maven.apache.org)\n- [Azure CLI](/cli/azure/install-azure-cli)\n- A Key Vault instance. If you don't have one, see [Quickstart: Create a key vault using the Azure portal](/azure/key-vault/general/quick-create-portal). Also, make a note of the URI of the Key Vault instance, as you need it for the test application for this tutorial.\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web**, **Spring Data JPA**, and **H2 Database** dependencies, and then select Java version 8 or higher.\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this article.\n\n## Set a secret to Azure Key Vault\n\nThis tutorial describes how to read database credentials from Key Vault in a Spring Boot application. To read the credentials from Key Vault, you should first store database credentials in Key Vault.\n\nTo store the URL of an H2 database as a new secret in Key Vault, see [Quickstart: Set and retrieve a secret from Azure Key Vault using the Azure portal](/azure/key-vault/secrets/quick-create-portal). In this tutorial, you'll set a secret with name `h2url` and value `jdbc:h2:~/testdb;user=sa;password=password`.\n\n> [!NOTE]\n> After setting the secret, grant your app access to Key Vault by following the instructions in [Assign a Key Vault access policy](/azure/key-vault/general/assign-access-policy?tabs=azure-portal).\n\n## Read a secret from Azure Key Vault\n\nNow that database credentials have been stored in Key Vault, you can retrieve them with Spring Cloud Azure.\n\nTo install the Spring Cloud Azure Key Vault Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Key Vault Starter artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-keyvault</artifactId>\n  </dependency>\n  ```\n\nSpring Cloud Azure has several methods for reading secrets from Key Vault. You can use the following methods independently or combine them for different use cases:\n\n- Use Azure SDK for Key Vault.\n- Use Spring KeyVault `PropertySource`.\n\n### Use Azure SDK for Key Vault\n\nAzure SDK for Key Vault provides `SecretClient` to manage secrets in Key Vault.\n\nThe following code example will show you how to use `SecretClient` to retrieve H2 database credentials from Azure Key Vault.\n\nTo read a secret using Azure SDK from Key Vault, configure the application by following these steps:\n\n1. Configure a Key Vault endpoint in the **application.properties** configuration file.\n\n   ```properties\n   spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/\n   ```\n\n1. Inject the `SecretClient` bean in your Spring application and use the `getSecret` method to retrieve a secret, as shown in the following example:\n\n   ```java\n   import com.azure.security.keyvault.secrets.SecretClient;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n\n   @SpringBootApplication\n   public class SecretClientApplication implements CommandLineRunner {\n\n       // Spring Cloud Azure will automatically inject SecretClient in your ApplicationContext.\n       private final SecretClient secretClient;\n\n       public SecretClientApplication(SecretClient secretClient) {\n           this.secretClient = secretClient;\n       }\n\n       public static void main(String[] args) {\n           SpringApplication.run(SecretClientApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n           System.out.println(\"h2url: \" + secretClient.getSecret(\"h2url\").getValue());\n       }\n   }\n   ```\n\n   [!INCLUDE [spring-default-azure-credential-overview.md](includes/spring-default-azure-credential-overview.md)]\n\n1. Start the application. You'll see logs similar to the following example:\n\n   ```output\n   h2url: jdbc:h2:~/testdb;user=sa;password=password\n   ```\n\nYou can build the `SecretClient` bean by yourself, but the process is complicated. In Spring Boot applications, you have to manage properties, learn the builder pattern, and register the client to your Spring application context. The following code example shows how you build a `SecretClient` bean:\n\n```java\nimport com.azure.identity.DefaultAzureCredentialBuilder;\nimport com.azure.security.keyvault.secrets.SecretClient;\nimport com.azure.security.keyvault.secrets.SecretClientBuilder;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class SecretClientConfiguration {\n\n    @Bean\n    public SecretClient createSecretClient() {\n        return new SecretClientBuilder()\n            .vaultUrl(\"https://<your-key-vault-url>.vault.azure.net/\")\n            .credential(new DefaultAzureCredentialBuilder().build())\n            .buildClient();\n    }\n\n}\n```\n\nThe following list shows some of the reasons why this code isn't flexible or graceful:\n\n- The Key Vault endpoint is hard coded.\n- If you use `@Value` to get configurations from the Spring environment, you can't have IDE hints in your **application.properties** file.\n- If you have a microservice scenario, the code must be duplicated in each project, and it's easy to make mistakes and hard to be consistent.\n\nFortunately, building the `SecretClient` bean by yourself isn't necessary with Spring Cloud Azure. Instead, you can directly inject `SecretClient` and use the configuration properties that you're already familiar with to configure Key Vault. For more information, see [Configuration examples](configuration.md#configuration-examples).\n\nSpring Cloud Azure also provides the following global configurations for different scenarios. For more information, see the [Global configuration for Azure Service SDKs](configuration.md#global-configuration-for-azure-service-sdks) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n- Proxy options.\n- Retry options.\n- HTTP transport client options.\n\nYou can also connect to different Azure clouds. For more information, see [Connect to different Azure clouds](https://devblogs.microsoft.com/azure-sdk/announcing-the-stable-release-of-spring-cloud-azure-version-4-4-0/#connect-to-different-azure-clouds).\n\n### Use Spring Key Vault PropertySource\n\nThe previous sections showed you how to use `SecretClient` in the `CommandLineRunner` to read the secret after the application started. In Spring Boot applications, however, reading secrets is required before the application starts. For example, the datasource password property is required before the application starts. The previous scenario won't work if you want to store the datasource password in Key Vault and still use the Spring auto-configuration to get a datasource.\n\nIn this case, Spring Cloud Azure provides Spring environment integration to load secrets from Key Vault before building the application context. You can use the secret to construct and configure the bean during Spring application context initialization. This approach is a transparent way for you to access secrets from Key Vault, and no code changes are required.\n\nThe following code example shows you how to use `PropertySource` to retrieve H2 database credentials to build the datasource from Azure Key Vault.\n\nTo retrieve the URL of an H2 database from Key Vault and store data from the H2 database using Spring Data JPA, configure the application by following these steps:\n\n1. Add the following Key Vault endpoint and datasource properties to the **application.properties** configuration file.\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=https://<your-keyvault-name>.vault.azure.net/\n   spring.datasource.url=${h2url}\n\n   spring.jpa.hibernate.ddl-auto=create-drop\n   spring.jpa.database-platform=org.hibernate.dialect.H2Dialect\n   ```\n\n   > [!TIP]\n   > For examples of Spring Cloud Azure property configuration, see the [Configuration examples](configuration.md#configuration-examples) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n   >\n   > This example is a simple database scenario using an H2 database. We recommend using Azure Database for MySQL or Azure Database for PostgreSQL in a production environment and storing database URL, user name, and password in Azure Key Vault. If you want to avoid the password, passwordless connections is a good choice. For more information, see [Passwordless connections for Azure services](../../intro/passwordless-overview.md).\n\n1. Create a new `Todo` Java class. This class is a domain model mapped onto the `todo` table that will be automatically created by JPA. The following code ignores the `getters` and `setters` methods.\n\n   ```java\n   import jakarta.persistence.Entity;\n   import jakarta.persistence.GeneratedValue;\n   import jakarta.persistence.Id;\n\n   @Entity\n   public class Todo {\n\n       public Todo() {\n       }\n\n       public Todo(String description, String details, boolean done) {\n           this.description = description;\n           this.details = details;\n           this.done = done;\n       }\n\n       @Id\n       @GeneratedValue\n       private Long id;\n\n       private String description;\n\n       private String details;\n\n       private boolean done;\n\n   }\n   ```\n\n1. Edit the startup class file to show the following content.\n\n   ```java\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.boot.context.event.ApplicationReadyEvent;\n   import org.springframework.context.ApplicationListener;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.data.jpa.repository.JpaRepository;\n\n   import java.util.stream.Stream;\n\n   @SpringBootApplication\n   public class KeyvaultApplication {\n\n       public static void main(String[] args) {\n           SpringApplication.run(KeyvaultApplication.class, args);\n       }\n\n       @Bean\n       ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {\n           return event->repository\n               .saveAll(Stream.of(\"A\", \"B\", \"C\").map(name->new Todo(\"configuration\", \"congratulations, you have set up \"\n                   + \"correctly!\", true)).toList())\n               .forEach(System.out::println);\n       }\n\n   }\n\n   interface TodoRepository extends JpaRepository<Todo, Long> {\n\n   }\n   ```\n\n1. Start the application. The application will retrieve the URL of the H2 database from Key Vault, then connect to the H2 database, and store data to the database. You'll see logs similar to the following example:\n\n   ```output\n   2023-01-13 15:51:35.498 DEBUG 5616 --- [main] org.hibernate.SQL: insert into todo (description, details, done, id) values (?, ?, ?, ?)\n   com.contoso.keyvault.Todo@1f\n   ```\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure KeyVault Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/keyvault)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-service-bus.md",
    "content": "---\ntitle: Use JMS in Spring to access Azure Service Bus\ndescription: This tutorial demonstrates how to use the Spring JMS Starter to send messages to and receive messages from Azure Service Bus.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiada\nms.date: 08/19/2025\nms.topic: tutorial\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java, passwordless-java\n---\n\n# Use JMS in Spring to access Azure Service Bus\n\nThis tutorial demonstrates how to use Spring Boot Starter for Azure Service Bus JMS to send messages to and receive messages from Service Bus `queues` and `topics`.\n\nAzure provides an asynchronous messaging platform called [Azure Service Bus](/azure/service-bus-messaging/service-bus-messaging-overview) (\"Service Bus\") that is based on the [Advanced Message Queueing Protocol 1.0](http://www.amqp.org/) (\"AMQP 1.0\") standard. You can use Service Bus across the range of supported Azure platforms.\n\nThe Spring Boot Starter for Azure Service Bus JMS provides Spring JMS integration with Service Bus.\n\nThe following video describes how to integrate Spring JMS applications with Azure Service Bus using JMS 2.0.\n\n<br>\n\n> [!VIDEO https://www.youtube.com/embed/9O3CALyoZHE?list=PLPeZXlCR7ew8LlhnSH63KcM0XhMKxT1k_]\n\nIn this tutorial, we include two authentication methods: [Microsoft Entra authentication](/azure/service-bus-messaging/authenticate-application) and [Shared Access Signatures (SAS) authentication](/azure/service-bus-messaging/service-bus-sas). The **Passwordless** tab shows the Microsoft Entra authentication and the **Connection string** tab shows the SAS authentication.\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Service Bus JMS using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nSAS authentication uses the connection string of your Azure Service Bus namespace for the delegated access to Service Bus JMS. If you choose to use Shared Access Signatures as credentials, you need to manage the connection string by yourself.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 8 or higher.\n\n- [Apache Maven](http://maven.apache.org/), version 3.2 or higher.\n\n- A queue or topic for Azure Service Bus. If you don't have one, see [Use Azure portal to create a Service Bus namespace and a queue](/azure/service-bus-messaging/service-bus-quickstart-portal) or [Use the Azure portal to create a Service Bus topic and subscriptions to the topic](/azure/service-bus-messaging/service-bus-quickstart-topics-subscriptions-portal).\n\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web** dependency, then select Java version 8 or higher.\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this tutorial.\n\n## Send and receive messages from Azure Service Bus\n\nWith a queue or topic for Azure Service Bus, you can send and receive messages using Spring Cloud Azure Service Bus JMS.\n\nTo install the Spring Cloud Azure Service Bus JMS Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Service Bus JMS Starter artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId>\n  </dependency>\n  ```\n\n### Code the application\n\nUse the following steps to configure your application to use a Service Bus queue or topic to send and receive messages.\n\n1. Configure the Service Bus credentials by adding the following properties to your **application.properties** file.\n\n   #### [Use a Service Bus queue](#tab/use-a-service-bus-queue)\n\n   [!INCLUDE [spring-jms-passwordless-queue.md](includes/spring-jms-passwordless-queue.md)]\n\n   #### [Use a Service Bus topic](#tab/use-a-service-bus-topic)\n\n   [!INCLUDE [spring-jms-passwordless-topic.md](includes/spring-jms-passwordless-topic.md)]\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule. -->\n    ---\n\n1. Add `@EnableJms` to enable support for JMS listener annotated endpoints. Use `JmsTemplate` to send messages and `@JmsListener` to receive messages, as shown in the following example:\n\n   #### [Use a Service Bus queue](#tab/use-a-service-bus-queue)\n\n   ```java\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.beans.factory.annotation.Autowired;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.jms.annotation.EnableJms;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.jms.annotation.JmsListener;\n   import org.springframework.jms.core.JmsTemplate;\n\n   @SpringBootApplication\n   @EnableJms\n   public class ServiceBusJMSQueueApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBusJMSQueueApplication.class);\n       private static final String QUEUE_NAME = \"<QueueName>\";\n\n       @Autowired\n       private JmsTemplate jmsTemplate;\n\n       public static void main(String[] args) {\n           SpringApplication.run(ServiceBusJMSQueueApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n           LOGGER.info(\"Sending message\");\n           jmsTemplate.convertAndSend(QUEUE_NAME, \"Hello World\");\n       }\n\n       @JmsListener(destination = QUEUE_NAME, containerFactory = \"jmsListenerContainerFactory\")\n       public void receiveMessage(String message) {\n           LOGGER.info(\"Message received: {}\", message);\n       }\n\n   }\n   ```\n\n   Replace `<QueueName>` with your own queue name configured in your Service Bus namespace.\n\n   #### [Use a Service Bus topic](#tab/use-a-service-bus-topic)\n\n   ```java\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.beans.factory.annotation.Autowired;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.jms.annotation.EnableJms;\n   import org.springframework.jms.annotation.JmsListener;\n   import org.springframework.jms.core.JmsTemplate;\n\n   @SpringBootApplication\n   @EnableJms\n   public class ServiceBusJMSTopicApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBusJMSTopicApplication.class);\n       private static final String TOPIC_NAME = \"<TopicName>\";\n       private static final String SUBSCRIPTION_NAME = \"<SubscriptionName>\";\n\n       @Autowired\n       private JmsTemplate jmsTemplate;\n\n       public static void main(String[] args) {\n           SpringApplication.run(ServiceBusJMSTopicApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n           LOGGER.info(\"Sending message\");\n           jmsTemplate.convertAndSend(TOPIC_NAME, \"Hello World\");\n       }\n\n       @JmsListener(destination = TOPIC_NAME, containerFactory = \"topicJmsListenerContainerFactory\",\n           subscription = SUBSCRIPTION_NAME)\n       public void receiveMessage(String message) {\n           LOGGER.info(\"Message received: {}\", message);\n       }\n\n   }\n   ```\n\n   Replace the `<TopicName>` placeholder with your own topic name configured in your Service Bus namespace. Replace the `<SubscriptionName>` placeholder with your own subscription name for your Service Bus topic.\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule. -->\n    ---\n\n   [!INCLUDE [spring-default-azure-credential-overview.md](includes/spring-default-azure-credential-overview.md)]\n\n1. Start the application. You should see `Sending message` and `Hello World` posted to your application log, as shown in the following example output:\n\n   ```output\n   Sending message\n   Message received: Hello World\n   ```\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Service Bus JMS Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-storage.md",
    "content": "---\ntitle: Use Spring Boot to upload a file to Azure Blob Storage\ndescription: Learn how to configure a Spring Boot Initializer app with the Azure Storage starter.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Use Spring Boot to upload a file to Azure Blob Storage\n\nThis tutorial shows you how to upload and read from container blobs in an Azure Blob Storage account from a Spring Boot application.\n\n[Azure Blob Storage](/azure/storage/blobs/) is Microsoft's object storage solution for the cloud. Blob storage is optimized for storing a massive amount of unstructured data, such as text or binary data.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 8 or higher.\n- [Apache Maven](http://maven.apache.org/), version 3.0 or higher.\n- [cURL](https://curl.se/) or a similar HTTP utility to test functionality.\n- An Azure storage account and container. If you don't have one, [create a storage account](/azure/storage/common/storage-account-create?tabs=azure-portal).\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web** dependency, and then select Java version 8 or higher.\n\n> [!NOTE]\n> To grant your account access to resources, in your newly created Azure Storage account, assign the `Storage Blob Data Contributor` role to the Microsoft Entra account you're currently using. For more information, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal).\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this tutorial.\n\n## Create a container\n\nFirst, create a container named `testcontainer` by following the instructions in [Quickstart: Upload, download, and list blobs with the Azure portal](/azure/storage/blobs/storage-quickstart-blobs-portal).\n\n## Upload and read blobs from Azure Storage account container\n\nNow that you have an Azure Storage account and container, you can upload and read files from blobs with Spring Cloud Azure.\n\nTo install the Spring Cloud Azure Storage Blob Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Storage Blob Starter artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-storage-blob</artifactId>\n  </dependency>\n  ```\n\n### Code the application\n\nTo upload and read files from blobs by using the Spring Cloud Azure Storage Blob starter, configure the application by using the following steps.\n\n1. Configure a Storage account name and endpoint in the **application.properties** configuration file, as shown in the following example.\n\n   ```properties\n   spring.cloud.azure.storage.blob.account-name=${AZURE_STORAGE_ACCOUNT_NAME}\n   spring.cloud.azure.storage.blob.endpoint=${AZURE_STORAGE_ACCOUNT_ENDPOINT}\n   ```\n\n1. Create a new `BlobController` Java class as shown in the following example. This class is used to upload and read files from the container blob in the Azure Storage account.\n\n   ```java\n   package com.example.demo;\n\n   import org.springframework.beans.factory.annotation.Value;\n   import org.springframework.core.io.Resource;\n   import org.springframework.core.io.WritableResource;\n   import org.springframework.util.StreamUtils;\n   import org.springframework.web.bind.annotation.*;\n\n   import java.io.IOException;\n   import java.io.OutputStream;\n   import java.nio.charset.Charset;\n\n   @RestController\n   @RequestMapping(\"blob\")\n   public class BlobController {\n\n       @Value(\"azure-blob://testcontainer/test.txt\")\n       private Resource blobFile;\n\n       @GetMapping(\"/readBlobFile\")\n       public String readBlobFile() throws IOException {\n           return StreamUtils.copyToString(\n                   this.blobFile.getInputStream(),\n                   Charset.defaultCharset());\n       }\n\n       @PostMapping(\"/writeBlobFile\")\n       public String writeBlobFile(@RequestBody String data) throws IOException {\n           try (OutputStream os = ((WritableResource) this.blobFile).getOutputStream()) {\n               os.write(data.getBytes());\n           }\n           return \"file was updated\";\n       }\n   }\n   ```\n\n   [!INCLUDE [spring-default-azure-credential-overview.md](includes/spring-default-azure-credential-overview.md)]\n\n1. After your application is running, use `curl` to test your application by following these steps.\n\n   1. Send a POST request to update a file's contents by using the following command:\n\n      ```shell\n      curl http://localhost:8080/blob/writeBlobFile -d \"new message\" -H \"Content-Type: text/plain\"\n      ```\n\n      You should see a response that says `file was updated`.\n\n   1. Send a GET request to verify the file's contents by using the following command:\n\n      ```shell\n      curl -X GET http://localhost:8080/blob/readBlobFile\n      ```\n\n      You should see the \"new message\" text that you posted.\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Storage Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/storage)\n\n### See also\n\nFor more information about the additional Spring Boot Starters that are available for Microsoft Azure, see [What is Spring Cloud Azure?](spring-cloud-azure-overview.md)\n\nFor more information about additional Azure storage APIs that you can call from your Spring Boot applications, see the following articles:\n\n- [Quickstart: Azure Blob Storage client library for Java](/azure/storage/blobs/storage-java-how-to-use-blob-storage)\n- [How to use Queue Storage from Java](/azure/storage/queues/storage-quickstart-queues-java)\n- [How to use Azure Table client library for Java](/azure/cosmos-db/table-storage-how-to-use-java)\n- [Develop for Azure Files with Java SE](/azure/storage/files/storage-java-how-to-use-file-storage)\n- [Quickstart: Quarkus extension for Azure Blob Storage](/azure/storage/blobs/storage-quickstart-blobs-java-quarkus)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-boot-starter-java-app-with-cosmos-db.md",
    "content": "---\ntitle: Access data with Azure Cosmos DB NoSQL API\ndescription: Learn how to configure an application created with the Spring Boot Initializer with Azure Cosmos DB for NoSQL.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: how-to\nms.custom:\n  - devx-track-java\n  - spring-cloud-azure\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Access data with Azure Cosmos DB NoSQL API\n\nThis article shows you how to add the [Spring Cloud Azure Starter for Spring Data for Azure Cosmos DB] to a custom application. This starter enables you to store data in and retrieve data from your Azure Cosmos DB database by using Spring Data and Azure Cosmos DB for NoSQL. The article starts by showing you how to create an Azure Cosmos DB via the Azure portal. Then, the article shows you how to use [Spring Initializr] to create a custom Spring Boot application that you can use with the Spring Boot Starter.\n\nAzure Cosmos DB is a globally distributed database service that allows developers to work with data using various standard APIs, such as SQL, MongoDB, Graph, and Table APIs. Microsoft's Spring Boot Starter enables developers to use Spring Boot applications that easily integrate with Azure Cosmos DB for NoSQL.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n\n## Create an Azure Cosmos DB by using the Azure portal\n\nUse the following steps to create an Azure Cosmos DB instance:\n\n1. Browse to the [Azure portal](https://portal.azure.com) and select **Create a resource**.\n\n1. Select **Databases**, and then select **Azure Cosmos DB**.\n\n1. On the **Create an Azure Cosmos DB account** screen, select **Azure Cosmos DB for NoSQL**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-cosmos-db/azure-cosmos-db-nosql.png\" alt-text=\"Screenshot of the Azure portal that shows the Create an Azure Cosmos DB account page with Azure Cosmos DB for NoSQL option highlighted.\" lightbox=\"media/configure-spring-boot-starter-java-app-with-cosmos-db/azure-cosmos-db-nosql.png\":::\n\n1. On the **Azure Cosmos DB** page, enter the following information:\n\n   * Choose the **Subscription** you want to use for your database.\n   * Specify whether to create a new **Resource group** for your database, or choose an existing resource group.\n   * Enter a unique **Account Name**, which you use as the URI for your database. For example: **contosoaccounttest**.\n   * Specify the **Location** for your database.\n   * Select **Apply Free Tier Discount** if you want to create an account for demonstration purpose only.\n   * Leave the rest of the default options and settings as is.\n\n1. Select **Review + create**, review your specifications, and select **Create**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-cosmos-db/create-azure-cosmos-db-account.png\" alt-text=\"Screenshot of the Azure portal that shows the Create Azure Cosmos DB Account page with Azure Cosmos DB for NoSQL settings.\" lightbox=\"media/configure-spring-boot-starter-java-app-with-cosmos-db/create-azure-cosmos-db-account.png\":::\n\n1. When your database has been created, it's listed on your Azure **Dashboard**, and under the **All Resources** and **Azure Cosmos DB** pages. To create a database and a container for a newly created Azure Cosmos DB, see the [Add a database and a container](/azure/cosmos-db/nosql/quickstart-portal#create-container-database) section of [Quickstart: Create an Azure Cosmos DB account, database, container, and items from the Azure portal](/azure/cosmos-db/nosql/quickstart-portal). You can select your database for any of those locations to open the properties page for your cache.\n\n1. When the properties page for your database is displayed, select **Keys** and copy your URI and access keys for your database. You use these values in your Spring Boot application.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-cosmos-db/azure-cosmos-db-keys.png\" alt-text=\"Screenshot of the Azure portal that shows the Azure Cosmos DB account with the Keys page showing.\" lightbox=\"media/configure-spring-boot-starter-java-app-with-cosmos-db/azure-cosmos-db-keys.png\":::\n\n> [!IMPORTANT]\n> In your newly created Azure Cosmos DB, assign the `Owner` role to the Azure account you're currently using. For more information, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal).\n\n## Create a Spring Boot application with the Spring Initializr\n\nUse the following steps to create a new Spring Boot application project with Azure support. As an alternative, you can use the [`spring-cloud-azure-data-cosmos-sample`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/cosmos/spring-cloud-azure-starter-data-cosmos/spring-cloud-azure-data-cosmos-sample) sample in the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main) repo. Then, you can skip directly to [Build and test your app](#build-and-test-your-app).\n\n1. Browse to <https://start.spring.io/>.\n\n1. Specify the following options:\n\n   * Generate a **Maven** project with **Java**.\n   * Specify your **Spring Boot** version to **2.7.11**.\n   * Specify the **Group** and **Artifact** names for your application.\n   * Select **17** for the Java version.\n   * Add **Azure Support** in the dependencies.\n\n   > [!NOTE]\n   > The Spring Initializr uses the **Group** and **Artifact** names to create the package name; for example: `com.example.wingtiptoysdata`.\n   >\n   > The version of Spring Boot may be higher than the version supported by Azure Support. After the project is automatically generated, you can manually change the Spring Boot version to the highest version supported by Azure, which you can find in [`Spring-Versions-Mapping`](https://github.com/Azure/azure-sdk-for-java/wiki/Spring-Versions-Mapping).\n\n1. When you've specified the options listed previously, select **GENERATE**.\n\n1. When prompted, download the project to a path on your local computer and extract the files.\n\nYour simple Spring Boot application is now ready for editing.\n\n## Configure your Spring Boot application to use the Azure Spring Boot Starter\n\n1. Locate the **pom.xml** file in the directory of your app; for example:\n\n   **C:\\SpringBoot\\wingtiptoysdata\\pom.xml**\n\n   -or-\n\n   **/users/example/home/wingtiptoysdata/pom.xml**\n\n1. Open the **pom.xml** file in a text editor, and add the following to the `<dependencies>` element:\n\n   ```xml\n   <dependency>\n     <groupId>com.azure.spring</groupId>\n     <artifactId>spring-cloud-azure-starter-data-cosmos</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n1. Save and close the **pom.xml** file.\n\n## Configure your Spring Boot application to use your Azure Cosmos DB\n\n1. Locate the **application.properties** file in the **resources** directory of your app; for example:\n\n   **C:\\SpringBoot\\wingtiptoysdata\\src\\main\\resources\\application.properties**\n\n   -or-\n\n   **/users/example/home/wingtiptoysdata/src/main/resources/application.properties**\n\n1. Open the **application.properties** file in a text editor, and add the following lines to the file, and replace the sample values with the appropriate properties for your database:\n\n   ```properties\n   # Specify the DNS URI of your Azure Cosmos DB.\n   spring.cloud.azure.cosmos.endpoint=https://contosoaccounttest.documents.azure.com:443/\n   spring.cloud.azure.cosmos.key=your-cosmosdb-account-key\n\n   # Specify the name of your database.\n   spring.cloud.azure.cosmos.database=contosoaccounttest\n   spring.cloud.azure.cosmos.populate-query-metrics=true\n   ```\n\n1. Save and close the **application.properties** file.\n\n## Add sample code to implement basic database functionality\n\nIn this section, you create two Java classes for storing user data. Then, you modify your main application class to create an instance of the `User` class and save it to your database.\n\n### Define a base class for storing user data\n\n1. Create a new file named **User.java** in the same directory as your main application Java file.\n\n1. Open the **User.java** file in a text editor, and add the following lines to the file to define a generic user class that stores and retrieve values in your database:\n\n   ```java\n   package com.example.wingtiptoysdata;\n\n   import com.azure.spring.data.cosmos.core.mapping.Container;\n   import com.azure.spring.data.cosmos.core.mapping.PartitionKey;\n   import org.springframework.data.annotation.Id;\n\n   @Container(containerName = \"mycollection\")\n   public class User {\n       @Id\n       private String id;\n       private String firstName;\n       @PartitionKey\n       private String lastName;\n       private String address;\n\n       public User() {\n\n       }\n\n       public User(String id, String firstName, String lastName, String address) {\n           this.id = id;\n           this.firstName = firstName;\n           this.lastName = lastName;\n           this.address = address;\n       }\n\n       public String getId() {\n           return id;\n       }\n\n       public void setId(String id) {\n           this.id = id;\n       }\n\n       public String getFirstName() {\n           return firstName;\n       }\n\n       public void setFirstName(String firstName) {\n           this.firstName = firstName;\n       }\n\n       public String getLastName() {\n           return lastName;\n       }\n\n       public void setLastName(String lastName) {\n           this.lastName = lastName;\n       }\n\n       public String getAddress() {\n           return address;\n       }\n\n       public void setAddress(String address) {\n           this.address = address;\n       }\n\n       @Override\n       public String toString() {\n           return String.format(\"%s %s, %s\", firstName, lastName, address);\n       }\n   }\n   ```\n\n1. Save and close the **User.java** file.\n\n### Define a data repository interface\n\n1. Create a new file named **UserRepository.java** in the same directory as your main application Java file.\n\n1. Open the **UserRepository.java** file in a text editor, and add the following lines to the file to define a user repository interface that extends the default `ReactiveCosmosRepository` interface:\n\n   ```java\n   package com.example.wingtiptoysdata;\n\n   import com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository;\n   import org.springframework.stereotype.Repository;\n   import reactor.core.publisher.Flux;\n\n   @Repository\n   public interface UserRepository extends ReactiveCosmosRepository<User, String> {\n       Flux<User> findByFirstName(String firstName);\n   }\n   ```\n\n   The `ReactiveCosmosRepository` interface replaces the `DocumentDbRepository` interface from the previous version of the starter. The new interface provides synchronous and reactive APIs for basic save, delete, and find operations.\n\n1. Save and close the **UserRepository.java** file.\n\n### Modify the main application class\n\n1. Locate the main application Java file in the package directory of your application, for example:\n\n   `C:\\SpringBoot\\wingtiptoysdata\\src\\main\\java\\com\\example\\wingtiptoysdata\\WingtiptoysdataApplication.java`\n\n   -or-\n\n   `/users/example/home/wingtiptoysdata/src/main/java/com/example/wingtiptoysdata/WingtiptoysdataApplication.java`\n\n1. Open the main application Java file in a text editor, and add the following lines to the file:\n\n   ```java\n   package com.example.wingtiptoysdata;\n\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.beans.factory.annotation.Autowired;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.util.Assert;\n   import reactor.core.publisher.Flux;\n   import reactor.core.publisher.Mono;\n\n   import java.util.Optional;\n\n   @SpringBootApplication\n   public class WingtiptoysdataApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(WingtiptoysdataApplication.class);\n\n       @Autowired\n       private UserRepository repository;\n\n       public static void main(String[] args) {\n           SpringApplication.run(WingtiptoysdataApplication.class, args);\n       }\n\n       public void run(String... var1) {\n           this.repository.deleteAll().block();\n           LOGGER.info(\"Deleted all data in container.\");\n\n           final User testUser = new User(\"testId\", \"testFirstName\", \"testLastName\", \"test address line one\");\n\n           // Save the User class to Azure Cosmos DB database.\n           final Mono<User> saveUserMono = repository.save(testUser);\n\n           final Flux<User> firstNameUserFlux = repository.findByFirstName(\"testFirstName\");\n\n           //  Nothing happens until we subscribe to these Monos.\n           //  findById won't return the user as user isn't present.\n           final Mono<User> findByIdMono = repository.findById(testUser.getId());\n           final User findByIdUser = findByIdMono.block();\n           Assert.isNull(findByIdUser, \"User must be null\");\n\n           final User savedUser = saveUserMono.block();\n           Assert.state(savedUser != null, \"Saved user must not be null\");\n           Assert.state(savedUser.getFirstName().equals(testUser.getFirstName()), \"Saved user first name doesn't match\");\n\n           firstNameUserFlux.collectList().block();\n\n           final Optional<User> optionalUserResult = repository.findById(testUser.getId()).blockOptional();\n           Assert.isTrue(optionalUserResult.isPresent(), \"Cannot find user.\");\n\n           final User result = optionalUserResult.get();\n           Assert.state(result.getFirstName().equals(testUser.getFirstName()), \"query result firstName doesn't match!\");\n           Assert.state(result.getLastName().equals(testUser.getLastName()), \"query result lastName doesn't match!\");\n\n           LOGGER.info(\"findOne in User collection get result: {}\", result.toString());\n       }\n   }\n   ```\n\n1. Save and close the main application Java file.\n\n## Build and test your app\n\n1. Open a command prompt and navigate to the folder where your **pom.xml** file is located; for example:\n\n   `cd C:\\SpringBoot\\wingtiptoysdata`\n\n   -or-\n\n   `cd /users/example/home/wingtiptoysdata`\n\n1. Use the following command to build and run your application:\n\n   ```bash\n   ./mvnw clean\n   ```\n\n   This command runs the application automatically as part of the test phase. You can also use:\n\n   ```bash\n   ./mvnw spring-boot:run\n   ```\n\n   After some build and test output, your console window displays a message similar to the following example:\n\n   ```output\n   INFO 1365 --- [           main] c.e.w.WingtiptoysdataApplication         : Deleted all data in container.\n\n   ... (omitting connection and diagnostics output) ...\n\n   INFO 1365 --- [           main] c.e.w.WingtiptoysdataApplication         : findOne in User collection get result: testFirstName testLastName, test address line one\n   ```\n\n   These output messages indicate that the data was successfully saved to Azure Cosmos DB and then retrieved again.\n\n## Clean up resources\n\nIf you're not going to continue to use this application, be sure to delete the resource group containing the Azure Cosmos DB you created earlier. You can delete the resource group from the Azure portal.\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Spring on Azure](./index.yml)\n\n### More resources\n\nFor more information about using Azure Cosmos DB and Java, see the following articles:\n\n* [Azure Cosmos DB Documentation].\n\n* [Azure Cosmos DB: Create a document database using Java and the Azure portal][Build a SQL API app with Java]\n\n* [Spring Data for Azure Cosmos DB]\n\nFor more information about using Spring Boot applications on Azure, see the following articles:\n\n* [Spring Cloud Azure Starter for Spring Data Azure Cosmos DB]\n\n* [Deploy a Spring Boot application to Linux on Azure App Service](deploy-spring-boot-java-app-on-linux.md)\n\n* [Running a Spring Boot Application on a Kubernetes Cluster in the Azure Container Service](deploy-spring-boot-java-app-on-kubernetes.md)\n\nFor more information about using Azure with Java, see the [Azure for Java Developers] and the [Working with Azure DevOps and Java].\n\nThe **[Spring Framework]** is an open-source solution that helps Java developers create enterprise-level applications. One of the more-popular projects that is built on top of that platform is [Spring Boot], which provides a simplified approach for creating stand-alone Java applications. To help developers get started with Spring Boot, several sample Spring Boot packages are available at <https://github.com/spring-guides/>. In addition to choosing from the list of basic Spring Boot projects, the **[Spring Initializr]** helps developers get started with creating custom Spring Boot applications.\n\n<!-- URL List -->\n\n[Azure Cosmos DB Documentation]: /azure/cosmos-db/\n[Azure for Java Developers]: ../index.yml\n[Build a SQL API app with Java]: /azure/cosmos-db/create-sql-api-java\n[Spring Data for Azure Cosmos DB]: https://azure.microsoft.com/blog/spring-data-azure-cosmos-db-nosql-data-access-on-azure/\n[Spring Cloud Azure Starter for Spring Data for Azure Cosmos DB]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/spring-cloud-azure-starter-cosmos\n[Working with Azure DevOps and Java]: https://azure.microsoft.com/services/devops/java/\n[Spring Boot]: https://spring.io/projects/spring-boot/\n[Spring Initializr]: https://start.spring.io/\n[Spring Framework]: https://spring.io/\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-boot-starter-java-app-with-entra.md",
    "content": "---\ntitle: Add sign-in with Microsoft Entra account to a Spring web app\ndescription: Shows you how to develop a Spring web app that supports sign-in by Microsoft Entra account.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\nadobe-target: true\n---\n\n# Add sign-in with Microsoft Entra account to a Spring web app\n\nThis article shows you how to develop a Spring web app that supports sign-in by [Microsoft Entra account](/azure/active-directory/fundamentals/active-directory-whatis#terminology). After finishing all steps in this article, the web app will redirect to the Microsoft Entra sign-in page when it's been accessed anonymously. The following screenshot shows the Microsoft Entra sign-in page:\n\n:::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-entra/application-login.png\" alt-text=\"Screenshot of application 'Sign in' dialog.\":::\n\n## Prerequisites\n\nThe following prerequisites are required to complete the steps in this article:\n\n* A supported Java Development Kit (JDK). For more information about the JDKs available for use when developing on Azure, see [Java support on Azure and Azure Stack](../fundamentals/java-support-on-azure.md).\n* [Apache Maven](http://maven.apache.org/), version 3.0 or higher.\n* An Azure subscription. If you don't have an Azure subscription, create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this article.\n\n## Create an app using Spring Initializr\n\n1. Browse to <https://start.spring.io/>.\n\n1. Specify that you want to generate a **Maven** project with **Java**, enter the **Group** and **Artifact** names for your application.\n1. Add **Dependencies** for **Spring Web** and **OAuth2 Client**.\n1. At the bottom of the page, select the **GENERATE** button.\n1. When prompted, download the project to a path on your local computer.\n\n## Add the Microsoft Entra dependency\n\n1. Extract the downloaded project files to a directory on your local computer.\n\n1. Open the **pom.xml** file in a text editor.\n\n1. Add the Spring Cloud Azure Bill of Materials (BOM) to the `<dependencyManagement>` section:\n\n   ```xml\n   <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n       </dependency>\n     </dependencies>\n   </dependencyManagement>\n   ```\n\n1. Add the Spring Cloud Azure Starter Microsoft Entra dependency to the `<dependencies>` section:\n\n   ```xml\n   <dependency>\n     <groupId>com.azure.spring</groupId>\n     <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n   </dependency>\n   ```\n\n1. Save and close the **pom.xml** file.\n\n<a name='create-azure-active-directory-instance'></a>\n\n## Create the Microsoft Entra instance\n\nIf you're the administrator of an existing instance, you can skip this process.\n\n1. Log into <https://portal.azure.com>.\n\n1. Select **All services**, then **Identity**, and then **Microsoft Entra ID**.\n\n1. Enter your **Organization name** and your **Initial domain name**. Copy the full URL of your directory. You'll use the URL to add user accounts later in this tutorial. (For example: `azuresampledirectory.onmicrosoft.com`.)\n\n   Copy the full URL of your directory. You'll use the URL to add user accounts later in this tutorial. (For example: `azuresampledirectory.onmicrosoft.com`.).\n\n   When you've finished, select **Create**. It will take a few minutes to create the new resource.\n\n1. When complete, select the displayed link to access the new directory.\n\n1. Copy the **Tenant ID**. You'll use the ID value to configure your **application.properties** file later in this tutorial.\n\n## Add an application registration for your Spring Boot app\n\n1. From the portal menu, select **App registrations**, and then select **Register an application**.\n\n1. Specify your application, and then select **Register**.\n\n1. When the page for your app registration appears, copy your **Application (client) ID** and the **Tenant ID**. You'll use these values to configure your **application.properties** file later in this tutorial.\n\n1. Select **Certificates & secrets** in the navigation pane. Then, select **New client secret**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-entra/create-client-secret.png\" alt-text=\"Screenshot of application 'Certificates & secrets' screen with 'New client secret' highlighted.\" lightbox=\"media/configure-spring-boot-starter-java-app-with-entra/create-client-secret.png\":::\n\n1. Add a **Description** and select duration in the **Expires** list. Select **Add**. The value for the key will be automatically filled in.\n\n1. Copy and save the value of the client secret to configure your **application.properties** file later in this tutorial. (You won't be able to retrieve this value later.)\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-entra/copy-client-secret.png\" alt-text=\"Screenshot of application with new client secret highlighted.\" lightbox=\"media/configure-spring-boot-starter-java-app-with-entra/copy-client-secret.png\":::\n\n1. From the main page for your app registration, select **Authentication**, and select **Add a platform**.  Then select **Web applications**.\n\n1. For a new **Redirect URI**, enter `http://localhost:8080/login/oauth2/code/`, and then select **Configure**.\n\n1. If you've modified the **pom.xml** file to use a Microsoft Entra starter version earlier than 3.0.0: under **Implicit grant and hybrid flows**, select **ID tokens (used for implicit and hybrid flows)**, then select **Save**.\n\n## Add a user account to your directory, and add that account to an appRole\n\n1. From the **Overview** page of your Microsoft Entra ID tenant, select **Users**, and then select **New user**.\n\n1. When the **User** panel is displayed, enter the **User name** and **Name**.  Then select **Create**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-entra/create-user-with-name.png\" alt-text=\"Screenshot of 'New user' dialog.\":::\n\n   > [!NOTE]\n   > You need to specify your directory URL from earlier in this tutorial when you enter the user name. For example:\n   >\n   > `test-user@azuresampledirectory.onmicrosoft.com`\n\n1. From the main page for your app registration, select **App roles**, then select **Create app role**. Provide values for the form fields, select **Do you want to enable this app role?**, then select **Apply**.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-entra/create-app-role-for-application.png\" alt-text=\"Screenshot of application 'App roles' screen with 'Create app role' pane showing.\" lightbox=\"media/configure-spring-boot-starter-java-app-with-entra/create-app-role-for-application.png\":::\n\n1. From the **Overview** page of your Microsoft Entra directory, select **Enterprise applications**.\n\n1. Select **All applications**, then select the application you added the app role to in a previous step.\n\n1. Select **Users and groups**, then select **Add user/group**.\n\n1. Under **Users**, select **None Selected**. Select the user you created earlier, select **Select**, then select **Assign**. If you created more than one app role earlier, select a role.\n\n1. Go back to the **Users** panel, select your test user, and select **Reset password**, and copy the password. You'll use the password when you log into your application later in this tutorial.\n\n## Configure and compile your app\n\n1. Extract the files from the project archive you created and downloaded earlier in this tutorial into a directory.\n\n1. Navigate to the **src/main/resources** folder in your project, then open the **application.properties** file in a text editor.\n\n1. Specify the settings for your app registration using the values you created earlier. For example:\n\n   ```properties\n   # Enable related features.\n   spring.cloud.azure.active-directory.enabled=true\n   # Specifies your Microsoft Entra ID tenant ID:\n   spring.cloud.azure.active-directory.profile.tenant-id=<tenant-ID>\n   # Specifies your App Registration's Application ID:\n   spring.cloud.azure.active-directory.credential.client-id=<client-ID>\n   # Specifies your App Registration's secret key:\n   spring.cloud.azure.active-directory.credential.client-secret=<client-secret>\n   ```\n\n   Where:\n\n   | Parameter | Description |\n   |---|---|\n   | `spring.cloud.azure.active-directory.enabled` | Enable the features provided by `spring-cloud-azure-starter-active-directory` |\n   | `spring.cloud.azure.active-directory.profile.tenant-id` | Contains your Microsoft Entra ID tenant's **Tenant ID** from earlier. |\n   | `spring.cloud.azure.active-directory.credential.client-id` | Contains the **Application ID** from your app registration that you completed earlier. |\n   | `spring.cloud.azure.active-directory.credential.client-secret` | Contains the **Value** from your app registration key that you completed earlier. |\n   \n\n1. Save and close the **application.properties** file.\n\n1. Create a folder named **controller** in the Java source folder for your application. For example: **src/main/java/com/wingtiptoys/security/controller**.\n\n1. Create a new Java file named **HelloController.java** in the **controller** folder and open it in a text editor.\n\n1. Enter the following code, then save and close the file:\n\n   ```java\n   package com.wingtiptoys.security;\n\n   import org.springframework.web.bind.annotation.GetMapping;\n   import org.springframework.web.bind.annotation.ResponseBody;\n   import org.springframework.web.bind.annotation.RestController;\n   import org.springframework.security.access.prepost.PreAuthorize;\n\n   @RestController\n   public class HelloController {\n        @GetMapping(\"Admin\")\n        @ResponseBody\n        @PreAuthorize(\"hasAuthority('APPROLE_Admin')\")\n        public String Admin() {\n            return \"Admin message\";\n        }\n   }\n   ```\n\n\n## Build and test your app\n\n1. Open a command prompt and change directory to the folder where your app's **pom.xml** file is located.\n\n1. Build your Spring Boot application with Maven and run it. For example:\n\n   ```bash\n   mvn clean package\n   mvn spring-boot:run\n   ```\n\n1. After your application is built and started by Maven, open `http://localhost:8080/Admin` in a web browser. You should be prompted for a user name and password.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-entra/application-login.png\" alt-text=\"Screenshot of application 'Sign in' dialog.\":::\n\n   > [!NOTE]\n   > You may be prompted to change your password if this is the first login for a new user account.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-entra/update-password.png\" alt-text=\"Screenshot of application 'Update your password' dialog.\":::\n\n1. After you've logged in successfully, you should see the sample \"Admin message\" text from the controller.\n\n   :::image type=\"content\" source=\"media/configure-spring-boot-starter-java-app-with-entra/hello-admin.png\" alt-text=\"Screenshot of application admin message.\":::\n\n## Summary\n\nIn this tutorial, you created a new Java web application using the Microsoft Entra starter, configured a new Microsoft Entra tenant, registered a new application in the tenant, and then configured your application to use the Spring annotations and classes to protect the web app.\n\n## See also\n\n* For information about new UI options, see [New Azure portal app registration training guide](/azure/active-directory/develop/app-registrations-training-guide-for-app-registrations-legacy-users)\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n   >[!div class=\"nextstepaction\"]\n   >[Spring on Azure](./index.yml)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-cloud-stream-binder-java-app-azure-event-hub.md",
    "content": "---\ntitle: Spring Cloud Stream with Azure Event Hubs\ndescription: Learn how to configure a Java-based Spring Cloud Stream Binder application created with the Spring Boot Initializr with Azure Event Hubs.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiada\nms.date: 08/19/2025\nms.topic: tutorial\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Spring Cloud Stream with Azure Event Hubs\n\nThis tutorial demonstrates how to send and receive messages using Azure Event Hubs and Spring Cloud Stream Binder Eventhubs in a Spring Boot application.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 8 or higher.\n\n- [Apache Maven](http://maven.apache.org/), version 3.2 or higher.\n\n- [cURL](https://curl.se/) or a similar HTTP utility to test functionality.\n\n- An Azure Event hub. If you don't have one, [create an event hub using Azure portal](/azure/event-hubs/event-hubs-create).\n\n- An Azure Storage Account for Event hub checkpoints. If you don't have one, [create a storage account](/azure/storage/common/storage-account-create?tabs=azure-portal).\n\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web** and **Azure Support** dependencies, then select Java version 8 or higher.\n\n> [!NOTE]\n> To grant your account access to resources, in Azure Event Hubs, assign the `Azure Event Hubs Data Receiver` and `Azure Event Hubs Data Sender` role to the Microsoft Entra account you're currently using. Then, in the Azure Storage account, assign the `Storage Blob Data Contributor` role to the Microsoft Entra account you're currently using. For more information about granting access roles, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal) and [Authorize access to Event Hubs resources using Microsoft Entra ID](/azure/event-hubs/authorize-access-azure-active-directory).\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this tutorial.\n\n## Send and receive messages from Azure Event Hubs\n\nWith an Azure Storage Account and an Azure Event hub, you can send and receive messages using Spring Cloud Azure Stream Binder Event Hubs.\n\nTo install the Spring Cloud Azure Stream Binder Event Hubs module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Stream Binder Event Hubs artifact:\n\n   ```xml\n   <dependency>\n     <groupId>com.azure.spring</groupId>\n     <artifactId>spring-cloud-azure-stream-binder-eventhubs</artifactId>\n   </dependency>\n   ```\n\n### Code the application\n\nUse the following steps to configure your application to produce and consume messages using Azure Event Hubs.\n\n1. Configure the Event hub credentials by adding the following properties to your **application.properties** file.\n\n   ```properties\n    spring.cloud.azure.eventhubs.namespace=${AZURE_EVENTHUBS_NAMESPACE}\n    spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name=${AZURE_STORAGE_ACCOUNT_NAME}\n    spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name=${AZURE_STORAGE_CONTAINER_NAME}\n    spring.cloud.stream.bindings.consume-in-0.destination=${AZURE_EVENTHUB_NAME}\n    spring.cloud.stream.bindings.consume-in-0.group=${AZURE_EVENTHUB_CONSUMER_GROUP}\n    spring.cloud.stream.bindings.supply-out-0.destination=${AZURE_EVENTHUB_NAME}\n    spring.cloud.stream.eventhubs.bindings.consume-in-0.consumer.checkpoint.mode=MANUAL\n    spring.cloud.function.definition=consume;supply;\n    spring.cloud.stream.poller.initial-delay=0\n    spring.cloud.stream.poller.fixed-delay=1000\n   ```\n\n   The following table describes the fields in the configuration:\n\n   | Field                                                                          | Description                                                                                   |\n   |--------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------|\n   | `spring.cloud.azure.eventhubs.namespace`                                       | Specify the namespace you obtained in your event hub from the Azure portal.                   |\n   | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name`         | Specify the storage account you created in this tutorial.                                     |\n   | `spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name`       | Specify the container of your storage account.                                                |\n   | `spring.cloud.stream.bindings.consume-in-0.destination`                        | Specify the event hub you used in this tutorial.                                              |\n   | `spring.cloud.stream.bindings.consume-in-0.group`                              | Specify the Consumer groups in your Event Hubs Instance.                                      |\n   | `spring.cloud.stream.bindings.supply-out-0.destination`                        | Specify the same event hub you used in this tutorial.                                         |\n   | `spring.cloud.stream.eventhubs.bindings.consume-in-0.consumer.checkpoint.mode` | Specify `MANUAL`.                                                                             |\n   | `spring.cloud.function.definition`                                             | Specify which functional bean to bind to the external destination(s) exposed by the bindings. |\n   | `spring.cloud.stream.poller.initial-delay`                                     | Specify initial delay for periodic triggers. The default value is `0`.                        |\n   | `spring.cloud.stream.poller.fixed-delay`                                       | Specify fixed delay for default poller in milliseconds. The default value is `1000 L`.        |\n\n1. Edit the startup class file to show the following content.\n\n    ```java\n    import com.azure.spring.messaging.checkpoint.Checkpointer;\n    import com.azure.spring.messaging.eventhubs.support.EventHubsHeaders;\n    import org.slf4j.Logger;\n    import org.slf4j.LoggerFactory;\n    import org.springframework.boot.CommandLineRunner;\n    import org.springframework.boot.SpringApplication;\n    import org.springframework.boot.autoconfigure.SpringBootApplication;\n    import org.springframework.context.annotation.Bean;\n    import org.springframework.messaging.Message;\n    import org.springframework.messaging.support.MessageBuilder;\n    import reactor.core.publisher.Flux;\n    import reactor.core.publisher.Sinks;\n    import java.util.function.Consumer;\n    import java.util.function.Supplier;\n    import static com.azure.spring.messaging.AzureHeaders.CHECKPOINTER;\n    \n    @SpringBootApplication\n    public class EventHubBinderApplication implements CommandLineRunner {\n    \n        private static final Logger LOGGER = LoggerFactory.getLogger(EventHubBinderApplication.class);\n        private static final Sinks.Many<Message<String>> many = Sinks.many().unicast().onBackpressureBuffer();\n    \n        public static void main(String[] args) {\n            SpringApplication.run(EventHubBinderApplication.class, args);\n        }\n    \n        @Bean\n        public Supplier<Flux<Message<String>>> supply() {\n            return ()->many.asFlux()\n                           .doOnNext(m->LOGGER.info(\"Manually sending message {}\", m))\n                           .doOnError(t->LOGGER.error(\"Error encountered\", t));\n        }\n    \n        @Bean\n        public Consumer<Message<String>> consume() {\n            return message->{\n                Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n                LOGGER.info(\"New message received: '{}', partition key: {}, sequence number: {}, offset: {}, enqueued \"\n                        +\"time: {}\",\n                    message.getPayload(),\n                    message.getHeaders().get(EventHubsHeaders.PARTITION_KEY),\n                    message.getHeaders().get(EventHubsHeaders.SEQUENCE_NUMBER),\n                    message.getHeaders().get(EventHubsHeaders.OFFSET),\n                    message.getHeaders().get(EventHubsHeaders.ENQUEUED_TIME)\n                );\n                checkpointer.success()\n                            .doOnSuccess(success->LOGGER.info(\"Message '{}' successfully checkpointed\",\n                                message.getPayload()))\n                            .doOnError(error->LOGGER.error(\"Exception found\", error))\n                            .block();\n            };\n        }\n    \n        @Override\n        public void run(String... args) {\n            LOGGER.info(\"Going to add message {} to sendMessage.\", \"Hello World\");\n            many.emitNext(MessageBuilder.withPayload(\"Hello World\").build(), Sinks.EmitFailureHandler.FAIL_FAST);\n        }\n    \n    }\n    ```\n\n   [!INCLUDE [spring-default-azure-credential-overview.md](includes/spring-default-azure-credential-overview.md)]\n\n1. Start the application. Messages like this will be posted in your application log, as shown in the following example output:\n\n   ```output\n   New message received: 'Hello World', partition key: 107207233, sequence number: 458, offset: 94256, enqueued time: 2023-02-17T08:27:59.641Z\n   Message 'Hello World!' successfully checkpointed\n   ```\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Stream Binder Event Hubs Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/eventhubs)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-cloud-stream-binder-java-app-kafka-azure-event-hub.md",
    "content": "---\ntitle: Use Spring Kafka with Azure Event Hubs for Kafka API\ndescription: Shows you how to configure a Java-based Spring Cloud Stream Binder to use Apache Kafka with Azure Event Hubs.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiada\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, passwordless-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Use Spring Kafka with Azure Event Hubs for Kafka API\n\nThis tutorial shows you how to configure a Java-based Spring Cloud Stream Binder to use Azure Event Hubs for Kafka for sending and receiving messages with Azure Event Hubs. For more information, see [Use Azure Event Hubs from Apache Kafka applications](/azure/event-hubs/event-hubs-for-kafka-ecosystem-overview)\n\nIn this tutorial, we'll include two authentication methods: [Microsoft Entra authentication](/azure/event-hubs/authenticate-application) and [Shared Access Signatures (SAS) authentication](/azure/event-hubs/authenticate-shared-access-signature). The **Passwordless** tab shows the Microsoft Entra authentication and the **Connection string** tab shows the SAS authentication.\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Event Hubs for Kafka using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nSAS authentication uses the connection string of your Azure Event Hubs namespace for the delegated access to Event Hubs for Kafka. If you choose to use Shared Access Signatures as credentials, you need to manage the connection string by yourself.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 8 or higher.\n\n- [Apache Maven](http://maven.apache.org/), version 3.2 or higher.\n\n- [cURL](https://curl.se/) or a similar HTTP utility to test functionality.\n\n- [Azure Cloud Shell](/azure/cloud-shell/quickstart) or [Azure CLI](/cli/azure/install-azure-cli) 2.37.0 or higher.\n\n- An Azure Event hub. If you don't have one, [create an event hub using Azure portal](/azure/event-hubs/event-hubs-create).\n\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web**, **Spring for Apache Kafka**, and **Cloud Stream** dependencies, then select Java version 8 or higher.\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this tutorial.\n\n### Prepare credentials\n\n#### [Passwordless (Recommended)](#tab/passwordless)\n\nAzure Event Hubs supports using Microsoft Entra ID to authorize requests to Event Hubs resources. With Microsoft Entra ID, you can use [Azure role-based access control (Azure RBAC)](/azure/role-based-access-control/overview) to grant permissions to a [security principal](/azure/active-directory/develop/app-objects-and-service-principals#service-principal-object), which may be a user or an application service principal.\n\nIf you want to run this sample locally with Microsoft Entra authentication, be sure your user account has authenticated via Azure Toolkit for IntelliJ, Visual Studio Code Azure Account plugin, or Azure CLI. Also, be sure the account has been granted sufficient permissions.\n\n> [!NOTE]\n> When using passwordless connections, you need to grant your account access to resources. In Azure Event Hubs, assign the `Azure Event Hubs Data Receiver` and `Azure Event Hubs Data Sender` role to the Microsoft Entra account you're currently using. For more information about granting access roles, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal) and [Authorize access to Event Hubs resources using Microsoft Entra ID](/azure/event-hubs/authorize-access-azure-active-directory).\n\n#### [Connection string](#tab/connection-string)\n\nTo get the connection string for the event hub namespace, see [Get an Event Hubs connection string](/azure/event-hubs/event-hubs-get-connection-string) or run the following command.\n\n```azurecli\naz eventhubs namespace authorization-rule keys list \\\n    --resource-group <your_resource_group_name> \\\n    --namespace-name <your_eventhubs-namespace_name> \\\n    --name RootManageSharedAccessKey \\\n    --query \"primaryConnectionString\" \\\n    --output tsv\n```\n\n---\n\n## Send and receive messages from Azure Event Hubs\n\nWith an Azure Event hub, you can send and receive messages using Spring Cloud Azure.\n\nTo install the Spring Cloud Azure Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Starter artifact:\n\n   ```xml\n   <dependency>\n     <groupId>com.azure.spring</groupId>\n     <artifactId>spring-cloud-azure-starter</artifactId>\n   </dependency>\n   ```\n\n## Code the application\n\nUse the following steps to configure your application to produce and consume messages using Azure Event Hubs.\n\n1. Configure the Event hub credentials by adding the following properties to your **application.properties** file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   spring.cloud.stream.kafka.binder.brokers=${AZ_EVENTHUBS_NAMESPACE_NAME}.servicebus.windows.net:9093\n   spring.cloud.function.definition=consume;supply\n   spring.cloud.stream.bindings.consume-in-0.destination=${AZ_EVENTHUB_NAME}\n   spring.cloud.stream.bindings.consume-in-0.group=$Default\n   spring.cloud.stream.bindings.supply-out-0.destination=${AZ_EVENTHUB_NAME}\n   ```\n\n   > [!TIP]\n   > If you're using version `spring-cloud-azure-dependencies:4.3.0`, then you should add the property `spring.cloud.stream.binders.<kafka-binder-name>.environment.spring.main.sources` with the value `com.azure.spring.cloud.autoconfigure.kafka.AzureKafkaSpringCloudStreamConfiguration`.\n   >\n   > Since `4.4.0`, this property will be added automatically, so there's no need to add it manually.\n\n   The following table describes the fields in the configuration:\n\n   | Field                                                   | Description                                                                                                                                                                                  |\n   |---------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n   | `spring.cloud.stream.kafka.binder.brokers`              | Specifies the Azure Event Hubs endpoint.                                                                                                                                                     |\n   | `spring.cloud.stream.bindings.consume-in-0.destination` | Specifies the input destination event hub, which for this tutorial is the hub you created earlier.                                                                                           |\n   | `spring.cloud.stream.bindings.consume-in-0.group `      | Specifies a Consumer Group from Azure Event Hubs, which you can set to `$Default` in order to use the basic consumer group that was created when you created your Azure Event Hubs instance. |\n   | `spring.cloud.stream.bindings.supply-out-0.destination` | Specifies the output destination event hub, which for this tutorial is the same as the input destination.                                                                                    |\n\n   #### [Connection string](#tab/connection-string)\n\n   ```properties\n   spring.cloud.azure.eventhubs.connection-string=${AZ_EVENTHUBS_CONNECTION_STRING}\n   spring.cloud.function.definition=consume;supply\n   spring.cloud.stream.bindings.consume-in-0.destination=${AZ_EVENTHUB_NAME}\n   spring.cloud.stream.bindings.consume-in-0.group=$Default\n   spring.cloud.stream.bindings.supply-out-0.destination=${AZ_EVENTHUB_NAME}\n   spring.cloud.stream.binders.kafka.environment.spring.main.sources=com.azure.spring.cloud.autoconfigure.implementation.eventhubs.kafka.AzureEventHubsKafkaAutoConfiguration\n   ```\n\n   > [!TIP]\n   > We recommend that you don't use connection strings to connect to Azure Event Hubs for Kafka in version 4.3.0 or higher. This functionality is being removed in the future, so you should consider using passwordless connections instead.\n   >\n   > If you're using Spring Cloud Azure version 4.x, update the `spring.cloud.stream.binders.kafka.environment.spring.main.sources` property value to `com.azure.spring.cloud.autoconfigure.eventhubs.kafka.AzureEventHubsKafkaAutoConfiguration`.\n\n   The following table describes the fields in the configuration:\n\n   | Field                                                   | Description                                                                                                                                                                                  |\n   |---------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n   | `spring.cloud.azure.eventhubs.connection-string`        | Specifies the connection string of your Azure Event Hubs namespace.                                                                                                                          |\n   | `spring.cloud.stream.bindings.consume-in-0.destination` | Specifies the input destination event hub, which for this tutorial is the hub you created earlier.                                                                                           |\n   | `spring.cloud.stream.bindings.consume-in-0.group `      | Specifies a Consumer Group from Azure Event Hubs, which you can set to `$Default` in order to use the basic consumer group that was created when you created your Azure Event Hubs instance. |\n   | `spring.cloud.stream.bindings.supply-out-0.destination` | Specifies the output destination event hub, which for this tutorial is the same as the input destination.                                                                                    |\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule. -->\n    ---\n\n   > [!NOTE]\n   > If you enable automatic topic creation, be sure to add the configuration item `spring.cloud.stream.kafka.binder.replicationFactor`, with the value set to at least `1`. For more information, see [Spring Cloud Stream Kafka Binder Reference Guide](https://docs.spring.io/spring-cloud-stream-binder-kafka/docs/3.1.2/reference/html/spring-cloud-stream-binder-kafka.html).\n\n1. Edit the startup class file to show the following content.\n\n   ```java\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.messaging.Message;\n   import org.springframework.messaging.support.GenericMessage;\n   import reactor.core.publisher.Flux;\n   import reactor.core.publisher.Sinks;\n   import java.util.function.Consumer;\n   import java.util.function.Supplier;\n\n   @SpringBootApplication\n   public class EventHubKafkaBinderApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(EventHubKafkaBinderApplication.class);\n\n       private static final Sinks.Many<Message<String>> many = Sinks.many().unicast().onBackpressureBuffer();\n\n       public static void main(String[] args) {\n           SpringApplication.run(EventHubKafkaBinderApplication.class, args);\n       }\n\n       @Bean\n       public Supplier<Flux<Message<String>>> supply() {\n           return ()->many.asFlux()\n                          .doOnNext(m->LOGGER.info(\"Manually sending message {}\", m))\n                          .doOnError(t->LOGGER.error(\"Error encountered\", t));\n       }\n\n       @Bean\n       public Consumer<Message<String>> consume() {\n           return message->LOGGER.info(\"New message received: '{}'\", message.getPayload());\n       }\n\n       @Override\n       public void run(String... args) {\n           many.emitNext(new GenericMessage<>(\"Hello World\"), Sinks.EmitFailureHandler.FAIL_FAST);\n       }\n\n   }\n   ```\n\n   [!INCLUDE [spring-default-azure-credential-overview.md](includes/spring-default-azure-credential-overview.md)]\n\n1. Start the application. Messages like the following example will be posted in your application log:\n\n   ```output\n   Kafka version: 3.0.1\n   Kafka commitId: 62abe01bee039651\n   Kafka startTimeMs: 1622616433956\n   New message received: 'Hello World'\n   ```\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Stream Binder Event Hubs Kafka Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/eventhubs)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-cloud-stream-binder-java-app-with-service-bus.md",
    "content": "---\ntitle: Spring Cloud Stream with Azure Service Bus\ndescription: This article demonstrates how to use Spring Cloud Stream Binder to send messages to and receive messages from Azure Service Bus.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Spring Cloud Stream with Azure Service Bus\n\nThis article demonstrates how to use the Spring Cloud Stream Binder to send messages to and receive messages from Service Bus `queues` and `topics`.\n\nAzure provides an asynchronous messaging platform called [Azure Service Bus](/azure/service-bus-messaging/service-bus-messaging-overview) (\"Service Bus\") that is based on the [Advanced Message Queueing Protocol 1.0](http://www.amqp.org/) (\"AMQP 1.0\") standard. Service Bus can be used across the range of supported Azure platforms.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 8 or higher.\n\n- [Apache Maven](http://maven.apache.org/), version 3.2 or higher.\n\n- [cURL](https://curl.se/) or a similar HTTP utility to test functionality.\n\n- A queue or topic for Azure Service Bus. If you don't have one, [create a Service Bus queue](/azure/service-bus-messaging/service-bus-quickstart-portal) or [create a Service Bus topic](/azure/service-bus-messaging/service-bus-quickstart-topics-subscriptions-portal).\n\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web** and **Azure Support** dependencies, then select Java version 8 or higher.\n\n> [!NOTE]\n> To grant your account access to your Azure Service Bus resources, assign the `Azure Service Bus Data Sender` and `Azure Service Bus Data Receiver` role to the Microsoft Entra account you're currently using. For more information about granting access roles, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal) and [Authenticate and authorize an application with Microsoft Entra ID to access Azure Service Bus entities](/azure/service-bus-messaging/authenticate-application).\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this article.\n\n## Send and receive messages from Azure Service Bus\n\nWith a queue or topic for Azure Service Bus, you can send and receive messages using Spring Cloud Azure Stream Binder Service Bus.\n\nTo install the Spring Cloud Azure Stream Binder Service Bus module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Stream Binder Service Bus artifact:\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-stream-binder-servicebus</artifactId>\n   </dependency>\n   ```\n\n### Code the application\n\nUse the following steps to configure your application to use a Service Bus queue or topic to send and receive messages.\n\n1. Configure the Service Bus credentials in the configuration file `application.properties`.\n\n   #### [Use a Service Bus queue](#tab/use-a-service-bus-queue)\n\n   ```properties\n    spring.cloud.azure.servicebus.namespace=${AZURE_SERVICEBUS_NAMESPACE}\n    spring.cloud.stream.bindings.consume-in-0.destination=${AZURE_SERVICEBUS_QUEUE_NAME}\n    spring.cloud.stream.bindings.supply-out-0.destination=${AZURE_SERVICEBUS_QUEUE_NAME}\n    spring.cloud.stream.servicebus.bindings.consume-in-0.consumer.auto-complete=false\n    spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type=queue\n    spring.cloud.function.definition=consume;supply;\n    spring.cloud.stream.poller.fixed-delay=60000 \n    spring.cloud.stream.poller.initial-delay=0\n   ```\n\n   The following table describes the fields in the configuration:\n\n   | Field                                                                         | Description                                                                                                                                                             |\n   |-------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n   | `spring.cloud.azure.servicebus.namespace`                                     | Specify the namespace you obtained in your Service Bus from the Azure portal.                                                                                           |\n   | `spring.cloud.stream.bindings.consume-in-0.destination`                       | Specify the Service Bus queue or Service Bus topic you used in this tutorial.                                                                                           |\n   | `spring.cloud.stream.bindings.supply-out-0.destination`                       | Specify the same value used for input destination.                                                                                                                      |\n   | `spring.cloud.stream.servicebus.bindings.consume-in-0.consumer.auto-complete` | Specify whether to settle messages automatically. If set as `false`, a message header of `Checkpointer` will be added to enable developers to settle messages manually. |\n   | `spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type`   | Specify the entity type for the output binding, can be `queue` or `topic`.                                                                                              |\n   | `spring.cloud.function.definition`                                            | Specify which functional bean to bind to the external destination(s) exposed by the bindings.                                                                           |\n   | `spring.cloud.stream.poller.fixed-delay`                                      | Specify fixed delay for default poller in milliseconds. The default value is `1000 L`. The recommended value is `60000`.                                                                                 |\n   | `spring.cloud.stream.poller.initial-delay`                                    | Specify initial delay for periodic triggers. The default value is `0`.                                                                                                  |\n\n   #### [Use a Service Bus topic](#tab/use-a-service-bus-topic)\n\n   ```properties\n    spring.cloud.azure.servicebus.namespace=${AZURE_SERVICEBUS_NAMESPACE}\n    spring.cloud.stream.bindings.consume-in-0.destination=${AZURE_SERVICEBUS_TOPIC_NAME}\n    spring.cloud.stream.bindings.consume-in-0.group=${AZURE_SERVICEBUS_TOPIC_SUBSCRIPTION_NAME}\n    spring.cloud.stream.bindings.supply-out-0.destination=${AZURE_SERVICEBUS_TOPIC_NAME}\n    spring.cloud.stream.servicebus.bindings.consume-in-0.consumer.auto-complete=false\n    spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type=topic\n    spring.cloud.function.definition=consume;supply;\n    spring.cloud.stream.poller.fixed-delay=60000 \n    spring.cloud.stream.poller.initial-delay=0\n   ```\n\n   The following table describes the fields in the configuration:\n\n   | Field                                                                         | Description                                                                                                                                                             |\n   |-------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n   | `spring.cloud.azure.servicebus.namespace`                                     | Specify the namespace you obtained in your Service Bus from the Azure portal.                                                                                           |\n   | `spring.cloud.stream.bindings.consume-in-0.destination`                       | Specify the Service Bus queue or Service Bus topic you used in this tutorial.                                                                                           |\n   | `spring.cloud.stream.bindings.consume-in-0.group`                             | If you used a Service Bus topic, specify the topic subscription.                                                                                                        |\n   | `spring.cloud.stream.bindings.supply-out-0.destination`                       | Specify the same value used for input destination.                                                                                                                      |\n   | `spring.cloud.stream.servicebus.bindings.consume-in-0.consumer.auto-complete` | Specify whether to settle messages automatically. If set as `false`, a message header of `Checkpointer` will be added to enable developers to settle messages manually. |\n   | `spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type`   | Specify the entity type for the output binding, can be `queue` or `topic`.                                                                                              |\n   | `spring.cloud.function.definition`                                            | Specify which functional bean to bind to the external destination(s) exposed by the bindings.                                                                           |\n   | `spring.cloud.stream.poller.fixed-delay`                                      | Specify fixed delay for default poller in milliseconds. The default value is `1000 L`. The recommended value is `60000`.                                                                                 |\n   | `spring.cloud.stream.poller.initial-delay`                                    | Specify initial delay for periodic triggers. The default value is `0`.                                                                                                  |\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule. -->\n    ---\n\n1. Edit the startup class file to show the following content.\n\n    ```java\n    import com.azure.spring.messaging.checkpoint.Checkpointer;\n    import org.slf4j.Logger;\n    import org.slf4j.LoggerFactory;\n    import org.springframework.boot.CommandLineRunner;\n    import org.springframework.boot.SpringApplication;\n    import org.springframework.boot.autoconfigure.SpringBootApplication;\n    import org.springframework.context.annotation.Bean;\n    import org.springframework.messaging.Message;\n    import org.springframework.messaging.support.MessageBuilder;\n    import reactor.core.publisher.Flux;\n    import reactor.core.publisher.Sinks;\n    import java.util.function.Consumer;\n    import java.util.function.Supplier;\n    import static com.azure.spring.messaging.AzureHeaders.CHECKPOINTER;\n    \n    @SpringBootApplication\n    public class ServiceBusQueueBinderApplication implements CommandLineRunner {\n    \n        private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBusQueueBinderApplication.class);\n        private static final Sinks.Many<Message<String>> many = Sinks.many().unicast().onBackpressureBuffer();\n    \n        public static void main(String[] args) {\n            SpringApplication.run(ServiceBusQueueBinderApplication.class, args);\n        }\n    \n        @Bean\n        public Supplier<Flux<Message<String>>> supply() {\n            return ()->many.asFlux()\n                           .doOnNext(m->LOGGER.info(\"Manually sending message {}\", m))\n                           .doOnError(t->LOGGER.error(\"Error encountered\", t));\n        }\n    \n        @Bean\n        public Consumer<Message<String>> consume() {\n            return message->{\n                Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n                LOGGER.info(\"New message received: '{}'\", message.getPayload());\n                checkpointer.success()\n                            .doOnSuccess(s->LOGGER.info(\"Message '{}' successfully checkpointed\", message.getPayload()))\n                            .doOnError(e->LOGGER.error(\"Error found\", e))\n                            .block();\n            };\n        }\n    \n        @Override\n        public void run(String... args) {\n            LOGGER.info(\"Going to add message {} to Sinks.Many.\", \"Hello World\");\n            many.emitNext(MessageBuilder.withPayload(\"Hello World\").build(), Sinks.EmitFailureHandler.FAIL_FAST);\n        }\n    \n    }\n    ```\n\n   [!INCLUDE [spring-default-azure-credential-overview.md](includes/spring-default-azure-credential-overview.md)]\n\n1. Start the application. Messages like the following example will be posted in your application log:\n\n   ```output\n   New message received: 'Hello World'\n   Message 'Hello World' successfully checkpointed\n   ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Stream Binder Service Bus Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-apache-cassandra-with-cosmos-db.md",
    "content": "---\ntitle: How to use Spring Data with Azure Cosmos DB for Apache Cassandra\ndescription: Learn how to use Spring Data with Azure Cosmos DB for Apache Cassandra.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiada\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# How to use Spring Data with Azure Cosmos DB for Apache Cassandra\n\nThis article demonstrates creating a sample application that uses [Spring Data] to store and retrieve information using [Azure Cosmos DB for Apache Cassandra](/azure/cosmos-db/cassandra-introduction).\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- A [Git](https://git-scm.com/downloads) client.\n\n- [cURL](https://curl.se/) or a similar HTTP utility to test functionality.\n\n## Create an Azure Cosmos DB account\n\nThe following procedure creates and configures an Azure Cosmos DB account in the Azure portal.\n\n### Create an Azure Cosmos DB account using the Azure portal\n\n> [!NOTE]\n> You can read more detailed information about creating accounts in the [Azure Cosmos DB documentation](/azure/cosmos-db/).\n\n1. Browse to the Azure portal at <https://portal.azure.com/> and sign in.\n\n1. Select **Create a resource**, then **Get started**, and then select **Azure Cosmos DB**.\n\n1. On the **Select API option** screen, select **Cassandra**.\n\n   ![Azure portal, create a resource, select API option, Cassandra selected.][COSMOSDB02]\n\n1. Specify the following information:\n\n   - **Subscription**: Specify your Azure subscription to use.\n   - **Resource group**: Specify whether to create a new resource group, or choose an existing resource group.\n   - **Account name**: Choose a unique name for your Azure Cosmos DB account; this name will be used to create a fully qualified domain name like `wingtiptoyscassandra.documents.azure.com`.\n   - **API**: Specify **Cassandra** for this tutorial.\n   - **Location**: Specify the closest geographic region for your database.\n\n   >[!div class=\"mx-imgBorder\"]\n   >![Specify your Azure Cosmos DB account settings.][COSMOSDB03]\n\n1. When you've entered all of the above information, click **Review + create**.\n\n1. If everything looks correct on the review page, click **Create**.\n\nIt takes a few minutes to deploy the database.\n\n### Add a keyspace to your Azure Cosmos DB account\n\n1. Browse to the Azure portal at <https://portal.azure.com/> and sign in.\n\n1. Select **All Resources**, then select the Azure Cosmos DB account you created.\n\n1. Select **Data Explorer**, select down arrow and select **New Keyspace**. Enter a unique identifier for your **Keyspace id**, then select **OK**.\n\n   >[!div class=\"mx-imgBorder\"]\n   >![Select new keyspace.][COSMOSDB05]\n\n   >[!div class=\"mx-imgBorder\"]\n   >![Create an Azure Cosmos DB keyspace.][COSMOSDB05-1]\n\n### Retrieve the connection settings for your Azure Cosmos DB account\n\n1. Browse to the Azure portal at <https://portal.azure.com/> and sign in.\n\n1. Select **All Resources**, then select the Azure Cosmos DB account you created.\n\n1. Select **Connection strings**, and copy the values for the **Contact Point**, **Port**, **Username**, and **Primary Password** fields; you'll use those values to configure your application later.\n\n   >[!div class=\"mx-imgBorder\"]\n   >![Retrieve your Azure Cosmos DB connection settings.][COSMOSDB06]\n\n## Configure the sample application\n\nThe following procedure configures the test application.\n\n1. Open a command shell and clone the sample project using a git command like the following example:\n\n   ```shell\n   git clone https://github.com/Azure-Samples/spring-data-cassandra-on-azure.git\n   ```\n\n1. Locate the **application.properties** file in the **resources** directory of the sample project, or create the file if it doesn't already exist.\n\n1. Open the **application.properties** file in a text editor, and add or configure the following lines in the file, and replace the sample values with the appropriate values from earlier:\n\n   ```yaml\n   spring.data.cassandra.contact-points=wingtiptoyscassandra.cassandra.cosmos.azure.com\n   spring.data.cassandra.port=10350\n   spring.data.cassandra.username=wingtiptoyscassandra\n   spring.data.cassandra.password=********\n   ```\n\n   Where:\n\n   | Parameter | Description |\n   |---|---|\n   | `spring.data.cassandra.contact-points` | Specifies the **Contact Point** from earlier in this article. |\n   | `spring.data.cassandra.port` | Specifies the **Port** from earlier in this article. |\n   | `spring.data.cassandra.username` | Specifies your **Username** from earlier in this article. |\n   | `spring.data.cassandra.password` | Specifies your **Primary Password** from earlier in this article. |\n\n1. Save and close the **application.properties** file.\n\n## Package and test the sample application\n\nBrowse to the directory that contains the **pom.xml** file to build and test the application.\n\n1. Build the sample application with Maven; for example:\n\n   ```shell\n   mvn clean package\n   ```\n\n1. Start the sample application; for example:\n\n   ```shell\n   java -jar target/spring-data-cassandra-on-azure-0.1.0-SNAPSHOT.jar\n   ```\n\n1. Create new records using `curl` from a command prompt like the following examples:\n\n   ```shell\n   curl -s -d \"{\\\"name\\\":\\\"dog\\\",\\\"species\\\":\\\"canine\\\"}\" -H \"Content-Type: application/json\" -X POST http://localhost:8080/pets\n\n   curl -s -d \"{\\\"name\\\":\\\"cat\\\",\\\"species\\\":\\\"feline\\\"}\" -H \"Content-Type: application/json\" -X POST http://localhost:8080/pets\n   ```\n\n   Your application should return values like the following example:\n\n   ```shell\n   Added Pet{id=60fa8cb0-0423-11e9-9a70-39311962166b, name='dog', species='canine'}.\n\n   Added Pet{id=72c1c9e0-0423-11e9-9a70-39311962166b, name='cat', species='feline'}.\n   ```\n\n1. Retrieve all of the existing records using `curl` from a command prompt like the following examples:\n\n   ```shell\n   curl -s http://localhost:8080/pets\n   ```\n\n   Your application should return values like the following examples:\n\n   ```json\n   [{\"id\":\"60fa8cb0-0423-11e9-9a70-39311962166b\",\"name\":\"dog\",\"species\":\"canine\"},{\"id\":\"72c1c9e0-0423-11e9-9a70-39311962166b\",\"name\":\"cat\",\"species\":\"feline\"}]\n   ```\n\n## Summary\n\nIn this tutorial, you created a sample Java application that uses Spring Data to store and retrieve information using Azure Cosmos DB for Apache Cassandra.\n\n## Clean up resources\n\nWhen no longer needed, use the [Azure portal](https://portal.azure.com/) to delete the resources created in this article to avoid unexpected charges.\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Spring on Azure](./index.yml)\n\n### See also\n\nFor more information about using Azure with Java, see the [Azure for Java Developers] and the [Working with Azure DevOps and Java].\n\n<!-- URL List -->\n\n[Azure for Java Developers]: ../index.yml\n[free Azure account]: https://azure.microsoft.com/pricing/free-trial/\n[Working with Azure DevOps and Java]: /azure/devops/\n[MSDN subscriber benefits]: https://azure.microsoft.com/pricing/member-offers/msdn-benefits-details/\n[Spring Boot]: http://projects.spring.io/spring-boot/\n[Spring Data]: https://spring.io/projects/spring-data\n[Spring Initializr]: https://start.spring.io/\n[Spring Framework]: https://spring.io/\n\n<!-- IMG List -->\n\n[COSMOSDB02]: media/configure-spring-data-apache-cassandra-with-cosmos-db/create-cosmos-db-02.png\n[COSMOSDB03]: media/configure-spring-data-apache-cassandra-with-cosmos-db/create-cosmos-db-03.png\n[COSMOSDB05]: media/configure-spring-data-apache-cassandra-with-cosmos-db/create-cosmos-db-05.png\n[COSMOSDB05-1]: media/configure-spring-data-apache-cassandra-with-cosmos-db/create-cosmos-db-05-1.png\n[COSMOSDB06]: media/configure-spring-data-apache-cassandra-with-cosmos-db/create-cosmos-db-06.png\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-jdbc-with-azure-mysql.md",
    "content": "---\ntitle: Use Spring Data JDBC with Azure Database for MySQL\ndescription: Learn how to use Spring Data JDBC with an Azure Database for MySQL database.\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli, team=cloud_advocates, passwordless-java, spring-cloud-azure, devx-track-extended-java\nzone_pivot_group_filename: java/java-zone-pivot-groups.json\nzone_pivot_groups: passwordless-mysql\n---\n\n# Use Spring Data JDBC with Azure Database for MySQL\n\nThis tutorial demonstrates how to store data in [Azure Database for MySQL](/azure/mysql/) database using [Spring Data JDBC](https://spring.io/projects/spring-data-jdbc).\n\n[JDBC](https://jcp.org/en/jsr/detail?id=221) is the standard Java API to connect to traditional relational databases.\n\nIn this tutorial, we include two authentication methods: Microsoft Entra authentication and MySQL authentication. The **Passwordless** tab shows the Microsoft Entra authentication and the **Password** tab shows the MySQL authentication.\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Database for MySQL using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nMySQL authentication uses accounts stored in MySQL. If you choose to use passwords as credentials for the accounts, these credentials will be stored in the `user` table. Because these passwords are stored in MySQL, you need to manage the rotation of the passwords by yourself.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- [MySQL command line client](https://dev.mysql.com/downloads/).\n\n- If you don't have a Spring Boot application, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web**, **Spring Data JDBC**, and **MySQL Driver** dependencies, and then select Java version 8 or higher.\n\n::: zone pivot=\"mysql-passwordless-flexible-server\"\n\n- If you don't have one, create an Azure Database for MySQL Flexible Server instance named `mysqlflexibletest`. For instructions, see [Quickstart: Use the Azure portal to create an Azure Database for MySQL Flexible Server](/azure/mysql/flexible-server/quickstart-create-server-portal). Then, create a database named `demo`. For instructions, see [Create and manage databases for Azure Database for MySQL Flexible Server](/azure/mysql/flexible-server/how-to-create-manage-databases).\n\n## See the sample application\n\nIn this tutorial, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql](https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql).\n\n[!INCLUDE [spring-data-azure-mysql-flexible-server-setup.md](includes/spring-data-azure-mysql-flexible-server-setup.md)]\n\n### Configure Spring Boot to use Azure Database for MySQL\n\nTo store data from Azure Database for MySQL using Spring Data JDBC, follow these steps to configure the application:\n\n1. Configure Azure Database for MySQL credentials by adding the following properties to your **application.properties** configuration file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   logging.level.org.springframework.jdbc.core=DEBUG\n\n   spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC\n   spring.datasource.username=<your_mysql_ad_non_admin_username>\n   spring.datasource.azure.passwordless-enabled=true\n\n   spring.sql.init.mode=always\n   ```\n\n   #### [Password](#tab/password)\n\n   ```properties\n   logging.level.org.springframework.jdbc.core=DEBUG\n\n   spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC\n   spring.datasource.username=<your_mysql_non_admin_username>\n   spring.datasource.password=<your_mysql_non_admin_password>\n\n   spring.sql.init.mode=always\n   ```\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule. -->\n    ---\n\n   > [!WARNING]\n   > The configuration property `spring.sql.init.mode=always` means that Spring Boot will automatically generate a database schema, using the **schema.sql** file that you'll create next, each time the server is started. This feature is great for testing, but remember that it will delete your data at each restart, so you shouldn't use it in production.\n   >\n   > The configuration property `spring.datasource.url` has `?serverTimezone=UTC` appended to tell the JDBC driver to use the UTC date format (or Coordinated Universal Time) when connecting to the database. Without this parameter, your Java server wouldn't use the same date format as the database, which would result in an error.\n\n::: zone-end\n\n::: zone pivot=\"mysql-passwordless-single-server\"\n\n- If you don't have one, create an Azure Database for MySQL Single server instance named `mysqlsingletest`. For instructions, see [Quickstart: Create an Azure Database for MySQL server by using the Azure portal](/azure/mysql/single-server/quickstart-create-mysql-server-database-using-azure-portal). Then, create a database named `demo`. For instructions, see the [Create a database](/azure/mysql/single-server/how-to-create-users#create-a-database) section of [Create users in Azure Database for MySQL](/azure/mysql/single-server/how-to-create-users).\n\n## See the sample application\n\nIn this article, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql](https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql).\n\n[!INCLUDE [spring-data-azure-mysql-single-server-setup.md](includes/spring-data-azure-mysql-single-server-setup.md)]\n\n### Configure Spring Boot to use Azure Database for MySQL\n\nTo store data from Azure Database for MySQL using Spring Data JDBC, follow these steps to configure the application:\n\n1. Configure Azure Database for MySQL credentials by adding the following properties to your **application.properties** configuration file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   logging.level.org.springframework.jdbc.core=DEBUG\n\n   spring.datasource.url=jdbc:mysql://mysqlsingletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC\n   spring.datasource.username=<your_mysql_ad_non_admin_username>@mysqlsingletest\n   spring.datasource.azure.passwordless-enabled=true\n\n   spring.sql.init.mode=always\n   ```\n\n   #### [Password](#tab/password)\n\n   ```properties\n   logging.level.org.springframework.jdbc.core=DEBUG\n\n   spring.datasource.url=jdbc:mysql://mysqlsingletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC\n   spring.datasource.username=<your_mysql_non_admin_username>@mysqlsingletest\n   spring.datasource.password=<your_mysql_non_admin_password>\n\n   spring.sql.init.mode=always\n   ```\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule, and the following note won't be properly indented. -->\n    ---\n\n   > [!WARNING]\n   > The configuration property `spring.sql.init.mode=always` means that Spring Boot will automatically generate a database schema, using the **schema.sql** file that you'll create next, each time the server is started. This feature is great for testing, but remember that it will delete your data at each restart, so you shouldn't use it in production.\n   >\n   > The configuration property `spring.datasource.url` has `?serverTimezone=UTC` appended to tell the JDBC driver to use the UTC date format (or Coordinated Universal Time) when connecting to the database. Without this parameter, your Java server wouldn't use the same date format as the database, which would result in an error.\n\n::: zone-end\n\n<!-- NOTE: The numbering must start with 2 here to continue the sequence after the previous step, otherwise the numbering will reset to 1. -->\n2. Create the **src/main/resources/schema.sql** configuration file to configure the database schema, then add the following contents.\n\n   ```sql\n   DROP TABLE IF EXISTS todo;\n   CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);\n   ```\n\n[!INCLUDE [spring-data-jdbc-create-application.md](includes/spring-data-jdbc-create-application.md)]\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure MySQL Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/mysql)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-jdbc-with-azure-postgresql.md",
    "content": "---\ntitle: Use Spring Data JDBC with Azure Database for PostgreSQL\ndescription: Learn how to use Spring Data JDBC with an Azure Database for PostgreSQL database.\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli, team=cloud_advocates, passwordless-java, spring-cloud-azure, devx-track-extended-java\nzone_pivot_group_filename: java/java-zone-pivot-groups.json\nzone_pivot_groups: passwordless-postgresql\n---\n\n# Use Spring Data JDBC with Azure Database for PostgreSQL\n\nThis tutorial demonstrates how to store data in an [Azure Database for PostgreSQL](/azure/postgresql/) database using [Spring Data JDBC](https://spring.io/projects/spring-data-jdbc).\n\n[JDBC](https://en.wikipedia.org/wiki/Java_Database_Connectivity) is the standard Java API to connect to traditional relational databases.\n\nIn this tutorial, we include two authentication methods: Microsoft Entra authentication and PostgreSQL authentication. The **Passwordless** tab shows the Microsoft Entra authentication and the **Password** tab shows the PostgreSQL authentication.\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Database for PostgreSQL using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nPostgreSQL authentication uses accounts stored in PostgreSQL. If you choose to use passwords as credentials for the accounts, these credentials will be stored in the `user` table. Because these passwords are stored in PostgreSQL, you need to manage the rotation of the passwords by yourself.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- [PostgreSQL command line client](https://www.postgresql.org/download/).\n\n- If you don't have a Spring Boot application, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web**, **Spring Data JDBC**, and **PostgreSQL Driver** dependencies, and then select Java version 8 or higher.\n\n::: zone pivot=\"postgresql-passwordless-flexible-server\"\n\n- If you don't have one, create an Azure Database for PostgreSQL Flexible Server instance named `postgresqlflexibletest` and a database named `demo`. For instructions, see [Quickstart: Create an Azure Database for PostgreSQL - Flexible Server in the Azure portal](/azure/postgresql/flexible-server/quickstart-create-server-portal).\n\n## See the sample application\n\nIn this tutorial, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-jdbc-postgresql](https://github.com/Azure-Samples/quickstart-spring-data-jdbc-postgresql).\n\n[!INCLUDE [spring-data-azure-postgresql-flexible-server-setup.md](includes/spring-data-azure-postgresql-flexible-server-setup.md)]\n\n### Configure Spring Boot to use Azure Database for PostgreSQL\n\nTo store data from Azure Database for PostgreSQL using Spring Data JDBC, follow these steps to configure the application:\n\n1. Configure Azure Database for PostgreSQL credentials by adding the following properties to your **application.properties** configuration file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   logging.level.org.springframework.jdbc.core=DEBUG\n\n   spring.datasource.url=jdbc:postgresql://postgresqlflexibletest.postgres.database.azure.com:5432/demo?sslmode=require\n   spring.datasource.username=<your_postgresql_ad_non_admin_username>\n   spring.datasource.azure.passwordless-enabled=true\n\n   spring.sql.init.mode=always\n   ```\n\n   #### [Password](#tab/password)\n\n   ```properties\n   logging.level.org.springframework.jdbc.core=DEBUG\n\n   spring.datasource.url=jdbc:postgresql://postgresqlflexibletest.postgres.database.azure.com:5432/demo?sslmode=require\n   spring.datasource.username=<your_postgresql_non_admin_username>\n   spring.datasource.password=<your_postgresql_non_admin_password>\n\n   spring.sql.init.mode=always\n   ```\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule, and the following note won't be properly indented. -->\n    ---\n\n   > [!WARNING]\n   > The configuration property `spring.sql.init.mode=always` means that Spring Boot will automatically generate a database schema, using the **schema.sql** file that you'll create next, each time the server is started. This feature is great for testing, but remember that it will delete your data at each restart, so you shouldn't use it in production.\n\n::: zone-end\n\n::: zone pivot=\"postgresql-passwordless-single-server\"\n\n- If you don't have one, create an Azure Database for PostgreSQL Single Server instance named `postgresqlsingletest` and a database named `demo`. For instructions, see [Quickstart: Create an Azure Database for PostgreSQL server by using the Azure portal](/azure/postgresql/single-server/quickstart-create-server-database-portal).\n\n## See the sample application\n\nIn this article, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-jdbc-postgresql](https://github.com/Azure-Samples/quickstart-spring-data-jdbc-postgresql).\n\n[!INCLUDE [spring-data-azure-postgresql-single-server-setup.md](includes/spring-data-azure-postgresql-single-server-setup.md)]\n\n### Configure Spring Boot to use Azure Database for PostgreSQL\n\nTo store data from Azure Database for PostgreSQL using Spring Data JDBC, follow these steps to configure the application:\n\n1. Configure Azure Database for PostgreSQL credentials by adding the following properties to your **application.properties** configuration file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   logging.level.org.springframework.jdbc.core=DEBUG\n\n   spring.datasource.url=jdbc:postgresql://postgresqlsingletest.postgres.database.azure.com:5432/demo?sslmode=require\n   spring.datasource.username=<your_postgresql_ad_non_admin_username>@postgresqlsingletest\n   spring.datasource.azure.passwordless-enabled=true\n\n   spring.sql.init.mode=always\n   ```\n\n   #### [Password](#tab/password)\n\n   ```properties\n   logging.level.org.springframework.jdbc.core=DEBUG\n\n   spring.datasource.url=jdbc:postgresql://postgresqlsingletest.postgres.database.azure.com:5432/demo?sslmode=require\n   spring.datasource.username=<your_postgresql_non_admin_username>@postgresqlsingletest\n   spring.datasource.password=<your_postgresql_non_admin_password>\n\n   spring.sql.init.mode=always\n   ```\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule, and the following note won't be properly indented. -->\n    ---\n\n   > [!WARNING]\n   > The configuration property `spring.sql.init.mode=always` means that Spring Boot will automatically generate a database schema, using the **schema.sql** file that you'll create next, each time the server is started. This feature is great for testing, but remember that it will delete your data at each restart, so you shouldn't use it in production.\n\n::: zone-end\n\n<!-- NOTE: The numbering must start with 2 here to continue the sequence after the previous step, otherwise the numbering will reset to 1. -->\n2. Create the **src/main/resources/schema.sql** configuration file to configure the database schema, then add the following contents.\n\n   ```sql\n   DROP TABLE IF EXISTS todo;\n   CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);\n   ```\n\n[!INCLUDE [spring-data-jdbc-create-application.md](includes/spring-data-jdbc-create-application.md)]\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure PostgreSQL Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/postgresql)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-jdbc-with-azure-sql-server.md",
    "content": "---\ntitle: Use Spring Data JDBC with Azure SQL Database\ndescription: Learn how to use Spring Data JDBC with an Azure SQL Database.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli, team=cloud_advocates, spring-cloud-azure, passwordless-java, devx-track-extended-java\n---\n\n# Use Spring Data JDBC with Azure SQL Database\n\nThis tutorial demonstrates how to store data in [Azure SQL Database](/azure/sql-database/) using [Spring Data JDBC](https://spring.io/projects/spring-data-jdbc).\n\n[JDBC](https://en.wikipedia.org/wiki/Java_Database_Connectivity) is the standard Java API to connect to traditional relational databases.\n\nIn this tutorial, we include two authentication methods: Microsoft Entra authentication and SQL Database authentication. The Passwordless tab shows the Microsoft Entra authentication and the Password tab shows the SQL Database authentication.\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Database for SQL Database using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nSQL Database authentication uses accounts stored in SQL Database. If you choose to use passwords as credentials for the accounts, these credentials will be stored in the user table. Because these passwords are stored in SQL Database, you need to manage the rotation of the passwords by yourself.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- [sqlcmd Utility](/sql/tools/sqlcmd/sqlcmd-utility).\n\n- [ODBC Driver](/sql/connect/odbc/download-odbc-driver-for-sql-server) 17 or 18.\n\n- If you don't have one, create an Azure SQL Server instance named `sqlservertest` and a database named `demo`. For instructions, see [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart).\n\n- If you don't have a Spring Boot application, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web**, **Spring Data JDBC**, and **MS SQL Server Driver** dependencies, and then select Java version 8 or higher.\n\n## See the sample application\n\nIn this tutorial, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-jdbc-sql-server](https://github.com/Azure-Samples/quickstart-spring-data-jdbc-sql-server).\n\n[!INCLUDE [spring-data-sql-server-setup.md](includes/spring-data-sql-server-setup.md)]\n\n## Store data from Azure SQL Database\n\nWith an Azure SQL Database instance, you can store data by using Spring Cloud Azure.\n\nTo install the Spring Cloud Azure Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Starter artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n  </dependency>\n  ```\n\n  > [!NOTE]\n  > As this is a dependency, it should be added in the `<dependencies>` section of the **pom.xml**. Its version is not configured here, as it is managed by the BOM that we added previously.\n\n### Configure Spring Boot to use Azure SQL Database\n\nTo store data from Azure SQL Database using Spring Data JDBC, follow these steps to configure the application:\n\n1. Configure an Azure SQL Database credentials in the **application.properties** configuration file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   logging.level.org.springframework.jdbc.core=DEBUG\n\n   spring.datasource.url=jdbc:sqlserver://sqlservertest.database.windows.net:1433;databaseName=demo;authentication=DefaultAzureCredential;\n\n   spring.sql.init.mode=always\n   ```\n\n   #### [Password](#tab/password)\n\n   ```properties\n   logging.level.org.springframework.jdbc.core=DEBUG\n\n   spring.datasource.url=jdbc:sqlserver://sqlservertest.database.windows.net:1433;database=demo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;\n   spring.datasource.username=<your_sql_server_non_admin_username>@sqlservertest\n   spring.datasource.password=<your_sql_server_non_admin_password>\n\n   spring.sql.init.mode=always\n   ```\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule, and the following note won't be properly indented. -->\n    ---\n\n   > [!WARNING]\n   > The configuration property `spring.sql.init.mode=always` means that Spring Boot will automatically generate a database schema, using the **schema.sql** file that you'll create next, each time the server is started. This is great for testing, but remember that this will delete your data at each restart, so you shouldn't use it in production.\n\n<!-- NOTE: The numbering must start with 2 here to continue the sequence after the previous step, otherwise the numbering will reset to 1. -->\n2. Create the **src/main/resources/schema.sql** configuration file to configure the database schema, then add the following contents.\n\n   ```sql\n   DROP TABLE IF EXISTS todo;\n   CREATE TABLE todo (id INT IDENTITY PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BIT);\n   ```\n\n[!INCLUDE [spring-data-jdbc-create-application.md](includes/spring-data-jdbc-create-application.md)]\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-jpa-with-azure-mysql.md",
    "content": "---\ntitle: Use Spring Data JPA with Azure Database for MySQL\ndescription: Learn how to use Spring Data JPA with an Azure Database for MySQL database.\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli, team=cloud_advocates, passwordless-java, spring-cloud-azure, devx-track-extended-java\nzone_pivot_group_filename: java/java-zone-pivot-groups.json\nzone_pivot_groups: passwordless-mysql\n---\n\n# Use Spring Data JPA with Azure Database for MySQL\n\nThis tutorial demonstrates how to store data in [Azure Database for MySQL](/azure/mysql/) database using [Spring Data JPA](https://spring.io/projects/spring-data-jpa).\n\n[The Java Persistence API (JPA)](https://en.wikipedia.org/wiki/Java_Persistence_API) is the standard Java API for object-relational mapping.\n\nIn this tutorial, we include two authentication methods: Microsoft Entra authentication and MySQL authentication. The **Passwordless** tab shows the Microsoft Entra authentication and the **Password** tab shows the MySQL authentication.\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Database for MySQL using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nMySQL authentication uses accounts stored in MySQL. If you choose to use passwords as credentials for the accounts, these credentials will be stored in the `user` table. Because these passwords are stored in MySQL, you need to manage the rotation of the passwords by yourself.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- [MySQL command line client](https://dev.mysql.com/downloads/).\n\n- If you don't have a Spring Boot application, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web**, **Spring Data JPA**, and **MySQL Driver** dependencies, and then select Java version 8 or higher.\n\n::: zone pivot=\"mysql-passwordless-flexible-server\"\n\n- If you don't have one, create an Azure Database for MySQL Flexible Server instance named `mysqlflexibletest`. For instructions, see [Quickstart: Use the Azure portal to create an Azure Database for MySQL Flexible Server](/azure/mysql/flexible-server/quickstart-create-server-portal). Then, create a database named `demo`. For instructions, see [Create and manage databases for Azure Database for MySQL Flexible Server](/azure/mysql/flexible-server/how-to-create-manage-databases).\n\n> [!IMPORTANT]\n> To use passwordless connections, create a Microsoft Entra admin user for your Azure Database for MySQL instance. For instructions, see the [Configure the Microsoft Entra Admin](/azure/mysql/flexible-server/how-to-azure-ad#configure-the-azure-ad-admin) section of [Set up Microsoft Entra authentication for Azure Database for MySQL - Flexible Server](/azure/mysql/flexible-server/how-to-azure-ad).\n\n## See the sample application\n\nIn this tutorial, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql](https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql).\n\n[!INCLUDE [spring-data-azure-mysql-flexible-server-setup.md](includes/spring-data-azure-mysql-flexible-server-setup.md)]\n\n### Configure Spring Boot to use Azure Database for MySQL\n\nTo store data from Azure Database for MySQL using Spring Data JPA, follow these steps to configure the application:\n\n1. Configure Azure Database for MySQL credentials by adding the following properties to your **application.properties** configuration file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.datasource.azure.passwordless-enabled=true\n   spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC\n   spring.datasource.username=<your_mysql_ad_non_admin_username>\n\n   spring.jpa.hibernate.ddl-auto=create-drop\n   spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect\n   ```\n\n   #### [Password](#tab/password)\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC\n   spring.datasource.username=<your_mysql_non_admin_username>\n   spring.datasource.password=<your_mysql_non_admin_password>\n\n   spring.jpa.hibernate.ddl-auto=create-drop\n   spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect\n   ```\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule. -->\n    ---\n\n   > [!WARNING]\n   > The configuration property `spring.datasource.url` has `?serverTimezone=UTC` appended to tell the JDBC driver to use the UTC date format (or Coordinated Universal Time) when connecting to the database. Without this parameter, your Java server wouldn't use the same date format as the database, which would result in an error.\n\n::: zone-end\n\n::: zone pivot=\"mysql-passwordless-single-server\"\n\n- If you don't have one, create an Azure Database for MySQL Single Server instance named `mysqlsingletest`. For instructions, see [Quickstart: Create an Azure Database for MySQL server by using the Azure portal](/azure/mysql/single-server/quickstart-create-mysql-server-database-using-azure-portal). Then, create a database named `demo`. For instructions, see the [Create a database](/azure/mysql/single-server/how-to-create-users#create-a-database) section of [Create users in Azure Database for MySQL](/azure/mysql/single-server/how-to-create-users).\n\n> [!IMPORTANT]\n> To use passwordless connections, create a Microsoft Entra admin user for your Azure Database for MySQL instance. For instructions, see the [Setting the Microsoft Entra Admin user](/azure/mysql/single-server/how-to-configure-sign-in-azure-ad-authentication#setting-the-azure-ad-admin-user) section of [Use Microsoft Entra ID for authentication with MySQL](/azure/mysql/single-server/how-to-configure-sign-in-azure-ad-authentication).\n\n## See the sample application\n\nIn this article, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql](https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql).\n\n[!INCLUDE [spring-data-azure-mysql-single-server-setup.md](includes/spring-data-azure-mysql-single-server-setup.md)]\n\n### Configure Spring Boot to use Azure Database for MySQL\n\nTo store data from Azure Database for MySQL using Spring Data JPA, follow these steps to configure the application:\n\n1. Configure Azure Database for MySQL credentials by adding the following properties to your **application.properties** configuration file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.datasource.azure.passwordless-enabled=true\n   spring.datasource.url=jdbc:mysql://mysqlsingletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC\n   spring.datasource.username=<your_mysql_ad_non_admin_username>@mysqlsingletest\n\n   spring.jpa.hibernate.ddl-auto=create-drop\n   spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect\n   ```\n\n   #### [Password](#tab/password)\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.datasource.url=jdbc:mysql://mysqlsingletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC\n   spring.datasource.username=<your_mysql_non_admin_username>@mysqlsingletest\n   spring.datasource.password=<your_mysql_non_admin_password>\n\n   spring.jpa.hibernate.ddl-auto=create-drop\n   spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect\n   ```\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule, and the following note won't be properly indented. -->\n    ---\n\n   > [!WARNING]\n   > The configuration property `spring.datasource.url` has `?serverTimezone=UTC` appended to tell the JDBC driver to use the UTC date format (or Coordinated Universal Time) when connecting to the database. Without this parameter, your Java server wouldn't use the same date format as the database, which would result in an error.\n\n::: zone-end\n\n[!INCLUDE [spring-data-jpa-create-application.md](includes/spring-data-jpa-create-application.md)]\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure MySQL Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/mysql)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-jpa-with-azure-postgresql.md",
    "content": "---\ntitle: Use Spring Data JPA with Azure Database for PostgreSQL\ndescription: Learn how to use Spring Data JPA with an Azure Database for PostgreSQL database.\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\nauthor: KarlErickson\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli, team=cloud_advocates, passwordless-java, spring-cloud-azure, devx-track-extended-java\nzone_pivot_group_filename: java/java-zone-pivot-groups.json\nzone_pivot_groups: passwordless-postgresql\n---\n\n# Use Spring Data JPA with Azure Database for PostgreSQL\n\nThis tutorial demonstrates how to store data in [Azure Database for PostgreSQL](/azure/postgresql/) using [Spring Data JPA](https://spring.io/projects/spring-data-jpa).\n\n[The Java Persistence API (JPA)](https://en.wikipedia.org/wiki/Java_Persistence_API) is the standard Java API for object-relational mapping.\n\nIn this tutorial, we include two authentication methods: Microsoft Entra authentication and PostgreSQL authentication. The **Passwordless** tab shows the Microsoft Entra authentication and the **Password** tab shows the PostgreSQL authentication.\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Database for PostgreSQL using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nPostgreSQL authentication uses accounts stored in PostgreSQL. If you choose to use passwords as credentials for the accounts, these credentials will be stored in the `user` table. Because these passwords are stored in PostgreSQL, you need to manage the rotation of the passwords by yourself.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- [PostgreSQL command line client](https://www.postgresql.org/download/).\n\n- If you don't have a Spring Boot application, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web**, **Spring Data JDBC**, and **PostgreSQL Driver** dependencies, and then select Java version 8 or higher.\n\n::: zone pivot=\"postgresql-passwordless-flexible-server\"\n\n- If you don't have one, create an Azure Database for PostgreSQL Flexible Server instance named `postgresqlflexibletest` and a database named `demo`. For instructions, see [Quickstart: Create an Azure Database for PostgreSQL - Flexible Server in the Azure portal](/azure/postgresql/flexible-server/quickstart-create-server-portal).\n\n> [!IMPORTANT]\n> To use passwordless connections, configure the Microsoft Entra admin user for your Azure Database for PostgreSQL Flexible Server instance. For more information, see [Manage Microsoft Entra roles in Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/how-to-manage-azure-ad-users).\n\n## See the sample application\n\nIn this tutorial, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-jpa-postgresql](https://github.com/Azure-Samples/quickstart-spring-data-jpa-postgresql).\n\n[!INCLUDE [spring-data-azure-postgresql-flexible-server-setup.md](includes/spring-data-azure-postgresql-flexible-server-setup.md)]\n\n### Configure Spring Boot to use Azure Database for PostgreSQL\n\nTo store data from Azure Database for PostgreSQL using Spring Data JPA, follow these steps to configure the application:\n\n1. Configure Azure Database for PostgreSQL credentials by adding the following properties to your **application.properties** configuration file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.datasource.url=jdbc:postgresql://postgresqlflexibletest.postgres.database.azure.com:5432/demo?sslmode=require\n   spring.datasource.username=<your_postgresql_ad_non_admin_username>\n   spring.datasource.azure.passwordless-enabled=true\n\n   spring.jpa.hibernate.ddl-auto=create-drop\n   spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect\n   ```\n\n   #### [Password](#tab/password)\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.datasource.url=jdbc:postgresql://postgresqlflexibletest.postgres.database.azure.com:5432/demo?sslmode=require\n   spring.datasource.username=<your_postgresql_non_admin_username>\n   spring.datasource.password=<your_postgresql_non_admin_password>\n\n   spring.jpa.hibernate.ddl-auto=create-drop\n   spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect\n   ```\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule. -->\n    ---\n\n::: zone-end\n\n::: zone pivot=\"postgresql-passwordless-single-server\"\n\n- If you don't have one, create an Azure Database for PostgreSQL Single Server instance named `postgresqlsingletest` and a database named `demo`. For instructions, see [Quickstart: Create an Azure Database for PostgreSQL server by using the Azure portal](/azure/postgresql/single-server/quickstart-create-server-database-portal).\n\n> [!IMPORTANT]\n> To use passwordless connections, configure the Microsoft Entra admin user for your Azure Database for PostgreSQL Single Server instance. For more information, see [Use Microsoft Entra ID for authentication with PostgreSQL](/azure/postgresql/single-server/how-to-configure-sign-in-azure-ad-authentication).\n\n## See the sample application\n\nIn this article, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-jpa-postgresql](https://github.com/Azure-Samples/quickstart-spring-data-jpa-postgresql).\n\n[!INCLUDE [spring-data-azure-postgresql-single-server-setup.md](includes/spring-data-azure-postgresql-single-server-setup.md)]\n\n### Configure Spring Boot to use Azure Database for PostgreSQL\n\nTo store data from Azure Database for PostgreSQL using Spring Data JPA, follow these steps to configure the application:\n\n1. Configure Azure Database for PostgreSQL credentials by adding the following properties to your **application.properties** configuration file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.datasource.url=jdbc:postgresql://postgresqlsingletest.postgres.database.azure.com:5432/demo?sslmode=require\n   spring.datasource.username=<your_postgresql_ad_non_admin_username>@postgresqlsingletest\n   spring.datasource.azure.passwordless-enabled=true\n\n   spring.jpa.hibernate.ddl-auto=create-drop\n   spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect\n   ```\n\n   #### [Password](#tab/password)\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.datasource.url=jdbc:postgresql://postgresqlsingletest.postgres.database.azure.com:5432/demo?sslmode=require\n   spring.datasource.username=<your_postgresql_non_admin_username>@postgresqlsingletest\n   spring.datasource.password=<your_postgresql_non_admin_password>\n\n   spring.jpa.hibernate.ddl-auto=create-drop\n   spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect\n   ```\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule. -->\n    ---\n\n::: zone-end\n\n[!INCLUDE [spring-data-jpa-create-application.md](includes/spring-data-jpa-create-application.md)]\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure PostgreSQL Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/postgresql)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-jpa-with-azure-sql-server.md",
    "content": "---\ntitle: Use Spring Data JPA with Azure SQL Database\ndescription: Learn how to use Spring Data JPA with an Azure SQL Database.\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\nauthor: KarlErickson\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli, team=cloud_advocates, spring-cloud-azure, passwordless-java, devx-track-extended-java\n---\n\n# Use Spring Data JPA with Azure SQL Database\n\nThis tutorial demonstrates how to store data in [Azure SQL Database](/azure/sql-database/) using [Spring Data JPA](https://spring.io/projects/spring-data-jpa).\n\n[The Java Persistence API (JPA)](https://en.wikipedia.org/wiki/Java_Persistence_API) is the standard Java API for object-relational mapping.\n\nIn this tutorial, we include two authentication methods: Microsoft Entra authentication and SQL Database authentication. The Passwordless tab shows the Microsoft Entra authentication and the Password tab shows the SQL Database authentication.\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Database for SQL Database using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nSQL Database authentication uses accounts stored in SQL Database. If you choose to use passwords as credentials for the accounts, these credentials will be stored in the user table. Because these passwords are stored in SQL Database, you need to manage the rotation of the passwords by yourself.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- [sqlcmd Utility](/sql/tools/sqlcmd/sqlcmd-utility)\n\n- [ODBC Driver](/sql/connect/odbc/download-odbc-driver-for-sql-server) 17 or 18.\n\n- If you don't have one, create an Azure SQL Server instance named `sqlservertest` and a database named `demo`. For instructions, see [Quickstart: Create a single database - Azure SQL Database](/azure/azure-sql/database/single-database-create-quickstart).\n\n- If you don't have a Spring Boot application, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web**, **Spring Data JPA**, and **MS SQL Server Driver** dependencies, and then select Java version 8 or higher.\n\n> [!IMPORTANT]\n> To use passwordless connections, upgrade [MS SQL Server Driver](https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc) to version `12.1.0` or higher, and then create a Microsoft Entra admin user for your Azure SQL Database server instance. For more information, see the [Create a Microsoft Entra admin](/azure/azure-sql/database/secure-database-tutorial#create-an-azure-ad-admin) section of [Tutorial: Secure a database in Azure SQL Database](/azure/azure-sql/database/secure-database-tutorial).\n\n## See the sample application\n\nIn this tutorial, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-jpa-sql-server](https://github.com/Azure-Samples/quickstart-spring-data-jpa-sql-server).\n\n[!INCLUDE [spring-data-sql-server-setup.md](includes/spring-data-sql-server-setup.md)]\n\n## Store data from Azure SQL Database\n\nWith an Azure SQL Database instance, you can store data by using Spring Cloud Azure.\n\nTo install the Spring Cloud Azure Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Starter artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n  </dependency>\n  ```\n  \n  > [!NOTE]\n  > As this is a dependency, it should be added in the `<dependencies>` section of the **pom.xml**. Its version is not configured here, as it is managed by the BOM that we added previously.\n\n### Configure Spring Boot to use Azure SQL Database\n\nTo store data from Azure SQL Database using Spring Data JPA, follow these steps to configure the application:\n\n1. Configure an Azure SQL Database credentials in the **application.properties** configuration file.\n\n   #### [Passwordless (Recommended)](#tab/passwordless)\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.datasource.url=jdbc:sqlserver://sqlservertest.database.windows.net:1433;databaseName=demo;authentication=DefaultAzureCredential;\n\n   spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2016Dialect\n   spring.jpa.hibernate.ddl-auto=create-drop\n   ```\n\n   #### [Password](#tab/password)\n\n   ```properties\n   logging.level.org.hibernate.SQL=DEBUG\n\n   spring.datasource.url=jdbc:sqlserver://sqlservertest.database.windows.net:1433;database=demo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;\n   spring.datasource.username=<your_sql_server_non_admin_username>\n   spring.datasource.password=<your_sql_server_non_admin_password>\n\n   spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2016Dialect\n   spring.jpa.hibernate.ddl-auto=create-drop\n   ```\n\n    <!-- NOTE: The tab-block end-delimiter here (the \"---\") needs a 4-space indentation or it will be rendered as a hard rule, and the following note won't be properly indented. -->\n    ---\n\n   > [!WARNING]\n   > The configuration property `spring.jpa.hibernate.ddl-auto=create-drop` means that Spring Boot will automatically create a database schema at application start-up, and will try to delete it when it shuts down. This feature is great for testing, but remember that it will delete your data at each restart, so you shouldn't use it in production.\n\n[!INCLUDE [spring-data-jpa-create-application.md](includes/spring-data-jpa-create-application.md)]\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-mongodb-with-cosmos-db.md",
    "content": "---\ntitle: Use Spring Data with Azure Cosmos DB for MongoDB API\ndescription: Learn how to use Spring Data MongoDB API with Azure Cosmos DB.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Use Spring Data with Azure Cosmos DB for MongoDB API\n\nThis article demonstrates creating a sample application that uses [Spring Data] to store and retrieve information using [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb-introduction).\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- A [Git](https://git-scm.com/downloads) client.\n\n## Create an Azure Cosmos DB account\n\n### Create an Azure Cosmos DB account using the Azure portal\n\n> [!NOTE]\n> You can read more detailed information about creating accounts in the [Azure Cosmos DB documentation](/azure/cosmos-db/).\n\n1. Browse to the Azure portal at <https://portal.azure.com/> and sign in.\n\n1. Select **Create a resource**, then **Databases**, then **Azure Cosmos DB**.\n\n1. On the **Select API option** screen, select **Azure Cosmos DB for MongoDB**.\n\n   ![Azure portal, create a resource, select API option, Azure Cosmos DB for MongoDB selected.][COSMOSDB02]\n\n1. Specify the following information:\n\n   - **Subscription**: Specify your Azure subscription to use.\n   - **Resource group**: Specify whether to create a new resource group, or choose an existing resource group.\n   - **Account name**: Choose a unique name for your Azure Cosmos DB account; this will be used to create a fully-qualified domain name like `wingtiptoysmongodb.documents.azure.com`.\n   - **API**: Specify `Azure Cosmos DB for MongoDB API` for this tutorial.\n   - **Location**: Specify the closest geographic region for your database.\n\n1. When you've entered all of the above information, click **Review + create**.\n\n1. If everything looks correct on the review page, click **Create**.\n\n   ![Review your Azure Cosmos DB account settings.][COSMOSDB03]\n\n### Retrieve the connection string for your Azure Cosmos DB account\n\n1. Browse to the Azure portal at <https://portal.azure.com/> and sign in.\n\n1. Click **All Resources**, then click the Azure Cosmos DB account you just created.\n\n1. Click **Connection strings**, and copy the value for the **Primary Connection String** field; you'll use that value to configure your application later.\n\n   ![Retrieve your Azure Cosmos DB connection string.][COSMOSDB06]\n\n## Configure the sample application\n\n1. Open a command shell and clone the sample project using a git command like the following example:\n\n   ```shell\n   git clone https://github.com/spring-guides/gs-accessing-data-mongodb.git\n   ```\n\n1. Create a **resources** directory in the **&lt;project root&gt;/complete/src/main** directory of the sample project, and create an **application.properties** file in the **resources** directory.\n\n1. Open the **application.properties** file in a text editor, and add the following lines in the file, and replace the sample values with the appropriate values from earlier:\n\n   ```yaml\n   spring.data.mongodb.database=wingtiptoysmongodb\n   spring.data.mongodb.uri=mongodb://wingtiptoysmongodb:AbCdEfGhIjKlMnOpQrStUvWxYz==@wingtiptoysmongodb.documents.azure.com:10255/?ssl=true&replicaSet=globaldb\n   ```\n\n   Where:\n\n   | Parameter | Description |\n   |---|---|\n   | `spring.data.mongodb.database` | Specifies the name of your Azure Cosmos DB account from earlier in this article. |\n   | `spring.data.mongodb.uri` | Specifies the **Primary Connection String** from earlier in this article. |\n\n1. Save and close the **application.properties** file.\n\n## Package and test the sample application\n\nTo build the application, browse to the directory **/gs-accessing-data-mongodb/complete**, which contains the **pom.xml** file.\n\n1. Build the sample application with Maven, and configure Maven to skip tests; for example:\n\n   ```shell\n   mvn clean package -DskipTests\n   ```\n\n1. Start the sample application; for example:\n\n   ```shell\n   \n   java -jar target/accessing-data-mongodb-complete-0.0.1-SNAPSHOT.jar\n   ```\n\n   Your application should return values like the following:\n\n   ```\n   Customers found with findAll():\n   -------------------------------\n   Customer[id=5c1b4ae4d0b5080ac105cc13, firstName='Alice', lastName='Smith']\n   Customer[id=5c1b4ae4d0b5080ac105cc14, firstName='Bob', lastName='Smith']\n   \n   Customer found with findByFirstName('Alice'):\n   --------------------------------\n   Customer[id=5c1b4ae4d0b5080ac105cc13, firstName='Alice', lastName='Smith']\n   Customers found with findByLastName('Smith'):\n   --------------------------------\n   Customer[id=5c1b4ae4d0b5080ac105cc13, firstName='Alice', lastName='Smith']\n   Customer[id=5c1b4ae4d0b5080ac105cc14, firstName='Bob', lastName='Smith']\n   ```\n\n## Summary\n\nIn this tutorial, you created a sample Java application that uses Spring Data to store and retrieve information using Azure Cosmos DB for MongoDB.\n\n## Clean up resources\n\nWhen no longer needed, use the [Azure portal](https://portal.azure.com/) to delete the resources created in this article to avoid unexpected charges.\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Spring on Azure](./index.yml)\n\n### See also\n\nFor more information about using Azure with Java, see the [Azure for Java Developers] and the [Working with Azure DevOps and Java].\n\n<!-- URL List -->\n\n[Azure for Java Developers]: ../index.yml\n[free Azure account]: https://azure.microsoft.com/pricing/free-trial/\n[Working with Azure DevOps and Java]: /azure/devops/\n[MSDN subscriber benefits]: https://azure.microsoft.com/pricing/member-offers/msdn-benefits-details/\n[Spring Boot]: http://projects.spring.io/spring-boot/\n[Spring Data]: https://spring.io/projects/spring-data\n[Spring Framework]: https://spring.io/\n\n<!-- IMG List -->\n\n[COSMOSDB02]: media/configure-spring-data-mongodb-with-cosmos-db/create-cosmos-db-02.png\n[COSMOSDB03]: media/configure-spring-data-mongodb-with-cosmos-db/create-cosmos-db-03.png\n[COSMOSDB04]: media/configure-spring-data-mongodb-with-cosmos-db/create-cosmos-db-04.png\n[COSMOSDB06]: media/configure-spring-data-mongodb-with-cosmos-db/create-cosmos-db-06.png\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-r2dbc-with-azure-mysql.md",
    "content": "---\ntitle: Use Spring Data R2DBC with Azure Database for MySQL\ndescription: Learn how to use Spring Data R2DBC with an Azure Database for MySQL database.\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nauthor: KarlErickson\nms.topic: how-to\nms.custom:\n  - devx-track-java\n  - devx-track-azurecli\n  - team=cloud_advocates\n  - spring-cloud-azure\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Use Spring Data R2DBC with Azure Database for MySQL\n\nThis article demonstrates creating a sample application that uses [Spring Data R2DBC](https://spring.io/projects/spring-data-r2dbc) to store and retrieve information in [Azure Database for MySQL](/azure/mysql/) by using the R2DBC implementation for MySQL from the [r2dbc-mysql GitHub repository](https://github.com/asyncer-io/r2dbc-mysql).\n\n[R2DBC](https://r2dbc.io/) brings reactive APIs to traditional relational databases. You can use it with Spring WebFlux to create fully reactive Spring Boot applications that use non-blocking APIs. It provides better scalability than the classic \"one thread per connection\" approach.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- [MySQL command line client](https://dev.mysql.com/downloads/).\n\n- [cURL](https://curl.se/) or a similar HTTP utility to test functionality.\n\n## See the sample application\n\nIn this article, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-r2dbc-mysql](https://github.com/Azure-Samples/quickstart-spring-data-r2dbc-mysql).\n\n## Prepare the working environment\n\nFirst, set up some environment variables by running the following commands:\n\n```bash\nexport AZ_RESOURCE_GROUP=database-workshop\nexport AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>\nexport AZ_LOCATION=<YOUR_AZURE_REGION>\nexport AZ_MYSQL_ADMIN_USERNAME=spring\nexport AZ_MYSQL_ADMIN_PASSWORD=<YOUR_MYSQL_ADMIN_PASSWORD>\nexport AZ_MYSQL_NON_ADMIN_USERNAME=spring-non-admin\nexport AZ_MYSQL_NON_ADMIN_PASSWORD=<YOUR_MYSQL_NON_ADMIN_PASSWORD>\n```\n\nReplace the placeholders with the following values, which are used throughout this article:\n\n- `<YOUR_DATABASE_NAME>`: The name of your MySQL server, which should be unique across Azure.\n- `<YOUR_AZURE_REGION>`: The Azure region you'll use. You can use `eastus` by default, but we recommend that you configure a region closer to where you live. You can see the full list of available regions by using `az account list-locations`.\n- `<YOUR_MYSQL_ADMIN_PASSWORD>` and `<YOUR_MYSQL_NON_ADMIN_PASSWORD>`: The password of your MySQL database server, which should have a minimum of eight characters. The characters should be from three of the following categories: English uppercase letters, English lowercase letters, numbers (0-9), and non-alphanumeric characters (!, $, #, %, and so on).\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\nNext, create a resource group:\n\n```azurecli\naz group create \\\n    --name $AZ_RESOURCE_GROUP \\\n    --location $AZ_LOCATION \\\n    --output tsv\n```\n\n## Create an Azure Database for MySQL instance and set up the admin user\n\nThe first thing you'll create is a managed MySQL server with an admin user.\n\n> [!NOTE]\n> You can read more detailed information about creating MySQL servers in [Create an Azure Database for MySQL server by using the Azure portal](/azure/mysql/quickstart-create-mysql-server-database-using-azure-portal).\n\n```azurecli\naz mysql flexible-server create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_NAME \\\n    --location $AZ_LOCATION \\\n    --admin-user $AZ_MYSQL_ADMIN_USERNAME \\\n    --admin-password $AZ_MYSQL_ADMIN_PASSWORD \\\n    --yes \\\n    --output tsv\n```\n\n## Configure a MySQL database\n\nCreate a new database called `demo` by using the following command:\n\n```azurecli\naz mysql flexible-server db create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --database-name demo \\\n    --server-name $AZ_DATABASE_NAME \\\n    --output tsv\n```\n\n## Configure a firewall rule for your MySQL server\n\nAzure Database for MySQL instances are secured by default. They have a firewall that doesn't allow any incoming connection.\n\nYou can skip this step if you're using Bash because the `flexible-server create` command already detected your local IP address and set it on MySQL server.\n\nIf you're connecting to your MySQL server from Windows Subsystem for Linux (WSL) on a Windows computer, you need to add the WSL host ID to your firewall. Obtain the IP address of your host machine by running the following command in WSL:\n\n```bash\ncat /etc/resolv.conf\n```\n\nCopy the IP address following the term `nameserver`, then use the following command to set an environment variable for the WSL IP Address:\n\n```bash\nexport AZ_WSL_IP_ADDRESS=<the-copied-IP-address>\n```\n\nThen, use the following command to open the server's firewall to your WSL-based app:\n\n```azurecli\naz mysql flexible-server firewall-rule create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_NAME \\\n    --start-ip-address $AZ_WSL_IP_ADDRESS \\\n    --end-ip-address $AZ_WSL_IP_ADDRESS \\\n    --rule-name allowiprange \\\n    --output tsv\n```\n\n## Create a MySQL non-admin user and grant permission\n\nThis step will create a non-admin user and grant all permissions on the `demo` database to it.\n\n> [!NOTE]\n> You can read more detailed information about creating MySQL users in [Create users in Azure Database for MySQL](/azure/mysql/single-server/how-to-create-users).\n\nFirst, create a SQL script called **create_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\n```bash\ncat << EOF > create_user.sql\nCREATE USER '$AZ_MYSQL_NON_ADMIN_USERNAME'@'%' IDENTIFIED BY '$AZ_MYSQL_NON_ADMIN_PASSWORD';\nGRANT ALL PRIVILEGES ON demo.* TO '$AZ_MYSQL_NON_ADMIN_USERNAME'@'%';\nFLUSH PRIVILEGES;\nEOF\n```\n\nThen, use the following command to run the SQL script to create the non-admin user:\n\n```bash\nmysql -h $AZ_DATABASE_NAME.mysql.database.azure.com --user $AZ_MYSQL_ADMIN_USERNAME --enable-cleartext-plugin --password=$AZ_MYSQL_ADMIN_PASSWORD < create_user.sql\n```\n\nNow use the following command to remove the temporary SQL script file:\n\n```bash\nrm create_user.sql\n```\n\n[!INCLUDE [spring-data-create-reactive.md](includes/spring-data-create-reactive.md)]\n\n## Generate the application by using Spring Initializr\n\nGenerate the application on the command line by entering:\n\n```bash\ncurl https://start.spring.io/starter.tgz -d dependencies=webflux,data-r2dbc -d baseDir=azure-database-workshop -d bootVersion=2.7.11 -d javaVersion=17 | tar -xzvf -\n```\n\n## Add the reactive MySQL driver implementation\n\nOpen the generated project's **pom.xml** file to add the reactive MySQL driver from the [r2dbc-mysql repository on GitHub](https://github.com/asyncer-io/r2dbc-mysql).\n\nAfter the `spring-boot-starter-webflux` dependency, add the following snippet:\n\n```xml\n<dependency>\n  <groupId>io.asyncer</groupId>\n  <artifactId>r2dbc-mysql</artifactId>\n  <version>0.9.1</version>\n</dependency>\n```\n\n## Configure Spring Boot to use Azure Database for MySQL\n\nOpen the **src/main/resources/application.properties** file, and add:\n\n```properties\nlogging.level.org.springframework.data.r2dbc=DEBUG\n\nspring.r2dbc.url=r2dbc:pool:mysql://$AZ_DATABASE_NAME.mysql.database.azure.com:3306/demo?tlsVersion=TLSv1.2\nspring.r2dbc.username=spring-non-admin\nspring.r2dbc.password=$AZ_MYSQL_NON_ADMIN_PASSWORD\n```\n\nReplace the `$AZ_DATABASE_NAME` and `$AZ_MYSQL_NON_ADMIN_PASSWORD` variables with the values that you configured at the beginning of this article.\n\n> [!NOTE]\n> For better performance, the `spring.r2dbc.url` property is configured to use a connection pool using [r2dbc-pool](https://github.com/r2dbc/r2dbc-pool).\n\nYou should now be able to start your application by using the provided Maven wrapper:\n\n```bash\n./mvnw spring-boot:run\n```\n\nHere's a screenshot of the application running for the first time:\n\n:::image type=\"content\" source=\"media/configure-spring-data-r2dbc-with-azure-mysql/create-mysql-01.png\" alt-text=\"Screenshot of the running application.\" lightbox=\"media/configure-spring-data-r2dbc-with-azure-mysql/create-mysql-01.png\":::\n\n## Create the database schema\n\n[!INCLUDE [spring-data-r2dbc-create-schema.md](includes/spring-data-r2dbc-create-schema.md)]\n\n```sql\nDROP TABLE IF EXISTS todo;\nCREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);\n```\n\nStop the running application, and start it again. The application will now use the `demo` database that you created earlier, and create a `todo` table inside it.\n\n```bash\n./mvnw spring-boot:run\n```\n\nHere's a screenshot of the database table as it's being created:\n\n:::image type=\"content\" source=\"media/configure-spring-data-r2dbc-with-azure-mysql/create-mysql-02.png\" alt-text=\"Screenshot of the creation of the database table.\" lightbox=\"media/configure-spring-data-r2dbc-with-azure-mysql/create-mysql-02.png\":::\n\n## Code the application\n\nNext, add the Java code that will use R2DBC to store and retrieve data from your MySQL server.\n\n[!INCLUDE [spring-data-r2dbc-create-application.md](includes/spring-data-r2dbc-create-application.md)]\n\nHere's a screenshot of these cURL requests:\n\n:::image type=\"content\" source=\"media/configure-spring-data-r2dbc-with-azure-mysql/create-mysql-03.png\" alt-text=\"Screenshot of the cURL test.\" lightbox=\"media/configure-spring-data-r2dbc-with-azure-mysql/create-mysql-03.png\":::\n\nCongratulations! You've created a fully reactive Spring Boot application that uses R2DBC to store and retrieve data from Azure Database for MySQL.\n\n[!INCLUDE [spring-data-conclusion.md](includes/spring-data-conclusion.md)]\n\n## See also\n\nFor more information about Spring Data R2DBC, see Spring's [reference documentation](https://docs.spring.io/spring-data/r2dbc/docs/current-SNAPSHOT/reference/html/#reference).\n\nFor more information about using Azure with Java, see [Azure for Java developers](../index.yml) and [Working with Azure DevOps and Java](/azure/devops/).\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-r2dbc-with-azure-postgresql.md",
    "content": "---\ntitle: Use Spring Data R2DBC with Azure Database for PostgreSQL\ndescription: Learn how to use Spring Data R2DBC with an Azure Database for PostgreSQL database.\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nauthor: KarlErickson\nms.topic: how-to\nms.custom:\n  - devx-track-java\n  - devx-track-azurecli\n  - team=cloud_advocates\n  - spring-cloud-azure\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Use Spring Data R2DBC with Azure Database for PostgreSQL\n\nThis article demonstrates creating a sample application that uses [Spring Data R2DBC](https://spring.io/projects/spring-data-r2dbc) to store and retrieve information in an [Azure Database for PostgreSQL](/azure/postgresql/) database. The sample will use the R2DBC implementation for PostgreSQL from the [r2dbc-postgresql](https://github.com/pgjdbc/r2dbc-postgresql) repository on GitHub.\n\n[R2DBC](https://r2dbc.io/) brings reactive APIs to traditional relational databases. You can use it with Spring WebFlux to create fully reactive Spring Boot applications that use non-blocking APIs. It provides better scalability than the classic \"one thread per connection\" approach.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- [PostgreSQL command line client](https://www.postgresql.org/download/).\n\n- [cURL](https://curl.se/) or a similar HTTP utility to test functionality.\n\n## See the sample application\n\nIn this article, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-r2dbc-postgresql](https://github.com/Azure-Samples/quickstart-spring-data-r2dbc-postgresql).\n\n## Prepare the working environment\n\nFirst, set up some environment variables by running the following commands:\n\n```bash\nexport AZ_RESOURCE_GROUP=database-workshop\nexport AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>\nexport AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>\nexport AZ_LOCATION=<YOUR_AZURE_REGION>\nexport AZ_POSTGRESQL_ADMIN_USERNAME=spring\nexport AZ_POSTGRESQL_ADMIN_PASSWORD=<YOUR_POSTGRESQL_ADMIN_PASSWORD>\nexport AZ_POSTGRESQL_NON_ADMIN_USERNAME=nonspring\nexport AZ_POSTGRESQL_NON_ADMIN_PASSWORD=<YOUR_POSTGRESQL_NON_ADMIN_PASSWORD>\nexport AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>\n```\n\nReplace the placeholders with the following values, which are used throughout this article:\n\n- `<YOUR_DATABASE_SERVER_NAME>`: The name of your PostgreSQL server, which should be unique across Azure.\n- `<YOUR_DATABASE_NAME>`: The database name of the PostgreSQL server, which should be unique within Azure.\n- `<YOUR_AZURE_REGION>`: The Azure region you'll use. You can use `eastus` by default, but we recommend that you configure a region closer to where you live. You can see the full list of available regions by using `az account list-locations`.\n- `<YOUR_POSTGRESQL_ADMIN_PASSWORD>` and `<YOUR_POSTGRESQL_NON_ADMIN_PASSWORD>`: The password of your PostgreSQL database server, which should have a minimum of eight characters. The characters should be from three of the following categories: English uppercase letters, English lowercase letters, numbers (0-9), and non-alphanumeric characters (!, $, #, %, and so on).\n- `<YOUR_LOCAL_IP_ADDRESS>`: The IP address of your local computer, from which you'll run your Spring Boot application. One convenient way to find it is to open [whatismyip.akamai.com](http://whatismyip.akamai.com/).\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\nNext, create a resource group by using the following command:\n\n```azurecli\naz group create \\\n    --name $AZ_RESOURCE_GROUP \\\n    --location $AZ_LOCATION \\\n    --output tsv\n```\n\n## Create an Azure Database for PostgreSQL instance and set up the admin user\n\nThe first thing you'll create is a managed PostgreSQL server with an admin user.\n\n> [!NOTE]\n> You can read more detailed information about creating PostgreSQL servers in [Create an Azure Database for PostgreSQL server by using the Azure portal](/azure/postgresql/quickstart-create-server-database-portal).\n\n```azurecli\naz postgres flexible-server create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_SERVER_NAME \\\n    --location $AZ_LOCATION \\\n    --admin-user $AZ_POSTGRESQL_ADMIN_USERNAME \\\n    --admin-password $AZ_POSTGRESQL_ADMIN_PASSWORD \\\n    --yes \\\n    --output tsv\n```\n\n## Configure a PostgreSQL database\n\nThe PostgreSQL server that you created earlier is empty. Use the following command to create a new database.\n\n```azurecli\naz postgres flexible-server db create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --database-name $AZ_DATABASE_NAME \\\n    --server-name $AZ_DATABASE_SERVER_NAME \\\n    --output tsv\n```\n\n## Configure a firewall rule for your PostgreSQL server\n\nAzure Database for PostgreSQL instances are secured by default. They have a firewall that doesn't allow any incoming connection. To be able to use your database, you need to add a firewall rule that will allow the local IP address to access the database server.\n\nBecause you configured your local IP address at the beginning of this article, you can open the server's firewall by running the following command:\n\n```azurecli\naz postgres flexible-server firewall-rule create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_SERVER_NAME \\\n    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \\\n    --start-ip-address $AZ_LOCAL_IP_ADDRESS \\\n    --end-ip-address $AZ_LOCAL_IP_ADDRESS \\\n    --output tsv\n```\n\nIf you're connecting to your PostgreSQL server from Windows Subsystem for Linux (WSL) on a Windows computer, you need to add the WSL host ID to your firewall.\n\nObtain the IP address of your host machine by running the following command in WSL:\n\n```bash\ncat /etc/resolv.conf\n```\n\nCopy the IP address following the term `nameserver`, then use the following command to set an environment variable for the WSL IP Address:\n\n```bash\nexport AZ_WSL_IP_ADDRESS=<the-copied-IP-address>\n```\n\nThen, use the following command to open the server's firewall to your WSL-based app:\n\n```azurecli\naz postgres flexible-server firewall-rule create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_SERVER_NAME \\\n    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \\\n    --start-ip-address $AZ_WSL_IP_ADDRESS \\\n    --end-ip-address $AZ_WSL_IP_ADDRESS \\\n    --output tsv\n```\n\n## Create a PostgreSQL non-admin user and grant permission\n\nNext, create a non-admin user and grant all permissions to the database.\n\n> [!NOTE]\n> You can read more detailed information about creating PostgreSQL users in [Create users in Azure Database for PostgreSQL](/azure/PostgreSQL/flexible-server/how-to-create-users).\n\nCreate a SQL script called **create_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\n```bash\ncat << EOF > create_user.sql\nCREATE ROLE \"$AZ_POSTGRESQL_NON_ADMIN_USERNAME\" WITH LOGIN PASSWORD '$AZ_POSTGRESQL_NON_ADMIN_PASSWORD';\nGRANT ALL PRIVILEGES ON DATABASE $AZ_DATABASE_NAME TO \"$AZ_POSTGRESQL_NON_ADMIN_USERNAME\";\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\npsql \"host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$AZ_POSTGRESQL_ADMIN_USERNAME dbname=$AZ_DATABASE_NAME port=5432 password=$AZ_POSTGRESQL_ADMIN_PASSWORD sslmode=require\" < create_user.sql\n```\n\nNow use the following command to remove the temporary SQL script file:\n\n```bash\nrm create_user.sql\n```\n\n[!INCLUDE [spring-data-create-reactive.md](includes/spring-data-create-reactive.md)]\n\n## Generate the application by using Spring Initializr\n\nGenerate the application on the command line by using the following command:\n\n```bash\ncurl https://start.spring.io/starter.tgz -d dependencies=webflux,data-r2dbc -d baseDir=azure-database-workshop -d bootVersion=2.7.11 -d javaVersion=17 | tar -xzvf -\n```\n\n## Add the reactive PostgreSQL driver implementation\n\nOpen the generated project's **pom.xml** file, and then add the reactive PostgreSQL driver from the [r2dbc-postgresql repository on GitHub](https://github.com/pgjdbc/r2dbc-postgresql). After the `spring-boot-starter-webflux` dependency, add the following text:\n\n```xml\n<dependency>\n    <groupId>io.r2dbc</groupId>\n    <artifactId>r2dbc-postgresql</artifactId>\n    <version>0.8.12.RELEASE</version>\n    <scope>runtime</scope>\n</dependency>\n```\n\n## Configure Spring Boot to use Azure Database for PostgreSQL\n\nOpen the **src/main/resources/application.properties** file, and add the following text:\n\n```properties\nlogging.level.org.springframework.data.r2dbc=DEBUG\n\nspring.r2dbc.url=r2dbc:pool:postgres://$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com:5432/$AZ_DATABASE_NAME\nspring.r2dbc.username=nonspring\nspring.r2dbc.password=$AZ_POSTGRESQL_NON_ADMIN_PASSWORD\nspring.r2dbc.properties.sslMode=REQUIRE\n```\n\nReplace the `$AZ_DATABASE_SERVER_NAME`, `$AZ_DATABASE_NAME`, and `$AZ_POSTGRESQL_NON_ADMIN_PASSWORD` variables with the values that you configured at the beginning of this article.\n\n> [!WARNING]\n> For security reasons, Azure Database for PostgreSQL requires to use SSL connections. This is why you need to add the `spring.r2dbc.properties.sslMode=REQUIRE` configuration property, otherwise the R2DBC PostgreSQL driver will try to connect using an insecure connection, which will fail.\n\n> [!NOTE]\n> For better performance, the `spring.r2dbc.url` property is configured to use a connection pool using [r2dbc-pool](https://github.com/r2dbc/r2dbc-pool).\n\nYou should now be able to start your application by using the provided Maven wrapper as follows:\n\n```bash\n./mvnw spring-boot:run\n```\n\nHere's a screenshot of the application running for the first time:\n\n:::image type=\"content\" source=\"media/configure-spring-data-r2dbc-with-azure-postgresql/create-postgresql-01.png\" alt-text=\"Screenshot of the running application.\" lightbox=\"media/configure-spring-data-r2dbc-with-azure-postgresql/create-postgresql-01.png\":::\n\n## Create the database schema\n\n[!INCLUDE [spring-data-r2dbc-create-schema.md](includes/spring-data-r2dbc-create-schema.md)]\n\n```sql\nDROP TABLE IF EXISTS todo;\nCREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);\n```\n\nStop the running application, and start it again using the following command. The application will now use the `demo` database that you created earlier, and create a `todo` table inside it.\n\n```bash\n./mvnw spring-boot:run\n```\n\nHere's a screenshot of the database table as it's being created:\n\n:::image type=\"content\" source=\"media/configure-spring-data-r2dbc-with-azure-postgresql/create-postgresql-02.png\" alt-text=\"Screenshot of the creation of the database table.\" lightbox=\"media/configure-spring-data-r2dbc-with-azure-postgresql/create-postgresql-02.png\":::\n\n## Code the application\n\nNext, add the Java code that will use R2DBC to store and retrieve data from your PostgreSQL server.\n\n[!INCLUDE [spring-data-r2dbc-create-application.md](includes/spring-data-r2dbc-create-application.md)]\n\nHere's a screenshot of these cURL requests:\n\n:::image type=\"content\" source=\"media/configure-spring-data-r2dbc-with-azure-postgresql/create-postgresql-03.png\" alt-text=\"Screenshot of the cURL test.\" lightbox=\"media/configure-spring-data-r2dbc-with-azure-postgresql/create-postgresql-03.png\":::\n\nCongratulations! You've created a fully reactive Spring Boot application that uses R2DBC to store and retrieve data from Azure Database for PostgreSQL.\n\n[!INCLUDE [spring-data-conclusion.md](includes/spring-data-conclusion.md)]\n\n## See also\n\nFor more information about Spring Data R2DBC, see Spring's [reference documentation](https://docs.spring.io/spring-data/r2dbc/docs/current-SNAPSHOT/reference/html/#reference).\n\nFor more information about using Azure with Java, see [Azure for Java developers](../index.yml) and [Working with Azure DevOps and Java](/azure/devops/).\n"
  },
  {
    "path": "articles/java/spring-framework/configure-spring-data-r2dbc-with-azure-sql-server.md",
    "content": "---\ntitle: Use Spring Data R2DBC with Azure SQL Database\ndescription: Learn how to use Spring Data R2DBC with an Azure SQL Database.\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nauthor: KarlErickson\nms.topic: how-to\nms.custom:\n  - devx-track-java\n  - devx-track-azurecli\n  - team=cloud_advocates\n  - spring-cloud-azure\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Use Spring Data R2DBC with Azure SQL Database\n\nThis article demonstrates creating a sample application that uses [Spring Data R2DBC](https://spring.io/projects/spring-data-r2dbc) to store and retrieve information in [Azure SQL Database](/azure/sql-database/) by using the R2DBC implementation for Microsoft SQL Server from the [r2dbc-mssql GitHub repository](https://github.com/r2dbc/r2dbc-mssql).\n\n[R2DBC](https://r2dbc.io/) brings reactive APIs to traditional relational databases. You can use it with Spring WebFlux to create fully reactive Spring Boot applications that use non-blocking APIs. It provides better scalability than the classic \"one thread per connection\" approach.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n- [sqlcmd Utility](/sql/tools/sqlcmd/sqlcmd-utility).\n\n- [cURL](https://curl.se/) or a similar HTTP utility to test functionality.\n\n## See the sample application\n\nIn this article, you'll code a sample application. If you want to go faster, this application is already coded and available at [https://github.com/Azure-Samples/quickstart-spring-data-r2dbc-sql-server](https://github.com/Azure-Samples/quickstart-spring-data-r2dbc-sql-server).\n\n## Prepare the working environment\n\nFirst, set up some environment variables by using the following commands:\n\n```bash\nexport AZ_RESOURCE_GROUP=database-workshop\nexport AZ_DATABASE_NAME=<YOUR_DATABASE_NAME>\nexport AZ_LOCATION=<YOUR_AZURE_REGION>\nexport AZ_SQL_SERVER_ADMIN_USERNAME=spring\nexport AZ_SQL_SERVER_ADMIN_PASSWORD=<YOUR_AZURE_SQL_ADMIN_PASSWORD>\nexport AZ_SQL_SERVER_NON_ADMIN_USERNAME=nonspring\nexport AZ_SQL_SERVER_NON_ADMIN_PASSWORD=<YOUR_AZURE_SQL_NON_ADMIN_PASSWORD>\nexport AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>\n```\n\nReplace the placeholders with the following values, which are used throughout this article:\n\n- `<YOUR_DATABASE_NAME>`: The name of your Azure SQL Database server, which should be unique across Azure.\n- `<YOUR_AZURE_REGION>`: The Azure region you'll use. You can use `eastus` by default, but we recommend that you configure a region closer to where you live. You can see the full list of available regions by using `az account list-locations`.\n- `<AZ_SQL_SERVER_ADMIN_PASSWORD>` and `<AZ_SQL_SERVER_NON_ADMIN_PASSWORD>`: The password of your Azure SQL Database server, which should have a minimum of eight characters. The characters should be from three of the following categories: English uppercase letters, English lowercase letters, numbers (0-9), and non-alphanumeric characters (!, $, #, %, and so on).\n- `<YOUR_LOCAL_IP_ADDRESS>`: The IP address of your local computer, from which you'll run your Spring Boot application. One convenient way to find it is to open [whatismyip.akamai.com](http://whatismyip.akamai.com/).\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\nNext, create a resource group by using the following command:\n\n```azurecli\naz group create \\\n    --name $AZ_RESOURCE_GROUP \\\n    --location $AZ_LOCATION \\\n    --output tsv\n```\n\n## Create an Azure SQL Database instance\n\nNext, create a managed Azure SQL Database server instance by running the following command.\n\n> [!NOTE]\n> The MS SQL password has to meet specific criteria, and setup will fail with a non-compliant password. For more information, see [Password Policy](/sql/relational-databases/security/password-policy/).\n\n```azurecli\naz sql server create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_NAME \\\n    --location $AZ_LOCATION \\\n    --admin-user $AZ_SQL_SERVER_ADMIN_USERNAME \\\n    --admin-password $AZ_SQL_SERVER_ADMIN_PASSWORD \\\n    --output tsv\n```\n\n## Configure a firewall rule for your Azure SQL Database server\n\nAzure SQL Database instances are secured by default. They have a firewall that doesn't allow any incoming connection. To be able to use your database, you need to add a firewall rule that will allow the local IP address to access the database server.\n\nBecause you configured your local IP address at the beginning of this article, you can open the server's firewall by running the following command:\n\n```azurecli\naz sql server firewall-rule create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_NAME-database-allow-local-ip \\\n    --server $AZ_DATABASE_NAME \\\n    --start-ip-address $AZ_LOCAL_IP_ADDRESS \\\n    --end-ip-address $AZ_LOCAL_IP_ADDRESS \\\n    --output tsv\n```\n\nIf you're connecting to your Azure SQL Database server from Windows Subsystem for Linux (WSL) on a Windows computer, you need to add the WSL host ID to your firewall.\n\nObtain the IP address of your host machine by running the following command in WSL:\n\n```bash\ncat /etc/resolv.conf\n```\n\nCopy the IP address following the term `nameserver`, then use the following command to set an environment variable for the WSL IP Address:\n\n```bash\nexport AZ_WSL_IP_ADDRESS=<the-copied-IP-address>\n```\n\nThen, use the following command to open the server's firewall to your WSL-based app:\n\n```azurecli\n\naz sql server firewall-rule create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_NAME-database-allow-local-ip-wsl \\\n    --server $AZ_DATABASE_NAME \\\n    --start-ip-address $AZ_WSL_IP_ADDRESS \\\n    --end-ip-address $AZ_WSL_IP_ADDRESS \\\n    --output tsv\n\n```\n\n## Configure an Azure SQL database\n\nThe Azure SQL Database server that you created earlier is empty. It doesn't have any database that you can use with the Spring Boot application. Create a new database called `demo` by running the following command:\n\n```azurecli\naz sql db create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name demo \\\n    --server $AZ_DATABASE_NAME \\\n    --output tsv\n```\n\n## Create an SQL database non-admin user and grant permission\n\nThis step will create a non-admin user and grant all permissions on the `demo` database to it.\n\nCreate a SQL script called **create_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\n```bash\ncat << EOF > create_user.sql\nUSE demo;\nGO\nCREATE USER $AZ_SQL_SERVER_NON_ADMIN_USERNAME WITH PASSWORD='$AZ_SQL_SERVER_NON_ADMIN_PASSWORD'\nGO\nGRANT CONTROL ON DATABASE::demo TO $AZ_SQL_SERVER_NON_ADMIN_USERNAME;\nGO\nEOF\n```\n\nThen, use the following command to run the SQL script to create the non-admin user:\n\n```bash\nsqlcmd -S $AZ_DATABASE_NAME.database.windows.net,1433  -d demo -U $AZ_SQL_SERVER_ADMIN_USERNAME -P $AZ_SQL_SERVER_ADMIN_PASSWORD  -i create_user.sql\n```\n\n> [!NOTE]\n> For more information about creating SQL database users, see [CREATE USER (Transact-SQL)](/sql/t-sql/statements/create-user-transact-sql).\n\n---\n\n[!INCLUDE [spring-data-create-reactive.md](includes/spring-data-create-reactive.md)]\n\n## Generate the application by using Spring Initializr\n\nGenerate the application on the command line by running the following command:\n\n```bash\ncurl https://start.spring.io/starter.tgz -d dependencies=webflux,data-r2dbc -d baseDir=azure-database-workshop -d bootVersion=2.7.11 -d javaVersion=17 | tar -xzvf -\n```\n\n## Add the reactive Azure SQL Database driver implementation\n\nOpen the generated project's **pom.xml** file to add the reactive Azure SQL Database driver from the [r2dbc-mssql GitHub repository](https://github.com/r2dbc/r2dbc-mssql).\n\nAfter the `spring-boot-starter-webflux` dependency, add the following text:\n\n```xml\n<dependency>\n    <groupId>io.r2dbc</groupId>\n    <artifactId>r2dbc-mssql</artifactId>\n    <scope>runtime</scope>\n</dependency>\n```\n\n### Configure Spring Boot to use Azure SQL Database\n\nOpen the **src/main/resources/application.properties** file, and add the following text:\n\n```properties\nlogging.level.org.springframework.data.r2dbc=DEBUG\n\nspring.r2dbc.url=r2dbc:pool:mssql://$AZ_DATABASE_NAME.database.windows.net:1433/demo\nspring.r2dbc.username=nonspring@$AZ_DATABASE_NAME\nspring.r2dbc.password=$AZ_SQL_SERVER_NON_ADMIN_PASSWORD\n```\n\nReplace the two `$AZ_DATABASE_NAME` variables and the `$AZ_SQL_SERVER_NON_ADMIN_PASSWORD` variable with the values that you configured at the beginning of this article.\n\n> [!NOTE]\n> For better performance, the `spring.r2dbc.url` property is configured to use a connection pool using [r2dbc-pool](https://github.com/r2dbc/r2dbc-pool).\n\nYou should now be able to start your application by using the provided Maven wrapper as follows:\n\n```bash\n./mvnw spring-boot:run\n```\n\nHere's a screenshot of the application running for the first time:\n\n:::image type=\"content\" source=\"media/configure-spring-data-r2dbc-with-azure-azure-sql/create-azure-sql-01.png\" alt-text=\"Screenshot of the running application.\" lightbox=\"media/configure-spring-data-r2dbc-with-azure-azure-sql/create-azure-sql-01.png\":::\n\n## Create the database schema\n\n[!INCLUDE [spring-data-r2dbc-create-schema.md](includes/spring-data-r2dbc-create-schema.md)]\n\n```sql\nDROP TABLE IF EXISTS todo;\nCREATE TABLE todo (id INT IDENTITY PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BIT);\n```\n\nStop the running application, and start it again using the following command. The application will now use the `demo` database that you created earlier, and create a `todo` table inside it.\n\n```bash\n./mvnw spring-boot:run\n```\n\nHere's a screenshot of the database table as it's being created:\n\n:::image type=\"content\" source=\"media/configure-spring-data-r2dbc-with-azure-azure-sql/create-azure-sql-02.png\" alt-text=\"Screenshot of the creation of the database table.\" lightbox=\"media/configure-spring-data-r2dbc-with-azure-azure-sql/create-azure-sql-02.png\":::\n\n## Code the application\n\nNext, add the Java code that will use R2DBC to store and retrieve data from your Azure SQL Database server.\n\n[!INCLUDE [spring-data-r2dbc-create-application.md](includes/spring-data-r2dbc-create-application.md)]\n\nHere's a screenshot of these cURL requests:\n\n:::image type=\"content\" source=\"media/configure-spring-data-r2dbc-with-azure-azure-sql/create-azure-sql-03.png\" alt-text=\"Screenshot of the cURL test.\" lightbox=\"media/configure-spring-data-r2dbc-with-azure-azure-sql/create-azure-sql-03.png\":::\n\nCongratulations! You've created a fully reactive Spring Boot application that uses R2DBC to store and retrieve data from Azure SQL Database.\n\n[!INCLUDE [spring-data-conclusion.md](includes/spring-data-conclusion.md)]\n\n## See also\n\nFor more information about Spring Data R2DBC, see Spring's [reference documentation](https://docs.spring.io/spring-data/r2dbc/docs/current-SNAPSHOT/reference/html/#reference).\n\nFor more information about using Azure with Java, see [Azure for Java developers](../index.yml) and [Working with Azure DevOps and Java](/azure/devops/).\n"
  },
  {
    "path": "articles/java/spring-framework/create-and-configure-managed-identity.md",
    "content": "---\ntitle: Create and configure a managed identity on Azure hosting services\ndescription: Shows you how to create and configure a managed identity on Azure hosting services.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Create and configure a managed identity on Azure hosting services\n\nThis article shows you how to create and configure a managed identity on Azure hosting services. There are two types of managed identities: system-assigned and user-assigned.\n\nFor more information about Azure managed identities, see [Microsoft Entra managed identities for Azure resources](/azure/active-directory/managed-identities-azure-resources/).\n\nFor more information about Microsoft Entra ID, see [What is Microsoft Entra ID?](/azure/active-directory/fundamentals/active-directory-whatis)\n\n## Create and configure a system-assigned managed identity\n\nThe following list provides references on how to create and configure system-assigned managed identity on various Azure hosting services.\n\n- Azure VM. For more information, see [Configure managed identities for Azure resources on a VM using the Azure portal](/azure/active-directory/managed-identities-azure-resources/qs-configure-portal-windows-vm).\n- Azure App Service and Azure Functions. For more information, see [How to use managed identities for App Service and Azure Functions](/azure/app-service/overview-managed-identity).\n- Azure Containers Instances. For more information, see [How to use managed identities with Azure Container Instances](/azure/container-instances/container-instances-managed-identity).\n- Azure Kubernetes Service (AKS). For more information, see [Use a managed identity in Azure Kubernetes Service](/azure/aks/use-managed-identity).\n- Azure Spring Apps. For more information, see [Enable system-assigned managed identity for an application in Azure Spring Apps](/azure/spring-apps/how-to-enable-system-assigned-managed-identity?tabs=azure-portal&pivots=sc-standard-tier).\n\n## Create and configure a user-assigned managed identity\n\nFor instructions on how to create a user-assigned managed identity, see [Manage user-assigned managed identities](/azure/active-directory/managed-identities-azure-resources/how-manage-user-assigned-managed-identities?pivots=identity-mi-methods-azp).\n\nThe following list provides references on how to configure a user-assigned managed identity on various Azure hosting services.\n\n- Azure VM. For more information, see [Configure managed identities for Azure resources on a VM using the Azure portal](/azure/active-directory/managed-identities-azure-resources/qs-configure-portal-windows-vm).\n- Azure App Service and Azure Functions. For more information, see [How to use managed identities for App Service and Azure Functions](/azure/app-service/overview-managed-identity).\n- Azure Containers instances. For more information, see [How to use managed identities with Azure Container Instances](/azure/container-instances/container-instances-managed-identity).\n- Azure Kubernetes Service(AKS). For more information, see [Use a managed identity in Azure Kubernetes Service](/azure/aks/use-managed-identity#bring-your-own-control-plane-mi).\n- Azure Spring Apps. For more information, see [Manage user-assigned managed identities for an application in Azure Spring Apps](/azure/spring-apps/how-to-manage-user-assigned-managed-identities?tabs=azure-portal&pivots=sc-standard-tier).\n"
  },
  {
    "path": "articles/java/spring-framework/deploy-applications-to-azure-hosting-environments.md",
    "content": "---\ntitle: Deploy application to Azure hosting services\ndescription: Describes how to deploy applications to Azure hosting services\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: install-set-up-deploy\nms.custom: devx-track-java, spring-cloud-azure\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Deploy applications to Azure hosting services\n\nThe following list provides references on how to deploy applications to various Azure hosting services.\n\n- Azure Virtual Machines (VMs). For more information, see the [Connect to VM](/azure/virtual-machines/linux/tutorial-manage-vm#connect-to-vm) section of [Tutorial: Create and Manage Linux VMs with the Azure CLI](/azure/virtual-machines/linux/tutorial-manage-vm). After you connect to the VM, you have to install and configure your applications yourself.\n- Azure App Service. For more information, see [Deployment Best Practices](/azure/app-service/deploy-best-practices).\n- Azure Functions. For more information, see [Deployment technologies in Azure Functions](/azure/azure-functions/functions-deployment-technologies).\n- Azure Containers Instances. For more information, see [Quickstart: Deploy a container instance in Azure using the Azure CLI](/azure/container-instances/container-instances-quickstart).\n- Azure Kubernetes Service (AKS). For more information, see [Deploy Spring Boot Application to Azure Kubernetes Service](./deploy-spring-boot-java-app-on-kubernetes.md).\n"
  },
  {
    "path": "articles/java/spring-framework/deploy-passwordless-spring-database-app.md",
    "content": "---\ntitle: 'Tutorial: Deploy to Azure Spring Apps with passwordless connection to Azure database'\ndescription: Create a Spring Boot application with passwordless connection to an Azure database and deploy to Azure Spring Apps.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: tutorial\nms.date: 08/19/2025\nms.custom:\n  - passwordless-java\n  - spring-cloud-azure\n  - devx-track-java\n  - service-connector\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - sfi-ga-nochange\n---\n\n# Tutorial: Deploy a Spring application to Azure Spring Apps with a passwordless connection to an Azure database\n\nThis article shows you how to use passwordless connections to Azure databases in Spring Boot applications deployed to Azure Spring Apps.\n\nIn this tutorial, you complete the following tasks using the Azure portal or the Azure CLI. Both methods are explained in the following procedures.\n\n> [!div class=\"checklist\"]\n> - Provision an instance of Azure Spring Apps.\n> - Build and deploy apps to Azure Spring Apps.\n> - Run apps connected to Azure databases using managed identity.\n\n> [!NOTE]\n> This tutorial doesn't work for R2DBC.\n\n## Prerequisites\n\n- An Azure subscription. If you don't already have one, create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n- [Azure CLI](/cli/azure/install-azure-cli) 2.45.0 or higher required.\n- The Azure Spring Apps extension. You can install the extension by using the command: `az extension add --name spring`.\n- [Java Development Kit (JDK)](../fundamentals/java-support-on-azure.md), version 8, 11, or 17.\n- A [Git](https://git-scm.com/downloads) client.\n- [cURL](https://curl.haxx.se) or a similar HTTP utility to test functionality.\n- MySQL command line client if you choose to run Azure Database for MySQL. You can connect to your server with Azure Cloud Shell using a popular client tool, the [mysql.exe](https://dev.mysql.com/downloads/) command-line tool. Alternatively, you can use the `mysql` command line in your local environment.\n- [ODBC Driver 18 for SQL Server](/sql/connect/odbc/download-odbc-driver-for-sql-server) if you choose to run Azure SQL Database.\n\n## Prepare the working environment\n\nFirst, set up some environment variables by using the following commands:\n\n```bash\nexport AZ_RESOURCE_GROUP=passwordless-tutorial-rg\nexport AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>\nexport AZ_DATABASE_NAME=demodb\nexport AZ_LOCATION=<YOUR_AZURE_REGION>\nexport AZ_SPRING_APPS_SERVICE_NAME=<YOUR_AZURE_SPRING_APPS_SERVICE_NAME>\nexport AZ_SPRING_APPS_APP_NAME=hellospring\nexport AZ_DB_ADMIN_USERNAME=<YOUR_DB_ADMIN_USERNAME>\nexport AZ_DB_ADMIN_PASSWORD=<YOUR_DB_ADMIN_PASSWORD>\nexport AZ_USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>\n```\n\nReplace the placeholders with the following values, which are used throughout this article:\n\n- `<YOUR_DATABASE_SERVER_NAME>`: The name of your Azure Database server, which should be unique across Azure.\n- `<YOUR_AZURE_REGION>`: The Azure region you want to use. You can use `eastus` by default, but we recommend that you configure a region closer to where you live. You can see the full list of available regions by using `az account list-locations`.\n- `<YOUR_AZURE_SPRING_APPS_SERVICE_NAME>`: The name of your Azure Spring Apps instance. The name must be between 4 and 32 characters long and can contain only lowercase letters, numbers, and hyphens. The first character of the service name must be a letter and the last character must be either a letter or a number.\n- `<AZ_DB_ADMIN_USERNAME>`: The admin username of your Azure database server.\n- `<AZ_DB_ADMIN_PASSWORD>`: The admin password of your Azure database server.\n- `<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>`: The name of your user assigned managed identity server, which should be unique across Azure.\n\n## Provision an instance of Azure Spring Apps\n\nUse the following steps to provision an instance of Azure Spring Apps.\n\n1. Update Azure CLI with the Azure Spring Apps extension by using the following command:\n\n   ```azurecli\n   az extension update --name spring\n   ```\n\n1. Sign in to the Azure CLI and choose your active subscription by using the following commands:\n\n   ```azurecli\n   az login\n   az account list --output table\n   az account set --subscription <name-or-ID-of-subscription>\n   ```\n\n1. Use the following commands to create a resource group to contain your Azure Spring Apps service and an instance of the Azure Spring Apps service:\n\n   ```azurecli\n   az group create \\\n       --name $AZ_RESOURCE_GROUP \\\n       --location $AZ_LOCATION\n   az spring create \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --name $AZ_SPRING_APPS_SERVICE_NAME\n   ```\n\n## Create an Azure database instance\n\nUse the following steps to provision an Azure Database instance.\n\n### [Azure Database for MySQL](#tab/mysql)\n\n1. Create an Azure Database for MySQL server by using the following command:\n\n   ```azurecli\n   az mysql flexible-server create \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --name $AZ_DATABASE_SERVER_NAME \\\n       --location $AZ_LOCATION \\\n       --admin-user $AZ_DB_ADMIN_USERNAME \\\n       --admin-password $AZ_DB_ADMIN_PASSWORD \\\n       --yes\n   ```\n\n> [!NOTE]\n> If you don't provide `admin-user` or `admin-password` parameters, the system will generate a default admin user or a random admin password by default.\n\n1. Create a new database by using the following command:\n\n   ```azurecli\n   az mysql flexible-server db create \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --database-name $AZ_DATABASE_NAME \\\n       --server-name $AZ_DATABASE_SERVER_NAME\n   ```\n\n### [Azure Database for PostgreSQL](#tab/postgresql)\n\n1. Create an Azure Database for PostgreSQL server by using the following command:\n\n   ```azurecli\n   az postgres flexible-server create \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --name $AZ_DATABASE_SERVER_NAME \\\n       --location $AZ_LOCATION \\\n       --admin-user $AZ_DB_ADMIN_USERNAME \\\n       --admin-password $AZ_DB_ADMIN_PASSWORD \\\n       --yes\n   ```\n\n> [!NOTE]\n> If you don't provide `admin-user` or `admin-password` parameters, the system will generate a default admin user or a random admin password by default.\n\n1. The PostgreSQL server is empty, so create a new database by using the following command:\n\n   ```azurecli\n   az postgres flexible-server db create \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --database-name $AZ_DATABASE_NAME \\\n       --server-name $AZ_DATABASE_SERVER_NAME \n   ```\n\n### [Azure SQL Database](#tab/sqlserver)\n\n1. Create an Azure SQL Database server by using the following command:\n\n   ```azurecli\n   az sql server create \\\n       --location $AZ_LOCATION \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --name $AZ_DATABASE_SERVER_NAME \\\n       --admin-user $AZ_DB_ADMIN_USERNAME \\\n       --admin-password $AZ_DB_ADMIN_PASSWORD\n   ```\n\n1. The SQL server is empty, so create a new database by using the following command:\n\n   ```azurecli\n   az sql db create \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --server $AZ_DATABASE_SERVER_NAME \\\n       --name $AZ_DATABASE_NAME\n   ```\n\n---\n\n## Create an app with a public endpoint assigned\n\nUse the following command to create the app.\n\n   ```azurecli\n   az spring app create \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --service $AZ_SPRING_APPS_SERVICE_NAME \\\n       --name $AZ_SPRING_APPS_APP_NAME \\\n       --runtime-version=Java_17\n       --assign-endpoint true\n   ```\n\n## Connect Azure Spring Apps to the Azure database\n\nFirst, install the [Service Connector](/azure/service-connector/overview) passwordless extension for the Azure CLI:\n\n```azurecli\naz extension add --name serviceconnector-passwordless --upgrade\n```\n\n### [Azure Database for MySQL](#tab/mysql)\n\nThen, use the following command to create a user-assigned managed identity for Microsoft Entra authentication. For more information, see [Set up Microsoft Entra authentication for Azure Database for MySQL - Flexible Server](/azure/mysql/flexible-server/how-to-azure-ad).\n\n```azurecli\nexport AZ_IDENTITY_RESOURCE_ID=$(az identity create \\\n    --name $AZ_USER_IDENTITY_NAME \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --query id \\\n    --output tsv)\n```\n\n> [!IMPORTANT]\n> After creating the user-assigned identity, ask your *Global Administrator* or *Privileged Role Administrator* to grant the following permissions for this identity: `User.Read.All`, `GroupMember.Read.All`, and `Application.Read.ALL`. For more information, see the [Permissions](/azure/mysql/flexible-server/concepts-azure-ad-authentication#permissions) section of [Active Directory authentication](/azure/mysql/flexible-server/concepts-azure-ad-authentication).\n\nNext, use the following command to create a passwordless connection to the database.\n\n```azurecli\naz spring connection create mysql-flexible \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --service $AZ_SPRING_APPS_SERVICE_NAME \\\n    --app $AZ_SPRING_APPS_APP_NAME \\\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity mysql-identity-id=$AZ_IDENTITY_RESOURCE_ID\n```\n\nThis Service Connector command does the following tasks in the background:\n\n- Enable system-assigned managed identity for the app `$AZ_SPRING_APPS_APP_NAME` hosted by Azure Spring Apps.\n- Set the Microsoft Entra admin to the current signed-in user.\n- Add a database user named `$AZ_SPRING_APPS_SERVICE_NAME/apps/$AZ_SPRING_APPS_APP_NAME` for the managed identity created in step 1 and grant all privileges of the database `$AZ_DATABASE_NAME` to this user.\n- Add two configurations to the app `$AZ_SPRING_APPS_APP_NAME`: `spring.datasource.url` and `spring.datasource.username`.\n\n  > [!NOTE]\n  > If you see the error message `The subscription is not registered to use Microsoft.ServiceLinker`, run the command `az provider register --namespace Microsoft.ServiceLinker` to register the Service Connector resource provider, then run the connection command again.\n\n### [Azure Database for PostgreSQL](#tab/postgresql)\n\nUse the following command to create a passwordless connection to the database.\n\n```azurecli\naz spring connection create postgres-flexible \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --service $AZ_SPRING_APPS_SERVICE_NAME \\\n    --app $AZ_SPRING_APPS_APP_NAME \\\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity\n```\n\nThis Service Connector command does the following tasks in the background:\n\n- Enable system-assigned managed identity for the app `$AZ_SPRING_APPS_APP_NAME` hosted by Azure Spring Apps.\n- Set the Microsoft Entra admin to current sign-in user.\n- Add a database user named `$AZ_SPRING_APPS_SERVICE_NAME/apps/$AZ_SPRING_APPS_APP_NAME` for the managed identity created in step 1 and grant all privileges of the database `$AZ_DATABASE_NAME` to this user.\n- Add two configurations to the app `$AZ_SPRING_APPS_APP_NAME`: `spring.datasource.url` and `spring.datasource.username`.\n\n  > [!NOTE]\n  > If you see the error message `The subscription is not registered to use Microsoft.ServiceLinker`, run the command `az provider register --namespace Microsoft.ServiceLinker` to register the Service Connector resource provider, then run the connection command again.\n\n### [Azure SQL Database](#tab/sqlserver)\n\n> [!NOTE]\n> Please make sure Azure CLI use the 64-bit Python, 32-bit Python has compatibility issue with the command's dependency [pyodbc](https://pypi.org/project/pyodbc/).\n>\n> The Python information of Azure CLI can be got with command `az --version`. If it shows `[MSC v.1929 32 bit (Intel)]`, then it means it use 32-bit Python.\n>\n> The solution is to install 64-bit Python and install Azure CLI from [PyPI](https://pypi.org/project/azure-cli/).\n\nUse the following command to create a passwordless connection to the database.\n\n```azurecli\naz spring connection create sql \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --service $AZ_SPRING_APPS_SERVICE_NAME \\\n    --app $AZ_SPRING_APPS_APP_NAME \\\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity\n```\n\nThis Service Connector command does the following tasks in the background:\n\n- Enable system-assigned managed identity for the app `$AZ_SPRING_APPS_APP_NAME` hosted by Azure Spring Apps.\n- Set the Microsoft Entra admin to current sign-in user.\n- Add a database user named `$AZ_SPRING_APPS_SERVICE_NAME/apps/$AZ_SPRING_APPS_APP_NAME` for the managed identity created in step 1 and grant all privileges of the database `$AZ_DATABASE_NAME` to this user.\n- Add one configuration to the app `$AZ_SPRING_APPS_APP_NAME`: `spring.datasource.url`.\n\n  > [!NOTE]\n  > If you see the error message `The subscription is not registered to use Microsoft.ServiceLinker`, run the command `az provider register --namespace Microsoft.ServiceLinker` to register the Service Connector resource provider, then run the connection command again.\n\n---\n\n## Build and deploy the app\n\nThe following steps describe how to download, configure, build, and deploy the sample application.\n\n1. Use the following command to clone the sample code repository:\n\n   ### [Azure Database for MySQL](#tab/mysql)\n\n   ```bash\n   git clone https://github.com/Azure-Samples/quickstart-spring-data-jdbc-mysql passwordless-sample\n   ```\n\n   ### [Azure Database for PostgreSQL](#tab/postgresql)\n\n   ```bash\n   git clone https://github.com/Azure-Samples/quickstart-spring-data-jdbc-postgresql passwordless-sample\n   ```\n\n   ### [Azure SQL Database](#tab/sqlserver)\n\n   ```bash\n   git clone https://github.com/Azure-Samples/quickstart-spring-data-jdbc-sql-server passwordless-sample\n   ```\n\n1. Add the following dependency to your **pom.xml** file:\n\n   ### [Azure Database for MySQL](#tab/mysql)\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>\n   </dependency>\n   ```\n\n   This dependency adds support for the Spring Cloud Azure starter.\n\n   > [!NOTE]\n   > For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n   ### [Azure Database for PostgreSQL](#tab/postgresql)\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-jdbc-postgresql</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n   This dependency adds support for the Spring Cloud Azure starter.\n\n   ### [Azure SQL Database](#tab/sqlserver)\n\n   ```xml\n   <dependency>\n       <groupId>com.azure</groupId>\n       <artifactId>azure-identity</artifactId>\n       <version>1.5.4</version>\n   </dependency>\n   ```\n\n   There's currently no Spring Cloud Azure starter for Azure SQL Database, but the `azure-identity` dependency is required.\n\n1. Use the following command to update the **application.properties** file:\n\n   ### [Azure Database for MySQL](#tab/mysql)\n\n   ```bash\n   cat << EOF > passwordless-sample/src/main/resources/application.properties\n\n   logging.level.org.springframework.jdbc.core=DEBUG\n   spring.datasource.azure.passwordless-enabled=true\n   spring.sql.init.mode=always\n\n   EOF\n   ```\n\n   ### [Azure Database for PostgreSQL](#tab/postgresql)\n\n   ```bash\n   cat << EOF > passwordless-sample/src/main/resources/application.properties\n\n   logging.level.org.springframework.jdbc.core=DEBUG\n   spring.datasource.azure.passwordless-enabled=true\n   spring.sql.init.mode=always\n\n   EOF\n   ```\n\n   ### [Azure SQL Database](#tab/sqlserver)\n\n   ```bash\n   cat << EOF > passwordless-sample/src/main/resources/application.properties\n\n   logging.level.org.springframework.jdbc.core=DEBUG\n   spring.sql.init.mode=always\n\n   EOF\n   ```\n\n1. Use the following commands to build the project using Maven:\n\n   ```bash\n   cd passwordless-sample\n   ./mvnw clean package -DskipTests\n   ```\n\n1. Use the following command to deploy the **target/demo-0.0.1-SNAPSHOT.jar** file for the app:\n\n   ```azurecli\n   az spring app deploy \\\n       --name $AZ_SPRING_APPS_APP_NAME \\\n       --service $AZ_SPRING_APPS_SERVICE_NAME \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --artifact-path target/demo-0.0.1-SNAPSHOT.jar\n   ```\n\n1. Query the app status after deployment by using the following command:\n\n   ```azurecli\n   az spring app list \\\n       --service $AZ_SPRING_APPS_SERVICE_NAME \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --output table\n   ```\n\n   You should see output similar to the following example.\n\n   ```\n   Name               Location    ResourceGroup    Production Deployment    Public Url                                           Provisioning Status    CPU    Memory    Running Instance    Registered Instance    Persistent Storage\n   -----------------  ----------  ---------------  -----------------------  ---------------------------------------------------  ---------------------  -----  --------  ------------------  ---------------------  --------------------\n   <app name>         eastus      <resource group> default                                                                       Succeeded              1      2         1/1                 0/1                    -\n   ```\n\n## Test the application\n\nTo test the application, you can use cURL. First, create a new \"todo\" item in the database by using the following command:\n\n```bash\ncurl --header \"Content-Type: application/json\" \\\n    --request POST \\\n    --data '{\"description\":\"configuration\",\"details\":\"congratulations, you have set up JDBC correctly!\",\"done\": \"true\"}' \\\n        https://${AZ_SPRING_APPS_SERVICE_NAME}-hellospring.azuremicroservices.io\n```\n\nThis command returns the created item, as shown in the following example:\n\n```json\n{\"id\":1,\"description\":\"configuration\",\"details\":\"congratulations, you have set up JDBC correctly!\",\"done\":true}\n```\n\nNext, retrieve the data by using the following cURL request:\n\n```bash\ncurl https://${AZ_SPRING_APPS_SERVICE_NAME}-hellospring.azuremicroservices.io\n```\n\nThis command returns the list of \"todo\" items, including the item you've created, as shown in the following example:\n\n```json\n[{\"id\":1,\"description\":\"configuration\",\"details\":\"congratulations, you have set up JDBC correctly!\",\"done\":true}]\n```\n\n## Clean up resources\n\nTo clean up all resources used during this tutorial, delete the resource group by using the following command:\n\n```azurecli\naz group delete \\\n    --name $AZ_RESOURCE_GROUP \\\n    --yes\n```\n\n## Next steps\n\n- [Spring Cloud Azure documentation](./index.yml)\n"
  },
  {
    "path": "articles/java/spring-framework/deploy-spring-boot-java-app-on-kubernetes.md",
    "content": "---\ntitle: Deploy Spring Boot Application to Azure Kubernetes Service\ndescription: This tutorial will walk you though the steps to deploy a Spring Boot application in a Kubernetes cluster on Microsoft Azure.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: install-set-up-deploy\nms.custom:\n  - mvc\n  - devx-track-java\n  - devx-track-azurecli\n  - spring-cloud-azure\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Deploy Spring Boot Application to Azure Kubernetes Service\n\n> [!NOTE]\n> For Spring Boot applications, we recommend using Azure Container Apps. However, you can still choose to use Azure Kubernetes Service as a destination. For more information, see [Choose the right Azure services for your Java applications](../get-started/choose.md).\n\nThis tutorial walks you through combining Kubernetes and Docker to develop and deploy a Spring Boot application to Microsoft Azure. More specifically, you use [Spring Boot] for application development, [Kubernetes] for container deployment, and [Azure Kubernetes Service (AKS)] to host your application.\n\n[Kubernetes] and [Docker] are open-source solutions that help developers automate the deployment, scaling, and management of their applications running in containers.\n\n## Prerequisites\n\n* An Azure subscription; if you don't already have an Azure subscription, you can activate your [MSDN subscriber benefits] or sign up for a [free Azure account].\n* The [Azure Command-Line Interface (CLI)].\n* A supported Java Development Kit (JDK). For more information about the JDKs available for use when developing on Azure, see [Java support on Azure and Azure Stack](../fundamentals/java-support-on-azure.md).\n* Apache's [Maven] build tool (Version 3).\n* A [Git] client.\n* A [Docker] client.\n* The [ACR Docker credential helper](https://github.com/Azure/acr-docker-credential-helper).\n\n> [!NOTE]\n> Due to the virtualization requirements of this tutorial, you cannot follow the steps in this article on a virtual machine; you must use a physical computer with virtualization features enabled.\n\n## Create the Spring Boot on Docker Getting Started web app\n\nThe following steps walk you through building a Spring Boot web application and testing it locally.\n\n1. Open a command-prompt and create a local directory to hold your application, and change to that directory; for example:\n\n   ```bash\n   mkdir C:\\SpringBoot\n   cd C:\\SpringBoot\n   ```\n\n   -- or --\n\n   ```bash\n   mkdir /users/$USER/SpringBoot\n   cd /users/$USER/SpringBoot\n   ```\n\n1. Clone the [Spring Boot on Docker Getting Started] sample project into the directory.\n\n   ```bash\n   git clone https://github.com/spring-guides/gs-spring-boot-docker.git\n   ```\n\n1. Change directory to the completed project.\n\n   ```bash\n   cd gs-spring-boot-docker\n   cd complete\n   ```\n\n1. Use Maven to build and run the sample app.\n\n   ```bash\n   mvn package spring-boot:run\n   ```\n\n1. Test the web app by browsing to `http://localhost:8080`, or with the following `curl` command:\n\n   ```bash\n   curl http://localhost:8080\n   ```\n\n1. You should see the following message displayed: **Hello Docker World**\n\n   ![Browse Sample App Locally][SB01]\n\n## Create an Azure Container Registry using the Azure CLI\n\n1. Open a command prompt.\n\n1. Log in to your Azure account:\n\n   ```azurecli\n   az login\n   ```\n\n1. Choose your Azure Subscription:\n\n   ```azurecli\n   az account set -s <YourSubscriptionID>\n   ```\n\n1. Create a resource group for the Azure resources used in this tutorial.\n\n   ```azurecli\n   az group create --name=wingtiptoys-kubernetes --location=eastus\n   ```\n\n1. Create a private Azure container registry in the resource group. The tutorial pushes the sample app as a Docker image to this registry in later steps. Replace `wingtiptoysregistry` with a unique name for your registry.\n\n   ```azurecli\n   az acr create --resource-group wingtiptoys-kubernetes --location eastus \\\n    --name wingtiptoysregistry --sku Basic\n   ```\n\n## Push your app to the container registry via Jib\n\n1. Log in to your Azure Container Registry from the Azure CLI.\n\n   ```azurecli\n   # set the default name for Azure Container Registry, otherwise you need to specify the name in \"az acr login\"\n   az config set defaults.acr=wingtiptoysregistry\n   az acr login\n   ```\n\n1. Open the **pom.xml** file with a text editor; for example [Visual Studio Code](https://code.visualstudio.com/docs).\n\n   ```bash\n   code pom.xml\n   ```\n\n1. Update the `<properties>` collection in the **pom.xml** file with the registry name for your Azure Container Registry and the latest version of [`jib-maven-plugin`](https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin).\n\n   ```xml\n   <properties>\n      <!-- Note: If your ACR name contains upper case characters, be sure to convert them to lower case characters. -->\n      <docker.image.prefix>wingtiptoysregistry.azurecr.io</docker.image.prefix>\n      <jib-maven-plugin.version>2.5.2</jib-maven-plugin.version>\n      <java.version>1.8</java.version>\n   </properties>\n   ```\n\n1. Update the `<plugins>` collection in the **pom.xml** file so that the `<plugin>` element contains an entry for the `jib-maven-plugin`, as shown in the following example. Note that we are using a base image from the Microsoft Container Registry (MCR): `mcr.microsoft.com/openjdk/jdk:11-ubuntu`, which contains an officially supported JDK for Azure. For other MCR base images with officially supported JDKs, see [Install the Microsoft Build of OpenJDK.](/java/openjdk/containers).\n\n   ```xml\n   <plugin>\n     <artifactId>jib-maven-plugin</artifactId>\n     <groupId>com.google.cloud.tools</groupId>\n     <version>${jib-maven-plugin.version}</version>\n     <configuration>\n        <from>\n            <image>mcr.microsoft.com/openjdk/jdk:11-ubuntu</image>\n        </from>\n        <to>\n            <image>${docker.image.prefix}/gs-spring-boot-docker</image>\n        </to>\n     </configuration>\n   </plugin>\n   ```\n\n1. Navigate to the completed project directory for your Spring Boot application and run the following command to build the image and push the image to the registry:\n\n   ```azurecli\n   az acr login && mvn compile jib:build\n   ```\n\n> [!NOTE]\n> Due to the security concern of Azure Cli and Azure Container Registry, the credential created by `az acr login` is valid for 1 hour. If you see a `401 Unauthorized` error, you can run the `az acr login --name <your registry name>` command again to reauthenticate. If you see a `Read timed out` error, you can try increasing timeouts with `mvn -Djib.httpTimeout=7200000 jib:dockerBuild`, or `-Djib.httpTimeout=0` for an infinite timeout.\n\n## Create a Kubernetes Cluster on AKS using the Azure CLI\n\n1. Create a Kubernetes cluster in Azure Kubernetes Service. The following command creates a kubernetes cluster in the `wingtiptoys-kubernetes` resource group, with `wingtiptoys-akscluster` as the cluster name, with Azure Container Registry (ACR) `wingtiptoysregistry` attached, and `wingtiptoys-kubernetes` as the DNS prefix:\n\n   ```azurecli\n   az aks create --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster \\\n    --attach-acr wingtiptoysregistry \\\n    --dns-name-prefix=wingtiptoys-kubernetes --generate-ssh-keys\n   ```\n\n   This command may take a while to complete.\n\n1. Install `kubectl` using the Azure CLI. Linux users may have to prefix this command with `sudo` since it deploys the Kubernetes CLI to `/usr/local/bin`.\n\n   ```azurecli\n   az aks install-cli\n   ```\n\n1. Download the cluster configuration information so you can manage your cluster from the Kubernetes web interface and `kubectl`. \n\n   ```azurecli\n   az aks get-credentials --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster\n   ```\n\n## Deploy the image to your Kubernetes cluster\n\nThis tutorial deploys the app using `kubectl`, then allows you to explore the deployment through the Kubernetes web interface.\n\n### Deploy with kubectl\n\n1. Open a command prompt.\n\n1. Run your container in the Kubernetes cluster by using the `kubectl run` command. Give a service name for your app in Kubernetes and the full image name. For example:\n\n   ```bash\n   kubectl run gs-spring-boot-docker --image=wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest\n   ```\n\n   In this command:\n\n   * The container name `gs-spring-boot-docker` is specified immediately after the `run` command\n\n   * The `--image` parameter specifies the combined login server and image name as `wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest`\n\n1. Expose your Kubernetes cluster externally by using the `kubectl expose` command. Specify your service name, the public-facing TCP port used to access the app, and the internal target port your app listens on. For example:\n\n   ```bash\n   kubectl expose pod gs-spring-boot-docker --type=LoadBalancer --port=80 --target-port=8080\n   ```\n\n   In this command:\n\n   * The container name `gs-spring-boot-docker` is specified immediately after the `expose pod` command.\n\n   * The `--type` parameter specifies that the cluster uses load balancer.\n\n   * The `--port` parameter specifies the public-facing TCP port of 80. You access the app on this port.\n\n   * The `--target-port` parameter specifies the internal TCP port of 8080. The load balancer forwards requests to your app on this port.\n\n1. Once the app is deployed to the cluster, query the external IP address and open it in your web browser:\n\n   ```bash\n   kubectl get services -o=jsonpath='{.items[*].status.loadBalancer.ingress[0].ip}'\n   ```\n\n   ![Browse Sample App on Azure][SB02]\n\n### Deploy with the Kubernetes resource view\n\n1. Select **Add** from any of the resource views (Namespace, Workloads, Services and ingresses, Storage, or Configuration).\n\n   :::image type=\"content\" source=\"media/deploy-spring-boot-java-app-on-kubernetes/KR01.png\" alt-text=\"Kubernetes resources view.\":::\n\n\n1. Paste in the following YAML:\n\n   ```yaml\n   apiVersion: apps/v1\n   kind: Deployment\n   metadata:\n     name: gs-spring-boot-docker\n   spec:\n     replicas: 1\n     selector:\n       matchLabels:\n         app: gs-spring-boot-docker\n     template:\n       metadata:\n         labels:\n           app: gs-spring-boot-docker\n       spec:\n         containers:\n         - name: gs-spring-boot-docker\n           image: wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest\n   ```\n\n1. Select **Add** at the bottom of the YAML editor to deploy the application.\n\n   :::image type=\"content\" source=\"media/deploy-spring-boot-java-app-on-kubernetes/KR02.png\" alt-text=\"Kubernetes resources view, add resource.\":::\n\n   After deploying the `Deployment`, just like above, select **Add** at the bottom of the YAML editor to deploy `Service` using the following YAML:\n\n   ```yaml\n   apiVersion: v1\n   kind: Service\n   metadata:\n     name: gs-spring-boot-docker\n   spec:\n     type: LoadBalancer\n     ports:\n     - port: 80\n       targetPort: 8080\n     selector:\n       app: gs-spring-boot-docker\n   ```\n\n1. Once the YAML file is added, the resource viewer shows your Spring Boot application. The external service includes a linked external IP address so you can easily view the application in your browser.\n\n   :::image type=\"content\" source=\"media/deploy-spring-boot-java-app-on-kubernetes/KR03.png\" alt-text=\"Kubernetes resources view, services list.\":::\n\n   :::image type=\"content\" source=\"media/deploy-spring-boot-java-app-on-kubernetes/KR04.png\" alt-text=\"Kubernetes resources view, services list, external endpoints highlighted.\":::\n\n1. Select **External IP**. You'll then see your Spring Boot application running on Azure.\n\n   ![Browse Sample App on Azure][SB02]\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Spring on Azure](./index.yml)\n\n### See also\n\nFor more information about using Spring Boot on Azure, see the following article:\n\n* [Deploy a Spring Boot application to Linux on Azure App Service](deploy-spring-boot-java-app-on-linux.md)\n\nFor more information about using Azure with Java, see the [Azure for Java Developers] and the [Working with Azure DevOps and Java].\n\nFor more information about deploying a Java application to Kubernetes with Visual Studio Code, see [Visual Studio Code Java Tutorials].\n\nFor more information about the Spring Boot on Docker sample project, see [Spring Boot on Docker Getting Started].\n\nThe following links provide additional information about creating Spring Boot applications:\n\n* For more information about creating a simple Spring Boot application, see the Spring Initializr at https://start.spring.io/.\n\nThe following links provide additional information about using Kubernetes with Azure:\n\n* [Get started with a Kubernetes cluster in Azure Kubernetes Service](/azure/aks/intro-kubernetes)\n\nMore information about using Kubernetes command-line interface is available in the **kubectl** user guide at <https://kubernetes.io/docs/reference/kubectl/>.\n\nThe Kubernetes website has several articles that discuss using images in private registries:\n\n* [Configuring Service Accounts for Pods]\n* [Namespaces]\n* [Pulling an Image from a Private Registry]\n\nFor additional examples for how to use custom Docker images with Azure, see [Using a custom Docker image for Azure Web App on Linux].\n\nFor more information about iteratively running and debugging containers directly in Azure Kubernetes Service (AKS) with Azure Dev Spaces, see [Get started on Azure Dev Spaces with Java]\n\n<!-- URL List -->\n[kubectl create clusterrolebinding]: https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-em-clusterrolebinding-em-\n[dashboard-authentication]: https://github.com/kubernetes/dashboard/wiki/Access-control\n[Azure Command-Line Interface (CLI)]: /cli/azure/overview\n[Azure Kubernetes Service (AKS)]: https://azure.microsoft.com/services/kubernetes-service/\n[Azure for Java Developers]: ../index.yml\n[Azure portal]: https://portal.azure.com/\n[Create a private Docker container registry using the Azure portal]: /azure/container-registry/container-registry-get-started-portal\n[Using a custom Docker image for Azure Web App on Linux]: /azure/app-service/tutorial-custom-container\n[Docker]: https://www.docker.com/\n[free Azure account]: https://azure.microsoft.com/pricing/free-trial/\n[Git]: https://github.com/\n[Working with Azure DevOps and Java]: /azure/devops-project/azure-devops-project-java\n[Kubernetes]: https://kubernetes.io/\n[Kubernetes Command-Line Interface (kubectl)]: https://kubernetes.io/docs/user-guide/kubectl-overview/\n[Maven]: http://maven.apache.org/\n[MSDN subscriber benefits]: https://azure.microsoft.com/pricing/member-offers/msdn-benefits-details/\n[Spring Boot]: https://spring.io/projects/spring-boot/\n[Spring Boot on Docker Getting Started]: https://github.com/spring-guides/gs-spring-boot-docker\n[Spring Framework]: https://spring.io/\n[Configuring Service Accounts for Pods]: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/\n[Namespaces]: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/\n[Pulling an Image from a Private Registry]: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/\n\n[Java Development Kit (JDK)]: ../fundamentals/java-support-on-azure.md\n<!-- http://www.oracle.com/technetwork/java/javase/downloads/ -->\n\n<!-- Newly added -->\n[Authenticate with Azure Container Registry from Azure Kubernetes Service]: /azure/container-registry/container-registry-auth-aks/\n[Visual Studio Code Java Tutorials]: https://code.visualstudio.com/docs/java/java-kubernetes/\n[Get started on Azure Dev Spaces with Java]: /azure/dev-spaces/get-started-java\n<!-- IMG List -->\n\n[SB01]: media/deploy-spring-boot-java-app-on-kubernetes/SB01.png\n[SB02]: media/deploy-spring-boot-java-app-on-kubernetes/SB02.png\n"
  },
  {
    "path": "articles/java/spring-framework/deploy-spring-boot-java-app-on-linux.md",
    "content": "---\ntitle: Deploy a Spring Boot Web App to Linux on Azure App Service\ndescription: This tutorial walks you though the steps to deploy a Spring Boot application as a Linux web app on Microsoft Azure.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: install-set-up-deploy\nms.custom: mvc, devx-track-java, spring-cloud-azure, devx-track-extended-java, linux-related-content\n---\n\n# Deploy a Spring Boot application to Linux on Azure App Service\n\nThis tutorial walks through using [Docker] to containerize your [Spring Boot] application and deploy your own docker image to a Linux host in the [Azure App Service](/azure/app-service/containers/app-service-linux-intro).\n\n## Prerequisites\n\nIn order to complete the steps in this tutorial, you need to have the following prerequisites:\n\n* An Azure subscription; if you don't already have an Azure subscription, you can activate your [MSDN subscriber benefits] or sign up for a [free Azure account].\n* The [Azure Command-Line Interface (CLI)].\n* A supported Java Development Kit (JDK). For more information about the JDKs available for use when developing on Azure, see [Java support on Azure and Azure Stack](../fundamentals/java-support-on-azure.md).\n* [Apache Maven] build tool (Version 3).\n* A [Git] client.\n* A [Docker] client.\n\n> [!NOTE]\n>\n> Due to the virtualization requirements of this tutorial, you cannot follow the steps in this article on a virtual machine; you must use a physical computer with virtualization features enabled.\n\n## Create the Spring Boot on Docker Getting Started web app\n\nThe following steps walk through the steps that are required to create a simple Spring Boot web application and test it locally.\n\n1. Open a command-prompt and create a local directory to hold your application, and change to that directory; for example:\n\n   ```bash\n   mkdir SpringBoot\n   cd SpringBoot\n   ```\n\n1. Clone the [Spring Boot on Docker Getting Started] sample project into the directory you created; for example:\n\n   ```bash\n   git clone https://github.com/spring-guides/gs-spring-boot-docker.git\n   ```\n\n1. Change directory to the completed project; for example:\n\n   ```bash\n   cd gs-spring-boot-docker/complete\n   ```\n\n1. Build the JAR file using Maven; for example:\n\n   ```bash\n   mvn package\n   ```\n\n1. Once the web app has been created, change directory to the `target` directory where the JAR file is located and start the web app; for example:\n\n   ```bash\n   cd target\n   java -jar spring-boot-docker-complete-0.0.1-SNAPSHOT.jar --server.port=80\n   ```\n\n1. Test the web app by browsing to it locally using a web browser. For example, if you have curl available and you configured the Tomcat server to run on port 80:\n\n   ```bash\n   curl http://localhost\n   ```\n\n1. You should see the following message displayed: **Hello Docker World**\n\n   ![Browse Sample App Locally][SB01]\n\n## Create an Azure Container Registry to use as a Private Docker Registry\n\nThe following steps walk through using the Azure portal to create an Azure Container Registry.\n\n> [!NOTE]\n>\n> If you want to use the Azure CLI instead of the Azure portal, follow the steps in [Create a private Docker container registry using the Azure CLI 2.0](/azure/container-registry/container-registry-get-started-azure-cli).\n\n1. Browse to the [Azure portal] and sign in.\n\n   Once you've signed in to your account on the Azure portal, follow the steps in the [Create a private Docker container registry using the Azure portal] article, which are paraphrased in the following steps for the sake of expediency.\n\n1. Click the menu icon for **New**, select **Containers**, and then select **Azure Container Registry**.\n\n   ![Create a new Azure Container Registry][AR01]\n\n1. When the **Create container registry** page is displayed, enter **Registry name**, **Subscription**, **Resource group**, and **Location**. Then select **Create**.\n\n   ![Configure Azure Container Registry settings][AR03]\n\n1. Select **Access keys** under **Settings** and turn on the **Enabled** switch behind the **Admin user**.\n\n   ![Enable admin user UI in the Azure portal][enable-admin-user-for-containter-register]\n\n## Configure Maven to build image to your Azure Container Registry\n\n1. Navigate to the completed project directory for your Spring Boot application - for example, **C:\\SpringBoot\\gs-spring-boot-docker\\complete** or **/users/robert/SpringBoot/gs-spring-boot-docker/complete** - and open the **pom.xml** file with a text editor.\n\n1. Update the `<properties>` collection in the **pom.xml** file with the latest version of [`jib-maven-plugin`](https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin), login server value, and access settings for your Azure Container Registry from the previous section of this tutorial. For example:\n\n   ```xml\n   <properties>\n      <jib-maven-plugin.version>3.2.0</jib-maven-plugin.version>\n      <docker.image.prefix>wingtiptoysregistry.azurecr.io</docker.image.prefix>\n      <java.version>1.8</java.version>\n   </properties>\n   ```\n\n1. Add [`jib-maven-plugin`](https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin) to the `<plugins>` collection in the **pom.xml** file.  This example uses version 3.2.0.\n\n   Specify the base image at `<from>/<image>`, here `mcr.microsoft.com/openjdk/jdk:11-ubuntu`. Specify the name of the final image to be built from the base in `<to>/<image>`.  \n\n   Authentication `{docker.image.prefix}` is the **Login server** on the registry page shown previously. The `{project.artifactId}` is the name and version number of the JAR file from the first Maven build of the project.\n\n   ```xml\n   <plugin>\n     <artifactId>jib-maven-plugin</artifactId>\n     <groupId>com.google.cloud.tools</groupId>\n     <version>${jib-maven-plugin.version}</version>\n     <configuration>\n        <from>\n            <image>mcr.microsoft.com/openjdk/jdk:11-ubuntu</image>\n        </from>\n        <to>\n            <image>${docker.image.prefix}/${project.artifactId}</image>\n        </to>\n     </configuration>\n   </plugin>\n   ```\n\n1. Navigate to the completed project directory for your Spring Boot application and run the following command to rebuild the application and push the container to your Azure Container Registry:\n\n   ```azurecli\n   az acr login --name wingtiptoysregistry && mvn compile jib:build\n   ```\n\n> [!NOTE]\n> The command `az acr login ...` will try to login to Azure Container Registry, otherwise you need to provide `<username>` and `<password>` for jib-maven-plugin, see [Authentication Methods](https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin#authentication-methods)  in jib.\n>\n> When you're using Jib to push your image to the Azure Container Registry, the image won't use the Dockerfile. See [this](https://cloudplatform.googleblog.com/2018/07/introducing-jib-build-java-docker-images-better.html) document for details.\n\n## Create a web app on Linux on Azure App Service using your container image\n\n1. Browse to the [Azure portal] and sign in.\n\n1. Click the menu icon for **Create a resource**, select **Compute**, and then select **Web App**.\n\n   ![Create a new web app in the Azure portal][LX01]\n\n1. When the **Web App on Linux** page is displayed, enter the following information:\n\n   * Choose your **Subscription** from the drop-down list.\n\n   * Choose an existing **Resource Group**, or specify a name to create a new resource group.\n\n   * Enter a unique name for the **App name**; for example: **wingtiptoyslinux**\n\n   * Specify `Docker Container` to **Publish**.\n\n   * For the **Operating System** field, choose **Linux**.\n\n   * Select **Region**.\n\n   * Accept **Linux Plan** and choose an existing **App Service Plan**, or select **Create new** to create a new app service plan.\n\n   * Click **Next: Docker**.\n\n   ![Click the Next: Docker button to proceed.][LX02]\n\n      On the **Web App** page select **Docker**, and enter the following information:\n\n   * Select **Single Container**.\n\n   * **Registry**: Choose your container, for example: **wingtiptoysregistry**.\n\n   * **Image**: Select the image created previously, for example: **spring-boot-docker**.\n\n   * **Tag**: Choose the tag for the image, for example: **latest**.\n\n   * **Startup Command**: Keep it blank since the image already has the start up command\n\n   After you've entered all of the above information, select **Review + create**.\n\n   ![Finish by selecting Review + Create.][LX02-A]\n\n   * Select **Review + create**.\n\nReview the information and select **Create**.\n\nWhen the deployment is complete, select **Go to resource**.  The deployment page displays the URL to access the application.\n\n   ![Get URL of deployment][LX02-B]\n\n> [!NOTE]\n>\n> Azure will automatically map Internet requests to embedded Tomcat server that is running on the port - 80. However, if you configured your embedded Tomcat server to run on port - 8080 or custom port, you need to add an environment variable to your web app that defines the port for your embedded Tomcat server. To do so, use the following steps:\n>\n> 1. Browse to the [Azure portal] and sign in.\n>\n> 2. Select the icon for **Web Apps**, and select your app from the **App Services** page.\n>\n> 3. Select **Configuration** in the left navigation pane.\n>\n> 4. In the **Application settings** section, add a new setting named **WEBSITES_PORT** and enter your custom port number for the value.\n>\n> 5. Select **OK**. Then select **Save**.\n>\n> ![Saving a custom port number in the Azure portal][LX03]\n\n<!--\n##  OPTIONAL: Configure the embedded Tomcat server to run on a different port\n\nThe embedded Tomcat server in the sample Spring Boot application is configured to run on port 8080 by default. However, if you want to run the embedded Tomcat server to run on a different port, such as port 80 for local testing, you can configure the port by using the following steps.\n\n1. Go to the **resources** directory (or create the directory if it does not exist); for example:\n\n   ```bash\n   cd src/main/resources\n   ```\n\n1. Open the **application.yml** file in a text editor if it exists, or create a new YAML file if it does not exist.\n\n1. Modify the **server** setting so that the server runs on port 80; for example:\n\n   ```yaml\n   server:\n      port: 80\n   ```\n\n1. Save and close the **application.yml** file.\n-->\n\n## Clean up resources\n\nWhen no longer needed, use the [Azure portal](https://portal.azure.com/) to delete the resources created in this article to avoid unexpected charges.\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Spring on Azure](./index.yml)\n\n### See also\n\nFor more information about using Spring Boot applications on Azure, see the following articles:\n\n* [Deploy a Spring Boot Application on a Kubernetes Cluster in the Azure Container Service](deploy-spring-boot-java-app-on-kubernetes.md)\n\nFor more information about using Azure with Java, see the [Azure for Java Developers] and the [Working with Azure DevOps and Java].\n\nFor further details about the Spring Boot on Docker sample project, see [Spring Boot on Docker Getting Started].\n\nFor help with getting started with your own Spring Boot applications, see the **Spring Initializr** at https://start.spring.io/.\n\nFor more information about getting started with creating a simple Spring Boot application, see the Spring Initializr at https://start.spring.io/.\n\nFor additional examples for how to use custom Docker images with Azure, see [Using a custom Docker image for Azure Web App on Linux].\n\n<!-- URL List -->\n\n[Azure Command-Line Interface (CLI)]: /cli/azure/overview\n[Azure Container Service (AKS)]: https://azure.microsoft.com/services/container-service/\n[Azure for Java Developers]: ../index.yml\n[Azure portal]: https://portal.azure.com/\n[Create a private Docker container registry using the Azure portal]: /azure/container-registry/container-registry-get-started-portal\n[Using a custom Docker image for Azure Web App on Linux]: /azure/app-service/tutorial-custom-container\n[Docker]: https://www.docker.com/\n[free Azure account]: https://azure.microsoft.com/pricing/free-trial/\n[Git]: https://github.com/\n[Working with Azure DevOps and Java]: /azure/devops-project/azure-devops-project-java\n[Apache Maven]: http://maven.apache.org/\n[MSDN subscriber benefits]: https://azure.microsoft.com/pricing/member-offers/msdn-benefits-details/\n[Spring Boot]: https://spring.io/projects/spring-boot/\n[Spring Boot on Docker Getting Started]: https://github.com/spring-guides/gs-spring-boot-docker\n[Spring Framework]: https://spring.io/\n\n[Java Development Kit (JDK)]: ../fundamentals/java-support-on-azure.md\n<!-- http://www.oracle.com/technetwork/java/javase/downloads/ -->\n\n<!-- IMG List -->\n\n[SB01]: media/deploy-spring-boot-java-app-on-linux/SB01.png\n[AR01]: media/deploy-spring-boot-java-app-on-linux/AR01.png\n[AR03]: media/deploy-spring-boot-java-app-on-linux/AR03.png\n[enable-admin-user-for-containter-register]: media/deploy-spring-boot-java-app-on-linux/enable-admin-user-for-containter-register.png\n[LX01]: media/deploy-spring-boot-java-app-on-linux/LX01.png\n[LX02]: media/deploy-spring-boot-java-app-on-linux/LX02.png\n[LX02-A]: media/deploy-spring-boot-java-app-on-linux/LX02-A.png\n[LX02-B]: media/deploy-spring-boot-java-app-on-linux/LX02-B.png\n[LX03]: media/deploy-spring-boot-java-app-on-linux/LX03.png\n"
  },
  {
    "path": "articles/java/spring-framework/developer-guide-overview.md",
    "content": "---\ntitle: Spring Cloud Azure overview\ndescription: This reference doc contains Spring Cloud Azure overview.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure developer guide\n\nSpring is an open-source application framework developed by VMware that provides a simplified, modular approach for creating Java applications. Spring Cloud Azure is an open-source project that provides seamless Spring integration with Azure.\n\nFor more information about supported versions, see [Spring Versions Mapping](https://github.com/Azure/azure-sdk-for-java/wiki/Spring-Versions-Mapping).\n\n## Get help\n\nIf you have any questions about this documentation, create a GitHub issue in one of the following GitHub repositories. Pull requests are also welcome.\n\n| GitHub repositories                                                                                   | Description                                |\n|-------------------------------------------------------------------------------------------------------|--------------------------------------------|\n| [`Azure/azure-sdk-for-java`](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring)          | This repository holds the source code.     |\n| [`Azure-Samples/azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples) | This repository holds the related samples. |\n| [MicrosoftDocs/azure-dev-docs](https://github.com/MicrosoftDocs/azure-dev-docs)                       | This repository holds the documentation.   |\n\n## Getting started\n\n### Setting up dependencies\n\n#### Bill of materials (BOM)\n\nIf you use Maven, add the BOM to your **pom.xml** file in the `dependencyManagement` section, as shown in the following example. When you use the BOM, you don't have to specify versions for any of the Maven dependencies because versioning is delegated to the BOM.\n\n```xml\n<dependencyManagement>\n  <dependencies>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-dependencies</artifactId>\n      <version>7.2.0</version>\n      <type>pom</type>\n      <scope>import</scope>\n    </dependency>\n  </dependencies>\n</dependencyManagement>\n```\n\nWith Gradle, you can import the `spring-cloud-azure-dependencies` BOM in the following ways:\n\n* Use Gradle's native BOM support by adding dependencies as shown in the following example:\n\n  ```kotlin\n  import org.springframework.boot.gradle.plugin.SpringBootPlugin\n\n  plugins {\n    id(\"java\")\n    id(\"org.springframework.boot\") version \"4.0.1\"\n  }\n\n  dependencies {\n      implementation(platform(SpringBootPlugin.BOM_COORDINATES))\n      implementation(platform(\"com.azure.spring:spring-cloud-azure-dependencies:{version}\"))\n  }\n  ```\n\n* Use the `io.spring.dependency-management` plugin and import the BOM in `dependencyManagement`, as shown in the following example:\n\n  ```kotlin\n  plugins {\n      id(\"io.spring.dependency-management\") version \"1.1.7\"\n  }\n\n  dependencyManagement {\n      imports {\n          mavenBom(\"com.azure.spring:spring-cloud-azure-dependencies:{version}\")\n      }\n  }\n  ```\n\nFor more information, see [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/).\n\n[!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n#### Starter dependencies\n\nSpring Cloud Azure Starters are a set of convenient dependency descriptors to include in your application. Each starter contains all the dependencies and transitive dependencies needed to begin using their corresponding Spring Cloud Azure module. These starters boost your Spring Boot application development with Azure services.\n\nFor example, if you want to get started using Spring and Azure Cosmos DB for data persistence, include the `spring-cloud-azure-starter-cosmos` dependency in your project.\n\nThe following table lists application starters provided by Spring Cloud Azure under the `com.azure.spring` group:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                                   | Description                                                                             |\n> |--------------------------------------------------------|-----------------------------------------------------------------------------------------|\n> | `spring-cloud-azure-starter`                             | The core starter, including auto-configuration support.                                 |\n> | `spring-cloud-azure-starter-active-directory`            | The starter for using Microsoft Entra ID with Spring Security.                          |\n> | `spring-cloud-azure-starter-active-directory-b2c`        | The starter for using Azure Active Directory B2C with Spring Security.                  |\n> | `spring-cloud-azure-starter-appconfiguration`            | The starter for using Azure App Configuration.                                          |\n> | `spring-cloud-azure-starter-appconfiguration-config`     | The starter for using Azure App Configuration Config.                                   |\n> | `spring-cloud-azure-starter-cosmos`                      | The starter for using Azure Cosmos DB.                                                  |\n> | `spring-cloud-azure-starter-eventhubs`                   | The starter for using Azure Event Hubs.                                                 |\n> | `spring-cloud-azure-starter-eventgrid`                   | The starter for using Azure Event Grid.                                                 |\n> | `spring-cloud-azure-starter-keyvault`                    | The starter for using Azure Key Vault.                                                  |\n> | `spring-cloud-azure-starter-keyvault-secrets`            | The starter for using Azure Key Vault Secrets.                                          |\n> | `spring-cloud-azure-starter-keyvault-jca`                | The starter for using Azure Key Vault JCA.                                              |\n> | `spring-cloud-azure-starter-keyvault-certificates`       | The starter for using Azure Key Vault Certificates.                                     |\n> | `spring-cloud-azure-starter-servicebus`                  | The starter for using Azure Service Bus.                                                |\n> | `spring-cloud-azure-starter-servicebus-jms`              | The starter for using Azure Service Bus and JMS.                                        |\n> | `spring-cloud-azure-starter-storage`                     | The starter for using Azure Storage.                                                    |\n> | `spring-cloud-azure-starter-storage-blob`                | The starter for using Azure Storage Blob.                                               |\n> | `spring-cloud-azure-starter-storage-file-share`          | The starter for using Azure Storage File Share.                                         |\n> | `spring-cloud-azure-starter-storage-queue`               | The starter for using Azure Storage Queue.                                              |\n> | `spring-cloud-azure-starter-actuator`                    | The starter for using Spring Boot's Actuator, which provides production ready features. |\n\nThe following table lists starters for Spring Data support:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                   | Description                                            |\n> |----------------------------------------|--------------------------------------------------------|\n> | `spring-cloud-azure-starter-data-cosmos` | The starter for using Spring Data for Azure Cosmos DB. |\n\nThe following table lists starters for Spring Data Redis support:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                          | Description                                                               |\n> |-----------------------------------------------|---------------------------------------------------------------------------|\n> | `spring-cloud-azure-starter-data-redis-lettuce` | The starter for using Spring Data and Azure Cache for Redis with Lettuce. |\n\nThe following table lists starters for Spring Integration support:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                                 | Description                                                       |\n> |------------------------------------------------------|-------------------------------------------------------------------|\n> | `spring-cloud-azure-starter-integration-eventhubs`     | The starter for using Azure Event Hubs and Spring Integration.    |\n> | `spring-cloud-azure-starter-integration-servicebus`    | The starter for using Azure Service Bus and Spring Integration.   |\n> | `spring-cloud-azure-starter-integration-storage-queue` | The starter for using Azure Storage Queue and Spring Integration. |\n\nThe following table lists starters for Spring Cloud Stream support:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                         | Description                                                             |\n> |----------------------------------------------|-------------------------------------------------------------------------|\n> | `spring-cloud-azure-starter-stream-eventhubs`  | The starter for using Azure Event Hubs and Spring Cloud Stream Binder.  |\n> | `spring-cloud-azure-starter-stream-servicebus` | The starter for using Azure Service Bus and Spring Cloud Stream Binder. |\n\nThe following table lists starters for MySQL support:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                         | Description                                                                         |\n> |----------------------------------------------|-------------------------------------------------------------------------------------|\n> | `spring-cloud-azure-starter-jdbc-mysql`        | The starter for using Azure MySQLs and JDBC through Microsoft Entra authentication. |\n\nThe following table lists starters for PostgreSQL support:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                         | Description                                                                             |\n> |----------------------------------------------|-----------------------------------------------------------------------------------------|\n> | `spring-cloud-azure-starter-jdbc-postgresql`   | The starter for using Azure PostgreSQL and JDBC through Microsoft Entra authentication. |\n\n### Learning Spring Cloud Azure\n\nFor a full list of samples that show usage, see [Spring Cloud Azure Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main).\n\n## What's new in 4.0 since 3.10.x\n\nThis documentation covers changes made in 4.0 since 3.10. This major release brings better security, leaner dependencies, support for production readiness, and more.\n\n> [!TIP]\n> For more information on migrating to 4.0, see [Migration guide for 4.0](migration-guide-for-4.0.md).\n\nThe following list summarizes some of the changes that Spring Cloud Azure 4.0 provides:\n\n* A unified development experience, with unified project name, artifact ID, and properties.\n* Simplified dependency management using a single `spring-cloud-azure-dependencies` BOM.\n* Expanded Azure support on [Spring Initializr](https://start.spring.io) to cover Kafka, Event Hubs, Azure Cache for Redis, and Azure App Configuration.\n* Rearchitected Spring module dependencies to remove excess layers and entanglement.\n* Managed Identity support for Azure App Configuration, Event Hubs, Service Bus, Azure Cosmos DB, Key Vault, Storage Blob, and Storage Queue.\n* Continued support for authentication methods in the underlying Azure SDK from our Spring libraries, such as SAS token and token credential authentication with Service Bus and Event Hubs.\n* Credential chain is now enabled by default, enabling applications to obtain credentials from application properties, environment variables, managed identity, IDEs, and so on. For more information, see the [DefaultAzureCredential](/java/api/overview/azure/identity-readme#defaultazurecredential) section of [Azure Identity client library for Java](/java/api/overview/azure/identity-readme).\n* Granular access control at the resource level (such as Service Bus queue) to enable better security governance and adherence to IT policies.\n* More options exposed in a Spring-idiomatic way through improved auto-configuration coverage of Azure SDK clients for both synchronous and asynchronous scenarios.\n* Added health indicators for Azure App Configuration, Event Hubs, Azure Cosmos DB, Key Vault, Storage Blob, Storage Queue, and Storage File.\n* Spring Cloud Sleuth support for all HTTP-based Azure SDKs.\n"
  },
  {
    "path": "articles/java/spring-framework/docker-compose-support.md",
    "content": "---\ntitle: Spring Cloud Azure support for Docker Compose\ndescription: Describes how to integrate Spring Cloud Azure with Docker Compose to write effective integration tests for your applications.\nms.date: 03/18/2026\nauthor: KarlErickson\nms.author: karler\nms.reviewer: rujche\nms.topic: reference\nms.custom: devx-track-java\nappliesto:\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure support for Docker Compose\n\nThis article describes how to integrate Spring Cloud Azure with [Docker Compose](https://docs.docker.com/compose/) to write effective integration tests for your applications.\n\n*Docker Compose* is a tool for defining and running multi-container applications. It's the key to unlocking a streamlined and efficient development and deployment experience.\n\nThe `spring-cloud-azure-docker-compose` library now supports integration testing for the following Azure services:\n\n- [Azure Blob Storage](https://azure.microsoft.com/products/storage/blobs/)\n- [Azure Queue Storage](https://azure.microsoft.com/products/storage/queues/)\n- [Azure Event Hubs](https://azure.microsoft.com/products/event-hubs/)\n- [Azure Service Bus](https://azure.microsoft.com/products/service-bus/)\n\n## Service connections\n\nA service connection is a connection to any remote service. Spring Boot's autoconfiguration can consume the details of a service connection and use them to establish a connection to a remote service. When doing so, the connection details take precedence over any connection-related configuration properties.\n\nWhen you use Docker compose, you can automatically create connection details for a service running in a container by adding the `@SpringBootTest` annotation with the `spring.docker.compose.file` property in the test class.\n\nThe `xxxDockerComposeConnectionDetailsFactory` classes are registered with `spring.factories`. These factories create a `ConnectionDetails` bean based on a `DockerComposeConnectionDetails`.\n\nThe following table provides information about the connection details factory classes supported in the `spring-cloud-azure-docker-compose` JAR:\n\n| Connection details factory class                    | Connection details bean              |\n|-----------------------------------------------------|--------------------------------------|\n| `StorageBlobDockerComposeConnectionDetailsFactory`  | `AzureStorageBlobConnectionDetails`  |\n| `StorageQueueDockerComposeConnectionDetailsFactory` | `AzureStorageQueueConnectionDetails` |\n| `EventHubsDockerComposeConnectionDetailsFactory`    | `AzureEventHubsConnectionDetails`    |\n| `ServiceBusDockerComposeConnectionDetailsFactory`   | `AzureServiceBusConnectionDetails`   |\n\n## Set up dependencies\n\nThe following configuration sets up the required dependencies:\n\n### [Blob Storage](#tab/test-for-storage-blob)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-starter-storage-blob</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-docker-compose</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n### [Queue Storage](#tab/test-for-storage-queue)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-starter-storage-queue</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-docker-compose</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n### [Event Hubs](#tab/test-for-event-hubs)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-starter-eventhubs</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-docker-compose</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n### [Event Hubs Binder](#tab/test-for-event-hubs-binder)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.azure</groupId>\n      <artifactId>azure-messaging-eventhubs</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-stream-binder-eventhubs</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-docker-compose</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n### [Service Bus](#tab/test-for-service-bus)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-messaging-azure-servicebus</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-starter</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-docker-compose</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n### [Service Bus Binder](#tab/test-for-service-bus-binder)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-stream-binder-servicebus</artifactId>\n    </dependency>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-autoconfigure</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-docker-compose</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n---\n\n## Create test resource files\n\nCreate these files in the `src/test/resources` folder:\n\n### [Blob Storage](#tab/test-for-storage-blob)\n\n`storage-compose.yaml`:\n\n```yaml\nservices:\n  storage:\n    image: mcr.microsoft.com/azure-storage/azurite:latest\n    ports:\n      - '10000'\n      - '10001'\n      - '10002'\n    command: azurite -l /data --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --skipApiVersionCheck\n```\n\n### [Queue Storage](#tab/test-for-storage-queue)\n\n`storage-compose.yaml`:\n\n```yaml\nservices:\n  storage:\n    image: mcr.microsoft.com/azure-storage/azurite:latest\n    ports:\n      - '10000'\n      - '10001'\n      - '10002'\n    command: azurite -l /data --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --skipApiVersionCheck\n```\n\n### [Event Hubs](#tab/test-for-event-hubs)\n\n`eventhubs-compose.yaml`:\n\n```yaml\nservices:\n  eventhubs:\n    image: mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest\n    pull_policy: always\n    volumes:\n      # Mount the emulator configuration to the path expected by the emulator image\n      - \"./Config.json:/Eventhubs_Emulator/ConfigFiles/Config.json\"\n    ports:\n      - \"5672\"\n    environment:\n      # Event Hubs emulator requires external blob/metadata storage provided by azurite\n      BLOB_SERVER: azurite\n      METADATA_SERVER: azurite\n      ACCEPT_EULA: Y\n    depends_on:\n      - azurite\n    networks:\n      eh-emulator:\n        aliases:\n          - \"eh-emulator\"\n\n  azurite:\n    image: \"mcr.microsoft.com/azure-storage/azurite:latest\"\n    ports:\n      - \"10000\"\n      - \"10001\"\n      - \"10002\"\n    networks:\n      eh-emulator:\n        aliases:\n          - \"azurite\"\n\nnetworks:\n  eh-emulator:\n```\n\n`Config.json`:\n\n```json\n{\n  \"UserConfig\": {\n    \"NamespaceConfig\": [\n      {\n        \"Type\": \"EventHub\",\n        \"Name\": \"emulatorns1\",\n        \"Entities\": [\n          {\n            \"Name\": \"eh1\",\n            \"PartitionCount\": \"2\",\n            \"ConsumerGroups\": []\n          }\n        ]\n      }\n    ],\n    \"LoggingConfig\": {\n      \"Type\": \"File\"\n    }\n  }\n}\n```\n\n### [Event Hubs Binder](#tab/test-for-event-hubs-binder)\n\n`eventhubs-compose.yaml`:\n\n```yaml\nservices:\n  eventhubs:\n    image: mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest\n    pull_policy: always\n    volumes:\n      # Mount the emulator configuration to the path expected by the emulator image\n      - \"./Config.json:/Eventhubs_Emulator/ConfigFiles/Config.json\"\n    ports:\n      - \"5672\"\n    environment:\n      # Event Hubs emulator requires external blob/metadata storage provided by azurite\n      BLOB_SERVER: azurite\n      METADATA_SERVER: azurite\n      ACCEPT_EULA: Y\n    depends_on:\n      - azurite\n    networks:\n      eh-emulator:\n        aliases:\n          - \"eh-emulator\"\n\n  azurite:\n    image: \"mcr.microsoft.com/azure-storage/azurite:latest\"\n    command: \"azurite -l /data --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --skipApiVersionCheck\"\n    ports:\n      - \"10000\"\n      - \"10001\"\n      - \"10002\"\n    networks:\n      eh-emulator:\n        aliases:\n          - \"azurite\"\n\nnetworks:\n  eh-emulator:\n```\n\n`Config.json`:\n\n```json\n{\n  \"UserConfig\": {\n    \"NamespaceConfig\": [\n      {\n        \"Type\": \"EventHub\",\n        \"Name\": \"emulatorns1\",\n        \"Entities\": [\n          {\n            \"Name\": \"eh1\",\n            \"PartitionCount\": \"2\",\n            \"ConsumerGroups\": []\n          }\n        ]\n      }\n    ],\n    \"LoggingConfig\": {\n      \"Type\": \"File\"\n    }\n  }\n}\n```\n\n### [Service Bus](#tab/test-for-service-bus)\n\n`servicebus-compose.yaml`:\n\n```yaml\nservices:\n  servicebus:\n    image: mcr.microsoft.com/azure-messaging/servicebus-emulator:latest\n    pull_policy: always\n    volumes:\n      - \"./Config.json:/ServiceBus_Emulator/ConfigFiles/Config.json\"\n    ports:\n      - \"5672\"\n    environment:\n      SQL_SERVER: sqledge\n      MSSQL_SA_PASSWORD: A_Str0ng_Required_Password\n      ACCEPT_EULA: Y\n    depends_on:\n      - sqledge\n    networks:\n      sb-emulator:\n        aliases:\n          - \"sb-emulator\"\n  sqledge:\n    image: \"mcr.microsoft.com/azure-sql-edge:latest\"\n    networks:\n      sb-emulator:\n        aliases:\n          - \"sqledge\"\n    environment:\n      ACCEPT_EULA: Y\n      MSSQL_SA_PASSWORD: A_Str0ng_Required_Password\n\nnetworks:\n  sb-emulator:\n```\n\n`Config.json`:\n\n```json\n{\n  \"UserConfig\": {\n    \"Namespaces\": [\n      {\n        \"Name\": \"sbemulatorns\",\n        \"Queues\": [\n          {\n            \"Name\": \"queue.1\",\n            \"Properties\": {\n              \"DeadLetteringOnMessageExpiration\": false,\n              \"DefaultMessageTimeToLive\": \"PT1H\",\n              \"DuplicateDetectionHistoryTimeWindow\": \"PT20S\",\n              \"ForwardDeadLetteredMessagesTo\": \"\",\n              \"ForwardTo\": \"\",\n              \"LockDuration\": \"PT1M\",\n              \"MaxDeliveryCount\": 10,\n              \"RequiresDuplicateDetection\": false,\n              \"RequiresSession\": false\n            }\n          }\n        ],\n\n        \"Topics\": [\n          {\n            \"Name\": \"topic.1\",\n            \"Properties\": {\n              \"DefaultMessageTimeToLive\": \"PT1H\",\n              \"DuplicateDetectionHistoryTimeWindow\": \"PT20S\",\n              \"RequiresDuplicateDetection\": false\n            },\n            \"Subscriptions\": [\n              {\n                \"Name\": \"subscription.1\",\n                \"Properties\": {\n                  \"DeadLetteringOnMessageExpiration\": false,\n                  \"DefaultMessageTimeToLive\": \"PT1H\",\n                  \"LockDuration\": \"PT1M\",\n                  \"MaxDeliveryCount\": 10,\n                  \"ForwardDeadLetteredMessagesTo\": \"\",\n                  \"ForwardTo\": \"\",\n                  \"RequiresSession\": false\n                },\n                \"Rules\": [\n                  {\n                    \"Name\": \"app-prop-filter-1\",\n                    \"Properties\": {\n                      \"FilterType\": \"Correlation\",\n                      \"CorrelationFilter\": {\n                        \"ContentType\": \"application/text\",\n                        \"CorrelationId\": \"id1\",\n                        \"Label\": \"subject1\",\n                        \"MessageId\": \"msgid1\",\n                        \"ReplyTo\": \"someQueue\",\n                        \"ReplyToSessionId\": \"sessionId\",\n                        \"SessionId\": \"session1\",\n                        \"To\": \"xyz\"\n                      }\n                    }\n                  }\n                ]\n              },\n              {\n                \"Name\": \"subscription.2\",\n                \"Properties\": {\n                  \"DeadLetteringOnMessageExpiration\": false,\n                  \"DefaultMessageTimeToLive\": \"PT1H\",\n                  \"LockDuration\": \"PT1M\",\n                  \"MaxDeliveryCount\": 10,\n                  \"ForwardDeadLetteredMessagesTo\": \"\",\n                  \"ForwardTo\": \"\",\n                  \"RequiresSession\": false\n                },\n                \"Rules\": [\n                  {\n                    \"Name\": \"user-prop-filter-1\",\n                    \"Properties\": {\n                      \"FilterType\": \"Correlation\",\n                      \"CorrelationFilter\": {\n                        \"Properties\": {\n                          \"prop3\": \"value3\"\n                        }\n                      }\n                    }\n                  }\n                ]\n              },\n              {\n                \"Name\": \"subscription.3\",\n                \"Properties\": {\n                  \"DeadLetteringOnMessageExpiration\": false,\n                  \"DefaultMessageTimeToLive\": \"PT1H\",\n                  \"LockDuration\": \"PT1M\",\n                  \"MaxDeliveryCount\": 10,\n                  \"ForwardDeadLetteredMessagesTo\": \"\",\n                  \"ForwardTo\": \"\",\n                  \"RequiresSession\": false\n                }\n              }\n            ]\n          }\n        ]\n      }\n    ],\n    \"Logging\": {\n      \"Type\": \"File\"\n    }\n  }\n}\n```\n\n### [Service Bus Binder](#tab/test-for-service-bus-binder)\n\n`servicebus-compose.yaml`:\n\n```yaml\nservices:\n  servicebus:\n    image: mcr.microsoft.com/azure-messaging/servicebus-emulator:latest\n    pull_policy: always\n    volumes:\n      - \"./Config.json:/ServiceBus_Emulator/ConfigFiles/Config.json\"\n    ports:\n      - \"5672\"\n    environment:\n      SQL_SERVER: sqledge\n      MSSQL_SA_PASSWORD: A_Str0ng_Required_Password\n      ACCEPT_EULA: Y\n    depends_on:\n      - sqledge\n    networks:\n      sb-emulator:\n        aliases:\n          - \"sb-emulator\"\n  sqledge:\n    image: \"mcr.microsoft.com/azure-sql-edge:latest\"\n    networks:\n      sb-emulator:\n        aliases:\n          - \"sqledge\"\n    environment:\n      ACCEPT_EULA: Y\n      MSSQL_SA_PASSWORD: A_Str0ng_Required_Password\n\nnetworks:\n  sb-emulator:\n```\n\n`Config.json`:\n\n```json\n{\n  \"UserConfig\": {\n    \"Namespaces\": [\n      {\n        \"Name\": \"sbemulatorns\",\n        \"Queues\": [\n          {\n            \"Name\": \"queue.1\",\n            \"Properties\": {\n              \"DeadLetteringOnMessageExpiration\": false,\n              \"DefaultMessageTimeToLive\": \"PT1H\",\n              \"DuplicateDetectionHistoryTimeWindow\": \"PT20S\",\n              \"ForwardDeadLetteredMessagesTo\": \"\",\n              \"ForwardTo\": \"\",\n              \"LockDuration\": \"PT1M\",\n              \"MaxDeliveryCount\": 10,\n              \"RequiresDuplicateDetection\": false,\n              \"RequiresSession\": false\n            }\n          }\n        ],\n\n        \"Topics\": [\n          {\n            \"Name\": \"topic.1\",\n            \"Properties\": {\n              \"DefaultMessageTimeToLive\": \"PT1H\",\n              \"DuplicateDetectionHistoryTimeWindow\": \"PT20S\",\n              \"RequiresDuplicateDetection\": false\n            },\n            \"Subscriptions\": [\n              {\n                \"Name\": \"subscription.1\",\n                \"Properties\": {\n                  \"DeadLetteringOnMessageExpiration\": false,\n                  \"DefaultMessageTimeToLive\": \"PT1H\",\n                  \"LockDuration\": \"PT1M\",\n                  \"MaxDeliveryCount\": 10,\n                  \"ForwardDeadLetteredMessagesTo\": \"\",\n                  \"ForwardTo\": \"\",\n                  \"RequiresSession\": false\n                },\n                \"Rules\": [\n                  {\n                    \"Name\": \"app-prop-filter-1\",\n                    \"Properties\": {\n                      \"FilterType\": \"Correlation\",\n                      \"CorrelationFilter\": {\n                        \"ContentType\": \"application/text\",\n                        \"CorrelationId\": \"id1\",\n                        \"Label\": \"subject1\",\n                        \"MessageId\": \"msgid1\",\n                        \"ReplyTo\": \"someQueue\",\n                        \"ReplyToSessionId\": \"sessionId\",\n                        \"SessionId\": \"session1\",\n                        \"To\": \"xyz\"\n                      }\n                    }\n                  }\n                ]\n              },\n              {\n                \"Name\": \"subscription.2\",\n                \"Properties\": {\n                  \"DeadLetteringOnMessageExpiration\": false,\n                  \"DefaultMessageTimeToLive\": \"PT1H\",\n                  \"LockDuration\": \"PT1M\",\n                  \"MaxDeliveryCount\": 10,\n                  \"ForwardDeadLetteredMessagesTo\": \"\",\n                  \"ForwardTo\": \"\",\n                  \"RequiresSession\": false\n                },\n                \"Rules\": [\n                  {\n                    \"Name\": \"user-prop-filter-1\",\n                    \"Properties\": {\n                      \"FilterType\": \"Correlation\",\n                      \"CorrelationFilter\": {\n                        \"Properties\": {\n                          \"prop3\": \"value3\"\n                        }\n                      }\n                    }\n                  }\n                ]\n              },\n              {\n                \"Name\": \"subscription.3\",\n                \"Properties\": {\n                  \"DeadLetteringOnMessageExpiration\": false,\n                  \"DefaultMessageTimeToLive\": \"PT1H\",\n                  \"LockDuration\": \"PT1M\",\n                  \"MaxDeliveryCount\": 10,\n                  \"ForwardDeadLetteredMessagesTo\": \"\",\n                  \"ForwardTo\": \"\",\n                  \"RequiresSession\": false\n                }\n              }\n            ]\n          }\n        ]\n      }\n    ],\n    \"Logging\": {\n      \"Type\": \"File\"\n    }\n  }\n}\n```\n\n---\n\n## Create Java codes\n\nThe following code example demonstrates the basic usage of Docker compose:\n\n### [Blob Storage](#tab/test-for-storage-blob)\n\n```java\n@SpringBootTest(properties = {\n        \"spring.docker.compose.skip.in-tests=false\",\n        \"spring.docker.compose.file=classpath:storage-compose.yaml\",\n        \"spring.docker.compose.stop.command=down\"\n})\npublic class AzureBlobResourceDockerComposeTest {\n\n    @Value(\"azure-blob://testcontainers/message.txt\")\n    private Resource blobFile;\n\n    @Test\n    void blobResourceShouldWriteAndReadContent() throws IOException {\n        String originalContent = \"Hello World!\";\n        try (OutputStream os = ((WritableResource) this.blobFile).getOutputStream()) {\n            os.write(originalContent.getBytes());\n        }\n        String resultContent = StreamUtils.copyToString(this.blobFile.getInputStream(), Charset.defaultCharset());\n        assertThat(resultContent).isEqualTo(originalContent);\n    }\n\n    @Configuration(proxyBeanMethods = false)\n    @ImportAutoConfiguration(classes = {\n            AzureGlobalPropertiesAutoConfiguration.class,\n            AzureStorageBlobAutoConfiguration.class,\n            AzureStorageBlobResourceAutoConfiguration.class})\n    static class Config {\n    }\n}\n```\n\nWith `spring.docker.compose.file`, this configuration enables related beans in the app to communicate with Blob Storage running inside the Docker container. This action is done by automatically defining a `AzureStorageBlobConnectionDetails` bean, which is then used by the Blob Storage autoconfiguration, overriding any connection-related configuration properties.\n\n### [Queue Storage](#tab/test-for-storage-queue)\n\n```java\n@SpringBootTest(properties = {\n        \"spring.docker.compose.skip.in-tests=false\",\n        \"spring.docker.compose.file=classpath:storage-compose.yaml\",\n        \"spring.docker.compose.stop.command=down\",\n        \"spring.cloud.azure.storage.queue.queue-name=devstoreaccount1/tc-queue\"\n})\nclass StorageQueueDockerComposeTest {\n\n    @Autowired\n    private QueueClient queueClient;\n\n    @Test\n    void queueClientShouldSendAndReceiveMessage() {\n        String message = \"Hello World!\";\n        this.queueClient.create();\n        this.queueClient.sendMessage(message);\n        var messageItem = this.queueClient.receiveMessage();\n        assertThat(messageItem.getBody().toString()).isEqualTo(message);\n    }\n\n    @Configuration\n    @ImportAutoConfiguration(classes = {\n            AzureGlobalPropertiesAutoConfiguration.class,\n            AzureStorageQueueAutoConfiguration.class})\n    static class Config {\n    }\n\n}\n```\n\nWith `spring.docker.compose.file`, this configuration enables related beans in the app to communicate with Queue Storage running inside the Docker container. This action is done by automatically defining an `AzureStorageQueueConnectionDetails` bean, which is then used by the Queue Storage autoconfiguration, overriding any connection-related configuration properties.\n\n### [Event Hubs](#tab/test-for-event-hubs)\n\n```java\n@SpringBootTest(properties = {\n        \"spring.docker.compose.skip.in-tests=false\",\n        \"spring.docker.compose.file=classpath:eventhubs-compose.yaml\",\n        \"spring.docker.compose.stop.command=down\",\n        \"spring.docker.compose.readiness.timeout=PT5M\",\n        \"spring.cloud.azure.eventhubs.event-hub-name=eh1\",\n        \"spring.cloud.azure.eventhubs.producer.event-hub-name=eh1\"\n})\nclass EventHubsDockerComposeTest {\n\n    @Autowired\n    private AzureEventHubsConnectionDetails connectionDetails;\n\n    @Autowired\n    private EventHubProducerClient producerClient;\n\n    @Test\n    void connectionDetailsShouldBeProvidedByFactory() {\n        assertThat(connectionDetails).isNotNull();\n        assertThat(connectionDetails.getConnectionString())\n                .isNotBlank()\n                .startsWith(\"Endpoint=sb://\");\n    }\n\n    @Test\n    void producerClientCanSendMessage() {\n        // Wait for Event Hubs emulator to be fully ready and event hub entity to be available\n        waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> {\n            EventData event = new EventData(\"Hello World!\");\n            this.producerClient.send(Collections.singletonList(event));\n        });\n    }\n\n    @Configuration(proxyBeanMethods = false)\n    @ImportAutoConfiguration(classes = {\n            AzureGlobalPropertiesAutoConfiguration.class,\n            AzureEventHubsAutoConfiguration.class})\n    static class Config {\n    }\n}\n```\n\nWith `spring.docker.compose.file`, this configuration enables related beans in the app to communicate with Event Hubs running inside the Docker container. This action is done by automatically defining an `AzureEventHubsConnectionDetails` bean, which is then used by the Event Hubs autoconfiguration, overriding any connection-related configuration properties.\n\n### [Event Hubs Binder](#tab/test-for-event-hubs-binder)\n\n```java\n@SpringBootTest(properties = {\n        \"spring.docker.compose.skip.in-tests=false\",\n        \"spring.docker.compose.file=classpath:eventhubs-compose.yaml\",\n        \"spring.docker.compose.stop.command=down\",\n        \"spring.docker.compose.readiness.timeout=PT5M\",\n        \"spring.cloud.function.definition=consume;supply\",\n        \"spring.cloud.stream.bindings.consume-in-0.destination=eh1\",\n        \"spring.cloud.stream.bindings.consume-in-0.group=$Default\",\n        \"spring.cloud.stream.bindings.supply-out-0.destination=eh1\",\n        \"spring.cloud.stream.eventhubs.bindings.consume-in-0.consumer.checkpoint.mode=MANUAL\",\n        \"spring.cloud.stream.poller.fixed-delay=1000\",\n        \"spring.cloud.stream.poller.initial-delay=0\"\n})\nclass EventHubsDockerComposeTest {\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(EventHubsDockerComposeTest.class);\n    private static final Set<String> RECEIVED_MESSAGES = ConcurrentHashMap.newKeySet();\n    private static final AtomicInteger MESSAGE_SEQUENCE = new AtomicInteger(0);\n\n    @Test\n    void supplierAndConsumerShouldWorkThroughEventHub() {\n        waitAtMost(Duration.ofSeconds(120))\n                .pollDelay(Duration.ofSeconds(2))\n                .pollInterval(Duration.ofSeconds(2))\n                .untilAsserted(() -> {\n                    assertThat(RECEIVED_MESSAGES).isNotEmpty();\n                    LOGGER.info(\"✓ Test passed - Consumer received {} message(s)\", RECEIVED_MESSAGES.size());\n                });\n    }\n\n    @Configuration(proxyBeanMethods = false)\n    @EnableAutoConfiguration\n    @ImportAutoConfiguration(classes = {\n            AzureGlobalPropertiesAutoConfiguration.class,\n            AzureEventHubsAutoConfiguration.class,\n            AzureEventHubsMessagingAutoConfiguration.class})\n    static class Config {\n\n        private static final String CHECKPOINT_CONTAINER_NAME = \"eventhubs-checkpoint\";\n\n        @Bean\n        public BlobCheckpointStore blobCheckpointStore(AzureStorageBlobConnectionDetails connectionDetails) {\n            BlobServiceAsyncClient blobServiceAsyncClient = new BlobServiceClientBuilder()\n                    .connectionString(connectionDetails.getConnectionString())\n                    .buildAsyncClient();\n            BlobContainerAsyncClient containerAsyncClient = blobServiceAsyncClient\n                    .getBlobContainerAsyncClient(CHECKPOINT_CONTAINER_NAME);\n            if (Boolean.FALSE.equals(containerAsyncClient.exists().block(Duration.ofSeconds(3)))) {\n                containerAsyncClient.create().block(Duration.ofSeconds(3));\n            }\n            return new BlobCheckpointStore(containerAsyncClient);\n        }\n\n        @Bean\n        public Supplier<Message<String>> supply() {\n            return () -> {\n                int sequence = MESSAGE_SEQUENCE.getAndIncrement();\n                String payload = \"Hello world, \" + sequence;\n                LOGGER.info(\"[Supplier] Invoked - message sequence: {}\", sequence);\n                return MessageBuilder.withPayload(payload).build();\n            };\n        }\n\n        @Bean\n        public Consumer<Message<String>> consume() {\n            return message -> {\n                String payload = message.getPayload();\n                RECEIVED_MESSAGES.add(payload);\n                LOGGER.info(\"[Consumer] Received message: {}\", payload);\n\n                Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n                if (checkpointer != null) {\n                    checkpointer.success()\n                            .doOnSuccess(s -> LOGGER.info(\"[Consumer] Message checkpointed\"))\n                            .doOnError(e -> LOGGER.error(\"[Consumer] Checkpoint failed\", e))\n                            .block();\n                }\n            };\n        }\n    }\n}\n```\n\nWith `spring.docker.compose.file`, this configuration enables related beans in the app to communicate with Event Hubs running inside the Docker container. This action is done by automatically defining an `AzureEventHubsConnectionDetails` bean, which is then used by the Event Hubs autoconfiguration, overriding any connection-related configuration properties.\n\n### [Service Bus](#tab/test-for-service-bus)\n\n```java\n@SpringBootTest(properties = {\n        \"spring.docker.compose.skip.in-tests=false\",\n        \"spring.docker.compose.file=classpath:servicebus-compose.yaml\",\n        \"spring.docker.compose.stop.command=down\",\n        \"spring.docker.compose.readiness.timeout=PT5M\",\n        \"spring.cloud.azure.servicebus.namespace=sbemulatorns\",\n        \"spring.cloud.azure.servicebus.entity-name=queue.1\",\n        \"spring.cloud.azure.servicebus.entity-type=queue\",\n        \"spring.cloud.azure.servicebus.producer.entity-name=queue.1\",\n        \"spring.cloud.azure.servicebus.producer.entity-type=queue\",\n        \"spring.cloud.azure.servicebus.processor.entity-name=queue.1\",\n        \"spring.cloud.azure.servicebus.processor.entity-type=queue\"\n})\nclass ServiceBusDockerComposeTest {\n\n    @Autowired\n    private AzureServiceBusConnectionDetails connectionDetails;\n\n    @Autowired\n    private ServiceBusSenderClient senderClient;\n\n    @Autowired\n    private ServiceBusTemplate serviceBusTemplate;\n\n    @Test\n    void connectionDetailsShouldBeProvidedByFactory() {\n        assertThat(connectionDetails).isNotNull();\n        assertThat(connectionDetails.getConnectionString())\n                .isNotBlank()\n                .startsWith(\"Endpoint=sb://\");\n    }\n\n    @Test\n    void senderClientCanSendMessage() {\n        // Wait for Service Bus emulator to be fully ready and queue entity to be available\n        // The emulator depends on SQL Edge and needs time to initialize the messaging entities\n        waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> {\n            this.senderClient.sendMessage(new ServiceBusMessage(\"Hello World!\"));\n        });\n\n        waitAtMost(Duration.ofSeconds(30)).pollDelay(Duration.ofSeconds(5)).untilAsserted(() -> {\n            assertThat(Config.MESSAGES).contains(\"Hello World!\");\n        });\n    }\n\n    @Test\n    void serviceBusTemplateCanSendMessage() {\n        // Wait for Service Bus emulator to be fully ready and queue entity to be available\n        // The emulator depends on SQL Edge and needs time to initialize the messaging entities\n        waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> {\n            this.serviceBusTemplate.sendAsync(\"queue.1\",\n                    MessageBuilder.withPayload(\"Hello from ServiceBusTemplate!\").build()).block(Duration.ofSeconds(10));\n        });\n\n        waitAtMost(Duration.ofSeconds(30)).pollDelay(Duration.ofSeconds(5)).untilAsserted(() -> {\n            assertThat(Config.MESSAGES).contains(\"Hello from ServiceBusTemplate!\");\n        });\n    }\n\n    @Configuration(proxyBeanMethods = false)\n    @ImportAutoConfiguration(classes = {\n            AzureGlobalPropertiesAutoConfiguration.class,\n            AzureServiceBusAutoConfiguration.class,\n            AzureServiceBusMessagingAutoConfiguration.class})\n    static class Config {\n\n        private static final Set<String> MESSAGES = ConcurrentHashMap.newKeySet();\n\n        @Bean\n        ServiceBusRecordMessageListener processMessage() {\n            return context -> {\n                MESSAGES.add(context.getMessage().getBody().toString());\n            };\n        }\n\n        @Bean\n        ServiceBusErrorHandler errorHandler() {\n            // No-op error handler for tests: acknowledge errors without affecting test execution.\n            return (context) -> {\n            };\n        }\n    }\n}\n```\n\nWith `spring.docker.compose.file`, this configuration enables related beans in the app to communicate with Service Bus running inside the Docker container. This action is done by automatically defining an `AzureServiceBusConnectionDetails` bean, which is then used by the Service Bus autoconfiguration, overriding any connection-related configuration properties.\n\n### [Service Bus Binder](#tab/test-for-service-bus-binder)\n\n```java\n@SpringBootTest(properties = {\n        \"spring.docker.compose.skip.in-tests=false\",\n        \"spring.docker.compose.file=classpath:servicebus-compose.yaml\",\n        \"spring.docker.compose.stop.command=down\",\n        \"spring.cloud.function.definition=consume;supply\",\n        \"spring.cloud.stream.bindings.consume-in-0.destination=queue.1\",\n        \"spring.cloud.stream.bindings.supply-out-0.destination=queue.1\",\n        \"spring.cloud.stream.servicebus.bindings.consume-in-0.consumer.auto-complete=false\",\n        \"spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type=queue\",\n        \"spring.cloud.stream.poller.fixed-delay=1000\",\n        \"spring.cloud.stream.poller.initial-delay=0\"\n})\nclass ServiceBusDockerComposeTest {\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBusDockerComposeTest.class);\n    private static final Set<String> RECEIVED_MESSAGES = ConcurrentHashMap.newKeySet();\n    private static final AtomicInteger MESSAGE_SEQUENCE = new AtomicInteger(0);\n\n    @Test\n    void supplierAndConsumerShouldWorkThroughServiceBusQueue() {\n        waitAtMost(Duration.ofSeconds(60))\n                .pollDelay(Duration.ofSeconds(2))\n                .untilAsserted(() -> {\n                    assertThat(RECEIVED_MESSAGES).isNotEmpty();\n                    LOGGER.info(\"✓ Test passed - Consumer received {} message(s)\", RECEIVED_MESSAGES.size());\n                });\n    }\n\n    @Configuration(proxyBeanMethods = false)\n    @EnableAutoConfiguration\n    @ImportAutoConfiguration(classes = {\n            AzureGlobalPropertiesAutoConfiguration.class,\n            AzureServiceBusAutoConfiguration.class,\n            AzureServiceBusMessagingAutoConfiguration.class})\n    static class Config {\n\n        @Bean\n        public Supplier<Message<String>> supply() {\n            return () -> {\n                int sequence = MESSAGE_SEQUENCE.getAndIncrement();\n                String payload = \"Hello world, \" + sequence;\n                LOGGER.info(\"[Supplier] Invoked - message sequence: {}\", sequence);\n                return MessageBuilder.withPayload(payload).build();\n            };\n        }\n\n        @Bean\n        public Consumer<Message<String>> consume() {\n            return message -> {\n                String payload = message.getPayload();\n                RECEIVED_MESSAGES.add(payload);\n                LOGGER.info(\"[Consumer] Received message: {}\", payload);\n\n                Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n                if (checkpointer != null) {\n                    checkpointer.success()\n                            .doOnSuccess(s -> LOGGER.info(\"[Consumer] Message checkpointed\"))\n                            .doOnError(e -> LOGGER.error(\"[Consumer] Checkpoint failed\", e))\n                            .block();\n                }\n            };\n        }\n    }\n}\n```\n\nWith `spring.docker.compose.file`, this configuration enables related beans in the app to communicate with Service Bus running inside the Docker container. This action is done by automatically defining an `AzureServiceBusConnectionDetails` bean, which is then used by the Service Bus autoconfiguration, overriding any connection-related configuration properties.\n\n---\n\n## Samples\n\nFor more information, see the [spring-cloud-azure-docker-compose examples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/spring-cloud-azure-docker-compose).\n"
  },
  {
    "path": "articles/java/spring-framework/getting-started-with-spring-cloud-function-in-azure.md",
    "content": "---\ntitle: Spring Cloud Function in Azure\ndescription: Learn about using Spring Cloud Function in Azure.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, team=cloud_advocates, spring-cloud-azure, devx-track-extended-java\n---\n\n# Spring Cloud Function in Azure\n\nThis article guides you through using [Spring Cloud Functions](https://spring.io/projects/spring-cloud-function) to develop a Java function and publish it to Azure Functions. When you're done, your function code runs on the [Consumption Plan](/azure/azure-functions/functions-scale#consumption-plan) in Azure and can be triggered using an HTTP request.\n\n## Prerequisites\n\n- An Azure subscription. [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n\nTo develop functions using Java, you must have the following installed:\n\n- [Java Developer Kit](../fundamentals/java-support-on-azure.md), version 11\n- [Apache Maven](https://maven.apache.org), version 3.0 or higher\n- [Azure CLI](/cli/azure)\n- [Azure Functions Core Tools](/azure/azure-functions/functions-run-local#v4) version 4\n\n> [!IMPORTANT]\n> You must set the `JAVA_HOME` environment variable to the install location of the JDK to complete this quickstart.\n>\n> Make sure your core tools version is at least 4.0.5455.\n\n## What we're going to build\n\nWe're going to build a classical \"Hello, World\" function that runs on Azure Functions and is configured with Spring Cloud Function.\n\nThe function receives a `User` JSON object, which contains a user name, and sends back a `Greeting` object, which contains the welcome message to that user.\n\nThe project is available in the [Spring Cloud Function in Azure](https://github.com/Azure/azure-functions-java-worker/tree/dev/samples/spring-cloud-example) sample of the [`azure-function-java-worker`](https://github.com/Azure/azure-functions-java-worker) repository on GitHub. You can use that sample directly if you want to see the final work described in this quickstart.\n\n## Create a new Maven project\n\nWe're going to create an empty Maven project, and configure it with Spring Cloud Function and Azure Functions.\n\nIn an empty folder, create a new **pom.xml** file and copy/paste the content from the sample project's [pom.xml](https://github.com/Azure/azure-functions-java-worker/blob/dev/samples/spring-cloud-example/pom.xml) file.\n\n> [!NOTE]\n> This file uses Maven dependencies from both Spring Boot and Spring Cloud Function, and it configures\nthe Spring Boot and Azure Functions Maven plugins.\n\nYou need to customize a few properties for your application:\n\n- `<functionAppName>` is the name of your Azure Function\n- `<functionAppRegion>` is the name of the Azure region where your Function is deployed\n- `<functionResourceGroup>` is the name of the Azure resource group you're using\n\nChange those properties directly near the top of the **pom.xml** file, as shown in the following example:\n\n```xml\n    <properties>\n        <java.version>11</java.version>\n\n        <!-- Spring Boot start class. WARNING: correct class must be set -->\n        <start-class>com.example.DemoApplication</start-class>\n\n        <!-- customize those properties. WARNING: the functionAppName should be unique across Azure -->\n        <azure.functions.maven.plugin.version>1.36.0</azure.functions.maven.plugin.version>\n        <functionResourceGroup>my-spring-function-resource-group</functionResourceGroup>\n        <functionAppServicePlanName>my-spring-function-service-plan</functionAppServicePlanName>\n        <functionAppName>my-spring-function</functionAppName>\n        <functionPricingTier>Y1</functionPricingTier>\n        <functionAppRegion>eastus</functionAppRegion>\n    </properties>\n\n```\n\n## Create Azure configuration files\n\nCreate a **src/main/resources** folder and add the following Azure Functions configuration files to it.\n\n**host.json**:\n\n```json\n{\n  \"version\": \"2.0\",\n  \"extensionBundle\": {\n    \"id\": \"Microsoft.Azure.Functions.ExtensionBundle\",\n    \"version\": \"[4.*, 5.2.0)\"\n  },\n  \"functionTimeout\": \"00:10:00\"\n}\n```\n\n**local.settings.json**:\n\n```json\n{\n  \"IsEncrypted\": false,\n  \"Values\": {\n    \"AzureWebJobsStorage\": \"\",\n    \"FUNCTIONS_WORKER_RUNTIME\": \"java\",\n    \"FUNCTIONS_EXTENSION_VERSION\": \"~4\",\n    \"AzureWebJobsDashboard\": \"\"\n  }\n}\n```\n\n## Create domain objects\n\nAzure Functions can receive and send objects in JSON format.\nWe're now going to create our `User` and `Greeting` objects, which represent our domain model.\nYou can create more complex objects, with more properties, if you want to customize this quickstart and make it more interesting for you.\n\nCreate a **src/main/java/com/example/model** folder and add the following two files:\n\n**User.java**:\n\n```java\npackage com.example.model;\n\npublic class User {\n\n    private String name;\n\n    public User() {\n    }\n\n    public User(String name) {\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n```\n\n**Greeting.java**:\n\n```java\npackage com.example.model;\n\npublic class Greeting {\n\n    private String message;\n\n    public Greeting() {\n    }\n\n    public Greeting(String message) {\n        this.message = message;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public void setMessage(String message) {\n        this.message = message;\n    }\n}\n```\n\n## Create the Spring Boot application\n\nThis application manages all business logic, and has access to the full Spring Boot ecosystem. This capability gives you two main benefits over a standard Azure Function:\n\n- It doesn't rely on the Azure Functions APIs, so you can easily port it to other systems. For example, you can reuse it in a normal Spring Boot application.\n- You can use all the `@Enable` annotations from Spring Boot to add new features.\n\nIn the **src/main/java/com/example** folder, create the following file, which is a normal Spring Boot application:\n\n**DemoApplication.java**:\n\n```java\npackage com.example;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class DemoApplication {\n    public static void main(String[] args) throws Exception {\n        SpringApplication.run(DemoApplication.class, args);\n    }\n}\n```\n\nNow create the following file in the **src/main/java/com/example/hello** folder. This code contains a Spring Boot component that represents the Function we want to run:\n\n**Hello.java**:\n\n```java\npackage com.example.hello;\n\nimport com.example.model.*;\nimport org.springframework.stereotype.Component;\nimport java.util.function.Function;\n\n@Component\npublic class Hello implements Function<User, Greeting> {\n\n    @Override\n    public Greeting apply(User user) {\n        return new Greeting(\"Hello, \" + user.getName() + \"!\\n\");\n    }\n}\n```\n\n> [!NOTE]\n> The `Hello` function is quite specific:\n>\n> - It is a `java.util.function.Function`. It contains the business logic, and it uses a standard Java API to transform one object into another.\n> - Because it has the `@Component` annotation, it's a Spring Bean, and by default its name is the same as the class, but starting with a lowercase character: `hello`. Following this naming convention is important if you want to create other functions in your application. The name must match the Azure Functions name we'll create in the next section.\n\n## Create the Azure Function\n\nTo benefit from the full Azure Functions API, we now code an Azure Function that delegates its execution to the Spring Cloud Function created in the previous step.\n\nIn the **src/main/java/com/example/hello** folder, create the following Azure Function class file:\n\n**HelloHandler.java**:\n\n```java\npackage com.example.hello;\n\nimport com.microsoft.azure.functions.*;\nimport com.microsoft.azure.functions.annotation.AuthorizationLevel;\nimport com.microsoft.azure.functions.annotation.FunctionName;\nimport com.microsoft.azure.functions.annotation.HttpTrigger;\nimport com.example.model.*;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Optional;\n\n@Component\npublic class HelloHandler {\n\n    @Autowired\n    private Hello hello;\n\n    @FunctionName(\"hello\")\n    public HttpResponseMessage execute(\n        @HttpTrigger(name = \"request\", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<User>> request, ExecutionContext context) {\n        User user = request.getBody()\n                           .filter(u -> u.getName() != null)\n                           .orElseGet(() -> new User(request.getQueryParameters().getOrDefault(\"name\", \"world\")));\n        context.getLogger().info(\"Greeting user name: \" + user.getName());\n        return request.createResponseBuilder(HttpStatus.OK)\n                      .body(hello.apply(user))\n                      .header(\"Content-Type\", \"application/json\")\n                      .build();\n    }\n}\n```\n\nThis Java class is an Azure Function, with the following interesting features:\n\n- The class has the `@Component` annotation, so it's a Spring Bean.\n- The name of the function, as defined by the `@FunctionName(\"hello\")` annotation, is `hello`.\n- The class implements a real Azure Function, so you can use the full Azure Functions API here.\n\n## Add unit tests\n\nThis step is optional but recommended to validate that the application works correctly.\n\nCreate a **src/test/java/com/example** folder and add the following JUnit tests:\n\n**HelloTest.java**:\n\n```java\npackage com.example;\n\nimport com.example.hello.Hello;\nimport com.example.model.Greeting;\nimport com.example.model.User;\nimport org.junit.jupiter.api.Test;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\npublic class HelloTest {\n\n    @Test\n    public void test() {\n        Greeting result = new Hello().apply(new User(\"foo\"));\n        assertThat(result.getMessage()).isEqualTo(\"Hello, foo!\\n\");\n    }\n}\n\n```\n\nYou can now test your Azure Function using Maven:\n\n```bash\nmvn clean test\n```\n\n## Run the Function locally\n\nBefore you deploy your application to Azure Function, let's first test it locally.\n\nFirst you need to package your application into a Jar file:\n\n```bash\nmvn package\n```\n\nNow that the application is packaged, you can run it using the `azure-functions` Maven plugin:\n\n```bash\nmvn azure-functions:run\n```\n\nThe Azure Function should now be available on your localhost, using port 7071. You can test the function by sending it a POST request, with a `User` object in JSON format. For example, using cURL:\n\n```bash\ncurl -X POST http://localhost:7071/api/hello -d \"{\\\"name\\\":\\\"Azure\\\"}\"\n```\n\nThe Function should answer you with a `Greeting` object, still in JSON format:\n\n```output\n{\n  \"message\": \"Hello, Azure!\\n\"\n}\n```\n\nHere's a screenshot of the cURL request on the top of the screen, and the local Azure Function at the bottom:\n\n![Azure Function running locally][RFL01]\n\n## Debug the Function locally\n\nThe following sections describe how to debug the function.\n\n### Debug using Intellij IDEA\n\nOpen the project in Intellij IDEA, then create a **Remote JVM Debug** run configuration to attach. For more information, see [Tutorial: Remote debug](https://www.jetbrains.com/help/idea/tutorial-remote-debug.html).\n\n![Create a Remote JVM Debug run configuration][create-remote-jvm-debug-run-configuration]\n\nRun the application with the following command:\n\n```bash\nmvn azure-functions:run -DenableDebug\n```\n\nWhen the application starts, you see the following output:\n\n```output\nWorker process started and initialized.\nListening for transport dt_socket at address: 5005\n```\n\nStart project debugging in IntelliJ IDEA. You see the following output:\n\n```output\nConnected to the target VM, address: 'localhost:5005', transport: 'socket'\n```\n\nMark the breakpoints you want to debug. The Intellij IDEA will enter debugging mode after sending a request.\n\n### Debug using Visual Studio Code\n\nOpen the project in Visual Studio Code, then configure the following **launch.json** file content:\n\n```json\n{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"type\": \"java\",\n            \"name\": \"Attach to Remote Program\",\n            \"request\": \"attach\",\n            \"hostName\": \"127.0.0.1\",\n            \"port\": 5005\n        }\n    ]\n}\n```\n\nRun the application with the following command:\n\n```bash\nmvn azure-functions:run -DenableDebug\n```\n\nWhen the application starts, you see the following output:\n\n```output\nWorker process started and initialized.\nListening for transport dt_socket at address: 5005\n```\n\nStart project debugging in Visual Studio Code, then mark the breakpoints you want to debug. Visual Studio Code will enter debugging mode after sending a request. For more information, see [Running and debugging Java](https://code.visualstudio.com/docs/java/java-debugging).\n\n## Deploy the Function to Azure Functions\n\nNow, you're going to publish the Azure Function to production. Remember that the `<functionAppName>`, `<functionAppRegion>`, and `<functionResourceGroup>` properties you've defined in your **pom.xml** file are used to configure your function.\n\n> [!NOTE]\n> The Maven plugin needs to authenticate with Azure. If you have Azure CLI installed, use `az login` before continuing.\n>\n> For more authentication options, see [Authentication](https://github.com/microsoft/azure-maven-plugins/wiki/Authentication) in the [`azure-maven-plugins`](https://github.com/microsoft/azure-maven-plugins) repository.\n\nRun Maven to deploy your function automatically:\n\n```bash\nmvn azure-functions:deploy\n```\n\nNow go to the [Azure portal](https://portal.azure.com) to find the `Function App` that has been created.\n\nSelect the function:\n\n- In the function overview, note the function's URL.\n- To check your running function, select **Log streaming** on the navigation menu.\n\nNow, as you did in the previous section, use cURL to access the running function, as shown in the following example. Be sure to replace `your-function-name` by your real function name.\n\n```bash\ncurl https://your-function-name.azurewebsites.net/api/hello -d \"{\\\"name\\\":\\\"Azure\\\"}\"\n```\n\nLike in the previous section, the Function should answer you with a `Greeting` object, still in JSON format:\n\n```output\n{\n  \"message\": \"Hello, Azure!\\n\"\n}\n```\n\nCongratulations, you have a Spring Cloud Function running on Azure Functions! For more information and samples of Spring Cloud functions, see the following resources:\n\n- [Spring cloud function blog](https://spring.io/blog/2023/02/24/spring-cloud-function-for-azure-function)\n- [Spring cloud function reference documents](https://docs.spring.io/spring-cloud-function/docs/4.0.2-SNAPSHOT/reference/html/azure.html#_microsoft_azure)\n- [Spring cloud function samples](https://github.com/spring-cloud/spring-cloud-function/tree/main/spring-cloud-function-samples)\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Spring on Azure](./index.yml)\n\n<!-- IMG List -->\n\n[RFL01]: media/getting-started-with-spring-cloud-function-in-azure/RFL01.png\n[create-remote-jvm-debug-run-configuration]: media/getting-started-with-spring-cloud-function-in-azure/create-remote-jvm-debug-run-configuration.png\n"
  },
  {
    "path": "articles/java/spring-framework/how-to-guides-spring-data-cosmosdb.md",
    "content": "---\ntitle: Azure Cosmos DB dev guide\ndescription: This guide describes the features, issues, workarounds, and diagnostic steps to be aware of when you use the Spring Data Azure Cosmos DB SDK.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: concept-article\nms.date: 08/19/2025\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Azure Cosmos DB dev guide\n\nAzure Spring Data for Azure Cosmos DB provides Spring Data support for [Azure Cosmos DB for NoSQL][sql_api_query]. [Azure Cosmos DB][cosmos_introduction] is a globally distributed database service that allows developers to work with data using various standard APIs, such as SQL, MongoDB, Cassandra, Graph, and Table.\n\nThis guide will walk you through the concepts of Azure Spring Data Azure Cosmos DB SDK, supported features, troubleshooting, and known issues. For more information on below concepts and code samples, see the [Spring Data for Azure Cosmos DB SDK readme][azure-spring-data-cosmos-sdk-readme].\n\n## Version support policy\n\n### Spring Boot version support\n\nThis project supports multiple Spring Boot versions. For more information, see [Spring Boot Support Policy][spring-boot-support-policy]. Maven users can inherit from the `spring-boot-starter-parent` project to obtain a dependency management section to let Spring manage the versions for dependencies. For more information, see [Spring Boot Version Support][spring-boot-version-support].\n\n### Spring Data version support\n\nThis project supports different `spring-data-commons` versions. For more information, see [Spring Data Version Support][spring-data-version-support].\n\n### Which version of Azure Spring Data Azure Cosmos DB to use\n\nAzure Spring Data Azure Cosmos DB library supports multiple versions of Spring Boot / Spring Cloud. For more information on which version of Azure Spring Data Azure Cosmos DB to use with Spring Boot / Spring Cloud version, see [Which Version of Azure Spring Data for Azure Cosmos DB should I use?][spring-data-cosmos-sdk-version-mapping].\n\n## Get started\n\n### Include the package\n\nIf you're using Maven, add the following dependency.\n\n[//]: # ({x-version-update-start;com.azure:azure-spring-data-cosmos;current})\n```xml\n<dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-spring-data-cosmos</artifactId>\n    <version>LATEST</version>\n</dependency>\n```\n[//]: # ({x-version-update-end})\n\n### Prerequisites\n\n- [Java Development Kit (JDK)][jdk_link], version 8 or higher.\n- An active Azure account. If you don't have one, you can sign up for a [free account][azure_subscription]. Alternatively, you can use the [Azure Cosmos DB Emulator][local_emulator] for development and testing. As emulator https certificate is self-signed, you need to import its certificate to java trusted cert store, [explained here][local_emulator_export_ssl_certificates]\n- (Optional) SLF4J is a logging facade.\n- (Optional) [SLF4J binding](https://www.slf4j.org/manual.html) is used to associate a specific logging framework with SLF4J.\n- (Optional) [Maven][maven_link]\n\nSLF4J is only needed if you plan to use logging, also download an SLF4J binding, which will link the SLF4J API with the logging implementation of your choice. For more information, see the [SLF4J user manual](https://www.slf4j.org/manual.html).\n\n### Set up and customize the configuration class\n\nIn order to set up the configuration class, you need to extend `AbstractCosmosConfiguration`. For more information, see [Setup Configuration Class][setup-configuration-class].\n\nYou can customize underlying `CosmosAsyncClient` used by Azure Spring Data Azure Cosmos DB SDK by providing `DirectConnectionConfig` or `GatewayConnectionConfig` or both and provide them to `CosmosClientBuilder`. For complete sample, visit [customizing configuration section][customizing-configuration].\n\n### Entity setup\n\nYou can define a simple entity as item in Azure Cosmos DB. You can define entities by adding the `@Container` annotation and specifying properties related to the container. For more information, see [Define an entity][define-an-entity].\n\nContainer annotation supports specifying the container name, [request units](/azure/cosmos-db/request-units) (RUs), time to live, [creating containers with autoscale throughput][creating-containers-with-autoscale-throughput], [nested partition key support][nested-partition-key-support], and other container properties.\n\n### Repository setup\n\nAzure Spring Data Azure Cosmos DB supports `ReactiveCrudRepository` (async APIs) and `CrudRepository` (sync APIs), which provide the following basic CRUD functionality:\n\n- save\n- findAll\n- findOne by ID\n- deleteAll\n- delete by ID\n- delete entity\n\nYou can extend `CosmosRepository` (for sync API support) or `ReactiveCosmosRepository` (for async API support) to set up Spring Data repositories for your application. For more information, see [Create repositories][create-repositories].\n\nAzure Spring Data Azure Cosmos DB supports specifying annotated queries in the repositories using `@Query`. For more information, see [QueryAnnotation : Using annotated queries in repositories][query-annotation-code-snippet].\n\n### Spring Data Annotations\n\n#### Spring Data [@Id annotation][spring_data_commons_id_annotation]\n\nThere are multiple ways to map a field in domain class to `id`. For more information, see the [spring data ID annotation code section][spring-data-id-annotation].\n\n#### ID auto generation\n\nAzure Spring Data Azure Cosmos DB supports auto generation of IDs using the @GeneratedValue annotation. For more information, see the [ID auto generation section][id-auto-generation].\n\n#### SpEL expression and custom container name\n\nBy default, the container name will be the class name of the user domain class. To customize, add the `@Container(containerName=\"myCustomContainerName\")` annotation to the domain class. For more information, see the [SpEL expression and custom container name section][spel-expression-and-custom-container-name].\n\n#### Custom IndexingPolicy\n\nBy default, `IndexingPolicy` will be set by Azure service. To customize, add the annotation `@CosmosIndexingPolicy` to the domain class. For more information, see the [indexing policy section][indexing-policy].\n\n#### Unique key policy\n\nAzure Spring Data Azure Cosmos DB supports setting `UniqueKeyPolicy` on the container by adding the annotation `@CosmosUniqueKeyPolicy` to the domain class. For more information, see the [unique key policy section][unique-key-policy].\n\n### Azure Cosmos DB Partition\n\n`Azure-spring-data-cosmos` supports [Azure Cosmos DB partitions][azure_cosmos_db_partition].\n\nTo specify a field of the domain class to be a partition key field, just annotate it with `@PartitionKey`.\n\nWhen you perform CRUD operation, specify your partition value.\n\nFor more information, see the [test here section][address_repository_it_test].\n\n### Optimistic Locking\n\n`Azure-spring-data-cosmos` supports Optimistic Locking for specific containers, which means upserts/deletes by item will fail with an exception in case the item is modified by another process in the meantime. For more information, see the [optimistic locking section][optimistic-locking].\n\n### Spring Data custom query, pageable and sorting\n\n`Azure-spring-data-cosmos` supports [Spring Data custom queries][spring_data_custom_query], for example, a find operation such as `findByAFieldAndBField`. It also supports [Spring Data Pageable, Slice and Sort][spring-data-pageable-slice-sort]. For more information, see the [query, pageable and sorting section][spring-data-custom-query-pageable-and-sorting].\n\n### Using Azure Cosmos DB Java SDK through Spring Data Cosmos\n\n`Azure-spring-data-cosmos` supports using `Azure Cosmos DB Java SDK`. Users can get `CosmosClient` or `CosmosAsyncClient` bean through `ApplicationContext` and execute any operations supported by Azure Cosmos DB Java SDK. For more information, see the [using Azure Cosmos Client through Spring Data Cosmos section][using-azure-cosmos-db-java-sdk-through-spring-data-cosmos].\n\n### Spring Data REST\n\n`Azure-spring-data-cosmos` supports [Spring Data REST](https://spring.io/projects/spring-data-rest/). For more information, see the [Azure Spring Data Azure Cosmos DB REST API section][spring-boot-starter-data-rest].\n\n### Auditing\n\n`Azure-spring-data-cosmos` supports auditing fields on database entities using standard spring-data annotations. For more information, see the [Spring Data Azure Cosmos DB auditing section][spring-data-cosmos-auditing].\n\n### Multi-database configuration\n\n`Azure-spring-data-cosmos` supports multi-database configuration, including \"multiple database accounts\" and \"single account, with multiple databases\". For a complete code snippet, see the [multi database configuration section][multi-database-configuration].\n\n## Troubleshooting\n\n### General\n\nIf you encounter any bug, file an issue [here](https://github.com/Azure/azure-sdk-for-java/issues/new).\n\nTo suggest a new feature or changes that could be made, file an issue the same way you would for a bug.\n\n### Enable Client Logging\n\n`Azure-spring-data-cosmos` uses SLF4j as the logging facade that supports logging into popular logging frameworks such as log4j and logback. For more information, see the [enable client logging section][enable-client-logging].\n\n## Examples\n\nFor a complete sample project, see the [sample project][samples].\n\n### Multi-database accounts\n\nFor a complete sample project, see the [Multi-database sample project][sample-for-multi-database].\n\n### Single account with Multi-database\n\nFor a complete sample project, see the [Single account with Multi-database sample project][sample-for-multi-database-single-account].\n\n## Next steps\n\n- [Read more about Azure spring data Azure Cosmos DB][azure_spring_data_cosmos_docs].\n- [Read more about Azure Cosmos DB Service][cosmos_docs]\n- [See the Azure Spring Data Azure Cosmos DB Samples][azure-spring-data-cosmos-samples]\n- [See the Spring MVC with Azure Cosmos DB Sample][spring-mvc-with-azure-cosmosdb-samples]\n\n## Contributing\n\nThis project welcomes contributions and suggestions. Most contributions require you to agree to a\n[Contributor License Agreement (CLA)][cla] declaring that you have the right to, and actually do, grant us the rights\nto use your contribution.\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate\nthe PR appropriately - for example, label, comment. Simply follow the instructions provided by the bot. You'll only need to\ndo this once across all repos using our CLA.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct][coc]. For more information, see the [Code of Conduct FAQ][coc_faq]\nor contact [opencode@microsoft.com][coc_contact] with any other questions or comments.\n\n<!-- LINKS -->\n[source_code]: src\n[cosmos_introduction]: /azure/cosmos-db/\n[cosmos_docs]: /azure/cosmos-db/introduction\n[jdk]: /java/azure/jdk/\n[maven]: https://maven.apache.org/\n[cla]: https://cla.microsoft.com\n[coc]: https://opensource.microsoft.com/codeofconduct/\n[coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/\n[coc_contact]: mailto:opencode@microsoft.com\n[azure_subscription]: https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn/\n[samples]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/src/samples/java/com/azure/spring/data/cosmos\n[sample-for-multi-database]: https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/cosmos/azure-spring-data-cosmos/cosmos-multi-database-multi-account\n[sample-for-multi-database-single-account]: https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/cosmos/azure-spring-data-cosmos/cosmos-multi-database-single-account\n[sql_api_query]: /azure/cosmos-db/sql-api-sql-query\n[local_emulator]: /azure/cosmos-db/local-emulator\n[local_emulator_export_ssl_certificates]: /azure/cosmos-db/local-emulator-export-ssl-certificates\n[spring_data_commons_id_annotation]: https://github.com/spring-projects/spring-data-commons/blob/main/src/main/java/org/springframework/data/annotation/Id.java\n[azure_cosmos_db_partition]: /azure/cosmos-db/partition-data\n[address_repository_it_test]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/repository/integration/AddressRepositoryIT.java\n[azure_spring_data_cosmos_docs]: /azure/cosmos-db/sql-api-sdk-java-spring-v3\n[spring_data_custom_query]: https://docs.spring.io/spring-data/commons/docs/current/reference/html/#repositories.query-methods.details\n[sql_queries_in_cosmos]: /azure/cosmos-db/tutorial-query-sql-api\n[sql_queries_getting_started]: /azure/cosmos-db/sql-query-getting-started\n[jdk_link]: /java/azure/jdk/\n[maven_link]: https://maven.apache.org/\n[autoscale-throughput]: /azure/cosmos-db/provision-throughput-autoscale\n[unique-keys]: /azure/cosmos-db/unique-keys\n[spring-boot-support-policy]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos#spring-boot-support-policy\n[spring-boot-version-support]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos#spring-boot-version-support\n[spring-data-version-support]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos#spring-data-version-support\n[spring-data-cosmos-sdk-version-mapping]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#which-version-of-azure-spring-data-cosmos-should-i-use\n[setup-configuration-class]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos#setup-configuration-class\n[customizing-configuration]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos#customizing-configuration\n[azure-spring-data-cosmos-sdk-readme]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md\n[define-an-entity]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#define-an-entity\n[creating-containers-with-autoscale-throughput]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#creating-containers-with-autoscale-throughput\n[nested-partition-key-support]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#nested-partition-key-support\n[create-repositories]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#create-repositories\n[query-annotation-code-snippet]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#queryannotation--using-annotated-queries-in-repositories\n[spring-data-id-annotation]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#spring-data-id-annotation\n[spring_data_commons_id_annotation]: https://github.com/spring-projects/spring-data-commons/blob/main/src/main/java/org/springframework/data/annotation/Id.java\n[id-auto-generation]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#id-auto-generation\n[spel-expression-and-custom-container-name]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#spel-expression-and-custom-container-name\n[indexing-policy]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#indexing-policy\n[unique-key-policy]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#unique-key-policy\n[optimistic-locking]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#optimistic-locking\n[spring-data-pageable-slice-sort]: https://docs.spring.io/spring-data/commons/docs/current/reference/html/#repositories.special-parameters\n[spring-data-custom-query-pageable-and-sorting]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#spring-data-custom-query-pageable-and-sorting\n[using-azure-cosmos-db-java-sdk-through-spring-data-cosmos]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#using-azure-cosmos-db-java-sdk-through-spring-data-cosmos\n[spring-boot-starter-data-rest]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#spring-boot-starter-data-rest\n[spring-data-cosmos-auditing]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#auditing\n[multi-database-configuration]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#multi-database-configuration\n[enable-client-logging]: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring/azure-spring-data-cosmos/README.md#enable-client-logging\n[azure-spring-data-cosmos-samples]: https://github.com/Azure-Samples/azure-spring-data-cosmos-java-sql-api-samples\n[spring-mvc-with-azure-cosmosdb-samples]: https://github.com/Azure-Samples/azure-spring-mvc-cosmos-db-java-sql-api-samples\n"
  },
  {
    "path": "articles/java/spring-framework/includes/create-mysql-flexible-server-non-admin-user.md",
    "content": "---\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\n---\n\n### [Service Connector (Recommended)](#tab/service-connector)\n\n1. Use the following command to install the [Service Connector](/azure/service-connector/overview) passwordless extension for the Azure CLI:\n\n   ```azurecli\n    az extension add --name serviceconnector-passwordless --upgrade\n   ```\n\n1. Use the following command to create the Microsoft Entra non-admin user:\n\n   ```azurecli\n     az connection create mysql-flexible \\\n          --resource-group <your_resource_group_name> \\\n          --connection mysql_conn \\\n          --target-resource-group <your_resource_group_name> \\\n          --server mysqlflexibletest \\\n          --database demo \\\n          --user-account mysql-identity-id=/subscriptions/<your_subscription_id>/resourcegroups/<your_resource_group_name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<your_user_assigned_managed_identity_name> \\\n          --query authInfo.userName \\\n          --output tsv\n    ```\n\n   When the command completes, take note of the username in the console output.\n\n### [Manual configuration](#tab/manual)\n\n> [!IMPORTANT]\n> To use passwordless connections, create a Microsoft Entra admin user for your Azure Database for MySQL instance. For more information, see the [Configure the Microsoft Entra Admin](/azure/mysql/flexible-server/how-to-azure-ad#configure-the-azure-ad-admin) section of [Set up Microsoft Entra authentication for Azure Database for MySQL - Flexible Server](/azure/mysql/flexible-server/how-to-azure-ad).\n\nCreate a SQL script called **create_ad_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\nexport AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)\n\ncat << EOF > create_ad_user.sql\nSET aad_auth_validate_oids_in_tenant = OFF;\nCREATE AADUSER '<your_mysql_ad_non_admin_username>' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';\nGRANT ALL PRIVILEGES ON demo.* TO '<your_mysql_ad_non_admin_username>'@'%';\nFLUSH privileges;\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\nmysql -h mysqlflexibletest.mysql.database.azure.com --user <your_mysql_ad_admin_username> --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql\n```\n\n> [!TIP]\n> To use Microsoft Entra authentication to connect to Azure Database for MySQL, you need to sign in with the Microsoft Entra admin user you set up, and then get the access token as the password. For more information, see [Set up Microsoft Entra authentication for Azure Database for MySQL - Flexible Server](/azure/mysql/flexible-server/how-to-azure-ad).\n\n---\n"
  },
  {
    "path": "articles/java/spring-framework/includes/create-postgresql-flexible-server-non-admin-user.md",
    "content": "---\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\n---\n\n### [Service Connector (Recommended)](#tab/service-connector)\n\n1. Use the following command to install the [Service Connector](/azure/service-connector/overview) passwordless extension for the Azure CLI:\n\n   ```azurecli\n    az extension add --name serviceconnector-passwordless --upgrade\n   ```\n\n1. Use the following command to create the Microsoft Entra non-admin user:\n\n   ```azurecli\n     az connection create postgres-flexible \\\n          --resource-group <your_resource_group_name> \\\n          --connection postgres_conn \\\n          --target-resource-group <your_resource_group_name> \\\n          --server postgresqlflexibletest \\\n          --database demo \\\n          --user-account \\\n          --query authInfo.userName \\\n          --output tsv\n    ```\n\n   When the command completes, take note of the username in the console output.\n\n### [Manual configuration](#tab/manual)\n\n> [!IMPORTANT]\n> To use passwordless connections, configure the Microsoft Entra admin user for your Azure Database for PostgreSQL Flexible Server instance. For more information, see [Manage Microsoft Entra roles in Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/how-to-manage-azure-ad-users).\n\nCreate a SQL script called **create_ad_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\ncat << EOF > create_ad_user.sql\nselect * from pgaadauth_create_principal('<your_postgresql_ad_non_admin_username>', false, false);\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\npsql \"host=postgresqlflexibletest.postgres.database.azure.com user=<your_postgresql_ad_admin_username> dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require\" < create_ad_user.sql\n```\n\n> [!TIP]\n> To use Microsoft Entra authentication to connect to Azure Database for PostgreSQL, you need to sign in with the Microsoft Entra admin user you set up, and then get the access token as the password. For more information, see [Use Microsoft Entra ID for authentication with Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/how-to-configure-sign-in-azure-ad-authentication).\n\n---\n"
  },
  {
    "path": "articles/java/spring-framework/includes/create-postgresql-single-server-non-admin-user.md",
    "content": "---\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\n---\n\n### [Service Connector (Recommended)](#tab/service-connector)\n\n1. Use the following command to install the [Service Connector](/azure/service-connector/overview) passwordless extension for the Azure CLI:\n\n   ```azurecli\n    az extension add --name serviceconnector-passwordless --upgrade\n   ```\n\n1. Use the following command to create the Microsoft Entra non-admin user:\n\n   ```azurecli\n     az connection create postgres \\\n          --resource-group <your_resource_group_name> \\\n          --connection postgres_conn \\\n          --target-resource-group <your_resource_group_name> \\\n          --server postgresqlsingletest \\\n          --database demo \\\n          --user-account \\\n          --query authInfo.userName \\\n          --output tsv\n    ```\n\n   When the command completes, take note of the username in the console output.\n\n### [Manual configuration](#tab/manual)\n\n> [!IMPORTANT]\n> To use passwordless connections, configure the Microsoft Entra admin user for your Azure Database for PostgreSQL Single Server instance. For more information, see [Use Microsoft Entra ID for authentication with PostgreSQL](/azure/postgresql/single-server/how-to-configure-sign-in-azure-ad-authentication).\n\nCreate a SQL script called **create_ad_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\ncat << EOF > create_ad_user.sql\nSET aad_validate_oids_in_tenant = off;\nCREATE ROLE \"<your_postgresql_ad_non_admin_username>\" WITH LOGIN IN ROLE azure_ad_user;\nGRANT ALL PRIVILEGES ON DATABASE demo TO \"<your_postgresql_ad_non_admin_username>\";\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\npsql \"host=postgresqlsingletest.postgres.database.azure.com user=<your_postgresql_ad_admin_username>@postgresqlsingletest dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require\" < create_ad_user.sql\n```\n\n> [!TIP]\n> To use Microsoft Entra authentication to connect to Azure Database for PostgreSQL, you need to sign in with the Microsoft Entra admin user you set up, and then get the access token as the password. For more information, see [Use Microsoft Entra ID for authentication with PostgreSQL](/azure/postgresql/single-server/how-to-configure-sign-in-azure-ad-authentication).\n\n---\n"
  },
  {
    "path": "articles/java/spring-framework/includes/deploy-to-azure-spring-apps.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n## Deploy to Azure Spring Apps\n\nNow that you have the Spring Boot application running locally, it's time to move it to production. [Azure Spring Apps](/azure/spring-apps/overview) makes it easy to deploy Spring Boot applications to Azure without any code changes. The service manages the infrastructure of Spring applications so developers can focus on their code. Azure Spring Apps provides lifecycle management using comprehensive monitoring and diagnostics, configuration management, service discovery, CI/CD integration, blue-green deployments, and more. To deploy your application to Azure Spring Apps, see [Deploy your first application to Azure Spring Apps](/azure/spring-apps/quickstart?tabs=Azure-CLI).\n"
  },
  {
    "path": "articles/java/spring-framework/includes/introducing-passwordless-connections.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n### Introducing passwordless connections\n\nWith a passwordless connection, you can connect to Azure services without storing any credentials in the application code, its configuration files, or in environment variables.\n\nMany Azure services support passwordless connections, for example via Azure Managed Identity. These techniques provide robust security features that you can implement using [DefaultAzureCredential](/java/api/overview/azure/Identity-readme#defaultazurecredential) from the Azure Identity client libraries. In this tutorial, you'll learn how to update an existing application to use `DefaultAzureCredential` instead of alternatives such as connection strings.\n\n`DefaultAzureCredential` supports multiple authentication methods and automatically determines which should be used at runtime. This approach enables your app to use different authentication methods in different environments (local dev vs. production) without implementing environment-specific code.\n\nThe order and locations in which `DefaultAzureCredential` searches for credentials can be found in the [Azure Identity library overview](/java/api/overview/azure/Identity-readme#defaultazurecredential). For example, when working locally, `DefaultAzureCredential` will generally authenticate using the account the developer used to sign in to Visual Studio. When the app is deployed to Azure, `DefaultAzureCredential` will automatically switch to use a [managed identity](/azure/active-directory/managed-identities-azure-resources/overview). No code changes are required for this transition.\n\nTo ensure that connections are passwordless, you must take into consideration both local development and the production environment. If a connection string is required in either place, then the application isn't passwordless.\n\nIn your local development environment, you can authenticate with Azure CLI, Azure PowerShell, Visual Studio, or Azure plugins for Visual Studio Code or IntelliJ. In this case, you can use that credential in your application instead of configuring properties.\n\nWhen you deploy applications to an Azure hosting environment, such as a virtual machine, you can assign managed identity in that environment. Then, you won't need to provide credentials to connect to Azure services.\n\n> [!NOTE]\n> A managed identity provides a security identity to represent an app or service. The identity is managed by the Azure platform and does not require you to provision or rotate any secrets. You can read more about managed identities in the [overview](/azure/active-directory/managed-identities-azure-resources/overview) documentation.\n"
  },
  {
    "path": "articles/java/spring-framework/includes/passwordless-sign-in.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n### [Azure CLI](#tab/sign-in-azure-cli)\n\nSign in to Azure through the Azure CLI by using the following command:\n\n```azurecli\naz login\n```\n\n### [PowerShell](#tab/sign-in-powershell)\n\nSign in to Azure using PowerShell by using the following command:\n\n```azurepowershell\nConnect-AzAccount\n```\n\n### [Visual Studio](#tab/sign-in-visual-studio)\n\nSelect the **Sign in** button in the top right corner of Visual Studio.\n\n:::image type=\"content\" source=\"../media/passwordless-connections/sign-in-visual-studio.png\" alt-text=\"Screenshot showing the button to sign in to Azure using Visual Studio.\":::\n\nSign in using the Microsoft Entra account you assigned a role to previously.\n\n:::image type=\"content\" source=\"../media/passwordless-connections/sign-in-visual-studio-account.png\" alt-text=\"Screenshot showing the Visual Studio sign-in dialog box.\":::\n\n### [Visual Studio Code](#tab/sign-in-visual-studio-code)\n\nMake sure you have the [Azure Account](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account) extension installed.\n\n:::image type=\"content\" source=\"../media/passwordless-connections/azure-extension.png\" alt-text=\"Screenshot showing the Azure extension.\":::\n\nUse the **CTRL + Shift + P** shortcut to open the command palette. Search for the **Azure: Sign In** command and follow the prompts to authenticate. Make sure to use the Microsoft Entra account you assigned a role to previously from your Blob Storage account.\n\n:::image type=\"content\" source=\"../media/passwordless-connections/azure-command.png\" alt-text=\"Screenshot showing the Azure sign-in command.\":::\n\n### [IntelliJ](#tab/sign-in-Intellij)\n\nFor more information, see [Install the Azure Toolkit for IntelliJ](../../toolkit-for-intellij/install-toolkit.md) and [Sign-in instructions for the Azure Toolkit for IntelliJ](../../toolkit-for-intellij/sign-in-instructions.md).\n\n---\n"
  },
  {
    "path": "articles/java/spring-framework/includes/prepare-your-local-environment.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n## Prepare your local environment\n\nIn this tutorial, the configurations and code don't have any authentication operations. However, connecting to an Azure service requires authentication. To complete the authentication, you need to use the Azure Identity client library. Spring Cloud Azure uses `DefaultAzureCredential`, which the Azure Identity library provides to help you get credentials without any code changes.\n\n`DefaultAzureCredential` supports multiple authentication methods and determines which method to use at runtime. This approach enables your app to use different authentication methods in different environments - such as local or production environments - without implementing environment-specific code. For more information, see the [DefaultAzureCredential](../../sdk/authentication/azure-hosted-apps.md#defaultazurecredential) section of [Authenticate Azure-hosted Java applications](../../sdk/authentication/azure-hosted-apps.md).\n\nTo use Azure CLI, IntelliJ, or other methods to complete the authentication in local development environments, see [Azure authentication in Java development environments](../../sdk/authentication/dev-env.md). To complete the authentication in Azure hosting environments, we recommend using managed identity. For more information, see [What are managed identities for Azure resources?](/azure/active-directory/managed-identities-azure-resources/overview)\n"
  },
  {
    "path": "articles/java/spring-framework/includes/prerequisites-azure-cli.md",
    "content": "---\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\nms.custom: devx-track-java, devx-track-extended-java, devx-track-azurecli\nms.topic: include\n---\n\n- [Azure CLI](/cli/azure/install-azure-cli), version 2.38 or higher\n"
  },
  {
    "path": "articles/java/spring-framework/includes/prerequisites-curl.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: include\nms.date: 08/19/2025\n---\n\n- The `curl` command.  Most UNIX-like operating systems have this command pre-installed.  OS-specific clients are available at [the official curl website](https://curl.haxx.se/).\n"
  },
  {
    "path": "articles/java/spring-framework/includes/prerequisites-java.md",
    "content": "---\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\nms.topic: include\n---\n\n- A supported Java Development Kit (JDK). For more information, see [Java support on Azure and Azure Stack](../../fundamentals/java-support-on-azure.md). We recommend installing the [Microsoft Build of OpenJDK](/java/openjdk/install).\n"
  },
  {
    "path": "articles/java/spring-framework/includes/prerequisites-jq.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: include\nms.date: 08/19/2025\n---\n\n- The `jq` command. Most UNIX-like operating systems have this command pre-installed. OS-specific clients are available at [the official jq website](https://stedolan.github.io/jq/).\n"
  },
  {
    "path": "articles/java/spring-framework/includes/prerequisites-maven.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: include\nms.date: 08/19/2025\n---\n\n- [Apache Maven](http://maven.apache.org/), version 3.0 or higher.\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-boot-20-note.md",
    "content": "---\nms.topic: include\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\nauthor: KarlErickson\n---\n\n> [!IMPORTANT]\n> Spring Boot 2.5 (or later) is required to complete the steps in this article."
  },
  {
    "path": "articles/java/spring-framework/includes/spring-cloud-azure-version-note.md",
    "content": "> [!NOTE]\n> If you're using Spring Boot 4.0.x, be sure to set the `spring-cloud-azure-dependencies` version to `7.2.0`.\n> \n> If you're using Spring Boot 3.5.x, be sure to set the `spring-cloud-azure-dependencies` version to `6.2.0`.\n>\n> If you're using Spring Boot 3.1.x-3.5.x, be sure to set the `spring-cloud-azure-dependencies` version to `5.25.0`.\n>\n> If you're using Spring Boot 2.x, be sure to set the `spring-cloud-azure-dependencies` version to `4.20.0`.\n>\n> This Bill of Material (BOM) should be configured in the `<dependencyManagement>` section of your **pom.xml** file. This ensures that all Spring Cloud Azure dependencies are using the same version.\n>\n> For more information about the version used for this BOM, see [Which Version of Spring Cloud Azure Should I Use](https://github.com/Azure/azure-sdk-for-java/wiki/Spring-Versions-Mapping#which-version-of-spring-cloud-azure-should-i-use).\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-azure-mysql-flexible-server-setup.md",
    "content": "---\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\n---\n\n## Configure a firewall rule for your MySQL server\n\nAzure Database for MySQL instances are secured by default. They have a firewall that doesn't allow any incoming connection.\n\nTo be able to use your database, open the server's firewall to allow the local IP address to access the database server. For more information, see [Manage firewall rules for Azure Database for MySQL - Flexible Server using the Azure portal](/azure/mysql/flexible-server/how-to-manage-firewall-portal).\n\nIf you're connecting to your MySQL server from Windows Subsystem for Linux (WSL) on a Windows computer, you need to add the WSL host IP address to your firewall.\n\n## Create a MySQL non-admin user and grant permission\n\nThis step will create a non-admin user and grant all permissions on the `demo` database to it.\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\nYou can use the following method to create a non-admin user that uses a passwordless connection.\n\n[!INCLUDE [create-mysql-flexible-server-non-admin-user.md](create-mysql-flexible-server-non-admin-user.md)]\n\n### [Password](#tab/password)\n\nCreate a SQL script called **create_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\ncat << EOF > create_user.sql\nCREATE USER '<your_mysql_non_admin_username>'@'%' IDENTIFIED BY '<your_mysql_non_admin_password>';\nGRANT ALL PRIVILEGES ON demo.* TO '<your_mysql_non_admin_username>'@'%';\nFLUSH PRIVILEGES;\nEOF\n```\n\nThen, use the following command to run the SQL script to create the non-admin user:\n\n```bash\nmysql -h mysqlflexibletest.mysql.database.azure.com --user <your_mysql_admin_username> --enable-cleartext-plugin --password=<your_mysql_admin_password> < create_user.sql\n```\n\n> [!TIP]\n> You can read more detailed information about creating MySQL users in [Create users in Azure Database for MySQL](/azure/mysql/single-server/how-to-create-users).\n\n---\n\n## Store data from Azure Database for MySQL\n\nNow that you have an Azure Database for MySQL Flexible server instance, you can store data by using Spring Cloud Azure.\n\nTo install the Spring Cloud Azure Starter JDBC MySQL module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Starter JDBC MySQL artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>\n  </dependency>\n  ```\n\n> [!NOTE]\n> Passwordless connections have been supported since version `4.5.0`.\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-azure-mysql-single-server-setup.md",
    "content": "---\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\n---\n\n## Configure a firewall rule for your MySQL server\n\nAzure Database for MySQL instances are secured by default. They have a firewall that doesn't allow any incoming connection.\n\nTo be able to use your database, open the server's firewall to allow the local IP address to access the database server. For more information, see [Create and manage Azure Database for MySQL firewall rules by using the Azure portal](/azure/mysql/single-server/how-to-manage-firewall-using-portal).\n\nIf you're connecting to your MySQL server from Windows Subsystem for Linux (WSL) on a Windows computer, you need to add the WSL host IP address to your firewall.\n\n## Create a MySQL non-admin user and grant permission\n\nThis step will create a non-admin user and grant all permissions on the `demo` database to it.\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\n> [!IMPORTANT]\n> To use passwordless connections, create a Microsoft Entra admin user for your Azure Database for MySQL instance. For more information, see the [Setting the Microsoft Entra Admin user](/azure/mysql/single-server/how-to-configure-sign-in-azure-ad-authentication#setting-the-azure-ad-admin-user) section of [Use Microsoft Entra ID for authentication with MySQL](/azure/mysql/single-server/how-to-configure-sign-in-azure-ad-authentication).\n\nCreate a SQL script called **create_ad_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\nexport AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)\n\ncat << EOF > create_ad_user.sql\nSET aad_auth_validate_oids_in_tenant = OFF;\nCREATE AADUSER '<your_mysql_ad_non_admin_username>' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';\nGRANT ALL PRIVILEGES ON demo.* TO '<your_mysql_ad_non_admin_username>'@'%';\nFLUSH privileges;\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\nmysql -h mysqlsingletest.mysql.database.azure.com --user <your_mysql_ad_admin_username>@mysqlsingletest --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql\n```\n\n> [!TIP]\n> To use Microsoft Entra authentication to connect to Azure Database for MySQL, you need to sign in with the Microsoft Entra admin user you set up, and then get the access token as the password. For more information, see [Use Microsoft Entra ID for authentication with MySQL](/azure/mysql/single-server/how-to-configure-sign-in-azure-ad-authentication).\n\n### [Password](#tab/password)\n\nCreate a SQL script called **create_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\ncat << EOF > create_user.sql\nCREATE USER '<your_mysql_non_admin_username>'@'%' IDENTIFIED BY '<your_mysql_non_admin_password>';\nGRANT ALL PRIVILEGES ON demo.* TO '<your_mysql_non_admin_username>'@'%';\nFLUSH PRIVILEGES;\nEOF\n```\n\nThen, use the following command to run the SQL script to create the non-admin user:\n\n```bash\nmysql -h mysqlsingletest.mysql.database.azure.com --user <your_mysql_admin_username>@mysqlsingletest --enable-cleartext-plugin --password=<your_mysql_admin_password> < create_user.sql\n```\n\n> [!NOTE]\n> For more information, see [Create users in Azure Database for MySQL](/azure/mysql/single-server/how-to-create-users).\n\n---\n\n## Store data from Azure Database for MySQL\n\nNow that you have an Azure Database for MySQL Single Server instance, you can store data by using Spring Cloud Azure.\n\nTo install the Spring Cloud Azure Starter JDBC MySQL module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Starter JDBC MySQL artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>\n  </dependency>\n  ```\n\n> [!NOTE]\n> Passwordless connections have been supported since version `4.5.0`.\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-azure-postgresql-flexible-server-setup.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n## Configure a firewall rule for your PostgreSQL server\n\nAzure Database for PostgreSQL instances are secured by default. They have a firewall that doesn't allow any incoming connection.\n\nTo be able to use your database, open the server's firewall to allow the local IP address to access the database server. For more information, see [Firewall rules in Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/concepts-firewall-rules).\n\nIf you're connecting to your PostgreSQL server from Windows Subsystem for Linux (WSL) on a Windows computer, you need to add the WSL host ID to your firewall.\n\n## Create a PostgreSQL non-admin user and grant permission\n\nNext, create a non-admin user and grant all permissions to the database.\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\nYou can use the following method to create a non-admin user that uses a passwordless connection.\n\n[!INCLUDE [create-postgresql-flexible-server-non-admin-user.md](create-postgresql-flexible-server-non-admin-user.md)]\n\n### [Password](#tab/password)\n\nCreate a SQL script called **create_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\ncat << EOF > create_user.sql\nCREATE ROLE \"<your_postgresql_non_admin_username>\" WITH LOGIN PASSWORD '<your_postgresql_non_admin_password>';\nGRANT ALL PRIVILEGES ON DATABASE demo TO \"<your_postgresql_non_admin_username>\";\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\npsql \"host=postgresqlflexibletest.postgres.database.azure.com user=<your_postgresql_admin_username> dbname=demo port=5432 password=<your_postgresql_admin_password> sslmode=require\" < create_user.sql\n```\n\n> [!NOTE]\n> For more information, see [Create users in Azure Database for PostgreSQL - Flexible Server](/azure/PostgreSQL/flexible-server/how-to-create-users).\n\n---\n\n## Store data from Azure Database for PostgreSQL\n\nNow that you have an Azure Database for PostgreSQL Flexible Server instance, you can store data by using Spring Cloud Azure.\n\nTo install the Spring Cloud Azure Starter JDBC PostgreSQL module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Starter JDBC PostgreSQL artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-jdbc-postgresql</artifactId>\n  </dependency>\n  ```\n\n> [!NOTE]\n> Passwordless connections have been supported since version `4.5.0`.\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-azure-postgresql-single-server-setup.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n## Configure a firewall rule for your PostgreSQL server\n\nAzure Database for PostgreSQL instances are secured by default. They have a firewall that doesn't allow any incoming connection.\n\nTo be able to use your database, open the server's firewall to allow the local IP address to access the database server. For more information, see [Create and manage firewall rules for Azure Database for PostgreSQL - Single Server using the Azure portal](/azure/postgresql/single-server/how-to-manage-firewall-using-portal).\n\nIf you're connecting to your PostgreSQL server from Windows Subsystem for Linux (WSL) on a Windows computer, you need to add the WSL host ID to your firewall.\n\n## Create a PostgreSQL non-admin user and grant permission\n\nNext, create a non-admin user and grant all permissions to the database.\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\nYou can use the following method to create a non-admin user that uses a passwordless connection.\n\n[!INCLUDE [create-postgresql-single-server-non-admin-user.md](create-postgresql-single-server-non-admin-user.md)]\n\n### [Password](#tab/password)\n\nCreate a SQL script called **create_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\ncat << EOF > create_user.sql\nCREATE ROLE \"<your_postgresql_non_admin_username>\" WITH LOGIN PASSWORD '<your_postgresql_non_admin_password>';\nGRANT ALL PRIVILEGES ON DATABASE demo TO \"<your_postgresql_non_admin_username>\";\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\npsql \"host=postgresqlsingletest.postgres.database.azure.com user=<your_postgresql_admin_username>@postgresqlsingletest dbname=demo port=5432 password=<your_postgresql_admin_password> sslmode=require\" < create_user.sql\n```\n\n> [!NOTE]\n> You can read more detailed information about creating PostgreSQL users in [Create users in Azure Database for PostgreSQL](/azure/PostgreSQL/flexible-server/how-to-create-users).\n\n---\n\n## Store data from Azure Database for PostgreSQL\n\nNow that you have an Azure Database for PostgreSQL Single server instance, you can store data by using Spring Cloud Azure.\n\nTo install the Spring Cloud Azure Starter JDBC PostgreSQL module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Starter JDBC PostgreSQL artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-jdbc-postgresql</artifactId>\n  </dependency>\n  ```\n\n> [!NOTE]\n> Passwordless connections have been supported since version `4.5.0`.\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-conclusion.md",
    "content": "---\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\nauthor: KarlErickson\n---\n\n## Clean up resources\n\nTo clean up all resources used during this quickstart, delete the resource group by using the following command:\n\n```azurecli\naz group delete \\\n    --name $AZ_RESOURCE_GROUP \\\n    --yes\n```\n\n## Next steps\n\nTo learn more about deploying a Spring Data application to Azure Spring Apps and using managed identity, see [Tutorial: Deploy a Spring application to Azure Spring Apps with a passwordless connection to an Azure database](../deploy-passwordless-spring-database-app.md).\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Spring on Azure](../index.yml)\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-create-reactive.md",
    "content": "---\nauthor: KarlErickson\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\n---\n\n## Create a reactive Spring Boot application\n\nTo create a reactive Spring Boot application, we'll use [Spring Initializr](https://start.spring.io/). The application that we'll create uses:\n\n- Spring Boot 2.7.11.\n- The following dependencies: Spring Reactive Web (also known as Spring WebFlux) and Spring Data R2DBC.\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-jdbc-create-application.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n<!-- NOTE: The item number must be 3 here to force continuation of the sequence after previous steps in the file that includes this file. Otherwise, the numbering will reset to 1. -->\n3. Create a new `Todo` Java class. This class is a domain model mapped onto the `todo` table that will be created automatically by Spring Boot. The following code ignores the `getters` and `setters` methods.\n\n   ```java\n   import org.springframework.data.annotation.Id;\n\n   public class Todo {\n\n       public Todo() {\n       }\n\n       public Todo(String description, String details, boolean done) {\n           this.description = description;\n           this.details = details;\n           this.done = done;\n       }\n\n       @Id\n       private Long id;\n\n       private String description;\n\n       private String details;\n\n       private boolean done;\n\n   }\n   ```\n\n1. Edit the startup class file to show the following content.\n\n   ```java\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.boot.context.event.ApplicationReadyEvent;\n   import org.springframework.context.ApplicationListener;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.data.repository.CrudRepository;\n\n   import java.util.stream.Stream;\n\n   @SpringBootApplication\n   public class DemoApplication {\n\n       public static void main(String[] args) {\n           SpringApplication.run(DemoApplication.class, args);\n       }\n\n       @Bean\n       ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {\n           return event->repository\n               .saveAll(Stream.of(\"A\", \"B\", \"C\").map(name->new Todo(\"configuration\", \"congratulations, you have set up correctly!\", true)).toList())\n               .forEach(System.out::println);\n       }\n\n   }\n\n   interface TodoRepository extends CrudRepository<Todo, Long> {\n\n   }\n   ```\n\n   [!INCLUDE [spring-default-azure-credential-overview.md](spring-default-azure-credential-overview.md)]\n\n1. Start the application. The application stores data into the database. You'll see logs similar to the following example:\n\n   ```shell\n   2023-02-01 10:22:36.701 DEBUG 7948 --- [main] o.s.jdbc.core.JdbcTemplate : Executing prepared SQL statement [INSERT INTO todo (description, details, done) VALUES (?, ?, ?)]    \n   com.example.demo.Todo@4bdb04c8\n   ```\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-jpa-create-application.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n<!-- NOTE: The item number must be 2 here to force continuation of the sequence after previous steps in the file that includes this file. Otherwise, the numbering will reset to 1. -->\n2. Create a new `Todo` Java class. This class is a domain model mapped onto the `todo` table that will be created automatically by JPA. The following code ignores the `getters` and `setters` methods.\n\n   ```java\n   package com.example.demo;\n\n   import javax.persistence.Entity;\n   import javax.persistence.GeneratedValue;\n   import javax.persistence.Id;\n\n   @Entity\n   public class Todo {\n\n       public Todo() {\n       }\n\n       public Todo(String description, String details, boolean done) {\n           this.description = description;\n           this.details = details;\n           this.done = done;\n       }\n\n       @Id\n       @GeneratedValue\n       private Long id;\n\n       private String description;\n\n       private String details;\n\n       private boolean done;\n\n   }\n   ```\n\n1. Edit the startup class file to show the following content.\n\n   ```java\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.boot.context.event.ApplicationReadyEvent;\n   import org.springframework.context.ApplicationListener;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.data.jpa.repository.JpaRepository;\n   \n   import java.util.stream.Collectors;\n   import java.util.stream.Stream;\n\n   @SpringBootApplication\n   public class DemoApplication {\n\n       public static void main(String[] args) {\n           SpringApplication.run(DemoApplication.class, args);\n       }\n\n       @Bean\n       ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {\n           return event->repository\n               .saveAll(Stream.of(\"A\", \"B\", \"C\").map(name->new Todo(\"configuration\", \"congratulations, you have set up correctly!\", true)).collect(Collectors.toList()))\n               .forEach(System.out::println);\n       }\n\n   }\n\n   interface TodoRepository extends JpaRepository<Todo, Long> {\n\n   }\n   ```\n\n   [!INCLUDE [spring-default-azure-credential-overview.md](spring-default-azure-credential-overview.md)]\n\n1. Start the application. You'll see logs similar to the following example:\n\n   ```shell\n   2023-02-01 10:29:19.763 DEBUG 4392 --- [main] org.hibernate.SQL : insert into todo (description, details, done, id) values (?, ?, ?, ?)\n   com.example.demo.Todo@1f\n   ```\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-prerequisites.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n- [Java Development Kit (JDK)](/java/azure/jdk/), version 8 or higher.\n\n- [Apache Maven](https://maven.apache.org).\n\n- [Azure CLI](/cli/azure/install-azure-cli).\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-r2dbc-create-application.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\nCreate a new `Todo` Java class, next to the `DemoApplication` class, using the following code:\n\n```java\npackage com.example.demo;\n\nimport org.springframework.data.annotation.Id;\n\npublic class Todo {\n\n    public Todo() {\n    }\n\n    public Todo(String description, String details, boolean done) {\n        this.description = description;\n        this.details = details;\n        this.done = done;\n    }\n\n    @Id\n    private Long id;\n\n    private String description;\n\n    private String details;\n\n    private boolean done;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public void setDescription(String description) {\n        this.description = description;\n    }\n\n    public String getDetails() {\n        return details;\n    }\n\n    public void setDetails(String details) {\n        this.details = details;\n    }\n\n    public boolean isDone() {\n        return done;\n    }\n\n    public void setDone(boolean done) {\n        this.done = done;\n    }\n}\n```\n\nThis class is a domain model mapped on the `todo` table that you created before.\n\nTo manage that class, you need a repository. Define a new `TodoRepository` interface in the same package, using the following code:\n\n```java\npackage com.example.demo;\n\nimport org.springframework.data.repository.reactive.ReactiveCrudRepository;\n\npublic interface TodoRepository extends ReactiveCrudRepository<Todo, Long> {\n}\n```\n\nThis repository is a reactive repository that Spring Data R2DBC manages.\n\nFinish the application by creating a controller that can store and retrieve data. Implement a `TodoController` class in the same package, and add the following code:\n\n```java\npackage com.example.demo;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.*;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\n@RestController\n@RequestMapping(\"/\")\npublic class TodoController {\n\n    private final TodoRepository todoRepository;\n\n    public TodoController(TodoRepository todoRepository) {\n        this.todoRepository = todoRepository;\n    }\n\n    @PostMapping(\"/\")\n    @ResponseStatus(HttpStatus.CREATED)\n    public Mono<Todo> createTodo(@RequestBody Todo todo) {\n        return todoRepository.save(todo);\n    }\n\n    @GetMapping(\"/\")\n    public Flux<Todo> getTodos() {\n        return todoRepository.findAll();\n    }\n}\n```\n\nFinally, halt the application and start it again using the following command:\n\n```bash\n./mvnw spring-boot:run\n```\n\n## Test the application\n\nTo test the application, you can use cURL.\n\nFirst, create a new \"todo\" item in the database using the following command:\n\n```bash\ncurl --header \"Content-Type: application/json\" \\\n    --request POST \\\n    --data '{\"description\":\"configuration\",\"details\":\"congratulations, you have set up R2DBC correctly!\",\"done\": \"true\"}' \\\n    http://127.0.0.1:8080\n```\n\nThis command should return the created item, as shown here:\n\n```json\n{\"id\":1,\"description\":\"configuration\",\"details\":\"congratulations, you have set up R2DBC correctly!\",\"done\":true}\n```\n\nNext, retrieve the data by using a new cURL request with the following command:\n\n```bash\ncurl http://127.0.0.1:8080\n```\n\nThis command will return the list of \"todo\" items, including the item you've created, as shown here:\n\n```json\n[{\"id\":1,\"description\":\"configuration\",\"details\":\"congratulations, you have set up R2DBC correctly!\",\"done\":true}]\n```\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-r2dbc-create-schema.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\nInside the main `DemoApplication` class, configure a new Spring bean that will create a database schema, using the following code:\n\n```java\npackage com.example.demo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.core.io.ClassPathResource;\nimport org.springframework.data.r2dbc.connectionfactory.init.ConnectionFactoryInitializer;\nimport org.springframework.data.r2dbc.connectionfactory.init.ResourceDatabasePopulator;\n\nimport io.r2dbc.spi.ConnectionFactory;\n\n@SpringBootApplication\npublic class DemoApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(DemoApplication.class, args);\n    }\n\n    @Bean\n    public ConnectionFactoryInitializer initializer(ConnectionFactory connectionFactory) {\n        ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();\n        initializer.setConnectionFactory(connectionFactory);\n        ResourceDatabasePopulator populator = new ResourceDatabasePopulator(new ClassPathResource(\"schema.sql\"));\n        initializer.setDatabasePopulator(populator);\n        return initializer;\n    }\n}\n```\n\nThis Spring bean uses a file called **schema.sql**, so create that file in the **src/main/resources** folder, and add the following text:\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-data-sql-server-setup.md",
    "content": "---\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\n---\n\n## Configure a firewall rule for your Azure SQL Database server\n\nAzure SQL Database instances are secured by default. They have a firewall that doesn't allow any incoming connection.\n\nTo be able to use your database, open the server's firewall to allow the local IP address to access the database server. For more information, see [Tutorial: Secure a database in Azure SQL Database](/azure/azure-sql/database/secure-database-tutorial).\n\nIf you're connecting to your Azure SQL Database server from Windows Subsystem for Linux (WSL) on a Windows computer, you need to add the WSL host ID to your firewall.\n\n## Create an SQL database non-admin user and grant permission\n\nThis step will create a non-admin user and grant all permissions on the `demo` database to it.\n\n### [Passwordless (Recommended)](#tab/passwordless)\n\nTo use passwordless connections, see [Tutorial: Secure a database in Azure SQL Database](/azure/azure-sql/database/secure-database-tutorial) or use Service Connector to create a Microsoft Entra admin user for your Azure SQL Database server, as shown in the following steps:\n\n1. First, install the [Service Connector](/azure/service-connector/overview) passwordless extension for the Azure CLI:\n\n   ```azurecli\n   az extension add --name serviceconnector-passwordless --upgrade\n   ```\n\n1. Then, use the following command to create the Microsoft Entra non-admin user:\n\n   ```azurecli\n   az connection create sql \\\n       --resource-group <your-resource-group-name> \\\n       --connection sql_conn \\\n       --target-resource-group <your-resource-group-name> \\\n       --server sqlservertest \\\n       --database demo \\\n       --user-account \\\n       --query authInfo.userName \\\n       --output tsv\n   ```\n\nThe Microsoft Entra admin you created is an SQL database admin user, so you don't need to create a new user.\n\n> [!IMPORTANT]\n> Azure SQL database passwordless connections require upgrading the [MS SQL Server Driver](https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc) to version `12.1.0` or higher. The connection option is `authentication=DefaultAzureCredential` in version `12.1.0` and `authentication=ActiveDirectoryDefault` in version `12.2.0`.\n\n### [Password](#tab/password)\n\n1. First, create a SQL script called **create_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n   ```bash\n   cat << EOF > create_user.sql\n   USE demo;\n   GO\n   CREATE USER <your_sql_server_non_admin_username> WITH PASSWORD='<your_sql_server_non_admin_password>'\n   GO\n   GRANT CONTROL ON DATABASE::demo TO <your_sql_server_non_admin_username>;\n   GO\n   EOF\n   ```\n\n1. Then, use the following command to run the SQL script to create the non-admin user:\n\n   ```bash\n   sqlcmd -S sqlservertest.database.windows.net,1433 -d demo -U <your_sql_server_admin_username> -P <your_sql_server_admin_password> -i create_user.sql\n   ```\n\n> [!NOTE]\n> For more information about creating SQL database users, see [CREATE USER (Transact-SQL)](/sql/t-sql/statements/create-user-transact-sql).\n\n---\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-default-azure-credential-overview.md",
    "content": "---\nms.date: 08/19/2025\nms.author: karler\nms.reviewer: seal\nauthor: KarlErickson\n---\n\n> [!TIP]\n> In this tutorial, there are no authentication operations in the configurations or the code. However, connecting to Azure services requires authentication. To complete the authentication, you need to use Azure Identity. Spring Cloud Azure uses `DefaultAzureCredential`, which the Azure Identity library provides to help you get credentials without any code changes.\n>\n> `DefaultAzureCredential` supports multiple authentication methods and determines which method to use at runtime. This approach enables your app to use different authentication methods in different environments (such as local and production environments) without implementing environment-specific code. For more information, see [DefaultAzureCredential](../../sdk/authentication/azure-hosted-apps.md#defaultazurecredential).\n>\n> To complete the authentication in local development environments, you can use Azure CLI, Visual Studio Code, PowerShell, or other methods. For more information, see [Azure authentication in Java development environments](../../sdk/authentication/dev-env.md). To complete the authentication in Azure hosting environments, we recommend using user-assigned managed identity. For more information, see [What are managed identities for Azure resources?](/azure/active-directory/managed-identities-azure-resources/overview)\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-jms-passwordless-queue.md",
    "content": "#### [Passwordless (Recommended)](#tab/passwordless)\n\n> [!NOTE]\n> Azure Service Bus JMS supports using Microsoft Entra ID to authorize requests to Service Bus resources. With Microsoft Entra ID, you can use [Azure role-based access control (Azure RBAC)](/azure/role-based-access-control/overview) to grant permissions to a [security principal](/azure/active-directory/develop/app-objects-and-service-principals#service-principal-object), which may be a user or an application service principal.\n\n> [!IMPORTANT]\n> Before you start, ensure that you've assigned the **Azure Service Bus Data Owner** role to the Microsoft Entra account you're currently using. For more information, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal).\n\n   ```properties\n   spring.jms.servicebus.namespace=<ServiceBusNamespace>\n   spring.jms.servicebus.pricing-tier=<ServiceBusPricingTier>\n   spring.jms.servicebus.passwordless-enabled=true\n   spring.jms.listener.receive-timeout=60000\n   ```\n\nThe following table describes the fields in the configuration:\n\n| Field                                        | Description                                                                                                                                                                                              |\n|----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `spring.jms.servicebus.namespace`  | Specify the namespace you obtained in your Service Bus service instance from the Azure portal.                                                                                                           |\n| `spring.jms.servicebus.pricing-tier` | Specify the pricing tier of your service bus. Supported values are `premium` and `standard`. Premium tier uses Java Message Service (JMS) 2.0, while standard tier use JMS 1.1 to interact with Azure Service Bus. |\n| `spring.jms.servicebus.passwordless-enabled` | Specify whether to use passwordless.                                                                                                                                                                     |\n| `spring.jms.listener.receive-timeout`        | By default the receive timeout value is 1000. We recommend that you set it to 60000                                                                                                                      |                                                                                         \n\n#### [Connection string](#tab/connection-string)\n\n   ```properties\n   spring.jms.servicebus.connection-string=<ServiceBusNamespaceConnectionString>\n   spring.jms.servicebus.pricing-tier=<ServiceBusPricingTier>\n   spring.jms.listener.receive-timeout=60000\n   ```\n\nThe following table describes the fields in the configuration:\n\n| Field                                     | Description                                                                                                                                                                                              |\n|-------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `spring.jms.servicebus.connection-string` | Specify the connection string you obtained in your Service Bus namespace from the Azure portal.                                                                                                          |\n| `spring.jms.servicebus.pricing-tier`      | Specify the pricing tier of your service bus. Supported values are `premium` and `standard`. Premium tier uses Java Message Service (JMS) 2.0, while standard tier use JMS 1.1 to interact with Azure Service Bus. |\n| `spring.jms.listener.receive-timeout`        | By default the receive timeout value is 1000. We recommend that you set it to 60000                                                                                                                      |                                                                                       \n\n---\n"
  },
  {
    "path": "articles/java/spring-framework/includes/spring-jms-passwordless-topic.md",
    "content": "#### [Passwordless (Recommended)](#tab/passwordless)\n\n> [!NOTE]\n> Azure Service Bus JMS supports using Microsoft Entra ID to authorize requests to Service Bus resources. With Microsoft Entra ID, you can use [Azure role-based access control (Azure RBAC)](/azure/role-based-access-control/overview) to grant permissions to a [security principal](/azure/active-directory/develop/app-objects-and-service-principals#service-principal-object), which may be a user or an application service principal.\n\n> [!IMPORTANT]\n> Before you start, ensure that you've assigned the **Azure Service Bus Data Owner** role to the Microsoft Entra account you're currently using. For more information, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal).\n\n   ```properties\n   spring.jms.servicebus.namespace=<ServiceBusNamespace>\n   spring.jms.servicebus.topic-client-id=<ServiceBusSubscriptionID>\n   spring.jms.servicebus.pricing-tier=<ServiceBusPricingTier>\n   spring.jms.servicebus.passwordless-enabled=true\n   spring.jms.listener.receive-timeout=60000\n   ```\n\nThe following table describes the fields in the configuration:\n\n| Field                                        | Description                                                                                                                                                                                              |\n|----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `spring.jms.servicebus.namespace`            | Specify the namespace you obtained in your Service Bus service instance from the Azure portal.                                                                                                           |\n| `spring.jms.servicebus.pricing-tier`         | Specify the pricing tier of your service bus. Supported values are `premium` and `standard`. Premium tier uses Java Message Service (JMS) 2.0, while standard tier use JMS 1.1 to interact with Azure Service Bus. |\n| `spring.jms.servicebus.topic-client-id`      | Specify the JMS client ID, which is your Service Bus subscription ID in the Azure portal.                                                                                                                |\n| `spring.jms.servicebus.passwordless-enabled` | Specify whether to use passwordless.                                                                                                                                                                     |\n| `spring.jms.listener.receive-timeout`        | By default the receive timeout value is 1000. We recommend that you set it to 60000                                                                                                                      |                                        \n\n#### [Connection string](#tab/connection-string)\n\n   ```properties\n   spring.jms.servicebus.connection-string=<ServiceBusNamespaceConnectionString>\n   spring.jms.servicebus.topic-client-id=<ServiceBusSubscriptionID>\n   spring.jms.servicebus.pricing-tier=<ServiceBusPricingTier>\n   spring.jms.listener.receive-timeout=60000\n   ```\n\nThe following table describes the fields in the configuration:\n\n| Field                                     | Description                                                                                                                                                                                              |\n|-------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `spring.jms.servicebus.connection-string` | Specify the connection string you obtained in your Service Bus namespace from the Azure portal.                                                                                                          |\n| `spring.jms.servicebus.pricing-tier`      | Specify the pricing tier of your service bus. Supported values are `premium` and `standard`. Premium tier uses Java Message Service (JMS) 2.0, while standard tier use JMS 1.1 to interact with Azure Service Bus. |\n| `spring.jms.servicebus.topic-client-id`   | Specify the JMS client ID, which is your Service Bus subscription ID in the Azure portal.                                                                                                                |\n| `spring.jms.listener.receive-timeout`        | By default the receive timeout value is 1000. We recommend that you set it to 60000                                                                                                                      |                                        \n\n---\n"
  },
  {
    "path": "articles/java/spring-framework/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Spring Cloud Azure documentation\nsummary: Spring is an open-source application framework developed by VMware that provides a simplified, modular approach for creating Java applications. The content on this website shows you how to develop and deploy Spring apps to the cloud.\n\nmetadata:\n  title: Spring Cloud Azure Documentation\n  description: Spring is an open-source application framework developed by VMware that provides a simplified, modular approach for creating Java applications.\n  ms.date: 03/18/2026\n  ms.update-cycle: 365-days\n  ms.topic: landing-page\n  author: KarlErickson\n  ms.author: karler\n  ms.reviewer: seal\n  ms.custom: spring-cloud-azure, devx-track-java\n\nlandingContent:\n  - title: Overview\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Spring Cloud Azure overview\n            url: ./spring-cloud-azure-overview.md\n  - title: Security\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Secure REST API using Spring Security and Microsoft Entra ID\n            url: ./configure-spring-boot-starter-java-app-with-entra.md\n          - text: Spring Security support\n            url: ./spring-boot-starter-for-entra-developer-guide.md\n          - text: Load a secret from Azure Key Vault\n            url: ./configure-spring-boot-starter-java-app-with-azure-key-vault.md\n          - text: Enable OIDC sign-in for Spring with Azure AD B2C\n            url: ./configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc.md\n          - text: Enable HTTPS in Spring Boot with Azure Key Vault certificates\n            url: ./configure-spring-boot-starter-java-app-with-azure-key-vault-certificates.md\n  - title: Database\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Accessing data with Azure Cosmos DB NoSQL API\n            url: ./configure-spring-boot-starter-java-app-with-cosmos-db.md\n          - text: Azure Cosmos DB Dev Guide\n            url: ./how-to-guides-spring-data-cosmosdb.md\n          - text: Use Spring Data with Azure Cosmos DB for MongoDB API\n            url: ./configure-spring-data-mongodb-with-cosmos-db.md\n          - text: JDBC with Azure SQL Server\n            url: ./configure-spring-data-jdbc-with-azure-sql-server.md\n          - text: JDBC with Azure PostgreSQL\n            url: ./configure-spring-data-jdbc-with-azure-postgresql.md\n          - text: JDBC with Azure MySQL\n            url: ./configure-spring-data-jdbc-with-azure-mysql.md\n          - text: JPA with Azure SQL Database\n            url: ./configure-spring-data-jpa-with-azure-sql-server.md\n          - text: JPA with Azure MySQL\n            url: ./configure-spring-data-jpa-with-azure-mysql.md\n          - text: R2DBC with Azure PostgreSQL\n            url: ./configure-spring-data-r2dbc-with-azure-postgresql.md\n          - text: R2DBC with Azure SQL Server\n            url: ./configure-spring-data-r2dbc-with-azure-sql-server.md\n  - title: Messaging\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Use JMS to access Azure Service Bus\n            url: ./configure-spring-boot-starter-java-app-with-azure-service-bus.md\n          - text: Spring Cloud Stream with Azure Event Hubs\n            url: ./configure-spring-cloud-stream-binder-java-app-azure-event-hub.md\n          - text: Spring Cloud Stream with Azure Service Bus\n            url: ./configure-spring-cloud-stream-binder-java-app-with-service-bus.md\n          - text: Use Spring Kafka with Azure Event Hubs for Kafka API\n            url: ./configure-spring-cloud-stream-binder-java-app-kafka-azure-event-hub.md\n          - text: Use Azure Service Bus in Spring applications\n            url: ./using-service-bus-in-spring-applications.md\n          - text: Use Azure Event Grid in Spring applications\n            url: ./configure-spring-boot-initializer-java-app-with-event-grid.md\n  - title: Storage\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Upload a file to Azure Storage Blob\n            url: ./configure-spring-boot-starter-java-app-with-azure-storage.md\n  - title: Passwordless connections\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Access a database without passwords in Spring\n            url: ./deploy-passwordless-spring-database-app.md\n          - text: Migrate to use passwordless connections - Azure MySQL\n            url: ./migrate-mysql-to-passwordless-connection.md\n          - text: Migrate to use passwordless connections - Azure PostgreSQL\n            url: ./migrate-postgresql-to-passwordless-connection.md\n          - text: Migrate to use passwordless connections - Azure SQL Database\n            url: ./migrate-sql-database-to-passwordless-connection.md\n          - text: Migrate to use passwordless connections - Azure Event Hubs for Kafka\n            url: ./migrate-sql-database-to-passwordless-connection.md\n  - title: Configuration management\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Externalize configuration properties to Azure App Configuration\n            url: /azure/azure-app-configuration/quickstart-java-spring-app?toc=/azure/developer/java/spring-framework/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Use Key Vault references\n            url: /azure/azure-app-configuration/use-key-vault-references-spring-boot?toc=/azure/developer/java/spring-framework/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Use feature flags\n            url: /azure/azure-app-configuration/use-feature-flags-spring-boot?toc=/azure/developer/java/spring-framework/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Add feature flags\n            url: /azure/azure-app-configuration/quickstart-feature-flag-spring-boot?toc=/azure/developer/java/spring-framework/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n          - text: Use dynamic configuration\n            url: /azure/azure-app-configuration/enable-dynamic-configuration-java-spring-app?toc=/azure/developer/java/spring-framework/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n  - title: Caching\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Use Azure Redis Cache in Spring\n            url: ./configure-spring-boot-initializer-java-app-with-redis-cache.md\n  - title: Testing\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Testcontainers\n            url: ./testcontainers-support.md\n          - text: Docker Compose\n            url: ./docker-compose-support.md\n"
  },
  {
    "path": "articles/java/spring-framework/kafka-support.md",
    "content": "---\ntitle: Spring Cloud Azure Kafka support\ndescription: This article describes how Spring Cloud Azure and Kafka can be used together.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure Kafka support\n\nFrom version 4.3.0, Spring Cloud Azure for Kafka supports various types of credentials to authenticate and connect to Azure Event Hubs.\n\n## Supported Kafka version\n\nThe current version of the starter should be compatible with Apache Kafka Clients 2.0.0 using Java 8 or higher.\n\n## Supported authentication types\n\nThe following authentication types are supported:\n\n- Plain connection string authentication\n  - Direct connection string authentication\n  - ARM-based connection string authentication\n- OAuth credential authentication\n  - Managed identity authentication\n  - Username/password authentication\n  - Service principal authentication\n  - `DefaultAzureCredential` authentication\n\n## How it works\n\n### OAuth credential authentication\n\nThis section describes the overall workflow of Spring Cloud Azure OAuth authentication.\n\nSpring Cloud Azure will first build one of the following types of credentials depending on the application authentication configuration:\n\n- `ClientSecretCredential`\n- `ClientCertificateCredential`\n- `UsernamePasswordCredential`\n- `ManagedIdentityCredential`\n\nIf none of these types of credentials are found, the credential chain via `DefaultAzureTokenCredential` will be used to obtain credentials from application properties, environment variables, managed identity, or IDEs. For detailed information, see [Spring Cloud Azure authentication](authentication.md).\n\n### Plain connection string authentication\n\nFor the connection string authentication mode, you can use connection string authentication directly or use the Azure Resource Manager to retrieve the connection string. For more information about the usage, see the [Basic usage for connection string authentication](#basic-usage-connection-string) section.\n\n> [!NOTE]\n> Since version of 4.3.0, connection string authentication is deprecated in favor of OAuth authentications.\n\n## Configuration\n\n### Configurable properties when using Kafka support with OAuth authentication\n\nSpring Cloud Azure for Kafka supports the following two levels of configuration options:\n\n1. Spring Cloud Azure for Event Hubs Kafka properties.\n1. The global authentication configuration options of `credential` and `profile` with prefixes of `spring.cloud.azure`.\n1. Kafka-specific level configurations. The Kafka-level configurations are also available for Spring Boot and Spring Cloud Stream binders for `common`, `consumer`, `producer`, or `admin` scopes, which have different prefixes.\n\nThe global properties are exposed via `com.azure.spring.cloud.autoconfigure.context.AzureGlobalProperties`. The Kafka-specific properties are exposed via `org.springframework.boot.autoconfigure.kafka.KafkaProperties` (Spring Boot) and `org.springframework.cloud.stream.binder.kafka.properties.KafkaBinderConfigurationProperties` (Spring Cloud Stream binder).\n\nThe following list shows all supported configuration options.\n\n- Spring Cloud Azure for Event Hubs Kafka properties.\n\n  - Property: `spring.cloud.azure.eventhubs.kafka.enabled`\n  - Description: whether to enable credential free connection to Azure Event Hubs for Kafka, the default value is `true`.\n\n- The Spring Cloud Azure global authentication configuration options\n\n  - Prefix: `spring.cloud.azure`\n  - Supported options: `spring.cloud.azure.credential.*`, `spring.cloud.azure.profile.*`\n\n  For the full list of global configuration options, see [Global configuration properties](configuration-properties-global.md).\n\n- Spring Boot Kafka common configuration\n\n  - Prefix: `spring.kafka.properties.azure`\n  - Example: `spring.kafka.properties.azure`.credential.*\n\n- Spring Kafka consumer configuration options\n\n  - Prefix: `spring.kafka.consumer.properties.azure`\n  - Example: `spring.kafka.consumer.properties.azure`.credential.*\n\n- Spring Kafka producer configuration options\n\n  - Prefix: `spring.kafka.producer.properties.azure`\n  - Example: `spring.kafka.producer.properties.azure`.credential.*\n\n- Spring Kafka admin configuration options\n\n  - Prefix: `spring.kafka.admin.properties.azure`\n  - Example: `spring.kafka.admin.properties.azure`.credential.*\n\n- Spring Cloud Stream Kafka Binder common configuration\n\n  - Prefix: `spring.cloud.stream.kafka.binder.configuration.azure`\n  - Example: `spring.cloud.stream.kafka.binder.configuration.azure`.credential.*\n\n- Spring Cloud Stream Kafka Binder consumer configuration\n\n  - Prefix: `spring.cloud.stream.kafka.binder.consumer-properties.azure`\n  - Example: `spring.cloud.stream.kafka.binder.consumer-properties.azure`.credential.*\n\n- Spring Cloud Stream Kafka Binder producer configuration\n\n  - Prefix: `spring.cloud.stream.kafka.binder.producer-properties.azure`\n  - Example: `spring.cloud.stream.kafka.binder.producer-properties.azure`.credential.*\n\n- Spring Cloud Stream Kafka Binder admin configuration\n\n  - Prefix: Not supported, should use Spring Boot Kafka common or admin configuration.\n\nThe following table shows the Spring Boot Kafka common configuration options:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                                                                                         | Description                                                                                                                                                                                            |\n> |--------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.kafka.properties.azure.credential.client-certificate-password`                                         | Password of the certificate file.                                                                                                                                                                      |\n> | `spring.kafka.properties.azure.credential.client-certificate-path`                                             | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                     |\n> | `spring.kafka.properties.azure.credential.client-id`                                                           | Client ID to use when performing service principal authentication with Azure. This is a legacy property.                                                                                               |\n> | `spring.kafka.properties.azure.credential.client-secret`                                                       | Client secret to use when performing service principal authentication with Azure. This is a legacy property.                                                                                           |\n> | `spring.kafka.properties.azure.credential.managed-identity-enabled`                                            | Whether to enable managed identity to authenticate with Azure. If `true` and the `client-id` is set, will use the client ID as user assigned managed identity client ID. The default value is `false`. |\n> | `spring.kafka.properties.azure.credential.password`                                                            | Password to use when performing username/password authentication with Azure.                                                                                                                           |\n> | `spring.kafka.properties.azure.credential.username`                                                            | Username to use when performing username/password authentication with Azure.                                                                                                                           |\n> | `spring.kafka.properties.azure.profile.environment.active-directory-endpoint`                                  | The Microsoft Entra endpoint to connect to.                                                                                                                                                     |\n> | `spring.kafka.properties.azure.profile.tenant-id`                                                              | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                              |\n\n> [!NOTE]\n> The configuration options in different levels apply the following rules. The more specific configuration options have higher priority than the common ones. For example:\n>\n> - Spring Kafka common configuration options supersede the global options.\n> - Spring Kafka consumer configuration options supersede the common options.\n> - Spring Kafka producer configuration options supersede the common options.\n> - Spring Kafka admin configuration options supersede the common options.\n> - The Spring Cloud Stream Kafka Binder options are just like the above.\n\n### Configurable properties when using Kafka support with plain connection string authentication\n\nThe following table shows the Spring Boot Event Hubs for Kafka common configuration options:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                 | Description                                                                                                                                               |\n> |----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.eventhubs.kafka.enabled`           | Whether to enable the Azure Event Hubs Kafka support. The default value is `true`.                                                                        |\n> | `spring.cloud.azure.eventhubs.connection-string`       | Azure Event Hubs connection string. Provide this value when you want to provide the connection string directly.                                           |\n> | `spring.cloud.azure.eventhubs.namespace`               | Azure Event Hubs namespace. Provide this value when you want to retrieve the connection information through Azure Resource Manager.                       |\n> | `spring.cloud.azure.eventhubs.resource.resource-group` | The resource group of Azure Event Hubs namespace. Provide this value when you want to retrieve the connection information through Azure Resource Manager. |\n> | `spring.cloud.azure.profile.subscription-id`           | The subscription ID. Provide this value when you want to retrieve the connection information through Azure Resource Manager.                              |\n\n## Dependency setup\n\nAdd the following dependency to your project. This will automatically include the `spring-boot-starter` dependency in your project transitively.\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n</dependency>\n```\n\n> [!NOTE]\n> Remember to add the BOM `spring-cloud-azure-dependencies` along with the above dependency. For details, see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n## Basic usage\n\nThe following sections show the classic Spring Boot application usage scenarios.\n\n### Use OAuth authentication\n\nWhen you use the OAuth authentication provided by Spring Cloud Azure for Kafka, you can configure the specific credentials using the above configurations. Alternatively, you can choose to configure nothing about credentials, in which case Spring Cloud Azure will load the credentials from the environment. This section describes the usages that load the credentials from the Azure CLI environment or the Azure Spring Apps hosting environment.\n\n> [!NOTE]\n> If you choose to use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, see the [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id) section to make sure the security principal has been granted the sufficient permission to access the Azure resource.\n\nThe following section describes the scenarios using different Spring ecosystem libraries with OAuth authentication.\n\n#### Spring Kafka application support\n\nThis section describes the usage scenario for Spring Boot application using Spring Kafka or Spring Integration Kafka library.\n\n##### Dependency setup\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n</dependency>\n<!-- Using Spring Kafka library only-->\n<dependency>\n    <groupId>org.springframework.kafka</groupId>\n    <artifactId>spring-kafka</artifactId>\n    <version>{version}</version><!--Need to be set, for example:2.8.6-->\n</dependency>\n<!-- Using Spring Integration library only -->\n<dependency>\n    <groupId>org.springframework.integration</groupId>\n    <artifactId>spring-integration-kafka</artifactId>\n    <version>{version}</version><!--Need to be set, for example:5.5.12-->\n</dependency>\n```\n\n<a name=\"spring-kafka-configuration-setup\"></a>\n##### Configuration update\n\nTo use the OAuth authentication, just specify the Event Hubs endpoint, as shown in the following example:\n\n```properties\nspring.kafka.bootstrap-servers=<NAMESPACENAME>.servicebus.windows.net:9093\n```\n\n#### Spring Cloud Stream binder Kafka application support\n\nThis section describes the usage scenario for Spring Boot applications using the Spring Cloud Stream binder Kafka library.\n\n##### Dependency setup\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n</dependency>\n<dependency>\n    <groupId>org.springframework.cloud</groupId>\n    <artifactId>spring-cloud-starter-stream-kafka</artifactId>\n    <version>{version}</version><!--Need to be set, for example:3.2.3-->\n</dependency>\n```\n\n##### Configuration\n\nTo use the OAuth authentication, just specify the Event Hubs endpoint as shown in the following example:\n\n```properties\nspring.cloud.stream.kafka.binder.brokers=<NAMESPACENAME>.servicebus.windows.net:9093\n```\n\n> [!NOTE]\n> If you're using version `4.3.0`, don't forget to set the `spring.cloud.stream.binders.<kafka-binder-name>.environment.spring.main.sources=com.azure.spring.cloud.autoconfigure.kafka.AzureKafkaSpringCloudStreamConfiguration` property to enable the whole OAuth authentication workflow, where `kafka-binder-name` is `kafka` by default in a single Kafka binder application. The configuration `AzureKafkaSpringCloudStreamConfiguration` specifies the OAuth security parameters for `KafkaBinderConfigurationProperties`, which is used in `KafkaOAuth2AuthenticateCallbackHandler` to enable Azure Identity.\n>\n> For version after `4.4.0`, this property will be added automatically for each Kafka binder environment, so there's no need for you to add it manually.\n\n#### Use managed identity for OAuth authentication\n\n1. To use the managed identity, you need enable the managed identity for your service and assign the `Azure Event Hubs Data Receiver` and `Azure Event Hubs Data Sender` roles. For more information, see [Assign Azure roles for access rights](/azure/event-hubs/authorize-access-azure-active-directory#assign-azure-roles-for-access-rights).\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       azure:\n         credential:\n           managed-identity-enabled: true\n   ```\n\n   > [!IMPORTANT]\n   > If you're using user-assigned managed identity, you also need to add the property `spring.cloud.azure.credential.client-id` with your user-assigned managed identity client ID.\n\n##### Samples\n\nSee the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/eventhubs/spring-cloud-azure-starter/spring-cloud-azure-sample-eventhubs-kafka) repository on GitHub.\n\n<a name=\"basic-usage-connection-string\"></a>\n### Use connection string authentication\n\nYou can use connection string authentication directly or use the Azure Resource Manager to retrieve the connection string.\n\n###### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n> [!NOTE]\n> Since version of 5.0.0, when using connection string authentication with Spring Cloud Stream framework, the following property is still required to ensure that the connection string can take effect, where the value of `<kafka-binder-name>` should be `kafka` when there is no customized configuration for your Kafka binder name: `spring.cloud.stream.binders.<kafka-binder-name>.environment.spring.main.sources=com.azure.spring.cloud.autoconfigure.implementation.eventhubs.kafka.AzureEventHubsKafkaAutoConfiguration`\n>\n> If the version of `spring-cloud-dependencies` you used is `2022.0.0`, you'll encounter exception the `java.lang.IllegalStateException: kafka_context has not been refreshed yet`. To solve this problem, upgrade to a higher version.\n\n###### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n> [!NOTE]\n> Since version of 4.3.0, connection string authentication is deprecated in favor of OAuth authentications.\n>\n> Since version of 4.5.0, when using connection string authentication with Spring Cloud Stream framework, the following property is required to ensure that the connection string can take effect, where the value of `<kafka-binder-name>` should be `kafka` when there is no customized configuration for your Kafka binder name: `spring.cloud.stream.binders.<kafka-binder-name>.environment.spring.main.sources=com.azure.spring.cloud.autoconfigure.eventhubs.kafka.AzureEventHubsKafkaAutoConfiguration`\n\n---\n\n#### Dependency setup\n\nAdd the following dependencies if you want to migrate your Apache Kafka application to use Azure Event Hubs for Kafka.\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n</dependency>\n```\n\nIf you want to retrieve the connection string using Azure Resource Manager, add the following dependency:\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-resourcemanager</artifactId>\n</dependency>\n```\n\n#### Configuration\n\n##### Use Event Hubs connection string directly\n\nThe simplest way to connect to Event Hubs for Kafka is with the connection string. Just add the following property.\n\n```properties\nspring.cloud.azure.eventhubs.connection-string=${AZURE_EVENTHUBS_CONNECTION_STRING}\n```\n\n##### Use Azure Resource Manager to retrieve connection string\n\nIf you don't want to configure the connection string in your application, you can use Azure Resource Manager to retrieve the connection string. To authenticate with Azure Resource Manager, you can also use credentials stored in Azure CLI or another local development tool such as Visual Studio Code or Intellij IDEA. Alternately, you can use Managed Identity if your application is deployed to Azure Cloud. Just be sure the principal has sufficient permission to read resource metadata.\n\n> [!NOTE]\n> If you choose to use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, see the [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id) section to be sure the security principal has been granted the sufficient permission to access the Azure resource.\n\nTo use Azure Resource Manager to retrieve the connection string, just add the following property.\n\n```yaml\nspring:\n  cloud:\n    azure:\n      profile:\n        subscription-id: ${AZURE_SUBSCRIPTION_ID}\n      eventhubs:\n        namespace: ${AZURE_EVENTHUBS_NAMESPACE}\n        resource:\n          resource-group: ${AZURE_EVENTHUBS_RESOURCE_GROUP}\n```\n\n## Samples\n\nSee the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/media/configure-spring-boot-starter-java-app-with-azure-key-vault-certificates/spring-to-azure-key-vault-certificates.ai",
    "content": "%PDF-1.6\r%\r\n1 0 obj\r<</Metadata 2 0 R/OCProperties<</D<</ON[23 0 R 24 0 R]/Order 25 0 R/RBGroups[]>>/OCGs[23 0 R 24 0 R]>>/Pages 3 0 R/Type/Catalog>>\rendobj\r2 0 obj\r<</Length 78415/Subtype/XML/Type/Metadata>>stream\r\n<?xpacket begin=\"﻿\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"Adobe XMP Core 6.0-c004 79.164570, 2020/11/18-15:51:46        \">\n   <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n      <rdf:Description rdf:about=\"\"\n            xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n            xmlns:xmp=\"http://ns.adobe.com/xap/1.0/\"\n            xmlns:xmpGImg=\"http://ns.adobe.com/xap/1.0/g/img/\"\n            xmlns:xmpMM=\"http://ns.adobe.com/xap/1.0/mm/\"\n            xmlns:stRef=\"http://ns.adobe.com/xap/1.0/sType/ResourceRef#\"\n            xmlns:stEvt=\"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#\"\n            xmlns:illustrator=\"http://ns.adobe.com/illustrator/1.0/\"\n            xmlns:xmpTPg=\"http://ns.adobe.com/xap/1.0/t/pg/\"\n            xmlns:stDim=\"http://ns.adobe.com/xap/1.0/sType/Dimensions#\"\n            xmlns:stFnt=\"http://ns.adobe.com/xap/1.0/sType/Font#\"\n            xmlns:xmpG=\"http://ns.adobe.com/xap/1.0/g/\"\n            xmlns:pdf=\"http://ns.adobe.com/pdf/1.3/\"\n            xmlns:pdfx=\"http://ns.adobe.com/pdfx/1.3/\">\n         <dc:format>application/pdf</dc:format>\n         <dc:title>\n            <rdf:Alt>\n               <rdf:li xml:lang=\"x-default\">SecureSpringBoot</rdf:li>\n            </rdf:Alt>\n         </dc:title>\n         <xmp:CreatorTool>Adobe Illustrator 25.2 (Windows)</xmp:CreatorTool>\n         <xmp:CreateDate>2021-02-17T08:07:31-07:00</xmp:CreateDate>\n         <xmp:ModifyDate>2021-02-17T08:07:33-08:00</xmp:ModifyDate>\n         <xmp:MetadataDate>2021-02-17T08:07:33-08:00</xmp:MetadataDate>\n         <xmp:Thumbnails>\n            <rdf:Alt>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpGImg:width>256</xmpGImg:width>\n                  <xmpGImg:height>192</xmpGImg:height>\n                  <xmpGImg:format>JPEG</xmpGImg:format>\n                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAwAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYqx/zVr1vpL25mZ6SxzMqJ6lKxtHVm9L4qKrH/bzX6zMISjxGokHqRvca5fF2Oh0kswPD&#xA;WxHd596hDqWptMyyWssMaEcLkPO0bfGo2L/CQwORmZAdRy6y7x3p8OPeD5UO5KPMvnfzZpmrahbW&#xA;ml/Wba1KfVzHbXEzSc4SwXkrIpPqD4uI+Bd/jqeGydajNS8/39pd2dvbaBd3y3QtSZY1dABcqzM3&#xA;xJx4x8aGrBuRAp3xVjt9+Z/nyK4aWHytKbKBrVp7dILia5aO4VGZYzSJOa8yDUUWnfoFUZdfmt5g&#xA;ivzDb+Ury6t44uTTR+qqvIzQKqxtLDFtWV/tAbLy23oq9HUkqCQVJFSppUe21cVbxV2KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVj3nLyZZ+abW0guJ5LY2k3rCSKn&#xA;J1KMrRNX9h6jkO9MozaeOSuLo52h189MSY/xD8H3jov0+Sxu9Y1HT/0fdRLprRcLqb1RBOWUOfSL&#xA;GjemaA/0wflcfd9paPzE+/7An2ZDQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYqkd5eTwXtwsb8QXBI2/32mc92xq8uLIBCVCv0uZpsQkDYSHzV&#xA;52vtB0xbxIJb+SSaOCO1hpzdpDQBaK1T4Zr9PrNTklXicO3PZunhjEXTH3/Pby9HcRQSNerJMU4f&#xA;6PUUduINVJ22/wAztmUBriL4x9n6musXcu0v879F1TUbGwsjdNLfzGCNpI0jUMsYkYks3bkvTrXa&#xA;uDIdbCJkZ8h+OixGMmgGcR6ndmRAZTQkA7Dx+WYeLtHUmQBl18m2WnjXJkGdo6x2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVKZ9IF5d3EjSNHSQAADqPTTff&#xA;NfrOz455Ak1QcnDqDjFUs/w1F/y0P9wzE/kSH84t3549waPle3JBMxJFKHiNqdMP8iw/nFH549wa&#xA;Hla3FKSkU6UVf8+2P8iw/nFfzx7gqJ5djR1b13PEg0oO2GPYsAQeIqdaSKpN83LguxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvO/8H/mDNqbzXmts9nwmWGGG5uIOJdr0pUR8edPVtfi&#xA;O44kDp8SqrpHlPz1Z6vZ3dzq73dsswE9m9zOY1hSMLz3PKSQmuxon8ysx5Kqhb+3/O630+7lhvbG&#xA;5uaw/VIo0UEH0z6nImP4l9VhUUB4jY1rirrzTPzwulkCarYWiSmQLHEq8o0eSQofWaJ/ijjKA0T4&#xA;uxG7Yq9C09bpLC2S7bndLEguHJBrIFHM1UIOvgo+WKq+KsFuvK3ni68zQ3E2rsNAF3NLLZwzzwSC&#xA;FgPTTlFxLb/s8gBiqX2Hkz8xbZtPuJtbe4e3+pLc2jXdwYpSkEf1uSRz8ZrOJCirxry+KqgIFUTq&#xA;ll+cq3889nqVkdOE0rx2qxoZTB68hjQO0Z+MQenWoNWqKj7WKqNtZfnbLbxSPqFjCzK7NG4QuAVr&#xA;CrUgpz5AiWmxBXjQhiVU88m2n5iw3U7ear21uLYxKttFboOfqVqzswWPrv8ADQgDjQkgkqsrxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KrZpUhieWSvCNS7UBY0UVNAoJP0&#xA;Yql/lrVbHVtBsdQsJfXtJol9OXiy8uPwk0cKeoOKplirsVdirsVdiqHtj++u/wDjKP8Ak0mKojFX&#xA;Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FULeAGSMEVFG2PzXLcfItc+&#xA;ah6cf8o+7JWWNLY7e3ijWOOJEjQBURVAAA6AAY2Vpd6cf8o+7GytO9OP+UfdjZWnenH/ACj7sbK0&#xA;704/5R92Nlad6cf8o+7GytOEUQJIRQTudhuemNlaWyIgjchQCAaGnthB3QRsmeY7elmpajPb3Ajj&#xA;IC8QdxXxzn+0+0cuHLwwqqczBgjKNlAXPmGe2tpbiRh6cKNI9FqeKipp92a+PbGpJrb5Np00UkP5&#xA;reXUiEk+pQ2/wws6ygrw+sIroGP2fsupbf4aitMyPzutvYA8+ncw8LGjtC88Ra5Zveae/O3SV4Q7&#xA;px5GM0LKDvxPauV5u09VjNSq/cyjp4SFhNIdXunmRSVozAHbxODD2vqJTiDVEjostNEAlO86117s&#xA;VdirsVSq2VWt4mYAsUUknckkZkzO5cePIKnpx/yj7sjZZU704/5R92Nlad6cf8o+7GytO9OP+Ufd&#xA;jZWnenH/ACj7sbK0704/5R92NlaaICywlRxJkA2223w9D7kdQmWY7e7FXYq7FULd/wB7H/qv+tct&#xA;hyLXPmpZJDArzSvM3m3VL70LkWml2M7WyKzMAzxmjHio+I99/GmaDNDLqJyo1CJr5OIYTyE1sAyf&#xA;QfLdzotokc+oSXshehDEiNFKk8UUlu4Br91N65+kwSxbGRk5EMRgOdpVqnnG8sL+9t3tY0S3RmgE&#xA;rujzALXlH8BRhXqOVcrza+UJSFDbld7+7ZqlmIJFNXvm/VrGSOG50+Jp7lY5bWOKaoKvIEKOxUUb&#xA;4uvTHJrskCAYizRG/mssxHMLf8T6wmpy6dBYLcX7s3JPXPpq0cMTHjyUfDVjtg/OZBMwEbl79uQR&#xA;4srqt1tt511G9s7i7srGIxWNus16JZSp5MpakdFNaBa74IdoTnEyjEVEWd/uUZiRYHJk2mXNxdWk&#xA;dxNGsYmVZIlRi3wOit8VQu9Sc2OGZlGz1b4kkWrzV9GSnXiafdl0eaTyRXPUP98xf8jW/wCqeY7c&#xA;lOqWl1Pch3mt4DxA4NKa9TvuozT6/Qwy5OKUxHb8dXN0+YxjQiSg/wBDTXAMP1i1lEgKtHz5cgRu&#xA;COO4pmJDsiBO2QX+PNulqiBvA/j4Jc35W6M8fpvpWmsnwji0KkfACq9Y+wNMy/5Lyf6rL8fFp/NQ&#xA;/mfj5I/T/Jr6dbC2sIrW0twSwihBRanqaKgyqfYpkblOz7v2shrQOUft/Yi4tC1OOVJOcR4MGpyb&#xA;ehr/AC4cfYojIS4uR7v2rLW2COH7f2Jzz1D/AHzF/wAjW/6p5vHAdz1D/fMX/I1v+qeKu56h/vmL&#xA;/ka3/VPFUDrkvmldMmOjW1o+pVT0FuJX9Ld1D8+KKacK9DX54q6wMhsLYygLJ6ScwpJUNxFaEgVH&#xA;0Zkz5lojyCTedbHzZfaZDB5Zu4rG8WZZZZ5i26RKzrGAobaSVUV/8mvXpkCyCQLYfnI+oyg6jYQ6&#xA;dJdKYyQsk0VqJTzVaQIrt6RFOX7Q98G6dll5of5uXVlZs2rWSX8FzO86xGWGGSBjH6KNxQs3FlZj&#xA;0JX4a1JbHddnWFh+bVxp2qW+oajbpqNt9WfS7iOP0oZJQVmlRyByaPiPTY8aEs23w47rsh7/AEP8&#xA;6Xs7vT7bVbH6u0UkFpds8iXQHFFjlZ1i+38LE06M3U0x3XZnHl231i20a2g1m4F1qUYYXFwtKOeb&#xA;cTskY+zT9nCEI9/72D/jIv8AHJDkfcg8wmWY7c7FXYq7FULd/wB7H/qv+tcthyLXPmpZJCSXWn65&#xA;ZSSSaFLGI7mZ57q2nJCl3VQSjKpYV41O/XNfl0+SJJxkbmyC1ESH0ozT49YkWN9UMCmKpigtuZUM&#xA;RTm7yEszUJ/tPS7BjnznXuDKPEeaD1XyhpF+Lh+BiuplcCbk7BWcUZxGW4VPfIZtDjnZ5E/jkxlh&#xA;BX23lPQoKFbcs4MZDu7sR6RDIFqxooYVoNslDRYo9O77FGKIRaaPpyagdQWGl2xYmWrdXVVO1adE&#xA;GWjBAT469X4/Uy4Bd9Ug1P8AL+0upF+q3Js7YRiJoETlVQeX2uS13/m5Zg5uzIyPpPCOVfj9NtUt&#xA;ODy2ZRbwRwQRwR/3cSKiV60UUGbKMREADo3gUul/un/1T+rJx5qeSY5jtzCfM3mqXTPNVvpYCoL8&#xA;QcHLsjtV2jYpRTURA839vDNXnznHmqtpVv3O70ehjl05ne8eL9B+3kEx0mTUjd26Xt3BdN63KMW/&#xA;qfCohmDFuZPdlyUcnFOIsS9XS/5snGywiIyIBjt1r+dFINb8t/mRLq99caZfhLWT6wbUSXcw4mSI&#xA;qg9JFWMcWC8NtqsWDMFfNk61MNdtfzVm1CV9Gu7K0syUaGOYCQhRAOSH92DUzcqtyO3Ci7NyVSRv&#xA;K/5urrUl2NZSa2jjuBAr3DqHkeZZICYkhSIBEBTdT9I2CqK/Rf5ztqnrrqlpFaNcFRC/CULagoVJ&#xA;VYYeUrGtTyFFrTehxV6LirsVdiqV2n+8sP8AqL+oZkz+otEOQVciyad0jRpHYKiAszHYADcknEBB&#xA;LE7nzHrt4kcumC3srW4obWW7R5ZZIz0mMavEI0bqtSWI3IGartftvT6GQxy9eU8xxcIj75VL7m/S&#xA;aTJnBkPTDvqyfcLH3q+neZdSjMZ1ZIXtpHWJr22DxiKVzRBNE7SFUc7K4civUDL+ye08GvxmWK4z&#xA;jzgd/kdr+TDVYMmnlU94nlIfpHT5smzOYOxVY/8Aewf8ZF/jhHI+5B5hMsx252KuxV2KoW7/AL2P&#xA;/Vf9a5bDkWufNSySHYq7FUg80+Zn0gQQWsIudQuT+7h3NFHchdzU7DMDW6zwqERcy4+fPwUBuSx+&#xA;D8xNWjlie+sY1s24GSSPlUJJXi3Vh+ydswI9q5ARxRHD+txxrJXuNmexukiLIjBkcBlYbgg7gjN6&#xA;CCLDngrsKXYqtl/un/1T+rDHmg8kxzHbkHdaLpV1qFrqNzaxy31ly+qXDCrxcxRuB7VwGIJtsjmn&#xA;GJiD6Zc0Zha3Yq7FXYq7FVO6nFvbTTkchCjSFR34itMry5OCBl3An5M8cOKQj3lASa2sbskhtkdT&#xA;Rla5QEEdiCMoOomP4Y/6b9jeNODy4v8ASoyzufrERcrwKsyEA8hVTTY5dhy8Ysit6ackOE0grT/e&#xA;WH/UX9QzOn9RcSHIKuRZJL5zFfK+o15en6R9fj9r0aj1qf8APPll2m/vA06j6Cu82aZavAl+Govw&#xA;IVHQg7KVpnnXtd2bt+ZifV9JH6XoezNQfoCFk0yytfJOqzzHktzaS1B7fCwQLX9rkdvfNv7G6Dwo&#xA;Ry3c8pHwAP4tw+2M/GJRPKIKe2YmFpAJ/wC/9NfV/wBfiOX451Mqs066N1uq4GSx/wC9g/4yL/HC&#xA;OR9yDzCZZjtzsVdirsVQt3/ex/6r/rXLYci1z5qWSQ7FXYq86872stn5i+vXDMbO9haFJAK+kTGY&#xA;yPx5e4Jznu0YGGbiP0yFe7av2ut1ManZ5Fj0kgS3kja4juppoUtbeKEMaKsiuGaqr/LQDrvmvJoE&#xA;WJEihXvcYnbnfR6t5esp7HRLO0uG5TRRgP3oTvx/2NaZ1OlxmGOMTzAdthiYxAKYZkNrsVU7hQ0E&#xA;imtGVgaEg7jsRuMMeaDyU9D8s2ej6bHYQ3F3cRxvK4luLiV5SZpWlPJuQrQvQE7+NTmO3I/6jB/N&#xA;L/yOl/5qxV31GD+aX/kdL/zVirvqMH80v/I6X/mrFXfUYP5pf+R0v/NWKu+owfzS/wDI6X/mrFXf&#xA;UYP5pf8AkdL/AM1Yqh9R0hbnT7q2imlilnikjjkMsrBWdSoYgtvQnK80OKBj3ghtwZBCcZEWAQWF&#xA;eS9E1/UdDEuu2klrP6rGK1uppjIi8EUmrczRyvKlfxqc1+HTZeGpHi95Luu0NVhGT92dq5gDvPuZ&#xA;tZaX6cTCZm9RnZiIpZVUAnYChXt7ZnYMZjHfnZLpc0xI2O5RsgFs4AK0EaAVJJ+yO5zPn9RcOPIK&#xA;2RZNOiOjI6hkYEMpFQQeoIxQxy70HW4tP/Rmn3EU+mqVNtDdF1kgCmoRZlEnONeihlqB+1mJ2too&#xA;a3CYSJhI9Rv9m33tmizT08wR6o9x/X+xEWejalNFbQ6rNGbS0IeKxt+RR5FPJXmkbiX4tuqhVFdz&#xA;XL9Fp8elwxxY7NCrP6ujXnnLNMynQ35BPMsS7FVj/wB7B/xkX+OEcj7kHmEyzHbnYq7FXYqhL11W&#xA;WLkQPhfqad1y3GNi1zO6h60P86/eMnwljYcJ4SARIpB6Gox4Sth3rQ/zr94x4SthD39ppmoQfV7x&#xA;I54q8uLEbEdweoPyyvLgGQVIWGExGQooG18teWLWdLiC1iWaM1Rixah8QGJFcphoMUTYjuwjhxg2&#xA;Am3rQ/zr94zK4S3WHetD/Ov3jHhK2HetD/vxfvGPCVsLZZovSf41+ye48MIibQSKTTMZvdirsVdi&#xA;rsVdirsVdirsVdiqUWssQtYQXUEItRUeAzKnE8RceJFBV9aH+dfvGR4SysO9aH+dfvGPCVsO9aH+&#xA;dfvGPCVsO9aH+dfvGPCVsO9aH+dfvGPCVsO9aH+dfvGPCVsLTJG0sAVgT6i7Aj3w0aPuRYsKs+v6&#xA;Fb3DW0+pWsNyhCvDJNGrqWXkAVLVBKivyzGb0fiqDk1nSI7lbWS+t0unICQNKgkJZzGKKTXd1K/P&#xA;bFUX6iBxHyHqEFgldyBQE0+nFUDdaxBbyOjo1EYIzl4UXkVD0HqOhOzDMWeqokCJNf1e6+sh3uRD&#xA;TmQBvn7/ANAK2PU7W/DWyh1WZWT1EkiNCVPRopHKmnQ4YanikBwkX/V/RIonpzEXf3/pAWeV9KtN&#xA;J8vWGn2nP6tBCoiErtIwDfFTk5LUFdvAbZktCaYq7FXYq7FXYqh7X+/u/wDjKP8Ak1HiqIxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVhWu/lbp2r395eNqNzam8Dh44FhVV9ROMlKx&#xA;n+8opf8Am4rX4lVgqra5+W+n6zqS393f3YmDwSERuqAtBGUH2QDxNeXHpyr/ADHFUnX8jPLUclw8&#xA;F7eW5mhMEfomFPS5z+u7pSP7bN8JP8tB2xVub8kdCnufrEupXvqGRnb0jFAOLel8C+iicFUQqF4U&#xA;+/FVTXG8wf8AKw4dPgjnfT7xBP6yEi3jX0XSRJCVZRI3o/Afu711eTFlGYmP0Hp8AP0O/wBPLB+U&#xA;JlXHHbz52K35b7/ipPpmk3NrcRkh/SVmdmlmEpqUKgKAi+OX48U+IEjYed9Pc63LmiYnv91fpTPT&#xA;v+Ofa/8AGJP+IjM1wkRirsVdirsVdiqHtf7+7/4yj/k1HiqIxV2KuxV2KuxV2KuxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxV2KuxV2KpbrNxLD6PBynLlWhpWlM0PbebJDg4CY3fL4OXpYCV2Ej1PzCdN0661C&#xA;6uHW3tInmlNd+KKWNPfbbNJj1WpnIRE5WfNypYogXTErf86dIayhnuRd28zfDcW5C8opRz5xkMyM&#xA;ePot0Xc7D4vhzNli1d0MhPxP46/gNQOOuS7S/wA6NE1W5gt7Frx3nuIrarqqBWlFeTcn6DYe/wCz&#xA;XfBkx6uAJMzyvmfx+N1j4Z5Bmn6Ruv8Afz/fmB+d1H8+XzbvAj3J/ZgCzgA2HppT/gRncYjcBfcH&#xA;VS5q2WIdirsVdirsVQ9r/f3f/GUf8mo8VRGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV2KuxVC3+mw3vD1WdfTrTgQPtU61B8MxNVooZ64r27m7DnOO66oM+WrEggySkHqKr/AM05h/yL&#xA;h75fZ+pv/PT7h+Pi1/hfT/55PvTxr/L474f5Gxd8vs/Uj89PuH4+Klb+TdGt3meBXja4cSTleA5O&#xA;qqgY/D2VAMJ7IxmrMtvMfqUa2Q6D8fFX/wAN2X+/ZfvX/mnI/wAi4e+X2fqT+en3D8fFHaeSbC2J&#xA;6mJD/wAKM20Y0KcMmzavhQ7FXYq7FXYqh7X+/u/+Mo/5NR4qiMVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdiqX+Yr+80/y/qd/Y25u72ztJ57W1AZjLLFGzpGFX4jyYAUG+Ks&#xA;Pt/Nf5g3Oo3UZ0yKztorq1hjEtrPKxiuLye1kb1EmRG9JIFlLKKUcdBuVVug+evO0lq9xrWhGOT9&#xA;FjUIbK3hmEjSHifSkdjIIm+KgSjMaFjwNYwqhf8AlbmqQXtnYz+UL22+tTG2tgWY8mRZG4oFiIDc&#xA;YGAViu/+SGYKoofmlrXB3PlHUAiRRS14yklppSnpqoh5s0aqeYpXl8IDAhsVZd5Y1m51nQ7bUrnT&#xA;5dMmuAxNlOQZEAYqCaU+0BXcA4qmmKsH85ebvOWmajLaaNoxuoVWNlvWillTe3upnXhGyE/FbIgI&#xA;NAW33IBVQmo+bPzGtbyaGDTbe4gha7LXJt7iJBHA0aRN/eyFmf1CQAKNTqi1cKorUfzB1ewmt0h8&#xA;r3t6txAlxJcxoYaMYFkcSRsGKstQOIZmoG6lQGVQQ/N2+l9L6n5Vv70SIrtNDX0BVWYgSyJGCRx6&#xA;eFe4oVWU+TPMGo67o7X2oae2mT+tJGtq/q8vTFCjMJY4WBZW/l/oFU9xV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVQtSJ7W2mlUNJwWQGg2ZkoSvhsxGKq+KuxV2KuxV2&#xA;KqUErPLcK3SOQKvy9NW/W2KqiRpGoSNQiDoqigH0DFW8VdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdiqA1S+uLZoVh4fvAxYuC32ePShX+bFUD+mNR/wCKf+Ab/mvFVkOp38MM&#xA;cSmIrGoRSUatFFP58VX/AKY1H/in/gG/5rxV36Y1H/in/gG/5rxV36Y1H/in/gG/5rxV36Y1H/in&#xA;/gG/5rxV36Y1H/in/gG/5rxVLNPtvqGsalq0BX61qhjNwr+o0amJeI9NC9E5dWp1OKpk2tagqlv3&#xA;JoK04N2/2eKp9irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSjXv722/1&#xA;ZP1piqWVxV1cVYx5rv8AzxbX1s/l7T472zhhle7jkdFMsrqVgRORUjg45Pv0OKpW2u/mNdWOswx6&#xA;bFb6jYGFbUwgN6zSFWYKZWMa0j3Jq3HkOu4xVW/Tn5oGW/4+X7ZY7d6WSvOtZlZwqnkr0FFJdqqP&#xA;Ab4qmXlnUvOt5qF8mu6XBp1jDtZvHJ6skpLsKmjEAKqiu29R7jFWR1xV1cVWyn90/wDqn9WKssxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpPr5/e23+rJ+tMVSyoxV1Rir&#xA;qjFUs1zXoNIijllQush4ila1qAAFUMWJLbADJRgZGgxnIRFnkxfS/wA4vKuqX66fZS87xuVIWEsZ&#xA;PHdgPUiQVHhlk9POIshEckTyLO6jKWbqjFXVGKrJSPSf/VP6sVZdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVSbzCaSW3yk/WmKpVyxV3LFXcsVYr5+jkmsoIYwpZy1VcKQ&#xA;VDIWA5B1rTpUEVyeOQEgTyYZATEgc/N5h5X8veZbDXEuruHS4rJQ4Jt7eJZ6EEKA8cUR+f6syc2W&#xA;BjQ4mGOEgd6e88sw253LFXcsVWSn92/yP6sVZjirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVSTzGaSW3yk/WmKpRyxV3LFXcsVSLzRYX959W+qR+p6fPn8SrTlxp9ojwxVIR&#xA;5f17/lm/5KR/81YqzvliruWKu5Yqtkb923yP6sVZpirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVS/VdLkvjEUmERi5VqnOvKn+Uv8uKoD/DNz/y2J/yJP/VTFXf4Zuf+WxP+&#xA;RJ/6qYq7/DNz/wAtif8AIk/9VMVd/hm5/wCWxP8AkSf+qmKu/wAM3P8Ay2J/yJP/AFUxV3+Gbn/l&#xA;sT/kSf8Aqpirv8M3P/LYn/Ik/wDVTFXf4Zuf+WxP+RJ/6qYq4+WLggg3iUPX9yf+qmKp/irsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/Z</xmpGImg:image>\n               </rdf:li>\n            </rdf:Alt>\n         </xmp:Thumbnails>\n         <xmpMM:DocumentID>xmp.did:5cf7d12a-87ef-824b-b5d5-bd124cd8323c</xmpMM:DocumentID>\n         <xmpMM:InstanceID>uuid:ed237c3e-6286-41a7-ae78-29c16238eb4e</xmpMM:InstanceID>\n         <xmpMM:OriginalDocumentID>uuid:0129BF1189DDE0119C7FD1E7637AFAC9</xmpMM:OriginalDocumentID>\n         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>\n         <xmpMM:DerivedFrom rdf:parseType=\"Resource\">\n            <stRef:instanceID>uuid:c8fd2fd2-b4a0-4b2b-922e-9d04259fbef5</stRef:instanceID>\n            <stRef:documentID>xmp.did:ae083b00-405b-9549-8b0e-b785e3b0cf50</stRef:documentID>\n            <stRef:originalDocumentID>uuid:0129BF1189DDE0119C7FD1E7637AFAC9</stRef:originalDocumentID>\n            <stRef:renditionClass>default</stRef:renditionClass>\n         </xmpMM:DerivedFrom>\n         <xmpMM:History>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:BCB646453062E111906089FB78C225E5</stEvt:instanceID>\n                  <stEvt:when>2012-02-28T12:50:47-08:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator CS5.1</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stEvt:action>saved</stEvt:action>\n                  <stEvt:instanceID>xmp.iid:5cf7d12a-87ef-824b-b5d5-bd124cd8323c</stEvt:instanceID>\n                  <stEvt:when>2021-02-16T13:07:22-08:00</stEvt:when>\n                  <stEvt:softwareAgent>Adobe Illustrator 25.2 (Windows)</stEvt:softwareAgent>\n                  <stEvt:changed>/</stEvt:changed>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpMM:History>\n         <illustrator:CreatorSubTool>AIRobin</illustrator:CreatorSubTool>\n         <illustrator:Type>Document</illustrator:Type>\n         <xmpTPg:NPages>1</xmpTPg:NPages>\n         <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>\n         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>\n         <xmpTPg:MaxPageSize rdf:parseType=\"Resource\">\n            <stDim:w>717.200000</stDim:w>\n            <stDim:h>532.400000</stDim:h>\n            <stDim:unit>Pixels</stDim:unit>\n         </xmpTPg:MaxPageSize>\n         <xmpTPg:Fonts>\n            <rdf:Bag>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stFnt:fontName>SegoeUI</stFnt:fontName>\n                  <stFnt:fontFamily>Segoe UI</stFnt:fontFamily>\n                  <stFnt:fontFace>Regular</stFnt:fontFace>\n                  <stFnt:fontType>Open Type</stFnt:fontType>\n                  <stFnt:versionString>Version 5.62</stFnt:versionString>\n                  <stFnt:composite>False</stFnt:composite>\n                  <stFnt:fontFileName>segoeui.ttf</stFnt:fontFileName>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <stFnt:fontName>SegoeUI-Bold</stFnt:fontName>\n                  <stFnt:fontFamily>Segoe UI</stFnt:fontFamily>\n                  <stFnt:fontFace>Bold</stFnt:fontFace>\n                  <stFnt:fontType>Open Type</stFnt:fontType>\n                  <stFnt:versionString>Version 5.62</stFnt:versionString>\n                  <stFnt:composite>False</stFnt:composite>\n                  <stFnt:fontFileName>segoeuib.ttf</stFnt:fontFileName>\n               </rdf:li>\n            </rdf:Bag>\n         </xmpTPg:Fonts>\n         <xmpTPg:PlateNames>\n            <rdf:Seq>\n               <rdf:li>Cyan</rdf:li>\n               <rdf:li>Magenta</rdf:li>\n               <rdf:li>Yellow</rdf:li>\n               <rdf:li>Black</rdf:li>\n            </rdf:Seq>\n         </xmpTPg:PlateNames>\n         <xmpTPg:SwatchGroups>\n            <rdf:Seq>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>White copy</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>255</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Black copy</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Process Black CYMK</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>17</xmpG:red>\n                           <xmpG:green>12</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>C=63 M=0 Y=100 K=0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>104</xmpG:red>\n                           <xmpG:green>188</xmpG:green>\n                           <xmpG:blue>69</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=131 G=185 B=249 2</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>131</xmpG:red>\n                           <xmpG:green>185</xmpG:green>\n                           <xmpG:blue>249</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Fluent</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=68 G=156 B=221</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>73</xmpG:red>\n                           <xmpG:green>155</xmpG:green>\n                           <xmpG:blue>213</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>204</xmpG:red>\n                           <xmpG:green>203</xmpG:green>\n                           <xmpG:blue>203</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=222 G=127 B=197</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>212</xmpG:red>\n                           <xmpG:green>128</xmpG:green>\n                           <xmpG:blue>181</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Black 2</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=15 G=70 B=124</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>19</xmpG:red>\n                           <xmpG:green>71</xmpG:green>\n                           <xmpG:blue>123</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Azure Lite Blue</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=195 G=241 B=255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>198</xmpG:red>\n                           <xmpG:green>233</xmpG:green>\n                           <xmpG:blue>247</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=156 G=235 B=255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>165</xmpG:red>\n                           <xmpG:green>221</xmpG:green>\n                           <xmpG:blue>243</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=80 G=230 B=255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>116</xmpG:red>\n                           <xmpG:green>207</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=50 G=190 B=221</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>50</xmpG:red>\n                           <xmpG:green>190</xmpG:green>\n                           <xmpG:blue>221</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=25 G=138 B=179</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>26</xmpG:red>\n                           <xmpG:green>137</xmpG:green>\n                           <xmpG:blue>178</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Azure Blue</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=131 G=185 B=249</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>138</xmpG:red>\n                           <xmpG:green>182</xmpG:green>\n                           <xmpG:blue>225</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=94 G=160 B=239</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>104</xmpG:red>\n                           <xmpG:green>156</xmpG:green>\n                           <xmpG:blue>211</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=120 B=212</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>45</xmpG:red>\n                           <xmpG:green>117</xmpG:green>\n                           <xmpG:blue>187</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=91 B=161</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>91</xmpG:green>\n                           <xmpG:blue>161</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=0 G=48 B=103</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>30</xmpG:red>\n                           <xmpG:green>52</xmpG:green>\n                           <xmpG:blue>100</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Purple</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=183 G=150 B=249</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>170</xmpG:red>\n                           <xmpG:green>149</xmpG:green>\n                           <xmpG:blue>199</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=166 G=122 B=244</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>146</xmpG:red>\n                           <xmpG:green>123</xmpG:green>\n                           <xmpG:blue>184</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=119 G=58 B=220</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>108</xmpG:red>\n                           <xmpG:green>83</xmpG:green>\n                           <xmpG:blue>163</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=85 G=47 B=153</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>87</xmpG:red>\n                           <xmpG:green>53</xmpG:green>\n                           <xmpG:blue>148</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=52 G=26 B=110</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>53</xmpG:red>\n                           <xmpG:green>40</xmpG:green>\n                           <xmpG:blue>109</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Magenta</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=220 G=146 B=191</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>219</xmpG:red>\n                           <xmpG:green>146</xmpG:green>\n                           <xmpG:blue>191</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=206 G=116 B=182</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>203</xmpG:red>\n                           <xmpG:green>116</xmpG:green>\n                           <xmpG:blue>175</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=163 G=58 B=133</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>163</xmpG:red>\n                           <xmpG:green>58</xmpG:green>\n                           <xmpG:blue>133</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=89 G=40 B=95</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>89</xmpG:red>\n                           <xmpG:green>39</xmpG:green>\n                           <xmpG:blue>94</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=54 G=23 B=55</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>53</xmpG:red>\n                           <xmpG:green>23</xmpG:green>\n                           <xmpG:blue>54</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Orange</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=179 B=77</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>252</xmpG:red>\n                           <xmpG:green>178</xmpG:green>\n                           <xmpG:blue>79</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=250 G=162 B=29</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>250</xmpG:red>\n                           <xmpG:green>162</xmpG:green>\n                           <xmpG:blue>31</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=247 G=141 B=30</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>247</xmpG:red>\n                           <xmpG:green>141</xmpG:green>\n                           <xmpG:blue>32</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=239 G=113 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>237</xmpG:red>\n                           <xmpG:green>115</xmpG:green>\n                           <xmpG:blue>35</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=209 G=89 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>208</xmpG:red>\n                           <xmpG:green>91</xmpG:green>\n                           <xmpG:blue>39</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Red</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=115 B=129</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>242</xmpG:red>\n                           <xmpG:green>114</xmpG:green>\n                           <xmpG:blue>129</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=240 G=64 B=73</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>239</xmpG:red>\n                           <xmpG:green>64</xmpG:green>\n                           <xmpG:blue>74</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=230 G=35 B=35</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>229</xmpG:red>\n                           <xmpG:green>37</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=179 G=27 B=27</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>179</xmpG:red>\n                           <xmpG:green>32</xmpG:green>\n                           <xmpG:blue>37</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=130 G=16 B=16</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>130</xmpG:red>\n                           <xmpG:green>22</xmpG:green>\n                           <xmpG:blue>24</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Yellow</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=228 B=82</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>254</xmpG:red>\n                           <xmpG:green>228</xmpG:green>\n                           <xmpG:blue>82</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=212 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>254</xmpG:red>\n                           <xmpG:green>212</xmpG:green>\n                           <xmpG:blue>2</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=202 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>203</xmpG:green>\n                           <xmpG:blue>6</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=255 G=189 B=2</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>254</xmpG:red>\n                           <xmpG:green>189</xmpG:green>\n                           <xmpG:blue>17</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=223 G=165 B=0</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>223</xmpG:red>\n                           <xmpG:green>166</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Teal</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=66 G=232 B=202</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>107</xmpG:red>\n                           <xmpG:green>199</xmpG:green>\n                           <xmpG:blue>186</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=60 G=212 B=194</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>87</xmpG:red>\n                           <xmpG:green>195</xmpG:green>\n                           <xmpG:blue>185</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=55 G=194 B=177</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>64</xmpG:red>\n                           <xmpG:green>190</xmpG:green>\n                           <xmpG:blue>175</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=37 G=130 B=119</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>37</xmpG:red>\n                           <xmpG:green>131</xmpG:green>\n                           <xmpG:blue>120</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=32 G=112 B=103</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>32</xmpG:red>\n                           <xmpG:green>112</xmpG:green>\n                           <xmpG:blue>103</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Green</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=180 G=236 B=54</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>182</xmpG:red>\n                           <xmpG:green>212</xmpG:green>\n                           <xmpG:blue>58</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=134 G=214 B=51</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>139</xmpG:red>\n                           <xmpG:green>198</xmpG:green>\n                           <xmpG:blue>63</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=118 G=188 B=45</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>118</xmpG:red>\n                           <xmpG:green>188</xmpG:green>\n                           <xmpG:blue>67</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=94 G=150 B=36</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>94</xmpG:red>\n                           <xmpG:green>151</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=54 G=86 B=21</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>56</xmpG:red>\n                           <xmpG:green>87</xmpG:green>\n                           <xmpG:blue>40</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Neutrals</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Rich Black_R0 G0 B0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Ex Dk Gray_R47 G47 B47</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>46</xmpG:red>\n                           <xmpG:green>46</xmpG:green>\n                           <xmpG:blue>46</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Gray_R80 G80 B80</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>80</xmpG:red>\n                           <xmpG:green>80</xmpG:green>\n                           <xmpG:blue>80</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Mid Gray_R115 G115 B115</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>115</xmpG:red>\n                           <xmpG:green>115</xmpG:green>\n                           <xmpG:blue>115</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Gray_R210 G210 B210</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>210</xmpG:red>\n                           <xmpG:green>210</xmpG:green>\n                           <xmpG:blue>210</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Gray_R230 G230 B230</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>230</xmpG:red>\n                           <xmpG:green>230</xmpG:green>\n                           <xmpG:blue>229</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Ex Lt Gray_R242 G242 B242</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>242</xmpG:red>\n                           <xmpG:green>242</xmpG:green>\n                           <xmpG:blue>242</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>White_R255 G255 B255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>254</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Grays</xmpG:groupName>\n                  <xmpG:groupType>1</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=33 G=33 B=33</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>33</xmpG:red>\n                           <xmpG:green>33</xmpG:green>\n                           <xmpG:blue>33</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>K=77</xmpG:swatchName>\n                           <xmpG:mode>GRAY</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:gray>196</xmpG:gray>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=79 G=79 B=79</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>79</xmpG:red>\n                           <xmpG:green>79</xmpG:green>\n                           <xmpG:blue>79</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=118 G=118 B=118</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>119</xmpG:red>\n                           <xmpG:green>118</xmpG:green>\n                           <xmpG:blue>119</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>153</xmpG:red>\n                           <xmpG:green>153</xmpG:green>\n                           <xmpG:blue>153</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>K=36</xmpG:swatchName>\n                           <xmpG:mode>GRAY</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:gray>91</xmpG:gray>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>179</xmpG:red>\n                           <xmpG:green>180</xmpG:green>\n                           <xmpG:blue>180</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>230</xmpG:red>\n                           <xmpG:green>230</xmpG:green>\n                           <xmpG:blue>230</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>242</xmpG:red>\n                           <xmpG:green>242</xmpG:green>\n                           <xmpG:blue>243</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Azure 2020</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Prime Rich Black</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>0</xmpG:red>\n                           <xmpG:green>0</xmpG:green>\n                           <xmpG:blue>0</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az White</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>255</xmpG:red>\n                           <xmpG:green>254</xmpG:green>\n                           <xmpG:blue>255</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Azure Blue</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>33</xmpG:red>\n                           <xmpG:green>113</xmpG:green>\n                           <xmpG:blue>185</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Accent Light Blue</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>116</xmpG:red>\n                           <xmpG:green>207</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Dark Grey</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>60</xmpG:red>\n                           <xmpG:green>60</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Medium Grey</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>117</xmpG:red>\n                           <xmpG:green>117</xmpG:green>\n                           <xmpG:blue>122</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>2018 Az Light Grey</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>234</xmpG:red>\n                           <xmpG:green>234</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Core Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Orange_R216 G59 B1</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>213</xmpG:red>\n                           <xmpG:green>62</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Yellow_R255 G185 B0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>253</xmpG:red>\n                           <xmpG:green>184</xmpG:green>\n                           <xmpG:blue>19</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Green_R16 G124 B16</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>22</xmpG:red>\n                           <xmpG:green>124</xmpG:green>\n                           <xmpG:blue>62</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Teal_R0 G133 B117</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>2</xmpG:red>\n                           <xmpG:green>133</xmpG:green>\n                           <xmpG:blue>117</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Blue_R0 G120 B212</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>45</xmpG:red>\n                           <xmpG:green>117</xmpG:green>\n                           <xmpG:blue>187</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Purple_R134 G97 B197</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>127</xmpG:red>\n                           <xmpG:green>98</xmpG:green>\n                           <xmpG:blue>170</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Light Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Orange_R255 G147 B73</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>246</xmpG:red>\n                           <xmpG:green>145</xmpG:green>\n                           <xmpG:blue>77</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Yellow_R254 G240 B0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>251</xmpG:red>\n                           <xmpG:green>237</xmpG:green>\n                           <xmpG:blue>25</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Green_R155 G240 B11</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>161</xmpG:red>\n                           <xmpG:green>204</xmpG:green>\n                           <xmpG:blue>57</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Teal_R48 G229 B208</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>97</xmpG:red>\n                           <xmpG:green>197</xmpG:green>\n                           <xmpG:blue>190</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Blue_R80 G230 B255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>116</xmpG:red>\n                           <xmpG:green>207</xmpG:green>\n                           <xmpG:blue>234</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Lt Purple_R213 G157 B255</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>191</xmpG:red>\n                           <xmpG:green>159</xmpG:green>\n                           <xmpG:blue>202</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Dark Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Orange_R107 G41 B41</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>107</xmpG:red>\n                           <xmpG:green>41</xmpG:green>\n                           <xmpG:blue>41</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Yellow_R106 G75 B22</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>106</xmpG:red>\n                           <xmpG:green>76</xmpG:green>\n                           <xmpG:blue>29</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Green_R5 G75 B22</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>23</xmpG:red>\n                           <xmpG:green>75</xmpG:green>\n                           <xmpG:blue>36</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Teal_R39 G75 B71</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>39</xmpG:red>\n                           <xmpG:green>75</xmpG:green>\n                           <xmpG:blue>71</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Blue_R36 G58 B94</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>35</xmpG:red>\n                           <xmpG:green>58</xmpG:green>\n                           <xmpG:blue>94</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dk Purple_R59 G46 B88</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>59</xmpG:red>\n                           <xmpG:green>46</xmpG:green>\n                           <xmpG:blue>87</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>ALM Specific</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Validation Squiggles</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>227</xmpG:red>\n                           <xmpG:green>30</xmpG:green>\n                           <xmpG:blue>38</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Outline Stroke</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Outline art stroke</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>235</xmpG:red>\n                           <xmpG:green>234</xmpG:green>\n                           <xmpG:blue>237</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>Text Code Colors</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Red Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>239</xmpG:red>\n                           <xmpG:green>60</xmpG:green>\n                           <xmpG:blue>35</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Teal Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>1</xmpG:red>\n                           <xmpG:green>142</xmpG:green>\n                           <xmpG:blue>172</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Blue Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>55</xmpG:red>\n                           <xmpG:green>86</xmpG:green>\n                           <xmpG:blue>166</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Dark Blue Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>34</xmpG:red>\n                           <xmpG:green>32</xmpG:green>\n                           <xmpG:blue>95</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>Green Code</xmpG:swatchName>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:red>13</xmpG:red>\n                           <xmpG:green>132</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n               <rdf:li rdf:parseType=\"Resource\">\n                  <xmpG:groupName>FOR MS LOGO ONLY</xmpG:groupName>\n                  <xmpG:groupType>0</xmpG:groupType>\n                  <xmpG:Colorants>\n                     <rdf:Seq>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Blue 0-164-239</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>50</xmpG:red>\n                           <xmpG:green>159</xmpG:green>\n                           <xmpG:blue>217</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Green 127-186-0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>126</xmpG:red>\n                           <xmpG:green>186</xmpG:green>\n                           <xmpG:blue>65</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Orange 242-80-34</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>240</xmpG:red>\n                           <xmpG:green>81</xmpG:green>\n                           <xmpG:blue>36</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Yellow 255-185-0</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>253</xmpG:red>\n                           <xmpG:green>184</xmpG:green>\n                           <xmpG:blue>19</xmpG:blue>\n                        </rdf:li>\n                        <rdf:li rdf:parseType=\"Resource\">\n                           <xmpG:swatchName>MS Logo Gray 115-115-115</xmpG:swatchName>\n                           <xmpG:type>PROCESS</xmpG:type>\n                           <xmpG:tint>100.000000</xmpG:tint>\n                           <xmpG:mode>RGB</xmpG:mode>\n                           <xmpG:red>115</xmpG:red>\n                           <xmpG:green>115</xmpG:green>\n                           <xmpG:blue>115</xmpG:blue>\n                        </rdf:li>\n                     </rdf:Seq>\n                  </xmpG:Colorants>\n               </rdf:li>\n            </rdf:Seq>\n         </xmpTPg:SwatchGroups>\n         <pdf:Producer>Adobe PDF library 15.00</pdf:Producer>\n         <pdfx:CreatorVersion>21.0.2</pdfx:CreatorVersion>\n      </rdf:Description>\n   </rdf:RDF>\n</x:xmpmeta>\n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                                                                                                    \n                           \n<?xpacket end=\"w\"?>\r\nendstream\rendobj\r3 0 obj\r<</Count 1/Kids[5 0 R]/Type/Pages>>\rendobj\r5 0 obj\r<</ArtBox[0.0 0.0 717.2 532.4]/BleedBox[0.0 0.0 717.2 532.4]/Contents 26 0 R/CropBox[0.0 0.0 717.2 532.4]/Group 27 0 R/LastModified(D:20210217080731-07'00')/MediaBox[0.0 0.0 717.2 532.4]/Parent 3 0 R/PieceInfo<</Illustrator 8 0 R>>/Resources<</ExtGState<</GS0 28 0 R/GS1 29 0 R/GS2 30 0 R/GS3 31 0 R/GS4 32 0 R>>/Font<</TT0 21 0 R/TT1 22 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 23 0 R/MC1 24 0 R>>/Shading<</Sh0 33 0 R/Sh1 34 0 R/Sh2 35 0 R/Sh3 36 0 R>>/XObject<</Fm0 37 0 R/Fm1 38 0 R/Fm2 39 0 R/Fm3 40 0 R/Fm4 41 0 R/Fm5 42 0 R/Fm6 43 0 R/Fm7 44 0 R/Fm8 45 0 R>>>>/Thumb 46 0 R/TrimBox[0.0 0.0 717.2 532.4]/Type/Page>>\rendobj\r26 0 obj\r<</Filter/FlateDecode/Length 7070>>stream\r\nHWˎ$I\u0011W\u000fTNʬ\u0002B+\u0016\u001ez@;H+cfU3;PKi?<>c:~\u000f}tӿoH㴣\u0015;r(}r:K\u0019[}o_vS_uIK\u000f\u001fu\u0011l\u001e8\u001a~蔨d;Got\u001ew˙\u0017\u001aO䧖!Ggj\u0013\u000eJ\u0013\\je<<Wa-w\u001ev\u000f!6y#%Ig]?CO\fv\u0017T(g^\n1\u0010h\rJs\u0004\n fkr9d/ӺvT8\u0017}3g\u001e0Uϕ!=pLDi\n;Km\u0016m㬰\t\r3\u0005\u00123gٰW-,g\u001d\foV\rVi޵\u0012\u001b󎎛\f%\ru\u0017Ũxŋ\u000bˠy\u001c\u0013 (C0Z[G\u000fu7lZhbDb]jp1H\u0001\\`<\u0004GA4\u0004^.xfgkT\u001e\u001d\u001cr\u0017zA\u0002O\u0007k*\u0004Ұ;k8so\u0001ұ#\n\u0003֥8GCi-oX.İi\u0007\r\u0005E\u0000'/\bo\\\u0002q\u001c!ֻ\\ʢA]~\u0003*v8\u001f]^I\u0016҈\u001e-V)Ԁ\r!{(\r\n:Gا҈\u000e}S\u0011<:u\b 71)B\u0000}ypgw)\u0019w*\u0007\r*\"2)D!:̼\f'\u00136~|f@\\m\u0005\u0016>\u0000\f9E\u001dT\n\u000f%0\u0019H-\u0012\u0016AZp\u001c\u0002D7[g5A\u0015j幗\r2+\u0018G&m}W'\u00171\u0013|\u0003AExw_\b\u001a\bl\u0019\u0004\u0013OH\u0006\u001bMʽ\u001d\\F^!\u0012yv@#xdCw\u0000\u00057\u0016w!u=M}4pX\n.\u001dI\u001b\u0016\u001f(d<`\u0018Hb\u001d~m\u001e8!\u001c\u0002؆,]!\bJ&ڸ@ GF!ORy\u0016\n\r\u0005<Jq\u0001\\\u001c\f8\u0004t\u0001D\u0012iC&C%u(8j1\u0017m\u0017<= Ԥ&\u000f\u0001SS)\u0000/ɿ1Bx\b6n4?\u0015S\u0011\u0019\u0013J[nH\u0014qF\u000e\u0011Qh&đ\u001f\u0012X`R\u0011\u0019e_\u0011|\u0003Q5X'\rl\u0000#`ljLNY^I\n(F`\u0016q,\tу@~K\u0002$tBk\u001e^5g^<e5y\u001b)\u0010`TgW t\u0003\u001f!ʒAYBLB>\u0016ܞ\u001b\u0017x\u001afd\r\u001b\u0005tsU\u001e\rP<\"\u0011\rGcw5NnF.n&{`?!;GLGr1֟O[U΍,\u0012NԸvݱXȘjB!\\\u001a\u0006y!\u00050\u0005B*/QF(,b378ij={0wTYsi#\u0015V/\u001c[/X\u000b]u\tΥPZs\u000b_ʓD\u001eʳG\r*|ai.Q<)8(~S\u0014+ض\"(,Ǯ\u0001$\u0006\n\n@PV\u0010\n[Qe\t\u001cU/\fVc\u001ek\n.:˵yd\u0019\u0017qR/^Y08-;k߇q_\"HtCP6\u001ah;9O8`\r`x\u0005|ŀoe~+Zں\n#rʷC\u0017NQZ\u0014\n\u001c\u001ehR4g\fHz#\u0014@ '\u0014݅\u0012\u000f\u0006&>\u0003MGnp+k\u0016kS6s\r\u00027up@\u001a\u001e_\u0003Fs\u0015Im\r\u00069\u0007S\u0017KDR\u00041Tkn@\u001f\u0010\u0007j9Ie[/!\u001bF)YA\n5%\u0012cQL\u0017OC\u0012\u0018\\_QDV+4Aj*\u00045_zyMNG\u0019\u001b]_},iw5S\f8>\u001aSǫ+Ągy\"zQ\u0018u}\u0016!5i^!O 3伮sx`\u0016 iT\u0003YaF8D{\u0015\u0003\u0011-2:[\u0019fi=L*/oN`\u0004PKnWvX(yѹ9<T.v(\u0013^\u0005!v+\u001dF˒0sEizwW\u0019\by@\u001bZY6X`V\u0007iJp\u00181*fc-Z8=d} 0Ɣm&2@MMM\u0010+[ڟ$vQ|k&nq!bC-\u001c\r\u0019YL\u0012ΡW\u0017 t׹\u0004!\u0007S;H\u0010\u001a'\u0010ں\u0005o)j\u000ei\u0013m\u0010ݹG:lk\u001dm+p[#\u0004|K\b,1ũ\u0004)XQS?3\u0018[R'6E/~Z9ǗOE#\u0007flȏg\u0005}V4DS\u0011}l\u00109\tX\rFK\u001ax/ޝPM!\f3\t@#\u001d~e٥5o4M$\u0010Xfj`\r\u0012t=\u001d\u0016j#E#\u0006S\u0018F8\u00131Q[G\b$Md& (\u0003[ٔD۲f\u0003}^-5/[B{\u0015!B~Ka⌊\u001a|ތU]\u0014UT*{=\u001c\u0004\u0015]\u001aV65ܣUrVPB̼yǴ>E=ߛ\fz?\u001c3I~s\"\u0014\u0002XL\u001e.-b8\u0018I'Tͮ/J\u0017ʅ\u001f\u0017(l\t\u000f0<b|zy/C\u0016l:R\u0018SC\u0002\u0002KGbS(QnEb0-App\rK\bO\u001ee\f\u001d7kNF@\u001b\u001b\\\n\"dFRk^}u4\u0000ĸcp\u0019d\r1\u0010\u001cQQ\u0015TiM&})4{Ɖ\b\u001eGw'턃)F\u0012\r\u0004\u000b4C~,I{}E@qŀ!\u0017X3}ܥxv.\u0018\u000bNWf($EHrIC\u001e[ٰ\u001dOԏn\u000b\u00068QT-ꂃN\u0018*\u0014NA\n5rA,AhK\u001aP}R\u0001%gV*UA\t=S,jk:}\u0016\u0016r~<ps8>9\u00043GTs\"\f`p\u0005h@Hi/Q\u0003^rl\b\u000b\u0015<qTSXz:QTm}|,o&^chQ؆HhK9p\u000bBB6z\u00109̎ԇ=Z\\P\u001fo>0\u00191F\\n\u0002lA*&\u001c>\u0007\u001d\nvS9]%V:n;i)Æ\u0004:2;|$A\n\u0002<vY0xޮsJD<h<\u0015\u001d +jo{\u0012ծߟQbEǱ\u000b\u0006o\u000f>o9\u0011Q8P$\u001f\u0006\u0005ϲ\u000b\u0007cP磔(|%'2ᣪ.H\u001aTٻ˺ C4-\u0005\u0017)C>\u000biwe~[tE\u0013q\u001f%xmӀ&6=fk:x\u0016$4\u000e\b^\u001eUť\u001bլ\f\th\u0014 d\u0005\u001bwThs\u0017\"ʖ)7j^v\u0003V!乽u\\j\u0015V\u0006M_\u001aKǣYzGv1E&4\u0011P1\u0016Xk,5\u0016n}g,\u0016\u000b¿+\u0016e[b\u0014\u000bR\u001d\\5\u0018-\u0016\r\u000e^=\u0018,C\nu<\u000fPy\u001c;TC\u0015ҼC\n5nyq!sC\rYǱ\u0013e(\u0006\u0011\u001e\u0013\u0004*F0['U\u001b\u0005\u0002֒t\u0019m\t\u001c9EUɶI(̐\r#\n\u0016)\u0002&YH\n\u0014S\u0012_l܂YzscVU|nz5\bbmȮ\u0004Y\u001aFWWרZZ[ѓUNҲZ\\\u001f\u00045wAIg3B;\u0000Ӌ\u000b\u001d߷5]}۫-+nM⓿\f>:c\u0012vi\u00142f\nU\u001c\u0006\u001d\u0014ǽo<}`oE3\u0010ϩ\u0011lL\u0004g^\u0004ϥ5^$`,m\u0012Z ػ*nJ$\u0002\\m{\fV<oW9%!i]\u0018n+z7\u0004!\u0006;;S\u0018K⏩u\u0002)+1'''.'^)O(O~s\u0015\u0015\\\u0007M\u0011?\u0018\u0012DGO\u0000p6H\u00112IO~Wܾ@z\\\u000f\u0013s}|HOO\u001eW۴'ؕ=.#\u0003gf\"\r˴ǭmО\u00199X}\u001fzǾzc(\r\u0019%^U8T\u0003'8U%)\nIӾ\u0017]q\u000b7|*.\u001c\u001b@\u0011\u000ebp*׽\u0015cuTbw?\u0004\u001et[G\u001c(QH/e[J;ZK0Gʎ\u0001\u001b>'F(0M\u0005.W^%Z=4֤\fŶK.Z\u000b\\'g=\u0018-\fJ+F^*#/\tp\u0011\u001ee\u001f\u0016\u001e=z}u\u0003\u000fC{߇Mq$uAQNn^wUN\u0002\"PBv\f\bX@+\u0002mY\u0012@K\u001eհ$%\\\u000fZ\u0014[\u0014)\u00198\u0004Y9A\ty\u0018\t\u0011`C-Q\u0005VR.9\u001aK$\u001c*7\b'\r@n\t8\u001c]%L?X\u0019DWޠ0\b\t$kJeM\\ev>q ,C%\u0007d(s\u0005v\u0010d5\u000bXmEn,XXQdjk\u0019:>6\u001bfKT\u0002K\u0016S\u001fy3\u0015X\u001d80M\u0005&Y\u000fu\u001a%9HJx<8K \u0007\rxH[\u0005-1wmƎt<R`%y\u0013\u0012\u0016\u0017(^{J\"<\"Su.S^CRUJD|Ռ*C\u0002\u0002jEIoŎ&\u001dYJ\\\u0003ٱ]%\"\t1uzn殊W;TP[׹{u'R\bFx\\^0\u0006 glVJw;\u001e݇~_;ƻP2xNt.\u000f\u001ffh*wdyc^2p;o^ԴU\u000bORD7\r(c(I\u000bqx\u0017\rPs\n=\u001b!*P\fYԹU\u0004\u0015+>]\u0016\u0015D\u0002Fy\u001bⰹ\tw\u001dgVz\bzȑâ1A[sK9>2~p\b3sBA\u001b\u000b\u0000#8\u000b$i\\\u0004\u001086CP\r=o;>oq+\u0017Ibj\u0012\u000b\u0016\u0004obZ]%\fW\t\u001d\u001d8\f;\u001a~ޮ\u0012\u001eL\u0005!b)dRG/bDiI;S8\"+aY\u001c\u0002:8\u0014B(w\u0005Cվ,H\u000e1.\u0002\u0004M\u000baA~5\u001d>%\rq2\u0016fjZA\tĒs4ڇb>2)\f\u0001TNP?\u000bi\u0015\u001cf$r~\u000b˿,P}c.8EK;'YSd7\u001b]Wֱ:IAC\r2b,Quhq\u0014yfJr\u0014ub8+ٚVgc]ݜhլSP\u001fȤ<*n\u000e}\u0005%\u0005\u0017PGpY\u001a\u0001a1D췞9 \u00174ȉw&\u0018AA\n\u000fS'\u0002]D'\u0013X\fj%\u0005&\u0010\u0007)>,\u0013\u001ab\u0012L\u00119\n\u0016\u000el&Yh|\u001aR.Cm\u0005A\u0003\u0005u%uSTxlbn`u{8<N\u0018N+s\u001a\u001a9kPj$ɍZ\"戓\u001a?2|`9$xok׽[@6V\u0004O|Ug\">au\u0006^0F`\u0019\u0016Y~7\u0005\u000b\u001e=B>à#_}t_W\u001f|.\u0007F\\PMj2h\u0005g\u0017|V{84&\u000b3Ge\u0012AYcCK\u001be\u0005~k\u000b{8\th\u000ba:\u0012uun\t뙋\u001eҖ+\u0010P\u000b8S \n*XRDF\ty\"gzieXV>4ȒȲ\u000b\u000bp\bWUK\fo'\u0004ػ\u0006CE\u0000$/櫦\u001b\n+x=l]\u00016A]X!P\u001c  y$W܍:\u001c\u0007IwǼyf\rS\u001bw4\u001d\u0007-U\u001c\u0004\u001bY_׻zg\th\u001eoW\u001by$`6z\u001e]3\npjg?̡\u001f6rIĐ\u0017b`!\u0013@:vzX\u0017m<\u0010u\u0006\t~R\tF\t\u0012\u000eE+J\u0007\f6B.K&'#\u000eOӆ64'\r=ҰIyT\u0002?b)Cm1/V1΂WZ,\u0016G\u001c[U_T\u001c~\u001ahNA1/fDas|8\u000e\u000f\u0015TqlWط8~\u0003crL\u0013jCgt6v\u000bml\u0017.ʋ\u000fM2\u001eU79\u0003-\u0007(И,J\u001c\u0011Il\u000f[70O\u0012\r\u001b\u0011.H\u001dK\u001dm^\"}Ih2\u0018^m\re\rXT [8\u001ci02\u0016\u001cra1R`)|}5/+԰]n9l@ \u0018|b>Hsi\u0016%yl\f&\nB\fACޓ\\iEϙxq\u000f\u0016/<lKy\u0016]ZU\fQ\u0007YK\u000f;N<X\u0003\u0013>=\u0000\u0005ɌR\u00102F^!o`\u0000\u0013A\u0000g\tXB:rOg\u000bJSCѝ \u0001X:\n)M>\u001c`L\u0017gYx9)D_ގf\u0015\u0015D\u0013G\u0019Qfr3\u001f\u001dcD%a\u00070\f3\u001c16hX\b\u0012D\b\r\u0005\f\u001eoQcUKz\u0015hc}tNVrzaZ\u001fȱp\\%\u0004j\n:4Ȉ\u0019L8˚1-o$\u000e#l*\u000b~I%@\u0007P\u0005%Ώ?8qPaepXx+o4u$\u0000S&Fӹ#O9!}։P>\u000eoN\u0000X+QKK!,\u0011cƅ\u0004c\u0016ƽb\u0011ъ:ɍj\u0005\u0004\u001a\t8c`\u000b=и\u0012ȑ7\u0007jm7<*;\u0011B(A\"\u001cEA0\u001cjsӥxyiԳylK)\u0017ζox~\u000ejS\u0007EyX\u0018\"x\u001b!⨶o~qUݶ\u001f\u001c揀仫랪JuG;\u00072oWOcMH\u000bwo\u001f6F\u0013J\u0017IaC\u0016cK\u00162\u0002>\u0011NA)\r?hP;C||-\u0000'\u0001\u0018\u0005@8бxwK__0zXR;lGqO,OݽEHl'vh__+\u0003jBOSLtdC2b\u0019Cn,x_m\t\r+\u001b\b\u00159\u0002.uYJ\u0013\u0007\u001fG\u000ft\u0016sŴg,&/\u001d+\u0006\u0015\b\\1\b\u000f*BTi<\u0015FA\u0000wlOǌi\u0006R`'\u0006_d\u0002W\\6t9ǲȌ\u001c\u0014\u0011\u00058R\\|\u001c=co|ɦG\u0016\u0002\u000f_z7\u0015\"ЬIB\"\u000ex3j~T7<nU\u001f3,|?\u0001\u0006\u0000\u0011~(\r\nendstream\rendobj\r27 0 obj\r<</CS/DeviceRGB/I false/K false/S/Transparency>>\rendobj\r46 0 obj\r<</BitsPerComponent 8/ColorSpace 47 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 66/Length 828/Width 89>>stream\r\n8;Yht]5jZ#'W\"I5+!S:=Pn0Qs@Ll/fm8j)f1mt%1Kq\"p\\Cl'[b<84&Mj<Dn)hoQVm\n+W1U@lcY7]aHqZ6SN0r8Y%3(SBJ/Li4l3OCD$aObo:.T@m0>pHbQYe#1,]TRT)kKT\n'82Eb_AAj(3!:BZ4,P7EHMHJ^]HSU2;!HU<M4\"n[0a&Y>5fdNpG#Pbh9?f+Jq-kf!\n&RZg-?](4!$.I$^i/2Zg8_4@qeUt8Br#+\\RfX,'7rO^F5dh32bf]#c/(rd!>g;]pL\nnHS]iVA'E>)R<fX;mC2XAth84$0<n]1Btoc\"d7M81[qN20KQq4@8U9!ng]U*L?%uD\n%](.h&uK-;:$RE<p%HdFc00A'NU<hbMUu]g,kdd4GoguW?LnRfHt!U.g)DF8OQ18l\n>4pLE.pSZBWjp.A3Q8%rDCUEN>IN7IrH:ElWCZo8'sBSZWb\\Mnj\"QKgHosjJE*eMf\nDX*9$<\\Wk\"c4>Yj/]dLAO#[FD<l:]Ua\"!fCHAUYOScuPLZX,(&[o##jF67UJNDXU6\nNq`5[-TJ,jH;qZJR$X)ea!rd\\Qt=_];uG>M>jc+P_VW,83ECHB[Gi)H]5W=1XJ=!F\nO.D0Semf#9M%ui*&o6?Nr\\pJ?r1d_(V##QA>\\\"UZ!l\\W(%]A)`kc:n[<35Q@5:Kk]\nQ)`Am=RcF\"%RI*sr&G1jeD?2/a6/9cG4]f2U[RCuhqTIUV]7dCVL/6A&^9/[ihQQU\n]8\\cuOM`,81l@Q<)'`)HdL4%-k#bQM?s>s;P!8b,V(2a4D]aAop3mbN=Y5d^.Hl2=\nMC%j,3DP`413JV6IJeb0bRmp?I1622'%Rs~>\r\nendstream\rendobj\r47 0 obj\r[/Indexed/DeviceRGB 255 48 0 R]\rendobj\r48 0 obj\r<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream\r\n8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@\"pJ+EP(%0\nb]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\\Ulg9dhD*\"iC[;*=3`oP1[!S^)?1)IZ4dup`\nE1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\\.?d>Mn\n6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1\nVNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<\nPO7r\\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(\nl[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\\~>\r\nendstream\rendobj\r37 0 obj\r<</BBox[101.889 395.675 312.64 263.925]/Group 49 0 R/Length 65/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 28 0 R>>>>/Subtype/Form>>stream\r\n0.514 0.725 0.976 rg\n/GS0 gs\n101.889 395.675 210.75 -131.75 re\nf\n\r\nendstream\rendobj\r38 0 obj\r<</BBox[539.925 395.675 711.675 263.925]/Group 50 0 R/Length 65/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 28 0 R>>>>/Subtype/Form>>stream\r\n0.514 0.725 0.976 rg\n/GS0 gs\n539.925 395.675 171.75 -131.75 re\nf\n\r\nendstream\rendobj\r39 0 obj\r<</BBox[623.279 314.229 624.604 301.107]/Group 51 0 R/Length 337/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 28 0 R>>>>/Subtype/Form>>stream\r\n0.969 0.573 0.118 rg\n/GS0 gs\nq 1 0 0 1 623.4865 301.2707 cm\n0 0 m\n0 0 l\n0.283 -0.244 0.71 -0.212 0.954 0.071 c\n1.057 0.191 1.114 0.342 1.117 0.5 c\n1.117 12.265 l\n1.115 12.502 0.994 12.724 0.794 12.853 c\n0.495 13.049 0.094 12.965 -0.103 12.667 c\n-0.18 12.547 -0.217 12.406 -0.206 12.265 c\n-0.206 0.5 l\n-0.196 0.315 -0.123 0.139 0 0 c\nf\nQ\n\r\nendstream\rendobj\r40 0 obj\r<</BBox[618.486 329.241 633.692 327.447]/Group 52 0 R/Length 280/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 28 0 R>>>>/Subtype/Form>>stream\r\n0.969 0.573 0.118 rg\n/GS0 gs\nq 1 0 0 1 619.3098 329.2414 cm\n0 0 m\n13.559 0 l\n14.014 0 14.382 -0.369 14.382 -0.824 c\n14.382 -0.971 l\n14.382 -1.426 14.014 -1.794 13.559 -1.794 c\n0 -1.794 l\n-0.455 -1.794 -0.823 -1.426 -0.823 -0.971 c\n-0.823 -0.824 l\n-0.823 -0.369 -0.455 0 0 0 c\nf\nQ\n\r\nendstream\rendobj\r41 0 obj\r<</BBox[618.486 326.329 633.692 324.535]/Group 53 0 R/Length 280/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 28 0 R>>>>/Subtype/Form>>stream\r\n0.969 0.573 0.118 rg\n/GS0 gs\nq 1 0 0 1 619.3098 326.3293 cm\n0 0 m\n13.559 0 l\n14.014 0 14.382 -0.369 14.382 -0.823 c\n14.382 -0.971 l\n14.382 -1.425 14.014 -1.794 13.559 -1.794 c\n0 -1.794 l\n-0.455 -1.794 -0.823 -1.425 -0.823 -0.971 c\n-0.823 -0.823 l\n-0.823 -0.369 -0.455 0 0 0 c\nf\nQ\n\r\nendstream\rendobj\r42 0 obj\r<</BBox[278.249 482.368 379.449 455.968]/Group 54 0 R/Length 122/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 28 0 R>>/Shading<</Sh0 55 0 R>>>>/Subtype/Form>>stream\r\nq\n379.449 455.968 -101.2 26.4 re\nW n\nq\n0 g\n/GS0 gs\n0 26.3999996 26.3999996 -0 328.848938 455.9679871 cm\nBX /Sh0 sh EX Q\nQ\n\r\nendstream\rendobj\r43 0 obj\r<</BBox[34.0997 214.49 135.3 188.09]/Group 56 0 R/Length 118/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 28 0 R>>/Shading<</Sh0 55 0 R>>>>/Subtype/Form>>stream\r\nq\n135.3 188.09 -101.2 26.4 re\nW n\nq\n0 g\n/GS0 gs\n0 26.3999996 26.3999996 -0 84.6996536 188.090271 cm\nBX /Sh0 sh EX Q\nQ\n\r\nendstream\rendobj\r44 0 obj\r<</BBox[344.378 390.822 445.578 364.422]/Group 57 0 R/Length 123/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 28 0 R>>/Shading<</Sh0 55 0 R>>>>/Subtype/Form>>stream\r\nq\n445.578 364.423 -101.2 26.4 re\nW n\nq\n0 g\n/GS0 gs\n0 26.3999996 26.3999996 -0 394.9779358 364.4223938 cm\nBX /Sh0 sh EX Q\nQ\n\r\nendstream\rendobj\r45 0 obj\r<</BBox[102.264 119.8 312.264 5.8]/Group 58 0 R/Length 104/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 28 0 R>>/Shading<</Sh0 59 0 R>>>>/Subtype/Form>>stream\r\nq\n312.265 5.8 -210 114 re\nW n\nq\n0 g\n/GS0 gs\n0 -114 -114 -0 207.2644196 119.8000031 cm\nBX /Sh0 sh EX Q\nQ\n\r\nendstream\rendobj\r58 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r59 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 60 0 R/ShadingType 2>>\rendobj\r60 0 obj\r<</Bounds[0.38 0.76]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[61 0 R 62 0 R 63 0 R]>>\rendobj\r61 0 obj\r<</C0[0.701961 0.698039 0.701961]/C1[0.686275 0.682353 0.686275]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r62 0 obj\r<</C0[0.686275 0.682353 0.686275]/C1[0.635294 0.635294 0.635294]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r63 0 obj\r<</C0[0.635294 0.635294 0.635294]/C1[0.592157 0.592157 0.592157]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r28 0 obj\r<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>\rendobj\r57 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r55 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 64 0 R/ShadingType 2>>\rendobj\r64 0 obj\r<</Bounds[0.17 0.46 0.73]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[65 0 R 66 0 R 67 0 R 68 0 R]>>\rendobj\r65 0 obj\r<</C0[0.976471 0.631373 0.12549]/C1[0.988235 0.694118 0.0980392]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r66 0 obj\r<</C0[0.988235 0.694118 0.0980392]/C1[1.0 0.780392 0.0862745]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r67 0 obj\r<</C0[1.0 0.780392 0.0862745]/C1[0.996078 0.827451 0.0588235]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r68 0 obj\r<</C0[0.996078 0.827451 0.0588235]/C1[0.996078 0.843137 0.0392157]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r56 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r54 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r53 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r52 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r51 0 obj\r<</I true/K false/S/Transparency/Type/Group>>\rendobj\r50 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r49 0 obj\r<</I false/K false/S/Transparency/Type/Group>>\rendobj\r33 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 69 0 R/ShadingType 2>>\rendobj\r34 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 0.0 0.0 0.0 1.0]/Domain[0.0 1.0]/Extend[true true]/Function 70 0 R/ShadingType 3>>\rendobj\r35 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 0.0 0.0 0.0 1.0]/Domain[0.0 1.0]/Extend[true true]/Function 71 0 R/ShadingType 3>>\rendobj\r36 0 obj\r<</AntiAlias false/ColorSpace/DeviceRGB/Coords[0.0 0.0 1.0 0.0]/Domain[0.0 1.0]/Extend[true true]/Function 72 0 R/ShadingType 2>>\rendobj\r72 0 obj\r<</Bounds[0.38 0.76]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[73 0 R 74 0 R 75 0 R]>>\rendobj\r73 0 obj\r<</C0[0.701961 0.698039 0.705882]/C1[0.690196 0.682353 0.686275]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r74 0 obj\r<</C0[0.690196 0.682353 0.686275]/C1[0.635294 0.631373 0.631373]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r75 0 obj\r<</C0[0.635294 0.631373 0.631373]/C1[0.592157 0.592157 0.592157]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r71 0 obj\r<</Bounds[0.27 0.49 0.88]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[76 0 R 77 0 R 78 0 R 79 0 R]>>\rendobj\r76 0 obj\r<</C0[0.996078 0.843137 0.0392157]/C1[0.996078 0.843137 0.0392157]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r77 0 obj\r<</C0[0.996078 0.843137 0.0392157]/C1[1.0 0.8 0.0705882]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r78 0 obj\r<</C0[1.0 0.8 0.0705882]/C1[0.984314 0.67451 0.113725]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r79 0 obj\r<</C0[0.984314 0.67451 0.113725]/C1[0.976471 0.631373 0.12549]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r70 0 obj\r<</Bounds[0.18 0.56 0.69 0.78 0.86 0.93 0.99]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R]>>\rendobj\r80 0 obj\r<</C0[0.411765 0.611765 0.827451]/C1[0.411765 0.611765 0.827451]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r81 0 obj\r<</C0[0.411765 0.611765 0.827451]/C1[0.4 0.611765 0.827451]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r82 0 obj\r<</C0[0.4 0.611765 0.827451]/C1[0.380392 0.596078 0.819608]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r83 0 obj\r<</C0[0.380392 0.596078 0.819608]/C1[0.341176 0.576471 0.807843]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r84 0 obj\r<</C0[0.341176 0.576471 0.807843]/C1[0.290196 0.54902 0.792157]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r85 0 obj\r<</C0[0.290196 0.54902 0.792157]/C1[0.231373 0.513726 0.772549]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r86 0 obj\r<</C0[0.231373 0.513726 0.772549]/C1[0.188235 0.470588 0.745098]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r87 0 obj\r<</C0[0.188235 0.470588 0.745098]/C1[0.180392 0.462745 0.737255]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r69 0 obj\r<</Bounds[0.44 0.85]/Domain[0.0 1.0]/Encode[0.0 1.0 0.0 1.0 0.0 1.0]/FunctionType 3/Functions[88 0 R 89 0 R 90 0 R]>>\rendobj\r88 0 obj\r<</C0[0.968627 0.552941 0.12549]/C1[0.968627 0.572549 0.12549]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r89 0 obj\r<</C0[0.968627 0.572549 0.12549]/C1[0.976471 0.615686 0.121569]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r90 0 obj\r<</C0[0.976471 0.615686 0.121569]/C1[0.980392 0.635294 0.121569]/Domain[0.0 1.0]/FunctionType 2/N 1.0>>\rendobj\r23 0 obj\r<</Intent 91 0 R/Name(Shapes)/Type/OCG/Usage 92 0 R>>\rendobj\r24 0 obj\r<</Intent 93 0 R/Name(Text)/Type/OCG/Usage 94 0 R>>\rendobj\r93 0 obj\r[/View/Design]\rendobj\r94 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 25.2)/Subtype/Artwork>>>>\rendobj\r91 0 obj\r[/View/Design]\rendobj\r92 0 obj\r<</CreatorInfo<</Creator(Adobe Illustrator 25.2)/Subtype/Artwork>>>>\rendobj\r21 0 obj\r<</BaseFont/NJSPMO+SegoeUI/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 95 0 R/LastChar 117/Subtype/TrueType/Type/Font/Widths[274 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 710 0 0 0 471 0 0 0 560 0 0 531 524 0 0 0 0 0 0 0 0 0 0 0 0 509 0 462 0 523 313 0 0 242 0 0 0 0 566 586 588 589 348 424 339 566]>>\rendobj\r22 0 obj\r<</BaseFont/ZOPEYQ+SegoeUI-Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 96 0 R/LastChar 122/Subtype/TrueType/Type/Font/Widths[276 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 703 0 0 0 0 0 0 0 0 0 649 511 0 0 0 614 0 0 561 0 0 667 0 0 0 0 0 0 0 0 0 0 538 0 480 619 541 0 0 0 0 0 0 284 0 605 611 620 0 398 440 389 605 542 0 0 538 479]>>\rendobj\r96 0 obj\r<</Ascent 1298/CapHeight 700/Descent -431/Flags 32/FontBBox[-573 -431 1999 1298]/FontFamily(Segoe UI)/FontFile2 97 0 R/FontName/ZOPEYQ+SegoeUI-Bold/FontStretch/Normal/FontWeight 700/ItalicAngle 0/StemV 156/Type/FontDescriptor/XHeight 500>>\rendobj\r97 0 obj\r<</Filter/FlateDecode/Length 21289/Length1 59496>>stream\r\nHyT\u0014W\u0016z^l\u0017DԦ[\u001a\u0017\u0004\u0011\u001d\u0005\u0001EFQI\u0005\u0004n\u0014\u0001q]\u0019bDOq3:nc̸ap_\u0011\u001b\"d\u0012\"6tk@39{wzw_\u0003\u0002\u000e\u0000\u000f1&\n+2%donW\u0007a\u0000ާ\u0013rER\u0000>\u001c\u0018l'gp+\u0019\u0014ܘ\u0000\u0000{)I0s\u001e@\u0014v~),No鯙O΋qHg\u0004\u0019xa\u0013\u0000vdzzf|C\u000f}9l<;>3IhG\u001f\u0004P-f+\u000f\u0006pvsO;\u001e\u0004@'#@AM*\u001c`ڨ)Qs}8\t1p\u0016x1色\f2FZ\u001e:f\u0001\u0015O\u0000ʳ\u001a0\u0016a&3\u0010 \u0011]\r7w|\u0001/7WDGƑX\u001fX3>WuV)BpNOZyy=\u0013mbTcihm:M\u001fݪaᒡ{Qc1xxި\u0015}Tp)Z$MI3E>T*Jus-\u00009D+\u000far%\u0017\u001b&jjk1M\u0001`S\u001fXSfZm̙UV6fosGdn\u000e4534Ǜeee別rrrR\u001d\u0010\u001f\u0010`\ru-Y\u0010d\t\u001a\u0014\u0014\u0004\u0004\u000fڢt/[X8PnKr\\>~0WkkKiHhx\u0018X=ٝnp+J42\u0014\u001e|Mv8>_h\u0017e+'1$\u0014\u001aOW?i\u0019SO\u0011\u0007׼^^UfjF۪Y\u0019\u0018}Y+\u0010i(n]fhd+:\u0018|:31ݸXjt\u0012bz$K#\u0016ڱ\u0012tZ!ݗ꥗\nɡ\u00009ў)ly\\B{Ѧ\u0018S)ߴvkF;q&Ŗigo1qv\u00123.\bhW0ڡ[JȒl\u00078̎UݎWBŹetg#]Q\u0011\raMߺeFa\u001b\u0014Ey<f;\u000734ܾ\u001ex|\t\b\u0010'O7@P{\u0003hWWbk\u001c|ڑM$P\u0011ܹXs1\b|\\\u0015A\\C\r=_}r׫뵳\u0000j\u000bfVz|\\<\\g9g;34g3iu&:\u0013\u0000*VxVX,\u000fޏЊ\u0001\u0015=\u0001\u001e?_Zf=~\u00005\u001b\u001f\t|z\u0003g^ \u0006~)|\u00102D=^V*Z\\\u000bp7*.#W0r{ŝ(\u0014WZZ~O6U)A\u001eߚېaH7\u0019Rw\u0006彇5fx\u000f`J[<uN\n2qA2\u0016>Pd֗Y̻%l\u001062*A=RdUuj\u0010!nmͦ\u001f5ݘiؓ,dXDrsUL7\u001d)mǴյ=ZbK4D?u=ӵ{ׅư0UwU\u0006}\u001a@Gmzb˷\u0005r.\u0002Ï\u0002>B+l\u001aX\bK\u000bP\u0004\u001b`\u0015\r5l\f^f\u0001\fY\u0000C\"\\$8\u000b\n\\Kp\u0019\u0015~2\n \u0019/p\u001d\u001a@-\u001bVC\u001aB:dc6\u0014\r\u000es`.̃lȁ\\<ȇ\u0000\u0016B8\u0004\u0000\u0016s\u0013\t~8\u001cG \u0004)\u0001\u001a\u0003\u001cCp\u0002\u000b\u0001G\u0018Ʊ8\u000ecPD\rjQq\u00028\u0011\u001f8\t'\u0014p:\u0018q\u0018\r\u00018\u0010\u00130\u0011ЊɨVh\u0006#vi\u0007\u00070\u0013g\r혅\u001d\u0017v\u001e숝p\u000eш~(a6΃D\u0019Mh.1\u001f\u0017B\\h\u0000슋\u0000').\u001bv\u001e\u0018\bUPn% ~r\u001c$?a\u001d9B'.\u00188qr$\u00149Mΐ\u001c9O.\u0012\u0017\r!\u0015RF\u001fH9F\u001b&En;P.\n\n\\p5B\u0003hWڍvg2A4!\t}h_\u0007ڏ\u0003@:\u001b̅s4\u000e4F\nt\b\u001dJ0:\u001eq\u0003:\u001ft\fc8\u001a#D\b\u0010vP)8*ZQx\"\bOQx\\<!\u0014KSixV<'\u0017/\u0017It2;it:AgrB*Gc?\fׇc\u001a99~\b$Xuov^Al(Vj\u00041؉$\u0010dٴV_|'dL)8\u0015t3q\u001698\u0017|\\\u000bqo=V!.\fg\u0002W*\\\u0017%~k\"v\u0002\u001eůq\u001d\r\u00117f܂[\u001b܆q\u0007d%XTxL6-dKJm\u0002\rn'\u000e2A4\u0015q'N\u001f\fp\u0006& g3\u0019\fs;#(g3\u0019s;\u0013Χ$gLq:Ӝ\f\u0011+\u001bɎ,\u0013e\u0017UvOY\"=dO8{?\u000e8\b\u0007\u0010\u001cp88\nGoܷ8\u0006\u001a\u0000+|s`Ɂ\r\u00116\"\f[`+l\u0003vB2԰v.\r{ \u0006R`o@\u0000\u001cC\n\b\u001c4\t8p\nN\u0019H\f8\u000b \u00136ԁl8\u0007\u0002\\Kp\u0019U\u0011\r\u001a\\P\u000fr>܀p\u000b \u001f\n\u0010JW\u0019M>~\rw.܃\"\u0015\u001e\u0010\u001ecV\u001c\u0014\u0007D\"j8\"j\"F\u0014DmqH\u0011uu(\u0002@SF\u0007\u0010E=Q_c(Q\u0004\u00128)N\fj,'E\u0006\u0004\u0006\u0006=,4\u0011gE\u00128!X\u0016a .K2ay\f\b\n\u0018\u0015RaG2F*\r`UuL\u001dkX\rc\rX\u000bkc\u001d>6w!\u0003\u001b?_.6>~ r5\u0010?&\u0018M1\u000e\u00196\u0016\u0012[\u0017%6|s\u0006[m\u001d\u000e\u001d\u0013vD]\u001bv\u001e\u0013{q>\u0017p!\u0017\u00198&ȠF0]^\bC6Lq3u7%Lan[&\u0002S\u00182>tL9}^_\u0017%}Y_Wu\\}CԷt\u0005P\u0017;\u0004Qwҝun{螺?֟>\u0017\u0000}_y,=[s<n±ܔ?M/\u0017\u000bE\"yz8s\u000bnɭ5\u000e(_E_%_e_4\u0005x\u001eBJ\u0014\u00111i*FG~*A!JR)*Me(R9\n0*O\u0014\f9HT\"U\u0014MU*UTb&բTR=jHSi\u001avܞ0\u001e\u001e<&|U\nUꞺ\u001e`}i\bGI4LK4\u0016BFi)-\u0015>KZKi\u0013m\u000fi;dEi\u000f^G'\u001dtR0\u001dX:JitNiJI\u0002]Ct)S!ݦt!={~'c{JϨ\u0017J=ԚzS\u001fK\u001bz\u0016\u0003\u000b١\u001cĒ5\u0017~4\u0006\u0010\u001a~.A8]6qI.ť\fpY.ǡ\u001c9#8+s\u0014'p'jCm\u001d\u000e@\u001d\u0013uDȕ\n\u0018N<DI<,x>/EW\u0017Fx\u0007'nN}|S?\u001fW\u001b\u001b\u001b?[;G1{p݋U7s;=sʜ6&\\0<3Jy2^W+za^y/܋\"\n\u0003}~~?G'}>w_/W\u001fksE^W\u000fZ)7\u0014(l ~ďa1,\fgv\u001fo\u000f\u0007ڃ\u0010{=\u001enGڣ\u0018{=\u001eoO'`Hc`\u0005\u0014;E%v=\"x)eJ2&4${=՞fOg3Y\u0003cϵ\u0005B{QGK\rՖ\u0006-\u001d\u001d18^KYTU\":a\u001d\u000e\u0006͠u:be*됕jeL+ÚtE]IWѺʆw:\u0005\u0004jVJVkZZ֫\rݤ6-j+4TߨmjڡvdKV{Tګ/}l])߫\u000bؚ(4\n\b\"\u0004$t\fxcΙ9sF\u0018E\u0010DD\u0005\u001ccf\u0012|2.ędܗN\\h\u0004\u0015\u0014qn\\\u0018ǜ\u0017}u߭>Vd\u0002I#t2\u0011/\u000fx\tk\u000e/\u0015j:b:j:\u0006wrq\t%owS7i\u0019Y9u\u0006 ]70gb5x\u000b^jD,\u0015\u0015/\u000b\u0011bX.VbDYT(SV|&։\u001fş\u0017KQ%֫!b(6A\u0005\\S`-,d|h%Fe`\u001b\u001bXH,OfO\u001c2\u0014yhWk:zE֫\r5ڨPԛ̆\tY\u001cxz[ ]\u001bvG\u000b\u0006c\u000f\u00030\u0014\u0007 \u001ca8DC~z}\u001e\u000f\u00070}>T\u000fׇ\u0011p}>R\u001f#(=Zcu\u001e4x\u000ez\u001c\rx\rc#&0\u001ca\u0004\u000e\u00118\u0012Gh(\u0018E\u001bƩ\u0003!\u001bƲ\u0004ȒGc6%\u00146ߋ\u0019x[\u0014\u001f<1\u000bp\u001c&c\nTi\u001aD|]\u00131G\u0015\u0005b(\u0014Eb(70\u00033\u000eNx\u0017}|\u000f\u0011N\u0011%b(\u0015\u000bEX$b|\n\u0000,`\u0007\u0000%U\u0015\u0005-del\u0011+g\u0012UJ-g+J}V5g\u0006s\rl#6[\u0016Yg<\u00164ϣ1bBG,ZƋ\">N3\u00141};\u0003zoG1YW5LVt\u0015_(kr\u0001bZŗ/2o%8}|;\u001dB4 \u0005^;ziYۓeu\u0015ͦS\rīyY˧jX\u000b\u0014\u0017b\u0019.r\\Kp)V`%.市*:⵪/ӹ\u000fů`\u00067ڿ.mG۫k\u0007![vD;\u001d4\rjNSŕ\u0006\u0000\f̸\u0016?S\u001d\u000ep=\u001a\r\u00117f3nqwR?ed^>\u001f@.y(\u0007v\u000e \u000f:\u000f#\u0007\u0010*!r\u000fH\u000eoy8\r G\u0011>\u0011\u0003\u001fN;23i \u001fA3\u001fE4G\u0013<v<]y,8ڍy<\u001fC\\\u0016RK~ h\u000f>ԑ$WI=\"\rmy$h\u0014}g<ʧF\u000bڛ\u000e>Ҿ.\r!->*ԇ(!t(y@\u001e,ȷ\u001e:\u0001V@\u0007K5[\u000emR\u0000n{yskɣXWw\u001ak\u0004q3}Gቺ\u0012a5\u001cF=j\rJb7\u000e\u001d$\u0019=\\@3\nW\u00192T{a\u0013<y'{ѕ86Z񑒨X\u0007\b^hp\u0014@!\u000eCI7><~:xpg\u000fk\u0013'uxBwiǕr/t{:P\u000fa\u0019H})Oҏ)M̓2\u0000~.%RL~\u0001\u0017d&[A\u00140\u0010OyW\u0012$+]I8\bH\\<W\\\u001f^=ߗ{W\u0004'Sfu\r4m\u0006m\u0006m\u0006?\u000f_e,s廪 \r\u0005@\u0015C|so\u0016\u0014E>LtW4\u001ff(eWM\\Pb\u0003\b&$l-)\u0013\u001d'eOI\u001e0vL-6&:*r#G\f\u000b\u001f:$l𠁡\u0003\u000bۧi\u0011lޭk΁:vh\u001fBq3S)1x{)Odteا\u001b,lj\u0016ÜҘ\u001cj\b\nꖰO\f\u0010\u00030\bHpBtD\u0017IKk\n,vç|\u000ewZFU;\u0011L)\u0018m\u0019AW/&H|\u0013-\u000eCK\u0016I\u0001\u0019U\u0013!\u0010\u0011)qZ) cɎ\u0017LQ\n49\u0016g@\u00135\u0006w5F(w\fD\u001b\u001aJ@O!\u0012i\u0011/Ɂ1jwʌ:紱%\u0002KAZ\u001e&IOI\t\u0019NڬwT)\u0000\u0000*\u0012\u0016H\u0017t*HCx#^@e;\\{L7eI\u001a'&5\\յ\n䴧\u0014P-A\u0018~6\u0012%׈6`oGAV\rf\u001dVG\f;[\u001a8='蒔:IRrdX\u001dAͳs,\u0005\u000f\u001a\u001bu><;3k;xzmo\u0005n0Pdǰ6\u001a\u00154hE\u00058JS(\u00015rH\u001fҗ4\u001aJ\u0014U\u0002\u001fEmP#\u0003W[U\u0014;3kLڪ\u001d={swĶ\u0002:@|r@\u0004W\u0001yK%\b7Ą\u00073?Kt5\u001f=$ezJ6\u0001\n\u0019\u0004Q^ͫp\u001b\u001c#)Ibक\u001clLL\u001b_\n\nd\u0007\u0003;N('+\u00048q3?-WO\u001f\\\\\u0003\u0001K6\u0002(\u001e+\u000bqxݫ(FclV\u0004$!1~R\u0013R\u0002\u0003~C\u001b&4b\u0000n\u0007tG\u0018mDS\u0019u;\u001a)]DwhH\b\u0007[TqW)? Y\u001bTirTZ\u00151M5,1*\u000e!\u0005S2b\u00170y0uSoE[^P\u000bjʅj:hfB\u0005U+U\u0018NKFaN7\u0014\u001c$𭰫h\u000f&)SvȩJzfS;u\u0006\u0007ޓ:\n\u0000\u000f:$\u0017H{Y \u0019B/)S@2Z:oq\u001a>pT\n󇆝\u0000\u0001\u001b\u001d7H\u0010E!5tzQC\u00130fJZF\u0013%%\u0013\n,4QiVWTU8?8UQ\r٤\u0015N\u001aK#?z\rO\u0012-Q\u001b%.\u0001k\u0011IX\u001bILKV\u0005UP5ͺ,0lK.z\u001dމ\u001a\u0004\u0003o6p\u0011Rӑ^PGW+\u000eV|\u0000&o`#dۋAxxjiN\u0017H-Im]7\u0002\u001f\u001b{\u0000x\f\u0007uz\u0014I!W\u00066Kŋ>\f\u0007\u001aF;Org\f09}\nmh\u001b\u00039\u0003Z2Rr+9UD\u001a$<_bߣ[\u001cyb\\AP@ݻR#%\u001deIH>\u001e\u0011DB\u0016\u0007IP+=!j\bq\u0018PoAųC\u000b\u001a\u001d\u001e+\u0017婢<;RDaҧ/tUFH\u0014\u0012!Yd\u0018NDy,{骆Ќe,޿%d\u0018_l`_f]!\n4j\f<lƒY\u0002\"kuѼS\u0002&K \u0011btهXZ],\"Yjm1\u0003\u0016pvգc>\u0004۬\u0011.#\u000f{\u0006\u0002\u0013j\tm4$W\u001c.U\u0005Ү\r=AZ'\u000f\u001e\u0002,>1\u001avK\u00067=oG\u0011(qnL3fY/-r:RiQ\u0011㊨G\u0015s\u000e8\u000e!,;\u000fyĻ1rax8\u0003<\u00183|u\u000e\u000e=c]\u0014y>f0r{8\u001fbq\u000bꄃȴ,&i1,w\u0006#Ytl2!\"\u0010lBS)v\t\u001e\u0014\u0019岢\u0015n[4{|I\u001d0Kya\u001b9W\u000bNw1Ռ!g\u001f\u0001= l\u0000g1\u000b\be=yAF)\u00020X:!Snʝ,/w\u0012t\u0012r\u0000#\u0006z\"{g)s/ƚo\r/>pp>vؚ.#6\n>`K\u00173o8H\be5\u000b\u0001g;Ϛ?9s3{yI\u000bx[!fN8)\f!ω\u0003\u0013\u001d) V\u000f~zv_B/`b~\u0001\u0010¡\u000b:TӴ\u001cH\u0005@ \u001322%Q(@\u001c\u0007B\u0006bZt).\u0004>l^7\u001f̟ĔiO ;o\u001bS;$y.^B\u00194uX\u0013ؽ\u0001F6D)\u0000C1\u0004Z9]leszA?\u00181fXۏ^a\u0001\u0016~,f\u0016l'E\u0013\u000bk<=b8JeکummT3\u001c\u0011i%@\u001aH3\u001dj\bPjK\u000b7Ҝ\u001a~w޺⑟\f{ƶ\u0015&sϿ6ѵ߼tv\u000f\u0006\u00072k7vI\u001b\u001fTƼ\u000bel#:t\u0017\u0003O\bJ\u0001Pִ=4EsS4MY%Fw@[?$\\-$a\u0017ȩpДa\u0006oQ\u0007'PQ\u0010\n%6'}\u0007}tiD!\u0016\n\u001ewMy].E0\u001d<E\u0011'pqnbWy_S\u0017x.^Î\u0015>MOr9kE?MTx4(ik$?\u000f',@($\u0007M\u00002@S\u001d\u0018\u0003՟Q]\u0010\u0010w-LwwZ\u0016ٌ\u0015jlu\u001f/8#<W~n'{\u0015w拚~\u001f\f\u001e˟t\u000fцvN8\r>cyݫ5BTy\ns?{\u0004\u000b\u0011\u00156IʪL\u001d8B\u0019\u0001)\u0011Mm\u0001gx\u00074\r?6{W~%\u00157,ޔ2[I\u0015\u0002\u00060{\u000fj%V:\u000faš@\u0017U\u0003\u0014uϽﾷ\b˂qaו\u0018V QKXjFEj]0L4)ZXRc;!mN&Vm'?N\u0013ʹ\u0019VSTx%;q{|;wQNNF\f_Nlx|ʶ6e\u0018FZ\n\u0005=Pw\u00161LѦ\u0011Om~`O7ִl;,\u000ek0U>2$\u000f5G*IeęMUUyX_ԓa-,7+/G\u0019Y\u0007\u0019\u001ai\u001as.t˕a@R/{\t̀\"\u0004N\u0017U\u00123?X6(we5\u001fY`iw_\u0010|m66Y8?>ϮSȣB\u0011\u001bsltUA)\f*cXeDX\u0011cin&;jwP'c6sgaZy\u001aOK\u001dJeHS\u000eI.U٣\rEeȫm\u001d>ޔg/vR\u0016M`(ekH\u0015fzYR`j̊?H,R#\u0014t:8W\u0011\u0012gEMۇ2\u0003\u000f\u001e/+{+,|a]zx\r{;h\u0002͏LV\u000efٳ]yi\u000e[0<\u0014h.Y+\\gdA*KS\\\u000eH Z؁HC2rM˟ruۖA|\f3\u001a\u000fYK)~#\u0010`r\u001a\u0015Ssi:eL皃l:\u0004=ɧ\u0017\u000eN|/O\b\u001fmg.\u0011\bw\"LӜE\"1Q!\u000eD+\u0003l[4+i\u0006+t\u0006I\u0011yYۼ;\u001b\u0001e꧎0y/]/\u0016i\t{+\u0012e1^+4se\u001fol6aҜ\u001ag~yϫ3W9%g\u00055k\u001f+]\u0012يW\u0018\u0005O\u000f\u0014L.ȱ{µ+jm_RκW\\lu\u0013&{l3jW~q/loj%eҪ\u0017OV-zN\u0013wJ\u0005XL\u0019dz&;\u0006L\u0000YBZ&\u0005͝P0\u0014\f4\u0007R[B\u0019B8\u001c\n8Cbg\u0016ԑ߭ݫ\u000f\u000e\f7n\bm%l9x&[C\u000eKdw\u0015j!hOg0\u0014jBL!vf~ѠU;lϿ%;׏\f^ٲa7l$\u001aJRUqV\u0018f0w[\u00151f˨IIt\u0004ɩS5&oM&1w\u00137\u0018Q\u0007n0X\nS\u0004\rc=\u001b\u0016-XǟAagE+#3\u000e[j5g\u0011M3\u0014swTe\u001a\u0012\u001d\u000e[V҉l5\u0016\b%\u000fUPsS\"*S^F\u0015\u001cҰ\u001cNc\u001dl/lnL<鲈S\u001e{K6P\u0017g-8ouE\u001ei82Ι\u0014\u00013D$T\u0013UfLI'L\b\u00068\u0019\t%%'e\u001cV\u0011a\u001bG8+\u0016=}\u001c?;\"ŝp\u001cW§nOyfcI{}v\rM\u0003\u0013Ndpÿߵ1\u001euՄje\u0018\u0003'tRI% mR.-_c\u001e\u0001.j#4ħRRM/P'\u000e\u0014\u0007\u0006Zb^>\u001ea\\GZe\u0017=j:LϩȢ_Tހ\u000bQz4\\{_O~\u0002=o:BZ\u0003:q;a*N+qoK2-R\u001f%M\\\u0005ۯR\u0019⸢2w\u0006|Q%~\u0005V\u0007ԥ\\\u001eH\u000b\u0015'=b|?O]xm|j|25R\u0004\\}<')\u0001<Es|*ý\u000eJ\u000ebq|XHw=\u00117 1\u001b19\u0010\u000b7|\u001f0|lo\u0005#wQ÷k7\u001eү1P\"\tcͨQ\u0005cJ+\u001d\u0012B\u0010\u000f,O)Mz*AZ\u001e!Ӷ.LB^{M\n=NֈҀ\u00109\u001aZ\u001aC:x)\u0019\bQ\n#s3Q\fPXTOR1u\u0001k\u0010\u000f(,{\u0002m\u0001y\u0003\u0000]uGe{0޻~\u0000Q&!7x@MxɒNMF=P\u0000į\u0003\u0000>`p-\t\r\u0007\u0014A\n\u001aj\u000e޳\u0013\u00142*\u001c˗48\u0002~\u0007H2\u0006p\\,7RJ;Q\u000e f:AO\u0014Cϐ\u0019G3\u0006\f$jG-$\u0011\u0011'x5j\u001d>%R\u0016'{QcXe\u000buIJ΍Zٗ\rٓ/vި?QO`\u0017|\u0007\u001fS6Qqm7-Rs1\u0011\u0005}I\r>\"'\u0011бѲ\u0015s˟M\u0016?\r\u001d֧}Jy\u000fe\"G$}\u0010=\u0015\\}.\u0007Ix+Jj\u0006,!\u0003_>@Oz`u\u000f̥5-A_\f$\\:>:>ECkPdF_?{iԜZ?ގ>3\u000f\r\u0011\tMORT\u0010S=\u00032/z\u0019<'\u001f?6Oϗ\b\u000eզ{Cj5\u0015\u001a (\ne\u0019l!vڱɴh\u0010C&\u0012CH\u0010P\u001fuuuL\u0019&\u001b\nK\\Ac t\u000fFKm*=s}X&<s<9\u001c\u0016C%:\u001eT=\u0005ui$\u001e1'x\u00071\u000f8亘\u0003dɍ4lL^ᛮfF!5mɝFieK\f9Đv_\u0017hX|>λɝwj_rqu\u001a\"xI1m\u000fV>\na\n1et\u001dI͕B$yW\u0017auޗ\u0011.I>q8\"y&\u000e\u0013cD@\u0007곎Ë?,RVAT~nMZF3pJ{ۨeSQ{ܣr+\u0016\u0019\u001bcY.򨻍ɍ`.\u001e\u000e!Dg\u0014\u0004h\u001cxUx#ȜR6לa\\mLu]v)h\u001e\u0018\u001a\\V6>C\u0016J\u0019yBʂ\u0019\\t\u0017uV;S\rXA\u0019^\by\u0014-iR0iR|]\u000f֮\u000fY\u0014>/\u001akCգVjԆu'\u0013ןdMg+7C\u001fp\u0004=qGYKژ;zYDj\u0011\\Ro\u0017ϒwm&;\u0017WЋ_QV`z>3Q#WdE+5\u0006E8\u0018V\u0000pSrFGh9>a}~-na-\u001dF\u001b[Iۀ]\u0015SN\u00117M51o%0k\u0015kuK\u001dy#p`Z)A\u0006l]\u0018,ّ87kAlj+^Z/?b˞0\u0018Ǻ\u001fԩ^sj\u0007=\fh\u0007\u0013\u001c\u001c9\u0018*\rz\u0006\u0006qm\ro\u000e\u0003x\u001b'D\u00058l1ͷ`#\u001c7&ς\u0005kU\u000f:U.cIk\tA\u0006=YXj\u0004Vp0\bf\u0013F)\u0004i.\u001f\u0016\u001f\u0012\u000fUWj:뙮.Ji\u0019/{\u001c8.hx~;5c}x\u001fa_z̾W\u001f(\u0000'kX%͚[ͺ2x\u001f\u001c\u0019w{_eFZx6\rlv\">~6l\u000f،@OM\u001br\u0013:AkIs\u0000\u001d:\"E\u0003/\u0001\u0013<<@\u0019,\u0002r5~:wA5w\u0018mZT\u0013\u0005ՂWE#qM<\u0016\u0004>}}U\b7\b,BAl\u0005\t(ΣV\u001a5\u0017?;g\u0007,6}1X\u0016ͧWS\u001b_\u0002kW>`Ĝ}|Ek4\u001fƈ|N̮R\u0017AM/RGhԂy\u001a>s\u00139\u001fnIZzpR+5r /Az\u001ekx'\u001cLMIf^\f~\u001auw;TpApnIɫ9{j\u001d\u0017o\u0001x\u0005uRP>Ƞ\u000f\u0018?G@T8[dSnl\u001f\u0013K*\u001dh^2Ɲ\u0017Y~#{WF~\u001a'9;;׀{)ks{\u0005r\u0017^9.\u0005]r*t;~\u001aw2~LYLƚ\u0014ހn\u0014Րh-ήls;%7id-\rD\u001fv\u0011EV|\u0005?@7h0?:ȫ\u0016r}1$N-\u0003\u0015޽tzUKC\u0015\u000e\u000e2\u0007&\u0017ڤ!+\u0019R.Sh}忎v\u0016\u0016蟌ρOdl?d4\u0004c=\u0000Y\u001a6u9rg!KM^g鷥8<\u001c%4j}\u0007NT\u0007z|mjY_i\u0019=Bu\u000bL*康#Q+Su,%\u0016)\tЫX\u0012$\u0006\\h\u001aǾ\to/s.b9r(IJXY1R\u0010/\u000eu\u001aQM2\u0012d_P\r?Au96Y5w'n+kij4]1yBMKָAٳ1^F<\u001b%\u0012ɋ\u0012$q<\u001e,A\u0014gs0K/ױܥ}^(\\a\u0001qzel!YH-]\u0011!ġQ˳\u001be\u0015>TýBo\u0014p/K\\\u0010qv\u001a%j\u0019~\u001b\u001cbVI\u0010\u001f4Yʊ99]u\u0005\u0010\u001fΣ(lÇ5D\u001d;xo4gĻ\"ԀyGgv\u0010k~eL\u000e<\"3\"Nl.JZҬ\u000e5Nwzs\u0016~1}L놩!N!\u0002ǩ\\\u001d޻`x~`9\u000bN\u0013\u0015\u0019Ti]/ՠ\u0007dW\u001fZv\u0016Z\u001e\u0004Bm3(Bs\u0003o'\u001a+\u001aNSNTʝzws\u001aO\r1d]\u0016+&y%/Ŀ;d+2^sc\u0012_\u0014A}Vӧ\u0003\u001f9Wy\u000f\u0004\u0004ch;%\tڵ-N¶ߔ\u0004I91T\u0018$ha1h\u0018I{\u0007?I~0~OI?\u0005W^Һ_D\r\u0007Óơ\u000f\u0001k\u0016u}J&\"w\u00149d\u0013m_:\tZy.fYռ\u000fF[\u001fk\u001aڙԬ\\\u0004onMfKR_\n\u001f\bpR7\u001e:u\u0001PN}\rW;\u0005\u0016|\bS\f5mؗe\u0019\tV\u0018\u001c \u0015vM4OI/\u0017ପ#wy\u0010\u0005\u0006\u00016P\"`\nL\b<\f\u000f\u0007\u0001\u0001\u0011B1DED^\u00132i0\u0013 LJC#\u00100V) -XQF@@d,) =~'/w?={sή!4\u001a܃\u0005#\t\u0015=_*r])Sc[iN͟le,?}\u0018߀\u0002ְLҬ\u0015j4w~\tykAwY)\u0018+*K>1\b0c\u0019S`.U\u001acC-}r!\u001dC\n\u00169\u001bhŽ2P..s73gHOcoK0\tۇq\u0006^+[.8$¾u&-SCOb\u0015oCkYW~T}ӼoWN:dJ+\u0016qnP\u001faL\u0011C\tb(}w\rmN^~\u0010з\u001f\tʝj@\u001f\u000e`.\n> ̯޸\"-a[\u0017l d\u000f\u0011\u0019\u000f.gPgoF\u001ah\"u\\nYsG+g\u00185s6^cf\u000ey\u0019jd$h\r\u000eZI\u001dt\u001f\u0011~b\u001b\u001f\th\u0014+\u000e\nL%V'C4.O\u0005L|\\\u000ec~$'6x'u\u0013\u001e\f}o\r\u0016\u0006gA\u000f]}\"\u000f>:8\u0013ˣx{GjR4p/^QD8\u000fCeЍ`s\u0007g\u001c8\fGg\u0006@D$[\u0001ky<\t<\u001e0\u000e\u000b\u0005\u000b帨o\tyB#?F~\u000e]j洗!כoy1׻[Ž6D2'>mbT/\"]9}Iָ/iW]O!:܊\"Պ\u0005\u000b\f\u0010l٨Eԫ\n+R`=J3/ñ\rcmĺENbq6\u0006uu^eTQ~I*P\u0015Rϖv&=UlUPyWh/=P=q\u0018\u0006\u0002dA6KyK=K\u0016`oiRr2W\u001aA\u0004֤`(R\u001f`.(y~\u0011;汖d(31FT*j:[^\u000fڎS\u0019?qF\u0014]f8U\u0016~MC_/<`YD|01NAs>cu\u0012cBA3\u0011YhW\u001ecUgG(O\u0004-RO޷цH\u001a2\t>ǔ]\u0002>9\u0014jsb[cOd2XԳ\u00171p\u0006u\u0013Vx\u0013 e8>MczTEVhr_^OkC]`W?Fb^8%\u0016\u0015QcEKSHv@\u001e\b\u0011hz\u001e\u001dO\u00170)\u0011'&\u001fz'\u0000_\u001eBFh\u0017M0\u001c{^ɚ7\u0006\rޖi;+\u0005$\u0005vK\u0001>ٌFw`/\u0005X\u001d9ther<fwLF}\u0003jn{Hsg\"\u0001\u001d\u0007\u000bl\u000e!3]GZF\u0007o3!F~\u0014_G'ɾYz#\u001e7⍏\u001aĺ\"G\\{C&9V]PV\u001erK,Pi^LX\u0003y^7iU$m|D\f\rheW5|rRi\u001e\u0015͔\u0014\u000fy29\u001c(9[-A=#\u001d$1\u0002<\u0007>=H9M_Bshrv+\u001c\u001fڞzttɱa\baYԸ\u0017e0x\u0014|\"Ξ\b,\u0005)p%O\u001f\u0011M^+1\tX\u000b;\u0013[E\u00153d=E~5\t5%\u001aӝ,1\r>jQ`wRJR\n=igRJtԸ\u0002U/Kj\u0013u\u000eS>x'\f\u0017\u001a=%yrRIS4V\n|\u001eb9e&ʹml}}#\u001b>(S\u001erWʫ\u00076Rb2,\u000fM9c+\u0015>)qI<\u000b.ekfnrߐ\u0012m;KN*2*U%%m}\u0002l\rtFy\u000b˽Lwl\balWQ\u0019t2`\f]\u001b\"{\u0012F2T&B5ՈETuDkf\u001fT/L_Z\u0016)};,g0 cd=hT}r~~\n<ڙ ?1\r<\u0014xD'3\u001a(\u0014P5\u00191gsrv-qwK\n\u000bJoQKk?3)wK8\u0013$V\u001csiMcdS]b`@$B9sr{\u001e]:\n$wX8$9\u0000U;,Æv)N\rA&C6^A\u00150yޛ!ŷN\u0005w\fx\u0001C\u001e&y\u000fF<5\u0002cO\u000e\u001bjw&As2y\u0000\u001d`Rrfsz\u0017Ə2Rt\u0015k{L`^\u001c\u0012]wc qWn72\u001f\u000f\u001a߅ޱ\u0015S7\\|8\u0004\bx\u0017w@\u0003xoA46_V8\u001fJ\u001f>ut'K%-i\u0006\u0017\u001f5\n}\u0013e\u0016})5~a|5c髡\u0007ifg\u0019ހ4[з\u0000\b\u00113={X-n6{d_\r^bo%Eֻ,v?Ƒ>̻\u0007\u0018\u0014Z\u000ewrF^*?я }-D\u000b7Ģ\u000eeda)LDWȖb0{}\u0016t=W@WBg\u0014{0ře2\f\fU9p^\u001a/.W&\u0012\u0006O70ANW`\u0005\u001f\u0002\\Uq\u0006޻眛TG\u001a\u0012D(\u0018\" 5\u0002\u0002e\"\u0010<RP\fNF\fD X\u0002!!B\u00102aLE (:\u000fp,I5UF40\u0001D\u0006ǒo#\\\u0011Йo}nP퍗\u000bct;މCݤ\u00189\u000fJB\u00132Ly\u0016rN\u001dRz0#(=PI\u0000\f\u0016\u001f\"w\u0012jeRi\u001c,\u0018I]w\\C\u00179O\rĖ\u0005b$Ae'0SVK\u0007#FRAi~pt\u0012>\u001b\u001cJX\u0018,\u000f\nd\u001d\u0012G$Z#kxsEQGē<\u001dN\u0019tڨm{T\u001diH\u001c]#ԗ>-|e}\u001e8n{y\u001fZ\u0006zOP)\u0004nWm\u0016QF;k{h^cl4fgYn$3\u001eV8{/~Krtɾf=jkua\f8,Z,qsYD\u0003Z1\u0002[W}Ot7R~\u001e\u001ft\bc-}GI2R!ìRrc\u001b9P#)x\u0017tbjM<M]\u0003r$­NOA5s_4K\u0019\u001aҭgysy\"}y]od\u0012/dJ,f\u0002~\u0013C\u0010o0g:>i,'ep\tAYn*\u00134M2&OЯ=\u0019\u0017܌S 3DA\u000e~c0\u0003f)w.:\u0007Osg\u0017{Zr\u001f:kЉ?JUGػzlƙ[؊1Al.{\tfH 'j_i\u0007>R'OOj\u0019\f6mxZb<pzL\u001b\u00011Ə\u0007}\u0019S겤.hI1c|nʇ\u0015,%\u001e\u0019ڛǍ\u001d쭞\fzutso\u000f=/\u000fEjleh<_轹=v\u0012kL{\u0016~A\u001e\u0010-zqrϷf?plޟFW~s\u001fhy:ۧOD}{C;O\u0018\n[SV2\u000egܾn;Fϯa%.n%gb=b4%qr}\u0019g^y\u000fo̭\u001e;O<n\u001c\u001dR?\u00131d\u0011\u000f\\9PE:\u000eb\u001b\u0005~u}\u0004\u0003&so\u000bΞ}N:9\u0017~lu\u0003Q\f,w,\r$^rŜ\u0013^\u001cj}P-%nli\u001fN;!\u001d6|q\u0018+_݄{|O8-ew3y\u0018Jy\u000ef\u0000LY,yFTp8ʶ|3XR\fY_N>\u00135g6K*4j5mR.e\u000f͓4\u000eٗ|\u0005qI-z]̗L#^*\t92h\fS),\u0005fn\u0014\u0017Rv^ڑPe%KY\u001c\u001be9E[\u00163z\n+:>\f#37K\fO<Ç\u0014s-2\u0005;4H6vI\u00062[`vY48ʹbt\u001aː2׼I\u001a\n9M2j1#SJ2\r\u001d\u001fR~I\u001a\r\u0017YjdCq\rrB<P#ߌI_@5/b/~ F/\b*\u0001^h&m>\"ݭx2a#KzQ[/;Xf⓭_\u0006J!%8Y\u0018#\u0005HepI\u000f6\u0011ǽ_\u0019n\u0011\u000eM_%nނ840\u0013[[n({\r:\u000fc_2s\f\u0006\u0005/\u001e`'k_4}\fCwx{\f325A\u001f';ׅ\u0003j8ND{W\u001beMO\u0015r\u000f\u001a\u001fVH3o,\u001f\u0018)U̝2X\u0019O^@n\u001b\u001fn\u00150m<x\u001d\"\u001alt4\n\u0013ľƷH\u001f\u000fGM:n3۰\"I1p\u0013ƶ\u0017\u0010\u001e*V*j˔p\tq@g\u001d#'sنsh:'\u00058EfRjnƳ\u0012g_\fb#\u0006/c*\u0018 B\u0005/eU\u001fh\u001a)\u001b\u000b\u000e\u001e)cT%_W\u0012I\u000fe%/0sę$2щ=Dzy\u0011mx\u0018 ,G?;S^x\u001d\u0017\u00056o\u001cZcL\n\u0015\u0010\u000bU\u0013\u001c&š4Y\u0013\u0016jU\u001fɋ1T«\u000fi\u001ba\u0006S\u0002\u001d`\u0019wc-\u0014\u0001)p\t2`\u001bx\u000b4LX\bO8(pȓO\u001evB\u0001\u001az?id<\beL\u0015HvC\t<\u0006a#߅$+\u001cbcx\u001d>\u0018\n\u00019\nn6)ȇBxWݐ\u0006DtS\u0010u\u001aSP\b#)8\u0001Y)C=C\u0018@wA\u001c\u0004C-xK \u0015O\u0011t\u0019/=&z>*\u0010\u000eק\u0005\u00050\u0003\u0006\u00018ye\u0001<|\u001fCNl\u0013f@\u001a<\bј\u0002If/\u0002\u0006C\u000f8\u0006up\u00069`7\u0006l0\t~\u0007oM[C\u0018\t//&@_d\u00052\u0004Ll\n\u001eE:XK OK[\u001b%Ij}X*+/Cp<\u001e4en\u0005d{ΜZs_U\u001du\u001csܓ{JW/Bi\u0002B.\u0010IxNIx$܄4!\u0010ZhbGhV&cVLa\u0000\u0007\u001f:ա\u0016p\b\"B\u000b=7\tVft::g=w߮Ax\u0001[.~3p\fy`\u000b(W#;\u001c\u0002<wqI,-̩sru\u001aQϳfȼ\\H?XG?\u001bm!~v\u0007\u0016\u0004\u001fݠo|7>~{\u00008Uxf8x^\u0001\f\u0000q\u000e\u000fя<bϓm\u000b\u0007MB\u001f0\u0015ɱ[hW_[\u001fbՀ$ъ!gB{>g\"9^n\u001a#BkB<18/\u001agd(d<\u001azhcFu\r]<,r?\u0019{\u00076Ͷ`28^`f,y7A\u001bpZߣ\u001cN>P5f#,\u001a\u001fZD毑&\u0014:E,f\u001c\u0012f<ޛ7\u0007?׸VIiS\u001a|V\\γ[hت.vhwFn\u001b.\u001bIwcw=\u001bR~\u0017١Ѫsg&!ȏ޹a\u001fL2$oFsUez q\u00119\\}<\u0017\u0017\"ݗhtf ]7y\u0011SH\u0014\u001aLq9.\u0005xf;KԙI\"}ȵ\u0019\u000b_r\u0012ܮ\u0005u:z\u0001\u001a6<ebG\u001cI\fa<V`eq?dE)\u0005ʯ5RY\u001f!pm\f\u0018hG_ҙtbQg\u00022%^5ƙ!r=ʘGC6!\u0017wm38\u000bs,PnaF\u0017d;D}\u001ecՈI\"߽\u0018{\u001a?q\u0017[ټyι:Mc2Is\bB\u0004\u0019\n)\u0018ωMe\"7釧>;\u0015-N>֮W{^b?FT^\u001d\\\\E(s[\\%wr>al\fI5cuك0܊\u001e\r+:Lk=U\r$q5\u00068-\\\nN\fm0*{u[1Rm+wz1?\u0013z4HMl\u0013r߻\u0003MI\u0005 *3\"|@s<X1з-\u001aS{₻;~\u0005\u001e\u000fbT#\u0006[Lżr;[*ˠe^q1a\u001c\u001c0h\u0012\u001cϻg2\\kb\b/gK?+n15<εk0z2&ܳ\u000f שx|L#~\u0012ur,bq>.+OQ?&=Q>i\u0006>.'Pf\u0015S\u0014Cc~D?FzF(|\u001c5w\u001dd\u001eu\\ӕM{tGџ+_\u0000O6KH:) !23!\u0001[$3Ĝ\u0013@*5Hc\f\t&d>\u001eYd\u0019$H:G=\u001c̑0(Dj R8E\u0005<G_ԱO0f،2s&cT\u0004r\u0007ٿcH\u001dξI\u0011\\G\u0004m1}C\u001bXhmQ̵+~O?6{#\u000eNv^7,\u00130z#\u001cO\u001d7툌{\u001eᱏ+5t/zЖ8zݸ\u0003Q\u0003`+ ~4ij'I'Fh4\u001aFh4\u001aFh4\u001aFh4\u001aFh4\u001aFh4\u001aFh4\u001aFh4\u001aFh4\u001aFh4\u0018\u0003H~|\u001dA4nHf|7\u0010B\"\u0001/1\bd*A5KWN27{>o\u0010~<\u0006Ӟl\u0016,(d\u001fO\u00077\u001d#1\n\u0019f\fKP*Ԑ\u0012d$JXŬ)T\u0011lF\u0005Aa])F\"#^ŴXi&R\u0011k#X͚|bZ%\u00051O_gתVP*U\u0004I\u0015uֲo=6G!JCJc0LٰOXN ߻XrOw\u001aKKY+[kicM7峾L}GŧS\",\u0017E.V#q7FS}iPKFx5VZj\u0015\u000b~INWv\u001fQ\u001a\u0011,;H\u00174Y\u0014\r\u001a5e%6!WҊ2(\\ʶH7,V\u0016/V\u0016o+ΫTkޘe,Y)S(;P^*2wU\u0015V-߀B/%\\\u0014\u0014Q:,蹴e8zjKis7>\u0016=|\u0000w\u0016_\"Mlqi5ן\u0018>sW~'O1YWuS~.U,[ΤIye\u001bMٯ)&%eL\"KF֯R뫓R\u0006%i\t\u0019iv7\u001eZgE+_\u0015Mᬃ}C1qe/'d'l&t^Q&\u0016pĘRW#\u001b\u001aYGfV\u0011:\u001e:hPyV֤^ᖋVb\u0019jN\u0019~Ffh\u000e|ĨB>1*b{Q\u0012(!(g\u001ff06dM%BiC\u001aD\u00063\u0017jx1\u0010Z[v0C!B/<o\u0007YD\u0010wn+\u001d\u00167\u001c\\5\u001cKi؄ZiL8\u0013*\u0010C0j\u000bՂ(hLȩO/,oE\u0001+Y<c\u000b\u000f-1\u0012of36\u001ezW+ҍ\u0012}[\u000f7$}kd\u0007_<}\u0010=7s]|\nM~kb%⋦B0}\u0006t.5\u00107pĲ1[n\u0000\u0014x.E7\u001a\n}\bQ*1\tB%j/\u0011\"i.\u0010\n3(- 48\u0012\u0014]|\u001a_S=ǟ\u001dw\u0004`+8\f}JjQ=\u0018t\u0017Ã|\u0018Շmmև,-n\u001fa\ta5W{Ϫ3=\u0012Vܥ\"T\u0005\u001b'\f\u0007$\u0013b\u0011#4\u0018!|.6aX%\b\u001bfq6Lf0¢Lga0\u0010+eG\u001d\u0017xx3WYp|gå\u000eri\u0005h˛-I;\u0016\f\u001bqĝōeJc3cei\u001f^[ܴ\u000b\u001d$\u0013E*.TB\u0017yP.~*\"*=\u0000Nh\u001brk\u001d\u001b\u001e\tAݎ\u001a&<7iNlݳ\u0002\n\u001f\u0005,ȸ ]+\u0000u\rh0\r\nendstream\rendobj\r95 0 obj\r<</Ascent 1298/CapHeight 700/Descent -411/Flags 32/FontBBox[-573 -411 1999 1298]/FontFamily(Segoe UI)/FontFile2 98 0 R/FontName/NJSPMO+SegoeUI/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 80/Type/FontDescriptor/XHeight 500>>\rendobj\r98 0 obj\r<</Filter/FlateDecode/Length 23502/Length1 63572>>stream\r\nHyT\u0014W\u0016ƿnWSl\r*Xխ+ƨa↸F\u000bƌ \"D[q:98\u0019ˀG\u001dc\u001ccYԸo\u0011q\\\u0011AA#hCF1̙^5\b/\u0003_k8\n*}TrzR%;\u0001\u0000D\\M3\u0002\u000f\u0003T[jfZzn\u0017Ӏ\u001e6qVe>kV\u0000cS<D_.z1ce\"/r\tR7\u001c53Կs'f$'Q܏U\u0006\u0017'̬÷\f(]$듒S>4:\u00170̘\u001e\u00109\u0010(gNI\u0002\u0000s\u001c?-\u0007k|zϣ,R\rf6xAȟ@\u000b~8*^w#\u000e\u001a>\u001a@\r\u0006\u000er{\u0004xn\b-In\u001e>\u0010\u0011RvBA\u0017Itq1۸ĸԸ_A\u001f\u0012r\u0019W\"Ln%[9ne*zf\u0003\fr>\u0019>\u0019~]obe9l9j9mq^\t-\r\u000b\u000f\u001c/\u0016Ejݵ`m6\\\u001b}\u000ei+ZVt\u001eXO֗}+[XC6k5њa]l̺\u0017f\u0002m6\u0016ciK*\u001a;{\u000fO/KR2\u001ae7ώG7v\bm~;I\u0017ysoMq\u0018g\u0007g]\\]Yө5ĕv5nwW#8۸@2\\fȯPN'^\\n\u00127w{zxUjd]\"\u0019J~%ΒS0_2,\fG,DK\u000bt\u0016a6Wۭ\u001d.h״\n\u000eɰJow\f\u0013L=K_d\u0018a_kuuu+\f\u0003$p[W\u0018ec\td8J2L\f7\u001f\u0015ZaMzn\\\u001ev=\tg\u001dgM0y:C-g.]2tM\fn#MԚ+*MJ#%5xaf\u001f\u000bYOL\u001d\u000b+A\u00116`6caTH!]\\.Szzռ\u0011s4\u0019iɎLGc#111ΑHuq$\u0003EB3o)kUضP\tg\u0015{\u0006\u001e̕yե\n\u0002\u0005y٥jR;T0Jf^|OxQqv\u0019+rOq\\s\\S3vEnܵ؊Ix\u0002\u0001\tq3!U'\u0007;e\r\u000bV55=sr\u001eScTώIݮl\u0014\u000ey?\u000e2`l\u0019\u001b9`K@A\u00076^;\u001e\u000f|L\u0017g`\u001e/b\u00171s-pnؠA\u0004ۀw\r\u001e\u0014'D>Y6\n<뉡{dg#6a\u0001\u0016\u001a:a5na\u0011>R\r[w,'D̫̫\fk1\u000ey\ra+*\u0010\u0001q\u001cvF2V`\fN\"\u0005p\u0002gp\n3n#\u0015 \u001fg%P\u0015p\u001ecQX\u0018\tHDLB\u000e20\u0019,L\fb&fc\u0016\u0007x\u001f{\u001e٘#\u000fq\u0007a/u\u001ed$AL&Tޢԋz\u00057)d&/\u0002M}/\u0014O*y\u000f\u0000z\u0007OPE\u0003]#\r40\u001aN#h$%P\"$\u001a@m\u001d%\u0018JTJ#?4,\u0014@T\u00077PDA\u0014,kp\u0002P(N(2i2Q8v+Kh\nM\bQ\u0016M38q\u0013\u000eJ6j@i\u0006ͤY4ޣ\u0003jHvF4i.}Hh>ԄR3\u0014\u0016\u001d+SS\u0012_\u001bG|+\u0007'#O\u001c\u0010?8,8.N8m3t\u0016?3\"_\u0015sU\\\u0010\u0012\u0017%qU\\\u0011W5Q BqC\u0014!E%nRQ&7qO⁨\u0010\u000fEx$\u001e'J<\u0015τST\u001a\u0012n\u0006\u0013\u001bȂMXeoa_cp\u0000\u0007r\u001d\u000e`\u000eP\u000ep8#>km܀\u0016\">Ŵ\u001b\u00117&ܔqs\u0016Do)ϣVܚ\u001b\u001c7-X×\u001d܁;r,w8%;s\u0017ݸ;00\u0014[ܓ{qo~p_9^)M۔\u001bJP\u0012r[)Uʔ;>uz@I=\u001eR\u000fGԣ1zB=,\u0006\u0010y2\u000e7uX\u0004`pf7]$\u001e]v$x\u0010n\u0014ww\r\u001e\b.c@R\u0016RZWK-\u00156xovR\u000eԑ:QgB]\u001bu\u001eԓzQoC}\u001f\u00014\u0006`\u001aBCi\u0018\r\u00114Fh\u001aCci\u001c\t\u001aL~Lww:%\f}g\u001534<O\u000bh!-j1-\nZIh5\u0006Hh3m\u000eIt\r]\u0007\u0010\u001ex8<G\u0018\u001ex<O<'\u0014x:'y=x'=\u001fx6<\u0002^ȋGO'ۯ\u001cO./%r^+y\u00155z\u001by\u0013oֵt1zn\u001bX+\u001a&:Nc4ƨ:ΪꊵT7]P=U/[Q}U?_\rP\u0003 5X\rQC05\\P#(5ZQc8R\u00045QMR\u00145UMSUS3jAVs\\5OW\u000b]~T\u0012T-S\nRR\u001aVS\u0006QmR\u0016n\u0013t3\u0016ng~_ֺnmj;w.ܕqw=\u0017>ܗq7ڍqkux\u0000\u000ftxd.4X\u000b\u0002VB\u0012հ\u0006z\u0000\u001ba\u0013lͰ\u0005By\u0006a\u0007]\u001b^\u0007\u0000$C\u00058\b0\u001cp\fC\nP\u0011R\u0014Tp\u001aY8\u0007\u0002\\Kp\u0019Ұ:\\P\u00055\u0006\u0006܄[\u000e\u0019\tYn}M{h/t \u001dt1:N)tNR*~cst.ED)ūt\rI(2(S:ǝ\u0014~_7-l\rw.^>\u0004\u000fg\r\u000f\u0017x\u0004c?<\f\u000bx\t5\u000eo\u0001~\u0007\t3|A\u000f\u0002?\u0019\u001a\u001d\u00144h17A/|\u0018E\u001f\u0016X\b\u000bc \u0006a0`(a8F`\u0011ĢX\fc\t܅%\u00142X\u0016c9<\u0002VJ\u0007+c\u0015ʢlMw.=O?\u0003\u001e/~xBO\u0019=\u0017^kzCo\u001d\u0003N\u001f\u000f>g\u001e\u001b?\u0015\u00133Vj\u0007Y0\u000b\u001b<G\u0018\u001eg˹9\u000f{1\u0005Op^\u0001]q\u0001.ȅ0T<\f@\u000e`\u000esx\u001e/E\u000e0\u000e\b.\\qqs\t.\u001cp\u0014v\u000e:\u0015.e\u001c\n\\+qeU\u001a\u001f\u0015_ixkpMQ\u001c1\\p]~sC5W5s07-nč\tq<7\u0004nƉܜ[pKnŭ\r5&d,Ѝu\u001b&6Ԇp\u001bƹnS7m&|ns/\u0017\u000b\"|E|\u0001\u0003cM'IjO=kh/6^W5{ް7-n3lͲclmj\u0013l3h\u0016meֶmkom{v\u000fd_`'Ivbj(\u0013mb(_.y\u000bz\u000by\u000b\u0007S6uM=S40\rM\u0006y!Po;\u0010F\u0016GDX-y+y%\u0004H~q'\u0005\u0014\u0012(A\u0012,!\u0012*a\u0012.\u0011J\u0011RLK\t))RNK\u0005(TR]F\u001846MLO6}L_O8Nd9msqIw%=k\u0019)\u0003d\u00012Y4.-e̔Y2[2_\u0016bY&+eԐZ6f\"[el\u001dS.-{d\u0012%\u0007$Y\u000e\u00119&)rRR嬜Sܔ[\u0012-)rGrܗ\u0007P\u001ecy\"䅼7V{༒PI\u0007(|1\u001e\u0003\u0006M.!1NE@\u0019h|2\u00045>S\u00144La\u0013hL\t1&̄\bSDz&$H4D$^J4DS̔0L9S$f\u0019l\u0018+\u0000\u0003=~p\u0004w\b!\u0000!NHBnq%$\u0010\u0012b8\u0004ww(E׭[\u000b\\+-EZ<o(\u0014EXrQ!*EX)֊jEl\u0017^q@\u001c\u0016Gqqݜ\u0011\u0005qѯ7\u0000?\u000fCP?c8?O~_\u0011aj\u00186544MMK\u0013`\u0002Me[zֳַ#(;NS4;&\u0014jlͰ6f\u001ckM\u0007\u0013b:N\t5]L\t7\u0011&Dh\u0013cXęx`D4Lm Y֒BzRڲe]FZYO֗\rdCH6MdSL6-dKJmdl+\u0003e;\u0019$`AȎ,Ce\u0017\u0019&e9%S\nR\u001aS\u0006eR\u0016eS\u000e\fIh6͡4\u0002ZHy\u0016S!-\"ZJŴJS\u0019S\u0005UR\u0015V\u001aZKh=mjHh3m\u000eIh7\u0001:H0\u001dt\t:I4Kg=:K<]t~Cow\u0001]\u000f#=>O\n]k)}F\u001fOg\u000b=g^KzE\re]\u0006F5\u0016\u000bXrm>eŚ\r[\u00017FܘpSn͹\u0005Vܚp\u0000@nAܞ\u0003pGĝ9p\u0018s\u0004Gr\u0014Gs\fwXq\u001c\tܝ\u0013\u0007^Ľ\u000f~ܟ\u0007@\u001eăy\b\u000f\u0015_/WkVO|'u\u001e~\u001b#܄[p\u001bO3܅_\u001e܇\u0007\u0010\u001ecx\u0002O\u0019<\u0017\u0012^kx\u0003oA\u0017\u0001\u0011k`M|\u0007\t\u0019k@\u000f%:c]TѠzX\u001f\u001b`Cl\t6f\u001c[`Kl\r\u0006`[\fv\u00181\u0018;`\bvN\u0019C\u000ba8F`$Fa4`Wn\u00181\u0011{`OI\u001b`_q\u0000\u000eA8\u0018P\u001cq\u0004Q8\u001aX\u001cq\u0002NI8\u0019T1]v׸kuzLTLtLl\\3q\u001698\u0017|\\\u000b1\u000f\u0017fL0\u000e\u0004\b`2L0\rC2@*A:d@&dA6@.̀0\u000bf\u001c\u000b`>,\u0007 \u001f\n`1\u0014\u0012(P\fˠ\u0004Ja9A9T@%T\nX\t`5\u000e\u0006\t6\u0016\n`;쀝\u000bv\u001e\u000b`?\u001cp\b\u000e\u00118np\u0018\u001c\u0013p\u0012Ni3L5tlR0\u001f\u000bp1\u0016\u0012,¥X˰\u0004Kq9a9V`%V\n\\p5\u0011o[\\\u000f<jx5wTG\u001e'|5\u001f8gs\u0010*Hsɹnt;\u0017|)q>v*6^\u000byA^{s͍sC7Jx'x\u001bow.{x/|\u000f|\u000f\u0011>8|O||\b\u001eɣxd;Pņp\u001ba#7L1/7\\/Kox\fq<^\u0015e򒼨\u000e`ެ!#Dѷ;}]\u0005{\u001d\u000fQԷmww=}_?\u000f#X?O3\\/KJo]\u0017N\u0017㏼(78*s\u0019s\u0005Wr\u0015fQ\u0014mqG$~\u0016w/➸/\u001e^/Sm6T/\u0011cD<5i&dLeMU\nS*BE(\u0015bTW\u00158\u0015\u0012TwzJRU\u001fWS\u00005P\rR\u00105T\rS\b5RR\u00185VS\u00045QMR\u00145UMSUJ1yf7\u0005f)4KLJUi*]eLUU3L5KVs\\5OW\u000bB\u0016|U\u0016BD\u00156\rmYjmjcm7\u001bgm)6L)5M)7\u0015T\u0015fYeV5x.^^_\u001b\r\u0014kSuN\u0019:Sgls\f=Sҳ\u001c=W\u0002PE:_\u0017źP/Ez.t.u.?U\u001eTOڴ\\s\u0002\u0016\u0018V\u0016\u0011Њ\n6l-\u0015\u0019I\u0000l:3#\"2e/V\u0016\u0017ֲZE\u0017\u0017d)T\u000fP\u0019uH漴Psf>{Ysn{\u001eX\fa\u0001\u00168\u001c\u0013p\"N8\u0005p*N8\u0003g,sp.X\u000bp!.6K\u00042\\\n,ŕc\u0018Wj\\kq\u001d2܀\u001bq\u0013n-\u0015r܆q\u0007]\u001b^-{\u001cp\u000b\u001f\u0001<HSi\u001aM\u00194flCsi\u001eͧb<\b\u001ecx\u001cOI\u0010?i\u0001-EtZLo;:pf83^g7z\u0007?S)3x\u0016a\u0005-\u0012ZJh9K+VNaZEi\ruh\u0003mMVzi\u001bm\u001dvnC{i\u001f\u0003:@\u0007\u0010\u001d#tq:A'ݝ==Cȶ\tamm3˙-\nY(r('r,S49]ΐ3,9[Αs<9_\u0016\u0005r\\$KJ˰\\%W5r\\'s};RW\tO\"]!QbzKLWcD\u001a!Ʃ?\"FU1HAJp8c8W\u000b\"Uu|QB\\\tgL5\u0012T\u0017HPSJ5U<&\bT\u0019YWtSa]\u0012=\u0016Sm\u0015\u0017.qI\u0016\u00176Qg!:\\Z\" \u0006k_kՇ#l6>O\u0014}J\fsTA\u0002Ug9]K Ψ\u0016PgET91bV\u0017DDĩ\nꢺU=\u0000\u0011w\u001d\tDG\u001d\u0010\u000eC:\u000eC9^\"KdJKeey\u000b\u0005]/Aז ]\u0003H\u001b\u0014\u0013&kG'WXT\u0013!\u0013}RM#jw®k\u001f\u0016¡Zj\u0007T@vP\u0012\u001d\u000e©\u001dӎ6j+\u0007=*M4PAPN\u000e\"YuND#VĽ\u0011I=*\u001a㪳Ok\u0017K}}.W.i_\b]֮&vUڗh~}|k\u0000\\F\rTO\u0016\u0019RHվ\u0002$ZT :j?h?2p\u0005\u0003$̂d*IRtlM\u001fɉ~\u001b*˸\u0003ѫ\t\u000b\u0016#z9\u000f6|Lѫ\u0018C\u0001W\"75Zu3Wſ\u001eq\r\u000eI~~>P\u0002\u0012F\u0006!t(F6*6\u00161Wc\u001c?Pi7\u0016?\u0000`\u0007ǣ\u0017\f\u0012N%b\u000f&r\u000bkP7v*\u0002# mdnd,F\u0010\rY6\\\fM \u001b~\u000fA-J>glg(셅֟a\u0018\u0011\u0004\u001c\u0010gx\u0004x\u000eAyds:\u001eᵸ|\u0000Ӣ@?\u0018AvvP\tk\\\u0007Xl\b2^\u0004c,q\u0007\u0012s7x9FtT\u0017\t\u0017[W\u0006\u00123;\u001bĸI\u001c>[-R-R-!{\b\u0017Z$:n\u0011_B.ȣ\u0019\u0014y\f1*`\u001edq\u0005&zY}]\u0015I\u0016x9G\u0007\u0007\u000edN^={tD.\u001fN=P\u000e\u001fl@6[lѼYӔ&ݮ\u001a(a{s\u0012:u*-B`3A+S\r2ru'cw֜knվu\u0003e>0ԻMr\u0014u7;Nvyus\n<\u0002Ay_c?|Kg\u001faNRדU\u0015p\u0005u{\u001f$=u3ZY|\u001a\u000b!羯Oo|)\u001b(\u000bf)d\u000f[\u001bdd\f\u000e\fki\\>7Oe vbA[伮H7͐\\p;\u00131\u0006=Ph0&ת\"v\\>G{fcOҒ\u0018ba\u0001\u0004\u0010HHCS:lv6Ř8S8\u000e4\u001b\u000f\r^\u0005x29n\u001aMYv\u0015M*\u0010zb^\nk\u001eС\u0015nU\u001e*,Tk\u0013\f\f\u00016\bC|7(\u0000\u0016Rr\\F3c<7\u0015w6{O;!11z2Y'2|c:\u001dl#*Cޤ.5\u0014\u001aҋ\u0019mZ!Hb!WɼO\u0018)i{+m3\u0018KNzA>8\u0005\nowȮ[ssv8?\u0019s\u000ee07߀\u001f0w\nĶZ\u0018\u001aW7?h#~\u0003|<fA83)wzT1\u0014\u001a\u0010\u0003AF_\u0005\u00155Drdb\u0003WL\u000fdE\u0006\u0003\f7CΦz1\tm<1c\u0014ݙjwd]yVY}}bZcwf\u0019{gwcv7vBxm\u0017\u001b\naj`1l\u0002\u0000\u000bA$U\u0015\u0011JKZ)ōb5n\u001bW\r\"d5M\u001941HCHXEm\nA$iIBhF\b33\u0018Ҫ\u001fs|o5\u0015VeV\t+w`ni\u0018w\u0014;GXVAo\u001bV\u001e:N)b\\>|.caOLc1Iʿ&ZO\u0001xB1S)z2(2-ՙ6\u001d[<)wm\u0016+cf%7\n{۲gx=Y^\bb\u001452\tr3)D1\u0003}Ҭu肗+)QfO P#\u0018\u000e\u0007D\"C'&u\u00037fGƾWI2N\u0006Jh#\u0017Vf\u001fŠVt\\=4n߲]niiv\u001d\\\u0014̘H\u0003Znkփ\u0013pɼ\u001cSLY3UrC`o\u0014j5bW(z')Mܤe\u0013RҹfX\u0015&s5\u0001\u001e9\u0006\u0014{?\u0010CW-Ks*D\u001d\r\u0004,Ⱥ@ʪ\n\u0003aM5j/\u0016Ts-\u001b0Ûh{\u00102nQ\u001cYNZ\u0015\u000f\n֠\u000b6cn8YjV.³!GgX즻\u001f^ D`y3fJ+ʾ_)so[\u001f[^WX&\tտ\u000e\nߟf\u0011\f\u0010A%02\u0016;tzks\u0006p-\u0017dBݙqF٪\\1\u0004g.\u0016\u0010E\u0010oT!i\no\u001cg\u001ekrA'Z-9Iy\n\u0018%;'AA:a+za7\u000f-\u0011\u0017\tG\u0012+f\u0018Eh\u001c\u0010/%\u0013\u0012-\u0018<i̫+~ء\u0011\u001e\u001b7g&$\u0002YW8\u0005~Hx;\u0012Ŕ畩V^Q2ڵihhiG\u001f\u00032\u0019rj;(&5\u0016\u0003v\u0010pM*uM9pI|*4>\u0005ʩ?⯊#g\u001b\u000fboM\u0017Ͽo\u001c\npO\u0018!\"9z!\u0012<CZ\u001d\r\b\"yF\\\u0012^D\u001dʀ\u0000`\u0016{x\u000e\u001ew}\u0002\u0004`0~2\u0001\u0010״ۚ5@HiFq\u000e\u0010c~2\u001b\u001c\u001deF{\u0013Ď;\u0003q\nA\u0003\u0003NAw\u0003Z\u0007(Z\u0013ExskpVAp.jD\r=݋\u0004)Dl\u0005on t\f:\u0001sgãL\u0017F\u0010\u0007fs\u0011DYD\u0002\u0015}QEJD\fIX\u0013\fs{\u0018G\u000b\u001c>(c/\u0000\\EJ\u0014\u0018%(i\u001fs\u0013+J\u0003\nQ)\u0004ӻ\u0012m,\u001cG\u001a?\n\u0012%I9Bw\u000f>d\u0019-~O\u0018y\u0003'<\u001fr7q$C$]_KSUtu%MhcX\"mOc0>e埴U M0㪷&\u0018&J\u00120O(\u00159Z_\u001a2ꃊR\u0013ŴD1-QLK`0Hk\u0010A\u0006^8BTRz\u001a\u0001ͬ]&g˿\u00060\fS0\u0003@:Y5%\u0017pZd-l|%\u001aCձh\t\u000b.`\u000bPi\tEkف=-kX>k48ӎCkʦ%_L{Wt}grwtWovo\u0017E\u0002/~y٦_|zö\fmM\\ʔ7v~噪l[\u0017E\u001c\t&}\u0005\u0012\f\u0017*>*?\u0013[~/PA0L\u000f0L\u0004x\u00008Ј^\f\u001cA\t@\"i4%\u0010GY㵖X$\u0011^Y_G\u0015#\b/\u0017\u0019\u0000Խ\u0019t0I)YH~wd\n'(/\u0019\"(\u000b\u00107O7l\be>\u0010iW\u001c(\u001e6\u00021qS9By_\u000f\u001c\u000bK#\u0001\u0004\u0007e\u001eP\u000f\u0004N|&D\"uk\u000e\u000b$^CGbɘ+\u0016NUwGԝ\\Pn\u0015*-s\u0003g篽&?^\u0018o3ڻy㥓&O\u001f\u000b\u001a\u0015Fs3_\u001dϦ1l@6B\fG\n\u001f\u0013I\b$\u001e\n\u0005Yp`eX\u0001\u001e\u0012m#DD*\"\u0003*/TDL1\u00152BT\u0003B):\u0019n\u0014bm\u0016Ѹ\u0006\u0013B\u0000\fei\n8d#qkkrOe4zس{\u000fʥGODhofs!wMTsr[.\u0016KZ].Waya[+\u001b6|!7u!\u0011\f\u0004(\u0006\\f[1 \u001a\u00027\u0018T*(h\u001dP6\f4\u001f\u000013n7g3\u00100Y\nv:O#eH5\u0004\t`V\u0002\u0002'1\u0005nż9б\u001b?+W:J}} \u001b\u0017\u0007\u001f$_~Qj\u0012q@\u000bD\u0004,)\n\u0001ꑄbi(\u0005\u0018h\u0002a,R\u001c\u001e$x\u0017iyH(Y-\bB2Qq\u0003\u0018\u0017h\u001fT\u000ee\u0006@&\u0014JbКd\"ٸ\u0004Nխݻ?9wtUAn\u001f2\u0000\u0015}\u0005\u0016×G6&j}xw!\n\u0002UA\u0014DJ4Fj18$V\"bPv\fCSv02&X:tԓb\u0010\u0010m\"Nj*X65\u001a[0\u0004{2>{>6ߦH3V.\"\u001c?s0\u001cL<G}D~ę\b3\"wTc\\\u0017 (&\u0001Ĉ\u001e?sVAA׫k\u000b\u0016.̚?4\u0011G\u0014;\u0018IW]DP6thD\u001a\u000e\u000fx0\u0011\u0006=I#8lmek+[[m<lAmAm1ʺGE#\nׁ<rr\nΕĠNAW_>.S{\u0004/\u000fԊV\bD\u0013(vy\u0012<\u0013ԧ)b\rpA\u001b;hc\u0007mu`\u0019C{{[ů\u00190p\u0013L&i%o1\u0004ׄ`\u0004\t\u000f0u<Rd~'O\u0018\"5ܾ>M-2q\u001f'-]\u000f-^IJ}eΏ>|\u0017xeh\u0000&\u0001O&\nD6HUf\u001aD\u0000X\u0007W\u0013p&?Lĥd#JesU6Wr1JQ*\u0012e=*i)MM\u000bg,Ĉ\u0016aHRC?:tlՑ\u001dͿliH\u000f}\u001fOq\u0007m\u00023ٓ7IN5%Q$r\u0011\t\b\u0001f+RgU\u000e*Jr<[Ƴe<[Y9H/\u0007:\u001aCq0g*\u0000\u001cqqy\"\u00005\u0000[sbg\n]\u0014؏xXk]S/CmUoF7\u0013\u0004*S֢]rCOg\u0016$*P`\u0004\u0006#0\u0018QoD\u000eq5\u0012Κq.\bpiɶ՝HMZS'U<H\u0016[0Ld!\u000ez\u0012,\u0014\u0011\b\u0003b\u0012F]}\u001eIZ̬\u0018'\f)r)fYqqIuIu%Q>8\u001b4s\b\b.F\u000e\u0019^ {\u0002\u000b$\u000exsՑuyuDG\u0007/M-x6g%i*w?ﾞ<oy+Vd|joaԎM\u0019LNd\u0013˶=5-u{ZޔfL$Eq2Z=\u001b\u0013\u0007'diLL\u001an4&`i. \u0011\u001e\f\bo$Fk\\\t\u0014fÛ6j$\u000eL$9\\\u000f\u000eD\u0001\u0014Fs])\u00146}::-]?>E6\u000e\u001aG~yM*#hBa8Ǟ4\u0014\u0013\u00112P\u001c\u0006GsVS\u0019Wj;L䵘\u0001uyֲL3vbg\t*\u001a=\u001e~\u0006jMTz9\u001cxy\u0004\\{+W\\j{x{\u000fVNύtOQWrҵ7֛\u000bS\u0005Y_ڶtҗ/\u000ew>F^3F\u0001i~C}O\u001d\u00177}\u0006W+΢fs KHiJ\nHfڮau+5BbjTF5Tiȥ&*\u000e\u0010߁@\"!^6H9\u0004R|^89>x阞A>־R\u0000M_vVS W(FےkmXT\tsCZ\u000ee;6HQjuA*(Jk\u0014\u0015V\r<pC\u0014\u0001T*B*NQ8IeZ'$Zʓ\rԪ\f\u0000\u0018ǭujZ\u0007>S{qEL\\k\u0012\u0017)Rxq&Rh_ܢcЋ>-\u00037c\u000eaO\u0010cW\u0005>|\f9\u0017m\"f\u000b*.V·W\u001cg\u0012A-<K28M+E \n\u0015n\u001aξ\u001aH& xb\u0005_F+\u000bnm\u0015\u0007~\u0015ha猷r=!gJ9}z:\"&k!%'\u0018\u0015\u0012\u0002x@a\t`\nT.VH%?Kk\n;^)⹛\u0006ZˢU!\u0010/yy5v*\\\u00045\u000b\u001f|D;(07A$5VT\u0000UTx)\u0017߽\u001e\u000f&8\u0005c\u001b's\u001aU\u0003\u001f|\u0018qYn\u001c\u001fP\u0003ݡZĢ⁴P-jf\u0012׌c\n\u0013~6%y\u0013Ҹg\u0012'x\u0015֨?y*>0~XPs\u0001k\u001fw/9\u0017Ҳ\u001eoIi\u001fԨ\u0013h2%ǐ\u000e\"EO. e-p\u0018\u0015۟\u0006qR\u0001<_J5\u0001_\u0003<벿\u001f}\u0015mT>u\u001fy\u0017\u0005'q\u0018\u001711\bP`,\u0011\u0006J\u0002g.&A>\u000f\n~\u0017\"sqo\rEJ W\\wL\\sȽ)/\u000e\u0011/\u001a\u0019|G\u000es$d?VGqhYK\u0019X\u0006nVR%\u000e$_͢\u000f,g\u001c\u0019a\u0018[}j\u0003>52<\u00138Ah\u000ept+|\b\u0000-:<c\u00148ȞoяpsΛU`[t.Z\u0013A^A.><r=t\u001e\u0014[ޕ0\u001bi;-uڍs\t\u0000b\\/\\ŵ^\nLOh\u0016;7=z#\fV\u0004~p\u0017C9qh\u000f΍P\fxp\f\u0017p8\u0003[N8>B\u0019bE/N>M\u000be\r\u001c\u000bqhU\u001dn4K%8ɪt9T}tY`]Pb\u0010\u0017B EBPiRXgqv.8\tY&MSg6d%f\u0012 E\u0014d\"\u0004qڜ}~\u0012oLbك/{=9w~﯈=h`4K%[,m(Ng(Zǣ~hlp/\u001a\u0003lp}j\"|VJ\u001f`}<w\u0013Q!\u001a)\n[&h^d>}zR\u0003sXW O\u001fא\u001bO4/\u001eg1{)k>|,G{2\u0016h\u0002;+R\u001by\u001clPTO\u001ffd$;\u001f;oܡ\u0013ǯk9%aNlvJ\u000er{>s_\u0011a\u000bc\u0011c\u0016p*s+H\u0010ܤ_8xBVbU5R\u00133L\"(\u000e -\b\\?>XCV\u0017n\u001f#>\".G_}\u0004o%m\u0017pN\u0005;G[I8w5c>p-I8p\n':\u000fk6\u000bIQv6k\u001b\u0012\rb;S6_6τ&[=\u0013_k\rG,V'̀XO\u001c\u0018L؜r\u0000g\u000ft/z\u0010\u0018\u0000,o΀p\u0019\u0000\u0005&\u0007\u00008s1\f~\u0001>[`Hf\u0000\fP䂧w%(\u001eUh\\43o3v1Oׄ<=\u0003\"a3\u0004΁r`\u000e2~eY_Exu>mF쳛?\u001e[\u0000z.XĹ$;7iI{,sp&u\u0003uyP\u0001\u0003m~:\f*?m0Z\u001a\u001bXӪ;[\t6yqγh[ 6Ao: Τ<O?=iÏEj_p]d|\u0004\f\u0018\u000f[\u0007܉\u0002[\u001eYc.:~;<\u0001Y8T9,\u0004r\u0005[&,`Y\u000f:@-y48\u001f:Fܜq\u001c&\u0004Z\u0012.v[Ӷ\u0014\u001c؝n\u001aG)v|3_MK\u0011.wJmGq\u000f<\u001bկOpLv!ȁ݋⏘\u0013C\u000598\u001c'VK1\u0003[Ū]\u000f\t7嗂!jP4xpqu^\u0011~X՛^?Pn>\u001bӽ\u001f\u001cAǗNYV*~T+$Ǐ[҃\u000eRmsHnN9yh̟B\u001eC\u000fը+\u001aʳ1/>6?q1bkk.\u0013nS8!>+\u001af\u000eN\u001c[4JÚռX؛S;!]py8Ĕ5͑\"z#4װ\u001a*>Zg\u00171\u001fk(L\t\u000eXIv_46@gĢmSЭ~5Xx6}>\r]\"&\u0016I!1z;*[{6<\r7&\u001018'S`\u0018,f2o\u0012\u0016NS۞_\u001a1Wd:j*M%%<>8iy~-1-,\u0001\u0001\u0010\u0007\u001a>5r\u001fY)u,\u0005~ݯ?\u0005/\u0012#e*2fPVu;]we\u001dhe<%\u000bһֲ͇%\u0011VOk⮽\u000fĜ\u000es\u0001y\u00066vV,igPin\u0013Uibep\u001d]\u0001\\\u0019'Ukk\u001aE8B\u0006ln)+$\u001aY˼\u0010_\u001aW~ZwQP~/KJi\nA|?](\u0016.sF.4k\u0015\u0013\u0012h@d59wr)\u001e7\nRx=9{:\u0005w\u0013>\r\u000f\rC\u001d~/QgXMYH!\u00179\\\u0012pLү\u001c\u000fHbZϽ}G\u0006!9:qj<t;\u0013N&fx[U4\u001e\u001a1S\u001dمۃ7Y{\u0013ր\u0013}\u0011#^+\u0013\u001a\u0016t/q\u0019Y\u0014Kq-xy'MEi\u0010rm|\u0005Xc3\u001c#;6E4uU(T3ygI6^l\u0014*4;7~U~\u0007ԧ\u0012hVx\"=\u0002A\u000fH\u000bhRxݩ'\n9H\u001d[cۨyY~,}\u0016n\fЕW#GWUDmIпY\u001fm{/&\t4\tP&\t~?\t׾8\tV$A{#t~L׾<\tڗ>L7fi\u0012\u000bI·c=~*\tڟ$hN!g^͟F8\u001frs\u00051vC\u0014\u0007\u0016RJ@a\u0002<odV}8\u001aaQj\bA[[!)$Hx<uM266_ZZop\u0011\u0011AgR\u0001e5i?#gF\n\u001f5fG`<\u0012\u000brr\t;$Mpj&\u0019n\u000e]\"4\u0017\u0018k\u0011u7=y\u0013/{,x;-\nB߫WJ[N\b3ǷмpFw\u0003\u000bF\u0010={YTyKKBRR罄cQr|+\u00039AL\u0007>dexc\u001f!\u0007\\KmH?;5{:K_}!Þ?Ҧ1]\u0010oq|*/+T;WJi/8.z\u0019>˽+v)+CZ8vyd\u001b\u000e]{\u0017M9\f̗\u0014Z(kYn\u0007\r6RU_@\u0014)ךZ-\u000fo ͻ\bNwOd:j\u000f\u000f\u001c~H\u0016/7{2e\u0019qT,c\u0017\u001a\u001dV/\u001dZreկ=o\u0003ޞ\u001b\u001a1FVZWڞ2|<\rDg\u000bwTo\u0019=#;VθQ\u001f\u0002U]A&8\u0010w7\u001e@\u0003\n\b,\u000f!\"X`(QРVݠ`\u0019YZhcaY\u0014h&$\b\u001eVB\u0002h\u000e\u0012)r߽/w9oTڶ+a\\X\u0007\r6>^qe]bO\u001b\u00154Fa\u001e[S9d:HǱy\f}- \u000bl.Fi1ꍑ\u0005x\u0000\u0017\u000685?U\u001f-\u001cy&8\u0004o6W\u0003s~Dx-),\ri2,=\u0019̑߀\u0019i2v\u0019X\u001cb;.֌\u0004>_P;$XΥ\u0006lڞ^B\u0005D3,IOzwT!ᓿBzaZ0I\u0005[-\u0019RCԯ\u000b)r`\u001fy笻s..\u0013d:h\te\u0019s̙\u000e\u0014OǼP\u0017RߕqTf#ʶdJ~/\u0001P91\u0016Vb(kX_\u0016j\u0013V(A\u0004\u0000EllR4\u0013:(3S*Q{I-ulB\u0017,u>F\u0005\u0017?!/#z\u0004:Dψ~mM!혪g:\u000bǕ՞VTYd:e$_=+M|zel{gaL٣\u0017rvjdL(S}(\u00079s;hnt\u0003+\fS\r\u0011\u000e$~k{:\u0011?nע\u0017c1u%ıPm='Ƣ{1d\u001fT{'m\u00141-\u001dTn&.OcJTEm\u0014^bK\u001aЫ ]*yY1/q;W\r\u0019q\u000ftֺ$ٕ\u001aJ\b7۵X\u001eO]\u0002x67М\u0001@\b|\u0001\u0011^\u0003sy˹`s\u0006_ɬf\"F\u0016y\u0003eX^\b\u001fe(\nTp\n=]\u001ap04\u0007\u0018fS\u001a\u0006S'}hn/\\{Gؿ\u0002\u0004x#l\u0000_gqK_^ߒO/վ\u0011x㺋){\u001eu,ROg\u001dK'BLZ{-;Ziz/\u0018২VmNԴZ\u001eio-})nIO:C{wPj^o,\u001aL\u0016g㛺Q\u00124,\ryGt;\u001c\u001d;HwމУAkhj{ϒ;A\u0007\u0017>^'#R\u000f8d;\u001aL\u0002\bf9 ԧ/.:\u0015\u0001ڃB>W^Jϕ\u000bЮQߜ^;f\\KO`Bֻ/z\tKߔ\u0014%\f<p\\qmb\u0013tiLM9^[UC,U\u0019*{38'kﭒ?J\u0005_n2kW\u0017TGt\u001b8\u0016\brR\"Ƿ}\u0011T+bw\u001b\\y޹I;H)B٢mo\t5\u0014\u0019DRn\u0001L{D5-\u001f!Vw\b3Z\u0006{K3ɡ\"'B\u000f2*WQ\u0016\u00188TX*ʚ#\\p_LuMOAW\t>灿<%s\fџ>ru1eb*>36+3`\u0011\u0002D\u0010p\u001f>\u0005X\u0014\f\u000ep\fa\u0015Ld\u0001#9:\u001eErE#98LS<J\u001c-3v2g S\u00057\u001cYm\u000fbKW0ޗ>沦<`e\nW\u000e \u001c\u0001m4\u0019cWɛ\u0003gn+i$zLZK?G\u000f\u0016\u0010t\u0017ca;g\u0016tM\bUf^S/\u0018\u000bd]k8G6+\\ۭSLgT\u0007k2{k#\u0003-\u000b\u001a-\u001e\u0019))Mj;(JZ&gt;1v<_CnR\t\u0016`Wx\u000bk\tAo;\\d\u0017C\u0017m{\u0005\\׌pg/vX\u001c\u0007\u000bǣظBX\u0006\u0005\u0002/\ne\u00076i?6cu\u00173>ZwV\u0017vp\u001ff-/Uf#~einS?o/W$ml\"D&Q\u0003\fC:~9.j>6~\u0001Cpx/\u0017x/Ю\tGۤ\u0016,ꃳ^P{\u0017{,K]g\u0013n7j{/w\t4DIgܬ\u000buQ,\u000f~Oqd)`\u00191V\rsw\u000fN\u0002Su\u001e8WW~\u0017 o\u001cאW\u0002jOh޼hlsN˝\u00187X\u0006`\u001e6)\u00020v\u0005SRx`\\skZw$\u0018GGx\u001cJ? 9q_\u001c\u0014\u0019MJ\u0006ٵ;y\u0016\u000ft,꓀\u0005i5\u00148\u001a\t\u001e\t\u001eٲ-*s.{)xE4\u0017{^\u0002:xC\u0016K씄AK6L\u0002{&}\u0018j$c`\u0018zn?\u0015\u0019f{^s*OnB}\u0019>zԣY8Wm\u0006r\u001cKch=UQn_h\u000797Ֆ_1樮g\u0006m}\"ϮM\r,+]#ű#uGRw\u001b[;23_O4Y/\"Ϋ\u001f*'}=)ʧ<cI0CdB\u001cSz\u0016\u0001\rzwǾ]Kv8.\u0011i>vORg\u00077<uz4Ikc|<zy}o\tmzJ[ЎG\u0003(uD~L\\\u0007KxSrJw9H)c*dB^m\u001aRTG^mcQ!\\&*H\"\")T\u000fe\r+4:HB\r5Rmc*FGk1e\u0014mS{JѮ5wϾe\u0007\u0001?2\u0007\u001fr\u000ekʷ!0,q!\rn<d\bǯ1{&q\u000f:\u0002s\u000e5/q3\u001d|A9h[e60h[yIqC\u0010ڦLEz\f)\u0017\u000ePC+\u0013SdHQ(~cmj\u0018n\u001aB\u001aY&\u000b#kJѺ<ȵnj\u0019:[uK\u0019cpбX5\f}>In+Z\u0011Tn\u000b^]'t3{JwU\\ߌks;kS5<\u001dZRmu﷫z\u0012\\kPz\rϵ@\u0017\u0019U{D]]'sH퐽C!ЇP\u001bVQw*y]/TW~^`=Ou3I[u]4%v2BzqU=t|\u0007`)8#\\;_ǟg>c\u0014\u0011\u001bJ\u0014vǻo8a\u001b\t\u0005?\u000e=<\u0015ρ1w.PSα7:g`ӌ\u001bix]\u001b8\u0019XV\u0012+EH\u0007b\t\u0012\u0019g9'\u0001I$K`d4@G##nJD|eɋpb\u0004\"vI||9]Y2y5KBT5H\u001a2K]B{\tey;xo\u001au\ndU`\b\u0002ca\u001e\f\\\u0002\u0001\u001a\u0007j\u001d.TyjO\nn?{$\u001fQSh\u000b!\u0015H\u0013|_.1I)Hŵ$0N\b¶%ގ2\tL?\u0014L%L|b|k?4&]!dt.}qj\u0005ހ\u001exToڅ2~4*[zhyJmڱ\u0013evvتS\u001e\u000bcǷ%Zf3PwC-X&x[O@Fqp;\u000f|1\u0000;_))g,I3\u000e-%\r2*PO m\\7bŐ)o\u000frڪ/\u0005'2\u0014Xϐ\u0001\u0017H\u000ft?\\/\u0005>u|!Jߡ#g?Lkhol\u000f\u001d\u0002kzm;y76|c'\u000fX\u0018|`\nԾ'\r?s|9l.r5\u00178[\u0006=\u001cgg\n\u001aTk\u001bĺ\u001chg?\u001f\u0005s.@\u0005e=)N.\u001c)\u001c|dd2j9˖[ؿ2|\u0011:8uRJe\u0011Ls2\u001a+/v;|\u0018biB#J3x+;`\u0018<\u0006oF\u001egK9\u000bqc\u001as7Kѧ]\u0003I4k\u0018\rW%\u001d+ۀP-[\"77H}4۝\u001e2D*/C\u0001\u001e\u001c\u001aM[\u0012:ݠ+\r\\?N+V`ynq\u0014Q=,mYX}\u001dgn\u000e^ˑ2se\u00071\f1\u0014g#WmfDW#F6aov.XOqw\r6\u0000FU)\bQa?񙹇;t/j\u000bVs웝>%5U?URK\rZ\u0011{fџ~?BZm\u001dǒ\u001f yz.ޣ2{5ڄ~r){l\u0019F\u001b;<\u0014FE*>\u0003mi,$^\n\u0019_\u0019c\"\u00163{6GJdv(o,?Rޛxλ\u0006oU<oB:$'5v6(BX=M\f9QZG\u0018tv\rEǧ\u0011%V0aUf\u0018h)l1\n\u001d%4ے+eL@7@.80\u000b\u001a\tJn܋LX\u000b978\f}4.9\u0002\u000fi\u0002G-Udjf\t\"\u001b\u00018lCD]\u0010o|\u0006\u000eT\u0010hJy}'m\u0016h\u000b\u000fiF6\u001aWF4kS\fK;\u0012|\u001d`?\u000e\u001951F7F\u001aA\u0007H<7݃o>Ѕ6\u000f2\u00106§A\b\u001dQ\u001b>\u0011.P\u0004\u001b6x*;\r\u0000|\fm}\u0004!PZh,\u0002@\u00030]\u001e\tqu&tsl\u000ehhe:h\u000f\u0001\u00059\to.U.rc\fD@C3$A@Cfږg\u0001:m\u0018ap+Oh5>4T\u0014?<e\u0014K2:\u0018}LpOsV7]9\u001d+O\u001fH\u0013ޕ~\u0017u~O5\u0007K\"imQLI֑8'Jȿ(|\u001fuQ\u0015a^&5?;4_v͹\u000e\u0013Ξ؇e(~/r9wY\u0005w\u0014U/ΑH8uWP\u001b\"fK\u001cbE+gsʛ#g=\fZpN[KbMf\u0002[\u001dM\u001b,o+=\u0019ϳ{m%zTr\u0002^9_3\u0016ݯό`N9& |\u0017\u001fkv\u001dֹ͛W9c\u001d̺q\u000bwR~;m\u0015k_UWW\u001c?e!HLȂy\u0018\u0012\u0003/\u0017R,4\u0003\u0005L\u0012\u001aD!{Y\f$1\u001b\" h\u0007)a40LZ-]`\u0010\u0013[Bdv,8%0\u0016\u0004=(\u000f;sss4nc,\u001d0gOϞ\"k\u0016D8\u0013'i\u001d\n[OpG\u001bdw\u0006|H*liKh-Xvߝ\\ܭR\u0011l݋\u001f76\u001c,ڄoP\u001f6\u00156DˈP̳5\u0007k\u0018i1osi(m;s\u0013NL\u0018{7)\r\u0011:\f޽\u0002\u001cą7FQ@Է\u0012:ʬpQ\n;;2k\u00001bRI\u0015W6vr\u001e`ܵ*Y0>\u001fcobܷVq\u0006H1j[{DDR\u0019w2㮀u\u0005\u0015ܱ\u001f\u0014h\u000eb{~c^\u0017]Ҏ[3\u0006kr\u0014\u0018/h4UN.\n;^CC_Q)O\u0003\b\u001b4\\\u001c\u000eqvG&\u001a5\f\u001eS\u0006ZGq\u000fP4@h6\f_s\u0001\u0014\u00126;t,-k0Ι2(Kb\u001d\nu\u0000^ܟO[\u001d߸{<~e4!lD(P\u0018e(\u000bc;\u000b6O?c})l}\u001d翟\u0006\u0019q4\u000fk\u001c}#\\\u001c\u001a (-sσ\u0011\u0005WÈf\u000eu\"*3?ǸR(_fG=hG\u0002,\u0014o\u0002\"̦dmg[iڶ\u0014SEA\u0005`թ'v;ѯ8΢\u000flr\u0003}ʾh\u0001\u0011\u0010{A!C\u0010\u0002\u001f\u000fs}S%婅\u0018\u001f\fm\u0004U4eҽh\u001d\u000ejkz)\u000f\t!bM\u0018}o젍\"a=V\u0006X{j\rκ17}zEl\u001fG<{\u001a\b7S\u001e8Lqb͊_,7h~,AU\u0013TLǙx\rH&hn=\u001a(Y\u0000\u001b+'.\u0002W\u000b\bYM\f\rkx1|\u0007_S~Bs\u00129ֺöp\u0010 |+O}\u000bs\u0003u\u0000e/\u0004vz>x\u001e\u001f\r?\r~soEk@ئn_ן/zf\u0011P\u0005R0\u0003<\bRl^\u0002\u0007\n\rfB\u0017h\u0005tI+P\b@\u0006\n*D\n|Pk\r`\u0002&l/Ν;f.=N\u0015\u0003\u00144UAY#>\n \u001e\u001aa<~:fTRU\f=:]Y y\u0005o\b~\u0018GKAWhG\u0010s`\u0011Jo\u001e:\u0014BaSs.m\u0005Z]M6)llnI\nQmQ=,\u0013A鏲?jmw\u001e25-(\"\u000f\tnN)%\u0013|\u001c(\u00068\u00167\u0001%\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$\u0012D\"H$G\u0014^u7y5rJq牌X\u001cE.E\u0006H\r\u001a/$njBLC]\\Eķ\u001dP~UOںKS\u0011k.#l\u001d\u001a`o\u001eH\u001a\u0003jA\u0015 m\u0012&jdYZh\t4\u000f/\u0015#j̱\u0010\u0010JA\u0006d\fS\u0010@j\u0016 e\u0006j\fRZȚ[\u0007\u0006YovΥoA˼\u0015\u001bMlC9jhDY/-G;JNC\u0006\"\u001566S)k\u001fҞ*\u001e\u000b/MD\u00029\"G\u001f4=r+ȭ:#\u00006qJ+J\u0005yH\u0002\nw<\u000f!.\u0011hSt׶)fZ~\u0016XQ/1\n%W#/t\u000fl ',USV\u001631\u001fq1+lYNᴒ\u0019PuChԻžaBO\t\u0015\u0019볂gb4ݵ)Bd\u0015b.cH\u0019V`ew(\u001c%Q(َ\u0012(h\u0004f\u0006,/<s,ϰQ\u001f\u0013߱|,ayoX\u001eby~X-{\u001b,װ|jXa9Jϲ\\\u0019KXV,b9e\u001e\u001c\u000e\u0019\u0001l<2<ޛz\u0010\u0016',Z\u000f-\b1\u0001>!~iSrKkO@TBjSB5=Ԝ\u000b&\u001e\u0002f4^\u0013\u001b\u001a=Jѯ^^Bw@3K?\u0015\u0015oS7O?C\u000fː<63s)3\u0011[&R>,mD\fP&P'P޷.\u000ej%=vR8\u001c%p*±L)\u00178c\u0006N 4-e\u000f$n\u0006:|YRO>\u0018sb!/nx|0|sת/p41<\b>>;+\u0019xb}f/\u001eӁ\\ee׫\u001e\u0004p40\u0000F*\nu\u001bw\u0013/jB\u000fD6(]>IfU]\r\u0017h2ǌ&V\u001aV/\u001b<8%\u000b\u0006bKu\r3}N%{\u0003/G0^\u0018\u001cy\f3p\u0000\u0006nON\u0011qҲym\"\n\u0002ul]\u001bmj\u0013ҒWLڏi\u0003\nCc.̥x)\u001e[퇊\u0007}\u0011\"\"\u001f'/\"^\u0015ObQA\u001dۙ7<\u001e4KU;y&RRxaE/&\fUKnk\u0005g\u001c\u0012r:\u001ffn;;7y7\u0017'(imw`v7\u0002%\u00113\u0019Wݏ2B\u000bVض]Vhev[FwYz,\u001aH~pp$\u0013\u0007tRz\u0005,j\u0013\u000e(bSfEBeGyUkt`;\u0004}|\u001dj(\u0018z-~!n\u0012oON+\u0001\u0014`\u000b\nz\n%ڂm.;mI\u001efk,\u0018`Kdw>EawcBg\u0014L&_%\u0015&>OƯ5~\u000f\u001azP\r\u0006\u0003Hۢ\u001a^^f/b6F\u001bS\u0010mH5\u0011h\u000bl\u001bBZC]*\u0002\u001d\")EBEh\u0011\"\"\u0012!a\nЅ*w\f9\u0019M4RpVvs\f4w?_\u001c-\u0003\\,PT*\u0015`#R(\b\r\u001e)V`<\u0013Ad\u0019PIsxTj*ȴg\\j*0G\u000fH,\"᯳y=Qّ\u001b\u001b.NW@MT 8J:6T\u0001ߚ?FVl{\nyў\u0004{]Zu]ZOO:oBߘ;ϪFeXIߛz~8H0/ʭ1rȱ1b2S\u0006GʊtR\u0005{\u0018 v\u0012i\"E :\b\bA_3~-\u000b|)>\u0010q\t\u001f}w6^2.y\\yC\u0017I,\t\u001c< $~JS8&\u0000;ǘ\r\nendstream\rendobj\r29 0 obj\r<</AIS false/BM/Normal/CA 0.149994/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.149994/op false>>\rendobj\r30 0 obj\r<</AIS false/BM/Normal/CA 0.75/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.75/op false>>\rendobj\r31 0 obj\r<</AIS false/BM/Normal/CA 0.600006/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.600006/op false>>\rendobj\r32 0 obj\r<</AIS false/BM/Normal/CA 0.399994/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 0.399994/op false>>\rendobj\r8 0 obj\r<</LastModified(D:20210217080731-07'00')/Private 15 0 R>>\rendobj\r15 0 obj\r<</AIMetaData 16 0 R/AIPrivateData1 17 0 R/AIPrivateData2 18 0 R/AIPrivateData3 19 0 R/ContainerVersion 12/CreatorVersion 25/NumBlock 3/RoundtripStreamType 2/RoundtripVersion 24>>\rendobj\r16 0 obj\r<</Length 6057>>stream\r\n%!PS-Adobe-3.0 \r\n%%Creator: Adobe Illustrator(R) 24.0\r\n%%AI8_CreatorVersion: 25.2.0\r\n%%For: (Deborah Steinke \\(Adaquest Inc.\\)) ()\r\n%%Title: (SecureSpringBoot.ai)\r\n%%CreationDate: 2/17/2021 8:07 AM\r\n%%Canvassize: 16383\r\n%%BoundingBox: 189 -163 907 370\r\n%%HiResBoundingBox: 189.200000000001 -162.799999999999 906.4 369.6\r\n%%DocumentProcessColors: Cyan Magenta Yellow Black\r\n%AI5_FileFormat 14.0\r\n%AI12_BuildNumber: 220\r\n%AI3_ColorUsage: Color\r\n%AI7_ImageSettings: 0\r\n%%RGBProcessColor: 0.456457018852234 0.813199818134308 0.920128524303436 (2018 Az Accent Light Blue)\r\n%%+ 0.920583546161652 0.920527696609497 0.920049607753754 (2018 Az Light Grey)\r\n%%+ 0.46007439494133 0.461062669754028 0.479712784290314 (2018 Az Medium Grey)\r\n%%+ 0.000136697562994 0.000626976019703 0.000423457007855 (2018 Az Prime Rich Black)\r\n%%+ 1 0.99999862909317 1 (2018 Az White)\r\n%%+ 0.129986360669136 0.445850402116776 0.726806282997131 (2018 Azure Blue)\r\n%%+ 0.236153483390808 0.236566811800003 0.255690574645996 (2018 Dark Grey)\r\n%%+ 0.000136697562994 0.000626976019703 0.000423457007855 (Black 2)\r\n%%+ 0.179979398846626 0.462396830320358 0.736700236797333 (Blue_R0 G120 B212)\r\n%%+ 0.409569054841995 0.740749299526215 0.271493822336197 (C=63 M=0 Y=100 K=0)\r\n%%+ 0.140570238232613 0.228389471769333 0.369380712509155 (Dk Blue_R36 G58 B94)\r\n%%+ 0.314972579479218 0.316238760948181 0.315570443868637 (Dk Gray_R80 G80 B80)\r\n%%+ 0.091186039149761 0.294841974973679 0.142633497714996 (Dk Green_R5 G75 B22)\r\n%%+ 0.420979827642441 0.163003876805305 0.163110196590424 (Dk Orange_R107 G41 B41)\r\n%%+ 0.231519639492035 0.180468156933785 0.344297498464584 (Dk Purple_R59 G46 B88)\r\n%%+ 0.15625861287117 0.295185625553131 0.278966635465622 (Dk Teal_R39 G75 B71)\r\n%%+ 0.417058706283569 0.298082679510117 0.116508431732655 (Dk Yellow_R106 G75 B22)\r\n%%+ 0.184054657816887 0.183923989534378 0.183081939816475 (Ex Dk Gray_R47 G47 B47)\r\n%%+ 0.950031340122223 0.950571954250336 0.951177477836609 (Ex Lt Gray_R242 G242 B242)\r\n%%+ 0.825643837451935 0.825728356838226 0.825046956539154 (Gray_R210 G210 B210)\r\n%%+ 0.087854735553265 0.488841027021408 0.244210809469223 (Green_R16 G124 B16)\r\n%%+ 0.456457018852234 0.813199818134308 0.920128524303436 (Lt Blue_R80 G230 B255)\r\n%%+ 0.902908980846405 0.902606844902039 0.90034556388855 (Lt Gray_R230 G230 B230)\r\n%%+ 0.634132742881775 0.803362786769867 0.22698737680912 (Lt Green_R155 G240 B11)\r\n%%+ 0.96799248456955 0.571453034877777 0.302267283201218 (Lt Orange_R255 G147 B73)\r\n%%+ 0.750997543334961 0.62407773733139 0.795579552650452 (Lt Purple_R213 G157 B255)\r\n%%+ 0.383294492959976 0.77460241317749 0.746525645256043 (Lt Teal_R48 G229 B208)\r\n%%+ 0.985468208789826 0.931368708610535 0.098425082862377 (Lt Yellow_R254 G240 B0)\r\n%%+ 0.198228940367699 0.626832723617554 0.853943288326263 (MS Logo Blue 0-164-239)\r\n%%+ 0.452200442552567 0.453015387058258 0.453602612018585 (MS Logo Gray 115-115-115)\r\n%%+ 0.495243519544601 0.732984900474548 0.258101493120193 (MS Logo Green 127-186-0)\r\n%%+ 0.941280007362366 0.318401783704758 0.143657401204109 (MS Logo Orange 242-80-34)\r\n%%+ 0.992564618587494 0.721914350986481 0.075717739760876 (MS Logo Yellow 255-185-0)\r\n%%+ 0.452235966920853 0.453031748533249 0.453614801168442 (Mid Gray_R115 G115 B115)\r\n%%+ 0.839141070842743 0.246982112526894 0.150924161076546 (Orange_R216 G59 B1)\r\n%%+ 0.067681893706322 0.04779689386487 0.000422788783908 (Process Black CYMK)\r\n%%+ 0.498164772987366 0.384476751089096 0.667927801609039 (Purple_R134 G97 B197)\r\n%%+ 0.179979398846626 0.462396830320358 0.736700236797333 (R=0 G=120 B=212)\r\n%%+ 0.117666229605675 0.204310461878777 0.395317435264587 (R=0 G=48 B=103)\r\n%%+ 0 0.359070867300034 0.632889628410339 (R=0 G=91 B=161)\r\n%%+ 0.544235765933991 0.714890062808991 0.883899092674255 (R=131 G=185 B=249)\r\n%%+ 0.513725519180298 0.725490212440491 0.976470589637756 (R=131 G=185 B=249 2)\r\n%%+ 0.075604505836964 0.278736382722855 0.484454840421677 (R=15 G=70 B=124)\r\n%%+ 0.64721405506134 0.870470345020294 0.953004837036133 (R=156 G=235 B=255)\r\n%%+ 0.642324209213257 0.229330748319626 0.52513062953949 (R=163 G=58 B=133)\r\n%%+ 0.777957618236542 0.915737092494965 0.970759093761444 (R=195 G=241 B=255)\r\n%%+ 0.800496399402618 0.799609839916229 0.797849893569946 (R=204 G=204 B=204)\r\n%%+ 0.798178553581238 0.45651313662529 0.687045991420746 (R=206 G=116 B=182)\r\n%%+ 0.860582053661346 0.57353013753891 0.750373005867004 (R=220 G=146 B=191)\r\n%%+ 0.833908259868622 0.503820598125458 0.711137890815735 (R=222 G=127 B=197)\r\n%%+ 0.104216925799847 0.540755808353424 0.701586782932282 (R=25 G=138 B=179)\r\n%%+ 0.198356091976166 0.745098829269409 0.868122339248657 (R=50 G=190 B=221)\r\n%%+ 0.210439950227737 0.090880148112774 0.215629070997238 (R=54 G=23 B=55)\r\n%%+ 0.288159668445587 0.608493685722351 0.835312724113464 (R=68 G=156 B=221)\r\n%%+ 0.456457018852234 0.813199818134308 0.920128524303436 (R=80 G=230 B=255)\r\n%%+ 0.349100857973099 0.155945926904678 0.370944648981094 (R=89 G=40 B=95)\r\n%%+ 0.410890519618988 0.61349219083786 0.828449487686157 (R=94 G=160 B=239)\r\n%%+ 0.000136697562994 0.000626976019703 0.000423457007855 (Rich Black_R0 G0 B0)\r\n%%+ 0.008390481583774 0.522869646549225 0.46064430475235 (Teal_R0 G133 B117)\r\n%%+ 1 0.99999862909317 1 (White_R255 G255 B255)\r\n%%+ 0.992564618587494 0.721914350986481 0.075717739760876 (Yellow_R255 G185 B0)\r\n%%+ 0 0 0 ([Registration])\r\n%AI3_Cropmarks: 189.200000000001 -162.799999999999 906.4 369.6\r\n%AI3_TemplateBox: 306 -396.5 306 -396.5\r\n%AI3_TileBox: 187.8 -166.599999999999 907.799999999999 373.400000000001\r\n%AI3_DocumentPreview: None\r\n%AI5_ArtSize: 14400 14400\r\n%AI5_RulerUnits: 6\r\n%AI24_LargeCanvasScale: 1\r\n%AI9_ColorModel: 1\r\n%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0\r\n%AI5_TargetResolution: 800\r\n%AI5_NumLayers: 2\r\n%AI9_OpenToView: -142.5 556 0.914581246177587 1842 904 18 1 0 69 91 0 0 0 0 1 0 1 1 0 1\r\n%AI5_OpenViewLayers: 77\r\n%%PageOrigin:0.5 -793\r\n%AI7_GridSettings: 110 25 110 25 0 0 0.658823549747467 0.745098054409027 0.874509811401367 0.829411745071411 0.872549057006836 0.937254905700684\r\n%AI9_Flatten: 1\r\n%AI12_CMSettings: 00.MS\r\n%%EndComments\r\n\r\nendstream\rendobj\r17 0 obj\r<</Length 65536>>stream\r\n%AI24_ZStandard_Data(/\u0000X\u0004^}\u0005\n/Ў#\u0006\u000b\u0003T-5\u001a>[@%h\u000bRLI\\ъ%\u001eFA@\f\t\b\u000f>]m55\rm4\u001aJci8\u001a\u0006ar\u000fr>\u000e\u001fw\\y{=\u001eH8\u0007Z\u0012乺UvB\u001anTʴK\u0016\u0018\u000e\u0016\u0018\u0003X`@\u000e\\P\u0006*&\"\u001e\r\u0017\u0018\u000e&(\u0013J\f\u001e@Lx0$``0p\u0012\u000b\f(DHx@\u0002\"\u0002\f(X\u0000bD$B\u0002\u0005\u0017\u0015\u0005\u0017\u000f\u0012LD@A@\u0004\u000b(H&LT@\"r\u0001Q\"2a\u0002B\u0002\u0017\\<H\u0010AAQA\u0004\u0005E\u0005\u0005\u0016\u0015*D\u0002\u0005\u0018<TPxX\u0018p\u0011xb\u0002a!\u0002\b\u000b$\\<\\\n\u000b\td\"rqX\u0000BB\u0004\u0003\u0004\u0018PDD,0񐨠@ q T<D@\u001c\u0000a\u001a$\u000ePPQA qBBd\u0002\u0016DLd\u0000BBD\u0001I\u0002\t\u0006\u000b\f\n\tL@A\u0005\n\b\u0013\u0010\u0014*DH\u0010A1@\u0004D\u0004\u0013\u0014\b\u0010 \n\"\u0015**H&L<\u0018\u000e ihx\u0002#B\u0000\t\t\u0014\u0012&\u001e\u0011,\"Q\b\u0005{T\"\n\r\u000b\n\r\u0015\u001a*P4D&@X\u0000b\u0002\u0005E\u0002bႋ\bD\u0003D\u0003\u0004Da\u0011iD$4D\u001e\u001e\u001e\u001e\u001e\u001e\u001a\u001e\u001a,\",0 Q\u00110QAqA\u0005\r\rH@\u0002\u0012\u000b,\u001e\",\"h \u0002\u0003\n\u0012\u00114D\u0010A\u0004\u00114,0\u0010p\u0003\u0002\b\u001a hX`<\u001a\u001e\rKã@a\u0002h4\u001a\r\u000bFC\u0013\u000b\tD<\\\u0010h\\T<T@dA5\u0004\u0007\t\u0015\u0014\u0013\u0014\r\u000b\b\t\u0011\t\u0013\u0011\t\u0013\u001aLTh\\T\u0010T\\pPA\u0001Q\u0011\u0005\u0005.\u001a,*L@HXTaAa\u0002aBDÄHEa\"r\u0001\u0006\u0019\\pA1\u0011 \u0001\u0002EDC\u0004\u0004DD\u0002\u0013*2BBC\u0017\u0018\u0015\u000f\u0016LD(@QaA\u0003\f$LD***Hh8:Hx!TD &4a\tE$bBC¢aA\u0007ȄȄ\b\u000bH\u0005\u0016\u000f\u0013&\"\r\u0017\n\u0016\\\\@\u0001bq!H#\u000b\tD\"\" *Phx@AÄ\u0007\n\u0014\u0017\\TD0h@$B\u0002\u0012\u0015$T@Hh`BE\u0002\t\r\u000b\f\u000b\b\u000b\f \"\"\"\u0016L@C\u00022'\u0014\u0015\u0015\u001e\rZN\"\u0016xЀD\"(L@XD.(*Tam\u0005\u0006\u0006\u0015.\"\u0014P`\u0002Bb\"\"!ALx4\u0002\u0003\f\u0001\bC\u0004$\u0014;Lh?z>gz8W\t\u0013 * DHdHn\t\b\n\u0010\u0015\u0011D(<H@\u0003\u000b\u000bD \u00140\u0011 \u0002{EurڤNR/޽C\t%7u3(\b\u0006\u0011DJ\u001ed Q\u0001\u0001zQ!\"2EBC\u0005\u0011\u000f\u0011\u0004\u0003l@$A\u0002\u0005\u0011\n\u0015\u000f\u000e\u0011^<`q\u00011HD\t~\n.*\u001a\u0011.2A\u000bD ,\u0010ciI !Iu\u0004D\u00057Ɛ Y\u0000\u0006(C\u0004\u0006\u0012\n\"\u0018\u0004\r\u000b\nT<H`@Q@\u0004&(  (D&x@\u0012J $wW\u0019BB\r<ُtUVYOkJ_bWMSZތCq}\u0007JB\u0000!Y]\u001e4<-dyJ\u0011\t\u0000Bxٯ,YUP~Eܳj=P\u0012\u0007\u00134H*w)i\u000bϙeMYEk'kP_kVeE\u001dJX[K4z\tti~\u0000!z0Aʶ4QϔCvwI$y\u000f$,JiW=*5:TԽNGditvi&;˛\u0011\b\u000f\u0004\u0007\u0010\u0012L{Nxh6\u001fNӺ\nTųսVwMp7軦c^R~_Kiy\u001a63\u0001_-$խMdWZ\u0001\u0004h'ۢQRtGw@I(\u001f@HΉ*K\r-GwK4\\=c/\u0017H4끒\u0001\u0007\u00134HꉵD\u001eY7FZDdJI{6\u001f(>ujd;U\u0011n\u0015\"@I\u0000BB\u000f&X+I.\u0006\u001a-I6\u0011\u0012\\Z%_b7\u0001\u001a$\r\u00125Mլ:\u0011Qm\u001574T\u0019Rڪ\u0015\u0013II $\u0006\t0YE{֕|\r!9{\b\u0013 \u000e _&ev)\"Y\fw`*ae:/Kgծ12+YLCi\"Z%\u0011iˀj,'\u0013l{<^,\u0012\u0013>{2dP\u0001T\"{QWw\u0013U׊h\u0006J((P8$\u0014\u001cAbXXZKU)bWtL+R.\u001d\u0019RlT?]*%*\bNxuǫ}/mejyNuyi̤\u0017엻ti$yCHJ]2*$33FvwPrxnZI\u0005!+/).\u0016bf\u0019iUY\u001bݍ֨hE¢=^IWi\u001cJ2\u0004 /)(|U=ݝOS\\\u0010\u0012r[<]ii^vҗ\u000bBR\u000b%DgڷFWu\u001e\u000e%VUeوnJ\u0013\f<\u001a$GZTnVkh\u001f]\t\"`Yڮtho\u0013KI\u0017ϴRε\t\"D<D*ß!j\nO}iQ$x\b\u0004\u0011\"\u0011\u0018TTz>4[<+C\u0019~\rg+_I|\bI'\u00100P\u0011봇k\rMvjD\u001eJ1K7\u0012Br\u0013D8̽\u0019=l>\u0012cF\u0012BHH'C\u00054TT)l~\tS6kW}D\u000fB6A\u0004\n8\u001a$w^rڢb:jZ5Ԋ\u0000\t\u001f4 \u0007\u0007H\f\u001f,\r\\YYCɹnIϡv}]JBe\b\tM\u0010!R!BiYn\u0015Q\u0019)\u0015\u0016U6wӕPw|\u001e-\u0015\u0011VJk3ZE**؜X9`&E\u00124/\"/ .X-m\u000e%@\u0002\u0004ID\u0002B;M[(ׄXHDCw\u000bD$Q\u0001bB\u00006ںf97?h/\u0017\u001fJړ\bA\u0002/2\t%Ŭ:4\u001a'H\b%\u0002Cr1\u0011 d\u001a$h7ij\u0012%Y6Pr:US><@ y\u0004E\b\u0007\t\b\"$\u0004\u0006\u0016\u0018\u0003\u0011\n\u000f\u0016\t`U\u0003\u0015\u0011\u000b$* `B\u0004D\u0005%B\u0019\u0007\n\nH$\u0002\u0002\u0012 hLLD\u0010`\u0001D\t\u0011\u0014\n\u0000\u001ah`\u0001A\u0002\"\u0014\u0014\"\u0014$\u000fX\\LP@( !BI.@\u0011\u0011\u0011i@p1\u0011pd!%y\"bHb\"\"QA\u0002\u0006\u0016\u00188|6ٜB3$\u001a\u0004\u0010\u0004HK614C\u0001\fL@4\u0002\u0003\f@XX<X`\u0000$\u0001M\\T\rJ\u001e\\<8&( \u001cx\u000b\n\n\u0004D\u0005\u0006\u0014D**HP y \u0012q\u0001QA\u0003\r,0\u001ch8\u0000\u0004F\u0004\u0004ɅEB\u0005\u001e&4\u001a@ P`\u0002\"rAArC\u0005\u0005\u0011G\n\nHU\u0004\u0005EED\u0001\u0011\u0014F\u0003\r,0h^\u0003\u00134x\u0010\u0011\u0001A<PAq\u0010X\u001ah`\u0018C\u0002\t\r\u0006\n$\u0000@\u0003\u0001|:\u0005\u00034ҭi&4;C]zn7df_UQ]mth{iw\u000f\u001e,0 w)H\u0005f.\u000b\f\u000bU\u001b~\u001c5U$Q\"UI\u0015!Ԇco(S\u0010ç\u000eRȡ4VtEYkXÎUV$.\u0019=\u0003(G9ājh}_45چ=?\"EKA\u001eceKq.\u001cb\u000e{4LiFTJ׿6j-KuZ\u0017\u000bHWWi]\u0005\u001d]`4XY\u001ev\u0005%\u001fh%J(qLWʳ9/υwhjS-*\u001bjI':\\\u001fkUGiis\u001bu:\u001dYK\u001fR44fJ|ttTڒ[V(\u00025 P[`8P[`8xT0T^IliY.+$\u001931\t\u0017ӌy\u0019)5I/mMY]:3㮹wxD);\u0015Du޳6}\u0012u\u0005\u0007.4ei4{Pv\u001bg[9.{y7\u0001|u׺\u0014\u001a~pʂ\n.H;0d@.j\u0007(Ը2u-0\u001c\u0002R\b!z@ZĈ7\u000bܵ\u0010W˿b\r}\bu4z\u001f:SSSڽ̪,\u001b\u0002C\u0011XxCVk.K\u001f%)u간Jx<\"Uq\n\rYJYF\u001bYӧxygUjj]b}lKDy+>N[W\u0006l K\r\u001fd/0\u001c\u0017\u0018\u000e\u000fu@ \u0006ƃ\u0006)B\u000b\f\u0007{%[Zё_gԟQE󑷔rgWJ6\u0012:tGCELT]\\%^oz-{Q<c\u0015mPrdӦG732ʺm,bs\u001bʣ \b\u0015 \u001cD\u00153C\u001e\rp\u0012ı(2uBKG]CG5\u001eCy<\u001e\u0005ӜJ.0\u001c8]\u0005\u0003u<\u001aC\u000b+\rEq\u0003\u001f@He] Ӕ\u0007p8\u001cš8\u001auC\u001ds@tK\rZA\u001bIIJjV\u001aF6\u000e}좋\u0010\u0018 \u0010\u0004x<\u001c\u000fcy(c\u001f?Q\u000f?\u0016\u0018\u000e\u0016\u0018\u000eT\r\u001df3=<e\u001d\r^}e4ёK0\u0011v\u000b3CIOӭ\u0015ݞPzvwG|\u000e%屻Ѯ4]CS9)i-mM$I4wvu5\u000f<\u001eԠ\u0006䱎]v\u0007\u001e{\u0003\u001f\u0002ACQ\u0014EY\u001eRK9Q\"3\f!\bR\u0012\u0012Ii(F5ܸ:p(p<\u001c媪\u0005F޵uu\u001f^N\rǒ|i8v5W*C\f\u001d\u001ekjh73\u001b\u001e\u000bdy|\u0002z*˭-\u0014MujXG2-Ӳ\u000eeB\u0002Á\u0006\u0003^:=ۈֲ(?m-*sW/\u0017ɹd-Mʲ$S.\u0010\u0005P\u0016%T0ͬF\u0006G\u0015P\u0016e\u0015hE\u0017]Tц6tUUOOJJ\nG>ґv\u001a\u0005r\u0010\u0012\u001a\rG\u00066PA\u0007B\u0010d<<\u001chZB\u001cF.Nkrn\u0001i)V*]TLS8X\\`8\u0010\u0010MI3ѝEvjSZej+\u001fR%^#$;mTGrݴ^7X<PH4\u001e\u00066nYqTpA]p9/@\u0014-JBRm\rb+y\u000b\f\u0007F;a\u00079 c!\u000f\u001a\fMȤ\u001e\u0004\u0005t\u001cw\u0003@rY]agڙFcZgv<\th}*bYԜJޖ\u001aN/ZR;eX)G5rqZ3ֺeTt543c\u0019NOx%3]_aVO\u0002\u0001^/C\u001dCZzM]\u0018b*k[\u0010(d!܇\u001a\u000f\\N|nL֊t\u0017ew(cn/JJw.ImyS}ǻgi3]EWt42/4)H{eJp|6{e+E_\u001aRjԢ]Nw%PbUe^oQ\u001e\nf\u0011$t<\u0016\u0005pH%t$$I2YZ\u0014[\u0010t,eY\u000b._l\\t\u001b^\rUTEm1=\fbt_o\u001c\u0015\u0017\u0013Џs\u001cDy(\u000fš4*r),Xԡ\u000e}C!\nQU!-ȻS\u0018)4F\rm<  \u001dv{{{z{Sq\u001cUg:H\u0003\u001bx\u001ap\u0003u\u0002Á\u001d(9́CDe\u001bY:0\u001cBT\\lq庸g{V7OI6\u000e%|uꇉT4zO:Hg+]{j֪\nQuWK~\u0011-i=YwHƻ#]a֕oDڢ4QQA\u001ev6v`!4 =\u001cG\u000e;\u0016\r7V\u0013}eR|\u0014TRQe(\u000e@\u0014Zb˗[pE]\u001a,8\u0014p@\u001c\u0007\u0001Y \nDi,q)飃8l]\u0005\u0003\u001bB\u000frB\u000b)Ԡeq,\u0005\u000esq\u000et\u0003lC,\u0005brRB\u0017$LH<LL$`á,0,45\t4Ĥê~vtU\\kEyꈷoRW{$Mi\u0011\u0019e\u0019)\f\u0013kѧzWiYi\r-0,\b\r,0(P\"4\u00109K0qR\u001bJ\n\r+k5\u000fmB3\u000buayo\u001fZ`<р4 \u0014S>\u0002Jh)eJjKRN)U*e4\u001c$'\u0013k&q!Ɇ2nvJR\u0012)i.,MiW+S%K|)[\u0012.a.^\u0007sѧěUTT\\Mot7[_Cd\u001dƦC{\u000fU84\u0012\u001aRz\u00075˟TJԅrR9K{5UUVO/=Z.-\u0012ծ1Pִ[#έ)wCN\"zGw:w)'3}{\u000e5E]\u0007uw?V\u001d]˦lSG2\u0012*$zKSKffsm̮>C\u0007](I8KңN:΍7WD[\u001d\u0013lO\u001b\"w\u0018nwsޮ1\u0014έplklsw\u001b[nm\u0018^Ԛckk;5{֛Wv4hVsT\u00188OMi.5tuP/u9ڜQksk\f\u000eWT])]LMѦdg1=S%\u00064V$9oNx\u001aMqn=/KO9Yy:sƬA^n'\rI8ϝSss_1s^s{je)S$nl5Kv4e,s\u0006O8/vefl\\fe\u000e籃\u0012X׹\tun\u001amow;۫cs:51uy<'oyÛ\rqw_c8;%|<tv\u0012wf\u0012~lhJFvO\u001aRҤ\u000e\u001am6hgfc6`W\u001a\u0002Ʒ\u001e\u001fz|J\u001b$0K aH_cQ\u001eTs6h5\r^g=[j\u001dٺ^qHV/=gMV8kQ*POEZ8KKUgΒ\u0012ч56&?jhV٨'m\u0018Ҙ.\u001cf҅FA#C \u001bovlq}ƺ\u001dU6T\fTe#R@xѣt6ǣU4-w𖬼%\tm\u0018$j\u000e.I3\\ׇN/\rݖfs^DwDCH{oIGw4UU6d*:+\t*\u0001\u0001ϢfvQ(z\u0016)i\u0016)Mx[^B\u000f\r=T\u001f5\b\u000fv\u001e*\\SZ^=9VKRVf8>:M%..U-sgmTOktCesy\r\u0015ӬpҎ\u001f*,R\u0017YP\u0014\u000er(n\u001cQ\u0005F\u0000`\u0019\u0019]`γlkV\u001an<V\u001amސ \u000e'ʹf:G/]9ilNjjD47WIIZ\u001aͽ:G3GUGm(ΒҐyTɬۨKSI٠9:sFETűA/4̟h2q瞦s_̹J]阯99:gƝَbΦlG-d.'S+Sr2F\u0017'F\u0011's7u:D\u001dZ\u001aҢM5\u000e-gCz\u001dZco\u0007t;kN\\\u001aJ,MksMgU1*sԅ9FMUGӵIq&5gVwRt5K\u0011iڸ*WM-\\әnJRR+~u)u:m\\\u001f5\u0006㘺<W1-ϵ<U֓(:UsCڟn6+տB?\u001c\u001bUU\r՚CUY\u001fXk\u000fJǚ\u001f)6.qQuSj\u001dZfM3w8V\u001a\u001a\u0012\r{XڵCT4{Roɼ\u001dҤ\u0015ѭ;|$\u001c]\u0018G\u0016>\u001c]\u001bĝDI$IT'l(Gi-ѩ5Jd̤\u001c$$\u000e^$\"Me@IA$k\u0012O\rhf<k\fKSjBһY:s5qT,ݫfcGF繖f\u001d˵SV}\u000eD=B;ĹYߠkjT\u001eo>6f\\aT\u001d6ew\u001fLyPwƹA8˜8Omr;SYunlkuJ;]UZo4KXYR\u001aT!ki 67+Kͻ\u000fr?hA#\u001d<\u0012I<Z;DS)Lߨ%h.Nn{Yd譍̣j}|֝Ts'Ouhl\u0002C\u0002\u000be#\u000fƘuwc4XmΗ<xU.2^[^sinwGХf9tm\r]lf9f]|\r?cٸ;2,4\\vM91$gwesc%N\u0007hwӮ^\u001dqO9ML+\u0011'\u0016\u0018\u000eY;G\u000exc^cX`H$歩ZKnt\u0005\u0004\fH1!\b< 9@BN.P2\u0002$Ȁ\u0001\t-0,\u001a+,0\"\u0016\u0018\u0017`@B\u000bFB\f\u0007<\u0001A!<IĨQ֔7 wI;tv$JuU\u0011i6F֪ˬ[kۺ<׺OUugMέVNf\u000b>k\u000eƬ7z$ͨgXOG\u001d;[˧Z^Zڳ`1*J%%\\J֬L{|)\u001a|Ow,6!\u0013Y.&\"Y\u0011F\u001bMub~O\u0011/:#֡9\n7i\\C$$\b\u0010M=i=tsig{ʎ9Qg\f\\<<:Bh\\c\u0018<F\u001b\u001f?t[j$Ay3¹͕̈,L@Cfe\u0013&\u001e\u000b`@@d\u0017\u0018\tX`H %&ݤ[zs砸z_t%\\W\nuQ\u0017+NOtMnNUMWUUSCiD*-*.\u0012\u000e_[]\u001cUݥsU.>)ɻJ[[v'--\u0012-&ҪjZjҪ\u001a+uUMDMtnf:1\u00113%0\t/цx)q\u0012TRmUӛU=US=9==f&j:(**ՊYd\u001cDteffNbfff&fjnfRڸ6:q\u000bt,L;CB\u001fa\"9 }\b\u0011\tw:;\u001dP>zt5K:\u001c̷vwٝ\u0019\u0004$:sۏtt\u000e$\u001f\u0012_shMN\u001bo%kk\u0012i?4۲5\tZ\u0011-!B\u0007RK%gCTTKmҝ[ֵ֗D9x\u0010%\u0010~#\u000e\u000f|\u001b=T;\u0011ޞIkoYUw}^~xxxwg~7fvv'auv\u0019^~+_oј\u000eUW~cvoڮ}5_7kt8_\u001dy#~\u000fh<|^yO\u00103_qSӽ#*ף^o?j$ʔffffffe\u000eff\u0011Ijmlf+;̆\u001dV\u0019cSffffv3Zgv\u00189<CCL#3ڥ\u0000fZoư[ʺwh<޿?D\u001bЗcM<k**uoc\u0016t{',2\u001a˄EN6<e\u0019\n(XGtqi6Js\u001a٢-?4\u001d/mqe=^<[RRDUTDLDLLDDěsCDT#\u0012!\u0011q\u0011\u0011\u0011pq\u000f\u000f\u00150KrsXSh-Dup\u0010Մ{S_:&/O]\u000e~?|ݹ琶KKۥ\\SOuuu[KCMx\u0012tI7{WoҎ~wP:ҽ^3ٜvLL4LKWMg5[ږ9Lm<L-S]l[smvȔ̻V]׮jmjo\u0014K}9Yve}+RJZu*WeU=UʪL\u0017$\u0015\u0017^{v͝쪚z%}+B_!bՂu?|[h3l*1wTYm.ST.2\u0015QklWjJJt_//TkʊlVki+_t\u0017\n|W{t++2\u00166dʬ\u0016-iWv*ku2+k\u0018*kAkITZ[Tdd٘MFȷ3\u0003m\u001a횚\u0012RMMm}kVk氆ktt/{?KUߺ_طV==֡/&U~Jy\u000eIuҿƠ\u000b\u000fI\u001d.)Oz5Q\r7L'e>[{ΟĤ{\u001dGO&I܏^#YYA7{zI}>:Izk\f7tIu\u001eӺ:)ڝ:T\u001f\u0019Κݞv՝SvmgGvwG#+pȘGKwV9yKy<=3S)~\u0018~7I:vjf5Ivhƀ;<[c8[cл[c \u0010\u0012!!Z\u0011ψHc¤B\u0007$CZOn>I1\u0010cJJHBEH̏\u0011=FE3\u001a\u0011\u000b\u000bwpmv\fxtP#\u001crJGU%9<T9C9\u001d*\u001e\u001e~h\u0010Aq\u0015\u0014\u00165fqiq1u\u0016Kj]RTRTR%%ŬQQT$D\\\u0014\u0015Ь5g#-\" -..YD9B$$&IwTHHHyGO:ΥMe.It:G79IGJJt\u000f\bE\u000e\"#2D3\u0000\u0000\u0000C\u0011@\u00000\u0010\u0014E\u0003\t>\u0014\u0000\u0005\\N@ԃC\u0011`\b\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000P\u0002\u0007TI\u000b[\u0010*\u0019%\u001f`܊\r,\u0002\u0001Lmt&\u0013o\u0002sJOH̠\u001d\u0010;̍0TB\u001fګ\r͎ȴr\t5k7TLc\u0018\u000f\u0011kje,*10Y\u0004@՛?˗qB\u0003\u0006\b6Y\u0006z \u0000:+X!Ƚ[mAtDa\u0006_9+w\u0019\u0014=H4鍻^=l\u001d57Ң\b:\u001a@\u001b\u001aP XR!dT)\u0014\u000el\u001bT\u001c\nHp\b\t\n\u0006rL\u0000#f_rϰDwi\u001a&h\u0003NA ЀT\u0003\"\u001a6\u0006ɵvH!x\u001a\t7?jA;_\u0007Mh@KTʥ\u0019˭\u001f䒙IdxA7-ju,\th\u0018͉\u0005\u0018=\u001aKhO\u0013\u0015)iK4\u00170\tP#$i\u001bU\t\u000e\u0015\u00188?(q'ƌT\u000b(,\fOHx\u000eOFl\u001fftkc\u0011\b^<K\u0012\u0001g0r\u0000;\"|\u0017<EhnQ>\u0010*h\tt=(\b\f9AYLJEم,)XQMZzqhvoz70J8O\nR\u00157wq}Pĸ[k\u000eSn3OUCD)6<\u0016'\u0006r\u0013\u0017\u000b=I|i`T\r\n\tYa>f\u0011\u0010\u00047[eV\u0004]r\fv\u0005\u0002v&u1O@,&~\u0004rl5\u0015Q\nB\t+\u0006\u000f#238\u0018T\u0019\u000bjza\u0004fDZ\u0016JF\u0011\u000f$Rw薿1Jl.\u0012\u0000F6\rm/\u0013_4^Q9\u001eTFy!O\r2DɁrȂ%\\ֱ\u001e\u0000\u001bd\u0015B.G\u00073ru\u0001,DVD)hۢSJEpཡ(j*\n6T>eo*\u000foc@Sfp\u0005\u000b'aU4r%\u0000.\u001d=vM\u0017T/\b\r\u001feD׉tVd\u0014Rl7<Ҫ)aqBΔ{9l˫SMI-fDcT\"\u001f6 H%J\u0004@m~iXS0\u0002\u0010\ry\u001fdq\u001e*T ȫ\u0003\u0000YE8WAU\u0015\b\bW\u0012>BG\u000fmp+\u0003ꋗb0aQ'y\u0010QI\u00048fB\u0006\u0007 8\u0012\u0018|ո\u0018R\u000bl\b$^a`Bl\\\u001a'\u0017qU>u\u0012H\\1\t,Bh\u001fHm={\u0007\u0006o\bH\u001fN\u0010ꤡکD \u0001\u001d\u0002\r;(D@)P\u0004-Kԡ\u001dO)Ivlt,:\u001f\u001ePU\u0005\u0003\fa+\u0012\u0006|kȣ݈\u0018\u0018ue\be\u0002UW׶#\u000b\rX>*\f0R)\u000bFc@Et;_l[wOl6I\u0010-s%%!oF2\\=-\f>~m\u0006[lZ6\"8jNn\u000b\fWvD$fO3\u001e\u001f\u000f\u0005n˯9(\u001f\u001b\u0010z\bVPl\u0017q\u0016.?\u000bL\u0010K>\u000eɡ}f,j<(~I'o@\u001a*m\f3\u0016\rLZ\u000f!U*\u0011\rҲ\naW\u0000r\u001f\u000bv#kof箼\u00010a-Ŷ'4r\b̩.W\"MXe\u0016H%~`Ĺ5\u001db:\\m蜢z\u00038hfV)SU\u0018\u0013\u00057\u001e?\u001f5P74\u0017\u0014\u001a0[<\u0005\rX2wp<!NIc\u0013bSD\u0011ݖK͚~\bC\u0005C\r1\u001a\u0018m@J\u001d ')p\u0002\fgq4\u0004p\u0002PaM)Eׄ«`9cJ8siE)ֳX:\u0003\u0010\u0019N5tDzQ\u001f_RZ51p|_,J+'Ptn\b֨T\u0012%<jлZhxN8W\u0006n\u0018`,e+Q\u0001\u001c$\n5)!\u001fI\u0004){}\u001d\u001e3Jg-gg6sS+OVoT}\u000fJh\u0003G! T;\u00043\u001e|۸X@*|t\u001fSR\u0004~~έ\f\nh\u00181yA)`-B\"\u0006]R\u0015: <HM#Ơ\u0015j\u001dށh\u0010w\u0017%;ZYHԐ(*\u0010l5j\fJW\u0011\u0007\u0017_\ty\u0015\u0015\u0004[+WhX\u001a\n\u000bUX\u0003m0@q[I]誧Za\nY\u0005.Țvaۇs=oINP+\r\u001cl\u0012ƈǖ\u001dQFv\rOldAm31\u0016fL\u0018*K\b\u0004\u0012Ռ\u0005^Ó !֦zh݄\u0016Ϛ_L\u00126:GG\u0015\rO|q\u000eB\u0010˝ry\u0001\fP\u000bq2mՇ\f\"Es\u001e&7~\"Ic\u0001ᡆܕ#)S\"\u001fl4\u0000\u0011HfJS;H\u0018S$<\u0004s@ݖ\u0014\u0013\fX\fx\u001f'!Xf\u000e-&\u001b3=G:\u001e/u[텼d#Z\u0019d\u001a1\u0010#ĎH\u0010\u001arS\u0015a\f'$&\u0019(,|A_\u0015\u0000f#\u0007:[\u0002lA^D\u001d\u0017\b\u0015\u00059)Ki>c\u0010\r\u0015c1ܮ?\u001c\u0017ÁzH\f{\u0011bD\u0005\rJ\u00078\u0015CgP\u001a{XG1K\u0000[\u000e]\u0002d<0\u001c\t9\b>x+\u0018Vj\f\u000bM(4솬]\u0000\r\u0001\u001b:P\u001e|.Dbֽ\fa\"`D\u0006A\u0018x^#X/Ϊ]J=\u001e$HCѴH2(^9L\u0016QBѥ3\u0004~˗Qv^\u0010!\r\u0010yml:!#%n+3*\u0003!&N-T_zN\u001f\nQ\u0000\r`d\u0001,eth&9e\u0017$c?\ry{?Us*\u0004_]E6sJW\u0016\\\u0018Az5\u001dh3`\u001a͐FjOi,\\ճOPfU\u0002@Ud+Gia[,[8)\u0014[C5օCp\u0017!bG\u0000\u001a\u0018}Ͷ\u000fڍd)\r5\u0000\u0016\u00170Qv!\u0011L~ƍ!;k:5F\u000fvW,G\u0013i\u0006\rFRUMa\u0002\u0007?)G\u0019Q+\u0017)I\u00038}#\u00017\u0003+eX~NWp6xz5h\u0010<\u0010G\u000ehz@+G\u000e]w,5uBnwEe&LK2_Cf(q\u0019ƭ\u000fh\u000f\u000fq\u000f3m5B;h\u001ed\u001e^gqU\bR ,\u0016-\u000b~ꦓ\u0007Ns\rv\u001e==[=Dص\u001a*<H`>&^2w\u0004M8\u0015h=%\b5\u0001}S*D|2y+ms@\u0017ۿSR\"\u001eI,\u000fX{\u0006?g9V:yV5,Ir\u000b%H\u0013[c6G\u0005\u001a~9\u001b\u0000v\u0001)\u001d^\f:4H<չ\u0012'*\u0001\u0001IT*r\rA\u0011jdO\u00044RD}@\u0019\u0000\u0018\u000e \fkc \u0017C+v\u0015\u0018_~4@~XEjFv7<|;azh߯P5\u000f>CZ\u0011$\"uҏ8z\u0016!ͪT-46{\u0007\u001ak\u001f\"8t\rjT\u0004hU\b\u000f\u0004)tߧڱA@\u001cb\u0014\u0019V\u0017v`?\u000bJд\u000eB8r)b\u001f\u0005\u0017nI\u0018,\u001f&649&\r:{c\u0016aߔ\u001bD\u0000'\u0007l\u0016ROtʃ\u001bk]kEOu\u0000\u0011p,s\r\u0002\u001d\t\u0005T?ϊ`WXB%.\u0017G+m3mZ\u0015\u000fQV%{s*r\u001f\u0000&\u000fuI\u000fJ-^pz\u0010sW\fEBy\u0001&^0\u000f\u0003\u0006OA9$ڗ\u0007\u0014\u0006\u0002}\u0000s,w\u001bj6[qAJ_!$ÒzF(p[\u0000g'\u001a\u0005\u001e@C\u000ej\u000fCYu0Dl&͠\b?Zc\u000b9p 2\nxH\u001b]$A1<)\u0001F\u0011\n\u001c=Y\\R\u001aV\n?Z^I65p \\`MHXK*Akm\u0017DP]\be>P\bAÀHlP\bEE>\u001e\u0016E\u00042X\u001a)FQg*TwP.&3]t\u000b\u001b\u0015N\u000ez+kQag\u001d\u001e;C\u001cκ>9f \u0011_\n5ΤS \u0010 `\u000e^T\u001cKeUʨwȺ,{3=*\u001d\u000fB D\n\f\u001f<8Z'ڎ\u0007C\u0001_c\u0001Wğ\u00134\u0011R\u001a^Ɍ?\fm&h=Oρ4Ƣ1!8t6\u0006\u0017[\u0004K+Jo\u0003\r1mBecZ/-p̪/]Qi1\u0007\u0005H\u0003\u0006#6t8ƾ\" fnExƳ,rvS\u001a\b\f)\u0006f͒ue֠[(rA|\u0015-\u0004\u0005)w\t8/=9u*qDvRa/\u001fX}y\u0019;A/\u0019Z*C\u001cM̑Н׀f}Mn\u0002|͸E9XՒ6\u000f7fjR\u0003=9Dfq@\u001a%d\u0003ȅ.m!\u0007\u000b9}ݼ{!\u0018DDP\u0007\u0019\u001cW\r\r5w+|\u0016x8`!z0G\u0007ܬT]౔w>\u000b?T\u0013[Ϫ.n\u0002\r7\u0015E*>\u0004O@\t\u001ftI\u0001X \t,]u\u0016l\u000e%;Cj6b(\u0006ّ~EɅ\u001e˭\u0003Zg*a1Ω\u0003=~S;&+\u001dU<ҁt+˦݃y\n\u0011\u0011\u000fE\u001e\u0005x4\u001b𫍈zu\n2a9<9dpSORc}Sx;6=.OY\u0016UXe$t\u001a\rIJr'kDvI\u0013bӝTO7yC?Q\u0012/z%uQRić:9R\u0012:HlxDLK4]%\r\u0007iĩM*QUN\n\u0006\u001aL7J/Q1ܽegD%\\!(LM4\u0015#o\u0017\u0014-\u000b\u000f.BRf*nCo5\u0014nS9sH\u0019Y\u0016G\\~\u00101\u0002\u0012E\u001fS2Wڈ<ZkgэMPSl;v9d\u0010\u000e\u0010\u001c\u0004\u0016B1\u0006J{\bAt\u0014{P=\u0007 FYҪ2˜ \u0007X2\u0007.\u0005^ ;C&;8\u0007?\u0012D\u0017.\"\u0010zJO7\u00041\u0017&m$$ԧjČ\u000e\u0014cc'F\u0004{H=)˰d\u0002~kv\u000fZvc]S0p싫[30\u0007G9\\.t0R.ENsM崶w:z}\u001e'ު?T#8e]\u0010{񜏜V4]%\u000b)-b\u0012`\u000b`WTƼ+clGo\u0003qkUG&\fӤHu((3*R\u0007\u0014*U8E&\rO\u001b\u001e!]\u001fk<\u0011\\)j\t\u000eAm\bZ\u0001\u0019\u001cJ\fG\u001d\u0006\"\u0007,΋L>oD%\u0004Dؿ \u0011|Z̸oԫʳ(%\u001a5h\u0001>\u000eeVxyCH҈ʩes5\u000bTb\u001e\u0004QO'\u0013N^\u00143y\u00018mU&\u001cg{\rR5_m\u0004\u001f^Y[wn.\u0002\u0001Ap\u0014f0Yap)7H\u0000Fy}XџǼfN0k=+\u0005p\\趰;f\u000f\u001b2\u0003c>\t\u0002*2bN\tAiy\u0001A-vޚ2\u0010\u0004ˮuUD8EW\u0002\u000b\u0006uHh+W[f5_\u0012dR \u0013\u001e%6\";\bL\u000fV\u000bgQ1j\u0005\u00125\u001dDuam^Zj?p4pE,bI&\u0017\u0002^i\u001c\u0013(-a)\u0005b5(d6x(\u001eA\u0003\u001dm,\bp\u0004\tI`B\u0012W\u000b\rqި\u0001|;3|dod\u0001W\u000bkam}xRv\u001a\u001eH}l\u0012\u0015Pe\u0014\u0017\u00069\u0016Y(\u0006U]\u0000\u001c)ݶvc'uDv\u0017\u0019y2Z \u001a⑕\u001b\u0019\u0007Xa+jgk4\u000bli#$_\\Ӗ5Fb%T6Zٖ޶iw\u001eRP,)P\u001b\u0018K*\fR\u0003q5\t\u0004)pvukDg\u0005k\r\u0010\u0016ohVqc\f'ٴ'0\u00138\u001f!L%uP\u0002@\\YMpmC(LȚ+\"5\u000fg/P&)\u001aڮ\u0015M#\u0006\u001doJY\u0012.\fC.\u001eˤR\u001f,e\u001b\u0002d,=ȍmޱ\u0015ND_\u0012\u001eCL\u001at}no`roc\u000f\u001fn:ӜH)pH\f\u0015/:Ys9l\u001b\u00172\u0006J\u000bŀl=f0k9VcNv+.!h*Jk)\u0019lt\u001cktdxlfTx asDE2+DG\u0015\u0001F]qe\b\u000e\u0016ݣ̱nz\u0001:[f0ߨ8qZ\u0019˼9Luݘ\t6-8g\u0014b\u0007\u000eg\u001d\u0017RCRH\b\u000e\\@I\u000fd&d\b\u001fZef6u\ft2L\u001dKW;\u0004\u0012TTy\u000b<Ll:\u0004#5DV\\5J\u000bGpah\u0004xE,uT)%\bvߚG\u001f|xg>\n\n-2~jе#\r\u001e^=\u0005wn1JӀF+!\u0005\u0015UlU\u0000\u0000\u0013V\u001d\u001a}N:\f#'\u00039\u0005!)P\u0012HfE]Wݪ\u001do\fd?\u001bkn\u001cgs\u001emKɪ+Opی#@1PR\fu8=9hw\u0005\bs\u001bzS=\u000b41ф`}û\u001b:!\u0004\u000fhmV+\u0005\"!+\u0003{*k\u0014~}~0G;8>;3\u001em\"RR\u0003%k̎r\n[\u0003\u0000?0>\u0003;;5`,;\u001a>\u0010JYe\"\u001ddK/\u001a\u0000\u0001z@\u0001\u000fRj\nbjg/\r̚8T\u0001v:J%\rTs:FPףU\u001e%\u001beB\u000eXs \u001c,\u000fZ\fF`WT\u001a\\D!`G\u0017iۓz\u001f\u001f4\ru'\u0017e\u0011\u000b\u000f,P\u000b@t#(\u00130\rH\u00102dC0u9up^\u0005}\noVW)\u0019[4\u0001<s.#.\tID'\n^\tvP[䌞:~ӣJ{\u0010}\"h*)6V\u0014҇.\u0011aZu.oP\u001b&Й:x\u001e\u001f]`\u0014%G)S\u001d_EI؀#\u0010\u001a֏&8R.ӑ<t|l\u0011Ad芀0v_R\u001b\u001eo\u0015\u0001\u0006z\fޮ0\u0018JzL(|K\u0018\u001bKjk^hc2giݱ,5\u0019c\u00031l.=#[\u0012\t\u001e\rA9\rmNLOMxu\u0015w'^9Sɴ\u0014$D\u0013\u0018d\u001b kfd0+;cdI4y\u0003ĊGp卩\u0002֡ƒ \bXs\u001e`Y\u0000d\n*{\u001b\u0019\u0004)\u0012\u0010k`\u00135*PU\u0012*\u00017!\u0012VڄD\u00185\u0014Ԯ\u0014G\u001e̳i'ߌZF\n+5\u001b\u0002=J=\u0012zߒix\u0014\u0006k]tpSU\r2E!X\u0018Xnd<\u0012FWa'\fevBj@\fy[G75Ӂ1욌ߎ\u0005h.\u0018lBv)ʌKBِv[rdC\u000e N\u0011H~@Πto״G\u0007/w.8ϫ\u001a=jeirXU\u000b\\s\rp1q8Ψط\u0006\u001cUL\u00132:\u0002\u001eXHRhXȹT\u0018ꙎK\u001eh?Z;kK1}\u0006On$\u00023\u001b\n\u0013,\u0011F8͔6T\u001f_zʧ\u0011\u0019\u0007R\u0016<mZ\u0001xF*\u0019\u0002C{\u001b\u001e!$wZyQ\u0003\nyPS-g$1<pF(\\)A\t\u0016Uf\u0004c~\u0010L%\u0001g>!x^\u001a\fQ /H\u0013V\u001f\u0007r\u001cEV\u0003\u001ajx9Q!\u0014tB\nAt`C]\\\u0015tS9\u0011mhF\u0012Ԁ:\u000e)pAQ\u0019q=Ě\f/ıC,Q\u0011Bľ 1<\u001d-j\u001ca^P>jI>{;G@;Tx\u00043.!2\u001fŖ'xșVߡ\u001c!\u0003I෈vϥ\u0012H3\u0002!@'\t;5?vj\u0006\u001cn\u000bd\u0012[Ϩü448CVa\u000b͊RsZE\u0016cGήؔTj\u001fMjo\u000eaGx\u001cw<XYS.x߮\u001a\u000f%\u0001}61Y.llX~ ,Ǧ$|Ͼ\u0018v\u0013u\u0013\u000exL'Bf^qͬdVPH|H:\u0011\u0016_CUhn:`\u0003o!\"\u0001\u0017 .Z/@{\u0012\u0001\u0019!\u001euh\u0006%A5Px&ө$TX\u0012_\u0010\u0018T6\u0001ѨyR>ޟ@@Ec2\u001f\u0015y64d\b\u001fV5`\u001d\u0004Z\u0003uetv\u0001r<g藝1U}ymiP\u000e\u000bT\u00066=Ѣ`\u001e=pc\u0012taMTpS\u000b\u0010A|0<yPݷ2,x\\dR`Xnh\u0018L\u001a\u0000\u001frȧEQ\u0014jc\u000f\u0012\u000f\u0015\u0003\t˶\\݆\u0004\u0000\tYנyp7f\u0000mp¹WkΫ\b+\u0011\\0\u0018#:o:\u00043g<6?LKy+bcFӠ\u0012C\u001ar~Y0x+r\f5\u0001\u001cJh\u001b[12\u0019\u000bR詡X1.\u000e!K\u0016\ft\u0016\u0005c\u000bA7&\u0013\":\u001dS\u0016Cp䍖gvtu8w>\r\u0003\u001fcT#\nr\u001fP\u0013N+vQ՘\u0010G\u0006n.D7\u0019/<Da3\fƿ[9k-\u0004\u0000\u0012h!`4ߴB~eU=Y\n\r-*\u0013+MUn$!4\\\u001b\n\u0013X\u0015qhaË,,֥BT\f\u001c\u0000G,XK{&S*jX?\u001en,3)M:Lϓ)\u0012X׊HjfZC\u0017'?8V6IVTJŭQ=ݍ\u001b\u0004p@j-s50o΁ߒ\u0002[\u000b\u0012/:+\u0014\u0004L¿B BD`!0\u0016~\u0014f|M:\u0007p/G%ך\"{|*\u0007\u0017܅\u0015\u0007Ă1J>O[JE\u001eK\rN!\f \u001bV\u0011e,ʎ\u0012b\u0013iRr{\u000e\u0010vY\";׼Q]~~$OR\u001e=D56)?L-R&$ՁMp\u0014ں/hi\u0019D0_\u0006V\u0017HzIT\\\u000f\u0006*\u001b\u000bh\u0003IΘf\u001bG͐Mn\u0012b\u001bNq+D޶-/\u000e\u0004$\u0004\u0005V0o~\u0018\u0005\u0012k\u0011D8i\u0013\u0005+ى\u0012Tg\n@\u001e\u0007*˦Wc@=P#\\\u0017TX EŬ\"L\\]?\u001d|Z䇂@\"\u0000X>5Rz`\u0001D\u0000v\u0002ѐJ2\u0013u\r\u0001+e\n\u000bh(\u001f\u001d\u0016\u0013sI\u0012\u0010V\u0017\u0018\u001d\u00188\u0002,\u0001,\nd{Is\u0014б\rr\u0012X!0側?'`]@sĵo\fb\u0019G5fa,\u0018d\u001cU2MEQxǂBˏ\u0006C\u0004\u0017^M\u0018$ܒ_hh \u0017^/\r\u000b\u001bB\u0017Z\u000f\u001f\u000fCw\u0018\u0012f3\u0011콈Q\u001e܀N\u0007#%\u0007[Fn%<E<V\rk2\u0016/夒WM:ԂqHY7Vh5~$Kj@nlN5e+O%\u0003\u0007I\u000f/5e\\T;]d#\u0014ɼ\u0003z1;T#\u001cw\u0016ٸD&O,$;׃5iά\u001fֲ# s\u0003\"\nE6\u0005٦O;\u0001bpzvH,1\u0007\u001d'\u001dnsy6ǅ\u001c\r>\u0014( B TW\u0017u,A\u00006Bnt˸7G.<\u000eQ\bLATq΀]GD0\rW1+Dz\u001c\t~f \u0005kuKVlΔ\bLZU9ǻ\n\u0018s8|UVذSgW\n)cSN*\"O\u0010C9\u0003Wt#P\u0003\u0002:BR]\u000bG5\u001d)h܆\u000bޫ~\u0007R\u0007$\u0006@\u0007}XXJ~tcҢH5L<\nO<7z4vUM\u0000ĽYքrm]0AUa@\u0006y\u001b\u0019~L\u001eYDsvF}\"ACn:=\u0004\t>f\u0004\u000bwB\u001403\u0004\u0019\u0019kvB\u0002n\u0011$\u0019\u0014'dM\u000ft%\u0000A|Ji1#@Ȳ\u000b9XWgv^~:d抝\u0013nUB\u001b6j\u0001\fx$Ґ\u000f\u0012#\u0012=\u0016\u0017<YWL?=\u0003\u0005\u001a\u0015YԚ\u001b_\f\ff\u001bK\"du G32-hu!v\u0000\u000f\u0001j\u0003Dl\u0014,\u001a퀱~\u0001)\u001a\u001a74:~ HI2Are.?dH5Ij\ttg62P}N8\\yV$-Ư*\u0018Bn\u000bI\u0003&\tQQ\f\r6N<O@<\u0007ri/^d;+ȣ\"h:\u0015!\u0001;̝,h\u0014\u0018\u0000v1\u001a\u0017V\u0004c\u0004\u0001(\r\rv=ʅU\u0001ef7@L͹ߌ1.\u0017&@\u0010:\u0013^Nzpű1ן\u0006Cf\n%$NuΌ#\u0006[\u0002V02f{\u0010\u0001\u001cx\r-d5Hwx\u0010\u0003^7*\u0006nJY\f毩rx\u0007sQ\u0005e\u00011\u0017i\u001eQe\ff_4nł\u000f9\u0012Jo۵&(0Tl\u000bN\u001aҪ&I(U N\u0011N|\u0015rFVdX̽b\u0010k \b\u001e蔛Q\u0002ȾOx\\^-pw\\Tۏ4+?(iA'ݒ-a)\byC~g!4;w%-`ѮFv\u0015\u0007=\u0018dlQI-7\u0000usv-ѱ>rl+\"2\u00112'\u0003UP\b2z\rܔ[$|3!Գ\u0019yH\u0010zUW?9\u0005\f\u0018IT/$D\u0006Ǆy󠀾\u0003֪y?c%AY\u00153*$g-ŕfff\u0006*[\u0018_kb>X`\u0018Җ\"eiJ\u0000\n7\u0007\u0011\u0007\u0015\u000eQ\u0010A9KnSM\u0014Cl,?\u0016#\u0013p~KiVK\u0007UY|^}Mꍿpu-,r#\u000eOj'<b\"[V\u0012\u0001&\u0017n\u0000|H9\u0011,tV\u0018SmV;uH~\"\u001fա]\nq\u0004/\u001faN\u0012&P04r\u001e\u0016\u0001g=)-4[а2záESuE\u001fY{a3J9De\u0019\u001d:d\u000eF9枡Tv\r\u0003zuʘY\nNa4\u000eF/^\u0017\u0004JE۩\u0013\u0016\u001fQu\t}8GiyyV\u0018ÈcFܻ{\u000b kUDB;f\u0012))\b|IY\u000e\u0013t\u00027I(iW_f\u0019!P\u0018Y`\u001f,zu˖Y\u001a\u0010[үMI{A$A:0Ejq\u0018v\u001fd.v>DW4B&\u0017X]Rm\tĒ\\x\u001aq\u001b9V\u0004\u0005{CZ_{1m!FskT#w\u00007\u0012\u001cXn\u0000\u000e\u000fp\u0013\fͻ\u0014E\"xEO6\b\u001f-kЎQB\u0001RP]M\u0018%m&\u000fo\u0001G\u0007>N-/Y_}\u000b}},ccr6d׹ +v\u0003V@d콑\u0016JI\u0000\r/\u000b\u0000UX\u0004~QǠj-`;u\u001f{y<D&\u0010k_xhA\u0002\u001a׾\u001d2B\u000ehآU$LJI\u0007\n\u0011\u001d՝nQ1<o\u001a(i*e@Da`F\r\tJ\f Q<F;\u0013V\u001d7M\u0000hTǍ\u001d+\u0006l\u001a\\\u0004iʍJ\u0005jX:ZTpM\u0015mdUH#܀ɥn5j-Gvrr5q7\u0017\u001f+;\u0011~`Oq#Aj%Vۧaׄ\t\bt;Rj$\u0012y>;0ȝ\frtX8\u0003ڰ4+E\u0015\u0018\u0000o@bİeuѹt74\u00128\u001edep\u000eo:\u000f#pi(UQ\u0010VPhwTr%\u0013\t[h\bc\f\u0019䂻6Ì\u001e<|/6-\u00127?N7\b\u0012^dg.~y,\u0013i\u0013s\u0017{vp-<59DT (am\u001d73_\u0013\u0015T\u0015y\u001a`\u0015gO*!ZtKP~Y\u000e*Su)gB!Wq$\u000b\u000f\ba\"KڐΫ n,0m\n,\u000bI)&it\u000e\u0015oOCdN(\u0012\rdK\u001f-\u0002@{ZT&Z`C\u0000˕?.\u001b\u001cgYmEY*Tŭ`<\u001f\u000bdyxz\u0013w08zvQ\u0005$em)9?2eL\\c\u00101\u00026aĤ+ܶ]u'c;f\u0005\u000bB(5^i6JƙWQTw^%\\.+,h\u000e\u0015QݫǦ\t#p\u0016$W\u000fM-\u0004M\u0006a܊\b4۪% \u0016+[ń\u0017,+\u001e5#ycL8C|ݪjݪHp>=\u000f,\b\u00198<\u0003ݸH}#@ ,sVC\u0001X`\u001c6+R`1p㔲\u0002Cd,\u0006h\"39\u00166\u001dw\u001eD\u0004\u0011\u0000\u0018i)i\u0010HN\u001bR\u0011m%\u0002\u001b\b\u0015BA]eB`\u001aoL$\r\bpj^\u0011n@fՃ\u001a\u0001,^F=܃L\u001e\u001cP*s׶b-Y55qna:̒\u001fוsCkBo7n+yϫW۝6&6\u000e泹\tB\n;2\u0005Ň\"5E,MfO{2Ɲh@\u0002nP('\u000bg\u0005\rw-LVH9v$\u0007.pj~}33oZ\u001d\u000bTY8:hW/\\>/\u000b\u0011\n[y8ծLoIZT0GXQ\\\u001f\u0007Q~\u0011-uj\u0016nSOo\u0001J\u0001\b-\\\u001d!\u0002\nxfj~\u001c\u0000ZN\u0000ܭ4\b\u0015#Q:\u000bz~\u0012ܼ<QD\u0005\u0001Y\u0016\u000f`|#e0L0[okmsi5\u0011-\"u\u0016Du\u001f=\u000b=\u0011[i\fa'1Fm,\b>Ӧw#.YaVc|[%*\u000bh\u001f4}\u0002~k\blZ|h?RB\r~\u0003\u000f\u0005ةX\tap0V]?\u00046\u000f9\u0003W|\u001c;\u0012.ܯJ\\t6\t\b__{+xŕ)N\u0015RJ+uy8\u0012L{\u0004(jqϠdSXTa]dfd<\u0016\u000fz$\u0002j\u0002:\u000eWSh!8{2(MrbrYc1R\u0007\u00024ҍɊU:}MMN\u0006\u0018\u0013g\rL]:\u0004;D\u000f\u000e\u0002&R?\u001bW\u0005\u0003\u0006;\u0007\u0019Ӛ\u0001=1 L]\u0000P#cb[f3Ҹ\u0010O؈\u0014\bGp-7۔\\\u0011\u000f\u001d\u0004;\r\\\u0007ȿh䀖\u0018°Ii \u0003\u0017uџ\u0004#X\u0019Q!<mTelLq\ru\u001a(Yӹ\u00063\u000e.gJT/^m~T?\u0003i5_\u001e\u0003\u001dl\u000fUL\n\u001c\u000e^\".\u0000\u000fd$.Z.7'\u0000ʲAۉBw\u001bQh\f\u0007[\frmTh\u0002ܨQ!\"\u0017ia\u001a\u0006a.0K\u0004\u0013Rx&r\\$BV\u0007\u00186\u0004eߣSPMI\t\u0007V9HF2(~ٱ\u0000<)w,nŬ2N\u000fɊK>\u001cb&Wf\u0004>\u001bxN6ݍ\u00167BT\u0019g?6M\u0000q\u001e\u0001c*j\u0003`ba\u000e씂Ϳ%[,\\\u001d;@j\u0002VZ\b״sp^A\f\u0003\u0006my\u001bY/|I\u0006 <\u000eޒ\u000b\u0015\u001dmٵk,Kݿ\nxj\tj$Zk\u000ec@\u0007ej\b-ۏG\u0013\u0012\tz8|\"2(ǰ\u001b%=iAg9`c4Ua-(w\u000bA3^2j\u00061vy\tfsXi\u0004#\u000b\u0001sW9ގ{;{:+Ah۬a\u0006\u001e\u001b|#,%ЀT\\a\u0011r2E\u001e?\u001b\u0005L;NӨ\r[\u0012Ø<\u001er6)t\u001d-R.8\td_f&%\"\u0005a^L\u0010\bsO?\u0001Z t\u001c6b8b\u0016F>30\u000e)8'me⹴Q(KH6\u001b\u0001EKF)$yhZFV`Zri\u000b5\\\b\u0001#5%sL,\"\fw7_\n_E0ۖ)\u0015\u00004|(a\u001dw)\u000bfeP?:VĔm\u0002\u0005\bϔM?\u0018-\\t\u0018MZc~Cտp\u0003\u000b`\r:ET\\5\u0014ƵYw\u001fؓvF2\"3b*#T\u0001@\u0001}ܾn~\bs)Pv8]lUN\u001baT\"\n\u000e\u0017\u0013\u0004\b&\u0006ge4`d 9k3ʼ\u0007uq\u0011\u000b\u001bt||b\b\u00145Կz7%\u001fh_\u0018HhI$b25pi\u001e\u0010Umn\u0012O2KWbЫ\u001fTătXEɺ\u0017\u0011>V>E6:<@\u00072 \u0018I\u0010\rǣ!F\u000f{1N˔\u0004}{o\u001cI:ʋMz.2IU{L\"~\fv:5b2hj?tnDM\"r&\tB7Ru鱬~\"uFV\u0002-WG\u001d^%\u000bO W$b\u0007Ϭ^Bx;>xY'6\u0016?uK8\fÂB!*<'\u000f<d*Kq**5t\u0012\u001a(L\u0013tzDn{<\u000fHł\u000e>l6,b-\u0016[mmy\u00013\u001d\u0003\fQ*\u0016&oo?w$\u0003q\n\u001d\u000fꓒN,&D\u0006pr\u0015`\u0019\r\thf>\t}2\u001b[kB#\u0017ieD:\u001fYW2\u0011g\u0013|iy\f~得|W-3L>\u0013$'\u0012yǟ:\u001co\nͩ3\nz\u0006Gߩf\u001f\fe1wD`m<\"ߪM<|O\u001f8Ȅ$\nmL\u000fZ\u001f\u0005\"L($i0bdӍ®vʜh[\u000f3Ъ\u0010=_{@\u0011\u001f)Ș)ʀ:: f\u0007bY/B<ݾ]hW1sn!v?\u0019vKˋ\u000e\u0010KtvlUS\fj\u001cv(\u0014p,\u0005\u0013!Jp\u0018HsĄ\u001fEE&Ԓ\f\u0018\u0019v,TjDxWt3VuK\b\u0007zT\u001b\u0014\u0002\u001b%:\u00199\u0007گ\u0012\u0002\u0004\u0017\u0010u\u0006oJy\f}A@\u0012+pC2]\fIPz\u0002`܎hě\u0003y1PL?~4pN\u0005QdႪ\u0016\u0003-U\u0005~-r\u001aU\u001ao쀮`u@A\u00105dH\"\u0006Kҝ\\Z4v\u001e\u0006΍p\\@i\u0016\u001aj|)F\u001c񵶞\tݫ\\0d=d[O`>d:H\u0016N\u001e`-k{Uں$D΢\u0000ͪa\u001cx\\\u000fwY]^\u000b\u00108H+O.h)gO?\rח\u0016/v\f2XG\u0013E\u0011\u001aLA\u00119<([zt6\u0006\u0000xY\u0014h\u000ev\u0004'#\u0003f;i\u001a\u001bp\u0011zi\u0011>sԪ8\u0003E\nԄ\u00193hN]@lV+\u0019\u0001| %\u0005\u0019ׅQPw\u0000]p+3{\u0015\u0018EY\n\u0018Ɓg\u000b\u0010*H\u0017дQ\u001f/h`d\u0006n\r-ra>S\u0019V<kZ2a\u0001<\u0000e\u000e,λP)p)x}%ע\u0012\u0007u\u001eKc؆8\u000bHJ#30#*\u000bi؍&\u0013\u000fu\u001fD1^1\u001a\u000eE\u0003^M\u0001KaFOfr\u0014\u0019\u0019M\u0001 .!A2][Gd\u001c\u0015R\rSޘ \u000fF:z]w-[ˬ׎+vQ~7Q2\u0011\u0017\u0005'<gmcdz2||P\u00196F.9Yfg([I4^Z\u0016|\u0001V3G;P\u0003i\u0002krf!O}x^\u0003\u0018jbB!\u000bU%6w0ΆE\u00064\fH1CO\u0011xLS\u0012׸\u0006ⱅ\r8\u001e\u0015x)L'#\\@g\u0000k%cu6bV\u001b)6\u0015Z\u0013\u000eiG?:WRܥ\u001dazr?*\u0006Ur\b\u0000\u0017z1t\u001bCҎ\u000b:\fv\u0016u%#V\u0015\u001aPJ#H\u0011\u001a~gel\u0007i\u0014J,H\u000bw\u0013ڶ56^,^Yyy\u0012onL\u001dO\u0002z=7\u0006\u0006\u0017J2!Kx'\u0004\u000b}xj\u0011+X:Qh\u0013\"z-7>8\u0002״S\u000e\u0010\u0001$\u001fXP\u001a\u001c\u00034%\u001c\u0016\u0011\fGI]\u001a1\u0018p\u001fļ g|X{{j2UGW\n߯Ī DT3\u001a\u0019\u0010e/τ\u0005<n&:I-h> cz`ʸ]\u0004P'yl!\u001c}!O\f1K4̤u5\u001du\rq@nCH1SEnʺ{#GNր:k`\u0011۵C\u0003s\u0017a\u0018NAaR)7L\"d#T˻#T2ȍx?\u0018M}PT\u0017OSm[iykDdhtFw\fk!(\u001fv\u0001\u0014qK/j\u0003\r\u001aȢ|Ve\u000e\u000eY/\u0000a\u001bfy3n.F0\u0005tv\u00074jd>J|\u000bM\u001ejC|w\u00002ML˚F\u0014*\u0003(4O\u0017N~$(7-a;\f>\u0000δ\u001d5\u0001CʆA~AD]Gk 'S7\u0016Z($\f\u0016>6s<-ؤbȂR0|L\u0017QB&\u000bs\u0017q\u0018գ+a\u001a9\u00020w0\u0005ϡX\u0017/r \u0016@3\u0007$eh1(\u001apUՋ\u0003h\u0017\u0004Xqs@)8&\u0010Eۚ\u000fJRЍ\u001bAB\u000e1\u00063ҐH\u0007\th\u001dr{\u0017\u0018l\u000ef5pBgx''\u001fi.%>o \u0014*B\u0005,\u0004rCY\u001eIPF(;t`Gvlk\u0012\u0000q>\u000b@\u0006\u0013$y80o?W8\u0019?d\u001a̯Iy\u0010fXi`|\u0007GXP[Z\u0016a$u\u0015R|fu\u001b(LK\u0002mΐ,0\u0017\u00068\bF\u0010z@\b!\u0011\u0014feVả%~Y\u0001\u0018\u001c3(\rBy\u0007ٴķ\u0011P\u0012t?ďr!6HQ'&\u001bq^b%i0\u0013N\u000702+נH*y)f\"`G\u0019BgC</Xͯ4۸E\u00178ugFsc\u0010zS\u00075洲1\u001c\\IC@9\u0017VY-rz/\u0004140TEM\r$VcJDJgY@>\u0002_d\u001cs\u00033M\u0012n55|(P\u0001CZ!&[PIY\u001bȢ\u0015hPv\u0004Mr\u001f<e\u0011R?x\tdO`W-Xǈ\u001a\u0005E\u0014H\u0003xB˿\u0013r/w^XO\u0011\u0003<\u0011E&ܙmDJ?g,\u000fSJ\f}*h\u0018 &3_Qq+\u001bcL\u000fieʟtBvV23H\u000e%@8\u000f P#EgOD(rzfmn\\EϩOD\t/\u00187\u0016\u000f8\u00124g$ll$0\u0011ҋ\u0007cg@B\u0003yW&NC(\u0012To\n1Cj\u001b\b[0˕׬9\u001aț|[7[ \u00107\u0019[Ac<[\u0014Kq>*bP]2\u001e#(#x\rNJlOYL\u0000m\u0011]؛ϻJ%F)SCvC#:\u000f\nigq{3Z5\u0005~XD%-D8)a&\n=BS:V2\t\u001b?\u001d@\u0003^\u0011$Q~dYt\nX\u0014jH.c\u0015R\u0014y\u00016\u000e¬7r\f,KD,o5:ʕTB~k\ntmτ%k˸!\u0013[\u0016\u0004A\u0012\u000e2FcRV@Ck/\u0000};O\u000eãmb=O\u0016wRGJN\u0006\u001a9\u0000930tР\tr7S\\N7rͭ\u0010wO\u0014\r?RNn[\u0005i%`Vyl|\u0006\box\u000e)G皘\u0015&؋X\b\f5+\u0018Gd\u001cof\u000ew\u0002cLR\bxB\u0012\u00165O6\u0013w\u0018ELdYސeE}Py\u0016jExjw;\u0000aUA>\u00008\u0006\u0015w\u000b;9XJ3ϖLabp(pu%A\u001cN\u00128\u000f\u0017\u0002\">+؝v~\nu\u0002X\u0000*8\u0014>\u001cH3Bd*St\bC\u0001\u001di۰VŢ\u000e\u000b2\b\u0016*\u001b>~ \u0011#`jQDxm\u00151ԈT\u000e\u000f{@\u00068\u0014|?_Z\u0011\u0017'wM\u0007\r\u0001q\u0003)#\u0003~\u0017?LBؗ/!D\u0006\u0004[AS\u000eQ\u001e6Lr\u0002Vxt\u0003\u0003gB/\u000f\u00063=Uhl\u001fE\n\u0007(8H8\fO%\bbH&0oh\u00198ԫmJtv\u001ejia0\u0016|J?n\u0013Kk\"\u001b\u0016\tC\u0015$֬TVTxT\u0007<pK\u0015qay\u0018)(\u0018ǳ\u0018L\u00167i/K;Em4}Y\u0002Ӳ\u0005OT\u0004P7+\tl:-\u001c]\u0000\u001c\u000b<]\u00191)r\u0012\u001d\u0004O{rC\u001cKYQ䋗\u000fT+_*\tOXsA\u000e>Q\u0003Fn;\nnLW\b£\u0014o-\\Gy\u0004k\u0007| q^\u001d\u0003u+o\u00116\u001f%\u0004w\u0013d\u0018((C(<<\u0004SddP&BkAhEr_!շ\u0005 z~pt\tG\bY\u001b%\n[ɍQ)X>v\u0016f\f)~\u0001I\u000e{ȑʀ\u001a8Fy+g\u0001iXCwP\u0000Ϥi-\u000bMlu7\u0011\u0012z(\u001b\u001e\u0010j)Sٲo\u001e\u0013~x\u0000nF\u0015j \u0005kĨ\bӻs#]\u0019#?nbv=\u0014.\n2\tbpW^\u0010\\\u0005!&\f\u000e,\u000e 6\u0000`wOe$ce\\\u0018(i\u0003\u001d\u000boA\u0018Em5B\u0012RDF{\u0017*as\u001bYIBֈM\\r\u001c\u001e\u0013\u0005 ~\u0000\u0001P$E|>(\u0002P)@u٥>vH]L\u000b\\K\f6\u0015\u0001\u0016q`/ȁ)ׯ\bh\u0002)c\u000ea]^P٢m\u0016n#4Dj0)\u001f\u0001uTʜI\u00126\u0016ǥA z`\u0014\\\u000e&\bD\u0011\u0001G\t2:4Ů\t@2A*wG\u001b\f\u000e$P`!;OТ!4R\u000bg-wȼ\u0013/')\u000e\u0003@\u000eϾU\\\u0013Ho\u0011p \u001fB$jf?X|9\u0007IO\u000bոU\u0002!G,(-헩uq\u0015\u0006\u0005?%f\fGFB9{_m+}l\u0006s\u0003\\Њ*\rc?AV`d\u001d$ٖ\u0018y:D\\\tCH\u001738`eyߦߚ{\u0016K؀ȫN\u00014\u001elhv\u0004\u001fi,Q\u0005= \u0015FJ#\u00168 EPBdz\u001f&\f5\u0000qj/v\u001b\\&~-8x[(~pA\u000ej*x#Tw=0\u0014cH>rZcN\u001e0\r\u000bM0C\u001aq8T\u000fGF\n-\u0012/jQ\u001a\u000bʋ;m\u0012\u0014\u001eS)Cv\u0012\u0007S\u001bΘibȰCleP\u0018\u0011s5gK\u0007\u0005\u0000WYfohOJ|Z\u0001XѸU\tKr\f\u0013Vh{up'? \u000f3l\u001d\u0007h,\u0016klQ{2`\u0015\u0019\u000fz(\u0010|\u000fXt\u0017N\bcQ\\\u000f( Jm\b\u001e/\u001fz|.H\r+*qsG\u000b\u0017ᛙ]\u0002;\u0005Q@\u00071\u0000/aQ~}YN`\u0001e2B\b$SK:L`\u0010\u0004_O{g\u00118\u0014H]\u0004iQ)!Z\u0001d!@na\u0019#n\u001c\u0006\u001e\u0012*\n6i\u0001s&\u0017e+}uO\u0004f\u0013`/1F9acVC,[蟃\u0014~K\u0005ߖX iC\u001b-N\u0011e\u0018mk\u0015\u0015K%\rBG\u000f\bhm!V&\f;\u001eY*\u0003[X&eZq©\u00060|`wt\u001d/)[\u00156\"f+{&\bI*&w \fz940E7 /t=\u0006%zt2ׅշ\u0002\u0005\tf;\u001e\u0001>7>0DlcGb?!@ov3\u0019F=]J\rk0خ\u0012W5>Fdc{oЙEmyu!\u0015yҼT΍1\u001e{˔HGSCJ}β+ϛn6>R\"D\rfyaSɑ믁4\u001b\t]^)\u001ene-:&\\r\u0011\u000e\u0015X\ti|\u0014AAy2=j25A)\\\u000fG!2I9z\rױS oWb\u0003vsr|\u001a-L\u001f'Ta\n\f[`\u001apgd(p\rܹ(\u001bF\u0016[JYmTNGXi22\u0007\u0019+~H\u000fJq eo\tw\u0005x\b6gzJG9\u0006j*B\u001d9(eB9;\u0004U4\r\u001d;0>'Wn\u00125բ\tt\u0001\u000fC\u0000BODIb%\u0007Ʒ6 vܟ\u00199D*j_KS/^9))t\u000b8;\u001eFru\u0019AaH(خaҘ_&<ZP;e\u001a\t$.UьEZ6fV\u0003WZʉ H-0enKm`\u0000DT\u00115ed\u0011\u0006\u001d,R!|Y&g6:BE\u001eI\u00058bi\u0012\u001b'E|?4e0\u000fNjm.\u001b\u001c|h\u000ee״J\u001ax\u0012o<k\u001c\u0017G^2Dtdc\u0005Xeމ\u0006\u0014\u0017}+l\u0013\u001e+H7L\u0001\u0013\u0016\u0015\u0004DI4~[u/!\u0016\u0019u\u0004W\tA\u0010Cd\u0007#H8J\u000eP\u0013Q3\u0000~/A{\u001e\u0007^SQQ'8!%v@\"CQ:^(\u0000:g\u0014o\u001e \u0006ZJ\\4ˎ\u0005;/D\u0006LQ*Z\u0004\u001a5$!g\nD@Heq=Qkg6J;>z#ܛ\u0011f⺊\u000fb*a\u000bJ0t%Rx\u001f<HO\u0013+ޖ\u0001[\u001fȀM\u000f\u00049[\u001f$\\\u0019P\fv\u0000 xC̃U\u001a\u001cδ\u000fGzP&LBσQE~{)B\u0002|m\u0007!~\n>*`Y,)\u0017A\u0000\u0011&U;T)N`\u0017\u0011,Ӳunk\u000b%ft\u0002G3\" a\\Zr-\u001cCMNe6\u0004BO\u0015\t\u0002>\u001a~:ޟy*J\u001ehד.\n\u001eNMdL\u0003$IT%\u0014a\"G]\u001au\u0018 5A\u00110~iBk?\u0019hwe:\"\u0010{\u0007X3 3K17\u0001ał\tn3\u0007#?\u0019\u000e<!\u0000kIUMσ0\u0002jC.  P\u0005;$<\u0014L\u0015=m$QԆ\u00036`2ڰ\u0019qJF8֊ \u0006Б\u0010\u0003\nR\u001a\t I\r\u001f#G#slDU\u0012;GDg(\bߑ\u0010>2|D$?tg\u0000\u0002\u001bfճ\u0005\u0017ޢSwL \bQ\u0011!'-/\u0014ȃ\u000fX7:R!jKſ\u0004\u0002L<J)\u001f\u0000S5\f\u00077`(QĞ|\u0014V\u0015[:\u0003;@J6b#!~\u0016Xv\r>J\u0015\u001f\u000e]فs\u0007BDʆ'gb\u000f\u0001Ck2\u0005+B\u00173vH^Lr9U;+ٳ\u0006\u0005=7%vlQK6.&/\u0016=FjD\u00036lD\nŔZ^w뢰r]\n7ϬK@L\u0016׭\u0013fwK1o-#P^GO֊I*M'~\u000f4\u000e=Cd~4k5ΰ1M8H$\u001dtd+8h731\u00073Sa\u0017\u0006# \u0007`@&S'65R$*ɔT\f\u00192v6LpF--qqT$25x\u001cv8\bȧr$ \u000bzb0 d98'\u0010OV\u0010\u001f6\u0001ÝOUsoJ𗜃-I\u0000OJ<\u0012D\u001d\u001a\t\u000e\u000e9\u0014&\u0011\u000eԟFD_\u0011nft#\u0000GƵ\u0010Wa\r-y\u000f\u0002)h\u000b#ϸ\u0016+G\u000fF\u000fo\u0004XZϩ}\u0002]4d\u0000d^X/h\rFگh\u000770F\u0006Wׇ\fGv_O\fP\u001b\u0007|\tF\u0006C?}ۍ|n6e4wCR\u001d\u001e\u0017YK!\u0003\u001b++r\nIM\nq\u001aT\u000bO^]O#yfRV't\r겄H@;\u001c&5\u0015Y\u0013Z\u000ek\u001d\u001ck\bO\u001f6*p\u000b\u0014' GihX<\u001c}،L6\u0006RȾW\u00026[i\u0018F'PG40ԬvR,duT4\u000eH\u0013\u001dГ?\u0012\u0017e]J6\u001fҁ\u000f`5vƃCJ\u001f1\u0006&\u0016\u001b[î1<9FYO8\u000f\u0002U\u0001Ǣ%%7xIxQ2@m\f?n*)>x\u0003h\\Һ5_Úg;nܷT#=r9\u0001RʃN \u0006X\tWg6w)6.+\u001b.~wȾ\u001a\u001fumtv7_(T]\u000ejDK#I0\u001c\u0012#\u0005@O\u000f\ty~\n󋩯|O#[A)=I\u0019E?d!ePS,\nTh?ټE5\u001a?͐W9\u0018\bͶo\u0003$KF6\u0001\u0019(p\u00157܂\u0019\u0011f\u001e\t\fi⪏΃8uNCO%n\u0015Nn\b7.ps\u001aւIc,h)lTl8\u00154\u000bzTM!QcFqTd\u0012DE>\u0012\u001fS0Jr\u0016ǯ]f&L;A\u000f`˔\u0014٘:R<e;6Qt)/bw\u001d\fAa.<Ōub)\u0006\u0004s<WW\u0005-q0\"_η#=ﹶߏXH6*@ph2P\u00040Xco\u000b_tmAŕfg\u0013T_kx\u0005\u0011]lfKh.e\u0017*$goMʜ+qr\\\u001f];ŧ>.~\u00186%.ʴV9EӇYL4\u001e\u0018\\/+vo'`Uhw\u0016ﻴgR\u0012m)qi\bګ\"o8U\u00140(GR\u0001\u000eUbaCй\u001f!hc\r\u0003wJ'Ps\u0002\u0012\nM\u0011صǌ{u\u0013\u001fL$BϿp2#\u0003R\u001f1\u0002݊ ćK\u0011\u00122\u000e?\u000bgR\u001a3.ρE8Oeݑ[7;eKĂr\u001f\bǩבl\u0018KSUuTX\u0004+C!%!d-4,+\u0006\u0012#0h|~\be\u0014ɾߑE9&ENem\u001bR\u001aFf\u0010v\u0002JN=\u0011P(\u0006\u0006\u0013\u000bT\u001c$\btQ.y\u000er\u0017\u0007\u001fb?ۘb~\u0015yn\u001e\u0002%bw\u0003\u0010\fD\u000ȩ\u0001$\u0014\u0004>\u00138ʤqˆGVs#\u001dT䆭PQ\u001d\b!q\u0004\u0001\u0019\f?k\u0003#;~~zUB}\u001aM\u0013OYcߤ:]*],=,fe\u0005\u001e+|\u000fo\"MnR*xZxcWǐ\u001dL\u001d~z+\bx9\u0002<\u001fzPb\u0005h\u0004\u0013-xx\u0010\u001d7:\u0014\u001a\tEQE\u001f\u000b[a\u001fL{y8\u001eQ\u0014~q\u0017\u0010uII \u000e^c\u0014ذGP䅊t\u0000$ E1%\u0011VX\u000f\u001b#W}\u0016\u0006]=R\u0011IHM\u001dMy\u000bii`C\u0014ّpD\u001fGi\u0016'::(5/Bڟ48B\fm?փmh~\u0003*iMS<8cg(\u0013Į\u000fiNaHD\u00068\u001c,~\u001ai蝮&h\u0010ە\u000e/\u000fj\tk@gՑM尫uL:\u001f\u0001WnX5\u0011\u0018#(b2\\\t♂\u001cA\f^A\\,&/\u001cI\b\u0000w\"=Zr\u0012P8qE,\u0003C_`2\u0005,#\u000f29H*\"ȎP\u001f9\u000bR\u0004}.\u0019P)A7\u0019/Pd(<2\u0012ʾ\u0000\u0015L.\u0010r̈t,mz}nSկR\u0002Bq\u0010w\u0002y\u0016&՟wRQyݴ\u0010\u0000\u001c\u0014X0&(ҽFo%@?\b>\bmw7q[\u0004QL0S*@\u0016b\u0010tvA%f\u0010!y%\u0019{ђ@\u0002e/fOzt\u0018T\u00185dv࠳\u001f\b#\u0012B\u0014+fX2z\"Nߌ*S\u001aW&}a\tZ^@]\u000f\u000b?\u001eG㹡\fsfP\u001e.\u0003'/o\u0001VQ\u0002U҄$*E`\u0016y\u0012׭S*\u0016ёxi*\u000b\u0015\u0013/đ\t?q\u001f\u001e!Y`̨O\u0001%yt\u0002<\u0005JI[~e3tкPZ\u0002\u000f\"Aaȯ\u0007\u0012'<-\u0012Đ{`8\\*\u0018|` \bΈ^r\u001bcx\u00019\u001f\u0001p!\u00061\u0014V\u0000\u000f<@N,Ӿ^~ʸAZ0]lڜZ5\"d_,f\u0010 r5|Ѕ~h)\t䖠*\r*jD\u0015.\u0000qqcyfݯ6341\u001d9/\u001fd\u0018@9~\u0007Z]@zʲ9\u00036d Z\u0003/MUii\fQl\u001937nPl\u0002܍n#cPW75:\u0005Uoq\u0001\u0004\u0016\u0004\u0016zK'O}4\u0005_mI\u000f]%\n\u0019O\u001cN\u0015C\u001c\u0001<E\u0003R(o\u001d}P4˄<^j\u001c0㫚wp{\u000b\u0014\u0003 F5$TS*R%\u000fj5c|]\u0005X1Pe\u0016\u0000#R@.L\u0018jtdy\u0012\u0005Y\u0000ֆM%딁\"\u0005db7z\u000e9\u0006=\r^s\u0003K6\rm\b\u000b&p`XԬW[\n\u0014.NK3;\u001d>\u001e\u000ez\u0005WCR)\u0001_\u0006\u001cQР\u00064\u0007|\u001c`$\rt\u0019`C8\u0003Ɉ\u0001\u0013\u0014\u0014)\u0017]\u000f]\u001c<q=hcՅ\u001f)H\u001c1گmC2g$S)SSuڙWGc\u0019\":Uh68YʡND\u0013؊vs\u0000se}seP\u0004q`1\u000bN\u0016\u001f \u000f\u0011iDOD\"\u0015Ѽ<]|P|˧\u0010I\u0004\u0018\u0011Eh\tSmq\u0011\u0016Ay`|?\t<\u000b\u0014\u001dM\u0003djqi5MRC\u0011𡥉F\u0004\u0001\u0000\u001a\u0004ajGˀ?]M9\u0004`S\u000fwװ2+\u0016<Cwxp`bNGH\u0017\u0011k\u001e\"\u0000t$kӺw\u0007H**6T&re-6%雞\u001b\"\n\u0013n}@\rb7r\u0014\u0005\u0017|[S^\u0016[UYu?%n\u0003P)\tnnD\u0013ȧp\u0000x?*GU\nf߽N\u0003s*z\u0010~/XWyx|0\u001cw^\bVYq!r0,OD0/\n\u0002BV$v]\u0016HU.˪jgl||ʸes}1\u0004#\u0003 Ȓ^pBb\u001b\u000fy\u0015W\u000e\n\u0000^pcjmCo\u000b\u0002_i\r\u0002\u0018\u0010HeZSF$\u0012߁~\u001a@\\dv6QZBEi{\u0011R\u0015hI\u001eA\u0014\u0016f_\u001d\t\ru\r729\n\u001bPG\u001f5ⲝb\u0000\u0005\f\u001b%ne5JM\u0016Y#H\u00162ˇe\u0001]zrK.=t ޴bλ@\u0018\u001d\bUd\bQy\u000buai+u\u0013D0\u001br|ul~Î\u0000]7SZ)4!teY(7hnHF\u0015rŮ\u0004\u0004C0bRgJH\b\u001bK>\u0010W.ֽhhe_:4V/D\n_=1\u0003\u000096!AU_\u001f Bl?,|\u0018}\u001b2\u0019D&{JJ[Fzb!pC7|y\u00047E\u001dHn\u0017L@YRzρ(\u001f/tU_5q\u0001>K\u0005\u001b\u0014ϬJ)In߭<\u0014\u001c\u0000`d\u001c$\tȥo<yb\"I*'\u0003gM\r\u0001`z OkY\u0013>ǢiÉ\u000b@Oא.^ŷU*<\u0011@j\u0019|M\u0003[f\u0015^x9d'ǵ!%Y\u0004l\u0001؞\u000e\bN{ŧKd\u0018C\u0017R-\u0003-\u00196LX+\u0015Uj\u000f4N栒\u001e#0X\f=yT5Q\rǝ\u0014d?֘؎\u0004R\r0l[PZ=\f_fPN9\\EX\u0015C^3J\u0001\u00024}z(%\fñz\u0017|5Z\u001a\"\u001d&\n5^R3->}@X:S)˿\u0002gN\u00110\u000f\u001b1+\u0005Ch/2͕\u0016N˒\u0011XXPjxGX2|M1.t\u0018J\u0016OAKGU8E8ƕLK\u001aD\u0004DihG>\u000fw>e\u0016oR14I)tŁr\"V'R}y73\u0005gVF\u0017K\u0001,G_\u001f'HV\u001f\\A-HRڑ\fҐ.iXMͫTbRv=>q|\u0014i%Ra9</6}\u0007\n~N!4k5dߩ\u0002x/uE*MB \u0019&nL(7&&$%l90\u0019-i\u001f1#Or$\u0010ӐlHdUUŠ\bp\u0010is\u000fϭD`ƻ!Mf}\u0007h44R\u0011\u0006Kl099z\\`B:y;\u000bSdw}Mb0wf\u000b\u000f{\u000eϣlsB\u001c\"\u000e(ׁ\u0014\f?#\u0003Q\u000e}R\u000f=OҢdJT:NaRu\u0003ϊ\u0013_C=A\rjsu\"Ļ\u001e}\u001e\u0001\f\fI=\u0006BZx,XFp\u0006V\u0013sfAyQf\u001f\"\u001dL\u0014u5͌qL\u0006w-]\u000eP\u0006:Bo@v\r?߅V\rL\u00170\u00071LTm\u0011;\u0016%\n*-pfQ\u0000XC5/\u0005:8SQ\u000f\r\u000e.$[/fL/za\u0019V\u0005-\u001bq&|īa`}`E?0^\u0017(g\u0003\u0018$~\u000b\u0013\u0004 FF1w14]ѾQ-?Br/\bҨ( \u0001<\u0001\u001b<)x\u000eU\\w\u000f\u0010R˾,X!\u0010Є\\@ď7t\u0004)\u0010\u0002Gb\b<lB-߹'n\r\u0019@װ\u0005a4_\nv\u0014CE\u0004H;m^F\u000f!/J\u0012\bf@\u001f7md;\u0018$Lԭ\u0015=P\u000fig\b0́{\u0014Ob_:G-&}vlMk\u000f eI>\u000b|3F$-\u0013|!@\u0005\u0000\u001dz\u0003\u000f(2E6\u0014+6\u001e<K:w\u0010\n>\u001f>O̓\u000eE7$}O\u0005^Kw?\u000bwy\u0005`mX\u000ePՀ]0x,V{~\u0013c(\u001er4\u0007;xi]IM\u00074\u001b5\"35wfX~ax<\u0004OZ\u0012\u0012c\u0013/~kh\r;J\u001cQZ,#[!w=֛cOSޱ\u0005o^ѥ\u001ay\u0007asꟅ{j\u0017ަi$}\u000btu)*Tا0[*\u0017KC#M7w;)DJ=`7sl4 $dd<6Z+\u0014P\u0019!(\u0002\r\u0018O\u0005-\u001f\u0013l\u000bG;\u0004K\u0014]Bv닡8/-#̋TQ\rquo?d\u0007\\$7Ќ\u0010\u0018A\u001el<f-ѐ:r\u001b\u0011ԠW0篗q\u0006c\u0018%\\{LElq\u0011L'ŏ$\u001a+t`QJ\u0013;S v,;|kԲ\u0005n!gD#|\fa;z]EV\u0000>f)/\u001brm\u0012eͱ\u0017k펶De~Bc\u0010wjp6\u001cKs:c52B\r57f\u0017iS:o9Ժ\bO\u0003L%}\u001c>͘\u0010KM݋]{\f3\u001a\"\u001c\u0004M=9\u0012nNnZaa$r9\u0001\u0014ƐSb}$l1ŪU.K=\n2\u001c/*\u0003y)oZ\u0001͝7x޵\u0012\u0018\u0015ݓ]]ꤌ$(\u000eA;>w ';d[/`qI0m,Dˀ&\u0011+\u001e\u00026d\u0016P\u001a/TD8.\tb[󕑾7\u0014AZQ}AfxO\"ЏH\u0019к?ϼN\u000en\\\u0019DWq\u0019\u0017\u0015We_.y<Me_\\w&P+ ֿ\u000bLR]Y+\u0011\u001a-Ǒ\u0006\u0006@\nc)Cڒ\b٦\u000bK\u0010%?\r,\u001b\n$\u001d\u0013^bcߓ5֪%d\u001aRY\u0014T=\u0012vgD+E%Tw*\u0003foVg\u0001i\u000eٷ%d\u0014?v\u001a\t\u000e\u00053\u0007&M3SAu\u0002P\n]Ć\u0002\u001b~\u001f:4۾@ ǫPOb\u0012d2[\u0018c'O\u001e?[g\u000f\u0015\nU*%\u001cBáFl\u0002\u0010ȗ8%\u001c\u0018DŐ_طּ\u00172\bu|\u0000eCʧa@PA\u0012e\"̾%J`\u0016re:0SBå~ƥ@YXg\u0019 \u0013\r8\u0014,\u0000T\t\u0015\u0006\u0007W]\u001evUʊfu7~6-n3${ؔ\u0007\u00039ϪKYt(\u0018нy\t?\u0006\tKD\u0001B\u000bO70Q\u0000q\u0005\fy0\b\u0003Ģs[z\u0010\u0012GvBv\bpPUo\u0004 !\u001c+Ie9-\u0016xW#,x`?\u0006z\u0018\u0001\u001e]jvğ\u000e\u0013,܈\b}(qWp/ko\u0004\u0005\u0017Gk:m{\u001ch\u001fSC~(\u0018\u0003A\u0012WU\u0011ӂ.x{N\u0018\u000eB]sZ܉E(x6z\u0012\u0004( щq7)\u001an4xJ\u001361$V\u001c-OK.P\u0017Кe2fa-\t8F܈\u001cI\u0018drYUm\u000bzYӏW,\u001c\u0006cr̓\u0004Q>̠g/[r\u0001h\u0014\u0004l'pW]1r*\u0011<h~貢\u0014۠'f\u0019Ρjv\u0002^\u000e\u000b \u0015H!_A\u0012\u000fC |\u0005̠r\u0013&\u0018\u000b-sK0\u0018'X=ȆOVlO\u000b̍\u0013Y\\\nB.80f8\\8q794\u001b٫xЈD+M=\u0007צ\u0011f*\u0004/f\r+tu4\u0014vD\n\u0001I\u00114T\u0018^\t\u0018?fbf\u0013\u0000\u001fVz\u00035BD#+ƁW#d+q`\u0005:r@.w\u001d\"= \u00032_~:S\\yd\u0011օK{\u0017@\u0014+RiL%p\u001f\u001c0qp\"\u001e\u0010;`w@_2cөH\u0011\\\b0\t\rj%\t\u0012veP\u0003|~Hǒ\u00075q\u001fp<[\u00129F\u0019-.\"ї\u0000CQ\u0000x7d\u001b(\u00128C_\u0014a\f*9\r$#XA臈u\\ϣ׋do(Hp{!.xG\u0019\b\u0018BCkM>aO\u001f\u001f&?a\u000b\u001a(]牰\u001d'\u0002z`EbO\"s\u000754()|ڵ:;E\u001bŬ7Ƽ\u001d-Hؙ{Pގ[D~{;uD3-fW\u0014!UoQ^'?+\u0005!<#RBe\u0003 \u0007 oV/6\u0005y)l\\<\u0013\u00121\u000f\u001e)ީFɯa$oT\u0011H\u0000RER\u0018\f},\u0017HeFOc6棆\u0016SQBJ[w!EO\u0007F\u0013ᡗA\n_/uNϛ\u0017},\u000f^}\u0012fB%\u0006\u001fJ\tLBGwbfwj\fC\u001e{\u000eq#5\\ʿ\rR3\u0005oT\u0011Rob+9ܚVaEJ2[84~\u0015\u0014b4zOZjX\u0011q\u0003u\u0012\u000bwumkc-f<|PDl\u001f`R!tp4\u001e/\u0001A䷔Ýť띄~8ygw\u001dQV\u001bSͤ8\u0002&Rt\u0011]OuF/X;M7Zι\u001a\u001a?4zSR\u001dӧE\u000f7p\u0002$M\u0001TD\u00108r[=7vu\u001c\\\u00194\u0004Bxg◯+B sSj!\u0000:bJ@]\u0013~v]\n\b;@\f\u0012=\u000e\n\u000bU^@I\u0014Ѫ\u0012i\u0003\u0003w~#,o%8ɝ\u001e~s\u0017\u000bQ\u001bZ~\u0015W\u0004Z56\u001f0\u0013P8g\u0012ɩ\u00148j27Q(mW-\u0003?\u00034\u0003d\u0005\u00029\u0011SQpؐ\u001f\u0012SzIxCA\t\fۧ>\\qYUB>\u0011|\\r}k\tL*Đ\u000fQY`{BQ6m1\u000b0sr\u0004)x<56-\u001a:¦\bRvmD6\u001d\ts'\u0011+\u001f\u0010\r\u00029z\u001bI\u0001Eo0F\u000f=\r\u0016\u000e%\u0019\u0017b(v6XQ!:*F/U sPU~?\u001ab(\bUU\u0017<\n]{\u001bt\u0012u)M^Q3e6x\u0015\u001fS\u0016RPQ$\u001b3қ\u001d[ZR!A\u000b!\nid\u0018Z<\rY\u0015\u001d\u0002\u0013\r\u0003EXD$IB\u001e\u0011\u0015/WKhvb\u0015hߜ\u000b?\u0013F(y \t$D&>?OA\u001e>ϊY2P\u0006Ú>TPoƋ\b\u0014\u0005eTAz1w\u0004NC\u001b\u000fŎ7\"x[s\rD@RQ0e\u0005@\u0000.0\u0004\u0011񩰚H\n\nz\n3#\u0007\u0012OЁ-sD8\u0011mLZ҆o\u0019\u0011\fhe\u0003ʄt\u001d\nSPe\u001d!;aŐc\u001c3!P#a\u0011o?^XT\u001d惱\txL.CNY^U\u000e\"\u001e \u0011p鈐Y\u0010t\t\u0014ȻgBR\u0001\u0001\u0000 \u0000\t\u0000\u0000\u0010\u0000\u0003$ \u00068\u0001\u000fX\u0003\u001c\u000f\u001c\u001c(`\u0001\u000b\u0018@\u0002\fl \u0003\u001d@\u0004\u000e\u0000I)\u0000* \u0000\u0000\u0004\u0000\u0001\tB\u0001\u000bl\u0003\u0019A\u0006\u0018\u000e(\u0000\u0015\u0010F$`ۧ\u0016\u0011!\rQ\u0011c\n\u0011?,\"\"\u0016u7,ΐ\u0018y\u0011FD\n\u001bB\u001ff\u000eF\nib\u0012 62քaTE/QI\r9PĻ22ʔ|0\u0015C\u0012Ba@\u001c\f'\u0010a`\u0017\ttҥy־a#G∻Td`22\u000e,\rVXQ|UFx\u0012\u000e7z\u0004dXLLQEb50\u0018ٴ\rL^)E\u0016ˤ#bOg>64\u001c\u0017[\u0006\u0019-\u0015LF8\u001c.M,a.q(o\u0016]\f\u0011\tlvO^\u0013\u0014\u0016\u0007m\u000e>]2IhA\f+c\u0011rk\\eZ^\rr\u0015\u0015y&\u0014$NT\u0018Ņ\u0002\u001bCFm\u0012xK iWO,D_H\u0019<os\tF99xځ5\u001f\u00104AwPt>%69K'\u001aHMўТ ?~fٻR\u0006#\u0012uo~w׽ G\fB\u0012bu(Ԏ2}bmUz\u001a~\u0005mL\"?\u0015\"\u000fׄT\u0007{\u0016\u0011\rnYZn\u001dyD֝\u0011\u0010\n\u0006K!ǩ|oӎ0\u0015ƾ6\u001f\n\r#\nle{ֽ6rs\u001ba$t\u0014j!y\u0018}\r\u0016*۠@\n^AgH \"\fP$D9=6\b<\u001ah\"/R4<B?і\r!_\u0013--(\u001e\rjemඬ!}\u0019HcD>_(o05\n{\r߾oS\u001dfq a<vQ\u0015\u0010׳{A<\u0002<}(i\"56Y\\_6#)V!%ij\u0016R#\u0015\u0019:,FH\u001e!Xj\u001d\u0017d!\u0004!K#J\u0012-E!\u0007!\u0012)٥m0@dJG:d\u001a j\u001cv4!\u000fE$ll\u0012Y1{d}Q\u001a}wH_<\u0005\"Ҽ6\u0010ufΓgWBv0x6\u001f{Ȧ\u0006=l'\fy\u0016\\\u0011ƶM-\u001dU\u0006d\tL\u000eM!V6`G!6`ɡJ\n5q\b\u001f\u0004j\u001dlm09xjہ${V\u0006UKe1SN\u000buR@d,\u0012S\u0007m})T϶Fk׭9\u001biHXhԗjL\u0005-\nuK%Iif\u0017bvqgu6'T4\u000e`-ʱPXa\"!\u0003.}u\u00173ԎG\u000br8\u000eG9<_@\u0011\t\u0005\u000b#\fHaHH$4\\'!QvH؊zP#\u00174\\ Asc3㼜\u001b\u0005yNM5(6\u0018A%.(\u0015\b\u00190\u001ar\bÇ0B.BP<#O2_u\n\u0018ղ}dB )\"7~_NA;OM\u0016њj\u00179-t\tB+\b9еp[4\u001e\u0019}pF6?4ͽI\u000bԙ\nMSNzզ3sX6O+'DDT\"P(=-O6lS\u001a+).e\"33ِE\u0010N\"iT,t\u0014);&w49I)Il9H~P~h+;Qr93Se?m'1dyU\u001bjHYҐ\t$\u00125\u0019(\u0007\u0005S\u000e9)gbm\u0014ru\u001dGl:D\u0013\u00129-۩w\u0005Ӄ\\X\u00125/e\u0003\u0011JCWr<lBI?^\u000e%/OiCSϧ\u000fϜ\u001fz}j$5eѧF\u0006)\u0017\u0017T\u0015Yy?t\"2H<\u001d3^$\u0011q\u0005\u0012^Ȅ'\u001c\u0011_'bB.\u00127UUEr|qV\u0015/U\\Vu=yfR7w'F|߾]\rڶ3m\u0006P\u001eɣ;\u001ey^\u0002u64\u0002+|AIE\u001a\u001aթ\u001eSDTcT\fM\u001d\u0015\u0006UWQ׃H#A\u0012\u0015u\u0015^P\u0012A-\u000bEEP$*FE\u0010>:\f}eW\u0011HR|\u0013\u0005憨PR\u001bǥ\u0007\u0011\u0014}\u0014\u0010\u0002\u0004K\u0000\u0004@\u0003\t$A\u0003\u0012\u0002 `\u00033SR,eM2U؉\\,΢u\u0001M\t\u0006kK\u001bF\bR[]P\nGE\u001e;c\bn>-\b=\u0010q>\u0012\u001f\u0004Y$\u0019Q\u001e9\u0015\u0017\u0011j\u001cCE\u0019-T\u001eZ0\u001d\u0004cH\u0011D\u00054mq\u0006b\u0005\u001f\u001e\u001c8|v0{!OoIKˤ\u0012}\u001eւ\"Ӛ\u001c7ig0J.EM$I\u0010ٽ`B1\u0005\n8B,v[]F>VYDRDɑdH*ΐT\u0019iPZ1!\u000bEq{1 h\nM\u0005U2(;\nҝ~\u0014\u0010E0CE5\u0017\rGb9&צ?EQ?\u0014TT@y*Ǒ~\u001eP8d_h&\"3?(:{CМ\u0014\u0002-e\u001dH\u001bkQ{ʹg͈EE?&G5\nhBdxpNE\u000eL\u0012\u0019G\u0018i\u0012~p0Nf\u001e23-RyH+ԇVraB(hVeHti;\u001exI\u001d)#-2~c3\\\u001ai4 +Tg4=4\u0002qE<IHKp`.[,\u0012)\u00138d\t\u000fK\u001bZ\u0005#v\u0004\u000es)y\u001d'$I,m,%rE\u0016\u0019e?\r*{sb/_\u0017]KBXx/<\u0014\u0017ҹ4\u0002}:~u\n\u0016l8\u0012\fλ\u0010\",\u0011=S0#z\u001f\u000eM\\!>d\u000bƬ\u0006\u0000\u0000>\u0013\u0011\b \u0018\f\tE#b1R~\u0014\u0000\u0004{@j\u0007b\u0010@\u0018\u0007q\u0019\u0006!\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u00009\t`\u0006y \u0005d_Җ5?\u001b\u0002\u0000\"\u000b\u001eh\u001ap.\"=Z\u000e}YJ\u001fFu`E\u001d\n*#(R\u001f\u0011\u0016VEmn\u001a#+\u001cL\u0016ҫK`\u0015\u0016[\bJ\bj<0\u000f\u0011\u0006B\u001d\u0018%w^U\u000e4haS.\"\u00133* p\u0001M5*\u0010\u000bX!Q,-\u0002d|M@,$\u00128vZ\u0012â@rll~\u0000\u0019T鋘 gŮ=\u0006IldH8ЩJ5pNF\u0001p\u000e,\\UݟD\u00148:Bh8Ղ\u0018F\u0011\tCZ\\=W\u0019[IQf0⧰\u001d6\tR̮\u001aUr\rq̡)]_>;\u0004pl鶨)Vlit\u000f\b/@]%\u00057VsOr.\u000f_\u0012\"ePIZnܹcLz\u001c;x*\u000eʽ_^ꂳlv됯?U\u0010\u001fdެ!CX\b\u0010m-Q\u00139 K®\u0017rƉGQM俄`|H\u000b:{6\u00126\u0002BC5`Ov\u000f\u0012UL+nf\u0018S\"v\u001dSڿ-!xNAZ2b0Q\u001c*ĬaJ\fsz\u0019LHa\u001e5}GBp1^\u001aլU5U\\\u000b\u000f\u0012=u\u0018p2-7-\u0010L-\u0011Mc\n\u0004r\t\u000b\u000b\f~aH-*pq/{b\u0005\"z*\u0001S늻n w\u000e7\n++ƨoa)7T\u0000\u0005s5\u0019\u000eI;Y,Z,\f{%8\u0015\u0014\u0018\u001cB\\v\u0018{\u0001]\nꇆv*\u001c\u001f\r!r$\u0017\r\u001bc|OgG3H(j {Dy@\rW\f?/g\u001aB\u000fG\tmvrdhi\u0002qDW8L\u0007\bUy\u001dr\u0015~Fo\u0019S68T@@-^zʑ\u0018s*V\u0000Y\u0005Z\u0011R+V\\g}qĠh<+\u0002e֛\t\u001e:MfF\u0019/Q\u001aR:'/lPR\\±!p\u001d7gps\u0002/Ӫp^~Հ\n<|K*H;~\b0lL\u001crോ\u0015\u001eS4ڂ!Rm\u000e-cV;Ї\u0003}Kf-onH\u0004lFpL_S\nuy'T9!Tȸk|\f`b\u000b\u001c@+>p]\u0015f\u000f|qWBN K@gXr~|7VL_qQ6b\u0019\"\u000fUDpDQ!Ddݣ\u0012*{!Sħ\u001b\u0018A\u0011y)M\u001e\" uo//r*O>\u000b4R,E\u0015sLtt\u0000\u000bec\u0003\u0015\u0004ÄaEh0*7\u000e\u0013!>\bϤ,5T)84\u0017Gz\u0019U\u0010oZ&$\u0001\u0007\u001cT0 *rٱ(\u00151\u0006R5n K\u0017l\u0014tV%F\u001djqV\"$']YǶpdr.:#oM\f\"Pg\u0005Z[ [oRh0\u001cGy\u0004\t;!n?Y\u0004IN}z0a8\"c\u001b\u001e\u000f*\u0005!x\u0006f\u001c`q@\u0006%\u001b\u001b\u0004Y\u000fb\u0003\r\b2\u0018\u001c٦\u0015W.\u0013\u001dP9\u000f\u000ex\u001a\u00017\u001e:2Ulv\u0015Sr?sX]YGy^JqGqQ.N\u000ea&\u0014wN=Jߺ,m[9p e3e\u0001Il\u0011\u0017(H;,ȳ^\u0015f=q6ねy򐚕\u001e\u001c#SKu0]\u0011BPǊ6up2Ȳ9UoS@3dA EQ6kT>~KB\u0015GN*CK\u0010:gΉe\u001bD䎎q\u0018'SHDɱnY\bzef\u0004\u0003(nZ\u0006 \"qr=\u001e%\u00190EKϞhpn5Qٲ?v,\u001aXV\\\u0011\u0019\u001cn2*A l\u0019q񂚼\\z\u0004\u001f2\u0013þ\u0012Z5\"09\u0004O=fa2\b\u001f-kU\u001d!1u.\u001cPƑ9B\u001bT刦jz}m\u0016Z*M\u0007耷s\u001c2d\fZ#\u001dٜ\u0015\u0006Vmylf\u0013\u0012\u00127\u0003k%h.v\u0013\u0004|'Ţ$y\f嫧FC*\u000b\u000ej\u0012hzͤ\"d\u001f1\u0002P\u001bC65\u0007\u001a\u001e$+f\u0006SnA\u0005z>[)Y>̃\u0010њ\u0016qn\u0005v¤,8I!\ru\nJy|\u0012|l\fwOum\u001eM\u00035\bp\n\u0002\f\u001dI9a\u0019]]{\rzcf\u001e7\u0014)\u000f$ݬu\\×\u0018\u0010BS\u0014IՖ=\u0001\u000f}U{vʩ\r9Ar\u001c.u'e\u0015S1x~Dʅ'ٳ[&s'\u000eHײ\u000e\bIˤ$\u000fqVe\b=ػfZ+fˏCSw\fh!2,Uℯ\bWadBo\u0018g_\u001b?\u0001YiT)^*/\n^19\u001fuì\u0017()\u001aB=8$,@\u0006\r\u0001-\t)q\u001fbD´\"o/XA\u001d4eUP2m7\u0016ɖҶ\b\u0004CJ[7S\u00134~ ]\u0000\u0006\u001fנ,W=\fv\u000e\u001d\b&.a.UaK%\u000f\u0010iHDhQ<3᎐\u001dG\\9$I\u000fM[Z^Bt\t˥Y\u000bvn(\u000f%=^k$\u0017n\u000b7\u0015\u0010;k9]vZ^\u001fM{᣽RIEU7+#\t\u0005/{1\u0012\u00132!Z\u0001\u0006\u0007SB\\q\u0014.<\b\u00062s8-/xV\u001d[v&n\"]tczš1no:\u0016Q ;ZA\u0011Y㊖;l$ѩ\\G\\=\u0019k\u001cnD\u0018$YB\"o(v\u0001W,\u0019S@\n\\3\u0003H*\tO>ZBL\u0015rt-/Fz2\u0000볉f\u0003>s&ɑ\u000e\u000bŁ1\u0018dK\u000f2896*oa\u0018Tԅ)yF\u0002\u000bA2=\u001cC\u0016#\u0014N>\r\b\u001b4HL8iE!OҀ\u0019q\bҀJV\u0003\u0012ВC%mӚ\u0000+c\u0007P\u0004T$н\u0006eO\u0012\u0006\u0013\u000bzJ%{o\u0013%jF6')\\>g@(\u001a\u000f)GE?t-\t@F[\u0011\\9Oj_½>9EU*\\=R2MnA\u0005rvq\u0010#\b.\u001a\u0010Uoi8xyI<)wx!\u0016st$\u0013It㰣CAmT3l\u001a\u0006\u0018{8lǍ\u0006!_\u0001s \u0007z:X\u001cM\u001blb|\u0012p6b\u0013\u0019&\u001c\u000f\u0004pu{j\u0014\u000fa\u0014&\u00104[Iw\b_ |xd\f\u0002h\u0004u\u0007.\bxFגk\u0002|:GGN\u000b\u0015u875}\u0014>#O\u0013\u001e\u001eB|Ȯ\u0007Q8zJ@g<x,gES\u0015ZY\\b\u001f\u0005\u000e9\tN͖\u0015$!\u0012{{;Ӥ.\u0019RU\u00135$\u001b0Cd=oHʐ{\u000f;K#BkI82I\u000e:f}\\Wi@\f`  \u0002Q\"\u0001S\u0010_8A?\u0004b'z=n\u0004ɸcL\u001c6\u0007\u0007X\u001c\u001eqIX\u0012$#-\u0011\u001aw\u001a\u0011D\u001a\r\u0004IM\u0010[\u0011~|\u0007_f\u0013|\u001c\"yP2\u00156\u0019@?WDFg\u0006uA2\u000fH8+*iY\u0013\nmO\u001db\u0001B\u0007\u001f>+tu\u000egL,E\u0018+k\rX3YAʈ3\rT|Q\u0000QQV\fA\u000f!|4C4)iP\u0000;m\u0000\u001fE\u0017xН\tA\rR\"\u00041\\fDݤ6\bA\u0010 \u0015i\u0017\n\u000e\rN*\u0012\u0007\"ɚ[;JΆ\u0001\ri\u0006\u000e\u0013\u0002rmA+?#btT\f)\u0011\u0000\u0000pvT\u000ëKtuiV\u0010z[\u0002ZHB\u001dAdMk}\u000fs_(\"\u0019\u000b\u001a\u0010Z2my\u001cǧ\u0007n\u0015M}\u001d)\u0006c)Mm&b\u0005b~\u0005C`ZiN\\Sдb*A\u001a\u000e@\u00077K)\u00150fSgi1a\t:bNffNqV\u0017035HX(k=\u000f\"gA'`}^\"\t\u0007\u0007CBAj&E<\r<3(7ǃhxzP~q\u0013`mA5󿠗uDG\t]z[Ffq+\"ղ\u0007\u0016֊_\"OKJT\u0015W*>8t\r\u0014Ň\f<HxO$aL-C-s~dPj\u0006s\u000f\u0014HvJ.!#rݟt0ج<N\u0014Е<@\u0004a\u001bd\r\u001eol\u001dx+)\u0000Iy\u0015q%mX\\\u0005\u001d\f\u0011\u0000 B8l\u0000xjZF=\t\u0015\u001d\u0011h\u0017`\r13g3-L@1\u0000x\u0015;\u0005\u0014E'arRAf\u0011\u000egLM\u000eƱ(7b\u001awX\r!.a`K\u000f\u0017+[NŞ[,Lwy\u001b'!\"\u000bLB(\u0006\u0015߅U\"FOR\u0001\u001dq^ty\\#B\u000f;D^QOn_蹸ÐG6i\u001cM-\u000b\u0005`jA058\u0011{\u000bo5StT\u0015\\h`Kp<]b|̣\u0017OQr\u0011ۖ_n)\u0002-;8oe8ҿlɖ|\u0014:4Q%\u0014Z\u0013k-aM^-\u0010a\t.M@!I}B*Q!E\u001df\u0013\u0011(.\u0000oz2V\u0000cu\u0013^J7z\u0006w<\u0005!@n;q-,iU\u000e\u001b\u0017\ra\u0003\u0010>d\u0016\u0013B\u0007\u001aꎳďq7@dY6B:>X\u0018qƻEbՒ⺂Q/ӥND\u0018b2g\r\u001c\u0006V\bE:\u0007Ve_Ё, [}\u0002ȼ\u0012c'\u001dXv\u0007&[bU\u0013ѝ3'%\u0013Ӓ\u000b\u001dƽJ_AY\u0016@Siнò\u00109a\u001cbZ\u0001\u0017\u0015J.g\u001f\u0016\u001dML$\u0011F\u0007m\u00021<G:s6} ;u-Es\t0A\u001f&T݉7y tmso`Klʊ\u0015pJ86\u0014?\u0010(@'1ԉj4IL\u0000\u0007ae=݆[h^\u0012»C\rDt~L\u0010đxc,j\u0013u\n\u00052+\u001a \u000bzZCVVz:۱XBy\b~%Q1Fӣ\u0013wʩ8\u000fBg`1\u0015!O}\u00156\u0014D\u0007Տ \u000e\u0019\t\u000e?Z3\u001c\u0013Q@w42SI\u001a\n5\u0005\"sT\b793b6e\bLRv]D\bΫ\b\u0004XjB\u0015]v\u0000y\"$ϔj#iNKZ$\u00064$aؠD\u000b*\u000ef\fď<#B\"x\b\u0010c'\t@pC\"i)NƔ\t/\u0016;\nXx+V\u0011}(\u0004W#\u001a\u0000\u0006nf(\u0003JeU! S\n\u0014tU)wuvDM%cM5d*,\nFodWsν\u0019\u0015\u0012շ\u0002.+[\u0001AC\u0000\u0004:@$l\na\rr6\u0010\r\u001fT\u0013^\u0002*,\u000br\u0015Rq{^@\u0014#7\u0010nQ\u0000ā\u0003Tm`!\u0019ZC8:׫\u001dqA\u001d\u0013g[\u001e\u001dJ)%=8\u001fwJb+Jg\u0004ٱGÝt\u000f͈𸛅U\u001a\u0012΀\u0016\u0005i\u0004\u001d2?kOu\u00189.{R\u000e\u0005\u00047\u0011\u0014z\u0016\u0002RVodd$Y(\u0012dV\u0015pt\u0016d?\u000biRv8\bKW\u000f/D\u001aNF\\.\u0015w\u00186@\r);2\u0019\f3-j\ftQ\u001f%{C\u0014r=\u0003F-.\fS\u0007\u00121rG!\u0001g֠\u0016/\f\u0010aQQ0:\u000b?\u0011%X\u0019Mn\u0000}s\u001eV\t'!@y\u0002\u000b{cV!\u0003L|æ_9\u000f\r#$\boC\u0006\u0013_.9(gv26ܠ}\u0006W\u0011P`Ά*\u0017G.B].<=(N\u0003\u00010\fk\u0000\u000fJͺ[\r0>\u0013G\u0019$i|U\u0013\u0011^2?\u001d4pxZS!5^Aפ<h2\u0004\b\u0015mYE`9h4@\u0012c~\u0013EY}\u0018AykZ[p*0F\r\u0019\u001a/nn!ý,F\b4gyべNU\u0001D-28\u0015\u0013LtS+>\u001d!\u0018\u0018_VcJs<\u001d\u0017I\f\t\u0005pODa\u0013]1\u000epr\u0016a\u0013M2|S\u0005K\u0016$\u001f\u0006cP;wS\u0000%\",q)\u0011\u0001l\tF*圱\u000e\u0003*@g?#\bП\u0004u=$Rb)L\u0018\u0004Gdg8Wߩ\u0014U\u0003\f\u0018g\u0018\u0012|1ؿ-:ir\u0010n\u001b!SNq\u0003~l[TZa\u001eV?{\u0019R?d27\f(\u0019`JSt:\u0006\u001cje8te[g۰[N\u0004\bm5\u0007?ϓG9[>9X ϒ[w\u000e\u0018o:r+C77C r[\u0018n\u0004\u001c'\u0018Ycwv\tZgm8kIPT\t\u0017?\u001b-g\u0019a\u0016&e<\t%۱ɯ\u0012\u0014\u001aFjhH\u001fР\u0000\u001b\u001eB\u001f\u001fGzX`t\u000fE[-q\u0010{M/쑄Wh\u000ē\u0003w\u000eE$@3/꧂\u001a<&WA'OA7|zŹ-8uc}5;P\rGڅ;g'\u001c\u00107طzCz?\\vj0NxcbћyU*\u001fՔbQ.ӂy'ô)\u0015Q%\u000fzvpͺB측 \\v\u0001\u0017C[W[Z\u000e֯֋>4LNY\u00108ԬǢ\u0003b:mh|̫ϕ\u001ciuj\u0016^E(?*\fM.8\u0015\u0013\nJJ)WԭRc\u0013XO\u0004!:*i\u0001\u0014DњH\u0002$\u000f\n\u0002\u000f\u000e`C)\rqOYxޜ/ܣVlUy|g0\t\u001b1d\u0014iL_t RN4{-&<d)\u0004\u0012'ѭ%$a\"So\u001bWxpUk𳧁x!9C$4cHVX_d*tl]'eL\u001eGf\\8\u001b,O^1E\u0013\u001fĽ6\u0000\u000b/|6\u0011[s7*Z\u0014LDR\u0000\u0003΀T%n3*v)_?)p1c}\bJ\u001clXye\u0016Na\nsEޥ:T9\u0000_>\u0014c\nOOx8Y1g})qeƌTl\u0002\f{?\th\u001f_csYះ`yݻ,NK\u000e[ iݯ\u0002hІ\u000f@.\tƏnL\nOKOT(O\u000f&BSD,dҤn#,G\r8\u0006\u001f\u0017s2\u001c\u001eÄ`4ecMyOtx?jâ0\n\u0006XÙ%~_\u00042\u000bJ-;ɗ#*%bGqٶr\u000f\u0012a\u001cWx4C1)ш-A:_]p\u0015s!U)kHe>,\u0012\u000f6\u000fT9pg+<\u0015r<'\\\u001fv˗6RqOy\u0007aeIz!.qö))'O;\u000e.\u0018Y_to ta+s_jWz#w8\r\u001fڑ~IP0\u0017^.\u0007/\u000e:XH(\u000bs\u0018}H!\u001f\u0007U@\u0016\u0013e(\u0019$3$\u0017\tj@&Ic\u0003AEdRrW\u0007\u0010\u0010(:FtT֖\n\u0014H\u0019>aI3\tKi\u00115jFQ?\u0010t=S\u0006\u0019$M\u0006M4\u0003KP{6\u0015\t\u0012\u0000α]t֤Fxb\u0005μ&OKՒ^k$-k\u001fJ嶓G)\u000f$\u0006#\u0003@F' B\u0004V\u001b\u0000q\u0015[&\u001c\u0001\u0001* {\u0006@1\u0000 \n̹a\u000f\u0018)_?&ɞ5n;\u000f?U?\to&YE<\u00005$8\tΒ?!߿x\u0014/Z$y\u0002\u001dĄƞ\u001a\u001c5V `T\u0006\u000f\u0000o[\u0010U^QJAݺ\u000e1;)1ˆ61f$\u0002\bU\u0018&bL|XF\u0015ً~O@\u00017;\u0005\u001f:\u0001\u0001\u000fݬ$\u0002\"':\u000e\u00182)=o\u0016ԋ>KNcBw\u0002\u0001hɃA6'Rk\u000ba`;jAH՟?M-g\u0010\u0017e7Jٳ#Ɍ\u001acgmXBz\u0005p|X.;42\rv8~\u0007\\xoK\u0016\u0010qQNhJ(~bCsu-x\u0007\u0000\u0004\r=)S\u000b\fx~u)]\u0000^7l\u0000@:n\u000b^\u0005h~\u0015\\T;s)\u000fX\u0015z\u0014p\u0013z_b<Nk7{C\u001f\u0013\f\u0001wn`WNt`\\f\u0013\u000f\u0000n+\u0012eq:!\u000f$\u0014;<cXV\u000b\u000fM!Zp\r\u0003\u0014ca\n;2v07T\u0002\r2@?M@Rm\u0014nF׋\u0002dH\u000e\r\n\u0004PbQYj\u0014v \u001cЂFEP].Гx4^\u0018\u001ey\u000fm$N\u0000CJRUs\u0015Nj\u001148't< >-Z<ä \u0014'U^\u0019R{fEXU8u\u0015y\u001am\u0000+e]$(?ϷZ\u0018/\u001fd4\u0010:2?,\u00046d\u0006}j=\u000f[\u000e)~Ѐb[*3=f@%c\u0003п(\u0004^lE\u0019V>qXl\u0011qAHK\u000eғ%>8\u00135қRf=\u000bu\\De8\f^z\u0015.`Ɨ\"\r>e.\u0010!NN%q\u001ad0RmC\u0016M GNQ\f\nG.h2\u0004Z\u000e0j>Qh}$$ts@5ΡC5?I-טoC<OH\tjot9# \u0001]~K.(ň%TIUJ1\u00118\u001d\u0019$㨯J׼Nb\u001d\u0011UD\u0012ѫ\u0011x\u000f[Ƣ\u0000%\u0012?CMcFÒq)&P\u001e\u0016P\u001b&7/\u0005\u0003 x!>\u0005lMO+ s\u000b؀EUl˶\u00001\u001eh\f>\fA\u0007E^xs^N*J\u0014k!d&\f߹k\u0001\u0014BU\u000eVY{ڰgzX\u0018U I\u0010mjFJ;ěW\u0016>D\u0003R5\u001dZ\u0013)#\u0003Xp ֺ±r}\"a\u000f\u00120ͮ]\u0007'&NüA\u001fܔP\u0001\u0002O\u000b\u0004]UMu0w? :|\u001b\"2WV\\@{v\u0002?l7a/\f37Y\u000f\u0013\bOHz\u001fh֒mWr\u001c0\u00147m}`Q`5-pSB,uWG*fV>F\u0004\u0011\u0016x<>ǃK\u001a_O\u0005i\\\u0002\u0019c.~z7f書i\u0005gE\u0019\u0017\u00043\u0019ᗇN,\"PO6=9 HBDL;Ɗ@ݤ`e\t܇-n \u001cH-C<\f&\u001bT=TCS\\P<\t\u0003̻\u0016*&\u0002\u000175\u001aQ!\u0005+\b\u00113CMTM'R\u00105\u0017GY;zWj\u000b6y\u0000*)Ljp@\u0017-\r\u0006\u0001\f#YFW*j\u0002V`!PMc,\u00053N5Clq߷XXE&\u0004;] \u0000Da'tрC@ed\u0013\u0018\n&OGi\u000fÔ\u001bŏ\u0001Puu8u);u\u0010\u0015 Hu\u0005\rv]g#7}\u001eʇ9^xө\u0018$_d\u0013IyȁQ\u0018\u0012{ṭ1qN\u0006\u0012NR=Gw\u001cRr89H\u0002rG=0GYׅ\rX'ow`N>$\nF2@\"T\u0002%^\fq蒄p!'6#\u001bI`\u0015`\u0018\u0010iu\u0005\u0013\u00020oL\u001d6\u0017 \u0019\u000f3j^1E&akĨ\t\r4ac\u0011Ň35eXlG\fC)%,'+$\u0017~8I\u0016c\u0014h\u0000\u0013t/U.\u001a@{,uZr\u0005 nCibvޘ\u001cԸTWn\u001f@inPLh\u00156K'b3[>\u0004go\f+ ?,\u0014M\u001f\u0000:i\"\u0016\u0016\u0005P\bqCMn6rf+{d}&%\"%T\u0019dyYl̢=_wξt([ﭜZ*ɛ+\u0003(\u000f\u001d6\n\u0006w2\u00077\u0013\nXxs\u0010{:v&$m͜O)zK\tƘWqL\u00197?\u0007BL&+i\u0012\u000f'?۵tqEfY6/N-Jnƒ\u0010xO/c9eG\u0002n\u0016%B˧b9O\u001fpnXS\u0004\\]RZWF~xgÍH܈\u0007\u000f\b5\u0001\u000fe!\u001f\u0002}\u0004l\u0011\u0006~\u0003Ø\u0014nh\b&4a\u0000Z4 \u001f\u0012n[6TI±՚X͒V\u00028 l5Wy\u0000\u0011\u001d;\u0018ְj(P۬U ]z\u0001̝B(\u001ce\u000b0.\u0005f(\u000b9\u0010\u000f;N\u0015\u001f'\u0000D%\u0003+\u0003\u0014%t͕2iN\".\u0018=%?Z\u0013vT\u001dw+\u0002\r*>\rί[Mi8VAF]1)4a\bCT\u001bz4\u00074ezԐV:\u0011\u0017쉜:0\u0002U^Sf{xpiCxt19\u0013JSq\u001b7|bcݞ\u0002\r.\u0016\u0013uS\u000b7\u0006\u001d\r\u000f\u001d#\\ci\u0004?9!\\]vb%:`FElI\u0007[\u0002Vľ\u001fL\u0007l}\u001d7\u0005\bՇ\u000f;k\b*ܓ\u001cO\u001b(n\rl]8`;fFV\u0011\\#a+rח\u001d\u0016\u001a\u001a\u0014E\u001f\u0005g)\u0012/(|!|B\u001e*,C:ݘ\u0001\u001f˩CE\u0000f׋/Ǌz>HB\n^\u001e\u001cƄSOҹ\u000b,~앥~\fKV@\u001beg, x\u0003B\u0010Fҗ,N\f\u0006mg}wv],l1(\u0004\u0003-\u0017OL]*#\u001d\tVPeԏ}\n_XV/tث\u0012r\u0005eZ=,坥r ڒEBB\u0012s}\\e>\u0013(\u000fD&bk7s\fwzEs\u001b\u0006ߒO\u0005I3(0\rk![\b:\u0017TD\u0014pDBc|y2i\u0012:\u001ci\\w\u0013\u001bA\u0000`\r+O\tŦ\u0017>\u0017\u0018B\u0018d\u0000ԚDxSUSymdH\u001f\u001bpFv_>i\u0006Ia|I㇢ϣW!r\" \u0013\u0013\u0000|+ི\"\u0007F!C6r\u0005?\u0003\b\b\u001b-m\u0010fݓdpǩ\u0002]\u001b\t\u001d\b0m_\u00169\u001e66-\u0011(`\u0017\u0014q\u001fue҆_[b\u0006>Z*U\u001cAl\b %\u0004\r\u0014@\flRΕ4jAd+gL=Zgּ\u0011\u0005CK¸7\u000e\u0012e\fIXC/\u0005+hH#.\u00049<0\u000b\u001f\u0002|[q:J %cB$&@j\u001amRM6m=K8\u000bpH+γ'`2@jjqT0B\u0011,蟺9eKE<r3e\t)\u0015qҞ(\u000e@0\n VU#&\u000e'ͬ\u0007w97֓1Qla'g͎S\tGRs\\ѭ<\u0002[7~\u001cRΒ\u0005Z7cy<a$q\u001b\f-3*\r2\u0014^[.v'{|\u0017`G<7Up߇;\u0010҆n΢\u001b4+:t^\u000597A \t$\u001eskǄy8jiR|-$\"qE%!\u0000(G~O*YM?TZ2\u001d\u000f]\u0013GpI4a\u001cᶲfKQĿFІ~\n\u001dg\u000e\u0016rIUޑG琌&Y%)d\u000b\tϐʊU8\u0004o1G\u0004tCQ\u0014o5(%\u000bt_.ߔ(k|XXFC[ӛ\u0016qX91:@,\"H}}h.4_3\u0012ˏ/\u0011$rR~{7. )Yb\u000e`\u0004\u0010\u001d}\u0017Ey[59X1\u0002%ࣽÊBY\u001c\u0002m`X1zf.0P?\u0002p\u0019'3\u0003&}h\r\u0002UܓE~jC\u001cַ)T\u0005K)ep\nh|趁>.\u001d$Z\u0016r\t3\u0016wF\u000b׃T;T\u0003\t#?\b\u000bI}MFajx\u001aɰ9g!hͲ^&Y?x\u001b/JqjTq\u0010\u000e.0~\u001fc\u001abxk2\rynkEks\u0012&\u0019v\u0016\u0019,L\rS<$\u0011\u000e\u0001lZf\u000fhMgz1h\u0003n-7x\u0003\"NQ\u0003y\u0015P,\u001feM\u0000\u001d\u001fh\u0007(5\u0015Hϩ<7_ʍ1\u000e!t\bM@p,Ymڅ>e9pUI\u000eZ\u0019\u00144l0K83\"cTbCYhʹ\u0013\u0011\u001e)yɥ\n\u000eT^C7y\u0014kN\u0010K\"\u0000\"\u0002:0Ìv\u001dMX>:9D`ll)>Vrg\u0011\u001b.آt\u000f\u0016\\Kzt8'н8(JB\u001e4:==]͠\u001fWk\\;X\u0017\u0016[\u000b3D)\u0000=[ӏb\b\u0012)ly\u0011-b\u0000%H࠙)y&^F}\u0010\u001dS(vb\rgp\b)J.Rx\u0019/\u0005\u00062\u0018\u0007+.b&\u0003f\u001f\u0014\u001d.\u0014\u0011$\u00193w\bW\u0018(WoT'ԼgutH t9r1Nu}r\nP&W5BO@\u000bl*;\u0010n\u0014%f*\u0001pMЦ\u0000\u001b\u0006&\u0013ISח\u001bmh*_,`w3r2\u0007\\d4uLQX\u0000\u000b\u0014Ͱ&\u001eO\u0011^e^\u0012=4-FtZ@\fZqʚb\u0012+y\u000bZi|ʝ\u0002J{ׯE4\u0001(:7Y&\u001aQr8xO@s\u001eID\u0015\u0014ٻGX\n\u001bS\f9GGt#QXM$!D\u0006\u0005ߐ,\b}Z[P] \b:G͜f]j)L::=)@N+L\u0006-\u0002v;y5fp\u0018#I+@}0w\u001f\u0004W\u001a(\u001a\u000eS yHM(8K<>l$i]\u0016.Qb\u0005&4\u0016\u0004EC\"\u0003iq?̩)\n7Ȥk\u0006+\bq\u0002ƬX_D\rl\u000b\u0005q\thxP\u0002\tsې]'=zQhԚ[)\u0013BNo`c\u0016y\u0002\f48KC\u001c*\u000fUJCQ\u0007\u0016\u0002\u0004ag4~n~@`zC\u0018/ruIqđD9+Ljhzv\u0019m,dXXϺ\":SS1\u0000C\f~'\u000bP\u0012y:מZZMvyR\u001bߐa8`׆\u0000t\u0017s}]\u001d\u0004x\u0007Fh5XpiK&KpYW\u0013\u0014\u0002P:W\u0002\u000bXLfEdυ\u0005SB^y\u0005\b*w\u0003݁`Kf\u0010tC'8oM:Ag\u001cp&ug}\u0003cɞ\b\u0000\u0015\u0004\u0019\u000fҢ\tX!DO@\t#\u001b\u001bǘnA\u0006\u0001F\u001d}syአb@\u0011zF$\\\u0007qct-Y{\u0015\u0013B1&\u000b^\u001dlW\u0007\u0000|\u0002\u001fu\u0002\u0003\u00112\u001bɘq)\biUA\u0015\u0010R\u0000՗PX_mFǎ\u0010$P}\u0005\u0019\u0015֪/jU\u00041~\u001a\u0018XlJVz\bD،lA\"OM}\u001cC]F)`D2\u0013.\tz7u>֐\u0003R?,\u0018$\u001c\n\u0000q)AO:=1d\r\u001f{<wrOۙj\u0007VG8a\t\u001eb*\u001f/H;)Hx5tZXJ\u0000j\u0011y+\u0000\u001c\u0017>5͚\u0007\t8 .\tbp\u0005b\u0006`A\u001ag%\u001axJ\u0011\u0001F|2\u000f@bgi\u0016i$Xݗ[\u0000\u001cpQ=^$Hs\u0001\"yTl\u0010\u001b\u0010\u0014r0ʦ\u0012RwVH\u0006\u001cDP;\"ڴq\rj\u001eOYx \u0019kuٕNz%],ȸ1\u0015\u0016~r\u0006qbkU^\t5jhU[TD-+6\u00155ү\u0005RG`7A\u0002\u0017\u000e.rwpm\u001c`5\u0004\rim<\u001fM\u0011^mDl7)*\tG`3t/\u001c3\t˗ӃZ\b\u00158\u0010!\u0013.<:Fj\u0004i!VE\u001bڛQP\rZY3^\tYxʱ4[eԥ[\"5w#IŽ|\u001fq%0$&\"O20UZX~\b\u0019@,zytLf`׽V#-L\u0007w\u000bE\u0014kozK>4Rh枫\u0017\u0006\u0018\\]\u0018Zu\"\u000ba+\u0000\u001e!cɹ<\u001e\re[&u Q]\\R\u0015AVA\u0015k\u0000{KnO-2\u001dߒ\u00150zlXuʘ/{\u0005u*|\u0014L{\u001c\t(\u0013Lt2\u0003sp\u001b\u0011\bA\u0000K^\u0012\u001e<c\u000e3mԵ(\u0001-Š\u0002\tQ\u0004kH\u00011N\u001b~a\u0010PߕQ\u001d(S6@\u00061@\u0004@dAǽ\u0004tNaBҦ!:ɗs7\u001fq\u0010u\u0002v^*\u0016/<(&Rui\u0016ga\u000be@\\\u0001m$Cc\u00002\"\u0007ZM\u0012Y8ty\u0019lYz\tĠ0Dի7G;Ԏ\u0000w)2\u001f4 \u0013|\u001e2}w$<1E\u000bj\u000b\u0016,-W2\u00173kz]^M#k9\u0015\u0015nMR\u001b=حN;ҰSd5m\u001cHOUx\u0012δ{\u00134S`6\u0000\u0019\u0000=G7*#z\u001fg^\u0000bj\bo=\u0010\u000fhZ\t\u000f5Fk\u000b9#<0\u0014xΣqWw\u000f=NLOq@y8\u0013t_\u0017`10a2pNWRQOœj4=\u0013Mťcs^tW\u001bZ[\u001cB\u001b`\"ޣ@`I\u0014\u0007Bcd9䶷a\fۇ \u000e\u000f4t\u000f~Κ\u001f\nNSa\\g, !5'ۂ6\u0017H(C#\u0005Ih\rIfV/O{w\u0005T\n\rУ\u0011\r8\u0012\\d\b\t(We\u0006m:\u0006h\"<\nٝ7\u0004PEm1\r\r\n:&̯\u000b\u0004boFSE\f$\u000feDB_\u001bwyT.yN};F\u0005\u00062PҤ\u001d!q\u0004*`)׃b\u0005\"hf\bh=nYQo#qRT\u0012\u001aJM\r0h\u001e\u001a3ow t$P\u001e\u0014\u001cWk,QA^#1*\u0010xvtUnl\"\u0017o\u0019uN\\\u001czX4)\u001ah([pϋ\u0013}F%\u0003PXXK=G4jiK\u0015l2i܏/TeSJ\u000f\u001emgT\u0013ILS\"\u001391\u0014\u001dÜƺKϦp\u0019\t\f\u0016?E9w\u0012\u0003<\u0006\u000f°\u0012K\u0000B#<oQ.\u001do\u0007=2\u0005=wre\u0015|b^,()\u0001\u0017ç\u0007\u0003\u0012\u0019<e4\u0003};\u0012\u001a/RH]\u0002ҿ*xFt\u00127.AP-Ғk\u001dxNFU \u0002e\u0017b_)6\u000eh&\u0002ǯ=\"\u000bH6t\u001fg6Dȩ\u001a~\u0002\u0000:^-~q|xDFѐhcAڦYm\u0006ЌGʕ_m*~R\u0018$%mW\u0000(\u001e\u0015cOkB\fGni0j$v6\u0004\u00109@\u0001v\u0002rMjt\u0014\r\u0001@&\u0005f\u0003Xv'Rg7ɭdlEQdd0KE6s{*~\rWIDh\u0011<:VėTO 78w.:әjR=\u0003\u00056U'ۅ\u0012B#l\u0011C3ϒd-\u001cI̸;9^\u0004WJgy\u001c&+ݥǔ`\u001fL\u0019U<`sH\u0012\u000f\\\u0007iۄ1}yU\u0010\u0011\u000fqi$sU\u0016\u0006\u0000Z\u001fhPĴ;]q\u0016E|\u001cBEm>ŦIG2\u0015`JQڛ\u001d5kr2\u000fJ\u000fxu\u001d\u0006E~?i>\"_y\fvHyjcN\n9t\u0010\u0011ޢ\u0019ibJ\u0018q-T'Н3Yųb523n\u0006e\u0003,y\u0019B*\u0012[P}D\r\t'\u0011N.v;s4hFg\r6\u0016=\u0011\r\u0007V\u000e>\u0019\u0018ԡX'4=WY\n#kk\u0013Y\u0017\u001b݃mP$Y\u0004\u001dJ\u0001A8/\nOv龃}Q\u0018\rj\u001b+ץ0\u000bDBh:|\u0001\u00157\u0010\u0001n\u0002\u000bld\b\u0000}G\n0\u0006HB)d4EX@!\u001bҲrs3:ـF\u0011r͒Խ\u001b\u001cLg!\bL]\u0011P\u001aMk\u001fz,!4:u$\u0013hZ(dCrƻX.}4h\u0016~Ћ_E\u0015\u001bBZc\u0000ʁ\u0015ԉ\n#[%\u00126A(.'|\\&\u0014#IOcq\bϪ\\Ql0\tŔY<?B\n\\|\"6zQ\u00067R2Ř<'\u0004\u00114>A&@۵a\u0001\u001cn@h6p L>`u\u0001`<ȅ\u0002A\u001c80ӑ&ጚ<ɍ\t9FĦ#Ntʈ\u001eC\u0003킭4\u001ek90ۤ[LTc9NHf74g^\u001c\tq\u0003^D'N=\u0004SZʃ\u0017\r\u0003*\fU`ۛS\u0004\u001e\"Ixx19\u000f_}\u0019o?\u0007p\u0001YXH`\u001e\u0013pE\u0005\u001aOȻ\u001d6\tR\u000eC#g aZUc]`w^=L»+d\u0001B#L>u墾\u0016ǣ\u000br\u0011O\u001dtd\u001dFN\u0006Υ1e%ǐ¿pj\u0002\\\u0000{k^\u0004ܕM_\u000bZk?t\u0014VkDl1g?35\fR\u000b%彉\u0003nn%aM\u001a\u0019s/i\u0016ku|= j!\b\u0002\u0000\u001cM-\n\t\u0002\u000f\u0012T\u0000MTNYeF\u0002\u0018]S_\u0004.\u00170\"o~\u0003L\u001b8g\\ѡ~5\u0007myhO{Uf!\rN\u0016;:tGr*4^\u00150h[<\n[p6HD\u0013 \u0014\u0018n-W\ntǚvI\u0013F\t<2c\u001dtB>=u.\u0005X\u000e\u001dŰR\nhRȉNԭ\u0011\u0006nLX5%l\u0004i?;\b8sɰF\u0011%ܷhV+7 <IT&\u0012wt\u001b\u0019S\b\u001e\u0007\u0004\u0010yyċ|O\u0003\bW/\u0019i$б1$eD\\;\u0004yB]M$h\u001d?ٵPPbQK>\\aQN\u001c'\u0017T\u0002=û\bdD{ݱ+ޅ߂|5z?@\u00113Wi-6?e(\u0001s؃\u001dH~1\u0006 S\u0018+`h_\u0018|1zӻt5-:\u001dX\u0016'yYyb?D\u0010ΡR\u000018ا[X<O1h\u000f\u001c#i7q]U\t5wuBgkDmԘ^Tp\u0003a8\u0006KM\u0018tg<[\u0013j*\u0016\u0010o\u001c\u0012ă6tdh\u000f**\u0005^\u0011N=7!uڂt1b̢J\r5`\\\u001f\r]&\b8\u000b_Uy\u0015\u0005_03n#e\u001b\u0007s!!ąw0WŇ=\u0017S[[Z@@s_8\"ݔ`\u0015`a\u001a3`!kẄn<\u0018\u0012\u0012ǙWC\u000e_=\u0015\fkK\u0002%\u00194ʀe\u0015/<\\o[H\u0007Tab<zUF\u0004\u001e\u001b\tW\f\u0010\u0004Lԯd*k\u0011Tē2l\u000f1>݈zt0\u0001 'eC=.\u0007\u0006b\u0014J\u000b\u0007\nT\u0016Z\u0007i\u0015j1 ܬ^{DT\u001cv`\fV1\u0005Gb\tr\u0013[`\"\u0005L3>`X(6˥\u0019Clfn{\u000fSũp\u0010&Lp:P.\fU%⭱.\u0013u\n\n,f\u0019\u0006\u0007k :;\u001d؟?\u0010#\u0015z}[~(P\u00044'%0*&/xGXd\u000e4+mɹkS^p\u001a#\u001ceݽ`E:>\u0017u0%fÐ\u000f5jz\u0017i6Q<ͬ\u0002SN\u0002)yq\u0005#<*Isu\u001e-Zav*[ _ۦYM\u001a-\u0017mM-GQH+r(EG\r+XH \f¤VN\\\u0017m?\u0004ChȁsJ-]\fMֶe`֍ a\u0005\u0002\u0003\r{3\u0015}6o⵩4[*sMfYvCEA<.53\u0011r,O\u0019\u000en$\t\u0019唉@\u0001-s% w@8B0\u0019.\u0002c}Br\u0003Z}ḷU\u0001\u0001\u0002{\u0011\u0012p+yoJ)¬,\u001f\u0000!TC*ĵ@G\u001f>ި9\u0007\rei9Pg(\u000bg˒Qyؗ38<A'Phg{>\bF\u0013K%ҝ$\u00130/f\u00006g˟bau\u0004ɺLJW\u000f(q \u001e\u0019\u001a\tÔ\u0011y偻\u0006\u000e\u001d\u0019N҂U\u001f(>\u0005\ruۋ\u0004q\u000b@٨RL9\u000f[\u0003w(v\u0010^1\nVqMe)\u000e\u001bAyu'g{\u0001s\u001f1PH\u0006&\u000esjV]\u0001wL!T=FX,2B\u001e\b\u0000(1\u0010x=a=\u000b|,C\u0017%\f+W\u001fMԮ㍦K3yх{\u0004ņ\u0003)v\u0019a밂\u00010+A\u0002S%}Z\u0001W\u0019\u001e$@0(8A3\f \r=\u001bn*\\e$ŉ\u00000g]\t\u001eSx(6y\b\\P G\u001cZNPЭZtI5\u0017go?8\u0017\u001c~ր,\u001e\"w8\u0001\u0002rn\u0004AU ^\u0005@C\u0004q~\u0019zbS\"\\{Y\u0006\u001d-e0~T\u000e%\b\u0001F\t\u0018~Q\u0013VPs~M\u001b\u0002$ț\u0016\u0015x+,*\u001fkvnVv̓^\u001a3)+wJnf9ܐ\u0013/\\\u0000\u0017\u0005?}W7~[jS.<ـ5\u00065TM\u000b\u0001gIh:gHKgL\u0013^Fy7$\u0013\u0018sOc.\u000f0JXL\u001fX2\u0001K\u0010p\u0005<32#)lq\f)\u001d5c/BFmF*<k6V|`2\u001b7\u0005{P0\"ɏ\u0012SF\u001e\u001eXs*\u0011\u000fSЗ6\u0003'&\u000b*.\rGQGi_&H\u000bRjx\u0002\u0011\u0002\u0013\fD\"!p\u000f\u0012@P~ډq\r\u0007va\u0007y<;\u000e]OĜ#ܓ\u001cN\u00181R1ҡ\u0006\fFC:܃\u0019\u0001\\\u0006\\C&q1\u001evPSoN]\b9\btz\u001b&F!0O\u0015xp6s\u0012,#,ضbt\nB\u0005JxM\u0000\u00196Lݧ\u0016&\u0015D$)o'}d\u0019X)T\u0010F\u0018#u\u0010\u0019z$\u001cݑ9:\u0012;Hx#a\u0010if3\u0018+\fH´Bۻ#XMVH\u0014r\u001a8p,!i\"E4_\b\u0002<Я\u000e\u0012\u0002\nՐɠ_(\u0010\u0010BG@I!4`@KA\u001e\u0017\u0014&\n\u0017AB;P\u0001\u0006N\u00024 8\u000f\u0003P=;YW~Zׅh\u001b>]\u001d1oߗݿM3ѪSEVU\u001f.JsCܜCl>>zUf\u0019E\u001bd\u0013hͶa\u0018F(\\Yld4!#\u0017m\u00162\u000b4\bx5\u0004#T\"=~=4΍y-\u001c0a\u000f\f_W!_\u001aw݈.{[怭IKe`,\b\u001e`WZ:yؿjHF8\u001dGK<ygP\u00074E\f\u0016v6\u001f\u0003ݭ\u0011KM`T,Ϳ\u001fOºPIh+\u0005>ץi\u0011\u0013܄F\rVaAns\"Ȳʛ,B\n\fh\u0010C_0\u0000&¾GW^gkTW'Wi[Ai\u0018*\u000eҨuΊa\"+\u0019#WUǭ\"jgTI*%,PB\u0003Kb>\r㝲Mlx~\\0ޒ\"Z)r(%hIb\u0018)ĀT:҃5j\u0017uHEP\u001cP2\u001e;CB2 \u0012d\u0001Ү@T?I腞\u0004⺣+'|\u001d\t(\u001dgNd\u000b\u0018#j!m$F篆i\u0004Eh$f\u0016]0!\u0013U\u0018\u00000K\u0010uF{\u0007p\u0011&JE<+\u0012<\nK\n0gC\u0011hup\b:Nh&pIDm\u0000ʎ\u0018\u0010+_\u0004\tI$\u0010\u001a\"\u000e\u0001c~t\u001e2\u0007p\u0013D\u001fo\u000e&\u0018\u000e\u0015+\u001a\u0012`F\u0003͌\u0011h\u0015,a\u0015])tB\u00105\u0001J(#T\b\u0011<@9h*7\b\u000bi\u0000t]h\u0010\u000b^\np5\u001f :\u00134 \u0006pr2ӒL=!h8\u000bt\b\u0014G\u000b\u0000\u0007ڿ\u00127Y}ڿ?zi[\u0007\u00001gߜ|b\u0012\u000fq'e~hP괹\u0006sӍ9\u001d\u001dzB\u0013z}n)=gUgCqMh0j/\r.\u0019E5;\u0013ft_)\u0016 [z\u001a[y\u0014flhY\u0006gh>\u0015C<'?\u001fpܱ\u0014Śj\u0006 lgࠃ7.\u0000/ʧ:#iU\u000e&E}&./s;8I>|Ԭ#ѹ\u001f\u000bk,6*\u000b<\u0005l\u0015sW\u0011qYSa`\r\u0006\u001cpxq\u0018eS/թay*!<\u0017~I%P\u001cM\t[=P\b2qˍñ̔Ϧ޽VS1/\u001a\u001a\u0003ODi)\u001eKy'/U\u0004\u000b| jF\u0007́=顶\u0013^\u0013XQ!mʠ}7+0\\φ5Ni\u0016F_S#L\u001co\u000f\u0010<K3\r2cĀ\u0017(\u0011uI:qLT@F\b\u0016Mf\u0015EpY*\u001f>vǓ8\u0014iJ`[\u001f%\u0017}\u0002֗\\Ez@:\u001bSzZ@0\u001fOoʕ\",\ti5Cob'\u0019xtwqlD\rƪ\u001fZ&$ې\u00004FMZg\u000eVNlx>\u0001$jQwI]״C\u0000!t#\u0018<g\nfb\u000blxW\u000f6\u0000΃.6\u0013p(}YO\u001f4\u0019\"b*J\u0000{E[G%z~@X\u0015J\u0001\u0017t8th\u000ffz\u0003\u0002K>m]y\"s\u001epN/b:氰\n,\u000bâ\u000f\u000eA:W,\u001aQ?\u0019x=\u0004#JUTb\u0004\u0014Lw-4tw<\u0006wlU\u0015ajCjMI=3$\u0007\u0001\u0007\u0005z\u0000t?,Hl\u0004*{$Fa_(\u0011\u000b:aB[~\u0014bZr\n\u000b\u0015WLz\u0014V!̗ӫ'>Kks:~8\u0019#\u0000T<n\u0016\u0011A\u0017[H\u0018B3\u0001\u0016#j\u0006\u0012e\u001eT@]R:\u0014 րC\u0006Y!7U?ޛ?\u0000\u0011sB|A>\u0015!-̙ #67{q\u000f*~{\u0002Luu:CܣRJx\u0000\u001fgI\\ɑÄ%\u000e<0\u0003G4d\b\u00021\u000bFlQd\u0007zY3\u0018J\u0015J\u0001ȼ{j5\u0003pghB\u001c?\fi~\u000eB0!y]\u0015\u0001m\r˹\u0011˶L`93N\u0017E]'\u000b]5>[{;\rʰ{9\u0000ia\u000e\n\u0013ڜxzb!v:tϻVkiXa\u0011epNˬ\r\u001båR\"H`HpuMjQ/LES\u0018/{\u001f7eS\u001dd1J9و\u001a\fX\u0005QB\\u\u0011J\u0018\fەkT\u0007l@0bUD=^(DN;\u001b,Uh\u001cd\u0016>\u0003߫՘\"aZ~H&dx\u0018\u0004\u0013[\u0012\fN2ԞNɶkXYLBɶ\u0013\u0010:Ҝ\u001cmfѡKb3\u0004MH\n,;\u001f7:d)am3b\u0016$g(9H\u0012``؟L{\u000bQ\u001bknЪȟ\b6\u001d.=5eUwι\u0004l5\u0000ђÄIS\u0015's)]x\u0013\u0004\u0007gu\u001f0e2\t\u0002h-\u0006-O}zb%O(m\rKzDïLF\fVh0Y9r (]\f\u0016mt#u\tYf\t0\u000f\u000b$\u0001\u0006N6D\u001c\u0010M\u0001\u0014\\BwF\u0002ri-:ż\u0019ҝbe\u0002q\u0006\u0002`X z\u0001ft3*8O\u0019\u000b\u001fu;C5-~bm͂Y`u~u\u001b^^ΰ\u0010b;9u{/\u0003(\u001a\fCT'B\u000fd:7@\u0018W !\u0007>\u0019@ד\u0017/m*MaXMAtfH:Ɔ\u000eP4l\u000f\u0006/\u00169e/\"j|Hy[$\u000fǊ,H\b\u001f[\u000e5;O\u0006\"\rne?\u0006M\f+O76lTf\u0019\u0004\" \u001c!NM\u0005N\u001e$\u0014]b[D_B~=U\u001ba\u0000 FxߊJRye Z.)\u0014\"\\mT)\u00027d\u000fOLf[\u000fs\nDܣo 8u\f35}1ܥ}2\u001a\u00153:\u0011&\u0017D\u0003yj\u0016dܫ.pf8\u0019v$\u000e7@\u0011R\u0002eN)\u0014:\u0019y\nǲ\u0010\u000b\u0002\u0005\"\u0010Lz+rwB\u0004 \u0018T3p\u0005\fyJ+ѨR`\u0005Q@O\fڡ;Q\b\u0018\u001e\u001acI10\u001a\u0003\u001fRx+#WA&!EDU2$\u0004?\"LbCh\u0007s~\nk<\u001b\u0011@\u001dH8\u0007\u0002w,\u0016'\\s~v\u0015\u001ak\u000e3\u0005F\fwM8ݰV*B\n]֩\u0016\u0014\u0011 F\u001at_]Ԕm\u0006\u001fb¥\u001eӨ̝!t\r4\"\fY\u000e^e~'4\\tmq\u0015,\"/43\u0016\u000bƿU<(<{d6KR,\f1#D\u0014LEjxSv\\\u0000\t|Ưp\u0007\u0004ؕ&:?\u0019b\u001cQaa\u0017\u0005df\u0000%>Lp\u000bdi3\n\u0014.p@UL\u0001:0\u000b\u001a=Ol}.VWp@\bĉ7u\r\u001eIs#\u0001z8n\u00158>|\u0017sB_\u000e0.F\u0010!IMJM)8աJ\u000e?\u00018Z@\u000eU\u0013YFAbY\u00139+4\f'A#-\u001dØ\u0005\u0014\u00179!^{\u0002F\u0001Abq\u0000\u0014bq6^aIXC8\fi\u0002g\u0011\u0012)\\6\u000e&\u00016]}̨5\u0011f&9q3GN\u000e;i\u001a%*;IX\u0016Y|mLҪ\u0001<7x44&P@t8\u0002n$H\f\u0014x\u001f!\u0010:K\u000fip\u0015\t6Jv@25ޥ\u0003>K٨?[\u000b#`\u0002MEH0iқp&UQz\"^F,YCQ\u0016\rf(i.4Q!оkge\u00000rR\bj\u0019\b\")Qk\u001c82DUM{oz7$>,fH|.\u0014\u0012ǡ\u0011k0\rtN0\f,@\u001c0\u0006\"r\u000bSZ\u0002OO\bZ\u0000nE&:\u0000^\"I2RHj,vR\u0017\u0000ӓ\u00078j,_0ђBd\u0001f#v䰵GT)(\u0017\u0001\u0007\u00189\f4\r\nendstream\rendobj\r18 0 obj\r<</Length 65536>>stream\r\nPVe)\"}*\u0011?v@Oz|t\u0014䥟\u001cWAb{\u0017M\u001b]3kf!yŤx-\u0014\u001cDIÁ*'(nE|\t!)\u0017˻jɂ\u001e\u001d.@3DrvqPg:z u\u0012\\\u0007nZ\u000fvla4\u0013F\r\u0013f^UBD\u0001^\n֌ț\t!@\u001f\rE\u0002zջW@lqY4\u0013\u001db\u000f\u0010I\nKnD\u001fۀ,q;q\bE\f\u0012ĵIYسWXg'H:>HP1`ٶ}{*\u0002#)h\u0002:̒!Xw_eJ4\f\u000b\u000b\u001a\u0018v8ɻ*Y\u000bE.cUpVY8\b\u00074*\n\u000eA^\f+r.-\u0015 .6.%\nmNStܥ3ۉ\u0004\u0005>4\u001c\u00197O\u001fa׺\u000e\u0017M_3\u001d_^3K\r1x\u001e'&j$!ox\u001fؒ1$Ni_b1\u001c\nOˊ\u0002\u0001͏@\u0015\b\u0019D\t\u0000\u001ez\u001bXo^\rA@\u0015/{-6\\B\u0002KkV\u0011,?z/V)i\u001e\u0002y\u0014$v\u0013\u0005\u000eh \")\u0007\u001fV[%^[BYn˭Y!jܐAGG+Cc\u001f-J896\u0007yT\t\u0006=/t\u0010\u0018\u001bA\u0005Oޥ\\XTŊ|vXw}\u000e82j\u0001C@ɉ|\fq&R\u0001`J#W\"\u00169rCqg?=0n\u0003\u001f^є\u001bcA\fL\\ L2{j@5\u0000ۣH[H>x$)ϛF{\u0011.\rFΣs\u001bW^\b\u0016,?{,dÅ&`72!j#\tM8Jzju\u0011\f`j\u000bc\u0005UX\u0014V&\u0016\u0001v@S\\o~ZA-\u0006SS9i\u0013\u0000t\u0015_o?3\u001ca&Y8a ph Gj릫\"\u0016zxЋtL\u0018vvO\b\u001edv\\ZP@F J\u0005Ǵü)'\u0011y\u0018\u0017A4X\u0002+\u000b?Asu/\"\u001b cqQC\u001d\u0013)]wL׊ѝ5||/D43\u001f\u0013‌p\u0005ՓF`N`@bJd2]P{O7U%i#m*{kPp#-\u000bI\u0017\u0011,\u0010ci=.ЅfQ\u0013\u0015n?nzj\u000bݭBOSYr\u00012Z\u0003OaXutQ\u000f\u0006k\u0017Ե\u0019D~\u0000X1tI7\b\nI\u001f:X\rp(X>\u0015^KqinH9񚟩jAj1C\u0018&ӎ,*\b\u0010c\u000fD\u001bzXB)\u001c\u0013\u0004Ԃ1T^_\u001bS+TH0儴.\u001e&r\u0019?\t⵿Mz\u001d=̛*?#KCB\u00183U&X+7\f9\u0004\u0016fYH_c\u0014s0\u001cb4/\u0014^Yi\t\u0003r8yYf\br\u0015=)5\u000eD{6\u0007\u0006\u0007EeAT\u00010ebs\u0013d\u0018<o44^lF\u0000J\u0006\u0005a?\u000b=M\u0014\u000fX\u0001M߿(Α͆BuBP\u001f4ɥ>Uy?6ݢjS|QhN\u001a\u001bĉ`\u0012\u0003֢}w@ŜQB&Z\u0010(kd \u0001rfע|\nɽ:\u001f\u0003\u001eھHXi&ٗ-T`\u001dd=\u00148Uӣ\bbߗ({2iVs$\u00069X(]L.\u0010\r\u0000]\u0014\u001d|\b  (L\u0015,\u001eB\\LkC\u0015 lx+&?BP\u0013Q󧩻1'\u001edx\b\u0019\u0016\u0005\u0016\u0010\u00109W\u0016T7 \n%\u0007m\u0011N?\u00102*Jɞ\u0018\u001d2Ԙ9=n2\u001a%D`\u0014X%H_e6\u000bq0·\u000eʃQB\u0001F7f\u000e6-VrDt\u0019P8_\u0016-qaH\bL\u001c|Z-5VUVi+L\u0003ds.k\u0017\u0018>]tG*%Nw%MZ=z\rRB\u001f}\u0000ŦxN;l\t\u001bQ\u0003B[}A\u0006\tPB\u0004\fGV\u00077ݺ\r\u001cn8݇O_W{5)ӹL9eV;_6\u0019=\r\\\u0015z\u0012f\u0006\u0016f?\u0014i\u0007Au\u0012\fE\"k*;EwPs4_=\u0013Z\u0018-;\u001c^ <=\u0019z\u0007\"\u0017\u001c\u0017>JZY7\u0018\f\u0000YǌenDCwN5ILr0\u0011\u0007\u001e\u0011x\u0017%\u00029uF2t:G&I/֝mɄ8KpD\u0004A\u0000n\u0013m|3C\u001f5\u0007MVz*l:f(\u00162\u000fi|x\u001eHa0\b\u0003xvIqo5^s:\u0017^'r\u0013=g^\u0018\u0010\u001eκ\u0017?\u0011K_\u0013NC\u001cΣ\u001b\u000b* \u001eZJ\u001fl7%ӌb\u0005fn\u0013Ȧ> ;?sAu\u0004\u0010濧o)QJW%:\u0016=\u0012dϒX\nZ\f\u000e8\u0001\u0001\u0001T7꠺G\"{$^grjǳ,=\u0001[k\u0004\u0002J\u0016Hb\u001cnù\u0002rRٍ-r#\u0003G8\u0015\u001eQ%0@\f\u001d,\u0000:'Ĵ>\u001cev\u0013l6\u0019T\u00047l\u000b?h\u001bpWDh\fz\u0018=\u0007h2jRP/qC}Frbќ,0 s[U\u0006%beN&\u000eKO\u000ebmv5312-:ϝB\u00112GPq(ƣwX\u001e:\u0002Pk\u0001t\u0005U\tغS [@щv:\u0003Z\n2%>3\u0011nu`_\u0000˃߁C/ye<3\r2\u0004.r\u0001\u0005!t/'e\u001by\u0011\u0012/gn;{\r\u0018Ō\u0017בp4\u000eưp=#\u0014~AC.T(߆\u0003\u0018:S\u0013̄<\u0002VY\u0014j&rd^\u0016My)<\u000e@F;\u000b\u000fRt\\Í'@\u0011b$6lun\u000eU\u0017w\u001aˀZH䂔]r\u0017\t\u0011\u001a\b<&giWS\u0011-܎\tL\u000b\u000fc~d\u0017\u0013h\tPYM;dm\u0007\u0016;Rp̑gS\bnk~\u001cw\u0007[-\u0001\u0000*ӊH`\u0012P\f\u001fJwI&\u0011<B\u0004\bvM\u001a]!|\u0017o2\\\u0001BrKNڠٴh\f\u0006ٷ-\u0017S\u000b|Hˣ2\u0006\\F(Dw3J9&<\u001cSWl|\u0016#I\fL\u001a3,.7ZlhL\u001c6G&H|<#Pg\u001f!i5\u0012;\u001bB\t(\u001fY\t0s9+QT]\u001eip\u0017pi[\bP\u000f\u0000HNZ\u001bE*+\"\u001bX*Χ\u0015\u001fxe\u0007\u0005rhYF1El$\r\u0011\u001e\u0013;!zi\u0000\rHF\u0005>U8.%aˎem\u0002@\f5\u0018(\u0012H\u0014J؜\u0013\rA\u0012j\u0010e~4\u00127$R\u001d'=SܗO!\u0016Ip@3o\u0010\u001c E\u0015\u0015Ǒ\u0003Z?%\u0019T.N\u00168ó\f(\f\tzb\u0011E-\u0016#\"\u0010ra\u001a\u0003F\"Ք ?!R\u0019\u001e,\u0001\u0010b\u0017}Ηܫ^hǋ\u0002e.=UdsQ?%AoޖlmfFOb^kvH\f_\u0011C\u0002)\u0018EJ\u001b$\u00145J!\fy\u0002A{5'&\u001dM\u001f\u0018\u0001\r$F=\u000ec\u0002\u001fSȣ\u001c7Sj\u0006noE4\n^Mu\u0001MJgfTyփ{#+Ub\u0012AP~+e愻4\u0003*km\u00002!\u0016­iGv0+xU6l/d!\u001aOI7C\u0013\u0006/M\u001er\\1޾Eє8~-LbQzgR1\" m<ܮ1|\u00155mnrB'A^\u0002\u0000\u001a.7^v\u001br3b2#=:=*P\u00072\f\u0007;O`Vld,ț\u0001\\\u0010\u000f~A\u001f}P\u0006v\u0010}*6\r\u0019H׌7/L&Ш_OL7}du8L跔\b!q˗\u0007\u000b\u0011\f\u0005\bC} :W<_\\]A#\u0006\u001be\u001bq\u0018\u0012`&ڹKXSL)]pp~ \u0018Jl#-8gJ\n/3\u0014\"}Ш\u001c􀀷Z!\u0013  |(16\u001a\u000fK#4,h\u001d\u001d'o=\u0018yp\u0017\u00016/-il\u0001n']}fEdrZ\u0015^Ӣ 6˖И\u0003?ڌ\r\u0014/\u0012bVANΕ/\u0011zq\u001a\u0003^\u000f.$I\u0006,\u0000HH%[T49-\u001a,5\u0014]*#\u0010r\u0004s\u0016{\u0003PFW\u001a\u0003-l#\u0002۰U\u0016\u0010d\u0017[T$EgU[N%M\u0014\b5qQw\u0001q|k]\u0012\u001b\bze\u0001g]\u001ce\u0007͗[&=ڀgGO2ᮺBRLjI?\u0000;\u0004\u001etP`ަƼx\bVqz\u0013d\u0004/\u000b\u0001\u0011ݗR\nAUl\u0003Ko\u001cVr^1g\u0012\u0001\u001brz\u001b\u0002\"d\\\t.tsj\u0012i\u0016[PE\\\u0012\u0007g(dp&'jRD\u0003\u000e\u0002:b9J\u0012BE]:]n~c#.\u000b9\brߝş`\u0019l@ߊUjzt;,QS^L*h;m\u0013>(p\u0019\u001aq@E\u0006B9`\nk\t53E\u0013G4/\u0007\u000f\b*OoCMHiaYxwy<\tSrnK7\u0002UqPM\f\u000f&̖AВh`o\u0010gv*\"]d\u000fd\u001a|Rϸ&*$_ Φ\r8hy㈜\f]ްоeV\b\u0011]hYX\u0004\\1\rI\u0018 4\u000b\"\u001fn\td\u0015m\u0000~s0B\u00152#\u0010\u000e`!Vra>\u001a\n:P\u001b)kot/\u0010m.30+\u001dpd%\t\u0001\u0018ܱ\u0016\u0017=y8s\u0016\bOe\u000fv\u000b\b'\u0004\u0014__4\u0005 :q4\u0014hb\u0018_\nt#DJ1͐,ȥ.FU\u0012\u001dZ&PvA`7\u0007=OE\\ʒ\"\u000bhНDJ \u0003ӌ=@\u001e\u001e\u00180|\u0019J0\u001aJ`.OY{\u000bvyr0O\u0014{C8\u0017\u0002\u0005\u0002H\u0016?X6{\u000elѴ\u0011_\b|ˇ\u00178\u0014\u0010V\u0013\u001dpy:\u0004BW\u0014qw.enD|O!$\n%QƸJuP\u001e1!rY\u0012\u0005s\ttN#\u000b\u0000j\f{fs-\u0015\u0001KG'҆yFZPzN\u0000:u\u0005\u0004p_flpbȲe)\u001fA}[\b\u0000b?*?843\u0012KVS h܏\u0005Ԙi\u0002\u0007́\u001fя P䏈\u0004NY kjZRaP(z\u0001:G\u001bJ\u001c\u0005X+\rjE\u000b\u0006\u0014 7\u000b,/\u0013\u0011^t*\u0001f~Ҏ\u00110\\C\u000fC2\u0001S־\u0019n\n\\=\u001e\u0003\rUL^e\u0003_v\u000e\u00161[D8\u0001!\u0010\u0004\u0013^JqXoI4ˢ~L\u001d\u0006~\u0006@!/\u001f/\u0015z\u00033\u001a)L\u0007~.\u001a\u0003T\u000fO`pio\u0010Fj\n̷\u001bȬZ{Jw>\r0r\"\u001e*qEnj=v}\b7Aڠ\u00149OnM\u0000웪\u0013:,;\u000e\u0002'qfOxaY\u0017!Y$3\u001a=jyie#\u0011_ՠFtWVHcvO4\u001b\rPw˾k\u0016\u0004)>@\t.\fO0\u0018Nǩ+ 2\u001a@R \\#*UZ\"BĽu%Q8>\u0003\bHf5v숐\u0004#,e\u0019o2Kzew\u0015\u001c)v\u0013éƤY \"]%DxLjK\"G>}\u0017d\f\\{k}xQ\u001cZx;x褐^Ly>FKx\u0017U9\r\u0000 !H>GA5v\u0001%9\u001c4P_\u0017\u001e('.\"(vPJ1-R\f`UuGH')ق%҅j.D\blH\u0015\u0011K\t#0+X%\"\n!9sU-:cRN3O\u0007Gh^L_\u001bV6R\u0004x8,y\tUI!J\u0006W}R \u0003>\u0018\u000bX*x\u0016`\u001eV'%\u0012iX8ķ}}\u000b\u0011\u0010\u00195ىڐ\u000bYpY\\\u001b\u001fbj+SЉά8a Tqha(\u0007śRT|X\u0015ͅ'\u0011}6\u0000lN\u0001P\u001bЏR\bU\\Ed`Dd\u0004xUJ\b\u0001`l${`\u001fNu]ohȬ{.\u001f 6Y\u0014_ߍ!*\u0013\\BE\u0016,sp\u001aƸ\u000f$\u0011\u0000naJffi\"Q,b3\u0016CzZ\u0001^=Au燄\"\u0012\u000e\u001fGiBgx\u0016y&K\u0014$ּ@f[I4'I\u0005~t4\u0015[҂rg\u0011\u0006&ƈ2X\u001eE=?\u0017Rćڃ#0̴^#D\u001eP'6N|!v\bҁ(Jns\u001aہm'3KK>Es\u0012c\u0011\"\u000f\b\b<\u0001S:\b*\u000f:߬\u0010Ko:\u0014\u0002e\u0019EKH|\u001bk\u001fse?GS\u0007zܸ\\yBzb\u0000N\u001c)y,p\n{\u000b:˹$XBW\u0006_#O\u001c\u000e;Gm\u0011h#L9I\u0019M\u000b?J\u001e\u000fev$\u0005\u001d\u0019Z(\u000b3ziY@\u0001SRwexS*!\\An̫\b\bNg\u0000.k6TVx]H,t/@f=D\u0010:h)k\b*̕ݠ\u0016~*OD^ؐkh9-\u0017\"uBIP;n\u0015q/r8ҝa\tt\bj:!'\u0002#Ҽ\u0003R+\u001c\u0000?l{۹`/C<8H3GҰjM\u001e'oY;g\u001c\u001eQ Buh$\u0016iIm~z\bǨg\u0005#\u0007K(I\u001cR672Igmd\u0004K\u0004/VYiG-q\u000e\bN\u001bq_6\u0018(5Ȉ\u0012.\u00128!\r^ϯ\u001a_\u0012\u0012u=\u001c>RN\u0014\t\u0003p:pA\taY*yq)*\tZ\u001d$t\"\u0000H\\aW\u0004\u0016؉\f\u000elq@'n@\bQ\u0006D\u0016'\t,[iSf\u000e\u000e\u0016(\u0010\u0005\u0015p\bjRGv\n\u001f'=Mq\u0017_1!2CM!\"\u001bt\u001d4\tT\u0006\u000f<\u0000\u001bZ\u0004x߄8bJs|8\u0006`1d(\"f\u001c\u0000\u0017WA\u000e]Jˬ\f53P⭾M9>L\u0002\nҫhA%w\u000e\\6W<ԗ\u0002M\u001d\u000f?3|\u0014.\u0016\u0017*D8EXi/xʲ5]\u0014S\u0006\u001a#]kPJ]%0QlIh\u0019b\u001d@yү2\u0000֍P\u000559\u0012\nU[\u0016l͹ԥr\u00187P\nOp\u0006\u00020\u0007);Idl!,LQTE\u001b@NJΗ)\"=Ź.Q4\u0017\u0001\u001b~rƧ:C\u0007%R=O\f\nHI\u0013;V\u001bjuKmwpf/xɾC\u0012H\u0011}t%A'%u>v$|)7PaTrR'5ԑ\rpNkF\u0016v\n-[\n\b\u0006q\u0017_E}\u0010>dDWR\u0015\u0013\u0012\u0014l\u001dR5ǋۏN;jdb֊I:\u0011BywGH\u0003@-\u000e.\u0017r\u001b NP\"r'\u00029\u001e̘DDkrW\u0006\r\u0019XӺ\u000fI'\u001a\u0014\u000e\u0017*'VX9bn\nF4\u0015Ÿpz\u000f\u001f/?.QM\u001f*\u0012yl}=\u0017煴zD+\u0000j+yBr\u0018{\u0016C[7|\u0017\u0003_bZ\"KF#UZ)| >4\u0006㨲\u0014\u0010ؾ\f\u0005\u0014\u000b{*\u0004iu4bB{+-8=!\b<Ubg\u0013K\u000e\u0000\u000ba\u0019\u000b+ˑGD\u00121Ds]&xn{Q*>Hzm?\t\fSfI0\bl\u0007\u0015!1`mG\u0015VL5:u\t\u0015r'\u001aO7ͽ\u001eBn\u000b1\b\"]%E\u0001\u0017.^\u000b\u001f2<r=[:\u0001ؖB76F)A\u001a4`\u0006F=>W9Hz\u001c\r\u001d\u0011ǁNvmqp*z1\u0012L@IEUMu\f\u0014x\ng@\u0003h\u000f?NdFl7)2yb;xpsa!3Ʀ:׀-\u000bO)'Q];Y\u0016\tt6ϡ-l_\u001dIvstΫR#DR\u000b\u0018i\u0007\r:lm<NS%\u0005U0\u00007ܪ\u0010p\bm<\r.\u0005GaA#\u001d\u0014\\!a\u0006bM\u001fCtSpXX\u0006`\u000f.\u0011,x(C\u001fV8_qy:X\u0017\u0002hTV\u000e\u001ez=\u0000\u0010m8LihQU}#zpqDGfK\u00151;\u0000s:$d<\u0000uq\u0007 HuZCl<JNMU/.;Rl\u0002+H#Zզx?[Eܒ\u0018x$ymz3\u00133q_KaEI-\u0003G\njܘۆ\u0002xc\u0018H\n`\u0003mOP(\u000eF<a屮;\u0014\r]-dR\u001b\u0006\u0001qؚ\u0013܀GVs\"\bo?&\u001d ]y_W\u0010A\u000457'񯛌\u0014\u0010+n\u0002rAL\\>Y1-\u0002c֕=\u000b ]\u0001\u0017MqL\u001f0GCs\u0007E\u0001v\u001d֞k\u0017,{vZm#3͕]\u0002l<e4aORz\"@X\u001c/VX\u001fLoaX%m'xKH]^.\b:IDN\u000f}Ӝ\u0015~\u00059](J`b0tQnbh瘚y]\u0019\u0001ZmNo!\bt&~\t\t\u0015AόN\u001f$\tܥl\u000f}!-ýY\u000f\u0016=!)xbVLh\r]%onf.o\t %\u0001я\b8?w\to'=\b\t\fg~\u0000GHBE,!C\rшȶ2\u0013~˺C{\u001dt7\u0001NW-ګlib\n\u001c}4@\u0011-\b뫬0w\re\u0001ʛ˞ˮr|\bA3\u0019%Y¡b\\[BJ\u0006\u0012\u0018lP\u0007\u0005\fN\u0016,\u0017STIB\u001cSBʍ,:\u0000c\u0000\u001bZ(C\u000b_+\u001feĎο\u0000\u0005:~M\nA\u0012<\b>5i\rC<.bL}ci}A\u0005|-$C\u000e1\u0010\u0006k\u001f nMxU韼SaB-\u0011N\u001b|ȞJu/F貉&RP+S\u0006,\u001b_<gc,\u001e\u001d'\u0000%/\t\u001f>,w4%j׸WQo/\u001aYp\f\u000f\u001b-\nw \u0007\u0015Pu-\biULo\"\u0015j\u000et\u0006$:\u001d\u0012\u0003>Q(\u0000\"!e\reADx6\nkpfM\u0001Jb\f\u0007oD?4ܱB\u000f w4b3u-#BQ\u000b&M\u0012GMB\u0004\u0010N#<_Ȍ46\u0014'/\t-r؉yіޑԍ5\u0003G3\u0003.%\u0005+5)Ķ\to3j\u0005mTyzPq~\u000e(uqB#rF\u0005\u00144:\u0000oR\u0004>\u0007cuoK\u0015THҶH\u0017wh\u0003h2\u0007NxWhu/H?͔\u001f\u0017=[{8&\u0005\u0015/\u001ex\u0000_~\u001c)\u001b$-2\u0015\u0018y_>|\u0017a\u001fi\u00161mUۺF\ns\u0014ʄ|^\u0013-.9\fr(B\u0013cb0\\]\u0001z\u0004\u0014'\u001c \u000bTw5\\\n~0 d7mBn\u0000\u0006\u0018B\u0000\u0000g\u0001gnnߌȘ|\u000b+yʜ\u001e2}>s?ϑs{GD}0rswxoc;Cg~_ow{TG{sm<;37{;C{V=\\2m\u0010_[v7M_,ڞQ\\\\\u0011,\u001f9-~qg{^_o9u㿿~_\u001amIs_OMؓ\u00177<M<E5\u0017\rΈΘL3/)zˋ، ['6'.\f* \u0006E_N\\{{\u0017fe~mmlWoEokU^}\u0017V]DS3\\kO^?oWtLMUuWNVo[۴þLuս_uD3f<Fwwdص-\u0019SSe!'-\u0010cEEQuE_e}12/93\u000e5=\u0015|tLNM;/22L%AS\u000b\u0017BY\u001dcY\u0011IPaLHPE1\u0001EM%&[N&4E(\u0007&8+\"cP-1Qy\fH\r$L\u0004$r@\u0015$Hi(\"U\fH@4U*Ȑ@ӂzhcX\u000f\u0004*H\u001e`9d \\I\u001e-GZAMh\"YT\u0011@TP\u00151IUT\u000e\u0003DBGZ\nB$cm1\nz \u000b\u000f@\u0012\rE$jh(&EaW\b\u0001\u0006\u001e511H$\b\u0002\u000b\u0016D\u0010PT\u0003\u0001ɪ&\u000eI \u0014Ec=\u0002F\u0004\u0002\u0000\u0002\u0014X\u0010\u0000\u0010ZU\u0004!H\u0000!ngC^\u001d==\u001dtnd\u001c_15\u0013\u0011\u001b;\u0011S\u001b?yA[=JC%[\u0006tLS`=@&2-\u001a\u0014&r<\u0014=Bنx)2\u0016[\"$ \u001a)\u0014żJ\u0018,B3pQ\u000fM5@\u0017\u001a\u0015-^ƳF\thL\u0013#A5\u001c\ri-j!I$\u0003z*\rÅa\u0003\u000f -a[4paa\u0016\u0007E\u0011CլȢ$\u001e\tJ\u00135\u0016\u0005j \u0001`\u0017ǀ-G9L\u0001xh89898㌃@R3US\u0015E\u0001ǳTSI\u0016Ui,Dr\u0002'jfIP`\u000284I\u0015P\u0005=O(݅:naFA%-r(\"\u001e\u001cT\u001a\u0015\u0011-Ij(\u001c(\u000e$\t\u001d`8\u001c\u0013S4QDI\u0004z\u001aji\bz\u0018p\u0019wa-@4M\u000e{\u0005kZ\n*(D<գ@Z\u0010\n\u001a\u0006\u0015[\u0019\u0000@\u0000\u0004\u0005C\u0011\bPH\u0018\u001c\n\u0006%H\u0000\u0014\u0004hF.d.ơP\u0018\b\b\u00000\bFQ\u0000I\u00110\u0000@1D !\u0000\u0019\u001a\u0001\u0016\u0012\u0007\u001e\u0003O\u0015\u001aX\u0011\u0006\u0004T&\t\u0013F>\u00185z^\u0000\nRe#81aMT\u00118b@\u0000$4ǼLnS8ބ_[l戙\u0006ݱA#e6\u0013 ٰбF\u0017,zU\tdV\u0003\"}:\u0003du\u001cK\u001e\u0003\u0006B>m)8-R\u0015z\u001ay\"y\u0018Ѳ\u00040`xlXMa!!/Fg\u001a,q\u001cnkݼ`Q\u0019B#m47\u000b>>F-\nCӱ/&L/<kHK`5xu\u001b%E$`a5g\u0017rzd\u0015ǭ\"\\\ra\u0015x\u001e{c\u0000B0\u0018g\u000ba~\u001f-\u0001E\u001c7h~`h9}M휀VD.Y\u0004ٖ\u001f\u0010ˌ8;Yu\nY4ʊQdRZ@\u000e\u0005\"8dNXv9O'\u0011YK\u0007mB0h|Q17^HQ\u0019)\u0000=\u0013\u0011G1\u0013ɔ\f}Q99.aLF&;*bT-rH̭\\?%\r-\u000e\u0010Z\u0000x&Ni`\t\u0007\u0002Pӯ#׽*@GDy2p\t\\\nF}\u0003\u000b<RD$hDj=+p;#nܐn*bhG=E\u0007\u0004dDRM\b#`F#YT@ER#˭X~9ߑ/\u0004c¶4\u0015h\n~Xb,FJ~4cp꿙j\u0010\"\u0005FCKHwl/w\t d(.Dж^\u001eP\\e\r?{_pV$1xy*=Ձ*uF\u0004R$Z\u0015aR1\u0018`^۵\u0010\b~0!$\u0001rq\u0019H\u0007<5e>\u0013\u0014MuLf\u0001u\\s'wm\u001a\u0010?4, 7)\u0013\r\u000b #\u001cJ_I\u000fA\u0019J٨Πij@327S^^ۿ6v\u0010ǏGƴ\u0010\u0016YϘ\u0013~d~\u00104&0dYqE]'\u0007¯E:t\u0007 OS\u001dz~\tсɽ\u00003\u0005,æG;3\u0007\u0013}0\u0013o=\u001e܂f7@}\n$J\u0005n\u000e\u0000'\u000b\u0004\u0015\u0010\u0013\u0004r\u001bhz\u0003\u0007wBOH\u000f\u0000ts(~<g.\"S\u000foB~\u001d\u00114\fPbH\"R\u0017\u0005S\u0006\"]\u0014x,tq8,4\u0006\u0018\r\nZ@l)L\br|%K!\u00122K\u000ex\u0019\u0010\u000eJf\u001b>u,fnuU:a\u001e\u0002VvYslN\u0001FViX&\u0003\u000bWXj)>,\u001daWQvSdh\u0019\"fItt!U\u0019\u0019ĊD9G\u0016ovTK\"\u0015&;\u0004\f\u0007,fkJ&=IlꊑFKٛdK-\u0004I\u001frS\u0006\t\u0015yly\u0016a0Y\u001fuEL`h͍\nmH\u0014͌|5)[wof\u0016X⾃j4\u001d>.$\u000ei4x{~'\u000b\u0015M9,QdRF+ja\u001b$?םp1\u0001,2\u0011\u001a9\u0013T&ǻRR}L1 F(옎?\b\u001faJ^\u001c$\u0018H),\"!^2?\u0007U\u0019%^\u0003ߥD\nAZX\tڋQwi\u001b{]8Vn\u0004\u000f '_Ea\u0007\u0017>\u001dlt\r<\u001au\u000e\u000e.T\u0002\u000fZM#Zi?u!1He\u000e\u00155X9wn@m\u000em+:Vu_\u0011\u0017|!j[$PBV\u000bQ5F;?\b\u0007gg<u|\f\u0012|Q/FlPʊĐ@,ZqˁZ@X\u0017\"afT\u001bA*\\\u000f;\u0002\u000f\u0003\u0000p̪8\u001a7ە3#W0oĂ\u0012/\u001f\u0015հ!yC}\u0007`5m9&^BC===\f/M\u0018ӏBRy\u0013]\u0001~C6Sͪ#ps\u0001W-bMˬew\"Q2\u0016}\u0016\u0010QwKQMÐ}iS5\u0014#\t\u0011\u0004X#\u0004v\u000eQ8+\bWor\u001a\u001cmw\fHat$)jĮI}\u0006{I H7'\u000459EV0@5Lwp\u0018q\u0005\u0019\b%N[b`8G\u00176L!\bi\u0014P\u0017ܾv\u0004r6\u0006wM#ĥ\u001eђhqW\b0(ϋv].K)\u000b\u0001\u001cu QIPb8c\u0012u#\u0015:\u001f-`dK꣭Ŋof\rfPG\u0015e\"\fw(?VZ\u001eɆ\u000e\u0015\u0010\u001d\u0016zS4\u0015A\u000ftd2\u0012D\u0007:Ovu/X'\u000bg)Ky\\jЉ7\\T=q_\u0014_IuЭ(v̎}@\tA\u0011cc\u00147Ƀ$4ql4\u000e1u5uRO;\u0019wÄDK>3T\u001f; q.X@s/X\u0019\u0001\u0018XqbE\\ȈW\\`kI\n-|~\u0007ֺ\u000f^OA\u000fBn\r\u001d9k\u0003J\u0019\u00134Q({=.o3\\/w\u0019,\u0003L6RbR~a\"\u0001Se\u001f#\t\u001c)H\"t#dO\u001cT\\7Ll=fg\u001cf\u0015\u000f\f3;\u0010pdf}ŇEH\nm[\u00033b\u001b}u|\u001eNjncs\u000frlG3<g\u001c)\u001f3!!C\u0013[y\u001f4\u0019`/_\u0001a`ߥe:)P\f|)\u001e,]/\u0002ϯ`/\u0013\u0005\u00175ʘjF\u0018pm\u0011~\u0013\u0014Xr\\\u0013J}Aذk<!A\u0019Q\u0019~a\u000btU5,\u0011\u0002v.ze]PFQWU9'\u0007\u0006PPVEC%\u0011,ߨWř\b\n\u0006\u0011\u000b\u0015r#\u0015\u0001CZ\u00053\u0005\u0013$Twb\"}p\u001ceS:vk\f&jD9\\nO\u000bz55\u0000[]31VEK4~LD\u001eWf4u}&,ӷ8ZljK=s-k\u001fj6o\b2:J:\r\u0019\u0006w@Y\u001e\\|#34K\fXJeVv)UU*eÙ\\nɼ\nĘyAsY>κK>O֘}h'ƽt\u0018!*P?\u001bE|flWy%-<\u0006*\u001e\u0018_\u001d\"\u0017W7h\u0000-Bª\u001c\b\u001afl=3\u0006fH\u0011xt.?XV,\u0005:=x8\n\u0003F^:K~T5dfj~y\u0006׃*S>\u0005\u0018NtLNjW\u001bsAf\u000b_\u0019\r/﹢?jԭս\u00164Z-p(?$\u001aI\u001b\u00065U1@+1'_E\u0000_+X]G|a.wq\u0003z#TQ\u001e?*n'=[<\u0003գdsѦw\u000b\u0004sʂMb?R@a\u0006Np+յD\\S~,\u0006\u0017QaNtDTLl\u0014k\u0017\fn\"iߡ\u0016˧i\u0018\u00164\u0007?\\)P6r5fP=E\u0007\u000bjHQ<\b\u0015IH4\t!\\%A\nhҴ*\u0005m@T\u0010E\u001a\u0011_\f+DX~b!L,De\u0019v\\C\u000f\u000bJ\u0003[Kywdn(/:A\n'}9·߲\u000bI.\rK$fo/\r<q\u001eCP\u001dC\u0019ߺј?d=\u0015WL,9L؊VqO:q\u001e\u0000P\u0018Y|\u0000է\u0005\b\u0007SMr徨q?u+\u0012ͱGK@Id6%>\u001a\u0005ŦW2dkm\u0007\u0000\u001d\t!n2\"+]\b\u0019ѼP\u0006_\"Jlr&bŞ\u001f\nq~uE5%h1б\u001d>u\u0000qzgI\u0019rX:w<?n\"2|\u0017\u0006Bz5)J(N\t\u0003+-,4-z\u0010B1n\u0012zd/Pd)FG{BJZ9Ph8DWN\u000b\u0010\u0019d\u0013\u0013\n`Ec7q+H߻1hm1\u001a\rQ\u001b}%U\u0005ݨgpm\tW9 H2\u001d\u001f\"c>GV`\u000f5\t5(;\u0012q(>`SR\rN@\u0003G'@\u001ekau'sb\u001f\u0014\u0014a_yH*E2)!ػi6CRĻw1\u001f|ෙ9\b\u000eʋs4MR:7M[搌<~\u001a$}\u0000%\u0000M\u00053u\u0007\u0001֍\"r\u0001Ƹ_P\u001dQ8s!\tp9m\\\b&P\t\u001e\u001c?6b\u0011\u0019\txMD;Mh>\"(q\u0000\rl)/Ɨ\u000b䅇T\u0010\n1yˍ?DNޓ\u001ftAM#-T\"$Ffri\u000f\u0006V<^ɵjRWmXÆ\u0001.0e@\u00068sc}Cfr&B43s\u00155\u0002\u0004hT]m^hV|YMUE˝҃r&oW(~A\t08p7y5K\u000bj\u0012vt\u0003H\u0003\u0018_\u0005F\u0017E\u000000\u0010@\f\u0002\u0013\b@!AK.]\u001e\u000b~nŗ#?]#\u0007xh\u0014j O@%ZQz0\u0013$9RV\u001d\u001f`kȸc-l\u0005>\u0002:.\u0000Ʀ\u000bLG\nm\u0003CϽ.J!3u9G:\u0017dc\u0015\n\u0015ZEDp\u001eB\\X\u0004\u001e\u0016}\u0015SzJvo\u0005k\u001c;tM@v\u000eP\u0013\nT\u001dDh\u0002څh\u0006,HSTx\u0017յx\u0005\r)Ǟ3A\\ۋ$\u0018\u001d4$VL_x\u001erhȰh d✲Hl\u001d\t8\u0011\u001c\u0017t<:\u001c+\u0000\"P ƶv&˭Sw\u0010i(\f\u001e`\u0018 ep\u001f#\ngy\u0011Y(\u001e\u0016F\u001a^@.ӑƲda $p@K\f1:$m\"e\n\u0014>NkE ?sL#!UkN\u0013Z\u001f\"VQ\u001fKw(xvS\u0010\u001eߖqߚӋ1نH,'\u001ab=4U,$\\\u0012\u001eT\u00032C\u0012ޛ_8\u0014D+mpl\u0012{auA2m\u0017\u0017TiZ\u0010rn6b\u0003\u0006mƑ\u0001\u0002x> uj \u0011V;a\u001e`{ew\u001a#3\u0011\u0002Xt \u0007.#9\\O\u0019\u001cő)\u001d\u001aHe\t^`\u0004\tn/2\"\u0000eG&5ܼY\u0017.,W,Iƺm|\u0007;Gd\f!d\u001eI\ne+%5[UݭKB'-kDڬU\u001dM=\t#:B?isPtQ6P\u0002밇\u0012\u001fyh\u0017؊P˂\u00072llcf\u0001W\\\u001d@AsZ\fQ!H_s3-\u00138d\u0004*I\u0002/\u0012uo$IGI\b[e<\t\u0017r\u0014\u00126\u000e\u00034tˏyqv:\t*\u0015h\u0004TB\u0013ĐY\u0018>.f9[\"k*`\u0011|:#78Wz焃Es܇x|lS*p3~$~\u0007̘\\(\u0005V\u0016C6?Vȡo3E\u0000-9g%\u0015T\u001a\u0002hjBߍ+YIf8rYl#W\u0012r\u0011mjF֞,!PcMK,*V.m\u0000$݋Zw/C\u001c\u0005[\f{(X\u0006rӯ\u001d,\"QR0Z xU\u0007ֻ2^M6sA\u0002`=m\u0001\u0015ࡄQ/5\r\f@`ت\u0012ƚ\u0015_\">/\n\u0011\u0017sK)GpHw9\u000e\u0005jQkeY\u0014:<\u000eX[\u0018}\u000fYSFG!ITɑu\u0012\u0013\u000fS-Rǆ8acSL}0\u0004K㜸n\u0010E\u0019@Ƥ\u0011S\nQ3ӹμ\u0019~MWl%?tY\r\b{VՇ`\u001e5Qg\u0006ظGYb\n7j`Dŭ\u0013lVv:>!Acr\u0001\u0018\u0002wi<ۋP\u001cͼ\u0018Փ(%=X{h\u000e0ңl|\u001cs\u0011J\u0017G?\f\u0018ݏ2v!F\u0005_\u00133]\n\u0004BMk/\u0005=.\u001bOY\u0011X z3Q6\u000e|\u0016\\Ȇ\u000e|\u001a^,\u0000X,w秜\u0007HIs=Z.Vy\u0003\u0010Zr\nṒ\u000e=-\u0016PoE̗dZJ.Ȓ\u0007\u0013R>9\u0003JQwE-K;0\u0011\u0019_~\u00010-_&Z,oeC?}LM@\u0012Gd@fQړ\n%zF\u0010^`[r˘<\t\u0004Da\u0017u\u0010U\"3\b\u001f\u0003<\u00061/ wzr\u001dIr%[[NDk\u0018\u0002)\u0016eC]6\"\u0003Hms\u0010=\u0014\bA\b?\u000e>Y!Oq\u0002HP(\u0019UExHMq{hƔ-&;pK\r\u0010\n.P]}\u0014os\u0010+\u00175apXaհ\u0015}/YH^\u0003ET'-K*M뫎/fZ7\bO\u0013\u0019톑E0\u001e{}QU\u000e,xY\f\u001d43VxYxC\u000bZFVe0k,\nxʊhiJ(5\u0001Đ|p=dኤn>\u0015z\u0005\"D~雛g\u0017\u001d\u0011pB|%\u0004\fӂv]\u0014I\u0013\u0010\r\u001fQb?\u0006];\u001e\u0015ɹ<\u0006\u0015_~|n8/U\u0005w\u000fLp\u000e|P!tP\u001aGT\u001d~58X-\u0005\u0006=2KL\u001ag: `U]&cMxS8$*R\u0002O\u001c\u0000\u0015OP\u000b>iʂu0s`<3\u0014te{Ŧ\u001f\u0000\u001f\u0007Gl$Y|\u00181t\t!CNq?*z\b882\u0006\u000fܲ`\rF]|\u0013*{\u0013C\u00050Ş\u0005i6\u0005\u0013aH\u0000\r`@\u0004 ^Yr*jL\u0001(!Z-;_\u0018@\u001e\nOQ\n&\u0000-\u000eP\\>\u0004\u000f\u000bd݄ax\u000f\u001edJ/rI\f<3eAo\b\u0001?vq\u0018HG&\u0002\u0004W\bQ\u001f}sD\u0007փ\u001cgN\u0010n8\u000bͱ\u000b\u000b\u0018Yv\u000eLE\u001d\u001aW?u\u0005z,3Ԝ|\u001d4BUℬRwuarknU/XoJ/Ί\u0015??H\u0011cѯd9\f#F/bl6C`fg\u000fmR؍\u0011^V\u0002\u0014\fV^E>BKS\u001ayCOJn}jŷx!Z\u00128\"?.b^\u0013\u001eͲc,\u0015pOg(є'Ctt\u0002zɺ}-\u0010\bQHD\\\u0010d]\u0016\u0002ԂB-\u0004L\u0000\u0011\u0002\tSM\n2\\h@\u0011ÒXr\u001b*P=\u000bTϧȿ\u0001\u0001o6*\u0019[\u001d\u001ap\u0017S<\u000fM4Dn-\u0005\bleb>\u0005\nL\f1Q\u0007y̛&q|$\u0010b/\u000b\tc@nj\u001d&\u001c\u0013#\u0019DbM\n\u001c\u001c\u0000\u0005\u001c$#1\r\u0007sKtԫS`͞Pv\u00008{fV,鞻D3è\u0005r6]c\tɃD%?5Vŝ \"PS\b\u0004m͎_Bs󼧛2Pv3;\bRs;sBD\u0000#gꠘn\u0019o\u0001\u0004v@\u001b85tBW\u0013B\\P\u001aG\u0010l\u000fK\u001fFryb2w&]Ɲ\u0019KoA3§$+\u00014sJ#^J\u0017J\u0011Z)}F5SC(tْ%r\b\u0011l\u0016hlxk]?@(\u001dn/O>Ϧ\u0002M iR8&~\u0019dծ\u0003wIaj7٣z.(v\u001dM\u0010y \u0018\u001agPs\bX\u0003\u0011\u0006\u001a,\u0016N1h9K\u000f\u0003kQ\u0013d\u0011$6nXL\u0004gzx:p5}y8Gx\u0007\u00130C(Һrp\u000f\nC\u0007dXb\u0004^NdYa\u0011'd%0Q7f.V^\u0006\u0006c,D_%B*%0A,\ffڬBa\"\u0004;(b;\u0002\n:ҴiԂHٟo\u0015x2\u001bEq\u000b<{\u001e'>?CiKj\u0007\u0006g\u00129Qb\u001cb5GJ]w|#\u0019ju`S~\u0016h9\u0018\u00125\u0006\u00044۔SE>(А'`\u0016:,ol\u0019In@\u0007͓\u0000(Gt\u0017E\u0000\u0015e&!\u0014K#I\f>~0_8N5S\u0016T\u0007\u0019=\u0002urj&nu&qE\u0011as\b+.{o!3A\u001ak\tI$\b\u001dy= S\u0007uݲ{IOd2\u0001,\u0010$?\u001a\u0006p} \u0007m{-\u0019\u0003Oτ$wn\u001e\u0006\u0012a\u0014m\u0006\u001as\u0011Z@q&B\u0014j:\u000bD;Zox\u0010c}\u0000df\u001cv\rDC&\u0001[\u001f\nZ!hehCR>P\u000f\u00073!\u001e\u0017'\r'a3\b&Ų\\CK\u0003fI6K3\b\u0004(Hf'\u0013.=\u0012\u0017#_<(zZQ\u001d2\u00058e\u0015٤5\u001f_y'@~&2\u001a\u000eY^\"E-r07Hl/3\u0007\u000bf\u0011}șT?\u0007VBhJ%&P7Qz\u0016uL\u0010\u0010\fAoMA2\u0007+(\u0019GtMP[=-ޡ̏U*_9\u000b\u0010,hX\u001cȈ\u0015\u0018q-Î̀1\b%\u0013z\u0001XE\f\u0016\u0010i\u0000D\u001fs\u0013xx\bSs\u0004shS8\u000bi;8@T\u0006\u0018ٳӠvVnxX>X38aK\u001cU?ZfxM9Z\u0002%~9$Up\u0010Tg\u00068\u0004m\u001bH\u0010\u000f\u0005mfB%\bWq*9O\u0005 ~1JS5.*&J\u0015\u0006\u001e\f:pUvk\u0012h\u0006|CK\u001bbg}P\u001fZL|F!8ػP\u0005\r\u0012,l2\u000f\u001bJ塥\bln`߻VsXST\u001a\u001f\\m\u0015t\tU\u001bK\u0017@Sg\u001a\u0014Z=U>\u0019Ni)䵋5I5\u0000 j@|\u0013cc\u0000 GG,fykcy\\煯#gɭ\u001eKu\u0014TZqٙ\n}\u0011r1\u0004(\u0011r-pZ\u000b\u0015\u000f\u0007\\\fc2dAa\u0016\u0012q#\bĥ>\u0018\u001b\u0013gָ:e$qy\"ش4\nx\u0010\u0015\u0019\u0012&\u000bgaSE\u0017Y^h^U7\u0016\u001fsdCF^37jǫ\u0007aw\u0017nC_\u0003EKsC\u0016o\u0010\u000ep\u0010cbZ#p\u0010~\bV_$&#m\u000eF\u0004\u000f|\\U#47ί\u0000\u000bg\u001a{\u0006\f\u001e\u0001XzP\u0011\u001d|՘U>{%k!V#P\rη\u0001\u0007ڈ\u0005`2H\bЕ6w\u0001@vB!\u0015.؅\u000b\u000f2;#\u0010\u0001@\u0015V\u00188\u0007X7\u0003_n|Xڐdc\u00197h,J)\u0011Tj.q\u0011Iآ\u0018lG \u0012쏭\u001bxHǀl\bq0w\u0015\u0003l\u001a8T<;1d3n\u0014b\r\u001aL>/7\u0001\"W1$\u001a QsJgB~9N\u001b_B\u000f\u00168,\tN\u001b|Mv\u0001܂K_8^\u0006aO#n\u001c:E\u0014,DLP5\u0000\tƻEj6xX\\\u000e\u001a\nC=(\u0012\u000fb$LB\u00115\u0004\u0014ήXW/ȒZ\u0004\t0(:3e\u0016\u0002@\u0003I&Df\u00198\u0013dҟ+\u001fH:0|<\u0002fQ\u000fT+X*TL2F\u001fي\u0001%\u00014)Fפ\u000f(\u0017C\u001f\u0005~Tl\u001c\u0017Jlv0\u001at_X\u000eofC}|O]sԸk\\\"1&EHB\u0000]\tsP\u000bx\u000eUK\b_\\B,#u\u0003\u001a\u000b?\u0002!\rc.sʵ\b\u001bSm\u0018gJ\u0015\u000e}T2:ʶg*8Ym\u0005\u00153ڋ`:·T\u0013jPR(Wΰ=n\u0019f2\u0010\u000f\u0015=\u000bzñ\u0012M\bd\u0013U)D+k\b'\u0002ߡKzrUpJ$\\*~ zM {F>W}#}\u0005)\u0004HZs\u0012ӟ+iB\u0013\"8\"q3HC4ԝ@EZ9\u0002)#\u0004\u001aY\u001c\u0001jw(nWE\u0015\u0014G.\u0013\u000e52Jb\u0011!$qB֣0,tB >\f6\u0018\u00015mȕ\"\u0011&#\u001b\u000e߇fa.M\u0015\u001e?x\r\u000fqa.\u0014j΋hH~ՖAd\u000e\u0018#HE4w=~'vV!'\u001f8ńk3d_\u001bԌP\bݾZ}:j8\u001dHΝFha_5Nb퓻ȁm@lS:FFzXj\u001e\fltֽ\u001d8\u001f\u0012A\u0017p\u00131'Wg\tǝ\u001e?VC3\bX_\u0000\u001bˁ\u0000ed\u000e }9\u0001H/.j\u0013\u0003\u00022\"Ԙ\u001cڴ\u0007T@=\u001dU$b333S׿x1g _\u0003\u0002\u0002O\u0018\"F_#,%5<I\b^\u0000:(\u000eFPq0‸n#S[{d\u0010WͨGIo7S7H喑5\u0003\t\u0007\u0000\u0001)\u0003\u0007\u0014\u0018@\" \u0000!\u0002\u0012aB\u0003\tpőm<niQ$f\u0011a,%v#7qQh2U\u001b:Al&i5\u001bgf\u001d{52,R\u0012䍵3<\u001aa&7\u0017HkC\b˲JSLҠlq5\f9\u001ei^\u000eS\u001a~/̼w>v׮EA\u001bM\u0005̓;\u0012E\u0007*i2Њ\u0014\u000beW\u001fdgG\r|]ĥQkhM$JÌp\u001aT,\u001dZ\u0013ū]xh\u001f]idNQܡ,u7QN͠&DsF\tӷyzQݹ/zhxA\u000f\u0005osY<yUuKZj\u001d\r\u001d\r\u0012\u0012\u000b\u0003\u0014X\u0014D\"Y.\\Ȳ;\"ir)^\u001d \u0001\u0004\t\rLH8(C@\u0003D\u0002Ad\u0004\u000b\u0005\u001co\u001e\u00115H7(a<\u0017\\x\u0000a\u0001IC0\u0001`b\u0002\u0003\u0001\u0012\u0011\u0013\f0@N\u0000\t\u0016\u0007!\u0011\u0000\u0012h`Y$\u000e`XhLLP%8`\u0000A^\u0003\u000b\u0013\u0012\u000e\u0016$ 88 \u0012\u0002,\b\u0001\u0001\u0006\b\u0000\u001e\u0012d\u0006\r\u0016\u000640\u00060!L0 H\"0C0\u0000!\u0001\b\u0007\u000e\bK\u0002\u0004p\u0003\u0004%@pxР\u000b\r\u000e\u000e\u0011\u001a4hH\u0001;5X<\u0002\u0018\u001a\f(\u0016\u0011^y\u0014Al\nYBQ,\u0014#{$<\u001e3xMu-\u0015E\u0006Y\u0005nebqX \u0005\u0005K\u0001\u001c\r\u0012\b<\u0000ZPX8$\u0004\u0006;iA!\u0002\u0004\u0016F\u0002\u0010\u0011\u0000\u0005\u0005\u0014&$\".L\u0010.9DiX<\u0000\u0003b8)\u0016\u000f\u0011b\u0000bb\u0002a D$p@0\u0007D\u0004\u000b\u0004\u0007\nN\u000e.<D<x,\u0000\"0\u0001@\b\u0018ɣ@Dp\u0001\u0016F2A\u000bH\u0000QCăSC\u0003\u0005&!je?jͬc\u0010&fV\u0019%\u001d\u001d\u001126S\u000bzztǓ]\u001aH6TSnӃ|&UWRlM4;O3Ow{t\u0011MiV<\u001a&|^f򯊅BE}]\u0012޺ߤ6Z۪Kw.]X(͵\u0017B𸧧JPv^;?t\u0011JkHUy|h'\u0015:wsG|y}cVOitH}^B:6Ńq\u0017C͒hs$iGI\u0015t4acצ%\u001dhݒO\u000f t{\u0015\u0004\u0015{gϯ*K\u0015mibQthWHUkJ$*{G6\bC\fb%]3 ?+-n1[hDkF*\u001ej\u00115H]eS\u0006\r\u000b\r0!a\u00007h0AbxPZsiێO0qx\u0000\"P\tw,\u000e\be0\u0011\u0000\u0003D˽=%`>+\u001deݧRM[\\D\tܖ^3W xP,\u0018֭dhb\u001d!\"<5-\nS))͗ȗ}wpkmgSf4ݳyO3\u0013uӖ{<;Ndz\u0016=={ł{F].ٹG9ٕ?+.#X0\f/+ɘiw\"zӟ\u0012R壿i]S\bD\u0004\u0005!\u0018\fð@`<XP`AAQ\u0003Vے[EC@C+\n\u0003RHxtzإ^\u0003Ezgwl?ꑿjnDO#;\u0004͂\u0002`\tVfúSSU\u001d\u001ayg>x][\u001e;on]~\u0014ZhF?h\u0018W\u001fܥC\nygJ\u0002\u000b\n\u000e` 5C_\"Q\u000b*˘mV-$@n\u0007Sd\u0019#]\u0019\t(@A\u0001\u0002,D\u001b\u0015\u001aL\u0018DN$\n).\fVc͢y\u001ci4\u001eپ#y$\u0006\u001dO#̷\u0018GHK| M;Rk\u000e$\u000e[\u0014?JѮ53ZZnGn>60\u0018s<\u0014\u0015qt,XGe+\u000ekgFY{:)<+GRpbņ\"38 ⰒezgT\f:\u001eQ(xݤ\u0014Ŏ\u001ej\u001eHLhf%\tQcU\u001e\u000e3Ȇ\u0003,4LJh1:\u0004G&!%83|chbgo\u001a;5C\rzA]YF[$˻y(V4K;7EKVF\nj]T\u001b\"\u0000\u001a\u001dD[fA\u0005f\\\u0019-\"\u001emHYцyt9g\u0012\u0013\"EV]e[y{i?ݒjѪbp\"TU5՝B򕵧S,\u0014ZonXy[wl-NʴlhvHeH;צ'$\u0012\u0005(\u0004\u0011\u000e\u0007\u00101DwX<8\u0018\"*\u0016\f\rc\u001f{\u0015)\u0016\fTϐA\u0018c\u0014\u000b\u0006bX<1$x\u0010;\u001a\u0000W\"ALQtB\f+ ct\u001e)ZmMG\u001f>\u001eiD,$@Nvz/3mQ\u0012ᑍԷ^U,\u001e:){S\u00197a}[E\u0019\u0002Belq-Q\u0014N]E=r]&}ꦔwgE##%\u001ao1n4\u000f~e\n0^$\b\u0014\u0000µMgi<\u0019i\"xzZJ\u001ef$S,\u0014+53ޛd*|x=f\"\b.{xhydb)\u0018S\u0017\u0019t&֖\u000e%^M\u0011,\u001cP;ҥYuUvo\"VTiu\u0001Fxz!T\u0007 \u0016FG\u0007 \u001a\u0018\r\u001a4$hehҽљR\be1\u0001*lKkfjBWiqm+L\u000bHX \u000fRGu\u001e]&NZ}9\u0003QsӶ\u0016!;.i:dw]5os\u001bU\u0015֍iM:DZv'4[;{k{{L-M\u0013#׷+<c\u0015\u0012=^GsMfc#kWN1ZNJ<f\u001dQ0\u0002j桵z֪s;=\\r\u001a\u0003稫:fxX2<m^\u0014aڅwM.풽̨2*a/a̻jfK;zjJhG/\u001a\u0011\u0019ɷuZGDz6\u0019\u0016\u0015\u0017u\b\u0000\u001aY\u0011fC<:*j~ՙo/I銅rڧRY\u001eTt0\bP)\"\u0002\u0000\u000e\u0003\u0013\u0000\u0000(d\u001eDBQ\u0012I\u000f\u0014\u0000\u0002w<&$\u001c\u0012\u001a\"\u0018\u0016\u000e D&\fcA8 \nb\u0010\u0006\u0001\u0000\u0006cI\bAY\n:\u0019\u001f\u0006\"*(Pdk\u0019\u0012ƪ*\u0014\u000b5\n&!\r)\u00146e\u0018m9(\u001b\u000e)\u0013B\rX\f8M\u0014;H\u001b)OE,\u001anbQ[\n@ \u001cu\u0004\u0007:\fnk,ؑr=\f\u0017b\u000e\n\u0019ewI>Qܳ!?}%\u0006oIԓ{ɧNl\u000b/B\u0006\u001cyk\t\r\u0012-]Z\u000e\u0003KKDE퍃\u0017m\u0013h?x\b%&`r{i\rVDڣŋ\u0004\u0017|TIo\t\u0005x\u001101_ők%E\fD4\u0016An<\u0017MC\u0005\u0019\u001f\u0007.Qk(?\"\u001c\u001fÞ\u0000Xx \u0001\u001dv\u0005-\u0013$d`GP_((UX.\u0012(^ksZX\u001d Wu.XMHL'BC]+ՙ1|5u% .͈Di]Qe\u0015^'\u0005:\u0003MI\u001aX.!3M\r\u001c:b\f9s\u001bU\u000b6Gu_\u0012pc\u0000I^:&r=X^@?he\r\u001d\u0015-Lg^E]+T\u0016K\u001fTrC'l\u0000\u0004\u0006ß91=ס\u0012nRx=\n<VE\u0011\r8wx{\u0010\t!\u0002|!5'k0eL~nxf\u0007\r\u0013e\u001d<\u0015\u0012Z&$׌Jb;\n\"FQ\u0011;|\tN`ػ\u00193\u0014\u0007{\u0019|\u000bO|:AC>c\u0003$uZ%\u0003\u0002\u0011\f\u0019X-\u0005*Vs(2rt ?dXK! \u0005\u0007\r[nVU\u0003<]Nhb<QIc[\u0002ً8ֆx g&6$\t-MH&'\u0003\u001asȆ\\\rCv<N7\u0012TlNUSþ㻒\u001cq],ҾWF!⣴{]+H\u001b\u0016%LKH\u0005/e\\(CZKV:99PF΃#\u0015\u0018\u0012ۦgmӏ\bhlxk\u0003\u0006@?k@W4\u0012Cl;u\u0001\u0017S\u0014~4K{(%E\u0004\u001d\u0001l\u001a5\u001b\u000e\u0017T2\u001d\u0007\u0014J.sf~\b%gN\u00180 \u0002\u0007x;|[1\u00005g\u0016\u0019:q=R{(91\"65P\u0006>Z\u001cYK\u0006xM\u000f0\u0018bCx\u000e\u001f-鐇z^RE\u001a\u000eTA_Xސ4w\tp%\u0005SL?\u000f,g^̨\u000b-b,\u000b\t;Gtsl¼K\u00006\u001f_\u0004Z\u001cw\u001bAQ\u000f\u0004_\u0004x\u001ajcD\u0006Mk9ډ3?זE.9t(5\u001d\u001bh\u0013MUƚ:g\u0007V9L3e\"\u0016~}ۍ4\"^\u000f\u0013[\u0012$PYQ*#\bO\u0016+\u0014\u0004ϸmN>:sqPa2Y^RA\u0016ߌk^WNyTuI_?+;;?s\u0003[\u0003]z\u0007\u001cH'[5{j&aZ\u0015D~\u001c\u00186S\"zѣ\u0006]\f:F,冃BN\u001av!d9.?zW3$f(\u0003\u000f'/\u001f64\u0011\u0006\u001bƿ+{G.ˌ\r0P\u0015\u0016L!Y!C$ݪU\u0016\u0003\rw)\u0011'\\\\!Z\u001cE^u9UP\u0001eocBL\u0003dB:l\u001e9mqqþqnӮʈ\u000esf\u0012UX\u000b΃9L\u0003٫M\u001bYQS\u0016)=E\u001cf,ʉLǆ)\u0002*G`Y\u00162T0rw_V\u001cf(,Ո\u00118N\u0017[5\u001d2TJ>AEzkapΖ/f\u000f\u001eR\u0004$Y\bK\u000e\u0014ѝ^֝Lce٫A\u001b0A?0Ή򒄾Ϭy+\u0003㭪X7c@S\u001d!\nN-ןڨ}5\u0018:\u0018fY(\u0006\u001ef\u0013Z\u001e<u4K\u0005w_GnŘR\tQZ{uZi\u0006yy.Nvio\f\u001d{5\u0000kV0*ڇ]L>l;Di\t6n\u001b\u0010#\u001c\u001f*#pP\u0003b;$²f։OдWbH]F\u0018!\tv9aM?HkF )L0Rb4y\nG\u0003tH\u0019pP~+-]\u0003\u0012O>\u001dY,\u0013JF\u0015\u0010Q8\u001d\u0017۳Z\u0010{\u000f\u0002\u0016<\u0007/\u0004=IUnM҅\u0017o:`UI\u000bG\"d_\u0002\u0010w/\u001829ktnq(CLl=EwMPa7Q#S9\u001eC)梇n\u000etS;\u001cce'x(A\u0018Md\u0014%YFR7=gKa,ۨSNRR$G6G\u0019h6\u001aiSRB\u000bi\u00172-QVkœ6%\u0017\u0019\"fU\u0012;|\u0010X2 +=T,Cgy[\u0012\u0003+\\\u0015ɻba%k̵6\u0016x~e֒\u0018U纜\u0014bW}J\u000bP]\u001b\u0006\r\u0016JV#ډ\"Oӝ\u0012r|MD~\u000eZbhMcT#n&)I@#Y$+|iFf\u0000*Y\u001a\u0002EiZt\u000e;t5m\u000e\u00186llT{~\u001cz\u001d-9X\u0000\nWu\b,3V\b~s!:Rg,\u0012d@Ai\u001d\u001f\n\u001fP.|Uj\u001e\ra2*\u0014\u0014u/\u001e\t1+\f4\\\u0013\r\tvRQ\u0014\u0005>\u0001\u0002sY7>`Pf<Wݙy一\"Hrkcjdþ\u001c9sR\u0018\u0014\u0005K\tf\u001bMrN/\u00181f<:8Q7\b\u0016؅&lQJ\u001bO\u0007aV\u0017e\u0019lOFzGF4\u0006~͏D\u0012\u0015-B-X\"8bMx\u0017.t2/ͬ\\׹\\u\nQ\u0019Y\\Rg\rsV\u0018!XUPcN.}c8&8[c%\\\\\u0004a9\u000b,\f\u000f#von=vqa[@Tѱss\u0002\u001bJ!)$\t%: =߫<,ଡ\"\u001dը`wgwQ,A9)\u0014O=U6%\u00000Dl])A)W\u0000ɍ\u0004KO;Dwv\t\u001d/\u0012t_Ay\u0019\u001a\u0013-\t~K@2\u0011rhb\u001c\tg\r,Kj-~\u0000` \u0010UoJ\u001bp\u0019H\\\u001dμO'BEߍ{([\u0018\u001eg=\u001e\u0003p<V#i \u000fep2\u0015\u0001:AqxY\u0014\u0000\u0007WpsBL8\u0017pyQ\u0016`KcBN4\u001d\u001cVY,\fp5E\f5u=\u0010'\u0000Sd\\e^='\u001aVbSTP04~y\u0017)\u001aDNB#D20H\u001db*]\u0011(?s|)x\u001d\u0013\u001bx@\u0010/\u0006E\n}#lgVMVA{Q\u0013oj`C)ZI\u0011`m[t7\t\u00040rfbi\u001d\u000e\u00059WO~uHxG*v˞\u001fB\fXd\f oB0--~lZk\u001f{׳z\n\u0000Hx\u001c=9'fN$\u0018\nv,@\u0001ISD_㈣L6Ԩr\rK\b\u001d>h\u0002J5xVp\u001cAKU,T}WMP\u0015#\u000eJ\u001b9r8\u0004\u0017GJeDC`-\t\u0014:\u0014SaWf0h%H쑘\u0016\b)\f\u0006\u0002\"\u0005\u001c9\f\rO/e\u0012c\u0003E\u0012\u000bQQ\u0017v\u001e},\u0013%f\u001aFlf\"<D\u0007>C\u0000@Z\u001bK\u0012X\u001d2#a1\t\"Ofٰ\"\u0004?\nk\f-\u001e\u0006$4Z\u0004L\u0013nacwm\r9C<sUeTTYZ\u001dRQr\u000f\u0003\u0003\u0013\u0005\u0014?\u00147\b\u001f\u0017N\u001e\u001b@1(\u001e}S\u0000\u0018V~#8֗2;o0T[a͛M\u001fO\u0019\u0010\u0012ߘhj0F\u0011Y\u000et1yW+Ai,_wWjg8\rrL\u0018}X\u0011N;Y\u0018&91\u0015\u001elq\u0018ʑ/D\u0004hPWy\b\u0005`/\u0013=xيwm?{{ml\"I84ݥ\u0004M\u0002\u0015]e*6\u0002$[/\u001d\u00195\b\u00188lF\u001c/\u0001\u0004}4\u001dF<bK6i\u0002r\u001fko*dOV=\u0017C5\b\u0000#ɠAs֠\u0017d2r\u0004W3\u0011i1.n/\nVA\u0007\u0000-[z4?RA}DFC( q\u0016J^.l9fT扦!\u0001@=0-.`\u001cx\n| <|[\u001dw$\u00025*0\u0019\u0013\u0007e\u0000J[\u0003\u0006\f\f)'\bpH:4=G{|d,t[ďD\u0003r\u000f\u0017*d,4\u001f\u001frTKSWnAV\t6زR\u0006rB|\u0014#~N\u0018$FFxvKjQ\u0016wFˊ\u001dST[Tf\u0000r]>P}<gA\u0004U\u0016\u0000m\u0002YDL5\u0001sl\u0013Ilp}R\u00077z2h\u001dX\r\u000bˆ.ffN\u0018)xjl2lb\u0011GH5P&UHޞذvT-im?j=4ί\u0016i|_v[#'nkc\u001bO%Nֽd$l\u0015<\u000eEt\f Q\tM\"-v%\u0005(\u0016|:\rO\\A6<\u0001iz\u001ctnqe\u001b\\x4\u0015gX˳3sǘL\u00102N6\u000b6\fGp}\u000b\\ЉTh]\b\\D^M\u001bq\u0001rĺ9\r\u000e\u001a|\u0013+n\u00056S\u0004.H'HK6md*}<\u0011fe8qr,v`:x\u0018k!xG}'2kL9kC\u0001n \f\u0006RV\n\u0016\u0007\u0017l~Wf\u0002h3RZHkrVu\u001amE̋Pfܤ6\u0017RhQ\u000024#p6+\u001e/9\u00020ݲuen`\u001eVH3\u0002q<M᥶J;.A\u0010/\\lZ;\u001bX#N\f8.UU\bǨD\u0017HiȈG5\u000b$uԽԋe伿;\u0000\b\u001cV\u0012x'-\nًo Zp\"\u0012ⱶC\u000ecX\u0015mjc*Γ;ڭ7/\u0019*wbCFvKm\u001d\u0012a#U\fa\u0018\u0002\r1-^\u001cA\n敯\tXV쇯;_@.NbW\"\u0010\r\u0003)\"\u0013A\fg(9\b@p(u\f\u001aD\t\u0017\u001b2}\r:r\\M6I|MKI)q,aVm\u0017\re?[.\u000b89ŅA\f\u0015Bwd\u001fa|$(J#\u0000M+^Lgdˎf`E\nv\u0016\u001eSU\u0014f^+8\"_2zQ\u0007J\u0010!\u0000P>C\u001c^@}W/DqN\u000fFo\"\tum\u0019t+l\"ln(C\u0014\u0011\u0015N:Lv2}l\u0017e%%i\u000f~/E\u0002_F~,\u001e_91&Օ4ζ[9\\iب\u0001L.yTq`\u001b&mҿSc׆jg\u0012v><Fľ~\\[\bcdiۮq[\t\u00147\u0005b\u001eP[E&s'9~\u0006$E{]/\b\u0005^\u0010\bƷms\u0005xv.RbZ\u0005j\u0014)3\u001cY\u0015iAB\t\u001a܉hD<Q֬mΫL`ߔ\u0013x\b\u0002\u000081\\H# ~\u0013Fj\u0000\u001b9\u0004vd\u0012\u001eL.\r3ج\u0000̙(lB\td}q\"IG3ūb\u0010b'*@I\u001c]1]u/\u000f]ߧV\u0006\u001b2-S\u001e8:p4@a{\u001b=\u000fY\u0016k\u0019!SLq\u00126\u0010`:5\"\u001awQ4%X?&@Syo%B-1sdBU<*m\u0013\u0013 5ID؎^䛕zT+Wj\\\u000fv\tVOq\u0019cߣrf{otjtw\u0012W?fl\u0002\u001c\u00172ͫ]r\u0006!\u0011\u0005\u00031\rT&`B׏eK\\Ä|\t\u001d\f 5B<w\u001f=\u0015M֨~3\n.\r\u001f\u001fGal(\u0006)C w}\u0000.Ḓ\u001ddN`\u0004gw9\u000bՈ\"\u0002\u0015(޳VMM\"\f.t\u001c\u000b)\\~ȌXpp'^e\u0010׆\u0013]\u0015<Ouۖȗc¬#ü47,[兕=Ԏ9n\tG\"WfP\u00013;+\"1bn$|hr/\u001f\u0013.#\u0002̍<'vX@.)L\rի\\Y>\u000e(\u0015sH\u0012ӓCtm72\u001ddhl]+CP?^Hf\u001dAmdJ\u0000Z#\u001b\u0018\u0015H.<c^\nAHuܤ[4Iӡ\u0018*ВͶ{Ɏ]X9\u0003\u001cŊhd\u0002\u0016U}MH\u000e\u001c53\u000fT6jv>)-z̵\u0004_\b3i\u0010Tǖ!\u0007\r݅\u0003\u001f\u0012,\u0005r\u0005C\u0007+uX\u00069!\u000b{@*\u0014Հ\nXm_\f3RwAA5\u0013\u0016\u001e*,bq\tt\"?\u0012ȕG#/P3`7V\u0001Đ-ߞ\f\u0000\u0001kj@A\u001f[ܶ+\r\u0003\u0014G,\u0000\u0010i-\u0006vܲ򚻼GPG$4Nu\\\u0004٥t~XQvޤ$5|1\u001c04R\u001c\u0005\u00016[g5Zd\rD&*t&:\u0018\u001bt^\u0013YwMW#\u0001\u001b\\\u0013\u00140b\u0018_Є\tJ1'\t[/E\u001el\n\u001c\r7wH~\u001d\u0017\u001aKF h\u00154\u0015Bb>\u001e0g@\u0018\u0014`K\u0016d\u0004R\u0013r\u001eq'\u0006\u001frk\u000bf{_6\bwd$\u0010ʦ\u000e\u0002\u0000g\u000b#\fk[\u00162Tn\u000fJ@l>O+\u001d\u0012\t/<\u001a*%\u0000=\u00199\u000b>Y\"Di=\u0014roгE;\u001b웧\u0010\u001bďa!=\u0003Vh/B\u001c|\u000f\u000eF鬾Kp\bY0֯˞n^zV6i?=\"^Z\u001a֎\u0001g\u000f\t\u001fz*4dfN,\u00072PNy̦uƂB\b\u001cN\u0012ǂ\u0001\u0015+.\u0015ך\u000eX\u001bR-ڪ\u000bU\u0017\u0007\roTlL\u001bHq>^hGxj,%\u0011o\u001f`2\n/>\f!_0E\u0019CXI\u0006WIRd\b-Ak\u0012@O\u0011&\u0010Wg\u0014 *_\b\u0018ȯ&2\u000b\u0012&L3\u0007&$\u0016\u0000\u0012\\_\u0018!\u0014\f\u0001G\u0002;vi.0\u0001bP\u000e0ŉ\ra-ZHvwJ;S\"H\u0004\u0000\u0000\u0010E\u0000\u0000\u0004\u0005v\u0005\u0010\u0007+حCuV]Z֗W~elwJzם)#\"1e,\f\r@q\u001d\u001bL\u001aAT1Ы;֖[Z\u0011Ɉ4\u0000s\u0011\u001a\rRi4=>QtF(r:X_Vzyd+2:~\"\r'r:#Y1\"%ʢ3ʰ\\`8\u0012s)y:K<-Y_F\u0017꒫Җ?{W{_ަ\u0017kz%K~y^;+[)W+;:OGg\u0000t߇E:(3-H/#\u0003\"e8b^SʗRo^'OoY[_UsR\u0003<!\u0017\u0006]۸0:Y\u0003* H\u0019\u0007\u0019\u000br:Y'{-k4\u001e4v^\u0001Kvy[K+Jߕ{Q;N{jeϿnٕR.kV>j/i|oZnzD\f%FF!&\u000f\tpT\u0000\u000298\u000b:{ϾN]䦔2V:i_|rS^+϶Lm?^|#qs>;Sɖk>mϓֶ^H\u00189 `I\u0014K:ξ8<i\u001cpkePf\u0000!iBP\u0019\u0015qH/\u0017Ws\u0011;\u0012\u0013\u0012Upb3h\u0014\u0002\rh\\-V;_V\u001ajKl\bOY*աd4֖q\r\u0019t\u0010iJ\u0004:SƠsHKGJi_-ƶi\u001e\u0014\u0006-dƶiPkn\u0013~X%F$\u00111FPbD\u0012{>i;zU,e3}mT\u001b!.\u000f\u001f'\r4\u0013\u00166\u0006j\u001c\u0011CDNT\u001b\u000fk]2\u0019\u000b\u0006F$\u00052\u0004\"r\u0000t\\%\"\u0001AH\nޖh2wd;c7<#7\u0000crGJD\"ޓ\u00124\\2~g^L9r䎗\u000bG蔈\rL\u0005b:.ND<q}!)~Y\rN\\\u0011W'MUN\u001fD\u0015H\u001bPlq%L&;jTxQZ]Clo\u0002\u0019C/r\u0010<\u0012Xb%^xi2ԇ\u0011\f\u00040\u000b\fg_TVڗӗH\u001e\u001f\u000eR\u0015kSf)m,|k{[5-۔ko{/[kUtޖ^5JSNڷ)m9U-tֺe}/zɲNkRH׿vڋZޮ_-OHDMW6ۯە5-nJl\u0016+g״D$'tL[66[~\u0016u6{U}UK<%|ie^{vʵ眔2stylT:eM\u0004tjտ/\u001avu\u001bVzmi+W%̕tom'OjQ꒝~V[_YҽNY)uKm^'eδtVr~[<eKiEZRv+ex^sGDK?}oV҈D$\u0012m~iϋZJ=_+g֞WJ~\u0011\u0012;-?t^=e7oVS^X(,X\u0000f>m\u00122\u0011\u000bt6\u0001Hޤ0#a!6\u0010.\u0004['\u000f[X\u0000\u0000\"cb´\u000f[F<\u0019\u0016fD\u001f\u0003\u0016(\u001e\u0013\t\u0016b!=DJ|o)\u001b\u001aJ\u0010D\fi/)Y6zK:^ڶVϔ[_K-%U!\u0018\u001f\fQ$Y\u0011\u0012\u0019(n\u0003.dgUڴNI9m\u000b[\u0018`h-\u00056\u0012`o^:VYYZ\u0017|R)HBD9-ʖ>-;[kSڿv+mV[/fzY^;gm?NS^<祲O;g=Sպt+%}+ξ'Kiֶn'}sOI}ʖӾuOUJzge-i|o/ɔYl)}uu/ϖ֦DS{饳tz\\'h_+)vJZeuw_ߩ_Jjmܓ⮖/J/jʖܓ;f_ĮRɗs[J8YR^{m]KmMi-?/RkRvZiN?}i֗K\u00173`*(\u0011\tH^[c4\u001f׹~kk-ItR[g[Wv3\u00179K?k[<%w+fY[}픴#\u0015a_.(.۷OWV=ODkmhl`FD^/gˋVn^lZүʯ^[-Ru{I~ߦ+_[{;[T^*_:;gI]wJeuf9򺕳^Z;'{鷳3iRmlv)ghuLSJIo'igm;A[:O/ϿhY^T~9F\u0013c>#|&Kt:j\u0017hOd[Zikm&ξ\u0017[͔Y^Fb>mR7ue^/M\u0018M\u0019Q}ާb׭mU΋\u001ckh⭍9}^[dl+-R\\３S眵J9*[wkS:=J2WO?w_v9-޾u6ʟ\u0017{VMݍDOY]r*m*-O>y/\u0012ӲS~YJNiJ-VJ;ZU:?)tJķ\u0019QdJ.YVsR)[fy:lji__\\es*t<ڿ>my:[+Of۳Ie<_o|[ٳP\u0013k\u00059eܖli*])\\RJD\u0012)̀d8\u0017\nF6\u0007'\u0011\u0007ƄK\u001f\b\u0019\u0005X\u0002c10yV˳P_\u0016\u001f\u0003>\u0002D\u0004l\u0012`d\u000e\u000e|RB\u0003;F\u0000Ѱ9ӱb)QZ!\u0004\u001bP\u0000\n\n\u000b%p4\u0018\b\u0004\u0013ж\u0006%#*\u0010\u0001ZqDeB\u0007\u0011>\u0004<M(P\fG-V\n\u000bh0)MD$ʤ`O\u0002@\u00068P,)\u000e\u0019%VhGh<F\u0000\u0016\u000b\\,*\u00178&*cJT&q\r6%BĐAV\u000ee\"\"B\u0010\u0013u&\u000bTaq@NǀB0N3]v\u0018H]wy\fTw\u0002\u0016h\u001f'60ETiCQԅ|\u0007e\u001b֝\tPߩcy^x\u0013\u0019\nS\u0017hjWȥ;..iAl81D9\u0010QYuh\u0006ċtmP.[e\u0016yԅt\u0000\\e \u0018K>2TBy޵\u0003o\u000b-BS\u0017\u0012ש<mK]\u000fc}\u001e\n5eB82\u0003.\u000f۾lAw`^\u0006TCef8mKe(ӵbx]6\u0015r)\u0010<\u0006]c\\\u001e\u0003\u0001vy\fN\u0017RBN@ܶ\u0019\baV`\u0006~ق6ԅ|\u000bD-21!P@2>\u001ci\u001dmm\u001b\u0014U\u0014q(2:\u001aK(\u0013C\u0019\fdZ [(ۖ02C\u0019\u0010\u0000\f҇Ԫ\u0010<@8mAg \u0013\u0010DqŅbwmￚٻ۽9EĵRa灗;3v}{8{7`a_\u0006\u0013]}1<\u000b\u0006\fuŧ˿\u0014n+NBp[q\u001a\u0000.le>\u001c\u001f\u0010xL\"V\u0001@&b\b`\u001c)\u0016`A\u0011ٶuhi\u000fCqXH\u0003Z}ŗ1<+97OB\u0019\bҾRwM+ed:6D,@Q\tL0e\u0003B\u0010`\u001a˸\u0018\u0014ON`ƹ8\u0000:nŵ\"a\u001c\u0007\u0019\u000bE\u0010S\u000b<ia1lu\r-bbm^2.\u0006_\u0017\u001fi\u0018H\u0016.rV \u0003xy8\u001c\u0016A,f\u001c\u0016A8m\u0001\u0006F.S\u0001\u0010*ه\fT%JB.\u0014b;e:cuqEB.CP\\Ru\u00162\u0016p~6V_\u0007@eXL\f\u0004c8\u0000:N\u0003k\u0015\\}Fa\u001b\u0010N\u000b5T\u0001}<<ˇ\u0014\\4\u0000\u000fH)2>\u001c$p.15\u001bu-\u001b\fdOmZ^i1v\u000b;甩z,F\f\u0010[aP\u0006˾}\u001b\r_a^LʲMӅL\fe(1\u0002y桪a[wZ\u0018@,Pl^\u00113\u0010\u0005a\"\u0015Y\u001bʴ[\u001e6a\u000b[\u00182} 1luSǭ\u0018(\u0003<þ0L1\u000b\u0003\u0018\u001b3Ŏ\u000fL\u001bt1[e`y\u0001hm6[ \u0013\u0006a-\bi7\u0001?ue[kD`\bR\u0016)R\u0016BQ4ՀlRݗLΗ\u001b\u0019\b6\u0019ȅוbe(պ\bf.\f\u00043!\u00124K[0کG\\d_dm\u001e;EONa*\u0013MV\u0010\u001beEڶl^WV\u0010X\u0000,B\u0015\b\u0001i\u001cVf!ζe\u001b?oNG2m-O(/ڔT&Ur]\u0000ׁ\u001c\u0016r\u0018\u00060S\\`\u0010ľTd)mW߶e\u000b0\"\bfHv\u0003i*P0o\u0016b[6b 6ͤ\u001aGa[F66bePF\u001apkyhL\t;V'L0P6Ӿ,c3a]lة\u0013З\\qB\fe$J\bU ڈJ,4ؖq\r\u0015Z\u0000\u0003\u00152\u0007J>1ˈ_eaݡ\f\u0002\u0003\b=M8\u0013*5\u0000\b\u0006(^\u001bb\u0001\u0015\b \u0003˘ae|$X\u0019\u001f\t\u0012\u0001\u00077`aH\u00001$\"\u0003\r\n\u00024r1q\u00011Q5`6&\\IoLB+<ć\u0019\u0010\u0013\u0015\u0001SU8>\u0012\u0015\u0001\n[8&!\u0014'\u0004\u0016\u0010\u0010 \u0014\u0005Cd(AD%\u0002\u0011$\"h\u001c:P&6\u0006J\u0018\n\tM\"\u0010D\u0011v\b18\u0014\u0012\u0016P\"ܸ\u0007\u0001@>Wb\u0012!Px\u0010HCE2Q\u0001!\bh\u001c&\n\b\u0004\u0002& q\u0005\u0012D\u0001\nD\u0002\u0014P\u001cYȆ\u0007$\"$(0\f\u0019a\t\u0002n\u0001P+A1a\u000e \u0006\u0005?\u000f\u0001\fv@j`\u00186)P4\u000f\n$QL:\u0012\u0015\u0016\u0002`\u0007\u000b\f3<Bw%QFD$#Q\bX_6)NSD$\u001e\u001fʅs\u000b\u0015\u001e\u0006;\t\u0016X\u0019\u001f/@'ped\t\u000eQEOT:\u001c\u0007:CB!Ql\u001f><8t\u0007Ba\u0012$x\u001d\u001f\nRD%CB\u0003b\u0018\u001dd4\u001e:\u000f\u001f\t\u0006Od$\"l2\u000e\u0019aaґh|@\u0004\u001c\u0003+A\u0000,|8cs%\u00182$*\u001cL\"\u0001&vL\u0000B!Q\u0018q\u0015\u0003\u000f\u0014%\u0014œ0\u000b(֌周8\u00159(G\u000eMe\u0012d4\u000eȈID\u0002\u0000\u0011\u0002~\f\\t\bh\\جCThT<,\u000f\u0002!\u000f\u0004:bE\u0004\\\u0014H\u0010`DT\u0004$>X\u0000\u0005Ե|\u0010IDYh\u0018\u0004)y \u0010AjZ`\"*\f\f#|\u0019\u0010\u001a\u0016 d\u001c.\t\u0016\u0001R\f\u001c\u0004\u0016\u0001̅\u00198kq1y\u001b\t\f$ya4%*f9]\u000b\u0015SQ'J\rCx\u000bIAp<th\u001b]&\u0011\u0000A\u0001vC(Yd<cE! \u00024saas0\u0000\u00037\u000eAf\u001c>\u001f%\fpm&@R\u00054#(\u0010\t\u001c0\u001d\u0006M\u0006\u0005?4\u000bXL\u0016΂Á$\"Y\u0010LiB@BɌАLh\u0002\tϊq\u0015\bC&\u0011BM0@p\u000e\f8&\u0003U1H8\u0000\u0006\u0004BU\u00027\u0002\u0016@\u0016d:!`D0L\"*S\u00050$Tc\u0016\"Q'\u0011\t\u0001\u0004\u0015gW`%4,$ɦp@\u00178\u0019nM>@`F$\"\u0012,l&2.}d\u001d\u0002^\u001a\u0010\u0013\u001a\t\u001e\b\fs&\u0014*6\u0010\nq!\u0007մT\u0004E\u0000ETTt\t7\u0007\u0001\u000e$6 @;4\r\u0006\u0003\u0007\t2\u0011b\u0016:D$\u001fFAG{@8|\bD`p\u0007LT\u00014H\u001aQ=Z\u0002\u0005\u0014w,\b(\u000e\u0010,\u0017V\u0000KFA4&\u0011\tg\ty\u0018,/²\b\u001eA͎\n\u0003\u0001\u0002\u0004\u001a\t<:\u0012\u0016\u0001<H0B\u0007\u0007\u0000\u000f\u0013³1y\u0011$\"\tUp\"p\f\u001c\u0002\u0006.&\u0011I\u0006@h \u0000?)x\b\u0012\b3HF\u0017_\b\u0005E`\u0004\u001eԪ&ID\u00150 b.-؈v\u0019\b$/ܖ*\u0000\u0005gu\u0017\u0013 KtL<$_Gd\f\u0019 p|<|\u0018\u001b\u000bn5I\u001e\u0004\b<ᬑB\u0005 \\pGĠ(0᠚\u0012\u0010[DERP ѰјD$L\u0000\"8\bp \nDVTQ|,XT\b>\u000fσ5'\u0003CElwP\u001aH\"ցo\u0000\u0018}\u001dSơ?J\u0012\u0005\u000fO\"^\bpA ]<C~\u001f\u0014\u0012$\"xXy\u001b\t2\u0007\u0001\u0003T\u000e4t0`\u0014\u0004/$\"X<0\u000e\u0010 \u000ft7i\u001c\u0004ID2ThTtJ\u0010\tG\u0005\u0000\u0018}\u0004\u0014m)Q\tP`Z\u000eʅDeE\u0005\u0000\u0019#\f\u000b(^Xu\t#Xp\u0012PH¡\u0002\u0007\u0012\u0018}HR\u0011\u0012Z_\u0007\u001534dP$\u0001J\u001e\u0004\t\u001b\u0005|U@dqL\u0019\u000et*°ID\u0012\u0000\u0012\u0003\u00194l\u000eAr\u0018\u001e\u001a\u0003t\u0001(C\u0000;\u000eFqaf\u001c`<\\\u0005:$\"\u0006\u0004\u0000Y\tVP\b\u001e2&̄?\\\tLŇ8nt`Y\\HF!q\u0002\u0004\u0007L\"\u0012C\u0000\u0015\u0012\u0002\u0004\u0005eBpc`dX\u0010]^\u0002_$LhPT`&\u0016ID<A\u0003\u001epHq \u0003ţ<D$\u000f(s\u0006\u0004\u001dLdqN-\"\u0012\\\"!Ƞ\b]LR@HTIDh\u001c\u000e\"&l!\u0004JS\u0014h\u0019\u0014[\u0004l\u0016\naŖ\u001f:d<܃,.\u0004\u00068yh&C\u0006Q\u0018X\br碙$Aǘc\u0001\u0001\u0000\u0000S\u0012\u0000\u0000\u0018(\u0016\u0014Bp\u0014\u0000\u0004hZ*N.8*.$ƣX,\f(\u000e \b \b(c1H2)i.\u0001&\"wb{Z<jj\u0005\u000bX\u0007\u0005VbЄgS]r~h>aE\u0003lծ\u0005kO\u0011\u0000|,}\n[v\u001fV\u001b\u000bΚȈN\u00028\t~-}Q\rݲ\b\u000b\u001eG\u0001/a\u0002\u001bhT\u000bQ\u001b)k33F<es\u0015\u00005\u001fj\u000bFjQ:T\u0018Ymw\u000e$*/;:a3\u0012\u0007Yh\u0018P\tþ87$ce5$0&\u0014#?2|\b<`XZ\u0001i\\dp˾i\u0001\u001bU\u0010~טjOYfP 6~Zfh\u00036\u0000'\u0019|EE\u0006\u0019Is\u0017Tad\u0010+D#Ν5w\u0002\u0006@\tB \b]۶Pˑ[.\u001d@8f\u0014\u001cܾgna4&\u001cDff\u0000#ڱ\f܄\"$\t$\u0010\u0007TJxnH\u0011y;l8e\u0001]|NJ a2kl\\C\u000b\u0007\u0001X\u0011;\u0012\b'8L-Gf\u0002Ah65~5|Ai\u000fJ C4\u001a6H>KS9ɺU\f\"\u0019P\u0003p\u0013pʭӺe)\u0010OS\u001c64lmъ<\u0000@1yMvl9@/'M0;%\b\u0007t>}\u000fluڡR8f\u001c\bL(/Ձ\u0001l\u0013\rl0{TQRA1|3\u0013PJX-\u000eAԳ\bMC\u0001łf$[\u0013b+g\u0004-`6$.4i\f,*l\u001fTj\u0004I\"g\"Tu[.\u001fE3\u0006\u001cU&\u0001pNE+>\u001a\u0012y?ӼX\r]`vݢȹ&\u000f\nD\u001fE8#Uh<l\u0005ʛ|<r\b\u001aͧZv\u0006Ĕ{Yq0&#gAca9m\u001eD6i\tU;&p\u000b_Yv\n\u001aIF#\u001fxl:`\u0000\u0002\u000eh\n\u0014\u001d4v\u0000\u000fkڑAL\tuJ8?TطQKcn&^\u0015~s$\u001c\u0018RikΚg\b\u0007\\ \u001d~ƬGuOD}\u0002\u0014J:E+dh\u0010sA*5\u000113v۲4D\u000e\u0015\t\nK\u001dK!R\u000f\u000b4\u0017@\rTh+x3\\c\u0006O/)Ǡ.÷\u0006 \f\u001dS}\u0016a\u0007)\u0001I8+Zu5rF\u001ev\u001ap ahFn\u0006\u001c \u0016A u\u0011^Z\u0010\"1\\\"lJ\f\u001aiOF!p\u00152t\u0010\u0010_<ԕ\u00065/ڴ'n'sHJp¬\b\u001f+ZVW¹JW53Kj\u000bScrty\n6=ݾ\u0013s*{\u001bǘM_\r\u0018%~#*\u001a.y#~\u0007\f`Bǯ\t\t¥|`8r\u000f`\u001d@z*D\u00020d!LN! \u0006T\n\t\u0016:^(i\u0004TC4l@\n8\nU\u001fJ\u0004<<8\u0004O\\Oo\t\u0016Y\u000fu8sKB\u001dТځ\u0003~qA!w\\M(<\u001d\u0006\u0018\"\u00018liv|YY.\u001a9sM.\u000bFHjk;-0tFR[\u000e\u0014#g%\u0017_N[\u0012\"i\"\u0000d)%Fl(\tcTU\u0006`ƎF,p\u0014usx^S8Z\t8ր+\u001c1|?\b82(C{\u000etRiq?\u000e \u0014dC\tk+\tM\bHnXEs.k\u0019yoK\rh:\u0002*\u001aqB\u0001=Ld̖\bXH0ެĵ~IZp>{\u0016\u001fY\u000f$y!FI ʾ_\t3{e:JG3\u001b?\u0007\t``n\u001d@ֹ˼m1\u000f#͗Í,\u0000m'\u0001\u001aFB1\u000e!/U!\r\\@*J8KûjNK\u0005')(VYl>|\u0002wQc\u0003{\u0011:/\"&kOP~󼑙&Q\u0016%piϑ\u0004>Z%\u0006\u001d*\u0015߰L.T\u001dgc\u000f\u001d':!Y\u001a\u000b\u00035p̎\u001a\u00065 yV\u0011+\\2gH\u0014C\u001f\u00027`\u0003#\u0019uʅs\\?ҙlI%rFcPͼ6\u001e({]\u0001ԣ\u0016U\u000f_\u001d\bH|\u0001(\u0015\u001dBʅD$\b\"1\r\u000fO\u0001E0D?\u001a4~}2dZӈhQ\u0001\u00015\u0013ŗeh3t)-\\\\F\u001d\u0002z,⦽Tݶɶf\t\u0018P\u0010\u0017֠C\nn1\u0017wou;߆\u0018tS\u0014\u001dza\u001dT,ZLm]7\r\rg\u001bh?NngZH\u001f\u000e}W>͊\u001d-\u000eb}1F~8J\u0014!I\u001cF*3j:+\u0006t*ȓdUm\u0001(\"\u0011S!\u0013egW\u001dg\u0012c~0Dgs7fXZ)3\u0017\u0006\"\u0004Rx\u0005Z\u001a'0|M\u0006_\t\u000b˘3U(~L@n[\u0000Vٯ+$\u0016\u0019'AKW,\u0011˶)\u001b/\u001f4[Я\tZӨճ1.-/VT\u0014\f^O=d0pt\u0016K\r,\u0012`\b#b\rDn\u0013g\bÐM\u00168N\u0005!\"\u0006BK\b^'XJif\u0006B:5Z@k\"\u0006c0E\u001fi\u0010˓\nRy5M\u001c0~{/&2*\u001eIS\tѳ&Gn¯j$)\u001b\u0014Nd\u0006\u0014\u0012\u001c$*htjF4ͤA\u0013$ty*\u0016\"m<)\\ŉ*AQ\u0019n.D{\u001b@Gr\u0011\u0005GZ0gkCW\u0007DIE\u0002¢-͵`\u00007Jf!WL\u0016(\u001a\u0004#δ~-AX\u0000g_\n\u0016]8rɘ0\u0004+@lY\u0006nXP.]\u0016;RS\u0014뾊qmI,1H\u0017\u001d<K:뾑~_H{)cr0e;uLz;\u001dظ\u000b^\u000fIݐcPkB_\u001f\\.In\u0004\\\u0017UH\u0011\n)\u001d\f$\u0005\u0016K\no\u001b \":<}8\u0015\u001bY \u00145\u0016ضg;W,m~\u001cIfp6\u0010x8\t5ic'*uԄsMtO)YD\b \u0019Ͱܔ\u0017:n?Ud!h#LB\u0006Rձy2\u0001S}\u0012|\rל\u0011r2 ڪfϑ'B\u0011OB}Lak R\u0003v\u0010\u0017\u000b\u0004\u001d<XW#7PSy\f\u000fg\t\u0005\"\u001fXDP^k\u0016N;r5+\n\"\u0002H$w\u0002R\u0014\u001b6h8T-\u0002\tD!\u0001i\u0018~4>ܗRQDG\u001aAdp7\u0014XE\rtC(_}\u000f@\u00067\"\fETv/!\u0005\u0002T$\u0016\u0000\u0018N+F\u0016M(.\u0010*\u0000.\u0007\f3/\u0016\u0000\u001fD}\\\u0002,*\u0015\fIڟ\u001d\u0003/ g1\u001bZ`k,8ɐd\u0004\u0015\u0018M\u0012,'pڳ#\u0015x\u0017\u001a\tʥ^l\u0018jA\u000eC簙Q\f5c9&nqt\u001c\u001cٸ\u001a\u001412G(X܍\u000bKv\nYJ:\"0-\u0012F\u000eFwK\u0014þggR@\u0016k/㳈h\u000f\u0012\u0006]АH^C\u0012p\u0015\u0006uٲ\fU\u0010pDg\u001b\u0010ЉR >S½p$\u00018;тfe3BU\u0001b\t\u001c\f^-ϯ\u001e}Ԩ:wA$z+\u001dV\u0002O\u001d\u001a笸w\n\u000bыv:Ь(\u0014\u0003Gڃ8ʨ\u001d\u0014 YRz]7:L=\u0004\u0007['\u000f'~8˛5,\u00042+h\r<Gd+P\u001aq(=1)mO\u000f\u0010z\u0012\u0006G\u001d9@3\b\u0004ϚX($CdYsM\u0002I\u0019UQ#\u0001 #?Y\u0000&+wz+3h%p\u000f͞Kv\u001e\u0010\u0000Z\"Ѕ\u001f`\u000b0QzO^VYZ%\bL\u000bؔ\u0003t$\\+\u0017bo6f\u0002ȣ)c\u000e}:x\u001d\u0016\t$20\u0011\u0002\u0001M:tQ9T06\"1@\\Gr_-\u001dA\rQVJc!3e00/s{uE\u0013l.A4+]S8C޲(e(\u000bC\u0013xȊ~9C#}3|J5]'\u0003aj\u0019R#-=SU\u0019{$WlB}æ]H˦O\b#Ġh#Y\u00005<\u0015PJ'\fJZ\u0005WY9\u001dx~\u000fRo\u00002΂<Kz,\t^\u0010Mv4:CA\\2Rە\u0004e?\u0012\tL\"y?\u00018<A/^H0t?\u0002\u0004p{s\u0004MPb7f\u001b\u0004De;\u0001srw\u0003P\u0018+ev0Y9\u0000-_cn%\u001b\b\"b@$r3\"E6T?V\u000fGУGoO3gd\"\u0019~\u0018\u0007;[{'\r:tB\rɚN\u00161\u0011iX\u0016rd$\"9zK9c\u0000\u001e\u0016l)\b\u00024\f߱\u000eٜ鄢NΚ-pl\u0003\u001d\b\u0015\\݃Ք\u000f\u0019g [\u001b\"Q\u0007+sh\u001a\u0010t9\"L~EWX*`\u0018\u0014ǑN 8<q<Л\b7;iWb:GS\f<\u0006u3NgNbt䞇\u0014\u0010כ|)\u001b#6t/2ύB:ۯ3\b\u0016t\u0015\u0004*ahYoBQla\u000eM\u0015LӇ^\r'\u001f\u0013N\u0004\u00121#DO\u0015Q~֪9İ^$Oi.}4EmpeBL\u0010\t5\twgTW%jܬ*3~@8M!;ffq 9\u0004W\r\u0015cu$m׊O\u0015\b\u001a+\u0010\u0000\u001alh݈6&Ġ\b\u001c~<!\u0019q5\\\u0015VO{7\f\u001c3\u00155\u0002p\u000em\u0010fO>2әpnk\u0005ox[AikM\u0002\u001bkh\u000ek\b%\t4l,wPUn\u000b⥒Chֲ\u001bPb\u001c克o$&XnY0\u0005dm'S+\u001c]>o]\u001f^ۦ\u000bEi=d1\u00172ՙIMyZ.\fk-beעZ3\u0013F\u001bХQ*-PX\nH\u001e-AP\bRY\n\u0007e}\u000bq<\u0007cj\t\u0004kZi=7\u000b\b#6s~\b5觴\b\u0005|\u0003\u000b%i'bH\rE\u001es=\tj;hq\b?W}doImJz\f \u000fz%,\u0000:4\u0002~\u000fd\tt2$ť\\綣h\u0002\u0001tTw8;\u0000*si\u0004=\b\u0017y/6%^\u000f$/<\u000b\u0014\u001a\u001d:\u0003нg'u\u0014u`[\u0006\u0000\u0002E\u000b ܛ\u0011ZG8n.g\u001b2\u001d7\u0014\nDqC:w·\u000b[8BrYo6\u0010\u0018(@*l\u0011\u001f\u0002]~H.uME\u001e>j}Y\u001d\u0002U\u0014O;GfkjpY\fW7G)4\u0017eΉy$\u0005U:5)\u0006.XH\u001fV\u0005\u0003\u0005^z\u001a\u001f!nAlPzf\u0017\u0016s\u00171\u0015\u0005\u0000}B\u0003glI\u0001t\u000e#'om\bƚ&\u0018Kr)DZq(Ur;i//EYy6oIO\u0011Cl@YH&e8\u001e0gl}\u0003&Vd-\u001c\u001bub\"\u0004}ꝒR;/\u0006{YGYb\u0007\fRPs[WH[\u0004\u0015z\u0007ٲ>ۓ\fIWj\u001cOSOGj͂\u0002\nQ\u0004j\u0018\t@Ł\u000b8\tAWZ}͘\u0017w陗+\u0015v 4'?do{%\u00076\u0017\u0011ٕBE\u0000\u001fk\u001f\u001e\u0013+S\\q]x\u0015\u000f[.\\WC?U}\u0016ǞӯSkОmpܰ=W]\u0001z\u0016*\u001473\u00048B\u0018͘UAɐ܀\u000eXJґ4<L\r'_4\u001c:6\u001al\u0005sy~<V\u0001p\"\u001a7\u0005\u001d\u0005N8&Ԛ\u0000\t&y]Qױ\"PJ@\u0005\u0003sg&lq\u0004d=iӁW\u001eJ]\u0012\u0002\u001d\u0003L\u0019Hl_ut \u000f\nHU\u0000TnTn\u0015ϠNw\u0000C\u0012DnA4\u0012\u0003F\u0015{)XdA\u000be\u0004\u0015XZ>+5\u0002*\u0002\u0013Yћ<\u000f5A\u0011933HN\"->\u000fNj\u001dZ\u0015O;+6\u0018vz\f\\*RUGB%NzU%#q@.jUUL!g-w<GZ\u000fBh\u0012oOs۝Jf\u0011m&G\u0012G!᥀xblcĸA\u0015mү$3\u001c&\u0018\u0003S\u0006\u000bʁ\u0017QB*\u0001\u0002K[,zJ%zfy\tp)aT \u0003χSnF\f\u0001\u000f)|*I\u0011|Q\u0001,,ퟙg\u0015RAQ=%FLȜۧ\u0000-\u000fE,-(BY١b\u0016\u0015rPњ2\u0014FeuNIEdiGRBЈB2\u0012u/gȯ\\I/\u0007f!w Ki-\bG\u0004ob&!|RV~\u000e\u0015G\u0005.X8zQ\u0015\bag89ƙ\b\u001dn#XRrPEtWFROw(o\r\u000fe{\f\u001djGJ7I\u0005f3:l\u0016ET2*Ŧb\\!\u0012p1a\u0005)*A!\u0004D\tp3TP-Ъ\nszZ\u000e\u001f!T\n.?2\fb2LDs+\u0018j\u001e\u00135QjV˷\u0000#\t8m\u0015[Bē\u001a\tr\u0004+7P.;s$\u000b\u000bx|QxY,f\u0012ym(r\u0002\u0001(P\b5S(B70%t\u001b]\nh>HӒ$^T3=Rߪ0_܅wю,\u0011\u0010VsR𕧐u\u000e\b`.'+\u001dG\u0001{\u00167\nx\tc\b<<)ƅFs;׼#Eaf2@QZ\u00146pbOt+W]ę嶢lx>\u0015r$\u001aF\u0002e]}\n^\u0000%?.IA\u0013\u001a\u0004\u001dCw۸pm\"(Zx6))kVbP;Quԥ/\u0007Ŗ>7E*λ֕\u0002\"T'y\u001b\\hq\u0014ICU\fn\u0005\u0004h\"_icL\u0019d\u0013ӛ耻\u0003`ytiB,*=JLr߇Ƀ2\u0019^\u0016IBUTߚ\u0014ʲ\u0001\u0012?} z\u000b3v'\u0016׉\u0016\u0017Dg\u0012\u001d&'j!犡*mFG3y\u0017\u001aHOoD!f6`'ď2\u001dbiKr\u0011\u0011b\u0019%%x\u001f~f)$;C\u0011U\u0006Qh*M*ϼDY[)x\u0000\"\"I\u0000\u0005 \t&<\u0016$.\nR@96ȃlo|:\u001a+:\u001835\u0007lR\bu\u0010\b.I\u0001Իn\u0004\u0017HZ7,Ǿ!Z%\u001caH4/F)3D\"Ԫ\u0010ӕNl>KS` GäxB4-Yh\u0012#\u000218Qy\u0014AO<E+\u000b>1\u001d|^xH\u000efg.y?\"z\fH\u0016\u0010$'\u000ebyyKIߟ>WN1/B,9&e\u0016N|.\b?lvR̎E\u001d#οc+V\u000e0\u0006\u001a]#b!j0\r\u001dv-8-A^5\u0003\u0005Pީ\u001b,(\u000e۬d49û\u001c\u0012\u001aXعbØ+_^ydg[?F\u001e4\u001aݎ.zCP-\u0018\u0005l|wȁզʂm\u0002:A\bHHd\u001blM\u0012$w\td2*z\u0005Pd\u001clBز>\u0018\fP\u00070w~v:|ǡ\fU\tW@&C7dlGJ,~'\u000e+Q  N?\\>-wdL\u0002(w\\cJ\u001aS:q)10a+9˄(\u0012$RH\u0012%hɎw\u0011\u0012*Q/\u0012R\npR)TH\u0015AYd\u001euS\u0004B{>,⺢\u001bb*s\u0012EVT\u000b\u000eTDA\u0003);\u00172L\u001c\"2nD.q\u0015آ\fJ>\u000fFYCl\u001d\u0015Bj\u001b\u0017M}(\u001a\u001aN\u0010R\u0010\u0000\u001b-jL|b\u000fӾ\u001b&\u001d0$zZW\"h\\\u0015\r%Q7U\u0017Q$\\:A*xy^\f؊fEAS$ $CsPt<I\u0005\u0007\u00123$\noɷmM\u0012k&!$Y=\u001b.\u001f0MdwWG,+T\"XIRUgJ\\\u0004GT|f-$hՐh C22FPU[7%L\u0006{Z\u0006%4\u0002+HH,B\t\u0012\u001d\u0001d*ȈP%\u000e1A+\u0015 #%\rG/Z\u0011\u0014A!$p\u0011\u001dWpH2\u001f?Ԑtv\u0012./bABЪ\u0004IZpo\u001f\u0001ET\u001a\u001d.C{\u001d$\tj@\u001b[$W\u0015Ɔ\u0010\u0017\u0019\u001fX] /s+rtA\u001dZCWX\f|gI_G4!:҃a=H~y@x\b)6B0\u001e GhD\u000b;݇@U\u000e7#zGeX;5\u0002t:I(ys>ϋ[GyĮſ\u0011x:j,(\u000f<\u000ewmq\"DB-\n^\u0013];\u0005>G\u0013ΨnšWJ,M@%P\b*::>јh\u0011U\u000f5~1\b\u001fHllE&j\u0017pĭ\u0016FN#No\u00016ɹ,WW3R9vaR~蹉ě⒊,[D.\u0013C9\rN\u0001oC4\u0000\u0012fu@\u0006?@]OX?D%~/SK'\u001dv\u001eYۼM\u0012o:̳Rm̭x|β5ZBh\u0001k:\u0000\u001a{&\u0015cc$Z\u0006;\u0013\u0014\u001evyMKP\u001b\u0010\u0017WMPy.V\u0012lH\u001eze\u0013\u000eb\u0010|UT\u0001)\u0002 >^\u0000\r˯(\u0011\u0015\u0000E_:6DSg޴\u001b6=Jzv'\u0005@Q\u0017.[\u000fc\u000e&g\u001bE]{Rw\\9M\u001fR\u0010\b\u001d?`1(\\elٴ\u00074\u0006b}]zesҰ\u0018\u001f\u0005́Hsʈz`џ,A6p kotjo2T=/[Q=!\u0019'(T\\si\u0001\u0005&[\u001b\u0002\bF.zݡ!\t43+#ex/\u00070)Y\\?M=ȿE۱IVy-ZuYg'X1Q!+ߍ\u0010\u0001\u00050W\u0005 '1\u0002q\u001e\u0000Ixo\\4\rw\u001f\u000fB|\\\r\u0015 \u001d%,NS*\u0001\u0004$7E?~:d\u0016\u0016\"F5ȏ\b/\u001e>r衏\"bR\u0013סaY|4T\u0013tr?4E\u0012H2@L\f:~!M/\u000bۆ9lċL \u0007Hb1)\u000381ܱafJ4ѴY\u000f\u00027%\u00180 \tX\f\u00153\\݁K\u0016Q\u00071}؍,C[H[kzt\u0015@稼G\u0014\u001bc>u6Oˋt})\u0014q!\u0002w?t]3\b^XT\u0014\r8|:2T~]0\f0|<<\"K9~')^\u001b-\u001dTl\u000eF\u0017\u00146\u0011\u00151C1F\"]qܥO>t\u001c*\u001dʆO\nιM{Fsܤ_\fOLs;\u0005\u001eKf\u0013Ho\u0015v\u0010\"ɍQ\u000e<\u0011G.BptB[J\u0012AX!?\\qNŐ_\u0005 q!+\",\u0000f\n#3Y\u0003-1cWX]/1~\u0007n2\"Jv|hVYsa\u00108\u0011jQ\fu4 A\u000b\u0003\u0000X\u001a\u00116\u000e\tܸ[QT\u001bDg\u0000\tMJ\u000b\f瑂Ss\u0001\u000e&=;\u0019P\u0002\t@\u0002j^\u0006K\u0016S\u0011B\u0017Š˼\u001f8ĻM,Hܔ'\f\u000b\u0003)ϲ})^L,\u0011 1)Px\u001d\u0010'&\u0003%\u001e5-k\u001cWA{Ψ?\u001a\u0018\u0006a#p\u0003n\u0012V)Ti+uI\u001aӠ5.\u0005.f\u001d06wžI9̀vٽ(jعU\f<\u001btq\n(Q\n\u0006B;(Eg\u0005e\u001fق\u0011+v\"\u000fΎ6]ZÒKL\u0000\u0014&\f\u000b\b\u0013y60&\u001dZRP4XŒ}\u000f\u0003ȁ0\u000b\u0007-s\u00113TA9}˟չ\u0001=\u0010Y!\u000bM\u0003v߂Z+f%\u0013}2x=\u0019s\u0000Ċ\u0004e\r n:c\\\u0019\u000era۰uryEpX*U#\u001b4vu2\u0005ܺl5mɮ\u000ehà:$@\u0007{\u000ei {)9\u0019\u0015\u0019x\u0017[\"Rp\u000e>\u001a\u0018'e0\u001aF\u001c&\u0000n\u0019\r(=\u000e-\u0007\u001b\u001a;q\u001a\f\u0013Ӯ5\u0011:\u001anOӉOt$WV{\u0005,߬'g\u0004:++\u0014\b@ ɁgPg_s@\u0014uf\u0013\u0017\u0012̋'\u0014GD\u0005p\u000e2\u001d\fBpn!\u0012ck̤ ޥw\u0017^>f\u0010I@/\u0013\u0006{IjkdӇJ\u000f\u00167\u0014Ϭxºd'\u001cD5`\u001eAm]0R=B_FJ\u0016 \u0006^OAr'ṃSu}s\u0004T4\u0002~\u0016ogw\\\u000e\u0004@WYWVHMAewYZ\\%uB\u0019\u0016_2xk\u0016KZǭ\r cjGO;\u0006\u001b\\r̴s\u0007Cx\b\u0016:\u0016W/\f\u0001\\*V\t4\u0013%w>?n4D@s\u0005\r\"Aj,`u\u001a\u0014iMz\u0010\u0003jd\u0001\n5a\u0001sq4\n*UԐ\u00013C\u0001+F^^Y\u0006(\u000e/1Y\u0019ܯ>瀡\u00196<Z\n\u000e\r5_vM\u001d92,\u0001E\fm|@{\u001bJ0\u0015G3\nFp2ͫIB+z\u0003p\u0011E<`A]C`\u0005f3ș@x\u0003|'4sȭԳ!I/y\u000fWz\u0013\u0003w\u0000\u001dp\u000b\u0018p?6ώbՁZ7\u0011\u0017\fhې3<I\b(/\u0004~-vǇ*P{\b40\u000f~\u0005}M\u001b@\rQ3@mG\u0001\u0014Gx3M^\u0014p\"~h\u0019p ?8|K@Ϗ\u0018\u0019\u0018[E2XD\u0017Yo\u0003KUJ2\u001e߽9@\u001eM)\u001aECj;\u0005K.)|k'\u000fuD#!\u0003\u0000\r\u0016`c[OG|\u0015Z6t-ZuV<O:I\u0002\u0000Cԙ\u0019񳇱!c\u0000\"6@D\u001d\u001b\t\u000f\u0011H(@\u001âhc>ek.\nE_P􈴬/NV)\u0003Z6zӾNWŏ\u0015w1{hJ5ʇx\\'\u0016\u0017/\\T\r:\u001d?ybG1\u001b}\"tD߫\"\tA6CD\u0006\rސ{vW\u00186]8\u000eB\nF/Nv\bhWƫ3\u0019.h\t\u001fYGR5P\u000f;\nLz\u001e\\~\u0007=\u0000P68D\u0007+,\r=aD7>̡̏\u0002˭SD\u0003*'nmgtaU-`5Pu+r'\u00038\u001d\tR`>\u0011Sc\u0011:;&\"H\u0010Pjc\u000fgX'~\u001d,X\u0016\u001a_b6d}VT6\u0007.\u0002lOO\n'^&87\u0004BL# \u0017pT\u0002Daz\u000b\u0019񿼛~SH%\r,\u0001kK4Ì{&\u000en^(7jW\u0018uG\u0004,K\u0015bf1܀\n2ճy\u001d\u0000x\u0018R\u001bГ@\"{\b$\u0012''Mu:B\n,\u0002\u0013Ow@I\u000b$*\u0000-*\u0019{\u0015Mʸ8\u0019\u000b\u0003Jo~R찓BO{\u0005f$bk\u0012\f\u001d,\u0017ZɊ\u0013\t`\\(\t;q\u000166Sw:̀\f\u001bZ\u001c~!\u0018D?{:\u0002\u0010\u0012kD{Q}o:\f^C\u0000Y=YEX\bL8Gv9>3|@\u001a\u00059(\u001fG=b\u000f\u0005G1p(\u001e}c[q5&7\u000bt\u0000-\u001cMQ9B\u0011\u0014{4\u000bD\u001c\u000fG{</e|\u0012p^2\"=\u001fOL \u00033\u000eWܱgT$L4\u001fW*\u0007\u0017Պߴk\u0013&ˠ\u00008\u001f{cf\u0002|\u001c\b\u0012B-h\u001d\u0018*\u0005.xl\u001f\u0014n\u001b.T\u0002\u0005b\u000e\u0018QF,6yP\u000b+\u0000w\u0006%\ty\u0007\rl\"xwV{%Ԫ\u0018|Ixa\u0006',Gu=}y\u0004MD͐\u001a?`_*\u0002Y\u0015#7\u001a@\u0006S\u0002?Zŝw\u00004\\ZC˸(G?y\u0001V\u0015\u00138-Z\u001a3/U7\u001esx)ݰO{/}{{\u001a\u0006\u0006Hef=ERi6bO_*[\u0004\u0012,с\u001aj F(\t\fs\u0018T\u0018U94<7f\u001aPz\u001bP271\u000b\u000f4\u0000I\u001eˮ\u0005g9ǒM!T\\۱B5.D\t{3bp\u001b\u000b\u0007\u001c\b!\u0018W!2\u0010\\}oH\u001c0`҉Sb\u000e\u000f[\u001c\u001f,\u0003%\u0000`~3\u0000\"\b`\f\u000eI\\\u0002T8Pt4\u001eOuy\u0001\fu\fi\f-\u00002\u0010\u0018ꇎy\u0007C\t7de<'KC;hW4Ѡ\u0010Sev\u0001\u0002f|\u0018ä9\u0013h!\tCM. Z\"ybkwǑ~N\u0004n\u0005T\u0007yxןdV09;r\u0005\bt0g\u001f6Q\u0012y,RUt\u001bG\u001ecJa6֥V\u001c\u001aoAGqOqkSkS$y:&\u000esrjى\rު׊&\u0015\u000fN4M/7p\u001e\u001aA27\u0012H\u0014j6'u\u0001\u0002 R* rz󧵻c\u0006_\u00185ge&1KN#mj\r\u00191F\"%;b<HMdK$j53`Z\u0002&Cb9G|{ͽŇ;n2YG@y\u0005p)o\u0005\bEd\u0006\u0012ߐZi~RG#c)պuB]+l!}\u001adEΣb\u0013:|\\hD~l\u0003pxsa*Kag\u00100T!'\u001a\u0013$n\tT,\u0006\u000bKIT\u0011ϥ\u001eB*Z²J\u001fQĊ\u0017D\u001a\u0006ǌt.@ >]]~\u000bI}C%$L\u001e m\u0000\u0001\u001125\u00029T\u0011Ԧv֍HDWJ\u000e'\u0002\u0004.7?#\u001a1\u001eWC\u0011.\u0012\u0015JԿ\u000f@}ј\r\u000f\u0017\u0010>t-9N\u001au8\nA\"G]\u0000\fzਊ\u001e=\u0013D#iAk3P\\\u0014aKS\u0014Q\u0003<Iy\u0011H\\^bF2\u000f\u0003Bd.\u0019\u0014\"\n\u000f\\\u00058\"\u0019y,>%\u001a~H\u0014H!G\u00031?d_ӵy\u0005*Ɔb\u0019ryAFyLq6J0\u0002\u001710b6<\u001e\u001f^5RҳLl@\u000eu\b\u001e\u0000%[$W#\u0007ȏ\u0002\u0004(Iȝ\u000b\u00145<4V}paUQUt\u0002_¡T-֞+bO0\u0017\u001bM$}7\u0019V<S4E\u0017ވN\u001e \u0018'\u0018\u0019i\u00184H\u0005\b\u0013'>w\u000eLƦwbp=&a\u0010ëQx@Q+\\\u0019^\nޞ֛de8yRIX(\u001e*=%AH\\{S[cJ`NJz\f$ފY\u000eD.y\t-p>A\u000b[7$`P\u0004${Q6@\u0001Zx\r^\u0014\u0013QUz-\u000eF\u001e4\u0006(^S-z^\n\u000f\u0007ws̬h!דYDkD\u000fԇa;-7\u000ezp0z+޷\u001aͣw%\r\u001b\n\u001dޮn\u0010h\b<:ԛՐSa#\u001b!fb\u0010o=8\n]\\zԻ0(\u0005\u0018ԷbS,\u0007w\u001a\u0013VJ3a]>6zsMb\u000e@\u0010n\\ŐF\u0013Ikq&\r;Ei\u0012\u000f\u0005Fr\u0005r!OScN\u0005$6\u001ayZP8y_\u00183٧>e9n'5.@\t}Ձd]^]v{i\u0013\u0001Wd֤ \u0016\u0015?,\u001fb\u0004~Poae\u001edOap@,\u0002\u001ch+dQ!fLq\u0007\u0002\u0004\u0018+ĈDI\u000eO\u00110+P\u0002ku@c!,\u000e!@Wڔ\u001e\u0005p\u0015mgήtQj[3K\u0002\u0004$/ќg[{&RTa0ul<\u0013˥M9|F7Z\u0017 \u00106@i)\f\u001a|\u0012\u0010\bʃ]=\\\u0004at^ȩ:O)$=ȂhA/!20~1b\u001aM4\u001aɣ\u001fmvj\u0013\n퉠\u0004 f/Cj\u0011lmgvjU\f\u000br\n/[\nlU\u0015o\u0004\u0012oRAqẘ{Dڽ \u0007ح\u0007XvZK\u0010\u0015!\u0003[\u0002yh\"Z4\t\rIa5O8\u0019rzZ\u0012\u001dk_+\u000f=\u0002\u0004-I}M<\u0004͏ڃ\u0003jwN8\u0011m\"ttץ\"K53B/EjD[o}4%\u0001I$ \txjkFp$Sa\u0016R[Ƒq\\\u0019'U5lj\u001d\u0006J;mA\u0011\t_ecٔw}͇\u000eHA@#2\u0011Gm\u0017/x_pW.\b>Q\u00182\f+\b\u00042`[?m(\u0014UN\u001aP\u001fNG*\u001b9'ּͫYHC`8X[l!nh\u0011h\u0004?8qv\u0014:\u0018ݙ$Qy\u0013\u0001=\u0010\\h\u0018anD]Z\u0001\b4<\u0007L(Ժ9'@UY\u00140e1\n |16 ǣ.71s2Z\u0005Ogv\u0001\u0002+A\u001c\u001c\u0017\u0016\u00185X5~^\u001c❞\u00168dZ\u0014HyCj \u0005i\f\u00115\u00182ޕ8eRkGQU_+\u0003MD\u0013D=))Rg\u001fF\bH\\}܏xχT!UHq\\Ւj[5֭\u001ajww\u0002HE:\f# eF:\u0004\u0006\u0005\u001a\u001b\u0017g\n\r3,\b\u000b\u0016\u0004\u000fn0Gm!NmȀh뷛m\u001e|3\u0000qi;EO4\u001aukIlH\\?,gC$\r=*$6<?\f\u001dzu|[2'\u001b64n!uP.$sC!.\n\n\u001aj\u0006\nW08tF\u0006ϋ0;߄!I8\u0006\b-T\u0007ZA\u0015t8F\u0004\rŢ\u000b\f\n:rpi\u0012?\u001aj8\nU$\u0017)ɱȉ(0\u0002\u0004TA'\u001e\u0013\\#\u0007Sm2#k\u0007.\u0013\u001e\u0017q\u0011\"1Yեڵ\u0012\u0007F\rgJ5KpC\u0013moa\u0016[Bf\u0013'\u0014\u0016\u0005<e\u001c\u0019GƑq3\\l\u000f[\nـb,\u0013˸Q+q\u001arMCj(L)\u0016\u0014-\u001bϲѻU\u0011\tE$\u0016P&(\u000bg\n\u001c_p)\b\u0006s\u0014p\u0014~\bGo2\u0005`j\u001aj^`?l\u0001C!e\u0006o\u0017 P;mͣ6~\u0019O_6\u001aYStaB'(Z\tFmb\u000f\u0012-$-m\u0004$sO\u001caCal\u001c6Ď\u001caa#g\u000b\u0010\bCAaNC\u001e~\u001axgei`Z\u001bsL\u0004t\u001c3r\u0001MzV0r\ra\u0000\u0001\u0016\u0015J\u0019*/h8\u001c\u0003&\u000b5?\\\u0012Q\u0014\u0010נ84&8C\u001c\u001e&C\u0003\u001aZ\u0015B[\u0018PzN>ъ9\u0010ަ(Brj\u0014$\u001a\u001bI4rPf4u8#\u0012r\"2Arq\u00149j\u0010Ǳ\u0016j\u00103/z\u0014\t&%xM.j8'<J,Zm\u001e]吜ͣ&(t-R\u000b\u0010\\=ioa8\n]--H\u0001粀e\u0001I\u0016JY@\u0005$Sg\u001ff3\u0005$.\u0002\u0012/\nqVHy\u0019l&|X\n\u001d\n=.j\u0010c+\u0018iK<d!\u001ajS\fL,b6{^68/\u001b\u0010,Ipn5sZBt Eۆ\tUۀiRٴgO\u000e0\u0012C8@Ajn\u0006\u0013G&<E\u001a@(\u0018a\u0018a\u0018\f\b \b (_\u001ccP\u000f/l^ł:]P\u001ev\u0017`%O\u0016?Y>n)\b \tT\u0013zW^X4O\u001a\u0014\u0004 \b\u0002Do\t\u0010(b_@Kmmfl\u000fI|q\u001ael\u001e]!Ĺya.cfM\u0001jf\u001c4\u0017=\u0005\u0002Q|\u001d%PqLM\u0002nu8bzB%\u000eG*&8`iq쓨ϣQjK\u0000[Zej\u0010z^\f\u0017e\u000fgj\u0005vQ,!\u000f_Nd<wDfz~?d~vuUX.\u0013܅w҆\u0011'~ O\b`\u0006\u000e\u001cj,ֿQ[}\u001eX*]~iӳ2\u0002prrI\u0015\u00029jR>J4iXX\n\\O2Bz\f'\u0016\u001ay˕k')\u001e+G6PL\u001c\u0003sCBNSI%a'фOci]\u0001K\u0019!T\u001fEjs&\u0013.lK{\u0012V.,%gȦ\u0006+\u0019̛:Vi\u0017 `WVY\rX\u0010\u0007,@5\u0017~#g\u001bMǻvwZiICp]ϊ/ѐ6mY{z.GRQלDl4:\u001b\u0002v3y\u001eEV\u001eB\u000fX\u001a\u000e\u001d$d\u0006\u0014̬?\u0000vD»v0C\n$ljcPR%>\u0003<\u0015?il<*p9:CZr*)\u001fa=/\u001e\u001b1\fWJ\u0017\nIL/\u0005-c⿦\u001ayYSB\\u\u0001\u0002>\u001aR7B.'\u000eK^r8\u0010/)GaH4LrW̾`4g\u0016YU(g.L%*|Y\u0015XÞrOsdix~U[\"')J\\o`{蝶[\u0003u\u0001\u0002Q]PhF_\u0011&\u0011QA_n\\v\u000f]nz\u001d\u0015#I\u001f${IF\u0019\"\u001bњD@΋5\u000f\u0007 ?8H\u0019IX\u0016s\u0003?\u0019;rj`?\u0010w_d?&q,pz\u0016XӞkdC4\r6YJ\u00166Z{&\u0005TV𞷑\bkoAd\u0015\bԦ9\f?p\u0000/;pL)T]@D]_%x\u000e+\u0007\u001d\"[Z|>tɩ-]0n\u0019\\Vm8\fI\u001a\u0011\u0005\btj)17\u0011hI䪫AGxL9\u001b\n|̷by\u0014?a)\u0018ަH1}@毑\bk_Ųh\u0011&\u0007^\u001eHfE)%CrJƌW&\u000e\u001e\u0019)hW|\u0013\n$ N8g0=F.c\f\u0010,\u0002z\u0017  \u0011G1\u000f\u0014\u0006N3\u0015ք|G\u0015Mi\u0015o!-Q6\u0012M\u0000\nv28J@n\u001d\u0015ߍx;R6q8\u0017&\u0017J!t)]ۀa\u0003fU\u000f!ubt\b=o\r?\nie\f췌[x֎r\f\u001e+f_\u0011#(O\"ur\u001524e$QTLZY\\zT_oh^\"o+\r\u001fW)9%:F\u0015w\u001d<w\u0001\u0002\rf2g\u001d\u0003\u0015ةWX];\b[GL2KDd~\u000f$d\u0015'\u000b𼪜\u0018@E\u001dVd:pRAA<P\u001f&\u0011\u0012-+gT._ Z]XE<%^q.@@\u0004*~O\u0003\u001b-~-DX{\u0017 \u0000oNne\u0012w5ÃNO)p\u0015\u001b$\u0014Nϗ\n\"y\\L\"d(vG0QG^nymD6K.grI4|\u0018\r#[Ȭ\u0014t\u0019\u0003M\u00175\u001f/59\u0015u(\u0000\u001d; .@@=kd\u000f\u001a\u0010x%)\u0001U\u0018d!I?|y~\fN-|\u0014dpZ8\u000e9}q\\\t\"\u0011`w)×\u0006PnANB\u0019}GG6MuQ+\u0018\u0011!*MlI\u0002#K\u001d\u0010i\"U/%J\\EG\u000f!*%\u0003CjؑSWp\u000e\u0013\u001c\\erZ[T\u0000Z]*L5<<\u001frY\u0002ÆF6I\u0018ƥ\u0019GD\u0001y&NE\u000b\u0018Ի>\n4-h/j\u0004=!^\u001eԯ){@\u001eS# \u001a\r\u001e[\u0018<o\u001dՁWԻ\u0000\u0000QF1\u001fq0._/j<Hh%.yx`H$/\u0014j\u001f$PǇwKSD#%s\u0005Eh\u001a-zȵd\u0005!\t\\\u000fWKA{\u001a\u001d\u0011\u0014I1\u001e\u0000\u0001Ѧ\u00189\u00181OQ\n#W??,0\u0006bFmZf<Ŏ!Nmo\u0006C7\r1zG\u000fF\u0017qO\u001cg\u0019\u0011\u0016V\u0017l\u0003\u0018*\u0004E:L8I\u0015\u001f\u001a\u0016\u0002\u0004\u001a\u0006S!ff\u000f\rk1oQ@\u001aC\fj2&Q4?ay^v9K\\.\rgu'M\u001c\u0014G~脆\u0010m\u00158\u0013v\u0001\u0002\u001be=D\u000e\u00121c\nq'\u0006Ǎ\u000e\u00181O1f<HX\t\u0018<ԧK\u0007V#&Mvew\u0017  \bRߚ*I8\u0007d#GC&-\nKȁ\u0004ɑi\br]\u0000&r\u0002ݐ\rM5VI_\u001aVVR/\\-)rGq&~ z֬}\u00161O]M\u0015rF\u001eC\u0000\\#\u001buy\\#/~\fܚ6\u000eJ[::|]$Ah<S\\bn\u0006\u0004}vA5Y:\u0011]FS\fxc\u0011by\\-\u0016\u001dtS<)\u0004푙+rF\u001e9b\u000f\u001b0M6f54Qt\u0002\u001d%\u0006D2\u001a\u0003\u0003y\u0002G.@j\u001e\u0019T2N5;/e\u001d\u0004\u0004z%:­J )\u0016\u000ba>E\u0011= \u0002 |\u0005\u0016\u001aG4j\u001eg\u000bڲ]>r\u0007\b9a3fK&RT^hk=\u0018edĐaC:s\u001dMj`lp\u000e\u0018h.@@W\u0012\u0014e<XeO\fO\f\u0002NhLp3]@N#'iȹ!J#\u0017\u000787]\r\u0005z wTR\n\u0004\u0005韾F*(.\"l\u0004F͸ܘ1%\u000e^\rTP\"r7e%\\\u0016++Y\n\u00115\u001c/wY\u000f#\u0003<\u000b4f2\r\nb?\u001c\u0003\u0004\u0013/\u001f\u0005\u0013\u00160\rv6ՍAb\u0019ob\fq\u0006X/ \u0019\u0010\u001f\u0006e\u001b\u0018F\u0001ӘfRK\"dv\tkdNڶu.@`Lddm(ڻyTZsp~R`<^cJ%pxQ1q\b˅F\f.@11Y\u0002̧x҉CϷQpN\u001b!\u0006dq2\u0001\u000b\u00032k-̿\u000b\u0010Pt Y_D\u0014M@v%ލ\u0012&>3\u0011\u0012=x\rV\u0012\u000eKeVV>[\u0010,0\rG\u001a<BRɞOc\u0003Q\u0011\u0010]!!/$:c\u000f\b\u0013GUjj\u001b:uh\u0019[iH3[T__1\u0010\t@q|bTz8{SK/0\u0002\n7ڄ\u0007߅iFZO*ecW1;T\u0012iZTPX{D^\u0005]sk}D\u00101f\u0016\"+T+<\u0003\u0013r`9e\u0016f\u0006b-MxwГ7vGhq\u0014I\n]QDsX#q~[r J{9K:RGC\u0006LaTiwь\\f\u001f\u0012=XiEu9\u001f:If\u0014q%9\"\u0012jic,`\u001b\u0013K,#\f!|\u000e\u0010^\u0018`H\u000bދ\u0019rR\u0003.qpVn \u000fۍ8\u0013sU<򖃈zR}}\n\u0017\u000b\u0010H#p}<=H`h\u001bˎ*ahDq;+h(&\u0018\u0003/j/xL\u0016oX{)\u00108!\u0013$\u0005\bt\u0004I\n\u0016\u000bd3\u001aȭ@u1`U4 {@\u0010L<M|<4\u001d\u0004Ey\u0014]bLlm>1&iq\n2r0D\\\u00164\u0015\u0002\u0004vUv<\u0002\u001c0H}J\u0013oš\u0012#L[|r区(\u001e\u001cu\u0006-0\u001d\u00037Gc\u0015uuT#\rIaW!~ vy[\bS?ix֮\u0010]x9Q\"Q\u0002\u0016f9+i\u0005\bػ6jn,FĮ\"q\u001czDP\b\u0002\u0012\u0003mg\u0012g1iߛ\nGxW\u0014\u001bVz+7GvA8UI_\boI&TїM{\u001aļґ\u0010\u001cWfڭ[e*?T\u001f\fǌ밢ëdbT%y!@t<d\\<r=~R]+\u001d+\u0010%\u00068\u000b샄計Ӑ\u0004\u0007\u001bTPV~\u0011,9\u0016!C\u0017SL\u001e\u0002\u0012\u000f\b\u000fDf\u001f~Y]rj\r\\hvk-̿\u0016\u0012}-e00\\h'Ûį/Yaz\b`_-K|#]p,na'*r҂wAz^\"V2dG\u001e!b\u000b!Ҟ<\u0012u߾`Zx(9\n#\b&\u000e`\\>W壆#\nxjo\\Q7\f4\u0014\u000f\u001fRF,)\b^rY*H\u0011\u0019\r\u0012\u0017O>nh\u0011\u0014yieMCA!\thakn\fV2wxȵ\u0017t\u001aV,B\u001f(\u001f\u001e\u0015\u0007,-<\u0000<ߒȵ&-*\u001a=#\u0012ɨ{n54\fS2:*Zn\b-\u0017c\t,#D\u0001x#R.\u000f/Ga\tF@5\u001e\u0005Q(S*O4L6ς堜f\u000bgGņ\u0006궑s\u0006K\u001a\u0004\u00045OCPɞ/]!<:y`8f-x|Y\"\u001e8ҽ`3;/\u001cmk_!\r(ᰡ.\u00039hO5ƘS(`+\u001dr\u0019Fr\u0006\u0017R$|č6AfR[p? &K0\u001cVhĘ|\u001d +\u0013\u001c\u001d\u000f(j;\u001e5^:E70ڛ%1\u0010-f\u0005omLreS\u0016\u0019Eu͌^\\>JS\b\u0003TN9oNF.r9G~D\u0010Gx&\u0004ů\u0014`rj(<~X\u001cV8,풡J(_\u0012N+,\"s\u0000j_j!\u00070 M\u0017%\u000f?cc(\u0004\u001dQ8\\\u0010<BaF~d\u000f\u001f*ΎB\u000fmzlۊ\u00160/{\\fi9O6jF)iZFN'\u0019\u0015\u0017J\u0013O\u0012j&\u000f\f1\u001ey\u0001\u001d\u0011(?Ƈrt\u000b\u0006S̴6\u001fJ\b\u001dV3O7C\u0006JaCh.Ziޒ^c li$tc\u001eQp\u0016j*r\ba(\"6\u0000\u001csZt\u0001\u0002qPѺZx[>Jagu#=h\u0006&T3\u001bh0m\u0002(nj[Ul\u000e\u0015\u001e\u001e>\u001bC\u001alOLp}\bg.gr]\u0006s,d.\u0017pU\u0015\u0011?bBmABx\u000f# 5Nb\u0013%\u001fDi\u0017\u001eDGEs(t\u00019E~z})`\u0006S\\)K\u001b_lhk\u0015\u001d\u0013\u000fq\u00196/xtz+8SL\bFPS{QL\u001bUl8\u0006\u0017j(Nm\u001f*ہK\u001c\u0004)\u0012g\u0002\u0007\u0007\u0011uC\u0005}\u0002a4yq+ .So8gd9\u000b$k~%ͳy\u00078\u000fY\u0006\u000e\u0014\u0005\reIgU\u0019R8U^Z\u001bJ7adR\u0002N\u0019\u0012\u000eÐR7r\u001b\u0013_<,jͩ|m\u001c<\u00115)2o73K\r]W\u00127\u001d\u0015Z\u0007\u0017\u0004T#gTlkYD^`O\u0017&\u0011З\tHg\"a6jQuT|6\f\u0018^J\u001bx\u001fJ\u000elQ\u0014Ma6\u001a\u0007!C-\u0016jw\u000fO5Y\u001a&;\u0010{Q$a&>S4AT<\r#\u000e\"bytGMyQq3FH)\u001e2\u0002\u00127\u0017n\u0016ucڐxF!3jw48A+gxEk~zC\b$\u0010\u0002h\u0018\u0005\u0011KeW?ePQ\u001b>k;I}ڶ\u001cI\u000e\u0015PD. Gk@ӶyucCF9\u001b?\u0003<8޵ѵFx\u0003\u001d\u001e\u0006SBm\u0007FĞ\u001c=k=|cpz(Ej7fF\nMP#[!V.\rqj'\u0001Kw)y\u0011$Sy(\u001c(IHI@Q\u000e\u00133vq\u001czC\u0017ݺ ~5.c\u0017x\u0007\u0007\"\b/OkژC奒~Y<Kh!_>q=\u0015pVEOF\u0013d\u001b\u001eC\u001f/\u001a(׀qr\u001c4P\u0003](̓ADBmHv\b($ H\u000b\u0019^?H%\u001b\u001d#ɨ\u0019;UYh.FY\u0013ypX:%p/5Y\u000fw\u0012}%ԗ\u0006\\YO'j)\tW!ZHO\u0004+\u0016-ޘ\u0016j#D\u0013\u001dm\u0011xQ\u000e$\u001a\\\u0015F\u001c\u0016@w\u001e]\rI\u0015G.Z1;a(\u0001.9\n~#3z8E2C1Ӑ,{Ĉ#x\u0014Q\u00168I\tAWH. R\u0010Z\u0000q.@2(q~[&\u000e/!T.We\u0004m'C˜\u0017q\u0019Jyd\u0019r9kͨ2<\u0015\u001d\u001b\u0011oE̷(V\u0015\f\u0010]E!{瞧x\u0015\u001f\u0014%f\u001bw~8pL\tO|eo\u001eD$\u000e\u00067ސ\u00035ݛq\u001c 4\u0000R\u000e\bB0a\u0000;@\u0000\u0016\u0007\u0000k(\u0019ie\u0002\u0004Jqm8\u0004\u0001\u0012\u0007d\u0000\u001e`\u0000\u0001\u001a\n\u0000RlCYN0\u0002\u0004N0Vԝ\u0001\f=q?XiP}\u0018\u0013\u0012i\u000bwJ5PH\u0004\u0013sҞm3jj_\u0005qVHm-Af\t?Ë â˦w\u0017 `PɝS4S \u0014\u0004|\t2\u0007\bu!\nQN$z1Xט\u0018\u001ebpy t[UI\tp!ΞO\u001dEYRU)]@)Ӝ\\S$\r$ic(&N1OQSS\u000eҴ@\u0010L|XowKɠ*}ppJi\u0014\"4r$\"I*|-8LHOq$!C5\u0007`\u0015I}%7,K۪<t+\u0004+J\fUJAGp87\u00189žPY#\u0013qZj>^O(\u0013pL\u001c/6sjUq3.ȃ~ L.R\r4;m]@(\fW:N5\bH\u001d#g{f\u0019Oq<?,'\u000f˻d<Ezm`Pq\r0l(r@,hFSQ\"m@w\u0001\u0002\u0005C8oNKo\u0015$ƶ\u0012^\u0000מ\u0012^GqO\u0004g9\u0018۫l%ay!/=1Z%\"\u000fI\nHĴ6U%H\u0006`\u0011~X>VJ4\u0017\u00145\":\u0018\u0011`I\u0000;\u0001vAf֛j+s<}#!zw'a\u001c޺!.@\u0000Ź\u0006}5˲Tǘ#lP\u001f8\n.@3=j<,\u001d7ZnQ\u001ed\u0015aP\\QN)MR\"5\u00029P#riGDKdR\u000f\u0006\u000bK#\u000exщZ\u0003?Tܪ31ZY8HdĲ\u001e4:\b)C\u0007{WHH\u000eM\" ,]2zxV\"v\u000bM_32_({/#\bߕx\\ׯeRQȯo\u0016\nEkc'\u0018F\u0007\b\u00108\u0003\b))\n|\u00078G\u0007\u00072\u0018\u0014Cy\u0013\u0015a8\u001e\u001dH}3S\u0011\u0014K\u0019#N\u001d\bGE<U)vʐ˙kl\u001es\u000e\u0010^\u000e\u001aȲV~ۛ\u0005,]\nZޱ\u0019L!':l]@\u0017 \u0005\brgzٵxTޒ3_Bm\u0006%.@@\u0001\u001al\u0017\u001c{(\u001e\u001e7 }^A\u0010G푇]\u0000M3S\u0019UE/YǼs\b\u000b\u0006{G\u0014[0\fu#^[\u0002\u0017!@%2IKY5\u0004\bjBFj%5\u000f'㊉s@1\boK&Fj=7nat/>\u0002%\u001ex~\u001dxQd\rCdifc6<\u000b\u0010:G]=A\r,-\u0010\u001f\u0005{hGC\u0000AM\r,(Tn\u000f\u001f\u00029%\"VI\u0000\u0015}\u0010f_\u0012Wɿv\u0004\u0011~C\u00117J@oID\u0017\f]\u0010-5\u0016\u0006\u0000\nR\u00114H WbA=|Y\\^`7bm\t\nAJ\u0012w\u0001\u0002L\u0018+ȋ\u001e\u001a^\bR1YD'/=yS(>O'e\u0002H\f\u0019\bo\u0017M&\u001e\u000e\n+\u0016\u0018CHQZ{*:\\xC\u000eͣ\rȡr9[;E\tݯ)\u0004fmtR\r1Yȋ$\u001cgpa\u0017_֋/ZcCK2|05'mDJM<\tS\"i\u0010Fm\u0003$\u001b\u0019\u0004`{cE6n\u000bPf?Fe|\u000bdֆ]N4`\u0003\u0004\u001d4\u0012v\u0013%Hֻ x11:F=j^\u0014/\u0015\u0019̟B7p\u0017jrx\u0011N\u001b\\DnRDNёD\u0014\u000b\u0005\b4dqj\rڞ\u0019*.ꭝudY\u0010#2a9Z\u001bt\u000b\b\u0013\u0017`#)V瓃mK}\u0011Q]B`5]-G!#)\u0019\"ݗD\b\u0012OyjO!\u001f\nh\u0007Cv+&u$j}oa I\u001fHY+ޒ0\rGH1YdI&\u0004\\\u0003uƅ^]T:`oc\u0006\u0001k\"i:I`(&V8\u001b=p\u000eCڐFv|=\u0011QEB\u0012\u001cg_ͨ󘇥\u0004\u0019\u0010\u000f#sCNz?3pӁ0\u0018sJt\u00011\u0001W\u0011^PkǬ43r\u0013u\u0007bdi\"^\u000e#Gǳa?\u0003<|HL=-6U\u0012']\u001c\u0012+4{dS64<Zr\u0012\u001d\u0010*\u001b\nd&lŔh$\u001c:\u0017ߥZ9UB_\u001fI,ϧ0ML\u001a< DJ\b'ͨ#S%\"0쨏2fuIobg/7*$knK\"^n\u0010\u0006\u000b\u0010 CAr v97{m`Rb+m1]$\u001c\u0001\u0001@?y,-\u0019\n!Z`e\u0018oSK{\r7B\u0013ٿE<K9 \u000fk\u001e5M\r\u001dhYkcvJX|0@)\u000b\u0010p\u000b\\=Ĩloڟ\f\\\rp>*DOiLX)aCDXHYs2ũ\u001dI\u0012ǿ\u0004\u0012\u001d\u001d{>tr\\i=nO\u001c\u001eG\f-\u0005^ŗ1'u(\u001bu\r\u001bd-)Jc̣\u001eZ\u00037.+\u000fK'e!\u0013.\u0006ŗ\u0013\"\u0005+\bQG\u001d#K\u00001wT)k\u001fqcJI\"L\u000b\u0010(Z\u0013ԪaMT_9`!J\u001e\u0018qb:\u0007lPɞ\u000f\r\u001c\u0001\rY{Q}]\u0005\bfy\bJǼ>$qރJ_3\"HUڿijѣ\u001dɣ\u0007\u001a6\u000f&t\u0018(I\\\u0004\u0014,\u0019ayё<bҌx'#y#ݘm\u001e=l)Q\u0001K_F#.ԫ\u0015D]<xAԲj!\u000eXc\bR/xӐ#\u0017\t\u001bimT҇\u000e\u0004G\u001b%>)bYˉ@\u000fU\u0011k&\u0007B]WX cE\r\ta+_'JF7\rȶ5Y\u001a\b=ψ^Qw0@T|Qyu0qg\u0003E<&JX}Q]&E#Sԛ\u0003WQ\u0000eb\u001e~6\u001e;[<\u0006>qx\u0018\b-\u0007g`q\u0006ZO*֊Ϳ\u0002]\u001e4G\rgTU6.i\u0016Mm\u0003EW6\"\u0013glp\u0012y&smKML]\u0000F\u001e{\nyH<b>\u0011#\u0007⨢#\u001eb\u0011\u0005;]_\u0012x>CF`z\u0004U\u000bf5Y(,Ք@1\u00142Ffddf6\u0013\u0012\u0000\u0000\u0018\f\u000e\u0004\u0019:\u0003\u0014\u0003N6(PBb,2(ʂ8$\n0\u00120\b\u0018\b0\u0006\u0000\u0015?$g~\"t#HO\u001fGVF`tc՛B:\u0018\u001fZ\"7c$d\u0019n\u001fxidwkp,\u00183dڵ\u0019bi韡($4Wlp<\u0019\u0011++mP\u0019NVZOpS`AjgIJ\u0014b@>RD\u0018m}?6:\bZԿ<p\u0015,\u00004\u0001\ncĲIK\u0000Q:v\u0007$ Jm\t\u0012\u0012Rץ\u0002к߰N\u0001)\u0013@/,_aK[ǁQ^}+ҟ\"_\u001c&ɢ\be\u0013ֻ\u0007Fb0\u0017<,\u001b\u0005\u001b\\?\rQƿ\u0000\u0016ƀVRI\u0000>\u00131\u0000\u001c\fS\u0013\u0007ox\u00157hD+WG\u000e\u0000;U1\u000e۽\b%J\u0007\u0006|W/\u000b}]l\u0018i{\u0015|\r\u000f,A.\u0019gd\u001eۮ\u0016Pgt4\u0010\u0017\bx\u0018_\u000bt=\u001b&x\u0015s]1@\u0000ckNt&S,\f;ZDvgu\u0012\u0016u\u001dZoΔЉ8Ѡ5A#`Ūmc|'\u0018\u001d;\u0011;#a!XB\r(\u0005;'\u001dL\u0019(ʣ\u0002\u0011\u001bF2l<BIp)\u001cRZgjb\u0017UkB0׾49\nH',5\n4aݏp\nxk\u001e.\u00002,\u0003U8rb\u001e#D:B6l\u0018R\nSLu\u0018NbHq/u\u0004!\u001d_\fŰc|,Q_\u0013\u0019P+^\u0002P\u001eQUp\u00165\u0011qgsCy\u0003ު|\u0017\u0013x/~O_&fL\u001d\\W|X\u0012$\fy02\u000272?~jdX\f\u0017\f\u0002p\u000e=fЭQ\r8w{k*Uy'\u0000\u0013Y*P\b\u0003vRu\u0010%&8\u001c/%J\u00051<ފ\\\u001fHxig=\u0013ubaH\u0003\t\u0013q\u0001$`xy_0J>*cnW/\u0000\u0004L2AzI\u0010X1\u001a\u001at*6^6\u0002J(YxH\u00187;PPd\f\u001c.a,t\u0004\u000f:7x\u0014\nReӥ\u0001aJ-t鹃| \u001c\u001a'Ec\u0012@\u0001\u000bu˶I⢺o'(V\u001cЀ\u0004WΦ\u0017hM:<i&ԎEfj~Mz0\u0010ٳ\u001duPK\u001b2\u0016_tōoHE^\u00153W8#׉\u0003䅒&\u0007i&\u000bCd`\u0006}*PYZ#l'\u0016L̔l9m\u0010;\u0011\u0015_3\u00139eUfҀh*Uk\u0001Bv٫XXܛ\u0016\u000eK؂߁Kr\u001c/D1\u000fFBx\u0000bFGR\ne\u001eugD|q xL\bbV\u001a?0x+\n_v@\\\"\rVj\rӷPO>\u0006\u0007B'Q\u0002=,Uq\b\u001d{ +=fV</\f\u001a\u000f\u00061X\\ju\u0017u#\u001d+[@=\rŤ{<K\u000e|\"{'^6\u001f^ל]:̽.5\u001fFNl\u0014)r\u0011\u0013TsL8#ol\u0002?zg\t;+\"]D?biZ\u0004ùfsCH\u0000Tt\u001awkJQ\u000fb\u0000زG.n\u001d\u0000\u0003\u0015֐J\u0019\u0002n%\u001d\u0007`V=\u0005\n\u0005îikk\u0015L\u001er2o]f('Uhb0/\u0017卟7\u0005\u00130C.\u0010_\u0001.d\u001b,޸\u0016qcXg@ι\u000fڕ')v\\O0t\u0006h@_x\u0012`K9\u00101@בw\u0015x\u000e\u0002\fk5\u0010\u0006j,*}(=>\baYeߌ~\u0016d2\u0001_o4qa9\u000b!\u0012p\u0000\u0001\u0013Y:\u0016w\u0013'LoN\u0005\u0010:\u0003dz8O\u0010_dS.16%J!bw\u0012\u0007hHbǊ3\u0000ݏ\u0001\u000e\u001d[(0n\u0012I\\\u001f3\u0003l\u0001+a%4uGwrD\u0014D?viH-9\f\u000e\u0016Ez|=\u0006g5G\\#;\u001a\u0000Z~w\u001cz\u0016Y^&8\u0011\b|\u000enqC+\u001c&\u0005Č\u0003B\u0015<\u001e]g\u0002D\\\r̞/*&D}\u0010\u0006\u0002w.K(Ј:M;4\u0014h\u001e\u0002k\u000e-(Z\u00148%0\"\nDr\u0016\u0005\u0012U\u0014\u0000Y\u0006\u0018޶@~qZ\u0002^\u000f\rW\u0012\u0002b?(LD\u0014/\nZ\u0010Q,\nz\u001c:\u0017Q(NF&\u0000kQ`S[\u001b+(\u0010\u0011#\n\u0010!PRhʝǅ0d]ZA\u0000)%!\\ٹ\u0001\u00173*\u000e\u0013úJ\u000f\u0004\u000emf\u000e\u0003p\u000b\u001eoΤ\u000fD+\u000b}CFo+:`1pd}>ŅX\u000bm;A\bztg>#Dw8C6P3矻\u0017h\u001f\u0006{?Pc\n\u0001{l%ʃ)mgt$\\\f{TO#'?:,H$w\u001eN\u0010lbG\tfEW2׼\u0001t<|\u001e~M\u000e^\n&\"K\u0006(}s' W&uǕ\u0004{\u0017v\u001e\u0012Rȩ\u000b[={\u0010\u001c0eF:\u0013C}|CwVt洕W19J\\g̮sw\u001e5}'f\u0017\u0005e\u001eIf0w\u001e\u0012K\u000f]u!_>ZJ\u0003Z,\u0004\u0013%.l\u0019x\u001cT\u0012_*d\\3:'\u001ar.x\r\u0014944Mɣ\u0011O!}rա)Q򹓣\u0001\u001bF{Wf&=\u000b\u0002\u00115g.\u001d\u0015\t҉!|-\\&\u0010A1c\u0003H\rK\\у\u001d\u00042#Ǔ\u00077\u0002K\u000fN.\\Jǃ\n\u0019jVX\bM:#M\u000e0=D)VJ\u000fcǽv\u0005dHY>8y:\f\u0015u\u0013ai&\r7\u0005\nq35\u0014糊\u001cQK*\u0010\u001bR/c'[/sܹȡD)4fs\n\u0018\u0003CsCqByr%?,\u0017p\b*rÐWT(y\u00046[\n\u0006LLywe\u0005\"%oRvZS]q%1N9w\r<N/'8+Ÿdz\u0018ih2Uz\u0013{>GG\n\\L\u0015t;.q\u001bNͿ=\u001d$\u0006E߫j1t\u001aEz\u000f\u001a9.r\u0018˝Z\u001b\u0019fTrEuC\f\tb2ሂ\u0015{\ferƷ\u0003r@_I׸b\u0007g\u0003\u0018=~D\u001aTBg'\u001aK:\u001e\fTᡏ)\u000e'\u001f\u0005y\u0000q6{_2AOS\u001a\u00051Gװ\u001feCd\u001b\u001a:E~4l\u001e#\u000eTa#\u0018$\u000bP%\bĲQ#y-l\u001fƏUNu\"~Q6\u0007RWLe@=}\u001a _Sn6\u001b=\u0000vCxV\u0002\u0006|\u0017ؗ.>(Bo\u0019\u001d\u0011\u00105!؟Yp\u0006$QV\u000fx\u0007\u0016\u0002\u0017d\u0018a'\u0016=\u0019Z\tIJ7{k\u0004;*3\u0015,;\u000e8kk\u0014\u0018ZUHPo*\u00193dKB%\b.y\u001d7>3\u000eOݵ5Q\u0011y\"D t\u0013Z\u001c\r\nendstream\rendobj\r19 0 obj\r<</Length 34294>>stream\r\nTU\u001c'<\u0001\u0000pur\u0000\u0003\u0001OC'MyqzZv|x\u0017qH©YZr)\fh\u000b&\u0014\t6kGc&\u0004\u0004r\u001e9\u0013zxWڠ\u0014GˠZ}/\u0004}R\u001fKWsk:\u00052A Q?\f\u0006İp?E٠@\u001a\u0014\fLϵt\u0007Ѕ}$\u0006/ͣx>\u0012dj\\B!\u001f[40&{c'\bd\u000e^]G\u001f\ndSJ?\u0004*m\u001c&a\u001b\u0019><]@\u001c\u0002\u0019+cɨ޲}]\t\rVi\u0010\u0005g\td\u0011$Ul\\\u000fQw6@\u001f4P۶\u0016)0Pus;/K6Ӧ^]\u001cqj\twv\"I3*¢ӆ9\n׭j_ӖSu\u0006\"^\u000f$@/deT3fڥi^/]П\u0012lDsڜi\u001eR6Ҥ\u0002$G4\nV؞7t:mDD%J~S%`gd5=\u0017T\u00104x\u0015\u0017 HmWI_\u001c1\r^hm TS\u0018\nb0b*O\u000b*x\u0015pbi\u0004\u0018\u0006S\u000f팔\u0001Jq:\njQ簓DS'\u0005s@l\u0018\u0015rO@'-j{Oa\u000f\n\r\bGӢ4XLu\u000b^_\u0007!\u001e\u0005jW-k9w>|\u001b\u001aCrC\u0000\t0\u0007ﵔ0ѩ9ί-sE\u0001hc29v!_\u0003\u001a\u0003^\u001ayAFc>5\b=\u001c'Y^ݫ&Q8d\u0015}|i&bUEbb1m+(*\u0015\"v&g$\u0007A0\fnDV` \u0011.(2-d\u0001RB\u0000 \u001f\"]0$\u001e?xa胆~Z@SJf\u0000p\t^p\b*%sah鏴\u0017-?'\u0010'\u0005/+4\u0017\u0013\u0014\u00009?N8\"l\u0017?.=+Í]\u001a\n\u0014P3B\u0016\u000eGm\u0017܍\u0016*C}Z (mw.}y\u0017\f\n\u0012c\u001c\nJ+$\u0001&1\u0004p7D\rI\u0015J9v\u0006oS7E wm\u00001D\u001bQ)Ϧap\u001e&Ӆ\u0013H\\N_dBZ\u0014ō\u001e\u0019\u0010_6@{ԜR\u001d\u0016P\u001d\\\u001c=NpAsgZN\u0014[tBEOB7\u00077\u0005H\u001eV\u0000nXY>\nBK&q\u0000\u0015\u001d\u0004i]_7h\u001cWw8~EO$\u00182`4\t\u001dCW$h,#\u001f;A \bi!J\u000bjBjQ\u0000M=êS[u2GpѕD,S<HIU?P^\u0013>\u001f||<)%l\u0004'R6\u0007E#F|\u0005x\u001eW}^%\u001a\u0004v(\bU}&\u0005}<a `q\u0016\u000b*x<\nPIL\u0004!^\u000f\\\u001d@\u0012\u001a\u0003CR#\\\u0001Mu\u0003ay`\u0013dcrhi+b!%%W\f\u0006B\u0016T\\^\u001a\u0010$k\u000e\u000eo\u0016ʞ<6\rƘ._\u0012\u00165\"\u0011nS[F\u001eDtQ,\u001fEiќ%ڿz^J~K\u001a\u0000Dwp+ѿk\u0001T&\\P6b\u000bp+X\u001aSvre0b^<`Y\u0001J\u0011,>zBZY'\\Kͪp;\u0005_dt\u0002.F#H80>k^뽛\u0001ӯv\u0013\"FH\f\u0017(\u0013kHYM\u001dɁV(<.tun$nz\u0012\u0005\rcE%u\u0007w}MvJ쟟\u0013\u0006Ɩ%ivx׬\t_)0R\u0004\u001d\u0003`~\r:_g%)\u0010\u0000qqѽį\n)4\u0005\u0010=B\"\u0017/\u0017\u0010,غ@@\r\u0011^\u0013KBM\u0012\u000fЦwBZ#]V<]W\u0010w\u0013ŏH&\n\r3\f\u0018N\u0004̥u\u0018\u0015uP\u0006f\u0000D\u0019/\u0003; Fx\u0016\u0007Djñ\"\u0019hzO$_BF9\u0007{]r\\#\u0001\u000f3<\u00115\\\u0010\u00118Ow\u0010\u001d.\"n\u000erRu\u000be\u0017@ \u0003мug\u00023\u0014N0\u0004ʯ\u000bU=/Xy\u0015kF@mh#\u0017j\u001aC\n-~p5\u0006XY3\u0010) Q\u0001̪\u0010>lkpU\u000bQ\u0006?W\"Z1OSPgX~x\u0003;n%7q2f\u0011E*\u001e]Wg\"\\&\u0003\u001c$\u00191\u000f%\u001dkr>l-,Ȑ%\n0(|\u0000<9;@60=\npVBɰBn5*2\u0001\u000b<\u0001a\u0018U\u0016\u0001+!\b+\u0001BB\fuOs%Yz\u000f\u001e:q\u001d\u0010H{\u0003\u0004<3M\u001a\u0001-\\XQq\u001e\u0012>Q8qNF4Sx`6j\u00037\u001e\u001fW!\r\t\u0016֮1\u0002].rfa>\u0007h)0O\u0017B\u0000f\u0013mәfL^'4#˯IZr&7\u0014\u0011P\u0013p\u0013RN/e\u001e\u0013|\u000eca\u0004¬+X(%ydVu\u000ex\u0004$qԆHO7\u0014INX`~։3!o,pe%cf0TG\u0004 d\u0003k6ef_.\u0006Sy\u0012\u0006r\u0014Ú/l\u0019<\n\u001f_\u0003/5\u0010vڂ8$Ž}9\u0017\u0015(p\"%P\u0018&\u001eB\r\u0001S4a\n7 -\u000fx\u0013+}\u0003SrB\u00015mC.ybyT\u0015z;mAjJ`xh})QQhYÓe~b3P)ݒᡁkR\u0006A|\u0019\u0003\r\u0003vneTckgH\u0018bRy\f0\u0005\"5|\u0004^8]DA8r])C\u0006\u0005\u000bmSAڽkA燋Yǈ\u0017Y\u001bIހO\u0017\u0007^1OK˂t\u0012={.w\u0018\u000eTp3>`}\u0010pQ\u0002\u001c#?ǿ30<\u001b)^oñ\u001c%\u0011m(ilY\u0014S\u0018Y\u0004M@{\u0001-\u0004l^sNE?z؂(qD{k(Z\u0013\u0000D/#\u0013\u0019'Y!*\u000fQ\u0018?yK750Ϟ}En+\u001c\u0000W*&!\u0010R^ԻYDŨ\u0005o\f[\u000f_\u000fa{;?q!\u0013\u0017W\u001e4yb\u0001c-<CE\bi*7̋\u000bb\u000b(m\b\"\fO\u0001\u0001ƶ\u0019+#sk\u0003\u0012a\u0002Iήp'W\u0010Id4OS\u0015\u0013\u0018\u001f\u0004.\u0004UliIAS]\u0017\u0002WHp.F}ۈkg\f\fjJT UH^9]\u0007\u0013\n\u0004)IV*~Z\u0006\u001ct\bܓ\u0003\u0016K%\u0007]^\u001a[\u0016Ԝ\u0000!A\u001cr\u0016ڒzs'\u000bȵ?\u0003:[\u0001\u0004F\u000ed\u0001E\u000b:(q.6B\u0002e\u00154\nx\u0005`u+ïDH\u0002h\u0002H'j ![R޹t\b>\t\u0000eOe\u0005T|%h(HbQ\u0016\u001f@i܉H''\u0011P>(RNXc|\u0000wZ.cX\u0007yz()M}(<\u0019\u0001\u0007S7ܙ@(L,E43&f,\f\u001bݵU5\u001aEȍKQ]\u001aYit,a\u001d\u0010H\u001a-gDw\r,\u0003\u0011J\u0016szF%\u0000U&|q\u00053j\")\u0011rB\u0010$ \u0013\tCW\u0001\u0007V{UPdr]\u00005]RmQ4~F\u0019ZrI/d\u0018:Y~%USkA\u0002\u0006`:7\u0016m0Q^ڝCZ\f4ʰ\u001cr\u001brg\bh)lm\u0018R\u0014\u00014aqe\bܘ9#\u0002@|'R;\u000b\u0015}g/\"̀\u0006^^Yw#a\b=cl3@\u001c\u0012Vvt6Ly\u0006\u0015\u0007]EMub\u001dkzF\u00150%`:\fwZ'I_S\u00032|\rOѳ\u0015Ӱv?\u0014T%\to՚CA\u001f{_mi 9b\u001d($\u0003\u0019^ouu\u0001(!\u0004\u0002FL4ǂ\u0005[[\rd_~mxA`<wN\u0016Ҭ\u0017v;\u0002\u0000\u0013[\u0005!a\u0002pD\u0002\b\u0016$C.\u0000F\u0014\u0014\u0015}M}Fz\r`Y$\re%xe|Q/r\b\u000er^3Ty׏/]2@*LM7\fkjME\u0013Ig\u0004m3DXy-\u001d} *?Ϥ\nFL\u00072>l7B\u001b967O`\u0006\u0014mP\u0014\u0002cB@añDZ\u000f7ZJT\t\u0004\u0015\u0018\u0011z$M\u000b\u0004\u001f(&\u00186s\u0015&R\u0011T0oZ!&?Vȶ~5&9^\"\t\u00037<rG\u001eIh\u001bx\u001bi4B\u0014\u0005>ewpS^\u0000.J鍝\u001cU^h V1\u0018>+P`\u0002\u0000\u0007JW\u0010QBt grdyuj\u0000m\u001d\u0002\u001a<*utT#\u0005x⹰Qӡwb(4*[Ɔ \u0005,W|\u001fC\u0018\b\u001fI[\u0012(#0\u001dm\u0019\"$O܇\u001chy\u001fImI\u0002P:ZS\u001dingP\u001e\u001dEbu1\u000ecM3Pa \u0019e俊JP\u00027.U\u0013x\u0006nU+lPFI0Xj\u0011\u0007Ņ\u0007Q\\\u0014ĐPg>w6I! \u0002dfmV%\u001c7o+G \u0005x!_ә=\t3AP\u0000\u0019L޳\u001aAo$ioa\u001d\u0017\u0005\u0014Ls\u001camǙ&\u0015b%\u0000րQ*\u0010ܳ6\u0003\nٸN\u0006\u0011Ps=m\tqn,&+U0\u0012Ҳ\u0002ː\\|\u001d\u00035\u000f\\zt2,f`%`\rMX<\u001f6YAmj/Dy6[j\u001b\u0010n\u0000~{!\u0003\u0007k\u0001}'Smxw6[Ƭiu&ۼ\u0007tR#\u001f3|2 T_\u0000\u001f,8i!&΂%t\u0000Ґ6Q̨ͨ\u0017nPST)MrBb\u0003@\u00020\u0001$U 6PYؚ\u0007\u0017~Us\u0002/W\u001b\u0014\u001b:뜬Sm\fkMDƼ\u0003٦7\u00064\u0018'SË\fQAٸO\u000eK\u001aXl\u0017I)\u0013c\u0014/q{\u0005pPA‫ya!Оt/ǋ#6Ƥ]h\u0017G\u0006JyFI\u0007\u0014\u0000h\u001b#=Sc{<;)+\u000bI\f$µ@*.\u0005{5ZzE\bx\u0010[\u0002o#LPw_\u0006P\u0010\u0005CwDա/ߓbIWd->/Uچ\u0011\f\n\u0002\u0010tS +-GH\u0013&/*5(Lޥ\u0018'{2)}\u001bp\u0010]\u001e~\rc\u0019h\bgu\u0005mhZL\u0014\u00121+\u0007JT\u0005+qưڼ\u001atFd\u000f4\u0005\u0007\u0002뾢U\u0003\u001b*\u001f\u000734vee+'.\u0000W\u0011nlh*nYձUG>\u0011$\u001bEn\u0003S|ӱ!\tGPr\\:G\u001eE+\u0006^3\u001dm\u001a<\u0016!3\u00106lXqҍ\u001bYAU\u0015Q\\WMu%4' )/\\5?\u0014)p5K\u0001l\u0003j<s+\fJV\u0000)<_yb-\u0011\u0013\"\u0005\u0011_r$\u001f\u0016D~.\\g\u000eᔞ:\u001fq\u001a\u0004q\u001cl\u0006=\u00188)!*@j\u0002\u0001Ir\u0010x\u0016 |\u00076\u00005y/?\u000b\u001b2 $C\"\t9V\u000e4mq`)\u0012$/R{\u0018@!\u001c\f\u0013H\u0000.ǇZA\bx,\u0018\u0002 yX\u0011\u000e\u0016,\u0011\u0000WUÎ\u0017\u0011\u0015qf\u000b\f E;N\u001c0\u001er\"a2Ꙩj\b)\u001eM䜞mmy}C\bcvWPH\u001f1\u000b>-)\u0015a\u0014\u000e\nC=F\t\bG:r*\u0006\u001a\u0004\u000f3)P\u0018\u0013\u0011)[\u001bYӸ4$V֓\u0000Z%-usE\u001b\r0\t\b 972?F@{>D~tKd܄ep{(bǶb+ʠW'\bm)_\u0019\u0012T\n 1ḃEN8M\fz\u0011DOe70}U\u0006F_d\u0005O\u0018~\u0013k\u0012\u0017V΂\u001b\rE?m\u0018VI&\u001fɃIajC9ͳ<SB\u0011\tY\u001e54B^`t\u0014Q\u0016yt\bT\rW=k$jDkӭPtjHyw\u001f2\"MN_O碨\u0001*k߅s99!/<57(q\u000e\u001e\u001dE\rk\u001d\u001cslInΥ\u0013i\u0015/M<.r½ 4\u000e|\u0019Ij\u000e\t\u0012\u001cfZp\u001e\u0013\u0014u)Mr`򳜄1<Ė\u0018hfQDR|ü\"%ڙOgFY5)D\th\u0004\u001b+!\u000bg\fHXi9D;F[\u0000UV6+\u0003᜾kܹ\u001c7\u001a:g%&78~&\r\u0005\u0007<_ݜ>\tF[^\u001dc>\u0019\u0005\u0007x?\"E\u0004A+E'9]x\u001aM[u\u0013\u0004㤉\u001f?\u0007\u0006x\u0005\u0016r\r\u0002F+va=\u0001I\u0014%ysm'(7_Zr\u0013\u0007Qx2љ\u001c\u00171\u0019wGqry\u0014B7nޔݽΛ\f(1AUoH\u001c2\u000eoȘ7Η?F\r\u0005\u0000)}Mi\u0010\u001brH(CP\u0006$,GtO&6+2/O;\u001bZoP\u00034xR>`I1\u0011Jv--/B2R\fW\u001e7PFa9\u000fK\u0019G:\u0002юv}\rŧ8\u0013θcHܒ\u00030r:qz\"\b\u0019Wy2\u001b\u0013.4#CAsE0ej2I|#pls,I\u0015Ĝ鸞X\u0004\u0017Ȩo\u0013 }\u0002k\u0011j4q\u0017BY\u0000>E\u00195\u00118§)M\u0005VuGg9ڻЅ,\tT@Bɫn@\fu;\u0005Q\u0003\\9\u0004\u0011ԮaL\u0012\fDos|_\r\u000bH7Lۺ\u000e\u0000YM\u001dP/JP\u0014\u0002$Pmk\u00031xJE=YS\u0018+=^|\u001e~r\u001dEo|\u0018gTH+sG$\u0016ab=n4ކ\u0004ZE\u001c[d*\f\u0000\bf`\u001e>%b\u0002;l|-wr;CB\u000f~\u0000\bpQ\u0017A\u0004\u0015Z\u0012K\fTbu9\u0019AM\u0007\u0006\t\u000b\u0015Utm^\u0010(̄;US4ۊFv\u0004}j4@\u000f{.kic%E\u0006\\kUA\u000eڹ]!Jj6>'[\u000b\u0006\n=\bP9\u0010Ҷ˯\t?Ы5%vw4X\u0019 [LY\u0014)!\r'\u0002iUIB\u0004]\u0016 r\tA\u001a\b\\ە␞9=a\f\u00167#%\u0015A\u0014r\u0012\u0007$x\u0016\u0018\u00035VY{>4_[ej..3q͢*C/\u0006a,۹W]\rl\tD]n\u001c\u0010Mo6Nm]0Slyꈉ[pz\t'@i%t!\nS\u0001\u0001F|ZC\u000eFI(\f`\u001cO\u0005\u0001\u0016֤Ao\u0002{;/?W=}{l9X4(Auzv>HH\u001a%Y\u00067Б^r-R\u000e\bT\u0003Y\u001c/\u0002p/8]<p\u0010+xe\f߳Zȿ\ry\u0016y\u0015\u001a~B4chX\u0004NOXie\u001bCPQwh+Ϳ֘G\u000f3\n0ΌnR.wg\n> ,μZl+OK\u0007eiU\u0014S5+1s겘=\u0011\u0014PN\u0002P\u000e \u000bVZD\u001a6aQT^\u0017cW؉ixۍ3$\u00169^\u00101\u0004Y\n,l3`\u0000\u0011+h\u000b\u0002f8e\u001ab\rP˴TU\u0000gv~\f?+2u)ck\u00004\u0003$@\u001e+*Cmqn3\bu3/\u0003.7W-\u0010{IM\u0015q\u0011ǧ˖zXi/X@'\u001b\u000e\u0013z?h\u0003l7 \n\u0002m\u000b[\u0001\bmK\u0002?\u0004Ӧ6s\f\rUl+\rWu)\u000f\u0005;\u0013\u0003\"w\u001c\u000bbH\t{ZIǫO^spC-Ki\u0013JX\u00071X̶>\u00060\u000bc?@\u0015\rsM\u0010OxQL !C/FBr8QKGsNJ'LcZA뼿E>\rɔ5JM\u0016ͦZT\u0014X@槏s%\u001e@߯@l#\u0014\u0010$}\u0003q\u0014SwD\u0013\u0017\u0014i[\u00045Oi\r2C+nЪ8uv\u0013\u0015B\u0017O}\r\\\u001brW+.毨ez\u00063\u001c\"\u001dePࣕ\u0000\u001dxOZ-\n\u0002b%\u001d`'\u0000,o\t;y\by+O$uu\u0010V3\u001dd\u0016$q!l,\t\u0016C> m\u0014)\"-\u001dZByܲ[;\u0018\u0010ܶׄ\u001f m\t\u000f/sA\u001a.3Tp\r+zW\u0007Ǝ<Ez~f߂Ð\"ɯN3$UW\u0006_I@\\9\f5`\u0011\u001f~\u0002\nTK0\u0018`b\u0012E\u0000h3O$N\"\nDA}\\Ѿ\fXtg\u000eT\u001do\u001c\u0015sNZNDZY̢D\u0015ssyn~ڟkW\u001c4326\u000b\ro9\"(ljr\u0002`~\f@~\u001a\n2Y\\b\u000b*ؑE|Ii\u001dhL2T9\u0005jA#aMz8%PK*)'>w>\"$/PhxLeIA'5t\u0001z0?C\u001cPn:\u0014BE͇0s]\u001f5X\\\fO ՘):jUd\u0006-\u000bv&|NY}OΏF\u0014&-R\u001e\u001d^\u000eem9\u001e(\u001e\u0001e1\u0012\u0003\u001f\u0018\"Nnx?|r,Ŀ,)?\u000eHh\u00197\f~-32\u001fs`\u001a>\u0007H[ƤӺ\\6~DsGQ\u0019[\f$!ڲ>g.`&(G\u0015UOT߬͐[Bkp\\;Қ\u0004ȕz\u0014m\u001ee\u0019UrG\u001aӒ2(\"\u0004uo$\u001cIы\tk#\u00157P:)ɱ\u0004\tiz0?\u0012/Hu%\tv9נ@h@)\u0017J\u0011,LjƤ`uG4)ըc8|_0+4nE\u0016䘔w[-dۂY\u0018Pb]l~\u0002-\u0015x@Qצ~LPAhR\u0017BÐjID\f3Ť*UBL׊\u0002̂aM\u0005D\u0015/-vz⬊\u001f\u0012m\nݶ\u001b\u001aÂ#%u\fe\u0003%\u000bD1\u0003lP\u0014E\u000e)͞K7S\bֱvŰjc[&`\u0012\u0000\u0004A<P33s\u000f~\u000b!\bNXJkLV#\u001de<@M*pХ_~g\u001f\u0000Hd~\u0006sAS\u0012Gc\u0018/rGX0\fZcߠ\u0001\u0003#\tY\u0019u^gfg&ն\u0005QB\u0015*|H\\߂\".\u0015\u001c{6S}ѷ$7ȵ.B\u000e'0ض]A\u0012$z\\M3)J=^+j\u000b\bӡ\u00037\u000b\\J6D,4XYXQY\"\"4j\u0018\u001eT^4ȋbJ\u0006XH\u0003Ƭt˷S{5/\u0018s]3,>\u001bM\u0014.S\"\u001c\u001cz\u0014ik-Jc\u0005\u0004lR\"_d\r\u00004<ڮ8@2B\n\u0000i\u0002Q\u000eU\u00141Kҕ~\u001bQ\f{\u0010\u0005\\\u0014\u0012R\u000f=C6A\u00001z-\u001da⒑k#,\u0001\r<\u0018`x\u0006́\u000fpb\b\u0012A\u0007m\u001d\\~C\u001dvg\u0012\\+N\"qFp$UM\u0003`kŃyK\u001c\u0007%@L\u0002BN=ÂByS'f\u0013BH\u0012mRYrAEE\u001ft\r\u0007z}dF;\u0007G\u0004ʨu\u0006_D\u0003ǥbCKh(\u0010\nQ{t2s(I\u0007ƥۣ҈W8\u0012Y;\u0018Kj\u0007\u001bYMJXY7 !kOW\u0002=nX\u0011;Qa`ʧ\u00166\u0012{48L[jFMDFC\f!\u0002P\u001e\u001f\b\u0013L\u0018:źf\u0010\u001f0Ö !\u001a\u0005?GTTGSC\tqÇ\r\\BX>=AJ\u0018\u0011\b\u000bm\u001ch8v csT\u0010T\u000f\fOD\bT%\u0000ʏdP@B\u001c\u001edġ\u0001:D\u001dC1B&]\u0007OK4R\u001cbe\u0017-6\u0013b\u0004\"vAsMװyG\u001cR\ndL\"!6UP؂\u001bSN<c'\u0016\nOqa0P6@^S\\Ki<%)P\"*V\u00016%@x[k\r}_Cz݁5fRwk[zB%\u0011CqO0\\\u0007]t\u0004K)mgVqժ/\u000f\\t{+hho\u0003X?mkH\u0012W\u0004uyN\f\u001bY\u0005k%3hjcZ#mK\u0018Bvxj7g\u0002[\u0004d3\u001f\u0019r˼2r\u000e3wc\u0000'%w\u0004\nէ\u001e\u001e\u0003e\u0010_ϾѾ0\u001aܨ\tmˡp\tY'\u0018\u00027D,'\u001fG\u001b{ӒV*\f\bR؁m=5͸CM\u00079\u0014\u0005<;h7\u0016\u001e\u0018-#:!S\u001aA@^t_\u0003\u0019\u0013ȻՐ\u0003<\fSL\u0014\u0002gavakT\u000fW\u0019*tCG\u0000]=Č5\bƒWp\u0010Vq\u0006ʂ谀0㴠CpE\fTBU\\Z9#jpR1aL\u0005\u0019|9Ȟ#Ngp7*ZoB\u0013,[\u0010EE4p7\u000b\u0007<5\u001f\u0000`g3x}(9`G$|\u0012\u0003U\fM\r~_ƚ񂓒9l\u0000ƶ#А:CY28ws\\dESR\u000e!Ǯ\u001aY\u0010j@?l\u001ay6S)\u001dF\b\u0019R\u001a;T\u0006\u0005\b5\rڟ'YY\u0013Q]I@2\\[Q\b\n_˖LNu>Hل4%''\u0001gk\u0016\u0014\u0005\u0004\u001f͒:\u001eX>]E\"dP\u000f_{45\u001b\u00164Al:l \u001c\u001f6Q/8\u001ap6Q6QJNF\u0006&<\u0019y\u0011Q@<`ۑg'ySU\u0019\u000egp\u001cbPT-C\u0002\u0002\u0018l҈Hiv\u001e?t?fj=sV0CkU̓\u0007\u001b|-r\u0010¾Е7Z<\u0010\u0011$y\u0006?E\u001aL`:&:R-7\u001b,\u0000Q\u0016'_H=^7 \rƉI\u001a\n\u0000\rDw_\r\u001bnx\u0000/\n\u0006qo\u0003\u0006\":\u0010\u0016y~m6 {\u0004iȑ2WdkB^#͈D\u0005i#\u0012U8 f^v\bDmƏ/Fu 9=r\u0019\u0016yD2==Ef\fgZ(\u0017Gs{j̔TI:}(Wz_{!9ҍ7w9y]\u0019b<~*KҸWZF\u00026Lm\u0013\u0015-US\\߈ĝI0%$q#*l!ǣGY\u0000F!\f\u0004r]g\u0001c\u0001'.;6\u001dPe\u0017!\u0018%``+|\u0019.\f\f\u000eNO{* i|O\u0001E\u000f2^\u0012H\u0001F~\u0019}X\u00141&\u0003m\tJ\u001e\u0015PwC\"\taG\u001d0\u001f똘w\u0016^od\"\u001d3\u0018;*t'a0%JC\nՄ\u0000\u0006\n.qF)Tpp'4p\u0001'GOhO-\u0014\\Ǹd o:T.#1+Dr\u001f[^)JԷcfY\b\u0001.͕J\u0001,x؜_:\u000b࿬u!26Juv}!\n:\u000bÃ:\u0016\"\b\u0002+e,\u001d\u0015p$>hp\r\u0012\u0004;\u0014afSpF\u0004:h\u001a9D\"<g\bO\u0001.mQd%ko,\u0002n0T]Eh4\u0007<4'j\u001fP;{\u0002rQoi\u0018<\u0010k\u0000Cb\u0015\bBV\u001bz>9q\u0017\u0007dN.\u001aR\u0004.X\u0007\u000f\u0010?I[<𼔳C1B㳔i\u0015ט<\u0006.4{!6\u001b<!+M\u0000\t@ԋ93\u001a9v1y\\\u000b\u00055\u0001Q\u0002)P;͓(f\u0012m\\\u0014)j\nZ Y`ƌ\u0005թ|\bYnluq\u001f\u001b0T[t\b\u0002z\\-75W\u0000bwU8p\u001a\u0006l\u0012G\\K\u0014f\"\u00044\u00103\u0012\n:z\u0003/.\"\u0018_q\brKc{+mG'\u001c\u001e.򣰖GKkgΝ|\u000b^zUs[\\\u001aYe\n?1yCf\u0002AZ\u0012=k&\u00170r9\r\u0019}JEO\u001c\u0007d};E?'oڻutu{~+VMn]2{\u0017!r\u0012P\u001d5א@\u00047\fJUg\u001al!5ku\tR\bů\nDeL~KZ%m}\"?q\u000bg\f6?}\u0012-ϲĔS~c52\u001cRI])LO(Q\u001doZEeQ1Rk.m?4l\u001f'$pE_͘\u001cԈۋ\u000b'HߞXKK\u0015\u0012L\u001b{%gT6,}}\u0012B\u0014\u0014\u0007p_H_\t||7a#I\bfϷ\u000b^@E{\u000f=\u0013a\n\u0012cg9K\n7\u000f5RF\u001bEM\u0015ȣv'GPv\r U\u001a'[\bu`L\\g\u0010!+Qn\u0010e?Q$#3YdfJȚ8r<\u0003݇!s`|oibnde|,C\t`E:Y+1v*OP+\u0017@%\u0006^\\\u0005\u0002^ak\u0006\t\u0018qSS6mTgO6>\u0001Q\u001d\u001cU|\r\"-{ӫ\u000fnbaޗ&\u0000 7\u0006W\u0001C4GrϠ)_\u00100\u001f\u0015`TMU3V\u00127Mѫ\u001fE#ţ5_v\u001d8\u001fSj9W8\u0002<Fj\u0012\u000eNQ@nbm;n0\u0018\"J\u0001\u0019\u0011?\u001d$\"̍}-VjeMo9m\u001aIҜ]\u0001E&\u001f6ʛpѣɄ%)\u000eLG\u0014\u0012`Bd!\u001cj\u0014\u001d}1,!w4XB\u0012H{\u001au|LR\u0005B5f\t,meMT;\u0006NU\u0013W\u001agtPV&̯b\u0014w^[@vqH\u0017c,\u000f\u0013ٌ\r'\nж5#4\u001c\u001cѰά\u001c\u001cq\u0007\u0000 甆&\u000fbaQ<\u001c\u001cdX:\u0004\u0006\u0011k\u0001B.yf\u000b\u0002y8j\\|j#7 .Ѩ\u0013\u0006\bmم{7rL̹`\u0014\u001fD,v0v9\r\u0016ы1tjBR\u001fp1,\u001a\u0010ʋvs0}T\u0017<z*\t'\u00177>:0b\u001cWF\u001fڣf#]DM1ho7 X2v罾\u0015u'\u0012K`#l|6'\u001d\u0014\u0007n,_z\bE,\bBBv+Y{띉29[2\"NO!ԉ<]z&Hi?F\r\t.\u001c~ȭ\u0013F~Ώ;+\u001ab\u0017\u0011\"]f :;V`#Z1'\u0015-OO\u0018\u0019\u0012o\u0006h+w\rZZɁ&\u000eKcj\r\u0000sA+F\u0001?\u0019NmUN3w\u0012y}K\u001a\u0011\nN767=]G=C\u0014\u0019ӁݒyK(2X\u0004h7\u001e\u0012c\u001f\u0011\u0018F2w!Kl:_ZaCK.\u001a\u0012A\r\\,8+\u000f\u0012IA*1\u001fNa҃ÚX OA4N$\u0007FmQ\u0014\u001b\u0006r'\u001a\u0006o\u0015\u000eS5g.%O\r*\u0015L\u00161<B\u0006\u0011ګVPčCh?1\t5!ӭÊu\u001e\f>o\u0005m\u001d\u0015!T\u0015\u001e\u0004r\u0004\u001br0|8ĶQ.%a+\u0013\u0017-KO0\u0013P\u0017Zu\u000f{8Cd\u0011]\u001e3z\u001e\u0012Xu\u000bͯK2II$W\u0017:]!/V\r&9o\u0003\u0006vWtDL`c# )+;\u0005\u001eW46q\faU\u0002\rtD\f-5WdCX\f\u0015\u001a\u0017 _\u000fJV%I\u0012y\u0006xC9}aџAMᵠp^(Nn3Ͱ\u001eӯvrKe-ڔ0%@0\u0010֦ª\u00194'չ\u0007|\u001f.\u0019\fg&\u0013[lJ(\b\u0002mM\u001fy+e]d$PfrXCT8\u001a(_p(I~0\u001d/pƇ;Pj\u0007g\u0004Aa\u0011x\u0001\u0019{\u0011Z\u0016!@\u000f!\tm\u001dQ\\am\u0010gB}^8h8\u001b+gvCM*6!7C\u0013£˞k\u000f޶bS̓kH8GPQ6Xb[J?\u0013\u001c0c#h[Q\u001fO\u000eBmi+\u0017\u001b\u0014\nΨq掜\u000eN \u001b\u001b֑\u0005\u0007j([0\u0017\u001dUuK)\u0006OA,Dۥ\u0013Y:V?F^3\u00070!f$)6BA2r\u0018\u000eR*y[̓;RId3y\u0003}mz\u000b9?-q(m[л\u0016%dW ta\"-G\u00170\u0014u)\t{OjȞ\f\u0010A\u0002:PYfnե\u0001Q\u0017<\\\u000fEK̮\"D\r\u0019*;Y7\r_\u0006\b\u0004\u0019T!\u000e\\\u001aE{M\u0006ˊy\flz\u001aL\u0010\u0019\toO,p\u001aVV_p\u001a&,'\u0001\u0019\u000e٤=>{L1H6Ǝk[\u0000\n'\u001f\u001f\"5+\u001cys4f\u0004z/:\b1,p\u0016!\rL\u0017Mo\bPv#8+Q]m%.\n\u0012\u00039\u0002\u0013#I\u000e[BLuu\u0002JD#i(`\rh\u0006`uMDNҤ\u0013o\u0011x)2I{AX0\"\"P q\u0006S\u0006z\u00062>kI\u0015}C_Z%fvt\u001c 04C''\u000bU<.\u0001B\u0002I5sDCcdN\u0004]d+Wvqqi͘\u0014K~\u001c]F\u00163\r%ù\u001bS72NP f';\u000fj/⣢;O}5N\\\fIb\u001b;t\f_?6yYw\u001bSe.Ld  Ĳ^xf.Xgܳ\u001bD\u0012#\u000f\u0010\u0012:vɸ(]$K4\u001bv~$7w{i+1\u001b12\u001f $T\u001e57/43\ruB\u0011Ih>\tŌG\u00119jn\u0018T&y ΔvGnW&+\u0017\u000b\"݉zxdEWȴ.\f_\u000f\u0010\u0018\\QFΘ7tvDN4zU\"\u001c\u0017\u0018BwA\u0001\u0002Ñ~\u0015:x3L\u0011j]I\u001c $XH>>Md\u0012fșTdsGt7/Y\u000bO:\t0ka\u0016ehȬ\t\r(kriwnƅ*'\r}\\gB֌#n#Ymhʄ6g\"\u001fUO[;\u001f>\u0016%\u000bDj9HCfM7u%Cv:]Ѩ⽵F\rLXuPT~*d1!WSSTGeӠ*IZ1&V\"Ɩqht%xm\u0019*ag7ذnQ~%)}ǭeꊵ!ԈxjU9밵̘Q\r\u0014ksi6\u001dUVc5\u0019+EƼ[c\"*y4s \u0011:<DgOxB{ϩ(u.sb-B3RGY=y\u0018kwE\u0019\u0010I\u0001BJqY5mԏfGU^yfC&']汵Ū23\fWm±\n\t]s-\"wwS\u001f3O]tW\u000bی$\u0019Lg1U;፼DvTa%5x,fxGP\u000br.BB2\b,Oƽ噑).cDdQȆ\u0014e1yoVș\u001c/㮯SO$4Ѡkv\u00193-\\e1\u001e?\u0016!mAʰZcy$!p]Ȉ\u0017\u00182\u000fx^$gx4XZY&ډ\u001f\u001d\u0012sX\u0018nv\"[[\fk31(\u0003\u0004p˾ly\u0005ŵL<Ս<z~/:9'9<=@@T[*rٱH$Z|4g-G#f-J=E&\u001a\u0011IbafVF\u0006Z{;unX\\ycqweS\u0017iX|N&s;jG諣oG51RlƔ\u0012~[CGWl82Y%Yldf4bV|U('sdot5{\u00173]m-ld\n\u0010fK$X}ZodQ3LM_%\u001cC-xFsb\u0019հ#!\"ezV,lΞoqZQ}X\u0018K8j7b:uN[|dhw\u0013npQg\u0000!3h,e\u001a3ժ8kܱmZi^|ϴt-\u001fU\u0014SwnfLA3\u0013ݘgLQ5S³Ejq2g\reJf-9wj\r\u001a8`\u0000\u0012$\u0000\u000b>\u0006\u0010P4H\u0002\u001a \u0000\u0011P@\u0003(#h\u0006\t\"\u0007\u0018.\u000b*@\u0001l\b\u001c\u001a \r\u001c*XP\u0000\u00072\u0000\u0000\u0006\n\u001c,\u0000\u0004\u0012HC\u0006\u001b\u0003\t\u0006\u000e\u0016`\u0001\u000b\u00160U3\u001b\\Q`\u0001\by\b\u001adf\u0004\r\u001a\u0004\u0000\u0003\u0019\u0000\u0000\u0003\u0015\\p\u0007\n\r0XA\u0005U!\u0015\u0004Vc$U/fX+X6%+qlŢz \u001a\"\n\u000f\u000b\b\u001a \r\r\b\u0005jX/8U̇f86\u001f6k?<\u001cDW$MXv6ҎT$NUH7;\"]w3=3q}QsMTbȊyYPX;\u001e\u0019:*g[=Bz3u{um˦\u0019k3\u001d\u0019\u0016І\u0007{@\u0018\u0016\u0010\u000b`DCو\u0005\u0005:rP{$r³~\u001b\u00126=#\u0019>!o6$WJt4}\u001c?n.5d<5\u0019b\u000b$\u0011\u0005\u000fr\u0005ă\u0019Q0\u00077a!=_IfTeԈ1r7\u0016:#է)Z\t\u00189\u001aS܋\\7.w'7ҋ&-we(\u0000!ޕm^]?\u000f*5/.FP\r*\u0016\u0019LE\t\u0019K̗2=PX\\dU$aWuH)8\u0013;\u0018ܝhI\fd²\r\u001a\u0002\u000eР\u0003\u0018\\ \u0005\u001c A\u001df?*o4gt(p\b\u0005'611!!Z=:x#z1\"ip\u0014D'Q5\u0013\\G{&\u0003:\noɑ]]H\u000e\u0010\u0012ff2Tf\u0012r>'\u0011Dp2\u0015ܕb2\"6s\u0012TZWj**4*.jTv+/o&.7z\u001a瑲\rD76e*b\"bn꺨9:\u001b!qH\u001f\u0019\u0014JslBk\rJn\nYŅK=td]\u001d+ID\u001dv\u001fYH*L܌1OͺtRYo,Ĭ>ѐ\u001cŌv3١>\u0010oYڰsC-1f|w/qeECqf1⧸\u0016\u0013!Lwp6bYxά\u0017i7I$HA\u001bx\\\u0013FJ\u001eyuYAV\u0019YF\u0017YЇWͼ%dA#\u0010\u001d\u001eW\u00164%c35\u0001BB}JbKcBڕ\u00192\u0019\"j\u0012/E\u001av\u0016#V4c#4\u0017s͉2h\u0012ʜ@$\u0012Ȓs72\fCu`zDbD.DfZW?\u0004>YXIxRV#\u0019uDHE7n2Mv!/0\u001aɉ09@\u0016#)fӑ\u000b\r#E* ݫ\u0015<ɜ\u0016$3c4\\Tȣ䡓\u0019#Cә\u000f\u0010\u0018HOeHΖT*~deFZiǤ<\u0018/6\u001eQ%Nֻ\u0013VlN>d[H4d\nD)em\u0006DމT(t94v(m粺V?^S^Ijg\u0019EG(M\u0010ZƦ\u000b%1܆\u0002fuft\u001e62E.L\\6t7\u001a1\u001b\u001c[i]\u0014!L)\u001e<[ˆHj\u000e3ݐ\fٱ1RO#rqMxrq\u001aεCR\u0013Ocl{~\u001d%YBbᓼ]UzS'73\u0017\u001bE&yQ=ܸۆƬìnl\u0005u\\bc5z\u0017^=91Rw\u001e\u001665\u0001BTE$5g,Y$C\u0007\b\f΍\u000b:{Gט)bոӞ\u0001BB^r\rg&\\~*ȍM\u000f\u0010\u0018fcB\u000f\u0010\u0018x\u0019*\u0011yT+T\r]GӒa\u0007DR(Qfua6Pklz\u001dP!\u0016덟OnJ2C<JLnE[l.Eg%\u0012#0ە]<:qJ\u0002\"Azꎝ\u001c\bu'n\u0013iG&f(f\u001c\f=JC*+kA\u001ai\u0015\u0010t*.'\u001cd\u0013\by~6e^]\u0012\tgdW#D\u001cRf. \u0012\u0019Z('\"2ĹTG\u001ab0o]-\\q\u001f\u001f\u001a6u!VP\u001dJpz7ZQ\u00191qPXw9Mt\u0018vd\u0013ǭ8Q7z{%Ƨ\u0019g9CVb5D \u001b\u0013\u000bT`\u0002\r_L{\fNQ\u0015r@\u0010\u001f$|\u001cM131r\u000b&\u001a53|L|KՕ^\r\u001f 0\u0000\u0002SpG\u001f\u0000\u0016\u0018hg!UP\\㦞3\u0001\u001d}X\u000f\u0010: $X^\u0014A\u0004\u0005A@\u0013h)X\n2Qy``\u001b\u000b\u000bf%$1ĢcFr\u001a\u0010G\u0013BM\"J,\u0018A\"\u001e\u001e\u0016\u001eN\u0012CG2_\u0012\tE+&;\u0019IböDG1cv\u000f3Ȍ\n4\u000f\u000eÂ!^eD!lr\u0006DdJ\u001fc\u001c$\u0012D.\u001b19ߑG1Qn\u0006o{^xG\u0012\u001a\u0013Nݛ,F3;n=ꍝXFeJ;ij\u00131.\r+Y|H\u0012\u0011k\u001a]ǮlfXy={t\u001fO2\u0005\u000bCcx(\n\r\b?X\u0001 F\u0016\u001a\u00104C\u001a\u0016\u0004\u000eB^vTɈ2F\u0003\u0004!V\u001b\u001f#Sea4g'A\u0017#JG(d\u001br\b\bYq]E\u001dE(zC%\u0015)3\u000b*(Uḳߠ\u0010wԕ+60՘\u0014,pfNZSѩst6f~k+?:C\u0014|\u000e\u0012\n^ex6?\u0012\\F눌͕i\";FcaedL'tYǫm#v,ETs#ccHƪFbL~f,|\u0001BYcc\u0001B\u0001B\"\u000erlJaNg2Fos\u000e.F\u0003\u00161TϽ\u001b\u0014E92tu`BHÂ\u000bQ\u0002AĈb\u0015\u0010dAASL\u001dTJFF>O\u000e##J|'\u001f\"\"\u0011\b8Q\u0003\u0014U7XF*bwShb*\u0003\u0004bZL\u000bbwes\u001c\u0011UhI\u000e\u0010:P\u001c\u000e\u00102Pi~a{k>SnT<q\u0016ʰ4\u000fnڔ\\.k$),V-᠛u\n,WwcX}.Pr\u00121\\7v|fo}CnQ-]B\tT9\u0010M5o\u001cϠ88>V];+#kTe\u0013m}q\u001b3䡓5\u000eڍV8|s\u001euգr~\u0012;CRM*QphAra쩎!g&-\u001e$VS54]΍)'n:>\u0013\tE]cjAe.᠄ʨ6&R0g5J\u0010\u0013)k\u0005ˉ\u0013]\"\u0004\u001b5\u001cV\"8:;\u0019UԂcf\u0018\u0004\n@d#b\u0010D\u001f\u0016\u000eq\u000b\u000eF84 \u001e\u001aq\u0003YzGCeB\\mL}>W>),\u001aɴ+6B_+ \u001e\u0014\u0010\f`ǡ\bs)U\u0013#ʌ-ỳ*TMqΪh<S\u001fS`)d\n\bӈ7Ԉa\u0010[B\u0019)$\"R\u0019#]sDO̕V}YsH(M^R\u001fTU!\r\u000e}NS\"+\"\u0011U8$oҰ/}N?\u001f27\u000fI( qPz;bQp\u0006\u0011y\f\u0007\b\np@\u0002&`\t\u000e\u0010\u001c2\u0001\u0011\\\f\n\u0007\f.@\u0006\u000e\u0018dpȀ\u0007\u001c>\u000b,@p\bB\u0006\u00198@\r(` \u0001\f(<`\n\rV\u0018)9\u0010\u0005#\u000f\f\u0007{h\b\nFn\u0006/\u0018\"bH\u0016zX\u0005[\u0012\u0005PPpX@et/\u001b\u0018\u0018\u0016\u0014\\a\u0001ц3b\u0014\u001e\u0010\n\u000e\u000b@\u000e/ a\u0001q\rf\u0002A\u001c<\u000fdp\u0010\u0003\u0011+ A0AЃ\u001a\u001b󢑆0\u0003\u001a\u0018\f0\u000bF<\u0014\u001e\u001c,`\fp\u0007\u0004,( \u001cHFE\u00100\u000eWp144<4SC{\u001a`\u000e\b!\u0006YY(\u0005Q q@,\u0018\r\u000bF<\u0002b\f\u000e\u000fR\u001f6\u0019\u001a\u000epC\u001c\u0003\u0002¦F\b\u001dhe0%\"aۙ\u0014\u001fwfPb-(4\u001chh(\u0006P\u0003\fX\u0001\u000b6`\u0005\t\u0004(\np0\u0000\u000b\u001c X\u0004j,'c\u0000\u000b`p\u0000\u0002\u0018ͪ6AfJ]7\\\u001bM5SD\t\u00022|a\u0019s~gjtꖩ#EPhbަ!kg#}AVҌo!\n+\u0019]\u0016o,dLL-u15g;\u0012y}3d!RRy0adB5G.\u001b\u0006%Dlhnz%D\u0011)\u001ba_ms\u001fLxTz~PB-X'\u001d\u0012oɉ5<U\rKtc}53No.r%\u000e\u0010\u0012J9LL2Sc\rJlf2JF_LNYr2;NCsU$[!ڐHgT\u0013Z3vÄ\u0014\u001c\u0011G눌\u0015ɓ\u0007[!\u001bVvGwTS'^\"4V%ː\u001bgrmb\r\u001a͜hj,Uxku9\bv)W(DzU\u0019b^mf\\(#D:D(cs6\fW\u0006ULG#\u0019s+g\u0017V\u0006-r!\bٵfAc/.Q)cKɅ26vFc\"\n;n𜡝\f3\u00197qQ3*EBuQJ\rlw1\t7^FHHjH\u001ceDQ\u0019&͋pս&E2\u001b7cBX\u000f2֥\u0019\u001eXM\u001b6FvD~4Qcf.!?&UDQ\"F,=^>ܸ\u001eѣ+Y F3Jg\\Fn֑iF~%>gä\u001aJGd/ol;ƈ\u001f<Ǵ#gRCnCڭ\u0019V5>$q\u0016('r\u001e1\u000ea\u001d $>6)\u0011\b\u0004P\u0004\u0001\u00008@HY>\u0001\u0004\bg\u001cf@QRd\u0014LG(J\u0010EՕ\u00179$317\u0004G6J~U\u001cD\u0018Ɣ8'\u00196\t\"\u001aҝ|k\u001aL`\\xǎĭq=g,_JC\u00147LftFL{|\nѝ\u0015Ph+cE\u001b?\u001b@*0\u0015\u0002\u0015I\u0000\u0002ڭB\u0014DBd\u001f|DFDQZ# 5\u001cۜ:26JfU7WfjP\u000f9YHj.\u0015d\u001e.#4'Dc\rE#Yɕ\"h\u0014e\u0018TB1\u0013+ϑ:QL)\u0016%CvE\\ۛ\nި\u001b2\u0017\u001aj\u0011\u0015b4sbr\u0019gC/\rL'E3\u001f4M1\u000b1o6=3Ei10ÌMldVVC8鷇oFdwefce8fagVw4T2Jgw[ﳎW\ry+m6D\n\u0013M1\r\u0014Vn\\g,\u0017:L˜}w\u0019VhDhJůgek\\Jp#ZVu2do\u0014\u000f\r?\\2$e\\$ޝ̡Vha7ԋSv6v{<&q#6J\u001834P\tL\u001cY\u0012J\u0004\u0002\u0011\u0000\u0000\u0018x4 \r\"hHQH?\u0014\u0005\\(.\u0018\u000eD‐D*9\f!\u0006\u0018\u0002\u0000@\u0006\u0019E\u0001fl\u0006FG=N\u0014+\u0016</\n.s\u001dv4H\u0004/2ʗlMV\u0018IG\u0007mt\u0012RC\rQ&nx=0t`\f:$.\u0006\u0001W[拑xLc\u0006]I\u0019+\u001b7H})lP\u001fY+i\u0012_Iwm]Cτۘ_\u001b5xjMƫ\n\u0006$-ˋA\u0007K\t\u0012\u0001\u000e\u000e6NZ90;\u0016\u00043)Ҁ\u0016U}_+u\u0013v6$U&TG]\f1\u0004u4&W9\u001b\u001bcZNO<ǽ\u0017kUs}CoZ2NoZèӠ;hL~rct\u0004i1!\u0011b[;\u0016{\u0001`Fl @A˂l\fp\t/ⲍ\u0012\u0007,ۄU\u0000(O?t\u0000\"\u001d\f\u001atG4nhM>۠Sl\n\u001a\u0019K\u0014\"w3]\u00062q\u0017=,S\u0007B\u00148=\u0010/\u0011f̔D\u0005ґ`Ov#\u0013n\u00162yE\u0007\u001c柇]\u0017We\u0010K}<\u000e*\u0002\t\u0007&|\u0014\u0004U@A\u0016Hpl\"5vDu\u0003MbO ס\u001fx #*\fkh\u0011/ƢʈȦZ|&B\"\u001eQH`\"?rΡ(~\nc\bنC\u0014J6-g\"\u0003\u001fԂI)KcIB\u001fi[ά\u0004_I}6\u001a\u001d\u0007\u001dS\u001b+/һ\u0006a7\u0003\u001c*I\nodS\u0001&tҐ\u0001\u00136>Y;3\u0012\u001dsɕ`@\u001b:'%V] դ\u0018hʷXlXR2C\u0005)\u000e\u0018:î\u001cԅ#[Dn\u00148>/LS\u0016|j{\t\u0005ip?\u0004\u0018\u0005\u000f[Qd2N+\u0003u\u0015\u000eC\u0007]#+J\u000e/S4\u000eKj)v\u0002.OPv,\u001cF34Q}{}/n\u0000\u001bQ\u0013\t*9U8[\u0016oāml2m&`\\\u0015Jy\u00056n}o\u001c\u001a~\u0010G\u0018pEs\u000bL<76fYb^}\u0015r\t0'̃TN\u0002mP\t\u0013\u000b\u001dG+.\u0013:ws\u001a\u000ekM9t;Oy\rڵC\rcZ34\r)8\u0002\u0012CF˶!gā\"LXG㏇#\fA[Q^C8\u001f\u0012Eh\"r% Y#.(\u001e%\u0000Hjǫ+Y\u0011j}Bg \u00171\u001aj1e2m\u0013&&+\u001d\u001a\u001dA1t?a\u0016\u001eg\u001csk\u0010;\u0015=\u0006 \u0011M0-ը8x\u001dۈl?HUK knū\u0013%Y\u0017O})\u001bˤ\u0004.F]AmN%(?x\u001c(m\u0012?5\u0015Y\u001cJ%Ʉ++\u0011?̯o\r\\\u001fx(_rih\u0000j\u001b\u001c\u0019\u000enqg┛\u0018I\u0018_/Y$j\u001f\u0011\u0011\u0000r}|ј~ͨ$\u0011\fr%B\u0010\u001fød\rO<|\"\nnm\u0011`˚$A\n>q?849\u0005/u\u0001lܟst\u0007-\u0001RO:\u0004庉Pm_H(R\u0019fB\u001eUb\u0003F$G\u001dZq\tp\u0018E\r.]$Vw␊ʅarʁSl\\J\u001ef\u0018Ed!0[\\\u0016U8!\u0001\u001bߙ\u0003\u0010I=NǊ)\u000bP\u0013\r^\u0019\\X\u0002\u00033D5\u001e)Tx\u0018+#X9H2(\u0005(qn]\u0017\u0017VE\u0014oQ;k(2&\"H\u0007V\u000e2\u001fZH-NQdP豌'?ӥ<\t\u0001\u0001\u0005\t1dSB\u0019[[E\u0004wLqʧ\u0004ĭ a\u0014BF4\u001c+rr\u001b#^u81^BY,VNȥG꠻Xvr8:5\u0006l$0 aR\u0004gT܀;E^'[_U(,\u0001J\t+8B:*\u001f6\u001al\\`E -(h2×\u001cy3\u0018\u000f[:@\u0012rU0^lr\u0013d]7m+5\u0001\nWxg\u0016V\u0000\u0004FGR\f\u00068\u001eR\u0010h2HKfC+'UE&/\u0012pa\u0002뫀\u000e#oϒV\u0019SwmiI$$\u0004E\u0004\u0016\n\\9tɢYrn\u00123\u001by+|WP\u001cA'\u0000\bm|\u001bB&w6̉\u001cad0d5W\u001cٶզ[VCÕq\u0004%\u001c?\u0007\u0004/BeWuz\u0004\u0001jǊrs1\u0014v\u0013\u0018\u0011\u001c`c 4u|\u0002w[Ɋ\n6W\u000e/S#14\\ݒ+wEH`U>_XH\u0018h\u0001)\u0005&YoRAmEɸk\n\u001doVNB\u0010\u0012e\\9=']\n\u0007\u000e\u001d(Kؤ=\u001c\nMn82_2&%MWy\u001es+`+\\B=WJ\u0016yH\u0001,q\u0003ex T5f\\9+]՝bFO\u001bqbnnPUU9ey\u0017\u001f%W$\u00122QZk\"G:]y\u0015eL0J9\u001b]v0\u0003\u0013\u0011bph\u0016Fh7RVS\u0004ՆK\u001d_`UC\tʌ\\Nۍ\u001d\u0012\n15\u0019uaVN[\u0014o\u001aj2\u0005\u001e:\u0002\f*\u001dQQmɢ23Z㿱Õ$VRU\u0007+iVbLu\u0005㿇\u0014ɻGc\u0016E;E\u0011@\b\u0006˲\u0017=b\u0015@6~#\u000b\"\u00187#r'\rUDLPydNjWhGAtv2Q[X!|\u000eG\u0011Y&\u0001HH}kRAӘݹa\u001b3n\u0017*PsKiI\u0016IsZO\nDB5\r\u001e7n\u001eZ&ΪJge=xDfy'\u0012Asi78A\u00055\fA\u0003\u0003s\u000eQ<v\t\"Mb-2q&뭫D[\u0019=\u0000\"vc\u000f\u0001I$\u000edi4o8G\u0006C\u000b\nz\u00129\u0002tmĊX\u001bUt̃\"ܠҧU\u0006;\u0019&G\u0014ċ\u0010J욭f\u000e@\u0011!kSpȯr1\u00060bS*y\u0011\u0016#\u0005O\u001061\u0011%<H1:Z\u0004-\u0010}\u000f#`%,\u0015\u0016`/?%>\u0015Na\ret`P\u0000\u0002\u0010e\u001b_7<Fy-;[\u0013\u0011G4JuYsrx,)\u0007\u001cRJskdK8\u0016u-\u0004\f\u0014]somutY+j\u0003we.\u001aTemmAQV\u0004v%Pw%\u0010XݠIxsAЯy\u001du\u0000 Ń\u0016r\u0004%\u001bT6\u0003c\f\u0019\u0002N4~⓫lO\u0010bD\u0019\u0004[7\u0018\f#\fp=\u000f6}Br``^\u0005\u0010t\u0003CA\bPi\u000fNGǿ\u0005.\u001e\u0005]^\f@qE \u0019H5N11\u000eX_Ԙ7@v\u0012$w4\u0007\u0002ilLQW:K_/t\u0004eT#z@j6Ƹ\u0011p\u001c\u0013$oٲ@\fфr7\u001d\u001fhF\t4\u0002\u000e\u0019qR\u0007ʥ\u0001=OA\u0003umufXh\u0001\u0012N\u0006\u000eo\fX\u0006l\u000eσi@K\u0017F<n#V_!Iж\u0013ݸ0!C\u000f\u0011,\u0018Ym2b3M\nAkrp\u0011\\q\u001bg[BLG#62jW'\u0017-ΖɓtȰV \u001cZkR,ZwFSuF 0-0rط[K'xZwAh \u0006%\u0015{[~/\u0012\u001aCUE┪㣷7\u001ce-\r`\u000bKΗ&}-e/e#Rs9˕Rs$Ttz`ǔ}ƵR)\u0017-\u0018JZ# +tȅr\n#\u001c\u0016)UX\b e+tUeDaEf\u0011#lS(x䋞\u0004xy\u0001ANSu~\n\u0016\u0011\bv+[\u0013Z4,vᘋPDsh$ \u0016ey\u001a\u0011\u001fj\u001c\u0005y(GQ!%X(\u0013'*0\\ *\u001d\bM\u0013!Y|-SOek\u001apL(Ky\u000eMȵ\u0013RW\u0011qd+;H-xZ@\u0007}kM1\u0010Uo\u0019/KB%}\u0011u5\u0005k\rA\"(̲,hف2a\u0017vIE-Rfrx_w\u001c47\\\tw⧥\f_ZZpx+m\u001dZ\u001b]\u0002U+!@uj*R\u0016QAB\u0012B\u0013\u001dL,03HMzl?,Yc\u0013\b\u0012e6ë'=Qmt\u001d\fX\n[ ǎy\u001dzY֙^}+ i:\u0010`pǙ\u0004\u0019,\u001e|g\u001ev@K8D\u0011\u000b\\4\u0013\u0014i\u00071f\u001c)\u0017\u0010UQRep$\u001dYU􊭆X4/\u0016l^\u0013\b6<A\u0019T@\u0015U\u001aF\u0007hWh}\fЄ\u000b-._\"G;uA׍?u\u0017.\rb `\u000e\u0004nr͂\u0001t>pڮB3w,\u0015b\nFQ%\u0006N\u0016\fBbv\u0002hګ\u000e\u0006'\u000e:\u0013\rHl>+\u0001m0\u0005\u0002&X; \u0018M?\nO\u001aXAKĸڂ\u0012<\u0004)p]\n\u0002nNAV\u000fj0\"\tJiWytDfp\n\u0010><1\u0002_\u001eh()\u0019_\u0006G+EQfN[\u000eX\u001erxu\u0007\t+BtݓU]#jc\u001a)CeE5,5=dN07ks!w,\u001b_.Q\u000b~ɾR\u0014\fL\u000eL|g{~U\u0014Ѫ\u0004\u0012RL0Ҿ-\u00005J\rص/FRw\b\u0016c\u001c|o\r&\u0004&+!#\u0002D2Eɥ!dt\u0014A:Gq'2~\t\f,\u0006ˠtN0-\bB\u0000'Vb\u0001\u0001\u0013\u000f\u000f\"ğ\"Ђ`Z@\tȥ\u0012Q˲\u0015\u001d홴>8Բ2ˤ;.И(\u0005o\u000f\u0011IL;x,]\u0016X-s\u0013\f2\u0015u\u001eW͆X(.=1SF/\u001cݙ\u0014cm\u000f\u0004 ?/\u0001%Cq\u0016͗w@M7){\u001fb-^Xk}xTtpZ!B擟bzC>U#\u0016izr>\u0017\u0000bCǓv^\u00116_z\u000e-+|\n_nJ*6k\u000e\n\u001e{\u001eLT<xPޡ\u0015b\u001e\u001cKvPZV=\u000b\u0016b]k e\u0015\u0007]{\u0013P\u0000\u0005\u0017.?3aI2\u000b\u0005M6|2.*I\u001f?{Hq%\u0019f|/%kE\u0014ʑrd<h4\r1Q\u000fd\u0015Zrobj%N\u0007\u0000.e|x8@3Ǫe4B!\"ޅ\u001a͞˚s9׹W<9D0\u0018^#\u0011v\u0017XC-\u001f\u0007Ӟy{xC;\u0001fE\u0016[$Roo9\u000b\n[2&T\u001bB\u0012#\u001b~^ڴ3LZ\u001dQ\u0016vHEGї赴\u0001㱙?'0K<jM\u001bL4-ٜ+~pb\u0015Tr$\u001eGJ\"+\"Qj\u001c\u001d'\u000fd0t\u0017\u0019^Ծ\u000414T:\u001e}\u0019\u0006ׂ:\u0002x7ΡLB\u001f\u0010ByZ3\u001cɳ&&q\r\u0019䢝?(|\u0000\u0006fhlu\u0016nߏ\n֢\u0019t`<\t\u0016\u0005M\u001a١\u001a\u001ck+\u001c)\u0006\u0005\u0002\u0007jd!\n\"C\u001e\u001a\t>%!4\u0019j-wBL\u001c Ec\"|e\u000femz\u0002$F7\u001e| &2\u0005OqL(Xv\fxV'\u001d~!1] kDw\u0016\t.gtJ\nt+\u0007S\u0017\bJ\u0011WT\\\u0011Cֿ-kwK\u001c\u0019tE\u0004\u0010bL\u0003pC2\u0010wCAF\u0001s\u001b]\u0018ՙ\u00185\u0000[\u0004\u0014\u0000<ee?YӂY+a嵖тI2daZ\u0007>[;*pPoH_I\u0006>O6욪\u001b/Qq\u001aε*(\u0011V\u001e\u0012\u0003\u001bsG}u7e3\u0014u/D\u000fEZE.z0Ό1\rahtnz⒊29\u001cybE/qyN\u0010`^q/MgJ@Tٚm^\"\u00036~`%k\u0013v6\u001e\u0000*槠0!Pi\u0011HȜƳr\u001e\u0011\"LT\f*=H]\u000b[\u001bnC7B\re\u0010i\u0017m3@)\u0005F go\fGc\u0010.\u0006\u000eێ*\u0017d^a])-%Joarz\u0016'B@\u0007Z;0\u000eJ޳\f\u001e\u0010[pX1I-ֆ-G׶B\u0001tW\rP\u0018nYo\u0013ʟ?F\u000f\u0016sQO\u0000\bW9d\"B˨S\u001d\r@4\u000f폽\tx&.GE\u0010\u0007RuikW<\"ʥRJ0\u000fO\b\u0011\u000456\u001e\u0013iP|R~aKb\b\u0019+ҸYc\u001fz&J\u0012\"Db\f\u0011_r\u0016\u001b\u0012\u001e꺺6?c|P{\u001cp}e@`(9˫L\"qo@A-\u001fy\u001dR}\u000f \u001fɇ֡Pq`SRAm.v.\"9[fGғ\u001b*\u001f\u0004/\u0012`Nbќ\u0003\u0015\u0003(\rL֜\f\u0010:Eaa\u0017 \u001bgWN6Fj&C*\u0006\u000fT!wQ\nj3\u0018C㴹O\u001bdjA\u001by/\u0003eь5HW?`Yte\u0012Ax1SJA&\n\nj1\u0005\u0018EZ\u0014\u00129C3l.5V\u0006ea5\u0006u\u0003\u001b3|\u000b\u0015ɤ%}0uYq\u0001\f\u001dQ\u0005o>4R\u00133A\u001d>v\u0010|\u0015 A$B\u00142C\u00166Sȝ$p8h^V7(\u001a,Q$j\nok\t/O۾[\f\f6\u0002\u000e\u0010\u001a B1H\u000ee%!b\f~FsAb\u0015\rm\u0004\u0012:oy\u0017+R5>/X.q\u0011Ka쨫Co\nYslvRu02c\t{s\u0007y<EsB\u0000\fϭ#sΗ\u000f>*fJ\\폅\r\u0018\u0014~Ȫ#Lvf\u0000\u0010$U<f\u0007?&\u0017VD}\u001a}}\u0011\u001bT\fQ(wI48-W`\u000fpaz\u0010>mRL\u0002\b2T\u0007BU|B\u0014`F\u0015rm^1`6e\u001aU?\u0017ʅ=Y?\u001awVd5\u0018-&dq ί)S\u000e[\u001a3w\u001f\u0012J%\u0004a\u0006ZDყp\u0005\u0016ĦF\u0010w8:f1\u001e\u0013R2\u0001#d\u000er)&\u001cam~\u001f\u0013ꀽp%\u001abSد)xe\u0007që4k2\u0018cp#Xi1&b \"1^\u0013Z\u0013(9\nVc\rGHs\u001d,\u0010-\u0006\u001b\u000b\f%e\bUvc\u000e\t\u00176\n\u0011?\u001e\n\u00130ĝ\u0007*ȨzG\u001eܜ1\u0003X(d{$M\u001d3\\TF\u001fc(^_@U4k\u0018Kz\u0012t\b\u001b\u0018c/F%eKU\"Jcr\u001a1\"8_G\u00158cȊ׌1\nth\u0018\u0013x$\u0010=\t\bGۦbLeB\b\u0011KcRwN\u0018\u001e\u000ec*qq)+C\u0018o\u001b\u0013sjRN8\"w|!FΗ\u000e )e@a(\u000fc\u001eE\u0017AWs\u0002ݠ0tȎmZ\u000e\u001dLDd(Q\u0018\u0017}\u001b\u0018\u00183Wh;n\r\r3V\u001a_4*\n\ny\u0013dPѐz0:hDA~\bO3\u0007.\u0018KUu\u0004iDPZ\u00172pp\u000fV'``l+\u001aꪯ\u0005c\u000f\u0012ҩ\u0012\u001eh\ncVش'\u0003T` ^rY\u0017\u0010\u0012NɴJMn|1\u0015\u001e:p/Nbjl\ff+1CUML2kH\u0017o)c\u0002\u0017\u000f\u0004hu\rK'\u0018C\u0002}\u0010AH^,6B\u0013h.\u000e\u000bj\u0017!@!M:VY\u0017N\u0003S.\u0006h.g˺8~ϊHba\nDvpQ8,(\u0019\u0017w8xX\u0007D\u0004f_w\u0003#ܠ٣oI\u0019痠SbPY\u0019\u001d?J@$w^\fv:G.rX^\u001aŀh&Pj\u001cd\u0000\u0017\u0013F~鑹x\u0019XNkx1\u0006CI|z1\f>W/\u001a\u0017\u001c-MTT\u0002Ѷ\u001aB\u001e\u0003b,R8\u0016_\u001c$u]0qPYo~\frٲꋁv8\u0003ܸ>d㹑\u0000\u0011h\u0010KAK\\\r^Y̳\nԐ-\\^\u0003!(/\n\r\u0013(9ƊV;\u001f@0C\u0002\u0015\u000eȈ\u0015\u0019.)6DZpHT9\u0019\u0003Nf95<2}%L\u0002\u000bPr%5\u0003\\씱/F\u0002\u0003y\u0013Se\fBBb\u000e`P{(e\u001c*ds\r\u0001\u0015ʸn\u0007\u0012>;\u0007\u000fF\u001ff!\u001bꞤF|rKDe\u0002 t\u00139}=\u0015l\b\u000f\u001b#$F$Z/6&eT6ƋN\"\u0019YJ(7Z\tc6K\t.s\u0004\u0005\u001fZ˕Fп\u001f*dzQ&\u0010N='\\.A1;L]t\u0015 sr\u0003m/l\u0003یhK\u0002\u000407:-s'm~V3_\u001aN0K\u000ef96ҫ\u0002\bM&c\t\u001c\u0006]*?p<jH{#B\u0012m:P\u0018K(Ƥ!Xl]\n0\u0004\nf\tSLfȍUh\r\u0013\u0003UoHG\\H_\u001c\u0015&YBd\\yQ/@@\u0013\b\ni\u0006M\u001a؃\u0001KG \u0014?`\u0007٢:d\u0002\u0001ضR\u000fJ'lC\u000e\u0003X\u0013D*\u000f\r\u0012PЌ0R\ry\u0017\r\u0004J04\u000ee (h\"\u00141\u001eҜy\fP!c\u0014(&p\u0002:\u0003\fN\u001c~NO[N\\%\u001e)\u001aA\u0000&\u0017\u0007O?Z[\nϮ\u0001H\b\fZm\u001a8]\u000e,ew\u0004-0ĔFҠ~\u0005\\\u0014X\u001fH+\u0002\u0010jNLo\\5Rm3\u0016F?hH1\u000bc\u00108I`I#0f;脱jCoB\u0001r\u0013[v\u001dt0AIA>SJ\u0004#&]\u0001\u0000\u000e\u0002={n^\f\u0006eb\b\u0010+N7\rO^PpUfO&\b핡8\u0004\u001b\u001eԟ8&\u0010\u001d\u0018~@\u00109\u001c`sO0\u0011'\náZ\u000f*VkQb\u000b\u0002 xP\u0007Q\u001e\u0017[fL-X.[Bĸ\u001bЗmy',\u0015Bd;L\bX^\u000b\u00123E[\u00180q\u0006_gބ9Sh!\u0000\b!Y6 _Ck\u0016\u0002\u0014Bt<\u001fV%RC0\u0006ѭʅTq|\u0002BW\u000b᫙Qổ82v\u0015eʚ\u001c\u0011|\u0003|RnK\f&<]&Y\rBl&}k\u0012T\u001b_>\b \u0006,ژ\u001fQ\u0007Q6Cf\ny\u0011Z\u0004PrDo;\u0007lhg\u0015Z\u001do>̏l^mqc\u000eL\u0016C$R7\r`\"':\u0017)P%қYv\u0012\r!SѶj{\u0012òPA\u0012l\t\u0001G\u00104\b,Z3XaA\u0016\u000f`\bm1G)!3&3cw;_?56fl^̪Gw'\u0002\u001e¶5\u0000\u0015\u000f<#\u0012VJ|o\u001a~\tIl\u000bw\u001f3PQc?EJ$zM\u0019\u0005AumxSh-n!~\u0012\u0005\u001c6\u0003g\u0018d\u00138fҞ{cҗP\u0019wrkH\u0007\u000b\u0013\u0012Dz:.\u001a2\t\u0005:\tU5K'i!bzK±h\u000bH_5)\u0017YU3Cw2/J#K\fl3<B\u0013~\u0000\u0014Z=?+\u00013w\u0010-7\u001d\u0014\u0006jw\t2lO\u0002p,\np\u0003j&U6\t1VE,\u0004oF9\b\u00161.\u001e,Q]<\u0016\u0016\u0012\u00047\u000418B._5+MIZVX$ˡ7ꕅ\"\t/?aLj^O_8vq\u0013\u0007\fq\u001308\u000e]Eq@\u0018fkQP3\r\u0001$\byЍ%\u0010dL\u0017=\u001a[b!踸ѥ]]FXs̹F\u0016V#9~r\n\u0005\u0001\u0001M$]\bqF\u0014V>#9N\u0002\u001ay#D8|\u001cl\b\u0016R,x`D64Pb\u0007 j\u0001Z\u0013q\u0007IB\u001d\u001a\\\u000fKzGOP=}<r$^tN:S!eh\u001aE%&D-6Y\"i\u000b\u001a=ǁ4\u0013^Xg$UG\r\u0006{)\u0002M%\u000b\u0011}g@0\u0014Z#Ꚏ,\\ؙ7^\n\u001fcQ\u0015Ά!7(\u0011]g.Ow8xbw,utiEPy@\u0002]Zܿwҙ3=˶V\u0012\u00018eVg\u0014\u0012+sd\u0011۵{ԢC\u0011>v\u0000Ac]\u0015|\u0001`\r\b\u0005\u001d.`e\u0002ny\u00126\tzu\u0013,\tv62\u00173 m\f,\u0010V<0x8l-\n\u0012TˉW$)o2%Aջ'wW5>n\u001944w\u0016U=E[$.\u0019it<\u001405uVrP\u0018<\u000fU_!IIrWEv4N(\f \u0017/4.e~_a\f\u0002\u0005H\u001d\u0000k'\r\u000f!Z[I\u0003HV\u0015\u001d(\fȉO\rV0\rM7iZ[\u0011(\u0012M\n$̂b9#\n`q@q\u0014UXe\u0013yTI;)L )P^RcU\u0000${pj\u0000PI\u001a\u0012\b&B<\\=t][G4r\u0018c`\u0000Q\u00047L\bD\u0017Y8mp9\nUV\u0015m,\u001dP.:XjRn*2\u0012%T5)Ryh׮Z'Ozs\u0013X8N9) ػ\u0001RVPI\u0011q֯Fϒz\u0017 8m\t3j\u0003@~\nږ:4\u0002$\u0018|\u0017v*CV\u00066\u001759tisGo n\u000e\u000bHGl\u0014#JG\u0002[.\u001cF|<g\u0014V\u0002h\u001f)\u001c E9GXk2/9R\u0019{\"p\fA\u000f\u001bΔM0\u001dEjH{?(eQ\u0004\u0012e<7+*x\u000el|N\u0016\u001ctTb+NI3)\u001b%5aɕ\u000bO\u0015Pn\u0000)p:%Gap\u001e\u0000ϢP\u0011\u0000\u0012N6_؆4CJ\u001bt\u0006ˤi^&/M('\u0002\u000238]\u001exm@\u0005<޾2Y\u0019/ Xkz^:!b\nvg\u001c!\"9/h \u0014N\ttF\u0000֋\u001d(?*\u00079k\u0005\u0001\u00185y<AGzf{[5)\u0011VA]a9A2,JBWP\u0006ۏJ;?Xp\u0010\bDU=\u000f.޸fiN<q\u0012@\u000bb}\u000b\u0002\u000b\u0003\u0013\u0014\u000bK\u000bΰ8Q̭xy<I[\t<\u0019E1ט,Ңh\u00154\u000ef eOZ@̀<hiF/\"e\u000eG\n2<7\u0019b(Nrd)\u0019\u0003!*ґ$7\"{l\u0001\u0014g\u001cDj_|շxso3(\u0017\f>\u001b5v\u001dg(̩63\"r/)0?p<\u001cK\u001aS(\u0003(\u0019\u0003\u0000\u001a%\u0000O^(C=\u0010\u0003Id\u001cAYbQGWǏ_?ޑD]\u0006+\u0002\br>NIb>G0ֲ$\u000bS&\u0001kdb]_^\u0013\n%\u000et)E;Z|D劍=\tDa*4fm&\u001e#bG\u001103\u000e,\u001c\u0012+&I+D\riq`B˸쁡bS,Qk/h\u000baOrF3hix\u0001m\u0017fӶ'L\u0010 d~+n\u0000\f\u0001ݷ\rOɠne=}\r 2\u001e`l5UE\u001a֯Ҡ\u0002\u0013yWķ4\u0010\u001aY>M\u001aўS\fx.\u0018u\u0003\u000bFԌ \u0018\nC(=2%E\u0006-k\u0007֚&j\u0005ծmF\u0001RQ7p+xӛ!HϷE\u0004&6àg@Vˊ\u00170^G\rR\u0006\u0004#\u0007g!\u0002?i\nZ]e%&Bg-+6lVf;(\u000fR\u0002<\u0018\u001c-wpFb\u0015\u001b\\2<-/\u0013,\tj\u0010#B~-8q\u0012IX\u0001߭kI1n\u0018b\u000bV\"ע`\u0016%PJ!)GM\u0003Q,\u000f+^z2\u0000;P\u0002W\u001eMW']\r-G\u0013V?{se\u001a\u0016X\u0013R`KQ6ʆ\u001cF^v[\rU-FGP\u001a\t^\u0000r\u0000VeSi%54\u0004, \"N#!{On BAQ|T2\u001c0ύ@\u0010l\u0011\u000b!\u0005:c_j2F\u0003\u0010r\u0004|TN%e]ȁ\u0013Rd\u0015\u001c\u0000\u0004\b%9g\u0003m\b/5Ɓ\tx\u0006uP\\dT!8))\u001b\u001cg\"{״M\u001d\u001f*W4&Pr\u0007fRxۓ\u00102\u0000\u001c>\bP_ҟb\u0006@5BMbpHqT9A[i̬\u000f\n\u000eO\u0011G\u0004)>.Kd\u0010\u000e\u001eׯLwNy\r+ E}J\u0013Gv$\t0m\u0016dI\b#\nTˉv~vPe~J(_\u0017&\u0003A(ie'#\u0014Ma{4qd\u001dH\u000fq\u0000Fα\b\u0002qN\u0017C9@?z,0&\u0012\u0007)\u001aȄ2q]>p~#/\\\u0011\u001c\u0001Ӈ\u0004Cgٕڡ28vy:ޮ\u000bj^m`BBxV')K2<\u000b\u0004e|$c\t7šN8by\u0014LEH݈'c2R\u001eX\u0003\u0015=x$DtՅ\u0007L\u001dZnq2Z(iͺitO\u0019\u0005.(8\u001d@=])\u0011Y\u000e\u001fv2+R_:ZqH}\u001b݉\u0000\u000b\u001ah\t{6U\u0018(f^k<\u0017\u0018dU\u0018H3@B\u0017vY9\u0010\u001bp\u001d!r\u0002) J\u001c{B,z\u001b?i\u001eA[\u001bnL\ro(r]&|fo91\u000b4E#3\u0018\u0005$Ο$A\fCa\u0019L\u0005Z\b\u0001=6(9iȒ\u0018DNW8dؽG10Mzb$,H\u001e\u0010.\u001d\u0015[j+A\u000bvq\u00019\u00115c\u0019\u000f\u001eD\nB1\bD\n\r<̈qfi3#B\\\u00051`=t!nw\u0001\u0007TQ(+%\u0002[wtnp\\\u0007\u0001˫\u0011\u0016d\u0015m\u001fPibA'P͠\u001c1l<\u0015tQA\b\fBf\u0000:R~\u0010ɂ\u0006 ;uɏ@^\fl\rb\u0013䗼\u0015r\u0005ETg]//\u000b\r/\"7Cu`\u0001T$\u001c>\u000b\u001e}9p;+\u0013y\f\u0010\n\u00131BZH\u001c\u0002Qk\u0005l{>\nV\u001e\u0006L\u001e`&I/E4\u001a!\u0010HS\tːnRO2߾u<ʌ>և[ߊN D\u001aOڃ#\u0006 \u000f\u0000\u001a|@^l\u0014M^&Y\u0012]r,\n\u0013%փ́Q\u0007$\u001f;ԕ\u0002\u001dhq\u000es\u0016E2o\u0015=A¿i\u001bIqM\rL\u0013\u001fabd3C9\u0012\u001bh\u0012xhz\u0000d\fE\fo6yW\u0017jpvI gFMZ\u0012s=\n-O[*>T\u001f\u0000Ǩ\u0019En_F\u0015\u001d\u0005r%oRH\u0004N\u0011×^6\u0005AN\u0018g2\u000f\u0000t=\u001b\r4(L\u0004M߮\u000fD\tÂ:\u0000\u0015\u0001h\u0018@\fу3Ǥ;&bB\u0002\u001a#/D\u0001/Z\u0017J\u001fB\u0002҄!\u0014U@G\u0002+W|⑘\u001e%ʰ(k;ml\f=\u0002\u0012۱ȓ+{qwM$WFRG\u0001\u0007Qtl\u001eJflkE\u001a\t'iXu/[\u001dx]']\u0000ɡ\u000b\u0005\u0003ua`Cč-1I\b{\u0013n\fʾ;}V*\u001dm\\,y\u0015]06r\t\u0012p\u0001ӎ~<G':<\u001b3Gk^\u001b@Qm_bg_\u001epl_qp\u0017qu:@oB_r\u0007\u000ev3\u001d54]7r\u0005\u0004L\u001c6*CȠ\u0018P\u00000<o3-\u0000]J#,>Ł]\u0011C:{p\r\u0016U~gɈK.\u0005\u0005\r\nendstream\rendobj\r25 0 obj\r[24 0 R 23 0 R]\rendobj\r99 0 obj\r<</CreationDate(D:20210217080731-07'00')/Creator(Adobe Illustrator 25.2 \\(Windows\\))/CreatorVersion(21.0.2)/ModDate(D:20210217080733-08'00')/Producer(Adobe PDF library 15.00)/Title(SecureSpringBoot)>>\rendobj\rxref\r\n0 100\r\n0000000004 65535 f\r\n0000000016 00000 n\r\n0000000161 00000 n\r\n0000078654 00000 n\r\n0000000000 00000 f\r\n0000078705 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000143874 00000 n\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000000000 00000 f\r\n0000143947 00000 n\r\n0000144143 00000 n\r\n0000150252 00000 n\r\n0000215841 00000 n\r\n0000281430 00000 n\r\n0000000000 00000 f\r\n0000097174 00000 n\r\n0000097537 00000 n\r\n0000096804 00000 n\r\n0000096874 00000 n\r\n0000315777 00000 n\r\n0000079343 00000 n\r\n0000086484 00000 n\r\n0000092031 00000 n\r\n0000143390 00000 n\r\n0000143513 00000 n\r\n0000143628 00000 n\r\n0000143751 00000 n\r\n0000093421 00000 n\r\n0000093567 00000 n\r\n0000093721 00000 n\r\n0000093875 00000 n\r\n0000088081 00000 n\r\n0000088330 00000 n\r\n0000088580 00000 n\r\n0000089103 00000 n\r\n0000089569 00000 n\r\n0000090035 00000 n\r\n0000090366 00000 n\r\n0000090689 00000 n\r\n0000091021 00000 n\r\n0000086549 00000 n\r\n0000087519 00000 n\r\n0000087567 00000 n\r\n0000093358 00000 n\r\n0000093295 00000 n\r\n0000093233 00000 n\r\n0000093171 00000 n\r\n0000093109 00000 n\r\n0000093046 00000 n\r\n0000092207 00000 n\r\n0000092983 00000 n\r\n0000092144 00000 n\r\n0000091328 00000 n\r\n0000091391 00000 n\r\n0000091537 00000 n\r\n0000091671 00000 n\r\n0000091791 00000 n\r\n0000091911 00000 n\r\n0000092353 00000 n\r\n0000092507 00000 n\r\n0000092627 00000 n\r\n0000092744 00000 n\r\n0000092861 00000 n\r\n0000096313 00000 n\r\n0000095131 00000 n\r\n0000094515 00000 n\r\n0000094021 00000 n\r\n0000094155 00000 n\r\n0000094275 00000 n\r\n0000094395 00000 n\r\n0000094669 00000 n\r\n0000094791 00000 n\r\n0000094903 00000 n\r\n0000095013 00000 n\r\n0000095365 00000 n\r\n0000095485 00000 n\r\n0000095600 00000 n\r\n0000095715 00000 n\r\n0000095835 00000 n\r\n0000095954 00000 n\r\n0000096073 00000 n\r\n0000096193 00000 n\r\n0000096447 00000 n\r\n0000096565 00000 n\r\n0000096684 00000 n\r\n0000097058 00000 n\r\n0000097089 00000 n\r\n0000096942 00000 n\r\n0000096973 00000 n\r\n0000119552 00000 n\r\n0000097921 00000 n\r\n0000098177 00000 n\r\n0000119802 00000 n\r\n0000315809 00000 n\r\ntrailer\r\n<</Size 100/Root 1 0 R/Info 99 0 R/ID[<498FF782C4F5304C811012568233FEB7><C519585AA549A849B5B1131FAB38D7C8>]>>\r\nstartxref\r\n316026\r\n%%EOF\r\n"
  },
  {
    "path": "articles/java/spring-framework/migrate-kafka-to-passwordless-connection.md",
    "content": "---\ntitle: Migrate an application to use passwordless connections with Azure Event Hubs for Kafka\ndescription: Learn how to migrate existing applications using Azure Event Hubs for Kafka away from authentication patterns such as connection strings to more secure approaches like Managed Identity.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: how-to\nms.date: 08/19/2025\nms.custom:\n  - passwordless-java\n  - passwordless-js\n  - passwordless-python\n  - passwordless-dotnet\n  - spring-cloud-azure\n  - devx-track-java\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Migrate an application to use passwordless connections with Azure Event Hubs for Kafka\n\nThis article explains how to migrate from traditional authentication methods to more secure, passwordless connections with Azure Event Hubs for Kafka.\n\nApplication requests to Azure Event Hubs for Kafka must be authenticated. Azure Event Hubs for Kafka provides different ways for apps to connect securely. One of the ways is to use a connection string. However, you should prioritize passwordless connections in your applications when possible.\n\nPasswordless connections are supported since Spring Cloud Azure 4.3.0. This article is a migration guide for removing credentials from Spring Cloud Stream Kafka applications.\n\n## Compare authentication options\n\nWhen the application authenticates with Azure Event Hubs for Kafka, it provides an authorized entity to connect the Event Hubs namespace. Apache Kafka protocols provide multiple Simple Authentication and Security Layer (SASL) mechanisms for authentication. According to the SASL mechanisms, there are two authentication options that you can use to authorize access to your secure resources: Microsoft Entra authentication and Shared Access Signature (SAS) authentication.\n\n<a name='azure-ad-authentication'></a>\n\n### Microsoft Entra authentication\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Event Hubs for Kafka using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage service principal identities and other Microsoft services in a central location, which simplifies permission management.\n\nUsing Microsoft Entra ID for authentication provides the following benefits:\n\n- Authentication of users across Azure services in a uniform way.\n- Management of password policies and password rotation in a single place.\n- Multiple forms of authentication supported by Microsoft Entra ID, which can eliminate the need to store passwords.\n- Customers can manage Event Hubs permissions using external (Microsoft Entra ID) groups.\n- Support for token-based authentication for applications connecting to Azure Event Hubs for Kafka.\n\n### SAS authentication\n\nEvent Hubs also provides Shared Access Signatures (SAS) for delegated access to Event Hubs for Kafka resources.\n\nAlthough it's possible to connect to Azure Event Hubs for Kafka with SAS, it should be used with caution. You must be diligent to never expose the connection strings in an unsecure location. Anyone who gains access to the connection strings is able to authenticate. For example, there's a risk that a malicious user can access the application if a connection string is accidentally checked into source control, sent through an unsecure email, pasted into the wrong chat, or viewed by someone who shouldn't have permission. Instead, authorizing access using the OAuth 2.0 token-based mechanism provides superior security and ease of use over SAS. Consider updating your application to use passwordless connections.\n\n[!INCLUDE [introducing-passwordless-connections](includes/introducing-passwordless-connections.md)]\n\n## Migrate an existing application to use passwordless connections\n\nThe following steps explain how to migrate an existing application to use passwordless connections instead of a SAS solution.\n\n### 0) Prepare the working environment for local development authentication\n\nFirst, use the following command to set up some environment variables.\n\n```bash\nexport AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>\nexport AZ_EVENTHUBS_NAMESPACE_NAME=<YOUR_EVENTHUBS_NAMESPACE_NAME>\nexport AZ_EVENTHUB_NAME=<YOUR_EVENTHUB_NAME>\n```\n\nReplace the placeholders with the following values, which are used throughout this article:\n\n- `<YOUR_RESOURCE_GROUP>`: The name of the resource group you'll use.\n- `<YOUR_EVENTHUBS_NAMESPACE_NAME>`: The name of the Azure Event Hubs namespace you'll use.\n- `<YOUR_EVENTHUB_NAME>`: The name of the event hub you'll use.\n\n### 1) Grant permission for Azure Event Hubs\n\nIf you want to run this sample locally with Microsoft Entra authentication, be sure your user account has authenticated via Azure Toolkit for IntelliJ, Visual Studio Code Azure Account plugin, or Azure CLI. Also, be sure the account has been granted sufficient permissions.\n\n#### [Azure portal](#tab/azure-portal)\n\n1. In the Azure portal, locate your Event Hubs namespace using the main search bar or left navigation.\n\n1. On the Event Hubs overview page, select **Access control (IAM)** from the left-hand menu.\n\n1. On the **Access control (IAM)** page, select the **Role assignments** tab.\n\n1. Select **Add** from the top menu and then **Add role assignment** from the resulting drop-down menu.\n\n   :::image type=\"content\" source=\"media/migrate-kafka-to-passwordless-connection/migration-role-eventhubs.png\" alt-text=\"Screenshot of Azure portal Access Control (IAM) page of Event Hubs Namespace resource with Add role assignment highlighted.\" lightbox=\"media/migrate-kafka-to-passwordless-connection/migration-role-eventhubs.png\":::\n\n1. Use the search box to filter the results to the desired role. For this example, search for **Azure Event Hubs Data Sender** and **Azure Event Hubs Data Receiver** and select the matching result and then choose **Next**.\n\n1. Under **Assign access to**, select **User, group, or service principal**, and then choose **Select members**.\n\n1. In the dialog, search for your Microsoft Entra username (usually your **user@domain** email address) and then choose **Select** at the bottom of the dialog.\n\n1. Select **Review + assign** to go to the final page, and then **Review + assign** again to complete the process.\n\n#### [Azure CLI](#tab/azure-cli)\n\nTo authenticate using the Azure CLI, use the following steps:\n\n1. Use the following command to sign to your Azure account:\n\n   ```bash\n   az login\n   ```\n\n1. Use the following command to set your current subscription context. Replace `ssssssss-ssss-ssss-ssss-ssssssssssss` with the GUID for the subscription you want to use with Azure:\n\n   ```azurecli\n   az account set --subscription ssssssss-ssss-ssss-ssss-ssssssssssss\n   ```\n\n1. Use the following command to get the resource ID for your Azure Event Hubs namespace:\n\n   ```azurecli\n   export AZURE_EVENTHUBS_RESOURCE_ID=$(az resource show \\\n       --resource-group $AZ_RESOURCE_GROUP \\\n       --name $AZ_EVENTHUBS_NAMESPACE_NAME \\\n       --resource-type Microsoft.EventHub/Namespaces \\\n       --query \"id\" \\\n       --output tsv)\n   ```\n\n1. Use the following command to get your user object ID of your Azure CLI user account:\n\n   ```azurecli\n   export AZURE_AD_ACCOUNT_ID=$(az ad signed-in-user show \\\n       --query \"id\" --output tsv)\n   ```\n\n1. Use the following commands to assign `Azure Event Hubs Data Sender` and `Azure Event Hubs Data Receiver` roles to your account.\n\n   ```azurecli\n   az role assignment create \\\n       --assignee $AZURE_AD_ACCOUNT_ID \\\n       --role \"Azure Event Hubs Data Receiver\" \\\n       --scope $AZURE_EVENTHUBS_RESOURCE_ID\n   az role assignment create \\\n       --assignee $AZURE_AD_ACCOUNT_ID \\\n       --role \"Azure Event Hubs Data Sender\" \\\n       --scope $AZURE_EVENTHUBS_RESOURCE_ID\n   ```\n\n---\n\nFor more information about granting access roles, see [Authorize access to Event Hubs resources using Microsoft Entra ID](/azure/event-hubs/authorize-access-azure-active-directory).\n\n### 2) Sign in and migrate the app code to use passwordless connections\n\nFor local development, make sure you're authenticated with the same Microsoft Entra account you assigned the role to on your Event Hubs. You can authenticate via the Azure CLI, Visual Studio, Azure PowerShell, or other tools such as IntelliJ.\n\n[!INCLUDE [sign-in](includes/passwordless-sign-in.md)]\n\nNext, use the following steps to update your Spring Kafka application to use passwordless connections. Although conceptually similar, each framework uses different implementation details.\n\n#### [Java](#tab/java-kafka)\n\n1. Inside your project, open the **pom.xml** file and add the following reference:\n\n   ```xml\n   <dependency>\n      <groupId>com.azure</groupId>\n      <artifactId>azure-identity</artifactId>\n      <version>1.6.0</version>\n   </dependency>\n   ```\n\n1. After migration, implement [AuthenticateCallbackHandler](https://kafka.apache.org/30/javadoc/org/apache/kafka/common/security/auth/AuthenticateCallbackHandler.html) and [OAuthBearerToken](https://kafka.apache.org/30/javadoc/org/apache/kafka/common/security/oauthbearer/OAuthBearerToken.html) in your project for OAuth2 authentication, as shown in the following example.\n\n   ```Java\n   public class KafkaOAuth2AuthenticateCallbackHandler implements AuthenticateCallbackHandler {\n\n      private static final Duration ACCESS_TOKEN_REQUEST_BLOCK_TIME = Duration.ofSeconds(30);\n      private static final String TOKEN_AUDIENCE_FORMAT = \"%s://%s/.default\";\n\n      private Function<TokenCredential, Mono<OAuthBearerTokenImp>> resolveToken;\n      private final TokenCredential credential = new DefaultAzureCredentialBuilder().build();\n\n      @Override\n      public void configure(Map<String, ?> configs, String mechanism, List<AppConfigurationEntry> jaasConfigEntries) {\n         TokenRequestContext request = buildTokenRequestContext(configs);\n         this.resolveToken = tokenCredential -> tokenCredential.getToken(request).map(OAuthBearerTokenImp::new);\n      }\n\n      private TokenRequestContext buildTokenRequestContext(Map<String, ?> configs) {\n         URI uri = buildEventHubsServerUri(configs);\n         String tokenAudience = buildTokenAudience(uri);\n\n         TokenRequestContext request = new TokenRequestContext();\n         request.addScopes(tokenAudience);\n         return request;\n      }\n\n      @SuppressWarnings(\"unchecked\")\n      private URI buildEventHubsServerUri(Map<String, ?> configs) {\n         String bootstrapServer = Arrays.asList(configs.get(BOOTSTRAP_SERVERS_CONFIG)).get(0).toString();\n         bootstrapServer = bootstrapServer.replaceAll(\"\\\\[|\\\\]\", \"\");\n         URI uri = URI.create(\"https://\" + bootstrapServer);\n         return uri;\n      }\n\n      private String buildTokenAudience(URI uri) {\n         return String.format(TOKEN_AUDIENCE_FORMAT, uri.getScheme(), uri.getHost());\n      }\n\n      @Override\n      public void handle(Callback[] callbacks) throws UnsupportedCallbackException {\n         for (Callback callback : callbacks) {\n            if (callback instanceof OAuthBearerTokenCallback) {\n               OAuthBearerTokenCallback oauthCallback = (OAuthBearerTokenCallback) callback;\n               this.resolveToken\n                       .apply(credential)\n                       .doOnNext(oauthCallback::token)\n                       .doOnError(throwable -> oauthCallback.error(\"invalid_grant\", throwable.getMessage(), null))\n                       .block(ACCESS_TOKEN_REQUEST_BLOCK_TIME);\n            } else {\n               throw new UnsupportedCallbackException(callback);\n            }\n         }\n      }\n\n      @Override\n      public void close() {\n         // NOOP\n      }\n   }\n   ```\n\n   ```java\n   public class OAuthBearerTokenImp implements OAuthBearerToken {\n       private final AccessToken accessToken;\n       private final JWTClaimsSet claims;\n\n       public OAuthBearerTokenImp(AccessToken accessToken) {\n           this.accessToken = accessToken;\n           try {\n               claims = JWTParser.parse(accessToken.getToken()).getJWTClaimsSet();\n           } catch (ParseException exception) {\n               throw new SaslAuthenticationException(\"Unable to parse the access token\", exception);\n           }\n       }\n\n       @Override\n       public String value() {\n           return accessToken.getToken();\n       }\n\n       @Override\n       public Long startTimeMs() {\n           return claims.getIssueTime().getTime();\n       }\n\n       @Override\n       public long lifetimeMs() {\n           return claims.getExpirationTime().getTime();\n       }\n\n       @Override\n       public Set<String> scope() {\n           // Referring to https://docs.microsoft.com/azure/active-directory/develop/access-tokens#payload-claims, the scp\n           // claim is a String, which is presented as a space separated list.\n           return Optional.ofNullable(claims.getClaim(\"scp\"))\n                   .map(s -> Arrays.stream(((String) s)\n                   .split(\" \"))\n                   .collect(Collectors.toSet()))\n                   .orElse(null);\n       }\n\n       @Override\n       public String principalName() {\n           return (String) claims.getClaim(\"upn\");\n       }\n\n       public boolean isExpired() {\n           return accessToken.isExpired();\n       }\n   }\n   ```\n\n1. When you create your Kafka producer or consumer, add the configuration needed to support the [SASL/OAUTHBEARER](https://kafka.apache.org/documentation/#security_sasl_oauthbearer) mechanism. The following examples show what your code should look like before and after migration. In both examples, replace the `<eventhubs-namespace>` placeholder with the name of your Event Hubs namespace.\n\n   Before migration, your code should look like the following example:\n\n   ```java\n   Properties properties = new Properties();\n   properties.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, \"<eventhubs-namespace>.servicebus.windows.net:9093\");\n   properties.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, \"SASL_SSL\");\n   properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\n   properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());\n   properties.put(SaslConfigs.SASL_MECHANISM, \"PLAIN\");\n   properties.put(SaslConfigs.SASL_JAAS_CONFIG,\n           String.format(\"org.apache.kafka.common.security.plain.PlainLoginModule required username=\\\"$ConnectionString\\\" password=\\\"%s\\\";\", connectionString));\n   return new KafkaProducer<>(properties);\n   ```\n\n   After migration, your code should look like the following example. In this example, replace the `<path-to-your-KafkaOAuth2AuthenticateCallbackHandler>` placeholder with the full class name for your implemented `KafkaOAuth2AuthenticateCallbackHandler`.\n\n   ```java\n   Properties properties = new Properties();\n   properties.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, \"<eventhubs-namespace>.servicebus.windows.net:9093\");\n   properties.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, \"SASL_SSL\");\n   properties.put(SaslConfigs.SASL_MECHANISM, \"OAUTHBEARER\");\n   properties.put(SaslConfigs.SASL_JAAS_CONFIG, \"org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required\");\n   properties.put(SaslConfigs.SASL_LOGIN_CALLBACK_HANDLER_CLASS, \"<path-to-your-KafkaOAuth2AuthenticateCallbackHandler>\");\n   return new KafkaProducer<>(properties);\n   ```\n\n#### [Spring Kafka (Spring Boot application)](#tab/spring-kafka)\n\n1. Inside your project, add the following reference to the `com.azure.spring:spring-cloud-azure-starter` package. This library contains all of the entities necessary to implement passwordless connections.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter</artifactId>\n   </dependency>\n   ```\n\n1. Then, remove all of your existing connection or credential related Kafka properties. Add only the following property to configure the Kafka bootstrap server with your Azure Event Hubs namespace:\n\n   ```properties\n   spring.kafka.bootstrap-servers=$AZ_EVENTHUBS_NAMESPACE_NAME.servicebus.windows.net:9093\n   ```\n\n#### [Spring Cloud Stream Kafka Binder](#tab/spring-cloud-stream-kafka)\n\n1. Inside your project, add the following reference to the `com.azure.spring:spring-cloud-azure-starter` package. This library contains all of the necessary entities to implement passwordless connections.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter</artifactId>\n   </dependency>\n   ```\n\n1. Then, remove all of your existing connection or credential related Kafka properties. Add the following property to configure the Kafka bootstrap server with your Azure Event Hubs namespace:\n\n   ```properties\n   spring.cloud.stream.kafka.binder.brokers=$AZ_EVENTHUBS_NAMESPACE_NAME.servicebus.windows.net:9093\n   ```\n\n   > [!NOTE]\n   > Starting with version `4.4.0`, this property will be added automatically, so there's no need to add it manually.\n\n---\n\n#### Run the app locally\n\nAfter making these code changes, run your application locally. The new configuration should pick up your local credentials, assuming you're logged into a compatible IDE or command line tool, such as the Azure CLI, Visual Studio, or IntelliJ. The roles you assigned to your local dev user in Azure will allow your app to connect to the Azure service locally.\n\n### 3) Configure the Azure hosting environment\n\nAfter your application is configured to use passwordless connections and it runs locally, the same code can authenticate to Azure services after it's deployed to Azure. For example, an application deployed to an Azure Spring Apps instance that has a managed identity assigned can connect to Azure Event Hubs for Kafka.\n\nIn this section, you'll execute two steps to enable your application to run in an Azure hosting environment in a passwordless way:\n\n- Assign the managed identity for your Azure hosting environment.\n- Assign roles to the managed identity.\n\n> [!NOTE]\n> Azure also provides [Service Connector](/azure/service-connector/overview), which can help you connect your hosting service with Event Hubs. With Service Connector to configure your hosting environment, you can omit the step of assigning roles to your managed identity because Service Connector will do it for you. The following section describes how to configure your Azure hosting environment in two ways: one via Service Connector and the other by configuring each hosting environment directly.\n\n> [!IMPORTANT]\n> Service Connector's commands require [Azure CLI](/cli/azure/install-azure-cli) 2.41.0 or higher.\n\n#### Assign the managed identity for your Azure hosting environment\n\nThe following steps show you how to assign a system-assigned managed identity for various web hosting services. The managed identity can securely connect to other Azure Services using the app configurations you set up previously.\n\n##### [App Service](#tab/app-service)\n\n1. On the main overview page of your Azure App Service instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n##### [Service Connector](#tab/service-connector)\n\nWhen you use Service Connector, it can help to assign the system-assigned managed identity to your Azure hosting environment, and then configure the `Azure Event Hubs Data Sender` and `Azure Event Hubs Data Receiver` roles for the managed identity.\n\nThe following compute services are currently supported:\n\n- Azure App Service\n- Azure Spring Apps\n- Azure Container Apps\n\nFor this migration guide, you'll use App Service, but the steps are similar for Azure Spring Apps and Azure Container Apps.\n\n> [!NOTE]\n> Azure Spring Apps currently only supports Service Connector using connection strings.\n\n1. In the Azure portal, on the main overview page of your App Service instance, select **Service Connector** from the navigation pane.\n\n1. Select **Create** from the main menu and the **Create connection** panel will open. Enter the following values:\n\n   - **Service type**: Choose **Event Hubs**.\n   - **Subscription**: Select the subscription you'd like to use.\n   - **Connection Name**: Enter a name for your connection, such as **connector_appservice_eventhub**.\n   - **Namespace**: Select the Event Hubs namespace you'd like to use.\n   - **Client type**: Leave the default value selected or choose the specific client you'd like to use.\n\n1. Select **Next: Authentication**.\n\n   :::image type=\"content\" source=\"media/migrate-kafka-to-passwordless-connection/service-connector-app-eventhubs-portal.png\" alt-text=\"Screenshot of Azure portal Service Connector page of App Service resource with Create connection pane showing and Service type field with Event Hubs value highlighted.\" lightbox=\"media/migrate-kafka-to-passwordless-connection/service-connector-app-eventhubs-portal.png\":::\n\n1. Make sure **System assigned managed identity (Recommended)** is selected, and then select **Next: Networking**.\n1. Leave the default values selected, and then select **Next: Review + Create**.\n1. After Azure validates your settings, select **Create**.\n\nThe Service Connector will automatically assign a system-assigned managed identity for the app service. The connector will also assign the managed identity roles of `Azure Event Hubs Data Sender` and `Azure Event Hubs Data Receiver` for the Event Hubs instance you selected.\n\n##### [Container Apps](#tab/container-apps)\n\n1. On the main overview page of your Azure Container Apps instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/container-apps-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of Container App resource showing System assigned tab with Status field highlighted.\" lightbox=\"media/passwordless-connections/container-apps-identity.png\":::\n\n##### [Azure Spring Apps](#tab/azure-spring-apps)\n\n1. On the main overview page of your Azure Spring Apps instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/spring-apps-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of App resource with System assigned tab showing and Status field highlighted.\" lightbox=\"media/passwordless-connections/spring-apps-identity.png\":::\n\n##### [Virtual Machines](#tab/virtual-machines)\n\n1. On the main overview page of your virtual machine, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/virtual-machine-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of Virtual machine resource with System assigned tab showing and Status field highlighted.\" lightbox=\"media/passwordless-connections/virtual-machine-identity.png\":::\n\n##### [AKS](#tab/aks)\n\nAn Azure Kubernetes Service (AKS) cluster requires an identity to access Azure resources like load balancers and managed disks. This identity can be either a managed identity or a service principal. By default, when you create an AKS cluster, a system-assigned managed identity is automatically created.\n\n---\n\nYou can also assign managed identity on an Azure hosting environment by using the Azure CLI.\n\n##### [App Service](#tab/app-service)\n\nYou can assign a managed identity to an Azure App Service instance with the [az webapp identity assign](/cli/azure/webapp/identity) command, as shown in the following example.\n\n```azurecli\nexport AZURE_MANAGED_IDENTITY_ID=$(az webapp identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <app-service-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [Service Connector](#tab/service-connector)\n\nYou can create a Service Connection between an Azure compute hosting environment and a target service by using the Azure CLI. The Azure CLI automatically handles creating a managed identity and assigns the proper role, as explained in the [Assign the managed identity for your Azure hosting environment](#assign-the-managed-identity-for-your-azure-hosting-environment) section.\n\nFirst, install the [Service Connector](/azure/service-connector/overview) passwordless extension for the Azure CLI:\n\n```azurecli\naz extension add --name serviceconnector-passwordless --upgrade\n```\n\nIf you're using an Azure App Service, use the [az webapp connection](/cli/azure/webapp/connection) command, as shown in the following example:\n\n```azurecli\naz webapp connection create eventhub \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <app-service-name>\n    --target-id $AZURE_EVENTHUBS_RESOURCE_ID \\\n    --client-type kafka-springBoot \\\n    --system-identity\n```\n\nIf you're using Azure Spring Apps, use the `az spring connection` command, as shown in the following example:\n\n```azurecli\naz spring connection create eventhub \\\n    --app <spring-app-name> \\\n    --service <azure-spring-service-name> \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --deployment <spring-app-deployment-name> \\\n    --target-id $AZURE_EVENTHUBS_RESOURCE_ID \\\n    --client-type kafka-springBoot \\\n    --system-identity\n```\n\nIf you're using Azure Container Apps, use the `az containerapp connection` command, as shown in the following example:\n\n```azurecli\naz containerapp connection create eventhub \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <container-app-name>\n    --target-id $AZURE_EVENTHUBS_RESOURCE_ID \\\n    --client-type kafka-springBoot \\\n    --system-identity\n```\n\n##### [Container Apps](#tab/container-apps)\n\nYou can assign a managed identity to an Azure Container Apps instance with the [az containerapp identity assign](/cli/azure/containerapp/identity) command, as shown in the following example:\n\n```azurecli\nexport AZURE_MANAGED_IDENTITY_ID=$(az containerapp identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <container-app-name> \\\n    --system-assigned \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [Azure Spring Apps](#tab/azure-spring-apps)\n\nYou can assign a managed identity to an Azure Spring Apps instance as shown in the following example:\n\n```azurecli\nexport AZURE_MANAGED_IDENTITY_ID=$(az spring app identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <spring-app-name> \\\n    --service <spring-apps-service-name> \\\n    --system-assigned \\\n    --query identity.principalId \\\n    --output tsv)\n```\n\n##### [Virtual Machines](#tab/virtual-machines)\n\nYou can assign a managed identity to a virtual machine as shown in the following example:\n\n```azurecli\nexport AZURE_MANAGED_IDENTITY_ID=$(az vm identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <vm-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [AKS](#tab/aks)\n\nYou can assign a managed identity to an Azure Kubernetes Service (AKS) instance with the [az aks update](/cli/azure/aks) command, as shown in the following example:\n\n```azurecli\nexport AZURE_MANAGED_IDENTITY_ID=$(az aks update \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <AKS-cluster-name> \\\n    --enable-managed-identity \\\n    --query identityProfile.kubeletidentity.clientId \\\n    --output tsv)\n```\n\n---\n\n#### Assign roles to the managed identity\n\nNext, grant permissions to the managed identity you created to access your Event Hubs namespace. You can grant permissions by assigning a role to the managed identity, just like you did with your local development user.\n\n##### [Service Connector](#tab/assign-role-service-connector)\n\nIf you connected your services using the Service Connector, you don't need to complete this step. The following necessary configurations were handled for you:\n\n- If you selected a managed identity when you created the connection, a system-assigned managed identity was created for your app and assigned the `Azure Event Hubs Data Sender` and `Azure Event Hubs Data Receiver` roles on the Event Hubs.\n\n- If you chose to use a connection string, the connection string was added as an app environment variable.\n\n##### [Azure portal](#tab/assign-role-azure-portal)\n\n> [!NOTE]\n> If you use Azure Spring Apps, use the following steps to assign roles in Azure Spring Apps.\n>\n> 1. In the Azure portal, navigate to **Azure Spring Apps**, then choose the app you use.\n> 2. Select **Identity** on the navigation menu, and on the **System assigned** tab, select **Azure role assignments**.\n> 3. Select **Add role assignments**, search for **Azure Event Hubs Data Sender** and **Azure Event Hubs Data Receiver**, select the matching result, and then select **Save**.\n\n1. In the Azure portal, locate your Event Hubs namespace using the main search bar or the navigation pane.\n\n1. On the Event Hubs overview page, select **Access control (IAM)** from the navigation menu.\n\n1. On the **Access control (IAM)** page, select the **Role assignments** tab.\n\n1. Select **Add** from the main menu and then **Add role assignment** from the drop-down menu.\n\n   :::image type=\"content\" source=\"media/migrate-kafka-to-passwordless-connection/migration-role-eventhubs.png\" alt-text=\"Screenshot of Azure portal Access control (IAM) page of Event Hubs Namespace resource with Add role assignment menu option highlighted.\" lightbox=\"media/migrate-kafka-to-passwordless-connection/migration-role-eventhubs.png\":::\n\n1. Use the search box to filter the results to the desired role. For this example, search for **Azure Event Hubs Data Sender** and **Azure Event Hubs Data Receiver**, select the matching result, and then select **Next**.\n\n1. Under **Assign access to**, select **Managed identity**, and then select **Select members**.\n\n1. In the flyout, search for the subscription where hosting service is located. Then, select **All system-assigned managed identities**, and select the managed identity of your hosting service. Select the system assigned identity, and then select **Select** to close the flyout menu.\n\n   > [!NOTE]\n   > If you use Azure Kubernetes Service, select **User-assigned managed identities** and then select the managed identity of the Kubernetes cluster, which has a name with the following structure: `<your-kubernetes-cluster-name>-agentpool`.\n\n1. Select **Next** a couple of times until you're able to select **Review + assign** to finish the role assignment.\n\n##### [Azure CLI](#tab/assign-role-azure-cli)\n\nTo assign a role at the resource level using the Azure CLI, you can use the following commands:\n\n```azurecli\naz role assignment create \\\n    --assignee $AZURE_MANAGED_IDENTITY_ID \\\n    --role \"Azure Event Hubs Data Receiver\" \\\n    --scope $AZURE_EVENTHUBS_RESOURCE_ID\naz role assignment create \\\n    --assignee $AZURE_MANAGED_IDENTITY_ID \\\n    --role \"Azure Event Hubs Data Sender\" \\\n    --scope $AZURE_EVENTHUBS_RESOURCE_ID\n```\n\n---\n\n#### Test the app\n\nAfter making these code changes, browse to your hosted application in the browser. Your app should be able to connect to the Azure Event Hubs for Kafka successfully. Keep in mind that it may take several minutes for the role assignments to propagate through your Azure environment. Your application is now configured to run both locally and in a production environment without the developers having to manage secrets in the application itself.\n\n## Next steps\n\nIn this tutorial, you learned how to migrate an application to passwordless connections.\n\nYou can read the following resources to explore the concepts discussed in this article in more depth:\n\n- [Authorize access to blob data with managed identities for Azure resources](/azure/storage/blobs/authorize-managed-identity)\n- [Authorize access to blobs using Microsoft Entra ID](/azure/storage/blobs/authorize-access-azure-active-directory)\n"
  },
  {
    "path": "articles/java/spring-framework/migrate-mysql-to-passwordless-connection.md",
    "content": "---\ntitle: Migrate an application to use passwordless connections with Azure Database for MySQL\ndescription: Learn how to migrate existing applications using Azure Database for MySQL away from authentication patterns such as passwords to more secure approaches like Managed Identity.\nms.topic: how-to\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.custom:\n  - passwordless-java\n  - passwordless-js\n  - passwordless-python\n  - passwordless-dotnet\n  - spring-cloud-azure\n  - devx-track-java\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - sfi-ga-nochange\n---\n\n# Migrate an application to use passwordless connections with Azure Database for MySQL\n\nThis article explains how to migrate from traditional authentication methods to more secure, passwordless connections with Azure Database for MySQL.\n\nApplication requests to Azure Database for MySQL must be authenticated. Azure Database for MySQL provides several different ways for apps to connect securely. One of the ways is to use passwords. However, you should prioritize passwordless connections in your applications when possible.\n\n## Compare authentication options\n\nWhen the application authenticates with Azure Database for MySQL, it provides a username and password pair to connect to the database. Depending on where the identities are stored, there are two types of authentication: Microsoft Entra authentication and MySQL authentication.\n\n<a name='azure-ad-authentication'></a>\n\n### Microsoft Entra authentication\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Database for MySQL using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nUsing Microsoft Entra ID for authentication provides the following benefits:\n\n- Authentication of users across Azure Services in a uniform way.\n- Management of password policies and password rotation in a single place.\n- Multiple forms of authentication supported by Microsoft Entra ID, which can eliminate the need to store passwords.\n- Customers can manage database permissions using external (Microsoft Entra ID) groups.\n- Microsoft Entra authentication uses MySQL database users to authenticate identities at the database level.\n- Support of token-based authentication for applications connecting to Azure Database for MySQL.\n\n### MySQL authentication\n\nYou can create accounts in MySQL. If you choose to use passwords as credentials for the accounts, these credentials will be stored in the `user` table. Because these passwords are stored in MySQL, you need to manage the rotation of the passwords by yourself.\n\nAlthough it's possible to connect to Azure Database for MySQL with passwords, you should use them with caution. You must be diligent to never expose the passwords in an unsecure location. Anyone who gains access to the passwords is able to authenticate. For example, there's a risk that a malicious user can access the application if a connection string is accidentally checked into source control, sent through an unsecure email, pasted into the wrong chat, or viewed by someone who shouldn't have permission. Instead, consider updating your application to use passwordless connections.\n\n[!INCLUDE [introducing-passwordless-connections](includes/introducing-passwordless-connections.md)]\n\n## Migrate an existing application to use passwordless connections\n\nThe following steps explain how to migrate an existing application to use passwordless connections instead of a password-based solution.\n\n### 0) Prepare the working environment\n\nFirst, use the following command to set up some environment variables.\n\n```bash\nexport AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>\nexport AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>\nexport AZ_DATABASE_NAME=demo\nexport AZ_MYSQL_AD_NON_ADMIN_USERNAME=<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>\nexport AZ_MYSQL_AD_MI_USERNAME=<YOUR_AZURE_AD_MI_DISPLAY_NAME>\nexport AZ_USER_IDENTITY_NAME=<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>\nexport CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)\nexport CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)\n```\n\nReplace the placeholders with the following values, which are used throughout this article:\n\n- `<YOUR_RESOURCE_GROUP>`: The name of the resource group your resources are in.\n- `<YOUR_DATABASE_SERVER_NAME>`: The name of your MySQL server, which should be unique across Azure.\n- `<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>`: The display name of your Microsoft Entra non-admin user. Make sure the name is a valid user in your Microsoft Entra tenant.\n- `<YOUR_AZURE_AD_MI_DISPLAY_NAME>`: The display name of Microsoft Entra user for your managed identity. Make sure the name is a valid user in your Microsoft Entra tenant.\n- `<YOUR_USER_ASSIGNED_MANAGEMED_IDENTITY_NAME>`: The name of your user-assigned managed identity server, which should be unique across Azure.\n\n### 1) Configure Azure Database for MySQL\n\n<a name='11-enable-azure-ad-based-authentication'></a>\n\n#### 1.1) Enable Microsoft Entra ID-based authentication\n\nTo use Microsoft Entra ID access with Azure Database for MySQL, you should set the Microsoft Entra admin user first. Only a Microsoft Entra Admin user can create/enable users for Microsoft Entra ID-based authentication.\n\nIf you're using Azure CLI, run the following command to make sure it has sufficient permission:\n\n```bash\naz login --scope https://graph.microsoft.com/.default\n```\n\nRun the following command to the create user identity for assigning:\n\n```azurecli\naz identity create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_USER_IDENTITY_NAME\n```\n\n> [!IMPORTANT]\n> After creating the user-assigned identity, ask your *Global Administrator* or *Privileged Role Administrator* to grant the following permissions for this identity: `User.Read.All`, `GroupMember.Read.All`, and `Application.Read.ALL`. For more information, see the [Permissions](/azure/mysql/flexible-server/concepts-azure-ad-authentication#permissions) section of [Active Directory authentication](/azure/mysql/flexible-server/concepts-azure-ad-authentication).\n\nRun the following command to assign the identity to the MySQL server for creating the Microsoft Entra admin:\n\n```azurecli\naz mysql flexible-server identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --server-name $AZ_DATABASE_SERVER_NAME \\\n    --identity $AZ_USER_IDENTITY_NAME\n```\n\nThen, run following command to set the Microsoft Entra admin:\n\n```azurecli\naz mysql flexible-server ad-admin create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --server-name $AZ_DATABASE_SERVER_NAME \\\n    --display-name $CURRENT_USERNAME \\\n    --object-id $CURRENT_USER_OBJECTID \\\n    --identity $AZ_USER_IDENTITY_NAME\n```\n\nThis command will set the Microsoft Entra admin to the current signed-in user.\n\n> [!NOTE]\n> You can only create one Microsoft Entra admin per MySQL server. Selection of another one will overwrite the existing Microsoft Entra admin configured for the server.\n\n### 2) Configure Azure Database for MySQL for local development\n\n#### 2.1) Configure a firewall rule for local IP\n\nAzure Database for MySQL instances are secured by default. They have a firewall that doesn't allow any incoming connection.\n\nYou can skip this step if you're using Bash because the `flexible-server create` command already detected your local IP address and set it on MySQL server.\n\nIf you're connecting to your MySQL server from Windows Subsystem for Linux (WSL) on a Windows computer, you need to add the WSL host ID to your firewall. Obtain the IP address of your host machine by running the following command in WSL:\n\n```bash\ncat /etc/resolv.conf\n```\n\nCopy the IP address following the term `nameserver`, then use the following command to set an environment variable for the WSL IP address:\n\n```bash\nexport AZ_WSL_IP_ADDRESS=<the-copied-IP-address>\n```\n\nThen, use the following command to open the server's firewall to your WSL-based app:\n\n```azurecli\naz mysql server firewall-rule create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip-wsl \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --start-ip-address $AZ_WSL_IP_ADDRESS \\\n    --end-ip-address $AZ_WSL_IP_ADDRESS \\\n    --output tsv\n```\n\n#### 2.2) Create a MySQL non-admin user and grant permission\n\nNext, create a non-admin Microsoft Entra user and grant all permissions on the `$AZ_DATABASE_NAME` database to it. You can change the database name `$AZ_DATABASE_NAME` to fit your needs.\n\nCreate a SQL script called **create_ad_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\nexport AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)\n\ncat << EOF > create_ad_user.sql\nSET aad_auth_validate_oids_in_tenant = OFF;\nCREATE AADUSER '$AZ_MYSQL_AD_NON_ADMIN_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';\nGRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_NON_ADMIN_USERNAME'@'%';\nFLUSH privileges;\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\nmysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql\n```\n\nNow use the following command to remove the temporary SQL script file:\n\n```bash\nrm create_ad_user.sql\n```\n\n> [!NOTE]\n> You can read more detailed information about creating MySQL users in [Create users in Azure Database for MySQL](/azure/mysql/single-server/how-to-create-users).\n\n### 3) Sign in and migrate the app code to use passwordless connections\n\nFor local development, make sure you're authenticated with the same Microsoft Entra account you assigned the role to on your MySQL. You can authenticate via the Azure CLI, Visual Studio, Azure PowerShell, or other tools such as IntelliJ.\n\n[!INCLUDE [sign-in](includes/passwordless-sign-in.md)]\n\nNext, use the following steps to update your code to use passwordless connections. Although conceptually similar, each language uses different implementation details.\n\n### [Java](#tab/java)\n\n1. Inside your project, add the following reference to the `azure-identity-extensions` package. This library contains all of the entities necessary to implement passwordless connections.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure</groupId>\n       <artifactId>azure-identity-extensions</artifactId>\n       <version>1.0.0</version>\n   </dependency>\n   ```\n\n1. Enable the Azure MySQL authentication plugin in the JDBC URL. Identify the locations in your code that currently create a `java.sql.Connection` to connect to Azure Database for MySQL. Update `url` and `user` in your **application.properties** file to match the following values:\n\n   ```properties\n   url=jdbc:mysql://$AZ_DATABASE_SERVER_NAME.mysql.database.azure.com:3306/$AZ_DATABASE_NAME?serverTimezone=UTC&sslMode=REQUIRED&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin\n   user=$AZ_MYSQL_AD_NON_ADMIN_USERNAME\n   ```\n\n   > [!NOTE]\n   > If you're using the `MysqlConnectionPoolDataSource` class as the datasource in your application, be sure to remove `defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin` from the URL.\n\n   ```properties\n   url=jdbc:mysql://$AZ_DATABASE_SERVER_NAME.mysql.database.azure.com:3306/$AZ_DATABASE_NAME?serverTimezone=UTC&sslMode=REQUIRED&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin\n   user=$AZ_MYSQL_AD_NON_ADMIN_USERNAME\n   ```\n\n1. Replace the one `$AZ_DATABASE_SERVER_NAME` variable, one `$AZ_DATABASE_NAME` variable and one `$AZ_MYSQL_AD_NON_ADMIN_USERNAME` variable with the values that you configured at the beginning of this article.\n\n1. Remove the `password` from the JDBC URL.\n\n### [Spring](#tab/spring)\n\n1. Inside your project, add the following reference to the `spring-cloud-azure-starter-jdbc-mysql` package. This library contains all of the entities necessary to implement passwordless connections.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n1. Update the **application.yaml** or **application.properties** file as shown in the following example. Change the `spring.datasource.username` to the Microsoft Entra user, remove the `spring.datasource.password` property, and add `spring.datasource.azure.passwordless-enabled=true`.\n\n   ```yaml\n   spring:\n     datasource:\n       url: jdbc:mysql://${AZ_DATABASE_SERVER_NAME}.mysql.database.azure.com:3306/${AZ_DATABASE_NAME}?serverTimezone=UTC\n       username: ${AZ_MYSQL_AD_NON_ADMIN_USERNAME}\n       azure:\n         passwordless-enabled: true\n   ```\n\n---\n\n#### Run the app locally\n\nAfter making these code changes, run your application locally. The new configuration should pick up your local credentials if you're signed in to a compatible IDE or command line tool, such as the Azure CLI, Visual Studio, or IntelliJ. The roles you assigned to your local dev user in Azure will allow your app to connect to the Azure service locally.\n\n### 4) Configure the Azure hosting environment\n\nAfter your application is configured to use passwordless connections and it runs locally, the same code can authenticate to Azure services after it's deployed to Azure. For example, an application deployed to an Azure App Service instance that has a managed identity assigned can connect to Azure Storage.\n\nIn this section, you'll execute two steps to enable your application to run in an Azure hosting environment in a passwordless way:\n\n- Assign the managed identity for your Azure hosting environment.\n- Assign roles to the managed identity.\n\n> [!NOTE]\n> Azure also provides [Service Connector](/azure/service-connector/overview), which can help you connect your hosting service with PostgreSQL. With Service Connector to configure your hosting environment, you can omit the step of assigning roles to your managed identity because Service Connector will do it for you. The following section describes how to configure your Azure hosting environment in two ways: one via Service Connector and the other by configuring each hosting environment directly.\n\n> [!IMPORTANT]\n> Service Connector's commands require [Azure CLI](/cli/azure/install-azure-cli) 2.41.0 or higher.\n\n#### Assign the managed identity using the Azure portal\n\nThe following steps show you how to assign a system-assigned managed identity for various web hosting services. The managed identity can securely connect to other Azure Services using the app configurations you set up previously.\n\n##### [App Service](#tab/app-service)\n\n1. On the main overview page of your Azure App Service instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n##### [Service Connector](#tab/service-connector)\n\nWhen you use Service Connector, it can help to assign the system-assigned managed identity for your Azure hosting environment. However, Azure portal doesn't support configuring Azure Database this way, so you need to use Azure CLI to assign the identity.\n\n##### [Container Apps](#tab/container-apps)\n\n1. On the main overview page of your Azure Container Apps instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/container-apps-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of Container App resource showing System assigned tab with Status field highlighted.\" lightbox=\"media/passwordless-connections/container-apps-identity.png\":::\n\n##### [Azure Spring Apps](#tab/azure-spring-apps)\n\n1. On the main overview page of your Azure Spring Apps instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/spring-apps-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of App resource with System assigned tab showing and Status field highlighted.\" lightbox=\"media/passwordless-connections/spring-apps-identity.png\":::\n\n##### [Virtual Machines](#tab/virtual-machines)\n\n1. On the main overview page of your virtual machine, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/virtual-machine-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of Virtual machine resource with System assigned tab showing and Status field highlighted.\" lightbox=\"media/passwordless-connections/virtual-machine-identity.png\":::\n\n##### [AKS](#tab/aks)\n\nAn Azure Kubernetes Service (AKS) cluster requires an identity to access Azure resources like load balancers and managed disks. This identity can be either a managed identity or a service principal. By default, when you create an AKS cluster, a system-assigned managed identity is automatically created.\n\n---\n\nYou can also assign managed identity on an Azure hosting environment by using the Azure CLI.\n\n##### [App Service](#tab/app-service)\n\nYou can assign a managed identity to an Azure App Service instance with the [az webapp identity assign](/cli/azure/webapp/identity) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az webapp identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [Service Connector](#tab/service-connector)\n\nYou can use Service Connector to create a connection between an Azure compute hosting environment and a target service by using the Azure CLI. Service Connector currently supports the following compute services:\n\n- Azure App Service\n- Azure Spring Apps\n- Azure Container Apps\n\nBefore starting, use the following command to assign a user-assigned managed identity for Microsoft Entra authentication. For more information, see [Set up Microsoft Entra authentication for Azure Database for MySQL - Flexible Server](/azure/mysql/flexible-server/how-to-azure-ad).\n\n```azurecli\nexport AZ_IDENTITY_RESOURCE_ID=$(az identity create \\\n    --name <user-identity-name> \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --query id \\\n    --output tsv)\n```\n\n> [!IMPORTANT]\n> After creating the user-assigned identity, ask your *Global Administrator* or *Privileged Role Administrator* to grant the following permissions for this identity: `User.Read.All`, `GroupMember.Read.All`, and `Application.Read.ALL`. For more information, see the [Permissions](/azure/mysql/flexible-server/concepts-azure-ad-authentication#permissions) section of [Active Directory authentication](/azure/mysql/flexible-server/concepts-azure-ad-authentication).\n\nThen, install the [Service Connector](/azure/service-connector/overview) passwordless extension for the Azure CLI:\n\n```azurecli\naz extension add --name serviceconnector-passwordless --upgrade\n```\n\nIf you're using Azure App Service, use the `az webapp connection` command, as shown in the following example:\n\n```azurecli\naz webapp connection create mysql-flexible \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <app-service-name>\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity mysql-identity-id=$AZ_IDENTITY_RESOURCE_ID\n```\n\nIf you're using Azure Spring Apps, use `the az spring connection` command, as shown in the following example:\n\n```azurecli\naz spring connection create mysql-flexible \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --service <service-name> \\\n    --app <service-instance-name> \\\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity mysql-identity-id=$AZ_IDENTITY_RESOURCE_ID\n```\n\nIf you're using Azure Container Apps, use the `az containerapp connection` command, as shown in the following example:\n\n```azurecli\naz containerapp connection create mysql-flexible \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <app-service-name>\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity mysql-identity-id=$AZ_IDENTITY_RESOURCE_ID\n```\n\n##### [Container Apps](#tab/container-apps)\n\nYou can assign a managed identity to an Azure Container Apps instance with the [az containerapp identity assign](/cli/azure/containerapp/identity) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az containerapp identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [Azure Spring Apps](#tab/azure-spring-apps)\n\nYou can assign a managed identity to an Azure Spring Apps instance as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az spring app identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --service <service-name> \\\n    --query identity.principalId \\\n    --output tsv)\n```\n\n##### [Virtual Machines](#tab/virtual-machines)\n\nYou can assign a managed identity to a virtual machine with the [az vm identity assign](/cli/azure/vm/identity) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az vm identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [AKS](#tab/aks)\n\nYou can assign a managed identity to an Azure Kubernetes Service (AKS) instance with the [az aks update](/cli/azure/aks) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az aks update \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <AKS-cluster-name> \\\n    --enable-managed-identity \\\n    --query identityProfile.kubeletidentity.objectId \\\n    --output tsv)\n```\n\n---\n\n#### Assign roles to the managed identity\n\nNext, grant permissions to the managed identity you assigned to access your MySQL instance.\n\nThese steps will create a Microsoft Entra user for the managed identity and grant all permissions for the database `$AZ_DATABASE_NAME` to it. You can change the database name `$AZ_DATABASE_NAME` to fit your needs.\n\nFirst, create a SQL script called **create_ad_user.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\nexport AZ_MYSQL_AD_MI_USERID=$(az ad sp show --id $AZ_MI_OBJECT_ID --query appId --output tsv)\n\ncat << EOF > create_ad_user.sql\nSET aad_auth_validate_oids_in_tenant = OFF;\nCREATE AADUSER '$AZ_MYSQL_AD_MI_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_MI_USERID';\nGRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_MI_USERNAME'@'%';\nFLUSH privileges;\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\nmysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql\n```\n\nNow use the following command to remove the temporary SQL script file:\n\n```bash\nrm create_ad_user.sql\n```\n\n#### Test the app\n\nBefore deploying the app to the hosting environment, you need to make one more change to the code because the application is going to connect to MySQL using the user created for the managed identity.\n\n### [Java](#tab/java)\n\nUpdate your code to use the user created for the managed identity:\n\n```java\nproperties.put(\"user\", \"$AZ_MYSQL_AD_MI_USERNAME\");\n```\n\n### [Spring](#tab/spring)\n\nUpdate the **application.yaml** or **application.properties** file. Change the `spring.datasource.username` to the user created for the managed identity.\n\n```yaml\nspring:\n  datasource:\n    url: jdbc:mysql://${AZ_DATABASE_SERVER_NAME}.mysql.database.azure.com:3306/${AZ_DATABASE_NAME}?serverTimezone=UTC\n    username: ${AZ_MYSQL_AD_MI_USERNAME}\n    azure:\n      passwordless-enabled: true​\n```\n\n---\n\nAfter making these code changes, you can build and redeploy the application. Then, browse to your hosted application in the browser. Your app should be able to connect to the MySQL database successfully. Keep in mind that it may take several minutes for the role assignments to propagate through your Azure environment. Your application is now configured to run both locally and in a production environment without the developers having to manage secrets in the application itself.\n\n## Next steps\n\nIn this tutorial, you learned how to migrate an application to passwordless connections.\n\nYou can read the following resources to explore the concepts discussed in this article in more depth:\n\n- [Authorize access to blob data with managed identities for Azure resources](/azure/storage/blobs/authorize-managed-identity).\n- [Authorize access to blobs using Microsoft Entra ID](/azure/storage/blobs/authorize-access-azure-active-directory)\n"
  },
  {
    "path": "articles/java/spring-framework/migrate-postgresql-to-passwordless-connection.md",
    "content": "---\ntitle: Migrate an application to use passwordless connections with Azure Database for PostgreSQL\ndescription: Learn how to migrate existing applications using Azure Database for PostgreSQL away from authentication patterns such as passwords to more secure approaches like Managed Identity.\nms.topic: how-to\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.custom: passwordless-java, passwordless-js, passwordless-python, passwordless-dotnet, spring-cloud-azure, devx-track-java, devx-track-azurecli, devx-track-extended-java\n---\n\n# Migrate an application to use passwordless connections with Azure Database for PostgreSQL\n\nThis article explains how to migrate from traditional authentication methods to more secure, passwordless connections with Azure Database for PostgreSQL.\n\nApplication requests to Azure Database for PostgreSQL must be authenticated. Azure Database for PostgreSQL provides several different ways for apps to connect securely. One of the ways is to use passwords. However, you should prioritize passwordless connections in your applications when possible.\n\n## Compare authentication options\n\nWhen the application authenticates with Azure Database for PostgreSQL, it provides a username and password pair to connect the database. Depending on where the identities are stored, there are two types of authentication: Microsoft Entra authentication and PostgreSQL authentication.\n\n<a name='azure-ad-authentication'></a>\n\n### Microsoft Entra authentication\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure Database for PostgreSQL using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nUsing Microsoft Entra ID for authentication provides the following benefits:\n\n- Authentication of users across Azure Services in a uniform way.\n- Management of password policies and password rotation in a single place.\n- Multiple forms of authentication supported by Microsoft Entra ID, which can eliminate the need to store passwords.\n- Customers can manage database permissions using external (Microsoft Entra ID) groups.\n- Microsoft Entra authentication uses PostgreSQL database users to authenticate identities at the database level.\n- Support of token-based authentication for applications connecting to Azure Database for PostgreSQL.\n\n### PostgreSQL authentication\n\nYou can create accounts in PostgreSQL. If you choose to use passwords as credentials for the accounts, these credentials will be stored in the `user` table. Because these passwords are stored in PostgreSQL, you need to manage the rotation of the passwords by yourself.\n\nAlthough it's possible to connect to Azure Database for PostgreSQL with passwords, you should use them with caution. You must be diligent to never expose the passwords in an unsecure location. Anyone who gains access to the passwords is able to authenticate. For example, there's a risk that a malicious user can access the application if a connection string is accidentally checked into source control, sent through an unsecure email, pasted into the wrong chat, or viewed by someone who shouldn't have permission. Instead, consider updating your application to use passwordless connections.\n\n[!INCLUDE [introducing-passwordless-connections](includes/introducing-passwordless-connections.md)]\n\n## Migrate an existing application to use passwordless connections\n\nThe following steps explain how to migrate an existing application to use passwordless connections instead of a password-based solution.\n\n### 0) Prepare the working environment\n\nFirst, use the following command to set up some environment variables.\n\n```bash\nexport AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>\nexport AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>\nexport AZ_DATABASE_NAME=demo\nexport AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME=<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>\nexport AZ_LOCAL_IP_ADDRESS=<YOUR_LOCAL_IP_ADDRESS>\nexport CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)\n```\n\nReplace the placeholders with the following values, which are used throughout this article:\n\n- `<YOUR_RESOURCE_GROUP>`: The name of the resource group your resources are in.\n- `<YOUR_DATABASE_SERVER_NAME>`: The name of your PostgreSQL server. It should be unique across Azure.\n- `<YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>`: The display name of your Microsoft Entra non-admin user. Make sure the name is a valid user in your Microsoft Entra tenant.\n- `<YOUR_LOCAL_IP_ADDRESS>`: The IP address of your local computer, from which you'll run your Spring Boot application. One convenient way to find it is to open [whatismyip.akamai.com](http://whatismyip.akamai.com).\n\n### 1) Configure Azure Database for PostgreSQL\n\n<a name='11-enable-azure-ad-based-authentication'></a>\n\n#### 1.1) Enable Microsoft Entra ID-based authentication\n\nTo use Microsoft Entra ID access with Azure Database for PostgreSQL, you should set the Microsoft Entra admin user first. Only a Microsoft Entra Admin user can create/enable users for Microsoft Entra ID-based authentication.\n\nTo set up a Microsoft Entra administrator after creating the server, follow the steps in [Manage Microsoft Entra roles in Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/how-to-manage-azure-ad-users).\n\n> [!NOTE]\n> PostgreSQL Flexible Server can create multiple Microsoft Entra administrators.\n\n### 2) Configure Azure Database for PostgreSQL for local development\n\n#### 2.1) Configure a firewall rule for local IP\n\nAzure Database for PostgreSQL instances are secured by default. They have a firewall that doesn't allow any incoming connection. To be able to use your database, you need to add a firewall rule that will allow the local IP address to access the database server.\n\nBecause you configured your local IP address at the beginning of this article, you can open the server's firewall by running the following command:\n\n```azurecli\naz postgres flexible-server firewall-rule create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_SERVER_NAME \\\n    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \\\n    --start-ip-address $AZ_LOCAL_IP_ADDRESS \\\n    --end-ip-address $AZ_LOCAL_IP_ADDRESS \\\n    --output tsv\n```\n\nIf you're connecting to your PostgreSQL server from Windows Subsystem for Linux (WSL) on a Windows computer, you need to add the WSL host ID to your firewall.\n\nObtain the IP address of your host machine by running the following command in WSL:\n\n```bash\ncat /etc/resolv.conf\n```\n\nCopy the IP address following the term `nameserver`, then use the following command to set an environment variable for the WSL IP Address:\n\n```bash\nexport AZ_WSL_IP_ADDRESS=<the-copied-IP-address>\n```\n\nThen, use the following command to open the server's firewall to your WSL-based app:\n\n```azurecli\naz postgres flexible-server firewall-rule create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name $AZ_DATABASE_SERVER_NAME \\\n    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \\\n    --start-ip-address $AZ_WSL_IP_ADDRESS \\\n    --end-ip-address $AZ_WSL_IP_ADDRESS \\\n    --output tsv\n```\n\n#### 2.2) Create a PostgreSQL non-admin user and grant permission\n\nNext, create a non-admin Microsoft Entra user and grant all permissions on the `$AZ_DATABASE_NAME` database to it. You can change the database name `$AZ_DATABASE_NAME` to fit your needs.\n\nCreate a SQL script called **create_ad_user_local.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\ncat << EOF > create_ad_user_local.sql\nselect * from pgaadauth_create_principal('$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME', false, false);\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\npsql \"host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require\" < create_ad_user_local.sql\n```\n\nNow use the following command to remove the temporary SQL script file:\n\n```bash\nrm create_ad_user_local.sql\n```\n\n> [!NOTE]\n> You can read more detailed information about creating PostgreSQL users in [Create users in Azure Database for PostgreSQL](/azure/PostgreSQL/single-server/how-to-create-users).\n\n### 3) Sign in and migrate the app code to use passwordless connections\n\nFor local development, make sure you're authenticated with the same Microsoft Entra account you assigned the role to on your PostgreSQL. You can authenticate via the Azure CLI, Visual Studio, Azure PowerShell, or other tools such as IntelliJ.\n\n[!INCLUDE [sign-in](includes/passwordless-sign-in.md)]\n\nNext, use the following steps to update your code to use passwordless connections. Although conceptually similar, each language uses different implementation details.\n\n### [Java](#tab/java)\n\n1. Inside your project, add the following reference to the `azure-identity-extensions` package. This library contains all of the entities necessary to implement passwordless connections.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure</groupId>\n       <artifactId>azure-identity-extensions</artifactId>\n       <version>1.0.0</version>\n   </dependency>\n   ```\n\n1. Enable the Azure PostgreSQL authentication plugin in JDBC URL. Identify the locations in your code that currently create a `java.sql.Connection` to connect to Azure Database for PostgreSQL. Update `url` and `user` in your **application.properties** file to match the following values:\n\n   ```properties\n   url=jdbc:postgresql://$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com:5432/$AZ_DATABASE_NAME?sslmode=require&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\n   user=$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME\n   ```\n\n1. Replace the `$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME` and the two `$AZ_DATABASE_SERVER_NAME` variables with the value that you configured at the beginning of this article.\n\n### [Spring](#tab/spring)\n\n1. Inside your project, add the following reference to the `spring-cloud-azure-starter-jdbc-postgresql` package. This library contains all of the entities necessary to implement passwordless connections.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-jdbc-postgresql</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n1. Update the **application.yaml** or **application.properties** file as shown in the following example. Change the `spring.datasource.username` to the Microsoft Entra user, remove the `spring.datasource.password` property, and add `spring.datasource.azure.passwordless-enabled=true`.\n\n   ```yaml\n   spring:\n     datasource:\n       url: jdbc:postgresql://${AZ_DATABASE_SERVER_NAME}.postgres.database.azure.com:5432/$AZ_DATABASE_NAME?sslmode=require\n       username: ${AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME}\n       azure:\n         passwordless-enabled: true\n   ```\n\n---\n\n#### Run the app locally\n\nAfter making these code changes, run your application locally. The new configuration should pick up your local credentials if you're signed in to a compatible IDE or command line tool, such as the Azure CLI, Visual Studio, or IntelliJ. The roles you assigned to your local dev user in Azure will allow your app to connect to the Azure service locally.\n\n### 4) Configure the Azure hosting environment\n\nAfter your application is configured to use passwordless connections and it runs locally, the same code can authenticate to Azure services after it's deployed to Azure. For example, an application deployed to an Azure App Service instance that has a managed identity assigned can connect to Azure Storage.\n\nIn this section, you'll execute two steps to enable your application to run in an Azure hosting environment in a passwordless way:\n\n- Assign the managed identity for your Azure hosting environment.\n- Assign roles to the managed identity.\n\n> [!NOTE]\n> Azure also provides [Service Connector](/azure/service-connector/overview), which can help you connect your hosting service with PostgreSQL. With Service Connector to configure your hosting environment, you can omit the step of assigning roles to your managed identity because Service Connector will do it for you. The following section describes how to configure your Azure hosting environment in two ways: one via Service Connector and the other by configuring each hosting environment directly.\n\n> [!IMPORTANT]\n> Service Connector's commands require [Azure CLI](/cli/azure/install-azure-cli) 2.41.0 or higher.\n\n#### Assign the managed identity using the Azure portal\n\nThe following steps show you how to assign a system-assigned managed identity for various web hosting services. The managed identity can securely connect to other Azure Services using the app configurations you set up previously.\n\n##### [App Service](#tab/app-service)\n\n1. On the main overview page of your Azure App Service instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n##### [Service Connector](#tab/service-connector)\n\nWhen you use Service Connector, it can help to assign the system-assigned managed identity for your Azure hosting environment. However, Azure portal doesn't support configuring Azure Database this way, so you need to use Azure CLI to assign the identity.\n\n##### [Container Apps](#tab/container-apps)\n\n1. On the main overview page of your Azure Container Apps instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/container-apps-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of Container App resource showing System assigned tab with Status field highlighted.\" lightbox=\"media/passwordless-connections/container-apps-identity.png\":::\n\n##### [Azure Spring Apps](#tab/azure-spring-apps)\n\n1. On the main overview page of your Azure Spring Apps instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/spring-apps-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of App resource with System assigned tab showing and Status field highlighted.\" lightbox=\"media/passwordless-connections/spring-apps-identity.png\":::\n\n##### [Virtual Machines](#tab/virtual-machines)\n\n1. On the main overview page of your virtual machine, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/virtual-machine-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of Virtual machine resource with System assigned tab showing and Status field highlighted.\" lightbox=\"media/passwordless-connections/virtual-machine-identity.png\":::\n\n##### [AKS](#tab/aks)\n\nAn Azure Kubernetes Service (AKS) cluster requires an identity to access Azure resources like load balancers and managed disks. This identity can be either a managed identity or a service principal. By default, when you create an AKS cluster, a system-assigned managed identity is automatically created.\n\n---\n\nYou can also assign managed identity on an Azure hosting environment by using the Azure CLI.\n\n##### [App Service](#tab/app-service)\n\nYou can assign a managed identity to an Azure App Service instance with the [az webapp identity assign](/cli/azure/webapp/identity) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az webapp identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [Service Connector](#tab/service-connector)\n\nYou can use Service Connector to create a connection between an Azure compute hosting environment and a target service by using the Azure CLI. Service Connector currently supports the following compute services:\n\n- Azure App Service\n- Azure Spring Apps\n- Azure Container Apps\n\nFirst, install the [Service Connector](/azure/service-connector/overview) passwordless extension for the Azure CLI:\n\n```azurecli\naz extension add --name serviceconnector-passwordless --upgrade\n```\n\nIf you're using Azure App Service, use the `az webapp connection` command, as shown in the following example:\n\n```azurecli\naz webapp connection create postgres-flexible \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <app-service-name>\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity\n```\n\nIf you're using Azure Spring Apps, use `the az spring connection` command, as shown in the following example:\n\n```azurecli\naz spring connection create postgres-flexible \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --service <service-name> \\\n    --app <service-instance-name> \\\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity\n```\n\nIf you're using Azure Container Apps, use the `az containerapp connection` command, as shown in the following example:\n\n```azurecli\naz containerapp connection create postgres-flexible \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <app-service-name>\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity\n```\n\n##### [Container Apps](#tab/container-apps)\n\nYou can assign a managed identity to an Azure Container Apps instance with the [az containerapp identity assign](/cli/azure/containerapp/identity) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az containerapp identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [Azure Spring Apps](#tab/azure-spring-apps)\n\nYou can assign a managed identity to an Azure Spring Apps instance as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az spring app identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --service <service-name> \\\n    --query identity.principalId \\\n    --output tsv)\n```\n\n##### [Virtual Machines](#tab/virtual-machines)\n\nYou can assign a managed identity to a virtual machine with the [az vm identity assign](/cli/azure/vm/identity) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az vm identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [AKS](#tab/aks)\n\nYou can assign a managed identity to an Azure Kubernetes Service (AKS) instance with the [az aks update](/cli/azure/aks) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az aks update \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <AKS-cluster-name> \\\n    --enable-managed-identity \\\n    --query identityProfile.kubeletidentity.objectId \\\n    --output tsv)\n```\n\n---\n\n#### Assign roles to the managed identity\n\nNext, grant permissions to the managed identity you assigned to access your PostgreSQL instance.\n\n##### [Service Connector](#tab/assign-role-service-connector)\n\nIf you connected your services using Service Connector, the previous step's commands already assigned the role, so you can skip this step.\n\n##### [Azure CLI](#tab/assign-role-azure-cli)\n\nThe following steps will create a Microsoft Entra user for the managed identity and grant all permissions for the database `$AZ_DATABASE_NAME` to it. You can change the database name `$AZ_DATABASE_NAME` to fit your needs.\n\nFirst, create a SQL script called **create_ad_user_mi.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n```bash\nexport AZ_POSTGRESQL_AD_MI_USERNAME=$(az ad sp show \\\n    --id $AZ_MI_OBJECT_ID \\\n    --query displayName \\\n    --output tsv)\n\ncat << EOF > create_ad_user_mi.sql\nselect * from pgaadauth_create_principal_with_oid('$AZ_POSTGRESQL_AD_MI_USERNAME', '$AZ_MI_OBJECT_ID', 'service', false, false);\nEOF\n```\n\nThen, use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n```bash\npsql \"host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require\" < create_ad_user_mi.sql\n```\n\nNow use the following command to remove the temporary SQL script file:\n\n```bash\nrm create_ad_user_mi.sql\n```\n\n---\n\n#### Test the app\n\nBefore deploying the app to the hosting environment, you need to make one more change to the code because the application is going to connect to PostgreSQL using the user created for the managed identity.\n\n### [Java](#tab/java)\n\nUpdate your code to use the user created for the managed identity:\n\n> [!NOTE]\n> If you used the Service Connector command, skip this step.\n\n```java\nproperties.put(\"user\", \"$AZ_POSTGRESQL_AD_MI_USERNAME\");\n```\n\n### [Spring](#tab/spring)\n\nUpdate the **application.yaml** or **application.properties** file. Change the `spring.datasource.username` to the user created for the managed identity.\n\n```yaml\nspring:\n  datasource:\n    url: jdbc:postgresql://${AZ_DATABASE_SERVER_NAME}.postgres.database.azure.com:5432/$AZ_DATABASE_NAME?sslmode=require\n    username: ${AZ_POSTGRESQL_AD_MI_USERNAME}\n    azure:\n      passwordless-enabled: true\n```\n\nIf you used the Service Connector command, remove the properties `spring.datasource.url` and `spring.datasource.username`. You only need to add the following setting:\n\n```yaml\nspring:\n  datasource:\n    azure:\n      passwordless-enabled: true\n```\n\n---\n\nAfter making these code changes, you can build and redeploy the application. Then, browse to your hosted application in the browser. Your app should be able to connect to the PostgreSQL database successfully. Keep in mind that it may take several minutes for the role assignments to propagate through your Azure environment. Your application is now configured to run both locally and in a production environment without the developers having to manage secrets in the application itself.\n\n## Next steps\n\nIn this tutorial, you learned how to migrate an application to passwordless connections.\n\nYou can read the following resources to explore the concepts discussed in this article in more depth:\n\n- [Authorize access to blob data with managed identities for Azure resources](/azure/storage/blobs/authorize-managed-identity).\n- [Authorize access to blobs using Microsoft Entra ID](/azure/storage/blobs/authorize-access-azure-active-directory)\n"
  },
  {
    "path": "articles/java/spring-framework/migrate-sql-database-to-passwordless-connection.md",
    "content": "---\ntitle: Migrate a Java application to use passwordless connections with Azure SQL Database\ndescription: Learn how to migrate a Java application to use passwordless connections with Azure SQL Database.\nms.topic: how-to\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.custom:\n  - passwordless-java\n  - spring-cloud-azure\n  - devx-track-java\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Migrate a Java application to use passwordless connections with Azure SQL Database\n\nThis article explains how to migrate from traditional authentication methods to more secure, passwordless connections with Azure SQL Database.\n\nApplication requests to Azure SQL Database must be authenticated. Azure SQL Database provides several different ways for apps to connect securely. One of the ways is to use passwords. However, you should prioritize passwordless connections in your applications when possible.\n\n## Compare authentication options\n\nWhen the application authenticates with Azure SQL Database, it provides a username and password pair to connect to the database. Depending on where the identities are stored, there are two types of authentication: Microsoft Entra authentication and Azure SQL Database authentication.\n\n<a name='azure-ad-authentication'></a>\n\n### Microsoft Entra authentication\n\nMicrosoft Entra authentication is a mechanism for connecting to Azure SQL Database using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\nUsing Microsoft Entra ID for authentication provides the following benefits:\n\n- Authentication of users across Azure Services in a uniform way.\n- Management of password policies and password rotation in a single place.\n- Multiple forms of authentication supported by Microsoft Entra ID, which can eliminate the need to store passwords.\n- Customers can manage database permissions using external (Microsoft Entra ID) groups.\n- Microsoft Entra authentication uses Azure SQL database users to authenticate identities at the database level.\n- Support of token-based authentication for applications connecting to Azure SQL Database.\n\n### Azure SQL Database authentication\n\nYou can create accounts in Azure SQL Database. If you choose to use passwords as credentials for the accounts, these credentials will be stored in the `sys.database_principals` table. Because these passwords are stored in Azure SQL Database, you need to manage the rotation of the passwords by yourself.\n\nAlthough it's possible to connect to Azure SQL Database with passwords, you should use them with caution. You must be diligent to never expose the passwords in an unsecure location. Anyone who gains access to the passwords is able to authenticate. For example, there's a risk that a malicious user can access the application if a connection string is accidentally checked into source control, sent through an unsecure email, pasted into the wrong chat, or viewed by someone who shouldn't have permission. Instead, consider updating your application to use passwordless connections.\n\n[!INCLUDE [introducing-passwordless-connections](includes/introducing-passwordless-connections.md)]\n\n> [!NOTE]\n> Since the JDBC driver for Azure SQL Database doesn't support passwordless connections from local environments yet, this article will focus only on applications deployed to Azure hosting environments and how to migrate them to use passwordless connections.\n\n## Migrate an existing application to use passwordless connections\n\nThe following steps explain how to migrate an existing application to use passwordless connections instead of a password-based solution.\n\n### 0) Prepare the working environment\n\nFirst, use the following command to set up some environment variables.\n\n```bash\nexport AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>\nexport AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>\nexport AZ_DATABASE_NAME=demo\nexport CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)\nexport CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)\n```\n\nReplace the placeholders with the following values, which are used throughout this article:\n\n- `<YOUR_RESOURCE_GROUP>`: The name of the resource group your resources are in.\n- `<YOUR_DATABASE_SERVER_NAME>`: The name of your Azure SQL Database server. It should be unique across Azure.\n\n### 1) Configure Azure SQL Database\n\n<a name='11-enable-azure-ad-based-authentication'></a>\n\n#### 1.1) Enable Microsoft Entra ID-based authentication\n\nTo use Microsoft Entra ID access with Azure SQL Database, you should set the Microsoft Entra admin user first. Only a Microsoft Entra Admin user can create/enable users for Microsoft Entra ID-based authentication.\n\nIf you're using Azure CLI, run the following command to make sure it has sufficient permission:\n\n```bash\naz login --scope https://graph.microsoft.com/.default\n```\n\nThen, run following command to set the Microsoft Entra admin:\n\n```azurecli\naz sql server ad-admin create \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --display-name $CURRENT_USERNAME \\\n    --object-id $CURRENT_USER_OBJECTID\n```\n\nThis command will set the Microsoft Entra admin to the current signed-in user.\n\n> [!NOTE]\n> You can only create one Microsoft Entra admin per Azure SQL Database server. Selection of another one will overwrite the existing Microsoft Entra admin configured for the server.\n\n### 2) Migrate the app code to use passwordless connections\n\nNext, use the following steps to update your code to use passwordless connections. Although conceptually similar, each language uses different implementation details.\n\n#### [Java](#tab/java)\n\n1. Inside your project, add the following reference to the `azure-identity` package. This library contains all of the entities necessary to implement passwordless connections.\n\n   ```xml\n   <dependency>\n        <groupId>com.azure</groupId>\n        <artifactId>azure-identity</artifactId>\n        <version>1.5.4</version>\n   </dependency>\n   ```\n\n1. Enable the Microsoft Entra managed identity authentication in the JDBC URL.v Identify the locations in your code that currently create a `java.sql.Connection` to connect to Azure SQL Database. Update your code to match the following example:\n\n   ```java\n   String url = \"jdbc:sqlserver://$AZ_DATABASE_SERVER_NAME.database.windows.net:1433;databaseName=$AZ_DATABASE_NAME;authentication=ActiveDirectoryMSI;\"   \n   Connection con = DriverManager.getConnection(url);\n   ```\n\n1. Replace the two `$AZ_DATABASE_SERVER_NAME` variables and one `$AZ_DATABASE_NAME` variable with the values that you configured at the beginning of this article.\n\n1. Remove the `user` and `password` from the JDBC URL.\n\n#### [Spring](#tab/spring)\n\n1. Inside your project, add a reference to the `spring-cloud-azure-starter` package. This library contains all of the entities necessary to implement passwordless connections.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n1. Update the **application.yaml** or **application.properties** file as shown in the following example. Remove `spring.datasource.username` and `spring.datasource.password` properties.\n\n   ```yaml\n   spring:\n     datasource:\n       url: jdbc:sqlserver://${AZ_DATABASE_SERVER_NAME}.database.windows.net:1433;databaseName=${AZ_DATABASE_NAME};authentication=ActiveDirectoryMSI;\n   ```\n\n---\n\n### 3) Configure the Azure hosting environment\n\nAfter your application is configured to use passwordless connections, the same code can authenticate to Azure services after it's deployed to Azure. For example, an application deployed to an Azure App Service instance that has a managed identity assigned can connect to Azure Storage.\n\nIn this section, you'll execute two steps to enable your application to run in an Azure hosting environment in a passwordless way:\n\n- Assign the managed identity for your Azure hosting environment.\n- Assign roles to the managed identity.\n\n> [!NOTE]\n> Azure also provides [Service Connector](/azure/service-connector/overview), which can help you connect your hosting service with SQL server. With Service Connector to configure your hosting environment, you can omit the step of assigning roles to your managed identity because Service Connector will do it for you. The following section describes how to configure your Azure hosting environment in two ways: one via Service Connector and the other by configuring each hosting environment directly.\n\n> [!IMPORTANT]\n> Service Connector's commands require [Azure CLI](/cli/azure/install-azure-cli) 2.41.0 or higher.\n\n#### Assign the managed identity using the Azure portal\n\nThe following steps show you how to assign a system-assigned managed identity for various web hosting services. The managed identity can securely connect to other Azure services using the app configurations you set up previously.\n\n##### [App Service](#tab/app-service)\n\n1. On the main overview page of your Azure App Service instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n##### [Service Connector](#tab/service-connector)\n\nWhen you use Service Connector, it can help to assign the system-assigned managed identity for your Azure hosting environment. However, Azure portal doesn’t support configuring Azure Database this way, so you need to use Azure CLI to assign the identity.\n\n##### [Container Apps](#tab/container-apps)\n\n1. On the main overview page of your Azure Container App instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/container-apps-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of Container App resource showing System assigned tab with Status field highlighted.\" lightbox=\"media/passwordless-connections/container-apps-identity.png\":::\n\n##### [Azure Spring Apps](#tab/azure-spring-apps)\n\n1. On the main overview page of your Azure Spring Apps instance, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/spring-apps-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of App resource with System assigned tab showing and Status field highlighted.\" lightbox=\"media/passwordless-connections/spring-apps-identity.png\":::\n\n##### [Virtual Machines](#tab/virtual-machines)\n\n1. On the main overview page of your virtual machine, select **Identity** from the navigation pane.\n\n1. On the **System assigned** tab, make sure to set the **Status** field to **on**. A system assigned identity is managed by Azure internally and handles administrative tasks for you. The details and IDs of the identity are never exposed in your code.\n\n   :::image type=\"content\" source=\"media/passwordless-connections/virtual-machine-identity.png\" alt-text=\"Screenshot of Azure portal Identity page of Virtual machine resource with System assigned tab showing and Status field highlighted.\" lightbox=\"media/passwordless-connections/virtual-machine-identity.png\":::\n\n##### [AKS](#tab/aks)\n\nAn Azure Kubernetes Service (AKS) cluster requires an identity to access Azure resources like load balancers and managed disks. This identity can be either a managed identity or a service principal. By default, when you create an AKS cluster, a system-assigned managed identity is automatically created.\n\n---\n\nYou can also assign managed identity on an Azure hosting environment using the Azure CLI.\n\n##### [App Service](#tab/app-service)\n\nYou can assign a managed identity to an Azure App Service instance with the [az webapp identity assign](/cli/azure/webapp/identity) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az webapp identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [Service Connector](#tab/service-connector)\n\nYou can use Service Connector to create a connection between an Azure compute hosting environment and a target service by using the Azure CLI. Service Connector currently supports the following compute services:\n\n- Azure App Service\n- Azure Spring Apps\n- Azure Container Apps\n\nFirst, install the [Service Connector](/azure/service-connector/overview) passwordless extension for the Azure CLI:\n\n```azurecli\naz extension add --name serviceconnector-passwordless --upgrade\n```\n\nIf you're using Azure App Service, use the `az webapp connection` command, as shown in the following example:\n\n```azurecli\naz webapp connection create sql \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <app-service-name>\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity\n```\n\nIf you're using Azure Spring Apps, use `the az spring connection` command, as shown in the following example:\n\n```azurecli\naz spring connection create sql \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --service <service-name> \\\n    --app <service-instance-name> \\\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity\n```\n\nIf you're using Azure Container Apps, use the `az containerapp connection` command, as shown in the following example:\n\n```azurecli\naz containerapp connection create sql \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <app-service-name>\n    --target-resource-group $AZ_RESOURCE_GROUP \\\n    --server $AZ_DATABASE_SERVER_NAME \\\n    --database $AZ_DATABASE_NAME \\\n    --system-identity\n```\n\n##### [Container Apps](#tab/container-apps)\n\nYou can assign a managed identity to an Azure Container Apps instance with the [az containerapp identity assign](/cli/azure/containerapp/identity) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az containerapp identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [Azure Spring Apps](#tab/azure-spring-apps)\n\nYou can assign a managed identity to an Azure Spring Apps instance as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az spring app identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --service <service-name> \\\n    --query identity.principalId \\\n    --output tsv)\n```\n\n##### [Virtual Machines](#tab/virtual-machines)\n\nYou can assign a managed identity to a virtual machine with the [az vm identity assign](/cli/azure/vm/identity) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az vm identity assign \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <service-instance-name> \\\n    --query principalId \\\n    --output tsv)\n```\n\n##### [AKS](#tab/aks)\n\nYou can assign a managed identity to an Azure Kubernetes Service (AKS) instance with the [az aks update](/cli/azure/aks) command, as shown in the following example:\n\n```azurecli\nexport AZ_MI_OBJECT_ID=$(az aks update \\\n    --resource-group $AZ_RESOURCE_GROUP \\\n    --name <AKS-cluster-name> \\\n    --enable-managed-identity \\\n    --query identityProfile.kubeletidentity.objectId \\\n    --output tsv)\n```\n\n---\n\n#### Assign roles to the managed identity\n\nNext, grant permissions to the managed identity you created to access your SQL database.\n\n##### [Service Connector](#tab/assign-role-service-connector)\n\nIf you connected your services using Service Connector, the previous step's commands already assigned the role, so you can skip this step.\n\n##### [Azure CLI](#tab/assign-role-azure-cli)\n\nThis step will create a database user for the managed identity and grant read and write permissions to it.\n\nThe following command will retrieve the display name of the managed identity and construct the commands to create a user for the managed identity and grant permissions:\n\n```bash\nexport AZ_DATABASE_AD_MI_USERNAME=$(az ad sp show \\\n    --id $AZ_MI_OBJECT_ID \\\n    --query displayName \\\n    --output tsv)\ncat << EOF\nCREATE USER \"$AZ_DATABASE_AD_MI_USERNAME\" FROM EXTERNAL PROVIDER;\nALTER ROLE db_datareader ADD MEMBER \"$AZ_DATABASE_AD_MI_USERNAME\";\nALTER ROLE db_datawriter ADD MEMBER \"$AZ_DATABASE_AD_MI_USERNAME\";\nGO\nEOF\n```\n\nCopy the output of this command, then go to the Azure portal and find the SQL database. Sign in to the query editor as the Microsoft Entra admin user, as shown in the following screenshot.\n\n:::image type=\"content\" source=\"media/migrate-sql-database-to-passwordless-connection/sql-database-query-editor.jpg\" alt-text=\"Screenshot of Azure portal showing the SQL Database query editor.\":::\n\nPast the output of last command into the query editor, and run the SQL commands, as shown in the following screenshot.\n\n:::image type=\"content\" source=\"media/migrate-sql-database-to-passwordless-connection/sql-database-create-user.jpg\" alt-text=\"Screenshot of Azure portal showing SQL Database query editor with query to create user and add roles.\":::\n\n---\n\n#### Test the app\n\nAfter making these code changes, you can build and redeploy the application. Then, browse to your hosted application in the browser. Your app should be able to connect to the Azure SQL database successfully. Keep in mind that it may take several minutes for the role assignments to propagate through your Azure environment. Your application is now configured to run both locally and in a production environment without the developers having to manage secrets in the application itself.\n\n## Next steps\n\nIn this tutorial, you learned how to migrate an application to passwordless connections.\n\nYou can read the following resources to explore the concepts discussed in this article in more depth:\n\n- [Authorize access to blob data with managed identities for Azure resources](/azure/storage/blobs/authorize-managed-identity).\n- [Authorize access to blobs using Microsoft Entra ID](/azure/storage/blobs/authorize-access-azure-active-directory)\n"
  },
  {
    "path": "articles/java/spring-framework/migration-guide-for-4.0.md",
    "content": "---\ntitle: Migration guide for Spring Cloud Azure 4.0\ndescription: Helps with migration to Spring Cloud Azure 4.0 from legacy Azure Spring libraries.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: reference\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Migration guide for Spring Cloud Azure 4.0\n\nThis guide helps with migration to Spring Cloud Azure 4.0 from legacy Azure Spring libraries.\n\n## Introduction\n\nWe'll call libraries whose group ID and artifact ID follow the pattern `com.azure.spring:spring-cloud-azure-*` the *modern* libraries, and those with pattern `com.azure.spring:azure-spring-boot-*`, `com.azure.spring:azure-spring-cloud-*`, or `com.azure.spring:azure-spring-integration-*` the *legacy* libraries.\n\nThis guide will focus on side-by-side comparisons for similar configurations between the modern and legacy libraries.\n\nFamiliarity with `com.azure.spring:azure-spring-boot-*`, `com.azure.spring:azure-spring-cloud-*` or `com.azure.spring:azure-spring-integration-*` package is assumed.\n\nIf you're new to the Spring Cloud Azure 4.0 libraries, see the [Spring Cloud Azure developer guide](developer-guide-overview.md) rather than this guide.\n\n## Migration benefits\n\nA natural question to ask when considering whether to adopt a new version or library is its benefits. As Azure has matured and been embraced by a more diverse group of developers, we've been focused on learning the patterns and practices to best support developer productivity and to understand the gaps that the Spring Cloud Azure libraries have.\n\nThere were several areas of consistent feedback expressed across the Spring Cloud Azure libraries. The most important is that the libraries for different Azure services haven't enabled the complete set of configurations. Additionally, the inconsistency of project naming, artifact IDs, versions, and configurations made the learning curve steep.\n\nTo improve the development experience across Spring Cloud Azure libraries, a set of design guidelines was introduced to ensure that Spring Cloud Azure libraries have a natural and idiomatic feel with respect to the Spring ecosystem. Further details are available in the [design doc](https://github.com/Azure/azure-sdk-for-java/wiki/Spring-Cloud-Azure-4.0-design) for those interested.\n\nSpring Cloud Azure 4.0 provides the shared experience across libraries integrating with different Spring projects, for example Spring Boot, Spring Integration, Spring Cloud Stream, and so on. The shared experience includes:\n\n* A unified BOM to include all Spring Cloud Azure 4.0 libraries.\n* A consistent naming convention for artifacts.\n* A unified way to configure credential, proxy, retry, cloud environment, and transport layer settings.\n* Supporting all the authenticating methods an Azure Service or Azure Service SDK supports.\n\n## Overview\n\nThis migration guide consists of the following sections:\n\n* Naming changes for Spring Cloud Azure 4.0\n* Artifact changes: renamed / added / deleted\n* Dependency changes\n* Authentication changes\n* Configuration properties\n* API breaking changes\n* Library changes\n\n## Naming changes\n\nThere has never been a consistent or official name to call all the Spring Cloud Azure libraries. Some of them were called `Azure Spring Boot` and some of them `Spring on Azure`. Since 4.0, we began to use the project name `Spring Cloud Azure` to represent all the Azure Spring libraries.\n\n## BOM\n\nWe used to ship two BOMs for our libraries, the `azure-spring-boot-bom` and `azure-spring-cloud-dependencies`, but we combined these two BOMs into one BOM since 4.0, the `spring-cloud-azure-dependencies`. Add an entry in the `dependencyManagement` section of your project to benefit from the dependency management.\n\n```xml\n<dependencyManagement>\n  <dependencies>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-dependencies</artifactId>\n      <version>7.2.0</version>\n      <type>pom</type>\n      <scope>import</scope>\n    </dependency>\n  </dependencies>\n</dependencyManagement>\n```\n\n[!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n## Artifact changes: renamed / added / deleted\n\nGroup IDs are the same for modern and legacy Spring Cloud Azure libraries. They're all `com.azure.spring`. Artifact IDs for the modern Spring Cloud Azure libraries have changed. According to which Spring project it belongs to, Spring Boot, Spring Integration, or Spring Cloud Stream, the artifact IDs pattern could be `spring-cloud-azure-starter-[service]`, `spring-integration-azure-[service]`, or `spring-cloud-azure-stream-binder-[service]`. The legacy starters for each has an artifact ID following the pattern `azure-spring-*`. This provides a quick and accessible means to help understand, at a glance, whether you're using modern or legacy starters.\n\nIn the process of developing Spring Cloud Azure 4.0, we renamed some artifacts to make them follow the new naming conventions, deleted some artifacts so that the functionality could be put into a more appropriate artifact, and added some new artifacts to better serve some scenarios.\n\nThe following table shows the mappings between legacy artifact ID and modern artifact ID:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy Artifact ID                                  | Modern Artifact ID                                                                             | Description                                                                                                                                                                                                                                                                         |\n> |-----------------------------------------------------|------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `azure-spring-boot-starter`                         | `spring-cloud-azure-starter`                                                                   | This artifact has been deleted with all functionality be merged into the new `spring-cloud-azure-starter` artifact.                                                                                                                                                                 |\n> | `azure-spring-boot-starter-active-directory`        | `spring-cloud-azure-starter-active-directory`                                                  | Renamed the artifact.                                                                                                                                                                                                                                                               |\n> | `azure-spring-boot-starter-active-directory-b2c`    | `spring-cloud-azure-starter-active-directory-b2c`                                              | Renamed the artifact.                                                                                                                                                                                                                                                               |\n> | `azure-spring-boot-starter-cosmos`                  | `spring-cloud-azure-starter-data-cosmos`                                                       | Renamed the artifact to add `data`, indicating using Spring Data Azure Cosmos DB.                                                                                                                                                                                                   |\n> | `azure-spring-boot-starter-keyvault-certificates`   | not applicable                                                                                 | Not included in this release, but will be supported in later version.                                                                                                                                                                                                               |\n> | `azure-spring-boot-starter-keyvault-secrets`        | `spring-cloud-azure-starter-keyvault-secrets`                                                  | Renamed the artifact.                                                                                                                                                                                                                                                               |\n> | `azure-spring-boot-starter-servicebus-jms`          | `spring-cloud-azure-starter-servicebus-jms`                                                    | Renamed the artifact.                                                                                                                                                                                                                                                               |\n> | `azure-spring-boot-starter-storage`                 | `spring-cloud-azure-starter-storage-blob` <br/>`spring-cloud-azure-starter-storage-file-share` | The legacy artifact contains the functionality of both Storage Blob and File Share, it's been spliced into two separate artifacts in 4.0, `spring-cloud-azure-starter-storage-blob` and `spring-cloud-azure-starter-storage-file-share`.                                            |\n> | `azure-spring-boot`                                 | not applicable                                                                                 | This artifact has been deleted with all functionality be merged into the new `spring-cloud-azure-autoconfigure` artifact.                                                                                                                                                           |\n> | `azure-spring-cloud-autoconfigure`                  | not applicable                                                                                 | This artifact has been deleted with all functionality be merged into the new `spring-cloud-azure-autoconfigure` artifact.                                                                                                                                                           |\n> | `azure-spring-cloud-context`                        | not applicable                                                                                 | This artifact has been deleted with all functionality be merged into the new `spring-cloud-azure-autoconfigure` and `spring-cloud-azure-resourcemanager` artifacts.                                                                                                                 |\n> | `azure-spring-cloud-messaging`                      | `spring-messaging-azure`                                                                       | The messaging listener annotation has been dropped.                                                                                                                                                                                                                                 |\n> | `azure-spring-cloud-starter-cache`                  | not applicable                                                                                 | This artifact has been deleted, for using redis, just add `spring-boot-starter-data-redis`, `spring-boot-starter-cache`, `spring-cloud-azure-resourcemanager`, and `spring-cloud-azure-starter`. For more information about usage, see [Spring Cloud Azure Redis support](redis-support.md). |\n> | `azure-spring-cloud-starter-eventhubs-kafka`        | not applicable                                                                                 | This artifact has been deleted, for using kafka, just add spring kafka, `spring-cloud-azure-resourcemanager`, and `spring-cloud-azure-starter`. For more information about usage, see [Spring Cloud Azure Kafka support](kafka-support.md).                                              |\n> | `azure-spring-cloud-starter-eventhubs`              | `spring-cloud-azure-starter-integration-eventhubs`                                             | Renamed the artifact to add `integration`, indicating using Spring Integration with Event Hubs.                                                                                                                                                                                     |\n> | `azure-spring-cloud-starter-servicebus`             | `spring-cloud-azure-starter-integration-servicebus`                                            | Renamed the artifact to add `integration`, indicating using Spring Integration with Service Bus.                                                                                                                                                                                    |\n> | `azure-spring-cloud-starter-storage-queue`          | `spring-cloud-azure-starter-integration-storage-queue`                                         | Renamed the artifact to add `integration`, indicating using Spring Integration with Storage Queue.                                                                                                                                                                                  |\n> | `azure-spring-cloud-storage`                        | not applicable                                                                                 | This artifact has been deleted with all functionalities merged into the new `spring-cloud-azure-autoconfigure` artifact.                                                                                                                                                            |\n> | `azure-spring-cloud-stream-binder-eventhubs`        | `spring-cloud-azure-stream-binder-eventhubs`                                                   | This artifact has been refactored using a new design, mainly `spring-cloud-azure-stream-binder-eventhubs` and `spring-cloud-azure-stream-binder-eventhubs-core`.                                                                                                                    |\n> | `azure-spring-cloud-stream-binder-service-core`     | `spring-cloud-azure-stream-binder-servicebus-core`                                             | Renamed the artifact.                                                                                                                                                                                                                                                               |\n> | `azure-spring-cloud-stream-binder-servicebus-queue` | `spring-cloud-azure-stream-binder-servicebus`                                                  | This artifact has been deleted with all functionality be merged into the `spring-cloud-azure-stream-binder-servicebus` artifact.                                                                                                                                                    |\n> | `azure-spring-cloud-stream-binder-servicebus-topic` | `spring-cloud-azure-stream-binder-servicebus`                                                  | This artifact has been deleted with all functionality be merged into the `spring-cloud-azure-stream-binder-servicebus` artifact.                                                                                                                                                    |\n> | `azure-spring-integration-core`                     | `spring-integration-azure-core`                                                                | Renamed the artifact.                                                                                                                                                                                                                                                               |\n> | `azure-spring-integration-eventhubs`                | `spring-integration-azure-eventhubs`                                                           | Rename the artifact.                                                                                                                                                                                                                                                                |\n> | `azure-spring-integration-servicebus`               | `spring-integration-azure-servicebus`                                                          | Rename the artifact.                                                                                                                                                                                                                                                                |\n> | `azure-spring-integration-storage-queue`            | `spring-integration-azure-storage-queue`                                                       | Rename the artifact.                                                                                                                                                                                                                                                                |\n> | not applicable                                      | `spring-cloud-azure-actuator`                                                                  | The newly added Spring Cloud Azure Actuator artifact.                                                                                                                                                                                                                               |\n> | not applicable                                      | `spring-cloud-azure-actuator-autoconfigure`                                                    | The newly added Spring Cloud Azure Actuator AutoConfigure artifact, including autoconfiguration for actuator.                                                                                                                                                                       |\n> | not applicable                                      | `spring-cloud-azure-autoconfigure`                                                             | Newly added Spring Cloud Azure AutoConfigure artifact, including all auto-configuration for SDK clients, Spring Security support, Spring Data support and Spring Integration support.                                                                                               |\n> | not applicable                                      | `spring-cloud-azure-core`                                                                      | Newly added Spring Cloud Azure Core artifact, including all core functionality.                                                                                                                                                                                                     |\n> | not applicable                                      | `spring-cloud-azure-resourcemanager`                                                           | Newly added Resource Manager artifact. It's the Core library using Azure Resource Manager to read metadata and create resources.                                                                                                                                                    |\n> | not applicable                                      | `spring-cloud-azure-service`                                                                   | Newly added Spring Cloud Azure Service artifact, including abstractions for Azure services.                                                                                                                                                                                         |\n> | not applicable                                      | `spring-cloud-azure-starter-appconfiguration`                                                  | Newly added starter for using Azure App Configuration SDK client.                                                                                                                                                                                                                   |\n> | not applicable                                      | `spring-cloud-azure-starter-cosmos`                                                            | Newly added starter for using Azure Cosmos DB SDK client.                                                                                                                                                                                                                           |\n> | not applicable                                      | `spring-cloud-azure-starter-eventhubs`                                                         | Newly added starter for using Azure Event Hubs SDK client.                                                                                                                                                                                                                          |\n> | not applicable                                      | `spring-cloud-azure-starter-servicebus`                                                        | Newly added starter for using Azure Service Bus SDK client.                                                                                                                                                                                                                         |\n> | not applicable                                      | `spring-cloud-azure-starter-storage-blob`                                                      | Newly added starter for using Azure Storage Blob SDK client.                                                                                                                                                                                                                        |\n> | not applicable                                      | `spring-cloud-azure-starter-storage-file-share`                                                | Newly added starter for using Azure Storage File Share SDK client.                                                                                                                                                                                                                  |\n> | not applicable                                      | `spring-cloud-azure-starter-storage-queue`                                                     | Newly added starter for using Azure Storage Queue SDK client.                                                                                                                                                                                                                       |\n> | not applicable                                      | `spring-cloud-azure-starter-stream-eventhubs`                                                  | Newly added starter for using Azure Event Hubs Spring Cloud Stream Binder.                                                                                                                                                                                                          |\n> | not applicable                                      | `spring-cloud-azure-starter-stream-servicebus`                                                 | Newly added starter for using Azure Service Bus Spring Cloud Stream Binder                                                                                                                                                                                                          |\n> | not applicable                                      | `spring-cloud-azure-stream-binder-eventhubs-core`                                              | Newly added Spring Cloud Stream core artifact for Azure Event Hubs.                                                                                                                                                                                                                 |\n\n## Dependencies changes\n\nSome unnecessary dependencies were included in the legacy artifacts, which we've removed in the modern Spring Cloud Azure 4.0 libraries. Be sure to add the removed dependencies manually to your project to prevent crashes.\n\nLibraries that have dependency changes include:\n\n* [`spring-cloud-azure-starter`](#dependency-changes)\n* [`spring-cloud-azure-starter-active-directory`](#dependency-changes-1)\n* [`spring-cloud-azure-starter-active-directory-b2c`](#dependency-changes-2)\n\n## Authentication changes\n\nSpring Cloud Azure 4.0 supports all the authentication methods that each Azure Service SDK supports. It enables you to configure a global token credential as well as providing the token credential at each service level. But a credential isn't required to configure  Spring Cloud Azure 4.0 because it can apply the credential stored in a local developing environment or managed identity in Azure Services. Just be sure the principal has been granted sufficient permission to access the target Azure resources.\n\n> [!NOTE]\n> When assign roles to the security principals to interact with Azure messaging services, the `Data` related roles are required to conduct messaging operations. For Azure Spring Apps Stream Event Hubs / Service Bus Binder libraries, `Contributor` role is required when the function of auto creating resources is needed. For more information, see [Azure built-in roles](/azure/role-based-access-control/built-in-roles).\n\nA chained credential, the `DefaultAzureCredential` bean is auto-configured by default and will be used by all components if no more authentication information is specified. For more information, see the [DefaultAzureCredential](/java/api/overview/azure/identity-readme#defaultazurecredential) section of [Azure Identity client library for Java](/java/api/overview/azure/identity-readme).\n\n## Configuration properties\n\n### Properties migration\n\nWe've created an `additional-spring-configuration-metadata.json` file to smooth the property migration when using with `spring-boot-properties-migrator`. First, add the following property migrator to your application:\n\n```xml\n<dependency>\n    <groupId>org.springframework.boot</groupId>\n    <artifactId>spring-boot-properties-migrator</artifactId>\n    <scope>runtime</scope>\n</dependency>\n```\n\nOr, if you're using Gradle:\n\n```shell\nruntime(\"org.springframework.boot:spring-boot-properties-migrator\")\n```\n\nIf you run the app, it will identify the properties that are no longer managed by Spring Cloud Azure. If there's a replacement, it will temporarily remap the property for you with a warning. If there isn't a replacement, an error report will give you more information. Either way, the configuration has to be updated and the dependency removed once you've updated the configuration.\n\nBefore you move on, it's a good idea to use the search feature of your IDE to double-check that you aren't using one of the properties you've migrated in an integration test.\n\n> [!NOTE]\n> We've changed many configuration properties in this change. Using the `spring-boot-properties-migrator` will help smooth your migration.\n\n### Global configurations\n\nThe modern `spring-cloud-azure-starter` enables you to define properties that apply to all Azure SDKs in the namespace `spring.cloud.azure`. This feature wasn't supported in the legacy `azure-spring-boot-starter`. The global configurations can be divided into five categories, shown in the following table:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Prefix                          | Description                                                   |\n> |---------------------------------|---------------------------------------------------------------|\n> | `spring.cloud.azure.client`     | Configures the transport clients underneath each Azure SDK.   |\n> | `spring.cloud.azure.credential` | Configures how to authenticate with Microsoft Entra ID.       |\n> | `spring.cloud.azure.profile`    | Configures the Azure cloud environment.                       |\n> | `spring.cloud.azure.proxy`      | Configures the proxy options, apply to all Azure SDK clients. |\n> | `spring.cloud.azure.retry`      | Configures the retry options, apply to all Azure SDK clients. The retry options have supported part of the SDKs, there's no `spring.cloud.azure.cosmos.retry`. |\n\nFor a full list of configurations, see [Spring Cloud Azure configuration properties](./configuration-properties-all.md).\n\n### Configure each SDK\n\nFor details about the configuration options at the SDK level, use the following links:\n\n* [From `azure-spring-boot-starter-active-directory` to `spring-cloud-azure-starter-active-directory`](#sdk-configuration-changes)\n* [From `azure-spring-boot-starter-active-directory-b2c` to `spring-cloud-azure-starter-active-directory-b2c`](#sdk-configuration-changes-1)\n* [From `azure-spring-boot-starter-cosmos` to `spring-cloud-azure-starter-data-cosmos`](#sdk-configuration-changes-2)\n* [From `azure-spring-boot-starter-keyvault-secrets` to `spring-cloud-azure-starter-keyvault-secrets`](#sdk-configuration-changes-3)\n* [From `azure-spring-boot-starter-servicebus-jms` to `spring-cloud-azure-starter-servicebus-jms`](#sdk-configuration-changes-4)\n* [From `azure-spring-boot-starter-storage` to `spring-cloud-azure-starter-storage-blob`](#sdk-configuration-changes-5)\n* [From `azure-spring-boot-starter-storage` to `spring-cloud-azure-starter-storage-file-share`](#sdk-configuration-changes-6)\n* [From `azure-spring-cloud-starter-eventhubs` to `spring-cloud-azure-starter-integration-eventhubs`](#sdk-configuration-changes-7)\n* [From `azure-spring-cloud-starter-servicebus` to `spring-cloud-azure-starter-integration-servicebus`](#sdk-configuration-changes-8)\n* [From `azure-spring-cloud-starter-storage-queue` to `spring-cloud-azure-starter-integration-storage-queue`](#sdk-configuration-changes-9)\n* [From `azure-spring-cloud-stream-binder-eventhubs` to `spring-cloud-azure-stream-binder-eventhubs`](#sdk-configuration-changes-10)\n* [From `azure-spring-cloud-stream-binder-servicebus-*` to `spring-cloud-azure-stream-binder-servicebus`](#sdk-configuration-changes-11)\n\n## API breaking changes\n\nFor details about API breaking changes in each library, use the following links:\n\n* [From `azure-spring-boot-starter-active-directory` to `spring-cloud-azure-starter-active-directory`](#api-changes)\n* [From `azure-spring-boot-starter-active-directory-b2c` to `spring-cloud-azure-starter-active-directory-b2c`](#api-changes-1)\n* [From `azure-spring-boot-starter-storage` to `spring-cloud-azure-starter-storage-blob`](#api-changes-2)\n* [From `azure-spring-boot-starter-storage` to `spring-cloud-azure-starter-storage-file-share`](#api-changes-3)\n* [From `azure-spring-cloud-starter-eventhubs` to `spring-cloud-azure-starter-integration-eventhubs`](#api-changes-4)\n* [From `azure-spring-integration-eventhubs` to `spring-integration-azure-eventhubs`](#api-changes-5)\n* [From `azure-spring-cloud-starter-servicebus` to `spring-cloud-azure-starter-integration-servicebus`](#api-changes-6)\n* [From `azure-spring-integration-servicebus` to `spring-integration-azure-servicebus`](#api-changes-7)\n* [From `azure-spring-cloud-starter-storage-queue` to `spring-cloud-azure-starter-integration-storage-queue`](#api-changes-8)\n* [From `azure-spring-integration-storage-queue` to `spring-integration-azure-storage-queue`](#api-changes-9)\n* [From `azure-spring-cloud-stream-binder-eventhubs` to `spring-cloud-azure-stream-binder-eventhubs`](#api-changes-10)\n* [From `azure-spring-cloud-stream-binder-servicebus-*` to `spring-cloud-azure-stream-binder-servicebus`](#api-changes-11)\n\n## Library changes\nBreaking changes in each library are introduced as follows.\n\n### From `azure-spring-boot-starter` to `spring-cloud-azure-starter`\nThis guide is intended to assist in the migration to [`spring-cloud-azure-starter`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter) from\nversion 3 of [`azure-spring-boot-starter`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### Dependency changes\n\nSome unnecessary dependencies were included in the legacy artifacts, which we have removed in the modern Spring Cloud Azure 4.0 libraries. Be sure to add the removed dependencies manually to your project to prevent unintentional crash.\n\nThe following table shows the Removed dependencies:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Removed dependencies                                      | Description                                                            |\n> |-----------------------------------------------------------|------------------------------------------------------------------------|\n> | `org.springframework.boot:spring-boot-starter-validation` | Include the validation starter if you want to use Hibernate Validator. |\n\n### From `azure-spring-boot-starter-active-directory` to `spring-cloud-azure-starter-active-directory`\n\nThis guide is intended to assist the migration to [`spring-cloud-azure-starter-active-directory`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-active-directory) from\nversion 3 of [`azure-spring-boot-starter-active-directory`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-active-directory).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### Dependency changes\n\nSome unnecessary dependencies in the legacy artifact have been removed since the modern Spring Cloud Azure 4.0 library. Add these removed dependencies to your project to prevent unintentional crash.\n\nThe following table shows the Removed dependencies:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Removed dependencies                                      | Description                                    |\n> |-----------------------------------------------------------|------------------------------------------------|\n> | `com.fasterxml.jackson.core:jackson-databind`             | Add this dependency to your project if needed. |\n> | `io.projectreactor.netty:reactor-netty`                   | Add this dependency to your project if needed. |\n> | `org.springframework.boot:spring-boot-starter-validation` | Add this dependency to your project if needed. |\n> | `org.springframework.boot:spring-boot-starter-webflux`    | Add this dependency to your project if needed. |\n\n#### SDK configuration changes\n\nThis section includes the changes about the properties added, removed and changed.\n\n* The following two points are the main to pay your attention to:\n1. All configuration property names' prefix changed from `azure.activedirectory` to `spring.cloud.azure.active-directory`.\n1. New property `spring.cloud.azure.active-directory.enabled` is added to enable/disable Microsoft Entra related features. The default value is `false`.\n\nThe following table shows the property mappings between `azure-spring-boot-starter-active-directory` and `spring-cloud-azure-starter-active-directory`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties                                                                        | Modern properties                                                                                      |\n> |------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|\n> | `azure.activedirectory.app-id-uri`                                                       | `spring.cloud.azure.active-directory.app-id-uri`                                                       |\n> | `azure.activedirectory.application-type`                                                 | `spring.cloud.azure.active-directory.application-type`                                                 |\n> | `azure.activedirectory.authorization-clients`                                            | `spring.cloud.azure.active-directory.authorization-clients`                                            |\n> | `azure.activedirectory.authorization-clients.AZURE_CLIENT_NAME.authorization-grant-type` | `spring.cloud.azure.active-directory.authorization-clients.AZURE_CLIENT_NAME.authorization-grant-type` |\n> | `azure.activedirectory.authorization-clients.AZURE_CLIENT_NAME.on-demand`                | `spring.cloud.azure.active-directory.authorization-clients.AZURE_CLIENT_NAME.on-demand`                |\n> | `azure.activedirectory.authorization-clients.AZURE_CLIENT_NAME.scopes`                   | `spring.cloud.azure.active-directory.authorization-clients.AZURE_CLIENT_NAME.scopes`                   |\n> | `azure.activedirectory.authenticate-additional-parameters`                               | `spring.cloud.azure.active-directory.authenticate-additional-parameters`                               |\n> | `azure.activedirectory.base-uri`                                                         | `spring.cloud.azure.active-directory.profile.environment.active-directory-endpoint`                    |\n> | `azure.activedirectory.client-id`                                                        | `spring.cloud.azure.active-directory.credential.client-id`                                             |\n> | `azure.activedirectory.client-secret`                                                    | `spring.cloud.azure.active-directory.credential.client-secret`                                         |\n> | `azure.activedirectory.graph-membership-uri`                                             | Check the following table for more information.                                                        |\n> | `azure.activedirectory.jwt-connect-timeout`                                              | `spring.cloud.azure.active-directory.jwt-connect-timeout`                                              |\n> | `azure.activedirectory.jwt-read-timeout`                                                 | `spring.cloud.azure.active-directory.jwt-read-timeout`                                                 |\n> | `azure.activedirectory.jwt-size-limit`                                                   | `spring.cloud.azure.active-directory.jwt-size-limit`                                                   |\n> | `azure.activedirectory.jwk-set-cache-lifespan`                                           | `spring.cloud.azure.active-directory.jwk-set-cache-lifespan`                                           |\n> | `azure.activedirectory.jwk-set-cache-refresh-time`                                       | `spring.cloud.azure.active-directory.jwk-set-cache-refresh-time`                                       |\n> | `azure.activedirectory.post-logout-redirect-uri`                                         | `spring.cloud.azure.active-directory.post-logout-redirect-uri`                                         |\n> | `azure.activedirectory.session-stateless`                                                | `spring.cloud.azure.active-directory.session-stateless`                                                |\n> | `azure.activedirectory.redirect-uri-template`                                            | `spring.cloud.azure.active-directory.redirect-uri-template`                                            |\n> | `azure.activedirectory.resource-server.claim-to-authority-prefix-map`                    | `spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map`                    |\n> | `azure.activedirectory.resource-server.principal-claim-name`                             | `spring.cloud.azure.active-directory.resource-server.principal-claim-name`                             |\n> | `azure.activedirectory.tenant-id`                                                        | `spring.cloud.azure.active-directory.profile.tenant-id`                                                |\n> | `azure.activedirectory.user-group.allowed-group-ids`                                     | `spring.cloud.azure.active-directory.user-group.allowed-group-ids`                                     |\n> | `azure.activedirectory.user-group.allowed-group-names`                                   | `spring.cloud.azure.active-directory.user-group.allowed-group-names`                                   |\n> | `azure.activedirectory.user-name-attribute`                                              | `spring.cloud.azure.active-directory.user-name-attribute`                                              |\n\n* The value type of the following properties is changed from `long` to `Duration`:\n\n    * `jwt-connect-timeout`\n    * `jwt-read-timeout`\n    * `jwk-set-cache-lifespan`\n    * `jwk-set-cache-refresh-time`.\n\n* The following properties are removed:\n\n    * `azure.activedirectory.allow-telemetry`\n    * `azure.activedirectory.user-group.enable-full-list`\n    * `azure.activedirectory.graph-base-uri`\n    * `azure.activedirectory.graph-membership-uri`\n\n* The following properties are added:\n\n    * `spring.cloud.azure.active-directory.enabled`\n    * `spring.cloud.azure.active-directory.profile.environment.microsoft-graph-endpoint`\n    * `spring.cloud.azure.active-directory.user-group.use-transitive-members`\n\n> [!NOTE]\n> The function of `azure.activedirectory.graph-membership-uri` has been replaced by 2 properties: `spring.cloud.azure.active-directory.profile.environment.microsoft-graph-endpoint` and `spring.cloud.azure.active-directory.user-group.use-transitive-members`. The first property is used to specify the host name, and the second a flag for using the URL path: `v1.0/me/memberOf` or `v1.0/me/transitiveMemberOf`.\n\nHere are some examples of migration:\n\n* Example 1. Case 1\n\n  * For legacy:\n    azure.activedirectory.graph-membership-uri=https://graph.microsoft.com/v1.0/me/memberOf\n\n  * For modern:\n    `spring.cloud.azure.active-directory.profile.environment.microsoft-graph-endpoint=https://graph.microsoft.com/` +\n    `spring.cloud.azure.active-directory.user-group.use-transitive-members=false`\n\n* Example 2. Case 2\n\n  * For legacy:\n    azure.activedirectory.graph-membership-uri=https://graph.microsoft.com/v1.0/me/transitiveMemberOf\n\n  * For modern:\n    `spring.cloud.azure.active-directory.profile.environment.microsoft-graph-endpoint=https://graph.microsoft.com/` +\n      `spring.cloud.azure.active-directory.user-group.use-transitive-members=true`\n\n#### API changes\n\nThe following table shows the class mappings from `azure-spring-boot-starter-active-directory` to `spring-cloud-azure-starter-active-directory`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                 | Modern class                                                                              |\n> |------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|\n> | `com.azure.spring.aad.webapi.AADJwtBearerTokenAuthenticationConverter`       | `com.azure.spring.cloud.autoconfigure.aad.AadJwtBearerTokenAuthenticationConverter`       |\n> | `com.azure.spring.aad.webapi.AADResourceServerProperties`                    | `com.azure.spring.cloud.autoconfigure.aad.properties.AadResourceServerProperties`         |\n> | `com.azure.spring.aad.webapi.AADResourceServerWebSecurityConfigurerAdapter`  | `com.azure.spring.cloud.autoconfigure.aad.AadResourceServerWebSecurityConfigurerAdapter`  |\n> | `com.azure.spring.aad.webapp.AADWebSecurityConfigurerAdapter`                | `com.azure.spring.cloud.autoconfigure.aad.AadWebSecurityConfigurerAdapter`                |\n> | `com.azure.spring.aad.webapp.AuthorizationClientProperties`                  | `com.azure.spring.cloud.autoconfigure.aad.properties.AuthorizationClientProperties`       |\n> | `com.azure.spring.aad.AADApplicationType`                                    | `com.azure.spring.cloud.autoconfigure.aad.properties.AadApplicationType`                  |\n> | `com.azure.spring.aad.AADAuthorizationGrantType`                             | `com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthorizationGrantType`           |\n> | `com.azure.spring.aad.AADAuthorizationServerEndpoints`                       | `com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthorizationServerEndpoints`     |\n> | `com.azure.spring.aad.AADClientRegistrationRepository`                       | `com.azure.spring.cloud.autoconfigure.aad.AadClientRegistrationRepository`                |\n> | `com.azure.spring.aad.AADTrustedIssuerRepository`                            | `com.azure.spring.cloud.autoconfigure.aad.AadTrustedIssuerRepository`                     |\n> | `com.azure.spring.autoconfigure.aad.AADAppRoleStatelessAuthenticationFilter` | `com.azure.spring.cloud.autoconfigure.aad.filter.AadAppRoleStatelessAuthenticationFilter` |\n> | `com.azure.spring.autoconfigure.aad.AADAuthenticationFilter`                 | `com.azure.spring.cloud.autoconfigure.aad.filter.AadAuthenticationFilter`                 |\n> | `com.azure.spring.autoconfigure.aad.AADAuthenticationProperties`             | `com.azure.spring.cloud.autoconfigure.aad.properties.AadAuthenticationProperties`         |\n> | `com.azure.spring.autoconfigure.aad.UserPrincipal`                           | `com.azure.spring.cloud.autoconfigure.aad.filter.UserPrincipal`                           |\n> | `com.azure.spring.autoconfigure.aad.UserPrincipalManager`                    | `com.azure.spring.cloud.autoconfigure.aad.filter.UserPrincipalManager`                    |\n\nThis section lists the removed classes from `azure-spring-boot-starter-active-directory`.\n\n* Removed legacy class\n\n  * `com.azure.spring.aad.webapp.AADHandleConditionalAccessFilter`\n  * `com.azure.spring.aad.webapi.validator.AADJwtAudienceValidator`\n  * `com.azure.spring.aad.webapi.validator.AADJwtClaimValidator`\n\n### From `azure-spring-boot-starter-active-directory-b2c` to `spring-cloud-azure-starter-active-directory-b2c`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-starter-active-directory-b2c`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-active-directory-b2c) from version 3 of [`azure-spring-boot-starter-active-directory-b2c`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-active-directory-b2c).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### Dependency changes\n\nSome unnecessary dependencies were included in the legacy artifacts, which we have removed in the modern Spring Cloud Azure 4.0 libraries. Be sure to add the removed dependencies manually to your project to prevent unintentional crash.\n\nThe following table shows the Removed dependencies:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Removed dependencies                                      | Description                                                            |\n> |-----------------------------------------------------------|------------------------------------------------------------------------|\n> | `org.springframework.boot:spring-boot-starter-validation` | Include the validation starter if you want to use Hibernate Validator. |\n\n#### SDK configuration changes\n\nThis section includes the changes about the properties added, removed and changed.\n\n* The following two points are the main to pay your attention to:\n\n1. All configuration property names changed the prefix from `azure.activedirectory.b2c` to `spring.cloud.azure.active-directory.b2c`.\n1. New property `spring.cloud.azure.active-directory.b2c.enabled` is added to allow enable / disable Azure AD B2C related features. The default value is false.\n\nThe following table shows the property mappings from `azure-spring-boot-starter-active-directory-b2c` to `spring-cloud-azure-starter-active-directory-b2c`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties                                                                              | Modern properties                                                                                            |\n> |------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|\n> | `azure.activedirectory.b2c.authenticate-additional-parameters`                                 | `spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters`                                 |\n> | `azure.activedirectory.b2c.authorization-clients`                                              | `spring.cloud.azure.active-directory.b2c.authorization-clients`                                              |\n> | `azure.activedirectory.b2c.authorization-clients.<AZURE-CLIENT-NAME>.authorization-grant-type` | `spring.cloud.azure.active-directory.b2c.authorization-clients.<AZURE-CLIENT-NAME>.authorization-grant-type` |\n> | `azure.activedirectory.b2c.authorization-clients.<AZURE-CLIENT-NAME>.scopes`                   | `spring.cloud.azure.active-directory.b2c.authorization-clients.<AZURE-CLIENT-NAME>.scopes`                   |\n> | `azure.activedirectory.b2c.app-id-uri`                                                         | `spring.cloud.azure.active-directory.b2c.app-id-uri`                                                         |\n> | `azure.activedirectory.b2c.base-uri`                                                           | `spring.cloud.azure.active-directory.b2c.base-uri`                                                           |\n> | `azure.activedirectory.b2c.client-id`                                                          | `spring.cloud.azure.active-directory.b2c.credential.client-id`                                               |\n> | `azure.activedirectory.b2c.client-secret`                                                      | `spring.cloud.azure.active-directory.b2c.credential.client-secret`                                           |\n> | `azure.activedirectory.b2c.jwt-connect-timeout`                                                | `spring.cloud.azure.active-directory.b2c.jwt-connect-timeout`                                                |\n> | `azure.activedirectory.b2c.jwt-read-timeout`                                                   | `spring.cloud.azure.active-directory.b2c.jwt-read-timeout`                                                   |\n> | `azure.activedirectory.b2c.jwt-size-limit`                                                     | `spring.cloud.azure.active-directory.b2c.jwt-size-limit`                                                     |\n> | `azure.activedirectory.b2c.login-flow`                                                         | `spring.cloud.azure.active-directory.b2c.login-flow`                                                         |\n> | `azure.activedirectory.b2c.logout-success-url`                                                 | `spring.cloud.azure.active-directory.b2c.logout-success-url`                                                 |\n> | `azure.activedirectory.b2c.reply-url`                                                          | `spring.cloud.azure.active-directory.b2c.reply-url`                                                          |\n> | `azure.activedirectory.b2c.tenant-id`                                                          | `spring.cloud.azure.active-directory.b2c.profile.tenant-id`                                                  |\n> | `azure.activedirectory.b2c.user-flows`                                                         | `spring.cloud.azure.active-directory.b2c.user-flows`                                                         |\n> | `azure.activedirectory.b2c.user-name-attribute-name`                                           | `spring.cloud.azure.active-directory.b2c.user-name-attribute-name`                                           |\n\n* Removed properties from `azure-spring-boot-starter-active-directory-b2c`:\n\n  * `azure.activedirectory.b2c.allow-telemetry`\n  * `azure.activedirectory.b2c.tenant`\n\n* The value type of the following properties is changed from `long` to `Duration`:\n\n  * `jwt-connect-timeout`\n  * `jwt-read-timeout`\n\n#### API changes\n\nThe following table shows the class mappings from `azure-spring-boot-starter-active-directory-b2c` to `spring-cloud-azure-starter-active-directory-b2c`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                     | Modern class                                                                        |\n> |----------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|\n> | `com.azure.spring.autoconfigure.b2c.AADB2CAuthorizationRequestResolver`          | `com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cAuthorizationRequestResolver`    |\n> | `com.azure.spring.autoconfigure.b2c.AADB2CJwtBearerTokenAuthenticationConverter` | `com.azure.spring.cloud.autoconfigure.aad.AadJwtBearerTokenAuthenticationConverter` |\n> | `com.azure.spring.autoconfigure.b2c.AADB2CLogoutSuccessHandler`                  | `com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cLogoutSuccessHandler`            |\n> | `com.azure.spring.autoconfigure.b2c.AADB2COidcLoginConfigurer`                   | `com.azure.spring.cloud.autoconfigure.aadb2c.AadB2COidcLoginConfigurer`             |\n> | `com.azure.spring.autoconfigure.b2c.AADB2CProperties`                            | `com.azure.spring.cloud.autoconfigure.aadb2c.properties.AadB2cProperties`           |\n> | `com.azure.spring.autoconfigure.b2c.AADB2CTrustedIssuerRepository`               | `com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cTrustedIssuerRepository`         |\n> | `com.azure.spring.autoconfigure.b2c.AuthorizationClientProperties`               | `com.azure.spring.cloud.autoconfigure.aad.properties.AuthorizationClientProperties` |\n\n### From `azure-spring-boot-starter-cosmos` to `spring-cloud-azure-starter-data-cosmos`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-starter-data-cosmos`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-data-cosmos) from version 3 of [`azure-spring-boot-starter-cosmos`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-cosmos).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### SDK configuration changes\n\nAll configuration property names changed the prefix from `azure.cosmos` to `spring.cloud.azure.cosmos`.\n\nThe following table shows the class mappings from `azure-spring-boot-starter-cosmos` to `spring-cloud-azure-starter-data-cosmos`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties                     | Modern properties                                  |\n> |---------------------------------------|----------------------------------------------------|\n> | `azure.cosmos.connection-mode`        | `spring.cloud.azure.cosmos.connection-mode`        |\n> | `azure.cosmos.consistency-level`      | `spring.cloud.azure.cosmos.consistency-level`      |\n> | `azure.cosmos.database`               | `spring.cloud.azure.cosmos.database`               |\n> | `azure.cosmos.key`                    | `spring.cloud.azure.cosmos.key`                    |\n> | `azure.cosmos.populate-query-metrics` | `spring.cloud.azure.cosmos.populate-query-metrics` |\n> | `azure.cosmos.uri`                    | `spring.cloud.azure.cosmos.endpoint`               |\n\n### From `azure-spring-boot-starter-keyvault-secrets` to `spring-cloud-azure-starter-keyvault-secrets`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-starter-keyvault-secrets`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-keyvault-secrets) from version 3 of [`azure-spring-boot-starter-keyvault-secrets`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-keyvault-secrets).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### SDK configuration changes\n\nThis section includes the changes about the properties added, removed and changed.\n\nThe following table shows the property mappings from `azure-spring-boot-starter-keyvault-secrets` to `spring-cloud-azure-starter-keyvault-secrets`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties                     | Modern properties                                                                                                             |\n> |---------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|\n> | `azure.keyvault.case-sensitive-keys`  | `spring.cloud.azure.keyvault.secret.property-source[n].case-sensitive`                                                        |\n> | `azure.keyvault.certificate-password` | `spring.cloud.azure.keyvault.secret.property-source[n].credential.client-certificate-password`                                |\n> | `azure.keyvault.certificate-path`     | `spring.cloud.azure.keyvault.secret.property-source[n].credential.client-certificate-path`                                    |\n> | `azure.keyvault.client-id`            | `spring.cloud.azure.keyvault.secret.property-source[n].credential.client-id`                                                  |\n> | `azure.keyvault.client-key`           | `spring.cloud.azure.keyvault.secret.property-source[n].credential.client-secret`                                              |\n> | `azure.keyvault.enabled`              | `spring.cloud.azure.keyvault.secret.property-source-enabled` and `spring.cloud.azure.keyvault.secret.property-source-enabled` |\n> | `azure.keyvault.order`                | No longer supported. Use the order in `property-source[n]` instead.                                                           |\n> | `azure.keyvault.refresh-interval`     | `spring.cloud.azure.keyvault.secret.property-source[n].refresh-interval`                                                      |\n> | `azure.keyvault.secret-keys`          | `spring.cloud.azure.keyvault.secret.property-source[n].secret-keys`                                                           |\n> | `azure.keyvault.tenant-id`            | `spring.cloud.azure.keyvault.secret.property-source[n].profile.tenant-id`                                                     |\n> | `azure.keyvault.uri`                  | `spring.cloud.azure.keyvault.secret.property-source[n].endpoint`                                                              |\n\n* Removed properties from `spring-cloud-azure-starter-keyvault-secrets`:\n\n  * `azure.keyvault.allow-telemetry`\n  * `azure.keyvault.order`\n\nThe following points you should pay your attention to:\n\n1.  All configuration property names changed the prefix from `azure.keyvault` to `spring.cloud.azure.keyvault.secret`.\n1. `spring.cloud.azure.keyvault.secret.enabled` is used to enable all Key Vault Secret features, include configure Key Vault secret client beans(like `SecretClient` and `SecretAsyncClient`) and add `KeyVaultPropertySource` in `ConfigurableEnvironment`.\n1. `spring.cloud.azure.keyvault.secret.property-source-enabled` is used to enable all `KeyVaultPropertySource`. It will take effect only when `spring.cloud.azure.keyvault.secret.enabled=true`.\n1. For Azure common properties(like `client`, `proxy`, `retry`, `credential`, `profile`) and Key Vault properties(like `endpoint`, `service-version`). If `spring.cloud.azure.keyvault.secret.property-sources[n].PROPERTY_NAME` isn't configured, `spring.cloud.azure.keyvault.secret.PROPERTY_NAME` will be used.\n1. `spring.cloud.azure.keyvault.secret.property-sources[n].resource` is specific to a unique Azure resource, so if it's not configured, it won't get value from other places.\n\n### From `azure-spring-boot-starter-servicebus-jms` to `spring-cloud-azure-starter-servicebus-jms`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-starter-servicebus-jms`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-servicebus-jms) from version 3 of [`azure-spring-boot-starter-servicebus-jms`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-servicebus-jms).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### SDK configuration changes\n\nConfiguration type for `spring.jms.servicebus.idle-timeout` changed from `long` (milliseconds) to `Duration` pattern for readability.\n\n### From `azure-spring-boot-starter-storage` to `spring-cloud-azure-starter-storage-blob`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-starter-storage-blob`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-storage-blob) from version 3 of [`azure-spring-boot-starter-storage`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-storage).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### SDK configuration changes\n\nAll configuration property names changed the prefix from `azure.storage` to `spring.cloud.azure.storage.blob`.\n\nThe following table shows the property mappings from `azure-spring-boot-starter-storage` to `spring-cloud-azure-starter-storage-blob`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties             | Modern properties                              |\n> |-------------------------------|------------------------------------------------|\n> | `azure.storage.account-name`  | `spring.cloud.azure.storage.blob.account-name` |\n> | `azure.storage.account-key`   | `spring.cloud.azure.storage.blob.account-key`  |\n> | `azure.storage.blob-endpoint` | `spring.cloud.azure.storage.blob.endpoint`     |\n\n#### API changes\n\nThe following table shows the class mappings from `azure-spring-boot-starter-storage` to `spring-cloud-azure-starter-storage-blob`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                          | Modern class                                                      |\n> |---------------------------------------------------------------------------------------|-------------------------------------------------------------------|\n> | `com.azure.spring.autoconfigure.storage.resource.AzureStorageProtocolResolver`        | `com.azure.spring.core.resource.AzureStorageBlobProtocolResolver` |\n> | `com.azure.spring.autoconfigure.storage.resource.BlobStorageResource`                 | `com.azure.spring.core.resource.StorageBlobResource`              |\n> | `com.azure.spring.autoconfigure.storage.resource.AzureStorageResourcePatternResolver` | `com.azure.spring.core.resource.AzureStorageBlobProtocolResolver` |\n\n### From `azure-spring-boot-starter-storage` to `spring-cloud-azure-starter-storage-file-share`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-starter-storage-file-share`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-storage-file-share) from version 3 of [`azure-spring-boot-starter-storage`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-boot-starter-storage).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### SDK configuration changes\n\nAll configuration property names changed the prefix from `azure.storage` to `spring.cloud.azure.storage.fileshare`.\n\nThe following table shows the property mappings from `azure-spring-boot-starter-storage` to `spring-cloud-azure-starter-storage-file-share`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties             | Modern properties                                   |\n> |-------------------------------|-----------------------------------------------------|\n> | `azure.storage.account-name`  | `spring.cloud.azure.storage.fileshare.account-name` |\n> | `azure.storage.account-key`   | `spring.cloud.azure.storage.fileshare.account-key`  |\n> | `azure.storage.file-endpoint` | `spring.cloud.azure.storage.fileshare.endpoint`     |\n\n#### API changes\n\nThe following table shows the class mappings from `azure-spring-boot-starter-storage` to `spring-cloud-azure-starter-storage-file-share`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                          | Modern class                                                      |\n> |---------------------------------------------------------------------------------------|-------------------------------------------------------------------|\n> | `com.azure.spring.autoconfigure.storage.resource.AzureStorageProtocolResolver`        | `com.azure.spring.core.resource.AzureStorageFileProtocolResolver` |\n> | `com.azure.spring.autoconfigure.storage.resource.FileStorageResource`                 | `com.azure.spring.core.resource.StorageFileResource`              |\n> | `com.azure.spring.autoconfigure.storage.resource.AzureStorageResourcePatternResolver` | `com.azure.spring.core.resource.AzureStorageFileProtocolResolver` |\n\n### From `azure-spring-cloud-starter-eventhubs` to `spring-cloud-azure-starter-integration-eventhubs`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-starter-integration-eventhubs`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-integration-eventhubs) from version 2 of [`azure-spring-cloud-starter-eventhubs`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-eventhubs).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### SDK configuration changes\n\n> [!IMPORTANT]\n> Configuration prefix has been changed from `spring.cloud.azure.eventhub` to `spring.cloud.azure.eventhubs`.\n\nFor changes to the child entries for this prefix, see the following tables:\n\nThe following table shows property mappings from `azure-spring-cloud-starter-eventhubs` to `spring-cloud-azure-starter-integration-eventhubs`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties                                        | Modern properties                                                        |\n> |----------------------------------------------------------|--------------------------------------------------------------------------|\n> | `spring.cloud.azure.resource-group`                      | `spring.cloud.azure.eventhubs.resource.resource-group`                   |\n> | `spring.cloud.azure.eventhub.namespace`                  | `spring.cloud.azure.eventhubs.namespace`                                 |\n> | `spring.cloud.azure.eventhub.connection-string`          | `spring.cloud.azure.eventhubs.connection-string`                         |\n> | `spring.cloud.azure.eventhub.checkpoint-storage-account` | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name`   |\n> | `spring.cloud.azure.eventhub.checkpoint-access-key`      | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-key`    |\n> | `spring.cloud.azure.eventhub.checkpoint-container`       | `spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name` |\n\nFor example, change from:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      eventhub:\n        connection-string: ${AZURE_EVENTHUBS_CONNECTION_STRING}\n        checkpoint-storage-account: ${AZURE_CHECKPOINT_STORAGE_ACCOUNT_NAME}\n        checkpoint-access-key: ${AZURE_CHECKPOINT_ACCOUNT_KEY}\n        checkpoint-container: ${AZURE_CHECKPOINT_CONTAINER_NAME}\n```\n\nto:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      eventhubs:\n        connection-string: ${AZURE_EVENTHUBS_CONNECTION_STRING}\n        processor:\n          checkpoint-store:\n            container-name: ${AZURE_STORAGE_CONTAINER_NAME}\n            account-name: ${AZURE_STORAGE_ACCOUNT_NAME}\n            account-key: ${AZURE_STORAGE_ACCOUNT_KEY}\n```\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\n#### API changes\n\n* For the changes to the listener annotations, see the migration guide of the <<migration-azure-spring-cloud-messaging, azure-spring-cloud-messaging>> library.\n* Drop `EventHubOperation` with the subscribing function moved to class `EventHubsMessageListenerContainer` and the sending function moved to `EventHubsTemplate`.\n* Rename `EventHubInboundChannelAdapter` as `EventHubsInboundChannelAdapter` to keep consistent with the service of Azure\n  Event Hubs.\n* Change the constructor from `EventHubInboundChannelAdapter(String, SubscribeByGroupOperation, String)` to `EventHubsInboundChannelAdapter(EventHubsMessageListenerContainer)` and `EventHubsInboundChannelAdapter(EventHubsMessageListenerContainer, ListenerMode)`.\n* Change `CheckpointConfig` instantiation style to the simple constructor instead of build style.\n* Drop API `EventHubOperation#setCheckpointConfig`. To set the checkpoint configuration for the inbound channel adapter, users can call the method `EventHubsContainerProperties#setCheckpointConfig`.\n* Drop API `EventHubOperation#setBatchConsumerConfig`. To set the batch-consuming configuration for the inbound channel adapter, users can call the two methods `EventHubsContainerProperties#getBatch#setMaxSize` and `EventHubsContainerProperties#getBatch#setMaxWaitTime` meanwhile.\n* For the batch consuming mode, change the message header names converted from batched messages.\n    * Change message header from `azure_eventhub_enqueued_time` to `azure_eventhubs_batch_converted_enqueued_time`.\n    * Change message header from `azure_eventhub_offset` to `azure_eventhubs_batch_converted_offset`.\n    * Change message header from `azure_eventhub_sequence_number` to `azure_eventhubs_batch_converted_sequence_number`.\n    * Change message header from `azure_partition_key` to `azure_batch_converted_partition_key`.\n* When publishing messages to Event Hubs, ignore all message headers converted from batched messages. Headers include:\n    * azure_batch_converted_partition_key\n    * azure_eventhubs_batch_converted_enqueued_time\n    * azure_eventhubs_batch_converted_offset\n    * azure_eventhubs_batch_converted_sequence_number\n    * azure_eventhubs_batch_converted_system_properties\n    * azure_eventhubs_batch_converted_application_properties\n* The `BATCH` checkpoint mode only works in the batch-consuming mode now, which can be enabled by passing `ListenerMode.BATCH` to EventHubsInboundChannelAdapter constructor.\n\nThe following table shows the class mappings from `azure-spring-cloud-starter-eventhubs` to `spring-cloud-azure-starter-integration-eventhubs`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                  | Modern class                                                                    |\n> |-------------------------------------------------------------------------------|---------------------------------------------------------------------------------|\n> | `com.azure.spring.integration.core.AzureHeaders`                              | `com.azure.spring.messaging.AzureHeaders`                                       |\n> | `com.azure.spring.integration.core.EventHubHeaders`                           | `com.azure.spring.messaging.eventhubs.support.EventHubsHeaders`                 |\n> | `com.azure.spring.integration.core.api.CheckpointConfig`                      | `com.azure.spring.messaging.eventhubs.core.checkpoint.CheckpointConfig`         |\n> | `com.azure.spring.integration.core.api.CheckpointMode`                        | `com.azure.spring.messaging.eventhubs.core.checkpoint.CheckpointMode`           |\n> | `com.azure.spring.integration.core.api.reactor.Checkpointer`                  | `com.azure.spring.messaging.checkpoint.Checkpointer`                            |\n> | `com.azure.spring.integration.core.api.reactor.DefaultMessageHandler`         | `com.azure.spring.integration.core.handler.DefaultMessageHandler`               |\n> | `com.azure.spring.integration.eventhub.inbound.EventHubInboundChannelAdapter` | `com.azure.spring.integration.eventhubs.inbound.EventHubsInboundChannelAdapter` |\n\n#### Sample code snippet\n\n* `EventHubsInboundChannelAdapter` sample code:\n\n  Legacy code:\n\n  ```java\n  public class Demo {\n      @Bean\n      public EventHubInboundChannelAdapter messageChannelAdapter(\n          @Qualifier(\"INPUT_CHANNEL\") MessageChannel inputChannel, EventHubOperation   eventhubOperation) {\n          eventhubOperation.setCheckpointConfig(CheckpointConfig.builder().checkpointMode  (CheckpointMode.MANUAL).build());\n          EventHubInboundChannelAdapter adapter = new EventHubInboundChannelAdapter(\"EVENTHUB_NAME\",\n              eventhubOperation, \"CONSUMER_GROUP\");\n          adapter.setOutputChannel(inputChannel);\n          return adapter;\n      }\n  }\n  ```\n\n  Modern code:\n\n  ```java\n  public class Demo {\n      @Bean\n      public EventHubsMessageListenerContainer messageListenerContainer(EventHubsProcessorFactory processorFactory) {\n          EventHubsContainerProperties containerProperties = new EventHubsContainerProperties();\n          containerProperties.setEventHubName(\"EVENTHUB_NAME\");\n          containerProperties.setConsumerGroup(\"CONSUMER_GROUP\");\n          CheckpointConfig config = new CheckpointConfig(CheckpointMode.MANUAL);\n          containerProperties.setCheckpointConfig(config);\n          return new EventHubsMessageListenerContainer(processorFactory, containerProperties);\n      }\n\n      @Bean\n      public EventHubsInboundChannelAdapter messageChannelAdapter(@Qualifier(\"INPUT_CHANNEL\") MessageChannel inputChannel,\n                                                                  EventHubsMessageListenerContainer listenerContainer) {\n          EventHubsInboundChannelAdapter adapter = new EventHubsInboundChannelAdapter(listenerContainer);\n          adapter.setOutputChannel(inputChannel);\n          return adapter;\n      }\n  }\n  ```\n\n* `DefaultMessageHandler` sample code:\n\n  Legacy code:\n\n  ```java\n  public class Demo {\n      @Bean\n      @ServiceActivator(inputChannel = \"OUTPUT_CHANNEL\")\n      public MessageHandler messageSender(EventHubOperation eventhubOperation) {\n          DefaultMessageHandler handler = new DefaultMessageHandler(\"EVENTHUB_NAME\", eventhubOperation);\n          handler.setSendCallback(new ListenableFutureCallback<Void>() {\n              @Override\n              public void onSuccess(Void result) {\n                  LOGGER.info(\"Message was sent successfully.\");\n              }\n\n              @Override\n              public void onFailure(Throwable ex) {\n                  LOGGER.error(\"There was an error sending the message.\", ex);\n              }\n          });\n          return handler;\n      }\n  }\n  ```\n\n  Modern code:\n\n  ```java\n  public class Demo {\n      @Bean\n      @ServiceActivator(inputChannel = \"OUTPUT_CHANNEL\")\n      public MessageHandler messageSender(EventHubsTemplate eventhubOperation) {\n          DefaultMessageHandler handler = new DefaultMessageHandler(\"EVENTHUB_NAME\", eventhubOperation);\n          handler.setSendCallback(new ListenableFutureCallback<Void>() {\n              @Override\n              public void onSuccess(Void result) {\n                  LOGGER.info(\"Message was sent successfully.\");\n              }\n\n              @Override\n              public void onFailure(Throwable ex) {\n                  LOGGER.error(\"There was an error sending the message.\", ex);\n              }\n          });\n\n          return handler;\n      }\n  }\n  ```\n\n### From `azure-spring-integration-eventhubs` to `spring-integration-azure-eventhubs`\n\nThis guide is intended to assist in the migration to [`spring-integration-azure-eventhubs`](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-eventhubs) from version 2 of [`azure-spring-integration-eventhubs`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-eventhubs).\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n\n#### API changes\n\n* Drop `EventHubOperation` with the subscribing function moved to class `EventHubsMessageListenerContainer` and the sending function moved to `EventHubsTemplate`.\n* Rename `EventHubInboundChannelAdapter` as `EventHubsInboundChannelAdapter` to keep consistent with the service of Azure Event Hubs.\n* Change the constructor from `EventHubInboundChannelAdapter(String, SubscribeByGroupOperation, String)` to `EventHubsInboundChannelAdapter(EventHubsMessageListenerContainer)` and `EventHubsInboundChannelAdapter(EventHubsMessageListenerContainer, ListenerMode)`.\n* Change `CheckpointConfig` instantiation style to the simple constructor instead of build style.\n* Drop API `EventHubOperation#setCheckpointConfig`. To set the checkpoint configuration for the inbound channel adapter, users can call the method `EventHubsContainerProperties#setCheckpointConfig`.\n* Drop API `EventHubOperation#setBatchConsumerConfig`. To set the batch-consuming configuration for the inbound channel adapter, users can call the two methods `EventHubsContainerProperties#getBatch#setMaxSize` and `EventHubsContainerProperties#getBatch#setMaxWaitTime` meanwhile.\n* For the batch consuming mode, change the message header names converted from batched messages.\n  * Change message header from `azure_eventhub_enqueued_time` to `azure_eventhubs_batch_converted_enqueued_time`.\n  * Change message header from `azure_eventhub_offset` to `azure_eventhubs_batch_converted_offset`.\n  * Change message header from `azure_eventhub_sequence_number` to `azure_eventhubs_batch_converted_sequence_number`.\n  * Change message header from `azure_partition_key` to `azure_batch_converted_partition_key`.\n* When publishing messages to Event Hubs, ignore all message headers converted from batched messages. Headers include:\n  * azure_batch_converted_partition_key\n  * azure_eventhubs_batch_converted_enqueued_time\n  * azure_eventhubs_batch_converted_offset\n  * azure_eventhubs_batch_converted_sequence_number\n  * azure_eventhubs_batch_converted_system_properties\n  * azure_eventhubs_batch_converted_application_properties\n* The `BATCH` checkpoint mode only works in the batch-consuming mode now, which can be enabled by passing `ListenerMode.BATCH` to EventHubsInboundChannelAdapter constructor.\n\nThe following table shows the class mappings from `azure-spring-integration-eventhubs ` to `spring-integration-azure-eventhubs`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                  | Modern class                                                                    |\n> |-------------------------------------------------------------------------------|---------------------------------------------------------------------------------|\n> | `com.azure.spring.integration.core.AzureHeaders`                              | `com.azure.spring.messaging.AzureHeaders`                                       |\n> | `com.azure.spring.integration.core.EventHubHeaders`                           | `com.azure.spring.messaging.eventhubs.support.EventHubsHeaders`                 |\n> | `com.azure.spring.integration.core.api.CheckpointConfig`                      | `com.azure.spring.messaging.eventhubs.core.checkpoint.CheckpointConfig`         |\n> | `com.azure.spring.integration.core.api.CheckpointMode`                        | `com.azure.spring.messaging.eventhubs.core.checkpoint.CheckpointMode`           |\n> | `com.azure.spring.integration.core.api.reactor.Checkpointer`                  | `com.azure.spring.messaging.checkpoint.Checkpointer`                            |\n> | `com.azure.spring.integration.core.api.reactor.DefaultMessageHandler`         | `com.azure.spring.integration.core.handler.DefaultMessageHandler`               |\n> | `com.azure.spring.integration.eventhub.inbound.EventHubInboundChannelAdapter` | `com.azure.spring.integration.eventhubs.inbound.EventHubsInboundChannelAdapter` |\n\n### From `azure-spring-cloud-starter-servicebus` to `spring-cloud-azure-starter-integration-servicebus`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-starter-integration-servicebus`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-integration-servicebus) from version 2 of [`azure-spring-cloud-starter-servicebus`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-servicebus).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### SDK configuration changes\n\nFor all configuration options supported in `spring-cloud-azure-starter-integration-servicebus`, the prefix remains as `spring.cloud.azure.servicebus`.\n\nThe following table shows the property mappings from `azure-spring-cloud-starter-servicebus` to `spring-cloud-azure-starter-integration-servicebus`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties                                         | Modern properties                                                                                                                                                                                                                 |\n> |-----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.resource-group`                       | `spring.cloud.azure.servicebus.resource.resource-group`                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.transport-type`            | `spring.cloud.azure.servicebus.client.transport-type`                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.retry-options.retry-mode`  | `spring.cloud.azure.servicebus.retry.mode`                                                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.retry-options.max-retries` | `spring.cloud.azure.servicebus.retry.exponential.max-retries` or `spring.cloud.azure.servicebus.retry.fixed.max-retries`, should be configured depending on `spring.cloud.azure.servicebus.retry.mode` = `fixed` or `exponential` |\n> | `spring.cloud.azure.servicebus.retry-options.delay`       | `spring.cloud.azure.servicebus.retry.exponential.base-delay` or `spring.cloud.azure.servicebus.retry.fixed.delay`, should be configured depending on `spring.cloud.azure.servicebus.retry.mode` = `fixed` or `exponential`        |\n> | `spring.cloud.azure.servicebus.retry-options.max-delay`   | `spring.cloud.azure.servicebus.retry.exponential.max-delay`                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.retry-options.try-timeout` | `spring.cloud.azure.servicebus.retry.try-timeout`                                                                                                                                                                                 |\n\n#### API changes\n\n* Drop `ServiceBusQueueOperation` and `ServiceBusTopicOperation` with the subscribing function moved to class `ServiceBusMessageListenerContainer` and the sending function moved to `ServiceBusTemplate`.\n* Drop `ServiceBusQueueInboundChannelAdapter` and `ServiceBusTopicInboundChannelAdapter`, and move the functionality to listen to a Service Bus queue/topic entity to ServiceBusInboundChannelAdapter.\n* Change the constructor from `ServiceBusQueueInboundChannelAdapter(String, SubscribeByGroupOperation, String)` to `ServiceBusInboundChannelAdapter(ServiceBusMessageListenerContainer)` and `ServiceBusInboundChannelAdapter(ServiceBusMessageListenerContainer, ListenerMode)`.\n* Change the constructor from `ServiceBusTopicInboundChannelAdapter(String, SubscribeByGroupOperation, String)` to `ServiceBusInboundChannelAdapter(ServiceBusMessageListenerContainer)` and `ServiceBusInboundChannelAdapter(ServiceBusMessageListenerContainer, ListenerMode)`.\n* Drop APIs `ServiceBusQueueOperation#setCheckpointConfig` and `ServiceBusTopicOperation#setCheckpointConfig`. To set the checkpoint configuration for the inbound channel adapter, users can call the method `ServiceBusContainerProperties#setAutoComplete` instead. To disable the auto-complete mode is equivalent to `MANUAL` checkpoint mode and to enable it will trigger the `RECORD` mode.\n* Drop APIs `ServiceBusQueueOperatio#setClientConfig` and `ServiceBusTopicOperation#setClientConfig`. To configure the underlying `ServiceBusProcessorClient` used by the inbound channel adapter, users can use `ServiceBusContainerProperties` instead.\n* Drop `CompletableFuture` support in `ServiceBusTemplate` and `DefaultMessageHandler`, support `Reactor` instead.\n* Add new API of `ServiceBusTemplate#setDefaultEntityType` to specify the entity type, which is required when no bean of `PropertiesSupplier&lt;String, ProducerProperties&gt;` is provided for the `ProducerProperties#entityType`.\n* Drop message header `AzureHeaders.RAW_ID`. Use `ServiceBusMessageHeaders.MESSAGE_ID` instead.\n\nThe following table shows the class mappings from `azure-spring-cloud-starter-servicebus` to `spring-cloud-azure-starter-integration-servicebus`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                           | Modern class                                                                         |\n> |----------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|\n> | `com.azure.spring.integration.core.AzureHeaders`                                       | `com.azure.spring.messaging.AzureHeaders`                                            |\n> | `com.azure.spring.integration.servicebus.converter.ServiceBusMessageHeaders`           | `com.azure.spring.messaging.servicebus.support.ServiceBusMessageHeaders`             |\n> | `com.azure.spring.integration.servicebus.converter.ServiceBusMessageConverter`         | `com.azure.spring.messaging.servicebus.support.converter.ServiceBusMessageConverter` |\n> | `com.azure.spring.integration.core.DefaultMessageHandler`                              | `com.azure.spring.integration.core.handler.DefaultMessageHandler`                    |\n> | `com.azure.spring.integration.servicebus.inbound.ServiceBusQueueInboundChannelAdapter` | `com.azure.spring.integration.servicebus.inbound.ServiceBusInboundChannelAdapter`    |\n> | `com.azure.spring.integration.servicebus.inbound.ServiceBusTopicInboundChannelAdapter` | `com.azure.spring.integration.servicebus.inbound.ServiceBusInboundChannelAdapter`    |\n\n#### Sample code snippet\n\n* `ServiceBusInboundChannelAdapter` sample code:\n\n  Legacy code of using `ServiceBusQueueInboundChannelAdapter` or `ServiceBusTopicInboundChannelAdapter`:\n\n  ```java\n  public class Demo {\n      @Bean\n      public ServiceBusQueueInboundChannelAdapter queueMessageChannelAdapter(\n          @Qualifier(\"INPUT_CHANNEL_NAME\") MessageChannel inputChannel, ServiceBusQueueOperation queueOperation) {\n          queueOperation.setCheckpointConfig(CheckpointConfig.builder().checkpointMode(CheckpointMode.MANUAL).build());\n          ServiceBusQueueInboundChannelAdapter adapter = new ServiceBusQueueInboundChannelAdapter(\"QUEUE_NAME\",\n              queueOperation);\n          adapter.setOutputChannel(inputChannel);\n          return adapter;\n      }\n\n      @Bean\n      public ServiceBusTopicInboundChannelAdapter topicMessageChannelAdapter(\n          @Qualifier(\"INPUT_CHANNEL_NAME\") MessageChannel inputChannel, ServiceBusTopicOperation topicOperation) {\n          topicOperation.setCheckpointConfig(CheckpointConfig.builder().checkpointMode(CheckpointMode.MANUAL).build());\n          ServiceBusTopicInboundChannelAdapter adapter = new ServiceBusTopicInboundChannelAdapter(\"TOPIC_NAME\",\n              topicOperation, \"SUBSCRIPTION_NAME\");\n          adapter.setOutputChannel(inputChannel);\n          return adapter;\n      }\n\n  }\n  ```\n\n  Modern code:\n\n  ```java\n  public class Demo {\n      @Bean(\"queue-listener-container\")\n      public ServiceBusMessageListenerContainer messageListenerContainer(ServiceBusProcessorFactory processorFactory) {\n          ServiceBusContainerProperties containerProperties = new ServiceBusContainerProperties();\n          containerProperties.setEntityName(\"QUEUE_NAME\");\n          containerProperties.setAutoComplete(false);\n          return new ServiceBusMessageListenerContainer(processorFactory, containerProperties);\n      }\n\n      @Bean\n      public ServiceBusInboundChannelAdapter queueMessageChannelAdapter(\n          @Qualifier(\"INPUT_CHANNEL\") MessageChannel inputChannel,\n          @Qualifier(\"queue-listener-container\") ServiceBusMessageListenerContainer listenerContainer) {\n          ServiceBusInboundChannelAdapter adapter = new ServiceBusInboundChannelAdapter(listenerContainer);\n          adapter.setOutputChannel(inputChannel);\n          return adapter;\n      }\n\n      @Bean(\"topic-listener-container\")\n      public ServiceBusMessageListenerContainer messageListenerContainer(ServiceBusProcessorFactory processorFactory) {\n          ServiceBusContainerProperties containerProperties = new ServiceBusContainerProperties();\n          containerProperties.setEntityName(\"TOPIC_NAME\");\n          containerProperties.setSubscriptionName(\"SUBSCRIPTION_NAME\");\n          containerProperties.setAutoComplete(false);\n          return new ServiceBusMessageListenerContainer(processorFactory, containerProperties);\n      }\n\n      @Bean\n      public ServiceBusInboundChannelAdapter topicMessageChannelAdapter(\n          @Qualifier(\"INPUT_CHANNEL\") MessageChannel inputChannel,\n          @Qualifier(\"topic-listener-container\") ServiceBusMessageListenerContainer listenerContainer) {\n          ServiceBusInboundChannelAdapter adapter = new ServiceBusInboundChannelAdapter(listenerContainer);\n          adapter.setOutputChannel(inputChannel);\n          return adapter;\n      }\n  }\n  ```\n\n* `DefaultMessageHandler` sample code:\n\n  Legacy code, taking queue as example:\n\n  ```java\n  public class Demo {\n      @Bean\n      @ServiceActivator(inputChannel = \"OUTPUT_CHANNEL_NAME\")\n      public MessageHandler queueMessageSender(ServiceBusQueueOperation queueOperation) {\n          DefaultMessageHandler handler = new DefaultMessageHandler(\"QUEUE_NAME\", queueOperation);\n          handler.setSendCallback(new ListenableFutureCallback<Void>() {\n              @Override\n              public void onSuccess(Void result) {\n                  LOGGER.info(\"Message was sent successfully.\");\n              }\n              @Override\n              public void onFailure(Throwable ex) {\n                  LOGGER.info(\"There was an error sending the message.\");\n              }\n          });\n          return handler;\n      }\n  }\n  ```\n\n  Modern code:\n\n  ```java\n  public class Demo {\n\n      @Bean\n      @ServiceActivator(inputChannel = \"OUTPUT_CHANNEL_NAME\")\n      public MessageHandler queueMessageSender(ServiceBusTemplate serviceBusTemplate) {\n          serviceBusTemplate.setDefaultEntityType(ServiceBusEntityType.QUEUE);\n          DefaultMessageHandler handler = new DefaultMessageHandler(\"QUEUE_NAME\", serviceBusTemplate);\n          handler.setSendCallback(new ListenableFutureCallback<Void>() {\n              @Override\n              public void onSuccess(Void result) {\n                  LOGGER.info(\"Message was sent successfully for {}.\", \"QUEUE_NAME\");\n              }\n\n              @Override\n              public void onFailure(Throwable ex) {\n                  LOGGER.info(\"There was an error sending the message.\");\n              }\n          });\n\n          return handler;\n      }\n  }\n  ```\n\n### From `azure-spring-integration-servicebus` to `spring-integration-azure-servicebus`\n\nThis guide is intended to assist in the migration to [`spring-integration-azure-servicebus`](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-servicebus) from version 2 of [`azure-spring-integration-servicebus`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-servicebus).\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n\n#### API changes\n\n* Drop `ServiceBusQueueOperation` and `ServiceBusTopicOperation` with the subscribing function moved to class `ServiceBusMessageListenerContainer` and the sending function moved to `ServiceBusTemplate`.\n* Drop `ServiceBusQueueInboundChannelAdapter` and `ServiceBusTopicInboundChannelAdapter`, and move the functionality to listen to a Service Bus queue/topic entity to ServiceBusInboundChannelAdapter.\n* Change the constructor from `ServiceBusQueueInboundChannelAdapter(String, SubscribeByGroupOperation, String)` to `ServiceBusInboundChannelAdapter(ServiceBusMessageListenerContainer)` and `ServiceBusInboundChannelAdapter(ServiceBusMessageListenerContainer, ListenerMode)`.\n* Change the constructor from `ServiceBusTopicInboundChannelAdapter(String, SubscribeByGroupOperation, String)` to `ServiceBusInboundChannelAdapter(ServiceBusMessageListenerContainer)` and `ServiceBusInboundChannelAdapter(ServiceBusMessageListenerContainer, ListenerMode)`.\n* Drop APIs `ServiceBusQueueOperation#setCheckpointConfig` and `ServiceBusTopicOperation#setCheckpointConfig`. To set the checkpoint configuration for the inbound channel adapter, users can call the method `ServiceBusContainerProperties#setAutoComplete` instead. To disable the auto-complete mode is equivalent to `MANUAL` checkpoint mode and to enable it will trigger the `RECORD` mode.\n* Drop APIs `ServiceBusQueueOperation#setClientConfig` and `ServiceBusTopicOperation#setClientConfig`. To configure the underlying `ServiceBusProcessorClient` used by the inbound channel adapter, users can use `ServiceBusContainerProperties` instead.\n* Drop `CompletableFuture` support in `ServiceBusTemplate` and `DefaultMessageHandler`, support `Reactor` instead.\n* Add new API of `ServiceBusTemplate#setDefaultEntityType` to specify the entity type, which is required when no bean of `PropertiesSupplier&lt;String, ProducerProperties&gt;` is provided for the `ProducerProperties#entityType`.\n* Drop message header `AzureHeaders.RAW_ID`. Use `ServiceBusMessageHeaders.MESSAGE_ID` instead.\n\nThe following table shows the class mappings from `azure-spring-integration-servicebus` to `spring-integration-azure-servicebus`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                           | Modern class                                                                         |\n> |----------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|\n> | `com.azure.spring.integration.core.AzureHeaders`                                       | `com.azure.spring.messaging.AzureHeaders`                                            |\n> | `com.azure.spring.integration.servicebus.converter.ServiceBusMessageHeaders`           | `com.azure.spring.messaging.servicebus.support.ServiceBusMessageHeaders`             |\n> | `com.azure.spring.integration.servicebus.converter.ServiceBusMessageConverter`         | `com.azure.spring.messaging.servicebus.support.converter.ServiceBusMessageConverter` |\n> | `com.azure.spring.integration.core.DefaultMessageHandler`                              | `com.azure.spring.integration.core.handler.DefaultMessageHandler`                    |\n> | `com.azure.spring.integration.servicebus.inbound.ServiceBusQueueInboundChannelAdapter` | `com.azure.spring.integration.servicebus.inbound.ServiceBusInboundChannelAdapter`    |\n> | `com.azure.spring.integration.servicebus.inbound.ServiceBusTopicInboundChannelAdapter` | `com.azure.spring.integration.servicebus.inbound.ServiceBusInboundChannelAdapter`    |\n\n### From `azure-spring-cloud-starter-storage-queue` to `spring-cloud-azure-starter-integration-storage-queue`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-starter-integration-storage-queue`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-starter-integration-storage-queue) from version 2 of [`azure-spring-cloud-starter-storage-queue`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-starter-storage-queue).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### SDK configuration changes\n\nAll configuration property names changed the prefix from `spring.cloud.azure.storage` to `spring.cloud.azure.storage.queue`.\n\nThe following table shows the property mappings from `azure-spring-cloud-starter-storage-queue` to `spring-cloud-azure-starter-integration-storage-queue`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties                           | Modern properties                                          |\n> |---------------------------------------------|------------------------------------------------------------|\n> | `spring.cloud.azure.storage.account`        | `spring.cloud.azure.storage.queue.account-name`            |\n> | `spring.cloud.azure.storage.access-key`     | `spring.cloud.azure.storage.queue.account-key`             |\n> | `spring.cloud.azure.storage.resource-group` | `spring.cloud.azure.storage.queue.resource.resource-group` |\n\n#### API changes\n\n* Drop `StorageQueueOperation` and provide `StorageQueueTemplate` instead.\n* Drop `checkpoint-mode` configuration in `StorageQueueTemplate`, only support the `MANUAL` mode.\n\nThe following table shows the class mappings from `azure-spring-cloud-starter-storage-queue` to `spring-cloud-azure-starter-integration-storage-queue`.\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                        | Modern class                                                                              |\n> |-------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|\n> | `com.azure.spring.integration.core.AzureHeaders`                                    | `com.azure.spring.messaging.AzureHeaders`                                                 |\n> | `com.azure.spring.integration.storage.queue.converter.StorageQueueMessageConverter` | `com.azure.spring.messaging.storage.queue.support.converter.StorageQueueMessageConverter` |\n> | `com.azure.spring.integration.core.api.reactor.Checkpointer`                        | `com.azure.spring.messaging.checkpoint.Checkpointer`                                      |\n> | `com.azure.spring.integration.storage.queue.StorageQueueTemplate`                   | `com.azure.spring.storage.queue.core.StorageQueueTemplate`                                |\n> | `com.azure.spring.integration.core.api.reactor.DefaultMessageHandler`               | `com.azure.spring.integration.core.handler.DefaultMessageHandler`                         |\n> | `com.azure.spring.integration.storage.queue.inbound.StorageQueueMessageSource`      | `com.azure.spring.integration.storage.queue.inbound.StorageQueueMessageSource`            |\n\n### From `azure-spring-integration-storage-queue` to `spring-integration-azure-storage-queue`\n\nThis guide is intended to assist in the migration to [`spring-integration-azure-storage-queue`](https://central.sonatype.com/artifact/com.azure.spring/spring-integration-azure-storage-queue) from version 2 of [`azure-spring-integration-storage-queue`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-integration-storage-queue).\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n\n#### API changes\n\n* Drop `StorageQueueOperation` and provide `StorageQueueTemplate` instead.\n* Drop `checkpoint-mode` configuration in `StorageQueueTemplate`, only support the `MANUAL` mode.\n\nThe following table shows the class mappings from `azure-spring-integration-storage-queue` to `spring-integration-azure-storage-queue`.\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                        | Modern class                                                                              |\n> |-------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------|\n> | `com.azure.spring.integration.core.AzureHeaders`                                    | `com.azure.spring.messaging.AzureHeaders`                                                 |\n> | `com.azure.spring.integration.storage.queue.converter.StorageQueueMessageConverter` | `com.azure.spring.messaging.storage.queue.support.converter.StorageQueueMessageConverter` |\n> | `com.azure.spring.integration.core.api.reactor.Checkpointer`                        | `com.azure.spring.messaging.checkpoint.Checkpointer`                                      |\n> | `com.azure.spring.integration.storage.queue.StorageQueueTemplate`                   | `com.azure.spring.storage.queue.core.StorageQueueTemplate`                                |\n> | `com.azure.spring.integration.core.api.reactor.DefaultMessageHandler`               | `com.azure.spring.integration.core.handler.DefaultMessageHandler`                         |\n> | `com.azure.spring.integration.storage.queue.inbound.StorageQueueMessageSource`      | `com.azure.spring.integration.storage.queue.inbound.StorageQueueMessageSource`            |\n\n### From `azure-spring-cloud-stream-binder-eventhubs` to `spring-cloud-azure-stream-binder-eventhubs`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-stream-binder-eventhubs`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-eventhubs) from version 2 of [`azure-spring-cloud-stream-binder-eventhubs`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-eventhubs).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### SDK configuration changes\n\n> [!IMPORTANT]\n> Configuration prefix has been changed from `spring.cloud.azure.eventhub` to `spring.cloud.azure.eventhubs`.\n\n> [!IMPORTANT]\n> The binder type is renamed from: `eventhub` to `eventhubs`.\n\nFor changes to the child entries for the following prefix, see the following table.\n\nThe following table shows property mappings from `azure-spring-cloud-stream-binder-eventhubs` to `spring-cloud-azure-stream-binder-eventhubs`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties                                                                 | Modern properties                                                                               |\n> |-----------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.resource-group`                                               | `spring.cloud.azure.eventhubs.resource.resource-group`                                          |\n> | `spring.cloud.azure.eventhub.namespace`                                           | `spring.cloud.azure.eventhubs.namespace`                                                        |\n> | `spring.cloud.azure.eventhub.connection-string`                                   | `spring.cloud.azure.eventhubs.connection-string`                                                |\n> | `spring.cloud.azure.eventhub.checkpoint-storage-account`                          | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name`                          |\n> | `spring.cloud.azure.eventhub.checkpoint-access-key`                               | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-key`                           |\n> | `spring.cloud.azure.eventhub.checkpoint-container`                                | `spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name`                        |\n> | `spring.cloud.stream.eventhub.bindings.binding-name.consumer.max-batch-size`      | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.batch.max-size`                   |\n> | `spring.cloud.stream.eventhub.bindings.binding-name.consumer.max-wait-time`       | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.batch.max-wait-time`              |\n> | `spring.cloud.stream.eventhub.bindings.binding-name.consumer.checkpoint-mode`     | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.checkpoint.mode`                  |\n> | `spring.cloud.stream.eventhub.bindings.binding-name.consumer.checkpoint-count`    | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.checkpoint.count`                 |\n> | `spring.cloud.stream.eventhub.bindings.binding-name.consumer.checkpoint-interval` | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.checkpoint.interval`              |\n> | `spring.cloud.stream.eventhub.bindings.binding-name.consumer.start-position`      | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.initial-partition-event-position` |\n\n> [!NOTE]\n> The value type of the `start-position` configuration is also changed from an enum of `com.azure.spring.integration.core.api.StartPosition` to a `map` of `StartPositionProperties` for each partition. Thus, the key is the partition ID, and the value is of `com.azure.spring.cloud.service.eventhubs.properties.StartPositionProperties` which includes properties of offset, sequence number, enqueued date time and whether inclusive.\n\nConfiguration migration examples\n\nTo use the connection string for authentication and migrate the above mentioned properties, configuration changes are listed the follows:\n\nLegacy configuration:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      eventhub:\n        connection-string: ${AZURE_EVENTHUBS_CONNECTION_STRING}\n        checkpoint-storage-account: ${AZURE_CHECKPOINT_STORAGE_ACCOUNT_NAME}\n        checkpoint-access-key: ${AZURE_CHECKPOINT_ACCOUNT_KEY}\n        checkpoint-container: ${AZURE_CHECKPOINT_CONTAINER_NAME}\n    stream:\n      eventhub:\n        bindings:\n          <binding-name>:\n            consumer:\n              max-batch-size: ${AZURE_MAX_BATCH_SIZE}\n              max-wait-time: ${AZURE_MAX_WAIT_TIME}\n              checkpoint-mode: ${AZURE_CHECKPOINT_MODE}\n              checkpoint-count: ${AZURE_CHECKPOINT_COUNT}\n              checkpoint-interval: ${AZURE_CHECKPOINT_INTERVAL}\n              start-position: EARLIEST\n```\n\nModern configuration:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      eventhubs:\n        connection-string: ${AZURE_EVENTHUBS_CONNECTION_STRING}\n        processor:\n          checkpoint-store:\n            container-name: ${AZURE_STORAGE_CONTAINER_NAME}\n            account-name:  ${AZURE_STORAGE_ACCOUNT_NAME}\n            account-key: ${AZURE_STORAGE_ACCOUNT_KEY}\n    stream:\n      eventhubs:\n        bindings:\n          <binding-name>:\n            consumer:\n              batch:\n                max-size: ${AZURE_MAX_BATCH_SIZE}\n                max-wait-time: ${AZURE_MAX_WAIT_TIME}\n              checkpoint:\n                mode: ${AZURE_CHECKPOINT_MODE}\n                count: ${AZURE_CHECKPOINT_COUNT}\n                interval: ${AZURE_CHECKPOINT_INTERVAL}\n              initial-partition-event-position:\n                0:\n                  offset: earliest\n                1:\n                  sequence-number: 100\n                2:\n                  enqueued-date-time: 2022-01-12T13:32:47.650005Z\n                4:\n                  inclusive: false\n```\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\nIf you use security principals instead of connection strings, in versions before 4.0 the application will firstly connect to Azure Resource Manager (ARM) with the provided security principal, and then retrieve the connection string of the specified namespace with ARM. In the end the application uses the retrieved connection string to connect to Azure Event Hubs. In this way the provided security principal should be granted with the [Contributor](/azure/role-based-access-control/built-in-roles#contributor) role to retrieve of the associated Azure Event Hubs namespace.\n\nFor Azure Spring Apps 4.0, we provide two ways of leveraging security principals for authentication. One is still using the principals to connect to ARM and retrieve the connection strings where the `Contributor` role is required for the principals. The other leverages security principals to authenticate to Microsoft Entra ID and then connect to Azure Event Hubs directly. In this case, the `Contributor` role isn't necessary anymore, while other `Data` related roles are required for messaging operations. To make sure the security principal has been granted the sufficient permission to access the Azure resource, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id).\n\nFor authentication based on ARM, taking service principal as example, configuration migration is listed the follows, where the assigned role should not change:\n\nLegacy configuration:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      client-id: ${AZURE_CLIENT_ID}\n      client-secret: ${AZURE_CLIENT_SECRET}\n      tenant-id: <tenant>\n      resource-group: ${EVENTHUB_RESOURCE_GROUP}\n      eventhub:\n        namespace: ${EVENTHUB_NAMESPACE}\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nModern configuration, properties for Azure subscription ID and resource group are required:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      credential:\n        client-id: ${AZURE_CLIENT_ID}\n        client-secret: ${AZURE_CLIENT_SECRET}\n      profile:\n        tenant-id: <tenant>\n        subscription-id: ${AZURE_SUBSCRIPTION_ID}\n      eventhubs:\n        namespace: ${EVENTHUB_NAMESPACE}\n        resource:\n          resource-group: ${RESOURCE_GROUP}\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nYou can also migrate to authenticate and authorize with Microsoft Entra ID directly without making a detour to ARM. Make sure to grant the security principal necessary `Data` roles for messaging operations. The configuration examples of the service principal and the managed identity are listed the follows:\n\n* With a service principal\n\n  ```yaml\n  spring:\n    cloud:\n      azure:\n        credential:\n          client-id: ${AZURE_CLIENT_ID}\n          client-secret: ${AZURE_CLIENT_SECRET}\n        profile:\n          tenant-id: <tenant>\n        eventhubs:\n          namespace: ${EVENTHUB_NAMESPACE}\n  ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n* With a managed identity\n\n  ```yaml\n  spring:\n    cloud:\n      azure:\n        credential:\n          managed-identity-enabled: true\n          client-id: ${AZURE_MANAGED_IDENTITY_CLIENT_ID} # Only needed when using a user-assigned managed identity\n        eventhubs:\n          namespace: ${EVENTHUB_NAMESPACE}\n  ```\n\n#### API changes\n\nThe following table shows the class mappings from `azure-spring-cloud-stream-binder-eventhubs` to `spring-cloud-azure-stream-binder-eventhubs`.\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                 | Modern class                                                    |\n> |--------------------------------------------------------------|-----------------------------------------------------------------|\n> | `com.azure.spring.integration.core.api.reactor.Checkpointer` | `com.azure.spring.messaging.checkpoint.Checkpointer`            |\n> | `com.azure.spring.integration.core.AzureHeaders`             | `com.azure.spring.messaging.AzureHeaders`                       |\n> | `com.azure.spring.integration.core.EventHubHeaders`          | `com.azure.spring.messaging.eventhubs.support.EventHubsHeaders` |\n\n### From `azure-spring-cloud-stream-binder-servicebus-*` to `spring-cloud-azure-stream-binder-servicebus`\n\nThis guide is intended to assist in the migration to [`spring-cloud-azure-stream-binder-servicebus`](https://central.sonatype.com/artifact/com.azure.spring/spring-cloud-azure-stream-binder-servicebus) from version 2 of [`azure-spring-cloud-stream-binder-servicebus-queue`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-servicebus-queue) or [`azure-spring-cloud-stream-binder-servicebus-topic`](https://central.sonatype.com/artifact/com.azure.spring/azure-spring-cloud-stream-binder-servicebus-topic).\n\nFor general information, use the following links:\n\n* For an overview of the changes in 4.0, see the [Introduction](#introduction) and [Migration benefits](#migration-benefits) sections.\n* To learn more about the strategy changes in the project naming, see the [Naming changes](#naming-changes) section.\n* To learn how to use one BOM for all Spring Cloud Azure libraries, see the [BOM](#bom) section.\n* To learn how to handle authentication in Spring Cloud Azure 4.0, see the [Authentication changes](#authentication-changes) section.\n* To learn how to leverage `spring-boot-properties-migrator` during migration, see the [Configure each SDK](#configure-each-sdk) section.\n* To learn more about the global and common configuration changes, see the [Global configurations](#global-configurations) section.\n\n#### SDK configuration changes\n\n> [!IMPORTANT]\n> Legacy binder libaries are `azure-spring-cloud-stream-binder-servicebus-queue` and `azure-spring-cloud-stream-binder-servicebus-topic`, and now they're merged into one `spring-cloud-azure-stream-binder-servicebus`.\n\n> [!IMPORTANT]\n> The binder type is combined from `servicebus-queue` and `servicebus-topic` as `servicebus`.\n\nThe following table lists the new configuration properties of `spring-cloud-azure-stream-binder-servicebus`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Modern properties                                                           | Description                                                                                            |\n> |-----------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.stream.servicebus.bindings.binding-name.producer.entity-type` | If you use the sending function, you need to set the entity-type, which you can set to topic or queue. |\n\nThe following table shows the property mappings from `azure-spring-cloud-stream-binder-servicebus-*` to `spring-cloud-azure-stream-binder-servicebus`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy properties                                                                     | Modern properties                                                                                                                                                                                                                 |\n> |---------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.resource-group`                                                   | `spring.cloud.azure.servicebus.resource.resource-group`                                                                                                                                                                           |\n> | `spring.cloud.azure.servicebus.transport-type`                                        | `spring.cloud.azure.servicebus.client.transport-type`                                                                                                                                                                             |\n> | `spring.cloud.azure.servicebus.retry-options.retry-mode`                              | `spring.cloud.azure.servicebus.retry.mode`                                                                                                                                                                                        |\n> | `spring.cloud.azure.servicebus.retry-options.max-retries`                             | `spring.cloud.azure.servicebus.retry.exponential.max-retries` or `spring.cloud.azure.servicebus.retry.fixed.max-retries`, should be configured depending on `spring.cloud.azure.servicebus.retry.mode` = `fixed` or `exponential` |\n> | `spring.cloud.azure.servicebus.retry-options.delay`                                   | `spring.cloud.azure.servicebus.retry.exponential.base-delay` or `spring.cloud.azure.servicebus.retry.fixed.delay`, should be configured depending on `spring.cloud.azure.servicebus.retry.mode` = `fixed` or `exponential`        |\n> | `spring.cloud.azure.servicebus.retry-options.max-delay`                               | `spring.cloud.azure.servicebus.retry.exponential.max-delay`                                                                                                                                                                       |\n> | `spring.cloud.azure.servicebus.retry-options.try-timeout`                             | `spring.cloud.azure.servicebus.retry.try-timeout`                                                                                                                                                                                 |\n> | `spring.cloud.stream.servicebus.queue.bindings.*`                                     | `spring.cloud.stream.servicebus.bindings.*`                                                                                                                                                                                       |\n> | `spring.cloud.stream.servicebus.queue.bindings.binding-name.consumer.concurrency`     | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.max-concurrent-sessions` / `max-concurrent-calls`                                                                                                                  |\n> | `spring.cloud.stream.servicebus.queue.bindings.binding-name.consumer.checkpoint-mode` | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.auto-complete`                                                                                                                                                     |\n> | `spring.cloud.stream.servicebus.topic.bindings.*`                                     | `spring.cloud.stream.servicebus.bindings.*`                                                                                                                                                                                       |\n> | `spring.cloud.stream.servicebus.topic.bindings.binding-name.consumer.concurrency`     | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.max-concurrent-sessions` / `max-concurrent-calls`                                                                                                                  |\n> | `spring.cloud.stream.servicebus.topic.bindings.binding-name.consumer.checkpoint-mode` | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.auto-complete`                                                                                                                                                     |\n\n> [!NOTE]\n> The concurrency property will be replaced by the maxConcurrentSessions when sessionsEnabled is `true` and the maxConcurrentCalls when sessionsEnabled is `false`.\n\n> [!NOTE]\n> Enabling auto-complete is equal to `RECORD` checkpoint mode, and oppositely the `MANUAL` mode.\n\nConfiguration migration examples\n\nLegacy configuration, taking queue as example:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      servicebus:\n        connection-string: ${AZURE_SERVICEBUS_BINDER_CONNECTION_STRING}\n    stream:\n      function:\n        definition: consume;supply\n      bindings:\n        consume-in-0:\n          destination: ${AZURE_SERVICEBUS_QUEUE_NAME}\n        supply-out-0:\n          destination: ${AZURE_SERVICEBUS_QUEUE_NAME}\n      servicebus:\n        queue:\n          bindings:\n            consume-in-0:\n              consumer:\n                checkpoint-mode: MANUAL\n```\n\nModern configuration:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      servicebus:\n        connection-string: ${AZURE_SERVICEBUS_BINDER_CONNECTION_STRING}\n    stream:\n      function:\n        definition: consume;supply\n      bindings:\n        consume-in-0:\n          destination: ${AZURE_SERVICEBUS_QUEUE_NAME}\n        supply-out-0:\n          destination: ${AZURE_SERVICEBUS_QUEUE_NAME}\n      servicebus:\n        bindings:\n          consume-in-0:\n            consumer:\n              auto-complete: false\n          supply-out-0:\n            producer:\n              entity-type: queue #set as topic if needed\n```\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\nIf you use security principals instead of connection strings, in versions before 4.0 the application will firstly connect to Azure Resource Manager (ARM) with the provided security principal, and then retrieve the connection string of the specified namespace with ARM. In the end the application uses the retrieved connection string to connect to Azure Service Bus. In this way the provided security principal should be granted with the [Contributor](/azure/role-based-access-control/built-in-roles#contributor) role to retrieve of the associated Azure Service Bus namespace.\n\nFor Azure Spring Apps 4.0, we provide two ways of leveraging security principals for authentication. One is still using the principals to connect to ARM and retrieve the connection strings where the `Contributor` role is required for the principals. The other leverages security principals to authenticate to Microsoft Entra ID and then connect to the Azure Service Bus directly. In this case, the `Contributor` role isn't necessary anymore, while other `Data` related roles are required for messaging operations. To make sure the security principal has been granted the sufficient permission to access the Azure resource, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id).\n\nFor authentication based on ARM, taking service principal as example, configuration migration is listed the follows, where the assigned role should not change:\n\nLegacy configuration:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      client-id: ${AZURE_CLIENT_ID}\n      client-secret: ${AZURE_CLIENT_SECRET}\n      tenant-id: <tenant>\n      resource-group: ${SERVICEBUS_RESOURCE_GROUP}\n      servicebus:\n        namespace: ${SERVICEBUS_NAMESPACE}\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nModern configuration, properties for Azure subscription ID and resource group are required:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      credential:\n        client-id: ${AZURE_CLIENT_ID}\n        client-secret: ${AZURE_CLIENT_SECRET}\n      profile:\n        tenant-id: <tenant>\n        subscription-id: ${AZURE_SUBSCRIPTION_ID}\n      servicebus:\n        namespace: ${SERVICEBUS_NAMESPACE}\n        resource:\n          resource-group: ${SERVICEBUS_RESOURCE_GROUP}\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nYou can also migrate to authenticate and authorize with Microsoft Entra ID directly without making a detour to ARM. Make sure to grant the security principal necessary `Data` roles for messaging operations. The configuration examples of the service principal and the managed identity are listed the follows:\n\n* With a service principal\n\n  ```yaml\n  spring:\n    cloud:\n      azure:\n        credential:\n          client-id: ${AZURE_CLIENT_ID}\n          client-secret: ${AZURE_CLIENT_SECRET}\n        profile:\n          tenant-id: <tenant>\n        servicebus:\n          namespace: ${SERVICEBUS_NAMESPACE}\n  ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n* With a managed identity\n\n  ```yaml\n  spring:\n    cloud:\n      azure:\n        credential:\n          managed-identity-enabled: true\n          client-id: ${AZURE_MANAGED_IDENTITY_CLIENT_ID} # Only needed when using a user-assigned   managed identity\n        servicebus:\n          namespace: ${SERVICEBUS_NAMESPACE}\n  ```\n\n#### API changes\n\n* Drop message header `AzureHeaders.RAW_ID`. Use `ServiceBusMessageHeaders.MESSAGE_ID` instead.\n\nThe following table shows the class mappings from `azure-spring-cloud-stream-binder-eventhubs` to `spring-cloud-azure-stream-binder-eventhubs`.\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Legacy class                                                                 | Modern class                                                             |\n> |------------------------------------------------------------------------------|--------------------------------------------------------------------------|\n> | `com.azure.spring.integration.core.AzureHeaders`                             | `com.azure.spring.messaging.AzureHeaders`                                |\n> | `com.azure.spring.integration.servicebus.converter.ServiceBusMessageHeaders` | `com.azure.spring.messaging.servicebus.support.ServiceBusMessageHeaders` |\n> | `com.azure.spring.integration.core.api.Checkpointer`                         | `com.azure.spring.messaging.checkpoint.Checkpointer`                     |\n\n### `azure-spring-cloud-messaging`\n\nThe `com.azure.spring:azure-spring-cloud-messaging` library isn't ready for 4.0. The function of listener annotations is under redesign, so the `@AzureMessageListener`, `@AzureMessageListeners`, and `@EnableAzureMessaging` annotations aren't currently supported.\n"
  },
  {
    "path": "articles/java/spring-framework/mysql-support.md",
    "content": "---\ntitle: Spring Cloud Azure MySQL support\ndescription: This article describes how Spring Cloud Azure and Azure MySQL can be used together.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure MySQL support\n\n[Azure Database for MySQL](https://azure.microsoft.com/services/mysql/) is a relational database service powered by the MySQL community edition. You can use either Single Server or Flexible Server to host a MySQL database in Azure. It's a fully managed database-as-a-service offering that can handle mission-critical workloads with predictable performance and dynamic scalability.\n\nFrom version `4.5.0`, Spring Cloud Azure supports various types of credentials for authentication to Azure Database for MySQL Flexible server.\n\n## Supported MySQL version\n\nThe current version of the starter should use Azure Database for MySQL Flexible Server version `5.7` or `8.0`.\n\n## Core features\n\n### Passwordless connection\n\nPasswordless connection uses Microsoft Entra authentication for connecting to Azure services without storing any credentials in the application, its configuration files, or in environment variables. Microsoft Entra authentication is a mechanism for connecting to Azure Database for MySQL using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\n## How it works\n\nSpring Cloud Azure will first build one of the following types of credentials depending on the application authentication configuration:\n\n- `ClientSecretCredential`\n- `ClientCertificateCredential`\n- `UsernamePasswordCredential`\n- `ManagedIdentityCredential`\n- `DefaultAzureCredential`\n\nIf none of these types of credentials are found, the `DefaultAzureCredential` credentials will be obtained from application properties, environment variables, managed identities, or the IDE. For more information, see [Spring Cloud Azure authentication](authentication.md).\n\nThe following high-level diagram summarizes how authentication works using OAuth credential authentication with Azure Database for MySQL. The arrows indicate communication pathways.\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/authentication-mysql-entra-id.png\" alt-text=\"Diagram showing Microsoft Entra authentication for MySQL.\" border=\"false\":::\n\n## Configuration\n\nSpring Cloud Azure for MySQL supports the following two levels of configuration options:\n\n1. The global authentication configuration options of `credential` and `profile` with prefixes of `spring.cloud.azure`.\n\n1. Spring Cloud Azure for MySQL common configuration options.\n\nThe following table shows the Spring Cloud Azure for MySQL common configuration options:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                                                  | Description                                                                                                                                                                                            |\n> |-----------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.datasource.azure.passwordless-enabled`                          | Whether to enable passwordless connections to Azure databases by using OAuth2 Microsoft Entra token credentials.                                                                                |\n> | `spring.datasource.azure.credential.client-certificate-password`        | Password of the certificate file.                                                                                                                                                                      |\n> | `spring.datasource.azure.credential.client-certificate-path`            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                     |\n> | `spring.datasource.azure.credential.client-id`                          | Client ID to use when performing service principal authentication with Azure. This is a legacy property.                                                                                               |\n> | `spring.datasource.azure.credential.client-secret`                      | Client secret to use when performing service principal authentication with Azure. This is a legacy property.                                                                                            |\n> | `spring.datasource.azure.credential.managed-identity-enabled`           | Whether to enable managed identity to authenticate with Azure. If `true` and the `client-id` is set, will use the client ID as user assigned managed identity client ID. The default value is `false`. |\n> | `spring.datasource.azure.credential.password`                           | Password to use when performing username/password authentication with Azure.                                                                                                                           |\n> | `spring.datasource.azure.credential.username`                           | Username to use when performing username/password authentication with Azure.                                                                                                                           |\n> | `spring.datasource.azure.profile.cloud-type`                            | Name of the Azure cloud to connect to.                                                                                                                                                                 |\n> | `spring.datasource.azure.profile.environment.active-directory-endpoint` | The Microsoft Entra endpoint to connect to.                                                                                                                                                     |\n> | `spring.datasource.azure.profile.tenant-id`                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                             |\n\n## Dependency setup\n\nAdd the following dependency to your project. This will automatically include the `spring-boot-starter` dependency in your project transitively.\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>\n</dependency>\n```\n\n> [!NOTE]\n> Passwordless connections have been supported since version `4.5.0`.\n>\n> Remember to add the BOM `spring-cloud-azure-dependencies` along with the above dependency. For more information, see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n## Basic usage\n\nThe following sections show the classic Spring Boot application usage scenarios.\n\n> [!IMPORTANT]\n> Passwordless connection uses Microsoft Entra authentication. To use Microsoft Entra authentication, you should set the Microsoft Entra admin user first. Only a Microsoft Entra admin user can create and enable users for Microsoft Entra ID-based authentication. For more information, see [Use Spring Data JDBC with Azure Database for MySQL](configure-spring-data-jdbc-with-azure-mysql.md).\n\n### Connect to Azure MySQL locally without password\n\n1. To create users and grant permission, see the [Create a MySQL non-admin user and grant permission](configure-spring-data-jdbc-with-azure-mysql.md#create-a-mysql-non-admin-user-and-grant-permission) section of [Use Spring Data JDBC with Azure Database for MySQL](configure-spring-data-jdbc-with-azure-mysql.md).\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     datasource:\n       url: jdbc:mysql://${AZURE_MYSQL_SERVER_NAME}.mysql.database.azure.com:3306/${AZURE_MYSQL_DATABASE_NAME}\n       username: ${AZURE_MYSQL_AD_NON_ADMIN_USERNAME}\n       azure:\n         passwordless-enabled: true\n   ```\n\n### Connect to Azure MySQL using a service principal\n\n1. Create a Microsoft Entra user for service principal and grant permission.\n\n   1. First, use the following commands to set up some environment variables.\n\n      ```bash\n      export AZURE_MYSQL_AZURE_AD_SP_USERID=$(az ad sp list \\\n          --display-name <service_principal-name> \\\n          --query '[0].appId' \n          --output tsv)\n      export AZURE_MYSQL_AZURE_AD_SP_USERNAME=<YOUR_MYSQL_AZURE_AD_USERNAME>\n      export AZURE_MYSQL_SERVER_NAME=<YOUR_MYSQL_SERVER_NAME>\n      export AZURE_MYSQL_DATABASE_NAME=<YOUR_MYSQL_DATABASE_NAME>\n      export CURRENT_USERNAME=$(az ad signed-in-user show \\\n          --query userPrincipalName \\\n          --output tsv)\n      ```\n\n   1. Then, create a SQL script called **create_ad_user_sp.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n      ```bash\n      cat << EOF > create_ad_user_sp.sql\n      SET aad_auth_validate_oids_in_tenant = OFF;\n      CREATE AADUSER '$AZURE_MYSQL_AZURE_AD_SP_USERNAME' IDENTIFIED BY '$AZURE_MYSQL_AZURE_AD_SP_USERID';\n      GRANT ALL PRIVILEGES ON $AZURE_MYSQL_DATABASE_NAME.* TO '$AZURE_MYSQL_AZURE_AD_SP_USERNAME'@'%';\n      FLUSH privileges;\n      EOF\n      ```\n\n   1. Use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n      ```bash\n      mysql -h $AZURE_MYSQL_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user_sp.sql\n      ```\n\n   1. Now use the following command to remove the temporary SQL script file:\n\n      ```bash\n      rm create_ad_user_sp.sql\n      ```\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       azure:\n         credential:\n           client-id: ${AZURE_CLIENT_ID}\n           client-secret: ${AZURE_CLIENT_SECRET}\n         profile:\n           tenant-id: <tenant>\n     datasource:\n       url: jdbc:mysql://${AZURE_MYSQL_SERVER_NAME}.mysql.database.azure.com:3306/${AZURE_MYSQL_DATABASE_NAME}\n       username: ${AZURE_MYSQL_AD_SP_USERNAME}\n       azure:\n         passwordless-enabled: true\n   ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n### Connect to Azure MySQL with Managed Identity in Azure Spring Apps\n\n1. To enable managed identity, see the [Assign the managed identity using the Azure portal](migrate-mysql-to-passwordless-connection.md#assign-the-managed-identity-using-the-azure-portal) section of [Migrate an application to use passwordless connections with Azure Database for MySQL](migrate-mysql-to-passwordless-connection.md).\n\n1. To grant permissions, see the [Assign roles to the managed identity](migrate-mysql-to-passwordless-connection.md#assign-roles-to-the-managed-identity) section of [Migrate an application to use passwordless connections with Azure Database for MySQL](migrate-mysql-to-passwordless-connection.md).\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     datasource:\n       url: jdbc:mysql://${AZURE_MYSQL_SERVER_NAME}.mysql.database.azure.com:3306/${AZURE_MYSQL_DATABASE_NAME}\n       username: ${AZURE_MYSQL_AD_MI_USERNAME}\n       azure:\n         passwordless-enabled: true\n   ```\n\n### Samples\n\nSee the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/native-applications.md",
    "content": "---\ntitle: Spring Boot Native Applications\ndescription: Shows you how to enable Spring Cloud Azure libraries to work with Spring Boot native image applications.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-arm-template\n---\n\n# Spring Boot native image applications\n\nThis article shows you how to enable Spring Cloud Azure libraries to work with Spring Boot native image applications.\n\nFor more information about using Spring Cloud Azure libraries in Spring Boot native image applications, see [Introducing GraalVM Native Images](https://docs.spring.io/spring-boot/reference/packaging/native-image/introducing-graalvm-native-images.html) in the Spring documentation.\n\nAzure SDK JARs are signed. However, Spring Boot doesn't support the JAR signature verification for native images.\n\nTo solve this issue, you must disable the JAR signature verification, as described in this article.\n\n## Disable JAR signature verification\n\nUse the following steps to disable signature verification:\n\n1. Create a **custom.security** file in **src/main/resources** with the following contents:\n\n   ```\n   jdk.jar.disabledAlgorithms=MD2, MD5, RSA, DSA\n   ```\n\n1. If you're using Maven, add the following configuration:\n\n   ```xml\n   <plugin>\n       <groupId>org.graalvm.buildtools</groupId>\n       <artifactId>native-maven-plugin</artifactId>\n       <configuration>\n           <buildArgs>\n               <arg>-Djava.security.properties=src/main/resources/custom.security</arg>\n           </buildArgs>\n       </configuration>\n   </plugin>\n   ```\n\n   If you're using Gradle, add the following configuration:\n\n   ```groovy\n   graalvmNative {\n     binaries {\n       main {\n         buildArgs('-Djava.security.properties=' + file(\"$rootDir/custom.security\").absolutePath)\n       }\n     }\n   }\n   ```\n"
  },
  {
    "path": "articles/java/spring-framework/passwordless-authentication.md",
    "content": "---\ntitle: Passwordless Authentication with Spring Cloud Azure\ndescription: Describes how to use passwordless authentication to securely connect your Spring Cloud Azure applications to Azure services.\nms.date: 01/20/2026\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java\n---\n\n# Passwordless authentication with Spring Cloud Azure\n\nThis article introduces the [Azure Identity Extensions](/java/api/overview/azure/identity-extensions-readme) and explains how to implement passwordless authentication to securely connect your Spring Cloud Azure applications to Azure services. By eliminating the need to store credentials in your application code, configuration files, or environment variables, you can both enhance security and streamline configuration.\n\n## Core features\n\n### Azure Identity Extensions\n\nAzure Identity Extensions is built on top of the Azure Identity library and simplifies the authentication to Microsoft Entra ID and other Azure services. It provides a common template framework for users to obtain a token from Microsoft Entra ID using various credential types, including:\n\n- `ClientSecretCredential`\n- `ClientCertificateCredential`\n- `ManagedIdentityCredential`\n- `DefaultAzureCredential`\n\nAfter you acquire the token, it serves as a substitute for a traditional password. The extensions also include the following plugins to facilitate database authentication using Microsoft Entra ID:\n\n- `AzureMysqlAuthenticationPlugin`\n- `AzurePostgresqlAuthenticationPlugin`\n\n### Spring Boot Integration\n\nSpring Cloud Azure builds upon Azure Identity Extensions to offer a higher-level, more convenient implementation that lets developers concentrate on business logic rather than on manual authentication setups. The following autoconfigured beans simplify integration:\n\n- [AzureJdbcAutoConfiguration](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/jdbc/AzureJdbcAutoConfiguration.java)\n- [AzureRedisCredentials](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/data/redis/lettuce/AzureRedisCredentials.java)\n- [ServiceBusJmsConnectionFactoryFactory](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/implementation/jms/ServiceBusJmsConnectionFactoryFactory.java)\n\n### Implementation guides\n\n#### Connect to MySQL\n\nSpring Cloud Azure uses the [AzureMysqlAuthenticationPlugin](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/identity/azure-identity-extensions/src/main/java/com/azure/identity/extensions/jdbc/mysql/AzureMysqlAuthenticationPlugin.java) to convert a Microsoft Entra token into a MySQL-compatible password. For more information, see [Spring Cloud Azure MySQL support](mysql-support.md) and the [sample repository](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/mysql/spring-cloud-azure-starter-jdbc-mysql/spring-cloud-azure-mysql-sample).\n\n#### Connect to PostgreSQL\n\nFor PostgreSQL, Spring Cloud Azure uses the [AzurePostgresqlAuthenticationPlugin](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/identity/azure-identity-extensions/src/main/java/com/azure/identity/extensions/jdbc/postgresql/AzurePostgresqlAuthenticationPlugin.java) to translate a Microsoft Entra token into a password recognized by PostgreSQL. For more information, see [Spring Cloud Azure PostgreSQL support](postgresql-support.md) and the [sample repository](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/postgresql/spring-cloud-azure-starter-jdbc-postgresql/spring-cloud-azure-postgresql-sample).\n\n#### Connect to Redis\n\nTo enable passwordless authentication for Redis, Spring Cloud Azure uses [AzureAuthenticationTemplate](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/identity/azure-identity-extensions/src/main/java/com/azure/identity/extensions/implementation/template/AzureAuthenticationTemplate.java) to convert a Microsoft Entra token into a valid Redis credential. For more information, see [Spring Cloud Azure Redis support](redis-support.md) and the [sample repository](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/cache/spring-cloud-azure-redis-sample-passwordless).\n\n#### Connect to Azure Service Bus JMS\n\nFor Azure Service Bus JMS, Spring Cloud Azure uses [TokenCredentialProviderOptions](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/identity/azure-identity-extensions/src/main/java/com/azure/identity/extensions/implementation/credential/TokenCredentialProviderOptions.java) to transfer a Microsoft Entra token into Azure Service Bus JMS credential. For more information, see [Use Azure Service Bus with JMS](spring-jms-support.md) and the [sample repository](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus/spring-cloud-azure-starter-servicebus-jms/servicebus-jms-dlq-queue).\n"
  },
  {
    "path": "articles/java/spring-framework/postgresql-support.md",
    "content": "---\ntitle: Spring Cloud Azure PostgreSQL support\ndescription: This article describes how Spring Cloud Azure and Azure PostgreSQL can be used together.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nappliesto:\n  - ✅ Version 4.20.0\n  - ✅ Version 5.25.0\n  - ✅ Version 6.2.0\n  - ✅ Version 7.2.0\nms.custom:\n  - devx-track-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Spring Cloud Azure PostgreSQL support\n\n[Azure Database for PostgreSQL](https://azure.microsoft.com/services/postgresql/) is a relational database service based on the open-source Postgres database engine. It's a fully managed database-as-a-service that can handle mission-critical workloads with predictable performance, security, high availability, and dynamic scalability.\n\nFrom version `4.5.0`, Spring Cloud Azure supports various types of credentials for authentication to Azure Database for PostgreSQL Flexible Server.\n\n## Supported PostgreSQL version\n\nFor supported versions, see [Supported PostgreSQL major versions in Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/concepts-supported-versions).\n\n## Core features\n\n### Passwordless connection\n\nPasswordless connection uses Microsoft Entra authentication for connecting to Azure services without storing any credentials in the application, its configuration files, or in environment variables. Microsoft Entra authentication is a mechanism for connecting to Azure Database for PostgreSQL using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage database user identities and other Microsoft services in a central location, which simplifies permission management.\n\n## How it works\n\nSpring Cloud Azure will first build one of the following types of credentials depending on the application authentication configuration:\n\n- `ClientSecretCredential`\n- `ClientCertificateCredential`\n- `UsernamePasswordCredential`\n- `ManagedIdentityCredential`\n- `DefaultAzureCredential`\n\nIf none of these types of credentials are found, the `DefaultAzureCredential` credentials will be obtained from application properties, environment variables, managed identities, or the IDE. For more information, see [Spring Cloud Azure authentication](authentication.md).\n\nThe following high-level diagram summarizes how authentication works using OAuth credential authentication with Azure Database for PostgreSQL. The arrows indicate communication pathways.\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/authentication-postgresql-entra-id.png\" alt-text=\"Diagram showing Microsoft Entra authentication for PostgreSQL .\" border=\"false\":::\n\n## Configuration\n\nSpring Cloud Azure for PostgreSQL supports the following two levels of configuration options:\n\n1. The global authentication configuration options of `credential` and `profile` with prefixes of `spring.cloud.azure`.\n\n1. Spring Cloud Azure for PostgreSQL common configuration options.\n\nThe following table shows the Spring Cloud Azure for PostgreSQL common configuration options:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                                                  | Description                                                                                                                                                                                            |\n> |-----------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.datasource.azure.passwordless-enabled`                          | Whether to enable passwordless connections to Azure databases by using OAuth2 Microsoft Entra token credentials.                                                                                |\n> | `spring.datasource.azure.credential.client-certificate-password`        | Password of the certificate file.                                                                                                                                                                      |\n> | `spring.datasource.azure.credential.client-certificate-path`            | Path of a PEM certificate file to use when performing service principal authentication with Azure.                                                                                                     |\n> | `spring.datasource.azure.credential.client-id`                          | Client ID to use when performing service principal authentication with Azure. This is a legacy property.                                                                                               |\n> | `spring.datasource.azure.credential.client-secret`                      | Client secret to use when performing service principal authentication with Azure. This is a legacy property.                                                                                           |\n> | `spring.datasource.azure.credential.managed-identity-enabled`           | Whether to enable managed identity to authenticate with Azure. If `true` and the `client-id` is set, will use the client ID as user assigned managed identity client ID. The default value is `false`. |\n> | `spring.datasource.azure.credential.password`                           | Password to use when performing username/password authentication with Azure.                                                                                                                           |\n> | `spring.datasource.azure.credential.username`                           | Username to use when performing username/password authentication with Azure.                                                                                                                           |\n> | `spring.datasource.azure.profile.cloud-type`                            | Name of the Azure cloud to connect to.                                                                                                                                                                 |\n> | `spring.datasource.azure.profile.environment.active-directory-endpoint` | The Microsoft Entra endpoint to connect to.                                                                                                                                                     |\n> | `spring.datasource.azure.profile.tenant-id`                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                              |\n\n## Dependency setup\n\nAdd the following dependency to your project. This will automatically include the `spring-boot-starter` dependency in your project transitively.\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-jdbc-postgresql</artifactId>\n</dependency>\n```\n\n> [!NOTE]\n> Passwordless connections have been supported since version `4.5.0`.\n>\n> Remember to add the BOM `spring-cloud-azure-dependencies` along with the above dependency. For more information, see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n## Basic usage\n\nThe following sections show the classic Spring Boot application usage scenarios.\n\n> [!IMPORTANT]\n> Passwordless connection uses Microsoft Entra authentication. To use Microsoft Entra authentication, you should set the Microsoft Entra admin user first. Only a Microsoft Entra admin user can create and enable users for Microsoft Entra ID-based authentication. For more information, see [Use Spring Data JDBC with Azure Database for PostgreSQL](configure-spring-data-jdbc-with-azure-postgresql.md).\n\n### Connect to Azure PostgreSQL locally without password\n\n1. To create users and grant permission, see the [Create a PostgreSQL non-admin user and grant permission](configure-spring-data-jdbc-with-azure-postgresql.md#create-a-postgresql-non-admin-user-and-grant-permission) section of [Use Spring Data JDBC with Azure Database for PostgreSQL](configure-spring-data-jdbc-with-azure-postgresql.md).\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     datasource:\n       url: jdbc:postgresql://${AZ_DATABASE_SERVER_NAME}.postgres.database.azure.com:5432/${AZ_DATABASE_NAME}?sslmode=require\n       username: ${AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME}\n       azure:\n         passwordless-enabled: true\n   ```\n\n### Connect to Azure PostgreSQL using a service principal\n\n1. Assign role to service principal:\n\n   1. Create a SQL script called **create_ad_user_sp.sql** for creating a non-admin user. Add the following contents and save it locally:\n\n      > [!IMPORTANT]\n      > Make sure `<service-principal-name>` already exists in your Microsoft Entra tenant, or you won't be able to create the non-admin user.\n\n      ```bash\n      cat << EOF > create_ad_user_sp.sql\n      select * from pgaadauth_create_principal('<service-principal-name>', false, false);\n      EOF\n      ```\n\n   1. Use the following command to run the SQL script to create the Microsoft Entra non-admin user:\n\n      ```bash\n      psql \"host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME@$AZ_DATABASE_SERVER_NAME dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require\" < create_ad_user_sp.sql\n      ```\n\n   1. Now use the following command to remove the temporary SQL script file:\n\n      ```bash\n      rm create_ad_user_sp.sql\n      ```\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       azure:\n         credential:\n           client-id: ${AZURE_CLIENT_ID}\n           client-secret: ${AZURE_CLIENT_SECRET}\n         profile:\n           tenant-id: <tenant>\n     datasource:\n       url: jdbc:postgresql://${AZ_DATABASE_SERVER_NAME}.postgres.database.azure.com:5432/${AZ_DATABASE_NAME}?sslmode=require\n       username: ${AZ_POSTGRESQL_AD_SP_USERNAME}\n       azure:\n         passwordless-enabled: true\n   ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n### Connect to Azure PostgreSQL with Managed Identity in Azure Spring Apps\n\n1. To enable managed identity, see the [Assign the managed identity using the Azure portal](migrate-postgresql-to-passwordless-connection.md#assign-the-managed-identity-using-the-azure-portal) section of [Migrate an application to use passwordless connections with Azure Database for PostgreSQL](migrate-postgresql-to-passwordless-connection.md).\n\n1. To grant permissions, see the [Assign roles to the managed identity](migrate-postgresql-to-passwordless-connection.md#assign-roles-to-the-managed-identity) section of [Migrate an application to use passwordless connections with Azure Database for PostgreSQL](migrate-postgresql-to-passwordless-connection.md).\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       azure:\n         credential:\n           managed-identity-enabled: true\n           client-id: ${AZURE_CLIENT_ID}\n     datasource:\n       url: jdbc:postgresql://${AZ_DATABASE_SERVER_NAME}.postgres.database.azure.com:5432/${AZ_DATABASE_NAME}?sslmode=require\n       username: ${AZ_POSTGRESQL_AD_MI_USERNAME}\n       azure:\n         passwordless-enabled: true\n   ```\n\n> [!NOTE]\n> For more information, see [Tutorial: Deploy a Spring application to Azure Spring Apps with a passwordless connection to an Azure database](deploy-passwordless-spring-database-app.md)\n\n### Samples\n\nSee the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/production-ready.md",
    "content": "---\ntitle: Spring Cloud Azure Production ready\ndescription: This article describes Spring Cloud Azure Production ready.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n---\n\n# Production ready\n\nWe've added health indicators for App Configuration, Event Hubs, Azure Cosmos DB, Key Vault, Storage Blob, Storage Queue, and Storage File, as well as Spring Cloud Sleuth support for all HTTP-based Azure SDKs. As an example, you now can probe to determine whether a storage blob is up or down via Spring Boot actuator endpoint, as well as track dependencies and latencies going from your application to Key Vault.\n\n## Enable health indicator\n\nTo enable the health indicators, add the Spring Cloud Azure Actuator Starter dependency to your **pom.xml** file. This dependency will also include the `spring-boot-starter-actuator`.\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-actuator</artifactId>\n</dependency>\n```\n\nThe following table lists configurable properties to enable or disable health indicators for each Azure service:\n\n| Azure Service         | Property                                               |\n|-----------------------|--------------------------------------------------------|\n| App Configuration     | `management.health.azure-appconfiguration.enabled`     |\n| Azure Cosmos DB       | `management.health.azure-cosmos.enabled`               |\n| Event Hubs            | `management.health.azure-eventhubs.enabled`            |\n| Key Vault Certificate | `management.health.azure-keyvault-certificate.enabled` |\n| Key Vault Secret      | `management.health.azure-keyvault-secret.enabled`      |\n| Storage Blob          | `management.health.azure-storage-blob.enabled`         |\n| Storage File Share    | `management.health.azure-storage-fileshare.enabled`    |\n| Storage Queue         | `management.health.azure-storage-queue.enabled`        |\n\n> [!IMPORTANT]\n> Calling the health endpoint of Azure services may cause extra charges. For example, if you call `http://HOST_NAME:{port}/actuator/health/cosmos` to get Azure Cosmos DB health info, it will calculate Request Units (RUs). For more information, see [Request Units in Azure Cosmos DB](/azure/cosmos-db/request-units).\n\n> [!NOTE]\n> For calling the health endpoint of `Cosmos`, the option `spring.cloud.azure.cosmos.database` should be configured; Otherwise, the health status of `unknown` will be returned.\n>\n> For calling the health endpoint of `Storage Queue`, role of `Storage Account Contributor` is required if `Azure AD` is used for authorizing.\n\n## Enable sleuth\n\nWhen you want to trace Azure SDK activities by using Spring Cloud Sleuth, add the following Spring Cloud Azure Trace Sleuth dependency to your **pom.xml** file:\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-trace-sleuth</artifactId>\n</dependency>\n```\n\n> [!NOTE]\n> Only HTTP-based Azure SDK clients are currently supported. For example, Event Hubs and Service Bus with AMQP transport are currently not supported. For these requirements, we recommend that you use [Azure Application Insight](/azure/azure-monitor/app/app-insights-overview).\n"
  },
  {
    "path": "articles/java/spring-framework/redis-support.md",
    "content": "---\ntitle: Spring Cloud Azure Redis support\ndescription: This article describes how Spring Cloud Azure and Azure Redis can be used together.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure Redis support\n\nThis article describes how you can use Spring Cloud Azure and Spring Data Redis together and provide various types of credentials for authentication to Azure Cache for Redis.\n\n[Azure Cache for Redis](/azure/azure-cache-for-redis/) provides an in-memory data store based on the Redis software. [Redis](https://redis.io/) improves the performance and scalability of an application that uses backend data stores heavily.\n\n## Supported Redis versions\n\nFor supported versions, see [Current versions](/azure/azure-cache-for-redis/cache-how-to-upgrade#current-versions).\n\n## Core features\n\n### Passwordless connection\n\nPasswordless connection uses Microsoft Entra authentication for connecting to Azure services without storing any credentials in the application, its configuration files, or in environment variables. Microsoft Entra authentication is a mechanism for connecting to Azure Cache for Redis using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage cache identities and other Microsoft services in a central location, which simplifies permission management.\n\n## How it works\n\nSpring Cloud Azure first builds one of the following types of credentials depending on the application authentication configuration:\n\n- `ClientSecretCredential`\n- `ClientCertificateCredential`\n- `UsernamePasswordCredential`\n- `ManagedIdentityCredential`\n\nIf none of these types of credentials are found, the credential chain via `DefaultTokenCredential` is used to obtain credentials from application properties, environment variables, managed identity, or IDEs. For more information, see [Spring Cloud Azure authentication](authentication.md).\n\n## Configuration\n\n#### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\nConfigurable properties when using Redis support:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                             | Description                                               | Default Value | Required |\n> |------------------------------------------------------|-----------------------------------------------------------|---------------|----------|\n> | `spring.cloud.azure.redis.enabled`                 | Whether an Azure Cache for Redis is enabled.              | true          | No       |\n> | `spring.cloud.azure.redis.name`                    | Azure Cache for Redis instance name.                      |               | Yes      |\n> | `spring.cloud.azure.redis.resource.resource-group` | The resource group of Azure Cache for Redis.              |               | Yes      |\n> | `spring.cloud.azure.profile.subscription-id`       | The subscription ID.                                      |               | Yes      |\n> | `spring.data.redis.azure.passwordless-enabled`     | Whether to enable passwordless for Azure Cache for Redis. | false         | No       |\n\n#### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\nConfigurable properties when using Redis support:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                             | Description                                               | Default Value | Required |\n> |------------------------------------------------------|-----------------------------------------------------------|---------------|----------|\n> | `spring.cloud.azure.redis.enabled`                 | Whether an Azure Cache for Redis is enabled.              | true          | No       |\n> | `spring.cloud.azure.redis.name`                    | Azure Cache for Redis instance name.                      |               | Yes      |\n> | `spring.cloud.azure.redis.resource.resource-group` | The resource group of Azure Cache for Redis.              |               | Yes      |\n> | `spring.cloud.azure.profile.subscription-id`       | The subscription ID.                                      |               | Yes      |\n> | `spring.data.redis.azure.passwordless-enabled`     | Whether to enable passwordless for Azure Cache for Redis. | false         | No       |\n\n#### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\nConfigurable properties when using Redis support:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                             | Description                                               | Default Value | Required |\n> |------------------------------------------------------|-----------------------------------------------------------|---------------|----------|\n> | `spring.cloud.azure.redis.enabled`                 | Whether an Azure Cache for Redis is enabled.              | true          | No       |\n> | `spring.cloud.azure.redis.name`                    | Azure Cache for Redis instance name.                      |               | Yes      |\n> | `spring.cloud.azure.redis.resource.resource-group` | The resource group of Azure Cache for Redis.              |               | Yes      |\n> | `spring.cloud.azure.profile.subscription-id`       | The subscription ID.                                      |               | Yes      |\n> | `spring.redis.azure.passwordless-enabled`          | Whether to enable passwordless for Azure Cache for Redis. | false         | No       |\n\n---\n\n## Basic usage\n\nThe following sections show the classic Spring Boot application usage scenarios.\n\n### Connect to Azure Cache for Redis with passwordless\n\n#### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\n1. Add the following dependency to your project. This configuration automatically includes the `spring-boot-starter` dependency in your project transitively.\n\n   ```xml\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-data-redis</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-data-redis-lettuce</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > Remember to add the `spring-cloud-azure-dependencies` BOM along with this dependency. For more information, see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     data:\n       redis:\n         host: ${AZURE_CACHE_REDIS_HOST}\n         username: ${AZURE_CACHE_REDIS_USERNAME}\n         port: 6380\n         ssl:\n           enabled: true\n         azure:\n           passwordless-enabled: true\n   ```\n\n   > [!IMPORTANT]\n   > Passwordless connection uses Microsoft Entra authentication. To use Microsoft Entra authentication, you should enable Microsoft Entra Authentication and select `user(managed identity/service principal)` to assign `Data Owner Access Policy`.\n   >\n   > For more information and to get the value for `username`, see the [Enable Microsoft Entra ID authentication on your cache](/azure/azure-cache-for-redis/cache-azure-active-directory-for-authentication#enable-microsoft-entra-id-authentication-on-your-cache) section of [Use Microsoft Entra ID for cache authentication](/azure/azure-cache-for-redis/cache-azure-active-directory-for-authentication).\n\n#### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n1. Add the following dependency to your project. This configuration automatically includes the `spring-boot-starter` dependency in your project transitively.\n\n   ```xml\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-data-redis</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-data-redis-lettuce</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > Passwordless connections have been supported since version `5.13.0`.\n   >\n   > Remember to add the `spring-cloud-azure-dependencies` BOM along with this dependency. For more information, see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     data:\n       redis:\n         host: ${AZURE_CACHE_REDIS_HOST}\n         username: ${AZURE_CACHE_REDIS_USERNAME}\n         port: 6380\n         ssl:\n           enabled: true\n         azure:\n           passwordless-enabled: true\n   ```\n\n   > [!IMPORTANT]\n   > Passwordless connection uses Microsoft Entra authentication. To use Microsoft Entra authentication, you should enable Microsoft Entra Authentication and select `user(managed identity/service principal)` to assign `Data Owner Access Policy`.\n   >\n   > For more information and to get the value for `username`, see the [Enable Microsoft Entra ID authentication on your cache](/azure/azure-cache-for-redis/cache-azure-active-directory-for-authentication#enable-microsoft-entra-id-authentication-on-your-cache) section of [Use Microsoft Entra ID for cache authentication](/azure/azure-cache-for-redis/cache-azure-active-directory-for-authentication).\n\n#### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n1. Add the following dependency to your project. This configuration automatically includes the `spring-boot-starter` dependency in your project transitively.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-redis</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > Passwordless connections have been supported since version `4.6.0`.\n   >\n   > Remember to add the `spring-cloud-azure-dependencies` BOM along with this dependency. For more information, see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     redis:\n       host: ${AZURE_CACHE_REDIS_HOST}\n       username: ${AZURE_CACHE_REDIS_USERNAME}\n       port: 6380\n       ssl: true\n       azure:\n         passwordless-enabled: true\n   ```\n\n   > [!IMPORTANT]\n   > Passwordless connection uses Microsoft Entra authentication. To use Microsoft Entra authentication, you should enable Microsoft Entra Authentication and select `user(managed identity/service principal)` to assign `Data Owner Access Policy`.\n   >\n   > For more information and to get the value for `username`, see the [Enable Microsoft Entra ID authentication on your cache](/azure/azure-cache-for-redis/cache-azure-active-directory-for-authentication#enable-microsoft-entra-id-authentication-on-your-cache) section of [Use Microsoft Entra ID for cache authentication](/azure/azure-cache-for-redis/cache-azure-active-directory-for-authentication).\n\n---\n\n### Connect to Azure Cache for Redis with managed identity\n\n1. To use the managed identity, you need enable the managed identity for your service and [enable Microsoft Entra authentication on your cache](/azure/azure-cache-for-redis/cache-azure-active-directory-for-authentication#enable-microsoft-entra-authentication-on-your-cache).\n\n1. Then, add the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       azure:\n         credential:\n           managed-identity-enabled: true\n   ```\n\n   > [!IMPORTANT]\n   > The `redis.username` should change to the managed identity object (principal) ID.\n   >\n   > If you're using user-assigned managed identity, you also need to add the property `spring.cloud.azure.credential.client-id` with your user-assigned managed identity client ID.\n\n### Connect to Azure Cache for Redis via Azure Resource Manager\n\nUse the following steps to connect to Azure Cache for Redis:\n\n#### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\n1. Add the following dependency to your project. This configuration automatically includes the `spring-boot-starter` dependency in your project transitively.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-data-redis-lettuce</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-resourcemanager</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-boot-starter-data-redis</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > Remember to add the `spring-cloud-azure-dependencies` BOM along with this dependency. For more information, see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n#### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n1. Add the following dependency to your project. This configuration automatically includes the `spring-boot-starter` dependency in your project transitively.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-data-redis-lettuce</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-resourcemanager</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-boot-starter-data-redis</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > Remember to add the `spring-cloud-azure-dependencies` BOM along with this dependency. For more information, see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n#### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n1. Add the following dependency to your project. This configuration automatically includes the `spring-boot-starter` dependency in your project transitively.\n\n   ```xml\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-resourcemanager</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-boot-starter-data-redis</artifactId>\n   </dependency>\n   ```\n\n   > [!NOTE]\n   > Remember to add the `spring-cloud-azure-dependencies` BOM along with this dependency. For more information, see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\n---\n\n2. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       azure:\n         profile:\n           subscription-id: ${AZURE_SUBSCRIPTION_ID}\n         redis:\n           name: ${AZURE_CACHE_REDIS_NAME}\n           resource:\n             resource-group: ${AZURE_RESOURCE_GROUP}\n   ```\n\n### Samples\n\nSee the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/resource-handling.md",
    "content": "---\ntitle: Spring Cloud Azure resource handling\ndescription: This article describes Spring Cloud Azure resource handling.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure resource handling\n\nThe Spring project provides a [Spring Resources](https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources) abstraction to access a number of low-level resources. The project provides interfaces like `Resource`, `ResourceLoader` and `ResourcePatternResolver`. Spring Cloud Azure implements these interfaces for Azure Storage services, which allows you to interact with Azure storage Blob and File Share using the Spring programming model. Spring Cloud Azure provides `spring-cloud-azure-starter-storage-blob` and `spring-cloud-azure-starter-storage-file-share` to auto-configure Azure Storage Blob and Azure Storage File Share.\n\nThe following table lists Azure Storage related libraries:\n\n| Starter                                         | Service                  | Description                                                                                                                             |\n|-------------------------------------------------|--------------------------|-----------------------------------------------------------------------------------------------------------------------------------------|\n| `spring-cloud-azure-starter-storage-blob`       | Azure Storage Blob       | Allows unstructured data to be stored and accessed at a massive scale in block blobs.                                                   |\n| `spring-cloud-azure-starter-storage-file-share` | Azure Storage File Share | Offers fully managed cloud file shares that you can access from anywhere via the industry standard Server Message Block (SMB) protocol. |\n\n## Dependency setup\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-starter-storage-blob</artifactId>\n    </dependency>\n    <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-starter-storage-file-share</artifactId>\n    </dependency>\n</dependencies>\n```\n\nThe `spring-cloud-azure-starter-storage-blob` dependency is only required when you're using Azure Storage Blob.\n\nThe `spring-cloud-azure-starter-storage-file-share` dependency is only required when you're using Azure Storage File Share.\n\n> [!TIP]\n> We also provide `spring-cloud-azure-starter-storage` to support all the features of Storage. If you choose to use it, `spring.cloud.azure.storage.enable` is the property to configure and the default value is `true`. You can then use `spring.cloud.azure.storage.<storage-service>.enable` to disable unneeded services.\n\n## Configuration\n\n> [!NOTE]\n> If you use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, be sure the security principal has been granted sufficient permission to access the Azure resource. For more information, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id).\n\nThe following table lists the configurable properties of `spring-cloud-azure-starter-storage-blob`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                       | Default | Description                                                              |\n> |------------------------------------------------|---------|--------------------------------------------------------------------------|\n> | `spring.cloud.azure.storage.blob.enabled`      | true    | A value that indicates whether an Azure Blob Storage service is enabled. |\n> | `spring.cloud.azure.storage.blob.endpoint`     |         | The URI to connect to Azure Blob Storage.                                |\n> | `spring.cloud.azure.storage.blob.account-key`  |         | The private key to connect to Azure Blob Storage.                        |\n> | `spring.cloud.azure.storage.blob.account-name` |         | The Azure Storage Blob account name.\n\nThe following table lists the configurable properties of `spring-cloud-azure-starter-storage-file-share`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                            | Default | Description                                                           |\n> |-----------------------------------------------------|---------|-----------------------------------------------------------------------|\n> | `spring.cloud.azure.storage.fileshare.enabled`      | true    | A value that indicates whether Azure File Storage service is enabled. |\n> | `spring.cloud.azure.storage.fileshare.endpoint`     |         | The URI to connect to Azure File Storage.                             |\n> | `spring.cloud.azure.storage.fileshare.account-key`  |         | The private key to connect to Azure File Storage.                     |\n> | `spring.cloud.azure.storage.fileshare.account-name` |         | The Azure Storage File Share account name.                                       |\n\n## Basic usage\n\nAdd the following properties to your **application.yml** file:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      storage:\n        blob:\n          account-name: ${STORAGE_ACCOUNT_NAME}\n          account-key: ${STORAGE_ACCOUNT_KEY}\n          endpoint: ${STORAGE_BLOB_ENDPOINT}\n        fileshare:\n          account-name: ${STORAGE_ACCOUNT_NAME}\n          account-key: ${STORAGE_ACCOUNT_KEY}\n          endpoint:  ${STORAGE_FILESHARE_ENDPOINT}\n```\n\n### Get a resource\n\n#### Get a resource with @Value\n\nYou can use the annotation of `@Value(\"azure-blob://[your-container-name]/[your-blob-name]\")` to autowire a blob resource, as shown in the following example:\n\n```java\n@Value(\"azure-blob://[your-container-name]/[your-blob-name]\")\nprivate Resource storageBlobResource;\n```\n\nYou can use the annotation of `@Value(\"azure-file://[your-fileshare-name]/[your-file-name]\")` to autowire a file resource, as shown in the following example:\n\n```java\n@Value(\"azure-file://[your-fileshare-name]/[your-file-name]\")\nprivate Resource storageFileResource;\n```\n\n#### Get a resource with ResourceLoader\n\n```java\n@Autowired\nprivate ResourceLoader resourceLoader;\n...\n// Get a BlobResource.\nResource storageBlobResource = resourceLoader.getResource(\"azure-blob://[your-container-name]/[your-blob-name]\");\n\n// Get a FileResource.\nResource storageFileResource = resourceLoader.getResource(\"azure-file://[your-fileshare-name]/[your-file-name]\");\n```\n\n#### Get resources by searching pattern\n\nYou can use an implementation class of `ResourcePatternResolver` to search resources. Use `AzureStorageBlobProtocolResolver` to search `blob` resources and `AzureStorageFileProtocolResolver` to search `file` resources.\n\n* For pattern search, the `searchPattern` should start with `azure-blob://` or `azure-file://`. For example, `azure-blob://**/**` means to list all blobs in all containers, and `azure-blob://demo-container/**` means to list all blobs in the `demo-container` container, including any sub-folder.\n\n* For location search, the `searchLocation` should start with `azure-blob://` or `azure-file://` and the remaining file path should exist, otherwise an exception will be thrown.\n\n```java\n@Autowired\nprivate AzureStorageBlobProtocolResolver azureStorageBlobProtocolResolver;\n\n@Autowired\nprivate AzureStorageFileProtocolResolver azureStorageFileProtocolResolver;\n\n// Get all text blobs.\nResource[] blobTextResources = azureStorageBlobProtocolResolver.getResources(\"azure-blob://[container-pattern]/*.txt\");\n\n// Get all text files.\nResource[] fileTextResources = azureStorageFileProtocolResolver.getResources(\"azure-file://[fileshare-pattern]/*.txt\");\n```\n\n### Handling with resource\n\n#### Download data from specific resource\n\nYou can download a resource from Azure Storage Blob or File Share with the `getInputStream()` method of `Resource`.\n\n```java\n@Value(\"azure-blob://[your-container-name]/[your-blob-name]\")\nprivate Resource storageBlobResource;\n\n@Value(\"azure-file://[your-fileshare-name]/[your-file-name]\")\nprivate Resource storageFileResource;\n\n//...\n\n// Download data as a stream from a blob resource.\nInputStream inputblobStream = storageBlobResource.getInputStream();\n\n// Download data as a stream from a file resource.\nInputStream inputfileStream = storageFileResource.getInputStream();\n```\n\n#### Upload data to specific resource\n\nYou can upload to a resource to Azure Blob or file storage by casting the Spring `Resource` to `WritableResource`, as shown in the following example:\n\n```java\n@Value(\"azure-blob://[your-container-name]/[your-blob-name]\")\nprivate Resource storageBlobResource;\n\n@Value(\"azure-file://[your-fileshare-name]/[your-file-name]\")\nprivate Resource storageFileResource;\n\nString data = \"sampledata\";\n\n// Upload string data to a blob.\ntry (OutputStream blobos = ((WritableResource) this.storageBlobResource).getOutputStream()) {\n    blobos.write(data.getBytes());\n}\n\n// Upload string data to a file.\ntry (OutputStream fileos = ((WritableResource) this.storageFileResource).getOutputStream()) {\n    fileos.write(data.getBytes());\n}\n```\n\n### Multipart upload\n\nFiles larger than 4 MiB will be uploaded to Azure Storage in parallel.\n\n## Samples\n\nSee the [`storage-blob-sample`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/storage/spring-cloud-azure-starter-storage-blob/storage-blob-sample) and [`storage-file-sample`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/storage/spring-cloud-azure-starter-storage-file-share/storage-file-sample) repositories on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/resource-manager.md",
    "content": "---\ntitle: Spring Cloud Azure resource manager\ndescription: This article describes Spring Cloud Azure resource manager.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-arm-template, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure Resource Manager\n\nAzure Resource Manager (ARM) is the deployment and management service for Azure. It provides a management layer that enables you to create, update, and delete resources in your Azure account. Spring Cloud Azure Resource Manager can help provision resources or retrieve resource metadata.\n\n## Dependency setup\n\n```xml\n<dependency>\n  <groupId>com.azure.spring</groupId>\n  <artifactId>spring-cloud-azure-resourcemanager</artifactId>\n</dependency>\n```\n\n## Configuration\n\n> [!NOTE]\n> If you choose to use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id) to make sure the security principal has been granted the sufficient permission to access the Azure resource.\n\nConfigurable properties of `spring-cloud-azure-resourcemanager`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                             | Description                                                                                        |\n> |----------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.resource-manager.enabled`                      | Whether the Resource Manager is enabled. Default is true.                                          |\n> | `spring.cloud.azure.credential.client-id`                          | Client ID to use when performing service principal authentication with Azure.                      |\n> | `spring.cloud.azure.credential.client-secret`                      | Client secret to use when performing service principal authentication with Azure.                  |\n> | `spring.cloud.azure.credential.client-certificate-path`            | Path of a PEM certificate file to use when performing service principal authentication with Azure. |\n> | `spring.cloud.azure.credential.client-certificate-password`        | Password of the certificate file.                                                                  |\n> | `spring.cloud.azure.credential.username`                           | Username to use when performing username/password authentication with Azure.                       |\n> | `spring.cloud.azure.credential.password`                           | Password to use when performing username/password authentication.                                  |\n> | `spring.cloud.azure.credential.managed-identity-enabled`           | Whether to enable managed identity.                                                                |\n> | `spring.cloud.azure.profile.cloud-type`                            | Name of the Azure cloud to connect to.                                                             |\n> | `spring.cloud.azure.profile.environment.active-directory-endpoint` | The Microsoft Entra endpoint to connect to for authentication.                              |\n> | `spring.cloud.azure.profile.subscription-id`                       | Subscription ID to use when connecting to Azure resources.                                         |\n> | `spring.cloud.azure.profile.tenant-id`                             | Tenant ID for Azure resources. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                         |\n> | `spring.cloud.azure.azure-service.namespace`                   | The namespace of the Azure service to provision resources with.                                    |\n> | `spring.cloud.azure.azure-service.resource.resource-group`     | The resource group holding an Azure service resource.                                              |\n\n## Basic usage\n\nSpring Cloud Azure Resource Manager can work together with specific Spring Cloud Azure starters to retrieve connection information, such as connection strings, to connect to Azure services. It can also work together with `spring-cloud-azure-starter` and third-party libraries to retrieve metadata like username/password, and to complete authentication. For more information, see [Spring Cloud Azure Kafka Support](kafka-support.md) and [Spring Cloud Azure Redis Support](redis-support.md).\n\nFor example, to retrieve the connection string of an Azure Service, developers can use a service principal as the credential to authenticate and retrieve the connection string. The configuration is listed the follows. The provided service principal should\nbe assigned a role of `Contributor` of the associated namespace at least. See [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id) to make sure the principal has been granted the sufficient permission to access the Azure resource.\n\n```yaml\nspring:\n  cloud:\n    azure:\n      credential:\n        client-id: ${AZURE_CLIENT_ID}\n        client-secret: ${AZURE_CLIENT_SECRET}\n      profile:\n        tenant-id: <tenant>\n        subscription-id: ${AZURE_SUBSCRIPTION_ID}\n      <azure-service>:\n        namespace: ${SERVICEBUS_NAMESPACE}\n        resource:\n          resource-group: ${RESOURCE_GROUP}\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n## Samples\n\nFor more information, see the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/secret-management.md",
    "content": "---\ntitle: Spring Cloud Azure secret management\ndescription: This article describes Spring Cloud Azure secret management.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure secret management\n\nSpring Cloud Azure construct `PropertySource` which holds secrets stored in Azure Key Vault Secrets.\n\n## Dependency setup\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-keyvault-secrets</artifactId>\n</dependency>\n```\n\n> [!TIP]\n> We also provide `spring-cloud-azure-starter-keyvault` to support all the features of Key Vault. If you choose to use it, `spring.cloud.azure.keyvault.enable` is the property to configure and the default value is `true`. You can then use `spring.cloud.azure.keyvault.<keyvault-service>.enable` to disable unneeded services.\n\n## Basic usage\n\nIf you want to authenticate by `client-id` and `client-secret`, the following properties are required:\n\n### Configuration Properties\n\n```yaml\nspring:\n  cloud:\n    azure:\n      keyvault:\n        secret:\n          property-sources:\n            - name: key-vault-property-source-1\n              endpoint: ${ENDPOINT_1}\n            - name: key-vault-property-source-2\n              endpoint: ${ENDPOINT_2}\n```\n\n### Java code\n\n```java\n@SpringBootApplication\npublic class SampleApplication implements CommandLineRunner {\n\n    @Value(\"${sampleProperty1}\")\n    private String sampleProperty1;\n    @Value(\"${sampleProperty2}\")\n    private String sampleProperty2;\n    @Value(\"${samplePropertyInMultipleKeyVault}\")\n    private String samplePropertyInMultipleKeyVault;\n\n    public static void main(String[] args) {\n        SpringApplication.run(SampleApplication.class, args);\n    }\n\n    public void run(String[] args) {\n        System.out.println(\"sampleProperty1: \" + sampleProperty1);\n        System.out.println(\"sampleProperty2: \" + sampleProperty2);\n        System.out.println(\"samplePropertyInMultipleKeyVault: \" + samplePropertyInMultipleKeyVault);\n    }\n}\n```\n\n## Advanced usage\n\n### Special characters in property name\n\nKey Vault secret names support only characters in `[0-9a-zA-Z-]`. For more information, see the[Vault-name and Object-name](/azure/key-vault/general/about-keys-secrets-certificates#vault-name-and-object-name) section of [Azure Key Vault keys, secrets and certificates overview](/azure/key-vault/general/about-keys-secrets-certificates). If your property name contains other characters, you can use the workarounds described in the following sections.\n\n#### Use `-` instead of `.` in secret names\n\n`.` isn't supported in secret names. If your application has a property name that contains `.`, such as `spring.datasource.url`, replace `.` with `-` when saving the secret in Azure Key Vault. For example, save `spring-datasource-url` in Azure Key Vault. In your application, you can still use `spring.datasource.url` to retrieve the property value.\n\n> [!NOTE]\n> This method cannot satisfy a requirement like `spring.datasource-url`. When you save `spring-datasource-url` in Key Vault, only `spring.datasource.url` and `spring-datasource-url` is supported to retrieve the property value, but `spring.datasource-url` isn't supported. To handle this case, see the [Use property placeholders](#use-property-placeholders) section.\n\n#### Use property placeholders\n\nFor example, suppose you're setting this property in your **application.properties** file:\n\n```properties\nproperty.with.special.character__=${propertyWithoutSpecialCharacter}\n```\n\nThe application will get a `propertyWithoutSpecialCharacter` key name and assign its value to `property.with.special.character__`.\n\n### Case-sensitive\n\nTo enable case-sensitive mode, you can set the following property:\n\n```properties\nspring.cloud.azure.keyvault.secret.property-sources[].case-sensitive=true\n```\n\n### Not retrieve all secrets in Key Vault\n\nIf you stored 1000 secrets in the Key Vault, and you just want to use 3 of them. You can list the 3 secret names by `spring.cloud.azure.keyvault.secret.property-sources[].secret-keys`.\n\n### Setting refresh interval\n\nBy default, the secrets in `KeyVaultPropertySource` will refresh every 30 minutes. You can configure the time by `spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval`. For example: `spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval=60m` means refresh every 60 minutes. Set to `0` to disable auto refresh.\n\n### PropertySource priority\n\nIf key exists in multiple PropertySources, which will take effect is decided by the priority.\n\n* If there is no `SystemEnvironmentPropertySource` in the `PropertySource` list, then `KeyVaultPropertySource` will take the highest priority.\n* If there is `SystemEnvironmentPropertySource` in the `PropertySource` list, then `SystemEnvironmentPropertySource` have higher priority than `KeyVaultPropertySource`, which means you can use an environment variable to override the Key Vault secret value in your application.\n* If there are multiple key vault property sources in the `PropertySource` list, then the definition order is the priority order. Taking the above sample as an example, `key-vault-property-source-1` has a higher priority than `key-vault-property-source-2`.\n\n### Configure token credential for Key Vault property source\n\nIf you need to use a specified token credential for Key Vault `PropertySource`, you can register the `TokenCredential` bean in the `ConfigurableBootstrapContext` for `KeyVaultEnvironmentPostProcessor`, this feature is supported from Spring Cloud Azure 5.16.0. Here is an example to use `AzureCliCredential`:\n\n```java\npublic static void main(String[] args) {\n    SpringApplication application = new SpringApplication(PropertySourceApplication.class);\n    application.addBootstrapRegistryInitializer(registry -> \n            registry.register(TokenCredential.class, context -> new AzureCliCredentialBuilder().build()));\n\n    application.run(args);\n}\n```\n\n### All configurable properties\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                 | Default value | Description                                                                                            |\n> |--------------------------------------------------------------------------|---------------|--------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.keyvault.secret.property-source-enabled`             | true          | Whether to enable the Key Vault property source.                                                       |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].name`             |               | Name of this property source.                                                                          |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].endpoint`         |               | Azure Key Vault endpoint.                                                                              |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].case-sensitive`   | false         | Whether the secret keys are case-sensitive.                                                            |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].secret-keys`      |               | The secret keys supported for this property source. All keys be retrieved if this property is missing. |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].refresh-interval` | 30m           | Time interval to refresh all Key Vault secrets.                                                        |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].service-version`  |               | Secret service version used when making API requests.                                                  |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].client`           |               | Client related properties.                                                                             |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].credential`       |               | Credential related properties.                                                                         |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].profile`          |               | Profile related properties.                                                                            |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].proxy`            |               | Proxy related properties.                                                                              |\n> | `spring.cloud.azure.keyvault.secret.property-sources[].retry`            |               | Retry related properties.                                                                              |\n\n* See [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id) to make sure the [security principal](/azure/active-directory/develop/app-objects-and-service-principals#service-principal-object) has been granted the sufficient permission to access the Azure Key Vault Secrets.\n* If common properties like `client`, `credential`, `profile`, `proxy`, `retry` aren't configured in `spring.cloud.azure.keyvault.secret.property-sources[].xxx`, `spring.cloud.azure.xxx` will be used. See [Spring Cloud Azure configuration](configuration-properties-global.md) to get more information about these common properties.\n* See [Spring Cloud Azure configuration properties](configuration-properties-all.md) to get more information about nested properties.\n\n## Samples\n\nSee the [`spring-cloud-azure-starter-keyvault-secrets` samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/keyvault/spring-cloud-azure-starter-keyvault-secrets/property-source) on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/secure-your-restful-api-using-spring-cloud-azure.md",
    "content": "---\ntitle: Secure your REST API using Spring Cloud Azure\ndescription: Shows you how to secure REST API by Microsoft Entra ID.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Secure your REST API using Spring Cloud Azure\n\nThis tutorial shows you how to enable REST APIs protection with [Microsoft Entra ID](/azure/active-directory/fundamentals/active-directory-whatis) in a Spring Boot application.\n\nThis article uses a survey system as an example. The survey system provides the following REST APIs:\n\n- `GET  /api/survey/question` is for viewing the survey.\n- `POST /api/survey` is for fill in the survey.\n- `GET  /api/survey` is for viewing the survey result.\n\nIn this article, you protect these APIs by applying role-based access control (RBAC) to enforce the following requirements:\n\n- `GET  /api/survey/question` is available for each request.\n- `POST /api/survey` is available for authenticated user requests containing an access token with the `SCOPE_Survey.User` scope granted.\n- `GET  /api/survey` is available for authenticated admin user requests containing an access token with the `SCOPE_Survey.Admin` scope granted.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 8 or higher.\n- [Apache Maven](https://maven.apache.org)\n- [Azure CLI](/cli/azure/install-azure-cli)\n- A Microsoft Entra instance. For instructions on creating one, see [Quickstart: Create a new tenant in Microsoft Entra ID](/azure/active-directory/fundamentals/active-directory-access-create-new-tenant).\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web**, **OAuth2 Resource Server**, and **Microsoft Entra ID** dependencies, and then select Java version 8 or higher.\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this article.\n\n## Register the REST API\n\nUse the following steps to register your web API in the Azure portal.\n\n1. Sign in to the [Azure portal](https://portal.azure.com/).\n\n1. If you have access to multiple tenants, use the **Directory + subscription** filter (:::image type=\"icon\" source=\"media/secure-your-restful-api-using-spring-cloud-azure/portal-directory-subscription-filter.png\" border=\"false\":::) to select the tenant in which you want to register an application.\n\n1. Find and select **Microsoft Entra ID**.\n\n1. Under **Manage**, select **App registrations** > **New registration**.\n\n1. Enter a name for your application in the **Name** field, for example `Api-SurveyService`. Users of your app might see this name, and you can change it later.\n\n1. For **Supported account types**, select **Accounts in any organizational directory**.\n\n1. Select **Register** to create the application.\n\n1. On the app **Overview** page, look for the **Application (client) ID** value, and then record it for later use. You need it to configure the YAML configuration file for this project.\n\n1. Under **Manage**, select **Expose an API** > **Add a scope**. Accept the proposed Application ID URI (`api://{clientId}`) by selecting **Save and continue**, and then enter the following information:\n\n   - For **Scope name**, enter `Survey.User`.\n   - For **Who can consent**, select **Admins and users**.\n   - For **Admin consent display name**, enter `Access the survey service as a user.`.\n   - For **Admin consent description**, enter `Allows the users to write data in survey system.`.\n   - For **User consent display name**, enter `Access the survey service as a user.`.\n   - For **User consent description**, enter `Allows the users to write data in survey system.`.\n   - For **State**, keep **Enabled**.\n   - Select **Add scope**.\n\n1. Repeat the previous step to add another scope. When you select **Add a scope**, enter the following information:\n\n   - For **Scope name**, enter `Survey.Admin`.\n   - For **Who can consent**, select **Admins and users**.\n   - For **Admin consent display name**, enter `Access the survey service as a admin.`.\n   - For **Admin consent description**, enter `Allows the users to view data in survey system.`.\n   - For **User consent display name**, enter `Access the survey service as a admin.`.\n   - For **User consent description**, enter `Allows the users to view data in survey system.`.\n   - For **State**, keep **Enabled**.\n   - Select **Add scope**.\n\n<a name='enable-the-spring-cloud-azure-starter-azure-active-directory'></a>\n\n## Enable the Spring Cloud Azure Starter Microsoft Entra ID\n\nNext, enable the REST API protection with Spring Cloud Azure.\n\n### Add Security dependencies\n\nTo install the Spring Cloud Azure Starter Azure Active Directory module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>7.2.0</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Starter Microsoft Entra artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n  </dependency>\n  ```\n\n- The Spring Boot Starter OAuth2 Resource Server artifact:\n\n  ```xml\n  <dependency>\n    <groupId>org.springframework.boot</groupId>\n    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>\n  </dependency>\n  ```\n\n### Authorize HTTP requests\n\nTo protect the survey REST APIs, add the annotation `@PreAuthorize(\"hasAuthority('SCOPE_Survey.xxx')\")` with a concrete scope name to enable protection, as shown in the following example:\n\n```java\nimport org.springframework.http.MediaType;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.time.LocalDateTime;\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\n@RestController\n@RequestMapping(\"/api/survey\")\npublic class SurveyController {\n\n    private static final String QUESTION = \"Which sports do you like most?\";\n    private final Map<LocalDateTime, String> surveys = new LinkedHashMap<>();\n\n    @GetMapping(value = \"/question\", produces = MediaType.APPLICATION_JSON_VALUE)\n    public String question() {\n        return QUESTION;\n    }\n\n    @PostMapping\n    @PreAuthorize(\"hasAuthority('SCOPE_Survey.User')\")\n    public String addAnswer(@RequestParam(\"answer\") String answer) {\n        if (StringUtils.hasText(answer)) {\n            surveys.put(LocalDateTime.now(), answer);\n            return \"succeeded\";\n        }\n        return \"Failed\";\n    }\n\n    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)\n    @PreAuthorize(\"hasAuthority('SCOPE_Survey.Admin')\")\n    public Map<LocalDateTime, String> list() {\n        return surveys;\n    }\n}\n```\n\nUpdate the YAML configuration as shown in the following example:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      active-directory:\n        enabled: true\n        credential:\n          client-id: <your-application-ID-of-Api-SurveyService>\n        app-id-uri: <your-application-ID-URI-of-Api-SurveyService>\n```\n\n> [!NOTE]\n> In v1.0 tokens, the configuration requires the client ID of the API, while in v2.0 tokens, you can use the client ID or the application ID URI in the request. You can configure both to properly complete the audience validation.\n\n## Deploy to Azure Spring Apps\n\nAfter you have the Spring Boot application running locally, you can move it to production. [Azure Spring Apps](/azure/spring-apps/overview) makes it easy to deploy Spring Boot applications to Azure without any code changes. The service manages the infrastructure of Spring applications so developers can focus on their code. Azure Spring Apps provides lifecycle management using comprehensive monitoring and diagnostics, configuration management, service discovery, CI/CD integration, blue-green deployments, and more. For more information, see [Quickstart: Deploy your first application to Azure Spring Apps](/azure/spring-apps/quickstart).\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Microsoft Entra ID Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory)\n"
  },
  {
    "path": "articles/java/spring-framework/spring-boot-starter-for-entra-developer-guide.md",
    "content": "---\ntitle: Spring Boot Starter for Microsoft Entra developer's guide\ndescription: This guide describes the features, issues, workarounds, and diagnostic steps to be aware of when you use the Microsoft Entra starter.\nms.date: 08/19/2025\nms.topic: how-to\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.custom: devx-track-java, engagement-fy23, spring-cloud-azure, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Boot Starter for Microsoft Entra developer's guide\n\nThis article describes the features and core scenarios of the Spring Boot Starter for Microsoft Entra ID. The article also includes guidance on common issues, workarounds, and diagnostic steps.\n\nWhen you're building a web application, identity and access management are foundational pieces. Azure offers a cloud-based identity service that has deep integration with the rest of the Azure ecosystem.\n\nAlthough Spring Security makes it easy to secure your Spring-based applications, it isn't tailored to a specific identity provider. The Spring Boot Starter for Microsoft Entra ID enables you to connect your web application to a Microsoft Entra tenant and protect your resource server with Microsoft Entra ID. It uses the Oauth 2.0 protocol to protect web applications and resource servers.\n\nThe following links provide access to the starter package, documentation, and samples:\n\n- [The `spring-cloud-azure-starter-active-directory` package (Maven)](https://mvnrepository.com/artifact/com.azure.spring/spring-cloud-azure-starter-active-directory)\n- [Quick start](./configure-spring-boot-starter-java-app-with-entra.md)\n- [Samples](https://github.com/Azure-Samples/azure-spring-boot-samples)\n\n## Prerequisites\n\nTo follow the instructions in this guide, you must have the following prerequisites:\n\n- An Azure subscription; if you don't already have an Azure subscription, you can activate your [MSDN subscriber benefits](https://azure.microsoft.com/pricing/member-offers/msdn-benefits-details/) or sign up for a [free Azure account](https://azure.microsoft.com/pricing/free-trial/).\n- A supported Java Development Kit (JDK), version 8 or higher. For more information, see [Java support on Azure and Azure Stack](../fundamentals/java-support-on-azure.md).\n- [Apache Maven](https://maven.apache.org/), version 3.0 or higher.\n- An application registered with Microsoft Entra ID. For more information, see [Quickstart: Register an application with the Microsoft identity platform](/azure/active-directory/develop/quickstart-register-app).\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this article.\n\n## Core scenarios\n\nThis guide describes how to use the Microsoft Entra starter in the following scenarios:\n\n- [Access a web application](#access-a-web-application)\n- [Access resource servers from a web application](#access-resource-servers-from-a-web-application)\n- [Protect a resource server/API](#protect-a-resource-serverapi)\n- [Access other resource servers from a resource server](#access-other-resource-servers-from-a-resource-server)\n- [Web application and resource server in one application](#web-application-and-resource-server-in-one-application)\n\nA *web application* is any web-based application that enables a user to sign in. A *resource server* will either accept or deny access after validating an access token.\n\n### Access a web application\n\nThis scenario uses the [The OAuth 2.0 authorization code grant](/azure/active-directory/develop/v2-oauth2-auth-code-flow) flow to enable a user to sign in with a Microsoft account.\n\nTo use the Microsoft Entra starter in this scenario, use the following steps:\n\nSet the redirect URI to `<application-base-uri>/login/oauth2/code/`. For example: `http://localhost:8080/login/oauth2/code/`. Be sure to include the trailing `/`. For more information about the redirect URI, see [Add a redirect URI](/azure/active-directory/develop/quickstart-register-app#add-a-redirect-uri) in [Quickstart: Register an application with the Microsoft identity platform](/azure/active-directory/develop/quickstart-register-app).\n\n   :::image type=\"content\" source=\"media/spring-boot-starter-for-entra-developer-guide/web-application-set-redirect-uri-2.png\" alt-text=\"Screenshot of Azure portal showing web app authentication page with redirect URI highlighted.\":::\n\nAdd the following dependencies to your **pom.xml** file.\n\n```xml\n<dependency>\n   <groupId>com.azure.spring</groupId>\n   <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n</dependency>\n<dependency>\n   <groupId>org.springframework.boot</groupId>\n   <artifactId>spring-boot-starter-oauth2-client</artifactId>\n</dependency>\n```\n\n> [!NOTE]\n> For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\nAdd the following properties to your **application.yml** file. You can get the values for these properties from the app registration you created in the Azure portal, as described in the prerequisites.\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       enabled: true\n       profile:\n         tenant-id: <tenant>\n       credential:\n         client-id: <your-client-ID>\n         client-secret: <your-client-secret>\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nUse the default security configuration or provide your own configuration.\n\n#### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\nOption 1: Use the default configuration.\n\nWith this option, you don't need to do anything. The `DefaultAadWebSecurityConfiguration` class is configured automatically.\n\nOption 2: Provide a self-defined configuration.\n\nTo provide a configuration, apply the `AadWebApplicationHttpSecurityConfigurer#aadWebApplication` method for the `HttpSecurity`, as shown in the following example:\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2LoginSecurityConfig {\n\n   /**\n    * Add configuration logic as needed.\n    */\n   @Bean\n   SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n     http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())\n         .authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());\n         // Do some custom configuration.\n       return http.build();\n   }\n}\n```\n\n#### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\nOption 1: Use the default configuration.\n\nWith this option, you don't need to do anything. The `DefaultAadWebSecurityConfiguration` class is configured automatically.\n\nOption 2: Provide a self-defined configuration.\n\nTo provide a configuration, apply the `AadWebApplicationHttpSecurityConfigurer#aadWebApplication` method for the `HttpSecurity`, as shown in the following example:\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2LoginSecurityConfig {\n\n   /**\n    * Add configuration logic as needed.\n    */\n   @Bean\n   SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n       http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())\n               .and()\n           .authorizeHttpRequests()\n               .anyRequest().authenticated();\n           // Do some custom configuration.\n       return http.build();\n   }\n}\n```\n\n#### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\nOption 1: Use the default configuration.\n\nWith this option, you don't need to do anything. The `DefaultAadWebSecurityConfigurerAdapter` class is configured automatically.\n\nOption 2: Provide a self-defined configuration.\n\nTo provide a configuration, extend the `AadWebSecurityConfigurerAdapter` class and call `super.configure(http)` in the `configure(HttpSecurity http)` function, as shown in the following example:\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {\n\n   /**\n    * Add configuration logic as needed.\n   */\n   @Override\n   protected void configure(HttpSecurity http) throws Exception {\n       super.configure(http);\n       http.authorizeRequests()\n           .anyRequest().authenticated();\n       // Do some custom configuration.\n   }\n}\n```\n\n---\n\n### Access resource servers from a web application\n\nTo use the Microsoft Entra starter in this scenario, use the following steps:\n\nSet the redirect URI as described previously.\n\nAdd the following dependencies to your **pom.xml** file.\n\n```xml\n<dependency>\n   <groupId>com.azure.spring</groupId>\n   <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n</dependency>\n<dependency>\n   <groupId>org.springframework.boot</groupId>\n   <artifactId>spring-boot-starter-oauth2-client</artifactId>\n</dependency>\n```\n\n> [!NOTE]\n> For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\nAdd the following properties to your **application.yml** file, as described previously:\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       enabled: true\n       profile:\n         tenant-id: <tenant>\n       credential:\n         client-id: <your-client-ID>\n         client-secret: <your-client-secret>\n       authorization-clients:\n         graph:\n           scopes: https://graph.microsoft.com/Analytics.Read, email\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nHere, `graph` is the name of your `OAuth2AuthorizedClient`, and `scopes` are the scopes needed for consent when logging in.\n\nAdd code to your application similar to the following example:\n\n```java\n@GetMapping(\"/graph\")\n@ResponseBody\npublic String graph(\n   @RegisteredOAuth2AuthorizedClient(\"graph\") OAuth2AuthorizedClient graphClient\n) {\n   // toJsonString() is just a demo.\n   // oAuth2AuthorizedClient contains access_token. We can use this access_token to access the resource server.\n   return toJsonString(graphClient);\n}\n```\n\nHere, `graph` is the client ID configured in the previous step. `OAuth2AuthorizedClient` contains the access token, which is used to access the resource server.\n\nFor a complete sample demonstrating this scenario, see [`spring-cloud-azure-starter-active-directory` sample: `aad-web-application`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory/web-client-access-resource-server/aad-web-application).\n\n### Protect a resource server/API\n\nThis scenario doesn't support sign in, but protects the server by validating the access token. If the access token is valid, the server serves the request.\n\nTo use the Microsoft Entra starter in this scenario, use the following steps:\n\nAdd the following dependencies to your **pom.xml** file.\n\n```xml\n<dependency>\n   <groupId>com.azure.spring</groupId>\n   <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n</dependency>\n<dependency>\n   <groupId>org.springframework.boot</groupId>\n   <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>\n</dependency>\n```\n\n> [!NOTE]\n> For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\nAdd the following properties to your **application.yml** file, as described previously:\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       enabled: true\n       credential:\n         client-id: <your-client-ID>\n       app-id-uri: <your-app-ID-URI>\n```\n\nYou can use both the `<your-client-ID>` and `<your-app-ID-URI>` values to verify the access token. You can get the `<your-app-ID-URI>` value from the Azure portal, as shown in the following images:\n\n:::image type=\"content\" source=\"media/spring-boot-starter-for-entra-developer-guide/get-app-id-uri-2.png\" alt-text=\"Screenshot of Azure portal showing web app Expose an API page with Application ID URI highlighted.\":::\n\nUse the default security configuration or provide your own configuration.\n\n#### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\nOption 1: Use the default configuration.\n\nWith this option, you don't need to do anything. The `DefaultAadResourceServerConfiguration` class is configured automatically.\n\nOption 2: Provide a self-defined configuration.\n\nTo provide a configuration, apply the `AadResourceServerHttpSecurityConfigurer#aadResourceServer` method for the `HttpSecurity`, as shown in the following example:\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2ResourceServerSecurityConfig {\n\n   /**\n    * Add configuration logic as needed.\n    */\n   @Bean\n   public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {\n       http.with(AadResourceServerHttpSecurityConfigurer.aadResourceServer(), Customizer.withDefaults())\n           .authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());\n       return http.build();\n   }\n}\n```\n\n#### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\nOption 1: Use the default configuration.\n\nWith this option, you don't need to do anything. The `DefaultAadResourceServerConfiguration` class is configured automatically.\n\nOption 2: Provide a self-defined configuration.\n\nTo provide a configuration, apply the `AadResourceServerHttpSecurityConfigurer#aadResourceServer` method for the `HttpSecurity`, as shown in the following example:\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2ResourceServerSecurityConfig {\n\n   /**\n    * Add configuration logic as needed.\n    */\n   @Bean\n   public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {\n       http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())\n               .and()\n           .authorizeHttpRequests()\n               .anyRequest().authenticated();\n       return http.build();\n   }\n}\n```\n\n#### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\nOption 1: Use the default configuration.\n\nWith this option, you don't need to do anything. The `DefaultAadResourceServerWebSecurityConfigurerAdapter` class is configured automatically.\n\nOption 2: Provide a self-defined configuration.\n\nTo provide a configuration, extend the `AadResourceServerWebSecurityConfigurerAdapter` class and call `super.configure(http)` in the `configure(HttpSecurity http)` function, as shown in the following example:\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class AadOAuth2ResourceServerSecurityConfig extends AadResourceServerWebSecurityConfigurerAdapter {\n\n   /**\n    * Add configuration logic as needed.\n    */\n   @Override\n   protected void configure(HttpSecurity http) throws Exception {\n       super.configure(http);\n       http.authorizeRequests((requests) -> requests.anyRequest().authenticated());\n   }\n}\n```\n\n---\n\nFor a complete sample demonstrating this scenario, see [`spring-cloud-azure-starter-active-directory` sample: `aad-resource-server`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory/web-client-access-resource-server/aad-resource-server).\n\n### Access other resource servers from a resource server\n\nThis scenario supports a resource server visiting other resource servers.\n\nTo use the Microsoft Entra starter in this scenario, use the following steps:\n\nAdd the following dependencies to your **pom.xml** file.\n\n```xml\n<dependency>\n   <groupId>com.azure.spring</groupId>\n   <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n</dependency>\n<dependency>\n   <groupId>org.springframework.boot</groupId>\n   <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>\n</dependency>\n<dependency>\n   <groupId>org.springframework.boot</groupId>\n   <artifactId>spring-boot-starter-oauth2-client</artifactId>\n</dependency>\n```\n\n> [!NOTE]\n> For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\nAdd the following properties to your **application.yml** file:\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       enabled: true\n       profile:\n         tenant-id: <tenant>\n       credential:\n         client-id: <web-API-A-client-ID>\n         client-secret: <web-API-A-client-secret>\n       app-id-uri: <web-API-A-app-ID-URI>\n       authorization-clients:\n         graph:\n           scopes:\n              - https://graph.microsoft.com/User.Read\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nUse the `@RegisteredOAuth2AuthorizedClient` attribute in your code to access the related resource server, as shown in the following example:\n\n```java\n@PreAuthorize(\"hasAuthority('SCOPE_Obo.Graph.Read')\")\n@GetMapping(\"call-graph\")\npublic String callGraph(@RegisteredOAuth2AuthorizedClient(\"graph\") OAuth2AuthorizedClient graph) {\n   return callMicrosoftGraphMeEndpoint(graph);\n}\n```\n\nFor a complete sample demonstrating this scenario, see [`spring-cloud-azure-starter-active-directory` sample: `aad-resource-server-obo`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory/web-client-access-resource-server/aad-resource-server-obo).\n\n### Web application and resource server in one application\n\nThis scenario supports [Access a web application](#access-a-web-application) and [Protect a resource server/API](#protect-a-resource-serverapi) in one application.\n\nTo use `aad-starter` in this scenario, follow these steps:\n\nAdd the following dependencies to your **pom.xml** file.\n\n```xml\n<dependency>\n   <groupId>com.azure.spring</groupId>\n   <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n</dependency>\n<dependency>\n   <groupId>org.springframework.boot</groupId>\n   <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>\n</dependency>\n<dependency>\n   <groupId>org.springframework.boot</groupId>\n   <artifactId>spring-boot-starter-oauth2-client</artifactId>\n</dependency>\n```\n\n> [!NOTE]\n> For more information about how to manage Spring Cloud Azure library versions by using a bill of materials (BOM), see the [Getting started](developer-guide-overview.md#getting-started) section of the [Spring Cloud Azure developer guide](developer-guide-overview.md).\n\nUpdate your **application.yml** file. Set property `spring.cloud.azure.active-directory.application-type` to `web_application_and_resource_server`, and specify the authorization type for each authorization client, as shown in the following example.\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       enabled: true\n       profile:\n         tenant-id: <tenant>\n       credential:\n         client-id: <Web-API-C-client-id>\n         client-secret: <Web-API-C-client-secret>\n       app-id-uri: <Web-API-C-app-id-url>\n       application-type: web_application_and_resource_server  # This is required.\n       authorization-clients:\n         graph:\n           authorizationGrantType: authorization_code  # This is required.\n           scopes:\n             - https://graph.microsoft.com/User.Read\n             - https://graph.microsoft.com/Directory.Read.All\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nWrite Java code to configure multiple `HttpSecurity` instances.\n\n#### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\nIn the following example code, `AadWebApplicationAndResourceServerConfig` contains two security filter chain beans, one for a resource server, and one for a web application. The `apiFilterChain` bean has a high priority to configure the resource server security builder. The `htmlFilterChain` bean has a low priority to configure the web application security builder.\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadWebApplicationAndResourceServerConfig {\n\n    @Bean\n    @Order(1)\n    public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {\n        http.with(AadResourceServerHttpSecurityConfigurer.aadResourceServer(), Customizer.withDefaults())\n            // All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as the web application.\n            .securityMatcher(\"/api/**\")\n            .authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());\n        return http.build();\n    }\n\n    @Bean\n    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())\n            .authorizeHttpRequests(authorize -> authorize.requestMatchers(\"/login\").permitAll().anyRequest().authenticated());\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n#### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\nIn the following example code, `AadWebApplicationAndResourceServerConfig` contains two security filter chain beans, one for a resource server, and one for a web application. The `apiFilterChain` bean has a high priority to configure the resource server security builder. The `htmlFilterChain` bean has a low priority to configure the web application security builder.\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadWebApplicationAndResourceServerConfig {\n\n    @Bean\n    @Order(1)\n    public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {\n        http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())\n                .and()\n            // All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as the web application.\n            .securityMatcher(\"/api/**\")\n            .authorizeHttpRequests()\n                .anyRequest().authenticated();\n        return http.build();\n    }\n\n    @Bean\n    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())\n                .and()\n            .authorizeHttpRequests()\n                .requestMatchers(\"/login\").permitAll()\n                .anyRequest().authenticated();\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n#### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\nIn the following example code, `AadWebApplicationAndResourceServerConfig` contains two security configurations, one for a resource server, and one for a web application. The `ApiWebSecurityConfigurationAdapter` class has a high priority to configure the resource server security adapter. The `HtmlWebSecurityConfigurerAdapter` class has a low priority to configure the web application security adapter.\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class AadWebApplicationAndResourceServerConfig {\n\n   @Order(1)\n   @Configuration\n   public static class ApiWebSecurityConfigurationAdapter extends AadResourceServerWebSecurityConfigurerAdapter {\n       protected void configure(HttpSecurity http) throws Exception {\n           super.configure(http);\n           // All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as  the web application.\n           http.antMatcher(\"/api/**\")\n               .authorizeRequests().anyRequest().authenticated();\n       }\n   }\n\n   @Configuration\n   public static class HtmlWebSecurityConfigurerAdapter extends AadWebSecurityConfigurerAdapter {\n\n       @Override\n       protected void configure(HttpSecurity http) throws Exception {\n           super.configure(http);\n           // @formatter:off\n           http.authorizeRequests()\n                   .antMatchers(\"/login\").permitAll()\n                   .anyRequest().authenticated();\n           // @formatter:on\n       }\n   }\n}\n```\n\n---\n\n### Application type\n\nThe `spring.cloud.azure.active-directory.application-type` property is optional because its value can be inferred by dependencies. You must manually set the property only when you use the `web_application_and_resource_server` value.\n\n| Has dependency: `spring-security-oauth2-client` | Has dependency: `spring-security-oauth2-resource-server` |                  Valid values of application type                                                         | Default value               |\n|-------------------------------------------------|----------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|-----------------------------|\n|                      Yes                        |                          No                              |                       `web_application`                                                                   |       `web_application`     |\n|                      No                         |                          Yes                             |                       `resource_server`                                                                   |       `resource_server`     |\n|                      Yes                        |                          Yes                             | `web_application`,`resource_server`,<br>`resource_server_with_obo`, `web_application_and_resource_server` | `resource_server_with_obo`  |\n\n## Configurable properties\n\nThe Spring Boot Starter for Microsoft Entra ID provides the following properties:\n\n| Properties                                                                                              | Description                                                                                                                                                                                                                                                                                                                                                              |\n|---------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `spring.cloud.azure.active-directory.app-id-uri`                                                        | Used by the resource server to validate the audience in the access token. The access token is valid only when the audience is equal to the `<your-client-ID>` or `<your-app-ID-URI>` values described previously.                                                                                                                                                      |\n| `spring.cloud.azure.active-directory.authorization-clients`                                             | A map that configures the resource APIs the application is going to visit. Each item corresponds to one resource API the application is going to visit. In your Spring code, each item corresponds to one `OAuth2AuthorizedClient` object.                                                                                                                               |\n| `spring.cloud.azure.active-directory.authorization-clients.<your-client-name>.scopes`                   | The API permissions of a resource server that the application is going to acquire.                                                                                                                                                                                                                                                                                       |\n| `spring.cloud.azure.active-directory.authorization-clients.<your-client-name>.authorization-grant-type` | The type of authorization client. Supported types are [`authorization_code`](/azure/active-directory/develop/v2-oauth2-auth-code-flow) (default type for webapp), [`on_behalf_of`](/azure/active-directory/develop/v2-oauth2-on-behalf-of-flow) (default type for resource-server), [`client_credentials`](/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow). |\n| `spring.cloud.azure.active-directory.application-type`                                                  | Refer to [Application type](#application-type).                                                                                                                                                                                                                                                                                                                          |\n| `spring.cloud.azure.active-directory.profile.environment.active-directory-endpoint`                     | The base URI for the authorization server. The default value is `https://login.microsoftonline.com/`.                                                                                                                                                                                                                                                                    |\n| `spring.cloud.azure.active-directory.credential.client-id`                                              | The registered application ID in Microsoft Entra ID.                                                                                                                                                                                                                                                                                                                               |\n| `spring.cloud.azure.active-directory.credential.client-secret`                                          | The client secret of the registered application.                                                                                                                                                                                                                                                                                                                         |\n| `spring.cloud.azure.active-directory.user-group.use-transitive-members`                                 | Use `v1.0/me/transitiveMemberOf` to get groups if set to `true`. Otherwise, use `/v1.0/me/memberOf`.                                                                                                                                                                                                                                                                     |\n| `spring.cloud.azure.active-directory.post-logout-redirect-uri`                                          | The redirect URI for posting the sign-out.                                                                                                                                                                                                                                                                                                                               |\n| `spring.cloud.azure.active-directory.profile.tenant-id`                                                 | The Azure tenant ID. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                                                                                                                                                                         |\n| `spring.cloud.azure.active-directory.user-group.allowed-group-names`                                    | The expected user groups that an authority will be granted to if found in the response from the `MemberOf` Graph API call.                                                                                                                                                                                                                                               |\n| `spring.cloud.azure.active-directory.user-name-attribute`                                               | Indicates which claim will be the principal's name.                                                                                                                                                                                                                                                                                                                      |\n\nThe following examples show you how to use these properties:\n\n**Property example 1:** To use [Azure China 21Vianet](/azure/china/resources-developer-guide#check-endpoints-in-azure) instead of Azure Global, use the following step.\n\n- Add the following properties to your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       azure:\n         active-directory:\n           enabled: true\n           profile:\n             environment:\n               active-directory-endpoint: https://login.partner.microsoftonline.cn\n   ```\n\nWith this method, you can use an [Azure sovereign or national cloud](/azure/active-directory/develop/authentication-national-cloud) instead of the Azure public cloud.\n\n**Property example 2:** To use a group name to protect some method in a web application, use the following steps:\n\nAdd the following property to your **application.yml** file:\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       enabled: true\n       user-group:\n         allowed-groups: group1, group2\n```\n\nUse the default security configuration or provide your own configuration.\n\n#### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\nOption 1: Use the default configuration. With this option, you don't need to do anything. The `DefaultAadWebSecurityConfiguration` class is configured automatically.\n\nOption 2: Provide a self-defined configuration. To provide a configuration, apply the `AadWebApplicationHttpSecurityConfigurer#aadWebApplication` method for the `HttpSecurity`, as shown in the following example:\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2LoginSecurityConfig {\n\n   /**\n    * Add configuration logic as needed.\n    */\n   @Bean\n   public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n       // @formatter:off\n       http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())\n           .authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());\n       // @formatter:on\n       // Do some custom configuration.\n       return http.build();\n   }\n}\n```\n\n#### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\nOption 1: Use the default configuration. With this option, you don't need to do anything. The `DefaultAadWebSecurityConfiguration` class is configured automatically.\n\nOption 2: Provide a self-defined configuration. To provide a configuration, apply the `AadWebApplicationHttpSecurityConfigurer#aadWebApplication` method for the `HttpSecurity`, as shown in the following example:\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2LoginSecurityConfig {\n\n   /**\n    * Add configuration logic as needed.\n    */\n   @Bean\n   public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n       // @formatter:off\n       http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())\n               .and()\n           .authorizeHttpRequests()\n               .anyRequest().authenticated();\n       // @formatter:on\n       // Do some custom configuration.\n       return http.build();\n   }\n}\n```\n\n#### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\nOption 1: Use the default configuration. With this option, you don't need to do anything. The `DefaultAadWebSecurityConfigurerAdapter` class is configured automatically.\n\nOption 2: Provide a self-defined configuration. To provide a configuration, extend the `AadWebSecurityConfigurerAdapter` class and call `super.configure(http)` in the `configure(HttpSecurity http)` function, as shown in the following example:\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {\n\n   /**\n    * Add configuration logic as needed.\n    */\n   @Override\n   protected void configure(HttpSecurity http) throws Exception {\n       super.configure(http);\n       http.authorizeRequests()\n           .anyRequest().authenticated();\n       // Do some custom configuration.\n   }\n}\n```\n\n---\n\nUse the `@PreAuthorize` annotation to protect the method, as shown in the following example:\n\n```java\n@Controller\npublic class RoleController {\n   @GetMapping(\"group1\")\n   @ResponseBody\n   @PreAuthorize(\"hasRole('ROLE_group1')\")\n   public String group1() {\n       return \"group1 message\";\n   }\n\n   @GetMapping(\"group2\")\n   @ResponseBody\n   @PreAuthorize(\"hasRole('ROLE_group2')\")\n   public String group2() {\n       return \"group2 message\";\n   }\n\n   @GetMapping(\"group1Id\")\n   @ResponseBody\n   @PreAuthorize(\"hasRole('ROLE_<group1-id>')\")\n   public String group1Id() {\n       return \"group1Id message\";\n   }\n\n   @GetMapping(\"group2Id\")\n   @ResponseBody\n   @PreAuthorize(\"hasRole('ROLE_<group2-id>')\")\n   public String group2Id() {\n       return \"group2Id message\";\n   }\n}\n```\n\n**Property example 3:** To enable client credential flow in a resource server visiting resource servers, use the following steps:\n\nAdd the following property to your **application.yml** file:\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       enabled: true\n       authorization-clients:\n         webapiC:   # When authorization-grant-type is null, on behalf of flow is used by default\n           authorization-grant-type: client_credentials\n           scopes:\n             - <Web-API-C-app-id-url>/.default\n```\n\nAdd code to your application similar to the following example:\n\n```java\n@PreAuthorize(\"hasAuthority('SCOPE_Obo.WebApiA.ExampleScope')\")\n@GetMapping(\"webapiA/webapiC\")\npublic String callClientCredential() {\n   String body = webClient\n       .get()\n       .uri(CUSTOM_LOCAL_READ_ENDPOINT)\n       .attributes(clientRegistrationId(\"webapiC\"))\n       .retrieve()\n       .bodyToMono(String.class)\n       .block();\n   LOGGER.info(\"Response from Client Credential: {}\", body);\n   return \"client Credential response \" + (null != body ? \"success.\" : \"failed.\");\n}\n```\n\n## Advanced features\n\n### Support access control by ID token in a web application\n\nThe starter supports creating `GrantedAuthority` from an ID token's `roles` claim to allow using the ID token for authorization in a web application. You can use the `appRoles` feature of Microsoft Entra ID to create a `roles` claim and implement access control.\n\n> [!NOTE]\n> The `roles` claim generated from `appRoles` is decorated with prefix `APPROLE_`.\n>\n> When using `appRoles` as a `roles` claim, avoid configuring a group attribute as `roles` at the same time. Otherwise, the group attribute will override the claim to contain group information instead of `appRoles`. You should avoid the following configuration in your manifest:\n>\n>    ```manifest\n>    \"optionalClaims\": {\n>        \"idtoken\": [{\n>            \"name\": \"groups\",\n>            \"additionalProperties\": [\"emit_as_roles\"]\n>        }]\n>    }\n>    ```\n\nTo support access control by ID token in a web application, use the following steps:\n\nAdd app roles in your application and assign them to users or groups. For more information, see [How to: Add app roles to your application and receive them in the token](/azure/active-directory/develop/howto-add-app-roles-in-azure-ad-apps).\n\nAdd the following `appRoles` configuration to your application's manifest:\n\n```manifest\n \"appRoles\": [\n   {\n     \"allowedMemberTypes\": [\n       \"User\"\n     ],\n     \"displayName\": \"Admin\",\n     \"id\": \"2fa848d0-8054-4e11-8c73-7af5f1171001\",\n     \"isEnabled\": true,\n     \"description\": \"Full admin access\",\n     \"value\": \"Admin\"\n    }\n ]\n```\n\nAdd code to your application similar to the following example:\n\n```java\n@GetMapping(\"Admin\")\n@ResponseBody\n@PreAuthorize(\"hasAuthority('APPROLE_Admin')\")\npublic String Admin() {\n   return \"Admin message\";\n}\n```\n\n## Troubleshooting\n\n### Enable client logging\n\nThe Azure SDKs for Java offer a consistent logging story to help troubleshoot and resolve application errors. The logs produced will capture the flow of an application before reaching the terminal, helping to locate the root issue. View the [logging](https://github.com/Azure/azure-sdk-for-java/wiki/Logging-in-Azure-SDK) wiki for guidance on enabling logging.\n\n### Enable Spring logging\n\nSpring enables all the supported logging systems to set logger levels in the Spring environment - for example, in **application.properties** - by using `logging.level.<logger-name>=<level>` where `<level>` is one of `TRACE`, `DEBUG`, `INFO`, `WARN`, `ERROR`, `FATAL`, or `OFF`. You can configure the root logger by using `logging.level.root`.\n\nThe following example shows potential logging settings in the **application.properties** file:\n\n```properties\nlogging.level.root=WARN\nlogging.level.org.springframework.web=DEBUG\nlogging.level.org.hibernate=ERROR\n```\n\nFor more information about logging configuration in Spring, see [Logging](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging) in the Spring documentation.\n\n## Next steps\n\nTo learn more about Spring and Azure, continue to the Spring on Azure documentation center.\n\n> [!div class=\"nextstepaction\"]\n> [Spring on Azure](./index.yml)\n"
  },
  {
    "path": "articles/java/spring-framework/spring-cloud-azure-overview.md",
    "content": "---\ntitle: Spring Cloud Azure Overview\ndescription: Spring Cloud Azure is a project that helps make it easier to use Azure services in Spring Boot applications by providing a group of Java libraries.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: overview\nms.date: 08/19/2025\nms.custom:\n  - devx-track-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# What is Spring Cloud Azure?\n\nSpring Cloud Azure is an open source project that helps make it easier to use [Azure services](https://azure.microsoft.com/products/) in [Spring](https://spring.io/) applications.\n\nSpring Cloud Azure is an open source project, with all resources available to the public. The following list provides links to these resources:\n\n- Source code: [`Azure/azure-sdk-for-java`](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring).\n- Samples: [`Azure-Samples/azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples).\n- Documentation: [Spring Cloud Azure](./index.yml).\n\n## What is Spring Cloud Azure used for?\n\nSpring Cloud Azure can help make it easier to accomplish the following tasks in Spring applications:\n\n- Managing configuration properties with [Azure App Configuration](/azure/azure-app-configuration/overview).\n- Sending and receiving messages with [Azure Event Hubs](/azure/event-hubs/event-hubs-about), [Azure Service Bus](/azure/service-bus-messaging/service-bus-messaging-overview), and [Azure Storage Queue](/azure/storage/queues/storage-queues-introduction).\n- Managing secrets and certificates with [Azure Key Vault](/azure/key-vault/general/overview).\n- Supporting user sign-in with work or school accounts provisioned with [Microsoft Entra ID](/azure/active-directory/fundamentals/active-directory-whatis).\n- Supporting user sign-in with social accounts like Facebook and Google with [Azure Active Directory B2C](/azure/active-directory-b2c/overview).\n- Protecting your web APIs and accessing protected APIs like Microsoft Graph to work with your users' and organization's data with [Microsoft Entra ID](/azure/active-directory/fundamentals/active-directory-whatis) and [Azure Active Directory B2C](/azure/active-directory-b2c/overview).\n- Storing structured data with [Azure Cosmos DB](/azure/cosmos-db/introduction).\n- Storing unstructured data like text or binary data with [Azure Blob Storage](/azure/storage/blobs/storage-blobs-overview).\n- Storing files with [Azure Files](/azure/storage/files/storage-files-introduction).\n\n## Benefits of using Spring Cloud Azure\n\nThe following section demonstrates the benefits of using Spring Cloud Azure. In this section, the retrieval of secrets stored in Azure Key Vault is used as an example. This section compares the differences between developing a Spring Boot application with and without Spring Cloud Azure.\n\n### Without Spring Cloud Azure\n\nWithout Spring Cloud Azure, if you want to retrieve secrets stored in Azure Key Vault, you need to the following steps:\n\n1. Add the following dependencies to your **pom.xml** file:\n\n   ```xml\n   <dependency>\n      <groupId>com.azure</groupId>\n      <artifactId>azure-security-keyvault-secrets</artifactId>\n      <version>4.5.2</version>\n   </dependency>\n   ```\n\n1. Construct a `SecretClient` class instance by using code similar to the following example:\n\n   ```java\n   public class DemoClass {\n       public static void main(String... args) {\n       SecretClient client = new SecretClientBuilder()\n           .vaultUrl(\"vaultUrl\")\n           .credential(new ClientSecretCredentialBuilder()\n               .tenantId(\"tenantId\")\n               .clientId(\"clientId\")\n               .clientSecret(\"clientSecret\")\n               .build())\n           .buildClient();\n       }\n   }\n   ```\n\n1. Avoid hard coding information such as `client-id` and `client-secret` by making these properties configurable, as shown in the following example:\n\n   ```java\n   @ConfigurationProperties(\"azure.keyvault\")\n   public class KeyVaultProperties {\n       private String vaultUrl;\n       private String tenantId;\n       private String clientId;\n       private String clientSecret;\n\n       public KeyVaultProperties(String vaultUrl, String tenantId, String clientId, String clientSecret) {\n           this.vaultUrl = vaultUrl;\n           this.tenantId = tenantId;\n           this.clientId = clientId;\n           this.clientSecret = clientSecret;\n       }\n\n       public String getVaultUrl() {\n           return vaultUrl;\n       }\n\n       public void setVaultUrl(String vaultUrl) {\n           this.vaultUrl = vaultUrl;\n       }\n\n       public String getTenantId() {\n           return tenantId;\n       }\n\n       public void setTenantId(String tenantId) {\n           this.tenantId = tenantId;\n       }\n\n       public String getClientId() {\n           return clientId;\n       }\n\n       public void setClientId(String clientId) {\n           this.clientId = clientId;\n       }\n\n       public String getClientSecret() {\n           return clientSecret;\n       }\n\n       public void setClientSecret(String clientSecret) {\n           this.clientSecret = clientSecret;\n       }\n   }\n   ```\n\n1. Update your application code as shown in this example:\n\n   ```java\n   @SpringBootApplication\n   @EnableConfigurationProperties(KeyVaultProperties.class)\n   public class SecretClientApplication implements CommandLineRunner {\n       private KeyVaultProperties properties;\n\n       public SecretClientApplication(KeyVaultProperties properties) {\n           this.properties = properties;\n       }\n\n       public static void main(String[] args) {\n           SpringApplication.run(SecretClientApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n           SecretClient client = new SecretClientBuilder()\n               .vaultUrl(properties.getVaultUrl())\n               .credential(new ClientSecretCredentialBuilder()\n                   .tenantId(properties.getTenantId())\n                   .clientId(properties.getClientId())\n                   .clientSecret(properties.getClientSecret())\n                   .build())\n               .buildClient();\n           System.out.println(\"sampleProperty: \" + client.getSecret(\"sampleProperty\").getValue());\n       }\n   }\n   ```\n\n1. Add the necessary properties to your **application.yml** file, as shown in the following example:\n\n   ```yaml\n   azure:\n     keyvault:\n       vault-url:\n       tenant-id:\n       client-id:\n       client-secret:\n   ```\n\n1. If you need to use `SecretClient` in multiple places, define a `SecretClient` bean. Then, auto-wire `SecretClient` in the relevant places.\n\n### With Spring Cloud Azure\n\nWith Spring Cloud Azure, if you want to retrieve secrets stored in Azure Key Vault, the requirements are simpler, as shown in the following steps:\n\n1. Add the following dependencies to your **pom.xml** file:\n\n   ```xml\n   <dependencies>\n     <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>spring-cloud-azure-starter-keyvault-secrets</artifactId>\n     </dependency>\n   </dependencies>\n   ```\n\n1. Use a bill of materials (BOM) to manage the Spring Cloud Azure version, as shown in the following example:\n\n   ```xml\n   <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n       </dependency>\n     </dependencies>\n   </dependencyManagement>\n   ```\n\n[!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n1. Add the following properties to your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       azure:\n         keyvault:\n           secret:\n             endpoint:\n   ```\n\n1. Sign in with [Azure CLI](/cli/azure/) by using the following command. Your credentials will then be provided by Azure CLI, so there will be no need to add other credential information such as `client-id` and `client-secret`.\n\n   ```azurecli\n   az login\n   ```\n\n1. Auto-wire `SecretClient` in the relevant places, as shown in the following example:\n\n   ```java\n   @SpringBootApplication\n   public class SecretClientApplication implements CommandLineRunner {\n\n       private final SecretClient secretClient;\n\n       public SecretClientApplication(SecretClient secretClient) {\n           this.secretClient = secretClient;\n       }\n\n       public static void main(String[] args) {\n           SpringApplication.run(SecretClientApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n           System.out.println(\"sampleProperty: \" + secretClient.getSecret(\"sampleProperty\").getValue());\n       }\n   }\n   ```\n\nSpring Cloud Azure will provide some other features besides the auto-configured `SecretClient`. For example, you can use `@Value` to get the secret value, as shown in the following example:\n\n```java\n@SpringBootApplication\npublic class PropertySourceApplication implements CommandLineRunner {\n\n    @Value(\"${sampleProperty1}\")\n    private String sampleProperty1;\n\n    public static void main(String[] args) {\n        SpringApplication.run(PropertySourceApplication.class, args);\n    }\n\n    public void run(String[] args) {\n        System.out.println(\"sampleProperty1: \" + sampleProperty1);\n    }\n\n}\n```\n\n## Components of Spring Cloud Azure\n\n### Azure support\n\nProvides auto-configuration support for Azure Services, such as Service Bus, Storage, Active Directory, and so on.\n\n<a name='azure-active-directory'></a>\n\n### Microsoft Entra ID\n\nProvides integration support for Spring Security with Microsoft Entra ID for authentication. For more information, see [Spring Cloud Azure support for Spring Security](spring-security-support.md).\n\n### Azure Key Vault\n\nProvides Spring `@Value` annotation support for integration with Azure Key Vault Secrets. For more information, see [Spring Cloud Azure secret management](secret-management.md).\n\n### Azure Storage\n\nProvides Spring Boot support for Azure Storage services. For more information, see [Spring Cloud Azure resource handling](resource-handling.md).\n\n## Get support\n\nIf you need support for Spring Cloud Azure, you can ask for help in the following ways:\n\n- Create Azure support tickets. Customers with an [Azure support plan](https://azure.microsoft.com/support/options/) can open an [Azure support ticket](https://azure.microsoft.com/support/create-ticket/). We recommend this option if your problem requires immediate attention.\n- File GitHub issues in the [`Azure/azure-sdk-for-java` repository](https://github.com/Azure/azure-sdk-for-java). We use GitHub issues to track bugs, questions, and feature requests. GitHub issues are free, but the response time isn't guaranteed. For more information, see [GitHub issues support process](https://devblogs.microsoft.com/azure-sdk/github-issue-support-process/).\n\n## Next steps\n\n- [Tutorial: Read a secret from Azure Key Vault in a Spring Boot application](configure-spring-boot-starter-java-app-with-azure-key-vault.md)\n- [Secure REST API using Spring Security 5 and Microsoft Entra ID](configure-spring-boot-starter-java-app-with-entra.md)\n- [How to use the Spring Boot Starter with Azure Cosmos DB for NoSQL](configure-spring-boot-starter-java-app-with-cosmos-db.md)\n"
  },
  {
    "path": "articles/java/spring-framework/spring-cloud-stream-support.md",
    "content": "---\ntitle: Spring Cloud Stream support\ndescription: This article describes how Spring Cloud Azure and Spring Cloud Stream can be used together.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure support for Spring Cloud Stream\n\nSpring Cloud Stream is a framework for building highly scalable event-driven microservices connected with shared messaging systems.\n\nThe framework provides a flexible programming model built on already established and familiar Spring idioms and best practices. These best practices include support for persistent pub/sub semantics, consumer groups, and stateful partitions.\n\nCurrent binder implementations include:\n\n* `spring-cloud-azure-stream-binder-eventhubs` - for more information, see [Spring Cloud Stream Binder for Azure Event Hubs](#spring-cloud-stream-binder-for-azure-event-hubs)\n* `spring-cloud-azure-stream-binder-servicebus` - for more information, see [Spring Cloud Stream Binder for Azure Service Bus](#spring-cloud-stream-binder-for-azure-service-bus)\n\n## Spring Cloud Stream Binder for Azure Event Hubs\n\n### Key concepts\n\nThe Spring Cloud Stream Binder for Azure Event Hubs provides the binding implementation for the Spring Cloud Stream framework.\nThis implementation uses Spring Integration Event Hubs Channel Adapters at its foundation. From design's perspective,\nEvent Hubs is similar as Kafka. Also, Event Hubs could be accessed via Kafka API. If your project has tight dependency\non Kafka API, you can try [Events Hub with Kafka API Sample](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/eventhubs/spring-cloud-azure-starter/spring-cloud-azure-sample-eventhubs-kafka)\n\n#### Consumer group\n\nEvent Hubs provides similar support of consumer group as Apache Kafka, but with slight different logic. While Kafka stores all committed offsets in the broker, you have to store offsets of Event Hubs messages being processed manually. Event Hubs SDK provides the function to store such offsets inside Azure Storage.\n\n#### Partitioning support\n\nEvent Hubs provides a similar concept of physical partition as Kafka. But unlike Kafka's auto rebalancing between consumers and partitions, Event Hubs provides a kind of preemptive mode. The storage account acts as a lease to determine which consumer owns which partition. When a new consumer starts, it tries to steal some partitions from the most heavily loaded consumers to achieve the workload balance.\n\nTo specify the load balancing strategy, properties of `spring.cloud.stream.eventhubs.bindings.<binding-name>.consumer.load-balancing.*` are provided. For more information, see the [Consumer properties](#consumer-properties) section.\n\n#### Batch consumer support\n\nSpring Cloud Azure Stream Event Hubs binder supports [Spring Cloud Stream Batch Consumer feature](https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#_batch_consumers).\n\nTo work with the batch-consumer mode, set the `spring.cloud.stream.bindings.<binding-name>.consumer.batch-mode` property to `true`. When enabled, a message with a payload of a list of batched events is received and passed to the `Consumer` function. Each message header is also converted to a list, of which the content is the associated header value parsed from each event. The communal headers of partition ID, checkpointer, and last enqueued properties are presented as a single value because the entire batch of events shares the same value. For more information, see the [Event Hubs message headers](spring-integration-support.md#event-hubs-message-headers) section of [Spring Cloud Azure support for Spring Integration](./spring-integration-support.md).\n\n> [!NOTE]\n> The checkpoint header only exists when the `MANUAL` checkpoint mode is used.\n\nCheckpointing of batch consumer supports two modes: `BATCH` and `MANUAL`. `BATCH` mode is an auto checkpointing mode to checkpoint the entire batch of events together once the binder receives them. `MANUAL` mode is to checkpoint the events by users. When used, the `Checkpointer` is passed into the message header, and users could use it to do checkpointing.\n\nYou can specify the batch size by setting the `max-size` and `max-wait-time`  properties that have a prefix of `spring.cloud.stream.eventhubs.bindings.<binding-name>.consumer.batch.`. The `max-size` property is necessary and the `max-wait-time` property is optional. For more information, see the [Consumer properties](#consumer-properties) section.\n\n### Dependency setup\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-stream-binder-eventhubs</artifactId>\n</dependency>\n```\n\nAlternatively, you can also use the Spring Cloud Azure Stream Event Hubs Starter, as shown in the following example for Maven:\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-stream-eventhubs</artifactId>\n</dependency>\n```\n\n### Configuration\n\nThe binder provides the following three parts of configuration options:\n\n#### Connection configuration properties\n\nThis section contains the configuration options used for connecting to Azure Event Hubs.\n\n> [!NOTE]\n> If you choose to use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id) to make sure the security principal has been granted the sufficient permission to access the Azure resource.\n\nConnection configurable properties of `spring-cloud-azure-stream-binder-eventhubs`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                 | Type    | Description                                                                                                                |\n> |----------------------------------------------------------|---------|----------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.eventhubs.enabled`                 | boolean | Whether an Azure Event Hubs is enabled.                                                                                    |\n> | `spring.cloud.azure.eventhubs.connection-string`       | String  | Event Hubs Namespace connection string value.                                                                              |\n> | `spring.cloud.azure.eventhubs.namespace`               | String  | Event Hubs Namespace value, which is the prefix of the FQDN. A FQDN should be composed of NamespaceName.DomainName |\n> | `spring.cloud.azure.eventhubs.domain-name`             | String  | Domain name of an Azure Event Hubs Namespace value.                                                                        |\n> | `spring.cloud.azure.eventhubs.custom-endpoint-address` | String  | Custom Endpoint address.                                                                                                   |\n\n> [!TIP]\n> Common Azure Service SDK configuration options are configurable for the Spring Cloud Azure Stream Event Hubs binder as well. The supported configuration options are introduced in [Spring Cloud Azure configuration](configuration.md), and could be configured with either the unified prefix `spring.cloud.azure.` or the prefix of `spring.cloud.azure.eventhubs.`.\n\nThe binder also supports [Spring Could Azure Resource Manager](resource-manager.md) by default. To learn about how to retrieve the connection string with security principals that aren't granted with `Data` related roles, see the [Basic usage](resource-manager.md#basic-usage) section of [Spring Could Azure Resource Manager](resource-manager.md).\n\n#### Checkpoint configuration properties\n\nThis section contains the configuration options for the Storage Blobs service, which is used for persisting partition ownership and checkpoint information.\n\n> [!NOTE]\n> From version 4.0.0, when the property of `spring.cloud.azure.eventhubs.processor.checkpoint-store.create-container-if-not-exists` isn't enabled manually, no Storage container will be created automatically with the name from `spring.cloud.stream.bindings.binding-name.destination`.\n\nCheckpointing configurable properties of `spring-cloud-azure-stream-binder-eventhubs`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                   | Type    | Description                                         |\n> |--------------------------------------------------------------------------------------------|---------|-----------------------------------------------------|\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.create-container-if-not-exists` | Boolean | Whether to allow creating containers if not exists. |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name`                   | String  | Name for the storage account.                       |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-key`                    | String  | Storage account access key.                         |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name`                 | String  | Storage container name.                             |\n\n> [!TIP]\n> Common Azure Service SDK configuration options are configurable for Storage Blob checkpoint store as well. The supported configuration options are introduced in [Spring Cloud Azure configuration](configuration.md), and could be configured with either the unified prefix `spring.cloud.azure.` or the prefix of `spring.cloud.azure.eventhubs.processor.checkpoint-store`.\n\n#### Azure Event Hubs Binding configuration properties\n\nThe following options are divided into four sections: Consumer Properties, Advanced Consumer Configurations, Producer Properties and Advanced Producer Configurations.\n\n##### Consumer properties\n\nThese properties are exposed via `EventHubsConsumerProperties`.\n\n> [!NOTE]\n> To avoid repetition, since version 4.17.0 and 5.11.0, Spring Cloud Azure Stream Binder Event Hubs supports setting values for all channels, in the format of `spring.cloud.stream.eventhubs.default.consumer.<property>=<value>`.\n\nConsumer configurable properties of `spring-cloud-azure-stream-binder-eventhubs`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                                                    | Type                                                                          | Description                                                                                                                                                                      |\n> |-----------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.checkpoint.mode`                                        | CheckpointMode                                                                | Checkpoint mode used when consumer decide how to checkpoint message                                                                                                              |\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.checkpoint.count`                                       | Integer                                                                       | Decides the amount of message for each partition to do one checkpoint. Will take effect only when `PARTITION_COUNT` checkpoint mode is used.                                     |\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.checkpoint.interval`                                    | Duration                                                                      | Decides the time interval to do one checkpoint. Will take effect only when `TIME` checkpoint mode is used.                                                                       |\n> | `spring.cloud.stream.eventhubs.bindings.<binding-name>.consumer.batch.max-size`                                         | Integer                                                                       | The maximum number of events in a batch. Required for the batch-consumer mode.                                                                                                   |\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.batch.max-wait-time`                                    | Duration                                                                      | The maximum time duration for batch consuming. Will take effect only when the batch-consumer mode is enabled and is optional.                                                    |\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.load-balancing.update-interval`                         | Duration                                                                      | The interval time duration for updating.                                                                                                                                         |\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.load-balancing.strategy`                                | LoadBalancingStrategy                                                         | The load balancing strategy.                                                                                                                                                     |\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.load-balancing.partition-ownership-expiration-interval` | Duration                                                                      | The time duration after which the ownership of partition expires.                                                                                                                |\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.track-last-enqueued-event-properties`                   | Boolean                                                                       | Whether the event processor should request information on the last enqueued event on its associated partition, and track that information as events are received.                |\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.prefetch-count`                                         | Integer                                                                       | The count used by the consumer to control the number of events the Event Hub consumer will actively receive and queue locally.                                                   |\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.consumer.initial-partition-event-position`                       | Map with the key as the partition ID, and values of `StartPositionProperties` | The map containing the event position to use for each partition if a checkpoint for the partition does not exist in checkpoint store. This map is keyed off of the partition ID. |\n\n> [!NOTE]\n> The `initial-partition-event-position` configuration accepts a `map` to specify the initial position for each event hub. Thus, its key is the partition ID, and the value is of `StartPositionProperties`, which includes properties of offset, sequence number, enqueued date time and whether inclusive. For example, you can set it as\n\n```yaml\nspring:\n  cloud:\n    stream:\n      eventhubs:\n        bindings:\n          <binding-name>:\n            consumer:\n              initial-partition-event-position:\n                0:\n                  offset: earliest\n                1:\n                  sequence-number: 100\n                2:\n                  enqueued-date-time: 2022-01-12T13:32:47.650005Z\n                4:\n                  inclusive: false\n```\n\n##### Advanced consumer configuration\n\nThe above [connection](#connection-configuration-properties), [checkpoint](#checkpoint-configuration-properties), and [common Azure SDK client](configuration.md) configuration support customization for each binder consumer, which you can configure with the prefix `spring.cloud.stream.eventhubs.bindings.<binding-name>.consumer.`.\n\n##### Producer properties\n\nThese properties are exposed via `EventHubsProducerProperties`.\n\n> [!NOTE]\n> To avoid repetition, since version 4.17.0 and 5.11.0, Spring Cloud Azure Stream Binder Event Hubs supports setting values for all channels, in the format of `spring.cloud.stream.eventhubs.default.producer.<property>=<value>`.\n\nProducer configurable properties of `spring-cloud-azure-stream-binder-eventhubs`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                          | Type    | Description                                                                                                              |\n> |-----------------------------------------------------------------------------------|---------|--------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.producer.sync`         | boolean | The switch flag for sync of producer. If true, the producer will wait for a response after a send operation.             |\n> | `spring.cloud.stream.eventhubs.bindings.binding-name.producer.send-timeout` | long    | The amount of time to wait for a response after a send operation. Will take effect only when a sync producer is enabled. |\n\n##### Advanced producer configuration\n\nThe above [connection](#connection-configuration-properties) and [common Azure SDK client](configuration.md) configuration support customization for each binder producer, which you can configure with the prefix `spring.cloud.stream.eventhubs.bindings.<binding-name>.producer.`.\n\n### Basic usage\n\n#### Sending and receiving messages from/to Event Hubs\n\n1. Fill the configuration options with credential information.\n\n   * For credentials as connection string, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           eventhubs:\n             connection-string: ${EVENTHUB_NAMESPACE_CONNECTION_STRING}\n             processor:\n               checkpoint-store:\n                 container-name: ${CHECKPOINT_CONTAINER}\n                 account-name: ${CHECKPOINT_STORAGE_ACCOUNT}\n                 account-key: ${CHECKPOINT_ACCESS_KEY}\n         function:\n           definition: consume;supply\n         stream:\n           bindings:\n             consume-in-0:\n               destination: ${EVENTHUB_NAME}\n               group: ${CONSUMER_GROUP}\n             supply-out-0:\n               destination: ${THE_SAME_EVENTHUB_NAME_AS_ABOVE}\n           eventhubs:\n             bindings:\n               consume-in-0:\n                 consumer:\n                   checkpoint:\n                     mode: MANUAL\n     ```\n\n     [!INCLUDE [security-note](../includes/security-note.md)]\n\n   * For credentials as service principal, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             client-id: ${AZURE_CLIENT_ID}\n             client-secret: ${AZURE_CLIENT_SECRET}\n           profile:\n             tenant-id: <tenant>\n           eventhubs:\n             namespace: ${EVENTHUB_NAMESPACE}\n             processor:\n               checkpoint-store:\n                 container-name: ${CONTAINER_NAME}\n                 account-name: ${ACCOUNT_NAME}\n         function:\n           definition: consume;supply\n         stream:\n           bindings:\n             consume-in-0:\n               destination: ${EVENTHUB_NAME}\n               group: ${CONSUMER_GROUP}\n             supply-out-0:\n               destination: ${THE_SAME_EVENTHUB_NAME_AS_ABOVE}\n           eventhubs:\n             bindings:\n               consume-in-0:\n                 consumer:\n                   checkpoint:\n                     mode: MANUAL\n     ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n   * For credentials as managed identities, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             managed-identity-enabled: true\n             client-id: ${AZURE_MANAGED_IDENTITY_CLIENT_ID} # Only needed when using a user-assigned managed identity\n           eventhubs:\n             namespace: ${EVENTHUB_NAMESPACE}\n             processor:\n               checkpoint-store:\n                 container-name: ${CONTAINER_NAME}\n                 account-name: ${ACCOUNT_NAME}\n         function:\n           definition: consume;supply\n         stream:\n           bindings:\n             consume-in-0:\n               destination: ${EVENTHUB_NAME}\n               group: ${CONSUMER_GROUP}\n             supply-out-0:\n               destination: ${THE_SAME_EVENTHUB_NAME_AS_ABOVE}\n\n           eventhubs:\n             bindings:\n               consume-in-0:\n                 consumer:\n                   checkpoint:\n                     mode: MANUAL\n     ```\n\n1. Define supplier and consumer.\n\n   ```java\n   @Bean\n   public Consumer<Message<String>> consume() {\n       return message -> {\n           Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n           LOGGER.info(\"New message received: '{}', partition key: {}, sequence number: {}, offset: {}, enqueued time: {}\",\n                   message.getPayload(),\n                   message.getHeaders().get(EventHubsHeaders.PARTITION_KEY),\n                   message.getHeaders().get(EventHubsHeaders.SEQUENCE_NUMBER),\n                   message.getHeaders().get(EventHubsHeaders.OFFSET),\n                   message.getHeaders().get(EventHubsHeaders.ENQUEUED_TIME)\n           );\n\n           checkpointer.success()\n                   .doOnSuccess(success -> LOGGER.info(\"Message '{}' successfully checkpointed\", message.getPayload()))\n                   .doOnError(error -> LOGGER.error(\"Exception found\", error))\n                   .block();\n       };\n   }\n\n   @Bean\n   public Supplier<Message<String>> supply() {\n       return () -> {\n           LOGGER.info(\"Sending message, sequence \" + i);\n           return MessageBuilder.withPayload(\"Hello world, \" + i++).build();\n       };\n   }\n   ```\n\n#### Partitioning support\n\nA `PartitionSupplier` with user-provided partition information is created to configure the partition information about the message to be sent. The following flowchart shows the process of obtaining different priorities for the partition ID and key:\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/flowchart-partitioning-support.png\" alt-text=\"Diagram showing a flowchart of the partitioning support process.\" border=\"false\":::\n\n#### Batch consumer support\n\n1. Provide the batch configuration options, as shown in the following example:\n\n   ```yaml\n   spring:\n     cloud:\n       function:\n         definition: consume\n       stream:\n         bindings:\n           consume-in-0:\n             destination: ${AZURE_EVENTHUB_NAME}\n             group: ${AZURE_EVENTHUB_CONSUMER_GROUP}\n             consumer:\n               batch-mode: true\n         eventhubs:\n           bindings:\n             consume-in-0:\n               consumer:\n                 batch:\n                   max-batch-size: 10 # Required for batch-consumer mode\n                   max-wait-time: 1m # Optional, the default value is null\n                 checkpoint:\n                   mode: BATCH # or MANUAL as needed\n   ```\n\n1. Define supplier and consumer.\n\n   For checkpointing mode as `BATCH`, you can use the following code to send messages and consume in batches.\n\n   ```java\n   @Bean\n   public Consumer<Message<List<String>>> consume() {\n       return message -> {\n           for (int i = 0; i < message.getPayload().size(); i++) {\n               LOGGER.info(\"New message received: '{}', partition key: {}, sequence number: {}, offset: {}, enqueued time: {}\",\n                       message.getPayload().get(i),\n                       ((List<Object>) message.getHeaders().get(EventHubsHeaders.BATCH_CONVERTED_PARTITION_KEY)).get(i),\n                       ((List<Object>) message.getHeaders().get(EventHubsHeaders.BATCH_CONVERTED_SEQUENCE_NUMBER)).get(i),\n                       ((List<Object>) message.getHeaders().get(EventHubsHeaders.BATCH_CONVERTED_OFFSET)).get(i),\n                       ((List<Object>) message.getHeaders().get(EventHubsHeaders.BATCH_CONVERTED_ENQUEUED_TIME)).get(i));\n           }\n       };\n   }\n\n   @Bean\n   public Supplier<Message<String>> supply() {\n       return () -> {\n           LOGGER.info(\"Sending message, sequence \" + i);\n           return MessageBuilder.withPayload(\"\\\"test\"+ i++ +\"\\\"\").build();\n       };\n   }\n   ```\n\n   For checkpointing mode as `MANUAL`, you can use the following code to send messages and consume/checkpoint in batches.\n\n   ```java\n   @Bean\n   public Consumer<Message<List<String>>> consume() {\n       return message -> {\n           for (int i = 0; i < message.getPayload().size(); i++) {\n               LOGGER.info(\"New message received: '{}', partition key: {}, sequence number: {}, offset: {}, enqueued time: {}\",\n                   message.getPayload().get(i),\n                   ((List<Object>) message.getHeaders().get(EventHubHeaders.BATCH_CONVERTED_PARTITION_KEY)).get(i),\n                   ((List<Object>) message.getHeaders().get(EventHubHeaders.BATCH_CONVERTED_SEQUENCE_NUMBER)).get(i),\n                   ((List<Object>) message.getHeaders().get(EventHubHeaders.BATCH_CONVERTED_OFFSET)).get(i),\n                   ((List<Object>) message.getHeaders().get(EventHubHeaders.BATCH_CONVERTED_ENQUEUED_TIME)).get(i));\n           }\n\n           Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n           checkpointer.success()\n                       .doOnSuccess(success -> LOGGER.info(\"Message '{}' successfully checkpointed\", message.getPayload()))\n                       .doOnError(error -> LOGGER.error(\"Exception found\", error))\n                       .block();\n       };\n   }\n\n   @Bean\n   public Supplier<Message<String>> supply() {\n       return () -> {\n           LOGGER.info(\"Sending message, sequence \" + i);\n           return MessageBuilder.withPayload(\"\\\"test\"+ i++ +\"\\\"\").build();\n       };\n   }\n   ```\n\n> [!NOTE]\n> In the batch-consuming mode, the default content type of Spring Cloud Stream binder is `application/json`, so make sure the message payload is aligned with the content type. For example, when using the default content type of `application/json` to receive messages with `String` payload, the payload should be `JSON String`, surrounded with double quotes for the original `String` text. While for `text/plain` content type, it can be a `String` object directly. For more information, see [Spring Cloud Stream Content Type Negotiation](https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#content-type-management).\n\n#### Handle error messages\n\n##### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\n* Handle outbound binding error messages\n\n  By default, Spring Integration creates a global error channel called `errorChannel`. Configure the following message endpoint to handle outbound binding error messages.\n\n  ```java\n  @ServiceActivator(inputChannel = IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)\n  public void handleError(ErrorMessage message) {\n      LOGGER.error(\"Handling outbound binding error: \" + message);\n  }\n  ```\n\n* Handle inbound binding error messages\n\n  Spring Cloud Stream Event Hubs Binder supports one solution to handle errors for the inbound message bindings: error handlers.\n\n  **Error Handler**:\n\n  Spring Cloud Stream exposes a mechanism for you to provide a custom error handler by adding a `Consumer` that accepts `ErrorMessage` instances. For more information, see [Handle Error Messages](https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#_handle_error_messages) in the Spring Cloud Stream documentation.\n\n    * Binding-default error handler\n\n      Configure a single `Consumer` bean to consume all inbound binding error messages. The following default function subscribes to each inbound binding error channel:\n\n      ```java\n      @Bean\n      public Consumer<ErrorMessage> myDefaultHandler() {\n          return message -> {\n              // consume the error message\n          };\n      }\n      ```\n\n      You also need to set the `spring.cloud.stream.default.error-handler-definition` property to the function name.\n\n    * Binding-specific error handler\n\n      Configure a `Consumer` bean to consume the specific inbound binding error messages. The following function subscribes to the specific inbound binding error channel and has a higher priority than the binding-default error handler:\n\n      ```java\n      @Bean\n      public Consumer<ErrorMessage> myErrorHandler() {\n          return message -> {\n              // consume the error message\n          };\n      }\n      ```\n\n      You also need to set the `spring.cloud.stream.bindings.<input-binding-name>.error-handler-definition` property to the function name.\n\n##### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n* Handle outbound binding error messages\n\n  By default, Spring Integration creates a global error channel called `errorChannel`. Configure the following message endpoint to handle outbound binding error messages.\n\n  ```java\n  @ServiceActivator(inputChannel = IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)\n  public void handleError(ErrorMessage message) {\n      LOGGER.error(\"Handling outbound binding error: \" + message);\n  }\n  ```\n\n* Handle inbound binding error messages\n\n  Spring Cloud Stream Event Hubs Binder supports one solution to handle errors for the inbound message bindings: error handlers.\n\n  **Error Handler**:\n\n  Spring Cloud Stream exposes a mechanism for you to provide a custom error handler by adding a `Consumer` that accepts `ErrorMessage` instances. For more information, see [Handle Error Messages](https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#_handle_error_messages) in the Spring Cloud Stream documentation.\n\n  * Binding-default error handler\n\n    Configure a single `Consumer` bean to consume all inbound binding error messages. The following default function subscribes to each inbound binding error channel:\n\n    ```java\n    @Bean\n    public Consumer<ErrorMessage> myDefaultHandler() {\n        return message -> {\n            // consume the error message\n        };\n    }\n    ```\n\n    You also need to set the `spring.cloud.stream.default.error-handler-definition` property to the function name.\n\n  * Binding-specific error handler\n\n    Configure a `Consumer` bean to consume the specific inbound binding error messages. The following function subscribes to the specific inbound binding error channel and has a higher priority than the binding-default error handler:\n\n    ```java\n    @Bean\n    public Consumer<ErrorMessage> myErrorHandler() {\n        return message -> {\n            // consume the error message\n        };\n    }\n    ```\n\n    You also need to set the `spring.cloud.stream.bindings.<input-binding-name>.error-handler-definition` property to the function name.\n\n##### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n* Handle outbound binding error messages\n\n  By default, Spring Integration creates a global error channel called `errorChannel`. Configure the following message endpoint to handle outbound binding error messages:\n\n  ```java\n  @ServiceActivator(inputChannel = IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)\n  public void handleError(ErrorMessage message) {\n      LOGGER.error(\"Handling outbound binding error: \" + message);\n  }\n  ```\n\n* Handle inbound binding error messages\n\n  Spring Cloud Stream Event Hubs Binder supports two solutions to handle errors for the inbound message bindings: custom error channels and handlers.\n\n  **Error channel**:\n\n  Spring Cloud Stream provides an error channel for each inbound binding. An `ErrorMessage` is sent to the error channel. For more information, see [Handling Errors](https://docs.spring.io/spring-cloud-stream/docs/3.2.6/reference/html/spring-cloud-stream.html#polled-errors) in the Spring Cloud Stream documentation.\n\n    * Default error channel\n\n      You can use a global error channel named `errorChannel` to consume all inbound binding error messages. To handle these messages, configure the following message endpoint:\n\n      ```java\n      @ServiceActivator(inputChannel = IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)\n      public void handleError(ErrorMessage message) {\n          LOGGER.error(\"Handling inbound binding error: \" + message);\n      }\n      ```\n\n    * Binding-specific error channel\n\n      You can use a specific error channel to consume the specific inbound binding error messages with a higher priority than the default error channel. To handle these messages, configure the following message endpoint:\n\n      ```java\n      // Replace destination with spring.cloud.stream.bindings.<input-binding-name>.destination\n      // Replace group with spring.cloud.stream.bindings.<input-binding-name>.group\n      @ServiceActivator(inputChannel = \"{destination}.{group}.errors\")\n      public void handleError(ErrorMessage message) {\n          LOGGER.error(\"Handling inbound binding error: \" + message);\n      }\n      ```\n\n      > [!NOTE]\n      > The binding-specific error channel is mutually exclusive with other provided error handlers and channels.\n\n  **Error Handler**:\n\n  Spring Cloud Stream exposes a mechanism for you to provide a custom error handler by adding a `Consumer` that accepts `ErrorMessage` instances. For more information, see [Error Handling](https://docs.spring.io/spring-cloud-stream/docs/3.2.6/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-error-handling) in the Spring Cloud Stream documentation.\n\n  > [!NOTE]\n  > When any binding error handler is configured, it can work with the default error channel.\n\n    * Binding-default error handler\n\n      Configure a single `Consumer` bean to consume all inbound binding error messages. The following default function subscribes to each inbound binding error channel:\n\n      ```java\n      @Bean\n      public Consumer<ErrorMessage> myDefaultHandler() {\n          return message -> {\n              // consume the error message\n          };\n      }\n      ```\n\n      You also need to set the `spring.cloud.stream.default.error-handler-definition` property to the function name.\n\n    * Binding-specific error handler\n\n      Configure a `Consumer` bean to consume the specific inbound binding error messages. The following function subscribes to the specific inbound binding error channel and has a higher priority than the binding-default error handler:\n\n      ```java\n      @Bean\n      public Consumer<ErrorMessage> myErrorHandler() {\n          return message -> {\n              // consume the error message\n          };\n      }\n      ```\n\n      You also need to set the `spring.cloud.stream.bindings.<input-binding-name>.error-handler-definition` property to the function name.\n\n---\n\n#### Event Hubs message headers\n\nFor the basic message headers supported, see the [Event Hubs message headers](spring-integration-support.md#event-hubs-message-headers) section of [Spring Cloud Azure support for Spring Integration](./spring-integration-support.md).\n\n#### Multiple binder support\n\nConnection to multiple Event Hubs namespaces is also supported by using multiple binders. This sample takes a connection string as example. Credentials of service principals and managed identities are also supported. You can set related properties in each binder's environment settings.\n\n1. To use multiple binders with Event Hubs, configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       function:\n         definition: consume1;supply1;consume2;supply2\n       stream:\n         bindings:\n           consume1-in-0:\n             destination: ${EVENTHUB_NAME_01}\n             group: ${CONSUMER_GROUP_01}\n           supply1-out-0:\n             destination: ${THE_SAME_EVENTHUB_NAME_01_AS_ABOVE}\n           consume2-in-0:\n             binder: eventhub-2\n             destination: ${EVENTHUB_NAME_02}\n             group: ${CONSUMER_GROUP_02}\n           supply2-out-0:\n             binder: eventhub-2\n             destination: ${THE_SAME_EVENTHUB_NAME_02_AS_ABOVE}\n         binders:\n           eventhub-1:\n             type: eventhubs\n             default-candidate: true\n             environment:\n               spring:\n                 cloud:\n                   azure:\n                     eventhubs:\n                       connection-string: ${EVENTHUB_NAMESPACE_01_CONNECTION_STRING}\n                       processor:\n                         checkpoint-store:\n                           container-name: ${CHECKPOINT_CONTAINER_01}\n                           account-name: ${CHECKPOINT_STORAGE_ACCOUNT}\n                           account-key: ${CHECKPOINT_ACCESS_KEY}\n           eventhub-2:\n             type: eventhubs\n             default-candidate: false\n             environment:\n               spring:\n                 cloud:\n                   azure:\n                     eventhubs:\n                       connection-string: ${EVENTHUB_NAMESPACE_02_CONNECTION_STRING}\n                       processor:\n                         checkpoint-store:\n                           container-name: ${CHECKPOINT_CONTAINER_02}\n                           account-name: ${CHECKPOINT_STORAGE_ACCOUNT}\n                           account-key: ${CHECKPOINT_ACCESS_KEY}\n         eventhubs:\n           bindings:\n             consume1-in-0:\n               consumer:\n                 checkpoint:\n                   mode: MANUAL\n             consume2-in-0:\n               consumer:\n                 checkpoint:\n                   mode: MANUAL\n         poller:\n           initial-delay: 0\n           fixed-delay: 1000\n   ```\n\n   > [!NOTE]\n   > The previous application file shows how to configure a single default poller for application to all bindings. If you want to configure the poller for a specific binding, you can use a configuration such as `spring.cloud.stream.bindings.<binding-name>.producer.poller.fixed-delay=3000`.\n\n   [!INCLUDE [security-note](../includes/security-note.md)]\n\n1. We need define two suppliers and two consumers:\n\n   ```java\n   @Bean\n   public Supplier<Message<String>> supply1() {\n       return () -> {\n           LOGGER.info(\"Sending message1, sequence1 \" + i);\n           return MessageBuilder.withPayload(\"Hello world1, \" + i++).build();\n       };\n   }\n\n   @Bean\n   public Supplier<Message<String>> supply2() {\n       return () -> {\n           LOGGER.info(\"Sending message2, sequence2 \" + j);\n           return MessageBuilder.withPayload(\"Hello world2, \" + j++).build();\n       };\n   }\n\n   @Bean\n   public Consumer<Message<String>> consume1() {\n       return message -> {\n           Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n           LOGGER.info(\"New message1 received: '{}'\", message);\n           checkpointer.success()\n                   .doOnSuccess(success -> LOGGER.info(\"Message1 '{}' successfully checkpointed\", message))\n                   .doOnError(error -> LOGGER.error(\"Exception found\", error))\n                   .block();\n       };\n   }\n\n   @Bean\n   public Consumer<Message<String>> consume2() {\n       return message -> {\n           Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n           LOGGER.info(\"New message2 received: '{}'\", message);\n           checkpointer.success()\n                   .doOnSuccess(success -> LOGGER.info(\"Message2 '{}' successfully checkpointed\", message))\n                   .doOnError(error -> LOGGER.error(\"Exception found\", error))\n                   .block();\n       };\n   }\n   ```\n\n#### Resource provisioning\n\nEvent Hubs binder supports provisioning of event hub and consumer group, users could use the following properties to enable provisioning.\n\n```yaml\nspring:\n  cloud:\n    azure:\n      credential:\n        tenant-id: <tenant>\n      profile:\n        subscription-id: ${AZURE_SUBSCRIPTION_ID}\n      eventhubs:\n        resource:\n          resource-group: ${AZURE_EVENTHUBS_RESOURCE_GROUP}\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n### Samples\n\nFor more information, see the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/eventhubs/spring-cloud-azure-stream-binder-eventhubs) repository on GitHub.\n\n## Spring Cloud Stream Binder for Azure Service Bus\n\n### Key concepts\n\nThe Spring Cloud Stream Binder for Azure Service Bus provides the binding implementation for the Spring Cloud Stream Framework.\nThis implementation uses Spring Integration Service Bus Channel Adapters at its foundation.\n\n#### Scheduled message\n\nThis binder supports submitting messages to a topic for delayed processing. Users can send scheduled messages with header `x-delay`\nexpressing in milliseconds a delay time for the message. The message will be delivered to the respective topics after `x-delay` milliseconds.\n\n#### Consumer group\n\nService Bus Topic provides similar support of consumer group as Apache Kafka, but with slight different logic.\nThis binder relies on `Subscription` of a topic to act as a consumer group.\n\n### Dependency setup\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-stream-binder-servicebus</artifactId>\n</dependency>\n```\n\nAlternatively, you can also use the Spring Cloud Azure Stream Service Bus Starter, as shown in the following example for Maven:\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-stream-servicebus</artifactId>\n</dependency>\n```\n\n### Configuration\n\nThe binder provides the following two parts of configuration options:\n\n#### Connection configuration properties\n\nThis section contains the configuration options used for connecting to Azure Service Bus.\n\n> [!NOTE]\n> If you choose to use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id) to make sure the security principal has been granted the sufficient permission to access the Azure resource.\n\nConnection configurable properties of `spring-cloud-azure-stream-binder-servicebus`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                            | Type    | Description                                                                                                                 |\n> |-----------------------------------------------------|---------|-----------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.servicebus.enabled`           | boolean | Whether an Azure Service Bus is enabled.                                                                                    |\n> | `spring.cloud.azure.servicebus.connection-string` | String  | Service Bus Namespace connection string value.                                                                              |\n> | `spring.cloud.azure.servicebus.custom-endpoint-address` | String  | The custom endpoint address to use when connecting to Service Bus.                                                                              |\n> | `spring.cloud.azure.servicebus.namespace`         | String  | Service Bus Namespace value, which is the prefix of the FQDN. A FQDN should be composed of NamespaceName.DomainName |\n> | `spring.cloud.azure.servicebus.domain-name`       | String  | Domain name of an Azure Service Bus Namespace value.                                                                        |\n\n> [!NOTE]\n> Common Azure Service SDK configuration options are configurable for the Spring Cloud Azure Stream Service Bus binder as well. The supported configuration options are introduced in [Spring Cloud Azure configuration](configuration.md), and could be configured with either the unified prefix `spring.cloud.azure.` or the prefix of `spring.cloud.azure.servicebus.`.\n\nThe binder also supports [Spring Could Azure Resource Manager](resource-manager.md) by default. To learn about how to retrieve the connection string with security principals that aren't granted with `Data` related roles, see the [Basic usage](resource-manager.md#basic-usage) section of [Spring Could Azure Resource Manager](resource-manager.md).\n\n#### Azure Service Bus binding configuration properties\n\nThe following options are divided into four sections: Consumer Properties, Advanced Consumer\nConfigurations, Producer Properties and Advanced Producer Configurations.\n\n##### Consumer properties\n\nThese properties are exposed via `ServiceBusConsumerProperties`.\n\n> [!NOTE]\n> To avoid repetition, since version 4.17.0 and 5.11.0, Spring Cloud Azure Stream Binder Service Bus supports setting values for all channels, in the format of `spring.cloud.stream.servicebus.default.consumer.<property>=<value>`.\n\nConsumer configurable properties of `spring-cloud-azure-stream-binder-servicebus`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                       | Type                  | Default                                                                                           | Description                                                                                                                                                   |\n> |------------------------------------------------------------------------------------------------|-----------------------|---------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.requeue-rejected`             | boolean               | false                                                                                             | If the failed messages are routed to the DLQ.                                                                                                                 |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.max-concurrent-calls`         | Integer               | 1                                                                                                 | Max concurrent messages that the Service Bus processor client should process. When session enabled, it applies to each session.                               |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.max-concurrent-sessions`      | Integer               | null                                                                                              | Maximum number of concurrent sessions to process at any given time.                                                                                           |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.session-enabled`              | Boolean               | null                                                                                              | Whether session is enabled.                                                                                                                                   |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.session-idle-timeout`         | Duration              | null                                                                                              | Sets the maximum amount of time (Duration) to wait for a message to be received for the currently active session.                                             |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.prefetch-count`               | Integer               | 0                                                                                                 | The prefetch count of the Service Bus processor client.                                                                                                       |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.sub-queue`                    | SubQueue              | none                                                                                              | The type of the sub queue to connect to.                                                                                                                      |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.max-auto-lock-renew-duration` | Duration              | 5m                                                                                                | The amount of time to continue auto-renewing the lock.                                                                                                        |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.receive-mode`                 | ServiceBusReceiveMode | peek_lock                                                                                         | The receive mode of the Service Bus processor client.                                                                                                         |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.auto-complete`                | Boolean               | true                                                                                              | Whether to settle messages automatically. If set as false, a message header of `Checkpointer` will be added to enable developers to settle messages manually. |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.max-size-in-megabytes`        | Long                  | 1024                                                                                              | The maximum size of the queue/topic in megabytes, which is the size of memory allocated for the queue/topic.                                                  |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.consumer.default-message-time-to-live` | Duration              | P10675199DT2H48M5.4775807S. (10675199 days, 2 hours, 48 minutes, 5 seconds, and 477 milliseconds) | The duration after which the message expires, starting from when the message is sent to Service Bus.                                                          |\n\n> [!IMPORTANT]\n> When you use the [Azure Resource Manager](resource-manager.md) (ARM), you must configure the `spring.cloud.stream.servicebus.bindings.<binding-name>.consume.entity-type` property. For more information, see the [`servicebus-queue-binder-arm`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus/spring-cloud-azure-stream-binder-servicebus/servicebus-queue-binder-arm) sample on GitHub.\n\n##### Advanced consumer configuration\n\nThe above [connection](#connection-configuration-properties-1) and [common Azure SDK client](configuration.md) configuration support customization for each binder consumer, which you can configure with the prefix `spring.cloud.stream.servicebus.bindings.<binding-name>.consumer.`.\n\n##### Producer properties\n\nThese properties are exposed via `ServiceBusProducerProperties`.\n\n> [!NOTE]\n> To avoid repetition, since version 4.17.0 and 5.11.0, Spring Cloud Azure Stream Binder Service Bus supports setting values for all channels, in the format of `spring.cloud.stream.servicebus.default.producer.<property>=<value>`.\n\nProducer configurable properties of `spring-cloud-azure-stream-binder-servicebus`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                       | Type                 | Default                                                                                           | Description                                                                                                  |\n> |------------------------------------------------------------------------------------------------|----------------------|---------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.stream.servicebus.bindings.binding-name.producer.sync`                         | boolean              | false                                                                                             | Switch flag for sync of producer.                                                                            |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.producer.send-timeout`                 | long                 | 10000                                                                                             | Timeout value for sending of producer.                                                                       |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.producer.entity-type`                  | ServiceBusEntityType | null                                                                                              | Service Bus entity type of the producer, required for the binding producer.                                  |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.producer.max-size-in-megabytes`        | Long                 | 1024                                                                                              | The maximum size of the queue/topic in megabytes, which is the size of memory allocated for the queue/topic. |\n> | `spring.cloud.stream.servicebus.bindings.binding-name.producer.default-message-time-to-live` | Duration             | P10675199DT2H48M5.4775807S. (10675199 days, 2 hours, 48 minutes, 5 seconds, and 477 milliseconds) | The duration after which the message expires, starting from when the message is sent to Service Bus.         |\n\n> [!IMPORTANT]\n> When using the binding producer, property of `spring.cloud.stream.servicebus.bindings.<binding-name>.producer.entity-type` is required to be configured.\n\n##### Advanced producer configuration\n\nThe above [connection](#connection-configuration-properties-1) and [common Azure SDK client](configuration.md) configuration support customization for each binder producer, which you can configure with the prefix `spring.cloud.stream.servicebus.bindings.<binding-name>.producer.`.\n\n### Basic usage\n\n#### Sending and receiving messages from/to Service Bus\n\n1. Fill the configuration options with credential information.\n\n   * For credentials as connection string, configure the following properties in your **application.yml** file:\n\n      ```yaml\n      spring:\n        cloud:\n          azure:\n            servicebus:\n              connection-string: ${SERVICEBUS_NAMESPACE_CONNECTION_STRING}\n          function:\n            definition: consume;supply\n          stream:\n            bindings:\n              consume-in-0:\n                destination: ${SERVICEBUS_ENTITY_NAME}\n                # If you use Service Bus Topic, add the following configuration\n                # group: ${SUBSCRIPTION_NAME}\n              supply-out-0:\n                destination: ${SERVICEBUS_ENTITY_NAME_SAME_AS_ABOVE}\n            servicebus:\n              bindings:\n                consume-in-0:\n                  consumer:\n                    auto-complete: false\n                supply-out-0:\n                  producer:\n                    entity-type: queue # set as \"topic\" if you use Service Bus Topic\n     ```\n\n     [!INCLUDE [security-note](../includes/security-note.md)]\n\n   * For credentials as service principal, configure the following properties in your **application.yml** file:\n\n      ```yaml\n      spring:\n        cloud:\n          azure:\n            credential:\n              client-id: ${AZURE_CLIENT_ID}\n              client-secret: ${AZURE_CLIENT_SECRET}\n            profile:\n              tenant-id: <tenant>\n            servicebus:\n              namespace: ${SERVICEBUS_NAMESPACE}\n          function:\n            definition: consume;supply\n          stream:\n            bindings:\n              consume-in-0:\n                destination: ${SERVICEBUS_ENTITY_NAME}\n                # If you use Service Bus Topic, add the following configuration\n                # group: ${SUBSCRIPTION_NAME}\n              supply-out-0:\n                destination: ${SERVICEBUS_ENTITY_NAME_SAME_AS_ABOVE}\n            servicebus:\n              bindings:\n                consume-in-0:\n                  consumer:\n                    auto-complete: false\n                supply-out-0:\n                  producer:\n                    entity-type: queue # set as \"topic\" if you use Service Bus Topic\n     ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n   * For credentials as managed identities, configure the following properties in your **application.yml** file:\n\n      ```yaml\n      spring:\n        cloud:\n          azure:\n            credential:\n              managed-identity-enabled: true\n              client-id: ${MANAGED_IDENTITY_CLIENT_ID} # Only needed when using a user-assigned managed identity\n            servicebus:\n              namespace: ${SERVICEBUS_NAMESPACE}\n          function:\n            definition: consume;supply\n          stream:\n            bindings:\n              consume-in-0:\n                destination: ${SERVICEBUS_ENTITY_NAME}\n                # If you use Service Bus Topic, add the following configuration\n                # group: ${SUBSCRIPTION_NAME}\n              supply-out-0:\n                destination: ${SERVICEBUS_ENTITY_NAME_SAME_AS_ABOVE}\n            servicebus:\n              bindings:\n                consume-in-0:\n                  consumer:\n                    auto-complete: false\n                supply-out-0:\n                  producer:\n                    entity-type: queue # set as \"topic\" if you use Service Bus Topic\n     ```\n\n1. Define supplier and consumer.\n\n   ```java\n   @Bean\n   public Consumer<Message<String>> consume() {\n       return message -> {\n           Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n           LOGGER.info(\"New message received: '{}'\", message.getPayload());\n\n           checkpointer.success()\n                   .doOnSuccess(success -> LOGGER.info(\"Message '{}' successfully checkpointed\", message.getPayload()))\n                   .doOnError(error -> LOGGER.error(\"Exception found\", error))\n                   .block();\n       };\n   }\n\n   @Bean\n   public Supplier<Message<String>> supply() {\n       return () -> {\n           LOGGER.info(\"Sending message, sequence \" + i);\n           return MessageBuilder.withPayload(\"Hello world, \" + i++).build();\n       };\n   }\n   ```\n\n#### Partition key support\n\nThe binder supports [Service Bus partitioning](/azure/service-bus-messaging/service-bus-partitioning) by allowing setting partition key and session ID in the message header. This section introduces how to set partition key for messages.\n\nSpring Cloud Stream provides a partition key SpEL expression property `spring.cloud.stream.bindings.<binding-name>.producer.partition-key-expression`. For example, setting this property as `\"'partitionKey-' + headers[<message-header-key>]\"` and add a header called message-header-key. Spring Cloud Stream uses the value for this header when evaluating the expression to assign a partition key. The following code provides an example producer:\n\n```java\n@Bean\npublic Supplier<Message<String>> generate() {\n    return () -> {\n        String value = \"random payload\";\n        return MessageBuilder.withPayload(value)\n            .setHeader(\"<message-header-key>\", value.length() % 4)\n            .build();\n    };\n}\n```\n\n#### Session support\n\nThe binder supports [message sessions](/azure/service-bus-messaging/message-sessions) of Service Bus. Session ID of a message could be set via the message header.\n\n```java\n@Bean\npublic Supplier<Message<String>> generate() {\n    return () -> {\n        String value = \"random payload\";\n        return MessageBuilder.withPayload(value)\n            .setHeader(ServiceBusMessageHeaders.SESSION_ID, \"Customize session ID\")\n            .build();\n    };\n}\n```\n\n> [!NOTE]\n> According to [Service Bus partitioning](/azure/service-bus-messaging/service-bus-partitioning), session ID has higher priority than partition key. So when both of `ServiceBusMessageHeaders#SESSION_ID` and `ServiceBusMessageHeaders#PARTITION_KEY` headers are set, the value of the session ID is eventually used to overwrite the value of the partition key.\n\n#### Handle error messages\n\n##### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\n* Handle outbound binding error messages\n\n  By default, Spring Integration creates a global error channel called `errorChannel`. Configure the following message endpoint to handle outbound binding error message.\n\n  ```java\n  @ServiceActivator(inputChannel = IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)\n  public void handleError(ErrorMessage message) {\n      LOGGER.error(\"Handling outbound binding error: \" + message);\n  }\n  ```\n\n* Handle inbound binding error messages\n\n  Spring Cloud Stream Service Bus Binder supports two solutions to handle errors for the inbound message bindings: the binder error handler and handlers.\n\n  **Binder error handler**:\n\n  The default binder error handler handles the inbound binding. You use this handler to send failed messages to the dead-letter queue when `spring.cloud.stream.servicebus.bindings.<binding-name>.consumer.requeue-rejected` is enabled. Otherwise, the failed messages are abandoned. The binder error handler is mutually exclusive with other provided error handlers.\n\n  **Error handler**:\n\n  Spring Cloud Stream exposes a mechanism for you to provide a custom error handler by adding a `Consumer` that accepts `ErrorMessage` instances. For more information, see [Handle Error Messages](https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#_handle_error_messages) in the Spring Cloud Stream documentation.\n\n    * Binding-default error handler\n\n      Configure a single `Consumer` bean to consume all inbound binding error messages. The following default function subscribes to each inbound binding error channel:\n\n      ```java\n      @Bean\n      public Consumer<ErrorMessage> myDefaultHandler() {\n          return message -> {\n              // consume the error message\n          };\n      }\n      ```\n\n      You also need to set the `spring.cloud.stream.default.error-handler-definition` property to the function name.\n\n    * Binding-specific error handler\n\n      Configure a `Consumer` bean to consume the specific inbound binding error messages. The following function subscribes to the specific inbound binding error channel with a higher priority than the binding-default error handler.\n\n      ```java\n      @Bean\n      public Consumer<ErrorMessage> myDefaultHandler() {\n          return message -> {\n              // consume the error message\n          };\n      }\n      ```\n\n      You also need to set the `spring.cloud.stream.bindings.<input-binding-name>.error-handler-definition` property to the function name.\n\n##### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n* Handle outbound binding error messages\n\n  By default, Spring Integration creates a global error channel called `errorChannel`. Configure the following message endpoint to handle outbound binding error message.\n\n  ```java\n  @ServiceActivator(inputChannel = IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)\n  public void handleError(ErrorMessage message) {\n      LOGGER.error(\"Handling outbound binding error: \" + message);\n  }\n  ```\n\n* Handle inbound binding error messages\n\n  Spring Cloud Stream Service Bus Binder supports two solutions to handle errors for the inbound message bindings: the binder error handler and handlers.\n\n  **Binder error handler**:\n\n  The default binder error handler handles the inbound binding. You use this handler to send failed messages to the dead-letter queue when `spring.cloud.stream.servicebus.bindings.<binding-name>.consumer.requeue-rejected` is enabled. Otherwise, the failed messages are abandoned. The binder error handler is mutually exclusive with other provided error handlers.\n\n  **Error handler**:\n\n  Spring Cloud Stream exposes a mechanism for you to provide a custom error handler by adding a `Consumer` that accepts `ErrorMessage` instances. For more information, see [Handle Error Messages](https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#_handle_error_messages) in the Spring Cloud Stream documentation.\n\n  * Binding-default error handler\n\n    Configure a single `Consumer` bean to consume all inbound binding error messages. The following default function subscribes to each inbound binding error channel:\n\n    ```java\n    @Bean\n    public Consumer<ErrorMessage> myDefaultHandler() {\n        return message -> {\n            // consume the error message\n        };\n    }\n    ```\n\n    You also need to set the `spring.cloud.stream.default.error-handler-definition` property to the function name.\n\n  * Binding-specific error handler\n\n    Configure a `Consumer` bean to consume the specific inbound binding error messages. The following function subscribes to the specific inbound binding error channel with a higher priority than the binding-default error handler.\n\n    ```java\n    @Bean\n    public Consumer<ErrorMessage> myDefaultHandler() {\n        return message -> {\n            // consume the error message\n        };\n    }\n    ```\n\n    You also need to set the `spring.cloud.stream.bindings.<input-binding-name>.error-handler-definition` property to the function name.\n\n##### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n* Handle outbound binding error messages\n\n  By default, Spring Integration creates a global error channel called `errorChannel`. Configure the following message endpoint to handle outbound binding error message.\n\n  ```java\n  @ServiceActivator(inputChannel = IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)\n  public void handleError(ErrorMessage message) {\n      LOGGER.error(\"Handling outbound binding error: \" + message);\n  }\n  ```\n\n* Handle inbound binding error messages\n\n  Spring Cloud Stream Service Bus Binder supports three solutions to handle errors for the inbound message bindings: the binder error handler, custom error channels, and handlers.\n\n  **Binder error handler**:\n\n  The default binder error handler handles the inbound binding. You use this handler to send failed messages to the dead-letter queue when `spring.cloud.stream.servicebus.bindings.<binding-name>.consumer.requeue-rejected` is enabled. Otherwise, the failed messages are abandoned. Except for configuring the binding-specific error channel, the binder error handler always takes effect regardless of whether there are other custom error handlers or channels.\n\n  **Error channel**:\n\n  Spring Cloud Stream provides an error channel for each inbound binding. An `ErrorMessage` is sent to the error channel. For more information, see [Handling Errors](https://docs.spring.io/spring-cloud-stream/docs/3.2.6/reference/html/spring-cloud-stream.html#polled-errors) in the Spring Cloud Stream documentation.\n\n    * Default error channel\n\n      You can use a global error channel named `errorChannel` to consume all inbound binding error messages. To handle these messages, configure the following message endpoint:\n\n      ```java\n      @ServiceActivator(inputChannel = IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME)\n      public void handleError(ErrorMessage message) {\n          LOGGER.error(\"Handling inbound binding error: \" + message);\n      }\n      ```\n\n    * Binding-specific error channel\n\n      You can use a specific error channel to consume the specific inbound binding error messages with a higher priority than the default error channel. To handle these messages, configure the following message endpoint:\n\n      ```java\n      // Replace destination with spring.cloud.stream.bindings.<input-binding-name>.destination\n      // Replace group with spring.cloud.stream.bindings.<input-binding-name>.group\n      @ServiceActivator(inputChannel = \"{destination}.{group}.errors\")\n      public void handleError(ErrorMessage message) {\n          LOGGER.error(\"Handling inbound binding error: \" + message);\n      }\n      ```\n\n      > [!NOTE]\n      > The binding-specific error channel is mutually exclusive with other provided error handlers and channels.\n\n  **Error handler**:\n\n  Spring Cloud Stream exposes a mechanism for you to provide a custom error handler by adding a `Consumer` that accepts `ErrorMessage` instances. For more information, see [Error Handling](https://docs.spring.io/spring-cloud-stream/docs/3.2.6/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-error-handling) in the Spring Cloud Stream documentation.\n\n  > [!NOTE]\n  > When any binding error handler is configured, it can work with the default error channel and the binder error handler.\n\n    * Binding-default error handler\n\n      Configure a single `Consumer` bean to consume all inbound binding error messages. The following default function subscribes to each inbound binding error channel:\n\n      ```java\n      @Bean\n      public Consumer<ErrorMessage> myDefaultHandler() {\n          return message -> {\n              // consume the error message\n          };\n      }\n      ```\n\n      You also need to set the `spring.cloud.stream.default.error-handler-definition` property to the function name.\n\n    * Binding-specific error handler\n\n      Configure a `Consumer` bean to consume the specific inbound binding error messages. The following function subscribes to the specific inbound binding error channel with a higher priority than the binding-default error handler.\n\n      ```java\n      @Bean\n      public Consumer<ErrorMessage> myDefaultHandler() {\n          return message -> {\n              // consume the error message\n          };\n      }\n      ```\n\n      You also need to set the `spring.cloud.stream.bindings.<input-binding-name>.error-handler-definition` property to the function name.\n\n---\n\n#### Service Bus message headers\n\nFor the basic message headers supported, see the [Service Bus message headers](spring-integration-support.md#service-bus-message-headers) section of [Spring Cloud Azure support for Spring Integration](spring-integration-support.md).\n\n> [!NOTE]\n> When setting the partition key, the priority of message header is higher than Spring Cloud Stream property. So `spring.cloud.stream.bindings.<binding-name>.producer.partition-key-expression` takes effect only when none of the `ServiceBusMessageHeaders#SESSION_ID` and `ServiceBusMessageHeaders#PARTITION_KEY` headers are configured.\n\n#### Multiple binder support\n\nConnection to multiple Service Bus namespaces is also supported by using multiple binders. This sample takes connection string as example. Credentials of service principals and managed identities are also supported, users can set related properties in each binder's environment settings.\n\n1. To use multiple binders of ServiceBus, configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       function:\n         definition: consume1;supply1;consume2;supply2\n       stream:\n         bindings:\n           consume1-in-0:\n             destination: ${SERVICEBUS_TOPIC_NAME}\n             group: ${SUBSCRIPTION_NAME}\n           supply1-out-0:\n             destination: ${SERVICEBUS_TOPIC_NAME_SAME_AS_ABOVE}\n           consume2-in-0:\n             binder: servicebus-2\n             destination: ${SERVICEBUS_QUEUE_NAME}\n           supply2-out-0:\n             binder: servicebus-2\n             destination: ${SERVICEBUS_QUEUE_NAME_SAME_AS_ABOVE}\n         binders:\n           servicebus-1:\n             type: servicebus\n             default-candidate: true\n             environment:\n               spring:\n                 cloud:\n                   azure:\n                     servicebus:\n                       connection-string: ${SERVICEBUS_NAMESPACE_01_CONNECTION_STRING}\n           servicebus-2:\n             type: servicebus\n             default-candidate: false\n             environment:\n               spring:\n                 cloud:\n                   azure:\n                     servicebus:\n                       connection-string: ${SERVICEBUS_NAMESPACE_02_CONNECTION_STRING}\n         servicebus:\n           bindings:\n             consume1-in-0:\n               consumer:\n                 auto-complete: false\n             supply1-out-0:\n               producer:\n                 entity-type: topic\n             consume2-in-0:\n               consumer:\n                 auto-complete: false\n             supply2-out-0:\n               producer:\n                 entity-type: queue\n         poller:\n           initial-delay: 0\n           fixed-delay: 1000\n   ```\n\n   > [!NOTE]\n   > The previous application file shows how to configure a single default poller for application to all bindings. If you want to configure the poller for a specific binding, you can use a configuration such as `spring.cloud.stream.bindings.<binding-name>.producer.poller.fixed-delay=3000`.\n\n   [!INCLUDE [security-note](../includes/security-note.md)]\n\n1. we need define two suppliers and two consumers\n\n   ```java\n   @Bean\n   public Supplier<Message<String>> supply1() {\n       return () -> {\n           LOGGER.info(\"Sending message1, sequence1 \" + i);\n           return MessageBuilder.withPayload(\"Hello world1, \" + i++).build();\n       };\n   }\n\n   @Bean\n   public Supplier<Message<String>> supply2() {\n       return () -> {\n           LOGGER.info(\"Sending message2, sequence2 \" + j);\n           return MessageBuilder.withPayload(\"Hello world2, \" + j++).build();\n       };\n   }\n\n   @Bean\n   public Consumer<Message<String>> consume1() {\n       return message -> {\n           Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n           LOGGER.info(\"New message1 received: '{}'\", message);\n           checkpointer.success()\n                   .doOnSuccess(s -> LOGGER.info(\"Message '{}' successfully checkpointed\", message.getPayload()))\n                   .doOnError(e -> LOGGER.error(\"Error found\", e))\n                   .block();\n       };\n   }\n\n   @Bean\n   public Consumer<Message<String>> consume2() {\n       return message -> {\n           Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n           LOGGER.info(\"New message2 received: '{}'\", message);\n           checkpointer.success()\n                   .doOnSuccess(s -> LOGGER.info(\"Message '{}' successfully checkpointed\", message.getPayload()))\n                   .doOnError(e -> LOGGER.error(\"Error found\", e))\n                   .block();\n       };\n\n   }\n   ```\n\n#### Resource provisioning\n\nService bus binder supports provisioning of queue, topic and subscription, users could use the following properties to enable provisioning.\n\n```yaml\nspring:\n  cloud:\n    azure:\n      credential:\n        tenant-id: <tenant>\n      profile:\n        subscription-id: ${AZURE_SUBSCRIPTION_ID}\n      servicebus:\n        resource:\n          resource-group: ${AZURE_SERVICEBUS_RESOURCE_GROUP}\n    stream:\n      servicebus:\n        bindings:\n          <binding-name>:\n            consumer:\n              entity-type: ${SERVICEBUS_CONSUMER_ENTITY_TYPE}\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n#### Customize Service Bus client properties\n\nDevelopers can use `AzureServiceClientBuilderCustomizer` to customize Service Bus Client properties. The following example customizes the `sessionIdleTimeout` property in `ServiceBusClientBuilder`:\n\n```java\n@Bean\npublic AzureServiceClientBuilderCustomizer<ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder> customizeBuilder() {\n    return builder -> builder.sessionIdleTimeout(Duration.ofSeconds(10));\n}\n```\n\n### Samples\n\nFor more information, see the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus/spring-cloud-azure-stream-binder-servicebus) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/spring-data-support.md",
    "content": "---\ntitle: Spring Data support\ndescription: This article describes how Spring Cloud Azure and Spring Data can be used together.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Data support\n\nThis article describes how Spring Cloud Azure and Spring Data can be used together.\n\n## Spring Data Azure Cosmos DB support\n\n[Azure Cosmos DB](https://azure.microsoft.com/services/cosmos-db/) is a globally distributed database service that allows developers to work with data using various standard APIs, such as SQL, MongoDB, Graph, and Azure Table storage.\n\n### Dependency setup\n\n```xml\n<dependency>\n   <groupId>com.azure.spring</groupId>\n   <artifactId>spring-cloud-azure-starter-data-cosmos</artifactId>\n</dependency>\n```\n\n### Configuration\n\n> [!NOTE]\n> If you use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, be sure the security principal has been granted sufficient permission to access the Azure resource. For more information, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id).\n\nThe following table lists the configurable properties of `spring-cloud-azure-starter-data-cosmos`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                           | Description                                                                                                     |\n> |--------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.cosmos.enabled`                                | A value that indicates whether Azure Cosmos DB Service is enabled. The default value is `true`.                    |\n> | `spring.cloud.azure.cosmos.database`                               | The Azure Cosmos DB database ID.                                                                                      |\n> | `spring.cloud.azure.cosmos.endpoint`                               | The URI to connect Azure Cosmos DB.                                                                                   |\n> | `spring.cloud.azure.cosmos.key`                                    | The PrivateKey to connect Azure Cosmos DB.                                                                            |\n> | `spring.cloud.azure.cosmos.credential.client-certificate-password` | The password of the certificate file.                                                                           |\n> | `spring.cloud.azure.cosmos.credential.client-certificate-path`     | The path of a PEM certificate file to use when performing service principal authentication with Azure.          |\n> | `spring.cloud.azure.cosmos.credential.client-id`                   | The client ID to use when performing service principal authentication with Azure.                               |\n> | `spring.cloud.azure.cosmos.credential.client-secret`               | The client secret to use when performing service principal authentication with Azure.                           |\n> | `spring.cloud.azure.cosmos.credential.managed-identity-enabled`    | Whether to enable managed identity. The default value is `false`.                                                                             |\n> | `spring.cloud.azure.cosmos.credential.password`                    | The password to use when performing username/password authentication with Azure.                                |\n> | `spring.cloud.azure.cosmos.credential.username`                    | The username to use when performing username/password authentication with Azure.                                |\n> | `spring.cloud.azure.cosmos.populate-query-metrics`                 | A value that indicates whether to populate diagnostics strings and query metrics. The default value is `false`. |\n> | `spring.cloud.azure.cosmos.consistency-level`                      | A [consistency level](/azure/cosmos-db/consistency-levels) for Azure Cosmos DB.                                 |\n\n### Key concepts\n\nThe following list shows the key concepts of the Spring Data support:\n\n* The Spring Data `CrudRepository` and `ReactiveCrudRepository`, which provide the following basic CRUD functionality:\n\n    * save\n    * findAll\n    * findOne by ID\n    * deleteAll\n    * delete by ID\n    * delete entity\n\n* The Spring Data [@Id](https://github.com/spring-projects/spring-data-commons/blob/db62390de90c93a78743c97cc2cc9ccd964994a5/src/main/java/org/springframework/data/annotation/Id.java) annotation. There are two ways to map a field in a domain class to the `id` of an Azure Cosmos DB document:\n\n    * Annotate a field in domain class with `@Id`. This field will be mapped to document `id` in Azure Cosmos DB.\n    * Set the name of this field to `id`. This field will be mapped to document `id` in Azure Cosmos DB.\n\n  > [!NOTE]\n  > If both ways are applied, the `@Id` annotation has higher priority.\n\n* Custom collection names. By default, collection name will be class name of user domain class. To customize it, add annotation `@Document(collection=\"myCustomCollectionName\")` to your domain class, that's all.\n\n* Supports [Azure Cosmos DB partition](/azure/cosmos-db/partitioning-overview). To specify a field of your domain class to be a partition key field, annotate it with `@PartitionKey`. When you do CRUD operations, specify your partition value. For more examples, see [AddressRepositoryIT.java](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/spring/azure-spring-data-cosmos/src/test/java/com/azure/spring/data/cosmos/repository/integration/AddressRepositoryIT.java) on GitHub.\n\n* Supports [Spring Data custom query](https://docs.spring.io/spring-data/commons/docs/current/reference/html/#repositories.query-methods.details) find operation.\n\n* Supports [`spring-boot-starter-data-rest`](https://spring.io/projects/spring-data-rest).\n\n* Supports List and nested types in domain classes.\n\n### Basic usage\n\n#### Use a private key to access Azure Cosmos DB\n\nThe simplest way to connect Azure Cosmos DB with `spring-cloud-azure-starter-data-cosmos` is with a primary key. Add the following properties:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      cosmos:\n        key: ${AZURE_COSMOS_KEY}\n        endpoint: ${AZURE_COSMOS_ENDPOINT}\n        database: ${AZURE_COSMOS_DATABASE}\n```\n\n#### Define an entity\n\nDefine an entity as a Document in Azure Cosmos DB, as shown in the following example:\n\n```java\n@Container(containerName = \"mycollection\")\npublic class User {\n    @Id\n    private String id;\n    private String firstName;\n    @PartitionKey\n    private String lastName;\n    private String address;\n\n    public User() {\n    }\n\n    public User(String id, String firstName, String lastName, String address) {\n        this.id = id;\n        this.firstName = firstName;\n        this.lastName = lastName;\n        this.address = address;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getFirstName() {\n        return firstName;\n    }\n\n    public void setFirstName(String firstName) {\n        this.firstName = firstName;\n    }\n\n    public String getLastName() {\n        return lastName;\n    }\n\n    public void setLastName(String lastName) {\n        this.lastName = lastName;\n    }\n\n    public String getAddress() {\n        return address;\n    }\n\n    public void setAddress(String address) {\n        this.address = address;\n    }\n\n    @Override\n    public String toString() {\n        return String.format(\"%s %s, %s\", firstName, lastName, address);\n    }\n}\n```\n\nThe `id` field will be used as the document `id` in Azure Cosmos DB. Alternately, you can annotate any field with `@Id` to map it to the document `id`.\n\nThe annotation `@Container(containerName = \"mycollection\")` is used to specify the collection name of your document in Azure Cosmos DB.\n\n#### Create repositories\n\nTo create repositories, extend the `ReactiveCosmosRepository` interface, which provides Spring Data repository support.\n\n```java\n@Repository\npublic interface UserRepository extends ReactiveCosmosRepository<User, String> {\n    Flux<User> findByFirstName(String firstName);\n}\n```\n\nCurrently, the `ReactiveCosmosRepository` interface provides basic save, delete, and find operations. More operations will be supported later.\n\n#### Create an application class\n\nThe following example creates an application class with all the components:\n\n```java\n@SpringBootApplication\npublic class CosmosSampleApplication implements CommandLineRunner {\n\nprivate static final Logger LOGGER = LoggerFactory.getLogger(CosmosSampleApplication.class);\n\n    @Autowired\n    private UserRepository repository;\n\n    @Autowired\n    private CosmosProperties properties;\n\n    public static void main(String[] args) {\n        SpringApplication.run(CosmosSampleApplication.class, args);\n    }\n\n    public void run(String... var1) {\n        final User testUser = new User(\"testId\", \"testFirstName\",\n                \"testLastName\", \"test address line one\");\n\n        // Save the User class to Azure Cosmos DB database.\n        final Mono<User> saveUserMono = repository.save(testUser);\n\n        final Flux<User> firstNameUserFlux = repository.findByFirstName(\"testFirstName\");\n\n        //  Nothing happens until we subscribe to these Monos.\n        //  findById won't return the user as user isn't present.\n        final Mono<User> findByIdMono = repository.findById(testUser.getId());\n        final User findByIdUser = findByIdMono.block();\n        Assert.isNull(findByIdUser, \"User must be null\");\n\n        final User savedUser = saveUserMono.block();\n        Assert.state(savedUser != null, \"Saved user must not be null\");\n        Assert.state(savedUser.getFirstName().equals(testUser.getFirstName()),\n                \"Saved user first name doesn't match\");\n\n        firstNameUserFlux.collectList().block();\n\n        final Optional<User> optionalUserResult = repository.findById(testUser.getId()).blockOptional();\n        Assert.isTrue(optionalUserResult.isPresent(), \"Cannot find user.\");\n\n        final User result = optionalUserResult.get();\n        Assert.state(result.getFirstName().equals(testUser.getFirstName()),\n                \"query result firstName doesn't match!\");\n        Assert.state(result.getLastName().equals(testUser.getLastName()),\n                \"query result lastName doesn't match!\");\n        LOGGER.info(\"findOne in User collection get result: {}\", result.toString());\n\n    }\n\n    @PostConstruct\n    public void setup() {\n        // For this example, remove all of the existing records.\n        this.repository.deleteAll().block();\n    }\n}\n```\n\nThis example includes an autowired `UserRepository` interface to support save, delete, and find operations.\n\n### Samples\n\nSee the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/cosmos) on GitHub.\n\nApart from using the `spring-cloud-azure-starter-data-cosmos` library, you can directly use `azure-spring-data-cosmos` library for more complex scenarios. For more information, see [Spring Data for Azure Cosmos DB client library](https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/spring/azure-spring-data-cosmos).\n"
  },
  {
    "path": "articles/java/spring-framework/spring-integration-support.md",
    "content": "---\ntitle: Spring Cloud Azure support for Spring Integration\ndescription: This article describes how Spring Cloud Azure and Spring Integration can be used together.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure support for Spring Integration\n\nSpring Integration Extension for Azure provides Spring Integration adapters for the various services provided by the [Azure SDK for Java](https://github.com/Azure/azure-sdk-for-java/). We provide Spring Integration support for these Azure services: Event Hubs, Service Bus, Storage Queue. The following is a list of supported adapters:\n\n* `spring-cloud-azure-starter-integration-eventhubs` - for more information, see [Spring Integration with Azure Event Hubs](#spring-integration-with-azure-event-hubs)\n* `spring-cloud-azure-starter-integration-servicebus` - for more information, see [Spring Integration with Azure Service Bus](#spring-integration-with-azure-service-bus)\n* `spring-cloud-azure-starter-integration-storage-queue` - for more information, see [Spring Integration with Azure Storage Queue](#spring-integration-with-azure-storage-queue)\n\n## Spring Integration with Azure Event Hubs\n\n### Key concepts\n\nAzure Event Hubs is a big data streaming platform and event ingestion service. It can receive and process millions of events per second. Data sent to an event hub can be transformed and stored by using any real-time analytics provider or batching/storage adapters.\n\nSpring Integration enables lightweight messaging within Spring-based applications and supports integration with external systems via declarative adapters. Those adapters provide a higher-level of abstraction over Spring's support for remoting, messaging, and scheduling. The **Spring Integration for Event Hubs** extension project provides inbound and outbound channel adapters and gateways for Azure Event Hubs.\n\n> [!NOTE]\n> RxJava support APIs are dropped from version 4.0.0. See Javadoc for details.\n\n#### Consumer group\n\nEvent Hubs provides similar support of consumer group as Apache Kafka, but with slight different logic. While Kafka stores all committed offsets in the broker, you have to store offsets of Event Hubs messages being processed manually. Event Hubs SDK provides the function to store such offsets inside Azure Storage.\n\n#### Partitioning support\n\nEvent Hubs provides a similar concept of physical partition as Kafka. But unlike Kafka's auto re-balancing between consumers and partitions, Event Hubs provides a kind of preemptive mode. The storage account acts as a lease to determine which partition is owned by which consumer. When a new consumer starts, it will try to steal some partitions from most heavy-loaded consumers to achieve the workload balancing.\n\nTo specify the load balancing strategy, developers can use `EventHubsContainerProperties` for the configuration. See [the following section](#receive-messages-from-azure-event-hubs) for an example of how to configure `EventHubsContainerProperties`.\n\n#### Batch consumer support\n\nThe `EventHubsInboundChannelAdapter` supports the batch-consuming mode. To enable it, users can specify the listener mode as `ListenerMode.BATCH` when constructing an `EventHubsInboundChannelAdapter` instance.\nWhen enabled, an **Message** of which the payload is a list of batched events will be received and passed to the downstream channel. Each message header is also converted as a list, of which the content is the associated header value parsed from each event. For the communal headers of partition ID, checkpointer and last enqueued properties, they are presented as a single value for the entire batch of events shares the same one. For more information, see the [Event Hubs Message Headers](#event-hubs-message-headers) section.\n\n> [!NOTE]\n> The checkpoint header only exists when **MANUAL** checkpoint mode is used.\n\nCheckpointing of batch consumer supports two modes: `BATCH` and `MANUAL`. `BATCH` mode is an auto checkpointing mode to checkpoint the entire batch of events together once they are received. `MANUAL` mode is to checkpoint the events by users. When used, the\n**Checkpointer** will be passed into the message header, and users could use it to do checkpointing.\n\nThe batch consuming policy can be specified by properties of `max-size` and `max-wait-time`, where `max-size` is a necessary property while `max-wait-time` is optional.\nTo specify the batch consuming strategy, developers can use `EventHubsContainerProperties` for the configuration. See [the following section](#receive-messages-from-azure-event-hubs) for an example of how to configure `EventHubsContainerProperties`.\n\n### Dependency setup\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-integration-eventhubs</artifactId>\n</dependency>\n```\n\n### Configuration\n\nThis starter provides the following 3 parts of configuration options:\n\n#### Connection Configuration Properties\n\nThis section contains the configuration options used for connecting to Azure Event Hubs.\n\n> [!NOTE]\n> If you choose to use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id) to make sure the security principal has been granted the sufficient permission to access the Azure resource.\n\nConnection configurable properties of `spring-cloud-azure-starter-integration-eventhubs`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                 | Type    | Description                                                                                                                |\n> |----------------------------------------------------------|---------|----------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.eventhubs.enabled`                 | boolean | Whether an Azure Event Hubs is enabled.                                                                                    |\n> | `spring.cloud.azure.eventhubs.connection-string`       | String  | Event Hubs Namespace connection string value.                                                                              |\n> | `spring.cloud.azure.eventhubs.namespace`               | String  | Event Hubs Namespace value, which is the prefix of the FQDN. A FQDN should be composed of NamespaceName.DomainName |\n> | `spring.cloud.azure.eventhubs.domain-name`             | String  | Domain name of an Azure Event Hubs Namespace value.                                                                        |\n> | `spring.cloud.azure.eventhubs.custom-endpoint-address` | String  | Custom Endpoint address.                                                                                                   |\n> | `spring.cloud.azure.eventhubs.shared-connection`       | Boolean | Whether the underlying EventProcessorClient and EventHubProducerAsyncClient use the same connection. By default, a new connection is constructed and used created for each Event Hub client created. |\n\n#### Checkpoint Configuration Properties\n\nThis section contains the configuration options for the Storage Blobs service, which is used for persisting partition ownership and checkpoint information.\n\n> [!NOTE]\n> From version 4.0.0, when the property of `spring.cloud.azure.eventhubs.processor.checkpoint-store.create-container-if-not-exists` isn't enabled manually, no Storage container will be created automatically.\n\nCheckpointing configurable properties of `spring-cloud-azure-starter-integration-eventhubs`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                                   | Type    | Description                                         |\n> |--------------------------------------------------------------------------------------------|---------|-----------------------------------------------------|\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.create-container-if-not-exists` | Boolean | Whether to allow creating containers if not exists. |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name`                   | String  | Name for the storage account.                       |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-key`                    | String  | Storage account access key.                         |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name`                 | String  | Storage container name.                             |\n\nCommon Azure Service SDK configuration options are configurable for Storage Blob checkpoint store as well. The supported configuration options are introduced in [Spring Cloud Azure configuration](configuration.md), and could be configured with either the unified prefix `spring.cloud.azure.` or the prefix of `spring.cloud.azure.eventhubs.processor.checkpoint-store.`.\n\n#### Event Hub processor configuration properties\n\nThe `EventHubsInboundChannelAdapter` uses the `EventProcessorClient` to consume messages from an event hub, to configure the overall properties of an `EventProcessorClient`,\ndevelopers can use `EventHubsContainerProperties` for the configuration. See [the following section](#receive-messages-from-azure-event-hubs) about how to work with `EventHubsInboundChannelAdapter`.\n\n### Basic usage\n\n#### Send messages to Azure Event Hubs\n\n1. Fill the credential configuration options.\n\n   * For credentials as connection string, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           eventhubs:\n             connection-string: ${AZURE_EVENT_HUBS_CONNECTION_STRING}\n             processor:\n               checkpoint-store:\n                 container-name: ${CHECKPOINT-CONTAINER}\n                 account-name: ${CHECKPOINT-STORAGE-ACCOUNT}\n                 account-key: ${CHECKPOINT-ACCESS-KEY}\n     ```\n\n     [!INCLUDE [security-note](../includes/security-note.md)]\n\n   * For credentials as managed identities, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             managed-identity-enabled: true\n             client-id: ${AZURE_CLIENT_ID}\n           eventhubs:\n             namespace: ${AZURE_EVENT_HUBS_NAMESPACE}\n             processor:\n               checkpoint-store:\n                 container-name: ${CONTAINER_NAME}\n                 account-name: ${ACCOUNT_NAME}\n     ```\n\n   * For credentials as service principal, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             client-id: ${AZURE_CLIENT_ID}\n             client-secret: ${AZURE_CLIENT_SECRET}\n           profile:\n             tenant-id: <tenant>\n           eventhubs:\n             namespace: ${AZURE_EVENT_HUBS_NAMESPACE}\n             processor:\n               checkpoint-store:\n                 container-name: ${CONTAINER_NAME}\n                 account-name: ${ACCOUNT_NAME}\n     ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n1. Create `DefaultMessageHandler` with the `EventHubsTemplate` bean to send messages to Event Hubs.\n\n   ```java\n   class Demo {\n       private static final String OUTPUT_CHANNEL = \"output\";\n       private static final String EVENTHUB_NAME = \"eh1\";\n\n       @Bean\n       @ServiceActivator(inputChannel = OUTPUT_CHANNEL)\n       public MessageHandler messageSender(EventHubsTemplate eventHubsTemplate) {\n           DefaultMessageHandler handler = new DefaultMessageHandler(EVENTHUB_NAME, eventHubsTemplate);\n           handler.setSendCallback(new ListenableFutureCallback<Void>() {\n               @Override\n               public void onSuccess(Void result) {\n                   LOGGER.info(\"Message was sent successfully.\");\n               }\n               @Override\n               public void onFailure(Throwable ex) {\n                   LOGGER.error(\"There was an error sending the message.\", ex);\n               }\n           });\n           return handler;\n       }\n   }\n   ```\n\n1. Create a message gateway binding with the above message handler via a message channel.\n\n   ```java\n   class Demo {\n       @Autowired\n       EventHubOutboundGateway messagingGateway;\n   \n       @MessagingGateway(defaultRequestChannel = OUTPUT_CHANNEL)\n       public interface EventHubOutboundGateway {\n           void send(String text);\n       }\n   }\n   ```\n\n1. Send messages using the gateway.\n\n   ```java\n   class Demo {\n       public void demo() {\n           this.messagingGateway.send(message);\n       }\n   }\n   ```\n\n#### Receive messages from Azure Event Hubs\n\n1. Fill the credential configuration options.\n\n1. Create a bean of message channel as the input channel.\n\n   ```java\n   @Configuration\n   class Demo {\n       @Bean\n       public MessageChannel input() {\n           return new DirectChannel();\n       }\n   }\n   ```\n\n1. Create `EventHubsInboundChannelAdapter` with the `EventHubsMessageListenerContainer` bean to receive messages from Event Hubs.\n\n   ```java\n   @Configuration\n   class Demo {\n       private static final String INPUT_CHANNEL = \"input\";\n       private static final String EVENTHUB_NAME = \"eh1\";\n       private static final String CONSUMER_GROUP = \"$Default\";\n\n       @Bean\n       public EventHubsInboundChannelAdapter messageChannelAdapter(\n               @Qualifier(INPUT_CHANNEL) MessageChannel inputChannel,\n               EventHubsMessageListenerContainer listenerContainer) {\n           EventHubsInboundChannelAdapter adapter = new EventHubsInboundChannelAdapter(listenerContainer);\n           adapter.setOutputChannel(inputChannel);\n           return adapter;\n       }\n\n       @Bean\n       public EventHubsMessageListenerContainer messageListenerContainer(EventHubsProcessorFactory processorFactory) {\n           EventHubsContainerProperties containerProperties = new EventHubsContainerProperties();\n           containerProperties.setEventHubName(EVENTHUB_NAME);\n           containerProperties.setConsumerGroup(CONSUMER_GROUP);\n           containerProperties.setCheckpointConfig(new CheckpointConfig(CheckpointMode.MANUAL));\n           return new EventHubsMessageListenerContainer(processorFactory, containerProperties);\n       }\n   }\n   ```\n\n1. Create a message receiver binding with EventHubsInboundChannelAdapter via the message channel created before.\n\n   ```java\n   class Demo {\n       @ServiceActivator(inputChannel = INPUT_CHANNEL)\n       public void messageReceiver(byte[] payload, @Header(AzureHeaders.CHECKPOINTER) Checkpointer checkpointer) {\n           String message = new String(payload);\n           LOGGER.info(\"New message received: '{}'\", message);\n           checkpointer.success()\n                   .doOnSuccess(s -> LOGGER.info(\"Message '{}' successfully checkpointed\", message))\n                   .doOnError(e -> LOGGER.error(\"Error found\", e))\n                   .block();\n       }\n   }\n   ```\n\n#### Configure EventHubsMessageConverter to customize objectMapper\n\n`EventHubsMessageConverter` is made as a configurable bean to allow users to customize ObjectMapper.\n\n#### Batch consumer support\n\nTo consume messages from Event Hubs in batches is similar with the above sample, besides users should set the batch-consuming related configuration options for `EventHubsInboundChannelAdapter`.\n\nWhen create `EventHubsInboundChannelAdapter`, the listener mode should be set as `BATCH`. When create bean of `EventHubsMessageListenerContainer`, set the checkpoint mode as either `MANUAL` or `BATCH`, and the batch options can be configured as needed.\n\n```java\n@Configuration\nclass Demo {\n    private static final String INPUT_CHANNEL = \"input\";\n    private static final String EVENTHUB_NAME = \"eh1\";\n    private static final String CONSUMER_GROUP = \"$Default\";\n\n    @Bean\n    public EventHubsInboundChannelAdapter messageChannelAdapter(\n            @Qualifier(INPUT_CHANNEL) MessageChannel inputChannel,\n            EventHubsMessageListenerContainer listenerContainer) {\n        EventHubsInboundChannelAdapter adapter = new EventHubsInboundChannelAdapter(listenerContainer, ListenerMode.BATCH);\n        adapter.setOutputChannel(inputChannel);\n        return adapter;\n    }\n\n    @Bean\n    public EventHubsMessageListenerContainer messageListenerContainer(EventHubsProcessorFactory processorFactory) {\n        EventHubsContainerProperties containerProperties = new EventHubsContainerProperties();\n        containerProperties.setEventHubName(EVENTHUB_NAME);\n        containerProperties.setConsumerGroup(CONSUMER_GROUP);\n        containerProperties.getBatch().setMaxSize(100);\n        containerProperties.setCheckpointConfig(new CheckpointConfig(CheckpointMode.MANUAL));\n        return new EventHubsMessageListenerContainer(processorFactory, containerProperties);\n    }\n}\n```\n\n#### Event Hubs message headers\n\nThe following table illustrates how Event Hubs message properties are mapped to Spring message headers. For Azure Event Hubs, message is called as `event`.\n\nMapping between Event Hubs Message / Event Properties and Spring Message Headers in Record Listener Mode:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Event Hubs Event Properties    | Spring Message Header Constants                 | Type                        | Description                                                                                           |\n> |--------------------------------|-------------------------------------------------|-----------------------------|-------------------------------------------------------------------------------------------------------|\n> | Enqueued time                  | EventHubsHeaders#ENQUEUED_TIME                  | Instant                     | The instant, in UTC, of when the event was enqueued in the Event Hub partition.                       |\n> | Offset                         | EventHubsHeaders#OFFSET                         | Long                        | The offset of the event when it was received from the associated Event Hub partition.                 |\n> | Partition key                  | AzureHeaders#PARTITION_KEY                      | String                      | The partition hashing key if it was set when originally publishing the event.                         |\n> | Partition ID                   | AzureHeaders#RAW_PARTITION_ID                   | String                      | The partition ID of the Event Hub.                                                                    |\n> | Sequence number                | EventHubsHeaders#SEQUENCE_NUMBER                | Long                        | The sequence number assigned to the event when it was enqueued in the associated Event Hub partition. |\n> | Last enqueued event properties | EventHubsHeaders#LAST_ENQUEUED_EVENT_PROPERTIES | LastEnqueuedEventProperties | The properties of the last enqueued event in this partition.                                          |\n> | NA                             | AzureHeaders#CHECKPOINTER                       | Checkpointer                | The header for checkpoint the specific message.                                                       |\n\nUsers can parse the message headers for the related information of each event. To set a message header for the event, all customized headers will be put as an application property of an event, where the header is set as the property key. When events are received from Event Hubs, all application properties will be converted to the message header.\n\n> [!NOTE]\n> Message headers of partition key, enqueued time, offset and sequence number isn't supported to be set manually.\n\nWhen the batch-consumer mode is enabled, the specific headers of batched messages are listed the follows, which contains a list of values from each single Event Hubs event.\n\nMapping between Event Hubs Message / Event Properties and Spring Message Headers in Batch Listener Mode:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Event Hubs Event Properties | Spring Batch Message Header Constants                   | Type            | Description                                                                                                            |\n> |-----------------------------|---------------------------------------------------------|-----------------|------------------------------------------------------------------------------------------------------------------------|\n> | Enqueued time               | EventHubsHeaders#ENQUEUED_TIME                          | List of Instant | List of the instant, in UTC, of when each event was enqueued in the Event Hub partition.                               |\n> | Offset                      | EventHubsHeaders#OFFSET                                 | List of Long    | List of the offset of each event when it was received from the associated Event Hub partition.                         |\n> | Partition key               | AzureHeaders#PARTITION_KEY                              | List of String  | List of the partition hashing key if it was set when originally publishing each event.                                 |\n> | Sequence number             | EventHubsHeaders#SEQUENCE_NUMBER                        | List of Long    | List of the sequence number assigned to each event when it was enqueued in the associated Event Hub partition.         |\n> | System properties           | EventHubsHeaders#BATCH_CONVERTED_SYSTEM_PROPERTIES      | List of Map     | List of the system properties of each event.                                                                           |\n> | Application properties      | EventHubsHeaders#BATCH_CONVERTED_APPLICATION_PROPERTIES | List of Map     | List of the application properties of each event, where all customized message headers or event properties are placed. |\n\n> [!NOTE]\n> When publish messages, all the above batch headers will be removed from the messages if exist.\n\n### Samples\n\nFor more information, see the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/eventhubs/spring-cloud-azure-starter-integration-eventhubs/eventhubs-integration) repository on GitHub.\n\n## Spring Integration with Azure Service Bus\n\n### Key concepts\n\nSpring Integration enables lightweight messaging within Spring-based applications and supports integration with external systems via declarative adapters.\n\nThe Spring Integration for Azure Service Bus extension project provides inbound and outbound channel adapters for Azure Service Bus.\n\n> [!NOTE]\n> CompletableFuture support APIs have been deprecated from version 2.10.0, and is replaced by Reactor Core from version 4.0.0.\nSee Javadoc for details.\n\n### Dependency setup\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-integration-servicebus</artifactId>\n</dependency>\n```\n\n### Configuration\n\nThis starter provides the following 2 parts of configuration options:\n\n#### Connection configuration properties\n\nThis section contains the configuration options used for connecting to Azure Service Bus.\n\n> [!NOTE]\n> If you choose to use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id) to make sure the security principal has been granted the sufficient permission to access the Azure resource.\n\nConnection configurable properties of `spring-cloud-azure-starter-integration-servicebus`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                            | Type    | Description                                                                                                                 |\n> |-----------------------------------------------------|---------|-----------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.servicebus.enabled`           | boolean | Whether an Azure Service Bus is enabled.                                                                                    |\n> | `spring.cloud.azure.servicebus.connection-string` | String  | Service Bus Namespace connection string value.                                                                              |\n> | `spring.cloud.azure.servicebus.custom-endpoint-address` | String  | The custom endpoint address to use when connecting to Service Bus.                                                                              |\n> | `spring.cloud.azure.servicebus.namespace`         | String  | Service Bus Namespace value, which is the prefix of the FQDN. A FQDN should be composed of NamespaceName.DomainName |\n> | `spring.cloud.azure.servicebus.domain-name`       | String  | Domain name of an Azure Service Bus Namespace value.                                                                        |\n\n#### Service Bus processor configuration properties\n\nThe `ServiceBusInboundChannelAdapter` uses the `ServiceBusProcessorClient` to consume messages, to configure the overall properties of an `ServiceBusProcessorClient`,\ndevelopers can use `ServiceBusContainerProperties` for the configuration. See [the following section](#receive-messages-from-azure-service-bus) about how to work with `ServiceBusInboundChannelAdapter`.\n\n### Basic usage\n\n#### Send messages to Azure Service Bus\n\n1. Fill the credential configuration options.\n\n   * For credentials as connection string, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           servicebus:\n             connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}\n     ```\n\n     [!INCLUDE [security-note](../includes/security-note.md)]\n\n   * For credentials as managed identities, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             managed-identity-enabled: true\n             client-id: ${AZURE_CLIENT_ID}\n           profile:\n             tenant-id: <tenant>\n           servicebus:\n             namespace: ${AZURE_SERVICE_BUS_NAMESPACE}\n     ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n   * For credentials as service principal, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             client-id: ${AZURE_CLIENT_ID}\n             client-secret: ${AZURE_CLIENT_SECRET}\n           profile:\n             tenant-id: <tenant>\n           servicebus:\n             namespace: ${AZURE_SERVICE_BUS_NAMESPACE}\n     ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n1. Create `DefaultMessageHandler` with the `ServiceBusTemplate` bean to send messages to Service Bus, set the entity type for the ServiceBusTemplate. This sample takes Service Bus Queue as example.\n\n   ```java\n   class Demo {\n       private static final String OUTPUT_CHANNEL = \"queue.output\";\n\n       @Bean\n       @ServiceActivator(inputChannel = OUTPUT_CHANNEL)\n       public MessageHandler queueMessageSender(ServiceBusTemplate serviceBusTemplate) {\n           serviceBusTemplate.setDefaultEntityType(ServiceBusEntityType.QUEUE);\n           DefaultMessageHandler handler = new DefaultMessageHandler(QUEUE_NAME, serviceBusTemplate);\n           handler.setSendCallback(new ListenableFutureCallback<Void>() {\n               @Override\n               public void onSuccess(Void result) {\n                   LOGGER.info(\"Message was sent successfully.\");\n               }\n\n               @Override\n               public void onFailure(Throwable ex) {\n                   LOGGER.error(\"There was an error sending the message.\", ex);\n               }\n           });\n\n           return handler;\n       }\n   }\n   ```\n\n1. Create a message gateway binding with the above message handler via a message channel.\n\n   ```java\n   class Demo {\n       @Autowired\n       QueueOutboundGateway messagingGateway;\n\n       @MessagingGateway(defaultRequestChannel = OUTPUT_CHANNEL)\n       public interface QueueOutboundGateway {\n           void send(String text);\n       }\n   }\n   ```\n\n1. Send messages using the gateway.\n\n   ```java\n   class Demo {\n       public void demo() {\n           this.messagingGateway.send(message);\n       }\n   }\n   ```\n\n#### Receive messages from Azure Service Bus\n\n1. Fill the credential configuration options.\n\n1. Create a bean of message channel as the input channel.\n\n   ```java\n   @Configuration\n   class Demo {\n       private static final String INPUT_CHANNEL = \"input\";\n\n       @Bean\n       public MessageChannel input() {\n           return new DirectChannel();\n       }\n   }\n   ```\n\n1. Create `ServiceBusInboundChannelAdapter` with the `ServiceBusMessageListenerContainer` bean to receive messages to Service Bus. This sample takes Service Bus Queue as example.\n\n   ```java\n   @Configuration\n   class Demo {\n       private static final String QUEUE_NAME = \"queue1\";\n\n       @Bean\n       public ServiceBusMessageListenerContainer messageListenerContainer(ServiceBusProcessorFactory processorFactory) {\n           ServiceBusContainerProperties containerProperties = new ServiceBusContainerProperties();\n           containerProperties.setEntityName(QUEUE_NAME);\n           containerProperties.setAutoComplete(false);\n           return new ServiceBusMessageListenerContainer(processorFactory, containerProperties);\n       }\n\n       @Bean\n       public ServiceBusInboundChannelAdapter queueMessageChannelAdapter(\n           @Qualifier(INPUT_CHANNEL) MessageChannel inputChannel,\n           ServiceBusMessageListenerContainer listenerContainer) {\n           ServiceBusInboundChannelAdapter adapter = new ServiceBusInboundChannelAdapter(listenerContainer);\n           adapter.setOutputChannel(inputChannel);\n           return adapter;\n       }\n   }\n   ```\n\n1. Create a message receiver binding with `ServiceBusInboundChannelAdapter` via the message channel we created before.\n\n   ```java\n   class Demo {\n       @ServiceActivator(inputChannel = INPUT_CHANNEL)\n       public void messageReceiver(byte[] payload, @Header(AzureHeaders.CHECKPOINTER) Checkpointer checkpointer) {\n           String message = new String(payload);\n           LOGGER.info(\"New message received: '{}'\", message);\n           checkpointer.success()\n                   .doOnSuccess(s -> LOGGER.info(\"Message '{}' successfully checkpointed\", message))\n                   .doOnError(e -> LOGGER.error(\"Error found\", e))\n                   .block();\n       }\n   }\n   ```\n\n#### Configure ServiceBusMessageConverter to customize objectMapper\n\n`ServiceBusMessageConverter` is made as a configurable bean to allow users to customize `ObjectMapper`.\n\n#### Service Bus message headers\n\nFor some Service Bus headers that can be mapped to multiple Spring header constants, the priority of different Spring headers is listed.\n\nMapping between Service Bus Headers and Spring Headers:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Service Bus message headers and properties | Spring message header constants                          | Type                   | Configurable | Description                                                                                                                                                 |\n> |--------------------------------------------|----------------------------------------------------------|------------------------|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | Content type                               | `MessageHeaders#CONTENT_TYPE`                            | String                 | Yes          | The RFC2045 Content-Type descriptor of the message.                                                                                                         |\n> | Correlation ID                             | `ServiceBusMessageHeaders#CORRELATION_ID`                | String                 | Yes          | The correlation ID of the message                                                                                                                           |\n> | Message ID                                 | `ServiceBusMessageHeaders#MESSAGE_ID`                    | String                 | Yes          | The message ID of the message, this header has higher priority than `MessageHeaders#ID`.                                                                    |\n> | Message ID                                 | `MessageHeaders#ID`                                      | UUID                   | Yes          | The message ID of the message, this header has lower priority than `ServiceBusMessageHeaders#MESSAGE_ID`.                                                   |\n> | Partition key                              | `ServiceBusMessageHeaders#PARTITION_KEY`                 | String                 | Yes          | The partition key for sending the message to a partitioned entity.                                                                                          |\n> | Reply to                                   | `MessageHeaders#REPLY_CHANNEL`                           | String                 | Yes          | The address of an entity to send replies to.                                                                                                                |\n> | Reply to session ID                        | `ServiceBusMessageHeaders#REPLY_TO_SESSION_ID`           | String                 | Yes          | The ReplyToGroupId property value of the message.                                                                                                           |\n> | Scheduled enqueue time utc                 | `ServiceBusMessageHeaders#SCHEDULED_ENQUEUE_TIME`        | OffsetDateTime         | Yes          | The datetime at which the message should be enqueued in Service Bus, this header has higher priority than `AzureHeaders#SCHEDULED_ENQUEUE_MESSAGE`.         |\n> | Scheduled enqueue time utc                 | `AzureHeaders#SCHEDULED_ENQUEUE_MESSAGE`                 | Integer                | Yes          | The datetime at which the message should be enqueued in Service Bus, this header has lower priority than `ServiceBusMessageHeaders#SCHEDULED_ENQUEUE_TIME`. |\n> | Session ID                                 | `ServiceBusMessageHeaders#SESSION_ID`                    | String                 | Yes          | The session IDentifier for a session-aware entity.                                                                                                          |\n> | Time to live                               | `ServiceBusMessageHeaders#TIME_TO_LIVE`                  | Duration               | Yes          | The duration of time before this message expires.                                                                                                           |\n> | To                                         | `ServiceBusMessageHeaders#TO`                            | String                 | Yes          | The \"to\" address of the message, reserved for future use in routing scenarios and presently ignored by the broker itself.                                   |\n> | Subject                                    | `ServiceBusMessageHeaders#SUBJECT`                       | String                 | Yes          | The subject for the message.                                                                                                                                |\n> | Dead letter error description              | `ServiceBusMessageHeaders#DEAD_LETTER_ERROR_DESCRIPTION` | String                 | No           | The description for a message that has been dead-lettered.                                                                                                  |\n> | Dead letter reason                         | `ServiceBusMessageHeaders#DEAD_LETTER_REASON`            | String                 | No           | The reason a message was dead-lettered.                                                                                                                     |\n> | Dead letter source                         | `ServiceBusMessageHeaders#DEAD_LETTER_SOURCE`            | String                 | No           | The entity in which the message was dead-lettered.                                                                                                          |\n> | Delivery count                             | `ServiceBusMessageHeaders#DELIVERY_COUNT`                | long                   | No           | The number of the times this message was delivered to clients.                                                                                              |\n> | Enqueued sequence number                   | `ServiceBusMessageHeaders#ENQUEUED_SEQUENCE_NUMBER`      | long                   | No           | The enqueued sequence number assigned to a message by Service Bus.                                                                                          |\n> | Enqueued time                              | `ServiceBusMessageHeaders#ENQUEUED_TIME`                 | OffsetDateTime         | No           | The datetime at which this message was enqueued in Service Bus.                                                                                             |\n> | Expires at                                 | `ServiceBusMessageHeaders#EXPIRES_AT`                    | OffsetDateTime         | No           | The datetime at which this message will expire.                                                                                                             |\n> | Lock token                                 | `ServiceBusMessageHeaders#LOCK_TOKEN`                    | String                 | No           | The lock token for the current message.                                                                                                                     |\n> | Locked until                               | `ServiceBusMessageHeaders#LOCKED_UNTIL`                  | OffsetDateTime         | No           | The datetime at which the lock of this message expires.                                                                                                     |\n> | Sequence number                            | `ServiceBusMessageHeaders#SEQUENCE_NUMBER`               | long                   | No           | The unique number assigned to a message by Service Bus.                                                                                                     |\n> | State                                      | `ServiceBusMessageHeaders#STATE`                         | ServiceBusMessageState | No           | The state of the message, which can be Active, Deferred, or Scheduled.                                                                                      |\n\n#### Partition key support\n\nThis starter supports [Service Bus partitioning](/azure/service-bus-messaging/service-bus-partitioning) by allowing setting partition key and session ID in the message header. This section introduces how to set partition key for messages.\n\nRecommended: Use `ServiceBusMessageHeaders.PARTITION_KEY` as the key of the header.\n\n```java\npublic class SampleController {\n    @PostMapping(\"/messages\")\n    public ResponseEntity<String> sendMessage(@RequestParam String message) {\n        LOGGER.info(\"Going to add message {} to Sinks.Many.\", message);\n        many.emitNext(MessageBuilder.withPayload(message)\n                                    .setHeader(ServiceBusMessageHeaders.PARTITION_KEY, \"Customize partition key\")\n                                    .build(), Sinks.EmitFailureHandler.FAIL_FAST);\n        return ResponseEntity.ok(\"Sent!\");\n    }\n}\n```\n\nNot recommended but currently supported: `AzureHeaders.PARTITION_KEY` as the key of the header.\n\n```java\npublic class SampleController {\n    @PostMapping(\"/messages\")\n    public ResponseEntity<String> sendMessage(@RequestParam String message) {\n        LOGGER.info(\"Going to add message {} to Sinks.Many.\", message);\n        many.emitNext(MessageBuilder.withPayload(message)\n                                    .setHeader(AzureHeaders.PARTITION_KEY, \"Customize partition key\")\n                                    .build(), Sinks.EmitFailureHandler.FAIL_FAST);\n        return ResponseEntity.ok(\"Sent!\");\n    }\n}\n```\n\n> [!NOTE]\n> When both `ServiceBusMessageHeaders.PARTITION_KEY` and `AzureHeaders.PARTITION_KEY` are set in the message headers,\n`ServiceBusMessageHeaders.PARTITION_KEY` is preferred.\n\n#### Session support\n\nThis example demonstrates how to manually set the session ID of a message in the application.\n\n```java\npublic class SampleController {\n    @PostMapping(\"/messages\")\n    public ResponseEntity<String> sendMessage(@RequestParam String message) {\n        LOGGER.info(\"Going to add message {} to Sinks.Many.\", message);\n        many.emitNext(MessageBuilder.withPayload(message)\n                                    .setHeader(ServiceBusMessageHeaders.SESSION_ID, \"Customize session ID\")\n                                    .build(), Sinks.EmitFailureHandler.FAIL_FAST);\n        return ResponseEntity.ok(\"Sent!\");\n    }\n}\n```\n\n> [!NOTE]\n> When the `ServiceBusMessageHeaders.SESSION_ID` is set in the message headers, and a different `ServiceBusMessageHeaders.PARTITION_KEY` header is also set, the value of the session ID will eventually be used to overwrite the value of the partition key.\n\n#### Customize Service Bus client properties\n\nDevelopers can use `AzureServiceClientBuilderCustomizer` to customize Service Bus Client properties. The following example customizes the `sessionIdleTimeout` property in `ServiceBusClientBuilder`:\n\n```java\n@Bean\npublic AzureServiceClientBuilderCustomizer<ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder> customizeBuilder() {\n    return builder -> builder.sessionIdleTimeout(Duration.ofSeconds(10));\n}\n```\n\n### Samples\n\nFor more information, see the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus/spring-cloud-azure-starter-integration-servicebus) repository on GitHub.\n\n## Spring Integration with Azure Storage Queue\n\n### Key concepts\n\nAzure Queue Storage is a service for storing large numbers of messages. You access messages from anywhere in the world via authenticated calls using HTTP or HTTPS. A queue message can be up to 64 KB in size. A queue may contain millions of messages, up to the total capacity limit of a storage account. Queues are commonly used to create a backlog of work to process asynchronously.\n\n### Dependency setup\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-integration-storage-queue</artifactId>\n</dependency>\n```\n\n### Configuration\n\nThis starter provides the following configuration options:\n\n#### Connection configuration properties\n\nThis section contains the configuration options used for connecting to Azure Storage Queue.\n\n> [!NOTE]\n> If you choose to use a security principal to authenticate and authorize with Microsoft Entra ID for accessing an Azure resource, see [Authorize access with Microsoft Entra ID](authentication.md#authorize-access-with-microsoft-entra-id) to make sure the security principal has been granted the sufficient permission to access the Azure resource.\n\nConnection configurable properties of `spring-cloud-azure-starter-integration-storage-queue`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                               | Type                | Description                                                |\n> |--------------------------------------------------------|---------------------|------------------------------------------------------------|\n> | `spring.cloud.azure.storage.queue.enabled`           | boolean             | Whether an Azure Storage Queue is enabled.                 |\n> | `spring.cloud.azure.storage.queue.connection-string` | String              | Storage Queue Namespace connection string value.           |\n> | `spring.cloud.azure.storage.queue.accountName`       | String              | Storage Queue account name.                                |\n> | `spring.cloud.azure.storage.queue.accountKey`        | String              | Storage Queue account key.                                 |\n> | `spring.cloud.azure.storage.queue.endpoint`          | String              | Storage Queue service endpoint.                            |\n> | `spring.cloud.azure.storage.queue.sasToken`          | String              | Sas token credential                                       |\n> | `spring.cloud.azure.storage.queue.serviceVersion`    | QueueServiceVersion | QueueServiceVersion that is used when making API requests. |\n> | `spring.cloud.azure.storage.queue.messageEncoding`   | String              | Queue message encoding.                                    |\n\n### Basic usage\n\n#### Send messages to Azure Storage Queue\n\n1. Fill the credential configuration options.\n\n   * For credentials as connection string, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           storage:\n             queue:\n               connection-string: ${AZURE_STORAGE_QUEUE_CONNECTION_STRING}\n     ```\n\n     [!INCLUDE [security-note](../includes/security-note.md)]\n\n   * For credentials as managed identities, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             managed-identity-enabled: true\n             client-id: ${AZURE_CLIENT_ID}\n           profile:\n             tenant-id: <tenant>\n           storage:\n             queue:\n               account-name: ${AZURE_STORAGE_QUEUE_ACCOUNT_NAME}\n     ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n   * For credentials as service principal, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             client-id: ${AZURE_CLIENT_ID}\n             client-secret: ${AZURE_CLIENT_SECRET}\n           profile:\n             tenant-id: <tenant>\n           storage:\n             queue:\n               account-name: ${AZURE_STORAGE_QUEUE_ACCOUNT_NAME}\n     ```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n1. Create `DefaultMessageHandler` with the `StorageQueueTemplate` bean to send messages to Storage Queue.\n\n   ```java\n   class Demo {\n       private static final String STORAGE_QUEUE_NAME = \"example\";\n       private static final String OUTPUT_CHANNEL = \"output\";\n\n       @Bean\n       @ServiceActivator(inputChannel = OUTPUT_CHANNEL)\n       public MessageHandler messageSender(StorageQueueTemplate storageQueueTemplate) {\n           DefaultMessageHandler handler = new DefaultMessageHandler(STORAGE_QUEUE_NAME, storageQueueTemplate);\n           handler.setSendCallback(new ListenableFutureCallback<Void>() {\n               @Override\n               public void onSuccess(Void result) {\n                   LOGGER.info(\"Message was sent successfully.\");\n               }\n\n               @Override\n               public void onFailure(Throwable ex) {\n                   LOGGER.error(\"There was an error sending the message.\", ex);\n               }\n           });\n           return handler;\n       }\n   }\n   ```\n\n1. Create a Message gateway binding with the above message handler via a message channel.\n\n   ```java\n   class Demo {\n       @Autowired\n       StorageQueueOutboundGateway storageQueueOutboundGateway;\n\n       @MessagingGateway(defaultRequestChannel = OUTPUT_CHANNEL)\n       public interface StorageQueueOutboundGateway {\n           void send(String text);\n       }\n   }\n   ```\n\n1. Send messages using the gateway.\n\n   ```java\n   class Demo {\n       public void demo() {\n           this.storageQueueOutboundGateway.send(message);\n       }\n   }\n   ```\n\n#### Receive messages from Azure Storage Queue\n\n1. Fill the credential configuration options.\n\n1. Create a bean of message channel as the input channel.\n\n   ```java\n   class Demo {\n       private static final String INPUT_CHANNEL = \"input\";\n\n       @Bean\n       public MessageChannel input() {\n           return new DirectChannel();\n       }\n   }\n   ```\n\n1. Create `StorageQueueMessageSource` with the `StorageQueueTemplate` bean to receive messages to Storage Queue.\n\n   ```java\n   class Demo {\n       private static final String STORAGE_QUEUE_NAME = \"example\";\n\n       @Bean\n       @InboundChannelAdapter(channel = INPUT_CHANNEL, poller = @Poller(fixedDelay = \"1000\"))\n       public StorageQueueMessageSource storageQueueMessageSource(StorageQueueTemplate storageQueueTemplate) {\n           return new StorageQueueMessageSource(STORAGE_QUEUE_NAME, storageQueueTemplate);\n       }\n   }\n   ```\n\n1. Create a message receiver binding with StorageQueueMessageSource created in the last step via the message channel we created before.\n\n   ```java\n   class Demo {\n       @ServiceActivator(inputChannel = INPUT_CHANNEL)\n       public void messageReceiver(byte[] payload, @Header(AzureHeaders.CHECKPOINTER) Checkpointer checkpointer) {\n           String message = new String(payload);\n           LOGGER.info(\"New message received: '{}'\", message);\n           checkpointer.success()\n               .doOnError(Throwable::printStackTrace)\n               .doOnSuccess(t -> LOGGER.info(\"Message '{}' successfully checkpointed\", message))\n               .block();\n       }\n   }\n   ```\n\n### Samples\n\nFor more information, see the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/storage/spring-cloud-azure-starter-integration-storage-queue) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/spring-jms-support.md",
    "content": "---\ntitle: Use Azure Service Bus with JMS\ndescription: This article describes how to use Spring Cloud Azure and Spring JMS together.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Use Azure Service Bus with JMS\n\nThis article describes how to use Azure Service Bus with the JMS API integrated into the Spring JMS framework.\n\n## Core features\n\n### Passwordless connection\n\nPasswordless connection uses Microsoft Entra authentication for connecting to Azure services without storing any credentials in the application, its configuration files, or in environment variables. Microsoft Entra authentication is a mechanism for connecting to Azure Service Bus using identities defined in Microsoft Entra ID. With Microsoft Entra authentication, you can manage Service Bus and other Microsoft services in a central location, which simplifies permission management.\n\n## How it works\n\nSpring Cloud Azure first builds one of the following types of credentials depending on the application authentication configuration:\n\n- `ClientSecretCredential`\n- `ClientCertificateCredential`\n- `UsernamePasswordCredential`\n- `ManagedIdentityCredential`\n\nIf none of these types of credentials are found, the credential chain via `DefaultTokenCredential` is used to obtain credentials from application properties, environment variables, managed identity, or IDEs. For more information, see [Spring Cloud Azure authentication](authentication.md).\n\n## Dependency setup\n\nAdd the following dependencies if you want to migrate your Spring JMS application to use Azure Service Bus.\n\n```xml\n<dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId>\n</dependency>\n```\n\n## Configuration\n\nThe following table describes the configurable properties when using the Spring JMS support:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                         | Description                                                                                                                                                                       |\n> |------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.jms.servicebus.connection-string`                      | The Azure Service Bus connection string, for when you want to provide the connection string directly.                                                                             |\n> | `spring.jms.servicebus.topic-client-id`                        | The JMS client ID. Only works for the `topicJmsListenerContainerFactory` bean.                                                                                                    |\n> | `spring.jms.servicebus.enabled`                                | A value that indicates whether to enable Service Bus JMS autoconfiguration. The default value is `true`.                                                                          |\n> | `spring.jms.servicebus.idle-timeout`                           | The connection idle timeout duration that indicates how long the client expects Service Bus to keep a connection alive when no messages are delivered. The default value is `2m`. |\n> | `spring.jms.servicebus.passwordless-enabled`                   | Whether to enable passwordless for Azure Service Bus JMS. The default value is `false`. |\n> | `spring.jms.servicebus.pricing-tier`                           | The Azure Service Bus Price Tier. Supported values are `premium` and `standard`. Premium tier uses Java Message Service (JMS) 2.0, while standard tier use JMS 1.1 to interact with Azure Service Bus. |\n> | `spring.jms.servicebus.listener.reply-pub-sub-domain`          | A value that indicates whether the reply destination type is a topic. Only works for the `topicJmsListenerContainerFactory` bean.                                                 |\n> | `spring.jms.servicebus.listener.phase`                         | The phase in which this container should be started and stopped.                                                                                                                  |\n> | `spring.jms.servicebus.listener.reply-qos-settings`            | Configures the `QosSettings` to use when sending a reply.                                                                                                                         |\n> | `spring.jms.servicebus.listener.subscription-durable`          | A value that indicates whether to make the subscription durable. Only works for the `topicJmsListenerContainerFactory` bean. The default value is `true`.                         |\n> | `spring.jms.servicebus.listener.subscription-shared`           | A value that indicates whether to make the subscription shared. Only works for the `topicJmsListenerContainerFactory` bean.                                                       |\n> | `spring.jms.servicebus.pool.block-if-full`                     | A value that indicates whether to block when a connection is requested and the pool is full. Set it to false to throw a `JMSException` instead.                                   |\n> | `spring.jms.servicebus.pool.block-if-full-timeout`             | The blocking period before throwing an exception if the pool is still full.                                                                                                       |\n> | `spring.jms.servicebus.pool.enabled`                           | A value that indicates whether a `JmsPoolConnectionFactory` should be created, instead of a regular `ConnectionFactory`.                                                          |\n> | `spring.jms.servicebus.pool.idle-timeout`                      | The connection pool idle timeout.                                                                                                                                                 |\n> | `spring.jms.servicebus.pool.max-connections`                   | The maximum number of pooled connections.                                                                                                                                         |\n> | `spring.jms.servicebus.pool.max-sessions-per-connection`       | The maximum number of pooled sessions per connection in the pool.                                                                                                                 |\n> | `spring.jms.servicebus.pool.time-between-expiration-check`     | The time to sleep between runs of the idle connection eviction thread. When negative, no idle connection eviction thread runs.                                                    |\n> | `spring.jms.servicebus.pool.use-anonymous-producers`           | A value that indicates whether to use only one anonymous `MessageProducer` instance. Set it to `false` to create one `MessageProducer` every time one is required.                |\n> | `spring.jms.servicebus.prefetch-policy.all`                    | The fallback value for the prefetch option in this Service Bus namespace. The default value is `0`.                                                                               |\n> | `spring.jms.servicebus.prefetch-policy.durable-topic-prefetch` | The number of prefetch for durable topic. The default value is `0`.                                                                                                               |\n> | `spring.jms.servicebus.prefetch-policy.queue-browser-prefetch` | The number of prefetch for queue browser. The default value is `0`.                                                                                                               |\n> | `spring.jms.servicebus.prefetch-policy.queue-prefetch`         | The number of prefetch for queue. The default value is `0`.                                                                                                                       |\n> | `spring.jms.servicebus.prefetch-policy.topic-prefetch`         | The number of prefetch for topic. The default value is `0`.                                                                                                                       |\n\n> [!NOTE]\n> Spring JMS general configuration is omitted for short.\n\nFor more information, see [Spring JMS Document](https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/jms.html).\n\n## Basic usage\n\n### Connect to Azure Service Bus JMS using passwordless\n\nConfigure the following properties in your **application.yml** file:\n\n```yaml\nspring:\n  jms:\n    servicebus:\n      namespace: ${AZURE_SERVICEBUS_NAMESPACE}\n      pricing-tier: ${PRICING_TIER}\n      passwordless-enabled: true\n```\n\n> [!IMPORTANT]\n> Azure Service Bus JMS supports using Microsoft Entra ID to authorize requests to Service Bus resources. With Microsoft Entra ID, ensure that you've assigned the **Azure Service Bus Data Owner** role to the Microsoft Entra account you're currently using. For more information, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal).\n\n### Connect to Azure Service Bus with JMS use Managed Identity\n\n1. To use the managed identity, enable the managed identity for your service and assign the `Azure Service Bus Data Owner` role. For more information, see [Authenticate a managed identity with Microsoft Entra ID to access Azure Service Bus resources](/azure/service-bus-messaging/service-bus-managed-service-identity).\n\n1. Configure the following properties in your **application.yml** file:\n\n   ```yaml\n   spring:\n     cloud:\n       azure:\n         credential:\n           managed-identity-enabled: true\n     jms:\n       servicebus:\n         namespace: ${AZURE_SERVICEBUS_NAMESPACE}\n         pricing-tier: ${PRICING_TIER}\n         passwordless-enabled: true\n   ```\n\n   > [!IMPORTANT]\n   > If you're using user-assigned managed identity, also need to add the property `spring.cloud.azure.credential.client-id` with your user-assigned managed identity client ID.\n\n### Connect to Azure Service Bus JMS using connection string\n\nAdd the following properties and you're good to go.\n\n```yaml\nspring:\n  jms:\n    servicebus:\n      connection-string: ${AZURE_SERVICEBUS_CONNECTION_STRING}\n      pricing-tier: ${PRICING_TIER}\n```\n\n[!INCLUDE [security-note](../includes/security-note.md)]\n\n## Connections\n\nSpring Cloud Azure provides the following three Connection Factory options for connecting to Azure Service Bus JMS:\n\n- `JmsPoolConnectionFactory`: This factory maintains a connection pool with customizable options like `spring.jms.servicebus.pool.max-connections`. More pool configuration settings - prefixed with `spring.jms.servicebus.pool.` - are detailed in the [Configuration](#configuration) section. This setup enhances performance by using Azure Service Bus's load-balancing capability, distributing traffic across multiple endpoints.\n\n- `CachingConnectionFactory`: This factory reuses a single connection for all calls to `JmsTemplate`, reducing the overhead of connection creation, which is ideal for low-traffic scenarios. However, this mode doesn't use Azure Service Bus's load-balancing capability.\n\n- `ServiceBusJmsConnectionFactory`: In this mode, each call to `JmsTemplate` creates a new connection, which can be resource-intensive and less efficient.\n\nWhen all the three classes exist in the classpath, which one is used? The following table describes which is used based on configuration properties (since Spring Cloud Azure **7.2.0** and **6.2.0**):\n\n> [!div class=\"mx-tdBreakAll\"]\n> | `spring.jms.servicebus.pool.enabled` | `spring.jms.cache.enabled` | Sender `ConnectionFactory`       | Listener Container `ConnectionFactory` |\n> |--------------------------------------|----------------------------|----------------------------------|----------------------------------------|\n> | not set                              | not set                    | `CachingConnectionFactory`       | `ServiceBusJmsConnectionFactory`       |\n> | not set                              | `true`                     | `CachingConnectionFactory`       | `CachingConnectionFactory`             |\n> | not set                              | `false`                    | `ServiceBusJmsConnectionFactory` | `ServiceBusJmsConnectionFactory`       |\n> | `true`                               | not set                    | `JmsPoolConnectionFactory`       | `JmsPoolConnectionFactory`             |\n> | `true`                               | `true`                     | `CachingConnectionFactory`       | `CachingConnectionFactory`             |\n> | `true`                               | `false`                    | `JmsPoolConnectionFactory`       | `JmsPoolConnectionFactory`             |\n> | `false`                              | not set                    | `CachingConnectionFactory`       | `ServiceBusJmsConnectionFactory`       |\n> | `false`                              | `true`                     | `CachingConnectionFactory`       | `CachingConnectionFactory`             |\n> | `false`                              | `false`                    | `ServiceBusJmsConnectionFactory` | `ServiceBusJmsConnectionFactory`       |\n\n> [!NOTE]\n> The following table shows the default `ConnectionFactory` when both `spring.jms.servicebus.pool.enabled` and `spring.jms.cache.enabled` aren't set for different Spring Cloud Azure versions:\n>\n> [!div class=\"mx-tdBreakAll\"]\n> | Spring Cloud Azure version | Sender `ConnectionFactory`         | Listener container `ConnectionFactory` |\n> |----------------------------|------------------------------------|----------------------------------------|\n> | >= 6.2.0 or >= 7.2.0       | `CachingConnectionFactory`         | `ServiceBusJmsConnectionFactory`       |\n> | 6.1.0 and 7.0.0            | `ServiceBusJmsConnectionFactory`   | `ServiceBusJmsConnectionFactory`       |\n> | <= 6.1.0                   | `JmsPoolConnectionFactory`         | `JmsPoolConnectionFactory`             |\n\n\n## Samples\n\nFor more information, see the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/spring-jms-troubleshooting-guide.md",
    "content": "---\ntitle: Spring JMS troubleshooting guide\ndescription: Describes how to troubleshoot known issues and common errors when using Spring JMS.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Spring JMS troubleshooting guide\n\nThis article describes how to troubleshoot known issues and common errors when using Spring JMS. The article also answers some frequently asked questions for `spring-cloud-azure-starter-servicebus-jms`.\n\n## Connectivity issues\n\n### The MessageProducer was closed due to an unrecoverable error\n\n#### Problem description\n\nWhen using `JmsTemplate` to send messages, `JmsTemplate` becomes unavailable during an idle interval between 10 to 15 minutes. Sending messages in that interval can get the exceptions shown in the following example output:\n\n```output\n2022-11-06 11:12:05.762  INFO 25944 --- [   scheduling-1] c.e.demo.ServiceBusJMSMessageProducer    : Sending message: 2022-11-06T11:12:05.762072 message 1\n2022-11-06 11:12:05.772 ERROR 25944 --- [   scheduling-1] o.s.s.s.TaskUtils$LoggingErrorHandler    : Unexpected error occurred in scheduled task\n\norg.springframework.jms.IllegalStateException: The MessageProducer was closed due to an unrecoverable error.; nested exception is javax.jms.IllegalStateException: The MessageProducer was closed due to an unrecoverable error.\n    at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:274) ~[spring-jms-5.3.23.jar:5.3.23]\n  ...\nCaused by: org.apache.qpid.jms.provider.ProviderException: The link 'G0:36906660:qpid-jms:sender:azure:5caf3ef4-9602-413c-964d-cf1292d6e1f5:1:1:1:t4' is force detached. Code: publisher(link376). Details: AmqpMessagePublisher.IdleTimerExpired: Idle timeout: 00:10:00. [condition = amqp:link:detach-forced]\n    at org.apache.qpid.jms.provider.amqp.AmqpSupport.convertToNonFatalException(AmqpSupport.java:181) ~[qpid-jms-client-0.53.0.jar:na]\n  ...\n```\n\n#### Cause analysis\n\nThe exceptions occur for [Azure Service Bus](/azure/service-bus-messaging/service-bus-amqp-troubleshoot) when the AMQP connection and link are active but no calls - for example, send or receive calls - are made using the link for 10 minutes. In this case, the link is closed. And when all links in the connection have been closed because there was no activity (idle) and a new link hasn't been created in 5 minutes, the connection is closed.\n\nFor the Service Bus JMS starter, the [CachingConnectionFactory](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jms/connection/CachingConnectionFactory.html) is used by default, which caches the session, producer, and consumer. When the `JmsProducer` is idle for more than 10 minutes but less than 15, the link that the cached producer is occupying has been closed. Messages can't be sent out during this interval. Then, after another 5 minutes idle, the whole connection is closed. Thus, any sending operation after the 15 minute idle interval causes the `CachingConnectionFactory` to create a new connection to send. The sending operation becomes available after 15 minutes.\n\n#### Workaround\n\nCurrently, the starter provides a workaround for the link-detach issue by applying the `JmsPoolConnectionFactory`, which pools `Connection`, `Session`, and `MessageProducer`, and manages the lifecycle of the pooled instances. This workaround can ensure that a producer is evicted after being unavailable and hence all sending operations are performed on active producers.\n\nTo use this workaround, add the following configuration:\n\n```yaml\nspring:\n  jms:\n    servicebus:\n      pool:\n        enabled: true\n        max-connections: ${your-expected-max-connection-value}\n```\n\n### Usage of `spring.jms.servicebus.idle-timeout`\n\nThe idle-timeout properties configure the [idle timeout](http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-transport-v1.0-os.html#doc-doc-idle-time-out) of an AMQP connection. The AMQP spec provides the following description:\n\n> Connections are subject to an idle timeout threshold. The timeout is triggered by a local peer when no frames are received after a threshold value is exceeded. The idle timeout is measured in milliseconds, and starts from the time the last frame is received. If the threshold is exceeded, then a peer SHOULD try to gracefully close the connection using a close frame with an error explaining why. If the remote peer does not respond gracefully within a threshold to this, then the peer MAY close the TCP socket.\n\nFor a JMS client, when you configure this property, you control on the server side how long you expect the server to send an empty frame to keep a connection alive when no messages are delivered. This property controls the remote peer's behavior, and each peer can have its own, isolated value.\n\n## JmsTemplate issues\n\n### Scheduled messages\n\nAzure Service Bus supports delayed message processing. For more information, see the [Scheduled messages](/azure/service-bus-messaging/message-sequencing#scheduled-messages) section of [Message sequencing and timestamps](/azure/service-bus-messaging/message-sequencing). For JMS, to schedule a message, set the `ScheduledEnqueueTimeUtc` property by using the message annotation header `x-opt-scheduled-enqueue-time`.\n\n## JmsListener issues\n\n### Too many requests are sent to Service Bus even though there are no messages in the server\n\n#### Problem description\n\nWhen using the `@JmsListener` API, in some cases you can see in the Azure portal that there are ongoing values for incoming requests sent to their queue or topics even if there are no messages in the server to receive.\n\n#### Cause analysis\n\n`@JmsListener` is a polling listener, which is built for repeated polling attempts.\n\nThe listener sits on an ongoing polling loop. Each loop calls the JMS `MessageConsumer.receive()` method to poll the local consumer for messages to consume. By default, for each poll operation, the local consumer sends pull requests to the message broker to ask for messages and then blocks for a certain period of time. The concrete polling process is decided by several properties, including `receiveTimeout`, `prefetchSize`, and `receiveLocalOnly` or `receiveNoWaitLocalOnly`. The `receiveNoWaitLocalOnly` method is used only when you set `receiveTimeout` to a negative value.\n\nWhen this problem happens to your application, check the following configuration settings:\n\n- Determine whether your prefetch policy is 0, which is also the default option. 0-prefetch means a pull consumer that sends pull requests to the Service Bus for each poll.\n\n- If you've configured non-zero prefetch, determine whether your `receiveLocalOnly` or `receiveNoWaitLocalOnly` property is set to `false`, which is the default option. A `false` value here still results in sending pull requests to the server because it doesn't only poll the local consumer.\n\n- The `receiveTimeout` configuration determines how long it blocks for each pull request, so it can affect the frequency of pull requests sending to the server. The default value is 1 second.\n\nFor a complete analysis, see the discussion in the [GitHub issue](https://github.com/Azure/azure-sdk-for-java/issues/30192#issuecomment-1362458734).\n\n#### Solutions\n\nThe following sections describe two solutions for dealing with this issue\n\n##### Solution 1. Change to push consumer and local-check only\n\nBy changing the mode to `push`, the consumer becomes an [Asynchronous Notification](http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-transport-v1.0-os.html#doc-idp424576) consumer that doesn't pull messages from the broker, but maintains a target amount of link credit. The amount is decided by a prefetch property. As the Service Bus (sender) pushes messages, the sender's link-credit decreases, and when the sender's link-credit falls below a threshold, the client (receiver) sends a request to the server to increase the sender's link-credit back to the desired target amount.\n\nTo accomplish this solution, add the following configuration:\n\nFirst, configure the `prefetch` number as non-zero, which configures the consumer as non-pull. The following table shows several prefetch properties, each of which controls different Service Bus entities. Set the properties that apply to your case.\n\n| Property                                                | Description                                                              |\n|---------------------------------------------------------|--------------------------------------------------------------------------|\n| `spring.jms.servicebus.prefetch.all`                    | The fallback value for the prefetch option in this Service Bus namespace |\n| `spring.jms.servicebus.prefetch.queue-prefetch`         | The prefetch number for the queue.                                       |\n| `spring.jms.servicebus.prefetch.queue-browser-prefetch` | The prefetch number for the queue browser.                               |\n| `spring.jms.servicebus.prefetch.topic-prefetch`         | The prefetch number for the topic.                                       |\n| `spring.jms.servicebus.prefetch.durable-topic-prefetch` | The prefetch number for the durable topic.                               |\n\nSecond, configure the `non-local-check` by adding a configuration class for the factory customizer, as shown in the following example:\n\n```java\n@Configuration(proxyBeanMethods = false)\npublic class CustomJmsConfiguration {\n\n    @Bean\n    ServiceBusJmsConnectionFactoryCustomizer customizer() {\n        return factory -> {\n            factory.setReceiveLocalOnly(true);\n            // Configure the below ReceiveNoWaitLocalOnly instead if you have specified the property \n            // spring.jms.listener.receive-timeout with negative value. Otherwise, configure the above `ReceiveLocalOnly`.\n            //factory.setReceiveNoWaitLocalOnly(true);\n        };\n    }\n}\n```\n\nThe prefetch value can affect how fast messages are dispatched to the consumer's local buffer. You should adjust the value according to your consuming performance and message volumes. A suitable value can speed up the consuming process, while a value that's too large can cause the locally buffered messages to become outdated and dispatched again. For low message volumes, where each message takes a long time to process, set the prefetch to 1. This value ensures that a consumer is only processing one message at a time.\n\n##### Solution 2. Increase the receive timeout to decrease the pull frequency\n\nThe receive timeout property determines the strategy for how long the consumer blocks to wait for a pull result. So, by extending the timeout, you can reduce the pulling frequency, then reduce the number of pull requests when you choose pull mode. In extreme cases, you can set the strategy for waiting indefinitely until a message arrives, which means the consumer only pulls after consuming a message. In this case, when there are no messages in the server, it will block for waiting.\n\nTo accomplish this solution, configure the `spring.jms.listener.receive-timeout` property. This property is of type `java.time.Duration` and has a default value of 1 second. The following list explains the effect of various values:\n\n- Setting the receive-timeout to 0 means that the pull blocks indefinite until a message is dispatched.\n- Setting the receive-timeout to a positive value means that the pull blocks up to the timeout amount of time.\n- Setting the receive-timeout to a negative value means that the pull is a no-wait receive, which means it returns a message immediately, or `null` if no messages are available.\n\n> [!NOTE]\n> A high timeout value can bring some side effects. For example, a high timeout value will also extend the time that the main thread is in a block status. This status means the container will be less responsive to `stop()` calls, and can only stop between `receive()` calls.\n\nAlso, the container can only send requests after the `receive-timeout` interval has passed. If the interval is longer than 10 minutes, Service Bus will close the link and prevent the listener from sending or receiving. For more information, see the [Link is closed](/azure/service-bus-messaging/service-bus-amqp-troubleshoot#link-is-closed) section of [AMQP errors in Azure Service Bus](/azure/service-bus-messaging/service-bus-amqp-troubleshoot). By default, the listener uses a [CachingConnectionFactory](https://github.com/Azure/azure-sdk-for-java/blob/spring-cloud-azure-starter-servicebus-jms_4.5.0/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/ServiceBusJmsConnectionFactoryConfiguration.java#L52).\n\nIf you require a high receive-timeout, be sure to use the [JmsPoolConnectionFactory](https://github.com/Azure/azure-sdk-for-java/blob/spring-cloud-azure-starter-servicebus-jms_4.5.0/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/ServiceBusJmsConnectionFactoryConfiguration.java).\n\nFor more information about the link-close issue and how to use `JmsPoolConnectionFactory`, see the [The MessageProducer was closed due to an unrecoverable error](#the-messageproducer-was-closed-due-to-an-unrecoverable-error) section.\n\n### Prefetch issue\n\n#### Problem description\n\nAn unsuitable prefetch policy can cause the following problems:\n\n- The same messages are repeatedly consumed.\n- Messages are put in the dead letter queue after `MaxDeliveryCountExceeded`, even when messages are processed without error or exception.\n\n#### Cause analysis\n\nThis issue usually happens when the [`prefetch`](/azure/service-bus-messaging/service-bus-prefetch?tabs=java) value is higher than the actual consuming capacity, with the effect that too many messages are prefetched to the local buffer waiting to be consumed. However, the prefetched messages are viewed as dispatched in a [`peek-lock`](/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock) mode from the Service Bus side. Each dispatched message has a [`max-delivery-count`](/azure/service-bus-messaging/service-bus-dead-letter-queues#maximum-delivery-count) and `lock-duration` attributes. In the `peek-lock` receive mode, messages fetched into the prefetch buffer are acquired into the buffer in a locked state, with the timeout clock for the lock ticking. If the prefetch buffer is large, and processing takes so long that message locks expire while staying in the prefetch buffer, the message is treated as abandoned and is again made available for retrieval from the queue.\n\nThis issue might cause the message to be fetched into the prefetch buffer and placed at the end. If the prefetch buffer isn't processed before message expiration, messages are repeatedly prefetched but never effectively delivered in a usable (validly locked) state. Then, when those outdated copies are dequeued, the application then consumes the same message repeatedly and isn't able to complete them. In another case, repeated messages are all expired in the buffer before being consumed. In this case, the message in the Service Bus will eventually be moved to the dead-letter queue after the maximum delivery count is exceeded.\n\nFor more information, see the [Why is Prefetch not the default option?](/azure/service-bus-messaging/service-bus-prefetch?tabs=java#why-is-prefetch-not-the-default-option) section of [Prefetch Azure Service Bus messages](/azure/service-bus-messaging/service-bus-prefetch?tabs=java).\n\n#### Solution\n\nBe careful with the configuration of the prefetch to ensure that it fits the consuming capability. You must balance the maximum prefetch count and the lock duration configured on the queue or subscription such that the lock timeout at least exceeds the cumulative expected message processing time for the maximum size of the prefetch buffer, plus one message. At the same time, the lock timeout shouldn't be so long that messages can exceed their maximum time to live when they're accidentally dropped, thereby requiring their lock to expire before being redelivered.\n\nTo configure the prefetch attribute, which has a default value of zero, use one of the following properties:\n\n| Property                                                | Description                                                               |\n|---------------------------------------------------------|---------------------------------------------------------------------------|\n| `spring.jms.servicebus.prefetch.all`                    | The fallback value for the prefetch option in this Service Bus namespace. |\n| `spring.jms.servicebus.prefetch.queue-prefetch`         | The prefetch number for the queue.                                        |\n| `spring.jms.servicebus.prefetch.queue-browser-prefetch` | The prefetch number for the queue browser.                                |\n| `spring.jms.servicebus.prefetch.topic-prefetch`         | The prefetch number for the topic.                                        |\n| `spring.jms.servicebus.prefetch.durable-topic-prefetch` | The prefetch number for the durable topic.                                |\n\n### How to perform AMQP disposition to Service Bus?\n\nJMS supports five AMQP disposition types when acknowledging messages to the messaging broker. The supported values are `ACCEPTED`, `REJECTED`, `RELEASED`, `MODIFIED_FAILED`, and `MODIFIED_FAILED_UNDELIVERABLE`. For more information, see the [AMQP disposition and Service Bus operation mapping](/azure/service-bus-messaging/service-bus-java-how-to-use-jms-api-amqp#amqp-disposition-and-service-bus-operation-mapping) section of [Use Java Message Service 1.1 with Azure Service Bus standard and AMQP 1.0](/azure/service-bus-messaging/service-bus-java-how-to-use-jms-api-amqp).\n\nSo, to manually complete, abandon, dead-letter, defer, or release a message using `JmsListener`, use the following steps:\n\n1. Disable session-transacted and use CLIENT ack mode.\n\n   To accomplish this task, either declare your own [JmsListenerContainerFactory](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jms/config/JmsListenerContainerFactory.html) bean and then set the properties, or post process the `JmsListenerContainerFactory` defined in the [starter](https://github.com/Azure/azure-sdk-for-java/blob/spring-cloud-azure-starter-servicebus-jms_4.5.0/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/ServiceBusJmsContainerConfiguration.java). The following example uses the approach of declaring another bean:\n\n   ```java\n   @Configuration(proxyBeanMethods = false)\n   public class CustomJmsConfiguration {\n   \n       @Bean\n       public JmsListenerContainerFactory<?> customQueueJmsListenerContainerFactory(\n               DefaultJmsListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {\n           DefaultJmsListenerContainerFactory jmsListenerContainerFactory = new DefaultJmsListenerContainerFactory();\n           configurer.configure(jmsListenerContainerFactory, connectionFactory);\n           jmsListenerContainerFactory.setPubSubDomain(Boolean.FALSE);\n           jmsListenerContainerFactory.setSessionTransacted(Boolean.FALSE);\n           jmsListenerContainerFactory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);\n           return jmsListenerContainerFactory;\n       }\n   }\n   ```\n\n1. In your message handler, explicitly complete or abandon messages.\n\n   ```java\n   @JmsListener(destination = \"QUEUE_NAME\", containerFactory = \"customQueueJmsListenerContainerFactory\")\n   public void receiveMessage(JmsTextMessage message) throws Exception {\n       String event = message.getBody(String.class);\n       try {\n           logger.info(\"Received event: {}\", event);\n           logger.info(\"Received message: {}\", message);\n           // by default complete the message\n           message.acknowledge();\n       } catch (Exception e) {\n           logger.error(\"Exception while processing re-source event: \" + event, e);\n           JmsAcknowledgeCallback acknowledgeCallback = message.getAcknowledgeCallback();\n           // explicitly abandon the message\n           acknowledgeCallback.setAckType(MODIFIED_FAILED);\n           message.setAcknowledgeCallback(acknowledgeCallback);\n           message.acknowledge();\n           throw e;\n       }\n   }\n   ```\n\n## Configuration issues\n\n### Disable Service Bus JMS autoconfiguration\n\n#### Problem description\n\nSome users import some Spring Cloud Azure Starter for the autoconfiguration of an Azure service other than Service Bus JMS. They also use the Spring JMS framework without the need of Service Bus JMS. Then, when the application tries to start, the following exceptions are thrown:\n\n```output\nCaused by: java.lang.IllegalArgumentException: 'spring.jms.servicebus.connection-string' should be provided\n    at com.azure.spring.cloud.autoconfigure.jms.properties.AzureServiceBusJmsProperties.afterPropertiesSet(AzureServiceBusJmsProperties.java:210)\n    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)\n    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)\n    ... 98 more\n```\n\n#### Cause analysis\n\nThis problem occurs because all of the Spring Cloud Azure autoconfiguration classes are placed into the same module, so any Spring Cloud Azure Starter actually imports all of that autoconfiguration, which also includes Service Bus JMS. Then, when the application uses the Spring JMS API, it meets the condition of [Service Bus JMS autoconfiguration](https://github.com/Azure/azure-sdk-for-java/blob/spring-cloud-azure-starter-servicebus-jms_4.5.0/sdk/spring/spring-cloud-azure-autoconfigure/src/main/java/com/azure/spring/cloud/autoconfigure/jms/ServiceBusJmsAutoConfiguration.java) and triggers it. Then, for users who don't intend to use `spring-cloud-azure-starter-servicebus-jms`, the property conditions aren't met because there's no reason for them to configure Service Bus for JMS. This situation causes the exceptions to be thrown.\n\n#### Solution\n\nSpring Cloud Azure for Service Bus JMS provides a property to switch on or off its autoconfiguration. You can choose to disable this functionality as needed by using the following property setting:\n\n```properties\nspring.jms.servicebus.enabled=false\n```\n\n### Configure message attributes\n\n#### How to set the content type of outbound messages?\n\nTo configure the content type, customize the Message Converter to modify the content-type attribute when converting messages. The following code takes byte messages as an example.\n\nFirst, customize the message converter to be used in the `JmsTemplate`, as shown in the following example:\n\n```java\npublic class CustomMappingJackson2MessageConverter extends MappingJackson2MessageConverter {\n\n    public static final String CONTENT_TYPE = \"application/json\";\n\n    public CustomMappingJackson2MessageConverter() {\n        this.setTargetType(MessageType.BYTES);\n    }\n\n    @Override\n    protected BytesMessage mapToBytesMessage(Object object, Session session, ObjectWriter objectWriter)\n            throws JMSException, IOException {\n        final BytesMessage message = super.mapToBytesMessage(object, session, objectWriter);\n        JmsBytesMessage msg = (JmsBytesMessage) message;\n        AmqpJmsMessageFacade facade = (AmqpJmsMessageFacade) msg.getFacade();\n        facade.setContentType(Symbol.valueOf(CONTENT_TYPE));\n        return msg;\n    }\n}\n```\n\nThen, declare your customized message converter bean, as shown in this example:\n\n```java\n@Configuration(proxyBeanMethods = false)\npublic class CustomJmsConfiguration {\n\n    @Bean\n    public MessageConverter messageConverter() {\n        return new CustomMappingJackson2MessageConverter();\n    }\n}\n```\n\n#### How to set type ID property name for MappingJackson2MessageConverter?\n\nThe `type-id-property-name` attribute enables the `MappingJackson2MessageConverter` to determine which class to use to deserialize the message payload. When serializing each Java object to a Spring Message payload, the converter stores the payload type into a message property with the property name recorded by `type-id-property-name`. Then, when deserializing the message, the converter reads the type ID from the message and performs deserialization.\n\nTo set the `type-id-property-name`, declare your own `MappingJackson2MessageConverter` bean and configure that property, as shown in the following example:\n\n```java\n@Configuration(proxyBeanMethods = false)\npublic class CustomJmsConfiguration {\n\n    @Bean\n    public MessageConverter jacksonJmsMessageConverter()\n    {\n        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();\n        converter.setTypeIdPropertyName(\"your-custom-type-id-property-name\");\n        return converter;\n    }\n}\n```\n\n## Duplicate detection\n\nAzure Service Bus supports [duplicate detection](/azure/service-bus-messaging/duplicate-detection), which applies the `MessageId` property to uniquely identify messages and discard the duplicates sent to Service Bus.\n\nHowever, for the JMS API, you shouldn't set the JMS message ID, which is regarded as [illegal](https://docs.oracle.com/javaee/7/api/javax/jms/Message.html#setJMSMessageID-java.lang.String-) in JMS specs. So, this feature isn't currently supported for Spring Cloud Azure Service Bus JMS Starter.\n\nFor any further updates for this feature, see the GitHub [issue](https://github.com/Azure/azure-sdk-for-java/issues/30058).\n\n## Enable AMQP transport logging\n\nFor more information, see the [enable AMQP transport logging](https://github.com/Azure/azure-sdk-for-java/blob/spring-cloud-azure-starter-servicebus-jms_4.5.0/sdk/servicebus/azure-messaging-servicebus/TROUBLESHOOTING.md#enable-amqp-transport-logging) section of [Troubleshooting Service Bus issues](https://github.com/Azure/azure-sdk-for-java/blob/spring-cloud-azure-starter-servicebus-jms_4.5.0/sdk/servicebus/azure-messaging-servicebus/TROUBLESHOOTING.md).\n\n## Get additional help\n\nFor more information on ways to reach out for support, see [Support](https://github.com/Azure/azure-sdk-for-java/blob/main/SUPPORT.md) at the repo's root.\n\n### Resources for Spring Cloud Azure Service Bus JMS starter\n\n- [Use Azure Service Bus with JMS](spring-jms-support.md)\n- [Use JMS in Spring to access Azure Service Bus](configure-spring-boot-starter-java-app-with-azure-service-bus.md)\n- [Migration guide for Spring Cloud Azure 4.0](migration-guide-for-4.0.md)\n- [Sample](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus/spring-cloud-azure-starter-servicebus-jms)\n\n### Filing GitHub issues\n\nWhen filing GitHub issues, the following details are requested:\n\n- Service Bus configuration / Namespace environment\n  - What tier is the namespace (standard or premium)?\n  - What type of messaging entity is being used (queue or topic)? and its configuration.\n  - What is the average size of each Message?\n- What is the traffic pattern like? (that is, the number messages per minute and whether the Client is always busy or has slow traffic periods.)\n- Repro code and steps\n  - This is important as we often can't reproduce the issue in our environment.\n- Logs\n"
  },
  {
    "path": "articles/java/spring-framework/spring-messaging-event-hubs-support.md",
    "content": "---\ntitle: Spring Cloud Azure support for Spring Messaging Azure Event Hubs\ndescription: Spring Cloud Azure support for Spring Messaging Azure Event Hubs provides integration with Azure Event Hubs.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure support for Spring Messaging Azure Event Hubs\n\nThis article describes how you can use Spring Cloud Azure and Spring Messaging Azure Event Hubs. The Spring Framework provides extensive support for integrating with messaging systems.\n\n## Spring Messaging Azure Event Hubs\n\n### Key concepts\n\nAzure Event Hubs is a native data-streaming service in the cloud that can stream millions of events per second, with low latency, from any source to any destination. The Spring Messaging for Azure Event Hubs project applies core Spring concepts to the development of event hubs-based messaging solutions. It provides a *template* as a high-level abstraction for sending messages. It also provides support for message-driven plain old Java objects (POJOs) with `@EventHubsListener` annotations and a *listener container*. These libraries promote the use of dependency injection and declarative configuration. In all of these cases, you can see similarities to the JMS support in the Spring Framework and RabbitMQ support in Spring AMQP.\n\n### Dependency setup\n\n```xml\n<dependency>\n  <groupId>com.azure.spring</groupId>\n  <artifactId>spring-cloud-azure-starter</artifactId>\n</dependency>\n<dependency>\n  <groupId>com.azure.spring</groupId>\n  <artifactId>spring-messaging-azure-eventhubs</artifactId>\n</dependency>\n<dependency>\n  <groupId>com.azure</groupId>\n  <artifactId>azure-messaging-eventhubs-checkpointstore-blob</artifactId>\n</dependency>\n```\n\n### Configuration\n\nThe library provides the following configuration options for `EventHubsTemplate` and `@EventHubsListener`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                                   | Type    | Description                                                                                                        |\n> |----------------------------------------------------------------------------|---------|--------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.message-converter.isolated-object-mapper`            | boolean | Whether an isolated ObjectMapper bean is used for Event Hubs message converter. Enabled by default.                |\n> | `spring.cloud.azure.eventhubs.enabled`                                   | boolean | Whether an Azure Event Hubs is enabled.                                                                            |\n> | `spring.cloud.azure.eventhubs.connection-string`                         | String  | Event Hubs Namespace connection string value.                                                                      |\n> | `spring.cloud.azure.eventhubs.namespace`                                 | String  | Event Hubs Namespace value, which is the prefix of the FQDN. A FQDN should be composed of NamespaceName.DomainName |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name`   | String  | Name for the storage account.                                                                                      |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.account-key`    | String  | Storage account access key.                                                                                        |\n> | `spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name` | String  | Storage container name.                                                                                            |\n\n### Basic usage\n\n#### Custom Event Hubs message converter\n\nThere are two ways to configure Event Hubs message converter:\n\n- Configure the following property to have the default Event Hubs message converter use a `ObjectMapper` bean, which can be your custom `ObjectMapper` bean or one managed by Spring Boot:\n\n  ```yaml\n  spring:\n    cloud:\n      azure:\n        message-converter:\n          isolated-object-mapper: false\n  ```\n\n- Define the Event Hubs message converter bean directly:\n\n  ```java\n  @Bean\n  AzureMessageConverter<EventData, EventData> eventHubsMessageConverter() {\n      JsonMapper jsonMapper = JsonMapper.builder().addModule(new JavaTimeModule()).build();\n      return new EventHubsMessageConverter(jsonMapper);\n  }\n  ```\n\n#### Send messages to Azure Event Hubs\n\nUse the following steps to send messages:\n\n1. Fill in the credential configuration options using one of the following approaches:\n\n    * For credentials as `DefaultAzureCredential`, configure the following properties in your **application.yml** file:\n\n      ```yaml\n      spring:\n        cloud:\n          azure:\n            eventhubs:\n              namespace: ${AZURE_EVENT_HUBS_NAMESPACE}\n              processor:\n                checkpoint-store:\n                  container-name: ${CHECKPOINT-CONTAINER}\n                  account-name: ${CHECKPOINT-STORAGE-ACCOUNT}\n      ```\n\n    * For credentials as connection string, configure the following properties in your **application.yml** file:\n\n      ```yaml\n      spring:\n        cloud:\n          azure:\n            eventhubs:\n              connection-string: ${AZURE_EVENT_HUBS_CONNECTION_STRING}\n              processor:\n                checkpoint-store:\n                  container-name: ${CHECKPOINT-CONTAINER}\n                  account-name: ${CHECKPOINT-STORAGE-ACCOUNT}\n                  account-key: ${CHECKPOINT-ACCESS-KEY}\n      ```\n\n    * For credentials as managed identities, configure the following properties in your **application.yml** file:\n\n      ```yaml\n      spring:\n        cloud:\n          azure:\n            credential:\n              managed-identity-enabled: true\n              client-id: ${AZURE_CLIENT_ID}\n            eventhubs:\n              namespace: ${AZURE_EVENT_HUBS_NAMESPACE}\n              processor:\n                checkpoint-store:\n                  container-name: ${CONTAINER_NAME}\n                  account-name: ${ACCOUNT_NAME}\n      ```\n\n    * For credentials as service principal, configure the following properties in your **application.yml** file:\n\n      ```yaml\n      spring:\n        cloud:\n          azure:\n            credential:\n              client-id: ${AZURE_CLIENT_ID}\n              client-secret: ${AZURE_CLIENT_SECRET}\n            profile:\n              tenant-id: <tenant>\n            eventhubs:\n              namespace: ${AZURE_EVENT_HUBS_NAMESPACE}\n              processor:\n                checkpoint-store:\n                  container-name: ${CONTAINER_NAME}\n                  account-name: ${ACCOUNT_NAME}\n      ```\n\n> [!NOTE]\n> The following values are allowed for `tenant-id`: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n1. `EventHubsTemplate` is autoconfigured, and you can autowire it directly into your own beans, as shown in the following example:\n\n   ```java\n   @Component\n   public class MyBean {\n   \n       private final EventHubsTemplate eventHubsTemplate;\n       \n       public MyBean(EventHubsTemplate eventHubsTemplate) {\n           this.eventHubsTemplate = eventHubsTemplate;\n       }\n   \n       public void someMethod() {\n           this.eventHubsTemplate.sendAsync('EVENT_HUB_NAME', MessageBuilder.withPayload(\"Hello world\").build()).subscribe();\n       }\n   \n   }\n   ```\n\n#### Receive messages from Azure Event Hubs\n\nUse the following steps to receive messages:\n\n1. Fill in the credential configuration options.\n\n1. Add the `@EnableAzureMessaging` annotation, as shown in the following example. This annotation triggers the discovery of methods annotated with `@EventHubsListener`, creating the message listener container under the covers.\n\n   ```java\n   @SpringBootApplication\n   @EnableAzureMessaging\n   public class DemoApplication {\n       public static void main(String[] args) {\n           SpringApplication.run(DemoApplication.class, args);\n       }\n   }\n   ```\n\n   > [!NOTE]\n   > To avoid repetition, since version `5.21.0`, Spring Cloud Azure Auto-configure enabled annotation `@EnableAzureMessaging` automatically.\n\n1. When the Event Hubs infrastructure is present, you can annotate any bean with `@EventHubsListener` to create a listener endpoint. The following component creates a listener endpoint on the `EVENT_HUB_NAME` event hub and the `$Default` consumer group:\n\n   ```java\n   @Component\n   public class MyBean {\n\n       @EventHubsListener(destination = \"EVENT_HUB_NAME\", group = \"$Default\")\n       public void processMessage(String content) {\n           // ...\n       }\n\n   }\n   ```\n\n### Samples\n\nFor more information, see the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/eventhubs/spring-messaging-azure-eventhubs/eventhubs-spring-messaging) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/spring-messaging-service-bus-support.md",
    "content": "---\ntitle: Spring Cloud Azure support for Spring Messaging Azure Service Bus\ndescription: Spring Cloud Azure support for Spring Messaging Azure Service Bus provides integration with Azure Service Bus.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure support for Spring Messaging Azure Service Bus\n\nThis article describes how you can use Spring Cloud Azure and Spring Messaging Azure Service Bus. The Spring Framework provides extensive support for integrating with messaging systems.\n\n## Spring Messaging Azure Service Bus\n\n### Key concepts\n\nAzure Service Bus is a fully managed enterprise message broker with message queues and publish-subscribe topics. The Spring Messaging for Azure Service Bus project applies core Spring concepts to the development of service bus-based messaging solutions. It provides a *template* as a high-level abstraction for sending messages. It also provides support for message-driven POJOs with `@ServiceBusListener` annotations and a *listener container*. These libraries promote the use of dependency injection and declarative configuration. In all of these cases, you can see similarities to the JMS support in the Spring Framework and RabbitMQ support in Spring AMQP.\n\n### Dependency setup\n\n```xml\n<dependency>\n  <groupId>com.azure.spring</groupId>\n  <artifactId>spring-cloud-azure-starter</artifactId>\n</dependency>\n<dependency>\n  <groupId>com.azure.spring</groupId>\n  <artifactId>spring-messaging-azure-servicebus</artifactId>\n</dependency>\n```\n\n### Configuration\n\nThe library provides the following configuration options for `ServiceBusTemplate` and `@ServiceBusListener`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                         | Type    | Description                                                                                                         |\n> |------------------------------------------------------------------|---------|---------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.message-converter.isolated-object-mapper`  | boolean | Whether an isolated ObjectMapper bean is used for Service Bus message converter. Enabled by default.                |\n> | `spring.cloud.azure.servicebus.enabled`                        | boolean | Whether an Azure Service Bus is enabled.                                                                            |\n> | `spring.cloud.azure.servicebus.connection-string`              | String  | Service Bus Namespace connection string value.                                                                      |\n> | `spring.cloud.azure.servicebus.custom-endpoint-address`        | String  | The custom endpoint address to use when connecting to Service Bus.                                                  |\n> | `spring.cloud.azure.servicebus.namespace`                      | String  | Service Bus Namespace value, which is the prefix of the FQDN. A FQDN should be composed of NamespaceName.DomainName |\n> | `spring.cloud.azure.servicebus.entity-type`                    | String  | Entity type of an Azure Service Bus.                                                                                |\n\n### Basic usage\n\n#### Custom Service Bus message converter\n\nThere are two ways to configure Service Bus message converter:\n\n- Configure the following property to have the default Service Bus message converter use a `ObjectMapper` bean, which can be your custom `ObjectMapper` bean or one managed by Spring Boot:\n\n  ```yaml\n  spring:\n    cloud:\n      azure:\n        message-converter:\n          isolated-object-mapper: false\n  ```\n\n- Define the Service Bus message converter bean directly:\n\n  ```java\n  @Bean\n  AzureMessageConverter<ServiceBusReceivedMessage, ServiceBusMessage> serviceBusMessageConverter() {\n      JsonMapper jsonMapper = JsonMapper.builder().addModule(new JavaTimeModule()).build();\n      return new ServiceBusMessageConverter(jsonMapper);\n  }\n  ```\n\n#### Send messages to Azure Service Bus\n\nUse the following steps to send messages:\n\n1. Fill in the credential configuration options using one of the following approaches:\n\n   * For credentials as `DefaultAzureCredential`, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           servicebus:\n             namespace: ${AZURE_SERVICE_BUS_NAMESPACE}\n             entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}\n     ```\n\n   * For credentials as connection string, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           servicebus:\n             connection-string: ${AZURE_SERVICE_BUS_CONNECTION_STRING}\n             entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}\n     ```\n\n   * For credentials as managed identities, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             managed-identity-enabled: true\n             client-id: ${AZURE_CLIENT_ID}\n           profile:\n             tenant-id: <tenant>\n           servicebus:\n             namespace: ${AZURE_SERVICE_BUS_NAMESPACE}\n             entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}\n     ```\n\n> [!NOTE]\n> The following values are allowed for `tenant-id`: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n   * For credentials as service principal, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             client-id: ${AZURE_CLIENT_ID}\n             client-secret: ${AZURE_CLIENT_SECRET}\n           profile:\n             tenant-id: <tenant>\n           servicebus:\n             namespace: ${AZURE_SERVICE_BUS_NAMESPACE}\n             entity-type: ${AZURE_SERVICE_BUS_ENTITY_TYPE}\n     ```\n\n> [!NOTE]\n> The following values are allowed for `tenant-id`: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n1. `ServiceBusTemplate` is autoconfigured, and you can autowire it directly into your own beans, as shown in the following example:\n\n   ```java\n   @Component\n   public class MyBean {\n   \n       private final ServiceBusTemplate serviceBusTemplate;\n       \n       public MyBean(ServiceBusTemplate serviceBusTemplate) {\n           this.serviceBusTemplate = serviceBusTemplate;\n       }\n   \n       public void someMethod() {\n           this.serviceBusTemplate.sendAsync('QUEUE_NAME', MessageBuilder.withPayload(\"Hello world\").build()).subscribe();\n       }\n   \n   }\n   ```\n\n#### Receive messages from Azure Service Bus\n\nUse the following steps to receive messages:\n\n1. Fill in the credential configuration options.\n\n1. Add the `@EnableAzureMessaging` annotation, which triggers the discovery of methods annotated with `@ServiceBusListener`, creating the message listener container under the covers.\n\n   ```java\n   @SpringBootApplication\n   @EnableAzureMessaging\n   public class DemoApplication {\n       public static void main(String[] args) {\n           SpringApplication.run(DemoApplication.class, args);\n       }\n   }\n   ```\n\n   > [!NOTE]\n   > To avoid repetition, since version `5.21.0`, Spring Cloud Azure Auto-configure enabled annotation `@EnableAzureMessaging` automatically.\n   \n1. When the ServiceBus infrastructure is present, you can annotate any bean with `@ServiceBusListener` to create a listener endpoint. The following component creates a listener endpoint on the `QUEUE_NAME` queue:\n\n   ```java\n   @Component\n   public class MyBean {\n\n       @ServiceBusListener(destination = \"QUEUE_NAME\")\n       public void processMessage(String content) {\n           // ...\n       }\n\n   }\n   ```\n\n#### Customize Service Bus client properties\n\nDevelopers can use `AzureServiceClientBuilderCustomizer` to customize Service Bus Client properties. The following example customizes the `sessionIdleTimeout` property in `ServiceBusClientBuilder`:\n\n```java\n@Bean\npublic AzureServiceClientBuilderCustomizer<ServiceBusClientBuilder.ServiceBusSessionProcessorClientBuilder> customizeBuilder() {\n    return builder -> builder.sessionIdleTimeout(Duration.ofSeconds(10));\n}\n```\n\n### Samples\n\nFor more information, see the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus/spring-messaging-azure-servicebus/servicebus-spring-messaging) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/spring-messaging-storage-queue-support.md",
    "content": "---\ntitle: Spring Cloud Azure support for Spring Messaging Azure Storage Queue\ndescription: Spring Cloud Azure support for Spring Messaging Azure Storage Queue provides integration with Azure Storage Queue.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java, devx-track-extended-java\nappliesto:\n- ✅ Version 4.20.0\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure support for Spring Messaging Azure Storage Queue\n\nThis article describes how you can use Spring Cloud Azure and Spring Messaging Azure Storage Queue. The Spring Framework provides extensive support for integrating with messaging systems.\n\n## Spring Messaging Azure Storage Queue\n\n### Key concepts\n\nAzure Queue Storage is a service for storing large numbers of messages. You access messages from anywhere in the world via authenticated calls using HTTP or HTTPS. A queue message can be up to 64 KB in size. A queue can contain millions of messages, up to the total capacity limit of a storage account. Queues are commonly used to create a backlog of work to process asynchronously. The Spring Messaging for Azure Queue Storage project applies core Spring concepts to the development of service bus-based messaging solutions. It provides a *template* as a high-level abstraction for sending and receiving messages. These libraries promote the use of dependency injection and declarative configuration.\n\n### Dependency setup\n\n```xml\n<dependency>\n  <groupId>com.azure.spring</groupId>\n  <artifactId>spring-cloud-azure-starter</artifactId>\n</dependency>\n<dependency>\n  <groupId>com.azure.spring</groupId>\n  <artifactId>spring-messaging-azure-storage-queue</artifactId>\n</dependency>\n```\n\n### Configuration\n\nThe library provides the following configuration options for `StorageQueueTemplate`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Property                                                         | Type      | Description                                                                                             |\n> |------------------------------------------------------------------|-----------|---------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.message-converter.isolated-object-mapper`  | boolean   | Whether an isolated ObjectMapper bean is used for Storage Queue message converter. Enabled by default.  |\n> | `spring.cloud.azure.storage.queue.enabled`                     | boolean   | Whether an Azure Storage Queue is enabled.                                                              |\n> | `spring.cloud.azure.storage.queue.connection-string`           | String    | Storage Queue Namespace connection string value.                                                        |\n> | `spring.cloud.azure.storage.queue.accountName`                 | String    | Storage Queue account name.                                                                             |\n> | `spring.cloud.azure.storage.queue.accountKey`                  | String    | Storage Queue account key.                                                                              |\n\n### Basic usage\n\n#### Custom Storage Queue message converter\n\nThere are two ways to configure Storage Queue message converter:\n\n- Configure the following property to have the default Storage Queue message converter use a `ObjectMapper` bean, which can be your custom `ObjectMapper` bean or one managed by Spring Boot:\n\n  ```yaml\n  spring:\n    cloud:\n      azure:\n        message-converter:\n          isolated-object-mapper: false\n  ```\n\n- Define the Storage Queue message converter bean directly:\n\n  ```java\n  @Bean\n  AzureMessageConverter<QueueMessageItem, QueueMessageItem> storageQueueMessageConverter() {\n      JsonMapper jsonMapper = JsonMapper.builder().addModule(new JavaTimeModule()).build();\n      return new ServiceBusMessageConverter(jsonMapper);\n  }\n  ```\n\n#### Send and receive messages to Azure Storage Queue\n\nUse the following steps to send and receive messages:\n\n1. Fill in the credential configuration options using one of the following approaches:\n\n   * For credentials as `DefaultAzureCredential`, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           storage:\n             queue:\n               account-name: ${AZURE_STORAGE_QUEUE_ACCOUNT_NAME}\n     ```\n\n   * For credentials as connection string, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           storage:\n             queue:\n               connection-string: ${AZURE_STORAGE_QUEUE_CONNECTION_STRING}\n     ```\n\n   * For credentials as managed identities, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             managed-identity-enabled: true\n             client-id: ${AZURE_CLIENT_ID}\n           profile:\n             tenant-id: <tenant>\n           storage:\n             queue:\n               account-name: ${AZURE_STORAGE_QUEUE_ACCOUNT_NAME}\n     ```\n\n> [!NOTE]\n> The following values are allowed for `tenant-id`: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n   * For credentials as service principal, configure the following properties in your **application.yml** file:\n\n     ```yaml\n     spring:\n       cloud:\n         azure:\n           credential:\n             client-id: ${AZURE_CLIENT_ID}\n             client-secret: ${AZURE_CLIENT_SECRET}\n           profile:\n             tenant-id: <tenant>\n           storage:\n             queue:\n               account-name: ${AZURE_STORAGE_QUEUE_ACCOUNT_NAME}\n     ```\n\n> [!NOTE]\n> The following values are allowed for `tenant-id`: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n1. `StorageQueueTemplate` is autoconfigured. You can autowire it directly into your own beans to send or receive messages, as shown in the following example:\n\n   ```java\n   @Component\n   public class MyBean {\n\n       private final StorageQueueTemplate storageQueueTemplate;\n\n       public MyBean(StorageQueueTemplate storageQueueTemplate) {\n           this.storageQueueTemplate = storageQueueTemplate;\n       }\n\n       public void someMethod() {\n           this.serviceBusTemplate.sendAsync('STORAGE_QUEUE_NAME', MessageBuilder.withPayload(\"Hello world\").build()).subscribe();\n       }\n\n       public void processMessage() {\n           Message<?> message = storageQueueTemplate.receiveAsync('STORAGE_QUEUE_NAME', Duration.ofSeconds(30)).block();\n           // ...\n       }\n\n   }\n   ```\n\n### Samples\n\nFor more information, see the [`azure-spring-boot-samples`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/storage/spring-messaging-azure-storage-queue/storage-queue-spring-messaging) repository on GitHub.\n"
  },
  {
    "path": "articles/java/spring-framework/spring-security-support.md",
    "content": "---\ntitle: Spring Cloud Azure Spring Security support\ndescription: This article describes how Spring Cloud Azure and Spring Security can be used together.\nms.date: 08/19/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nappliesto:\n  - ✅ Version 4.20.0\n  - ✅ Version 5.25.0\n  - ✅ Version 6.2.0\n  - ✅ Version 7.2.0\nms.custom:\n  - devx-track-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Spring Cloud Azure support for Spring Security\n\nThis article describes how Spring Cloud Azure and Spring Security can be used together.\n\n<a name='spring-security-with-azure-active-directory'></a>\n\n## Spring Security with Microsoft Entra ID\n\nWhen you're building a web application, identity and access management will always be foundational pieces.\n\nAzure offers a great platform to democratize your application development journey, as it not only offers a cloud-base identity service, but also deep integration with the rest of the Azure ecosystem.\n\nSpring Security has made it easy to secure your Spring based applications with powerful abstractions and extensible interfaces. However, as powerful as the Spring framework can be, it isn't tailored to a specific identity provider.\n\nThe `spring-cloud-azure-starter-active-directory` provides the most optimal way to connect your web application to a Microsoft Entra ID (Microsoft Entra ID for short) tenant and protect your resource server with Microsoft Entra ID. It uses the Oauth 2.0 protocol to protect web applications and resource servers.\n\n### Accessing a web application\n\nThis scenario uses [The OAuth 2.0 authorization code grant](/azure/active-directory/develop/v2-oauth2-auth-code-flow) flow to log in a user with a Microsoft account.\n\n#### System Diagram\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/system-diagram-stand-alone-web-application.png\" alt-text=\"System diagram for a standalone web application.\" border=\"false\":::\n\n#### Create required resources in Azure\n\n1. Read [Quickstart: Register an application with the Microsoft identity platform](/azure/active-directory/develop/quickstart-register-app).\n\n1. Create an app registration. Get `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, and `AZURE_CLIENT_SECRET`.\n\n1. Set `redirect URI` to `APPLICATION_BASE_URI/login/oauth2/code/` - for example `http://localhost:8080/login/oauth2/code/`. The tailing `/` is required.\n\n#### Add required dependencies\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n    </dependency>\n    <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-oauth2-client</artifactId>\n    </dependency>\n</dependencies>\n```\n\n#### Add required properties\n\n```yaml\nspring:\n  cloud:\n    azure:\n      active-directory:\n        enabled: true\n        profile:\n          tenant-id: <tenant>\n        credential:\n          client-id: ${AZURE_CLIENT_ID}\n          client-secret: ${AZURE_CLIENT_SECRET}\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nNow, start your application and access your application through the browser. You'll be redirected into the Microsoft login page.\n\n#### Advanced usages\n\n##### Add extra security configurations\n\n###### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2LoginSecurityConfig {\n\n   /**\n    * Add configuration logic as needed.\n    */\n   @Bean\n   SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n       http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())\n           .authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());\n           // Do some custom configuration.\n       return http.build();\n   }\n}\n```\n\n###### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2LoginSecurityConfig {\n\n   /**\n    * Add configuration logic as needed.\n    */\n   @Bean\n   SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n       http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())\n               .and()\n           .authorizeHttpRequests()\n               .anyRequest().authenticated();\n           // Do some custom configuration.\n       return http.build();\n   }\n}\n```\n\n###### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {\n\n    /**\n     * Add configuration logic as needed.\n     */\n    @Override\n    protected void configure(HttpSecurity http) throws Exception {\n        super.configure(http);\n        http.authorizeRequests()\n                .anyRequest().authenticated();\n        // Do some custom configuration\n    }\n}\n```\n\n---\n\n###### Authorize access by app roles\n\nCreate required resources in Azure:\n\n* Read [Add app roles to your application and receive them in the token](/azure/active-directory/develop/howto-add-app-roles-in-azure-ad-apps).\n\n* Create an app role with the following parameters:\n\n  * Display name: Admin\n  * Allowed member types: Users/Groups\n  * Value: Admin\n  * Do you want to enable this app role: yes\n\n> [!NOTE]\n> If you want to use app role based access control, you can't put group names in the `role` claim. For more information, see the [Configuring groups optional claims](/azure/active-directory/develop/active-directory-optional-claims#configuring-groups-optional-claims) section of [Provide optional claims to your app](/azure/active-directory/develop/active-directory-optional-claims).\n\nProtect the specific method.\n\n```java\nclass Demo {\n   @GetMapping(\"Admin\")\n   @ResponseBody\n   @PreAuthorize(\"hasAuthority('APPROLE_Admin')\")\n   public String admin() {\n       return \"Admin message\";\n   }\n}\n```\n\n###### Authorize access by group name or group ID\n\nAdd related configuration properties.\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       enabled: true\n       user-group:\n         allowed-group-names: group1_name_1, group2_name_2\n         # 1. If allowed-group-ids == all, then all group ID will take effect.\n         # 2. If \"all\" is used, we should not configure other group ids.\n         # 3. \"all\" is only supported for allowed-group-ids, not supported for allowed-group-names.\n         allowed-group-ids: group_id_1, group_id_2\n```\n\nProtect the specific method.\n\n```java\n@Controller\npublic class RoleController {\n   @GetMapping(\"group1\")\n   @ResponseBody\n   @PreAuthorize(\"hasRole('ROLE_group1')\")\n   public String group1() {\n       return \"group1 message\";\n   }\n\n   @GetMapping(\"group2\")\n   @ResponseBody\n   @PreAuthorize(\"hasRole('ROLE_group2')\")\n   public String group2() {\n       return \"group2 message\";\n   }\n\n   @GetMapping(\"group1Id\")\n   @ResponseBody\n   @PreAuthorize(\"hasRole('ROLE_<group1-id>')\")\n   public String group1Id() {\n       return \"group1Id message\";\n   }\n\n   @GetMapping(\"group2Id\")\n   @ResponseBody\n   @PreAuthorize(\"hasRole('ROLE_<group2-id>')\")\n   public String group2Id() {\n       return \"group2Id message\";\n   }\n}\n```\n\n###### Use National Azure instead of Global Azure\n\nNow except global Azure cloud, Microsoft Entra ID is deployed in the following national clouds:\n\n* Azure Government\n\n* Azure China 21Vianet\n\n* Azure Germany\n\nHere's a sample using Azure China 21Vianet.\n\n```yaml\nspring:\n  cloud:\n    azure:\n      active-directory:\n        enabled: true\n        base-uri: https://login.partner.microsoftonline.cn\n        graph-base-uri: https://microsoftgraph.chinacloudapi.cn\n```\n\nFor more information, see [National cloud deployments](/graph/deployments).\n\n###### Configure redirect URI template\n\nDevelopers can customize the redirect-uri.\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/system-diagram-redirect-uri.png\" alt-text=\"System diagram for redirect URIs.\" border=\"false\":::\n\nAdd `redirect-uri-template` properties in your **application.yml** file.\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       enabled: true\n       redirect-uri-template: ${REDIRECT-URI-TEMPLATE}\n```\n\nUpdate `redirect-uri` in the Azure portal.\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/web-application-configuration-redirect-uri.png\" alt-text=\"Configure Redirect URI Template.\" lightbox=\"media/spring-cloud-azure/web-application-configuration-redirect-uri.png\":::\n\nAfter we set `redirect-uri-template`, we need to update the security builder:\n\n###### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2LoginSecurityConfig {\n\n    /**\n     * Add configuration logic as needed.\n     */\n    @Bean\n    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())\n            .oauth2Login(login -> login.loginProcessingUrl(\"${REDIRECT-URI-TEMPLATE}\"))\n            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n###### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2LoginSecurityConfig {\n\n    /**\n     * Add configuration logic as needed.\n     */\n    @Bean\n    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())\n                .and()\n            .oauth2Login()\n                .loginProcessingUrl(\"${REDIRECT-URI-TEMPLATE}\")\n                .and()\n            .authorizeHttpRequests()\n                .anyRequest().authenticated();\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n###### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class AadOAuth2LoginSecurityConfig extends AadWebSecurityConfigurerAdapter {\n    /**\n     * Add configuration logic as needed.\n     */\n    @Override\n    protected void configure(HttpSecurity http) throws Exception {\n        super.configure(http);\n        http.oauth2Login()\n                .loginProcessingUrl(\"${REDIRECT-URI-TEMPLATE}\")\n                .and()\n            .authorizeRequests()\n                .anyRequest().authenticated();\n    }\n}\n```\n\n---\n\n<a name='connecting-to-azure-ad-via-proxy'></a>\n\n###### Connecting to Microsoft Entra ID via proxy\n\nTo connect Microsoft Entra ID via proxy, provide a `RestTemplateCustomizer` bean like the one shown in the following example: \n\n```java\n@Configuration\nclass DemoConfiguration {\n    @Bean\n    public RestTemplateCustomizer proxyRestTemplateCustomizer() {\n        return (RestTemplate restTemplate) -> {\n            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));\n            SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();\n            requestFactory.setProxy(proxy);\n            restTemplate.setRequestFactory(requestFactory);\n        };\n    }\n}\n```\n\n#### Samples\n\nSample project: [`aad-web-application`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory/web-client-access-resource-server/aad-web-application).\n\n### Web application accessing resource servers\n\n#### System Diagram\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/system-diagram-web-application-visiting-resource-servers.png\" alt-text=\"System diagram for a web application accessing resource servers.\" border=\"false\":::\n\n#### Create Required Resources in Azure\n\n1. Read [Quickstart: Register an application with the Microsoft identity platform](/azure/active-directory/develop/quickstart-register-app).\n\n1. Create an app registration. Get `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, and `AZURE_CLIENT_SECRET`.\n\n1. Set `redirect URI` to `APPLICATION_BASE_URI/login/oauth2/code/`, for example `http://localhost:8080/login/oauth2/code/`. The tailing `/` is required.\n\n#### Add required dependencies\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n    </dependency>\n    <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-oauth2-client</artifactId>\n    </dependency>\n</dependencies>\n```\n\n#### Add required properties\n\n```yaml\nspring:\n  cloud:\n    azure:\n      active-directory:\n        enabled: true\n        profile:\n          tenant-id: <tenant>\n        credential:\n          client-id: ${AZURE_CLIENT_ID}\n          client-secret: ${AZURE_CLIENT_SECRET}\n        authorization-clients:\n          graph:\n            scopes: https://graph.microsoft.com/Analytics.Read, email\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nHere, `graph` is the name of `OAuth2AuthorizedClient`, `scopes` means the scopes needed to consent when logging in.\n\n#### Use OAuth2AuthorizedClient in your application\n\n```java\npublic class Demo {\n    @GetMapping(\"/graph\")\n    @ResponseBody\n    public String graph(\n    @RegisteredOAuth2AuthorizedClient(\"graph\") OAuth2AuthorizedClient graphClient) {\n        // toJsonString() is just a demo.\n        // oAuth2AuthorizedClient contains access_token. We can use this access_token to access resource server.\n        return toJsonString(graphClient);\n    }\n}\n```\n\nNow, start your application and access your application in the browser. Then, you'll be redirected to the Microsoft login page.\n\n#### Advanced usages\n\n##### Client Credential Flow\n\nThe default flow is [authorization code flow](/azure/active-directory/develop/v2-oauth2-auth-code-flow), if you want to use [client credentials flow](/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow), you can configure like this:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      active-directory:\n        enabled: true\n        profile:\n          tenant-id: <tenant>\n        credential:\n          client-id: ${AZURE_CLIENT_ID}\n          client-secret: ${AZURE_CLIENT_SECRET}\n        authorization-clients:\n          graph:\n            authorization-grant-type: client_credentials # Change type to client_credentials\n            scopes: https://graph.microsoft.com/Analytics.Read, email\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n##### Access multiple resource servers\n\nIn one web application, you can access multiple resource servers by configuring like this:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      active-directory:\n        enabled: true\n        profile:\n          tenant-id: <tenant>\n        credential:\n          client-id: ${AZURE_CLIENT_ID}\n          client-secret: ${AZURE_CLIENT_SECRET}\n        authorization-clients:\n          resource-server-1:\n            scopes: # Scopes for resource-server-1\n          resource-server-2:\n            scopes: # Scopes for resource-server-2\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nThen you can use `OAuth2AuthorizedClient` in application like this\n\n```java\npublic class Demo {\n    @GetMapping(\"/resource-server-1\")\n    @ResponseBody\n    public String graph1(\n    @RegisteredOAuth2AuthorizedClient(\"resource-server-1\") OAuth2AuthorizedClient client) {\n        return callResourceServer1(client);\n    }\n\n    @GetMapping(\"/resource-server-2\")\n    @ResponseBody\n    public String graph2(\n    @RegisteredOAuth2AuthorizedClient(\"resource-server-2\") OAuth2AuthorizedClient client) {\n        return callResourceServer2(client);\n    }\n}\n```\n\n#### Samples\n\nSample project: [`aad-web-application`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory/web-client-access-resource-server/aad-web-application).\n\n### Accessing a resource server\n\nThis scenario doesn't support login, just protect the server by validating the access token. If the access token is valid, the server serves the request.\n\n#### System Diagram\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/system-diagram-stand-alone-resource-server-usage.png\" alt-text=\"System diagram for standalone resource server usage.\" border=\"false\":::\n\n#### Create required resources in Azure\n\n1. Read [Quickstart: Register an application with the Microsoft identity platform](/azure/active-directory/develop/quickstart-register-app).\n\n1. Create an app registration. Get `AZURE_CLIENT_ID`.\n\n1. Read [Quickstart: Configure an application to expose a web API](/azure/active-directory/develop/quickstart-configure-app-expose-web-apis).\n\n1. Expose a web API with a scope named `Scope-1`.\n\n#### Add required dependencies\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n    </dependency>\n    <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>\n    </dependency>\n</dependencies>\n```\n\n#### Add required properties\n\n```yaml\nspring:\n  cloud:\n    azure:\n      active-directory:\n        enabled: true\n        credential:\n          client-id: ${AZURE_CLIENT_ID}\n```\n\nNow start your application and access your application's web api.\n\n1. You'll get 401 without an access token.\n\n1. Access your application with an access token. The following claims in the access token will be validated:\n\n   * `iss`: The access token must be issued by Microsoft Entra ID.\n\n   * `nbf`: The current time can't be before `nbf`.\n\n   * `exp`: The current time can't after `exp`.\n\n   * `aud`: If `spring.cloud.azure.active-directory.credential.client-id` or `spring.cloud.azure.active-directory.credential.app-id-uri` configured, the audience must equal to the configured `client-id` or `app-id-uri`. If the two properties aren't configured, this claim won't be validated.\n\nFor more information about the access token, see [MS docs about Microsoft identity platform access tokens](/azure/active-directory/develop/access-tokens).\n\n#### Advanced usages\n\n##### Add extra security configurations\n\n###### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2ResourceServerSecurityConfig {\n\n    /**\n     * Add configuration logic as needed.\n     */\n    @Bean\n    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.with(AadResourceServerHttpSecurityConfigurer.aadResourceServer(), Customizer.withDefaults())\n            .authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n###### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadOAuth2ResourceServerSecurityConfig {\n\n    /**\n     * Add configuration logic as needed.\n     */\n    @Bean\n    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())\n            .and()\n            .authorizeHttpRequests()\n            .anyRequest().authenticated();\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n###### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class AadOAuth2ResourceServerSecurityConfig extends AadResourceServerWebSecurityConfigurerAdapter {\n    /**\n     * Add configuration logic as needed.\n     */\n    @Override\n    protected void configure(HttpSecurity http) throws Exception {\n        super.configure(http);\n        http.authorizeRequests((requests) -> requests.anyRequest().authenticated());\n    }\n}\n```\n\n---\n\n##### Validate permission by scopes\n\n1. Create required resources in Azure.\n\n   * Read [Quickstart: Configure an application to expose a web API](/azure/active-directory/develop/quickstart-configure-app-expose-web-apis).\n\n   * Expose a web API with a scope named `Scope1`.\n\n1. Protect the specific method.\n\n   ```java\n   class Demo {\n       @GetMapping(\"scope1\")\n       @ResponseBody\n       @PreAuthorize(\"hasAuthority('SCOPE_Scope1')\")\n       public String scope1() {\n           return \"Congratulations, you can access `scope1` endpoint.\";\n       }\n   }\n   ```\n\nBy doing this, when access `/scope1` endpoint, the following claims in access token will be validated:\n\n* `scp`: The value must contain `Scope1`.\n\n##### Validate permission by app roles\n\n1. Create required resources in Azure.\n\n   * Read [Add app roles to your application and receive them in the token](/azure/active-directory/develop/howto-add-app-roles-in-azure-ad-apps).\n\n   * Create an app role with the following parameters:\n\n     * Display name: AppRole1\n     * Allowed member types: Users/Groups\n     * Value: AppRole1\n     * Do you want to enable this app role: yes\n\n1. Protect the specific method.\n\n   ```java\n   class Demo {\n       @GetMapping(\"app-role1\")\n       @ResponseBody\n       @PreAuthorize(\"hasAuthority('APPROLE_AppRole1')\")\n       public String appRole1() {\n           return \"Congratulations, you can access `app-role1` endpoint.\";\n       }\n   }\n   ```\n\nBy doing this, when access `/app-role1` endpoint, the following claims in access token will be validated:\n\n* `roles`: The value must contain `AppRole1`.\n\n##### Use JWT client authentication\n\nTo use a JSON Web Token (JWT) for client authentication, use the following steps:\n\n1. See the [Register your certificate with Microsoft identity platform](/azure/active-directory/develop/active-directory-certificate-credentials#register-your-certificate-with-microsoft-identity-platform) section of [Microsoft identity platform application authentication certificate credentials](/azure/active-directory/develop/active-directory-certificate-credentials).\n1. Upload a **.pem** certificate to the application registered in the Azure portal.\n1. Configure the certificate path and password of a **.PFX** or **.P12** certificate.\n1. Add the property `spring.cloud.azure.active-directory.authorization-clients.azure.client-authentication-method=private_key_jwt` configuration to the client to be authenticated through JWT client authentication.\n\nThe following example configuration file is for a web application scenario. The certificate information is configured in the global properties.\n\n```yaml\nspring:\n  cloud:\n    azure:\n      credential:\n        client-id: ${AZURE_CLIENT_ID}\n        client-certificate-path: ${AZURE_CERTIFICATE_PATH}\n        client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}\n      profile:\n        tenant-id: <tenant>\n      active-directory:\n        enabled: true\n        user-group:\n          allowed-group-names: group1,group2\n          allowed-group-ids: <group1-id>,<group2-id>\n        post-logout-redirect-uri: http://localhost:8080\n        authorization-clients:\n          azure:\n            client-authentication-method: private_key_jwt\n          arm:\n            client-authentication-method: private_key_jwt\n            scopes: https://management.core.windows.net/user_impersonation\n          graph:\n            client-authentication-method: private_key_jwt\n            scopes:\n              - https://graph.microsoft.com/User.Read\n              - https://graph.microsoft.com/Directory.Read.All\n          webapiA:\n            client-authentication-method: private_key_jwt\n            scopes:\n              - ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope\n          webapiB:\n            client-authentication-method: private_key_jwt\n            scopes:\n              - ${WEB_API_B_APP_ID_URL}/.default\n            authorization-grant-type: client_credentials\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nYou can also configure the certificate information in the `active-directory` service properties, as shown in this example:\n\n```yaml\nspring:\n  cloud:\n    azure:\n      active-directory:\n        enabled: true\n        credential:\n          client-id: ${AZURE_CLIENT_ID}\n          client-certificate-path: ${AZURE_CERTIFICATE_PATH}\n          client-certificate-password: ${AZURE_CERTIFICATE_PASSWORD}\n        profile:\n          tenant-id: <tenant>\n        user-group:\n          allowed-group-names: group1,group2\n          allowed-group-ids: <group1-id>,<group2-id>\n        post-logout-redirect-uri: http://localhost:8080\n        authorization-clients:\n          azure:\n            client-authentication-method: private_key_jwt\n          arm:\n            client-authentication-method: private_key_jwt\n            scopes: https://management.core.windows.net/user_impersonation\n          graph:\n            client-authentication-method: private_key_jwt\n            scopes:\n              - https://graph.microsoft.com/User.Read\n              - https://graph.microsoft.com/Directory.Read.All\n          webapiA:\n            client-authentication-method: private_key_jwt\n            scopes:\n              - ${WEB_API_A_APP_ID_URL}/Obo.WebApiA.ExampleScope\n          webapiB:\n            client-authentication-method: private_key_jwt\n            scopes:\n              - ${WEB_API_B_APP_ID_URL}/.default\n            authorization-grant-type: client_credentials\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n<a name='connecting-to-azure-ad-via-proxy'></a>\n\n##### Connecting to Microsoft Entra ID via proxy\n\nTo connect Microsoft Entra ID via proxy, provide a `RestTemplateCustomizer` bean. For more information, see the [Connecting to Microsoft Entra ID via proxy](#connecting-to-azure-ad-via-proxy) section.\n\n#### Samples\n\nSample project: [`aad-resource-server`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory/web-client-access-resource-server/aad-resource-server).\n\n### Resource server visiting other resource servers\n\n#### System Diagram\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/system-diagram-resource-server-visiting-other-resource-servers.png\" alt-text=\"System diagram for a resource server visiting other resource servers.\" border=\"false\":::\n\n#### Create required resources in Azure\n\n1. Read [Quickstart: Register an application with the Microsoft identity platform](/azure/active-directory/develop/quickstart-register-app).\n\n1. Create an app registration. Get `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, and `AZURE_CLIENT_SECRET`.\n\n#### Add required dependencies\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n    </dependency>\n    <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>\n    </dependency>\n    <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-oauth2-client</artifactId>\n    </dependency>\n</dependencies>\n```\n\n#### Add required properties\n\n```yaml\nspring:\n  cloud:\n    azure:\n      active-directory:\n        enabled: true\n        profile:\n          tenant-id: <tenant>\n        credential:\n          client-id: ${AZURE_CLIENT_ID}\n          client-secret: ${AZURE_CLIENT_SECRET}\n        authorization-clients:\n          graph:\n            scopes:\n              - https://graph.microsoft.com/User.Read\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n#### Use OAuth2AuthorizedClient in your application\n\n```java\npublic class SampleController {\n    @GetMapping(\"call-graph\")\n    public String callGraph(@RegisteredOAuth2AuthorizedClient(\"graph\") OAuth2AuthorizedClient graph) {\n        return callMicrosoftGraphMeEndpoint(graph);\n    }\n}\n```\n\n#### Samples\n\nSample project: [`aad-resource-server-obo`](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory/web-client-access-resource-server/aad-resource-server-obo).\n\n### Web application and resource server in one application\n\n#### Create required resources in Azure\n\n1. Read [Quickstart: Register an application with the Microsoft identity platform](/azure/active-directory/develop/quickstart-register-app).\n\n1. Create an app registration. Get `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, and `AZURE_CLIENT_SECRET`.\n\n#### Add required dependencies\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-starter-active-directory</artifactId>\n    </dependency>\n    <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>\n    </dependency>\n    <dependency>\n        <groupId>org.springframework.boot</groupId>\n        <artifactId>spring-boot-starter-oauth2-client</artifactId>\n    </dependency>\n</dependencies>\n```\n\n#### Add required properties\n\nSet property `spring.cloud.azure.active-directory.application-type` to `web_application_and_resource_server`, and specify the authorization type for each authorization client.\n\n```yaml\nspring:\n  cloud:\n    azure:\n      active-directory:\n        enabled: true\n        profile:\n          tenant-id: <tenant>\n        credential:\n          client-id: ${AZURE_CLIENT_ID}\n          client-secret: ${AZURE_CLIENT_SECRET}\n        app-id-uri: ${WEB_API_ID_URI}\n        application-type: web_application_and_resource_server  # This is required.\n        authorization-clients:\n          graph:\n            authorizationGrantType: authorization_code # This is required.\n            scopes:\n              - https://graph.microsoft.com/User.Read\n              - https://graph.microsoft.com/Directory.Read.All\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\n#### Define SecurityFilterChain\n\nConfigure multiple `SecurityFilterChain` instances. `AadWebApplicationAndResourceServerConfig` contains two security filter chain configurations for resource server and web application.\n\n##### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadWebApplicationAndResourceServerConfig {\n\n    @Bean\n    @Order(1)\n    public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {\n        http.with(AadResourceServerHttpSecurityConfigurer.aadResourceServer(), Customizer.withDefaults())\n            // All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as the web application.\n            .securityMatcher(\"/api/**\")\n            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());\n        return http.build();\n    }\n\n    @Bean\n    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(), Customizer.withDefaults())\n            .authorizeHttpRequests(auth -> auth.requestMatchers(\"/login\").permitAll().anyRequest().authenticated());\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n##### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class AadWebApplicationAndResourceServerConfig {\n\n    @Bean\n    @Order(1)\n    public SecurityFilterChain apiFilterChain(HttpSecurity http) throws Exception {\n        http.apply(AadResourceServerHttpSecurityConfigurer.aadResourceServer())\n                .and()\n            // All the paths that match `/api/**`(configurable) work as the resource server. Other paths work as the web application.\n            .securityMatcher(\"/api/**\")\n            .authorizeHttpRequests()\n                .anyRequest().authenticated();\n        return http.build();\n    }\n\n    @Bean\n    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())\n                .and()\n            .authorizeHttpRequests()\n                .requestMatchers(\"/login\").permitAll()\n                .anyRequest().authenticated();\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n##### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class AadWebApplicationAndResourceServerConfig {\n\n    @Order(1)\n    @Configuration\n    public static class ApiWebSecurityConfigurationAdapter extends AadResourceServerWebSecurityConfigurerAdapter {\n        protected void configure(HttpSecurity http) throws Exception {\n            super.configure(http);\n            // All the paths that match `/api/**`(configurable) work as `Resource Server`, other paths work as `Web application`.\n            http.antMatcher(\"/api/**\")\n                .authorizeRequests().anyRequest().authenticated();\n        }\n    }\n\n    @Configuration\n    public static class HtmlWebSecurityConfigurerAdapter extends AadWebSecurityConfigurerAdapter {\n\n        @Override\n        protected void configure(HttpSecurity http) throws Exception {\n            super.configure(http);\n            // @formatter:off\n            http.authorizeRequests()\n                    .antMatchers(\"/login\").permitAll()\n                    .anyRequest().authenticated();\n            // @formatter:on\n        }\n    }\n}\n```\n\n---\n\n### Configuration\n\nConfigurable properties of `spring-cloud-azure-starter-active-directory`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                                                                  | Description                                                                                                                                                                                                           |\n> |---------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.active-directory.app-id-uri`                                    | App ID URI that might be used in the \"aud\" claim of an id_token.                                                                                                                                                     |\n> | `spring.cloud.azure.active-directory.application-type`                              | Type of the Microsoft Entra application.                                                                                                                                                                                          |\n> | `spring.cloud.azure.active-directory.authenticate-additional-parameters`            | Add additional parameters to the Authorization URL.                                                                                                                                                                   |\n> | `spring.cloud.azure.active-directory.authorization-clients`                         | The OAuth2 authorization clients.                                                                                                                                                                                     |\n> | `spring.cloud.azure.active-directory.credential.client-id`                          | Client Id to use when performing service principal authentication with Azure.                                                                                                                                         |\n> | `spring.cloud.azure.active-directory.credential.client-secret`                      | Client secret to use when performing service principal authentication with Azure.                                                                                                                                     |\n> | `spring.cloud.azure.active-directory.jwk-set-cache-lifespan`                        | The lifespan of the cached JWK set before it expires, default is 5 minutes.                                                                                                                                           |\n> | `spring.cloud.azure.active-directory.jwk-set-cache-refresh-time`                    | The refresh time of the cached JWK set before it expires, default is 5 minutes.                                                                                                                                       |\n> | `spring.cloud.azure.active-directory.jwt-connect-timeout`                           | Connection Timeout for the JWKSet Remote URL call.                                                                                                                                                                    |\n> | `spring.cloud.azure.active-directory.jwt-read-timeout`                              | Read Timeout for the JWKSet Remote URL call.                                                                                                                                                                          |\n> | `spring.cloud.azure.active-directory.jwt-size-limit`                                | Size limit in Bytes of the JWKSet Remote URL call.                                                                                                                                                                    |\n> | `spring.cloud.azure.active-directory.post-logout-redirect-uri`                      | The redirect uri after logout.                                                                                                                                                                                        |\n> | `spring.cloud.azure.active-directory.profile.cloud-type`                            | Name of the Azure cloud to connect to. Supported types are: AZURE, AZURE_CHINA, AZURE_GERMANY, AZURE_US_GOVERNMENT, OTHER.                                                                                            |\n> | `spring.cloud.azure.active-directory.profile.environment`                           | Properties to Microsoft Entra endpoints.                                                                                                                                                                       |\n> | `spring.cloud.azure.active-directory.profile.tenant-id`                             | Azure Tenant ID. The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID.                                                                                                                                                                          |\n> | `spring.cloud.azure.active-directory.redirect-uri-template`                         | Redirection Endpoint: Used by the authorization server to return responses containing authorization credentials to the client via the resource owner user-agent. The default value is `{baseUrl}/login/oauth2/code/`. |\n> | `spring.cloud.azure.active-directory.resource-server.claim-to-authority-prefix-map` | Configure which claim will be used to build GrantedAuthority, and prefix of the GrantedAuthority's string value. Default value is: \"scp\" -> \"SCOPE_\", \"roles\" -> \"APPROLE_\".                                      |\n> | `spring.cloud.azure.active-directory.resource-server.principal-claim-name`          | Configure which claim in access token be returned in AuthenticatedPrincipal#getName. Default value is \"sub\".                                                                                                          |\n> | `spring.cloud.azure.active-directory.session-stateless`                             | If true activates the stateless auth filter AadAppRoleStatelessAuthenticationFilter. The default is false which activates AadAuthenticationFilter.                                                                 |\n> | `spring.cloud.azure.active-directory.user-group.allowed-group-ids`                  | The group ids can be used to construct GrantedAuthority.                                                                                                                                                              |\n> | `spring.cloud.azure.active-directory.user-group.allowed-group-names`                | The group names can be used to construct GrantedAuthority.                                                                                                                                                            |\n> | `spring.cloud.azure.active-directory.user-group.use-transitive-members`             | If \"true\", use \"v1.0/me/transitiveMemberOf\" to get members. Otherwise, use \"v1.0/me/memberOf\". The default value is `false`.                                                                                          |\n> | `spring.cloud.azure.active-directory.user-name-attribute`                           |   Decide which claim to be principal's name.                                                                                                                                                                          |\n\nHere are some examples about how to use these properties:\n\n#### Application type\n\nThe application type can be inferred from the dependencies: `spring-security-oauth2-client` or `spring-security-oauth2-resource-server`. If the inferred value isn't the value you want, you can specify the application type. Here's the table of valid values and inferred values:\n\nApplication type of `spring-cloud-azure-starter-active-directory`:\n\n| Has dependency: `spring-security-oauth2-client` | Has dependency: `spring-security-oauth2-resource-server` | Valid values of application type                                                                        | Inferred value             |\n|-------------------------------------------------|----------------------------------------------------------|---------------------------------------------------------------------------------------------------------|----------------------------|\n| Yes                                             | No                                                       | `web_application`                                                                                       | `web_application`          |\n| No                                              | Yes                                                      | `resource_server`                                                                                       | `resource_server`          |\n| Yes                                             | Yes                                                      | `web_application`, `resource_server`, `resource_server_with_obo`, `web_application_and_resource_server` | `resource_server_with_obo` |\n\n## Spring Security with Azure Active Directory B2C\n\nAzure Active Directory (Azure AD) B2C is an identity management service that enables you to customize and control how customers sign up, sign in, and manage their profiles when using your applications. Azure AD B2C enables these actions while protecting the identities of your customers at the same time.\n\n### Dependency setup\n\n```xml\n<dependencies>\n    <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId>\n    </dependency>\n</dependencies>\n```\n\n### Configuration\n\nConfigurable properties of `spring-cloud-azure-starter-active-directory-b2c`:\n\n> [!div class=\"mx-tdBreakAll\"]\n> | Name                                                                           | Description                                                                                  |\n> |--------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|\n> | `spring.cloud.azure.active-directory.b2c.app-id-uri`                         | App ID URI that might be used in the \"aud\" claim of a token.                                |\n> | `spring.cloud.azure.active-directory.b2c.authenticate-additional-parameters` | Additional parameters for authentication.                                                    |\n> | `spring.cloud.azure.active-directory.b2c.authorization-clients`              | Specify client configuration.                                                                |\n> | `spring.cloud.azure.active-directory.b2c.base-uri`                           | Azure AD B2C endpoint base uri.                                                              |\n> | `spring.cloud.azure.active-directory.b2c.credential`                         | Azure AD B2C credential information.                                                         |\n> | `spring.cloud.azure.active-directory.b2c.jwt-connect-timeout`                | Connection Timeout for the JWKSet Remote URL call.                                           |\n> | `spring.cloud.azure.active-directory.b2c.jwt-read-timeout`                   | Read Timeout for the JWKSet Remote URL call.                                                 |\n> | `spring.cloud.azure.active-directory.b2c.jwt-size-limit`                     | Size limit in Bytes of the JWKSet Remote URL call.                                           |\n> | `spring.cloud.azure.active-directory.b2c.login-flow`                         | Specify the primary sign-in flow key. The default value is `sign-up-or-sign-in`.             |\n> | `spring.cloud.azure.active-directory.b2c.logout-success-url`                 | Redirect URL after logout. The default value is `http://localhost:8080/login`.               |\n> | `spring.cloud.azure.active-directory.b2c.profile`                            | Azure AD B2C profile information.                                                            |\n> | `spring.cloud.azure.active-directory.b2c.reply-url`                          | Reply URL after get authorization code. The default value is `{baseUrl}/login/oauth2/code/`. |\n> | `spring.cloud.azure.active-directory.b2c.user-flows`                         | User flows.                                                                                  |\n> | `spring.cloud.azure.active-directory.b2c.user-name-attribute-name`           | User name attribute name.                                                                    |\n\nFor full configurations, check [Spring Cloud Azure configuration properties](configuration-properties-all.md).\n\n### Basic usage\n\nA *web application* is any web-based application that allows user to login with Microsoft Entra ID, whereas a *resource server* will either accept or deny access after validating access_token obtained from Microsoft Entra ID. We'll cover 4 scenarios in this guide:\n\n1. Accessing a web application.\n\n1. Web application accessing resource servers.\n\n1. Accessing a resource server.\n\n1. Resource server accessing other resource servers.\n\n#### Usage 1: Accessing a web application\n\nThis scenario uses [The OAuth 2.0 authorization code grant](/azure/active-directory/develop/v2-oauth2-auth-code-flow) flow to log in a user with your Azure AD B2C user.\n\nSelect **Azure AD B2C** from the portal menu, select **Applications**, and then select **Add**.\n\nSpecify your application **Name** (such as `webapp`), add `http://localhost:8080/login/oauth2/code/` for the **Reply URL**, record the **Application ID** as your `WEB_APP_AZURE_CLIENT_ID`, and then select **Save**.\n\nSelect **Keys** from your application, select **Generate key** to generate `WEB_APP_AZURE_CLIENT_SECRET`, and then select **Save**.\n\nSelect **User flows** on your left, and then select **New user flow**.\n\nChoose **Sign up or in**, **Profile editing**, and **Password reset** to create user flows respectively. Specify your user flow **Name** and **User attributes and claims**, then select **Create**.\n\nSelect **API permissions** \\> **Add a permission** \\> **Microsoft APIs**, select ***Microsoft Graph***, select **Delegated permissions**, select the **offline_access** and **openid** permissions, and then select **Add permission** to complete the process.\n\nGrant admin consent for ***Graph*** permissions.\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/add-graph-permissions.png\" alt-text=\"Azure portal screenshot showing API permissions screen for an app, with graph permissions highlighted.\" lightbox=\"media/spring-cloud-azure/add-graph-permissions.png\":::\n\nAdd the following dependencies to your **pom.xml** file.\n\n##### [Spring Cloud Azure 6.x.7.x](#tab/SpringCloudAzure6x)\n\n```xml\n<dependencies>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-web</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-thymeleaf</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-security</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.thymeleaf.extras</groupId>\n       <artifactId>thymeleaf-extras-springsecurity6</artifactId>\n   </dependency>\n</dependencies>\n```\n\n##### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n```xml\n<dependencies>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-web</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-thymeleaf</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-security</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.thymeleaf.extras</groupId>\n       <artifactId>thymeleaf-extras-springsecurity6</artifactId>\n   </dependency>\n</dependencies>\n```\n\n##### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n```xml\n<dependencies>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-web</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-thymeleaf</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-security</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.thymeleaf.extras</groupId>\n       <artifactId>thymeleaf-extras-springsecurity5</artifactId>\n   </dependency>\n</dependencies>\n```\n\n---\n\nAdd properties to your **application.yml** file using the values you created earlier, as shown in the following example:\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       b2c:\n         enabled: true\n         authenticate-additional-parameters:\n           domain_hint: xxxxxxxxx         # optional\n           login_hint: xxxxxxxxx          # optional\n           prompt: [login,none,consent]   # optional\n         base-uri: ${BASE_URI}\n         credential:\n           client-id: ${WEBAPP_AZURE_CLIENT_ID}\n           client-secret: ${WEBAPP_AZURE_CLIENT_SECRET}\n         login-flow: ${LOGIN_USER_FLOW_KEY}               # default to sign-up-or-sign-in, will look up the user-flows map with provided key.\n         logout-success-url: ${LOGOUT_SUCCESS_URL}\n         user-flows:\n           ${YOUR_USER_FLOW_KEY}: ${USER_FLOW_NAME}\n         user-name-attribute-name: ${USER_NAME_ATTRIBUTE_NAME}\n```\n\nWrite your Java code.\n\nFor your controller code, you can refer to the following example:\n\n```java\n@Controller\npublic class WebController {\n\n   private void initializeModel(Model model, OAuth2AuthenticationToken token) {\n       if (token != null) {\n           final OAuth2User user = token.getPrincipal();\n           model.addAllAttributes(user.getAttributes());\n           model.addAttribute(\"grant_type\", user.getAuthorities());\n           model.addAttribute(\"name\", user.getName());\n       }\n   }\n\n   @GetMapping(value = { \"/\", \"/home\" })\n   public String index(Model model, OAuth2AuthenticationToken token) {\n       initializeModel(model, token);\n       return \"home\";\n   }\n}\n```\n\nFor your security configuration code, you can refer to the following example:\n\n##### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\npublic class WebSecurityConfiguration {\n\n    private final AadB2cOidcLoginConfigurer configurer;\n\n    public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {\n        this.configurer = configurer;\n    }\n\n    @Bean\n    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())\n            .with(configurer, Customizer.withDefaults());\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n##### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\npublic class WebSecurityConfiguration {\n\n    private final AadB2cOidcLoginConfigurer configurer;\n\n    public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {\n        this.configurer = configurer;\n    }\n\n    @Bean\n    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n        // @formatter:off\n        http.authorizeHttpRequests()\n                .anyRequest().authenticated()\n                .and()\n            .apply(configurer);\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n##### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n```java\n@EnableWebSecurity\npublic class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {\n\n   private final AadB2cOidcLoginConfigurer configurer;\n\n   public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) {\n       this.configurer = configurer;\n   }\n\n   @Override\n   protected void configure(HttpSecurity http) throws Exception {\n       // @formatter:off\n       http.authorizeRequests()\n               .anyRequest().authenticated()\n               .and()\n           .apply(configurer);\n       // @formatter:on\n   }\n}\n```\n\n---\n\nCopy the **home.html** from [`aad-b2c-web-application` sample](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory-b2c/aad-b2c-web-application/src/main/resources/templates/home.html), and replace the `PROFILE_EDIT_USER_FLOW` and `PASSWORD_RESET_USER_FLOW` with your user flow names that you used previously.\n\nBuild and test your app. Let `Webapp` run on port `8080`.\n\nAfter your application is built and started by Maven, open `http://localhost:8080/` in a web browser. You should be redirected to the login page.\n\nSelect the link with the login user flow. You should be redirected Azure AD B2C to start the authentication process.\n\nAfter you've logged in successfully, you should see the sample `home page` from the browser.\n\n#### Usage 2: Web application accessing resource servers\n\nThis scenario is based on the **Accessing a web application** scenario to allow an application to access other resources. This scenario is [The OAuth 2.0 client credentials grant](/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow) flow.\n\nSelect **Azure AD B2C** from the portal menu, select **Applications**, and then select **Add**.\n\nSpecify your application **Name** (such as `webApiA`), record the **Application ID** as your `WEB_API_A_AZURE_CLIENT_ID`, and then select **Save**.\n\nSelect **Keys** from your application, select **Generate key** to generate `WEB_API_A_AZURE_CLIENT_SECRET`, and then select **Save**.\n\nSelect **Expose an API** from the navigation pane, and then select **Set**. Record the **Application ID URI** as your `WEB_API_A_APP_ID_URL`, and then select **Save**.\n\nSelect **Manifest** from the navigation pane, and then paste the following JSON segment into `appRoles` array. Record the **Application ID URI** as your `WEB_API_A_APP_ID_URL`, record the value of the app role as your `WEB_API_A_ROLE_VALUE`, and then select **Save**.\n\n```json\n{\n \"allowedMemberTypes\": [\n   \"Application\"\n ],\n \"description\": \"WebApiA.SampleScope\",\n \"displayName\": \"WebApiA.SampleScope\",\n \"id\": \"04989db0-3efe-4db6-b716-ae378517d2b7\",\n \"isEnabled\": true,\n \"value\": \"WebApiA.SampleScope\"\n}\n```\n\nSelect **API permissions** \\> **Add a permission** \\> **My APIs**, select **WebApiA** application name, select **Application Permissions**, select **WebApiA.SampleScope** permission, and then select **Add permission** to complete the process.\n\nGrant admin consent for ***WebApiA*** permissions.\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/application-api-permissions.png\" alt-text=\"Azure portal screenshot showing application API permissions screen.\" lightbox=\"media/spring-cloud-azure/application-api-permissions.png\":::\n\nAdd the following dependency on the basis of the **Accessing a web application** scenario.\n\n```xml\n<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-webflux</artifactId>\n</dependency>\n```\n\nAdd the following configuration on the basis of the **Accessing a web application** scenario.\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       b2c:\n         enabled: true\n         base-uri: ${BASE_URI}             # Such as: https://xxxxb2c.b2clogin.com\n         profile:\n           tenant-id: <tenant>\n         authorization-clients:\n           ${RESOURCE_SERVER_A_NAME}:\n             authorization-grant-type: client_credentials\n             scopes: ${WEB_API_A_APP_ID_URL}/.default\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nWrite your `Webapp` Java code.\n\nFor your controller code, you can refer to the following example:\n\n```java\nclass Demo {\n   /**\n    * Access to protected data from Webapp to WebApiA through client credential flow. The access token is obtained by webclient, or\n    * <p>@RegisteredOAuth2AuthorizedClient(\"webApiA\")</p>. In the end, these two approaches will be executed to\n    * DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.\n    *\n    * @return Respond to protected data from WebApi A.\n    */\n   @GetMapping(\"/webapp/webApiA\")\n   public String callWebApiA() {\n       String body = webClient\n           .get()\n           .uri(LOCAL_WEB_API_A_SAMPLE_ENDPOINT)\n           .attributes(clientRegistrationId(\"webApiA\"))\n           .retrieve()\n           .bodyToMono(String.class)\n           .block();\n       LOGGER.info(\"Call callWebApiA(), request '/webApiA/sample' returned: {}\", body);\n       return \"Request '/webApiA/sample'(WebApi A) returned a \" + (body != null ? \"success.\" : \"failure.\");\n   }\n}\n```\n\nSecurity configuration code is the same as in the **Accessing a web application** scenario. Add another bean `webClient` as follows:\n\n```java\npublic class SampleConfiguration {\n   @Bean\n   public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {\n       ServletOAuth2AuthorizedClientExchangeFilterFunction function =\n           new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);\n       return WebClient.builder()\n                       .apply(function.oauth2Configuration())\n                       .build();\n   }\n}\n```\n\nTo write your `WebApiA` Java code, see the **Accessing a resource server** section.\n\nBuild and test your app. Let `Webapp` and `WebApiA` run on port `8080` and `8081` respectively. Start the `Webapp` and `WebApiA` applications. Return to the home page after logging in successfully. You can then access `http://localhost:8080/webapp/webApiA` to get the `WebApiA` resource response.\n\n#### Usage 3: Accessing a resource server\n\nThis scenario doesn't support login. Just protect the server by validating the access token, and if valid, it serves the request.\n\nTo build your `WebApiA` permission, see [Usage 2: Web Application Accessing Resource Servers](#usage-2-web-application-accessing-resource-servers).\n\nAdd `WebApiA` permission and grant admin consent for your web application.\n\nAdd the following dependencies to your **pom.xml** file.\n\n```xml\n<dependencies>\n   <dependency>\n       <groupId>com.azure.spring</groupId>\n       <artifactId>azure-spring-boot-starter-active-directory-b2c</artifactId>\n   </dependency>\n   <dependency>\n       <groupId>org.springframework.boot</groupId>\n       <artifactId>spring-boot-starter-web</artifactId>\n   </dependency>\n</dependencies>\n```\n\nAdd the following configuration.\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       b2c:\n         enabled: true\n         base-uri: ${BASE_URI}             # Such as: https://xxxxb2c.b2clogin.com\n         profile:\n           tenant-id: <tenant>\n         app-id-uri: ${APP_ID_URI}         # If you're using v1.0 token, configure app-id-uri for `aud` verification\n         credential:\n           client-id: ${AZURE_CLIENT_ID}           # If you're using v2.0 token, configure client-id for `aud` verification\n         user-flows:\n           sign-up-or-sign-in: ${SIGN_UP_OR_SIGN_IN_USER_FLOW_NAME}\n```\n\n> [!NOTE]\n> The values allowed for `tenant-id` are: `common`, `organizations`, `consumers`, or the tenant ID. For more information about these values, see the [Used the wrong endpoint (personal and organization accounts)](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist#cause-3-used-the-wrong-endpoint-personal-and-organization-accounts) section of [Error AADSTS50020 - User account from identity provider does not exist in tenant](/troubleshoot/azure/active-directory/error-code-aadsts50020-user-account-identity-provider-does-not-exist). For information on converting your single-tenant app, see [Convert single-tenant app to multitenant on Microsoft Entra ID](/entra/identity-platform/howto-convert-app-to-be-multi-tenant).\n\nWrite your Java code.\n\nFor your controller code, you can refer to the following example:\n\n```java\nclass Demo {\n   /**\n    * webApiA resource api for web app\n    * @return test content\n    */\n   @PreAuthorize(\"hasAuthority('APPROLE_WebApiA.SampleScope')\")\n   @GetMapping(\"/webApiA/sample\")\n   public String webApiASample() {\n       LOGGER.info(\"Call webApiASample()\");\n       return \"Request '/webApiA/sample'(WebApi A) returned successfully.\";\n   }\n}\n```\n\nFor your security configuration code, you can refer to the following example:\n\n##### [Spring Cloud Azure 6.x/7.x](#tab/SpringCloudAzure6x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class ResourceServerConfiguration {\n    \n    @Bean\n    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n        JwtAuthenticationConverter authenticationConverter = new JwtAuthenticationConverter();\n        JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();\n        jwtGrantedAuthoritiesConverter.setAuthorityPrefix(\"APPROLE_\");\n        authenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);\n        // @formatter:off\n        http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())\n            .oauth2ResourceServer(o -> o.jwt(j -> j.jwtAuthenticationConverter(authenticationConverter)));\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n##### [Spring Cloud Azure 5.x](#tab/SpringCloudAzure5x)\n\n```java\n@Configuration(proxyBeanMethods = false)\n@EnableWebSecurity\n@EnableMethodSecurity\npublic class ResourceServerConfiguration {\n    \n    @Bean\n    public SecurityFilterChain htmlFilterChain(HttpSecurity http) throws Exception {\n        JwtAuthenticationConverter authenticationConverter = new JwtAuthenticationConverter();\n        JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();\n        jwtGrantedAuthoritiesConverter.setAuthorityPrefix(\"APPROLE_\");\n        authenticationConverter.setJwtGrantedAuthoritiesConverter(jwtGrantedAuthoritiesConverter);\n        // @formatter:off\n        http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated())\n            .oauth2ResourceServer()\n            .jwt()\n            .jwtAuthenticationConverter(authenticationConverter);\n        // @formatter:on\n        return http.build();\n    }\n}\n```\n\n##### [Spring Cloud Azure 4.x](#tab/SpringCloudAzure4x)\n\n```java\n@EnableWebSecurity\n@EnableGlobalMethodSecurity(prePostEnabled = true)\npublic class ResourceServerConfiguration extends WebSecurityConfigurerAdapter {\n\n   @Override\n   protected void configure(HttpSecurity http) throws Exception {\n       http.authorizeRequests((requests) -> requests.anyRequest().authenticated())\n           .oauth2ResourceServer()\n           .jwt()\n               .jwtAuthenticationConverter(new AadJwtBearerTokenAuthenticationConverter());\n   }\n}\n```\n\n---\n\nBuild and test your app. Let `WebApiA` run on port `8081`. Get the access token for the `webApiA` resource and then access `http://localhost:8081/webApiA/sample` as the Bearer authorization header.\n\n#### Usage 4: Resource server accessing other resource servers\n\nThis scenario is an upgrade of **Accessing a resource server**, and supports access to other application resources, based on OAuth2 client credentials flow.\n\nReferring to the previous steps, we create a `WebApiB` application and expose an application permission `WebApiB.SampleScope`.\n\n```json\n{\n   \"allowedMemberTypes\": [\n       \"Application\"\n   ],\n   \"description\": \"WebApiB.SampleScope\",\n   \"displayName\": \"WebApiB.SampleScope\",\n   \"id\": \"04989db0-3efe-4db6-b716-ae378517d2b7\",\n   \"isEnabled\": true,\n   \"lang\": null,\n   \"origin\": \"Application\",\n   \"value\": \"WebApiB.SampleScope\"\n}\n```\n\nGrant admin consent for `WebApiB` permissions.\n\n:::image type=\"content\" source=\"media/spring-cloud-azure/application-api-permissions-web-api-a.png\" alt-text=\"Azure portal screenshot showing application WebApiA API permissions screen.\" lightbox=\"media/spring-cloud-azure/application-api-permissions-web-api-a.png\":::\n\nOn the basis of **Accessing a resource server**, add the following dependency to your **pom.xml** file.\n\n```xml\n<dependency>\n<groupId>org.springframework.boot</groupId>\n<artifactId>spring-boot-starter-webflux</artifactId>\n</dependency>\n```\n\nAdd the following configuration on the basis of the **Accessing a resource server** scenario configuration.\n\n```yaml\nspring:\n cloud:\n   azure:\n     active-directory:\n       b2c:\n         enabled: true\n         credential:\n           client-secret: ${WEB_API_A_AZURE_CLIENT_SECRET}\n         authorization-clients:\n           ${RESOURCE_SERVER_B_NAME}:\n             authorization-grant-type: client_credentials\n             scopes: ${WEB_API_B_APP_ID_URL}/.default\n```\n\nWrite your Java code.\n\nFor your `WebApiA` controller code, you can refer to the following example:\n\n```java\npublic class SampleController {\n   /**\n    * Access to protected data from WebApiA to WebApiB through client credential flow. The access token is obtained by webclient, or\n    * <p>@RegisteredOAuth2AuthorizedClient(\"webApiA\")</p>. In the end, these two approaches will be executed to\n    * DefaultOAuth2AuthorizedClientManager#authorize method, get the access token.\n    *\n    * @return Respond to protected data from WebApi B.\n    */\n   @GetMapping(\"/webApiA/webApiB/sample\")\n   @PreAuthorize(\"hasAuthority('APPROLE_WebApiA.SampleScope')\")\n   public String callWebApiB() {\n       String body = webClient\n           .get()\n           .uri(LOCAL_WEB_API_B_SAMPLE_ENDPOINT)\n           .attributes(clientRegistrationId(\"webApiB\"))\n           .retrieve()\n           .bodyToMono(String.class)\n           .block();\n       LOGGER.info(\"Call callWebApiB(), request '/webApiB/sample' returned: {}\", body);\n       return \"Request 'webApiA/webApiB/sample'(WebApi A) returned a \" + (body != null ? \"success.\" : \"failure.\");\n   }\n}\n```\n\nFor your `WebApiB` controller code, you can refer to the following example:\n\n```java\npublic class SampleController {\n   /**\n    * webApiB resource api for other web application\n    * @return test content\n    */\n   @PreAuthorize(\"hasAuthority('APPROLE_WebApiB.SampleScope')\")\n   @GetMapping(\"/webApiB/sample\")\n   public String webApiBSample() {\n       LOGGER.info(\"Call webApiBSample()\");\n       return \"Request '/webApiB/sample'(WebApi B) returned successfully.\";\n   }\n}\n```\n\nSecurity configuration code is the same with **Accessing a resource server** scenario, another bean `webClient` is added as follows\n\n```java\npublic class SampleConfiguration {\n   @Bean\n   public WebClient webClient(OAuth2AuthorizedClientManager oAuth2AuthorizedClientManager) {\n       ServletOAuth2AuthorizedClientExchangeFilterFunction function =\n           new ServletOAuth2AuthorizedClientExchangeFilterFunction(oAuth2AuthorizedClientManager);\n       return WebClient.builder()\n                       .apply(function.oauth2Configuration())\n                       .build();\n   }\n}\n```\n\nBuild and test your app. Let `WebApiA` and `WebApiB` run on port `8081` and `8082` respectively. Start the `WebApiA` and `WebApiB` applications, get the access token for `webApiA` resource, and access `http://localhost:8081/webApiA/webApiB/sample` as the Bearer authorization header.\n\n### Samples\n\nFor more information, see the [`spring-cloud-azure-starter-active-directory-b2c` samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/aad/spring-cloud-azure-starter-active-directory-b2c).\n"
  },
  {
    "path": "articles/java/spring-framework/testcontainers-support.md",
    "content": "---\ntitle: Spring Cloud Azure support for Testcontainers\ndescription: Describes how to integrate Spring Cloud Azure with Testcontainers to write effective integration tests for your applications.\nms.date: 03/18/2026\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.topic: reference\nms.custom: devx-track-java\nappliesto:\n- ✅ Version 5.25.0\n- ✅ Version 6.2.0\n- ✅ Version 7.2.0\n---\n\n# Spring Cloud Azure support for Testcontainers\n\nThis article describes how to integrate Spring Cloud Azure with [Testcontainers](https://testcontainers.com/) to write effective integration tests for your applications.\n\n*Testcontainer* is an open-source framework for providing throwaway, lightweight instances of databases, message brokers, web browsers, or just about anything that can run in a Docker container. It integrates with JUnit, enabling you to write a test class that can start up a container before any of the tests run. Testcontainer is especially useful for writing integration tests that talk to a real backend service.\n\nThe `spring-cloud-azure-testcontainers` library now supports integration testing for the following Azure services:\n\n- [Azure Cosmos DB](https://azure.microsoft.com/products/cosmos-db/)\n- [Azure Blob Storage](https://azure.microsoft.com/products/storage/blobs/)\n- [Azure Queue Storage](https://azure.microsoft.com/products/storage/queues/)\n- [Azure Event Hubs](https://azure.microsoft.com/products/event-hubs/)\n- [Azure Service Bus](https://azure.microsoft.com/products/service-bus/)\n\n## Service connections\n\nA service connection is a connection to any remote service. Spring Boot's autoconfiguration can consume the details of a service connection and use them to establish a connection to a remote service. When doing so, the connection details take precedence over any connection-related configuration properties.\n\nWhen you use Testcontainers, you can automatically create connection details for a service running in a container by annotating the container field in the test class.\n\n`xxxContainerConnectionDetailsFactory` classes are registered with `spring.factories`. These factories create a `ConnectionDetails` bean based on a specific `Container` subclass or the Docker image name.\n\nThe following table provides information about the connection details factory classes supported in the `spring-cloud-azure-testcontainers` JAR:\n\n| Connection details factory class                | Connection details bean              |\n|-------------------------------------------------|--------------------------------------|\n| `CosmosContainerConnectionDetailsFactory`       | `AzureCosmosConnectionDetails`       |\n| `StorageBlobContainerConnectionDetailsFactory`  | `AzureStorageBlobConnectionDetails`  |\n| `StorageQueueContainerConnectionDetailsFactory` | `AzureStorageQueueConnectionDetails` |\n| `EventHubsContainerConnectionDetailsFactory`    | `AzureEventHubsConnectionDetails`    |\n| `ServiceBusContainerConnectionDetailsFactory`   | `AzureServiceBusConnectionDetails`   |\n\n## Set up dependencies\n\nThe following configuration sets up the required dependencies:\n\n### [Cosmos](#tab/test-for-cosmos)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.testcontainers</groupId>\n      <artifactId>testcontainers-junit-jupiter</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-testcontainers</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-starter-cosmos</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n### [Blob Storage](#tab/test-for-storage-blob)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.testcontainers</groupId>\n      <artifactId>testcontainers-junit-jupiter</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-testcontainers</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-starter-storage-blob</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n\n```\n\n### [Queue Storage](#tab/test-for-storage-queue)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.testcontainers</groupId>\n      <artifactId>testcontainers-junit-jupiter</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-testcontainers</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-starter-storage-queue</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n### [Event Hubs](#tab/test-for-event-hubs)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.testcontainers</groupId>\n      <artifactId>testcontainers-junit-jupiter</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-testcontainers</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-starter-eventhubs</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n### [Event Hubs Binder](#tab/test-for-event-hubs-binder)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.testcontainers</groupId>\n      <artifactId>testcontainers-junit-jupiter</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-testcontainers</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-stream-binder-eventhubs</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n### [Service Bus](#tab/test-for-service-bus)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.testcontainers</groupId>\n      <artifactId>testcontainers-junit-jupiter</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-testcontainers</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-starter</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-messaging-azure-servicebus</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.microsoft.sqlserver</groupId>\n      <artifactId>mssql-jdbc</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n### [Service Bus Binder](#tab/test-for-service-bus-binder)\n\n```xml\n  <properties>\n    <version.spring.cloud.azure>7.2.0</version.spring.cloud.azure>\n  </properties>\n\n  <dependencyManagement>\n    <dependencies>\n      <dependency>\n        <groupId>com.azure.spring</groupId>\n        <artifactId>spring-cloud-azure-dependencies</artifactId>\n        <version>${version.spring.cloud.azure}</version>\n        <type>pom</type>\n        <scope>import</scope>\n      </dependency>\n    </dependencies>\n  </dependencyManagement>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.springframework.boot</groupId>\n      <artifactId>spring-boot-starter-test</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.testcontainers</groupId>\n      <artifactId>testcontainers-junit-jupiter</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-testcontainers</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.azure.spring</groupId>\n      <artifactId>spring-cloud-azure-stream-binder-servicebus</artifactId>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>com.microsoft.sqlserver</groupId>\n      <artifactId>mssql-jdbc</artifactId>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n```\n\n---\n\n## Use Testcontainers\n\nThe following code example demonstrates the basic usage of Testcontainers:\n\n### [Cosmos](#tab/test-for-cosmos)\n\n```java\n@SpringBootTest(classes = CosmosTestcontainersTest.class)\n@Testcontainers\n@ExtendWith(SpringExtension.class)\n@ImportAutoConfiguration(classes = { AzureGlobalPropertiesAutoConfiguration.class, AzureCosmosAutoConfiguration.class})\npublic class CosmosTestcontainersTest {\n\n    @TempDir\n    private static File tempFolder;\n\n    @Autowired\n    private CosmosClient client;\n\n    @Container\n    @ServiceConnection\n    static CosmosDBEmulatorContainer cosmos = new CosmosDBEmulatorContainer(\n        DockerImageName.parse(\"mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest\"))\n                .waitingFor(Wait.forHttps(\"/_explorer/emulator.pem\").forStatusCode(200).allowInsecure())\n                .withStartupTimeout(Duration.ofMinutes(3));\n\n    @BeforeAll\n    public static void setup() throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException {\n        Path keyStoreFile = new File(tempFolder, \"azure-cosmos-emulator.keystore\").toPath();\n        KeyStore keyStore = cosmos.buildNewKeyStore();\n        try (var out = Files.newOutputStream(keyStoreFile.toFile().toPath())) {\n            keyStore.store(out, cosmos.getEmulatorKey().toCharArray());\n        }\n\n        System.setProperty(\"javax.net.ssl.trustStore\", keyStoreFile.toString());\n        System.setProperty(\"javax.net.ssl.trustStorePassword\", cosmos.getEmulatorKey());\n        System.setProperty(\"javax.net.ssl.trustStoreType\", \"PKCS12\");\n    }\n\n    @Test\n    public void test() {\n        CosmosDatabaseResponse databaseResponse = client.createDatabaseIfNotExists(\"Azure\");\n        assertThat(databaseResponse.getStatusCode()).isEqualTo(201);\n        CosmosContainerResponse containerResponse = client\n            .getDatabase(\"Azure\")\n            .createContainerIfNotExists(\"ServiceContainer\", \"/name\");\n        assertThat(containerResponse.getStatusCode()).isEqualTo(201);\n    }\n\n}\n```\n\nTo use `CosmosDBEmulatorContainer`, you need to prepare a `KeyStore` for TLS/SSL. For more information, see [Cosmos DB Azure Module](https://java.testcontainers.org/modules/azure/#cosmosdb) in the Testcontainers documentation. With `@ServiceConnection`, this configuration enables Cosmos DB-related beans in the app to communicate with Cosmos DB running inside the Testcontainers-managed Docker container. This setup automatically defines an `AzureCosmosConnectionDetails` bean, which the Cosmos DB autoconfiguration then uses to override any connection-related configuration properties.\n\n### [Blob Storage](#tab/test-for-storage-blob)\n\n```java\n@SpringJUnitConfig\n@Testcontainers\nclass StorageBlobTestcontainersTest {\n    @Container\n    @ServiceConnection\n    private static final GenericContainer<?> AZURITE_CONTAINER = new GenericContainer<>(\n            \"mcr.microsoft.com/azure-storage/azurite:latest\")\n            .withExposedPorts(10000)\n            .withCommand(\"azurite --skipApiVersionCheck && azurite -l /data --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0\");\n\n    @Value(\"azure-blob://testcontainers/message.txt\")\n    private Resource blobFile;\n\n    @Test\n    void test() throws IOException {\n        String originalContent = \"Hello World!\";\n        try (OutputStream os = ((WritableResource) this.blobFile).getOutputStream()) {\n            os.write(originalContent.getBytes());\n        }\n        String resultContent = StreamUtils.copyToString(this.blobFile.getInputStream(), Charset.defaultCharset());\n        assertThat(resultContent).isEqualTo(originalContent);\n    }\n\n    @Configuration(proxyBeanMethods = false)\n    @ImportAutoConfiguration(classes = {AzureGlobalPropertiesAutoConfiguration.class, AzureStorageBlobAutoConfiguration.class, AzureStorageBlobResourceAutoConfiguration.class})\n    static class Config {\n    }\n}\n```\n\nWith `@ServiceConnection`, this configuration enables blob-related beans in the app to communicate with Blob Storage running inside the Testcontainers-managed Docker container. This setup automatically defines an `AzureStorageBlobConnectionDetails` bean, which the Blob Storage autoconfiguration then uses to override any connection-related configuration properties.\n\n### [Queue Storage](#tab/test-for-storage-queue)\n\n```java\n@SpringBootTest(classes = StorageQueueTestcontainersTest.class)\n@Testcontainers\n@TestPropertySource(properties = \"spring.cloud.azure.storage.queue.queue-name=devstoreaccount1/tc-queue\")\n@ExtendWith(SpringExtension.class)\n@ImportAutoConfiguration(classes = { AzureGlobalPropertiesAutoConfiguration.class, AzureStorageQueueAutoConfiguration.class})\npublic class StorageQueueTestcontainersTest {\n\n    @Container\n    @ServiceConnection\n    private static final GenericContainer<?> AZURITE_CONTAINER = new GenericContainer<>(\n        \"mcr.microsoft.com/azure-storage/azurite:latest\")\n        .withExposedPorts(10001)\n        .withCommand(\"azurite-queue\", \"--queueHost\", \"0.0.0.0\", \"--skipApiVersionCheck\");\n\n    @Autowired\n    private QueueClient queueClient;\n\n    @BeforeAll\n    public static void setup() {\n        AZURITE_CONTAINER.start();\n    }\n\n    @Test\n    public void test() {\n        String message = \"Hello World!\";\n        this.queueClient.create();\n        this.queueClient.sendMessage(message);\n        assertThat(this.queueClient.receiveMessage().getBody().toString()).isEqualTo(message);\n    }\n\n}\n```\n\nWith `@ServiceConnection`, this configuration enables queue-related beans in the app to communicate with Queue Storage running inside the Testcontainers-managed Docker container. This setup automatically defines an `AzureStorageQueueConnectionDetails` bean, which the Queue Storage autoconfiguration then uses to override any connection-related configuration properties.\n\n### [Event Hubs](#tab/test-for-event-hubs)\n\n```java\n@SpringJUnitConfig\n@TestPropertySource(properties = { \"spring.cloud.azure.eventhubs.event-hub-name=eh1\",\n        \"spring.cloud.azure.eventhubs.producer.event-hub-name=eh1\" })\n@Testcontainers\nclass EventHubsTestContainerTest {\n\n    private static final Network NETWORK = Network.newNetwork();\n\n    private static final AzuriteContainer AZURITE = new AzuriteContainer(\n            \"mcr.microsoft.com/azure-storage/azurite:latest\")\n            .withNetwork(NETWORK)\n            .withNetworkAliases(\"azurite\");\n\n    @Container\n    @ServiceConnection\n    private static final EventHubsEmulatorContainer EVENT_HUBS = new EventHubsEmulatorContainer(\n            \"mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest\")\n            .acceptLicense()\n            .withCopyFileToContainer(MountableFile.forClasspathResource(\"Config.json\"),\n                    \"/Eventhubs_Emulator/ConfigFiles/Config.json\")\n            .withNetwork(NETWORK)\n            .withAzuriteContainer(AZURITE);\n\n    @Autowired\n    private AzureEventHubsConnectionDetails connectionDetails;\n\n    @Autowired\n    private EventHubProducerClient producerClient;\n\n    @Test\n    void connectionDetailsShouldBeProvidedByFactory() {\n        assertThat(connectionDetails).isNotNull();\n        assertThat(connectionDetails.getConnectionString())\n                .isNotBlank()\n                .startsWith(\"Endpoint=sb://\");\n    }\n\n    @Test\n    void producerClientCanSendMessage() {\n        // Wait for Event Hubs emulator to be fully ready and event hub entity to be available\n        waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> {\n            EventData event = new EventData(\"Hello World!\");\n            this.producerClient.send(Collections.singletonList(event));\n        });\n    }\n\n    @Configuration(proxyBeanMethods = false)\n    @ImportAutoConfiguration(classes = {AzureGlobalPropertiesAutoConfiguration.class,\n            AzureEventHubsAutoConfiguration.class})\n    static class Config {\n\n    }\n}\n```\n\nWith `@ServiceConnection`, this configuration enables related beans in the app to communicate with Event Hubs running inside the Testcontainers-managed Docker container. This setup automatically defines an `AzureEventHubsConnectionDetails` bean, which the Event Hubs autoconfiguration then uses to override any connection-related configuration properties.\n\n### [Event Hubs Binder](#tab/test-for-event-hubs-binder)\n\n```java\n\n@SpringJUnitConfig\n@TestPropertySource(properties = {\n        \"spring.cloud.function.definition=consume;supply\",\n        \"spring.cloud.stream.bindings.consume-in-0.destination=eh1\",\n        \"spring.cloud.stream.bindings.consume-in-0.group=$Default\",\n        \"spring.cloud.stream.bindings.supply-out-0.destination=eh1\",\n        \"spring.cloud.stream.eventhubs.bindings.consume-in-0.consumer.checkpoint.mode=MANUAL\",\n        \"spring.cloud.stream.poller.fixed-delay=1000\",\n        \"spring.cloud.stream.poller.initial-delay=0\"})\n@Testcontainers\nclass EventHubsTestContainerTest {\n\n    private static final Network NETWORK = Network.newNetwork();\n\n    private static final AzuriteContainer AZURITE = new AzuriteContainer(\n            \"mcr.microsoft.com/azure-storage/azurite:latest\")\n            .withCommand(\"azurite\", \"--blobHost\", \"0.0.0.0\", \"--queueHost\", \"0.0.0.0\", \"--tableHost\", \"0.0.0.0\",\n                    \"--skipApiVersionCheck\")\n            .withNetwork(NETWORK)\n            .withNetworkAliases(\"azurite\");\n\n    @Container\n    @ServiceConnection\n    private static final EventHubsEmulatorContainer EVENT_HUBS = new EventHubsEmulatorContainer(\n            \"mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest\")\n            .acceptLicense()\n            .withCopyFileToContainer(MountableFile.forClasspathResource(\"Config.json\"),\n                    \"/Eventhubs_Emulator/ConfigFiles/Config.json\")\n            .withNetwork(NETWORK)\n            .withAzuriteContainer(AZURITE);\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(EventHubsTestContainerTest.class);\n    private static final Set<String> RECEIVED_MESSAGES = ConcurrentHashMap.newKeySet();\n    private static final AtomicInteger MESSAGE_SEQUENCE = new AtomicInteger(0);\n\n    @Test\n    void supplierAndConsumerShouldWorkThroughEventHubs() {\n        waitAtMost(Duration.ofSeconds(120))\n                .pollDelay(Duration.ofSeconds(2))\n                .pollInterval(Duration.ofSeconds(2))\n                .untilAsserted(() -> {\n                    assertThat(RECEIVED_MESSAGES).isNotEmpty();\n                    LOGGER.info(\"✓ Test passed - Consumer received {} message(s)\", RECEIVED_MESSAGES.size());\n                });\n    }\n\n    @Configuration(proxyBeanMethods = false)\n    @EnableAutoConfiguration\n    @ImportAutoConfiguration(classes = {\n            AzureGlobalPropertiesAutoConfiguration.class,\n            AzureEventHubsAutoConfiguration.class,\n            AzureEventHubsMessagingAutoConfiguration.class})\n    static class Config {\n\n        private static final String CHECKPOINT_CONTAINER_NAME = \"eventhubs-checkpoint\";\n\n        @Bean\n        public BlobCheckpointStore blobCheckpointStore() {\n            BlobServiceAsyncClient blobServiceAsyncClient = new BlobServiceClientBuilder()\n                    .connectionString(AZURITE.getConnectionString())\n                    .serviceVersion(BlobServiceVersion.V2025_01_05)\n                    .buildAsyncClient();\n            BlobContainerAsyncClient containerAsyncClient = blobServiceAsyncClient\n                    .getBlobContainerAsyncClient(CHECKPOINT_CONTAINER_NAME);\n            if (Boolean.FALSE.equals(containerAsyncClient.exists().block(Duration.ofSeconds(3)))) {\n                containerAsyncClient.create().block(Duration.ofSeconds(3));\n            }\n            return new BlobCheckpointStore(containerAsyncClient);\n        }\n\n        @Bean\n        public Supplier<Message<String>> supply() {\n            return () -> {\n                int sequence = MESSAGE_SEQUENCE.getAndIncrement();\n                String payload = \"Hello world, \" + sequence;\n                LOGGER.info(\"[Supplier] Invoked - message sequence: {}\", sequence);\n                return MessageBuilder.withPayload(payload).build();\n            };\n        }\n\n        @Bean\n        public Consumer<Message<String>> consume() {\n            return message -> {\n                String payload = message.getPayload();\n                RECEIVED_MESSAGES.add(payload);\n                LOGGER.info(\"[Consumer] Received message: {}\", payload);\n\n                Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n                if (checkpointer != null) {\n                    checkpointer.success()\n                            .doOnSuccess(s -> LOGGER.info(\"[Consumer] Message checkpointed\"))\n                            .doOnError(e -> LOGGER.error(\"[Consumer] Checkpoint failed\", e))\n                            .block();\n                }\n            };\n        }\n    }\n}\n```\n\nWith `@ServiceConnection`, this configuration enables related beans in the app to communicate with Event Hubs running inside the Testcontainers-managed Docker container. This setup automatically defines an `AzureEventHubsConnectionDetails` bean, which the Event Hubs autoconfiguration then uses to override any connection-related configuration properties.\n\n### [Service Bus](#tab/test-for-service-bus)\n\n```java\n@SpringJUnitConfig\n@TestPropertySource(properties = { \"spring.cloud.azure.servicebus.entity-name=queue.1\",\n        \"spring.cloud.azure.servicebus.entity-type=queue\" })\n@Testcontainers\nclass ServiceBusTestContainerTest {\n\n    private static final Network NETWORK = Network.newNetwork();\n\n    private static final MSSQLServerContainer<?> SQLSERVER = new MSSQLServerContainer<>(\n            \"mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04\")\n            .acceptLicense()\n            .withNetwork(NETWORK)\n            .withNetworkAliases(\"sqlserver\");\n\n    @Container\n    @ServiceConnection\n    private static final ServiceBusEmulatorContainer SERVICE_BUS = new ServiceBusEmulatorContainer(\n            \"mcr.microsoft.com/azure-messaging/servicebus-emulator:latest\")\n            .acceptLicense()\n            .withCopyFileToContainer(MountableFile.forClasspathResource(\"Config.json\"),\n                    \"/ServiceBus_Emulator/ConfigFiles/Config.json\")\n            .withNetwork(NETWORK)\n            .withMsSqlServerContainer(SQLSERVER);\n\n    @Autowired\n    private AzureServiceBusConnectionDetails connectionDetails;\n\n    @Autowired\n    private ServiceBusSenderClient senderClient;\n\n    @Autowired\n    private ServiceBusTemplate serviceBusTemplate;\n\n    @Test\n    void connectionDetailsShouldBeProvidedByFactory() {\n        assertThat(connectionDetails).isNotNull();\n        assertThat(connectionDetails.getConnectionString())\n                .isNotBlank()\n                .startsWith(\"Endpoint=sb://\");\n    }\n\n    @Test\n    void senderClientCanSendMessage() {\n        // Wait for Service Bus emulator to be fully ready and queue entity to be available\n        waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> {\n            this.senderClient.sendMessage(new ServiceBusMessage(\"Hello World!\"));\n        });\n\n        waitAtMost(Duration.ofSeconds(30)).untilAsserted(() -> {\n            assertThat(Config.MESSAGES).contains(\"Hello World!\");\n        });\n    }\n\n    @Test\n    void serviceBusTemplateCanSendMessage() {\n        // Wait for Service Bus emulator to be fully ready and queue entity to be available\n        waitAtMost(Duration.ofSeconds(120)).pollInterval(Duration.ofSeconds(2)).untilAsserted(() -> {\n            this.serviceBusTemplate.sendAsync(\"queue.1\",\n                    MessageBuilder.withPayload(\"Hello from ServiceBusTemplate!\").build()).block(Duration.ofSeconds(10));\n        });\n\n        waitAtMost(Duration.ofSeconds(30)).untilAsserted(() -> {\n            assertThat(Config.MESSAGES).contains(\"Hello from ServiceBusTemplate!\");\n        });\n    }\n\n\n    @Configuration(proxyBeanMethods = false)\n    @ImportAutoConfiguration(classes = {AzureGlobalPropertiesAutoConfiguration.class,\n            AzureServiceBusAutoConfiguration.class,\n            AzureServiceBusMessagingAutoConfiguration.class})\n    static class Config {\n\n        private static final Set<String> MESSAGES = ConcurrentHashMap.newKeySet();\n\n        @Bean\n        ServiceBusRecordMessageListener processMessage() {\n            return context -> {\n                MESSAGES.add(context.getMessage().getBody().toString());\n            };\n        }\n\n        @Bean\n        ServiceBusErrorHandler errorHandler() {\n            // No-op error handler for tests: acknowledge errors without affecting test execution.\n            return (context) -> {\n            };\n        }\n\n    }\n}\n```\n\nWith `@ServiceConnection`, this configuration enables related beans in the app to communicate with Service Bus running inside the Testcontainers-managed Docker container. This setup automatically defines an `AzureServiceBusConnectionDetails` bean, which the Service Bus autoconfiguration then uses to override any connection-related configuration properties.\n\n### [Service Bus Binder](#tab/test-for-service-bus-binder)\n\n```java\n\n@SpringJUnitConfig\n@TestPropertySource(properties = {\n        \"spring.cloud.function.definition=consume;supply\",\n        \"spring.cloud.stream.bindings.consume-in-0.destination=queue.1\",\n        \"spring.cloud.stream.bindings.supply-out-0.destination=queue.1\",\n        \"spring.cloud.stream.servicebus.bindings.consume-in-0.consumer.auto-complete=false\",\n        \"spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type=queue\",\n        \"spring.cloud.stream.poller.fixed-delay=1000\",\n        \"spring.cloud.stream.poller.initial-delay=0\"})\n@Testcontainers\nclass ServiceBusTestContainerTest {\n\n    private static final Network NETWORK = Network.newNetwork();\n\n    private static final MSSQLServerContainer<?> SQLSERVER = new MSSQLServerContainer<>(\n            \"mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04\")\n            .acceptLicense()\n            .withNetwork(NETWORK)\n            .withNetworkAliases(\"sqlserver\");\n\n    @Container\n    @ServiceConnection\n    private static final ServiceBusEmulatorContainer SERVICE_BUS = new ServiceBusEmulatorContainer(\n            \"mcr.microsoft.com/azure-messaging/servicebus-emulator:latest\")\n            .acceptLicense()\n            .withCopyFileToContainer(MountableFile.forClasspathResource(\"Config.json\"),\n                    \"/ServiceBus_Emulator/ConfigFiles/Config.json\")\n            .withNetwork(NETWORK)\n            .withMsSqlServerContainer(SQLSERVER);\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceBusTestContainerTest.class);\n    private static final Set<String> RECEIVED_MESSAGES = ConcurrentHashMap.newKeySet();\n    private static final AtomicInteger MESSAGE_SEQUENCE = new AtomicInteger(0);\n\n    @Test\n    void supplierAndConsumerShouldWorkThroughServiceBusQueue() {\n        waitAtMost(Duration.ofSeconds(60))\n                .pollDelay(Duration.ofSeconds(2))\n                .untilAsserted(() -> {\n                    assertThat(RECEIVED_MESSAGES).isNotEmpty();\n                    LOGGER.info(\"✓ Test passed - Consumer received {} message(s)\", RECEIVED_MESSAGES.size());\n                });\n    }\n\n    @Configuration(proxyBeanMethods = false)\n    @EnableAutoConfiguration\n    @ImportAutoConfiguration(classes = {\n            AzureGlobalPropertiesAutoConfiguration.class,\n            AzureServiceBusAutoConfiguration.class,\n            AzureServiceBusMessagingAutoConfiguration.class})\n    static class Config {\n\n        @Bean\n        public Supplier<Message<String>> supply() {\n            return () -> {\n                int sequence = MESSAGE_SEQUENCE.getAndIncrement();\n                String payload = \"Hello world, \" + sequence;\n                LOGGER.info(\"[Supplier] Invoked - message sequence: {}\", sequence);\n                return MessageBuilder.withPayload(payload).build();\n            };\n        }\n\n        @Bean\n        public Consumer<Message<String>> consume() {\n            return message -> {\n                String payload = message.getPayload();\n                RECEIVED_MESSAGES.add(payload);\n                LOGGER.info(\"[Consumer] Received message: {}\", payload);\n\n                Checkpointer checkpointer = (Checkpointer) message.getHeaders().get(CHECKPOINTER);\n                if (checkpointer != null) {\n                    checkpointer.success()\n                            .doOnSuccess(s -> LOGGER.info(\"[Consumer] Message checkpointed\"))\n                            .doOnError(e -> LOGGER.error(\"[Consumer] Checkpoint failed\", e))\n                            .block();\n                }\n            };\n        }\n    }\n}\n```\n\nWith `@ServiceConnection`, this configuration enables related beans in the app to communicate with Service Bus running inside the Testcontainers-managed Docker container. This setup automatically defines an `AzureServiceBusConnectionDetails` bean, which the Service Bus autoconfiguration then uses to override any connection-related configuration properties.\n\n---\n\n## Samples\n\nFor more information, see the [`spring-cloud-azure-testcontainers` examples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/spring-cloud-azure-testcontainers).\n"
  },
  {
    "path": "articles/java/spring-framework/toc.yml",
    "content": "items:\n- name: Spring Cloud Azure\n  href: index.yml\n  items:\n  - name: Overview\n    expanded: true\n    items:\n    - name: What is Spring Cloud Azure?\n      href: spring-cloud-azure-overview.md\n  - name: Get started\n    expanded: true\n    items:\n    - name: Storage\n      items:\n      - name: Upload a file to an Azure Storage Blob\n        href: configure-spring-boot-starter-java-app-with-azure-storage.md\n    - name: Security\n      items:\n      - name: Secret management\n        items:\n        - name: Load a secret from Azure Key Vault\n          href: configure-spring-boot-starter-java-app-with-azure-key-vault.md\n      - name: HTTPS / TLS\n        items:\n        - name: Enable HTTPS in Spring Boot with Azure Key Vault certificates\n          href: configure-spring-boot-starter-java-app-with-azure-key-vault-certificates.md\n      - name: Authentication and authorization\n        items:\n        - name: Add sign-in with Microsoft Entra account to a Spring web app\n          href: configure-spring-boot-starter-java-app-with-entra.md\n        - name: Secure your REST API using Spring Cloud Azure\n          href: secure-your-restful-api-using-spring-cloud-azure.md\n        - name: Add sign-in with Azure AD B2C to a Spring web app\n          href: configure-spring-boot-starter-java-app-with-azure-active-directory-b2c-oidc.md\n        - name: Microsoft Entra dev guide\n          href: spring-boot-starter-for-entra-developer-guide.md\n      - name: Passwordless connections\n        items:\n        - name: Access a database without passwords in Spring\n          href: deploy-passwordless-spring-database-app.md\n        - name: Migrate to use passwordless connections\n          items:\n          - name: Azure Database for MySQL\n            href: migrate-mysql-to-passwordless-connection.md\n          - name: Azure Database for Postgresql\n            href: migrate-postgresql-to-passwordless-connection.md\n          - name: Azure SQL Database\n            href: migrate-sql-database-to-passwordless-connection.md\n          - name: Azure Event Hubs for Kafka API\n            href: migrate-kafka-to-passwordless-connection.md\n    - name: Messaging\n      items:\n        - name: Use JMS in Spring to access Azure Service Bus\n          href: configure-spring-boot-starter-java-app-with-azure-service-bus.md\n        - name: Spring Cloud Stream with Azure Event Hubs\n          href: configure-spring-cloud-stream-binder-java-app-azure-event-hub.md\n        - name: Spring Cloud Stream with Azure Service Bus\n          href: configure-spring-cloud-stream-binder-java-app-with-service-bus.md\n        - name: Use Spring Kafka with Azure Event Hubs for Kafka API\n          href: configure-spring-cloud-stream-binder-java-app-kafka-azure-event-hub.md\n        - name: Use Azure Storage Queue in Spring applications\n          href: using-storage-queue-in-spring-applications.md\n        - name: Use Azure Service Bus in Spring applications\n          href: using-service-bus-in-spring-applications.md\n        - name: Use Event Hubs in Spring applications\n          href: using-event-hubs-in-spring-applications.md\n        - name: Use Azure Event Grid in Spring applications\n          href: configure-spring-boot-initializer-java-app-with-event-grid.md\n    - name: Database\n      items:\n      - name: NoSQL- Azure Cosmos DB\n        items:\n        - name: Azure Cosmos DB Dev Guide\n          href: how-to-guides-spring-data-cosmosdb.md\n        - name: Access data with Azure Cosmos DB NoSQL API\n          href: configure-spring-boot-starter-java-app-with-cosmos-db.md\n        - name: Azure Cosmos DB with App Service on Linux\n          href: configure-spring-app-with-cosmos-db-on-app-service-linux.md\n        - name: Use Spring Data with Azure Cosmos DB for Apache Cassandra API\n          href: configure-spring-data-apache-cassandra-with-cosmos-db.md\n        - name: Use Spring Data with Azure Cosmos DB for MongoDB API\n          href: configure-spring-data-mongodb-with-cosmos-db.md\n      - name: JDBC\n        items:\n        - name: JDBC with Azure MySQL\n          href: configure-spring-data-jdbc-with-azure-mysql.md\n        - name: JDBC with Azure PostgreSQL\n          href: configure-spring-data-jdbc-with-azure-postgresql.md\n        - name: JDBC with Azure SQL Database\n          href: configure-spring-data-jdbc-with-azure-sql-server.md\n      - name: JPA\n        items:\n        - name: JPA with Azure MySQL\n          href: configure-spring-data-jpa-with-azure-mysql.md\n        - name: JPA with Azure PostgreSQL\n          href: configure-spring-data-jpa-with-azure-postgresql.md\n        - name: JPA with Azure SQL Server\n          href: configure-spring-data-jpa-with-azure-sql-server.md\n      - name: R2DBC\n        items:\n        - name: R2DBC with Azure MySQL\n          href: configure-spring-data-r2dbc-with-azure-mysql.md\n        - name: R2DBC with Azure PostgreSQL\n          href: configure-spring-data-r2dbc-with-azure-postgresql.md\n        - name: R2DBC with Azure SQL Database\n          href: configure-spring-data-r2dbc-with-azure-sql-server.md\n    - name: Caching\n      items:\n      - name: Use Azure Redis Cache in Spring\n        href: configure-spring-boot-initializer-java-app-with-redis-cache.md\n    - name: Configuration Management\n      items:\n      - name: Externalize configuration properties to Azure App Configuration\n        href: /azure/azure-app-configuration/quickstart-java-spring-app?toc=/azure/developer/java/spring-framework/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: Use dynamic configuration\n        href: /azure/azure-app-configuration/enable-dynamic-configuration-java-spring-app?toc=/azure/developer/java/spring-framework/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: Add feature flags\n        href: /azure/azure-app-configuration/quickstart-feature-flag-spring-boot?toc=/azure/developer/java/spring-framework/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: Use feature flags\n        href: /azure/azure-app-configuration/use-feature-flags-spring-boot?toc=/azure/developer/java/spring-framework/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n      - name: Use Key Vault references\n        href: /azure/azure-app-configuration/use-key-vault-references-spring-boot?toc=/azure/developer/java/spring-framework/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n    - name: Serverless\n      items:\n      - name: Spring Cloud Function in Azure\n        href: getting-started-with-spring-cloud-function-in-azure.md\n  - name: Developer guide\n    items:\n    - name: Overview\n      href: developer-guide-overview.md\n    - name: Spring Cloud Azure configuration\n      href: configuration.md\n    - name: Spring Cloud Azure authentication\n      href: authentication.md\n    - name: Production ready\n      href: production-ready.md\n    - name: Autoconfigure Azure SDK clients\n      href: auto-configure-azure-sdk-clients.md\n    - name: Passwordless authentication\n      href: passwordless-authentication.md\n    - name: Resource handling\n      href: resource-handling.md\n    - name: Secret management\n      href: secret-management.md\n    - name: App configuration support\n      href: app-configuration-support.md\n    - name: Spring Data support\n      href: spring-data-support.md\n    - name: Spring Security support\n      href: spring-security-support.md\n    - name: Spring Integration support\n      href: spring-integration-support.md\n    - name: Spring Cloud Stream support\n      href: spring-cloud-stream-support.md\n    - name: Spring Messaging support\n      items:\n        - name: Spring Messaging Azure Event Hubs\n          href: spring-messaging-event-hubs-support.md\n        - name: Spring Messaging Azure Service Bus\n          href: spring-messaging-service-bus-support.md\n        - name: Spring Messaging Azure Storage Queue\n          href: spring-messaging-storage-queue-support.md\n    - name: Spring JMS support\n      items:\n      - name: Use Azure Service Bus with JMS\n        href: spring-jms-support.md\n      - name: Troubleshooting guide\n        href: spring-jms-troubleshooting-guide.md\n    - name: MySQL support\n      href: mysql-support.md\n    - name: PostgreSQL support\n      href: postgresql-support.md\n    - name: Kafka support\n      href: kafka-support.md\n    - name: Redis support\n      href: redis-support.md\n    - name: Azure Resource Manager\n      href: resource-manager.md\n    - name: Native image applications\n      items:\n      - name: Configuration\n        href: native-applications.md\n      - name: Monitoring\n        href: \"https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/spring/spring-cloud-azure-starter-monitor/README.md\"\n    - name: Testing\n      items:\n      - name: Testcontainers\n        href: testcontainers-support.md\n      - name: Docker Compose\n        href: docker-compose-support.md\n    - name: Create and configure a managed identity on Azure hosting services\n      href: create-and-configure-managed-identity.md\n    - name: Deploy applications to Azure hosting services\n      href: deploy-applications-to-azure-hosting-environments.md\n  - name: Reference\n    items:\n    - name: Application properties\n      items:\n      - name: Common properties\n        href: ./configuration-properties-global.md\n      - name: Microsoft Entra properties\n        href: ./configuration-properties-entra.md\n      - name: Azure AD B2C properties\n        href: ./configuration-properties-azure-active-directory-b2c.md\n      - name: Azure App Configuration properties\n        href: ./configuration-properties-azure-app-configuration.md\n      - name: Azure Cosmos DB properties\n        href: ./configuration-properties-azure-cosmos-db.md\n      - name: Azure Event Hubs properties\n        href: ./configuration-properties-azure-event-hubs.md\n      - name: Azure Key Vault properties\n        href: ./configuration-properties-azure-key-vault.md\n      - name: Azure Key Vault Secrets properties\n        href: ./configuration-properties-azure-key-vault-secrets.md\n      - name: Azure Key Vault Certificates properties\n        href: ./configuration-properties-azure-key-vault-certificates.md\n      - name: Azure Service Bus properties\n        href: ./configuration-properties-azure-service-bus.md\n      - name: Azure Service Bus JMS properties\n        href: ./configuration-properties-azure-service-bus-jms.md\n      - name: Azure Storage properties\n        href: ./configuration-properties-azure-storage.md\n      - name: Azure Storage Blob properties\n        href: ./configuration-properties-azure-storage-blob.md\n      - name: Azure Storage File Share properties\n        href: ./configuration-properties-azure-storage-file-share.md\n      - name: Azure Storage Queue properties\n        href: ./configuration-properties-azure-storage-queue.md\n      - name: All configuration properties\n        href: ./configuration-properties-all.md\n    - name: Migration Guide For 4.0\n      href: ./migration-guide-for-4.0.md\n    - name: Spring Cloud Azure on Spring IO\n      href: https://spring.io/projects/spring-cloud-azure\n    - name: Spring Cloud Azure on StackOverflow\n      href: https://stackoverflow.com/questions/tagged/spring-cloud-azure\n    - name: Spring Cloud Azure on GitHub\n      href: https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/spring\n    - name: Spring Cloud Azure Samples\n      href: https://github.com/Azure-Samples/azure-spring-boot-samples\n    - name: Spring Guides\n      href: https://spring.io/guides\n    - name: Spring Initializr\n      href: https://start.spring.io/\n    - name: Spring Projects\n      href: https://spring.io/projects\n    - name: Spring Boot\n      href: https://spring.io/projects/spring-boot/\n    - name: Spring Framework\n      href: https://spring.io/projects/spring-framework\n"
  },
  {
    "path": "articles/java/spring-framework/using-event-hubs-in-spring-applications.md",
    "content": "---\ntitle: Using Event Hubs in Spring applications\ndescription: This article shows you how to use Azure Event Hubs in Java applications built with Spring framework.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiada\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Use Event Hubs in Spring applications\n\nThis article shows you how to use Azure Event Hubs in Java applications built with the [Spring Framework](https://spring.io/projects/spring-framework).\n\n[Azure Event Hubs](/azure/event-hubs/event-hubs-about) is a big data streaming platform and event ingestion service. It can receive and process millions of events per second. Data sent to an event hub can be transformed and stored by using any real-time analytics provider or batching/storage adapters.\n\nSpring Cloud Azure provides various modules for sending messages to and receiving messages from Event Hubs using Spring frameworks.\n\nYou can use the following modules independently or combine them for different use cases:\n\n- [Spring Cloud Azure Event Hubs Starter](#use-spring-cloud-azure-event-hubs-starter) enables you to send and receive messages with Event Hubs Java SDK client library with Spring Boot features.\n\n- [Spring Messaging Azure Event Hubs](#use-spring-messaging-azure-event-hubs) enables you to interact with Event Hubs via [Spring Messaging](https://docs.spring.io/spring-boot/docs/current/reference/html/messaging.html) API.\n\n- [Spring Integration Azure Event Hubs](#use-spring-integration-azure-event-hubs) enables you to connect Spring Integration [Message Channels](https://docs.spring.io/spring-integration/reference/channel.html) with Event Hubs.\n\n- [Spring Cloud Azure Stream Event Hubs Binder](#use-spring-cloud-azure-stream-event-hubs-binder) enables you to use Event Hubs as a messaging middleware in Spring Cloud Stream applications.\n\n- [Spring Kafka with Azure Event Hubs](#use-spring-kafka-with-azure-event-hubs) enables you to use [Spring Kafka](https://docs.spring.io/spring-kafka/reference/index.html) to send messages to and receive messages from Event Hubs.\n\n- [Spring Cloud Stream Kafka Binder with Azure Event Hubs](#use-spring-cloud-stream-kafka-binder-with-azure-event-hubs) enables you to send and receive message via Spring Cloud Stream Kafka Binder with Event Hubs.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n\n- An Azure Event Hubs instance. For more information, see [Quickstart: Create an event hub using Azure portal](/azure/event-hubs/event-hubs-create).\n\n- An Azure Storage Account for Event Hubs checkpoints. For more information, see [Create a storage account](/azure/storage/common/storage-account-create?tabs=azure-portal).\n\n- A Spring Boot application. If you don't have one, create a **Maven project** with the [Spring Initializr](https://start.spring.io/). Remember to select **Maven Project** and, under **Dependencies**, add the **Spring Web** dependency, then select Java version 8 or higher.\n\n> [!NOTE]\n> To grant your account access to resources, in Azure Event Hubs, assign the `Azure Event Hubs Data Receiver` and `Azure Event Hubs Data Sender` role to the Microsoft Entra account you're currently using. Then, in the Azure Storage account, assign the `Storage Blob Data Contributor` role to the Microsoft Entra account you're currently using. For more information about granting access roles, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal) and [Authorize access to Event Hubs resources using Microsoft Entra ID](/azure/event-hubs/authorize-access-azure-active-directory).\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this tutorial.\n\n[!INCLUDE [prepare-your-local-environment](includes/prepare-your-local-environment.md)]\n\n## Use Spring Cloud Azure Event Hubs Starter\n\nThe [Spring Cloud Azure Event Hubs Starter](https://mvnrepository.com/artifact/com.azure.spring/spring-cloud-azure-starter-eventhubs) module imports the [Event Hubs Java client library](https://mvnrepository.com/artifact/com.azure/azure-messaging-eventhubs) with the Spring Boot framework. You can use Spring Cloud Azure and the Azure SDK together, in a non-mutually exclusive pattern. Thus, you can continue using the Event Hubs Java client API in your Spring application.\n\n### Add dependencies\n\nTo install the Spring Cloud Azure Event Hubs Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Event Hubs artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-eventhubs</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\nThis guide teaches you how to use the Event Hubs Java clients in the context of a Spring application. Here, we introduce the following two options:\n\n- Use Spring Boot autoconfiguration and use out-of-the-box clients from the Spring context (recommended).\n- Build the client programmatically.\n\nThe way of autowiring client beans from the Spring IoC container has the following advantages, which can provide you with a more flexible and efficient experience when developing with Event Hubs clients:\n\n- It applies the [externalized configuration](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.external-config) so that you can work with the same application code in different environments.\n- You can delegate to the Spring Boot framework the process of learning the builder pattern and registering this client to the application context. This delegation enables you to focus on how to use the clients with your own business requirement.\n- You can use health indicator in an easy way to inspect the status and health of your application and internal components.\n\nThe following sections provide code examples that show you how to use `EventProcessorClient` and `EventHubProducerClient` with the two alternatives.\n\n> [!NOTE]\n> Azure Java SDK for Event Hubs provides multiple clients to interact with Event Hubs. The starter also provides autoconfiguration for all the Event Hubs clients as well as client builders. This article uses only `EventProcessorClient` and `EventHubProducerClient` as examples.\n\n#### Use Spring Boot Autoconfiguration\n\nTo send messages to and receive messages from Event Hubs, configure the application by using the following steps:\n\n1. Use the following property settings to configure your Event Hubs namespace and event hub name:\n\n   ```properties\n   spring.cloud.azure.eventhubs.namespace=<your event-hubs-namespace>\n   spring.cloud.azure.eventhubs.event-hub-name=<your-event-hub-name>\n   spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name=<your-storage-account-name>\n   spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name=<your-storage-account-container-name>\n   spring.cloud.azure.eventhubs.processor.consumer-group=$Default\n   ```\n\n1. Create a new `EventHubProcessorClientConfiguration` Java class as shown in the following example. This class is used to register the message and error handler for `EventProcessorClient`.\n\n   ```java\n   import com.azure.spring.cloud.service.eventhubs.consumer.EventHubsErrorHandler;\n   import com.azure.spring.cloud.service.eventhubs.consumer.EventHubsRecordMessageListener;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.context.annotation.Configuration;\n\n   @Configuration\n   public class EventHubProcessorClientConfiguration {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(EventHubProcessorClientConfiguration.class);\n\n       @Bean\n       EventHubsRecordMessageListener processEvent() {\n           return eventContext->LOGGER.info(\"Processing event from partition {} with sequence number {} with body: {}\",\n               eventContext.getPartitionContext().getPartitionId(), eventContext.getEventData().getSequenceNumber(),\n               eventContext.getEventData().getBodyAsString());\n       }\n\n       @Bean\n       EventHubsErrorHandler processError() {\n           return errorContext->LOGGER.info(\"Error occurred in partition processor for partition {}, {}\",\n               errorContext.getPartitionContext().getPartitionId(),\n               errorContext.getThrowable());\n       }\n\n   }\n   ```\n\n1. Inject the `EventProcessorClient` and `EventHubProducerClient` in your Spring application, and call the related APIs to send and receive messages, as shown in the following example:\n\n   ```java\n   import com.azure.messaging.eventhubs.EventData;\n   import com.azure.messaging.eventhubs.EventHubProducerClient;\n   import com.azure.messaging.eventhubs.EventProcessorClient;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n\n   import java.util.Collections;\n   import java.util.concurrent.TimeUnit;\n\n   @SpringBootApplication\n   public class EventHubClientApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(EventHubClientApplication.class);\n       private final EventHubProducerClient eventHubProducerClient;\n       private final EventProcessorClient eventProcessorClient;\n\n       public EventHubClientApplication(EventHubProducerClient eventHubProducerClient,\n                                        EventProcessorClient eventProcessorClient) {\n           this.eventHubProducerClient = eventHubProducerClient;\n           this.eventProcessorClient = eventProcessorClient;\n       }\n\n       public static void main(String[] args) {\n           SpringApplication.run(EventHubClientApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) throws Exception {\n           eventProcessorClient.start();\n           // Wait for the processor client to be ready\n           TimeUnit.SECONDS.sleep(10);\n\n           eventHubProducerClient.send(Collections.singletonList(new EventData(\"Hello World\")));\n           LOGGER.info(\"Successfully sent a message to Event Hubs.\");\n           eventHubProducerClient.close();\n           LOGGER.info(\"Skip stopping and closing the processor since the processor may not complete the receiving process yet.\");\n       }\n\n   }\n   ```\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Successfully sent a message to Event Hubs.\n   ...\n   Processing event from partition 0 with sequence number 0 with body: Hello World\n   ...\n   Stopping and closing the processor.\n   ```\n\n#### Build the client programmatically\n\nYou can build the client beans by yourself, but the process is complicated. In Spring Boot applications, you have to manage properties, learn the builder pattern, and register the client to your Spring application context. The following steps show you how to do that:\n\n1. Create a new `EventHubClientConfiguration` Java class as shown in the following example. This class is used to declare the `EventProcessorClient` and `EventHubProducerClient` beans. Be sure to replace the `<your event-hubs-namespace>`, `<your-event-hub-name>`, `<your-storage-account-name>`, and `<your-storage-account-container-name>` placeholders with your actual values.\n\n   ```java\n   import com.azure.identity.DefaultAzureCredentialBuilder;\n   import com.azure.messaging.eventhubs.EventHubClientBuilder;\n   import com.azure.messaging.eventhubs.EventHubProducerClient;\n   import com.azure.messaging.eventhubs.EventProcessorClient;\n   import com.azure.messaging.eventhubs.EventProcessorClientBuilder;\n   import com.azure.messaging.eventhubs.checkpointstore.blob.BlobCheckpointStore;\n   import com.azure.messaging.eventhubs.models.ErrorContext;\n   import com.azure.messaging.eventhubs.models.EventContext;\n   import com.azure.storage.blob.BlobContainerAsyncClient;\n   import com.azure.storage.blob.BlobContainerClientBuilder;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.context.annotation.Configuration;\n\n   @Configuration\n   public class EventHubClientConfiguration {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(EventHubClientConfiguration.class);\n       private static final String EVENT_HUB_FULLY_QUALIFIED_NAMESPACE = \"<your event-hubs-namespace>.servicebus.windows.net\";\n       private static final String EVENT_HUB_NAME = \"<your-event-hub-name>\";\n       private static final String CONSUMER_GROUP = \"$Default\";\n       private static final String STORAGE_ACCOUNT_ENDPOINT = \"https://<your-storage-account-name>.blob.core.windows.net\";\n       private static final String STORAGE_CONTAINER_NAME = \"<your-storage-account-container-name>\";\n\n       @Bean\n       EventHubClientBuilder eventHubClientBuilder() {\n           return new EventHubClientBuilder().credential(EVENT_HUB_FULLY_QUALIFIED_NAMESPACE, EVENT_HUB_NAME,\n               new DefaultAzureCredentialBuilder()\n                   .build());\n       }\n\n       @Bean\n       BlobContainerClientBuilder blobContainerClientBuilder() {\n           return new BlobContainerClientBuilder().credential(new DefaultAzureCredentialBuilder()\n                                                      .build())\n                                                  .endpoint(STORAGE_ACCOUNT_ENDPOINT)\n                                                  .containerName(STORAGE_CONTAINER_NAME);\n       }\n\n       @Bean\n       BlobContainerAsyncClient blobContainerAsyncClient(BlobContainerClientBuilder blobContainerClientBuilder) {\n           return blobContainerClientBuilder.buildAsyncClient();\n       }\n\n       @Bean\n       EventProcessorClientBuilder eventProcessorClientBuilder(BlobContainerAsyncClient blobContainerAsyncClient) {\n           return new EventProcessorClientBuilder().credential(EVENT_HUB_FULLY_QUALIFIED_NAMESPACE, EVENT_HUB_NAME,\n                                                       new DefaultAzureCredentialBuilder()\n                                                           .build())\n                                                   .consumerGroup(CONSUMER_GROUP)\n                                                   .checkpointStore(new BlobCheckpointStore(blobContainerAsyncClient))\n                                                   .processEvent(EventHubClientConfiguration::processEvent)\n                                                   .processError(EventHubClientConfiguration::processError);\n       }\n\n       @Bean\n       EventHubProducerClient eventHubProducerClient(EventHubClientBuilder eventHubClientBuilder) {\n           return eventHubClientBuilder.buildProducerClient();\n\n       }\n\n       @Bean\n       EventProcessorClient eventProcessorClient(EventProcessorClientBuilder eventProcessorClientBuilder) {\n           return eventProcessorClientBuilder.buildEventProcessorClient();\n       }\n\n       public static void processEvent(EventContext eventContext) {\n           LOGGER.info(\"Processing event from partition {} with sequence number {} with body: {}\",\n               eventContext.getPartitionContext().getPartitionId(), eventContext.getEventData().getSequenceNumber(),\n               eventContext.getEventData().getBodyAsString());\n       }\n\n       public static void processError(ErrorContext errorContext) {\n           LOGGER.info(\"Error occurred in partition processor for partition {}, {}\",\n               errorContext.getPartitionContext().getPartitionId(),\n               errorContext.getThrowable());\n       }\n\n   }\n   ```\n\n1. Inject the `EventProcessorClient` and `EventHubProducerClient` in your Spring application, as shown in the following example:\n\n   ```java\n   import com.azure.messaging.eventhubs.EventData;\n   import com.azure.messaging.eventhubs.EventHubProducerClient;\n   import com.azure.messaging.eventhubs.EventProcessorClient;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n\n   import java.util.Collections;\n   import java.util.concurrent.TimeUnit;\n\n   @SpringBootApplication\n   public class EventHubClientApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(EventHubClientApplication.class);\n       private final EventHubProducerClient eventHubProducerClient;\n       private final EventProcessorClient eventProcessorClient;\n\n       public EventHubClientApplication(EventHubProducerClient eventHubProducerClient,\n                                        EventProcessorClient eventProcessorClient) {\n           this.eventHubProducerClient = eventHubProducerClient;\n           this.eventProcessorClient = eventProcessorClient;\n       }\n\n       public static void main(String[] args) {\n           SpringApplication.run(EventHubClientApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) throws Exception {\n           eventProcessorClient.start();\n           // Wait for the processor client to be ready\n           TimeUnit.SECONDS.sleep(10);\n\n           eventHubProducerClient.send(Collections.singletonList(new EventData(\"Hello World\")));\n           LOGGER.info(\"Successfully sent a message to Event Hubs.\");\n           eventHubProducerClient.close();\n           LOGGER.info(\"Stopping and closing the processor\");\n           eventProcessorClient.stop();\n       }\n\n   }\n   ```\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Successfully sent a message to Event Hubs.\n   ...\n   Processing event from partition 0 with sequence number 0 with body: Hello World\n   ...\n   Stopping and closing the processor.\n   ```\n\nThe following list shows some reasons why this code isn't flexible or graceful:\n\n- The Event Hubs namespace and event hub name are hard coded.\n- If you use `@Value` to get configurations from the Spring environment, you can't have IDE hints in your **application.properties** file.\n- If you have a microservice scenario, you must duplicate the code in each project, and it's easy to make mistakes and hard to be consistent.\n\nFortunately, building the client beans by yourself isn't necessary with Spring Cloud Azure. Instead, you can directly inject them and use the configuration properties that you're already familiar with to configure Storage queue. For more information, see [Spring Cloud Azure configuration](configuration.md).\n\nSpring Cloud Azure also provides the following global configurations for different scenarios. For more information, see the [Global configuration for Azure Service SDKs](configuration.md#global-configuration-for-azure-service-sdks) section of the [Spring Cloud Azure configuration](configuration.md).\n\n- Proxy options.\n- Retry options.\n- AMQP transport client options.\n\nYou can also connect to different Azure clouds. For more information, see [Connect to different Azure clouds](https://devblogs.microsoft.com/azure-sdk/announcing-the-stable-release-of-spring-cloud-azure-version-4-4-0/#connect-to-different-azure-clouds).\n\n## Use Spring Messaging Azure Event Hubs\n\nThe [Spring Messaging Azure Event Hubs](https://mvnrepository.com/artifact/com.azure.spring/spring-messaging-azure-eventhubs) module provides support for [Spring Messaging](https://docs.spring.io/spring-boot/docs/current/reference/html/messaging.html) framework with Event Hubs.\n\nIf you're using Spring Messaging Azure Event Hubs, then you can use the following features:\n\n- `EventHubsTemplate`: Send messages to an Event Hubs asynchronously and synchronously.\n- `@EventHubsListener`: Mark a method to be the target of an Event Hubs message listener on the destination.\n\nThis guide shows you how to use Spring Messaging Azure Event Hubs to send messages to and receive messages from Event Hubs.\n\n### Add dependencies\n\nTo install the Spring Messaging Azure Event Hubs module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure starter, Spring Messaging Event Hubs and Azure Event Hubs Checkpoint Store artifacts:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n  </dependency>\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-messaging-azure-eventhubs</artifactId>\n  </dependency>\n  <dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-messaging-eventhubs-checkpointstore-blob</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\nTo send messages to and receive messages from Event Hubs, configure the application by using the following steps:\n\n1. Use the following property settings to configure the Event Hubs namespace and Storage Blob:\n\n   ```properties\n   spring.cloud.azure.eventhubs.namespace=<your event-hubs-namespace>\n   spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name=<your-storage-account-name>\n   spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name=<your-storage-account-container-name>\n   ```\n\n1. Create a new `ConsumerService` Java class as shown in the following example. This class is used to define a message receiver. Be sure to replace the `<your-event-hub-name>` placeholder with your actual value.\n\n   ```java\n   import com.azure.spring.messaging.eventhubs.implementation.core.annotation.EventHubsListener;\n   import org.springframework.stereotype.Service;\n\n   @Service\n   public class ConsumerService {\n\n       private static final String EVENT_HUB_NAME = \"<your-event-hub-name>\";\n       private static final String CONSUMER_GROUP = \"$DEFAULT\";\n\n       @EventHubsListener(destination = EVENT_HUB_NAME, group = CONSUMER_GROUP)\n       public void handleMessageFromEventHub(String message) {\n           System.out.printf(\"New message received: %s%n\", message);\n       }\n\n   }\n   ```\n\n1. Wire up a sender and a receiver to send and receive messages with Spring, as shown in the following example. Be sure to replace the `<your-event-hub-name>` placeholder with your actual value.\n\n   ```java\n   import com.azure.spring.messaging.eventhubs.core.EventHubsTemplate;\n   import com.azure.spring.messaging.implementation.annotation.EnableAzureMessaging;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.context.ConfigurableApplicationContext;\n   import org.springframework.messaging.support.MessageBuilder;\n\n   @SpringBootApplication\n   @EnableAzureMessaging\n   public class EventHubMessagingApplication {\n\n       private static final String EVENT_HUB_NAME = \"<your-event-hub-name>\";\n       private static final Logger LOGGER = LoggerFactory.getLogger(EventHubMessagingApplication.class);\n\n       public static void main(String[] args) {\n           ConfigurableApplicationContext applicationContext = SpringApplication.run(EventHubMessagingApplication.class);\n           EventHubsTemplate eventHubsTemplate = applicationContext.getBean(EventHubsTemplate.class);\n           LOGGER.info(\"Sending a message to the Event Hubs.\");\n           eventHubsTemplate.sendAsync(EVENT_HUB_NAME, MessageBuilder.withPayload(\"Hello world\").build()).subscribe();\n       }\n\n   }\n   ```\n\n   > [!TIP]\n   > Remember to add the `@EnableAzureMessaging` annotation, which triggers the discovery of methods annotated with `@EventHubsListener`, creating the message listener container under the covers.\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Sending a message to the Event Hubs.\n   New message received: Hello world\n   ```\n\n## Use Spring Integration Azure Event Hubs\n\nThe [Spring Integration Azure Event Hubs](https://mvnrepository.com/artifact/com.azure.spring/spring-integration-azure-eventhubs) module provides support for the [Spring Integration](https://docs.spring.io/spring-boot/docs/current/reference/html/messaging.html) framework with Event Hubs.\n\nIf your Spring application uses Spring Integration message channels, you can route messages between your message channels and Event Hubs using channel adapters.\n\nAn inbound channel adapter forwards messages from an event hub to a message channel.\nAn outbound channel adapter publishes messages from a message channel to an event hub.\n\nThis guide shows you how to use Spring Integration Azure Event Hubs to send messages to and receive messages from Event Hubs.\n\n### Add dependencies\n\nTo install the Spring Cloud Azure Event Hubs Integration Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Event Hubs Integration artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-integration-eventhubs</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\nTo send messages to and receive messages from Event Hubs, configure the application by using the following steps:\n\n1. Use the following property settings to configure the Event Hubs namespace and Storage Blob:\n\n   ```properties\n   spring.cloud.azure.eventhubs.namespace=<your event-hubs-namespace>\n   spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name=<your-storage-account-name>\n   spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name=<your-storage-account-container-name>\n   ```\n\n1. Create a new `MessageReceiveConfiguration` Java class as shown in the following example. This class is used to define a message receiver. Be sure to replace the `<your-event-hub-name>` placeholder with your actual value.\n\n   ```java\n   import com.azure.spring.integration.eventhubs.inbound.EventHubsInboundChannelAdapter;\n   import com.azure.spring.messaging.eventhubs.core.EventHubsProcessorFactory;\n   import com.azure.spring.messaging.eventhubs.core.checkpoint.CheckpointConfig;\n   import com.azure.spring.messaging.eventhubs.core.checkpoint.CheckpointMode;\n   import com.azure.spring.messaging.eventhubs.core.listener.EventHubsMessageListenerContainer;\n   import com.azure.spring.messaging.eventhubs.core.properties.EventHubsContainerProperties;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.beans.factory.annotation.Qualifier;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.context.annotation.Configuration;\n   import org.springframework.integration.annotation.ServiceActivator;\n   import org.springframework.integration.channel.DirectChannel;\n   import org.springframework.messaging.MessageChannel;\n\n   @Configuration\n   public class MessageReceiveConfiguration {\n\n       private static final String INPUT_CHANNEL = \"input\";\n       private static final String EVENT_HUB_NAME = \"<your-event-hub-name>\";\n       private static final String CONSUMER_GROUP = \"$Default\";\n       private static final Logger LOGGER = LoggerFactory.getLogger(MessageReceiveConfiguration.class);\n\n       @ServiceActivator(inputChannel = INPUT_CHANNEL)\n       public void messageReceiver(byte[] payload) {\n           String message = new String(payload);\n           LOGGER.info(\"New message received: {}\", message);\n       }\n\n       @Bean\n       public EventHubsMessageListenerContainer messageListenerContainer(EventHubsProcessorFactory processorFactory) {\n           EventHubsContainerProperties containerProperties = new EventHubsContainerProperties();\n           containerProperties.setEventHubName(EVENT_HUB_NAME);\n           containerProperties.setConsumerGroup(CONSUMER_GROUP);\n           containerProperties.setCheckpointConfig(new CheckpointConfig(CheckpointMode.MANUAL));\n           return new EventHubsMessageListenerContainer(processorFactory, containerProperties);\n       }\n\n       @Bean\n       public EventHubsInboundChannelAdapter messageChannelAdapter(@Qualifier(INPUT_CHANNEL) MessageChannel inputChannel,\n                                                                   EventHubsMessageListenerContainer listenerContainer) {\n           EventHubsInboundChannelAdapter adapter = new EventHubsInboundChannelAdapter(listenerContainer);\n           adapter.setOutputChannel(inputChannel);\n           return adapter;\n       }\n\n       @Bean\n       public MessageChannel input() {\n           return new DirectChannel();\n       }\n\n   }\n   ```\n\n1. Create a new `MessageSendConfiguration` Java class as shown in the following example. This class is used to define a message sender. Be sure to replace the `<your-event-hub-name>` placeholder with your actual value.\n\n   ```java\n   import com.azure.spring.integration.core.handler.DefaultMessageHandler;\n   import com.azure.spring.messaging.eventhubs.core.EventHubsTemplate;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.context.annotation.Configuration;\n   import org.springframework.integration.annotation.MessagingGateway;\n   import org.springframework.integration.annotation.ServiceActivator;\n   import org.springframework.messaging.MessageHandler;\n   import org.springframework.util.concurrent.ListenableFutureCallback;\n\n   @Configuration\n   public class MessageSendConfiguration {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(MessageSendConfiguration.class);\n       private static final String OUTPUT_CHANNEL = \"output\";\n       private static final String EVENT_HUB_NAME = \"<your-event-hub-name>\";\n\n       @Bean\n       @ServiceActivator(inputChannel = OUTPUT_CHANNEL)\n       public MessageHandler messageSender(EventHubsTemplate eventHubsTemplate) {\n           DefaultMessageHandler handler = new DefaultMessageHandler(EVENT_HUB_NAME, eventHubsTemplate);\n           handler.setSendCallback(new ListenableFutureCallback<Void>() {\n               @Override\n               public void onSuccess(Void result) {\n                   LOGGER.info(\"Message was sent successfully.\");\n               }\n\n               @Override\n               public void onFailure(Throwable ex) {\n                   LOGGER.error(\"There was an error sending the message.\", ex);\n               }\n           });\n\n           return handler;\n       }\n\n       @MessagingGateway(defaultRequestChannel = OUTPUT_CHANNEL)\n       public interface EventHubOutboundGateway {\n           void send(String text);\n       }\n\n   }\n   ```\n\n1. Wire up a sender and a receiver to send and receive messages with Spring, as shown in the following example:\n\n   ```java\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.context.ConfigurableApplicationContext;\n   import org.springframework.context.annotation.Configuration;\n   import org.springframework.integration.config.EnableIntegration;\n\n   @SpringBootApplication\n   @EnableIntegration\n   @Configuration(proxyBeanMethods = false)\n   public class EventHubIntegrationApplication {\n\n       public static void main(String[] args) {\n           ConfigurableApplicationContext applicationContext = SpringApplication.run(EventHubIntegrationApplication.class, args);\n           MessageSendConfiguration.EventHubOutboundGateway outboundGateway = applicationContext.getBean(MessageSendConfiguration.EventHubOutboundGateway.class);\n           outboundGateway.send(\"Hello World\");\n       }\n   }\n   ```\n\n   > [!TIP]\n   > Remember to add the `@EnableIntegration` annotation, which enables the Spring Integration infrastructure.\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Message was sent successfully.\n   New message received: Hello World\n   ```\n\n## Use Spring Cloud Azure Stream Event Hubs Binder\n\nTo call the Event Hubs API in a [Spring Cloud Stream](https://spring.io/projects/spring-cloud-stream) application, use the Spring Cloud Azure Event Hubs Stream Binder module.\n\nThis guide shows you how to use Spring Cloud Stream Event Hubs Binder to send messages to and receive messages from Event Hubs.\n\n### Add dependencies\n\nTo install the Spring Cloud Azure Event Hubs Stream Binder module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Event Hubs Stream Binder artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-stream-binder-eventhubs</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\nTo send messages to and receive messages from Event Hubs, configure the application by using the following steps:\n\n1. Use the following property settings to configure the Event Hubs namespace and Storage Blob:\n\n   ```properties\n   spring.cloud.azure.eventhubs.namespace=<your event-hubs-namespace>\n   spring.cloud.azure.eventhubs.processor.checkpoint-store.account-name=<your-storage-account-name>\n   spring.cloud.azure.eventhubs.processor.checkpoint-store.container-name=<your-storage-account-container-name>\n   ```\n\n1. Create the message receiver.\n\n   To use your application as an event sink, configure the input binder by completing the following tasks:\n\n   - Declare a `Consumer` bean that defines message handling logic. For example, the following `Consumer` bean is named `consume`:\n\n     ```java\n      @Bean\n      public Consumer<Message<String>> consume() {\n          return message -> {\n              System.out.printf(\"New message received: %s%n\", message.getPayload());\n          };\n      }\n      ```\n\n   - Add the following configuration to specify the `Event Hub` name for consuming. Be sure to replace the `<your-event-hub-name>` placeholder with your actual value.\n\n     ```properties\n     # name for the above `Consumer` bean\n     spring.cloud.stream.function.definition=consume\n     spring.cloud.stream.bindings.consume-in-0.destination=<your-event-hub-name>\n     spring.cloud.stream.bindings.consume-in-0.group=$Default\n     spring.cloud.stream.eventhubs.bindings.consume-in-0.consumer.checkpoint.mode=MANUAL\n     ```\n\n1. Create the message sender.\n\n   To use your application as an event source, configure the output binder by completing the following tasks:\n\n   - Define a `Supplier` bean that defines where messages come from within your application, as shown in the following example:\n\n     ```java\n     @Bean\n     public Supplier<Message<String>> supply() {\n         return () -> {\n             System.out.println(\"Sending a message.\");\n             return MessageBuilder.withPayload(\"Hello world\").build();\n         };\n     }\n     ```\n\n   - Add the following configuration to specify the `Event Hub` name for sending. Be sure to replace the `<your-event-hub-name>` placeholder with your actual value.\n\n     ```properties\n     # \"consume\" is added from the above step\n     spring.cloud.stream.function.definition=consume;supply\n     spring.cloud.stream.bindings.supply-out-0.destination=<your-event-hub-name>\n     ```\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Sending a message.\n   New message received: Hello world.\n   ```\n\n## Use Spring Kafka with Azure Event Hubs\n\nEvent Hubs provides a Kafka endpoint that your existing Kafka based applications can use. This approach provides an alternative to running your own Kafka cluster. Event Hubs works with many of your existing Kafka applications. For more information, see [Event Hubs for Apache Kafka](/azure/event-hubs/azure-event-hubs-kafka-overview).\n\nThis guide shows you how to use Azure Event Hubs and [Spring Kafka](https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka) to send messages to and receive messages from Event Hubs.\n\n### Add dependencies\n\nTo install the Spring Cloud Azure starter and Spring Kafka modules, adding the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure starter and Spring Kafka artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n  </dependency>\n  <dependency>\n    <groupId>org.springframework.kafka</groupId>\n    <artifactId>spring-kafka</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\nTo send messages to and receive messages from Event Hubs, configure the application by using the following steps:\n\n1. Use the following property setting to configure the Event Hubs namespace:\n\n   ```properties\n   spring.kafka.bootstrap-servers=<your event-hubs-namespace>.servicebus.windows.net:9093\n   ```\n\n1. Use `KafkaTemplate` to send messages and `@KafkaListener` to receive messages, as shown in the following example. Be sure to replace the `<your-event-hub-name>` placeholder with your actual value.\n\n   ```java\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.kafka.annotation.KafkaListener;\n   import org.springframework.kafka.core.KafkaTemplate;\n\n   @SpringBootApplication\n   public class EventHubKafkaApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(EventHubKafkaApplication.class);\n       private static final String EVENT_HUB_NAME = \"<your-event-hub-name>\";\n       private static final String CONSUMER_GROUP = \"$Default\";\n       private final KafkaTemplate<String, String> kafkaTemplate;\n\n       public EventHubKafkaApplication(KafkaTemplate<String, String> kafkaTemplate) {\n           this.kafkaTemplate = kafkaTemplate;\n       }\n\n       public static void main(String[] args) {\n           SpringApplication.run(EventHubKafkaApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n           kafkaTemplate.send(EVENT_HUB_NAME, \"Hello World\");\n           LOGGER.info(\"Message was sent successfully.\");\n       }\n\n       @KafkaListener(topics = EVENT_HUB_NAME, groupId = CONSUMER_GROUP)\n       public void receive(String message) {\n           LOGGER.info(\"New message received: {}\", message);\n       }\n\n   }\n   ```\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Message was sent successfully.\n   New message received: Hello world\n   ```\n\n## Use Spring Cloud Stream Kafka Binder with Azure Event Hubs\n\nSpring Cloud Stream is a framework that enables application developers to write message-driven microservices. The bridge between a messaging system and Spring Cloud Stream is through the binder abstraction. Binders exist for several messaging systems, but one of the most commonly used binders is for Apache Kafka.\n\nThis guide shows you how to use Azure Event Hubs and [Spring Cloud Stream Kafka Binder](https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-stream-kafka) to send messages to and receive messages from Event Hubs.\n\n### Add dependencies\n\nTo install the Spring Cloud Azure starter and Spring Cloud Stream binder Kafka modules, adding the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure starter artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n  </dependency>\n  <dependency>\n    <groupId>org.springframework.cloud</groupId>\n    <artifactId>spring-cloud-stream-binder-kafka</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\nTo send messages to and receive messages from Event Hubs, configure the application by using the following steps:\n\n1. Use the following property setting to configure the Kafka broker:\n\n   ```properties\n   spring.cloud.stream.kafka.binder.brokers=<your event-hubs-namespace>.servicebus.windows.net:9093\n   ```\n\n1. Create the message receiver.\n\n   To use your application as an event sink, configure the input binder by completing the following tasks:\n\n   - Declare a `Consumer` bean that defines message handling logic. For example, the following `Consumer` bean is named `consume`:\n\n     ```java\n     @Bean\n     public Consumer<Message<String>> consume() {\n         return message -> {\n             System.out.printf(\"New message received: %s%n\", message.getPayload());\n         };\n     }\n     ```\n\n   - Add the following configuration to specify the `Event Hub` name for consuming. Be sure to replace the `<your-event-hub-name>` placeholder with your actual value.\n\n     ```properties\n     # name for the above `Consumer` bean\n     spring.cloud.stream.function.definition=consume\n     spring.cloud.stream.bindings.consume-in-0.destination=<your-event-hub-name>\n     spring.cloud.stream.bindings.consume-in-0.group=$Default\n     ```\n\n1. Create the message sender.\n\n   To use your application as an event source, configure the output binder by completing the following tasks:\n\n   - Define a `Supplier` bean that defines where messages come from within your application, as shown in the following example:\n\n     ```java\n     @Bean\n     public Supplier<Message<String>> supply() {\n         return () -> {\n             System.out.println(\"Sending a message.\");\n             return MessageBuilder.withPayload(\"Hello world\").build();\n         };\n     }\n     ```\n\n   - Add the following configuration to specify the `Event Hub` name for sending. Be sure to replace the `<your-event-hub-name>` placeholder with your actual value.\n\n     ```properties\n     # \"consume\" is added from the above step\n     spring.cloud.stream.function.definition=consume;supply\n     spring.cloud.stream.bindings.supply-out-0.destination=<your-event-hub-name>\n     ```\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Sending a message.\n   New message received: Hello world.\n   ```\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Event Hubs Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/eventhubs)\n\n### See also\n\nFor more information about the other Spring Boot Starters that are available for Microsoft Azure, see [What is Spring Cloud Azure?](spring-cloud-azure-overview.md)\n"
  },
  {
    "path": "articles/java/spring-framework/using-service-bus-in-spring-applications.md",
    "content": "---\ntitle: Use Azure Service Bus in Spring applications\ndescription: Shows you how to use Azure Service Bus in Java applications built with the Spring framework.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: xiada\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, devx-track-extended-java\n---\n\n# Use Azure Service Bus in Spring applications\n\nThis article shows you how to use Azure Service Bus in Java applications built with [Spring Framework](https://spring.io/projects/spring-framework).\n\nAzure provides an asynchronous messaging platform called [Azure Service Bus](/azure/service-bus-messaging/service-bus-messaging-overview) (Service Bus), which is based on the [Advanced Message Queueing Protocol 1.0](http://www.amqp.org/) (AMQP 1.0) standard. You can use Service Bus across the range of supported Azure platforms.\n\nSpring Cloud Azure provides various modules for sending messages to and receiving messages from Service Bus *queues* and *topics*/*subscriptions* using Spring frameworks.\n\nYou can use the following modules independently or combine them for different use cases:\n\n- [Spring Cloud Azure Service Bus Starter](#use-the-spring-cloud-azure-service-bus-starter) enables you to send and receive messages with the Service Bus Java SDK client library with Spring Boot features.\n\n- [Spring Cloud Azure Service Bus JMS Starter](#use-the-spring-cloud-azure-service-bus-jms-starter) enables you to use the JMS API to send and receive messages with Service Bus queues and topics/subscriptions.\n\n- [Spring Messaging Azure Service Bus](#use-spring-messaging-azure-service-bus) enables you to interact with Service Bus via the [Spring Messaging](https://docs.spring.io/spring-boot/docs/current/reference/html/messaging.html) API.\n\n- [Spring Integration Azure Service Bus](#use-spring-integration-azure-service-bus) enables you to connect Spring Integration [Message Channels](https://docs.spring.io/spring-integration/reference/channel.html) with Service Bus.\n\n- [Spring Cloud Stream Binder for Service Bus](#use-spring-cloud-stream-service-bus-binder) enables you to use Service Bus as a messaging middleware in Spring Cloud Stream applications.\n\n## Prerequisites\n\n- An Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- [Java Development Kit (JDK)](/java/azure/jdk/) version 8 or higher.\n- [Apache Maven](http://maven.apache.org/), version 3.0 or higher.\n- An Azure Service Bus and queue or topic/subscription. If you don't have one, create a Service Bus queue or topic. For more information, see [Use Azure portal to create a Service Bus namespace and a queue](/azure/service-bus-messaging/service-bus-quickstart-portal) or [Use the Azure portal to create a Service Bus topic and subscriptions to the topic](/azure/service-bus-messaging/service-bus-quickstart-topics-subscriptions-portal).\n- If you don't have a Spring Boot application, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web** dependency, and then select Java version 8 or higher.\n\n> [!NOTE]\n> To grant your account access to your Service Bus resources, in your newly created Azure Service Bus namespace, assign the [Azure Service Bus Data Sender](/azure/role-based-access-control/built-in-roles#azure-service-bus-data-sender) and [Azure Service Bus Data Receiver](/azure/role-based-access-control/built-in-roles#azure-service-bus-data-receiver) roles to the Microsoft Entra account you're currently using. For more information, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal).\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this tutorial.\n\n[!INCLUDE [prepare-your-local-environment](includes/prepare-your-local-environment.md)]\n\n> [!NOTE]\n> Azure Service Bus for JMS API currently doesn't support `DefaultAzureCredential`. If you're using Spring JMS with Service Bus, ignore this step.\n\n## Use the Spring Cloud Azure Service Bus Starter\n\nThe [Spring Cloud Azure Service Bus Starter](https://mvnrepository.com/artifact/com.azure.spring/spring-cloud-azure-starter-servicebus) module imports [Service Bus Java client library](https://mvnrepository.com/artifact/com.azure/azure-messaging-servicebus) with Spring Boot framework. You can use Spring Cloud Azure and the Azure SDK together, in a non-mutually-exclusive pattern. Thus, you can continue using the Service Bus Java client API in your Spring application.\n\n### Add the Service Bus dependency\n\nTo install the Spring Cloud Azure Service Bus Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Service Bus artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-servicebus</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\nThis guide teaches you how to use the Service Bus Java clients in the context of a Spring application. Here we introduce two alternatives. The recommended way is to use Spring Boot Autoconfiguration and use out-of-the-box clients from the Spring context. The alternative way is to build clients on your own programmatically.\n\nThe first way, which involves auto wiring the client beans from the Spring IoC container, has the following advantages when compared with the second way. These benefits give you a more flexible and efficient experience when developing with Service Bus clients.\n\n- You can use [externalized configuration](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.external-config) so that you can work with the same application code in different environments.\n\n- You can delegate the process of learning the builder pattern and registering this client to the application context to the Spring Boot framework. This delegation enables you to focus on how to use the clients with your own business requirements.\n\n- You can use health indicator in an easy way to inspect the status and health of your application and internal components.\n\nThe following code example shows you how to use `ServiceBusSenderClient` and `ServiceBusProcessorClient` with these two alternatives.\n\n> [!NOTE]\n> Azure Java SDK for Service Bus provides multiple clients to interact with Service Bus. The starter also provides autoconfiguration for all the Service Bus clients and client builders. Here we use only `ServiceBusSenderClient` and `ServiceBusProcessorClient` as examples.\n\n#### Use Spring Boot Autoconfiguration\n\nTo send messages to and receive messages from Service Bus, configure the application by using the following steps:\n\n1. Configure your Service Bus namespace and queue, as shown in the following example:\n\n   ```properties\n   spring.cloud.azure.servicebus.namespace=<your-servicebus-namespace-name>\n   spring.cloud.azure.servicebus.entity-name=<your-servicebus-queue-name>\n   spring.cloud.azure.servicebus.entity-type=queue\n   ```\n\n   > [!TIP]\n   > Here we use Service Bus queue as an example. To use topic/subscription, you need to add the `spring.cloud.azure.servicebus.processor.subscription-name` property and change the `entity-type` value to `topic`.\n\n1. Create a new `ServiceBusProcessorClientConfiguration` Java class as shown in the following example. This class is used to register the message and error handler of `ServiceBusProcessorClient`.\n\n   ```java\n   @Configuration(proxyBeanMethods = false)\n   public class ServiceBusProcessorClientConfiguration {\n\n       @Bean\n       ServiceBusRecordMessageListener processMessage() {\n           return context -> {\n               ServiceBusReceivedMessage message = context.getMessage();\n               System.out.printf(\"Processing message. Id: %s, Sequence #: %s. Contents: %s%n\", message.getMessageId(),\n                       message.getSequenceNumber(), message.getBody());\n           };\n       }\n\n       @Bean\n       ServiceBusErrorHandler processError() {\n           return context -> {\n               System.out.printf(\"Error when receiving messages from namespace: '%s'. Entity: '%s'%n\",\n                       context.getFullyQualifiedNamespace(), context.getEntityPath());\n           };\n       }\n   }\n   ```\n\n1. Inject the `ServiceBusSenderClient` in your Spring application, and call the related APIs to send messages, as shown in the following example:\n\n   ```java\n   @SpringBootApplication\n   public class ServiceBusQueueApplication implements CommandLineRunner {\n\n       private final ServiceBusSenderClient senderClient;\n\n       public ServiceBusQueueApplication(ServiceBusSenderClient senderClient) {\n           this.senderClient = senderClient;\n       }\n\n       public static void main(String[] args) {\n           SpringApplication.run(ServiceBusQueueApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) throws Exception {\n           // send one message to the queue\n           senderClient.sendMessage(new ServiceBusMessage(\"Hello, World!\"));\n           System.out.printf(\"Sent a message to the queue\");\n           senderClient.close();\n\n           // wait the processor client to consume messages\n           TimeUnit.SECONDS.sleep(10);\n       }\n\n   }\n   ```\n\n   > [!Note]\n   > By default, the lifecycle of the autowired `ServiceBusProcessorClient` bean is managed by the Spring context. The processor is automatically started when the Spring Application Context starts, and stopped when the Spring Application Context stops. To disable this feature, configure `spring.cloud.azure.servicebus.processor.auto-startup=false`.\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Sent a message to the queue\n   Processing message. Id: 6f405435200047069a3caf80893a80bc, Sequence #: 1. Contents: Hello, World!\n   ```\n\n#### Build Service Bus clients programmatically\n\nYou can build those client beans by yourself, but the process is complicated. In Spring Boot applications, you have to manage properties, learn the builder pattern, and register the client to your Spring application context. The following code example shows how to do that:\n\n1. Create a new `ServiceBusClientConfiguration` Java class as shown in the following example. This class is used to declare the `ServiceBusSenderClient` and `ServiceBusProcessorClient` beans.\n\n   ```java\n   @Configuration(proxyBeanMethods = false)\n   public class ServiceBusClientConfiguration {\n\n       private static final String SERVICE_BUS_FQDN = \"<service-bus-fully-qualified-namespace>\";\n       private static final String QUEUE_NAME = \"<service-bus-queue-name>\";\n\n       @Bean\n       ServiceBusClientBuilder serviceBusClientBuilder() {\n           return new ServiceBusClientBuilder()\n                      .fullyQualifiedNamespace(SERVICE_BUS_FQDN)\n                      .credential(new DefaultAzureCredentialBuilder().build());\n       }\n\n       @Bean\n       ServiceBusSenderClient serviceBusSenderClient(ServiceBusClientBuilder builder) {\n           return builder\n                  .sender()\n                  .queueName(QUEUE_NAME)\n                  .buildClient();\n       }\n\n       @Bean\n       ServiceBusProcessorClient serviceBusProcessorClient(ServiceBusClientBuilder builder) {\n           return builder.processor()\n                         .queueName(QUEUE_NAME)\n                         .processMessage(ServiceBusClientConfiguration::processMessage)\n                         .processError(ServiceBusClientConfiguration::processError)\n                         .buildProcessorClient();\n       }\n\n       private static void processMessage(ServiceBusReceivedMessageContext context) {\n           ServiceBusReceivedMessage message = context.getMessage();\n           System.out.printf(\"Processing message. Id: %s, Sequence #: %s. Contents: %s%n\",\n               message.getMessageId(), message.getSequenceNumber(), message.getBody());\n       }\n\n       private static void processError(ServiceBusErrorContext context) {\n           System.out.printf(\"Error when receiving messages from namespace: '%s'. Entity: '%s'%n\",\n                   context.getFullyQualifiedNamespace(), context.getEntityPath());\n       }\n   }\n   ```\n\n   > [!NOTE]\n   > Be sure to replace the `<service-bus-fully-qualified-namespace>` placeholder with your Service Bus host name from the Azure portal. Replace the `<service-bus-queue-name>` placeholder with your own queue name configured in your Service Bus namespace.\n\n1. Inject the client beans to your application, as shown in the following example:\n\n   ```java\n   @SpringBootApplication\n   public class ServiceBusQueueApplication implements CommandLineRunner {\n\n       private final ServiceBusSenderClient senderClient;\n\n       private final ServiceBusProcessorClient processorClient;\n\n       public ServiceBusQueueApplication(ServiceBusSenderClient senderClient, ServiceBusProcessorClient processorClient) {\n           this.senderClient = senderClient;\n           this.processorClient = processorClient;\n       }\n\n       public static void main(String[] args) {\n           SpringApplication.run(ServiceBusQueueApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) throws Exception {\n           // send one message to the queue\n           senderClient.sendMessage(new ServiceBusMessage(\"Hello, World!\"));\n           System.out.printf(\"Sent a message to the queue\");\n           senderClient.close();\n\n           System.out.printf(\"Starting the processor\");\n           processorClient.start();\n           TimeUnit.SECONDS.sleep(10);\n           System.out.printf(\"Stopping and closing the processor\");\n           processorClient.close();\n       }\n\n   }\n   ```\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Sent a message to the queue\n   Starting the processor\n   ...\n   Processing message. Id: 6f405435200047069a3caf80893a80bc, Sequence #: 1. Contents: Hello, World!\n   Stopping and closing the processor\n   ```\n\nThe following list shows reasons why this code isn't flexible or graceful:\n\n- The namespace and queue/topic/subscription names are hard coded.\n- If you use `@Value` to get configurations from the Spring environment, you can't have IDE hints in your **application.properties** file.\n- If you have a microservice scenario, you must duplicate the code in each project, and it's easy to make mistakes and hard to be consistent.\n\nFortunately, building the client beans by yourself isn't necessary with Spring Cloud Azure. Instead, you can directly inject the beans and use the [configuration properties](spring-cloud-azure.md?tabs=maven#configuration-properties) that you're already familiar with to configure Service Bus.\n\nSpring Cloud Azure also provides the following global configurations for different scenarios. For more information, see the [Global configuration for Azure Service SDKs](configuration.md#global-configuration-for-azure-service-sdks) section of the [Spring Cloud Azure configuration](configuration.md).\n\n- Proxy options.\n- Retry options.\n- AMQP transport client options.\n\nYou can also connect to different Azure clouds. For more information, see [Connect to different Azure clouds](https://devblogs.microsoft.com/azure-sdk/announcing-the-stable-release-of-spring-cloud-azure-version-4-4-0/#connect-to-different-azure-clouds).\n\n## Use the Spring Cloud Azure Service Bus JMS Starter\n\nThe [Spring Cloud Azure Service Bus JMS Starter](https://mvnrepository.com/artifact/com.azure.spring/spring-cloud-azure-starter-servicebus-jms) module provides [Spring JMS](https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#jms) integration with Service Bus. The following video describes how to integrate Spring JMS applications with Azure Service Bus using JMS 2.0.\n\n<br>\n\n> [!VIDEO https://www.youtube.com/embed/9O3CALyoZHE?list=PLPeZXlCR7ew8LlhnSH63KcM0XhMKxT1k_]\n\nThis guide shows you how to use Spring Cloud Azure Service Bus Starter for JMS API to send messages to and receive messages from Service Bus.\n\n### Add the Service Bus dependency\n\nTo install the Spring Cloud Azure Service Bus JMS Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Service Bus JMS artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-servicebus-jms</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\n1. Configure the connection string and pricing tier for your Service Bus, as shown in the following example:\n\n   ```properties\n   spring.jms.servicebus.connection-string=<service-bus-namespace-connection-string>\n   spring.jms.servicebus.pricing-tier=<service-bus-pricing-tier>\n   ```\n\n1. Create the message receiver.\n\n   Spring provides the means to publish messages to any POJO (Plain Old Java Object). First, define a generic `User` class that stores and retrieves user's name, as shown in the following example:\n\n   ```java\n   public class User implements Serializable {\n\n       private static final long serialVersionUID = -295422703255886286L;\n\n       private String name;\n\n       public User() {\n       }\n\n       public User(String name) {\n           setName(name);\n       }\n\n       public String getName() {\n           return name;\n       }\n\n       public void setName(String name) {\n           this.name = name;\n       }\n   }\n   ```\n\n   > [!TIP]\n   > `Serializable` is implemented to use the `send` method in `JmsTemplate` in the Spring framework. Otherwise, you should define a customized `MessageConverter` bean to serialize the content to JSON in text format. For more information about `MessageConverter`, see the official [Spring JMS starter project](https://spring.io/guides/gs/messaging-jms/).\n\n1. From here, you can create a new `QueueReceiveService` Java class as shown in the following example. This class is used to define a message receiver.\n\n   ```java\n   @Component\n   public class QueueReceiveService {\n\n       private static final String QUEUE_NAME = \"<service-bus-queue-name>\";\n\n       @JmsListener(destination = QUEUE_NAME, containerFactory = \"jmsListenerContainerFactory\")\n       public void receiveMessage(User user) {\n           System.out.printf(\"Received a message from %s.\", user.getName());\n       }\n   }\n   ```\n\n   > [!NOTE]\n   > Be sure to replace the `<service-bus-queue-name>` placeholder with your own queue name configured in your Service Bus namespace.\n   >\n   > If you're using a topic/subscription, change the `destination` parameter as the topic name, and the `containerFactory` should be `topicJmsListenerContainerFactory`. Also, add the `subscription` parameter to describe the subscription name.\n\n1. Wire up a sender and a receiver to send and receive messages with Spring, as shown in the following example:\n\n   ```java\n   @SpringBootApplication\n   @EnableJms\n   public class ServiceBusJmsStarterApplication {\n\n       private static final String QUEUE_NAME = \"<service-bus-queue-name>\";\n\n       public static void main(String[] args) {\n           ConfigurableApplicationContext context = SpringApplication.run(ServiceBusJMSQueueApplication.class, args);\n           JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);\n\n           // Send a message with a POJO - the template reuse the message converter\n           System.out.println(\"Sending a user message.\");\n           jmsTemplate.convertAndSend(QUEUE_NAME, new User(\"Tom\"));\n       }\n   }\n   ```\n\n   > [!NOTE]\n   > Be sure to replace the `<service-bus-queue-name>` placeholder with your own queue name configured in your Service Bus namespace.\n\n   > [!TIP]\n   > Be sure to add the `@EnableIntegration` annotation, which triggers the discovery of methods annotated with `@JmsListener`, creating the message listener container under the covers.\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Sending a user message.\n   Received a message from Tom.\n   ```\n\n### Other information\n\nFor more information, see [How to use JMS API with Service Bus and AMQP 1.0](/azure/service-bus-messaging/service-bus-java-how-to-use-jms-api-amqp).\n\n## Use Spring Messaging Azure Service Bus\n\nThe [Spring Messaging Azure Service Bus](https://mvnrepository.com/artifact/com.azure.spring/spring-messaging-azure-servicebus) module provides support for [Spring Messaging](https://docs.spring.io/spring-boot/docs/current/reference/html/messaging.html) framework with Service Bus.\n\nIf you're using Spring Messaging Azure Service Bus, then you can use the following features:\n\n- `ServiceBusTemplate`: send messages to Service Bus queues and topics asynchronously and synchronously.\n- `@ServiceBusListener`: mark a method to be the target of a Service Bus message listener on the destination.\n\nThis guide shows you how to use Spring Messaging Azure Service Bus to send messages to and receive messages from Service Bus.\n\n### Add the Service Bus dependency\n\nTo install the Spring Messaging Azure Service Bus module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Messaging Service Bus and Spring Cloud Azure starter artifacts:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n  </dependency>\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-messaging-azure-servicebus</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\n1. Configure the namespace and queue type for your Service Bus, as shown in the following example:\n\n   ```properties\n   spring.cloud.azure.servicebus.namespace=<service-bus-namespace-name>\n   spring.cloud.azure.servicebus.entity-type=queue\n   ```\n\n   > [!Note]\n   > If you're using a topic/subscription, change the `spring.cloud.azure.servicebus.entity-type` value to `topic`.\n\n1. Create a new `ConsumerService` Java class as shown in the following example. This class is used to define a message receiver.\n\n   ```java\n   @Service\n   public class ConsumerService {\n\n       private static final String QUEUE_NAME = \"<service-bus-queue-name>\";\n\n       @ServiceBusListener(destination = QUEUE_NAME)\n       public void handleMessageFromServiceBus(String message) {\n           System.out.printf(\"Consume message: %s%n\", message);\n       }\n\n   }\n   ```\n\n   > [!Note]\n   > If you're using a topic/subscription, change the annotation parameter of `destination` as the topic name, and add the `group` parameter to describe the subscription name.\n\n1. Wire up a sender and a receiver to send and receive messages with Spring, as shown in the following example:\n\n   ```java\n   @SpringBootApplication\n   @EnableAzureMessaging\n   public class Application {\n\n       private static final String QUEUE_NAME = \"<service-bus-queue-name>\";\n\n       public static void main(String[] args) {\n           ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class);\n           ServiceBusTemplate serviceBusTemplate = applicationContext.getBean(ServiceBusTemplate.class);\n           System.out.println(\"Sending a message to the queue.\");\n           serviceBusTemplate.sendAsync(QUEUE_NAME, MessageBuilder.withPayload(\"Hello world\").build()).subscribe();\n       }\n   }\n   ```\n\n   > [!TIP]\n   > Be sure to add the `@EnableAzureMessaging` annotation, which triggers the discovery of methods annotated with `@ServiceBusListener`, creating the message listener container under the covers.\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Sending a message to the queue.\n   Consume message: Hello world.\n   ```\n\n## Use Spring Integration Azure Service Bus\n\nThe [Spring Integration Azure Service Bus](https://mvnrepository.com/artifact/com.azure.spring/spring-integration-azure-servicebus) module provides support for the [Spring Integration](https://docs.spring.io/spring-boot/docs/current/reference/html/messaging.html) framework with Service Bus.\n\nIf your Spring application uses Spring Integration message channels, you can route messages between your message channels and Service Bus using channel adapters.\n\nAn inbound channel adapter forwards messages from a Service Bus queue or subscription to a message channel. An outbound channel adapter publishes messages from a message channel to a Service Bus queue and topic.\n\nThis guide shows you how to use Spring Integration Azure Service Bus to send messages to and receive messages from Service Bus.\n\n### Add the Service Bus dependency\n\nTo install the Spring Cloud Azure Service Bus Integration Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Service Bus Integration artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-integration-servicebus</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\n1. Configure the namespace of your Service Bus, as shown in the following example:\n\n   ```properties\n   spring.cloud.azure.servicebus.namespace=<your-servicebus-namespace-name>\n   ```\n\n1. Create a new `QueueReceiveConfiguration` Java class as shown in the following example. This class is used to define a message receiver.\n\n   ```java\n   @Configuration\n   public class QueueReceiveConfiguration {\n\n       private static final String INPUT_CHANNEL = \"queue.input\";\n       private static final String QUEUE_NAME = \"<your-servicebus-queue-name>\";\n       private static final String SERVICE_BUS_MESSAGE_LISTENER_CONTAINER = \"queue-listener-container\";\n\n       /**\n        * This message receiver binding with {@link ServiceBusInboundChannelAdapter}\n        * via {@link MessageChannel} has name {@value INPUT_CHANNEL}\n        */\n       @ServiceActivator(inputChannel = INPUT_CHANNEL)\n       public void messageReceiver(byte[] payload) {\n           String message = new String(payload);\n           System.out.printf(\"New message received: '%s'%n\", message);\n       }\n\n       @Bean(SERVICE_BUS_MESSAGE_LISTENER_CONTAINER)\n       public ServiceBusMessageListenerContainer messageListenerContainer(ServiceBusProcessorFactory processorFactory) {\n           ServiceBusContainerProperties containerProperties = new ServiceBusContainerProperties();\n           containerProperties.setEntityName(QUEUE_NAME);\n           return new ServiceBusMessageListenerContainer(processorFactory, containerProperties);\n       }\n\n       @Bean\n       public ServiceBusInboundChannelAdapter queueMessageChannelAdapter(\n           @Qualifier(INPUT_CHANNEL) MessageChannel inputChannel,\n           @Qualifier(SERVICE_BUS_MESSAGE_LISTENER_CONTAINER) ServiceBusMessageListenerContainer listenerContainer) {\n           ServiceBusInboundChannelAdapter adapter = new ServiceBusInboundChannelAdapter(listenerContainer);\n           adapter.setOutputChannel(inputChannel);\n           return adapter;\n       }\n\n       @Bean(name = INPUT_CHANNEL)\n       public MessageChannel input() {\n           return new DirectChannel();\n       }\n   }\n   ```\n\n1. Create a new `QueueSendConfiguration` Java class as shown in the following example. This class is used to define a message sender.\n\n   ```java\n   @Configuration\n   public class QueueSendConfiguration {\n\n       private static final String OUTPUT_CHANNEL = \"queue.output\";\n       private static final String QUEUE_NAME = \"<your-servicebus-queue-name>\";\n\n       @Bean\n       @ServiceActivator(inputChannel = OUTPUT_CHANNEL)\n       public MessageHandler queueMessageSender(ServiceBusTemplate serviceBusTemplate) {\n           serviceBusTemplate.setDefaultEntityType(ServiceBusEntityType.QUEUE);\n           DefaultMessageHandler handler = new DefaultMessageHandler(QUEUE_NAME, serviceBusTemplate);\n           handler.setSendCallback(new ListenableFutureCallback<Void>() {\n               @Override\n               public void onSuccess(Void result) {\n                   System.out.println(\"Message was sent successfully.\");\n               }\n\n               @Override\n               public void onFailure(Throwable ex) {\n                   System.out.println(\"There was an error sending the message.\");\n               }\n           });\n\n           return handler;\n       }\n\n       /**\n        * Message gateway binding with {@link MessageHandler}\n        * via {@link MessageChannel} has name {@value OUTPUT_CHANNEL}\n        */\n       @MessagingGateway(defaultRequestChannel = OUTPUT_CHANNEL)\n       public interface QueueOutboundGateway {\n           void send(String text);\n       }\n   }\n   ```\n\n1. Wire up a sender and a receiver to send and receive messages with Spring, as shown in the following example:\n\n   ```java\n   @SpringBootApplication\n   @EnableIntegration\n   @Configuration(proxyBeanMethods = false)\n   public class ServiceBusIntegrationApplication {\n\n       public static void main(String[] args) {\n           ConfigurableApplicationContext applicationContext = SpringApplication.run(ServiceBusIntegrationApplication.class, args);\n           QueueSendConfiguration.QueueOutboundGateway outboundGateway = applicationContext.getBean(QueueSendConfiguration.QueueOutboundGateway.class);\n           System.out.println(\"Sending a message to the queue\");\n           outboundGateway.send(\"Hello World\");\n       }\n\n   }\n   ```\n\n   > [!TIP]\n   > Be sure to add the `@EnableIntegration` annotation, which enables the Spring Integration infrastructure.\n\n1. Start the application. You're shown logs similar to the following example:\n\n   ```output\n   Message was sent successfully.\n   New message received: 'Hello World'\n   ```\n\n## Use Spring Cloud Stream Service Bus Binder\n\nTo call the Service Bus API in a [Spring Cloud Stream](https://spring.io/projects/spring-cloud-stream) application, use the Spring Cloud Azure Service Bus Stream Binder module.\n\nThis guide shows you how to use Spring Cloud Stream Service Bus Binder to send messages to and receive messages from Service Bus.\n\n### Add the Service Bus dependency\n\nTo install the Spring Cloud Azure Service Bus Stream Binder module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Service Bus Integration artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-stream-binder-servicebus</artifactId>\n  </dependency>\n  ```\n\n### Code the application to send and receive messages\n\n1. Configure the namespace of your Service Bus, as shown in the following example:\n\n   ```properties\n   spring.cloud.azure.servicebus.namespace=<service-bus-namespace-name>\n   ```\n\n1. Create the message receiver.\n\n   To use your application as an event sink, configure the input binder by specifying the following information:\n\n   - Declare a `Consumer` bean that defines message handling logic. For example, the following `Consumer` bean is named `consume`:\n\n     ```java\n     @Bean\n     public Consumer<Message<String>> consume() {\n         return message -> {\n             System.out.printf(\"New message received: '%s'.%n\", message.getPayload());\n         };\n     }\n     ```\n\n   - Add the configuration to specify the `queue` name for consuming by replacing the `<service-bus-queue-name>` placeholder, as shown in the following example:\n\n     ```properties\n      # name for the `Consumer` bean\n      spring.cloud.function.definition=consume\n      spring.cloud.stream.bindings.consume-in-0.destination=<service-bus-queue-name>\n     ```\n\n     > [!NOTE]\n     > To consume from a Service Bus subscription, be sure to change the `consume-in-0` binding properties as shown in the following example:\n     >\n     > ```properties\n     > spring.cloud.stream.bindings.consume-in-0.destination=<service-bus-topic-name>\n     > spring.cloud.stream.bindings.consume-in-0.group=<service-bus-subscription-name>\n     > ```\n\n1. Create the message sender.\n\n   To use your application as an event source, configure the output binder by specifying the following information:\n\n   - Define a `Supplier` bean that defines where messages come from within your application.\n\n     ```java\n     @Bean\n     return () -> {\n             System.out.println(\"Sending a message.\");\n             return MessageBuilder.withPayload(\"Hello world\").build();\n         };\n     }\n     ```\n\n   - Add the configuration to specify the `queue` name for sending by replacing the `<your-servicebus-queue-name>` placeholder in the following example:\n\n     ```properties\n     # \"consume\" is added from the previous step\n     spring.cloud.function.definition=consume;supply\n     spring.cloud.stream.bindings.supply-out-0.destination=<your-servicebus-queue-name>\n     spring.cloud.stream.servicebus.bindings.supply-out-0.producer.entity-type=queue\n     ```\n\n     > [!NOTE]\n     > To send to a Service Bus topic, be sure to change the `entity-type` to `topic`.\n\n1. Start the application. You're shown see logs similar to the following example:\n\n   ```output\n   Sending a message.\n   New message received: 'Hello world'.\n   ```\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Service Bus Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/servicebus)\n\n### See also\n\nFor more information about more Spring Boot Starters available for Microsoft Azure, see [What is Spring Cloud Azure?](spring-cloud-azure-overview.md)\n"
  },
  {
    "path": "articles/java/spring-framework/using-storage-queue-in-spring-applications.md",
    "content": "---\ntitle: Use Azure Storage Queue in Spring applications\ndescription: This article demonstrates how to use Azure Storage Queue in Java applications built with Spring framework.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: seal\nms.date: 08/19/2025\nms.topic: how-to\nms.custom: devx-track-java, spring-cloud-azure, passwordless-java, devx-track-extended-java\n---\n\n# Use Azure Storage Queue in Spring applications\n\nThis article demonstrates how to use [Azure Storage Queue](/azure/storage/queues/storage-queues-introduction) in Java applications built with [Spring Framework](https://spring.io/projects/spring-framework).\n\nAzure Storage Queue implements cloud-based queues to enable communication between components of a distributed application. Each queue maintains a list of messages that can be added by a sender component and processed by a receiver component. With a queue, your application can scale immediately to meet demand.\n\nSpring Cloud Azure provides various modules for using Spring frameworks to send messages to, and receiving messages from, Azure Storage Queues. You can use these modules independently or combine them for different use cases, as described in the following list:\n\n- [Spring Cloud Azure Storage Queue Starter](#use-spring-cloud-azure-storage-queue-starter) lets you send and receive messages with Storage Queues Java SDK client library with Spring Boot features.\n\n- [Spring Messaging Azure Storage Queue](#use-spring-messaging-azure-storage-queue) lets you interact with Storage Queues via the [Spring Messaging](https://docs.spring.io/spring-boot/docs/current/reference/html/messaging.html) API.\n\n- [Spring Integration Azure Storage Queue](#use-spring-integration-azure-storage-queue) lets you connect Spring Integration [Message Channels](https://docs.spring.io/spring-integration/reference/channel.html) with Storage Queues.\n\n[!INCLUDE [spring-data-prerequisites.md](includes/spring-data-prerequisites.md)]\n\n- An Azure Storage account and Azure Queues. If you don't have these resources, first create a storage account, then create a queue. For more information, see [Create a storage account](/azure/storage/common/storage-account-create?tabs=azure-portal) and the [Create a queue](/azure/storage/queues/storage-quickstart-queues-portal#create-a-queue) section of [Quickstart: Create a queue and add a message with the Azure portal](/azure/storage/queues/storage-quickstart-queues-portal).\n\n- A Spring Boot application. If you don't have one, create a Maven project with the [Spring Initializr](https://start.spring.io/). Be sure to select **Maven Project** and, under **Dependencies**, add the **Spring Web** dependency, and then select Java version 8 or higher.\n\n> [!NOTE]\n> To grant your account access to resources, in your newly created Azure Storage account, assign the `Storage Queue Data Contributor` role to the Microsoft Entra account you're currently using. For more information, see [Assign Azure roles using the Azure portal](/azure/role-based-access-control/role-assignments-portal).\n\n> [!IMPORTANT]\n> Spring Boot version 2.5 or higher is required to complete the steps in this tutorial.\n\n[!INCLUDE [prepare-your-local-environment](includes/prepare-your-local-environment.md)]\n\n## Use Spring Cloud Azure Storage Queue Starter\n\nThe Spring Cloud Azure Storage Queue Starter module imports [Azure Storage Queue client library for Java](/java/api/overview/azure/storage-queue-readme) with the Spring Boot framework. You can use Spring Cloud Azure and the Azure SDK together, in a non-mutually-exclusive pattern. Thus, you can continue using the Storage Queue Java client API in your Spring application.\n\n### Add dependencies\n\nTo install the Spring Cloud Azure Storage Queue Starter module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure Queue Storage Queue artifact:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-storage-queue</artifactId>\n  </dependency>\n  ```\n\n### Code your application to send and receive messages\n\nThis section shows you how to use the Azure Queue Storage clients in the context of a Spring application. You have the following two options:\n\n- Use Spring Boot autoconfiguration and use out-of-the-box clients from the Spring context (recommended).\n- Build the client programmatically.\n\nWith autoconfiguration, you autowire client beans from the Spring inversion-of-control (IoC) container. This approach provides you with a more flexible and efficient experience when developing with Storage Queue clients. Autoconfiguration has the following advantages:\n\n- Autoconfiguration uses [externalized configuration](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#features.external-config) so that you can work with the same application code in different environments.\n\n- You can delegate to the Spring Boot framework the process of learning the builder pattern and registering the clients to the application context. You focus only on how to use the clients with your own business requirements.\n\n- You can use health indicator to inspect the status and health of your application and internal components.\n\nThe code examples in the following sections show you how to use `QueueClient` with the two alternatives described.\n\n> [!TIP]\n> Azure Java SDK for Storage Queue provides multiple clients to interact with Storage Queue. The starter also provides autoconfiguration for all the Storage Queue clients and client builders. This article uses only `QueueClient` as an example.\n\n#### Use Spring Boot autoconfiguration\n\nTo send messages to and receive messages from Azure Storage queues, use the following steps to configure the application:\n\n1. Configure your storage account name and queue name, as shown in the following example:\n\n   ```properties\n   spring.cloud.azure.storage.queue.account-name=<your-storage-account-name>\n   spring.cloud.azure.storage.queue.queue-name=<your-storage-queue-name>\n   ```\n\n1. Inject the `QueueClient` in your Spring application and call the related APIs to send messages, as shown in the following example:\n\n   ```java\n   import com.azure.storage.queue.QueueClient;\n   import com.azure.storage.queue.models.QueueMessageItem;\n   import com.azure.storage.queue.models.SendMessageResult;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.beans.factory.annotation.Autowired;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n\n   @SpringBootApplication\n   public class StorageQueueClientApplication implements CommandLineRunner {\n\n       private final static Logger logger = LoggerFactory.getLogger(StorageQueueClientApplication.class);\n\n       @Autowired\n       private QueueClient queueClient;\n\n       public static void main(String[] args) {\n           SpringApplication.run(StorageQueueClientApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n        // Using the QueueClient object, call the create method to create the queue in your storage account.\n           queueClient.create();\n           SendMessageResult sendMessageResult = queueClient.sendMessage(\"Hello world\");\n           logger.info(\"Send message id: {}\", sendMessageResult.getMessageId());\n\n           QueueMessageItem queueMessageItem = queueClient.receiveMessage();\n           logger.info(\"Received message: {}\", new String(queueMessageItem.getBody().toBytes()));\n       }\n\n   }\n   ```\n\n1. Start the application. After launch, the application produces logs similar to the following example:\n\n   ```output\n   Send message id: ...\n   Received message: Hello world\n   ```\n\n#### Build the client programmatically\n\nYou can build the client beans by yourself, but the process is complicated. In Spring Boot applications, you have to manage properties, learn the builder pattern, and register the clients to your Spring application context. The following steps show you how to do that.\n\n1. Build the client programmatically in your Spring application, as shown in the following example. Be sure to replace the `<storage-account-name>` placeholder with your own value.\n\n   ```java\n   import com.azure.identity.DefaultAzureCredentialBuilder;\n   import com.azure.storage.queue.QueueClient;\n   import com.azure.storage.queue.QueueClientBuilder;\n   import com.azure.storage.queue.models.QueueMessageItem;\n   import com.azure.storage.queue.models.SendMessageResult;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n\n   @SpringBootApplication\n   public class StorageQueueClientApplication implements CommandLineRunner {\n\n       private final static String queueName = \"test-queue\";\n       private final static String endpoint = \"https://<storage-account-name>.queue.core.windows.net/\";\n       private final static Logger logger = LoggerFactory.getLogger(StorageQueueClientApplication.class);\n\n       QueueClient queueClient = new QueueClientBuilder()\n           .endpoint(endpoint)\n           .queueName(queueName)\n           .credential(new DefaultAzureCredentialBuilder().build())\n           .buildClient();\n\n       public static void main(String[] args) {\n           SpringApplication.run(StorageQueueClientApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n        // Using the QueueClient object, call the create method to create the queue in your storage account.\n           queueClient.create();\n           SendMessageResult sendMessageResult = queueClient.sendMessage(\"Hello world\");\n           logger.info(\"Send message id: {}\", sendMessageResult.getMessageId());\n\n           QueueMessageItem queueMessageItem = queueClient.receiveMessage();\n           logger.info(\"Received message: {}\", new String(queueMessageItem.getBody().toBytes()));\n       }\n\n   }\n   ```\n\n1. Start the application. After launch, the application produces logs similar to the following example:\n\n   ```output\n   Send message id: ...\n   Received message: Hello world\n   ```\n\nThe following list shows reasons why this code isn't flexible or graceful:\n\n- The storage account and queue names are hard coded.\n- If you use `@Value` to get configurations from the Spring environment, you can't have IDE hints in your **application.properties** file.\n- If you have a microservice scenario, you must duplicate the code in each project, and it's easy to make mistakes and hard to be consistent.\n\nFortunately, building the client beans by yourself isn't necessary with Spring Cloud Azure. Instead, you can directly inject them and use the configuration properties that you're already familiar with to configure the storage queue. For more information, see [Spring Cloud Azure configuration properties](configuration-properties-all.md).\n\nSpring Cloud Azure also provides the following global configurations for different scenarios. For more information, see [Spring Cloud Azure global configuration properties](configuration-properties-global.md).\n\n- Proxy options.\n- Retry options.\n\nYou can also connect to different Azure clouds. For more information, see [Connect to different Azure clouds](https://devblogs.microsoft.com/azure-sdk/announcing-the-stable-release-of-spring-cloud-azure-version-4-4-0/#connect-to-different-azure-clouds).\n\n## Use Spring Messaging Azure Storage Queue\n\nThe [Spring Messaging Azure Storage Queue](https://mvnrepository.com/artifact/com.azure.spring/spring-messaging-azure-storage-queue) module provides support for the Spring [Messaging](https://docs.spring.io/spring-boot/docs/current/reference/html/messaging.html) framework with Azure Queue Storage.\n\nIf you're using Spring Messaging Azure Storage Queue, then you can use the `StorageQueueTemplate` feature to send messages to storage queues asynchronously and synchronously.\n\nThe following sections show you how to use Spring Messaging Azure Storage Queue to send messages to and receive messages from storage queues.\n\n### Add dependencies\n\nTo install the Spring Messaging Azure Storage Queue module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Cloud Azure starter and Spring Messaging Storage Queue artifacts:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter</artifactId>\n  </dependency>\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-messaging-azure-storage-queue</artifactId>\n  </dependency>\n  ```\n\n### Code your application to send and receive messages\n\nUse the following steps to configure and code your application:\n\n1. Configure the Azure Storage account name for your storage queues, as shown in the following example:\n\n   ```properties\n   spring.cloud.azure.storage.queue.account-name=<your-storage-account-name>\n   ```\n\n1. Wire up a sender and a receiver to send and receive messages with Spring, as shown in the following example. Be sure to replace the `<storage-queue-name>` placeholder with your own value.\n\n   ```java\n   import com.azure.spring.messaging.AzureHeaders;\n   import com.azure.spring.messaging.checkpoint.Checkpointer;\n   import com.azure.spring.messaging.storage.queue.core.StorageQueueTemplate;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.beans.factory.annotation.Autowired;\n   import org.springframework.boot.CommandLineRunner;\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.messaging.Message;\n   import org.springframework.messaging.support.MessageBuilder;\n   import java.time.Duration;\n\n   @SpringBootApplication\n   public class StorageQueueMessagingApplication implements CommandLineRunner {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(StorageQueueMessagingApplication.class);\n       private static final String STORAGE_QUEUE_NAME = \"<storage-queue-name>\";\n\n       @Autowired\n       StorageQueueTemplate storageQueueTemplate;\n\n       public static void main(String[] args) {\n           SpringApplication.run(StorageQueueMessagingApplication.class, args);\n       }\n\n       @Override\n       public void run(String... args) {\n           storageQueueTemplate\n               .sendAsync(STORAGE_QUEUE_NAME, MessageBuilder.withPayload(\"Hello world\").build())\n               .subscribe();\n           LOGGER.info(\"Message was sent successfully.\");\n\n           Message<?> message = storageQueueTemplate.receiveAsync(STORAGE_QUEUE_NAME, Duration.ofSeconds(30)).block();\n           LOGGER.info(\"Received message: {}\", new String((byte[]) message.getPayload()));\n       }\n\n   }\n   ```\n\n1. Start the application. After launch, the application produces logs similar to the following example:\n\n   ```output\n   Message was sent successfully.\n   ...\n   Received message: Hello World\n   ```\n\n## Use Spring Integration Azure Storage Queue\n\nThe [Spring Integration Azure Storage Queue](https://mvnrepository.com/artifact/com.azure.spring/spring-integration-azure-storage-queue) module provides support for the [Spring Integration](https://docs.spring.io/spring-boot/docs/current/reference/html/messaging.html#messaging.spring-integration) framework with storage queues.\n\nIf your Spring application uses Spring Integration message channels, you can route messages between your message channels and storage queue using channel adapters. An inbound channel adapter forwards messages from a storage queue to a message channel. An outbound channel adapter publishes messages from a message channel to a storage queue.\n\nThe following sections show you how to use Spring Integration Azure Storage Queue to send and receive messages to and from storage queues.\n\n### Add dependencies\n\nTo install the Spring Integration Azure Storage Queue module, add the following dependencies to your **pom.xml** file:\n\n- The Spring Cloud Azure Bill of Materials (BOM):\n\n  ```xml\n  <dependencyManagement>\n     <dependencies>\n       <dependency>\n         <groupId>com.azure.spring</groupId>\n         <artifactId>spring-cloud-azure-dependencies</artifactId>\n         <version>7.2.0</version>\n         <type>pom</type>\n         <scope>import</scope>\n         </dependency>\n     </dependencies>\n  </dependencyManagement>\n  ```\n\n  [!INCLUDE [spring-cloud-azure-version-note.md](includes/spring-cloud-azure-version-note.md)]\n\n- The Spring Integration Azure Storage Queue artifacts:\n\n  ```xml\n  <dependency>\n    <groupId>com.azure.spring</groupId>\n    <artifactId>spring-cloud-azure-starter-integration-storage-queue</artifactId>\n  </dependency>\n  ```\n\n### Code your application to send and receive messages\n\nUse the following steps to configure and code your application:\n\n1. Configure the Azure Storage account name for your storage queues.\n\n   ```properties\n   spring.cloud.azure.storage.queue.account-name=<your-storage-account-name>\n   ```\n\n1. Create a new `QueueReceiveConfiguration` Java class as shown in the following example. This class is used to define a message receiver. Be sure to replace the `<storage-queue-name>` placeholder with your own value.\n\n   ```java\n   import com.azure.spring.integration.storage.queue.inbound.StorageQueueMessageSource;\n   import com.azure.spring.messaging.AzureHeaders;\n   import com.azure.spring.messaging.checkpoint.Checkpointer;\n   import com.azure.spring.messaging.storage.queue.core.StorageQueueTemplate;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.context.annotation.Configuration;\n   import org.springframework.integration.annotation.InboundChannelAdapter;\n   import org.springframework.integration.annotation.Poller;\n   import org.springframework.integration.annotation.ServiceActivator;\n   import org.springframework.messaging.handler.annotation.Header;\n\n   @Configuration\n   public class QueueReceiveConfiguration {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(QueueReceiveConfiguration.class);\n       private static final String STORAGE_QUEUE_NAME = \"<storage-queue-name>\";\n       private static final String INPUT_CHANNEL = \"input\";\n\n       @Bean\n       @InboundChannelAdapter(channel = INPUT_CHANNEL, poller = @Poller(fixedDelay = \"1000\"))\n       public StorageQueueMessageSource storageQueueMessageSource(StorageQueueTemplate storageQueueTemplate) {\n           return new StorageQueueMessageSource(STORAGE_QUEUE_NAME, storageQueueTemplate);\n       }\n\n       @ServiceActivator(inputChannel = INPUT_CHANNEL)\n       public void messageReceiver(byte[] payload, @Header(AzureHeaders.CHECKPOINTER) Checkpointer checkpointer) {\n           String message = new String(payload);\n           LOGGER.info(\"Received message: {}\", message);\n       }\n\n   }\n   ```\n\n1. Create a new `QueueSendConfiguration` Java class as shown in the following example. This class is used to define a message sender. Be sure to replace the `<storage-queue-name>` placeholder with your own value.\n\n   ```java\n   import com.azure.spring.integration.core.handler.DefaultMessageHandler;\n   import com.azure.spring.messaging.storage.queue.core.StorageQueueTemplate;\n   import org.slf4j.Logger;\n   import org.slf4j.LoggerFactory;\n   import org.springframework.context.annotation.Bean;\n   import org.springframework.context.annotation.Configuration;\n   import org.springframework.integration.annotation.MessagingGateway;\n   import org.springframework.integration.annotation.ServiceActivator;\n   import org.springframework.messaging.MessageHandler;\n   import org.springframework.util.concurrent.ListenableFutureCallback;\n\n   @Configuration\n   public class QueueSendConfiguration {\n\n       private static final Logger LOGGER = LoggerFactory.getLogger(QueueSendConfiguration.class);\n       private static final String STORAGE_QUEUE_NAME = \"<storage-queue-name>\";\n       private static final String OUTPUT_CHANNEL = \"output\";\n\n       @Bean\n       @ServiceActivator(inputChannel = OUTPUT_CHANNEL)\n       public MessageHandler messageSender(StorageQueueTemplate storageQueueTemplate) {\n           DefaultMessageHandler handler = new DefaultMessageHandler(STORAGE_QUEUE_NAME, storageQueueTemplate);\n           handler.setSendCallback(new ListenableFutureCallback<Void>() {\n               @Override\n               public void onSuccess(Void result) {\n                   LOGGER.info(\"Message was sent successfully.\");\n               }\n\n               @Override\n               public void onFailure(Throwable ex) {\n                   LOGGER.info(\"There was an error sending the message.\");\n               }\n           });\n           return handler;\n       }\n\n       @MessagingGateway(defaultRequestChannel = OUTPUT_CHANNEL)\n       public interface StorageQueueOutboundGateway {\n           void send(String text);\n       }\n\n   }\n   ```\n\n1. Wire up a sender and a receiver to send and receive messages with Spring.\n\n   ```java\n   import org.springframework.boot.SpringApplication;\n   import org.springframework.boot.autoconfigure.SpringBootApplication;\n   import org.springframework.context.ConfigurableApplicationContext;\n   import org.springframework.context.annotation.Configuration;\n   import org.springframework.integration.config.EnableIntegration;\n\n   @SpringBootApplication\n   @EnableIntegration\n   @Configuration(proxyBeanMethods = false)\n   public class StorageQueueIntegrationApplication {\n\n       public static void main(String[] args) {\n           ConfigurableApplicationContext applicationContext = SpringApplication.run(StorageQueueIntegrationApplication.class, args);\n           QueueSendConfiguration.StorageQueueOutboundGateway storageQueueOutboundGateway = applicationContext.getBeanQueueSendConfiguration.StorageQueueOutboundGateway.class);\n           storageQueueOutboundGateway.send(\"Hello World\");\n       }\n\n   }\n   ```\n\n   > [!TIP]\n   > Remember to add the `@EnableIntegration` annotation, which enables the Spring Integration infrastructure.\n\n1. Start the application. After launch, the application produces logs similar to the following example:\n\n   ```output\n   Message was sent successfully.\n   Received message: Hello World\n   ```\n\n[!INCLUDE [deploy-to-azure-spring-apps](includes/deploy-to-azure-spring-apps.md)]\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure for Spring developers](../spring/index.yml)\n> [Spring Cloud Azure Storage Queue Samples](https://github.com/Azure-Samples/azure-spring-boot-samples/tree/main/storage)\n\n### See also\n\nFor more information about the Spring Boot Starters available for Microsoft Azure, see [What is Spring Cloud Azure?](spring-cloud-azure-overview.md)\n"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/create-hello-world-web-app.md",
    "content": "---\ntitle: Create a Hello World web app for Azure App Service using Eclipse\ndescription: This tutorial shows you how to use the Azure Toolkit for Eclipse to create a Hello World Web App for Azure.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.date: 08/25/2020\nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Create a Hello World web app for Azure App Service using Eclipse\n\nThis article demonstrates the steps that are required to create a basic Hello World web app and publish your web app to Azure App Service by using the [Azure Toolkit for Eclipse](https://marketplace.eclipse.org/content/azure-toolkit-eclipse).\n\n> [!NOTE]\n>\n> If you prefer using IntelliJ IDEA, check out our [similar tutorial for IntelliJ][intellij-hello-world].\n>\n> [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n>\n> Don't forget to clean up the resources after you complete this tutorial. In that case, running this guide will not exceed your free account quota.\n>\n\n[!INCLUDE [basic-prerequisites](includes/basic-prerequisites.md)]\n\n## Installation and sign-in\n\nThe following steps walk you through the Azure sign in process in your Eclipse development environment.\n\n1. If you haven't installed the plugin, see [Installing the Azure Toolkit for Eclipse](installation.md).\n\n1. To sign in to your Azure account, click **Tools**, click **Azure**, and then click **Sign In**.\n\n   :::image type=\"content\" source=\"media/sign-in-instructions/eclipse-azure-signin.png\" alt-text=\"Sign in to Azure in Eclipse IDE.\":::\n\n1. In the **Azure Sign In** window, select **Device Login**, and then click **Sign in** ([other sign-in options](sign-in-instructions.md)).\n\n1. Click **Copy&Open** in the **Azure Device Login** dialog.\n\n1. In the browser, paste your device code (which has been copied when you clicked **Copy&Open** in last step) and then click **Next**.\n\n1. Select your Azure account and complete any authentication procedures necessary in order to sign in.\n\n1. Once signed in, close your browser and switch back to your Eclipse IDE. In the **Select Subscriptions** dialog box, select the subscriptions that you want to use, then click **Select**.\n\n### Install required software (optional)\n\nTo ensure you have required components to work with web app projects, follow these steps:\n\n1. Click the **Help** menu, and then click **Install New Software**.\n\n1. In the **Available Software** dialog, click **Manage**, and make sure the latest Eclipse version is selected - for example, **2020-06**.\n\n1. Click **Apply and Close**. Expand the **Work with:** dropdown menu to show suggested sites. Select the latest Eclipse version site to query available software.\n\n1. Scroll down the list and select the **Web, XML, Java EE and OSGi Enterprise Development** item. Click **Next**.\n\n1. In the Install Details window, click **Next**.\n\n1. In the Review Licenses dialog, review the terms of the license agreements. If you accept the terms of the license agreements, click **I accept the terms of the license agreements** and then click **Finish**. \n\n   > [!NOTE]\n   > You can check the installation progress on the lower-right corner of your Eclipse workspace.\n\n1. If prompted to restart Eclipse to complete installation, click **Restart Now**.\n\n## Creating a web app project\n\n1. Click **File**, expand **New**, and then click **...Project**. Inside the New Project dialog window, expand **Web**, select **Dynamic Web Project**, and click **Next**.\n\n   > [!TIP]\n   > If you don't see **Web** listed as an available project, see [this section](#install-required-software-optional) to make sure you have the required Eclipse software.\n\n1. For purposes of this tutorial, name the project **MyWebApp**. Your screen will appear similar to the following:\n   \n   ![New Dynamic Web Project properties][dynamic-web-project-properties]\n\n1. Click **Finish**.\n\n1. On the left-hand Package Explorer pane, expand **MyWebApp**. Right-click **WebContent**, hover over **New**, and then click **Other...**.\n\n1. Expand **Web** to find the **JSP File** option. Click **Next**.\n\n1. In the **New JSP File** dialog box, name the file **index.jsp**, keep the parent folder as **MyWebApp/WebContent**, and then click **Next**.\n\n   ![New JSP File dialog box][new-jsp-file-dialog]\n\n1. In the **Select JSP Template** dialog box, for purposes of this tutorial, select **New JSP File (html 5)**, and then click **Finish**.\n\n1. When your index.jsp file opens in Eclipse, add in text to dynamically display **Hello World!** within the existing `<body>` element. Your updated `<body>` content should resemble the following example:\n   \n   ```jsp\n   <body>\n   <b><% out.println(\"Hello World!\"); %></b>\n   </body>\n   ```\n1. Save index.jsp.\n\n## Deploying the web app to Azure\n\n1. On the left-hand Package Explorer pane, right-click your project, choose **Azure**, and then choose **Publish as Azure Web App**.\n   \n   ![Publish as Azure Web App][publish-as-azure-web-app]\n\n1. When the **Deploy Web App** dialog box appears, you can choose one of the following options:\n\n   * Select an existing web app if one exists.\n\n   * If you do not have an existing web app, click **Create**.\n\n      Here you can configure the runtime environment, app service plan resource group, and app settings. Create new resources if necessary.\n\n      Specify the requisite information for your web app in the **Create App Service** dialog box, and then click **Create**.\n\n1. Select your web app and then click **Deploy**.\n\n1. The toolkit will display a **Published** status under the **Azure Activity Log** tab when it has successfully deployed your web app, which is a hyperlink for the URL of your deployed web app.\n\n1. You can browse to your web app using the link provided in the status message.\n\n   ![Browsing your web app][browse-web-app]\n\n## Cleaning up resources\n\n1. After you have published your web app to Azure, you can manage it by right-clicking in Azure Explorer and selecting one of the options in the context menu. For example, you can **Delete** your web app here to clean up the resource for this tutorial.\n\n   ![Manage app service][manage-app-service]\n\n[!INCLUDE [show-azure-explorer](includes/show-azure-explorer.md)]\n\n## Next steps\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\nFor additional information about creating Azure Web Apps, see the [Web Apps Overview].\n\n<!-- URL List -->\n\n[Azure Toolkit for Eclipse]: /azure/developer/java/tookit-for-eclipse\n[Azure Toolkit for IntelliJ]: ../toolkit-for-intellij\n[intellij-hello-world]: ../toolkit-for-intellij/create-hello-world-web-app.md\n[Web Apps Overview]: /azure/app-service/app-service-web-overview\n[Apache Tomcat]: http://tomcat.apache.org/\n[Jetty]: http://www.eclipse.org/jetty/\n\n<!-- IMG List -->\n\n[browse-web-app]: media/create-hello-world-web-app/browse-web-app.png\n[dynamic-web-project-properties]: media/create-hello-world-web-app/dynamic-web-project-properties.png\n[new-jsp-file-dialog]: media/create-hello-world-web-app/new-jsp-file-dialog.png\n[publish-as-azure-web-app]: media/create-hello-world-web-app/publish-as-azure-web-app.png\n[publish-status]: media/create-hello-world-web-app/publish-status.png\n[manage-app-service]: media/create-hello-world-web-app/manage-app-service.png\n"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/includes/additional-resources.md",
    "content": "To report bugs or request new features, create issues on [our GitHub repository](https://github.com/Microsoft/azure-tools-for-java/issues). Or, ask questions on [Stack Overflow with tag azure-java-tools](https://stackoverflow.com/questions/tagged/azure-java-tools).\n\nFor more information about using Java with Azure, see the following links:\n\n* [Azure for Java Developers](../../index.yml) \n* [Java with Azure DevOps Services](/azure/devops-project/azure-devops-project-java)\n* [Java support on Azure and Azure Stack](../../fundamentals/java-support-on-azure.md)\n<!-- TODO: Add URLs for Java in VSCode here -->"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/includes/basic-prerequisites.md",
    "content": "## Prerequisites\n\nTo complete the steps in this article, you'll need to install the Azure Toolkit for Eclipse, which requires the following software components:\n\n* An [Azure supported Java Development Kit (JDK)](../../fundamentals/java-support-on-azure.md)\n* An [Eclipse IDE](http://www.eclipse.org/downloads/)\n\n> [!NOTE]\n> \n> The [Azure Toolkit for Eclipse](http://marketplace.eclipse.org/content/azure-toolkit-eclipse) page at the Eclipse Marketplace lists the builds that are compatible with the toolkit.\n>"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/includes/prerequisites.md",
    "content": "## Prerequisites\n\nTo complete the steps in this article, you will need to install the Azure Toolkit for Eclipse, which requires the following software components:\n\n* An [Azure supported Java Development Kit (JDK)](../../fundamentals/java-support-on-azure.md)\n* An [Eclipse IDE](http://www.eclipse.org/downloads/)\n* The [Azure Toolkit for Eclipse](https://marketplace.eclipse.org/content/azure-toolkit-eclipse), see [installation guide](../installation.md) for more information\n* Be [signed in](../sign-in-instructions.md) to your Azure account for the Azure Toolkit for Eclipse\n\n> [!NOTE]\n> The [Azure Toolkit for Eclipse](http://marketplace.eclipse.org/content/azure-toolkit-eclipse) page at the Eclipse Marketplace lists the builds that are compatible with the toolkit.\n\n<!--\n> [!IMPORTANT]\n> If you are using the Azure Toolkit for Eclipse on Windows, the toolkit requires installing the Azure SDK 2.9.6 or later in order to use the Azure emulator. You have two options for installing the Azure SDK:\n>\n> * You can download and install the Azure SDK by using the [Web Platform Installer (WebPI)](https://go.microsoft.com/fwlink/?LinkID=252838).\n> * If you do not have the Azure SDK installed when you create your first Azure deployment project, you will be prompted to automatically download install the requisite version of the Azure SDK.\n>\n> Note that the Azure SDK is required on Windows only.\n-->"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/includes/show-azure-explorer.md",
    "content": "## Displaying the Azure Explorer view\n\nIf the **Azure Explorer** view is not visible in Eclipse, display it by doing the following:\n\n1. Click **Window**, hover over **Show View**, and then click **Other**.\n\n2. In the **Show View** dialog box, expand **Azure**, select **Azure Explorer**, and then click **Open**.\n\n    :::image type=\"content\" source=\"../media/show-azure-explorer/show-az-exp-02.png\" alt-text=\"Select the Azure Explorer option.\":::\n\n\n\n\n\n"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure Toolkit for Eclipse documentation\nsummary: The Azure Toolkit for Eclipse provides templates and functionality that you can use to easily create, develop, test, and deploy cloud applications to Azure from inside the Eclipse IDE.\n\nmetadata:\n  title: Azure Toolkit for Eclipse Documentation\n  description: Learn how the Azure Toolkit for Eclipse plug-in helps you create and deploy cloud applications to Azure.\n  ms.date: 10/23/2025\n  ms.topic: landing-page\n  author: KarlErickson\n  ms.author: karler\n  ms.custom: devx-track-java, devx-track-extended-java\n\nlandingContent:\n  - title: Get started guides\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Create a Hello World web app for Azure App Service\n            url: create-hello-world-web-app.md\n  - title: Step-by-step tutorials\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Create Spark applications for an HDInsight Spark Linux cluster\n            url: /azure/hdinsight/hdinsight-apache-spark-eclipse-tool-plugin\n  - title: Manage Azure resources\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Redis caches\n            url: managing-redis-caches-using-azure-explorer.md\n          - text: Storage accounts\n            url: managing-storage-accounts-using-azure-explorer.md\n          - text: Virtual machines\n            url: managing-virtual-machines-using-azure-explorer.md\n  - title: Supported JDKs\n    linkLists:\n      - linkListType: download\n        links:\n        - text: Java for Azure and Azure Stack\n          url: /java/azure/jdk/\n  - title: Source code\n    linkLists:\n      - linkListType: reference\n        links:\n          - text: Azure Toolkits for Java\n            url: https://github.com/microsoft/azure-tools-for-java"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/installation.md",
    "content": "---\ntitle: Installing the Azure Toolkit for Eclipse\ndescription: Learn how to install the Azure Toolkit for Eclipse plug-in to create and deploy cloud applications to Azure.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.date: 11/19/2021\nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Installing the Azure Toolkit for Eclipse\n\nThe Azure Toolkit for Eclipse provides functionality that allows you to easily create, develop, configure, test, and deploy lightweight, highly available, and scalable Java web apps and HDInsight Spark jobs to Azure using the Eclipse development environment.\n\n> [!NOTE]\n>\n> The Azure Toolkit for Eclipse is an Open Source project, whose source code is available under the MIT License from the project's site on GitHub at the following URL:\n>\n> <https://github.com/microsoft/azure-tools-for-java>\n\n[!INCLUDE [basic-prerequisites](includes/basic-prerequisites.md)]\n\nThere are two methods of installing the Azure Toolkit for Eclipse: by accessing the **Eclipse Marketplace**, and by using the **Install new software** option on the Help menu. Both installation methods will be demonstrated in the following sections.\n\n## Eclipse Marketplace\n\nThe Eclipse Marketplace wizard in the Eclipse IDE allows users to browse the [Eclipse Marketplace](https://marketplace.eclipse.org/) and install solutions. The following option takes you to the Eclipse Marketplace:\n\n- On the Eclipse IDE, click the **Help** menu, navigate to **Eclipse Marketplace**, search for \"Azure Toolkit for Eclipse\", and click **Install**.\n\n   :::image type=\"content\" source=\"media/installation/eclipse-marketplace-button.png\" alt-text=\"Marketplace window, Help menu.\":::\n\n1. An Eclipse Marketplace wizard will pop up with installation instructions, including a list of components that will be installed. Verify that all features are selected and click **Confirm >**.\n\n   | Feature | Description |\n   |---|---|\n   | **Application Insights Plugin for Java** | Allows you to use Azure's telemetry logging and analysis services for your applications and server instances. |\n   | **Azure Common Plugin** | Provides the common functionality needed by other toolkit components. |\n   | **Azure Container Tools for Eclipse** | Enables you to build and deploy a .WAR as a Docker container to a docker machine. |\n   | **Azure Explorer for Eclipse** | Provides an explorer-style interface for managing your Azure resources. |\n   | **Azure HDInsight plugin for Java** | Enables Apache Spark application development in Scala. |\n   | **Microsoft JDBC Driver 6.1 for SQL Server** | Provides JDBC API for SQL Server and Microsoft Azure SQL Database for Java Platform Enterprise Edition 8. |\n   | **Package for Microsoft Azure Libraries for Java** | Provides APIs for accessing Microsoft Azure services, such as storage, service bus, and service runtime. |\n   | **WebApp Plugin for Eclipse** | Enables you to deploy your web applications as Azure App Services. |\n\n1. In the **Review Licenses** dialog, review the terms of the license agreements. If you accept the terms of the license agreements, click **I accept the terms of the license agreements**, and then click **Finish**.\n\n   > [!NOTE]\n   > You can check the installation progress on the lower-right corner of your Eclipse workspace.\n\n1. Once installation has completed, you'll be prompted to restart the Eclipse IDE to apply the software update. Click **Restart Now**.\n\n## Install new software\n\nYou can install the Azure Toolkit for Eclipse directly from the **Help** menu in the form of new software.\n\n1. Click the **Help** menu, and then click **Install New Software**.\n\n   :::image type=\"content\" source=\"media/installation/eclipse-install-software-button.png\" alt-text=\"Install new software, Help menu.\":::\n\n1. In the **Available Software** dialog, type `https://azuredownloads.blob.core.windows.net/eclipse/` in the **Work with** text box.\n\n1. In the **Name** pane, check **Azure Toolkit for Java**, and uncheck **Contact all update sites during install to find required software**. Your screen should appear similar to the following:\n\n   :::image type=\"content\" source=\"media/installation/eclipse-installation-02.png\" alt-text=\"Installing the Azure Toolkit for Eclipse.\":::\n\n1. If you expand **Azure Toolkit for Java**, you'll see a list of components that will be installed; for example:\n\n   | Feature | Description |\n   |---|---|\n   | **Application Insights Plugin for Java** | Allows you to use Azure's telemetry logging and analysis services for your applications and server instances. |\n   | **Azure Common Plugin** | Provides the common functionality needed by other toolkit components. |\n   | **Azure Container Tools for Eclipse** | Enables you to build and deploy a .WAR as a Docker container to a docker machine. |\n   | **Azure Explorer for Eclipse** | Provides an explorer-style interface for managing your Azure resources. |\n   | **Azure HDInsight plugin for Java** | Enables Apache Spark application development in Scala. |\n   | **Microsoft JDBC Driver 6.1 for SQL Server** | Provides JDBC API for SQL Server and Microsoft Azure SQL Database for Java Platform Enterprise Edition 8. |\n   | **Package for Microsoft Azure Libraries for Java** | Provides APIs for accessing Microsoft Azure services, such as storage, service bus, and service runtime. |\n   | **WebApp Plugin for Eclipse** | Enables you to deploy your web applications as Azure App Services. |\n\n1. Click **Next**. (If you experience unusual delays when installing the toolkit, ensure that **Contact all update sites during install to find required software** is unchecked.)\n\n1. In the **Install Details** dialog, click **Next**.\n\n1. In the **Review Licenses** dialog, review the terms of the license agreements. If you accept the terms of the license agreements, click **I accept the terms of the license agreements** and then click **Finish**. (The remaining steps assume you do accept the terms of the license agreements. If you don't accept the terms of the license agreements, exit the installation process.)\n\n   > [!NOTE]\n   > You can check the installation progress on the lower-right corner of your Eclipse workspace.\n\n1. If prompted to restart Eclipse to complete the installation, click **Restart Now**.\n\n## Next steps\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\n<!-- URL List -->\n\n<!-- Legacy MSDN URL = https://msdn.microsoft.com/library/azure/hh690946.aspx -->\n"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/managing-redis-caches-using-azure-explorer.md",
    "content": "---\ntitle: Managing Redis Caches using the Azure Explorer for Eclipse\ndescription: Learn how to manage your Azure redis caches by using the Azure Explorer for Eclipse.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.date: 02/01/2018\nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Managing Redis Caches using the Azure Explorer for Eclipse\n\nThe Azure Explorer, which is part of the Azure Toolkit for Eclipse, provides Java developers with an easy-to-use solution for managing redis caches in their Azure account from inside the Eclipse IDE.\n\n[!INCLUDE [prerequisites](includes/prerequisites.md)]\n\n[!INCLUDE [show-azure-explorer](includes/show-azure-explorer.md)]\n\n## Create a Redis Cache by using Eclipse\n\nThe following steps walk you through the steps to create a redis cache using the Azure Explorer.\n\n1. Sign in to your Azure account using the steps in the [Sign In Instructions for the Azure Toolkit for Eclipse] article.\n\n1. In the **Azure Explorer** tool window, expand the **Azure** node, right-click **Redis Caches**, and then click **Create Redis Cache**.\n\n   ![Create Redis Cache Menu][CR01]\n\n1. When the **New Redis Cache** dialog box appears, specify the following options:\n\n   ![Create New Redis Cache Dialog Box][CR02]\n\n   a. **DNS Name**: Specifies the DNS subdomain for the new redis cache, which is prepended to **.redis.cache.windows.net**, for example, **wingtiptoys.redis.cache.windows.net**.\n\n   b. **Subscription**: Specifies the Azure subscription you want to use for the new redis cache.\n\n   c. **Resource Group**: Specifies the resource group for your redis cache; you need to choose one of the following options:\n      * **Create New**: Specifies that you want to create a new resource group.\n      * **Use Existing**: Specifies that you will choose from a list of resource groups associated with your Azure account.\n\n   d. **Location**: Specifies the location where your redis cache is created; for example, **West US**.\n\n   e. **Pricing Tier**: Specifies which pricing tier your redis cache uses; this setting determines the number of client connections. (For more information, see [Redis Cache Pricing].)\n\n   f. **Non-SSL port**: Specifies whether your redis cache allows non-SSL connections; by default, only SSL connections are allowed.\n\n1. When you have specified all your redis cache settings, click **OK**.\n\nAfter your redis cache has been created, it will be displayed in the Azure Explorer.\n\n   ![Redis Cache in Azure Explorer][CR03]\n\n> [!NOTE]\n>\n> For more information about configuring your Azure redis cache settings, see [How to configure Azure Redis Cache].\n>\n\n## Display the properties for your Redis Cache in Eclipse\n\n1. In the Azure Explorer, right-click your redis cache and click **Show properties**.\n\n   ![Azure Explorer context menu to display properties for a redis cache][SP01]\n\n1. The Azure Explorer displays the properties for your redis cache.\n\n   ![Redis cache properties][SP02]\n\n## Delete your Redis Cache by using Eclipse\n\n1. In the Azure Explorer, right-click your redis cache and click **Delete**.\n\n   ![Azure Explorer context menu to delete a redis cache][DE01]\n\n1. Click **OK** when prompted to delete your redis cache.\n\n   ![Delete redis cache prompt][DE02]\n\n## Next steps\n\nFor more information about Azure redis caches, configuration settings and pricing, see the following links:\n\n* [Azure Redis Cache]\n* [Redis Cache Documentation]\n* [Redis Cache Pricing]\n* [How to configure Azure Redis Cache]\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\n<!-- URL List -->\n\n[Redis Cache Pricing]: https://azure.microsoft.com/pricing/details/cache/\n[Azure Redis Cache]: https://azure.microsoft.com/services/cache/\n[Redis Cache Documentation]: /azure/azure-cache-for-redis/\n[How to configure Azure Redis Cache]: /azure/azure-cache-for-redis/cache-configure\n\n<!-- IMG List -->\n\n[CR01]: media/managing-redis-caches-using-azure-explorer/CR01.png\n[CR02]: media/managing-redis-caches-using-azure-explorer/CR02.png\n[CR03]: media/managing-redis-caches-using-azure-explorer/CR03.png\n\n[SP01]: media/managing-redis-caches-using-azure-explorer/SP01.png\n[SP02]: media/managing-redis-caches-using-azure-explorer/SP02.png\n\n[DE01]: media/managing-redis-caches-using-azure-explorer/DE01.png\n[DE02]: media/managing-redis-caches-using-azure-explorer/DE02.png\n"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/managing-storage-accounts-using-azure-explorer.md",
    "content": "---\ntitle: Manage storage accounts with Azure Explorer for Eclipse\ndescription: Learn how to manage your Azure storage accounts by using the Azure Explorer for Eclipse.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.date: 08/25/2020\nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Manage storage accounts by using the Azure Explorer for Eclipse\n\n> [!NOTE]\n> The Storage Accounts feature in Azure Explorer is deprecated. You can utilize the Azure portal to create and manage storage accounts and containers. See the [Azure Storage](/azure/storage/blobs/storage-quickstart-blobs-portal) documentation for quickstarts on how to manage storage accounts.\n\nAzure Explorer, which is part of the Azure Toolkit for Eclipse, provides Java developers with an easy-to-use solution for managing storage accounts in their Azure account from inside the Eclipse integrated development environment (IDE).\n\n[!INCLUDE [prerequisites](includes/prerequisites.md)]\n\n[!INCLUDE [show-azure-explorer](includes/show-azure-explorer.md)]\n\n## Create a storage account\n\n1. Sign in to your Azure account by using the [Sign-in instructions for the Azure Toolkit for Eclipse](./sign-in-instructions.md).\n\n1. In the **Azure Explorer** view, expand the **Azure** node, right-click **Storage Accounts**, and then click **Create Storage Account**.\n\n1. In the **Create Storage Account** dialog box, specify the following options:\n\n   * **Name**: Specifies the name for the new storage account.\n\n   * **Subscription**: Specifies the Azure subscription that you want to use for the new storage account.\n\n   * **Resource Group**: Specifies the resource group for your storage account. Select one of the following options:\n      * **Create New**: Specifies that you want to create a new resource group.\n      * **Use Existing**: Specifies that you will select from a list of resource groups that are associated with your Azure account.\n\n   * **Region**: Specifies the location where your storage account is created - for example, \"West US\".\n\n   * **Account kind**: Specifies the type of storage account to create - for example, \"General purpose v1\". For more information, see [About Azure storage accounts].\n\n   * **Performance**: Specifies which storage account offering to use from the selected publisher - for example, \"Standard\". For more information, see [Azure storage scalability and performance targets].\n\n   * **Replication**: Specifies the replication for the storage account - for example, \"Locally Redundant\". For more information, see [Azure storage replication].\n\n1. When you have specified all of the preceding options, click **Create**.\n\n## Create and manage storage containers\n\nTo create and manage storage containers, visit the Azure portal or programatically provision your resources.\n\nSee [Upload, download, and list blobs with the Azure portal](/azure/storage/blobs/storage-quickstart-blobs-portal) for a step-by-step tutorial on how to use the Azure portal to create a container in Azure Storage, and to upload and download block blobs in that container.\n\n## Delete a storage account\n\n1. In the **Azure Explorer** view, right-click the storage account, and then click **Delete**.\n\n1. In the confirmation window, click **OK**.\n\n\n## Next steps\n\nFor more information about Azure storage accounts, sizes, and pricing, see the following resources:\n\n* [Introduction to Microsoft Azure Storage]\n* [About Azure storage accounts]\n* Azure storage-account sizes\n  * [Sizes for Windows storage accounts in Azure]\n  * [Sizes for Linux storage accounts in Azure]\n* Azure storage-account pricing\n  * [Windows storage-account pricing]\n  * [Linux storage-account pricing]\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\n<!-- URL List -->\n\n[Introduction to Microsoft Azure Storage]: /azure/storage/common/storage-introduction\n[About Azure storage accounts]: /azure/storage/storage-create-storage-account\n[Azure storage replication]: /azure/storage/storage-redundancy\n[Azure storage scalability and Performance Targets]: /azure/storage/storage-scalability-targets\n[Naming and referencing containers, blobs, and metadata]: /rest/api/storageservices/Naming-and-Referencing-Containers--Blobs--and-Metadata\n\n[Sizes for Windows storage accounts in Azure]: /azure/virtual-machines/sizes\n[Sizes for Linux storage accounts in Azure]: /azure/virtual-machines/sizes\n[Windows storage-account pricing]: https://azure.microsoft.com/pricing/details/virtual-machines/windows/\n[Linux storage-account pricing]: https://azure.microsoft.com/pricing/details/virtual-machines/linux/\n\n<!-- IMG List -->\n\n[CS01]: media/managing-storage-accounts-using-azure-explorer/CS01.png\n[CS02]: media/managing-storage-accounts-using-azure-explorer/CS02.png\n[CC01]: media/managing-storage-accounts-using-azure-explorer/CC01.png\n[CC02]: media/managing-storage-accounts-using-azure-explorer/CC02.png\n\n[DS01]: media/managing-storage-accounts-using-azure-explorer/DS01.png\n[DS02]: media/managing-storage-accounts-using-azure-explorer/DS02.png\n[DC01]: media/managing-storage-accounts-using-azure-explorer/DC01.png\n[DC02]: media/managing-storage-accounts-using-azure-explorer/DC02.png\n"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/managing-virtual-machines-using-azure-explorer.md",
    "content": "---\ntitle: Manage virtual machines with Azure Explorer for Eclipse\ndescription: Learn how to manage your Azure virtual machines by using the Azure Explorer for Eclipse.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.date: 08/25/2020\nms.topic: how-to\nms.custom:\n  - devx-track-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Manage virtual machines by using the Azure Explorer for Eclipse\n\nThe Azure Explorer, which is part of the Azure Toolkit for Eclipse, provides Java developers with an easy-to-use solution for managing virtual machines in their Azure account from inside the Eclipse integrated development environment (IDE).\n\n[!INCLUDE [prerequisites](includes/prerequisites.md)]\n\n[!INCLUDE [show-azure-explorer](includes/show-azure-explorer.md)]\n\n## Create a virtual machine\n\n1. Sign in to your Azure account by using the [Sign-in instructions for the Azure Toolkit for Eclipse](./sign-in-instructions.md).\n\n1. In the **Azure Explorer** view, expand the **Azure** node, right-click **Virtual Machines**, and then click **Create VM**.\n\n   :::image type=\"content\" source=\"media/managing-virtual-machines-using-azure-explorer/CR01.png\" alt-text=\"Create VM option in Azure Explorer.\":::\n\n1. In the **Choose a Subscription** window, select your subscription, and then click **Next**.\n\n1. In the **Select a Virtual Machine Image** window, select your **Location** - for example, **West US**. You'll have the option to proceed with a recommended image or select a custom image. For this quickstart, we will proceed with the recommended image. \n\n   If you choose to select a custom image, enter the following information:\n   * **Publisher**: Specifies the publisher that created the image you'll use to create your virtual machine - for example, **Microsoft**.\n\n   * **Offer**: Specifies the virtual machine offering to use from the selected publisher - for example, **JDK**.\n\n   * **Sku**: Specifies the stockkeeping unit (SKU) to use from the selected offering - for example, **JDK_8**.\n\n   * **Version #**: Specifies which version of the selected SKU to use.\n\n1. Click **Next**.\n\n1. In the **Virtual Machine Basic Settings** window, enter the following information:\n\n   * **Virtual Machine Name**: Specifies the name for your new virtual machine, which must start with a letter and contain only letters, numbers, and hyphens.\n\n   * **Size**: Specifies the number of cores and memory to allocate for your virtual machine.\n\n   * **User name**: Specifies the administrator account to create for managing your virtual machine.\n\n   * **Password** : Specifies the password for your administrator account. Re-enter your password in the **Confirm** box to validate the credential.\n\n1. Click **Next**.\n\n1. In the **Associated Resources** window, enter the following information:\n   * **Resource Group**: Specifies the resource group for your virtual machine. Select one of the following options:\n      * **Create new**: Specifies that you want to create a new resource group.\n      * **Use existing**: Specifies that you want to select a resource group that is already associated with your Azure account.\n\n   * **Storage account**: Specifies the storage account to use for storing your virtual machine. You can use an existing storage account or create a new account.\n\n   * **Virtual Network** and **Subnet**: Specifies the virtual network and subnet that your virtual machine will connect to. You can use an existing network and subnet, or you can create a new network and subnet. If you select **Create new**, the following dialog box is displayed:\n\n   * **Public IP address**: Specifies an external-facing IP address for your virtual machine. You can choose to create a new IP address or, if your virtual machine will not have a public IP address, you can select **(None)**.\n\n   * **Network security group**: Specifies an optional networking firewall for your virtual machine. You can select an existing firewall or, if your virtual machine will not use a network firewall, you can select **(None)**.\n\n   * **Availability set**: Specifies an optional availability set that your virtual machine can belong to. You can select an existing availability set or create a new availability set or, if your virtual machine will not belong to an availability set, you can select **(None)**.\n\n10. Click **Finish**.  \n\n      > [!NOTE]\n      > You can check the creation progress on the lower-right corner of your Eclipse workspace.\n\n## Restart a virtual machine\n\nTo restart a virtual machine by using the Azure Explorer in Eclipse, do the following:\n\n1. In the **Azure Explorer** view, right-click the virtual machine, and then select **Restart**.\n\n1. In the confirmation window, click **OK**.\n\n   ![The virtual-machine restart confirmation window](media/managing-virtual-machines-using-azure-explorer/RE02.png)\n\n## Shut down a virtual machine\n\nTo shut down a running virtual machine by using the Azure Explorer in Eclipse, do the following:\n\n1. In the **Azure Explorer** view, right-click the virtual machine, and then select **Shutdown**.\n\n1. In the confirmation window, click **OK**.\n\n   ![The virtual-machine shutdown confirmation window](media/managing-virtual-machines-using-azure-explorer/SH02.png)\n\n## Delete a virtual machine\n\nTo delete a virtual machine by using the Azure Explorer in Eclipse, do the following:\n\n1. In the **Azure Explorer** view, right-click the virtual machine, and then select **Delete**.\n\n1. In the confirmation window, click **ok**.\n\n   ![The virtual-machine delete confirmation window](media/managing-virtual-machines-using-azure-explorer/DE02.png)\n\n## Next steps\n\nFor more information about Azure virtual-machine sizes and pricing, see the following resources:\n\n* Azure virtual-machine sizes\n  * [Sizes for Windows virtual machines in Azure]\n  * [Sizes for Linux virtual machines in Azure]\n* Azure virtual-machine pricing\n  * [Windows virtual-machine pricing]\n  * [Linux virtual-machine pricing]\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\n<!-- URL List -->\n\n[Sizes for Windows virtual machines in Azure]: /azure/virtual-machines/sizes\n[Sizes for Linux virtual machines in Azure]: /azure/virtual-machines/sizes\n[Windows virtual-machine pricing]: https://azure.microsoft.com/pricing/details/virtual-machines/windows/\n[Linux virtual-machine pricing]: https://azure.microsoft.com/pricing/details/virtual-machines/linux/\n\n<!-- IMG List -->\n\n[RE01]: media/managing-virtual-machines-using-azure-explorer/RE01.png\n[RE02]: media/managing-virtual-machines-using-azure-explorer/RE02.png\n\n[SH01]: media/managing-virtual-machines-using-azure-explorer/SH01.png\n[SH02]: media/managing-virtual-machines-using-azure-explorer/SH02.png\n\n[DE01]: media/managing-virtual-machines-using-azure-explorer/DE01.png\n[DE02]: media/managing-virtual-machines-using-azure-explorer/DE02.png\n\n[CR01]: media/managing-virtual-machines-using-azure-explorer/CR01.png\n[CR02]: media/managing-virtual-machines-using-azure-explorer/CR02.png\n[CR03]: media/managing-virtual-machines-using-azure-explorer/CR03.png\n[CR04]: media/managing-virtual-machines-using-azure-explorer/CR04.png\n[CR05]: media/managing-virtual-machines-using-azure-explorer/CR05.png\n[CR06]: media/managing-virtual-machines-using-azure-explorer/CR06.png\n[CR07]: media/managing-virtual-machines-using-azure-explorer/CR07.png\n[CR08]: media/managing-virtual-machines-using-azure-explorer/CR08.png\n"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/sign-in-instructions.md",
    "content": "---\ntitle: Sign-in instructions for the Azure Toolkit for Eclipse\ndescription: Learn how to sign into Microsoft Azure by using the Azure Toolkit for Eclipse.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.date: 02/01/2018\nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Sign-in instructions for the Azure Toolkit for Eclipse\n\nThe Azure Toolkit for Eclipse provides two methods for signing into your Azure account:\n\n  - [Sign in to your Azure account by Device Login](#sign-in-to-your-azure-account-by-device-login)\n  - [Sign in to your Azure account by Service Principal](#sign-in-to-your-azure-account-by-service-principal)\n\n[**Sign out**](#sign-out-of-your-azure-account) methods are also provided.\n\n[!INCLUDE [prerequisites](includes/prerequisites.md)]\n\n## Sign in to your Azure account by Device Login\n\nThis section walks you through the Azure sign in process by device login.\n\n1. Open your project with Eclipse.\n\n1. Click **Tools**, then click **Azure**, and then click **Sign In**.\n\n      :::image type=\"content\" source=\"media/sign-in-instructions/eclipse-azure-signin.png\" alt-text=\"Sign in to Azure in Eclipse IDE.\":::\n\n1. In the **Azure Sign In** window, select **Device Login**, and then click **Sign in**.\n\n1. Click **Copy&Open** in **Azure Device Login** dialog .\n\n> [!NOTE]\n>\n> If the browser doesn't open, configure Eclipse to use an external browser like Internet Explorer, Firefox, or Chrome:\n>\n> 1. Open Preferences -> General -> Web Browser -> Use external web browser in Eclipse\n>\n> 2. Select the browser you prefer to use\n>\n\n1. In the browser, paste your device code (which has been copied when you clicked **Copy&Open** in last step) and then click **Next**.\n\n1. Select your Azure account and complete any authentication procedures necessary in order to sign in.\n\n1. Once signed in, close your browser and switch back to your Eclipse IDE. In the **Select Subscriptions** dialog box, select the subscriptions that you want to use, then click **OK**.\n\n## Sign in to your Azure account by Service Principal\n\nThis section walks you through creating a credentials file that contains your service principal data. After you have completed this process, Eclipse uses the credentials file to automatically sign you into Azure when opening your project.\n\n1. Open your project with Eclipse.\n\n2. Click **Tools**, then click **Azure**, and then click **Sign In**.\n\n      :::image type=\"content\" source=\"media/sign-in-instructions/eclipse-azure-signin.png\" alt-text=\"Sign in to Azure in Eclipse IDE.\":::\n\n3. In the **Azure Sign In** window, select **Service Principal**. If you do not have the service principal authentication file yet, click **New** to create one. Otherwise you can click **Browse** to open it and jump to step 8.\n\n4. Click **Copy&Open** in **Azure Device Login** dialog.\n\n> [!NOTE]\n>\n> If the browser doesn't open, configure eclipse to use an external browser like IE or Chrome:\n>\n> 1. Open Preferences -> General -> Web Browser -> Use external web browser in Eclipse\n>\n> 2. Select the browser you prefer to use\n>\n\n5. In the browser, paste your device code (which has been copied when you click **Copy&Open** in last step) and then click **Next**.\n\n6. In the **Create Authentication Files** window, select the subscriptions that you want to use, choose your destination directory, and then click **Start**.\n\n7. In the **Service Principal Creation Status** dialog box, click **OK** after your files have been created successfully.\n\n8. Address of the created file will be automatically filled in the **Azure Sign In** window, now click **Sign in**.\n\n9. Finally, in the **Select Subscriptions** dialog box, select the subscriptions that you want to use, then click **OK**.\n\n\n## Sign out of your Azure account\n\nAfter you have configured your account by preceding steps, you will be automatically signed in each time you start Eclipse. However, if you want to sign out of your Azure account, use the following steps.\n\n1. In Eclipse, click **Tools**, then click **Azure**, and then click **Sign Out**.\n\n2. When the **Azure Sign Out** dialog box appears, click **Yes**.\n\n## Next steps\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\n<!-- URL List -->\n\n\n<!-- IMG List -->\n\n"
  },
  {
    "path": "articles/java/toolkit-for-eclipse/toc.yml",
    "content": "items:\n- name: Azure Toolkit for Eclipse documentation\n  href: index.yml\n  items:\n  - name: Get Started\n    href: create-hello-world-web-app.md\n  - name: How-To\n    expanded: true\n    items: \n    - name: Install the toolkit\n      href: installation.md\n    - name: Sign in to your Azure account\n      href: sign-in-instructions.md\n    - name: Manage Azure resources\n      expanded: true\n      items:\n       - name: Virtual machines\n         href: managing-virtual-machines-using-azure-explorer.md\n       - name: Storage accounts\n         href: managing-storage-accounts-using-azure-explorer.md\n       - name: Azure Redis Cache\n         href: managing-redis-caches-using-azure-explorer.md\n  - name: Release notes\n    href: https://github.com/Microsoft/azure-tools-for-java/releases\n  - name: Marketplace\n    href: https://marketplace.eclipse.org/content/azure-toolkit-eclipse"
  },
  {
    "path": "articles/java/toolkit-for-intellij/chatgpt-intellij.md",
    "content": "---\ntitle: \"Quickstart: Get started using GPT-35-Turbo and GPT-4 with Azure OpenAI Service using IntelliJ\"\ndescription: Shows you how to get started with Azure OpenAI Service and make your first chat completions call with IntelliJ IDEA.\nms.custom: devx-track-java, devx-track-extended-java\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.topic: quickstart\nms.date: 08/08/2025\nms.update-cycle: 180-days\nms.subservice: intelligent-apps\nms.collection: ce-skilling-ai-copilot\n---\n\n# Quickstart: Get started using GPT-35-Turbo and GPT-4 with Azure OpenAI Service in IntelliJ\n\nThis article shows you how to get started with Azure OpenAI Service in IntelliJ IDEA. It shows you how to use chat models such as GPT-3.5-Turbo and GPT-4 to test and experiment with different parameters and data sources.\n\n## Prerequisites\n\n- A supported Java Development Kit (JDK). For more information about the JDKs available for use when developing on Azure, see [Java support on Azure and Azure Stack](../fundamentals/java-support-on-azure.md).\n- [IntelliJ IDEA](https://www.jetbrains.com/idea/download/), Ultimate or Community Edition.\n- The Azure Toolkit for IntelliJ. For more information, see [Install the Azure Toolkit for IntelliJ](install-toolkit.md). You also need to sign in to your Azure account for the Azure Toolkit for IntelliJ. For more information, see [Sign-in instructions for the Azure Toolkit for IntelliJ](sign-in-instructions.md).\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- Access granted to Azure OpenAI in the desired Azure subscription.\n\n  Currently, access to this service is granted only by application. You can apply for access to Azure OpenAI by completing the form at [Request Access to Azure OpenAI Service](https://aka.ms/oai/access?azure-portal=true).\n\n- An Azure OpenAI Service resource with either the `gpt-35-turbo` or the `gpt-4` models deployed. For more information about model deployment, see [Create and deploy an Azure OpenAI Service resource](/azure/ai-services/openai/how-to/create-resource).\n\n## Install and sign-in\n\nThe following steps walk you through the Azure sign-in process in your IntelliJ development environment:\n\n1. If you don't have the plugin installed, see [Azure Toolkit for IntelliJ](https://plugins.jetbrains.com/plugin/8053).\n\n1. To sign in to your Azure account, navigate to the left-hand **Azure Explorer** sidebar, and then select the **Azure Sign In** icon. Alternatively, you can navigate to **Tools**, expand **Azure**, and then select **Azure Sign in**.\n\n   :::image type=\"content\" source=\"media/sign-in-instructions/I01.png\" alt-text=\"Screenshot of the IntelliJ IDEA with the Azure Sign In button highlighted.\" lightbox=\"media/sign-in-instructions/I01.png\":::\n\n1. In the **Azure Sign In** window, select **OAuth 2.0**, and then select **Sign in**. For other sign-in options, see [Sign-in instructions for the Azure Toolkit for IntelliJ](sign-in-instructions.md).\n\n1. In the browser, sign in with your account that has access to your OpenAI resource and then go back to IntelliJ. In the **Select Subscriptions** dialog box, select the subscription that you want to use, then select **Select**.\n\n## Create and deploy an Azure OpenAI Service resource\n\n1. After the sign-in workflow, right-click the Azure OpenAI item in Azure Explorer and select **Create Azure OpenAI Service**.\n1. In the **Create Azure OpenAI Service** dialog box, specify the following information and then select **OK**:\n\n   - **Name**: A descriptive name for your Azure OpenAI Service resource, such as **MyOpenAIResource**. This name is also your custom domain name in your endpoint. Your resource name can only include alphanumeric characters and hyphens, and can't start or end with a hyphen.\n   - **Region**: The location of your instance. Certain models are only available in specific regions. For more information, see [Azure OpenAI Service models](/azure/ai-services/openai/concepts/models).\n   - **Sku**: Standard Azure OpenAI resources are billed based on token usage. For more information, see [Azure OpenAI Service pricing](https://azure.microsoft.com/pricing/details/cognitive-services/openai-service/).\n\n1. Before you can use chat completions, you need to deploy a model. Right-click your Azure OpenAI instance, and select **Create New Deployment**. In the pop-up **Create Azure OpenAI Deployment** dialog box, specify the following information and then select **OK**:\n\n   - **Deployment Name**: Choose a name carefully. The deployment name is used in your code to call the model by using the client libraries and the REST APIs.\n   - **Model**: Select a model. Model availability varies by region. For a list of available models per region, see the [Model summary table and region availability](/azure/ai-services/openai/concepts/models#model-summary-table-and-region-availability) section of [Azure OpenAI Service models](/azure/ai-services/openai/concepts/models).\n\nThe toolkit displays a status message when the deployment is complete and ready for use.\n\n## Interact with Azure OpenAI using prompts and settings\n\n1. Right-click your Azure OpenAI resource and then select **Open in AI Playground**.\n1. You can start exploring OpenAI capabilities through the Azure OpenAI Studio Chat playground in IntelliJ IDEA.\n\n   :::image type=\"content\" source=\"media/chatgpt-intellij/chat-playground-overview.png\" alt-text=\"Screenshot of the IntelliJ IDEA that shows the Chat playground overview window.\" lightbox=\"media/chatgpt-intellij/chat-playground-overview.png\":::\n\nTo trigger the completion, you can input some text as a prompt. The model generates the completion and attempts to match your context or pattern.\n\nTo start a chat session, follow these steps:\n\n1. In the chat session pane, you can start with a simple prompt like this one: \"I'm interested in buying a new Surface.\" After you type the prompt, select **Send**. You receive a response similar to the following example:\n\n   ```output\n   Great! Which Surface model are you interested in? There are several options available such as the Surface Pro, Surface Laptop, Surface Book, Surface Go, and Surface Studio. Each one has its own unique features and specifications, so it's important to choose the one that best fits your needs.\n   ```\n\n   :::image type=\"content\" source=\"media/chatgpt-intellij/surface-chat.png\" alt-text=\"Screenshot of the IntelliJ IDEA that shows the playground window with a first question and answer.\" lightbox=\"media/chatgpt-intellij/surface-chat.png\":::\n\n1. Enter a follow-up question like: \"Which models support GPU?\" and select **Send**. You receive a response similar to the following example:\n\n   ```output\n   Most Surface models come with an integrated GPU (Graphics Processing Unit), which is sufficient for basic graphics tasks such as video playback and casual gaming. However, if you're looking for more powerful graphics performance, the Surface Book 3 and the Surface Studio 2 come with dedicated GPUs. The Surface Book 3 has an NVIDIA GeForce GTX GPU, while the Surface Studio 2 has an NVIDIA GeForce GTX 1060 or 1070 GPU, depending on the configuration.\n   ```\n\n   :::image type=\"content\" source=\"media/chatgpt-intelliJ/surface-chat-more.png\" alt-text=\"Screenshot of the IntelliJ IDEA that shows the playground window with a first and second question and answer.\" lightbox=\"media/chatgpt-intelliJ/surface-chat-more.png\":::\n\n1. Now that you have a basic conversation, select **View code** from the pane, and you have a replay of the code behind the entire conversation so far. You can see the code samples based on Java SDK, curl, and JSON that correspond to your chat session and settings, as shown in the following screenshot:\n\n   :::image type=\"content\" source=\"media/chatgpt-intelliJ/view-code.png\" alt-text=\"Screenshot of the IntelliJ IDEA that shows the Sample Code window.\" lightbox=\"media/chatgpt-intelliJ/view-code.png\":::\n\n1. You can then select **Copy** to take this code and write an application to complete the same task you're currently performing with the playground.\n\n## Settings\n\nYou can select the **Configuration** tab to set the following parameters:\n\n| Name              | Description                                                                                                                                                                                                                                                                                                                   |\n|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| Max response      | Sets a limit on the number of tokens the model can generate.<br>The total tokens (prompt + response) you can send depends on the model you deploy:<br>• gpt-35-turbo-1106 / 0125 – up to 16 385 tokens<br>• gpt-35-turbo-16k-0613 – up to 16 385 tokens<br>• gpt-4-turbo-2024-04-09 – up to 128 000 tokens<br>• gpt-4o-2024-05-13 – up to 128 000 tokens<br>For the full, up-to-date list of limits, see [Model summary table and region availability](/azure/ai-foundry/openai/concepts/models#model-summary-table-and-region-availability). Always ensure the sum of your prompt and expected completion fits within the model's context window. |\n| Temperature       | Controls randomness. Lowering the temperature means that the model produces more repetitive and deterministic responses. Increasing the temperature results in more unexpected or creative responses. Try adjusting temperature or Top probabilities, but not both.                                                           |\n| Top probabilities | Similar to temperature, controls randomness but uses a different method. Lowering the Top probabilities value narrows the model's token selection to likelier tokens. Increasing the value lets the model choose from tokens with both high and low likelihood. Try adjusting temperature or Top probabilities, but not both. |\n| Stop sequences    | Makes the model end its response at a desired point. The model response ends before the specified sequence, so it doesn't contain the stop sequence text. For GPT-35-Turbo, using `<|im_end|>` ensures that the model response doesn't generate a follow-up user query. You can include as many as four stop sequences.       |\n| Frequency penalty | Reduces the chance of repeating a token proportionally based on how often it appears in the text so far. This action decreases the likelihood of repeating the exact same text in a response.                                                                                                                                 |\n| Presence penalty  | Reduces the chance of repeating any token that appears in the text at all so far. This increases the likelihood of introducing new topics in a response.                                                                                                                                                                      |\n\n## Clean up resources\n\nAfter you're done testing out the chat playground, if you want to clean up and remove an OpenAI resource, you can delete the resource or resource group. Deleting the resource group also deletes any other resources associated with it. Use the following steps to clean up resources:\n\n1. To delete your Azure OpenAI resources, navigate to the left-hand **Azure Explorer** sidebar and locate the **Azure OpenAI** item.\n\n1. Right-click the Azure OpenAI service you'd like to delete and then select **Delete**.\n\n1. To delete your resource group, visit the [Azure portal](https://portal.azure.com) and manually delete the resources under your subscription.\n\n## Next steps\n\nFor more information, see [Learn how to work with the GPT-35-Turbo and GPT-4 models](/azure/ai-services/openai/how-to/chatgpt?pivots=programming-language-chat-completions).\n\nFor more examples, check out the [Azure OpenAI Samples GitHub repository](https://github.com/Azure-Samples/openai).\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/create-container-apps-intellij.md",
    "content": "---\ntitle: Deploy to Azure Container Apps using IntelliJ IDEA\ndescription: Deploy Java projects to Azure Container Apps using IntelliJ IDEA.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.topic: quickstart\nms.date: 06/17/2025\nms.custom:\n  - devx-track-java\n  - sfi-image-nochange\n---\n\n# Quickstart: Deploy to Azure Container Apps using IntelliJ IDEA\n\nThis article shows you how to deploy a containerized application to Azure Container Apps using Azure Toolkit for IntelliJ IDEA. The article uses a sample backend web API service that returns a static collection of music albums.\n\n## Prerequisites\n\n- An Azure account with an active subscription. If you don't have a subscription, create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n- A supported Java Development Kit (JDK). For more information about the JDKs available for use when developing on Azure, see [Java support on Azure and Azure Stack](/azure/developer/java/fundamentals/java-support-on-azure).\n- [IntelliJ IDEA](https://www.jetbrains.com/idea/download/), Ultimate or Community Edition.\n- [Maven 3.5.0+](https://maven.apache.org/download.cgi).\n- A [Docker](https://www.docker.com/) client.\n- The [Azure Toolkit for IntelliJ](https://plugins.jetbrains.com/plugin/8053). For more information, see [Install the Azure Toolkit for IntelliJ](install-toolkit.md). You also need to sign in to your Azure account for the Azure Toolkit for IntelliJ. For more information, see [Sign-in instructions for the Azure Toolkit for IntelliJ](sign-in-instructions.md).\n\n## Clone the project\n\nUse the following steps to clone and open the sample project:\n\n1. Use the following commands to clone the sample app and check out the **IDE** branch:\n\n    ```bash\n    git clone https://github.com/Azure-Samples/containerapps-albumapi-java\n    cd containerapps-albumapi-java\n    git checkout IDE\n    ```\n\n1. Select **Open** to open the project in IntelliJ IDEA.\n\n## Build and run the project locally\n\nUse the following steps to test the project locally:\n\n1. Use the following command to build the project with [Maven](https://maven.apache.org/download.cgi):\n\n    ```azurecli\n    mvn clean package -DskipTests\n    ```\n\n1. To verify that the application is running, open a browser and go to `http://localhost:8080/albums`. The page returns a list of JSON objects similar to the output of the following command:\n\n    ```azurecli\n    java -jar target\\containerapps-albumapi-java-0.0.1-SNAPSHOT.jar\n    ```\n\n## Create an environment\n\nUse the following steps to set up your environment and deploy a container app in Azure:\n\n1. In the **Azure Explorer** view, right-click **Container Apps Environment** and then select **Create Container Apps Environment**.\n1. On the **Create Container Apps Environment** page, enter the following information, and then select **OK**:\n\n    - **Subscription**: The Azure subscription to use.\n    - **Resource Group**: The resource group for your container apps. Select one of the following options:\n        - **Create New**: Specifies that you want to create a new resource group.\n        - **Use Existing**: Specifies that you must select from a list of resource groups that are associated with your Azure account.\n    - **Region**: The appropriate region, for example, **East US**.\n    - **Name**: The name for the new Container Apps environment.\n    - **Type**: The type of Container Apps environment. You can accept the default.\n    - **Workload Profiles**: The workload profiles for your container apps. You can accept the default.\n    - **Log Analytics workspace**: The Log Analytics workspace to use. You can accept the default.\n\n    :::image type=\"content\" source=\"media/create-container-apps-intellij/create-container-apps-environment.png\" alt-text=\"Screenshot of Intelli J that shows the Create Container Apps Environment dialog box.\" lightbox=\"media/create-container-apps-intellij/create-container-apps-environment.png\":::\n\n### Deploy the container app\n\nTo deploy the container app, use the following steps:\n\n#### [SourceCode](#tab/sourcecode)\n\n1. Right-click the Container Apps environment you created, and select **Create** > **Container App** in Azure Explorer. Then, enter the following information:\n\n    - **Subscription**: The Azure subscription to use.\n    - **Resource Group**: The resource group for your container apps. Select one of the following options:\n        - **Create New**: Specifies that you want to create a new resource group.\n        - **Use Existing**: Specifies that you must select from a list of resource groups that are associated with your Azure account.\n    - **Environment**: The Container Apps environment to use.\n    - **Name**: The name for a new container app.\n    - **Deployment**:\n        - **Source**: Select the **Source Code** option.\n        - **Code**: Select the folder button, and then select the source code folder on your local machine.\n    - **Container Resource Allocation**:\n        - **Workload Profile**: Select the appropriate workload profile based on your application's requirements.\n        - **CPU and Memory**: Allocate the necessary CPU and memory resources for your container app.\n    - **Ingress Settings**:\n        - **Ingress**: Enable or disable ingress based on your application's needs. You can accept the default settings.\n        - **External Traffic**: Specifies whether the container app should accept external traffic. You can accept the default settings.\n        - **Target Port**: Enable or disable ingress based on your application's needs. Configure the target port to `8080`.\n    - **Other**:\n        - **Env Variables**: Set any environment variables required by your application.\n        - **Min Replicas**: The minimum number of replicas for your container app. You can accept the default settings.\n        - **Max Replicas**: The maximum number of replicas for your container app. You can accept the default settings.\n\n    :::image type=\"content\" source=\"media/create-container-apps-intellij/deploy-to-container-apps-source-code.png\" alt-text=\"Screenshot of Intelli J that shows the Create Azure Container App dialog box.\" lightbox=\"media/create-container-apps-intellij/deploy-to-container-apps-source-code.png\":::\n\n1. Select **OK**. The toolkit displays a status message when the app deployment succeeds.\n\n1. After the deployment finishes, the Azure Toolkit for IntelliJ displays a notification. Select **Browse** to open the deployed app in a browser.\n\n    :::image type=\"content\" source=\"media/create-container-apps-intellij/deploy-to-container-apps.png\" alt-text=\"Screenshot of the deployed app in a browser window.\" lightbox=\"media/create-container-apps-intellij/deploy-to-container-apps.png\":::\n\n1. In the browser's address bar, append the `/albums` path to the end of the app URL to view data from a sample API request.\n\n#### [Artifact](#tab/artifact)\n\n1. Right-click the Container Apps environment you created and then, in Azure Explorer, select **Create** > **Container App**. Enter the following information:\n\n    - **Subscription**: The Azure subscription to use.\n    - **Resource Group**: The resource group for your container apps. Select one of the following options:\n        - **Create New**: Specifies that you want to create a new resource group.\n        - **Use Existing**: Specifies that you must select from a list of resource groups that are associated with your Azure account.\n    - **Environment**: The Container Apps environment to use.\n    - **Name**: The name for a new container app.\n    - **Deployment**:\n        - **Source**: Select **Artifact**.\n        - **Artifact**: Select the artifact file from your local machine by first selecting the folder button.\n    - **Container Resource Allocation**:\n        - **Workload Profile**: Select the appropriate workload profile, based on your application's requirements.\n        - **CPU and Memory**: Allocate the necessary CPU and memory resources for your container app.\n    - **Ingress Settings**:\n        - **Ingress**: Enable or disable ingress based on your application's needs. You can accept the default settings.\n        - **External Traffic**: Specifies whether the container app should accept external traffic. You can accept the default settings.\n        - **Target Port**: Enable or disable ingress based on your application's needs. Configure the target port to `8080`.  \n    - **Other**:\n        - **Env Variables**: Set any environment variables required by your application.\n        - **Min Replicas**: The minimum number of replicas for your container app. You can accept the default settings.\n        - **Max Replicas**: The maximum number of replicas for your container app. You can accept the default settings.\n\n    :::image type=\"content\" source=\"media/create-container-apps-intellij/create-azure-container-apps-artifact.png\" alt-text=\"Screenshot of Intelli J that shows the Create Azure Container App dialog box.\" lightbox=\"media/create-container-apps-intellij/create-azure-container-apps-artifact.png\":::\n\n1. Select **OK**. The toolkit displays a status message when the app deployment succeeds.\n\n1. After the deployment finishes, the Azure Toolkit for IntelliJ displays a notification. Select **Browse** to open the deployed app in a browser.\n\n    :::image type=\"content\" source=\"media/create-container-apps-intellij/deploy-to-container-apps.png\" alt-text=\"Screenshot of the deployed app in a browser window.\" lightbox=\"media/create-container-apps-intellij/deploy-to-container-apps.png\":::\n\n1. In the browser's address bar, append the `/albums` path to the end of the app URL to view data from a sample API request.\n\n#### [Image](#tab/image)\n\n1. On the **Project** tab, navigate to your project and select **Dockerfile**.\n\n    :::image type=\"content\" source=\"media/create-container-apps-intellij/open-docker-file.png\" alt-text=\"Screenshot of Intelli J that shows the Project explorer with the Dockerfile node highlighted.\" lightbox=\"media/create-container-apps-intellij/open-docker-file.png\":::\n\n1. Select the Azure icon, and then select **Deploy Image to Container App**.\n\n    :::image type=\"content\" source=\"media/create-container-apps-intellij/deploy-image-to-container-apps.png\" alt-text=\"Screenshot of Intelli J that shows the Dockerfile in the editor with the Deploy Image to Container App menu option highlighted.\" lightbox=\"media/create-container-apps-intellij/deploy-image-to-container-apps.png\":::\n\n1. On the **Deploy Image to Azure Container Apps** page, enter the following information, and then select **Run**:\n\n    - **Module**: The module to deploy.\n    - **Container App**: The container app to deploy to.\n    - **Deployment**:\n        - **Source**: Select the **Container Image** option.\n        - **Docker Host**: The Docker host to use. You can accept the default.\n        - **Dockerfile/Image**: The path of the Dockerfile. You can accept the default.\n        - **Container Registry**: The container registry to use.\n        - **Repository Name**: The repository name to use under your container registry.\n        - **Tag Name**: The tag name to use under your container registry.\n    - **Ingress Settings**:\n        - **Ingress**: Enable or disable ingress based on your application's needs. You can accept the default settings.\n        - **External Traffic**: Specifies whether the container app should accept external traffic. You can accept the default settings.\n        - **Target Port**: Enable or disable ingress based on your application's needs. Open port `8080` in this step.\n    - **Other**:\n        - **Env Variables**: Set any environment variables required by your application.\n\n    :::image type=\"content\" source=\"media/create-container-apps-intellij/deploy-to-container-apps-image.png\" alt-text=\"Screenshot of Intelli J that shows the Deploy to Azure Container Apps dialog box.\" lightbox=\"media/create-container-apps-intellij/deploy-to-container-apps-image.png\":::\n\n1. Select **OK**. The toolkit displays a status message when the app deployment succeeds.\n1. After the deployment finishes, the Azure Toolkit for IntelliJ displays a notification. Select **Browse** to open the deployed app in a browser.\n\n    :::image type=\"content\" source=\"media/create-container-apps-intellij/deploy-to-container-apps.png\" alt-text=\"Screenshot of the deployed app in a browser window.\" lightbox=\"media/create-container-apps-intellij/deploy-to-container-apps.png\":::\n\n1. In the browser's address bar, append the `/albums` path to the end of the app URL to view data from a sample API request.\n\n---\n\n## Clean up resources\n\nTo clean up and remove a Container Apps resource, you can delete the resource or resource group. Deleting the resource group also deletes any other resources associated with it. Use the following steps to clean up resources:\n\n1. To delete your Container Apps resources, from the **Azure Explorer** sidebar, locate the **Container Apps Environment** item.\n1. Right-click the Container Apps service you want to delete, and then select **Delete**.\n1. To delete your resource group, use the Azure portal to manually delete the resources under your subscription.\n\n## Next steps\n\n- [Java on Azure Container Apps overview](/azure/container-apps/java-overview)\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/create-hello-world-web-app.md",
    "content": "---\ntitle: Create a Hello World web app for Azure App Service using IntelliJ\ndescription: This tutorial shows you how to use the Azure Toolkit for IntelliJ to create a Hello World Web App for Azure.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.date: 06/15/2025\nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Create a Hello World web app for Azure App Service using IntelliJ\n\nThis article demonstrates the steps that are required to create a basic Hello World web app and publish your web app to Azure App Service by using the [Azure Toolkit for IntelliJ](https://plugins.jetbrains.com/plugin/8053).\n\n> [!NOTE]\n> If you prefer using Eclipse, check out our [similar tutorial for Eclipse](../toolkit-for-eclipse/create-hello-world-web-app.md).\n>\n> [!INCLUDE [quickstarts-free-trial-note](../../includes/quickstarts-free-trial-note.md)]\n>\n> Don't forget to clean up the resources after you complete this tutorial. In that case, running this guide will not exceed your free account quota.\n\n[!INCLUDE [basic-prerequisites](includes/basic-prerequisites.md)]\n\n## Install and sign-in\n\nThe following steps walk you through the Azure sign-in process in your IntelliJ development environment.\n\n1. If you haven't installed the plugin, see [Azure Toolkit for IntelliJ](https://plugins.jetbrains.com/plugin/8053).\n\n1. To sign in to your Azure account, navigate to the left-hand **Azure Explorer** sidebar, and then click the **Azure Sign In** icon. Alternatively, you can navigate to **Tools**, expand **Azure**, and then click **Azure Sign in**.\n\n   :::image type=\"content\" source=\"media/sign-in-instructions/I01.png\" alt-text=\"Sign in to Azure on IntelliJ.\":::\n\n1. In the **Azure Sign In** window, select **OAuth 2.0**, and then click **Sign in**. For other sign-in options, see [Sign-in instructions for the Azure Toolkit for IntelliJ](sign-in-instructions.md).\n\n1. In the browser, sign in with your account and then go back to IntelliJ. In the **Select Subscriptions** dialog box, click on the subscription that you want to use, then click **Select**.\n\n## Create a new web app project\n\n1. Click **File**, expand **New**, and then click **Project**.\n\n1. In the **New Project** dialog box, select **Maven**, and make sure the **Create from Archetype** option is checked. From the list, select **maven-archetype-webapp**, and then click **Next**.\n\n   :::image type=\"content\" source=\"media/create-hello-world-web-app/maven-archetype-webapp.png\" alt-text=\"Select the maven-archetype-webapp option.\":::\n\n1. Expand the **Artifact Coordinates** dropdown to view all input fields. Specify the following information for your new web app, and then click **Next**:\n\n   * **Name**: The name of your web app. This value will be used to automatically fill in the web app's **ArtifactId** field.\n   * **GroupId**: The name of the artifact group, usually a company domain, such as **com.microsoft.azure**.\n   * **Version**: We'll keep the default version **1.0-SNAPSHOT**.\n\n1. Customize any Maven settings or accept the defaults, and then click **Finish**.\n\n1. To find the generated code, navigate to your project on the left-hand **Project** tab, then open the file **src/main/webapp/index.jsp**. You will see code similar to the following example.\n\n   ```html\n   <html>\n    <body>\n      <h2>Hello World!</h2>\n    </body>\n   </html>\n   ```\n\n   :::image type=\"content\" source=\"media/create-hello-world-web-app/open-index-page.png\" alt-text=\"Open the index.jsp file.\":::\n\n## Deploy web app to Azure\n\n1. Under the **Project Explorer** view, right-click your project, expand **Azure**, then click **Deploy to Azure Web Apps**.\n\n1. In the Deploy to Azure dialog box, you can deploy the application to an existing Tomcat webapp or you can create a new one.\n\n   a. Click **+** to create a new webapp. Otherwise, choose **WebApp** from the WebApp dropdown if there are existing webapps in your subscription.\n\n      :::image type=\"content\" source=\"media/create-hello-world-web-app/deploy-to-azure-webapps.png\" alt-text=\"Deploy to Azure dialog window.\":::\n\n   b. In the pop-up **Create WebApp** dialog box, specify the following information and click **OK**:\n\n      * **Name**: The WebApp's domain name. This value should be unique across Azure.\n      * **Platform**: Select **Linux-Java 21-TOMCAT 11.0** or as appropriate.\n\n   c. To deploy to an existing webapp, choose the web app from WebApp drop down, and then click **Run**.\n\n1. The toolkit will display a status message when it has successfully deployed your web app, along with the URL of your deployed web app if succeed.\n\n1. You can browse to your web app using the link provided in the status message.\n\n   :::image type=\"content\" source=\"media/create-hello-world-web-app/browse-web-app.png\" alt-text=\"Browsing your web app.\":::\n\n## Manage deploy configurations\n\n> [!TIP]\n> After you have published your web app, you can run the deployment by clicking the green arrow icon on the toolbar.\n\n1. Before running your WebApp's deployment, you can modify the default settings by clicking the drop-down menu for your web app and selecting **Edit Configurations**.\n\n   :::image type=\"content\" source=\"media/create-hello-world-web-app/edit-configuration-menu.png\" alt-text=\"Edit configuration menu.\":::\n\n1. On the **Run/Debug Configurations** dialog box, you can modify any of the default settings. Click **OK** to save the settings.\n\n## Clean up resources\n\n1. To delete your web app, navigate to the left-hand **Azure Explorer** sidebar and locate the **Web Apps** item.\n\n   > [!NOTE]\n   > If the Web Apps menu item does not expand, manually refresh the list by clicking the **Refresh** icon on the Azure Explorer toolbar, or by right-clicking the Web Apps menu item and selecting **Refresh**.\n\n1. Right-click the web app you'd like to delete and click **Delete**.\n\n1. To delete your app service plan or resource group, visit the [Azure portal](https://portal.azure.com) and manually delete the resources under your subscription.\n\n## Next steps\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\nFor more information about creating Azure Web Apps, see [App Service overview](/azure/app-service/app-service-web-overview).\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/hello-world-web-app-linux.md",
    "content": "---\ntitle: Deploy a Hello World web app to a Linux container\ntitleSuffix: Azure Toolkit for IntelliJ\ndescription: Run a basic Hello World web app in a Linux container and deploy it to the cloud using the Azure Toolkit for IntelliJ.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.date: 06/17/2025\nms.topic: install-set-up-deploy\nms.custom: devx-track-java, devx-track-extended-java, linux-related-content\n---\n\n# Deploy Java app to Azure Web Apps for Containers using Azure Toolkit for IntelliJ\n\n[Docker] containers are a widely used method for deploying web applications. By using Docker containers, developers can consolidate all their project files and dependencies into a single package for deployment to a server. The Azure Toolkit for IntelliJ simplifies this process for Java developers by adding features to deploy containers to Microsoft Azure.\n\nThis article demonstrates the steps that are required to create a basic Hello World web app and publish your web app in a Linux container to Azure by using the Azure Toolkit for IntelliJ.\n\n[!INCLUDE [prerequisites](includes/prerequisites.md)]\n* A [Docker] client.\n\n> [!NOTE]\n>\n> To complete the steps in this tutorial, you need to configure [Docker] to expose the daemon on port 2375 without TLS. You can configure this setting when installing Docker, or through the Docker settings menu.\n>\n> ![Docker settings menu][docker-settings-menu]\n>\n\n## Installation and sign-in\n\nThe following steps walk you through the Azure sign in process in your IntelliJ development environment.\n\n1. If you haven't installed the plugin, see [Installing the Azure Toolkit for IntelliJ](./index.yml).\n\n1. To sign in to your Azure account, navigate to the left-hand **Azure Explorer** sidebar, and then click the **Azure Sign In** icon. Alternatively, you can navigate to **Tools**, expand **Azure**, and click **Azure Sign in**..\n\n   :::image type=\"content\" source=\"media/sign-in-instructions/I01.png\" alt-text=\"Sign in to Azure on IntelliJ.\"::: \n\n1. In the **Azure Sign In** window, select **Device Login**, and then click **Sign in** ([other sign in options](sign-in-instructions.md)).\n\n1. Click **Copy&Open** in the **Azure Device Login** dialog.\n\n1. In the browser, paste your device code (which has been copied when you clicked **Copy&Open** in last step) and then click **Next**.\n\n1. Select your Azure account and complete any authentication procedures necessary in order to sign in.\n\n1. Once signed in, close your browser and switch back to your IntelliJ IDE. In the **Select Subscriptions** dialog box, select the subscriptions that you want to use, then click **Select**.\n\n## Creating a new web app project\n\n1. Click **File**, expand **New**, and then click **Project**.\n\n1. In the **New Project** dialog box, select **Maven**, and make sure the **Create from Archetype** option is checked. From the list, select **maven-archetype-webapp**, and then click **Next**.\n\n   :::image type=\"content\" source=\"media/create-hello-world-web-app/maven-archetype-webapp.png\" alt-text=\"Select the maven-archetype-webapp option.\"::: \n\n1. Expand the **Artifact Coordinates** dropdown to view all input fields and specify the following information for your new web app and click **Next**:\n\n   * **Name**: The name of your web app. This will automatically fill in the web app's **ArtifactId** field.\n   * **GroupId**: The name of the artifact group, usually a company domain. - for example, **com.microsoft.azure**.\n   * **Version**: We'll keep the default version **1.0-SNAPSHOT**.\n\n1. Customize any Maven settings or accept the defaults, and then click **Finish**.\n\n1. Navigate to your project on the left-hand **Project** tab, and open the file **src/main/webapp/index.jsp**. Replace the code with the following and **save the changes**:\n\n   ```html\n   <html>\n    <body>\n      <b><% out.println(\"Hello World!\"); %></b>\n    </body>\n   </html>\n   ```\n   :::image type=\"content\" source=\"media/create-hello-world-web-app/open-index-page.png\" alt-text=\"Open the index.jsp file.\":::\n\n## Create an Azure Container Registry to use as a private Docker registry\n\nThe following steps walk you through using the Azure portal to create an Azure Container Registry.\n\n> [!NOTE]\n>\n> If you want to use the Azure CLI instead of the Azure portal, follow the steps in [Create a private Docker container registry using the Azure CLI 2.0][Create Docker Registry using Azure CLI].\n>\n\n1. Browse to the [Azure portal] and sign in.\n\n   Once you have signed in to your account on the Azure portal, you can follow the steps in the [Create a private Docker container registry using the Azure portal] article, which are paraphrased in the following steps for the sake of expediency.\n\n1. Click the menu icon for **+ Create a resource**, click the **Containers** category, and then click **Container Registry**.\n\n1. When the **Create container registry** page is displayed, specify the following information:\n\n   * **Subscription**: Specifies the Azure subscription that you want to use for the new container registry.\n\n   * **Resource Group**: Specifies the resource group for your container registry. Select one of the following options:\n      * **Create New**: Specifies that you want to create a new resource group.\n      * **Use Existing**: Specifies that you will select from a list of resource groups that are associated with your Azure account.\n\n   * **Registry Name**: Specifies the name for the new container registry.\n\n   * **Location**: Specifies the region where your container registry will be created - for example, **West US**.\n\n   * **SKU**: Specifies the service tier for your container registry. For this tutorial, select **Basic**. For more information, see [Azure Container Registry service tiers](/azure/container-registry/container-registry-skus).\n\n1. Click **Review + create** and verify that the information is correct. Finish by clicking **Create**.\n\n## Deploy your web app in a Docker container\n\nThe following steps walk you through configuring Docker support for your web app and deploying the web app to a docker container.\n\n1. Navigate to your project on the left-hand **Project** tab and right-click your project. Expand **Azure** and click **Add Docker Support**.\n\n   This will automatically create a Docker file with a default configuration.\n\n   :::image type=\"content\" source=\"media/hello-world-web-app-linux/docker-support-file.png\" alt-text=\"The docker support file.\":::\n\n1. After you have added Docker support, right-click your project in the project explorer, expand **Azure**, and then click **Deploy Image to Web App**.\n\n1. On the **Deploy Image to Web App** dialog box, fill in the following information:\n\n   * **Name**: This specifies the friendly name which is displayed in the Azure Toolkit. \n\n   * **Container Registry**: Create a new one or choose the container registry from the drop-down menu that you created in the previous section of this article. The fields for **Server URL**, **Username**, and **Password** will be automatically populated.\n\n   * **Image and tag**: Specifies the container image name; typically this will use the following syntax: **\\<registry>.azurecr.io/\\<appname>:latest**, where:\n      * **\\<registry>** is your container registry from the previous section of this article\n      * **\\<appname>** is the name of your web app\n\n   * **Use Existing Web App** or **Create New Web App**: Specifies whether you will deploy your container to an existing web app or create a new web app. The **App name** that you specify will create the URL for your web app; for example: **wingtiptoys.azurewebsites.net**.\n\n   * **Resource Group**: Specifies whether you will use an existing or create a new resource group. \n\n   * **App Service Plan**: Specifies whether you will use an existing or create a new app service plan. \n\n1. When you have finished configuring the settings listed above, click **Run**. When your web app has been successfully deployed, the status will be displayed in the **Run** window.\n\n1. After your web app has been published, you can browse to the URL that specified earlier for your web app; for example: **wingtiptoys.azurewebsites.net**.\n\n   ![Browsing to your web app][browsing-to-web-app]\n\n## Optional: Modify your web app publish settings\n\n1. After you have published your web app, your settings will be saved as the default, and you can run your application on Azure by clicking the green arrow icon on the toolbar. You can modify these settings by clicking the drop-down menu for your web app and clicking **Edit Configurations**.\n\n    :::image type=\"content\" source=\"media/create-hello-world-web-app/edit-configuration-menu.png\" alt-text=\"Edit configuration menu.\":::\n\n1. When the **Run/Debug Configurations** dialog box is displayed, you can modify any of the default settings, and then click **OK**.\n\n## Next steps\n\nFor additional resources for Docker, see the official [Docker website][Docker].\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\n<!-- URL List -->\n\n[Azure portal]: https://portal.azure.com/\n[Create a private Docker container registry using the Azure portal]: /azure/container-registry/container-registry-get-started-portal\n[Azure for Java Developers]: ../index.yml\n[Java Tools for Visual Studio Team Services]: https://java.visualstudio.com/\n[Create Docker Registry using Azure CLI]: /azure/container-registry/container-registry-get-started-azure-cli\n\n[Docker]: https://www.docker.com/\n[Configuring artifacts]: https://www.jetbrains.com/help/idea/2016.1/configuring-artifacts.html\n\n<!-- IMG List -->\n\n[browsing-to-web-app]:  media/hello-world-web-app-linux/browsing-to-web-app.png\n[docker-settings-menu]: media/hello-world-web-app-linux/docker-settings-menu.png\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/includes/additional-resources.md",
    "content": "---\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.date: 02/24/2022\n---\n\nTo report bugs or request new features, create issues on [our GitHub repository](https://github.com/Microsoft/azure-tools-for-java/issues), or ask questions on [Stack Overflow with tag azure-java-tools](https://stackoverflow.com/questions/tagged/azure-java-tools).\n\nFor more information about using Java with Azure, see the following links:\n\n* [Azure for Java Developers](../../index.yml)\n* [Java with Azure DevOps Services](/azure/devops-project/azure-devops-project-java)\n* [Java support on Azure and Azure Stack](../../fundamentals/java-support-on-azure.md)\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/includes/basic-prerequisites.md",
    "content": "---\nms.date: 07/01/2022\nms.author: karler\nms.reviewer: jialuogan\n---\n\n## Prerequisites\n\n- A supported Java Development Kit (JDK). For more information about the JDKs available for use when developing on Azure, see [Java support on Azure and Azure Stack](../../fundamentals/java-support-on-azure.md).\n- [IntelliJ IDEA](https://www.jetbrains.com/idea/download/), Ultimate or Community Edition.\n- The Azure Toolkit for IntelliJ. For more information, see [Install the Azure Toolkit for IntelliJ](../install-toolkit.md).\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/includes/prerequisites.md",
    "content": "---\nms.date: 07/01/2022\nms.author: karler\nms.reviewer: jialuogan\n---\n\n## Prerequisites\n\n- A supported Java Development Kit (JDK). For more information about the JDKs available for use when developing on Azure, see [Java support on Azure and Azure Stack](../../fundamentals/java-support-on-azure.md).\n- [IntelliJ IDEA](https://www.jetbrains.com/idea/download/), Ultimate or Community Edition.\n- The Azure Toolkit for IntelliJ. For more information, see [Install the Azure Toolkit for IntelliJ](../install-toolkit.md). You'll also need to sign in to your Azure account for the Azure Toolkit for IntelliJ. For more information, see [Sign-in instructions for the Azure Toolkit for IntelliJ](../sign-in-instructions.md).\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/includes/show-azure-explorer.md",
    "content": "## Displaying the Azure Explorer Tool Window\n\nIf the **Azure Explorer** tool window is not visible in IntelliJ, click **View**, then click **Tool Windows**, and then click **Azure Explorer**.\n\n![Show Azure Explorer Tool Window](../media/show-azure-explorer/show-az-exp-01.png)\n\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure Toolkit for IntelliJ documentation\nsummary: The Azure Toolkit for IntelliJ provides templates and functionality that you can use to easily create, develop, test, and deploy Azure applications by using the IntelliJ integrated development environment (IDE).\n\nmetadata:\n  title: Azure Toolkit for IntelliJ Documentation\n  description: Use the Azure Toolkit for IntelliJ to easily create, develop, test, and deploy Azure applications by using the IntelliJ IDE.\n  ms.date: 10/23/2025\n  ms.topic: landing-page\n  author: KarlErickson\n  ms.author: karler\n  ms.custom: devx-track-java, devx-track-extended-java\n\nlandingContent:\n  - title: Get started guides\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: About Azure Toolkit for IntelliJ\n            url: overview.md\n      - linkListType: quickstart\n        links:\n          - text: Create a Hello World web app for Azure App Service\n            url: create-hello-world-web-app.md\n          - text: Create an HTTP trigger Function for Azure Functions\n            url: /azure/azure-functions/functions-create-maven-intellij?toc=/azure/developer/java/toolkit-for-intellij/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n  - title: Step-by-step tutorials\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Run a Hello World web app in a Linux container\n            url: hello-world-web-app-linux.md\n          - text: Create Spark applications for an HDInsight Spark Linux cluster\n            url: /azure/hdinsight/hdinsight-apache-spark-intellij-tool-plugin\n  - title: Manage Azure resources\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Redis caches\n            url: managing-redis-caches-using-azure-explorer.md\n          - text: Storage accounts\n            url: managing-virtual-machines-using-azure-explorer.md\n          - text: Virtual machines\n            url: managing-storage-accounts-using-azure-explorer.md\n  - title: Supported JDKs\n    linkLists:\n      - linkListType: download\n        links:\n        - text: Java for Azure and Azure Stack\n          url: ../fundamentals/index.yml\n  - title: Source code\n    linkLists:\n      - linkListType: reference\n        links:\n          - text: Azure Toolkits for Java\n            url: https://github.com/microsoft/azure-tools-for-java"
  },
  {
    "path": "articles/java/toolkit-for-intellij/install-toolkit.md",
    "content": "---\ntitle: Install the Azure Toolkit for IntelliJ\ndescription: Shows you how to install the Azure Toolkit as an IntelliJ IDEA plugin.\nms.date: 06/15/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.topic: install-set-up-deploy\nms.custom: devx-track-java\nai-usage: ai-assisted\n---\n\n# Install the Azure Toolkit for IntelliJ\n\nThis article shows you how to install the Azure Toolkit for IntelliJ as an IntelliJ IDEA plugin.\n\nThere are two options for installing the toolkit. You can install from the Marketplace, or you can download the toolkit release file and install it manually. The following sections describe these options.\n\n## Prerequisites\n\n- [IntelliJ IDEA](https://www.jetbrains.com/idea/download/), Ultimate or Community edition\n- A supported Java Development Kit (JDK). For more information about the JDKs available for use when developing on Azure, see [Java support on Azure and Azure Stack](../fundamentals/java-support-on-azure.md).\n- (Optional) [GitHub Copilot for IntelliJ](https://plugins.jetbrains.com/plugin/17718-github-copilot) version 1.5.50 or later, if you want to use the Azure MCP Server features.\n\n## Install Azure Toolkit for IntelliJ from the Marketplace\n\nUse the following steps to install from the Marketplace:\n\n1. Launch IntelliJ IDEA.\n\n1. Select **File** and then open **Settings**.\n\n1. Select **Plugins**, then use the search box on the **Marketplace** tab to search for **Azure Toolkit**.\n\n1. When **Azure Toolkit for IntelliJ by Microsoft** is displayed, select it.\n\n   :::image type=\"content\" source=\"media/install-toolkit/settings-plugins.png\" alt-text=\"Screenshot of IntelliJ IDEA showing the Plugins section of the Settings dialog box with the Azure Toolkit for IntelliJ in the search results.\" lightbox=\"media/install-toolkit/settings-plugins.png\":::\n\n1. Select **Install**, then restart your IDE if prompted.\n\n## Install Azure Toolkit for IntelliJ from Disk\n\nUse the following steps to manually install new releases as they become available:\n\n1. Download the released file from the [Marketplace page for Azure Toolkit for IntelliJ](https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij/versions). Select the version compatible with your IDE.\n\n1. Launch IntelliJ IDEA.\n\n1. Select **File** and then open **Settings**.\n\n1. Select **Plugins** and then select **Manage Repositories, Configure Proxy or Install Plugin from Disk** (the settings icon).\n\n1. Select **Install Plugin from Disk...**.\n\n1. Select the plugin archive file and then select **OK**.\n\n1. Select **OK** to apply the changes and restart your IDE if prompted.\n\n## Azure MCP Server installation\n\nThe Azure Toolkit for IntelliJ supports [the Azure MCP Server](/azure/developer/azure-mcp-server/overview), which provides AI-powered tools for working with Azure resources. The following installation requirements apply:\n\n- The Azure MCP Server is automatically installed with the plugin when GitHub Copilot for IntelliJ (version 1.5.50 or later) is already installed.\n- If GitHub Copilot isn't installed, the Azure MCP Server isn't installed automatically when you install the plugin.\n- To use the Azure MCP Server features, install [GitHub Copilot for IntelliJ](https://plugins.jetbrains.com/plugin/17718-github-copilot) version 1.5.50 or later before or after installing the Azure Toolkit for IntelliJ.\n\n> [!NOTE]\n> GitHub Copilot for Azure isn't available for IntelliJ. However, the Azure MCP Server provides Azure-specific AI capabilities within GitHub Copilot for IntelliJ.\n\n## Next steps\n\nAfter you install the Azure Toolkit as an IDE plugin, sign in with your Azure account to connect the toolkit to that account. For more information, see [Sign-in instructions for the Azure Toolkit for IntelliJ](sign-in-instructions.md).\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/managing-redis-caches-using-azure-explorer.md",
    "content": "---\ntitle: Managing Redis Caches using the Azure Explorer for IntelliJ\ndescription: Learn how to manage your Azure Redis caches by using the Azure Explorer for IntelliJ.\nms.date: 06/15/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Managing Redis Caches using the Azure Explorer for IntelliJ\n\nThe Azure Explorer, which is part of the Azure Toolkit for IntelliJ, provides Java developers with an easy-to-use solution for managing Redis caches in their Azure account from inside the IntelliJ IDE.\n\n[!INCLUDE [prerequisites](includes/prerequisites.md)]\n\n[!INCLUDE [show-azure-explorer](includes/show-azure-explorer.md)]\n\n## Create a Redis Cache by using IntelliJ\n\nThe following steps walk you through the steps to create a Redis cache using the Azure Explorer.\n\n1. Sign in to your Azure account by using the steps in [Sign-in instructions for the Azure Toolkit for IntelliJ].\n\n1. In the **Azure Explorer** tool window, expand the **Azure** node, right-click **Redis Caches**, and then click **Create**.\n\n   ![Create Redis Cache menu][CR01]\n\n1. When the **Create Azure Cache for Redis** dialog box appears, specify the following options:\n\n   * **Basic**:\n\n      * **Subscription**: Specifies the Azure subscription you want to use for the new Redis cache.\n\n      * **Resource Group**: Specifies the resource group for your redis cache. Select one of the following options:\n\n         * **Create new**: Specifies that you want to create a new resource group by clicking **+** to finish.\n\n         * **Use existing**: Specifies that you'll select from a dropdown list of resource groups that are associated with your Azure account.\n\n   * **Instance details**:\n\n      * **DNS Name**: Specifies the DNS subdomain for the new Redis cache, which is prepended to \".redis.cache.windows.net\" - for example, **wingtiptoys.redis.cache.windows.net**.\n\n      * **Location**: Specifies the location where your Redis cache is created - for example, **West US**.\n\n      * **Pricing Tier**: Specifies which pricing tier your Redis cache uses. This setting determines the number of client connections. (For more information, see [Azure Cache for Redis pricing].)\n\n      * **Non-TLS port**: Specifies whether your Redis cache allows non-TLS connections. By default, the non-TLS port is disabled. For more information, see [Azure Cache for Redis management FAQs].\n\n      ![Create New Redis Cache dialog box][CR02]\n\n1. When you've specified all your Redis cache settings, click **OK**.\n\n1. After your Redis cache has been created, it will be displayed in the Azure Explorer.\n\n   ![Redis Cache in Azure Explorer][CR03]\n\n> [!NOTE]\n> For more information about configuring your Azure Cache for Redis cache settings, see [How to configure Azure Cache for Redis].\n\n## Display the properties for your Redis Cache in IntelliJ\n\n1. In the Azure Explorer, right-click your Redis cache and click **Show properties**.\n\n   ![Azure Explorer context menu to display properties for a Redis cache][SP01]\n\n1. The Azure Explorer displays the properties for your Redis cache.\n\n   ![Redis cache properties][SP02]\n\n## Delete your Redis Cache by using IntelliJ\n\n1. In the Azure Explorer, right-click your Redis cache and click **Delete**.\n\n   ![Azure Explorer context menu to delete a Redis cache][DE01]\n\n1. Click **Yes** when prompted to delete your Redis cache.\n\n   ![Delete Redis cache prompt][DE02]\n\n## Next steps\n\nFor more information about Azure Redis caches, configuration settings and pricing, see the following links:\n\n* [Azure Cache for Redis]\n* [Azure Cache for Redis documentation]\n* [Azure Cache for Redis pricing]\n* [How to configure Azure Cache for Redis]\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\n<!-- URL List -->\n\n[Azure Cache for Redis pricing]: https://azure.microsoft.com/pricing/details/cache/\n[Azure Cache for Redis]: https://azure.microsoft.com/services/cache/\n[Azure Cache for Redis management FAQs]: /azure/azure-cache-for-redis/cache-management-faq\n[Azure Cache for Redis documentation]: /azure/azure-cache-for-redis\n[How to configure Azure Cache for Redis]: /azure/azure-cache-for-redis/cache-configure\n[Sign-in instructions for the Azure Toolkit for IntelliJ]: ./sign-in-instructions.md\n\n<!-- IMG List -->\n\n[CR01]: media/managing-redis-caches-using-azure-explorer/CR01.png\n[CR02]: media/managing-redis-caches-using-azure-explorer/CR02.png\n[CR03]: media/managing-redis-caches-using-azure-explorer/CR03.png\n\n[SP01]: media/managing-redis-caches-using-azure-explorer/SP01.png\n[SP02]: media/managing-redis-caches-using-azure-explorer/SP02.png\n\n[DE01]: media/managing-redis-caches-using-azure-explorer/DE01.png\n[DE02]: media/managing-redis-caches-using-azure-explorer/DE02.png\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/managing-storage-accounts-using-azure-explorer.md",
    "content": "---\ntitle: Manage storage accounts with Azure Explorer for IntelliJ\ndescription: Learn how to manage your Azure storage accounts by using the Azure Explorer for IntelliJ.\nms.date: 03/14/2022\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.topic: how-to\nms.custom: devx-track-java, devx-track-extended-java\n---\n\n# Manage storage accounts by using the Azure Explorer for IntelliJ\n\n> [!NOTE]\n> The Storage Accounts feature in Azure Explorer is deprecated. You can utilize the Azure portal to create and manage storage accounts and containers. See the [Azure Storage](/azure/storage/blobs/storage-quickstart-blobs-portal) documentation for quickstarts on how to manage storage accounts.\n\nThe Azure Explorer, which is part of the Azure Toolkit for IntelliJ, provides Java developers with an easy-to-use solution for managing storage accounts in their Azure account from inside the IntelliJ integrated development environment (IDE).\n\n[!INCLUDE [prerequisites](includes/prerequisites.md)]\n\n[!INCLUDE [show-azure-explorer](includes/show-azure-explorer.md)]\n\n## Create a storage account\n\nTo create a storage account by using the Azure Explorer, use the following steps:\n\n1. Sign in to your Azure account by using the steps in [Sign-in instructions for the Azure Toolkit for IntelliJ].\n\n1. In the **Azure Explorer** view, expand the **Azure** node, right-click **Storage Account**, and then click **Create**.\n\n1. In the **Create Storage Account** dialog box, specify the following options:\n\n   * **Project details**:\n\n      * **Subscription**: Specifies the Azure subscription that you want to use for the new storage account.\n\n      * **Resource Group**: Specifies the resource group for your storage account. Select one of the following options:\n\n         * **Create new**: Specifies that you want to create a new resource group by clicking **+** to finish.\n\n         * **Use existing**: Specifies that you'll select from a dropdown list of resource groups that are associated with your Azure account.\n\n   * **Instance details**:\n\n      * **Account name**: Specifies the name for the new storage account, which must be between 3 and 24 characters long, start with a letter, and contain only lowercase letters and numbers.\n\n      * **Account location**:  Specifies the location where your storage account will be created - for example, **West US**.\n\n      * **Performance**: Specifies which storage account offering to use from the selected publisher - for example, **Premium**. For more information, see [Azure storage scalability and performance targets].\n\n      * **Redundancy**: Specifies the replication for the storage account - for example, **Zone-Redundant**. For more information, see [Azure storage replication].\n\n      * **Kind**: Specifies the type of storage account to create - for example, **Block Blobs storage**. And this option will show only if you choose \"Premium\" in the **Performance**. For more information, see [About Azure storage accounts].\n\n1. When you've specified all of the preceding options, click **OK**.\n\n## Delete a storage account\n\nTo delete a storage account by using the Azure Explorer, use the following steps:\n\n1. In the **Azure Explorer** view, right-click the storage account, and then select **Delete**.\n\n1. In the confirmation window, click **Yes**.\n\n## Next steps\n\nFor more information about Azure storage accounts, sizes, and pricing, see the following resources:\n\n* [Introduction to Microsoft Azure Storage]\n* [About Azure storage accounts]\n* Azure storage-account sizes\n  * [Sizes for Windows storage accounts in Azure]\n  * [Sizes for Linux storage accounts in Azure]\n* Azure storage-account pricing\n  * [Windows storage-account pricing]\n  * [Linux storage-account pricing]\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\n<!-- URL List -->\n\n[Sign-in instructions for the Azure Toolkit for IntelliJ]: ./sign-in-instructions.md\n[Introduction to Microsoft Azure Storage]: /azure/storage/common/storage-introduction\n[About Azure storage accounts]: /azure/storage/storage-create-storage-account\n[Azure storage replication]: /azure/storage/storage-redundancy\n[Azure storage scalability and Performance Targets]: /azure/storage/storage-scalability-targets\n[Naming and referencing containers, blobs, and metadata]: /rest/api/storageservices/Naming-and-Referencing-Containers--Blobs--and-Metadata\n\n[Sizes for Windows storage accounts in Azure]: /azure/virtual-machines/sizes\n[Sizes for Linux storage accounts in Azure]: /azure/virtual-machines/sizes\n[Windows storage-account pricing]: https://azure.microsoft.com/pricing/details/virtual-machines/windows/\n[Linux storage-account pricing]: https://azure.microsoft.com/pricing/details/virtual-machines/linux/\n\n<!-- IMG List -->\n\n[CS01]: media/managing-storage-accounts-using-azure-explorer/CS01.png\n[CS02]: media/managing-storage-accounts-using-azure-explorer/CS02.png\n[CC01]: media/managing-storage-accounts-using-azure-explorer/CC01.png\n[CC02]: media/managing-storage-accounts-using-azure-explorer/CC02.png\n\n[DS01]: media/managing-storage-accounts-using-azure-explorer/DS01.png\n[DS02]: media/managing-storage-accounts-using-azure-explorer/DS02.png\n[DC01]: media/managing-storage-accounts-using-azure-explorer/DC01.png\n[DC02]: media/managing-storage-accounts-using-azure-explorer/DC02.png\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/managing-virtual-machines-using-azure-explorer.md",
    "content": "---\ntitle: Manage virtual machines with Azure Explorer for IntelliJ\ndescription: Learn how to manage your Azure virtual machines by using the Azure Explorer for IntelliJ.\nms.date: 06/17/2025\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.topic: how-to\nms.custom:\n  - devx-track-java\n  - devx-track-extended-java\n  - sfi-image-nochange\n---\n\n# Manage virtual machines by using the Azure Explorer for IntelliJ\n\nThe Azure Explorer, which is part of the Azure Toolkit for IntelliJ, provides Java developers with an easy-to-use solution for managing virtual machines in their Azure account from inside the IntelliJ integrated development environment (IDE).\n\nThis article demonstrates how to create and manage virtual machines through the Azure Explorer on IntelliJ.\n\n[!INCLUDE [prerequisites](includes/prerequisites.md)]\n\n[!INCLUDE [show-azure-explorer](includes/show-azure-explorer.md)]\n\n## Create a virtual machine\n\nTo create a virtual machine by using the Azure Explorer, use the following steps:\n\n1. Sign in to your Azure account by using the steps in [Sign-in instructions for the Azure Toolkit for IntelliJ].\n\n1. In the **Azure Explorer** view, expand the **Azure** node, right-click **Virtual Machines**, and then click **Create**.\n\n   :::image type=\"content\" source=\"media/managing-virtual-machines-using-azure-explorer/CR01.png\" alt-text=\"Create VM option in Azure Explorer.\":::\n\n1. In the **Basic** window, enter the following information:\n\n   * **Project Details**:\n\n      * **Subscription**: Specifies the subscriptions that you'll use for your virtual machine.\n\n      * **Resource group**: Specifies the resource group for your virtual machine. Select one of the following options:\n\n         * **Create new**: Specifies that you want to create a new resource group and click **+** to finish.\n\n         * **Use existing**: Specifies that you want to select from a list of resource groups that are associated with your Azure account.\n\n      * **Instance Details**:\n\n         * **Virtual machine name**: Specifies the name for your new virtual machine, which must start with a letter and contain only letters, numbers, and hyphens.\n\n         * **Region**: Specifies where your virtual machine will be created - for example, **West US**.\n\n         * **Availability options**: Specifies an optional availability set that your virtual machine can belong to. You can select an existing availability set, or if your virtual machine won't belong to an availability set, select **(No infrastructure redundancy required)**.\n\n         * **Image**: Specifies that you'll choose a marketplace image by providing the following information (use Shift+Enter to navigate between fields):\n\n            * **Publisher**: Specifies the publisher that created the image that you'll use for your virtual machine - for example, **Microsoft**.\n\n            * **Offer**: Specifies the virtual machine offering to use from the selected publisher - for example, **JDK**.\n\n            * **Sku**: Specifies the stockkeeping unit (SKU) to use from the selected offering - for example, **JDK_8**.\n\n            * **Image**: Specifies which version of the selected image to use.\n\n         * **Size**: Specifies the number of cores and memory to allocate for your virtual machine.\n\n      * **Administrator  Account**:\n\n         * **Authentication type**: Specifies the administrator account will use SSH public key or password for authentication.\n\n         * **User name**: Specifies the administrator account to create for managing your virtual machine.\n\n         * **Password**: Specifies the password for your administrator account. Re-enter your password in the **Confirm password** box to validate the credential if you use password for authentication.\n\n      * **Inbound Port Rules**:\n\n         * **Select inbound ports**:  Specifies which virtual machine network ports are accessible from the public internet.\n\n1. In the **Networking** window, enter the following information:\n\n   * **Network Interface**:\n\n      * **Virtual Network** and **Subnet**: Specifies the virtual network and subnet that your virtual machine will connect to. You can use an existing network and subnet, or you can create a new network and subnet.\n\n      * **Public IP**: Specifies an external-facing IP address for your virtual machine. You can choose to create a new IP address or, if your virtual machine won't have a public IP address, you can select **(None)**.\n\n      * **Security group**: Specifies an optional networking firewall for your virtual machine. You can select an existing firewall or, if your virtual machine won't use a network firewall, you can select **(None)**.\n\n      * **Select inbound ports**: Specifies which virtual machine network ports are accessible from the public internet.\n\n1. In the **Advanced** window, enter the following information:\n\n   * **Storage account**:\n\n      * **Storage account**: Specifies the storage account to use for storing your virtual machine. You can choose an existing storage account or create a new account. If you choose **Create New**, you need to specify all necessary options. For more information, you can see [Storage Account].\n\n   * **Azure Spot Instance**:\n\n      * **Enable Azure Spot instance**: Specifies Azure Spot Virtual Machines to take advantage of your unused capacity at a significant cost savings. For more information, you can see [Use Azure Spot Virtual Machines].\n\n1. Click **Finish**. Your new virtual machine appears in the Azure Explorer tool window.\n\n## Restart a virtual machine\n\nTo restart a virtual machine by using the Azure Explorer in IntelliJ, use the following steps:\n\n1. In the **Azure Explorer** view, right-click the virtual machine, and then select **Restart**.\n\n   ![The restart virtual machine confirmation window.][RE01]\n\n## Stop a virtual machine\n\nTo stop a running virtual machine by using the Azure Explorer in IntelliJ, use the following steps:\n\n1. In the **Azure Explorer** view, right-click the virtual machine, and then select **Stop**.\n\n## Delete a virtual machine\n\nTo delete a virtual machine by using the Azure Explorer in IntelliJ, use the following steps:\n\n1. In the **Azure Explorer** view, right-click the virtual machine, and then select **Delete**.\n\n1. In the confirmation window, click **Yes**.\n\n   ![The delete virtual machine confirmation window.][DE02]\n\n## Next steps\n\nFor more information about Azure virtual-machine sizes and pricing, see the following resources:\n\n* Azure virtual-machine sizes\n  * [Sizes for Windows virtual machines in Azure]\n  * [Sizes for Linux virtual machines in Azure]\n* Azure virtual-machine pricing\n  * [Windows virtual-machine pricing]\n  * [Linux virtual-machine pricing]\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\n<!-- URL List -->\n\n[Sign-in instructions for the Azure Toolkit for IntelliJ]: ./sign-in-instructions.md\n[Storage Account]: ./managing-storage-accounts-using-azure-explorer.md\n[Use Azure Spot Virtual Machines]:/azure/virtual-machines/spot-vms\n[Sizes for Windows virtual machines in Azure]: /azure/virtual-machines/sizes\n[Sizes for Linux virtual machines in Azure]: /azure/virtual-machines/sizes\n[Windows virtual-machine pricing]: https://azure.microsoft.com/pricing/details/virtual-machines/windows/\n[Linux virtual-machine pricing]: https://azure.microsoft.com/pricing/details/virtual-machines/linux/\n\n<!-- IMG List -->\n\n[RE01]: media/managing-virtual-machines-using-azure-explorer/RE01.png\n[RE02]: media/managing-virtual-machines-using-azure-explorer/RE02.png\n\n[SH01]: media/managing-virtual-machines-using-azure-explorer/SH01.png\n\n[DE01]: media/managing-virtual-machines-using-azure-explorer/DE01.png\n[DE02]: media/managing-virtual-machines-using-azure-explorer/DE02.png\n\n[CR01]: media/managing-virtual-machines-using-azure-explorer/CR01.png\n[CR02]: media/managing-virtual-machines-using-azure-explorer/CR02.png\n[CR03]: media/managing-virtual-machines-using-azure-explorer/CR03.png\n[CR04]: media/managing-virtual-machines-using-azure-explorer/CR04.png\n[CR05]: media/managing-virtual-machines-using-azure-explorer/CR05.png\n[CR06]: media/managing-virtual-machines-using-azure-explorer/CR06.png\n[CR07]: media/managing-virtual-machines-using-azure-explorer/CR07.png\n[CR08]: media/managing-virtual-machines-using-azure-explorer/CR08.png\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/overview.md",
    "content": "---\ntitle: Azure Toolkit for IntelliJ Overview\ndescription: Learn about the Azure Toolkit for IntelliJ and its features for developing, configuring, testing, and deploying Java applications to Azure.\nauthor: KarlErickson\nms.author: karler\nms.date: 10/24/2025\nms.topic: overview\nms.custom: devx-track-java\nai-usage: ai-assisted\n---\n\n# What is Azure Toolkit for IntelliJ?\n\nThe Azure Toolkit for IntelliJ enables you to easily develop, configure, test, and deploy highly available and scalable Java applications to Azure from IntelliJ on all supported platforms.\n\n## Supported Azure services\n\nThe plugin supports the following Azure services:\n\n- Azure App Service\n- Azure Functions\n- Azure Spring Apps\n- Azure Kubernetes\n- Azure Container Apps\n- Azure Virtual Machines\n- Azure Database for MySQL\n- Azure Cosmos DB\n- SQL Server\n- Azure Storage\n- Application Insights\n\nThe plugin also supports Azure Synapse data engineers, Azure HDInsight developers, and Apache Spark on SQL Server users to create, test, and submit Apache Spark/Hadoop jobs to Azure.\n\n## AI integration\n\nThe toolkit provides integration with Azure OpenAI Service, enabling you to experiment with chat models directly from IntelliJ IDEA. For more information, see [What is Azure OpenAI Service](/azure/ai-services/openai/overview) and [Get started using GPT-35-Turbo and GPT-4 with Azure OpenAI Service in IntelliJ](chatgpt-intellij.md).\n\nThe plugin supports the Azure MCP Server, which adds smart, context-aware AI tools inside GitHub Copilot for IntelliJ IDEA to help you work more efficiently with Azure resources. The Azure MCP Server provides your agents with Azure context across all the popular Azure services. For more information, see [the Azure MCP Server documentation](/azure/developer/azure-mcp-server/overview).\n\n> [!NOTE]\n> The Azure MCP Server is available with the Azure Toolkit for IntelliJ and is automatically installed when you have GitHub Copilot for IntelliJ (version 1.5.50 or later) installed. If GitHub Copilot isn't installed, the Azure MCP Server isn't installed automatically when you install the plugin. GitHub Copilot for Azure isn't available for IntelliJ.\n\n## Key features\n\nThe Azure Toolkit for IntelliJ provides the following features and workflows:\n\n- **Azure Web App Workflow**: Run your web applications on Azure Web App and view logs.\n- **Azure Functions Workflow**: Scaffold, run, debug your Functions App locally and deploy it on Azure.\n- **Azure Spring Apps Workflow**: Run your Spring microservices applications on Azure Spring Apps and view logs.\n- **Azure Container Apps Workflow**: Dockerize and run applications on Azure Container Apps and view logs.\n- **Azure Kubernetes Support**: Create and manage your Kubernetes Services directly in Azure Explorer.\n- **Getting Started Guide**: Follow the steps in the getting started guide to deploy an application within minutes.\n- **Azure Explorer**: View and manage your cloud resources on Azure with the embedded Azure Explorer.\n- **Azure Resource Management template**: Create and update your Azure resource deployments with ARM template support.\n- **Azure Synapse**: List workspaces and Apache Spark Pools, compose an Apache Spark project, and author and submit Apache Spark jobs to Azure Synapse Spark pools.\n- **Azure HDInsight**: Create an Apache Spark project and author and submit Apache Spark jobs to HDInsight clusters. Monitor and debug Apache Spark jobs easily. Support HDInsight ESP cluster MFA Authentication.\n- **SQL Server Big Data Cluster**: Link to SQL Server Big Data Cluster. Create an Apache Spark project and author and submit Apache Spark jobs to the cluster. Monitor and debug Apache Spark jobs easily.\n\n## See also\n\n- [Install the Azure Toolkit for IntelliJ](install-toolkit.md)\n- [Sign in to your Azure account](sign-in-instructions.md)\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/sign-in-instructions.md",
    "content": "---\ntitle: Sign-in instructions for the Azure Toolkit for IntelliJ\ndescription: Learn how to sign in to Microsoft Azure by using the Azure Toolkit for IntelliJ.\nauthor: KarlErickson\nms.author: karler\nms.reviewer: jialuogan\nms.date: 06/15/2025\nms.topic: how-to\nms.custom: devx-track-java, devx-track-azurecli, devx-track-extended-java\n---\n\n# Sign-in instructions for the Azure Toolkit for IntelliJ\n\nOnce [installed](https://www.jetbrains.com/help/idea/managing-plugins.html), the [Azure Toolkit for IntelliJ](https://plugins.jetbrains.com/plugin/8053) provides four methods for signing in to your Azure account:\n\n- [Sign in to your Azure account with Azure CLI](#sign-in-to-your-azure-account-with-azure-cli)\n- [Sign in to your Azure account with OAuth](#sign-in-to-your-azure-account-with-oauth)\n- [Sign in to your Azure account with Device Login](#sign-in-to-your-azure-account-with-device-login)\n- [Sign in to your Azure account with Service Principal](#sign-in-to-your-azure-account-with-service-principal)\n\nAdditionally, methods for [signing out](#sign-out-of-your-azure-account) are provided.\n\n[!INCLUDE [basic-prerequisites](includes/basic-prerequisites.md)]\n\n> [!TIP]\n> To use all the latest features of [Azure Toolkit for IntelliJ](https://plugins.jetbrains.com/plugin/8053), please download the latest version of [IntelliJ IDEA](https://www.jetbrains.com/idea/download/) as well as the plugin itself.\n\n## Sign in to your Azure account with Azure CLI\n\n> [!NOTE]\n> For more information on using Azure CLI to sign in, see [Sign in with Azure CLI](/cli/azure/authenticate-azure-cli).\n\nTo sign in Azure with Azure CLI, do the following:\n\n1. Open your project with IntelliJ IDEA.\n\n1. Navigate to the left-hand **Azure Explorer** sidebar, and then click the **Azure Sign In** icon. Alternatively, you can navigate to **Tools**, expand **Azure**, and then click **Azure Sign in**.\n\n   ![The IntelliJ Azure Sign In command.][I01]\n\n1. In the **Azure Sign In** window, **Azure CLI** will be selected by default after waiting a few seconds. When the option is available, click **Sign in**.\n\n   ![The Azure Sign In window with Azure CLI selected.][A01]\n\n1. In the browser, sign in with your account and then go back to IntelliJ. In the **Select Subscriptions** dialog box, click on the subscriptions that you want to use, then click **Select**.\n\n## Sign in to your Azure account with OAuth\n\nTo sign in Azure with OAuth 2.0, do the following:\n\n1. Open your project with IntelliJ IDEA.\n\n1. Navigate to the left-hand **Azure Explorer** sidebar, and then click the **Azure Sign In** icon. Alternatively, you can navigate to **Tools**, expand **Azure**, and then click **Azure Sign in**.\n\n   ![The IntelliJ Azure Sign In command.][I01]\n\n1. In the **Azure Sign In** window, select **OAuth 2.0**, and then click **Sign in**.\n\n   ![The Azure Sign In window with OAuth selected.][O01]\n\n1. In the browser, sign in with your account and then go back to IntelliJ. In the **Select Subscriptions** dialog box, click on the subscriptions that you want to use, then click **Select**.\n\n## Sign in to your Azure account with Device Login\n\nTo sign in Azure with Device Login, do the following:\n\n1. Open your project with IntelliJ IDEA.\n\n1. Open sidebar **Azure Explorer**, and then click the **Azure Sign In** icon in the bar on top (or from the IntelliJ menu, navigate to **Tools>Azure>Azure Sign in**).\n\n   ![The IntelliJ Azure Sign In command.][I01]\n\n1. In the **Azure Sign In** window, select **Device Login**, and then click **Sign in**.\n\n   ![The Azure Sign In window with device login selected.][I02]\n\n1. Click **Copy&Open** in **Azure Device Login** dialog.\n\n1. In the browser, paste your device code (which has been copied when you click **Copy&Open** in last step) and then click **Next**.\n\n1. Select your Azure account and complete any authentication procedures necessary in order to sign in.\n\n1. In the **Select Subscriptions** dialog box, select the subscriptions that you want to use, and then click **Select**.\n\n## Sign in to your Azure account with Service Principal\n\n> [!NOTE]\n> To create an Azure service principal, see [Create an Azure service principal with the Azure CLI](/cli/azure/create-an-azure-service-principal-azure-cli).\n\nTo sign in Azure with Service Principal, do the following:\n\n1. Open your project with IntelliJ IDEA.\n\n1. Open sidebar **Azure Explorer**, and then click the **Azure Sign In** icon in the bar on top (or from the IntelliJ menu, navigate to **Tools>Azure>Azure Sign in**).\n\n   ![The IntelliJ Azure Sign In command.][I01]\n\n1. In the **Azure Sign In** window, select **Service Principal**, and then click **Sign In**.\n\n   ![The Azure Sign In window with service principal selected.][A03]\n\n1. In the **Sign In - Service Principal** window, complete any information necessary (you can copy the JSON output, which has been generated after using the `az ad sp create-for-rbac` command into the **JSON Panel** of the window), and then click **Sign In**.\n\n   ![The JSON Panel window with paste information.][S01]\n\n1. In the **Select Subscriptions** dialog box, select the subscriptions that you want to use, and then click **Select**.\n\n## Sign out of your Azure account\n\nAfter you have configured your account by preceding steps, you will be automatically signed in each time you start IntelliJ IDEA.\n\nHowever, if you want to sign out of your Azure account, navigate to the Azure Explorer side bar, click the **Azure Sign Out** icon or from the IntelliJ menu, navigate to **Tools>Azure>Azure Sign Out**).\n\n## Next steps\n\n[!INCLUDE [additional-resources](includes/additional-resources.md)]\n\n<!-- URL List -->\n\n<!-- IMG List -->\n\n[I01]: media/sign-in-instructions/I01.png\n[I02]: media/sign-in-instructions/I02.png\n[O01]: media/sign-in-instructions/O01.png\n[A01]: media/sign-in-instructions/A01.png\n[A03]: media/sign-in-instructions/A03.png\n[S01]: media/sign-in-instructions/S01.png\n"
  },
  {
    "path": "articles/java/toolkit-for-intellij/toc.yml",
    "content": "items:\n- name: Azure Toolkit for IntelliJ documentation\n  href: index.yml\n  items:\n  - name: Overview\n    href: overview.md\n  - name: Setting up\n    expanded: true\n    items: \n    - name: Install the Azure Toolkit for IntelliJ\n      href: install-toolkit.md\n    - name: Sign in to your Azure account\n      href: sign-in-instructions.md\n  - name: Manage Azure resources\n    expanded: true\n    items: \n    - name: Azure Web App\n      expanded: true\n      items:\n       - name: Get Started - Web App\n         href: create-hello-world-web-app.md\n       - name: Deploy web app to a Linux container\n         href: hello-world-web-app-linux.md\n    - name: Azure Functions - Get Started\n      href: /azure/azure-functions/functions-create-maven-intellij?toc=/azure/developer/java/toolkit-for-intellij/toc.json&bc=/azure/developer/java/breadcrumb/toc.json\n    - name: Azure Container Apps - Get Started\n      href: create-container-apps-intellij.md\n    - name: Azure Storage - Manage Storage Accounts\n      href: managing-storage-accounts-using-azure-explorer.md\n    - name: Azure Virtual machines - Manage Virtual Machines\n      href: managing-virtual-machines-using-azure-explorer.md\n    - name: Azure Redis Cache - Manage Azure Redis Cache\n      href: managing-redis-caches-using-azure-explorer.md\n    - name: Azure OpenAI - Get Started\n      href: chatgpt-intellij.md\n  - name: Release notes\n    href: https://github.com/Microsoft/azure-tools-for-java/releases\n  - name: Marketplace\n    href: https://plugins.jetbrains.com/plugin/8053\n    "
  },
  {
    "path": "articles/javascript/TOC.yml",
    "content": "- name: Azure for JavaScript & Node.js developers\n  href: index.yml\n  items:\n  - name: Get started\n    href: what-is-azure-for-javascript-development.md\n  - name: Azure AI apps \n    items: \n    - name: Develop with Foundry Tools\n      href: ai/azure-ai-for-javascript-developers.md\n    - name: Generative AI for JavaScript developers\n      href: ai/generative-ai-for-javascript-developers.md\n    - name: Get started with Enterprise chat\n      href: ai/get-started-app-chat-template.md\n    - name: Get started with serverless chat with LangChainjs\n      href: ai/get-started-app-chat-template-langchainjs.md\n      display: Azure OpenAI, OpenAI, AI\n    - name: Get started with serverless chat with LlamaIndex\n      href: ai/get-started-app-chat-template-llamaindex.md\n      display: Azure OpenAI, OpenAI, AI\n    - name: Serverless Azure OpenAI Assistant with function calling\n      href: ai/get-started-app-chat-assistants-function-calling.md\n      display: Azure OpenAI, OpenAI, AI, function calling, assistants\n    - name: JavaScript frontend + Python backend\n      href: ai/chat-app-with-separate-front-back-end.md\n      display: building block, frontend, backend\n    - name: Evaluate your chat app\n      href: ai/get-started-app-chat-evaluations.md\n      display: Azure OpenAI\n    - name: Scale Azure OpenAI with Azure Container Apps\n      href: ai/get-started-app-chat-scaling-with-azure-container-apps.md\n    - name: Build a LangChain.js agent with Azure AI Search\n      href: ai/langchain-agent-on-azure.md\n      display: Azure OpenAI, OpenAI, AI, LangChain.js, Azure AI Search\n  - name: Developer environment\n    items:\n    - name: Development environment\n      href: core/configure-local-development-environment.md\n    - name: Node.js LTS versions\n      href: choose-nodejs-version.md\n    - name: Recommended Tools\n      href: node-azure-tools.md\n    - name: Clone a GitHub repo with Visual Studio Code\n      href: how-to/with-visual-studio-code/clone-github-repository.md\n  - name: Develop web apps\n    items: \n    - name: Upload image to Storage\n      href: tutorial/browser-file-upload-azure-storage-blob.md\n    - name: Express.js with MongoDB\n      href: /azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli&toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n    - name: Express.js with MERN\n      href: /azure/cosmos-db/mongodb/vcore/tutorial-nodejs-web-app?tabs=github-codespace&toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n    - name: Add easy authentication\n      href: /azure/app-service/scenario-secure-app-authentication-app-service-as-user?toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n    - name: Use Microsoft Identity provider (MSAL.js)\n      href: /entra/identity-platform/quickstart-web-app-nodejs-msal-sign-in?toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n    - name: Backend microservice app\n      href: /azure/container-apps/tutorial-code-to-cloud?tabs=bash%2Cjavascript&pivots=acr-remote&toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n    - name: Frontend microservice app\n      href: /azure/container-apps/communicate-between-microservices?tabs=bash&pivots=acr-remote&toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n    - name: Microservice with DAPR\n      href: /azure/container-apps/microservices-dapr?tabs=bash&toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n  - name: Develop serverless apps\n    href: how-to/develop-serverless-apps.md\n  - name: Developer Guides\n    items: \n    - name: Container apps\n      href: /azure/container-apps/javascript-overview?toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n      display: Azure Container Apps, ACA, docker, images, containers\n    - name: GraphQL\n      href: graphql-developer-guide.md\n    - name: Serverless\n      href: /azure/azure-functions/functions-reference?tabs=blob&toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n    - name: Storage\n      href: /azure/storage/blobs/storage-blob-javascript-get-started?toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n    - name: API development with TypeSpec\n      href: /azure/developer/typespec\n    - name: Cosmos DB for NoSQL developer guide\n      href: /azure/cosmos-db/nosql/how-to-javascript-get-started\n    - name: Cosmos DB for MongoDB developer guide\n      href: /azure/cosmos-db/mongodb/how-to-javascript-get-started\n    - name: Key Vault\n      items:\n      - name: Keys\n        href: /azure/key-vault/keys/javascript-developer-guide-get-started?tabs=developer-auth%2Caz-login-terminal-bash&toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n      - name: Secrets\n        href: /azure/key-vault/secrets/javascript-developer-guide-get-started?tabs=developer-auth%2Caz-login-terminal-bash&toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n  - name: Deployment\n    items:\n    - name: Select hosting service\n      href: /azure/developer/intro/hosting-apps-on-azure\n    - name: Select deployment process\n      href: how-to/deploy-web-app.md\n    - name: Azure Developer CLI\n      href: /azure/developer/azure-developer-cli\n  - name: Azure SDK for JavaScript\n    items:\n    - name: Getting started  \n      href: sdk/use-azure-sdk.md    \n    - name: Install packages\n      href: sdk/azure-sdk-install.md\n    - name: Authentication\n      items:\n      - name: Overview\n        href: sdk/authentication/overview.md\n      - name: Local development apps\n        items: \n        - name: Use a developer account\n          href: sdk/authentication/local-development-environment-developer-account.md\n        - name: Use a service principal\n          href: sdk/authentication/local-development-environment-service-principal.md\n        - name: Use a broker\n          href: sdk/authentication/local-development-broker.md\n      - name: Auth for Azure-hosted apps\n        items: \n        - name: Use a system-assigned managed identity\n          href: sdk/authentication/system-assigned-managed-identity.md\n        - name: Use a user-assigned managed identity\n          href: sdk/authentication/user-assigned-managed-identity.md\n      - name: On-premises apps\n        href: sdk/authentication/on-premises-apps.md\n      - name: Credential chains\n        href: sdk/authentication/credential-chains.md\n      - name: Best practices\n        href: sdk/authentication/best-practices.md\n    - name: Looping over data\n      href: sdk/loop-over-data.md\n    - name: Logging \n      href: sdk/debug-client-libraries.md\n    - name: Testing\n      href: sdk/test-sdk-integration.md\n  - name: Observability\n    href: logging.md\n  - name: Testing\n    href: core/test-azure-sdk-integrated-code.md\n  - name: Training and certification\n    href: learn-azure-javascript.md  \n  - name: Samples\n    items: \n    - name: Azure JavaScript samples \n      href: samples.md\n  - name: JavaScript at Microsoft\n    href: https://developer.microsoft.com/javascript/\n  - name: npm Packages\n    href: azure-sdk-library-package-index.md\n  - name: npm Package Documentation\n    href: /javascript/api/overview/azure/?toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json\n"
  },
  {
    "path": "articles/javascript/ai/azure-ai-for-javascript-developers.md",
    "content": "---\ntitle: Develop JavaScript apps that use Foundry Tools\ndescription: This article provides an organized list of resources about Azure AI scenarios for JavaScript developers, including documentation and code samples.\nkeywords: ai, azure openai service\nms.subservice: intelligent-apps\nms.topic: overview\nms.update-cycle: 180-days\nms.date: 01/30/2026\nms.custom: overview, devx-track-js, devx-track-js-ai, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n---\n\n# Develop AI apps with JavaScript\n\nThis article contains an organized list of the best learning resources for JavaScript developers who are getting started building AI apps. Resources include popular quickstart articles, reference samples, documentation, training courses, and so on.\n\n[!INCLUDE [azure-ai-for-developers-javascript](../../ai/includes/azure-ai-for-developers-javascript.md)]\n"
  },
  {
    "path": "articles/javascript/ai/chat-app-with-separate-front-back-end.md",
    "content": "---\ntitle: \"AI Chat: JavaScript frontend + Python backend\"\ndescription: Steps to integrate the JavaScript frontend with the Python backend in the enterprise Azure OpenAI Chat App.\nms.date: 09/30/2025\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-js, devx-track-python, devx-track-js-ai, devx-track-python-ai, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a multi-language developer new to Azure OpenAI, I want use the JavaScript frontend with a different language backend from the reference templates.\n---\n\n# Update the Chat app to use the JavaScript frontend with the Python backend\n\nThe Chat app is a reference application that demonstrates how to use the Azure OpenAI service. Each programming language reference architecture provides slightly different functionality. This article describes how to use the JavaScript frontend with the Python backend.\n\nBy mixing and matching the frontend and backend, you can create a multi-language application that uses the best of both worlds.\n\n* [Demo](https://aka.ms/azai/js.py/video) - Configure JavaScript frontend with Python backend video\n\nThis article is part of a collection of articles that show you how to build a chat app using Azure OpenAI Service and Azure AI Search. Other articles in the collection include:\n\n* [.NET](/dotnet/ai/get-started-app-chat-template)\n* [Java](../../java/quickstarts/get-started-app-chat-template.md)\n* [Python](../../python/get-started-app-chat-template.md)\n\n> [!NOTE]\n> This article uses one or more [AI app templates](../../ai/intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained, easy to deploy reference implementations that help to ensure a high-quality starting point for your AI apps.\n\n## Prerequisites\n\nDeploy the two reference architectures using the following articles. Make sure to use the same subscription and region for both deployments. The deployment might take up to 20 minutes. Leave the deployments up; don't complete the _Clean-up resources_ section until you're done with this article.\n\n* Deploy the JavaScript chat app using this [article](/azure/developer/javascript/get-started-app-chat-template)\n* Deploy the Python chat app using this [article](/azure/developer/python/get-started-app-chat-template)\n\n## Get the URLs for the frontend and backend\n\nAfter you deploy the two reference architectures, you have two full-stack apps. To connect the JavaScript frontend with the Python backend, get the URLs for both apps and configure them.\n\nYou should have each repo in a separate development environment, either locally or in Codespaces.\n\n### Set JavaScript front-end URL in Python backend\n\n1. In the JavaScript development environment, get the URL for the JavaScript frontend by running the following command:\n\n    ```bash\n    azd env get-values | grep WEBAPP_URI\n    ```\n\n    This command gets all the cloud environment variables and filters for the `WEBAPP_URI` variable. Make sure the URL doesn't end with a slash, `/`.\n\n1. Copy the URL.\n1. In the Python development environment, set the URL for the JavaScript frontend by running the following command:\n\n    ```bash\n    azd env set ALLOWED_ORIGIN <FRONTEND-URL>\n    ```\n\n1. In the Python development environment, redeploy the Python backend by running the following command:\n\n    ```bash\n    azd up\n    ```\n\n### Set Python backend URL in JavaScript frontend\n\n1. In the Python development environment, get the URL for the Python backend by running the following command:\n\n    ```bash\n    azd env get-values | grep BACKEND_URI\n    ```\n\n    This command gets all the cloud environment variables and filters for the `BACKEND_URI` variable. Make sure the URL doesn't end with a slash, `/`.\n\n1. Copy the URL.\n1. In the JavaScript development environment, set the URL for the Python backend by running the following command:\n\n    ```bash\n    azd env set BACKEND_URI <BACKEND_URI>\n    ```\n\n1. In the Python development environment, redeploy the Python backend by running the following command in the Python development environment:\n\n    ```bash\n    azd up\n    ```\n\n## Use the JavaScript frontend with the Python backend\n\nThe Python app uses an HR benefits subject area while the JavaScript app uses a real estate subject area. Now that the apps are connected, you can use the front-end to ask about HR benefits. Suggested questions include:\n\n* What is included in my Northwind Health Plus plan that isn't standard?\n* What happens in a performance review?\n* What does a Product Manager do?\n\n## Clean-up resources\n\nWhen you're done with the apps, you can delete the resources to avoid incurring more charges.\n\n* Delete the JavaScript app with [these instructions](/azure/developer/javascript/get-started-app-chat-template#clean-up-resources)\n* Delete the Python app with [these instructions](/azure/developer/python/get-started-app-chat-template#clean-up-resources)\n\n## Troubleshooting\n\n* If you get an error, make sure the URLs you entered in the environment don't end with a slash, `/`.\n\n## Next steps\n\n* [Build a chat app with Azure OpenAI](https://aka.ms/azai/chat) best practice solution architecture\n* [Access control in Generative AI Apps with Azure AI Search](https://techcommunity.microsoft.com/t5/azure-ai-services-blog/access-control-in-generative-ai-applications-with-azure/ba-p/3956408)\n* [Build an Enterprise ready OpenAI solution with Azure API Management](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/build-an-enterprise-ready-azure-openai-solution-with-azure-api/bc-p/3935407)\n* [Outperforming vector search with hybrid retrieval and ranking capabilities](https://techcommunity.microsoft.com/t5/azure-ai-services-blog/azure-cognitive-search-outperforming-vector-search-with-hybrid/ba-p/3929167)\n- Learn more about how the Azure Developer CLI (AZD) is used in this template:\n    - [Tech community blog post](https://techcommunity.microsoft.com/blog/azuredevcommunityblog/kickstart-projects-with-azd-templates/4295235?WT.mc_id=javascript-155021-juliamuiruri)\n    - [Reactor video series](https://www.youtube.com/watch?v=sp4_cWnlNQs&list=PLmsFUfdnGr3zzLIPdJsfdSwymIwOsyQ9Z&index=1)\n"
  },
  {
    "path": "articles/javascript/ai/generative-ai-for-javascript-developers.md",
    "content": "---\ntitle: Generative AI for JavaScript developers\ndescription: Learn how to build generative AI apps with JavaScript by using prompt engineering, RAG, LangChain.js, Ollama, Microsoft Foundry, Azure Cosmos DB, and the AI Chat Protocol.\nms.date: 03/13/2026\nms.author: diberry\nauthor: diberry\nms.service: azure-javascript\nms.subservice: intelligent-apps\nms.topic: concept-article\nms.custom: devx-track-js, devx-track-js-ai\nms.collection: ce-skilling-ai-copilot\nai-usage: ai-generated\n#customer intent: As a JavaScript developer, I want to understand generative AI so that I can build AI applications.\n---\n\n# Generative AI for JavaScript developers\n\nUse JavaScript to build generative AI features into your web, mobile, and desktop apps. This overview highlights core concepts, tools, and learning resources to help you get started.\n\n## Why use JavaScript for AI?\n\nPython is a common choice for training AI models, but most app developers use models through web APIs. Because JavaScript runs across browsers and servers and handles HTTP calls well, it's a practical choice for building AI apps.\n\n## Take the companion course\n\nUse the companion course to learn through videos, code projects, and a full end-to-end sample.\n\n* [Course](https://github.com/microsoft/generative-ai-with-javascript)\n* [Video series](https://aka.ms/genai-js)\n\nIf you're a student or new developer, this course gives you a practical way to learn AI. If you already build apps professionally, it helps you deepen your AI skills.\n\nIn this course, you:\n\n* Learn AI while you bring historical figures to life with generative AI.\n* Apply accessibility by using built-in browser APIs.\n* Use text and image generation to integrate AI into the app experience.\n* Learn architectural patterns for AI applications.\n\n:::image type=\"content\" source=\"media/generative-ai-for-javascript-developers/leonardo-talk.png\" alt-text=\"An AI-generated image of Leonardo Da Vinci used in the companion app to talk to historical characters.\":::\n\n[Use the companion application to talk to historical characters](https://github.com/microsoft/generative-ai-with-javascript/blob/main/README.md)\n\n## What to know about LLMs\n\nLarge language models (LLMs) are neural networks trained on large datasets to understand and generate text. Training usually starts with a broad base model and then adds fine-tuning for specific tasks. LLMs can help with scenarios such as code completion and chat, but they also have limits, including context windows and possible bias in training data. That's why responsible AI practices such as fairness, reliability, privacy, and accountability matter.\n\nLearn more in the [LLM session of the course](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/sessions/01-llms.md):\n* [Demo](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/demos/01-llms/readme.md)\n* [Video](https://www.youtube.com/watch?v=GQ_2OjNZ9aA&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=2)\n\n## Use prompt engineering techniques\n\nPrompt engineering is the practice of writing prompts that guide the model toward better results. Use zero-shot prompts when you don't need examples, or few-shot prompts when examples help. Clear instructions, relevant context, and explicit output formats often improve responses and prepare you for more advanced patterns such as RAG.\n\nLearn more in the [prompt engineering session of the course](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/sessions/02-prompt-engineering.md):\n* [Demo](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/demos/02-prompt-engineering/readme.md)\n* [Video](https://www.youtube.com/watch?v=gQ6TlyxBmWs&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=3)\n\n## Improve AI accuracy and reliability with RAG\n\nUse retrieval-augmented generation (RAG) to ground model responses in current, trusted data. RAG combines a retriever that finds relevant content with a generator that uses that content to answer questions. This approach can improve accuracy, make responses easier to verify, and control costs. For example, a real estate support app can use company documents to answer detailed customer questions.\n\nLearn more in the [RAG session of the course](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/sessions/03-rag.md):\n* [Demo](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/demos/03-rag/readme.md)\n* [Video](https://www.youtube.com/watch?v=xkFOmx5yxIA&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=4)\n\n## Speed up your AI development with LangChain.js\n\nSpeed up your AI projects with LangChain.js. This JavaScript library helps you build prompt templates, connect models and vector stores, and compose complex workflows. It works well for rapid prototyping, such as an API that answers questions from YouTube transcripts. When you're ready for production, you can swap local models and vector stores for Azure services without rewriting your app.\n\nLearn more in the [LangChain.js session of the course](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/sessions/04-langchainjs.md):\n* [Demo](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/demos/04-langchainjs/readme.md)\n* [Video](https://www.youtube.com/watch?v=02IDU8eCX8o&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=5)\n\n## Run AI models on your local machine with Ollama\n\nUse Ollama to run local AI models, including Phi-3, on your machine. Local models reduce cloud dependencies, support offline development, and shorten your inner loop while you test ideas. Because Ollama exposes an OpenAI-compatible API, you can integrate it into existing JavaScript workflows with minimal changes.\n\nLearn more in the [Ollama session of the course](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/sessions/05-local-models.md):\n* [Demo](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/demos/05-local-models/readme.md)\n* [Video](https://www.youtube.com/watch?v=dLfNnoPv4AQ&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=6)\n\n## Get started with AI for free\n\nYou can run AI for free by using [Foundry Local](/azure/foundry-local/get-started), which lets you download AI models and interact with them locally. There's also [AI Toolkit for Visual Studio Code](/windows/ai/toolkit/), an extension that supports model download, fine-tuning, and more. [Ollama](https://ollama.com/) is another popular choice for running local models.\n\nYou can also try models without any local setup by creating a GitHub Codespace and using a Jupyter notebook to test prompt engineering, few-shot learning, and RAG.\n\nLearn more in the [Phi-3 session of the course](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/sessions/06-playground.md):\n* [Demo](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/demos/06-playground/readme.md)\n* [Video](https://www.youtube.com/watch?v=Ds32MS9SHzU&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=7)\n\n## Introduction to Microsoft Foundry\n\nUse Microsoft Foundry to start building generative AI apps with JavaScript. Organize resources with hubs and projects, browse models, and deploy a model to test in a playground. Whether you use managed compute or serverless APIs, the workflow stays the same: choose a model, deploy it, and integrate it into your app.\n\nLearn more in the [Foundry session of the course](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/sessions/07-ai-foundry.md):\n* [Demo](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/demos/07-ai-foundry/readme.md)\n* [Video](https://www.youtube.com/watch?v=9Mo-VOGk8ng&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=8)\n\n## Build generative AI apps with Azure Cosmos DB\n\nLearn more in the [Azure Cosmos DB session of the course](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/sessions/08-cosmos-db.md):\n* [Demo](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/demos/08-cosmos-db/readme.md)\n* [Video](https://www.youtube.com/watch?v=-GQyaLbeqxQ&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=9)\n\n## Azure tools and services for hosting and storing AI apps\n\nLearn which Azure tools and services fit common AI app architectures, including chat apps, RAG apps, and autonomous agents. This session also shows how to use Azure Developer CLI (AZD) to deploy apps and compare serverless and container-based hosting options.\n\nLearn more in the [Azure tools and services session of the course](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/sessions/09-azure-tools.md):\n* [Video](https://www.youtube.com/watch?v=WB6Fpzhwyug&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=10)\n\n## Stream generative AI output with the AI Chat Protocol\n\nUse the AI Chat Protocol to support real-time communication between your AI service and client apps. You can stream responses from the browser or from an AI inference server, depending on your architecture. As you implement streaming, plan for API key protection, data safety, and protocol choice. The protocol client supports methods such as `getCompletion` and `getStreamedCompletion`, as shown in the serverless RAG with LangChain.js example.\n\nLearn more in the [Streaming session of the course](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/sessions/10-chat-protocol.md):\n* [Demo](https://github.com/microsoft/generative-ai-with-javascript/blob/main/videos/demos/10-chat-protocol/readme.md)\n* [Video](https://www.youtube.com/watch?v=fzDCW-6hMtU&list=PLlrxD0HtieHi5ZpsHULPLxm839IrhmeDk&index=11)"
  },
  {
    "path": "articles/javascript/ai/get-started-app-chat-assistants-function-calling.md",
    "content": "---\ntitle: \"JavaScript Azure OpenAI Assistants and function calling\"\ndescription: \"This article shows you how to deploy and run the serverless Azure OpenAI Assistant with function calling.\"\nms.date: 01/30/2026\nms.topic: get-started\nms.service: azure-javascript\nms.subservice: intelligent-apps\nms.custom: devx-track-js, devx-track-js-ai\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a JavaScript developer new to Azure OpenAI, I want to understand and deploy an app using assistants and function calling.\n---\n# Get started with Azure OpenAI with Assistants and function calling in JavaScript\n\nThis article shows you how to deploy and run the [serverless Azure OpenAI Assistant Quick Start](https://github.com/Azure-Samples/azure-openai-assistant-javascript). This sample implements an assistants app using JavaScript, Azure OpenAI Service assistants with function calling, and Azure Functions.\n\n## Architectural overview\n\nAzure OpenAI Assistants allows you to create AI assistants tailored to your needs through custom instructions and augmented by advanced tools like code interpreter, and custom functions. In this article, we provide an in-depth walkthrough of getting started with the Assistants API.\n\n:::image type=\"content\" source=\"../media/get-started-app-chat-assistants-function-calling/azure-openai-assistant-diagram.png\" alt-text=\"Diagram showing architecture from client to backend app.\":::\n\nThis application is built around two main components:\n\n- A simple HTML page with a vanilla CSS and JavaScript files, and hosted on [Azure Static Web Apps](/azure/static-web-apps/overview). \n\n- A serverless API built with [Azure Functions](/azure/azure-functions/functions-overview?pivots=programming-language-javascript) and using OpenAI JavaScript SDK. The serverless app sends the assistants definition including the function call to the OpenAI endpoint. The endpoint responds with the follow-up function call and the parameters needed to complete that call. \n\n    - The sample's function call simulates an API call by generating a random stock ticker value based on the stock symbol sent into the Azure Function. This simulation can be replaced with a remote API in your solution.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-assistants-function-calling/diagram-azure-openai-service-function-calling-architecture.png\" alt-text=\"Diagram showing Azure Functions integration with Azure OpenAI where Azure OpenAI can return follow-up function names which Azure Functions should call.\":::\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\nTo use this article, you need the following prerequisites:\n\n#### [Codespaces (recommended)](#tab/github-codespaces)\n\n1. An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n1. Azure account permissions - Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n1. A GitHub account.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n1. An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n1. Azure account permissions - Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n1. [Azure Developer CLI](../../azure-developer-cli/install-azd.md?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&pivots=os-windows)\n1. [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running\n1. [Git](https://git-scm.com/downloads) \n1. [Visual Studio Code](https://code.visualstudio.com/)\n1. [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n---\n\n## Open development environment\n\nUse the following instructions to deploy a preconfigured development environment containing all required dependencies to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Start the process to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/azure-openai-assistant-javascript`](https://github.com/Azure-Samples/azure-openai-assistant-javascript) GitHub repository.\n1. Right-click on the following button, and select _Open link in new windows_ to have both the development environment and the documentation available at the same time.\n\n    [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-openai-assistant-javascript)\n\n1. On the **Create codespace** page, review the codespace configuration settings, then select **Create new codespace**\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen.\n\n    ```bash\n    azd auth login\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\n1. The remaining tasks in this article take place in the context of this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n1. Fork the sample repository by selecting this [Azure-Samples/azure-openai-assistant-javascript](https://github.com/Azure-Samples/azure-openai-assistant-javascript/fork) link.\n1. Clone your fork repository. Replace `<github-username>` with your GitHub account name.\n\n    ```console\n    git clone https://github.com/<github-username>/azure-openai-assistant-javascript\n    ```\n\n1. Open **Visual Studio Code** in the new folder.\n\n    ```console\n    cd azure-openai-assistant-javascript\n    code .\n    ```\n\n1. Ensure that you have the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) installed in Visual Studio Code.\n\n1. Open a new terminal in the editor.\n\n    > [!TIP]\n    > Use the main menu to navigate to the **Terminal** menu option and then select the **New Terminal** option.\n    >\n    > :::image type=\"content\" source=\"../media/get-started-app-chat-assistants-function-calling/open-terminal-option.png\" lightbox=\"../media/get-started-app-chat-assistants-function-calling/open-terminal-option.png\" alt-text=\"Screenshot of the menu option to open a new terminal.\":::\n\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login\n    ```\n\n    Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\n1. Open the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen in Container**.\n\n    > [!TIP]\n    > Visual Studio Code might automatically prompt you to reopen the existing folder within a development container. This action is functionally equivalent to using the command palette to reopen the current workspace in a container.\n\n1. Reopen the Terminal window again (<kbd>Ctrl</kbd> + <kbd>`</kbd>) and leave it open.\n1. The remaining exercises in this project take place in the context of this development container.\n\n---\n\n## Deploy and run\n\nThe sample repository contains all the code and configuration files you need to deploy a function app to Azure. The following steps walk you through the process of deploying the sample to Azure.\n\n### Deploy assistants app to Azure\n\n> [!IMPORTANT]\n> Azure resources created in this section incur immediate costs, primarily from the Azure AI Search resource. These resources might accrue costs even if you interrupt the command before it finishes.\n\n1. Run the following Azure Developer CLI command to provision the Azure resources and deploy the source code:\n\n    ```bash\n    azd up\n    ```\n\n1. When you're prompted to enter an environment name, keep it short and lowercase. For example, `myenv`. It's used as part of the resource group name. \n1. When prompted, select a subscription to create the resources in. \n1. When you're prompted to select a location the first time, select a location near you. This location is used for most the resources including hosting.\n1. If you're prompted for a location for the OpenAI model, select a location that is near you. If the same location is available as your first location, select that.\n1. Wait until app is deployed. It might take 5-10 minutes for the deployment to complete.\n1. After deploying the application successfully, you see a URL displayed in the terminal.\n1. Select that URL labeled `Deploying service web` to open the assistant application in a browser.\n\n### Use the assistant app\n\nUse the assistant app to get the stock market price of `MSFT`. The following steps walk you through the process of using the assistant app. The assistant can send you the answers in email. Since the email sending feature isn't configured, modify the prompt to not use that instruction.\n\n1. In the browser, copy and paste in the following prompt:\n\n    ```\n    Based on the latest financial data and current stock market trends, can you provide a detailed analysis of Microsoft's current state? Please include insights into their recent performance, market position, and future outlook. Additionally, retrieve and include the latest closing price of Microsoft's stock using its ticker symbol (MSFT). \n    ```\n\n1. Select the **Run** button. Your results should look _similar_ to the following response.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-assistants-function-calling/azure-openai-assistant-demo.png\" alt-text=\"Screenshot of assistant app's first answer.\":::\n\n## Clean up resources\n\n### Clean up Azure resources\n\nThe Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\nRun the following Azure Developer CLI command to delete the Azure resources and remove the source code:\n\n```bash\nazd down --purge\n```\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running Codespaces sourced from the [`Azure-Samples/azure-openai-assistant-javascript`](https://github.com/Azure-Samples/azure-openai-assistant-javascript) GitHub repository.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-assistants-function-calling/github-codespace-dashboard.png\" alt-text=\"Screenshot of all the running Codespaces including their status and templates.\":::\n\n1. Open the context menu, `...`, for the codespace and then select **Delete**.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\n1. Open the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen Folder Locally**.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-assistants-function-calling/reopen-local-command-palette.png\" alt-text=\"Screenshot of the Command Palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> After Visual Studio Code stops the running development container, the container still exists in Docker in a stopped state. You can delete the container instance, container image, and volumes from Docker to free up more space on your local machine.\n\n---\n\n## Get help\n\nThis sample repository offers [troubleshooting information](https://github.com/Azure-Samples/azure-openai-assistant-javascript/tree/main#troubleshooting).\n\nIf your issued isn't addressed, log your issue to the repository's [Issues](https://github.com/Azure-Samples/azure-openai-assistant-javascript/issues).\n\n## Related content\n\n- [What is the Azure OpenAI Assistants API?](/azure/ai-services/openai/concepts/assistants)\n- [Get started with evaluating answers in a chat app in JavaScript](get-started-app-chat-evaluations.md)"
  },
  {
    "path": "articles/javascript/ai/get-started-app-chat-evaluations.md",
    "content": "---\ntitle: \"Evaluating JavaScript chat apps with Azure OpenAI\"\ndescription: \"Learn how to effectively evaluate answers in your JavaScript RAG-based chat app using Azure OpenAI. Generate sample prompts, run evaluations, and analyze results.\"\nms.date: 01/30/2026\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-js, devx-track-js-ai, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a JavaScript developer new to Azure OpenAI, I want to evaluate the answers of my chat app and determine the best prompt.\n---\n# Get started with evaluating answers in a chat app in JavaScript\n\n[!INCLUDE [evaluations-intro](../../ai/includes/evaluations-introduction.md)]\n\n## Prerequisites\n\n* Azure subscription.  [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) \n\n* Deploy a chat app.\n\n    * [JavaScript](get-started-app-chat-template.md)\n    * [JavaScript with LangChain.js](get-started-app-chat-template-langchainjs.md)\n\n* These chat apps load the data into the Azure AI Search resource. This resource is required for the evaluations app to work. Don't complete the **Clean up resources** section of the previous procedure.\n\n    You need the following Azure resource information from that deployment, which is referred to as the **chat app** in this article:\n\n    * Chat API URI: The service backend endpoint shown at the end of the `azd up` process.\n    * Azure AI Search. The following values are required:\n         * Resource name: The name of the Azure AI Search resource name, reported as `Search service` during the `azd up` process.\n        * Index name: The name of the Azure AI Search index where your documents are stored. You can find the index name in the Azure portal for the Search service.\n\n    The Chat API URL allows the evaluations to make requests through your backend application. The Azure AI Search information allows the evaluation scripts to use the same deployment as your backend, loaded with the documents.\n\n    After you collect this information, you don’t need to use the **chat app** development environment again. This article refers to the **chat app** several times to show how the **Evaluations app** uses it. Don’t delete the **chat app** resources until you finish all steps in this article.\n\n* A [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\n    #### [Codespaces (recommended)](#tab/github-codespaces)\n    \n    * GitHub account\n\n    #### [Visual Studio Code](#tab/visual-studio-code)\n    * [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running\n    * [Visual Studio Code](https://code.visualstudio.com/)\n    * [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n    ---\n\n[!INCLUDE [evaluations-procedure](../../ai/includes/evaluations-procedure.md)]\n"
  },
  {
    "path": "articles/javascript/ai/get-started-app-chat-scaling-with-azure-container-apps.md",
    "content": "---\ntitle: Scale OpenAI for JavaScript chat sample using RAG\ndescription: Learn how to add load balancing to your JavaScript solution to extend the chat app beyond the Azure OpenAI Models in Microsoft Foundry token and model quota limits. \nms.date: 01/30/2026\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-js, devx-track-js-ai, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a JavaScript developer new to Azure OpenAI, I want to scale my Azure OpenAI Models in Microsoft Foundry capacity using Azure Container Apps to avoid rate limit errors.\n---\n\n# Scale OpenAI for JavaScript chat using RAG with Azure Container Apps\n\n[!INCLUDE [aca-load-balancer-intro](../../ai/includes/scaling-load-balancer-introduction-azure-container-apps.md)]\n\n## Prerequisites\n\n* Azure subscription.  [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\n* [Dev containers](https://containers.dev/) are available for both samples, with all dependencies required to complete this article. You can run the dev containers in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\n    #### [Codespaces (recommended)](#tab/github-codespaces)\n    \n    * A GitHub account.\n    \n    #### [Visual Studio Code](#tab/visual-studio-code)\n    * [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running.\n    * [Visual Studio Code](https://code.visualstudio.com/)\n    * [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n    ---\n\n[!INCLUDE [scaling-load-balancer-aca-procedure.md](../../ai/includes/scaling-load-balancer-procedure-azure-container-apps.md)]\n\n[!INCLUDE [py-deployment-procedure](../../ai/includes/redeploy-procedure-chat.md)]\n\n[!INCLUDE [logs](../../ai/includes/scaling-load-balancer-logs-azure-container-apps.md)]\n\n[!INCLUDE [capacity.md](../../ai/includes/scaling-load-balancer-capacity.md)]\n\n[!INCLUDE [py-aca-cleanup](../../ai/includes/scaling-load-balancer-cleanup-azure-container-apps.md)]\n\n## Sample code\n\nSamples used in this article include:\n\n* [JavaScript chat app with RAG](https://github.com/Azure-Samples/azure-search-openai-javascript)\n* [Load Balancer with Azure Container Apps](https://github.com/Azure-Samples/openai-aca-lb)\n\n## Next step\n\n* Use [Azure Load Testing](/azure/load-testing/) to load test your chat app with Azure Load Testing Service.\n- Learn more about how the Azure Developer CLI (AZD) is used in this template:\n    - [Tech community blog post](https://techcommunity.microsoft.com/blog/azuredevcommunityblog/kickstart-projects-with-azd-templates/4295235?WT.mc_id=javascript-155021-juliamuiruri)\n    - [Reactor video series](https://www.youtube.com/watch?v=sp4_cWnlNQs&list=PLmsFUfdnGr3zzLIPdJsfdSwymIwOsyQ9Z&index=1)\n\n"
  },
  {
    "path": "articles/javascript/ai/get-started-app-chat-template-langchainjs.md",
    "content": "---\ntitle: \"Get started with Serverless AI Chat using LangChain.js\"\ndescription: \"Use LangChain.js to simplify the interaction between the Azure OpenAI and Azure AI Search to answer a chat answer.\"\nms.topic: get-started \nms.date: 09/30/2025\nms.subservice: intelligent-apps\nms.custom: build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n#customer intent: As a TypeScript developer, I want deploy and use a serverless chat app so that I can understand how langchain.js helps a chat app.\n\n---\n\n# Get started with Serverless AI Chat with RAG using LangChain.js\n\nCreating AI apps can be complex. With LangChain.js, Azure Functions, and Serverless technologies, you can simplify this process. These tools manage infrastructure and scale automatically, letting you focus on chatbot functionality. The chatbot uses enterprise documents to generate AI responses.\n\nThe code includes sample data for a fictitious company. Customers can ask support questions about the company's products. The data includes documents on the company's terms of service, privacy policy, and support guide.\n\n:::image type=\"content\" source=\"../media/get-started-app-chat-langchainjs/demo.gif\" alt-text=\"Screenshot of chat app in browser showing the chat text box and several suggestions for chat input.\":::\n\n> [!NOTE]\n> This article uses one or more [AI app templates](../../ai/intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained, easy to deploy reference implementations that help to ensure a high-quality starting point for your AI apps.\n\n## Architectural overview\n\n### The chat app\n\nThe user interacts with the application:\n\n- The chat interface in the client web app for the conversation.\n- The client web app sends the user's query to the Serverless API via HTTP calls.\n- The Serverless API creates a chain to coordinate interactions between Azure AI and Azure AI Search to generate an answer.\n- The PDF document retrieval by using Azure Blob Storage.\n- The generated response is then sent back to the web app and displayed to the user.\n\nA simple architecture of the chat app is shown in the following diagram:\n\n:::image type=\"content\" source=\"../media/get-started-app-chat-langchainjs/simple-architecture-diagram.png\" alt-text=\"Diagram showing architecture from client to backend app.\":::\n\n### LangChain.js simplifies the complexity between services\n\nThe API flow is useful to understand how LangChain.js is helpful in this scenario by abstracting out the interactions. The **serverless API endpoint**:\n\n- Receives the question from the user.\n- Creates client objects:\n  - Azure OpenAI for embeddings and chat\n  - Azure AI Search for the vector store\n- Creates a document chain with the LLM model, the chat message (system and user prompts), and the document source.\n- Creates a retrieval chain from the document chain and the vector store.\n- Streams the responses from the retrieval chain.\n\nThe developer's work is to correctly configure the dependencies services, such as Azure OpenAI and Azure AI Search and construct the chains correctly. The underlying chain logic allows you to construct chains from many different services and configurations as long as they work with the LangChain.js requirements.\n\n### Where is Azure in this architecture?\n\nThis application is made from multiple components:\n\n- A web app made with a single chat web component built with [Lit](https://lit.dev) and hosted on [Azure Static Web Apps](/azure/static-web-apps). The code is located in the `packages/webapp` folder.\n\n- A serverless API built with [Azure Functions](/azure/azure-functions) and using [LangChain.js](https://js.langchain.com/) to ingest the documents and generate responses to the user chat queries. The code is located in the `packages/api` folder.\n\n- An [Azure OpenAI](/azure/ai-services/openai/) service to create embeddings and generate an answer.  \n\n- A database to store the text extracted from the documents and the vectors generated by LangChain.js, using [Azure AI Search](/azure/search).\n\n- A file storage to store the source documents, using [Azure Blob Storage](/azure/storage/blobs/storage-blobs-introduction).\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\nTo use this article, you need the following prerequisites:\n\n#### [Codespaces (recommended)](#tab/github-codespaces)\n\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- Azure account permissions - Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n- A GitHub account.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- Azure account permissions - Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n- [Azure Developer CLI](/azure/developer/azure-developer-cli)\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running\n- [Visual Studio Code](https://code.visualstudio.com/)\n- [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n---\n\n## Open development environment\n\nUse the following instructions to deploy a preconfigured development environment containing all required dependencies to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Open in codespace.\n\n    [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/serverless-chat-langchainjs)\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. In the terminal at the bottom of the screen, sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login\n    ```\n\n    Complete the authentication process.\n\n1. The remaining tasks in this article take place in the context of this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n\n1. Create a new local directory on your computer for the project. \n\n    ```bash\n    mkdir my-intelligent-app && cd my-intelligent-app\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```bash\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```bash\n    azd init -t serverless-chat-langchainjs\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login\n    ```\n\n    Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\n1. The remaining exercises in this project take place in the context of this development container.\n\n---\n\n## Deploy and run\n\nThe sample repository contains all the code and configuration files you need to deploy the serverless chat app to Azure. The following steps walk you through the process of deploying the sample to Azure.\n\n### Deploy chat app to Azure\n\n> [!IMPORTANT]\n> Azure resources in this section start costing money immediately, even if you stop the command before it finishes.\n\n1. Provision the Azure resources and deploy the source code by using the following Azure Developer CLI command:\n\n    ```bash\n    azd up\n    ```\n\n1. Answer the prompts by using the following table:\n\n    |Prompt|Answer|\n    |--|--|\n    |Environment name|Keep it short and lowercase. Add your name or alias. For example, `john-chat`. It's used as part of the resource group name.|\n    |Subscription|Select the subscription for creating resources. |\n    |Location (for hosting)|Select a location near you from the list.|\n    |Location for the OpenAI model|Select a location near you from the list. If the same location is available as your first location, select that.|\n\n1. Wait until app is deployed. It might take 5-10 minutes for the deployment to complete.\n1. After the application successfully deploys, you see two URLs displayed in the terminal.\n1. Select that URL labeled `Deploying service webapp` to open the chat application in a browser.\n\n### Use chat app to get answers from PDF files\n\nThe chat app is preloaded with rental information from a [PDF file catalog](https://github.com/Azure-Samples/serverless-chat-langchainjs/tree/main/data). You can use the chat app to ask questions about the rental process. The following steps walk you through the process of using the chat app.\n\n1. In the browser, select or enter **What is the refund policy**.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-langchainjs/first-prompt-chat.png\" lightbox=\"../media/get-started-app-chat-langchainjs/first-prompt-chat.png\" alt-text=\"Screenshot of chat app's first question and answer.\":::\n\n1. Select a follow-up question.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-langchainjs/follow-up-suggested-prompt.png\" lightbox=\"../media/get-started-app-chat-langchainjs/follow-up-suggested-prompt.png\" alt-text=\"Screenshot of chat app's suggested follow-up prompt and answer.\":::\n\n1. Select the citation in the response to view the source document. Azure Storage delivers the document to your browser. When you finish reviewing the document, close the tab to return to the chat app.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-langchainjs/citation-document.png\" lightbox=\"../media/get-started-app-chat-langchainjs/citation-document.png\" alt-text=\"Screenshot of original document containing citation.\":::\n\n## Clean up resources\n\n### Clean up Azure resources\n\nAzure bills the resources created in this article to your Azure subscription. If you don't need these resources in the future, delete them to avoid more charges.\n\nDelete the Azure resources and remove the source code with the following Azure Developer CLI command:\n\n```bash\nazd down --purge\n```\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDelete the GitHub Codespaces environment to maximize your free per-core hours.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running Codespaces sourced from the [`Azure-Samples/serverless-chat-langchainjs`](https://github.com/Azure-Samples/serverless-chat-langchainjs) GitHub repository.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-langchainjs/github-codespace-dashboard.png\" alt-text=\"Screenshot of all the running Codespaces including their status and templates.\":::\n\n1. Open the context menu, `...`, for the codespace and then select **Delete**.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\n1. Open the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen Folder Locally**.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-langchainjs/reopen-local-command-palette.png\" alt-text=\"Screenshot of the Command Palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. Free up space on your local machine by deleting the container instance, image, and volumes from Docker.\n\n---\n\n## Get help\n\nThis sample repository offers [troubleshooting information](https://github.com/Azure-Samples/serverless-chat-langchainjs/blob/main/README.md#troubleshooting).\n\nIf your issue isn't addressed, log your issue to the repository's [Issues](https://github.com/Azure-Samples/serverless-chat-langchainjs/issues).\n\n## Related content\n\n- [Get started with evaluating answers in a chat app in JavaScript](get-started-app-chat-evaluations.md)\n- Learn more about how AZD is used in this template:\n    - [Tech community blog post](https://techcommunity.microsoft.com/blog/azuredevcommunityblog/kickstart-projects-with-azd-templates/4295235?WT.mc_id=javascript-155021-juliamuiruri)\n    - [Reactor video](https://youtu.be/aLUhhq7Y0ao?si=ulzadCkRLpn8tsij)\n"
  },
  {
    "path": "articles/javascript/ai/get-started-app-chat-template-llamaindex.md",
    "content": "---\ntitle: \"Get started with Serverless AI Chat using LlamaIndex\"\ndescription: \"Use LlamaIndex to build intelligent apps. It aids in data ingestion, transformation, vectorization, and creating a searchable index for your data.\"\nms.topic: get-started \nms.date: 01/30/2026\nms.subservice: intelligent-apps\nms.custom: build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n#customer intent: As a TypeScript developer, I want deploy and use a serverless chat app so that I can understand how LLamaIndex helps a chat app.\n\n---\n\n# Get started with Serverless AI Chat with RAG using LlamaIndex\n\nSimplify [AI app development with RAG](/azure/developer/ai/augment-llm-rag-fine-tuning#understanding-rag) by using your own data managed by [LlamaIndex](https://ts.llamaindex.ai/), Azure Functions, and Serverless technologies. These tools manage infrastructure and scaling automatically, allowing you to focus on chatbot functionality. LlamaIndex handles the data pipeline all the way from ingestion to the streamed response.\n\n:::image type=\"content\" source=\"../media/get-started-app-chat-template-llamaindex/chat-app-response-in-browser.png\" alt-text=\"Screenshot of chat app in browser showing chat input and the response.\":::\n\n## Architectural overview\n\nThe application flow includes:\n\n- Using the chat interface to enter a prompt.\n- Sending the user's prompt to the Serverless API via HTTP calls.\n- Receiving the user's prompt then using LlamaIndex framework to process and stream the response. The serverless API uses an engine to create a connection to the Azure OpenAI large language model (LLM) and the vector index from LlamaIndex. \n\nA simple architecture of the chat app is shown in the following diagram:\n\n:::image type=\"content\" source=\"../media/get-started-app-chat-template-llamaindex/architecture-diagram-llama-index-javascript.png\" alt-text=\"Diagram of the architecture for the LlamaIndex RAG chat app.\":::\n\nThis sample uses LlamaIndex to generate embeddings and store in its own vector store. LlamaIndex also provides [integration with other vector stores](https://docs.llamaindex.ai/en/stable/community/integrations/vector_stores/) including [Azure AI Search](/azure/search/). That integration isn't demonstrated in this sample.  \n\n### Where is Azure in this architecture?\n\nThe architecture of the application relies on the following services and components:\n\n- [Azure OpenAI](/azure/ai-services/openai/) represents the AI provider that we send the user's queries to.\n- LlamaIndex is the framework that helps us ingest, transform, and vectorize our content (PDF file) and create a search index from our data.\n- [Azure Container Apps](/azure/container-apps/) is the container environment where the application is hosted.\n- [Azure Managed Identity](/entra/identity/managed-identities-azure-resources/) helps us ensure best in class security and eliminates the requirements for you as a developer to deal with credentials and API keys.\n\n### LlamaIndex manages the data from ingestion to retrieval\n\nTo implement a RAG (Retrieval-Augmented Generation) system using LlamaIndex, the following key steps are matched with the LlamaIndex functionality:\n\n| Process | Description | LlamaIndex |\n|--|--|--|\n| Data Ingestion | Import data from sources like PDFs, APIs, or databases. | SimpleDirectoryReader |\n| Chunk Documents | Breakdown large documents into smaller chunks. | SentenceSplitter |\n| Vector index creation | Create a vector index for efficient similarity searches. | VectorStoreIndex |\n| Recursive Retrieval (Optional) from index | Manage complex datasets with hierarchical retrieval. | |\n| Convert to Query Engine | Convert the vector index into a query engine. | asQueryEngine |\n| Advanced query setup (Optional) | Use agents for a multi-agent system. | |\n| Implement the RAG pipeline | Define an objective function that takes user queries and retrieves relevant document chunks. | |\n| Perform Retrieval | Process queries and rerank documents. | RetrieverQueryEngine, CohereRerank |\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\nTo use this article, you need the following prerequisites:\n\n#### [Codespaces (recommended)](#tab/github-codespaces)\n\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- Azure account permissions - Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n- A GitHub account.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- Azure account permissions - Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n- [Azure Developer CLI](/azure/developer/azure-developer-cli)\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running\n- [Visual Studio Code](https://code.visualstudio.com/)\n- [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n---\n\n## Open development environment\n\nUse the following instructions to deploy a preconfigured development environment containing all required dependencies to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Open in codespace.\n\n    [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/llama-index-javascript)\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen.\n\n    ```bash\n    azd auth login\n    ```\n\n    Complete the authentication process.\n\nThe remaining tasks in this article take place in the context of this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n\n1. Create a new local directory on your computer for the project. \n\n    ```bash\n    mkdir my-intelligent-app && cd my-intelligent-app\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```bash\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```bash\n    azd init -t llama-index-javascript\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login\n    ```\n\n    Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n1. The remaining exercises in this project take place in the context of this development container.\n\n---\n\n## Deploy and run\n\nThe sample repository contains all the code and configuration files you need to deploy the serverless chat app to Azure. The following steps walk you through the process of deploying the sample to Azure.\n\n### Deploy chat app to Azure\n\n> [!IMPORTANT]\n> Azure resources created in this section incur immediate costs, primarily from the Azure AI Search resource. These resources might accrue costs even if you interrupt the command before it finishes.\n\n1. To provision the Azure resources and deploy the source code, run the following Azure Developer CLI command:\n\n    ```bash\n    azd up\n    ```\n\n1. Use the following table to answer the prompts:\n\n    |Prompt|Answer|\n    |--|--|\n    |Environment name|Keep it short and lowercase. Add your name or alias. For example, `john-chat`. It's used as part of the resource group name.|\n    |Subscription|Select the subscription to create the resources in. |\n    |Location (for hosting)|Select a location near you from the list.|\n    |Location for the OpenAI model|Select a location near you from the list. If the same location is available as your first location, select that.|\n\n1. Wait until app is deployed. It might take 5-10 minutes for the deployment to complete.\n1. After successfully deploying the application, you see two URLs displayed in the terminal.\n1. Select that URL labeled `Deploying service webapp` to open the chat application in a browser.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-template-llamaindex/azd-up.png\" alt-text=\"Screenshot of output of deployment command showing the web application URL.\":::\n\n### Use chat app to get answers from PDF files\n\nThe chat app is preloaded with information about the physical standards for domestic postal mail from a [PDF file catalog](https://github.com/Azure-Samples/llama-index-javascript/tree/main/data). You can use the chat app to ask questions about the mailing letter and packages. The following steps walk you through the process of using the chat app.\n\n1. In the browser, select or enter **How much does it cost to send a large package to France?**.\n\n1. LlamaIndex derives the answer uses the PDF file and streams the response.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-template-llamaindex/chat-app-response-in-browser.png\" alt-text=\"Screenshot of chat app in browser showing chat input and the response.\":::\n\n    The answer comes from Azure OpenAI with influence from the PDF data ingested into the LlamaIndex vector store. \n\n## Clean up resources\n\nTo clean up resources, there are two things to address:  \n\n- Azure resources, you can clean the resources up with Azure Developer CLI, azd.  \n- Your developer environment; either GitHub Codespaces or DevContainers via Visual Studio Code.\n\n### Clean up Azure resources\n\nThe Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\nRun the following Azure Developer CLI command to delete the Azure resources and remove the source code:\n\n```bash\nazd down --purge\n```\n\n### Clean up developer environments\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running Codespaces sourced from the [`Azure-Samples/llama-index-javascript`](https://github.com/Azure-Samples/llama-index-javascript) GitHub repository.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-template-llamaindex/github-codespace-dashboard.png\" alt-text=\"Screenshot of all the running Codespaces including their status and templates.\":::\n\n1. Open the context menu, `...`, for the codespace and then select **Delete**.\n\n#### [DevContainers Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\nOpen the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen Folder Locally**.\n\n:::image type=\"content\" source=\"../media/get-started-app-chat-template-llamaindex/reopen-local-command-palette.png\" alt-text=\"Screenshot of the Command Palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> After Visual Studio Code stops the running development container, the container still exists in Docker in a stopped state. You can delete the container instance, container image, and volumes from Docker to free up more space on your local machine.\n\n---\n\n## Get help\n\nThis sample repository offers [troubleshooting information](https://github.com/Azure-Samples/llama-index-javascript/blob/main/README.md#troubleshooting).\n\nIf your issue isn't addressed, log your issue to the repository's [Issues](https://github.com/Azure-Samples/llama-index-javascript/issues).\n\n## Next step\n\n> [!div class=\"nextstepaction\"]\n> [Assistants and function calling in JavaScript](get-started-app-chat-assistants-function-calling.md)"
  },
  {
    "path": "articles/javascript/ai/get-started-app-chat-template.md",
    "content": "---\ntitle: Get started with the chat using your own data sample for JavaScript\ndescription: Get started with JavaScript and search across your own data using a chat app sample implemented using Azure OpenAI Service and Retrieval Augmented Generation (RAG) in Azure AI Search. Easily deploy with Azure Developer CLI. This article uses the Azure AI Reference Template sample.\nms.date: 09/30/2025\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-js, devx-track-js-ai, devx-track-extended-azdevcli, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a JavaScript developer new to Azure OpenAI, I want deploy and use sample code to interact with chat app infused with my own business data so that learn from the sample code.\n---\n\n# Get started with the chat using your own data sample for JavaScript\n\nThis article shows you how to deploy and run the [Chat with your data sample for JavaScript](https://github.com/Azure-Samples/azure-search-openai-javascript). This sample implements a chat app using JavaScript, Azure OpenAI Service, and [Retrieval Augmented Generation (RAG)](/azure/search/retrieval-augmented-generation-overview) in Azure AI Search to get answers about rental properties. The rental properties chat app is seeded with data from markdown files (*.md) including a privacy policy, terms of service, and support. \n\n* [Demo JavaScript](https://aka.ms/azai/js/video) -  full stack video\n* [Demo JavaScript](https://aka.ms/azai/js.py/video) - frontend with Python backend video\n\nBy following the instructions in this article, you will:\n\n- Deploy a chat app to Azure.\n- Get answers about rental properties website information.\n- Change settings to change behavior of responses.\n\nOnce you complete this article, you can start modifying the new project with your custom code and data.\n\nThis article is part of a collection of articles that show you how to build a chat app using Azure OpenAI Service and Azure AI Search. Other articles in the collection include: \n\n* [.NET](/dotnet/ai/get-started-app-chat-template)\n* [Java](../../java/quickstarts/get-started-app-chat-template.md)\n* [Python](../../python/get-started-app-chat-template.md)\n\n> [!NOTE]\n> This article uses one or more [AI app templates](../../ai/intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained, easy to deploy reference implementations that help to ensure a high-quality starting point for your AI apps.\n\n## Architectural overview\n\nA simple architecture of the chat app is shown in the following diagram:\n\n:::image type=\"content\" source=\"../media/get-started-app-chat-template/simple-architecture-diagram.png\" alt-text=\"Diagram showing architecture from client to backend app.\":::\n\nThe chat sample application is built for a fictitious company called _Contoso Real Estate_, and the intelligent chat experience allows its customers to ask support questions about the usage of its products. The sample data includes a set of documents that describe its terms of service, privacy policy, and a support guide. The documents are ingested into the architecture during deployment.\n\nThe application is made from multiple components, including:\n\n- **Search service**: the backend service that provides the search and retrieval capabilities.\n- **Indexer service**: the service that indexes the data and creates the search indexes.\n- **Web app**: the frontend web application that provides the user interface and orchestrates the interaction between the user and the backend services.\n\n:::image type=\"content\" source=\"../media/get-started-app-chat-template/app-architecture-azure-services.png\" alt-text=\"Diagram showing Azure services and their integration flow for the front-end app, the search, and the document ingestion.\":::\n\n## Cost\n\nMost resources in this architecture use a basic or consumption pricing tier. Consumption pricing is based on usage, which means you only pay for what you use. To complete this article, the resources generate a charge but it's minimal. When you're done with the article, you can delete the resources to stop incurring charges.\n\nLearn more about [cost in the sample repo](https://github.com/Azure-Samples/azure-search-openai-javascript#cost-estimation).\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally using Visual Studio Code.\n\nTo use this article, you need the following prerequisites:\n\n#### [Codespaces (recommended)](#tab/github-codespaces)\n\n* An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n* Azure account permissions - Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n* GitHub account\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n* An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n* Azure account permissions - Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n* [Azure Developer CLI](/azure/developer/azure-developer-cli)\n* [Docker Desktop](https://www.docker.com/products/docker-desktop/) - start Docker Desktop if it's not already running\n* [Visual Studio Code](https://code.visualstudio.com/)\n* [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n---\n\n## Open development environment\n\nUse the following instructions to deploy a preconfigured development environment containing all required dependencies to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Start the process to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/azure-search-openai-javascript`](https://github.com/Azure-Samples/azure-search-openai-javascript) GitHub repository.\n1. Right-click the following button and select _Open link in new window_ to keep both the development environment and documentation open at the same time.\n\n    [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-javascript)\n\n1. On the **Create codespace** page, review the codespace configuration settings, and then select **Create new codespace**\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-template/github-create-codespace.png\" alt-text=\"Screenshot of the confirmation screen before creating a new codespace.\":::\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. In the terminal at the bottom of the screen, sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login --use-device-code\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\n1. The remaining tasks in this article take place in the context of this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n1. Create a new local directory on your computer for the project.\n\n    ```bash\n    mkdir my-intelligent-app && cd my-intelligent-app\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```bash\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```bash\n    azd init -t azure-search-openai-javascript\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing. \n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login\n    ```\n\n    Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\n1. The remaining exercises in this project take place in the context of this development container.\n\n---\n\n## Deploy and run\n\nThe sample repository contains all the code and configuration files you need to deploy a chat app to Azure. The following steps walk you through the process of deploying the sample to Azure.\n\n### Deploy chat app to Azure\n\n> [!IMPORTANT]\n> Azure resources created in this section incur immediate costs, primarily from the Azure AI Search resource. These resources might accrue costs even if you interrupt the command before it fully executes. \n\n1. To provision the Azure resources and deploy the source code, run the following Azure Developer CLI command:\n\n    ```bash\n    azd up\n    ```\n\n1. If you're prompted to enter an environment name, keep it short and lowercase. For example, `myenv`. It's used as part of the resource group name. \n1. When prompted, select a subscription to create the resources in. \n1. When you're prompted to select a location the first time, select a location near you. This location is used for most the resources including hosting.\n1. If you're prompted for a location for the OpenAI model, select a location that is near you. If the same location is available as your first location, select that.\n1. Wait until app is deployed. It might take 5-10 minutes for the deployment to complete.\n1. After the application successfully deploys, you see a URL displayed in the terminal. \n1. Select that URL labeled `Deploying service web` to open the chat application in a browser.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-template/browser-chat-with-your-data.png\" lightbox=\"../media/get-started-app-chat-template/browser-chat-with-your-data.png\" alt-text=\"Screenshot of chat app in browser with suggestions for chat input and the chat text box to enter a question.\":::\n\n### Use chat app to get answers from markdown files\n\nThe chat app is preloaded with rental information from a [markdown file catalog](https://github.com/Azure-Samples/azure-search-openai-javascript/tree/main/data). You can use the chat app to ask questions about the rental process. The following steps walk you through the process of using the chat app.\n\n1. In the browser, select or enter **What is the refund policy** in the text box at the bottom of the page.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-template/browser-chat-initial-answer.png\" lightbox=\"../media/get-started-app-chat-template/browser-chat-initial-answer.png\" alt-text=\"Screenshot of chat app's first answer.\":::\n\n1. From the answer, select **Show thought process**.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-template/browser-chat-initial-answer-citation-highlighted.png\" lightbox=\"../media/get-started-app-chat-template/browser-chat-initial-answer-citation-highlighted.png\" alt-text=\"Screenshot of chat app's first answer with Show thought process highlighted in a red box.\":::\n\n1. In the right-pane, use the tabs to understand how the answer was generated.\n\n    |Tab|Description|\n    |---|---|\n    |**Thought process**|This tab is a script of the interactions in chat. You can view the system prompt (`content`) and your user question (`content`).|\n    |**Supporting content**|This tab includes the information to answer your question and the source material. The number of source material citations is noted in the **Developer settings**. The default value is **3**.|\n    |**Citation**|This tab displays the original page that contains the citation.|\n\n1. When you're done, select the _hide_ button denoted with an **X** above the tabs.\n\n### Use chat app settings to change behavior of responses\n\nThe specific OpenAI model determines the intelligence of the chat and the settings used to interact with the model. The **Developer settings** option opens the **Configure answer generation** pane where you can change settings for the chat app:\n\n:::image type=\"content\" source=\"../media/get-started-app-chat-template/browser-chat-developer-settings-chat-pane.png\" alt-text=\"Screenshot of chat developer settings.\":::\n\n|Setting|Description|\n|---|---|\n|Override prompt template|This setting controls the prompt used to generate the answer.|\n|Retrieve this many search results|This setting controls the number of search results that are used to generate the answer. You can see these sources returned in the _Thought process_ and _Supporting content_ tabs of the citation. |\n|Exclude category|This setting controls the category of documents that are excluded from the search results.|\n|Use semantic ranker for retrieval|This setting enables a feature of [Azure AI Search](/azure/search/semantic-search-overview#what-is-semantic-search) that uses machine learning to improve the relevance of search results.|\n|Use query-contextual summaries instead of whole documents|When both `Use semantic ranker` and `Use query-contextual summaries` are checked, the LLM uses captions extracted from key passages, instead of all the passages, in the highest ranked documents.|\n|Suggest follow-up questions|Have the chat app suggest follow-up questions based on the answer.|\n|Retrieval mode|**Vectors + Text** means that the search results are based on the text of the documents and the embeddings of the documents. **Vectors** means that the search results are based on the embeddings of the documents. **Text** means that the search results are based on the text of the documents.|\n|Stream chat completion responses|Stream response instead of waiting until the complete answer is available for a response.|\n\nThe following steps walk you through the process of changing the settings.\n\n1. In the browser, select the **Developer Settings** tab.\n1. Check the **Use query-contextual summaries instead of whole summaries** checkbox and ask the same question again.\n\n    ```\n    What happens if the rental doesn't fit the description?\n    ```\n\n    The chat returned with a more concise answer.\n\n## Clean up resources\n\n### Clean up Azure resources\n\nThe Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\nDelete the Azure resources and remove the source code using the following Azure Developer CLI command:\n\n```bash\nazd down --purge\n```\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running Codespaces sourced from the [`Azure-Samples/azure-search-openai-javascript`](https://github.com/Azure-Samples/azure-search-openai-javascript) GitHub repository.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-template/github-codespace-dashboard.png\" alt-text=\"Screenshot of all the running Codespaces including their status and templates.\":::\n\n1. Open the context menu for the codespace and then select **Delete**.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-template/github-codespace-delete.png\" alt-text=\"Screenshot of the context menu for a single codespace with the delete option highlighted.\":::\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\n1. Open the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen Folder Locally**.\n\n    :::image type=\"content\" source=\"../media/get-started-app-chat-template/reopen-local-command-palette.png\" alt-text=\"Screenshot of the Command Palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. You can always delete the container instance, container image, and volumes from Docker to free up more space on your local machine.\n\n---\n\n## Get help\n\nThis sample repository offers [troubleshooting information](https://github.com/Azure-Samples/azure-search-openai-javascript/tree/main#troubleshooting).\n\nIf your issued isn't addressed, log your issue to the repository's [Issues](https://github.com/Azure-Samples/azure-search-openai-javascript/issues).\n\n## Next steps\n\n* [Get the source code for the sample used in this article](https://github.com/Azure-Samples/azure-search-openai-javascript)\n* [Build a chat app with Azure OpenAI](https://aka.ms/azai/chat) best practice solution architecture\n* [Access control in Generative AI Apps with Azure AI Search](https://techcommunity.microsoft.com/t5/azure-ai-services-blog/access-control-in-generative-ai-applications-with-azure/ba-p/3956408)\n* [Build an Enterprise ready OpenAI solution with Azure API Management](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/build-an-enterprise-ready-azure-openai-solution-with-azure-api/bc-p/3935407)\n* [Outperforming vector search with hybrid retrieval and ranking capabilities](https://techcommunity.microsoft.com/t5/azure-ai-services-blog/azure-cognitive-search-outperforming-vector-search-with-hybrid/ba-p/3929167)\n- Learn more about how AZD is used in this template:\n    - [Tech community blog post](https://techcommunity.microsoft.com/blog/azuredevcommunityblog/kickstart-projects-with-azd-templates/4295235?WT.mc_id=javascript-155021-juliamuiruri)\n    - [Reactor video series](https://www.youtube.com/watch?v=sp4_cWnlNQs&list=PLmsFUfdnGr3zzLIPdJsfdSwymIwOsyQ9Z&index=1)\n"
  },
  {
    "path": "articles/javascript/ai/includes/get-started-securing-your-ai-app/clean-up-resources.md",
    "content": "---\nms.custom: devx-track-js, devx-track-ts, \nms.topic: include\nms.date: 03/13/2026\n# Used as part of /developer/ai/get-started-securing-your-ai-app\n---\n1. Sign into the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running Codespaces sourced from the [`Azure-Samples/openai-chat-app-quickstart-javascript`](https://github.com/Azure-Samples/openai-chat-app-quickstart-javascript) GitHub repository.\n\n1. Open the context menu for the codespace and then select **Delete**.\n"
  },
  {
    "path": "articles/javascript/ai/includes/get-started-securing-your-ai-app/explore-sample-code.md",
    "content": "---\nms.custom: devx-track-js, devx-track-ts, \nms.topic: include\nms.date: 03/13/2026\n# Used as part of /developer/ai/get-started-securing-your-ai-app\n---\n\nWhile OpenAI and Azure OpenAI Service rely on a [openai](https://www.npmjs.com/package/openai) (common JavaScript client library), small code changes are needed when using Azure OpenAI endpoints. Let's see how this sample configures keyless authentication with Microsoft Entra ID and communicates with Azure OpenAI.\n\n### Keyless authentication for each environment\n\nThe Azure Identity client library provides credential classes that implement the Azure Core library's [`TokenCredential`](/javascript/api/@azure/identity/tokencredential) protocol. A credential represents a distinct authentication flow for acquiring an access token from Microsoft Entra ID. These credentials can be chained together using a [ChainedTokenCredential](../../../sdk/authentication/credential-chains.md) to form an ordered sequence of authentication mechanisms to be attempted. This allows you to deploy the same code in both production and local development environments.\n\n### Configure authentication with managed identity\n\nIn this sample, the `./src/azure-authentication.ts` provides several functions to provide keyless authentication to Azure OpenAI.\n\nThe first function, `getChainedCredential()`, returns the first valid Azure credential found in the chain. \n\n```typescript\nfunction getChainedCredential() {\n\n    return new ChainedTokenCredential(\n        new ManagedIdentityCredential(process.env.AZURE_CLIENT_ID!), \n        new AzureDeveloperCliCredential({\n            tenantId: process.env.AZURE_TENANT_ID! ? process.env.AZURE_TENANT_ID! : undefined\n          })\n    );\n}\n```\n* [ManagedIdentityCredential](/javascript/api/@azure/identity/managedidentitycredential) is attempted first. It's set up with the AZURE_CLIENT_ID environment variable in the production runtime and is capable of authenticating via user-assigned managed identity.\n* [AzureDeveloperCliCredential](/javascript/api/@azure/identity/azuredeveloperclicredential) is attempted second. It's set up when a developer signs in with the Azure Developer CLI by using `azd auth login`.\n\n>[!TIP]\n>The order of the credentials is important, as the first valid Microsoft Entra access token is used. For more information, check out the [ChainedTokenCredential Overview](/javascript/api/@azure/identity/tokencredential) article.\n\n### Get bearer token for OpenAI\n\nThe second function in `./src/azure-authentication.ts` is `getTokenProvider()`, which returns a callback that provides a bearer token scoped to the **Azure Cognitive Services** endpoint.\n\n```typescript\nfunction getTokenProvider(): () => Promise<string> {\n    const credential  = getChainedCredential();\n    const scope = \"https://cognitiveservices.azure.com/.default\";\n    return getBearerTokenProvider(credential, scope);\n}\n```\n\nThe preceding code snippet uses [`getBearerTokenProvider`](/javascript/api/@azure/identity) to take the credential and the scope, then returns a callback that provides a bearer token. \n\n### Create authenticated Azure OpenAI client\n\nThe third function in `./src/azure-authentication.ts` is `getOpenAiClient()`, which returns the Azure OpenAI client. \n\n```typescript\nexport function getOpenAiClient(): AzureOpenAI | undefined{\n    try {\n\n        if (!process.env.AZURE_OPENAI_ENDPOINT) {\n            throw new Error(\"AZURE_OPENAI_ENDPOINT is required for Azure OpenAI\");\n        }\n        if (!process.env.AZURE_OPENAI_CHAT_DEPLOYMENT) {\n            throw new Error(\"AZURE_OPENAI_CHAT_DEPLOYMENT is required for Azure OpenAI\");\n        }\n\n        const options = { \n            azureADTokenProvider: getTokenProvider(), \n            deployment: process.env.AZURE_OPENAI_CHAT_DEPLOYMENT!, \n            apiVersion: process.env.AZURE_OPENAI_API_VERSION! || \"2024-02-15-preview\",\n            endpoint: process.env.AZURE_OPENAI_ENDPOINT!\n        }\n\n        // Create the Asynchronous Azure OpenAI client\n        return new AzureOpenAI (options);\n\n    } catch (error) {\n        console.error('Error getting Azure OpenAI client: ', error);\n    }\n}\n```\n\nThis code takes the options, including the correctly scoped token, and creates the `AzureOpenAI` client\n\n## Stream chat answer with Azure OpenAI \n\nUse the following Fastify route handler in `./src/openai-chat-api.ts` to send a message to Azure OpenAI and stream the response. \n\n```typescript\nimport { FastifyReply, FastifyRequest } from 'fastify';\nimport { AzureOpenAI } from \"openai\";\nimport { getOpenAiClient } from './azure-authentication.js';\nimport { ChatCompletionChunk, ChatCompletionMessageParam } from 'openai/resources/chat/completions';\n\ninterface ChatRequestBody {\n    messages: ChatCompletionMessageParam [];\n  }\n\nexport async function chatRoute (request: FastifyRequest<{ Body: ChatRequestBody }>, reply: FastifyReply) {\n\n    const requestMessages: ChatCompletionMessageParam[] = request?.body?.messages;\n    const openaiClient: AzureOpenAI | undefined = getOpenAiClient();\n\n    if (!openaiClient) {\n      throw new Error(\"Azure OpenAI client is not configured\");\n    }\n\n    const allMessages = [\n      { role: \"system\", content: \"You are a helpful assistant.\"},\n      ...requestMessages\n    ] as ChatCompletionMessageParam [];\n\n    const chatCompletionChunks = await openaiClient.chat.completions.create({\n      // Azure Open AI takes the deployment name as the model name\n      model: process.env.AZURE_OPENAI_CHAT_DEPLOYMENT_MODEL || \"gpt-4o-mini\",\n      messages: allMessages,\n      stream: true\n\n    })\n    reply.raw.setHeader('Content-Type', 'text/html; charset=utf-8');\n    reply.raw.setHeader('Cache-Control', 'no-cache');\n    reply.raw.setHeader('Connection', 'keep-alive');\n    reply.raw.flushHeaders();\n\n    for await (const chunk of chatCompletionChunks as AsyncIterable<ChatCompletionChunk>) {\n      for (const choice of chunk.choices) {\n        reply.raw.write(JSON.stringify(choice) + \"\\n\")\n      }\n    }\n\n    reply.raw.end()\n\n}\n```\n\nThe function gets the chat conversation, including any previous messages, and sends them to Azure OpenAI. As the stream chunks are returned from Azure OpenAI, the are sent to the client. "
  },
  {
    "path": "articles/javascript/ai/includes/get-started-securing-your-ai-app/get-help.md",
    "content": "---\nms.custom: devx-track-js, devx-track-ts, \nms.topic: include\nms.date: 03/13/2026\n# Used as part of /developer/ai/get-started-securing-your-ai-app\n---\n\nIf your issue isn't addressed, log your issue to the repository's [Issues](https://github.com/Azure-Samples/openai-chat-app-quickstart-javascript/issues).\n\n> [!div class=\"nextstepaction\"]\n> [Get started with the chat using your own data sample for JavaScript](../../get-started-app-chat-template.md)"
  },
  {
    "path": "articles/javascript/ai/includes/get-started-securing-your-ai-app/open-development-environment.md",
    "content": "---\nms.custom: devx-track-js, devx-track-ts, \nms.topic: include\nms.date: 03/13/2026\n# Used as part of /developer/ai/get-started-securing-your-ai-app\n---\n\nUse the following steps to create a new GitHub Codespace on the `main` branch of the [`Azure-Samples/openai-chat-app-quickstart-javascript`](https://github.com/Azure-Samples/openai-chat-app-quickstart-javascript) GitHub repository.\n\n1. Right-click on the following button, and select _Open link in new window_. This action allows you to have the development environment and the documentation available for review.\n\n [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/openai-chat-app-quickstart-javascript)\n\n1. On the **Create codespace** page, review and then select **Create new codespace**\n\n    :::image type=\"content\" source=\"github-create-codespace.png\" lightbox=\"github-create-codespace.png\" alt-text=\"Screenshot of the confirmation screen before creating a new codespace.\":::\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. Sign in to Azure with the Azure Developer CLI in the terminal at the bottom of the screen.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\nThe remaining tasks in this article take place in the context of this development container.\n"
  },
  {
    "path": "articles/javascript/ai/includes/get-started-securing-your-ai-app/visual-studio-code-setup.md",
    "content": "---\nms.custom: devx-track-js, devx-track-ts, \nms.topic: include\nms.date: 03/13/2026\n# Used as part of /developer/ai/get-started-securing-your-ai-app\n---\n\n1. Create a new local directory on your computer for the project.\n\n    ```shell\n    mkdir my-secure-chat-app\n    ```\n\n1. Open the directory in Visual Studio Code.\n\n    ```shell\n    code my-secure-chat-app\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n\n1. Run the following AZD command to bring the GitHub repository to your local computer.\n\n    ```azdeveloper\n    azd init -t openai-chat-app-quickstart-javascript\n    ```\n\n1. Open the Command Palette, search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before continuing.\n\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```azdeveloper\n    azd auth login\n    ```\n\n1. The remaining exercises in this project take place in the context of this development container."
  },
  {
    "path": "articles/javascript/ai/langchain-agent-on-azure.md",
    "content": "---\ntitle: Build a LangChain.js agent for Azure\ndescription: Create a LangChain.js agent with LangChain.js that queries HR documents using Azure AI Search and Azure OpenAI for intelligent document search and question answering.\nms.date: 12/08/2025\nms.author: diberry\nauthor: diberry\nms.topic: tutorial\nms.custom: devx-track-ts, devx-track-ts-ai\n#customer intent: As a JavaScript developer, I want to use LangChain with Azure so that I can build an agentic workflow.\n---\n\n# Tutorial: Build a LangChain.js agent with Azure AI Search\n\nBuild an intelligent HR assistant using LangChain.js and Azure services. This agent helps employees at the fictitious NorthWind company find answers to human resources questions by searching through company documentation.\n\nYou'll use [Azure AI Search](/azure/search/) to find relevant documents and [Azure OpenAI](/azure/ai-foundry/foundry-models/concepts/models-sold-directly-by-azure) to generate accurate answers. The LangChain.js framework handles the complexity of agent orchestration, letting you focus on your specific business requirements.\n\nWhat you'll learn:\n\n> [!div class=\"checklist\"]\n> * Deploy Azure resources using Azure Developer CLI\n> * Build a LangChain.js agent that integrates with Azure services\n> * Implement retrieval-augmented generation (RAG) for document search\n> * Test and debug your agent locally and in Azure\n\nBy the end of this tutorial, you have a working REST API that answers HR questions using your company's documentation.\n\n## Architecture overview\n\n:::image type=\"content\" source=\"./media/langchain-agent-on-azure/agent-workflow.png\" alt-text=\"Screenshot of diagram illustrating the LangChain.js agent workflow and its decision branch to use HR documentation for answering questions.\":::\n\nNorthWind relies on two data sources: \n- HR documentation accessible to _all_ employees \n- Confidential HR database containing sensitive employee data. \n\nThis tutorial focuses on building a LangChain.js agent that determines whether an employee's question can be answered using the public HR documents. If so, the LangChain.js agent provides the answer directly.\n\n## Prerequisites\n\nTo use this sample in [Codespace](https://codespaces.new/Azure-Samples/azure-typescript-langchainjs) or local development container, including building and running the LangChain.js agent, you need the following:\n\n* An active Azure account. [Create an account for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) if you don't have one.\n\nIf you run the sample code locally without a development container, you also need:\n\n* [Node.js LTS](https://nodejs.org/) installed on your system.\n* [TypeScript](https://www.typescriptlang.org/) for writing and compiling TypeScript code.\n* [Azure Developer CLI (azd)](/azure/developer/azure-developer-cli) installed and configured.\n* [LangChain.js](https://www.npmjs.com/package/langchain) library for building the agent.\n* Optional: [LangSmith](https://www.langchain.com/langsmith) for monitoring AI usage. You need the project name, key, and endpoint.\n* Optional: [LangGraph Studio](https://studio.langchain.com) for debugging LangGraph chains and LangChain.js agents.\n\n## Azure resources\n\nThe following Azure resources are required. They are created for you in this article using the [Azure Developer CLI](/azure/developer/azure-developer-cli) and [Bicep](/azure/azure-resource-manager/bicep/) templates using [Azure Verified Modules(AVM)](https://azure.github.io/Azure-Verified-Modules/). The resources are created with both passwordless and key access for learning purposes. This tutorial uses your local developer account for passwordless authentication:\n\n* [Managed identity](/azure/developer/intro/passwordless-overview) for passwordless authentication to Azure services.\n* [Azure Container Registry](/azure/container-registry/) to store the Docker image for the Node.js Fastify API server.\n* [Azure Container App](/azure/container-apps/) to host the Node.js Fastify API server.\n* [Azure AI Search resource](/azure/search/search-what-is-azure-search) for vector search.\n* [Azure OpenAI resource](/azure/ai-services/openai/) with the following models:\n  * An embeddings model like `text-embedding-3-small`.\n  * A large language model (LLM) like `'gpt-4.1-mini`.\n\n:::image type=\"content\" source=\"./media/langchain-agent-on-azure/azure-architecture-ai-rag-search-vector-store.png\" lightbox=\"./media/langchain-agent-on-azure/azure-architecture-ai-rag-search-vector-store.png\" alt-text=\"Azure architecture diagram showing RAG implementation with Container Apps, OpenAI, AI Search, Container Registry, and Managed Identity components with their connections.\":::\n\n## Agent architecture\n\nThe LangChain.js framework provides a decision flow for building intelligent agents as a LangGraph. In this tutorial, you create a LangChain.js agent that integrates with Azure AI Search and Azure OpenAI to answer HR-related questions. The agent's architecture is designed to:\n\n* Determine if a question is relevant to general HR documentation available to _all_ employees.\n* Retrieve relevant documents from Azure AI Search based on the user query.\n* Use Azure OpenAI to generate an answer based on the retrieved documents and LLM model.\n\n**Key Components**:\n\n- **Graph structure**: The LangChain.js agent is represented as a graph, where:\n   - **Nodes** perform specific tasks, such as decision-making or retrieving data.\n   - **Edges** define the flow between nodes, determining the sequence of operations.\n\n- **Azure AI Search integration**:\n  - Uses an embeddings model to create vectors.\n  - Inserts HR documents (*.md, *.pdf) into vector store. The [documents](https://github.com/Azure-Samples/azure-typescript-langchainjs/tree/main/packages-v1/langgraph-agent/data) include:\n    -  Company information\n    -  Employee handbook\n    -  Benefits handbook\n    -  Employee role library\n  -  Retrieves relevant documents based on the user prompt.\n\n* **Azure OpenAI integration**:\n   * Uses a large language model to:\n     * Determines if a question is answerable from impersonal HR documents.\n     * Generates answer with prompt using context from documents and user question.\n\nThe following table has examples of user questions which are and aren't relevant and answerable from general Human resources documents:\n\n| Question | Relevant | Explanation |\n|----------|----------|----------------------------|\n| `Does the NorthWind Health Plus plan cover eye exams?` | Yes | The HR documents, such as the employee handbook, should provide an answer. |\n| `How much of my perks + benefits have I spent?` | No | This question requires access to confidential employee data, which is outside the scope of this agent. |\n\nBy using the LangChain.js framework, you avoid much of the agentic boilerplate code typically required for agents and Azure service integration, allowing you to focus on your business needs.\n\n## Clone the sample code repository\n\nIn a new directory, clone the sample code repository and change to the new directory:\n\n```console\ngit clone https://github.com/Azure-Samples/azure-typescript-langchainjs.git\ncd azure-typescript-langchainjs\n```\n\nThis sample provides the code you need to create secure Azure resources, build the LangChain.js agent with Azure AI Search and Azure OpenAI, and use the agent from a Node.js Fastify API server.\n\n## Authenticate to the Azure CLI and Azure Developer CLI \n\nSign in to Azure with the Azure Developer CLI, create the Azure resources, and deploy the source code. Because the deployment process uses both Azure CLI and Azure Developer CLI, sign into Azure CLI, then configure the Azure Developer CLI to use your authentication from Azure CLI:\n\n```azdeveloper\naz login\nazd config set auth.useAzCliAuth true\n```\n\n## Create resources and deploy code with Azure Developer CLI\n\nBegin the deployment process by running the `azd up` command:\n\n```azdeveloper\nazd up\n```\n\nDuring the `azd up` command, answer the questions:\n- **New environment name**: enter a unique environment name such as `langchain-agent`. This environment name is used as part of the Azure resource group.\n- **Select an Azure Subscription**: select the subscription where the resources are created.\n- **Select a region**: such as `eastus2`.\n\nThe deployment takes approximately 10-15 minutes. The Azure Developer CLI orchestrates the process using phases and hooks defined in the [`azure.yaml`](https://github.com/Azure-Samples/azure-typescript-langchainjs/blob/main/azure.yaml) file:\n\n**Provision phase** (equivalent to `azd provision`):\n- Creates Azure resources defined in [`infra/main.bicep`](https://github.com/Azure-Samples/azure-typescript-langchainjs/blob/main/infra/main.bicep): \n    - Azure Container App\n    - OpenAI\n    - AI Search\n    - [Container Registry](/azure/container-registry/)\n    - [Managed identity](/azure/developer/intro/passwordless-overview)\n- **Post-provision hook**: Checks if the Azure AI Search index `northwind` already exists\n  - If the index doesn't exist: runs `npm install` and `npm run load_data` to upload HR documents using LangChain.js PDF loader and embedding client\n  - If the index exists: skips data loading to avoid duplicates (you can manually reload by deleting the index or running `npm run load_data`)\n**Deploy phase** (equivalent to `azd deploy`):\n- **Pre-deploy hook**: Builds the Docker image for the Fastify API server and pushes it to Azure Container Registry\n- Deploys the containerized API server to Azure Container Apps\n\nWhen deployment completes, environment variables and resource information are saved to the `.env` file in the repository root. You can view the resources in the [Azure portal](https://portal.azure.com).\n\nThe resources are created with both passwordless and key access for learning purposes. This introductory tutorial uses your local developer account for passwordless authentication. For production applications, use only passwordless authentication with managed identities. Learn more about [passwordless authentication](/azure/developer/intro/passwordless-overview).\n\n## Use the sample code locally\n\nNow that the Azure resources are created, you can run the LangChain.js agent locally.\n\n## Install dependencies\n\n1. Install the Node.js packages for this project. \n\n    ```console\n    npm install \n    ```\n\n    This command installs the dependencies defined in the two `package.json` files in the `packages-v1` directory, including:\n\n    - [`./packages-v1/server-api`](https://github.com/Azure-Samples/azure-typescript-langchainjs/blob/main/packages-v1/server-api/package.json): \n        - Fastify for the web server\n    - [`./packages-v1/langgraph-agent`](https://github.com/Azure-Samples/azure-typescript-langchainjs/blob/main/packages-v1/langgraph-agent/package.json): \n        - LangChain.js for building the agent\n        - Azure SDK client library [`@azure/search-documents`](https://www.npmjs.com/package/@azure/search-documents) for integrating with Azure AI Search resource. The reference documentation is [here](/javascript/api/@azure/search-documents/).\n\n1. Build the two packages: the API server and the AI agent.\n\n    ```console\n    npm run build\n    ```\n\n    This command creates a link between the two packages so the API server can call the AI agent.\n\n\n## Run the API server locally\n\nThe Azure Developer CLI created the required Azure resources and configured the environment variables in the root `.env` file. This configuration included a post provision hook to upload the data into the vector store. Now, you can run the Fastify API server that hosts the LangChain.js agent. Start the Fastify API server.\n\n```console\nnpm run dev\n```\n\nThe server starts and listens on port 3000. You can test the server by navigating to [`http://localhost:3000`] in your web browser. You should see a welcome message indicating that the server is running.\n\n## Use the API to ask questions\n\nYou can use a tool like [REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) or `curl` to send a POST request to the `/ask` endpoint with a JSON body containing your question.\n\nRest client queries are available in the [`packages-v1/server-api/http`](https://github.com/Azure-Samples/azure-typescript-langchainjs/tree/main/packages-v1/server-api/http) directory.\n\nExample using `curl`:\n\n```console\ncurl -X POST http://localhost:3000/answer -H \"Content-Type: application/json\" -d \"{\\\"question\\\": \\\"Does the NorthWind Health Plus plan cover eye exams?\\\"}\"\n```\n\nYou should receive a JSON response with the answer from the LangChain.js agent.\n\n```console\n{\n  \"answer\": \"Yes, the NorthWind Health Plus plan covers eye exams. According to the Employee Handbook, employees enrolled in the Health Plus plan are eligible for annual eye exams as part of their vision benefits.\"\n}\n```\n\nSeveral example questions are available in the [`packages-v1/server-api/http`](https://github.com/Azure-Samples/azure-typescript-langchainjs/tree/main/packages-v1/server-api/http) directory. Open the files in [Visual Studio Code](https://code.visualstudio.com/) with [REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) to test them quickly.\n\n\n## Understand the application code\n\nThis section explains how the LangChain.js agent integrates with Azure services. The repository's application is organized as an npm workspace with two main packages:\n\n```console\nProject Root\n│\n├── packages-v1/\n│   │\n│   ├── langgraph-agent/                    # Core LangGraph agent implementation\n│   │   ├── src/\n│   │   │   ├── azure/                      # Azure service integrations\n│   │   │   │   ├── azure-credential.ts     # Centralized auth with DefaultAzureCredential\n│   │   │   │   ├── embeddings.ts           # Azure OpenAI embeddings + PDF loading + rate limiting\n│   │   │   │   ├── llm.ts                  # Azure OpenAI chat completion (key-based & passwordless)\n│   │   │   │   └── vector_store.ts         # Azure AI Search vector store + indexing + similarity search\n│   │   │   │\n│   │   │   ├── langchain/                  # LangChain agent logic\n│   │   │   │   ├── node_get_answer.ts      # RAG: retrieves docs + generates answers\n│   │   │   │   ├── node_requires_hr_documents.ts  # Determines if HR docs needed\n│   │   │   │   ├── nodes.ts                # LangGraph node definitions + state management\n│   │   │   │   └── prompt.ts               # System prompts + conversation templates\n│   │   │   │\n│   │   │   └── scripts/                    # Utility scripts\n│   │   │       └── load_vector_store.ts    # Uploads PDFs to Azure AI Search\n│   │   │\n│   │   └── data/                           # Source documents (PDFs) for vector store\n│   │\n│   └── server-api/                         # Fastify REST API server\n│       └── src/\n│           └── server.ts                   # HTTP server with /answer endpoint\n│\n├── infra/                                  # Infrastructure as Code\n│   └── main.bicep                          # Azure resources: Container Apps, OpenAI, AI Search, ACR, managed identity\n│\n├── azure.yaml                              # Azure Developer CLI config + deployment hooks\n├── Dockerfile                              # Multi-stage Docker build for containerized deployment\n└── package.json                            # Workspace configuration + build scripts\n```\n\n\n**Key architectural decisions:**\n- **Monorepo structure**: [npm workspaces](https://docs.npmjs.com/cli/v7/using-npm/workspaces) allow shared dependencies and linked packages\n- **Separation of concerns**: Agent logic (`langgraph-agent`) is independent from API server (`server-api`)\n- **Centralized authentication**: Files in `./langgraph-agent/src/azure` handle both key-based and passwordless auth and Azure service integration\n\n### Authentication to Azure Services\n\nThe application supports both key-based and passwordless authentication methods, controlled by the `SET_PASSWORDLESS` environment variable. The [DefaultAzureCredential](/javascript/api/@azure/identity/defaultazurecredential) API from the [Azure Identity library](/javascript/api/overview/azure/identity-readme) is used for passwordless authentication, allowing the application to run seamlessly in local development and Azure environments. You can see this authentication in the following [code snippet](https://github.com/Azure-Samples/azure-typescript-langchainjs/tree/main/packages-v1/langgraph-agent/src/azure/azure-credential.ts):\n\n:::code language=\"typescript\" source=\"~/../azure-typescript-langchainjs/packages-v1/langgraph-agent/src/azure/azure-credential.ts\":::\n\nWhen using third-party libraries like LangChain.js or the OpenAI library to access Azure OpenAI, you need a **token provider function** instead of passing a credential object directly. The [`getBearerTokenProvider`](/javascript/api/@azure/identity/#@azure-identity-getbearertokenprovider) function from the Azure Identity library solves this problem by creating a token provider that automatically fetches and refreshes OAuth 2.0 bearer tokens for a specific Azure resource scope (for example, `\"https://cognitiveservices.azure.com/.default\"`). You configure the scope once during setup, and the token provider handles all token management automatically. This approach works with any Azure Identity library credential, including managed identity and Azure CLI credentials. While Azure SDK libraries accept `DefaultAzureCredential` directly, third-party libraries like LangChain.js require this token provider pattern to bridge the authentication gap.\n\n### Azure AI Search integration\n\nThe Azure AI Search resource stores document embeddings and enables semantic search for relevant content. The application uses LangChain's `AzureAISearchVectorStore` to manage the vector store without you having to define the index schema.\n\nThe vector store is created with configuration for both admin (write) and query (read) operations so that document loading and querying can use different configurations. This is important whether you are using keys or passwordless authentication with managed identities.\n\nThe Azure Developer CLI deployment includes a post-deployment hook that uploads the documents to the vector store with LangChain.js PDF loader and embedding client. This post-deployment hook is the last step of the `azd up` command after the Azure AI Search resource is created. The document loading script uses batching and retry logic to handle service rate limits. \n\n:::code language=\"yaml\" source=\"~/../azure-typescript-langchainjs/azure.yaml\" range=\"130-157\":::\n\nUse the root `.env` file is created by the Azure Developer CLI, you can authenticate to the Azure AI Search resource and create the **AzureAISearchVectorStore** client:\n\n:::code language=\"typescript\" source=\"~/../azure-typescript-langchainjs/packages-v1/langgraph-agent/src/azure/vector_store.ts\" id=\"AZURE_AI_SEARCH_AUTH\":::\n\nWhen you query, the vector store converts the user's query into an embedding, searches for documents with similar vector representations, and returns the most relevant chunks. \n\n:::code language=\"typescript\" source=\"~/../azure-typescript-langchainjs/packages-v1/langgraph-agent/src/azure/vector_store.ts\" id=\"AI_SEARCH_QUERY_FUNCTIONS\":::\n\nBecause the vector store is built on top of LangChain.js, it abstracts away the complexity of directly interacting with the vector store. Once you learn the LangChain.js vector store interface, you can easily switch to other vector store implementations in the future.\n\n### Azure OpenAI integration\n\nThe application uses Azure OpenAI for both embeddings and large language model (LLM) capabilities. The `AzureOpenAIEmbeddings` class from LangChain.js is used to generate embeddings for documents and queries. Once you create the embeddings client, LangChain.js uses it to create the embeddings.\n\n### Azure OpenAI integration for embeddings\n\nUse the root `.env` file created by the Azure Developer CLI to authenticate to the Azure OpenAI resource and create the **AzureOpenAIEmbeddings** client:\n\n:::code language=\"typescript\" source=\"~/../azure-typescript-langchainjs/packages-v1/langgraph-agent/src/azure/embeddings.ts\" id=\"AZURE_OPENAI_EMBEDDINGS_AUTH\":::\n\n:::code language=\"typescript\" source=\"~/../azure-typescript-langchainjs/packages-v1/langgraph-agent/src/azure/embeddings.ts\" id=\"AZURE_OPENAI_EMBEDDINGS_FUNCTION\":::\n\n### Azure OpenAI integration for LLM\n\nUse the root `.env` file created by the Azure Developer CLI to authenticate to the Azure OpenAI resource and create the **AzureChatOpenAI** client:\n\n:::code language=\"typescript\" source=\"~/../azure-typescript-langchainjs/packages-v1/langgraph-agent/src/azure/llm.ts\" id=\"AZURE_OPENAI_LLM_AUTH\":::\n\nThe application uses the `AzureChatOpenAI` class from LangChain.js `@langchain/openai` to interact with Azure OpenAI models. \n\n:::code language=\"typescript\" source=\"~/../azure-typescript-langchainjs/packages-v1/langgraph-agent/src/azure/llm.ts\" id=\"AZURE_OPENAI_CHAT_FUNCTION\":::\n\n## LangGraph agent workflow\n\nThe agent uses LangGraph to define a decision workflow that determines whether a question can be answered using HR documents.\n\n**Graph structure**:\n\n:::code language=\"typescript\" source=\"~/../azure-typescript-langchainjs/packages-v1/langgraph-agent/src/graph.ts\" :::\n\n\nThe workflow consists of the following steps:\n\n- **Start**: User submits a question.\n- **requires_hr_documents node**: LLM determines if the question is answerable from general HR documents.\n- **Conditional routing**: \n   - If yes, then proceeds to `get_answer` node.\n   - If no, then returns message that question requires personal HR data.\n- **get_answer node**: Retrieves documents and generates answer.\n- **End**: Returns answer to user.\n\nThis relevance check is important because not all HR questions can be answered from general documents. Personal questions like \"How much PTO do I have?\" require access to employee databases that contain individual employee data. By checking relevance first, the agent avoids hallucinating answers for questions that need personal information it doesn't have access to.\n\n### Decide if the question requires HR documents\n\nThe `requires_hr_documents` node uses an LLM to determine if the user's question can be answered using general HR documents. It uses a prompt template that instructs the model to respond with `YES` or `NO` based on the question's relevance. It returns the answer in a structured message, which can be passed along the workflow. The next node uses this response to route the workflow to either the `END` or the `ANSWER_NODE`.\n\n:::code language=\"typescript\" source=\"~/../azure-typescript-langchainjs/packages-v1/langgraph-agent/src/langchain/node_requires_hr_documents.ts\":::\n\n### Get the required HR documents\n\nOnce it is determined that the question requires HR documents, the workflow uses `getAnswer` to retrieve the relevant documents from the vector store, add them to the _context_ of the prompt and pass the entire prompt to the LLM. \n\n:::code language=\"typescript\" source=\"~/../azure-typescript-langchainjs/packages-v1/langgraph-agent/src/langchain/node_get_answer.ts\":::\n\nIf no relevant documents are found, the agent returns a message indicating that it couldn't find an answer in the HR documents.\n\n## Troubleshooting\n\nFor any issues with the procedure, create an issue on the [sample code repository](https://github.com/Azure-Samples/azure-typescript-langchainjs/issues)\n\n## Clean up resources\n\nYou can delete the resource group, which holds the Azure AI Search resource and the Azure OpenAI resource or use the Azure Developer CLI to immediately delete all resources created by this tutorial.\n\n```azdeveloper\nazd down --purge\n```\n\n## Related content\n\n* [Get started with Serverless AI Chat with RAG using LangChain.js](./get-started-app-chat-template-langchainjs.md)\n\n"
  },
  {
    "path": "articles/javascript/ai/media/langchain-agent-on-azure/mermaid/azure-architecture-ai-rag-search-vector-store.mmd",
    "content": "graph TB\n    User[User sends HTTP POST]\n    \n    subgraph Azure[\"Azure Infrastructure\"]\n        subgraph ACA[\"Azure Container Apps\"]\n            API[Fastify API Server<br/>LangGraph Agent]\n        end\n        \n        subgraph AOAI[\"Azure OpenAI Resource\"]\n            Models[gpt-4o-mini LLM<br/>text-embedding-3-small]\n        end\n        \n        subgraph AIS[\"Azure AI Search Resource\"]\n            VectorStore[northwind Index<br/>Vector Store]\n        end\n        \n        subgraph ACR[\"Azure Container Registry\"]\n            Image[Docker Image]\n        end\n        \n        subgraph MI[\"Managed Identity\"]\n            Auth[Passwordless Authentication]\n        end\n    end\n    \n    User -->|Question| API\n    API -->|Chat completion & embeddings| Models\n    API -->|Vector search| VectorStore\n    API -->|JSON Response| User\n    \n    Image -.->|Deploy container| ACA\n    Auth -.->|Authenticates| ACA\n    Auth -.->|Authenticates| AOAI\n    Auth -.->|Authenticates| AIS\n    Auth -.->|Authenticates| ACR\n    \n    DataLoad[HR Documents<br/>PDF files] -.->|azd up post-provision<br/>Load & embed| VectorStore\n    \n    \n    linkStyle 0 stroke:#0078d4,stroke-width:2px\n    linkStyle 1 stroke:#2e7d32,stroke-width:2px\n    linkStyle 2 stroke:#f57c00,stroke-width:2px\n    linkStyle 3 stroke:#0078d4,stroke-width:2px\n\n    style ACA fill:#005a9e ,color:#fff\n    style AOAI fill:#005a9e \n    style AIS fill:#005a9e \n    style ACR fill:#005a9e \n    style MI fill:#ff8c00 "
  },
  {
    "path": "articles/javascript/azure-sdk-library-package-index.md",
    "content": "---\ntitle: Azure SDK Libraries for JavaScript\ndescription: Listing of the package names, NPM links, docs links, and source code links for all libraries in the Azure SDK for JavaScript.\nms.date: 04/21/2025\nms.topic: concept-article\nms.custom: devx-track-js, devx-track-ts\n# This page's includes are auto-updated from Azure SDK team but they aren't changing this file's date.\n---\n\n# Azure libraries packages for JavaScript\n\nThe Azure libraries for JavaScript are available for installation from [NPM](https://www.npmjs.com/) and any package managers that use the npm package registry.\n\n## Modern JavaScript/Typescript libraries\n\n[!INCLUDE [javascript-new-releases](../includes/javascript-new.md)]\n\n## All libraries\n\n[!INCLUDE [javascript-all-libraries](../includes/javascript-all.md)]\n\n## Next steps\n\nFind [reference documentation](/javascript/api/overview/azure/) for all Azure NPM packages.\n"
  },
  {
    "path": "articles/javascript/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: JavaScript\n      tocHref: /azure\n      topicHref: /azure/developer/javascript/index\n"
  },
  {
    "path": "articles/javascript/choose-nodejs-version.md",
    "content": "---\ntitle: Use correct version of Node.js for Azure\ndescription: Learn how to choose the right Node.js version for developing and deploying JavaScript applications on Azure. Understand the importance of aligning Node.js versions across local and hosting environments to ensure compatibility, stability, and optimal performance.\nms.topic: concept-article #Don't change.\nms.date: 12/10/2025\n#customer intent: As a JavaScript developer new to Azure, I want understand which version of Node.js to use for a hosting service or Azure sdk.\n---\n# Choose the right Node.js Version for Azure\n\nWhen developing JavaScript applications for Azure, it's crucial to align the versions of Node.js in your local development environment and host runtime environment. This version alignment ensures compatibility, reduces the likelihood of runtime errors, and uses the full capabilities of the Azure platform. In this article, you learn how to select the appropriate Node.js version for your Azure-hosted applications and services.\n\n## Node.js versions\n\nNode.js follows a predictable release schedule that includes both Long Term Support (LTS) and Current releases. LTS versions are designated for long-term maintenance and stability, making them ideal for production environments. These versions receive critical bug fixes, security updates, and performance improvements for an extended period, typically 30 months. Node.js uses an even/odd numbering system to distinguish between LTS and Current releases: even-numbered versions (e.g., 20, 22, 24) are LTS releases, while odd-numbered versions (e.g., 21, 23, 25) are Current releases. Current releases include the latest features and improvements but are only supported for six months, after which they transition to an LTS release if they're even-numbered. \n\nYou shouldn't use Current releases in production because the six month window can misalign with Azure hosting platform runtimes and SDKs. You will notice that the [development containers for Node.js](https://github.com/devcontainers/images/tree/main/src/javascript-node) do not offer odd-numbered/Current versions.\n\n## Prerequisites\n\nAll Azure SDKs and hosting services use [LTS versions of Node.js](https://nodejs.org/). If your application code is running on an unsupported version of Node.js, you should update your application source code to run on a currently supported LTS runtime. \n\nYou should also know which hosting service you intend to deploy to and any Azure services your deployed application uses.\n\n## Compatibility across environments\n\nOnce you know which Azure services and SDKs your application uses, ensure all environments for the application can build and run the same version of Node.js:\n\n* local development environment or development container\n* CI/CD process environment\n* Application host runtime\n* Azure SDKs\n\nFor an explanation of issues related to using different versions across your environment, see [Compatibility issues](#compatibility-issues). \n\n## Hosting services\n\n[!INCLUDE [Azure services Node.js minimum version](./includes/nodejs-runtime-for-azure-services.md)]\n\n## Azure SDKs\n\nThe Azure SDKs require Node.js LTS versions as stated in the [support policy](https://github.com/Azure/azure-sdk-for-js/blob/main/SUPPORT.md#microsoft-support-policy). There can be a brief period when the LTS versions supported by the hosting environment and the SDKs don't match, as it takes time to verify new Node.js LTS versions. Because there are usually three versions of Node.js marked as Long Term Support versions, you can usually target the middle version. This target allows you some time to test and verify your application can move to the next LTS version. \n\n### Manage multiple versions of Node.js\n\nWhen you need to manage more than one version of Node.js across your local and remote environments, we recommend:\n\n* [**Development Containers**](https://containers.dev/): Use a container with a specific Node.js version. You can manage the version of Node.js across several environments using containers. Visual Studio Code's [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) simplifies this process.\n* **NVM (Node Version Manager)**: A command-line interface to set or switch your local version of Node.js.\n\n### Download and install Node.js based on your intended use\n\nYou can download and install Node.js based on your requirements.\n\n* [Node.js Download page](https://nodejs.org/)\n* [Official Docker image](https://hub.docker.com/_/node/)\n* [Development containers](https://github.com/devcontainers/images/tree/main/src/javascript-node)\n\n## Compatibility issues\n\nHere are some common categories of compatibility issues that can arise when Node.js versions don't match across environments:\n\n- **Security Vulnerabilities**: Using an outdated version with known security vulnerabilities can expose your application to security risks.\n- **Syntax Errors**: Applications which use the latest JavaScript syntax, not supported by older Node.js versions, can cause syntax errors. These errors prevent the application from running.\n- **Deprecated APIs**: APIs which are deprecated in newer Node.js versions can still be present in older versions, leading to unexpected behavior or runtime errors if the versions aren't aligned.\n- **Performance Degradation**: Newer Node.js versions often include performance improvements. Running your application on an older version can result in slower execution times and reduced performance.\n\n- **Inconsistent Behavior**: Differences in how Node.js versions handle certain operations, such as buffer handling, event loop behavior, or module resolution, can lead to inconsistent behavior across environments.\n- **Dependency Conflicts**: Node.js modules or packages that are compatible with one version of Node.js may not be compatible with another, causing dependency conflicts and runtime errors.\n- **Build Failures**: CI/CD pipelines using a different Node.js version than the local development environment can lead to build failures, causing delays in the development and release process.\n\nBy ensuring that all environments use the same version of Node.js, you can mitigate these compatibility issues and ensure a smoother development and deployment process.\n\n## Related content\n\n- [App Service runtime support](https://github.com/Azure/app-service-linux-docs/blob/master/Runtime_Support/node_support.md)\n- [Azure SDK support policy](https://github.com/Azure/azure-sdk-for-js/blob/main/SUPPORT.md#microsoft-support-policy)\n"
  },
  {
    "path": "articles/javascript/core/configure-local-development-environment.md",
    "content": "---\ntitle: Configure your local JavaScript environment for Azure development\ndescription: How to set up a local JavaScript dev environment for working with Azure, including an editor, the Azure SDK libraries, optional tools, and the necessary credentials for library authentication.\nms.date: 03/17/2026\nms.topic: how-to\nms.custom: devx-track-js, azure-sdk-javascript-ai-text-analytics-5.0.0\n---\n\n# Configure your JavaScript develop environment for Azure\n\nWhen you create cloud applications, developers typically prefer to test code on their local workstations before deploying that code to a cloud environment like Azure. Local development gives you the advantage of a wider variety of tools along with a familiar environment.\n\nThis article provides setup instructions to create and validate a local development environment that's suitable for JavaScript with Azure.\n\n## One-time subscription creation\n\n[Azure resources](/azure/cloud-adoption-framework/ready/azure-setup-guide/organize-resources?tabs=AzureManagementGroupsAndHierarchy) are created within a subscription and resource group. \n\n:::row:::\n    :::column span=\"1\":::\n        **Type**\n    :::column-end:::\n    :::column span=\"2\":::\n        **Description**\n    :::column-end:::\n:::row-end:::\n:::row:::\n    :::column span=\"1\":::\n        Trial subscription\n    :::column-end:::\n    :::column span=\"2\":::\n        Create a _free_ [trial subscription](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n    :::column-end:::\n:::row-end:::\n:::row:::\n    :::column span=\"1\":::\n        Existing subscription\n    :::column-end:::\n    :::column span=\"2\":::\n        If you already have a subscription, access your existing subscription with:\n\n        * [Azure portal](https://portal.azure.com)\n        * [Azure CLI](/cli/azure/install-azure-cli)\n        * [Azure client libraries for JavaScript](../azure-sdk-library-package-index.md)\n        * [Visual Studio Code extensions](https://marketplace.visualstudio.com/search?term=azure&target=VSCode&category=Azure&sortBy=Relevance)\n    :::column-end:::\n:::row-end:::\n:::row:::\n    :::column span=\"1\":::\n        Across multiple subscriptions\n    :::column-end:::\n    :::column span=\"2\":::\n        If you need to manage multiple subscriptions, [learn how](/azure/governance/management-groups/create-management-group-javascript) to create a management group with JavaScript.\n    :::column-end:::\n:::row-end:::\n\n## One-time software installation\n\nAzure development with JavaScript on your local workstation, we suggest you install the following tools:\n\n|Name/Installer|Description|\n|--|--|\n|[Node.js LTS](https://nodejs.org/)|Install latest long-term support (LTS) runtime environment for local workstation development. Learn more about [selecting a version of Node.js for Azure](../choose-nodejs-version.md).|\n|[Visual Studio Code](https://code.visualstudio.com/)| Visual Studio Code gives you a great JavaScript integration and coding experience but it isn't required. You can use any code editor.|\n|[Visual Studio Code extensions](https://marketplace.visualstudio.com/search?term=azure&target=VSCode&category=Azure&sortBy=Relevance)|Install any relevant extensions for Azure services you intend to use.|\n\n### Azure hosting runtime \n\nWhen you use an Azure resource as the hosting environment for your application, such as an Azure web app or Azure Functions, [verify your local Node.js development environment runtime version of Node.js](what-is-azure-for-javascript-development.md#verify-runtime-for-javascript-apps-hosted-in-azure) matches the Azure resource runtime you plan to use.\n\n### Recommended local installations\n\nThe following common local workstation installations are recommended to help with your local development tasks.\n\n|Name|Description|\n|--|--|\n|[Azure CLI](/cli/azure/get-started-with-azure-cli)|Local or cloud-based CLI to create and use Azure resources.|\n|[Azure Developer CLI](../../azure-developer-cli/overview.md?tabs=nodejs)|Developer-centric command-line tool for building cloud apps in developer workflow.|\n|[Visual Studio Code extensions for Azure](../node-azure-tools.md) |VS Code extensions to the IDE.|\n|[Git](https://git-scm.com/downloads) or [Git for Windows](https://gitforwindows.org/)| Command-line tools for source control. You can use a different source control tool if you prefer. |\n|Docker for [Windows](https://docs.docker.com/desktop/install/windows-install/) or [Mac](https://docs.docker.com/desktop/install/mac-install/)|Use [Development containers](https://containers.dev/) for consistent development environments.|\n|Node.js LTS|[Learn more](#install-nodejs)|\n\n## Install Node.js\n\nAzure supports [LTS versions of Node.js](https://nodejs.org/). Learn more about [selecting a version of Node.js for Azure](../choose-nodejs-version.md).\n\n## One-time configuration for authentication\n\nTo use the same authentication code in local development and the remote Azure hosting environment, use the [DefaultAzureCredential](/javascript/api/overview/azure/identity-readme#defaultazurecredential). Learn more about this [managed identity](../../intro/passwordless-overview.md).\n\n## Create a resource group for your project\n\n[!INCLUDE [create resource group 3-tab](../../includes/create-resource-group.md)]\n\n\n## Working with Azure and the Azure SDK client libraries\n\nThe [Azure client libraries](../azure-sdk-library-package-index.md) are provided individually for each service. You install each library based on the Azure service you need to use.\n\nEach new project using Azure should:\n\n- Create Azure resources.\n- Install Azure client libraries from a package manager such as [NPM](https://www.npmjs.com/package/package). \n- Use [managed identity](../../intro/passwordless-overview.md) to authenticate with the Azure client library, then use configuration information to access specific services.\n\n## Securing configuration information\n\nYou have several options to store configuration information:\n\n- Azure [Key Vault](/azure/key-vault/) to create and maintain secrets, keys, and certificates that access cloud resources, which don't yet offer [managed identity access](../../intro/passwordless-overview.md).\n- [Dotenv](https://www.npmjs.com/package/dotenv) is a popular npm package to read environment variables from a `.env` file. Make sure to add the `.env` file to the `.gitignore` file so the `.env` file isn't checked into to source control. \n\n### Create environment variables\n\nTo use the Azure settings needed by the Azure SDK libraries to access the Azure cloud, set the most common values to environment variables. The following commands set the environment variables for the local workstation. \n\nIn the following examples, the client ID is the service principal ID and service principal secret.\n\n# [bash](#tab/bash)\n\n```bash\nAZURE_SUBSCRIPTION_ID=\"<REPLACE-WITH-YOUR-AZURE-SUBSCRIPTION-ID>\"\nAZURE_TENANT_ID=\"<REPLACE-WITH-YOUR-AZURE-TENANT-ID>\"\nAZURE_CLIENT_ID=\"<REPLACE-WITH-YOUR-AZURE-CLIENT-ID>\"\nAZURE_CLIENT_SECRET=\"<REPLACE-WITH-YOUR-AZURE-CLIENT-SECRET>\"\n```\n\n# [cmd](#tab/cmd)\n\n```cmd\nset AZURE_SUBSCRIPTION_ID=\"<REPLACE-WITH-YOUR-AZURE-SUBSCRIPTION-ID>\"\nset AZURE_TENANT_ID=\"<REPLACE-WITH-YOUR-AZURE-TENANT-ID>\"\nset AZURE_CLIENT_ID=\"<REPLACE-WITH-YOUR-AZURE-CLIENT-ID>\"\nset AZURE_CLIENT_SECRET=\"<REPLACE-WITH-YOUR-AZURE-CLIENT-SECRET>\"\n```\n\n---\n\nReplace the values in `<>` brackets in these commands with those of your specific environment variable.\n\n### Create `.env` file \n\nAnother common mechanism is to use the `DOTENV` NPM package to create a `.env` file for these settings. If you plan to use a `.env`, make sure to add the file to the `.gitignore` so you **don't check in** the file to source control. Add the `.env` file to git's `.ignore` file is the standard way to ensure those settings are checked into source control.\n\n## Install npm packages\n\nFor every project, we recommend that you always create a separate folder, and its own `package.json` file using the following steps:\n\n1. Open a terminal, command prompt, or bash shell and create a new folder to the project. Then move into that new folder.\n\n    ```console\n    mkdir MY-NEW-PROJECT && cd MY-NEW-PROJECT\n    ```\n\n1. Initialize the package file:\n\n    ```console\n    npm init -y\n    ```\n\n    This command creates the package.json file and initializes the minimum properties.\n\n1. Install the Azure client libraries you need, such as this authentication client library example:\n\n    ```console\n    npm install @azure/identity\n    ```\n\n## Use source control with Visual Studio Code\n\nWe recommend that you get into the habit of creating a source control repository whenever you start a project. You can do this from Visual Studio Code. \n\n1. In Visual Studio Code, select the source control icon to open the **Source Control** explorer, then select **Initialize Repository** to initialize a local Git repository:\n\n    ![Initialize git repository](../media/setup-environment/initialize-local-repository.png)\n\n1. After the repository is initialized, and you have files to store in source control, enter the message `Initial commit` and select the checkmark to create the initial commit of your source files.\n\n    ![Complete an initial commit to the repository](../media/setup-environment/initial-commit.png)\n\n1. Create a new repository on [GitHub](https://github.com/new) and copy the repository URL for the next few step. \n\n1. In the Visual Studio integrated terminal, use the following [git](https://git-scm.com/docs) command to add your remote repository to your local repository. Replace `<YOUR-ACCOUNT>` and `<REPOSITORY>` with your own values.\n\n    ```bash\n    git remote add origin https://github.com/<YOUR-ACCOUNT>/<REPOSITORY>\n    ```\n\nVisual Studio Code includes many built-in git features. For more information, see [Using Version Control in VS Code](https://code.visualstudio.com/docs/editor/versioncontrol).\n\n## Next steps\n\n* [Create and use a service principal](../sdk/authentication/local-development-environment-service-principal.md)\n* [Authenticate with the Azure modules for Node.js](../sdk/authentication/local-development-environment-service-principal.md)"
  },
  {
    "path": "articles/javascript/core/test-azure-sdk-integrated-code.md",
    "content": "---\ntitle: Azure Test Guide for JavaScript Applications\ndescription: \"Learn unit, integration, CI/CD, and AI testing strategies with Azure SDKs for JavaScript applications to ensure code quality and performance. Start testing today!\"\nms.topic: concept-article\nms.date: 06/09/2025\nms.custom: devx-track-js\nintent: As a JavaScript developer, new to Azure, you want to learn about test Azure cloud applications.\n---\n\n# Azure test guide for JavaScript applications\n\nAs a JavaScript developer new to Azure, use this Azure test guide to learn unit, integration, CI/CD, and AI testing strategies with Azure SDKs and other resources to ensure your application’s quality, performance, and reliability.\n\n## Azure Well-Architected Framework\n\nThe [Azure Well-Architected Framework](/azure/well-architected) provides a design framework for cloud applications across five pillars:\n\n* **Reliability** – Ensuring your application is resilient to failures and recovers quickly.\n* **Security** – Protecting your applications and data from threats.\n* **Performance Efficiency** – Optimizing how your system uses resources to meet requirements.\n* **Cost Optimization** – Managing costs while delivering value.\n* **Operational Excellence** – Improving processes and monitoring to deliver applications effectively.\n\nTesting strategies in this article align primarily with the [**Operational Excellence** pillar](/azure/well-architected/operational-excellence), which emphasizes automation, validation, and continuous improvement of operational processes.\n\n## Inner and outer test loops for Azure SDKs in JavaScript\n\nInner and outer test loops are foundational concepts in software testing, especially for applications deployed on cloud platforms like Azure:\n\n* The *inner loop* refers to a local environment where developers frequently run unit and integration tests during the development phase. This loop focuses on quick feedback and iteration.\n\n* The *outer loop* encompasses tests that developers run in continuous integration and continuous delivery (CI/CD) pipelines, staging, and production environments. These tests often take advantage of Azure DevOps or GitHub Actions.\n\nThese tests include end-to-end (E2E), performance, and security tests. They validate the application's behavior in environments that closely mirror or are identical to the final production environment. Efficient testing strategies use both loops to help ensure comprehensive coverage and quality assurance before and after deployment.\n\nLearn more:\n\n* [CI/CD: The what, why, and how](https://resources.github.com/devops/ci-cd/)\n* [A beginner's guide to CI/CD and automation on GitHub](https://github.blog/2022-06-03-a-beginners-guide-to-ci-cd-and-automation-on-github/)\n* [GitHub Actions starter workflows](https://github.com/actions/starter-workflows)\n* [Use cloud-hosted browsers for locally deployed apps](/azure/playwright-testing/how-to-test-local-applications)\n\n## Local and cloud-based testing with Azure SDK\n\n*Local testing without Azure* involves simulating Azure services. Use this approach to test changes quickly without incurring the costs or network latency associated with real Azure services.\n\nOn the other hand, *cloud-based testing with Azure* takes advantage of actual Azure resources to validate the application's integration, security, and performance in a cloud environment. This method is crucial for final validation in a production-like setting. It helps ensure that the application behaves as expected with live Azure services.\n\nEmulators and development containers enhance local development with Azure services differently. Emulators mimic Azure services for cost-effective, early-stage testing without Azure charges, but they might not fully replicate live service features. Development containers replicate the production environment more closely, including application dependencies and services, to help facilitate a seamless transition to production. Development containers suit complex applications but require more setup than emulators.\n\n### Emulators\n\nEmulators include:\n\n* [Azurite (Azure Storage Emulator)](https://www.npmjs.com/package/azurite)\n* [Azure Cosmos DB Emulator](/azure/cosmos-db/how-to-develop-emulator)\n* [Azure SignalR Emulator](/azure/azure-signalr/signalr-howto-emulator)\n* [Azure Event Hubs Emulator](/azure/event-hubs/overview-emulator)\n* [Azure Functions Core Tools (Local Azure Functions Runtime)](/azure/azure-functions/functions-run-local)\n* [Azure Logic Apps Standard (Local Development)](/azure/logic-apps/create-standard-workflows-visual-studio-code)\n* [Azure API Management Self-hosted Gateway](/azure/api-management/self-hosted-gateway-overview)\n* [Azure IoT Edge Runtime](/azure/iot-edge/about-iot-edge)\n\n### Development containers\n\nDevelopment containers offer a powerful alternative to using emulators for local development, especially in working with Azure services.\n\nBy running services in containers, create a local environment that closely mirrors the production environment to provide consistency across development, testing, and deployment stages. It also enhances the reliability of testing by simulating real-world conditions more accurately.\n\nConfigure containers to replicate the settings and data of Azure services. In this way, containers provide a robust platform for developing and testing applications without the overhead of connecting to live Azure services.\n\nDevelopment containers include [Azure SQL Database](https://github.com/microsoft/azuresql-devcontainers).\n\nLearn more:\n\n* [Development Container Specification](https://containers.dev/)\n* [Open Container Initiative](https://opencontainers.org/about/overview/)\n\n## AI and developer productivity tools\n\n[!INCLUDE [Azure AI developer tools](../includes/azure-ai-developer-tools.md)]\n\n## Unit tests in JavaScript\n\nUnit testing with Azure SDKs in JavaScript often uses frameworks like [Jest](https://jestjs.io/) or [Vitest](https://vitest.dev/) to isolate and test individual components or functions.\n\nFor native Node.js tests, stub Azure SDK calls manually without additional libraries by overriding methods on the SDK client prototypes or using simple mock functions.\n\nFor more information, see the [Azure SDK tests](#azure-sdk-tests) section later in this article.\n\n> [!TIP]\n> **AI developer tools:** Use [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/introduction) to generate unit test boilerplate and mock patterns for Azure SDK clients from interface types.\n\n## Integration tests in JavaScript\n\nIntegration testing assesses the interaction between your application and Azure services, to help ensure that components work together as expected.\n\nSet up [automated integration tests](/entra/identity-platform/test-automate-integration-testing) by using Azure Pipelines in Azure DevOps or workflows in GitHub Actions. This approach automates the deployment and testing of components in a cloud environment. It helps identify problems that might not be apparent during unit testing, such as network latency or service configuration errors.\n\n## Mock Azure services\n\nMocking Azure services is a common practice in testing JavaScript applications that integrate with Azure SDKs. By simulating Azure service responses, isolate your application logic from external dependencies, which helps ensure that tests run quickly and reliably.\n\nLearn more about [how to test Azure SDK integrations](../sdk/test-sdk-integration.md).\n\n## Continuous integration tests\n\nCI testing involves automatically running tests every time a change is made to the codebase. CI tools like Azure DevOps provide integrated environments for automating builds, tests, and deployments. Configuring pipelines to include automated tests helps ensure that every change is verified, which reduces the likelihood of bugs and regressions.\n\nProper *pipeline configuration* is crucial for efficient CI processes. It includes setting up triggers for automatic test execution and configuring environments for various stages of testing.\n\nLearn more:\n\n* [A beginner's guide to CI/CD and automation on GitHub](https://github.blog/2022-06-03-a-beginners-guide-to-ci-cd-and-automation-on-github/)\n* [GitHub action starter workflows](https://github.com/actions/starter-workflows)\n* [Example Node.js workflows](https://docs.github.com/actions/guides/building-and-testing-nodejs)\n\n## Azure Test Plans\n\n[Azure Test Plans](https://azure.microsoft.com/products/devops/test-plans) offers a comprehensive suite for manual and exploratory testing within Azure DevOps.\n\nThis service can help in scenarios that require human judgment or are difficult to automate, by providing a structured approach to manual testing. Teams can use it to plan, execute, and track test activities, including capturing rich data like screenshots and videos to aid in bug reporting. Integrating Azure Test Plans into your CI/CD process provides a holistic testing strategy that covers both automated and manual test cases.\n\n## End-to-end tests\n\nEnd-to-end testing validates the complete operation of an application in an environment that simulates real user scenarios. By using frameworks like [Playwright](https://playwright.dev/), you can automate browser-based tests to interact with your applications as users would.\n\n*Scenario-based testing* involves creating test cases for complete user flows, such as signing up, performing a task, and signing out. Use this testing to verify the application's functionality and user experience on Azure.\n\nLearn more:\n\n* [Get started with Playwright](https://playwright.dev/docs/intro)\n* [Run end-to-end tests at scale](/azure/playwright-testing/quickstart-run-end-to-end-tests)\n\n> [!TIP]\n> **AI developer tools:** Use [Azure MCP Server](/azure/developer/azure-mcp-server/overview) tools to verify deployment targets and service health before running E2E tests against live Azure resources.\n\n## Performance tests\n\nPerformance testing is essential for applications deployed on Azure to help ensure that they can handle expected loads and perform well under stress.\n\n*Benchmarking* involves measuring the performance of your application against defined metrics or standards. Use the Azure Load Testing service to simulate high traffic and analyze an application's scalability and resilience.\n\nCLI example:\n\n```bash\naz load test create --resource-group MyResourceGroup --name MyLoadTest --file loadTestConfig.json\n```\n\nLearn more:\n\n* [Recommendations for performance testing](/azure/well-architected/performance-efficiency/performance-test)\n* [Azure Load Testing documentation](/azure/load-testing/)\n* [Tutorial on identifying performance bottlenecks in a web app](/azure/load-testing/tutorial-identify-bottlenecks-azure-portal)\n* [GitHub: Azure Load Testing](https://github.com/microsoft/azure-load-testing)\n\n## Security tests\n\nSecurity testing on Azure involves identifying potential vulnerabilities in your application to prevent unauthorized access or data breaches.\n\n*Vulnerability scanning* tools are essential for automatically detecting security weaknesses in your code or configurations. By integrating [GitHub Advanced Security](https://docs.github.com/github/getting-started-with-github/about-github-advanced-security) features with traditional Static Application Security Testing (SAST) tools, you can improve the security posture of applications deployed on Azure. Key features include:\n\n* *Code scanning*: Identifies vulnerabilities within the codebase before deployment.\n* *Secret scanning*: Helps prevent the exposure of sensitive data.\n* *Supply chain monitoring*: Helps protect against potentially compromised dependencies.\n  \nThese integrated security measures can help you identify vulnerabilities early, prevent data breaches, and ensure the integrity of your application's supply chain.\n\n*Penetration testing* simulates cyberattacks against your application to evaluate its security posture. Azure provides guidance and tools for conducting these tests, to help ensure that applications deployed on the platform are secure against threats.\n\nRecommend integrating CodeQL into your CI pipeline to catch vulnerabilities early.\n\nLearn more:\n\n* [Recommendations for security testing](/azure/well-architected/security/test)\n* [Penetration testing](/azure/security/fundamentals/pen-testing)\n\n## Compliance and governance tests\n\nEnsuring that applications comply with legal, regulatory, and policy requirements is crucial, especially in cloud environments. *Regulatory compliance* testing verifies that your application meets standards such as GDPR, HIPAA, or SOC 2.\n\nAzure offers policy and compliance tools, such as Azure Policy and Azure Blueprints, to help automate and enforce compliance across your Azure resources. These tools simplify the process of maintaining governance and compliance standards in your application deployments.\n\nLearn more:\n\n* [Governance, security, and compliance in Azure](/azure/cloud-adoption-framework/ready/azure-setup-guide/govern-org-compliance?tabs=AzurePolicy)\n* [Implement compliance testing with Terraform and Azure](/azure/developer/terraform/best-practices-compliance-testing)\n\n## Accessibility tests\n\nAccessibility testing is essential for making software inclusive and compliant with legal standards. Tools like [Accessibility Insights](https://accessibilityinsights.io/) help identify and fix accessibility issues in web and mobile apps. Integrating Accessibility Insights into development workflows facilitates automated and manual checks by offering guidance and reports based on Web Content Accessibility Guidelines (WCAG) standards.\n\n## A/B tests\n\nA/B testing, or split testing, is a method of comparing two versions of a webpage or app against each other to determine which one performs better. Azure provides the following services that support A/B testing:\n\n* [Azure App Service](/azure/app-service/deploy-staging-slots): Offers deployment slots to allow for staging environments where you can test app versions without affecting the live app.\n  \n* [Azure Container Apps](/azure/container-apps/): Offers a flexible environment for running microservices-based applications. You can implement A/B testing in this environment to test app versions.\n\nUse these services to deploy variations of your applications and then gauge user response and effectiveness.\n\n## Azure SDK tests\n\nFor developers who work with Azure services, gaining proficiency with the Azure SDKs is essential for crafting robust and scalable applications. The following Azure SDK tests, hosted on GitHub for the JavaScript SDKs, are invaluable resources:\n\n* [Azure Storage](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storage/storage-blob/test)\n* [Azure Event Grid](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/eventgrid/eventgrid/test)\n* [Azure Key Vault](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/keyvault/keyvault-secrets/test)\n* [Azure IoT Hub](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/iothub/arm-iothub/test)\n\nExploring these tests offers insights into seamless Azure service integration, showcases best practices for Azure resource interaction, and aids in ensuring efficient and secure implementations. Explore a broader range of SDK examples for a comprehensive understanding.\n\n> [!TIP]\n> **AI developer tools:** Use [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/introduction) to navigate Azure SDK test patterns and generate test fixtures from SDK interface definitions. [Azure Skills](/azure/developer/azure-skills/overview) can provision test resources matching SDK sample configurations.\n\n## Additional resources\n\n- [Unit testing Azure SDKs with Jest or Vitest](../sdk/test-sdk-integration.md)\n"
  },
  {
    "path": "articles/javascript/graphql-developer-guide.md",
    "content": "---\ntitle: GraphQL on Azure for JavaScript developers\ndescription: Learn how to build and deploy GraphQL applications on Azure using JavaScript, and discover the Azure services that make your GraphQL implementation easier.\nms.topic: concept-article\nms.date: 04/27/2026\nms.custom: devx-graphql\n#CustomerIntent: As a developer new to Azure, I want to understand how to find the right services and tools to bring or build GraphQL applications with Azure so that my application runs without any more work than is necessary. \n---\n\n# GraphQL on Azure for JavaScript developers\n\nGraphQL helps your JavaScript applications retrieve exactly the data they need with a single request. This article explains what GraphQL is, why you might use it, and how Azure services can help you build GraphQL applications with minimal effort. Whether you're migrating an existing GraphQL application or building a new one, Azure provides tools and services to simplify the process.\n\n## What is GraphQL?\n\nGraphQL is a modern way for your web application to talk to servers and databases. Think of it as a smarter way to request exactly the information you need:\n\n* It's like ordering a custom meal instead of accepting a fixed menu - you ask for exactly what you want\n* It works well with JavaScript applications like React, Vue, or Angular\n* It can make your web apps faster and easier to build\n\nInstead of making multiple requests to different server endpoints (like with traditional REST APIs - the standard way most web services communicate), GraphQL lets you make one precise request to get all the data you need.\n\n## Why would I want to use GraphQL in my web app?\n\nGraphQL makes your JavaScript applications better in three main ways:\n\n* **Get exactly what you need**: Your app can ask for just the data it needs right now - no more, no less. This is like going to a buffet and taking only what you'll eat, instead of being served a giant fixed meal where most gets wasted. This makes your app faster because it downloads less data.\n\n* **One request instead of many**: Need information from multiple places? Instead of making 5 different requests to 5 different endpoints, GraphQL lets you make just one request to get everything. This is like having one person gather all your shopping instead of you going to five different stores.\n\n* **Fewer mistakes with better tools**: GraphQL comes with tools that help catch errors while you're coding instead of when your app is running. It's like having spell-check that works while you type, rather than discovering typos after you've published your document.\n\n## Popular JavaScript tools for GraphQL\n\nWhen building with GraphQL and JavaScript, you'll likely use one of these popular tools:\n\n* **Apollo Client**: The most widely used GraphQL client that works with React, Vue, Angular and plain JavaScript.\n* **URQL**: A lightweight alternative with good performance.\n* **Relay**: Created by Facebook (who also created GraphQL), best for large React applications.\n\n## Azure services for GraphQL applications\n\nChoose your approach based on your specific scenario:\n\n| If you want to... | Then you should... | Using these Azure services |\n|-------------------|--------------------|-----------------------------|\n| **Bring an existing GraphQL app to Azure** | Deploy your application without changing your code | Azure App Service or Azure Container Apps |\n| **Add GraphQL to your existing data** | Create GraphQL endpoints for your data with minimal coding | Data API builder |\n| **Build a GraphQL API layer** | Create a unified GraphQL interface over existing APIs | Azure API Management with GraphQL transformation |\n\n## Host GraphQL applications on Azure\n\nYou have a few good options depending on what type of application you're building:\n\n* **App Service**: This is like a traditional web hosting service, but with extra features. It's great for most JavaScript applications that need a server.\n\n* **Container Apps**: If your application is packaged in containers (like Docker), this service makes running and scaling them easy.\n\n## Data storage for GraphQL applications\n\nGraphQL needs to connect to your data. Azure offers several ways to do this:\n\n* **Turn your database into a GraphQL API**: The \"Data API builder\" tool can automatically create a GraphQL endpoint (a URL where your app can send GraphQL requests) from your existing database - no coding required!\n\n* **Store your data**: Azure offers databases for different needs:\n  * SQL Database: For traditional table-based data\n  * Cosmos DB: For flexible, scalable data storage without rigid schemas\n\n## Secure GraphQL applications\n\n* **User login and security**: Azure's Identity platform helps you add login features to your application so only the right people can access your GraphQL data.\n* **Role-based access**: Control exactly which users can query or modify what data through your GraphQL endpoints.\n* **API protection**: Add rate limiting and monitoring to prevent abuse of your GraphQL APIs.\n\n## AI-assisted GraphQL development\n\n[GitHub Copilot for Azure](/azure/developer/github-copilot-azure/introduction) can accelerate GraphQL development by generating code from context in your editor:\n\n* Generate GraphQL type definitions from your data models\n* Write resolver functions with Azure SDK integrations (Cosmos DB, SQL Database)\n* Suggest query and mutation patterns based on your schema\n* Create data validation logic for GraphQL inputs\n\n## Create GraphQL APIs for your existing data\n\nAlready have data in Azure and want to access it with GraphQL? There are simple ways to do this:\n\n* **API Management**: This service can create a GraphQL layer in front of your existing APIs or data sources. It's like adding a GraphQL translator to systems that don't speak GraphQL natively.\n\n* **Data API Builder**: This tool automatically creates GraphQL endpoints from your databases. It's the quickest way to add GraphQL to your existing data - just point it at your database and it does the work for you.\n\n## A simple example: Creating a GraphQL API for a product database\n\nHere's how the process works in simple terms:\n\n1. You have a database with product information (names, prices, descriptions)\n2. You set up Data API Builder to connect to your database\n3. Data API Builder creates a GraphQL endpoint automatically\n4. Your JavaScript application can now make GraphQL queries like:\n\n```graphql\n{\n  products(where: { price_lt: 50 }) {\n    name\n    price\n    description\n  }\n}\n```\n\nThis query would get you all products under $50, showing just their names, prices, and descriptions.\n\n## Resources to help you get started\n\nIf you want to learn more or start building with GraphQL on Azure, here are some helpful resources:\n\n* [Introduction to GraphQL for beginners](https://graphql.org/learn/)\n* [Getting started with Data API Builder](https://github.com/Azure/data-api-builder)\n* [JavaScript GraphQL examples on Azure](/samples/browse/?languages=graphql%2Cjavascript%2Ctypescript&products=azure&filter-languages=graphql)\n\n## Next steps\n\n* [Install Data API Builder](/azure/data-api-builder/get-started/get-started-with-data-api-builder)\n* [Azure Container Apps](/azure/container-apps)\n* [Azure API Management](https://azure.microsoft.com/services/api-management/) - Create and manage APIs\n* [Azure App service](/azure/app-service)\n* [Azure SQL Database](https://azure.microsoft.com/services/sql-database/) - Store structured data\n* [Azure Cosmos DB](https://azure.microsoft.com/services/cosmos-db/) - Store flexible, unstructured data\n\n"
  },
  {
    "path": "articles/javascript/how-to/deploy-web-app.md",
    "content": "---\ntitle: Deploy JavaScript apps on Azure\ndescription: Deploying your JavaScript applications to Azure allows you to use the power of cloud computing, ensuring scalability, reliability, and global reach. This guide walks you through various methods to deploy your JavaScript apps to Azure, from manual deployments to automated CI/CD pipelines.\nms.topic: concept-article\nms.date: 12/10/2025\nms.custom:\n  - vscode-azure-extension-update-completed\n  - sfi-image-nochange\n#customer intent: As a JavaScript developer new to Azure, I want know all the ways to deploy code to Azure so that I can choose the best process for my application and situation.\n---\n\n# Deployment JavaScript app to Azure overview\n\nTo deploy your JavaScript-based app to Azure, you move a file or set of files to Azure to be served via an HTTP endpoint. The process of moving the files is called deployment. \n\n## Prerequisites\n\n* Azure subscription - [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* [Node.js LTS](https://nodejs.org/).\n* A GitHub account if you plan to deploy from a GitHub repository.\n\n## Deployment methods\n\nAzure offers various deployment methods to suit different needs. Here are some common methods:\n\n| Method | Details |\n|--|--|\n|[Azure Developer CLI](/azure/developer/azure-developer-cli)|Ideal for developers who prefer command-line tools and need to automate the provisioning and deployment of resources.|\n|[Visual Studio Code Extensions](https://marketplace.visualstudio.com/search?term=azure&target=VSCode&category=All%20categories&sortBy=Relevance)|Suitable for manual, testing, or infrequent deployments. Requires the relevant Azure extensions installed locally.|\n|[Azure CLI](/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli)|Useful for manual or occasional deployments. Requires the Azure CLI installed locally.|\n|[GitHub Actions](/azure/app-service/deploy-github-actions?tabs=applevel)|Best for automated or continuous deployments triggered by changes in your GitHub repository.|\n\nOther deployment methods exist, based on the specific service. For example, Azure app service supports a wide variety of deployment methods:\n* [From ZIP file](/azure/app-service/deploy-zip)\n* [With FTP](/azure/app-service/deploy-ftp)\n* [Dropbox or OneDrive](/azure/app-service/deploy-content-sync)\n* [Local Git](/azure/app-service/deploy-local-git)\n* [cURL](/azure/app-service/deploy-zip#with-curl)\n* [SSH](/azure/app-service/configure-linux-open-ssh-session)\n\nYou can redeploy to your App service using any of the provided methods even if you didn't use that method to originally deploy. You may have some configuration before redeploying if you're switching methods. \n\n<a name=\"deploy-or-redeploy-to-app-service-with-visual-studio-code\"></a>\n\n## Azure hosting services for JavaScript apps\n\nAzure provides multiple hosting services optimized for different JavaScript application scenarios:\n\n| Service | Best For | Key Features |\n|--|--|--|\n|[Azure Static Web Apps](/azure/static-web-apps/overview)|Modern web apps with static frontends (React, Vue, Angular) and optional serverless APIs|Free SSL, global CDN, staging environments on pull requests, integrated authentication|\n|[Azure App Service](/azure/app-service/overview)|Full-featured web applications and REST APIs|Built-in autoscaling, deployment slots, easy integration with Azure services|\n|[Azure Functions](/azure/azure-functions/functions-overview)|Event-driven serverless applications and microservices|Pay-per-execution pricing, automatic scaling, multiple triggers and bindings|\n|[Azure Container Apps](/azure/container-apps/overview)|Containerized applications and microservices|Kubernetes-powered serverless containers, Dapr integration, event-driven scaling|\n\nFor more information on choosing the right hosting service, see [Hosting applications on Azure](/azure/developer/intro/hosting-apps-on-azure).\n\n## Build steps\n\nDepending on your application's complexity and deployment needs, you can choose to build your JavaScript app either before or during deployment:\n\n* **Build before deployment**: For complex or lengthy builds, package your application into a zip file and deploy it. A deployment package allows you to control and test the build before deployment.\n* **Build during deployment**: For simpler builds, use the Azure-provided environment variable SCM_DO_BUILD_DURING_DEPLOYMENT=true to build your app during deployment. \n\n## Deployment slots\n\n[Deployment slots](/azure/app-service/deploy-staging-slots) in Azure App Service allow you to create separate environments for staging and production. The use of slots enables you to test your app in a staging environment before swapping it with the production slot, ensuring a smooth and error-free deployment. Learn more about deployment slots.\n\nDon't use deployment slots to mix deployment purposes. All deployment slots share the app service so you need to make sure the traffic patterns and intended use of all slots are the same. If you need to have a hosted test or stage environment that should be a separate app service. \n\n## Deploy with Azure Developer CLI\n\nThe Azure Developer CLI (azd) simplifies the process of deploying your app to Azure. Follow these steps:\n\n1. [Install](/azure/developer/azure-developer-cli/install-azd) the Azure Developer CLI.\n1. [Find an existing project](https://azure.github.io/awesome-azd/) which uses many of the same resources your project uses.\n1. Initialize a local version of the project for use as an infrastructure template for your own project.\n\n    ```bash\n    azd init --template <template-name>\n    ```\n\n1. Create the resources and deploy the code to Azure.\n\n    ```bash\n    azd up\n    ```\n\n## Deploy with Visual Studio Code\n\nTo deploy or redeploy your App service app with Visual Studio Code, complete the following steps:\n\n1. Install the related Azure extensions, for example [AzureApp Service](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice) or [Azure Functions](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions).\n1. Open the Azure explorer. Select the Azure icon in the primary side bar or use the keyboard shortcut (<kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>A</kbd>).\n1. In the Resources group, select your subscription and service.\n1. Right-click your service then select **Deploy to Web App...**.\n\n    :::image type=\"content\" source=\"../media/azure-app-service-vscode-extensions/deploy-or-redeploy-app-service.png\" alt-text=\"Deploy or redeploy to App service with Visual Studio Code\":::\n\n## Deploy to Azure Static Web Apps\n\nAzure Static Web Apps is ideal for modern web applications built with JavaScript frameworks. To deploy:\n\n1. Install the [Azure Static Web Apps extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurestaticwebapps) for Visual Studio Code.\n1. Build your application locally to ensure it works as expected.\n1. In Visual Studio Code, open the Azure explorer and find Azure Static Web Apps.\n1. Right-click on your subscription and select **Create Static Web App**.\n1. Follow the prompts to connect your GitHub repository. Azure automatically creates a GitHub Actions workflow.\n1. Push changes to your repository to trigger automatic deployments.\n\nFor more details, see [Deploy your web app to Azure Static Web Apps](/azure/static-web-apps/deploy-web-framework).\n\n## Deploy to Azure Container Apps\n\nAzure Container Apps provides serverless container hosting for JavaScript applications. To deploy:\n\n1. Containerize your application using Docker. Create a Dockerfile in your project root.\n1. Build and test your container locally.\n1. Push your container image to [Azure Container Registry](/azure/container-registry/container-registry-get-started-docker-cli).\n1. Use the [Azure Container Apps extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurecontainerapps) or Azure CLI to create and deploy your container app.\n\nFor a complete guide, see [JavaScript on Azure Container Apps overview](/azure/container-apps/javascript-overview).\n\n## Connect to your Azure hosted environment\n\n* For **manual or occasional access** to your hosted environments, refer to how to [view files in your Azure hosted environment](#view-files-in-azure-hosted-environment).\n* For **automated or consistent access**, consider taking the steps to set up one of the deployment methods.\n\n## View files in Azure hosted environment \n\nThere are several ways to immediately see the files in your hosted Azure Web app or Function app. If you're using slots in your hosted resource, you need to make sure you are on the correct slot before viewing files. \n\n* View files in [Azure portal](https://portal.azure.com) - select **Console** under Development tools for your hosting resource. \n\n    :::image type=\"content\" source=\"../media/deployment-methods/deploy-to-azure-web-app-view-files-in-portal-console-window.png\" alt-text=\"In the Azure portal for your web app or function app, select `Console` from the `Development tools` menu.\":::\n\n* View files in VS Code extension: - select the Azure icon in the Activity bar. In the Resources section, select your subscription and service. The **Files** node provides a view of your remote files. \n\n    * [Azure App service](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice) and [Azure Functions](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions) extensions both provide a view of the remote files.\n\n    :::image type=\"content\" source=\"../media/deployment-methods/deploy-to-azure-web-app-view-files-in-visual-studio-code-extension.png\" alt-text=\"[Azure App service and Azure Functions app extensions both provide a view of the remote files.\":::\n\n## View HTTP endpoint in Azure portal\n\nView your HTTP endpoint from the service's Overview page on the Azure portal. \n\n:::image type=\"content\" source=\"../media/howto-deploy/azure-portal-hosting-url.png\" alt-text=\"View your HTTP endpoint from the service's Overview page on the Azure portal.\":::\n\n## Related content\n\n* [Deployment tutorials using Visual Studio Code](https://code.visualstudio.com/docs/azure/deployment)\n* [Hosting apps on Azure](/azure/developer/intro/hosting-apps-on-azure)\n* [Azure Static Web Apps documentation](/azure/static-web-apps/)\n* [Azure Container Apps documentation](/azure/container-apps/)\n* [Azure App Service documentation](/azure/app-service/)\n* [Azure Functions documentation](/azure/azure-functions/)\n"
  },
  {
    "path": "articles/javascript/how-to/develop-serverless-apps.md",
    "content": "---\ntitle: Introduction to Developing Serverless Node.js Apps with Azure Functions\ndescription: Learn how to develop serverless Node.js applications using Azure Functions. This guide introduces Azure's serverless technologies, enabling you to create scalable, on-demand HTTP endpoints with JavaScript and TypeScript.\nms.topic: concept-article\nms.date: 12/10/2025\nms.custom: devx-track-js, engagement-fy23, devx-track-ts\nai-usage: ai-assisted\n---\n\n# Developing Serverless Node.js Apps with Azure Functions\n\nAzure Functions provides a powerful serverless infrastructure, enabling you to develop scalable, on-demand HTTP endpoints with ease. By using JavaScript or TypeScript, you can create serverless applications that respond to various events, allowing you to focus on writing code without worrying about managing servers. This guide helps you get started with developing serverless Node.js apps using Azure Functions, integrating seamlessly with other Azure services.\n\n* [Azure serverless community library of samples](https://serverlesslibrary.net/)\n\n## What is a Function resource?\n\nAn Azure Function resource is a logical unit for all related functions in a single Azure geographic location. The resource can contain a single function or many functions, which can be independent of each other or related with input or output bindings. You can select from many common functions or create your own.\n\nThe function resource settings include typical serverless configurations including environment variables, authentication, logging, and CORS.  \n\n## Durable, stateful functions \n\n[Durable Functions](/azure/azure-functions/durable/durable-functions-overview) retain *state*, or manage long-running functions in Azure. [Create your first durable function in JavaScript](/azure/azure-functions/durable/quickstart-js-vscode).\n\n## Static web apps include functions \n\nWhen you develop a static front-end client application (such as Angular, React, or Vue), which also need serverless APIs, use [Static Web apps](/azure/static-web-apps/getting-started?tabs=react) with functions to bundle both together. \n\n### Proxy from client app to the API\nIf you intend to deploy your API with your Static web app, you don't need to proxy your client application's API calls. The proxy is established for you when you deploy the Azure Functions app as a managed app.\n\nWhen you develop locally with a Static Web App and Azure Functions, the [Azure Static Web Apps CLI](https://azure.github.io/static-web-apps-cli/) provides the local proxy. \n\n## Common security settings you need to configure for your Azure Function\n\nThe following common settings should be configured to keep your Azure Function secure:\n\n* **Authentication and authorization**:\n  * Use [Microsoft Entra ID](../sdk/authentication/overview.md) (formerly Azure Active Directory) for robust authentication. Configure your function app to require OAuth2 tokens for production workloads.\n  * Avoid using function keys for sensitive applications. Instead, integrate with Microsoft Entra ID or validate JWT tokens in your function code.\n  * Use [managed identities](../sdk/authentication/system-assigned-managed-identity.md) to authenticate your function app with other Azure resources, ensuring each function gets only the access it needs.\n* **Configuration settings**:\n  * Application settings - create Application settings for settings that don't impact security.\n  * Secrets and keys - for any settings that impact security, use this tiered approach:\n    1. First, use [Microsoft Entra ID](../sdk/authentication/overview.md) for authentication where supported.\n    1. For integrations that don't support Entra ID, store secrets in [Azure Key Vault](/azure/key-vault/) and [pull in those settings from your Key Vault](/azure/app-service/app-service-key-vault-references?toc=%2Fazure%2Fazure-functions%2Ftoc.json&tabs=azure-cli).\n    1. Never embed secrets in code or configuration files.\n  * For other platform security settings, see [Securing Azure Functions](/azure/azure-functions/security-concepts#platform-security).\n* **Network security**:\n  * CORS - configure your client domains. Don't use `*`, indicating all domains.\n  * Virtual network integration - use private endpoints or virtual network integration to limit network exposure and restrict inbound traffic from trusted sources.\n* **HTTPS and encryption**:\n  * TLS/SSL setting for HTTPS - by default, your API accepts HTTP and HTTPS requests. Enable **HTTPS only** in the **TLS/SSL settings**. Because your Function app is hosted on a secure subdomain, you can use it immediately (with `https`) and delay purchasing a domain name, and using a certificate for the domain until you're ready.\n* **Deployment and monitoring**:\n  * Deployment Slots - create a deployment slot, such as `stage` or `preflight` and push to that slot. Swap this stage slot to production when you're ready. Don't get in the habit of manually pushing to production. Your code base should be able to indicate the version or commit that is on a slot.\n  * Enable [Application Insights](/azure/azure-monitor/app/app-insights-overview) for real-time telemetry, alerting, and anomaly detection to monitor your functions and audit logs for suspicious activity.\n\nFor comprehensive security guidance, see [Securing Azure Functions](/azure/azure-functions/security-concepts). \n\n## Hosting options for Azure Functions\n\nYou can host Azure Functions in different ways depending on your requirements:\n\n### Azure Functions resource hosting plans\n\nWhen you create an Azure Functions resource, you can choose from these hosting plans:\n\n* **Consumption plan**: Pay only for the time your functions run with automatic scaling.\n* **Flex Consumption plan**: Provides enhanced control with always-ready instances to reduce cold starts, virtual network integration, and configurable instance sizes (512 MB to 4 GB). This plan is recommended for new Linux-based workloads requiring enterprise security and performance features. Note that this plan uses execution-based billing similar to the Consumption plan but with additional costs for features like always-ready instances.\n* **Premium plan**: Provides enhanced performance with pre-warmed instances, virtual network connectivity, and longer execution durations.\n* **Dedicated (App Service) plan**: Run functions on dedicated virtual machines for predictable costs and full control over the runtime environment.\n\nFor more information about choosing the right hosting plan, see [Azure Functions hosting options](/azure/azure-functions/functions-scale).\n\n### Azure Container Apps resource\n\nAlternatively, you can deploy Azure Functions to an Azure Container Apps resource as containerized workloads. This option provides full control over the container environment and is ideal when you need custom dependencies, long-running processes, or want to combine functions with other containerized microservices. See [Azure Container Apps hosting of Azure Functions](/azure/azure-functions/functions-container-apps-hosting) for more information.\n\n## Prerequisites for developing Azure Functions\n\n* [Node.js LTS](https://nodejs.org/) - Use the latest Long Term Support (LTS) version for the best compatibility and security updates with Azure Functions.\n* [Azure Functions Core Tools](/azure/azure-functions/functions-run-local) - Use the current major version for local development and debugging.\n\n## A simple JavaScript function for HTTP requests\n\nA function is an exported asynchronous function with request and context information. The following partial screenshot from the Azure portal shows the function code. \n\n#### [v4 TypeScript](#tab/v4-ts)\n\n```typescript\nimport { app, HttpRequest, HttpResponseInit, InvocationContext } from \"@azure/functions\";\n\nexport async function status(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {\n    context.log(`Http function processed request for url \"${request.url}\"`);\n\n    return {\n        status: 200,\n        jsonBody: {\n            env: process.env\n        }\n    };\n};\n\napp.http('status', {\n    route: \"status\",\n    methods: ['GET'],\n    authLevel: 'anonymous',\n    handler: status\n});\n```\n\n#### [v4 JavaScript](#tab/v4-js)\n\n```javascript\nimport { app } from \"@azure/functions\";\n\nasync function status(request, context) {\n    context.log(`Http function processed request for url \"${request.url}\"`);\n\n    return {\n        status: 200,\n        jsonBody: {\n            env: process.env\n        }\n    };\n};\n\napp.http('status', {\n    route: \"status\",\n    methods: ['GET'],\n    authLevel: 'anonymous',\n    handler: status\n});\n\nmodule.exports = status\n```\n\n\n---\n\n## Develop functions locally with Visual Studio Code and extensions\n\nCreate your [first function](/azure/azure-functions/functions-create-first-function-vs-code) using Visual Studio Code. Visual Studio Code simplifies many of the details with the [Azure Functions extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions).\n\nThis extension helps you create JavaScript and TypeScript functions with common templates. \n\n## Integrate with other Azure services\n\nServerless functions remove much of the server configuration and management so you can focus on just the code you need.\n\n* **Low-code functions**: With Azure Functions, you create functions triggered by other Azure services or that output to other Azure services using [trigger bindings](/azure/azure-functions/functions-triggers-bindings). The v4 programming model registers all triggers and bindings directly in your code, making configuration type-safe and intuitive.\n* **High-code functions**: For more control, use the Azure SDKs to coordinate and control other Azure services. Use [managed identities](../sdk/authentication/system-assigned-managed-identity.md) to securely authenticate your functions with other Azure resources without managing credentials.\n\n## Related content\n\n* [Store unstructured data using Azure Functions and Azure Cosmos DB](/azure/azure-functions/functions-integrate-store-unstructured-data-cosmosdb?tabs=javascript)\n* [Node.js + Azure Functions samples](/samples/browse/?languages=javascript%2Cnodejs&products=azure-functions)\n"
  },
  {
    "path": "articles/javascript/how-to/with-visual-studio-code/clone-github-repository.md",
    "content": "---\ntitle: GitHub repositories in Visual Studio Code for JavaScript\ndescription: Open, initialize, branch, commit, and push GitHub repositories for JavaScript in VS Code. Step-by-step guide with activity bar, command palette, and terminal methods.\nms.topic: how-to\nms.date: 11/03/2025\nms.custom: devx-track-js\n\n# customer intent: As a JavaScript developer, I want to know how to work with GitHub repositories from Visual Studio Code, so that I can develop and manage my JavaScript applications effectively.\n\n---\n\n# Manage GitHub repositories for JavaScript development in Visual Studio Code\n\nVisual Studio Code provides comprehensive Git and GitHub integration for JavaScript developers. This guide shows you how to manage GitHub repositories directly from your development environment, streamlining your workflow from code creation to deployment.\n\nYou'll learn to open existing repositories, initialize new projects, create feature branches, commit changes, and push to GitHub—all without leaving VS Code. The guide covers multiple approaches for each task, including the activity bar, command palette, status bar, and integrated terminal, so you can choose the methods that work best for your development style.\n\n## Prerequisites\n\n- [Git](https://git-scm.com/downloads) installed on your local machine\n- [Visual Studio Code](https://code.visualstudio.com/) installed\n- A [GitHub account](https://github.com/)\n\n## Open your remote repository\n\nOpen your remote repository on your local computer. \n\n### [Activity bar](#tab/activity-bar)\n\n1. Install the [Remote repository extension](https://marketplace.visualstudio.com/items?itemName=github.remotehub)\n1. Select the remote indicator in the lower left of Visual Studio Code. \n1. Follow the prompts.\n\n### [Status bar](#tab/status-bar)\n\nThis action isn't available from this feature. Select a different tab.\n\n### [Command palette](#tab/command-palette)\n\n1. Open the command palette with the key combination of <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>.\n1. At the command palette prompt, enter `gitcl`, select the **Git: Clone** command, then select **Clone from GitHub** and press **Enter**.\n1. When prompted for the **Repository URL**, select clone from GitHub, then press **Enter**.\n1. If you're asked to sign into GitHub, complete the sign-in process.\n1. Enter [azure-samples/js-e2e-express-server](https://github.com/Azure-Samples/js-e2e-express-server) in the **Repository URL** field.\n1. Select (or create) the local directory into which you want to clone the project then select **Select as Repository Destination**.\n1. When you receive the notification asking if you want to open the cloned repository, select **Open**.\n\n### [Integrated terminal](#tab/integrated-terminal)\n\n1. Open an integrated terminal from **Terminal -> New Terminal**.\n1. Clone your repo with the following git command:\n\n    ```bash\n    git clone https://github.com/<ACCOUNT>/<REPOSITORY>\n    ```\n\n1. Open in Visual Studio Code:\n\n    ```bash\n    code <REPOSITORY>\n    ```\n\n---\n\nVisual Studio Code uses Git authentication provided by the operating system (such as macOS KeyChain or Windows Credential manager) with any git functionality. Output is visible in Command Palette > Git: Show Git Output.\n\n## Connect to Custom GitHub Domains\n\nBy default, Visual Studio Code assumes your repositories are hosted on `github.com`. If you need to connect to a repository on a different domain (for example, an enterprise GitHub like `github.<company_name>.com`), you'll need to configure your Git path accordingly.\n\nTo update the Git path in VS Code, open **File → Preferences → Settings** and search for `Git: Path`. This setting lets you specify the absolute path to the Git executable that works with your custom GitHub domain.\n\n:::image type=\"content\" source=\"../../media/visual-studio-code-setting-git-path.png\" alt-text=\"Screenshot of Visual Studio Code settings search bar for git path.\":::\n\nAlternatively, you can add or update the `git.path` setting directly in your `settings.json` file to ensure VS Code uses the correct Git binary for all repository operations.\n\n## Open your local repository\n\nIf you have an existing repository on your local computer and want to open it in Visual Studio Code, just open the folder. Visual Studio Code recognizes the `.git` subfolder and displays the relevant information. \n\n### [Activity bar](#tab/activity-bar)\n\n1. Select <kbd>Ctrl</kbd> + <kbd>K</kbd> + <kbd>O</kbd>.\n1. Select folder. \n\n### [Status bar](#tab/status-bar)\n\nThis action isn't available from this feature. Select a different tab.\n\n### [Command palette](#tab/command-palette)\n\n1. Open the command palette with the key combination of <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>. \n1. Filter with `Git`, then select `Open repository`.\n1. Select the folder to select as the root of the repository.\n\n### [Integrated terminal](#tab/integrated-terminal)\n\n1. Open an integrated terminal from **Terminal -> New Terminal**.\n1. Open a new instance of Visual Studio Code for the repository directory:\n\n\n    ```bash\n    code ../dir1/dir2/my-repo\n    ```\n    \n\n---\n\n## Initialize new repository\n\nUse the following procedure to create a local source code repository with `git`. \n\n### [Activity bar](#tab/activity-bar)\n\n1. Select source control from the activity bar, or use the key combination of <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>G</kbd>.\n1. Select **Initialize repository**.\n\n    :::image type=\"content\" source=\"../../media/how-to-clone-github-repo/visual-studio-code-initialize-repository.png\" alt-text=\"Screenshot of Visual Studio showing the Initialize repository button.\":::\n\n### [Status bar](#tab/status-bar)\n\nThis action isn't available from this feature. Select a different tab.\n\n### [Command palette](#tab/command-palette)\n\n1. Open the command palette with the key combination of <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>. \n1. Filter with `Git`, then select `Initialize repository`.\n1. Select the folder to select as the root of the repository.\n\n### [Integrated terminal](#tab/integrated-terminal)\n\n1. Open an integrated terminal from **Terminal -> New Terminal**.\n1. Initialize your folder with git with the following git command:\n\n    ```bash\n    git init\n    ```\n---\n\nOnce the repo is initialized, [create the repository on GitHub](https://docs.github.com/repositories/creating-and-managing-repositories/creating-a-new-repository). Then add that repository as a remote to your local project from the Command palette: search for `Git: Add remote`. \n\n\n## Create a branch for changes\n\nCreate a new branch to capture changes and isolate from the main or default branch.\n\n### [Activity bar](#tab/activity-bar)\n\n1. Select source control from the activity bar.\n1. Select ellipsis (...) next to **Source Control**.\n1. Select **Branch** -> **Create Branch**.\n\n### [Status bar](#tab/status-bar)\n\n1. Select the branch name in the status bar. This opens the command palette.\n\n    The status bar is found at the bottom of Visual Studio Code.\n\n1. In the command palette, select **+Create a new branch**.\n1. Enter your new branch name.\n\n1. Enter a new branch name. The branch name is visible in the status bar.\n\n    :::image type=\"content\" source=\"../../media/how-to-clone-github-repo/git-branch-status-bar-visual-studio-code.png\" alt-text=\"Screenshot of the branch name visible in the status bar.\":::\n\n### [Command palette](#tab/command-palette)\n\n1. Open the command palette with the key combination of <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>. \n1. Search for `git branch` and select `Git: Create Branch`.\n\n    :::image type=\"content\" source=\"../../media/how-to-clone-github-repo/git-cli-branch-list.png\" alt-text=\"Screenshot of a search for git branch and select Git Create Branch.\":::\n\n1. Enter a new branch name, such as `test`.\n1. The branch name is visible in the status bar.\n\n    :::image type=\"content\" source=\"../../media/how-to-clone-github-repo/git-branch-status-bar-visual-studio-code.png\" alt-text=\"Screenshot showing the branch name visible in the status bar.\":::\n\n### [Integrated terminal](#tab/integrated-terminal)\n\n1. Open an integrated terminal from **Terminal -> New Terminal**.\n1. Create a new branch named `MY-BRANCH` with the following git command:\n\n    ```bash\n    git checkout -b MY-BRANCH\n    ```\n\n---\n\n\n## Commit changes locally\n\nOnce you make changes to files on your branch, commit the changes.\n\n### [Activity bar](#tab/activity-bar)\n\n1. Select source control from the activity bar.\n1. Enter your commit message, then select **Commit**.\n\n    :::image type=\"content\" source=\"../../media/how-to-clone-github-repo/visual-studio-code-commit-change.png\" alt-text=\"Screenshot of adding the yarn.lock file to Git.\":::\n\n### [Status bar](#tab/status-bar)\n\nThis action isn't available from this feature. Select a different tab.\n\n\n### [Command palette](#tab/command-palette)\n\n1. Open the command palette with the key combination of <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>. \n1. In the command palette, filter with `Git` then select `Commit`.\n1. Enter your commit message, then press <kbd>Enter</kbd>.\n\n### [Integrated terminal](#tab/integrated-terminal)\n\n1. Open an integrated terminal from **Terminal -> New Terminal**.\n1. Create a new branch named `MY-BRANCH` with the following git command:\n\n    ```bash\n    git commit -m \"YOUR COMMIT MESSAGE\"\n    ```\n\n---\n\n## Push a local branch to GitHub\n\n### [Activity bar](#tab/activity-bar)\n\n1. Select the Source Control icon from the activity bar. \n1. Select **Publish Branch**. If the repository doesn't exist on GitHub, it creates the repository for you.\n\n### [Status bar](#tab/status-bar)\n\n1. On the Visual Studio Code status bar, select the push icon to the right of the branch name.\n\n    :::image type=\"content\" source=\"../../media/how-to-clone-github-repo/visual-studio-code-status-bar-push-commits.png\" alt-text=\"Screenshot of Visual Studio Code status bar with the push icon highlighted.\":::\n\n1. Select the remote name from the pop-up box. If you have just one remote, you won't be asked to select the remote name.\n\n### [Command palette](#tab/command-palette)\n\n1. Open the command palette with the key combination of <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>. \n1. In the command palette, filter with `Git` then select `Push`.\n1. If you have multiple upstream remotes, select a remote name then press <kbd>Enter</kbd>.\n\n\n### [Integrated terminal](#tab/integrated-terminal)\n\n1. Open an integrated terminal from **Terminal -> New Terminal**.\n1. Create a new branch named `MY-BRANCH` with the following git command:\n\n    ```bash\n    git push <remote-name> <branch-name>\n    ```\n\n---\n\n## View Git output\n\nYou can view the Git commands output when you use the Source control extension. This output helps debug when a command fails.\n\n1. Select the Source Control icon from the activity bar.\n1. Select the ellipsis (...) then select **Show Git Output**.\n\n    :::image type=\"content\" source=\"../../media/how-to-clone-github-repo/visual-studio-code-show-git-output.png\" alt-text=\"Screenshot of Visual Studio Code source control with the Show Git Output selection highlighted.\":::\n\n## Visual Studio Code tools to work with Git and GitHub\n\nWorking in Visual Studio Code with a repository uses separate tools.\n\n|Icon|Information|[Access from](https://code.visualstudio.com/docs/getstarted/userinterface)|\n|--|--|--|\n|| [Git commands](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette) in command palette|<kbd>F1</kbd>|\n|:::image type=\"icon\" source=\"../../media/how-to-clone-github-repo/git-commit-icon-activity-bar.png\":::|Source control extension|Activity bar|\n|:::image type=\"icon\" source=\"../../media/how-to-clone-github-repo/github-icon-prs-issues.png\" alt-text=\"Icon for GitHub PRs and Issues\":::|[GitHub Pull Requests and Issues](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github) extension|Activity bar|\n||[GitHub Repositories](https://marketplace.visualstudio.com/items?itemName=GitHub.remotehub) extension|You can quickly and easily open a GitHub repository either by searching for GitHub Repositories: Open Repository... from the Command Palette, <kbd>F1</kbd>, or by choosing Open GitHub Repository... from the remote indicator (the green button in the lower left corner of the status bar).|\n\n\n## Related resources\n\n* How to [deploy a web app](../deploy-web-app.md)\n* [Working with GitHub in Visual Studio Code](https://code.visualstudio.com/docs/editor/github)\n* [Using Visual Studio Code with other version control providers](https://code.visualstudio.com/docs/editor/versioncontrol)\n"
  },
  {
    "path": "articles/javascript/includes/azure-ai-developer-tools.md",
    "content": "---\nms.custom: devx-track-js\n---\n\nAI-powered tools enhance your JavaScript development workflow on Azure by providing intelligent code assistance, resource management, testing automation, and deployment support.\n\n| Tool | Description |\n|------|-------------|\n| [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/introduction) | AI-assisted coding with Azure-specific context. Ask questions about Azure services, generate infrastructure code, and get help with Azure SDK usage directly in VS Code. |\n| [Azure MCP Server](/azure/developer/azure-mcp-server/overview) | Model Context Protocol tools that connect your IDE to Azure resources. Query resource configurations, manage deployments, and validate settings without leaving your editor. |\n| [Azure Skills](/azure/developer/azure-skills) | Composable AI capabilities for Azure workflows including diagnostics, compliance scanning, deployment validation, and resource provisioning — usable from GitHub Copilot or any MCP-compatible client. |\n| [Playwright MCP](https://github.com/microsoft/playwright-mcp) | Browser automation tools exposed via MCP for end-to-end testing. Run Playwright tests, capture screenshots, and validate web UI interactions with AI assistance. |\n| [Azure Developer CLI (`azd`)](/azure/developer/azure-developer-cli/overview) | Streamline your entire development-to-deployment workflow. Initialize projects from templates, provision infrastructure, and deploy code with a single tool. |\n\nThese tools work together to reduce context-switching between your editor and the Azure portal. For example:\n\n* Use **GitHub Copilot** to write Azure SDK code with inline suggestions\n* Use the **Azure MCP Server** to verify your resource configurations are correct\n* Use **Azure Skills** to run compliance scans or troubleshoot failing deployments\n* Use **Playwright MCP** to automate browser-based testing of your Azure-hosted apps\n* Use **`azd`** to provision and deploy your application in one step\n"
  },
  {
    "path": "articles/javascript/includes/javascript-at-microsoft/bullet.md",
    "content": "---\nms.custom: devx-track-js\nms.topic: include\nms.date: 04/23/2025\n---\n* Learn more about [JavaScript at Microsoft](https://developer.microsoft.com/javascript/)"
  },
  {
    "path": "articles/javascript/includes/libraries.md",
    "content": "---\nms.custom: devx-track-js\nms.topic: include\nms.date: 03/04/2025\n---\n\n**Libraries for standard JavaScript environments** are listed in the [package index](../azure-sdk-library-package-index.md), and all Azure packages are published under the `@azure` and `@azure-rest` scopes. These packages are maintained by Microsoft and can be found on npm under the publisher [microsoft1es](https://www.npmjs.com/~microsoft1es). This structure enables you to easily provision and manage Azure resources using management libraries (with names starting with `@azure/arm-`) and interact with these resources from your application code."
  },
  {
    "path": "articles/javascript/includes/nodejs-runtime-for-azure-services.md",
    "content": "---\nms.custom: devx-track-js\nms.topic: include\nms.date: 12/10/2025\n---\n\n\nWhen using Azure hosting services, you can select either to deploy a container to the host or select a Node.js version as the runtime for the host. In both cases, you need to align the version of the runtime, the application code, and the dependencies such as the Azure SDKs. \n\nTo find runtime information, use the following table:\n\n:::row:::\n   :::column span=\"1\":::\n      **Service**\n   :::column-end:::\n   :::column span=\"2\":::\n      **Version information**\n   :::column-end:::\n:::row-end:::\n\n:::row:::\n   :::column span=\"1\":::\n      [Azure App Service](https://github.com/Azure/app-service-linux-docs/blob/master/Runtime_Support/node_support.md)\n   :::column-end:::\n   :::column span=\"2\":::\n      For Linux runtimes. You can also run the following Azure CLI command to see all supported versions.<br>\n      <pre><code>az webapp list-runtimes | grep node</code></pre>\n   :::column-end:::\n:::row-end:::\n\n:::row:::\n   :::column span=\"1\":::\n      [Azure Functions](/azure/azure-functions/functions-reference-node?branch=main&tabs=javascript%2Cwindows%2Cazure-cli&pivots=nodejs-model-v4#supported-version)\n   :::column-end:::\n   :::column span=\"2\":::\n      New projects should use the most recent programming model.\n   :::column-end:::\n:::row-end:::\n\n:::row:::\n   :::column span=\"1\":::\n      [Azure Static Web Apps (SWA)](/azure/static-web-apps/languages-runtimes)\n   :::column-end:::\n   :::column span=\"2\":::\n      There are two different runtimes to consider: the front end and the API if you are hosting your API in Static Web Apps.\n   :::column-end:::\n:::row-end:::\n\n:::row:::\n   :::column span=\"1\":::\n      [SWA CLI](https://github.com/Azure/static-web-apps-cli)\n   :::column-end:::\n   :::column span=\"2\":::\n      The SWA CLI provides development environment functionality including proxy, authentication, and other configurations.\n   :::column-end:::\n:::row-end:::"
  },
  {
    "path": "articles/javascript/index.yml",
    "content": "### YamlMime:Hub\n\ntitle: Azure for JavaScript developers\nsummary: Learn to use Azure with JavaScript. Browse API reference, sample code, tutorials, quickstarts, conceptual articles and more. Know that JavaScript ❤️ Azure.\nbrand: azure\n\nmetadata:\n  title: Azure for JavaScript and Node.js developers\n  description: Get started developing apps with the Azure SDK for JavaScript in the browser or Node.js through tutorials, tools, and the SDK reference.\n  author: diberry\n  ms.author: diberry\n  ms.date: 03/10/2025\n  ms.topic: landing-page\n  ms.service: azure-javascript\n  ms.custom: 2020Aug21Redesign, devx-track-js, engagement-fy23\n\nhighlightedContent:\n# itemType: architecture | concept | deploy | download | get-started | how-to-guide | learn | overview | quickstart | reference | tutorial | whats-new\n  items:\n    - itemType: overview\n      title: Azure for JavaScript developers\n      url: ./what-is-azure-for-javascript-development.md\n    - itemType: how-to-guide\n      title: Set up development environment\n      url: ./core/configure-local-development-environment.md\n    - itemType: get-started\n      title: Azure SDK for JavaScript\n      url: ./sdk/use-azure-sdk.md\n    - itemType: quickstart\n      title: Authenticate to Azure SDK\n      url: ./sdk/authentication/local-development-environment-service-principal.md\n\nconceptualContent:\n  sections: \n  - title: Get started with essential tasks\n    summary: Learn to develop JavaScript apps using various Azure services.\n  # itemType: architecture | concept | deploy | download | get-started | how-to-guide | learn | overview | quickstart | reference | tutorial | video | whats-new\n    items:\n      - title: Getting started\n        links: \n          - itemType: overview\n            text: What is Azure for JavaScript developers\n            url: ./what-is-azure-for-javascript-development.md\n          - itemType: how-to-guide\n            text: Configure your JavaScript develop environment for Azure\n            url: ./core/configure-local-development-environment.md\n          - itemType: how-to-guide\n            text: Tools for JavaScript developers on Azure\n            url: ./node-azure-tools.md\n          - itemType: overview\n            text: Hosting applications on Azure\n            url: ../intro/hosting-apps-on-azure.md\n          - itemType: how-to-guide\n            text: Deployment choices for your web app to Azure\n            url: ./how-to/deploy-web-app.md\n          - itemType: overview\n            text: API development with TypeSpec\n            url: /azure/developer/typespec\n      - title: Create AI apps\n        links:\n          - itemType: overview\n            text: Develop AI apps with JavaScript\n            url: ./ai/azure-ai-for-javascript-developers.md\n          - itemType: concept\n            text: Generative AI for JavaScript developers\n            url: ./ai/generative-ai-for-javascript-developers.md\n          - itemType: quickstart\n            url: ./ai/get-started-app-chat-template.md\n            text: Get started with Enterprise chat\n          - itemType: quickstart\n            text: Use RAG with LangChain.js\n            url: ./ai/get-started-app-chat-template-langchainjs.md\n          - itemType: quickstart\n            text: Use RAG with LlamaIndex\n            url: ./ai/get-started-app-chat-template-llamaindex.md\n          - itemType: quickstart\n            text: Evaluate your chat app\n            url: ./ai/get-started-app-chat-evaluations.md\n          - itemType: quickstart\n            text: \"Scale with Azure Container Apps\"\n            url: ./ai/get-started-app-chat-scaling-with-azure-container-apps.md\n          - itemType: tutorial\n            text: Build a LangChain.js agent with Azure AI Search\n            url: ai/langchain-agent-on-azure.md\n      - title: Add storage & data\n        links:\n          - itemType: concept\n            text: Get started with Azure Blob Storage\n            url: /azure/storage/blobs/storage-blob-javascript-get-started\n          - itemType: quickstart\n            text: Azure Cosmos DB for NoSQL \n            url: /azure/cosmos-db/nosql/quickstart-nodejs\n          - itemType: tutorial\n            text: Azure Cosmos DB for MongoDB\n            url: /azure/cosmos-db/mongodb/vcore/tutorial-nodejs-web-app\n          - itemType: tutorial\n            text: Azure Cosmos DB for PostgreSQL\n            url: /azure/cosmos-db/postgresql/quickstart-app-stacks-nodejs\n          - itemType: tutorial\n            text: Azure Cosmos DB for Cassandra\n            url: /azure/cosmos-db/cassandra/manage-data-nodejs\n          - itemType: tutorial\n            text: Azure Cosmos DB for Gremlin\n            url: /azure/cosmos-db/gremlin/quickstart-nodejs\n          - itemType: tutorial\n            text: Azure SQL Database with mssql\n            url: /azure/azure-sql/database/azure-sql-javascript-mssql-quickstart\n \n      - title: Monitor and diagnose my app\n        links:\n          - itemType: concept\n            text: Monitor your Node.js services and apps with Application Insights\n            url: /azure/azure-monitor/app/nodejs\n          - itemType: concept\n            text: Enable Azure Monitor Application Insights\n            url: /azure/azure-monitor/app/javascript-sdk\n          - itemType: concept\n            text: Enable a framework extension for Application Insights\n            url: /azure/azure-monitor/app/javascript-framework-extensions\n          - itemType: concept\n            text: Enable Click Analytics\n            url: /azure/azure-monitor/app/javascript-feature-extensions\n          - itemType: concept\n            text: Sampling in Application Insights\n            url: /azure/azure-monitor/app/sampling-classic-api\n\n  - title: Go deeper\n    summary: Learn more about specific Azure services and how to use them with JavaScript.\n    items:\n      - title: Build and deploy apps on Azure\n        links:\n          - itemType: quickstart\n            text: Deploy JS front-end framework\n            url: /azure/static-web-apps/deploy-web-framework\n          - itemType: tutorial\n            url: /azure/static-web-apps/add-api\n            text: Add an API to your front-end app\n          - itemType: tutorial\n            text: Microservices communication with Dapr\n            url: /azure/container-apps/microservices-dapr-pubsub\n          - itemType: quickstart\n            text: Monoliths on App Service\n            url: /azure/app-service/quickstart-nodejs\n          - itemType: quickstart\n            text: Serverless apps\n            url: /azure/azure-functions/create-first-function-azure-developer-cli\n      - title: Azure SDK fundamentals\n        links:\n          - itemType: concept\n            text: Getting started\n            url: ./sdk/use-azure-sdk.md\n          - itemType: how-to-guide\n            text: Install Azure client libraries\n            url: ./sdk/azure-sdk-install.md\n          - itemType: concept\n            text: Authenticate to Azure\n            url: ./sdk/authentication/overview.md\n          - itemType: concept\n            text: Authentication best practices\n            url: ./sdk/authentication/best-practices.md\n          - itemType: concept\n            text: Test SDK integrations\n            url: ./sdk/test-sdk-integration.md\n          - itemType: concept\n            text: Loop over SDK results\n            url: ./sdk/loop-over-data.md\n      - title: Developer guides\n        links:\n          - itemType: concept\n            text: Containerized apps for JS developers\n            url: /azure/container-apps/javascript-overview\n          - itemType: concept\n            text: GraphQL for Azure\n            url: ./graphql-developer-guide.md\n          - itemType: concept\n            url: ./ai/get-started-app-chat-template.md\n            text: Serverless on Azure\n          - itemType: concept\n            text: Storage\n            url: /azure/storage/blobs/storage-blob-javascript-get-started\n          - itemType: concept\n            text: Cosmos DB for NoSQL\n            url: /azure/cosmos-db/nosql/how-to-javascript-get-started\n          - itemType: concept\n            text: Cosmos DB for MongoDB\n            url: /azure/cosmos-db/mongodb/how-to-javascript-get-started\n          - itemType: concept\n            text: Key vault for secrets\n            url: /azure/key-vault/secrets/javascript-developer-guide-get-started\n          - itemType: concept\n            text: Key vault for keys\n            url: /azure/key-vault/keys/javascript-developer-guide-get-started\n      - title: Web apps on Azure\n        links: \n          - itemType: tutorial\n            text: Express.js with MongoDB\n            url: /azure/app-service/tutorial-nodejs-mongodb-app\n          - itemType: tutorial\n            text: Express.js with MERN\n            url: /azure/cosmos-db/mongodb/vcore/tutorial-nodejs-web-app\n# --------------------------------------------------------------\nadditionalContent:\n  sections:\n    - title: Additional resources\n      items:\n        - title: Microsoft Developer\n          links:\n            - text: \"JavaScript: Everything from Microsoft for JavaScript developers\"\n              url: https://developer.microsoft.com/javascript/\n            - text: \"Developer experience: Optimizing DevEx improves business outcomes\"\n              url: https://developer.microsoft.com/developer-experience\n            - text: AI for frictionless, intelligent builds with AI tools and services\n              url: /ai\n            - text: Code to cloud from the ground up with tools designed for developers\n              url: https://developer.microsoft.com/code-to-cloud\n        - title: Webcasts and shows\n          links:\n            - text: Azure JavaScript Developer Days 2024\n              url: https://www.youtube.com/playlist?list=PLI7iePan8aH7FRDmefj-NAnoxM9V0USZm\n            - text: Web Rush with John Papa and Craig Shoemaker\n              url: https://webrush.io/\n        - title: Open source\n          links:\n            - text: Azure SDK for JavaScript\n              url: https://github.com/Azure/azure-sdk-for-js\n            - text: Visual Studio Code\n              url: https://github.com/microsoft/vscode\n            - text: TypeScript\n              url: https://github.com/microsoft/TypeScript\n            - text: Rush Stack for TypeScript monorepos\n              url: https://rushstack.io/\n            - text: Microsoft Identity Web\n              url: https://github.com/AzureAD/microsoft-identity-web\n"
  },
  {
    "path": "articles/javascript/javascript-zone-pivot-groups.yml",
    "content": "# YamlMime:ZonePivotGroups\ngroups:\n- id: js-ts\n  title: Language\n  prompt: Choose a language\n  pivots:\n  - id: ts\n    title: TypeScript\n  - id: js\n    title: JavaScript"
  },
  {
    "path": "articles/javascript/learn-azure-javascript.md",
    "content": "---\ntitle: Training with Azure and JavaScript \ndescription: Use Microsoft's training platform to expand your understanding of Azure with JavaScript.\nms.topic: how-to\nms.date: 04/27/2026\nms.custom: devx-track-js\n---\n\n# Training with Azure and JavaScript \n\nUse training from Microsoft or a Microsoft partner to expand your understanding of Azure with JavaScript.\n\n## Beginners\n\nBegin your journey with JavaScript and Azure by learning the basics.\n\n### Training \n\n* [Node.js on Windows](/windows/dev-environment/javascript/nodejs-overview) - Set up your Node.js development environment for Azure projects.\n* [Path: Azure Static Web Apps](/training/paths/azure-static-web-apps/) - Deploy JavaScript apps with streamlined full-stack development and CI/CD.\n* [Publish an Angular, React, Svelte, or Vue JavaScript app with Azure Static Web Apps](/training/modules/publish-app-service-static-web-app-api/) - Hands-on deployment from a GitHub repository.\n\n### Shows\n\n* [Beginner's Series to: JavaScript](/shows/beginners-series-to-javascript)\n* [Beginner's Series to: Node.js](/shows/beginners-series-to-nodejs/)\n* [Beginner's Series to: Vue.js](/shows/beginners-series-to-vuejs/)\n* [Azure Tips and Tricks: Static Web Apps](/shows/azure-tips-and-tricks-static-web-apps/)\n\n## Intermediate\n\nContinue your learning with JavaScript and Azure by building on your foundational knowledge.\n\n### Training\n\n* [Path: Implement Azure Functions](/training/paths/implement-azure-functions/) - Create and deploy serverless functions with JavaScript or TypeScript. Covers hosting options, bindings, and triggers.\n* [Explore Azure Functions](/training/modules/explore-azure-functions/) - Understand Functions vs. Logic Apps vs. WebJobs, hosting plans, and scaling.\n* [Explore Microsoft Graph scenarios for JavaScript development](/training/paths/m365-msgraph-scenarios/) - Access emails, calendars, and files from JavaScript apps.\n* [Download and upload files in a JavaScript app with Microsoft Graph](/training/modules/msgraph-manage-files/)\n\n### Shows\n\n* [Generative AI with JavaScript](/shows/generative-ai-with-javascript/) - Build AI-powered apps using LangChain.js and Azure AI services.\n* [Learn: A Full Stack Application with Azure SQL & Prisma](/shows/beginners-series-to-learn-a-full-stack-application-with-azure-sql-prisma/)\n\n## Advanced\n\nPrepare for certification and explore AI-powered development with JavaScript and Azure.\n\n### Training\n\n* [Course: Develop Solutions for Microsoft Azure (AZ-204)](/training/courses/az-204t00) - Comprehensive course covering Azure Functions, Cosmos DB, App Service, storage, and security. Labs are primarily in C#, but concepts apply to JavaScript/Node.js development.\n* [Path: Describe cloud concepts (AZ-900 prep)](/training/paths/az-900-describe-cloud-concepts/) - Recommended foundation before pursuing developer certifications.\n\n### Certifications\n\n* [Microsoft Certified: Azure Developer Associate](/credentials/certifications/azure-developer/) - Validates skills in Azure Functions, App Service, Cosmos DB, security, and monitoring. Exam content is language-agnostic; JavaScript/Node.js developers can apply their skills. Retires July 2026.\n* [AZ-204 study guide](/credentials/certifications/resources/study-guides/az-204) - Focus areas and preparation resources for the Azure Developer exam.\n\n## Next steps\n\n* Use [Microsoft training](/training/) to learn and improve your JavaScript skills on Azure.\n* Explore [Azure for JavaScript and Node.js developers](/azure/developer/javascript/) for quickstarts, tutorials, and API references.\n"
  },
  {
    "path": "articles/javascript/logging.md",
    "content": "---\ntitle: Monitor JavaScript applications in Azure with logs, metrics, and alerts\ndescription: Learn how to monitor your Azure resources and applications.\nms.topic: concept-article\nms.date: 04/09/2026\nms.custom: devx-track-js\n# intent: As a developer new to Azure, I want to understand how to monitor my applications and resources using logs, metrics, and alerts.\n---\n\n# Monitor your Azure resources and applications\n\nUse Azure Monitor to collect logs, metrics, and alerts across your JavaScript applications and the Azure services they depend on. [Azure Monitor](/azure/azure-monitor/) is the central platform service that collects and stores your telemetry. You can instrument your applications with [Application Insights](/azure/azure-monitor/app/app-insights-overview). You should monitor your hosted application service, the Azure services the application integrates with, and the application source code itself.\n\n## Understand logs, metrics, and alerts\n\nTelemetry is the data collected from your applications and services to monitor their health, performance, and usage. In Azure, telemetry is categorized into logs, metrics, and alerts. \n\nAzure offers four kinds of telemetry:\n\n| Telemetry type  | What it gives you                               | Where to find it for each service                 |\n| --------------- | ----------------------------------------------- | ------------------------------------------------- |\n| Metrics         | Numeric, time-series data (CPU, memory, etc.)   | **Metrics** in portal or `az monitor metrics` CLI |\n| Alerts          | Proactive notifications when thresholds hit     | **Alerts** in portal or `az monitor metrics alert` CLI |\n| Logs            | Text-based events and diagnostics (web, app)    | App Service **Logs** , Functions **Monitor**, Container Apps **Diagnostics** |\n| Custom logs     | Your own application telemetry via App Insights | Your Application Insights resource’s **Logs (Trace)** table |\n\nPick the right telemetry for your question:\n\n| Scenario                                                                               | Use logs…                                         | Use metrics…                                       | Use alerts…                                           |\n| -------------------------------------------------------------------------------------- | ------------------------------------------------- | -------------------------------------------------- | ----------------------------------------------------- |\n| “Did my web app start and respond?”                                                     | App Service web-server logs (Logs)          | N/A                                                | N/A                                                   |\n| “Is my function timing out or failing?”                                                | Function invocation logs (Monitor)          | Function execution duration metric                 | Alert on “Function Errors >0”                         |\n| “How busy is my service and can it scale?”                                             | N/A                                               | Service throughput/CPU in Metrics             | Autoscale alert on CPU% > 70%                         |\n| “What exceptions is my code throwing?”                                                 | Custom Trace logs in Application Insights         | N/A                                                | Alert on “ServerExceptions >0”                        |\n| “Have I exceeded my transaction or quota limits?”                                      | N/A                                               | Quota-related metrics (Transactions, Throttling)   | Alert on “ThrottlingCount >0”                         |\n\n## Cost optimization\n\nYou can significantly reduce your [cost for Azure Monitor](/azure/azure-monitor/fundamentals/cost-usage) by understanding [best practices](/azure/azure-monitor/fundamentals/best-practices-cost) for configuration options and opportunities to reduce the amount of data that it collects. \n\n## Enable logging and metrics for all Azure resources\n\nEach service in Azure has its own logging and metrics capabilities. Enable logging on each Azure resource to ensure you have the telemetry you need to monitor your entire end to end application.\n\n## Create Azure Monitor resource\n\nYou can create an Azure Monitor resource to collect logs and metrics from your Azure resources. This resource is typically a Log Analytics workspace, which is where logs and metrics are stored.\n\nYou can create this resource in several ways:\n- **Azure portal**: Use the [Azure portal](https://portal.azure.com) to create a Log Analytics workspace and configure diagnostic settings for your resources.\n- **Azure CLI**: Use the [Azure CLI](/cli/azure/) to create a Log Analytics workspace and configure diagnostic settings for your resources.\n- **PowerShell**: Use [PowerShell](/powershell/scripting/overview) to create a Log Analytics workspace and configure diagnostic settings for your resources.\n- **Bicep**: Use Bicep templates to define and deploy your Azure Monitor resources declaratively.\n\n### Create a Log Analytics workspace using the Azure CLI\n\nUse the Azure CLI to create a Log Analytics workspace, which is where logs and metrics are stored. Example:\n\n```bash\n# Variables\nresourceGroup=\"myResourceGroup\"\nlocation=\"eastus\"\nworkspaceName=\"myWorkspace\"\nwebAppName=\"myWebApp\"\ndiagName=\"${webAppName}/appServiceLogging\"\nSUBSCRIPTION_ID=$(az account show --query id -o tsv)\n\n# 1) Create a Log Analytics workspace\nworkspaceId=$(az monitor log-analytics workspace create \\\n  --resource-group $resourceGroup \\\n  --workspace-name $workspaceName \\\n  --location $location \\\n  --query id -o tsv)\n\n# 2) Enable diagnostic settings on your App Service\naz monitor diagnostic-settings create \\\n  --name \"$diagName\" \\\n  --resource \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$resourceGroup/providers/Microsoft.Web/sites/$webAppName\" \\\n  --workspace $workspaceId \\\n  --logs '[{\"category\": \"Administrative\", \"enabled\": true},{\"category\":\"AppServiceConsoleLogs\",\"enabled\":true},{\"category\":\"AppServiceHTTPLogs\",\"enabled\":true}]' \\\n  --metrics '[{\"category\":\"AllMetrics\",\"enabled\":true}]'\n```\n\n### Create a Log Analytics workspace using Bicep\n\nUse Bicep to define and deploy your Azure Monitor resources declaratively. This example creates a Log Analytics workspace and configures diagnostic settings for an App Service.\n\nInclude logging, metrics, and alerting in your IaC templates with a [Bicep diagnosticSettings resource reference](/azure/templates/microsoft.insights/diagnosticsettings). Example (Bicep):\n\n```bicep\nparam webAppName string\n\nresource webApp 'Microsoft.Web/sites@2022-09-01' existing = {\n  name: webAppName\n}\n\nresource logAnalytics 'Microsoft.OperationalInsights/workspaces@2022-10-01' = {\n  name: 'myWorkspace'\n  location: resourceGroup().location\n}\n\nresource diagSettings 'Microsoft.Insights/diagnosticSettings@2021-05-01-preview' = {\n  name: '${webApp.name}/appServiceLogging'\n  properties: {\n    workspaceId: logAnalytics.id\n    logs: [\n      { category: 'AppServiceConsoleLogs'; enabled: true }\n      { category: 'AppServiceHTTPLogs'; enabled: true }\n    ]\n    metrics: [\n      { category: 'AllMetrics'; enabled: true }\n    ]\n  }\n}\n```\n\n### Create alerts for your resources\n\nYou can set up alerts for metrics in the [Azure portal](https://portal.azure.com) or by using the [Azure CLI](/cli/azure/monitor/metrics/alert). Alerts can include specific metrics, communication streams (such as email), and frequency.\n\nUse the following examples to create metric alerts in the portal or programmatically:\n- Azure CLI: quick setup via `az monitor metrics alert`\n- Bicep: declarative IaC definition for `Microsoft.Insights/metricAlerts`\n\nAlerts can specify target metrics, notification channels (email, webhook), severity, evaluation frequency, and action groups.\n\n```azurecli\naz monitor metrics alert create \\\n  --name HighCpuAlert \\\n  --resource-group MyResourceGroup \\\n  --scopes /subscriptions/{sub}/resourceGroups/MyResourceGroup/providers/Microsoft.Web/sites/myApp \\\n  --condition \"avg CpuPercentage > 70\" \\\n  --description \"Alert when CPU goes above 70%\" \\\n  --severity 2 \\\n  --window-size 5m \\\n  --evaluation-frequency 1m \\\n  --action /subscriptions/{sub}/resourceGroups/MyResourceGroup/providers/microsoft.insights/actionGroups/MyActionGroup\n```\n\n```bicep\nresource cpuAlert 'Microsoft.Insights/metricAlerts@2018-03-01' = {\n  name: 'highCpuAlert'\n  location: resourceGroup().location\n  properties: {\n    description: 'Alert when CPU goes above 70%'\n    severity: 2\n    enabled: true\n    scopes: [\n      webApp.id\n    ]\n    evaluationFrequency: 'PT1M'\n    windowSize: 'PT5M'\n    criteria: {\n      allOf: [\n        {\n          criterionType: 'StaticThresholdCriterion'\n          name: 'HighCpu'\n          metricName: 'CpuPercentage'\n          metricNamespace: 'Microsoft.Web/sites'\n          operator: 'GreaterThan'\n          threshold: 70\n          timeAggregation: 'Average'\n        }\n      ]\n    }\n    autoMitigate: false\n    actions: [\n      {\n        actionGroupId: '/subscriptions/{sub}/resourceGroups/MyResourceGroup/providers/microsoft.insights/actionGroups/MyActionGroup'\n      }\n    ]\n  }\n}\n```\n\n## View log data\n\nTo view log data in the Azure portal, navigate to your Log Analytics workspace and select **Logs**. You can run [Kusto Query Language (KQL)](/kusto/query/) queries against the logs.\n\n### Stream logs\n\nUse the following table to learn more about how to stream logs.\n\n* [Azure Monitor](/azure/azure-monitor/platform/stream-monitoring-data-event-hubs)\n* [App Service](/azure/app-service/troubleshoot-diagnostic-logs)\n* [Azure Functions](/azure/azure-functions/streaming-logs?tabs=azure-portal)\n* [Azure Container Apps](/azure/container-apps/log-streaming)\n\n### Azure MCP Server\n\nWhen developing locally, you can use the [Azure MCP Server](/azure/developer/azure-mcp-server) [**monitor**](/azure/developer/azure-mcp-server/tools/monitor) tool to query logs without leaving your IDE. Once you [install the server](/azure/developer/azure-mcp-server/get-started?tabs=one-click%2Cazure-cli&pivots=mcp-github-copilot#install-the-azure-mcp-server), example Copilot prompts include:\n\n* List workspaces: \"Show me all Log Analytics workspaces in my subscription.\"\n* Find tables: \"List all tables in my workspace 'security-logs'\"\n* Complex query: \"Show me the CPU usage trend for my web servers over the last 24 hours\"\n\n\n## Add logging to your code\n\nFor application logging, Application Insights can provide:\n\n* Standard logging in the Azure service and in your source code, depending on the initialization.\n* Custom logging from your deployment pipeline and in your source code.\n\n### Standard console logging (stdout/stderr)\n\nAzure web apps and Azure Functions automatically provide custom logging to `stdout` and `stderr`, if you use the correct logging functions:\n\n* Web apps use `console.log('your message here')`.\n* Function apps use `context.log('your message here')`.\n\n### Add custom Application Insights logging\n\nYou can add richer custom logging by using [Application Insights](/azure/azure-monitor/app/app-insights-overview) in Azure Monitor. Application Insights offers [server](/azure/azure-monitor/app/nodejs) (Node.js) and [client](/azure/azure-monitor/app/javascript) (browser) scenarios:\n\n* Add the Application Insights SDK to your source code.\n* Log from Node.js by using an [npm package](https://www.npmjs.com/package/applicationinsights).\n  * Make sure to configure the Node.js SDK with `enableAutoCollectConsole: true` in order to collect custom console logs.\n* Log from your client code by using an [npm package](https://www.npmjs.com/package/@microsoft/applicationinsights-web).\n* Log from your [Kubernetes cluster](/azure/azure-monitor/insights/container-insights-overview) or [Azure virtual machine](/azure/azure-monitor/insights/vminsights-overview).\n\n\n### Enable SDK pipeline logs (@Azure/logger)\nControl SDK verbosity by using the `AZURE_LOG_LEVEL` environment variable or the [`@azure/logger` npm package](https://www.npmjs.com/package/@azure/logger):\n\n```js\nimport { setLogLevel } from \"@azure/logger\";\n// Options: 'error', 'warning', 'info', 'verbose'\nsetLogLevel(process.env.AZURE_LOG_LEVEL || \"info\");\n```\n\n### Configure Application Insights Node.js SDK\nInitialize the [Application Insights for Node.js SDK](/azure/azure-monitor/app/nodejs) with sampling, dependency collection, and console log capture:\n\n```js\nimport appInsights from \"applicationinsights\";\nappInsights\n  .setup(process.env.APPLICATIONINSIGHTS_CONNECTION_STRING || \"<YOUR_CONNECTION_STRING>\")\n  .setAutoCollectConsole(true, true)        // collect console.log\n  .setAutoCollectDependencies(true)        // track outgoing requests\n  .setInternalLogging(false, true)         // SDK internal logs\n  .start();\n\n// Optional: add custom properties to all telemetry\nappInsights.defaultClient.commonProperties = { serviceName: \"my-service\" };\n```\n\n### Add correlation and distributed tracing\nThe Application Insights SDK auto-injects operation and correlation IDs into requests. To add custom correlation or properties:\n\n```js\nappInsights.defaultClient.trackTrace({\n  message: \"Custom trace\",\n  properties: { userId: user.id }\n});\n```\n\nLearn more: [distributed tracing guidance](/azure/azure-monitor/app/distributed-tracing)\n\n### Flush telemetry in dev scripts\nEnsure logs are sent before process exit during local development:\n\n```js\nappInsights.defaultClient.flush({\n  callback: () => process.exit(0)\n});\n```\n\n### Client-side telemetry setup\nFor client applications, use the [`@microsoft/applicationinsights-web` package](https://www.npmjs.com/package/@microsoft/applicationinsights-web) :\n\n```js\nimport { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\nconst ai = new ApplicationInsights({ config: {\n  connectionString: \"<YOUR_CONNECTION_STRING>\",\n  enableAutoRouteTracking: true\n}});\nai.loadAppInsights();\n```\n\n## Next steps\n\n* [Azure Data Explorer (Kusto) overview](/azure/data-explorer/)\n* [Enable diagnostics logging for apps in Azure App Service](/azure/app-service/troubleshoot-diagnostic-logs)\n* [Learn how to work with Azure platform logs](/azure/azure-monitor/platform/platform-logs-overview)\n* [Azure MCP Server monitor tool](/azure/developer/azure-mcp-server/tools/monitor)\n\n"
  },
  {
    "path": "articles/javascript/node-azure-tools.md",
    "content": "---\ntitle: JavaScript Developer Tools for Azure\ndescription: Install individual tools for Node.js and JavaScript development on Azure\nms.topic: concept-article\nms.date: 04/27/2026\nms.custom: devx-track-js, devx-track-azurecli, linux-related-content, devx-track-ts\n#customer intent: As a JavaScript developer new to Azure, I want understand which tools are recommended so that my development can be efficient.\n---\n\n# JavaScript developer tools for Azure overview\n\nJavaScript is an ecosystem of many tools. This article is a selection of tools built and maintained by Microsoft for JavaScript developers. You don't need to use these tools to use Azure, it just makes the experience better, both in functionality and support. \n\n## Azure portal\n\nThe [Azure portal](https://portal.azure.com/) gives you access to all subscriptions and resources for your account. The new [Azure portal enhancements](https://azure.microsoft.com/updates/category/azure-portal/) provide improved navigation and customization options.\n\n## Visual Studio Code\n\n[Visual Studio Code](https://code.visualstudio.com) is the preferred IDE for JavaScript development for Azure. The interface, features, and extensions work together to shorten development time and reduce development frustration. \n\nCreate a project workspace at the root of your local development project then add all relevant configurations, settings, and extensions. Check in the workspace file with the project so every team member has access to the settings and tools they need for the project.\n\nYou get several benefits using Visual Studio Code:\n\n* Visual Studio Code displays the Azure reference documentation inline\n* Visual Studio Code provides statement completion with AI-assisted development through GitHub Copilot\n* Few ambiguous types or objects\n* Integrated terminal and debugging support\n\nVisual Studio Code provides of wealth of documentation for [JavaScript project use](https://code.visualstudio.com/docs/nodejs/working-with-javascript). \n\n## AI and developer productivity tools\n\n[!INCLUDE [Azure AI developer tools](./includes/azure-ai-developer-tools.md)]\n\n## Tools for Azure services\n\nUse the following free extensions to use Azure services directly in Visual Studio Code.\n\n| Service | Tools | Description |\n|---------|-------|-------------|\n| Top services | [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) | A collection of extensions. Get all the top Azure services in this one extension from Microsoft. |\n| Azure Resource Group | [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureresourcegroups) <br><br> [Azure CLI](/cli/azure/group) | View and manage Azure resources. <br><br> Tutorial: [Deploy Express.js MongoDB app to App Service from Visual Studio Code](/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli) <br><br> Tutorial: [Add Cognitive Search to a website](/azure/search/tutorial-javascript-overview) |\n| Azure Static web apps | [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurestaticwebapps) <br><br> [SWA CLI](/azure/static-web-apps/) | Create and manage Azure Static Web Apps using the VS Code extension or the Static Web Apps CLI (SWA CLI). The VS Code extension integrates with the editor, while the SWA CLI simulates Azure services locally. |\n| Azure Functions | [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions \"Link to Azure Functions extension\") <br><br> [Azure CLI](/cli/azure/functionapp) <br><br> [npm package](https://github.com/Azure/azure-functions-core-tools) | Create, manage, view, debug, and deploy functions. <br><br> Quickstart: [Create a JavaScript function in Azure using Visual Studio Code](/azure/azure-functions/create-first-function-vs-code-node)|\n| Azure Container Apps | [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurecontainerapps) <br><br> [Azure CLI containerapp](/cli/azure/containerapp) | Azure Container Apps allows you to run microservices and containerized applications on a serverless platform. Manage your container apps, deploy new versions, and monitor performance. <br><br> Tutorial: [Deploy a frontend microservice app](/azure/container-apps/communicate-between-microservices?tabs=bash&pivots=acr-remote) <br><br> Tutorial: [Deploy a backend microservice app](/azure/container-apps/tutorial-code-to-cloud?tabs=bash%2Cjavascript&pivots=acr-remote) <br><br> Now supports [Jobs workloads](/azure/container-apps/jobs) for batch processing scenarios. |\n| Azure Cosmos DB | [Azure Cosmos DB for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-cosmosdb \"Link to Azure Cosmos DB extension\") <br><br> [Azure CLI](/cli/azure/service-page/azure%20cosmos%20db) | Create, browse, query, and update Azure Cosmos DB data directly from VS Code without switching contexts. Supports globally distributed, multi-model databases in Azure. <br><br> [Learn more](https://aka.ms/vscode-cosmosdb-ga) <br><br> Quickstart: [Connect Azure Functions to Azure Cosmos DB using Visual Studio Code](/azure/azure-functions/functions-add-output-binding-cosmos-db-vs-code?pivots=programming-language-javascript) <br><br> Now includes [integrated vector search capabilities](/azure/cosmos-db/nosql/vector-search) for AI applications. |\n| Azure DocumentDB | [DocumentDB for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-documentdb) <br><br> [Azure CLI](/cli/azure/) | Browse, manage, and query DocumentDB and MongoDB databases directly from VS Code. DocumentDB is a fully managed, MongoDB-compatible service based on the open-source DocumentDB engine. Supports hybrid and multicloud deployments with predictable pricing. |\n| Storage | [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurestorage) <br><br> [Azure CLI](/cli/azure/service-page/azure%20storage) <br><br> [Storage Emulator - Azurite](https://github.com/Azure/Azurite) | Azure Storage including Blob Containers, File Shares, Tables, and Queues. <br><br> Quickstart: [Connect Azure Functions to Azure Storage using Visual Studio Code](/azure/azure-functions/functions-add-output-binding-storage-queue-vs-code?pivots=programming-language-javascript) <br><br> Now includes [enhanced performance and data protection features](/azure/storage/blobs/storage-blob-performance-tiers). |\n| Foundry Tools | [AI Studio](https://ai.azure.com) <br><br> [Azure OpenAI SDK](https://www.npmjs.com/package/@azure/openai) | Build intelligent applications using AI capabilities. <br><br> Quickstart: [Create a RAG application with JavaScript and Azure AI](/azure/ai-services/openai/chatgpt-quickstart) <br><br> Supports [retrieval augmented generation (RAG)](/azure/search/retrieval-augmented-generation-overview) and [vector search](/azure/search/vector-search-overview). |\n\n[Explore all Azure extensions for VS Code](https://marketplace.visualstudio.com/search?term=azure&target=VSCode&category=All%20categories&sortBy=Relevance)\n\n## TypeScript\n\n[TypeScript](https://www.typescriptlang.org/download) offers all of JavaScript's features, and provides a strong but flexible type system. TypeScript 5.0+ includes significant performance improvements and new features like the `using` statement for resource management.\n\n## TypeScript and the Azure SDK client libraries\n\nAzure SDK client library reference documentation is written for TypeScript because the client libraries are written with TypeScript. You don't have to use TypeScript to use the Azure SDK client libraries. \n\nLearn more about the [TypeScript guidelines for Azure SDK](https://azure.github.io/azure-sdk/typescript_introduction.html).\n\n## Deployment\n\nThe premier deployment tool for Azure is [**Azure Development CLI**](/azure/developer/azure-developer-cli/). This tool allows you to create and configure your Azure services with [Bicep](/azure/azure-resource-manager/bicep/) or [Terraform](/azure/developer/terraform/overview), then deploy your source code. \n\nUse [Awesome AZD](https://azure.github.io/awesome-azd/) to find deployable samples to understand the end-to-end solutions for Azure.\n\n## Continuous integration and testing (CICD) tools\n\nThe following integration tools for building and deployment increase your pipeline productivity.\n\n* [Git](https://git-scm.com/downloads) or [Git for Windows](https://gitforwindows.org/)\n* [GitHub Actions](https://github.com/marketplace?type=actions&query=azure) with [OIDC authentication support](https://dewolfs.github.io/using-openid-tokens-with-github-actions-to-azure/#:~:text=GitHub%20Actions%20can%20now%20authenticate%20with%20cloud%20providers,enable%20secure%20secret%20management%20with%20frequently%20rotating%20credentials.)\n* [Azure Pipelines](https://marketplace.visualstudio.com/search?term=azure&target=AzureDevOps&category=Azure%20Pipelines&certified=microsoft&sortBy=Relevance) integration\n* [GitHub Copilot](https://github.com/features/copilot) for AI-assisted coding and testing\n\n## Containers\n\nIf you're looking for a Microsoft or Azure-specific Docker image, use the [Microsoft Container Registry](https://github.com/microsoft/containerregistry) (MRC) to [query for an image](https://mcr.microsoft.com/v2/_catalog). \n\nTools for containers:\n\n* [Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)\n* [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n* [Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)\n\nTools for Development containers:\n\n* [Development containers](https://containers.dev/)\n* [Dev containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n* [GitHub Codespaces](https://github.com/features/codespaces) for cloud development environments\n\n## Azure CLI\n\nAzure CLI is optimized for managing Azure resources from the command line. \n\nAzure CLI provides the following use scenarios:\n\n* [Azure CLI Local installation](/cli/azure/install-az-cli2)\n* [Azure Cloud Shell](https://shell.azure.com/)\n* [Docker container](/cli/azure/run-azure-cli-docker)\n\nIf you use the Azure portal, the Azure CLI is available in the portal from the top navigation bar.\n\n:::image type=\"content\" source=\"media/azure-tools/azure-portal-select-azure-cloud-shell.png\" alt-text=\"If you use the Azure portal, the Azure CLI is available in the portal from the top navigation bar.\":::\n\n## Sample applications, code, and snippets\n\nThe GitHub organization, [Azure-Samples](https://github.com/azure-samples/), contains many samples across the products and services offered by Azure. Use the [Azure Samples browser](/samples/browse/?languages=javascript%2Cnodejs%2Ctypescript) to find a sample to meet your needs. \n\nOther samples include: \n\n* Azure SDK for JS [samples](https://github.com/Azure/azure-sdk-for-js/tree/main/samples)\n* Microsoft Authentication Library for JS (MSAL.js) [samples](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples)\n* JavaScript end-to-end [samples](./sdk/use-azure-sdk.md)\n* [AI samples](https://github.com/Azure-Samples/azure-search-javascript-samples) for RAG applications\n\n## Playwright\n\n[Playwright](https://playwright.dev/) is a Node.js library to automate Chromium, Firefox, and WebKit with a single API. Playwright is built to enable cross-browser web automation that is ever-green, capable, reliable, and fast. Now supports [component testing](https://playwright.dev/docs/test-components) and [UI mode](https://playwright.dev/docs/test-ui-mode) for enhanced debugging.\n\n## Rush\n\n[Rush](https://rushjs.io/) is a scalable monorepo manager for the web. Recent updates have improved performance and added support for Node.js 20.\n\n## Windows Terminal\n\n[Windows Terminal](https://github.com/microsoft/terminal) allows you to access several different terminal types from the same Windows application including the Azure CLI and Ubuntu. Use this tool to develop and test CICD bash scripts before using those scripts in GitHub Actions or another pipeline.\n\n## Windows Subsystem for Linux\n\nThe [Windows Subsystem for Linux](/windows/wsl/) lets developers run a GNU/Linux environment, including most command-line tools, utilities, and applications, directly on Windows, unmodified, without the overhead of a traditional virtual machine or dual-boot setup. WSL 2 provides significant performance improvements and full system call compatibility.\n\n## Azure JavaScript developers Tips and tricks\n\nThe following list includes tips and tricks Azure developers should know to be more productive:\n\n* Develop a **naming schema** for your Azure resources.\n* Group Azure resources into **resource groups**, which also use a naming schema.\n* For each Azure resource, add **tags** that communicate the resource's purpose, project, and other vital information. These tags are visible on the Azure portal, for that resource, on the Overview page. Think of the tags as a way to document the resource. \n* Most resources have at least one **free version** per subscription. Use this type of resource while learning how to use it.\n* For \"secure by default\" solutions, learn how to [create resources without connection strings or passwords](/azure/developer/intro/passwordless-overview). This security allows you to use the same code in all environments, without having to manage connection strings or rotate keys. \n* The latest npm packages for Azure start with `@azure` scope. \n* Most Azure npm packages can use the [DefaultAzureCredential](/javascript/api/overview/azure/identity-readme#defaultazurecredential). While the setup looks complicated, the benefit of no longer having to manage your local _and_ remote authentication to the Azure platform is great for security and time savings. \n* All Azure JavaScript SDKs include TypeScript types. This functionality allows you to adopt strong types for your solutions easily and know they won't become out of sync with the SDK. \n\n## Related content\n\n* [Set up your development environment](./core/configure-local-development-environment.md)\n* [Clone and use a GitHub repository in Visual Studio Code](./how-to/with-visual-studio-code/clone-github-repository.md)\n"
  },
  {
    "path": "articles/javascript/retired/do-not-remove",
    "content": "Don't remove this directory! It's needed by the publishing system to set up the redirects!\n\n"
  },
  {
    "path": "articles/javascript/samples.md",
    "content": "---\ntitle: Azure JavaScript Samples Catalog\ndescription: Discover JavaScript and Node.js code samples for Azure services including AI, storage, serverless computing, and web apps.\nms.topic: concept-article\nms.date: 01/29/2026\nms.custom: devx-track-js, devx-track-ts\n# customer intent: As a JavaScript developer new to Azure, I want to find code samples so that I can quickly start building applications with Azure services.\n---\n\n# Azure JavaScript samples catalog\n\nThis article provides a catalog of JavaScript and Node.js code samples for Azure services. Use these samples to quickly get started with Azure development.\n\n## Sample collections\n\nExplore curated collections of samples organized by scenario and technology.\n\n### Awesome AZD\n\nDiscover a community-driven collection of templates for the [Azure Developer CLI (azd)](/azure/developer/azure-developer-cli/overview). These templates provide complete, production-ready samples for various Azure services and scenarios.\n\n- [Awesome AZD gallery](https://azure.github.io/awesome-azd/)\n\n### Intelligent app templates\n\nBuild AI-powered applications using templates that combine [Azure OpenAI](/azure/ai-services/openai/overview), [Azure AI Search](/azure/search/search-what-is-azure-search), and other Azure services. These templates demonstrate modern patterns like retrieval-augmented generation (RAG) and agent-based architectures.\n\n- [Intelligent app templates](/azure/developer/ai/intelligent-app-templates)\n\n### GitHub samples\n\nAccess a curated collection of GitHub samples demonstrating various development patterns and integrations.\n\n- [GitHub samples repository](https://github.com/github-samples)\n\n### Azure SDK samples repository    \n\nExplore the official Azure SDK for JavaScript samples repository on GitHub. This repository contains code samples for a wide range of Azure services, demonstrating how to use the Azure SDK in JavaScript applications.    \n\n- [Azure SDK for JavaScript samples](https://github.com/Azure/azure-sdk-for-js)\n\n### Azure samples browser\n\nBrowse a comprehensive collection of JavaScript, Node.js, and TypeScript samples across all Azure services. Use filters to find samples by service, scenario, or programming pattern.\n\n- [Azure samples browser for JavaScript](/samples/browse/?languages=javascript%2cnodejs%2ctypescript&toc=/azure/developer/javascript/toc.json&bc=/azure/developer/javascript/breadcrumb/toc.json)\n\n\n## AI and search\n\n### Azure AI Search\n\nLearn how to implement keyword search functionality in your JavaScript applications using [Azure AI Search](/azure/search/search-what-is-azure-search).\n\n- [Quickstart: Vector search](/azure/search/search-get-started-vector?tabs=keyless&pivots=javascript)\n- [Sample repository](/azure/search/samples-javascript)\n\n### Azure OpenAI with RAG\n\nBuild retrieval-augmented generation (RAG) applications using [Azure OpenAI](/azure/ai-services/openai/overview) and [Azure AI Search](/azure/search/search-what-is-azure-search).\n\n- [Quickstart: Build a RAG app with JavaScript](/azure/developer/javascript/get-started-app-chat-template)\n- [Sample repository](https://github.com/Azure-Samples/azure-search-openai-javascript)\n\n### Azure OpenAI Assistants\n\nCreate intelligent assistants with function calling capabilities using [Azure OpenAI Service](/azure/ai-services/openai/overview).\n\n- [Quickstart: Build an assistants app with function calling](/azure/developer/javascript/ai/get-started-app-chat-assistants-function-calling)\n- [Sample repository](https://github.com/Azure-Samples/azure-openai-assistant-javascript)\n\n## Data and storage\n\n### Azure Blob Storage\n\nWork with [Azure Blob Storage](/azure/storage/blobs/storage-blobs-overview) to upload, download, and manage blobs in your JavaScript applications.\n\n- [Quickstart: Upload and download blobs with JavaScript](/azure/storage/blobs/storage-quickstart-blobs-nodejs)\n- [Sample repository](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storage/)\n\n### Azure Cosmos DB\n\nBuild NoSQL applications using [Azure Cosmos DB](/azure/cosmos-db/introduction) with the JavaScript SDK.\n\n- [Quickstart: NoSQL JavaScript app](/azure/cosmos-db/nosql/quickstart-nodejs)\n- [Sample repository](https://github.com/Azure-Samples/cosmos-db-nosql-nodejs-quickstart)\n\n### Azure Queue Storage\n\nImplement message queuing in your applications using [Azure Queue Storage](/azure/storage/queues/storage-queues-introduction).\n\n- [Quickstart: Azure Queue Storage with JavaScript](/azure/storage/queues/storage-quickstart-queues-nodejs)\n- [Sample repository](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/storage/storage-queue)\n\n\n## Serverless and compute\n\n### Azure Functions (JavaScript)\n\nCreate serverless functions using JavaScript with [Azure Functions](/azure/azure-functions/functions-overview).\n\n- [Quickstart: HTTP trigger JavaScript function](/azure/azure-functions/create-first-function-vs-code-node)\n- [Samples](https://github.com/search?q=topic%3Aazure-functions+org%3AAzure-Samples+fork%3Atrue&type=repositories)\n\n### Azure Container Apps\n\nDeploy containerized Node.js applications to [Azure Container Apps](/azure/container-apps/overview).\n\n- [Quickstart: Deploy Node.js container](/azure/container-apps/quickstart-code-to-cloud)\n- [Samples](/azure/container-apps/samples)\n\n## Messaging and integration\n\n### Azure Event Hubs\n\nProcess millions of events per second from connected devices and applications using [Azure Event Hubs](/azure/event-hubs/event-hubs-about).\n\n- [Quickstart: Send and receive events with JavaScript](/azure/event-hubs/event-hubs-node-get-started-send)\n- [Sample repository](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/eventhub/)\n\n### Azure Service Bus\n\nBuild reliable and scalable cloud messaging between applications and services using [Azure Service Bus](/azure/service-bus-messaging/service-bus-messaging-overview).\n\n- [Quickstart: Send and receive messages with JavaScript](/azure/service-bus-messaging/service-bus-nodejs-how-to-use-queues)\n- [Sample repository](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/servicebus/)\n\n### Azure Event Grid\n\nBuild event-driven applications with [Azure Event Grid](/azure/event-grid/overview)'s publish-subscribe model.\n\n- [Sample repository](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/eventgrid/)\n\n## Identity and security\n\n### Azure Key Vault\n\nSecurely store and retrieve secrets in your JavaScript applications using [Azure Key Vault](/azure/key-vault/general/overview).\n\n- [Quickstart: Secrets with JavaScript](/azure/key-vault/secrets/quick-create-node)\n- [Sample repository](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/keyvault/)\n\n## Web apps\n\n### App Service with Node.js\n\nDeploy Node.js web applications to [Azure App Service](/azure/app-service/overview).\n\n- [Quickstart: Deploy Node.js web app](/azure/app-service/quickstart-nodejs)\n- [Sample repository](https://github.com/Azure-Samples/nodejs-docs-hello-world)\n\n## Related content\n\n- [Azure SDK for JavaScript documentation](/javascript/api/overview/azure/)\n- [JavaScript developer center](/azure/developer/javascript/)"
  },
  {
    "path": "articles/javascript/sdk/authentication/best-practices.md",
    "content": "---\ntitle: Authentication best practices with the Azure Identity library for JavaScript\ndescription: This article describes authentication best practices to follow when using the Azure Identity library for JavaScript.\nms.topic: concept-article\nms.date: 05/01/2025\n---\n\n# Authentication best practices with the Azure Identity library for JavaScript\n\nThis article offers guidelines to help you maximize the performance and reliability of your JavaScript and TypeScript apps when authenticating to Azure services. To make the most of the Azure Identity library for JavaScript, it's important to understand potential issues and mitigation techniques.\n\n## Use deterministic credentials in production environments\n\n[`DefaultAzureCredential`](/azure/developer/javascript/sdk/authentication/credential-chains#use-defaultazurecredential-for-flexibility) is the most approachable way to get started with the Azure Identity library, but that convenience also introduces certain tradeoffs. Most notably, the specific credential in the chain that will succeed and be used for request authentication can't be guaranteed ahead of time. In a production environment, this unpredictability can introduce significant and sometimes subtle problems.\n\nFor example, consider the following hypothetical sequence of events:\n\n1. An organization's security team mandates all apps use managed identity to authenticate to Azure resources.\n1. For months, a JavaScript app hosted on an Azure Virtual Machine (VM) successfully uses `DefaultAzureCredential` to authenticate via managed identity.\n1. Without telling the support team, a developer installs the Azure CLI on that VM and runs the `az login` command to authenticate to Azure.\n1. Due to this new separate configuration change in the Azure environment, authentication via the original managed identity unexpectedly begins to fail silently.\n1. `DefaultAzureCredential` skips the failed `ManagedIdentityCredential` and searches for the next available credential, which is `AzureCliCredential`.\n1. The application starts utilizing the Azure CLI credentials rather than the managed identity, which may fail or result in unexpected elevation or reduction of privileges.\n\nTo prevent these types of subtle issues or silent failures in production apps, replace `DefaultAzureCredential` with a specific `TokenCredential` implementation, such as `ManagedIdentityCredential`. See the [Azure Identity client library documentation](/javascript/api/overview/azure/identity-readme#credential-classes) for available credentials.\n\nFor example, consider the following `DefaultAzureCredential` configuration in an Express.js project:\n\n#### [JavaScript](#tab/javascript)\n\n```javascript\nimport { DefaultAzureCredential } from \"@azure/identity\";\nimport { SecretClient } from \"@azure/keyvault-secrets\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\nconst credential = new DefaultAzureCredential();\n\nconst secretClient = new SecretClient(\"https://keyVaultName.vault.azure.net\", credential);\nconst blobServiceClient = new BlobServiceClient(\n  \"https://storageAccountName.blob.core.windows.net\",\n  credential\n);\n```\n\nModify the preceding code to select a credential based on the environment in which the app is running:\n\n```javascript\nimport { AzureDeveloperCliCredential, ManagedIdentityCredential, ChainedTokenCredential, \n         AzureCliCredential } from \"@azure/identity\";\nimport { SecretClient } from \"@azure/keyvault-secrets\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\nlet credential;\n\n// In production, use only ManagedIdentityCredential\nif (process.env.NODE_ENV === 'production') {\n  // For user-assigned managed identity, provide the client ID\n  credential = new ManagedIdentityCredential(process.env.AZURE_CLIENT_ID);\n}\n// In development, use a chain of credentials appropriate for local work\nelse {\n  credential = new ChainedTokenCredential(\n    new AzureCliCredential(),\n    new AzureDeveloperCliCredential()\n  );\n}\n\n// Initialize Key Vault client\nconst secretClient = new SecretClient(\"https://keyVaultName.vault.azure.net\", credential);\n\n// Initialize Blob Storage client\nconst blobServiceClient = new BlobServiceClient(\n  \"https://storageAccountName.blob.core.windows.net\",\n  credential\n);\n```\n\n#### [TypeScript](#tab/typescript)\n\n```typescript\nimport { DefaultAzureCredential } from \"@azure/identity\";\nimport { SecretClient } from \"@azure/keyvault-secrets\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\nconst credential = new DefaultAzureCredential();\n\nconst secretClient = new SecretClient(\"https://keyVaultName.vault.azure.net\", credential);\nconst blobServiceClient = new BlobServiceClient(\n  \"https://storageAccountName.blob.core.windows.net\",\n  credential\n);\n```\n\nModify the preceding code to select a credential based on the environment in which the app is running:\n\n```typescript\nimport { AzureDeveloperCliCredential, ManagedIdentityCredential, ChainedTokenCredential, \n         AzureCliCredential } from \"@azure/identity\";\nimport { SecretClient } from \"@azure/keyvault-secrets\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\nlet credential;\n\n// In production, use only ManagedIdentityCredential\nif (process.env.NODE_ENV === 'production') {\n  // For user-assigned managed identity, provide the client ID\n  credential = new ManagedIdentityCredential(process.env.AZURE_CLIENT_ID);\n}\n// In development, use a chain of credentials appropriate for local work\nelse {\n  credential = new ChainedTokenCredential(\n    new AzureCliCredential(),\n    new AzureDeveloperCliCredential()\n  );\n}\n\n// Initialize Key Vault client\nconst secretClient = new SecretClient(\"https://keyVaultName.vault.azure.net\", credential);\n\n// Initialize Blob Storage client\nconst blobServiceClient = new BlobServiceClient(\n  \"https://storageAccountName.blob.core.windows.net\",\n  credential\n);\n```\n\n---\n\nIn this example, only `ManagedIdentityCredential` is used in production. The local development environment's authentication needs are then serviced by the sequence of credentials defined in the `else` clause.\n\n## Reuse credential instances\n\nReuse credential instances when possible to improve app resilience and reduce the number of access token requests issued to Microsoft Entra ID. When a credential is reused, an attempt is made to fetch a token from the app token cache managed by the underlying MSAL dependency. For more information, see [Token caching in the Azure Identity client library](https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/identity/identity/TOKEN_CACHING.md).\n\nToken caching behavior differs between browser and Node.js environments. In Node.js applications, tokens are cached in memory by default, which means the cache is lost when the application restarts. In browser applications, tokens can be persisted in browser storage (`localStorage` or `sessionStorage`) depending on the authentication flow and configuration. Understanding these differences is important when implementing credential reuse strategies for different application types.\n\n> [!IMPORTANT]\n> A high-volume app that doesn't reuse credentials may encounter HTTP 429 throttling responses from Microsoft Entra ID, which can lead to app outages.\n\nThe recommended credential reuse strategy differs by application framework.\n\n#### [JavaScript](#tab/javascript)\n\nTo implement credential reuse in JavaScript applications, create a single credential instance and reuse it across all client objects:\n\n```javascript\nimport { DefaultAzureCredential, ManagedIdentityCredential } from \"@azure/identity\";\nimport { SecretClient } from \"@azure/keyvault-secrets\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\n// Create a single credential instance\nconst credential = process.env.NODE_ENV === 'production'\n  ? new ManagedIdentityCredential(process.env.AZURE_CLIENT_ID)\n  : new DefaultAzureCredential();\n\n// Reuse the credential across different client objects\nconst secretClient = new SecretClient(\"https://keyVaultName.vault.azure.net\", credential);\nconst blobServiceClient = new BlobServiceClient(\n  \"https://storageAccountName.blob.core.windows.net\",\n  credential\n);\n```\n\nIn Express.js applications, you can store the credential in app settings and access it in your route handlers:\n\n```javascript\nimport express from \"express\";\nimport { DefaultAzureCredential, ManagedIdentityCredential } from \"@azure/identity\";\nimport { SecretClient } from \"@azure/keyvault-secrets\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\nconst app = express();\n\n// Create a single credential instance at app startup\napp.locals.credential = process.env.NODE_ENV === 'production'\n  ? new ManagedIdentityCredential(process.env.AZURE_CLIENT_ID)\n  : new DefaultAzureCredential();\n\n// Reuse the credential in route handlers\napp.get('/api/secrets/:secretName', async (req, res) => {\n  const secretClient = new SecretClient(\n    \"https://keyVaultName.vault.azure.net\", \n    req.app.locals.credential\n  );\n  \n  try {\n    const secret = await secretClient.getSecret(req.params.secretName);\n    res.json({ name: secret.name, value: secret.value });\n  } catch (error) {\n    res.status(500).json({ error: error.message });\n  }\n});\n\n// Add this route to the existing Express app\napp.get('/api/blobs/:containerName', async (req, res) => {\n  const blobServiceClient = new BlobServiceClient(\n    \"https://storageAccountName.blob.core.windows.net\", \n    req.app.locals.credential\n  );\n  \n  try {\n    // Get reference to a container\n    const containerClient = blobServiceClient.getContainerClient(req.params.containerName);\n    \n    // List all blobs in the container\n    const blobs = [];\n    for await (const blob of containerClient.listBlobsFlat()) {\n      blobs.push({\n        name: blob.name,\n        contentType: blob.properties.contentType,\n        size: blob.properties.contentLength,\n        lastModified: blob.properties.lastModified\n      });\n    }\n    \n    res.json({ containerName: req.params.containerName, blobs });\n  } catch (error) {\n    res.status(500).json({ error: error.message });\n  }\n});\n\napp.listen(3000, () => console.log('Server running on port 3000'));\n```\n\n#### [TypeScript](#tab/typescript)\n\nTo implement credential reuse in TypeScript applications, create a single credential instance and reuse it across all client objects:\n\n```typescript\nimport { DefaultAzureCredential, ManagedIdentityCredential } from \"@azure/identity\";\nimport { SecretClient } from \"@azure/keyvault-secrets\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\n// Create a single credential instance\nconst credential = process.env.NODE_ENV === 'production'\n  ? new ManagedIdentityCredential(process.env.AZURE_CLIENT_ID as string)\n  : new DefaultAzureCredential();\n\n// Reuse the credential across different client objects\nconst secretClient = new SecretClient(\"https://keyVaultName.vault.azure.net\", credential);\nconst blobServiceClient = new BlobServiceClient(\n  \"https://storageAccountName.blob.core.windows.net\",\n  credential\n);\n```\n\nIn Express.js applications, you can store the credential in app settings and access it in your route handlers:\n\n```typescript\nimport express from \"express\";\nimport { DefaultAzureCredential, ManagedIdentityCredential } from \"@azure/identity\";\nimport { SecretClient } from \"@azure/keyvault-secrets\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\nconst app = express();\n\n// Create a single credential instance at app startup\napp.locals.credential = process.env.NODE_ENV === 'production'\n  ? new ManagedIdentityCredential(process.env.AZURE_CLIENT_ID)\n  : new DefaultAzureCredential();\n\n// Reuse the credential in route handlers\napp.get('/api/secrets/:secretName', async (req, res) => {\n  const secretClient = new SecretClient(\n    \"https://keyVaultName.vault.azure.net\", \n    req.app.locals.credential\n  );\n  \n  try {\n    const secret = await secretClient.getSecret(req.params.secretName);\n    res.json({ name: secret.name, value: secret.value });\n  } catch (error) {\n    res.status(500).json({ error: error.message });\n  }\n});\n\n// Add this route to the existing Express app\napp.get('/api/blobs/:containerName', async (req, res) => {\n  const blobServiceClient = new BlobServiceClient(\n    \"https://storageAccountName.blob.core.windows.net\", \n    req.app.locals.credential\n  );\n  \n  try {\n    // Get reference to a container\n    const containerClient = blobServiceClient.getContainerClient(req.params.containerName);\n    \n    // List all blobs in the container\n    const blobs = [];\n    for await (const blob of containerClient.listBlobsFlat()) {\n      blobs.push({\n        name: blob.name,\n        contentType: blob.properties.contentType,\n        size: blob.properties.contentLength,\n        lastModified: blob.properties.lastModified\n      });\n    }\n    \n    res.json({ containerName: req.params.containerName, blobs });\n  } catch (error) {\n    res.status(500).json({ error: error.message });\n  }\n});\n\napp.listen(3000, () => console.log('Server running on port 3000'));\n```\n\n---\n\n## Understand when token lifetime and caching logic is needed\n\nIf you use an Azure Identity library credential outside the context of an Azure SDK client library, it becomes your responsibility to manage [token lifetime](/entra/identity-platform/access-tokens#token-lifetime) and caching behavior in your app.\n\nThe [`refreshAfterTimestamp`](/javascript/api/%40azure/identity/accesstoken#@azure-identity-accesstoken-refreshaftertimestamp) property on [AccessToken](/javascript/api/@azure/identity/accesstoken), which provides a hint to consumers as to when token refresh can be attempted, will be automatically used by Azure SDK client libraries that depend on the Azure Core library to refresh the token. For direct usage of Azure Identity library credentials that support token caching, the underlying MSAL cache automatically refreshes proactively when the `refreshAfterTimestamp` time occurs. This design allows the client code to call [TokenCredential.getToken()](/javascript/api/@azure/identity/tokencredential#@azure-identity-tokencredential-gettoken) each time a token is needed and delegate the refresh to the library.\n\nTo only call `TokenCredential.getToken()` when necessary, observe the `refreshAfterTimestamp` date and proactively attempt to refresh the token after that time. The specific implementation is up to the customer.\n\n## Understand the managed identity retry strategy\n\nThe Azure Identity library for JavaScript allows you to authenticate via managed identity with `ManagedIdentityCredential`. The way in which you use `ManagedIdentityCredential` impacts the applied retry strategy:\n\n- When used via `DefaultAzureCredential`, no retries are attempted when the initial token acquisition attempt fails or times out after a short duration. This is the least resilient option because it's optimized to \"fail fast\" for an efficient development inner loop.\n- Any other approach, such as `ChainedTokenCredential` or `ManagedIdentityCredential` directly:\n  - The time interval between retries starts at 0.8 seconds, and a maximum of five retries are attempted, by default. This option is optimized for resilience but introduces potentially unwanted delays in the development inner loop.\n  - To change any of the default retry settings, use the [retryOptions](/javascript/api/%40azure/core-rest-pipeline/pipelineretryoptions) property on options parameter. For example, retry a maximum of three times, with a starting interval of 0.5 seconds:\n\n#### [JavaScript](#tab/javascript)\n\n```javascript\nimport { ManagedIdentityCredential } from \"@azure/identity\";\n\nconst credential = new ManagedIdentityCredential(\n  process.env.AZURE_CLIENT_ID, // For user-assigned managed identity\n  {\n    retryOptions: {\n      maxRetries: 3,           // Maximum number of retry attempts\n      retryDelayInMs: 500,     // Initial delay between retries (in milliseconds)\n      maxRetryDelayInMs: 5000  // Maximum delay between retries (in milliseconds)\n    }\n  }\n);\n```\n\n#### [TypeScript](#tab/typescript)\n\n```typescript\nimport { ManagedIdentityCredential } from \"@azure/identity\";\n\nconst credential = new ManagedIdentityCredential(\n  process.env.AZURE_CLIENT_ID as string, // For user-assigned managed identity\n  {\n    retryOptions: {\n      maxRetries: 3,           // Maximum number of retry attempts\n      retryDelayInMs: 500,     // Initial delay between retries (in milliseconds)\n      maxRetryDelayInMs: 5000  // Maximum delay between retries (in milliseconds)\n    }\n  }\n);\n```\n\n---\n\nFor more information on customizing retry policies for managed identity, see one of the following options that extend from [TokenCredentialOptions](/javascript/api/%40azure/identity/tokencredentialoptions):\n\n* [ManagedIdentityCredentialClientIdOptions](/javascript/api/%40azure/identity/managedidentitycredentialclientidoptions)\n* [ManagedIdentityCredentialObjectIdOptions](/javascript/api/@azure/identity/managedidentitycredentialobjectidoptions)\n* [ManagedIdentityCredentialResourceIdOptions](/javascript/api/@azure/identity/managedidentitycredentialresourceidoptions)"
  },
  {
    "path": "articles/javascript/sdk/authentication/credential-chains.md",
    "content": "---\ntitle: 'Credential chains in the Azure Identity library for JavaScript'\ndescription: 'This article describes the DefaultAzureCredential and ChainedTokenCredential classes in the Azure Identity library for JavaScript.'\nms.topic: concept-article\nms.date: 10/09/2025\nms.custom: devx-track-js\nai-usage: ai-generated\n---\n\n# Credential chains in the Azure Identity library for JavaScript\n\nThe Azure Identity library provides *credentials*&mdash;public classes that implement the Azure Core library's [TokenCredential](/javascript/api/@azure/identity/tokencredential) interface. A credential represents a distinct authentication flow for acquiring an access token from Microsoft Entra ID. These credentials can be chained together to form an ordered sequence of authentication mechanisms to be attempted.\n\n## How a chained credential works\n\nAt runtime, a credential chain attempts to authenticate using the sequence's first credential. If that credential fails to acquire an access token, the next credential in the sequence is attempted, and so on, until an access token is successfully obtained. The following sequence diagram illustrates this behavior:\n\n:::image type=\"content\" source=\"../media/mermaidjs/chain-sequence.svg\" alt-text=\"Diagram illustrating the credential chain authentication flow with sequential attempts across multiple credentials until successful token acquisition.\":::\n\n## Why use credential chains\n\nA chained credential can offer the following benefits:\n\n- **Environment awareness**: Automatically selects the most appropriate credential based on the environment in which the app is running. Without it, you'd have to write code like this:\n\n    ```javascript\n    import { \n        ManagedIdentityCredential, \n        AzureCliCredential \n    } from \"@azure/identity\";\n\n    let credential;\n    if (process.env.NODE_ENV === \"production\") {\n        credential = new ManagedIdentityCredential();\n    } else {\n        credential = new AzureCliCredential();\n    }\n    ```\n\n- **Seamless transitions**: Your app can move from local development to your staging or production environment without changing authentication code.\n- **Improved resiliency**: Includes a fallback mechanism that moves to the next credential when the prior fails to acquire an access token.\n\n## How to choose a chained credential\n\nThere are two different approaches to credential chaining:\n\n- **\"Tear down\" a chain**: Start with a preconfigured chain and exclude what you don't need. For this approach, see the [DefaultAzureCredential overview](#defaultazurecredential-overview) section.\n- **\"Build up\" a chain**: Start with an empty chain and include only what you need. For this approach, see the [ChainedTokenCredential overview](#chainedtokencredential-overview) section.\n\n## DefaultAzureCredential overview\n\n[DefaultAzureCredential](/javascript/api/@azure/identity/defaultazurecredential) is an opinionated, preconfigured chain of credentials. It's designed to support many environments, along with the most common authentication flows and developer tools. In graphical form, the underlying chain looks like this:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-authentication-flow-inline.svg\" alt-text=\"Diagram of DefaultAzureCredential authentication flow showing the complete sequence from EnvironmentCredential through BrokerCredential.\" lightbox=\"../media/mermaidjs/default-azure-credential-authentication-flow-expanded.png\":::\n\nThe order in which `DefaultAzureCredential` attempts credentials follows.\n\n| Order | Credential          | Description | Enabled by default? |\n|-------|---------------------|-------------|---------------------|\n| 1     | [Environment][env-cred]         |Reads a collection of [environment variables][env-vars] to determine if an application service principal (application user) is configured for the app. If so, `DefaultAzureCredential` uses these values to authenticate the app to Azure. This method is most often used in server environments but can also be used when developing locally.             | Yes                 |\n| 2     | [Workload Identity][wi-cred]   |If the app is deployed to an Azure host with Workload Identity enabled, authenticate that account.             | Yes                 |\n| 3     | [Managed Identity][mi-cred]    |If the app is deployed to an Azure host with Managed Identity enabled, authenticate the app to Azure using that Managed Identity.             | Yes                 |\n| 4     | [Visual Studio Code][vsc-cred] |If the developer authenticated via Visual Studio Code's [Azure Resources extension][vsc-ext] and the [@azure/identity-vscode package][vsc-plugin-pkg] is installed, authenticate that account.             | Yes |\n| 5     | [Azure CLI][az-cred]           |If the developer authenticated to Azure using Azure CLI's `az login` command, authenticate the app to Azure using that same account.             | Yes                 |\n| 6     | [Azure PowerShell][pwsh-cred]    |If the developer authenticated to Azure using Azure PowerShell's `Connect-AzAccount` cmdlet, authenticate the app to Azure using that same account.             | Yes                 |\n| 7     | [Azure Developer CLI][azd-cred] |If the developer authenticated to Azure using Azure Developer CLI's `azd auth login` command, authenticate with that account.             | Yes                 |\n| 8     | [Broker][broker-cred] |Authenticates using the default account logged into the OS via a broker. Requires that the [@azure/identity-broker package][broker-plugin-pkg] is installed. | Yes |\n\n[env-cred]: /javascript/api/@azure/identity/environmentcredential\n[wi-cred]: /javascript/api/@azure/identity/workloadidentitycredential\n[mi-cred]: /javascript/api/@azure/identity/managedidentitycredential\n[vsc-cred]: /javascript/api/@azure/identity/visualstudiocodecredential\n[az-cred]: /javascript/api/@azure/identity/azureclicredential\n[pwsh-cred]: /javascript/api/@azure/identity/azurepowershellcredential\n[azd-cred]: /javascript/api/@azure/identity/azuredeveloperclicredential\n[broker-cred]: /javascript/api/@azure/identity/interactivebrowsercredential\n[vsc-ext]: https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureresourcegroups\n[vsc-plugin-pkg]: https://www.npmjs.com/package/@azure/identity-vscode\n[broker-plugin-pkg]: https://www.npmjs.com/package/@azure/identity-broker\n\nIn its simplest form, you can use the parameterless version of `DefaultAzureCredential` as follows:\n\n```javascript\nimport { DefaultAzureCredential } from \"@azure/identity\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\n// Acquire a credential object\nconst credential = new DefaultAzureCredential();\n\nconst blobServiceClient = new BlobServiceClient(\n    `https://${storageAccountName}.blob.core.windows.net`,\n    credential\n);\n```\n\n### How to customize DefaultAzureCredential\n\nThe following sections describe strategies for controlling which credentials are included in the chain.\n\n#### Exclude a credential type category\n\nTo exclude all `Developer tool` or `Deployed service` credentials, set environment variable `AZURE_TOKEN_CREDENTIALS` to `prod` or `dev`, respectively. When a value of `prod` is used, the underlying credential chain looks as follows:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-environment-variable-production.svg\" alt-text=\"Diagram of DefaultAzureCredential chain with AZURE_TOKEN_CREDENTIALS set to 'prod', showing only deployed service credentials including Environment, Workload Identity, and Managed Identity.\":::\n\nWhen a value of `dev` is used, the chain looks as follows:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-environment-variable-development.svg\" alt-text=\"Diagram of DefaultAzureCredential chain with AZURE_TOKEN_CREDENTIALS set to 'dev', showing only developer tool credentials including Visual Studio Code, Azure CLI, Azure PowerShell, Azure Developer CLI, and Broker.\":::\n\nTo ensure the environment variable is defined and set to a supported string, set the [requiredEnvVars](/javascript/api/@azure/identity/defaultazurecredentialoptions#@azure-identity-defaultazurecredentialoptions-requiredenvvars) property to `AZURE_TOKEN_CREDENTIALS`:\n\n```javascript\nconst credential = new DefaultAzureCredential({ \n    requiredEnvVars: [ \"AZURE_TOKEN_CREDENTIALS\" ]\n});\n```\n\n#### Use a specific credential\n\nTo exclude all credentials except for one, set environment variable `AZURE_TOKEN_CREDENTIALS` to the credential name. For example, you can reduce the `DefaultAzureCredential` chain to `AzureCliCredential` by setting `AZURE_TOKEN_CREDENTIALS` to `AzureCliCredential`. The string comparison is performed in a case-insensitive manner. Valid string values for the environment variable include:\n\n- `AzureCliCredential`\n- `AzureDeveloperCliCredential`\n- `AzurePowerShellCredential`\n- `EnvironmentCredential`\n- `ManagedIdentityCredential`\n- `VisualStudioCodeCredential`\n- `WorkloadIdentityCredential`\n\n> [!IMPORTANT]\n> The `AZURE_TOKEN_CREDENTIALS` environment variable supports individual credential names in `@azure/identity` package versions 4.11.0 and later.\n\nTo ensure the environment variable is defined and set to a supported string, set property [requiredEnvVars](/javascript/api/@azure/identity/defaultazurecredentialoptions#@azure-identity-defaultazurecredentialoptions-requiredenvvars) to `AZURE_TOKEN_CREDENTIALS`:\n\n```javascript\nconst credential = new DefaultAzureCredential({ \n    requiredEnvVars: [ \"AZURE_TOKEN_CREDENTIALS\" ]\n});\n```\n\n## ChainedTokenCredential overview\n\n[ChainedTokenCredential](/javascript/api/@azure/identity/chainedtokencredential) is an empty chain to which you add credentials to suit your app's needs. For example:\n\n```javascript\nimport { \n    ChainedTokenCredential, \n    AzureCliCredential, \n    VisualStudioCodeCredential \n} from \"@azure/identity\";\n\nconst credential = new ChainedTokenCredential(\n    new AzureCliCredential(),\n    new VisualStudioCodeCredential()\n);\n\nconst blobServiceClient = new BlobServiceClient(\n    `https://${storageAccountName}.blob.core.windows.net`,\n    credential\n);\n```\n\nThe preceding code sample creates a tailored credential chain comprised of two development-time credentials. `AzureCliCredential` is attempted first, followed by `VisualStudioCodeCredential`, if necessary. In graphical form, the chain looks like this:\n\n:::image type=\"content\" source=\"../media/mermaidjs/chained-token-credential-authentication-developer-flow.svg\" alt-text=\"Diagram of ChainedTokenCredential configuration showing AzureCliCredential as the primary authentication method with VisualStudioCodeCredential as the secondary fallback option.\":::\n\n> [!TIP]\n> For improved performance, optimize credential ordering in `ChainedTokenCredential` from most to least used credential.\n\n## Usage guidance for DefaultAzureCredential\n\n`DefaultAzureCredential` is undoubtedly the easiest way to get started with the Azure Identity library, but with that convenience comes tradeoffs. Once you deploy your app to Azure, you should understand the app's authentication requirements. For that reason, replace `DefaultAzureCredential` with a specific `TokenCredential` implementation, such as `ManagedIdentityCredential`.\n\nHere's why:\n\n- **Debugging challenges**: When authentication fails, it can be challenging to debug and identify the offending credential. You must enable logging to see the progression from one credential to the next and the success/failure status of each. For more information, see [Debug a credential](#debug-a-credential).\n- **Performance overhead**: The process of sequentially trying multiple credentials can introduce performance overhead. For example, when running on a local development machine, managed identity is unavailable. Consequently, `ManagedIdentityCredential` always fails in the local development environment.\n- **Unpredictable behavior**: `DefaultAzureCredential` checks for the presence of certain [environment variables][env-vars]. It's possible that someone could add or modify these environment variables at the system level on the host machine. Those changes apply globally and therefore alter the behavior of `DefaultAzureCredential` at runtime in any app running on that machine.\n\n## Debug a credential\n\nTo diagnose an unexpected issue or to understand what a credential is doing, [enable logging](../debug-client-libraries.md) in your app. For example:\n\n```javascript\nimport { setLogLevel, AzureLogger } from \"@azure/logger\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\nimport { DefaultAzureCredential } from \"@azure/identity\";\n\n// Constant for the Azure Identity log prefix\nconst AZURE_IDENTITY_LOG_PREFIX = \"azure:identity\";\n\n// override logging to output to console.log (default location is stderr)\n// only log messages that start with the Azure Identity log prefix\nsetLogLevel(\"verbose\");\nAzureLogger.log = (...args) => {\n  const message = args[0];\n  if (typeof message === 'string' && message.startsWith(AZURE_IDENTITY_LOG_PREFIX)) {\n    console.log(...args);\n  }\n};\n\n// Get storage account name from environment variable\nconst storageAccountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;\n\nif (!storageAccountName) {\n    throw new Error(\"AZURE_STORAGE_ACCOUNT_NAME environment variable is required\");\n}\n\nconst credential = new DefaultAzureCredential({ \n    requiredEnvVars: [ \"AZURE_TOKEN_CREDENTIALS\" ]\n});\n\n\nconst blobServiceClient = new BlobServiceClient(\n    `https://${storageAccountName}.blob.core.windows.net`,\n    credential\n);\n```\n\n```console\nazure:identity:info EnvironmentCredential => Found the following environment variables: \nazure:identity:verbose EnvironmentCredential => AZURE_CLIENT_SEND_CERTIFICATE_CHAIN: undefined; sendCertificateChain: false\nazure:identity:info WorkloadIdentityCredential => Found the following environment variables:\nazure:identity:warning DefaultAzureCredential => Skipped createDefaultWorkloadIdentityCredential because of an error creating the credential: CredentialUnavailableError: WorkloadIdentityCredential: is unavailable. clientId is a required parameter. In DefaultAzureCredential and ManagedIdentityCredential, this can be provided as an environment variable - \"AZURE_CLIENT_ID\".\n        See the troubleshooting guide for more information: https://aka.ms/azsdk/js/identity/workloadidentitycredential/troubleshoot\nazure:identity:info ManagedIdentityCredential => Using DefaultToImds managed identity.\nazure:identity:warning DefaultAzureCredential => Skipped createDefaultBrokerCredential because of an error creating the credential: Error: Broker for WAM was requested, but no plugin was configured or no authentication record was found. You must install the @azure/identity-broker plugin package (npm install --save @azure/identity-broker) and enable it by importing `useIdentityPlugin` from `@azure/identity` and calling useIdentityPlugin(nativeBrokerPlugin) before using enableBroker.\nazure:identity:info DefaultAzureCredential => getToken() => Skipping createDefaultWorkloadIdentityCredential, reason: WorkloadIdentityCredential: is unavailable. clientId is a required parameter. In DefaultAzureCredential and ManagedIdentityCredential, this can be provided as an environment variable - \"AZURE_CLIENT_ID\".\n        See the troubleshooting guide for more information: https://aka.ms/azsdk/js/identity/workloadidentitycredential/troubleshoot\nazure:identity:info ManagedIdentityCredential => getToken() => Using the MSAL provider for Managed Identity.\nazure:identity:info ManagedIdentityCredential - Token Exchange => ManagedIdentityCredential - Token Exchange: Unavailable. The environment variables needed are: AZURE_CLIENT_ID (or the client ID sent through the parameters), AZURE_TENANT_ID and AZURE_FEDERATED_TOKEN_FILE\nazure:identity:info ManagedIdentityCredential => getToken() => MSAL Identity source: DefaultToImds\nazure:identity:info ManagedIdentityCredential => getToken() => Using the IMDS endpoint to probe for availability.\nazure:identity:info ManagedIdentityCredential - IMDS => ManagedIdentityCredential - IMDS: Pinging the Azure IMDS endpoint\nazure:identity:verbose ManagedIdentityCredential - IMDS => ManagedIdentityCredential - IMDS: Caught error RestError: connect ENETUNREACH 169.254.169.254:80\nazure:identity:info ManagedIdentityCredential - IMDS => ManagedIdentityCredential - IMDS: The Azure IMDS endpoint is unavailable\nazure:identity:error ManagedIdentityCredential => getToken() => ERROR. Scopes: https://storage.azure.com/.default. Error message: Attempted to use the IMDS endpoint, but it is not available..\nazure:identity:info AzureCliCredential => getToken() => Using the scope https://storage.azure.com/.default\nazure:identity:info AzureCliCredential => getToken() => expires_on is available and is valid, using it\nazure:identity:info AzureCliCredential => getToken() => SUCCESS. Scopes: https://storage.azure.com/.default.\n```\n\nIn the preceding output, notice that `DefaultAzureCredential` successfully acquired a token using `AzureCliCredential`.\n\n<!-- LINKS -->\n[env-vars]: https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/identity/identity/README.md#environment-variables"
  },
  {
    "path": "articles/javascript/sdk/authentication/includes/developer-tooling-javascript.md",
    "content": "---\nauthor: diberry\nms.service: azure\nms.topic: include\nms.date: 02/18/2026\nms.author: diberry\n---\n## Sign-in to Azure using developer tooling\n\nNext, sign-in to Azure using one of several developer tools that can be used to perform authentication in your development environment. The account you authenticate should also exist in the Microsoft Entra group you created and configured earlier.\n\n### [Azure CLI](#tab/sign-in-azure-cli)\n\n[!INCLUDE [sign-in-azure-cli](../../../../includes/authentication/sign-in-azure-cli.md)]\n\n### [Azure Developer CLI](#tab/sign-in-azure-developer-cli)\n\n[!INCLUDE [sign-in-azure-developer-cli](../../../../includes/authentication/sign-in-azure-developer-cli.md)]\n\n### [Azure PowerShell](#tab/sign-in-azure-powershell)\n\n[!INCLUDE [sign-in-azure-powershell](../../../../includes/authentication/sign-in-azure-powershell.md)]\n\n### [Visual Studio Code](#tab/sign-in-visual-studio-code)\n\n[!INCLUDE [sign-in-visual-studio-code](../../../../includes/authentication/sign-in-visual-studio-code.md)]\n\n---"
  },
  {
    "path": "articles/javascript/sdk/authentication/includes/implement-default-azure-credential.md",
    "content": "---\nauthor: diberry\nms.service: azure-javascript\nms.topic: include\nms.date: 09/22/2025\nms.author: diberry\n---\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library](/javascript/api/overview/azure/identity-readme) provides various *credentials*&mdash;implementations of `TokenCredential` adapted to supporting different scenarios and Microsoft Entra authentication flows. The steps ahead demonstrate how to use `DefaultAzureCredential` when working with user accounts locally.\n\n### Implement the code\n\n[DefaultAzureCredential](/azure/developer/javascript/sdk/authentication/credential-chains#use-defaultazurecredential-for-flexibility) is an opinionated, ordered sequence of mechanisms for authenticating to Microsoft Entra ID. Each authentication mechanism is a class derived from the [TokenCredential](/javascript/api/@azure/identity/defaultazurecredential) class and is known as a *credential*. At runtime, `DefaultAzureCredential` attempts to authenticate using the first credential. If that credential fails to acquire an access token, the next credential in the sequence is attempted, and so on, until an access token is successfully obtained. In this way, your app can use different credentials in different environments without writing environment-specific code.\n\nTo use `DefaultAzureCredential`, add the [@azure/identity](https://www.npmjs.com/package/@azure/identity) packages to your application. In a terminal of your choice, navigate to the application project directory and run the following command:\n\n```console\nnpm install @azure/identity\n```\n\nAzure services are accessed using specialized client classes from the various Azure SDK client libraries. These classes and your own custom services should be registered so they can be accessed throughout your app. Complete the following programmatic steps to create a client class and `DefaultAzureCredential`:\n\n1. Import the `@azure/identity` package.\n1. Create the Azure service client, and pass to it a new instance of `DefaultAzureCredential`.\n\n\n```typescript\nimport { DefaultAzureCredential } from \"@azure/identity\";\nimport { SomeAzureServiceClient } from \"@azure/arm-some-service\";\n\nconst client = new SomeAzureServiceClient(new DefaultAzureCredential());\n```\n"
  },
  {
    "path": "articles/javascript/sdk/authentication/includes/implement-local-development-credential.md",
    "content": "---\nauthor: diberry\nms.service: azure-javascript\nms.topic: include\nms.date: 01/21/2026\nms.author: diberry\n---\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library](/javascript/api/overview/azure/identity-readme) provides implementations of [TokenCredential](/javascript/api/@azure/core-auth/tokencredential) that support various scenarios and Microsoft Entra authentication flows. The following steps demonstrate how to use [DefaultAzureCredential](/azure/developer/javascript/sdk/authentication/credential-chains#use-defaultazurecredential-for-flexibility) or a specific development tool credential when working with user accounts locally.\n\n> [!TIP]\n> When your team uses multiple development tools to authenticate with Azure, prefer a local development-optimized instance of `DefaultAzureCredential` over tool-specific credentials.\n\n### Implement the code\n\n1. Add the [@azure/identity](https://www.npmjs.com/package/@azure/identity) package to your application.\n\n    ```console\n    npm install @azure/identity\n    ```\n\n    > [!NOTE]\n    > If you want to use `VisualStudioCodeCredential`, you must also install the [@azure/identity-vscode](https://www.npmjs.com/package/@azure/identity-vscode) plugin package. Then explicitly load the credential. For an example, see the [@azure/identity-vscode README](https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/identity/identity-vscode/README.md#examples).\n\n1. Choose _one_ of the credential implementations based on your scenario.\n\n    - [Use a credential specific to your development tool](#use-a-credential-specific-to-your-development-tool): this option is best for single person or single tool scenarios.\n    - [Use a credential available for use in any development tool](#use-a-credential-available-for-use-in-any-development-tool): this option is best for open source projects and diverse tool teams.\n\n#### Use a credential specific to your development tool\n\nPass a `TokenCredential` instance corresponding to a specific development tool to the Azure service client constructor, such as `AzureCliCredential`.\n\n```typescript\nimport { AzureCliCredential } from \"@azure/identity\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\nconst credential = new AzureCliCredential();\n\nconst client = new BlobServiceClient(\n    \"https://<storage-account-name>.blob.core.windows.net\",\n    credential\n);\n```\n\n#### Use a credential available for use in any development tool\n\nUse a `DefaultAzureCredential` instance optimized for all local development tools. This example requires the environment variable `AZURE_TOKEN_CREDENTIALS` set to `dev`. For more information, see [Exclude a credential type category](/azure/developer/javascript/sdk/authentication/credential-chains#exclude-a-credential-type-category).\n\n```typescript\nimport { DefaultAzureCredential } from \"@azure/identity\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\n\n// Set environment variable AZURE_TOKEN_CREDENTIALS to \"dev\"\nconst credential = new DefaultAzureCredential({\n    requiredEnvVars: [\"AZURE_TOKEN_CREDENTIALS\"]\n});\n\nconst client = new BlobServiceClient(\n    \"https://<storage-account-name>.blob.core.windows.net\",\n    credential\n);\n```\n"
  },
  {
    "path": "articles/javascript/sdk/authentication/includes/implement-managed-identity-concepts.md",
    "content": "---\nms.topic: include\nms.date: 08/15/2025\n---\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library](/javascript/api/%40azure/identity/) provides various *credentials* - implementations of [`TokenCredential`](/javascript/api/@azure/core-auth/tokencredential) adapted to supporting different scenarios and Microsoft Entra authentication flows. Since managed identity is unavailable when running locally, the steps ahead demonstrate which credential to use in which scenario:\n\n- **Local dev environment**: During **local development only**, use a class called [DefaultAzureCredential](../credential-chains.md#defaultazurecredential-overview) for an opinionated, preconfigured chain of credentials. [`DefaultAzureCredential`](/javascript/api/@azure/identity/defaultazurecredential) discovers user credentials from your local tooling or IDE, such as the Azure CLI or Visual Studio Code. It also provides flexibility and convenience for retries, wait times for responses, and support for multiple authentication options. Visit the [Authenticate to Azure services during local development](../local-development-environment-developer-account.md) article to learn more.\n- **Azure-hosted apps**: When your app is running in Azure, use [`ManagedIdentityCredential`](/javascript/api/@azure/identity/managedidentitycredential) to safely discover the managed identity configured for your app. Specifying this exact type of credential prevents other available credentials from being picked up unexpectedly."
  },
  {
    "path": "articles/javascript/sdk/authentication/includes/set-environment-variables-javascript.md",
    "content": "---\nms.topic: include\nms.date: 01/05/2026\n---\n\n## Set the app environment variables\n\nAt runtime, certain credentials from the [Azure Identity library](/javascript/api/overview/azure/identity-readme?view=azure-node-latest&preserve-view=true), such as `DefaultAzureCredential`, ` EnvironmentCredential`, and `ClientSecretCredential`, search for service principal information by convention in the environment variables. There are multiple ways to configure environment variables when working with JavaScript, depending on your tooling and environment.\n\nRegardless of the approach you choose, configure the following environment variables for a service principal:\n\n- `AZURE_CLIENT_ID`: Used to identify the registered app in Azure.\n- `AZURE_TENANT_ID`: The ID of the Microsoft Entra tenant.\n- `AZURE_CLIENT_SECRET`: The secret credential that was generated for the app.\n\n### [Visual Studio Code](#tab/vs-code)\n\nIn Visual Studio Code, environment variables can be set in the `launch.json` file of your project. These values are pulled in automatically when the app starts. However, these configurations don't travel with your app during deployment, so you need to set up environment variables on your target hosting environment.\n\n```json\n\"configurations\": [\n{\n    \"env\": {\n        \"NODE_ENV\": \"development\",\n        \"AZURE_CLIENT_ID\": \"<your-client-id>\",\n        \"AZURE_TENANT_ID\":\"<your-tenant-id>\",\n        \"AZURE_CLIENT_SECRET\": \"<your-client-secret>\"\n    }\n}\n```\n\n### [Windows](#tab/windows)\n\nYou can set environment variables for Windows from the command line. However, the values are accessible to all apps running on that operating system and could cause conflicts, so use caution with this approach. Environment variables can be set at the user or system level.\n\n```bash\n# Set user environment variables\nsetx NODE_ENV \"development\"\nsetx AZURE_CLIENT_ID \"<your-client-id>\"\nsetx AZURE_TENANT_ID \"<your-tenant-id>\"\nsetx AZURE_CLIENT_SECRET \"<your-client-secret>\"\n\n# Set system environment variables - requires running as admin\nsetx NODE_ENV \"development\" /m\nsetx AZURE_CLIENT_ID \"<your-client-id>\" /m\nsetx AZURE_TENANT_ID \"<your-tenant-id>\" /m\nsetx AZURE_CLIENT_SECRET \"<your-client-secret>\" /m\n```\n\nPowerShell can also be used to set environment variables at the user or system level:\n\n```powershell\n# Set user environment variables\n[Environment]::SetEnvironmentVariable(\"NODE_ENV\", \"development\", \"User\")\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_ID\", \"<your-client-id>\", \"User\")\n[Environment]::SetEnvironmentVariable(\"AZURE_TENANT_ID\", \"<your-tenant-id>\", \"User\")\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_SECRET\", \"<your-client-secret>\", \"User\")\n\n# Set system environment variables - requires running as admin\n[Environment]::SetEnvironmentVariable(\"NODE_ENV\", \"development\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_ID\", \"<your-client-id>\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"AZURE_TENANT_ID\", \"<your-tenant-id>\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_SECRET\", \"<your-client-secret>\", \"Machine\")\n```\n\n### [.env file](#tab/env-file)\n\nFor local development, you can use a `.env` file. Node.js 20.6.0 and later support the `--env-file` flag to automatically load environment variables from a `.env` file.\n\n1. Create a `.env` file in your project root:\n\n    ```bash\n    AZURE_CLIENT_ID=<your-client-id>\n    AZURE_TENANT_ID=<your-tenant-id>\n    AZURE_CLIENT_SECRET=<your-client-secret>\n    ```\n\n1. Run your application with the `--env-file` flag:\n\n    ```bash\n    node --env-file=.env app.js\n    ```\n\nFor earlier Node.js versions, you can use the [dotenv](https://www.npmjs.com/package/dotenv) npm package:\n\n1. Install the `dotenv` package:\n\n    ```bash\n    npm install dotenv\n    ```\n\n1. Load the environment variables in your application:\n\n    ```javascript\n    import 'dotenv/config';\n    ```\n\n> [!CAUTION]\n> Never commit `.env` files or client secrets to source control. Add `.env` to your `.gitignore` file.\n\n---\n"
  },
  {
    "path": "articles/javascript/sdk/authentication/includes/user-assigned-implement-code-js.md",
    "content": "---\nms.topic: include\nms.date: 03/20/2026\n---\n### Implement the code\n\nIn a JavaScript project, add the [@azure/identity](https://www.npmjs.com/package/@azure/identity) package. In a terminal of your choice, navigate to the application project directory and run the following commands:\n\n```console\nnpm install @azure/identity\n```\n\nAzure services are accessed using specialized client classes from the various Azure SDK client libraries. In `index.js`, complete the following steps to configure token-based authentication:\n\n1. Import the `@azure/identity` package.\n1. Pass an appropriate `TokenCredential` instance to the client:\n    - Use `DefaultAzureCredential` when your app is running locally.\n    - Use `ManagedIdentityCredential` when your app is running in Azure and configure either the client ID, resource ID, or object ID.\n\n## [Client ID](#tab/client-id)\n\nThe client ID is used to identify a managed identity when configuring applications or services that need to authenticate using that identity.\n\n1. Retrieve the client ID assigned to a user-assigned managed identity using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query 'clientId'\n    ```\n\n1. Configure `ManagedIdentityCredential` with the client ID:\n\n    ```javascript\n    import { BlobServiceClient } from '@azure/storage-blob';\n    import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity';\n    \n    function createBlobServiceClient() {\n        const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;\n        if (!accountName) throw Error('Azure Storage accountName not found');\n        const url = `https://${accountName}.blob.core.windows.net`;\n    \n        if (process.env.NODE_ENV === \"production\") {\n            const clientId = process.env.AZURE_CLIENT_ID;\n            if (!clientId) throw Error('AZURE_CLIENT_ID not found for Managed Identity');\n            return new BlobServiceClient(url, new ManagedIdentityCredential({clientId}));\n        } else {\n            return new BlobServiceClient(url, new DefaultAzureCredential());\n        }\n    }\n    \n    async function main() {\n        try {\n            const blobServiceClient = createBlobServiceClient();\n            const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME);\n            // do something with client\n            const properties = await containerClient.getProperties();\n    \n            console.log(properties);\n        } catch (err) {\n            console.error(\"Error retrieving container properties:\", err.message);\n            throw err;\n        }\n    }\n    \n    main().catch((err) => {\n        console.error(\"Error running sample:\", err.message);\n        process.exit(1);\n    });\n    ```\n\n## [Resource ID](#tab/resource-id)\n\nThe resource ID uniquely identifies the managed identity resource within your Azure subscription using the following structure:\n\n`/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}`\n\nResource IDs can be built by convention, which makes them more convenient when working with a large number of user-assigned managed identities in your environment.\n\n1. Retrieve the resource ID for a user-assigned managed identity using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query 'id'\n    ```\n\n1. Configure `ManagedIdentityCredential` with the resource ID:\n\n    ```javascript\n    import { BlobServiceClient } from '@azure/storage-blob';\n    import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity';\n    \n    \n    function createBlobServiceClient() {\n        const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;\n        if (!accountName) throw Error('Azure Storage accountName not found');\n        const url = `https://${accountName}.blob.core.windows.net`;\n    \n        if (process.env.NODE_ENV === \"production\") {\n            const resourceId = process.env.AZURE_RESOURCE_ID;\n            if (!resourceId) throw Error('AZURE_RESOURCE_ID not found for Managed Identity');\n            return new BlobServiceClient(url, new ManagedIdentityCredential({resourceId}));\n        } else {\n            return new BlobServiceClient(url, new DefaultAzureCredential());\n        }\n    }\n    \n    async function main() {\n        try {\n            const blobServiceClient = createBlobServiceClient();\n            const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME);\n            // do something with client\n            const properties = await containerClient.getProperties();\n    \n            console.log(properties);\n        } catch (err) {\n            console.error(\"Error retrieving container properties:\", err.message);\n            throw err;\n        }\n    }\n    \n    main().catch((err) => {\n        console.error(\"Error running sample:\", err.message);\n        process.exit(1);\n    });\n    ```\n\n## [Object ID](#tab/object-id)\n\nA principal ID is another name for an object ID.\n\n1. Retrieve the object ID for a user-assigned managed identity using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query 'principalId'\n    ```\n\n1. Configure `ManagedIdentityCredential` with the object ID:\n\n    ```javascript\n    import { BlobServiceClient } from '@azure/storage-blob';\n    import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity';\n    \n    \n    function createBlobServiceClient() {\n        const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;\n        if (!accountName) throw Error('Azure Storage accountName not found');\n        const url = `https://${accountName}.blob.core.windows.net`;\n    \n        if (process.env.NODE_ENV === \"production\") {\n            const objectId = process.env.AZURE_OBJECT_ID;\n            if (!objectId) throw Error('AZURE_OBJECT_ID not found for Managed Identity');\n            return new BlobServiceClient(url, new ManagedIdentityCredential({objectId}));\n        } else {\n            return new BlobServiceClient(url, new DefaultAzureCredential());\n        }\n    }\n    \n    async function main() {\n        try {\n            const blobServiceClient = createBlobServiceClient();\n            const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME);\n            // do something with client\n            const properties = await containerClient.getProperties();\n    \n            console.log(properties);\n        } catch (err) {\n            console.error(\"Error retrieving container properties:\", err.message);\n            throw err;\n        }\n    }\n    \n    main().catch((err) => {\n        console.error(\"Error running sample:\", err.message);\n        process.exit(1);\n    });\n    ```\n\n---"
  },
  {
    "path": "articles/javascript/sdk/authentication/includes/user-assigned-implement-code-ts.md",
    "content": "---\nms.topic: include\nms.date: 03/20/2026\n---\n### Implement the code\n\nIn a TypeScript project, add the [@azure/identity](https://www.npmjs.com/package/@azure/identity) package. In a terminal of your choice, navigate to the application project directory and run the following commands:\n\n```console\nnpm install typescript @azure/identity @types/node\n```\n\nAzure services are accessed using specialized client classes from the various Azure SDK client libraries. In `index.js`, complete the following steps to configure token-based authentication:\n\n1. Import the `@azure/identity` package.\n1. Pass an appropriate `TokenCredential` instance to the client:\n    - Use `DefaultAzureCredential` when your app is running locally\n    - Use `ManagedIdentityCredential` when your app is running in Azure and configure either the client ID, resource ID, or object ID.\n\n## [Client ID](#tab/client-id)\n\nThe client ID is used to identify a managed identity when configuring applications or services that need to authenticate using that identity.\n\n1. Retrieve the client ID assigned to a user-assigned managed identity using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query 'clientId'\n    ```\n\n1. Configure `ManagedIdentityCredential` with the client ID:\n\n    ```typescript\n    import { BlobServiceClient } from '@azure/storage-blob';\n    import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity';\n    \n    function createBlobServiceClient(): BlobServiceClient {\n        const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;\n        if (!accountName) throw Error('Azure Storage accountName not found');\n        const url = `https://${accountName}.blob.core.windows.net`;\n    \n        if (process.env.NODE_ENV === \"production\") {\n            const clientId = process.env.AZURE_CLIENT_ID;\n            if (!clientId) throw Error('AZURE_CLIENT_ID not found for Managed Identity');\n            return new BlobServiceClient(url, new ManagedIdentityCredential({clientId}));\n        } else {\n            return new BlobServiceClient(url, new DefaultAzureCredential());\n        }\n    }\n    \n    async function main(): Promise<void> {\n        try {\n            const blobServiceClient = createBlobServiceClient();\n            const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME!);\n            const properties = await containerClient.getProperties();\n    \n            console.log(properties);\n        } catch (err: any) {\n            console.error(\"Error retrieving container properties:\", err.message);\n            throw err;\n        }\n    }\n    \n    main().catch((err: Error) => {\n        console.error(\"Error running sample:\", err.message);\n        process.exit(1);\n    });\n    ```\n\n## [Resource ID](#tab/resource-id)\n\nThe resource ID uniquely identifies the managed identity resource within your Azure subscription using the following structure:\n\n`/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}`\n\nResource IDs can be built by convention, which makes them more convenient when working with a large number of user-assigned managed identities in your environment.\n\n1. Retrieve the resource ID for a user-assigned managed identity using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query 'id'\n    ```\n\n1. Configure `ManagedIdentityCredential` with the resource ID:\n\n    ```typescript\n    import { BlobServiceClient } from '@azure/storage-blob';\n    import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity';\n    \n    function createBlobServiceClient(): BlobServiceClient {\n        const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;\n        if (!accountName) throw Error('Azure Storage accountName not found');\n        const url = `https://${accountName}.blob.core.windows.net`;\n    \n        if (process.env.NODE_ENV === \"production\") {\n            const resourceId = process.env.AZURE_RESOURCE_ID;\n            if (!resourceId) throw Error('AZURE_RESOURCE_ID not found for Managed Identity');\n            return new BlobServiceClient(url, new ManagedIdentityCredential({resourceId}));\n        } else {\n            return new BlobServiceClient(url, new DefaultAzureCredential());\n        }\n    }\n    \n    async function main(): Promise<void> {\n        try {\n            const blobServiceClient = createBlobServiceClient();\n            const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME!);\n            const properties = await containerClient.getProperties();\n    \n            console.log(properties);\n        } catch (err: any) {\n            console.error(\"Error retrieving container properties:\", err.message);\n            throw err;\n        }\n    }\n    \n    main().catch((err: Error) => {\n        console.error(\"Error running sample:\", err.message);\n        process.exit(1);\n    });\n    ```\n\n## [Object ID](#tab/object-id)\n\nA principal ID is another name for an object ID.\n\n1. Retrieve the object ID for a user-assigned managed identity using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query 'principalId'\n    ```\n\n1. Configure `ManagedIdentityCredential` with the object ID:\n\n    ```typescript\n    import { BlobServiceClient } from '@azure/storage-blob';\n    import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity';\n    \n    function createBlobServiceClient(): BlobServiceClient {\n        const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;\n        if (!accountName) throw Error('Azure Storage accountName not found');\n        const url = `https://${accountName}.blob.core.windows.net`;\n    \n        if (process.env.NODE_ENV === \"production\") {\n            const objectId = process.env.AZURE_OBJECT_ID;\n            if (!objectId) throw Error('AZURE_OBJECT_ID not found for Managed Identity');\n            return new BlobServiceClient(url, new ManagedIdentityCredential({objectId}));\n        } else {\n            return new BlobServiceClient(url, new DefaultAzureCredential());\n        }\n    }\n    \n    async function main(): Promise<void> {\n        try {\n            const blobServiceClient = createBlobServiceClient();\n            const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME!);\n            const properties = await containerClient.getProperties();\n    \n            console.log(properties);\n        } catch (err: any) {\n            console.error(\"Error retrieving container properties:\", err.message);\n            throw err;\n        }\n    }\n    \n    main().catch((err: Error) => {\n        console.error(\"Error running sample:\", err.message);\n        process.exit(1);\n    });\n    ```\n\n---"
  },
  {
    "path": "articles/javascript/sdk/authentication/local-development-broker.md",
    "content": "---\ntitle: Authenticate JavaScript apps to Azure using brokered authentication.\nms.reviewer: diberry\nms.author: diberry\nauthor: diberry\ndescription: Learn how to authenticate your app to Azure services when using the Azure SDK for JavaScript during local development using brokered authentication.\nms.date: 11/13/2025\nms.topic: how-to\nms.custom: devx-track-js\nzone_pivot_group_filename: developer/pivots.yml\nzone_pivot_groups: pivot-os-windows-linux\n---\n\n# Authenticate JavaScript apps to Azure services during local development using brokered authentication\n\n[!INCLUDE [broker-introduction](../../../includes/authentication/broker-introduction.md)]\n\n:::zone target=\"docs\" pivot=\"os-windows\"\n\n[!INCLUDE [broker-windows](../../../includes/authentication/broker-windows.md)]\n\n:::zone-end\n\n:::zone target=\"docs\" pivot=\"os-linux\"\n\n[!INCLUDE [broker-linux](../../../includes/authentication/broker-linux.md)]\n\n:::zone-end\n\n[!INCLUDE [broker-configure-application](../../../includes/authentication/broker-configure-application.md)]\n\n[!INCLUDE [broker-assign-roles](../../../includes/authentication/broker-assign-roles.md)]\n\n## Implement the code\n\nThe Azure Identity library supports brokered authentication using [InteractiveBrowserCredential](/javascript/api/@azure/identity/interactivebrowsercredential). For example, to use `InteractiveBrowserCredential` in a Node.js console app to authenticate to Azure Key Vault with the [SecretClient](/javascript/api/@azure/keyvault-secrets/secretclient), follow these steps:\n\n1. Install the [@azure/identity](https://www.npmjs.com/package/@azure/identity) and [@azure/identity-broker](https://www.npmjs.com/package/@azure/identity-broker) packages:\n\n   ```bash\n   npm install @azure/identity @azure/identity-broker\n   ```\n\n1. Create an instance of [InteractiveBrowserCredential](/javascript/api/@azure/identity/interactivebrowsercredential) using broker options and register the native broker plugin:\n\n    :::code language=\"typescript\" source=\"~/../azure-sdk-for-js-docs/samples/identity/credentials/src/broker.ts\" id=\"BROKER\":::\n\n> [!TIP]\n> View the [complete sample app code](https://github.com/Azure-Samples/azure-sdk-for-js-docs/blob/main/samples/identity/credentials/src/broker.ts) in the Azure SDK for JavaScript GitHub repository.\n\nIn the preceding example, property `useDefaultBrokerAccount` is set to `true`, which opts into a silent, brokered authentication flow with the default system account. In this way, the user doesn't have to repeatedly select the same account. If silent, brokered authentication fails, or `useDefaultBrokerAccount` is set to `false`, `InteractiveBrowserCredential` falls back to interactive, brokered authentication.\n\n:::zone target=\"docs\" pivot=\"os-windows\"\n\nThe following screenshot shows the alternative interactive, brokered authentication experience:\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/broker-web-account-manager-account-picker.png\" alt-text=\"A screenshot that shows the Windows sign-in experience when using a broker-enabled InteractiveBrowserCredential instance to authenticate a user.\":::\n\n:::zone-end\n\n:::zone target=\"docs\" pivot=\"os-linux\"\n\nThe following video shows the alternative interactive, brokered authentication experience:\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/broker-linux-login.gif\" alt-text=\"An animated gif that shows the Linux sign-in experience when using a broker-enabled InteractiveBrowserCredential instance to authenticate a user.\":::\n\n:::zone-end\n\n## Related content\n\n- [Authenticate JavaScript apps to Azure services by using the Azure SDK for JavaScript](overview.md)\n- [Authenticate JavaScript apps to Azure services during local development](local-development-environment-service-principal.md)\n- [Azure Identity library for JavaScript](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/identity/identity)\n- [Azure Identity Broker library for JavaScript](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/identity/identity-broker)"
  },
  {
    "path": "articles/javascript/sdk/authentication/local-development-environment-developer-account.md",
    "content": "---\ntitle: Authenticate Node.js Apps to Azure Using Developer Accounts\ndescription: Learn how to authenticate your application to Azure services when using the Azure SDK for Node.js during local development using developer accounts.\nms.topic: how-to\nms.date: 02/18/2026\nms.custom:\n  - devx-track-azurecli\n  - devx-track-azurepowershell\n  - devx-track-js\n  - sfi-image-nochange\n\n---\n\n# Authenticate Node.js apps to Azure services during local development using developer accounts\n\nDuring local development, applications need to authenticate to Azure to access various Azure services. Two common approaches for local authentication are to [use a service principal](local-development-environment-service-principal.md) or to use a developer account. This article explains how to use a developer account. In the sections ahead, you learn:\n\n- How to use Microsoft Entra groups to efficiently manage permissions for multiple developer accounts\n- How to assign roles to developer accounts to scope permissions\n- How to sign-in to supported local development tools\n- How to authenticate using a developer account from your app code\n\nFor an app to authenticate to Azure during local development using the developer's Azure credentials, the developer must be signed-in to Azure from one of the following developer tools:\n\n- Azure CLI\n- Azure Developer CLI\n- Azure PowerShell\n- Visual Studio Code\n\nThe Azure Identity library can detect that the developer is signed-in from one of these tools. The library can then obtain the Microsoft Entra access token via the tool to authenticate the app to Azure as the signed-in user.\n\nThis approach takes advantage of the developer's existing Azure accounts to streamline the authentication process. However, a developer's account likely has more permissions than required by the app, therefore exceeding the permissions the app runs with in production. As an alternative, you can [create application service principals to use during local development](./local-development-environment-service-principal.md), which can be scoped to have only the access needed by the app.\n\n[!INCLUDE [create-entra-group](../../../includes/authentication/create-entra-group.md)]\n\n[!INCLUDE [assign-group-roles](../../../includes/authentication/assign-group-roles.md)]\n\n[!INCLUDE [sign-in-dev-tooling](./includes/developer-tooling-javascript.md)]\n\n[!INCLUDE [Implement credential based on use case](./includes/implement-local-development-credential.md)]\n"
  },
  {
    "path": "articles/javascript/sdk/authentication/local-development-environment-service-principal.md",
    "content": "---\ntitle: \"Local dev: Auth JS apps to Azure services with service principal\"\ndescription: This article describes how to authenticate your application to Azure services when using the Azure SDK for JavaScript during local development using dedicated application service principals.\nms.date: 01/20/2026\nms.topic: how-to\nms.custom:\n  - dexx-track-js\n  - devx-track-azurecli\n  - devx-track-js\n  - sfi-image-nochange\n#.NET:03/11/2025:https://github.com/dotnet/docs/blob/main/docs/azure/sdk/authentication/local-development-service-principal.md\n---\n\n# Authenticate JavaScript apps to Azure services during local development using service principals\n\nDuring local development, applications need to authenticate to Azure to access various Azure services. Two common approaches for local authentication are to [use a developer account](./local-development-environment-developer-account.md) or a service principal. This article explains how to use an application service principal. In the following sections, you learn:\n\n- How to register an application with Microsoft Entra to create a service principal\n- How to use Microsoft Entra groups to efficiently manage permissions\n- How to assign roles to scope permissions\n- How to authenticate using a service principal from your app code\n\nBy using dedicated application service principals, you can adhere to the principle of least privilege when accessing Azure resources. Limit permissions to the specific requirements of the app during development, preventing accidental access to Azure resources intended for other apps or services. This approach also helps avoid issues when the app is moved to production by ensuring it isn't over-privileged in the development environment.\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/mermaidjs/local-service-principal-authentication.svg\" alt-text=\"A diagram showing how a JavaScript app during local development uses the developer's credentials to connect to Azure by obtaining those credentials locally installed development tools.\":::\n\nWhen you register the app in Azure, you create an application service principal. For local development:\n\n- Create a separate app registration for each developer working on the app so each developer has their own application service principal and doesn't need to share credentials.\n- Create a separate app registration for each app to limit the app's permissions to only what is necessary.\n\nDuring local development, set environment variables with the application service principal's identity. The Azure Identity library reads these environment variables to authenticate the app to the required Azure resources.\n\n[!INCLUDE [create-app-registration](../../../includes/authentication/create-app-registration.md)]\n\n[!INCLUDE [create-entra-group](../../../includes/authentication/create-entra-group.md)]\n\n[!INCLUDE [assign-group-roles](../../../includes/authentication/assign-group-roles.md)]\n\n[!INCLUDE [add app environment variables](includes/set-environment-variables-javascript.md)]\n\n[!INCLUDE [auth and implement code](./includes/implement-default-azure-credential.md)]\n"
  },
  {
    "path": "articles/javascript/sdk/authentication/on-premises-apps.md",
    "content": "---\ntitle: Authenticate to Azure resources from JavaScript apps hosted on-premises\ndescription: This article describes how to authenticate your application to Azure services when using the Azure SDK for JavaScript in on-premises hosted apps. \nms.topic: how-to\nms.date: 01/06/2026\nms.custom:\n  - devx-track-js\n  - engagement-fy23\n  - sfi-image-nochange\n---\n\n# Authenticate to Azure resources from JavaScript apps hosted on-premises\n\nApps hosted outside of Azure, such as on-premises or in a third-party data center, should use an application service principal through [Microsoft Entra ID](/entra/fundamentals/whatis) to authenticate to Azure services. In the sections ahead, you learn:\n\n- How to register an application with Microsoft Entra to create a service principal\n- How to assign roles to scope permissions\n- How to authenticate using a service principal from your app code\n\nUsing dedicated application service principals allows you to adhere to the principle of least privilege when accessing Azure resources. Permissions are limited to the specific requirements of the app during development, preventing accidental access to Azure resources intended for other apps or services. This approach also helps avoid issues when the app is moved to production by ensuring it isn't over-privileged in the development environment.\n\nA different app registration should be created for each environment the app is hosted in. This allows environment-specific resource permissions to be configured for each service principal and ensures an app deployed to one environment doesn't talk to Azure resources in another environment.\n\n[!INCLUDE [authentication-create-app-registration](../../../includes/authentication/create-app-registration.md)]\n\n[!INCLUDE [authentication-assign-service-principal-roles](../../../includes/authentication/assign-service-principal-roles.md)]\n\n[!INCLUDE [authentication-set-environment-variables](includes/set-environment-variables-javascript.md)]\n\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library](/javascript/api/overview/azure/identity-readme?view=azure-node-latest&preserve-view=true) provides various *credentials*&mdash;implementations of `TokenCredential` adapted to supporting different scenarios and Microsoft Entra authentication flows. The steps ahead demonstrate how to use [ClientSecretCredential](/javascript/api/@azure/identity/clientsecretcredential?view=azure-node-latest&preserve-view=true) when working with service principals locally and in production.\n\n### Implement the code\n\nAdd the [@azure/identity](https://www.npmjs.com/package/@azure/identity) package in the Node.js project:\n\n```bash\nnpm install @azure/identity\n```\n\nAzure services are accessed using specialized client classes from the various Azure SDK client libraries. For any JavaScript code that creates an Azure SDK client object in your app, follow these steps:\n\n1. Import the `ClientSecretCredential` class from the `@azure/identity` module.\n1. Create a `ClientSecretCredential` object with the `tenantId`, `clientId`, and `clientSecret`.\n1. Pass the `ClientSecretCredential` instance to the Azure SDK client object constructor.\n\nAn example of this approach is shown in the following code segment:\n\n```javascript\nimport { BlobServiceClient } from '@azure/storage-blob';\nimport { ClientSecretCredential } from '@azure/identity';\n\n// Authentication\nconst tenantId = process.env.AZURE_TENANT_ID;\nconst clientId = process.env.AZURE_CLIENT_ID;\nconst clientSecret = process.env.AZURE_CLIENT_SECRET;\n\n// Azure Storage account name\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;\n\nif (!tenantId || !clientId || !clientSecret || !accountName) {\n  throw Error('Required environment variables not found');\n}\n\nconst credential = new ClientSecretCredential(tenantId, clientId, clientSecret);\n\nconst blobServiceClient = new BlobServiceClient(\n  `https://${accountName}.blob.core.windows.net`,\n  credential\n);\n```\n\nAn alternative approach is to pass the `ClientSecretCredential` object directly to the Azure SDK client constructor:\n\n```javascript\nconst blobServiceClient = new BlobServiceClient(\n  `https://${accountName}.blob.core.windows.net`,\n  new ClientSecretCredential(tenantId, clientId, clientSecret)\n);\n```\n\n"
  },
  {
    "path": "articles/javascript/sdk/authentication/overview.md",
    "content": "---\ntitle: How to authenticate JavaScript apps with Azure services\ndescription: Learn how to authenticate a JavaScript app with Azure services by using classes in the Azure Identity library.\nms.date: 02/18/2026\nms.topic: concept-article\nms.custom:\n  - devx-track-js\n  - sfi-image-nochange\n---\n\n# Authenticate JavaScript apps to Azure services using the Azure Identity library\n\nApps can use the Azure Identity library to authenticate to Microsoft Entra ID, which allows the apps to access Azure services and resources. This authentication requirement applies whether the app is deployed to Azure, hosted on-premises, or running locally on a developer workstation. The sections ahead describe the recommended approaches to authenticate an app to Microsoft Entra ID across different environments when using the Azure SDK for JavaScript.\n\n## Recommended approach for app authentication\n\nToken-based authentication via Microsoft Entra ID is the recommended approach for authenticating apps to Azure, instead of using connection strings or key-based options. The [Azure Identity library](/javascript/api/overview/azure/identity-readme?view=azure-node-latest&preserve-view=true) provides classes that support token-based authentication and allow apps to authenticate to Azure resources whether the app runs locally, on Azure, or on an on-premises server.\n\n### Advantages of token-based authentication\n\n[!INCLUDE [advantages of token-based authentication](../../../includes/authentication/advantages-token-based-authentication.md)]\n\n## Authentication across different environments\n\nThe specific type of token-based authentication an app should use to authenticate to Azure resources depends on where the app runs. The following diagram provides guidance for different scenarios and environments:\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/mermaidjs/authentication-environments.svg\" alt-text=\"A diagram showing the recommended token-based authentication strategies for an app depending on where it's running.\" :::\n\nWhen an app is:\n\n- **Hosted on Azure**: The app should authenticate to Azure resources using a managed identity. This option is discussed in more detail at [authentication in server environments](#authentication-for-azure-hosted-apps).\n- **Running locally during development**: The app can authenticate to Azure using a [developer account](local-development-environment-developer-account.md), a [broker](local-development-broker.md), or a [service principal](local-development-environment-service-principal.md). Each option is discussed in more detail at [authentication during local development](#authentication-during-local-development).\n- **Hosted on-premises**: The app should authenticate to Azure resources using an application service principal. On-premises workflows are discussed in more detail at [Authentication for apps hosted on-premises](#authentication-for-apps-hosted-on-premises).\n\n## Authentication for Azure-hosted apps\n\nWhen your app is hosted on Azure, it can use managed identities to authenticate to Azure resources without needing to manage any credentials. There are two types of managed identities: user-assigned and system-assigned.\n\n#### Use a user-assigned managed identity\n\nA user-assigned managed identity is created as a standalone Azure resource. It can be assigned to one or more Azure resources, allowing those resources to share the same identity and permissions. To authenticate using a user-assigned managed identity, create the identity, assign it to your Azure resource, and then configure your app to use this identity for authentication by specifying its client ID.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate using a user-assigned managed identity](user-assigned-managed-identity.md)\n\n#### Use a system-assigned managed identity\n\nA system-assigned managed identity is enabled directly on an Azure resource. The identity is tied to the lifecycle of that resource and is automatically deleted when the resource is deleted. To authenticate using a system-assigned managed identity, enable the identity on your Azure resource and then configure your app to use this identity for authentication.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate using a system-assigned managed identity](system-assigned-managed-identity.md)\n\n## Authentication during local development\n\nDuring local development, you can authenticate to Azure resources using your developer credentials, a broker, or a service principal. This allows you to test your app's authentication logic without deploying it to Azure.\n\n#### Use developer credentials\n\nYou can use your own Azure credentials to authenticate to Azure resources during local development. This is typically done using a development tool, such as Azure CLI, which can provide your app with the necessary tokens to access Azure services. This method is convenient but should only be used for development purposes.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally using developer credentials](local-development-environment-developer-account.md)\n\n#### Use a broker\n\nBrokered authentication collects user credentials using the system authentication broker to authenticate an app. A system authentication broker runs on a user's machine and manages the authentication handshakes and token maintenance for all connected accounts.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally using a broker](local-development-broker.md)\n\n#### Use a service principal\n\nA service principal is created in a Microsoft Entra tenant to represent an app and be used to authenticate to Azure resources. You can configure your app to use service principal credentials during local development. This method is more secure than using developer credentials and is closer to how your app will authenticate in production. However, it's still less ideal than using a managed identity due to the need for secrets.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally using a service principal](local-development-environment-service-principal.md)\n\n## Authentication for apps hosted on-premises\n\nFor apps hosted on-premises, you can use a service principal to authenticate to Azure resources. This involves creating a service principal in Microsoft Entra ID, assigning it the necessary permissions, and configuring your app to use its credentials. This method allows your on-premises app to securely access Azure services.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate your on-prem app using a service principal](on-premises-apps.md)\n"
  },
  {
    "path": "articles/javascript/sdk/authentication/system-assigned-managed-identity.md",
    "content": "---\ntitle: Authenticate Azure-hosted JavaScript apps to Azure resources using a system-assigned managed identity\ndescription: Learn how to authenticate Azure-hosted JavaScript apps to other Azure services using a system-assigned managed identity.\nms.date: 08/15/2025\nms.topic: how-to\nms.custom: devx-track-js, devx-track-azurecli\nzone_pivot_group_filename: developer/javascript/javascript-zone-pivot-groups.json\nzone_pivot_groups: js-ts\n---\n\n# Authenticate Azure-hosted JavaScript apps to Azure resources using a system-assigned managed identity\n\nThe recommended approach to authenticate an Azure-hosted app to other Azure resources is to use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). This approach is [supported for most Azure services](/entra/identity/managed-identities-azure-resources/managed-identities-status), including apps hosted on Azure App Service, Azure Container Apps, and Azure Virtual Machines. Discover more about different authentication techniques and approaches on the [authentication overview](overview.md) page. In the sections ahead, you'll learn:\n\n- Essential managed identity concepts\n- How to create a system-assigned managed identity for your app\n- How to assign roles to the system-assigned managed identity\n- How to authenticate using the system-assigned managed identity from your app code\n\n[!INCLUDE [Implement user-assigned managed identity](<../../../includes/authentication/managed-identity-concepts.md>)]\n\nThe following sections describe the steps to enable and use a system-assigned managed identity for an Azure-hosted app. If you need to use a user-assigned managed identity, visit the [user-assigned managed identities](user-assigned-managed-identity.md) article for more information.\n\n[!INCLUDE [Language agnostic system assigned procedures](<../../../includes/authentication/system-assigned-managed-identity.md>)]\n\n[!INCLUDE [JavaScript implement-managed-identity-concepts](includes/implement-managed-identity-concepts.md)]\n\n\n::: zone pivot=\"js\"\n\n### Implement the code\n\nIn a JavaScript project, add the [@azure/identity](https://www.npmjs.com/package/@azure/identity) package. In a terminal of your choice, navigate to the application project directory and run the following commands:\n\n```console\nnpm install @azure/identity\n```\n\nAzure services are accessed using specialized client classes from the various Azure SDK client libraries. In `index.js`, complete the following steps to configure token-based authentication:\n\n1. Import the `@azure/identity` package.\n1. Pass an appropriate `TokenCredential` instance to the client:\n    - Use `DefaultAzureCredential` when your app is running locally\n    - Use `ManagedIdentityCredential` when your app is running in Azure.\n\n    ```javascript\n    import { BlobServiceClient } from '@azure/storage-blob';\n    import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity';\n    \n    function createBlobServiceClient() {\n        const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;\n        if (!accountName) throw Error('Azure Storage accountName not found');\n    \n        const url = `https://${accountName}.blob.core.windows.net`;\n    \n        if (process.env.NODE_ENV === \"production\") {\n            return new BlobServiceClient(url, new ManagedIdentityCredential());\n        } else {\n            return new BlobServiceClient(url, new DefaultAzureCredential());\n        }\n    }\n    \n    async function main() {\n        try {\n            const blobServiceClient = createBlobServiceClient();\n            const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME);\n            const properties = await containerClient.getProperties();\n    \n            console.log(properties);\n        } catch (err) {\n            console.error(\"Error retrieving container properties:\", err.message);\n            throw err;\n        }\n    }\n    \n    main().catch((err) => {\n        console.error(\"Error running sample:\", err.message);\n        process.exit(1);\n    });\n    ```\n\n::: zone-end\n\n::: zone pivot=\"ts\"\n\n### Implement the code\n\nIn a JavaScript project, add the [@azure/identity](https://www.npmjs.com/package/@azure/identity) package. In a terminal of your choice, navigate to the application project directory and run the following commands:\n\n```console\nnpm install @azure/identity @types/node\n```\n\nAzure services are accessed using specialized client classes from the various Azure SDK client libraries. In `index.js`, complete the following steps to configure token-based authentication:\n\n1. Import the `@azure/identity` package.\n1. Pass an appropriate `TokenCredential` instance to the client:\n    - Use `DefaultAzureCredential` when your app is running locally\n    - Use `ManagedIdentityCredential` when your app is running in Azure.\n\n    ```typescript\n    import { BlobServiceClient } from '@azure/storage-blob';\n    import { ManagedIdentityCredential, DefaultAzureCredential } from '@azure/identity';\n    \n    function createBlobServiceClient(): BlobServiceClient {\n        const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;\n        if (!accountName) throw Error('Azure Storage accountName not found');\n        const url = `https://${accountName}.blob.core.windows.net`;\n    \n        if (process.env.NODE_ENV === \"production\") {\n            return new BlobServiceClient(url, new ManagedIdentityCredential());\n        } else {\n            return new BlobServiceClient(url, new DefaultAzureCredential());\n        }\n    }\n    \n    async function main(): Promise<void> {\n        try {\n            const blobServiceClient = createBlobServiceClient();\n            const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME!);\n            const properties = await containerClient.getProperties();\n    \n            console.log(properties);\n        } catch (err: any) {\n            console.error(\"Error retrieving container properties:\", err.message);\n            throw err;\n        }\n    }\n    \n    main().catch((err: Error) => {\n        console.error(\"Error running sample:\", err.message);\n        process.exit(1);\n    });\n    ```\n\n::: zone-end\n\nThe preceding code behaves differently depending on the environment where it's running:\n\n- On your local development workstation, `DefaultAzureCredential` looks in the environment variables for an application service principal or at locally installed developer tools, such as Visual Studio Code, for a set of developer credentials.\n- When deployed to Azure, `ManagedIdentityCredential` discovers your managed identity configurations to authenticate to other services automatically."
  },
  {
    "path": "articles/javascript/sdk/authentication/user-assigned-managed-identity.md",
    "content": "---\ntitle: Authenticate Azure-hosted JavaScript apps to Azure resources using a user-assigned managed identity\ndescription: Learn how to authenticate Azure-hosted JavaScript apps to other Azure services using a user-assigned managed identity.\nms.topic: how-to\nms.custom: devx-track-js, engagement-fy23, devx-track-azurecli\nms.date: 08/15/2025\nzone_pivot_group_filename: developer/javascript/javascript-zone-pivot-groups.json\nzone_pivot_groups: js-ts\n---\n\n# Authenticate Azure-hosted JavaScript apps to Azure resources using a user-assigned managed identity\n\nThe recommended approach to authenticate an Azure-hosted app to other Azure resources is to use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). This approach is [supported for most Azure services](/entra/identity/managed-identities-azure-resources/managed-identities-status), including apps hosted on Azure App Service, Azure Container Apps, and Azure Virtual Machines. Discover more about different authentication techniques and approaches on the [authentication overview](overview.md) page. In the sections ahead, you'll learn:\n\n- Essential managed identity concepts\n- How to create a user-assigned managed identity for your app\n- How to assign roles to the user-assigned managed identity\n- How to authenticate using the user-assigned managed identity from your app code\n\n[!INCLUDE [managed-identity-concepts](../../../includes/authentication/managed-identity-concepts.md)]\n\nThe following sections describe the steps to enable and use a user-assigned managed identity for an Azure-hosted app. If you need to use a system-assigned managed identity, visit the [system-assigned managed identities](system-assigned-managed-identity.md) article for more information.\n\n[!INCLUDE [Language agnostic user assigned procedures](<../../../includes/authentication/user-assigned-managed-identity.md>)]\n\n[!INCLUDE [JavaScript implement-managed-identity-concepts](includes/implement-managed-identity-concepts.md)]\n\n::: zone pivot=\"js\"\n\n[!INCLUDE [JavaScript implement the code](includes/user-assigned-implement-code-js.md)]\n\n::: zone-end\n\n::: zone pivot=\"ts\"\n\n[!INCLUDE [TypeScript implement the code](includes/user-assigned-implement-code-ts.md)]\n::: zone-end\n\nThe preceding code behaves differently depending on the environment where it's running:\n\n- On your local development workstation, `DefaultAzureCredential` looks in the environment variables for an application service principal or at locally installed developer tools, such as Visual Studio Code, for a set of developer credentials.\n- When deployed to Azure, `ManagedIdentityCredential` discovers your managed identity configurations to authenticate to other services automatically."
  },
  {
    "path": "articles/javascript/sdk/azure-sdk-install.md",
    "content": "---\ntitle: Install JavaScript Azure SDK library packages\ndescription: How to install, uninstall, and verify Azure SDK for JavaScript libraries using npm. Includes details on installing specific versions and preview packages.\nms.date: 03/12/2026\nms.topic: install-set-up-deploy\nms.custom: devx-track-js\nadobe-target: true\n---\n\n# How to install Azure library packages for JavaScript\n\n\nThe Azure SDK for JavaScript is composed of many independently versioned libraries that can be installed in standard JavaScript environments. This modular approach allows you to install only the packages you need and manage them individually for better control over dependencies and updates.\n\n[!INCLUDE [javascript-sdk-libraries](../includes/libraries.md)]\n\n## Prerequisites\n\n- [Node.js LTS](https://nodejs.org/).  \n  Learn more about [Node.js compatibility for Azure](../choose-nodejs-version.md).  \n- [npm](https://www.npmjs.com/) or [yarn](https://yarnpkg.com/).  \n  Ensure that your package manager is up-to-date to avoid installation issues.\n\nIf you run into problems while installing packages, refer to our [troubleshooting guide](#troubleshooting).\n\n## Install the latest version of a library\n\nWhen you install a library without specifying a version, the package manager retrieves the latest version available from the package index.\n\n### [npm](#tab/npm-install)\n\n```cmd\nnpm install <library>\n```\n\n### [yarn](#tab/yarn-install)\n\n```cmd\nyarn add <library>\n```\n\n---\n\n## Install specific library versions\n\nSometimes you may need to install a particular version or a preview version of a library for compatibility testing or to gain early access to new features. When you install a specific version, you are **pinning** your dependency, which means that your project will continue using that version and will not automatically receive updates or fixes. While pinning can be useful in certain scenarios, we generally recommend using the latest version whenever possible to benefit from ongoing improvements and security updates.\n\n\n### [npm](#tab/npm-install-version)\n\n```cmd\nnpm install <library>@<version-number>\n```\n\n### [yarn](#tab/yarn-install-version)\n\n```cmd\nyarn add <library>@<version-number>\n```\n\n---\n\n## Preview packages\n\nWhen installing preview packages, look for prerelease tags. These packages provide early access to new features but might not be as stable as general releases. For example:\n\n- `next`: This tag is used for the current beta version of the upcoming release.\n- `dev`: This tag is used for the current alpha version of the upcoming release.\n\n## Verify a library installation\n\nAfter installation, you can verify that the correct version of the library is installed.\n\n### [npm](#tab/npm-list)\n\n```cmd\nnpm list <library>\n```\n\n### [yarn](#tab/yarn-list)\n\n```cmd\nyarn list <library>\n```\n\n---\n\n## Uninstall a library\n\n### [npm](#tab/npm-uninstall)\n\n```cmd\nnpm uninstall <library>\n```\n\n### [yarn](#tab/yarn-uninstall)\n\n```cmd\nyarn remove <library>\n```\n\n---\n\n## Troubleshooting\n\n- **Installation errors**: Ensure that Node.js and your package manager (npm or yarn) are up-to-date.\n- **Version conflicts**: Check that the version specified is available in the package index.\n- **Network issues**: Verify your internet connection and proxy settings if package downloads are slow or failing.\n\n## Additional resources\n\n- Azure SDK Library Index  [Browse available packages](../azure-sdk-library-package-index.md).\n- Node.js Compatibility for Azure – [Learn about supported Node.js versions](../choose-nodejs-version.md).\n- Troubleshooting [npm](https://docs.npmjs.com/common-errors) and [yarn](https://yarnpkg.com/advanced/error-codes) issues – Common error troubleshooting guidelines.\n- [Azure SDK GitHub repository](https://github.com/Azure/azure-sdk-for-js) – For reporting issues and contributing.\n"
  },
  {
    "path": "articles/javascript/sdk/debug-client-libraries.md",
    "content": "---\ntitle: Configure logging in Azure SDK libraries for JavaScript\ndescription: Learn how to configure logging in Azure SDK libraries for JavaScript to diagnose authentication issues, troubleshoot credential chains, and gain visibility into SDK operations.\nms.date: 08/22/2025\nms.topic: how-to\nms.custom: devx-track-js\nzone_pivot_group_filename: developer/javascript/javascript-zone-pivot-groups.json\nzone_pivot_groups: js-ts\n#customer intent: As a JavaScript developer using Azure services, I want to understand how to enable and configure logging in Azure SDK client libraries to diagnose authentication issues, troubleshoot credential chains, and gain visibility into SDK operations.\n---\n\n# Configure logging in Azure SDK client libraries for JavaScript\n\nThis article explains how to configure logging in Azure SDK libraries for JavaScript. Enabling logging helps you diagnose authentication issues, troubleshoot credential chains, and gain visibility into SDK operations.\n\nTo enable logging you can use either of the options below:  \n\n* Set the `AZURE_LOG_LEVEL=verbose` environment variable to turn on logging.\n* Use the `@azure/logger` package in your source code.\n\nValid log levels include `verbose`, `info`, `warning`, and `error`.\n\n> [!NOTE]\n> The Azure Storage code shown in this article assumes the storage resource has been configured with the appropriate Microsoft Entra roles. Learn more: [Authorize access to blobs using Microsoft Entra ID].\n\n::: zone pivot=\"js\"\n\n## Prerequisites\n\n- An Azure subscription: [Create one for free][Free Subscription]\n- [Node.js LTS][Node.js website]\n- Optional, a developer tool such as [Azure CLI] used for authentication in a local development environment. To create the necessary context, sign in with the Azure CLI. \n\n## Enable logging with environment variable\n\nStart the application with the environment variable for a simple way to enable logging.\n\n```shell\nAZURE_LOG_LEVEL=verbose node index.js\n```\n\n## Set environment variables\n\nYou can also add environment variables to a `.env` file in your project root. Create a file named `.env` and add the following content.\n\n```ini\nAZURE_LOG_LEVEL=verbose\nAZURE_CLIENT_ID=<YOUR_CLIENT_ID>\nAZURE_STORAGE_ACCOUNT_NAME=<YOUR_STORAGE_ACCOUNT_NAME>\nAZURE_STORAGE_CONTAINER_NAME=<YOUR_STORAGE_CONTAINER_NAME>\n```\n\n## Enable logging with logger package in source code\n\nThe following code sample uses the [@azure/logger] package to debug the Azure SDK client libraries.\n\n### Configure logging for specific services\n\nIn addition to setting a global log level, you can configure different log levels for specific Azure services directly in your code:\n\n```javascript\n// Import service-specific setLogLevel functions\nimport { setLogLevel as setIdentityLogLevel } from \"@azure/identity\";\nimport { setLogLevel as setStorageLogLevel } from \"@azure/storage-blob\";\n\n// Set different log levels for different services\nsetIdentityLogLevel(\"verbose\");  // Detailed logs for identity operations\nsetStorageLogLevel(\"warning\");   // Only warnings and errors for storage operations\n```\n\nThis approach gives you fine-grained control over logging verbosity when working with multiple Azure services in the same application.\n\n\n1. Create `index.js` with the following code.\n\n    ```javascript\n    import {\n        ChainedTokenCredential,\n        ManagedIdentityCredential,\n        AzureCliCredential\n    } from \"@azure/identity\";\n    import { BlobServiceClient } from \"@azure/storage-blob\";\n    import { AzureLogger, setLogLevel } from \"@azure/logger\";\n    \n    // Check required environment variables\n    if (!process.env.AZURE_STORAGE_ACCOUNT_NAME) {\n        throw new Error(\"AZURE_STORAGE_ACCOUNT_NAME environment variable is required\");\n    }\n    \n    if (!process.env.AZURE_STORAGE_CONTAINER_NAME) {\n        throw new Error(\"AZURE_STORAGE_CONTAINER_NAME environment variable is required\");\n    }\n    \n    // Client ID is optional and only used in production environments\n    // No need to check for its existence\n    \n    // Turn on debugging for all Azure SDKs   \n    setLogLevel(\"verbose\");\n    \n    // Configure the logger to use console.\n    AzureLogger.log = (...args)=> {\n        console.log(...args);\n    };\n    \n    const credential = new ChainedTokenCredential(\n        new ManagedIdentityCredential({ clientId: process.env.AZURE_CLIENT_ID }),\n        new AzureCliCredential()\n    );\n    \n    const blobServiceClient = new BlobServiceClient(\n        `https://${process.env.AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net`,\n        credential\n    );\n    // get container properties\n    const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME);\n    \n    async function main() {\n        try {\n            const properties = await containerClient.getProperties();\n    \n            console.log(properties);\n        } catch (err) {\n            const error = err;\n            console.error(\"Error retrieving container properties:\", error.message);\n            throw error;\n        }\n    }\n    \n    main().catch((err) => {\n        console.error(\"Error running sample:\", err.message);\n        process.exit(1);\n    });\n    ```\n\n\n1. Create the project and install the npm dependencies.\n\n    ```console\n    npm init -y\n    npm pkg set type=module\n    npm install @azure/identity @azure/storage-blob @azure/logger\n    ```\n\n1. Sign in to your Azure subscription in your local environment with Azure CLI.\n\n    ```azurecli\n    az login\n    ```\n\n1. Run the app with an environment variable file. The `--env-file` option was introduced in Node.js 20.6.0.\n\n    ```console\n    node --env-file .env index.js\n    ```\n\n1. Find the successful credential in the output. `ChainedTokenCredential` allows your code to seamlessly switch between authentication methods, first trying `ManagedIdentityCredential` (for production environments like Azure App Service) and then falling back to `AzureCliCredential` (for local development), with logs showing which credential succeeded.\n\n::: zone-end\n\n\n\n::: zone pivot=\"ts\"\n\n\n## Prerequisites\n\n- An Azure subscription: [Create one for free][Free Subscription]\n- [Node.js LTS][Node.js website]\n- [TypeScript]\n- Optional, an authentication tool such as [Azure CLI] used for authentication in a local development environment. To create the necessary context, sign in with the Azure CLI. \n\n## Enable logging with environment variable\n\nStart the application with the environment variable for a simple way to enable logging.\n\n```shell\nAZURE_LOG_LEVEL=verbose node index.js\n```\n\n## Set environment variables\n\nYou can also add environment variables to a `.env` file in your project root. Create a file named `.env` and add the following content.\n\n```ini\nAZURE_LOG_LEVEL=verbose\nAZURE_CLIENT_ID=<YOUR_CLIENT_ID>\nAZURE_STORAGE_ACCOUNT_NAME=<YOUR_STORAGE_ACCOUNT_NAME>\nAZURE_STORAGE_CONTAINER_NAME=<YOUR_STORAGE_CONTAINER_NAME>\n```\n\n## Enable logging with logger package in source code\n\nThe following code sample uses the [@azure/logger] package to debug the Azure SDK client libraries.\n\n### Configure logging for specific services\n\nIn addition to setting a global log level, you can configure different log levels for specific Azure services directly in your code:\n\n```typescript\n// Import service-specific setLogLevel functions\nimport { setLogLevel as setIdentityLogLevel } from \"@azure/identity\";\nimport { setLogLevel as setStorageLogLevel } from \"@azure/storage-blob\";\n\n// Set different log levels for different services\nsetIdentityLogLevel(\"verbose\");  // Detailed logs for identity operations\nsetStorageLogLevel(\"warning\");   // Only warnings and errors for storage operations\n```\n\nThis approach gives you fine-grained control over logging verbosity when working with multiple Azure services in the same application.\n\n\n1. Create `index.ts` with the following code.\n\n    ```typescript\n    import {\n        ChainedTokenCredential,\n        ManagedIdentityCredential,\n        AzureCliCredential\n    } from \"@azure/identity\";\n    import { BlobServiceClient, ContainerGetPropertiesResponse } from \"@azure/storage-blob\";\n    import { AzureLogger, setLogLevel } from \"@azure/logger\";\n    \n    // Check required environment variables\n    if (!process.env.AZURE_STORAGE_ACCOUNT_NAME) {\n        throw new Error(\"AZURE_STORAGE_ACCOUNT_NAME environment variable is required\");\n    }\n    \n    if (!process.env.AZURE_STORAGE_CONTAINER_NAME) {\n        throw new Error(\"AZURE_STORAGE_CONTAINER_NAME environment variable is required\");\n    }\n    \n    // Client ID is optional and only used in production environments\n    // No need to check for its existence\n    \n    // Turn on debugging for all Azure SDKs   \n    setLogLevel(\"verbose\");\n    \n    // Configure the logger to use console.log with TypeScript type safety\n    AzureLogger.log = (...args: unknown[]): void => {\n        console.log(...args);\n    };\n    \n    const credential = new ChainedTokenCredential(\n        new ManagedIdentityCredential({ clientId: process.env.AZURE_CLIENT_ID }),\n        new AzureCliCredential()\n    );\n    \n    const blobServiceClient = new BlobServiceClient(\n        `https://${process.env.AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net`,\n        credential\n    );\n    // get container properties\n    const containerClient = blobServiceClient.getContainerClient(process.env.AZURE_STORAGE_CONTAINER_NAME);\n    \n    async function main(): Promise<void> {\n        try {\n            const properties: ContainerGetPropertiesResponse = await containerClient.getProperties();\n    \n            console.log(properties);\n        } catch (err) {\n            const error = err as Error;\n            console.error(\"Error retrieving container properties:\", error.message);\n            throw error;\n        }\n    }\n    \n    main().catch((err: Error) => {\n        console.error(\"Error running sample:\", err.message);\n        process.exit(1);\n    });\n    ```\n\n\n1. Create the project and install the npm dependencies.\n\n    ```console\n    npm init -y\n    npm pkg set type=module\n    npm install @azure/identity @azure/storage-blob @types/node @azure/logger\n    ```\n\n1. Sign in to your Azure subscription in your local environment with Azure CLI.\n\n    ```azurecli\n    az login\n    ```\n\n1. Build the application.\n\n    ```console\n    tsc\n    ```\n \n1. Run the app with an environment variable file.  The `--env-file` option was introduced in Node.js 20.6.0.\n\n    ```console\n    node --env-file .env index.js\n    ```\n\n1. Find the successful credential in the output - the `ChainedTokenCredential` allows your code to seamlessly switch between authentication methods, first trying `ManagedIdentityCredential` (for production environments like Azure App Service) and then falling back to `AzureCliCredential` (for local development), with logs showing which credential succeeded.\n\n\n::: zone-end\n\n## Additional resources\n\n- [Azure JavaScript SDK logging][Azure JS SDK logging]\n- [Passwordless connections for Azure services]\n\n[Free Subscription]: https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn/\n[TypeScript]: https://www.typescriptlang.org/ \n[Node.js website]: https://nodejs.org/\n[Azure CLI]: /cli/azure/install-azure-cli\n[Azure JS SDK logging]: https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/core#logging\n[@azure/logger]: https://www.npmjs.com/package/@azure/logger\n[Authorize access to blobs using Microsoft Entra ID]: /azure/storage/common/authorize-data-access\n[Passwordless connections for Azure services]: ../../intro/passwordless-overview.md"
  },
  {
    "path": "articles/javascript/sdk/loop-over-data.md",
    "content": "---\ntitle: Loop over data using async iterators in the Azure SDK for JavaScript\ndescription: Learn how to loop over large data sets using async iterators in the Azure SDK for JavaScript. Discover benefits and practical examples for paginated data.\nms.date: 06/28/2025\nms.topic: concept-article\nms.custom: devx-track-js \nai-usage: ai-assisted\n---\n\n# Loop and page over data returned from the Azure SDK for JavaScript\n\nWhen working with Azure services, you often need to process large sets of data. The Azure SDK for JavaScript provides async iterators to help manage this task efficiently. This article explains what async iterators are, how to use them, and provides examples for key Azure services.\n\n## What are async Iterators?\n\nAsync iterators are a feature in modern JavaScript that allow you to consume data asynchronously. They're useful for handling paginated data from APIs. Async iterators use the `for-await-of` loop to iterate over data, fetching it as needed.\n\nUsing async iterators provides several advantages:\n\n- **Simplified Syntax:** The [`for-await-of`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of) loop makes consuming async iterators straightforward.\n- **On-Demand Data Fetching:** Fetch only the data you need, reducing memory usage and load on the backend.\n- **Future Compatibility:** Async iterators are a standard feature in JavaScript, ensuring compatibility with future updates and libraries.\n\nIf you're new to async iterators, the following concepts help to understand how paging works in Azure SDKs for JavaScript.\n\n- **Async Functions:** Functions that return a `Promise`.\n- **Generators:** Functions that can be paused and resumed, yielding multiple values.\n- **Async Generators:** Combine the features of async functions and generators to produce async iterators.\n\nAzure client libraries use async iterators to handle potentially large collections of data. Below are examples of how to use async iterators with various Azure services. \n\n## Loop over a few items\n\nIf you result set is only a few items, you can loop through that small list. The following code loops through a small set of containers in Azure Storage:\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/async-iterators/src/loop.ts\" range=\"19-21\":::\n\n## Loop over data by page\n\nIf your data set is larger, you may want to return the data in pages, then iterate over items in each page. The following code loops through a data by page, then each item.\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/async-iterators/src/loop-by-page.ts\" id=\"Loop_over_data_by_page\":::\n\n## Continue looping \n\nIf you need to have more control over the loop, including resuming the loop, use a continuation token. The paged iterator also supports resuming from a continuation token. In the following example, we use the continuation token from the first iteration to resume iteration at the second page.\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/async-iterators/src/continue-paging.ts\" id=\"Continue_paging\":::\n\n## Additional resources\n\n- [Sample code in this article](https://github.com/MicrosoftDocs/node-essentials/tree/main/async-iterators/src)\n- [Azure SDK pagination guidelines](https://azure.github.io/azure-sdk/typescript_design.html#ts-pagination)\n- [MDN documentation for iterators and generators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators)\n- [MDN documentation for Symbol.asyncIterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator)\n\n"
  },
  {
    "path": "articles/javascript/sdk/mermaidjs/chain-sequence.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chain-sequence.md -o ../media/mermaidjs/chain-sequence.svg\n\nsequenceDiagram\n  autonumber;\n\n  participant A as Node.js app;\n  participant B as Credential chain;\n  participant C as TokenCredential instance;\n    \n  A->>B: Authenticate to Microsoft Entra ID;\n  activate B;\n  B->>B: getToken;\n  loop Traverse TokenCredential collection until AccessToken received\n    B->>C: Fetch token;\n    activate C;\n    C->>C: getToken;\n    break when Result is AccessToken\n        C-->>B: Result;\n    end;\n    deactivate C;\n  end;\n  \n  B-->>A: AccessToken;\n  deactivate B;\n```\n"
  },
  {
    "path": "articles/javascript/sdk/mermaidjs/chained-token-credential-authentication-developer-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chained-token-credential-authentication-flow.md -o ../media/mermaidjs/chained-token-credential-authentication-developer-flow.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    C(Azure CLI):::developer --> E(Visual Studio Code):::developer;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C, stroke-width:2px;\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/javascript/sdk/mermaidjs/chained-token-credential-authentication-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chained-token-credential-authentication-flow.md -o ../media/mermaidjs/chained-token-credential-authentication-flow.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    C(Managed Identity):::deployed --> E(Azure CLI):::developer;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C, stroke-width:2px;\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/javascript/sdk/mermaidjs/default-azure-credential-authentication-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run commands:\n%%    mmdc -i default-azure-credential-authentication-flow.md -o ../media/mermaidjs/default-azure-credential-authentication-flow-inline.svg\n%%    mmdc -i default-azure-credential-authentication-flow.md -o ../media/mermaidjs/default-azure-credential-authentication-flow-expanded.png -w 1156\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    subgraph CREDENTIAL TYPES;\n        direction LR;\n        Deployed(Deployed service):::deployed ~~~ Developer(Developer tool):::developer;\n    end;\n\n    subgraph CREDENTIALS;\n        direction LR;\n        A(Environment):::deployed --> B(Workload Identity):::deployed --> C(Managed Identity):::deployed --> D(Visual Studio Code):::developer --> E(Azure CLI):::developer --> F(Azure PowerShell):::developer --> G(Azure Developer CLI):::developer --> H(Broker):::developer;\n    end;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C;\n    classDef developer fill:#F5AF6F, stroke:#EB7C39;\n\n    %% Add API ref links to credential type boxes\n    click A \"https://learn.microsoft.com/javascript/api/@azure/identity/environmentcredential?view=azure-node-latest\" _blank;\n    click B \"https://learn.microsoft.com/javascript/api/@azure/identity/workloadidentitycredential?view=azure-node-latest\" _blank;\n    click C \"https://learn.microsoft.com/javascript/api/@azure/identity/managedidentitycredential?view=azure-node-latest\" _blank;\n    click D \"https://learn.microsoft.com/javascript/api/@azure/identity/visualstudiocodecredential?view=azure-node-latest\" _blank;\n    click E \"https://learn.microsoft.com/javascript/api/@azure/identity/azureclicredential?view=azure-node-latest\" _blank;\n    click F \"https://learn.microsoft.com/javascript/api/@azure/identity/azurepowershellcredential?view=azure-node-latest\" _blank;\n    click G \"https://learn.microsoft.com/javascript/api/@azure/identity/azuredeveloperclicredential?view=azure-node-latest\" _blank;\n```\n"
  },
  {
    "path": "articles/javascript/sdk/mermaidjs/default-azure-credential-environment-variable-development.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run commands:\n%%    mmdc -i default-azure-credential-environment-variable-development.md -o ../media/mermaidjs/default-azure-credential-environment-variable-development.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow without deployed service credentials;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential when AZURE_TOKEN_CREDENTIALS is set to \"dev\";\n\n    D(Visual Studio Code):::developer --> E(Azure CLI):::developer --> F(Azure PowerShell):::developer --> G(Azure Developer CLI):::developer --> H(Broker):::developer;\n\n    %% Define styles for credential type boxes\n    classDef developer fill:#F5AF6F, stroke:#EB7C39;\n```\n"
  },
  {
    "path": "articles/javascript/sdk/mermaidjs/default-azure-credential-environment-variable-production.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run commands:\n%%    mmdc -i default-azure-credential-environment-variable-production.md -o ../media/mermaidjs/default-azure-credential-environment-variable-production.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow without developer tool credentials;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential when AZURE_TOKEN_CREDENTIALS is set to \"prod\";\n\n    A(Environment):::deployed --> B(Workload Identity):::deployed --> C(Managed Identity):::deployed;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C;\n```\n"
  },
  {
    "path": "articles/javascript/sdk/test-sdk-integration.md",
    "content": "---\ntitle: \"How to Test Azure SDK Integration in JavaScript Applications\"\ndescription: \"Learn how to test Azure SDK integration in JavaScript apps using Jest. Discover best practices for using live dependencies, doubles, and mocks with Azure client libraries.\"\nms.date: 03/26/2025\nms.topic: concept-article\nms.custom: devx-track-js\nai-usage: ai-assisted\n#customer intent: As a JavaScript or TypeScript developer new to Azure, I want understand how to test my code which depends on the Azure SDKs so that only test what is needed.\n---\n\n# How to Test Azure SDK integration in JavaScript applications\n\nTesting your integration code for the Azure SDK for JavaScript is essential to ensure your applications interact correctly with Azure services. This guide shows you how to effectively test Azure SDK integration in your JavaScript applications a testing framework. \n\nWhen deciding whether to mock out cloud service SDK calls or use a live service for testing purposes, it's important to consider the trade-offs between speed, reliability, and cost. This article demonstrates how to use a test framework for testing SDK integration. The application code inserts a document into Cosmos DB. The test code mocks out that resource usage so the cloud resource isn't used. \n\nThe frameworks used are:\n\n* Jest with CommonJs\n* Vitest with ESM\n* Node.js Test runner with ESM\n\n## Prerequisites\n\n[Node.js LTS](https://nodejs.org). LTS [release status](https://nodejs.org/about/previous-releases) is \"long-term support\", which typically guarantees that critical bugs will be fixed for a total of 30 months.\n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\nThe [Node.js test runner](https://nodejs.org/en/learn/test-runner/introduction) is part of the Node.js installation. \n\n> [!CAUTION]\n> The sample provided for the Node.js test runner uses the experimental node:test module with mock.fn(). Keep in mind that Node’s built‐in test runner doesn't yet offer a fully supported mocking API. Make sure that your target Node version supports the experimental APIs or consider using a third‑party mocking library (or stub functions) instead.\n\n### [Jest](#tab/test-with-jest)\n\n[Jest](https://jestjs.io/)\n\n### [Vitest](#tab/test-with-vitest)\n\n[Vitest](https://main.vitest.dev/)\n\n---\n\n\n### Mocking cloud services\n\n**Pros:**\n\n- Speeds up test suite by eliminating network latency.\n- Provides predictable and controlled test environments.\n- Easier to simulate various scenarios and edge cases.\n- Reduces costs associated with using live cloud services, especially in continuous integration pipelines.\n\n**Cons:**\n\n- Mocks can drift from the actual SDK, leading to discrepancies.\n- Might ignore certain features or behaviors of the live service.\n- Less realistic environment compared to production.\n\n### Using a live service\n\n**Pros:**\n\n- Is a realistic environment that closely mirrors production?\n- Is useful for integration tests to ensure different parts of the system work together?\n- Is helpful to identify issues related to network reliability, service availability, and actual data handling?\n\n**Cons:**\n\n- Is slower due to network calls.\n- Is more expensive due to potential service usage costs.\n- Is complex and time-consuming to set up and maintain a live service environment that matches production.\n\nThe choice between mocking and using live services depends on your testing strategy. For unit tests where speed and control are paramount, mocking is often the better choice. For integration tests where realism is crucial, using a live service can provide more accurate results. Balancing these approaches helps achieve comprehensive test coverage while managing costs and maintaining test efficiency.\n\n## Test doubles: Mocks, stubs, and fakes\n\nA test double is any kind of substitute used in place of something real for testing purposes. The type of double you choose is based on what you want it to replace. The term _mock_ is often meant as any _double_ when the term is used casually. In this article, the term is used specifically and illustrated specifically in the Jest test framework. \n\n### Mocks\n\nMocks (also called _spies_): Substitute in a function and be able to control and spy on the **behavior** of that function when it's called indirectly by some other code. \n\nIn the following examples, you have 2 functions: \n\n- **someTestFunction**: The function you need to test. It calls a dependency, `dependencyFunction`, which you didn't write and don't need to test.\n- **dependencyFunctionMock**: Mock of the dependency.\n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\n```typescript\nimport { mock } from 'node:test';\nimport assert from 'node:assert';\n\n// ARRANGE\nconst dependencyFunctionMock = mock.fn();\n\n// ACT\n// Mock replaces the call to dependencyFunction with dependencyFunctionMock\nconst { name } = someTestFunction()\n\n// ASSERT\nassert.strictEqual(dependencyFunctionMock.mock.callCount(), 1);\n```\n\n\n### [Jest](#tab/test-with-jest)\n\n```typescript\n// ARRANGE\nconst dependencyFunctionMock = jest.fn();\n\n// ACT\n// Jest replaces the call to dependencyFunction with dependencyFunctionMock\nconst { name } = someTestFunction()\n\n// ASSERT\nexpect(dependencyFunctionMock).toHaveBeenCalled();\n```\n\n### [Vitest](#tab/test-with-vitest)\n\n```typescript\nimport { expect, vi } from 'vitest';\n\n// ARRANGE\nconst dependencyFunctionMock = vi.fn();\n\n// ACT\n// Mock replaces the call to dependencyFunction with dependencyFunctionMock\nconst { name } = someTestFunction()\n\n// ASSERT\nexpect(dependencyFunctionMock).toHaveBeenCalledTimes(1);\n```\n\n---\n\n\n\nThe purpose of the test is to ensure that someTestFunction behaves correctly without actually invoking the dependency code. The test validates that the mock of the dependency was called. \n\n### Mock large versus small dependencies\n\nWhen you decide to mock a dependency, you can choose to mock just what you need such as:\n\n- A function or two from a **larger dependency**. Jest offers [partial mocks](https://jestjs.io/docs/mock-functions#mocking-partials) for this purpose. \n- All functions of a **smaller dependency**, as shown in the example in this article.\n\n### Stubs\n\nThe purpose of a stub is to replace a function's return data to simulate different scenarios. You use a stub to allow your code to call the function and receive various states, including successful results, failures, exceptions, and edge cases. **State verification** ensures your code handles these scenarios correctly.\n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\n```typescript\nimport { describe, it, beforeEach, mock } from 'node:test';\nimport assert from 'node:assert';\n\n// ARRANGE\nconst fakeDatabaseData = {first: 'John', last: 'Jones'};\n\nconst dependencyFunctionMock = mock.fn();\ndependencyFunctionMock.mock.mockImplementation((arg) => {\n    return fakeDatabaseData;\n});\n\n// ACT\n// Mock replaces the call to dependencyFunction with dependencyFunctionMock\nconst { name } = someTestFunction()\n\n// ASSERT\nassert.strictEqual(name, `${fakeDatabaseData.first} ${fakeDatabaseData.last}`);\n```\n\n\n### [Jest](#tab/test-with-jest)\n\n```typescript\n// ARRANGE\nconst dependencyFunctionMock = jest.fn();\nconst fakeDatabaseData = {first: 'John', last: 'Jones'};\ndependencyFunctionMock.mockReturnValue(fakeDatabaseData);\n\n// ACT\n// date is returned by mock then transformed in SomeTestFunction()\nconst { name } = someTestFunction()\n\n// ASSERT\nexpect(name).toBe(`${fakeDatabaseData.first} ${fakeDatabaseData.last}`);\n```\n\n### [Vitest](#tab/test-with-vitest)\n\n```typescript\nimport { it, expect, vi } from 'vitest';\n\n// ARRANGE\nconst fakeDatabaseData = {first: 'John', last: 'Jones'};\n\nconst dependencyFunctionMock = vi.fn();\ndependencyFunctionMock.mockReturnValue(fakeDatabaseData);\n\n// ACT\n// date is returned by mock then transformed in SomeTestFunction()\nconst { name } = someTestFunction()\n\n// ASSERT\nexpect(name).toBe(`${fakeDatabaseData.first} ${fakeDatabaseData.last}`);\n```\n\n\n---\n\n\n\nThe purpose of the preceding test is to ensure that the work done by `someTestFunction` meets the expected outcome. In this simple example, the function's task is to concatenate the first and family names. By using fake data, you know the expected result and can validate that the function performs the work correctly.\n\n### Fakes\n\nFakes substitute a functionality that you wouldn't normally use in production, such as using an in-memory database instead of a cloud database.\n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-node-testrunner/test/fake-in-mem-db.test.ts\" :::\n\n\n### [Jest](#tab/test-with-jest)\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-jest/src/fakes/fake-in-mem-db.spec.ts\" :::\n\n### [Vitest](#tab/test-with-vitest)\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-vitest/tests/fake-in-mem-db.test.ts\" :::\n\n\n---\n\n\n\nThe purpose of the preceding test is to ensure that `someTestFunction` correctly interacts with the database. By using a fake in-memory database, you can test the function's logic without relying on a real database, making the tests faster and more reliable.\n\n## Scenario: Insert document into Cosmos DB using Azure SDK\n\nImagine you have an application that needs to write a new document to Cosmos DB _if_ all the information is submitted and verified. If an empty form is submitted or the information doesn't match the expected format, the application shouldn't enter the data.\n\nCosmos DB is used as an example, however the concepts apply to most of the Azure SDKs for JavaScript. The following function captures this functionality:\n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-node-testrunner/src/lib/insert.ts\":::\n\n\n### [Jest](#tab/test-with-jest)\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-jest/src/mock-function/lib/insert.ts\":::\n\n### [Vitest](#tab/test-with-vitest)\n\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-vitest/src/lib/insert.ts\":::\n\n---\n\n\n\n> [!NOTE]\n> TypeScript types help define the kinds of data a function uses. While you don't need TypeScript to use Jest or other JavaScript testing frameworks, it's essential for writing type-safe JavaScript.\n\nThe functions in this application are:\n\n| Function | Description  |\n|--|--|\n| **insertDocument**      | Inserts a document into the database. **This is what we want to test**. |\n| **inputVerified**       | Verifies the input data against a schema. Ensures data is in the correct format (for example, valid email addresses, correctly formatted URLs).|\n| **cosmos.items.create** | SDK function for Azure Cosmos DB using the [@azure/cosmos](https://www.npmjs.com/package/@azure/cosmos). **This is what we want to mock**. It already has its own tests maintained by the package owners. We need to verify that the Cosmos DB function call was made and returned data if the incoming data passed verification. |\n\n### Install test framework dependency\n\n- [Node.js LTS](https://nodejs.org).\n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\nThis framework is provided as part of Node.js LTS.\n\n### [Jest](#tab/test-with-jest)\n\n\nIn the root of the application directory, install Jest with the following command:\n\n```console\nnpm install -D jest\n```\n\n### [Vitest](#tab/test-with-vitest)\n\nIn the root of the application directory, install Vitest with the following command:\n\n```console\nnpm install -D vitest\n```\n\n---\n\n### Configure package to run test\n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\n\nUpdate the `package.json` for the application with a new script to test our source code files. Source code files are defined by matching on partial file name and extension. Test runner looks for files following the common naming convention for test files: `<file-name>.spec.[jt]s`. This pattern means files named like the following examples are interpreted as test files and run by Test runner:\n\n- ***.test.js**: For example, math.test.js\n- ***.spec.js**: For example, math.spec.js\n- **Files located in a *__tests__* directory**, such as __tests__/math.js\n\nAdd a script to the *package.json* to support that test file pattern with Test runner:\n\n```JSON\n\"scripts\": {\n    \"test\": \"node --test --experimental-test-coverage --experimental-test-module-mocks --trace-exit\"\n}\n```\n\n\n### [Jest](#tab/test-with-jest)\n\n\nUpdate the `package.json` for the application with a new script to test our source code files. Source code files are defined by matching on partial file name and extension. Jest looks for files following the common naming convention for test files: `<file-name>.spec.[jt]s`. This pattern means files named like the following examples are interpreted as test files and run by Jest:\n\n- ***.test.js**: For example, math.test.js\n- ***.spec.js**: For example, math.spec.js\n- **Files located in a *__tests__* directory**, such as __tests__/math.js\n\nAdd a script to the *package.json* to support that test file pattern with Jest:\n\n```JSON\n\"scripts\": {\n    \"test\": \"jest dist --coverage\",\n}\n```\n\nThe TypeScript source code is generated into the `dist` subfolder where Jest finds and runs the `*.spec.js` files.\n\n\n### [Vitest](#tab/test-with-vitest)\n\n\n\nUpdate the `package.json` for the application with a new script to test our source code files. Source code files are defined by matching on partial file name and extension. Vitest looks for files following the common naming convention for test files: `<file-name>.spec.[jt]s`. This pattern means files named like the following examples are interpreted as test files and run by Vitest:\n\n- ***.test.js**: For example, math.test.js\n- ***.spec.js**: For example, math.spec.js\n- **Files located in a *__tests__* directory**, such as __tests__/math.js\n\nAdd a script to the *package.json* to support that test file pattern with Vitest:\n\n```JSON\n\"scripts\": {\n    \"test\": \"vitest run --coverage\",\n}\n```\n\n---\n\n\n### Set up unit test for Azure SDK \n\nHow can we use mocks, stubs, and fakes to test the **insertDocument** function? \n\n- Mocks: we need a mock to make sure the **behavior** of the function is tested such as:\n  - If the data does pass verification, the call to the Cosmos DB function happened only 1 time\n  - If the data doesn't pass verification, the call to the Cosmos DB function didn't happen\n- Stubs:\n  - The data passed in matches the new document returned by the function.\n\nWhen testing, think in terms of the test setup, the test itself, and the verification. In terms of test vernacular, this functionality uses the following terms:\n\n* Arrange: set up your test conditions\n* Act: call your function to test, also known as the _system under test_ or SUT\n* Assert: validate the results. Results can be behavior or state. \n    * Behavior indicates functionality in your test function, which can be verified. One example is that some dependency was called.\n    * State indicates the data returned from the function.  \n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-node-testrunner/test/boilerplate.test.ts\":::\n\n\n### [Jest](#tab/test-with-jest)\n\nJest has a test file template to define your test file. \n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-jest/src/test-boilerplate/boilerplate.spec.ts\":::\n\n### [Vitest](#tab/test-with-vitest)\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-vitest/tests/boilerplate.test.ts\":::\n\n---\n\n\n\nWhen you use mocks in your tests, that template code needs to use mocking to test the function without calling the underlying dependency used in the function, such as the Azure client libraries. \n\n## Create the test file\n\nThe test file with mocks, to simulate a call to a dependency, has an extra setup. \n\n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\n\nThere are several parts to the test file:\n\n- `import`: The import statements allow you to use or mock out any of your test.\n- `mock`: Create the default mock behavior you want. Each test can alter as needed. \n- `describe`: Test group family for the `insert.ts` file.\n- `it`: Each test for the `insert.ts` file.\n\n### [Jest](#tab/test-with-jest)\n\nThere are several parts to the test file:\n\n- `import`: The import statements allow you to use or mock out any of your test.\n- `jest.mock`: Create the default mock behavior you want. Each test can alter as needed. \n- `describe`: Test group family for the `insert.ts` file.\n- `test`: Each test for the `insert.ts` file.\n\n\n### [Vitest](#tab/test-with-vitest)\n\nThere are several parts to the test file:\n\n- `import`: The import statements allow you to use or mock out any of your test.\n- `vi.spyOn`: Create the default spy then add mock behavior with `.mockReturnValue`. Each test can alter as needed. \n- `describe`: Test group family for the `insert.ts` file.\n- `it`: Each test for the `insert.ts` file.\n\n---\n\n\nThe test file covers three tests for the `insert.ts` file, which can be divided into two validation types:\n\n|Validation type|Test|\n|--|--|\n|Happy path: `should insert document successfully`|The mocked database method was called, and returned the altered data.|\n|Error path: `should return verification error if input is not verified`|Data failed validation and returned an error.|\n|Error path:`should return error if db insert fails`|The mocked database method was called, and returned an error.|\n\n\nThe following test file shows how to test the **insertDocument** function.\n\n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-node-testrunner/test/insert.test.ts\":::\n\n\n### [Jest](#tab/test-with-jest)\n\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-jest/src/mock-function/lib/insert.spec.ts\":::\n\n\n### [Vitest](#tab/test-with-vitest)\n\n:::code language=\"TypeScript\" source=\"~/../node-essentials/test-with-vitest/tests/insert.test.ts\":::\n\n\n---\n\n## Troubleshooting\n\nMost of the code in this article comes from the [MicrosoftDocs/node-essentials](https://github.com/MicrosoftDocs/node-essentials/) GitHub repository. If you want to insert into a Cosmos DB Cloud resource, [create the resource with this script](https://github.com/MicrosoftDocs/node-essentials/blob/main/scripts/create-cosmos-db-resources.sh).\n\n### [Node.js test runner](#tab/test-with-node-testrunner)\n\n[Sample code](https://github.com/MicrosoftDocs/node-essentials/tree/main/test-with-node-testrunner)\n\n### [Jest](#tab/test-with-jest)\n\n[Sample code](https://github.com/MicrosoftDocs/node-essentials/tree/main/test-with-jest)\n\n### [Vitest](#tab/test-with-vitest)\n\n[Sample code](https://github.com/MicrosoftDocs/node-essentials/tree/main/test-with-vitest)\n\n---\n\n## Additional information \n\n- [Jest Mocking Best Practices](https://devblogs.microsoft.com/ise/jest-mocking-best-practices/)\n- [Vitest mocking](https://vitest.dev/guide/mocking)\n- [Node.js Test runner](https://nodejs.org/en/learn/test-runner/introduction)\n- [The Difference between Mocks and Stubs](https://martinfowler.com/articles/mocksArentStubs.html#TheDifferenceBetweenMocksAndStubs) by Martin Fowler\n\n"
  },
  {
    "path": "articles/javascript/sdk/use-azure-sdk.md",
    "content": "---\ntitle: Use Azure client libraries for JavaScript\ndescription: To programmatically access your Azure services, use the Azure client libraries (SDKs) for JavaScript or TypeScript development.\nms.topic: concept-article\nms.date: 12/05/2025\nms.custom: devx-track-js, devx-track-ts\n---\n\n# Use Azure client libraries for JavaScript and TypeScript\n\nTo programmatically access your Azure services, use the Azure client libraries for JavaScript.  Typically, these libraries are scoped with the [@azure](https://www.npmjs.com/search?q=%40azure) npm package scope published by [microsoft1es](https://www.npmjs.com/~microsoft1es). \n\n## Differences between client libraries and REST APIs\n\nUse the following information to understand when to use which type of access.\n\n* The [Azure client libraries](../azure-sdk-library-package-index.md#modern-javascripttypescript-libraries) are the preferred method of accessing your Azure service. These libraries abstract away the boilerplate code required to manage cloud-based Azure platform REST requests such as authentication, retries, and logging.\n* [Azure REST APIs](/rest/api/azure/) are the preferred method if you are:\n  * Working with preview services that don't have Azure client libraries available. Consider your code as preview, which should be updated when the service is generally available with client libraries.\n  * Want to make REST calls directly because you don't want the entire SDK to use a single REST API or you want deeper control over the HTTP requests.\n\n## Azure client and management libraries\n\nThe Azure client library [releases](../azure-sdk-library-package-index.md) are available as:\n\n* [Management](https://github.com/azure/azure-sdk-for-js#management): Management libraries enable you to create and manage Azure resources. You can recognize these libraries by `arm-` in their package names. The term `arm` indicates the Azure Resource Manager.\n  * [Documentation and code samples](https://aka.ms/azsdk/js/mgmt)\n* [Client](https://github.com/azure/azure-sdk-for-js#client): Given an Azure resource already exists, use the client libraries to consume it and interact with it.\n  * Each package README.md includes documentation and samples.\n\n## Install Azure npm packages\n\nAzure client libraries are freely available from [NPM and Yarn](azure-sdk-install.md). Install individual SDKs as needed. Each SDK provides TypeScript definitions.\n\nFor client/browser usage, Azure client libraries need to be added to your [bundling](#bundling) process.\n\n## Use Azure npm package sample code\n\nEach package includes documentation to quickly get you started with the package. Refer to the specific package's documentation you use to learn how to use them.\n\n## Provide authentication credentials\n\nThe Azure client libraries require credentials [to authenticate to the Azure platform](../sdk/authentication/local-development-environment-service-principal.md). [Credential classes](https://www.npmjs.com/package/@azure/identity#credential-classes) provided by [@azure/identity](https://www.npmjs.com/package/@azure/identity) provide several benefits:\n\n* Fast onboarding\n* Most secure method\n* Separate the authentication mechanism from the code. This allows you to use the same code locally and on the Azure platform while the credentials are different. \n* Provide chained authentication so several mechanisms can be available.\n\n## Create an SDK client and call methods\n\nOnce you programmatically create a credential, pass the credential to your Azure client. The client may require additional information such as a subscription ID or service endpoint. These values are available in the Azure portal, for your resource.\n\nThe following code example uses `DefaultAzureCredential` and the [`@azure/arm-resources`](https://www.npmjs.com/package/@azure/arm-resources) client library to list resource groups which this credential has access to read.\n\n:::code language=\"TypeScript\" source=\"~/../azure-sdk-for-js-docs/samples/identity/resources/src/list-resources.ts\" highlight=\"13,14\" :::\n\n## Asynchronous paging of results\n\nAn SDK method can return an asynchronous iterator, [PagedAsyncIterableIterator](/javascript/api/@azure/core-paging/pagedasynciterableiterator), to allow for asynchronous results. The results may use paging and continuation tokens to break up result sets.\n\nThe following [JavaScript example](https://github.com/Azure-Samples/js-e2e/blob/main/storage/blob-paging/blob-paging.js) demonstrates asynchronous paging. The code sets an artificially short paging size of 2 in order to quickly and visually demonstrate the process when you run the sample code in debug.\n\n:::code language=\"JavaScript\" source=\"~/../js-e2e/storage/blob-paging/blob-paging.js\" highlight=\"21-41\":::\n\nLearn more about paging and iterators on Azure:\n\n* [Async Iterators in the Azure SDK for JavaScript/TypeScript](https://devblogs.microsoft.com/azure-sdk/async-iterators-in-the-azure-sdk-for-javascript-typescript/)\n\n## Long running operations\n\nAn SDK method can return a long running operation (LRO) [raw response](/javascript/api/%40azure/core-lro/rawresponse). This response includes information including:\n\n* Your request completed\n* Your request is still in process\n\nThe following [JavaScript example](https://github.com/Azure-Samples/js-e2e/blob/main/storage/upload-url-to-blob-poll-until-done/upload-url-to-blob-poll-until-done.js) demonstrates how to wait for an LRO to complete, with `.pollUntildone()`, before continuing.\n\n:::code language=\"JavaScript\" source=\"~/../js-e2e/storage/upload-url-to-blob-poll-until-done/upload-url-to-blob-poll-until-done.js\" highlight=\"38-44\":::\n\nLearn more about long running operations on Azure:\n\n* [@azure/core-lro](/javascript/api/overview/azure/core-lro-readme)\n\n## Canceling async operations\n\nThe [@azure/abort-controller](https://www.npmjs.com/package/@azure/abort-controller) package provides AbortController and AbortSignal classes. Use the AbortController to create an AbortSignal, which can then be passed to Azure SDK operations to cancel pending work. Azure SDK operations can be:\n\n* Aborted based on your own logic\n* Aborted based on a time out limit\n* Aborted based on a parent task's signal\n* Aborted based on a parent task's signal _or_ a time out limit\n\nLearn more:\n\n* [How to use abort signals to cancel operations in the Azure SDK for JavaScript/TypeScript](https://devblogs.microsoft.com/azure-sdk/how-to-use-abort-signals-to-cancel-operations-in-the-azure-sdk-for-javascript-typescript/ )\n\n## Verbose logging from the SDK\n\nWhen you're using the Azure SDK, there may be times when you need to debug your application.\n\n* To enable logging at **build-time**, set the AZURE_LOG_LEVEL environment variable to `info`.\n* To enable logging at **run-time**, use the [@azure/logger](https://www.npmjs.com/package/@azure/logger) package:\n\n    ```javascript\n    import { setLogLevel } from \"@azure/logger\";\n\n    setLogLevel(\"info\");\n    ```\n\n## Bundling\n\nLearn about bundling with the Azure SDK:\n\n* [To bundle the Azure SDKs](https://aka.ms/AzureSDKBundling)\n* [Bundling samples](https://github.com/Azure/azure-sdk-for-js/tree/main/samples/Bundling)\n\n## Next steps\n\n* [List subscriptions with **@azure/arm-subscriptions** SDK](../sdk/authentication/local-development-environment-service-principal.md)\n* [List recent resource operations with **@azure/arm-monitor** SDK](../how-to/with-azure-sdk/list-resource-operation-history.md)\n"
  },
  {
    "path": "articles/javascript/tutorial/browser-file-upload-azure-storage-blob.md",
    "content": "---\ntitle: \"Upload Image to Azure Blob Storage with TypeScript\"\ntitleSuffix: TypeScript on Azure\ndescription: Learn how to securely upload images to Azure Blob Storage using TypeScript. This tutorial covers SAS tokens, direct browser uploads, and API integration.\n#customer intent: As a TypeScript developer, I want to explore how to implement the Valet Key pattern for secure file uploads, so that I can enhance the security of my applications.\nms.topic: tutorial\nms.date: 12/19/2025\nauthor: diberry\nms.author: diberry\nms.reviewer: diberry\nms.custom: scenarios:getting-started, languages:TypeScript, devx-track-ts, azure-sdk-storage-blob-typescript-version-12.2.1, engagement-fy23\n# CustomerIntent: As a JavaScript developer new to Azure, I want to learn how to upload files to Azure Storage from a browser without exposing authentication secrets.\n---\n\n\n# Tutorial: Upload an image to an Azure Storage blob with TypeScript\n\nThis tutorial shows you how to upload files from a browser directly to Azure Blob Storage without exposing credentials. You'll use TypeScript to implement the [Valet Key pattern](/azure/architecture/patterns/valet-key) with Shared Access Signature (SAS) tokens and Managed Identity for secure, keyless authentication.\n\nThe sample application includes:\n- A Fastify API that generates time-limited SAS tokens\n- A React frontend that uploads files directly to Azure Storage\n- Infrastructure as code for deployment with Azure Developer CLI\n\nBy the end of this tutorial, you'll have a working application deployed to Azure Container Apps that demonstrates secure file uploads without exposing storage credentials to the browser.\n\n## Prerequisites\n\nBefore you begin, ensure you have:\n\n* An Azure subscription - [create one for free][free Azure account]\n* A [GitHub account](https://github.com/join) to use GitHub Codespaces (includes free monthly hours)\n\n> [!TIP]\n> This tutorial uses GitHub Codespaces, which provides a pre-configured development environment in your browser. No local setup required.\n\n## Architecture\n\n:::image type=\"content\" source=\"./media/browser-file-upload-azure-storage-blob/architecture-with-user-flow.png\" lightbox=\"./media/browser-file-upload-azure-storage-blob/architecture-with-user-flow.png\" alt-text=\"Azure architecture diagram showing the upload flow: User selects file in Web App Frontend, frontend requests SAS token from API App Backend, backend gets user delegation key from Managed Identity and generates SAS token from Storage Blob Container, frontend uploads file directly to Storage using SAS token, backend queries Storage to list uploaded files. Container Registry provides container images for both apps.\":::\n\nThe frontend requests a SAS token from the API, then uploads files directly to Azure Storage. After upload, the API lists all uploaded files with read-only SAS tokens for display.\n\n:::image type=\"content\" source=\"./media/browser-file-upload-azure-storage-blob/solution-demo-shared-access-signature-token-file-storage.gif\" alt-text=\"Screenshot of a web app titled 'Upload file to Azure Storage' with a Select File button and container name upload displayed.\":::\n\n## Key concepts\n\n### User Delegation SAS tokens\n\nThe application uses User Delegation SAS tokens for secure, keyless authentication. These tokens are signed with Microsoft Entra ID credentials through Managed Identity. The API generates short-lived tokens (10-60 minutes) with specific permissions (read, write, or delete), allowing the browser to upload files directly to storage without exposing credentials.\n\n### Azure Developer CLI deployment\n\nDeploy the complete infrastructure with `azd up`. This provisions Azure Container Apps for the React frontend and Fastify API backend, configures managed identities, and assigns RBAC permissions. The infrastructure uses Bicep templates following Azure Well-Architected Framework principles with Azure Verified Modules where applicable.\n\n\n## Development container environment\n\nThis tutorial's [complete sample code](https://github.com/Azure-Samples/azure-typescript-upload-file-storage-blob) uses a development container in either [GitHub Codespaces](https://codespaces.new/Azure-Samples/azure-typescript-upload-file-storage-blob) or local Visual Studio Code.\n\n> [!NOTE]\n> You can also run this tutorial locally in Visual Studio Code with the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers). The [complete sample code](https://github.com/Azure-Samples/azure-typescript-upload-file-storage-blob) includes the development container configuration.\n\n## Open the sample in GitHub Codespaces\n\n[GitHub Codespaces](https://docs.github.com/codespaces) provides a browser-based VS Code environment with all dependencies preinstalled.\n\n> [!IMPORTANT]\n> All GitHub accounts can use Codespaces with free hours each month. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. In a web browser, open the [sample repository](https://github.com/Azure-Samples/azure-typescript-upload-file-storage-blob) and select **Code** > **Create codespace on main**. \n\n    :::image type=\"content\" source=\"media/browser-file-upload-azure-storage-blob/github-codespaces-button.png\" alt-text=\"Screenshot of GitHub repository page showing Go to file, Add file, and green Code button highlighted.\":::\n\n1. Wait for the development container to start. This startup process can take a few minutes. The remaining steps in this tutorial take place in the context of this development container.\n\n## Deploy the sample\n\n1. Sign in to Azure.\n\n    ```azdcli\n    azd auth login\n    ```\n\n1. Provision resources and deploy the sample to the hosting environment.\n\n    ```azdcli\n    azd up\n    ```\n\n    When prompted, enter the following information:\n\n    |Prompt|Enter|\n    |--|--|\n    | Enter a unique environment name | `secure-upload` |\n    | Select an Azure Subscription to use | Select your subscription from the list |\n    | Enter a value for the 'location' infrastructure parameter | Select from the locations available |\n\n    Alternatively, if you would like to see the resources provisioned then see the deployment output, you can run the following command to deploy without prompts:\n    \n    ```azdcli\n    azd provision\n    ```\n\n    Then run this command to deploy the application code:\n    \n    ```azdcli    \n    azd deploy\n    ```\n\n    If you change the API or web app code, you can redeploy just the application code with one of the following commands:\n\n    ```azdcli\n    azd deploy app\n    azd deploy api\n    ```\n\n1. When the deployment is complete, note the URL of the deployed web app displayed in the terminal.\n\n    ```console\n      (✓) Done: Deploying service app\n      - Endpoint: https://app-gp2pofajnjhy6.calmtree-87e53015.eastus2.azurecontainerapps.io/\n    ```\n\n    This is an example URL. Your URL will be different.\n\n## Try the sample\n\n1. Open the deployed web app in a new browser tab and select a PNG file to upload. Several PNG files are available in the `./docs/media` folder. \n\n    :::image type=\"content\" source=\"media/browser-file-upload-azure-storage-blob/browser-app-select-file.png\" alt-text=\"Screenshot of web app for uploading files to Azure Storage, showing Select File button and container name upload.\" lightbox=\"media/browser-file-upload-azure-storage-blob/browser-app-select-file.png\":::\n\n1. Select **Get SAS token**, then select **Upload file**.\n1. View your uploaded file in the gallery below the upload button.\n\n    :::image type=\"content\" source=\"media/browser-file-upload-azure-storage-blob/browser-file-upload-complete.png\" alt-text=\"Screenshot of web app after uploading daisies.jpg to Azure Storage, showing file name, SAS URL, upload status, and image thumbnail.\" lightbox=\"media/browser-file-upload-azure-storage-blob/browser-file-upload-complete.png\":::\n\n**What just happened?**\n- Your file uploaded directly from the browser to Azure Storage using a time-limited, write-only SAS token\n- The gallery images load directly from Azure Storage using read-only SAS tokens\n- No authentication secrets were exposed in your browser\n\n## How the code works\n\nNow that you've seen the application in action, explore how the code implements secure file uploads. The application has two main parts:\n\n1. **API backend** - Authenticates with Azure and generates SAS tokens\n2. **React frontend** - Uploads files directly to Azure Storage using SAS tokens\n\nThe following sections walk through the key code implementations.\n\n### API server to generate SAS tokens and list files\n\nThe API server authenticates to Azure Storage and generates time-limited SAS tokens for the browser to use.\n\n### Authentication with Managed Identity\n\nThe application uses User Delegation Keys with Managed Identity for authentication, which is the most secure approach for Azure applications. The `ChainedTokenCredential` tries authentication methods in this order:\n\n1. **In Azure**: `ManagedIdentityCredential` (Container Apps identity)\n2. **Local development**: `AzureCliCredential` (your `az login` session)\n\n```typescript\n// From: packages/api/src/lib/azure-storage.ts\nexport function getCredential(): ChainedTokenCredential {\n  if (!_credential) {\n    const clientId = process.env.AZURE_CLIENT_ID;\n    \n    // Create credential chain with ManagedIdentity first\n    const credentials = [\n      new ManagedIdentityCredential(clientId ? { clientId } : undefined),\n      new AzureCliCredential()\n    ];\n    \n    _credential = new ChainedTokenCredential(...credentials);\n  }\n  return _credential;\n}\n```\n\nAfter authentication, create a `BlobServiceClient` to interact with Azure Storage:\n\n```typescript\n// From: packages/api/src/lib/azure-storage.ts\nexport function getBlobServiceClient(accountName: string): BlobServiceClient {\n  const credential = getCredential();\n  const url = `https://${accountName}.blob.core.windows.net`;\n  \n  return new BlobServiceClient(url, credential);\n}\n```\n\n### Generate SAS tokens with User Delegation Keys\n\nSAS tokens require a User Delegation Key, which authenticates the token using Microsoft Entra ID credentials instead of storage account keys. The key is valid for a specific time range:\n\n```typescript\nconst startsOn = new Date();\nconst expiresOn = new Date(startsOn.valueOf() + minutes * 60 * 1000);\n\nconst userDelegationKey = await blobServiceClient.getUserDelegationKey(\n  startsOn,\n  expiresOn\n);\n```\n\n### Generate write-only SAS tokens for file uploads\n\nFor file uploads, the API generates write-only tokens that can't read or delete data. The tokens expire after 10 minutes:\n\n```typescript\n// From: packages/api/src/routes/sas.ts\nconst DEFAULT_SAS_TOKEN_PERMISSION = 'w';\nconst DEFAULT_SAS_TOKEN_EXPIRATION_MINUTES = 10;\n\nconst sasToken = generateBlobSASQueryParameters(\n  {\n    containerName: container,\n    blobName: file,\n    permissions: BlobSASPermissions.parse(permission),\n    startsOn,\n    expiresOn\n  },\n  userDelegationKey,\n  accountName\n).toString();\n\nconst sasUrl = `${blobClient.url}?${sasToken}`;\n```\n\n**Available permission levels:**\n- `'r'` - Read (download/view)\n- `'w'` - Write (upload/overwrite) - **Used for uploads**\n- `'d'` - Delete\n- `'c'` - Create\n- `'a'` - Add (append blobs)\n\n### Generate read-only SAS tokens for listing and viewing files\n\nFor listing and displaying files, the API generates read-only tokens that expire after 60 minutes:\n\n```typescript\n// From: packages/api/src/routes/list.ts\nconst LIST_SAS_TOKEN_PERMISSION = 'r';\nconst LIST_SAS_TOKEN_EXPIRATION_MINUTES = 60;\n\nconst sasToken = generateBlobSASQueryParameters(\n  {\n    containerName: container,\n    blobName: blob.name,\n    permissions: BlobSASPermissions.parse(LIST_SAS_TOKEN_PERMISSION),\n    startsOn,\n    expiresOn\n  },\n  userDelegationKey,\n  accountName\n).toString();\n\nconst sasUrl = `${blobClient.url}?${sasToken}`;\n```\n\n### Web app client request and receive SAS tokens from the API server\n\nThe React frontend requests SAS tokens from the API and uses them to directly upload files to Azure Storage from the browser.\n\nThe frontend follows a three-step process:\n\n1. **Request a SAS token** from the API for a specific file\n2. **Upload directly to Azure Storage** using the SAS token URL\n3. **Fetch and display** the list of uploaded files with read-only SAS tokens\n\nThis architecture keeps the backend lightweight - it only generates tokens, never handles file data.\n\n\n### Request a Blob Storage SAS Token from the API server\n\nWhen a user selects a file and clicks \"Get SAS Token\", the frontend requests a write-only SAS token from the API:\n\n```typescript\n// From: packages/app/src/App.tsx\nconst handleFileSasToken = () => {\n  const permission = 'w'; // write-only\n  const timerange = 10;   // 10 minutes expiration\n\n  if (!selectedFile) return;\n\n  // Build API request URL\n  const url = `${API_URL}/api/sas?file=${encodeURIComponent(\n    selectedFile.name\n  )}&permission=${permission}&container=${containerName}&timerange=${timerange}`;\n\n  fetch(url, {\n    method: 'GET',\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  })\n    .then((response) => {\n      if (!response.ok) {\n        throw new Error(`Error: ${response.status} ${response.statusText}`);\n      }\n      return response.json();\n    })\n    .then((data: SasResponse) => {\n      const { url } = data;\n      setSasTokenUrl(url); // Store the SAS URL for upload\n    });\n};\n```\n\n**What happens:**\n- Frontend sends: `GET /api/sas?file=photo.jpg&permission=w&container=upload&timerange=10`\n- API returns: `{ url: \"https://storageaccount.blob.core.windows.net/upload/photo.jpg?sv=2024-05-04&...\" }`\n- This URL is valid for 10 minutes and grants **write-only** access to that specific blob\n\n## Upload directly to Blob Storage using the SAS token\n\nOnce the SAS token URL is received, the frontend converts the file to an ArrayBuffer and uploads the file **directly to Azure Storage** - bypassing the API entirely. This reduces server load and improves performance.\n\nConvert the file to an ArrayBuffer.\n\n```typescript\n// From: packages/app/src/lib/convert-file-to-arraybuffer.ts\nexport function convertFileToArrayBuffer(file: File): Promise<ArrayBuffer | null> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n\n    reader.onload = () => {\n      const arrayBuffer = reader.result;\n      resolve(arrayBuffer as ArrayBuffer);\n    };\n\n    reader.onerror = () => {\n      reject(new Error('Error reading file.'));\n    };\n\n    reader.readAsArrayBuffer(file);\n  });\n}\n```\n\nThen, use the `BlockBlobClient` from `@azure/storage-blob` to upload the file data using the SAS token URL.\n\n```typescript\n// From: packages/app/src/App.tsx\nconst handleFileUpload = () => {\n  console.log('SAS Token URL:', sasTokenUrl);\n\n  // Convert file to ArrayBuffer\n  convertFileToArrayBuffer(selectedFile as File)\n    .then((fileArrayBuffer) => {\n      if (fileArrayBuffer === null || fileArrayBuffer.byteLength < 1) {\n        throw new Error('Failed to convert file to ArrayBuffer');\n      }\n\n      // Create Azure Storage client with SAS URL\n      const blockBlobClient = new BlockBlobClient(sasTokenUrl);\n      \n      // Upload directly to Azure Storage\n      return blockBlobClient.uploadData(fileArrayBuffer);\n    })\n    .then((uploadResponse) => {\n      if (!uploadResponse) {\n        throw new Error('Upload failed - no response from Azure Storage');\n      }\n      setUploadStatus('Successfully finished upload');\n      \n      // After upload, fetch the updated list of files\n      const listUrl = `${API_URL}/api/list?container=${containerName}`;\n      return fetch(listUrl);\n    });\n};\n```\n\n**Key points:**\n- The file **never passes through your API server**\n- Upload goes directly from browser to Azure Storage\n- The SAS token authenticates the request\n- No server bandwidth or processing costs for file handling\n\n### Fetch the file directly from Azure Storage and display the thumbnail image\n\nAfter a successful upload, the frontend fetches a list of all files in the container. Each file in the list comes with its own **read-only SAS token**:\n\n```typescript\n// From: packages/app/src/App.tsx\nconst listUrl = `${API_URL}/api/list?container=${containerName}`;\n\nfetch(listUrl)\n  .then((response) => {\n    if (!response.ok) {\n      throw new Error(`Error: ${response.status}`);\n    }\n    return response.json();\n  })\n  .then((data: ListResponse) => {\n    setList(data.list); // Array of SAS URLs with read permission\n  });\n```\n\n**Response example:**\n```json\n{\n  \"list\": [\n    \"https://storageaccount.blob.core.windows.net/upload/photo1.jpg?sv=2024-05-04&se=2025-12-18T15:30:00Z&sr=b&sp=r&...\",\n    \"https://storageaccount.blob.core.windows.net/upload/photo2.jpg?sv=2024-05-04&se=2025-12-18T15:30:00Z&sr=b&sp=r&...\"\n  ]\n}\n```\n\n\nThe frontend uses the SAS URLs directly in image tags. The browser fetches images from Azure Storage using the embedded read-only tokens:\n\n```typescript\n// From: packages/app/src/App.tsx\n<Grid container spacing={2}>\n  {list.map((item) => {\n    const urlWithoutQuery = item.split('?')[0];\n    const filename = urlWithoutQuery.split('/').pop() || '';\n    const isImage = filename.endsWith('.jpg') || \n                    filename.endsWith('.png') || \n                    filename.endsWith('.jpeg');\n    \n    return (\n      <Grid item xs={6} sm={4} md={3} key={item}>\n        <Card>\n          {isImage ? (\n            <CardMedia component=\"img\" image={item} alt={filename} />\n          ) : (\n            <Typography>{filename}</Typography>\n          )}\n        </Card>\n      </Grid>\n    );\n  })}\n</Grid>\n```\n\n**How it works:**\n- Each URL in the list includes a read-only SAS token (`sp=r`)\n- Browser makes GET requests directly to Azure Storage\n- No authentication required - the token is in the URL\n- Tokens expire after 60 minutes (configured in the API)\n\n## Clean up resources\n\nWhen you're finished with this tutorial, remove all Azure resources to avoid ongoing charges:\n\n```azdcli\nazd down\n```\n\n## Troubleshooting\n\nReport [issues](https://github.com/Azure-Samples/azure-typescript-upload-file-storage-blob/issues) with this sample in the GitHub repo. Include the following with the issue:\n\n* The URL of the article\n* The step or context within the article that was problematic\n* Your development environment\n\n## Sample code\n\n* GitHub repository: [Azure-Samples/azure-typescript-upload-file-storage-blob](https://github.com/Azure-Samples/azure-typescript-upload-file-storage-blob)\n\n## Next steps\n\nNow that you've learned how to securely upload files to Azure Storage, explore these related topics:\n\n* [Azure Blob Storage documentation](/azure/storage/blobs/storage-blobs-introduction) - Learn about storage tiers, lifecycle management, and advanced features\n* [@azure/storage-blob npm package](https://www.npmjs.com/package/@azure/storage-blob) - Explore the full SDK reference and additional capabilities\n* [Valet Key pattern](/azure/architecture/patterns/valet-key) - Understand the architectural pattern behind this solution\n* [Managed Identity best practices](/entra/identity/managed-identities-azure-resources/managed-identity-best-practice-recommendations) - Secure your Azure applications\n\n## Related content\n\n* [Deploy TypeScript applications to Azure](/azure/developer/javascript/how-to/deploy-web-app)\n* [Azure Developer CLI documentation](/azure/developer/azure-developer-cli/overview)\n\n[free Azure account]: https://azure.microsoft.com/pricing/free-trial/"
  },
  {
    "path": "articles/javascript/what-is-azure-for-javascript-development.md",
    "content": "---\ntitle: What is Azure for JavaScript developers\ndescription: Azure concepts for JavaScript, TypeScript, and Node.js developers. \nms.topic: overview\nms.date: 04/27/2026\nms.custom: devx-track-js, devx-track-ts\n---\n\n# What is Azure for JavaScript developers\n\nAzure is a cloud platform that provides a full range of hosting options and cloud-based services. If you're new to cloud development, learn more about Azure:\n\n* [Azure Architecture Center](/azure/architecture/) \n* [Azure terminology](/azure/cloud-adoption-framework/ready/considerations/fundamental-concepts)\n* [Ten design principles for Azure applications](/azure/architecture/guide/design-principles/)\n* [Cloud design patterns](/azure/architecture/patterns/)\n\n## JavaScript, TypeScript, and the modern JavaScript ecosystem\n\nAzure fully supports modern JavaScript development, including:\n\n* **TypeScript** - First-class support with typed SDKs and DevOps tooling\n* **ECMAScript modules** - All Azure SDKs support both CommonJS and ESM formats\n* **Modern frameworks** - React, Angular, Vue, Next.js, Nuxt, Remix, and other modern frameworks\n* **Deno and Bun** - Emerging JavaScript runtimes with experimental Azure SDK support\n* **Server-side rendering (SSR)** and **Static Site Generation (SSG)** - Fully supported on Azure hosting platforms\n\nAzure runtime support for JavaScript also supports TypeScript or any other language that transpiles to JavaScript. The Azure SDK for JavaScript is written in TypeScript and includes type definitions to provide excellent IDE support and type safety.\n\n## Azure services for JavaScript developers\n\nAzure cloud-based services provide a wide variety of features that you can use independently or as a collection.\n\nTop service categories for JavaScript developers include:\n\n* **Hosting and Compute**\n  * [Azure Static Web Apps](../intro/hosting-apps-on-azure.md) - Ideal for modern web applications\n  * [Azure Functions](/azure/azure-functions/functions-reference-node) - Serverless compute with native JavaScript support\n  * [Azure Container Apps](/azure/container-apps) - Kubernetes-based serverless container hosting\n  * [Azure App Service](/azure/app-service/quickstart-nodejs) - Managed hosting for web applications\n\n* **Data and Storage**\n  * [Azure Cosmos DB](/azure/cosmos-db/nosql/quickstart-nodejs) - NoSQL database with native JavaScript APIs\n  * [Azure Database for PostgreSQL](/azure/postgresql/) - Managed PostgreSQL service\n  * [Azure DocumentDB (with MongoDB compatibility)](/azure/documentdb/) - Managed MongoDB compatibility database\n  * [Azure Storage](/azure/storage/blobs/storage-quickstart-blobs-nodejs) - Scalable cloud storage\n  * [Azure Cache for Redis](/azure/azure-cache-for-redis/cache-nodejs-get-started) - In-memory data store\n\n* **AI and Cognitive Services**\n  * [Azure OpenAI Service](/azure/ai-services/openai/quickstart?tabs=javascript) - Advanced AI models for applications\n  * [Foundry Tools](/azure/ai-services/multi-service-resource?tabs=nodejs) - Pre-built AI capabilities\n\n* **Developer Tools**\n  * [GitHub Actions with Azure](/azure/developer/github/github-actions) - CI/CD integration\n  * [Azure Developer CLI](/azure/developer/azure-developer-cli/overview) - Streamlined developer experience\n* **AI and Developer Tools**\n  * [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/introduction) - AI-assisted development with Azure context\n  * [Azure MCP Server](/azure/developer/azure-mcp-server/overview) - IDE-integrated Azure resource management via Model Context Protocol\n  * [Azure Skills](/azure/developer/azure-skills) - Pre-built AI skills for common Azure development tasks\n\n## Create Azure services in the Quickstart Center\n\nWhen you start learning the Azure cloud,  [create an account for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn), then go to the [Quickstart Center](https://portal.azure.com/#blade/Microsoft_Azure_Resources/QuickstartCenterBlade) in the Azure portal.\n\nEach service's page on the Azure portal includes connection information you need to access your resource outside of the portal. \n\n### Pricing tiers\n\nPricing tiers determine how you pay for your resource. Use the [Azure pricing calculator](https://azure.microsoft.com/pricing/calculator) to understand billing for your resource. \n\n### Free tier resources\n\nWhen you select the free (F0) pricing tier, understand the limitations that come with that plan. When a free tier is offered:\n\n* A subscription might be limited to one free resource of that service. If you can't create a free resource, the free resource might already exist in your subscription.\n* A pricing tier determines transactions per second (TPS), or transactions per month (TPM). When you exceed the pricing tier quota, your application receives an HTTP error with a message indicating you're out of quota. If you anticipate this issue for your application and Azure services, create several resources and host them behind a single endpoint. \n\n## Prepare your development environment\n\nFor the best development experience, set up your development environment with the following tools:\n\n* [Visual Studio Code](https://code.visualstudio.com/) and the [Azure Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) extension\n* [Git](https://git-scm.com/)\n* [Node.js](https://nodejs.org/en/) - always use the Long-term support (LTS) version if possible. \n* If you need to synchronize your local development runtime with your Azure hosted runtime (such as Azure App Service, Azure Functions, or Azure Static Web apps), use a runtime version management solution such as:\n* [**Development Containers**](https://containers.dev/): Use a container with a specific Node.js version. You can manage the version of Node.js across several environments using containers. Visual Studio Code's [Remote - Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) simplifies this process.\n* [Azure CLI](/cli/azure/install-azure-cli) to provide Azure resource creation and management. \n* Local development hosting CLIs such as: \n  * [Static web apps CLI](https://github.com/Azure/static-web-apps-cli)\n  * [Azure Functions Core Tools](https://github.com/Azure/azure-functions-core-tools).\n\n## Use Azure client libraries with JavaScript\n\nTo use Azure services programmatically with JavaScript, find the [npm package](azure-sdk-library-package-index.md) specific to the service you want to use. Each npm package has service-specific connection information.\n\nAll Azure client libraries run with JavaScript without any other tooling. While most modern SDKs are written in TypeScript and provide the `*.d.ts` file for type checking, TypeScript isn't a requirement to use the Azure client libraries or the Azure cloud services. \n\nYour JavaScript code can use Azure services, regardless of where your code is hosted (local, hybrid, cloud). The recommended way to use Azure services programmatically with JavaScript is the Azure client libraries. These libraries expect a minimum Node.js with Long-term support (LTS).\n\n## Azure SDK for JavaScript\n\nThe [Azure SDK for JavaScript](https://github.com/Azure/azure-sdk-for-js) provides libraries that make it easy to consume and manage Azure services. Browse the complete [Azure SDK library package index](azure-sdk-library-package-index.md) to find the packages you need.\n\nKey features include:\n* Modular npm packages for each Azure service\n* First-class TypeScript support with comprehensive type definitions\n* Modern async patterns with Promise-based APIs\n* Browser and Node.js compatibility for many services\n\n## Node.js support in Azure\n\nAzure services regularly update their Node.js runtime support. Always use Long-Term Support (LTS) versions of Node.js for production applications. \n\nFor current Node.js version support across Azure services and best practices for Node.js deployment, see:\n* [Azure SDK client libraries support policy](https://github.com/Azure/azure-sdk-for-js/blob/main/SUPPORT.md#microsoft-support-policy)\n* [Node.js versions in Azure App Service](/azure/app-service/configure-language-nodejs)\n* [Node.js in Azure Functions](/azure/azure-functions/functions-reference-node)\n* [Container-based deployments](../intro/hosting-apps-on-azure.md) for custom Node.js versions\n\nBest practices include pinning your Node.js version, using LTS versions, and monitoring for security vulnerabilities.\n\n[!INCLUDE [Azure services Node.js minimum version](includes/nodejs-runtime-for-azure-services.md)]\n\n## Try a JavaScript quickstart for your hosting scenario\n\nHosting options allow you to quickly use Azure for your application. The following hosting quickstarts and tutorials guide you to the most common Azure first day experience:\n\n* **Front-end client with APIs** using [Azure Static Web apps](/azure/static-web-apps/)\n    * [Vanilla JS](/azure/static-web-apps/getting-started?tabs=vanilla-javascript)\n    * [React](/azure/static-web-apps/getting-started?tabs=react)\n    * [Angular](/azure/static-web-apps/getting-started?tabs=angular)\n    * [Vue](/azure/static-web-apps/getting-started?tabs=vue)\n* **Serverless APIs** using [Azure Functions](/azure/azure-functions/)\n* **Server application** using [Azure App Service](/azure/app-service/) \n    * [Deploy Express.js MongoDB app to App Service from Visual Studio Code](/azure/app-service/tutorial-nodejs-mongodb-app?tabs=azure-portal%2Cterminal-bash%2Cvscode-deploy%2Cdeploy-instructions-azportal%2Cdeploy-zip-linux-mac%2Cdeploy-instructions--zip-azcli)\n* **Container** application using [Azure Container Apps](/azure/container-apps/quickstart-code-to-cloud?tabs=bash%2Cjavascript&pivots=with-dockerfile)\n\n## Next steps\n\n* [Learn recommended tools for Azure JavaScript developers](node-azure-tools.md)\n[!INCLUDE [javascript-new-releases](includes/javascript-at-microsoft/bullet.md)]"
  },
  {
    "path": "articles/jenkins/azure-container-instances-as-jenkins-build-agent.md",
    "content": "---\ntitle: Tutorial - Use Azure Container Instances as a Jenkins build agent\ndescription: Learn how to configure a Jenkins server to run build jobs in Azure Container Instances\nkeywords: jenkins, azure, devops, container instances, build agent\nms.topic: tutorial\nms.date: 01/08/2021\nms.custom: devx-track-jenkins,devx-track-azurecli\n---\n\n# Tutorial: Use Azure Container Instances as a Jenkins build agent\n\n[!INCLUDE [jenkins-integration-with-azure.md](includes/jenkins-integration-with-azure.md)]\n\nAzure Container Instances (ACI) provides an on-demand, burstable, and isolated environment for running containerized workloads. Because of these attributes, ACI makes a great platform for running Jenkins build jobs at a large scale. This article shows you how to deploy an ACI and add it as a permanent build agent for a Jenkins controller.\n\nFor more information on Azure Container Instances, see [About Azure Container Instances](/azure/container-instances/container-instances-overview).\n\n## Prerequisites\n\n- **Azure subscription**: If you don't have an Azure subscription, [create a free Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n- **Jenkins server**: If you don't have a Jenkins server installed, [create a Jenkins server on Azure](./configure-on-linux-vm.md).\n\n## Prepare the Jenkins controller\n\n1. Browse to your Jenkins portal.\n\n1. From the menu, select **Manage Jenkins**.\n\n1. Under **System Configuration**, select **Configure System**.\n\n1. Verify that the **Jenkins URL** is set to the HTTP address of your Jenkins installation - `http://<your_host>.<your_domain>:8080/`.\n\n1. From the menu, select **Manage Jenkins**.\n\n1. Under **Security**, select **Configure Global Security**.\n\n1. Under **Agents**, specify **Fixed** port and enter the appropriate port number for your environment.\n\n1. Select **Save**.\n\n## Create Jenkins work agent\n\n1. Browse to your Jenkins portal.\n\n1. From the menu, select **Manage Jenkins**.\n\n1. Under **System Configuration**, select **Manage Nodes and Clouds**.\n\n1. From the menu, select **New Node**.\n\n1. Enter a value for **Node Name**.\n\n1. Select **Permanent Agent**.\n\n1. Select **OK**.\n\n1. Enter a value for **Remote root directory**. For example, `/home/jenkins/work`\n\n1. Add a  **Label** (Labels are used to group multiple agents into one logical group. An example of a label would be `linux` to group your Linux agents.) with the value of `linux`.\n\n1. Set **Launch method** to **Launch agent by connecting to the master**.\n\n1. Verify that all required fields have been specified or entered.\n\n1. Select **Save**.\n\n1. On the agent status page, you should see the `JENKINS_SECRET` and `AGENT_NAME`. The following screen shot shows how to identify the values. Both values are needed when you create the Azure Container Instance.\n\n## Create Azure Container Instance with CLI\n\n1. Use [az group create](/cli/azure/group?#az-group-create) to create an Azure resource group.\n\n      ```azurecli\n      az group create --name my-resourcegroup --location westus\n      ```\n\n1. Use [az container create](/cli/azure/container#az-container-create) to create an Azure Container Instance. Replace the placeholders with the values obtained when you created the work agent.\n\n    ```azurecli\n    az container create \\\n      --name my-dock \\\n      --resource-group my-resourcegroup \\\n      --ip-address Public --image jenkins/inbound-agent:latest \\\n      --os-type linux \\\n      --ports 80 \\\n      --command-line \"jenkins-agent -url http://jenkinsserver:port <JENKINS_SECRET> <AGENT_NAME>\"\n    ```\n\n    Replace `http://jenkinsserver:port`, `<JENKINS_SECRET>`, and `<AGENT_NAME>` with your Jenkins controller and agent information. After the container starts, it will connect to the Jenkins controller server automatically.\n\n1. Return to the Jenkins dashboard and check the agent status.\n\n    > [!NOTE]\n    > Jenkins agents connect to the controller via port `5000`, ensure that port is allowed inbound to the Jenkins Controller.\n\n## Create a build job\n\nNow, a Jenkins build job is created to demonstrate Jenkins builds on an Azure container instance.\n\n1. Select **New Item**, give the build project a name such as **aci-demo**, select **Freestyle project**, and select **OK**.\n\n1. Under **General**, ensure that **Restrict where this project can be run** is selected. Enter **linux** for the label expression. This configuration ensures that this build job runs on the ACI cloud.\n\n1. Under **Build**, select **Add build step** and select **Execute Shell**. Enter `echo \"aci-demo\"` as the command.\n\n1. Select **Save**.\n\n## Run the build job\n\nTo test the build job and observe Azure Container Instances manually start a build.\n\n1. Select **Build Now** to start a build job. Once the job starts you see a job status.\n\n1. Click build **#1** in the **Build History**.\n\n1. Select **Console Output** to view the builds output.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [CI/CD to Azure App Service](/azure/jenkins/tutorial-jenkins-deploy-web-app-azure-app-service)\n"
  },
  {
    "path": "articles/jenkins/azure-storage-blobs-as-build-artifact-repository.md",
    "content": "---\ntitle: Tutorial - Use Azure Storage for build artifacts\ndescription: Learn how to use the Azure blob service as a repository for build artifacts created by a Jenkins continuous integration solution.\nkeywords: jenkins, azure, devops, storage, cicd, build artifacts\nms.topic: tutorial\nms.date: 01/12/2021\nms.custom:\n  - devx-track-jenkins\n  - devx-track-azurecli\n  - sfi-ropc-nochange\n---\n\n# Tutorial: Use Azure Storage for build artifacts\n\n[!INCLUDE [jenkins-integration-with-azure.md](includes/jenkins-integration-with-azure.md)]\n\nThis article illustrates how to use Blob storage as a repository of build artifacts created by a Jenkins continuous integration (CI) solution, or as a source of downloadable files to be used in a build process. One of the scenarios where you would find this solution useful is when you're coding in an agile development environment (using Java or other languages), builds are running based on continuous integration, and you need a repository for your build artifacts, so that you could, for example, share them with other organization members, your customers, or maintain an archive. Another scenario is when your build job itself requires other files, for example, dependencies to download as part of the build input.\n\n## Prerequisites\n\n- **Azure subscription**: If you don't have an Azure subscription, [create a free Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n- **Jenkins server**: If you don't have a Jenkins server installed, [create a Jenkins server on Azure](./configure-on-linux-vm.md).\n- **Azure CLI**: Install Azure CLI (version 2.0.67 or higher) on the Jenkins server.\n- **Azure storage account**: If you don't already have a storage account, [create a Storage Account](/azure/storage/common/storage-account-create).\n\n## Add Azure credential needed to execute Azure CLI\n\n1. Browse to the Jenkins portal.\n\n1. From the menu, select **Manage Jenkins**.\n\n1. Select **Manage Credentials**.\n\n1. Select the **global** domain.\n\n1. Select **Add Credentials**.\n\n1. Fill out the required fields as follows:\n\n    - **Kind**: Select **Username with password**.\n    - **Username**: Specify the `appId` of the service principal.\n    - **Password**: Specify the `password` of the service principal.\n    - **ID**: Specify a credential identifier, such as `azuresp`.\n    - **Description**: Optionally, include a meaningful description for your environment.\n\n1. Select **OK** to create the credential.\n\n## Create a pipeline job to upload build artifacts\n\nThe following steps guide you through creating a pipeline job. The pipeline job creates several files and uploads the files to your storage account using Azure CLI.\n\n1. From the Jenkins dashboard, select **New Item**.\n\n1. Name the job **myjob**, select **Pipeline**, and then select **OK**.\n\n1. In the **Pipeline** section of the job configuration, select **Pipeline script** and paste the following into **Script**. Edit the placeholders to match the values for your environment.\n\n    ```groovy\n    pipeline {\n      agent any\n      environment {\n        AZURE_SUBSCRIPTION_ID='99999999-9999-9999-9999-999999999999'\n        AZURE_TENANT_ID='99999999-9999-9999-9999-999999999999'\n        AZURE_STORAGE_ACCOUNT='myStorageAccount'\n      }\n      stages {\n        stage('Build') {\n          steps {\n            sh 'rm -rf *'\n            sh 'mkdir text'\n            sh 'echo Hello Azure Storage from Jenkins > ./text/hello.txt'\n            sh 'date > ./text/date.txt'\n          }\n    \n          post {\n            success {\n              withCredentials([usernamePassword(credentialsId: 'azuresp', \n                              passwordVariable: 'AZURE_CLIENT_SECRET', \n                              usernameVariable: 'AZURE_CLIENT_ID')]) {\n                sh '''\n                  echo $container_name\n                  # Login to Azure with ServicePrincipal\n                  az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID\n                  # Set default subscription\n                  az account set --subscription $AZURE_SUBSCRIPTION_ID\n                  # Execute upload to Azure\n                  az storage container create --account-name $AZURE_STORAGE_ACCOUNT --name $JOB_NAME --auth-mode login\n                  az storage blob upload-batch --destination ${JOB_NAME} --source ./text --account-name $AZURE_STORAGE_ACCOUNT\n                  # Logout from Azure\n                  az logout\n                '''\n              }\n            }\n          }\n        }\n      }\n    }\n    ```\n\n1. Select **Build Now** to run **myjob**.\n\n1. Examine the console output for status. When the post-build action uploads the build artifacts, status messages for Azure storage are written to the console.\n\n1. If you encounter an error similar to the following, it means that you need to grant access at the container level: `ValidationError: You do not have the required permissions needed to perform this operation.` If you receive this error message, refer to the following articles to resolve:\n\n    - [Choose how to authorize access to blob data with Azure CLI - Azure Storage](/azure/storage/blobs/authorize-data-operations-cli)\n    - [Use the Azure portal to assign an Azure role for data access - Azure Storage](/azure/storage/common/storage-auth-aad-rbac-portal)\n\n1. Upon successful completion of the job, examine the build artifacts by opening the public blob:\n\n    1. Sign in to the [Azure portal](https://portal.azure.com).\n    1. Select **Storage**.\n    1. Select the storage account name that you used for Jenkins.\n    1. Select **Containers**.\n    1. Select the container named **myjob**, within the list of blobs.\n    1. You should see the following two files: **hello.txt** and **date.txt**.\n    1. Copy the URL for either of these items and paste it in your browser. \n    1. You see the text file that was uploaded as a build artifact.\n    \n    **Key points**:\n\n    - Container names and blob names are lowercase (and case-sensitive) in Azure storage.\n\n## Create a pipeline job to download from Azure Blob Storage\n\nThe following steps show how to configure a pipeline job to download items from Azure Blob Storage.\n\n1. In the **Pipeline** section of the job configuration, select **Pipeline script** and paste the following in **Script**. Edit the placeholders to match the values for your environment.\n\n    ```groovy\n    pipeline {\n      agent any\n      environment {\n        AZURE_SUBSCRIPTION_ID='99999999-9999-9999-9999-999999999999'\n        AZURE_TENANT_ID='99999999-9999-9999-9999-999999999999'\n        AZURE_STORAGE_ACCOUNT='myStorageAccount'\n      }\n      stages {\n        stage('Build') {\n          steps {\n            withCredentials([usernamePassword(credentialsId: 'azuresp', \n                            passwordVariable: 'AZURE_CLIENT_SECRET', \n                            usernameVariable: 'AZURE_CLIENT_ID')]) {\n              sh '''\n                # Login to Azure with ServicePrincipal\n                az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID\n                # Set default subscription\n                az account set --subscription $AZURE_SUBSCRIPTION_ID\n                # Execute upload to Azure\n                az storage blob download --account-name $AZURE_STORAGE_ACCOUNT --container-name myjob --name hello.txt --file ${WORKSPACE}/hello.txt --auth-mode login\n                # Logout from Azure\n                az logout\n              '''   \n            }\n          }\n        }\n      }\n    }\n    ```\n    \n1. After running a build, check the build history console output. Alternatively, you can also look at your download location to see if the blobs you expected were successfully downloaded.  \n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Jenkins on Azure](/azure/Jenkins/)\n"
  },
  {
    "path": "articles/jenkins/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: Jenkins\n      tocHref: /azure\n      topicHref: /azure/developer/jenkins/index\n"
  },
  {
    "path": "articles/jenkins/configure-on-linux-vm.md",
    "content": "---\ntitle: Get Started - Install Jenkins on an Azure Linux VM\ndescription: Learn how to install Jenkins on an Azure Linux virtual machine and build a sample Java application.\nkeywords: jenkins, azure, devops, portal, linux, virtual machine\nms.topic: quickstart\nms.date: 08/13/2024\nms.custom:\n  - devx-track-jenkins\n  - devx-track-azurecli\n  - mode-portal\n  - devx-track-extended-java\n  - linux-related-content\n  - sfi-image-nochange\n---\n\n# Get Started: Install Jenkins on an Azure Linux VM\n\nThis article shows how to install [Jenkins](https://jenkins.io) on an Ubuntu Linux VM with the tools and plug-ins configured to work with Azure.\n\nIn this article, you'll learn how to:\n\n> [!div class=\"checklist\"]\n\n> * Create a setup file that downloads and installs Jenkins\n> * Create a resource group\n> * Create a virtual machine with the setup file\n> * Open port 8080 in order to access Jenkins on the virtual machine\n> * Connect to the virtual machine via SSH\n> * Configure a sample Jenkins job based on a sample Java app in GitHub\n> * Build the sample Jenkins job\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n## 2. Open Cloud Shell\n\n[!INCLUDE [open-cloud-shell.md](../includes/open-cloud-shell.md)]\n\n## 3. Create a virtual machine\n\n1. Create a test directory called `jenkins-get-started`.\n\n1. Switch to the test directory.\n\n1. Create a file named `cloud-init-jenkins.txt`.\n\n1. Paste the following code into the new file:\n\n    ```json\n    #cloud-config\n    package_upgrade: true\n    runcmd:\n      - sudo apt install openjdk-17-jre -y\n      - curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null\n      -  echo 'deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/' | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null\n      - sudo apt-get update && sudo apt-get install jenkins -y\n      - sudo service jenkins restart\n\n\n    ```\n    \n1. Run [az group create](/cli/azure/group#az-group-create) to create a resource group.\n\n    ```azurecli\n    az group create --name jenkins-get-started-rg --location eastus\n    ```\n\n1. Run [az vm create](/cli/azure/vm#az-vm-create) to create a virtual machine.\n\n    ```azurecli\n    az vm create \\\n    --resource-group jenkins-get-started-rg \\\n    --name jenkins-get-started-vm \\\n    --image UbuntuLTS \\\n    --admin-username \"azureuser\" \\\n    --generate-ssh-keys \\\n    --public-ip-sku Standard \\\n    --custom-data cloud-init-jenkins.txt\n    ```\n\n1. Run [az vm list](/cli/azure/vm#az-vm-list) to verify the creation (and state) of the new virtual machine.\n\n    ```azurecli\n    az vm list -d -o table --query \"[?name=='jenkins-get-started-vm']\"\n    ```\n\n1. As Jenkins runs on port 8080, run [az vm open](/cli/azure/vm#az-vm-open-port) to open port 8080 on the new virtual machine.\n\n    ```azurecli\n    az vm open-port \\\n    --resource-group jenkins-get-started-rg \\\n    --name jenkins-get-started-vm  \\\n    --port 8080 --priority 1010\n    ```\n\n## 4. Configure Jenkins\n\n1. Run [az vm show](/cli/azure/vm#az-vm-show) to get the public IP address for the sample virtual machine.\n\n    ```azurecli\n    az vm show \\\n    --resource-group jenkins-get-started-rg \\\n    --name jenkins-get-started-vm -d \\\n    --query [publicIps] \\\n    --output tsv\n    ```\n\n    **Key points**:\n\n    - The `--query` parameter limits the output to the public IP addresses for the virtual machine.\n\n1. Using the IP address retrieved in the previous step, SSH into the virtual machine. You'll need to confirm the connection request.\n\n    ```azurecli\n    ssh azureuser@<ip_address>\n    ```\n\n    **Key points**:\n\n    - Upon successful connection, the Cloud Shell prompt includes the user name and virtual machine name: `azureuser@jenkins-get-started-vm`.\n\n1. Verify that Jenkins is running by getting the status of the Jenkins service.\n\n    ```bash\n    service jenkins status\n    ```\n\n    **Key points**:\n\n    - If you receive an error regarding the service not existing, you may have to wait a couple of minutes for everything to install and initialize.\n\n1. Get the autogenerated Jenkins password.\n\n    ```bash\n    sudo cat /var/lib/jenkins/secrets/initialAdminPassword\n    ```\n\n1. Using the IP address, open the following URL in a browser: `http://<ip_address>:8080`\n\n1. Enter the password you retrieved earlier and select **Continue**.\n\n    ![Initial page to unlock Jenkins](./media/configure-on-linux-vm/unlock-jenkins.png)\n\n1. Select **Select plug-in to install**.\n\n    ![Select the option to install selected plug-ins](./media/configure-on-linux-vm/select-plugins.png)\n\n1. In the filter box at the top of the page, enter `github`. Select the GitHub plug-in and select **Install**.\n\n    ![Install the GitHub plug-ins](./media/configure-on-linux-vm/install-github-plugin.png)\n\n1. Enter the information for the first admin user and select **Save and Continue**.\n\n    ![Enter information for first admin user](./media/configure-on-linux-vm/create-first-user.png)\n\n1. On the **Instance Configuration** page, select **Save and Finish**.\n\n    ![Confirmation page for instance configuration](./media/configure-on-linux-vm/instance-configuration.png)\n\n1. Select **Start using Jenkins**.\n\n    ![Jenkins is ready!](./media/configure-on-linux-vm/start-using-jenkins.png)\n\n## 5. Create your first job\n\n1. On the Jenkins home page, select **Create a job**.\n\n    ![Jenkins console home page](./media/configure-on-linux-vm/jenkins-home-page.png)\n\n1. Enter a job name of `mySampleApp`, select **Freestyle project**, and select **OK**.\n\n    ![New job creation](./media/configure-on-linux-vm/new-job.png)\n\n1. Select the **Source Code Management** tab. Enable **Git** and enter the following URL for the **Repository URL** value: `https://github.com/spring-guides/gs-spring-boot.git`. Then change the **Branch Specifier** to `*/main`.\n\n    ![Define the Git repo](./media/configure-on-linux-vm/source-code-management.png)\n\n1. Select the **Build** tab, then select **Add build step**\n\n    ![Add a new build step](./media/configure-on-linux-vm/add-build-step.png)\n\n1. From the drop-down menu, select **Invoke Gradle script**.\n\n    ![Select the Gradle script option](./media/configure-on-linux-vm/invoke-gradle-script-option.png)\n\n1. Select **Use Gradle Wrapper**, then enter `complete` in **Wrapper location** and `build` for **Tasks**.\n\n    ![Gradle script options](./media/configure-on-linux-vm/gradle-script-options.png)\n\n1. Select **Advanced** and enter `complete` in the **Root Build script** field.\n\n    ![Advanced Gradle script options](./media/configure-on-linux-vm/root-build-script.png)\n\n1. Scroll to the bottom of the page, and select **Save**.\n\n## 6. Build the sample Java app\n\n1. When the home page for your project displays, select **Build Now** to compile the code and package the sample app.\n\n    ![Project home page](./media/configure-on-linux-vm/project-home-page.png)\n\n1. A graphic below the **Build History** heading indicates that the job is being built.\n\n    ![Job-build in progress](./media/configure-on-linux-vm/job-currently-building.png)\n\n1. When the build completes, select the **Workspace** link.\n\n    ![Select the workspace link.](./media/configure-on-linux-vm/job-workspace.png)\n\n1. Navigate to `complete/build/libs` to see that the `.jar` file was successfully built.\n\n    ![The target library verifies the build succeeded.](./media/configure-on-linux-vm/successful-build.png)\n\n1. Your Jenkins server is now ready to build your own projects in Azure!\n\n## Troubleshooting\n\nIf you encounter any problems configuring Jenkins, refer to the [Jenkins installation page](https://www.jenkins.io/doc/book/installing/) for the latest instructions and known issues.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Jenkins on Azure](./index.yml)\n"
  },
  {
    "path": "articles/jenkins/deploy-from-github-to-aks.md",
    "content": "---\ntitle: Tutorial - Deploy from GitHub to Azure Kubernetes Service using Jenkins\ndescription: Learn how to configure Jenkins for continuous integration (CI) from GitHub and continuous deployment (CD) to Azure Kubernetes Service (AKS) \nkeywords: jenkins, azure, devops, aks, azure kubernetes service, github\nms.topic: tutorial\nms.date: 08/07/2024\nms.custom:\n  - devx-track-jenkins\n  - devx-track-azurecli\n  - sfi-image-nochange\n---\n\n# Tutorial: Deploy from GitHub to Azure Kubernetes Service using Jenkins\n\n[!INCLUDE [jenkins-integration-with-azure.md](includes/jenkins-integration-with-azure.md)]\n\nThis tutorial deploys a sample app from GitHub to an\n[Azure Kubernetes Service (AKS)](/azure/aks/intro-kubernetes)\ncluster by setting up continuous integration (CI) and\ncontinuous deployment (CD) in Jenkins.\n\nIn this tutorial, you'll complete these tasks:\n\n> [!div class=\"checklist\"]\n> * Deploy a sample Azure vote app to an AKS cluster.\n> * Create a basic Jenkins project.\n> * Set up credentials for Jenkins to interact with ACR.\n> * Create a Jenkins build job and GitHub webhook for automated builds.\n> * Test the CI/CD pipeline to update an application in AKS based on GitHub code commits.\n\n## Prerequisites\n\nTo complete this tutorial, you need these items:\n\n- Basic understanding of Kubernetes, Git, CI/CD, and container images\n\n- An [AKS cluster](/azure/aks/kubernetes-walkthrough) and `kubectl` configured with the \n[AKS cluster credentials](/cli/azure/aks#az-aks-get-credentials).\n\n- An [Azure Container Registry (ACR) registry](/azure/container-registry/container-registry-get-started-azure-cli), \nthe ACR login server name, and the AKS cluster configured to \n[authenticate with the ACR registry](/azure/aks/cluster-container-registry-integration).\n\n- A [Jenkins Controller](./configure-on-linux-vm.md) Deployed to an Azure Virtual Machine.\n\n- The Azure CLI version 2.0.46 or later installed and configured. \nRun `az --version` to find the version. If you need to install or upgrade, \nsee [Install Azure CLI](/cli/azure/install-azure-cli).\n\n- [Docker installed](https://docs.docker.com/install/) on your development system\n\n- A GitHub account, [GitHub personal access token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/), \nand Git client installed on your development system\n\n- If you provide your own Jenkins instance rather \nthan this sample scripted way to deploy Jenkins, \nyour Jenkins instance needs [Docker installed and configured](https://docs.docker.com/install/) \nand [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/).\n\n## Prepare your app\n\nIn this article, you use a sample Azure vote application that contains a web interface and Redis for temporary data storage.\n\nBefore you integrate Jenkins and AKS for automated deployments, first manually prepare and deploy the Azure vote application to your AKS cluster. This manual deployment lets you see the application in action.\n\n> [!NOTE]\n> The sample Azure vote application uses a Linux pod that is scheduled to run on a Linux node. The flow outlined in this article also works for a Windows Server pod scheduled on a Windows Server node.\n\nFork the following GitHub repository for the sample application - [https://github.com/Azure-Samples/azure-voting-app-redis](https://github.com/Azure-Samples/azure-voting-app-redis). To fork the repo to your own GitHub account, select the **Fork** button in the top right-hand corner.\n\nClone the fork to your development system. Make sure you use the URL of your fork when cloning this repo:\n\n```console\ngit clone https://github.com/<your-github-account>/azure-voting-app-redis.git\n```\n\nChange to the directory of your cloned fork:\n\n```console\ncd azure-voting-app-redis\n```\n\nTo create the container images needed for the sample application, use the *docker-compose.yaml* file with `docker-compose`:\n\n```console\ndocker-compose up -d\n```\n\nThe required base images are pulled and the application containers built. You can then use the [docker images](https://docs.docker.com/engine/reference/commandline/images/) command to see the created image. Three images have been downloaded or created. The `azure-vote-front` image contains the application and uses the `nginx-flask` image as a base. The `redis` image is used to start a Redis instance:\n\n```\n$ docker images\n\nREPOSITORY                   TAG        IMAGE ID            CREATED             SIZE\nazure-vote-front             latest     9cc914e25834        40 seconds ago      694MB\nredis                        latest     a1b99da73d05        7 days ago          106MB\ntiangolo/uwsgi-nginx-flask   flask      788ca94b2313        9 months ago        694MB\n```\n\nSign in to your Azure container registry.\n\n```azurecli\naz acr login -n <acrLoginServer>\n```\n\nReplace `<acrLoginServer>` with your ACR login server.\n\nUse the [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) command to tag the image with the ACR login server name and a version number of `v1`. Use your own `<acrLoginServer>` name obtained in the previous step:\n\n```console\ndocker tag azure-vote-front <acrLoginServer>/azure-vote-front:v1\n```\n\nFinally, push the *azure-vote-front* image to your ACR registry. Again, replace `<acrLoginServer>` with the login server name of your own ACR registry, such as `myacrregistry.azurecr.io`:\n\n```console\ndocker push <acrLoginServer>/azure-vote-front:v1\n```\n\n## Deploy the sample application to AKS\n\nTo deploy the sample application to your AKS cluster, you can use the Kubernetes manifest file in the root of the Azure vote repository repo. Open the `azure-vote-all-in-one-redis.yaml` manifest file with an editor such as `vi`. Replace `microsoft` with your ACR login server name. This value is found on line **60** of the manifest file:\n\n```yaml\ncontainers:\n- name: azure-vote-front\n  image: azuredocs/azure-vote-front\n```\n\nNext, use the [kubectl apply](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#apply) command to deploy the application to your AKS cluster:\n\n```console\nkubectl apply -f azure-vote-all-in-one-redis.yaml\n```\n\nA Kubernetes load balancer service is created to expose the application to the internet. This process can take a few minutes. To monitor the progress of the load balancer deployment, use the [kubectl get service](https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#get) command with the `--watch` argument.\n\n```console\n$ kubectl get service azure-vote-front --watch\n```\n\nOnce the *EXTERNAL-IP* address has changed from *pending* to an *IP address*, use `Control + C` to stop the kubectl watch process.\n\n```\nNAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE\n```\n\nTo see the application in action, open a web browser to the external IP address of your service. The Azure vote application is displayed, as shown in the following example:\n\n![Azure sample vote application running in AKS](media/deploy-from-github-to-aks/azure-vote.png)\n\n## Configure Jenkins Controller\n\nApply the following changes to enable AKS deployments from the Jenkins Controller:\n\nOpen port `80` inbound.\n\n```azurecli\naz vm open-port \\\n--resource-group <Resource_Group_name> \\\n--name <Jenkins_Controller_VM>  \\\n--port 80 --priority 1020\n```\n\nReplace `<Resource_Group_name>` and `<Jenkins_Controller_VM>` with the appropriate values.\n\nSSH into the Jenkins Controller\n\n```azurecli\nssh azureuser@<PublicIPAddress>\n```\n\nReplace `<PublicIPAddress>` with the IP address of the Jenkins Controller.\n\n### Install & Log into AzCLI\n\n```azurecli\ncurl -L https://aka.ms/InstallAzureCli | bash\n``````\n\n```azurecli\naz login\n```\n\n   > [!NOTE]\n   > To manually install AzCLI, follow these [instructions](/cli/azure/install-azure-cli).\n\n### Install Docker\n\n```bash\nsudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y;\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -;\nsudo apt-key fingerprint 0EBFCD88;\nsudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable\";\nsudo apt-get update;\nsudo apt-get install docker-ce -y;\n```\n\n### Install Kubectl and Connect to AKS\n\n```azurecli\nsudo az aks install-cli\nsudo az aks get-credentials --resource-group <Resource_Group> --name <AKS_Name>\n```\n\nReplace `<Resource_Group>` and `<AKS_Name>` with the appropriate values.\n\n### Configure access\n\n```bash\nsudo usermod -aG docker jenkins;\nsudo usermod -aG docker azureuser;\nsudo touch /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion;\nsudo service jenkins restart;\nsudo cp ~/.kube/config /var/lib/jenkins/.kube/\nsudo chmod 777 /var/lib/jenkins/\nsudo chmod 777 /var/lib/jenkins/config\n```\n\n## Create a Jenkins environment variable\n\nA Jenkins environment variable is used to hold the ACR login server name. This variable is referenced during the Jenkins build job. To create this environment variable, complete the following steps:\n\n- On the left-hand side of the Jenkins portal, select **Manage Jenkins** > **Configure System**\n- Under **Global Properties**, select **Environment variables**. Add a variable with the name `ACR_LOGINSERVER` and the value of your ACR login server.\n\n    ![Jenkins environment variables](media/deploy-from-github-to-aks/env-variables.png)\n\n- When complete, Select **Save** at the bottom of the page.\n\n## Create a Jenkins credential for ACR\n\nDuring the CI/CD process, Jenkins builds new container images based on application updates, and needs to then *push* those images to the ACR registry.\n\nTo allow Jenkins to push updated container images to ACR, you need to specify credentials for ACR. \n\nFor separation of roles and permissions, configure a service principal for Jenkins with *Contributor* permissions to your ACR registry.\n\n### Create a service principal for Jenkins to use ACR\n\nFirst, create a service principal using the [az ad sp create-for-rbac](/cli/azure/ad/sp#az-ad-sp-create-for-rbac) command:\n\n```azurecli\naz ad sp create-for-rbac\n```\n\nThis command produces output similar to the following example:\n\n```output\n{\n  \"appId\": \"<app-ID>\",\n  \"displayName\": \"azure-cli-2018-09-28-22-19-34\",\n  \"name\": \"http://azure-cli-2018-09-28-22-19-34\",\n  \"password\": \"<password>\",\n  \"tenant\": \"<tenant-ID>\"\n}\n```\n\nMake a note of the *appId* and *password*. These values are used in following steps to configure the credential resource in Jenkins.\n\nGet the resource ID of your ACR registry using the [az acr show](/cli/azure/acr#az-acr-show) command, and store it as a variable.\n\n```azurecli\nACR_ID=$(az acr show --resource-group <Resource_Group> --name <acrLoginServer> --query \"id\" --output tsv)\n```\n\nReplace `<Resource_Group>` and `<acrLoginServer>` with the appropriate values.\n\nCreate a role assignment to assign the service principal *Contributor* rights to the ACR registry.\n\n```azurecli\naz role assignment create --assignee <appID> --role Contributor --scope $ACR_ID\n```\n\nReplace `<appId>` with the value provided in the output of the pervious command use to create the service principal.\n\n### Create a credential resource in Jenkins for the ACR service principal\n\nWith the role assignment created in Azure, now store your ACR credentials in a Jenkins credential object. These credentials are referenced during the Jenkins build job.\n\nBack on the left-hand side of the Jenkins portal, select **Manage Jenkins** > **Manage Credentials** > **Jenkins Store** > **Global credentials (unrestricted)** > **Add Credentials**\n\nEnsure that the credential kind is **Username with password** and enter the following items:\n\n- **Username** - The *appId* of the service principal created for authentication with your ACR registry.\n- **Password** - The *password* of the service principal created for authentication with your ACR registry.\n- **ID** - Credential identifier such as *acr-credentials*\n\nWhen complete, the credentials form looks like the following example:\n\n![Create a Jenkins credential object with the service principal information](media/deploy-from-github-to-aks/acr-credentials.png)\n\nSelect **OK** and return to the Jenkins portal.\n\n## Create a Jenkins project\n\nFrom the home page of your Jenkins portal, select **New item** on the left-hand side:\n\n1. Enter *azure-vote* as job name. Choose **Freestyle project**, then select **OK**\n1. Under the **General** section, select **GitHub project** and enter your forked repo URL, such as *https:\\//github.com/\\<your-github-account\\>/azure-voting-app-redis*\n1. Under the **Source code management** section, select **Git**, enter your forked repo `.git` URL, such as *https:\\//github.com/\\<your-github-account\\>/azure-voting-app-redis.git*\n\n1. Under the **Build Triggers** section, select **GitHub hook trigger for GITscm polling**\n1. Under **Build Environment**, select **Use secret texts or files**\n1. Under **Bindings**, select **Add** > **Username and password (separated)**\n   - Enter `ACR_ID` for the **Username Variable**, and `ACR_PASSWORD` for the **Password Variable**\n\n     ![Jenkins bindings](media/deploy-from-github-to-aks/bindings.png)\n\n1. Choose to add a **Build Step** of type **Execute shell** and use the following text. This script builds a new container image and pushes it to your ACR registry.\n\n    ```bash\n    # Build new image and push to ACR.\n    WEB_IMAGE_NAME=\"${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}\"\n    docker build -t $WEB_IMAGE_NAME ./azure-vote\n    docker login ${ACR_LOGINSERVER} -u ${ACR_ID} -p ${ACR_PASSWORD}\n    docker push $WEB_IMAGE_NAME\n    ```\n\n1. Add another **Build Step** of type **Execute shell** and use the following text. This script updates the application deployment in AKS with the new container image from ACR.\n\n    ```bash\n    # Update kubernetes deployment with new image.\n    WEB_IMAGE_NAME=\"${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}\"\n    kubectl set image deployment/azure-vote-front azure-vote-front=$WEB_IMAGE_NAME\n    ```\n\n1. Once completed, click **Save**.\n\n## Test the Jenkins build\n\nBefore you automate the job based on GitHub commits, manually test the Jenkins build.\n\nThis build validates that the job has been correctly configured. It confirms the proper Kubernetes authentication file is in place, and that authentication to ACR working.\n\nOn the left-hand menu of the project, select **Build Now**.\n\n![Jenkins test build](media/deploy-from-github-to-aks/test-build.png)\n\nThe first build longer as the Docker image layers are pulled down to the Jenkins server.\n\nThe builds do the following tasks:\n\n1. Clones the GitHub repository\n1. Builds a new container image\n1. Pushes the container image to the ACR registry\n1. Updates the image used by the AKS deployment\n\nBecause no changes have been made to the application code, the web UI is unchanged.\n\nOnce the build job is complete, select **build #1** under build history. Select **Console Output** and view the output from the build process. The final line should indicate a successful build.\n\n## Create a GitHub webhook\n\nWith a successful manual build complete, now integrate GitHub into the Jenkins build. Use a webhook to run the Jenkins build job each time code is committed to GitHub.\n\nTo create the GitHub webhook, complete the following steps:\n\n1. Browse to your forked GitHub repository in a web browser.\n1. Select **Settings**, then select **Webhooks** on the left-hand side.\n1. Choose to **Add webhook**. For the *Payload URL*, enter `http://<publicIp:8080>/github-webhook/`, where `<publicIp>` is the IP address of the Jenkins server. Make sure to include the trailing `/`. Leave the other defaults for content type and to trigger on *push* events.\n1. Select **Add webhook**.\n\n    ![Create a GitHub webhook for Jenkins](media/deploy-from-github-to-aks/webhook.png)\n\n## Test the complete CI/CD pipeline\n\nNow you can test the whole CI/CD pipeline. When you push a code commit to GitHub, the following steps happen:\n\n1. The GitHub webhook notifies Jenkins.\n1. Jenkins starts the build job and pulls the latest code commit from GitHub.\n1. A Docker build is started using the updated code, and the new container image is tagged with the latest build number.\n1. This new container image is pushed to Azure Container Registry.\n1. Your application running on Azure Kubernetes Service updates with the latest image from Azure Container Registry.\n\nOn your development machine, open up the cloned application with a code editor. Under the */azure-vote/azure-vote* directory, open the file named **config_file.cfg**. Update the vote values in this file to something other than cats and dogs, as shown in the following example:\n\n```\n# UI Configurations\nTITLE = 'Azure Voting App'\nVOTE1VALUE = 'Blue'\nVOTE2VALUE = 'Purple'\nSHOWHOST = 'false'\n```\n\nWhen updated, save the file, commit the changes, and push them to your fork of the GitHub repository. The GitHub webhook triggers a new build job in Jenkins. In the Jenkins web dashboard, monitor the build process. It takes a few seconds to pull the latest code, create and push the updated image, and deploy the updated application in AKS.\n\nOnce the build is complete, refresh your web browser of the sample Azure vote application. Your changes are displayed, as shown in the following example:\n\n![Sample Azure vote in AKS updated by the Jenkins build job](media/deploy-from-github-to-aks/azure-vote-updated.png)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Jenkins on Azure](/azure/jenkins)\n"
  },
  {
    "path": "articles/jenkins/deploy-to-azure-app-service-using-azure-cli.md",
    "content": "---\ntitle: Tutorial - Deploy to Azure App Service with Jenkins and the Azure CLI\ndescription: Learn how to use Azure CLI to deploy a Java web app to Azure in Jenkins Pipeline\nkeywords: jenkins, azure, devops, app service, cli\nms.topic: tutorial\nms.date: 01/06/2021\nms.custom:\n  - devx-track-jenkins\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - linux-related-content\n  - sfi-ropc-nochange\n---\n\n# Tutorial: Deploy to Azure App Service with Jenkins and the Azure CLI\n\n[!INCLUDE [jenkins-integration-with-azure.md](includes/jenkins-integration-with-azure.md)]\n\nTo deploy a Java web app to Azure, you can use Azure CLI in a [Jenkins Pipeline](https://jenkins.io/doc/book/pipeline/). In this tutorial, you do the following tasks:\n\n> [!div class=\"checklist\"]\n> * Create a Jenkins VM\n> * Configure Jenkins\n> * Create a web app in Azure\n> * Prepare a GitHub repository\n> * Create Jenkins pipeline\n> * Run the pipeline and verify the web app\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n- **Jenkins** - [Install Jenkins on a Linux VM](configure-on-linux-vm.md)\n- **Azure CLI**: Install Azure CLI (version 2.0.67 or higher) on the Jenkins server.\n\n## Configure Jenkins\n\nThe following steps show how to install the required Java JDK and Maven on the Jenkins controller:\n\n1. Sign in to Jenkins controller using SSH.\n\n1. Download and install the Azul Zulu build of OpenJDK for Azure from an apt-get repository:\n\n    ```bash\n    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9\n    sudo apt-add-repository \"deb http://repos.azul.com/azure-only/zulu/apt stable main\"\n    sudo apt-get -q update\n    sudo apt-get -y install zulu-8-azure-jdk\n    ```\n    \n1. Run the following command to install Maven:\n\n    ```bash\n    sudo apt-get install -y maven\n    ```\n    \n## Add Azure service principal to a Jenkins credential\n\nThe following steps show how to specify your Azure credential:\n\n1. Make sure the [Credentials plug-in](https://plugins.jenkins.io/credentials/) is installed.\n\n1. Within the Jenkins dashboard, select **Credentials -> System ->**.\n\n1. Select **Global credentials(unrestricted)**.\n\n1. Select **Add Credentials** to add a [Microsoft Azure service principal](/cli/azure/create-an-azure-service-principal-azure-cli?toc=%252fazure%252fazure-resource-manager%252ftoc.json). Make sure that the credential kind is ***Username with password*** and enter the following items:\n\n    * **Username**: Service principal `appId`\n    * **Password**: Service principal `password`\n    * **ID**: Credential identifier (such as `AzureServicePrincipal`)\n\n## Create an Azure App Service for deploying the Java web app\n\nUse [az appservice plan create](/cli/azure/appservice/plan#az-appservice-plan-create) to create an Azure App Service plan with the **FREE** pricing tier:\n\n```azurecli\naz appservice plan create \\\n    --name <app_service_plan> \\ \n    --resource-group <resource_group> \\\n    --sku FREE\n```\n\n**Key points**:\n\n- The appservice plan defines the physical resources used to host your apps.\n- All applications assigned to an appservice plan share these resources.\n- Appservice plans allow you to save cost when hosting multiple apps.\n\n## Create an Azure web app\n\nUse [az webapp create](/cli/azure/webapp#az-webapp-create) to create a web app definition in the `myAppServicePlan` App Service plan.\n\n```azurecli\naz webapp create \\\n    --name <app_name> \\ \n    --resource-group <resource_group> \\\n    --plan <app_service_plan>\n```\n\n**Key points**:\n\n- The web app definition provides a URL to access your application with and configures several options to deploy your code to Azure.\n- Substitute the `<app_name>` placeholder with a unique app name.\n- The app name is part of the default domain name for the web app. Therefore, the name needs to be unique across all apps in Azure.\n- You can map a custom domain name entry to the web app before you expose it to your users.\n\n\n## Configure Java\n\nUse [az appservice web config update](/cli/azure/webapp/config) to set up the Java runtime configuration for the app:\n\n```azurecli\naz webapp config set \\ \n    --name <app_name> \\\n    --resource-group <resource_group> \\ \n    --java-version 1.8 \\ \n    --java-container Tomcat \\\n    --java-container-version 8.0\n```\n\n## Prepare a GitHub repository\n\n1. Open the [Simple Java Web App for Azure](https://github.com/azure-devops/javawebappsample) repo.\n\n1. Select the **Fork** button to fork the repo to your own GitHub account.\n\n1. Open the **Jenkinsfile** file by clicking on the file name.\n\n1. Select the pencil icon to edit the file.\n\n1. Update the subscription ID and tenant ID.\n    \n    ```groovy\n      withEnv(['AZURE_SUBSCRIPTION_ID=<subscription_id>',\n            'AZURE_TENANT_ID=<tenant_id>']) \n    ```\n    \n1. Update the resource group and name of your web app on line 22 and 23 respectively.\n\n    ```groovy\n    def resourceGroup = '<resource_group>'\n    def webAppName = '<app_name>'\n    ```\n\n1. Update the credential ID in your Jenkins instance\n\n    ```groovy\n    withCredentials([usernamePassword(credentialsId: '<service_principal>', passwordVariable: 'AZURE_CLIENT_SECRET', usernameVariable: 'AZURE_CLIENT_ID')]) {\n    ```\n    \n## Create Jenkins pipeline\n\nDo the following to create a Jenkins pipeline:\n\n1. Open Jenkins in a web browser.\n\n1. Select **New Item**.\n\n1. Enter a name for the job.\n\n1. Select **Pipeline**.\n\n1. Select **OK**.\n\n1. Select **Pipeline**.\n\n1. For **Definition**, select **Pipeline script from SCM**.\n\n1. For **SCM**, select **Git**.\n\n1. Enter the GitHub URL for your forked repo: `https:\\<forked_repo\\>.git`\n\n1. Select **Save**\n\n## Test your pipeline\n\n1. Go to the pipeline you created\n\n1. Select **Build Now**\n\n1. After the build completes, select **Console Output** to see build details.\n\n## Verify your web app\n\nDo the following to verify the WAR file is deployed successfully to your web app:\n\n1. Browse to the following URL: `http://&lt;app_name>.azurewebsites.net/api/calculator/ping`\n\n1. You should see text similar to the following:\n\n    ```output\n    Welcome to Java Web App!!! This is updated!\n    Today's date\n    ```\n\n1. Browse to the following URL (substitute &lt;x> and &lt;y> with two values to be summed): http://&lt;app_name>.azurewebsites.net/api/calculator/add?x=&lt;x>&y=&lt;y>.\n\n    ![Example of running the demo add](./media/deploy-to-azure-app-service-using-azure-cli/calculator-add.png)\n\n## Deploy to Azure App Service on Linux\n\nApp Service can also host web apps natively on Linux for supported application stacks. It can also run custom Linux containers (also known as Web App for Containers.)\n\nYou can modify the script to deploy to an Azure App Service on Linux. App Service on Linux supports Docker. As such, you provide a Dockerfile that packages your web app with service runtime into a Docker image. The plug-in builds the image, pushes it to a Docker registry, and deploys the image to your web app.\n\n1. Refer to [Migrate custom software to Azure App Service using a custom container](/azure/app-service/tutorial-custom-container?pivots=container-linux#configure-app-service-to-deploy-the-image-from-the-registry) to create an Azure App Service on Linux and an Azure Container Registry.\n\n    ```azurecli\n        az group create --name myResourceGroup2 --location westus2\n        az acr create --name myACRName --resource-group myResourceGroup2 --sku Basic --admin-enabled true\n        az appservice plan create --name myAppServicePlan --resource-group  myResourceGroup2 --is-linux\n        az webapp create --resource-group myResourceGroup2 --plan myAppServicePlan --name myApp --deployment-container-image-name myACRName.azurecr.io/calculator:latest\n    ```\n\n1. [Install Docker on your Jenkins](https://docs.docker.com/engine/installation/linux/ubuntu/).\n\n1. Make sure [Docker Pipeline plug-in](https://plugins.jenkins.io/docker-workflow/) is installed.\n\n1. In the same [Simple Java Web App for Azure](https://github.com/azure-devops/javawebappsample) repo you forked, edit the **Jenkinsfile2** file as follows:\n\n    1. Update the subscription ID and tenant ID.\n\n        ```groovy\n         withEnv(['AZURE_SUBSCRIPTION_ID=<mySubscriptionId>',\n                'AZURE_TENANT_ID=<myTenantId>']) {\n        ```\n\n    1. Update to the names of your resource group, web app, and ACR (replacing the placeholders with your values).\n\n        ```bash\n        def webAppResourceGroup = '<resource_group>'\n        def webAppName = '<app_name>'\n        def acrName = '<registry>'\n        ```\n\n    1. Update `<azsrvprincipal\\>` to your credential ID\n\n        ```bash\n        withCredentials([usernamePassword(credentialsId: '<service_principal>', passwordVariable: 'AZURE_CLIENT_SECRET', usernameVariable: 'AZURE_CLIENT_ID')]) {\n        ```\n\n1. Create a new Jenkins pipeline as you did when deploying to Azure web app in Windows using `Jenkinsfile2`.\n\n1. Run your new job.\n\n1. To verify, in Azure CLI, run the following command:\n\n    ```azurecli\n    az acr repository list -n <myRegistry> -o json\n    ```\n\n    You should see results similar to the following:\n    \n    ```output\n    [\n    \"calculator\"\n    ]\n    ```\n    \n1. Browse to `http://<app_name>.azurewebsites.net/api/calculator/ping` (replacing the placeholder). You should see similar results to the following: \n\n    ```output\n    Welcome to Java Web App!!! This is updated!\n    Today's date\n    ```\n\n1. Browse to `http://<app_name>.azurewebsites.net/api/calculator/add?x=<x>&y=<y>` (replacing the placeholders). The values you specify for `x` and `y` are summed and displayed.\n    \n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Jenkins on Azure](/azure/jenkins)\n"
  },
  {
    "path": "articles/jenkins/deploy-to-azure-functions.md",
    "content": "---\ntitle: Tutorial - Deploy to Azure Functions using Jenkins\ndescription: Learn how to deploy to Azure Functions using the Jenkins Azure Functions plug-in\nkeywords: jenkins, azure, devops, java, azure functions\nms.topic: tutorial\nms.date: 01/27/2022\nms.custom:\n  - devx-track-jenkins\n  - devx-track-azurecli\n  - devx-track-extended-java\n  - sfi-ropc-nochange\n---\n\n# Tutorial: Deploy to Azure Functions using Jenkins\n\n[!INCLUDE [jenkins-integration-with-azure.md](includes/jenkins-integration-with-azure.md)]\n\n[Azure Functions](/azure/azure-functions/) is a serverless compute service. Using Azure Functions, you can run code on-demand without provisioning or managing infrastructure. This tutorial shows how to deploy a Java function to Azure Functions using the Azure Functions plug-in.\n\n## Prerequisites\n\n- **Azure subscription**: If you don't have an Azure subscription, create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n- **Jenkins server**: If you don't have a Jenkins server installed, refer to the article, [Create a Jenkins server on Azure](./configure-on-linux-vm.md).\n\n## View the source code\n\nThe source code used for this tutorial is located in the [Visual Studio China GitHub repo](https://github.com/VSChina/odd-or-even-function/blob/master/src/main/java/com/microsoft/azure/Function.java).\n\n## Create a Java function\n\nTo create a Java function with the Java runtime stack, use either the [Azure portal](https://portal.azure.com) or the [Azure CLI](/cli/azure/).\n\nThe following steps show how to create a Java function using the Azure CLI:\n\n1. Create a resource group, replacing the **&lt;resource_group>** placeholder with your resource group name.\n\n    ```azurecli\n    az group create --name <resource_group> --location eastus\n    ```\n\n1. Create an Azure storage account, replacing the placeholders with the appropriate values.\n \n    ```azurecli\n    az storage account create --name <storage_account> --location eastus --resource-group <resource_group> --sku Standard_LRS    \n    ```\n\n1. Create the test function app, replacing the placeholders with the appropriate values.\n\n    ```azurecli\n    az functionapp create --resource-group <resource_group> --runtime java --consumption-plan-location eastus --name <function_app> --storage-account <storage_account> --functions-version 2\n    ```\n\n## Prepare Jenkins server\n\nThe following steps explain how to prepare the Jenkins server:\n\n1. Deploy a [Jenkins server](https://azuremarketplace.microsoft.com/marketplace/apps/cloud-infrastructure-services.jenkins-windows-2019) on Azure. If you don't already have an instance of the Jenkins server installed, the article, [Create a Jenkins server on Azure](./configure-on-linux-vm.md) guides you through the process.\n\n1. Sign in to the Jenkins instance with SSH.\n\n1. On the Jenkins instance, install Az CLI,  version 2.0.67 or higher.\n\n1. Install maven using the following command:\n\n    ```bash\n    sudo apt install -y maven\n    ```\n\n1. On the Jenkins instance, install the [Azure Functions Core Tools](/azure/azure-functions/functions-run-local) by issuing the following commands at a terminal prompt:\n\n    ```bash\n    curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg\n    sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg\n    sudo sh -c 'echo \"deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-$(lsb_release -cs)-prod $(lsb_release -cs) main\" > /etc/apt/sources.list.d/dotnetdev.list'\n    cat /etc/apt/sources.list.d/dotnetdev.list\n    sudo apt-get update\n    sudo apt-get install azure-functions-core-tools-3\n    ```\n\n1. Jenkins needs an Azure service principal to authenticate and access Azure resources. Refer to the [Deploy to Azure App Service](./deploy-to-azure-app-service-using-azure-cli.md) for step-by-step instructions.\n\n1. Make sure the [Credentials plug-in](https://plugins.jenkins.io/credentials/) is installed.\n\n    1. From the menu, select **Manage Jenkins**.\n\n    1. Under **System Configuration**, select **Manage plug-in**.\n\n    1. Select the **Installed** tab.\n\n    1. In the **filter** field, enter `credentials`.\n    \n    1. Verify that the **Credentials plug-in** is installed. If not, you'll need to install it from the **Available** tab.\n\n    ![The Credentials Plug-in needs to be installed.](./media/deploy-to-azure-functions/credentials-plugin.png)\n\n1. From the menu, select **Manage Jenkins**.\n\n1. Under **Security**, select **Manage Credentials**.\n\n1. Under **Credentials**, select **(global)**.\n\n1. From the menu, select **Add Credentials**.\n\n1. Enter the following values for your [Microsoft Azure service principal](/cli/azure/create-an-azure-service-principal-azure-cli?toc=%252fazure%252fazure-resource-manager%252ftoc.json):\n\n    - **Kind**: Select the value: ***Username with password***.\n    - **Username**: Specify the `appId` of the service principal created.\n    - **Password**: Specify the `password` (secret) of the service principal.\n    - **ID**: Specify the credential identifier, such as `azuresp`.\n\n1. Select **OK**.\n\n## Fork the sample GitHub repo\n\n1. [Sign in to the GitHub repo for the odd or even sample app](https://github.com/VSChina/odd-or-even-function.git).\n\n1. In the upper-right corner in GitHub, choose **Fork**.\n\n1. Follow the prompts to select your GitHub account and finish forking.\n\n## Create a Jenkins Pipeline\n\nIn this section, you create the [Jenkins Pipeline](https://jenkins.io/doc/book/pipeline/).\n\n1. In the Jenkins dashboard, create a Pipeline.\n\n1. Enable **Prepare an environment for the run**.\n\n1. In the **Pipeline->Definition** section, select **Pipeline script from SCM**.\n\n1. Enter your GitHub fork's URL and script path (\"doc/resources/jenkins/JenkinsFile\") to use in the [JenkinsFile example](https://github.com/VSChina/odd-or-even-function/blob/master/doc/resources/jenkins/JenkinsFile).\n\n   ```nodejs\n    node {\n    withEnv(['AZURE_SUBSCRIPTION_ID=99999999-9999-9999-9999-999999999999',\n            'AZURE_TENANT_ID=99999999-9999-9999-9999-999999999999']) {\n        stage('Init') {\n            cleanWs()\n            checkout scm\n        }\n\n        stage('Build') {\n            sh 'mvn clean package'\n        }\n\n        stage('Publish') {\n            def RESOURCE_GROUP = '<resource_group>' \n            def FUNC_NAME = '<function_app>'\n            // login Azure\n            withCredentials([usernamePassword(credentialsId: 'azuresp', passwordVariable: 'AZURE_CLIENT_SECRET', usernameVariable: 'AZURE_CLIENT_ID')]) {\n            sh '''\n                az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID\n                az account set -s $AZURE_SUBSCRIPTION_ID\n            '''\n            }\n            sh 'cd $PWD/target/azure-functions/odd-or-even-function-sample && zip -r ../../../archive.zip ./* && cd -'\n            sh \"az functionapp deployment source config-zip -g $RESOURCE_GROUP -n $FUNC_NAME --src archive.zip\"\n            sh 'az logout'\n            }\n        }\n    }\n    ```\n\n## Build and deploy\n\nIt's now time to run the Jenkins job.\n\n1. First, obtain the authorization key via the instructions in the [Azure Functions HTTP triggers and bindings](/azure/azure-functions/functions-bindings-http-webhook-trigger#authorization-keys) article.\n\n1. In your browser, enter the app's URL. Replace the placeholders with the appropriate values and specify a numeric value for **&lt;input_number>** as input for the Java function.\n\n    ```\n    https://<function_app>.azurewebsites.net/api/HttpTrigger-Java?code=<authorization_key>&number=<input_number>\n    ```\n1. You'll see results similar to the following example output (where an odd number - 365 - was used as a test):\n\n    ```output\n    The number 365 is Odd.\n    ```\n\n## Clean up resources\n\nIf you're not going to continue to use this application, delete\nthe resources you created with the following step:\n\n```azurecli\naz group delete -y --no-wait -n <resource_group>\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure Functions](/azure/azure-functions/)\n"
  },
  {
    "path": "articles/jenkins/deploy-to-azure-spring-apps-using-azure-cli.md",
    "content": "---\ntitle: Deploy apps to Azure Spring Apps using Jenkins and Azure CLI\ndescription: Learn how to use Azure CLI in a continuous integration and deployment pipeline to deploy microservices to Azure Spring Apps service\nkeywords: jenkins, azure, devops, azure spring apps, azure cli\nms.topic: tutorial\nms.date: 01/28/2022\nms.custom: devx-track-jenkins, devx-track-azurecli, devx-track-extended-java\n---\n\n# Tutorial: Deploy apps to Azure Spring Apps using Jenkins and the Azure CLI\n\n> [!NOTE]\n> Azure Spring Apps is the new name for the Azure Spring Cloud service. Although the service has a new name, you'll see the old name in some places for a while as we work to update assets such as screenshots, videos, and diagrams.\n\n[Azure Spring Apps](/azure/spring-apps/overview) is a fully managed microservice development with built-in service discovery and configuration management. The service makes it easy to deploy Spring Boot-based microservice applications to Azure. This tutorial demonstrates how you can use Azure CLI in Jenkins to automate continuous integration and delivery (CI/CD) for Azure Spring Apps.\n\nIn this tutorial, you'll complete these tasks:\n\n> [!div class=\"checklist\"]\n> * Provision a service instance and launch a Java Spring application\n> * Prepare your Jenkins server\n> * Use the Azure CLI in a Jenkins pipeline to build and deploy the microservice applications \n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n- **Jenkins**: [Install Jenkins on a Linux VM](configure-on-linux-vm.md)\n- **GitHub account**: If you don't have a GitHub account, create a [free account](https://github.com/) before you begin.\n\n## Provision a service instance and launch a Java Spring application\n\nWe use [Piggy Metrics](https://github.com/Azure-Samples/piggymetrics) as the sample Microsoft service application and follow the same steps in [Quickstart: Launch a Java Spring application using the Azure CLI](/azure/spring-apps/quickstart-deploy-infrastructure-vnet-azure-cli) to provision the service instance and set up the applications. If you've already gone through the same process, you can skip to the next section. Otherwise, included in the following are the Azure CLI commands. Refer to [Quickstart: Launch a Java Spring application using the Azure CLI](/azure/spring-apps/quickstart?tabs=Azure-CLI) to get more information.\n\nYour local machine needs to meet the same prerequisite as the Jenkins build server. Make sure the following are installed to build and deploy the microservice applications:\n\n* [Git](https://git-scm.com/)\n* [JDK 8](/java/azure/jdk)\n* [Maven 3.0 or above](https://maven.apache.org/download.cgi)\n* [Azure CLI installed](/cli/azure/install-azure-cli), version 2.0.67 or higher\n\n1. Install the Azure Spring Apps extension:\n\n    ```azurecli\n    az extension add --name spring\n    ```\n\n1. Create a resource group to contain your Azure Spring Apps service:\n\n    ```azurecli\n    az group create --location eastus --name <resource group name>\n    ```\n\n1. Provision an instance of Azure Spring Apps:\n\n    ```azurecli\n    az spring create -n <service name> -g <resource group name>\n    ```\n\n1. Fork the [Piggy Metrics](https://github.com/Azure-Samples/piggymetrics) repo to your own GitHub account. In your local machine, clone your repo in a directory called `source-code`:\n\n    ```bash\n    mkdir source-code\n    git clone https://github.com/<your GitHub id>/piggymetrics\n    ```\n\n1. Set up your configuration server. Make sure you replace &lt;your GitHub id&gt; with the correct value.\n\n    ```azurecli\n    az spring config-server git set -n <your-service-name> --uri https://github.com/<your GitHub id>/piggymetrics --label config\n    ```\n\n1. Build the project:\n\n    ```bash\n    cd piggymetrics\n    mvn clean package -D skipTests\n    ```\n\n1. Create the three microservices: **gateway**, **auth-service**, and **account-service**:\n\n    ```azurecli\n    az spring app create --n gateway -s <service name> -g <resource group name>\n    az spring app create --n auth-service -s <service name> -g <resource group name>\n    az spring app create --n account-service -s <service name> -g <resource group name>\n    ```\n\n1. Deploy the applications:\n\n    ```azurecli\n    az spring app deploy -n gateway -s <service name> -g <resource group name> --jar-path ./gateway/target/gateway.jar\n    az spring app deploy -n account-service -s <service name> -g <resource group name> --jar-path ./account-service/target/account-service.jar\n    az spring app deploy -n auth-service -s <service name> -g <resource group name> --jar-path ./auth-service/target/auth-service.jar\n    ```\n\n1. Assign public endpoint to gateway:\n\n    ```azurecli\n    az spring app update -n gateway -s <service name> -g <resource group name> --is-public true\n    ```\n\n1. Query the gateway application to get the url so that you can verify that the application is running.\n\n    ```azurecli\n    az spring app show --name gateway | grep url\n    ```\n    \n 1. Navigate to the URL provided by the previous command to run the PiggyMetrics application.\n\n## Prepare Jenkins server\n\nIn this section, you prepare the Jenkins server to run a build, which is fine for testing. However, because of security implication, you should use an [Azure VM agent](https://plugins.jenkins.io/azure-vm-agents) or [Azure Container agent](https://plugins.jenkins.io/azure-container-agents) to spin up an agent in Azure to run your builds.\n\n### Install plug-ins\n\n1. Log in to your Jenkins server. \n\n1. Select **Manage Jenkins**.\n\n1. Select **Manage Plugins**.\n\n1. On the **Available** tab, select the following plug-ins:\n\n    * [GitHub Integration](https://plugins.jenkins.io/github-pullrequest)\n    * [Azure Credential](https://plugins.jenkins.io/azure-credentials)\n\n    If these plug-ins don't appear in the list, check the **Installed** tab to see if they're already installed.\n\n1. To install the plug-ins, select **Download now and install after restart**.\n\n1. Restart your Jenkins server to complete the installation.\n\n### Add your Azure Service Principal credential in Jenkins credential store\n\n1. You need an Azure Service Principal to deploy to Azure. For more information, see the [Create service principal](./deploy-to-azure-app-service-using-azure-cli.md#add-azure-service-principal-to-a-jenkins-credential) section in the Deploy to Azure App Service tutorial. The output from `az ad sp create-for-rbac` looks something like this:\n\n    ```\n    {\n        \"appId\": \"xxxxxx-xxx-xxxx-xxx-xxxxxxxxxxxx\",\n        \"displayName\": \"xxxxxxxjenkinssp\",\n        \"name\": \"http://xxxxxxxjenkinssp\",\n        \"password\": \"xxxxxx-xxx-xxxx-xxx-xxxxxxxxxxxx\",\n        \"tenant\": \"xxxxxx--xxx-xxxx-xxx-xxxxxxxxxxxx\"\n    }\n    ```\n\n1. On the Jenkins dashboard, select **Credentials** > **System**. Then, select **Global credentials(unrestricted)**.\n\n1. Select **Add Credentials**.\n\n1. Select **Microsoft Azure Service Principal** as kind.\n\n1. Supply values for the following fields:\n\n    - **Subscription ID**: Azure subscription ID\n    - **Client ID**: Service principal appid\n    - **Client Secret**: Service principal password\n    - **Tenant ID**: Microsoft account tenant ID\n    - **Azure Environment**: Select the appropriate value for your environment. For example, use **Azure** for Azure Global\n    - **ID**: Set as `azure_service_principal`. We use this ID in a later step in this article\n    - **Description**: This value is optional, but recommended from a documentation/maintenance standpoint.\n    \n### Install Maven and Azure CLI spring extension\n\nThe sample pipeline uses Maven to build and Azure CLI to deploy to the service instance. When Jenkins is installed, it creates an admin account named *jenkins*. Ensure that the user *jenkins* has permission to run the spring extension.\n\n1. Connect to the Jenkins controller via SSH.\n\n1. Install Maven.\n\n    ```bash\n    sudo apt-get install maven\n    ```\n\n1. Verify that the Azure CLI is installed by entering `az version`. If the Azure CLI isn't installed, see [Installing the Azure CLI](/cli/azure/install-azure-cli).\n\n1. Switch to the `jenkins` user:\n\n    ```bash\n    sudo su jenkins\n    ```\n\n1. Install the spring extension:\n\n    ```azurecli\n    az extension add --name spring\n    ```\n\n## Create a Jenkinsfile\n\n1. In your own repo - `https://github.com/your_github_id/piggymetrics` - create a **Jenkinsfile** in the root.\n\n1. Update the file as follows. Make sure you replace the values of **\\<resource group name>** and **\\<service name>**. Replace **azure_service_principal** with the right ID if you use a different value when you added the credential in Jenkins.\n\n   ```groovy\n       node {\n         stage('init') {\n           checkout scm\n         }\n         stage('build') {\n           sh 'mvn clean package'\n         }\n         stage('deploy') {\n           withCredentials([azureServicePrincipal('azure_service_principal')]) {\n             // Log in to Azure\n             sh '''\n               az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET -t $AZURE_TENANT_ID\n               az account set -s $AZURE_SUBSCRIPTION_ID\n             '''  \n             // Set default resource group name and service name. Replace <resource group name> and <service name> with the right values\n             sh 'az config set defaults.group=<resource group name>'\n             sh 'az config set defaults.spring=<service name>'\n\n             // Deploy applications\n             sh 'az spring app deploy -n gateway --jar-path ./gateway/target/gateway.jar'\n             sh 'az spring app deploy -n account-service --jar-path ./account-service/target/account-service.jar'\n             sh 'az spring app deploy -n auth-service --jar-path ./auth-service/target/auth-service.jar'\n             sh 'az logout'\n           }\n         }\n       }\n   ```\n\n1. Save and commit the change.\n\n## Create the job\n\n1. On the Jenkins dashboard, select **New Item**.\n\n1. Provide a name, *Deploy-PiggyMetrics* for the job and select **Pipeline**. Click OK.\n\n1. Select the **Pipeline** tab.\n\n1. For **Definition**, select **Pipeline script from SCM**.\n\n1. For **SCM**, select **Git**.\n\n1. Enter the GitHub URL for your forked repo: `https://github.com/&lt;your GitHub id&gt;/piggymetrics.git`.\n\n1. For **Branch Specifier (black for 'any')**, select **/Azure**.\n\n1. For **Script path**, select **Jenkinsfile**.\n\n1. Select **Save**\n\n## Validate and run the job\n\nBefore running the job, edit the text in the login input box to **enter login ID**.\n\n1. In your repo, open `index.html` in `/gateway/src/main/resources/static/`.\n\n1. Search for `enter your login` and update that text to `enter login ID`.\n\n    ```HTML\n    <input class=\"frontforms\" id=\"frontloginform\" name=\"username\" placeholder=\"enter login ID\" type=\"text\" autocomplete=\"off\"/>\n    ```\n\n1. Save and commit the change.\n\n1. Run the job in Jenkins manually. On the Jenkins dashboard, select the job `Deploy-PiggyMetrics` and then select **Build Now**.\n\nAfter the job is complete, navigate to the public IP of the `gateway` application and verify that your application has been updated.\n\n![Updated Piggy Metrics](./media/deploy-to-azure-spring-apps-using-azure-cli/piggymetrics.png)\n\n## Clean up resources\n\nWhen no longer needed, delete the resources created in this article:\n\n```azurecli\naz group delete -y --no-wait -n <resource group name>\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Jenkins on Azure](/azure/jenkins/)\n"
  },
  {
    "path": "articles/jenkins/deploy-to-linux-vm-using-azure-devops-services.md",
    "content": "---\ntitle: Deploy to Linux virtual machine using Jenkins and Azure DevOps Services\ndescription: Learn how to facilitate continuous integration and deployment (CI/CD) to deploy apps to Linux virtual machines using Jenkins and Azure DevOps Services\nkeywords: jenkins, azure, devops, virtual machine, cicd, azure devops services\nms.topic: tutorial\nms.date: 08/13/2024\nms.custom:\n  - devx-track-jenkins\n  - devx-track-js\n  - linux-related-content\n  - sfi-image-nochange\n---\n\n# Tutorial: Deploy to Linux virtual machine using Jenkins and Azure DevOps Services\n\nContinuous integration (CI) and continuous deployment (CD) form a pipeline by which you can build, release, and deploy your code. Azure DevOps Services provides a complete, fully featured set of CI/CD automation tools for deployment to Azure. Jenkins is a popular third-party CI/CD server-based tool that also provides CI/CD automation. You can use Azure DevOps Services and Jenkins together to customize how you deliver your cloud app or service.\n\nIn this tutorial, you use Jenkins to build a Node.js web app. You then use Azure DevOps to deploy it\n\nto a [deployment group](/azure/devops/pipelines/release/deployment-groups/index) that contains Linux virtual machines (VMs). You learn how to:\n\n> [!div class=\"checklist\"]\n> * Get the sample app.\n> * Configure Jenkins plug-ins.\n> * Configure a Jenkins Freestyle project for Node.js.\n> * Configure Jenkins for Azure DevOps Services integration.\n> * Create a Jenkins service endpoint.\n> * Create a deployment group for the Azure virtual machines.\n> * Create an Azure Pipelines release pipeline.\n> * Execute manual and CI-triggered deployments.\n\n## Prerequisites\n\n- **Azure subscription**: If you don't have an Azure subscription, [create a free Azure account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n- **Jenkins server**: If you don't have a Jenkins server installed, [create a Jenkins server on Azure](./configure-on-linux-vm.md).\n\n  > [!NOTE]\n  > For more information, see [Connect to Azure DevOps Services](/azure/devops/organizations/projects/connect-to-projects).\n\n*  You need a Linux virtual machine for a deployment target.  For more information, see [Create and manage Linux VMs with the Azure CLI](/azure/virtual-machines/linux/tutorial-manage-vm).\n\n*  Open inbound port 80 for your virtual machine. For more information, see [Create network security groups using the Azure portal](/azure/virtual-network/tutorial-filter-network-traffic).\n\n## Get the sample app\n\nYou need an app to deploy, stored in a Git repository.\nFor this tutorial, we recommend that you use [this sample app available from GitHub](https://github.com/azure-devops/fabrikam-node). This tutorial contains a sample script that's used for installing Node.js and an application. If you want to work with your own repository, you should configure a similar sample.\n\nCreate a fork of this app and take note of the location (URL) for use in later steps of this tutorial. For more information, see [Fork a repo](https://help.github.com/articles/fork-a-repo/).    \n\n> [!NOTE]\n> The app was built through [Yeoman](https://yeoman.io/learning/index.html). It uses Express, bower, and grunt. And it has some npm packages as dependencies.\n> The sample also contains a script that sets up Nginx and deploys the app. It is executed on the virtual machines. Specifically, the script:\n> 1. Installs Node, Nginx, and PM2.\n> 2. Configures Nginx and PM2.\n> 3. Starts the Node app.\n\n## Configure Jenkins plug-ins\n\nFirst, you must configure two Jenkins plug-ins: **NodeJS** and **VS Team Services Continuous Deployment**.\n\n1. Open your Jenkins account and select **Manage Jenkins**.\n2. On the **Manage Jenkins** page, select **Manage Plugins**.\n3. Filter the list to locate the **NodeJS** plug-in, and select the **Install without restart** option.\n    ![Adding the NodeJS plug-in to Jenkins](media/deploy-to-linux-vm-using-azure-devops-services/jenkins-nodejs-plugin.png)\n4. Filter the list to find the **VS Team Services Continuous Deployment** plug-in and select the **Install without restart** option.\n5. Go back to the Jenkins dashboard and select **Manage Jenkins**.\n6. Select **Global Tool Configuration**. Find **NodeJS** and select **NodeJS installations**.\n7. Select the **Install automatically** option, and then enter a **Name** value.\n8. Select **Save**.\n\n## Configure a Jenkins Freestyle project for Node.js\n\n1. Select **New Item**. Enter an item name.\n2. Select **Freestyle project**. Select **OK**.\n3. On the **Source Code Management** tab, select **Git** and enter the details of the repository and the branch that contain your app code.    \n    ![Add a repo to your build](media/deploy-to-linux-vm-using-azure-devops-services/jenkins-git.png)\n4. On the **Build Triggers** tab, select **Poll SCM** and enter the schedule `H/03 * * * *` to poll the Git repository for changes every three minutes. \n5. On the **Build Environment** tab, select **Provide Node &amp; npm bin/ folder PATH** and select the **NodeJS Installation** value. Leave **npmrc file** set to **use system default**.\n6. On the **Build** tab, select **Execute shell** and enter the command `npm install` to ensure that all dependencies are updated.\n\n\n## Configure Jenkins for Azure DevOps Services integration\n\n> [!NOTE]\n> Ensure that the personal access token (PAT) you use for the following steps contains the *Release* (read, write, execute and manage) permission in Azure DevOps Services.\n \n1.  Create a PAT in your Azure DevOps Services organization if you don't already have one. Jenkins requires this information to access your Azure DevOps Services organization. Be sure to store the token information for upcoming steps in this section.\n  \n    To learn how to generate a token, read [How do I create a personal access token for Azure DevOps Services?](/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate).\n2. In the **Post-build Actions** tab, select **Add post-build action**. Select **Archive the artifacts**.\n3. For **Files to archive**, enter `**/*` to include all files.\n4. To create another action, select **Add post-build action**.\n5. Select **Trigger release in TFS/Team Services**. Enter the URI for your Azure DevOps Services organization, such as **https://{your-organization-name}.visualstudio.com**.\n6. Enter the **Project** name.\n7. Choose a name for the release pipeline. (You create this release pipeline later in Azure DevOps Services.)\n8. Choose credentials to connect to your Azure DevOps Services or Azure DevOps Server environment:\n   - Leave **Username** blank if you are using Azure DevOps Services. \n   - Enter a username and password if you are using an on-premises version of Azure DevOps Server.    \n   ![Configuring Jenkins post-build actions](media/deploy-to-linux-vm-using-azure-devops-services/trigger-release-from-jenkins.png)\n5. Save the Jenkins project.\n\n\n## Create a Jenkins service endpoint\n\nA service endpoint allows Azure DevOps Services to connect to Jenkins.\n\n1. Open the **Services** page in Azure DevOps Services, open the **New Service Endpoint** list, and select **Jenkins**.\n   ![Add a Jenkins endpoint](media/deploy-to-linux-vm-using-azure-devops-services/add-jenkins-endpoint.png)\n2. Enter a name for the connection.\n3. Enter the URL of your Jenkins server, and select the **Accept untrusted SSL certificates** option. An example URL is\t**http://{YourJenkinsURL}.westcentralus.cloudapp.azure.com**.\n4. Enter the username and password for your Jenkins account.\n5. Select **Verify connection** to check that the information is correct.\n6. Select **OK** to create the service endpoint.\n\n## Create a deployment group for Azure virtual machines\n\nYou need a [deployment group](/azure/devops/pipelines/release/deployment-groups/) to register the Azure DevOps Services agent so the release pipeline can be deployed to your virtual machine. Deployment groups make it easy to define logical groups of target machines for deployment, and to install the required agent on each machine.\n\n   > [!NOTE]\n   > In the following procedure, be sure to install the prerequisites and *don't run the script with sudo privileges.*\n\n1. Open the **Releases** tab of the **Build &amp; Release** hub, open **Deployment groups**, and select **+ New**.\n2. Enter a name for the deployment group, and an optional description. Then select **Create**.\n3. Choose the operating system for your deployment target virtual machine. For example, select **Ubuntu 16.04+**.\n4. Select **Use a personal access token in the script for authentication**.\n5. Select the **System prerequisites** link. Install the prerequisites for your operating system.\n6. Select **Copy script to clipboard** to copy the script.\n7. Log in to your deployment target virtual machine and run the script. Don't run the script with sudo privileges.\n8. After the installation, you are prompted for deployment group tags. Accept the defaults.\n9. In Azure DevOps Services, check for your newly registered virtual machine in **Targets** under **Deployment Groups**.\n\n## Create an Azure Pipelines release pipeline\n\nA release pipeline specifies the process that Azure Pipelines uses to deploy the app. In this example, you execute a shell script.\n\nTo create the release pipeline in Azure Pipelines:\n\n1. Open the **Releases** tab of the **Build &amp; Release** hub, and select **Create release pipeline**. \n2. Select the **Empty** template by choosing to start with an **Empty process**.\n3. In the **Artifacts** section, select **+ Add Artifact** and choose **Jenkins** for **Source type**. Select your Jenkins service endpoint connection. Then select the Jenkins source job and select **Add**.\n4. Select the ellipsis next to **Environment 1**. Select **Add deployment group phase**.\n5. Choose your deployment group.\n5. Select **+** to add a task to **Deployment group phase**.\n6. Select the **Shell Script** task and select **Add**. The **Shell Script** task provides the configuration for a script to run on each server in order to install Node.js and start the app.\n8. For **Script Path**, enter\t**$(System.DefaultWorkingDirectory)/Fabrikam-Node/deployscript.sh**.\n9. Select **Advanced**, and then enable **Specify Working Directory**.\n10. For **Working Directory**, enter **$(System.DefaultWorkingDirectory)/Fabrikam-Node**.\n11. Edit the name of the release pipeline to the name that you specified on the **Post-build Actions** tab of the build in Jenkins. Jenkins requires this name to be able to trigger a new release when the source artifacts are updated.\n12. Select **Save** and select **OK** to save the release pipeline.\n\n## Execute manual and CI-triggered deployments\n\n1. Select **+ Release** and select **Create Release**.\n2. Select the build that you completed in the highlighted drop-down list, and select **Queue**.\n3. Choose the release link in the pop-up message. For example: \"Release **Release-1** has been created.\"\n4. Open the **Logs** tab to watch the release console output.\n5. In your browser, open the URL of one of the servers that you added to your deployment group. For example, enter **http://{your-server-ip-address}**.\n6. Go to the source Git repository and modify the contents of the **h1** heading in the file app/views/index.jade with some changed text.\n7. Commit your change.\n8. After a few minutes, you will see a new release created on the **Releases** page of Azure DevOps. Open the release to see the deployment taking place. Congratulations!\n\n## Troubleshooting the Jenkins plug-in\n\nIf you encounter any bugs with the Jenkins plug-ins, file an issue in the [Jenkins JIRA](https://issues.jenkins-ci.org/) for the specific component.\n\n## Next steps\n\nIn this tutorial, you automated the deployment of an app to Azure by using Jenkins for build and Azure DevOps Services for release. You learned how to:\n\n> [!div class=\"checklist\"]\n> * Build your app in Jenkins.\n> * Configure Jenkins for Azure DevOps Services integration.\n> * Create a deployment group for the Azure virtual machines.\n> * Create an Azure Pipeline that configures the VMs and deploys the app.\n\nTo learn about how to use Azure Pipelines for both Build and Release steps, refer to [this](/azure/devops/pipelines/apps/cd/deploy-linuxvm-deploygroups).\n\nTo learn about how to author a YAML based CI/CD pipeline to deploy to VMs, advance to the next tutorial.\n\n> [!div class=\"nextstepaction\"]\n> [Jenkins on Azure](/azure/Jenkins/)\n"
  },
  {
    "path": "articles/jenkins/deploy-to-service-fabric-cluster.md",
    "content": "---\ntitle: Tutorial - Deploy to a Service Fabric cluster\ndescription: Learn how to configure continuous build and integration for your Service Fabric Linux application using Jenkins\nkeywords: jenkins, azure, devops, cicd, linux, service fabric, cluster\nms.topic: tutorial\nms.date: 07/31/2018\nms.custom:\n  - devx-track-jenkins\n  - linux-related-content\n  - sfi-image-nochange\n---\n\n# Tutorial: Deploy to a Service Fabric cluster\n\nThis tutorial covers several possible ways of setting up your Jenkins environment as well as different ways to deploy your application to a Service Fabric cluster after it has been built. Follow these general steps to successfully configure Jenkins, pull changes from GitHub, build your application, and deploy it to your cluster:\n\n1. Ensure that you install the [Prerequisites](#prerequisites).\n1. Then follow the steps in one of these sections to set up Jenkins:\n   * [Set up Jenkins inside a Service Fabric cluster](#set-up-jenkins-inside-a-service-fabric-cluster), \n   * [Set up Jenkins outside a Service Fabric cluster](#set-up-jenkins-outside-a-service-fabric-cluster), or\n   * [Install the Service Fabric plug-in in an existing Jenkins environment](#install-service-fabric-plug-in-in-an-existing-jenkins-environment).\n1. After you've set up Jenkins, follow the steps in [Create and configure a Jenkins job](#create-and-configure-a-jenkins-job) to set up GitHub to trigger Jenkins when changes are made to your application and to configure your Jenkins job pipeline through the build step to pull the changes from GitHub and build your application. \n1. Finally, configure the Jenkins job post-build step to deploy your application to your Service Fabric cluster. There are two ways to configure Jenkins to deploy your application to a cluster:    \n   * For development and test environments, use [Configure deployment using cluster management endpoint](#configure-deployment-using-cluster-management-endpoint). This method is the simplest deployment method to set up.\n   * For production environments, use [Configure deployment using Azure credentials](#configure-deployment-using-azure-credentials). Microsoft recommends this method for production environments because with Azure credentials you can limit the access that a Jenkins job has to your Azure resources. \n\n## Prerequisites\n\n- Make sure Git is installed locally. You can install the appropriate Git version from [the Git downloads page](https://git-scm.com/downloads) based on your operating system. If you're new to Git, learn more about it from the [Git documentation](https://git-scm.com/docs).\n- This article uses the *Service Fabric Getting Started Sample* on GitHub: [https://github.com/Azure-Samples/service-fabric-java-getting-started](https://github.com/Azure-Samples/service-fabric-java-getting-started) for the application to build and deploy. You can fork this repository to follow along, or, with some modification to the instructions, use your own GitHub project.\n\n\n## Install Service Fabric plug-in in an existing Jenkins environment\n\nIf you're adding the Service Fabric plug-in to an existing Jenkins environment, you need to do the following steps:\n\n- [Service Fabric CLI (sfctl)](/azure/service-fabric/service-fabric-cli). Install the CLI at the system level rather than at the user level, so Jenkins can run CLI commands. \n- To deploy Java applications, install both [Gradle and Open JDK 8.0](/azure/service-fabric/service-fabric-get-started-linux#set-up-java-development). \n- To deploy .NET Core 2.0 applications, install the [.NET Core 2.0 SDK](/azure/service-fabric/service-fabric-get-started-linux#set-up-net-core-20-development). \n\nAfter you've installed the prerequisites needed for your environment, you can search for the Azure Service Fabric plug-in in Jenkins marketplace and install it.\n\nAfter you've installed the plug-in, skip ahead to [Create and configure a Jenkins job](#create-and-configure-a-jenkins-job).\n\n## Set up Jenkins inside a Service Fabric cluster\n\nYou can set up Jenkins either inside or outside a Service Fabric cluster. The following sections show how to set it up inside a cluster while using an Azure storage account to save the state of the container instance.\n\n1. Ensure that you have a Service Fabric Linux cluster with Docker installed. Service Fabric clusters running in Azure already have Docker installed. If you're running the cluster locally (OneBox dev environment), check if Docker is installed on your machine with the  `docker info` command. If it is not installed, install it by using the following commands:\n\n   ```sh\n   sudo apt-get install wget\n   wget -qO- https://get.docker.io/ | sh\n   ``` \n\n   > [!NOTE]\n   > Make sure that the 8081 port is specified as a custom endpoint on the cluster. If you are using a local cluster, make sure that port 8081 is open on the host machine and that it has a public-facing IP address.\n   >\n\n1. Clone the application, by using the following commands:\n   ```sh\n   git clone https://github.com/suhuruli/jenkins-container-application.git\n   cd jenkins-container-application\n   ```\n\n1. Persist the state of the Jenkins container in a file-share:\n   1. Create an Azure storage account in the **same region** as your cluster with a name such as `sfjenkinsstorage1`.\n   1. Create a **File Share** under the storage Account with a name such as `sfjenkins`.\n   1. Click on **Connect** for the file-share and note the values it displays under **Connecting from Linux**, the value should look similar to the one below:\n\n      ```sh\n      sudo mount -t cifs //sfjenkinsstorage1.file.core.windows.net/sfjenkins [mount point] -o vers=3.0,username=<username>,password=<storage-key>,dir_mode=0777,file_mode=0777\n      ```\n\n   > [!NOTE]\n   > To mount cifs shares, you need to have the cifs-utils package installed in the cluster nodes.         \n   >\n\n1. Update the placeholder values in the `setupentrypoint.sh` script with the azure-storage details from step 2.\n   ```sh\n   vi JenkinsSF/JenkinsOnSF/Code/setupentrypoint.sh\n   ```\n   * Replace `[REMOTE_FILE_SHARE_LOCATION]` with the value `//sfjenkinsstorage1.file.core.windows.net/sfjenkins` from the output of the connect in step 2 above.\n   * Replace `[FILE_SHARE_CONNECT_OPTIONS_STRING]` with the value `vers=3.0,username=<username>,password=<storage-key>,dir_mode=0777,file_mode=0777` from step 2 above.\n\n1. **Secure Cluster Only:** \n   \n   To configure the deployment of applications on a secure cluster from Jenkins, the cluster certificate must be accessible within the Jenkins container. In the *ApplicationManifest.xml* file, under the **ContainerHostPolicies** tag add this certificate reference and update the thumbprint value with that of the cluster certificate.\n\n   ```xml\n   <CertificateRef Name=\"MyCert\" X509FindValue=\"[Thumbprint]\"/>\n   ```\n\n   Additionally, add the following lines under the **ApplicationManifest** (root) tag in the *ApplicationManifest.xml* file and update the thumbprint value with that of the cluster certificate.\n\n   ```xml\n   <Certificates>\n     <SecretsCertificate X509FindType=\"FindByThumbprint\" X509FindValue=\"[Thumbprint]\" />\n   </Certificates> \n   ```\n\n1. Connect to the cluster and install the container application.\n\n   **Secure Cluster**\n   ```sh\n   sfctl cluster select --endpoint https://PublicIPorFQDN:19080  --pem [Pem] --no-verify # cluster connect command\n   bash Scripts/install.sh\n   ```\n   The preceding command takes the certificate in PEM format. If your certificate is in PFX format, you can use the following command to convert it. If your PFX file isn't password protected, specify the **passin** parameter as `-passin pass:`.\n   ```sh\n   openssl pkcs12 -in cert.pfx -out cert.pem -nodes -passin pass:<password>\n   ``` \n   \n   **Unsecure Cluster**\n   ```sh\n   sfctl cluster select --endpoint http://PublicIPorFQDN:19080 # cluster connect command\n   bash Scripts/install.sh\n   ```\n\n   This installs a Jenkins container on the cluster, and can be monitored by using the Service Fabric Explorer.\n\n   > [!NOTE]\n   > It may take a couple of minutes for the Jenkins image to be downloaded on the cluster.\n   >\n\n1. From your browser, go to `http://PublicIPorFQDN:8081`. It provides the path of the initial admin password required to sign in. \n1. Look at the Service Fabric Explorer to determine on which node the Jenkins container is running. Secure Shell (SSH) sign in to this node.\n   ```sh\n   ssh user@PublicIPorFQDN -p [port]\n   ``` \n1. Get the container instance ID by using `docker ps -a`.\n1. Secure Shell (SSH) sign in to the container and paste the path you were shown on the Jenkins portal. For example, if in the portal it shows the path `PATH_TO_INITIAL_ADMIN_PASSWORD`, run the following commands:\n\n   ```sh\n   docker exec -t -i [first-four-digits-of-container-ID] /bin/bash   # This takes you inside Docker shell\n   ```\n   ```sh\n   cat PATH_TO_INITIAL_ADMIN_PASSWORD # This displays the password value\n   ```\n1. On the Jenkins Getting Started page, choose the Select plug-in to install option, select the **None** checkbox, and click install.\n1. Create a user or select to continue as an admin.\n\nAfter you've set up Jenkins, skip ahead to [Create and configure a Jenkins job](#create-and-configure-a-jenkins-job).  \n\n## Set up Jenkins outside a Service Fabric cluster\n\nYou can set up Jenkins either inside or outside of a Service Fabric cluster. The following sections show how to set it up outside a cluster.\n\n1. Make sure that Docker is installed on your machine by running `docker info` in the terminal. The output indicates if the Docker service is running.\n\n1. If Docker is not installed, run the following commands:\n\n    ```sh\n    sudo apt-get install wget\n    wget -qO- https://get.docker.io/ | sh\n    ```\n\n1. Pull the Service Fabric Jenkins container image: `docker pull rapatchi/jenkins:latest`. This image comes with Service Fabric Jenkins plug-in pre-installed.\n1. Run the container image: `docker run -itd -p 8080:8080 rapatchi/jenkins:latest`\n1. Get the ID of the container image instance. You can list all the Docker containers with the command `docker ps –a`\n1. Sign in to the Jenkins portal with the following steps:\n\n   1. Sign in to a Jenkins shell from your host. Use the first four digits of the container ID. For example, if the container ID is  `2d24a73b5964`, use `2d24`.\n\n      ```sh\n      docker exec -it [first-four-digits-of-container-ID] /bin/bash\n      ```\n   1. From the Jenkins shell, get the admin password for your container instance:\n\n      ```sh\n      cat /var/jenkins_home/secrets/initialAdminPassword\n      ```      \n   1. To sign in to the Jenkins dashboard, open the following URL in a web browser: `http://<HOST-IP>:8080`. Use the password from the previous step to unlock Jenkins.\n   1. (Optional.) After you sign in for the first time, you can create your own user account and use that for the following steps, or you can continue to use the administrator account. If you create a user, you need to continue with that user.\n1. Set up GitHub to work with Jenkins by using the steps in [Generating a new SSH key and adding it to the SSH agent](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/).\n   * Use the instructions provided by GitHub to generate the SSH key, and to add the SSH key to the GitHub account that is hosting the repository.\n   * Run the commands mentioned in the preceding link in the Jenkins Docker shell (and not on your host).\n   * To sign in to the Jenkins shell from your host, use the following command:\n\n      ```sh\n      docker exec -t -i [first-four-digits-of-container-ID] /bin/bash\n      ```\n\nMake sure that the cluster or machine where the Jenkins container image is hosted has a public-facing IP address. This enables the Jenkins instance to receive notifications from GitHub.\n\nAfter you've set up Jenkins, continue on to the next section, [Create and configure a Jenkins job](#create-and-configure-a-jenkins-job).\n\n## Create and configure a Jenkins job\n\nThe steps in this section show you how to configure a Jenkins job to respond to changes in a GitHub repo, fetch the changes, and build them. At the end of this section, you're directed to the final steps to configure the job to deploy your application based on whether you're deploying to a development/test environment or to a production environment. \n\n1. On the Jenkins dashboard, click  **New Item**.\n1. Enter an item name (for example, **MyJob**). Select **free-style project**, and click **OK**.\n1. The Job configuration page opens. (To get to the configuration from the Jenkins dashboard, click the job, and then click **Configure**).\n\n1. On the **General** tab, check the box for **GitHub project**, and specify your GitHub project URL. This URL hosts the Service Fabric Java application that you want to integrate with the Jenkins continuous integration, continuous deployment (CI/CD) flow (for example, `https://github.com/{your-github-account}/service-fabric-java-getting-started`).\n\n1. On the **Source Code Management** tab, select **Git**. Specify the repository URL that hosts the Service Fabric Java application that you want to integrate with the Jenkins CI/CD flow (for example, `https://github.com/{your-github-account}/service-fabric-java-getting-started`). You can also specify which branch to build (for example, `/master`).\n1. Configure your *GitHub* repository to talk to Jenkins:\n\n   1. On your GitHub repository page, go to **Settings** > **Integrations and Services**.\n\n   1. Select **Add Service**, type **Jenkins**, and select the **Jenkins-GitHub plug-in**.\n\n   1. Enter your Jenkins webhook URL (by default, it should be `http://<PublicIPorFQDN>:8081/github-webhook/`). Click **add/update service**.\n\n   1. A test event is sent to your Jenkins instance. You should see a green check by the webhook in GitHub, and your project will build.\n\n1. On the **Build Triggers** tab in Jenkins, select which build option you want. For this example, you want to trigger a build whenever a push to the repository happens, so select **GitHub hook trigger for GITScm polling**. (Previously, this option was called **Build when a change is pushed to GitHub**.)\n1. On the **Build** tab, do one of the following depending on whether you're building a Java application or a .NET Core application:\n\n   * **For Java Applications:** From the **Add build step** drop-down, select **Invoke Gradle Script**. Click **Advanced**. In the advanced menu, specify the path to **Root build script** for your application. It picks up build.gradle from the path specified and works accordingly. For the [ActorCounter application](https://github.com/Azure-Samples/service-fabric-java-getting-started/tree/master/reliable-services-actor-sample/Actors/ActorCounter), this is: `${WORKSPACE}/reliable-services-actor-sample/Actors/ActorCounter`.\n\n     ![Service Fabric Jenkins Build action](./media/deploy-to-service-fabric-cluster/build-step.png)\n\n   * **For .NET Core Applications:** From the **Add build step** drop-down, select **Execute Shell**. In the command box that appears, the directory first needs to be changed to the path where the `build.sh` file is located. Once the directory has been changed, the `build.sh` script can be run to build the application.\n\n      ```sh\n      cd /var/jenkins_home/workspace/[Job Name]/[Path to build.sh]  \n      ./build.sh\n      ```\n\n     The following screenshot shows an example of the commands that are used to build the [Counter Service](https://github.com/Azure-Samples/service-fabric-dotnet-core-getting-started/tree/master/Services/CounterService) sample with a Jenkins job name of `CounterServiceApplication`.\n\n      ![Example of commands used to build the service](./media/deploy-to-service-fabric-cluster/build-step-dotnet.png)\n\n1. To configure Jenkins to deploy your app to a Service Fabric cluster in the post-build actions, you need the location of that cluster's certificate in your Jenkins container. Choose one of the following depending on whether your Jenkins container is running inside or outside of your cluster and note the location of the cluster certificate:\n\n   * **For Jenkins running inside your cluster:** The path to the certificate can be found by echoing the value of the *Certificates_JenkinsOnSF_Code_MyCert_PEM* environment variable from within the container.\n\n      ```sh\n      echo $Certificates_JenkinsOnSF_Code_MyCert_PEM\n      ```\n   \n   * **For Jenkins running outside your cluster:** Follow these steps to copy the cluster certificate to your container:\n     1. Your certificate must be in PEM format. If you don't have a PEM file, you can create one from the certificate PFX file. If your PFX file is not password protected, run the following command from your host:\n\n        ```sh\n        openssl pkcs12 -in clustercert.pfx -out clustercert.pem -nodes -passin pass:\n        ``` \n\n        If the PFX file is password protected, include the password in the `-passin` parameter. For example:\n\n        ```sh\n        openssl pkcs12 -in clustercert.pfx -out clustercert.pem -nodes -passin pass:<password>\n        ``` \n\n     1. To get the container ID for your Jenkins container, run `docker ps` from your host.\n     1. Copy the PEM file to your container with the following Docker command:\n    \n        ```sh\n        docker cp clustercert.pem [first-four-digits-of-container-ID]:/var/jenkins_home\n        ``` \n\nYou're almost finished! Keep the Jenkins job open. The only remaining task is to configure the post-build steps to deploy your application to your Service Fabric cluster:\n\n* To deploy to a development or test environment, follow the steps in [Configure deployment using cluster management endpoint](#configure-deployment-using-cluster-management-endpoint).\n* To deploy to a production environment, follow the steps in [Configure deployment using Azure credentials](#configure-deployment-using-azure-credentials).\n\n## Configure deployment using cluster management endpoint\n\nFor development and test environments, you can use the cluster management endpoint to deploy your application. Configuring the post-build action with the cluster management endpoint to deploy your application requires the least amount of set-up. If you're deploying to a production environment, skip ahead to [Configure deployment using Azure credentials](#configure-deployment-using-azure-credentials) to configure a Microsoft Entra service principal to use during deployment.\n\n1. In the Jenkins job, click the **Post-build Actions** tab. \n1. From the **Post-Build Actions** drop-down, select **Deploy Service Fabric Project**. \n1. Under **Service Fabric Cluster Configuration**, select the **Fill the Service Fabric Management Endpoint** radio button.\n1. For **Management Host**, enter the connection endpoint for your cluster; for example `{your-cluster}.eastus.cloudapp.azure.com`.\n1. For **Client Key** and **Client Cert**, enter the location of the PEM file in your Jenkins container; for example `/var/jenkins_home/clustercert.pem`. (You copied the location of the certificate the last step of [Create and configure a Jenkins job](#create-and-configure-a-jenkins-job).)\n1. Under **Application Configuration**, configure the **Application Name**, **Application Type**, and the (relative) **Path to Application Manifest** fields.\n\n   ![Service Fabric Jenkins Post-Build Action configure management endpoint](./media/deploy-to-service-fabric-cluster/post-build-endpoint.png)\n\n1. Click **Verify Configuration**. On successful verification, click **Save**. Your Jenkins job pipeline is now fully configured. Skip ahead to [Next steps](#next-steps) to test your deployment.\n\n## Configure deployment using Azure credentials\n\nFor production environments, configuring an Azure credential to deploy your application is strongly recommended. This section shows you how to configure a Microsoft Entra service principal to use to deploy your application in the post-build action. You can assign service principals to roles in your directory to limit the permissions of the Jenkins job. \n\nFor development and test environments, you can configure either Azure credentials or the cluster management endpoint to deploy your application. For details about how to configure a cluster management endpoint, see [Configure deployment using cluster management endpoint](#configure-deployment-using-cluster-management-endpoint).   \n\n1. To create a Microsoft Entra service principal and assign it permissions in your Azure subscription, follow the steps in [Use the portal to create a Microsoft Entra application and service principal](/azure/azure-resource-manager/resource-group-create-service-principal-portal). Pay attention to the following:\n\n   * While following the steps in the topic, be sure to copy and save the following values: *Application ID*, *Application key*, *Directory ID (Tenant ID)*, and *Subscription ID*. You need them to configure the Azure credentials in Jenkins.\n   * If you don't have the [required permissions](/azure/azure-resource-manager/resource-group-create-service-principal-portal#required-permissions) on your directory, you'll need to ask an administrator to either grant you the permissions or create the service principal for you, or you'll need to configure the management endpoint for your cluster in the **Post-Build Actions** for your job in Jenkins.\n   * In the [Create a Microsoft Entra application](/azure/azure-resource-manager/resource-group-create-service-principal-portal#create-an-azure-active-directory-application) section, you can enter any well-formed URL for the **Sign-on URL**.\n   * In the [Assign application to a Role](/azure/azure-resource-manager/resource-group-create-service-principal-portal) section, you can assign your application the *Reader* role on the resource group for your cluster.\n\n1. Back in the Jenkins job, click the **Post-build Actions** tab.\n1. From the **Post-Build Actions** drop-down, select **Deploy Service Fabric Project**. \n1. Under **Service Fabric Cluster Configuration**, Click **Select the Service Fabric Cluster**. Click **Add** next to **Azure Credentials**. Click **Jenkins** to select the Jenkins Credentials Provider.\n1. In the Jenkins Credentials Provider, select **Microsoft Azure Service Principal** from the **Kind** drop-down.\n1. Use the values you saved when setting up your service principal in Step 1 to set the following fields:\n\n   * **Client ID**: *Application ID*\n   * **Client Secret**: *Application key*\n   * **Tenant ID**: *Directory ID*\n   * **Subscription ID**: *Subscription ID*\n1. Enter a descriptive **ID** that you use to select the credential in Jenkins and a brief **Description**. Then click **Verify Service Principal**. If the verification succeeds, click **Add**.\n\n   ![Service Fabric Jenkins enter Azure credentials](./media/deploy-to-service-fabric-cluster/enter-azure-credentials.png)\n1. Back under **Service Fabric Cluster Configuration**, make sure that your new credential is selected for **Azure Credentials**. \n1. From the **Resource Group** drop-down, select the resource group of the cluster you want to deploy the application to.\n1. From the **Service Fabric** drop-down, select the cluster that you want to deploy the application to.\n1. For **Client Key** and **Client Cert**, enter the location of the PEM file in your Jenkins container. For example `/var/jenkins_home/clustercert.pem`.\n1. Under **Application Configuration**, configure the **Application Name**, **Application Type**, and the (relative) **Path to Application Manifest** fields.\n    ![Service Fabric Jenkins Post-Build Action - Configure Azure credentials](./media/deploy-to-service-fabric-cluster/post-build-credentials.png)\n1. Click **Verify Configuration**. On successful verification, click **Save**. Your Jenkins job pipeline is now fully configured. Continue on to [Next steps](#next-steps) to test your deployment.\n\n## Troubleshooting the Jenkins plug-in\n\nIf you encounter any bugs with the Jenkins plug-in, file an issue in the [Jenkins JIRA](https://issues.jenkins-ci.org/) for the specific component.\n\n## Ideas to try\n\nGitHub and Jenkins are now configured. Consider making some sample change in the `reliable-services-actor-sample/Actors/ActorCounter` project in your fork of the repository, https://github.com/Azure-Samples/service-fabric-java-getting-started. Push your changes to the remote `master` branch (or any branch that you have configured to work with). This triggers the Jenkins job, `MyJob`, that you configured. It fetches the changes from GitHub, builds them, and deploys the application to the cluster you specified in post-build actions.  \n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Jenkins on Azure](/azure/Jenkins/)\n"
  },
  {
    "path": "articles/jenkins/includes/jenkins-integration-with-azure.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 05/08/2025\nms.custom: devx-track-jenkins\n---\n\n> [!IMPORTANT]\n> While many Azure services have Jenkins plug-ins, most of these plug-ins ended support as of February 29, 2024. Azure CLI is the currently recommended way to integrate Jenkins with Azure services. For more information, refer to the article [Jenkins plug-ins for Azure](../plug-ins-for-azure.md)."
  },
  {
    "path": "articles/jenkins/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Jenkins on Azure documentation\nsummary: Learn how to use Jenkins to automate continuous integration and continuous delivery on Azure.\n\nmetadata:\n  title: Jenkins on Azure documentation\n  description: Learn how to use Jenkins to automate continuous integration and continuous delivery on Azure.\n  services: azure\n  ms.service: jenkins\n  ms.topic: landing-page\n  author: TomArcherMsft\n  ms.author: tarcher\n  ms.date: 12/16/2020\n  ms.custom: devx-track-jenkins\n\nlandingContent:\n  # Card\n  - title: About Jenkins on Azure\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: About Jenkins on Azure\n            url: overview.md\n      - linkListType: reference\n        links:\n          - text: Jenkins plug-ins for Azure\n            url: plug-ins-for-azure.md\n      - linkListType: architecture\n        links:\n          - text: Jenkins architecture\n            url: /azure/architecture/reference-architectures/jenkins/\n    \n  # Card\n  - title: Install and configure Jenkins\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Configure Jenkins using Azure CLI\n            url: configure-on-linux-vm.md\n      - linkListType: download\n        links:\n        - text: Sample jobs and scripts\n          url: https://github.com/azure/jenkins\n\n  # Card\n  - title: Scale using Jenkins and Azure\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Scale with Azure Container Instances\n            url: azure-container-instances-as-jenkins-build-agent.md\n          - text: Scale with Azure VM agents\n            url: scale-deployments-using-vm-agents.md\n\n  # Card\n  - title: CI/CD to Azure Functions\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Deploy to Azure Functions \n            url: deploy-to-azure-functions.md\n\n  # Card\n  - title: CI/CD to AKS\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Deploy from GitHub to AKS\n            url: deploy-from-github-to-aks.md\n\n  # Card\n  - title: CI/CD to App Service\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Create Azure resources in a pipeline job\n            url: deploy-to-azure-app-service-using-azure-cli.md\n\n  # Card\n  - title: CI/CD to Azure DevOps\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Deploy to a Linux VM using Azure DevOps Services\n            url: deploy-to-linux-vm-using-azure-devops-services.md\n\n  # Card\n  - title: CI/CD to Azure Storage\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Using Azure Storage with a Jenkins C/I solution\n            url: azure-storage-blobs-as-build-artifact-repository.md\n\n  # Card\n  - title: CI/CD to Linux VMs\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Create a dev infrastructure on a Linux VM\n            url: pipeline-with-github-and-docker.md\n\n  # Card\n  - title: CI/CD to Service Fabric\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Build and deploy an Azure Service Fabric app\n            url: deploy-to-service-fabric-cluster.md\n\n  # Card\n  - title: CI/CD to Azure Spring Apps\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Deploy to Azure Spring Apps using the Azure CLI\n            url: deploy-to-azure-spring-apps-using-azure-cli.md"
  },
  {
    "path": "articles/jenkins/overview.md",
    "content": "---\ntitle: Overview of Jenkins and Azure\ndescription: Host the Jenkins build and deploy automation server in Azure and use Azure compute and storage resources to extend your continuous integration and deployment (CI/CD) pipelines.\nkeywords: jenkins, azure, devops, overview\nms.topic: overview\nms.date: 11/10/2020\nms.custom: devx-track-jenkins\nadobe-target: true\n---\n\n# Azure and Jenkins\n\n[Jenkins](https://jenkins.io/) is a popular open-source automation server used to set up continuous integration and delivery (CI/CD) for your software projects. You can host your Jenkins deployment in Azure or extend your existing Jenkins configuration using Azure resources. Jenkins plug-ins are also available to simplify CI/CD of your applications to Azure.\n\nThis article is an introduction to using Azure with Jenkins, detailing the core Azure features available to Jenkins users. For more information about getting started with your own Jenkins server in Azure, see [Create a Jenkins server on Azure](configure-on-linux-vm.md).\n\n## Host your Jenkins servers in Azure\n\nHost Jenkins in Azure to centralize your build automation and scale your deployment as the needs of your software projects grow. See [Quickstart - Get started with Jenkins](configure-on-linux-vm.md) to learn how to install and configure Jenkins on a Linux VM. Monitor and manage your Azure Jenkins deployment using [Azure Monitor logs](/azure/log-analytics/log-analytics-overview) and the [Azure CLI](/cli/azure).\n\n## Scale your build automation on demand\n\nAdd build agents to your existing Jenkins deployment to scale your Jenkins build capacity as the number of builds and complexity of your jobs and pipelines increase. You can run these build agents on Azure virtual machines by using the [Azure VM Agents plug-in](https://plugins.jenkins.io/azure-vm-agents). See our [tutorial](/azure/jenkins/jenkins-azure-vm-agents) for more details.\n\nOnce configured with an [Azure service principal](/azure/azure-resource-manager/resource-group-overview), Jenkins jobs and pipelines can use this credential to:\n\n- Securely store and archive build artifacts in [Azure Storage](/azure/storage/common/storage-introduction) using the [Azure Storage plug-in](https://plugins.jenkins.io/windows-azure-storage). Review the [Jenkins storage how-to](azure-storage-blobs-as-build-artifact-repository.md) to learn more.\n- Manage and configure Azure resources with the [Azure CLI](deploy-to-azure-app-service-using-azure-cli.md).\n\n## Deploy your code into Azure services\n\nUse Jenkins plug-ins to deploy your applications to Azure as part of your Jenkins CI/CD pipelines. Deploying into [Azure App Service](/azure/app-service/) and [Azure Container Service](/azure/container-service/kubernetes/) lets you stage, test, and release updates to your applications without managing the underlying infrastructure.\n\n Plug-ins are available to deploy to the following services and environments:\n\n- [Azure App Service on Linux](/azure/app-service/containers/app-service-linux-intro). See the [tutorial](deploy-to-azure-app-service-using-azure-cli.md) to get started."
  },
  {
    "path": "articles/jenkins/pipeline-with-github-and-docker.md",
    "content": "---\ntitle: Tutorial - Create a Jenkins pipeline using GitHub and Docker\ndescription: Learn how to create a Jenkins virtual machine in Azure that pulls from GitHub on each code commit and builds a new Docker container to run your app.\nkeywords: jenkins, azure, devops, pipeline, cicd, docker\nms.topic: tutorial\nms.date: 03/27/2017\nms.custom: devx-track-jenkins, devx-track-azurecli\n---\n\n# Tutorial: Create a Jenkins pipeline using GitHub and Docker\n\n[!INCLUDE [jenkins-integration-with-azure.md](includes/jenkins-integration-with-azure.md)]\n\nTo automate the build and test phase of application development, you can use a continuous integration and deployment (CI/CD) pipeline. In this tutorial, you create a CI/CD pipeline on an Azure VM including how to:\n\n> [!div class=\"checklist\"]\n> * Create a Jenkins VM\n> * Install and configure Jenkins\n> * Create webhook integration between GitHub and Jenkins\n> * Create and trigger Jenkins build jobs from GitHub commits\n> * Create a Docker image for your app\n> * Verify GitHub commits build new Docker image and updates running app\n\nThis tutorial uses the CLI within the [Azure Cloud Shell](/azure/cloud-shell/overview), which is constantly updated to the latest version. To open the Cloud Shell, select **Try it** from the top of any code block.\n\nIf you choose to install and use the CLI locally, this tutorial requires that you are running the Azure CLI version 2.0.30 or later. Run `az --version` to find the version. If you need to install or upgrade, see [Install Azure CLI]( /cli/azure/install-azure-cli).\n\n## Create Jenkins instance\nIn a previous tutorial on [How to customize a Linux virtual machine on first boot](/azure/virtual-machines/linux/tutorial-automate-vm-deployment), you learned how to automate VM customization with cloud-init. This tutorial uses a cloud-init file to install Jenkins and Docker on a VM. Jenkins is a popular open-source automation server that integrates seamlessly with Azure to enable continuous integration (CI) and continuous delivery (CD). For more tutorials on how to use Jenkins, see the [Jenkins in Azure hub](/azure/jenkins/).\n\nIn your current shell, create a file named *cloud-init-jenkins.txt* and paste the following configuration. For example, create the file in the Cloud Shell not on your local machine. Enter `sensible-editor cloud-init-jenkins.txt` to create the file and see a list of available editors. Make sure that the whole cloud-init file is copied correctly, especially the first line:\n\n```yaml\n#cloud-config\npackage_upgrade: true\nwrite_files:\n  - path: /etc/systemd/system/docker.service.d/docker.conf\n    content: |\n      [Service]\n        ExecStart=\n        ExecStart=/usr/bin/dockerd\n  - path: /etc/docker/daemon.json\n    content: |\n      {\n        \"hosts\": [\"fd://\",\"tcp://127.0.0.1:2375\"]\n      }\nruncmd:\n  - apt install openjdk-8-jre-headless -y\n  - wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -\n  - sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'\n  - apt-get update && apt-get install jenkins -y\n  - curl -sSL https://get.docker.com/ | sh\n  - usermod -aG docker azureuser\n  - usermod -aG docker jenkins\n  - service jenkins restart\n```\n\nBefore you can create a VM, create a resource group with [az group create](/cli/azure/group). The following example creates a resource group named *myResourceGroupJenkins* in the *eastus* location:\n\n```azurecli-interactive \naz group create --name myResourceGroupJenkins --location eastus\n```\n\nNow create a VM with [az vm create](/cli/azure/vm). Use the `--custom-data` parameter to pass in your cloud-init config file. Provide the full path to *cloud-init-jenkins.txt* if you saved the file outside of your present working directory.\n\n```azurecli-interactive \naz vm create --resource-group myResourceGroupJenkins \\\n    --name myVM \\\n    --image UbuntuLTS \\\n    --admin-username azureuser \\\n    --generate-ssh-keys \\\n    --custom-data cloud-init-jenkins.txt\n```\n\nIt takes a few minutes for the VM to be created and configured.\n\nTo allow web traffic to reach your VM, use [az vm open-port](/cli/azure/vm) to open port *8080* for Jenkins traffic and port *1337* for the Node.js app that is used to run a sample app:\n\n```azurecli-interactive \naz vm open-port --resource-group myResourceGroupJenkins --name myVM --port 8080 --priority 1001\naz vm open-port --resource-group myResourceGroupJenkins --name myVM --port 1337 --priority 1002\n```\n\n\n## Configure Jenkins\nTo access your Jenkins instance, obtain the public IP address of your VM:\n\n```azurecli-interactive \naz vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv\n```\n\nFor security purposes, you need to enter the initial admin password that is stored in a text file on your VM to start the Jenkins install. Use the public IP address obtained in the previous step to SSH to your VM:\n\n```bash\nssh azureuser@<publicIps>\n```\n\nVerify Jenkins is running using the `service` command:\n\n```bash\n$ service jenkins status\n● jenkins.service - LSB: Start Jenkins at boot time\n   Loaded: loaded (/etc/init.d/jenkins; generated)\n   Active: active (exited) since Tue 2019-02-12 16:16:11 UTC; 55s ago\n     Docs: man:systemd-sysv-generator(8)\n    Tasks: 0 (limit: 4103)\n   CGroup: /system.slice/jenkins.service\n\nFeb 12 16:16:10 myVM systemd[1]: Starting LSB: Start Jenkins at boot time...\n...\n```\n\nView the `initialAdminPassword` for your Jenkins install and copy it:\n\n```bash\nsudo cat /var/lib/jenkins/secrets/initialAdminPassword\n```\n\nIf the file isn't available yet, wait a couple more minutes for cloud-init to complete the Jenkins and Docker install.\n\nNow open a web browser and go to `http://<publicIps>:8080`. Complete the initial Jenkins setup as follows:\n\n- Choose **Select plug-ins to install**\n- Search for *GitHub* in the text box across the top. Check the box for *GitHub*, then select **Install**\n- Create the first admin user. Enter a username, such as **admin**, then provide your own secure password. Finally, type a full name and e-mail address.\n- Select **Save and Finish**\n- Once Jenkins is ready, select **Start using Jenkins**\n  - If your web browser displays a blank page when you start using Jenkins, restart the Jenkins service. From your SSH session, type `sudo service jenkins restart`, then refresh you web browser.\n- If needed, log in to Jenkins with the username and password you created.\n\n\n## Create GitHub webhook\nTo configure the integration with GitHub, open the [Node.js Hello World sample app](https://github.com/Azure-Samples/nodejs-docs-hello-world) from the Azure samples repo. To fork the repo to your own GitHub account, select the **Fork** button in the top right-hand corner.\n\nCreate a webhook inside the fork you created:\n\n- Select **Settings**, then select **Webhooks** on the left-hand side.\n- Choose **Add webhook**, then enter *Jenkins* in filter box.\n- For the **Payload URL**, enter `http://<publicIps>:8080/github-webhook/`. Make sure you include the trailing /\n- For **Content type**, select *application/x-www-form-urlencoded*.\n- For **Which events would you like to trigger this webhook?**, select *Just the push event.*\n- Set **Active** to checked.\n- Click **Add webhook**.\n\n![Add GitHub webhook to your forked repo](media/pipeline-with-github-and-docker/github-webhook.png)\n\n\n## Create Jenkins job\nTo have Jenkins respond to an event in GitHub such as committing code, create a Jenkins job. Use the URLs for your own GitHub fork.\n\nIn your Jenkins website, select **Create new jobs** from the home page:\n\n- Enter *HelloWorld* as job name. Choose **Freestyle project**, then select **OK**.\n- Under the **General** section, select **GitHub project** and enter your forked repo URL, such as `https://github.com/cynthn/nodejs-docs-hello-world`\n- Under the **Source code management** section, select **Git**, enter your forked repo *.git* URL, such as `https://github.com/cynthn/nodejs-docs-hello-world.git`\n- Under the **Build Triggers** section, select **GitHub hook trigger for GITscm polling**.\n- Under the **Build** section, choose **Add build step**. Select **Execute shell**, then enter `echo \"Test\"` in the command window.\n- Select **Save** at the bottom of the jobs window.\n\n\n## Test GitHub integration\nTo test the GitHub integration with Jenkins, commit a change in your fork. \n\nBack in GitHub web UI, select your forked repo, and then select the **index.js** file. Select the pencil icon to edit this file so line 6 reads:\n\n```javascript\nresponse.end(\"Hello World!\");\n```\n\nTo commit your changes, select the **Commit changes** button at the bottom.\n\nIn Jenkins, a new build starts under the **Build history** section of the bottom left-hand corner of your job page. Choose the build number link and select **Console output** on the left-hand side. You can view the steps Jenkins takes as your code is pulled from GitHub and the build action outputs the message `Test` to the console. Each time a commit is made in GitHub, the webhook reaches out to Jenkins and triggers a new build in this way.\n\n\n## Define Docker build image\nTo see the Node.js app running based on your GitHub commits, lets build a Docker image to run the app. The image is built from a Dockerfile that defines how to configure the container that runs the app. \n\nFrom the SSH connection to your VM, change to the Jenkins workspace directory named after the job you created in a previous step. In this example, that was named *HelloWorld*.\n\n```bash\ncd /var/lib/jenkins/workspace/HelloWorld\n```\n\nCreate a file in this workspace directory with `sudo sensible-editor Dockerfile` and paste the following contents. Make sure that the whole Dockerfile is copied correctly, especially the first line:\n\n```yaml\nFROM node:alpine\n\nEXPOSE 1337\n\nWORKDIR /var/www\nCOPY package.json /var/www/\nRUN npm install\nCOPY index.js /var/www/\n```\n\nThis Dockerfile uses the base Node.js image using Alpine Linux, exposes port 1337 that the Hello World app runs on, then copies the app files and initializes it.\n\n\n## Create Jenkins build rules\nIn a previous step, you created a basic Jenkins build rule that output a message to the console. Lets create the build step to use our Dockerfile and run the app.\n\nBack in your Jenkins instance, select the job you created in a previous step. Select **Configure** on the left-hand side and scroll down to the **Build** section:\n\n- Remove your existing `echo \"Test\"` build step. Select the red cross on the top right-hand corner of the existing build step box.\n- Choose **Add build step**, then select **Execute shell**\n- In the **Command** box, enter the following Docker commands, then select **Save**:\n\n  ```bash\n  docker build --tag helloworld:$BUILD_NUMBER .\n  docker stop helloworld && docker rm helloworld\n  docker run --name helloworld -p 1337:1337 helloworld:$BUILD_NUMBER node /var/www/index.js &\n  ```\n\nThe Docker build steps create an image and tag it with the Jenkins build number so you can maintain a history of images. Any existing containers running the app are stopped and then removed. A new container is then started using the image and runs your Node.js app based on the latest commits in GitHub.\n\n\n## Test your pipeline\nTo see the whole pipeline in action, edit the *index.js* file in your forked GitHub repo again and select **Commit change**. A new job starts in Jenkins based on the webhook for GitHub. It takes a few seconds to create the Docker image and start your app in a new container.\n\nIf needed, obtain the public IP address of your VM again:\n\n```azurecli-interactive \naz vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv\n```\n\nOpen a web browser and enter `http://<publicIps>:1337`. Your Node.js app is displayed and reflects the latest commits in your GitHub fork as follows:\n\n![Running Node.js app](media/pipeline-with-github-and-docker/running-nodejs-app.png)\n\nNow make another edit to the *index.js* file in GitHub and commit the change. Wait a few seconds for the job to complete in Jenkins, then refresh your web browser to see the updated version of your app running in a new container as follows:\n\n![Running Node.js app after another GitHub commit](media/pipeline-with-github-and-docker/another-running-nodejs-app.png)\n\n\n## Next steps\nIn this tutorial, you configured GitHub to run a Jenkins build job on each code commit and then deploy a Docker container to test your app. You learned how to:\n\n> [!div class=\"checklist\"]\n> * Create a Jenkins VM\n> * Install and configure Jenkins\n> * Create webhook integration between GitHub and Jenkins\n> * Create and trigger Jenkins build jobs from GitHub commits\n> * Create a Docker image for your app\n> * Verify GitHub commits build new Docker image and updates running app\n\nAdvance to the next tutorial to learn more about how to integrate Jenkins with Azure DevOps Services.\n\n> [!div class=\"nextstepaction\"]\n> [Deploy apps with Jenkins and Azure DevOps Services](deploy-to-linux-vm-using-azure-devops-services.md)\n"
  },
  {
    "path": "articles/jenkins/plug-ins-for-azure.md",
    "content": "---\ntitle: Jenkins plug-ins for Azure\ndescription: Learn about the Jenkins plug-in available for use with Azure\nkeywords: jenkins, plugins, plug-ins, azure, devops\nms.date: 05/08/2025\nms.topic: concept-article\nms.custom: devx-track-jenkins\n---\n\n# Jenkins plug-ins for Azure\n\nThe following table shows the current status for all Jenkins plug-ins. Click a Jenkins plug-ins to learn more about it.\n\nIn cases where the plugin has been retired, Azure CLI is the recommended way to integrate Jenkins with the Azure service.\n\n| Jenkins plug-in <img width=500/>| Description | Microsoft support status <img width=500/> | Community Supported |\n|----------------|----------------|----------------|\n| [Azure Service Fabric](https://plugins.jenkins.io/service-fabric)           | Jenkins plug-in for Linux Azure Service Fabric projects. | | |\n| [Microsoft Entra ID](https://plugins.jenkins.io/azure-ad)                             | Jenkins plug-in that supports authentication & authorization via Microsoft Entra ID. | Retired February 29, 2024 | Yes |\n| [Azure App Service](https://plugins.jenkins.io/azure-app-service)           | Jenkins plug-in to deploy an Azure App Service \\(currently supports only Web App\\) | Retired February 29, 2024 | |\n| [Azure Artifact Manager](https://plugins.jenkins.io/azure-artifact-manager) | Azure Artifact Manager plug-in is an Artifact Manager that allows you store your artifacts into Azure Blob Storage. Azure Artifact Manager plug-in works transparently to Jenkins and your jobs, it is like the default Artifact Manager. | Retired February 29, 2024 |  Yes |\n| [Azure Container Agents](https://plugins.jenkins.io/azure-container-agents) | Azure Container Agents plug-in can help you to run a container as an agent in Jenkins | Retired February 29, 2024 |  Yes |\n| [Azure Container Registry Task](https://plugins.jenkins.io/azure-container-registry-tasks)       | Jenkins plug-in to send a docker-build request to [Azure Container Registry](/azure/container-registry/container-registry-tasks-overview). | Retired February 29, 2024 | |\n| [Azure Container Service](https://plugins.jenkins.io/azure-acs)             | Jenkins plug-in to deploy configurations to Azure Container Service (AKS). | Retired February 29, 2024 |  |\n| [Azure Credential](https://plugins.jenkins.io/azure-credentials)            | Jenkins plug-in to manage Azure credentials. | Retired February 29, 2024 | Yes |\n| [Azure Function](https://plugins.jenkins.io/azure-function)                 | Jenkins plug-in to deploy an Azure Function. | Retired February 29, 2024 |  |\n| [Azure IoT Edge](https://github.com/Microsoft/azure-iot-edge-jenkins-plugin)                 | Azure IoT Edge plug-in makes it easy to set up a CI/CD pipeline for developing an IoT Edge solution on Jenkins. | Retired February 29, 2024 | |\n| [Azure Storage](https://plugins.jenkins.io/windows-azure-storage)           | plug-in for uploading build artifacts to, or downloading build dependencies from, Microsoft Azure Blob storage. | Retired February 29, 2024 | Yes |\n| [Azure virtual machine scale set](https://plugins.jenkins.io/azure-vmss)    | Jenkins plug-in to deploy VM images to Azure virtual machine scale sets. | Retired February 29, 2024 | |\n| [Azure VM agents](https://plugins.jenkins.io/azure-vm-agents)               | Jenkins plug-in to create Jenkins agents in Azure virtual machines (via Azure Resource Manager template). | Retired February 29, 2024 | Yes |"
  },
  {
    "path": "articles/jenkins/scale-deployments-using-vm-agents.md",
    "content": "---\ntitle: Tutorial - Scale Jenkins deployments with VM running in Azure\ndescription: Learn how to add additional capacity to your Jenkins pipelines using Azure virtual machines\nkeywords: jenkins, azure, devops, virtual machine, agents\nms.topic: tutorial\nms.date: 01/08/2021\nms.custom:\n  - devx-track-jenkins\n  - devx-track-azurecli\n  - sfi-image-nochange\n---\n\n# Tutorial: Scale Jenkins deployments with VM running in Azure\n\n[!INCLUDE [jenkins-integration-with-azure.md](includes/jenkins-integration-with-azure.md)]\n\nThis tutorial shows how to create a Linux virtual machines in Azure and add the VM as a work node to Jenkins.\n\nIn this tutorial, you will:\n\n> [!div class=\"checklist\"]\n> * Create agent machine\n> * Add agent to Jenkins\n> * Create a new Jenkins freestyle job\n> * Run the job on an Azure VM agent\n\n## Prerequisites\n\n- **Jenkins installation**: If you don't have access to a Jenkins installation, [configure Jenkins using Azure CLI](configure-on-linux-vm.md)\n\n## Configure agent virtual machine\n\n1. Use [az group create](/cli/azure/group?#az-group-create) to create an Azure resource group.\n\n    ```azurecli\n    az group create --name <resource_group> --location <location>\n    ```\n\n1. Use [az vm create](/cli/azure/vm#az-vm-create) to create a virtual machine.\n\n    ```azurecli\n    az vm create --resource-group <resource-group> --name <vm_name> --image UbuntuLTS --admin-username azureuser --admin-password \"<password>\"\n    ```\n\n    **Key points**:\n\n    - You can also upload your ssh key with the following command `--ssh-key-value <ssh_path>`.\n\n1. Install the JDK.  \n\n    #### [Linux](#tab/linux)\n    \n    1. Log in to the virtual machine using an SSH tool.\n    \n        ```bash\n        ssh username@123.123.123.123\n        ```\n        \n    1. Install the JDK with apt. You can also install with other package manager tools such as yum or pacman.\n    \n        ```bash\n        sudo apt-get install -y default-jdk\n        ```\n    \n    1. After installation is complete, run `java -version` to verify the Java environment. The output will include the version numbers associated with various parts of the JDK.\n    \n    #### [Windows](#tab/windows)\n    \n    1. Log in to the virtual machine using an SSH tool or using Remote Desktop Connection.\n    \n    1. [Download the JDK](https://www.oracle.com/java/technologies/javase-downloads.html) that is appropriate for your environment.\n    \n    1. Install JDK\n    \n## Configure Jenkins URL\n\nIf you use JNLP, you'll need to configure the Jenkins URL.\n\n1. From the menu, select **Manage Jenkins**.\n\n1. Under **System Configuration**, select **Configure System**.\n\n1. Verify that the **Jenkins URL** is set to the HTTP address of your Jenkins installation - `http://<your_host>.<your_domain>:8080/`.\n\n1. Select **Save**.\n\n## Add agent to Jenkins\n\n1. From the menu, select **Manage Jenkins**.\n\n1. Under **System Configuration**, select **Manage Nodes and Clouds**.\n\n1. From the menu, select **New Node**.\n\n1. Enter a value for **Node Name**.\n\n1. Select **Permanent Agent**.\n\n1. Select **OK**.\n\n1. Specify values for the following fields:\n\n    - **Name**: Specify a unique name that identifies an agent within the new Jenkins installation. This value can be different from the agent hostname. However, it's convenient to make them the two values the same. The name value is allowed any special character from the following list: `?*/\\%!@#$^&|<>[]:;`.\n\n    - **Remote root directory**: An agent needs to have a directory dedicated to Jenkins. Specify the path to this directory on the agent. It is best to use an absolute path, such as `/home/azureuser/work` or `c:\\jenkins`. This should be a path local to the agent machine. There is no need for this path to be visible from the master. If you use a relative path, such as ./jenkins-agent, the path will be relative to the working directory provided by the Launch method.\n\n    - **Labels**: Labels are used to group semantically related agents into one logical group. For example, you could define a label of `UBUNTU` for all your agents running the Ubuntu distro of Linux.\n\n    - **Launch method**: There are two options to start the remote Jenkins node: **Launch agents via SSH** and **Launch agent via execution of command on the master**:\n\n        - **Launch agents via SSH**: Specify the values for the following fields:\n\n            - **Host**: VM public IP address or domain name. For example, `123.123.123.123` or `example.com`\n\n            - **Credentials**: Select a credential to be used for logging in to the remote host. You can also select the **Add** button to define a new credential and then select that new credential once it's create.\n\n            - **Host Key Verification Strategy**: Controls how Jenkins verifies the SSH key presented by the remote host whilst connecting.\n\n            ![Node configuration example specifying a launch method of Launch agents via SSH.](./media/scale-deployments-using-vm-agents/ssh2.png)\n\n        - **Launch agent via execution of command on the master**:\n\n            - Download the `agent.jar`  from `https://<your_jenkins_host_name>/jnlpJars/agent.jar`. For example, `https://localhost:8443/jnlpJars/agent.jar`.\n\n            - Upload `agent.jar` to your virtual machine\n\n            - Start Jenkins with command `ssh <node_host> java -jar <remote_agentjar_path>`. For example, `ssh azureuser@99.99.999.9 java -jar /home/azureuser/agent.jar`.\n\n            ![Node configuration example specifying a launch method of Launch agent via execution of command on the master.](./media/scale-deployments-using-vm-agents/config.png)\n\n1. Select **Save**.\n\nAfter you define the configurations, Jenkins adds the virtual machine as a new work node.\n\n![Example of virtual machine as new work node](./media/scale-deployments-using-vm-agents/commandstart.png)\n\n## Create a job in Jenkins\n\n1. From the menu, select **New Item**.\n\n1. Enter `demoproject1` for the name.\n\n1. Select **Freestyle project**.\n\n1. Select **OK**.\n\n1. In the **General** tab, choose **Restrict where project can be run** and type `ubuntu` in **Label Expression**. You see a message confirming that the label is served by the cloud configuration created in the previous step.\n\n   ![Setting up a new Jenkins job](./media/scale-deployments-using-vm-agents/job-config.png)\n\n1. In the **Source Code Management** tab, select **Git** and add the following URL into the **Repository URL** field: `https://github.com/spring-projects/spring-petclinic.git`\n\n1. In the **Build** tab, select **Add build step**, then **Invoke top-level Maven targets**. Enter `package` in the **Goals** field.\n\n1. Select **Save**.\n\n## Build the new job on an Azure VM agent\n\n1. Select the job you created in the previous step.\n\n1. Select **Build now**. A new build is queued, but doesn't start until an agent VM is created in your Azure subscription.\n\n1. Once the build is complete, go to **Console output**. You see that the build was performed remotely on an Azure agent.\n\n    ![Console output](./media/scale-deployments-using-vm-agents/console-output.png)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [CI/CD to Azure App Service](./deploy-to-azure-app-service-using-azure-cli.md)"
  },
  {
    "path": "articles/jenkins/toc.yml",
    "content": "- name: Jenkins on Azure\n  href: index.yml\n- name: Overview\n  items:\n  - name: About Jenkins on Azure\n    href: overview.md\n- name: Get started\n  expanded: true\n  items:\n  - name: Install Jenkins on a Linux VM\n    href: configure-on-linux-vm.md\n- name: Tutorials\n  items:\n  - name: Configure\n    items:\n    - name: Scale with Azure Container Instances\n      href: azure-container-instances-as-jenkins-build-agent.md\n    - name: Scale with Azure VM agents\n      href: scale-deployments-using-vm-agents.md\n  - name: Implement CI/CD\n    items:\n    - name: Azure Spring Apps\n      items:\n      - name: Deploy to Azure Spring Apps using the Azure CLI\n        href: deploy-to-azure-spring-apps-using-azure-cli.md\n    - name: AKS\n      items:\n      - name: CI/CD to Kubernetes\n        href: deploy-from-github-to-aks.md\n    - name: App Service\n      items:\n      - name: Create Azure resources in a pipeline job\n        href: deploy-to-azure-app-service-using-azure-cli.md\n    - name: Use Jenkins with Azure DevOps\n      href: deploy-to-linux-vm-using-azure-devops-services.md\n    - name: Deploy to Azure Functions\n      href: deploy-to-azure-functions.md\n    - name: Publish to Azure Storage\n      href: azure-storage-blobs-as-build-artifact-repository.md\n    - name: CI/CD to Linux VMs\n      href: pipeline-with-github-and-docker.md\n    - name: CI/CD to Service Fabric\n      href: deploy-to-service-fabric-cluster.md\n- name: Samples\n  items:\n    - name: Sample jobs and scripts\n      href: https://github.com/azure/jenkins\n- name: Resources\n  items:\n  - name: Jenkins plug-in for Azure\n    href: plug-ins-for-azure.md\n  - name: Azure Roadmap\n    href: https://azure.microsoft.com/updates\n  - name: Jenkins home\n    href: https://jenkins.io/\n  - name: Jenkins X Home\n    href: https://jenkins-x.io\n  - name: Jenkins architecture\n    href: /azure/architecture/reference-architectures/jenkins?toc=/azure/developer/jenkins/toc.json&bc=/azure/developer/jenkins/breadcrumb/toc.json\n"
  },
  {
    "path": "articles/pivots.yml",
    "content": "# YamlMime:ZonePivotGroups\ngroups:\n- id: pivot-os-windows-linux\n  title: Operating system\n  prompt: Choose an operating system\n  pivots:\n  - id: os-windows\n    title: Windows\n  - id: os-linux\n    title: Linux\n- id: pivot-visual-studio\n  title: Visual Studio version\n  prompt: Choose a version\n  pivots:\n  - id: visual-studio-2026\n    title: Visual Studio 2026\n  - id: visual-studio-2022\n    title: Visual Studio 2022"
  },
  {
    "path": "articles/python/TOC.yml",
    "content": "- name: Azure for Python developers\n  href: index.yml\n\n- name: Get started\n  href: get-started.md\n- name: Azure AI apps \n  items: \n  - name: Develop with Foundry Tools\n    href: azure-ai-for-python-developers.md\n  - name: Get started with the Python enterprise chat sample\n    href: get-started-app-chat-template.md\n    display: Azure OpenAI, OpenAI, FastApi\n  - name: Configure document security\n    href: get-started-app-chat-document-security-trim.md\n  - name: Secure your chat endpoint\n    href: get-started-app-chat-private-endpoint.md\n  - name: Evaluate your chat app\n    href: get-started-app-chat-evaluations.md\n    display: Azure OpenAI\n  - name: Scale Azure OpenAI with Azure Container Apps\n    href: get-started-app-chat-scaling-with-azure-container-apps.md\n  - name: Scale Azure OpenAI with Azure API Management\n    href: get-started-app-chat-scaling-with-azure-api-management.md\n  - name: Load test with Locust\n    href: get-started-app-chat-app-load-test-locust.md\n- name: Web\n  items:\n  - name: Set up local web dev environment\n    href: configure-python-web-app-local-environment.md  \n  - name: Python Web azd Templates\n    items:\n      - name: Overview\n        href: overview-azd-templates.md\n      - name: Quickstart in local env\n        href: quickstart-python-web-azd-templates.md\n      - name: Quickstart in Codespaces\n        href: quickstart-python-web-azd-codespaces.md\n      - name: Scale with Bicep\n        href: quickstart-python-scale-bicep.md        \n  - name: Web app solutions\n    items:\n    - name: Django/Flask\n      href: /azure/app-service/quickstart-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n    - name: Django/Flask + db\n      href: /azure/app-service/tutorial-python-postgresql-app?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n    - name: Passwordless auth - system-assigned managed identity\n      href: tutorial-python-managed-identity-cli.md\n    - name: Passwordless auth - user-assigned managed identity\n      href: tutorial-python-managed-identity-user-assigned-cli.md\n    - name: Static websites\n      items:\n        - name: Hosting in Azure Storage\n          href: /azure/storage/blobs/storage-blob-static-website?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n        - name: Deploy from VS Code\n          href: /azure/static-web-apps/getting-started?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n    - name: Configure web apps\n      items:\n      - name: Codespaces dev environment\n        href: configure-python-web-app-codespaces.md\n      - name: Configure a startup file for App Service\n        href: configure-python-web-app-on-app-service.md\n    - name: CI/CD with App Service\n      items:\n      - name: GitHub Actions\n        href: python-web-app-github-actions-app-service.md\n      - name: Azure Pipelines\n        href: /azure/devops/pipelines/ecosystems/python-webapp?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n    - name: Add sign in\n      href: /entra/identity-platform/quickstart-web-app-python-sign-in?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n    - name: Store and retrieve secrets\n      href: /azure/key-vault/secrets/quick-create-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n    - name: Set up Azure monitor\n      href: /azure/azure-monitor/app/opencensus-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n\n  - name: Serverless solutions\n    items:\n      - name: Create a function\n        items:\n          - name: Using Visual Studio Code\n            href: /azure/azure-functions/create-first-function-vs-code-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n          - name: Using the Azure CLI\n            href: /azure/azure-functions/create-first-function-cli-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n      - name: Connect to Azure Storage\n        items:\n          - name: Using Visual Studio Code\n            href: /azure/azure-functions/functions-add-output-binding-storage-queue-vs-code?pivots=programming-language-python&toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n          - name: Using the Azure CLI\n            href: /azure/azure-functions/functions-add-output-binding-storage-queue-cli?pivots=programming-language-python&toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n\n- name: Data\n  items:\n\n  - name: Data engineering solutions\n    href: quickstarts-data-solutions.md\n\n  - name: Data science solutions\n    items:\n      - name: Deploy machine learning models\n        href: quickstarts-machine-learning.md\n\n- name: Containers \n  items:\n    - name: Python containers overview\n      href: containers-in-azure-overview-python.md\n    - name: Deploy to App Service\n      items:\n        - name: Simple web app\n          href: tutorial-containerize-simple-web-app-for-app-service.md\n        - name: Web app + MongoDB\n          items:\n            - name: 1. Overview\n              href: tutorial-containerize-deploy-python-web-app-azure-01.md\n            - name: 2. Build and test container locally\n              href: tutorial-containerize-deploy-python-web-app-azure-02.md\n            - name: 3. Build container in Azure\n              href: tutorial-containerize-deploy-python-web-app-azure-03.md\n            - name: 4. Deploy container App Service\n              href: tutorial-containerize-deploy-python-web-app-azure-04.md\n            - name: 5. Clean up resources\n              href: tutorial-containerize-deploy-python-web-app-azure-05.md\n    - name: Deploy to Container Apps\n      items:\n        - name: Simple web app\n          href: tutorial-containerize-simple-web-app.md\n        - name: Web app + PostgreSQL\n          items:\n            - name: Overview\n              href: tutorial-deploy-python-web-app-azure-container-apps-01.md\n            - name: Build and deploy a container app\n              href: tutorial-deploy-python-web-app-azure-container-apps-02.md\n            - name: Configure CI/CD\n              href: tutorial-deploy-python-web-app-azure-container-apps-03.md\n    - name: Deploy a Kubernetes cluster\n      href: /azure/aks/learn/quick-kubernetes-deploy-cli?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n\n- name: Logs\n  href: /azure/azure-monitor/app/opencensus-python\n- name: Azure SDK for Python\n  items:\n    - name: Overview\n      href: sdk/azure-sdk-overview.md\n    - name: Library usage patterns\n      href: sdk/azure-sdk-library-usage-patterns.md\n    - name: Authentication\n      items:\n      - name: Overview\n        href: sdk/authentication/overview.md\n      - name: Auth during local development\n        items:\n        - name: Use a developer account\n          href: sdk/authentication/local-development-dev-accounts.md\n        - name: Use a service principal\n          href: sdk/authentication/local-development-service-principal.md\n        - name: Use a broker \n          href: sdk/authentication/local-development-broker.md\n      - name: Auth from Azure-hosted apps\n        items:\n        - name: Use a system-assigned managed identity\n          href: sdk/authentication/system-assigned-managed-identity.md\n        - name: Use a user-assigned managed identity\n          href: sdk/authentication/user-assigned-managed-identity.md\n      - name: Auth from on-premises apps\n        href: sdk/authentication/on-premises-apps.md\n      - name: Additional auth methods\n        href: sdk/authentication/additional-methods.md\n      - name: Credential chains\n        href: sdk/authentication/credential-chains.md\n      - name: Walkthrough tutorial\n        items:\n        - name: 1. Introduction and background\n          href: walkthrough-tutorial-authentication-01.md\n        - name: 2. Authentication requirements\n          href: walkthrough-tutorial-authentication-02.md\n        - name: 3. Third-party API implementation\n          href: walkthrough-tutorial-authentication-03.md\n        - name: 4. Main app implementation\n          href: walkthrough-tutorial-authentication-04.md\n        - name: 5. Dependencies and environment variables\n          href: walkthrough-tutorial-authentication-05.md\n        - name: 6. Main app startup code\n          href: walkthrough-tutorial-authentication-06.md\n        - name: 7. Main app endpoint\n          href: walkthrough-tutorial-authentication-07.md\n    - name: Authorization\n      items:\n      - name: Overview\n        href: sdk/authorization/overview.md          \n    - name: Install Azure packages\n      href: sdk/azure-sdk-install.md\n    - name: Use Azure packages \n      items:\n      - name: \"Create a resource group\"\n        href: sdk/examples/azure-sdk-example-resource-group.md\n      - name: \"List groups and resources\"\n        href: sdk/examples/azure-sdk-example-list-resource-groups.md\n      - name: \"Create Azure storage\"\n        href: sdk/examples/azure-sdk-example-storage.md\n      - name: \"Use Azure storage\"\n        href: sdk/examples/azure-sdk-example-storage-use.md\n      - name: \"Create & deploy a web app\"\n        href: sdk/examples/azure-sdk-example-web-app.md\n      - name: \"Create & query a database\"\n        href: sdk/examples/azure-sdk-example-database.md\n      - name: \"Create a virtual machine\"\n        href: sdk/examples/azure-sdk-example-virtual-machines.md\n      - name: \"Use Azure Managed Disks with a VM\"\n        href: sdk/examples/azure-sdk-samples-managed-disks.md\n      - name: Configure logging\n        href: sdk/azure-sdk-logging.md\n      - name: Configure proxies\n        href: sdk/azure-sdk-configure-proxy.md\n      - name: Use a sovereign domain\n        href: sdk/azure-sdk-sovereign-domain.md\n    - name: SDK Fundamentals\n      items:\n      - name: Overview\n        href: sdk/Fundamentals/overview.md\n      - name: Errors\n        href: sdk/Fundamentals/errors.md\n      - name: HTTP Pipeline & retries\n        href: sdk/Fundamentals/http-pipeline-retries.md\n      - name: Common Types (Response)\n        href: sdk/Fundamentals/common-types-response.md\n      - name: Language design guidelines \n        href: sdk/Fundamentals/language-design-guidelines.md        \n- name: SDK PyPI package index\n  href: sdk/azure-sdk-library-package-index.md\n- name: SDK reference documentation\n  href: /python/api/overview/azure/\n- name: Explore services supporting Python\n  items:\n  - name: App hosting\n    href: quickstarts-app-hosting.md\n  - name: Data solutions\n    href: quickstarts-data-solutions.md\n  - name: Identity and access management\n    href: quickstarts-identity-security.md\n  - name: Machine learning\n    href: quickstarts-machine-learning.md\n  - name: Foundry Tools\n    href: quickstarts-ai-services.md\n  - name: Messaging, Events & IoT\n    href: quickstarts-messaging-iot.md\n  - name: Other services\n    href: quickstarts-other-services.md\n\n- name: Samples\n  items:\n  - name: Web apps & serverless\n    href: /samples/browse/?languages=python&products=azure-functions%2Cazure-app-service%2Cazure-logic-apps\n  - name: Databases\n    href: /samples/browse/?languages=python&products=azure-cosmos-db%2Cazure-sql-database\n  - name: Storage\n    items:\n      - name: Azure Storage\n        href: /samples/browse/?languages=python&products=azure-storage\n      - name: Redis Cache\n        href: /samples/browse/?languages=python&products=azure-redis-cache\n  - name: Identity & Security\n    href: /samples/browse/?languages=python&products=entra%2Cazure-key-vault\n  - name: IoT\n    href: /samples/browse/?languages=python&products=azure-iot-hub%2Cazure-iot-edge%2Cazure-iot-central\n  - name: Data science\n    items:\n      - name: Machine Learning Service\n        href: /samples/browse/?languages=python&products=azure-machine-learning-service\n      - name: Databricks\n        href: /samples/browse/?languages=python&products=azure-databricks\n      - name: HDInsight\n        href: /samples/browse/?languages=python&products=azure-hdinsight\n  - name: Foundry Tools\n    href: /samples/browse/?languages=python&filter-products=AI&products=ai-services\n  - name: Search\n    href: /samples/browse/?languages=python&products=azure-search\n  - name: All Samples\n    href: /samples/browse/?languages=python\n"
  },
  {
    "path": "articles/python/azure-ai-for-python-developers.md",
    "content": "---\ntitle: Develop Python apps that use Foundry Tools\ndescription: Review an organized list of resources about Foundry Tools scenarios for Python developers, including documentation and code samples.\nkeywords: ai, azure openai service\nms.subservice: intelligent-apps\nms.topic: overview\nms.date: 01/30/2026\nms.update-cycle: 180-days\nms.custom: overview, devx-track-python, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n\n#Customer intent: As a Python developer, I want to explore Python resources for Foundry Tools, so I can find documentation and samples to assist in my development.\n---\n\n# Develop AI apps with Python\n\nThis article offers a curated list of top learning resources for Python developers who are new to building AI applications. It includes links to quickstart guides, sample projects, official documentation, training courses, and other helpful materials.\n\n[!INCLUDE [azure-ai-for-developers-python](../ai/includes/azure-ai-for-developers-python.md)]\n"
  },
  {
    "path": "articles/python/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: Python\n      tocHref: /azure\n      topicHref: /azure/developer/python/index\n"
  },
  {
    "path": "articles/python/configure-python-web-app-codespaces.md",
    "content": "---\ntitle: Create a dev environment in GitHub Codespaces with FastAPI and Postgres.\ndescription: How to set up a Python development environment in GitHub Codespaces with FastAPI and Postgres.\nms.date: 06/18/2025\nms.topic: how-to\nms.custom:\n  - devx-track-python\n  - sfi-image-nochange\n---\n\n# Create a GitHub Codespaces dev environment with FastAPI and Postgres\n\nThis article shows you how to run FastAPI and Postgres together in a [GitHub Codespaces][1] environment. Codespaces is a cloud-hosted development environment that allows you to create configurable and repeatable development environments.\n\nYou can open the sample repo in a [browser][4] or in an integrated development environment (IDE) like [Visual Studio Code][6] with the [GitHub Codespaces extension][5].\n\nAlternatively, you can clone the sample repository locally. When you open the project in Visual Studio Code, you can use Dev Containers to run it using [Dev Containers][2]. Dev Containers requires that [Docker Desktop][3] to be installed locally. If Docker isn’t installed, you can run the project using GitHub Codespaces as the development environment.\n\nWhen using GitHub Codespaces, keep in mind that you have a fixed number of core hours free per month. This tutorial requires less than one core hour to complete. For more information, see [About billing for GitHub Codespaces][7].\n\nYou can also use this setup as a starting point and modify the sample to run other Python web frameworks such as Django or Flask.\n\n## Start the dev environment in Codespaces\n\nThis tutorial introduces one of many possible ways to create and work with GitHub Codespaces.\n\n1. Go to sample app repo [https://github.com/Azure-Samples/msdocs-fastapi-postgres-codespace][0].\n\n    The sample repo has all the configuration needed to create an environment with a FastAPI app using a Postgres database. You can create a similar project following the steps in [Setting up a Python project for GitHub Codespaces][8].\n\n1. Select **Code**, **Codespaces** tab, and **+** to create a new codespace.\n\n    :::image type=\"content\" source=\"./media/codespaces-tutorial/create-codespaces-small.png\" alt-text=\"Screenshot showing how to create a codespace from the GitHub repo.\" lightbox=\"./media/codespaces-tutorial/create-codespaces.png\":::\n\n1. When the container finishes building, confirm that you see **Codespaces** in the lower left corner of the browser, and see the sample repo.\n\n    The codespace key configuration files are *devcontainer.json*, *Dockerfile*, and *docker-compose.yml*. For more information, see [GitHub Codespaces overview][1].\n\n    > [!TIP]\n    > You can also run the codespace in Visual Studio Code. Select **Codespaces** in lower left corner of the browser or (`Ctrl` + `Shift` + `P` / `Ctrl` + `Command` + `P`) and type \"Codespaces\". Then select **Open in VS Code**. Also, if you stop the codespace and go back to the repo and open it again in GitHub Codespaces, you have the option to open it in VS Code or a browser.\n\n1. Select the *.env.devcontainer* file and create a copy called *.env* with the same contents.\n\n    The *.env* contains environment variables that are used in the code to connect to the database.\n\n1. If a terminal window isn't already open, open one by opening the Command Palette (`Ctrl` + `Shift` + `P` / `Ctrl` + `Command` + `P`), typing \"Terminal: Create New Terminal\", and selecting it to create a new terminal.\n\n1. Select the **PORTS** tab in the terminal window to confirm that PostgreSQL is running on port 5432.\n\n1. In the terminal window, run the FastAPI app.\n\n    ```bash\n    uvicorn main:app --reload\n    ```\n\n1. Select the notification **Open in Browser**.\n\n    If you don't see or missed the notification, go to **PORTS** and find the **Local Address** for port 8000. Use the URL listed there.\n\n1. Add */docs* on the end of the preview URL to see the [Swagger UI][12], which allows you to test the API methods.\n\n    The API methods are generated from the OpenAPI interface that FastAPI creates from the code.\n\n    :::image type=\"content\" source=\"./media/codespaces-tutorial/codespaces-fastapi-openapi-interface-small.png\" alt-text=\"Screenshot showing the FastAPI Swagger UI.\" lightbox=\"./media/codespaces-tutorial/codespaces-fastapi-openapi-interface.png\":::\n\n1. On the Swagger page, run the POST method to add a restaurant.\n\n    1. Expand the **POST** method.\n\n    1. Select **Try it out**.\n\n    1. Fill in the request body.\n\n        ```json\n        {\n          \"name\": \"Restaurant 1\",\n          \"address\": \"Restaurant 1 address\"\n        }\n        ```\n\n    1. Select **Execute** to commit the change\n\n## Connect to the database and view the data\n\n1. Go back to the GitHub Codespace for the project, select the SQLTools extension, and then select **Local database** to connect.\n\n    The SQLTools extension should be installed when the container is created. If the SQLTools extension doesn't appear in the Activity Bar, close the codespace and reopen.\n\n1. Expand the **Local database** node until you find the *restaurants* table, right select **Show Table Records**.\n\n    You should see the restaurant you added.\n\n    :::image type=\"content\" source=\"./media/codespaces-tutorial/codespaces-show-table-records-small.png\" alt-text=\"Screenshot showing how touUse SQLTools extension in Visual Studio Code to connect to Postgres local database and show table records.\" lightbox=\"./media/codespaces-tutorial/codespaces-show-table-records.png\":::\n\n## Clean up\n\nTo stop using the codespace, close the browser. (Or, close VS Code if you opened it that way.)\n\nIf you plan on using the codespace again, you can keep it. Only running codespaces incur CPU charges. A stopped codespace incurs only storage costs.\n\nIf you want to remove the codespace, go to https://github.com/codespaces to manage your codespaces.\n\n## Next steps\n\n* [Develop a Python web app][9]\n* [Develop a container app][10]\n* [Learn to use the Azure libraries for Python][11]\n\n[0]: https://github.com/Azure-Samples/msdocs-fastapi-postgres-codespace\n[1]: https://docs.github.com/codespaces\n[2]: https://code.visualstudio.com/docs/devcontainers/containers\n[3]: https://www.docker.com/products/docker-desktop/\n[4]: https://docs.github.com/codespaces/developing-in-codespaces/creating-a-codespace-for-a-repository\n[5]: https://marketplace.visualstudio.com/items?itemName=GitHub.codespaces\n[6]: https://code.visualstudio.com/docs/remote/codespaces\n[7]: https://docs.github.com/en/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces\n[8]: https://docs.github.com/en/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/setting-up-your-python-project-for-codespaces\n[9]: /azure/app-service/quickstart-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/breadcrumb/toc.json\n[10]: ./containers-in-azure-overview-python.md\n[11]: ./sdk/azure-sdk-overview.md\n[12]: https://swagger.io/tools/swagger-ui/\n"
  },
  {
    "path": "articles/python/configure-python-web-app-local-environment.md",
    "content": "---\ntitle: \"Configure your local environment for developing and deploying Python web apps to Azure using popular frameworks like Django, Flask, and FastAPI\"\ndescription: Configure your local Python environment for working with Python web apps and deploying them to Azure using popular framework like Django, Flask, and FastAPI.\nms.topic: how-to\nms.date: 02/28/2026\nms.custom: devx-track-python, devx-track-azurecli\nadobe-target: true\n---\n\n# Configure your local environment for deploying Python web apps on Azure\n\nThis article shows you how to set up your local environment to develop Python *web apps* and deploy them to Azure. Your web app can be pure Python or use one of the common Python-based web frameworks like [Django](https://www.djangoproject.com/), [Flask](https://flask.palletsprojects.com/en/2.1.x/), or [FastAPI](https://fastapi.tiangolo.com/).\n\nYou can deploy Python web apps developed locally to services such as [Azure App Service](/azure/app-service/), [Azure Container Apps](/azure/container-apps/), or [Azure Static Web Apps](/azure/static-web-apps/). There are many options for deployment. For example, for App Service deployment, you can choose to deploy from code, a Docker container, or a Static Web App. If you deploy from code, you can deploy by using Visual Studio Code, the Azure CLI, a local Git repository, or GitHub actions. If you deploy in a Docker Container, you can do so from Azure Container Registry, Docker Hub, or any private registry.\n\nBefore continuing with this article, review the [Set up your dev environment](configure-local-development-environment.md) for guidance on setting up your dev environment for Python and Azure. The following sections discuss setup and configuration specific to Python web app development.\n\nAfter you set up your local environment for Python web app development, you're ready to tackle these articles:\n\n* [Quickstart: Create a Python (Django or Flask) web app in Azure App Service](/azure/app-service/quickstart-python).\n* [Tutorial: Deploy a Python (Django or Flask) web app with PostgreSQL in Azure](/azure/app-service/tutorial-python-postgresql-app)\n* [Create and deploy a Flask web app to Azure with a system-assigned managed identity](./tutorial-python-managed-identity-cli.md)\n\n## Working with Visual Studio Code\n\nThe [Visual Studio Code](https://code.visualstudio.com/) integrated development environment (IDE) is an easy way to develop Python web apps and work with Azure resources that web apps use.\n\n> [!TIP]\n> Make sure you install the [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) extension. For an overview of working with Python in VS Code, see [Getting Started with Python in VS Code](https://code.visualstudio.com/docs/python/python-tutorial).\n\nIn VS Code, you work with Azure resources through [VS Code extensions](https://code.visualstudio.com/docs/editor/extension-marketplace). You can install extensions from the **Extensions** view or by using the key combination Ctrl+Shift+X. For Python web apps, you're likely to work with one or more of the following extensions:\n \n* The [Azure App Service](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice) extension enables you to interact with Azure App Service from within Visual Studio Code. App Service provides fully managed hosting for web applications including websites and web APIs.\n\n* The [Azure Static Web Apps](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureresourcegroups) extension enables you to create Azure Static Web Apps directly from VS Code. Static Web Apps is serverless and a good choice for static content hosting.\n\n* If you plan on working with containers, install:\n\n  * The [Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker) extension to build and work with containers locally. For example, you can run a containerized Python web app on Azure App Service by using [Web Apps for Containers](https://azure.microsoft.com/services/app-service/containers/).\n  \n  * The [Azure Container Apps](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurecontainerapps) extension to create and deploy containerized apps directly from Visual Studio Code.\n\n* Other extensions include the [Azure Storage](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurestorage), [Azure Databases](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-cosmosdb), and [Azure Resources](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureresourcegroups) extensions. You can always add these and other extensions as needed.\n\nExtensions in Visual Studio Code are accessible as you expect in a typical IDE interface. You can use rich keyword support by using the [VS Code command palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette). To access the command palette, use the key combination Ctrl+Shift+P. The command palette is a good way to see all the possible actions you can take on an Azure resource. The following screenshot shows some of the actions for App Service.\n\n:::image type=\"content\" source=\"./media/configure-local-development-environment/visual-studio-command-palette-small.png\" alt-text=\"A screenshot of the Visual Studio Code command palette for App Service.\" lightbox=\"./media/configure-local-development-environment/visual-studio-command-palette.png\":::\n\n### Working with Dev Containers in Visual Studio Code\n\nPython developers often rely on virtual environments to create an isolated and self-contained environment for a specific project. Virtual environments allow developers to manage dependencies, packages, and Python versions separately for each project, avoiding conflicts between different projects that might require different package versions.\n\nWhile there are popular options available in Python for managing environments like `virtualenv` or `venv`, the [*Visual Studio Code Dev Container*](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) \nextension (based on the [open Dev Container specification](https://containers.dev)) lets you use a [Docker container](https://docker.com/) as a full-featured containerized environment. It enables developers to define a consistent and easily reproducible toolchain with all the necessary tools, dependencies, and extensions pre-configured. This means if you have system requirements, shell configurations, or use other languages entirely, you can use a Dev Container to explicitly configure all of those parts of your project that might live outside of a basic Python environment.\n\nFor example, a developer can configure a single Dev Container to include everything needed to work on a project, including a PostgreSQL database server along with the project database and sample data, a Redis server, Nginx, front-end code, client libraries like React, and so on. In addition, the container would contain the project code, the Python runtime, and all the Python project dependencies with the correct versions. Finally, the container can specify Visual Studio Code extensions to be installed so the entire team has the same tooling available. So when a new developer joins the team, the whole environment, including tooling, dependencies, and data, is ready to be cloned to their local machine, and they can begin working immediately.\n\nSee [Developing inside a Container](https://code.visualstudio.com/docs/devcontainers/containers).\n\n\n## Working with Visual Studio 2022\n\n[Visual Studio 2022](https://visualstudio.microsoft.com/vs/) is a full-featured integrated development environment (IDE) with support for Python application development and many built-in tools and extensions to access and deploy to Azure resources. While most documentation for building Python web apps on Azure focuses\non using Visual Studio Code, Visual Studio 2022 is a great option if you already\nhave it installed, you're comfortable with using it, and you're using it for .NET or \nC++ projects.\n\n* In general, see [Visual Studio | Python documentation](/visualstudio/python/) for all documentation related to using Python on Visual Studio 2022.\n\n* For setup steps, see [Install Python support in Visual Studio](/visualstudio/python/installing-python-support-in-visual-studio) which walks you through the steps of installing the Python workload into Visual Studio 2022.\n\n* For general workflow of using Python for web development, see [Quickstart: Create your first Python web app using Visual Studio](/visualstudio/ide/quickstart-python). This article is useful for understanding how to build a Python web application\nfrom scratch (but doesn't include deployment to Azure).\n\n* For using Visual Studio 2022 to manage Azure resources and deploy to Azure, \nsee [Azure Development with Visual Studio](/visualstudio/azure/). While much of the documentation here specifically mentions \n.NET, the tooling for managing Azure resources and deploying to Azure works the \nsame regardless of the programming language.\n\n* When there's no built-in tool available in Visual Studio 2022 for a given \nAzure management or deployment task, you can always use [Azure CLI commands](#azure-cli-commands).\n\n## Working with other IDEs\n\nIf you're working in another IDE that doesn't have explicit support for Azure, use the Azure CLI to manage Azure resources. In the following screenshot, a simple Flask web app is open in the [PyCharm](https://www.jetbrains.com/pycharm/) IDE. You can deploy the web app to an Azure App Service by using the `az webapp up` command. In the screenshot, the CLI command runs within the PyCharm embedded terminal emulator. If your IDE doesn't have an embedded emulator, you can use any terminal and the same command. The Azure CLI must be installed on your computer and be accessible in either case.\n\n:::image type=\"content\" source=\"./media/configure-local-development-environment/pycharm-ide-create-web-app-example-small.png\" alt-text=\"A screenshot of the PyCharm IDE with an Azure CLI command deploying a web app.\" lightbox=\"./media/configure-local-development-environment/pycharm-ide-create-web-app-example.png\":::\n\n## Azure CLI commands\n\nWhen you work locally with web apps by using the [Azure CLI](/cli/azure/) commands, you typically use the following commands:  \n\n|Command   |Description|\n|----------|-----------|\n|[az webapp](/cli/azure/webapp) | Manages web apps. Includes the subcommands [create](/cli/azure/webapp#az-webapp-create) and [up](/cli/azure/webapp#az-webapp-up) to create a web app or to create and deploy from a local workspace, respectively. |\n|[az container app](/cli/azure/containerapp) | Manages Azure Container Apps. |\n|[az staticwebapp](/cli/azure/staticwebapp) | Manages Azure Static Web Apps. |\n|[az group](/cli/azure/group)  | Manages resource groups and template deployments. Use the subcommand [create](/cli/azure/group#az-group-create) to make a resource group to put your Azure resources in.|\n|[az appservice](/cli/azure/appservice) | Manages App Service plans.  |\n|[az config](/cli/azure/reference-index#az-config) | Manages Azure CLI configuration. To save keystrokes, you can define a default location or resource group that other commands use automatically.|\n\nHere's an example Azure CLI command to create a web app and associated resources, and deploy it to Azure in one command by using [az webapp up](/cli/azure/webapp#az-webapp-up). Run the command in the root directory of your web app.\n\n#### [bash](#tab/terminal-bash)\n\n```azurecli\naz webapp up \\\n    --runtime PYTHON:3.9 \\\n    --sku B1 \\\n    --logs\n```\n\n#### [PowerShell terminal](#tab/terminal-powershell)\n\n```azurecli\naz webapp up `\n    --runtime PYTHON:3.9 `\n    --sku B1 `\n    --logs\n```\n\n---\n\nFor more information about this example, see [Quickstart: Deploy a Python (Django or Flask) web app to Azure App Service](/azure/app-service/quickstart-python?tabs=azure-cli).\n\nKeep in mind that for some of your Azure workflow, you can also use the Azure CLI from an [Azure Cloud Shell](/azure/cloud-shell/overview). Azure Cloud Shell is an interactive, authenticated, browser-accessible shell for managing Azure resources. \n\n## Azure SDK key packages\n\nIn your Python web apps, you can refer programmatically to Azure services by using the [Azure SDK for Python](/python/api/overview/azure/). The section [Use the Azure libraries (SDK) for Python](https://azure.github.io/azure-sdk-for-python/) discusses this SDK extensively. In this section, you learn about some key packages of the SDK that you use in web development. You also see an example that follows best practices for authenticating your code with Azure resources.\n\nThe following table lists some of the packages commonly used in web app development. You can install packages in your virtual environment directly by using `pip`. Or, put the Python package index (PyPI) name in your *requirements.txt* file.\n\n|SDK docs   |Install | Python package index |\n|---------------------|--------|----------------------|\n|[Azure Identity](/python/api/overview/azure/identity-readme) | `pip install azure-identity`| [azure-identity](https://pypi.org/project/azure-identity/) |\n|[Azure Storage Blobs](/python/api/overview/azure/storage-blob-readme) | `pip install azure-storage-blob`| [azure-storage-blob](https://pypi.org/project/azure-storage-blob/) |\n|[Azure Cosmos DB](/python/api/overview/azure/cosmos-readme) | `pip install azure-cosmos`| [azure-cosmos](https://pypi.org/project/azure-cosmos/) |\n|[Azure Key Vault Secrets](/python/api/overview/azure/keyvault-secrets-readme) | `pip install azure-keyvault-secrets`| [azure-keyvault-secrets](https://pypi.org/project/azure-keyvault-secrets/) |\n\nThe [azure-identity](https://pypi.org/project/azure-identity/) package allows your web app to authenticate with Microsoft Entra ID. For authentication in your web app code, use the [DefaultAzureCredential](/python/api/azure-identity/azure.identity.defaultazurecredential) in the `azure-identity` package. The following example shows how to access Azure Storage. The pattern is similar for other Azure resources.\n\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom azure.storage.blob import BlobServiceClient\n\nazure_credential = DefaultAzureCredential()\nblob_service_client = BlobServiceClient(\n    account_url=account_url,\n    credential=azure_credential)\n```\n\nThe `DefaultAzureCredential` looks in predefined locations for account information, such as environment variables or the Azure CLI sign-in. For in-depth information on the `DefaultAzureCredential` logic, see [Authenticate Python apps to Azure services by using the Azure SDK for Python](sdk/authentication-overview.md).\n\n## Python-based web frameworks\n\nIn Python web app development, you often work with Python-based web frameworks. These frameworks provide functionality, such as page templates, session management, database access, and easy access to HTTP request and response objects. Frameworks enable you to avoid reinventing the wheel for common functionality.\n\nThree common Python web frameworks are [Django](https://www.djangoproject.com/), [Flask](https://flask.palletsprojects.com/en/2.1.x/), and [FastAPI](https://fastapi.tiangolo.com/). You can use these and other web frameworks with Azure.\n\nThe following example shows how you might get started quickly with these frameworks locally. When you run these commands, you end up with an application, albeit a simple one that you could deploy to Azure. Run these commands inside a [virtual environment](./configure-local-development-environment.md#configure-python-virtual-environment).\n\n**Step 1:**  Download the frameworks by using [pip](https://pip.pypa.io/en/stable/cli/pip_install/).\n### [Django](#tab/django)\n\n```\npip install Django\n```\n\n### [Flask](#tab/flask)\n\n```\npip install Flask\n```\n\n### [FastAPI](#tab/fastapi)\n\n```\npip install fastapi\npip install \"uvicorn[standard]\"\n```\n\n---\n\n**Step 2:** Create a hello world app.\n\n### [Django](#tab/django)\n\nCreate a sample project by using the [django-admin startproject](https://docs.djangoproject.com/en/4.0/ref/django-admin/#startapp) command. The project includes a *manage.py* file that serves as the entry point for running the app.\n\n```\ndjango-admin startproject hello_world\n```\n\n### [Flask](#tab/flask)\n\nCreate a file named *app.py* with the following code.\n\n```python\nfrom flask import Flask\n\napp = Flask(__name__)\n\n@app.route(\"/\")\ndef hello_world():\n    return \"<p>Hello, World!</p>\"\n```\n\n### [FastAPI](#tab/fastapi)\n\nCreate a file named *main.py* with the following code.\n\n```python\nfrom typing import Union\n\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n@app.get(\"/\")\ndef read_root():\n    return {\"Hello\": \"World\"}\n\n@app.get(\"/items/{item_id}\")\ndef read_item(item_id: int, q: Union[str, None] = None):\n    return {\"item_id\": item_id, \"q\": q}\n```\n\n---\n\n**Step 3:** Run the code locally.\n\n### [Django](#tab/django)\n\nDjango uses WSGI to run the app.\n\n```\npython hello_world\\manage.py runserver\n```\n\n### [Flask](#tab/flask)\n\nFlask comes with a dev server to run the app.\n\n```\nflask run\n```\n\n### [FastAPI](#tab/fastapi)\n\nUse the installed ASGI server.\n\n```\nuvicorn main:app --reload\n```\n---\n\n---\n\n**Step 4:** Browse the hello world app.\n\n### [Django](#tab/django)\n\n```\nhttp://127.0.0.1:8000/\n```\n### [Flask](#tab/flask)\n\n\n```\nhttp://127.0.0.1:5000/\n```\n\n### [FastAPI](#tab/fastapi)\n\n```\nhttp://127.0.0.1:8000/\n```\n\n---\n\n\nAt this point, add a *requirements.txt* file. Then, deploy the web app to Azure or containerize it by using Docker and deploy it. \n\n## Next steps\n\n* [Quickstart: Create a Python (Django or Flask) web app in Azure App Service](/azure/app-service/quickstart-python).\n* [Tutorial: Deploy a Python (Django or Flask) web app with PostgreSQL in Azure](/azure/app-service/tutorial-python-postgresql-app)\n* [Create and deploy a Flask web app to Azure with a system-assigned managed identity](./tutorial-python-managed-identity-cli.md)\n"
  },
  {
    "path": "articles/python/configure-python-web-app-on-app-service.md",
    "content": "---\ntitle: \"Configure a custom startup file for Python apps on Azure App Service on Linux\"\ndescription: Discusses how to start a Python web app running on App Service, including specific instructions for Django, Flask, and other frameworks.\nms.topic: how-to\nms.date: 04/21/2025\nms.custom: devx-track-python, linux-related-content\n---\n\n# Configure a custom startup file for Python apps on Azure App Service\n\nIn this article, you learn when and how to configure a custom startup file for a Python web app hosted on Azure App Service. While a startup file isn't required for local development, Azure App Service runs your deployed web app within a Docker container that can utilize startup commands if provided.\n\nYou need a custom startup file in the following situations:\n\n* **Custom Gunicorn Arguments**: You want to start the [Gunicorn](https://gunicorn.org/) default web server with extra arguments beyond its defaults, which are `--bind=0.0.0.0 --timeout 600`.\n\n* **Alternative Frameworks or Servers**: Your app is built with a framework other than Flask or Django, or you want to use a different web server besides Gunicorn.\n\n* **Non-Standard Flask Application Structure**: You have a Flask app whose main code file is named something **other** than *app.py* or *application.py**, or the app object is named something **other** than `app`.\n\nIn other words, a custom startup command is required unless your project has an *app.py* or *application.py* file in the root folder with a Flask app object named `app`.\n\nFor more information, see [Configure Python Apps - Container startup process](/azure/app-service/configure-language-python#container-startup-process).\n\n## Create a startup file\n\nWhen you need a custom startup file, use the following steps:\n\n1. Create a file in your project named *startup.txt*, *startup.sh*, or another name of your choice that contains your startup commands. See the later sections in this article for specifics on Django, Flask, and other frameworks.\n\n    A startup file can include multiple commands if needed.\n\n1. Commit the file to your code repository so it can be deployed with the rest of the app.\n\n1. In Visual Studio Code, select the Azure icon in the Activity Bar, expand **RESOURCES**,  find and expand your subscription, expand **App Services**, and right-click the App Service, and select **Open in Portal**.\n\n1. In the [Azure portal](https://portal.azure.com/), from the service menu on the left, choose **Settings** > **Configuration**. On the **Configuration** page for the App Service, select **General settings**, enter the name of your startup file (like *startup.txt* or *startup.sh*) under **Stack settings** > **Startup Command**, then select **Save**.\n\n    > [!NOTE]\n    > Instead of using a startup command file, you can put the startup command itself directly in the **Startup Command** field on the Azure portal. Using a startup command file is recommended because it stores your configuration in your repository. This enables version control to track changes and simplifies redeployment to other Azure App Service instances.\n\n1. Select **Continue** when prompted to restart the App Service.\n\n    If you access your Azure App Service site before deploying your application code, an \"Application Error\" appears because no code is available to process the request.\n\n## Django startup commands\n\nBy default, Azure App Service locates the folder containing your wsgi.py file and starts Gunicorn with the following command:\n\n```sh\n# <module> is the folder that contains wsgi.py. If you need to use a subfolder,\n# specify the parent of <module> using --chdir.\ngunicorn --bind=0.0.0.0 --timeout 600 <module>.wsgi\n```\n\nIf you want to modify any Gunicorn arguments, such as increasing the timeout value to 1,200 seconds(`--timeout 1200`), create a custom startup command file. This allows you to override the default settings with your specific requirements. For more information, see [Container startup process - Django app](/azure/app-service/configure-language-python#django-app).\n\n## Flask startup commands\n\nBy default, App Service on Linux assumes that your Flask application meets the following critear:\n\n* The WSGI callable is named `app`.\n* The application code is contained in a file named *application.py* or *app.py*.\n* The application file is located in the app's root folder.\n\nIf your project differs from this structure, then your custom startup command must identify the app object's location in the format *file:app_object*:\n\n* **Different file name and/or app object name**: If the app's main code file is *hello.py* and the app object is named `myapp`, the startup command is as follows:\n\n    ```text\n    gunicorn --bind=0.0.0.0 --timeout 600 hello:myapp\n    ```\n\n* **Startup file is in a subfolder**: If the startup file is *myapp/website.py* and the app object is `app`, then use Gunicorn's `--chdir` argument to specify the folder and then name the startup file and app object as usual:\n\n    ```text\n    gunicorn --bind=0.0.0.0 --timeout 600 --chdir myapp website:app\n    ```\n\n* **Startup file is within a module**: In the [python-sample-vscode-flask-tutorial](https://github.com/Microsoft/python-sample-vscode-flask-tutorial) code, the *webapp.py* startup file is contained within the folder *hello_app*, which is itself a module with an *\\_\\_init\\_\\_.py* file. The app object is named `app` and is defined in *\\_\\_init\\_\\_.py* and *webapp.py* uses a relative import.\n\n    Because of this arrangement, pointing Gunicorn to `webapp:app` produces the error, \"Attempted relative import in non-package,\" and the app fails to start.\n\n    In this situation, create a shim file that imports the app object from the module, and then have Gunicorn launch the app using the shim. The [python-sample-vscode-flask-tutorial](https://github.com/Microsoft/python-sample-vscode-flask-tutorial) code, for example, contains *startup.py* with the following contents:\n\n    :::code language=\"python\" source=\"~/../python-sample-vscode-flask-tutorial/startup.py\" range=\"12\":::\n\n    The startup command is then:\n\n    :::code language=\"txt\" source=\"~/../python-sample-vscode-flask-tutorial/startup.txt\" :::\n\nFor more information, see [Container startup process - Flask app](/azure/app-service/configure-language-python#flask-app).\n\n## Other frameworks and web servers\n\nThe App Service container that runs Python apps has Django and Flask installed by default, along with the Gunicorn web server.\n\nTo use a framework other than Django or Flask (such as [Falcon](https://falconframework.org/), [FastAPI](https://fastapi.tiangolo.com/), etc.), or to use a different web server:\n\n- Include the framework and/or web server in your *requirements.txt* file.\n\n- In your startup command, identify the WSGI callable as described in the [previous section for Flask](#flask-startup-commands).\n\n- To launch a web server other than Gunicorn, use a `python -m` command instead of invoking the server directly. For example, the following command starts the [uvicorn](https://www.uvicorn.org/) server, assuming that the WSGI callable is named `app` and is found in *application.py*:\n\n    ```sh\n    python -m uvicorn application:app --host 0.0.0.0\n    ```\n\n    You use `python -m` because web servers installed via *requirements.txt* aren't added to the Python global environment and therefore can't be invoked directly. The `python -m` command invokes the server from within the current virtual environment.\n"
  },
  {
    "path": "articles/python/containers-in-azure-overview-python.md",
    "content": "---\ntitle: Overview of Python Container Apps in Azure\ndescription: How to get started with Python container apps in Azure using VS Code, PyCharm, and the Azure and Docker CLI.\nms.topic: concept-article\nms.date: 04/21/2025\nms.custom:\n  - devx-track-python\n  - py-fresh-zinc\n  - sfi-image-nochange\n  - sfi-ropc-nochange\n---\n\n# Overview of Python Container Apps in Azure\n\nThis article explains how to take a Python project—such as a web application—and deploy it as a Docker container in Azure. It covers the general containerization workflow, Azure deployment options for containers, and Python-specific container configurations within Azure. Building and deploying Docker containers in Azure follows a standard process across languages, with Python-specific configurations in the Dockerfile, requirements.txt, and settings for web frameworks like [Django][35], [Flask][36], and [FastAPI][37].\n\n## Container workflow scenarios\n\nFor Python container development, some typical workflows for moving from code to container are discussed in the following table.\n\n|Scenario|Description|Workflow|\n|--------|-----------|-----|\n|**Dev**|Build Python Docker images locally in your development environment.|**Code**: Clone your app code locally using Git (with Docker installed). <br><br> **Build**: Use Docker CLI, VS Code (with extensions), PyCharm (with Docker plugin). Described in section [Working with Python Docker images and containers](#working-with-python-docker-images-and-containers). <br><br> **Test**: Run and test the container locally. <br><br> **Push**: Push the image to a container registry like Azure Container Registry, Docker Hub, or private registry. <br><br> **Deploy**: Deploy the container from the registry to an Azure service.|\n|**Hybrid**|Build Docker images in Azure, but initiate the process from your local environment.|**Code**: Clone the code locally (not necessary for Docker to be installed).<br><br> **Build**: To trigger builds in Azure, use VS Code (with remote extensions) or the Azure CLI. <br><br> **Push**: Push the built image to Azure Container Registry. <br><br> **Deploy**: Deploy the container from the registry to an Azure service.|\n|**Azure**|Use Azure Cloud Shell to build and deploy containers entirely in the cloud.| **Code**: Clone the GitHub repo in Azure Cloud Shell.<br><br>**Build**: Use Azure CLI or Docker CLI in Cloud Shell.<br><br>**Push**: Push the image to a registry like Azure Container Registry, Docker Hub, or private registry.<br><br>**Deploy**: Deploy the container from the registry to an Azure service.|\n\nThe end goal of these workflows is to have a container running in one of the Azure resources supporting Docker containers as listed in the next section.\n\nA dev environment can be:\n\n* Your local workstation with Visual Studio Code or PyCharm\n* [Codespaces][1] (a development environment hosted in the cloud)\n* [Visual Studio Dev Containers][2] (a container as a development environment)\n\n## Deployment container options in Azure\n\nPython container apps are supported in the following services.\n\n| Service | Description |\n|---------|-------------|\n|[Web App for Containers][3]| Azure App Service is a fully managed hosting platform for containerized web applications, including websites and web APIs. It supports scalable deployments and integrates seamlessly with CI/CD workflows using Docker Hub, Azure Container Registry, and GitHub. This service is ideal for developers who want a simple and efficient path to deploy containerized apps, while also benefiting from the full capabilities of the Azure App Service platform. By packaging your application and all its dependencies into a single deployable container, you gain both portability and ease of management—without needing to manage infrastructure. </br></br>Example: [Deploy a Flask or FastPI web app on Azure App Service][4]. |\n|[Azure Container Apps (ACA)][5] | Azure Container Apps (ACA) is a fully managed serverless container service powered by Kubernetes and open-source technologies like [Dapr](https://dapr.io/), [KEDA](https://keda.sh/), and [envoy](https://www.envoyproxy.io/). Its design incorporates industry best practices and is optimized for executing general-purpose containers. ACA abstracts away the complexity of managing a Kubernetes infrastructure—direct access to the Kubernetes API isn't required or supported. Instead, it offers higher-level application constructs such as revisions, scaling, certificates, and environments to simplify development and deployment workflows. This service is ideal for development teams looking to build and deploy containerized microservices with minimal operational overhead, allowing them to focus on application logic instead of infrastructure management.</br></br>Example: [Deploy a Flask or FastPI web app on Azure Container Apps][52]. |\n|[Azure Container Instances (ACI)][6] | Azure Container Instances (ACI) is a serverless offering that provides a single pod of Hyper-V isolated containers on demand. Billing is based on actual resource consumption rather than pre-allocated infrastructure, making it well-suited for short-lived or burstable workloads. Unlike other container services, ACI doesn't include built-in support for concepts like scaling, load balancing, or TLS certificates. Instead, it typically functions as a foundational container building block, often integrated with Azure services like Azure Kubernetes Service (AKS) for orchestration. ACI excels as a lightweight choice when the higher-level abstractions and features of Azure Container Apps aren't needed </br></br> Example: [Create a container image for deployment to Azure Container Instances][7]. (The tutorial isn't Python-specific, but the concepts shown apply to all languages.) |\n|[Azure Kubernetes Service (AKS)][8] | Azure Kubernetes Service (AKS) is a fully managed Kubernetes option in Azure that gives you complete control over your Kubernetes environment. It supports direct access to the Kubernetes API and can run any standard Kubernetes workload. The full cluster resides in your subscription, with the cluster configurations and operations within your control and responsibility. ACI is ideal for teams seeking a fully managed container solution, while AKS gives you full control over the Kubernetes cluster, requiring you to manage configurations, networking, scaling, and operations. Azure handles the control plane and infrastructure provisioning, but the day-to-day operation and security of the cluster are within your team's control. This service is ideal for teams that want the flexibility and power of Kubernetes with the added benefit of Azure’s managed infrastructure, while still maintaining full ownership over the cluster environment. </br></br>Example: [Deploy an Azure Kubernetes Service cluster using the Azure CLI][9].|\n| [Azure Functions][10] | Azure Functions offers an event-driven, serverless Functions-as-a-Service (FaaS) platform that lets you run small pieces of code (functions) in response to events—without managing infrastructure. Azure Functions shares many characteristics with Azure Container Apps around scale and integration with events, but is optimized for short-lived functions deployed as either code or containers. al for teams looking to trigger the execution of functions on events; for example, to bind to other data sources. Like Azure Container Apps, Azure Functions supports automatic scaling and integration with event sources (for example, HTTP requests, message queues, or blob storage updates). This service is ideal for teams building lightweight, event-triggered workflows, such as processing file uploads or responding to database changes, in Python or other languages. </br></br>Example: [Create a function on Linux using a custom container][11].|\n\nFor a more detailed comparison of these services, see [Comparing Container Apps with other Azure container options][12].\n\n## Virtual environments and containers\n\nVirtual environments in Python isolate project dependencies from system-level Python installations, ensuring consistency across development environments. A virtual environment includes its own isolated Python interpreter, along with the libraries and scripts needed to run the specific project code within that environment. Dependencies for Python projects are managed through the *requirements.txt* file. By specifying dependencies in a *requirements.txt* file, developers can reproduce the exact environment needed for their project. This approach facilitates smoother transitions to containerized deployments like Azure App Service, where environment consistency is essential for reliable application performance.\n\n> [!TIP]\n> In containerized Python projects, virtual environments are typically unnecessary because Docker containers provide isolated environments with their own Python interpreter and dependencies. However, you might use virtual environments for local development or testing. To keep Docker images lean, exclude virtual environments using a *.dockerignore* file, which prevents copying unnecessary files into the image.\n\nYou can think of Docker containers as offering capabilities similar to Python virtual environments—but with broader advantages in reproducibility, isolation, and portability. Unlike virtual environments, Docker containers can run consistently across different operating systems and environments, as long as a container runtime is available.\n\nA Docker container includes your Python project code along with everything it needs to run, such as dependencies, environment settings, and system libraries. To create a container, you first build a Docker image from your project code and configuration, and then start a container, which is a runnable instance of that image.\n\nFor containerizing Python projects, the key files are described in the following table:\n\n| Project file | Description |\n|--------------| ----------- |\n|*requirements.txt* | This file contains the definitive list of Python dependencies needed for your application. Docker uses this list during the image build process to install all required packages. This ensures consistency between development and deployment environments.|\n|*Dockerfile* | This file contains instructions for building your Python Docker image, including the base image selection, dependency installation, code copying, and container startup commands. It defines the complete execution environment for your application. For more information, see the section [Dockerfile instructions for Python](#python-dockerfile).|\n|*\\.dockerignore* | This file specifies the files and directories that should be excluded when copying content to the Docker image with the `COPY` command in the Dockerfile. This file uses patterns similar to .gitignore for defining exclusions. The *\\.dockerignore* file supports exclusion patterns similar to *\\.gitignore* files. For more information, see [\\.dockerignore file][40]. <br><br> Excluding files helps image build performance, but should also be used to avoid adding sensitive information to the image where it can be inspected. For example, the *\\.dockerignore* should contain lines to ignore *\\.env* and *\\.venv* (virtual environments).|\n\n## Container settings for web frameworks\n\nWeb frameworks typically bind to default ports (such as 5000 for Flask, 8000 for FastAPI). When you are deploying containers to Azure services, such as Azure Container Instances, Azure Kubernetes Service (AKS), or App Service for Containers, it's crucial that you explicitly expose and configure the container's listening port to ensure proper routing of inbound traffic. Configuring the correct port ensures that Azure’s infrastructure can direct requests to the correct endpoint inside your container.\n\n| Web framework  | Port |\n| -------------- | ---- |\n| [Django][35] | 8000 |\n| [Flask][36] | 5000 or 5002 |\n| [FastAPI][37] ([uvicorn][13]) | 8000 or 80 |\n\nThe following table shows how to set the port for different Azure container solutions.\n\n| Azure container solution | How to set web app port |\n| ------------------------ | ----------------------- |\n| Web App for Containers | By default, App Service assumes your custom container is listening on either port 80 or port 8080. If your container listens to a different port, set the `WEBSITES_PORT` app setting in your App Service app. For more information, see [Configure a custom container for Azure App Service][14]. |\n| Azure Containers Apps | Azure Container Apps lets you expose your container app to the public web, to your virtual network, or to other container apps within the same environment by enabling ingress. Set the ingress `targetPort` to the port your container listens to for incoming requests. Application ingress endpoint is always exposed on port 443. For more information, see [Set up HTTPS or TCP ingress in Azure Container Apps][15]. |\n| Azure Container Instances, Azure Kubernetes | You define the port on which your app is listening during container or pod creation. Your container image should include a web framework, an application server (for example, gunicorn, uvicorn), and optionally a web server (for example, nginx). In more complex scenarios, you might split responsibilities across two containers—one for the application server and another for the web server. In that case, the web server container typically exposes ports 80 or 443 for external traffic. |\n\n## Python Dockerfile\n\nA Dockerfile is a text file that contains instructions for building a Docker image for a Python application. The first instruction typically specifies the base image to start from. Subsequent instructions then detail actions such as installing necessary software, copying application files, and configuring the environment to create a runnable image. \nThe following table provides Python-specific examples for commonly used Dockerfile instructions.\n\n| Instruction | Purpose | Example |\n| ----------- | ------- | ------- |\n| [FROM][16] | Sets the base image for subsequent instructions. | `FROM python:3.9-slim` |\n| [EXPOSE][17] | Tells Docker that the container listens to a specified port at runtime. | `EXPOSE 5000` |\n| [COPY][38] | Copies files or directories from the specified source and adds them to the filesystem of the container at the specified destination path. | `COPY . /app` |\n| [RUN][18] | Runs a command inside the Docker image. For example, pull in dependencies. The command runs once at build time. | `RUN python -m pip install -r requirements.txt`|\n| [CMD][19] | The command provides the default for executing a container. There can only be one CMD instruction. | `CMD [\"gunicorn\", \"--bind\", \"0.0.0.0:5000\", \"wsgi:app\"]` |\n\nThe Docker build command builds Docker images from a Dockerfile and a context. A build’s context is the set of files located in the specified path or URL. Typically, you build an image from the root of your Python project and the path for the build command is \".\" as shown in the following example.\n\n```bash\ndocker build --rm --pull  --file \"Dockerfile\"  --tag \"mywebapp:latest\"  .\n```\n\nThe build process can refer to any of the files in the context. For example, your build can use a COPY instruction to reference a file in the context. Here's an example of a Dockerfile for a Python project using the [Flask][36] framework:\n\n```Dockerfile\nFROM python:3.9-slim\n\nEXPOSE 5000\n\n# Keeps Python from generating .pyc files in the container.\nENV PYTHONDONTWRITEBYTECODE=1\n\n# Turns off buffering for easier container logging\nENV PYTHONUNBUFFERED=1\n\n# Install pip requirements.\nCOPY requirements.txt .\nRUN python -m pip install -r requirements.txt\n\nWORKDIR /app\nCOPY . /app\n\n# Creates a non-root user with an explicit UID and adds permission to access the /app folder.\nRUN adduser -u 5678 --disabled-password --gecos \"\" appuser && chown -R appuser /app\nUSER appuser\n\n# Provides defaults for an executing container; can be overridden with Docker CLI.\nCMD [\"gunicorn\", \"--bind\", \"0.0.0.0:5000\", \"wsgi:app\"]\n```\n\nYou can create a Dockerfile by hand or create it automatically with VS Code and the Docker extension. For more information, see [Generating Docker files][20].\n\nThe Docker build command is part of the Docker CLI. When you use IDEs like VS Code or PyCharm, the UI commands for working with Docker images call the build command for you and automate specifying options.\n\n## Working with Python Docker images and containers\n\n### VS Code and PyCharm\n\nIntegrated development environments (IDEs) like Visual Studio Code (VS Code) and PyCharm streamline Python container development by integrating Docker tasks into your workflow. With extensions or plugins, these IDEs simplify building Docker images, running containers, and deploying to Azure services like App Service or Container Instances. Here are some of the things you can do with VS Code and PyCharm.\n\n* Download and build Docker images.\n  * Build images in your dev environment.\n  * Build Docker images in Azure without Docker installed in dev environment. (For PyCharm, use the Azure CLI to build images in Azure.)\n\n* Create and run Docker containers from an existing image, a pulled image, or directly from a Dockerfile.\n\n* Run multicontainer applications with Docker Compose.\n\n* Connect and work with container registries like Docker Hub, GitLab, JetBrains Space, Docker V2, and other self-hosted Docker registries.\n\n* (VS Code only) Add a Dockerfile and Docker compose files that are tailored for your Python project.\n\nTo set up VS Code and PyCharm to run Docker containers in your dev environment, use the following steps.\n\n#### [VS Code](#tab/vscode-ide)\n\nIf you haven't already, install [Azure Tools for VS Code][41].\n\n| Instructions    | Screenshot |\n|:----------------|-----------:|\n| **Step 1**: Use **SHIFT** + **ALT**  + **A** to open the **Azure** extension and confirm you're connected to Azure. <br><br> You can also select the **Azure** icon on the VS Code extensions bar. <br><br> If you aren't signed in, select **Sign in to Azure** and follow the prompts.<br><br> If you have trouble accessing your Azure subscription, it may be because you're behind a proxy. To resolve connection issues, see [Network Connections in Visual Studio Code][23]. | :::image type=\"content\" source=\"media/containers-overview/vs-code-azure-tools-signed-in-small.png\" alt-text=\"Screenshot showing how Azure Tools looks once signed in.\" lightbox=\"media/containers-overview/vs-code-azure-tools-signed-in.png\"::: :::image type=\"content\" source=\"media/containers-overview/vs-code-azure-tools-sign-in-small.png\" alt-text=\"Screenshot showing how Azure Tools looks if you aren't signed in.\" lightbox=\"media/containers-overview/vs-code-azure-tools-sign-in.png\":::|\n|**Step 2**: Use **CTRL** + **SHIFT**  + **X** to open **Extensions**, search for the [Docker extension][21], and install the extension.<br><br> You can also select the **Extensions** icon on the VS Code extensions bar.|:::image type=\"content\" source=\"media/containers-overview/vs-code-add-docker-extension-small.png\" alt-text=\"Screenshot showing how to add Docker extension to VS Code.\" lightbox=\"media/containers-overview/vs-code-add-docker-extension.png\":::|\n|**Step 3**: Select the **Docker** icon in the  extension bar, expand images, and right-click a Docker image run it as a container.|:::image type=\"content\" source=\"media/containers-overview/vs-code-docker-extension-run-image-small.png\" alt-text=\"Screenshot showing how to use the Docker extension in VS Code to run a container from a Docker image.\" lightbox=\"media/containers-overview/vs-code-docker-extension-run-image.png\":::\n|**Step 4**: Monitor the Docker run output in the **Terminal** window.|:::image type=\"content\" source=\"media/containers-overview/vs-code-running-container-example-small.png\" alt-text=\"Screenshot showing an example of running a container in VS Code.\" lightbox=\"media/containers-overview/vs-code-running-container-example.png\":::|\n\n#### [PyCharm](#tab/pycharm-ide)\n\n| Instructions    | Screenshot |\n|:----------------|-----------:|\n|**Step 1**: Use **CTRL** + **ALT**  + **S** to bring up the **Plugins** setting.<br><br>You can also go to **File** \\> **Settings** \\> **Plugins**.|:::image type=\"content\" source=\"media/containers-overview/pycharm-open-plugins-small.png\" alt-text=\"Screenshot showing how to open plugins in PyCharm.\" lightbox=\"media/containers-overview/pycharm-open-plugins.png\":::|\n|**Step 2**: Under **Marketplace**, search for the [Docker plugin][22], and add it.<br><br>If you're using Docker for Windows, enable connecting to Docker via the TCP protocol. For more information, see [Enable Docker support][39].|:::image type=\"content\" source=\"media/containers-overview/pycharm-plugin-add-small.png\" alt-text=\"Screenshot showing how to add plugins in PyCharm.\" lightbox=\"media/containers-overview/pycharm-plugin-add.png\":::|\n|**Step 3**: Under the **Services**, select **Docker**, expand images, right-click an image and select **Create Container** to start a container.|:::image type=\"content\" source=\"media/containers-overview/pycharm-plugin-start-container-small.png\" alt-text=\"Screenshot showing how to start container from Docker image in PyCharm.\" lightbox=\"media/containers-overview/pycharm-plugin-start-container.png\":::|\n|**Step 4**: Monitor the output in the **Log** window.|:::image type=\"content\" source=\"media/containers-overview/pycharm-running-container-example-small.png\" alt-text=\"Screenshot showing an example of running a container in PyCharm.\" lightbox=\"media/containers-overview/pycharm-running-container-example.png\":::|\n\n---\n\n### Azure CLI and Docker CLI\n\nYou can also work with Python Docker images and containers using the [Azure CLI][24] and [Docker CLI][25]. Both VS Code and PyCharm have terminals where you can run these CLIs.\n\nUse a CLI when you want finer control over build and run arguments, and for automation. For example, the following command shows how to use the Azure CLI [az acr build][50] to specify the Docker image name.\n\n```bash\naz acr build --registry <registry-name> \\\n  --resource-group <resource-group> \\\n  --target pythoncontainerwebapp:latest .\n```\n\nAs another example, consider the following command that shows how to use the Docker CLI [run][43] command. The example shows how to run a Docker container that communicates to a MongoDB instance in your dev environment, outside the container. The different values to complete the command are easier to automate when specified in a command line.\n\n```bash\ndocker run --rm -it \\\n  --publish <port>:<port> --publish 27017:27017 \\\n  --add-host mongoservice:<your-server-IP-address> \\\n  --env CONNECTION_STRING=mongodb://mongoservice:27017 \\\n  --env DB_NAME=<database-name> \\\n  --env COLLECTION_NAME=<collection-name> \\\n  containermongo:latest  \n```\n\nFor more information about this scenario, see [Build and test a containerized Python web app locally][26].\n\n### Environment variables in containers\n\nPython projects commonly use environment variables to pass configuration data into the application code. This approach allows for greater flexibility across different environments. For instance, database connection details can be stored in environment variables, making it easy to switch between development, testing, and production databases without modifying the code. This separation of configuration from code promotes cleaner deployments and enhances security and maintainability.  \n\nPackages like [python-dotenv][27] are often used to read key-value pairs from an *.env* file and set them as environment variables. An *.env* file is useful when running in a virtual environment but isn't recommended when working with containers. **Don't copy the *.env* file into the Docker image, especially if it contains sensitive information and the container will be made public.** Use the *\\.dockerignore* file to exclude files from being copied into the Docker image. For more information, see the section [Virtual environments and containers](#virtual-environments-and-containers) in this article.\n\nYou can pass environment variables to containers in a few ways:\n\n1. Defined in the Dockerfile as [ENV][45] instructions.\n1. Passed in as `--build-arg` arguments with the Docker [build][42] command.\n1. Passed in as  `--secret` arguments with the Docker build command and [BuildKit][29] backend.\n1. Passed in as `--env` or `--env-file` arguments with the Docker [run][43] command.\n\nThe first two options have the same drawback as noted with *\\.env* files, namely that you're hardcoding potentially sensitive information into a Docker image. You can inspect a Docker image and see the environment variables, for example, with the command [docker image inspect][28].\n\nThe third option with BuildKit allows you to pass secret information to be used in the Dockerfile for building docker images in a safe way that won't end up stored in the final image.\n\nThe fourth option of passing in environment variables with the Docker run command means the Docker image doesn't contain the variables. However, the variables are still visible inspecting the container instance (for example, with [docker container inspect][51]). This option may be acceptable when access to the container instance is controlled or in testing or dev scenarios.\n\nHere's an example of passing environment variables using the Docker CLI run command and using the `--env` argument.\n\n```bash\n# PORT=8000 for Django and 5000 for Flask\nexport PORT=<port-number>\n\ndocker run --rm -it \\\n  --publish $PORT:$PORT \\\n  --env CONNECTION_STRING=<connection-info> \\\n  --env DB_NAME=<database-name> \\\n  <dockerimagename:tag>\n```\n\nIn VS Code (Docker extension) or PyCharm (Docker plugin), UI tools simplify managing Docker images and containers by executing standard docker CLI commands (such as docker build, docker run) in the background.\n\nFinally, specifying environment variables  when deploying a container in Azure is different than using environment variables in your dev environment. For example:\n\n* For Web App for Containers, you configure application settings during configuration of App Service. These settings are available to your app code as environment variables and accessed using the standard [os.environ][30] pattern. You can change values after initial deployment when needed. For more information, see [Access app settings as environment variables][31].\n\n* For Azure Container Apps, you configure environment variables during initial configuration of the container app. Subsequent modification of environment variables creates a [*revision*][32] of the container. In addition, Azure Container Apps allows you to define secrets at the application level and then reference them in environment variables. For more information, see [Manage secrets in Azure Container Apps][33].\n\nAs another option, you can use [Service Connector][34] to help you connect Azure compute services to other backing services. This service configures the network settings and connection information (for example, generating environment variables) between compute services and target backing services in management plane.\n\n## Viewing container logs\n\nView container instance logs to see diagnostic messages output from code and to troubleshoot issues in your container's code. Here are several ways you can view logs when running a container in your ***dev environment***:\n\n* Running a container with VS Code or PyCharm, as shown in the section [VS Code and PyCharm](#vs-code-and-pycharm), you can see logs in terminal windows opened when Docker run executes.\n\n* If you're using the Docker CLI [run][43] command with the interactive flag `-it`, you see output following the command.\n\n* In [Docker Desktop][44], you can also view logs for a running container.\n\nWhen you deploy a container in ***Azure***, you also have access to container logs. Here are several Azure services and how to access container logs in Azure portal.\n\n| Azure service | How to access logs in Azure portal |\n| -------------- | --------------------------- |\n| Web App for Containers | Go to the **Diagnose and solve problems** resource to view logs. [Diagnostics][46] is an intelligent and interactive experience to help you troubleshoot your app with no configuration required. For a real-time view of logs, go to the **Monitoring** - **Log stream**. For more detailed log queries and configuration, see the other resources under **Monitoring**. |\n| Azure Container Apps | Go to the environment resource **Diagnose and solve problems** to troubleshoot environment problems. More often, you want to see container logs. In the container resource, under **Application** - **Revision management**, select the revision and from there you can view system and console logs. For more detailed log queries and configuration, see the resources under **Monitoring**. |\n| Azure Container Instances | Go to the **Containers** resource and select **Logs**. |\n\nFor these services, here are the Azure CLI commands to access logs.\n\n| Azure service | Azure CLI command to access logs |\n| -------------- | -------------------------------- |\n| Web App for Containers | [az webapp log][48] |\n| Azure Container Apps | [az containerapps logs][47] |\n| Azure Container Instances | [az container logs][49] |\n\nThere's also support for viewing logs in VS Code. You must have [Azure Tools for VS Code][41] installed. Below is an example of viewing Web Apps for Containers (App Service) logs in VS Code.\n\n:::image type=\"content\" source=\"media/containers-overview/vs-code-logging-example.png\" alt-text=\"Screenshot showing how to view logs in VS Code for Web Apps for Containers.\" lightbox=\"media/containers-overview/vs-code-logging-example.png\":::\n\n## Next steps\n\n* [Containerized Python web app on Azure with MongoDB](./tutorial-containerize-deploy-python-web-app-azure-01.md)\n* [Deploy a Python web app on Azure Container Apps with PostgreSQL](./tutorial-deploy-python-web-app-azure-container-apps-01.md)\n\n[1]: https://github.com/features/codespaces\n[2]: https://code.visualstudio.com/docs/remote/containers\n[3]: https://azure.microsoft.com/products/app-service/containers/\n[4]: ./tutorial-containerize-simple-web-app-for-app-service.md\n[5]: https://azure.microsoft.com/products/container-apps/\n[6]: https://azure.microsoft.com/products/container-instances\n[7]: /azure/container-instances/container-instances-tutorial-prepare-app\n[8]: https://azure.microsoft.com/products/kubernetes-service/\n[9]: /azure/aks/learn/quick-kubernetes-deploy-cli\n[10]: https://azure.microsoft.com/products/functions/\n[11]: /azure/azure-functions/functions-create-function-linux-custom-image?pivots=programming-language-python\n[12]: /azure/container-apps/compare-options\n[13]: https://www.uvicorn.org/\n[14]: /azure/app-service/configure-custom-container?pivots=container-linux##configure-port-number\n[15]: /azure/container-apps/ingress\n[16]: https://docs.docker.com/engine/reference/builder/#from\n[17]: https://docs.docker.com/engine/reference/builder/#expose\n[18]: https://docs.docker.com/engine/reference/builder/#run\n[19]: https://docs.docker.com/engine/reference/builder/#cmd\n[20]: https://code.visualstudio.com/docs/containers/overview#_generating-docker-files\n[21]: https://code.visualstudio.com/docs/containers/overview\n[22]: https://plugins.jetbrains.com/plugin/7724-docker\n[23]: https://code.visualstudio.com/docs/setup/network\n[24]: /cli/azure/install-azure-cli\n[25]: https://docs.docker.com/engine/reference/commandline/cli/\n[26]: ./tutorial-containerize-deploy-python-web-app-azure-02.md\n[27]: https://pypi.org/project/python-dotenv/\n[28]: https://docs.docker.com/engine/reference/commandline/image_inspect/\n[29]: https://docs.docker.com/develop/develop-images/build_enhancements/\n[30]: https://docs.python.org/3/library/os.html#os.environ\n[31]: /azure/app-service/configure-language-python#access-app-settings-as-environment-variables\n[32]: /azure/container-apps/revisions\n[33]: /azure/container-apps/manage-secrets\n[34]: /azure/service-connector/overview\n[35]: https://www.djangoproject.com/\n[36]: https://flask.palletsprojects.com/en/stable/\n[37]: https://fastapi.tiangolo.com/\n[38]: https://docs.docker.com/engine/reference/builder/#copy\n[39]: https://www.jetbrains.com/help/pycharm/docker.html#enable_docker\n[40]: https://docs.docker.com/engine/reference/builder/#dockerignore-file\n[41]: https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack\n[42]: https://docs.docker.com/engine/reference/commandline/build/\n[43]: https://docs.docker.com/engine/reference/commandline/run/\n[44]: https://www.docker.com/products/docker-desktop/\n[45]: https://docs.docker.com/engine/reference/builder/#env\n[46]: /azure/app-service/overview-diagnostics\n[47]: /cli/azure/containerapp/logs\n[48]: /cli/azure/webapp/log\n[49]: /cli/azure/container#az-container-logs\n[50]: /cli/azure/acr#az-acr-build\n[51]: https://docs.docker.com/engine/reference/commandline/image_inspect/\n[52]: ./tutorial-containerize-simple-web-app.md\n"
  },
  {
    "path": "articles/python/get-started-app-chat-app-load-test-locust.md",
    "content": "---\ntitle: Get started load testing Python enterprise chat sample using RAG\ndescription: Get started load testing your Python chat app. \nms.date: 12/18/2025\nms.update-cycle: 180-days\nms.author: rotabor\nauthor: bobtabor-msft\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-python, devx-track-python-ai, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a Python developer new to Azure OpenAI Service, I want to load test my scaled app past rate limiting.\n---\n\n# Load testing a Python chat app by using RAG with Locust\n\nThis article provides the process to perform load testing on a Python chat application by using the Retrieval Augmented Generation (RAG) pattern with Locust, a popular open-source load testing tool. The primary objective of load testing is to ensure that the expected load on your chat application doesn't exceed the current Azure OpenAI Service transactions per minute (TPM) quota. By simulating user behavior under heavy load, you can identify potential bottlenecks and scalability issues in your application. This process is crucial for ensuring that your chat application remains responsive and reliable, even when faced with a high volume of user requests.\n\n> [!NOTE]\n> This article uses one or more [AI app templates](../ai/intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained reference implementations that are easy to deploy. They help to ensure a high-quality starting point for your AI apps.\n\n## Prerequisites\n\n* An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* [Dev containers](https://containers.dev/) are available for both samples with all the dependencies that are required to complete this article. You can run the dev containers in GitHub Codespaces (in a browser) or locally by using Visual Studio Code.\n\n    #### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n        \n    * You need only a [GitHub account](https://github.com/login).\n    \n    #### [Visual Studio Code](#tab/visual-studio-code)\n\n    * [Azure Developer CLI](/azure/developer/azure-developer-cli).\n    * [Docker Desktop](https://www.docker.com/products/docker-desktop/). Start Docker Desktop if it's not already running.\n    * [Visual Studio Code](https://code.visualstudio.com/).\n    * [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers).\n        \n    ---\n\n* [Python chat app with RAG](get-started-app-chat-template.md). If you configured your chat app to use one of the load balancing solutions, this article helps you test the load balancing. The load balancing solutions include [Azure Container Apps](get-started-app-chat-scaling-with-azure-container-apps.md).\n\n## Open the load test sample app\n\nThe load test is in the [Python chat app](get-started-app-chat-template.md) solution as a [Locust test](https://github.com/Azure-Samples/azure-search-openai-demo/blob/main/locustfile.py). Return to that article, deploy the solution, and then use that dev container development environment to complete the following steps.\n\n## Run the test\n\n1. Install the Locust package, which is used to simulate concurrent users and generate load against your chat application:\n\n    ```bash\n    python -m pip install locust\n    ```\n\n1. Start Locust, which uses the Locust test file [locustfile.py](https://github.com/Azure-Samples/azure-search-openai-demo/blob/main/locustfile.py). You can find it at the root of the repository. The sample has a `ChatUser` class that simulates a user asking questions and receiving answers from the chat app.\n\n    ```bash\n    locust ChatUser\n    ```\n\n1. After Locust starts successfully, it launches a local web interface that you use to configure and monitor the load test. Open the running Locust website, such as `http://localhost:8089`.\n1. Enter the following values in the Locust website.\n\n    |Property|Value|\n    |---|---|\n    |Number of users|20|\n    |Ramp up|1|\n    |Host|`https://<YOUR-CHAT-APP-URL>.azurewebsites.net` (the base URL of your deployed chat application)|\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-app-load-test-locust/locust-test-settings.png\" alt-text=\"Screenshot that shows the Locust test with values filled in.\":::\n\n1. Select **Start Swarm** to start the test.\n1. Select **Charts** to watch the test progress.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-app-load-test-locust/locust-chart-results.png\" alt-text=\"Screenshot that shows the Locust chart during a test run.\":::\n\n## Clean up resources\n\nWhen you're finished with load testing, clean up the resources. The Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges. After you delete resources specific to this article, remember to return to the other chat app tutorial and follow the clean-up steps.\n\nReturn to the chat app article to [clean up](get-started-app-chat-template.md#clean-up-resources) those resources.\n\n## Get help\n\nIf you have trouble using this load tester, add your issue to the repository's [Issues](https://github.com/Azure-samples/azure-search-openai-demo) webpage.\n"
  },
  {
    "path": "articles/python/get-started-app-chat-document-security-trim.md",
    "content": "---\ntitle: \"Get started with chat document security filtering\"\ndescription: \"Secure your chat app documents with user authentication and document security filtering to ensure that users receive answers based on their permissions.\"\nms.date: 01/30/2026\nms.update-cycle: 180-days\nms.author: rotabor\nauthor: bobtabor-msft\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-js-ai, devx-track-extended-azdevcli, build-2024-intelligent-apps, devx-track-azurecli, devx-track-python\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a Python developer new to Azure OpenAI Models in Microsoft Foundry, I want to secure my chat app documents so users only see answers they’re allowed to access.\n---\n\n# Get started with chat document security for Python\n\nWhen you build a [chat application by using the Retrieval Augmented Generation (RAG) pattern](get-started-app-chat-template.md) with your own data, make sure that each user receives an answer based on their permissions. Follow the process in this article to add document access control to your chat app.\n\n- **Authorized user**: This person should have access to answers contained within the documents of the chat app.\n\n   :::image type=\"content\" source=\"media/get-started-app-chat-document-security-trim/chat-answer-with-authorized-access.png\" alt-text=\"Screenshot that shows the chat app with an answer with required authentication access.\":::\n\n- **Unauthorized user**: This person shouldn't have access to answers from secured documents they don't have authorization to see.\n\n   :::image type=\"content\" source=\"media/get-started-app-chat-document-security-trim/chat-answer-with-no-access.png\" alt-text=\"Screenshot that shows the chat app with an answer that indicates the user doesn't have access to data.\":::\n\n> [!NOTE]\n> This article uses one or more [AI app templates](../ai/intelligent-app-templates.md) as the basis for the examples and guidance in the article. AI app templates provide you with well-maintained reference implementations that are easy to deploy. They help to ensure a high-quality starting point for your AI apps.\n\n## Architectural overview\n\nWithout a document security feature, the enterprise chat app has a simple architecture by using Azure AI Search and Azure OpenAI Models in Microsoft Foundry. An answer is determined from queries to Azure AI Search where the documents are stored, in combination with a response from an Azure OpenAI GPT model. No user authentication is used in this simple flow.\n\n:::image type=\"content\" source=\"media/get-started-app-chat-document-security-trim/simple-rag-chat-architecture.png\" alt-text=\"Architectural diagram that shows how Azure AI Search finds answers from stored documents and combines them with a response from Azure OpenAI.\":::\n\nTo add security for the documents, you need to update the enterprise chat app:\n\n- Add client authentication to the chat app with Microsoft Entra.\n- Add server-side logic to populate a search index with user and group access.\n\n:::image type=\"content\" source=\"media/get-started-app-chat-document-security-trim/trimmed-rag-chat-architecture.png\" alt-text=\"Architectural diagram that shows a user authenticating with Microsoft Entra ID, and then passing that authentication to Azure AI Search.\":::\n\nAzure AI Search doesn't provide _native_ document-level permissions and can't vary search results from within an index by user permissions. Instead, your application can use search filters to ensure that a document is accessible to a specific user or by a specific group. Within your search index, each document should have a filterable field that stores user or group identity information.\n\n:::image type=\"content\" source=\"media/get-started-app-chat-document-security-trim/azure-ai-search-with-user-authorization.png\" alt-text=\"Architectural diagram showing that each document in Azure AI Search has user authentication, which appears in the search results.\":::\n\nBecause the authorization isn't natively contained in Azure AI Search, you need to add a field to hold user or group information, and then [filter](/azure/search/search-security-trimming-for-azure-search) any documents that don't match. To implement this technique, you need to:\n\n* Create a document access control field in your index dedicated to storing the details of users or groups with document access.\n* Populate the document's access control field with the relevant user or group details.\n* Update this access control field whenever there are changes in user or group access permissions.\n\nIf your index updates are scheduled with an indexer, changes are picked up on the next indexer run. If you don't use an indexer, you need to manually reindex.\n\nIn this article, the process of securing documents in Azure AI Search is made possible with _example_ scripts, which you as the search administrator would run. The scripts associate a single document with a single user identity. You can take these [scripts](https://github.com/Azure-Samples/azure-search-openai-demo/tree/main/scripts) and apply your own security and production requirements to scale to your needs.\n\n## Determine security configuration\n\nThe solution provides Boolean environment variables to turn on features that are necessary for document security in this sample.\n\n|Parameter|Purpose|\n|--|--|\n|`AZURE_USE_AUTHENTICATION`|When set to `true`, enables user sign-in to the chat app and Azure App Service authentication. Enables `Use oid security filter` in the chat app **Developer settings**.|\n|`AZURE_ENFORCE_ACCESS_CONTROL`|When set to `true`, requires authentication for any document access. The **Developer settings** for object ID (OID) and group security are turned on and disabled so that they can't be disabled from the UI.|\n|`AZURE_ENABLE_GLOBAL_DOCUMENTS_ACCESS`|When set to `true`, this setting allows authenticated users to search on documents that have no access controls assigned, even when access control is required. This parameter should be used only when `AZURE_ENFORCE_ACCESS_CONTROL` is enabled.|\n|`AZURE_ENABLE_UNAUTHENTICATED_ACCESS`|When set to `true`, this setting allows unauthenticated users to use the app, even when access control is enforced. This parameter should be used only when `AZURE_ENFORCE_ACCESS_CONTROL` is enabled.|\n\nUse the following sections to understand the security profiles supported in this sample. This article configures the *Enterprise profile*.\n\n### Enterprise: Required account + document filter\n\nEach user of the site _must_ sign in. The site contains content that's public to all users. The document-level security filter is applied to all requests.\n\nEnvironment variables:\n\n- `AZURE_USE_AUTHENTICATION=true`\n- `AZURE_ENABLE_GLOBAL_DOCUMENTS_ACCESS=true`\n- `AZURE_ENFORCE_ACCESS_CONTROL=true`\n\n### Mixed use: Optional account + document filter\n\nEach user of the site _might_ sign in. The site contains content that's public to all users. The document-level security filter is applied to all requests.\n\nEnvironment variables:\n\n- `AZURE_USE_AUTHENTICATION=true`\n- `AZURE_ENABLE_GLOBAL_DOCUMENTS_ACCESS=true`\n- `AZURE_ENFORCE_ACCESS_CONTROL=true`\n- `AZURE_ENABLE_UNAUTHENTICATED_ACCESS=true`\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all the [dependencies](https://github.com/azure-samples/azure-search-openai-demo?tab=readme-ov-file#azure-deployment) that are required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally by using Visual Studio Code.\n\nTo use this article, you need the following prerequisites:\n\n* An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* Azure account permissions: Your Azure account must have:\n    * Permission to [manage applications in Microsoft Entra ID](/azure/active-directory/roles/permissions-reference#cloud-application-administrator).\n    * `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n\nYou need more prerequisites depending on your preferred development environment.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n* [GitHub account](https://github.com/login)\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n* [Azure Developer CLI](/azure/developer/azure-developer-cli).\n* [Docker Desktop](https://www.docker.com/products/docker-desktop/). Start Docker Desktop if it's not already running.\n* [Visual Studio Code](https://code.visualstudio.com/).\n* [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers).\n\n---\n\n## Open a development environment\n\nUse the following instructions to deploy a preconfigured development environment containing all required dependencies to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use GitHub Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Start the process to create a new GitHub codespace on the `main` branch of the [Azure-Samples/azure-search-openai-demo](https://github.com/Azure-Samples/azure-search-openai-demo) GitHub repository.\n1. Right-click the following button, and select **Open link in new windows** to have the development environment and the documentation available at the same time.\n\n    [![Open in GitHub Codespaces.](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo)\n\n1. On the **Create codespace** page, review the codespace configuration settings, then select **Create new codespace**.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-document-security-trim/github-create-codespace.png\" alt-text=\"Screenshot that shows the confirmation screen before you create a new codespace.\":::\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. In the terminal at the bottom of the screen, sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login\n    ```\n\n1. Complete the authentication process.\n\n1. The remaining tasks in this article take place in the context of this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally by using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n1. Create a new local directory on your computer for the project.\n\n    ```bash\n    mkdir my-intelligent-app && cd my-intelligent-app\n    ```\n\n1. Open Visual Studio Code in that directory.\n\n    ```bash\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n1. Run the following `AZD` command to bring the GitHub repository to your local computer.\n\n    ```bash\n    azd init -t azure-search-openai-demo\n    ```\n\n1. Open the **Command** palette, and search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before you continue.\n1. Sign in to Azure with the Azure Developer CLI.\n\n    ```bash\n    azd auth login\n    ```\n    Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n1. The remaining exercises in this project take place in the context of this development container.\n\n---\n\n## Get required information with the Azure CLI\n\nGet your subscription ID and tenant ID with the following Azure CLI command. Copy the value to use as your `AZURE_TENANT_ID` value.\n\n```azurecli\naz account list --query \"[].{subscription_id:id, name:name, tenantId:tenantId}\" -o table\n```\n\nIf you get an error about your tenant's conditional access policy, you need a second tenant without a conditional access policy.\n\n* Your first tenant, associated with your user account, is used for the `AZURE_TENANT_ID` environment variable.\n* Your second tenant, without conditional access, is used for the `AZURE_AUTH_TENANT_ID` environment variable to access Microsoft Graph. For tenants with a conditional access policy, find the ID of a second tenant without a conditional access policy or [create a new tenant](/entra/fundamentals/create-new-tenant).\n\n## Set environment variables\n\n1. Run the following commands to configure the application for the **Enterprise** profile.\n\n    ```console\n    azd env set AZURE_USE_AUTHENTICATION true\n    azd env set AZURE_ENABLE_GLOBAL_DOCUMENTS_ACCESS true\n    azd env set AZURE_ENFORCE_ACCESS_CONTROL true\n    ```\n\n1. Run the following command to set the tenant, which authorizes the user sign-in to the hosted application environment. Replace `<YOUR_TENANT_ID>` with the tenant ID.\n\n    ```console\n    azd env set AZURE_TENANT_ID <YOUR_TENANT_ID>\n    ```\n\n> [!NOTE]\n> If you have a conditional access policy on your user tenant, you need to [specify an authentication tenant](#provide-authentication-tenant).\n\n## Deploy the chat app to Azure\n\nDeployment consists of the following steps:\n\n- Create the Azure resources.\n- Upload the documents.\n- Create the Microsoft Entra identity apps (client and server).\n- Turn on identity for the hosting resource.\n\n1. Provision the Azure resources and deploy the source code.\n\n    ```bash\n    azd up\n    ```\n\n1. Use the following table to answer the `AZD` deployment prompts.\n\n    |Prompt|Answer|\n    |--|--|\n    |Environment name| Use a short name with identifying information such as your alias and app. And example is `tjones-secure-chat`.|\n    |Subscription|Select a subscription in which to create the resources.|\n    |Location for Azure resources|Select a location near you. |\n    |Location for `documentIntelligentResourceGroupLocation`|Select a location near you.|\n    |Location for `openAIResourceGroupLocation`|Select a location near you. |\n\n    Wait 5 or 10 minutes after the app deploys to allow the app to start up.\n1. After the application successfully deploys, a URL appears in the terminal.\n1. Select the URL labeled `(✓) Done: Deploying service webapp` to open the chat application in a browser.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-document-security-trim/azd-deployment-output.png\" alt-text=\"Screenshot of the chat app in a browser with chat suggestions and the chat text box.\":::\n\n1. Agree to the app authentication pop-up.\n1. When the chat app appears, notice in the upper-right corner that your user is signed in.\n1. Open **Developer settings** and notice that both of the following options are selected and disabled for change:\n\n    * **Use oid security filter**\n    * **Use groups security filter**\n\n1. Select the card with **What does a product manager do?**.\n1. You get an answer like: **The provided sources do not contain specific information about the role of a Product Manager at Contoso Electronics.**\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-document-security-trim/role-library-access-denied.png\" alt-text=\"Screenshot that shows a chat app in a browser showing that the answer can't be returned.\":::\n\n## Open access to a document for a user\n\nTurn on your permissions for the exact document so that you _can_ get the answer. You need several pieces of information:\n\n* Azure Storage\n    * Account name\n    * Container name\n    * Blob/document URL for `role_library.pdf`\n* User's ID in Microsoft Entra ID\n\nWhen this information is known, update the Azure AI Search index `oids` field for the `role_library.pdf` document.\n\n### Get the URL for a document in storage\n\n1. In the `.azure` folder at the root of the project, find the environment directory, and open the `.env` file with that directory.\n1. Search for the `AZURE_STORAGE_ACCOUNT` entry and copy its value.\n1. Use the following Azure CLI commands to get the URL of the `role_library.pdf` blob in the `content` container.\n\n    ```azurecli\n    az storage blob url \\\n        --account-name <REPLACE_WITH_AZURE_STORAGE_ACCOUNT \\\n        --container-name 'content' \\\n        --name 'role_library.pdf' \n    ```\n    \n    |Parameter|Purpose|\n    |--|--|\n    |--account-name|Azure Storage account name.|\n    |--container-name|The container name in this sample is `content`.|\n    |--name|The blob name in this step is `role_library.pdf`. |\n\n1. Copy the blob URL to use later.\n\n### Get your user ID\n\n1. In the chat app, select **Developer settings**.\n1. In the **ID Token claims** section, copy your `objectidentifier` parameter. This parameter is known in the next section as `USER_OBJECT_ID`.\n\n### Provide user access to a document in Azure Search\n\n1. Use the following script to change the `oids` field in Azure AI Search for `role_library.pdf` so that you have access to it.\n\n    ```python\n    python ./scripts/manageacl.py --acl-type oids --acl-action add --acl <REPLACE_WITH_YOUR_USER_OBJECT_ID> --url <REPLACE_WITH_YOUR_DOCUMENT_URL>\n    ```\n    \n    |Parameter|Purpose|\n    |--|--|\n    |-v|Verbose output.|\n    |--acl-type|Group or user OIDs: `oids`.|\n    |--acl-action|**Add** to a Search index field. Other options include `enable_acls`, `remove`, `remove_all`, and `view`. |\n    |--acl|Group or user `USER_OBJECT_ID`.|\n    |--url|The file's location in Azure Storage, such as `https://MYSTORAGENAME.blob.core.windows.net/content/role_library.pdf`. Don't surround the URL with quotation marks in the CLI command.|\n\n1. The console output for this command looks like:\n\n    ```console.\n    Loading azd .env file from current environment...\n    Creating Python virtual environment \"app/backend/.venv\"...\n    Installing dependencies from \"requirements.txt\" into virtual environment (in quiet mode)...\n    Running manageacl.py. Arguments to script: -v --acl-type oids --acl-action add --acl 00000000-0000-0000-0000-000000000000 --url https://mystorage.blob.core.windows.net/content/role_library.pdf\n    Found 58 search documents with storageUrl https://mystorage.blob.core.windows.net/content/role_library.pdf\n    Adding acl 00000000-0000-0000-0000-000000000000 to 58 search documents\n    ```\n\n1. Optionally, use the following command to verify that your permission is listed for the file in Azure AI Search.\n\n    ```python\n    python ./scripts/manageacl.py -v --acl-type groups --acl-action view --url <REPLACE_WITH_YOUR_DOCUMENT_URL>\n    ```\n\n    |Parameter|Purpose|\n    |--|--|\n    |-v|Verbose output.|\n    |--acl-type|Group or user OIDs: `oids`.|\n    |--acl-action|View a Search index field `oids`. Other options include `enable_acls`, `remove`, `remove_all`, and `add`. |\n    |--url|The file's location in that shows, such as `https://MYSTORAGENAME.blob.core.windows.net/content/role_library.pdf`. Don't surround the URL with quotation marks in the CLI command.|\n\n1. The console output for this command looks like:\n\n    ```console.\n    Loading azd .env file from current environment...\n    Creating Python virtual environment \"app/backend/.venv\"...\n    Installing dependencies from \"requirements.txt\" into virtual environment (in quiet mode)...\n    Running manageacl.py. Arguments to script: -v --acl-type oids --acl-action view --acl 00000000-0000-0000-0000-000000000000 --url https://mystorage.blob.core.windows.net/content/role_library.pdf\n    Found 58 search documents with storageUrl https://mystorage.blob.core.windows.net/content/role_library.pdf\n    [00000000-0000-0000-0000-000000000000]\n    ```\n\n    The array at the end of the output includes your `USER_OBJECT_ID` parameter and is used to determine if the document is used in the answer with Azure OpenAI.\n\n### Verify that Azure AI Search contains your USER_OBJECT_ID\n\n1. Open the [Azure portal](https://portal.azure.com) and search for `AI Search`.\n1. Select your search resource from the list.\n1. Select **Search management** > **Indexes**.\n1. Select **gptkbindex**.\n1. Select **View** > **JSON view**.\n1. Replace the JSON with the following JSON:\n\n    ```json\n    {\n      \"search\": \"*\",\n      \"select\": \"sourcefile, oids\",\n      \"filter\": \"oids/any()\"\n    }\n    ```\n\n    This JSON searches all documents where the `oids` field has any value and returns the `sourcefile` and `oids` fields.\n\n1. If the `role_library.pdf` doesn't have your OID, return to the [Provide user access to a document in Azure Search](#provide-user-access-to-a-document-in-azure-search) section and complete the steps.\n\n### Verify user access to the document\n\nIf you completed the steps but didn't see the correct answer, verify that your `USER_OBJECT_ID` parameter is set correctly in Azure AI Search for `role_library.pdf`.\n\n1. Return to the chat app. You might need to sign in again.\n1. Enter the same query so that the `role_library` content is used in the Azure OpenAI answer: `What does a product manager do?`.\n1. View the result, which now includes the appropriate answer from the role library document.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-document-security-trim/role-library-access-granted.png\" alt-text=\"Screenshot that shows a chat app in a browser showing that the answer is returned.\":::\n\n## Clean up resources\n\nThe following steps walk you through the process of cleaning up the resources you used.\n\n### Clean up Azure resources\n\nThe Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\nRun the following Azure Developer CLI command to delete the Azure resources and remove the source code.\n\n```bash\nazd down --purge\n```\n\n### Clean up GitHub Codespaces and Visual Studio Code\n\nThe following steps walk you through the process of cleaning up the resources you used.\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement that you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign in to the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running codespaces that are sourced from the [Azure-Samples/azure-search-openai-demo](https://github.com/Azure-Samples/azure-search-openai-demo) GitHub repository.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-document-security-trim/github-codespace-dashboard.png\" alt-text=\"Screenshot that shows all the running codespaces including their status and templates.\":::\n\n1. Open the context menu for the codespace and then select **Delete**.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-document-security-trim/github-codespace-delete.png\" alt-text=\"Screenshot that shows the context menu for a single codespace with the Delete option highlighted.\":::\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\n1. Open the **Command** palette and search for the **Dev Containers** commands.\n1. Select **Dev Containers: Reopen Folder Locally**.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-document-security-trim/reopen-local-command-palette.png\" alt-text=\"Screenshot that shows the Command palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> After Visual Studio Code stops the running development container, the container still exists in Docker in a stopped state. You can delete the container instance, container image, and volumes from Docker to free up more space on your local machine.\n\n---\n\n## Get help\n\nThe sample repository offers [troubleshooting information](https://github.com/Azure-Samples/azure-search-openai-demo/tree/main#troubleshooting).\n\n### Troubleshooting\n\nThis section helps you troubleshoot issues specific to this article.\n\n#### Provide authentication tenant\n\nWhen your authentication is in a separate tenant from your hosting application, you need to set that authentication tenant with the following process.\n\n1. Run the following command to configure the sample to use a second tenant for the authentication tenant.\n\n    ```console\n    azd env set AZURE_AUTH_TENANT_ID <REPLACE-WITH-YOUR-TENANT-ID>\n    ```\n\n    |Parameter|Purpose|\n    |--|--|\n    |`AZURE_AUTH_TENANT_ID`|If `AZURE_AUTH_TENANT_ID` is set, it's the tenant that hosts the app.|\n   \n1. Redeploy the solution with the following command:\n\n    ```console\n    azd up\n    ``` \n\n## Related content\n\n* Build a [chat app with Azure OpenAI](https://aka.ms/azai/chat) best-practices solution architecture.\n* Learn about [access control in generative AI apps with Azure AI Search](https://techcommunity.microsoft.com/t5/azure-ai-services-blog/access-control-in-generative-ai-applications-with-azure/ba-p/3956408).\n* Build an [enterprise-ready Azure OpenAI solution with Azure API Management](https://techcommunity.microsoft.com/t5/apps-on-azure-blog/build-an-enterprise-ready-azure-openai-solution-with-azure-api/bc-p/3935407).\n* See [Azure AI Search: Outperforming vector search with hybrid retrieval and ranking capabilities](https://techcommunity.microsoft.com/t5/azure-ai-services-blog/azure-cognitive-search-outperforming-vector-search-with-hybrid/ba-p/3929167).\n"
  },
  {
    "path": "articles/python/get-started-app-chat-evaluations.md",
    "content": "---\ntitle: \"Evaluating chat apps with Azure OpenAI\"\ndescription: \"Learn how to effectively evaluate answers in your RAG-based chat app by using Azure OpenAI Service. Generate sample prompts, run evaluations, and analyze results.\"\nms.date: 01/30/2026\nms.update-cycle: 180-days\nms.author: rotabor\nauthor: bobtabor-msft\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-python, devx-track-python-ai, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a Python developer new to Azure OpenAI Service, I want to evaluate the answers of my chat app and determine the best prompt.\n---\n# Get started with evaluating answers in a chat app in Python\n\n[!INCLUDE [evaluations-intro](../ai/includes/evaluations-introduction.md)]\n\n## Prerequisites\n\n* An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* Complete the [previous chat app procedure](get-started-app-chat-template.md) to deploy the chat app to Azure. This resource is required for the evaluations app to work. Don't complete the \"Clean up resources\" section of the previous procedure.\n\n    You need the following Azure resource information from that deployment, which is referred to as the *chat app* in this article:\n\n    * Chat API URI. The service backend endpoint shown at the end of the `azd up` process.\n    * Azure AI Search. The following values are required:\n         * **Resource name**: The name of the Azure AI Search resource name, reported as `Search service` during the `azd up` process.\n        * **Index name**: The name of the Azure AI Search index where your documents are stored. You can find it in the Azure portal for the Search service.\n\n    The Chat API URL allows the evaluations to make requests through your backend application. The Azure AI Search information allows the evaluation scripts to use the same deployment as your backend, loaded with the documents.\n\n    After you have this information collected, you shouldn't need to use the chat app development environment again. This article refers to it later, several times, to indicate how the evaluations app uses the chat app. Don't delete the chat app resources until you finish the entire procedure in this article.\n\n* A [development container](https://containers.dev/) environment is available with all the dependencies that are required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally by using Visual Studio Code.\n\n    #### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n    \n    * GitHub account\n    \n    #### [Visual Studio Code](#tab/visual-studio-code)\n\n    * [Docker Desktop](https://www.docker.com/products/docker-desktop/). Start Docker Desktop if it's not already running.\n    * [Visual Studio Code](https://code.visualstudio.com/).\n    * [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers).\n    \n    ---\n\n[!INCLUDE [evaluations-procedure](../ai/includes/evaluations-procedure.md)]\n"
  },
  {
    "path": "articles/python/get-started-app-chat-private-endpoint.md",
    "content": "---\ntitle: \"Get started with chat private endpoints\"\ndescription: \"Secure the chat app with a virtual network.\"\nms.date: 11/25/2025\nms.author: rotabor\nauthor: bobtabor-msft\nms.update-cycle: 180-days\nms.topic: get-started\nms.subservice: intelligent-apps\nms.collection: ce-skilling-ai-copilot\nms.custom:\n  - devx-track-python\n  - devx-track-python-ai\n  - devx-track-extended-azdevcli\n  - build-2024-intelligent-apps\n  - sfi-image-nochange\n# CustomerIntent: As a Python developer new to Azure, I want to deploy a chat app with private access so that I understand how to secure my chat app endpoint.\n---\n\n# Get started with chat private endpoints for Python\n\nThis article shows you how to deploy and run the [enterprise chat app sample for Python](https://github.com/Azure-Samples/azure-search-openai-demo) that's accessible by private endpoints.\n\nThis sample implements a chat app by using Python, Azure OpenAI Service, and [Retrieval Augmented Generation (RAG)](/azure/search/retrieval-augmented-generation-overview) in Azure AI Search to get answers about employee benefits at a fictitious company. The app is seeded with PDF files that include the employee handbook, a benefits document, and a list of company roles and expectations.\n\nBy following the instructions in this article, you:\n\n- Deploy a chat app to Azure for public access in a web browser.\n- Redeploy a chat app with private endpoints.\n\nAfter you finish this procedure, you can start modifying the new project with your custom code and redeploy, knowing that your chat app is accessible only through the private network.\n\n## Architectural overview\n\nThe default deployment creates a chat app with public endpoints.\n\n:::image type=\"content\" source=\"media/get-started-app-chat-private-endpoints/simple-architecture-diagram-chat-app.png\" lightbox=\"media/get-started-app-chat-private-endpoints/simple-architecture-diagram-chat-app.png\" alt-text=\"Diagram that shows the network architecture of a basic RAG chat app.\":::\n\nFor chat apps enriched with private data, securing access to your chat app is crucial. This article presents a solution by using a virtual network.\n\n:::image type=\"content\" source=\"media/get-started-app-chat-private-endpoints/diagram-vnet.png\" lightbox=\"media/get-started-app-chat-private-endpoints/diagram-vnet.png\" alt-text=\"Diagram that shows network architecture with all services inside an Azure virtual network.\":::\n\nWithin the virtual network, there's a separate subnet for the Azure App Service app versus the other back-end Azure services. This structure makes it easy to apply different network security group rules to each subnet.\n\n:::image type=\"content\" source=\"media/get-started-app-chat-private-endpoints/diagram-subnets.png\" lightbox=\"media/get-started-app-chat-private-endpoints/diagram-subnets.png\" alt-text=\"Diagram that shows a chat app subnet and a back-end subnet within the virtual network.\":::\n\nWithin the virtual network, the services use private endpoints to communicate with each other. Each private endpoint is associated with a private Domain Name System (DNS) zone to resolve the private endpoint's name to an IP address within the virtual network.\n\n:::image type=\"content\" source=\"media/get-started-app-chat-private-endpoints/diagram-private-endpoint-openai.png\" lightbox=\"media/get-started-app-chat-private-endpoints/diagram-private-endpoint-openai.png\" alt-text=\"Diagram that shows the private endpoint and private DNS zone for Azure OpenAI within the virtual network.\":::\n\n## Deployment steps\n\nWe recommend that you deploy the solution twice. Deploy once with public access to validate that the chat app is working correctly. Deploy again with private access to secure your chat app by using a virtual network.\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all dependencies that are required to finish this article. You can run the development container in GitHub Codespaces (in a browser) or locally by using Visual Studio Code.\n\nTo use this article, you need the following prerequisites.\n\n#### [Codespaces (recommended)](#tab/github-codespaces)\n\n- An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- Azure account permissions. Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n- A GitHub account.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n- An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n- Azure account permissions. Your Azure account must have `Microsoft.Authorization/roleAssignments/write` permissions, such as [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner).\n- [Azure Developer CLI](/azure/developer/azure-developer-cli).\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/). Start Docker Desktop if it's not already running.\n- [Visual Studio Code](https://code.visualstudio.com/).\n- [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers).\n\n---\n\n### Usage cost for sample resources\n\nMost resources used in this architecture fall under basic or consumption-based pricing tiers. This means you only pay for what you use, and charges are typically minimal during development or testing.\n\nDeploying with private networking adds extra cost to your deployment. Once you're done evaluating or deploying the app, you can delete all provisioned resources to avoid ongoing charges.\n\nFor a detailed breakdown of expected costs, see the [Before you begin](https://github.com/Azure-Samples/azure-search-openai-demo/blob/main/docs/deploy_private.md#before-you-begin) in the GitHub repository for the sample.\n\n## Open development environment\n\nUse the following instructions to deploy a preconfigured development environment containing all required dependencies to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n[GitHub Codespaces](https://docs.github.com/codespaces) runs a development container managed by GitHub with [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface. For the most straightforward development environment, use GitHub Codespaces so that you have the correct developer tools and dependencies preinstalled to complete this article.\n\n> [!IMPORTANT]\n> All GitHub accounts can use GitHub Codespaces for up to 60 hours free each month with two core instances. For more information, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Start the process to create a new GitHub codespace on the `main` branch of the [Azure-Samples/azure-search-openai-demo](https://github.com/Azure-Samples/azure-search-openai-demo) GitHub repository.\n1. Right-click the following button, and select **Open link in new windows** to have the development environment and the documentation available at the same time.\n\n    [![Open in GitHub Codespaces.](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo)\n\n1. On the **Create codespace** page, review the codespace configuration settings, and then select **Create codespace**.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-private-endpoints/github-create-codespace.png\" lightbox=\"./media/get-started-app-chat-private-endpoints/github-create-codespace.png\" alt-text=\"Screenshot that shows the confirmation screen before you create a new codespace.\":::\n\n1. Wait for the codespace to start. This startup process can take a few minutes.\n\n1. In the terminal at the bottom of the screen, sign in to Azure with the Azure Developer CLI:\n\n    ```bash\n    azd auth login\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\nThe remaining tasks in this article take place in the context of this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) to be installed on your local machine. The extension hosts the development container locally by using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n1. Create a new local directory on your computer for the project:\n\n    ```bash\n    mkdir my-intelligent-app && cd my-intelligent-app\n    ```\n\n1. Open Visual Studio Code in that directory:\n\n    ```bash\n    code .\n    ```\n\n1. Open a new terminal in Visual Studio Code.\n1. Run the following `AZD` command to bring the GitHub repository to your local computer:\n\n    ```bash\n    azd init -t azure-search-openai-demo\n    ```\n\n1. Open the **Command** palette, and search for and select **Dev Containers: Open Folder in Container** to open the project in a dev container. Wait until the dev container opens before you continue.\n1. Sign in to Azure with the Azure Developer CLI:\n\n    ```bash\n    azd auth login\n    ```\n\n1. Copy the code from the terminal and then paste it into a browser. Follow the instructions to authenticate with your Azure account.\n\nThe remaining exercises in this project take place in the context of this development container.\n\n---\n\n## Custom settings\n\nThis solution configures and deploys the infrastructure based on custom settings configured with the Azure Developer CLI. The following table explains the custom settings for this solution.\n\n|Setting|Description|\n|--|----|\n|`AZURE_PUBLIC_NETWORK_ACCESS`|Controls the value of public network access on supported Azure resources. Valid values are `Enabled` or `Disabled`.|\n|`AZURE_USE_PRIVATE_ENDPOINT`|Controls deployment of private endpoints, which connect Azure resources to the virtual network. The `TRUE` value means that private endpoints are deployed for connectivity.|\n|`AZURE_USE_VPN_GATEWAY`|Controls deployment of a VPN gateway for the virtual network. If you don't use this and public access is disabled, you need a different way to connect to the virtual network. The `TRUE` value means that a VPN gateway is deployed for connectivity.|\n\n## Deploy the chat app\n\nThe first deployment creates the resources and provides a publicly accessible endpoint.\n\n1. Run the following command to configure this solution for public access:\n\n    ```console\n    azd env set AZURE_PUBLIC_NETWORK_ACCESS Enabled\n    ```\n\n    When you're asked for an environment name, remember that the environment name is used to create the resource group. Enter a meaningful name. If you're on a team or in an organization, include your name, as in `morgan-chat-private-endpoints`. Make note of the environment name. You need it later to find the resources in the Azure portal.\n\n1. Run the following command to include provisioning the virtual network resources. Remember that the deployment doesn't restrict access until the second deployment.\n\n    ```console\n    azd env set AZURE_USE_PRIVATE_ENDPOINT true\n    ```\n\n1. Deploy the solution with the following command:\n\n    ```console\n    azd up\n    ```\n\n    Provisioning resources is the most time-consuming part of the deployment process. Wait for the deployment to finish before you continue.\n\n1. At the end of the deployment process, the app endpoint appears. Copy that endpoint into a browser to open the chat app. Select one of the questions on the cards and then wait for the answer.\n\n    Make note of the endpoint URL because you need it again later in the article.\n\n## Deploy the chat app to Azure with private access\n\nChange the deployment configuration to secure the chat app for private access.\n\n1. Run the following command to use a VPN gateway for accessing the virtual network:\n\n    ```console\n    azd env set AZURE_USE_VPN_GATEWAY true\n    ```\n\n1. Run the following command to turn off public access:\n\n    ```console\n    azd env set AZURE_PUBLIC_NETWORK_ACCESS Disabled\n\n1. Run the following command to change the resource configuration. This command doesn't redeploy the application code because only the infrastructure configuration changed.\n\n    ```console\n    azd provision\n    ```\n\n1. After the provisioning finishes, open the chat app in a browser again. The chat app is no longer accessible because the public endpoint is disabled.\n\n## Access the chat app\n\nTo access the chat app, use a tool such as [Azure VPN Gateway](/azure/vpn-gateway/) or [Azure Virtual Desktop](/azure/virtual-desktop/). Remember that any tool you use to access the app must be secure and compliant with your organization's security policies.\n\n### Clean up resources\n\nThe following steps walk you through the process of cleaning up the resources you used.\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement that you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign in to the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. Locate your currently running codespaces that are sourced from the [Azure-Samples/azure-search-openai-demo](https://github.com/Azure-Samples/azure-search-openai-demo) GitHub repository.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-private-endpoints/github-codespace-dashboard.png\" lightbox=\"./media/get-started-app-chat-private-endpoints/github-codespace-dashboard.png\" alt-text=\"Screenshot that shows all the running codespaces including their status and templates.\":::\n\n1. Open the context menu for the codespace and then select **Delete**.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-private-endpoints/github-codespace-delete.png\" lightbox=\"./media/get-started-app-chat-private-endpoints/github-codespace-delete.png\" alt-text=\"Screenshot that shows the context menu for a single codespace with the Delete option highlighted.\":::\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\n1. Open the **Command** palette, and search for the **Dev Containers** commands.\n1. Select **Dev Containers: Reopen Folder Locally**.\n\n    :::image type=\"content\" source=\"./media/get-started-app-chat-private-endpoints/reopen-local-command-palette.png\" lightbox=\"./media/get-started-app-chat-private-endpoints/reopen-local-command-palette.png\" alt-text=\"Screenshot that shows the Command palette option to reopen the current folder within your local environment.\":::\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. Free up space on your local machine by deleting the container instance, image, and volumes from Docker.\n\n---\n\n## Get help\n\nThis sample repository offers [troubleshooting information](https://github.com/Azure-Samples/azure-search-openai-demo/tree/main#troubleshooting).\n\nIf your issue isn't addressed, add your issue to the repository's [Issues](https://github.com/Azure-Samples/azure-search-openai-demo/issues) webpage.\n\n## Related content\n\n* See the [enterprise chat app GitHub repository](https://github.com/Azure-Samples/azure-search-openai-demo).\n* Build a [chat app with Azure OpenAI](https://aka.ms/azai/chat) best-practices solution architecture.\n* Learn about [access control in generative AI apps with Azure AI Search](https://techcommunity.microsoft.com/t5/azure-ai-services-blog/access-control-in-generative-ai-applications-with-azure/ba-p/3956408).\n"
  },
  {
    "path": "articles/python/get-started-app-chat-scaling-with-azure-api-management.md",
    "content": "---\ntitle: Scale OpenAI for Python with Azure API Management\ndescription: Learn how to add load balancing with Azure API Management to your application to extend the chat app beyond the Azure OpenAI Models in Microsoft Foundry token and model quota limits. \nms.date: 01/30/2026\nms.update-cycle: 180-days\nms.author: rotabor\nauthor: bobtabor-msft\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-python, devx-track-python-ai, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a Python developer new to Azure OpenAI , I want to scale my Azure OpenAI Models in Microsoft Foundry capacity to avoid rate limit errors.\n---\n\n# Scale OpenAI for Python with Azure API Management\n\n[!INCLUDE [apim-load-balancer-intro](../ai/includes/scaling-load-balancer-introduction-azure-api-management.md)]\n\n## Prerequisites\n\n* An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* [Dev containers](https://containers.dev/) are available for both samples, with all the dependencies that are required to complete this article. You can run the dev containers in GitHub Codespaces (in a browser) or locally by using Visual Studio Code.\n\n    #### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n    \n    * Only a [GitHub account](https://www.github.com/login) is required to use GitHub Codespaces.\n    \n    #### [Visual Studio Code](#tab/visual-studio-code)\n\n    * [Docker Desktop](https://www.docker.com/products/docker-desktop/). Start Docker Desktop if it's not already running.\n    * [Visual Studio Code](https://code.visualstudio.com/).\n    * [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers).\n    \n    ---\n\n[!INCLUDE [scaling-load-balancer-apim-procedure.md](../ai/includes/scaling-load-balancer-procedure-azure-api-management.md)]\n\n[!INCLUDE [py-deployment-procedure](../ai/includes/redeploy-procedure-chat-azure-api-management.md)]\n\n[!INCLUDE [capacity.md](../ai/includes/scaling-load-balancer-capacity.md)]\n\n[!INCLUDE [py-apim-cleanup](../ai/includes/scaling-load-balancer-cleanup-azure-api-management.md)]\n\n## Sample code\n\nSamples used in this article include:\n\n* [Python chat app with RAG](https://github.com/Azure-Samples/azure-search-openai-demo)\n* [Azure Load Balancer with Azure API Management](https://github.com/Azure-Samples/openai-apim-lb)\n\n## Related content\n\n* View [Azure API Management diagnostic data in Azure Monitor](/azure/api-management/api-management-howto-use-azure-monitor#view-diagnostic-data-in-azure-monitor).\n* Use [Azure Load Testing](/azure/load-testing/) to load test your chat app.\n"
  },
  {
    "path": "articles/python/get-started-app-chat-scaling-with-azure-container-apps.md",
    "content": "---\ntitle: Scale OpenAI for Python chat sample using RAG\ndescription: Learn how to add load balancing to your application to extend the chat app beyond the Azure OpenAI Models in Microsoft Foundry token and model quota limits. \nms.date: 01/30/2026\nms.update-cycle: 180-days\nms.author: rotabor\nauthor: bobtabor-msft\nms.topic: get-started\nms.subservice: intelligent-apps\nms.custom: devx-track-python, devx-track-python-ai, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a Python developer new to Azure OpenAI Service, I want to scale my Azure OpenAI Models in Microsoft Foundry capacity to avoid rate limit errors.\n---\n\n# Scale OpenAI for Python chat by using RAG with Azure Container Apps\n\n[!INCLUDE [aca-load-balancer-intro](../ai/includes/scaling-load-balancer-introduction-azure-container-apps.md)]\n\n## Prerequisites\n\n* An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* [Dev containers](https://containers.dev/) are available for both samples with all the dependencies that are required to complete this article. You can run the dev containers in GitHub Codespaces (in a browser) or locally by using Visual Studio Code.\n\n    #### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n    \n    * GitHub account\n    \n    #### [Visual Studio Code](#tab/visual-studio-code)\n\n    * [Docker Desktop](https://www.docker.com/products/docker-desktop/). Start Docker Desktop if it's not already running.\n    * [Visual Studio Code](https://code.visualstudio.com/).\n    * [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers).\n    \n    ---\n\n[!INCLUDE [scaling-load-balancer-aca-procedure.md](../ai/includes/scaling-load-balancer-procedure-azure-container-apps.md)]\n\n[!INCLUDE [py-deployment-procedure](../ai/includes/redeploy-procedure-chat.md)]\n\n[!INCLUDE [logs](../ai/includes/scaling-load-balancer-logs-azure-container-apps.md)]\n\n[!INCLUDE [capacity.md](../ai/includes/scaling-load-balancer-capacity.md)]\n\n[!INCLUDE [py-aca-cleanup](../ai/includes/scaling-load-balancer-cleanup-azure-container-apps.md)]\n\n## Sample code\n\nSamples used in this article include:\n\n* [Python chat app with Retrieval Augmented Generation (RAG)](https://github.com/Azure-Samples/azure-search-openai-demo)\n* [Azure Load Balancer with Azure Container Apps](https://github.com/Azure-Samples/openai-aca-lb)\n\n## Related content\n\nUse [Azure Load Testing](/azure/load-testing/) to load test your chat app.\n"
  },
  {
    "path": "articles/python/get-started-app-chat-template.md",
    "content": "---\ntitle: \"Get started sample: Chat using your data in Python\"\ndescription: Search your own data with a chat app sample in Python, and get started with Azure OpenAI Service and Retrieval Augmented Generation (RAG) in Azure AI Search.\nms.date: 01/15/2025\nms.update-cycle: 180-days\nms.topic: how-to\nms.subservice: intelligent-apps\nms.custom: devx-track-python, devx-track-python-ai, devx-track-extended-azdevcli, build-2024-intelligent-apps\nms.collection: ce-skilling-ai-copilot\n# CustomerIntent: As a python developer new to Azure OpenAI, I want to deploy and use a sample app configured with my own business data, so I can learn from the sample code.\n---\n\n# Get started: Chat using your own data (Python sample)\n\nThis article shows how to deploy and run the **Chat with your own data sample** [by using example code for Python](https://github.com/Azure-Samples/azure-search-openai-demo). This sample chat application is built with Python, Azure OpenAI Service, and [Retrieval Augmented Generation (RAG)](/azure/search/retrieval-augmented-generation-overview) through Azure AI Search.\n\nThe app provides answers to user questions about employee benefits at a fictional company. It uses Retrieval-Augmented Generation (RAG) to reference content from supplied PDF files, which may include:\n\n* An employee handbook\n* A benefits overview document\n* A list of company roles and expectations\n\nBy analyzing these documents, the app can respond to natural language queries with accurate, contextually relevant answers. This approach demonstrates how you can use your own data to power intelligent, domain-specific chat experiences with Azure OpenAI and Azure AI Search.\n\nYou also learn how to configure the app’s settings to modify its response behavior.\n\nAfter completing the steps in this article, you can begin customizing the project with your own code. This article is part of a series that guides you through building a chat app with Azure OpenAI Service and Azure AI Search. Other articles in the series include:\n\n* [.NET](/dotnet/ai/get-started-app-chat-template)\n* [Java](../java/ai/get-started-app-chat-template.md)\n* [JavaScript](../javascript/ai/get-started-app-chat-template.md)\n* [JavaScript frontend with Python backend](../javascript/ai/chat-app-with-separate-front-back-end.md)\n\n> [!NOTE]\n> This article is based on one or more [AI app templates](../ai/intelligent-app-templates.md), which serve as well-maintained reference implementations. These templates are designed to be easy to deploy and provide a reliable, high-quality starting point for building your own AI applications.\n\n## Sample app architecture\n\nThe following diagram shows a simple architecture of the chat app.\n\n:::image type=\"content\" source=\"./media/get-started-app-chat-template/simple-architecture-diagram.png\" border=\"false\" alt-text=\"Diagram that shows the architecture for the sample from the client to the back-end chat app with data sources.\":::\n\nKey components of the architecture include:\n\n* A web application that hosts the interactive chat interface (usually built with Python Flask or JavaScript/React) and sends user questions to the backend for processing.\n* An Azure AI Search resource that performs intelligent search over indexed documents (PDFs, Word files, etc.) and returns relevant document excerpts (chunks) for use in responses.\n* An Azure OpenAI Service instance that:\n  * Converts documents and user questions into vector representations for semantic similarity search.\n  * Extracts important keywords to refine Azure AI Search queries.\n  * Synthesizes final responses using the retrieved data and user query.\n\nThe typical flow of the chat app is as follows:\n\n* **User submits a question**: A user enters a natural language question through the web app interface.\n* **Azure OpenAI processes the question**: The backend uses Azure OpenAI to:\n  * Generate an embedding of the question using the text-embedding-ada-002 model.\n  * Optionally extract keywords to refine search relevance\n* **Azure AI Search retrieves relevant data**: The embedding or keywords are used to to perform a semantic search over indexed content (such as, PDFs) in Azure AI Search.\n* **Combine results with the question**: The most relevant document excerpts (chunks) are combined with the user’s original question.\n* **Azure OpenAI generates a response**: The combined input is passed to a GPT model (such as, gpt-35-turbo or gpt-4), which generates a context-aware answer.\n* **The response is returned to the user**: The generated answer is displayed in the chat interface.\n\n## Prerequisites\n\nA [development container](https://containers.dev/) environment is available with all dependencies required to complete this article. You can run the development container in GitHub Codespaces (in a browser) or locally by using Visual Studio Code.\n\nTo use this article, you need the following prerequisites:\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n* An Azure subscription. [Create a free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n\n* Azure account permissions. Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions. Roles like [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner) satisfy this requirement.\n\n* Access granted to Azure OpenAI in your Azure subscription. In most cases, you can create custom content filters and manage severity levels with general access to Azure OpenAI models. Registration for approval-based access isn't required for general access. For more information, see [Limited Access features for Foundry Tools](/azure/ai-services/cognitive-services-limited-access).\n\n* Content filter or abuse modifications (optional). To create custom content filters, change severity levels, or support abuse monitoring, you need formal access approval. You can apply for access by completing the necessary registration forms. For more information, see [Registration for modified content filters and/or abuse monitoring](https://aka.ms/oai/access).\n\n* Support and troubleshooting access. For access to troubleshooting, open a support issue on the GitHub repository.\n\n* A GitHub account. Required to fork the repository and use GitHub Codespaces or clone it locally.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n* An Azure subscription. [Create a free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n\n* Azure account permissions. Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions. Roles like [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner) satisfy this requirement.\n\n* Access granted to Azure OpenAI in your Azure subscription. In most cases, you can create custom content filters and manage severity levels with general access to Azure OpenAI models. Registration for approval-based access isn't required for general access. For more information, see [Limited Access features for Foundry Tools](/azure/ai-services/cognitive-services-limited-access).\n\n* Content filter or abuse modifications (optional). To create custom content filters, change severity levels, or support abuse monitoring, you need formal access approval. You can apply for access by completing the necessary registration forms. For more information, see [Registration for modified content filters and/or abuse monitoring](https://aka.ms/oai/access).\n\n* The [Azure Developer CLI (azd)](/azure/developer/azure-developer-cli). For installation instructions, see [Install or update the Azure Developer CLI](/azure/developer/azure-developer-cli/install-azd).\n\n* [Docker Desktop](https://www.docker.com/products/docker-desktop/). Make sure Docker Desktop is installed and running before beginning.\n\n* [Visual Studio Code](https://code.visualstudio.com/). Install the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) to enable containerized development.\n\n---\n\n### Usage cost for sample resources\n\nMost resources used in this architecture fall under basic or consumption-based pricing tiers. This means you only pay for what you use, and charges are typically minimal during development or testing.\n\nTo complete this sample, there may be a small cost incurred from using services like Azure OpenAI, AI Search, and storage. Once you're done evaluating or deploying the app, you can delete all provisioned resources to avoid ongoing charges.\n\nFor a detailed breakdown of expected costs, see the [Cost estimation](https://github.com/Azure-Samples/azure-search-openai-demo#cost-estimation) in the GitHub repository for the sample.\n\n## Open development environment\n\nBegin by setting up a development environment that has all the dependencies installed to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\n* An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* Azure account permissions. Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions. Roles like [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner) satisfy this requirement.\n* A GitHub account. Required to fork the repository and use GitHub Codespaces or clone it locally.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\n* An Azure subscription. [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n* Azure account permissions. Your Azure Account must have Microsoft.Authorization/roleAssignments/write permissions. Roles like [User Access Administrator](/azure/role-based-access-control/built-in-roles#user-access-administrator) or [Owner](/azure/role-based-access-control/built-in-roles#owner) satisfy this requirement.\n* [Azure Developer CLI](/azure/developer/azure-developer-cli).\n* [Docker Desktop](https://www.docker.com/products/docker-desktop/). * [Docker Desktop](https://www.docker.com/products/docker-desktop/). Make sure Docker Desktop is installed and running before beginning.\n* [Visual Studio Code](https://code.visualstudio.com/).\n* [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers).\n\n---\n\n## Open a development environment\n\nUse the following instructions to deploy a preconfigured development environment containing all required dependencies to complete this article.\n\n#### [GitHub Codespaces (recommended)](#tab/github-codespaces)\n\nFor the simplest and most streamlined setup, use [GitHub Codespaces](https://docs.github.com/codespaces). GitHub Codespaces runs a development container managed by GitHub and provides [Visual Studio Code for the Web](https://code.visualstudio.com/docs/editor/vscode-web) as the user interface (UI). This environment includes all required tools, SDKs, extensions, and dependencies preinstalled—so you can start developing immediately without manual configuration.\n\nUsing Codespaces ensures:\n\n* Correct developer tools and versions are already installed.\n* No need to install Docker, VS Code, or extensions locally.\n* Fast onboarding and reproducible environment setup.\n\n> [!IMPORTANT]\n> All GitHub accounts can use GitHub Codespaces for up to 60 hours free each month with 2 core instances. If you exceed the free quota or use larger compute options, standard GitHub Codespaces billing rates apply. For more information, see [GitHub Codespaces - Monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-your-products/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. To begin working with the sample project, create a new GitHub codespace on the `main` branch of the [`Azure-Samples/azure-search-openai-demo`](https://github.com/Azure-Samples/azure-search-openai-demo) GitHub repository.\n\n   Right-click the **GitHub Codespaces - Open** option at the top of the repository page and select **Open link in new window**. This ensures that the development container is launched in a full-screen, dedicated browser tab, giving you access to both the source code and the built-in documentation.\n\n   [![Image of the 'Open in GitHub Codespaces' option.](https://github.com/codespaces/badge.svg)](https://codespaces.new/Azure-Samples/azure-search-openai-demo)\n\n1. On the **Create a new codespace** page, review the codespace configuration settings, and then select **Create codespace**:\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/github-create-codespace.png\" alt-text=\"Screenshot of the confirmation screen to create a new GitHub codespace for the sample.\":::\n\n   Wait for the GitHub codespace to start. The startup process can take a few minutes.\n\n1. After the GitHub codespace opens, sign in to Azure with the Azure Developer CLI by entering the following command in the Terminal pane of the codespace:\n\n   ```bash\n   azd auth login\n   ```\n\n   GitHub displays a security code in the Terminal pane.\n\n   1. Copy the security code in the Terminal pane and select **Enter**. A browser window opens.\n\n   1. At the prompt, paste the security code into the browser field.\n\n   1. Follow the instructions to authenticate with your Azure account.\n\nYou complete the remaining GitHub Codespaces tasks in this article in the context of this development container.\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nThe [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) for Visual Studio Code requires [Docker](https://docs.docker.com/) installed on your local machine. The extension hosts the development container locally by using the Docker host with the correct developer tools and dependencies preinstalled to complete this article.\n\n1. On your local computer, create a project directory named **my-intelligent-app** and change into the directory:\n\n   ```bash\n   mkdir my-intelligent-app\n   cd my-intelligent-app\n   ```\n\n1. Open Visual Studio Code in the project directory:\n\n   ```bash\n   code .\n   ```\n\n1. In Visual Studio Code, open the Terminal pane by selecting **Terminal** > **New Terminal** or use the keyboard shortcut **Ctrl**+**Shift**+**`** (back tick).\n\n1. In the Visual Studio Code Terminal pane, run the following command to download the GitHub repository to your local computer:\n\n   ```bash\n   azd init -t azure-search-openai-demo\n   ```\n\n1. At the prompt, enter an environment name. The name is added as a suffix to the directory name **my-intelligent-app**. Use a short name with all lowercase letters and dashes (`-`), such as **myenv**. Don't use uppercase letters, numbers, or special characters. The environment name is used as part of the resource group name.\n\n   Visual Studio Code opens the contents of the _my-intelligent-app_ project directory in the file **Explorer** view:\n\n   :::image type=\"content\" source=\"media/get-started-app-chat-template/initial-application.png\" alt-text=\"Screenshot of the  my-intelligent-app project directory open in the Explorer view in Visual Studio Code.\":::\n\n1. On the **Activity Bar**, select **Remote Explorer** for Dev Containers, and then select the **reopen the current folder in a container** link:\n\n   :::image type=\"content\" source=\"media/get-started-app-chat-template/reopen-container-link.png\" alt-text=\"Screenshot that shows how to select the 'reopen the current folder in a container' link in the Dev Containers Remote Explorer view.\":::\n\n   It can take some time for your project directory to open in a dev container. To monitor the progress, select **show log** on the progress dialog:\n\n   :::image type=\"content\" source=\"media/get-started-app-chat-template/dev-container-show-log.png\" alt-text=\"Screenshot that shows how to select 'show log' on the Dev Containers operation progress dialog.\":::\n\n   Wait for your project directory to open in the **Remote Explorer** view, before you continue to the next step.\n\n1. In the Visual Studio Code Terminal pane, sign in to Azure with the Azure Developer CLI (`azd`):\n\n   ```bash\n   azd auth login\n   ```\n\n   Copy the code from the Terminal pane and paste it into a browser. Follow the system instructions to authenticate with your Azure account.\n\nYou complete the remaining exercises in this project in the context of this development container.\n\n---\n\n## Deploy chat app to Azure\n\nThe sample repository includes everything you need to deploy a Chat with your own data application to Azure, including:\n\n* Application source code (Python)\n* Infrastructure-as-code files (Bicep)\n* Configuration for GitHub integration and CI/CD (optional)\n\nUse the following steps to deploy the app with the Azure Developer CLI (azd).\n\n> [!IMPORTANT]\n> Azure resources created in this section—especially Azure AI Search—can begin accruing charges immediately upon provisioning, even if the deployment is interrupted before completion. To avoid unexpected charges, monitor your Azure usage and delete unused resources promptly after testing.\n\n1. In the Visual Studio Code Terminal pane, create the Azure resources and deploy the source code by running the following `azd` command:\n\n   ```bash\n   azd up\n   ```\n\n1. The process prompts you for one or more of the following settings based on your configuration:\n\n   * **Environment name**: This value is used as part of the resource group name. Enter a short name with lowercase letters and dashes (`-`), such as **myenv**. Uppercase letters, numbers, and special characters aren't supported.\n\n   * **Subscription**: Select a subscription to create the resources. If you don't see your desired subscription, use the arrow keys to scroll the full list of available subscriptions.\n\n   * **Location**: This region location is used for most resources, including hosting. Select a region location near you geographically.\n\n   * **Location for OpenAI model or Document Intelligence resource**: Select the location nearest you geographically. If the region you selected for your **Location** is available for this setting, select the same region.\n\n   It take can take some time for the app to deploy. Wait for the deployment to complete before continuing.\n\n1. After the app successfully deploys, the Terminal pane displays an endpoint URL:\n\n   :::image type=\"content\" source=\"media/get-started-app-chat-template/azd-deployed-endpoint.png\" border=\"false\" alt-text=\"Screenshot that shows the endpoint URL for the deployed app as reported after completion of the 'azd up' process.\":::\n\n1. Select the endpoint URL to open the chat application in a browser:\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/browser-chat-with-your-data.png\" border=\"false\" alt-text=\"Screenshot of the chat app showing several suggestions for chat input and the chat text box to enter a question.\":::\n\n## Use chat app to get answers from PDF files\n\nThe chat app is preloaded with employee benefits information from [PDF files](https://github.com/Azure-Samples/azure-search-openai-demo/tree/main/data). You can use the chat app to ask questions about the benefits. The following steps walk you through the process of using the chat app. Your answers might vary as the underlying models are updated.\n\n1. In the chat app, select the **What happens in a performance review?** option, or enter the same text in the chat text box. The app returns the initial response:\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/browser-chat-initial-answer.png\" border=\"false\" lightbox=\"./media/get-started-app-chat-template/browser-chat-initial-answer.png\" alt-text=\"Screenshot of the initial answer from the chat app for the question, What happens in a performance review?\":::\n\n1. In the answer box, select a citation:\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/browser-chat-initial-answer-citation.png\" border=\"false\" lightbox=\"./media/get-started-app-chat-template/browser-chat-initial-answer-citation.png\" alt-text=\"Screenshot that shows a citation highlighted in the answer box for the chat app.\":::\n\n1. GitHub Codespaces opens the right **Citation** pane with three tabbed regions and the focus is on the **Citation** tab:\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/browser-chat-document-tabs.png\" border=\"false\" lightbox=\"./media/get-started-app-chat-template/browser-chat-document-tabs.png\" alt-text=\"Screenshot of the right pane open in GitHub Codespaces with information visible for the Citation tab.\":::\n\n   GitHub Codespaces provides three tabs of information to help you understand how the chat app generated the answer:\n\n   | Tab | Description |\n   | --- | --- |\n   | **Thought Process**    | Displays a script of the question/answer interactions in the chat. You can view the content provided by the chat app `system`, questions entered by the `user`, and clarifications made by the system `assistant`. |\n   | **Supporting Content** | Lists the information used to answer your question and the source material. The number of source material citations is specified by the **Developer settings**. The default number of citations is **3**. |\n   | **Citation**           | Shows the original source contain for the selected citation. |\n\n1. When you're done, select the currently selected tab in the right pane. The right pane closes.\n\n## Use settings to change response behavior\n\nThe specific OpenAI model determines the intelligence of the chat and the settings used to interact with the model. The **Developer settings** option opens the **Configure answer generation** pane where you can change settings for the chat app:\n\n:::image type=\"content\" source=\"./media/get-started-app-chat-template/browser-chat-developer-settings.png\" border=\"false\" lightbox=\"./media/get-started-app-chat-template/browser-chat-developer-settings.png\" alt-text=\"Screenshot of the developer settings available in the right pane in the chat app.\":::\n\n| Setting | Description |\n| --- | --- |\n| **Override prompt template** | Overrides the prompt used to generate the answer based on the question and search results. |\n| **Temperature** | Sets the temperature of the request to the large language model (LLM) that generates the answer. Higher temperatures result in more creative responses, but they might be less grounded. |\n| **Seed** | Sets a seed to improve the reproducibility of the model's responses. The seed can be any integer. |\n| **Minimum search score** | Sets a minimum score for search results returned from Azure AI Search. The score range depends on whether you use [Hybrid (default), Vectors only, or Text only](/azure/search/hybrid-search-ranking#scores-in-a-hybrid-search-results) for the **Retrieval mode** setting. |\n| **Minimum reranker score** | Sets a minimum score for search results returned from the semantic reranker. The score always ranges between 0-4. The higher the score, the more semantically relevant the result is to the question. |\n| **Retrieve this many search results** | Sets the number of search results to retrieve from Azure AI Search. More results can increase the likelihood of finding the correct answer, but might lead to the model getting 'lost in the middle.' You can see the returned sources in the **Thought Process** and **Supporting Content** tabs of the **Citation** pane. |\n| **Include category** | Specifies the categories to include when generating the search results. Use the dropdown list to make your selection. The default action is to include **All** categories. |\n| **Exclude category** | Specifies any categories to exclude from the search results. There are no categories used in the default data set. |\n| **Use semantic ranker for retrieval** | Enables the Azure AI Search [semantic ranker](/azure/search/semantic-search-overview#what-is-semantic-search), a model that reranks search results based on semantic similarity to the user's query. |\n| **Use semantic captions** | Sends semantic captions to the LLM instead of the full search result. A semantic caption is extracted from a search result during the process of semantic ranking. |\n| **Suggest follow-up questions** | Asks the LLM to suggest follow-up questions based on the user's query. |\n| **Retrieval mode** | Sets the retrieval mode for the Azure AI Search query. The default action is **Vectors + Text (Hybrid)**, which uses a combination of vector search and full text search. The **Vectors** option uses only vector search. The **Text** option uses only full text search. The **Hybrid** approach is optimal. |\n| **Stream chat completion responses** | Continuously streams the response to the chat UI as the content is generated. |\n\nThe following steps walk you through the process of changing the settings.\n\n1. In the browser, select the **Developer settings** option.\n\n1. Select the **Suggest follow-up questions** checkbox to enable the option, and select **Close** to apply the setting change.\n\n1. In the chat app, reask the question, this time by entering the text in the question box:\n\n   ```text\n   What happens in a performance review?\n   ```\n\n   The chat app answer now includes suggested follow-up questions:\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/browser-chat-question-suggestions.png\" border=\"false\" alt-text=\"Screenshot that shows how the chat app provides suggested follow-up questions after the answer.\":::\n\n1. Select the **Developer settings** option again, and unselect **Use semantic ranker for retrieval** option. Close the settings.\n\n1. Ask the same question again, and notice the difference in the answer from the chat app.\n\n   **With the Semantic ranker**: \"During a performance review at Contoso Electronics, your supervisor will discuss your performance over the past year and provide feedback on areas for improvement. You will also have the opportunity to discuss your goals and objectives for the upcoming year. The review is a two-way dialogue between managers and employees, and it is encouraged for employees to be honest and open during the process (1). The feedback provided during the review should be positive and constructive, aimed at helping employees develop and grow in their roles. Employees will receive a written summary of their performance review, which will include a rating of their performance, feedback, and goals and objectives for the upcoming year (1).\"\n\n   **Without the Semantic ranker**: \"During a performance review at Contoso Electronics, your supervisor will discuss your performance over the past year and provide feedback on areas for improvement. It is a two-way dialogue where you are encouraged to be honest and open (1). The feedback provided during the review should be positive and constructive, aimed at helping you develop and grow in your role. You will receive a written summary of the review, including a rating of your performance, feedback, and goals for the upcoming year (1).\"\n\n## Clean up resources\n\nAfter you complete the exercise, it's a best practice to remove any resources that are no longer required.\n\n### Clean up Azure resources\n\nThe Azure resources created in this article are billed to your Azure subscription. If you don't expect to need these resources in the future, delete them to avoid incurring more charges.\n\nDelete the Azure resources and remove the source code by running the following `azd` command:\n\n```bash\nazd down --purge --force\n```\n\nThe command switches include:\n\n* `purge`: Deleted resources are immediately purged. This option allows you to reuse the Azure OpenAI tokens per minute (TPM) metric.\n* `force`: The deletion happens silently, without requiring user consent.\n\n### Clean up GitHub Codespaces\n\n#### [GitHub Codespaces](#tab/github-codespaces)\n\nDeleting the GitHub Codespaces environment ensures that you can maximize the amount of free per-core hours entitlement that you get for your account.\n\n> [!IMPORTANT]\n> For more information about your GitHub account's entitlements, see [GitHub Codespaces - Monthly included storage and core hours](https://docs.github.com/billing/managing-billing-for-your-products/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts).\n\n1. Sign in to the [GitHub Codespaces dashboard](https://github.com/codespaces).\n\n1. On the dashboard, locate your currently running codespaces sourced from the [`Azure-Samples/azure-search-openai-demo`](https://github.com/Azure-Samples/azure-search-openai-demo) GitHub repository:\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/github-codespace-dashboard.png\" lightbox=\"./media/get-started-app-chat-template/github-codespace-dashboard.png\" alt-text=\"Screenshot of all the running GitHub Codespaces, including their status and templates.\":::\n\n1. Open the context menu for the codespace and select **Delete**:\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/github-codespace-delete.png\" lightbox=\"./media/get-started-app-chat-template/github-codespace-delete.png\" alt-text=\"Screenshot of the context menu for a single codespace with the delete option highlighted.\":::\n\n#### [Visual Studio Code](#tab/visual-studio-code)\n\nYou aren't necessarily required to clean up your local environment, but you can stop the running development container and return to running Visual Studio Code in the context of a local workspace.\n\n* Open the **Command Palette**, search for the **Dev Containers** commands, and then select **Dev Containers: Reopen Folder Locally**:\n\n   :::image type=\"content\" source=\"./media/get-started-app-chat-template/reopen-local-command-palette.png\" alt-text=\"Screenshot of the Command Palette option to reopen the current folder within your local environment in Visual Studio Code.\":::\n\n> [!TIP]\n> Visual Studio Code stops the running development container, but the container still exists in Docker in a stopped state. You always have the option to deleting the container instance, container image, and volumes from Docker to free up more space on your local machine.\n\n---\n\n## Get help\n\nThis sample repository offers [troubleshooting information](https://github.com/Azure-Samples/azure-search-openai-demo/tree/main#troubleshooting).\n\nIf your issue isn't addressed, add your issue to the repository's [Issues](https://github.com/Azure-Samples/azure-search-openai-demo/issues) webpage.\n\n## Related content\n\n* [Get the source code for the sample used in this article](https://github.com/Azure-Samples/azure-search-openai-demo)\n* [Build a chat app with Azure OpenAI](https://aka.ms/azai/chat) best practice solution architecture\n* [Access control in Generative AI Apps with Azure AI Search](https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/access-control-in-generative-ai-applications-with-azure-ai-search/3956408)\n* [Build an Enterprise ready OpenAI solution with Azure API Management](https://techcommunity.microsoft.com/blog/appsonazureblog/build-an-enterprise-ready-azure-openai-solution-with-azure-api-management/3907562)\n* [Outperforming vector search with hybrid retrieval and ranking capabilities](https://techcommunity.microsoft.com/blog/azure-ai-foundry-blog/azure-ai-search-outperforming-vector-search-with-hybrid-retrieval-and-reranking/3929167)\n"
  },
  {
    "path": "articles/python/get-started.md",
    "content": "---\ntitle: Get started with Python on Azure\ndescription: A starting point with links to everything a Python developer needs to know about Azure.\nms.date: 01/16/2026\nms.topic: get-started\nms.custom: devx-track-python, vscode-azure-extension-update-completed\n---\n\n# Get started with Python on Azure\n\nIf you're new to developing applications for the cloud, this short series of 8 articles is the best place to start.\n\n* Part 1: [Azure for developers overview](/azure/developer/intro/azure-developer-overview)\n* Part 2: [Key Azure services for developers](/azure/developer/intro/azure-developer-key-services)\n* Part 3: [Hosting applications on Azure](/azure/developer/intro/hosting-apps-on-azure)\n* Part 4: [Connect your app to Azure services](/azure/developer/intro/connect-to-azure-services)\n* Part 5: [How do I create and manage resources in Azure?](/azure/developer/intro/azure-developer-create-resources)\n* Part 6: [Key concepts for building Azure apps](/azure/developer/intro/azure-developer-key-concepts)\n* Part 7: [How am I billed?](/azure/developer/intro/azure-developer-billing)\n* Part 8: [Versioning policy for Azure services, SDKs, and CLI tools](/azure/developer/intro/azure-service-sdk-tool-versioning)\n\n## Create an Azure Account\n\nTo develop Python applications with Azure, you need an Azure account. Your Azure account is the credentials you use to sign-in to Azure with and what you use to create Azure resources.\n\nIf you're using Azure at work, talk to your company's cloud administrator to get your credentials used to sign-in to Azure.\n\nOtherwise, you can create an [Azure account for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) and receive 12 months of popular services for free and a $200 credit to explore Azure for 30 days.\n\n> [!div class=\"nextstepaction\"]\n> [Create an Azure account for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\n## Create and manage resources\n\nTo use Azure resources like databases, message queues, file storage, and so on, you must first create an instance of the resource. Creating resources involves:\n\n* choosing capacity or computing options\n* adding the new resource to a resource group\n* selecting the region of the world where the service runs\n* giving the service a unique name\n\nThere are several tools you can use to create and manage Azure resources, depending on your scenario:\n\n- [Azure portal](https://portal.azure.com) - If you're new to Azure and want a web-based user interface to create and manage a couple of resources.\n- [Azure CLI](/cli/azure/install-azure-cli) - If you're more comfortable with command line interfaces.\n- [Azure PowerShell](/powershell/azure/) - If you prefer a PowerShell style syntax in their CLI.\n- [Azure Developer CLI](/azure/developer/azure-developer-cli/) - When you want to create repeatable deployments involving many Azure resources with intricate dependencies. Requires learning Bicep templates.\n- [Azure Tools extension pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) - The extension pack contains extensions for working with some of the most popular Azure services in one convenient package.\n\nYou can also use the [Azure Management Libraries for Python](https://azure.github.io/azure-sdk/releases/latest/mgmt/python.html) to create and manage resources. The management libraries allow you to use Python to implement custom deployment and management functionality. Here are a few articles that can help you get started:\n\n* [Create a resource group](./sdk/examples/azure-sdk-example-resource-group.md)\n* [List groups and resources](./sdk/examples/azure-sdk-example-list-resource-groups.md)\n* [Create Azure storage](./sdk/examples/azure-sdk-example-storage.md)\n* [Create and deploy a web app](./sdk/examples/azure-sdk-example-web-app.md)\n* [Create and query a database](./sdk/examples/azure-sdk-example-database.md)\n* [Create a virtual machine](./sdk/examples/azure-sdk-example-virtual-machines.md)\n\n## Write your Python app\n\nDeveloping on Azure requires [Python](https://www.python.org/downloads/) 3.9 or higher. To verify the version of Python on your workstation, in a console window type the command `python3 --version` for macOS/Linux or `py --version` for Windows.\n\nUse your favorite tools to write your Python app. If you use Visual Studio Code, you should try the [Python extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python).\n\nMost of the instructions in this set of articles use a virtual environment because it's a best practice. Feel free to use any virtual environment you want, but the article instructions standardize on `venv`.\n\n### Use client libraries\n\nAs you're getting started, the articles instruct you on which Python on Azure libraries to install and reference using the `pip` utility.\n\nAt some point, you might want to [install and reference](./sdk/azure-sdk-install.md) the [Azure SDK for Python client libraries](https://azure.github.io/azure-sdk/releases/latest/python.html) without having to follow the instructions in an article. The [Azure SDK Overview](./sdk/azure-sdk-overview.md) is a great starting point.\n\n### Authenticate your app to Azure\n\nWhen you use the Azure SDK for Python, you must add authentication logic to your app. How your app authenticates depends on whether you're running your app locally during development and testing, hosting the app on your own servers, or hosting the app in Azure. Read [Authenticate Python apps to Azure services by using the Azure SDK for Python](./sdk/authentication-overview.md) to understand more about authentication on Azure.\n\nYou'll also need to set up access policies that control what identities (service principals and/or application IDs) are able to access those resources. Access policies are managed through Azure [Role-Based Access Control (RBAC)](/azure/role-based-access-control/overview); some services have more specific access controls as well. As a cloud developer working with Azure, make sure to familiarize yourself with Azure RBAC because you use it with just about any resource that has security concerns.\n\n### Add cross-cutting concerns\n\n- Manage your application secrets using [Azure Key Vault](/azure/key-vault/secrets/quick-create-python)\n- Gain visibility into your app by logging with [Azure Monitor](./sdk/azure-sdk-logging.md)\n\n## Host your Python app\n\nIf you want your app code to run on Azure, you have several options as described in [Hosting applications on Azure](/azure/developer/intro/hosting-apps-on-azure).\n\nIf you're building web apps or APIs (Django, Flask, FastAPI, and so on), consider:\n\n- [Azure App Service](/azure/app-service/quickstart-python)\n- [Azure App Service (already containerized)](tutorial-containerize-simple-web-app-for-app-service.md)\n- [Azure Container Apps](containers-in-azure-overview-python.md)\n- [Azure Kubernetes cluster](/azure/aks/learn/quick-kubernetes-deploy-cli)\n\nIf you're building a web application, see [Configure your local environment for deploying Python web apps on Azure](configure-python-web-app-local-environment.md).\n\nAlso, if you're building a web API, you should consider using [Azure API Management](/azure/api-management/api-management-key-concepts).\n\nIf you're building back-end processes:\n\n- [Azure Functions](/azure/azure-functions/create-first-function-vs-code-python)\n- [Azure App Service WebJobs](/azure/app-service/webjobs-create)\n- [Azure Container Apps](/azure/container-apps/background-processing)\n\n## Next steps\n\n* [Develop a Python web app](/azure/app-service/quickstart-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/breadcrumb/toc.json)\n* [Develop a container app](./containers-in-azure-overview-python.md)\n* [Learn to use the Azure libraries for Python](./sdk/azure-sdk-overview.md)\n"
  },
  {
    "path": "articles/python/includes/cli-auth-note.md",
    "content": "---\nms.topic: include\nms.date: 01/11/2023\n---\n\nThis code uses CLI-based authentication (using `AzureCliCredential`) because it demonstrates actions that you might otherwise do with the Azure CLI directly. In both cases, you're using the same identity for authentication. Depending on your environment, you might need to run `az login` first to authenticate.\n\nTo use such code in a production script (for example, to automate VM management), use `DefaultAzureCredential` (recommended) with a service principal based method as described in [How to authenticate Python apps with Azure services](../sdk/authentication-overview.md).\n"
  },
  {
    "path": "articles/python/includes/create-environment-options.md",
    "content": "---\nms.topic: include\nms.date: 05/20/2025\n---\n\n* Configure a Python virtual environment using `venv` or your tool of choice. To start using the virtual environment, be sure to activate it. To install python, see [Install Python](https://www.python.org/downloads/).\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli\n    #!/bin/bash\n    # Create a virtual environment\n    python -m venv .venv\n    # Activate the virtual environment\n    source .venv/Scripts/activate # only required for Windows (Git Bash)\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```azurecli\n    # PowerShell syntax\n    # Create a virtual environment\n    python -m venv venv\n    # Activate the virtual environment\n    . .\\venv\\Scripts\\Activate.ps1\n    ```\n\n    ---\n\n* Use a [conda environment](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html). To install Conda, see [Install Miniconda](https://docs.conda.io/en/latest/miniconda.html).\n\n* Use a [Dev Container](https://containers.dev/) in [Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) or [GitHub Codespaces](https://docs.github.com/en/codespaces/overview)."
  },
  {
    "path": "articles/python/includes/proxy-note.md",
    "content": "---\nms.topic: include\nms.date: 06/23/2022\n---\n\n> [!NOTE]\n> If you see the error **\"Cannot find subscription with name [subscription ID]\"**, this may be because you are behind a proxy and unable to reach the Azure API. Configure `HTTP_PROXY` and `HTTPS_PROXY` environment variables with your proxy information in your terminal:\n>\n> ```cmd\n> # Windows\n> set HTTPS_PROXY=https://username:password@proxy:8080\n> set HTTP_PROXY=http://username:password@proxy:8080\n> ```\n>\n> ```bash\n> # macOS/Linux\n> export HTTPS_PROXY=https://username:password@proxy:8080\n> export HTTP_PROXY=http://username:password@proxy:8080\n> ```\n"
  },
  {
    "path": "articles/python/includes/resource-group-begin-delete.md",
    "content": "---\nms.topic: include\nms.date: 03/04/2024\n---\n\nYou can also use the [`ResourceManagementClient.resource_groups.begin_delete`](/python/api/azure-mgmt-resource/azure.mgmt.resource.resources.operations.resourcegroupsoperations#azure-mgmt-resource-resources-operations-resourcegroupsoperations-begin-delete) method to delete a resource group from code. The code in [Example: Create a resource group](../sdk/examples/azure-sdk-example-resource-group.md) demonstrates usage.\n"
  },
  {
    "path": "articles/python/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure for Python Developers\nsummary: |\n  You can deploy your Python applications to Azure in various environments, including web apps, serverless functions, containers, and machine learning models. Azure offers flexible hosting options to suit different architectural and scalability needs. To interact with Azure services programmatically, use the Azure SDK for Python. This set of libraries streamlines tasks such as authentication, resource management, and service integration—making it easier to build secure, scalable cloud applications with Python.\n\nmetadata:\n  title: Azure for Python developers\n  description: Get started developing with Python on Azure using services like Azure Functions, App Service, Container Apps, Machine Learning, Storage, Database for PostgreSQL, and the Azure SDK for Python.\n  ms.date: 06/02/2025\n  ms.topic: landing-page\n  ms.collection: collection\n  ms.service: azure-python\n  ms.devlang: python\n  ms.custom: devx-track-python, py-fresh-zinc\n\nlandingContent:\n  - title: Azure libraries (SDK)\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Get started\n            url: get-started.md\n          - text: Get to know the Azure libraries\n            url: sdk/azure-sdk-overview.md\n          - text: Learn library usage patterns\n            url: sdk/azure-sdk-library-usage-patterns.md\n          - text: Authenticate with Azure services\n            url: sdk/authentication-overview.md\n  - title: Web apps\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Quickly create and deploy new Django / Flask / FastAPI apps\n            url: ./quickstart-python-web-azd-templates.md\n          - text: Deploy a Django or Flask Web App\n            url: /azure/app-service/quickstart-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n          - text: Deploy Web App with PostgreSQL\n            url: /azure/app-service/tutorial-python-postgresql-app?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n          - text: Deploy Web App with Managed Identity\n            url: ./tutorial-python-managed-identity-cli.md\n          - text: Deploy using GitHub Actions\n            url: ./python-web-app-github-actions-app-service.md\n  - title: AI\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Develop using Foundry Tools\n            url: ./azure-ai-for-python-developers.md\n          - text: Python enterprise RAG chat sample\n            url: ./get-started-app-chat-template.md\n  - title: Containers\n    linkLists:\n      - linkListType: tutorial\n        links:\n          - text: Python containers overview\n            url: ./containers-in-azure-overview-python.md\n          - text: Deploy to App Service\n            url: ./tutorial-containerize-deploy-python-web-app-azure-01.md\n          - text: Deploy to Container Apps\n            url: ./tutorial-deploy-python-web-app-azure-container-apps-01.md\n          - text: Deploy a Kubernetes cluster\n            url: /azure/aks/learn/quick-kubernetes-deploy-cli?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n  - title: Data and storage\n    linkLists:\n      - linkListType: quickstart\n        links: \n          - text: SQL databases\n            url: quickstarts-data-solutions.md#databases\n          - text: Tables, blobs, files, NoSQL\n            url: quickstarts-data-solutions.md#nosql-blobs-tables-files-graphs-and-caches\n          - text: Big data and analytics\n            url: quickstarts-data-solutions.md#big-data-and-analytics\n  - title: Machine learning\n    linkLists:      \n      - linkListType: how-to-guide\n        links:\n          - text: Create an ML experiment\n            url: /azure/machine-learning/quickstart-create-resources\n          - text: Train a prediction model\n            url: /azure/machine-learning/tutorial-azure-ml-in-a-day\n          - text: Create ML pipelines\n            url: /azure/machine-learning/tutorial-pipeline-python-sdk\n          - text: Use ready-made Foundry Tools (face, speech, text, image, etc.)\n            url: quickstarts-cognitive-services.md\n          - text: Serverless, Cloud ETL\n            url: ./tutorial-deploy-azure-cloud-python-etl-01-overview.md\n  - title: Serverless functions\n    linkLists:\n      - linkListType: how-to-guide\n        links:\n          - text: Deploy using Visual Studio Code\n            url: /azure/azure-functions/create-first-function-vs-code-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n          - text: Deploy using the command line\n            url: /azure/azure-functions/create-first-function-cli-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n          - text: Connect to storage using Visual Studio Code\n            url: /azure/azure-functions/functions-add-output-binding-storage-queue-vs-code?pivots=programming-language-python&toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n          - text: Connect to storage using the command line\n            url: /azure/azure-functions/functions-add-output-binding-storage-queue-cli?pivots=programming-language-python&toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json\n  - title: Developer tools\n    linkLists:  \n      - linkListType: get-started\n        links: \n          - text: Visual Studio Code (IDE)\n            url: https://code.visualstudio.com/docs/languages/python\n          - text: Azure Command-Line Interface (CLI)\n            url: /cli/azure/install-azure-cli\n          - text: Windows Subsystem for Linux (WSL)\n            url: /windows/wsl/install-win10\n          - text: Visual Studio (for Python/C++ development)\n            url: /visualstudio/python/installation\n"
  },
  {
    "path": "articles/python/overview-azd-templates.md",
    "content": "---\ntitle: Overview of the Python web azd templates\ndescription: Explore the Python web templates for the Azure Developer CLI (azd), including tasks completed by the templates, \nms.date: 06/19/2025\nms.topic: concept-article\nms.custom: devx-track-python, devx-track-extended-azdevcli\n\n#Customer intent: As a Python web developer, I want to explore how Python web azd templates can me help quickly build and deploy Python web applications to Azure.\n---\n\n# Overview of the Python web azd templates\n\nPython web Azure Developer CLI (`azd`) templates are the fastest and easiest way to build, configure, and deploy Python web applications to Azure. This article provides contextual background information to help you understand the components involved and how the templates simplify deployment.\n\nThe best way to begin is to [follow the quickstart](quickstart-python-web-azd-templates.md) to create your first Python web app and deploy it to Azure in minutes with `azd` templates. If you prefer not to set up a local development environment, you can follow the [quickstart by using GitHub Codespaces](quickstart-python-web-azd-codespaces.md) for a fully cloud-based experience with all tools preconfigured.\n\n## What are the Python web azd templates?\n\n<a name=\"why-would-i-want-to-use-this\"></a>\n\nThe `azd` templates are designed for experienced Python web developers who want to deploy scalable, cloud-ready applications on Azure with minimal setup time.\n\nThese templates offer the easiest possible starting point for building and deploying Python web applications by:\n\n* Quickly setting up a complete local development and hosting environment.\n* Automating the creation of a matching Azure deployment environment.\n* Using a simple and memorable CLI workflow.\n\nOnce your environments are set up, the templates provide the fastest way to start building your Python web app. You can:\n\n* Modify the provided code files to match your app’s requirements.\n* Deploy updates with minimal effort using azd commands.\n* Extend the template to fit your architecture.\n\nThese templates reflect proven design patterns and best practices, enabling you to:\n\n* Build with confidence on a solid architectural foundation.\n* Follow guidance developed by industry experts with deep experience in Python and Azure.\n* Ensure maintainability, scalability, and security from the start.\n\n### What tasks can I do with the templates?\n\nWhen you run a Python web `azd` template, you quickly complete several tasks:\n\n* **Create starter application**. You build a website for a fictitious company named Relecloud. This starter project includes:\n\n  * Well-organized, production-ready code\n  * Best practices for Python web frameworks (such as Flask, Django).\n  * Proper use of dependencies, configuration, and structure.\n\n  The template is designed to be a starting point—you can freely customize the logic and expand or remove Azure resources to fit your project.\n\n* **Provision Azure resources**. Using [Bicep](/azure/azure-resource-manager/bicep/overview), a modern infrastructure-as-code (IaC) language, the template provisions all necessary Azure resources for:\n\n  * Hosting your web app (such as App Service, Container Apps)\n  * Connecting to databases (such as PostgreSQL, Cosmos DB)\n\n  The Bicep files are fully editable—you can add or customize Azure services as your app evolves. Similar to the previous task, you can [modify the Bicep templates](quickstart-python-scale-bicep.md) to add more Azure services, as needed.\n\n* **Deploy starter app to provisioned Azure resources**. Once resources are provisioned, your application is automatically deployed to the Azure environment. You can now:\n\n  * See your app running in the cloud within minutes.\n  * Test its behavior.\n  * Decide what functionality or configuration to update next.\n\n* **(Optional) Set up GitHub repository and CI/CD pipeline**. You can optionally initialize a GitHub repository with a GitHub Actions [continuous integration/continuous delivery (CI/CD) pipeline](/azure/devops/pipelines/apps/cd/azure/cicd-data-overview) to:\n\n  * Automate deployments on code changes.\n  * Collaborate with team members.\n  * Push updates to Azure by merging into the main branch.\n\n  This integration helps you adopt DevOps best practices from the start.\n\n## Where can I access the templates?\n\nMany `azd` templates are available on the [Awesome Azure Developer CLI Templates gallery](https://azure.github.io/awesome-azd/). These templates provide ready-to-use Python web app projects with feature parity across popular combinations of Azure services and Python web frameworks.\n\nEach template includes:\n\n* A sample application with clean, maintainable code.\n* Pre-configured infrastructure-as-code using Bicep.\n* Seamless deployment workflows using the Azure Developer CLI.\n* Optional CI/CD integration via GitHub Actions\n\nThe following tables list the Python web `azd` template monikers that are available for use with the `azd init` command. The tables identify the technologies implemented in each template and provide a link to the corresponding GitHub repository, where you can contribute changes.\n\n   # [Django](#tab/django)\n\n   The following `azd` templates are available for the [Django web framework](https://www.djangoproject.com/).\n\n   | Template | Database | Hosting platform | GitHub repository |\n   | --- | --- | --- | --- |\n   | azure-django-postgres-flexible-aca        | [Azure Database for PostgreSQL Flexible Server](/azure/postgresql/flexible-server/overview) | [Azure Container Apps](/azure/container-apps/overview) | [https://github.com/Azure-Samples/azure-django-postgres-flexible-aca](https://github.com/Azure-Samples/azure-django-postgres-flexible-aca)|\n   | azure-django-postgres-flexible-appservice | Azure Database for PostgreSQL Flexible Server | [Azure App Service](/azure/app-service/overview) | [https://github.com/Azure-Samples/azure-django-postgres-flexible-appservice](https://github.com/Azure-Samples/azure-django-postgres-flexible-appservice)  |\n   | azure-django-cosmos-postgres-aca          | [Azure Cosmos DB for Azure Database for PostgreSQL](/azure/cosmos-db/postgresql/introduction) | Azure Container Apps | [https://github.com/Azure-Samples/azure-django-cosmos-postgres-aca](https://github.com/Azure-Samples/azure-django-cosmos-postgres-aca)|\n   | azure-django-cosmos-postgres-appservice   | Azure Cosmos DB for Azure Database for PostgreSQL | Azure App Service | [https://github.com/Azure-Samples/azure-django-cosmos-postgres-appservice](https://github.com/Azure-Samples/azure-django-cosmos-postgres-appservice)|\n   | azure-django-postgres-addon-aca           | [Azure Container Apps with Azure Database for PostgreSQL](tutorial-deploy-python-web-app-azure-container-apps-01.md) | Azure Container Apps | [https://github.com/Azure-Samples/azure-django-postgres-addon-aca](https://github.com/Azure-Samples/azure-django-postgres-addon-aca)|\n\n   # [FastAPI](#tab/fastapi)\n\n   The following `azd` templates are available for the [FastAPI web framework](https://fastapi.tiangolo.com/).\n\n   | Template | Database | Hosting platform | GitHub repository |\n   | --- | --- | --- | --- |\n   | azure-fastapi-postgres-flexible-aca        | [Azure Database for PostgreSQL Flexible Server](/azure/postgresql/flexible-server/overview) | [Azure Container Apps](/azure/container-apps/overview) | [https://github.com/Azure-Samples/azure-fastapi-postgres-flexible-aca](https://github.com/Azure-Samples/azure-fastapi-postgres-flexible-aca)|\n   | azure-fastapi-postgres-flexible-appservice | Azure Database for PostgreSQL Flexible Server | [Azure App Service](/azure/app-service/overview) | [https://github.com/Azure-Samples/azure-fastapi-postgres-flexible-appservice](https://github.com/Azure-Samples/azure-fastapi-postgres-flexible-appservice)  |\n   | azure-fastapi-cosmos-postgres-aca          | [Azure Cosmos DB for Azure Database for PostgreSQL](/azure/cosmos-db/postgresql/introduction) | Azure Container Apps | [https://github.com/Azure-Samples/azure-fastapi-cosmos-postgres-aca](https://github.com/Azure-Samples/azure-fastapi-cosmos-postgres-aca)|\n   | azure-fastapi-cosmos-postgres-appservice   | Azure Cosmos DB for Azure Database for PostgreSQL | Azure App Service | [https://github.com/Azure-Samples/azure-fastapi-cosmos-postgres-appservice](https://github.com/Azure-Samples/azure-fastapi-cosmos-postgres-appservice)|\n   | azure-fastapi-postgres-addon-aca           | [Azure Container Apps with Azure Database for PostgreSQL](tutorial-deploy-python-web-app-azure-container-apps-01.md) | Azure Container Apps | [https://github.com/Azure-Samples/azure-fastapi-postgres-addon-aca](https://github.com/Azure-Samples/azure-fastapi-postgres-addon-aca)|\n\n   # [Flask](#tab/flask)\n\n   The following `azd` templates are available for the [Flask web framework](https://palletsprojects.com/projects/flask/).\n\n   | Template | Database | Hosting platform | GitHub repository |\n   | --- | --- | --- | --- |\n   | azure-flask-postgres-flexible-aca        | [Azure Database for PostgreSQL Flexible Server](/azure/postgresql/flexible-server/overview) | [Azure Container Apps](/azure/container-apps/overview) | [https://github.com/Azure-Samples/azure-flask-postgres-flexible-aca](https://github.com/Azure-Samples/azure-flask-postgres-flexible-aca)|\n   | azure-flask-postgres-flexible-appservice | Azure Database for PostgreSQL Flexible Server | [Azure App Service](/azure/app-service/overview) | [https://github.com/Azure-Samples/azure-flask-postgres-flexible-appservice](https://github.com/Azure-Samples/azure-flask-postgres-flexible-appservice)  |\n   | azure-flask-cosmos-postgres-aca          | [Azure Cosmos DB for Azure Database for PostgreSQL](/azure/cosmos-db/postgresql/introduction) | Azure Container Apps | [https://github.com/Azure-Samples/azure-flask-cosmos-postgres-aca](https://github.com/Azure-Samples/azure-flask-cosmos-postgres-aca)|\n   | azure-flask-cosmos-postgres-appservice   | Azure Cosmos DB for Azure Database for PostgreSQL | Azure App Service | [https://github.com/Azure-Samples/azure-flask-cosmos-postgres-appservice](https://github.com/Azure-Samples/azure-flask-cosmos-postgres-appservice)|\n   | azure-flask-postgres-addon-aca           | [Azure Container Apps with Azure Database for PostgreSQL](tutorial-deploy-python-web-app-azure-container-apps-01.md) | Azure Container Apps | [https://github.com/Azure-Samples/azure-flask-postgres-addon-aca](https://github.com/Azure-Samples/azure-flask-postgres-addon-aca)|\n   | azure-flask-cosmos-mongodb-aca           | [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/introduction) | Azure Container Apps | [https://github.com/Azure-Samples/azure-flask-cosmos-mongodb-aca](https://github.com/Azure-Samples/azure-flask-cosmos-mongodb-aca) |\n   | azure-flask-cosmos-mongodb-appservice    | Azure Cosmos DB for MongoDB | Azure App Service | [https://github.com/Azure-Samples/azure-flask-cosmos-mongodb-appservice](https://github.com/Azure-Samples/azure-flask-cosmos-mongodb-appservice) |\n\n   ---\n\n## How should I use the templates?\n\n<a name=\"how-do-the-templates-work\"></a>\n\nEach `azd` template comprises a GitHub repository that contains the application code (Python code that utilizes a popular web framework) and the infrastructure-as-code (namely, [Bicep](/azure/azure-resource-manager/bicep/overview)) files to create the Azure resources. The template also contains the configuration required to set up a GitHub repository with a CI/CD pipeline.\n\nKey components of each template include:\n\n* **Application Code**: Written in Python and built using a popular web framework (such as Flask, Django, FastAPI).\nThe sample app demonstrates best practices in routing, data access, and configuration.\n\n* **Infrastructure-as-Code (IaC)**: Provided via Bicep files to define and provision the required Azure resources, such as:\n\n  * App Service or Container Apps\n  * Azure Databases (such as PostgreSQL, Cosmos DB)\n  * Foundry Tools, Storage, and more\n\n* **CI/CD Configuration (Optional)**: Includes files to set up a GitHub repository with a GitHub Actions CI/CD pipeline, enabling:\n\n  * Automatic deployment to Azure on every push or pull request to the main branch.\n  * Seamless integration into your DevOps workflow\n\n  These templates are fully customizable, giving you a strong foundation to build on and adapt to your project’s specific needs.\n\nTo perform the tasks defined by an `azd` web template, you use various Python `azd` commands. For detailed descriptions of these commands, see [Quickstart: Deploy an Azure Developer CLI template](/azure/developer/azure-developer-cli/get-started). The quickstart walks you through the steps to use a specific `azd` template. You only need to run five essential command-line instructions to the production-hosting environment and the local-development environment.\n\nThe following table summarizes the five essential commands:\n\n| Command | Task description |\n| --- | --- |\n| `azd init --template <template name>` | Create a new project from a template and create a copy of the application code on your local computer. The command prompts you to provide an environment name (like \"myapp\") that's used as a prefix in the naming of the deployed resources. |\n| `azd auth login` | Sign in to Azure. The command opens a browser window where you can sign in to Azure. After you sign in, the browser window closes and the command completes. The `azd auth login` command is required only the first time you use the Azure Developer CLI (`azd`) per session. |\n| `azd up`         | Provision the cloud resources and deploy the app to those resources. |\n| `azd deploy`     | Deploy changes to the application source code to resources already provisioned by the `azd up` command. |\n| `azd down`       | Delete the Azure resources and the CI/CD pipeline, if it was used. |\n\n> [!TIP]\n> When you work with the `azd` commands, watch for prompts to enter more information. After you execute the `azd up` command, you might be prompted to select a subscription, if you have more than one. You might also be prompted to specify your region. You can change the answers to prompts by editing the environment variables stored in the */.azure/* folder of the template.\n\nAfter completing the essential tasks provided by the `azd` template, you have a personal copy of the original template where you can modify any file, as needed.\n\n* **Application Code**: Customize the Python project code to implement your own design, routes, and business logic.\n* **Infrastructure-as-Code (Bicep)**: Update the Bicep files to provision additional Azure services, change configurations, or remove unneeded resources.\n\nThis flexible starting point allows you to build on top of a well-structured foundation while tailoring the app to your real-world use case.\n\nYou can also [modify the infrastructure-as-code configuration](quickstart-python-scale-bicep.md) if you need to change the Azure resources. For more information, see the [What can I edit or delete](#what-can-i-edit-or-delete) section later in this article.\n\n### Optional template tasks\n\nIn addition to the five essential commands, there are optional tasks you can complete with the `azd` templates.\n\n#### Reprovision and modify Azure resources\n\nAfter you provision Azure resources with an `azd` template, you can modify and reprovision a resource.\n\n* To modify a provisioned resource, you [edit the appropriate Bicep files](quickstart-python-scale-bicep.md) in the template.\n* To initiate the reprovisioning task, use the `azd provision` command.\n\n#### Set up CI/CD pipeline\n\nThe Azure Developer CLI (`azd`) provides an easy way to set up a CI/CD pipeline for your new Python web app. When you merge commits or pull requests into your main branch, the pipeline automatically builds and publishes the changes to your Azure resources.\n\n* To set up the CI/CD pipeline, you designate the GitHub repository and desired settings to enable the pipeline.\n* To create the pipeline, use the `azd pipeline config` command.\n\nAfter you configure the pipeline, each time code changes are merged to the *main* branch of the repository, the pipeline deploys the changes to your provisioned Azure services.\n\n## Alternatives to the templates\n\n<a name=\"what-are-my-other-options\"></a>\n\nIf you prefer to not use the Python web `azd` templates, there are alternate methods for deploying Python web apps to Azure and provisioning Azure resources.\n\nYou can create many resources and complete the deployment steps by using several tools:\n\n* [Azure portal](https://portal.azure.com)\n* The [Azure CLI](/cli/azure/get-started-with-azure-cli)\n* Visual Studio Code with the [Azure Tools extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack)\n\nYou can also follow an end-to-end tutorial that features Python web development frameworks:\n\n* [Deploy a Flask or FastAPI web app on Azure App Service](tutorial-containerize-simple-web-app-for-app-service.md)\n* [Containerized Python web app on Azure with MongoDB](tutorial-containerize-deploy-python-web-app-azure-01.md)\n\n## Frequently asked questions\n\nThe following sections summarize answers to frequently asked questions about working with the Python web `azd` templates.\n\n### Do I have to use Dev Containers?\n\nNo. The Python web `azd` templates use [Visual Studio Code Dev Containers](https://code.visualstudio.com/docs/devcontainers/containers) by default. Dev Containers provide many benefits, but they require some prerequisite knowledge and software. If you prefer to not use Dev Containers, and instead use your local development environment, see the *README.md* file in the root directory of the sample app for environment setup instructions.\n\n### What can I edit or delete?\n\nThe contents of each Python web `azd` template can vary depending on the type of project and the underlying technology stack employed. The templates identified in this article follow a common folder and file convention, as described in the following table.\n\n| Folder/file(s) | Purpose | Description |\n| --- | --- | --- |\n| **/**                    | Root directory | The root folder for each template contains many different kinds of files and folders for different purposes. |\n| **/.azure**              | `azd` configuration files | The *.azure* folder is created after you run the `azd init` command. The folder stores configuration files for the environment variables used by the `azd` commands. You can change the values of the environment variables to customize the app and the Azure resources. For more information, see [Environment-specific .env file](/azure/developer/azure-developer-cli/manage-environment-variables#environment-specific-env-file).|\n| **/.devcontainer**       | Dev Container configuration files | Dev Containers allow you to create a container-based development environment complete with all of the resources you need for software development inside of Visual Studio Code. The *.devcontainer* folder is created after Visual Studio Code generates a Dev Container configuration file in response to a template command. |\n| **/.github**             | GitHub Actions configuration files | This folder contains configuration settings for the optional GitHub Actions CI/CD pipeline, linting, and tests. If you don't want to set up the GitHub Actions pipeline by using `azd pipeline config` command, you can modify or deleted the *azure-dev.yaml* file. |\n| **/infra**               | Bicep files | The *infra* folder holds the Bicep configuration files. Bicep allows you to declare the Azure resources you want deployed to your environment. You should only modify the *main.bicep* and *web.bicep* files. For more information, see [Quickstart: Scaling services deployed with the azd Python web templates by using Bicep](quickstart-python-scale-bicep.md). |\n| **/src**                 | Starter project code files | The *src* folder contains various code files required to prepare the starter project. Examples of the files include templates required by the web framework, static files, Python (.py) files for the code logic and data models, a *requirements.txt* file, and more. The specific files depend on the web framework, the data access framework, and so on. You can modify these files to suit your project requirements. |\n| **/.cruft.json**         | Template generation file | The *.cruft* JSON file is used internally to generate the Python web `azd` templates. You can safely delete this file, as needed. |\n| **/.gitattributes**      | File with attribute settings for git | This file provides git with important configuration settings for handling files and folders. You can modify this file, as needed. |\n| **/.gitignore**          | File with ignored items for git | The *.gitignore* file informs git about the files and folders to exclude (ignore) when writing to the GitHub repository for the template. You can modify this file, as needed. |\n| **/azure.yaml**          | `azd up` configuration file | This configuration file contains the configuration settings for the `azd up` command. It specifies the services and project folders to deploy. **Important**: This file must not be deleted. |\n| **/*.md**                | Markdown format files | A template can include various Markdown (.md) format files for different purposes. You can safely delete Markdown files. |\n| **/docker-compose.yml**  | Docker compose settings | This YML file creates the container package for the Python web application before the app deploys to Azure. |\n| **/pyproject.toml**      | Python build settings file | The TOML file contains the build system requirements of Python projects. You can modify this file to identify your tool preferences, such as a specific linter or unit testing framework. |\n| **/requirements-dev.in** | pip requirements file | This file is used to create a development environment version of the requirements by using the `pip install -r` command. You can modify this file to include other packages, as needed. |\n\n> [!TIP]\n> As you modify template files for your program, be sure to practice good version control. This approach can help you restore your repository to a previous working version, if new changes cause program issues.\n\n### How can I handle template errors?\n\nIf you receive an error when you use an `azd` template, review the options described in the [Troubleshoot Azure Developer CLI](/azure/developer/azure-developer-cli/troubleshoot) article. You can also report issues on the GitHub repository associated with the `azd` template.\n\n## Related content\n\n* [Create and deploy Python web apps to Azure with azd templates](quickstart-python-web-azd-templates.md)\n* [Create and deploy Python web apps from GitHub Codespaces to Azure with azd templates](quickstart-python-web-azd-codespaces.md)\n"
  },
  {
    "path": "articles/python/python-web-app-github-actions-app-service.md",
    "content": "---\ntitle: \"GitHub Actions - Deploy Python app to App Service\"\ndescription: Use CI/CD with GitHub Actions to automatically build, test, and deploy Python web apps to Azure App Service on Linux.\nms.topic: how-to\nms.date: 06/19/2025\nms.custom:\n  - devx-track-python\n  - devx-track-azurecli\n  - linux-related-content\n  - sfi-image-nochange\n# CustomerIntent: As a python developer, I want to use CI/CD with GitHub Actions, so I can build, test, and deploy Python web apps to Azure App Service on Linux.\n---\n\n# Deploy Python web apps to App Service by using GitHub Actions (Linux)\n\nThis article describes how to use the continuous integration and continuous delivery (CI/CD) platform in GitHub Actions to deploy a Python web app to Azure App Service on Linux. Your GitHub Actions workflow automatically builds the code and deploys it to the App Service instance whenever there's a commit to the repository. You can add other automation in your GitHub Actions workflow, such as test scripts, security checks, and multistages deployment.\n\n## Create repository for app code\n\nTo complete the procedures in this article, you need a Python web app committed to a GitHub repository.\n\n- **Existing app**: To use an existing Python web app, make sure the app is committed to a GitHub repository.\n\n- **New app**: If you need a new Python web app, you can fork and clone the https://github.com/Microsoft/python-sample-vscode-flask-tutorial GitHub repository. The sample code supports the [Flask in Visual Studio Code][1] tutorial, and provides a functioning Python application.\n\n> [!NOTE]\n> If your app uses [Django][20] and a [SQLite][21] database, it won't work for these procedures. SQLite is not supported in most cloud-hosted environments due to its local file-based storage limitations. Consider switching to a cloud-compatible database such as PostgreSQL or Azure Cosmos DB. For more information, see [Review Django considerations](#review-django-considerations) later in this article.\n\n## Create target App Service instance\n\nThe quickest way to create an App Service instance is to use the [Azure command-line interface][15] (CLI) through the interactive [Azure Cloud Shell][16]. The Cloud Shell includes [Git][19] and the Azure CLI. In the following procedure, you use the [az webapp up][2] command to both create the App Service instance and do the initial deployment of your app.\n\n1. Sign in to the Azure portal at https://portal.azure.com.\n\n1. Open the Azure CLI by selecting the Cloud Shell option on the portal toolbar:\n\n   :::image type=\"content\" source=\"media/github-actions-app-service/azure-portal-cloud-shell-icon.png\" alt-text=\"Screenshot that shows how to open Azure Cloud Shell by using the icon action on the Azure portal toolbar.\":::\n\n1. In Cloud Shell, select the **Bash** option from the dropdown menu:\n\n   :::image type=\"content\" source=\"media/github-actions-app-service/azure-portal-cloud-shell-bash.png\" alt-text=\"Screenshot that shows how to select the Bash option in Cloud Shell.\":::\n\n1. In Cloud Shell, clone your repository by using the [git clone][17] command.\n\n   > [!TIP]\n   > To paste commands or text into Cloud Shell, use the **Ctrl**+**Shift**+**V** keyboard shortcut, or right-click and select **Paste** from the context menu.\n\n   - For the Flask sample app, you can use the following command. Replace the `<github-user>` portion with the name of the GitHub account where you forked the repo:\n\n      ```bash\n      git clone https://github.com/<github-user>/python-sample-vscode-flask-tutorial.git\n      ```\n\n   - If your app is in a different repo, set up GitHub Actions for the particular repo. Replace the `<github-user>` portion with the name of the GitHub account where you forked the repo, and provide the actual repo name in the `<repo-name>` placeholder:\n\n      ```bash\n      git clone https://github.com/<github-user>/<repo-name>.git\n      ```\n\n   > [!NOTE]\n   > Cloud Shell is backed by an Azure Storage account in a resource group named **cloud-shell-storage-\\<your-region>**. That storage account contains an image of the Cloud Shell file system, which stores the cloned repository. There's a small cost for this storage. You can delete the storage account after you complete this article, along with other resources you create.\n\n1. In Cloud Shell, change directory into the repository folder for your Python app, so the [az webapp up][2] command recognizes the app as Python. For the Flask sample app, you use the following command:\n\n   ```bash\n   cd python-sample-vscode-flask-tutorial\n   ```\n\n1. In Cloud Shell, use the [az webapp up][2] command to create an App Service instance and do the initial deployment for your app:\n\n   ```bash\n   az webapp up --name <app-service-name> --runtime \"PYTHON:3.9\"\n   ```\n\n   - For the `<app-service-name>` placeholder, specify an App Service name that's unique in Azure. The name must be 3-60 characters long and can contain only letters, numbers, and hyphens. The name must start with a letter and end with a letter or number.\n\n   - For a list of available runtimes on your system, use the `az webapp list-runtimes` command.\n   - When you enter the runtime value in the command, use the `PYTHON:X.Y` format, where `X.Y` is the Python major and minor version.\n   - You can also specify the region location of the App Service instance by using the `--location` parameter. For a list of available locations, use the `az account list-locations --output table` command.\n\n1. If your app has a custom startup script, use the [az webapp config][3] command to initiate the script.\n\n   - If your app doesn't have a custom startup script, continue to the next step.\n\n   - For the Flask sample app, you need to access the startup script in the *startup.txt* file by running the following command:\n\n      ```bash\n      az webapp config set \\\n        --resource-group <resource-group-name> \\\n        --name <app-service-name> \\\n        --startup-file startup.txt\n      ```\n\n      Provide your resource group name and App Service instance name in the `<resource-group-name>` and `<app-service-name>` placeholders. To find the resource group name, check the output from the previous `az webapp up` command. The resource group name includes the Azure account name followed by the *_rg* suffix, as in *\\<azure-account-name>\\_rg\\_*.\n\n1. To view the running app, open a browser and go to the deployment endpoint for your App Service instance. In the following URL, replace the `<app-service-name>` placeholder with your App Service instance name:\n\n   ```URL\n   http://<app-service-name>.azurewebsites.net\n   ```\n\n   If you see a generic page, wait a few seconds for the App Service instance to start, and refresh the page.\n\n   - If you continue to see a generic page, confirm you deployed from the correct folder.\n   - For the Flask sample app, confirm you deployed from the *python-sample-vscode-flask-tutorial* folder. Also check that you set the startup command correctly.\n\n## Set up continuous deployment in App Service\n\nIn the next procedure, you set up continuous delivery (CD), which means a new code deployment occurs whenever a workflow triggers. The trigger in the article example is any change to the _main_ branch of your repository, such as with a pull request (PR).\n\n1. In Cloud Shell, confirm you're in the root directory for your system (`~`) and not in an app subfolder, such as *python-sample-vscode-flask-tutorial*.\n\n1. Add GitHub Actions with the [az webapp deployment github-actions add][4] command. Replace any placeholders with your specific values:\n\n   ```bash\n   az webapp deployment github-actions add \\\n     --repo \"<github-user>/<github-repo>\" \\\n     --resource-group <resource-group-name> \\\n     --branch <branch-name> \\\n     --name <app-service-name> \\\n     --login-with-github\n   ```\n\n   - The `--login-with-github` parameter uses an interactive method to retrieve a personal access token. Follow the prompts and complete the authentication.\n\n   - If the system encounters an existing workflow file with the same App Service instance name, follow the prompts to choose whether to overwrite the workflow. You can use the `--force` parameter with the command to automatically overwrite any conflicting workflows.\n\n   The `add` command completes the following tasks:\n\n   - Creates a new workflow file at the *.github/workflows/\\<workflow-name>.yml* path in your repo. The file name contains the name of your App Service instance.\n   - Fetches a publish profile with secrets for your App Service instance and adds it as a GitHub action secret. The name of the secret begins with *AZUREAPPSERVICE\\_PUBLISHPROFILE\\_*. This secret is referenced in the workflow file.\n\n1. Get the details of a source control deployment configuration with the [az webapp deployment source show][5] command. Replace the placeholder parameters with your specific values:\n\n   ```bash\n   az webapp deployment source show \\\n     --name <app-service-name> \\\n     --resource-group <resource-group-name>\n   ```\n\n1. In the command output, confirm the values for the `repoUrl` and `branch` properties. These values should match the values you specified with the `add` command.\n\n## Examine GitHub workflow and actions\n\nA workflow definition is specified in a YAML (*.yml*) file in the */.github/workflows/* path in your repository. This YAML file contains the various steps and parameters that make up the workflow, an automated process associated with a GitHub repository. You can build, test, package, release, and deploy any project on GitHub with a workflow.\n\nEach workflow is made up of one or more jobs, and each job is a set of steps. Each step is a shell script or an action. Each job has an **Action** section in the workflow file.\n\nIn terms of the workflow set up with your Python code for deployment to Azure App Service, the workflow has the following actions:\n\n| Action | Description |\n| --- | --- |\n| [checkout][6]         | Check out the repository on a *runner*, a GitHub Actions agent. |\n| [setup-python][7]     | Install Python on the runner. |\n| [appservice-build][8] | Build the web app. |\n| [webapps-deploy][9]   | Deploy the web app by using a publish profile credential to authenticate in Azure. The credential is stored in a [GitHub secret][10]. |\n\nThe workflow template used to create the workflow is [Azure/actions-workflow-samples][11].\n\nThe workflow is triggered on push events to the specified branch. The event and branch are defined at the beginning of the workflow file. For example, the following code snippet shows the workflow is triggered on push events to the *main* branch:\n\n```yaml\non:\n  push:\n    branches:\n    - main\n```\n\n### OAuth authorized apps\n\nWhen you set up continuous deployment, you authorize Azure App Service as an authorized OAuth App for your GitHub account. App Service uses the authorized access to create a GitHub action YAML file at the *.github/workflows/\\<workflow-name>.yml* path in your repo.\n\nTo see your authorized apps and revoke permissions under your GitHub accounts, go to **Settings** > **Integrations/Applications**:\n\n:::image type=\"content\" source=\"media/github-actions-app-service/github-authorized-oauth-apps.png\" alt-text=\"Screenshot that shows how to view authorized OAuth Apps for a GitHub account.\":::\n\n### Workflow publish profile secret\n\nIn the *.github/workflows/\\<workflow-name>.yml* workflow file added to your repo, there's a placeholder for publish profile credentials required for the deploy job of the workflow. The publish profile information is stored encrypted in the repository.\n\nTo view the secret, go to **Settings** > **Security** > **Secret and variables** > **Actions**:\n\n:::image type=\"content\" source=\"media/github-actions-app-service/github-repo-action-secrets.png\" alt-text=\"Screenshot that shows how to view action secrets for a repository in GitHub.\":::\n\nIn this article, the GitHub action authenticates with a publish profile credential. There are other ways to authenticate, such as with a service principal or OpenID Connect. For more information, see [Deploy to App Service using GitHub Actions][12].\n\n## Run and test workflow\n\nThe last step is to test the workflow by making a change to the repo.\n\n1. In a browser, go to your fork of the sample repository (or the repository you used), and select the branch you set as part of the trigger:\n\n   :::image type=\"content\" source=\"media/github-actions-app-service/github-repo-make-small-change.png\" alt-text=\"Screenshot that shows how to go to the repo and branch where GitHub Actions workflow is defined.\":::\n\n1. Make a small change to your Python web app.\n\n   For the Flask tutorial, here's a simple change:\n\n   1. Go to the */hello-app/templates/home.html* file of the trigger branch.\n   1. Select **Edit** (pencil).\n   1. In the Editor, locate the print `<p>` statement, and add the text \"Redeployed!\"\n\n1. Commit the change directly to the branch you're working in.\n\n   1. In the Editor, select **Commit changes** at the top right. The **Commit changes** window opens.\n   1. In the **Commit changes** window, modify the commit message as desired, and select **Commit changes**.\n\n   The commit process triggers the GitHub Actions workflow.\n\nYou can also trigger the workflow manually:\n\n1. Go to the **Actions** tab of the repo set up for continuous deployment.\n\n1. Select the workflow in the list of workflows, and then select **Run workflow**.\n\n### Troubleshoot failed workflow\n\nYou can check the status of a workflow on the **Actions** tab for the app repo. When you examine the workflow file created in this article, you see two jobs: **build** and **deploy**. As a reminder, the workflow is based on the [Azure/actions-workflow-samples][11] template.\n\nFor a failed job, look at the output of job tasks for an indication of the failure.\n\nHere are some common issues to investigate:\n\n- If the app fails because of a missing dependency, then your *requirements.txt* file wasn't processed during deployment. This behavior happens if you created the web app directly on the portal rather than by using the `az webapp up` command as shown in this article.\n\n- If you provisioned the app service through the portal, the build action `SCM_DO_BUILD_DURING_DEPLOYMENT` setting might not be set. This setting must be set to `true`. The `az webapp up` command sets the build action automatically.\n\n- If you see an error message regarding \"TLS handshake timeout,\" run the workflow manually by selecting **Trigger auto deployment** under the **Actions** tab of the app repo. You can determine if the timeout is a temporary issue.\n\n- If you set up continuous deployment for the container app as shown in this article, the initial workflow file *.github/workflows/\\<workflow-name>.yml* is created automatically for you. If you modified the file, remove the modifications to see if they're causing the failure.\n\n## Run post-deployment script\n\nA post-deployment script can complete several tasks, such as defining environment variables expected by the app code. You add the script as part of the app code and execute the script by using the startup command.\n\nTo avoid hard-coding variable values in your workflow YAML file, consider configuring the variables in GitHub and referring to the variable names in the script. You can create encrypted secrets for a repository or for an environment (account repository). For more information, see [Using secrets in GitHub Actions][10].\n\n## Review Django considerations\n\nAs noted earlier in this article, you can use GitHub Actions to deploy Django apps to Azure App Service on Linux, if you use a separate database. You can't use a SQLite database because App Service locks the *db.sqlite3* file, which prevents both reads and writes. This behavior doesn't affect an external database.\n\nThe [Configure Python app on App Service - Container startup process][13] article describes how App Service automatically looks for a *wsgi.py* file within your app code, which typically contains the app object. When you used the `webapp config set` command to set the startup command, you used the `--startup-file` parameter to specify the file that contains the app object. The `webapp config set` command isn't available in the webapps-deploy action. Instead, you can use the `startup-command` parameter to specify the startup command. For example, the following code shows how to specify the startup command in the workflow file:\n\n```yaml\nstartup-command: startup.txt\n```\n\nWhen you use Django, you typically want to migrate the data models by using the `python manage.py migrate` command after you deploy the app code. You can run the migrate command in a post-deployment script.\n\n## Disconnect GitHub Actions\n\nDisconnecting GitHub Actions from your App Service instance allows you to reconfigure the app deployment. You can choose what happens to your workflow file after you disconnect, and whether to save or delete the file.\n\n### [Azure CLI](#tab/azure-cli)\n\nDisconnect GitHub Actions with the following Azure CLI [az webapp deployment github-actions remove][14] command. Replace any placeholders with your specific values:\n\n```bash\naz webapp deployment github-actions remove \\\n  --repo \"<github-username>/<github-repo>\" \\\n  --resource-group <resource-group-name> \\\n  --branch <branch-name> \\\n  --name <app-service-name> \\\n  --login-with-github\n```\n\n### [Azure portal](#tab/azure-portal)\n\nIn the Azure portal, go to your App Service instance, select **Deployment Center**, and then select **Disconnect** for the instance:\n\n:::image type=\"content\" source=\"media/github-actions-app-service/azure-portal-disconnect-github-actions.png\" alt-text=\"Screenshot that shows how to disconnect GitHub Actions from an App Service instance in the Azure portal.\":::\n\n---\n\n## Clean up resources\n\nTo avoid incurring charges on the Azure resources created in this article, delete the resource group that contains the App Service instance and the App Service Plan.\n\n### [Azure CLI](#tab/azure-cli)\n\nAnywhere the Azure CLI is installed, including the Azure Cloud Shell, you can use the [az group delete][18] command to delete a resource group:\n\n```bash\naz group delete --name <resource-group-name>\n```\n\n### [Azure portal](#tab/azure-portal)\n\nTo delete a resource group in the Azure portal, search for the resource by name, and select the resource to go to the **Overview** page. On the **Overview** page, select **Delete resource group** and follow the prompts:\n\n:::image type=\"content\" source=\"media/github-actions-app-service/azure-portal-delete-resource-group.png\" alt-text=\"Screenshot that shows how to delete a resource group in the Azure portal.\":::\n\n---\n\n### Delete storage account\n\nTo delete the storage account that maintains the file system for Cloud Shell, which incurs a small monthly charge, delete the resource group that begins with *cloud-shell-storage-*. If you're the only user of the group, it's safe to delete the resource group. If there are other users, you can delete a storage account in the resource group.\n\n### Update GitHub account and repo\n\nIf you delete the Azure resource group, consider making the following modifications to the GitHub account and repo that was connected for continuous deployment:\n\n- In the app repository, remove the *.github/workflows/\\<workflow-name>.yml* file.\n- In the app repository settings, remove the *AZUREAPPSERVICE\\_PUBLISHPROFILE\\_* secret key created for the workflow.\n- In the GitHub account settings, remove Azure App Service as an authorized Oauth App for your GitHub account.\n\n## Related content\n\n- [Common repositories and workflows for GitHub Actions][22]\n- [Command reference - az webapp deployment github-actions][23]\n\n[1]: https://code.visualstudio.com/docs/python/tutorial-flask\n[2]: /cli/azure/webapp#az-webapp-up\n[3]: /cli/azure/webapp/config#az-webapp-config-set\n[4]: /cli/azure/webapp/deployment/github-actions#az-webapp-deployment-github-actions-add\n[5]: /cli/azure/webapp/deployment/source#az-webapp-deployment-source-show\n[6]: https://github.com/actions/checkout\n[7]: https://github.com/actions/setup-python\n[8]: https://github.com/azure/appservice-build\n[9]: https://github.com/azure/webapps-deploy\n[10]: https://docs.github.com/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions\n[11]: https://github.com/Azure/actions-workflow-samples/blob/master/AppService/python-webapp-on-azure.yml\n[12]: /azure/app-service/deploy-github-actions\n[13]: /azure/app-service/containers/how-to-configure-python#container-startup-process\n[14]: /cli/azure/webapp/deployment/github-actions#az-webapp-deployment-github-actions-remove\n[15]: /cli/azure/what-is-azure-cli\n[16]: /azure/cloud-shell/overview\n[17]: https://git-scm.com/docs/git-clone\n[18]: /cli/azure/group#az-group-delete\n[19]: https://git-scm.com/\n[20]: https://www.djangoproject.com/\n[21]: https://sqlite.org/about.html\n[22]: https://github.com/actions/\n[23]: /cli/azure/webapp/deployment/github-actions\n"
  },
  {
    "path": "articles/python/python-zone-pivot-groups.yml",
    "content": "# YamlMime:ZonePivotGroups\ngroups:\n# Owner: kraigb\n- id: postgres-server-options\n  title: PostgreSQL Server\n  prompt: Choose a server SKU for PostgresSQL\n  pivots:\n  - id: postgres-single-server\n    title: Single Server\n  - id: postgres-flexible-server\n    title: Flexible Server\n- id: operating-systems-set-one\n  title: Operating Systems\n  prompt: Choose an operating system\n  pivots:\n  - id: os-windows \n    title: Windows \n  - id: os-linux\n    title: Linux\n  - id: os-macos\n    title: macOS\n"
  },
  {
    "path": "articles/python/quickstart-python-scale-bicep.md",
    "content": "---\ntitle: Scale your azd Python web app with Bicep\ndescription: Quickstart article featuring the modification of Bicep files and using azd provision to scale your azd Python web app.\nms.date: 3/20/2025\nms.topic: quickstart\nms.custom: devx-track-python, devx-track-bicep, devx-track-extended-azdevcli\n---\n\n# Quickstart: Scaling services deployed with the azd Python web templates using Bicep\n\nThe [Python web `azd` templates](./overview-azd-templates.md) allow you to quickly create a new web application and deploy it to Azure. The `azd` templates were designed to use low-cost Azure service options. Undoubtedly, you'll want to adjust the service levels (or skus) for each of the services defined in the template for your scenario.\n\nIn this Quickstart, you'll update the appropriate bicep template files to scale up existing services and add new services to your deployment. Then, you'll run the `azd provision` command and view the change you made to the Azure deployment.\n\n## Prerequisites\n\nAn Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\nYou must have the following installed on your local computer:\n\n- [Azure Developer CLI](../azure-developer-cli/install-azd.md?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&pivots=os-windows)\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/)\n- [Visual Studio Code](https://code.visualstudio.com/)\n- [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n- [Visual Studio Code Bicep](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-bicep) This extension helps you author Bicep syntax.\n\n## Deploy a template\n\nTo begin, you need a working `azd` deployment. Once you have that in place, you're able to modify the Bicep files generated by the `azd` template.\n\n1. Follow steps 1 through 7 in the [Quickstart article](./quickstart-python-web-azd-templates.md). In step 2, use the `azure-django-postgres-flexible-appservice` template. For your convenience, here's the entire sequence of commands to issue from the command line:\n\n   ```shell\n   mkdir azdtest\n   cd azdtest\n   azd init --template azure-django-postgres-flexible-appservice\n   azd auth login\n   azd up\n   ```\n\n   Once `azd up` finishes, open the Azure portal, navigate to the Azure App Service that was deployed in your new Resource Group and take note of the App Service pricing plan (see the App Service plan's Overview page, Essentials section, \"Pricing plan\" value).\n\n2. In step 1 of the Quickstart article, you were instructed to create the *azdtest* folder. Open that folder in Visual Studio Code.\n\n3. In the Explorer pane, navigate to the *infra* folder. Observe the subfolders and files in the *infra* folder.\n\n   The *main.bicep* file orchestrates the creation of all the services deployed when performing an `azd up` or `azd provision`. It calls into other files, like *db.bicep* and *web.bicep*, which in turn call into files contained in the *\\core* subfolder.\n\n   The *\\core* subfolder is a deeply nested folder structure containing bicep templates for many Azure services. Some of the files in the *\\core* subfolder are referenced by the three top level bicep files (*main.bicep*, *db.bicep* and *web.bicep*) and some aren't used at all in this project.\n\n## Scale a service by modifying its Bicep properties\n\nYou can scale an existing resource in your deployment by changing its SKU. To demonstrate this, you'll change the App Service plan from the \"Basic Service plan\" (which is designed for apps with lower traffic requirements and don't need advanced auto scale and traffic management features) to the \"Standard Service plan\", which is designed for running production workloads.\n\n> [!NOTE]\n> Not all SKU changes can be made after the fact. Some research may be necessary to better understand your scaling options.\n\n1. Open the *web.bicep* file and locate the `appService` module definition. In particular, look for the property setting:\n\n   ```bicep\n      sku: {\n         name: 'B1'\n      }\n   ```\n\n   Change the value from `B1` to `S1` as follows:\n\n   ```bicep\n      sku: {\n         name: 'S1'\n      }\n   ```\n\n   > [!IMPORTANT]\n   > As a result of this change, the price per hour will increase slightly. Details about the different service plans and their associated costs can be found on the [App Service pricing page](https://azure.microsoft.com/pricing/details/app-service/windows/).\n\n2. Assuming you already have the application deployed in Azure, use the following command to deploy changes to the infrastructure while not redeploying the application code itself.\n\n   ```shell\n   azd provision\n   ```\n\n   You shouldn't be prompted for a location and subscription. Those values are saved in the *.azure\\<environment-name>\\.env* file where `<environment-name>` is the environment name you provided during `azd init`.\n\n3. When `azd provision` is complete, confirm your web application still works. Also find the App Service Plan for your Resource Group and confirm that the Pricing Plan is set to the Standard Service Plan (S1).\n\nThis concludes the Quickstart, however there are many Azure services that can help you build more scalable and production-ready applications. A great place to start would be to learn about [Azure API Management](/azure/api-management/api-management-key-concepts), [Azure Front Door](/azure/frontdoor/front-door-overview), [Azure CDN](/azure/cdn/cdn-overview), and [Azure Virtual Network](/azure/virtual-network/virtual-networks-overview), to name a few.\n\n## Clean up resources\n\nClean up the resources created by the template by running the [azd down](/azure/developer/azure-developer-cli/reference#azd-down) command.\n\n```shell\nazd down\n```\n\nThe `azd down` command deletes the Azure resources and the GitHub Actions workflow. When prompted, agree to deleting all resources associated with the resource group.\n\nYou can also delete the *azdtest* folder, or use it as the basis for your own application by modifying the files of the project.\n\n## Related Content\n\n- [Learn more about the Python web `azd` templates](./overview-azd-templates.md)\n- [Learn more about the `azd` commands.](./overview-azd-templates.md#how-do-the-templates-work)\n- Learn what each of the folders and files in the project do and [what you can edit or delete?](./overview-azd-templates.md#what-can-i-edit-or-delete)\n- Update the Bicep templates to add or remove Azure services. Don't know Bicep? Try this [Learning Path: Fundamentals of Bicep](/training/paths/fundamentals-bicep/)\n- [Use `azd` to set up a GitHub Actions CI/CD pipeline to redeploy on merge to main branch](./overview-azd-templates.md)\n- Set up monitoring so that you can [Monitor your app using the Azure Developer CLI](/azure/developer/azure-developer-cli/monitor-your-app)\n"
  },
  {
    "path": "articles/python/quickstart-python-web-azd-codespaces.md",
    "content": "---\ntitle: Create and deploy a Python web app from GitHub Codespaces to Azure using an azd template\ndescription: Quickstart article featuring the use of GitHub Codespaces to create and publish an azd template.\nms.date: 2/28/2026\nms.topic: quickstart\nms.custom: devx-track-python, devx-track-extended-azdevcli\n---\n\n# Quickstart: Create and deploy a Python web app from GitHub Codespaces to Azure using an Azure Developer CLI template\n\nThis quickstart guides you through the easiest and fastest way to create and deploy a Python web and database solution to Azure. By following the instructions in this quickstart, you:\n\n- Choose an [Azure Developer CLI](./overview-azd-templates.md) (`azd`) template based on the Python web framework, Azure database platform, and Azure web hosting platform you want to build on.\n- Create a new GitHub Codespace containing code generated from the `azd` template you selected.\n- Use GitHub Codespaces and the online Visual Studio Code's bash terminal. The terminal allows you to use Azure Developer CLI commands to run an `azd` template to create a sample web app and database, and create and configure the necessary Azure resources, then deploy the sample web app to Azure.\n- Edit the web app in a GitHub Codespace and use an `azd` command to redeploy.\n- Use an `azd` command to clean up Azure resources.\n- Close and reopen your GitHub Codespace.\n- Publish your new code to a GitHub repository.\n\nIt should take less than 25 minutes to complete this tutorial. Upon completion, you can start modifying the new project with your custom code.\n\nTo learn more about these `azd` templates for Python web app development, see:\n\n- [What are these templates?](./overview-azd-templates.md#what-are-the-python-web-azd-templates)\n- [How do the templates work?](./overview-azd-templates.md#how-do-the-templates-work)\n- [Why would I want to use this?](./overview-azd-templates.md#why-would-i-want-to-use-this)\n- [What are my other options?](./overview-azd-templates.md#what-are-my-other-options)\n\n## Prerequisites\n\n- An Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n- A GitHub Account - [Create one for free](https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F&source=header-home)\n\n> [!IMPORTANT]\n> Both GitHub Codespaces and Azure are paid subscription based services. After some free allotments, you might be charged for using these services. Following this quickstart could affect these allotments or billing. When possible, the `azd` templates use the least expensive tier of options, but some might not be free. Use the [Azure Pricing calculator](https://azure.microsoft.com/pricing/calculator/) to better understand the costs. For more information, see [GitHub Codespaces pricing](https://docs.github.com/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces) for more details.\n\n## Choose a template and create a codespace\n\nChoose an `azd` template based on the Python web framework, Azure web hosting platform, and Azure database platform you want to build on.\n\n1. From the following list of templates, choose one that uses the technologies you want to use in your new web application.\n\n   # [Django](#tab/django)\n\n   |Template|Web Framework|Database|Hosting Platform|New Codespace|\n   |----------|----------|----------|----------|----------|\n   |azure-django-postgres-flexible-aca|Django|PostgreSQL Flexible Server|Azure Container Apps|[New Codespace](https://codespaces.new/Azure-Samples/azure-django-postgres-flexible-aca?quickstart=1)|\n   |azure-django-postgres-flexible-appservice|Django|PostgreSQL Flexible Server|Azure App Service|[New Codespace](https://codespaces.new/Azure-Samples/azure-django-postgres-flexible-appservice?quickstart=1)|\n   |azure-django-cosmos-postgres-aca|Django|Cosmos DB (PostgreSQL Adapter)|Azure Container Apps|[New Codespace](https://codespaces.new/Azure-Samples/azure-django-cosmos-postgres-aca?quickstart=1)|\n   |azure-django-cosmos-postgres-appservice|Django|Cosmos DB (PostgreSQL Adapter)|Azure App Service|[New Codespace](https://codespaces.new/Azure-Samples/azure-django-cosmos-postgres-appservice?quickstart=1)|\n   |azure-django-postgres-addon-aca|Django|Azure Container Apps PostgreSQL Add-on|Azure Container Apps|[New Codespace](https://codespaces.new/Azure-Samples/azure-django-postgres-addon-aca?quickstart=1)|\n\n   # [FastAPI](#tab/fastapi)\n\n   |Template|Web Framework|Database|Hosting Platform|New Codespace|\n   |----------|----------|----------|----------|----------|\n   |azure-fastapi-postgres-flexible-aca|FastAPI|PostgreSQL Flexible Server|Azure Container Apps|[New Codespace](https://codespaces.new/Azure-Samples/azure-fastapi-postgres-flexible-aca?quickstart=1)|\n   |azure-fastapi-postgres-flexible-appservice|FastAPI|PostgreSQL Flexible Server|Azure App Service|[New Codespace](https://codespaces.new/Azure-Samples/azure-fastapi-postgres-flexible-appservice?quickstart=1)|\n   |azure-fastapi-cosmos-postgres-aca|FastAPI|Cosmos DB (PostgreSQL Adapter)|Azure Container Apps|[New Codespace](https://codespaces.new/Azure-Samples/azure-fastapi-cosmos-postgres-aca?quickstart=1)|\n   |azure-fastapi-cosmos-postgres-appservice|FastAPI|Cosmos DB (PostgreSQL Adapter)|Azure App Service|[New Codespace](https://codespaces.new/Azure-Samples/azure-fastapi-cosmos-postgres-appservice?quickstart=1)|\n   |azure-fastapi-postgres-addon-aca|FastAPI|Azure Container Apps PostgreSQL Add-on|Azure Container Apps|[New Codespace](https://codespaces.new/Azure-Samples/azure-fastapi-postgres-addon-aca?quickstart=1)|\n\n   # [Flask](#tab/flask)\n\n   |Template|Web Framework|Database|Hosting Platform|New Codespace|\n   |----------|----------|----------|----------|----------|\n   |azure-flask-postgres-flexible-aca|Flask|PostgreSQL Flexible Server|Azure Container Apps|[New Codespace](https://codespaces.new/Azure-Samples/azure-flask-postgres-flexible-aca?quickstart=1)|\n   |azure-flask-postgres-flexible-appservice|Flask|PostgreSQL Flexible Server|Azure App Service|[New Codespace](https://codespaces.new/Azure-Samples/azure-flask-postgres-flexible-appservice?quickstart=1)|\n   |azure-flask-cosmos-postgres-aca|Flask|Cosmos DB (PostgreSQL Adapter)|Azure Container Apps|[New Codespace](https://codespaces.new/Azure-Samples/azure-flask-cosmos-postgres-aca?quickstart=1)|\n   |azure-flask-cosmos-postgres-appservice|Flask|Cosmos DB (PostgreSQL Adapter)|Azure App Service|[New Codespace](https://codespaces.new/Azure-Samples/azure-flask-cosmos-postgres-appservice?quickstart=1)|\n   |azure-flask-postgres-addon-aca|Flask|Azure Container Apps PostgreSQL Add-on|Azure Container Apps|[New Codespace](https://codespaces.new/Azure-Samples/azure-flask-postgres-addon-aca?quickstart=1)|\n   |azure-flask-cosmos-mongodb-aca|Flask|Cosmos DB (MongoDB)|Azure Container Apps|[New Codespace](https://codespaces.new/Azure-Samples/azure-flask-cosmos-mongodb-aca?quickstart=1)|\n   |azure-flask-cosmos-mongodb-appservice|Flask|Cosmos DB (MongoDB)|Azure App Service|[New Codespace](https://codespaces.new/Azure-Samples/azure-flask-cosmos-mongodb-appservice?quickstart=1)|\n\n   ---\n\n2. For your convenience, the last column of each table contains a link that creates a new Codespace and initializes the `azd` template in your GitHub account. Right-click the **New Codespace** link next to the template name you selected and select **Open in new tab** to initiate the setup process.\n\n   During this process, you might be prompted to sign in to your GitHub account. You're also asked to confirm that you want to create the Codespace. Select the **Create Codespace** button to see the **Setting up your codespace** page.\n\n3. After a few minutes, a web-based version of Visual Studio Code loads in a new browser tab with the Python web template loaded as a workspace in the Explorer view.\n\n## Authenticate to Azure and deploy the azd template\n\nNow that you have a GitHub Codespace containing the newly generated code, use the `azd` utility from within the Codespace to publish the code to Azure.\n\n1. In the web-based Visual Studio Code, the terminal is open by default. If it isn't, use the tilde `~` key to open the terminal. By default, the terminal is a bash terminal. If it isn't, change to bash in the upper right hand area of the terminal window.\n\n1. In the bash terminal, enter the following command:\n\n   ```bash\n   azd auth login\n   ```\n\n   `azd auth login` starts authenticating your Codespace to your Azure account.\n\n   ```output\n   Start by copying the next code: XXXXXXXXX\n   Then press enter and continue to log in from your browser...\n  \n   Waiting for you to complete authentication in the browser...\n   ```\n\n1. Follow the instructions, which include:\n\n   - Copying a generated code\n   - Selecting **enter** to open a new browser tab and pasting the code into the text box\n   - Choosing your Azure account from a list\n   - Confirming that you're trying to sign in to Microsoft Azure CLI\n\n1. When successful, the following message is displayed back in the Codespaces tab at the terminal:\n\n   ```output\n   Device code authentication completed.\n   Logged in to Azure.\n   ```\n\n1. Deploy your new application to Azure by entering the following command:\n\n   ```bash\n   azd up\n   ```\n\n   During this process, you're asked to:\n\n   - Enter a new environment name\n   - Select an Azure Subscription to use [Use arrows to move, type to filter]\n   - Select an Azure location to use: [Use arrows to move, type to filter]\n\n   Once you answer those questions, the output from `azd` indicates the deployment is progressing.\n\n   > [!IMPORTANT]\n   > Once `azd up` completes successfully, the sample web app is available on the public internet and your Azure Subscription begins accruing charges for all resources that are created. The creators of the `azd` templates intentionally chose inexpensive tiers but not necessarily *free* tiers since free tiers often have restricted availability. When you finish working with the sample web app, use `azd down` to remove all of the services that `azd up` created.\n\n   Follow the instructions when prompted to choose Azure Subscription to use for payment, then select an Azure location to use. Choose a region that is close to you geographically.\n\n   Executing `azd up` can take several minutes since it's provisioning and deploying multiple Azure services. As progress is displayed, watch for errors. If you see errors, see the [Troubleshooting](#troubleshooting) section at the bottom of this document.\n\n1. When `azd up` completes successfully, similar output is displayed:\n\n   ```output\n   (✓) Done: Deploying service web\n   - Endpoint: https://xxxxx-xxxxxxxxxxxxx-ca.example-xxxxxxxx.westus.azurecontainerapps.io/\n\n   SUCCESS: Your application was provisioned and deployed to Azure in 11 minutes 44 seconds.\n   You can view the resources created under the resource group xxxxx-rg in Azure portal:\n   https://portal.azure.com/#@/resource/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/xxxxx-rg/overview\n   ```\n\n   If you see a default screen or error screen, the app might be starting up. Wait 5-10 minutes to see if the issue resolves itself before troubleshooting.\n\n   1. Ctrl + click the first URL after the word `- Endpoint:` to see the sample web app project running live in Azure.\n\n1. Ctrl + click the second URL from the previous step to view the provisioned resources in the Azure portal.\n\n## Edit and redeploy\n\nNext, make a small change to the web app and then redeploy it.\n\n1. Go back to the browser tab that contains Visual Studio Code. Use Visual Studio Code's Explorer view to go to the *src/templates* folder. Open the *index.html* file. Find the following line of code:\n\n   ```html\n   <h1 id=\"page-title\">Welcome to ReleCloud</h1>\n   ```\n\n   Change the text inside the H1:\n\n   ```html\n   <h1 id=\"page-title\">Welcome to ReleCloud - UPDATED</h1>\n   ```\n\n   Your code is saved as you type.\n\n1. To redeploy the app with your change, run the following command in the terminal:\n\n   ```bash\n   azd deploy\n   ```\n\n1. When the command finishes, refresh the browser tab with the ReleCloud website to see the update. Depending on the web hosting platform you're using, it might take several minutes before your changes are visible.\n\n   You're now ready to edit and delete files in the template. For more information, see [What can I edit or delete in the template?](./overview-azd-templates.md#what-can-i-edit-or-delete)\n\n## Clean up resources\n\nClean up the resources that the template created by running the [azd down](/azure/developer/azure-developer-cli/reference#azd-down) command.\n\n```bash\nazd down\n```\n\nThe `azd down` command deletes the Azure resources and the GitHub Actions workflow. When prompted, agree to deleting all resources associated with the resource group.\n\n## Optional: Find your codespace\n\nThis section demonstrates how your code is temporarily running and persisted short-term in a Codespace. If you plan on continuing to work on the code, publish the code to a new repository.\n\n1. Close all tabs related to this Quickstart article, or shut down your web browser entirely.\n\n1. Open your web browser and a new tab, and go to [https://github.com/codespaces](https://github.com/codespaces).\n\n1. Near the bottom, you see a list of recent Codespaces. Look for the one you created in a section titled \"Owned by Azure-Samples\".\n\n1. Select the ellipsis to the right of this Codespace to view a context menu. From here you can rename the codespace, publish to a new repository, change machine type, stop the codespace, and more.\n\n## Optional: Publish a GitHub repository from Codespaces\n\nAt this point, you have a Codespace, which is a container hosted by GitHub running your Visual Studio Code development environment with your new code generated from an `azd` template. However, the code isn't stored in a GitHub repository. If you plan on continuing to work on the code, prioritize storing it in a repository.\n\n1. From the context menu for the codespace, select **Publish to a new repository**.\n1. In the **Publish to a new repository** dialog, rename your new repo and choose whether you want it to be a public or private repo. Select **Create repository**.\n1. After a few moments, the repository is created and the code you generated earlier in this Quickstart is pushed to the new repository. Select the **See repository** button to go to the new repo.\n1. To reopen and continue editing code, select the green \"< > Code\" drop-down, switch to the **Codespaces** tab, and select the name of the Codespace you were working on previously. You return to your Codespace Visual Studio Code development environment.\n1. Use the Source Control pane to create new branches and stage and commit new changes to your code.\n\n## Troubleshooting\n\nIf you see errors during `azd up`, try the following steps:\n\n- Run `azd down` to remove any resources that the command created. Alternatively, you can delete the resource group that you created in the Azure portal.\n- Go to the Codespaces page for your GitHub account, find the Codespace created during this Quickstart, select the ellipsis at the right, and choose **Delete** from the context menu.\n- In the Azure portal, search for Key Vaults. Select **Manage deleted vaults**, choose your subscription, select all key vaults that contain the name *azdtest* or whatever you named your environment, and select **Purge**.\n- Retry the steps in this quickstart. This time when prompted, choose a simpler name for your environment. Try a short name, lowercase letters, no numbers, no uppercase letters, and no special characters.\n- When retrying the quickstart steps, choose a different location.\n\nFor a more comprehensive list of possible issues and solutions, see the [FAQ](./overview-azd-templates.md#frequently-asked-questions).\n\n## Related content\n\n- [Learn more about the Python web `azd` templates](./overview-azd-templates.md)\n- [Learn more about the `azd` commands](./overview-azd-templates.md#how-do-the-templates-work).\n- Learn what each of the folders and files in the project do and [what you can edit or delete](./overview-azd-templates.md#what-can-i-edit-or-delete).\n- [Learn more about GitHub Codespaces](https://docs.github.com/en/codespaces/getting-started/quickstart)\n- [Update the Bicep templates to add or remove Azure services](./quickstart-python-scale-bicep.md). Don't know Bicep? Try this [Learning Path: Fundamentals of Bicep](/training/paths/fundamentals-bicep/)\n- [Use `azd` to set up a GitHub Actions CI/CD pipeline to redeploy on merge to main branch](./overview-azd-templates.md)\n- Set up monitoring so that you can [Monitor your app using the Azure Developer CLI](/azure/developer/azure-developer-cli/monitor-your-app)\n"
  },
  {
    "path": "articles/python/quickstart-python-web-azd-templates.md",
    "content": "---\ntitle: Create and deploy a Python web app to Azure using an azd template\ndescription: Quickstart article featuring the use of an azd template to help you get started with a complete project in 15 minutes.\nms.date: 2/28/2026\nms.topic: quickstart\nms.custom:\n  - devx-track-python\n  - devx-track-extended-azdevcli\n  - sfi-image-nochange\n---\n\n# Quickstart: Create and deploy a Python web app to Azure by using an azd template\n\nThis quickstart guides you through the easiest and fastest way to create and deploy a Python web and database solution to Azure. By following the instructions in this quickstart, you:\n\n- Choose an `azd` template based on the Python web framework, Azure database platform, and Azure web hosting platform you want to build on.\n- Use CLI commands to run an `azd` template to create a sample web app and database, and create and configure the necessary Azure resources. Then, deploy the sample web app to Azure.\n- Edit the web app on your local computer and use an `azd` command to redeploy.\n- Use an `azd` command to clean up Azure resources.\n\nIt should take less than 15 minutes to complete this tutorial. When you finish, you can start modifying the new project with your custom code.\n\nTo learn more about these `azd` templates for Python web app development, see:\n\n- [What are these templates?](./overview-azd-templates.md#what-are-the-python-web-azd-templates)\n- [How do the templates work?](./overview-azd-templates.md#how-do-the-templates-work)\n- [Why would I want to use this?](./overview-azd-templates.md#why-would-i-want-to-use-this)\n- [What are my other options?](./overview-azd-templates.md#what-are-my-other-options)\n\n## Prerequisites\n\nAn Azure subscription - [Create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn)\n\nInstall the following tools on your local computer:\n\n- [Azure Developer CLI](../azure-developer-cli/install-azd.md?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&pivots=os-windows)\n- [Docker Desktop](https://www.docker.com/products/docker-desktop/)\n- [Visual Studio Code](https://code.visualstudio.com/)\n- [Dev Container Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)\n\n## Choose a template\n\nChoose an `azd` template based on the Python web framework, Azure web hosting platform, and Azure database platform you want to build on.\n\n1. Select a template name (first column) from the following list of templates in the following tables. Use the template name during the `azd init` step in the next section.\n\n   # [Django](#tab/django)\n\n   |Template|Web Framework|Database|Hosting Platform|GitHub Repo|\n   |----------|----------|----------|----------|----------|\n   |azure-django-postgres-flexible-aca|Django|PostgreSQL Flexible Server|Azure Container Apps|[repo](https://github.com/Azure-Samples/azure-django-postgres-flexible-aca)|\n   |azure-django-postgres-flexible-appservice|Django|PostgreSQL Flexible Server|Azure App Service|[repo](https://github.com/Azure-Samples/azure-django-postgres-flexible-appservice)|\n   |azure-django-cosmos-postgres-aca|Django|Cosmos DB (PostgreSQL Adapter)|Azure Container Apps|[repo](https://github.com/Azure-Samples/azure-django-cosmos-postgres-aca)|\n   |azure-django-cosmos-postgres-appservice|Django|Cosmos DB (PostgreSQL Adapter)|Azure App Service|[repo](https://github.com/Azure-Samples/azure-django-cosmos-postgres-appservice)|\n   |azure-django-postgres-addon-aca|Django|Azure Container Apps PostgreSQL Add-on|Azure Container Apps|[repo](https://github.com/Azure-Samples/azure-django-postgres-addon-aca)|\n\n   # [FastAPI](#tab/fastapi)\n\n   |Template|Web Framework|Database|Hosting Platform|GitHub Repo|\n   |----------|----------|----------|----------|----------|\n   |azure-fastapi-postgres-flexible-aca|FastAPI|PostgreSQL Flexible Server|Azure Container Apps|[repo](https://github.com/Azure-Samples/azure-fastapi-postgres-flexible-aca)|\n   |azure-fastapi-postgres-flexible-appservice|FastAPI|PostgreSQL Flexible Server|Azure App Service|[repo](https://github.com/Azure-Samples/azure-fastapi-postgres-flexible-appservice)|\n   |azure-fastapi-cosmos-postgres-aca|FastAPI|Cosmos DB (PostgreSQL Adapter)|Azure Container Apps|[repo](https://github.com/Azure-Samples/azure-fastapi-cosmos-postgres-aca)|\n   |azure-fastapi-cosmos-postgres-appservice|FastAPI|Cosmos DB (PostgreSQL Adapter)|Azure App Service|[repo](https://github.com/Azure-Samples/azure-fastapi-cosmos-postgres-appservice)|\n   |azure-fastapi-postgres-addon-aca|FastAPI|Azure Container Apps PostgreSQL Add-on|Azure Container Apps|[repo](https://github.com/Azure-Samples/azure-fastapi-postgres-addon-aca)|\n\n   # [Flask](#tab/flask)\n\n   |Template|Web Framework|Database|Hosting Platform|GitHub Repo|\n   |----------|----------|----------|----------|----------|\n   |azure-flask-postgres-flexible-aca|Flask|PostgreSQL Flexible Server|Azure Container Apps|[repo](https://github.com/Azure-Samples/azure-flask-postgres-flexible-aca)|\n   |azure-flask-postgres-flexible-appservice|Flask|PostgreSQL Flexible Server|Azure App Service|[repo](https://github.com/Azure-Samples/azure-flask-postgres-flexible-appservice)|\n   |azure-flask-cosmos-postgres-aca|Flask|Cosmos DB (PostgreSQL Adapter)|Azure Container Apps|[repo](https://github.com/Azure-Samples/azure-flask-cosmos-postgres-aca)|\n   |azure-flask-cosmos-postgres-appservice|Flask|Cosmos DB (PostgreSQL Adapter)|Azure App Service|[repo](https://github.com/Azure-Samples/azure-flask-cosmos-postgres-appservice)|\n   |azure-flask-postgres-addon-aca|Flask|Azure Container Apps PostgreSQL Add-on|Azure Container Apps|[repo](https://github.com/Azure-Samples/azure-flask-postgres-addon-aca)|\n   |azure-flask-cosmos-mongodb-aca|Flask|Cosmos DB (MongoDB)|Azure Container Apps|[repo](https://github.com/Azure-Samples/azure-flask-cosmos-mongodb-aca)|\n   |azure-flask-cosmos-mongodb-appservice|Flask|Cosmos DB (MongoDB)|Azure App Service|[repo](https://github.com/Azure-Samples/azure-flask-cosmos-mongodb-appservice)|\n\n   The \"GitHub repo\" column is only for reference. Clone the repository directly only if you want to contribute changes to the template. Otherwise, follow the instructions in this quickstart to use the `azd` CLI to interact with the template in a normal workflow.\n\n## Run the template\n\nRunning an `azd` template is the same across languages and frameworks. The same basic steps apply to all templates. The steps are:\n\n1. At a terminal, navigate to a folder on your local computer where you typically store your local git repositories. Create a new folder named *azdtest*. Then, change into that directory by using the `cd` command.\n\n   ```shell\n   mkdir azdtest\n   cd azdtest\n   ```\n\n   Don't use Visual Studio Code's Terminal for this quickstart.\n\n1. To set up the local development environment, enter the following commands in your terminal and answer any prompts:\n\n   ```shell\n   azd init --template <template name>\n   ```\n\n   Substitute `<template name>` with one of the templates from the [tables](#choose-a-template) you selected in a previous step, such as *azure-django-postgres-aca* for example.\n\n   When prompted for an environment name, use *azdtest* or any other\n   name. The environment name is used when naming Azure resource groups and resources. For\n   best results, use a short name, lower case letters, no special characters.\n\n1. To authenticate `azd` to your Azure account, enter the following commands in your terminal and follow the prompt:\n\n   ```shell\n   azd auth login\n   ```\n\n   Follow the instructions when prompted to \"Pick an account\" or sign in to your Azure account. Once\n   you successfully authenticate, the following message is displayed in a web page:\n   \"Authentication complete. You can return to the application. Feel free to close\n   this browser tab.\"\n\n   When you close the tab, the shell displays the message:\n\n   ```output\n   Logged in to Azure.\n   ```\n\n1. Ensure that Docker Desktop is open and running in the background before attempting the next step.\n\n1. To create the necessary Azure resources, enter the following commands in your\nterminal and answer any prompts:\n\n   ```shell\n   azd up\n   ```\n\n   >[!IMPORTANT]\n   >Once `azd up` completes successfully, the sample web app is available on the public internet and your Azure Subscription begins accruing charges for all resources that are created. The creators of the `azd` templates intentionally chose inexpensive tiers but not necessarily *free* tiers since free tiers often have restricted availability.\n\n   Follow the instructions when prompted to choose Azure Subscription to use for payment, then\n   select an Azure location to use. Choose a region that is close to you geographically.\n\n   Executing `azd up` can take several minutes since it's provisioning and\n   deploying multiple Azure services. As progress is displayed, watch for errors. If you see errors, try the following to fix the problem:\n\n   - Delete the *azd-quickstart* folder and the quickstart instructions from the beginning.\n   - When prompted, choose a simpler name for your environment. Only use lower-case letters and dashes. No numbers, upper-case letters, or special characters.\n   - Choose a different location.\n\n   If you still have problems, see the [Troubleshooting](#troubleshooting) section at the bottom of this document.\n\n   >[!IMPORTANT]\n   >When you finish working with the sample web app, use `azd down` to remove all of the services that `azd up` created.\n\n1. When `azd up` completes successfully, the following output is displayed:\n\n   :::image type=\"content\" source=\"media/quickstart-python-web-azd-templates/success-endpoint.png\" alt-text=\"Screenshot of successful output from the azd command line interface with a callout around the endpoint URL to view the working Relecloud application deployed in Azure.\":::\n\n   Copy the first URL after the word `- Endpoint:` and paste it into the location\n   bar of a web browser to see the sample web app project running live in Azure.\n\n1. Open a new tab in your web browser.\n   1. Copy the second URL from the previous step and paste it into the location bar.\n   1. The Azure portal displays all of the services in your new resource group that are deployed to host the sample web app project.\n\n## Edit and redeploy\n\nNext, make a small change to the web app and then redeploy it.\n\n1. Open Visual Studio Code and open the *azdtest* folder.\n\n1. This template is configured to optionally use Dev Containers. When you see the Dev Container notification appear in Visual Studio Code, select the **Reopen in Container** button.\n\n1. Use Visual Studio Code's Explorer view to navigate to *src/templates* folder, and open the *index.html* file. Locate the following line of code:\n\n   ```html\n   <h1 id=\"pagte-title\">Welcome to ReleCloud</h1>\n   ```\n\n   Change the text inside of the H1:\n\n   ```html\n   <h1 id=\"pagte-title\">Welcome to ReleCloud - UPDATED</h1>\n   ```\n\n   Save your changes.\n\n1. To redeploy the app with your change, run the following command in your terminal:\n\n   ```Shell\n   azd deploy\n   ```\n\n   Since you're using Dev Containers and are connected remotely into the container's shell, don't use Visual Studio Code's Terminal pane to run `azd` commands.\n\n1. When the command finishes, refresh your web browser to see the update. Depending on the web hosting platform you're using, it might take several minutes before your changes are visible.\n\n   You're now ready to edit and delete files in the template. For more information, see [What can I edit or delete in the template?](./overview-azd-templates.md#what-can-i-edit-or-delete)\n\n## Clean up resources\n\n1. Clean up the resources created by the template by running the [`azd down`](/azure/developer/azure-developer-cli/reference#azd-down) command.\n\n   ```Shell\n   azd down\n   ```\n\n   The `azd down` command deletes the Azure resources and the GitHub Actions workflow.\n   When prompted, agree to deleting all resources associated with the resource group.\n\n   You can also delete the *azdtest* folder, or use it as the basis for your own application by modifying the project's files.\n\n## Troubleshooting\n\nIf you see errors during `azd up`, try the following steps:\n\n- Run `azd down` to remove any resources that the command created. Alternatively, you can delete the resource group that you created in the Azure portal.\n- Delete the *azdtest* folder on your local computer.\n- In the Azure portal, search for Key Vaults. Select **Manage deleted vaults**, choose your subscription, select all key vaults that contain the name *azdtest* or whatever you named your environment, and select **Purge**.\n- Retry the steps in this quickstart. This time when prompted, choose a simpler name for your environment. Try a short name, lowercase letters, no numbers, no uppercase letters, and no special characters.\n- When retrying the quickstart steps, choose a different location.\n\nFor a more comprehensive list of possible issues and solutions, see the [FAQ](./overview-azd-templates.md#frequently-asked-questions).\n\n## Related content\n\n- [Learn more about the Python web `azd` templates](./overview-azd-templates.md).\n- [Learn more about the `azd` commands](./overview-azd-templates.md#how-do-the-templates-work).\n- Learn what each of the folders and files in the project do and [what you can edit or delete](./overview-azd-templates.md#what-can-i-edit-or-delete).\n- [Learn more about Dev Containers](https://code.visualstudio.com/docs/devcontainers/containers).\n- [Update the Bicep templates to add or remove Azure services](./quickstart-python-scale-bicep.md). Don't know Bicep? Try this [Learning Path: Fundamentals of Bicep](/training/paths/fundamentals-bicep/).\n- [Use `azd` to set up a GitHub Actions CI/CD pipeline to redeploy on merge to main branch](./overview-azd-templates.md).\n- Set up monitoring so that you can [Monitor your app using the Azure Developer CLI](/azure/developer/azure-developer-cli/monitor-your-app).\n"
  },
  {
    "path": "articles/python/quickstarts-ai-services.md",
    "content": "---\ntitle: Getting starting with Foundry Tools for Python apps on Azure\ndescription: Index of getting started material in the Azure documentation for Foundry Tools for Python apps.\nms.date: 06/02/2025\nms.topic: how-to\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Foundry Tools for Python apps on Azure\n\nFoundry Tools are cloud-based artificial intelligence (AI) services that help developers build cognitive intelligence into applications without having direct AI or data science skills or knowledge. There are ready-made Foundry Tools for computer vision and image processing, language analysis and translation, speech, decision-making, search, and Azure OpenAI that you can use in your Python applications.\n\nBecause of the dynamic nature of Foundry Tools, the best way to find getting started material for Python is to begin on the [Foundry Tools hub page](/azure/ai-services/), and then find the specific service you're looking for.\n\n1. On the hub page, select a service to go its documentation landing page. For example, for [Azure Vision in Foundry Tools](/azure/ai-services/computer-vision/).\n\n1. On the service's landing page, select a category of the service. For example, in Computer Vision, select [Image Analysis](/azure/ai-services/computer-vision/overview-image-analysis).\n\n1. In the documentation, look for **Quickstarts** in the table of contents. For example, in the Image Analysis documentation, under Quickstarts, there's a [Version 4.0 quickstart (preview)](/azure/ai-services/computer-vision/quickstarts-sdk/image-analysis-client-library-40?pivots=programming-language-python).\n\n1. In quickstart articles, choose the Python programming language if it exists or the REST API.\n\n    If you don't see a quickstart, in the table of contents search box enter *Python* to find Python-related articles.\n\nAlso, you can go to the [Azure Cognitive Services modules for Python](/python/api/overview/azure/cognitive-services) overview to learn about the available Python SDK modules. (Azure Cognitive Services is the previous name of Foundry Tools. The documentation is currently being updated to reflect the change.)\n\n> [!div class=\"nextstepaction\"]\n> [Go to the Foundry Tools hub page >>>](/azure/ai-services/)\n\nThe documentation for Azure AI Search is in a separate part of the documentation:\n\n- [Quickstart: Full text search using the Azure SDKs](/azure/search/search-get-started-text?tabs=python)\n- [Use Python and AI to generate searchable content from Azure blobs](/azure/search/cognitive-search-tutorial-blob-python)\n"
  },
  {
    "path": "articles/python/quickstarts-app-hosting.md",
    "content": "---\ntitle: Getting started with hosting Python apps on Azure\ndescription: Index of getting started material in the Azure documentation for hosting Python app code.\nms.date: 05/20/2025\nms.topic: get-started\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Hosting Python apps on Azure\n\nAzure offers several options for hosting your application, each suited to different levels of control and responsibility. For an overview of these options, see [Hosting applications on Azure](../intro/hosting-apps-on-azure.md).\n\nIn general, selecting a hosting option involves balancing control with management responsibility. The more control you require over the infrastructure, the more responsibility you take on for management of one or more resources.\n\nWe recommend starting with Azure App Service, which provides a highly managed environment with minimal administrative overhead. As your needs evolve, you can explore other options that offer increased flexibility and control, such as Azure Container Apps, Azure Kubernetes Service (AKS), or ultimately Azure Virtual Machines, which provide the greatest control but also require the most maintenance.\n\nThe hosting options in this article are presented in order from more managed (less responsibility on your part) to less managed (more control and responsibility).\n\n- **Web app hosting with Azure App Service**:\n  - [Quickstart: Deploy a Python (Django or Flask) web app to Azure App Service](/azure/app-service/quickstart-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/breadcrumb/toc.json)\n  - [Deploy a Python (Django or Flask) web app with PostgreSQL in Azure](/azure/app-service/tutorial-python-postgresql-app?toc=/azure/developer/python/toc.json&bc=/azure/developer/breadcrumb/toc.json)\n  - [Create and deploy a Flask web app to Azure with a system-assigned managed identity](./tutorial-python-managed-identity-cli.md)\n  - [Configure a Python app for Azure App Service](/azure/app-service/configure-language-python)\n\n- **Content delivery network with Azure Static web apps**\n  - [Static website hosting in Azure Storage](/azure/storage/blobs/storage-blob-static-website?toc=/azure/developer/python/toc.json&bc=/azure/developer/breadcrumb/toc.json)\n  - [Quickstart: Building your first static site with Azure Static Web Apps](/azure/static-web-apps/getting-started?toc=/azure/developer/python/toc.json&bc=/azure/developer/breadcrumb/toc.json)\n\n- **Serverless hosting with Azure Functions**:\n  - [Quickstart: Create a Python function in Azure from the command line](/azure/azure-functions/create-first-function-cli-python)\n  - [Quickstart: Create a function in Azure with Python using Visual Studio Code](/azure/azure-functions/create-first-function-vs-code-python)\n  - [Connect Azure Functions to Azure Storage using command line tools](/azure/azure-functions/functions-add-output-binding-storage-queue-cli?tabs=bash%2Cbrowser&pivots=programming-language-python)\n  - [Connect Azure Functions to Azure Storage using Visual Studio Code](/azure/azure-functions/functions-add-output-binding-storage-queue-vs-code?pivots=programming-language-python)\n  \n- **Container hosting with Azure**:\n  - [Overview of Python Container Apps in Azure](./containers-in-azure-overview-python.md)\n  - [Deploy a container to App Service](./tutorial-containerize-deploy-python-web-app-azure-01.md)\n  - [Deploy a container to Azure Container Apps](./tutorial-deploy-python-web-app-azure-container-apps-01.md)\n  - [Quickstart: Deploy an Azure Kubernetes Service cluster using the Azure CLI](/azure/aks/learn/quick-kubernetes-deploy-cli?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json)\n  - [Deploy a container in Azure Container Instances using the Azure CLI](/azure/container-instances/container-instances-quickstart)\n  - [Create your first Service Fabric container application on Linux](/azure/service-fabric/service-fabric-get-started-containers-linux)\n\n- **Compute intensive and long running operations with Azure Batch**:\n  - [Use Python to create and run an Azure Batch job](/azure/batch/quick-run-python)\n  - [Tutorial: Run a parallel file processing workload with Azure Batch using Python](/azure/batch/tutorial-parallel-python)\n  - [Tutorial: Run Python scripts through Azure Data Factory using Azure Batch](/azure/batch/tutorial-run-python-batch-azure-data-factory)\n\n- **On-demand, scalable computing resources with Azure Virtual Machines**:\n  - [Quickstart: Use the Azure CLI to deploy a Linux virtual machine (VM) in Azure](/azure/virtual-machines/linux/quick-create-cli)\n"
  },
  {
    "path": "articles/python/quickstarts-data-solutions.md",
    "content": "---\ntitle: Getting started with data solutions for Python apps on Azure\ndescription: Index of getting started material in the Azure documentation for data solutions for Python apps.\nms.date: 06/02/2025\nms.topic: get-started\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Data solutions for Python apps on Azure\n\nAzure offers a wide range of fully managed database and storage solutions, including relational, NoSQL, and in-memory databases, with support for both proprietary and open-source technologies. You can also choose from object, block, and file storage services. The following articles can help you get started using these options with Python on Azure.\n\n## Databases\n\n- **PostgreSQL**: Build scalable, secure, and fully managed enterprise apps using open-source PostgreSQL. You can scale single-node PostgreSQL for high performance or migrate existing PostgreSQL and Oracle workloads to the cloud.\n\n  - [Quickstart: Use Python to connect and query data in Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/connect-python)\n  - [Quickstart: Use Python to connect and query data in Azure Database for PostgreSQL - Single Server](/azure/postgresql/single-server/connect-python)\n  - [Deploy a Python (Django or Flask) web app with PostgreSQL in Azure App Service](/azure/app-service/tutorial-python-postgresql-app?toc=/azure/developer/python/toc.json&bc=/azure/developer/breadcrumb/toc.json)\n\n- **MySQL**: Build scalable applications using a fully managed, intelligent MySQL database in the cloud.\n  - [Quickstart: Use Python to connect and query data in Azure Database for MySQL - Flexible Server](/azure/mysql/flexible-server/connect-python)\n  - [Quickstart: Use Python to connect and query data in Azure Database for MySQL](/azure/mysql/single-server/connect-python)\n\n- **Azure SQL**: Build scalable applications with a fully managed and intelligent SQL database platform in the cloud.\n  - [Quickstart: Use Python to query a database  in Azure SQL Database or Azure SQL Managed Instance](/azure/azure-sql/database/connect-query-python)\n\n## NoSQL, blobs, tables, files, graphs, and caches\n\n- **Cosmos DB**: Build low-latency, high-availability apps at global scale, or migrate Cassandra, MongoDB, and other NoSQL workloads to the cloud.\n  - [Quickstart: Azure Cosmos DB for NoSQL client library for Python](/azure/cosmos-db/nosql/quickstart-python)\n  - [Quickstart: Azure Cosmos DB for MongoDB for Python with MongoDB driver](/azure/cosmos-db/mongodb/quickstart-python)\n  - [Quickstart: Build a Cassandra app with Python SDK and Azure Cosmos DB](/azure/cosmos-db/cassandra/manage-data-python)\n  - [Quickstart: Build an API for Table app with Python SDK and Azure Cosmos DB](/azure/cosmos-db/table/quickstart-python)\n  - [Quickstart: Azure Cosmos DB for Apache Gremlin library for Python](/azure/cosmos-db/gremlin/quickstart-python)\n\n- **Blob storage**: Secure, massively scalable object storage for cloud-native apps, data lakes, archives, high-performance computing (HPC), and machine learning.\n  - [Quickstart: Azure Blob Storage client library for Python](/azure/storage/blobs/storage-quickstart-blobs-python)\n  - [Azure Storage samples using v12 Python client libraries](/azure/storage/common/storage-samples-python)\n\n- **Azure Data Lake Storage Gen2**: Scalable, secure data lake optimized for high-performance analytics.\n  - [Use Python to manage directories and files in Azure Data Lake Storage Gen2](/azure/storage/blobs/data-lake-storage-directory-file-acl-python)\n  - [Use Python to manage ACLs in Azure Data Lake Storage Gen2](/azure/storage/blobs/data-lake-storage-acl-python)\n\n- **File storage**: Simple, secure, and serverless enterprise-grade cloud file shares.\n  - [Develop for Azure Files with Python](/azure/storage/files/storage-python-how-to-use-file-storage)\n\n- **Redis Cache**: Accelerate application performance with a scalable, in-memory data store compatible with open source.\n  - [Quickstart: Use Azure Cache for Redis in Python](/azure/azure-cache-for-redis/cache-python-get-started)\n\n## Big data and analytics\n\n- **Azure Data Lake analytics**: Fully managed, pay-per-job analytics service that delivers powerful parallel data processing with built-in enterprise-grade security, auditing, and support.\n  - [Manage Azure Data Lake Analytics using Python](/azure/data-lake-analytics/data-lake-analytics-manage-use-python-sdk)\n  - [Develop U-SQL with Python for Azure Data Lake Analytics in Visual Studio Code](/azure/data-lake-analytics/data-lake-analytics-u-sql-develop-with-python-r-csharp-in-vscode)\n\n- **Azure Data Factory**: A fully managed data integration service that lets you visually build, orchestrate, and automate data movement and transformation across various data sources.\n  - [Quickstart: Create a data factory and pipeline using Python](/azure/data-factory/quickstart-create-data-factory-python)\n  - [Transform data by running a Python activity in Azure Databricks](/azure/data-factory/transform-data-databricks-python)\n\n- **Azure Event Hubs**: A fully managed, hyper-scale telemetry ingestion service designed to collect, transform, and store millions of events per second from connected devices and applications.\n  - [Send events to or receive events from event hubs by using Python](/azure/event-hubs/event-hubs-python-get-started-send)\n  - [Capture Event Hubs data in Azure Storage and read it by using Python (azure-eventhub)](/azure/event-hubs/event-hubs-capture-python)\n\n- **HDInsight**: A fully managed cloud service that runs popular open-source frameworks like Hadoop and Spark, backed by a 99.9% SLA for enterprise-grade big data analytics.\n  - [Use Spark & Hive Tools for Visual Studio Code](/azure/hdinsight/hdinsight-for-vscode)\n\n- **Azure Databricks**: A fully managed, fast, easy and collaborative Apache® Spark™ based analytics platform optimized for big data and AI workloads on Azure.\n  - [Connect to Azure Databricks from Excel, Python, or R](/azure/databricks/scenarios/connect-databricks-excel-python-r)\n  - [Get Started with Azure Databricks](/azure/databricks/getting-started/)\n  - [Tutorial: Azure Data Lake Storage Gen2, Azure Databricks & Spark](/azure/storage/blobs/data-lake-storage-use-databricks-spark)\n\n- **Azure Synapse Analytics**: A fully managed analytics service that unifies data integration, enterprise data warehousing, and big data analytics into a single platform.\n  - [Quickstart: Use Python to query a database in Azure SQL Database or Azure SQL Managed Instance (includes Azure Synapse Analytics)](/azure/azure-sql/database/connect-query-python)\n"
  },
  {
    "path": "articles/python/quickstarts-identity-security.md",
    "content": "---\ntitle: Overview and resources for Azure identity and access management features for Python apps\ndescription: Overview and links to resources about authentication, identity, and access management for Python apps on Azure.\nms.date: 06/02/2025\nms.topic: concept-article\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Identity and access management for Python apps on Azure\n\nIn Azure, identity and access management (IAM) for Python applications involves two key concepts:\n\n* **Authentication**: Verifying the identity of a user, group, service, or application\n* **Authorization**: Determining what actions that identity is allowed to perform on Azure resources\n\nAzure provides multiple IAM options to fit your application's security requirements. This article includes links to essential resources to help you get started.\n\nTo learn more, see [Recommendations for identity and access management](/azure/well-architected/security/identity-access).\n\n## Passwordless connections\n\nWhenever possible, we recommend using managed identities to simplify identity management and enhance security. Managed identities support passwordless authentication, eliminating the need to embed sensitive credentials—such as passwords or client secrets—in code or environment variables.\nManaged identities are available for Azure services like App Service, Azure Functions, and Azure Container Apps. They allow your applications to authenticate to Azure services without needing to manage credentials.\n\nThe following resources demonstrate how to use the Azure SDK for Python with passwordless authentication via [DefaultAzureCredential](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/identity/azure-identity#defaultazurecredential). `DefaultAzureCredential` is ideal for most applications running in Azure, as it seamlessly supports both local development and production environments by chaining multiple credential types in a secure and intelligent order.\n\n* [Overview: Passwordless connection for Azure services](../intro/passwordless-overview.md)\n\n* [Authenticate Python Apps to Azure services using the Azure SDK for Python](./sdk/authentication-overview.md)\n\n* [Use DefaultAzureCredential in an application](./sdk/authentication-overview.md#use-defaultazurecredential-in-an-application)\n\n* [Quickstart: Azure Blob Storage client library for Python with passwordless connections](/azure/storage/blobs/storage-quickstart-blobs-python)\n\n* [Quickstart: Send messages to and receive message from Azure Service Bus queues with passwordless connections](/azure/service-bus-messaging/service-bus-python-how-to-use-queues)\n\n* [Create and deploy a Flask web app to Azure with a system-assigned managed identity](./tutorial-python-managed-identity-cli.md)\n\n* [Create and deploy a Django web app to Azure with a user-assigned managed identity](./tutorial-python-managed-identity-user-assigned-cli.md)\n\n## Service Connector\n\nMany Azure resources commonly used in Python applications support the [Service Connector](/azure/service-connector/overview). The Service Connector streamlines the process of configuring secure connections between Azure services. It automates the setup of authentication, network access, and connection strings between compute services (like App Service or Container Apps) and dependent services (such as Azure Storage, Azure SQL, or Cosmos DB). This reduces manual steps, helps enforce best practices (like using managed identities and private endpoints), and improves deployment consistency and security.\n\n* [Quickstart: Create a service connection in App Service from the Azure portal](/azure/service-connector/quickstart-portal-app-service-connection)\n\n* [Tutorial: Using Service Connector to build a Django app with Postgres on Azure App Service](/azure/service-connector/tutorial-django-webapp-postgres-cli)\n\n## Key Vault\n\nUsing a key management solution such as [Azure Key Vault](/azure/key-vault/general/overview) offers greater control over your secrets and credentials, though it comes with added management complexity.\n\n* [Quickstart: Azure Key Vault certificate client library for Python](/azure/key-vault/certificates/quick-create-python)\n\n* [Quickstart: Azure Key Vault keys client library for Python](/azure/key-vault/keys/quick-create-python)\n\n* [Quickstart: Azure Key Vault secret client library for Python](/azure/key-vault/secrets/quick-create-python)\n\n## Authentication and identity for signing in users in apps\n\nYou can develop Python applications that allow users to sign in with Microsoft identities (like Azure AD accounts) or external social accounts (such as Google or Facebook). Once authenticated, your app can authorize users to access its own APIs or Microsoft APIs, such as Microsoft Graph, to interact with resources like user profiles, calendars, and emails.\n\n* [Quickstart: Sign in users and call the Microsoft Graph API from a Python web app](/entra/identity-platform/quickstart-web-app-python-sign-in)\n\n* [Web app authentication topics](/entra/identity-platform/index-web-app)\n\n* [Quickstart: Acquire a token and call Microsoft Graph from a Python daemon app](/entra/identity-platform/quickstart-daemon-app-python-acquire-token)\n\n* [Back-end service, daemon, and script authentication topics](/entra/identity-platform/index-service?pivots=devlang-python)\n"
  },
  {
    "path": "articles/python/quickstarts-machine-learning.md",
    "content": "---\ntitle: Getting started materials for machine learning for Python apps on Azure\ndescription: Index of getting started materials in the Azure documentation for machine learning for Python apps.\nms.date: 06/11/2025\nms.topic: concept-article\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Machine learning for Python apps on Azure\n\nThe following articles help you get started with Azure Machine Learning. Azure Machine Learning v2 REST APIs, Azure CLI extension, and Python SDK are designed to streamline the entire machine learning lifecycle and accelerate production workflows. The links in this article target v2, which is recommended if you're starting a new machine learning project.\n\n## Getting started\n\nIn Azure Machine Learning, the workspace is the main resource that organizes and manages everything you create, such as datasets, models, and experiments.\n\n- [Quickstart: Get started with Azure Machine Learning](/azure/machine-learning/tutorial-azure-ml-in-a-day)\n- [Manage Azure Machine Learning workspaces in the portal or with the Python SDK (v2)](/azure/machine-learning/how-to-manage-workspace)\n- [Run Jupyter notebooks in your workspace](/azure/machine-learning/how-to-run-jupyter-notebooks)\n- [Tutorial: Model development on a cloud workstation](/azure/machine-learning/tutorial-cloud-workstation)\n\n## Deploy models\n\nDeploy models for low-latency, real-time machine learning predictions.\n\n- [Tutorial: Designer - deploy a machine learning model](/azure/machine-learning/tutorial-designer-automobile-price-deploy)\n- [Deploy and score a machine learning model by using an online endpoint](/azure/machine-learning/how-to-deploy-online-endpoints)\n\n## Automated machine learning\n\nAutomated ML (AutoML) refers to the process of streamlining machine learning model development by automating its repetitive and time-consuming tasks.\n\n- [Train a regression model with AutoML and Python (SDK v1)](/azure/machine-learning/v1/how-to-auto-train-models-v1)\n- [Set up AutoML training for tabular data with the Azure Machine Learning CLI and Python SDK (v2)](/azure/machine-learning/how-to-configure-auto-train)\n\n## Data access\n\nWith Azure Machine Learning, you can import data from your local computer or connect to existing cloud storage services.\n\n- [Create and manage data assets](/azure/machine-learning/how-to-create-data-assets)\n- [Tutorial: Upload, access and explore your data in Azure Machine Learning](/azure/machine-learning/tutorial-explore-data)\n- [Access data in a job](/azure/machine-learning/how-to-read-write-data-v2)\n\n## Machine learning pipelines\n\nUse machine learning pipelines to build workflows that connect different stages of the ML process.\n\n- [Use Azure Pipelines with Azure Machine Learning](/azure/machine-learning/how-to-devops-machine-learning)\n- [Create and run machine learning pipelines using components with the Azure Machine Learning SDK v2](/azure/machine-learning/how-to-create-component-pipeline-python)\n- [Tutorial: Create production ML pipelines with Python SDK v2 in a Jupyter notebook](/azure/machine-learning/tutorial-pipeline-python-sdk)\n"
  },
  {
    "path": "articles/python/quickstarts-messaging-iot.md",
    "content": "---\ntitle: Getting starting with messaging, events, and IoT for Python apps on Azure\ndescription: Index of Python-specific articles in Azure documentation for learning more about messaging, events, and IoT.\nms.date: 06/02/2025\nms.topic: concept-article\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Messaging, Events, and IoT for Python apps on Azure\n\nThe following articles help you get started with messaging, event ingestion and processing, and Internet of Things (IoT) services in Azure.\n\n## Messaging\n\nAzure messaging services let different components and apps communicate easily, no matter what language they use or where they're hosted—whether in the same cloud, across multiple clouds, or on-premises.\n\n- **Notifications**\n  - [How to use Notification Hubs from Python](/azure/notification-hubs/notification-hubs-python-push-notification-tutorial)\n\n- **Queues**\n  - [Quickstart: Azure Queue Storage client library for Python](/azure/storage/queues/storage-quickstart-queues-python)\n  - [Quickstart: Send messages to and receive messages from Azure Service Bus queues (Python)](/azure/service-bus-messaging/service-bus-python-how-to-use-queues)\n  - [Send messages to an Azure Service Bus topic and receive messages from subscriptions to the topic (Python)](/azure/service-bus-messaging/service-bus-python-how-to-use-topics-subscriptions)\n\n- **Real-time web functionality (SignalR)**\n  - [Quickstart: Create a serverless app with Azure Functions and Azure SignalR Service in Python](/azure/azure-signalr/signalr-quickstart-azure-functions-python)\n\n- **Azure Web PubSub**\n  - [How to create a `WebPubSubServiceClient` with Python and Azure Identity](/azure/azure-web-pubsub/howto-create-serviceclient-with-python-and-azure-identity)\n\n## Events\n\nAzure Event Hubs and Azure Event Grid are two key services for handling events in Azure. They provide capabilities for ingesting, processing, and routing events across various applications and services.\n\nThese services allow you to build event-driven architectures and process events in real time.\n\n- **Event Hubs**\n  - [Quickstart: Send events to or receive events from event hubs by using Python](/azure/event-hubs/event-hubs-python-get-started-send)\n  - [Quickstart: Capture Event Hubs data in Azure Storage and read it by using Python (azure-eventhub)](/azure/event-hubs/event-hubs-capture-python)\n\n- **Event Grid**\n  - [Quickstart: Route custom events to web endpoint with Azure CLI and Event Grid](/azure/event-grid/custom-event-quickstart)\n  - [Azure Event Grid Client Library Python Samples](/samples/azure/azure-sdk-for-python/eventgrid-samples/)\n\n## Internet of Things (IoT)\n\nInternet of Things (IoT) refers to a set of managed and platform services across edge and cloud that connect, monitor, and control IoT assets. IoT also encompasses device security, operating systems, and data analytics tools to help you build, deploy, and manage IoT applications effectively.\n\n- **IoT Hub**\n  - [Quickstart: Send telemetry from an IoT Plug and Play device to Azure IoT Hub](/azure/iot-develop/quickstart-send-telemetry-iot-hub?pivots=programming-language-python)\n  - [Send cloud-to-device messages with IoT Hub](/azure/iot-hub/iot-hub-python-python-c2d)\n  - [Upload files from your device to the cloud with IoT Hub](/azure/iot-hub/iot-hub-python-python-file-upload)\n  - [Schedule and broadcast jobs](/azure/iot-hub/iot-hub-python-python-schedule-jobs)\n  - [Quickstart: Control a device connected to an IoT hub](/azure/iot-hub/quickstart-control-device?pivots=programming-language-python)\n\n- **Device provisioning**\n  - [Quickstart: Provision an X.509 certificate simulated device](/azure/iot-dps/quick-create-simulated-device-x509?pivots=programming-language-python)\n  - [Tutorial: Provision devices using symmetric key enrollment groups](/azure/iot-dps/how-to-legacy-device-symm-key?pivots=programming-language-python)\n  - [Tutorial: Provision multiple X.509 devices using enrollment groups](/azure/iot-dps/tutorial-custom-hsm-enrollment-group-x509?pivots=programming-language-python)\n\n- **IoT Central/IoT Edge**\n  - [Tutorial: Create and connect a client application to your Azure IoT Central application](/azure/iot-central/core/tutorial-connect-device?pivots=programming-language-python)\n  - [Tutorial: Develop IoT Edge modules using Visual Studio Code](/azure/iot-edge/tutorial-develop-for-linux?tabs=python&pivots=iotedge-dev-cli)\n"
  },
  {
    "path": "articles/python/quickstarts-other-services.md",
    "content": "---\ntitle: Getting started materials for miscellaneous Azure services for Python apps\ndescription: Index of getting started material in the Azure documentation for miscellaneous services used with Python apps.\nms.date: 06/11/2025\nms.topic: concept-article\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Other services for Python apps on Azure\n\nThe services referenced in this article for Python are specialized, each designed to address a specific set of problems. The term *other services* includes Azure offerings beyond the foundational categories of compute, networking, storage, and databases. This article features examples from areas like management and governance, media, genomics, and the Internet of Things (IoT). For a full list of available services [Azure products](https://azure.microsoft.com/products/).\n\n- **Media streaming**:\n  - [Connect to Azure Media Services v3 API](/azure/media-services/latest/configure-connect-python-howto)\n\n- **Automation**:\n  - [Tutorial: Create a Python runbook](/azure/automation/learn/automation-tutorial-runbook-textual-python-3)\n\n- **DevOps**:\n  - [Use CI/CD with GitHub Actions to deploy a Python web app to Azure App Service on Linux](./python-web-app-github-actions-app-service.md)\n  - [Build and deploy a Python cloud app with the Azure Developer CLI (azd) open-source tool](../azure-developer-cli/get-started.md?pivots=programming-language-python)\n  - [Build, test, and deploy Python apps with Azure Pipelines](/azure/devops/pipelines/ecosystems/python)\n\n- **Internet of Things and geographical mapping**:\n  - [Tutorial: Route electric vehicles by using Azure Notebooks](/azure/azure-maps/tutorial-ev-routing)\n  - [Tutorial: Join sensor data with weather forecast data by using Azure Notebooks](/azure/azure-maps/weather-service-tutorial)\n\n- **Burrows-Wheeler Aligner (BWA) and the Genome Analysis Toolkit (GATK)**:\n  - [Quickstart: Run a workflow through the Microsoft Genomics service](/azure/genomics/quickstart-run-genomics-workflow-portal)\n\n- **Resource management**:\n  - [Quickstart: Run your first Resource Graph query using Python](/azure/governance/resource-graph/first-query-python)\n\n- **Virtual machine management**:\n  - [Example: Use the Azure libraries to create a virtual machine](./sdk/examples/azure-sdk-example-virtual-machines.md)\n"
  },
  {
    "path": "articles/python/sdk/authentication/additional-methods.md",
    "content": "---\ntitle: Additional methods to authenticate to Azure resources from Python apps\ndescription: This article describes additional, less common methods you can use to authenticate your Python app to Azure resources. \nms.date: 01/27/2026\nms.topic: how-to\nms.custom: devx-track-python, passwordless-python\n---\n\n# Additional methods to authenticate to Azure resources from Python apps\n\nThis article lists additional methods that apps can use to authenticate to Azure resources. The methods in this article are less commonly used; when possible, we encourage you to use one of the methods outlined in [authenticating Python apps to Azure using the Azure SDK overview](./overview.md).\n\n## Interactive browser authentication\n\nThis method interactively authenticates an application through [`InteractiveBrowserCredential`](/python/api/azure-identity/azure.identity.interactivebrowsercredential) by collecting user credentials in the default system.\n\nInteractive browser authentication enables the application for all operations allowed by the interactive sign-in credentials. As a result, if you're the owner or administrator of your subscription, your code has inherent access to most resources in that subscription without having to assign any specific permissions. For this reason, the use of interactive browser authentication is discouraged for anything but experimentation.\n\n### Enable applications for interactive browser authentication\n\nPerform the following steps to enable the application to authenticate through the interactive browser flow. These steps also work for [device code authentication](#device-code-authentication) described later. Following this process is necessary only if using `InteractiveBrowserCredential` in your code.\n\n1. On the [Azure portal](https://portal.azure.com), navigate to Microsoft Entra ID and select **App registrations** on the left-hand menu.\n1. Select the registration for your app, then select **Authentication**.\n1. Under **Advanced settings**, select **Yes** for **Allow public client flows**.\n1. Select **Save** to apply the changes.\n1. To authorize the application for specific resources, navigate to the resource in question, select **API Permissions**, and enable **Microsoft Graph** and other resources you want to access. Microsoft Graph is enabled by default.\n\n    > [!IMPORTANT]\n    > You must also be the admin of your tenant to grant consent to your application when you sign in for the first time.\n\nIf you can't configure the device code flow option on your Active Directory, your application might need to be multitenant. To make this change, navigate to the **Authentication** panel, select **Accounts in any organizational directory** (under **Supported account types**), and then select **Yes** for **Allow public client flows**.\n\n### Example using InteractiveBrowserCredential\n\nThe following example demonstrates using an [`InteractiveBrowserCredential`](/python/api/azure-identity/azure.identity.interactivebrowsercredential) to authenticate with the [`SubscriptionClient`](/python/api/azure-mgmt-resource/azure.mgmt.resource.subscriptions.subscriptionclient):\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/show_subscription/use_interactive_browser.py\":::\n\nFor more exact control, such as setting redirect URIs, you can supply specific arguments to `InteractiveBrowserCredential` such as `redirect_uri`.\n\n## Device code authentication\n\nThis method interactively authenticates a user on devices with limited UI (typically devices without a keyboard):\n\n1. When the application attempts to authenticate, the credential prompts the user with a URL and an authentication code.\n1. The user visits the URL on a separate browser-enabled device (a computer, smartphone, etc.) and enters the code.\n1. The user follows a normal authentication process in the browser.\n1. Upon successful authentication, the application is authenticated on the device.\n\nFor more information, see [Microsoft identity platform and the OAuth 2.0 device authorization grant flow](/azure/active-directory/develop/v2-oauth2-device-code).\n\nDevice code authentication in a development environment enables the application for all operations allowed by the interactive sign-in credentials. As a result, if you're the owner or administrator of your subscription, your code has inherent access to most resources in that subscription without having to assign any specific permissions. However, you can use this method with a specific client ID, rather than the default, for which you can assign specific permissions.\n"
  },
  {
    "path": "articles/python/sdk/authentication/credential-chains.md",
    "content": "---\ntitle: Credential chains in the Azure Identity library for Python\ndescription: This article describes the DefaultAzureCredential and ChainedTokenCredential classes in the Azure Identity client library.\nms.date: 01/15/2026\nms.topic: concept-article\nms.custom: devx-track-python\n---\n\n# Credential chains in the Azure Identity library for Python\n\nThe Azure Identity library provides *credentials*&mdash;public classes that implement the Azure Core library's [TokenCredential](/python/api/azure-core/azure.core.credentials.tokencredential) protocol. A credential represents a distinct authentication flow for acquiring an access token from Microsoft Entra ID. These credentials can be chained together to form an ordered sequence of authentication mechanisms to be attempted.\n\n## How a chained credential works\n\nAt runtime, a credential chain attempts to authenticate using the sequence's first credential. If that credential fails to acquire an access token, the next credential in the sequence is attempted, and so on, until an access token is successfully obtained. The following sequence diagram illustrates this behavior:\n\n:::image type=\"content\" source=\"../media/mermaidjs/chain-sequence.svg\" alt-text=\"Diagram that shows credential chain sequence.\":::\n\n## Why use credential chains\n\nA chained credential can offer the following benefits:\n\n- **Environment awareness**: Automatically selects the most appropriate credential based on the environment in which the app is running. Without it, you'd have to write code like this:\n\n    ```python\n    # Set up credential based on environment (Azure or local development)\n    if os.getenv(\"WEBSITE_HOSTNAME\"):\n        credential = ManagedIdentityCredential(client_id=user_assigned_client_id)\n    else:\n        credential = AzureCliCredential()\n    ```\n\n- **Seamless transitions**: Your app can move from local development to your staging or production environment without changing authentication code.\n- **Improved resiliency**: Includes a fallback mechanism that moves to the next credential when the prior fails to acquire an access token.\n\n## How to choose a chained credential\n\nThere are two disparate philosophies to credential chaining:\n\n- **\"Tear down\" a chain**: Start with a preconfigured chain and exclude what you don't need. For this approach, see the [DefaultAzureCredential overview](#defaultazurecredential-overview) section.\n- **\"Build up\" a chain**: Start with an empty chain and include only what you need. For this approach, see the [ChainedTokenCredential overview](#chainedtokencredential-overview) section.\n\n## DefaultAzureCredential overview\n\n[DefaultAzureCredential](/python/api/azure-identity/azure.identity.defaultazurecredential) is an opinionated, preconfigured chain of credentials. It's designed to support many environments, along with the most common authentication flows and developer tools. In graphical form, the underlying chain looks like this:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-authentication-flow-inline.svg\" alt-text=\"Diagram that shows DefaultAzureCredential authentication flow.\" lightbox=\"../media/mermaidjs/default-azure-credential-authentication-flow-expanded.png\":::\n\nThe order in which `DefaultAzureCredential` attempts credentials follows.\n\n| Order | Credential                      | Description                                                                                                                                                                                                                                                                                                                                    | Enabled by default? |\n|-------|---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------|\n| 1     | [Environment][env-cred]         | Reads a collection of [environment variables][env-vars] to determine if an application service principal (application user) is configured for the app. If so, `DefaultAzureCredential` uses these values to authenticate the app to Azure. This method is most often used in server environments but can also be used when developing locally. | Yes                 |\n| 2     | [Workload Identity][wi-cred]    | If the app is deployed to an Azure host with Workload Identity enabled, authenticate that account.                                                                                                                                                                                                                                             | Yes                 |\n| 3     | [Managed Identity][mi-cred]     | If the app is deployed to an Azure host with Managed Identity enabled, authenticate the app to Azure using that Managed Identity.                                                                                                                                                                                                              | Yes                 |\n| 4     | [Shared Token Cache][vs-cred]   | On Windows only, if the developer authenticated to Azure by logging into Visual Studio, authenticate the app to Azure using that same account.                                                                                                                                                                                                 | Yes                 |\n| 5     | [Visual Studio Code][vsc-cred]  | If the developer authenticated via Visual Studio Code's [Azure Resources extension][vsc-ext] and the [azure-identity-broker package][broker-pkg] is installed, authenticate that account.                                                                                                                                                        | Yes                 |\n| 6     | [Azure CLI][az-cred]            | If the developer authenticated to Azure using Azure CLI's `az login` command, authenticate the app to Azure using that same account.                                                                                                                                                                                                           | Yes                 |\n| 7     | [Azure PowerShell][pwsh-cred]   | If the developer authenticated to Azure using Azure PowerShell's `Connect-AzAccount` cmdlet, authenticate the app to Azure using that same account.                                                                                                                                                                                            | Yes                 |\n| 8     | [Azure Developer CLI][azd-cred] | If the developer authenticated to Azure using Azure Developer CLI's `azd auth login` command, authenticate with that account.                                                                                                                                                                                                                  | Yes                 |\n| 9     | [Interactive browser][int-cred] | If enabled, interactively authenticate the developer via the current system's default browser.                                                                                                                                                                                                                                                 | No                  |\n| 10    | [Broker][int-cred]              | Authenticates using the default account logged into the OS via a broker. Requires that the [azure-identity-broker package][broker-pkg] is installed, since an instance of `InteractiveBrowserBrokerCredential` is used.                                                                                                              | Yes                  |\n\n[env-cred]: /python/api/azure-identity/azure.identity.environmentcredential\n[wi-cred]: /python/api/azure-identity/azure.identity.workloadidentitycredential\n[mi-cred]: /python/api/azure-identity/azure.identity.managedidentitycredential\n[vs-cred]: /python/api/azure-identity/azure.identity.sharedtokencachecredential\n[vsc-cred]: /python/api/azure-identity/azure.identity.visualstudiocodecredential\n[az-cred]: /python/api/azure-identity/azure.identity.azureclicredential\n[pwsh-cred]: /python/api/azure-identity/azure.identity.azurepowershellcredential\n[azd-cred]: /python/api/azure-identity/azure.identity.azuredeveloperclicredential\n[int-cred]: /python/api/azure-identity/azure.identity.interactivebrowsercredential\n[vsc-ext]: https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureresourcegroups\n[broker-pkg]: https://pypi.org/project/azure-identity-broker/\n\nIn its simplest form, you can use the parameterless version of `DefaultAzureCredential` as follows:\n\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom azure.storage.blob import BlobServiceClient\n\n# Acquire a credential object\ncredential = DefaultAzureCredential()\n\nblob_service_client = BlobServiceClient(\n    account_url=\"https://<my_account_name>.blob.core.windows.net\",\n    credential=credential\n)\n```\n\n<a name=\"customize-the-defaultazurecredential-chain\"></a>\n### How to customize DefaultAzureCredential\n\nThe following sections describe strategies for controlling which credentials are included in the chain.\n\n#### Exclude an individual credential\n\nTo exclude an individual credential from `DefaultAzureCredential`, use the corresponding `exclude`-prefixed [keyword parameter](/python/api/azure-identity/azure.identity.defaultazurecredential#keyword-only-parameters). For example:\n\n```python\ncredential = DefaultAzureCredential(\n    exclude_environment_credential=True, \n    exclude_workload_identity_credential=True,\n    managed_identity_client_id=user_assigned_client_id\n)\n```\n\nIn the preceding code sample, `EnvironmentCredential` and `WorkloadIdentityCredential` are removed from the credential chain. As a result, the first credential to be attempted is `ManagedIdentityCredential`. The modified chain looks like this:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-excludes.svg\" alt-text=\"Diagram that shows authentication flow for a DefaultAzureCredential instance after using exclude-prefixed keyword parameters in the constructor to remove environment credential and workload identity credential.\":::\n\n> [!NOTE]\n> `InteractiveBrowserCredential` is excluded by default and therefore isn't shown in the preceding diagram. To include `InteractiveBrowserCredential`, set the `exclude_interactive_browser_credential` keyword parameter to `False` when you call the `DefaultAzureCredential` constructor.\n\nAs more `exclude`-prefixed keyword parameters are set to `True` (credential exclusions are configured), the advantages of using `DefaultAzureCredential` diminish. In such cases, `ChainedTokenCredential` is a better choice and requires less code. To illustrate, these two code samples behave the same way:\n\n### [DefaultAzureCredential](#tab/dac)\n\n```python\ncredential = DefaultAzureCredential(\n    exclude_environment_credential=True,\n    exclude_workload_identity_credential=True,\n    exclude_shared_token_cache_credential=True,\n    exclude_visual_studio_code_credential=True,\n    exclude_azure_powershell_credential=True,\n    exclude_azure_developer_cli_credential=True,\n    exclude_broker_credential=True,\n    managed_identity_client_id=user_assigned_client_id\n)\n```\n\n### [ChainedTokenCredential](#tab/ctc)\n\n```python\ncredential = ChainedTokenCredential(\n    ManagedIdentityCredential(client_id=user_assigned_client_id),\n    AzureCliCredential()\n)\n```\n\n---\n\n#### Exclude a credential type category\n\nTo exclude all `Developer tool` or `Deployed service` credentials, set environment variable `AZURE_TOKEN_CREDENTIALS` to `prod` or `dev`, respectively. When a value of `prod` is used, the underlying credential chain looks as follows:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-environment-variable-production.svg\" alt-text=\"Diagram that shows DefaultAzureCredential with AZURE_TOKEN_CREDENTIALS set to 'prod'.\":::\n\nWhen a value of `dev` is used, the chain looks as follows:\n\n:::image type=\"content\" source=\"../media/mermaidjs/default-azure-credential-environment-variable-development.svg\" alt-text=\"Diagram that shows DefaultAzureCredential with AZURE_TOKEN_CREDENTIALS set to 'dev'.\":::\n\n> [!IMPORTANT]\n> The `AZURE_TOKEN_CREDENTIALS` environment variable is supported in `azure-identity` package versions 1.23.0 and later.\n\nTo ensure the environment variable is defined and set to a supported string, set parameter `require_envvar` to `True` in the constructor:\n\n```python\ncredential = DefaultAzureCredential(require_envvar=True)\n```\n\n#### Use a specific credential\n\nTo exclude all credentials except for one, set environment variable `AZURE_TOKEN_CREDENTIALS` to the credential name. For example, you can reduce the `DefaultAzureCredential` chain to `AzureCliCredential` by setting `AZURE_TOKEN_CREDENTIALS` to `AzureCliCredential`. The string comparison is performed in a case-insensitive manner. Valid string values for the environment variable include:\n\n- `AzureCliCredential`\n- `AzureDeveloperCliCredential`\n- `AzurePowerShellCredential`\n- `EnvironmentCredential`\n- `InteractiveBrowserCredential`\n- `ManagedIdentityCredential`\n- `VisualStudioCodeCredential`\n- `WorkloadIdentityCredential`\n\n> [!IMPORTANT]\n> The `AZURE_TOKEN_CREDENTIALS` environment variable supports individual credential names in `azure-identity` package versions 1.24.0 and later.\n\nTo ensure the environment variable is defined and set to a supported string, set parameter `require_envvar` to `True` in the constructor:\n\n```python\ncredential = DefaultAzureCredential(require_envvar=True)\n```\n\n## ChainedTokenCredential overview\n\n[ChainedTokenCredential](/python/api/azure-identity/azure.identity.chainedtokencredential) is an empty chain to which you add credentials to suit your app's needs. For example:\n\n```python\ncredential = ChainedTokenCredential(\n    AzureCliCredential(),\n    AzureDeveloperCliCredential()\n)\n```\n\nThe preceding code sample creates a tailored credential chain comprised of two development-time credentials. `AzureCliCredential` is attempted first, followed by `AzureDeveloperCliCredential`, if necessary. In graphical form, the chain looks like this:\n\n:::image type=\"content\" source=\"../media/mermaidjs/chained-token-credential-authentication-flow.svg\" alt-text=\"Diagram that shows authentication flow for a ChainedTokenCredential instance that is composed of Azure CLI and Azure Developer CLI credentials.\":::\n\n> [!TIP]\n> For improved performance, optimize credential ordering in `ChainedTokenCredential` from most to least used credential.\n\n## Usage guidance for DefaultAzureCredential\n\n`DefaultAzureCredential` is undoubtedly the easiest way to get started with the Azure Identity library, but with that convenience comes tradeoffs. Once you deploy your app to Azure, you should understand the app's authentication requirements. For that reason, replace `DefaultAzureCredential` with a specific `TokenCredential` implementation, such as `ManagedIdentityCredential`.\n\nHere's why:\n\n- **Debugging challenges**: When authentication fails, it can be challenging to debug and identify the offending credential. You must enable logging to see the progression from one credential to the next and the success/failure status of each. For more information, see [Debug a chained credential](#debug-a-chained-credential).\n- **Performance overhead**: The process of sequentially trying multiple credentials can introduce performance overhead. For example, when running on a local development machine, managed identity is unavailable. Consequently, `ManagedIdentityCredential` always fails in the local development environment, unless explicitly disabled via its corresponding `exclude`-prefixed property.\n- **Unpredictable behavior**: `DefaultAzureCredential` checks for the presence of certain [environment variables][env-vars]. It's possible that someone could add or modify these environment variables at the system level on the host machine. Those changes apply globally and therefore alter the behavior of `DefaultAzureCredential` at runtime in any app running on that machine.\n\n## Debug a chained credential\n\nTo diagnose an unexpected issue or to understand what a chained credential is doing, [enable logging](../azure-sdk-logging.md) in your app. Optionally, filter the logs to only those events emitted from the Azure Identity client library. For example:\n\n```python\nimport logging\nfrom azure.identity import DefaultAzureCredential\n\n# Set the logging level for the Azure Identity library\nlogger = logging.getLogger(\"azure.identity\")\nlogger.setLevel(logging.DEBUG)\n\n# Direct logging output to stdout. Without adding a handler,\n# no logging output is visible.\nhandler = logging.StreamHandler(stream=sys.stdout)\nlogger.addHandler(handler)\n\n# Optional: Output logging levels to the console.\nprint(\n    f\"Logger enabled for ERROR={logger.isEnabledFor(logging.ERROR)}, \"\n    f\"WARNING={logger.isEnabledFor(logging.WARNING)}, \"\n    f\"INFO={logger.isEnabledFor(logging.INFO)}, \"\n    f\"DEBUG={logger.isEnabledFor(logging.DEBUG)}\"\n)\n```\n\nFor illustration purposes, assume the parameterless form of `DefaultAzureCredential` is used to authenticate a request to a blob storage account. The app runs in the local development environment, and the developer authenticated to Azure using the Azure CLI. Assume also that the logging level is set to `logging.DEBUG`. When the app is run, the following pertinent entries appear in the output:\n\n```output\nLogger enabled for ERROR=True, WARNING=True, INFO=True, DEBUG=True\nNo environment configuration found.\nManagedIdentityCredential will use IMDS\nEnvironmentCredential.get_token failed: EnvironmentCredential authentication unavailable. Environment variables are not fully configured.\nVisit https://aka.ms/azsdk/python/identity/environmentcredential/troubleshoot to troubleshoot this issue.\nManagedIdentityCredential.get_token failed: ManagedIdentityCredential authentication unavailable, no response from the IMDS endpoint.     \nSharedTokenCacheCredential.get_token failed: SharedTokenCacheCredential authentication unavailable. No accounts were found in the cache.\nVisualStudioCodeCredential.get_token failed: VisualStudioCodeCredential authentication unavailable. No Azure account information found in Visual Studio Code.\nAzureCliCredential.get_token succeeded\n[Authenticated account] Client ID: 00001111-aaaa-2222-bbbb-3333cccc4444. Tenant ID: aaaabbbb-0000-cccc-1111-dddd2222eeee. User Principal Name: unavailableUpn. Object ID (user): aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb\nDefaultAzureCredential acquired a token from AzureCliCredential\n```\n\nIn the preceding output, notice that:\n\n- `EnvironmentCredential`, `ManagedIdentityCredential`, `SharedTokenCacheCredential`, and `VisualStudioCodeCredential` each failed to acquire a Microsoft Entra access token, in that order.\n- The `AzureCliCredential.get_token` call succeeds and the output also indicates that `DefaultAzureCredential` acquired a token from `AzureCliCredential`. Since `AzureCliCredential` succeeded, no credentials beyond it were tried.\n\n> [!NOTE]\n> In the preceding example, the logging level is set to `logging.DEBUG`. Be careful when using this logging level, as it can output sensitive information. For example, in this case, the client ID, tenant ID, and the object ID of the developer's user principal in Azure. All traceback information has been removed from the output for clarity.\n\n\n<!-- LINKS -->\n[env-vars]: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/identity/azure-identity#environment-variables\n"
  },
  {
    "path": "articles/python/sdk/authentication/local-development-broker.md",
    "content": "---\ntitle: Authenticate Python apps to Azure using brokered authentication.\ndescription: Learn how to authenticate your app to Azure services when using the Azure SDK for Python during local development using brokered authentication.\nms.date: 11/24/2025\nms.topic: how-to\nms.custom: devx-track-python, passwordless-python\nzone_pivot_group_filename: developer/python/python-zone-pivot-groups.json\nzone_pivot_groups: operating-systems-set-one\n---\n\n# Authenticate Python apps to Azure services during local development using brokered authentication\n\n[!INCLUDE [broker-introduction](../../../includes/authentication/broker-introduction.md)]\n\n\n:::zone target=\"docs\" pivot=\"os-windows\"\n\n[!INCLUDE [broker-windows](../../../includes/authentication/broker-windows.md)]\n\n:::zone-end\n\n:::zone target=\"docs\" pivot=\"os-macos\"\n\n[!INCLUDE [broker-mac](../../../includes/authentication/broker-mac.md)]\n\n:::zone-end\n\n:::zone target=\"docs\" pivot=\"os-linux\"\n\n[!INCLUDE [broker-linux](../../../includes/authentication/broker-linux.md)]\n\n:::zone-end\n\n[!INCLUDE [broker-configure-application](../../../includes/authentication/broker-configure-application.md)]\n\n[!INCLUDE [broker-assign-roles](../../../includes/authentication/broker-assign-roles.md)]\n\n## Implement the code\n\n:::zone target=\"docs\" pivot=\"os-windows\"\n\nThe following example demonstrates using an [`InteractiveBrowserBrokerCredential`](/python/api/azure-identity-broker/azure.identity.broker.interactivebrowserbrokercredential) to authenticate with the [`BlobServiceClient`](/python/api/azure-storage-blob/azure.storage.blob.blobserviceclient):\n\n1. Install the packages. `pywin32` will be used in Windows to retrieve the window currently in the foreground.\n\n   ```cmd\n   pip install azure-identity-broker pywin32\n   ```\n\n2. Get a reference to the parent window on top of which the account picker dialog should appear. In the code example below, that will be the line:\n\n   ```python\n   current_window_handle = win32gui.GetForegroundWindow()\n   ```\n\n3. Create an instance of `InteractiveBrowserBrokerCredential` passing in the parent window reference. In the final code example, that will be the line:\n\n   ```python\n   credential = InteractiveBrowserBrokerCredential(parent_window_handle=current_window_handle)\n   ```\n\n4. Use the `credential` to access the Azure service, which is Blob Storage in this example.\n\nHere's the final code example:\n\n```python\nimport win32gui\nfrom azure.identity.broker import InteractiveBrowserBrokerCredential\nfrom azure.storage.blob import BlobServiceClient\n\n# Get the handle of the current window\ncurrent_window_handle = win32gui.GetForegroundWindow()\n\n# To authenticate and authorize with an app, use the following line to get a credential and\n# substitute the <app_id> and <tenant_id> placeholders with the values for your app and tenant.\n# credential = InteractiveBrowserBrokerCredential(parent_window_handle=current_window_handle, client_id=<app_id>, tenant_id=<tenant_id>)\ncredential = InteractiveBrowserBrokerCredential(parent_window_handle=current_window_handle)\nclient = BlobServiceClient(\"https://<storage-account-name>.blob.core.windows.net/\", credential=credential)\n\n# Prompt for credentials appears on first use of the client\nfor container in client.list_containers():\n    print(container.name)\n```\n\nFor more exact control, such as setting a timeout, you can supply specific arguments to `InteractiveBrowserBrokerCredential` such as `timeout`.\n\nFor the code to run successfully, your user account must be assigned an Azure role on the storage account that allows access to blob containers like **Storage Account Data Contributor**. If an app is specified, it must have API permissions set for **user_impersonation Access Azure Storage** (step 6 in the previous section). This API permission allows the app to access Azure storage on behalf of the signed-in user after consent is granted during sign-in.\n\nThe following screenshot shows the alternative interactive, brokered authentication experience:\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/broker-web-account-manager-account-picker.png\" alt-text=\"A screenshot that shows the Windows sign-in experience when using a broker-enabled InteractiveBrowserCredential instance to authenticate a user.\":::\n\n:::zone-end\n\n:::zone target=\"docs\" pivot=\"os-macos\"\n\n> [!Important]\n> macOS support exists in `azure-identity-broker` versions 1.3.0 and later.\n\nThe following example demonstrates using an [`InteractiveBrowserBrokerCredential`](/python/api/azure-identity-broker/azure.identity.broker.interactivebrowserbrokercredential) to authenticate with the [`BlobServiceClient`](/python/api/azure-storage-blob/azure.storage.blob.blobserviceclient).\n\n\n1. Install the packages. `msal` (Microsoft Authentication Library) is used to provide a constant for the `parent_window_handle` parameter.\n\n   ```bash\n   pip install azure-identity-broker msal\n   ```\n\n2. Create an instance of `InteractiveBrowserBrokerCredential` passing in the parent window reference. This requires you to get a reference to the parent window on top of which the account picker dialog should appear (provided by the `msal` module). In the code example below, that will be the line:\n\n   ```python\n   credential = InteractiveBrowserBrokerCredential(\n       parent_window_handle=msal.PublicClientApplication.CONSOLE_WINDOW_HANDLE\n   )\n   ```\n3. Use the `credential` to access the Azure service, which is Blob Storage in this example.\n\nHere's the final code example:\n\n```python\nfrom azure.identity.broker import InteractiveBrowserBrokerCredential\nfrom azure.storage.blob import BlobServiceClient\nimport msal\n\ncredential = InteractiveBrowserBrokerCredential(\n    parent_window_handle=msal.PublicClientApplication.CONSOLE_WINDOW_HANDLE\n)\n\nclient = BlobServiceClient(\"https://<storage-account-name>.blob.core.windows.net/\", credential=credential)\n\n# Prompt for credentials appears on first use of the client\nfor container in client.list_containers():\n    print(container.name)\n```\n\nFor more information about using MSAL Python with authentication brokers on macOS, see [Using MSAL Python with an Authentication Broker on macOS](/entra/msal/python/advanced/macos-broker).\n\nFor more exact control, such as setting a timeout, you can supply specific arguments to `InteractiveBrowserBrokerCredential` such as `timeout`.\n\nFor the code to run successfully, your user account must be assigned an Azure role on the storage account that allows access to blob containers like **Storage Account Data Contributor**. If an app is specified, it must have API permissions set for **user_impersonation Access Azure Storage** (step 6 in the previous section). This API permission allows the app to access Azure storage on behalf of the signed-in user after consent is granted during sign-in.\n\nThe following screenshot shows the alternative interactive, brokered authentication experience:\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/broker-macos-account-picker.png\" alt-text=\"A screenshot that shows the macOS sign-in experience when using a broker-enabled InteractiveBrowserCredential instance to authenticate a user.\":::\n\n:::zone-end\n\n:::zone target=\"docs\" pivot=\"os-linux\"\n\n> [!Important]\n> Linux support exists in `azure-identity-broker` versions 1.3.0 and later.\n\nThe following example demonstrates using an [`InteractiveBrowserBrokerCredential`](/python/api/azure-identity-broker/azure.identity.broker.interactivebrowserbrokercredential) to authenticate with the [`BlobServiceClient`](/python/api/azure-storage-blob/azure.storage.blob.blobserviceclient):\n\n1. Install the packages. `msal` (Microsoft Authentication Library) is used to provide a constant for the `parent_window_handle` parameter.\n\n   ```bash\n   pip install azure-identity-broker msal\n   ```\n\n2. Create an instance of `InteractiveBrowserBrokerCredential` passing in the parent window reference. This requires you to get a reference to the parent window on top of which the account picker dialog should appear (provided by the `msal` module). In the code example below, that will be the line:\n\n   ```python\n   credential = InteractiveBrowserBrokerCredential(\n       parent_window_handle=msal.PublicClientApplication.CONSOLE_WINDOW_HANDLE\n   )\n   ```\n3. Use the `credential` to access the Azure service, which is Blob Storage in this example.\n\nHere's the final code example:\n\n```python\nfrom azure.identity.broker import InteractiveBrowserBrokerCredential\nfrom azure.storage.blob import BlobServiceClient\nimport msal\n\ncredential = InteractiveBrowserBrokerCredential(\n    parent_window_handle=msal.PublicClientApplication.CONSOLE_WINDOW_HANDLE\n)\n\nclient = BlobServiceClient(\"https://<storage-account-name>.blob.core.windows.net/\", credential=credential)\n\n# Prompt for credentials appears on first use of the client\nfor container in client.list_containers():\n    print(container.name)\n```\n\nMake sure you have the [Linux dependencies](/entra/msal/python/advanced/linux-broker-py?tabs=ubuntudep#linux-dependencies) installed on your Linux distribution before running this code example. Also, there are [separate instructions](/entra/msal/python/advanced/linux-broker-py-wsl?tabs=ubuntudep#linux-package-dependencies) for WSL depending on the distribution.\n\nFor more exact control, such as setting a timeout, you can supply specific arguments to `InteractiveBrowserBrokerCredential` such as `timeout`.\n\nFor the code to run successfully, your user account must be assigned an Azure role on the storage account that allows access to blob containers like **Storage Account Data Contributor**. If an app is specified, it must have API permissions set for **user_impersonation Access Azure Storage** (step 6 in the previous section). This API permission allows the app to access Azure storage on behalf of the signed-in user after consent is granted during sign-in.\n\nThe following video shows the alternative interactive, brokered authentication experience:\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/broker-linux-login.gif\" alt-text=\"An animated gif that shows the Linux sign-in experience when using a broker-enabled InteractiveBrowserCredential instance to authenticate a user.\":::\n\n:::zone-end"
  },
  {
    "path": "articles/python/sdk/authentication/local-development-dev-accounts.md",
    "content": "---\ntitle: Authenticate Python apps to Azure services during local development using developer accounts\ndescription: This article describes how to authenticate your application to Azure services when using the Azure SDK for Python during local development using developer accounts.\nms.date: 01/22/2026\nms.topic: how-to\nms.custom: devx-track-python, devx-track-azurecli, devx-track-azurepowershell\n---\n\n# Authenticate Python apps to Azure services during local development using developer accounts\n\nDuring local development, applications need to authenticate to Azure to use different Azure services. Authenticate locally using one of these approaches:\n\n* Use a developer account with one of the [developer tools supported by the Azure Identity library](local-development-dev-accounts.md#supported-developer-tools-for-authentication).\n* Use a [broker](local-development-broker.md) to manage credentials.\n* Use a [service principal](local-development-service-principal.md).\n\nThis article explains how to authenticate using a developer account with tools supported by the Azure Identity library. In the sections ahead, you learn:\n\n* How to use Microsoft Entra groups to efficiently manage permissions for multiple developer accounts.\n* How to assign roles to developer accounts to scope permissions.\n* How to sign-in to supported local development tools.\n* How to authenticate using a developer account from your app code.\n\n<a name='supported-development-tools-for-authentication'></a>\n\n## Supported developer tools for authentication\n\nFor an app to authenticate to Azure during local development using the developer's Azure credentials, the developer must be signed-in to Azure from one of the following developer tools:\n\n* Azure CLI\n* Azure Developer CLI\n* Azure PowerShell\n* Visual Studio Code\n\nThe Azure Identity library can detect that the developer is signed-in from one of these tools. The library can then obtain the Microsoft Entra access token via the tool to authenticate the app to Azure as the signed-in user.\n\nThis approach takes advantage of the developer's existing Azure accounts to streamline the authentication process. However, a developer's account likely has more permissions than required by the app, therefore exceeding the permissions the app runs with in production. As an alternative, you can [create application service principals to use during local development](local-development-service-principal.md), which can be scoped to have only the access needed by the app.\n\n\n<a name='create-azure-ad-group-for-local-development'></a>\n\n[!INCLUDE [Create a Microsoft Entra group for local development](../../../includes/authentication/create-entra-group.md)]\n\n\n<a name='assign-roles-to-the-azure-ad-group'></a>\n\n[!INCLUDE [Assign roles to the group](../../../includes/authentication/assign-group-roles.md)]\n\n## Sign-in to Azure using developer tooling\n\nTo authenticate with your Azure account, choose one of the following methods:\n\n### [Visual Studio Code](#tab/sign-in-vscode)\n\nDevelopers using Visual Studio Code can authenticate with their developer account directly through the editor via the broker. Apps that use [DefaultAzureCredential](/python/api/azure-identity/azure.identity.defaultazurecredential) or [VisualStudioCodeCredential](/python/api/azure-identity/azure.identity.visualstudiocodecredential) can then use this account to authenticate app requests through a seamless single-sign-on experience.\n\n1. In Visual Studio Code, go to the **Extensions** panel and install the [Azure Resources](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureresourcegroups) extension. This extension lets you view and manage Azure resources directly from Visual Studio Code. It also uses the built-in Visual Studio Code Microsoft authentication provider to authenticate with Azure.\n\n   :::image type=\"content\" source=\"../../../includes/authentication/media/azure-resources-extension.png\" alt-text=\"Screenshot showing the Azure Resources extension.\":::\n\n2. Open the Command Palette in Visual Studio Code, then search for and select **Azure: Sign in**.\n\n   :::image type=\"content\" source=\"../../../includes/authentication/media/visual-studio-code-sign-in.png\" alt-text=\"Screenshot showing how to sign in to Azure in Visual Studio Code.\":::\n\n   > [!TIP]\n   > Open the Command Palette using `Ctrl+Shift+P` on Windows/Linux or `Cmd+Shift+P` on macOS.\n\n\n3. Add the `azure-identity-broker` Python package to your app:\n\n   ```bash\n   pip install azure-identity-broker\n   ```\n\n\n### [Azure CLI](#tab/sign-in-azure-cli)\n\nDevelopers can use [Azure CLI](/cli/azure/what-is-azure-cli) to authenticate to Microsoft Entra ID. Apps using `DefaultAzureCredential` or `AzureCliCredential` can then use this account to authenticate app requests when running locally.\n\nTo authenticate with the Azure CLI, run the `az login` command. On a system with a default web browser, the Azure CLI launches the browser to authenticate the user.\n\n```azurecli\naz login\n```\n\nFor systems without a default web browser, the `az login` command uses the device code authentication flow. The user can also force the Azure CLI to use the device code flow rather than launching a browser by specifying the `--use-device-code` argument.\n\n```azurecli\naz login --use-device-code\n```\n\n### [Azure Developer CLI](#tab/sign-in-azure-developer-cli)\n\nDevelopers can use [Azure Developer CLI](/azure/developer/azure-developer-cli/overview) to authenticate to Microsoft Entra ID. Apps using `DefaultAzureCredential` or `AzureDeveloperCliCredential` can then use this account to authenticate app requests when running locally.\n\nTo authenticate with the Azure Developer CLI, run the `azd auth login` command. On a system with a default web browser, the Azure Developer CLI launches the browser to authenticate the user.\n\n```azdeveloper\nazd auth login\n```\n\nFor systems without a default web browser, the `azd auth login --use-device-code` uses the device code authentication flow. The user can also force the Azure Developer CLI to use the device code flow rather than launching a browser by specifying the `--use-device-code` argument.\n\n```azdeveloper\nazd auth login --use-device-code\n```\n\n### [Azure PowerShell](#tab/sign-in-azure-powershell)\n\nDevelopers can use [Azure PowerShell](/powershell/azure/what-is-azure-powershell) to authenticate to Microsoft Entra ID. Apps using `DefaultAzureCredential` or `AzurePowerShellCredential` can then use this account to authenticate app requests when running locally.\n\nTo authenticate with Azure PowerShell, run the command `Connect-AzAccount`. On a system with a default web browser and version 5.0.0 or later of Azure PowerShell, it launches the browser to authenticate the user.\n\n```azurepowershell\nConnect-AzAccount\n```\n\nFor systems without a default web browser, the `Connect-AzAccount` command uses the device code authentication flow. The user can also force Azure PowerShell to use the device code flow rather than launching a browser by specifying the `UseDeviceAuthentication` argument.\n\n```azurepowershell\nConnect-AzAccount -UseDeviceAuthentication\n```\n\n---\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library](/python/api/azure-identity/azure.identity) provides implementations of [TokenCredential](/python/api/azure-core/azure.core.credentials.tokencredential) that support various scenarios and Microsoft Entra authentication flows. The steps ahead demonstrate how to use [DefaultAzureCredential](/python/api/azure-identity/azure.identity.defaultazurecredential) or a specific development tool credential when working with user accounts locally.\n\n\n### Implement the code\n\n1. Add the [azure-identity](https://pypi.org/project/azure-identity/) package to your application:\n\n    ```bash\n    pip install azure-identity\n    ```\n\n   > [!NOTE]\n   > When using `VisualStudioCodeCredential`, you must also install the `azure-identity-broker` package:\n   >\n   > ```bash\n   > pip install azure-identity-broker\n   > ```\n\n    Add the necessary `import` statements for the `azure.identity` module and the Azure service client module your app requires.\n\n2. Choose one of the credential implementations based on your scenario.\n\n   * [Use a credential specific to your development tool](#use-a-credential-specific-to-your-development-tool): this option is best for single person or single tool scenarios.\n   * [Use a credential available for use in any development tool](#use-a-credential-available-for-use-in-any-development-tool): this option is best for open-source projects and diverse tool teams.\n\n<a name='use-credential-specific-to-development-tool'></a>\n\n#### Use a credential specific to your development tool\n\nPass a `TokenCredential` instance corresponding to a specific development tool to the Azure service client constructor, such as `AzureCliCredential`.\n\n```python\nfrom azure.identity import AzureCliCredential\nfrom azure.storage.blob import BlobServiceClient\n\ncredential = AzureCliCredential()\n\nblob_service_client = BlobServiceClient(\n   account_url=\"https://<account-name>.blob.core.windows.net\",\n   credential=credential)\n```\n\n<a name='use-credential-available-in-any-development-tool'></a>\n\n#### Use a credential available for use in any development tool\n\nUse a `DefaultAzureCredential` instance optimized for all local development tools. This example requires the environment variable `AZURE_TOKEN_CREDENTIALS` set to `dev`. For more information, see [Exclude a credential type category](credential-chains.md#exclude-a-credential-type-category).\n\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom azure.storage.blob import BlobServiceClient\n\ncredential = DefaultAzureCredential(require_envvar=True)\n\nblob_service_client = BlobServiceClient(\n   account_url=\"https://<account-name>.blob.core.windows.net\",\n   credential=credential)\n```\n\n> [!TIP]\n> When your team uses multiple development tools to authenticate with Azure, prefer `DefaultAzureCredential` over tool-specific credentials.\n"
  },
  {
    "path": "articles/python/sdk/authentication/local-development-service-principal.md",
    "content": "---\ntitle: Authenticate Python apps to Azure services during local development using service principals\ndescription: This article describes how to authenticate your application to Azure services when using the Azure SDK for Python during local development using dedicated application service principals.\nms.date: 02/11/2026\nms.topic: how-to\nms.custom: devx-track-python, devx-track-azurecli\n---\n\n# Authenticate Python apps to Azure services during local development using service principals\n\nDuring local development, applications need to authenticate to Azure to access various Azure services. This article explains how to use an application service principal as one of two common approaches for local authentication.\n\n- How to register an application with Microsoft Entra to create a service principal\n- How to use Microsoft Entra groups to efficiently manage permissions\n- How to assign roles to scope permissions\n- How to authenticate using a service principal from your app code\n\nUsing dedicated application service principals allows you to adhere to the principle of least privilege when accessing Azure resources. Permissions are limited to the specific requirements of the app during development, preventing accidental access to Azure resources intended for other apps or services. This approach also helps avoid issues when the app is moved to production by ensuring it isn't over-privileged in the development environment.\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/mermaidjs/local-service-principal-authentication.svg\" alt-text=\"A diagram showing how an app running in local developer obtains the application service principal from an .env file and then uses that identity to connect to Azure resources.\":::\n\nWhen the app is registered in Azure, an application service principal is created. For local development:\n\n- Create a separate app registration for each developer working on the app to ensure each developer has their own application service principal, avoiding the need to share credentials.\n- Create a separate app registration for each app to limit the app's permissions to only what is necessary.\n\nDuring local development, environment variables are set with the application service principal's identity. The Azure Identity library reads these environment variables to authenticate the app to the required Azure resources.\n\n[!INCLUDE [Register the app in Azure](<../../../includes/authentication/create-app-registration.md>)]\n\n<a name='2---create-an-azure-ad-security-group-for-local-development'></a>\n\n[!INCLUDE [Create a Microsoft Entra group for local development](<../../../includes/authentication/create-entra-group.md>)]\n\n[!INCLUDE [Assign roles to the group](<../../../includes/authentication/assign-group-roles.md>)]\n\n## Set the app environment variables\n\nAt runtime, certain credentials from the [Azure Identity library](/python/api/overview/azure/identity-readme), such as `DefaultAzureCredential`, `EnvironmentCredential`, and `ClientSecretCredential`, search for service principal information by convention in the environment variables. There are multiple ways to configure environment variables when working with Python, depending on your tooling and environment.\n\nRegardless of the approach you choose, configure the following environment variables for a service principal:\n\n- `AZURE_CLIENT_ID`: The application ID of the registered app in Azure.\n- `AZURE_TENANT_ID`: The ID of the Microsoft Entra tenant.\n- `AZURE_CLIENT_SECRET`: The client secret credential for the app.\n\n### [.env file](#tab/env-file)\n\nSince most developers work on multiple applications, using a package like [python-dotenv](https://pypi.org/project/python-dotenv/) is recommended to access environment variables from a `.env` file stored in the application's directory during development. This approach scopes the environment variables so that only this application can use them.\n\nThe `.env` file is never checked into source control since it contains the application secret key for Azure. The standard [.gitignore](https://github.com/github/gitignore/blob/main/Python.gitignore#L115) file for Python automatically excludes the `.env` file from check-in.\n\nTo use the `python-dotenv` package, first install the package in your application:\n\n```terminal\npip install python-dotenv\n```\n\nThen, create a `.env` file in your application root directory. Set the environment variable values with values obtained from the app registration process:\n\n```bash\nAZURE_CLIENT_ID=<your-client-id>\nAZURE_TENANT_ID=<your-tenant-id>\nAZURE_CLIENT_SECRET=<your-client-secret>\n```\n\nFinally, in the startup code for your application, use the `python-dotenv` library to read the environment variables from the `.env` file on startup:\n\n```python\nfrom dotenv import load_dotenv\n\nload_dotenv()\n```\n\n### [Visual Studio Code](#tab/vscode)\n\nIn Visual Studio Code, environment variables can be set in the `launch.json` file of your project. These values are pulled in automatically when the app starts. However, these configurations don't travel with your app during deployment, so you need to set up environment variables on your target hosting environment.\n\n```json\n{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Python: Current File\",\n            \"type\": \"debugpy\",\n            \"request\": \"launch\",\n            \"program\": \"${file}\",\n            \"console\": \"integratedTerminal\",\n            \"env\": {\n                \"AZURE_CLIENT_ID\": \"<your-client-id>\",\n                \"AZURE_TENANT_ID\": \"<your-tenant-id>\",\n                \"AZURE_CLIENT_SECRET\": \"<your-client-secret>\"\n            }\n        }\n    ]\n}\n```\n\n### [Windows](#tab/windows)\n\nYou can set environment variables for Windows from the command line. However, the values are accessible to all apps running on that operating system and could cause conflicts, so use caution with this approach. Environment variables can be set at the user or system level.\n\n```bash\nsetx AZURE_CLIENT_ID \"<your-client-id>\"\nsetx AZURE_TENANT_ID \"<your-tenant-id>\"\nsetx AZURE_CLIENT_SECRET \"<your-client-secret>\"\n```\n\nPowerShell can also be used to set environment variables at the user or system level:\n\n```powershell\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_ID\", \"<your-client-id>\", \"User\")\n[Environment]::SetEnvironmentVariable(\"AZURE_TENANT_ID\", \"<your-tenant-id>\", \"User\")\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_SECRET\", \"<your-client-secret>\", \"User\")\n```\n\nAfter running these commands, restart any open terminals or applications to pick up the new environment variables.\n\n### [Linux / macOS](#tab/linux-macos)\n\n```bash\nexport AZURE_CLIENT_ID=\"<your-client-id>\"\nexport AZURE_TENANT_ID=\"<your-tenant-id>\"\nexport AZURE_CLIENT_SECRET=\"<your-client-secret>\"\n```\n\nTo make these environment variables persistent across terminal sessions, add these lines to your shell profile file (such as `~/.bashrc`, `~/.zshrc`, or `~/.bash_profile`).\n\n---\n\n[!INCLUDE [Authenticate to Azure services from your app](<../includes/authenticate-azure-services-from-app.md>)]\n"
  },
  {
    "path": "articles/python/sdk/authentication/on-premises-apps.md",
    "content": "---\ntitle: Authenticate to Azure resources from Python apps hosted on-premises\ndescription: This article describes how to authenticate your application to Azure services when using the Azure SDK for Python in on-premises hosted applications.\nms.date: 02/11/2026\nms.topic: how-to\nms.custom: devx-track-python\n---\n\n# Authenticate to Azure resources from Python apps hosted on-premises\n\nApps hosted outside of Azure, such as on-premises or in a third-party data center, should use an application service principal through [Microsoft Entra ID](/entra/fundamentals/whatis) to authenticate to Azure services. In the sections ahead, you learn:\n\n- How to register an application with Microsoft Entra to create a service principal\n- How to assign roles to scope permissions\n- How to authenticate using a service principal from your app code\n\nUsing dedicated application service principals allows you to adhere to the principle of least privilege when accessing Azure resources. Permissions are limited to the specific requirements of the app during development, preventing accidental access to Azure resources intended for other apps or services. This approach also helps avoid issues when the app is moved to production by ensuring it isn't over-privileged in the development environment.\n\nA different app registration should be created for each environment the app is hosted in. This allows environment specific resource permissions to be configured for each service principal and make sure an app deployed to one environment doesn't talk to Azure resources that are part of another environment.\n\n[!INCLUDE [Register the app in Azure](<../../../includes/authentication/create-app-registration.md>)]\n\n[!INCLUDE [Assign roles to the application service principal](<../../../includes/authentication/assign-service-principal-roles.md>)]\n\n---\n\n## Set the app environment variables\n\nAt runtime, certain credentials from the [Azure Identity library](https://pypi.org/project/azure-identity/), such as `DefaultAzureCredential`, `EnvironmentCredential`, and `ClientSecretCredential`, search for service principal information by convention in the environment variables. There are multiple ways to configure environment variables when working with Python, depending on your tooling and environment.\n\nRegardless of the approach you choose, configure the following environment variables for a service principal:\n\n- `AZURE_CLIENT_ID`: Used to identify the registered app in Azure.\n- `AZURE_TENANT_ID`: The ID of the Microsoft Entra tenant.\n- `AZURE_CLIENT_SECRET`: The secret credential that was generated for the app.\n\n### [Visual Studio Code](#tab/vscode)\n\nIn Visual Studio Code, environment variables can be set in the `launch.json` file located in the `.vscode` folder of your project. These values are pulled in automatically when the app starts. However, these configurations don't travel with your app during deployment, so you need to set up environment variables on your target hosting environment.\n\n```json\n{\n    \"configurations\": [\n        {\n            \"env\": {\n                \"AZURE_CLIENT_ID\": \"<your-client-id>\",\n                \"AZURE_TENANT_ID\": \"<your-tenant-id>\",\n                \"AZURE_CLIENT_SECRET\": \"<your-client-secret>\"\n            }\n        }\n    ]\n}\n```\n\n### [Windows](#tab/windows)\n\nFrom the Windows command line, you can set user-level environment variables using the following commands:\n\n```cmd\nsetx AZURE_CLIENT_ID \"<your-client-id>\"\nsetx AZURE_TENANT_ID \"<your-tenant-id>\"\nsetx AZURE_CLIENT_SECRET \"<your-client-secret>\"\n```\n\nSystem-level environment variables can also be set if you run the command prompt as an administrator and add the `/m` flag:\n\n```cmd\nsetx AZURE_CLIENT_ID \"<your-client-id>\" /m\nsetx AZURE_TENANT_ID \"<your-tenant-id>\" /m\nsetx AZURE_CLIENT_SECRET \"<your-client-secret>\" /m\n```\n\nPowerShell can also be used to set environment variables at the user or system level:\n\nUse the following commands to set the environment variables at the user level using PowerShell:\n\n```powershell\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_ID\", \"<your-client-id>\", \"User\")\n[Environment]::SetEnvironmentVariable(\"AZURE_TENANT_ID\", \"<your-tenant-id>\", \"User\")\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_SECRET\", \"<your-client-secret>\", \"User\")\n```\n\nSystem-level environment variables can also be set using PowerShell if you open it with the 'Run as Administrator' option:\n\n```powershell\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_ID\", \"<your-client-id>\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"AZURE_TENANT_ID\", \"<your-tenant-id>\", \"Machine\")\n[Environment]::SetEnvironmentVariable(\"AZURE_CLIENT_SECRET\", \"<your-client-secret>\", \"Machine\")\n```\n\n### [Gunicorn](#tab/gunicorn)\n\nWhen using [Gunicorn](https://gunicorn.org/) to run Python web apps in a UNIX server environment, environment variables for an app can be specified by using the `EnvironmentFile` directive in the `gunicorn.service` file as shown below:\n\n```ini\n[Unit]\nDescription=gunicorn daemon\nAfter=network.target\n\n[Service]\nUser=www-user\nGroup=www-data\nWorkingDirectory=/path/to/python-app\nEnvironmentFile=/path/to/python-app/py-env/app-environment-variables\nExecStart=/path/to/python-app/py-env/bin/gunicorn --config config.py wsgi:app\n\n[Install]\nWantedBy=multi-user.target\n```\n\nThe file specified in the `EnvironmentFile` directive should contain a list of environment variables with their values as shown below:\n\n```bash\nAZURE_CLIENT_ID=<your-client-id>\nAZURE_TENANT_ID=<your-tenant-id>\nAZURE_CLIENT_SECRET=<your-client-secret>\n```\n\n---\n\n[!INCLUDE [Authenticate to Azure services from your app](<../includes/authenticate-azure-services-from-app.md>)]"
  },
  {
    "path": "articles/python/sdk/authentication/overview.md",
    "content": "---\ntitle: How to authenticate Python applications with Azure services\ndescription: Learn how to authenticate a Python app with Azure services by using classes in the Azure Identity library.\nms.date: 02/11/2026\nms.topic: concept-article\nms.custom: devx-track-python\n---\n\n# Authenticate Python apps to Azure services using the Azure Identity library\n\nApps can use the Azure Identity library to authenticate to Microsoft Entra ID, which allows the apps to access Azure services and resources. This authentication requirement applies whether the app is deployed to Azure, hosted on-premises, or running locally on a developer workstation. The sections ahead describe the recommended approaches to authenticate an app to Microsoft Entra ID across different environments when using the Azure SDK client libraries.\n\n## Recommended approach for app authentication\n\nToken-based authentication via Microsoft Entra ID is the recommended approach for authenticating apps to Azure, instead of using connection strings or key-based options. The [Azure Identity library](/python/api/overview/azure/identity-readme) provides classes that support token-based authentication and allow apps to authenticate to Azure resources whether the app runs locally, on Azure, or on an on-premises server.\n\n### Advantages of token-based authentication\n\nToken-based authentication offers the following advantages over connection strings:\n\n- Token-based authentication ensures only the specific apps intended to access the Azure resource are able to do so, whereas anyone or any app with a connection string can connect to an Azure resource.\n- Token-based authentication allows you to further limit Azure resource access to only the specific permissions needed by the app. This follows the [principle of least privilege](https://wikipedia.org/wiki/Principle_of_least_privilege). In contrast, a connection string grants full rights to the Azure resource.\n- When using a [managed identity](/entra/identity/managed-identities-azure-resources/overview) for token-based authentication, Azure handles administrative functions for you, so you don't have to worry about tasks like securing or rotating secrets. This makes the app more secure because there's no connection string or application secret that can be compromised.\n- The Azure Identity library acquires and manages Microsoft Entra tokens for you.\n\nUse of connection strings should be limited to scenarios where token-based authentication is not an option, initial proof-of-concept apps, or development prototypes that don't access production or sensitive data. When possible, use the token-based authentication classes available in the Azure Identity library to authenticate to Azure resources.\n\n## Authentication across different environments\n\nThe specific type of token-based authentication an app should use to authenticate to Azure resources depends on where the app runs. The following diagram provides guidance for different scenarios and environments:\n\n:::image type=\"content\" source=\"../../../includes/authentication/media/mermaidjs/authentication-environments.svg\" alt-text=\"A diagram showing the recommended token-based authentication strategies for an app depending on where it's running.\" :::\n\nWhen an app is:\n\n- **Hosted on Azure**: The app should authenticate to Azure resources using a managed identity. This option is discussed in more detail at [authentication in server environments](#authentication-for-azure-hosted-apps).\n- **Running locally during development**: The app can authenticate to Azure using a [developer account](local-development-dev-accounts.md), a [broker](local-development-broker.md), or a [service principal](local-development-service-principal.md). Each option is discussed in more detail at [authentication during local development](#authentication-during-local-development).\n- **Hosted on-premises**: The app should authenticate to Azure resources using an application service principal, or a managed identity in the case of Azure Arc. On-premises workflows are discussed in more detail at [Authentication for apps hosted on-premises](#authentication-for-apps-hosted-on-premises).\n\n## Authentication for Azure-hosted apps\n\nWhen your app is hosted on Azure, it can use managed identities to authenticate to Azure resources without needing to manage any credentials. There are two types of managed identities: user-assigned and system-assigned.\n\n#### Use a user-assigned managed identity\n\nA user-assigned managed identity is created as a standalone Azure resource. It can be assigned to one or more Azure resources, allowing those resources to share the same identity and permissions. To authenticate using a user-assigned managed identity, create the identity, assign it to your Azure resource, and then configure your app to use this identity for authentication by specifying its client ID, resource ID, or object ID.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate using a user-assigned managed identity](user-assigned-managed-identity.md)\n\n#### Use a system-assigned managed identity\n\nA system-assigned managed identity is enabled directly on an Azure resource. The identity is tied to the lifecycle of that resource and is automatically deleted when the resource is deleted. To authenticate using a system-assigned managed identity, enable the identity on your Azure resource and then configure your app to use this identity for authentication.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate using a system-assigned managed identity](system-assigned-managed-identity.md)\n\n## Authentication during local development\n\nDuring local development, you can authenticate to Azure resources using your developer credentials or a service principal. This allows you to test your app's authentication logic without deploying it to Azure.\n\n#### Use developer credentials\n\nYou can use your own Azure credentials to authenticate to Azure resources during local development. This is typically done using a development tool, such as Azure CLI or Visual Studio Code, which can provide your app with the necessary tokens to access Azure services. This method is convenient but should only be used for development purposes.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally using developer credentials](local-development-dev-accounts.md)\n\n#### Use a broker\n\nBrokered authentication collects user credentials using the system authentication broker to authenticate an app. A system authentication broker runs on a user's machine and manages the authentication handshakes and token maintenance for all connected accounts.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally using a broker](local-development-broker.md)\n\n#### Use a service principal\n\nA service principal is created in a Microsoft Entra tenant to represent an app and be used to authenticate to Azure resources. You can configure your app to use service principal credentials during local development. This method is more secure than using developer credentials and is closer to how your app will authenticate in production. However, it's still less ideal than using a managed identity due to the need for secrets.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate locally using a service principal](local-development-service-principal.md)\n\n## Authentication for apps hosted on-premises\n\nFor apps hosted on-premises, you can use a service principal to authenticate to Azure resources. This involves creating a service principal in Microsoft Entra ID, assigning it the necessary permissions, and configuring your app to use its credentials. This method allows your on-premises app to securely access Azure services.\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate your on-prem app using a service principal](on-premises-apps.md)\n"
  },
  {
    "path": "articles/python/sdk/authentication/system-assigned-managed-identity.md",
    "content": "---\ntitle: Authenticate Azure-hosted Python apps to Azure resources using a system-assigned managed identity\ndescription: Learn how to authenticate Azure-hosted Python apps to other Azure services using a system-assigned managed identity.\nms.topic: how-to\nms.custom: devx-track-python, devx-track-azurecli\nms.date: 01/26/2026\n---\n\n# Authenticate Azure-hosted Python apps to Azure resources using a system-assigned managed identity\n\nThe recommended approach to authenticate an Azure-hosted app to other Azure resources is to use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). This approach is [supported for most Azure services](/entra/identity/managed-identities-azure-resources/managed-identities-status), including apps hosted on Azure App Service, Azure Container Apps, and Azure Virtual Machines. Discover more about different authentication techniques and approaches on the [authentication overview](overview.md) page. In the sections ahead, you'll learn:\n\n- Essential managed identity concepts\n- How to create a system-assigned managed identity for your app\n- How to assign roles to the system-assigned managed identity\n- How to authenticate using the system-assigned managed identity from your app code\n\n[!INCLUDE [managed-identity-concepts](../../../includes/authentication/managed-identity-concepts.md)]\n\nThe sections ahead describe the steps to enable and use a system-assigned managed identity for an Azure-hosted app. If you need to use a user-assigned managed identity, visit the [user-assigned managed identities](user-assigned-managed-identity.md) article for more information.\n\n[!INCLUDE [system-assigned-managed-identity](../../../includes/authentication/system-assigned-managed-identity.md)]\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library](/python/api/azure-identity) provides various *credentials*&mdash;implementations of `TokenCredential` adapted to supporting different scenarios and Microsoft Entra authentication flows. Since managed identity is unavailable when running locally, the steps ahead demonstrate which credential to use in which scenario:\n\n- **Local dev environment**: During **local development only**, use a class called [DefaultAzureCredential](/azure/developer/python/sdk/authentication/credential-chains#defaultazurecredential-overview) for an opinionated, preconfigured chain of credentials. `DefaultAzureCredential` discovers user credentials from your local tooling or IDE, such as the Azure CLI or Visual Studio Code. It also provides flexibility and convenience for retries, wait times for responses, and support for multiple authentication options. Visit the [Authenticate to Azure services during local development](local-development-dev-accounts.md) article to learn more.\n- **Azure-hosted apps**: When your app is running in Azure, use [ManagedIdentityCredential](/python/api/azure-identity/azure.identity.managedidentitycredential?view=azure-python&preserve-view=true) to safely discover the managed identity configured for your app. Specifying this exact type of credential prevents other available credentials from being picked up unexpectedly.\n\n### Implement the code\n\nAdd the [azure-identity](https://pypi.org/project/azure-identity/) package to your application by navigating to the application project directory and running the following command:\n\n```terminal\npip install azure-identity\n```\n\nAzure services are accessed using specialized client classes from the various Azure SDK client libraries. The following code example demonstrates how to create a credential instance and use it with an Azure SDK service client. In your application code, complete the following steps to authenticate using a managed identity:\n\n1. Import the `ManagedIdentityCredential` class from the `azure.identity` module.\n1. Create a `ManagedIdentityCredential` object.\n1. Pass the `ManagedIdentityCredential` object to the Azure SDK client constructor.\n\nThe following example demonstrates authenticating a `BlobServiceClient` using a system-assigned managed identity:\n\n```python\nfrom azure.identity import ManagedIdentityCredential\nfrom azure.storage.blob import BlobServiceClient\n\n# Authenticate using system-assigned managed identity\ncredential = ManagedIdentityCredential()\n\nblob_service_client = BlobServiceClient(\n    account_url=\"https://<account-name>.blob.core.windows.net\",\n    credential=credential\n)\n```\n\nWhen developing locally, you can use `DefaultAzureCredential` which discovers credentials from local developer tools. When deployed to Azure, switch to `ManagedIdentityCredential` for production scenarios:\n\n```python\nimport os\nfrom azure.identity import DefaultAzureCredential, ManagedIdentityCredential\nfrom azure.storage.blob import BlobServiceClient\n\n# Use ManagedIdentityCredential in Azure, DefaultAzureCredential locally\nif os.getenv(\"WEBSITE_HOSTNAME\"):\n    credential = ManagedIdentityCredential()\nelse:\n    credential = DefaultAzureCredential()\n\nblob_service_client = BlobServiceClient(\n    account_url=\"https://<account-name>.blob.core.windows.net\",\n    credential=credential\n)\n```\n"
  },
  {
    "path": "articles/python/sdk/authentication/user-assigned-managed-identity.md",
    "content": "---\ntitle: Authenticate Azure-hosted Python apps to Azure resources using a user-assigned managed identity\ndescription: Learn how to authenticate Azure-hosted Python apps to other Azure services using a user-assigned managed identity.\nms.topic: how-to\nms.custom: devx-track-python, devx-track-azurecli\nms.date: 01/26/2026\n---\n\n# Authenticate Azure-hosted Python apps to Azure resources using a user-assigned managed identity\n\nThe recommended approach to authenticate an Azure-hosted app to other Azure resources is to use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). This approach is [supported for most Azure services](/entra/identity/managed-identities-azure-resources/managed-identities-status), including apps hosted on Azure App Service, Azure Container Apps, and Azure Virtual Machines. Discover more about different authentication techniques and approaches on the [authentication overview](overview.md) page. In the sections ahead, you'll learn:\n\n- Essential managed identity concepts\n- How to create a user-assigned managed identity for your app\n- How to assign roles to the user-assigned managed identity\n- How to authenticate using the user-assigned managed identity from your app code\n\n[!INCLUDE [managed-identity-concepts](../../../includes/authentication/managed-identity-concepts.md)]\n\nThe sections ahead describe the steps to enable and use a user-assigned managed identity for an Azure-hosted app. If you need to use a system-assigned managed identity, visit the [system-assigned managed identities](system-assigned-managed-identity.md) article for more information.\n\n[!INCLUDE [user-assigned-managed-identity](../../../includes/authentication/user-assigned-managed-identity.md)]\n\n## Authenticate to Azure services from your app\n\nThe [Azure Identity library](/python/api/azure-identity) provides various *credentials*&mdash;implementations of `TokenCredential` adapted to supporting different scenarios and Microsoft Entra authentication flows. Since managed identity is unavailable when running locally, the steps ahead demonstrate which credential to use in which scenario:\n\n- **Local dev environment**: During **local development only**, use a class called [DefaultAzureCredential](/azure/developer/python/sdk/authentication/credential-chains#defaultazurecredential-overview) for an opinionated, preconfigured chain of credentials. `DefaultAzureCredential` discovers user credentials from your local tooling or IDE, such as the Azure CLI or Visual Studio Code. It also provides flexibility and convenience for retries, wait times for responses, and support for multiple authentication options. Visit the [Authenticate to Azure services during local development](local-development-dev-accounts.md) article to learn more.\n- **Azure-hosted apps**: When your app is running in Azure, use [ManagedIdentityCredential](/python/api/azure-identity/azure.identity.managedidentitycredential?view=azure-python&preserve-view=true) to safely discover the managed identity configured for your app. Specifying this exact type of credential prevents other available credentials from being picked up unexpectedly.\n\n### Implement the code\n\nAdd the [azure-identity](https://pypi.org/project/azure-identity/) package to your application by navigating to the application project directory and running the following command:\n\n```terminal\npip install azure-identity\n```\n\nAzure services are accessed using specialized client classes from the various Azure SDK client libraries. The following code example demonstrates how to create a credential instance and use it with an Azure SDK service client. In your application code, complete the following steps to authenticate using a managed identity:\n\n1. Import the `ManagedIdentityCredential` class from the `azure.identity` module.\n1. Create a `ManagedIdentityCredential` object and configure either the client ID, resource ID, or object ID.\n1. Pass the `ManagedIdentityCredential` object to the Azure SDK client constructor.\n\n## [Client ID](#tab/client-id)\n\nThe client ID is used to identify a managed identity when configuring applications or services that need to authenticate using that identity.\n\n1. Retrieve the client ID assigned to a user-assigned managed identity using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query 'clientId'\n    ```\n\n1. Configure `ManagedIdentityCredential` with the client ID:\n\n    ```python\n    from azure.identity import ManagedIdentityCredential\n    from azure.storage.blob import BlobServiceClient\n\n    credential = ManagedIdentityCredential(\n        client_id=\"<client-id>\"\n    )\n\n    blob_service_client = BlobServiceClient(\n        account_url=\"https://<account-name>.blob.core.windows.net\",\n        credential=credential\n    )\n    ```\n\n## [Resource ID](#tab/resource-id)\n\nThe resource ID uniquely identifies the managed identity resource within your Azure subscription using the following structure:\n\n`/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}`\n\nResource IDs can be built by convention, which makes them more convenient when working with a large number of user-assigned managed identities in your environment.\n\n1. Retrieve the resource ID for a user-assigned managed identity using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query 'id'\n    ```\n\n1. Configure `ManagedIdentityCredential` with the resource ID:\n\n    ```python\n    from azure.identity import ManagedIdentityCredential\n    from azure.storage.blob import BlobServiceClient\n\n    credential = ManagedIdentityCredential(\n        identity_config={\"resource_id\": \"<resource-id>\"}\n    )\n\n    blob_service_client = BlobServiceClient(\n        account_url=\"https://<account-name>.blob.core.windows.net\",\n        credential=credential\n    )\n    ```\n\n## [Object ID](#tab/object-id)\n\nA principal ID is another name for an object ID.\n\n1. Retrieve the object ID for a user-assigned managed identity using the following command:\n\n    ```azurecli\n    az identity show \\\n        --resource-group <resource-group-name> \\\n        --name <identity-name> \\\n        --query 'principalId'\n    ```\n\n1. Configure `ManagedIdentityCredential` with the object ID:\n\n    ```python\n    from azure.identity import ManagedIdentityCredential\n    from azure.storage.blob import BlobServiceClient\n\n    credential = ManagedIdentityCredential(\n        identity_config={\"object_id\": \"<object-id>\"}\n    )\n\n    blob_service_client = BlobServiceClient(\n        account_url=\"https://<account-name>.blob.core.windows.net\",\n        credential=credential\n    )\n    ```\n\n---\n"
  },
  {
    "path": "articles/python/sdk/authorization/overview.md",
    "content": "---\ntitle: Authorization in the Azure SDK libraries for Python\ndescription: Learn how to implement and troubleshoot authorization when using the Azure SDK for Python.\nms.date: 7/10/2025\nms.topic: concept-article\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Authorization in the Azure SDK libraries for Python\n\nAuthorization in Azure determines what actions authenticated users or services can perform on resources. This article explores how to implement authorization using the [Azure SDK for Python](/azure/developer/python/sdk/azure-sdk-overview), covering models, implementation, troubleshooting, and best practices. For detailed authentication setup, refer to [Authenticate Python apps to Azure](/azure/developer/python/sdk/authentication/overview).\n\n## Introduction\n\n**Authentication (AuthN)** verifies the identity of a user or service, while **authorization (AuthZ)** defines what they can do. In Azure, authorization ensures secure access to resources, critical for protecting applications and data. Developers can implement robust authorization with the Azure SDK for Python to control access in various workflows, from managing resources to accessing service-specific data.\n\n## Azure authorization models\n\nAzure provides multiple authorization mechanisms to manage access. Understanding these models is essential for effective access control.\n\n### Azure Role-Based Access Control\n\n[Azure Role-Based Access Control](/azure/role-based-access-control/) (RBAC) assigns roles to identities at scopes like subscriptions or resource groups. Built-in roles include Owner, Contributor, and Reader, while custom roles allow tailored permissions. When you assign a role at a specific scope, the identity (like a user or service) gets permissions for all resources within that scope and its child scopes. For example, assigning the Contributor role at the subscription level allows management of all resources in that subscription. See [Understand scope for Azure RBAC](/azure/role-based-access-control/scope-overview).\n\n### Service-specific mechanisms\n\nSome Azure services offer unique authorization methods:\n\n- **Azure Storage**: Uses Shared Access Signatures (SAS) and Access Control Lists (ACLs) for data access. See **Service-Specific Authorization Notes** for [Azure Storage](#azure-storage).\n- **Azure Key Vault**: Recommends RBAC over legacy access policies. See **Service-Specific Authorization Notes** for [Azure Key Vault](#azure-key-vault).\n- **Microsoft Graph**: Employs OAuth 2.0 scopes and application permissions. See **Service-Specific Authorization Notes** for [Microsoft Graph](#microsoft-graph).\n\n## Use authorization in Azure SDK for Python\n\nThe Azure SDK for Python provides built-in support for handling authentication and authorization through the `azure-identity` package. The `DefaultAzureCredential` class supports various authentication mechanisms, such as managed identities and service principals, adapting to different environments.\n\n### Example: List resource groups\n\nThis example shows how the Azure SDK for Python uses a credential (via `DefaultAzureCredential`) to authenticate, and how authorization determines whether the identity can successfully list resource groups. If the identity lacks the Reader or higher role on the subscription or resource group scope, this call returns a 403 Forbidden error.\n\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom azure.mgmt.resource import ResourceManagementClient\n\ncredential = DefaultAzureCredential()\nclient = ResourceManagementClient(credential, \"<subscription-id>\")\nresource_groups = client.resource_groups.list()\nfor rg in resource_groups:\n    print(rg.name)\n```\n\nReplace `<subscription-id>` with your Azure subscription ID, which is usually in the form of `00000000-0000-0000-0000-000000000000`.\n\n### Microsoft Graph with scopes\n\nTo access Microsoft Graph, use the official [Microsoft Graph SDK for Python](https://github.com/microsoftgraph/msgraph-sdk-python), which supports both delegated and application permissions.\n\nThis example demonstrates how the SDK uses a credential to request an access token with the required authorization scope `https://graph.microsoft.com/.default` and access Microsoft Graph resources. The identity must be authorized in Microsoft Entra ID with appropriate application permissions (such as `User.Read.All`) to retrieve user data; otherwise, the request fails with a 403 Forbidden.\n\n> [!Important]\n> Ensure your app or identity has the `User.Read.All` or other required permissions granted in Microsoft Entra ID.\n\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom msgraph.core import GraphClient\n\ncredential = DefaultAzureCredential()\nclient = GraphClient(credential=credential, scopes=[\"https://graph.microsoft.com/.default\"])\n\nresponse = client.get(\"/users\")\nusers = response.json().get(\"value\", [])\nfor user in users:\n    print(user[\"displayName\"])\n```\n\nLearn more about this SDK in the official [Build Python apps with Microsoft Graph](/graph/tutorials/python) tutorial.\n\n\n## Diagnose authorization errors\n\nAuthorization issues often result in HTTP 403 Forbidden errors, indicating insufficient permissions. To diagnose:\n\n- **Check Error Messages**: Review the response for details on missing permissions.\n- **Enable Logging**: Use Python logging to inspect requests and responses:\n\n  ```python\n  import logging\n  logging.basicConfig(level=logging.DEBUG)\n  ```\n- **Verify Access**: Use [Azure CLI](/cli/azure/) or the Azure portal to check role assignments:\n\n  ```azurecli\n  az role assignment list --assignee <principal-id> --scope <scope>\n  ```\n\n  Replace `<principal-id>` with the object ID of your user, service principal, or managed identity. Replace `<scope>` with an Azure resource scope, such as a subscription ID, a resource group name, or a resource. See [Work with scopes](#work-with-scopes).\n\n## Work with scopes\n\n  Often you'll need to provide a scope, like in the example:\n\n  ```azurecli\n  az role assignment list \\\n      --assignee <principal-id> \\\n      --scope <scope>\n  ```  \n\n  Here are some common scope formats:\n\n  | Scope Level        | Example Value                                                                                                                          |\n  | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------- |\n  | **Subscription**   | `/subscriptions/<subscription-id>`                                                                                                     |\n  | **Resource Group** | `/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>`                                                                |\n  | **Resource Name**       | `/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/<provider-namespace>/<resource-type>/<resource-name>` |\n\n  For example, to list all role assignments for a managed identity at the resource group level:\n\n  ```azurecli\n  az role assignment list \\\n    --assignee 12345678-90ab-cdef-1234-567890abcdef \\\n    --scope /subscriptions/<subscription-id>/resourceGroups/my-resource-group\n  ```\n  \n  Or at the subscription level:\n\n  ```azurecli\n  az role assignment list \\\n    --assignee 12345678-90ab-cdef-1234-567890abcdef \\\n    --scope /subscriptions/<subscription-id>\n  ```\n\n  You can retrieve the object ID (`<principal-id>`) of a user or managed identity using:\n\n  ```azurecli\n  az ad user show --id <user-email> --query objectId\n  az identity show --name <identity-name> --resource-group <rg-name> --query principalId\n  ```\n\n## Manage access\n\nManage access through role assignments using:\n\n- **Azure portal**: Add roles via the \"Access control (IAM)\" service menu\n- **Azure CLI**:\n  ```azurecli\n  az role assignment create --assignee <principal-id> --role <role-name> --scope <scope>\n  ```\n\n  Replace `<principal-id>` with the object ID of your user, service principal, or managed identity. Replace `<scope>` with an Azure resource scope, such as a subscription ID, a resource group name, or a resource name. See [Work with scopes](#work-with-scopes).\n\n- **ARM Templates**: For declarative management.\n\nFor managed identities, assign roles to the identity associated with resources like virtual machines. Use the Azure portal's \"Check access\" feature or the Azure CLI to verify effective permissions.\n\n## Service-specific authorization notes\n\nIn the section [Service-specific mechanisms](#service-specific-mechanisms), it was noted that some Azure services offer unique authorization methods. This section provides more detail for each of the three Azure services mentioned.\n\n### Azure Storage\n\n- **RBAC**: Manages control plane operations.\n- **SAS and ACLs**: Control data plane access, with Microsoft Entra authentication also supported.\n\n### Example: Access blobs with Microsoft Entra ID\n\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom azure.storage.blob import BlobServiceClient\n\ncredential = DefaultAzureCredential()\nclient = BlobServiceClient(account_url=\"https://<account-name>.blob.core.windows.net\", credential=credential)\ncontainers = client.list_containers()\nfor container in containers:\n    print(container.name)\n```\n\nReplace `<account-name>` with your Azure Storage account name.\n\n\n### Azure Key Vault\n\nRBAC is recommended over legacy access policies for consistency. Access policies are still supported but not preferred.\n\n### Example: Retrieve a secret\n\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom azure.keyvault.secrets import SecretClient\n\ncredential = DefaultAzureCredential()\nclient = SecretClient(vault_url=\"https://<vault-name>.vault.azure.net\", credential=credential)\nsecret = client.get_secret(\"my-secret\")\nprint(secret.value)\n```\n\nReplace `<vault-name>` with your Key Vault resource name.\n\n\n### Microsoft Graph\n\nUses OAuth 2.0 scopes for delegated permissions and application permissions for daemon apps. Specify scopes as shown in the earlier example.\n\n## Best practices\n\n- **Least privilege**: Assign only necessary permissions (for example, Reader instead of Contributor).\n- **Prefer RBAC**: Especially for Key Vault, for unified access control.\n- **Use Managed Identities**: Avoid managing credentials in code.\n- **Limit Graph permissions**: Request specific scopes to minimize risks.\n\n## Next steps\n\n- [Azure Role-Based Access Control (RBAC)](/azure/role-based-access-control/)\n- [Azure CLI Reference](/cli/azure/)\n- [Azure SDK for Python Overview](/azure/developer/python/sdk/azure-sdk-overview)\n- [Azure Key Vault RBAC Guide](/azure/key-vault/general/rbac-guide)\n- [Microsoft Graph Permissions Reference](/graph/permissions-reference)"
  },
  {
    "path": "articles/python/sdk/azure-sdk-configure-proxy.md",
    "content": "---\ntitle: Configuring proxies when using Azure libraries\ndescription: Use HTTP[S]_PROXY environment variables to define a proxy for an entire script or app, or use optional named arguments for client constructors or operation methods in the Azure SDK.\nms.date: 05/21/2025\nms.topic: how-to\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# How to configure proxies for the Azure SDK for Python\n\nA proxy is often needed if:\n\n- You're behind a corporate firewall\n- Your network traffic needs to go through a security appliance\n- You want to use a custom proxy for debugging or routing\n\nIf your organization requires the use of a proxy server to access internet resources, you need to set an environment variable with the proxy server information to use the Azure SDK for Python. Setting the environment variables (HTTP_PROXY and HTTPS_PROXY) causes the Azure SDK for Python to use the proxy server at run time.\n\nA proxy server URL has of the form `http[s]://[username:password@]<ip_address_or_domain>:<port>/` where the username and password combination is optional.\n\nYou can obtain your proxy information from your IT/network team, from your browser, or from network utilities.\n\nYou can then configure a proxy globally by using environment variables, or you can specify a proxy by passing an argument named `proxies` to an individual client constructor or operation method.\n\n## Global configuration\n\nTo configure a proxy globally for your script or app, define `HTTP_PROXY` or `HTTPS_PROXY` environment variables with the server URL. These variables work with any version of the Azure libraries. Note that `HTTPS_PROXY` doesn't mean `HTTPS` proxy, but the proxy for `https://` requests.\n\nThese environment variables are ignored if you pass the parameter `use_env_settings=False` to a client object constructor or operation method.\n\n### Set from the command line\n\n#### [cmd](#tab/cmd)\n\n:::code language=\"cmd\" source=\"~/../python-sdk-docs-examples/proxy/set_proxy.cmd\":::\n\n##### [bash](#tab/bash)\n\n:::code language=\"bash\" source=\"~/../python-sdk-docs-examples/proxy/set_proxy.sh\":::\n\n---\n\n### Set in Python code\n\nYou can set proxy settings using environment variables, with no\ncustom configuration necessary.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/proxy/set_http_proxy.py\" range=\"1-7\":::\n\n## Custom configuration\n\n### Set in Python code per-client or per-method\n\nFor custom configuration, you can specify a proxy for a specific client object or operation method. Specify a proxy server with an argument named `proxies`.\n\nFor example, the following code from the article [Example: use Azure storage](./examples/azure-sdk-example-storage.md) specifies an HTTPS proxy with user credentials with the `BlobClient` constructor. In this case, the object comes from the azure.storage.blob library, which is based on azure.core.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/proxy/set_http_proxy.py\" range=\"9-26\":::\n"
  },
  {
    "path": "articles/python/sdk/azure-sdk-install.md",
    "content": "---\ntitle: How to install Azure SDK library packages for Python\ndescription: How to install, uninstall, and verify Azure SDK or Python libraries using pip and conda. Includes details on installing specific versions and preview packages.\nms.date: 02/28/2026\nms.topic: install-set-up-deploy\nms.custom: devx-track-python, py-fresh-zinc\nadobe-target: true\n---\n\n# How to install Azure library packages for Python\n\nThe Azure SDK for Python is composed of many individual libraries that you can install in standard [Python](https://docs.python.org/3/library/venv.html) or [conda](https://docs.conda.io/projects/conda/en/latest/user-guide/concepts/environments.html) environments.\n\nYou can find libraries for standard Python environments in the [package index](azure-sdk-library-package-index.md).\n\nYou can find packages for conda environments in the [Microsoft channel on anaconda.org](https://anaconda.org/microsoft/repo). Azure packages have names that begin with `azure-`.\n\nBy using these Azure libraries, you can create and manage resources on Azure services (by using the management libraries, whose package names begin with `azure-mgmt`) and connect with those resources from app code (by using the client libraries, whose package names begin with just `azure-`).\n\n## Install the latest version of a package\n\n# [pip](#tab/pip)\n\n```cmd\npip install <package>\n```\n\n`pip install` gets the latest version of a package in your current Python environment.\n\nOn Linux systems, you must install a package separately for each user. Don't use `sudo pip install` to install packages for all users, as it's unsupported.\n\nUse any package name listed in the [package index](azure-sdk-library-package-index.md). On the index page, look in the **Name** column for the functionality you need, and then find and select the PyPI link in the **Package** column.\n\n# [conda](#tab/conda)\n\nMake sure you add the Microsoft channel to your conda configuration (run this command only once):\n\n```cmd\nconda config --add channels \"Microsoft\"\n```\n\nThen, install the package you want:\n\n```cmd\nconda install <package>\n```\n\n`conda install` gets the latest version of a package for your current Python environment.\n\nYou can use any package name listed in the [Microsoft channel on anaconda.org](https://anaconda.org/microsoft/repo). Azure packages have names that start with `azure-`.\n\nConda packages are grouped by service. For example, `azure-storage` includes libraries for working with blobs, file shares, queues, and any other Azure Storage service. The single `azure-mgmt` package contains the management libraries for all services.\n\n---\n\n## Install specific package versions\n\n# [pip](#tab/pip)\n\nSpecify the version you want on the command line by using `pip install`.\n\n```cmd\npip install <package>==<version>\n```\n\nYou can find version numbers in the [package index](azure-sdk-library-package-index.md). On the index page, look in the **Name** column for the functionality you need, and then find and select the PyPI link in the **Package** column. For example, to install a version of the `azure-storage-blob` package, use: `pip install azure-storage-blob==12.19.0`.\n\n# [conda](#tab/conda)\n\nMake sure you add the Microsoft channel to your conda configuration (run this command only once):\n\n```cmd\nconda config --add channels \"Microsoft\"\n```\n\nThen, install the package and version you want:\n\n```cmd\nconda install <package>==<version>\n```\n\nYou can find version numbers on the [Microsoft channel on anaconda.org](https://anaconda.org/microsoft/repo). Azure packages have names that start with `azure-`. Find the library or package you want, open it, and look for the version number in the \"Files\" tab. For example, to install a version of `azure-storage`, use: `conda install azure-storage=2023.09.01`. Or, specify the version you want on the command line by using `conda install --revision`.\n\n---\n\n## Install preview packages\n\n# [pip](#tab/pip)\n\nTo install the latest preview of a package, include the `--pre` flag on the command line.\n\n```cmd\npip install --pre <package>\n```\n\nMicrosoft periodically releases preview packages that support upcoming features. Preview packages come with the caveat that the package is subject to change and must not be used in production projects.\n\nYou can use any package name listed in the [package index](azure-sdk-library-package-index.md).\n\n# [conda](#tab/conda)\n\nPreview packages for conda aren't available at this time.\n\n---\n\n## Verify a package installation\n\n# [pip](#tab/pip)\n\nTo verify a package installation, run the following command:\n\n```cmd\npip show <package>\n```\n\nIf the package is installed, `pip show` displays version and other summary information. Otherwise, the command displays nothing.\n\nYou can also use `pip freeze` or `pip list` to see all the packages that are installed in your current Python environment.\n\nYou can use any package name listed in the [package index](azure-sdk-library-package-index.md).\n\n# [conda](#tab/conda)\n\nTo verify a package installation, run the following command:\n\n```cmd\nconda list <package>\n```\n\nIf the package is installed, `conda list` displays version and other summary information. Otherwise, the command displays nothing.\n\nYou can also use `conda list` to see all the packages that are installed in your current conda environment.\n\nYou can use any package name listed in the [Microsoft channel on anaconda.org](https://anaconda.org/microsoft/repo). Azure packages have names that start with `azure-`.\n\n---\n\n## Uninstall a package\n\n# [pip](#tab/pip)\n\nTo uninstall a package:\n\n```cmd\npip uninstall <package>\n```\n\nYou can use any package name listed in the [package index](azure-sdk-library-package-index.md).\n\n# [conda](#tab/conda)\n\nTo uninstall a package:\n\n```cmd\nconda remove <package>\n```\n\nYou can use any package name listed in the [Microsoft channel on anaconda.org](https://anaconda.org/microsoft/repo). Azure packages have names that start with `azure-`.\n\n---\n"
  },
  {
    "path": "articles/python/sdk/azure-sdk-library-package-index.md",
    "content": "---\ntitle: Package index for Azure SDK libraries for Python\ndescription: Listing of the package names, pypi links, docs links, and source code links for all libraries in the Azure SDK for Python.\nms.date: 05/20/2025\nms.topic: concept-article\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Azure libraries package index\n\nAzure Python SDK packages are published to [PyPI](https://pypi.org/), including beta releases marked with a \"b\" in the version number (such as 1.0.0b1). For the latest versions and release history, see the [Azure SDK Releases: Python](https://azure.github.io/azure-sdk/policies_releases.html#python).\n\nIf you're looking for help with using a specific SDK package, you have several options:\n\n* **Source code and samples**: In the Azure SDK for Python GitHub repository, each package has its own folder. To view its code, select the GitHub link in the \"Source\" column of the package index. Most repos include a README.md file with example usage.\n\n* **API Reference documentation**: To view the API reference, select the Docs link in the same table. These pages provide an overview of the package, its classes, and their available methods.\n\n* **Tutorials and developer guidance**: To explore tutorials, how-to guides, and installation instructions, Visit the [Azure for Python developers](index.yml) documentation. For example, to learn how to install SDK packages, see: [How to install Azure library packages for Python](./azure-sdk-install.md).\n\n> [!NOTE]\n> The **Name** column contains a friendly name for each package. To find the name you need to use to install the package with [pip](https://pip.pypa.io/en/stable/), use the links in the **Package**, **Docs**, or **Source** columns. For example, the **Name** column for the Azure Blob Storage package is \"Blobs\" while the package name is *azure-storage-blob*.\n>\n> For Conda libraries, see the [Microsoft channel on anaconda.org](https://anaconda.org/microsoft/repo).\n\n## Libraries using azure.core\n\n[!INCLUDE [python-new-releases](../../includes/python-new.md)]\n\n## All libraries\n\n[!INCLUDE [python-all-libraries](../../includes/python-all.md)]\n"
  },
  {
    "path": "articles/python/sdk/azure-sdk-library-usage-patterns.md",
    "content": "---\ntitle: Usage patterns with the Azure libraries for Python\ndescription: An overview of common usage patterns in the Azure SDK libraries for Python\nms.date: 04/14/2025\nms.topic: how-to\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Azure libraries for Python usage patterns\n\nThe Azure SDK for Python is composed of many independent libraries, which are listed on the [Python SDK package index](azure-sdk-library-package-index.md).\n\nAll the libraries share certain common characteristics and usage patterns, such as installation and the use of inline JSON for object arguments.\n\n## Set up your local development environment\n\nIf you haven't already, you can set up an environment where you can run this code. Here are some options:\n\n[!INCLUDE [create_environment_options](../includes/create-environment-options.md)]\n\n## Library installation\n\nChoose the installation method that corresponds to your Python environment management tool, either pip or conda.\n\n# [pip](#tab/pip)\n\nTo install a specific library package, use `pip install`:\n\n```cmd\nREM Install the management library for Azure Storage\npip install azure-mgmt-storage\n```\n\n```cmd\nREM Install the client library for Azure Blob Storage\npip install azure-storage-blob\n```\n\n```cmd\nREM Install the azure identity library for Azure authentication\npip install azure-identity\n```\n\n`pip install` retrieves the latest version of a library in your current Python environment.\n\nYou can also use `pip` to uninstall libraries and install specific versions, including preview versions. For more information, see [How to install Azure library packages for Python](azure-sdk-install.md).\n\n# [conda](#tab/conda)\n\nTo install a specific library package in a Conda environment, use `conda install`:\n\n```cmd\n# Install the Azure management library package\nconda install azure-mgmt\n```\n\n```cmd\n# Install the client library for Azure Storage\nconda install azure-storage\n```\n\n```cmd\nREM Install the azure identity library for Azure authentication\npip install azure-identity\n```\n`conda install` retrieves the latest version of a package in your current Conda environment.\n\nFor more information, including how to remove packages or install specific versions, see [How to install Azure library packages for Python](azure-sdk-install.md).\n\n---\n\n## Asynchronous operations\n\n### Asynchronous libraries\n\nMany client and management libraries provide async versions (`.aio`). The `asyncio` library has been available since Python 3.4, and the async/await keywords were introduced in Python 3.5. The async versions of the libraries are intended to be used with Python 3.5 and later.\n\nExamples of Azure Python SDK libraries with async versions include: [azure.storage.blob.aio](/python/api/azure-storage-blob/azure.storage.blob.aio), [azure.servicebus.aio](/python/api/azure-servicebus/azure.servicebus.aio), [azure.mgmt.keyvault.aio](/python/api/azure-mgmt-keyvault/azure.mgmt.keyvault.aio), and [azure.mgmt.compute.aio](/python/api/azure-mgmt-compute/azure.mgmt.compute.aio).\n\nThese libraries need an async transport such as `aiohttp` to work. The `azure-core` library provides an async transport, `AioHttpTransport`, which is used by the async libraries, so you may not need to install `aiohttp` separately.\n\nThe following code shows how create a python file thath demonstrates how to create a client for the async version of the Azure Blob Storage library:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/storage/use_blob_auth_async.py\" range=\"14-33\":::\n\nThe full example is on GitHub at [use_blob_auth_async.py](https://github.com/MicrosoftDocs/python-sdk-docs-examples/blob/main/storage/use_blob_auth_async.py). For the synchronous version of this code, see [Example: Upload a blob](examples/azure-sdk-example-storage-use.md).\n\n### Long running operations\n\nSome management operations that you invoke (such as [`ComputeManagementClient.virtual_machines.begin_create_or_update`](/azure/developer/python/sdk/examples/azure-sdk-samples-managed-disks#azure-mgmt-compute-v2022-08-01-operations-virtualmachinesoperations-begin-create-or-update) and `WebAppsClient.web_apps.begin_create_or_update`) return a poller for long running operations, `LROPoller[<type>]`, where `<type>` is specific to the operation in question.\n\n> [!NOTE]\n> You may notice differences in method names in a library depending on its version and whether it's based on azure.core. Older libraries that aren't based on azure.core typically use names like `create_or_update`. Libraries based on azure.core add the `begin_` prefix to method names to better indicate that they are long polling operations. Migrating old code to a newer azure.core-based library typically means adding the `begin_` prefix to method names, as most method signatures remain the same.\n\nThe [`LROPoller`](/python/api/azure-core/azure.core.polling.lropoller) return type means that the operation is asynchronous. Accordingly, you must call that poller's `result` method to wait for the operation to finish and obtain its result.\n\nThe following code, taken from [Example: Create and deploy a web app](./examples/azure-sdk-example-web-app.md), shows an example of using the poller to wait for a result:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/webapp/provision_deploy_web_app.py\" range=\"54-70\":::\n\nIn this case, the return value of `begin_create_or_update` is of type `AzureOperationPoller[Site]`, which means that the return value of `poller.result()` is a Site object.\n\n## Exceptions\n\nIn general, the Azure libraries raise exceptions when operations fail to perform as intended, including failed HTTP requests to the Azure REST API. For app code, you can use `try...except` blocks around library operations.\n\nFor more information on the type of exceptions that may be raised, see the documentation for the operation in question.\n\n## Logging\n\nThe most recent Azure libraries use the Python standard `logging` library to generate log output. You can set the logging level for individual libraries, groups of libraries, or all libraries. Once you register a logging stream handler, you can then enable logging for a specific client object or a specific operation. For more information, see [Logging in the Azure libraries](azure-sdk-logging.md).\n\n## Proxy configuration\n\nTo specify a proxy, you can use environment variables or optional arguments. For more information, see [How to configure proxies](azure-sdk-configure-proxy.md).\n\n## Optional arguments for client objects and methods\n\nIn the library reference documentation, you often see a `**kwargs` or `**operation_config` argument in the signature of a client object constructor or a specific operation method. These placeholders indicate that the object or method in question may support other named arguments. Typically, the reference documentation indicates the specific arguments you can use. There are also some general arguments that are often supported as described in the following sections.\n\n### Arguments for libraries based on azure.core\n\nThese arguments apply to those libraries listed on [Python - New Libraries](https://azure.github.io/azure-sdk/releases/latest/#python). For example, here are a subset of the keyword arguments for `azure-core`. For a complete list, see the GitHub README for [azure-core](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/core/azure-core#configurations).\n\n| Name                       | Type | Default     | Description |\n| ---                        | ---  | ---         | ---         |\n| logging_enable             | bool | False       | Enables logging. For more information, see [Logging in the Azure libraries](azure-sdk-logging.md). |\n| proxies                    | dict | {}          | Proxy server URLs. For more information, see [How to configure proxies](azure-sdk-configure-proxy.md). |\n| use_env_settings           | bool | True        | If True, allows use of `HTTP_PROXY` and `HTTPS_PROXY` environment variables for proxies. If False, the environment variables are ignored. For more information, see [How to configure proxies](azure-sdk-configure-proxy.md). |\n| connection_timeout         | int  | 300         | The timeout in seconds for making a connection to Azure REST API endpoints. |\n| read_timeout               | int  | 300         | The timeout in seconds for completing an Azure REST API operation (that is, waiting for a response). |\n| retry_total                | int  | 10          | The number of allowable retry attempts for REST API calls. Use `retry_total=0` to disable retries. |\n| retry_mode                 | enum | exponential | Applies retry timing in a linear or exponential manner. If 'single', retries are made at regular intervals. If 'exponential', each retry waits twice as long as the previous retry. |\n\nIndividual libraries aren't obligated to support any of these arguments, so always consult the reference documentation for each library for exact details. Also, each library may support other arguments. For example, for blob storage specific keyword arguments, see the GitHub README for [azure-storage-blob](https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-blob#optional-configuration).\n\n## Inline JSON pattern for object arguments\n\nMany operations within the Azure libraries allow you to express object arguments either as discrete objects or as inline JSON.\n\nFor example, suppose you have a [`ResourceManagementClient`](/python/api/azure-mgmt-resource/azure.mgmt.resource.resources.resourcemanagementclient) object through which you create a resource group with its [`create_or_update`](/python/api/azure-mgmt-resource/azure.mgmt.resource.resources.operations.resourcegroupsoperations#azure-mgmt-resource-resources-operations-resourcegroupsoperations-create-or-update) method. The second argument to this method is of type [`ResourceGroup`](/python/api/azure-mgmt-resource/azure.mgmt.resource.resources.models.resourcegroup).\n\nTo call the `create_or_update` method, you can create a discrete instance of `ResourceGroup` directly with its required arguments (`location` in this case):\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/resource_group/provision_rg_objs.py\" range=\"16-20\":::\n\nAlternately, you can pass the same parameters as inline JSON:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/resource_group/provision_rg.py\" range=\"16-20\":::\n\nWhen you use inline JSON, the Azure libraries automatically convert the inline JSON to the appropriate object type for the argument in question.\n\nObjects can also have nested object arguments, in which case you can also use nested JSON.\n\nFor example, suppose you have an instance of the [`KeyVaultManagementClient`](/python/api/azure-mgmt-keyvault/azure.mgmt.keyvault.keyvaultmanagementclient) object, and are calling its [`create_or_update`](/python/api/azure-mgmt-keyvault/azure.mgmt.keyvault.operations.vaultsoperations). In this case, the third argument is of type [`VaultCreateOrUpdateParameters`](/python/api/azure-mgmt-keyvault/azure.mgmt.keyvault.models.vaultchecknameavailabilityparameters), which itself contains an argument of type [`VaultProperties`](/python/api/azure-mgmt-keyvault/azure.mgmt.keyvault.models.vaultproperties). `VaultProperties`, in turn, contains object arguments of type [`Sku`](/python/api/azure-mgmt-keyvault/azure.mgmt.keyvault.models.sku) and [`list[AccessPolicyEntry]`](/python/api/azure-mgmt-keyvault/azure.mgmt.keyvault.models.accesspolicyentry). A `Sku` contains a [`SkuName`](/python/api/azure-mgmt-keyvault/azure.mgmt.keyvault.models.skuname) object, and each `AccessPolicyEntry` contains a [`Permissions`](/python/api/azure-mgmt-keyvault/azure.mgmt.keyvault.models.permissions) object.\n\nTo call `begin_create_or_update` with embedded objects, you use code like the following (assuming `tenant_id`, `object_id`, and `LOCATION` are already defined). You can also create the necessary objects before the function call.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/key_vault/provision_key_vault.py\" range=\"66-92\":::\n\nThe same call using inline JSON appears as follows:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/key_vault/provision_key_vault.py\" range=\"97-121\":::\n\nBecause both forms are equivalent, you can choose whichever you prefer and even intermix them. (The full code for these examples can be found on [GitHub](https://github.com/MicrosoftDocs/python-sdk-docs-examples/blob/main/key_vault/provision_key_vault.py).)\n\nIf your JSON isn't formed properly, you typically get the error, \"DeserializationError: Unable to deserialize to object: type, AttributeError: 'str' object has no attribute 'get'\". A common cause of this error is that you're providing a single string for a property when the library expects a nested JSON object. For example, using `'sku': 'standard'` in the previous example generates this error because the `sku` parameter is a `Sku` object that expects inline object JSON, in this case `{'name': 'standard'}`, which maps to the expected `SkuName` type.\n\n## Next steps\n\nNow that you understand the common patterns for using the Azure libraries for Python, see the following standalone examples to explore specific management and client library scenarios. You can try these examples in any order as they're not sequential or interdependent.\n\n- [Example: Create a resource group](./examples/azure-sdk-example-resource-group.md)\n- [Example: Use Azure Storage](./examples/azure-sdk-example-storage.md)\n- [Example: Create a web app and deploy code](./examples/azure-sdk-example-web-app.md)\n- [Example: Create and query a database](./examples/azure-sdk-example-database.md)\n- [Example: Create a virtual machine](./examples/azure-sdk-example-virtual-machines.md)\n- [Use Azure Managed Disks with virtual machines](./examples/azure-sdk-samples-managed-disks.md)\n\n- [Complete a short survey about the Azure SDK for Python](https://microsoft.qualtrics.com/jfe/form/SV_bNFX0HECjzPWMiG?Q_CHL=docs)\n"
  },
  {
    "path": "articles/python/sdk/azure-sdk-logging.md",
    "content": "---\ntitle: Configure logging in the Azure libraries for Python\ndescription: The Azure libraries use the standard Python logging module, which is configured on a per-library or per-operation basis.\nms.date: 12/19/2025\nms.topic: how-to\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Configure logging in the Azure libraries for Python\n\nAzure Libraries for Python that are [based on azure.core](azure-sdk-library-package-index.md#libraries-using-azurecore) provide logging output using the standard Python [logging](https://docs.python.org/3/library/logging.html) library.\n\nThe general process to work with logging is as follows:\n\n1. Acquire the logging object for the desired library and set the logging level.\n1. Register a handler for the logging stream.\n1. To include HTTP information, pass a `logging_enable=True` parameter to a client object constructor, a credential object constructor, or to a specific method.\n\nDetails are provided in the remaining sections of this article.\n\nAs a general rule, the best resource for understanding logging usage within the libraries is to browse the SDK source code at [github.com/Azure/azure-sdk-for-python](https://github.com/Azure/azure-sdk-for-python). We encourage you to clone this repository locally so you can easily search for details when needed, as the following sections suggest.\n\n## Set logging levels\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/logging/set_levels.py\" range=\"1-9\":::\n\n- This example acquires the logger for the `azure.mgmt.resource` library, then sets the logging level to `logging.DEBUG`.\n- You can call `logger.setLevel` at any time to change the logging level for different segments of code.\n\nTo set a level for a different library, use that library's name in the `logging.getLogger` call. For example, the azure-eventhubs library provides a logger named `azure.eventhubs`, the azure-storage-queue library provides a logger named `azure.storage.queue`, and so on. (The SDK source code frequently uses the statement `logging.getLogger(__name__)`, which acquires a logger using the name of the containing module.)\n\nYou can also use more general namespaces. For example,\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/logging/set_levels.py\" range=\"1-2,11-17\":::\n\nThe `azure` logger is used by some libraries instead of a specific logger. For example, the azure-storage-blob library uses the `azure` logger.\n\nYou can use the `logger.isEnabledFor` method to check whether any given logging level is enabled:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/storage/use_blob_auth_logging.py\" range=\"22-27\":::\n\nLogging levels are the same as the [standard logging library levels](https://docs.python.org/3/library/logging.html#levels). The following table describes the general use of these logging levels in the Azure libraries for Python:\n\n| Logging level             | Typical use |\n| ---                       | ---         |\n| logging.ERROR             | Failures where the application is unlikely to recover (such as out of memory). |\n| logging.WARNING (default) | A function fails to perform its intended task (but not when the function can recover, such as retrying a REST API call). Functions typically log a warning when raising exceptions. The warning level automatically enables the error level. |\n| logging.INFO              | Function operates normally or a service call is canceled. Info events typically include requests, responses, and headers. The info level automatically enables the error and warning levels. |\n| logging.DEBUG             | Detailed information that is commonly used for troubleshooting and includes a stack trace for exceptions. The debug level automatically enables the info, warning, and error levels. CAUTION: If you also set `logging_enable=True`, the debug level includes sensitive information such as account keys in headers and other credentials. Be sure to protect these logs to avoid compromising security. |\n| logging.NOTSET            | Disable all logging. |\n\n### Library-specific logging level behavior\n\nThe exact logging behavior at each level depends on the library in question. Some libraries, such as azure.eventhub, perform extensive logging whereas other libraries do little.\n\nThe best way to examine the exact logging for a library is to search for the logging levels in the [Azure SDK for Python source code](https://github.com/Azure/azure-sdk-for-python):\n\n1. In the repository folder, navigate into the *sdk* folder, then navigate into the folder for the specific service of interest.\n\n1. In that folder, search for any of the following strings:\n\n    - `_LOGGER.error`\n    - `_LOGGER.warning`\n    - `_LOGGER.info`\n    - `_LOGGER.debug`\n\n## Register a log stream handler\n\nTo capture logging output, you must register at least one log stream handler in your code:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/storage/use_blob_auth_logging.py\" range=\"1,17-20\":::\n\nThis example registers a handler that directs log output to stdout. You can use other types of handlers as described on [logging.handlers](https://docs.python.org/3/library/logging.handlers.html) in the Python documentation or use the standard [logging.basicConfig](https://docs.python.org/3/library/logging.html#logging.basicConfig) method.\n\n## Enable HTTP logging for a client object or operation\n\nBy default, logging within the Azure libraries doesn't include any HTTP information. To include HTTP information in log output, you must explicitly pass `logging_enable=True` to a client or credential object constructor or to a specific method.\n\n> [!CAUTION]\n> HTTP logging can include sensitive information such as account keys in headers and other credentials. Be sure to protect these logs to avoid compromising security.\n\n### Enable HTTP logging for a client object\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/logging/enable_for_client.py\":::\n\nEnabling HTTP logging for a client object enables logging for all operations invoked through that object.\n\n### Enable HTTP logging for a credential object\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/logging/enable_for_credential.py\":::\n\nEnabling HTTP logging for a credential object enables logging for all operations invoked through that object, but not for operations in a client object that don't involve authentication.\n\n### Enable logging for an individual method\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/logging/enable_for_method.py\":::\n\n## Example logging output\n\nThe following code is that shown in [Example: Use a storage account](./examples/azure-sdk-example-storage-use.md) with the addition of enabling DEBUG and HTTP logging:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/storage/use_blob_auth_logging.py\":::\n\nThe output is as follows:\n\n```output\nLogger enabled for ERROR=True, WARNING=True, INFO=True, DEBUG=True\nRequest URL: 'https://pythonazurestorage12345.blob.core.windows.net/blob-container-01/sample-blob-5588e.txt'\nRequest method: 'PUT'\nRequest headers:\n    'Content-Length': '77'\n    'x-ms-blob-type': 'BlockBlob'\n    'If-None-Match': '*'\n    'x-ms-version': '2023-11-03'\n    'Content-Type': 'application/octet-stream'\n    'Accept': 'application/xml'\n    'User-Agent': 'azsdk-python-storage-blob/12.19.0 Python/3.10.11 (Windows-10-10.0.22631-SP0)'\n    'x-ms-date': 'Fri, 19 Jan 2024 19:25:53 GMT'\n    'x-ms-client-request-id': '8f7b1b0b-b700-11ee-b391-782b46f5c56b'\n    'Authorization': '*****'\nRequest body:\nb\"Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.\"\nResponse status: 201\nResponse headers:\n    'Content-Length': '0'\n    'Content-MD5': 'SUytm0872jZh+KYqtgjbTA=='\n    'Last-Modified': 'Fri, 19 Jan 2024 19:25:54 GMT'\n    'ETag': '\"0x8DC1924749AE3C3\"'\n    'Server': 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0'\n    'x-ms-request-id': '7ac499fa-601e-006d-3f0d-4bdf28000000'\n    'x-ms-client-request-id': '8f7b1b0b-b700-11ee-b391-782b46f5c56b'\n    'x-ms-version': '2023-11-03'\n    'x-ms-content-crc64': 'rtHLUlztgxc='\n    'x-ms-request-server-encrypted': 'true'\n    'Date': 'Fri, 19 Jan 2024 19:25:53 GMT'\nResponse content:\nb''\n```\n\n> [!NOTE]\n> If you get an authorization error, make sure the identity you're running under is assigned the \"Storage Blob Data Contributor\" role on your blob container. To learn more, see [Use blob storage from app code (Passwordless tab)](./examples/azure-sdk-example-storage-use.md?tab=managed-identity#4-use-blob-storage-from-app-code).\n"
  },
  {
    "path": "articles/python/sdk/azure-sdk-overview.md",
    "content": "---\ntitle: Use the Azure libraries (SDK) for Python\ndescription: Overview of the features and capabilities of the Azure libraries for Python that help developers be more productive when creating, using, and managing Azure resources.\nms.date: 02/28/2026\nms.topic: concept-article\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Use the Azure libraries (SDK) for Python\n\nThe open-source Azure libraries for Python simplify provisioning, managing, and using Azure resources from Python application code.\n\n## The details you really want to know\n\n- Use the Azure libraries to communicate with Azure services *from* Python code that you run either locally or in the cloud. Whether you can run Python code within the scope of a particular service depends on whether that service itself currently supports Python.\n\n- The libraries support [Python](https://www.python.org/) 3.9 or later. For more information about supported versions of Python, see [Azure SDKs Python version support policy](https://github.com/Azure/azure-sdk-for-python/wiki/Azure-SDKs-Python-version-support-policy). If you're using [PyPy](https://www.pypy.org/), make sure the version you use at least supports the Python version mentioned previously.\n\n- The Azure SDK for Python is composed solely of over 180 individual Python libraries that relate to specific Azure services. There are no other tools in the SDK.\n\n- When you run code locally, authenticating with Azure relies on environment variables as described in [How to authenticate Python apps to Azure services using the Azure SDK for Python](./authentication-overview.md#authentication-during-local-development).\n\n- To install library packages with pip, use `pip install <library_name>` using library names from the [package index](azure-sdk-library-package-index.md). To install library packages in conda environments, use `conda install <package_name>` using names from the [Microsoft channel on anaconda.org](https://anaconda.org/microsoft/repo). For more information, see [Install Azure library packages](azure-sdk-install.md).\n\n- There are distinct **management** and **client** libraries (sometimes referred to as \"management plane\" and \"data plane\" libraries). Each set serves different purposes and is used by different kinds of code. For more information, see the following sections later in this article:\n  - [Create and manage Azure resources with management libraries](#create-and-manage-azure-resources-with-management-libraries)\n  - [Connect to and use Azure resources with client libraries](#connect-to-and-use-azure-resources-with-client-libraries)\n\n- You can find documentation for the libraries on the [Azure for Python Reference](/python/api/overview/azure/), which is organized by Azure Service, or the [Python API browser](/python/api/), which is organized by package name.\n\n- To try the libraries for yourself, first [set up your local dev environment](../configure-local-development-environment.md). Then you can try any of the following standalone examples (in any order): [Example: Create a resource group](./examples/azure-sdk-example-resource-group.md), [Example: Create and use Azure Storage](./examples/azure-sdk-example-storage.md), [Example: Create and deploy a web app](./examples/azure-sdk-example-web-app.md), [Example: Create and query a MySQL database](./examples/azure-sdk-example-database.md), and [Example: Create a virtual machine](./examples/azure-sdk-example-virtual-machines.md).\n\n- For demonstration videos, see <a href=\"https://www.youtube.com/watch?v=4xoJLCFP4_4\" target=\"_blank\">Introducing the Azure SDK for Python</a> (PyCon 2021) and <a href=\"https://www.youtube.com/watch?v=M1pVxItg2Mg&feature=youtu.be&ocid=AID3006292\" target=\"_blank\">Using Azure SDKs to interact with Azure resources</a> (PyCon 2020).\n\n### Nonessential but still interesting details\n\n- Because the [Azure CLI](/cli/azure/install-azure-cli) is written in Python and uses the management libraries, you can do anything with Azure CLI commands that you can also do from a Python script. The CLI commands provide many helpful features such as performing multiple tasks together, automatically handling asynchronous operations, formatting output like connection strings, and more. So, using the CLI (or its equivalent, [Azure PowerShell](/powershell/azure/install-az-ps)) for automated creation and management scripts can be more convenient than writing the equivalent Python code, unless you want to have a much more exacting degree of control over the process.\n\n- The Azure libraries for Python build on top of the underlying [Azure REST API](/rest/api/azure/), so you can use those APIs through familiar Python paradigms. However, you can always use the REST API directly from Python code, if desired.\n\n- You can find the source code for the Azure libraries on [https://github.com/Azure/azure-sdk-for-python](https://github.com/Azure/azure-sdk-for-python). As an open-source project, contributions are welcome!\n\n- Although you can use the libraries with interpreters such as IronPython and Jython that Microsoft doesn't test against, you might encounter isolated issues and incompatibilities.\n\n- The source repo for the library API reference documentation resides on [https://github.com/MicrosoftDocs/azure-docs-sdk-python/](https://github.com/MicrosoftDocs/azure-docs-sdk-python/).\n\n- Starting in 2019, Microsoft updated Azure Python libraries to share common cloud patterns such as authentication protocols, logging, tracing, transport protocols, buffered responses, and retries. The updated libraries adhere to [current Azure SDK guidelines](https://azure.github.io/azure-sdk/general_introduction.html).\n\n  - On 31 March 2023, Microsoft retired support for Azure SDK libraries that don't conform to current Azure SDK guidelines. While older libraries can still be used beyond 31 March 2023, they no longer receive official support and updates from Microsoft. For more information, see the notice [Update your Azure SDK libraries](https://azure.microsoft.com/updates/support-for-azure-sdk-libraries-that-do-not-conform-to-our-current-azure-sdk-guidelines-will-be-retired-as-of-31-march-2023/).\n\n  - To avoid missing security and performance updates to the Azure SDKs, upgrade to the [latest Azure SDK libraries](https://azure.github.io/azure-sdk/) by 31 March 2023.\n\n  - To check which Python libraries are impacted, see [Azure SDK Deprecated Releases for Python](https://azure.github.io/azure-sdk/releases/deprecated/index.html#python).\n\n- For details on the guidelines Microsoft applies to the libraries, see the [Python Guidelines: Introduction](https://azure.github.io/azure-sdk/python_design.html#introduction).\n\n## Create and manage Azure resources with management libraries\n\nThe SDK's *management* (or \"management plane\") libraries, the names of which all begin with `azure-mgmt-`, help you create, configure, and otherwise manage Azure resources from Python scripts. All Azure services have corresponding management libraries. For more information, see [Azure control plane and data plane](/azure/azure-resource-manager/management/control-plane-and-data-plane).\n\nBy using the management libraries, you can write configuration and deployment scripts to perform the same tasks that you can through the [Azure portal](https://portal.azure.com) or the [Azure CLI](/cli/azure/install-azure-cli). (As noted earlier, the Azure CLI is written in Python and uses the management libraries to implement its various commands.)\n\nThe following examples illustrate how to use some of the primary management libraries:\n\n- [Create a resource group](./examples/azure-sdk-example-resource-group.md)\n- [List resource groups in a subscription](./examples/azure-sdk-example-list-resource-groups.md)\n- [Create an Azure Storage account and a Blob storage container](./examples/azure-sdk-example-storage.md)\n- [Create and deploy a web app to App Service](./examples/azure-sdk-example-web-app.md)\n- [Create and query an Azure MySQL database](./examples/azure-sdk-example-database.md)\n- [Create a virtual machine](./examples/azure-sdk-example-virtual-machines.md)\n\nFor details on working with each management library, see the *README.md* or *README.rst* file located in the library's project folder in the [SDK GitHub repository](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk). You can also find more code snippets in the [reference documentation](/python/api) and the [Azure Samples](/samples/browse/?languages=python&term=Getting%20started%20-%20Managing).\n\n### Migrating from older management libraries\n\nIf you're migrating code from older versions of the management libraries, see the following details:\n\n- If you use the `ServicePrincipalCredentials` class, see [Authenticate with token credentials](./authentication-azure-hosted-apps.md).\n- The names of async APIs have changed as described on [Library usage patterns - asynchronous operations](azure-sdk-library-usage-patterns.md#asynchronous-operations). The names of async APIs in newer libraries start with `begin_`. In most cases, the API signature remains the same.\n\n## Connect to and use Azure resources with client libraries\n\nThe SDK's *client* (or \"data plane\") libraries help you write Python application code to interact with already-provisioned services. Client libraries exist only for those services that support a client API.\n\nThe article [Example: Use Azure Storage](./examples/azure-sdk-example-storage-use.md) provides a basic illustration of using a client library.\n\nDifferent Azure services also provide examples that use these libraries. See the following index pages for other links:\n\n- [App hosting](../quickstarts-app-hosting.md)\n- [Cognitive Services](../quickstarts-cognitive-services.md)\n- [Data solutions](../quickstarts-data-solutions.md)\n- [Identity and security](../quickstarts-identity-security.md)\n- [Machine learning](../quickstarts-machine-learning.md)\n- [Messaging and IoT](../quickstarts-messaging-iot.md)\n- [Other services](../quickstarts-other-services.md)\n\nFor details on working with each client library, see the *README.md* or *README.rst* file located in the library's project folder in the [SDK's GitHub repository](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk). You can also find more code snippets in the [reference documentation](/python/api) and the [Azure Samples](/samples/browse/?languages=python&products=azure).\n\n## Get help and connect with the SDK team\n\n- Visit the [Azure libraries for Python documentation](https://aka.ms/python-docs)\n- Post questions to the community on [Stack Overflow](https://stackoverflow.com/questions/tagged/azure-sdk-python)\n- Open issues against the SDK on [GitHub](https://github.com/Azure/azure-sdk-for-python/issues)\n- Mention [@AzureSDK](https://twitter.com/AzureSdk/) on Twitter\n- [Complete a short survey about the Azure SDK for Python](https://microsoft.qualtrics.com/jfe/form/SV_bNFX0HECjzPWMiG?Q_CHL=docs)\n\n## Next step\n\nSet up your local development environment so you can easily use any of the Azure libraries for Python.\n\n> [!div class=\"nextstepaction\"]\n> [Set up your local dev environment >>>](../configure-local-development-environment.md)\n"
  },
  {
    "path": "articles/python/sdk/azure-sdk-sovereign-domain.md",
    "content": "---\ntitle: Connect to all regions using Azure libraries for Python multicloud \ndescription: How to use the azure_cloud module of msrestazure to connect to Azure in different sovereign regions\nms.date: 04/23/2025\nms.topic: concept-article\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Multicloud: Connect to all regions with the Azure libraries for Python\n\nYou can use the Azure libraries for Python to connect to all regions where Azure is [available](https://azure.microsoft.com/regions/services).\n\nBy default, the Azure libraries are configured to connect to the global Azure cloud.\n\n## Using pre-defined sovereign cloud constants\n\nPre-defined sovereign cloud constants are provided by the `AzureAuthorityHosts` module of the `azure.identity` library:\n\n- `AZURE_CHINA`\n- `AZURE_GOVERNMENT`\n- `AZURE_PUBLIC_CLOUD`\n\nTo use a definition, import the appropriate constant from `azure.identity.AzureAuthorityHosts` and apply it when creating client objects.\n\nWhen using [`DefaultAzureCredential`](/python/api/azure-identity/azure.identity.defaultazurecredential), as shown in the following example, you can specify the cloud by using the appropriate value from `azure.identity.AzureAuthorityHosts`.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/sovereign_domain/sovereign_cloud.py\":::\n \n> [!NOTE]\n> The `cloud_setting` feature is newly added and is rolling out across Azure SDK management libraries. During this period, some clients support it while others do not. To check support, look for a `cloud_setting` parameter on the client constructor. If your service's client doesn't expose `cloud_setting` yet, you can still target sovereign clouds using the previous approach shown in the examples below.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/sovereign_domain/sovereign_cloud_old.py\":::\n  \n## Using your own cloud definition\n\nIn the following code, replace the values of the `authority`, `endpoint`, and `audience` variables with values appropriate for your private cloud.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/sovereign_domain/private_cloud.py\":::\n\nFor example, for Azure Stack, you can use the [az cloud show](/cli/azure/cloud#az-cloud-show) CLI command to return the details of a registered cloud. The following output shows the values returned for the Azure public cloud, but the output for an Azure Stack private cloud should be similar.\n\n```output\n{\n  \"endpoints\": {\n    \"activeDirectory\": \"https://login.microsoftonline.com\",\n    \"activeDirectoryDataLakeResourceId\": \"https://datalake.azure.net/\",\n    \"activeDirectoryGraphResourceId\": \"https://graph.windows.net/\",\n    \"activeDirectoryResourceId\": \"https://management.core.windows.net/\",\n    \"appInsightsResourceId\": \"https://api.applicationinsights.io\",\n    \"appInsightsTelemetryChannelResourceId\": \"https://dc.applicationinsights.azure.com/v2/track\",\n    \"attestationResourceId\": \"https://attest.azure.net\",\n    \"azmirrorStorageAccountResourceId\": null,\n    \"batchResourceId\": \"https://batch.core.windows.net/\",\n    \"gallery\": \"https://gallery.azure.com/\",\n    \"logAnalyticsResourceId\": \"https://api.loganalytics.io\",\n    \"management\": \"https://management.core.windows.net/\",\n    \"mediaResourceId\": \"https://rest.media.azure.net\",\n    \"microsoftGraphResourceId\": \"https://graph.microsoft.com/\",\n    \"ossrdbmsResourceId\": \"https://ossrdbms-aad.database.windows.net\",\n    \"portal\": \"https://portal.azure.com\",\n    \"resourceManager\": \"https://management.azure.com/\",\n    \"sqlManagement\": \"https://management.core.windows.net:8443/\",\n    \"synapseAnalyticsResourceId\": \"https://dev.azuresynapse.net\",\n    \"vmImageAliasDoc\": \"https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/arm-compute/quickstart-templates/aliases.json\"\n  },\n  \"isActive\": true,\n  \"name\": \"AzureCloud\",\n  \"profile\": \"latest\",\n  \"suffixes\": {\n    \"acrLoginServerEndpoint\": \".azurecr.io\",\n    \"attestationEndpoint\": \".attest.azure.net\",\n    \"azureDatalakeAnalyticsCatalogAndJobEndpoint\": \"azuredatalakeanalytics.net\",\n    \"azureDatalakeStoreFileSystemEndpoint\": \"azuredatalakestore.net\",\n    \"keyvaultDns\": \".vault.azure.net\",\n    \"mariadbServerEndpoint\": \".mariadb.database.azure.com\",\n    \"mhsmDns\": \".managedhsm.azure.net\",\n    \"mysqlServerEndpoint\": \".mysql.database.azure.com\",\n    \"postgresqlServerEndpoint\": \".postgres.database.azure.com\",\n    \"sqlServerHostname\": \".database.windows.net\",\n    \"storageEndpoint\": \"core.windows.net\",\n    \"storageSyncEndpoint\": \"afs.azure.net\",\n    \"synapseAnalyticsEndpoint\": \".dev.azuresynapse.net\"\n  }\n}\n\n```\n\nIn the preceding code, you can set `authority` to the value of the `endpoints.activeDirectory` property, `endpoint` to the value of the `endpoints.resourceManager` property, and `audience` to the value of `endpoints.activeDirectoryResourceId` property +  \".default\".\n\nFor more information, see [Use Azure CLI with Azure Stack Hub](/azure-stack/user/azure-stack-version-profiles-azurecli2) and [Get authentication information for Azure Stack Hub](/azure-stack/user/authenticate-azure-stack-hub).\n"
  },
  {
    "path": "articles/python/sdk/examples/azure-sdk-example-database.md",
    "content": "---\ntitle: Create an Azure Database for MySQL - Flexible Server instance and database using the Azure SDK libraries\ndescription: Use the management libraries in the Azure SDK libraries for Python to create an Azure Database for MySQL or Azure Database for PostgreSQL database.\nms.date: 05/21/2025\nms.topic: how-to\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Example: Use the Azure libraries to create a database\n\nThis example demonstrates how to use the Azure SDK for Python management libraries to programmatically create an Azure Database for MySQL flexible server and a corresponding database. It also includes a basic script that uses the mysql-connector-python library (not part of the Azure SDK) to connect to and query the database.\n\nYou can adapt this example to create an Azure Database for PostgreSQL flexible server by modifying the relevant SDK imports and API calls.\n\nIf you prefer to use the Azure CLI, [Equivalent Azure CLI commands](#for-reference-equivalent-azure-cli-commands) are provided later in this article. For a graphical experience, refer to the Azure portal documentation:\n\n* [Create a MySQL server](/azure/mysql/flexible-server/quickstart-create-server-portal)\n* [Create a PostgreSQL server](/azure/postgresql/flexible-server/quickstart-create-server-portal)\n* [Create a DocumentDB (with MongoDB compatibility) cluster](/azure/documentdb/quickstart-portal)\n\nUnless otherwise specified, all examples and commands work consistently across Linux/macOS bash and Windows command shells.\n\n## 1: Set up your local development environment\n\nIf you haven't already, set up an environment where you can run the code. Here are some options:\n\n[!INCLUDE [create_environment_options](../../includes/create-environment-options.md)]\n\n## 2: Install the needed Azure library packages\n\nIn this step, you install the Azure SDK libraries needed to create the database.\n\n1. In your console, create a *requirements.txt* file that lists the management libraries used in this example:\n\n    ```azurecli\n    azure-mgmt-resource\n    azure-mgmt-rdbms\n    azure-identity\n    mysql-connector-python\n    ```\n\n    > [!NOTE]\n    > The `mysql-connector-python` library isn't part of the Azure SDK. It's a third-party library that you can use to connect to MySQL databases. You can also use other libraries, such as `PyMySQL` or `SQLAlchemy`, to connect to MySQL databases.\n\n1. In your console with the virtual environment activated, install the requirements:\n\n    ```console\n    pip install -r requirements.txt\n    ```\n\n    > [!NOTE]\n    > On Windows, attempting to install the mysql library into a 32-bit Python library produces an error about the *mysql.h* file. In this case, install a 64-bit version of Python and try again.\n\n## 3. Set environment variables\n\nIn this step, you set environment variables for use in the code in this article. The code uses the `os.environ` method to retrieve the values.\n\n# [Bash](#tab/bash)\n\n```azurecli\n#!/bin/bash\nexport AZURE_RESOURCE_GROUP_NAME=<ResourceGroupName> # Change to your preferred resource group name\nexport LOCATION=<Location> # Change to your preferred region\nexport AZURE_SUBSCRIPTION_ID=$(az account show --query id --output tsv)\nexport PUBLIC_IP_ADDRESS=$(curl -s https://api.ipify.org)\nexport DB_SERVER_NAME=<DB_Server_Name> # Change to your preferred DB server name\nexport DB_ADMIN_NAME=<DB_Admin_Name> # Change to your preferred admin name\nexport DB_ADMIN_PASSWORD=<DB_Admin_Passwrod> # Change to your preferred admin password\nexport DB_NAME=<DB_Name> # Change to your preferred database name\nexport DB_PORT=3306\nexport version=ServerVersion.EIGHT0_21\n\n```\n\n# [PowerShell](#tab/powershell)\n\n```azurecli\n# PowerShell syntax\n$random = Get-Random -Maximum 10000\n$env:AZURE_RESOURCE_GROUP_NAME = <ResourceGroupName> # Change to your preferred resource group name\n$env:LOCATION = <Location> # Change to your preferred region\n$env:AZURE_SUBSCRIPTION_ID = $(az account show --query id --output tsv)\n$env:PUBLIC_IP_ADDRESS = (Invoke-RestMethod -Uri \"https://api.ipify.org\")\n$env:DB_SERVER_NAME = <DB_Server_Name> # Change to your preferred DB server name\n$env:DB_ADMIN_NAME = <DB_Admin_Name> # Change to your preferred admin name\n$env:DB_ADMIN_PASSWORD = <DB_Admin_Password> # Change to your preferred admin password\n$env:DB_NAME = <DB_Name> # Change to your preferred database name\n$env:DB_PORT = 3306\n$env:version = \"ServerVersion.EIGHT0_21\"\n```\n\n---\n\n## 4: Write code to create and configure a MySQL Flexible Server with a database\n\nIn this step, you create a Python file named *provision_blob.py* with the following code. This Python script uses the Azure SDK for Python management libraries to create a resource group, a MySQL flexible server, and a database on that server.\n\n```Python\nimport random, os\nfrom azure.identity import DefaultAzureCredential\nfrom azure.mgmt.resource import ResourceManagementClient\nfrom azure.mgmt.rdbms.mysql_flexibleservers import MySQLManagementClient\nfrom azure.mgmt.rdbms.mysql_flexibleservers.models import Server, ServerVersion\n\n# Acquire a credential object using CLI-based authentication.\ncredential = DefaultAzureCredential()\n\n# Retrieve subscription ID from environment variable\nsubscription_id = os.environ[\"AZURE_SUBSCRIPTION_ID\"]\n\n# Retrieve resource group name and location from environment variables\nRESOURCE_GROUP_NAME = os.environ[\"AZURE_RESOURCE_GROUP_NAME\"]\nLOCATION = os.environ[\"LOCATION\"]\n\n# Step 1: Provision the resource group.\nresource_client = ResourceManagementClient(credential, subscription_id)\n\nrg_result = resource_client.resource_groups.create_or_update(RESOURCE_GROUP_NAME,\n    { \"location\": LOCATION })\n\nprint(f\"Provisioned resource group {rg_result.name}\")\n\n# For details on the previous code, see Example: Provision a resource group\n# at https://docs.microsoft.com/azure/developer/python/azure-sdk-example-resource-group\n\n\n# Step 2: Provision the database server\n\n# Retrieve server name, admin name, and admin password from environment variables\n\ndb_server_name = os.environ.get(\"DB_SERVER_NAME\")\ndb_admin_name = os.environ.get(\"DB_ADMIN_NAME\")\ndb_admin_password = os.environ.get(\"DB_ADMIN_PASSWORD\")\n\n# Obtain the management client object\nmysql_client = MySQLManagementClient(credential, subscription_id)\n\n# Provision the server and wait for the result\nserver_version = os.environ.get(\"DB_SERVER_VERSION\") \n\npoller = mysql_client.servers.begin_create(RESOURCE_GROUP_NAME,\n    db_server_name, \n    Server(\n        location=LOCATION,\n        administrator_login=db_admin_name,\n        administrator_login_password=db_admin_password,\n        version=ServerVersion[server_version]  # Note: dictionary-style enum access\n    )\n)\n\nserver = poller.result()\n\nprint(f\"Provisioned MySQL server {server.name}\")\n\n# Step 3: Provision a firewall rule to allow the local workstation to connect\n\nRULE_NAME = \"allow_ip\"\nip_address = os.environ[\"PUBLIC_IP_ADDRESS\"]\n\n# Provision the rule and wait for completion\npoller = mysql_client.firewall_rules.begin_create_or_update(RESOURCE_GROUP_NAME,\n    db_server_name, RULE_NAME, \n    { \"start_ip_address\": ip_address, \"end_ip_address\": ip_address }  \n)\n\nfirewall_rule = poller.result()\n\nprint(f\"Provisioned firewall rule {firewall_rule.name}\")\n\n\n# Step 4: Provision a database on the server\n\ndb_name = os.environ.get(\"DB_NAME\", \"example-db1\")\n \npoller = mysql_client.databases.begin_create_or_update(RESOURCE_GROUP_NAME,\n    db_server_name, db_name, {})\n\ndb_result = poller.result()\n\nprint(f\"Provisioned MySQL database {db_result.name} with ID {db_result.id}\")\n```\n\n### Authentication in the code\n\nLater in this article, you sign in to Azure using the Azure CLI to execute the sample code. If your account has sufficient permissions to create resource groups and storage resources in your Azure subscription, the script should run successfully without additional configuration.\n\nFor use in production environments, we recommend that you authenticate with a service principal by setting the appropriate environment variables. This approach enables secure, non-interactive access suitable for automation. For setup instructions, see [How to authenticate Python apps with Azure services](../authentication-overview.md).\n\nEnsure the service principal is assigned a role with adequate permissions—such as the Contributor role at the subscription or resource group level. For details on assigning roles, refer to [Role-based access control (RBAC) in Azure](/azure/role-based-access-control/overview).\n\n### Reference links for classes used in the code\n\n* [ResourceManagementClient (azure.mgmt.resource)](/python/api/azure-mgmt-resource/azure.mgmt.resource.resourcemanagementclient)\n* [MySQLManagementClient (azure.mgmt.rdbms.mysql_flexibleservers)](/python/api/azure-mgmt-rdbms/azure.mgmt.rdbms.mysql_flexibleservers.mysqlmanagementclient)\n* [Server (azure.mgmt.rdbms.mysql_flexibleservers.models)](/python/api/azure-mgmt-rdbms/azure.mgmt.rdbms.mysql_flexibleservers.models.server)\n* [ServerVersion (azure.mgmt.rdbms.mysql_flexibleservers.models)](/python/api/azure-mgmt-rdbms/azure.mgmt.rdbms.mysql_flexibleservers.models.serverversion)\n\nFor PostreSQL database server, see:\n\n* [PostgreSQLManagementClient (azure.mgmt.rdbms.postgresql_flexibleservers)](/python/api/azure-mgmt-rdbms/azure.mgmt.rdbms.postgresql_flexibleservers.postgresqlmanagementclient)\n\n## 5: Run the script\n\n1. If you haven't already, sign in to Azure using the Azure CLI:\n\n    ```azurecli\n    az login\n    ```\n\n1. Run the script:\n\n    ```console\n    python provision_db.py\n    ```\n\n    The script takes a minute or two to complete.\n\n## 6: Insert a record and query the database\n\nIn this step, you create a table in the database and insert a record. You can use the mysql-connector library to connect to the database and run SQL commands.\n\n1. Create a file named *use_db.py* with the following code.\n\n    This code works only for MySQL; you use different libraries for PostgreSQL.\n\n    ```Python\n    import os\n    import mysql.connector\n    \n    db_server_name = os.environ[\"DB_SERVER_NAME\"]\n    db_admin_name = os.getenv(\"DB_ADMIN_NAME\")\n    db_admin_password = os.getenv(\"DB_ADMIN_PASSWORD\")\n    \n    db_name = os.getenv(\"DB_NAME\")\n    db_port = os.getenv(\"DB_PORT\")\n    \n    connection = mysql.connector.connect(user=db_admin_name,\n        password=db_admin_password, host=f\"{db_server_name}.mysql.database.azure.com\",\n        port=db_port, database=db_name, ssl_ca='./BaltimoreCyberTrustRoot.crt.pem')\n    \n    cursor = connection.cursor()\n    \n    \"\"\"\n    # Alternate pyodbc connection; include pyodbc in requirements.txt\n    import pyodbc\n    \n    driver = \"{MySQL ODBC 5.3 UNICODE Driver}\"\n    \n    connect_string = f\"DRIVER={driver};PORT=3306;SERVER={db_server_name}.mysql.database.azure.com;\" \\\n                     f\"DATABASE={DB_NAME};UID={db_admin_name};PWD={db_admin_password}\"\n    \n    connection = pyodbc.connect(connect_string)\n    \"\"\"\n    \n    table_name = \"ExampleTable1\"\n    \n    sql_create = f\"CREATE TABLE {table_name} (name varchar(255), code int)\"\n    \n    cursor.execute(sql_create)\n    print(f\"Successfully created table {table_name}\")\n    \n    sql_insert = f\"INSERT INTO {table_name} (name, code) VALUES ('Azure', 1)\"\n    insert_data = \"('Azure', 1)\"\n    \n    cursor.execute(sql_insert)\n    print(\"Successfully inserted data into table\")\n    \n    sql_select_values= f\"SELECT * FROM {table_name}\"\n    \n    cursor.execute(sql_select_values)\n    row = cursor.fetchone()\n    \n    while row:\n        print(str(row[0]) + \" \" + str(row[1]))\n        row = cursor.fetchone()\n    \n    connection.commit()\n    ```\n\n    All of this code uses the mysql.connector API. The only Azure-specific part is the full host domain for MySQL server (mysql.database.azure.com).\n\n1. Next, download the certificate needed to communicate over TSL/SSL with your Azure Database for MySQL server. For more information, see [Obtain an SSL Certificate](/azure/mysql/howto-configure-ssl#step-1-obtain-ssl-certificate) in the Azure Database for MySQL documentation.\n\n    # [Bash](#tab/bash)\n\n    ```azurecli\n    #!/bin/bash\n    # Download Baltimore CyberTrust Root certificate required for Azure MySQL SSL connections\n    CERT_URL=\"https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem\"\n    CERT_FILE=\"BaltimoreCyberTrustRoot.crt.pem\"\n    echo \"Downloading SSL certificate...\"\n    curl -o \"$CERT_FILE\" \"$CERT_URL\"\n    ```\n\n    # [PowerShell](#tab/powershell)\n\n    ```azurecli\n    # PowerShell syntax\n    # Download Baltimore CyberTrust Root certificate required for Azure MySQL SSL connections\n    $CERT_URL=\"https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem\"\n    $CERT_FILE=\"BaltimoreCyberTrustRoot.crt.pem\"\n    echo \"Downloading SSL certificate...\"\n    Invoke-WebRequest -Uri $CERT_URL -OutFile $CERT_FILE\n    ```\n\n    ---\n\n1. Finally, run the code:\n\n    ```console\n    python use_db.py\n    ```\n\nIf you see an error that your client IP address isn't allowed, check that you defined the environment variable `PUBLIC_IP_ADDRESS` correctly. If you already created the MySQL server with the wrong IP address, you can add another in the [Azure portal](https://portal.azure.com/). In the portal, select the MySQL server, and then select **Connection security**. Add the IP address of your workstation to the list of allowed IP addresses.\n\n## 7: Clean up resources\n\n Run the [az group delete](/cli/azure/group#az-group-delete) command if you don't need to keep the resource group and storage resources created in this example.\n\nResource groups don't incur any ongoing charges in your subscription, but resources, like storage accounts, in the resource group might continue to incur charges. It's a good practice to clean up any group that you aren't actively using. The `--no-wait` argument allows the command to return immediately instead of waiting for the operation to finish.\n\n# [Bash](#tab/bash)\n\n```azurecli\n#!/bin/bash\naz group delete -n $AZURE_RESOURCE_GROUP_NAME --no-wait\n```\n\n# [PowerShell](#tab/powershell)\n\n```azurecli\n# PowerShell syntax\naz group delete -n $env:AZURE_RESOURCE_GROUP_NAME --no-wait\n```\n\n---\n\n[!INCLUDE [resource_group_begin_delete](../../includes/resource-group-begin-delete.md)]\n\n### For reference: equivalent Azure CLI commands\n\nThe following Azure CLI commands complete the same provisioning steps as the Python script. For a PostgreSQL database, use [`az postgres flexible-server`](/cli/azure/postgres/flexible-server) commands.\n\n# [Bash](#tab/bash)\n\n```azurecli\n#!/bin/bash\n#!/bin/bash\n\n# Set variables\nexport LOCATION=<Location> # Change to your preferred region\nexport AZURE_RESOURCE_GROUP_NAME=<ResourceGroupName> # Change to your preferred resource group name\nexport DB_SERVER_NAME=<DB_Server_Name> # Change to your preferred DB server name\nexport DB_ADMIN_NAME=<DB_Admin_Name> # Change to your preferred admin name\nexport DB_ADMIN_PASSWORD=<DB_Admin_Password> # Change to your preferred admin password\nexport DB_NAME=<DB_Name> # Change to your preferred database name\nexport DB_SERVER_VERSION=\"5.7\"\n\n# Get public IP address\nexport PUBLIC_IP_ADDRESS=$(curl -s https://api.ipify.org)\n\n# Provision the resource group\necho \"Creating resource group: $AZURE_RESOURCE_GROUP_NAME\"\naz group create \\\n    --location \"$LOCATION\" \\\n    --name \"$AZURE_RESOURCE_GROUP_NAME\"\n\n# Provision the MySQL Flexible Server\necho \"Creating MySQL Flexible Server: $DB_SERVER_NAME\"\naz mysql flexible-server create \\\n    --location \"$LOCATION\" \\\n    --resource-group \"$AZURE_RESOURCE_GROUP_NAME\" \\\n    --name \"$DB_SERVER_NAME\" \\\n    --admin-user \"$DB_ADMIN_NAME\" \\\n    --admin-password \"$DB_ADMIN_PASSWORD\" \\\n    --sku-name Standard_B1ms \\\n    --version \"$DB_SERVER_VERSION\" \\\n    --yes\n\n# Provision a firewall rule to allow access from the public IP address\necho \"Creating firewall rule for public IP: $PUBLIC_IP_ADDRESS\"\naz mysql flexible-server firewall-rule create \\\n    --resource-group \"$AZURE_RESOURCE_GROUP_NAME\" \\\n    --name \"$DB_SERVER_NAME\" \\\n    --rule-name allow_ip \\\n    --start-ip-address \"$PUBLIC_IP_ADDRESS\" \\\n    --end-ip-address \"$PUBLIC_IP_ADDRESS\"\n\n# Provision the database\necho \"Creating database: $DB_NAME\"\naz mysql flexible-server db create \\\n    --resource-group \"$AZURE_RESOURCE_GROUP_NAME\" \\\n    --server-name \"$DB_SERVER_NAME\" \\\n    --database-name \"$DB_NAME\"\n\necho \"MySQL Flexible Server and database created successfully.\"\n\n```\n\n# [PowerShell](#tab/powershell)\n\n```azurecli\n# PowerShell syntax\n# Define variables\n$env:LOCATION = <Location> # Change to your preferred region\n$env:AZURE_RESOURCE_GROUP_NAME = <ResourceGroupName> # Change to your preferred resource group name\n$env:DB_SERVER_NAME = <DB_Server_Name> # Change to your preferred DB server name\n$env:DB_ADMIN_NAME = <DB_Admin_Name> # Change to your preferred admin name\n$env:DB_ADMIN_PASSWORD = <DB_Admin_Password> # Change to your preferred admin password\n$env:DB_NAME = <DB_Name> # Change to your preferred database name\n$env:DB_SERVER_VERSION = \"5.7\"\n\n# Get your public IP\n$env:PUBLIC_IP_ADDRESS = (Invoke-RestMethod -Uri \"https://api.ipify.org\")\n\n# Create resource group\naz group create `\n    --location $env:LOCATION `\n    --name $env:AZURE_RESOURCE_GROUP_NAME\n\n# Create MySQL Flexible Server\naz mysql flexible-server create `\n    --location $env:LOCATION `\n    --resource-group $env:AZURE_RESOURCE_GROUP_NAME `\n    --name $env:DB_SERVER_NAME `\n    --admin-user $env:DB_ADMIN_NAME `\n    --admin-password $env:DB_ADMIN_PASSWORD `\n    --sku-name Standard_B1ms `\n    --version $env:DB_SERVER_VERSION `\n    --yes\n\n# Create firewall rule to allow your current IP\naz mysql flexible-server firewall-rule create `\n    --resource-group $env:AZURE_RESOURCE_GROUP_NAME `\n    --name $env:DB_SERVER_NAME `\n    --rule-name allow_ip `\n    --start-ip-address $env:PUBLIC_IP_ADDRESS `\n    --end-ip-address $env:PUBLIC_IP_ADDRESS\n\n# Create database\naz mysql flexible-server db create `\n    --resource-group $env:AZURE_RESOURCE_GROUP_NAME `\n    --server-name $env:DB_SERVER_NAME `\n    --database-name $env:DB_NAME\n\n```\n\n---\n\n## See also\n\n* [Example: Create a resource group](azure-sdk-example-resource-group.md)\n* [Example: List resource groups in a subscription](azure-sdk-example-list-resource-groups.md)\n* [Example: Create Azure Storage](azure-sdk-example-storage.md)\n* [Example: Use Azure Storage](azure-sdk-example-storage-use.md)\n* [Example: Create and deploy a web app](azure-sdk-example-web-app.md)\n* [Example: Create a virtual machine](azure-sdk-example-virtual-machines.md)\n* [Use Azure Managed Disks with virtual machines](azure-sdk-samples-managed-disks.md)\n* [Complete a short survey about the Azure SDK for Python](https://microsoft.qualtrics.com/jfe/form/SV_bNFX0HECjzPWMiG?Q_CHL=docs)\n"
  },
  {
    "path": "articles/python/sdk/examples/azure-sdk-example-list-resource-groups.md",
    "content": "---\ntitle: List resource groups and resources using the Azure libraries for Python\ndescription: Use the resource management library in the Azure SDK for Python to list resource groups and resources in a group.\nms.date: 04/23/2025\nms.topic: how-to\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Example: Use the Azure libraries to list resource groups and resources\n\nThis example demonstrates how to use the Azure SDK management libraries in a Python script to perform two tasks:\n\n- List all the resource groups in an Azure subscription.\n- List resources within a specific resource group.\n\nAll the commands in this article work the same in Linux/macOS bash and Windows command shells unless noted.\n\nThe [Equivalent Azure CLI commands](#for-reference-equivalent-azure-cli-commands) are listed later in this article.\n\n## 1: Set up your local development environment\n\nIf you haven't already, set up an environment where you can run this code. Here are some options:\n\n* Configure a Python virtual environment using `venv` or your tool of choice. To start using the virtual environment, be sure to activate it. To install python, see [Install Python](https://www.python.org/downloads/).\n\n### [Bash](#tab/bash)\n\n```azurecli-interactive\n#!/bin/bash\n# Create a virtual environment\npython -m venv .venv\n# Activate the virtual environment\nsource .venv/Scripts/activate # only required for Windows (Git Bash)\n```\n\n### [PowerShell](#tab/powershell)\n\n```powershell-interactive\n# Create a virtual environment\npython -m venv venv\n# Activate the virtual environment\n. .\\venv\\Scripts\\Activate.ps1\n```\n\n---\n\n* Use a [conda environment](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html). To install Conda, see [Install Miniconda](https://docs.conda.io/en/latest/miniconda.html).\n\n* Use a [Dev Container](https://containers.dev/) in [Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) or [GitHub Codespaces](https://docs.github.com/en/codespaces/overview).\n\n## 2: Install the Azure library packages\n\nCreate a file named *requirements.txt* with the following contents:\n\n:::code language=\"txt\" source=\"~/../python-sdk-docs-examples/resource_group/requirements.txt\":::\n\nIn a terminal or command prompt with the virtual environment activated, install the requirements:\n\n```console\npip install -r requirements.txt\n```\n\n## 3: Write code to work with resource groups\n\n### 3a. List resource groups in a subscription\n\nCreate a Python file named *list_groups.py* with the following code. The comments explain the details:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/resource_group/list_groups.py\":::\n\n### 3b. List resources within a specific resource group\n\nCreate a Python file named *list_resources.py* with the following code. The comments explain the details.\n\nBy default, the code lists resources in \"myResourceGroup\". To use a different resource group, set the `RESOURCE_GROUP_NAME` environment variable to the desired group name.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/resource_group/list_resources.py\":::\n\n### Authentication in the code\n\nLater in this article, you sign in to Azure with the Azure CLI to run the sample code. If your account has permissions to create and list resource groups in your Azure subscription, the code will run successfully.\n\nTo use such code in a production script, you can set environment variables to use a service principal-based method for authentication. To learn more, see [How to authenticate Python apps with Azure services](../authentication-overview.md). You need to ensure that the service principal has sufficient permissions to create and list resource groups in your subscription by assigning it an appropriate [role in Azure](/azure/role-based-access-control/overview); for example, the *Contributor* role on your subscription.\n\n### Reference links for classes used in the code\n\n- [DefaultAzureCredential (azure.identity)](/python/api/azure-identity/azure.identity.defaultazurecredential)\n- [ResourceManagementClient (azure.mgmt.resource)](/python/api/azure-mgmt-resource/azure.mgmt.resource.resourcemanagementclient)\n\n## 4: Run the scripts\n\n1. If you haven't already, sign in to Azure using the Azure CLI:\n\n    ```azurecli\n    az login\n    ```\n\n1. Set the `AZURE_SUBSCRIPTION_ID` environment variable to your subscription ID. (You can run the [az account show](/cli/azure/account#az-account-show) command and get your subscription ID from the `id` property in the output):\n\n    # [Bash](#tab/bash)\n\n    ```bash\n    export AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000\n    ```\n\n    # [Powershell](#tab/powershell)\n\n    ```powershell\n    $env:AZURE_SUBSCRIPTION_ID=\"00000000-0000-0000-0000-000000000000\"\n    ```\n\n    ---\n\n1. List all resources groups in the subscription:\n\n    ```console\n    python list_groups.py\n    ```\n\n1. List all resources in a resource group:\n\n    ```console\n    python list_resources.py\n    ```\n\n    By default, the code lists resources in \"myResourceGroup\". To use a different resource group, set the `RESOURCE_GROUP_NAME` environment variable to the desired group name.\n\n### For reference: equivalent Azure CLI commands\n\nThe following Azure CLI command lists resource groups in a subscription:\n\n```azurecli\naz group list\n```\n\nThe following command lists resources within the \"myResourceGroup\" in the centralus region (the `location` argument is necessary to identify a specific data center):\n\n```azurecli\naz resource list --resource-group myResourceGroup --location centralus\n```\n\n## See also\n\n- [Example: Provision a resource group](azure-sdk-example-resource-group.md)\n- [Example: Provision Azure Storage](azure-sdk-example-storage.md)\n- [Example: Use Azure Storage](azure-sdk-example-storage-use.md)\n- [Example: Provision a web app and deploy code](azure-sdk-example-web-app.md)\n- [Example: Provision and query a database](azure-sdk-example-database.md)\n- [Example: Provision a virtual machine](azure-sdk-example-virtual-machines.md)\n- [Use Azure Managed Disks with virtual machines](azure-sdk-samples-managed-disks.md)\n- [Complete a short survey about the Azure SDK for Python](https://microsoft.qualtrics.com/jfe/form/SV_bNFX0HECjzPWMiG?Q_CHL=docs)\n"
  },
  {
    "path": "articles/python/sdk/examples/azure-sdk-example-resource-group.md",
    "content": "---\ntitle: Create a resource group using the Azure libraries for Python\ndescription: Use the resource management library in the Azure SDK for Python to create a resource group from Python code.\nms.date: 05/29/2025\nms.topic: how-to\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Example: Use the Azure libraries to create a resource group\n\nThis example demonstrates how to use the Azure SDK management libraries in a Python script to create a resource group. (The [Equivalent Azure CLI command](#for-reference-equivalent-azure-cli-command) is given later in this article. If you prefer to use the Azure portal, see [Create resource groups](/azure/azure-resource-manager/management/manage-resource-groups-portal).)\n\nAll the commands in this article work the same in Linux/macOS bash and Windows command shells unless noted.\n\n## 1: Set up your local development environment\n\nIf you haven't already, set up an environment where you can run this code. Here are some options:\n\n[!INCLUDE [create_environment_options](../../includes/create-environment-options.md)]\n\n## 2: Install the Azure library packages\n\n1. In your console, create a *requirements.txt* file that lists the management libraries used in this example:\n\n    ```azurecli\n    azure-mgmt-resource\n    azure-identity\n    ```\n\n1. In your console with the virtual environment activated, install the requirements:\n\n    ```console\n    pip install -r requirements.txt\n    ```\n\n## 3. Set environment variables\n\nIn this step, you set environment variables for use in the code in this article. The code uses the `os.environ` method to retrieve the values.\n\n# [Bash](#tab/bash)\n\n```azurecli\n#!/bin/bash\nexport AZURE_RESOURCE_GROUP_NAME=<ResourceGroupName> # Change to your preferred resource group name\nexport LOCATION=<Location> # Change to your preferred region\nexport AZURE_SUBSCRIPTION_ID=$(az account show --query id --output tsv)\n```\n\n# [PowerShell](#tab/powershell)\n\n```azurecli\n# PowerShell syntax\n$env:AZURE_RESOURCE_GROUP_NAME = <ResourceGroupName> # Change to your preferred resource group name\n$env:LOCATION = <Location> # Change to your preferred region\n$env:AZURE_SUBSCRIPTION_ID = $(az account show --query id --output tsv)\n```\n\n---\n\n## 4: Write code to create a resource group\n\nIn this step, you create a Python file named *provision_blob.py* with the following code. This Python script uses the Azure SDK for Python management libraries to create a resource group in your Azure subscription.\n\nCreate a Python file named *provision_rg.py* with the following code. The comments explain the details:\n\n```Python\n# Import the needed credential and management objects from the libraries.\nimport os\n\nfrom azure.identity import DefaultAzureCredential\nfrom azure.mgmt.resource import ResourceManagementClient\n\n# Acquire a credential object using DevaultAzureCredential.\ncredential = DefaultAzureCredential()\n\n# Retrieve subscription ID from environment variable.\nsubscription_id = os.environ[\"AZURE_SUBSCRIPTION_ID\"]\n\n# Retrieve resource group name and location from environment variables\nRESOURCE_GROUP_NAME = os.environ[\"AZURE_RESOURCE_GROUP_NAME\"]\nLOCATION = os.environ[\"LOCATION\"]\n\n# Obtain the management object for resources.\nresource_client = ResourceManagementClient(credential, subscription_id)\n\n# Provision the resource group.\nrg_result = resource_client.resource_groups.create_or_update(RESOURCE_GROUP_NAME,\n    { \"location\": LOCATION })\n\nprint(f\"Provisioned resource group {rg_result.name}\")\n\n# Within the ResourceManagementClient is an object named resource_groups,\n# which is of class ResourceGroupsOperations, which contains methods like\n# create_or_update.\n#\n# The second parameter to create_or_update here is technically a ResourceGroup\n# object. You can create the object directly using ResourceGroup(location=\n# LOCATION) or you can express the object as inline JSON as shown here. For\n# details, see Inline JSON pattern for object arguments at\n# https://learn.microsoft.com/azure/developer/python/sdk\n# /azure-sdk-library-usage-patterns#inline-json-pattern-for-object-arguments\n\nprint(\n    f\"Provisioned resource group {rg_result.name} in the {rg_result.location} region\"\n)\n\n# The return value is another ResourceGroup object with all the details of the\n# new group. In this case the call is synchronous: the resource group has been\n# provisioned by the time the call returns.\n\n# To update the resource group, repeat the call with different properties, such\n# as tags:\nrg_result = resource_client.resource_groups.create_or_update(\n    RESOURCE_GROUP_NAME,\n    {\n        \"location\": LOCATION,\n        \"tags\": {\"environment\": \"test\", \"department\": \"tech\"},\n    },\n)\n\nprint(f\"Updated resource group {rg_result.name} with tags\")\n\n# Optional lines to delete the resource group. begin_delete is asynchronous.\n# poller = resource_client.resource_groups.begin_delete(rg_result.name)\n# result = poller.result()\n```\n\n### Authentication in the code\n\nLater in this article, you sign in to Azure using the Azure CLI to execute the sample code. If your account has sufficient permissions to create resource groups and storage resources in your Azure subscription, the script should run successfully without additional configuration.\n\nTo use this code in a production environment, authenticate using a service principal by setting environment variables. This approach enables secure, automated access without relying on interactive login. For detailed guidance, see [How to authenticate Python apps with Azure services](../authentication-overview.md).\n\nEnsure that the service principal is assigned a role with sufficient permissions to create resource groups and storage accounts. For example, assigning the Contributor role at the subscription level provides the necessary access. To learn more about role assignments, see [Role-based access control (RBAC) in Azure](/azure/role-based-access-control/overview).\n\n### Reference links for classes used in the code\n\n- [DefaultAzureCredential (azure.identity)](/python/api/azure-identity/azure.identity.defaultazurecredential)\n- [ResourceManagementClient (azure.mgmt.resource)](/python/api/azure-mgmt-resource/azure.mgmt.resource.resourcemanagementclient)\n\n## 5: Run the script\n\n1. If you haven't already, sign in to Azure using the Azure CLI:\n\n    ```azurecli\n    az login\n    ```\n\n1. Run the script:\n\n    ```cmd\n    python provision_rg.py\n    ```\n\n## 6: Verify the resource group\n\nYou can verify that the resource group exists through the Azure portal or the Azure CLI.\n\n- Azure portal: open the [Azure portal](https://portal.azure.com), select **Resource groups**, and check that the group is listed. If necessary, use the **Refresh** command to update the list.\n\n- Azure CLI: use the [az group show](/cli/azure/group#az-group-show) command:\n\n    # [Bash](#tab/bash)\n\n    ```azurecli\n    #!/bin/bash\n    az group show -n $AZURE_RESOURCE_GROUP_NAME\n    ```\n\n    # [PowerShell](#tab/powershell)\n\n    ```azurecli\n    # PowerShell syntax\n    az group show -n $env:AZURE_RESOURCE_GROUP_NAME\n    ```\n\n    ---\n\n## 7: Clean up resources\n\nRun the [az group delete](/cli/azure/group#az-group-delete) command if you don't need to keep the resource group created in this example. Resource groups don't incur any ongoing charges in your subscription, but resources in the resource group might continue to incur charges. It's a good practice to clean up any group that you aren't actively using. The `--no-wait` argument allows the command to return immediately instead of waiting for the operation to finish.\n\n# [Bash](#tab/bash)\n\n```azurecli\n#!/bin/bash\naz group delete -n $AZURE_RESOURCE_GROUP_NAME --no-wait\n```\n\n# [PowerShell](#tab/powershell)\n\n```azurecli\n# PowerShell syntax\naz group delete -n $env:AZURE_RESOURCE_GROUP_NAME --no-wait\n```\n\n---\n\nYou can also use the [`ResourceManagementClient.resource_groups.begin_delete`](/python/api/azure-mgmt-resource/azure.mgmt.resource.resources.operations.resourcegroupsoperations#azure-mgmt-resource-resources-operations-resourcegroupsoperations-begin-delete) method to delete a resource group from code. The commented code at the bottom of the script in this article demonstrates the usage.\n\n### For reference: equivalent Azure CLI command\n\nThe following Azure CLI [az group create](/cli/azure/group#az-group-create) command creates a resource group with tags just like the Python script:\n\n:::code language=\"azurecli\" source=\"~/../python-sdk-docs-examples/resource_group/provision.cmd\":::\n\n## See also\n\n- [Example: List resource groups in a subscription](azure-sdk-example-list-resource-groups.md)\n- [Example: Create Azure Storage](azure-sdk-example-storage.md)\n- [Example: Use Azure Storage](azure-sdk-example-storage-use.md)\n- [Example: Create a web app and deploy code](azure-sdk-example-web-app.md)\n- [Example: Create and query a database](azure-sdk-example-database.md)\n- [Example: Create a virtual machine](azure-sdk-example-virtual-machines.md)\n- [Use Azure Managed Disks with virtual machines](azure-sdk-samples-managed-disks.md)\n- [Complete a short survey about the Azure SDK for Python](https://microsoft.qualtrics.com/jfe/form/SV_bNFX0HECjzPWMiG?Q_CHL=docs)\n"
  },
  {
    "path": "articles/python/sdk/examples/azure-sdk-example-storage-use.md",
    "content": "---\ntitle: Use Azure Storage with the Azure SDK for Python\ndescription: Use the Azure SDK for Python libraries to access an existing blob container in an Azure Storage account and then upload a file to that container.\nms.date: 09/22/2025\nms.topic: how-to\nms.custom: devx-track-python, devx-track-azurecli, py-fresh-zinc\n---\n\n# Example: Access Azure Storage using the Azure libraries for Python\n\nIn this article, you learn how to use the Azure client libraries in Python application code to upload a file to an Azure Blob storage container. The article assumes you created the resources shown in [Example: Create Azure Storage](azure-sdk-example-storage.md).\n\nAll the commands in this article work the same in Linux/macOS bash and Windows command shells unless noted.\n\n## 1. Set up your local development environment\n\nIf you haven't already, set up an environment where you can run the code. Here are some options:\n\n[!INCLUDE [create_environment_options](../../includes/create-environment-options.md)]\n\n## 2. Install library packages\n\nIn your *requirements.txt* file, add lines for the client library package you need and save the file.\n\n:::code language=\"txt\" source=\"~/../python-sdk-docs-examples/storage/requirements_use.txt\":::\n\nThen, in your terminal or command prompt, install the requirements.\n\n```console\npip install -r requirements.txt\n```\n\n## 3. Create a file to upload\n\nCreate a source file named *sample-source.txt*. This file name is what the code expects.\n\n:::code language=\"txt\" source=\"~/../python-sdk-docs-examples/storage/sample-source.txt\":::\n\n## 4. Use blob storage from app code\n\nThis section demonstrates two ways to access data in the blob container that you created in [Example: Create Azure Storage](azure-sdk-example-storage.md). To access data in the blob container, your app must be able to authenticate with Azure and be authorized to access data in the container. This section presents two ways of doing this:\n\n- The **Passwordless (Recommended)** method authenticates the app by using [`DefaultAzureCredential`](../authentication/credential-chains.md#defaultazurecredential-overview). `DefaultAzureCredential` is a chained credential that can authenticate an app (or a user) using a sequence of different credentials, including developer tool credentials, application service principals, and managed identities.\n\n- The **Connection string** method uses a connection string to access the storage account directly.\n\nFor the following reasons and more, we recommend using the passwordless method whenever possible:\n\n- A connection string authenticates the connecting agent with the Storage *account* rather than with individual resources within that account. As a result, a connection string grants broader authorization than might be needed. With `DefaultAzureCredential` you can grant more granular, least privileged permissions over your storage resources to the identity your app runs under using [Azure RBAC](/azure/role-based-access-control/overview).\n\n- A connection string contains access info in plain text and therefore presents potential vulnerabilities if not properly constructed or secured. If such a connection string is exposed, it can be used to access a wide range of resources within the Storage account.\n\n- A connection string is usually stored in an environment variable, which makes it vulnerable to compromise if an attacker gains access to your environment. Many of the credential types supported by `DefaultAzureCredential` don't require storing secrets in your environment.\n\n### [Passwordless (Recommended)](#tab/managed-identity)\n\n`DefaultAzureCredential` is an opinionated, preconfigured chain of credentials. `DefaultAzureCredential` supports many environments, along with the most common authentication flows and developer tools. An instance of `DefaultAzureCredential` determines which credential types to try to get a token for based on a combination of its runtime environment, the value of certain well-known environment variables, and, optionally, parameters passed into its constructor.\n\nIn the following steps, you configure an application service principal as the application identity. Application service principals are suitable for use both during local development and for apps hosted on-premises. To configure `DefaultAzureCredential` to use the application service principal, you set the following environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_CLIENT_SECRET`.\n\nNotice that a client secret is configured. A client secret is necessary for an application service principal, but, depending on your scenario, you can also configure `DefaultAzureCredential` to use credentials that don't require setting a secret or password in an environment variable.\n\nFor example, in local development, if `DefaultAzureCredential` can't get a token using configured environment variables, it tries to get one using the user (already) signed into development tools like Azure CLI; for an app hosted in Azure, `DefaultAzureCredential` can be configured to use a managed identity. In all cases, the code in your app remains the same, only the configuration and/or the runtime environment changes.\n\n1. Create a file named *use_blob_auth.py* with the following code. The comments explain the steps.\n\n    :::code language=\"python\" source=\"~/../python-sdk-docs-examples/storage/use_blob_auth.py\":::\n\n    Reference links:\n      - [DefaultAzureCredential (azure.identity)](/python/api/azure-identity/azure.identity.defaultazurecredential)\n      - [BlobClient (azure.storage.blob)](/python/api/azure-storage-blob/azure.storage.blob.blobclient)\n\n1. Create an environment variable named `AZURE_STORAGE_BLOB_URL`:\n\n    # [cmd](#tab/cmd)\n\n    ```cmd\n    set AZURE_STORAGE_BLOB_URL=https://pythonazurestorage12345.blob.core.windows.net\n    ```\n\n    # [bash](#tab/bash)\n\n    ```bash\n    AZURE_STORAGE_BLOB_URL=https://pythonazurestorage12345.blob.core.windows.net\n    ```\n\n    ---\n\n    Replace \"pythonazurestorage12345\" with the name of your storage account.\n\n    The `AZURE_STORAGE_BLOB_URL` environment variable is used only by this example. It isn't used by the Azure libraries.\n\n1. Use the [az ad sp create-for-rbac](/cli/azure/ad/sp#az-ad-sp-create-for-rbac) command to create a new service principal for the app. The command creates the app registration for the app at the same time. Give the service principal a name of your choosing.\n\n    ```azurecli\n    az ad sp create-for-rbac --name <service-principal-name>\n    ```\n\n    The output of this command looks like the following JSON snippet. Make note of these values or keep this window open as you'll need these values in the next step and won't be able to view the password (client secret) value again. You can, however, add a new password later without invalidating the service principal or existing passwords if needed.\n\n    ```json\n    {\n      \"appId\": \"00001111-aaaa-2222-bbbb-3333cccc4444\",\n      \"displayName\": \"<service-principal-name>\",\n      \"password\": \"Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2\",\n      \"tenant\": \"aaaabbbb-0000-cccc-1111-dddd2222eeee\"\n    }\n    ```\n\n    Azure CLI commands can be run in the [Azure Cloud Shell](https://shell.azure.com) or on a workstation with the [Azure CLI installed](/cli/azure/install-azure-cli).\n\n1. Create environment variables for the application service principal:\n\n    Create the following environment variables with the values from the output of the previous command. These variables tell `DefaultAzureCredential` to use the application service principal.\n\n    - `AZURE_CLIENT_ID` &rarr; The app ID value.\n    - `AZURE_TENANT_ID` &rarr; The tenant ID value.\n    - `AZURE_CLIENT_SECRET` &rarr; The password/credential generated for the app.\n\n    # [cmd](#tab/cmd)\n\n    ```cmd\n    set AZURE_CLIENT_ID=00001111-aaaa-2222-bbbb-3333cccc4444\n    set AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee\n    set AZURE_CLIENT_SECRET=Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2\n    ```\n\n    # [bash](#tab/bash)\n\n    ```bash\n    AZURE_CLIENT_ID=00001111-aaaa-2222-bbbb-3333cccc4444\n    AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee\n    AZURE_CLIENT_SECRET=Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2\n    ```\n\n    ---\n\n1. Attempt to run the code (which fails intentionally):\n\n    ```console\n    python use_blob_auth.py\n    ```\n\n1. Observe the error \"This request is not authorized to perform this operation using this permission.\" The error is expected because the local service principal that you're using doesn't yet have permission to access the blob container.\n\n1. Grant [Storage Blob Data Contributor](/azure/role-based-access-control/built-in-roles/storage#storage-blob-data-contributor) permissions on the blob container to the service principal using the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) Azure CLI command:\n\n    ```azurecli\n    az role assignment create --assignee <AZURE_CLIENT_ID> \\\n        --role \"Storage Blob Data Contributor\" \\\n        --scope \"/subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/PythonAzureExample-Storage-rg/providers/Microsoft.Storage/storageAccounts/pythonazurestorage12345/blobServices/default/containers/blob-container-01\"\n    ```\n\n    The `--assignee` argument identifies the service principal. Replace \\<AZURE_CLIENT_ID> placeholder with the app ID of your service principal.\n\n    The `--scope` argument identifies where this role assignment applies. In this example, you grant the \"Storage Blob Data Contributor\" role to the service principal for the container named \"blob-container-01\".\n\n    - Replace `PythonAzureExample-Storage-rg` and `pythonazurestorage12345` with the resource group that contains your storage account and the exact name of your storage account. Also, adjust the name of the blob container, if necessary. If you use the wrong name, you see the error, \"Cannot perform requested operation on nested resource. Parent resource 'pythonazurestorage12345' not found.\"\n\n    - Replace the \\<AZURE_SUBSCRIPTION_ID> place holder with your Azure subscription ID. (You can run the [az account show](/cli/azure/account#az-account-show) command and get your subscription ID from the `id` property in the output.)\n\n    > [!TIP]\n    > If the role assignment command returns an error \"No connection adapters were found\" when using bash shell, try setting `export MSYS_NO_PATHCONV=1` to avoid path translation. For more information, see this [issue](https://github.com/git-for-windows/git/issues/577#issuecomment-166118846).\n\n1. **Wait a minute or two for the permissions to propagate**, then run the code again to verify that it now works. If you see the permissions error again, wait a little longer, then try the code again.\n\nFor more information on role assignments, see [How to assign role permissions using the Azure CLI](/azure/role-based-access-control/role-assignments-cli).\n\n> [!IMPORTANT]\n> In the preceding steps, your app ran under an application service principal. An application service principal requires a client secret in its configuration. However, you can use the same code to run the app under different credential types that don't require you to explicitly configure a password or secret in the environment. For example, during development, `DefaultAzureCredential` can use developer tool credentials like the credentials you use to sign in via the Azure CLI; or, for apps hosted in Azure, it can use a [managed identity](/entra/identity/managed-identities-azure-resources/overview). To learn more, see [Authenticate Python apps to Azure services by using the Azure SDK for Python](../authentication/overview.md).\n\n### [Connection String](#tab/connection-string)\n\nA connection string includes the storage account access key and uses it to authorize requests. Always be careful to never expose the keys in an unsecure location.\n\n1. Create a Python file named *use_blob_conn_string.py* with the following code. The comments explain the steps.\n\n    :::code language=\"python\" source=\"~/../python-sdk-docs-examples/storage/use_blob_conn_string.py\":::\n\n1. Create an environment variable named `AZURE_STORAGE_CONNECTION_STRING`, the value of which is the full connection string for the storage account. (This environment variable is also used by various Azure CLI comments.) You can get the connection string for your storage account by running the [az storage account show-connection-string](/cli/azure/storage/account#az-storage-account-show-connection-string) command.\n\n    ```azurecli\n    az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345\n    ```\n\n    Replace `PythonAzureExample-Storage-rg` and `pythonazurestorage12345` with the resource group that contains your storage account and the exact name of your storage account.\n\n    When you set the environment variable, use the entire value of the `connectionString` property in the output including the quotes.\n\n1. Run the code:\n\n    ```console\n    python use_blob_conn_string.py\n    ```\n\nAgain, although this method is simple, a connection string authorizes all operations in a storage account. With production code, it's better to use specific permissions as described in the previous section.\n\n> [!IMPORTANT]\n> The account access key should be used with caution. If your account access key is lost or accidentally placed in an insecure location, your service may become vulnerable. Anyone who has the access key is able to authorize requests against the storage account, and effectively has access to all the data. `DefaultAzureCredential` provides enhanced security features and benefits and is the recommended approach for managing authorization to Azure services.\n\n---\n\n## 5. Verify blob creation\n\nAfter running the code of either method, go to the [Azure portal](https://portal.azure.com), navigate into the blob container to verify that a new blob exists named *sample-blob-{random}.txt* with the same contents as the *sample-source.txt* file:\n\n![Azure portal page for the blob container, showing the uploaded file](../../media/azure-sdk-example-storage/portal-blob-container-file.png)\n\nIf you created an environment variable named `AZURE_STORAGE_CONNECTION_STRING`, you can also use the Azure CLI to verify that the blob exists using the [az storage blob list](/cli/azure/storage/blob#az-storage-blob-list) command:\n\n```azurecli\naz storage blob list --container-name blob-container-01\n```\n\nIf you followed the instructions to use passwordless authentication, you can add the `--connection-string` parameter to the preceding command with the connection string for your storage account. To get the connection string, use the [az storage account show-connection-string](/cli/azure/storage/account#az-storage-account-show-connection-string) command.\n\n```azurecli\naz storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345 --output tsv\n```\n\nUse the entire connection string as the value for the `--connection-string` parameter.\n\n> [!NOTE]\n> If your Azure user account has the \"Storage Blob Data Contributor\" role on the container, you can use the following command to list the blobs in the container:\n>\n> ```azurecli\n> az storage blob list --container-name blob-container-01 --account-name pythonazurestorage12345 --auth-mode login\n> ```\n\n## 6. Clean up resources\n\nRun the [az group delete](/cli/azure/group#az-group-delete) command if you don't need to keep the resource group and storage resources used in this example. Resource groups don't incur any ongoing charges in your subscription, but resources, like storage accounts, in the resource group might continue to incur charges. It's a good practice to clean up any group that you aren't actively using. The `--no-wait` argument allows the command to return immediately instead of waiting for the operation to finish.\n\n```azurecli\naz group delete -n PythonAzureExample-Storage-rg  --no-wait\n```\n\n[!INCLUDE [resource_group_begin_delete](../../includes/resource-group-begin-delete.md)]\n\nIf you followed the instructions to use passwordless authentication, it's a good idea to delete the application service principal you created. You can use the [az ad app delete](/cli/azure/ad/app#az-ad-app-delete) command. Replace the \\<AZURE_CLIENT_ID> placeholder with the app ID of your service principal.\n\n```azurecli\naz ad app delete --id <AZURE_CLIENT_ID>\n```\n\n## See also\n\n- [Quickstart: Azure Blob Storage client library for Python](/azure/storage/blobs/storage-quickstart-blobs-python)\n- [Example: Create a resource group](azure-sdk-example-resource-group.md)\n- [Example: List resource groups in a subscription](azure-sdk-example-list-resource-groups.md)\n- [Example: Create a web app and deploy code](azure-sdk-example-web-app.md)\n- [Example: Create Azure Storage](azure-sdk-example-storage.md)\n- [Example: Create and query a database](azure-sdk-example-database.md)\n- [Example: Create a virtual machine](azure-sdk-example-virtual-machines.md)\n- [Use Azure Managed Disks with virtual machines](azure-sdk-samples-managed-disks.md)\n- [Complete a short survey about the Azure SDK for Python](https://microsoft.qualtrics.com/jfe/form/SV_bNFX0HECjzPWMiG?Q_CHL=docs)\n"
  },
  {
    "path": "articles/python/sdk/examples/azure-sdk-example-storage.md",
    "content": "---\ntitle: Create Azure Storage with the Azure libraries for Python\ndescription: Use the Azure SDK for Python libraries to create a blob container in an Azure Storage account and then upload a file to that container.\nms.date: 05/20/2025\nms.topic: how-to\nms.custom:\n  - devx-track-python\n  - py-fresh-zinc\n  - sfi-image-nochange\n---\n\n# Example: Create Azure Storage using the Azure libraries for Python\n\nIn this article, you learn how to use the Azure management libraries for Python to create a resource group, along with an Azure Storage account and a Blob storage container.\n\nAfter provisioning these resources, refer to the section [Example: Use Azure Storage](azure-sdk-example-storage-use.md) to see how to use the Azure client libraries in Python to upload a file to the Blob container.\n\nThe [Equivalent Azure CLI commands](#for-reference-equivalent-azure-cli-commands) for bash and PowerShell are listed later in this article. If you prefer to use the Azure portal, see [Create an Azure storage account](/azure/storage/common/storage-account-create?tabs=azure-portal) and [Create a blob container](/azure/storage/blobs/storage-quickstart-blobs-portal).\n\n## 1: Set up your local development environment\n\nIf you haven't already, set up an environment where you can run the code. Here are some options:\n\n[!INCLUDE [create_environment_options](../../includes/create-environment-options.md)]\n\n## 2: Install the needed Azure library packages\n\n1. In your console, create a *requirements.txt* file that lists the management libraries used in this example:\n\n    ```azurecli\n    azure-mgmt-resource\n    azure-mgmt-storage\n    azure-identity\n    ```\n\n1. In your console with the virtual environment activated, install the requirements:\n\n    ```console\n    pip install -r requirements.txt\n    ```\n\n## 3. Set environment variables\n\nIn this step, you set environment variables for use in the code in this article. The code uses the `os.environ` method to retrieve the values.\n\n# [Bash](#tab/bash)\n\n```azurecli\n#!/bin/bash\nexport AZURE_RESOURCE_GROUP_NAME=<ResourceGroupName> # Change to your preferred resource group name\nexport LOCATION=<Location> # Change to your preferred region\nexport AZURE_SUBSCRIPTION_ID=$(az account show --query id --output tsv)\nexport STORAGE_ACCOUNT_NAME=<StorageAccountName> # Change to your preferred storage account name\nexport CONTAINER_NAME=<ContainerName> # Change to your preferred container name\n\n```\n\n# [PowerShell](#tab/powershell)\n\n```azurecli\n# PowerShell syntax\n$env:AZURE_RESOURCE_GROUP_NAME = <ResourceGroupName> # Change to your preferred resource group name\n$env:LOCATION = <Location> # Change to your preferred region\n$env:AZURE_SUBSCRIPTION_ID = $(az account show --query id --output tsv)\n$env:STORAGE_ACCOUNT_NAME = <StorageAccountName> # Change to your preferred storage account name\n$env:CONTAINER_NAME = <ContainerName> # Change to your preferred container name\n```\n\n---\n\n## 4: Write code to create a storage account and blob container\n\nIn this step, you create a Python file named *provision_blob.py* with the following code. This Python script uses the Azure SDK for Python management libraries to create a resource group, Azure Storage account, and Blob container using the Azure SDK for Python.\n\n```Python\nimport os, random\n\n# Import the needed management objects from the libraries. The azure.common library\n# is installed automatically with the other libraries.\nfrom azure.identity import DefaultAzureCredential\nfrom azure.mgmt.resource import ResourceManagementClient\nfrom azure.mgmt.storage import StorageManagementClient\nfrom azure.mgmt.storage.models import BlobContainer\n\n# Acquire a credential object.\ncredential = DefaultAzureCredential()\n\n# Retrieve subscription ID from environment variable.\nsubscription_id = os.environ[\"AZURE_SUBSCRIPTION_ID\"]\n\n# Retrieve resource group name and location from environment variables\nRESOURCE_GROUP_NAME = os.environ[\"AZURE_RESOURCE_GROUP_NAME\"]\nLOCATION = os.environ[\"LOCATION\"]\n\n# Step 1: Provision the resource group.\nresource_client = ResourceManagementClient(credential, subscription_id)\n\nrg_result = resource_client.resource_groups.create_or_update(RESOURCE_GROUP_NAME,\n    { \"location\": LOCATION })\n\nprint(f\"Provisioned resource group {rg_result.name}\")\n\n# For details on the previous code, see Example: Provision a resource group\n# at https://docs.microsoft.com/azure/developer/python/azure-sdk-example-resource-group\n\n\n# Step 2: Provision the storage account, starting with a management object.\n\nstorage_client = StorageManagementClient(credential, subscription_id)\n\nSTORAGE_ACCOUNT_NAME = os.environ[\"STORAGE_ACCOUNT_NAME\"] \n\n# Check if the account name is available. Storage account names must be unique across\n# Azure because they're used in URLs.\navailability_result = storage_client.storage_accounts.check_name_availability(\n    { \"name\": STORAGE_ACCOUNT_NAME }\n)\n\nif not availability_result.name_available:\n    print(f\"Storage name {STORAGE_ACCOUNT_NAME} is already in use. Try another name.\")\n    exit()\n\n# The name is available, so provision the account\npoller = storage_client.storage_accounts.begin_create(RESOURCE_GROUP_NAME, STORAGE_ACCOUNT_NAME,\n    {\n        \"location\" : LOCATION,\n        \"kind\": \"StorageV2\",\n        \"sku\": {\"name\": \"Standard_LRS\"}\n    }\n)\n\n# Long-running operations return a poller object; calling poller.result()\n# waits for completion.\naccount_result = poller.result()\nprint(f\"Provisioned storage account {account_result.name}\")\n\n\n# Step 3: Retrieve the account's primary access key and generate a connection string.\nkeys = storage_client.storage_accounts.list_keys(RESOURCE_GROUP_NAME, STORAGE_ACCOUNT_NAME)\n\nprint(f\"Primary key for storage account: {keys.keys[0].value}\")\n\nconn_string = f\"DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName={STORAGE_ACCOUNT_NAME};AccountKey={keys.keys[0].value}\"\n\n# print(f\"Connection string: {conn_string}\")\n\n# Step 4: Provision the blob container in the account (this call is synchronous)\nCONTAINER_NAME = os.environ[\"CONTAINER_NAME\"]\ncontainer = storage_client.blob_containers.create(RESOURCE_GROUP_NAME, STORAGE_ACCOUNT_NAME, CONTAINER_NAME, BlobContainer())\n\nprint(f\"Provisioned blob container {container.name}\")\n```\n\n### Authentication in the code\n\nLater in this article, you sign in to Azure using the Azure CLI to execute the sample code. If your account has sufficient permissions to create resource groups and storage resources in your Azure subscription, the script should run successfully without additional configuration.\n\nTo use this code in a production environment, authenticate using a service principal by setting environment variables. This approach enables secure, automated access without relying on interactive login. For detailed guidance, see [How to authenticate Python apps with Azure services](../authentication-overview.md).\n\nEnsure that the service principal is assigned a role with sufficient permissions to create resource groups and storage accounts. For example, assigning the Contributor role at the subscription level provides the necessary access. To learn more about role assignments, see [Role-based access control (RBAC) in Azure](/azure/role-based-access-control/overview).\n\n### Reference links for classes used in the code\n\n- [DefaultAzureCredential (azure.identity)](/python/api/azure-identity/azure.identity.defaultazurecredential)\n- [ResourceManagementClient (azure.mgmt.resource)](/python/api/azure-mgmt-resource/azure.mgmt.resource.resourcemanagementclient)\n- [StorageManagementClient (azure.mgmt.storage)](/python/api/azure-mgmt-storage/azure.mgmt.storage.storagemanagementclient)\n\n## 5. Run the script\n\n1. If you haven't already, sign in to Azure using the Azure CLI:\n\n    ```azurecli\n    az login\n    ```\n\n    ---\n\n1. Run the script:\n\n    ```console\n    python provision_blob.py\n    ```\n\n    The script takes a minute or two to complete.\n\n## 6: Verify the resources\n\n1. Open the [Azure portal](https://portal.azure.com) to verify that the resource group and storage account were created as expected. You may need to wait a minute and also select **Show hidden types** in the resource group.\n\n    ![Azure portal page for the new resource group, showing the storage account](../../media/azure-sdk-example-storage/portal-show-hidden-types.png)\n\n1. Select the storage account, then select **Data storage** > **Containers** in the left-hand menu to verify that the \"blob-container-01\" appears:\n\n    ![Azure portal page for the storage account showing the blob container](../../media/azure-sdk-example-storage/portal-show-blob-containers.png)\n\n1. If you want to try using these resources from application code, continue with [Example: Use Azure Storage](azure-sdk-example-storage-use.md).\n\nFor another example of using the Azure Storage management library, see the [Manage Python Storage sample](/samples/azure-samples/azure-samples-python-management/storage/).\n\n## 7: Clean up resources\n\nLeave the resources in place if you want to follow the article [Example: Use Azure Storage](azure-sdk-example-storage-use.md) to use these resources in app code. Otherwise, run the [az group delete](/cli/azure/group#az-group-delete) command if you don't need to keep the resource group and storage resources created in this example.\n\nResource groups don't incur any ongoing charges in your subscription, but resources, like storage accounts, in the resource group might incur charges. It's a good practice to clean up any group that you aren't actively using. The `--no-wait` argument allows the command to return immediately instead of waiting for the operation to finish.\n\n# [Bash](#tab/bash)\n\n```azurecli\n#!/bin/bash\naz group delete -n $AZURE_RESOURCE_GROUP_NAME --no-wait\n```\n\n# [PowerShell](#tab/powershell)\n\n```azurecli\n# PowerShell syntax\naz group delete -n $env:AZURE_RESOURCE_GROUP_NAME --no-wait\n```\n\n---\n\n### For reference: equivalent Azure CLI commands\n\nThe following Azure CLI commands complete the same creation steps as the Python script:\n\n# [Bash](#tab/bash)\n\n```azurecli\n#!/bin/bash\n#!/bin/bash\n\n# Set variables\nexport LOCATION=<Location> # Change to your preferred region\nexport AZURE_RESOURCE_GROUP_NAME=<ResourceGroupName> # Change to your preferred resource group name\nexport STORAGE_ACCOUNT_NAME=<StorageAccountName> # Change to your preferred storage account name\nexport CONTAINER_NAME=<ContainerName> # Change to your preferred container name\n\n# Provision the resource group\necho \"Creating resource group: $AZURE_RESOURCE_GROUP_NAME\"\naz group create \\\n    --location \"$LOCATION\" \\\n    --name \"$AZURE_RESOURCE_GROUP_NAME\"\n\n# Provision the storage account\naz storage account create -g $AZURE_RESOURCE_GROUP_NAME -l $LOCATION -n $STORAGE ACCOUNT_NAME --kind StorageV2 --sku Standard_LRS\n\necho Storage account name is $STORAGE_ACCOUNT_NAME\n\n# Retrieve the connection string\nCONNECTION_STRING=$(az storage account show-connection-string -g $AZURE_RESOURCE_GROUP_NAME -n $STORAGE_ACCOUNT_NAME --query connectionString)\n\n# Provision the blob container\naz storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME --connection-string $CONNECTION_STRING\n```\n\n### [PowerShell](#tab/powershell)\n\n```azurecli\n# PowerShell syntax\n# Define variables\n$env:LOCATION = <Location> # Change to your preferred region\n$env:AZURE_RESOURCE_GROUP_NAME = <ResourceGroupName> # Change to your preferred resource group name\n$env:STORAGE_ACCOUNT_NAME = <StorageAccountName> # Change to your preferred storage account name\n$env:CONTAINER_NAME = <ContainerName> # Change to your preferred container name\n\n# Provision the resource group\naz group create -n $AZURE_RESOURCE_GROUP_NAME -l $LOCATION\n\n# Provision the storage account\naz storage account create `\n  -g $AZURE_RESOURCE_GROUP_NAME `\n  -l $LOCATION `\n  -n $STORAGE_ACCOUNT_NAME `\n  --kind StorageV2 `\n  --sku Standard_LRS\n\n# Retrieve the connection string\nWrite-Output \"Storage account name is $ACCOUNT_NAME\"\n\n$CONNECTION_STRING = az storage account show-connection-string `\n  -g $AZURE_RESOURCE_GROUP_NAME `\n  -n $STORAGE_ACCOUNT_NAME `\n  --query connectionString `\n  -o tsv\n\n# Provision the blob container\naz storage container create `\n  --name $CONTAINER_NAME `\n  --account-name $STORAGE_ACCOUNT_NAME `\n  --connection-string $CONNECTION_STRING\n\n```\n\n---\n\n## See also\n\n- [Example: Use Azure Storage](azure-sdk-example-storage-use.md)\n- [Example: Create a resource group](azure-sdk-example-resource-group.md)\n- [Example: List resource groups in a subscription](azure-sdk-example-list-resource-groups.md)\n- [Example: Create a web app and deploy code](azure-sdk-example-web-app.md)\n- [Example: Create and query a database](azure-sdk-example-database.md)\n- [Example: Create a virtual machine](azure-sdk-example-virtual-machines.md)\n- [Use Azure Managed Disks with virtual machines](azure-sdk-samples-managed-disks.md)\n- [Complete a short survey about the Azure SDK for Python](https://microsoft.qualtrics.com/jfe/form/SV_bNFX0HECjzPWMiG?Q_CHL=docs)\n"
  },
  {
    "path": "articles/python/sdk/examples/azure-sdk-example-virtual-machines.md",
    "content": "---\ntitle: Create a virtual machine using the Azure SDK libraries for Python\ndescription: How to create an Azure virtual machine using Python and the Azure SDK management libraries.\nms.date: 06/10/2025\nms.topic: how-to\nms.custom:\n  - devx-track-python\n  - py-fresh-zinc\n  - sfi-image-nochange\n---\n\n# Example: Use the Azure libraries to create a virtual machine\n\nIn this article, you learn how to use the Azure SDK management libraries in a Python script to create a resource group that contains a Linux virtual machine.\n\nThe [Equivalent Azure CLI commands](#equivalent-azure-cli-commands) are listed later in this article. If you prefer to use the Azure portal, see [Create a Linux VM](/azure/virtual-machines/linux/quick-create-portal) and [Create a Windows VM](/azure/virtual-machines/windows/quick-create-portal).\n\n> [!NOTE]\n> Creating a virtual machine through code is a multi-step process that involves provisioning a number of other resources that the virtual machine requires. If you're simply running such code from the command line, it's much easier to use the [`az vm create`](/cli/azure/vm#az_vm_create) command, which automatically provisions these secondary resources with defaults for any setting you choose to omit. The only required arguments are a resource group, VM name, image name, and login credentials. For more information, see [Quick Create a virtual machine with the Azure CLI](/azure/virtual-machines/scripts/virtual-machines-windows-cli-sample-create-vm-quick-create).\n\n## 1: Set up your local development environment\n\nIf you haven't already, set up an environment where you can run this code. Here are some options:\n\n```azurecli\n#!/bin/bash\n# Create a virtual environment\npython -m venv .venv\n# Activate the virtual environment\nsource .venv/Scripts/activate # only required for Windows (Git Bash)\n```\n\n* Use a [conda environment](https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html). To install Conda, see [Install Miniconda](https://docs.conda.io/en/latest/miniconda.html).\n\n* Use a [Dev Container](https://containers.dev/) in [Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) or [GitHub Codespaces](https://docs.github.com/en/codespaces/overview).\n\n## 2: Install the needed Azure library packages\n\nCreate a *requirements.txt* file specifying the Azure SDK management packages required by this script.\n\n:::code language=\"txt\" source=\"~/../python-sdk-docs-examples/vm/requirements.txt\":::\n\nNext, install the management libraries specified in *requirements.txt*:\n\n```console\npip install -r requirements.txt\n```\n\n## 3: Write code to create a virtual machine\n\nCreate a Python file named *provision_vm.py* with the following code. The comments explain the details:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/vm/provision_vm.py\":::\n\n### Authentication in the code\n\nLater in this article, you sign in to Azure using the Azure CLI to execute the sample code. If your account has sufficient permissions to create resource groups and storage resources in your Azure subscription, the script should run successfully without additional configuration.\n\nTo use this code in a production environment, authenticate using a service principal by setting environment variables. This approach enables secure, automated access without relying on interactive login. For detailed guidance, see [How to authenticate Python apps with Azure services](../authentication-overview.md).\n\nEnsure that the service principal is assigned a role with sufficient permissions to create resource groups and storage accounts. For example, assigning the Contributor role at the subscription level provides the necessary access. To learn more about role assignments, see [Role-based access control (RBAC) in Azure](/azure/role-based-access-control/overview).\n\n### Reference links for classes used in the code\n\n* [Defaultredential (azure.identity)](/python/api/azure-identity/azure.identity.defaultazurecredential)\n* [ResourceManagementClient (azure.mgmt.resource)](/python/api/azure-mgmt-resource/azure.mgmt.resource.resourcemanagementclient)\n* [NetworkManagementClient (azure.mgmt.network)](/python/api/azure-mgmt-network/azure.mgmt.network.networkmanagementclient)\n* [ComputeManagementClient (azure.mgmt.compute)](/python/api/azure-mgmt-compute/azure.mgmt.compute.computemanagementclient)\n\n## 4. Run the script\n\n1. If you haven't already, sign in to Azure using the Azure CLI:\n\n    ```azurecli\n    az login\n    ```\n\n1. Set the `AZURE_SUBSCRIPTION_ID` environment variable to your subscription ID. (You can run the [az account show](/cli/azure/account#az-account-show) command and get your subscription ID from the `id` property in the output):\n\n    ```azurecli\n    export AZURE_SUBSCRIPTION_ID=$(az account show --query id -o tsv)\n    ```\n\n1. Run the script:\n\n    ```console\n    python provision_vm.py\n    ```\n\nThe provisioning process takes a few minutes to complete.\n\n## 5. Verify the resources\n\nOpen the [Azure portal](https://portal.azure.com), navigate to the \"PythonAzureExample-VM-rg\" resource group, and note the virtual machine, virtual disk, network security group, public IP address, network interface, and virtual network.\n\n![Azure portal page for the new resource group showing the virtual machine and related resources](../../media/azure-sdk-example-virtual-machines/portal-vm-resources.png)\n\nYou can also use the Azure CLI to verify that the VM exists with the [az vm list](/cli/azure/vm#az-vm-list) command:\n\n```azurecli\naz vm list --resource-group PythonAzureExample-VM-rg\n```\n\n### Equivalent Azure CLI commands\n\n:::code language=\"azurecli\" source=\"~/../python-sdk-docs-examples/vm/provision.sh\":::\n\nIf you get an error about capacity restrictions, you can try a different size or region. For more information, see [Resolve errors for SKU not available](/azure/azure-resource-manager/troubleshooting/error-sku-not-available).\n\n## 6: Clean up resources\n\nLeave the resources in place if you want to continue to use the virtual machine and network you created in this article. Otherwise, run the [az group delete](/cli/azure/group#az-group-delete) command to delete the resource group.\n\nResource groups don't incur any ongoing charges in your subscription, but resources contained in the group, like virtual machines, might continue to incur charges. It's a good practice to clean up any group that you aren't actively using. The `--no-wait` argument allows the command to return immediately instead of waiting for the operation to finish.\n\n```azurecli\naz group delete -n PythonAzureExample-VM-rg --no-wait\n```\n\n[!INCLUDE [resource_group_begin_delete](../../includes/resource-group-begin-delete.md)]\n\n## See also\n\n* [Example: Create a resource group](azure-sdk-example-resource-group.md)\n* [Example: List resource groups in a subscription](azure-sdk-example-list-resource-groups.md)\n* [Example: Create Azure Storage](azure-sdk-example-storage.md)\n* [Example: Use Azure Storage](azure-sdk-example-storage-use.md)\n* [Example: Create a web app and deploy code](azure-sdk-example-web-app.md)\n* [Example: Create and query a database](azure-sdk-example-database.md)\n* [Use Azure Managed Disks with virtual machines](azure-sdk-samples-managed-disks.md)\n* [Complete a short survey about the Azure SDK for Python](https://microsoft.qualtrics.com/jfe/form/SV_bNFX0HECjzPWMiG?Q_CHL=docs)\n\nThe following resources contain more comprehensive examples using Python to create a virtual machine:\n\n* [Azure Virtual Machines Management Samples - Python](https://github.com/Azure-Samples/virtual-machines-python-manage) (GitHub). The sample demonstrates more management operations like starting and restarting a VM, stopping and deleting a VM, increasing the disk size, and managing data disks.\n"
  },
  {
    "path": "articles/python/sdk/examples/azure-sdk-example-web-app.md",
    "content": "---\ntitle: Create and deploy a Python web app to Azure App Service using the Azure SDK libraries\ndescription: Use Azure SDK for Python to create a web app and then deploy app code from a GitHub repository to Azure App Service.\nms.date: 04/15/2025\nms.topic: install-set-up-deploy\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Example: Use the Azure libraries to create and deploy a web app\n\nThis example shows how to use the Azure SDK management libraries in a Python script to create and deploy a web app to Azure App Service, with the app code pulled from a GitHub repository.\n\nThe Azure SDK for Python includes management libraries (namespaces beginning with `azure-mgmt`) that let you automate resource configuration and deployment — similar to what you can do with the Azure portal, Azure CLI, or ARM templates. For examples, see [Quickstart: Deploy a Python (Django or Flask) web app to Azure App Service](/azure/app-service/quickstart-python).\n\n## 1: Set up your local development environment\n\nIf you haven't already, set up an environment where you can run this code. Here are some options:\n\n[!INCLUDE [create_environment_options](../../includes/create-environment-options.md)]\n\n## 2: Install the required Azure library packages\n\nCreate a file named *requirements.txt* with the following contents:\n\n:::code language=\"txt\" source=\"~/../python-sdk-docs-examples/webapp/requirements.txt\":::\n\nIn your local development environment, install the requirements using the following code:\n\n```console\npip install -r requirements.txt\n```\n\n## 3: Fork the sample repository\n\n1. Visit [https://github.com/Azure-Samples/python-docs-hello-world](https://github.com/Azure-Samples/python-docs-hello-world) and fork the repository into your own GitHub account. Using a fork ensures that you have the necessary permissions to deploy the app to Azure.\n\n    ![Forking the sample repository on GitHub](../../media/azure-sdk-example-web-app/fork-github-repository.png)\n\n1. Next, create an environment variable named `REPO_URL` and set it to the URL of your forked repository. This variable is required by the example code in the next section.\n\n# [bash](#tab/bash)\n\n```bash\nexport REPO_URL=<url_of_your_fork>\nexport AZURE_SUBSCRIPTION_ID=<subscription_id>\n```\n\n# [powershell](#tab/powershell)\n\n```powershell\n# Use single quotes to avoid interpolation\n$env:REPO_URL='<url_of_your_fork>'\n$env:AZURE_SUBSCRIPTION_ID='<subscription_id>'\n```\n\n---\n\n## 4: Write code to create and deploy a web app\n\nCreate a Python file named **provision_deploy_web_app.py** and add the following code. The in-line comments explain what each part of the script does. The `REPO_URL` and `AZURE_SUBSCRIPTION_ID` environment variables should already be set in the previous step.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/webapp/provision_deploy_web_app.py\":::\n\n[!INCLUDE [cli-auth-note](../../includes/cli-auth-note.md)]\n\n### Reference links for classes used in the code\n\n- [AzureCliCredential (azure.identity)](/python/api/azure-identity/azure.identity.azureclicredential)\n- [ResourceManagementClient (azure.mgmt.resource)](/python/api/azure-mgmt-resource/azure.mgmt.resource.resourcemanagementclient)\n- [WebSiteManagementClient (azure.mgmt.web import)](/python/api/azure-mgmt-web/azure.mgmt.web.websitemanagementclient)\n\n## 5: Run the script\n\n```console\npython provision_deploy_web_app.py\n```\n\n## 6: Verify the web app deployment\n\nTo view the deployed website, run the following command:\n\n```azurecli\naz webapp browse --name <PythonAzureExample-WebApp-12345> --resource-group PythonAzureExample-WebApp-rg\n```\n\nReplace the web app name (`--name`) with the value generated by the script.\nYou don’t need to change the resource group name (`--resource-group`) unless you changed it in the script. When you open the site, you should see “Hello, World!” in your browser.\n\n> [!Tip]\n> If you don't see the expected output, wait a few minutes and try again.\n\nIf you're still not seeing the expected output:\n\n1. Go to the [Azure portal](https://portal.azure.com).\n1. Navigate to **Resource groups**, and locate the resource group you created.\n1. Select the resource group to view its resources. Make sure it includes both an App Service Plan and an App Service.\n1. Select the **App Service**, and then go to **Deployment Center**.\n1. Open the **logs** tab to check the deployment logs for any errors or status updates.\n\n## 7: Redeploy the web app code (optional)\n\nThe script provisions all the necessary resources to host your web app and configures the deployment source to use your forked repository using manual integration. With manual integration, you need to manually trigger the web app to pull updates from the specified repository and branch.\n\nThe script uses the [WebSiteManagementClient.web_apps.sync_repository](/python/api/azure-mgmt-web/azure.mgmt.web.websitemanagementclient#azure-mgmt-web-websitemanagementclient-web-apps) method to trigger the web app to pull code from your repository. If you make further changes to your code, you can redeploy by calling this API again, or by using other Azure tools such as the Azure CLI or the Azure portal.\n\nYou can redeploy your code using the Azure CLI by running the [az webapp deployment source sync](/cli/azure/webapp/deployment/source#az-webapp-deployment-source-sync) command:\n\n```azurecli\naz webapp deployment source sync --name <PythonAzureExample-WebApp-12345> --resource-group PythonAzureExample-WebApp-rg\n```\n\nYou don’t need to change the resource group name (`--resource-group`) unless you changed it in the script.\n\nTo deploy your code from Azure portal:\n\n1. Go to the [Azure portal](https://portal.azure.com).\n1. Navigate to **Resource groups**, and locate the resource group you created.\n1. Select the resource group name to view its resources. Make sure it includes both an App Service Plan and an App Service.\n1. Select the **App Service**, and then go to **Deployment Center**.\n1. On the top menu, select **Sync** to trigger the deployment of your code.\n\n## 8: Clean up resources\n\n```azurecli\naz group delete --name PythonAzureExample-WebApp-rg --no-wait\n```\n\nYou do not need to change resource group name (`--resource-group` option) unless you changed it in the script.\n\nIf you no longer need the resource group created in this example, you can delete it by running the [az group delete](/cli/azure/group#az-group-delete) command. While resource groups don’t incur ongoing charges, it’s a good practice to clean up any unused resources. Use the `--no-wait` argument to immediately return control to the command line without waiting for the deletion to complete.\n\nYou can also delete a resource group programmatically using the [`ResourceManagementClient.resource_groups.begin_delete`](/python/api/azure-mgmt-resource/azure.mgmt.resource.resources.operations.resourcegroupsoperations#azure-mgmt-resource-resources-operations-resourcegroupsoperations-begin-delete) method.\n\n## See also\n\n- [Example: Create a resource group](azure-sdk-example-resource-group.md)\n- [Example: List resource groups in a subscription](azure-sdk-example-list-resource-groups.md)\n- [Example: Create Azure Storage](azure-sdk-example-storage.md)\n- [Example: Use Azure Storage](azure-sdk-example-storage-use.md)\n- [Example: Create and query a MySQL database](azure-sdk-example-database.md)\n- [Example: Create a virtual machine](azure-sdk-example-virtual-machines.md)\n- [Use Azure Managed Disks with virtual machines](azure-sdk-samples-managed-disks.md)\n- [Complete a short survey about the Azure SDK for Python](https://microsoft.qualtrics.com/jfe/form/SV_bNFX0HECjzPWMiG?Q_CHL=docs)\n"
  },
  {
    "path": "articles/python/sdk/examples/azure-sdk-samples-managed-disks.md",
    "content": "---\ntitle: Use Azure Managed Disks through the Azure SDK for Python\ndescription: Use the Azure Python SDK to create, resize, and update Managed Disks standalone, in a virtual machine, or in a Virtual Machine Scale Set.\nms.topic: concept-article\nms.date: 06/11/2025\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Use Azure Managed Disks with the Azure libraries (SDK) for Python\n\nAzure Managed Disks are high-performance, durable block storage designed for use with Azure Virtual Machines and Azure VMware Solution. They simplify disk management, offer greater scalability, enhance security, and eliminate the need to manage storage accounts directly. For more information, see [Azure Managed Disks](/azure/virtual-machines/managed-disks-overview).\n\nFor operations on Managed Disks associated with an existing VM, use the [`azure-mgmt-compute`](/python/api/overview/azure/virtualmachines) library.\n\nThe code examples in this article demonstrate common operations with Managed Disks using the `azure-mgmt-compute` library. These examples are not meant to be run as standalone scripts, but rather to be integrated into your own code. To learn how to create a `ComputeManagementClient` instance from `azure.mgmt.compute` in your script, see [Example - Create a virtual machine](azure-sdk-example-virtual-machines.md).\n\nFor more complete examples of how to use the `azure-mgmt-compute` library, see [Azure SDK for Python samples for compute](https://github.com/Azure-Samples/azure-samples-python-management/tree/main/samples/compute) in GitHub.\n\n## Standalone Managed Disks\n\nThe following examples show different ways to provision standalone Managed Disks.\n\n### Create an empty Managed Disk\n\nThis example shows how to create a new empty Managed Disk. You can use it as a blank disk to attach to a virtual machine or as a starting point for creating snapshots or images.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/empty_disk.py\":::\n\n### Create a Managed Disk from blob storage\n\nThis example shows how to create a Managed Disk from a VHD file stored in Azure Blob Storage. This is helpful when you want to reuse or move an existing virtual hard disk into Azure.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/disk_from_blob.py\":::\n\n### Create a Managed Disk image from blob storage\n\nThis example shows how to create a Managed Disk image from a VHD file stored in Azure Blob Storage. This is useful when you want to make a reusable image that can be used to create new virtual machines.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/disk_image_from_blob.py\":::\n\n### Create a Managed Disk from your own image\n\nThis example shows how to create a new Managed Disk by copying an existing one. This is helpful when you want to make a backup or use the same disk setup on another virtual machine.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/disk_from_image.py\":::\n\n## Virtual machine with Managed Disks\n\nYou can create a virtual machine with an implicitly created Managed Disk based on a specific disk image, eliminating the need to manually define all disk details.\n\nA Managed Disk is created implicitly when creating a VM from an OS image in Azure. Azure automatically handles the storage account, so you don't need to specify `storage_profile.os_disk` or create a storage account manually.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/vm_with_managed_disks.py\":::\n\nFor a complete example showing how to create a virtual machine using the Azure management libraries for Python, see [Example - Create a virtual machine](azure-sdk-example-virtual-machines.md). This example demonstrates how to use the `storage_profile` parameter.\n\nYou can also create a `storage_profile` from your own image:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/storage_profile_from_image.py\":::\n\nYou can easily attach a previously provisioned Managed Disk:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/attach_disk_to_vm.py\":::\n\n## Virtual Machine Scale Sets with Managed Disks\n\nBefore Azure Managed Disks, you had to manually create a storage account for each VM in your Virtual Machine Scale Set and use the `vhd_containers` parameter to specify those storage accounts in the Scale Set REST API.\n\nWith Azure Managed Disks, storage account management is no longer required. As a result, the `storage_profile` for [Virtual Machine Scale Sets](/azure/virtual-machine-scale-sets/overview) used for Virtual Machine Scale Sets can now match the one used for individual VM creation:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/vm_scale_set.py\" range=\"15-22\":::\n\nThe full sample is as follows:\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/vm_scale_set.py\":::\n\n## Other operations with Managed Disks\n\n### Resizing a Managed Disk\n\nThis example shows how to make an existing Managed Disk larger. This is useful when you need more space for your data or applications.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/resize_disk.py\":::\n\n### Update the storage account type of the Managed Disks\n\nThis example shows how to change the storage type of a Managed Disk and make it larger. This is helpful when you need more space or better performance for your data or applications.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/update_storage_type.py\":::\n\n### Create an image from blob storage\n\nThis example shows how to create a Managed Disk image from a VHD file stored in Azure Blob Storage. This is useful when you want to make a reusable image that you can use to create new virtual machines.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/create_image_from_blob.py\":::\n\n### Create a snapshot of a Managed Disk that is currently attached to a virtual machine\n\nThis example shows how to take a snapshot of a Managed Disk that's attached to a virtual machine. You can use the snapshot to back up the disk or restore it later if needed.\n\n:::code language=\"python\" source=\"~/../python-sdk-docs-examples/managed_disk/create_snapshot.py\":::\n\n## See also\n\n- [Example: Create a virtual machine](azure-sdk-example-virtual-machines.md)\n- [Example: Create a resource group](azure-sdk-example-resource-group.md)\n- [Example: List resource groups in a subscription](azure-sdk-example-list-resource-groups.md)\n- [Example: Create Azure Storage](azure-sdk-example-storage.md)\n- [Example: Use Azure Storage](azure-sdk-example-storage-use.md)\n- [Example: Create and use a MySQL database](azure-sdk-example-database.md)\n- [Complete a short survey about the Azure SDK for Python](https://microsoft.qualtrics.com/jfe/form/SV_bNFX0HECjzPWMiG?Q_CHL=docs)\n"
  },
  {
    "path": "articles/python/sdk/fundamentals/common-types-response.md",
    "content": "---\ntitle: Understand Common Response Types in the Azure SDK for Python\ndescription: Learn about types of objects that you receive from SDK operations when you use the Azure SDK for Python.\nms.date: 7/10/2025\nms.topic: concept-article\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Understand common response types in the Azure SDK for Python\n\nThe Azure SDK for Python abstracts calls to the underlying Azure service communication protocol, whether that protocol is HTTP or AMQP (which is used for messaging SDKs like `ServiceBus` and `EventHubs`). For example, if you use one of the libraries that uses HTTP, the Azure SDK for Python makes HTTP requests and receives HTTP responses under the hood. The SDK abstracts away this complexity so that you can work with intuitive Python objects instead of raw HTTP responses or JSON payloads.\n\nUnderstanding the types of objects that you receive from SDK operations is essential for writing effective Azure applications. This article explains the common response types that you encounter and how they relate to the underlying HTTP communication.\n\n> [!NOTE]\n> This article examines only the HTTP scenario, not the AMQP scenario.\n\n## Deserialized Python objects\n\nThe Azure SDK for Python prioritizes developer productivity by returning strongly typed Python objects from service operations. Instead of parsing JSON or handling HTTP status codes directly, you work with resource models that represent Azure resources as Python objects.\n\nFor example, when you retrieve a blob from Azure Storage, you receive a `BlobProperties` object with attributes like `name`, `size`, and `last_modified` rather than a raw JSON dictionary:\n\n```python\nfrom azure.storage.blob import BlobServiceClient\n\n# Connect to storage account\nblob_service_client = BlobServiceClient.from_connection_string(connection_string)\ncontainer_client = blob_service_client.get_container_client(\"mycontainer\")\n\n# Get blob properties - returns a BlobProperties object\nblob_client = container_client.get_blob_client(\"myblob.txt\")\nproperties = blob_client.get_blob_properties()\n\n# Access properties as Python attributes\nprint(f\"Blob name: {properties.name}\")\nprint(f\"Blob size: {properties.size} bytes\")\nprint(f\"Last modified: {properties.last_modified}\")\n```\n\n### Where the data comes from\n\nUnderstanding the data flow helps you appreciate what the SDK does behind the scenes:\n\n- **Your code calls an SDK method:** You invoke a method like `get_blob_properties()`.\n- **The SDK constructs an HTTP request:** The SDK builds the appropriate HTTP request with headers, authentication, and query parameters.\n- **The Azure service responds:** The service returns an HTTP response, typically with a JSON payload in the response body.\n- **The SDK processes the response:** The SDK:\n  - Checks the HTTP status code.\n  - Parses the response body (usually JSON).\n  - Validates the data against expected schemas.\n  - Maps the data to Python model objects.\n- **Your code receives Python objects:** You work with the deserialized objects, not raw HTTP data.\n\nThis abstraction allows you to focus on your application logic rather than HTTP protocol details.\n\n## Common response types\n\nThe Azure SDK for Python uses several standard response types across all services. Understanding these types helps you work effectively with any Azure service.\n\n### Resource models\n\nMost SDK operations return resource models. These Python objects represent Azure resources. The models are service specific but follow consistent patterns:\n\n```python\n# Azure Key Vault example\nfrom azure.keyvault.secrets import SecretClient\n\nsecret_client = SecretClient(vault_url=vault_url, credential=credential)\nsecret = secret_client.get_secret(\"mysecret\")  # Returns KeyVaultSecret\n\nprint(f\"Secret name: {secret.name}\")\nprint(f\"Secret value: {secret.value}\")\nprint(f\"Secret version: {secret.properties.version}\")\n\n# Azure Cosmos DB example\nfrom azure.cosmos import CosmosClient\n\ncosmos_client = CosmosClient(url=cosmos_url, credential=credential)\ndatabase = cosmos_client.get_database_client(\"mydatabase\")\ncontainer = database.get_container_client(\"mycontainer\")\nitem = container.read_item(item=\"item-id\", partition_key=\"partition-value\")  # Returns dict\n\nprint(f\"Item ID: {item['id']}\")\n```\n\n### ItemPaged for collection results\n\nWhen the SDK lists resources, it returns `ItemPaged` objects that handle pagination transparently:\n\n```python\nfrom azure.storage.blob import BlobServiceClient\nfrom azure.core.paging import ItemPaged\n\nblob_service_client = BlobServiceClient.from_connection_string(connection_string)\ncontainer_client = blob_service_client.get_container_client(\"mycontainer\")\n\n# list_blobs returns ItemPaged[BlobProperties]\nblobs: ItemPaged[BlobProperties] = container_client.list_blobs()\n\n# Iterate naturally - SDK handles pagination\nfor blob in blobs:\n    print(f\"Blob: {blob.name}, Size: {blob.size}\")\n```\n\n## Access the raw HTTP response\n\nWhile the SDK's high-level abstractions meet most needs, you sometimes need access to the underlying HTTP response. Common scenarios include:\n\n- Debugging failed requests.\n- Accessing custom response headers.\n- Implementing custom retry logic.\n- Working with nonstandard response formats.\n\nMost SDK methods accept a `raw_response_hook` parameter:\n\n```python\nfrom azure.keyvault.secrets import SecretClient\n\nsecret_client = SecretClient(vault_url=vault_url, credential=credential)\n\ndef inspect_response(response):\n    # Access the raw HTTP response\n    print(f\"Request URL: {response.http_request.url}\")\n    print(f\"Status code: {response.http_response.status_code}\")\n    print(f\"Response headers: {dict(response.http_response.headers)}\")\n    \n    # Access custom headers\n    request_id = response.http_response.headers.get('x-ms-request-id')\n    print(f\"Request ID: {request_id}\")\n    \n    # Must return the response\n    return response\n\n# Hook is called before deserialization\nsecret = secret_client.get_secret(\"mysecret\", raw_response_hook=inspect_response)\n```\n\n## Paging and iterators\n\nAzure services often return large collections of resources. The SDK uses `ItemPaged` to handle these collections efficiently without loading everything into memory at once.\n\n### Automatic pagination\n\nThe SDK automatically fetches new pages as you iterate:\n\n```python\n# List all blobs - could be thousands\nblobs = container_client.list_blobs()\n\n# SDK fetches pages as needed during iteration\nfor blob in blobs:\n    process_blob(blob)  # Pages loaded on-demand\n```\n\n### Work with pages explicitly\n\nYou can also work with pages directly when needed:\n\n```python\nblobs = container_client.list_blobs()\n\n# Process by page\nfor page in blobs.by_page():\n    print(f\"Processing page with {len(list(page))} items\")\n    for blob in page:\n        process_blob(blob)\n```\n\n### Control page size\n\nMany list operations accept a `results_per_page` parameter:\n\n```python\n# Fetch 100 items per page instead of the default\nblobs = container_client.list_blobs(results_per_page=100)\n```\n\nSome methods for some Azure services have other mechanisms for controlling page size. For example, Azure Key Vault and Azure Search use the `top` kwarg to limit results per call. For an example that uses the Azure Search `search()` method, see the [source code](https://github.com/Azure/azure-sdk-for-python/blob/0cf4523c054fc793c6ce46616daa5e23f9607d33/sdk/search/azure-search-documents/azure/search/documents/_search_client.py#L174).\n\n## Special case: Long-running operations and pollers\n\nSome Azure operations can't complete immediately. Examples include:\n\n- Creating or deleting virtual machines.\n- Deploying Azure Resource Manager templates.\n- Training machine learning models.\n- Copying large blobs.\n\nThese operations return poller objects that track the operation's progress.\n\n### Work with pollers\n\n```python\nfrom azure.mgmt.storage import StorageManagementClient\n\nstorage_client = StorageManagementClient(credential, subscription_id)\n\n# Start storage account creation\npoller = storage_client.storage_accounts.begin_create(\n    resource_group_name=\"myresourcegroup\",\n    account_name=\"mystorageaccount\",\n    parameters=storage_parameters\n)\n\n# Option 1: Wait for completion (blocking)\nstorage_account = poller.result()\n\n# Option 2: Check status periodically\nwhile not poller.done():\n    print(f\"Status: {poller.status()}\")\n    time.sleep(5)\n\nstorage_account = poller.result()\n```\n\n### Asynchronous pollers\n\nWhen you use async/await patterns, you work with `AsyncLROPoller`:\n\n```python\nfrom azure.storage.blob.aio import BlobServiceClient\n\nasync with BlobServiceClient.from_connection_string(connection_string) as client:\n    container_client = client.get_container_client(\"mycontainer\")\n    \n    # Start async copy operation\n    blob_client = container_client.get_blob_client(\"large-blob.vhd\")\n    poller = await blob_client.begin_copy_from_url(source_url)\n    \n    # Wait for async completion\n    copy_properties = await poller.result()\n```\n\n### Polling objects for long-running operations example: Virtual machines\n\nDeploying virtual machines is an example of an operation that takes time to complete and handles it by returning poller objects (`LROPoller` for synchronous code, `AsyncLROPoller` for asynchronous code):\n\n```python\nfrom azure.mgmt.compute import ComputeManagementClient\nfrom azure.core.polling import LROPoller\n\ncompute_client = ComputeManagementClient(credential, subscription_id)\n\n# Start VM creation - returns immediately with a poller\npoller: LROPoller = compute_client.virtual_machines.begin_create_or_update(\n    resource_group_name=\"myresourcegroup\",\n    vm_name=\"myvm\",\n    parameters=vm_parameters\n)\n\n# Wait for completion and get the result\nvm = poller.result()  # Blocks until operation completes\nprint(f\"VM {vm.name} provisioned successfully\")\n```\n\n### Access response for paged results\n\nFor paged results, use the `by_page()` method with `raw_response_hook`:\n\n```python\ndef page_response_hook(response):\n    continuation_token = response.http_response.headers.get('x-ms-continuation')\n    print(f\"Continuation token: {continuation_token}\")\n    return response\n\nblobs = container_client.list_blobs()\nfor page in blobs.by_page(raw_response_hook=page_response_hook):\n    for blob in page:\n        print(blob.name)\n```\n\n## Best practices\n\n- **Prefer high-level abstractions.**\n- **Work with the SDK's resource models rather than raw responses whenever possible.**\n- **Avoid accessing any method prefixed with an underscore (_).** By convention, those methods are private in Python. There are no guarantees about issues like breaking changes compared to public APIs:\n\n  ```python\n  # Preferred: Work with typed objects\n  secret = secret_client.get_secret(\"mysecret\")\n  if secret.properties.enabled:\n      use_secret(secret.value)\n\n  # Avoid: Manual JSON parsing (unless necessary) ...\n  # AND avoid accessing any objects or methods that start with `_`\n  response = secret_client._client.get(...)  # Don't access internal clients\n  data = json.loads(response.text)\n  if data['attributes']['enabled']:\n      use_secret(data['value'])\n  ```\n\n- **Handle pagination properly.** Always iterate over paged results instead of converting to a list:\n\n  ```python\n  # Good: Memory-efficient iteration\n  for blob in container_client.list_blobs():\n      process_blob(blob)\n  \n  # Avoid: Loading everything into memory\n  all_blobs = list(container_client.list_blobs())  # Could consume excessive memory\n  ```\n\n- **Use poller.result() for long-running operations.** Always use the `result()` method to ensure that operations complete successfully:\n\n  ```python\n  # Correct: Wait for operation completion\n  poller = compute_client.virtual_machines.begin_delete(\n      resource_group_name=\"myresourcegroup\",\n      vm_name=\"myvm\"\n  )\n  poller.result()  # Ensures deletion completes\n  print(\"VM deleted successfully\")\n  \n  # Wrong: Assuming immediate completion\n  poller = compute_client.virtual_machines.begin_delete(...)\n  print(\"VM deleted successfully\")  # Deletion might still be in progress!\n  ```\n\n- **Access raw responses only when needed.** Use raw response access sparingly and only for specific requirements:\n\n  ```python\n  # Good use case: Debugging or logging\n  def log_request_id(response):\n      request_id = response.http_response.headers.get('x-ms-request-id')\n      logger.info(f\"Operation request ID: {request_id}\")\n      return response\n  \n  blob_client.upload_blob(data, raw_response_hook=log_request_id)\n  \n  # Good use case: Custom error handling\n  def check_custom_header(response):\n      if response.http_response.headers.get('x-custom-error'):\n          raise CustomApplicationError(\"Custom error condition detected\")\n      return response\n  ```\n"
  },
  {
    "path": "articles/python/sdk/fundamentals/errors.md",
    "content": "---\ntitle: Handle Errors Produced by the Azure SDK for Python\ndescription: Learn about the Azure SDK for Python's comprehensive error model designed to help developers build resilient applications.\nms.date: 7/15/2025\nms.topic: concept-article\nms.custom: devx-track-python\n---\n\n# Handle errors produced by the Azure SDK for Python\n\nBuilding reliable cloud applications requires more than just implementing features. It also demands robust error-handling strategies. When you work with distributed systems and cloud services, your application must be prepared to handle failure scenarios gracefully.\n\nThe Azure SDK for Python provides a comprehensive error model designed to help developers build resilient applications. Understanding this error model is crucial for:\n\n- Improving application reliability by anticipating and handling common failure scenarios.\n- Enhancing user experience through meaningful error messages and graceful degradation.\n- Simplifying troubleshooting by capturing and logging relevant diagnostic information.\n\nThis article explores the Azure SDK for Python's error architecture and provides practical guidance for implementing effective error handling in your applications.\n\n## How the Azure SDK for Python models errors\n\nThe Azure SDK for Python uses a hierarchical exception model that provides general and specific error-handling capabilities. At the core of this model is `AzureError`, which serves as the base exception class for all errors related to the Azure SDK.\n\n### Exception hierarchy\n\n```\nAzureError\n├── ClientAuthenticationError\n├── ResourceNotFoundError\n├── ResourceExistsError\n├── ResourceModifiedError\n├── ResourceNotModifiedError\n├── ServiceRequestError\n├── ServiceResponseError\n└── HttpResponseError\n```\n\n### Key exception types\n\n|Error|Description|\n|---|---|\n|`AzureError`|The base exception class for all Azure SDK errors. Use this exception as a catchall when you need to handle any Azure-related error.|\n|`ClientAuthenticationError`|Raised when authentication fails. Common causes include invalid credentials, expired tokens, and misconfigured authentication settings.|\n|`ResourceNotFoundError`|Raised when attempting to access a resource that doesn't exist. This exception typically corresponds to HTTP 404 responses.|\n|`ResourceExistsError`|Raised when attempting to create a resource that already exists. This exception helps prevent accidental overwrites.|\n|`ServiceRequestError`|Raised when the SDK can't send a request to the service. Common causes include network connectivity issues, Domain Name System resolution failures, and invalid service endpoints.|\n|`ServiceResponseError`|Raised when the service returns an unexpected response that the SDK can't process.|\n|`HttpResponseError`|Raised for HTTP error responses (4xx and 5xx status codes). This exception provides access to the underlying HTTP response details.|\n\n## Common error scenarios\n\nUnderstanding typical error scenarios helps you implement appropriate handling strategies for each situation.\n\n### Authentication and authorization errors\n\nAuthentication failures occur when the SDK can't verify your identity:\n\n```python\nfrom azure.core.exceptions import ClientAuthenticationError\nfrom azure.identity import DefaultAzureCredential\nfrom azure.storage.blob import BlobServiceClient\n\ntry:\n    credential = DefaultAzureCredential()\n    blob_service = BlobServiceClient(\n        account_url=\"https://myaccount.blob.core.windows.net\",\n        credential=credential\n    )\n    # Attempt to list containers\n    containers = blob_service.list_containers()\nexcept ClientAuthenticationError as e:\n    print(f\"Authentication failed: {e.message}\")\n    # Don't retry - fix credentials first\n```\n\nAuthorization errors (typically `HttpResponseError` with `403` status) occur when you lack permissions:\n\n```python\nfrom azure.core.exceptions import HttpResponseError\n\ntry:\n    blob_client.upload_blob(data)\nexcept HttpResponseError as e:\n    if e.status_code == 403:\n        print(\"Access denied. Check your permissions.\")\n    else:\n        raise\n```\n\n### Resource errors\n\nHandle missing resources gracefully:\n\n```python\nfrom azure.core.exceptions import ResourceNotFoundError\n\ntry:\n    blob_client = container_client.get_blob_client(\"myblob.txt\")\n    content = blob_client.download_blob().readall()\nexcept ResourceNotFoundError:\n    print(\"Blob not found. Using default content.\")\n    content = b\"default\"\n```\n\nPrevent duplicate resource creation:\n\n```python\nfrom azure.core.exceptions import ResourceExistsError\n\ntry:\n    container_client.create_container()\nexcept ResourceExistsError:\n    print(\"Container already exists.\")\n    # Continue with existing container\n```\n\n### Server errors\n\nHandle server-side failures appropriately:\n\n```python\nfrom azure.core.exceptions import HttpResponseError\n\ntry:\n    result = client.process_data(large_dataset)\nexcept HttpResponseError as e:\n    if 500 <= e.status_code < 600:\n        print(f\"Server error ({e.status_code}). The service may be temporarily unavailable.\")\n        # Consider retry logic here\n    else:\n        raise\n```\n\n## Best practices for error handling\n\n- **Use specific exception handling:** Always catch specific exceptions before falling back to general ones:\n\n  ```python\n  from azure.core.exceptions import (\n      AzureError,\n      ClientAuthenticationError,\n      ResourceNotFoundError,\n      HttpResponseError\n  )\n  \n  try:\n      # Azure SDK operation\n      result = client.get_resource()\n  except ClientAuthenticationError:\n      # Handle authentication issues\n      print(\"Please check your credentials\")\n  except ResourceNotFoundError:\n      # Handle missing resources\n      print(\"Resource not found\")\n  except HttpResponseError as e:\n      # Handle specific HTTP errors\n      if e.status_code == 429:\n          print(\"Rate limited. Please retry later.\")\n      else:\n          print(f\"HTTP error {e.status_code}: {e.message}\")\n  except AzureError as e:\n      # Catch-all for other Azure errors\n      print(f\"Azure operation failed: {e}\")\n  ```\n\n- **Implement appropriate retry strategies:** Some errors warrant retry attempts, while others don't.\n\n  Don't retry on:\n  \n  - 401 Unauthorized (authentication failures)\n  - 403 Forbidden (authorization failures)\n  - 400 Bad Request (client errors)\n  - 404 Not Found (unless you expect the resource to appear)\n  \n  Consider retrying on:\n  \n  - 408 Request Timeout\n  - 429 Too Many Requests (with appropriate backoff)\n  - 500 Internal Server Error\n  - 502 Bad Gateway\n  - 503 Service Unavailable\n  - 504 Gateway Timeout\n\n- **Extract meaningful error information**\n\n  ```python\n  from azure.core.exceptions import HttpResponseError\n  \n  try:\n      client.perform_operation()\n  except HttpResponseError as e:\n      # Extract detailed error information\n      print(f\"Status code: {e.status_code}\")\n      print(f\"Error message: {e.message}\")\n      print(f\"Error code: {e.error.code if e.error else 'N/A'}\")\n      \n      # Request ID is crucial for Azure support\n      if hasattr(e, 'response') and e.response:\n          request_id = e.response.headers.get('x-ms-request-id')\n          print(f\"Request ID: {request_id}\")\n  ```\n\n## Retry policies and resilience\n\nThe Azure SDK includes built-in retry mechanisms that handle transient failures automatically.\n\n### Default retry behavior\n\nMost Azure SDK clients include default retry policies that:\n\n- Retry on connection errors and specific HTTP status codes.\n- Use exponential backoff with jitter.\n- Limit the number of retry attempts.\n\n### Customize retry policies\n\nIf the default behavior doesn't suit your use case, you can customize the retry policy:\n\n```python\nfrom azure.storage.blob import BlobServiceClient\nfrom azure.core.pipeline.policies import RetryPolicy\n\n# Create a custom retry policy\nretry_policy = RetryPolicy(\n    retry_total=5,  # Maximum retry attempts\n    retry_backoff_factor=2,  # Exponential backoff factor\n    retry_backoff_max=60,  # Maximum backoff time in seconds\n    retry_on_status_codes=[408, 429, 500, 502, 503, 504]\n)\n\n# Apply to client\nblob_service = BlobServiceClient(\n    account_url=\"https://myaccount.blob.core.windows.net\",\n    credential=credential,\n    retry_policy=retry_policy\n)\n```\n\n### Avoid handling network and timeout errors with custom loops\n\nTry to use built-in retries for network and timeout errors before you implement your own custom logic.\n\n```python\nfrom azure.core.exceptions import ServiceRequestError\nimport time\n\n# Avoid this approach if possible\nmax_retries = 3\nretry_count = 0\n\nwhile retry_count < max_retries:\n    try:\n        response = client.get_secret(\"mysecret\")\n        break\n    except ServiceRequestError as e:\n        retry_count += 1\n        if retry_count >= max_retries:\n            raise\n        print(f\"Network error. Retrying... ({retry_count}/{max_retries})\")\n        time.sleep(2 ** retry_count)  # Exponential backoff\n```\n\n### Implement circuit breaker patterns\n\nFor critical operations, consider implementing circuit breaker patterns:\n\n```python\nclass CircuitBreaker:\n    def __init__(self, failure_threshold=5, recovery_timeout=60):\n        self.failure_threshold = failure_threshold\n        self.recovery_timeout = recovery_timeout\n        self.failure_count = 0\n        self.last_failure_time = None\n        self.state = 'closed'  # closed, open, half-open\n    \n    def call(self, func, *args, **kwargs):\n        if self.state == 'open':\n            if time.time() - self.last_failure_time > self.recovery_timeout:\n                self.state = 'half-open'\n            else:\n                raise Exception(\"Circuit breaker is open\")\n        \n        try:\n            result = func(*args, **kwargs)\n            if self.state == 'half-open':\n                self.state = 'closed'\n                self.failure_count = 0\n            return result\n        except Exception as e:\n            self.failure_count += 1\n            self.last_failure_time = time.time()\n            \n            if self.failure_count >= self.failure_threshold:\n                self.state = 'open'\n            \n            raise e\n```\n\n### Understand error messages and codes\n\nAzure services return structured error responses that provide valuable debugging information.\n\n- **Parse error responses**\n\n  ```python\n  from azure.core.exceptions import HttpResponseError\n  import json\n  \n  try:\n      client.create_resource(resource_data)\n  except HttpResponseError as e:\n      # Many Azure services return JSON error details\n      if e.response and e.response.text():\n          try:\n              error_detail = json.loads(e.response.text())\n              print(f\"Error code: {error_detail.get('error', {}).get('code')}\")\n              print(f\"Error message: {error_detail.get('error', {}).get('message')}\")\n              \n              # Some services provide additional details\n              if 'details' in error_detail.get('error', {}):\n                  for detail in error_detail['error']['details']:\n                      print(f\"  - {detail.get('code')}: {detail.get('message')}\")\n          except json.JSONDecodeError:\n              print(f\"Raw error: {e.response.text()}\")\n  ```\n\n- **Capture diagnostic information:** Always capture key diagnostic information for troubleshooting:\n\n  ```python\n  import logging\n  from azure.core.exceptions import AzureError\n  \n  logger = logging.getLogger(__name__)\n  \n  try:\n      result = client.perform_operation()\n  except AzureError as e:\n      # Log comprehensive error information\n      logger.error(\n          \"Azure operation failed\",\n          extra={\n              'error_type': type(e).__name__,\n              'error_message': str(e),\n              'operation': 'perform_operation',\n              'timestamp': datetime.utcnow().isoformat(),\n              'request_id': getattr(e.response, 'headers', {}).get('x-ms-request-id') if hasattr(e, 'response') else None\n          }\n      )\n      raise\n  ```\n\n- **Logging and diagnostics:** Enable SDK-level logging for detailed troubleshooting:\n\n  ```python\n  import logging\n  import sys\n  \n  # Configure logging for Azure SDKs\n  logging.basicConfig(level=logging.DEBUG)\n  \n  # Enable HTTP request/response logging\n  logging.getLogger('azure.core.pipeline.policies.http_logging_policy').setLevel(logging.DEBUG)\n  \n  # For specific services\n  logging.getLogger('azure.storage.blob').setLevel(logging.DEBUG)\n  logging.getLogger('azure.identity').setLevel(logging.DEBUG)\n  ```\n\n  For more information about logging, see [Configure logging in the Azure libraries for Python](../azure-sdk-logging.md).\n\n- **Use network tracing:** For deep debugging, enable network-level tracing:\n\n  > [!IMPORTANT]\n  > HTTP logging can include sensitive information such as account keys in headers and other credentials. Be sure to protect these logs to avoid compromising security.\n\n  ```python\n  from azure.storage.blob import BlobServiceClient\n  \n  # Enable network tracing\n  blob_service = BlobServiceClient(\n      account_url=\"https://myaccount.blob.core.windows.net\",\n      credential=credential,\n      logging_enable=True,  # Enable logging\n      logging_body=True     # Log request/response bodies (careful with sensitive data)\n  )\n  ```\n\n### Special considerations for async programming\n\nWhen you use async clients, error handling requires special attention.\n\n- **Basic async error handling**\n\n  ```python\n  import asyncio\n  from azure.core.exceptions import AzureError\n  \n  async def get_secret_async(client, secret_name):\n      try:\n          secret = await client.get_secret(secret_name)\n          return secret.value\n      except ResourceNotFoundError:\n          print(f\"Secret '{secret_name}' not found\")\n          return None\n      except AzureError as e:\n          print(f\"Error retrieving secret: {e}\")\n          raise\n  ```\n\n- **Handle cancellations**\n\n  ```python\n  async def long_running_operation(client):\n      try:\n          result = await client.start_long_operation()\n          # Wait for completion\n          final_result = await result.result()\n          return final_result\n      except asyncio.CancelledError:\n          print(\"Operation cancelled\")\n          # Cleanup if necessary\n          if hasattr(result, 'cancel'):\n              await result.cancel()\n          raise\n      except AzureError as e:\n          print(f\"Operation failed: {e}\")\n          raise\n  ```\n\n- **Concurrent error handling**\n\n  ```python\n  async def process_multiple_resources(client, resource_ids):\n      tasks = []\n      for resource_id in resource_ids:\n          task = client.get_resource(resource_id)\n          tasks.append(task)\n      \n      results = []\n      errors = []\n      \n      # Use gather with return_exceptions to handle partial failures\n      outcomes = await asyncio.gather(*tasks, return_exceptions=True)\n      \n      for resource_id, outcome in zip(resource_ids, outcomes):\n          if isinstance(outcome, Exception):\n              errors.append((resource_id, outcome))\n          else:\n              results.append(outcome)\n      \n      # Process successful results and errors appropriately\n      if errors:\n          print(f\"Failed to process {len(errors)} resources\")\n          for resource_id, error in errors:\n              print(f\"  - {resource_id}: {error}\")\n      \n      return results\n  ```\n\n## Summary of best practices\n\nEffective error handling in Azure SDK for Python applications requires you to:\n\n- **Anticipate failures:** Cloud applications must expect and handle partial failures gracefully.\n- **Use specific exception handling:** Catch specific exceptions like `ResourceNotFoundError` and `ClientAuthenticationError` before falling back to general `AzureError` handling.\n- **Implement smart retry logic:** Use built-in retry policies or customize them based on your needs. Remember that not all errors should trigger retries.\n- **Capture diagnostic information:** Always log request IDs, error codes, and time stamps for effective troubleshooting.\n- **Provide meaningful user feedback:** Transform technical errors into user-friendly messages while you preserve technical details for support.\n- **Test error scenarios:** Include error handling in your test coverage to ensure that your application behaves correctly under failure conditions.\n\n## Related content\n\n- Review the [Azure Core exceptions Module reference](/python/api/azure-core/azure.core.exceptions).\n- Learn about [troubleshooting authentication and authorization issues](../authentication/overview.md).\n- Explore [Azure Monitor OpenTelemetry](/azure/azure-monitor/app/opentelemetry-enable?tabs=python) for comprehensive application monitoring.\n"
  },
  {
    "path": "articles/python/sdk/fundamentals/http-pipeline-retries.md",
    "content": "---\ntitle: HTTP Pipeline and Retries in the Azure SDK Libraries for Python\ndescription: Learn how requests and responses flow through the HTTP pipeline when you use the Azure SDK for Python and how to create policies to modify the flow.\nms.date: 7/16/2025\nms.topic: concept-article\nms.custom: devx-track-python, py-fresh-zinc\n---\n\n# Understand the HTTP pipeline and retries in the Azure SDK for Python\n\nWhen you make a call to any Azure service by using the Azure SDK for Python, your request doesn't go directly to the Azure service. It doesn't matter whether it's Azure Blob Storage, Azure Key Vault, Azure Cosmos DB, or any other HTTP-based service. Instead, your request flows through a sophisticated HTTP pipeline that handles critical cross-cutting concerns automatically.\n\nUnderstanding how the HTTP pipeline works is essential for building robust, performant applications. The pipeline:\n\n- Manages retries for transient failures.\n- Handles authentication.\n- Provides logging capabilities.\n- Enables you to add custom behavior when needed.\n\nThis knowledge helps you debug performance issues, optimize resiliency, and customize your application's interaction with Azure services.\n\n## What is the HTTP pipeline?\n\nThe Azure SDK for Python uses an internal HTTP pipeline architecture to process all requests and responses. This pipeline consists of a series of policies that execute in sequence. Each policy is responsible for a specific aspect of the HTTP communication. Think of the pipeline as a chain of processing steps:\n\n```ascii\nClient Request → Retry Policy → Authentication Policy → Logging Policy → HTTP Transport → Azure Service\n                                                                                              ↓\nClient Response ← Retry Policy ← Authentication Policy ← Logging Policy ← HTTP Transport ← Response\n```\n\nEach policy in the pipeline can:\n\n- Modify the request before it's sent.\n- Process the response after it's received.\n- Perform actions like retrying failed requests.\n- Add headers, log information, or implement custom logic.\n\n## Key policies in the pipeline\n\nThe Azure SDK for Python includes several built-in policies that handle common scenarios:\n\n- `RetryPolicy`: Automatically retries requests that fail because of transient errors. This policy implements intelligent retry logic with exponential backoff to avoid overwhelming services during outages.\n- `BearerTokenCredentialPolicy`: Manages authentication by automatically acquiring and refreshing access tokens. This policy ensures that your requests include valid authentication credentials without manual token management.\n- `NetworkTraceLoggingPolicy`: Captures detailed information about HTTP requests and responses for debugging purposes. This policy is invaluable when you troubleshoot communication issues.\n- `HttpTransport`: The lowest layer of the pipeline that actually sends HTTP requests over the network. In the Azure SDK for Python, this policy is typically implemented by using requests or aiohttp for asynchronous operations.\n\n### Other policies\n\n- `RedirectPolicy`: Handles HTTP redirects automatically.\n- `DistributedTracingPolicy`: Integrates with distributed tracing systems for monitoring.\n- `ProxyPolicy`: Routes requests through HTTP proxies when configured.\n- `UserAgentPolicy`: Adds SDK version information to request headers.\n\n## Retry behavior\n\nThe Azure SDK for Python implements intelligent retry logic to handle transient failures automatically. Understanding this behavior helps you build more resilient applications.\n\n### Automatically retried conditions\n\nThe SDK retries requests for these HTTP status codes:\n\n- **408 Request Timeout**: The server timed out waiting for the request.\n- **429 Too Many Requests**: Rate limiting is in effect.\n- **500 Internal Server Error**: Temporary server issue.\n- **502 Bad Gateway**: Temporary network issue.\n- **503 Service Unavailable**: Service temporarily unavailable.\n- **504 Gateway Timeout**: Gateway or proxy timeout.\n\n### Default retry configuration\n\nThe default retry settings provide a good balance between resilience and performance:\n\n- **Maximum retry attempts**: 3\n- **Retry mode**: Exponential backoff\n- **Base delay**: 0.8 seconds\n- **Maximum delay**: 60 seconds\n- **Maximum total retry time**: 120 seconds\n\nThe exponential backoff calculation follows this pattern:\n\n```python\ndelay = min(base_delay * (2 ** retry_attempt), max_delay)\n```\n\n### Customize retries\n\nYou can customize retry behavior when you create SDK clients to match your application's specific requirements.\n\n```python\nfrom azure.storage.blob import BlobServiceClient\nfrom azure.core.pipeline.policies import RetryPolicy\n\n# Custom retry configuration\nretry_policy = RetryPolicy(\n    retry_total=5,                    # Maximum number of retry attempts\n    retry_backoff_factor=0.5,         # Base backoff time in seconds\n    retry_backoff_max=120,            # Maximum backoff time in seconds\n    retry_on_status_codes=[429, 500, 502, 503, 504]  # HTTP status codes to retry\n)\n\n# Apply custom retry policy to client\nclient = BlobServiceClient(\n    account_url=\"https://myaccount.blob.core.windows.net\",\n    credential=credential,\n    retry_policy=retry_policy\n)\n```\n\n### Disable retries\n\nFor scenarios where retries aren't appropriate:\n\n```python\nfrom azure.core.pipeline.policies import RetryPolicy\n\n# Disable retries completely\nno_retry_policy = RetryPolicy(retry_total=0)\n\nclient = BlobServiceClient(\n    account_url=\"https://myaccount.blob.core.windows.net\",\n    credential=credential,\n    retry_policy=no_retry_policy\n)\n```\n\n## Diagnose and debug retry behavior\n\nUnderstanding when and why retries occur is crucial for troubleshooting performance issues.\n\n### Enable SDK logging\n\nThe Azure SDK for Python uses Python's standard logging framework:\n\n```python\nimport logging\nimport sys\n\n# Configure logging to see retry attempts\nlogging.basicConfig(\n    level=logging.DEBUG,\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n    stream=sys.stdout\n)\n\n# Enable specific Azure SDK loggers\nazure_logger = logging.getLogger('azure')\nazure_logger.setLevel(logging.DEBUG)\n\n# Now SDK operations will log retry attempts\n```\n\n## Identify retry patterns\n\nLook for log entries like:\n\n```output\nRetry attempt 1 for request [GET] https://myaccount.blob.core.windows.net/container/blob\nWaiting 0.8 seconds before retry\n```\n\n## Common retry pitfalls\n\n- **Retrying non-transient errors:** The SDK doesn't retry client errors (4xx) except for 408 and 429.\n- **Ignoring retry latency:** Remember that retries add latency to failed operations.\n- **Providing insufficient timeout:** Ensure that your overall operation timeout accounts for retry delays.\n\n## Advanced: Add custom policies\n\nYou can extend the pipeline with custom policies for specialized scenarios.\n\n### Create a custom policy\n\n```python\nfrom azure.core.pipeline import PipelineRequest, PipelineResponse\nfrom azure.core.pipeline.policies import HTTPPolicy\nfrom typing import Any, Optional\n\nclass CustomTelemetryPolicy(HTTPPolicy):\n    \"\"\"Custom policy to add telemetry headers\"\"\"\n    \n    def send(self, request: PipelineRequest) -> PipelineResponse:\n        # Add custom header before sending request\n        request.http_request.headers['X-Custom-Telemetry'] = 'my-app-v1.0'\n        \n        # Continue with the pipeline\n        response = self.next.send(request)\n        \n        # Log response time\n        print(f\"Request to {request.http_request.url} completed\")\n        \n        return response\n```\n\n### Apply custom policies\n\n```python\nfrom azure.storage.blob import BlobServiceClient\n\n# Create client with custom policy\nclient = BlobServiceClient(\n    account_url=\"https://myaccount.blob.core.windows.net\",\n    credential=credential,\n    per_call_policies=[CustomTelemetryPolicy()],  # Policies that run per request\n    per_retry_policies=[]  # Policies that run per retry attempt\n)\n```\n\n## Policy ordering\n\nPolicies execute in a specific order:\n\n- Per-call policies (execute once per operation).\n- Retry policy.\n- Per-retry policies (execute on each attempt).\n- Authentication policy.\n- HTTP transport.\n\n## Best practices\n\n### Use default settings when possible\n\nThe default retry configuration works well for most scenarios. Only customize when you have specific requirements.\n\n### Customization guidelines\n\nWhen you customize retry behavior:\n\n- **Use exponential backoff:** Use to prevent overwhelming services during recovery.\n- **Set reasonable limits:** Cap total retry time to prevent indefinite waiting.\n- **Monitor retry metrics:** Track retry rates in production to identify issues.\n- **Consider circuit breakers:** Implement circuit breaker patterns for high-volume scenarios.\n\n### What not to retry\n\nAvoid retrying these types of errors:\n\n- **Authentication failures (401, 403):** Authentication errors require fixing credentials, not retrying.\n- **Client errors (400, 404):** Client errors indicate problems with the request itself.\n- **Business logic errors:** Application-specific errors that don't resolve with retries.\n\n## Operational excellence\n\n- **Log correlation IDs:** Include `x-ms-client-request-id` in logs for Azure support.\n- **Set appropriate timeouts:** Balance between reliability and user experience.\n- **Test retry behavior:** Verify your application handles retries gracefully.\n- **Monitor performance:** Track P95/P99 latencies (percentile-based latency metrics) including retry overhead.\n\n## Related content\n\n- [Implement resilient applications](/azure/well-architected/reliability/)\n"
  },
  {
    "path": "articles/python/sdk/fundamentals/language-design-guidelines.md",
    "content": "---\ntitle: Azure SDK Language Design Guidelines for Python\ndescription: Learn about the Azure SDK Language Design Guidelines for Python and how they promote consistency which easy usability across the entire SDK surface.\nms.date: 7/15/2025\nms.topic: concept-article\nms.custom: devx-track-python\n---\n\n# Azure SDK Language Design Guidelines for Python\n\nAzure SDK Language Design Guidelines are comprehensive standards that ensure consistency, predictability, and ease of use across all Azure SDKs. These guidelines help developers work efficiently with Azure services by providing familiar patterns and behaviors across different services and programming languages.\n\nThe guidelines consist of two categories:\n\n- **General Guidelines**: Core principles that apply to all Azure SDKs regardless of programming language.\n- **Language-Specific Guidelines**: Implementation details optimized for each supported language, including [Python](https://azure.github.io/azure-sdk/python_design.html), [.NET](https://azure.github.io/azure-sdk/dotnet_introduction.html), [Java](https://azure.github.io/azure-sdk/java_introduction.html), [TypeScript](https://azure.github.io/azure-sdk/typescript_introduction.html), and many more. For more information, see the Table of Contents starting on the [General Guidelines: Introduction](https://azure.github.io/azure-sdk/general_introduction.html) page.\n\nThese guidelines are developed openly on GitHub, which allows for community review and contribution.\n\n## General design principles\n\nAll Azure SDKs follow these fundamental principles:\n\n|Principle|Description|\n|---|---|\n|Idiomatic usage|SDKs follow language-specific conventions and patterns.|\n|Consistency|Behaviors are uniform across different Azure services.|\n|Simplicity|Common tasks require minimal code.|\n|Progressive disclosure|Advanced features are available but don't complicate basic usage.|\n|Robustness|Handling is built in for errors, retries, and timeouts.|\n\n## Python-specific guidelines\n\nThe rest of this document focuses on the [Python guidelines](https://azure.github.io/azure-sdk/python_design.html).\n\n### Naming conventions\n\nAzure SDKs for Python follow standard Python naming conventions:\n\n- **Methods**: Use `snake_case`.\n\n  ```python\n  list_containers()\n  get_secret()\n  create_database()\n  ```\n\n- **Variables**: Use `snake_case`.\n\n  ```python\n  connection_string = \"...\"\n  retry_count = 3\n  ```\n\n- **Classes**: Use `PascalCase`.\n\n  ```python\n  BlobServiceClient\n  SecretClient\n  CosmosClient\n  ```\n\n- **Constants**: Use `UPPER_CASE`.\n\n  ```python\n  DEFAULT_CHUNK_SIZE\n  MAX_RETRIES\n  ```\n\n### Package structure\n\nAzure SDK packages follow a consistent structure:\n\n```ascii\nazure-<service>-<feature>\n├── azure/\n│   └── <service>/\n│       ├── __init__.py\n│       ├── _client.py\n│       ├── _models.py\n│       └── aio/           # Async implementations\n│           └── __init__.py\n```\n\n### Client instantiation\n\nClients provide multiple instantiation methods:\n\n```python\nfrom azure.storage.blob import BlobServiceClient\nfrom azure.identity import DefaultAzureCredential\n\n# Note: Do not use connection string if you can possibly avoid it!\n\n# Using account URL and credential\ncredential = DefaultAzureCredential()\nclient = BlobServiceClient(account_url=\"https://account.blob.core.windows.net\", \n                          credential=credential)\n\n```\n\n### Authentication\n\nAzure SDKs use consistent authentication patterns:\n\n```python\nfrom azure.identity import DefaultAzureCredential, ClientSecretCredential\n\n# Default credential chain\ncredential = DefaultAzureCredential()\n\n# Explicit credential\ncredential = ClientSecretCredential(\n    tenant_id=\"tenant-id\",\n    client_id=\"client-id\",\n    client_secret=\"secret\"\n)\n```\n\n### Context managers\n\nMost Azure SDK clients implement context manager protocols for automatic resource cleanup:\n\n```python\nfrom azure.storage.blob import BlobServiceClient\n\n# Automatic cleanup with context manager\nwith BlobServiceClient.from_connection_string(conn_str) as client:\n    container_client = client.get_container_client(\"mycontainer\")\n    blob_list = container_client.list_blobs()\n```\n\n> [!NOTE]\n> Although most clients support context managers, verify specific client documentation for availability.\n\n### Asynchronous operations\n\nAsync clients are provided in separate `.aio` modules:\n\n```python\nfrom azure.storage.blob.aio import BlobServiceClient\nimport asyncio\n\nasync def list_blobs_async():\n    async with BlobServiceClient.from_connection_string(conn_str) as client:\n        container_client = client.get_container_client(\"mycontainer\")\n        async for blob in container_client.list_blobs():\n            print(blob.name)\n\n# Run async function\nasyncio.run(list_blobs_async())\n```\n\n### Long-running operations\n\nLong-running operations use the `begin_` prefix and return poller objects:\n\n```python\nfrom azure.storage.blob import BlobServiceClient\n\nclient = BlobServiceClient.from_connection_string(conn_str)\ncontainer_client = client.get_container_client(\"mycontainer\")\n\n# Start long-running operation\npoller = container_client.begin_copy_blob_from_url(source_url)\n\n# Wait for completion\nresult = poller.result()\n\n# Or check status\nif poller.done():\n    result = poller.result()\n```\n\n### Pagination\n\nList operations return iterables that handle pagination automatically:\n\n```python\nfrom azure.storage.blob import BlobServiceClient\n\nclient = BlobServiceClient.from_connection_string(conn_str)\n\n# Automatic pagination\nfor container in client.list_containers():\n    print(container.name)\n\n# Manual pagination control\ncontainers = client.list_containers(results_per_page=10).by_page()\nfor page in containers:\n    for container in page:\n        print(container.name)\n```\n\n### Return types\n\nMethods return strongly typed model objects rather than dictionaries:\n\n```python\nfrom azure.keyvault.secrets import SecretClient\n\nclient = SecretClient(vault_url=\"...\", credential=credential)\n\n# Returns KeyVaultSecret object, not dict\nsecret = client.get_secret(\"my-secret\")\nprint(secret.value)\nprint(secret.properties.created_on)\n```\n\n## Error handling\n\nAzure SDK exceptions inherit from `AzureError` and provide specific exception types:\n\n```python\nfrom azure.core.exceptions import (\n    AzureError,\n    ResourceNotFoundError,\n    ResourceExistsError,\n    ClientAuthenticationError,\n    HttpResponseError\n)\n\ntry:\n    blob_client.download_blob()\nexcept ResourceNotFoundError:\n    # Handle missing resource\n    print(\"Blob not found\")\nexcept ClientAuthenticationError:\n    # Handle authentication failure\n    print(\"Authentication failed\")\nexcept HttpResponseError as e:\n    # Handle HTTP errors\n    print(f\"HTTP {e.status_code}: {e.message}\")\nexcept AzureError as e:\n    # Handle any other Azure SDK error\n    print(f\"Azure SDK error: {e}\")\n\n```\n\n## Configuration options\n\nClients accept configuration through keyword arguments:\n\n```python\nfrom azure.storage.blob import BlobServiceClient\n\nclient = BlobServiceClient(\n    account_url=\"...\",\n    credential=credential,\n    # Configuration options\n    max_single_put_size=64 * 1024 * 1024,\n    max_block_size=4 * 1024 * 1024,\n    retry_total=3,\n    logging_enable=True\n)\n```\n\n## Common SDK patterns\n\n### Service client hierarchy\n\nAzure SDKs typically follow a three-level hierarchy:\n\n- **Service client**: Entry point for service operations:\n\n  ```python\n  service_client = BlobServiceClient(...)\n  ```\n\n- **Resource client**: Operations on specific resources:\n\n  ```python\n  container_client = service_client.get_container_client(\"container\")\n  ```\n\n- **Operation methods**: Actions on resources:\n\n  ```python\n  blob_client = container_client.get_blob_client(\"blob.txt\")\n  blob_client.upload_blob(data)\n  ```\n\n### Consistent method naming\n\nMethod names follow predictable patterns:\n\n|Operation|Method pattern|Example|\n|---|---|---|\n|Create|`create_<resource>`|`create_container()`|\n|Read|`get_<resource>`|`get_blob()`|\n|Update|`update_<resource>`|`update_secret()`|\n|Delete|`delete_<resource>`|`delete_container()`|\n|List|`list_<resources>`|`list_blobs()`|\n|Exists|`exists()`|`blob_client.exists()`|\n\n## Work with Azure SDKs\n\nThe following example demonstrates how design guidelines create consistency across different Azure services:\n\n```python\nfrom azure.storage.blob import BlobServiceClient\nfrom azure.keyvault.secrets import SecretClient\nfrom azure.cosmos import CosmosClient\nfrom azure.identity import DefaultAzureCredential\n\n# Consistent authentication\ncredential = DefaultAzureCredential()\n\n# Consistent client instantiation\nblob_service = BlobServiceClient(\n    account_url=\"https://account.blob.core.windows.net\",\n    credential=credential\n)\nsecret_client = SecretClient(\n    vault_url=\"https://vault.vault.azure.net\",\n    credential=credential\n)\ncosmos_client = CosmosClient(\n    url=\"https://account.documents.azure.com\",\n    credential=credential\n)\n\n# Consistent method patterns\ncontainers = blob_service.list_containers()\nsecrets = secret_client.list_properties_of_secrets()\ndatabases = cosmos_client.list_databases()\n\n# Consistent error handling\nfrom azure.core.exceptions import ResourceNotFoundError\n\ntry:\n    blob_service.get_container_client(\"container\").get_container_properties()\n    secret_client.get_secret(\"secret\")\n    cosmos_client.get_database_client(\"database\").read()\nexcept ResourceNotFoundError as e:\n    print(f\"Resource not found: {e}\")\n```\n\n## Contribute to Azure SDKs\n\nWhen you extend or contribute to Azure SDKs:\n\n- **Follow Python idioms:** Use Pythonic patterns and conventions.\n- **Maintain consistency:** Align with existing SDK patterns.\n- **Write comprehensive tests:** Include unit and integration tests.\n- **Document thoroughly:** Provide docstrings and examples.\n- **Review guidelines:** Consult the Azure SDK Contribution Guide.\n\nHere's an example of implementing a custom client method that follows the Language Design Guidelines:\n\n```python\ndef list_items_with_prefix(self, prefix: str, **kwargs) -> ItemPaged[ItemProperties]:\n    \"\"\"List items that start with the specified prefix.\n    \n    :param str prefix: The prefix to filter items\n    :return: An iterable of ItemProperties\n    :rtype: ~azure.core.paging.ItemPaged[ItemProperties]\n    \n    :example:\n        items = client.list_items_with_prefix(\"test-\")\n        for item in items:\n            print(item.name)\n    \"\"\"\n    return self.list_items(name_starts_with=prefix, **kwargs)\n```\n\n## Related content\n\n- Review the complete [Azure SDK Design Guidelines](https://azure.github.io/azure-sdk/).\n- Read the [Azure SDK Releases page](https://azure.github.io/azure-sdk/releases/latest/python.html).\n"
  },
  {
    "path": "articles/python/sdk/fundamentals/overview.md",
    "content": "---\ntitle: Overview\ndescription: Introduces the core concepts that every developer should understand when working with the Azure SDK for Python, including design principles, error handling, retries, and response types.\nms.date: 7/31/2025\nms.topic: concept-article\nms.custom: devx-track-python\n---\n\n# Overview of Azure SDK for Python fundamentals\n\nThe articles listed in the following table equip developers with the foundational concepts and core behaviors that underpin every client library in the Azure SDK for Python. These subjects are considered fundamentals because they establish the essential building blocks for effective, idiomatic, and resilient application development across all Azure services.\n\nWhether you work with HTTP retries, handle errors, understand SDK response types, or follow consistent language design guidelines, these articles provide the baseline knowledge required to confidently navigate and extend your use of the Azure SDK. Mastering these fundamentals ensures that you write functional code that's also maintainable, robust, and aligned with best practices across the Azure ecosystem.\n\n| Article title | Purpose |\n|---------------|---------|\n| [Handle errors produced by the Azure SDK for Python](./errors.md) | Describes the SDK's comprehensive error model. Includes best practices for handling specific exception types and implementing resilient error-handling strategies. |\n| [HTTP pipeline and retries in the Azure SDK libraries for Python](./http-pipeline-retries.md) | Provides a deep dive into the SDK's internal HTTP pipeline. Shows how policies like retries, logging, and authentication are layered to manage requests and responses. |\n| [Understand common response types in the Azure SDK for Python](./common-types-response.md) | Explains how SDK methods return intuitive, strongly typed Python objects to simplify how you work with Azure responses and long-running operations. |\n| [Azure SDK Language Design Guidelines for Python](./language-design-guidelines.md) | Outlines the conventions and design patterns that are used across the SDK to ensure consistency, usability, and alignment with Python best practices. |\n"
  },
  {
    "path": "articles/python/sdk/includes/authenticate-azure-services-from-app.md",
    "content": "---\nms.topic: include\nms.date: 03/02/2026\n---\n\n## Authenticate to Azure services from your app\n\nThe [azure-identity](https://pypi.org/project/azure-identity/) library provides various *credentials*—implementations of `TokenCredential` adapted to supporting different scenarios and Microsoft Entra authentication flows. The steps ahead demonstrate how to use [ClientSecretCredential](/python/api/azure-identity/azure.identity.clientsecretcredential) when working with service principals locally and in production.\n\n### Implement the code\n\nStart by adding the package to your application.\n\n```terminal\npip install azure-identity\n```\n\nNext, for any Python code that creates an Azure SDK client object in your app, you should:\n\n1. Import the `ClientSecretCredential` class from the `azure.identity` module.\n1. Import the `os` module to read environment variables.\n1. Read the environment variables to get the client ID, tenant ID, and client secret.\n1. Create a `ClientSecretCredential` object passing the tenant ID, client ID, and client secret.\n1. Pass the `ClientSecretCredential` object to the Azure SDK client object constructor.\n\nAn example of this approach is shown in the following code segment.\n\n```python\nimport os\nfrom azure.identity import ClientSecretCredential\nfrom azure.storage.blob import BlobServiceClient\n\ntenant_id = os.environ.get(\"AZURE_TENANT_ID\")\nclient_id = os.environ.get(\"AZURE_CLIENT_ID\")\nclient_secret = os.environ.get(\"AZURE_CLIENT_SECRET\")\n\ncredential = ClientSecretCredential(tenant_id, client_id, client_secret)\n\nblob_service_client = BlobServiceClient(\n    account_url=\"https://<my_account_name>.blob.core.windows.net\",\n    credential=credential)\n```\n"
  },
  {
    "path": "articles/python/sdk/includes/sdk-auth-overview-dev-accounts.md",
    "content": "---\nms.topic: include\nms.date: 12/13/2023\n---\nIn this method, a developer must be signed in to Azure from the Azure CLI, Azure PowerShell, or Azure Developer CLI on their local workstation. The application then can access the developer's credentials from the credential store and use those credentials to access Azure resources from the app.<br>\n<br>\nThis method has the advantage of easier setup because a developer only needs to sign in to their Azure account through one of the aforementioned developer tools. The disadvantage of this approach is that the developer's account likely has more permissions than required by the application. As a result, the application doesn't accurately replicate the permissions it will run with in production.<br>\n<br>\n> [!div class=\"nextstepaction\"]\n> [Learn about auth using developer accounts](../authentication-local-development-dev-accounts.md)\n"
  },
  {
    "path": "articles/python/sdk/includes/sdk-auth-overview-dev-service-principals.md",
    "content": "---\nms.topic: include\nms.date: 12/13/2023\n---\nIn this method, dedicated *application service principal* objects are set up by using the app registration process for use during local development. The identity of the service principal is then stored as environment variables to be accessed by the app when it's run in local development.<br>\n<br>\nThis method allows you to assign the specific resource permissions needed by the app to the service principal objects used by developers during local development. This practice makes sure the application only has access to the specific resources it needs and replicates the permissions the app will have in production.<br>\n<br>\nThe downside of this approach is the need to create separate service principal objects for each developer who works on an application.<br>\n<br>\n> [!div class=\"nextstepaction\"]\n> [Learn about auth using developer service principals](../authentication-local-development-service-principal.md)\n"
  },
  {
    "path": "articles/python/sdk/includes/sdk-auth-overview-managed-identity.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nApps hosted in Azure should use a *managed identity service principal*. Managed identities are designed to represent the identity of an app hosted in Azure and can only be used with Azure-hosted apps.<br>\n<br>\nFor example, a Django web app hosted in Azure App Service would be assigned a managed identity. The managed identity assigned to the app would then be used to authenticate the app to other Azure services.<br>\n<br>\nApps running in Azure Kubernetes Service (AKS) can use a Workload identity credential. This credential is based on a managed identity that has a trust relationship with an AKS service account.<br>\n,<br>\n> [!div class=\"nextstepaction\"]\n> [Learn about auth from Azure-hosted apps](../authentication-azure-hosted-apps.md)"
  },
  {
    "path": "articles/python/sdk/includes/sdk-auth-overview-service-principal.md",
    "content": "---\nms.topic: include\nms.date: 03/31/2022\n---\nApps hosted outside of Azure (for example, on-premises apps) that need to connect to Azure services should use an *application service principal*. An application service principal represents the identity of the app in Azure and is created through the application registration process.<br>\n<br>\nFor example, consider a Django web app hosted on-premises that makes use of Azure Blob Storage. You would create an application service principal for the app by using the app registration process. The `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, and `AZURE_CLIENT_SECRET` would all be stored as environment variables to be read by the application at runtime and allow the app to authenticate to Azure by using the application service principal.<br>\n<br>\n> [!div class=\"nextstepaction\"]\n> [Learn about auth from apps hosted outside of Azure](../authentication-on-premises-apps.md)"
  },
  {
    "path": "articles/python/sdk/mermaidjs/chain-sequence.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chain-sequence.md -o ../../media/mermaidjs/chain-sequence.svg\n\nsequenceDiagram\n  autonumber;\n\n  participant A as Python app;\n  participant B as Credential chain;\n  participant C as TokenCredential instance;\n    \n  A->>B: Authenticate to Microsoft Entra ID;\n  activate B;\n  B->>B: get_token;\n  loop Traverse TokenCredential collection until AccessToken received\n    B->>C: Fetch token;\n    activate C;\n    C->>C: get_token;\n    break when Result is AccessToken\n        C-->>B: Result;\n    end;\n    deactivate C;\n  end;\n  \n  B-->>A: AccessToken;\n  deactivate B;\n```\n"
  },
  {
    "path": "articles/python/sdk/mermaidjs/chained-token-credential-authentication-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i chained-token-credential-authentication-flow.md -o ../../media/mermaidjs/chained-token-credential-authentication-flow.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    E(Azure CLI):::developer --> G(Azure Developer CLI):::developer;\n\n    %% Define styles for credential type boxes\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/python/sdk/mermaidjs/default-azure-credential-authentication-flow.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run commands:\n%%    mmdc -i default-azure-credential-authentication-flow.md -o ../../media/mermaidjs/default-azure-credential-authentication-flow-inline.svg\n%%    mmdc -i default-azure-credential-authentication-flow.md -o ../../media/mermaidjs/default-azure-credential-authentication-flow-expanded.png -w 1156\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential;\n\n    subgraph CREDENTIAL TYPES;\n        direction LR;\n        Deployed(Deployed service):::deployed ~~~ Developer(Developer tool):::developer ~~~ Interactive(Interactive):::interactive;\n    end;\n\n    subgraph CREDENTIALS;\n        direction LR;\n        A(Environment):::deployed -->\n        B(Workload Identity):::deployed -->\n        C(Managed Identity):::deployed -->\n        D(Shared Token Cache):::developer -->\n        E(Visual Studio Code):::developer -->\n        F(Azure CLI):::developer -->\n        G(Azure PowerShell):::developer -->\n        H(Azure Developer CLI):::developer -->\n        I(Interactive browser):::interactive -->\n        J(Broker):::developer;\n    end;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C, stroke-width:2px;\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n    classDef interactive fill:#A5A5A5, stroke:#828282, stroke-dasharray:5 5, stroke-width:2px;\n\n    %% Add API ref links to credential type boxes\n    click A \"https://learn.microsoft.com/python/api/azure-identity/azure.identity.environmentcredential?view=azure-python\" _blank;\n    click B \"https://learn.microsoft.com/python/api/azure-identity/azure.identity.workloadidentitycredential?view=azure-python\" _blank;\n    click C \"https://learn.microsoft.com/python/api/azure-identity/azure.identity.managedidentitycredential?view=azure-python\" _blank;\n    click D \"https://learn.microsoft.com/python/api/azure-identity/azure.identity.sharedtokencachecredential?view=azure-python\" _blank;\n    click E \"https://learn.microsoft.com/python/api/azure-identity/azure.identity.visualstudiocodecredential?view=azure-python\" _blank;\n    click F \"https://learn.microsoft.com/python/api/azure-identity/azure.identity.azureclicredential?view=azure-python\" _blank;\n    click G \"https://learn.microsoft.com/python/api/azure-identity/azure.identity.azurepowershellcredential?view=azure-python\" _blank;\n    click H \"https://learn.microsoft.com/python/api/azure-identity/azure.identity.azuredeveloperclicredential?view=azure-python\" _blank\n    click I \"https://learn.microsoft.com/python/api/azure-identity/azure.identity.interactivebrowsercredential?view=azure-python\" _blank;\n    click J \"https://learn.microsoft.com/python/api/azure-identity-broker/azure.identity.broker.interactivebrowserbrokercredential?view=azure-python\" _blank;\n```\n"
  },
  {
    "path": "articles/python/sdk/mermaidjs/default-azure-credential-environment-variable-development.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i default-azure-credential-environment-variable-development.md -o ../../media/mermaidjs/default-azure-credential-environment-variable-development.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential when AZURE_TOKEN_CREDENTIALS is set to \"dev\";\n\n    D(Shared Token Cache):::developer -->\n    E(Visual Studio Code):::developer -->\n    F(Azure CLI):::developer -->\n    G(Azure PowerShell):::developer -->\n    H(Azure Developer CLI):::developer -->\n    J(Broker):::developer;\n\n    %% Define styles for credential type boxes\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/python/sdk/mermaidjs/default-azure-credential-environment-variable-production.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i default-azure-credential-env-var-prod.md -o ../../media/mermaidjs/default-azure-credential-env-var-prod.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    accTitle: DefaultAzureCredential authentication flow without developer tool credentials;\n    accDescr: Flowchart showing the credential chain implemented by DefaultAzureCredential when AZURE_TOKEN_CREDENTIALS is set to \"prod\";\n\n    A(Environment):::deployed --> B(Workload Identity):::deployed --> C(Managed Identity):::deployed;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/python/sdk/mermaidjs/default-azure-credential-excludes.md",
    "content": "```mermaid\n%% STEPS TO GENERATE IMAGE\n%% =======================\n%% 1. Install mermaid CLI v10.9.1 (see https://github.com/mermaid-js/mermaid-cli/blob/master/README.md):\n%%    npm i -g @mermaid-js/mermaid-cli@10.9.1\n%% 2. Run command: mmdc -i default-azure-credential-excludes.md -o ../../media/mermaidjs/default-azure-credential-excludes.svg\n\n%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\nflowchart LR;\n    C(Managed Identity):::deployed -->\n    D(Shared Token Cache):::developer -->\n    E(Visual Studio Code):::developer -->\n    F(Azure CLI):::developer -->\n    G(Azure PowerShell):::developer -->\n    H(Azure Developer CLI):::developer -->\n    J(Broker):::developer;\n\n    %% Define styles for credential type boxes\n    classDef deployed fill:#95C37E, stroke:#71AD4C, stroke-width:2px;\n    classDef developer fill:#F5AF6F, stroke:#EB7C39, stroke-width:2px;\n```\n"
  },
  {
    "path": "articles/python/tutorial-containerize-deploy-python-web-app-azure-01.md",
    "content": "---\ntitle: Deploy a containerized Python web app on Azure with MongoDB\ndescription: An overview of how to create and deploy a containerized Python web app (Django or Flask) on Azure App Service with MongoDB.\nms.topic: concept-article\nms.date: 03/17/2025\nms.custom:\n  - devx-track-python\n  - sfi-image-nochange\n---\n\n# Overview: Containerized Python web app on Azure with MongoDB\n\nThis tutorial series shows you how to containerize a Python web app and then either run it locally or deploy it to [Azure App Service][1]. App Service [Web App for Containers][3] allows you to focus on building your containers without worrying about managing and maintaining an underlying container orchestrator. When you are building web apps, Azure App Service is a good option for taking your first steps with containers. This container web app can use either a local MongoDB instance or [Azure DocumentDB (with MongoDB compatibility)][2] to store data. For more information about using containers in Azure, see [Comparing Azure container options](/azure/container-apps/compare-options).\n\nIn this tutorial you:\n\n* Build and run a [Docker][4] container locally. See [Build and run a containerized Python web app locally](tutorial-containerize-deploy-python-web-app-azure-02.md).\n\n* Build a [Docker][4] container image directly in Azure. See [Build a containerized Python web app in Azure](tutorial-containerize-deploy-python-web-app-azure-03.md).\n\n* Configure an App Service to create a web app based on the Docker container image. See [Deploy a containerized Python app to App Service](tutorial-containerize-deploy-python-web-app-azure-04.md).\n\nAfter completing the articles in this tutorial series, you'll have the basis for Continuous Integration (CI) and Continuous Deployment (CD) of a Python web app to Azure.\n\n## Service overview\n\nThe service diagram supporting this tutorial shows two environments: developer environment and Azure environment. It highlights the key Azure services used in the development process.\n\n:::image type=\"content\" source=\"./media/tutorial-container-web-app/containerization-of-python-apps-overview.png\" alt-text=\"A screenshot of the services used in the Tutorial - Containerized Python App on Azure.\" lightbox=\"./media/tutorial-container-web-app/containerization-of-python-apps-overview.png\":::\n\n### Developer environment\n\nThe components supporting the developer environment in this tutorial include:\n\n* **Local Development System**: A personal computer used for coding, building, and testing the Docker container.\n\n* **Docker Containerization**: Docker is employed to package the app and its dependencies into a portable container.\n\n* **Development Tools**: Includes a code editor and other necessary tools for software development.\n\n* **Local MongoDB Instance**: A local MongoDB database utilized for data storage during development.\n\n* **MongoDB Connection**: Access to the local MongoDB database provided through a connection string.\n\n### Azure environment\n\nThe components supporting the Azure environment in this tutorial include:\n\n* [Azure App Service][1]\n\n  * In Azure App Service, Web App for Containers uses the [Docker][4] container technology to provide container hosting of both built-in images and custom images using Docker.\n  * Web App for Containers uses a webhook in the Azure Container Registry (ACR) to get notified of new images. When a new image is pushed to the registry, the webhook notification triggers App Service to pull the update and restart the app.\n\n* [Azure Container Registry][11]\n\n  * Azure Container Registry allows you to store and manage Docker images and their components in Azure. It provides a registry located near your deployments in Azure that gives you the ability to control access using your Microsoft Entra groups and permissions.\n\n  * In this tutorial, Azure Container Registry is the registry source, but you can also use Docker Hub or a private registry with minor modifications.\n\n* [Azure DocumentDB (with MongoDB compatibility)][2]\n\n  * The Azure DocumentDB is a MongoDB-compatible database used in this tutorial for data storage.\n\n  * The containerized application connects to and accesses the Azure DocumentDB resource using a connection string, which is stored as an environment variable and provided to the app.\n\n## Authentication\n\nIn this tutorial, you build a Docker image, either locally or in Azure, and then deploy it to Azure App Service. The App Service pulls the container image from an Azure Container Registry repository.\n\nTo securely pull images from the repository, App Service utilizes a system-assigned managed identity. This managed identity grants the web app permissions to interact with other Azure resources, eliminating the need for explicit credentials. For this tutorial, the managed identity is configured during setup of App Service to use a registry container image.\n\nThe tutorial sample web app uses MongoDB to store data. The sample code connects to Azure DocumentDB via a connection string.\n\n## Prerequisites\n\nTo complete this tutorial, you need:\n\n* An Azure account where you can create:\n\n  * [Azure Container Registry][11]\n  * [Azure App Service][1]\n  * [Azure DocumentDB (with MongoDB compatibility)][2] (or access to an equivalent). To create an Azure DocumentDB database, follow the steps in [part 2 of this tutorial](tutorial-containerize-deploy-python-web-app-azure-02.md).\n\n* [Visual Studio Code][16] or [Azure CLI][17], depending on your tool of choice. If you use Visual Studio Code, you need the [Docker extension][6] and [Azure App Service extension][7].\n\n* These Python packages:\n\n  * [MongoDB Shell (mongosh)][8] for connecting to MongoDB.\n  * [Flask][9] or [Django][10] as a web framework.\n\n* [Docker][4] installed locally.\n\n## Sample app\n\nThe end result of this tutorial is a restaurant review app, deployed and running in Azure, that looks like the following screenshot.\n\n:::image type=\"content\" source=\"./media/tutorial-container-web-app/containerization-of-python-web-app-sample-app-screenshot.png\" alt-text=\"A screenshot of the sample app created from the Python containerized web app used in the Tutorial - Containerized Python App on Azure.\" lightbox=\"./media/tutorial-container-web-app/containerization-of-python-web-app-sample-app-screenshot.png\":::\n\nIn this tutorial, you build a Python restaurant review app that utilizes MongoDB for data storage. For an example app using PostgreSQL, see [Create and deploy a Flask web app to Azure with a managed identity](./tutorial-python-managed-identity-cli.md).\n\n## Next step\n\n> [!div class=\"nextstepaction\"]\n> [Build and test locally](tutorial-containerize-deploy-python-web-app-azure-02.md)\n\n[1]: https://azure.microsoft.com/services/app-service/\n[2]: /azure/documentdb/overview\n[3]: https://azure.microsoft.com/services/app-service/containers/\n[4]: https://www.docker.com/\n[5]: /azure/active-directory/managed-identities-azure-resources/overview\n[6]: https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker\n[7]: https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice\n[8]: https://www.mongodb.com/docs/mongodb-shell/\n[9]: https://flask.palletsprojects.com/\n[10]: https://www.djangoproject.com/\n[11]: https://azure.microsoft.com/services/container-registry/\n[12]: /azure/documentdb/quickstart-python\n[13]: /azure/cosmos-db/scripts/cli/mongodb/create\n[14]: /azure/cosmos-db/scripts/powershell/mongodb/create\n[15]: https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-documentdb\n[16]: https://code.visualstudio.com/\n[17]: /cli/azure/what-is-azure-cli\n"
  },
  {
    "path": "articles/python/tutorial-containerize-deploy-python-web-app-azure-02.md",
    "content": "---\ntitle: Build and run a containerized Python web app locally with MongoDB\ndescription: Build and run a containerized Python web app (Django or Flask) locally with MongoDB or using Azure Cosmos DB for MongoDB. In later articles in this tutorial series, you learn to deploy a Python web app to Azure App Service.\nms.topic: how-to\nms.date: 04/10/2025\nms.custom:\n  - devx-track-python\n  - sfi-image-nochange\n---\n\n# Build and run a containerized Python web app locally\n\nIn this part of the tutorial series, you learn how to build and run a containerized [Django](https://github.com/Azure-Samples/msdocs-python-django-container-web-app) or a [Flask](https://github.com/Azure-Samples/msdocs-python-flask-container-web-app) Python web app on your local computer. To store data for this app, you can use either a local MongoDB instance or [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction). This article is part 2 of a 5-part tutorial series. We recommend that you complete [part 1](tutorial-containerize-deploy-python-web-app-azure-01.md) before starting this article.\n\nThe following service diagram highlights the local components covered in this article In this article, you also learn how to use Azure Cosmos DB for MongdoDB with a local Docker image, rather than a local instance of MongoDB.\n\n:::image type=\"content\" source=\"./media/tutorial-container-web-app/containerization-of-python-apps-run-local.png\" alt-text=\"A screenshot of the Tutorial - Containerized Python App on Azure with local part highlighted.\" lightbox=\"./media/tutorial-container-web-app/containerization-of-python-apps-run-local.png\":::\n\n## Clone or download the sample Python app\n\nIn this section, you clone or download the sample Python app that you use to build a Docker image. You can choose between a Django or Flask Python web app. If you have your own Python web app, you can choose to use that instead. If you use your own Python web app, make sure your app has a *Dockerfile* in the root folder and can connect to a MongoDB database.\n\n### [Git clone](#tab/sample-app-git-clone)\n\n1. Clone either the Django or Flask repository into a local folder by using one of the following commands:\n\n    ### [Django](#tab/Django)\n\n    ```console\n    # Django\n    git clone https://github.com/Azure-Samples/msdocs-python-django-container-web-app.git\n    ```\n\n    ### [Flask](#tab/Flask)\n\n    ```console\n    # Flask\n    git clone https://github.com/Azure-Samples/msdocs-python-flask-container-web-app.git\n    ```\n\n    ---\n\n1. Navigate to the root folder for your cloned repository.\n\n    ### [Django](#tab/Django)\n\n    ```console\n    # Django\n    cd msdocs-python-django-container-web-app\n    ```\n\n    ### [Flask](#tab/Flask)\n\n    ```console\n    # Flask\n    cd msdocs-python-flask-container-web-app\n    ```\n\n    ---\n\n### [Download](#tab/sample-app-download)\n\nVisit [https://github.com/Azure-Samples/msdocs-python-django-container-web-app](https://github.com/Azure-Samples/msdocs-python-django-container-web-app) or [https://github.com/Azure-Samples/msdocs-python-flask-container-web-app](https://github.com/Azure-Samples/msdocs-python-flask-container-web-app).\n\n1. Select **Code**, and then select **Download ZIP**.\n\n1. Unpack the ZIP file into a local folder.\n\n---\n\n## Build a Docker image\n\nIn this section, you build a Docker image for the Python web app using either Visual Studio Code or the Azure CLI. The Docker image contains the Python web app, its dependencies, and the Python runtime. The Docker image is built from a *Dockerfile* that defines the image's contents and behavior. The *Dockerfile* is in the root folder of the sample app you cloned or downloaded (or provided yourself).\n\n> [!TIP]\n> If you're new to the Azure CLI, see [Get started with Azure CLI](/cli/azure/get-started-with-azure-cli) to learn how to download and install the Azure CLI locally or how to run Azure CLI commands in Azure Cloud Shell.\n\n### [Azure CLI](#tab/azure-cli)\n\n[Docker](https://docs.docker.com/get-docker/) is required to build the Docker image using the Docker CLI. Once Docker is installed, open a terminal window and navigate to the sample folder.\n\n> [!NOTE]\n> The steps in this section require the Docker daemon to be running. In some installations, for example on Windows, you need to open [Docker Desktop](https://www.docker.com/products/docker-desktop/), which starts the daemon, before proceeding.\n\n1. Confirm that Docker is accessible by running the following command in the root folder of the sample app.\n\n    ```console\n    docker\n    ```\n\n    If, after running this command, you see help for the [Docker CLI](https://docs.docker.com/engine/reference/commandline/cli/), Docker is accessible. Otherwise, make sure Docker is installed and that your shell has access to the Docker CLI.\n\n1. Build the Docker image for the Python web app by using the [Docker build](https://docs.docker.com/engine/reference/commandline/build/) command.\n\n    The general form of the command is `docker build --rm --pull --file \"<path-to-project-root>/Dockerfile\" --label \"com.microsoft.created-by=docker-cli\" --tag \"<container-name>:latest\" \"<path-to-project-root>\"`.\n\n    If you're at the root folder of the project, use the following command to build the Docker image. The dot (\".\") at the end of the command refers to the current directory in which the command runs. To force a rebuild, add `--no-cache`.\n\n    ### [Bash](#tab/bash)\n\n    ```console\n    #!/bin/bash\n    docker build --rm --pull \\\n      --file \"Dockerfile\" \\\n      --label \"com.microsoft.create-by=docker-cli\" \\\n      --tag \"msdocspythoncontainerwebapp:latest\" \\\n        .\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```console\n    # PowerShell syntax\n    docker build --rm --pull `\n      --file \"Dockerfile\" `\n      --label \"com.microsoft.create-by=docker-cli\" `\n      --tag \"msdocspythoncontainerwebapp:latest\" `\n        .\n    ```\n\n    ---\n\n1. Confirm the image was built successfully by using the [Docker images](https://docs.docker.com/engine/reference/commandline/images/) command.\n\n    ```console\n    docker images\n    ```\n\n    The command returns a list of images by REPOSITORY name, TAG, and CREATED date among other image characteristics.\n\n### [VS Code](#tab/vscode)\n\n[Visual Studio Code](https://code.visualstudio.com/) and the [Docker extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker) are required to build the Docker image locally using Visual Studio Code. Install Visual Studio Code and the Docker extension before continuing. Once Visual Studio Code and the Docker extension are installed, go to the sample folder you cloned or downloaded and open VS Code with the command `code .`.\n\n> [!NOTE]\n> The steps in this section require the Docker daemon to be running. In some installations, for example on Windows, you need to open [Docker Desktop](https://www.docker.com/products/docker-desktop/) to start the daemon before proceeding.\n\n1. Once Visual Studio Code and the Docker extension are installed, go to the sample folder you cloned or downloaded and open VS Code with the command `code .`.\n\n1. In VS Code, open the Docker extension and then select the **Docker** extension on the Activity Bar.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-open-docker-extension.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-open-docker-extension.png\" alt-text=\"A screenshot that shows how to open the Docker extension in Visual Studio Code.\" :::\n\n    If the Docker extension reports a \"Failed to connect\" error, make sure [Docker](https://docs.docker.com/get-docker/) is installed and running.\n\n1. To build the Docker image, right-click the *Dockerfile* and then select **Build Image...**.\n\n    For more information about Dockerfile syntax, see the [Dockerfile reference](https://docs.docker.com/engine/reference/builder/).\n\n1. To confirm the image was built, expand the **IMAGES** section of the Docker extension and look for the recently built image. The name of this container image is \"msdocspythoncontainerwebapp\" (this value is set in the *.vscode/tasks.json* file).\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-docker-extension-view-images.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-docker-extension-view-images.png\" alt-text=\"A screenshot that shows how to confirm the built image in Visual Studio Code.\" :::\n\n---\n\nAt this point, you have a local Docker image named \"msdocspythoncontainerwebapp\" with the tag \"latest\". Tags help define version details, intended use, stability, and other relevant information. For more information, see [Recommendations for tagging and versioning container images](/azure/container-registry/container-registry-image-tag-version).\n\n> [!NOTE]\n> Images that are built from VS Code or by using the Docker CLI directly can also be viewed with the [Docker Desktop](https://www.docker.com/products/docker-desktop/) application.\n\n## Set up MongoDB\n\nYour Python web app requires a MongoDB database named *restaurants_reviews* and a collection named *restaurants_reviews* are required to store data. In this tutorial, you use both a local installation of MongoDB and a [Azure Cosmos DB for MongoDB](/azure/cosmos-db/mongodb/mongodb-introduction) instance to create and access the database and collection.\n\n> [!IMPORTANT]\n> Don't use a MongoDB database you use in production. In this tutorial, you store the MongoDB connection string to the one of these MongoDB instances in an environment variable (which is observable by anyone capable of inspecting your container - such as by using `docker inspect`).\n\n### Local MongoDB\n\nLet's start by creating a local instance of MongoDB using the Azure CLI.\n\n1. Install [MongoDB](https://www.mongodb.com/docs/manual/installation/) (if it isn't already installed).\n\n    You can check for the installation of MongoDB by using the [MongoDB Shell (mongosh)](https://www.mongodb.com/docs/mongodb-shell/). If the following commands don't work, you may need to explicitly [install mongosh](https://www.mongodb.com/docs/mongodb-shell/install/) or [connect mongosh to your MongoDB server](https://www.mongodb.com/docs/mongodb-shell/connect/).\n\n    * Use the following command to open the MongoDB shell and get the version of both the MongoDB shell and the MongoDB server:\n\n        ```console\n        mongosh\n        ```\n\n        > [!TIP]\n        > To return just the version of MongoDB server installed on your system, close and reopen the MongoDB shell and use the following command: `mongosh --quiet --exec 'db.version()'`\n\n        In some setups, you can also directly invoke the Mongo daemon in your bash shell.\n\n        ```console\n        mongod --version\n        ```\n\n1. Edit the *mongod.cfg* file in the `\\MongoDB\\Server\\8.0\\bin` folder and add your computer's local IP address to the `bindIP` key.\n\n    The `bindip` key in the [MongoD configuration file](https://www.mongodb.com/docs/manual/reference/configuration-options/) defines the hostnames and IP addresses that MongoDB listens for client connections. Add the current IP of your local development computer. The sample Python web app running locally in a Docker container communicates to the host computer with this address.\n\n    For example, part of the configuration file should look like this:\n\n    ```yml\n    net:\n      port: 27017\n      bindIp: 127.0.0.1,<local-ip-address>\n    ```\n\n1. Save your changes to this configuration file.\n\n    > [!IMPORTANT]\n    > You need administrative privileges to save the changes you make to this configuration file.\n\n1. Restart MongoDB to pick up changes to the configuration file.\n\n1. Open a MongoDB shell and run the following command to set the database name to \"restaurants_reviews\" and the collection name to \"restaurants_reviews\". You can also create a database and collection with the VS Code [MongoDB extension](https://code.visualstudio.com/docs/azure/mongodb) or any other MongoDB-aware tool.\n\n    ```mongosh\n    > help\n    > use restaurants_reviews\n    > db.restaurants_reviews.insertOne({})\n    > show dbs\n    > exit\n    ```\n\nAfter you complete the previous step, the local MongoDB connection string is \"mongodb://127.0.0.1:27017/\", the database name is \"restaurants_reviews\", and the collection name is \"restaurants_reviews\".\n\n### Azure Cosmos DB for MongoDB\n\nNow, let's also create an Azure Cosmos DB for MongoDB instance using the Azure CLI. \n\n>[!NOTE]\n> In part 4 of this tutorial series, you use the Azure Cosmos DB for MongoDB instance to run the web app in Azure App Service.\n\nBefore running the following script, replace the location, the resource group, and Azure Cosmos DB for MongoDB account name with appropriate values (optional). We recommend using the same resource group for all the Azure resources created in this tutorial to make them easier to delete when you're finished.\n\nThe script takes a few minutes to run.\n\n### [Bash](#tab/bash)\n\n```azurecli-interactive\n#!/bin/bash\n# LOCATION: The Azure region. Use the \"az account list-locations -o table\" command to find a region near you.\nLOCATION='westus'\n# RESOURCE_GROUP_NAME: The resource group name, which can contain underscores, hyphens, periods, parenthesis, letters, and numbers.\nRESOURCE_GROUP_NAME='msdocs-web-app-rg'\n# ACCOUNT_NAME: The Azure Cosmos DB for MongDB account name, which can contain lowercase letters, hyphens, and numbers.\nACCOUNT_NAME='msdocs-cosmos-db-account-name'\n\n# Create a resource group\necho \"Creating resource group $RESOURCE_GROUP_NAME in $LOCATION...\"\naz group create --name $RESOURCE_GROUP_NAME --location $LOCATION\n\n# Create a Cosmos account for MongoDB API\necho \"Creating $ACCOUNT_NAME. This command may take a while to complete.\"\naz cosmosdb create --name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --kind MongoDB\n\n# Create a MongoDB API database\necho \"Creating database restaurants_reviews\"\naz cosmosdb mongodb database create --account-name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --name restaurants_reviews\n\n# Create a MongoDB API collection\necho \"Creating collection restaurants_reviews\"\naz cosmosdb mongodb collection create --account-name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --database-name restaurants_reviews --name restaurants_reviews\n\n# Get the connection string for the MongoDB database\necho \"Get the connection string for the MongoDB account\"\naz cosmosdb keys list --name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --type connection-strings\n\necho \"Copy the Primary MongoDB Connection String from the list above\"\n```\n\n### [PowerShell](#tab/powershell)\n\n```powershell-interactive\n# PowerShell syntax\n# LOCATION: The Azure region. Use \"az account list-locations -o table\" to find a region near you.\n# RESOURCE_GROUP_NAME: The resource group name, which can contain underscores, hyphens, periods, parenthesis, letters, and numbers.\n# ACCOUNT_NAME: The Azure Cosmos DB for MongoDB account name, which can contain lowercase letters, hyphens, and numbers.\n\n$LOCATION = \"westus\"\n$RESOURCE_GROUP_NAME = \"msdocs-web-app-rg\"\n$ACCOUNT_NAME = \"msdocs-cosmos-db-account-name\"\n\n# Create a resource group\nWrite-Output \"Creating resource group $RESOURCE_GROUP_NAME in $LOCATION...\"\naz group create --name $RESOURCE_GROUP_NAME --location $LOCATION\n\n# Create a Cosmos account for MongoDB API\nWrite-Output \"Creating $ACCOUNT_NAME. This command may take a while to complete.\"\naz cosmosdb create --name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --kind MongoDB\n\n# Create a MongoDB API database\nWrite-Output \"Creating database restaurants_reviews\"\naz cosmosdb mongodb database create --account-name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --name \"restaurants_reviews\"\n\n# Create a MongoDB API collection\nWrite-Output \"Creating collection restaurants_reviews\"\naz cosmosdb mongodb collection create --account-name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --database-name \"restaurants_reviews\" --name \"restaurants_reviews\"\n\n# Get the connection string for the MongoDB database\nWrite-Output \"Getting the connection string for the MongoDB account...\"\naz cosmosdb keys list --name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --type connection-strings\n\nWrite-Output \"Copy the Primary MongoDB Connection String from the list above.\"\n\n```\n\n---\n\nWhen the script completes, copy the *Primary MongoDB Connection String* from the output of the last command to your clipboard or other location.\n\n```output\n{\n  \"connectionStrings\": [\n    {\n      \"connectionString\": \"\"mongodb://msdocs-cosmos-db:pnaMGVtGIRAZHUjsg4GJBCZMBJ0trV4eg2IcZf1TqV...5oONz0WX14Ph0Ha5IeYACDbuVrBPA==@msdocs-cosmos-db.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@msdocs-cosmos-db@\"\",\n      \"description\": \"Primary MongoDB Connection String\",\n      \"keyKind\": \"Primary\",\n      \"type\": \"MongoDB\"\n    },\n\n    ...\n  ]\n}\n```\n\nAfter you complete the previous step, you have an Azure Cosmos DB for MongoDB connection string of the form `mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>`, a database named `restaurants_reviews`, and a collection named `restaurants_reviews`.\n\nFor more information about how to use the Azure CLI to create a Cosmos DB for MongoDB account and to create databases and collections, see [Create a database and collection for MongoDB for Azure Cosmos DB using Azure CLI](/azure/cosmos-db/scripts/cli/mongodb/create). You can also use [PowerShell](/azure/cosmos-db/scripts/powershell/mongodb/create), the VS Code [Azure Databases extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-cosmosdb), and [Azure portal](/azure/cosmos-db/mongodb/create-mongodb-python).\n\n> [!TIP]\n> In the VS Code Azure Databases extension, you can right-click on the MongoDB server and get the connection string.\n\n## Run the image locally in a container\n\nYou're now ready to run the Docker container locally using either your local MongoDB instance or your Cosmos DB for MongoDB instance. In this section of the tutorial, you learn to use either VS Code or the Azure CLI to run the image locally. The sample app expects the MongoDB connection information to be passed in to it with environment variables. There are several ways to get environment variables passed to container locally. Each has advantages and disadvantages in terms of security. You should avoid checking in any sensitive information or leaving sensitive information in code in the container.\n\n> [!NOTE]\n> When the web app is deployed to Azure, the web app gets connection information from environment values set as App Service configuration settings and none of the modifications for the local development environment scenario apply.\n\n### [Azure CLI](#tab/azure-cli)\n\n### MongoDB local\n\nUse the following commands with your local instance of MongoDB to run the Docker image locally.\n\n1. Run the latest version of the image.\n\n    ### [Bash](#tab/bash)\n\n    ```bash\n    #!/bin/bash\n    \n    # Define variables\n    # Set the port number based on the framework being used:\n    # 8000 for Django, 5000 for Flask\n    export PORT=<port-number>  # Replace with actual port (e.g., 8000 or 5000)\n    \n    # Set your computer''s IP address (replace with actual IP)\n    export YOUR_IP_ADDRESS=<your-computer-ip-address>  # Replace with actual IP address\n    \n    # Run the Docker container with the required environment variables\n    docker run --rm -it \\\n      --publish \"$PORT:$PORT\" \\\n      --publish 27017:27017 \\\n      --add-host \"mongoservice:$YOUR_IP_ADDRESS\" \\\n      --env CONNECTION_STRING=mongodb://mongoservice:27017 \\\n      --env DB_NAME=restaurants_reviews \\\n      --env COLLECTION_NAME=restaurants_reviews \\\n      --env SECRET_KEY=\"supersecretkeythatispassedtopythonapp\" \\\n      msdocspythoncontainerwebapp:latest\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell\n    # PowerShell syntax\n    # Define variables\n    # Set the port number based on the framework being used:\n    # 8000 for Django, 5000 for Flask\n    $PORT = \"your_port_number\"  # Replace with your actual port number\n    $YOUR_IP_ADDRESS = \"your_ip_address\"  # Replace with your actual IP address\n    \n    # Run the Docker container with the required environment variables\n    docker run --rm -it `\n        --publish \"${PORT}:${PORT}\" `\n        --publish 27017:27017 `\n        --add-host \"mongoservice:$YOUR_IP_ADDRESS\" `\n        --env CONNECTION_STRING=\"mongodb://mongoservice:27017\" `\n        --env DB_NAME=\"restaurants_reviews\" `\n        --env COLLECTION_NAME=\"restaurants_reviews\" `\n        --env SECRET_KEY=\"supersecretkeythatispassedtopythonapp\" `\n        msdocspythoncontainerwebapp:latest \n    ```\n\n    ---\n\n1. Confirm that the container is running. In another console window, run the [docker container ls](https://docs.docker.com/engine/reference/commandline/container_ls/) command.\n\n    ```console\n    docker container ls\n    ```\n\n    See your container \"msdocspythoncontainerwebapp:latest:latest\" in the list. Notice the `NAMES` column of the output and the `PORTS` column. Use the container name to stop the container.\n\n1. Test the web app.\n\n    Go to \"http://127.0.0.1:8000\" for Django and \"http://127.0.0.1:5000/\" for Flask.\n\n1. Shut down the container.\n\n    ```console\n    docker container stop <container-name>\n    ```\n\n### Azure Cosmos DB for MongoDB\n\nUse the following commands with your Azure Cosmos DB for MongoDB instance to run the Docker image in Azure.\n\n1. Run the latest version of the image.\n\n    ### [Bash](#tab/bash)\n\n    ```bash\n    #!/bin/bash\n    # PORT=8000 for Django and 5000 for Flask\n    export PORT=<port-number>\n    export CONNECTION_STRING=\"<connection-string>\"\n\n    docker run --rm -it \\\n      --publish $PORT:$PORT/tcp \\\n      --env CONNECTION_STRING=$CONNECTION_STRING \\\n      --env DB_NAME=restaurants_reviews \\\n      --env COLLECTION_NAME=restaurants_reviews \\\n      --env SECRET_KEY=supersecretkeythatyougenerate \\\n      msdocspythoncontainerwebapp:latest\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell\n    # PowerShell syntax\n    # PORT=8000 for Django and 5000 for Flask\n    $PORT=<port-number>\n    $CONNECTION_STRING=\"<connection-string>\"\n\n    docker run --rm -it `\n      --publish ${PORT}:${PORT}/tcp `\n      --env CONNECTION_STRING=$CONNECTION_STRING `\n      --env DB_NAME=restaurants_reviews `\n      --env COLLECTION_NAME=restaurants_reviews `\n      --env SECRET_KEY=supersecretkeythatyougenerate `\n      msdocspythoncontainerwebapp:latest\n    ```\n\n    ---\n\n    Passing in sensitive information is only shown for demonstration purposes. The connection string information can be viewed by inspecting the container with the command [docker container inspect](https://docs.docker.com/engine/reference/commandline/container_inspect/). Another way to handle secrets is to use the [BuildKit](https://docs.docker.com/develop/develop-images/build_enhancements/) functionality of Docker.\n\n1. Open a new console window, run the following [docker container ls](https://docs.docker.com/engine/reference/commandline/container_ls/) command to confirm that the container is running.\n\n    ```console\n    docker container ls\n    ```\n\n    See your container \"msdocspythoncontainerwebapp:latest:latest\" in the list. Notice the `NAMES` column of the output and the `PORTS` column. Use the container name to stop the container.\n\n1. Test the web app.\n\n    Go to \"http://127.0.0.1:8000\" for Django and \"http://127.0.0.1:5000/\" for Flask.\n\n1. Shut down the container.\n\n    ```console\n    docker container stop <container-name>\n    ```\n\n### [VS Code](#tab/vscode)\n\nIn this section of the tutorial, you use the Docker extension in Visual Studio Code to run the container. You can use either the connection string to your local MongoDB instance or your Cosmos DB for MongoDB instance within VS Code.\n\n1. In the *.vscode* folder of the sample app, the *settings.json* file defines what happens when you use the Docker extension and select **Run** or **Run Interactive** from the context menu of a Tag. The *settings.json* file contains two templates each for the `(MongoDB local)` and `(MongoDB Azure)` scenarios.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-settings-file.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-settings-file.png\" alt-text=\"A screenshot that shows the settings.json file in Visual Studio Code.\" :::\n\n    If you're using a local MongoDB database:\n\n    * Replace both instances of `<YOUR_IP_ADDRESS>` with your IP address.\n\n    * Replace both instances of `<CONNECTION_STRING>` with the connection string for your MongoDB database.\n\n    * Add the following environment variable to the string of variables passed to the Docker run command for the MongoDB local templates for both the \"docker.commands.run\" and \"docker.commands.runInteractive\" code blocks:\n\n        ```python\n        -e 'SECRET_KEY=supersecretkeythatispassedtopythonapp'\n        ```\n\n    If you're using an Azure Cosmos DB for MongoDB database:\n\n    * Replace both instances of `<CONNECTION_STRING>` with the Azure Cosmos DB for MongoDB connection string.\n\n    * Add the following environment variable to the string of variables passed to the Docker run command for the Azure Cosmos DB for MongoDB templates for both the \"docker.commands.run\" and \"docker.commands.runInteractive\" code blocks:\n\n        ```python\n        -e 'SECRET_KEY=supersecretkeythatispassedtopythonapp'\n        ```\n\n1. Set the `docker.dockerPath` configuration setting used by the templates. To set `docker.dockerPath`, open the VS Code **Command Palette** (**Ctrl+Shift+P**), enter \"Preferences: Open Workspace Settings\", then enter \"docker.dockerPath\" in the **Search settings** box. Enter \"docker\" (without the quotes) for the value of the setting.\n\n    > [!NOTE]\n    > Both the database name and collection name are assumed to be `restaurants_reviews`.\n\n1. Run the image.\n\n    1. In the **IMAGES** section of the Docker extension, find the built image.\n\n    1. Expand the image to find the **latest** tag, right-click, and select **Run Interactive**.\n\n    1. You're prompted to select the task appropriate for your scenario, either \"Interactive run configuration (MongoDB local)\" or \"Interactive run configuration (MongoDB Azure)\".\n\n    With an interactive run, you see any print statements in the code, which can be useful for debugging. You can also select **Run**, which is non-interactive and doesn't keep standard input open.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-docker-extension-container-run.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-docker-extension-container-run.png\" alt-text=\"A screenshot that shows how to run a Docker container in Visual Studio Code.\" :::\n\n    > [!IMPORTANT]\n    > This step fails if the default terminal profile is set to (Windows) Command Prompt. To change the default profile, open the VS Code **Command Palette** (**Ctrl+Shift+P**), enter \"Terminal: Select Default Profile\", and then select a different profile from the dropdown menu - such as *Git Bash* or *PowerShell*.\n\n1. Confirm that the Docker container is running.\n\n    1. In the **CONTAINERS** section of the Docker extension, find the container.\n\n    1. Expand the **Individual Containers** node and confirm that the \"msdocspythoncontainerwebapp\" container is running. Look for a green triangle symbol next to the container name.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-docker-extension-container-confirm.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-docker-extension-container-confirm.png\" alt-text=\"A screenshot showing how to confirm a Docker container is running in Visual Studio Code.\" :::\n\n1. Test the web app by right-clicking the container name and selecting **Open in Browser**.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-docker-extension-container-open.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-docker-extension-container-open.png\" alt-text=\"A screenshot that shows how to browse the endpoint of a Docker container in Visual Studio Code.\" :::\n\n    The browser opens into your default browser as \"http://127.0.0.1:8000\" for Django or \"http://127.0.0.1:5000/\" for Flask.\n\n    > [!NOTE]\n    > If you receive a timeout error, verify that the MongoDB service is running. If not, stop the Docker container in VS Code and restart the MongoDB service. Then, start the Docker container again and try to access the web app in your browser.\n\n1. Stop the container.\n\n    1. In the **CONTAINERS** section of the Docker extension, find the running container.\n\n    1. Right-click the container and select **Stop**.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-docker-extension-container-stop.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-docker-extension-container-stop.png\" alt-text=\"A screenshot showing how to stop a running Docker container in Visual Studio Code.\" :::\n\n> [!TIP]\n> You can also run the container selecting a run or debug configuration. The Docker extension tasks in *tasks.json* are called when you run or debug. The task called depends on what launch configuration you select. For the task \"Docker: Python (MongoDB local)\", specify \\<YOUR-IP-ADDRESS>. For the task \"Docker: Python (MongoDB Azure)\", specify \\<CONNECTION-STRING>.\n\n---\n\nYou can also start a container from an image and stop it with the [Docker Desktop](https://www.docker.com/products/docker-desktop/) application.\n\n## Next step\n\n> [!div class=\"nextstepaction\"]\n> [Build a container image in Azure](tutorial-containerize-deploy-python-web-app-azure-03.md)\n"
  },
  {
    "path": "articles/python/tutorial-containerize-deploy-python-web-app-azure-03.md",
    "content": "---\ntitle: Build a containerized Python web app in Azure Container Registry\ndescription: Build a containerized Python web app (Django or Flask) in Azure Container Registry, without the need to install Docker locally.\nms.topic: how-to\nms.date: 04/10/2025\nms.custom:\n  - devx-track-python\n  - py-fresh-zinc\n  - devx-track-azurecli\n  - sfi-image-nochange\n---\n\n# Build a containerized Python web app in Azure\n\nIn this part of the tutorial series, you learn how to build a containerized Python web app directly in [Azure Container Registry](/azure/container-registry/container-registry-intro) without installing Docker locally. Building the Docker image in Azure is often faster and easier than creating the image locally and then pushing it to the Azure Container Registry. Additionally, cloud-based image building eliminates the need for Docker to run in your development environment.\n\nApp Service enables you to run containerized web apps and deploy them through the continuous integration/continuous deployment (CI/CD) capabilities of Docker Hub, Azure Container Registry, and Visual Studio Team Services. This article is part 3 of a 5-part tutorial series about how to containerize and deploy a Python web app to Azure App Service. In this part of the tutorial, you learn how to build the containerized Python web app in Azure.\n\nAzure App Service lets you deploy and run containerized web apps using CI/CD pipelines from platforms like Docker Hub, Azure Container Registry, and Azure DevOps. This article is part 3 of a 5-part tutorial series.\n\nIn [part 2 of this tutorial](tutorial-containerize-deploy-python-web-app-azure-02.md) series, you built and ran the container image locally. In contrast, in this part of the tutorial, you build (containerize) the same Python web app directly into a Docker image in the [Azure Container Registry](/azure/container-registry/container-registry-intro). Building the image in Azure is typically faster and easier than building locally and then pushing the image to a registry. Also, building in the cloud doesn't require Docker to be running in your dev environment.\n\nOnce the Docker image is in Azure Container Registry, it can be deployed to Azure App service.\n\nThis service diagram highlights the components covered in this article.\n\n:::image type=\"content\" source=\"./media/tutorial-container-web-app/containerization-of-python-apps-build-cloud.png\" alt-text=\"A screenshot of the services using in the Tutorial - Containerized Python App on Azure with the build-in-cloud path highlighted.\" lightbox=\"./media/tutorial-container-web-app/containerization-of-python-apps-build-cloud.png\":::\n\n### [Azure CLI](#tab/azure-cli)\n\n## Create an Azure Container Registry\n\nIf you have an existing Azure Container Registry you wish to use, skip this next step and proceed to the next step. Otherwise, create a new Azure Container Registry using the Azure CLI.\n\nAzure CLI commands can be run in the [Azure Cloud Shell](https://shell.azure.com/) or in your local development environment with the [Azure CLI installed](/cli/azure/install-azure-cli).\n\n> [!NOTE]\n> Use the same names as in part 2 of this tutorial series.\n\n1. Create an Azure container registry with the [az acr create](/cli/azure/acr#az-acr-create) command.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    # Use the resource group that you created in part 2 of this tutorial series.\n    RESOURCE_GROUP_NAME='msdocs-web-app-rg'\n    # REGISTRY_NAME must be unique within Azure and contain 5-50 alphanumeric characters.\n    REGISTRY_NAME='msdocscontainerregistryname'\n\n    echo \"Creating Azure Container Registry $REGISTRY_NAME...\"\n    az acr create -g $RESOURCE_GROUP_NAME -n $REGISTRY_NAME --sku Standard\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    # Use the resource group that you created in part 2 of this tutorial series.\n    $RESOURCE_GROUP_NAME='msdocs-web-app-rg'\n    # REGISTRY_NAME must be unique within Azure and contain 5-50 alphanumeric characters.\n    $REGISTRY_NAME='msdocscontainerregistryname'\n\n    Write-Output \"Creating Azure Container Registry $REGISTRY_NAME...\"\n    az acr create -g $RESOURCE_GROUP_NAME -n $REGISTRY_NAME --sku Standard\n    ```\n\n    ---\n\n    In the JSON output of the command, locate the `loginServer` value. This value represents the fully qualified registry name (all lowercase) and contains the registry name.\n\n1. If you're using the Azure CLI on your local machine, execute the [az acr login](/cli/azure/acr#az-acr-login) command to log in to the container registry.\n\n    ```azurecli-interactive\n    az acr login -n $REGISTRY_NAME\n    ```\n\n    The command adds \"azurecr.io\" to the name to create the fully qualified registry name. If successful, you see the message \"Login Succeeded\".\n\n    > [!NOTE]\n    > In the Azure Cloud Shell, the az `acr login command` isn't necessary, as authentication is handled automatically through your Cloud Shell session. However, if you encounter authentication issues, you can still use it.\n\n## Build an image in Azure Container Registry\n\nYou can generate the container image directly in Azure through various approaches:\n\n  * The Azure Cloud Shell allows you to construct the image entirely in the cloud, independent of your local environment.\n  * Alternatively, you can use VS Code or the Azure CLI to create it in Azure from your local setup, without needing Docker to be running locally.\n\nAzure CLI commands can be run in your local development environment with the [Azure CLI installed](/cli/azure/install-azure-cli) or in [Azure Cloud Shell](https://shell.azure.com/).\n\n1. In the console, navigate to the root folder for your cloned repository from part 2 of this tutorial series.\n\n1. Build the container image using the [az acr build](/cli/azure/acr#az-acr-build) command.\n\n    ```azurecli-interactive\n    az acr build -r $REGISTRY_NAME -g $RESOURCE_GROUP_NAME -t msdocspythoncontainerwebapp:latest .\n    # When using Azure Cloud Shell, run one of the following commands instead:\n    # az acr build -r $REGISTRY_NAME -g $RESOURCE_GROUP_NAME -t msdocspythoncontainerwebapp:latest https://github.com/Azure-Samples/msdocs-python-django-container-web-app.git\n    # az acr build -r $REGISTRY_NAME -g $RESOURCE_GROUP_NAME -t msdocspythoncontainerwebapp:latest https://github.com/Azure-Samples/msdocs-python-flask-container-web-app.git\n    ```\n\n    The last argument in the command is the fully qualified path to the repo. When running in Azure Cloud Shell, use https://github.com/Azure-Samples/msdocs-python-django-container-web-app.git for the Django sample app and https://github.com/Azure-Samples/msdocs-python-flask-container-web-app.git for the Flask sample app.\n\n1. Confirm the container image was created with the [az acr repository list](/cli/azure/acr/repository#az-acr-repository-list) command.\n\n    ```azurecli-interactive\n    az acr repository list -n $REGISTRY_NAME\n    ```\n\n### [VS Code](#tab/vscode-aztools)\n\n## Create an Azure Container Registry\n\nIf you have an existing Azure Container Registry you wish to use, skip this next step and proceed to the next step. Otherwise, create a new Azure Container Registry using VS Code.\n\n> [!IMPORTANT]\n> The steps in this section assume that you previously completed the **VS Code** sections of part 2 of this tutorial series.\n\n1. In the Docker extension in VS Code, go to **REGISTRIES** and click **Azure** to connect to the Azure Container Registry.\n1. In Visual Studio Code, select **F1** or **CTRL+SHIFT+P** to open the command palette. Then type \"registry\" and select the **Azure Container Registry: Create Registry** task.\n\n    Alternatively, in the Docker extension **REGISTRIES** section, right-click your subscription, and select **Create Registry**. This action starts the same create registry task.\n\n1. Follow the prompts and enter the following values:\n\n    * **Registry name**: Enter **msdocscontainerregistryname**. The registry name must be unique within Azure, and contain 5-50 alphanumeric characters.\n\n    * **SKU**: Select **Standard**.\n\n    * **Resource group**: Use your existing resource group.\n\n1. In the Docker extension, in the **REGISTRIES** section, find the registry you created, right-click, and select **View Properties**.\n\n    Look for the `loginServer` key value pair in the output. The value is the fully qualified name of the registry.\n\n## Build an image in Azure Container Registry\n\nYou can generate the container image directly in Azure through various approaches:\n\n  * The Azure Cloud Shell allows you to construct the image entirely in the cloud, independent of your local environment.\n  * Alternatively, you can use VS Code or the Azure CLI to create it in Azure from your local setup, without needing Docker to be running locally.\n\nThese steps require that VS Code is opened in the working folder of your web app.\n\n1. In the Docker extension, click **REGISTRIES** and then click **Azure** to connect to the Azure Container Registry.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-build-image-registries.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-build-image-registries.png\" alt-text=\"A screenshot showing how to check that Azure is signed into Docker Extension in Visual Studio Code.\" :::\n\n1. Select **F1** or **CTRL+SHIFT+P** to open the command palette, type \"registry\", and select the **Azure Container Registry: Build Image in Azure** task.\n\n    If you don't see the task, make sure that **Azure** appears under **REGISTRIES** in the Docker extension. You can also right-click the *Dockerfile* and select **Build Image in Azure** to run the task.\n\n1. Input the following values and follow the prompts to create the image.\n\n    * **Tag image**: Use the image name \"msdocspythoncontainerwebapp:latest\".\n    * **Registry provider**: Select **Azure**.\n    * **Subscription**: Select the subscription you used to create the Azure Container Registry.\n    * **Registry**: Select the registry you created or one to which you have access.\n    * **Base OS image**: Select **Linux**.\n\n    Check the **OUTPUT** window for progress and information on the build. If you get a credentials error, right-click the registry in the **REGISTRIES** section of the Docker extension and select **Refresh**.\n\n1. Confirm the image in the Azure Container Registry.\n\n    1. In the Docker extension, in the **REGISTRIES** section, find the container image created. You may need to close and re-open VS Code to see the image.\n\n    1. Confirm the name and tag **latest**.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-build-image-confirm.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-build-image-confirm.png\" alt-text=\"A screenshot showing how to confirm the  information to  build container in Azure in Visual Studio Code.\" :::\n\n---\n\n## Next step\n\n> [!div class=\"nextstepaction\"]\n> [Deploy web app](tutorial-containerize-deploy-python-web-app-azure-04.md)\n"
  },
  {
    "path": "articles/python/tutorial-containerize-deploy-python-web-app-azure-04.md",
    "content": "---\ntitle: Deploy a Python web app container to Azure App Service\ndescription: How to deploy a Python web app container (Django or Flask) to App Service using managed identity authentication with Azure Container Registry.\nms.devlang: python\nms.topic: tutorial\nms.date: 04/10/2025\nms.custom:\n  - devx-track-python\n  - devx-track-azurecli\n  - py-fresh-zinc\n  - sfi-image-nochange\n---\n\n# Deploy a containerized Python app to App Service\n\nIn this part of the tutorial series, you learn how to deploy a containerized Python web application to [Azure App Service Web App for Containers](/azure/app-service/containers/). This fully managed service lets you run containerized apps without having to maintain your own container orchestrator.\n\nApp Service simplifies deployment through continuous integration/continuous deployment (CI/CD) pipelines that work with Docker Hub, Azure Container Registry, Azure Key Vault, and other DevOps tools. This tutorial is part 4 of a 5-part tutorial series.\n\nAt the end of this article, you have a secure, production-ready App Service web app running from a Docker container image. The app uses a **system-assigned managed identity** to pull the image from Azure Container Registry and retrieve secrets from Azure Key Vault.\n\nThis service diagram highlights the components covered in this article.\n\n:::image type=\"content\" source=\"./media/tutorial-container-web-app/containerization-of-python-apps-deploy.png\" alt-text=\"A screenshot of the services using in the Tutorial - Containerized Python App on Azure with deployment path highlighted.\" lightbox=\"./media/tutorial-container-web-app/containerization-of-python-apps-deploy.png\" :::\n\n### [Azure CLI](#tab/azure-cli)\n\nAzure CLI commands can be run in the [Azure Cloud Shell](https://shell.azure.com/) or on a local machine with the [Azure CLI installed](/cli/azure/install-azure-cli).\n\n> [!IMPORTANT]\n> We recommend using **Azure Cloud Shell** for all CLI-based steps in this tutorial because it:\n>\n> * Comes pre-authenticated with your Azure account, avoiding login issues\n> * Includes all required Azure CLI extensions out of the box\n> * Ensures consistent behavior regardless of your local OS or environment\n> * Requires no local installation, ideal for users without admin rights\n> * Provides direct access to Azure services from the portal—no local Docker or network setup required\n> * Avoids local firewall or network configuration issues\n\n## Create Key Vault with RBAC Authorization\n\nAzure Key Vault is a secure service for storing secrets, API keys, connection strings, and certificates. In this script, it stores the **MongoDB connection string** and the web app’s **`SECRET_KEY`**.\n\nThe Key Vault is configured to use **role-based access control (RBAC)** to manage access through Azure roles instead of traditional access policies. The web app uses its **system-assigned managed identity** to retrieve secrets securely at runtime.\n\n> [!NOTE]\n> Creating the Key Vault early ensures that roles can be assigned before any attempt to access secrets. It also helps avoid propagation delays in role assignments. Since Key Vault doesn’t depend on the App Service, provisioning it early improves reliability and sequencing.\n\n1. In this step, you use the [az keyvault create](/cli/azure/keyvault#az-keyvault-create) command to create an Azure Key Vault with RBAC enabled.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    RESOURCE_GROUP_NAME=\"msdocs-web-app-rg\"\n    LOCATION=\"westus\"\n    KEYVAULT_NAME=\"${RESOURCE_GROUP_NAME}-kv\"\n\n    az keyvault create \\\n      --name \"$KEYVAULT_NAME\" \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --location \"$LOCATION\" \\\n      --enable-rbac-authorization true\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    $RESOURCE_GROUP_NAME=\"msdocs-web-app-rg\"\n    $LOCATION=\"westus\"\n    $KEYVAULT_NAME=\"${RESOURCE_GROUP_NAME}-kv\"\n\n    az keyvault create `\n      --name \"$KEYVAULT_NAME\" `\n      --resource-group \"$RESOURCE_GROUP_NAME\" `\n      --location \"$LOCATION\" `\n      --enable-rbac-authorization true\n    ```\n\n    ---\n\n## Create the app service plan and web app\n\nThe App Service Plan defines the compute resources, pricing tier, and region for your web app. The web app runs your containerized application and is provisioned with a system-assigned managed identity that is used to securely authenticate to Azure Container Registry (ACR) and Azure Key Vault.\n\nIn this step, you perform the following tasks:\n\n* Create an App Service Plan\n* Create the web app with its managed identity\n* Configure the web app to deploy using a specific container image\n* Prepare for continuous deployment via ACR\n\n> [!NOTE]\n> The web app must be created before assigning access to ACR or Key Vault because the **managed identity is only created at deployment time**.\n> Also, assigning the container image during creation ensures the app starts up correctly with the intended configuration.\n\n1. In this step, you use the [az appservice plan create](/cli/azure/appservice/plan#az-appservice-plan-create) command to provision the compute environment for your app.\n\n    ### [Bash](#tab/bash)\n  \n    ```azurecli-interactive\n    #!/bin/bash\n    APP_SERVICE_PLAN_NAME=\"msdocs-web-app-plan\"\n    \n    az appservice plan create \\\n        --name \"$APP_SERVICE_PLAN_NAME\" \\\n        --resource-group \"$RESOURCE_GROUP_NAME\" \\\n        --sku B1 \\\n        --is-linux\n    ```\n  \n    ### [PowerShell](#tab/powershell)\n  \n    ```powershell-interactive\n    # PowerShell syntax\n    $APP_SERVICE_PLAN_NAME=\"msdocs-web-app-plan\"\n    \n    az appservice plan create `\n        --name \"$APP_SERVICE_PLAN_NAME\" `\n        --resource-group \"$RESOURCE_GROUP_NAME\" `\n        --sku B1 `\n        --is-linux\n    ```\n  \n    ---\n\n1. In this step, you use the [az webapp create](/cli/azure/webapp#az-webapp-create) command to create the web app. This command also enables a [system-assigned managed identity](/azure/active-directory/managed-identities-azure-resources/overview#managed-identity-types) and sets the container image that the app runs.\n\n    ### [Bash](#tab/bash)\n  \n    ```azurecli-interactive\n    #!/bin/bash\n    APP_SERVICE_NAME=\"msdocs-website-name\" #APP_SERVICE_NAME must be globally unique as it becomes the website name in the URL `https://<website-name>.azurewebsites.net`.\n    # Use the same registry name as in part 2 of this tutorial series.\n    REGISTRY_NAME=\"msdocscontainerregistryname\" #REGISTRY_NAME is the registry name you used in part 2 of this tutorial.\n    CONTAINER_NAME=\"$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest\" #CONTAINER_NAME is of the form \"yourregistryname.azurecr.io/repo_name:tag\".\n    \n    az webapp create \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --plan \"$APP_SERVICE_PLAN_NAME\" \\\n      --name \"$APP_SERVICE_NAME\" \\\n      --assign-identity '[system]' \\\n      --deployment-container-image-name \"$CONTAINER_NAME\" \n    ```\n  \n    ### [PowerShell](#tab/powershell)\n  \n    ```powershell-interactive\n    # Powershell syntax\n    $APP_SERVICE_NAME=\"msdocs-website-name\"\n    # Use the same rregistry name as in part 2 of this tutorial series.\n    $REGISTRY_NAME=\"msdocscontainerregistryname\"\n    $CONTAINER_NAME = \"$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest\"\n    \n    az webapp create `\n      --resource-group \"$RESOURCE_GROUP_NAME\" `\n      --plan \"$APP_SERVICE_PLAN_NAME\" `\n      --name \"$APP_SERVICE_NAME\" `\n      --assign-identity '[system]' `\n      --deployment-container-image-name \"$CONTAINER_NAME\" \n    ```\n  \n    ---\n\n      > [!NOTE]\n      > When running this command, you may see the following error:\n      >\n      >    ```output\n      >    No credential was provided to access Azure Container Registry. Trying to look up...\n      >    Retrieving credentials failed with an exception:'Failed to retrieve container registry credentials. Please either provide the credentials or run 'az acr update -n msdocscontainerregistryname --admin-enabled true' to enable admin first.'\n      >    ```\n      >\n      > This error occurs because the web app tries to use admin credentials to access ACR, which credentials are disabled by default. It's safe to ignore this message: the next step configures the web app to use its managed identity to authenticate with ACR.\n\n## Grant Secrets Officer Role to logged-in user\n\nTo store secrets in Azure Key Vault, the user running the script must have the **Key Vault Secrets Officer** role. This role allows creating and managing secrets within the vault.\n\nIn this step, the script assigns that role to the currently logged-in user. This user can then securely store application secrets, such as the MongoDB connection string and the app’s `SECRET_KEY`.\n\nThis role assignment is the first of two Key Vault–related role assignments. Later, the web app’s system-assigned managed identity is granted access to retrieve secrets from the vault.\n\nUsing **Azure RBAC** ensures secure, auditable access based on identity, eliminating the need for hard-coded credentials.\n\n> [!NOTE]\n> The user must be assigned the **Key Vault Secrets Officer** role **before** before attempting to store any secrets in the key vault.\n> This assignment is done using the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command scoped to the Key Vault.\n\n1. In this step, you use the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command to assign the role at the Key Vault scope.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    CALLER_ID=$(az ad signed-in-user show --query id -o tsv)\n    echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully.\n    \n    az role assignment create \\\n      --role \"Key Vault Secrets Officer\" \\\n      --assignee \"$CALLER_ID\" \\\n      --scope \"/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME\"\n    \n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    $CALLER_ID=$(az ad signed-in-user show --query id -o tsv)\n    echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully.\n\n    az role assignment create `\n      --role \"Key Vault Secrets Officer\" `\n      --assignee \"$CALLER_ID\" `\n      --scope \"/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME\"\n    ```\n\n    ---\n\n## Grant web access to ACR using managed identity\n\nTo pull images from Azure Container Registry (ACR) securely, the web app must be configured to use its **system-assigned managed identity**. Using managed identity avoids the need for admin credentials and supports secure, credential-free deployment.\n\nThis process involves two key actions:\n\n* Enabling the web app to use its managed identity when accessing ACR\n* Assigning the **AcrPull** role to that identity on the target ACR\n\n1. In this step, you retrieve the **principal ID** (unique object ID) of the web app’s managed identity using the [az webapp identity show](/cli/azure/webapp/identity#az-webapp-identity-show) command. Next, you enable the use of the managed identity for ACR authentication by setting the `acrUseManagedIdentityCreds` property to `true` using [az webapp config set](/cli/azure/webapp/config#az-webapp-config-set). You then assign the **AcrPull** role to the web app’s managed identity using the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command. This role grants the web app permission to pull images from the registry.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    PRINCIPAL_ID=$(az webapp identity show \\\n      --name \"$APP_SERVICE_NAME\" \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --query principalId \\\n      -o tsv)\n    echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`.    \n\n    az webapp config set \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --name \"$APP_SERVICE_NAME\" \\\n      --generic-configurations '{\"acrUseManagedIdentityCreds\": true}'\n    \n    az role assignment create \\\n    --role \"AcrPull\" \\\n    --assignee \"$PRINCIPAL_ID\" \\\n    --scope \"/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME\"\n    \n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    $PRINCIPAL_ID=$(az webapp identity show `\n      --name \"$APP_SERVICE_NAME\" `\n      --resource-group \"$RESOURCE_GROUP_NAME\" `\n      --query principalId `\n      -o tsv)\n    echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful AcrPull role assignment using `az role assignment list`.    \n\n    az webapp config set `\n      --resource-group \"$RESOURCE_GROUP_NAME\" `\n      --name \"$APP_SERVICE_NAME\" `\n      --generic-configurations '{ \"acrUseManagedIdentityCreds\": true }'\n    \n    az role assignment create `\n      --role \"AcrPull\" `\n      --assignee \"$PRINCIPAL_ID\" `\n      --scope \"/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME\"\n    ```\n\n    ---\n\n## Grant key vault access to the web app's managed identity\n\nThe web app needs permission to access secrets like the MongoDB connection string and the `SECRET_KEY`. To grant these permissions, you must assign the **Key Vault Secrets User** role to the web app’s **system-assigned managed identity**.\n\n1. In this step, you use the unique identifier (principal ID) of the web app’s system-assigned managed identity to grant the web app access to the Key Vault with the **Key Vault Secrets User** role using the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    \n    az role assignment create \\\n    --role \"Key Vault Secrets User\" \\\n    --assignee \"$PRINCIPAL_ID\" \\\n    --scope \"/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME\"\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    \n      az role assignment create `\n      --role \"Key Vault Secrets User\" `\n      --assignee \"$PRINCIPAL_ID\"`\n      --scope \"/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME\"\n    \n    ```\n\n    ---\n\n## Store Secrets in Key Vault\n\nTo avoid hardcoding secrets in your application, this step stores the **MongoDB connection string** and the web app’s **secret key** in Azure Key Vault. These secrets can then be securely accessed by the web app at runtime through its managed identity, without the need to store credentials in code or configuration.\n\n> [!NOTE]\n> While this tutorial stores only the connection string and secret key in the key vault, you can optionally store other application settings such as the MongoDB database name or collection name in Key Vault as well.\n\n1. In this step, you use the [az cosmosdb keys list](/cli/azure/cosmosdb/keys#az-cosmosdb-keys-list) command to retrieve the MongoDB connection string. You then use the [az keyvault secret set](/cli/azure/keyvault/secret#az-keyvault-secret-set) command to store both the connection string and a randomly generated secret key in Key Vault.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    ACCOUNT_NAME=\"msdocs-cosmos-db-account-name\"\n\n    MONGO_CONNECTION_STRING=$(az cosmosdb keys list \\\n      --name \"$ACCOUNT_NAME\" \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --type connection-strings \\\n      --query \"connectionStrings[?description=='Primary MongoDB Connection String'].connectionString\" -o tsv)\n    \n    SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9')\n    # This key is cryptographically secure, using OpenSSL’s strong random number generator.\n    \n    az keyvault secret set \\\n      --vault-name \"$KEYVAULT_NAME\" \\\n      --name \"MongoConnectionString\" \\\n      --value \"$MONGO_CONNECTION_STRING\"\n    \n    az keyvault secret set \\\n      --vault-name \"$KEYVAULT_NAME\" \\\n      --name \"MongoSecretKey\" \\\n      --value \"$SECRET_KEY\"\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    $ACCOUNT_NAME=\"msdocs-cosmos-db-account-name\"\n\n    $MONGO_CONNECTION_STRING = az cosmosdb keys list `\n      --name $ACCOUNT_NAME `\n      --resource-group $RESOURCE_GROUP_NAME `\n      --type connection-strings `\n      --query \"connectionStrings[?description=='Primary MongoDB Connection String'].connectionString\" `\n      -o tsv\n     \n    # Generate a 32-byte cryptographically secure random value\n    $bytes = New-Object 'Byte[]' 32\n    [System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes)\n    \n    # Convert to base64 and filter to alphanumeric characters only\n    $base64 = [Convert]::ToBase64String($bytes)\n    $alphanumeric = $base64 -replace '[^a-zA-Z0-9]', ''\n    \n    # Truncate to 50 characters\n    $SECRET_KEY = $alphanumeric.Substring(0, [Math]::Min(50, $alphanumeric.Length))\n     \n    az keyvault secret set `\n      --vault-name \"$KEYVAULT_NAME\" `\n      --name \"MongoConnectionString\" `\n      --value \"$MONGO_CONNECTION_STRING\"\n    \n    az keyvault secret set `\n      --vault-name \"$KEYVAULT_NAME\" `\n      --name \"MongoSecretKey\" `\n      --value \"$SECRET_KEY\"\n    ```\n\n    ---\n\n## Configure web app to use Kay Vault secrets\n\nTo access secrets securely at runtime, the web app must be configured to reference the secrets stored in Azure Key Vault. This step is done using **Key Vault references**, which inject the secret values into the app’s environment through its **system-assigned managed identity**.\n\nThis approach avoids hardcoding secrets and allows the app to securely retrieve sensitive values like the MongoDB connection string and secret key during execution.\n\n1. In this step, you use the [az webapp config appsettings set](/cli/azure/webapp/config/appsettings#az-webapp-config-appsettings-set) command to add application settings that reference the Key Vault secrets. Specifically, this sets the `MongoConnectionString` and `MongoSecretKey` app settings to reference the corresponding secrets stored in Key Vault.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    MONGODB_NAME=\"restaurants_reviews\"\n    MONGODB_COLLECTION_NAME=\"restaurants_reviews\"\n    \n    az webapp config appsettings set \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --name \"$APP_SERVICE_NAME\" \\\n      --settings \\\n          CONNECTION_STRING=\"@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)\" \\\n          SECRET_KEY=\"@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)\" \\\n          DB_NAME=\"$MONGODB_NAME\" \\\n          COLLECTION_NAME=\"$MONGODB_COLLECTION_NAME\"\n      ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    $MONGO_DB_NAME=\"restaurants_reviews\"\n    $MONGO_COLLECTION_NAME=\"restaurants_reviews\"\n    \n    az webapp config appsettings set `\n      --resource-group $RESOURCE_GROUP_NAME `\n      --name $APP_SERVICE_NAME `\n      --settings `\n        CONNECTION_STRING=\"@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)\" `\n        SECRET_KEY=\"@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)\" `\n        DB_NAME=$MONGODB_NAME `\n        COLLECTION_NAME=$MONGODB_COLLECTION_NAME\n    ```\n\n    ---\n\n## Enable continuous deployment from ACR\n\nEnabling continuous deployment allows the web app to automatically pull and run the latest container image whenever one is pushed to Azure Container Registry (ACR). This reduces manual deployment steps and helps ensure your app stays up to date.\n\n> [!NOTE]\n> In the next step, you'll register a webhook in ACR to notify the web app when a new image is pushed.\n\n1. In this step, you use the [az webapp deployment container config](/cli/azure/webapp/deployment/container#az-webapp-deployment-container-config) command to enable continuous deployment from ACR to the web app.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    az webapp deployment container config \\\n      --name \"$APP_SERVICE_NAME\" \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --enable-cd true\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    az webapp deployment container config `\n      --name \"$APP_SERVICE_NAME\" `\n      --resource-group \"$RESOURCE_GROUP_NAME\" `\n      --enable-cd true\n    ```\n\n    ---\n\n## Register an ACR Webhook for continuous deployment\n\nTo automate deployments, register a webhook in Azure Container Registry (ACR) that notifies the web app whenever a new container image is pushed. The webhook allows the app to automatically pull and run the latest version.\n\nThe webhook configured in Azure Container Registry (ACR) sends a POST request to the web app’s SCM endpoint (SERVICE_URI) whenever a new image is pushed to the msdocspythoncontainerwebapp repository. This action triggers the web app to pull and deploy the updated image, completing the continuous deployment pipeline between ACR and Azure App Service.\n\n> [!NOTE]\n> The webhook URI must follow this format:  \n> `https://<app-name>.scm.azurewebsites.net/api/registry/webhook`  \n>\n> It **must end** with `/api/registry/webhook`. If you receive a URI error, confirm that the path is correct.\n\n1. In this step, use the [az acr webhook create](/cli/azure/acr/webhook#az-acr-webhook-create) command to register the webhook and configure it to trigger on `push` events.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    CREDENTIAL=$(az webapp deployment list-publishing-credentials \\\n        --resource-group \"$RESOURCE_GROUP_NAME\" \\\n        --name \"$APP_SERVICE_NAME\" \\\n        --query publishingPassword --output tsv)\n    # Web app publishing credentials may not be available immediately. In production, poll until non-empty.   \n    \n    SERVICE_URI=\"https://$APP_SERVICE_NAME:$CREDENTIAL@$APP_SERVICE_NAME.scm.azurewebsites.net/api/registry/webhook\"\n    \n    az acr webhook create \\\n      --name webhookforwebapp \\\n      --registry \"$REGISTRY_NAME\" \\\n      --scope msdocspythoncontainerwebapp:* \\\n      --uri \"$SERVICE_URI\" \\\n      --actions push\n    \n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    $CREDENTIAL=$(az webapp deployment list-publishing-credentials `\n      --resource-group \"$RESOURCE_GROUP_NAME\" `\n      --name \"$APP_SERVICE_NAME\" `\n      --query publishingPassword --output tsv)\n    \n    # Web app publishing credentials may not be available immediately. In production, poll until non-empty.   \n    \n    $SERVICE_URI = \"https://$APP_SERVICE_NAME`:$CREDENTIAL@$APP_SERVICE_NAME.scm.azurewebsites.net/api/registry/webhook\"\n\n    az acr webhook create `\n      --name webhookforwebapp `\n      --registry \"$REGISTRY_NAME\" `\n      --scope msdocspythoncontainerwebapp:* `\n      --uri \"$SERVICE_URI\" `\n      --actions push\n    ```\n\n    ---\n\n## Browse the site\n\nTo verify that the web app is running, open `https://<website-name>.azurewebsites.net`, replacing `<website-name>` with the name of your App Service. You should see the restaurant review sample app. It may take a few moments to load the first time.\n\nOnce the site appears, try adding a restaurant and submitting a review to confirm that the app is functioning correctly.\n\n> [!NOTE]\n> The `az webapp browse` command isn't supported in Cloud Shell. If you're using Cloud Shell, manually open a browser and navigate to the site URL.\n\nIf you're using the Azure CLI locally, you can use the [az webapp browse](/cli/azure/webapp#az-webapp-browse) command to open the site in your default browser:\n\n```azurecli\naz webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME\n```\n\n> [!NOTE]\n> The `az webapp browse` command isn't supported in Cloud Shell. Open a browser window and navigate to the website URL instead.\n\n### [VS Code](#tab/vscode-aztools)\n\nYou can use the Docker extension in Visual Studio Code to build and deploy your containerized web application to Azure App Service. This extension streamlines the process of packaging your app and pushing it to the cloud. Once deployed, use the Azure Tools extension to configure the web app's settings, including the MongoDB connection string and a secret key for the application.\n\nInitially, configure and test the app using hardcoded values to ensure it starts successfully connects to the MongoDB database. After verifying that the app works, use the Azure CLI (either locally or in the Cloud Shell) to create an Azure Key Vault. Next, grant the user creating the app in VS Code permission to store sensitive information and then store the MongoDB connection string and the app's secret key as Key Vault secrets.\n\nFinally, in Visual Studio Code, update the web app's application settings to reference the secrets stored in Key Vault. The app can now securely access configuration values without embedding them directly in code.\n\n## Create the web app\n\nThese steps require the installation of the [Docker extension](https://code.visualstudio.com/docs/containers/overview) for VS Code.\n\n1. Refresh the Azure Container Registry in the Docker extension to confirm that the container you built appears under the **REGISTRIES** section of the Docker extension. If it doesn't, right-click the registry name and select **Refresh**.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-refresh-registries.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-refresh-registries.png\" alt-text=\"A screenshot showing how to fresh registries in the Docker extension for Visual Studio Code.\" :::\n\n1. Select **F1** or **CTRL+SHIFT+P** to open the command palette, type \"Docker Registries\", and select the **Docker Registries: Deploy Image to Azure App Service...** task.\n\n1. Enter the following values as prompted to deploy the image:\n\n    * Select registry provider: **Azure**\n    * Subscription: Select the subscription that contains the Azure Container Registry you created earlier.\n    * Select registry: Enter the name of the registry you created earlier in this tutorial.\n    * Select repository: Enter the repository name **msdocscontainerregistryname**. If you don't see this repo, refresh the Docker extension **REGISTRIES** section.\n    * Select tag: **latest** for the image tag.\n    * Enter a globally unique name for the web app: Enter a name that is globally unique to Azure App Service. For example, if you use **msdocs-website-name**, the web app URL would be `http://msdocs-website-name.azurewebsites.net`.\n    * Select a resource group: Use the resource group that contains the Azure Container Registry you created earlier.\n    * Select a Linux App Service plan: Use an existing or create a new one.\n\n1. View the **OUTPUT** window for details of the deployment. One of the output lines is \"Granting permission for App Service to pull image from ACR...\", which the App Service accesses the registry using managed identity.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-site-deployed.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-site-deployed.png\" alt-text=\"A screenshot showing prompt when Docker image is deployed App Service in Visual Studio Code.\" :::\n\n    The final site `https://<app-name>.azurewebsites.net` isn't ready yet because you need to specify MongoDB info.\n\n    >[!NOTE]\n    > When you deploy with Visual Studio Code, managed identity is already set for the App Service to pull images from the registry. You can confirm managed identity is enabled by viewing logs in the **OUTPUT** window and looking for the message \"Granting permission for App Service to pull image from ACR...\".\n\n## Configure managed identity and webhook\n\nDuring the deploy with VS Code, a webhook is created that enables the web app to pull new images from the Azure Container Registry.\n\n1. Review the webhooks configuration in the Azure portal to confirm the **Service URI** ends with \"/api/registry/webhook\". To review the service URI, open the Docker extension in VS Code and find the registry you created. Right-click the registry and select **Open in Portal**. The container registry opens in the Azure portal. Click **Services** and then click **Webhooks**. Open the context menu and click **Configure**.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-create-app-webhook.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-create-app-webhook.png\" alt-text=\"A screenshot showing how to check a webhook configuration.\" :::\n\n2. Confirm that the **Service URI** ends with \"/api/registry/webhook\". If it doesn't, add it to the end of the string and click **Save**\n\n## Configure connection to MongoDB using hard-coded values\n\nIn this step, you specify the environment variables needed for the web application to connect to MongoDB.\n\n> [!NOTE]\n> To configure environment variables for the web app from VS Code, you must have the [Azure Tools extension pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) installed and be signed into Azure from VS Code.\n\n1. In the Azure view in VS Code (from the Azure Tools extension):\n\n    1. Expand **RESOURCES** and find **App Services** under your subscription. (Make sure you viewing resources by **Group by Resource Type**.)\n\n    1. Expand **App Services** and find the web app you created.\n\n    1. Expand your web app and right-click on **Application Settings**.\n\n    1. Select **Add new setting...**.\n\n    :::image type=\"content\" source=\"./media/tutorial-container-web-app/visual-studio-code-create-app-settings.png\" lightbox=\"./media/tutorial-container-web-app/visual-studio-code-create-app-settings.png\" alt-text=\"A screenshot showing how to add a setting to the App Service in VS Code.\" :::\n\n1. Each time you add a new setting, a dialog box appears at the top of the VS Code window where you can add the setting name followed by its value. Add the following settings:\n\n    * CONNECTION_STRING: **the MongoDB connection string**. Later in this tutorial, you set this value to the connection string that you store in Azure Key Vault.\n    * DB_NAME: **restaurants_reviews**\n    * COLLECTION_NAME: **restaurants_reviews**\n    * WEBSITES_PORT: **8000** for Django and **5000** for Flask. This environment variable specifies the port on which the container is listening.\n    * SECRET_KEY: **supersecretkeythatispassedtopythonapp**. This secret key is a random string used by Django and Flask to encrypt session data. Later in this tutorial, you set this value to the random string that you store in Azure Key Vault.\n\n## Browse the site using hard-coded values\n\nIn the Azure view in VS Code (from the Azure Tools extension):\n\n1. Expand **RESOURCES** and find **App Services** under your subscription. (Make sure you viewing resources by **Group by Resource Type**.)\n\n1. Right-click your web app and select **Browse Website**. If your web site shows an error, wait a few minutes and try again. It may take a few minutes for the web app to start up. See also [Troubleshooting App Service](#troubleshoot-deployment).\n\n## Create Key Vault with RBAC Authorization\n\nIn this step, you create an Azure Key Vault to store the **MongoDB connection string** and the web app’s **`SECRET_KEY`**. Azure Key Vault is a secure service for storing secrets, API keys, connection strings, and certificates. The Key Vault is configured to use **role-based access control (RBAC)** to manage access through Azure roles instead of traditional access policies. The web app uses its **system-assigned managed identity** to retrieve secrets securely at runtime.\n\n> [!NOTE]\n> You can configure VS Code to use the Azure CLI or PowerShell. To select your default shell in VS Code, select **F1** or **CTRL+SHIFT+P** to open the command palette. Then type **Terminal: Select Default Profile**. In the command palette, type and select: **Terminal: Select Default Profile** and then select your desired default shell.\n\n1. Run the following Azure CLI command to create a new Key Vault. This command uses either the bash or PowerShell to create a Key Vault with RBAC authorization enabled.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    RESOURCE_GROUP_NAME=\"msdocs-web-app-rg\"\n    LOCATION=\"westus\"\n    KEYVAULT_NAME=\"${RESOURCE_GROUP_NAME}-kv\"\n\n    az keyvault create \\\n      --name \"$KEYVAULT_NAME\" \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --location \"$LOCATION\" \\\n      --enable-rbac-authorization true\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    $RESOURCE_GROUP_NAME=\"msdocs-web-app-rg\"\n    $LOCATION=\"westus\"\n    $KEYVAULT_NAME=\"${RESOURCE_GROUP_NAME}-kv\"\n\n    az keyvault create `\n      --name \"$KEYVAULT_NAME\" `\n      --resource-group \"$RESOURCE_GROUP_NAME\" `\n      --location \"$LOCATION\" `\n      --enable-rbac-authorization true\n    ```\n\n    ---\n\n## Grant Secrets Officer role to logged-in user\n\nTo store secrets in Azure Key Vault, the user executing the script must be granted the **Key Vault Secrets Officer** role. This role allows the user to create and manage secrets within the vault.\n\nIn this step, the script assigns that role to the currently logged-in user, enabling them to securely store sensitive application data such as the MongoDB connection string and the app’s **SECRET_KEY**.\n\nBy using Azure Role-Based Access Control (RBAC), this approach ensures secure, auditable access to the Key Vault based on identity — avoiding the need to embed credentials directly in code or configuration files.\n\n> [!NOTE]\n> The user must be assigned the **Key Vault Secrets Officer** role **before** attempting to store any secrets in the key vault.\n> This assignment is done using the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command scoped to the Key Vault.\n\n1. In this step, you use the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command to assign the role at the Key Vault scope.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    CALLER_ID=$(az ad signed-in-user show --query id -o tsv)\n    echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully.\n    \n    az role assignment create \\\n      --role \"Key Vault Secrets Officer\" \\\n      --assignee \"$CALLER_ID\" \\\n      --scope \"/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME\"\n    \n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    $CALLER_ID=$(az ad signed-in-user show --query id -o tsv)\n    echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully.\n\n    az role assignment create `\n      --role \"Key Vault Secrets Officer\" `\n      --assignee \"$CALLER_ID\" `\n      --scope \"/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME\"\n    ```\n\n    ---\n\n## Store Secrets in Key Vault\n\nTo avoid hardcoding secrets in your application, in this step you store the **MongoDB connection string** to the MongoDB instance and the web app’s **secret key** in Azure Key Vault. These secrets can then be securely accessed by the web app at runtime through its managed identity, without the need to store credentials in code or configuration.\n\n> [!NOTE]\n> While this tutorial stores only the connection string and secret key in the key vault, you can optionally store other application settings such as the MongoDB database name or collection name in Key Vault as well.\n\n1. In this step, you use the [az cosmosdb keys list](/cli/azure/cosmosdb/keys#az-cosmosdb-keys-list) command to retrieve the MongoDB connection string. You then use the [az keyvault secret set](/cli/azure/keyvault/secret#az-keyvault-secret-set) command to store both the connection string and a randomly generated secret key in Key Vault.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n    ACCOUNT_NAME=\"msdocs-cosmos-db-account-name\"\n\n    MONGO_CONNECTION_STRING=$(az cosmosdb keys list \\\n      --name \"$ACCOUNT_NAME\" \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --type connection-strings \\\n      --query \"connectionStrings[?description=='Primary MongoDB Connection String'].connectionString\" -o tsv)\n    \n    SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9')\n    # This key is cryptographically secure, using OpenSSL’s strong random number generator.\n    \n    az keyvault secret set \\\n      --vault-name \"$KEYVAULT_NAME\" \\\n      --name \"MongoConnectionString\" \\\n      --value \"$MONGO_CONNECTION_STRING\"\n    \n    az keyvault secret set \\\n      --vault-name \"$KEYVAULT_NAME\" \\\n      --name \"MongoSecretKey\" \\\n      --value \"$SECRET_KEY\"\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n    $ACCOUNT_NAME=\"msdocs-cosmos-db-account-name\"\n\n    $MONGO_CONNECTION_STRING = az cosmosdb keys list `\n      --name $ACCOUNT_NAME `\n      --resource-group $RESOURCE_GROUP_NAME `\n      --type connection-strings `\n      --query \"connectionStrings[?description=='Primary MongoDB Connection String'].connectionString\" `\n      -o tsv\n     \n    # Generate a 32-byte cryptographically secure random value\n    $bytes = New-Object 'Byte[]' 32\n    [System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes)\n    \n    # Convert to base64 and filter to alphanumeric characters only\n    $base64 = [Convert]::ToBase64String($bytes)\n    $alphanumeric = $base64 -replace '[^a-zA-Z0-9]', ''\n    \n    # Truncate to 50 characters\n    $SECRET_KEY = $alphanumeric.Substring(0, [Math]::Min(50, $alphanumeric.Length))\n     \n    az keyvault secret set `\n      --vault-name \"$KEYVAULT_NAME\" `\n      --name \"MongoConnectionString\" `\n      --value \"$MONGO_CONNECTION_STRING\"\n    \n    az keyvault secret set `\n      --vault-name \"$KEYVAULT_NAME\" `\n      --name \"MongoSecretKey\" `\n      --value \"$SECRET_KEY\"\n    ```\n\n    ---\n\n## Grant key vault access to the web app's managed identity\n\nThe web app needs permission to access the MongoDB connection string and the `SECRET_KEY` that you stored in the key vault. To grant these permissions, you assign the **Key Vault Secrets User** role to the web app’s **system-assigned managed identity**.\n\n1. In this step, you use the unique identifier (principal ID) of the web app’s system-assigned managed identity to grant the web app access to the Key Vault with the **Key Vault Secrets User** role using the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command.\n\n    ### [Bash](#tab/bash)\n\n    ```azurecli-interactive\n    #!/bin/bash\n      APP_SERVICE_NAME=\"msdocs-website-name\"\n      PRINCIPAL_ID=$(az webapp identity show \\\n        --name \"$APP_SERVICE_NAME\" \\\n        --resource-group \"$RESOURCE_GROUP_NAME\" \\\n        --query principalId \\\n        -o tsv)\n    echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`.    \n\n    az role assignment create \\\n    --role \"Key Vault Secrets User\" \\\n    --assignee \"$PRINCIPAL_ID\" \\\n    --scope \"/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME\"\n    ```\n\n    ### [PowerShell](#tab/powershell)\n\n    ```powershell-interactive\n    # PowerShell syntax\n        $PRINCIPAL_ID=$(az webapp identity show `\n      --name \"$APP_SERVICE_NAME\" `\n      --resource-group \"$RESOURCE_GROUP_NAME\" `\n      --query principalId `\n      -o tsv)\n    echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful AcrPull role assignment using `az role assignment list`.    \n\n\n    az role assignment create `\n    --role \"Key Vault Secrets User\" `\n    --assignee \"$PRINCIPAL_ID\"`\n    --scope \"/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME\"\n        ```\n\n    ---\n\n## Configure connection to MongoDB using Key Vault secrets\n\nIn this step, you update the environment variables needed to connect to MongoDB to use the values stored in the key vault.\n\n1. In the Azure view in VS Code (from the Azure Tools extension):\n\n    1. Expand **RESOURCES** and find **App Services** under your subscription. (Make sure you viewing resources by **Group by Resource Type**.)\n\n    1. Expand **App Services**, expand your web app, and then expand **Application Settings**.\n\n    1. Modify the following settings:\n\n      * CONNECTION_STRING: @Microsoft.KeyVault(SecretUri=https://msdocs-web-app-rg-kv.vault.azure.net/secrets/MongoConnectionString)\n      * SECRET_KEY: @Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)\n\n    > [!NOTE]\n    > To verify that the application settings are set correctly, you can use the [az webapp config appsettings list](/cli/azure/webapp/config/appsettings#az-webapp-config-appsettings-list) command to list the application settings for the web app. The form of the command is: `az webapp config appsettings list --/<resource-group msdocs-web-app-rg/> --name /<website-name/>`. This command lists all the application settings for the web app, including the ones you just set.\n\n## Browse the site using Key Vault secrets\n\nIn the Azure view in VS Code (from the Azure Tools extension):\n\n1. Expand **RESOURCES** and find **App Services** under your subscription. (Make sure you viewing resources by **Group by Resource Type**.)\n\n1. Right-click your web app and select **Browse Website**. If your web site shows an error, wait a few minutes and try again. It may take a few minutes for the web app to start up. See also [Troubleshooting App Service](#troubleshoot-deployment).\n\n---\n\n## Troubleshoot deployment\n\nIf you don't see the sample app, try the following steps.\n\n* With container deployment and App Service, always check the **Deployment Center** / **Logs** page in the Azure portal. Confirm that the container was pulled and is running. The initial pull and running of the container can take a few moments.\n* Try to restart the App Service and see if that resolves your issue.\n* If there are programming errors, those errors show up in the application logs. On the Azure portal page for the App Service, select **Diagnose and solve problems**/**Application logs**.\n* The sample app relies on a connection to Azure Cosmos DB for MongoDB. Confirm that the App Service has application settings with the correct connection info.\n* Confirm that managed identity is enabled for the App Service and is used in the Deployment Center. On the Azure portal page for the App Service, go to the App Service **Deployment Center** resource and confirm that **Authentication** is set to **Managed Identity**.\n* Check that the webhook is defined in the Azure Container Registry. The webhook enables the App Service to pull the container image. In particular, check that Service URI ends with \"/api/registry/webhook\". If not, add it.\n* [Different Azure Container Registry skus](/azure/container-registry/container-registry-skus) have different features, including number of webhooks. If you're reusing an existing registry, you could see the message: \"Quota exceeded for resource type webhooks for the registry SKU Basic. Learn more about different SKU quotas and upgrade process: https://aka.ms/acr/tiers\". If you see this message, use a new registry, or reduce the number of [registry webhooks](/azure/container-registry/container-registry-webhook) in use.\n\n## Next step\n\n> [!div class=\"nextstepaction\"]\n> [Clean up resources](tutorial-containerize-deploy-python-web-app-azure-05.md)\n"
  },
  {
    "path": "articles/python/tutorial-containerize-deploy-python-web-app-azure-05.md",
    "content": "---\ntitle: Clean up Azure resources used in Python container tutorial\ndescription: How to clean up resources used in a tutorial showing how to containerize a Python web app (Django or Flask) and deploy it to App Service.\nms.devlang: python\nms.topic: tutorial\nms.date: 04/14/2025\nms.custom: devx-track-python\n---\n\n# Containerize tutorial cleanup and next steps\n\nIn this part of the tutorial series, you learn how to clean up resources used in Azure so you don't incur other charges and help keep your Azure subscription uncluttered.\n\n## Clean up resources\n\nAt the end of a tutorial or project, it's important to clean up any Azure resources you no longer need. This helps you:\n\n* Avoid unnecessary charges – Resources left running can continue to accrue costs.\n* Keep your Azure subscription organized – Removing unused resources makes it easier to manage and navigate your subscription.\n\nIn this tutorial, all the Azure resources were created in the same resource group. Removing the resource group removes all resources in the resource group and is the fastest way to remove all Azure resources used for your app.\n\n> [!TIP]\n> If you plan to continue development or testing, you can leave the resources running. Just be aware of potential costs.\n\n### [Azure CLI](#tab/azure-cli)\n\nAzure CLI commands can be run in the [Azure Cloud Shell](https://shell.azure.com) or on a workstation with the [Azure CLI installed](/cli/azure/install-azure-cli).\n\n1. Delete the resource group by using the [az group delete](/cli/azure/group#az-group-delete) command.\n\n    ### [Bash](#tab/bash)\n    \n    ```azurecli-interactive\n    #!/bin/bash\n    RESOURCE_GROUP_NAME='msdocs-web-app-rg'\n    az group delete --name $RESOURCE_GROUP_NAME \n    ```\n    \n    ### [PowerShell](#tab/powershell)\n    \n    ```powershell-interactive\n    # PowerShell syntax\n    $RESOURCE_GROUP_NAME='msdocs-web-app-rg'\n    az group delete --name $RESOURCE_GROUP_NAME \n    ```\n    \n    ---\n    \nYou can optionally add the `--no-wait` argument to allow the command to return before the operation is complete.\n\n### [VS Code](#tab/vscode-aztools)\n\nTo work with Azure resources in VS Code, you must have the [Azure Tools extension pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) installed and be signed into Azure from VS Code.\n\n1. In the Azure view in VS Code (from the Azure Tools extension), expand **RESOURCES** and find your subscription.\n\n1. Make sure the view is set to **Group by Resource Group**.\n\n1. Locate the resource group you want to delete.\n\n1. Right-click the resource group and select **Delete Resource Group**.\n\n1. In the confirmation dialog, enter the exact name of the resource group.\n\n1. Press **ENTER** to confirm and delete the resource group.\n\n----\n\n## Next steps\n\nAfter completing this tutorial, here are some next steps you can take to build upon what you learned and move the tutorial code and deployment closer to production ready:\n\n* [Deploy a web app from a geo-replicated Azure container registry](/azure/container-registry/container-registry-tutorial-deploy-app)\n\n* [Review Security in Azure Cosmos DB](/azure/cosmos-db/database-security)\n\n* Map a custom DNS name to your app, see [Tutorial: Map custom DNS name to your app](/azure/app-service/app-service-web-tutorial-custom-domain).\n\n* Monitor App Service for availability, performance, and operation, see [Monitoring App Service](/azure/app-service/monitor-app-service) and [Set up Azure Monitor for your Python application](/azure/azure-monitor/app/opencensus-python).\n\n* Enable continuous deployment to Azure App Service, see [Continuous deployment to Azure App Service](/azure/app-service/deploy-continuous-deployment), [Use CI/CD to deploy a Python web app to Azure App Service on Linux](/azure/devops/pipelines/ecosystems/python-webapp), and [Design a CI/CD pipeline using Azure DevOps](/azure/devops/pipelines/architectures/devops-pipelines-baseline-architecture).\n\n* Create reusable infrastructure as code with [Azure Developer CLI (azd)](../azure-developer-cli/overview.md). \n\n## Related Learn modules\n\nThe following are some Learn modules that explore the technologies and themes covered in this tutorial:\n\n* [Introduction to Python](/training/modules/intro-to-python/)\n\n* [Get started with Django](/training/modules/django-get-started/)\n\n* [Create views and templates in Django](/training/modules/django-views-templates/)\n\n* [Create data-driven websites by using the Python framework Django](/training/paths/django-create-data-driven-websites/)\n\n* [Deploy a Django application to Azure by using PostgreSQL](/training/modules/django-deployment/)\n\n* [Get Started with the MongoDB API in Azure Cosmos DB](/training/modules/get-started-mongodb-api-azure-cosmos-db/)\n\n* [Migrate on-premises MongoDB databases to Azure Cosmos DB](/training/modules/migrate-on-premises-mongodb-databases-azure-database-mongodb/)\n\n* [Build a containerized web application with Docker](/training/modules/intro-to-containers/)\n"
  },
  {
    "path": "articles/python/tutorial-containerize-simple-web-app-for-app-service.md",
    "content": "---\ntitle: Deploy a Flask or FastAPI web app as a container in Azure App Service\ndescription: An overview of how to create and deploy a containerized Python web app (Flask or FastAPI) on Azure App Service.\nms.topic: tutorial\nms.date: 09/22/2025\nms.custom: devx-track-python, devx-track-azurecli\n---\n\n# Deploy a containerized Flask or FastAPI web app on Azure App Service\n\nThis tutorial shows you how to deploy a Python [Flask][5] or [FastAPI][6] web app to [Azure App Service][1] using the [Web App for Containers][2] feature. This approach provides a streamlined path for developers who want the benefits of a fully managed platform while deploying their app as a single containerized artifact with all dependencies included. For more information about using containers in Azure, see [Comparing Azure container options][3].\n\nIn this tutorial, you use the [Docker CLI][7] and [Docker][12] to optionally build and test a Docker image locally. You then use the [Azure CLI][8] to push the Docker image to [Azure Container Registry][11] (ACR) and deploy it to Azure App Service. The web app is configured with its system-assigned [managed identity](/azure/active-directory/managed-identities-azure-resources/overview) for secure, passwordless access to pull the image from ACR using Azure role-based access control (RBAC). You can also deploy with [Visual Studio Code][9] with the [Azure Tools Extension][10] installed.\n\nFor an example of building and creating a Docker image to run on Azure Container Apps, see [Deploy a Flask or FastPI web app on Azure Container Apps][4].\n\n> [!NOTE]\n> This tutorial demonstrates how to create a Docker image that can be deployed to Azure App Service. However, using a Docker image is not required to deploy to App Service. You can also deploy your application code directly from your local workspace to App Service without creating a Docker image. For an example, see [Quickstart: Deploy a Python (Django or Flask) web app to Azure App Service](/azure/app-service/quickstart-python?toc=/azure/developer/python/toc.json&bc=/azure/developer/python/breadcrumb/toc.json).\n\n## Prerequisites\n\nTo complete this tutorial, you need:\n\n* An Azure account where you can deploy a web app to [Azure App Service][1] and [Azure Container Registry][11]. If you don't have an Azure subscription, create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n\n* [Azure CLI][8] to create a Docker image and deploy it to App Service. And optionally, [Docker][12]and the [Docker CLI][7] to create a Docker and test it in your local environment.\n\n## Get the sample code\n\nIn your local environment, get the code.\n\n### [Flask](#tab/web-app-flask)\n\n```bash\ngit clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git\ncd msdocs-python-flask-webapp-quickstart\n```\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```bash\ngit clone https://github.com/Azure-Samples/msdocs-python-fastapi-webapp-quickstart.git\ncd msdocs-python-fastapi-webapp-quickstart\n```\n\n---\n\n## Add Dockerfile and \\.dockerignore files\n\nAdd a *Dockerfile* to instruct Docker how to build the image. The *Dockerfile* specifies the use of [Gunicorn][13], a production-level web server that forwards web requests to the Flask and FastAPI frameworks. The ENTRYPOINT and CMD commands instruct Gunicorn to handle requests for the app object.\n\n### [Flask](#tab/web-app-flask)\n\n```dockerfile\n# syntax=docker/dockerfile:1\n\nFROM python:3.11\n\nWORKDIR /code\n\nCOPY requirements.txt .\n\nRUN pip3 install -r requirements.txt\n\nCOPY . .\n\nEXPOSE 50505\n\nENTRYPOINT [\"gunicorn\", \"app:app\"]\n```\n\n`50505` is used for the container port (internal) in this example, but you can use any free port.\n\nCheck the *requirements.txt* file to make sure it contains `gunicorn`.\n\n:::code language=\"python\" source=\"~/../msdocs-python-flask-webapp-quickstart/requirements.txt\" highlight=\"2\" :::\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```dockerfile\n# syntax=docker/dockerfile:1\n\nFROM python:3.11\n\nWORKDIR /code\n\nCOPY requirements.txt .\n\nRUN pip install --no-cache-dir --upgrade -r requirements.txt\n\nCOPY . .\n\nEXPOSE 3100\n\nCMD [\"gunicorn\", \"--bind\", \"0.0.0.0:3100\", \"main:app\", \"--worker-class\", \"uvicorn.workers.UvicornWorker\"]\n```\n\n`3100` is used for the container port (internal) in this example, but you can use any free port.\n\nCheck the *requirements.txt* file to make sure it contains `gunicorn` and `uvicorn`.\n\n```\nfastapi\nuvicorn\ngunicorn\n```\n\n---\n\nAdd a *\\.dockerignore* file to exclude unnecessary files from the image.\n\n```dockerignore\n.git*\n**/*.pyc\n.venv/\n```\n\n## Configure gunicorn\n\nGunicorn can be configured with a *gunicorn.conf.py* file. When the *gunicorn.conf.py* file is located in the same directory where gunicorn is run, you don't need to specify its location in the *Dockerfile*. For more information about specifying the configuration file, see [Gunicorn settings][14].\n\nIn this tutorial, the suggested configuration file configures gunicorn to increase its number of workers based on the number of CPU cores available. For more information about *gunicorn.conf.py* file settings, see [Gunicorn configuration][15].\n\n### [Flask](#tab/web-app-flask)\n\n```text\n# Gunicorn configuration file\nimport multiprocessing\n\nmax_requests = 1000\nmax_requests_jitter = 50\n\nlog_file = \"-\"\n\nbind = \"0.0.0.0:50505\"\n\nworkers = (multiprocessing.cpu_count() * 2) + 1\nthreads = workers\n\ntimeout = 120\n```\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```text\n# Gunicorn configuration file\nimport multiprocessing\n\nmax_requests = 1000\nmax_requests_jitter = 50\n\nlog_file = \"-\"\n\nbind = \"0.0.0.0:3100\"\n\nworker_class = \"uvicorn.workers.UvicornWorker\"\nworkers = (multiprocessing.cpu_count() * 2) + 1\n```\n\nWith the `uvicorn.workers.UvicornWorker` worker class, you can use `gunicorn` to run `FastAPI` apps. For more information, see [Running uvicorn with gunicorn][16].\n\n---\n\n## Build and run the image locally\n\nBuild the image locally.\n\n### [Flask](#tab/web-app-flask)\n\n```bash\ndocker build --tag flask-demo .\n```\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```bash\ndocker build --tag fastapi-demo .\n```\n\n---\n\n> [!NOTE]\n> If the `docker build` command returns an error, make sure the docker deamon is running. On Windows, make sure that Docker Desktop is running.\n\nRun the image locally in a Docker container.\n\n### [Flask](#tab/web-app-flask)\n\n```bash\ndocker run --detach --publish 5000:50505 flask-demo\n```\n\nOpen the ```http://localhost:5000``` URL in your browser to see the web app running locally.\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```bash\ndocker run --detach --publish 3100:3100 fastapi-demo\n```\n\nOpen the ```http://localhost:3100``` URL in your browser to see the web app running locally.\n\n---\n\nThe `--detach` option runs the container in the background. The `--publish` option maps the container port to a port on the host. The host port (external) is first in the pair, and the container port (internal) is second. For more information, see [Docker run reference][17].\n\n## Create a resource group and Azure Container Registry\n\n1. Run the [az login](/cli/azure/reference-index#az-login) command to [sign in to Azure](/cli/azure/authenticate-azure-cli).\n\n    ```azurecli\n    az login\n    ```\n\n1. Run the [az upgrade](/cli/azure/reference-index#az-upgrade) command to make sure your version of the Azure CLI is current.\n\n    ```azurecli\n    az upgrade\n    ```\n\n1. Create a group with the [az group create][18] command.\n\n    ```azurecli\n    RESOURCE_GROUP_NAME=<resource-group-name>\n    LOCATION=<location>\n    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION\n    ```\n\n    An Azure resource group is a logical container into which Azure resources are deployed and managed. When creating a resource group, you specify a location such as *eastus*. Replace `<location>` with the location you choose. Certain SKUs are unavailable in certain locations, so you might get an error indicating this. Use a different location and try again.\n\n1. Create an Azure Container Registry with the [az acr create][19] command. Replace `<container-registry-name>` with a unique name for your instance.\n\n    ```azurecli\n    CONTAINER_REGISTRY_NAME=<container-registry-name>\n    az acr create --resource-group $RESOURCE_GROOUP_NAME \\\n    --name $CONTAINER_REGISTRY_NAME --sku Basic\n    ```\n\n    > [!NOTE]\n    > The registry name must be unique in Azure. If you get an error, try a different name. Registry names can consist of 5-50 alphanumeric characters. Hyphens and underscores are not allowed. To learn more, see [Azure Container Registry name rules](/azure/azure-resource-manager/management/resource-name-rules#microsoftcontainerregistry). If you use a different name, make sure that you use your name rather than `webappacr123` in the commands that reference the registry and registry artifacts in following sections.\n\n    An Azure Container Registry is a private Docker registry that stores images for use in Azure Container Instances, Azure App Service, Azure Kubernetes Service, and other services. When creating a registry, you specify a name, SKU, and resource group.\n\n## Build the image in Azure Container Registry\n\nBuild the Docker image in Azure with the [az acr build][21] command. The command uses the Dockerfile in the current directory, and pushes the image to the registry.\n\n```azurecli\naz acr build \\\n  --resource-group $RESOURCE_GROUP_NAME \\\n  --registry $CONTAINER_REGISTRY_NAME \\\n  --image webappsimple:latest .\n```\n\nThe `--registry` option specifies the registry name, and the `--image` option specifies the image name. The image name is in the format `registry.azurecr.io/repository:tag`.\n\n## Deploy web app to Azure\n\n1. Create an App Service plan with the [az appservice plan][22] command.\n\n    ```azurecli\n    az appservice plan create \\\n    --name webplan \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --sku B1 \\\n    --is-linux\n    ```\n\n1. Set an environment variable to your subscription ID. It's used in the `--scope` parameter in the next command.\n\n    ```azurecli\n    SUBSCRIPTION_ID=$(az account show --query id --output tsv)\n    ```\n\n    The command for creating the environment variable is shown for the Bash shell. Change the syntax as appropriate for other environments.\n\n1. Create the web app with the [az webapp create][23] command.\n\n    ```azurecli\n    export MSYS_NO_PATHCONV=1 # This line is for Windows users to prevent path conversion issues in Git Bash.\n    az webapp create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --plan webplan --name <container-registry-name> \\\n    --assign-identity [system] \\\n    --role AcrPull \\\n    --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME \\\n    --acr-use-identity --acr-identity [system] \\\n    --container-image-name $CONTAINER_REGISTRY_NAME.azurecr.io/webappsimple:latest \n    ```\n\n    Notes:\n\n    * The web app name must be unique in Azure. If you get an error, try a different name. The name can consist of alphanumeric characters and hyphens, but can't start or end with a hyphen. To learn more, see [Microsoft.Web name rules](/azure/azure-resource-manager/management/resource-name-rules#microsoftweb).\n\n    * If you're using a name different than `webappacr123` for your Azure Container Registry, make sure you update the `--container-image-name` parameter appropriately.\n\n    * The `--assign-identity`, `--role`, and `--scope` parameters enable the system-assigned managed identity on the web app and assign it the [`AcrPull` role](/azure/role-based-access-control/built-in-roles/containers#acrpull) on the resource group. This gives the managed identity permission to pull images from any Azure Container Registry in the resource group.\n\n    * The `--acr-use-identity` and `--acr-identity` parameters configure the web app to use its system-assigned managed identity to pull images from the Azure Container Registry.\n\n    * It can take a few minutes for the web app to be created. You can check the deployment logs with the [az webapp log tail][27] command. For example, `az webapp log tail --resource-group web-app-simple-rg --name webappsimple123`. If you see entries with \"warmup\" in them, the container is being deployed.\n\n    * The URL of the web app is `<web-app-name>.azurewebsites.net`, for example, `https://webappsimple123.azurewebsites.net`.\n\n## Make updates and redeploy\n\nAfter you make code changes, you can redeploy to App Service with the [az acr build][21] and [az webapp update][28] commands.\n\n## Clean up\n\nAll the Azure resources created in this tutorial are in the same resource group. Removing the resource group removes all resources in the resource group and is the fastest way to remove all Azure resources used for your app.\n\nTo remove resources, use the [az group delete][24] command.\n\n```azurecli\naz group delete --name $RESOURCE_GROUP_NAME --yes --no-wait\n```\n\nYou can also remove the group in the [Azure portal][25] or in [Visual Studio Code][9] and the [Azure Tools Extension][10].\n\n## Next steps\n\nFor more information, see the following resources:\n\n* [Deploy a Python web app on Azure Container Apps][4]\n* [Quickstart: Deploy a Python (Django or Flask) web app to Azure App Service][26]\n\n[1]: /azure/app-service/\n[2]: https://azure.microsoft.com/products/app-service/containers\n[3]:./containers-in-azure-overview-python.md\n[4]: ./tutorial-containerize-simple-web-app.md\n[5]: https://flask.palletsprojects.com/\n[6]: https://fastapi.tiangolo.com/\n[7]: https://docs.docker.com/engine/reference/commandline/cli/\n[8]: /cli/azure/what-is-azure-cli\n[9]: https://code.visualstudio.com/\n[10]: https://code.visualstudio.com/docs/azure/extensions\n[11]: /azure/container-registry/\n[12]: https://www.docker.com/\n[13]: https://gunicorn.org/\n[14]: https://betterstack.com/community/guides/scaling-python/gunicorn-explained/#config-file\n[15]: https://betterstack.com/community/guides/scaling-python/gunicorn-explained/#configuration-file\n[16]: https://www.uvicorn.org/#running-with-gunicorn\n[17]: https://docs.docker.com/engine/reference/run/\n[18]: /cli/azure/group#az-group-create\n[19]: /cli/azure/acr#az-acr-create\n[21]: /cli/azure/acr#az-acr-build\n[22]: /cli/azure/appservice/plan#az-appservice-plan-create\n[23]: /cli/azure/webapp#az-webapp-create\n[24]: /cli/azure/group#az-group-delete\n[25]: https://portal.azure.com/\n[26]: /azure/app-service/quickstart-python\n[27]: /cli/azure/webapp/log#az-webapp-log-tail\n[28]: /cli/azure/webapp#az-webapp-update\n"
  },
  {
    "path": "articles/python/tutorial-containerize-simple-web-app.md",
    "content": "---\ntitle: Deploy a Flask or FastAPI web app as a container in Azure Container Apps\ndescription: An overview of how to create and deploy a containerized Python web app (Flask or FastAPI) on Azure Container Apps.\nms.topic: install-set-up-deploy\nms.date: 2/28/2026\nms.custom: devx-track-python\n---\n\n# Deploy a Flask or FastAPI web app on Azure Container Apps\n\nThis tutorial shows you how to containerize a Python [Flask][9] or [FastAPI][10] web app and deploy it to [Azure Container Apps][1]. Azure Container Apps uses [Docker][4] container technology to host both built-in images and custom images. For more information about using containers in Azure, see [Comparing Azure container options](/azure/container-apps/compare-options).\n\nIn this tutorial, you use the [Docker CLI][7] and the [Azure CLI][17] to create a Docker image and deploy it to Azure Container Apps. You can also deploy by using [Visual Studio Code][3] and the [Azure Tools Extension][5].\n\n## Prerequisites\n\nTo complete this tutorial, you need:\n\n* An Azure account where you can deploy a web app to [Azure Container Apps][1]. (The process creates an [Azure Container Registry][11] and [Log Analytics workspace][12] for you.)\n\n* [Azure CLI][17], [Docker][4], and the [Docker CLI][7] installed in your local environment.\n\n## Get the sample code\n\nIn your local environment, get the code.\n\n### [Flask](#tab/web-app-flask)\n\n```bash\ngit clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git\n```\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```bash\ngit clone https://github.com/Azure-Samples/msdocs-python-fastapi-webapp-quickstart.git\n```\n\n---\n\n## Add Dockerfile and \\.dockerignore files\n\nAdd a *Dockerfile* to instruct Docker how to build the image. The *Dockerfile* specifies the use of [Gunicorn][24], a production-level web server that forwards web requests to the Flask and FastAPI frameworks. The ENTRYPOINT and CMD commands instructs Gunicorn to handle requests for the app object.\n\n### [Flask](#tab/web-app-flask)\n\n```dockerfile\n# syntax=docker/dockerfile:1\n\nFROM python:3.11\n\nWORKDIR /code\n\nCOPY requirements.txt .\n\nRUN pip3 install -r requirements.txt\n\nCOPY . .\n\nEXPOSE 50505\n\nENTRYPOINT [\"gunicorn\", \"--config\", \"gunicorn.conf.py\", \"app:app\"]\n```\n\nThis example uses `50505` for the container port (internal), but you can use any free port.\n\nCheck the *requirements.txt* file to make sure it contains `gunicorn`.\n\n:::code language=\"python\" source=\"~/../msdocs-python-flask-webapp-quickstart/requirements.txt\" highlight=\"2\" :::\n\n## Configure gunicorn\n\nYou can configure Gunicorn by using a *gunicorn.conf.py* file. When the *gunicorn.conf.py* file is in the same directory where you run `gunicorn`, you don't need to specify its location in the `ENTRYPOINT` or `CMD` instruction of the *Dockerfile*. For more information about specifying the configuration file, see [Gunicorn settings][22].\n\nIn this tutorial, the suggested configuration file configures Gunicorn to increase its number of workers based on the number of CPU cores available. For more information about *gunicorn.conf.py* file settings, see [Gunicorn configuration][23].\n\n```text\n# Gunicorn configuration file\nimport multiprocessing\n\nmax_requests = 1000\nmax_requests_jitter = 50\n\nlog_file = \"-\"\n\nbind = \"0.0.0.0:50505\"\n\nworkers = (multiprocessing.cpu_count() * 2) + 1\nthreads = workers\n\ntimeout = 120\n```\n\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```dockerfile\nFROM python:3.11\n\n# Set the working directory in the container\nWORKDIR /code\n\n# Copy the requirements file into the container\nCOPY requirements.txt .\n\n# Install the dependencies\nRUN pip install --no-cache-dir --upgrade -r requirements.txt\n\n# Copy the rest of the application code into the container\nCOPY . .\n\n# Expose the port that the app will run on\nEXPOSE 3100\n\n# Command to run the application using Uvicorn\nCMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"3100\", \"--workers\", \"4\"]\n```\n\nThis example uses `3100` for the container port (internal), but you can use any free port.\n\nCheck the *requirements.txt* file to make sure it contains `uvicorn`.\n\n:::code language=\"python\" source=\"~/../msdocs-python-fastapi-webapp-quickstart/requirements.txt\" highlight=\"2-3\" :::\n\n---\n\nAdd a *\\.dockerignore* file to exclude unnecessary files from the image.\n\n```dockerignore\n.git*\n**/*.pyc\n.venv/\n```\n\n\n## Build and run the image locally\n\nBuild the image locally.\n\n### [Flask](#tab/web-app-flask)\n\n```bash\ndocker build --tag flask-demo .\n```\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```bash\ndocker build --tag fastapi-demo .\n```\n\n---\n\nRun the image locally in a Docker container.\n\n### [Flask](#tab/web-app-flask)\n\n```bash\ndocker run --detach --publish 5000:50505 flask-demo\n```\n\nOpen `http://localhost:5000` in your browser to see the web app running locally.\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```bash\ndocker run --detach --publish 3100:3100 fastapi-demo\n```\n\nOpen `http://localhost:3100` in your browser to see the web app running locally.\n\n---\n\nThe `--detach` option runs the container in the background. The `--publish` option maps the container port to a port on the host. The host port (external) is first in the pair, and the container port (internal) is second. For more information, see [Docker run reference][21].\n\n## Deploy web app to Azure\n\nTo deploy the Docker image to Azure Container Apps, use the [az containerapp up][6] command. (The following commands are shown for the Bash shell. Change the continuation character (`\\`) as appropriate for other shells.)\n\n### [Flask](#tab/web-app-flask)\n\n```azurecli\naz containerapp up \\\n  --resource-group web-flask-aca-rg --name web-aca-app \\\n  --ingress external --target-port 50505 --source .\n```\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```azurecli\naz containerapp up \\\n  --resource-group web-fastapi-aca-rg --name web-aca-app \\ \n  --ingress external --target-port 3100 --source .\n```\n\n---\n\nWhen the deployment finishes, you have a resource group with the following resources inside it:\n\n* An Azure Container Registry\n* A Container Apps Environment\n* A Container App running the web app image\n* A Log Analytics workspace\n\nThe output of the `az containerapp up` command includes the URL for the deployed app. Open the URL in your browser to see the web app running in Azure. The URL looks like the following `https://web-aca-app.<generated-text>.<location-info>.azurecontainerapps.io`, where the `<generated-text>` and `<location-info>` are unique to your deployment.\n\n## Make updates and redeploy\n\nAfter you make code updates, run the previous `az containerapp up` command again. The command rebuilds the image and redeploys it to Azure Container Apps. When you run the command again, it detects that the resource group and app already exist, and updates just the container app.\n\nIn more complex update scenarios, you can redeploy by using the [az acr build][18] and [az containerapp update][19] commands together to update the container app.\n\n## Clean up\n\nAll the Azure resources you created in this tutorial are in the same resource group. Removing the resource group removes all resources in the resource group. It's the fastest way to remove all Azure resources used for your app.\n\nTo remove resources, use the [az group delete][20] command.\n\n### [Flask](#tab/web-app-flask)\n\n```azurecli\naz group delete --name web-flask-aca-rg\n```\n\n### [FastAPI](#tab/web-app-fastapi)\n\n```azurecli\naz group delete --name web-fastapi-aca-rg\n```\n\n---\n\nYou can also remove the group in the [Azure portal][2] or in [Visual Studio Code][3] by using the [Azure Tools Extension][5].\n\n## Next steps\n\nFor more information, see the following resources:\n\n* [Deploy Azure Container Apps with the az containerapp up command][8]\n* [Quickstart: Deploy to Azure Container Apps using Visual Studio Code][13]\n* [Azure Container Apps image pull with managed identity][14]\n\n[1]: /azure/container-apps/overview\n[2]: /azure/azure-resource-manager/management/delete-resource-group\n[3]: https://code.visualstudio.com/\n[4]: https://www.docker.com/\n[5]: https://code.visualstudio.com/docs/azure/extensions\n[6]: /cli/azure/containerapp#az_containerapp_up\n[7]: https://docs.docker.com/engine/reference/commandline/cli/\n[8]: /azure/container-apps/containerapp-up\n[9]: https://flask.palletsprojects.com/en/2.1.x/\n[10]: https://fastapi.tiangolo.com/\n[11]: https://azure.microsoft.com/services/container-registry/\n[12]: /azure/azure-monitor/logs/log-analytics-workspace-overview\n[13]: /azure/container-apps/deploy-visual-studio-code\n[14]: /azure/container-apps/managed-identity-image-pull\n[15]: https://portal.azure.com/\n[16]: /cli/azure/resource#az-resource-list\n[17]: /cli/azure/what-is-azure-cli\n[18]: /cli/azure/acr#az-acr-build\n[19]: /cli/azure/containerapp#az_containerapp_update\n[20]: /cli/azure/group#az-group-delete\n[21]: https://docs.docker.com/engine/reference/run/\n[22]: https://betterstack.com/community/guides/scaling-python/gunicorn-explained/#config-file\n[23]: https://betterstack.com/community/guides/scaling-python/gunicorn-explained/#configuration-file\n[24]: https://gunicorn.org/\n[25]: https://www.uvicorn.org/#running-with-gunicorn\n"
  },
  {
    "path": "articles/python/tutorial-deploy-python-web-app-azure-container-apps-01.md",
    "content": "---\ntitle: Overview of How to Deploy a Python Web App in Azure Container Apps\ndescription: Overview of how to create a container from a Python web app and deploy it to Azure Container Apps, a serverless platform for hosting containerized applications.\nms.topic: tutorial\nms.date: 12/19/2025\nms.custom: devx-track-python\n---\n\n# Tutorial: Learn overview concepts for deploying a Python web app on Azure Container Apps\n\nThis tutorial series shows you how to containerize a Python web app and deploy it to [Azure Container Apps][2]. A sample web app is containerized, and the Docker image is stored in [Azure Container Registry][3]. Azure Container Apps is configured to pull the Docker image from Container Registry and create a container. The sample app connects to [Azure Database for PostgreSQL][4] to demonstrate communication between Container Apps and other Azure resources.\n\nThere are several options to build and deploy cloud-native and containerized Python web apps on Azure. This tutorial series covers Azure Container Apps. Container Apps is good for running general-purpose containers, especially for applications that span many microservices deployed in containers.\n\nIn this tutorial series, you create one container. To deploy a Python web app as a container to Azure App Service, see [Containerized Python web app on Azure with MongoDB](./tutorial-containerize-deploy-python-web-app-azure-01.md).\n\nThe procedures in this tutorial series guide you to complete these tasks:\n\n> [!div class=\"checklist\"]\n>\n> * Build a [Docker][1] image from a Python web app and store the image in [Azure Container Registry][3].\n> * Configure [Azure Container Apps][2] to host the Docker image.\n> * Set up [GitHub Actions][6] to update the container with a new Docker image triggered by changes to your GitHub repository. *This step is optional.*\n> * Set up continuous integration and continuous delivery (CI/CD) of a Python web app to Azure.\n\nIn this first part of the series, you learn foundational concepts for deploying a Python web app on Azure Container Apps.\n\n## Service overview\n\nThe following diagram shows how you'll use your local environment, GitHub repositories, and Azure services in this tutorial series.\n\n:::image type=\"content\" source=\"./media/tutorial-container-apps/service-diagram-overview-for-tutorial-deploy-python-azure-container-apps.png\" alt-text=\"Diagram of environments and services for deploying a Python web app on Azure Container Apps.\" lightbox=\"./media/tutorial-container-apps/service-diagram-overview-for-tutorial-deploy-python-azure-container-apps.png\":::\n\nThe diagram includes these components:\n\n* [Azure Container Apps][2]:\n\n  Azure Container Apps enables you to run microservices and containerized applications on a serverless platform. A serverless platform means that you enjoy the benefits of running containers with minimal configuration. With Azure Container Apps, your applications can dynamically scale based on characteristics such as HTTP traffic, event-driven processing, or CPU or memory load.\n  \n  Container Apps pulls Docker images from Azure Container Registry. Changes to container images trigger an update to the deployed container. You can also configure GitHub Actions to trigger updates.\n\n* [Azure Container Registry][3]:\n\n  Azure Container Registry enables you to work with Docker images in Azure. Because Container Registry is close to your deployments in Azure, you have control over access. You can use your Microsoft Entra groups and permissions to control access to Docker images.\n\n  In this tutorial series, the registry source is Azure Container Registry. But you can also use Docker Hub or a private registry with minor modifications.\n\n* [Azure Database for PostgreSQL][4]:\n\n  The sample code stores application data in a PostgreSQL database. The container app connects to PostgreSQL by using a [user-assigned managed identity](/entra/identity/managed-identities-azure-resources/overview). Connection information is stored in environment variables configured explicitly or through an [Azure service connector][8].\n\n* [GitHub][7]:\n\n  The sample code for this tutorial series is in a GitHub repo that you fork and clone locally. To set up a CI/CD workflow with [GitHub Actions][6], you need a GitHub account.\n  \n  You can still follow along with this tutorial series without a GitHub account, if you work locally or in [Azure Cloud Shell][9] to build the container image from the sample code repo.\n\n## Revisions and CI/CD\n\nTo make code changes and push them to a container, you create a new Docker image with your changes. Then, you push the image to Container Registry and create a new [revision](/azure/container-apps/revisions) of the container app.\n\nTo automate this process, an optional step in the tutorial series shows you how to build a CI/CD pipeline by using GitHub Actions. The pipeline automatically builds and deploys your code to Container Apps whenever a new commit is pushed to your GitHub repository.\n\n## Authentication and security\n\nIn this tutorial series, you build a Docker container image directly in Azure and deploy it to Azure Container Apps. Container Apps runs in the context of an [environment][18], which is supported by an [Azure virtual network][19]. Virtual networks are a fundamental building block for your private network in Azure. Container Apps allows you to expose your container app to the public web by enabling ingress.\n\nTo set up CI/CD, you authorize Azure Container Apps as an [OAuth app][20] for your GitHub account. As an OAuth app, Container Apps writes a GitHub Actions workflow file to your repo with information about Azure resources and jobs to update them. The workflow updates Azure resources by using the credentials of a Microsoft Entra service principal (or an existing one) with role-based access for Container Apps and a username and password for Azure Container Registry. Credentials are stored securely in your GitHub repo.\n\nFinally, the sample web app in this tutorial series stores data in a PostgreSQL database. The sample code connects to PostgreSQL via a connection string. When the app is running in Azure, it connects to the PostgreSQL database by using a user-assigned managed identity. The code uses [`DefaultAzureCredential`](./sdk/authentication/credential-chains.md?tabs=dac#defaultazurecredential-overview) to dynamically update the password in the connection string with a Microsoft Entra access token during runtime. This mechanism prevents the need to hardcode the password in the connection string or an environment variable, and it provides an extra layer of security.\n\nThe tutorial series walks you through creating the managed identity and granting it an appropriate PostgreSQL role and permissions so that it can access and update the database. During the configuration of Container Apps, the tutorial series walks you through configuring the managed identity on the app and setting up environment variables that contain connection information for the database. You can also use an Azure service connector to accomplish the same thing.\n\n## Prerequisites\n\nTo complete this tutorial series, you need:\n\n* An Azure account where you can create:\n  * An Azure Container Registry instance.\n  * An Azure Container Apps environment.\n  * An Azure Database for PostgreSQL instance.\n\n* [Visual Studio Code][16] or the [Azure CLI][17], depending on what tool you use:\n  * For Visual Studio Code, you need the [Container Apps extension][13].\n  * You can use the Azure CLI through [Azure Cloud Shell][9].\n\n* Python packages:\n  * [psycopg2-binary][12] for connecting to PostgreSQL.\n  * [Flask][10] or [Django][11] as a web framework.\n\n## Sample app\n\nThe Python sample app is a restaurant review app that saves restaurant and review data in PostgreSQL. At the end of the tutorial series, you'll have a restaurant review app deployed and running in Azure Container Apps that looks like the following screenshot.\n\n:::image type=\"content\" source=\"./media/tutorial-container-apps/containerization-of-python-web-app-sample-app-screenshot.png\" alt-text=\"Screenshot of the sample app created from a Python containerized web app.\" lightbox=\"./media/tutorial-container-apps/containerization-of-python-web-app-sample-app-screenshot.png\":::\n\n## Next step\n\n> [!div class=\"nextstepaction\"]\n> [Build and deploy a Python web app with Azure Container Apps and PostgreSQL](tutorial-deploy-python-web-app-azure-container-apps-02.md)\n\n[1]: https://www.docker.com/\n[2]: /azure/container-apps/\n[3]: /azure/container-registry\n[4]: /azure/postgresql/\n[6]: https://docs.github.com/actions\n[7]: https://github.com/\n[8]: /azure/service-connector/\n[9]: /azure/cloud-shell/overview\n[10]: https://flask.palletsprojects.com/en/2.1.x/\n[11]: https://www.djangoproject.com/\n[12]: https://pypi.org/project/psycopg2-binary/\n[13]: https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurecontainerapps\n[16]: https://code.visualstudio.com/\n[17]: /cli/azure/what-is-azure-cli\n[18]: /azure/container-apps/environment\n[19]: /azure/virtual-network/virtual-networks-overview\n[20]: https://docs.github.com/authentication/keeping-your-account-and-data-secure/authorizing-oauth-apps\n"
  },
  {
    "path": "articles/python/tutorial-deploy-python-web-app-azure-container-apps-02.md",
    "content": "---\ntitle: Build and Deploy a Python Web App with Azure Container Apps\ndescription: This tutorial describes how to create a container from a Python web app and deploy it to Azure Container Apps, a serverless platform for hosting containerized applications.\nms.topic: tutorial\nms.date: 02/06/2026\nms.custom:\n  - devx-track-python\n  - devx-track-azurecli\n  - sfi-image-nochange\n---\n\n# Tutorial: Build and deploy a Python web app with Azure Container Apps and PostgreSQL\n\nThis article is part of a tutorial series about how to containerize and deploy a Python web app to [Azure Container Apps][8]. Container Apps enables you to deploy containerized apps without managing complex infrastructure.\n\nIn this tutorial, you:\n\n> [!div class=\"checklist\"]\n>\n> * Containerize a Python sample web app (Django or Flask) by building a container image in the cloud.\n> * Deploy the container image to Azure Container Apps.\n> * Define environment variables that enable the container app to connect to an [Azure Database for PostgreSQL - Flexible Server][10] instance, where the sample app stores data.\n\nThe following diagram highlights the tasks in this tutorial: building and deploying a container image.\n\n:::image type=\"content\" source=\"./media/tutorial-container-apps/service-diagram-overview-for-tutorial-deploy-python-azure-container-apps-deploy.png\" alt-text=\"Diagram of services involved in deploying a Python app on Azure Container Apps, with the parts about building an image manually highlighted.\" lightbox=\"./media/tutorial-container-apps/service-diagram-overview-for-tutorial-deploy-python-azure-container-apps-deploy.png\":::\n\n## Prerequisites\n\nIf you don't have an Azure subscription, create a [free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) before you begin.\n\n### [Azure CLI](#tab/azure-cli)\n\nYou can run Azure CLI commands in [Azure Cloud Shell][4] or on a workstation with the [Azure CLI][7] installed.\n\nIf you're running locally, follow these steps to sign in and install the necessary modules for this tutorial:\n\n1. Sign in to Azure and authenticate, if necessary:\n\n    ```azurecli\n    az login\n    ```\n\n1. Make sure you're running the latest version of the Azure CLI:\n\n    ```azurecli\n    az upgrade\n    ```\n\n1. Install or upgrade the *containerapp* and *rdbms-connect* Azure CLI extensions by using the [az extension add][14] command:\n\n    ```azurecli\n    az extension add --name containerapp --upgrade\n    az extension add --name rdbms-connect --upgrade\n    ```\n\n    > [!NOTE]\n    > To list the extensions installed on your system, you can use the [az extension list](/cli/azure/extension#az-extension-list) command. For example:\n    >\n    > ```azurecli\n    > az extension list --query [].name --output tsv\n    > ```\n\n### [VS Code](#tab/vscode-aztools)\n\nMake sure the following extensions are installed in Visual Studio Code (VS Code):\n\n* [Docker extension][6]\n* [Azure Databases extension][26]\n* [Azure Container Apps extension][11]\n\n### [Azure portal](#tab/azure-portal)\n\nSign in to the [Azure portal][3].\n\n---\n\n## Get the sample app\n\nFork and clone the sample code to your developer environment:\n\n1. Go to the GitHub repository of the sample app ([Django][1] or [Flask][2]) and select **Fork**.\n\n    Follow the steps to fork the repo to your GitHub account. You can also download the code repo directly to your local machine without forking or a GitHub account. But if you use the download method, you won't be able to set up continuous integration and continuous delivery (CI/CD) in the next tutorial in this series.\n\n1. At the command prompt in your console, use the [git clone][21] command to clone the forked repo into the *python-container* folder:\n\n    ```console\n    # Django\n    git clone https://github.com/<github-username>/msdocs-python-django-azure-container-apps.git python-container\n    \n    # Flask\n    # git clone https://github.com/<github-username>/msdocs-python-flask-azure-container-apps.git python-container\n    ```\n\n1. Change the directory:\n\n    ```console\n    cd python-container\n    ```\n\n## Build a container image from web app code\n\nAfter you follow these steps, you'll have an Azure Container Registry instance that contains a Docker container image built from the sample code.\n\n### [Azure CLI](#tab/azure-cli)\n\n1. If you're running commands in a Git Bash shell on a Windows computer, enter the following command before proceeding:\n\n    ```azurecli\n    #!/bin/bash\n    export MSYS_NO_PATHCONV=1\n    ```\n\n1. Create a resource group by using the [az group create][17] command:\n\n    ```azurecli\n    #!/bin/bash\n    RESOURCE_GROUP_NAME=<resource-group-name>\n    LOCATION=<location>\n    az group create \\\n        --name $RESOURCE_GROUP_NAME \\\n        --location $LOCATION\n    ```\n\n1. Create a container registry by using the [az acr create][18] command:\n\n    ```azurecli\n    #!/bin/bash\n    REGISTRY_NAME=<registry-name> #The name that you use for *\\<registry-name>* must be unique within Azure, and it must contain 5 to 50 alphanumeric characters.\n    az acr create \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --name $REGISTRY_NAME \\\n        --sku Basic \\\n        --admin-enabled true\n    ```\n\n1. Sign in to the registry by using the [az acr login][19] command:\n\n    ```azurecli\n    az acr login --name $REGISTRY_NAME\n    ```\n\n    The command adds \"azurecr.io\" to the name to create the fully qualified registry name. If the sign-in is successful, the message \"Login Succeeded\" appears. If you're accessing the registry from a subscription that's different from the one in which you created the registry, use the `--suffix` switch.\n\n    If sign-in fails, make sure the Docker daemon is running on your system.\n\n1. Build the image by using the [az acr build][5] command:\n\n    ```azurecli\n    #!/bin/bash\n    az acr build \\\n        --registry $REGISTRY_NAME \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --image pythoncontainer:latest .\n    ```\n\n    These considerations apply:\n\n    * The dot (`.`) at the end of the command indicates the location of the source code to build. If you aren't running this command in the sample app's root directory, specify the path to the code.\n\n    * If you're running the command in Azure Cloud Shell, use `git clone` to first pull the repo into the Cloud Shell environment. Then change directory into the root of the project so that the dot (`.`) is interpreted correctly.\n\n    * If you leave out the `-t` (same as `--image`) option, the command queues a local context build without pushing it to the registry. Building without pushing can be useful to check that the image builds.\n\n1. Confirm that the container image was created by using the [az acr repository list][20] command:\n\n    ```azurecli\n    az acr repository list --name $REGISTRY_NAME\n    ```\n\n### [VS Code](#tab/vscode-aztools)\n\nThese steps require the [Docker extension][6] for VS Code.\n\n1. Create an Azure Container Registry instance.\n\n    Start the **Create Registry** task:\n\n    1. Select the F1 key or CtrlL+Shift+P to open the command palette.\n    1. Type **Azure Container Registry**.\n    1. Select the task **Azure Container Registry: Create Registry**.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/visual-studio-code-create-registry.png\" alt-text=\"Screenshot that shows how to search for the task to create a new Azure Container Registry instance in Visual Studio Code.\" lightbox=\"media/tutorial-container-apps/visual-studio-code-build-image-01.png\":::\n\n    Follow the prompts to create a registry and a resource group:\n\n    * If you're prompted, select the subscription where you want to create resources for this tutorial.\n    * **Registry name**: The registry name must be unique within Azure and contain 5 to 50 alphanumeric characters.\n    * **Select a SKU**: Select **Basic**.\n    * **Create a new resource group**: Select this option to create the resource group.\n    * **Resource group**: Create a new resource group named **pythoncontainer-rg**.\n    * **Location**: Select a location and wait for the notification that indicates the registry was created.\n\n1. Build the image.\n\n    Start the **Build Image in Azure** task:\n\n    1. Select the F1 key or Ctrl+Shift+P to open the command palette.\n    1. Type **Azure Container Registry**.\n    1. Select the task **Azure Container Registry: Build Image in Azure**.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/visual-studio-code-build-image-01.png\" alt-text=\"Screenshot that shows how to search for the task to build a new Azure Container Registry container image in Visual Studio Code.\" lightbox=\"media/tutorial-container-apps/visual-studio-code-build-image-01.png\":::\n\n    Alternatively, you can right-click the Dockerfile and select **Build Image in Azure** to start the task to build the image. If the **Build Image in Azure** task doesn't appear, make sure you're signed in to Azure.\n\n    Follow the prompts to build the image:\n\n    * **Tag image as**: Enter **pythoncontainer:latest**.\n    * **Registry provider**: Select **Azure**.\n    * If you're prompted, select your subscription.\n    * **Registry**: Select the container registry from the list.\n    * **Select OS**: Select **Linux**.\n\n    Monitor progress in the **Output** window and confirm that the image builds successfully. If an error occurs, see the [troubleshooting section](#troubleshoot-deployment).\n\n1. Confirm that the registry was created.\n\n    Select the Docker extension and go to the **REGISTRIES** section. Expand the Azure node to find the new Azure Container Registry instance.  \n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/visual-studio-code-build-image-03.png\" alt-text=\"Screenshot that shows an example Azure Container Registry instance in the area for registries in Visual Studio Code.\" lightbox=\"media/tutorial-container-apps/visual-studio-code-build-image-03.png\":::\n\n1. Use the [az acr update][29] command to enable the administrator user account for the registry. You can run the command in the VS Code terminal window or [Azure Cloud Shell][4].\n\n    ```azurecli\n    az acr update --name <registry-name> \\\n        --resource-group pythoncontainer-rg \\\n        --admin-enabled true\n    ```\n\n    Alternatively, you can select the registry in the Docker extension, right-click, and then select **Open in Portal**. Then you can follow the instructions on the **Azure portal** tab in this section of the tutorial to enable the administrator user account.\n\n    You can view the credentials created for the admin account by using these commands:\n\n    ```azurecli\n    az acr credential show \\\n        --name  <registry-name> \\\n        --resource-group pythoncontainer-rg\n    ```\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the [Azure portal][3], search for **container registry**. Under **Marketplace** in the results, select **Container Registry**.\n\n1. On the **Basics** tab, enter the following values:\n\n    * **Resource group**: Select **Create new** and enter **pythoncontainer-rg**.\n    * **Registry name**: The registry name must be unique within Azure and contain 5 to 50 alphanumeric characters.\n    * **Location**: Select a location near you.\n    * **SKU**: Select **Basic**.\n\n    When you finish, select **Review + create**. After validation is complete, select **Create**.\n\n1. When deployment finishes, select **Go to resource**. If you miss this notification, you can search for **container registry** and select your registry under **Resources** in the results.\n\n1. Enable the administrator user account:\n    1. On the service menu, under **Settings**, select **Access Keys**.\n    1. Select the **Admin user** checkbox.\n\n1. To finish the configuration and build an image, select the Azure Cloud Shell icon on the top menu bar.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/azure-portal-build-image-02.png\" alt-text=\"Screenshot that shows the Azure Cloud Shell icon in the Azure portal.\" lightbox=\"media/tutorial-container-apps/azure-portal-build-image-02.png\":::\n\n    You can also [go directly to Azure Cloud Shell][4].\n\n1. Use the [az acr build][5] command to build the image from the repo:\n\n    ```azurecli\n    az acr build --registry <registry-name> \\\n        --resource-group pythoncontainer-rg \\ \n        --image pythoncontainer:latest <repo-path>\n    ```\n\n    Specify *\\<registry-name>* as the name of the registry that you created. For *\\<repo-path>*, choose either the [Django][1] or [Flask][2] repo path.\n\n1. After the command finishes, under **Services**, select **Repositories** and confirm that the image appears.\n\n---\n\n> [!NOTE]\n> The steps in this section create a container registry in the Basic service tier. This tier is cost-optimized, with a feature set and throughput targeted for developer scenarios, and is suitable for the requirements of this tutorial. In production scenarios, you would most likely use either the Standard or Premium service tier. These tiers provide enhanced levels of storage and throughput.\n>\n> To learn more, see [Azure Container Registry service tiers](/azure/container-registry/container-registry-skus). For information about pricing, see [Azure Container Registry pricing](https://azure.microsoft.com/pricing/details/container-registry/).\n\n## Create a PostgreSQL Flexible Server instance\n\nThe sample app ([Django][1] or [Flask][2]) stores restaurant review data in a PostgreSQL database. In these steps, you create the server that will contain the database.\n\n### [Azure CLI](#tab/azure-cli)\n\n1. Use the [az postgres flexible-server create][22] command to create the PostgreSQL server in Azure. It isn't uncommon for this command to run for a few minutes before it finishes.\n\n    ```azurecli\n    #!/bin/bash\n    ADMIN_USERNAME=demoadmin\n    ADMIN_PASSWORD=<admin-password> # Use a strong password that meets the requirements for PostgreSQL.\n    POSTGRES_SERVER_NAME=<postgres-server-name> \n    az postgres flexible-server create \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --name $POSTGRES_SERVER_NAME \\\n      --location $LOCATION \\\n      --admin-user $ADMIN_USERNAME \\\n      --admin-password $ADMIN_PASSWORD \\\n      --version 16 \\\n      --tier Burstable \\\n      --sku-name Standard_B1ms \\\n      --public-access 0.0.0.0 \\\n      --microsoft-entra-auth Enabled \\\n      --storage-size 32 \\\n      --backup-retention 7 \\\n      --high-availability Disabled \\\n      --yes\n\n    ```\n\n    Use these values:\n\n    * *\\<postgres-server-name>*: The PostgreSQL database server name. This name must be unique across all of Azure. The server endpoint is `https://<postgres-server-name>.postgres.database.azure.com`. Allowed characters are `A` to `Z`, `0` to `9`, and hyphen (`-`).\n\n    * *\\<location>*: Use the same location that you used for the web app. *\\<location>* is one of the Azure location `Name` values from the output of the command `az account list-locations -o table`.\n\n    * *\\<admin-username>*: The username for the administrator account. It can't be `azure_superuser`, `admin`, `administrator`, `root`, `guest`, or `public`. Use `demoadmin` for this tutorial.\n\n    * *\\<admin-password>*: The password of the administrator user. It must contain 8 to 128 characters from three of the following categories: English uppercase letters, English lowercase letters, numbers, and non-alphanumeric characters.\n\n        > [!IMPORTANT]\n        > When you're creating usernames or passwords, *do not* use the dollar sign ($) character. Later, when you create environment variables with these values, that character has a special meaning within the Linux container that you use to run Python apps.\n\n    * `--version`: Use `16`. It specifies the PostgreSQL version to use for the server.\n\n    * `--tier`: Use `Burstable`. It specifies the pricing tier for the server. The Burstable tier is a lower-cost option for workloads that don't need the full CPU continuously, and is suitable for the requirements of this tutorial.\n\n    * `--sku-name`: The name of the pricing tier and compute configuration; for example, `Standard_B1ms`. For more information, see [Azure Database for PostgreSQL pricing][24]. To list available tiers, use `az postgres flexible-server list-skus --location <location>`.\n\n    * `--public-access`: Use `0.0.0.0`. It allows public access to the server from any Azure service, such as Container Apps.\n\n    * `--microsoft-entra-auth`: Use `Enabled`. It enables Microsoft Entra authentication on the server.\n\n    * `--storage-size`: Use `32`. It specifies the storage size in gigabytes (GB) for the server. The minimum is 32 GB.\n\n    * `--backup-retention`: Use `7`. It specifies the number of days to retain backups for the server. The minimum is 7 days.\n\n    * `--high-availability`: Use `Disabled`. It disables high availability for the server. High availability is not required for this tutorial.\n\n    * `--yes`: It accepts the terms of use for the PostgreSQL server.\n\n    > [!NOTE]\n    > If you plan to work with the PostgreSQL server from your local workstation by using tools, you need to add a firewall rule for your workstation's IP address by using the [az postgres flexible-server firewall-rule create][28] command.\n\n1. Use the [az ad signed-in-user show](/cli/azure/ad/signed-in-user#az-ad-signed-in-user-show) command to get the object ID of your user account. You use this ID in the next command.\n\n    ```azurecli\n    #!/bin/bash\n    CALLER_OBJECT_ID=$(az ad signed-in-user show --query id -o tsv)\n    CALLER_DISPLAY_NAME=$(az ad signed-in-user show --query userPrincipalName -o tsv)\n    ```\n\n1. Use the [az postgres flexible-server ad-admin create](/cli/azure/postgres/flexible-server/ad-admin#az-postgres-flexible-server-ad-admin-create) command to add your user account as a Microsoft Entra administrator on the PostgreSQL server:\n\n    ```azurecli\n    #!/bin/bash\n    az postgres flexible-server microsoft-entra-admin create \\\n      --server-name \"$POSTGRES_SERVER_NAME\" \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --display-name \"$CALLER_DISPLAY_NAME\" \\\n      --object-id \"$CALLER_OBJECT_ID\" \\\n      --type User\n\n    ```\n\n1. Use the [az postgres flexible-server firewall-rule create][28] command to add a rule that allows your web app to access the PostgreSQL flexible server. In the following command, you configure the server's firewall to accept connections from your development workstation by using your public IP address:\n\n    ```azurecli\n    MY_IP=$(curl -s ifconfig.me)\n    az postgres flexible-server firewall-rule create \\\n      --name \"$POSTGRES_SERVER_NAME\" \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --rule-name allow-my-ip \\\n      --start-ip-address \"$MY_IP\" \\\n      --end-ip-address \"$MY_IP\"\n        ```\n\n### [VS Code](#tab/vscode-aztools)\n\nThese steps require the [Azure Databases extension][26] for VS Code.\n\n1. Start the PostgreSQL **Create Server** task:\n\n    1. Select the F1 key or Ctrl+Shift+P to open the command palette.\n    1. Type **Azure Databases**.\n    1. Select the task **Azure Databases: Create Server**.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/visual-studio-code-create-postgres-server-01.png\" alt-text=\"Screenshot that shows how to search for the task to create an Azure Database for PostgreSQL flexible server in Visual Studio Code.\" lightbox=\"media/tutorial-container-apps/visual-studio-code-create-postgres-server-01.png\":::\n\n    Alternatively, you can select the **Azure** extension, go to **RESOURCES**, and expand your subscription. (Make sure you're viewing resources by **Group by Resource Type**.) Then,\n    right-click **PostgreSQL servers** and select  **Create server** to start the same task.\n\n1. A series of prompts guides you through the process of creating the server. Fill in the information as follows:\n\n    * If you're asked to select a subscription, select the subscription that you're using for this tutorial.\n\n    * **Select an Azure Database Server**: Select **PostgreSQL Flexible Server**.\n\n    * **Server name**: Specify a name for the database server. The name must be unique across all of Azure. The database server's URL becomes `https://<server-name>.postgres.database.azure.com`. Allowed characters are **A** to **Z**, **0** to **9**, and hyphen (**-**). For example: *postgres-db-\\<unique-id>*.\n\n    * **Select the Postgres SKU and options**: Select the **B1ms Basic** tier (one vCore, 2-GiB memory, 5-GB storage).\n\n    * **Administrator Username**: Create a username for an administrator account on the database server. Use **demoadmin** for this tutorial.\n\n    * **Administrator Password**: Create a password for the administrator and confirm it.\n\n    * **Select a resource group for new resources**: Select a resource group to contain the server. Use the same resource group where you created the container registry **pythoncontainer-rg**.\n\n    * **Select a location for new resources**: Select the same location as the resource group and container registry.\n\n    Monitor progress in the **Azure** window and confirm that the server is created successfully. If an error occurs, see the [troubleshooting section](#troubleshoot-deployment).\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/visual-studio-code-create-postgres-server-02.gif\" alt-text=\"Animated screenshot that shows selections for completing the task of creating an Azure Database for PostgreSQL flexible server in Visual Studio Code.\" lightbox=\"media/tutorial-container-apps/visual-studio-code-create-postgres-server-02.gif\":::\n\n1. After the server is created, configure access from your local environment to the Azure Database for PostgreSQL server:\n\n    1. Confirm that the server was created by checking the **Azure: Activity Log** window.\n\n    1. Open the command palette (select the F1 key or Ctrl+Shift+P).\n\n    1. Search for and select **PostgreSQL: Configure Firewall**. Select a subscription if you're prompted.\n\n    1. Select **PostgreSQL servers (Flexible)**, and then select the server that you created in the previous step. If the server doesn't appear in the list, it's likely still being created.\n\n    1. Select **Yes** in the dialog to add your IP address to the firewall rules of the PostgreSQL server.\n\n       :::image type=\"content\" source=\"media/tutorial-container-apps/visual-studio-code-create-postgres-server-04.png\" alt-text=\"Screenshot that shows the confirmation dialog for adding a local workstation IP as a firewall rule for an Azure Database for PostgreSQL flexible server in Visual Studio Code.\" lightbox=\"media/tutorial-container-apps/visual-studio-code-create-postgres-server-04.png\":::\n\n1. The following steps require the Azure CLI. If you have the Azure CLI installed locally, you can run them in a terminal prompt. Otherwise, open [Azure Cloud Shell][4] in a browser.\n\n1. Use the [az postgres flexible-server firewall-rule create](/cli/azure/postgres/flexible-server/firewall-rule#az-postgres-flexible-server-firewall-rule-create) command to add a rule that allows your web app to access the PostgreSQL flexible server. In the following command, you configure the server's firewall to accept connections from all Azure resources:\n\n    ```azurecli\n    az postgres flexible-server firewall-rule create \\\n        --name <postgres-server_name> \\\n        --resource-group pythoncontainer-rg \\\n        --rule-name AllowAllAzureServices \\\n        --start-ip-address 0.0.0.0 \\\n        --end-ip-address 0.0.0.0\n    ```\n\n1. Use the [az postgres flexible-server update](/cli/azure/postgres/flexible-server#az-postgres-flexible-server-update) command to enable Microsoft Entra authentication on the server:\n\n    ```azurecli\n    az postgres flexible-server update \\\n        --resource-group pythoncontainer-rg \\\n        --name <postgres-server-name> \n        --active-directory-auth Enabled\n    ```\n\n1. Use the [az ad signed-in-user show](/cli/azure/ad/signed-in-user#az-ad-signed-in-user-show) command to get the object ID of your user account. You use this ID in the next command.\n\n    ```azurecli\n    az ad signed-in-user show --query id --output tsv\n    ```\n\n1. Use the [az postgres flexible-server ad-admin create](/cli/azure/postgres/flexible-server/ad-admin#az-postgres-flexible-server-ad-admin-create) command to add your user account as a Microsoft Entra administrator on the PostgreSQL server:\n\n    ```azurecli\n    az postgres flexible-server ad-admin create \\\n       --resource-group pythoncontainer-rg \\\n       --server-name <postgres-server-name>  \\\n       --display-name <your-email-address> \\\n       --object-id <your-account-object-id>\n    ```\n\n    For your account object ID, use the value that you got in the previous step.\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the [Azure portal][3], search for **postgresql flexible**. Under **Marketplace** in the results, select **Azure Database for PostgreSQL Flexible Server**.\n\n1. On the **Basics** tab, enter the following values:\n\n    * **Resource group**: Enter the resource group used in this tutorial, **pythoncontainer-rg**.\n    * **Server name**: Enter a name for the database server that's unique across Azure. The database server's URL becomes `https://<server-name>.postgres.database.azure.com`. Allowed characters are **A** to **Z**, **0** to **9**, and hyphen (**-**). For example: *postgres-db-\\<unique-id>*.\n    * **Region**: Select the same region that you used for the resource group.\n    * **Workload type**: Select **Development**.\n    * **Authentication method**: Select **PostgreSQL and Microsoft Entra authentication**.\n    * **Set Microsoft Entra admin**: Select **Set admin**. On the **Select Microsoft Entra Admins** pane, search for your Azure user account, select it in the results, and then click **Select**.\n    * **Admin username**: Use **demoadmin**.\n    * **Password** and **Confirm password**: Enter a password for the admin account.\n\n    For all other settings, leave the defaults. When you finish, select **Next: Networking**.\n\n1. On the **Networking** tab, enter the following values:\n\n    * **Connectivity method**: Make sure **Public access (allowed IP addresses) and Private endpoint** is selected.\n    * **Allow public access to this resource through the internet using a public IP address**: Make sure the checkbox is selected.\n    * **Allow public access from any Azure service within Azure to this server**: Select the checkbox.\n    * **Add current client IP address**: Select (add) if you plan to access the database from your local server.\n\n    For all other settings, leave the defaults. Select **Review + Create** to continue.\n\n1. Review the settings. When you're satisfied, select **Create**.\n\n---\n\n> [!NOTE]\n> The steps in this section create a PostgreSQL server with a single vCore and limited memory in the Burstable pricing tier. The Burstable tier is a lower-cost option for workloads that don't need the full CPU continuously, and is suitable for the requirements of this tutorial. For production workloads, you might upgrade to either the General Purpose or Memory Optimized pricing tier. These tiers provide higher performance but increase costs.\n>\n> To learn more, see [Compute options in Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server/concepts-compute). For information about pricing, see [Azure Database for PostgreSQL pricing](https://azure.microsoft.com/pricing/details/postgresql/flexible-server/).\n\n## Create a database on the server\n\nAt this point, you have a PostgreSQL server. In this section, you create a database on the server.\n\n### [Azure CLI](#tab/azure-cli)\n\nUse the [az postgres flexible-server db create][27] command to create a database named *restaurants_reviews*:\n\n```azurecli\n#!/bin/bash\nDATABASE_NAME=restaurants_reviews\naz postgres flexible-server db create \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --server-name $POSTGRES_SERVER_NAME \\\n    --database-name $DATABASE_NAME\n```\n\nYou could also use the [az postgres flexible-server connect][16] command to connect to the database and then work with [psql][15] commands. When you're working with psql, it's often easier to use [Azure Cloud Shell][4] because the shell includes all the dependencies for you.\n\n### [VS Code](#tab/vscode-aztools)\n\nThese steps require the [Azure Databases extension][26] for VS Code.\n\n1. In the Azure Databases extension, find the PostgreSQL server that you created, right-click it, and then select **Create Database**.\n\n1. At the prompt, enter **restaurants_reviews** as the **Database Name** value.\n\nIf you have trouble creating the database, the server might still be processing the firewall rule from the previous step. Wait a moment and try again. If you're prompted to enter credentials to access the database, use the **demoadmin** username and the password that you entered when you created the database.\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the [Azure portal](https://portal.azure.com), go to your PostgreSQL server. For example, you can enter the name of your PostgreSQL server on the search bar and select it under **Resources** in the results.\n\n1. On the service menu, under **Settings**, select **Databases**.\n\n1. On the top menu of the **Databases** pane, select **Add**.\n\n1. On the **Create Database** pane, enter **restaurants_reviews** for **Name**, and then select **Save**.\n\n1. When the operation finishes, you return to the **Databases** pane. Verify that **restaurants_reviews** appears in the list of databases. You might need to refresh the pane for it to appear.\n\n---\n\nYou can also connect to the Azure Database for PostgreSQL flexible server and create a database by using [psql][15] or an IDE that supports PostgreSQL, like [Visual Studio Code](/azure/postgresql/developer/vs-code-extension/vs-code-connect). For steps using psql, see [Configure the managed identity on the PostgreSQL database](#configure-the-managed-identity-on-the-postgresql-database) later in this article.\n\n## Create a user-assigned managed identity\n\nCreate a user-assigned managed identity to use as the identity for the container app when it's running in Azure.\n\n> [!NOTE]\n> To create a user-assigned managed identity, your account needs the [Managed Identity Contributor](/azure/role-based-access-control/built-in-roles#managed-identity-contributor) role assignment.\n\n### [Azure CLI](#tab/azure-cli)\n\nUse the [az identity create](/cli/azure/identity#az-identity-create) command to create a user-assigned managed identity:\n\n```azurecli\nUA_MANAGED_IDENTITY_NAME=<managed-identity-name> # Use a unique name for the managed identity, such as-\"my-ua-managed-id\".\naz identity create \\\n    --name $UA_MANAGED_IDENTITY_NAME \n    --resource-group $RESOURCE_GROUP_NAME\n```\n\n### [VS Code](#tab/vscode-aztools)\n\nThere isn't currently a VS Code extension that supports creating user-assigned managed identities. Follow the steps for the Azure CLI or the Azure portal.\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the [Azure portal](https://portal.azure.com), search for **managed identity**. Under **Marketplace** in the results, select **User Assigned Managed Identity**.\n1. On the **Basics** tab, enter the following values:\n\n    * **Subscription**: Select the subscription that you're using for the resources in this tutorial.\n    * **Resource group**: Enter the resource group for this tutorial, **pythoncontainer-rg**.\n    * **Region**: Select the region that you're using for the resources in this tutorial.\n    * **Name**: Enter the name for your user-assigned managed identity. For this tutorial, use **my-ua-managed-id**. You can use a different name, but the commands in this tutorial assume **my-ua-managed-id**. If you use a different name, you'll have to change it in other commands.\n\n1. Select **Review + create** to review the changes.\n1. Select **Create**.\n\n---\n\n## Configure the managed identity on the PostgreSQL database\n\nConfigure the managed identity as a role on the PostgreSQL server and then grant it necessary permissions for the *restaurants_reviews* database. Whether you're using the Azure CLI or psql, you must connect to the Azure PostgreSQL server with a user who's configured as a Microsoft Entra admin on your server instance. Only Microsoft Entra accounts configured as a PostgreSQL admin can configure managed identities and other Microsoft admin roles on your server.\n\n### [Azure CLI](#tab/configure-database-azure-cli)\n\n1. Get an access token for your Azure account by using the [az account get-access-token](/cli/azure/account#az-account-get-access-token) command. You use the access token in the next steps.\n\n    ```azurecli\n    #!/bin/bash\n    MY_ACCESS_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)\n    echo $MY_ACCESS_TOKEN\n    ```\n\n1. Add the user-assigned managed identity as database role on your PostgreSQL server by using the [az postgres flexible-server execute](/cli/azure/postgres/flexible-server#az-postgres-flexible-server-execute) command:\n\n    ```azurecli\n    #!/bin/bash\n    az postgres flexible-server execute \\\n      --name \"$POSTGRES_SERVER_NAME\" \\\n      --admin-user \"$CALLER_DISPLAY_NAME\" \\\n      --admin-password \"$ACCESS_TOKEN\" \\\n      --database-name postgres \\\n      --querytext \"SELECT * FROM pgaadauth_create_principal('$UA_MANAGED_IDENTITY_NAME', false, false);\"\n    ```\n\n    > [!NOTE]\n    > If you're running the `az postgres flexible-server execute` command on your local workstation, make sure that you added a firewall rule for your workstation's IP address. You can add a rule by using the [az postgres flexible-server firewall-rule create][28] command. The same requirement also exists for the command in the next step.\n\n1. Grant the user-assigned managed identity the necessary permissions on the *restaurants_reviews* database by using the following [az postgres flexible-server execute](/cli/azure/postgres/flexible-server#az-postgres-flexible-server-execute) command:\n\n    ```azurecli\n    #!/bin/bash\n    SQL_GRANTS=$(cat <<EOF\n    GRANT CONNECT ON DATABASE $DATABASE_NAME TO \"$UA_MANAGED_IDENTITY_NAME\";\n    GRANT USAGE, CREATE ON SCHEMA public TO \"$UA_MANAGED_IDENTITY_NAME\";\n    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"$UA_MANAGED_IDENTITY_NAME\";\n    ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO \"$UA_MANAGED_IDENTITY_NAME\";\n    EOF\n    )\n\n    az postgres flexible-server execute \\\n      --name \"$POSTGRES_SERVER_NAME\" \\\n      --admin-user \"$CALLER_DISPLAY_NAME\" \\\n      --admin-password \"$MY_ACCESS_TOKEN\" \\\n      --database-name \"$DATABASE_NAME\" \\\n      --querytext \"$SQL_GRANTS\"\n    \n    ```\n\n    This Azure CLI command connects to the *restaurants_reviews* database on the server and issues the following SQL commands:\n\n    ```sql\n    GRANT CONNECT ON DATABASE restaurants_reviews TO \"my-ua-managed-id\";\n    GRANT USAGE ON SCHEMA public TO \"my-ua-managed-id\";\n    GRANT CREATE ON SCHEMA public TO \"my-ua-managed-id\";\n    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"my-ua-managed-id\";\n    ALTER DEFAULT PRIVILEGES IN SCHEMA public\n    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO \"my-ua-managed-id\";\n    ```\n\n### [psql](#tab/configure-database-psql)\n\nYou can use the PostgreSQL interactive terminal [psql][15] in your local environment or in [Azure Cloud Shell][4], which is also accessible in the [Azure portal][3]. When you're working with psql, it's often easier to use Cloud Shell because the shell includes all the dependencies for you.\n\n1. Connect to the database with psql by using the Azure account that you previously configured as a Microsoft Entra admin on your server:\n\n    ```bash\n    psql --host=<postgres-server-name>.postgres.database.azure.com \\\n         --port=5432 \\\n         --username=<your-azure-email-address> \\\n         --dbname=postgres \\\n         --set sslmode=require\n    ```\n\n    In the command, *\\<postgres-server-name>* is the name of the PostgreSQL server, and *\\<your-azure-email-address>* is the email address of your Azure account. The command prompts you for your Azure account password.\n\n    If you're working in Azure Cloud Shell or if you have the Azure CLI installed on your local system, you can use the [az account get-access-token](/cli/azure/account#az-account-get-access-token) command to get an access token that you can copy and enter as the password:\n\n    ```azurecli\n    az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken\n    ```\n\n    Or, you can combine the psql and Azure CLI commands:\n\n    ```bash\n    psql \"host=<postgres-server-name>.postgres.database.azure.com port=5432 dbname=postgres user=<your-azure-email-address> password='$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)' sslmode=require\"\n    ```\n\n    Be sure to replace the *\\<postgres-server-name>* and *\\<your-azure-email-address>* placeholders before running the command.\n\n    If you have trouble connecting, restart the database and try again. If you're connecting from your local environment, your IP address must be added to the firewall rule list for the database service.\n\n1. Add the user-assigned managed identity as database role on your PostgreSQL server.\n\n    At the `postgres=>` prompt, enter:\n\n    ```sql\n    SELECT * FROM pgaadauth_create_principal('my-ua-managed-id', false, false);SELECT * FROM pgaadauth_list_principals(false);\n    ```\n\n    The semicolon (`;`) at the end of each command is necessary. To verify that the database was successfully created, use the command `\\c restaurants_reviews`. Enter `\\?` to show help or `\\q` to quit.\n\n1. Connect to the *restaurants_reviews* database by using the `\\c` (connect) command:\n\n    ```SQL\n    \\c restaurants_reviews\n    ```\n\n    > [!NOTE]\n    > If you haven't yet created the *restaurants_reviews* database, you can do so by using the following command:\n    >\n    > ```sql\n    > CREATE DATABASE resaurants_reviews\n    > ```\n\n1. Grant the user-assigned managed identity the necessary permissions on the *restaurants_reviews* database.\n\n    At the `restaurants_reviews_=>` prompt, enter the following commands:\n\n    ```sql\n    GRANT CONNECT ON DATABASE restaurants_reviews TO \"my-ua-managed-id\";\n    GRANT USAGE ON SCHEMA public TO \"my-ua-managed-id\";\n    GRANT CREATE ON SCHEMA public TO \"my-ua-managed-id\";\n    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"my-ua-managed-id\";\n    ALTER DEFAULT PRIVILEGES IN SCHEMA public\n    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO \"my-ua-managed-id\";\n    ```\n\n1. Quit psql by using the `\\q` command:\n\n    ```SQL\n    \\q\n    ```\n\n---\n\n## Deploy the web app to Container Apps\n\nContainer apps are deployed to Azure Container Apps [*environments*][30], which act as a secure boundary. In the following steps, you create the environment and a container inside the environment. You then configure the container so that the website is visible externally.\n\n### [Azure CLI](#tab/azure-cli)\n\nThese steps require the Azure Container Apps extension, *containerapp*.\n\n1. Create a Container Apps environment by using the [az containerapp env create][13] command:\n\n    ```azurecli\n    #!/bin/bash\n    APP_ENV_NAME=<app-env-name> # Use a unique name for the environment, such as \"python-container-env\".\n    az containerapp env create \\\n    --name $APP_ENV_NAME \\\n    --resource-group $RESOURCE_GROUP_NAME \\\n    --location $LOCATION\n    ```\n\n1. Get the sign-in credentials for the Azure Container Registry instance by using the [az acr credential show](/cli/azure/acr/credential#az-acr-credential-show) command:\n\n    ```azurecli\n    #!/bin/bash\n    REGISTRY_CREDS=$(az acr credential show -n \"$REGISTRY_NAME\" --query \"[username,passwords[0].value]\" -o tsv)\n    REGISTRY_USERNAME=$(echo \"$REGISTRY_CREDS\" | head -n1)\n    REGISTRY_PASSWORD=$(echo \"$REGISTRY_CREDS\" | tail -n1)\n    ```\n\n    You use the username and one of the passwords returned from the command's output when you create the container app in step 5.\n\n1. Use the [az identity show](/cli/azure/identity#az-identity-show) command to get the client ID and resource ID of the user-assigned managed identity:\n\n    ```azurecli\n    UA_CLIENT_ID=$(az identity show \\\n        --name \"$UA_MANAGED_IDENTITY_NAME\" \\\n        --resource-group \"$RESOURCE_GROUP_NAME\" \\\n        --query clientId -o tsv)\n    UA_RESOURCE_ID=$(az identity show \\\n        --name \"$UA_MANAGED_IDENTITY_NAME\" \\\n        --resource-group \"$RESOURCE_GROUP_NAME\" \\\n        --query id -o tsv)\n    ```\n\n    You use the value of the client ID (GUID) and the resource ID from the command's output when you create the container app in step 5. The resource ID has the following form: `/subscriptions/<subscription-id>/resourcegroups/pythoncontainer-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-ua-managed-id`.\n\n1. Run the following command to generate a secret key value:\n\n    ```azurecli\n    AZURE_SECRET_KEY=$(python -c 'import secrets; print(secrets.token_hex())')\n    ```\n\n    You use the secret key value to set an environment variable when you create the container app in step 5.\n\n    > [!NOTE]\n    > The command that this step shows is for a Bash shell. Depending on your environment, you might need to invoke Python by using  `python3`. On Windows, you need to enclose the command in the `-c` parameter in double quotation marks rather than single quotation marks. You also might need to invoke Python by using `py` or `py -3`, depending on your environment.\n\n1. Create a container app in the environment by using the [az containerapp create][12] command:\n\n    ```azurecli\n    az containerapp create \\\n      --name \"$CONTAINER_APP_NAME\" \\\n      --resource-group \"$RESOURCE_GROUP_NAME\" \\\n      --environment \"$APP_ENV_NAME\" \\\n      --image \"$REGISTRY_NAME.azurecr.io/$IMAGE_NAME\" \\\n      --target-port \"$TARGET_PORT\" \\\n      --ingress external \\\n      --registry-server \"$REGISTRY_NAME.azurecr.io\" \\\n      --registry-username \"$REGISTRY_USERNAME\" \\\n      --registry-password \"$REGISTRY_PASSWORD\" \\\n      --user-assigned \"$UA_RESOURCE_ID\" \\\n      --env-vars \\\n          DBHOST=\"$POSTGRES_SERVER_NAME\" \\\n          DBNAME=\"$DATABASE_NAME\" \\\n          DBUSER=\"$UA_MANAGED_IDENTITY_NAME\" \\\n          RUNNING_IN_PRODUCTION=1 \\\n          AZURE_CLIENT_ID=\"$UA_CLIENT_ID\" \\\n          AZURE_SECRET_KEY=\"$AZURE_SECRET_KEY\"\n    ```\n\n1. For Django only, migrate and create a database schema. (In the Flask sample app, it's done automatically, and you can skip this step.)\n\n    Connect by using the [az containerapp exec][31] command:\n\n    ```azurecli\n        az containerapp exec \\\n            --name $CONTAINER_APP_NAME \\\n            --resource-group $RESOURCE_GROUP_NAME\n    ```\n\n    Then, at the shell command prompt, enter `python manage.py migrate`.\n\n    You don't need to migrate for revisions of the container.\n\n1. Test the website.\n\n    The `az containerapp create` command that you entered previously outputs an application URL that you can use to browse to the app. The URL ends in `azurecontainerapps.io`. Go to the URL in a browser. Alternatively, you can use the [az containerapp browse](/cli/azure/containerapp#az-containerapp-browse) command.\n\n### [VS Code](#tab/vscode-aztools)\n\nThese steps require the [Azure Container Apps extension][11] for VS Code.\n\n1. Get values that you need for environment variables:\n\n    1. Open a terminal in VS Code for the following Azure CLI commands. You can also enter the commands from Azure Cloud Shell.\n\n    1. Get the client ID of the managed identity by using the [az identity show](/cli/azure/identity#az-identity-show) command:\n\n        ```azurecli\n        az identity show --name my-ua-managed-id --resource-group pythoncontainer-rg --query clientId -o tsv\n        ```\n\n        The client ID is a GUID. You use it to set an environment variable in the next step.\n\n    1. Generate a secret key value:\n\n        ```bash\n        python -c 'import secrets; print(secrets.token_hex())'\n        ```\n\n        You use the secret key value to set an environment variable in the next step.\n\n        > [!NOTE]\n        > The command shown here is for a Bash shell. Depending on your environment, you might need to invoke Python by using `python3`. On Windows, you need to enclose the command in the `-c` parameter in double quotation marks rather than single quotation marks. You also might need to invoke Python by using `py` or `py -3`.\n\n1. Create an *.env* file that you'll reference during the creation of the container app.\n\n    The sample repo includes an *.env.example* file that you can start from. Create the *.env* file with the following values:\n\n    ```python\n    DBHOST=\"<postgres-server-name>\"\n    DBNAME=\"restaurants_reviews\"\n    DBUSER=\"my-ua-managed-id\"\n    RUNNING_IN_PRODUCTION=\"1\"\n    AZURE_CLIENT_ID=\"<managed-identity-client-id>\"\n    AZURE_SECRET_KEY=\"<your-secret-key>\"\n    ```\n\n    The `DBUSER` value is the name of your user-assigned managed identity.\n\n    The `AZURE_CLIENT_ID` value is the client ID of your user-assigned managed identity. You got it in the previous step.\n\n    The `AZURE_SECRET_KEY` value is the secret key value that you generated in the previous step.\n\n1. Create a Container Apps environment.\n\n    Start the **Create Container Apps Environment** task:\n\n    1. Select the F1 key or Ctrl+Shift+P to open the command palette.\n    1. Type **container apps**.\n    1. Select the task **Azure Container Apps: Create Container Apps Environment**.\n\n    Alternatively, you can open the Azure extension and select the plus (**+**) icon in the **Resources** section.\n\n    Follow the prompts to create the Container Apps environment:\n\n    * If you're prompted, select your subscription.\n    * **Enter a container apps environment name**: Enter **python-container-env**.\n    * **Select a location for new resources**: Choose the same location as the resource group that you created previously.\n\n    Creating the environment takes several minutes. A notification shows the progress of the operation. Look for \"Successfully created new Container Apps environment\" before you go to the next step. The environment is created in a resource group of the same name, *python-container-env*.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/visual-studio-code-create-container-app-02.gif\" alt-text=\"Animated screenshot that shows selections for creating an Azure Container Apps environment in Visual Studio Code.\" lightbox=\"media/tutorial-container-apps/visual-studio-code-create-container-app-02.gif\":::\n\n1. Create a container app in the new environment by finding the **Azure Container Apps: Create Container App** task in the command palette.\n\n    Start the **Create Container App** task:\n\n    1. Select the F1 key or Ctrl+Shift+P to open the command palette.\n    1. Type **container apps**.\n    1. Select the task **Azure Container Apps: Create Container App**.\n\n    Alternatively, you can open the Azure extension and go to the **Container Apps** section. Select the environment, right-click, and then select **Create Container App** to start the task.\n\n    Follow the prompts to create the container app:\n\n    * **Select subscription**: Select the subscription that you're using for this tutorial.\n    * **Select a container apps environment**: Select the environment that you created in the previous step.\n    * **Enter a container app name**: Enter **python-container-app**.\n    * **Select an image source for the container app**: Select **Container Registry**.\n    * **Select a container registry**: Select **Azure Container Registry**.\n    * **Select an Azure Container Registry**: Select the name of the registry that you created previously.\n    * **Select a repository**: Select **pythoncontainer**.\n    * **Select a tag**: Select **latest**.\n    * **Select a .env file to set the environment variables for the container instance**: Select the *.env* file that you created in step 2.\n    * **Enable ingress for applications that need an HTTP endpoint**: Select **Enable**.\n    * **Select the HTTP traffic that the endpoint will accept**: Select **External**.\n    * **Port the container is listening on**: Set to **8000** for Django or **5000** for Flask.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/visual-studio-code-create-container-app-03.gif\" alt-text=\"Animated screenshot that shows selections for creating an Azure container app in an environment in Visual Studio Code.\" lightbox=\"media/tutorial-container-apps/visual-studio-code-create-container-app-03.gif\":::\n\n    A notification shows the progress of the operation. Look for \"Successfully created new Container Apps environment\" before you go to the next step. The container app is created in the same resource group as the Container Apps environment *python-container-env*.\n\n1. Configure the user-assigned managed identity on the newly created container app:\n\n    1. Open a terminal in VS Code for the following Azure CLI commands. You can also enter the commands from Azure Cloud Shell.\n\n    1. Get the resource ID of the managed identity:\n\n        ```azurecli\n        az identity show --name my-ua-managed-id --resource-group pythoncontainer-rg --query id -o tsv\n        ```\n\n        The resource ID has the following form: */subscriptions/\\<subscription ID>/resourcegroups/pythoncontainer-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-ua-managed-id*.\n\n    1. Assign the managed identity to the container app by using the [az containerapp identity assign](/cli/azure/containerapp/identity#az-containerapp-identity-assign) command:\n\n        ```azurecli\n        az containerapp identity assign  \\\n            --name python-container-app \\\n            --resource-group container-app-environment  \\\n            --user-assigned <managed-identity-resource-id>      \n        ```\n\n        Replace the `<managed-identity-resource-id>` placeholder with the resource ID from the output of the previous command.\n\n        The resource group in this command is the same resource group in which you created the Container Apps environment and the container app, *python-container-app*.\n\n1. For Django only, migrate and create a database schema. (In the Flask sample app, it's done automatically, and you can skip this step.)\n\n    1. Go to the **Azure** extension and expand the **Container Apps** section. Find and expand your container environment, right-click the container app that you created, and then select **Open Console in Portal**.\n    1. Choose a startup command and select **Connect**.\n    1. At the shell prompt, enter `python manage.py migrate`.\n\n    You don't need to migrate for revisions of the container.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/azure-portal-create-container-app-11.png\" alt-text=\"Screenshot that shows selections for connecting to an Azure Container Apps container in the Azure portal.\" lightbox=\"media/tutorial-container-apps/azure-portal-create-container-app-11.png\":::\n\n1. Test the website.\n\n    After the **Create Container App** task finishes, a notification appears with a **Browse** button to go to the website.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/visual-studio-code-create-container-app-04.png\" alt-text=\"Screenshot that shows the button for browsing to an Azure container app after it's created in Visual Studio Code.\" lightbox=\"media/tutorial-container-apps/visual-studio-code-create-container-app-04.png\":::\n\n    If you miss the notification, go to the **Azure** extension and expand the **Container Apps** section. Find and expand your container environment, right-click the container app, and then select **Browse**. You can also enter the **Azure Container Apps: Browse** task in the command palette and follow the prompts.\n\n### [Azure portal](#tab/azure-portal)\n\n1. Get the client ID for the user-assigned managed identity. You use it in a later step.\n\n    1. In the [Azure portal](https://portal.azure.com), search for **my-ua-managed-id** and select it under **Resources** in the results.\n    1. On the service menu, select **Overview** and note down the **Client ID** value.\n\n1. Open Azure Cloud Shell and enter the following command to get a secret key value:\n\n    ```python\n    python -c 'import secrets; print(secrets.token_hex())'\n    ```\n\n    You use the secret key value to set an environment variable in a later step.\n\n1. In the portal, search for **container apps**. Under **Marketplace** in the results, select **Container App**.\n\n1. On the **Basics** tab, enter the following values:\n\n    * **Resource group**: Use the previously created group that contains the Azure Container Registry instance.\n    * **Container app name**: Enter **python-container-app**.\n    * **Deployment source**: Make sure that **Container image** is selected.\n    * **Region**: Use the same region/location as the resource group.\n    * **Container Apps Environment**: Select **Create new** to create a new environment named *python-container-env*.\n\n    Select **Next: Container** to continue the configuration.\n\n1. On the **Container** tab, continue configuring the container app:\n\n    * **Use quickstart image**: Make sure the checkbox is cleared.\n    * **Image source**: Make sure **Azure Container Registry** is selected.\n    * **Registry**: Select the name of registry that you created earlier.\n    * **Image**: Select **pythoncontainer** (the name of the image that you built).\n    * **Image tag**: Select **latest**.\n\n    Under **Environment variables**, enter values for the following variables:\n\n    * **DBHOST**=*\\<postgres-server-name>*\n    * **DBNAME**=**restaurants_reviews**\n    * **DBUSER**=**my-ua-managed-id**\n    * **RUNNING_IN_PRODUCTION**=**1**\n    * **AZURE_CLIENT_ID**=*\\<managed-identity-client-id>*\n    * **AZURE_SECRET_KEY**=*\\<your-secret-key>*\n\n    For **AZURE_CLIENT_ID**, use the client ID that you copied for the user-assigned managed identity.\n\n    For **AZURE_SECRET_KEY**, use the secret key value that you generated in a previous step.\n\n    Select **Next: Ingress** to continue.\n\n1. On the **Ingress** tab, continue configuring the container app:\n\n    * **Ingress**:  Select the **Enabled** checkbox. More selections appear.\n    * **Ingress traffic**: Select **Accepting traffic from anywhere**.\n    * **Target port**: Set to **8000** for Django or **5000** for Flask.\n\n    Select **Review + create**.\n\n1. Review the settings, and then select **Create** to start deployment.\n\n1. After the deployment finishes, select **Go to resource**.\n\n1. Add the user-assigned managed identity to the container app:\n\n    1. On the service menu, under **Security**, select **Identity**.\n    1. On the **User assigned** tab, select **Add**.\n    1. On the **Add user assigned managed identity** pane, select **my-ua-managed-identity**, and then select **Add**.\n    1. When the operation finishes, you return to the **User assigned** tab. Verify that **my-ua-managed-id** appears in the list of identities.\n\n    > [!TIP]\n    > Instead of adding the managed identity and defining environment variables, you can use a [service connector][9]. A service connector helps you connect Azure compute services to other backing services by configuring connection information and by generating and storing environment variables for you.\n    >\n    > If you use a service connector, be sure to synchronize the environment variables in the sample code to the environment variables that you created with the service connector.\n\n1. For Django only, migrate and create a database schema. (In the Flask sample app, it's done automatically, and you can skip this step.)\n\n    1. On the service menu, under **Monitoring**, select **Console**.\n    1. Choose a startup command and select **Connect**.\n    1. At the shell prompt, enter `python manage.py migrate`.\n\n    You don't need to migrate for revisions of the container.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/azure-portal-create-container-app-11.png\" alt-text=\"Screenshot that shows selections for connecting to an Azure Container Apps container in the Azure portal.\" lightbox=\"media/tutorial-container-apps/azure-portal-create-container-app-11.png\":::\n\n1. Test the website.\n\n    1. On the service menu, select **Overview**.\n    1. Under **Essentials**, select **Application Url** to open the website in a browser.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/azure-portal-create-container-app-10.png\" alt-text=\"Screenshot that shows selections for finding the website URL of an Azure Container Apps container in the Azure portal.\" lightbox=\"media/tutorial-container-apps/azure-portal-create-container-app-10.png\":::\n\n---\n\nHere's an example of the sample website after the addition of a restaurant and two reviews.\n\n:::image type=\"content\" source=\"media/tutorial-container-apps/final-website-example-400px.png\" alt-text=\"Screenshot of the sample website built in this tutorial.\" lightbox=\"media/tutorial-container-apps/final-website-example.png\":::\n\n## Troubleshoot deployment\n\n### You forgot the application URL to access the website\n\nIn the Azure portal:\n\n* Go to the **Overview** page of the container app and look for **Application Url**.\n\nIn VS Code:\n\n1. Go to the **Azure view** (Ctrl+Shift+A) and expand the subscription that you're working in.\n1. Expand the **Container Apps** node, expand the managed environment, right-click **python-container-app**, and then select **Browse**. VS Code opens the browser with the application URL.\n\nIn the Azure CLI:\n\n* Use the command `az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn`.\n\n### In VS Code, the Build Image in Azure task returns an error\n\nIf you see the message \"Error: failed to download context. Please check if the URL is incorrect\" in the VS Code **Output** window, refresh the registry in the Docker extension. To refresh, select the Docker extension, go to the **Registries** section, find the registry, and select it.\n\nIf you run the **Build Image in Azure** task again, check whether your registry from a previous run exists. If so, use it.\n\n### In the Azure portal, an access error appears during the creation of a container app\n\nAn access error that contains \"Cannot access ACR '\\<name>.azurecr.io'\" occurs when admin credentials on an Azure Container Registry instance are disabled.\n\nTo check admin status in the portal, go to your Azure Container Registry instance, select the **Access keys** resource, and ensure that **Admin user** is enabled.\n\n### Your container image doesn't appear in the Azure Container Registry instance\n\n* Check the output of the Azure CLI command or VS Code output and look for messages to confirm success.\n* Check that the name of the registry was specified correctly in your build command with the Azure CLI or in the VS Code task prompts.\n* Make sure your credentials aren't expired. For example, in VS Code, find the target registry in the Docker extension and refresh. In the Azure CLI, run `az login`.\n\n### Website returns \"Bad Request (400)\"\n\nIf you get a \"Bad Request (400)\" error, check the PostgreSQL environment variables passed in to the container. The 400 error often indicates that the Python code can't connect to the PostgreSQL instance.\n\nThe sample code used in this tutorial checks for the existence of the container environment variable `RUNNING_IN_PRODUCTION`, which can be set to any value (like `1`).\n\n### Website returns \"Not Found (404)\"\n\n* Check the **Application Url** value on the **Overview** page for the container. If the application URL contains the word \"internal,\" ingress isn't set correctly.\n* Check the ingress of the container. For example, in the Azure portal, go to the **Ingress** resource of the container. Make sure that **HTTP Ingress** is enabled and **Accepting traffic from anywhere** is selected.\n\n### Website doesn't start, you get \"stream timeout,\" or nothing is returned\n\n* Check the logs:\n  * In the Azure portal, go to the container app's revision management resource and check **Provision Status** for the container:\n    * If the status is **Provisioning**, wait until provisioning finishes.\n    * If the status is **Failed**, select the revision and view the console logs. Choose the order of the columns to show **Time Generated**, **Stream_s**, and **Log_s**. Sort the logs by most recent and look for Python `stderr` and `stdout` messages in the **Stream_s** column. Python `print` output is `stdout` messages.\n  * In the Azure CLI, use the [az containerapp logs show][32] command.\n* If you're using the Django framework, check to see if the *restaurants_reviews* tables exist in the database. If not, use a console to access the container and run `python manage.py migrate`.\n\n## Next step\n\n> [!div class=\"nextstepaction\"]\n> [Configure continuous deployment for a Python web app in Azure Container Apps](tutorial-deploy-python-web-app-azure-container-apps-03.md)\n\n[1]: https://github.com/Azure-Samples/msdocs-python-django-azure-container-apps\n[2]: https://github.com/Azure-Samples/msdocs-python-flask-azure-container-apps\n[3]: https://portal.azure.com/\n[4]: https://shell.azure.com/\n[5]: /cli/azure/acr#az-acr-build\n[6]: https://code.visualstudio.com/docs/containers/overview\n[7]: /cli/azure/install-azure-cli\n[8]: /azure/container-apps/overview\n[9]: /azure/service-connector/overview\n[10]: /azure/postgresql/flexible-server/overview\n[11]: https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurecontainerapps\n[12]: /cli/azure/containerapp#az-containerapp-create\n[13]: /cli/azure/containerapp/env#az-containerapp-env-create\n[14]: /cli/azure/extension#az-extension-add\n[15]: https://www.postgresql.org/docs/13/app-psql.html\n[16]: /cli/azure/postgres/flexible-server#az-postgres-flexible-server-connect\n[17]: /cli/azure/group#az-group-create\n[18]: /cli/azure/acr#az-acr-create\n[19]: /cli/azure/acr#az-acr-login\n[20]: /cli/azure/acr/repository#az-acr-repository-list\n[21]: https://git-scm.com/docs/git-clone\n[22]: /cli/azure/postgres/flexible-server#az-postgres-flexible-server-create\n[23]: https://www.whatsmyip.org/\n[24]: https://azure.microsoft.com/pricing/details/postgresql/flexible-server/\n[25]: https://techcommunity.microsoft.com/t5/itops-talk-blog/how-to-use-cloud-shell-in-visual-studio-code/ba-p/663431\n[26]: https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-cosmosdb\n[27]: /cli/azure/postgres/flexible-server/db#az-postgres-flexible-server-db-create\n[28]: /cli/azure/postgres/flexible-server/firewall-rule#az-postgres-flexible-server-firewall-rule-create\n[29]: /cli/azure/acr#az-acr-update\n[30]: /azure/container-apps/environment\n[31]: /azure/container-apps/revisions\n[32]: /cli/azure/containerapp/logs#az-containerapp-logs-show\n[33]: /cli/azure/containerapp#az-containerapp-exec\n"
  },
  {
    "path": "articles/python/tutorial-deploy-python-web-app-azure-container-apps-03.md",
    "content": "---\ntitle: Configure CI/CD for a Python Web App in Azure Container Apps\ndescription: Set up CI/CD for a Python web app container in Azure Container Apps by using GitHub Actions triggered on changes (like pull requests) to the main branch of a repo.\nms.topic: tutorial\nms.date: 06/18/2025\nms.custom:\n  - devx-track-python\n  - sfi-image-nochange\n---\n\n# Tutorial: Configure continuous deployment for a Python web app in Azure Container Apps\n\nThis article is part of a tutorial series about how to containerize and deploy a Python web app to [Azure Container Apps][8]. Container Apps enables you to deploy containerized apps without managing complex infrastructure.\n\nIn this tutorial, you:\n\n> [!div class=\"checklist\"]\n>\n> * Configure continuous deployment for a container app by using a [GitHub Actions][20] workflow.\n> * Make a change to a copy of the sample repository to trigger the GitHub Actions workflow.\n> * Troubleshoot problems that you might encounter with configuring continuous deployment.\n> * Remove resources that you don't need when you finish the tutorial series.\n\nContinuous deployment is related the DevOps practice of continuous integration and continuous delivery (CI/CD), which is automation of your app development workflow.\n\nThe following diagram highlights the tasks in this tutorial.\n\n:::image type=\"content\" source=\"./media/tutorial-container-apps/service-diagram-overview-for-tutorial-deploy-python-azure-container-apps-cicd.png\" alt-text=\"Diagram of services involved in deploying a Python app on Azure Container Apps, with the parts about continuous deployment highlighted.\" lightbox=\"./media/tutorial-container-apps/service-diagram-overview-for-tutorial-deploy-python-azure-container-apps-cicd.png\":::\n\n## Prerequisites\n\nTo set up continuous deployment, you need:\n\n* The resources (and their configuration) that you created in the [previous tutorial](./tutorial-deploy-python-web-app-azure-container-apps-02.md), which includes an instance of [Azure Container Registry][9] and a container app in [Azure Container Apps][8].\n\n* A GitHub account where you forked the sample code ([Django][1] or [Flask][2]) and that you can connect to from Azure Container Apps. (If you downloaded the sample code instead of forking, be sure to push your local repo to your GitHub account.)\n\n* Optionally, [Git][14] installed in your development environment to make code changes and push to your repo in GitHub. Alternatively, you can make the changes directly in GitHub.\n\n## Configure continuous deployment for a container\n\nIn the previous tutorial, you created and configured a container app in Azure Container Apps. Part of the configuration was pulling a Docker image from an Azure Container Registry instance. The container image is pulled from the registry when you create a container [revision][5], such as when you first set up the container app.\n\nIn this section, you set up continuous deployment by using a GitHub Actions workflow. With continuous deployment, a new Docker image and container revision are created based on a trigger. The trigger in this tutorial is any change to the *main* branch of your repository, such as with a pull request. When the workflow is triggered, it creates a new Docker image, pushes it to the Azure Container Registry instance, and updates the container app to a new revision by using the new image.\n\n### [Azure CLI](#tab/azure-cli)\n\nYou can run Azure CLI commands in [Azure Cloud Shell][4] or on a workstation where [Azure CLI][7] is installed.\n\nIf you're running commands in a Git Bash shell on a Windows computer, enter the following command before proceeding:\n\n```bash\nexport MSYS_NO_PATHCONV=1\n```\n\n1. Create a [service principal][21] by using the [az ad sp create-for-rbac][10] command:\n\n    ```azurecli\n    az ad sp create-for-rbac \\\n    --name <app-name> \\\n    --role Contributor \\\n    --scopes \"/subscriptions/<subscription-ID>/resourceGroups/<resource-group-name>\"\n    ```\n\n    In the command:\n\n    * *\\<app-name>* is an optional display name for the service principal. If you leave off the `--name` option, a GUID is generated as the display name.\n    * *\\<subscription-ID>* is the GUID that uniquely identifies your subscription in Azure. If you don't know your subscription ID, you can run the [az account show](/cli/azure/account#az-account-show) command and copy it from the `id` property in the output.\n    * *\\<resource-group-name>* is the name of a resource group that contains the Azure Container Apps container. Role-based access control (RBAC) is on the resource group level. If you followed the steps in the previous tutorial, the name of the resource group is `pythoncontainer-rg`.\n\n    Save the output of this command for the next step. In  particular, save the client ID (`appId` property), client secret (`password` property), and tenant ID (`tenant` property).\n\n1. Configure GitHub Actions by using the [az containerapp github-action add][11] command:\n\n    ```azurecli\n    az containerapp github-action add \\\n    --resource-group <resource-group-name> \\\n    --name python-container-app \\\n    --repo-url <https://github.com/userid/repo> \\\n    --branch main \\\n    --registry-url <registry-name>.azurecr.io \\\n    --service-principal-client-id <client-id> \\\n    --service-principal-tenant-id <tenant-id> \\\n    --service-principal-client-secret <client-secret> \\\n    --login-with-github\n    ```\n\n    In the command:\n\n    * *\\<resource-group-name>* is the name of the resource group. In this tutorial, it's `pythoncontainer-rg`.\n    * *\\<https://github.com/userid/repo>* is the URL of your GitHub repository. In this tutorial, it's either `https://github.com/userid/msdocs-python-django-azure-container-apps` or `https://github.com/userid/msdocs-python-flask-azure-container-apps`. In those URLs, `userid` is your GitHub user ID.\n    * *\\<registry-name>* is the existing Azure Container Registry instance that you created in the previous tutorial, or one that you can use.\n    * *\\<client-id>* is the value of the `appId` property from the previous `az ad sp create-for-rbac` command. The ID is a GUID of the form `00000000-0000-0000-0000-00000000`.\n    * *\\<tenant-id>* is the value of the `tenant` property from the previous `az ad sp create-for-rbac` command. The ID is also a GUID that's similar to the client ID.\n    * *\\<client-secret>* is the value of the `password` property from the previous `az ad sp create-for-rbac` command.\n\n### [Azure portal](#tab/azure-portal)\n\n1. In the [Azure portal][3], go to the container app that you want to configure continuous deployment for. On the service menu, select **Continuous deployment**.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/azure-portal-continuous-deployment-signin-github.png\" alt-text=\"Screenshot that shows the continuous deployment resource of a container app in the Azure portal.\" lightbox=\"media/tutorial-container-apps/azure-portal-continuous-deployment-signin-github.png\":::\n\n1. Authorize Azure Container Apps to access your GitHub account:\n\n    1. Select **Sign in with GitHub**.\n    1. In the authorization dialog, select **Authorize AzureAppService**.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/azure-portal-continuous-deployment-authorize-github.png\" alt-text=\"Screenshot that shows the dialog for authorizing Azure Container Apps to access a repo in the Azure portal.\" lightbox=\"media/tutorial-container-apps/azure-portal-continuous-deployment-authorize-github.png\":::\n\n    > [!TIP]\n    > You can revoke Container Apps access to the GitHub account from your account's security section.\n\n1. Configure the details of the continuous deployment:\n\n    * **Organization**: Use your GitHub username.\n    * **Repository**: Select the fork of the sample app. (If you originally downloaded the sample code to your developer environment, push the repo to GitHub.)\n    * **Branch**: Select **main**.\n    * **Repository source**: Select **Azure Container Registry**.\n    * **Registry**: Select the Azure Container Registry instance that you created in the previous tutorial.\n    * **Image**: Select the Docker image name. In this tutorial, it's **python-container-app**.\n    * **Service principal**: Leave **Create new** and let the creation process create a new service principal.\n\n    Select **Start continuous deployment** to finish the configuration.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/azure-portal-continuous-deployment-configuration.png\" alt-text=\"Screenshot that shows the configuration of an Azure container app in the Azure portal.\" lightbox=\"media/tutorial-container-apps/azure-portal-continuous-deployment-configuration.png\":::\n\n1. Review the information about the continuous deployment.\n\n    The information includes a link to the created GitHub Actions workflow file. Azure Container Apps checked in the file to your repo.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/azure-portal-continuous-deployment-configuration-finish.png\" alt-text=\"Screenshot that shows an Azure container app configured for continuous deployment with GitHub Actions.\" lightbox=\"media/tutorial-container-apps/azure-portal-continuous-deployment-configuration-finish.png\":::\n\n---\n\nIn the configuration of continuous deployment, a [service principal][21] enables GitHub Actions to access and modify Azure resources. The roles assigned to the service principal restrict access to resources. The service principal was assigned the built-in [Contributor][12] role on the resource group that contains the container app.\n\nIf you followed the steps for the portal, the service principal was automatically created for you. If you followed the steps for the Azure CLI, you explicitly created the service principal before you configured continuous deployment.\n\n## Redeploy the web app with GitHub Actions\n\nIn this section, you make a change to your forked copy of the sample repository. After that, you can confirm that the change is automatically deployed to the website.\n\nIf you haven't already, make a [fork][13] of the sample repository ([Django][1] or [Flask][2]). You can make your code change directly in [GitHub][17] or in your development environment from a command line with [Git][14].\n\n### [GitHub](#tab/git-github)\n\n1. Go to your fork of the sample repository and start in the *main* branch.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/github-view-repo.png\" alt-text=\"Screenshot that shows the main branch in a fork of the sample repo.\" lightbox=\"media/tutorial-container-apps/github-view-repo.png\":::\n\n1. Make a change:\n\n    1. Go to the */templates/base.html* file. (For Django, the path is *restaurant_review/templates/restaurant_review/base.html*.)\n    1. Select **Edit** and change the phrase `Azure Restaurant Review` to `Azure Restaurant Review - Redeployed`.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/github-edit-file.png\" alt-text=\"Screenshot that shows how to make a change in a template file in the fork of the sample repo.\" lightbox=\"media/tutorial-container-apps/github-edit-file.png\":::\n\n1. On the bottom of the page you're editing, make sure that **Commit directly to the main branch** is selected. Then select the **Commit changes** button.\n\n    :::image type=\"content\" source=\"media/tutorial-container-apps/github-commit-change.png\" alt-text=\"Screenshot that shows selections for committing a change in a template file in the fork of the sample repo.\" lightbox=\"media/tutorial-container-apps/github-commit-change.png\":::\n\nThe commit kicks off the GitHub Actions workflow.\n\n### [Command line](#tab/git-commandline)\n\nIf you haven't already, use `git clone` to pull your forked repository to your development environment and change directory to the repository. Then take the following steps:\n\n1. Start in *main*:\n\n    ```console\n    git checkout main\n    git pull\n    ```\n\n1. Make a change.\n\n    Go to the *./templates/base.html* file (*./restaurant_review/templates/restaurant_review/base.html* for Django) and change the phrase `Azure Restaurant Review` to `Azure Restaurant Review - Redeployed`.\n\n1. Commit and push the change to GitHub:\n\n    ```console\n    git commit -a -m \"Redeploy with title change.\"\n    git push\n    ```\n\nThe first time that you use Git, you might need to set the global variables `user.name` and `user.email`. For more information, see the [help for git-config][16].\n\nThe push of changes to the *main* branch kicks off the GitHub Actions workflow.\n\n---\n\n> [!NOTE]\n> This tutorial shows making a change directly in the *main* branch. In typical software workflows, you make a change in a branch other than *main* and then create a pull request to merge the change into *main*. Pull requests also kick off the workflow.\n\n## Understand GitHub Actions\n\n### Viewing workflow history\n\nIf you need to view the workflow history, use one of the following procedures.\n\n### [GitHub](#tab/git-github)\n\nOn [GitHub][17], go to your fork of the sample repository and open the **Actions** tab.\n\n:::image type=\"content\" source=\"media/tutorial-container-apps/github-check-action.png\" alt-text=\"Screenshot that shows workflows on the Actions tab for a repo.\" lightbox=\"media/tutorial-container-apps/github-check-action.png\":::\n\n### [Command line](#tab/git-commandline)\n\nThese steps use the [GitHub CLI][18].\n\n1. Get a summary of your workflow. Run the following command in folder that contains your clone:\n\n    ```console\n    gh workflow view\n    ```\n\n    This command prompts you to select a workflow and then gives an overview of recent runs of that workflow.\n\n    > [!NOTE]\n    > The first time that you use `gh`, you might be prompted to authenticate. Follow the GitHub CLI prompts to authenticate.\n    >\n    > If you have more than one remote configured, you might be asked to run `gh repo set-default` to select a default remote repository. Select your fork from the presented options.\n    >\n    > You can run the `gh workflow view` command from any folder without the need to set a default repository by adding the `--repo [HOST/]OWNER/REPO` parameter.\n\n1. Go to GitHub for details of a workflow run:\n\n    ```console\n    gh workflow view --web\n    ```\n\n---\n\n### Workflow secrets\n\nThe *.github/workflows/\\<workflow-name>.yml* workflow file that was added to the repo includes placeholders for credentials that are needed for the build and container app update jobs of the workflow. The credential information is stored encrypted in the repository's **Settings** area, under **Security** > **Secrets and variables** > **Actions**.\n\n:::image type=\"content\" source=\"media/tutorial-container-apps/github-repo-action-secrets.png\" alt-text=\"Screenshot that shows credentials as GitHub Actions secrets.\" lightbox=\"media/tutorial-container-apps/github-repo-action-secrets.png\":::\n\nIf credential information changes, you can update it here. For example, if the Azure Container Registry passwords are regenerated, you need to update the `REGISTRY_PASSWORD` value. For more information, see [Encrypted secrets][19] in the GitHub documentation.\n\n### OAuth authorized apps\n\nWhen you set up continuous deployment, you designate Azure Container Apps as an authorized OAuth app for your GitHub account. Container Apps uses the authorized access to create a GitHub Actions YAML file in *.github/workflows/\\<workflow-name>.yml*. You can view your authorized apps, and revoke permissions in your account, under **Integrations** > **Applications**.\n\n:::image type=\"content\" source=\"media/tutorial-container-apps/github-authorized-oauth-apps.png\" alt-text=\"Screenshot that shows the location of authorized apps for a user in GitHub.\" lightbox=\"media/tutorial-container-apps/github-authorized-oauth-apps.png\":::\n\n## Troubleshoot\n\n### You get errors while setting up a service principal via the Azure CLI\n\nThis section can help you troubleshoot errors that you get while setting up a service principal by using the Azure CLI `az ad sp create-for-rba` command.\n\nIf you get an error that contains \"InvalidSchema: No connection adapters were found\":\n\n* Check the shell that you're running in. If you're using a Bash shell, set the `MSYS_NO_PATHCONV` variables as `export MSYS_NO_PATHCONV=1`.\n\n  For more information, see the GitHub issue [Unable to create service principal with Azure CLI from Git Bash shell][15].\n\nIf you get an error that contains \"More than one application have the same display name\":\n\n* The name is already taken for the service principal. Choose another name, or leave off the `--name` argument. A GUID will be automatically generated as a display name.\n\n### GitHub Actions workflow failed\n\nTo check a workflow's status, go to the **Actions** tab of the repo:\n\n* If there's a failed workflow, drill into the workflow file. There should be two jobs: build and deploy. For a failed job, check the output of the job's tasks to look for problems.\n* If there's an error message that contains \"TLS handshake timeout,\" run the workflow manually. In the repo, on the **Actions** tab, select **Trigger auto deployment** to see if the timeout is a temporary issue.\n* If you set up continuous deployment for the container app as shown in this tutorial, the workflow file (*.github/workflows/\\<workflow-name>.yml*) is created automatically for you. You shouldn't need to modify this file for this tutorial. If you did, revert your changes and try the workflow.\n\n### Website doesn't show changes that you merged in the main branch\n\nIn GitHub:\n\n* Check that the GitHub Actions workflow ran and that you checked the change into the branch that triggers the workflow.\n\nIn the Azure portal:\n\n* Check the Azure Container Registry instance to see if a new Docker image was created with a time stamp after your change to the branch.\n* Check the logs of the container app to see if there's a programming error:\n\n  1. Go to the container app, and then go to **Revision Management** > *\\<active container>* > **Revision details** > **Console logs**.\n  1. Choose the order of the columns to show **Time Generated**, **Stream_s**, and **Log_s**.\n  1. Sort the logs by most recent and look for Python `stderr` and `stdout` messages in the **Stream_s** column. Python `print` output is `stdout` messages.\n\nIn the Azure CLI:\n\n* Use the [az containerapp logs show][26] command.\n\n### You want to stop continuous deployment\n\nStopping continuous deployment means disconnecting your container app from your repo.\n\nIn the Azure portal:\n\n* Go to the container app. On the service menu, select **Continuous deployment**, and then select **Disconnect**.\n\nIn the Azure CLI:\n\n* Use the [az container app github-action remove][6] command.\n\nAfter you disconnect:\n\n* The *.github/workflows/\\<workflow-name>.yml* file is removed from your repo.\n* Secret keys aren't removed from the repo.\n* Azure Container Apps remains as an authorized OAuth app for your GitHub account.\n* In Azure, the container is left with the last deployed container. You can reconnect the container app with the Azure Container Registry instance, so that new container revisions pick up the latest image.\n* In Azure, service principals that you created and used for continuous deployment aren't deleted.\n\n## Remove resources\n\nIf you're done with the tutorial series and you don't want to incur extra costs, remove the resources that you used.\n\nRemoving a resource group removes all resources in the group and is the fastest way to remove resources. For an example of how to remove resource groups, see [Containerize tutorial cleanup][25].\n\n## Related content\n\nIf you plan to build on this tutorial, here are some next steps that you can take:\n\n* [Set scaling rules in Azure Container Apps][22]\n* [Bind custom domain names and certificates in Azure Container Apps][23]\n* [Monitor an app in Azure Container Apps][24]\n\n[1]: https://github.com/Azure-Samples/msdocs-python-django-azure-container-apps\n[2]: https://github.com/Azure-Samples/msdocs-python-flask-azure-container-apps\n[3]: https://portal.azure.com/\n[4]: https://shell.azure.com/\n[5]: /azure/container-apps/revisions\n[6]: /cli/azure/containerapp/github-action#az-containerapp-github-action-delete\n[7]: /cli/azure/install-azure-cli\n[8]: /azure/container-apps/overview\n[9]: /azure/container-registry/container-registry-intro\n[10]: /cli/azure/ad/sp#az-ad-sp-create-for-rbac\n[11]: /cli/azure/containerapp/github-action#az-containerapp-github-action-add\n[12]: /azure/role-based-access-control/built-in-roles#general\n[13]: /azure/devops/repos/git/forks\n[14]: https://git-scm.com/\n[15]: https://github.com/Azure/azure-cli/issues/16317\n[16]: https://git-scm.com/docs/git-config\n[17]: https://github.com/\n[18]: https://cli.github.com/\n[19]: https://docs.github.com/actions/security-guides/encrypted-secrets\n[20]: ../github/github-actions.md\n[21]: /azure/active-directory/fundamentals/service-accounts-principal\n[22]: /azure/container-apps/scale-app\n[23]: /azure/container-apps/custom-domains-certificates\n[24]: /azure/container-apps/monitor\n[25]: ./tutorial-containerize-deploy-python-web-app-azure-05.md\n[26]: /cli/azure/containerapp/logs#az-containerapp-logs-show\n"
  },
  {
    "path": "articles/python/tutorial-python-managed-identity-cli.md",
    "content": "---\ntitle: Create and deploy a Flask Python web app to Azure with system-assigned managed identity\ndescription: Use the Azure CLI to create and deploy a Flask Python web app to Azure App Service using a system-assigned managed identity.\nms.devlang: python\nms.topic: tutorial\nms.date: 11/10/2025\nms.custom: devx-track-python, devx-track-azurecli\n---\n\n# Create and deploy a Flask Python web app to Azure with system-assigned managed identity\n\nIn this tutorial, you deploy Python **[Flask](https://flask.palletsprojects.com/)** code to create and deploy a web app running in Azure App Service. The web app uses its system-assigned **[managed identity](/azure/active-directory/managed-identities-azure-resources/overview)** (passwordless connections) with Azure role-based access control to access [Azure Storage](/azure/storage/common/storage-introduction) and [Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server) resources. The code uses the [DefaultAzureCredential](/azure/developer/intro/passwordless-overview#introducing-defaultazurecredential) class of the [Azure Identity client library](/python/api/overview/azure/identity-readme) for Python. The `DefaultAzureCredential` class automatically detects that a managed identity exists for the App Service and uses it to access other Azure resources.\n\nYou can configure passwordless connections to Azure services using Service Connector or you can configure them manually. This tutorial shows how to use Service Connector. For more information about passwordless connections, see [Passwordless connections for Azure services](/azure/developer/intro/passwordless-overview). For information about Service Connector, see the [Service Connector documentation](/azure/service-connector/overview).\n\nThis tutorial demonstrates how to create and deploy a Python web app using the Azure CLI. Run the commands in this tutorial in any Bash environment with the Azure CLI installed, such as your local environment or the [Azure Cloud Shell](https://shell.azure.com). \n\nFor examples of using a user-assigned managed identity, see [Create and deploy a Django web app to Azure with a user-assigned managed identity](./tutorial-python-managed-identity-user-assigned-cli.md).\n\n## Get the sample app\n\nA sample Python application using the Flask framework are available to help you follow along with this tutorial. Download or clone one of the sample applications to your local workstation.\n\n1. Clone the sample in an Azure Cloud Shell session.\n\n    ```console\n    git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git\n    ```\n\n2. Navigate to the application folder.\n\n    ```console\n    cd msdocs-flask-web-app-managed-identity\n    ```\n\n## Examine authentication code\n\nThe sample web app needs to authenticate to two different data stores:\n\n- Azure blob storage server where it stores and retrieves photos submitted by reviewers.\n- An Azure Database for PostgreSQL - Flexible Server database where it stores restaurants and reviews.\n\nIt uses [DefaultAzureCredential](/python/api/azure-identity/azure.identity.defaultazurecredential) to authenticate to both data stores. With `DefaultAzureCredential`, the app can be configured to run under the identity of different service principals, depending on the environment it's running in, without making changes to code. For example, in a local development environment, the app can run under the identity of the developer signed in to the Azure CLI, while in Azure, as in this tutorial, it can run under its system-assigned managed identity.\n\nIn either case, the security principal that the app runs under must have a role on each Azure resource the app uses that permits it to perform the actions on the resource that the app requires. In this tutorial, you use service connectors to automatically enable the system-assigned managed identity on your app in Azure and to assign that identity appropriate roles on your Azure storage account and Azure Database for PostgreSQL server.\n\nAfter the system-assigned managed identity is enabled and is assigned appropriate roles on the data stores, you can use `DefaultAzureCredential` to authenticate with the required Azure resources.\n\nThe following code is used to create a blob storage client to upload photos in `app.py`. An instance of `DefaultAzureCredential` is supplied to the client, which it uses to acquire access tokens to perform operations against Azure storage.\n\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom azure.storage.blob import BlobServiceClient\n\nazure_credential = DefaultAzureCredential()\nblob_service_client = BlobServiceClient(\n    account_url=account_url,\n    credential=azure_credential)\n```\n\nAn instance of `DefaultAzureCredential` is also used to get an access token for Azure Database for PostgreSQL in `./azureproject/get_conn.py`. In this case, the token is acquired directly by calling [get_token](/python/api/azure-identity/azure.identity.defaultazurecredential#azure-identity-defaultazurecredential-get-token) on the credential instance and passing it the appropriate `scope` value. The token is then used in the place of the password in the PostgreSQL connection URI returned to the caller.\n\n```python\nazure_credential = DefaultAzureCredential()\ntoken = azure_credential.get_token(\"https://ossrdbms-aad.database.windows.net\")\nconn = str(current_app.config.get('DATABASE_URI')).replace('PASSWORDORTOKEN', token.token)\n```\n\nTo learn more about authenticating your apps with Azure services, see [Authenticate Python apps to Azure services by using the Azure SDK for Python](./sdk/authentication/overview.md). To learn more about `DefaultAzureCredential`, including how to customize the credential chain it evaluates for your environment, see [DefaultAzureCredential overview](./sdk/authentication/credential-chains.md#defaultazurecredential-overview).\n\n## Create an Azure PostgreSQL server\n\n1. Set up the environment variables needed for the tutorial.\n\n      ```bash\n      LOCATION=\"eastus\"\n      RAND_ID=$RANDOM\n      RESOURCE_GROUP_NAME=\"msdocs-mi-web-app\"\n      APP_SERVICE_NAME=\"msdocs-mi-web-$RAND_ID\"\n      DB_SERVER_NAME=\"msdocs-mi-postgres-$RAND_ID\"\n      ADMIN_USER=\"demoadmin\"\n      ADMIN_PW=\"ChAnG33#ThsPssWD$RAND_ID\"\n      ```\n\n    > [!IMPORTANT]\n    >The `ADMIN_PW` must contain 8 to 128 characters from three of the following categories: English uppercase letters, English lowercase letters, numbers, and nonalphanumeric characters. When creating usernames or passwords **do not** use the `$` character. Later you create environment variables with these values where the `$` character has special meaning within the Linux container used to run Python apps.\n\n1. Create a resource group with the [az group create](/cli/azure/group#az-group-create) command.\n\n      ```azurecli\n      az group create --location $LOCATION --name $RESOURCE_GROUP_NAME\n      ```\n\n1. Create a PostgreSQL server with the [az postgres flexible-server create](/cli/azure/postgres/flexible-server#az-postgres-flexible-server-create) command. (This and subsequent commands use the line continuation character for Bash Shell ('\\\\'). Change the line continuation character for your shell if needed.)\n\n    ```azurecli\n    az postgres flexible-server create \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --name $DB_SERVER_NAME \\\n      --location $LOCATION \\\n      --admin-user $ADMIN_USER \\\n      --admin-password $ADMIN_PW \\\n      --sku-name Standard_D2ds_v4\n    ```\n\n    The *sku-name* is the name of the pricing tier and compute configuration. For more information, see [Azure Database for PostgreSQL pricing](https://azure.microsoft.com/pricing/details/postgresql/flexible-server/). To list available SKUs, use `az postgres flexible-server list-skus --location $LOCATION`.\n\n1. Create a database named `restaurant` using the [az postgres flexible-server execute](/cli/azure/postgres/flexible-server#az-postgres-flexible-server-execute) command.\n\n    ```azurecli\n    az postgres flexible-server execute \\\n      --name $DB_SERVER_NAME \\\n      --admin-user $ADMIN_USER \\\n      --admin-password $ADMIN_PW \\\n      --database-name postgres \\\n      --querytext 'create database restaurant;'\n    ```\n\n## Create an Azure App Service and deploy the code\n\n1. Create an app service using the [az webapp up](/cli/azure/webapp#az-webapp-up) command.\n\n    ```azurecli\n    az webapp up \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --name $APP_SERVICE_NAME \\\n      --runtime PYTHON:3.9 \\\n      --sku B1\n    ```\n\n    The *sku* defines the size (CPU, memory) and cost of the app service plan. The B1 (Basic) service plan incurs a small cost in your Azure subscription. For a full list of App Service plans, view the [App Service pricing](https://azure.microsoft.com/pricing/details/app-service/linux/) page.\n\n1. Configure App Service to use the *start.sh* in the repo with the [az webapp config set](/cli/azure/webapp/config#az-webapp-config-set) command.\n\n    ```azurecli\n    az webapp config set \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --name $APP_SERVICE_NAME \\\n      --startup-file \"start.sh\"\n    ```\n\n## Create passwordless connectors to Azure resources\n\nThe Service Connector commands configure Azure Storage and Azure Database for PostgreSQL resources to use managed identity and Azure role-based access control. The commands create app settings in the App Service that connect your web app to these resources. The output from the commands lists the service connector actions taken to enable passwordless capability.\n\n1. Add a PostgreSQL service connector with the [az webapp connection create postgres-flexible](/cli/azure/webapp/connection/create#az-webapp-connection-create-postgres-flexible) command. The system-assigned managed identity is used to authenticate the web app to the target resource, PostgreSQL in this case.\n\n    ```azurecli\n    az webapp connection create postgres-flexible \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --name $APP_SERVICE_NAME \\\n      --target-resource-group $RESOURCE_GROUP_NAME \\\n      --server $DB_SERVER_NAME \\\n      --database restaurant \\\n      --client-type python \\\n      --system-identity\n    ```\n\n1. Add a storage service connector with the [az webapp connection create storage-blob](/cli/azure/webapp/connection/create#az-webapp-connection-create-storage-blob) command.\n\n    This command also adds a storage account and adds the web app with role *Storage Blob Data Contributor* to the storage account.\n\n    ```azurecli\n    STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \\\n      --new true \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --name $APP_SERVICE_NAME \\\n      --target-resource-group $RESOURCE_GROUP_NAME \\\n      --client-type python \\\n      --system-identity \\\n      --query configurations[].value \\\n      --output tsv)\n    STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))\n    ```\n\n## Create a container in the storage account\n\nThe sample Python app stores photos submitted by reviewers as blobs in a container in your storage account.\n\n* When a user submits a photo with their review, the sample app writes the image to the container using its system-assigned managed identity for authentication and authorization. You configured this functionality in the last section.\n\n* When a user views the reviews for a restaurant, the app returns a link to the photo in blob storage for each review that has one associated with it. For the browser to display the photo, it must be able to access it in your storage account. The blob data must be available for read publicly through anonymous (unauthenticated) access.\n\nTo enhance security, storage accounts are created with anonymous access to blob data disabled by default. In this section, you enable anonymous read access on your storage account and then create a container named *photos* that provides public (anonymous) access to its blobs.\n\n1. Update the storage account to allow anonymous read access to blobs with the [az storage account update](/cli/azure/storage/container#az-storage-account-update) command.\n\n    ```azurecli\n    az storage account update \\\n      --name $STORAGE_ACCOUNT_NAME \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --allow-blob-public-access true\n    ```\n\n    Enabling anonymous access on the storage account doesn't affect access for individual blobs. You must explicitly enable public access to blobs at the container-level.\n\n1. Create a container called *photos* in the storage account with the [az storage container create](/cli/azure/storage/container#az-storage-container-create) command. Allow anonymous read (public) access to blobs in the newly created container.\n\n    ```azurecli\n    az storage container create \\\n      --account-name $STORAGE_ACCOUNT_NAME \\\n      --name photos \\\n      --public-access blob \\\n      --account-key $(az storage account keys list --account-name $STORAGE_ACCOUNT_NAME \\\n          --query [0].value --output tsv) \n    ```\n\n    > [!NOTE]\n    > For brevity, this command uses the storage account key to authorize with the storage account. For most scenarios, Microsoft's recommended approach is to use Microsoft Entra ID and Azure role-based access control (Azure RBAC) roles. For a quick set of instructions, see [Quickstart: Create, download, and list blobs with Azure CLI](/azure/storage/blobs/storage-quickstart-blobs-cli#create-a-container). Several Azure roles permit you to create containers in a storage account, including **Owner**, **Contributor**, **Storage Blob Data Owner**, and **Storage Blob Data Contributor**.\n\nTo learn more about anonymous read access to blob data, see [Configure anonymous read access for containers and blobs](/azure/storage/blobs/anonymous-read-access-configure).\n\n## Test the Python web app in Azure\n\nThe sample Python app uses the [azure.identity](https://pypi.org/project/azure-identity/) package and its `DefaultAzureCredential` class. When the app is running in Azure, `DefaultAzureCredential` automatically detects if a managed identity exists for the App Service and, if so, uses it to access other Azure resources (storage and PostgreSQL in this case). There's no need to provide storage keys, certificates, or credentials to the App Service to access these resources.\n\n1. Browse to the deployed application at the URL `http://$APP_SERVICE_NAME.azurewebsites.net`.\n\n    It can take a minute or two for the app to start. If you see a default app page that isn't the default sample app page, wait a minute and refresh the browser.\n\n2. Test the functionality of the sample app by adding a restaurant and some reviews with photos for the restaurant.\n\n    The restaurant and review information is stored in Azure Database for PostgreSQL and the photos are stored in Azure Storage. Here's an example screenshot:\n\n    :::image type=\"content\" source=\"./media/python-managed-identity/example-of-review-sample-app-production-deployed-small.png\" lightbox=\"./media/python-managed-identity/example-of-review-sample-app-production-deployed.png\" alt-text=\"Screenshot of the sample app showing restaurant review functionality using Azure App Service, Azure PostgreSQL Database, and Azure Storage.\" :::\n\n## Clean up\n\nIn this tutorial, all the Azure resources were created in the same resource group. Removing the resource group removes with the [az group delete](/cli/azure/group#az-group-delete) command removes all resources in the resource group and is the fastest way to remove all Azure resources used for your app.\n\n```azurecli\naz group delete  --name $RESOURCE_GROUP_NAME \n```\n\nYou can optionally add the `--no-wait` argument to allow the command to return before the operation is complete.\n\n## Next steps\n\n* [Create and deploy a Django web app to Azure with a user-assigned managed identity](./tutorial-python-managed-identity-user-assigned-cli.md)\n\n* [Deploy a Python (Django or Flask) web app with PostgreSQL in Azure App Service](/azure/app-service/tutorial-python-postgresql-app)\n"
  },
  {
    "path": "articles/python/tutorial-python-managed-identity-user-assigned-cli.md",
    "content": "---\ntitle: Create and deploy a Django web app to Azure with user-assigned managed identity\ndescription: Use the Azure CLI to create and deploy a Django web app to Azure App Service using a user-assigned managed identity.\nms.devlang: python\nms.topic: tutorial\nauthor: bobtabor-msft\nms.author: rotabor\nms.date: 11/10/2025\nms.custom: devx-track-python, devx-track-azurecli\n---\n\n# Create and deploy a Django web app to Azure with a user-assigned managed identity\n\nIn this tutorial, you deploy a **[Django](https://www.djangoproject.com/)** web app to Azure App Service. The web app uses a user-assigned **[managed identity](/azure/active-directory/managed-identities-azure-resources/overview)** (passwordless connections) with Azure role-based access control to access [Azure Storage](/azure/storage/common/storage-introduction) and [Azure Database for PostgreSQL - Flexible Server](/azure/postgresql/flexible-server) resources. The code uses the [DefaultAzureCredential](/azure/developer/intro/passwordless-overview#introducing-defaultazurecredential) class of the [Azure Identity client library](/python/api/overview/azure/identity-readme) for Python. The `DefaultAzureCredential` class automatically detects that a managed identity exists for the App Service and uses it to access other Azure resources.\n\nIn this tutorial, you create a user-assigned managed identity and assign it to the App Service so that it can access the database and storage account resources. For an example of using a system-assigned managed identity, see [Create and deploy a Flask Python web app to Azure with system-assigned managed identity](./tutorial-python-managed-identity-cli.md). User-assigned managed identities are recommended because they can be used by multiple resources, and their life cycles are decoupled from the resource life cycles with which they're associated. For more information about best practices for using managed identities, see [Managed identity best practice recommendations](/azure/active-directory/managed-identities-azure-resources/managed-identity-best-practice-recommendations).\n\nThis tutorial shows you how to deploy the Python web app and create Azure resources using the [Azure CLI](/cli/azure/what-is-azure-cli). While the commands in this tutorial use the Bash shell, you can run the tutorial commands in any Bash environment with the CLI installed, such as your local environment or the [Azure Cloud Shell](https://shell.azure.com). With some modification you can run these commands in other environments like Windows command shell (ex. modifying syntax to set and use environment variables).\n\n## Get the sample app\n\nUse the sample Django sample application to follow along with this tutorial. Download or clone the sample application to your development environment.\n\n1. Clone the sample.\n\n    ```console\n    git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git\n    ```\n\n2. Navigate to the application folder.\n\n    ```console\n    cd msdocs-django-web-app-managed-identity\n    ```\n\n## Examine authentication code\n\nThe sample web app needs to authenticate to two different data stores:\n\n- Azure blob storage server where it stores and retrieves photos submitted by reviewers.\n- An Azure Database for PostgreSQL - Flexible Server database where it stores restaurants and reviews.\n\nIt uses [DefaultAzureCredential](/python/api/azure-identity/azure.identity.defaultazurecredential) to authenticate to both data stores. With `DefaultAzureCredential`, the app can be configured to run under the identity of different service principals, depending on the environment it's running in, without making changes to code. For example, in a local development environment, the app can run under the identity of the developer signed in to the Azure CLI, while in Azure, as in this tutorial, it can run under a user-assigned managed identity.\n\nIn either case, the security principal that the app runs under must have a role on each Azure resource the app uses that permits it to perform the actions on the resource that the app requires. In this tutorial, you use Azure CLI commands to create a user-assigned managed identity and assign it to your app in Azure. You then manually assign that identity appropriate roles on your Azure storage account and Azure Database for PostgreSQL server. Finally, you set the `AZURE_CLIENT_ID` environment variable for your app in Azure to configure `DefaultAzureCredential` to use the managed identity.\n\nAfter the user-assigned managed identity is configured on your app and its runtime environment, and is assigned appropriate roles on the data stores, you can use `DefaultAzureCredential` to authenticate with the required Azure resources.\n\nThe following code is used to create a blob storage client to upload photos in `./restaurant_review/views.py`. An instance of `DefaultAzureCredential` is supplied to the client, which it uses to acquire access tokens to perform operations against Azure storage.\n\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom azure.storage.blob import BlobServiceClient\n\nazure_credential = DefaultAzureCredential()\nblob_service_client = BlobServiceClient(\n    account_url=account_url,\n    credential=azure_credential)\n```\n\nAn instance of `DefaultAzureCredential` is also used to get an access token for Azure Database for PostgreSQL in `./azureproject/get_conn.py`. In this case, the token is acquired directly by calling [get_token](/python/api/azure-identity/azure.identity.defaultazurecredential#azure-identity-defaultazurecredential-get-token) on the credential instance and passing it the appropriate `scope` value. The token is then used to set the password in the PostgreSQL connection URI.\n\n```python\nazure_credential = DefaultAzureCredential()\ntoken = azure_credential.get_token(\"https://ossrdbms-aad.database.windows.net\")\nconf.settings.DATABASES['default']['PASSWORD'] = token.token\n```\n\nTo learn more about authenticating your apps with Azure services, see [Authenticate Python apps to Azure services by using the Azure SDK for Python](./sdk/authentication/overview.md). To learn more about `DefaultAzureCredential`, including how to customize the credential chain it evaluates for your environment, see [DefaultAzureCredential overview](./sdk/authentication/credential-chains.md#defaultazurecredential-overview).\n\n## Create an Azure PostgreSQL flexible server\n\n1. Set up the environment variables needed for the tutorial.\n\n      ```bash\n      LOCATION=\"eastus\"\n      RAND_ID=$RANDOM\n      RESOURCE_GROUP_NAME=\"msdocs-mi-web-app\"\n      APP_SERVICE_NAME=\"msdocs-mi-web-$RAND_ID\"\n      DB_SERVER_NAME=\"msdocs-mi-postgres-$RAND_ID\"\n      ADMIN_USER=\"demoadmin\"\n      ADMIN_PW=\"ChAnG33#ThsPssWD$RAND_ID\"\n      UA_NAME=\"UAManagedIdentityPythonTest$RAND_ID\"\n      ```\n\n    > [!IMPORTANT]\n    >The `ADMIN_PW` must contain 8 to 128 characters from three of the following categories: English uppercase letters, English lowercase letters, numbers, and nonalphanumeric characters. When creating usernames or passwords **do not** use the `$` character. Later you create environment variables with these values where the `$` character has special meaning within the Linux container used to run Python apps.\n\n1. Create a resource group with the [az group create](/cli/azure/group#az-group-create) command.\n\n      ```azurecli\n      az group create --location $LOCATION --name $RESOURCE_GROUP_NAME\n      ```\n\n1. Create a PostgreSQL flexible server with the [az postgres flexible-server create](/cli/azure/postgres/flexible-server#az-postgres-flexible-server-create) command. (This and subsequent commands use the line continuation character for Bash Shell ('\\\\'). Change the line continuation character for other shells.)\n\n    ```azurecli\n    az postgres flexible-server create \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --name $DB_SERVER_NAME \\\n      --location $LOCATION \\\n      --admin-user $ADMIN_USER \\\n      --admin-password $ADMIN_PW \\\n      --sku-name Standard_D2ds_v4 \\\n      --active-directory-auth Enabled \\\n      --public-access 0.0.0.0\n    ```\n\n    The *sku-name* is the name of the pricing tier and compute configuration. For more information, see [Azure Database for PostgreSQL pricing](https://azure.microsoft.com/pricing/details/postgresql/flexible-server/). To list available SKUs, use `az postgres flexible-server list-skus --location $LOCATION`.\n\n1. Add your Azure account as a Microsoft Entra admin for the server with the [az postgres flexible-server ad-admin create](/cli/azure/postgres/flexible-server/ad-admin#az-postgres-flexible-server-ad-admin-create) command.\n\n    ```azurecli\n    ACCOUNT_EMAIL=$(az ad signed-in-user show --query userPrincipalName --output tsv)\n    ACCOUNT_ID=$(az ad signed-in-user show --query id --output tsv)\n    echo $ACCOUNT_EMAIL, $ACCOUNT_ID\n    az postgres flexible-server ad-admin create \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --server-name $DB_SERVER_NAME \\\n      --display-name $ACCOUNT_EMAIL \\\n      --object-id $ACCOUNT_ID \\\n      --type User\n    ```\n\n1. Configure a firewall rule on your server with the [az postgres flexible-server firewall-rule create](/cli/azure/postgres/flexible-server/firewall-rule) command. This rule allows your local environment access to connect to the server. (If you're using the Azure Cloud Shell, you can skip this step.)\n\n    ```azurecli\n    IP_ADDRESS=<your IP>\n    az postgres flexible-server firewall-rule create \\\n       --resource-group $RESOURCE_GROUP_NAME \\\n       --name $DB_SERVER_NAME \\\n       --rule-name AllowMyIP \\\n       --start-ip-address $IP_ADDRESS \\\n       --end-ip-address $IP_ADDRESS\n    ```\n\n    Use any tool or website that shows your IP address to substitute `<your IP>` in the command. For example, you can use the [What's My IP Address?](https://www.whatismyip.com/) website.\n\n1. Create a database named `restaurant` using the [az postgres flexible-server execute](/cli/azure/postgres/flexible-server#az-postgres-flexible-server-execute) command.\n\n    ```azurecli\n    az postgres flexible-server execute \\\n      --name $DB_SERVER_NAME \\\n      --admin-user $ADMIN_USER \\\n      --admin-password $ADMIN_PW \\\n      --database-name postgres \\\n      --querytext 'create database restaurant;'\n    ```\n\n## Create an Azure App Service and deploy the code\n\nTo create an App Service and deploy the code, run these commands in the root folder of the sample app.\n\n1. Create an app service using the [az webapp up](/cli/azure/webapp#az-webapp-up) command.\n\n    ```azurecli\n    az webapp up \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --location $LOCATION \\\n      --name $APP_SERVICE_NAME \\\n      --runtime PYTHON:3.9 \\\n      --sku B1\n    ```\n\n    The *sku* defines the size (CPU, memory) and cost of the App Service plan. The B1 (Basic) service plan incurs a small cost in your Azure subscription. For a full list of App Service plans, view the [App Service pricing](https://azure.microsoft.com/pricing/details/app-service/linux/) page.\n\n1. Configure App Service to use the *start.sh* in the sample repo with the [az webapp config set](/cli/azure/webapp/config#az-webapp-config-set) command.\n\n    ```azurecli\n    az webapp config set \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --name $APP_SERVICE_NAME \\\n      --startup-file \"start.sh\"\n    ```\n\n## Create a storage account and container\n\nThe sample app stores photos submitted by reviewers as blobs in Azure Storage.\n\n* When a user submits a photo with their review, the sample app writes the image to the container using managed identity and `DefaultAzureCredential` to access the storage account.\n\n* When a user views the reviews for a restaurant, the app returns a link to the photo in blob storage for each review that has one associated with it. For the browser to display the photo, it must be able to access it in your storage account. The blob data must be available for read publicly through anonymous (unauthenticated) access.\n\nIn this section, you create a storage account and container that permits public read access to blobs in the container. In later sections, you create a user-assigned managed identity and configure it to write blobs to the storage account.\n\n1. Use the [az storage create](/cli/azure/storage#az-storage-create) command to create a storage account.\n\n    ```azurecli\n    STORAGE_ACCOUNT_NAME=\"msdocsstorage$RAND_ID\"\n    az storage account create \\\n      --name $STORAGE_ACCOUNT_NAME \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --location $LOCATION \\\n      --sku Standard_LRS \\\n      --allow-blob-public-access true\n    ```\n\n1. Create a container called *photos* in the storage account with the [az storage container create](/cli/azure/storage/container#az-storage-container-create) command.\n\n    ```azurecli\n    az storage container create \\\n      --account-name $STORAGE_ACCOUNT_NAME \\\n      --name photos \\\n      --public-access blob \\\n      --auth-mode login\n    ```\n\n    > [!NOTE]\n    > It's possible that the command fails. For example, you might get an error indicating that network rules are blocking the request to create the storage account. If the command fails, enter the following command to make sure to assign an Azure role with the permission to create containers to your Azure user account.\n    >\n    > ```azurecli\n    > az role assignment create --role \"Storage Blob Data Contributor\" --assignee $ACCOUNT_EMAIL --scope \"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME\"\n    > ```\n    >\n    > For more information, see [Quickstart: Create, download, and list blobs with Azure CLI](/azure/storage/blobs/storage-quickstart-blobs-cli#create-a-container). Several Azure roles permit you to create containers in a storage account, including **Owner**, **Contributor**, **Storage Blob Data Owner**, and **Storage Blob Data Contributor**.\n\n## Create a user-assigned managed identity\n\nCreate a user-assigned managed identity and assign it to the App Service. The managed identity is used to access the database and storage account.\n\n1. Use the [az identity create](/cli/azure/identity#az-identity-create) command to create a user-assigned managed identity and output the client ID to a variable for later use.\n\n    ```azurecli\n    UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv)\n    echo $UA_CLIENT_ID\n    ```\n\n1. Use the [az account show](/cli/azure/account#az-account-show) command to get your subscription ID and output it to a variable that can be used to construct the resource ID of the managed identity.\n\n    ```azurecli\n    SUBSCRIPTION_ID=$(az account show --query id --output tsv)\n    RESOURCE_ID=\"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$UA_NAME\"\n    echo $RESOURCE_ID\n    ```\n\n1. Assign the managed identity to the App Service with the [az webapp identity assign](/cli/azure/webapp/identity#az-webapp-identity-assign) command.\n\n    ```azurecli\n    export MSYS_NO_PATHCONV=1\n    az webapp identity assign \\\n        --resource-group $RESOURCE_GROUP_NAME \\\n        --name $APP_SERVICE_NAME \\\n        --identities $RESOURCE_ID\n    ```\n\n1. Create App Service app settings that contain the client ID of the managed identity and other configuration info with the [az webapp config appsettings set](/cli/azure/webapp/config/appsettings#az-webapp-config-appsettings-set) command.\n\n    ```azurecli\n    az webapp config appsettings set \\\n      --resource-group $RESOURCE_GROUP_NAME \\\n      --name $APP_SERVICE_NAME \\\n      --settings AZURE_CLIENT_ID=$UA_CLIENT_ID \\\n        STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME \\\n        STORAGE_CONTAINER_NAME=photos \\\n        DBHOST=$DB_SERVER_NAME \\\n        DBNAME=restaurant \\\n        DBUSER=$UA_NAME\n    ```\n\nThe sample app uses environment variables (app settings) to define connection information for the database and storage account but these variables don't include passwords. Instead, authentication is done passwordless with `DefaultAzureCredential`.\n\nThe sample app code uses the [`DefaultAzureCredential`](/python/api/azure-identity/azure.identity.defaultazurecredential) class constructor without passing the user-assigned managed identity client ID to the constructor. In this scenario, the fallback is to check for the `AZURE_CLIENT_ID` environment variable, which you set as an app setting.\n\nIf the `AZURE_CLIENT_ID` environment variable doesn't exist, the system-assigned managed identity is used if configured. For more information, see [Introducing DefaultAzureCredential](/azure/developer/intro/passwordless-overview#introducing-defaultazurecredential).\n\n## Create roles for the managed identity\n\nIn this section, you create role assignments for the managed identity to enable access to the storage account and database.\n\n1. Create a role assignment for the managed identity to enable access to the storage account with the [az role assignment create](/cli/azure/role/assignment#az-role-assignment-create) command.\n\n    ```azurecli\n    export MSYS_NO_PATHCONV=1\n    az role assignment create \\\n    --assignee $UA_CLIENT_ID \\\n    --role \"Storage Blob Data Contributor\" \\\n    --scope \"/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCE_GROUP_NAME\"\n    ```\n\n    The command specifies the scope of the role assignment to the resource group. For more information, see [Understand role assignments](/azure/role-based-access-control/role-assignments-portal#understand-role-assignments).\n\n1. Use the [az postgres flexible-server execute](/cli/azure/postgres/flexible-server#az-postgres-flexible-server-execute) command to connect to the Postgres database and run the same commands to assign roles to the managed identity.\n\n    ```azurecli\n    ACCOUNT_EMAIL_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)\n    az postgres flexible-server execute \\\n      --name $DB_SERVER_NAME \\\n      --admin-user $ACCOUNT_EMAIL \\\n      --admin-password $ACCOUNT_EMAIL_TOKEN \\\n      --database-name postgres \\\n      --querytext \"select * from pgaadauth_create_principal('\"$UA_NAME\"', false, false);select * from pgaadauth_list_principals(false);\"\n    ```\n\n    If you have trouble running the command, make sure you added your user account as Microsoft Entra admin for the PosgreSQL server and that you allow access to your IP address in the firewall rules. For more information, see section [Create an Azure PostgreSQL flexible server](#create-an-azure-postgresql-flexible-server).\n\n## Test the Python web app in Azure\n\nThe sample Python app uses the [azure.identity](https://pypi.org/project/azure-identity/) package and its `DefaultAzureCredential` class. When the app is running in Azure, `DefaultAzureCredential` automatically detects if a managed identity exists for the App Service and, if so, uses it to access other Azure resources (storage and PostgreSQL in this case). There's no need to provide storage keys, certificates, or credentials to the App Service to access these resources.\n\n1. Browse to the deployed application at the URL `http://$APP_SERVICE_NAME.azurewebsites.net`.\n\n    It can take a minute or two for the app to start. If you see a default app page that isn't the default sample app page, wait a minute and refresh the browser.\n\n2. Test the functionality of the sample app by adding a restaurant and some reviews with photos for the restaurant.\n\n    The restaurant and review information is stored in Azure Database for PostgreSQL and the photos are stored in Azure Storage. Here's an example screenshot:\n\n    :::image type=\"content\" source=\"./media/python-managed-identity/example-of-review-sample-app-production-deployed-small.png\" lightbox=\"./media/python-managed-identity/example-of-review-sample-app-production-deployed.png\" alt-text=\"Screenshot of the sample app showing restaurant review functionality using Azure App Service, Azure PostgreSQL Database, and Azure Storage.\" :::\n\n## Clean up\n\nIn this tutorial, all the Azure resources were created in the same resource group. Removing the resource group removes with the [az group delete](/cli/azure/group#az-group-delete) command removes all resources in the resource group and is the fastest way to remove all Azure resources used for your app.\n\n```azurecli\naz group delete  --name $RESOURCE_GROUP_NAME \n```\n\nYou can optionally add the `--no-wait` argument to allow the command to return before the operation is complete.\n\n## Next steps\n\n* [Create and deploy a Flask web app to Azure with a system-assigned managed identity](./tutorial-python-managed-identity-cli.md)\n\n* [Deploy a Python (Django or Flask) web app with PostgreSQL in Azure App Service](/azure/app-service/tutorial-python-postgresql-app)\n"
  },
  {
    "path": "articles/python/walkthrough-tutorial-authentication-01.md",
    "content": "---\ntitle: \"Walkthrough: Authenticate Python apps with Azure services\"\ndescription: A detailed walkthrough of how to authenticate a Python app with Microsoft Entra ID, Azure Key Vault, and Azure Queue Storage by using the Azure Python SDK azure-identity library.\nms.date: 05/27/2025\nms.topic: how-to\nms.custom: devx-track-python\n---\n\n# Walkthrough: Integrated authentication for Python apps with Azure services\n\nMicrosoft Entra ID, when used with Azure Key Vault, provides a robust and secure approach for authenticating applications to both Azure services and third-party platforms that require access keys or credentials. This combination eliminates the need to hardcode secrets in application code, instead relying on managed identities, role-based access control (RBAC), and centralized secret management via Key Vault. This approach streamlines identity management and enhances security posture in cloud environments.\n\nThis walkthrough explores these authentication mechanisms through a practical example provided in the GitHub repository: [github.com/Azure-Samples/python-integrated-authentication](https://github.com/Azure-Samples/python-integrated-authentication).\n\nThe sample demonstrates how a Python application can:\n\n* Authenticate with Azure using DefaultAzureCredential\n\n* Access Azure Key Vault secrets without storing credentials\n\n* Communicate securely with other Azure services like Azure Storage, Cosmos DB, and more\n\nThis article is part of a series that provides a detailed walkthrough of how to authenticate a Python app with Microsoft Entra ID, Azure Key Vault, and Azure Queue Storage by using the Azure Python SDK `azure-identity` library.\n\n## Part 1: Background\n\nWhile many Azure services rely exclusively on role-based access control (RBAC), while others require access via secrets or keys. Such services include Azure Storage, databases, Foundry Tools, Key Vault, and Event Hubs\n\nWhen building cloud applications that interact with these services, developers can use the Azure portal, CLI, or PowerShell to generate and configure service-specific access keys. These keys are tied to particular access policies to prevent unauthorized access. However, this model requires your application to manage keys explicitly and authenticate separately with each service, a process that's both tedious and error-prone.\n\nEmbedding secrets directly in code or storing them on developer machines risks exposing them in:\n\n* Source control\n* Insecure local environments\n* Accidental logs or configuration exports\n\nAzure Offers Two Key Services to Improve Security and Simplify Authentication:\n\n* **Azure Key Vault** Azure Key Vault provides a secure, cloud-based store for secrets, including access keys, connection strings, and certificates. By retrieving secrets from Key Vault only at runtime, applications avoid exposing sensitive data in source code or configuration files.\n\n- With [Microsoft Entra managed identities](/entra/identity/managed-identities-azure-resources/overview), your application can authenticate once with Microsoft Entra ID. From there, it can access other Azure services—including Key Vault—without managing credentials directly.\n\nThis approach provides:\n\n* Credential-free code (no secrets in source control)\n* Seamless integration with Azure services\n* Environment consistency: the same code runs locally and in the cloud with minimal configuration\n\nThis walkthrough shows how to use Microsoft Entra managed identity and Key Vault together in the same app. By using Microsoft Entra ID and Key Vault together, your app never needs to authenticate itself with individual Azure services, and can easily and securely access any keys necessary for third-party services.\n\n> [!IMPORTANT]\n> This article uses the common, generic term \"key\" to refer to what are stored as \"secrets\" in Azure Key Vault, such as an access key for a REST API. This usage shouldn't be confused with Key Vault's management of *cryptographic* keys, which is a separate feature from Key Vault's *secrets*.\n\n## Example cloud app scenario\n\nTo understand Azure's authentication process more deeply, consider the following scenario: A Flask web application is deployed to Azure App Service. It exposes a public, unauthenticated API endpoint that returns JSON data in response to HTTP requests.\n\n* To generate its response, the API invokes a third-party API that requires an access key. Instead of storing this key in code or configuration files, the app retrieves it securely at runtime from Azure Key Vault using Microsoft Entra managed identity.\n\n* Before returning its response to the client, the app writes a message to an Azure Storage Queue for asynchronous processing. The message could represent a task, log, or signal, though the downstream processing isn't the focus of this scenario.\n\n![Diagram of the application scenario](media/walkthrough-tutorial-authentication/scenario-diagram.png)\n\n> [!NOTE]\n> Although public API endpoints are typically protected by their own access keys or authentication mechanisms, this walkthrough assumes the endpoint is open and unauthenticated.\n>\n> This simplification helps isolate the app’s internal authentication requirements—such as accessing Azure Key Vault and Azure Storage—from any authentication concerns related to external clients.\n>\n> The scenario focuses solely on the app's behavior and doesn't demonstrate or involve an external caller authenticating with the endpoint.\n\n> [!div class=\"nextstepaction\"]\n> [Part 2 - Authentication requirements >>>](walkthrough-tutorial-authentication-02.md)\n"
  },
  {
    "path": "articles/python/walkthrough-tutorial-authentication-02.md",
    "content": "---\ntitle: \"Walkthrough, Part 2: Authenticate Python apps with Azure services\"\ndescription: A discussion of the different authentication needs and challenges in the example scenario, and how those challenges are met with Azure integrated authentication.\nms.date: 05/27/2025\nms.topic: how-to\nms.custom: devx-track-python\n---\n\n# Part 2: Authentication needs in this example scenario\n\n[Previous part: Introduction and background](walkthrough-tutorial-authentication-01.md)\n\nIn this example scenario, the main application has three distinct authentication requirements:\n\n* Azure Key Vault\n\n  The application must authenticate with Azure Key Vault in order to retrieve a securely stored API key needed to call a third-party service.\n\n* Third-party API\n\n  Once the API key is retrieved, the application uses it to authenticate with the external third-party API.\n\n* Azure Queue Storage\n\n  After processing the request, the application must authenticate with Azure Queue Storage to enqueue a message for asynchronous or deferred processing.\n\nThese tasks require the app to manage three sets of credentials:\n\n* Two for Azure resources (Key Vault and Storage)\n\n* One for an external service (third-party API)\n\n## Key authentication challenges\n\nBuilding secure cloud applications requires careful handling of credentials—especially when multiple services are involved. This example scenario presents several critical challenges:\n\n* Circular dependency on Key Vault\n\n  The application uses Azure Key Vault to securely store secrets, such as third-party API keys or Azure Storage credentials. However, to retrieve those secrets, the app must first authenticate with Key Vault. This creates a circular problem: The app needs credentials to access Key Vault, but those credentials must themselves be stored securely. Without a secure solution, this could lead to hardcoded credentials or insecure configurations in development environments.\n\n* Secure handling of third-party API keys\n\n  After retrieving the API key from Key Vault, the application must use it to call an external third-party service. This key must be handled with extreme care:\n\n  * Never hardcoded in source code or configuration files\n  * Never logged to stdout, stderr, or application logs\n  * Held only in memory and accessed at runtime, just before use\n  * Disposed promptly after the request is complete\n\n  Failure to follow these practices increases the risk of credential leakage or unauthorized use.\n\n* Securing Azure Queue Storage credentials\n\n  To write messages to Azure Queue Storage, the app typically needs a connection string or shared access token. These credentials:\n\n  * Must be stored in a secure location, such as Key Vault\n  * Must not appear in logs, stack traces, or developer tools\n  * Should be accessed only through secure runtime mechanisms\n  * Require proper RBAC configuration if using managed identity\n\n* Environment Flexibility\n\n  The app must run reliably in both local development and cloud production environments, using the same codebase and minimal conditional logic.\n\n  This means:\n\n  * No environment-specific secrets embedded in the code\n  * No need to manually toggle credentials or logic paths\n  * Consistent use of identity-based authentication across environments\n\n## Azure-First authentication with Microsoft Entra ID\n\nAs cloud applications scale in complexity and integrate with more services, secure and streamlined authentication becomes essential. Azure offers an “Azure-first” identity model through Microsoft Entra ID, enabling unified identity management and seamless integration with Azure services for secure, credential-free authentication.\n\nRather than manually managing secrets or embedding credentials in application code—a practice prone to security risks—Microsoft Entra ID enables apps to authenticate securely using managed identities.\n\nThe key benefits of Microsoft Entra managed identities are:\n\n* No secrets in code\n\n  Applications no longer require hardcoded connection strings, client secrets, or keys.\n\n* Built-in identity for apps\n\n  Azure can automatically assign a managed identity to your app, allowing secure access to services, such as Key Vault, Storage, and SQL without additional credentials.\n\n* Environment consistency\n\n  The same code and identity model work both in local development and Azure-hosted environments using the Azure SDK’s DefaultAzureCredential.\n\n## Environment-specific identity flow\n\nApplications that use Microsoft Entra ID for authentication benefit from a flexible identity model that works seamlessly in both Azure-hosted and local development environments. This consistency is achieved using the Azure SDK’s `DefaultAzureCredential`, which automatically selects the appropriate identity method based on the environment.\n\n### Azure environment\n\nWhen the application is deployed to Azure:\n\n* A managed identity is automatically assigned to the application.\n* Azure handles token issuance and credential lifecycle internally—no manual secrets required.\n* The application uses Role-Based Access Control (RBAC) or Key Vault access policies to access services\n\n### Local development environment\n\nDuring local development:\n\n* A service principal acts as the app’s identity.\n* Developers authenticate using the Azure CLI (az login), environment variables, or Visual Studio/VS Code integrations.\n* The same application code runs without modification—only the identity source changes.\n\nIn both environments, Azure SDKs use the `DefaultAzureCredential`, which abstracts away the identity source and selects the right method automatically.\n\n## Best practices for secure development\n\nWhile it's possible to set secrets as environment variables (for example, via Azure App Settings), this approach has downsides:\n\n* You must manually replicate secrets in local environments.\n* There’s a risk of secrets leaking into source control.\n* Additional logic may be required to differentiate between environments.\n\nInstead, the recommended approach is:\n\n* Use Key Vault to store third-party API keys and other secrets.\n* Assign managed identity to your deployed app.\n* Use a service principal for local development and assign it the same access rights.\n* Use `DefaultAzureCredential` in your code to abstract authentication logic.\n* Avoid storing or logging any credentials.\n\n## Authentication flow in practice\n\nHere’s how authentication works at runtime:\n\n* Your code creates a `DefaultAzureCredential` instance.\n* You use this credential to instantiate a client (for example, SecretClient, QueueServiceClient).\n* When the app invokes a method (for example, `get_secret()`), the client uses the credential to authenticate the request.\n* Azure verifies the identity and checks whether it has the correct role or policy to perform the operation.\n\nThis flow ensures that your app can securely access Azure services without embedding secrets in code or configuration files. It also allows you to seamlessly switch between local development and cloud deployment without changing your authentication logic.\n\n> [!div class=\"nextstepaction\"]\n> [Part 3 - Third-party API implementation >>>](walkthrough-tutorial-authentication-03.md)\n"
  },
  {
    "path": "articles/python/walkthrough-tutorial-authentication-03.md",
    "content": "---\ntitle: \"Walkthrough, Part 3: Authenticate Python apps with Azure services\"\ndescription: An examination of the example third-party API implementation using Azure Functions and how the endpoint is secured with an access key.\nms.date: 05/28/2025\nms.topic: how-to\nms.custom: devx-track-python\n---\n\n# Part 3: Example third-party API implementation\n\n[Previous part: Authentication requirements](walkthrough-tutorial-authentication-02.md)\n\nIn our example scenario, the main application consumes a third-party API that is secured with an access key. This section demonstrates the API using Azure Functions, but the same principles apply regardless of how or where the API is implemented—whether you host the application on another cloud provider or a traditional web server.\n\nThe key aspect is that any client requests to the protected endpoint must include the access key, which the app must manage securely. This section provides an overview of how to implement such an API using Azure Functions, but you can adapt the principles to your specific needs.\n\n## Example third-party API implementation\n\nThe example third-party API is a simple endpoint that returns a random number between 1 and 999. The API is secured with an access key, which must be provided in the request to access the endpoint. For demonstration purposes, this API is deployed to the endpoint, `https://msdocs-example-api.azurewebsites.net/api/RandomNumber`. To call the API, however, you must provide the access key `d0c5atM1cr0s0ft` either in a `?code=` URL parameter or in an `'x-functions-key'` property of the HTTP header. For example, after you deploy the app and API, try this URL in  a browser or curl: `https://msdocs-example-api.azurewebsites.net/api/RandomNumber?code=d0c5atM1cr0s0ft`.\n\nIf the access key is valid, the endpoint returns a JSON response that contains a single property, \"value\", the value of which is a number between 1 and 999, such as `{\"value\": 959}`.\n\nThe endpoint is implemented in Python and deployed to Azure Functions. The code is as follows:\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/third_party_api/RandomNumber/__init__.py\":::\n\nIn the sample repository, this code is found under *third_party_api/RandomNumber/\\_\\_init\\_\\_.py*. The folder, *RandomNumber*, provides the name of the function and *\\_\\_init\\_\\_.py* contains the code. Another file in the folder, *function.json*, describes when the function is triggered. Other files in the *third_party_api* parent folder provide details for the Azure Function app that hosts the function itself.\n\nTo deploy the code, the sample's provisioning script performs the following steps:\n\n1. Create a backing storage account for Azure Functions with the Azure CLI command, [`az storage account create`](/cli/azure/storage/account#az-storage-account-create) for managing state and internal operations.\n\n1. Create an Azure Functions app with the Azure CLI command, [`az function app create`](/cli/azure/functionapp#az-functionapp-create).\n\n1. After waiting 60 seconds for the host to be fully provisioned, deploy the code using the [Azure Functions Core Tools](/azure/azure-functions/functions-run-local?tabs=linux%2Ccsharp%2Cbash) command, [`func azure functionapp publish`](/azure/azure-functions/functions-run-local?tabs=linux%2Ccsharp%2Cbash#project-file-deployment).\n\n1. Assign the access key, `d0c5atM1cr0s0ft`, to the function. (See [Securing Azure Functions](/azure/azure-functions/security-concepts) for a background on function keys.)\n\n    In the provisioning script, this step is accomplished using the [az functionapp function keys set](/cli/azure/functionapp/function/keys#az-functionapp-function-keys-set) Azure CLI command.\n\n    Comments are included to show how to do this step through a REST API call to the [Functions Key Management API](https://github.com/Azure/azure-functions-host/wiki/Key-management-API) if desired. To call that REST API, another REST API call must be done first to retrieve the Function app's master key.\n\nYou can also assign access keys through the [Azure portal](https://portal.azure.com). On the page for the Functions app, select **Functions**, then select the specific function to secure (which is named `RandomNumber` in this example). On the function's page, select **Function Keys** to open the page where you can create and manage these keys.\n\n> [!div class=\"nextstepaction\"]\n> [Part 4 - Main app implementation >>>](walkthrough-tutorial-authentication-04.md)\n"
  },
  {
    "path": "articles/python/walkthrough-tutorial-authentication-04.md",
    "content": "---\ntitle: \"Walkthrough, Part 4: Authenticate Python apps with Azure services\"\ndescription: An overview of the main app's implementation, including all its code.\nms.date: 05/28/2025\nms.topic: how-to\nms.custom: devx-track-python\n---\n\n# Part 4: Example main application implementation\n\n[Previous part: Third-party API implementation](walkthrough-tutorial-authentication-03.md)\n\nThe main app in our scenario is a simple Flask app that's deployed to Azure App Service. The app provides a public API endpoint named */api/v1/getcode*, which generates a code for some other purpose in the app (for example, with two-factor authentication for human users). The main app also provides a simple home page that displays a link to the API endpoint.\n\nThe sample's provisioning script performs the following steps:\n\n1. Create the App Service host and deploy the code with the Azure CLI command, [`az webapp up`](/cli/azure/webapp#az-webapp-up).\n\n1. Create an Azure Storage account for the main app (using [`az storage account create`](/cli/azure/storage/account#az-storage-account-create)).\n\n1. Create a Queue in the storage account named \"code-requests\" (using [`az storage queue create`](/cli/azure/storage/queue#az-storage-queue-create)).\n\n1. To ensure that the app is allowed to write to the queue, use [`az role assignment create`](/cli/azure/role/assignment#az-role-assignment-create) to assign the \"Storage Queue Data Contributor\" role to the app. For more information about roles, see [How to assign role permissions using the Azure CLI](/azure/role-based-access-control/role-assignments-cli).\n\nThe main app code is as follows; explanations of important details are given in the next parts of this series.\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\":::\n\n> [!div class=\"nextstepaction\"]\n> [Part 5 - Dependencies and environment variables >>>](walkthrough-tutorial-authentication-05.md)\n"
  },
  {
    "path": "articles/python/walkthrough-tutorial-authentication-05.md",
    "content": "---\ntitle: \"Walkthrough, Part 5: Authenticate Python apps with Azure services\"\ndescription: A discussion of the main app's dependencies (mainly Azure SDK libraries), the necessary import statements, and the environment variables it uses.\nms.date: 05/28/2025\nms.topic: how-to\nms.custom: devx-track-python\n---\n\n# Part 5: Main app dependencies, import statements, and environment variables\n\n[Previous part: Main app implementation](walkthrough-tutorial-authentication-04.md)\n\nThis section reviews the Python libraries imported by the main application and the environment variables it depends on. When the app is deployed to Azure, these environment variables are supplied through Application Settings in Azure App Service.\n\n## Dependencies and import statements\n\nThe application relies on the following libraries:\n\n* Flask – to define the web API\n* requests – the standard Python HTTP client for making outbound API calls\n* azure.identity – for handling Microsoft Entra ID token-based authentication\n* azure.keyvault.secrets – to securely retrieve secrets from Azure Key Vault\n* azure.storage.queue – to interact with Azure Queue Storage\n\nThese dependencies are included in the app’s *requirements.txt* file and are installed during deployment or local setup.\n\n:::code language=\"txt\" source=\"~/../python-integrated-authentication/main_app/requirements.txt\"\n\nWhen you deploy the app to Azure App Service, Azure automatically installs these requirements on the host server. When running locally, you install them in your environment with `pip install -r requirements.txt`.\n\nThe code file starts with the required import statements for the parts of the libraries used in the code:\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"1-6\":::\n\n## Environment variables\n\nThe app code depends on these four environment variables:\n\n| Variable | Value |\n| --- | --- |\n| THIRD_PARTY_API_ENDPOINT | The URL of the third-party API, such as `https://msdocs-example-api.azurewebsites.net/api/RandomNumber` described in [Part 3](walkthrough-tutorial-authentication-03.md). |\n| KEY_VAULT_URL | The URL of the Azure Key Vault in which you stored the access key for the third-party API. |\n| THIRD_PARTY_API_SECRET_NAME | The name of the secret in Key Vault that contains the access key for the third-party API. |\n| STORAGE_QUEUE_URL | The URL of an Azure Storage Queue that you configure in Azure, such as `https://msdocsexamplemainapp.queue.core.windows.net/code-requests` (see [Part 4](walkthrough-tutorial-authentication-04.md)). Because the queue name is included at the end of the URL, you don't see the name anywhere in the code. |\n\nHow you set these variables depends on where the code is running:\n\n* When running the code locally, you create these variables within whatever command shell you're using (such as PowerShell, Bash, or CMD). (If you deploy the app to a virtual machine, you would create similar server-side variables.)  You can also use a library like [python-dotenv](https://pypi.org/project/python-dotenv/), which reads key-value pairs from an *.env* file and sets them as environment variables\n\n* When the code is deployed to Azure App Service, as is shown in this walkthrough, you don't have access to the server itself. Instead, you define [*application settings*](/azure/app-service/configure-common) with the same names in the App Service configuration. These settings are automatically exposed to the application as environment variables.\n\nThe provisioning scripts create these settings using the Azure CLI command, [`az webapp config appsettings set`](/cli/azure/webapp/config/appsettings#az-webapp-config-appsettings-set). All four variables are set with a single command.\n\nTo create settings through the Azure portal, see [Configure an App Service app in the Azure portal](/azure/app-service/configure-common).\n\nWhen running the code locally, you also need to specify environment variables that contain information about your local service principal. `DefaultAzureCredential` looks for these values. When deployed to App Service, you don't need to set these values as the app's system-assigned managed identity is used instead to authenticate.\n\n| Variable | Value |\n| --- | --- |\n| AZURE_TENANT_ID | The Microsoft Entra tenant (directory) ID. |\n| AZURE_CLIENT_ID | The client (application) ID of an App Registration in the tenant. |\n| AZURE_CLIENT_SECRET  | A client secret that was generated for the App Registration. |\n\nFor more information,  see [Authenticate Python apps to Azure services during local development using service principals](./sdk/authentication-local-development-service-principal.md#4---set-local-development-environment-variables).\n\n> [!div class=\"nextstepaction\"]\n> [Part 6 - Main app startup code >>>](walkthrough-tutorial-authentication-06.md)\n"
  },
  {
    "path": "articles/python/walkthrough-tutorial-authentication-06.md",
    "content": "---\ntitle: \"Walkthrough, Part 6: Authenticate Python apps with Azure services\"\ndescription: An examination of the main app's startup code, which sets up the DefaultAzureCredential object and client objects needed by the API endpoint.\nms.date: 05/28/2025\nms.topic: how-to\nms.custom: devx-track-python\n---\n\n# Part 6: Main app startup code\n\n[Previous part: Dependencies and environment variables](walkthrough-tutorial-authentication-05.md)\n\nImmediately following the `import` statements, the app's startup code initializes key variables used throughout the request-handling functions.\n\nFirst, the application creates the Flask app object, which serves as the foundation for defining routes and handling incoming HTTP requests. Next, it retrieves the third-party API endpoint URL from an environment variable. This allows the endpoint to be easily configured without modifying the codebase:\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"8-11\":::\n\nNext, it obtains the [`DefaultAzureCredential`](/python/api/azure-identity/azure.identity.defaultazurecredential\n) object, which is the recommended credential to use when authenticating with Azure services. See [Authenticate Azure hosted applications with DefaultAzureCredential](./sdk/authentication-azure-hosted-apps.md).\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"14\":::\n\nWhen run locally, `DefaultAzureCredential` looks for the `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, and `AZURE_CLIENT_SECRET` environment variables that contain information for the service principal that you're using for local development. When run in Azure, `DefaultAzureCredential` defaults to using the system-assigned managed identity enabled on the app. It's possible to override the default behavior with application settings, but in this example scenario, we use the default behavior.\n\nThe code next retrieves the third-party API's access key from Azure Key Vault. In the provisioning script, the Key Vault is created using [`az keyvault create`](/cli/azure/keyvault#az-keyvault-create), and the secret is stored with [`az keyvault secret set`](/cli/azure/keyvault/secret#az-keyvault-secret-set).\n\nThe Key Vault resource itself is accessed through a URL, which is loaded from the `KEY_VAULT_URL` environment variable.\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"18\":::\n\nTo retrieve a secret from Azure Key Vault, the application must create a client object that communicates with the Key Vault service. Since the goal is to read a secret, the app uses the [`SecretClient`](/python/api/azure-keyvault-secrets/azure.keyvault.secrets.secretclient) class from the `azure.keyvault.secrets` library. This client requires two inputs:\n\n* The Key Vault URL – typically retrieved from an environment variable\n* A credential object – such as the `DefaultAzureCredential` instance created earlier, which represents the identity under which the app is running.\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"19\":::\n\nCreating a `SecretClient` object does not immediately authenticate the application. The client is simply a local construct that stores the Key Vault URL and the credential object. Authentication and authorization happen only when you invoke an operation through the client, such as [`get_secret`](/python/api/azure-keyvault-secrets/azure.keyvault.secrets.secretclient#azure-keyvault-secrets-secretclient-get-secret), which generates a REST API call to the Azure resource.\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"23-28\":::\n\nEven if an application's identity is authorized to access Azure Key Vault, it must also be explicitly authorized to perform specific operations—such as reading secrets. Without this permission, a call to `get_secret()` fails, even if the identity is otherwise valid. To address this, the provisioning script sets a \"get secrets\" access policy for the app using the Azure CLI command, [`az keyvault set-policy`](/cli/azure/keyvault#az-keyvault-set-policy). For more information, see [Key Vault Authentication](/azure/key-vault/general/authentication) and [Grant your app access to Key Vault](/azure/key-vault/general/managed-identity#grant-your-app-access-to-key-vault). The latter article shows how to set an access policy using the Azure portal. (The article is also written for managed identity, but applies equally to a service principle used in local development.)\n\nFinally, the app code sets up the client object through which it can write messages to an Azure Storage Queue. The Queue's URL is in the environment variable `STORAGE_QUEUE_URL`.\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"31-32\":::\n\nAs with Azure Key Vault, the application uses a specific client object from the Azure SDK to interact with Azure Queue Storage. In this case, it uses the [`QueueClient`](/python/api/azure-storage-queue/azure.storage.queue.queueclient) class from the azure-storage-queue library.\n\nTo initialize the client, the app uses the [`from_queue_url`](/python/api/azure-storage-queue/azure.storage.queue.queueclient#azure-storage-queue-queueclient-from-queue-url) method, providing the queue’s fully qualified URL and a credential object. This credential object is again the `DefaultAzureCredential` instance created earlier, which represents the identity under which the app is running.\n\nAs noted earlier in this guide, that authorization is granted by assigning the “Storage Queue Data Contributor” role to the application's identity - either a managed identity in Azure or a service principal during local development.\nThis role assignment is done in the provisioning script using the Azure CLI command [`az role assignment create`](/cli/azure/role/assignment#az-role-assignment-create).\n\nAssuming all this startup code succeeds, the app has all its internal variables in place to support its */api/v1/getcode* API endpoint.\n\n> [!div class=\"nextstepaction\"]\n> [Part 7 - Main app endpoint >>>](walkthrough-tutorial-authentication-07.md)\n"
  },
  {
    "path": "articles/python/walkthrough-tutorial-authentication-07.md",
    "content": "---\ntitle: \"Walkthrough, Part 7: Authenticate Python apps with Azure services\"\ndescription: An examination of the code for the main app API endpoint, which uses the third-party API endpoint and writes a message to Azure Queue Storage.\nms.date: 05/28/2025\nms.topic: how-to\nms.custom: devx-track-python\n---\n\n# Part 7: Main application API endpoint\n\n[Previous part: Main app startup code](walkthrough-tutorial-authentication-06.md)\n\nThe app URL path */api/v1/getcode* for the API generates a JSON response that contains an alphanumerical code and a timestamp.\n\nFirst, the `@app.route` decorator tells Flask that the `get_code` function handles requests to the */api/v1/getcode* URL.\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"44-45\":::\n\nNext, the app calls the third-party API, the URL of which is in `number_url`, providing the access key that it retrieves from the key vault in the header.\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"46-54\":::\n\nThe example third-party API is deployed to the serverless environment of Azure Functions. The `x-functions-key` property in the header is how Azure Functions expects an access key to appear in a header. For more information, see [Azure Functions HTTP trigger - Authorization keys](/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=csharp#authorization-keys). If calling the API fails for any reason, the code returns an error message and the status code.\n\nAssuming that the API call succeeds and returns a numerical value, the app then constructs a more complex code using that number plus some random characters (using its own `random_char` function).\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"56-60\":::\n\nThe `code` variable here contains the full JSON response for the app's API, which includes the code value and a timestamp. An example response would be `{\"code\":\"ojE-161-pTv\",\"timestamp\":\"2020-04-15 16:54:48.816549\"}`.\n\nBefore it returns that response, however, it writes a message in the storage queue using the Queue client's [`send_message`](/python/api/azure-storage-queue/azure.storage.queue.queueclient#send-message-content----kwargs-) method:\n\n:::code language=\"python\" source=\"~/../python-integrated-authentication/main_app/app.py\" range=\"64-66\":::\n\n## Processing queue messages\n\nMessages stored in the queue can be viewed and managed through the [Azure portal](/azure/storage/queues/storage-quickstart-queues-portal#view-message-properties), with the Azure CLI command [`az storage message get`](/cli/azure/storage/message#az-storage-message-get) or with [Azure Storage Explorer](https://azure.microsoft.com/features/storage-explorer/). The sample repository includes a script (*test.cmd* and *test.sh*) to request a code from the app endpoint and then check the message queue. There's also a script to clear the queue using the [`az storage message clear`](/cli/azure/storage/message#az-storage-message-clear) command.\n\nTypically, an app like the one in this example would have another process that asynchronously pulls messages from the queue for further processing. As mentioned previously, the response generated by this API endpoint might be used elsewhere in the app with two-factor user authentication. In that case, the app should invalidate the code after a certain period of time, for example 10 minutes. A simple way to do this task would be to maintain a table of valid two-factor authentication codes, which are used by its user sign-in procedure. The app would then have a simple queue-watching process with the following logic (in pseudo-code):\n\n```pseudo\npull a message from the queue and retrieve the code.\n\nif (code is already in the table):\n    remove the code from the table, thereby invalidating it\nelse:\n    add the code to the table, making it valid\n    call queue_client.send_message(code, visibility_timeout=600)\n```\n\nThis pseudo-code employs the [`send_message`](/python/api/azure-storage-queue/azure.storage.queue.queueclient#send-message-content----kwargs-) method's optional `visibility_timeout` parameter, which specifies the number of seconds before the message becomes visible in the queue. Because the default timeout is zero, messages initially written by the API endpoint become immediately visible to the queue-watching process. As a result, that process stores them in the valid code table right away. The process queues the same message again with the timeout, so that it receives the code again 10 minutes later, at which point it removes it from the table.\n\n## Implementing the main app API endpoint in Azure Functions\n\nThe code shown previously in this article uses the Flask web framework to create its API endpoint. Because Flask needs to run with a web server, such code must be deployed to Azure App Service or to a virtual machine.\n\nAn alternate deployment option is the serverless environment of Azure Functions. In this case, all the startup code and the API endpoint code would be contained within the same function that's bound to an HTTP trigger. As with App Service, you use [function application settings](/azure/azure-functions/functions-how-to-use-azure-function-app-settings#settings) to create environment variables for your code.\n\nOne piece of the implementation that becomes easier is authenticating with Queue Storage. Instead of obtaining a `QueueClient` object using the queue's URL and a credential object, you create a *queue storage binding* for the function. The binding handles all the authentication behind the scenes. With such a binding, your function is given a ready-to-use client object as a parameter. For more information and example code, see [Connect Azure Functions to Azure Queue Storage](/azure/azure-functions/functions-add-output-binding-storage-queue-cli?tabs=bash%2Cbrowser&pivots=programming-language-python).\n\n## Next steps\n\nThrough this tutorial, you learned how apps authenticate with other Azure services using managed identity, and how apps can use Azure Key Vault to store any other necessary secrets for third-party APIs.\n\nThe same pattern demonstrated here with Azure Key Vault and Azure Storage applies with all other Azure services. The crucial step is that you assign the correct role for the app within that service's page on the Azure portal, or through the Azure CLI. (See [How to assign Azure roles](/azure/role-based-access-control/role-assignments-steps)). Be sure to check the service documentation to see whether you need to configure any other access policies.\n\nAlways remember that you need to assign the same roles and access policies to any service principal you're using for local development.\n\nIn short, having completed this walkthrough, you can apply your knowledge to any number of other Azure services and any number of other external services.\n\nOne subject that we haven't touched upon in this tutorial is authentication of *users*. To explore this area for web apps, begin with [Authenticate and authorize users end-to-end in Azure App Service](/azure/app-service/tutorial-auth-aad?pivots=platform-linux).\n\n## See also\n\n- [How to authenticate and authorize Python apps on Azure](./sdk/authentication-overview.md)\n- Walkthrough sample: [github.com/Azure-Samples/python-integrated-authentication](https://github.com/Azure-Samples/python-integrated-authentication)\n- [Microsoft Entra documentation](/azure/active-directory)\n- [Azure Key Vault documentation](/azure/key-vault)\n"
  },
  {
    "path": "articles/rust/TOC.yml",
    "content": "- name: Azure for Rust developers\n  href: index.yml\n  items:\n  - name: Overview\n    items:\n    - name: What is Azure for Rust developers?\n      href: what-is-azure-for-rust-developers.md\n  - name: Development\n    items:\n    - name: Configure your local Rust environment for Azure\n      href: developer-environment.md\n  - name: Azure SDK for Rust\n    items:\n    - name: Overview\n      href: sdk/overview.md\n    - name: Installation\n      href: sdk/installation.md\n    - name: Authentication\n      href: sdk/authentication/overview.md\n    - name: Use crates\n      href: sdk/use-crates.md\n    - name: Use azure-core crate for advanced scenarios\n      href: sdk/azure-core-types.md\n    - name: Telemetry\n      href: sdk/logging.md\n  - name: Resources\n    items:\n    - name: Azure SDK for Rust on GitHub\n      href: https://github.com/Azure/azure-sdk-for-rust\n    - name: Azure SDK Guidelines\n      href: https://azure.github.io/azure-sdk/rust_introduction.html\n  - name: Crates\n    href: azure-sdk-library-package-index.md"
  },
  {
    "path": "articles/rust/azure-sdk-library-package-index.md",
    "content": "---\ntitle: Azure SDK for Rust crates\ndescription: Listing of the package names, crates links, docs links, and source code links for all libraries in the Azure SDK for Rust.\nms.date: 10/10/2025\nms.topic: concept-article\nms.custom: devx-track-rust\n# This page's includes are auto-updated from Azure SDK team but they aren't changing this file's date.\n---\n\n# Azure SDK for Rust crates\n\nThe Azure SDK for Rust crates are available for installation from [crates.io](https://crates.io/) and any package managers that use the Cargo package registry.\n\n## Modern Rust libraries\n\n[!INCLUDE [rust-new-releases](../includes/rust-new.md)]\n\n"
  },
  {
    "path": "articles/rust/developer-environment.md",
    "content": "---\ntitle: Configure Your Local Rust Environment for Azure Development\ndescription: Set up your local Rust development environment for Azure with installation suggestions, SDK crates, authentication methods, and essential tools. Start building cloud applications today.\nms.date: 09/02/2025\nms.topic: get-started\nms.service: azure-rust\nms.custom: devx-track-rust, azure-sdk-rust\n---\n\n# Configure your Rust development environment for Azure\n\nConfigure your local Rust development environment for Azure to build cloud applications efficiently on your workstation before deployment. Local development gives you access to a wider variety of tools and a familiar environment for faster iteration.\n\nThis article provides suggestions to set up and validate a local Rust development environment that integrates seamlessly with Azure services.\n\n## One-time subscription creation\n\nYou create [Azure resources](/azure/cloud-adoption-framework/ready/azure-setup-guide/organize-resources?tabs=AzureManagementGroupsAndHierarchy) within a subscription and resource group. If you don't have a subscription, create a _free_ [trial subscription][trial subscription].\n\nIf you already have a subscription, access your existing subscription with:\n\n* [Azure portal][Azure portal]\n* [Azure CLI][Azure CLI]\n* [Azure SDK for Rust crates][Azure crates]\n* [Visual Studio Code extensions][Visual Studio Code extensions]\n\n## One-time software installation\n\nFor Azure development with Rust on your local workstation, install the following tools:\n\n|Name/Installer|Description|\n|--|--|\n|[Rust]|Install the Rust programming language via rustup, which includes the Rust compiler (rustc), package manager (cargo), and standard library.|\n|[Visual Studio Code][Visual Studio Code]|Visual Studio Code gives you a great Rust integration and coding experience but it isn't required. You can use any code editor.|\n|[Visual Studio Code extensions][Visual Studio Code extensions]|Install any relevant extensions for Azure services you intend to use.|\n|[rust-analyzer extension][rust-analyzer-extension]|The recommended VS Code extension for Rust language support, providing code completion, error checking, and more.|\n\n## How to install Rust\n\nFollow these steps to install Rust:\n\n1. Go to <https://www.rust-lang.org/tools/install>.\n1. Follow the instructions for your operating system to install **rustup**, the Rust toolchain installer.\n1. Verify your installation by running the following commands:\n\n    ```console\n    rustc --version\n    cargo --version\n    ```\n\nFor detailed installation guidance and troubleshooting, see the [Installation chapter][The Rust Book installation chapter] in The Rust Programming Language book. For development environment setup tips, including editor configuration, see the [Development Environment chapter][The Rust Book development environment chapter] and the [official Rust development tools guide][official Rust development tools guide].\n\n## Create an Azure resource group for your project\n\n[!INCLUDE [create resource group 3-tab](../includes/create-resource-group.md)]\n\n## Add Azure SDK crates to your Rust project\n\nYou can get the Azure SDK for Rust crates from [crates.io][Azure crates]. To learn more, see [Azure SDK for Rust](./sdk/overview.md).\n\n## Authenticate to Azure\n\nTo authenticate to Azure from your Rust application, use the [Azure Identity SDK crate][Azure Identity rust crate]. This library provides a set of credential types that you can use to authenticate to Azure services.\n\n## Additional Rust resources\n\nIf you're new to Rust, these official resources can help you get up to speed:\n\n- [The Rust Programming Language][The Rust Programming Language] - The official Rust book, covering everything from basics to advanced topics\n- [Rust by Example][Rust by Example] - Learn Rust through hands-on examples\n- [The Cargo Book][The Cargo Book] - Complete guide to Cargo, Rust's package manager and build system\n- [Rustlings][Rustlings] - Interactive exercises to learn Rust\n- [Rust development tools][official Rust development tools guide] - Official overview of IDEs, editors, and development tools\n\n\n<!-- Reference links for Rust resources -->\n[Azure portal]: https://portal.azure.com/\n[Azure CLI]: /cli/azure/\n[Azure crates]: https://crates.io/users/azure-sdk?sort=recent-downloads\n[Crates.io]: https://crates.io/\n[official Rust development tools guide]: https://www.rust-lang.org/tools\n[Rust by Example]: https://doc.rust-lang.org/rust-by-example/\n[rust-analyzer-extension]: https://marketplace.visualstudio.com/items?itemName=matklad.rust-analyzer\n[Rust]: https://www.rust-lang.org/\n[Rustlings]: https://github.com/rust-lang/rustlings\n[The Cargo Book]: https://doc.rust-lang.org/cargo/\n[The Rust Book development environment chapter]: https://doc.rust-lang.org/book/ch01-02-hello-world.html\n[The Rust Book installation chapter]: https://doc.rust-lang.org/book/ch01-01-installation.html\n[The Rust Programming Language]: https://doc.rust-lang.org/book/\n[trial subscription]: https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn/\n[Visual Studio Code extensions]: https://marketplace.visualstudio.com/search?term=rust&target=VSCode&category=All%20categories&sortBy=Relevance\n[Visual Studio Code]: https://code.visualstudio.com/\n[Azure Identity rust crate]: https://crates.io/crates/azure_identity"
  },
  {
    "path": "articles/rust/includes/prerequisites.md",
    "content": "---\nms.service: azure-rust\nms.custom: devx-track-rust\nms.topic: include\nms.date: 09/02/2025\n---\n## Prerequisites to develop with crates\n\n- Rust 1.85.0 or newer. The version is specified in the Azure SDK for Rust [Cargo.toml](https://github.com/Azure/azure-sdk-for-rust/blob/main/Cargo.toml).\n- An Azure subscription. You can [create one for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn).\n\n> [!TIP]\n> For the best development experience, ensure you have the latest stable version of Rust installed. "
  },
  {
    "path": "articles/rust/includes/resources.md",
    "content": "---\nms.service: azure-rust\nms.custom: devx-track-rust\nms.topic: include\nms.date: 09/02/2025\n---\n- [Azure SDK crates on Crates.io](https://crates.io/users/azure-sdk?sort=recent-downloads) - List of available Azure SDK crates\n- [Azure SDK design guidelines](https://azure.github.io/azure-sdk/rust_introduction.html) - Design principles and patterns\n- [Azure SDK for Rust GitHub repository](https://github.com/Azure/azure-sdk-for-rust) - Issues and source code\n- [Cargo documentation](https://doc.rust-lang.org/cargo/) - Complete Cargo reference\n"
  },
  {
    "path": "articles/rust/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Azure for Rust developers\nsummary: You can deploy your Rust applications to Azure in various environments, including web apps, serverless functions, containers, and microservices. Azure offers flexible hosting options to suit different performance and reliability needs. To interact with Azure services programmatically, use the Azure SDK for Rust. This set of libraries provides type-safe APIs for authentication, resource management, and service integration—making it easier to build secure, high-performance cloud applications with Rust's memory safety guarantees and zero-cost abstractions.\n\nmetadata:\n  title: Azure for Rust developers\n  description: Get started developing with Rust on Azure using services like Azure Functions, Key Vault, Messaging, Identity, Cosmos DB, Blob Storage, and the Azure SDK for Rust.\n  ms.topic: landing-page\n  ms.service: azure-rust\n  ms.collection: collection\n  ms.date: 09/02/2025\n  ms.custom: dexx-track-rust\n\nlandingContent:\n  - title: Azure for Rust developers\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: What is Azure for Rust developers?\n            url: what-is-azure-for-rust-developers.md\n\n      - linkListType: get-started\n        links:\n          - text: Set up developer environment\n            url: developer-environment.md\n\n      - linkListType: how-to-guide\n        links:\n          - text: Azure SDK for Rust\n            url: sdk/overview.md\n          - text: Installation\n            url: sdk/installation.md\n          - text: Authentication\n            url: sdk/authentication/overview.md\n          - text: Use crates\n            url: sdk/use-crates.md  \n\n  - title: Azure libraries (SDK)\n    linkLists:\n      - linkListType: reference\n        links:\n          - text: Azure Cosmos DB\n            url: https://crates.io/crates/azure_data_cosmos\n          - text: Azure Event Hubs\n            url: https://crates.io/crates/azure_messaging_eventhubs\n          - text: Azure Identity\n            url: https://crates.io/crates/azure_identity\n          - text: Azure Key Vault - Secrets\n            url: https://crates.io/crates/azure_security_keyvault_secrets\n          - text: Azure Key Vault - Certificates\n            url: https://crates.io/crates/azure_security_keyvault_certificates\n          - text: Azure Key Vault - Keys\n            url: https://crates.io/crates/azure_security_keyvault_keys\n          - text: Azure Storage - Blobs\n            url: https://crates.io/crates/azure_storage_blob\n  - title: Hosting\n    linkLists:\n      - linkListType: get-started\n        links:\n          - text: Hosting apps on Azure\n            url: /azure/developer/intro/hosting-apps-on-azure\n          - text: Azure Functions\n            url: /azure/azure-functions/create-first-function-vs-code-other?tabs=rust%2Cwindows\n          - text: Azure App Service\n            url: /azure/app-service\n          - text: Azure Container Apps\n            url: /azure/container-apps\n          - text: Azure Kubernetes Service (AKS)\n            url: /azure/aks\n"
  },
  {
    "path": "articles/rust/sdk/authentication/overview.md",
    "content": "---\ntitle: Authenticate Rust apps to Azure using the Azure Identity crate\ndescription: Authenticate Rust apps with Azure services using the Azure Identity crate for local development and production managed identities.\nms.date: 09/02/2025\nms.topic: overview\nms.service: azure-rust\nms.custom:\n  - devx-track-rust\n---\n\n# Authenticate Rust apps to Azure using the Azure Identity crate\n\nRust applications must authenticate to Azure services such as Storage, Key Vault, or Cosmos DB. This article explains how to use the Azure Identity crate to securely authenticate Rust apps in local development and server environments, improving security and simplifying credential management.\n\n## Recommended token-based authentication\n\n[!INCLUDE [Recommended token-based app authentication approach](<../../../includes/authentication/overview-recommend-authentication-rust.md>)]\n\n### Advantages of token-based authentication\n\nWhen building apps for Azure, we strongly recommend using token-based authentication instead of secrets like connection strings or keys.\n\n[!INCLUDE [Advantages of token-based authentication](<../../../includes/authentication/overview-advantages.md>)]\n\n## Authenticate during local development\n\n[!INCLUDE [Authentication during local development](<../../../includes/authentication/overview-local-environments.md>)]\n\n\n### Authenticate with Azure CLI credential\n\nThe Azure CLI credential uses the authentication state of the Azure CLI to authenticate your Rust application. This credential is ideal for local development when you're already signed in with `az login`.\n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-docs/examples/authenticate_azure_cli.rs\":::\n\n### Authenticate with Azure Developer CLI credential\n\nThe Azure Developer CLI credential uses the authentication state of the Azure Developer CLI (`azd`) to authenticate your application. This credential is useful when working with azd templates and workflows.\n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-docs/examples/authenticate_azure_dev_cli.rs\":::\n\n## Authenticate in server environments\n\nIn server environments, use **managed identities** for secure, passwordless authentication. [Managed identities](/entra/identity/managed-identities-azure-resources/overview) are automatically created and managed by Azure, so your application can authenticate without needing to store credentials.\n\nWhen hosting in a server environment, assign a unique application identity to each application for each environment. In Azure, an app identity is represented by a service principal, a special type of security principal that identifies and authenticates apps to Azure. The type of service principal you use for your app depends on where your app runs.\n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-docs/examples/authenticate_server.rs\":::\n\n## Sample code\n\nThe code shown in this article is available on <https://github.com/azure-samples/azure-sdk-for-rust-docs/>.\n\n## Additional resources\n\n[!INCLUDE [common resources](../../includes/resources.md)]"
  },
  {
    "path": "articles/rust/sdk/azure-core-types.md",
    "content": "---\ntitle: Use Azure SDK for Rust azure-core crate for advanced scenarios\ndescription: Learn how to use Azure SDK for Rust azure-core crate core types in Rust applications to customize HTTP clients, policies, and error handling. Discover how to implement your own clients and optimize Azure SDK for Rust crates usage.\nms.date: 11/17/2025\nms.topic: how-to\nms.service: azure-rust\nms.custom: devx-track-rust\nai-usage: ai-assisted\n---\n\n# Use the `azure-core` crate for advanced scenarios in Rust applications\n\nThe `azure_core` crate provides fundamental types, traits, and abstractions that form the foundation of all Azure SDK for Rust crates. This article demonstrates how to implement custom HTTP clients, create custom policies for request/response processing, and access detailed error information from Azure services.\n\n[Crates] | [API reference documentation] | [Source code]\n\n## HTTP requests\n\nThis section covers how to customize HTTP client behavior and implement custom HTTP clients for Azure SDK operations.\n\n### Implement a custom HTTP client\n\nYou can replace the default HTTP client (reqwest) with your own implementation by implementing the `HttpClient` trait. This is useful when you need specific HTTP client features, want to avoid tokio dependencies, or need to integrate with existing HTTP infrastructure. This example shows how to use the `ureq` HTTP client, which is a synchronous client that can be useful in embedded or resource-constrained environments.\n\nFirst, implement the `HttpClient` trait for your custom client:\n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-permalink/sdk/core/azure_core/examples/core_ureq_client.rs\" range=\"16-47\" :::\n\nThen, configure the client with your custom HTTP implementation:\n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-permalink/sdk/core/azure_core/examples/core_ureq_client.rs\" range=\"49-73\" :::\n\n### Implement custom HTTP policies\n\nYou can customize request and response processing by implementing the `Policy` trait. Policies let you modify requests before they're sent or inspect responses before they're returned. This example shows how to create a policy that removes the request's User-Agent header:\n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-permalink/sdk/core/azure_core/examples/core_remove_user_agent.rs\" range=\"18-38\":::\n\nAdd your custom policy to the client options object:\n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-permalink/sdk/core/azure_core/examples/core_remove_user_agent.rs\" range=\"44-49\":::\n\nThen construct the client:\n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-permalink/sdk/core/azure_core/examples/core_remove_user_agent.rs\" range=\"58-62\":::\n\n## Service error details\n\nYou can access detailed errors returned by the Azure service. The following example demonstrates deserializing a standard Azure error response to get more details such as the `error_code` and error details.\n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-permalink/sdk/core/azure_core/examples/core_error_response.rs\" range=\"19-75\" :::\n\n\n## Next steps\n\n- [Authenticate with Azure services](./authentication/overview.md)\n- [OpenTelemetry in Azure SDK for Rust crates](./logging.md)\n- [Use Azure SDK for Rust crates](./use-crates.md)\n\n[!INCLUDE [common resources](../includes/resources.md)]\n\n[API reference documentation]: https://docs.rs/azure_core/\n[Crates]: https://crates.io/crates/azure_core\n[Source code]: https://github.com/Azure/azure-sdk-for-rust/tree/main/sdk/core/azure_core/"
  },
  {
    "path": "articles/rust/sdk/installation.md",
    "content": "---\ntitle: Install and manage Azure SDK for Rust crates\ndescription: Install, update, and manage Azure SDK for Rust crates using Cargo. Learn how to keep your Rust projects up to date with Azure services.\nms.date: 09/02/2025\nms.topic: how-to\nms.service: azure-rust\nms.custom: devx-track-rust\nadobe-target: true\n---\n\n# Install Azure SDK for Rust crates\n\nThe Azure SDK for Rust lets you access Azure services in your Rust projects by installing individual SDK crates with Cargo. This article shows how to install, update, and manage Azure SDK for Rust crates, so you can add only the features you need and keep your projects up to date.\n\n[!INCLUDE [prerequisites](../includes/prerequisites.md)]\n\n## Install the latest Azure SDK crate version\n\nGet Azure SDK crates from [crates.io][Crates]. Install the individual crates that you need. \n\n```console\ncargo add <crate_name>\n```\n\nReplace `<crate_name>` with the name of the Azure crate you want to install. For example, to install the Azure Identity and Key Vault secrets crates:\n\n```console\ncargo add azure_identity azure_security_keyvault_secrets\n```\n\nYou can find available crate names in the [crate index for Azure][Crates].\n\n## Install a specific Azure SDK crate version\n\nSometimes you need to install a particular [version of a crate][Rust docs - crate version syntax] for compatibility testing or to maintain consistency across environments. When you specify a version, you **pin** your dependency. Your project continues using that version and doesn't automatically receive major or minor updates, but it can still receive patch updates. While pinning can be useful in certain scenarios, we recommend using the latest version to benefit from ongoing improvements and security updates.\n\n```console\ncargo add <crate_name>@<version_number>\n```\n\nFor example:\n\n```console\ncargo add azure_storage_blob@0.20.0\n```\n\nYou can also specify version requirements in your `Cargo.toml` file. For more information on version requirement syntax, see the [Rust documentation][Rust docs - dependency].\n\n## Update Azure SDK crates\n\nTo update all crates to their latest compatible versions, run:\n\n```console\ncargo update\n```\n\nTo update a specific crate, run:\n\n```console\ncargo update <crate_name>\n```\n\n## Remove a specific Azure SDK crate\n\nTo remove a crate from your project, including the `Cargo.toml` file, run:\n\n  ```console\n  cargo remove <crate_name>\n  ```\n    \nBuild the project to update your `Cargo.lock` file:\n\n  ```console\n  cargo build\n  ```\n\n## Configure Azure SDK crate features\n\nThe [`azure_core`][Crate - core] crate provides features for all Azure SDK crates, such as:\n\n- `reqwest`: HTTP client implementation.\n- `tokio`: Async runtime support.\n\nEnable SDK features when adding a crate:\n\n```console\ncargo add <crate_name> --features <feature_name_1>,<feature_name_2>\n```\n\nOr specify features in your `Cargo.toml`:\n\n```toml\n[dependencies]\n<crate_name> = { version = \"0.17\", features = [\"<feature_name_1>\", \"<feature_name_2>\"] }\n```\n\n## Additional resources\n\n[!INCLUDE [common resources](../includes/resources.md)]\n\n[Rust docs - dependency]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html\n[Rust docs - crate version syntax]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#version-requirement-syntax\n\n[Crates]: https://crates.io/users/azure-sdk?sort=recent-downloads\n[Crate - identity]: https://crates.io/crates/azure_identity\n[Crate - core]: https://crates.io/crates/azure_core\n[Crate - cosmos]: https://crates.io/crates/azure_data_cosmos\n[Crate - event hubs]: https://crates.io/crates/azure_messaging_eventhubs\n[Crate - key vault - secrets]: https://crates.io/crates/azure_security_keyvault_secrets\n[Crate - key vault - certificates]: https://crates.io/crates/azure_security_keyvault_certificates\n[Crate - key vault - keys]: https://crates.io/crates/azure_security_keyvault_keys\n[Crate - storage]: https://crates.io/crates/azure_storage\n\n"
  },
  {
    "path": "articles/rust/sdk/logging.md",
    "content": "---\ntitle: OpenTelemetry in Azure SDK for Rust crates\ndescription: Learn how to implement OpenTelemetry in Rust applications using Azure SDK crates for observability, monitoring, and troubleshooting.\nms.date: 10/16/2025\nms.topic: how-to\nms.custom: devx-track-rust\nai-usage: ai-generated\n---\n\n# OpenTelemetry in Azure SDK for Rust crates\n\nWhen you work with Azure SDK for Rust crates, you need visibility into SDK operations to debug issues, monitor performance, and understand how your application interacts with Azure services. This article shows you how to implement effective OpenTelemetry-based logging and telemetry strategies that provide insights into the inner workings of Rust applications on Azure.\n\n\n## Telemetry for Azure developers\n\nThe Azure SDK for Rust crates provide comprehensive observability through OpenTelemetry integration, which we recommend for monitoring and distributed tracing scenarios. Whether you're troubleshooting authentication flows, monitoring API request cycles, or analyzing performance bottlenecks, this guide covers the OpenTelemetry tools and techniques you need to gain visibility into your Azure SDK operations.\n\nAzure SDK for Rust crates use OpenTelemetry as the standard approach to observability, providing:\n\n- **Industry-standard telemetry**: Use OpenTelemetry formats compatible with monitoring platforms\n- **Distributed tracing**: Track requests across multiple services and Azure resources  \n- **Advanced exporters**: Send data to Jaeger, Prometheus, Grafana, and other observability platforms\n- **Correlation across services**: Automatically propagate trace context between microservices\n- **Production monitoring**: Built for high-scale production environments with sampling and performance optimizations\n\n> [!IMPORTANT]\n> Currently, Microsoft does not provide a direct Azure Monitor OpenTelemetry exporter for Rust applications. The [Azure Monitor OpenTelemetry Distro](/azure/azure-monitor/app/opentelemetry-overview) only supports .NET, Java, Node.js, and Python. For Rust applications, you need to export OpenTelemetry data to an intermediate system (such as Azure Storage, Event Hubs, or the OpenTelemetry Collector) and then import that data into Azure Monitor using supported ingestion methods.\n\n## Set up OpenTelemetry logging\n\nTo use OpenTelemetry, you need the `azure_core_opentelemetry` crate. The `azure_core` package alone doesn't include OpenTelemetry support.\n\n1. Log in to Azure CLI:\n\n    ```bash\n    az login\n    ```\n\n1. Create Azure Monitor resources by using Azure CLI:\n    \n    ```bash\n    # Set variables\n    RESOURCE_GROUP=\"rust-telemetry-rg\"\n    LOCATION=\"eastus\"\n    APP_INSIGHTS_NAME=\"rust-app-insights\"\n    LOG_ANALYTICS_WORKSPACE=\"rust-logs-workspace\"\n    \n    # Create resource group\n    az group create --name $RESOURCE_GROUP --location $LOCATION\n    \n    # Create Log Analytics workspace\n    WORKSPACE_ID=$(az monitor log-analytics workspace create \\\n      --resource-group $RESOURCE_GROUP \\\n      --workspace-name $LOG_ANALYTICS_WORKSPACE \\\n      --location $LOCATION \\\n      --query id -o tsv)\n    \n    # Create Application Insights instance\n    az extension add --name application-insights\n    INSTRUMENTATION_KEY=$(az monitor app-insights component create \\\n      --app $APP_INSIGHTS_NAME \\\n      --location $LOCATION \\\n      --resource-group $RESOURCE_GROUP \\\n      --workspace $WORKSPACE_ID \\\n      --query instrumentationKey -o tsv)\n    \n    # Get connection string\n    CONNECTION_STRING=$(az monitor app-insights component show \\\n      --app $APP_INSIGHTS_NAME \\\n      --resource-group $RESOURCE_GROUP \\\n      --query connectionString -o tsv)\n    \n    echo \"Application Insights Connection String: $CONNECTION_STRING\"\n    ```\n\n1. Configure your Rust project. Add the required dependencies to your `Cargo.toml`:\n    \n    ```toml\n    [dependencies]\n    azure_core_opentelemetry = \"*\"\n    azure_security_keyvault_secrets = \"*\"\n    azure_identity = \"*\"\n    opentelemetry = \"0.31\"\n    opentelemetry_sdk = \"0.31\"\n    opentelemetry-otlp = \"0.31\"  # For exporting to OpenTelemetry Collector\n    tokio = { version = \"1.47.1\", features = [\"full\"] }\n    ```\n\n    > [!NOTE]\n    > The `opentelemetry-otlp` crate is included for exporting telemetry data to an OpenTelemetry Collector, which can then forward the data to Azure Monitor. Direct Azure Monitor export from Rust applications is not supported.\n\n1. Create your main application with OpenTelemetry configuration. See the [azure_core_opentelemetry](https://docs.rs/azure_core_opentelemetry/latest/azure_core_opentelemetry/) documentation for details.\n\n1. Set the required environment variables and run your application:\n\n    ```bash\n    # Set Key Vault URL (replace with your actual Key Vault URL)\n    export AZURE_KEYVAULT_URL=\"https://mykeyvault.vault.azure.net/\"\n    \n    # Run the application\n    cargo run\n    ```\n\nAfter you configure OpenTelemetry in your application and run it, you can add custom instrumentation and monitor the telemetry data.\n\n## Export telemetry to Azure Monitor\n\nSince Rust doesn't have a direct Azure Monitor OpenTelemetry exporter, you need to implement an indirect approach to get your telemetry data into Azure Monitor. Here are the recommended methods:\n\n### Option 1: OpenTelemetry Collector (Recommended)\n\nThe OpenTelemetry Collector acts as a middle layer that can receive telemetry from your Rust application and forward it to Azure Monitor:\n\n1. **Deploy the OpenTelemetry Collector** in your environment (as a sidecar, agent, or gateway)\n2. **Configure your Rust application** to export to the Collector using OTLP (OpenTelemetry Protocol)\n3. **Configure the Collector** with the [Azure Monitor exporter](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/azuremonitorexporter) to forward data to Application Insights\n\n### Option 2: Azure Storage + Data Ingestion API\n\nFor scenarios where you need more control over data processing:\n\n1. **Export telemetry to Azure Storage** (Blob Storage or Data Lake)\n2. **Process the data** using Azure Functions, Logic Apps, or custom applications\n3. **Ingest processed data** into Azure Monitor using the [Logs Ingestion API](/azure/azure-monitor/logs/logs-ingestion-api-overview)\n\n### Option 3: Event Hubs Streaming\n\nFor real-time telemetry processing:\n\n1. **Stream telemetry to Azure Event Hubs** from your Rust application\n2. **Process events** using Azure Stream Analytics, Azure Functions, or custom consumers\n3. **Forward processed telemetry** to Azure Monitor or Application Insights\n\n## Customize telemetry data\n\nOpenTelemetry provides a flexible framework for customizing telemetry data to suit your application's needs. Use these strategies to enhance your telemetry:\n\n### Instrumenting your application code\n\nAdding custom instrumentation to your application code helps you correlate your business logic with Azure SDK operations. This correlation makes it easier to understand the complete flow of operations.\n\n| Technique | Purpose | Implementation |\n|-----------|---------|----------------|\n| **Custom spans for Azure operations** | Create a clear hierarchy that shows how application logic relates to Azure operations | Wrap Azure SDK calls by using OpenTelemetry span creation methods |\n| **Correlate application logic with SDK calls** | Connect business operations with underlying Azure SDK calls | Use span context to link business operations with triggered Azure service calls |\n| **Create diagnostic breadcrumbs** | Capture important context for telemetry across workflows | Add structured fields (user IDs, request IDs, business object identifiers) to spans |\n\n### Performance analysis\n\nOpenTelemetry provides detailed insights into Azure SDK performance patterns. These insights help you identify and resolve performance bottlenecks.\n\n| Analysis Type | What It Reveals | How to Use |\n|---------------|-----------------|------------|\n| **SDK operation duration** | How long different Azure operations take | Use span timing that OpenTelemetry captures automatically to identify slow operations |\n| **Service call bottlenecks** | Where your application spends time waiting for Azure responses | Compare timing across Azure services and operations to find performance issues |\n| **Concurrent operation patterns** | Overlap and dependencies between operations | Analyze telemetry data to understand parallelization opportunities when making multiple Azure calls |\n\n### Error diagnosis\n\nOpenTelemetry captures rich error context that goes beyond simple error messages. This context helps you understand not just what failed, but why and under what circumstances.\n\n**Understand SDK error propagation**: Trace how errors bubble up through your application code and the Azure SDK layers. This trace helps you understand the complete error path and identify the root cause.\n\n**Log transient vs. permanent failures**: Distinguish between temporary failures (like network timeouts that might succeed on retry) and permanent failures (like authentication errors that need configuration changes). This distinction helps you build resilient applications.\n\n## Understand logs, metrics, and alerts\n\nYour applications and services generate telemetry data to help you monitor their health, performance, and usage. Azure categorizes this telemetry into logs, metrics, and alerts.\n\nAzure offers four kinds of telemetry:\n\n| Telemetry type  | What it gives you                               | Where to find it for each service                 |\n| --------------- | ----------------------------------------------- | ------------------------------------------------- |\n| Metrics         | Numeric, time-series data (CPU, memory, etc.)   | **Metrics** in portal or `az monitor metrics` CLI |\n| Alerts          | Proactive notifications when thresholds hit     | **Alerts** in portal or `az monitor metrics alert` CLI |\n| Logs            | Text-based events and diagnostics (web, app)    | App Service **Logs**, Functions **Monitor**, Container Apps **Diagnostics** |\n| Custom logs     | Your own application telemetry via App Insights | Your Application Insights resource's **Logs (Trace)** table |\n\nPick the right telemetry for your question:\n\n| Scenario                                                                               | Use logs…                                         | Use metrics…                                       | Use alerts…                                           |\n| -------------------------------------------------------------------------------------- | ------------------------------------------------- | -------------------------------------------------- | ----------------------------------------------------- |\n| \"Did my web app start and respond?\"                                                     | App Service web-server logs (Logs)          | N/A                                                | N/A                                                   |\n| \"Is my function timing out or failing?\"                                                | Function invocation logs (Monitor)          | Function execution duration metric                 | Alert on \"Function Errors >0\"                         |\n| \"How busy is my service and can it scale?\"                                             | N/A                                               | Service throughput/CPU in Metrics             | Autoscale alert on CPU% > 70%                         |\n| \"What exceptions is my code throwing?\"                                                 | Custom Trace logs in Application Insights         | N/A                                                | Alert on \"ServerExceptions >0\"                        |\n| \"Have I exceeded my transaction or quota limits?\"                                      | N/A                                               | Quota-related metrics (Transactions, Throttling)   | Alert on \"ThrottlingCount >0\"                         |\n\n## View the telemetry data in Azure Monitor\n\nAfter setting up OpenTelemetry in your Rust application and configuring an intermediate export mechanism, you can view the telemetry data in Azure Monitor through Application Insights. Since Rust doesn't have direct Azure Monitor export capabilities, you'll need to implement one of these approaches:\n\n- **OpenTelemetry Collector**: Configure the [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/) to receive data from your Rust application and forward it to Azure Monitor\n- **Azure Storage integration**: Export telemetry to Azure Storage and use [Azure Monitor data ingestion APIs](/azure/azure-monitor/logs/logs-ingestion-api-overview) to import the data\n- **Event Hubs streaming**: Stream telemetry through Azure Event Hubs and process it for Azure Monitor ingestion\n\nOnce your telemetry data reaches Azure Monitor through one of these methods, you can analyze it:\n\n1. **Navigate to Application Insights** in the Azure portal:\n   ```bash\n   az monitor app-insights component show \\\n     --app $APP_INSIGHTS_NAME \\\n     --resource-group $RESOURCE_GROUP \\\n     --query \"{name:name,appId:appId,instrumentationKey:instrumentationKey}\"\n   ```\n\n1. **View traces and logs**:\n   - Go to **Application Insights** > **Transaction search**\n   - Look for traces with operation names like `get_keyvault_secrets`\n   - Check **Logs** section and run KQL queries:\n\n   ```kusto\n   traces\n   | where timestamp > ago(1h)\n   | where message contains \"Azure operations\" or message contains \"secrets\"\n   | order by timestamp desc\n   ```\n\n1. **View distributed traces**:\n   - Go to **Application Map** to see service dependencies\n   - Select **Performance** to see operation timing\n   - Use **End-to-end transaction details** to see complete request flows\n\n1. **Custom KQL queries for your Rust application**:\n   ```kusto\n   // View all custom logs from your Rust app\n   traces\n   | where customDimensions.[\"service.name\"] == \"rust-azure-app\"\n   | order by timestamp desc\n   \n   // View Azure SDK HTTP operations\n   dependencies\n   | where type == \"HTTP\"\n   | where target contains \"vault.azure.net\"\n   | order by timestamp desc\n   \n   // Monitor error rates\n   traces\n   | where severityLevel >= 3  // Warning and above\n   | summarize count() by bin(timestamp, 1m), severityLevel\n   | render timechart\n   ```\n\n## Monitor in real-time\n\nSet up live monitoring to see data as it arrives:\n\n```bash\n# Stream live logs (requires Azure CLI)\naz monitor app-insights events show \\\n  --app $APP_INSIGHTS_NAME \\\n  --resource-group $RESOURCE_GROUP \\\n  --event traces \\\n  --start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%S)\n```\n\n## Cost optimization\n\nYou can significantly reduce your [cost for Azure Monitor](/azure/azure-monitor/fundamentals/cost-usage) by understanding [best practices](/azure/azure-monitor/fundamentals/best-practices-cost) for configuration options and opportunities to reduce the amount of data Azure Monitor collects.\n\nKey strategies for Rust applications:\n\n- **Use appropriate log levels**: Configure OpenTelemetry log levels appropriately for production to reduce volume\n- **Implement sampling**: Configure OpenTelemetry sampling for high-volume applications\n- **Filter sensitive data**: Avoid logging secrets, tokens, or large payloads that increase costs\n- **Monitor data ingestion**: Regularly review your Application Insights data usage and costs\n\n## Resources and next steps\n\n- [Azure SDK for Rust guidelines](https://azure.github.io/azure-sdk/rust_introduction.html)\n- [OpenTelemetry Rust documentation](https://docs.rs/opentelemetry/latest/opentelemetry/)\n- [Azure Monitor service](/azure/azure-monitor)\n"
  },
  {
    "path": "articles/rust/sdk/overview.md",
    "content": "---\ntitle: Access Azure services using Azure SDK for Rust crates\ndescription: Learn how to access Azure services using Azure SDK for Rust crates. Build secure, scalable Rust apps with Azure—get started today.\nms.date: 10/20/2025\nms.topic: overview\nms.service: azure-rust\nms.custom: devx-track-rust\n---\n\n# What are Azure SDK for Rust crates?\n\nAzure SDK for Rust crates enable Rust applications to access Azure services. These client libraries provide a consistent, idiomatic experience, making it easier to build secure and scalable cloud solutions with Rust and Azure.\n\n[Crates] | [API reference documentation] | [Source code] \n\n## Key concepts for Azure SDK for Rust crates\n\n- **Idiomatic Rust**: Built with Rust best practices and conventions.\n- **Async support**: Fully async APIs with pluggable runtime support (defaulting to tokio).\n- **Type safety**: Uses Rust's type system for compile-time safety.\n- **Thread safety**: All client instance methods are thread-safe and independent of each other.\n- **Memory safety**: Zero-cost abstractions with no garbage collection overhead.\n- **Modular design**: Use only the crates you need.\n- **Unified configuration**: Configure service clients, logging, and retries with [`ClientOptions`][Ref doc - core - ClientOptions].\n- **Consistent error handling**: Handle errors consistently across services with [`azure_core::Error`][Ref doc - core - Error].\n- **Response handling**: Access detailed HTTP response data with [`Response<T>`][Ref doc - core - Response].\n- **Pagination support**: Work with paginated APIs by using [`Pager<T>`][Ref doc - core - Pager] for async streams.\n- **Long-running operations**: Wait for long-running operation (LRO) with [`Poller<T>`][Ref doc - core - Poller]\n- **Authentication abstractions**: Standardized credential management via [`TokenCredential`][Ref doc - core - TokenCredential].\n\n## Rust guidance\n\nThe [Azure SDK design guidelines for Rust](https://azure.github.io/azure-sdk/rust_introduction.html) outline the core design principles and patterns that all Azure SDK crates follow. These guidelines ensure that SDKs are consistent, intuitive, and idiomatic for Rust, making it easier for developers to adopt and use Azure services. By adhering to these standards, the Azure SDK crates provide a familiar and predictable experience, with clear patterns for authentication, error handling, and client configuration that align with the broader Azure SDK ecosystem.\n\n## Differences between crates and REST APIs\n\nUse the following information to understand when to use each type of access.\n\n* The Azure SDK crates are the preferred method for accessing your Azure service. These crates abstract away the boilerplate code required to manage cloud-based Azure platform REST requests such as authentication, retries, and logging.\n* Azure REST APIs are the preferred method if you are:\n  * Working with services that don't have Azure crates available yet. Migrate your code to use Azure SDK crates when the crates become available.\n  * Wanting to make REST calls directly because you don't want to use the entire crate to use a single REST API or you want deeper control over the HTTP requests.\n\n## Rust version\n\nThe Azure SDK crates are currently in **beta**. While the APIs are stabilizing and the crates are suitable for development and testing, some breaking changes might occur before the 1.0 release. These crates support the most commonly used Azure services, and we regularly add more based on [community feedback][AZURE SDK FOR RUST issues] and demand.\n\n## Azure SDK for Rust crates\n\nUse the [index of Azure SDK for Rust crates](../azure-sdk-library-package-index.md) to find the available crates, their documentation, and source code.\n\n## Next steps\n\n- [Install the Azure SDK for Rust crates](./installation.md)\n[!INCLUDE [common resources](../includes/resources.md)]\n\n\n[API reference documentation]: https://docs.rs/releases/search?query=azure_\n[Crates]: https://crates.io/users/azure-sdk?sort=recent-downloads\n[Source code]: https://github.com/Azure/azure-sdk-for-rust/tree/main/sdk/\n[AZURE SDK FOR RUST issues]: https://github.com/Azure/azure-sdk-for-rust/issues\n\n[Ref doc - core - ClientOptions]:https://docs.rs/azure_core/latest/azure_core/http/struct.ClientOptions.html\n[Ref doc - core - Error]: https://docs.rs/azure_core/latest/azure_core/struct.Error.html\n[Ref doc - core - Response]: https://docs.rs/azure_core/latest/azure_core/http/struct.Response.html\n[Ref doc - core - Pager]: https://docs.rs/azure_core/latest/azure_core/http/pager/index.html\n[Ref doc - core - TokenCredential]: https://docs.rs/azure_core/latest/azure_core/credentials/trait.TokenCredential.html\n[Ref doc - core - Poller]: https://docs.rs/azure_core/latest/azure_core/http/poller/struct.Poller.html\n"
  },
  {
    "path": "articles/rust/sdk/use-crates.md",
    "content": "---\ntitle: Use Azure SDK for Rust crates to access Azure services\ndescription: Get started with Azure SDK for Rust crates. Learn authentication, explore supported Azure services, and follow best practices with code examples. Build secure Azure applications in Rust—start now.\nms.date: 10/10/2025\nms.topic: concept-article\nms.service: azure-rust\nms.custom: devx-track-rust\n---\n\n# Use Azure SDK for Rust crates to access Azure services\n\nThe Azure SDK for Rust crates help you access Azure services from Rust applications. This article explains how to use these crates, including authentication, supported services, and best practices.\n\n[Crates] | [API reference documentation] | [Source code]\n\n## Prerequisites to develop with crates\n\n- Rust 1.85 or later. The version is specified in the Azure SDK for Rust crates [Cargo.toml][Azure SDK main Cargo.toml].\n- An Azure subscription. You can [create one for free][Free Subscription].\n- [Azure CLI]\n- [Azure Developer CLI]\n- [Azure SDK for Rust crates](./installation.md)\n\n> [!TIP]\n> For the best development experience, ensure you have the latest stable version of Rust installed. \n\n\n## Provide authentication credentials\n\nThe Azure crates need credentials to authenticate to Microsoft Entra ID. Azure services provide different authentication methods for connection. We recommend using the [`azure_identity`][Crate - identity] crate for authentication. Learn more about [authentication for Azure SDK for Rust crates](./authentication/overview.md).\n\n## Client objects\n\nYou use client objects to interact with Azure services. Each client object, from a service's crate, corresponds to a specific Azure service and provides methods to perform operations on that service. For example, [`azure_security_keyvault_secrets::SecretClient`][Ref doc - secret - SecretClient] is used to interact with Azure Key Vault secrets.\n\nWhen you create the client objects, you can provide a [`ClientOptions`][Ref doc - core - ClientOptions] parameter for customizing the interactions with the service. Use `ClientOptions` to set things like timeouts, retry policies, and other configurations.\n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-docs/examples/authenticate_azure_cli.rs\":::\n\n## Error handling\n\nWhen a service call fails, the returned [Response][Ref doc - core - Response] contains the [`status`][Ref doc - core - http status code].  \n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-docs/examples/error_handling.rs\":::\n\n## Page results\n\nIf a service call returns multiple values in pages, it returns `Result<Pager<T>>` as a [`Result`][Ref doc - core - Result] of [`Pager`][Ref doc - core - Pager]. \n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-docs/examples/page_results.rs\":::\n\n## Pagination to process each page of items\n\nTo iterate through all items in a paginated response, use the [`into_pages()`][Ref doc - core - into_pages] method on the returned [`Pager`][Ref doc - core - Pager]. This method returns an async stream of pages as a [`PageIterator`][Ref doc - core - PageIterator], so you can process each page as it becomes available. \n\n:::code language=\"rust\" source=\"~/../azure-sdk-for-rust-docs/examples/paging_all_items.rs\":::\n\n## Sample code\n\nThe code shown in this article is available on <https://github.com/azure-samples/azure-sdk-for-rust-docs/>.\n\n## Next steps\n\n[!INCLUDE [common resources](../includes/resources.md)]\n\n\n[API reference documentation]: https://docs.rs/releases/search?query=azure_\n[Crates]: ../azure-sdk-library-package-index.md\n[Source code]: https://github.com/Azure/azure-sdk-for-rust/tree/main/sdk/\n\n[Azure SDK main Cargo.toml]: https://github.com/Azure/azure-sdk-for-rust/blob/main/Cargo.toml\n\n[Ref doc - secret - SecretClient]: https://docs.rs/azure_security_keyvault_secrets/latest/azure_security_keyvault_secrets/\n[Ref doc - core - ClientOptions]:https://docs.rs/azure_core/latest/azure_core/http/struct.ClientOptions.html\n[Ref doc - core - Response]: https://docs.rs/azure_core/latest/azure_core/http/response/struct.Response.html\n[Ref doc - core - http status code]: https://docs.rs/azure_core/latest/azure_core/http/enum.StatusCode.html\n[Ref doc - core - Result]: https://docs.rs/azure_core/latest/azure_core/type.Result.html\n[Ref doc - core - Pager]: https://docs.rs/azure_core/latest/azure_core/http/pager/type.Pager.html\n[Ref doc - core - into_pages]: https://docs.rs/azure_core/latest/azure_core/http/pager/struct.ItemIterator.html#method.into_pages\n[Ref doc - core - PageIterator]: https://docs.rs/azure_core/latest/azure_core/http/pager/struct.PageIterator.html\n\n[Crate - identity]: https://crates.io/crates/azure_identity\n\n[Free Subscription]: https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn/\n\n[Azure Developer CLI]: /azure/developer/azure-developer-cli\n[Azure CLI]: /cli/azure/"
  },
  {
    "path": "articles/rust/what-is-azure-for-rust-developers.md",
    "content": "---\ntitle: \"Azure for Rust Developers: Build and Deploy Cloud Applications\"\ndescription: Learn how Azure empowers Rust developers to build, deploy, and manage cloud applications with high performance and reliability.\nms.topic: overview\nms.date: 09/02/2025\nms.custom: devx-track-rust\nms.service: azure-rust\n#customer intent: As a Rust developer, I want to understand how Azure supports Rust applications so that I can build and deploy high-performance cloud solutions. \n---\n\n# Azure for Rust developers: Build cloud applications\n\nAzure is a cloud platform that empowers Rust developers to build, deploy, and manage high-performance applications. Learn how Azure's hosting options and services can enhance your Rust development experience.\n\nIf you're new to cloud development, explore these resources to get familiar with Azure:\n\n- [Azure Architecture Center](/azure/architecture/)\n- [Azure terminology](/azure/cloud-adoption-framework/ready/considerations/fundamental-concepts)\n- [Ten design principles for Azure applications](/azure/architecture/guide/design-principles/)\n- [Cloud design patterns](/azure/architecture/patterns/)\n\n## Rust in the cloud ecosystem: Benefits and use cases\n\nRust is gaining momentum for cloud applications thanks to its performance, reliability, and safety guarantees. While cloud platforms traditionally focused on JavaScript, Python, Java, and .NET, Rust offers compelling advantages:\n\n- **Performance with safety**: Zero-cost abstractions and memory safety make Rust ideal for high-performance cloud services\n- **Low resource usage**: Minimal runtime overhead and efficient memory management reduce cloud costs\n- **Cross-platform compatibility**: Write once, deploy anywhere capabilities work seamlessly with cloud-native approaches\n- **Growing ecosystem**: Robust libraries for web servers, async I/O, serialization, and more\n\nAzure provides multiple integration points for Rust applications through both the [Azure SDK for Rust](https://github.com/Azure/azure-sdk-for-rust) and standard protocols like HTTP for REST APIs. Use Azure services with your Rust applications regardless of where they're hosted.\n\n> [!NOTE]\n> The Azure SDK for Rust requires Rust edition 2021 or later and supports Rust 1.67.0 or newer versions.\n\n## Rust and other languages: Unique advantages\n\nAzure supports many programming languages for cloud development. While Rust is still emerging in the Azure ecosystem, it brings unique advantages:\n\n- Memory safety without garbage collection\n- Thread safety and powerful concurrency\n- High performance with low resource usage\n- Strong type system and ownership model\n- Cross-platform compatibility\n\nAccess Azure services from your Rust applications through the Azure SDK for Rust, REST APIs, or custom handlers for specific services.\n\n## Azure services\n\nAzure offers a vast range of cloud services that you can use independently or together in your Rust applications.\n\nKey service categories for Rust developers include:\n\n- [Hosting](/azure/developer/intro/hosting-apps-on-azure)\n- [Authentication and authorization](/azure/?product=identity)\n- [Containers](/azure/?product=containers)\n- [Databases](/azure/?product=databases)\n- [Storage](/azure/?product=storage)\n- [Search](/azure/search/)\n- [AI and Cognitive services](/azure/?product=ai-machine-learning)\n- [Security](/azure/?product=security)\n- [DevOps](/azure/?product=devops)\n\n## Create Azure services: Quickstart Center guide\n\nStart your Azure journey by [creating a free account](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn), then visit the [Quickstart Center](https://portal.azure.com/#blade/Microsoft_Azure_Resources/QuickstartCenterBlade) in the Azure portal.\n\nFind connection information on each service's page in the Azure portal to access your resources from your code.\n\n### Pricing tiers\n\nPricing tiers determine how your resource is billed. Use the [Azure pricing calculator](https://azure.microsoft.com/pricing/calculator) to estimate costs for your resources.\n\n### Free tier resources\n\nWhen using the free (F0) pricing tier, keep these limitations in mind:\n\n- Your subscription may allow only one free resource per service. If you can't create a free resource, you may already have one in your subscription\n- Free tiers have limits on transactions per second (TPS) or transactions per month (TPM)\n- Exceeding these limits results in HTTP errors with quota-exceeded messages\n- For higher-volume applications, create multiple resources and use a single endpoint to distribute traffic\n\n## Set up your development environment\n\nSet up these tools for the best Rust on Azure development experience:\n\n- [Visual Studio Code](https://code.visualstudio.com/) with the following extensions:\n    - [Azure Tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-node-azure-pack) extension\n    - [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) for Rust language support\n- [Git](https://git-scm.com/)\n- [Rust toolchain](https://www.rust-lang.org/tools/install) - use the latest stable release\n- [Azure CLI](/cli/azure/install-azure-cli) for Azure resource management\n- Local development tools:\n  - [Azure Functions Core Tools](https://github.com/Azure/azure-functions-core-tools) for local Functions development\n  - [Docker](https://www.docker.com/) for container development and testing\n\n## Use Azure SDK for Rust crates\n\nAccess Azure services programmatically with the [Azure SDK for Rust crates](https://crates.io/users/azure-sdk?sort=recent-downloads), where each crate provides service-specific connection capabilities.\n\nThese crates offer an idiomatic Rust API following the [Azure SDK Guidelines](https://azure.github.io/azure-sdk/rust_introduction.html) with features like:\n\n- Authentication with Microsoft Entra ID (formerly Azure AD)\n- Automatic retries with exponential back-off\n- Logging and distributed tracing\n- Cancellation support\n- Full async/await support\n\nRun your Rust code anywhere: locally, in hybrid environments, or in the cloud—while interacting with Azure services through the SDK.\n\n## Deploy Rust apps to Azure\n\nWhen hosting Rust applications on Azure, choose between two main approaches:\n\n1. **Compile to binaries**: Build your Rust application into native binaries and deploy directly to appropriate hosting services\n\n2. **Containerization**: Package your application in containers for deployment to container-based Azure services\n\nChoose from these hosting options based on your application needs:\n\n| Service | Deployment approach | Best suited for |\n|---------|---------------------|----------------|\n| [Azure App Service](/azure/app-service/) | Custom container | Web applications, APIs |\n| [Azure Functions](/azure/azure-functions/) | [Custom handlers](/azure/azure-functions/functions-custom-handlers) | Event-driven, serverless workloads |\n| [Azure Container Apps](/azure/container-apps/) | Container | Microservices, containerized applications |\n\n## Try a Rust quickstart\n\nGet started with Rust on Azure using these quickstarts and tutorials:\n\n- [Create a serverless Azure Function app for Rust with Visual Studio Code](/azure/azure-functions/create-first-function-vs-code-other?tabs=rust)\n\n## Next steps\n\n- [Azure SDK for Rust GitHub repository](https://github.com/Azure/azure-sdk-for-rust)\n"
  },
  {
    "path": "articles/terraform/authenticate-to-azure-with-managed-identity-for-azure-services.md",
    "content": "---\ntitle: Authenticate Terraform using Managed Identity for Azure services\ndescription: Learn the various options to configure and authenticate Terraform to Azure using Managed Identity for Azure services\nkeywords: azure devops terraform cli powershell authentication microsoft account subscription environment variables provider block\nms.topic: how-to\nms.date: 06/20/2024\nms.custom: devx-track-terraform\n# Customer intent: I want to authenticate Terraform to Azure.\n---\n\n# Authenticate Terraform using Managed Identity for Azure services\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\n[Managed identities for Azure resources](/entra/identity/managed-identities-azure-resources/overview) is used to authenticate to Azure Active Directory. HashiCorp recommends using either a Service Principal or managed identity if you're running Terraform in a non-interactive manner. There are two types of managed identities: *system-assigned* and *user-assigned*. In this article, you learn how to use system-assigned identities.\n\n## Define a system-assigned managed identity\n\nTo use a system-assigned managed identity, use the following steps:\n\n1. Specify the `identity` block and set `type` to `SystemAssigned`.\n\n    ```terraform\n    resource \"azurerm_linux_virtual_machine\" \"example\" {\n      # ...\n    \n      identity {\n        type = \"SystemAssigned\"\n      }\n    }\n    ```\n\n1. Grant the `Contributor` role to the identity.\n\n    ```terraform\n    data \"azurerm_subscription\" \"current\" {}\n\n    data \"azurerm_role_definition\" \"contributor\" {\n      name = \"Contributor\"\n    }\n    \n    resource \"azurerm_role_assignment\" \"example\" {\n      scope              = data.azurerm_subscription.current.id\n      role_definition_name = \"Contributor\"\n      principal_id       = azurerm_linux_virtual_machine.example.identity[0].principal_id\n    }\n    ```\n\n1. Configure with environment variables, specifying your Azure credentials.\n\n    ```bash\n    export ARM_USE_MSI=true\n    export ARM_SUBSCRIPTION_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n    export ARM_TENANT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n    ```\n\n## Example: Create a virtual machine with a managed identity\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code.\n\n    ```terraform\n    terraform {\n      required_version = \">=0.12\"\n    \n      required_providers {\n        azapi = {\n          source  = \"azure/azapi\"\n          version = \"~>1.5\"\n        }\n        azurerm = {\n          source  = \"hashicorp/azurerm\"\n          version = \"~>2.0\"\n        }\n        random = {\n          source  = \"hashicorp/random\"\n          version = \"~>3.0\"\n        }\n      }\n    }\n    \n    provider \"azurerm\" {\n      features {}\n    }\n    ```\n\n1. Create a file named `main.tf` and insert the following code:\n\n    ```terraform\n    resource \"random_pet\" \"rg_name\" {\n      prefix = var.resource_group_name_prefix\n    }\n    \n    resource \"azurerm_resource_group\" \"rg\" {\n      location = var.resource_group_location\n      name     = random_pet.rg_name.id\n    }\n    \n    data \"azurerm_subscription\" \"current\" {}\n    \n    resource \"azurerm_virtual_network\" \"example\" {\n      name                = \"myVnet\"\n      address_space       = [\"10.0.0.0/16\"]\n      location            = azurerm_resource_group.rg.location\n      resource_group_name = azurerm_resource_group.rg.name\n    }\n    \n    resource \"azurerm_subnet\" \"example\" {\n      name                 = \"mySubnet\"\n      resource_group_name  = azurerm_resource_group.rg.name\n      virtual_network_name = azurerm_virtual_network.example.name\n      address_prefixes     = [\"10.0.2.0/24\"]\n    }\n    \n    resource \"azurerm_network_interface\" \"example\" {\n      name                = \"myNic\"\n      location            = azurerm_resource_group.rg.location\n      resource_group_name = azurerm_resource_group.rg.name\n    \n      ip_configuration {\n        name                          = \"internal\"\n        subnet_id                     = azurerm_subnet.example.id\n        private_ip_address_allocation = \"Dynamic\"\n      }\n    }\n    \n    resource \"azurerm_linux_virtual_machine\" \"example\" {\n      name                = \"myVm\"\n      resource_group_name = azurerm_resource_group.rg.name\n      location            = azurerm_resource_group.rg.location\n      size                = \"Standard_F2\"\n      network_interface_ids = [\n        azurerm_network_interface.example.id,\n      ]\n    \n      computer_name  = \"hostname\"\n      admin_username = var.username\n    \n      admin_ssh_key {\n        username   = var.username\n        public_key = azapi_resource_action.ssh_public_key_gen.output.publicKey\n      }\n    \n      identity {\n        type = \"SystemAssigned\"\n      }\n    \n      os_disk {\n        caching              = \"ReadWrite\"\n        storage_account_type = \"Standard_LRS\"\n      }\n    \n      source_image_reference {\n        publisher = \"Canonical\"\n        offer     = \"0001-com-ubuntu-server-jammy\"\n        sku       = \"22_04-lts\"\n        version   = \"latest\"\n      }\n    }\n    \n    data \"azurerm_role_definition\" \"contributor\" {\n      name = \"Contributor\"\n    }\n    \n    resource \"azurerm_role_assignment\" \"example\" {\n      scope              = data.azurerm_subscription.current.id\n      role_definition_name = \"Contributor\"\n      principal_id       = azurerm_linux_virtual_machine.example.identity[0].principal_id\n    }\n    ```\n\n1. Create a file named `ssh.tf` and insert the following code.\n\n    ```terraform\n    resource \"random_pet\" \"ssh_key_name\" {\n      prefix    = \"ssh\"\n      separator = \"\"\n    }\n    \n    resource \"azapi_resource_action\" \"ssh_public_key_gen\" {\n      type        = \"Microsoft.Compute/sshPublicKeys@2022-11-01\"\n      resource_id = azapi_resource.ssh_public_key.id\n      action      = \"generateKeyPair\"\n      method      = \"POST\"\n    \n      response_export_values = [\"publicKey\", \"privateKey\"]\n    }\n    \n    resource \"azapi_resource\" \"ssh_public_key\" {\n      type      = \"Microsoft.Compute/sshPublicKeys@2022-11-01\"\n      name      = random_pet.ssh_key_name.id\n      location  = azurerm_resource_group.rg.location\n      parent_id = azurerm_resource_group.rg.id\n    }\n    \n    output \"key_data\" {\n      value = azapi_resource_action.ssh_public_key_gen.output.publicKey\n    }\n        ```\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    ```terraform\n    variable \"resource_group_location\" {\n      type        = string\n      description = \"Location of the resource group.\"\n      default     = \"eastus\"\n    }\n    \n    variable \"resource_group_name_prefix\" {\n      type        = string\n      description = \"Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription.\"\n      default     = \"rg\"\n    }\n    \n    variable \"username\" {\n      type        = string\n      description = \"The username for the local account that will be created on the new VM.\"\n      default     = \"azureadmin\"\n    }\n    ```\n\n1. Create a file named `outputs.tf` and insert the following code:\n\n    ```terraform\n    output \"resource_group_name\" {\n      value = azurerm_resource_group.rg.name\n    }\n    \n    output \"azurerm_linux_virtual_machine_name\" {\n      value = azurerm_linux_virtual_machine.example.name\n    }\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Your first Terraform project: Create an Azure resource group](create-resource-group.md)\n"
  },
  {
    "path": "articles/terraform/authenticate-to-azure-with-microsoft-account.md",
    "content": "---\ntitle: Authenticate to Azure with a Microsoft account\ndescription: Learn how to authenticate Terraform to Azure with a Microsoft account\nkeywords: azure devops terraform cli powershell authentication microsoft account subscription environment variables provider block\nms.topic: how-to\nms.date: 06/20/2024\nms.custom: devx-track-terraform\n# Customer intent: I want to authenticate Terraform to Azure.\n---\n\n# Authenticate to Azure with a Microsoft account\n\nA Microsoft account is a username (associated with an email and its credentials) that is used to sign in to Microsoft services - such as Azure. A Microsoft account can be associated with one or more Azure subscriptions, with one of those subscriptions being the default.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Sign in to Azure interactively using a Microsoft account\n> * List the account's associated Azure subscriptions (including the default)\n> * Set the current subscription\n\n## Steps to authenticate with Microsoft account\n\n1. Open a command line that has access to the Azure CLI.\n\n1. Run [az login](/cli/azure/account#az-login) without any parameters and follow the instructions to sign in to Azure.\n\n    ```azurecli\n    az login\n    ```\n\n    **Key points:**\n\n    - Upon successful sign in, `az login` displays a list of the Azure subscriptions associated with the logged-in Microsoft account, including the default subscription.\n\n1. To confirm the current Azure subscription, run [az account show](/cli/azure/account#az-account-show).\n\n    ```azurecli\n    az account show\n    ```\n\n1. To view all the Azure subscription names and IDs for a specific Microsoft account, run [az account list](/cli/azure/account#az-account-list). \n\n    ```azurecli\n    az account list --query \"[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}\" --output Table\n    ```\n\n    **Key points:**\n\n    - Replace the `<microsoft_account_email>` placeholder with the Microsoft account email address whose Azure subscriptions you want to list.\n    - With a Live account - such as a Hotmail or Outlook - you might need to specify the fully qualified email address. For example, if your email address is `admin@hotmail.com`, you might need to replace the placeholder with `live.com#admin@hotmail.com`.\n\n1. To use a specific Azure subscription, run [az account set](/cli/azure/account#az-account-set).\n\n    ```azurecli\n    az account set --subscription \"<subscription_id_or_subscription_name>\"\n    ```\n\n    **Key points:**\n\n    - Replace the `<subscription_id_or_subscription_name>` placeholder with the ID or name of the subscription you want to use.\n    - Calling `az account set` doesn't display the results of switching to the specified Azure subscription. However, you can use `az account show` to confirm that the current Azure subscription has changed.\n    - If you run the `az account list` command from the previous step, you see that the default Azure subscription has changed to the subscription you specified with `az account set`.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Verify the results](./authenticate-to-azure.md#3-verify-the-results)\n"
  },
  {
    "path": "articles/terraform/authenticate-to-azure-with-service-principle.md",
    "content": "---\ntitle: Authenticate to Azure with service principal\ndescription: Learn how to authenticate Terraform to Azure with a service principal\nkeywords: azure devops terraform cli powershell authentication microsoft account subscription environment variables provider block\nms.topic: how-to\nms.date: 06/20/2024\nms.custom: devx-track-terraform, devx-track-azurepowershell\n# Customer intent: I want to authenticate Terraform to Azure.\n---\n\n# Authenticate to Azure with service principal\n\nThis article explains how to authenticate Terraform to Azure with a service principal.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create a service principal\n> * Specifying service principal credentials in environment variables\n> * Specify service principal credentials in a Terraform provider block\n\n## Create a service principal\n\nIf you don't have access to a service principal, continue with this section to create a new service principal. If you have a service principal you can use, skip to the section, [Specify service principal credentials](#specify-service-principal-credentials).\n\nAutomated tools that deploy or use Azure services - such as Terraform - should always have restricted permissions. Instead of having applications sign in as a fully privileged user, Azure offers service principals.\n\nThe most common pattern is to interactively sign in to Azure, create a service principal, test the service principal, and then use that service principal for future authentication (either interactively or from your scripts).\n\n### [Bash](#tab/bash)\n\n1. To create a service principal, sign in to Azure. After [authenticating to Azure via a Microsoft account](authenticate-to-azure-with-microsoft-account.md), return here.\n\n1. If you're creating a service principal from Git Bash, set the `MSYS_NO_PATHCONV` environment variable. (This step isn't necessary if you're using Cloud Shell.)\n\n    ```bash\n    export MSYS_NO_PATHCONV=1    \n    ```\n\n    **Key points:**\n\n    - You can set the `MSYS_NO_PATHCONV` environment variable globally (for all terminal sessions) or locally (for just the current session). As creating a service principal isn't something you do often, the sample sets the value for the current session. To set this environment variable globally, add the setting to the `~/.bashrc` file.\n\n1. To create a service principal, run [az ad sp create-for-rbac](/cli/azure/ad/sp?#az-ad-sp-create-for-rbac).\n\n    ```azurecli\n    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>\n    ```\n\n    **Key points:**\n\n    - You can replace the `<service-principal-name>` with a custom name for your environment or omit the parameter entirely. If you omit the parameter, the service principal name is generated based on the current date and time.\n    - Upon successful completion, `az ad sp create-for-rbac` displays several values. The `appId`, `password`, and `tenant` values are used in the next step.\n    - The password can't be retrieved if lost. As such, you should store your password in a safe place. If you forget your password, you can [reset the service principal credentials](/cli/azure/create-an-azure-service-principal-azure-cli#reset-credentials).\n    - For this article, a service principal with a **Contributor** role is being used. For more information about Role-Based Access Control (RBAC) roles, see [RBAC: Built-in roles](/azure/active-directory/role-based-access-built-in-roles).\n    - The output from creating the service principal includes sensitive credentials. Be sure that you don't include these credentials in your code or check the credentials into your source control.\n    - For more information about options when creating a service principal with the Azure CLI, see the article [Create an Azure service principal with the Azure CLI](/cli/azure/create-an-azure-service-principal-azure-cli?).\n\n### [Azure PowerShell](#tab/azure-powershell)\n\n1. Open a PowerShell prompt.\n\n1. Run [Connect-AzAccount](/powershell/module/az.accounts/Connect-AzAccount).\n\n    ```powershell\n    Connect-AzAccount\n    ```\n\n    **Key points:**\n\n    - Upon successful sign in, `Connect-AzAccount` displays information about the default subscription.\n    - Make note of the `TenantId` as it's needed to use the service principal.\n\n1. To confirm the current Azure subscription, run [Get-AzContext](/powershell/module/az.accounts/get-azcontext).\n\n    ```powershell\n    Get-AzContext\n    ```\n\n1. To view all enabled Azure subscriptions for the logged-in Microsoft account, run [Get-AzSubscription](/powershell/module/az.accounts/get-azsubscription).\n\n    ```azurecli\n    Get-AzSubscription\n    ```\n\n1. To use a specific Azure subscription, run [Set-AzContext](/powershell/module/az.accounts/set-azcontext).\n\n    ```powershell\n    Set-AzContext -Subscription \"<subscription_id_or_subscription_name>\"\n    ```\n    \n    **Key points:**\n    \n    - Replace the `<subscription_id_or_subscription_name>` placeholder with the ID or name of the subscription you want to use.\n\n1. Run [New-AzADServicePrincipal](/powershell/module/az.resources/new-azadserviceprincipal) to create a new service principal.\n\n    ```powershell\n    $sp = New-AzADServicePrincipal -DisplayName <service_principal_name> -Role \"Contributor\"\n    ```\n\n    **Key points:**\n\n    - You can replace the `<service-principal-name>` with a custom name for your environment or omit the parameter entirely. If you omit the parameter, the service principal name is generated based on the current date and time.\n    - The **Contributor** role is being used. For more information about Role-Based Access Control (RBAC) roles, see [RBAC: Built-in roles](/azure/active-directory/role-based-access-built-in-roles).\n\n1. Display the service principal ID.\n\n    ```powershell\n    $sp.AppId\n    ```\n\n    **Key points:**\n\n    - Make note of the service principal application ID as it's needed to use the service principal.\n\n1. Get the autogenerated password to text.\n\n    ```powershell\n    $sp.PasswordCredentials.SecretText\n    ```\n\n    **Key points:**\n\n    - Make note of the password as it's needed to use the service principal.\n    - The password can't be retrieved if lost. As such, you should store your password in a safe place. If you forget your password, you can [reset the service principal credentials](/powershell/azure/create-azure-service-principal-azureps#reset-credentials).\n\n---\n\n## Specify service principal credentials\n\nThere are a couple of ways to specify your service principal credentials. However, for security reasons, we suggest not storing credentials in the provider block. That technique is shown only for completeness and testing purposes.\n\n- [Specify service principal credentials in environment variables](#specify-service-principal-credentials-in-environment-variables)\n- [Specify service principal credentials in a Terraform provider block](#specify-service-principal-credentials-in-a-terraform-provider-block)\n\n### Specify service principal credentials in environment variables\n\nOnce you create a service principal, you can specify its credentials to Terraform via environment variables.\n\n#### [Bash](#tab/bash)\n\n1. Edit the `~/.bashrc` file by adding the following environment variables.\n\n    ```bash\n    export ARM_SUBSCRIPTION_ID=\"<azure_subscription_id>\"\n    export ARM_TENANT_ID=\"<azure_subscription_tenant_id>\"\n    export ARM_CLIENT_ID=\"<service_principal_appid>\"\n    export ARM_CLIENT_SECRET=\"<service_principal_password>\"\n    ```\n\n1. To execute the `~/.bashrc` script, run `source ~/.bashrc` (or its abbreviated equivalent `. ~/.bashrc`). You can also exit and reopen Cloud Shell for the script to run automatically.\n\n    ```bash\n    . ~/.bashrc\n    ```\n\n1. Once the environment variables have been set, you can verify their values as follows:\n\n    ```bash\n    printenv | grep ^ARM*\n    ```\n\n    [!INCLUDE [environment-variables-notes.md](./includes/environment-variables-notes.md)]\n\n1. Skip to the section, [Next steps](#next-steps)\n\n#### [Azure PowerShell](#tab/azure-powershell)\n\n1. To set the environment variables within a specific PowerShell session, use the following code. Replace the placeholders with the appropriate values for your environment.\n\n    ```powershell\n    $env:ARM_CLIENT_ID=\"<service_principal_app_id>\"\n    $env:ARM_SUBSCRIPTION_ID=\"<azure_subscription_id>\"\n    $env:ARM_TENANT_ID=\"<azure_subscription_tenant_id>\"\n    $env:ARM_CLIENT_SECRET=\"<service_principal_password>\"\n    ```\n\n1. Run the following PowerShell command to verify the Azure environment variables:\n\n    ```powershell\n    gci env:ARM_*\n    ```\n\n1. To set the environment variables for every PowerShell session, [create a PowerShell profile](/powershell/module/microsoft.powershell.core/about/about_profiles) and set the environment variables within your profile.\n\n    [!INCLUDE [environment-variables-notes.md](./includes/environment-variables-notes.md)]\n\n1. Skip to the section, [Next steps](#next-steps)\n\n---\n\n### Specify service principal credentials in a Terraform provider block\n\n> [!CAUTION]\n> The ability to specify your Azure subscription credentials in a Terraform configuration file can be convenient - especially when testing. However, it isn't advisable to store credentials in a clear-text file that can be viewed by non-trusted individuals.\n\nThe Azure provider block defines syntax that allows you to specify your Azure subscription's authentication information.\n\n```terraform\nterraform {\n  required_providers {\n    azurerm = {\n      source = \"hashicorp/azurerm\"\n      version = \"~>3.0\"\n    }\n  }\n}\n\nprovider \"azurerm\" {\n  features {}\n\n  subscription_id   = \"<azure_subscription_id>\"\n  tenant_id         = \"<azure_subscription_tenant_id>\"\n  client_id         = \"<service_principal_appid>\"\n  client_secret     = \"<service_principal_password>\"\n}\n\n# Your code goes here\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Verify the results](authenticate-to-azure.md#3-verify-the-results)\n"
  },
  {
    "path": "articles/terraform/authenticate-to-azure.md",
    "content": "---\ntitle: Authenticate Terraform to Azure\ndescription: Learn the various options to authenticate to Azure with a Microsoft Account\nkeywords: azure devops terraform cli powershell authentication microsoft account subscription environment variables provider block\nms.topic: how-to\nms.date: 06/20/2024\nms.custom: devx-track-terraform\n# Customer intent: I want to authenticate Terraform to Azure.\n---\n\n# Authenticate Terraform to Azure\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nTo use Terraform commands against your Azure subscription, you must first authenticate Terraform to that subscription. This article covers some common scenarios for authenticating to Azure.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * See a list of available authentication methods.\n> * Select an authentication method.\n> * Verify that you're authenticated.\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Authenticate Terraform to Azure\n\nTerraform only supports authenticating to Azure with the Azure CLI. Authenticating using Azure PowerShell isn't supported. Therefore, while you can use the Azure PowerShell module when doing your Terraform work, you first need to authenticate to Azure using the Azure CLI.\n\n- [Authenticate with a Microsoft account using Cloud Shell (with Bash or PowerShell)](./authenticate-to-azure-with-microsoft-account.md)\n- [Authenticate with a Microsoft account using Windows (with Bash or PowerShell)](./authenticate-to-azure-with-microsoft-account.md)\n- [Authenticate with a service principal](./authenticate-to-azure-with-service-principle.md)\n- [Authenticate with a managed identity for Azure services](./authenticate-to-azure-with-managed-identity-for-azure-services.md)\n\n## 3. Verify the results\n\nVerify that you've authenticated to the Azure subscription by displaying the current subscription.\n\n#### [Bash](#tab/bash)\n\nTo confirm the current Azure subscription with the Azure CLI, run [az account show](/cli/azure/account#az-account-show).\n\n```azurecli\naz account show\n```\n\n#### [Azure PowerShell](#tab/azure-powershell)\n\nTo confirm the current Azure subscription with Azure PowerShell, run [Get-AzContext](/powershell/module/az.accounts/get-azcontext).\n\n```powershell\nGet-AzContext\n```\n\n---\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Your first Terraform project: Create an Azure resource group](create-resource-group.md)\n"
  },
  {
    "path": "articles/terraform/azure-export-for-terraform/export-advanced-scenarios.md",
    "content": "---\ntitle: Using Azure Export for Terraform in advanced scenarios\ndescription: Learn how to append resources and use remote backends \nms.topic: how-to\nms.date: 05/10/2023\nms.author: stema\nms.custom: devx-track-terraform,devx-track-export-terraform\n---\n\n# Using Azure Export for Terraform in advanced scenarios\n\nThis article explains how to do some of the more advanced tasks with Azure Export for Terraform.\n\n> [!div class=\"checklist\"]\n> * Append resources to existing Terraform environments.\n> * Export resources into an existing Terraform environment with a remote backend state\n\n## Appending to existing resources\n\nBy default, Azure Export for Terraform ensures the output directory is empty to avoid any conflicts with existing user files. If you need to import resources to an existing state file, add the `--append` flag.\n\n```console\naztfexport [command] --append <scope>\n```\n\nWhen the `--append` flag is specified, Azure Export for Terraform verifies if there's a pre-existing `provider` or `terraform` block in any of the files in the current directory. If not, the tool creates a file for each block and then proceeds with exporting. If the output directory has a state file, any exported resources are imported into the state file.\n\nAdditionally, the file generated has a `.aztfexport` suffix before the extension - such as `main.aztfexport.tf` - to avoid potential file name conflicts.\n\nIf you run `aztfexport --append` multiple times, a single `main.aztfexport.tf` is created with the export results appended to the file each time the command is run.\n\n## Bring your own Terraform configuration\n\nBy default, Azure Export for Terraform uses a local backend to store the state file. However, it's also possible to use a remote backend. Azure Export for Terraform enables you to define your own `terraform` or `provider` blocks to pass. \n\nDefine these blocks in a `.tf` file within your target directory, export with the `--append` flag, and your config exports to the specified backend and provider version (if it's provided). \n\n> [!IMPORTANT]\n> If the specified version of AzureRM doesn't match your installed version when exporting, the command fails.\n\n### Azure Storage example\n\nThis example is based on the article, [Store Terraform state in Azure Storage](../store-state-in-azure-storage.md).\n\n```console\nterraform {\n  required_providers {\n    azurerm = {\n      source  = \"hashicorp/azurerm\"\n      version = \"~>3.0\"\n    }\n  }\n    backend \"azurerm\" {\n        resource_group_name  = \"tfstate\"\n        storage_account_name = \"storageacc\"\n        container_name       = \"tfstate\"\n        key                  = \"terraform.tfstate\"\n    }\n\n}\n\nprovider \"azurerm\" {\n  features {}\n}\n```\n\n### Terraform Cloud example\n\n```terraform\nterraform {\n  cloud {\n    organization = \"aztfexport-test\"\n    workspaces {\n      name = \"aztfexport-playground\"\n    }\n  }\n  required_providers {\n    azurerm = {\n      source = \"hashicorp/azurerm\"\n      version = \"~>3.0\"\n    }\n  }\n}\nprovider \"azurerm\" {\n  features {\n  }\n}\n```\n\n### Inline experience\n\nTo export to a backend inline, use the `--backend-type` and `--backend-config` options. For more information about configuring a Terraform backend, see [Terraform backend configuration](https://developer.hashicorp.com/terraform/language/backend).\n\nUsing our Azure storage account example, you need the following as defined in [the AzureRM backend documentation](https://www.terraform.io/language/settings/backends/azurerm#azurerm). \n\n- Resource group name\n- Storage account name\n- Storage container name\n\nPass these parameters into the command along with your backend type:\n\n```console\naztfexport [subcommand] --backend-type=azurerm \\\n                        --backend-config=resource_group_name=<resource group name> \\\n                        --backend-config=storage_account_name=<account name> \\\n                        --backend-config=container_name=<container name> \\\n                        --backend-config=key=terraform.tfstate \n```\n\n**Key points:**\n\n- In the previous example, I'm using the Unix line continuation character so that the code displays well in the browser. You might need to change these characters to match your command-line environment - such as PowerShell - or combine the command onto one line.\n- If the backend state already exists, Azure Export for Terraform merges the new resources with the existing state automatically. You don't need to specify the `--append` option inline.\n\n## Export Azure resources to an existing Terraform environment\n\nNow, let's put it all together! Imagine new resources have been created outside of Terraform that need to be moved into Terraform management. To complete the section, make sure you have a backend configured. This tutorial uses the same configuration that is specified in the [Azure storage remote state tutorial](../store-state-in-azure-storage.md).\n\n1. In the parent directory of where you want the temporary directory created, run the following command:\n\n    ```console\n    aztfexport resource -o tempdir --hcl-only <resource_id>\n    ```\n    \n    **Key points:**\n    \n    - The  `-o` flag specifies to create the directory if it doesn't exist.\n    - The `--hcl-only` flag specifies to export the configured resources to HCL\n    \n1. After inspecting that the resource can be appended, utilize the generated mapping file and the `--append` flag to ensure Azure Export respects the pre-existing remote state and provider versions within our existing environment:\n\n    ```console\n    aztfexport map --append `./tempdir/aztfexportResourceMapping.json`\n    ```\n    \n1. Run [terraform init](https://developer.hashicorp.com/terraform/cli/commands/init).\n\n    ```console\n    terraform init --upgrade\n    ```\n\n1. Run [terraform plan](https://developer.hashicorp.com/terraform/cli/commands/plan).\n\n1. Azure Export for Terraform should display **No changes needed**.\n\nCongratulations! Your infrastructure and its corresponding state have been successfully appended to your Terraform environment.\n\nIf your plan runs into issues, see [Azure Export for Terraform concepts](./export-terraform-concepts.md#limitations) to understand limitations regarding deploying code generated by `--hcl-only`. If that article doesn't help you, open a [GitHub issue](https://github.com/Azure/aztfexport/issues).\n\n## Customize your query further\n\nSome additional advanced flags are described below, with how to utilize them:\n\n### Selecting cloud environment\n\nTo specify a different environment other than public cloud, use the `--env` flag. For example, for US Government:\n```console\naztfexport [command] --env=\"usgovernment\" [further options] <scope>\n```\n### Changing Terraform provider version\n\nFor simpler access to a preferred `AzureRM` or `AzAPI` version, use the `--provider-version` flag. For example, if you were on `AzAPI` version `1.10.0`:\n```console\naztfexport [command] --provider-name=azapi --provider-version=1.10.0 [further options] <scope>\n```\n\n### Authentication\n\nA variety of flags exist for managing authentication configuration. Some flags were added as late as `v0.15`:\n\n- `--env`\n- `--tenant-id`\n- `--auxiliary-tenant-ids`\n- `--client-id`\n- `--client-id-file-path`\n- `--client-certificate`\n- `--client-certificate-path`\n- `--client-certificate-password`\n- `--client-secret`\n- `--client-secret-file-path`\n- `--oidc-request-token`\n- `--oidc-request-url`\n- `--oidc-token`\n- `--oidc-token-file-path`\n- `--use-managed-identity-cred` (defaults to false)\n- `--use-azure-cli-cred` (defaults to true)\n- `--use-oidc-cred` (defaults to false)\n\nThe flags above follow the naming convention of the `azurerm` provider. All of the flags are configurable via environment variables as well, which includes the same environment variable defined in the `azurerm` provider.\n\n`aztfexport` attempts to authenticate with each of the credential types, in the following order, stopping when a token is provided:\n\n1. Client secret\n2. Client certificate\n3. OIDC\n4. Managed identity\n5. Azure CLI\n\nIf one or more `use-xxx-cred` is not true, then that credential type will be skipped. This behavior is the same as the provider.\n\nThe provider config can override any auth config from `aztfexport`. This makes it possible for users to use different credential types between `aztfexport` and the provider.\n### Including role assignments\n\nIf you wish to include role assignments when exporting your scope of resources, use the `--include-role-assignment` command:\n```console\naztfexport [command] --include-role-assignment [further options] <scope>\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Azure Export for Terraform concepts](./export-terraform-concepts.md)\n"
  },
  {
    "path": "articles/terraform/azure-export-for-terraform/export-first-resources.md",
    "content": "---\ntitle: 'Quickstart: Export your first resources using Azure Export for Terraform'\ndescription: Export your first resources using Azure Export for Terraform on a resource group, both interactively and non-interactively. \nauthor: stemamsft\nms.topic: quickstart\nms.date: 05/10/2023\nms.author: stema\nms.custom:\n  - devx-track-terraform\n  - devx-track-export-terraform\n  - sfi-image-nochange\n---\n\n# Quickstart: Export your first resources using Azure Export for Terraform\n\nThis article shows how to export Azure resources into local state files using [Azure Export for Terraform](./export-terraform-overview.md).\n\n> [!div class=\"checklist\"]\n> * Create a test Azure resource group using Azure CLI or Azure PowerShell.\n> * Create a test Linux virtual machine using Azure CLI or Azure PowerShell.\n> * Export the state for the resource group and virtual machine from Azure to the local state file.\n> * Test that the local state matches the state of the resources in Azure.\n\n## Prerequisites\n\n- [Install and configure Terraform](/azure/developer/terraform/quickstart-configure)\n- [Install Azure Export for Terraform](https://github.com/azure/aztfexport)\n\n## Create the test Azure resources\n\n[!INCLUDE [Create sample VM](../includes/create-vm.md)]\n\n## Export an Azure resource\n\nYou can run the `aztfexport` tool in one of two modes: interactive and non-interactive. For this demo, you use the interactive mode.\n\n1. Create a directory in which to test.\n\n1. Open a command prompt and navigate to the new directory.\n\n1. Run `aztfexport resource-group` to export the resource group named `myResourceGroup`.\n\n    ```console\n    aztfexport resource-group myResourceGroup\n    ```\n\n1. After the tool initializes, a list of the resources to be exported is displayed. Each line has an Azure resourceID matched to the corresponding AzureRM resource type. The list of available commands displays at the bottom of the display. Using one of the commands, scroll to the bottom and verify that the expected Azure resources are properly mapped to their respective Terraform resource types.\n\n1. Press `w` to run the export.\n\n    **Key points:**\n    - For a non-interactive resource, add the `--non-interactive` flag: `aztfexport rg --non-interactive myResourceGroup`.\n\n> [!NOTE]\n> Running Azure Export for Terraform can take several minutes to complete.\n\n## Verify the results\n\nAfter the tool has finished exporting your Azure resources, run the following commands in the same directory that contains the generated files.\n\n1. Run [terraform init](https://developer.hashicorp.com/terraform/cli/commands/init).\n\n    ```console\n    terraform init --upgrade\n    ```\n\n1. Run [terraform plan](https://developer.hashicorp.com/terraform/cli/commands/plan).\n\n    ```console\n    terraform plan\n    ```\n\nIf the terminal outputs **No changes needed**, then congratulations!\n\nYour infrastructure and its corresponding state have been successfully exported to Terraform.\n\n## Clean up resources\n\nWhen you no longer need the resources created in this article, do the following steps:\n\n1. Navigate to the directory containing your Terraform files for this article.\n\n1. Run [terraform destroy](https://www.terraform.io/docs/commands/destroy.html).\n\n    ```console\n    terraform destroy\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Export resources into HCL code using Azure Export for Terraform](./export-resources-hcl.md)\n"
  },
  {
    "path": "articles/terraform/azure-export-for-terraform/export-resources-hcl.md",
    "content": "---\ntitle: 'Quickstart: Export Azure resources to HCL code using Azure Export for Terraform'\ndescription: Learn how to use the Azure Export for Terraform tool to export Azure resources to HCL code.\nauthor: stemamsft\nms.topic: quickstart\nms.date: 05/10/2023\nms.author: stema\nms.custom: devx-track-terraform,devx-track-export-terraform\n---\n\n# Quickstart: Export Azure resources into HCL code using Azure Export for Terraform\n\nIn the article, [Export your first resources using Azure Export for Terraform](export-first-resources.md), you learn how to export Azure resources into local state files using [Azure Export for Terraform](export-terraform-overview.md). In this article, you learn how to generate the Terraform configuration files from your Azure resources.\n\n> [!div class=\"checklist\"]\n> * Create a test Azure resource group using Azure CLI or Azure PowerShell.\n> * Create a test Linux virtual machine using Azure CLI or Azure PowerShell.\n> * Export the resource group and virtual machine from Azure to HCL files.\n> * Test that the local state matches the state of the resources in Azure.\n\n## Prerequisites\n\n- [Install and configure Terraform](/azure/developer/terraform/quickstart-configure)\n- [Install Azure Export for Terraform](https://github.com/azure/aztfexport)\n\n## Create the test Azure resources\n\n[!INCLUDE [Create sample VM](../includes/create-vm.md)]\n\n## Understand the hcl-only flag\n\nAzure Export for Terraform supports a flag - `--hcl-only` - that causes the generation of the following files from the exported resource(s):\n\n- Generated `.tf` HCL files.\n- Mapping file `aztfexportResourceMapping.json`.\n- Skipped resources are listed in `aztfexportSkippedResources.txt`.\n\nThe `--hcl-only` flag is supported for all primary export commands used for exporting:\n\n- resource\n- resource-group\n- query\n- mapping-file\n\nTo view the available Azure Export for Terraform commands, run the following command:\n\n```console\naztfexport --help\n```\n\nThe `--hcl-only` flag is useful in scenarios where you don't need the state or aren't sure if you need to generate the state. To export all the generated configuration to state, run `aztfexport mapping-file`.\n\n> [!TIP]\n> When using the `--hcl-only` flag, target an empty directory to avoid making unwanted changes to any current state during the export stage.\n\n## Export an Azure resource\n\nYou can run the `aztfexport` tool in one of two modes: interactive and non-interactive. For this demo, you use the non-interactive mode.\n\n1. Create a directory in which to test.\n\n1. Open a command prompt and navigate to the new directory.\n\n1. Run `aztfexport resource-group` to export the resource group named `myResourceGroup`.\n\n    ```console\n    aztfexport resource-group --non-interactive --hcl-only myResourceGroup\n    ```\n\n> [!NOTE]\n> Running Azure Export for Terraform can take several minutes to complete.\n\n## Verify the results\n\nAfter the tool has finished exporting your Azure resources, verify the following files in the directory where you ran Azure Export for Terraform:\n\n- `main.tf` contains the HCL code that defines the exported resources.\n- `aztfexportResourceMapping.json` contains the Azure/Terraform mappings. The mapping file includes the following information for each exported Azure resource: Azure resource ID, Terraform resource type, and Terraform resource name. The contents of the mapping file mirror what Azure Export for Terraform displays during the export process.\n- `aztfexportSkippedResources.txt` contains the list of skipped resources. You shouldn't see this file for this example.\n\n## Clean up resources\n\nWhen you no longer need the resources created in this article, do the following steps:\n\n1. Navigate to the directory containing your Terraform files for this article.\n\n1. Run [terraform destroy](https://www.terraform.io/docs/commands/destroy.html).\n\n    ```console\n    terraform destroy\n    ```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [How Azure Export for Terraform works](./export-terraform-concepts.md)\n"
  },
  {
    "path": "articles/terraform/azure-export-for-terraform/export-terraform-concepts.md",
    "content": "---\ntitle: Azure Export for Terraform concepts\ndescription: Learn how Azure Export for Terraform works, best practices, and limitations around the tool.\nms.topic: concept-article\nms.date: 05/10/2023\nms.author: stema\nms.custom: devx-track-terraform,devx-track-export-terraform\n---\n\n# How Azure Export for Terraform Works\n\nThis article introduces you to the [Azure Export for Terraform](./export-terraform-overview.md) workflows. In this article, you learn about the tool's best practice guidance, current limitations, and how to mitigate those limitations.\n\n## Interactive mode\n\nBy default, Azure Export for Terraform runs in interactive mode. When you run in interactive mode, the available keyboard shortcuts are listed at the bottom of the display.\n\n| Task                                                                                                    | Keyboard shortcut(s)                                     |\n|---------------------------------------------------------------------------------------------------------|----------------------------------------------------------|\n| **Navigation**                                                                                          |                                                          |\n| Select previous item in the resource list.                                                              | <kbd>↑</kbd> -or- <kbd>k</kbd>                           |\n| Select next item in the resource list.                                                                  | <kbd>↓</kbd> -or- <kbd>j</kbd>                           |\n| Move to previous page in the resource list.                                                             | <kbd>←</kbd> -or- <kbd>h</kbd> -or- <kbd>Page Up</kbd>   |\n| Move to next page in the resource list.                                                                 | <kbd>→</kbd> -or- <kbd>l</kbd> -or- <kbd>Page Down</kbd> |\n| Jump to the start of the resource list.                                                                 | <kbd>g</kbd> -or- <kbd>Home</kbd>                        |\n| Jump to the end of the resource list.                                                                   | <kbd>G</kbd> -or- <kbd>End</kbd>                         |\n| **Selecting resources to skip**                                                                         |                                                          |\n| Skip resource (or unskip if marked as \"Skip\")                                                           | <kbd>Delete</kbd>                                        |\n| **Filter operations**                                                                                   |                                                          |\n| Define a filter by text on the resource list.                                                           | <kbd>/</kbd>                                             |\n| Clear any current filter                                                                                | <kbd>Esc</kbd>                                           |\n| **Save operations**                                                                                     |                                                          |\n| Save a mapping file of the resource list. The output file is affected by skipping (but not filtering).  | <kbd>s</kbd>                                             |\n| Export resources to state (if `--hcl-only` isn't specified) and generates the config.                   | <kbd>w</kbd>                                             |\n| **User experience**                                                                                     |                                                          |\n| Display recommendations for current resource.                                                           | <kbd>r</kbd>                                             |\n| Show resource export errors (if any).                                                                   | <kbd>e</kbd>                                             |\n| Display help.                                                                                           | <kbd>?</kbd>                                             |\n| **Quit**                                                                                                |                                                          |\n| Quit interactive mode.                                                                                  | <kbd>q</kbd>                                             |\n\nFor each resource, Azure Export for Terraform tries to recognize the corresponding Terraform resource type. If it finds a match, the line is marked with the following indicator: 💡.\n\nIf the resource can't be resolved, you need to input the Terraform resource address in the following form: `<resource type>.<resource name>`. For example, `azurerm_linux_virtual_machine.test` refers to a Terraform resource type of [azurerm_linux_virtual_machine](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/linux_virtual_machine) while the `test` refers to the name for the virtual machine used in the configuration files.\n\nTo see the available resource type(s) for the selected resource, press <kbd>r</kbd>.\n\nIn some cases, there are Azure resources that have no corresponding Terraform resources, such as if the resource lacks Terraform support. Some resources might also be created as a side effect of provisioning another resource - such as the OS Disk resource that is created when provisioning a virtual machine. In these cases, you can skip the resources without assigning anything.\n\nAfter going through all the resources to be imported, press <kbd>w</kbd> to begin generating the Terraform configuration and (if `--hcl-only` isn't selected) importing to Terraform state.\n\n### Non-interactive mode\n\nBy default, Azure Export for Terraform runs in interactive mode. To specify that the tool should run in non-interactive mode, specify the `--non-interactive` flag.\n\n```console\naztfexport [command] --non-interactive <scope>\n```\n\n> [!IMPORTANT]\n> If the directory in which you're running Azure Export for Terraform isn't empty, you must add the `--overwrite` flag to use the `--hcl-only` flag.\n\n## Best practices on core workflows\n\nOn a fundamental level, any user of Azure Export faces a decision between two options:\n\n- [Export existing resources into state](export-first-resources.md)\n- [Export existing resources into HCL](export-resources-hcl.md)\n\nThe following subsections provide guidance as to which option to take based on the scenario.\n\n### Managing infrastructure\n\nYou may not need to export to state if you haven't verified the configured resources behave within your environment in the desired manner.\n\nIf you're sure you wish to manage the set of resources in Terraform with `terraform init plan apply` workflows, exporting to state is essential.\n\nIf you aren't sure you want to manage the resources yet, passing the `--hcl-only` flag is recommended.\n\n### Existing infrastructure\n\nIn scenarios where you're exporting to existing Terraform environments, it may be helpful to think of `--hcl-only` as a [terraform plan](https://developer.hashicorp.com/terraform/cli/commands/plan) equivalent, especially before appending to existing environments.\n\nThe [`terraform apply`](https://developer.hashicorp.com/terraform/cli/commands/apply) command equates to exporting resources - during which their config ties into the pre-existing state. In this scenario, using a mapping file saves run time to list and map resources.\n\n### Discovering infrastructure\n\nIf you aren't sure what resources exist within an environment, you can verify by specifying the `--generate-mapping-file` flag. For more information about this subject, see [Exploring customized resource selection and naming using Azure Export for Terraform](select-custom-resources.md).\n\n## Limitations\n\nAzure Export for Terraform is a complex tool that attempts to convert Azure infrastructure into Terraform code and state. Its current known limitations are explained in the following subsections.\n\n### Cross-property constraints\n\nThe [AzureRM provider](https://github.com/hashicorp/terraform-provider-azurerm) can set two properties that conflict with each other. When Azure Export for Terraform reads conflicting properties, it may set both properties to the same value despite the user only configuring one. Further complications emerge when multiple cross-property constraints exist within the same generated configuration. You must know where cross-property conflicts exist within your configuration in order to mitigate this issue.\n\n### Infrastructure outside resource scope\n\nWhen you're using Azure Export for Terraform to target resource scopes, resources required for the config might exist outside of the scope specified. One example is a role assignment. The user needs to identify resources that are outside of scope.\n\n### Write-only properties\n\nAzure Export can't generate write-only properties (such as passwords) within its config. You need to know about the write-only properties and define them in a configuration to create new sets of resources.\n\n## Modifying code to match coding standards\n\nThere are a few necessary operations if the user wishes to modify their code to abide by coding standards. These steps would only be necessary if the user plans to use the code in nonsandbox environments.\n\n### Property-defined resources\n\nCertain resources in Azure can be defined as either a property in a parent Terraform resource or an individual Terraform resource. One example is a subnet. Azure Export for Terraform defines the resource as an individual resource, but it's best practice to match your existing coding configuration.\n\n### Explicit dependencies\n\nAzure Export for Terraform is currently able to declare only explicit dependencies. You must know the mapping of the relationships between resources to refactor the code to include any needed implicit dependencies.\n\n### Hardcoded values\n\nAzure Export for Terraform currently generates hard-coded strings. As a best practice, you should refactor these values to variables. Also, when you use the `--full-properties` flag to expose all properties, some sensitive information (such as secrets) can be seen in the generated config. Use recommended practices to protect the visibility of this code.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Export your first resources using Azure Export for Terraform](export-first-resources.md)\n"
  },
  {
    "path": "articles/terraform/azure-export-for-terraform/export-terraform-overview.md",
    "content": "---\ntitle: Overview of Azure Export for Terraform CLI\ndescription: Learn the benefits and uses of Azure Export for Terraform CLI\nms.topic: overview\nms.date: 3/30/2026\nms.author: stema\nms.custom: devx-track-terraform,devx-track-export-terraform\n---\n\n# Overview of Azure Export for Terraform CLI\n\nAzure Export for Terraform (`aztfexport`) is a CLI tool designed to help reduce friction in translation between Azure and Terraform concepts. This tool complements the [portal Terraform export experience](get-started-export-resources-portal.md).\n\n## Benefits\n\nAzure Export for Terraform enables you to:\n\n- **Simplify migration to Terraform on Azure**. Azure Export for Terraform allows you to migrate Azure resources to Terraform  using a single command.\n- **Export user-specified sets of resources to Terraform HCL code and state with a single command**. Azure Export for Terraform enables you to specify a predetermined scope to export. The scope can be as granular as a single resource. You can also export a resource group and its nested resources. Finally, you can export an entire subscription.\n- **Inspect preexisting infrastructure with all exposed properties.** Whether learning a newly released resource or investigating an issue in production, Azure Export for Terraform supports a read-only export with the option to expose all configurable resource properties.\n- **Follow plan/apply workflow to integrate non-Terraform infrastructure into Terraform.** Export HCL code, inspect non-Terraform resources and easily integrate them into your production infrastructure and remote backends.\n\n## Comparison with portal export experience\n\nThis CLI tool provides more features in comparison to the portal experience.\n\n- **Number of resources that can be exported**. In the portal only up to 1,000 resources can be exported, and the maximum exported configuration payload is 4 MB. The tool returns an error if the limit is exceeded.\n- **Supported resource types**. In the portal, some resource types or properties within a resource type cannot be exported.\n\n## Installation\n\nThe [Azure Export for Terraform GitHub page](https://github.com/Azure/aztfexport/releases) lists releases of the tool with links to installation for various platforms (Windows MSIs, Homebrew, and Linux installations) and the source code.\n\n## Usage\n\nAt its most abstract, Azure Export is called as follows:\n\n```console\naztfexport [command] [option] <scope>\n```\n\nThe scope changes depending on the command being run, as do the available set of option flags. There are three commands that should be used based on what you are trying to export:\n\n| Task | Description | Example |\n|-|-|-|\n| Export a single resource. | To export a single resource, specify the Azure resourceID associated with the resource. | aztfexport resource [option] &lt;resource id> |\n| Export a resource group. | To export a resource group (and its nested resources), specify the resource group name; not the ID. | aztfexport resource-group [option] &lt;resource group name> |\n| Export using a query. | The tool supports exporting with an Azure Resource Graph query. | aztfexport query [option] &lt;ARG where predicate> |\n\n### Providers\n\nWhile Azure Export defaults to the `azurerm` provider, you can also export the [`AzAPI `provider](../overview-azapi-provider.md):\n```console\naztfexport [command] --provider-name=azapi [further options] <scope>\n```\n\n## Data-collection disclosure\n\nBy default, Azure Export for Terraform collects telemetry data. However, you can easily disable this process.\n\nMicrosoft aggregates collected data to identify patterns of usage to identify common issues and to improve the experience of Azure Export for Terraform. For example, the usage data helps identify issues such as commands with low success and helps prioritize our work. Azure Export for Terraform doesn't collect any private or personal data.\n\nIf you do want to disable data collection, run the following command after installing the tool:\n\n```console\naztfexport config set telemetry_enabled false\n```\n\n## Next steps\n\n**Concepts:**\n\n[Azure Export for Terraform concepts](export-terraform-concepts.md): Learn the workflows of Azure Export for Terraform and its best practices and current design limitations.  \n\n**Quickstart articles:**\n\n- [Export your first resources using Azure Export for Terraform](export-first-resources.md)\n- [Export Azure resources to HCL code using Azure Export for Terraform](export-resources-hcl.md)\n\n**How-to articles:**\n\nHow-to articles explain more complex scenarios along with explanations and options:\n\n- [Exploring customized resource selection and naming using Azure Export for Terraform](select-custom-resources.md)\n- [Using Azure Export for Terraform in advanced scenarios](export-advanced-scenarios.md)\n"
  },
  {
    "path": "articles/terraform/azure-export-for-terraform/get-started-export-resources-portal.md",
    "content": "---\ntitle: Quickstart - Export a Resource in the Azure portal\ndescription: Learn how to use the Azure portal to Generate Terraform Configurations\nkeywords: azure devops terraform lab resource\nms.topic: quickstart\nms.date: 10/01/2024\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\n---\n\n# Quickstart: Export a virtual machine into Terraform with the Azure portal\n\n**Applies to:** :heavy_check_mark: Any management plane resources from the [AzureRM](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs) or [AzAPI](/azure/templates/) provider.\n\nExisting Azure resources can be exported to Terraform through the Azure portal. This quickstart shows you how to use the Azure portal to export a resource group.\n\n> [!div class=\"checklist\"]\n> * Create a test Azure resource group using Azure CLI or Azure PowerShell.\n> * Create a test Linux virtual machine using Azure CLIor Azure PowerShell.\n> * Export the state for the resource group and virtual machine from Azure to Terraform.\n> * Test that the local state matches the state of the resources in Azure.\n\n:::image type=\"content\" source=\"./media/terraform-export-portal.png\" alt-text=\"Screenshot of exporting Terraform resources within Azure portal.\":::\n\n## Prerequisites\n\n- [Set up an Azure account](https://azure.microsoft.com/)\n- [Install and configure Terraform](/azure/developer/terraform/quickstart-configure)\n\n### Setup Virtual Machine\n\n#### Azure CLI or Azure PowerShell\n\n[!INCLUDE [Create sample virtual machine](../includes/create-vm.md)]\n\n#### Azure portal\n\n1. Under **Azure Services**, select **Virtual machines**. If you don't see **Virtual machines**, search for it in the search bar.\n1. In the **Virtual machines** page, select **Create**, to see a dropdown. Select **Azure virtual machine**.\n1. Under **Virtual Machine Name**, type in **myVM**.\n1. Under **Resource Group Name**, select **Create new**, and type in **myResourceGroup**.\n1. Leave everything else as default. Select **Review + create**.\n1. Verify everything is configured properly, then select **Create**.\n\n### Register resource provider\n\nIf your subscription isn't registered to the `Microsoft.AzureTerraform` resource provider, refer to the [registration instructions](./resource-provider-overview.md#registration).\n\n### Sign in to Azure\n\nSign in to the [Azure portal](https://portal.azure.com/).\n\n## Export resource group\n\nExport the existing resource group to Terraform.\n\n1. On the overview page for your resource group, expand the **Automation** tab, and select **Export Template**.\n:::image type=\"content\" source=\"./media/terraform-export-blade.png\" alt-text=\"Screenshot of where to find Export Terraform blade within Azure portal.\":::\n\n2. In the **Export Template** page, select Terraform.\n\n3. Select either the `AzureRM` or `AzAPI` provider. Code can also be generated for both providers at once for side by side comparison.\n\n4. Review the generated code.\n:::image type=\"content\" source=\"./media/terraform-export-output.png\" alt-text=\"Screenshot of Export Terraform output within Azure portal.\":::\n\n5. Use the **copy template** button in the bottom right or **copy content** button on the top to paste directly into your code editor. Alternatively, use the download button to get a ZIP folder with the terraform configuration file. If the output isn't what you expected, check that you registered the resource provider. If you're still seeing errors, click the **Feedback** button to notify us of the bug.\n\n## Clean up resources\n\n### Delete resources\n\nWhen no longer needed, you can delete the resource group, virtual machine, and all related resources.\n\n1. At the top of the page for the resource group, select **Delete resource group**. \n1. A page opens warning you that you're about to delete resources. Type the name of the resource group and select **Delete** to finish deleting the resources and the resource group.\n\n### Auto-shutdown\n\nIf the virtual machine is still needed, Azure provides an Auto-shutdown feature for virtual machines to help manage costs and ensure you're not billed for unused resources.\n\n1. On the **Operations** section for the virtual machine, select the **Auto shutdown** option.\n1. A page opens where you can configure the auto shutdown time. Select the **On** option to enable and then set a time that works for you.\n1. Once you set the time, select **Save**  at the top to enable your Auto-shutdown configuration.\n\n> [!NOTE]\n> Remember to configure the time zone correctly to match your requirements, as (UTC) Coordinated Universal Time is the default setting in the Time zone dropdown.\n\nFor more information, see [Auto shutdown](/azure/virtual-machines/auto-shutdown-vm).\n\n## Next steps\n\nIn this quickstart, you deployed a simple virtual machine and exported the configuration to Terraform code.\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Terraform on Azure](../overview.md)"
  },
  {
    "path": "articles/terraform/azure-export-for-terraform/resource-provider-overview.md",
    "content": "---\ntitle: Overview of the Azure Terraform Resource Provider\ndescription: Learn the benefits and uses of the Azure Terraform resource provider\nms.topic: overview\nms.date: 10/04/2024\nms.author: stema\nms.custom: devx-track-terraform\n---\n\n# Overview of the Azure Terraform Resource Provider\n\nThe Azure Terraform Resource Provider (Public Preview) enables Azure Terraform workflows like exporting in the Azure portal. Currently, only an export workflow is supported, but planned additions to the resource provider accelerate deployment workflows in Terraform on Azure. This resource provider is only available in the Azure public cloud.\n\n## Registration\n\nRegistration may take a few minutes to complete. Check your registration status with `az provider show -n Microsoft.AzureTerraform`.\n\n### Terraform\n\nUtilize the `azurerm_provider_registration` resource:\n\n```hcl\nresource \"azurerm_resource_provider_registration\" \"azureterraform\" {\n  name = \"Microsoft.AzureTerraform\"\n}\n```\n\nYou need to have your `azurerm` provider configured as well for the run to succeed.\n\n### Terminal\n\nRegister the provider with `az provider register -n Microsoft.AzureTerraform`. \n\n### Portal\n\nRegister the provider using the [Azure Resource Manager guide](/azure/azure-resource-manager/management/resource-providers-and-types#azure-portal). Search for `Microsoft.AzureTerraform` in step 5.\n\n## Export\n\nExport functionality is based on the preexisting [Azure Export for Terraform tool](../azure-export-for-terraform/export-terraform-overview.md). These capabilities are exposed through the resource provider. To export resources, choose your tool of choice:\n\n### Portal\n\nFollow the [quickstart article to export resources to Terraform using Azure portal](./get-started-export-resources-portal.md)\n\n### Azure CLI\n\nFollow the [Azure CLI guide](/cli/azure/terraform).\n\n### Azure PowerShell\n\nFollow the [Azure PowerShell guide](/powershell/module/az.terraform/).\n\n### REST\n\nFollow the [REST API reference](/rest/api/terraform/terraform/).\n\n### Go SDK\n\nFollow the [Go SDK reference](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/terraform/armterraform).\n\n### Export Limitations\n\nAs the export experience is based on [Azure Export for Terraform `aztfexport`](../azure-export-for-terraform/export-terraform-overview.md), its limitations are nearly identical to the binary. Refer to the [limitations section of the binary documentation](../azure-export-for-terraform/export-terraform-concepts.md).\n\nHowever, there are also specific resources not supported by the resource provider. These resources aren't supported to ensure security from a usage standpoint. Two types of roles aren't supported:\n\n- POST roles. They're mostly used for listing credentials.\n- Data plane roles. These roles are used to access user content.\n\nWe're planning to keep these limitations in place to ensure security for users. If customers wish to export these types of resources, use the [`aztfexport`](https://github.com/Azure/aztfexport) tool instead.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Export your first resources using the Azure portal](./get-started-export-resources-portal.md)\n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/azure-export-for-terraform/select-custom-resources.md",
    "content": "---\ntitle: Customized resource selection and naming using Azure Export for Terraform\ndescription: Understand how to customize resource selection and filtering with Azure Export for Terraform.\nms.topic: how-to\nms.author: stema\nms.custom: devx-track-terraform,devx-track-export-terraform\nms.date: 05/10/2023\n---\n\n# Customized resource selection and naming using Azure Export for Terraform\n\nAzure Export for Terraform provides various options to customize which resources you export.\n\nIn this article, you learn pros and cons for each option.\n\n> [!div class=\"checklist\"]\n> * Using the UI\n> * Using Query Mode\n> * Using a Mapping File\n\n## Using the user interface\n\nWhen you run Azure Export for Terraform in interactive mode, the specified resources (via the parameters you specify when running) display. By default, all of the resources are exported.\n\nThe <kbd>Delete</kbd> acts as a toggle in skipping or including resources. To remove resources from being exported, use the arrow keys to select the desired resource and press <kbd>Delete</kbd>. The resource is updated to display \"Skip\".\n\nTo undo the skip action, verify the skipped resource is selected, and press <kbd>Delete</kbd> again.\n\n**Pros:**\n\n- Requires the use of a single toggle key.\n- Don’t need to know the resources you want before running the command.\n\n**Cons:**\n\n- Action can be time consuming if you have many resources to scroll through and skip.\n\n## Using query mode\n\nApplying a filter using [Azure Resource Graph query syntax](/azure/governance/resource-graph/samples/starter) is a powerful technique when you know exactly what filters you need.\n\n```console\naztfexport query [option] <ARG_where_predicate>\n```\n\nAs an example, let's say you have a resource group named `myResourceGroup` that has many resources including a network resource. If you want to export only the network resource, you could use the following syntax:\n\n```console\naztfexport query -n \"resourceGroup =~ 'myResourceGroup' and type contains 'Microsoft.Network'\"\n```\n\nPros:\n\n- Single command with no manual editing required.\n- Supports an unlimited number of filters.\n- Handles large amount of resources efficiently.\n\nCons:\n\n- Easy to exclude resources you need to export.\n- Requires knowledge of Azure Resource Graph syntax.\n\n## Using a mapping file\n\nThe following syntax shows the basics to export a set of resources that is defined in a resource mapping file:\n\n```console\naztfexport mapping-file [option] <resource_mapping_file>\n```\n\nYou can use a mapping file in either interactive or non-interactive modes:\n\n- **Interactive mode:** Press <kbd>s</kbd> when running interactively in the resource list view.\n- **Non-interactive mode:** You can generate the mapping file in all export commands (`resource`, `resource-group`, `query`, `mapping file`) by adding the `--generate-mapping-file` flag.\n\nIf your use cases require pre-export modifications, you can manually construct or edit the mapping file. Here are some examples of when you would want to manually edit your own mapping file:\n\n| Use-case | Steps |\n|-|-|\n| You have many resources in a resource group but only need to export a select few. | Delete the JSON objects from your editor of choice and save the file before exporting. |\n| You want to rename all your resources in a consistent manner. | Change the `resource-name` property to whatever name matches your company compliance standards. |\n| You need to refactor a set of resources by their resource type - such as networking or compute. | Use your editor to find all `Microsoft.Network` or `Microsoft.Compute` resources. |\n\nFor example, let's say you run the following command for a resource group that contains a virtual machine:\n\n```console\naztfexport rg --generate-mapping-file --non-interactive myResourceGroup\n```\n\nThe results are similar to the following JSON file:\n\n```JSON\n{\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup/extensions/OmsAgentForLinux\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup/extensions/OmsAgentForLinux\",\n\t\t\"resource_type\": \"azurerm_virtual_machine_extension\",\n\t\t\"resource_name\": \"res-0\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup\",\n\t\t\"resource_type\": \"azurerm_resource_group\",\n\t\t\"resource_name\": \"res-1\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/sshPublicKeys/vm-MyResourceGroup_key\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/sshPublicKeys/vm-MyResourceGroup_key\",\n\t\t\"resource_type\": \"azurerm_ssh_public_key\",\n\t\t\"resource_name\": \"res-2\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-MyResourceGroup\",\n\t\t\"resource_type\": \"azurerm_linux_virtual_machine\",\n\t\t\"resource_name\": \"res-3\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146\",\n\t\t\"resource_type\": \"azurerm_network_interface\",\n\t\t\"resource_name\": \"res-4\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146/networkSecurityGroups/L3N1YnNjcmlwdGlvbnMvZGJmM2I2Y2ItYzFkMC00ZDA0LTk0YjktNTE1MDliOGQzM2ZkL3Jlc291cmNlR3JvdXBzL2hhc2hpY29uZi12bS1kZW1vL3Byb3ZpZGVycy9NaWNyb3NvZnQuTmV0d29yay9uZXR3b3JrU2VjdXJpdHlHcm91cHMvdm0taGFzaGljb25mLXZtLWRlbW8tbnNn\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkInterfaces/vm-myResourceGroup-vm-d146|/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg\",\n\t\t\"resource_type\": \"azurerm_network_interface_security_group_association\",\n\t\t\"resource_name\": \"res-5\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/networkSecurityGroups/vm-MyResourceGroup-nsg\",\n\t\t\"resource_type\": \"azurerm_network_security_group\",\n\t\t\"resource_name\": \"res-6\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/publicIPAddresses/vm-MyResourceGroup-ip\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/publicIPAddresses/vm-MyResourceGroup-ip\",\n\t\t\"resource_type\": \"azurerm_public_ip\",\n\t\t\"resource_name\": \"res-7\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet\",\n\t\t\"resource_type\": \"azurerm_virtual_network\",\n\t\t\"resource_name\": \"res-8\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet/subnets/default\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.Network/virtualNetworks/MyResourceGroup-vnet/subnets/default\",\n\t\t\"resource_type\": \"azurerm_subnet\",\n\t\t\"resource_name\": \"res-9\"\n\t}\n}\n```\n\nOnly the object value in the mapping file has significance. The key (defaults to the Azure `resource_id`) is just an identifier in this mode.\n\nNow, let's say we want to keep the resource group and any compute-related resources, and modify the `resource_name` value.\n\nWe could update the mapping file as follows:\n\n```JSON\n{\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup\",\n\t\t\"resource_type\": \"azurerm_resource_group\",\n\t\t\"resource_name\": \"myResourceGroup\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM\",\n\t\t\"resource_type\": \"azurerm_linux_virtual_machine\",\n\t\t\"resource_name\": \"myVM\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/sshPublicKeys/myKey\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/sshPublicKeys/myKey\",\n\t\t\"resource_type\": \"azurerm_ssh_public_key\",\n\t\t\"resource_name\": \"myKey\"\n\t},\n\t\"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-myResourceGroup/extensions/OmsAgentForLinux\": {\n\t\t\"resource_id\": \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/vm-myResourceGroup/extensions/OmsAgentForLinux\",\n\t\t\"resource_type\": \"azurerm_virtual_machine_extension\",\n\t\t\"resource_name\": \"myVMExtension\"\n\t}\n}\n```\n\nOnce you edit the mapping file, you export the mapping file using the following command:\n\n```console\naztfexport map -n \"aztfexportResourceMapping.json\"\n```\n\n**Pros:**\n\n- Since you're editing a file, you can use an editor to find and replace what you need to remove or edit.\n- JSON output enables unique functionality - such as scripting to filter.\n- Can rename resources to match your naming standards.\n- Can refactor JSON into multiple mapping files.\n- Handles large amounts of resources well.\n\n**Cons:**\n\n- For simple scenarios, this technique might be overkill.\n- Requires manual modifications.\n\n## Using Terraform import blocks\n\nWhen running `aztfexport` `v0.13` or greater alongside Terraform `v1.5` or greater, the `--generate-import-block` command generates a mapping file alongside a `import.tf` file. The `import.tf` file includes import blocks for each of the resources `aztfexport` was able to map. From this point on the behavior of the configuration is identical to [the preexisting import block workflow](https://developer.hashicorp.com/terraform/language/import). To finish, run `terraform plan`.\n\nTo then delete or filter resources from the resulting export, you can delete the block containing the resource's ID and other information.\n\n### Compare import blocks and Azure Export\n\nA common question is the difference between using Azure Export for Terraform and import blocks. The benefits between the two tools we've noticed include:\n- Azure Export for Terraform aids in resource discovery. There are various methods available to help discover and export the resources you want.\n- Azure Export for Terraform provides resource filtering, also through manual and automated means.\n- Azure Export for Terraform auto-generates import blocks with its outputs, saving time and effort on the authoring process.\n- Terraform import blocks are natively supported in Terraform, which makes them easy to use.\nCombined together, we believe that the use of both provides tremendous benefit to you.\n\n**Pros:**\n\n- Native Terraform supported workflow. No JSON needed.\n- Since you're editing a file, you can use an editor to find and replace what you need to remove or edit.\n- Can rename resources to match your naming standards.\n- Handles large amounts of resources well.\n\n**Cons:**\n\n- For simple scenarios, this technique might be overkill.\n- Requires manual modifications to filter.\n- Does not work with older versions of Terraform.\n\n## Summary\n\nIn this article, you learned about the various options to filter resources when exporting with Azure Export for Terraform.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Using Azure Export for Terraform in advanced scenarios](./export-advanced-scenarios.md)\n"
  },
  {
    "path": "articles/terraform/best-practices-compliance-testing.md",
    "content": "---\ntitle: Implement compliance testing with Terraform and Azure\ndescription: Understand how to apply behavior driven development (BDD) style compliance testing to Terraform configurations\nms.topic: how-to\nms.date: 03/18/2023\nms.custom: devx-track-terraform\n---\n\n# Implement compliance testing with Terraform and Azure\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nMany times, compliance testing is part of the continuous integration process and is used to ensure that user-defined policies are followed. For example, you might define geopolitical naming conventions for your Azure resources. Another common example is creating virtual machines from a defined subset of images. Compliance testing would be used to enforce rules in these and many other scenarios.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Understand when to use compliance testing\n> * Learn how to do a compliance test\n> * See and run an example compliance test\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- **Docker:** [Install Docker](https://docs.docker.com/get-docker/).\n\n- **Python:** [Install Python](https://www.python.org/downloads/).\n\n- **Terraform-compliance tool:** Install the Terraform compliance tool by running the following command: `pip install terraform-compliance`.\n\n- **Example code and resources:** Using the DownGit tool, download from GitHub the [compliance-testing project](https://downgit.github.io/#/home?url=https://github.com/Azure/terraform/tree/master/samples/compliance-testing) and unzip into a new directory to contain the example code. This directory is referred to as the *example directory*.\n\n## 2. Understand compliance testing and checks\n\nCompliance testing is a nonfunctional testing technique to determine if a system meets prescribed standards. Compliance testing is also known as *conformance testing*.\n\nMost software teams do an analysis to check that the standards are properly enforced and implemented. Often working simultaneously to improve the standards that, in turn, lead to increased quality.\n\nWith compliance testing, there are two important concepts to consider: compliance testing and compliance checks.\n\n- *Compliance testing* ensures that the output of each development lifecycle phase conforms to agreed-upon requirements.\n- *Compliance checks* should be integrated into the development cycle at the beginning of the projects. Attempting to add compliance checks at a later stage becomes increasingly more difficult when the requirement itself isn't adequately documented.\n\nDoing compliance checks is straight forward. A set of standards and procedures is developed and documented for each phase of the development lifecycle. The output of each phase is compared against the documented requirements. The results of the test are any \"gaps\" in not conforming to the predetermined standards. Compliance testing is done through the inspection process and the outcome of the review process should be documented.\n\nLet's take a look at a specific example.\n\nA common problem is environments that break when multiple developers apply incompatible changes. Let's say one person works on a change and applies resources such as creating a VM in a test environment. Another person then applies a different version of the code that provisions different version of that VM. What is needed here is oversight to ensure conformity to stated rules.\n\nOne way to address this issue would be to define a policy of tagging the resources - such as with `role` and `creator` tags. Once you define the policies, a tool like [Terraform-compliance](https://terraform-compliance.com) is used to ensure the policies are followed.\n\nTerraform-compliance focuses on *negative testing*. Negative testing is the process of ensuring that a system can gracefully handle unexpected input or unwanted behavior. *Fuzzing* is an example of negative testing. With fuzzing, a system that receives input is tested to ensure that it can safely handle unexpected input.\n\nFortunately, Terraform is an abstraction layer for any API that creates, updates, or destroys cloud-infrastructure entities. Terraform also ensures the local configuration and the remote API responses are in synch. Since Terraform is mostly used against Cloud APIs, we still need a way to ensure the code deployed against the infrastructure follows specific policies. Terraform-compliance - a free and open-source tool - provides this functionality for Terraform configurations.\n\nUsing the VM example, a compliance policy might be as follows: *\"If you're creating an Azure resource, it must contain a tag\"*.\n\nThe Terraform-compliance tool provides a test framework where you create policies like the example. You then run those policies against your Terraform execution plan.\n\nTerraform-compliance allows you to apply BDD, or *behavior-driven development*, principles. BDD is a collaborative process where all stakeholders work together to define what a system should do. These stakeholders generally include the developers, testers, and anyone with a vested interest in - or who will be impacted by - the system being developed. The goal of BDD is to encourage teams to build concrete examples that express a common understanding of how the system should behave.\n\n## 3. Examine a compliance-test example\n\nPreviously in this article, you read about a compliance-testing example of creating a VM for a test environment. This section shows how to translate that example into a BDD Feature and Scenario. The rule is first expressed using *Cucumber*, which is a tool used to support BDD.\n\n```Cucumber\nwhen creating Azure resources, every new resource should have a tag\n```\n\nThe previous rule is translated as follows:\n\n```Cucumber\nIf the resource supports tags\nThen it must contain a tag\nAnd its value must not be null\n```\n\nThe Terraform HCL code would then adhere to the rule as follows.\n\n```hcl\nresource \"random_uuid\" \"uuid\" {}\n\nresource \"azurerm_resource_group\" \"rg\" {\n  name     = \"rg-hello-tf-${random_uuid.uuid.result}\"\n  location = var.location\n\n  tags = {\n    environment = \"dev\"\n    application = \"Azure Compliance\"\n  } \n}\n```\n\nThe first policy could be written as a [BDD feature scenario](https://cucumber.io/docs/gherkin/reference/) as follows:\n\n```Cucumber\nFeature: Test tagging compliance  # /target/src/features/tagging.feature\n    Scenario: Ensure all resources have tags\n        If the resource supports tags\n        Then it must contain a tag\n        And its value must not be null\n```\n\nThe following code shows a test for a specific tag:\n\n```Cucumber\nScenario Outline: Ensure that specific tags are defined\n    If the resource supports tags\n    Then it must contain a tag <tags>\n    And its value must match the \"<value>\" regex\n\n    Examples:\n      | tags        | value              |\n      | Creator     | .+                 |\n      | Application | .+                 |\n      | Role        | .+                 |\n      | Environment | ^(prod\\|uat\\|dev)$ |\n```\n\n## 4. Run the compliance-test example\n\nIn this section, you download and test the example.\n\n1. Within the example directory, navigate to the `src` directory.\n\n1. Run [terraform init](https://www.terraform.io/docs/commands/init.html) to initialize the working directory.\n\n    ```console\n    terraform init\n    ```\n    \n1. Run [terraform validate](https://www.terraform.io/docs/commands/validate.html) to validate the syntax of the configuration files.\n\n    ```console\n    terraform validate\n    ```\n    \n    **Key points:**\n\n    - You see a message indicating that the Terraform configuration is valid.\n\n\n1. Run [terraform plan](https://www.terraform.io/docs/commands/plan.html) to create an execution plan.\n\n    ```console\n    terraform plan -out main.tfplan\n    ```\n\n1. Run [terraform show](https://www.terraform.io/docs/commands/show.html) to convert the execution plan to JSON for the compliance step.\n\n    ```bash\n    terraform show -json main.tfplan > main.tfplan.json\n    ```\n    \n1. Run [docker pull](https://docs.docker.com/engine/reference/commandline/pull/) to download the terraform-compliance image.\n\n    ```console\n    docker pull eerkunt/terraform-compliance\n    ```\n    \n1. Run [docker run](https://docs.docker.com/engine/reference/commandline/run/) to run the tests in a docker container.\n\n    ```console\n    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json\n    ```\n\n    **Key points:**\n\n    - The test will fail because - while the first rule requiring existence of tags succeeds - the second rule fails in that the `Role` and `Creator` tags are missing.\n\n    ![Example of a failed test](media/best-practices-compliance-testing/best-practices-compliance-testing-tagging-fail.png)\n\n1. Fix the error by modifying `main.tf` as follows (where a `Role` and `Creator` tag are added).\n\n    ```terraform\n      tags = {\n        Environment = \"dev\"\n        Application = \"Azure Compliance\"\n        Creator     = \"Azure Compliance\"\n        Role        = \"Azure Compliance\"\n      } \n    \n    ```\n\n    **Key points:**\n\n    - The configuration is now in compliance with the policy.\n    \n## 5. Verify the results\n\n1. Run `terraform validate` again to verify the syntax.\n\n    ```console\n    terraform validate\n    ```\n    \n1. Run `terraform plan` again to create a new execution plan.\n\n    ```console\n    terraform plan -out main.tfplan\n    ```\n\n1. Run [terraform show](https://www.terraform.io/docs/commands/show.html) to convert the execution plan to JSON for the compliance step.\n\n    ```bash\n    terraform show -json main.tfplan > main.tfplan.json\n    ```\n\n1. Run [docker run](https://docs.docker.com/engine/reference/commandline/run/) again to test the configuration. If the full spec has been implemented, the test succeeds.\n\n    ```console\n    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json\n    ```\n    \n    ![Example of a successful test](media/best-practices-compliance-testing/best-practices-compliance-testing-tagging-succeed.png)\n\n\n1. Run [terraform apply](https://www.terraform.io/docs/commands/apply.html) to apply the execution plan.\n\n    ```console\n    terraform apply main.tfplan -target=random_uuid.uuid\n    ```\n\n    **Key points:**\n\n    - A resource group is created with a name following the pattern: `rg-hello-tf-<random_number>`.\n\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/best-practices-end-to-end-testing.md",
    "content": "---\ntitle: Implement end-to-end Terratest testing on Terraform projects\ndescription: Learn more about end-to-end testing with Terratest on a Terraform project.\nms.topic: how-to\nms.date: 08/31/2021\nms.custom: devx-track-terraform\n---\n\n# Implement end-to-end Terratest testing on Terraform projects\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nEnd-to-end (E2E) testing is used to validate a program works before deploying it to production. An example scenario might be a Terraform module deploying two virtual machines into a virtual network. You might want to prevent the two machines from pinging each other. In this example, you could define a test to verify the intended outcome before deployment.\n\nE2E testing is typically a three-step process.\n\n1. A configuration is applied to a test environment.\n1. Code is run to verify the results.\n1. The test environment is either reinitialized or taken down (such as deallocating a virtual machine).\n\nIn this article, you learn how to:\n> [!div class=\"checklist\"]\n\n> * Understand the basics of end-to-end testing with [Terratest](https://github.com/gruntwork-io/terratest)\n> * Learn how to write end-to-end test using Golang\n> * Learn how to use Azure DevOps to automatically trigger end-to-end tests when code is committed to your repo\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- **Go programming language**: [Install Go](https://golang.org/dl/).\n\n- **Example code and resources:** Using the DownGit tool, download from GitHub the [end-to-end-testing project](https://downgit.github.io/#/home?url=https://github.com/Azure/terraform/tree/master/samples/end-to-end-testing) and unzip into a new directory to contain the example code. This directory is referred to as the *example directory*.\n\n## 2. Understand end-to-end testing\n\nEnd-to-end tests validate a system works as a collective whole. This type of testing is as opposed to testing specific modules. For Terraform projects, end-to-end testing allows for the validation of what has been deployed. This type of testing differs from many other types that test pre-deployment scenarios. End-to-end tests are critical for testing complex systems that include multiple modules and act on multiple resources. In such scenarios, end-to-end testing is the only way to determine if the various modules are interacting correctly.\n\nThis article focuses on using [Terratest](https://github.com/gruntwork-io/terratest) to implement end-to-end testing. Terratest provides all the plumbing that is required to do the following task:\n\n- Deploy a Terraform configuration\n- Enables you to write a test using the Go language to validate what has been deployed\n- Orchestrate the tests into stages\n- Tear down the deployed infrastructure\n\n## 3. Understand the test example\n\nFor this article, we're using a sample available in the [Azure/terraform sample repo](https://github.com/Azure/terraform/blob/master/samples/end-to-end-testing/README.md).\n\nThis sample defines a Terraform configuration that deploys two Linux virtual machines into the same virtual network. One VM - named `vm-linux-1` - has a public IP address. Only port 22 is opened to allow SSH connections. The second VM - `vm-linux-2` - has no defined public IP address.\n\nThe test validates the following scenarios:\n\n- The infrastructure is deployed correctly\n- Using port 22, it's possible to open an SSH session to `vm-linux-1`\n- Using the SSH session on `vm-linux-1`, it's possible to ping `vm-linux-2`\n\n![Sample end-to-end test scenario](media/best-practices-end-to-end-testing/scenario.png)\n\nIf you [downloaded the sample](#1-configure-your-environment), the Terraform configuration for this scenario can be found in the `src/main.tf` file. The `main.tf` file contains everything necessary to deploy the Azure infrastructure represented in the preceding figure.\n\nIf you're unfamiliar with how to create a virtual machine, see [Create a Linux VM with infrastructure in Azure using Terraform](/azure/virtual-machines/linux/quick-create-terraform).\n\n> [!CAUTION]\n> The sample scenario presented in this article is for illustration purposes only. We've purposely kept things simple in order to focus on the steps of an end-to-end test. We don't recommend having production virtual machines that exposes SSH ports over a public IP address.\n\n## 4. Examine the test example\n\nThe end-to-end test is written in the Go language and uses the Terratest framework. If you [downloaded the sample](#1-configure-your-environment), the test is defined in the `src/test/end2end_test.go` file.\n\nThe following source code shows the standard structure of a Golang test using Terratest:\n\n```Go\npackage test\n\nimport (\n    \"testing\"\n\n    \"github.com/gruntwork-io/terratest/modules/terraform\"\n    test_structure \"github.com/gruntwork-io/terratest/modules/test-structure\"\n)\n\nfunc TestEndToEndDeploymentScenario(t *testing.T) {\n    t.Parallel()\n\n    fixtureFolder := \"../\"\n\n    // Use Terratest to deploy the infrastructure\n    test_structure.RunTestStage(t, \"setup\", func() {\n        terraformOptions := &terraform.Options{\n            // Indicate the directory that contains the Terraform configuration to deploy\n            TerraformDir: fixtureFolder,\n        }\n\n        // Save options for later test stages\n        test_structure.SaveTerraformOptions(t, fixtureFolder, terraformOptions)\n\n        // Triggers the terraform init and terraform apply command\n        terraform.InitAndApply(t, terraformOptions)\n    })\n\n    test_structure.RunTestStage(t, \"validate\", func() {\n        // run validation checks here\n        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)\n\t\t    publicIpAddress := terraform.Output(t, terraformOptions, \"public_ip_address\")\n    })\n\n    // When the test is completed, teardown the infrastructure by calling terraform destroy\n    test_structure.RunTestStage(t, \"teardown\", func() {\n        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)\n        terraform.Destroy(t, terraformOptions)\n    })\n}\n```\n\nAs you can see in the previous code snippet, the test is composed by three stages:\n\n- **setup**: Runs Terraform to deploy the configuration\n- **validate**`: Does the validation checks and assertions\n- **teardown**: Cleans up the infrastructure after the test has run\n\nThe following list shows some of the key functions provided by the Terratest framework:\n\n- **terraform.InitAndApply**: Enables running `terraform init` and `terraform apply` from Go code\n- **terraform.Output**: Retrieves the value of the deployment output variable.\n- **terraform.Destroy**: Runs the `terraform destroy` command from Go code.\n- **test_structure.LoadTerraformOptions**: Loads Terraform options - such as configuration and variables - from the state\n- **test_structure.SaveTerraformOptions**: Saves Terraform options - such as configuration and variables - to the state\n\n## 5. Run the test example\n\nThe following steps run the test against the sample configuration and deployment.\n\n1. Open a bash/terminal window.\n\n1. Log in to your Azure account.\n\n1. To run this sample test, you need an SSH private/public key pair name `id_rsa` and `id_rsa.pub` in your home directory. Replace `<your_user_name>` with the name of your home directory.\n\n    ```bash\n    export TEST_SSH_KEY_PATH=\"~/.ssh/id_rsa\"\n    ```\n    \n1. Within the example directory, navigate to the `src/test` directory.\n\n1. Run the test.\n\n    ```go\n    go test -v ./ -timeout 10m\n    ```\n\n## 6. Verify the results\n\nAfter successfully running `go test`, you see results similar to the following output:\n    \n```output\n--- PASS: TestEndToEndDeploymentScenario (390.99s)\nPASS\nok      test    391.052s\n```\n    \n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Learn more about using Terraform in Azure](/azure/terraform)"
  },
  {
    "path": "articles/terraform/best-practices-integration-testing.md",
    "content": "---\ntitle: Implement integration testing with Terraform and Azure\ndescription: Learn about integration tests and how to use Azure DevOps to configure continuous integration for Terraform projects.\nms.topic: how-to\nms.date: 03/23/2023\nms.custom: devx-track-terraform\n---\n\n# Implement integration tests for Terraform projects in Azure\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nIntegration tests validate that a newly introduced code change doesn't break existing code. In DevOps, continuous integration (CI) refers to a process that builds the entire system whenever the code base is changed - such as someone wanting to merge a PR into a Git repo. The following list contains common examples of integration tests:\n\n- Static code analysis tools such as lint and format.\n- Run [terraform validate](https://www.terraform.io/docs/commands/validate.html) to verify the syntax of the configuration file.\n- Run [terraform plan](https://www.terraform.io/docs/commands/validate.html) to ensure the configuration will work as expected.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Learn the basics of integration testing for Terraform projects.\n> * Use Azure DevOps to configure a continuous integration pipeline.\n> * Run static code analysis on Terraform code.\n> * Run `terraform validate` to validate Terraform configuration files on the local machine.\n> * Run `terraform plan` to validate that Terraform configuration files from a remote services perspective.\n> * Use an Azure Pipeline to automate continuous integration.\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- **Azure DevOps organization and project**: If you don't have one, [create an Azure DevOps organization](/azure/devops/organizations/projects/create-project).\n\n- **Terraform Build & Release Tasks extension**: [Install the Terraform build/release tasks extension](https://marketplace.visualstudio.com/items?itemName=charleszipp.azure-pipelines-tasks-terraform) into your Azure DevOps organization.\n\n- **Grant Azure DevOps access to your Azure Subscription**: Create an [Azure service connection](/azure/devops/pipelines/library/connect-to-azure) named `terraform-basic-testing-azure-connection` to allow Azure Pipelines to connect to your Azure subscriptions\n\n- **Example code and resources:** Download from GitHub the [integration-testing project](https://github.com/Azure/terraform/tree/master/samples/integration-testing). The directory into which you download the sample is referred to as the *example directory*.\n\n## 2. Validate a local Terraform configuration\n\nThe [terraform validate](https://www.terraform.io/docs/commands/validate.html) command is run from the command line in the directory containing your Terraform files. This commands main goal is validating syntax.\n\n1. Within the example directory, navigate to the `src` directory.\n\n1. Run [terraform init](https://www.terraform.io/docs/commands/init.html) to initialize the working directory.\n\n    ```console\n    terraform init\n    ```\n\n1. Run [terraform validate](https://www.terraform.io/docs/commands/validate.html) to validate the syntax of the configuration files.\n\n    ```console\n    terraform validate\n    ```\n\n    **Key points:**\n\n    - You see a message indicating that the Terraform configuration is valid.\n\n1. Edit the `main.tf` file.\n\n1. On line 5, insert a typo that invalidates the syntax. For example, replace `var.location` with `var.loaction`\n\n1. Save the file.\n\n1. Run validation again.\n\n    ```console\n    terraform validate\n    ```\n\n    **Key points:**\n\n    - You see an error message indicating the line of code in error and a description of the error.\n\nAs you can see, Terraform has detected an issue in the syntax of the configuration code. This issue prevents the configuration from being deployed.\n\nIt is a good practice to always run `terraform validate` against your Terraform files before pushing them to your version control system. Also, this level of validation should be a part of your continuous integration pipeline. Later in this article, we'll explore how to [configure an Azure pipeline to automatically validate](#5-automate-integration-tests-using-azure-pipeline).\n\n## 3. Validate Terraform configuration\n\nIn the previous section, you saw how to validate a Terraform configuration. That level of testing was specific to syntax. That test didn't take into consideration what might already be deployed on Azure.\n\nTerraform is a *declarative language* meaning that you declare what you want as an end-result. For example, let's say you have 10 virtual machines in a resource group. Then, you create a Terraform file defining three virtual machines. Applying this plan doesn't increment the total count to 13. Instead, Terraform deletes seven of the virtual machines so that you end with three. Running `terraform plan` allows you to confirm the potential results of applying an execution plan to avoid surprises.\n\nTo generate the Terraform execution plan, you run [terraform plan](https://www.terraform.io/docs/commands/plan.html). This command connects to the target Azure subscription to check what part of the configuration is already deployed. Terraform then determines the necessary changes to meet the requirements stated in the Terraform file. At this stage, Terraform isn't deploying anything. It's telling you what will happen if you apply the plan.\n\nIf you're following along with the article and you've done the steps in the previous section, run the `terraform plan` command:\n\n```console\nterraform plan\n```\n\nAfter running `terraform plan`, Terraform displays the potential outcome of applying the execution plan. The output indicates the Azure resources that will be added, changed, and destroyed.\n\nBy default, Terraform stores state in the same local directory as the Terraform file. This pattern works well in single-user scenarios. However, when multiple people work on the same Azure resources, local state files can get out of sync. To remedy this issue, Terraform supports writing state files to a remote data store (such as Azure Storage). In this scenario, it might be problematic to run `terraform plan` on a local machine and target a remote machine. As a result, it might make sense to [automate this validation step as part of your continuous integration pipeline](#5-automate-integration-tests-using-azure-pipeline).\n\n## 4. Run static code analysis\n\nStatic code analysis can be done directly on the Terraform configuration code, without executing it. This analysis can be useful to detect issues such as security problems and compliance inconsistency.\n\nThe following tools provide static analysis for Terraform files:\n\n- [Checkov](https://github.com/bridgecrewio/checkov/)\n- [Terrascan](https://runterrascan.io)\n- [tfsec](https://github.com/tfsec/tfsec)\n- [Deepsource](https://deepsource.com/blog/release-terraform-static-analysis) \n\nStatic analysis is often executed part of a continuous integration pipeline. These tests don't require the creation of an execution plan or deployment. As a result, they run faster than other tests and are generally run first in the continuous integration process.\n\n## 5. Automate integration tests using Azure Pipeline\n\nContinuous integration involves testing an entire system when a change is introduced. In this section, you see an Azure Pipeline configuration used to implement continuous integration.\n\n1. Using your editor of choice, browse to the local clone of the [Terraform sample project on GitHub](https://github.com/Azure/terraform).\n\n1. Open the `samples/integration-testing/src/azure-pipeline.yaml` file.\n\n1. Scroll down to the **steps** section where you see a standard set of steps used to run various installation and validation routines.\n\n1. Review the line that reads, **Step 1: run the Checkov Static Code Analysis**. In this step, the `Checkov` project mentioned earlier runs a static code analysis on the sample Terraform configuration. \n\n    ```yaml\n    - bash: $(terraformWorkingDirectory)/checkov.sh $(terraformWorkingDirectory)\n      displayName: Checkov Static Code Analysis\n    ```\n    \n    **Key points:**\n    \n    - This script is responsible for running Checkov in the Terraform workspace mounted inside a Docker container. Microsoft-managed agents are Docker enabled. Running tools inside a Docker container is easier and removes the need to install Checkov on the Azure Pipeline agent.\n    - The `$(terraformWorkingDirectory)` variable is defined in the `azure-pipeline.yaml` file.\n\n1. Review the line that reads, **Step 2: install Terraform on the Azure Pipelines agent**. The [Terraform Build & Release Task extension](https://marketplace.visualstudio.com/items?itemName=JasonBJohnson.azure-pipelines-tasks-terraform) that you installed earlier has a command to install Terraform on the agent running the Azure Pipeline. This task is what is being done in this step.\n\n    ```yaml\n    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.TerraformInstaller@0\n      displayName: 'Install Terraform'\n      inputs:\n        terraformVersion: $(terraformVersion)\n    ```\n    \n    **Key points:**\n\n    - The version of Terraform to install is specified via an Azure Pipeline variable named `terraformVersion` and defined in the `azure-pipeline.yaml` file.\n\n1. Review the line that reads, **Step 3: run Terraform init to initialize the workspace**. Now that Terraform is installed on the agent, the Terraform directory can be initialized.\n\n    ```yaml\n    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0\n      displayName: 'Run terraform init'\n      inputs:\n        command: init\n        workingDirectory: $(terraformWorkingDirectory)\n    ```\n    \n    **Key points:**\n\n    - The `command` input specifies which Terraform command to run.\n    - The `workingDirectory` input indicates the path of the Terraform directory.\n    - The `$(terraformWorkingDirectory)` variable is defined in the `azure-pipeline.yaml` file.\n\n1. Review the line that reads, **Step 4: run Terraform validate to validate HCL syntax**. Once the project directory is initialized, `terraform validate` is run to validate the configuration on the server.\n\n    ```yaml\n    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0\n      displayName: 'Run terraform validate'\n      inputs:\n        command: validate\n        workingDirectory: $(terraformWorkingDirectory)\n    ```\n    \n1. Review the line that reads, **Step 5: run Terraform plan to validate HCL syntax**. As explained earlier, generating the execution plan is done to verify if the Terraform configuration is valid before deployment.\n\n    ```yaml\n    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0\n      displayName: 'Run terraform plan'\n      inputs:\n        command: plan\n        workingDirectory: $(terraformWorkingDirectory)\n        environmentServiceName: $(serviceConnection)\n        commandOptions: -var location=$(azureLocation)\n    ```\n    \n    **Key points:**\n\n    - The `environmentServiceName` input refers to the name of the Azure service connection created in [Configure your environment](#1-configure-your-environment). The connection allows Terraform to access your Azure subscription.\n    - The `commandOptions` input is used to pass arguments to the Terraform command. In this case, a location is being specified. The `$(azureLocation)` variable is defined earlier in the YAML file.\n\n### Import the pipeline into Azure DevOps\n\n1. Open your Azure DevOps project and go into the Azure Pipelines section.\n \n1. Select **Create Pipeline** button.\n\n1. For the **Where is your code?** option, select **GitHub (YAML)**.\n\n    ![Where is your code?](media/best-practices-integration-testing/new-pipeline-where-github-yaml.png)\n\n1. At this point, you might have to authorize Azure DevOps to access your organization. For more information on this topic, see the article, [Build GitHub repositories](/azure/devops/pipelines/repos/github).\n\n1. In the repositories list, select the fork of the repository you created in your GitHub organization.\n\n1. In the **Configure your pipeline** step, choose to start from an existing YAML pipeline.\n\n    ![Existing YAML pipeline](media/best-practices-integration-testing/new-pipeline-existing-yaml.png)\n\n1. When the **Select existing YAML pipeline** page displays, specify the branch `master` and enter the path to the YAML pipeline: `samples/integration-testing/src/azure-pipeline.yaml`.\n\n    ![Select existing YAML pipeline](media/best-practices-integration-testing/select-existing-yaml-pipeline.png)\n\n1. Select **Continue** to load the Azure YAML pipeline from GitHub.\n\n1. When the **Review your pipeline YAML** page displays, select **Run** to create and manually trigger the pipeline for the first time.\n\n    ![Run Azure Pipeline](media/best-practices-integration-testing/run-pipeline.png)\n\n### Verify the results\n\nYou can run the pipeline manually from the Azure DevOps UI. However, the point of the article is to show automated continuous integration. Test the process by committing a change to the `samples/integration-testing/src` folder of your forked repository. The change will automatically trigger a new pipeline on the branch on which you're pushing the code.\n\n![Pipeline running from GitHub](media/best-practices-integration-testing/pipeline-running-from-github.png)\n\nOnce you've done that step, access the details in Azure DevOps to ensure that everything ran correctly.\n\n![Azure DevOps Green Pipeline](media/best-practices-integration-testing/azure-devops-green-pipeline.png)\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/best-practices-testing-overview.md",
    "content": "---\ntitle: Testing Terraform code\ndescription: Learn about the different testing options that you can implement to validate Terraform projects.\nms.topic: concept-article\nms.date: 08/07/2021\nms.custom: devx-track-terraform\nadobe-target: true\n---\n\n# Testing Terraform code\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nTerraform is an Infrastructure as Code (IaC) tool. This category of tool refers to the fact that you treat your Terraform files as you would the project's source code. Part of that process includes versioning and source code control. Also, testing should also be a part of your process. This article gives an overview of the different types of tests that can be run against a Terraform project.\n\n## Implement integration testing\n\nIntegration tests validate that a newly introduced code change doesn't break existing code. In DevOps, continuous integration (CI) refers to a process that builds the entire system whenever the code base is changed - such as someone wanting to merge a PR into a Git repo. The following list contains common examples of integration tests:\n\n- Static code analysis tools such as lint and format.\n- Run [terraform validate](https://www.terraform.io/docs/commands/validate.html) to verify the syntax of the configuration file.\n- Run [terraform plan](https://www.terraform.io/docs/commands/validate.html) to ensure the configuration will work as expected.\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about integration testing](best-practices-integration-testing.md)\n\n## Implement unit testing\n\nUnit tests ensure a specific part or function of a program behave correctly. Unit tests are written by the developer of the functionality. Sometimes called test-driven development, or TDD, this type of testing involves continuous short development cycles. In the context of Terraform projects, unit testing can take the form of using `terraform plan` to ensure that the actual values available in the generated plan equal the expected values. \n\nUnit testing can be especially beneficial when your Terraform modules start to become more complex:\n\n- Generate dynamic blocks\n- Use loops\n- Calculate local variables\n\nAs with integration tests, many times unit tests are included in the continuous integration process.\n\n## Implement compliance testing\n\nCompliance testing is used to ensure the configuration follows the policies you've defined for the project. For example, you might define geopolitical naming conventions for your Azure resources. Or you might want virtual machines to be created from a defined subset of images. Compliance testing would be used to enforce these rules.\n\nCompliance testing is also typically defined as part of the continuous integration process.\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about compliance testing](best-practices-compliance-testing.md)\n\n## Implement end-to-end (E2E) testing\n\nE2E tests validate a program works before deploying to production. An example scenario might be a Terraform module deploying two virtual machines into a virtual network. You might want to prevent the two machines from pinging each other. In this example, you could define a test to verify the intended outcome before deployment.\n\nE2E testing is typically a three-step process. First, the configuration is applied to a test environment. Code would then be run to verify the results. Finally, the test environment is either reinitialized or taken down (such as deallocating a virtual machine).\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about end-to-end Testing](best-practices-end-to-end-testing.md)\n"
  },
  {
    "path": "articles/terraform/breadcrumb/toc.yml",
    "content": "items:\n- name: Azure\n  tocHref: /azure/index\n  topicHref: /azure/index\n  items:\n  - name: Developer\n    tocHref: /azure/developer\n    topicHref: /azure/developer/index\n    items:\n    - name: Terraform\n      tocHref: /azure\n      topicHref: /azure/developer/terraform/index\n"
  },
  {
    "path": "articles/terraform/comparing-terraform-and-bicep.md",
    "content": "---\ntitle: Comparing Terraform and Bicep\ndescription: Learn how Terraform and Bicep compare \nms.topic: concept-article\nms.date: 04/27/2022\nms.custom: devx-track-terraform, devx-track-bicep\nadobe-target: true\n---\n\n# Comparing Terraform and Bicep\n\n#### [Integration features](#tab/comparing-bicep-terraform-integration-features)\n\n[!INCLUDE [comparing-terraform-and-bicep-integration-features.md](./includes/comparing-terraform-and-bicep-integration-features.md)]\n\n#### [Usability features](#tab/comparing-bicep-terraform-usability-features)\n\n[!INCLUDE [comparing-terraform-and-bicep-usability-features.md](./includes/comparing-terraform-and-bicep-usability-features.md)]\n\n---\n"
  },
  {
    "path": "articles/terraform/concept-azapi-data-plane-framework.md",
    "content": "---\ntitle: Understand the AzAPI data plane framework\ndescription: Learn how the AzAPI Terraform provider targets Azure data plane APIs, why only a curated set of resource types is supported, and how to derive the parent_id for each service.\nms.topic: concept-article\nms.date: 04/20/2026\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\nai-usage: ai-generated\n---\n\n# Understand the AzAPI data plane framework\n\nMost Azure resources are managed through the Azure Resource Manager (ARM) control plane—a single, unified API surface at `management.azure.com`. The `azapi_resource`, `azapi_update_resource`, and `azapi_resource_action` resource types all target this control plane.\n\nSome Azure services expose a separate **data plane API**—a service-specific HTTPS endpoint where you interact directly with the service rather than through ARM. Examples include the Key Vault secrets API at `{vaultName}.vault.azure.net`, the Azure AI Search index API at `{searchServiceName}.search.windows.net`, and the Synapse workspace pipeline API at `{workspaceName}.dev.azuresynapse.net`.\n\n`azapi_data_plane_resource` bridges this gap by enabling Terraform to manage resources on these data plane endpoints using the same AzAPI provider authentication and lifecycle model.\n\n## Why only a curated set of resource types is supported\n\nUnlike `azapi_resource`, which can target any ARM resource type, `azapi_data_plane_resource` only works with a [specific list of registered resource types](https://registry.terraform.io/providers/Azure/azapi/latest/docs/resources/data_plane_resource#available-resources).\n\nThis constraint exists because data plane extensibility requires explicit registration in the AzAPI provider's data plane framework. The framework must know:\n\n- The base endpoint pattern for a service (for example, `{vaultName}.vault.azure.net`)\n- The REST path for each supported resource type (for example, `/secrets/{secret-name}`)\n- How to authenticate to this endpoint (some services require service-specific token audiences rather than the default ARM audience at `https://management.azure.com`)\n\nEach registered resource type adds this mapping to the framework. Unregistered resource types can't be targeted through `azapi_data_plane_resource`, because the provider has no way to determine the correct endpoint or authentication scope.\n\n> [!TIP]\n> If a data plane resource type you need isn't supported, you can open an issue or contribute a registration in the [terraform-provider-azapi GitHub repository](https://github.com/Azure/terraform-provider-azapi).\n\n## How `parent_id` works for data plane resources\n\nFor control plane resources (`azapi_resource`), `parent_id` is always an ARM resource ID—a path in the form `/subscriptions/{sub}/resourceGroups/{rg}/providers/{namespace}/{type}/{name}`.\n\nFor data plane resources, `parent_id` is the **service's data plane hostname**, stripped of the `https://` scheme and any trailing slash. This endpoint is typically a property exposed on the ARM control plane resource after creation.\n\nThe pattern varies by service:\n\n| Service | ARM output property | `parent_id` pattern |\n|---|---|---|\n| Key Vault | `properties.vaultUri` | `{vaultName}.vault.azure.net` |\n| Azure App Configuration | `properties.endpoint` | `{storeName}.azconfig.io` |\n| Azure AI Search | (constructed from name) | `{searchServiceName}.search.windows.net` |\n| Synapse workspace | `connectivityEndpoints.dev` | `{workspaceName}.dev.azuresynapse.net` |\n| IoT Central app | `properties.subdomain` | `{appSubdomain}.azureiotcentral.com` |\n| Microsoft Purview | (constructed from name) | `{accountName}.purview.azure.com` |\n\n### Extracting `parent_id` from ARM output\n\nUse `response_export_values` on the parent ARM resource to extract the data plane endpoint, then strip the scheme with `trimprefix` or `replace`:\n\n```terraform\nresource \"azurerm_key_vault\" \"example\" {\n  # ... configuration\n}\n\nresource \"azapi_data_plane_resource\" \"secret\" {\n  type      = \"Microsoft.KeyVault/vaults/secrets@7.4\"\n  # Strip \"https://\" and the trailing \"/\" from the vault URI\n  parent_id = trimsuffix(trimprefix(azurerm_key_vault.example.vault_uri, \"https://\"), \"/\")\n  name      = \"my-secret\"\n  body = {\n    value      = var.secret_value\n    attributes = { enabled = true }\n  }\n}\n```\n\nWhen using `azapi_resource` to create the parent instead of AzureRM, use `response_export_values` to capture the endpoint:\n\n```terraform\nresource \"azapi_resource\" \"app_config\" {\n  type      = \"Microsoft.AppConfiguration/configurationStores@2023-03-01\"\n  name      = \"my-store\"\n  parent_id = azapi_resource.resource_group.id\n  location  = \"eastus\"\n  body      = { sku = { name = \"standard\" } }\n\n  response_export_values = {\n    endpoint = \"properties.endpoint\"\n  }\n}\n\nresource \"azapi_data_plane_resource\" \"key_value\" {\n  type      = \"Microsoft.AppConfiguration/configurationStores/keyValues@1.0\"\n  parent_id = replace(azapi_resource.app_config.output.endpoint, \"https://\", \"\")\n  name      = \"mykey\"\n  body      = { value = \"myvalue\", content_type = \"\" }\n}\n```\n\nFor services where the endpoint is derived from the resource name rather than a URI property, construct it directly:\n\n```terraform\nresource \"azurerm_search_service\" \"example\" {\n  name                = \"my-search\"\n  # ... configuration\n}\n\nresource \"azapi_data_plane_resource\" \"index\" {\n  type      = \"Microsoft.Search/searchServices/indexes@2024-07-01\"\n  parent_id = \"${azurerm_search_service.example.name}.search.windows.net\"\n  name      = \"my-index\"\n  body      = { fields = [ /* ... */ ] }\n}\n```\n\n## Authentication to data plane endpoints\n\nThe AzAPI provider handles authentication transparently. It uses the same credentials you configure on the `provider \"azapi\"` block (Azure CLI, service principal, managed identity, or OpenID Connect (OIDC)), but automatically requests tokens scoped to each service's data plane audience rather than the ARM audience.\n\nFor example, Key Vault data plane operations require a token audience of `https://vault.azure.net`, not `https://management.azure.com`. The AzAPI provider selects the correct audience based on the registered endpoint for each resource type.\n\nAs a practitioner, you don't need to configure anything differently. The standard role-based access control (RBAC) permissions for the service apply—for example, `Key Vault Secrets Officer` to manage Key Vault secrets, or `App Configuration Data Owner` to manage App Configuration key-values.\n\n> [!NOTE]\n> For some services (such as Azure App Configuration and Azure AI Search), the caller must have the appropriate data plane role assignment, not just the control plane owner role. Ensure the identity running Terraform has the correct data plane role-based access control (RBAC) assignment before applying configurations that use `azapi_data_plane_resource`.\n\n## Resource ID format for import\n\nData plane resource IDs use a different format than ARM resource IDs. When importing an existing data plane resource, use the format `{parent_id}/{path}|{resource-type}@{api-version}`:\n\n```terraform\nimport {\n  to = azapi_data_plane_resource.example\n  id = \"exampleappconf.azconfig.io/kv/mykey|Microsoft.AppConfiguration/configurationStores/keyValues@1.0\"\n}\n```\n\nOr with `terraform import`:\n\n```console\nterraform import azapi_data_plane_resource.example 'exampleappconf.azconfig.io/kv/mykey|Microsoft.AppConfiguration/configurationStores/keyValues@1.0'\n```\n\n## Supported data plane services\n\nThe AzAPI provider currently supports `azapi_data_plane_resource` for resource types across these services:\n\n- **Azure App Configuration**—key-values\n- **Azure AI Foundry**—agents\n- **Azure Device Update**—groups, deployments\n- **Azure Digital Twins**—digital twins, relationships, event routes, import jobs\n- **Azure IoT Central**—organizations, users, scheduled jobs, API tokens, dashboards, device groups, device templates, devices, enrollment groups, data exports, deployment manifests\n- **Azure Key Vault**—certificates contacts, certificate issuers, keys, secrets, storage accounts, SAS definitions\n- **Microsoft Purview**—collections, resource set rule configs, key vaults, classification rules, credentials, data sources, scans, scan triggers, integration runtimes, managed private endpoints, workflows\n- **Azure AI Search**—data sources, indexers, indexes, skillsets, synonym maps\n- **Azure Synapse Analytics**—databases, dataflows, datasets, Kusto Query Language (KQL) scripts, libraries, link connections, linked services, managed private endpoints, notebooks, pipelines, role assignments, Spark job definitions, Spark configurations, SQL scripts, triggers\n\nFor the complete list with API versions and endpoint patterns, see the [available resources reference](https://registry.terraform.io/providers/Azure/azapi/latest/docs/resources/data_plane_resource#available-resources) in the Terraform Registry.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Manage Azure data plane resources with AzAPI (quickstart)](get-started-azapi-data-plane-resource.md)\n\n> [!div class=\"nextstepaction\"]\n> [Terraform AzAPI provider overview](overview-azapi-provider.md)\n"
  },
  {
    "path": "articles/terraform/configure-avd-network-settings.md",
    "content": "---\ntitle: Configure Azure Virtual Desktop Network Settings using Terraform - Azure\ndescription: Learn how to use Terraform to configure Network Settings for Azure Virtual Desktop with Terraform\nkeywords: azure devops terraform avd virtual desktop nsg\nms.topic: how-to\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Configure Azure Virtual Desktop Network Settings with Terraform\n\nArticle tested with the following Terraform and Terraform provider versions:\n\n- [Terraform v1.1.7](https://releases.hashicorp.com/terraform/)\n- [AzureRM Provider v.2.99.0](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs)\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article provides an overview of how to use Terraform to configure the network settings for Azure Virtual Desktop.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Use Terraform to create a virtual network\n> * Use Terraform to create a subnet\n> * Use Terraform to create an NSG\n> * Peering the Azure Virtual Desktop vnet with hub vnet\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/provider.tf)]\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/networking.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n```\nvariable \"resource_group_location\" {\n  default     = \"eastus\"\n  description = \"Location of the resource group.\"\n}\n\nvariable \"rg_name\" {\n  type        = string\n  default     = \"rg-avd-resources\"\n  description = \"Name of the Resource group in which to deploy service objects\"\n}\n\nvariable \"rg_shared_name\" {\n  type        = string\n  default     = \"rg-shared-resources\"\n  description = \"Name of the Resource group in which to deploy shared resources\"\n}\n\nvariable \"deploy_location\" {\n  type        = string\n  default     = \"eastus\"\n  description = \"The Azure Region in which all resources in this example should be created.\"\n}\n\nvariable \"ad_vnet\" {\n  type        = string\n  default     = \"infra-network\"\n  description = \"Name of domain controller vnet\"\n}\n\nvariable \"dns_servers\" {\n  type        = list(string)\n  default     = [\"10.0.1.4\", \"168.63.129.16\"]\n  description = \"Custom DNS configuration\"\n}\n\nvariable \"vnet_range\" {\n  type        = list(string)\n  default     = [\"10.2.0.0/16\"]\n  description = \"Address range for deployment VNet\"\n}\nvariable \"subnet_range\" {\n  type        = list(string)\n  default     = [\"10.2.0.0/24\"]\n  description = \"Address range for session host subnet\"\n}\n\nvariable \"prefix\" {\n  type        = string\n  default     = \"avdtf\"\n  description = \"Prefix of the name of the AVD machine(s)\"\n}\n```\n\n1. Create a file named `output.tf` and insert the following code:\n\n```\noutput \"location\" {\n  description = \"The Azure region\"\n  value       = azurerm_resource_group.rg.location\n}\n\noutput \"dnsservers\" {\n  description = \"Custom DNS configuration\"\n  value       = azurerm_virtual_network.vnet.dns_servers\n}\n\noutput \"vnetrange\" {\n  description = \"Address range for deployment vnet\"\n  value       = azurerm_virtual_network.vnet.address_space\n}\n```\n\n## 3. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 4. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 5. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 6. Verify the results\n\n1. On the Azure portal, Select **Azure Virtual Desktop**.\n1. Select **Host pools** and then the **Name of the pool created** resource.\n1. Select **Session hosts** and then verify the session host is listed.\n\n## 7. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/configure-avd-rbac.md",
    "content": "---\ntitle: Configure Azure Virtual Desktop Role-Based access control using Terraform\ndescription: Learn how to use Terraform to configure role-based access control for Azure Virtual Desktop.\nkeywords: azure devops terraform avd virtual desktop rbac\nms.topic: how-to\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Configure Azure Virtual Desktop role-based access control using Terraform\n\nArticle tested with the following Terraform and Terraform provider versions:\n\n- [Terraform v1.1.4](https://releases.hashicorp.com/terraform/)\n- [AzureRM Provider v.2.94.0](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs)\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article will walk through adding our users and Microsoft Entra group and then assign the group to the \"Desktop Virtualization User\" role, scoped to our host pool.  \n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Use Terraform to read Microsoft Entra existing users\n> * Use Terraform to create Microsoft Entra group\n> * Role assignment for Azure Virtual Desktop\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/provider.tf)]\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/rbac.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n```\nvariable \"avd_users\" {\n  description = \"AVD users\"\n  default = [\n    \"avduser01@contoso.net\",\n    \"avduser02@contoso.net\"\n  ]\n}\n\nvariable \"aad_group_name\" {\n  type        = string\n  default     = \"AVDUsers\"\n  description = \"Azure Active Directory Group for AVD users\"\n}\n```\n\n1. Create a file named `output.tf` and insert the following code:\n\n```\noutput \"AVD_user_groupname\" {\n  description = \"Azure Active Directory Group for AVD users\"\n  value       = azuread_group.aad_group.display_name\n}\n```\n## 6. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 7. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 8. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\nYou are now ready to build and deploy your infrastructure with role based access control.\n\n## 9. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Configuring Azure Virtual Desktop session hosts using Terraform in Azure](./create-avd-session-host.md)\n"
  },
  {
    "path": "articles/terraform/configure-azure-virtual-desktop.md",
    "content": "---\ntitle: Configure Azure Virtual Desktop using Terraform - Azure\ndescription: Learn how to use Terraform to configure Azure Virtual Desktop with Terraform\nkeywords: azure devops terraform avd virtual desktop session host\nms.topic: how-to\nms.date: 03/18/2023\nms.custom: devx-track-terraform\n---\n\n# Configure Azure Virtual Desktop with Terraform\n\nArticle tested with the following Terraform and Terraform provider versions:\n\n- [Terraform v1.1.7](https://releases.hashicorp.com/terraform/)\n- [AzureRM Provider v.2.99.0](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs)\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article provides an overview of how to use Terraform to deploy an ARM Azure Virtual Desktop environment, not AVD Classic.\n\nThere are several pre-requisites [requirements for Azure Virtual Desktop](/azure/virtual-desktop/prerequisites)\n\nNew to Azure Virtual Desktop? Start with [What is Azure Virtual Desktop?](/azure/virtual-desktop/overview)\n\nIt is assumed that an appropriate platform foundation is already setup which may or may not be the [Enterprise Scale Landing Zone platform foundation.](/azure/cloud-adoption-framework/ready/enterprise-scale/implementation)\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Use Terraform to create an Azure Virtual Desktop workspace\n> * Use Terraform to create an Azure Virtual Desktop host pool\n> * Use Terraform to create an Azure Desktop Application Group\n> * Associate a Workspace and a Desktop Application Group\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/provider.tf)]\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/main.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    ```\n    variable \"resource_group_location\" {\n    default     = \"eastus\"\n    description = \"Location of the resource group.\"\n    }\n\n    variable \"rg_name\" {\n    type        = string\n    default     = \"rg-avd-resources\"\n    description = \"Name of the Resource group in which to deploy service objects\"\n    }\n\n    variable \"workspace\" {\n    type        = string\n    description = \"Name of the Azure Virtual Desktop workspace\"\n    default     = \"AVD TF Workspace\"\n    }\n\n    variable \"hostpool\" {\n    type        = string\n    description = \"Name of the Azure Virtual Desktop host pool\"\n    default     = \"AVD-TF-HP\"\n    }\n\n    variable \"rfc3339\" {\n    type        = string\n    default     = \"2022-03-30T12:43:13Z\"\n    description = \"Registration token expiration\"\n    }\n\n    variable \"prefix\" {\n    type        = string\n    default     = \"avdtf\"\n    description = \"Prefix of the name of the AVD machine(s)\"\n    }\n    ```\n\n1. Create a file named `output.tf` and insert the following code:\n\n    ```\n    output \"azure_virtual_desktop_compute_resource_group\" {\n      description = \"Name of the Resource group in which to deploy session host\"\n      value       = azurerm_resource_group.sh.name\n    }\n    \n    output \"azure_virtual_desktop_host_pool\" {\n      description = \"Name of the Azure Virtual Desktop host pool\"\n      value       = azurerm_virtual_desktop_host_pool.hostpool.name\n    }\n    \n    output \"azurerm_virtual_desktop_application_group\" {\n      description = \"Name of the Azure Virtual Desktop DAG\"\n      value       = azurerm_virtual_desktop_application_group.dag.name\n    }\n    \n    output \"azurerm_virtual_desktop_workspace\" {\n      description = \"Name of the Azure Virtual Desktop workspace\"\n      value       = azurerm_virtual_desktop_workspace.workspace.name\n    }\n    \n    output \"location\" {\n      description = \"The Azure region\"\n      value       = azurerm_resource_group.sh.location\n    }\n    \n    output \"AVD_user_groupname\" {\n      description = \"Azure Active Directory Group for AVD users\"\n      value       = azuread_group.aad_group.display_name\n    }\n    ```\n\n## 3. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 4. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 5. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 6. Verify the results\n\n1. On the Azure portal, Select **Azure Virtual Desktop**.\n1. Select **Host pools** and then the **Name of the pool created** resource.\n1. Select **Session hosts** and then verify the session host is listed.\n\n## 7. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/configure-vs-code-extension-for-terraform.md",
    "content": "---\ntitle: Install the Microsoft Terraform Visual Studio Code extension\ndescription: Learn how to install and use the Microsoft Terraform Visual Studio Code extension to create an Azure resource group\nms.topic: how-to\nms.date: 03/09/2025\nms.custom: devx-track-terraform, mode-portal\n---\n\n# Install the Microsoft Terraform Visual Studio Code extension\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThe Visual Studio Code Terraform extension enables you to work with Terraform from the editor. With this extension, you can author, test, and run Terraform configurations.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n>\n> * Install the Microsoft Terraform and Azure Resources Visual Studio Code extension\n> * Use the extension to create an Azure resource group\n> * Verify the resource group was created\n> * Delete the resource group when finished testing using the extension\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- [Install Node.js](https://nodejs.org/).\n\n## 2. Install the Microsoft Terraform Visual Studio Code extension\n\n1. Launch Visual Studio Code.\n\n1. Select **Extensions** and search for Microsoft Terraform.\"\n\n    :::image type=\"content\" source=\"media/configure-vs-code-extension-for-terraform/search-for-microsoft-terraform-extension.png\" alt-text=\"Screenshot of searching Visual Studio Code extensions in Marketplace.\":::\n\n1. From the list of extensions, locate the `Microsoft Terraform` extension. (It should be the first extension listed.)\n\n1. If the extension isn't yet installed,  select the extension's **Install** option.\n\n   * When you select **Install** for the Microsoft Terraform extension, Visual Studio Code automatically installs the Azure Account extension earlier to authenticate with Azure and Azure-related code extensions.\n   * Now with deprecation of Azure Account extension, authentication will be handled by Visual Studio Code built-in Microsoft Authentication Provider and Azure Resources extension\n   * From the left menu, select **Extensions**, and enter `Azure Resources` in the search text box.\n        :::image type=\"content\" source=\"media/configure-vs-code-extension-for-terraform/search-for-Azure-Resources-extension.png\" alt-text=\"Screenshot of searching for Azure Resources in the Visual Studio Code Marketplace.\":::\n   * From the list of extensions, locate the `Azure Resources` extension. (It should be the first extension listed.)\n\n1. To confirm the installation of the extensions, enter `@installed` in the search text box. Both the Microsoft Terraform extension and the Azure Resources extension should appear in the list of installed extensions.\n\n    :::image type=\"content\" source=\"media/configure-vs-code-extension-for-terraform/installed-extensions-microsoft-terraform.png\" alt-text=\"Screenshot of the installed Microsoft Terraform extension.\":::\n\n    :::image type=\"content\" source=\"media/configure-vs-code-extension-for-terraform/installed-extensions-azure-resources.png\" alt-text=\"Screenshot of the installed Azure Resources extensions.\":::\n\nYou can now run all supported Terraform commands in your Cloud Shell environment from within Visual Studio Code.\n\n## 3. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-resource-group/providers.tf)]\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-resource-group/main.tf)]\n\n1. Create a file named `variables.tf` to contain the project variables and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-resource-group/variables.tf)]\n\n1. Create a file named `outputs.tf` to contain the project variables and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-resource-group/outputs.tf)]\n\n## 4. Push your code to Cloud Shell\n\n1. From the **View** menu, select **Command Palette...**.\n\n1. In the Command Palette text box, start entering `Microsoft Terraform: Push` and select it when it displays.\n\n1. Select **OK** to confirm the opening of Cloud Shell.\n\n   Your workspace files that meet the filter defined in the `azureTerraform.files` setting in your configuration are copied to Cloud Shell.\n\n## 5. Initialize Terraform within Visual Studio Code\n\n1. From the **View** menu, select **Command Palette...**.\n\n1. In the Command Palette text box, start entering `Microsoft Terraform: Init` and select it when it displays.\n\n   * Selecting this option is the same as running [terraform init](https://www.terraform.io/docs/commands/init.html) from the command line and initializes your Terraform deployment.\n   * This command downloads the Azure modules required to create an Azure resource group.\n\n1. Follow the prompts to install any dependencies - such as the latest supported version of nodejs.\n\n1. If you're using Cloud Shell for the first time with your default Azure subscription, follow the prompts to configure the environment.\n\n## 6. Create a Terraform execution plan within Visual Studio Code\n\n1. From the **View** menu, select **Command Palette...**.\n\n1. In the Command Palette text box, start entering `Microsoft Terraform: Plan` and select it when it displays.\n\n   This command runs [terraform plan](https://www.terraform.io/docs/commands/plan.html) to create an execution plan from the Terraform configuration files in the current directory.\n\n## 7. Apply a Terraform execution plan within Visual Studio Code\n\n1. From the **View** menu, select **Command Palette...**.\n\n1. In the Command Palette text box, start entering `Microsoft Terraform: Apply` and select it when it displays.\n\n1. When prompted for confirmation, enter `yes` and press `<Enter>`.\n\n## 8. Verify the results\n\n#### [Azure CLI](#tab/azure-cli)\n\n1. From the **View** menu, select **Command Palette...**.\n\n1. In the Command Palette text box, start entering `Azure: Open Bash in Cloud Shell` and select it when it displays.\n\n1. Run [az group show](/cli/azure/group#az-group-show) to display the resource group. Replace the `<resource_group_name>` placeholder with the randomly generated name of the resource group displayed after applying the Terraform execution plan.\n\n```azurecli\naz group show --name <resource_group_name>\n```\n\n#### [Azure PowerShell](#tab/azure-powershell)\n\n1. From the **View** menu, select **Command Palette...**.\n\n1. In the Command Palette text box, start entering `Azure: Open PowerShell in Cloud Shell` and select it when it displays.\n\n1. Run [Get-AzResourceGroup](/powershell/module/az.resources/Get-AzResourceGroup) to display the resource group.\n\n```azurepowershell\nGet-AzResourceGroup -Name <resource_group_name>\n```\n\n---\n\n## 9. Clean up resources\n\n1. From the **View** menu, select **Command Palette...**.\n\n1. In the Command Palette text box, start entering `Microsoft Terraform: Destroy` and select it when it displays.\n\n1. When prompted for confirmation, enter `yes` and press `<Enter>`.\n\n1. To confirm that Terraform successfully destroyed your new resource group, run the steps in the section, [Verify the results](#8-verify-the-results).\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Use the Microsoft Terraform VS Code extension](how-to-use-terraform-vscode-extension.md)\n\n> [!div class=\"nextstepaction\"]\n> [Microsoft Terraform Visual Studio Code extension on the Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureterraform)\n"
  },
  {
    "path": "articles/terraform/create-avd-azure-compute-image-gallery.md",
    "content": "---\ntitle: Configure Azure Compute Gallery using Terraform - Azure\ndescription: Learn how to use Terraform to configure Azure Compute Gallery\nkeywords: azure devops terraform avd virtual desktop session host\nms.topic: how-to\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Configure Azure Compute Gallery with Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article shows you how to configure Azure Compute Gallery.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Use Terraform to configure Azure Compute Gallery (formerly Shared Image Gallery)\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/provider.tf)]\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/sig.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n```\nvariable \"deploy_location\" {\n  type        = string\n  default     = \"eastus\"\n  description = \"The Azure Region in which all resources in this example should be created.\"\n}\n\nvariable \"rg_shared_name\" {\n  type        = string\n  default     = \"rg-shared-resources\"\n  description = \"Name of the Resource group in which to deploy shared resources\"\n}\n```\n\n1. Create a file named `output.tf` and insert the following code:\n\n```\noutput \"location\" {\n  description = \"The Azure region\"\n  value       = azurerm_resource_group.sigrg.location\n}\n\noutput \"Compute_Gallery\" {\n  description = \"Azure Compute Gallery\"\n  value       = azurerm_shared_image_gallery.sig.name\n}\n```\n\n## 3. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 4. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 5. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/create-avd-azure-files-storage.md",
    "content": "---\ntitle: Configure Azure Files for FSLogix profiles for Azure Virtual Desktop using Terraform - Azure\ndescription: Learn how to use Terraform to configure Azure Files for FSLogix profiles Azure Virtual Desktop with Terraform\nkeywords: azure devops terraform avd virtual desktop storage fslogix\nms.topic: how-to\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Configure Azure Files using Terraform\n\nArticle tested with the following Terraform and Terraform provider versions:\n\n- [Terraform v1.1.7](https://releases.hashicorp.com/terraform/)\n- [AzureRM Provider v.2.99.0](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs)\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nAzure offers multiple storage solutions that you can use to store your FSLogix profiles container. This article covers configuring Azure Files storage solutions for Azure Virtual Desktop FSLogix user profile containers using Terraform\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Use Terraform to Azure File Storage account\n> * Use Terraform to configure File Share\n> * Use Terraform to configure RBAC permission on Azure File Storage\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code.\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/provider.tf)]\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/afstorage.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n```\nvariable \"deploy_location\" {\n  type        = string\n  default     = \"eastus\"\n  description = \"The Azure Region in which all resources in this example should be created.\"\n}\n\nvariable \"rg_stor\" {\n  type        = string\n  default     = \"rg-avd-storage\"\n  description = \"Name of the Resource group in which to deploy storage\"\n}\n\nvariable \"avd_users\" {\n  description = \"AVD users\"\n  default = [\n    \"avduser01@contoso.net\",\n    \"avduser02@contoso.net\"\n  ]\n}\n\nvariable \"aad_group_name\" {\n  type        = string\n  default     = \"AVDUsers\"\n  description = \"Azure Active Directory Group for AVD users\"\n}\n```\n\n2. Create a file named `output.tf` and insert the following code:\n\n```\noutput \"location\" {\n  description = \"The Azure region\"\n  value       = azurerm_resource_group.rg_storage.location\n}\n\noutput \"storage_account\" {\n  description = \"Storage account for Profiles\"\n  value       = azurerm_storage_account.storage.name\n}\n\noutput \"storage_account_share\" {\n  description = \"Name of the Azure File Share created for FSLogix\"\n  value       = azurerm_storage_share.FSShare.name\n}\n\noutput \"AVD_user_groupname\" {\n  description = \"Azure Active Directory Group for AVD users\"\n  value       = azuread_group.aad_group.display_name\n}\n```\n\n## 3. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 4. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 5. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 6. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/create-avd-log-analytics-workspace.md",
    "content": "---\ntitle: Configure Log Analytics Workspace using Terraform - Azure\ndescription: Learn how to use Terraform to configure Azure Log Analytics Workspace\nkeywords: azure devops terraform log analytics\nms.topic: how-to\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Create an Azure Log Analytics Workspace using Terraform\n\nArticle tested with the following Terraform and Terraform provider versions:\n\n- [Terraform v1.1.7](https://releases.hashicorp.com/terraform/)\n- [AzureRM Provider v.2.99.0](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs)\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nAzure offers multiple storage solutions that you can use to store your FSLogix profiles container. This article covers configuring Azure Files storage solutions for Azure Virtual Desktop FSLogix user profile containers using Terraform. This article shows you how to create a Log Analytics workspace using Terraform.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Use Terraform to configure Azure Log Analytics Workspace\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/provider.tf)]\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/loganalytics.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n```\nvariable \"deploy_location\" {\n  type        = string\n  default     = \"eastus\"\n  description = \"The Azure Region in which all resources in this example should be created.\"\n}\n\nvariable \"rg_shared_name\" {\n  type        = string\n  default     = \"rg-shared-resources\"\n  description = \"Name of the Resource group in which to deploy shared resources\"\n}\n```\n\n1. Create a file named `output.tf` and insert the following code:\n\n```\noutput \"location\" {\n  description = \"The Azure region\"\n  value       = azurerm_resource_group.log.location\n}\n\noutput \"log_analytics\" {\n  description = \"Log Analytics Workspace\"\n  value       = azurerm_log_analytics_workspace.law.name\n}\n```\n\n## 4. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 5. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 6. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 7. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/create-avd-session-host.md",
    "content": "---\ntitle: Configure Azure Virtual Desktop Session Hosts using Terraform\ndescription: Learn how to use Terraform to configure session hosts and add them to a host pool.\nkeywords: azure devops terraform avd virtual desktop session host\nms.topic: how-to\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Configure Azure Virtual Desktop session hosts using Terraform\n\nThis article shows you how to build Session Hosts and deploy them to an AVD Host Pool with Terraform. This article assumes you've already deployed the [Azure Virtual Desktop Infrastructure](../terraform/configure-azure-virtual-desktop.md).\n\nArticle tested with the following Terraform and Terraform provider versions:\n\n- [Terraform v1.1.7](https://releases.hashicorp.com/terraform/)\n- [AzureRM Provider v.2.99.0](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs)\n\n[Learn more about using Terraform in Azure](/azure/terraform)\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Use Terraform to create NIC for each session host\n> * Use Terraform to create VM for session host\n> * Join VM to domain\n> * Register VM with Azure Virtual Desktop\n> * Use variables file\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code.\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/provider.tf)]\n\n    **Key points:**\n\n    - Use `count` to indicate how many resources will be created\n    - References resources that were created when the infrastructure was built - such as `azurerm_subnet.subnet.id` and `azurerm_virtual_desktop_host_pool.hostpool.name`.  If you  changed the name of these resources from that section, you also need to update the references here.\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/host.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n```\nvariable \"resource_group_location\" {\n  default     = \"eastus\"\n  description = \"Location of the resource group.\"\n}\n\nvariable \"rg\" {\n  type        = string\n  default     = \"rg-avd-compute\"\n  description = \"Name of the Resource group in which to deploy session host\"\n}\n\nvariable \"rdsh_count\" {\n  description = \"Number of AVD machines to deploy\"\n  default     = 2\n}\n\nvariable \"prefix\" {\n  type        = string\n  default     = \"avdtf\"\n  description = \"Prefix of the name of the AVD machine(s)\"\n}\n\nvariable \"domain_name\" {\n  type        = string\n  default     = \"infra.local\"\n  description = \"Name of the domain to join\"\n}\n\nvariable \"domain_user_upn\" {\n  type        = string\n  default     = \"domainjoineruser\" # do not include domain name as this is appended\n  description = \"Username for domain join (do not include domain name as this is appended)\"\n}\n\nvariable \"domain_password\" {\n  type        = string\n  default     = \"ChangeMe123!\"\n  description = \"Password of the user to authenticate with the domain\"\n  sensitive   = true\n}\n\nvariable \"vm_size\" {\n  description = \"Size of the machine to deploy\"\n  default     = \"Standard_DS2_v2\"\n}\n\nvariable \"ou_path\" {\n  default = \"\"\n}\n\nvariable \"local_admin_username\" {\n  type        = string\n  default     = \"localadm\"\n  description = \"local admin username\"\n}\n\nvariable \"local_admin_password\" {\n  type        = string\n  default     = \"ChangeMe123!\"\n  description = \"local admin password\"\n  sensitive   = true\n}\n```\n\n1. Create a file named `output.tf` and insert the following code:\n\n```\noutput \"location\" {\n  description = \"The Azure region\"\n  value       = azurerm_resource_group.rg.location\n}\n\noutput \"session_host_count\" {\n  description = \"The number of VMs created\"\n  value       = var.rdsh_count\n}\n\noutput \"dnsservers\" {\n  description = \"Custom DNS configuration\"\n  value       = azurerm_virtual_network.vnet.dns_servers\n}\n\noutput \"vnetrange\" {\n  description = \"Address range for deployment vnet\"\n  value       = azurerm_virtual_network.vnet.address_space\n}\n```\n\n1. Create a file named `terraform.tfvars` and insert the following code:\n\n    [!code-terraform [master](../../terraform_samples/quickstart/101-azure-virtual-desktop/environments/sample.tfvars)]\n\n## 3. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 4. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 5. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 6. Verify the results\n\n1. On the Azure portal, Select **Azure Virtual Desktop**.\n1. Select **Host pools** and then the **Name of the pool created** resource.\n1. Select **Session hosts** and then verify the session host is listed.\n\n## 7. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/create-network-watcher-nsg-flow-logs.md",
    "content": "---\ntitle: Configure Azure Network Watcher using Terraform\ndescription: Learn how to use Terraform to configure a Network Watcher and NSG flow logs in Azure.\nkeywords: azure devops terraform network watcher traffic analytics nsg\nservice: network-watcher\nms.service: azure-network-watcher\nms.date: 10/26/2023\nms.topic: how-to\nms.custom: devx-track-terraform\n---\n\n# Configure an Azure Network Watcher Connection using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article shows example Terraform code for setting up [Network Watcher](/azure/network-watcher/network-watcher-monitoring-overview) on Azure to monitor the network health for a Network Security Group.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Configure an Azure Network Watcher and flow logs\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Configure an Azure Network Watcher and flow logs\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `main.tf` and insert the following code:\n\n    ```hcl\n    provider azurerm {\n      version = \"~>2.0\"\n    \n      features {}\n    }\n    \n    resource \"azurerm_resource_group\" \"application1\" {\n      name                        = \"app1_rg\"\n      location                    = \"northcentralus\"\n    }\n    \n    # Networking components to be monitored\n    resource \"azurerm_network_security_group\" \"application1\" {\n      name                = \"application1\"\n      location            = azurerm_resource_group.application1.location\n      resource_group_name = azurerm_resource_group.application1.name\n    \n      security_rule {\n        name                       = \"test123\"\n        priority                   = 110\n        direction                  = \"Inbound\"\n        access                     = \"Deny\"\n        protocol                   = \"Tcp\"\n        source_port_range          = \"*\"\n        destination_port_range     = \"22\"\n        source_address_prefix      = \"*\"\n        destination_address_prefix = \"*\"\n      }\n    }\n    \n    # Log collection components\n    resource \"azurerm_storage_account\" \"network_log_data\" {\n      name                      = \"app1logdata\"\n      resource_group_name       = azurerm_resource_group.application1.name\n      location                  = azurerm_resource_group.application1.location\n    \n      account_tier              = \"Standard\"\n      account_replication_type  = \"GRS\"\n      min_tls_version           = \"TLS1_2\"\n    }\n    \n    resource \"azurerm_log_analytics_workspace\" \"traffic_analytics\" {\n      name                = \"app007-traffic-analytics\"\n      location            = azurerm_resource_group.application1.location\n      resource_group_name = azurerm_resource_group.application1.name\n      retention_in_days   = 90\n      daily_quota_gb      = 10\n    }\n    \n    # The Network Watcher Instance & network log flow\n    # There can only be one Network Watcher per subscription and region\n    \n    resource \"azurerm_network_watcher\" \"app1_traffic\" {\n      name                = \"NetworkWatcher_northcentralus\"\n      location            = azurerm_resource_group.application1.location\n      resource_group_name = azurerm_resource_group.application1.name\n    }\n    \n    resource \"azurerm_network_watcher_flow_log\" \"app1_network_logs\" {\n      network_watcher_name = azurerm_network_watcher.app1_traffic.name\n      resource_group_name  = azurerm_network_watcher.app1_traffic.resource_group_name\n    \n      network_security_group_id = azurerm_network_security_group.application1.id\n      storage_account_id        = azurerm_storage_account.network_log_data.id\n      enabled                   = true\n    \n      retention_policy {\n        enabled = true\n        days    = 90\n      }\n    \n      traffic_analytics {\n        enabled               = true\n        workspace_id          = azurerm_log_analytics_workspace.traffic_analytics.workspace_id\n        workspace_region      = azurerm_log_analytics_workspace.traffic_analytics.location\n        workspace_resource_id = azurerm_log_analytics_workspace.traffic_analytics.id\n        interval_in_minutes   = 10\n      }\n    }\n    ```\n\n## 3. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 4. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 5. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Network security group flow logging](/azure/network-watcher/network-watcher-nsg-flow-logging-overview)\n"
  },
  {
    "path": "articles/terraform/create-resource-group.md",
    "content": "---\ntitle: 'Quickstart: Create an Azure resource group using Terraform'\ndescription: In this article, you learn how to create an Azure resource group using Terraform\nms.topic: quickstart\nservice: azure\nms.service: azure\nms.date: 10/26/2023\nms.custom: devx-track-terraform\nadobe-target: true\ncontent_well_notification: \n  - AI-contribution\nai-usage: ai-assisted\n---\n\n# Quickstart: Create an Azure resource group using Terraform\n\nThis article shows how to create an Azure resource group using Terraform.\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create a random value for the Azure resource group name using [random_pet](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/pet).\n> * Create an Azure resource group using [azurerm_resource_group](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group).\n\n## Prerequisites\n\n- [Install and configure Terraform](quickstart-configure.md)\n\n## Implement the Terraform code\n\n> [!NOTE]\n> The sample code for this article is located in the [Azure Terraform GitHub repo](https://github.com/Azure/terraform/tree/master/quickstart/101-resource-group). You can view the log file containing the [test results from current and previous versions of Terraform](https://github.com/Azure/terraform/tree/master/quickstart/101-resource-group/TestRecord.md).\n>\n> See more [articles and sample code showing how to use Terraform to manage Azure resources](/azure/terraform)\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    :::code language=\"Terraform\" source=\"~/../terraform_samples/quickstart/101-resource-group/providers.tf\":::\n\n1. Create a file named `main.tf` and insert the following code:\n\n    :::code language=\"Terraform\" source=\"~/../terraform_samples/quickstart/101-resource-group/main.tf\":::\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    :::code language=\"Terraform\" source=\"~/../terraform_samples/quickstart/101-resource-group/variables.tf\":::\n\n1. Create a file named `outputs.tf` and insert the following code:\n\n    :::code language=\"Terraform\" source=\"~/../terraform_samples/quickstart/101-resource-group/outputs.tf\":::\n\n## Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## Verify the results\n\n#### [Azure CLI](#tab/azure-cli)\n\n1. Get the Azure resource group name.\n\n    ```console\n    resource_group_name=$(terraform output -raw resource_group_name)\n    ```\n\n1. Run [az group show](/cli/azure/group#az-group-show) to display the resource group.\n\n    ```azurecli\n    az group show --name $resource_group_name\n    ```\n\n#### [Azure PowerShell](#tab/azure-powershell)\n\n1. Get the Azure resource group name.\n\n    ```console\n    $resource_group_name=$(terraform output -raw resource_group_name)\n    ```\n\n1. Run [Get-AzResourceGroup](/powershell/module/az.resources/Get-AzResourceGroup) to display the resource group.\n\n    ```azurepowershell\n    Get-AzResourceGroup -Name $resource_group_name\n    ```\n\n---\n\n## Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/create-vm-scaleset-network-disks-hcl.md",
    "content": "---\ntitle: Create an Azure virtual machine scale set using Terraform\ndescription: Learn how to use Terraform to configure and version an Azure virtual machine scale set.\nms.topic: how-to\nservice: virtual-machine-scale-sets\nms.service: azure-virtual-machine-scale-sets\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Create an Azure virtual machine scale set using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\n[Azure virtual machine scale sets](/azure/virtual-machine-scale-sets) allow you to configure identical VMs. The number of VM instances can adjust based on demand or a schedule. For more information, see [Automatically scale a virtual machine scale set in the Azure portal](/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-autoscale-portal).\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Set up a Terraform deployment\n> * Use variables and outputs for Terraform deployment\n> * Create and deploy network infrastructure\n> * Create and deploy a virtual machine scale set and attach it to the network\n> * Create and deploy a jumpbox to connect to the VMs via SSH\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- **Create an SSH key pair**: For more information, see [How to create and use an SSH public and private key pair for Linux VMs in Azure](/azure/virtual-machines/linux/mac-create-ssh-keys).\n\n## 2. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/201-vmss-jumpbox/main.tf)]\n\n1. Create a file named `variables.tf` to contain the project variables and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/201-vmss-jumpbox/variables.tf)]\n\n1. Create a file named `output.tf` to specify what values Terraform displays and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/201-vmss-jumpbox/output.tf)]\n\n1. Create a file named `web.conf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/201-vmss-jumpbox/web.conf)]\n\n## 3. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 4. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 5. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 6. Verify the results\n\n1. From the output of the `terraform apply` command, you see values for the following:\n\n    - Virtual machine FQDN\n    - Jumpbox FQDN\n    - Jumpbox IP address\n\n1. Browse to the virtual machine URL to confirm a default page with the text **Welcome to nginx!**.\n\n1. Use SSH to connect to the jumpbox VM using the user name defined in the variables file and the password you specified when you ran `terraform apply`. For example: `ssh azureuser@<ip_address>`.\n\n## 7. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/create-vm-scaleset-network-disks-using-packer-hcl.md",
    "content": "---\ntitle: Create an Azure virtual machine scale set from a Packer custom image by using Terraform\ndescription: Learn how to use Terraform to configure and version an Azure virtual machine scale set from a custom image generated by Packer\nms.topic: how-to\nservice: virtual-machine-scale-sets\nms.service: azure-virtual-machine-scale-sets\nms.date: 10/26/2023\nms.custom: devx-track-terraform, linux-related-content\n---\n\n# Create an Azure virtual machine scale set from a Packer custom image by using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\n[Azure virtual machine scale sets](/azure/virtual-machine-scale-sets) allow you to configure identical VMs. The number of VM instances can adjust based on demand or a schedule. For more information, see [Automatically scale a virtual machine scale set in the Azure portal](/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-autoscale-portal).\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Set up your Terraform deployment\n> * Use variables and outputs for Terraform deployment\n> * Create and deploy a network infrastructure\n> * Create a custom virtual machine image by using Packer\n> * Create and deploy a virtual machine scale set by using the custom image\n> * Create and deploy a jumpbox\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Create a Packer image\n\n1. [Install Packer](https://learn.hashicorp.com/packer/getting-started/install).\n\n    **Key points:**\n\n    - To confirm that you have access to the Packer executable, run the following command: `packer -v`.\n    - Depending on your environment, you might need to set your path and reopen the command-line.\n    \n1. Run [az group create](/cli/azure/group#az-group-create) to create a resource group to hold the Packer image.\n\n    ```azurecli\n    az group create -n myPackerImages -l eastus\n    ```\n\n1. Run [az ad sp create-for-rbac](/cli/azure/ad/sp?#az-ad-sp-create-for-rbac) to enable Packer to authenticate to Azure using a service principal. \n\n    ```azurecli\n    az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<subscription_id> --query \"{ client_id: appId, client_secret: password, tenant_id: tenant }\"\n    ```\n\n    **Key points:**\n\n    - Make note of the output values (`appId`, `client_secret`, `tenant_id`).\n\n1. Run [az account show](/cli/azure/account#az-account-show) to display the current Azure subscription.\n\n    ```azurecli\n    az account show --query \"{ subscription_id: id }\"\n    ```\n\n1. Create a Packer template variables file named `ubuntu.pkr.hcl` and insert the following code. Update the highlighted lines with your service principal and Azure subscription information.\n\n    :::code language=\"Terraform\" source=\"../../terraform_samples/quickstart/201-vmss-packer-jumpbox/ubuntu.pkr.hcl\" highlight=\"12,16,21,26\":::\n\n    **Key points:**\n\n    - Set the `client_id`, `client_secret`, and `tenant_id` fields to the respective values from your service principal.\n    - Set the `subscription_id` field to your Azure subscription ID.\n\n1. Build the Packer image.\n\n    ```console\n    packer build ubuntu.json\n    ```\n\n## 3. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `main.tf` and insert the following code:\n\n    :::code language=\"Terraform\" source=\"../../terraform_samples/quickstart/201-vmss-packer-jumpbox/main.tf\":::\n\n1. Create a file named `variables.tf` to contain the project variables and insert the following code:\n\n    :::code language=\"Terraform\" source=\"../../terraform_samples/quickstart/201-vmss-packer-jumpbox/variables.tf\":::\n\n1. Create a file named `output.tf` to specify what values Terraform displays and insert the following code:\n\n    :::code language=\"Terraform\" source=\"../../terraform_samples/quickstart/201-vmss-packer-jumpbox/output.tf\":::\n\n## 4. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 5. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 6. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 7. Verify the results\n\n1. From the output of the `terraform apply` command, you see values for the following:\n\n    - Virtual machine FQDN\n    - Jumpbox FQDN\n    - Jumpbox IP address\n\n1. Browse to the virtual machine URL to confirm a default page with the text **Welcome to nginx!**.\n\n1. Use SSH to connect to the jumpbox VM using the user name defined in the variables file and the password you specified when you ran `terraform apply`. For example: `ssh azureuser@<ip_address>`.\n\n## 8. Clean up resources\n\n### Delete virtual machine scale set\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n### Delete Packer image and resource group\n\nRun [az group delete](/cli/azure/group#az-group-delete) to delete the resource group used to contain the Packer image. The Packer image is also deleted.\n\n```azurecli\naz group delete --name myPackerImages --yes\n```\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/deploy-azure-cosmos-db-to-azure-container-instances.md",
    "content": "---\ntitle: 'Quickstart: Deploy an Azure Cosmos DB to Azure Container Instances'\ndescription: Learn how to use Terraform to deploy an Azure Cosmos DB to Azure Container Instances\nms.topic: quickstart\nservice: cosmos-db\nms.service: azure-cosmos-db\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Quickstart: Deploy an Azure Cosmos DB to Azure Container Instances\n\nArticle tested with the following Terraform and Terraform provider versions:\n\n- [Terraform v1.2.7](https://releases.hashicorp.com/terraform/)\n- [AzureRM Provider v.3.20.0](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs)\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article shows how to use Terraform to deploy an Azure Cosmos DB to Azure Container Instances.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create an Azure Cosmos DB instance\n> * Create an Azure Container Instance\n> * Create an app that works across these two resources\n\n> [!NOTE]\n> The example code in this article is located in the [Microsoft Terraform GitHub repo](https://github.com/Azure/terraform/tree/master/quickstart/101-cosmos-db-azure-container-instance).\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    [!code-terraform[master](~/../terraform_samples/quickstart/101-cosmos-db-azure-container-instance/providers.tf)]\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform[master](~/../terraform_samples/quickstart/101-cosmos-db-azure-container-instance/main.tf)]\n\n1. Create a file named `aci.tf` and insert the following code:\n\n    [!code-terraform[master](~/../terraform_samples/quickstart/101-cosmos-db-azure-container-instance/aci.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    [!code-terraform[master](~/../terraform_samples/quickstart/101-cosmos-db-azure-container-instance/variables.tf)]\n\n1. Create a file named `outputs.tf` and insert the following code:\n\n    [!code-terraform[master](~/../terraform_samples/quickstart/101-cosmos-db-azure-container-instance/outputs.tf)]\n\n## Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## Verify the results\n\n1. Get the resource group name.\n\n    ```console\n    echo \"$(terraform output resource_group_name)\"\n    ```\n\n1. Get the Azure Cosmos DB account name.\n\n    ```console\n    echo \"$(terraform output cosmosdb_account_name)\"\n    ```\n\n1. Run [az cosmosdb sql database list](/cli/azure/cosmosdb/sql/database#az-cosmosdb-sql-database-list)/\n\n    ```azurecli\n    az cosmosdb sql database list \\\n      --resource-group <resource_group_name> \\\n      --account-name <cosmosdb_account_name>\n    ```\n  \n## Test application\n\n1. Get the Azure Cosmos DB account name.\n\n    ```console\n    echo \"$(terraform output dns)\"\n    ```\n\n1. Browse to the URL indicated in the previous step. You should see results similar to the following output:\n\n    ![Azure vote application](media/deploy-azure-cosmos-db-to-azure-container-instances/azure-vote.jpg)\n\n## Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/deploy-postgresql-flexible-server-database.md",
    "content": "---\ntitle: Deploy a PostgreSQL Flexible Server Database using Terraform\ndescription: Learn how to deploy a PostgreSQL Flexible Server Database using Terraform\nkeywords: azure, devops, terraform, postgresql, flexible server, database\nms.topic: how-to\nservice: postgresql\nms.service: azure-database-postgresql\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Deploy a PostgreSQL Flexible Server Database using Terraform\n\nArticle tested with the following Terraform and Terraform provider versions:\n\n- [Terraform v1.1.4](https://releases.hashicorp.com/terraform/)\n- [AzureRM Provider v.2.94.0](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs)\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article shows how to deploy a [PostgreSQL Flexible Server Database](/azure/postgresql/flexible-server/overview) using Terraform.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create an Azure resource group using [azurerm_resource_group](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_group)\n> * Create an Azure virtual network (VNet) using [azurerm_virtual_network](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/virtual_network)\n> * Create an Azure Network Security Group (NSG) using [azurerm_network_security_group](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/network_security_group)\n> * Create an Azure [subnet azurerm_subnet](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/subnet)\n> * Create an Azure subnet Network Security Group (NSG) using [azurerm_subnet_network_security_group_association](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/subnet_network_security_group_association)\n> * Define a private DNS zone within an Azure DNS using [azurerm_private_dns_zone](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/private_dns_zone)\n> * Define a private DNS zone VNet link using using [azurerm_private_dns_zone_virtual_network_link](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/private_dns_zone_virtual_network_link)\n> * Deploy an Azure PostgreSQL Flexible Server on which the database runs using [azurerm_postgresql_flexible_server](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/postgresql_flexible_server)\n> * Instantiate an Azure PostgreSQL database using [azurerm_postgresql_flexible_server_database](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/postgresql_flexible_server_database)\n\n> [!NOTE]\n> The example code in this article is located in the [Azure Terraform GitHub repo](https://github.com/Azure/terraform/tree/master/quickstart/201-postgresql-fs-db).\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Implement the Terraform code\n\n1. Create a directory in which to test and run the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/201-postgresql-fs-db/providers.tf)]\n\n1. Create a file named `main.tf` and insert the following code to deploy the PostgreSQL Flexible Server on which the database runs.\n\n    [!code-terraform[master](../../terraform_samples/quickstart/201-postgresql-fs-db/main.tf)]\n\n1. Create a file named `postgresql-fs-db.tf` and insert the following code to instantiate the database:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/201-postgresql-fs-db/postgresql-fs-db.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/201-postgresql-fs-db/variables.tf)]\n\n1. Create a file named `outputs.tf` and insert the following code to output the resource group name, Azure PostgreSQL server name, and Azure PostgreSQL database name:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/201-postgresql-fs-db/outputs.tf)]\n\n## 3. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 4. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 5. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 6. Verify the results\n\n#### [Azure CLI](#tab/azure-cli)\n\nRun [az postgres flexible-server db show](/cli/azure/postgres/flexible-server/db#az-postgres-flexible-server-db-show) to display the Azure PostgreSQL database.\n\n```azurecli\naz postgres flexible-server db show --resource-group <resource_group_name> --server-name <server_name> --database-name <database_name>\n```\n\n**Key points:**\n\n- The values for the `<resource_group_name>`, `<server_name>`, and `<database_name>` are displayed in the `terraform apply` output.\n\n#### [Azure PowerShell](#tab/azure-powershell)\n\nRun [Get-AzPostgreSqlFlexibleServerDatabase](/powershell/module/az.postgresql/get-azpostgresqlflexibleserverdatabase) to display the Azure PostgreSQL database.\n\n```azurepowershell\nGet-AzPostgreSqlFlexibleServerDatabase -ResourceGroupName <resource_group_name> -ServerName <server_name> -Name <database_name>\n```\n\n**Key points:**\n\n- The values for the `<resource_group_name>`, `<server_name>`, and `<database_name>` are displayed in the `terraform apply` output.\n\n---\n\n## 7. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about PostgreSQL Flexible Server](/azure/postgresql/flexible-server/overview)\n"
  },
  {
    "path": "articles/terraform/firewall-upgrade-premium.md",
    "content": "---\ntitle: Migrate Azure Firewall Standard to Premium using Terraform\ndescription: Learn how to migrate an existing standard Azure Firewall to Azure Firewall Premium.\nkeywords: azure, devops, terraform, firewall, migrate\nms.topic: how-to\nservice: firewall\nms.service: azure-firewall\nms.date: 10/26/2023\nauthor: TomArcherMsft\nms.author: tarcher\nms.custom:\n  - devx-track-terraform\n  - sfi-image-nochange\n---\n\n# Migrate Azure Firewall Standard to Premium using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nIf you use Terraform to deploy standard Azure Firewall with classic rules, you can modify your Terraform configuration file to migrate your firewall to Azure Firewall Premium using a Premium firewall policy.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Deploy a standard Azure Firewall with classic rules using Terraform\n> * Import the firewall rules into a premium firewall policy\n> * Edit the Terraform configuration file to migrate the firewall\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-firewall-standard/main.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-firewall-standard/variables.tf)]\n\n## 3. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 4. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 5. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 6. Import the firewall rules into a premium policy\n\nNow you have a standard firewall with classic rules. Next, create a premium Firewall Policy and import the rules from the firewall.\n\n1. On the Azure portal, select **Create a resource**.\n1. Search for **firewall policy** and select it.\n1. Select **Create**.\n1. For Resource group select **test-resources** .\n1. For Name, type **prem-pol**.\n1. For Region, select **East US**.\n1. For Policy tier, select **Premium**.\n1. Select **Next: DNS Settings**, and continue until you reach the Rules page.\n1. On the Rules page, select **Import rules from an Azure Firewall**.\n1. Select **testfirewall**, and then select **Import**.\n1. Select **Review + create**.\n1. Select **Create**.\n\n## 7. Edit the Terraform configuration file to migrate the firewall\n\nOpen the `main.tf` file, and make the following changes:\n\n1. Add the following 'data' section:\n\n   ```terraform\n   data \"azurerm_firewall_policy\" \"prem-pol\" {\n     name                 = \"prem-pol\"\n     resource_group_name  = azurerm_resource_group.rg.name\n   }\n   ```\n\n2. Modify the firewall resource:\n\n   ```terraform\n    resource \"azurerm_firewall\" \"fw\" {\n        name                = \"testfirewall\"\n        location            = azurerm_resource_group.rg.location\n        resource_group_name = azurerm_resource_group.rg.name\n        firewall_policy_id  = data.azurerm_firewall_policy.prem-pol.id\n        sku_tier            = \"Premium\"\n\n    ip_configuration {\n        name                 = \"configuration\"\n        subnet_id            = azurerm_subnet.subnet.id\n        public_ip_address_id = azurerm_public_ip.pip.id\n    }\n   }\n   ```\n\n3. Delete the classic rule collections:\n\n   ```terraform\n   resource \"azurerm_firewall_application_rule_collection\" \"app-rc\" {\n     name                = \"apptestcollection\"\n     azure_firewall_name = azurerm_firewall.fw.name\n     resource_group_name = azurerm_resource_group.rg.name\n     priority            = 100\n     action              = \"Allow\"\n   \n     rule {\n       name = \"testrule\"\n   \n       source_addresses = [\n         \"10.0.0.0/16\",\n       ]\n   \n       target_fqdns = [\n         \"*.google.com\",\n       ]\n   \n       protocol {\n         port = \"443\"\n         type = \"Https\"\n       }\n     }\n   }\n   \n   resource \"azurerm_firewall_network_rule_collection\" \"net-rc\" {\n     name                = \"nettestcollection\"\n     azure_firewall_name = azurerm_firewall.fw.name\n     resource_group_name = azurerm_resource_group.rg.name\n     priority            = 100\n     action              = \"Allow\"\n   \n     rule {\n       name = \"dnsrule\"\n   \n       source_addresses = [\n         \"10.0.0.0/16\",\n       ]\n   \n       destination_ports = [\n         \"53\",\n       ]\n   \n       destination_addresses = [\n         \"8.8.8.8\",\n         \"8.8.4.4\",\n       ]\n   \n       protocols = [\n         \"TCP\",\n         \"UDP\",\n       ]\n     }\n   }\n   ```\n\n## 8. Apply the modified Terraform execution plan\n\n1. `terraform plan -out main.tfplan`\n1. `terraform apply main.tfplan`\n\n## 9. Verify the results\n\n1. Select the **test-resources** resource group.\n1. Select the **testfirewall** resource.\n1. Verify the Firewall sku is **Premium**.\n1. Verify the firewall is using the **prem-pol** firewall policy.\n:::image type=\"content\" source=\"media/firewall-upgrade-premium/firewall-premium.png\" alt-text=\"Azure Firewall Premium with a Premium policy.\":::\n\n## 10. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/get-started-azapi-data-plane-resource.md",
    "content": "---\ntitle: Quickstart - Manage Azure Key Vault certificate contacts with the AzAPI Terraform provider\ndescription: Learn how to use the azapi_data_plane_resource to manage Azure Key Vault certificate contacts.\nkeywords: azure devops terraform key vault azapi data_plane_resource\nms.topic: quickstart\nms.date: 04/20/2026\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\nai-usage: ai-generated\n---\n\n# Quickstart: Manage Azure Key Vault certificate contacts with the AzAPI Terraform provider\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nUse [`azapi_data_plane_resource`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/resources/data_plane_resource) to manage Azure data plane resources in Terraform. In this example, you configure certificate contacts for an Azure Key Vault.\n\nFor foundational concepts about how the data plane framework works and `parent_id` patterns, see [Understand the AzAPI data plane framework](concept-azapi-data-plane-framework.md).\n\n> [!div class=\"checklist\"]\n> * Create a Key Vault with the AzureRM provider\n> * Use `azapi_data_plane_resource` to configure certificate contacts\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n[!INCLUDE [confirm-default-azure-subscription-or-authenticate.md](includes/confirm-default-azure-subscription-or-authenticate.md)]\n\n## Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    ```terraform\n    terraform {\n      required_providers {\n        azapi = {\n          source  = \"Azure/azapi\"\n          version = \"~> 2.0\"\n        }\n        azurerm = {\n          source  = \"hashicorp/azurerm\"\n          version = \"~> 4.0\"\n        }\n        random = {\n          source  = \"hashicorp/random\"\n          version = \"~> 3.0\"\n        }\n      }\n    }\n    \n    provider \"azurerm\" {\n      features {\n        key_vault {\n          purge_soft_delete_on_destroy    = true\n          recover_soft_deleted_key_vaults = true\n        }\n      }\n    }\n    \n    provider \"azapi\" {}\n    ```\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    ```terraform\n    variable \"resource_group_location\" {\n      type        = string\n      default     = \"eastus\"\n      description = \"Location of the resource group.\"\n    }\n    \n    variable \"resource_group_name_prefix\" {\n      type        = string\n      default     = \"rg\"\n      description = \"Prefix of the resource group name that's combined with a random value to create a unique name.\"\n    }\n    ```\n\n1. Create a file named `main.tf` and insert the following code:\n\n    ```terraform\n    resource \"random_pet\" \"rg_name\" {\n      prefix = var.resource_group_name_prefix\n    }\n    \n    resource \"random_string\" \"kv_suffix\" {\n      length  = 6\n      upper   = false\n      special = false\n    }\n    \n    resource \"azurerm_resource_group\" \"example\" {\n      location = var.resource_group_location\n      name     = random_pet.rg_name.id\n    }\n    \n    data \"azurerm_client_config\" \"current\" {}\n    \n    resource \"azurerm_key_vault\" \"example\" {\n      name                = \"kv-${random_string.kv_suffix.result}\"\n      location            = azurerm_resource_group.example.location\n      resource_group_name = azurerm_resource_group.example.name\n      tenant_id           = data.azurerm_client_config.current.tenant_id\n      sku_name            = \"standard\"\n    \n      access_policy {\n        tenant_id = data.azurerm_client_config.current.tenant_id\n        object_id = data.azurerm_client_config.current.object_id\n    \n        certificate_permissions = [\n          \"ManageContacts\",\n        ]\n      }\n    }\n    \n    resource \"azapi_data_plane_resource\" \"certificate_contacts\" {\n      type      = \"Microsoft.KeyVault/vaults/certificates/contacts@7.3\"\n      parent_id = trimsuffix(trimprefix(azurerm_key_vault.example.vault_uri, \"https://\"), \"/\")\n      name      = \"default\"\n    \n      body = {\n        contacts = [\n          {\n            emailAddress = \"admin@contoso.com\"\n            name         = \"Admin Contact\"\n            phone        = \"555-555-0100\"\n          },\n          {\n            emailAddress = \"ops@contoso.com\"\n            name         = \"Operations\"\n          }\n        ]\n      }\n    }\n    ```\n\n    Key points about `azapi_data_plane_resource`:\n\n    - The `type` field uses the format `<resource-type>@<api-version>` for the data plane API.\n    - The `parent_id` is the data plane endpoint hostname (without the `https://` prefix), not an ARM resource ID.\n    - The `name` field identifies the specific resource within the parent. For Key Vault certificate contacts, the value is always `default`.\n\n1. Create a file named `outputs.tf` and insert the following code:\n\n    ```terraform\n    output \"resource_group_name\" {\n      value = azurerm_resource_group.example.name\n    }\n    \n    output \"key_vault_name\" {\n      value = azurerm_key_vault.example.name\n    }\n    \n    output \"certificate_contacts\" {\n      value = azapi_data_plane_resource.certificate_contacts.output\n    }\n    ```\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## Verify the results\n\n#### [Azure CLI](#tab/azure-cli)\n\nRun [az keyvault certificate contact list](/cli/azure/keyvault/certificate/contact#az-keyvault-certificate-contact-list) to retrieve the certificate contacts.\n\n    ```azurecli\n    az keyvault certificate contact list --vault-name <key_vault_name>\n    ```\n\n#### [Azure PowerShell](#tab/azure-powershell)\n\nRun [Get-AzKeyVaultCertificateContact](/powershell/module/az.keyvault/get-azkeyvaultcertificatecontact) to retrieve the certificate contacts.\n\n    ```powershell\n    Get-AzKeyVaultCertificateContact -VaultName <key_vault_name>\n    ```\n\n---\n\n## Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Terraform AzAPI provider overview](overview-azapi-provider.md)\n\n> [!div class=\"nextstepaction\"]\n> [Learn how to use the AzAPI resource](get-started-azapi-resource.md)\n\n## Additional reading\n\n- [Choose between AzureRM and AzAPI Terraform providers](provider-selection-azurerm-vs-azapi.md)\n- [Understand the AzAPI data plane framework](concept-azapi-data-plane-framework.md)\n"
  },
  {
    "path": "articles/terraform/get-started-azapi-resource-action-mutation.md",
    "content": "---\ntitle: Quickstart - Perform Azure resource actions with the AzAPI Terraform provider\ndescription: Learn how to use azapi_resource_action as a managed resource to perform imperative Azure operations such as rotating storage account keys.\nkeywords: azure devops terraform storage account azapi resource_action key rotation\nms.topic: quickstart\nms.date: 04/20/2026\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\nai-usage: ai-generated\n---\n\n# Quickstart: Perform Azure resource actions with the AzAPI Terraform provider\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nUse [`azapi_resource_action`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/resources/resource_action) as a managed Terraform resource to perform imperative, state-changing operations on Azure resources. In this example, you create an Azure storage account and then rotate its access keys.\n\n`azapi_resource_action` has two usage forms:\n\n- **Resource**: Performs a state-changing operation during `terraform apply`. Terraform tracks the action in state and can optionally reverse it on `terraform destroy`.\n- **Data source**: Performs a read-only operation during planning. See the [resource action data source quickstart](get-started-azapi-resource-action.md) for that scenario.\n\nUse the resource form when you need Terraform to perform an Azure operation that isn't based on a standard create/read/update/delete lifecycle—for example, rotating credentials, starting or stopping a VM, or triggering a failover.\n\n> [!div class=\"checklist\"]\n> * Create a storage account with the AzureRM provider\n> * Rotate the storage account access key with `azapi_resource_action`\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n[!INCLUDE [confirm-default-azure-subscription-or-authenticate.md](includes/confirm-default-azure-subscription-or-authenticate.md)]\n\n## Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    ```terraform\n    terraform {\n      required_providers {\n        azapi = {\n          source  = \"Azure/azapi\"\n          version = \"~> 2.0\"\n        }\n        azurerm = {\n          source  = \"hashicorp/azurerm\"\n          version = \"~> 4.0\"\n        }\n        random = {\n          source  = \"hashicorp/random\"\n          version = \"~> 3.0\"\n        }\n      }\n    }\n    \n    provider \"azurerm\" {\n      features {}\n    }\n    \n    provider \"azapi\" {}\n    ```\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    ```terraform\n    variable \"resource_group_location\" {\n      type        = string\n      default     = \"eastus\"\n      description = \"Location of the resource group.\"\n    }\n    \n    variable \"resource_group_name_prefix\" {\n      type        = string\n      default     = \"rg\"\n      description = \"Prefix of the resource group name that's combined with a random value to create a unique name.\"\n    }\n    \n    variable \"storage_account_name_prefix\" {\n      type        = string\n      default     = \"st\"\n      description = \"Prefix of the storage account name that's combined with a random value to create a unique name.\"\n    }\n    ```\n\n1. Create a file named `main.tf` and insert the following code:\n\n    ```terraform\n    resource \"random_pet\" \"rg_name\" {\n      prefix = var.resource_group_name_prefix\n    }\n    \n    resource \"random_string\" \"storage_suffix\" {\n      length  = 8\n      upper   = false\n      special = false\n    }\n    \n    resource \"azurerm_resource_group\" \"example\" {\n      location = var.resource_group_location\n      name     = random_pet.rg_name.id\n    }\n    \n    resource \"azurerm_storage_account\" \"example\" {\n      name                     = \"${var.storage_account_name_prefix}${random_string.storage_suffix.result}\"\n      resource_group_name      = azurerm_resource_group.example.name\n      location                 = azurerm_resource_group.example.location\n      account_tier             = \"Standard\"\n      account_replication_type = \"LRS\"\n    }\n    \n    resource \"azapi_resource_action\" \"regenerate_key\" {\n      type        = \"Microsoft.Storage/storageAccounts@2023-01-01\"\n      resource_id = azurerm_storage_account.example.id\n      action      = \"regenerateKey\"\n      method      = \"POST\"\n    \n      body = {\n        keyName = \"key1\"\n      }\n    }\n    ```\n\n    Key points about using `azapi_resource_action` as a resource:\n\n    - The `action` field specifies the ARM operation to perform. For storage account key rotation, use `regenerateKey`.\n    - The `method` field specifies the HTTP method. Most imperative actions use `POST`.\n    - The `body` attribute passes data to the action. For key regeneration, specify which key (`key1` or `key2`) to rotate.\n    - The action is performed during `terraform apply` and tracked in Terraform state.\n\n1. Create a file named `outputs.tf` and insert the following code:\n\n    ```terraform\n    output \"resource_group_name\" {\n      value = azurerm_resource_group.example.name\n    }\n    \n    output \"storage_account_name\" {\n      value = azurerm_storage_account.example.name\n    }\n    ```\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## Verify the results\n\nAfter `terraform apply` completes, the storage account key has been rotated. You can verify the key rotation by checking the storage account keys in Azure.\n\n#### [Azure CLI](#tab/azure-cli)\n\nRun [az storage account keys list](/cli/azure/storage/account/keys#az-storage-account-keys-list) to view the storage account keys.\n\n    ```azurecli\n    az storage account keys list \\\n      --resource-group <resource_group_name> \\\n      --account-name <storage_account_name>\n    ```\n\n    The `value` field shows the current key.\n\n#### [Azure PowerShell](#tab/azure-powershell)\n\nRun [Get-AzStorageAccountKey](/powershell/module/az.storage/get-azstorageaccountkey) to view the storage account keys.\n\n    ```powershell\n    Get-AzStorageAccountKey `\n      -ResourceGroupName <resource_group_name> `\n      -Name <storage_account_name>\n    ```\n\n    The `Value` property shows the current key.\n\n---\n\n## Examples of other resource actions\n\nThe `azapi_resource_action` resource works with many Azure operations. Here are common examples:\n\n- **Virtual Machines**: `deallocate`, `start`, `restart`, `powerOff`, `reimage`\n- **Key Vaults**: `purge` (for soft-deleted vaults), `rotate` (for managed keys)\n- **App Services**: `swap` (for deployment slots), `restart`\n- **Databases**: `failover`, `promote`\n- **Compute resources**: Any operation exposed by the Azure REST API that modifies state without creating or destroying a resource\n\n## Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Terraform AzAPI provider overview](overview-azapi-provider.md)\n\n> [!div class=\"nextstepaction\"]\n> [Learn how to use the AzAPI resource action as a data source](get-started-azapi-resource-action.md)\n"
  },
  {
    "path": "articles/terraform/get-started-azapi-resource-action.md",
    "content": "---\ntitle: Quickstart - Deploy your first resource action with the AzAPI Terraform provider\ndescription: Learn how to use the AzAPI Terraform provider to list keys\nkeywords: azure devops terraform virtual machine azapi resource_action\nms.topic: quickstart\nms.date: 12/05/2023\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\n---\n\n# Quickstart: Deploy your first Azure resource_action resource with the AzAPI Terraform provider\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nUse the [AzAPI Terraform provider](https://registry.terraform.io/providers/azure/azapi/latest/docs) to perform read-only operations on Azure resources as a data source. In this example, you list [Azure Key Vault Keys](/azure/key-vault/) without managing their lifecycle.\n\n> [!div class=\"checklist\"]\n> * Create a Key Vault and key with AzureRM\n> * Use `azapi_resource_action` to list the keys\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n[!INCLUDE [confirm-default-azure-subscription-or-authenticate.md](includes/confirm-default-azure-subscription-or-authenticate.md)]\n\n## Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    ```\n    terraform {\n      required_providers {\n        azapi = {\n          source = \"Azure/azapi\"\n        }\n      }\n    }\n\n    provider \"azapi\" {}\n\n    provider \"azurerm\" {\n      features {}\n    }\n    ```\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-key-vault-key/main.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-key-vault-key/variables.tf)]\n\n1. Create a file named `outputs.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-key-vault-key/outputs.tf)]\n\n1. Create a file named `main-generic.tf` and insert the following code:\n\n    ```\n    data \"azapi_resource_action\" \"example\" {\n      type                   = \"Microsoft.KeyVault/vaults@2023-07-01\"\n      resource_id            = azurerm_key_vault.vault.id\n      action                 = \"listKeys\"\n    }\n    ```    \n\n## Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## Verify the results\n\n**Key points:**\n\n- The list of keys are displayed in the `terraform apply` output.\n\n---\n\n## Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about using the AzAPI provider](./overview-azapi-provider.md)\n"
  },
  {
    "path": "articles/terraform/get-started-azapi-resource-list.md",
    "content": "---\ntitle: Quickstart - List Azure resources with the AzAPI Terraform provider\ndescription: Learn how to use the azapi_resource_list data source to list Azure resources and filter results with JMESPath.\nkeywords: azure devops terraform azapi resource_list data source jmespath\nms.topic: quickstart\nms.date: 04/20/2026\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\nai-usage: ai-generated\n---\n\n# Quickstart: List Azure resources with the AzAPI Terraform provider\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nIn this article, you use the [`azapi_resource_list`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/data-sources/resource_list) data source to list Azure resources and filter results with [JMESPath](https://jmespath.org/) expressions. You create two storage accounts, then use `azapi_resource_list` to list and extract their properties.\n\n> [!div class=\"checklist\"]\n> * Create a resource group and two storage accounts with the AzureRM provider\n> * Use `azapi_resource_list` to list the storage accounts and extract their names and locations using JMESPath\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n[!INCLUDE [confirm-default-azure-subscription-or-authenticate.md](includes/confirm-default-azure-subscription-or-authenticate.md)]\n\n## Understand `response_export_values`\n\nThe `response_export_values` attribute controls which properties are extracted from the API response and made available in the `output` attribute of the data source. It accepts either a list or a map:\n\n- **List**: Specifies JSON paths to extract. Use `[\"*\"]` to export the full response body.\n- **Map**: Uses JMESPath expressions to filter and reshape the response. The key is the name of the result, and the value is the JMESPath expression.\n\nThe map form is preferred when you need to extract specific fields or transform list responses, because it produces cleaner, more usable output values.\n\n## Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    ```terraform\n    terraform {\n      required_providers {\n        azapi = {\n          source  = \"Azure/azapi\"\n          version = \"~> 2.0\"\n        }\n        azurerm = {\n          source  = \"hashicorp/azurerm\"\n          version = \"~> 4.0\"\n        }\n        random = {\n          source  = \"hashicorp/random\"\n          version = \"~> 3.0\"\n        }\n      }\n    }\n    \n    provider \"azurerm\" {\n      features {}\n    }\n    \n    provider \"azapi\" {}\n    ```\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    ```terraform\n    variable \"resource_group_location\" {\n      type        = string\n      default     = \"eastus\"\n      description = \"Location of the resource group.\"\n    }\n    \n    variable \"resource_group_name_prefix\" {\n      type        = string\n      default     = \"rg\"\n      description = \"Prefix of the resource group name that's combined with a random value to create a unique name.\"\n    }\n    ```\n\n1. Create a file named `main.tf` and insert the following code:\n\n    ```terraform\n    resource \"random_pet\" \"rg_name\" {\n      prefix = var.resource_group_name_prefix\n    }\n    \n    resource \"random_string\" \"storage_suffix\" {\n      length  = 8\n      upper   = false\n      special = false\n    }\n    \n    resource \"azurerm_resource_group\" \"example\" {\n      location = var.resource_group_location\n      name     = random_pet.rg_name.id\n    }\n    \n    resource \"azurerm_storage_account\" \"example\" {\n      count                    = 2\n      name                     = \"st${random_string.storage_suffix.result}${count.index}\"\n      resource_group_name      = azurerm_resource_group.example.name\n      location                 = azurerm_resource_group.example.location\n      account_tier             = \"Standard\"\n      account_replication_type = \"LRS\"\n    }\n    ```\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## List resources with `azapi_resource_list`\n\nNow that the storage accounts are created, add a data source to list them and extract properties using JMESPath.\n\n1. Create a file named `list_resources.tf` and insert the following code:\n\n    ```terraform\n    data \"azapi_resource_list\" \"storage_accounts\" {\n      type      = \"Microsoft.Storage/storageAccounts@2023-01-01\"\n      parent_id = azurerm_resource_group.example.id\n    \n      # Use JMESPath expressions to extract specific fields from the response.\n      # The API returns a list of resources in a top-level \"value\" array.\n      response_export_values = {\n        \"names\"     = \"value[].name\"\n        \"locations\" = \"value[].location\"\n        \"skus\"      = \"value[].sku.name\"\n      }\n    }\n    ```\n\n1. Create a file named `outputs.tf` and insert the following code:\n\n    ```terraform\n    output \"resource_group_name\" {\n      value = azurerm_resource_group.example.name\n    }\n    \n    output \"storage_account_names\" {\n      value = data.azapi_resource_list.storage_accounts.output.names\n    }\n    \n    output \"storage_account_locations\" {\n      value = data.azapi_resource_list.storage_accounts.output.locations\n    }\n    \n    output \"storage_account_skus\" {\n      value = data.azapi_resource_list.storage_accounts.output.skus\n    }\n    ```\n\n1. Run `terraform apply` again to create the data source and extract the outputs:\n\n    ```console\n    terraform apply\n    ```\n\n## Key points about `azapi_resource_list`\n\n- The `type` field identifies the resource type and API version to list.\n- The `parent_id` field sets the scope: a resource group ID to list within a resource group, a subscription ID to list across a subscription, or a parent resource ID to list child resources (for example, subnets under a VNet).\n- The map form of `response_export_values` uses JMESPath expressions against the raw API response. The storage account list API returns results in a top-level `value` array, so expressions start with `value[]`.\n\n## List resources at different scopes\n\nThe `parent_id` determines the listing scope. Examples:\n\n```terraform\n# List all storage accounts in a subscription\ndata \"azapi_resource_list\" \"all_storage\" {\n  type      = \"Microsoft.Storage/storageAccounts@2023-01-01\"\n  parent_id = \"/subscriptions/${var.subscription_id}\"\n  response_export_values = {\n    \"names\" = \"value[].name\"\n  }\n}\n\n# List subnets in a virtual network (child resource listing)\ndata \"azapi_resource_list\" \"subnets\" {\n  type      = \"Microsoft.Network/virtualNetworks/subnets@2023-11-01\"\n  parent_id = azurerm_virtual_network.example.id\n  response_export_values = [\"*\"]\n}\n```\n\n## Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Terraform AzAPI provider overview](overview-azapi-provider.md)\n\n> [!div class=\"nextstepaction\"]\n> [Use provider functions in the AzAPI Terraform provider](how-to-use-azapi-provider-functions.md)\n"
  },
  {
    "path": "articles/terraform/get-started-azapi-resource.md",
    "content": "---\ntitle: Quickstart - Deploy your first Azure resource with the AzAPI Terraform provider\ndescription: Learn how to use the AzAPI Terraform provider to manage an Azure Container Registry resource\nkeywords: azure devops terraform acr azapi resource\nms.topic: quickstart\nms.date: 01/30/2025\nms.custom: devx-track-terraform\n---\n\n# Quickstart: Deploy your first Azure resource with the AzAPI Terraform provider\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThe [AzAPI Terraform provider](https://registry.terraform.io/providers/azure/azapi/latest/docs) manages Azure resources directly through the Azure Resource Manager API. It's particularly useful for resources, properties, or API versions not yet supported by [AzureRM](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs). In this example, you use `azapi_resource` to create an [Azure Container Registry](/azure/container-registry/).\n\n> [!div class=\"checklist\"]\n> * Create a resource group and container registry with AzAPI\n> * Register the Microsoft.ContainerRegistry provider\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n[!INCLUDE [confirm-default-azure-subscription-or-authenticate.md](includes/confirm-default-azure-subscription-or-authenticate.md)]\n\n## Implement the Terraform code\n\n> [!NOTE]\n> The sample code for this article is located in the [Azure Terraform GitHub repo](https://github.com/Azure/terraform/tree/master/quickstart/101-azapi-lab-services). You can view the log file containing the [test results from current and previous versions of Terraform](https://github.com/Azure/terraform/tree/master/quickstart/101-azapi-lab-services/TestRecord.md).\n> \n> See more [articles and sample code showing how to use Terraform to manage Azure resources](/azure/terraform)\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-azapi-lab-services/providers.tf)]\n\n1. Create a file named `variables.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-azapi-lab-services/variables.tf)]\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-azapi-lab-services/main.tf)]\n\n1. Create a file named `outputs.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-azapi-lab-services/outputs.tf)]\n\n## Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## Verify the results\n\n### [Azure CLI](#tab/azure-cli)\n\n1. Get the resource group name.\n\n    ```bash\n    resource_group_name=$(terraform output -raw resource_group_name)\n    ```\n\n1. Get the container registry name.\n\n    ```bash\n    azure_container_registry_name=$(terraform output -raw azure_container_registry_name)\n    ```\n\n1. Run [az acr show](/cli/azure/acr#az-acr-show) to view the container registry.\n\n    ```azurecli\n    az acr show --name $azure_container_registry_name --resource-group $resource_group_name\n    ```\n\n### [Azure PowerShell](#tab/azure-powershell)\n\n1. Get the resource group name.\n\n    ```powershell\n    $resource_group_name=$(terraform output -raw resource_group_name)\n    ```\n\n1. Get the container registry name.\n\n    ```powershell\n    $azure_container_registry_name=$(terraform output -raw azure_container_registry_name)\n    ```\n\n1. Run [Get-AzContainerRegistry](/powershell/module/az.containerregistry/get-azcontainerregistry) to view the container registry.\n\n    ```azurepowershell\n    Get-AzContainerRegistry -ResourceGroupName $resource_group_name -Name $azure_container_registry_name\n    ```\n\n---\n\n## Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about the AzAPI provider](./overview-azapi-provider.md)\n"
  },
  {
    "path": "articles/terraform/get-started-azapi-update-resource.md",
    "content": "---\ntitle: Quickstart - Deploy your first Azure update-resource with the AzAPI Terraform provider\ndescription: Learn how to use the AzAPI Terraform provider to manage network rules on an Azure Event Hubs namespace\nkeywords: azure devops terraform event hubs azapi update_resource\nms.topic: quickstart\nms.date: 11/21/2024\nms.custom: devx-track-terraform\nauthor: grayzu\nms.author: markgray\n---\n\n# Quickstart: Deploy your first Azure update resource with the AzAPI Terraform provider\n\nArticle tested with the following Terraform and Terraform provider versions:\n\n- [Terraform v1.1.8](https://releases.hashicorp.com/terraform/)\n- [AzureRM Provider v.3.0.2](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs)\n- [AzAPI Provider v.0.1.0](https://registry.terraform.io/providers/azure/azapi/latest/docs)\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nUse the [AzAPI Terraform provider](https://registry.terraform.io/providers/azure/azapi/latest/docs) to manage new features of Azure services not yet supported by [AzureRM](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs). In this example, you use `azapi_update_resource` to configure Azure Event Hubs network rules.\n\n> [!div class=\"checklist\"]\n> * Create an Event Hubs namespace and rule with AzureRM\n> * Use AzAPI to update the namespace with network rules\n> * Generate a random name for the Event Hubs namespace\n> * Use the AzureRM provider to create an Azure resource group and the required networking and Event Hubs resources\n> * Use the AzAPI provider to add a network rule set to the `azurerm_eventhub_namespace` resources\n\n> [!NOTE]\n> The example code in this article is located in the [Azure Terraform GitHub repo](https://github.com/Azure/terraform/tree/master/quickstart/101-azapi-eventhub-network-rules).\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n[!INCLUDE [confirm-default-azure-subscription-or-authenticate.md](includes/confirm-default-azure-subscription-or-authenticate.md)]\n\n## Implement the Terraform code\n\n1. Create a directory in which to test the sample Terraform code and make it the current directory.\n\n1. Create a file named `providers.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-azapi-eventhub-network-rules/providers.tf)]\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-azapi-eventhub-network-rules/main.tf)]\n\n1. Create a file named `main-generic.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/101-azapi-eventhub-network-rules/main-generic.tf)]\n\n## Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## Verify the results\n\n#### [Azure CLI](#tab/azure-cli)\n\nRun [az eventhubs namespace network-rule-set show](/cli/azure/eventhubs/namespace/network-rule-set#az-eventhubs-namespace-network-rule-set-show) to display the Event Hubs Namespace network rules.\n\n```azurecli\naz eventhubs namespace network-rule show --resource-group <resource_group_name> --namespace-name <namespace_name>\n```\n\n**Key points:**\n\n- The resource group name and Event Hubs namespace name are displayed in the `terraform apply` output.\n\n#### [Azure PowerShell](#tab/azure-powershell)\n\nRun [Get-AzEventHubNetworkRuleSet](/powershell/module/az.eventhub/Get-AzEventHubNetworkRuleSet) to display the Event Hubs Namespace network rules.\n\n```azurepowershell\nGet-AzEventHubNetworkRuleSet -ResourceGroupName <resource_group_name> -Namespace <namespace_name>\n```\n\n**Key points:**\n\n- The resource group name and Event Hubs namespace name are displayed in the `terraform apply` output.\n\n---\n\n## Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/get-started-cloud-shell-bash.md",
    "content": "---\ntitle: Configure Terraform in Azure Cloud Shell with Bash\ndescription: Learn how to configure Terraform in Azure Cloud Shell with Bash\nkeywords: azure devops terraform cloud shell cli install configure portal interactive login rbac service principal automated script\nms.topic: how-to\nms.date: 06/20/2024\nms.custom: devx-track-terraform, mode-api\nadobe-target: true\n# Customer intent: As someone new to Terraform and Azure, I want configure Terraform in Azure Cloud Shell using the Bash environment.\n---\n\n# Configure Terraform in Azure Cloud Shell with Bash\n \n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article presents you with the options to authenticate to Azure for use with Terraform.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Configure Cloud Shell\n> * Display current Azure account\n> * Understand common Terraform and Azure authentication scenarios\n> * Authenticate via a Microsoft account from Cloud Shell (using Bash or PowerShell)\n> * Authenticate via a Microsoft account from Windows (using Bash or PowerShell)\n> * Create a service principal using the Azure CLI\n> * Create a service principal using Azure PowerShell\n> * Specify service principal credentials in environment variables\n> * Specify service principal credentials in a Terraform provider block\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n## 2. Open Cloud Shell\n\n[!INCLUDE [open-cloud-shell.md](../includes/open-cloud-shell.md)]\n\n## 3. Install latest version of Terraform in Azure Cloud Shell\n\n[!INCLUDE [install-latest-version.md](includes/install-latest-version.md)]\n\n## 4. Verify the default Azure subscription\n\n[!INCLUDE [confirm-default-azure-subscription-or-authenticate.md](includes/confirm-default-azure-subscription-or-authenticate.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate Terraform to Azure](authenticate-to-azure.md)\n"
  },
  {
    "path": "articles/terraform/get-started-cloud-shell-powershell.md",
    "content": "---\ntitle: Configure Terraform in Azure Cloud Shell with Azure PowerShell\ndescription: Learn how to configure Terraform in Azure Cloud Shell with Azure PowerShell\nkeywords: terraform azure cli devops install configure portal interactive login rbac service principal automated script\nms.topic: how-to\nms.date: 06/20/2024\nms.custom: devx-track-terraform, mode-api, devx-track-azurepowershell\nadobe-target: true\n# Customer intent: As someone new to Terraform and Azure, I want configure Terraform in Azure Cloud Shell using Azure PowerShell.\n---\n\n# Configure Terraform in Azure Cloud Shell with Azure PowerShell\n \n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article shows how to get started with [Terraform on Azure](https://www.terraform.io/docs/providers/azurerm/index.html) using Cloud Shell and PowerShell.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Configure Cloud Shell\n> * Understand common Terraform and Azure authentication scenarios\n> * Authenticate via a Microsoft account from Cloud Shell (using Bash or PowerShell)\n> * Authenticate via a Microsoft account from Windows (using Bash or PowerShell)\n> * Create a service principal using the Azure CLI\n> * Create a service principal using Azure PowerShell\n> * Specify service principal credentials in environment variables\n> * Specify service principal credentials in a Terraform provider block\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n## 2. Open Cloud Shell\n\n[!INCLUDE [open-cloud-shell.md](../includes/open-cloud-shell.md)]\n\n## 3. Install latest version of Terraform in Azure Cloud Shell\n\n[!INCLUDE [install-latest-version.md](includes/install-latest-version.md)]\n\n## 4. Verify the default Azure subscription\n\n[!INCLUDE [confirm-default-azure-subscription-or-authenticate.md](includes/confirm-default-azure-subscription-or-authenticate.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate Terraform to Azure](authenticate-to-azure.md)\n"
  },
  {
    "path": "articles/terraform/get-started-windows-bash.md",
    "content": "---\ntitle: Install Terraform on Windows with Bash\ndescription: Learn how to install Terraform on Windows with Bash\nkeywords: terraform azure cli devops install configure windows interactive login rbac service principal automated script\nms.topic: how-to\nms.date: 06/20/2024\nms.custom: devx-track-terraform, mode-api, devx-track-azurecli \nadobe-target: true\n# Customer intent: As a Windows user new to Terraform and Azure, I want install Terraform on Windows using the Bash environment.\n---\n\n# Install Terraform on Windows with Bash\n \n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article presents you with the options to authenticate to Azure for use with Terraform.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Install the Git Bash terminal emulator\n> * Install Azure CLI\n> * Install Terraform\n> * Configure your environment to run Terraform on Windows\n> * Understand common Terraform and Azure authentication scenarios\n> * Authenticate via a Microsoft account from Cloud Shell (using Bash or PowerShell)\n> * Authenticate via a Microsoft account from Windows (using Bash or PowerShell)\n> * Create a service principal using the Azure CLI\n> * Create a service principal using Azure PowerShell\n> * Specify service principal credentials in environment variables\n> * Specify service principal credentials in a Terraform provider block\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n## 2. Install a terminal emulator\n\nThere are many options on Windows to run bash commands, including Git Bash and Windows Terminal. This article has been tested using Git Bash. Download and install [Git Bash](https://git-scm.com/download/win).\n\n## 3. Install the Azure CLI\n\n[Install the Azure CLI](/cli/azure/install-azure-cli-windows). This article was tested using Azure CLI version 2.26.1.\n\n## 4. Install Terraform for Windows\n\n[!INCLUDE [install-terraform-on-windows.md](includes/install-terraform-on-windows.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate Terraform to Azure](authenticate-to-azure.md)\n"
  },
  {
    "path": "articles/terraform/get-started-windows-powershell.md",
    "content": "---\ntitle: Install Terraform on Windows with Azure PowerShell\ndescription: Learn how to configure Terraform on Windows with Azure PowerShell\nkeywords: terraform azure cli devops powershell install configure windows interactive login rbac service principal automated script\nms.topic: how-to\nms.date: 06/20/2024\nms.custom: devx-track-terraform, mode-api, devx-track-azurecli, devx-track-azurepowershell\nadobe-target: true\n# Customer intent: As a Windows user new to Terraform and Azure, I want install Terraform on Windows using Azure PowerShell.\n---\n\n# Install Terraform on Windows with Azure PowerShell\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article describes how to get started with [Terraform on Azure](https://www.terraform.io/docs/providers/azurerm/index.html) using PowerShell.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Install the latest version of PowerShell\n> * Install the new PowerShell Az Module\n> * Install the Azure CLI\n> * Install Terraform\n> * Understand common Terraform and Azure authentication scenarios\n> * Authenticate via a Microsoft account from Cloud Shell (using Bash or PowerShell)\n> * Authenticate via a Microsoft account from Windows (using Bash or PowerShell)\n> * Create a service principal using the Azure CLI\n> * Create a service principal using Azure PowerShell\n> * Specify service principal credentials in environment variables\n> * Specify service principal credentials in a Terraform provider block\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n## 2. Install Azure PowerShell\n\n1. The latest PowerShell module that allows interaction with Azure resources is called the [Azure PowerShell Az module](/powershell/azure/new-azureps-module-az). When using the Azure PowerShell Az module, PowerShell 7 (or later) is the recommended version on all platforms. If you have PowerShell installed, you can verify the version by entering the following command at a PowerShell prompt.\n\n    ```powershell\n    $PSVersionTable.PSVersion\n    ```\n\n1. [Install PowerShell](/powershell/scripting/install/installing-powershell-core-on-windows). This demo was tested using PowerShell 7.2.1 (x64) on Windows 10.\n\n## 3. Install the Azure CLI\n\nFor [Terraform to authenticate to Azure](https://www.terraform.io/docs/providers/azurerm/guides/azure_cli.html), you need to [install the Azure CLI](/cli/azure/install-azure-cli-windows). This demo was tested using Azure CLI version 2.32.0.\n\n## 4. Install Terraform for Windows\n\n[!INCLUDE [install-terraform-on-windows.md](includes/install-terraform-on-windows.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Authenticate Terraform to Azure](authenticate-to-azure.md)\n"
  },
  {
    "path": "articles/terraform/how-to-migrate-between-azurerm-and-azapi.md",
    "content": "---\ntitle: Migration paths between Azure, AzureRM, and AzAPI Terraform providers\ndescription: Learn all the migration paths for Terraform on Azure — bringing existing Azure resources under Terraform management, authoring AzAPI resources from ARM JSON, and moving configurations between the AzureRM and AzAPI providers.\nms.topic: how-to\nms.date: 04/21/2026\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\nai-usage: ai-generated\n---\n\n# Migration paths between Azure, AzureRM, and AzAPI Terraform providers\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nSeveral tools and workflows exist for moving between Azure infrastructure and Terraform, or between the AzureRM and AzAPI Terraform providers. The right path depends on your starting point and goal.\n\nKey tools include `aztfexport` (exports existing Azure resources into Terraform configuration and state) and `aztfmigrate` (converts Terraform configurations between the AzureRM and AzAPI providers).\n\nUse the following table to identify which section applies to your scenario:\n\n| Starting point | Goal | Recommended path |\n|---|---|---|\n| Existing Azure resources (not yet in Terraform) | Bring under Terraform management | [Export with `aztfexport`](#export-existing-azure-resources-to-terraform) |\n| ARM template or Azure portal resource JSON | Author new AzAPI Terraform resources | [Paste as AzAPI in VS Code](how-to-use-terraform-vscode-extension.md#paste-arm-json-as-azapi-configuration) |\n| Existing Terraform config using AzAPI | Migrate to AzureRM provider | [Migrate with `aztfmigrate`](#migrate-azapi-resources-to-azurerm-with-aztfmigrate) |\n| Existing Terraform config using AzureRM | Migrate to AzAPI provider | [Migrate with `aztfmigrate` or the VS Code extension](#migrate-azurerm-resources-to-azapi) |\n\nFor guidance on which provider should be primary for new projects, see [Choose between AzureRM and AzAPI Terraform providers](provider-selection-azurerm-vs-azapi.md).\n\n## Export existing Azure resources to Terraform\n\n[Azure Export for Terraform (`aztfexport`)](./azure-export-for-terraform/export-terraform-overview.md) brings existing Azure resources under Terraform management by generating HCL configuration and Terraform state. It supports both AzureRM and AzAPI as output targets.\n\n**Use this path when**: You have existing Azure resources that aren't yet managed by Terraform and want to import them.\n\n### Export methods\n\nChoose the export method that best fits your workflow:\n\n- **CLI**: Use the `aztfexport` binary directly. See [Azure Export for Terraform overview](./azure-export-for-terraform/export-terraform-overview.md) for installation and CLI command reference.\n- **VS Code extension**: Use the [Microsoft Terraform VS Code extension](how-to-use-terraform-vscode-extension.md#export-existing-azure-resources-as-terraform) for a guided export experience with resource filtering and provider selection.\n- **Azure portal**: Export resources directly from the Azure portal without local tools. See [Export resources in the Azure portal](#export-resources-in-the-azure-portal).\n\nFor detailed quickstarts and advanced scenarios, see:\n- [Export your first resources](./azure-export-for-terraform/export-first-resources.md)\n- [Export resources to HCL code](./azure-export-for-terraform/export-resources-hcl.md)\n- [Advanced export scenarios](./azure-export-for-terraform/export-advanced-scenarios.md)\n\n### Export resources in the Azure portal\n\nThe Azure portal integration allows you to export resources without installing additional tools:\n\n1. Navigate to the resource in the Azure portal.\n1. Locate the **Export to Terraform** option (exact location depends on resource type).\n1. Follow the prompts to select output provider (AzureRM or AzAPI) and export scope.\n1. Download the generated Terraform configuration and state file.\n1. Review the output and run `terraform plan` to confirm no drift.\n\nFor step-by-step guidance, see [Export a resource in the Azure portal](./azure-export-for-terraform/get-started-export-resources-portal.md).\n\n## Author AzAPI resources from ARM JSON\n\nIf you have an ARM template, Azure portal resource definition, or raw REST API response and want to generate a corresponding `azapi_resource` block, the Microsoft Terraform VS Code extension can convert it automatically.\n\n**Use this path when**: You're authoring new AzAPI resources and have an existing JSON definition (ARM template, portal export, API response) as a starting point.\n\nThe extension converts the JSON properties to the `body` attribute format and infers the `type` and `api-version`. For detailed steps and examples, see [Paste ARM JSON as AzAPI configuration](how-to-use-terraform-vscode-extension.md#paste-arm-json-as-azapi-configuration) in the VS Code extension guide.\n\n> [!NOTE]\n> This feature works best for single resource objects. Full ARM templates with multiple resources, parameters, and variables might require manual cleanup after conversion.\n\n## Migrate AzAPI resources to AzureRM with `aztfmigrate`\n\n[`aztfmigrate`](https://github.com/Azure/aztfmigrate) migrates existing `azapi_resource` blocks in a Terraform configuration to their equivalent `azurerm_*` resource types. It updates both the HCL (HashiCorp Configuration Language) files and the Terraform state file without re-creating the underlying Azure resources.\n\n**Use this path when**: Your team manages resources with AzAPI and a resource you're using has since been added to the AzureRM provider with full support, and you want to consolidate onto AzureRM.\n\n### Prerequisites\n\n- An existing Terraform configuration with `azapi_resource` blocks you want to migrate.\n- The `aztfmigrate` binary installed and in your PATH. Download from the [aztfmigrate releases page](https://github.com/Azure/aztfmigrate/releases).\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n### Plan the migration\n\n1. Navigate to the directory containing your Terraform configuration.\n\n1. Authenticate to Azure:\n\n    ```azurecli\n    az login\n    az account set --subscription <subscription_id>\n    ```\n\n1. Run `aztfmigrate plan` to identify which resources can be migrated to AzureRM:\n\n    ```console\n    aztfmigrate plan\n    ```\n\n    The output lists each `azapi_resource` block, indicating whether it maps to a supported AzureRM resource type. Resources using preview API versions or resource types not yet in AzureRM are listed as not migratable and remain as `azapi_resource` blocks.\n\n1. Review the plan output and confirm the mappings are correct before proceeding.\n\n### Perform the migration\n\n1. Run `aztfmigrate migrate` to apply the changes:\n\n    ```console\n    aztfmigrate migrate\n    ```\n\n    `aztfmigrate`:\n\n    - Replaces `azapi_resource` blocks in your `.tf` files with the equivalent `azurerm_*` blocks.\n    - Updates the state file to reflect the new resource addresses and schema.\n\n1. Initialize Terraform to download any updated provider versions:\n\n    [!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n1. Run `terraform plan` to validate that configuration and state align with the deployed infrastructure:\n\n    ```console\n    terraform plan\n    ```\n\n    The plan should show no changes. If differences appear, review the diff and adjust the migrated configuration before applying.\n\n### Post-migration cleanup\n\nAfter confirming a clean plan:\n\n- Remove the `azapi` provider from `required_providers` if no AzAPI resource blocks remain.\n- Update any `output` or `locals` blocks that reference AzAPI-specific attributes.\n- Run `terraform apply` to apply any legitimate drift, such as normalized defaults introduced by AzureRM.\n\n## Migrate AzureRM resources to AzAPI\n\nTo convert an existing AzureRM configuration to use AzAPI, use the [Microsoft Terraform VS Code extension](how-to-use-terraform-vscode-extension.md), which includes tooling to generate AzAPI equivalents for `azurerm_*` resource blocks.\n\n**Use this path when**: You're converting a Terraform module or configuration from AzureRM to AzAPI and want editor assistance with the conversion.\n\nFor step-by-step instructions, code actions, and state migration guidance, see [the VS Code extension guide](how-to-use-terraform-vscode-extension.md).\n\n> [!IMPORTANT]\n> The VS Code extension assists with HCL authoring only—it does not update the Terraform state file. Replacing `azurerm_*` blocks with `azapi_resource` blocks without updating state causes Terraform to treat the resources as deleted and re-create them.\n>\n> After converting HCL, use `terraform state mv` for each resource or re-import using the `import` block. Run `terraform plan` after each state change to confirm no unintended re-creation occurs.\n\n## When not to migrate\n\nConsider keeping resources where they are when:\n\n- The resource is in preview or uses a preview API version not yet in AzureRM—keep it in AzAPI.\n- Your team uses AzAPI as its primary provider—add new AzureRM-only resources with AzAPI rather than introducing a second primary provider.\n- The AzureRM representation introduces unwanted plan drift from normalized defaults—evaluate the impact before migrating.\n- State migration complexity is high—for large configurations, assess whether the operational risk of state manipulation outweighs the benefit of switching providers.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Choose between AzureRM and AzAPI Terraform providers](provider-selection-azurerm-vs-azapi.md)\n\n> [!div class=\"nextstepaction\"]\n> [Azure Export for Terraform overview](./azure-export-for-terraform/export-terraform-overview.md)\n\n> [!div class=\"nextstepaction\"]\n> [Terraform AzAPI provider overview](overview-azapi-provider.md)\n"
  },
  {
    "path": "articles/terraform/how-to-use-azapi-preflight-validation.md",
    "content": "---\ntitle: Enable preflight validation in the AzAPI Terraform provider\ndescription: Learn how to enable and use AzAPI preflight validation to catch Azure resource configuration errors at plan time before any infrastructure is deployed.\nms.topic: how-to\nms.date: 04/20/2026\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\nai-usage: ai-generated\n---\n\n# Enable preflight validation in the AzAPI Terraform provider\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThe AzAPI Terraform provider includes built-in preflight validation that validates your Azure resource configuration against the ARM API schema during `terraform plan`, before any resources are created or modified in Azure. Preflight catches configuration errors early—such as invalid address prefixes, unsupported property combinations, or quota violations—without incurring the cost of a failed deployment.\n\nPreflight validation is one of AzAPI's key differentiators and works natively with the provider's direct-to-ARM-API architecture. You can also run preflight from the [Microsoft Terraform VS Code extension](how-to-use-terraform-vscode-extension.md#preflight-validation) without setting the provider flag directly.\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n[!INCLUDE [confirm-default-azure-subscription-or-authenticate.md](includes/confirm-default-azure-subscription-or-authenticate.md)]\n\n## Enable preflight validation\n\nSet `enable_preflight = true` in the `provider \"azapi\"` block:\n\n```terraform\nprovider \"azapi\" {\n  enable_preflight = true\n}\n```\n\nPreflight is disabled by default to preserve backward compatibility. Enable it in environments where you want early validation, such as CI pipelines and pull request checks.\n\n## Example: Catch an invalid address prefix at plan time\n\nThe following configuration creates a virtual network with an invalid Classless Inter-Domain Routing (CIDR) block. With preflight enabled, the error surfaces during `terraform plan` rather than during `terraform apply`:\n\n```terraform\nterraform {\n  required_providers {\n    azapi = {\n      source  = \"Azure/azapi\"\n      version = \"~> 2.0\"\n    }\n    azurerm = {\n      source  = \"hashicorp/azurerm\"\n      version = \"~> 4.0\"\n    }\n  }\n}\n\nprovider \"azurerm\" {\n  features {}\n}\n\nprovider \"azapi\" {\n  enable_preflight = true\n}\n\nresource \"azurerm_resource_group\" \"example\" {\n  name     = \"rg-preflight-demo\"\n  location = \"eastus\"\n}\n\nresource \"azapi_resource\" \"vnet\" {\n  type      = \"Microsoft.Network/virtualNetworks@2024-01-01\"\n  parent_id = azurerm_resource_group.example.id\n  name      = \"vnet-example\"\n  location  = \"eastus\"\n\n  body = {\n    properties = {\n      addressSpace = {\n        addressPrefixes = [\n          \"10.0.0.0/160\"  # Invalid prefix length — preflight catches this at plan time\n        ]\n      }\n    }\n  }\n}\n```\n\nWhen you run `terraform plan` with this configuration, preflight returns an error similar to:\n\n```\nError: preflight validation failed for resource \"azapi_resource.vnet\":\n  The value '10.0.0.0/160' is not a valid CIDR block.\n```\n\nCorrecting the address prefix to a valid value (for example, `10.0.0.0/16`) clears the error.\n\n## What preflight validates\n\nPreflight sends the resource body to the ARM API's preflight endpoint, which validates:\n\n- Property values against the ARM resource schema (for example, valid CIDR (Classless Inter-Domain Routing) ranges, allowed SKU names, required fields).\n- Subscription-level quota and capacity constraints for supported resource types.\n- Policy compliance for Azure Policy assignments that run in preflight mode.\n\nPreflight does **not** validate:\n\n- Cross-resource dependencies or sequencing.\n- Resources that don't have ARM preflight endpoint support (the provider silently skips validation for those resource types).\n- Authentication or authorization (Identity and Access Management (IAM)) failures—these failures surface during `terraform apply`.\n\n## Use preflight in CI pipelines\n\nAdding preflight to a CI pipeline provides a fast, nondestructive validation step that catches configuration errors before code is merged. Enable `enable_preflight = true` in the provider block of your Terraform configuration, then run `terraform plan`:\n\n```terraform\nprovider \"azapi\" {\n  enable_preflight = true\n}\n```\n\nBecause preflight runs during `terraform plan` with no side effects, it's safe to run in pull request workflows against live Azure subscriptions.\n\n## Disable output noise with `ignore_no_op_changes`\n\nIf you run plans repeatedly, AzAPI might detect minor no-op differences between the configuration and the ARM state (for example, normalized default values returned by the API). To suppress these plan-time differences and focus on real changes, set `ignore_no_op_changes = true` in the provider block:\n\n```terraform\nprovider \"azapi\" {\n  enable_preflight      = true\n  ignore_no_op_changes  = true\n}\n```\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Terraform AzAPI provider overview](overview-azapi-provider.md)\n\n> [!div class=\"nextstepaction\"]\n> [Choose between AzureRM and AzAPI Terraform providers](provider-selection-azurerm-vs-azapi.md)\n"
  },
  {
    "path": "articles/terraform/how-to-use-azapi-provider-functions.md",
    "content": "---\ntitle: Use provider functions in the AzAPI Terraform provider\ndescription: Learn how to use AzAPI provider functions to construct and parse Azure resource IDs without external data source lookups.\nms.topic: how-to\nms.date: 04/20/2026\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\nai-usage: ai-generated\n---\n\n# Use provider functions in the AzAPI Terraform provider\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nAzAPI v2.0 and later includes a set of [provider functions](https://developer.hashicorp.com/terraform/plugin/framework/functions/concepts) for constructing and parsing Azure resource IDs. Provider functions run at plan time within the Terraform configuration and don't require a data source lookup or a network call. They reduce code complexity when your configuration needs to construct or decompose resource IDs.\n\n> [!NOTE]\n> Provider functions require Terraform 1.8 or later.\n\n## Available provider functions\n\n| Function | Description |\n|---|---|\n| [`build_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/build_resource_id) | Constructs a resource ID from a parent ID, resource type, and resource name. Supports both top-level and nested resources. |\n| [`extension_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/extension_resource_id) | Constructs an extension resource ID from a base resource ID, resource type, and resource names. |\n| [`management_group_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/management_group_resource_id) | Constructs a management group–scoped resource ID. |\n| [`parse_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/parse_resource_id) | Parses an Azure resource ID into its component parts (subscription ID, resource group name, provider namespace, resource name, and more). |\n| [`resource_group_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/resource_group_resource_id) | Constructs a resource group–scoped resource ID from a subscription ID, resource group name, resource type, and resource names. |\n| [`subscription_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/subscription_resource_id) | Constructs a subscription-scoped resource ID. |\n| [`tenant_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/tenant_resource_id) | Constructs a tenant-scoped resource ID. |\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\nEnsure your configuration declares AzAPI v2.0 or later and Terraform 1.8 or later:\n\n```terraform\nterraform {\n  required_version = \">= 1.8\"\n  required_providers {\n    azapi = {\n      source  = \"Azure/azapi\"\n      version = \"~> 2.0\"\n    }\n    azurerm = {\n      source  = \"hashicorp/azurerm\"\n      version = \"~> 4.0\"\n    }\n  }\n}\n\nprovider \"azurerm\" {\n  features {}\n}\n\nprovider \"azapi\" {}\n```\n\n## Parse a resource ID with `parse_resource_id`\n\nUse `parse_resource_id` to decompose an existing Azure resource ID into its individual components. The function is useful when you need the subscription ID, resource group name, or resource name from a resource managed elsewhere in your configuration or passed in as a variable.\n\n```terraform\nlocals {\n  storage_id_parts = provider::azapi::parse_resource_id(\n    \"Microsoft.Storage/storageAccounts\",\n    azurerm_storage_account.example.id\n  )\n}\n\noutput \"subscription_id\" {\n  value = local.storage_id_parts.subscription_id\n}\n\noutput \"resource_group_name\" {\n  value = local.storage_id_parts.resource_group_name\n}\n\noutput \"storage_account_name\" {\n  value = local.storage_id_parts.name\n}\n```\n\nThe function returns an object with these fields:\n\n- `id` — the full resource ID\n- `name` — the resource name\n- `parent_id` — the resource ID of the parent resource\n- `parts` — a map of all resource ID segments\n- `provider_namespace` (for example, `Microsoft.Storage`)\n- `resource_group_name`\n- `resource_group_id`\n- `subscription_id`\n- `type` (for example, `Microsoft.Storage/storageAccounts`)\n\n## Construct a resource group–scoped ID with `resource_group_resource_id`\n\nUse `resource_group_resource_id` when you need to reference a resource ID for a resource you don't manage in Terraform (for example, an existing resource passed in as a variable), or when you want to construct a predictable ID ahead of resource creation.\n\n```terraform\nvariable \"subscription_id\" {\n  type = string\n}\n\nvariable \"existing_resource_group\" {\n  type = string\n}\n\nvariable \"existing_storage_account\" {\n  type = string\n}\n\nlocals {\n  storage_account_id = provider::azapi::resource_group_resource_id(\n    var.subscription_id,\n    var.existing_resource_group,\n    \"Microsoft.Storage/storageAccounts\",\n    [var.existing_storage_account]\n  )\n}\n\n# Reference the pre-existing storage account without a data source lookup\nresource \"azapi_resource_action\" \"regenerate_key\" {\n  type        = \"Microsoft.Storage/storageAccounts@2023-01-01\"\n  resource_id = local.storage_account_id\n  action      = \"regenerateKey\"\n  method      = \"POST\"\n\n  body = {\n    keyName = \"key1\"\n  }\n}\n```\n\nThe resource names parameter accepts a list to support nested resource types. For example, to construct a subnet ID:\n\n```terraform\nlocals {\n  subnet_id = provider::azapi::resource_group_resource_id(\n    var.subscription_id,\n    var.resource_group_name,\n    \"Microsoft.Network/virtualNetworks/subnets\",\n    [var.vnet_name, var.subnet_name]\n  )\n}\n```\n\n## Construct a subscription-scoped ID with `subscription_resource_id`\n\nUse `subscription_resource_id` for resources scoped at the subscription level, such as resource groups or policy assignments:\n\n```terraform\nlocals {\n  resource_group_id = provider::azapi::subscription_resource_id(\n    var.subscription_id,\n    \"Microsoft.Resources/resourceGroups\",\n    [var.resource_group_name]\n  )\n}\n```\n\n## Construct a management group–scoped ID with `management_group_resource_id`\n\nUse `management_group_resource_id` for management group–scoped resources such as policy assignments and role assignments:\n\n```terraform\nlocals {\n  mg_policy_id = provider::azapi::management_group_resource_id(\n    var.management_group_name,\n    \"Microsoft.Authorization/policyAssignments\",\n    [var.policy_assignment_name]\n  )\n}\n```\n\n## Construct an extension resource ID with `extension_resource_id`\n\nUse `extension_resource_id` for extension resources that are attached to another resource, such as locks or role assignments on a specific resource:\n\n```terraform\nlocals {\n  lock_id = provider::azapi::extension_resource_id(\n    azurerm_storage_account.example.id,\n    \"Microsoft.Authorization/locks\",\n    [var.lock_name]\n  )\n}\n```\n\n## Build a resource ID with `build_resource_id`\n\nUse `build_resource_id` when a parent resource ID determines the scope and you don't need to specify subscription or resource group separately. This function infers the scope from the parent ID:\n\n```terraform\nlocals {\n  subnet_id = provider::azapi::build_resource_id(\n    azurerm_virtual_network.example.id,\n    \"Microsoft.Network/virtualNetworks/subnets\",\n    var.subnet_name\n  )\n}\n```\n\n## Compare with data source approaches\n\nProvider functions are preferable over data sources for ID construction and parsing because they:\n\n- Run entirely at plan time with no network calls.\n- Don't add resources to Terraform state.\n- Are deterministic and don't require `depends_on` ordering.\n\nUse `azapi_resource` data source when you need to read live properties of a resource, not just construct or parse its ID.\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Terraform AzAPI provider overview](overview-azapi-provider.md)\n\n> [!div class=\"nextstepaction\"]\n> [List Azure resources with the AzAPI Terraform provider](get-started-azapi-resource-list.md)\n"
  },
  {
    "path": "articles/terraform/how-to-use-terraform-vscode-extension.md",
    "content": "---\ntitle: Use the Microsoft Terraform Visual Studio Code extension\ndescription: Learn how to use the Microsoft Terraform VS Code extension to author AzAPI resources, convert ARM JSON to Terraform, export Azure resources, and run preflight validation.\nms.topic: how-to\nms.date: 04/21/2026\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\nai-usage: ai-generated\n---\n\n# Use the Microsoft Terraform Visual Studio Code extension\n\nThe [Microsoft Terraform Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureterraform) provides authoring, validation, and migration tooling for Terraform configurations on Azure. It includes language intelligence for both the AzureRM and AzAPI providers, integration with [Azure Export for Terraform (`aztfexport`)](./azure-export-for-terraform/export-terraform-overview.md), and preflight validation support.\n\nThis article covers the features most relevant to AzAPI authoring and provider migration. For a guide to installing the extension and running basic Terraform commands, see [Install the Microsoft Terraform Visual Studio Code extension](configure-vs-code-extension-for-terraform.md).\n\n## Prerequisites\n\n- [Visual Studio Code](https://code.visualstudio.com/)\n- The [Microsoft Terraform extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureterraform) installed\n- [Terraform](https://developer.hashicorp.com/terraform/downloads) installed and available in your PATH\n- The [Azure CLI](/cli/azure/install-azure-cli) installed and authenticated (`az login`)\n\n## AzAPI provider language features\n\n**Use this when**: You're authoring or editing `azapi_resource` blocks and want autocomplete, validation, and inline documentation.\n\nThe extension provides rich language intelligence for the AzAPI provider in `.tf` files, backed by the [AzAPI Language Server](https://github.com/Azure/azapi-lsp).\n\n### Resource type and API version completion\n\nWhen you type `type = \"` inside an `azapi_resource`, `azapi_update_resource`, or `azapi_data_plane_resource` block, the extension shows a list of all available Azure resource types and API versions:\n\n:::image type=\"content\" source=\"media/overview-azapi-provider/list-all-available-resource-types.png\" alt-text=\"Screenshot showing autocomplete for available AzAPI resource types and API versions.\":::\n\n### Property name and value completion\n\nInside the `body` attribute, the extension suggests allowed property names and valid values based on the selected resource type and API version:\n\n:::image type=\"content\" source=\"media/overview-azapi-provider/list-allowed-properties.png\" alt-text=\"Screenshot showing autocomplete for allowed property names and values in an azapi_resource body.\":::\n\nFor properties that use discriminated objects (such as `kind`-based type hierarchies), the extension populates required sub-properties automatically.\n\n### Hover documentation\n\nHovering over a resource type, property name, or property value shows inline documentation sourced from the Azure resource schema:\n\n:::image type=\"content\" source=\"media/overview-azapi-provider/show-hint-when-hovering.png\" alt-text=\"Screenshot showing hover documentation for an AzAPI property.\":::\n\n### Schema validation\n\nThe extension underlines schema errors as you type — for example, unrecognized property names, incorrect value types, or missing required properties:\n\n:::image type=\"content\" source=\"media/overview-azapi-provider/syntax-validation.png\" alt-text=\"Screenshot showing inline schema error highlighting in an azapi_resource body.\":::\n\n## Paste ARM JSON as AzAPI configuration\n\nIf you have an Azure portal resource definition, an ARM template resource object, or a raw REST API response, you can paste it directly into a `.tf` file and the extension converts it to an `azapi_resource` block.\n\n**Use this when**: You're authoring a new AzAPI resource and have an existing JSON definition to start from.\n\n1. Copy the resource JSON or ARM template to the clipboard.\n1. Open a `.tf` file and place your cursor at the insertion point.\n1. Paste (`Ctrl`+`V` on Windows/Linux, `Cmd`+`V` on macOS). The extension detects the JSON format and converts it to `azapi_resource` HCL.\n\nFor ARM templates that contain multiple resources, parameters, and variables, manual cleanup is usually required after conversion. Review the generated `type`, `body`, and `parent_id` before applying.\n\n## Export existing Azure resources as Terraform\n\nThe extension integrates with `aztfexport` to export existing Azure resources to Terraform configuration and state, with a choice of AzureRM or AzAPI as the output provider.\n\n**Use this when**: You have existing Azure resources that aren't managed by Terraform and want to bring them under Terraform management.\n\n1. Open the Command Palette (`Ctrl`+`Shift`+`P` on Windows/Linux, `Cmd`+`Shift`+`P` on macOS).\n1. Search for and select **Microsoft Terraform: Export Azure Resource as Terraform**.\n1. Follow the prompts to select your subscription, resource group, and individual resources.\n1. Select **azurerm** or **azapi** as the output provider.\n1. The extension generates the Terraform configuration and opens it in a new editor tab.\n\nYou can also export resources directly from the Azure portal without installing any tools. See [Export a resource in the Azure portal](./azure-export-for-terraform/get-started-export-resources-portal.md). For full CLI usage of `aztfexport`, see the [Azure Export for Terraform overview](./azure-export-for-terraform/export-terraform-overview.md).\n\n## Migrate AzureRM resources to AzAPI\n\nThe extension can generate AzAPI equivalents for `azurerm_*` resource blocks within a Terraform module, using guidance from the [azapi-lsp migration guide](https://github.com/Azure/azapi-lsp/blob/main/docs/migrate_to_azapi_in_module_guide.md).\n\n**Use this when**: You're converting a module from AzureRM to AzAPI and want tooling assistance to author the equivalent `azapi_resource` blocks.\n\n1. Open the `.tf` file containing the `azurerm_*` resource blocks.\n1. Open the Command Palette and search for the migrate to AzAPI command, or use the in-editor code action when hovering over an `azurerm_*` resource block.\n1. Review the generated output. Validate the `type`, `api-version`, and `body` structure against the [AzAPI provider registry documentation](https://registry.terraform.io/providers/Azure/azapi/latest/docs) before replacing the original blocks.\n\n> [!IMPORTANT]\n> This feature assists with HCL authoring only — it doesn't update the Terraform state file. If you replace `azurerm_*` blocks with `azapi_resource` blocks without updating state, Terraform treats the AzureRM resources as deleted and the AzAPI resources as new, causing re-creation of the underlying Azure resources.\n>\n> To migrate state alongside configuration, use `terraform state mv` for each resource after conversion, or add `import` blocks. Run `terraform plan` after each state change to confirm no unintended re-creation occurs.\n\nFor a complete guide covering all migration directions (including `aztfmigrate` for AzAPI → AzureRM), see [Migration paths between Azure, AzureRM, and AzAPI Terraform providers](how-to-migrate-between-azurerm-and-azapi.md).\n\n## Preflight validation\n\nThe extension integrates with the `aztfpreflight` tool to validate your Terraform plan against Azure resource constraints before deployment.\n\n**Use this when**: You want to catch configuration errors at plan time without deploying resources.\n\n1. Ensure you're authenticated with `az login`.\n1. Open the Command Palette and select **Microsoft Terraform: Preflight Validation**.\n1. Select an existing plan file, or let the extension generate a new one.\n1. The extension runs `aztfpreflight` against the plan and displays results in the terminal.\n\nPreflight catches errors such as invalid property values, quota violations, and policy compliance failures before any resources are created or modified. For details on enabling preflight directly in the AzAPI provider configuration, see [Enable preflight validation in the AzAPI Terraform provider](how-to-use-azapi-preflight-validation.md).\n\n## Generate required permissions\n\n**Use this when**: You need to determine the minimum IAM role assignments required to deploy your Terraform resources.\n\nFor `azurerm_*` resource blocks, the extension can generate the minimum IAM role assignments needed to deploy the resources.\n\n1. Select one or more `azurerm_*` resource blocks in a `.tf` file.\n1. Click the lightbulb icon that appears, and select the option to generate required permissions.\n1. The extension generates the permission definitions and opens them in a new editor tab.\n\nEnsure you're authenticated with `az login` before using this feature.\n\n## Terraform command palette\n\nAll standard Terraform commands are available from the Command Palette and run in the integrated terminal:\n\n| Command | Description |\n|---|---|\n| **Microsoft Terraform: init** | Initializes the Terraform working directory and downloads provider plugins. |\n| **Microsoft Terraform: plan** | Creates a Terraform execution plan. |\n| **Microsoft Terraform: apply** | Applies the Terraform execution plan. |\n| **Microsoft Terraform: validate** | Validates the configuration files. |\n| **Microsoft Terraform: refresh** | Updates the state file with the real-world state of resources. |\n| **Microsoft Terraform: destroy** | Destroys all resources managed by the configuration. |\n| **Microsoft Terraform: visualize** | Generates a graph visualization of the module and saves it as `graph.png`. |\n| **Microsoft Terraform: Export Azure Resource as Terraform** | Exports existing Azure resources as Terraform configuration using `aztfexport`. |\n| **Microsoft Terraform: Preflight Validation** | Runs preflight validation against a Terraform plan using `aztfpreflight`. |\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Migration paths between Azure, AzureRM, and AzAPI Terraform providers](how-to-migrate-between-azurerm-and-azapi.md)\n\n> [!div class=\"nextstepaction\"]\n> [Terraform AzAPI provider overview](overview-azapi-provider.md)\n\n## Additional reading\n\n- [Install the Microsoft Terraform Visual Studio Code extension](configure-vs-code-extension-for-terraform.md)\n- [Enable preflight validation in the AzAPI Terraform provider](how-to-use-azapi-preflight-validation.md)\n- [Azure Export for Terraform overview](./azure-export-for-terraform/export-terraform-overview.md)\n"
  },
  {
    "path": "articles/terraform/hub-spoke-hub-network.md",
    "content": "---\ntitle: Create a hub virtual network in Azure by using Terraform\ndescription: Learn how to create a hub virtual network in Azure that acts as a common connection point between other networks.\nms.topic: how-to\nservice: virtual-network\nms.service: azure-virtual-network\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Create a hub virtual network in Azure by using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThe hub virtual network acts as the central point of connectivity to the on-premises network. The virtual network hosts shared services consumed by workloads hosted in the spoke virtual networks. For demo purposes, no shared services are implemented in this article.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Implement the hub virtual network in a hub-and-spoke topology.\n> * Create a hub jumpbox virtual machine.\n> * Create a hub virtual private network gateway.\n> * Create hub and on-premises gateway connections.\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- [Create a hub-and-spoke hybrid network topology with Terraform in Azure](./hub-spoke-introduction.md).\n\n- [Create an on-premises virtual network with Terraform in Azure](./hub-spoke-on-prem.md).\n\n## 2. Implement the Terraform code\n\nThe hub network consists of the following components:\n\n- A hub virtual network\n- A hub virtual network gateway\n- Hub gateway connections\n\n1. Make the example directory created in the first article of this series the current directory.\n\n1. In the example directory, create a file named `hub-vnet.tf`.\n\n1. Insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/301-hub-spoke/hub-vnet.tf)]\n    \n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Create a hub virtual network appliance with Terraform in Azure](./hub-spoke-hub-nva.md)\n"
  },
  {
    "path": "articles/terraform/hub-spoke-hub-nva.md",
    "content": "---\ntitle: Create a hub virtual network appliance in Azure using Terraform\ndescription: Learn how to create a Hub virtual network (VNet) that acts as a common connection point between other networks.\nms.topic: how-to\nservice: virtual-network\nms.service: azure-virtual-network\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Create a hub virtual network appliance in Azure using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nA *VPN device* is a device that provides external connectivity to an on-premises network. The VPN device may be a hardware device or a software solution. One example of a software solution is Routing and Remote Access Service (RRAS) in Windows Server 2012. For more information about VPN appliances, see [About VPN devices for Site-to-Site VPN Gateway connections](/azure/vpn-gateway/vpn-gateway-about-vpn-devices).\n\nAzure supports a broad variety of network virtual appliances from which to select. For this article, an Ubuntu image is used. To learn more about the broad variety of device solutions supported in Azure, see the [Network Appliances home page](https://azure.microsoft.com/solutions/network-appliances/).\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Implement the Hub VNet in hub-spoke topology\n> * Create Hub Network Virtual Machine which acts as appliance\n> * Enable routes using CustomScript extensions\n> * Create Hub and Spoke gateway route tables\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- [Create a hub and spoke hybrid network topology with Terraform in Azure](./hub-spoke-introduction.md).\n\n- [Create on-premises virtual network with Terraform in Azure](./hub-spoke-on-prem.md).\n\n- [Create a hub virtual network with Terraform in Azure](./hub-spoke-hub-network.md).\n\n## 2. Implement the Terraform code\n\n1. Make the example directory created in the first article of this series the current directory.\n\n1. Create a file named `hub-nva.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/301-hub-spoke/hub-nva.tf)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Create a spoke virtual networks with Terraform in Azure](./hub-spoke-spoke-network.md)\n"
  },
  {
    "path": "articles/terraform/hub-spoke-introduction.md",
    "content": "---\ntitle: Create a hub and spoke hybrid network topology in Azure using Terraform\ndescription: Learn how to create an entire hybrid network reference architecture in Azure using Terraform.\nms.topic: how-to\nservice: virtual-network\nms.service: azure-virtual-network\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Create a hub and spoke hybrid network topology in Azure using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis articles series shows how to use Terraform to implement in Azure a [hub and spoke network topology](/azure/architecture/reference-architectures/hybrid-networking/hub-spoke). \n\nA hub and spoke topology is a way to isolate workloads while sharing common services. These services include identity and security. The hub is a virtual network (VNet) that acts as a central connection point to an on-premises network. The spokes are VNets that peer with the hub. Shared services are deployed in the hub, while individual workloads are deployed inside spoke networks.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Lay out hub and spoke hybrid network reference architecture resources\n> * Create hub network appliance resources\n> * Create hub network in Azure to act as common point for all resources\n> * Create individual workloads as spoke VNets in Azure\n> * Establish gateways and connections between on premises and Azure networks\n> * Create VNet peerings to spoke networks\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Understand hub and spoke topology architecture\n\nIn the hub and spoke topology, the hub is a VNet. The VNet acts as a central point of connectivity to your on-premises network. The spokes are VNets that peer with the hub, and can be used to isolate workloads. Traffic flows between the on-premises datacenter and the hub through an ExpressRoute or VPN gateway connection. The following image demonstrates the components in a hub and spoke topology:\n\n![Hub and spoke topology architecture in Azure](./media/hub-and-spoke-series/hub-spoke-architecture.png)\n\n### Benefits of the hub and spoke topology\n\nA hub and spoke network topology is a way to isolate workloads while sharing common services. These services include identity and security. The hub is a VNet that acts as a central connection point to an on-premises network. The spokes are VNets that peer with the hub. Shared services are deployed in the hub, while individual workloads are deployed inside spoke networks. Here are some benefits of the hub and spoke network topology:\n\n- **Cost savings** by centralizing services in a single location that can be shared by multiple workloads. These workloads include network virtual appliances and DNS servers.\n- **Overcome subscriptions limits** by peering VNets from different subscriptions to the central hub.\n- **Separation of concerns** between central IT (SecOps, InfraOps) and workloads (DevOps).\n\n### Typical uses for the hub and spoke architecture\n\nSome of the typical uses for a hub and spoke architecture include:\n\n- Many customers have workloads that are deployed in different environments. These environments include development, testing, and production. Many times, these workloads need to share services such as DNS, IDS, NTP, or AD DS. These shared services can be placed in the hub VNet. That way, each environment is deployed to a spoke to maintain isolation.\n- Workloads that don't require connectivity to each other, but require access to shared services.\n- Enterprises that require central control over security aspects.\n- Enterprises that require segregated management for the workloads in each spoke.\n\n## 3. Preview the demo components\n\nAs you work through each article in this series, various components are defined in distinct Terraform scripts. The demo architecture created and deployed consists of the following components:\n\n- **On-premises network**. A private local-area network running with an organization. For hub and spoke reference architecture, a VNet in Azure is used to simulate an on-premises network.\n\n- **VPN device**. A VPN device or service provides external connectivity to the on-premises network. The VPN device may be a hardware appliance or a software solution. \n\n- **Hub VNet**. The hub is the central point of connectivity to your on-premises network and a place to host services. These services can be consumed by the different workloads hosted in the spoke VNets.\n\n- **Gateway subnet**. The VNet gateways are held in the same subnet.\n\n- **Spoke VNets**. Spokes can be used to isolate workloads in their own VNets, managed separately from other spokes. Each workload might include multiple tiers, with multiple subnets connected through Azure load balancers. \n\n- **VNet peering**. Two VNets can be connected using a peering connection. Peering connections are non-transitive, low latency connections between VNets. Once peered, the VNets exchange traffic by using the Azure backbone, without needing a router. In a hub and spoke network topology, VNet peering is used to connect the hub to each spoke. You can peer VNets in the same region, or different regions.\n\n## 4. Implement the Terraform code\n\n1. Create a directory to contain the example code for the entire multi-article series.\n\n1. Create a file named `main.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/301-hub-spoke/main.tf)]\n\n1. Create a file named `variables.tf` to contain the project variables and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/301-hub-spoke/variables.tf)]\n\n    **Key points:**\n\n    - This article uses a password you enter when you call `terraform plan`. In a real-world app, you might consider using a SSH public/private key pair.\n    - For more information about SSH keys and Azure, see [How to use SSH keys with Windows on Azure](/azure/virtual-machines/linux/ssh-from-windows).\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Create on-premises virtual network with Terraform in Azure](./hub-spoke-on-prem.md)\n"
  },
  {
    "path": "articles/terraform/hub-spoke-on-prem.md",
    "content": "---\ntitle: Create on-premises virtual network in Azure using Terraform\ndescription: Learn how to implement an on-premises virtual network (VNet) in Azure that houses local resources.\nms.topic: how-to\nservice: virtual-network\nms.service: azure-virtual-network\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Create on-premises virtual network in Azure using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nThis article shows how to implement an on-premises network in Azure. You can replace the sample network with a private virtual network. To do so, modify the subnet IP addresses to suit your environment.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Implement an on-premises VNet in hub-spoke topology\n> * Create hub network appliance resources\n> * Create on-premises virtual machine\n> * Create on-premises virtual private network gateway\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- [Create a hub and spoke hybrid network topology with Terraform in Azure](./hub-spoke-introduction.md).\n\n## 2. Implement the Terraform code\n\n1. Make the example directory created in the first article of this series the current directory.\n\n1. Create a file named `on-prem.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/301-hub-spoke/on-prem.tf)]\n    \n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Create a hub virtual network with Terraform in Azure](./hub-spoke-hub-network.md)\n"
  },
  {
    "path": "articles/terraform/hub-spoke-spoke-network.md",
    "content": "---\ntitle: Create a spoke network in Azure using Terraform\ndescription: Learn how to implement two spoke virtual networks (VNets) connected to a hub in a hub-spoke topology.\nms.topic: how-to\nservice: virtual-network\nms.service: azure-virtual-network\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Create a spoke network in Azure using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nIn this article, you implement two separate spoke networks to demonstrate separation of workloads. The networks share common resources using hub virtual network. Spokes can be used to isolate workloads in their own VNets, managed separately from other spokes. Each workload might include multiple tiers, with multiple subnets connected through Azure load balancers.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Implement the Spoke VNets in hub-spoke topology\n> * Create Virtual machines in the spoke networks\n> * Establish virtual network peerings with the hub networks\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- [Create a hub and spoke hybrid network topology with Terraform in Azure](./hub-spoke-introduction.md).\n\n- [Create on-premises virtual network with Terraform in Azure](./hub-spoke-on-prem.md).\n\n- [Create a hub virtual network with Terraform in Azure](./hub-spoke-hub-network.md).\n\n- [Create a hub virtual network appliance with Terraform in Azure](./hub-spoke-hub-nva.md).\n\n## 2. Implement the Terraform code\n\nTwo spoke scripts are created in this section. Each script defines a spoke virtual network and a virtual machine for the workload. A peered virtual network from hub to spoke is then created.\n\n1. Make the example directory created in the first article of this series the current directory.\n\n1. Create a file named `spoke1.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/301-hub-spoke/spoke1.tf)]\n\n1. Create a file named `spoke2.tf` and insert the following code:\n\n    [!code-terraform[master](../../terraform_samples/quickstart/301-hub-spoke/spoke2.tf)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Validate a hub and spoke network with Terraform in Azure](./hub-spoke-validation.md)\n"
  },
  {
    "path": "articles/terraform/hub-spoke-validation.md",
    "content": "---\ntitle: Validate a hub and spoke network in Azure using Terraform\ndescription: Learn how to validate hub and spoke network topology with all virtual networks connected to one another.\nms.topic: how-to\nservice: virtual-network\nms.service: azure-virtual-network\nms.date: 10/26/2023\nms.custom: devx-track-terraform\n---\n\n# Validate a hub and spoke network in Azure using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nIn this article, you execute the terraform files created in the previous article in this series. The result is a validation of the connectivity between the demo virtual networks.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Implement the Hub VNet in hub-spoke topology\n> * Verify the resources to be deployed\n> * Create the resources in Azure\n> * Verify the connectivity between different networks\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- [Create a hub and spoke hybrid network topology with Terraform in Azure](./hub-spoke-introduction.md)\n\n- [Create on-premises virtual network with Terraform in Azure](./hub-spoke-on-prem.md)\n\n- [Create a hub virtual network with Terraform in Azure](./hub-spoke-hub-network.md)\n\n- [Create a hub virtual network appliance with Terraform in Azure](./hub-spoke-hub-nva.md)\n\n- [Create a spoke virtual networks with Terraform in Azure](./hub-spoke-spoke-network.md)\n\n## 2. Verify your configuration\n\nIn the example directory, verify that all the files created in this article series are present:\n\n| File name | Article in which file is created |\n| - | - |\n| main.tf | [Create a hub and spoke hybrid network topology with Terraform in Azure](./hub-spoke-introduction.md) |\n| variables.tf | [Create a hub and spoke hybrid network topology with Terraform in Azure](./hub-spoke-introduction.md) |\n| on-prem.tf | [Create on-premises virtual network with Terraform in Azure](./hub-spoke-on-prem.md) |\n| hub-vnet.tf | [Create a hub virtual network with Terraform in Azure](./hub-spoke-hub-network.md) |\n| hub-nva.tf | [Create a hub virtual network appliance with Terraform in Azure](./hub-spoke-hub-nva.md) |\n| spoke1.tf | [Create a spoke virtual networks with Terraform in Azure](./hub-spoke-spoke-network.md) |\n| spoke2.tf | [Create a spoke virtual networks with Terraform in Azure](./hub-spoke-spoke-network.md) |\n\n## 3. Initialize Terraform\n\n[!INCLUDE [terraform-init.md](includes/terraform-init.md)]\n\n## 4. Create a Terraform execution plan\n\n[!INCLUDE [terraform-plan.md](includes/terraform-plan.md)]\n\n## 5. Apply a Terraform execution plan\n\n[!INCLUDE [terraform-apply-plan.md](includes/terraform-apply-plan.md)]\n\n## 6. Verify the results\n\nThis section shows how to test connectivity from the simulated on-premises environment to the hub VNet.\n\n1. Browse to the [Azure portal](https://portal.azure.com).\n\n1. In the Azure portal, browse to the **onprem-vnet-rg** resource group.\n\n1. In the **onprem-vnet-rg** tab, select the VM named **onprem-vm**.\n\n1. Note the **Public IP Address** value.\n\n1. Return to the command line and run `ssh` to connect to the simulated on-premises environment.\n\n   ```bash\n   ssh azureuser@<onprem_vm_ip_address>\n   ```\n\n    **Key points:**\n\n    - If you changed the user name from `azureuser` in the `variables.tf` file, make sure to insert that value in the `ssh` command.\n    - Use the password you specified when you ran `terraform plan`.\n\n1. Once connected to the **onprem-vm** virtual machine, run the `ping` command to test connectivity to the jumpbox VM in the hub VNet:\n\n   ```bash\n   ping 10.0.0.68\n   ```\n\n1. Run the `ping` command to test connectivity to the jumpbox VMs in each spoke:\n\n   ```bash\n   ping 10.1.0.68\n   ping 10.2.0.68\n   ```\n\n1. To exit the ssh session on the **onprem-vm** virtual machine, enter `exit` and press &lt;Enter>.\n\n## 7. Clean up resources\n\n[!INCLUDE [terraform-plan-destroy.md](includes/terraform-plan-destroy.md)]\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/includes/abstract.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\n[Terraform](https://www.terraform.io) enables the definition, preview, and deployment of cloud infrastructure. Using Terraform, you create configuration files using [HCL syntax](https://developer.hashicorp.com/terraform/language/syntax/configuration). The HCL syntax allows you to specify the cloud provider - such as Azure - and the elements that make up your cloud infrastructure. After you create your configuration files, you create an *execution plan* that allows you to preview your infrastructure changes before they're deployed. Once you verify the changes, you apply the execution plan to deploy the infrastructure.\n"
  },
  {
    "path": "articles/terraform/includes/comparing-terraform-and-bicep-integration-features.md",
    "content": "---\nms.author: tarcher\nms.topic: product-comparison\nms.date: 04/22/2023\nms.custom: devx-track-terraform, devx-track-bicep\n---\n\nTo achieve scale, DevOps teams are always looking for ways to quickly deploy code with a trusted and repeatable process. When it comes to the cloud and infrastructure, this process is increasingly accomplished with infrastructure-as-code (IaC). IaC tools range from general-purpose tools to tools intended for specific environments. Terraform is an example of the former, while Bicep is designed to handle Azure-related tasks.\n\nIn this article, we compare nine infrastructure and integration features of Bicep and Terraform. Understanding these differences helps you decide which tool best supports your infrastructure and processes.  \n\n## State and backend\n\nBoth Terraform and Bicep are desired state configuration (DSC) which makes it easy to manage IT and development infrastructure as code. Terraform stores state about your managed infrastructure and configuration. Terraform uses this information to map real-world resources to your configuration, track metadata, and improve the performance of larger infrastructures. State is stored in a local file named `terraform.tfstate`, but can also be [stored remotely](../store-state-in-azure-storage.md). It's critical to back up and secure your state files.  Like Terraform, Bicep is declarative and goal-seeking. However, Bicep doesn't store state. Instead, Bicep relies on incremental deployment.\n\n## Infrastructure targets\n\nWhen comparing Bicep to Terraform for managing cloud infrastructure, it's important to consider your target cloud environment:\n\n- Azure-only\n- Multi or hybrid-clouds\n\nBicep is Azure-specific and not designed to work with other cloud services.\n\nIf your goal is to automate deployments to any of the following environments, Terraform is likely the better option:\n\n- Virtualization environments\n- Multicloud scenarios - such as Azure and other cloud(s)\n- On-premises workloads\n\nTerraform interacts with other cloud providers or APIs using plugins called *providers*. There are several [Terraform Azure providers](../overview.md#terraform-providers-for-azure-infrastructure) that enable the management of Azure infrastructure. When coding a Terraform configuration, you specify the required providers you're using. When you run [terraform init](https://www.terraform.io/docs/commands/init.html), the specified provider is installed and usable from your code.\n\n## CLI tools\n\nCommand Line Interface (CLI) tools play a key role in orchestration through the implementation and management of automation technology. Both Bicep and Terraform offer CLI tools.\n\nBicep integrates with Azure CLI, allowing developers to use `az` commands such as:\n\n- `az bicep`: The [az bicep](/cli/azure/bicep) commands allow you to perform such tasks as installing Bicep, and building and publishing Bicep files.\n- `az deployment`: The article [How to deploy resources with Bicep and Azure CLI](/azure/azure-resource-manager/bicep/deploy-cli) explains how to use Azure CLI with Bicep files to deploy your resources to Azure.\n\nThe Terraform CLI allows you to perform such tasks as validate and format your Terraform code, and create and apply an execution plan.\n\n- The article [Quickstart: Create an Azure resource group using Terraform](../create-resource-group.md) shows you how to use several of the Terraform commands to create an Azure resource group.\n\nBicep also provides a feature that makes it easy to integrate Bicep with Azure Pipelines. There's a similar feature available for Terraform but you must download and install the [Azure Pipelines Terraform Tasks extension for Visual Studio](https://marketplace.visualstudio.com/items?itemName=charleszipp.azure-pipelines-tasks-terraform). Once installed, you can run Terraform CLI commands from Azure Pipelines. Moreover, both Terraform and Bicep support [GitHub Actions](https://github.com/features/actions) to automate software builds, tests, and deployments.\n\n## Processing\n\nThere are some important differences between Bicep and Terraform in terms of the efficiency and optimizations of deployments. With Bicep, processing occurs within the core Azure infrastructure service side. This feature offers advantages such as preflight processing to check policy or the availability for deploying multiple instances within a region. With Terraform, processing is done within the Terraform client. Thus, preprocessing involves no calls to Azure since it uses state and HCL (HashiCorp Language) to determine the required changes.\n\n## Authentication\n\nThe Azure authentication features vary between Bicep and Terraform. With Bicep, an authorization token is supplied during the request to submit a Bicep file and ARM Template. ARM ensures that you have permission to both create the deployment and deploy resources within the specified template. Terraform authenticates each API based on provider credentials – such as Azure CLI, service principal, or [managed identities for Azure resources](/azure/active-directory/managed-identities-azure-resources/overview). Moreover, multiple provider credentials can be utilized in a single configuration.\n\n## Azure integrations\n\nYou should also consider your use of Azure features such as [Azure Policy](/azure/governance/policy/overview) and how each interacts with other tools and languages. Bicep's preflight validation determines whether a resource doesn't comply with a policy so that it fails before a deployment. Thus, developers can remediate resources with policy using provided ARM templates. The ARM template can be used to create a policy assignment to another resource for automated remediation. Terraform, however, fails when a resource is deployed that is disallowed due to policy.\n\n## Portal integration\n\nOne major advantage that Bicep has over Terraform is the ability to automate portal actions. With Bicep, you can use the Azure portal to export templates. Exporting a template helps you to understand the syntax and properties that deploy your resources. You can automate future deployments by starting with the exported template and modifying it to meet your needs. Until Terraform templates are supported, you need to translate the exported template manually.\n\nAlthough Terraform doesn't provide the same portal integrations as Bicep, existing Azure infrastructure can be taken under Terraform management using [Azure Export for Terraform](../azure-export-for-terraform/export-terraform-overview.md). (Azure Export for Terraform is an open-source tool owned and maintained by Microsoft on the [Azure/aztfexport GitHub repo](https://github.com/Azure/aztfexport).)\n\n## Out-of-band changes\n\nOut-of-band configuration changes are changes made to a device configuration outside the context of the tool. For example, let's say you deploy a Virtual Machine Scale Set using Bicep or Terraform. If you change that Virtual Machine Scale Set using the portal, the change would be \"out-of-band\" and unknown to your IaC tool.\n\nIf you're using Bicep, out-of-band changes should be reconciled with Bicep and the ARM Template code to avoid having those changes overwritten on the next deployment. These changes don't block the deployment.\n\nIf you're using Terraform, you need to import the out-of-band changes into the Terraform state and update the HCL.\n\nThus, if an environment involves frequent out-of-band changes, Bicep is more user-friendly. When you use Terraform, you should minimize out-of-band changes.\n\n## Cloud frameworks\n\nThe [Cloud Adoption Framework (CAF)](/azure/cloud-adoption-framework/) is a collection of documentation, best practices, and tools to accelerate cloud adoption throughout your cloud journey. Azure provides native services for deploying landing zones. Bicep simplifies this process with a portal experience based on ARM templates and landing-zone implementation. Terraform utilizes an [Enterprise-Scale Landing Zones module](/azure/cloud-adoption-framework/ready/landing-zone/terraform-module) to deploy, manage, and operationalize with Azure.\n\n## Summary\n\nBicep and Terraform offer many user-friendly infrastructure and integration features. These features make it easier to implement and manage automation technology. When deciding which is best for your environment, it's important to consider if you're deploying to more than one cloud or whether your infrastructure consists of a multi or hybrid-cloud environment. Moreover, be sure to consider the nine features discussed in this article to make the best choice for your organization.\n"
  },
  {
    "path": "articles/terraform/includes/comparing-terraform-and-bicep-usability-features.md",
    "content": "---\nms.author: tarcher\nms.topic: product-comparison\nms.date: 04/22/2023\nms.custom: devx-track-terraform, devx-track-bicep\n---\n\nToday's organizations face dynamic challenges that require a great deal of flexibility and agility. Public cloud environments meet these needs through automation - especially via infrastructure as code (IaC). Two leading IaC options are Hashicorp Terraform and Bicep. Terraform is an open-source tool that helps DevOps professionals manage on-premises and cloud services using declarative code. Microsoft Bicep utilizes declarative syntax to simplify the deployment of Azure resources.\n\nIn this article, we compare several key user-experience features to identify similarities and differences between Terraform and Bicep.\n\n## Language syntax\n\nBicep and Terraform are domain-specific languages (DSL) that are easy to use and save developer time. Both tools incorporate similar keywords and concepts. Some of these concepts are parameterization, support for multi-file projects, and support for external modules. Terraform, however, offers a richer library of built-in functionality for certain tasks. Deciding between the two is a matter of preference and experience. The following are brief overviews and some of the user-friendly features that each language syntax offers.\n\nBicep is a declarative language. As such, the order in which the elements are defined in the code doesn't affect how deployment is processed. Bicep's default target scope is the `resourceGroup`. Users can employ variables to encapsulate complex expressions and make Bicep files more readable. The concept of modules enables the reuse of Bicep code across projects or teams.\n\nTerraform is also a declarative language that uses the HashiCorp Configuration Language (HCL). The primary purpose of HCL is to declare resources. Other language features serve to make defining resources more convenient. And like Bicep, the ordering of code in Terraform configuration files isn't significant.\n\n## Language helpers\n\nBoth Bicep and Terraform provide *language helpers* to simplify coding tasks. Since both are user-friendly, the choice largely depends on preferences and requirements.\n\nBicep supports expressions to make your code more dynamic and flexible. Different types of functions can be used in a Bicep file. Some of these function types are logical, numeric, and objection functions. Loops can define multiple copies of a resource, module, property, variable, or output. Loops help to avoid repeating syntax in a Bicep file.\n\nTerraform also offers built-in functions that are called from within expressions to transform and combine values. Like Bicep, Terraform expressions can include complex expressions such as references to data exported by resources and conditional evaluation. Loops can handle collections and can produce multiple instances of a resource without the need to repeat code.\n\n## Modules\n\nBoth Bicep and Terraform support the concept of modules. Modules allow you to create reusable components from your code. Modules play a key role in scaling infrastructure and keeping configuration clean. Since modules encapsulate groups of resources, they reduce the amount of code that must be developed for similar infrastructure components. While modules function similarly in Bicep and Terraform, they vary in implementation.\n\nIn Bicep, a module is simply a Bicep file that is deployed from another Bicep file. Bicep modules serve to improve the readability of Bicep files. These modules are also scalable. Users can share modules across teams to avoid code duplication and reduce errors. For more information about defining a Bicep module, see [Bicep modules](/azure/azure-resource-manager/bicep/modules).\n\nIn Terraform, [modules](https://www.terraform.io/language/modules) are the primary means of packaging and reusing resource configurations across teams. Terraform modules are containers for multiple resources that are packaged as a single logical unit. A module consists of a collection of `.tf` and/or `.tf.json` files stored together in a directory. In addition to modules from the local filesystem, Terraform can also load modules from various sources. These sources include the registry, local path, modules, and GitHub.\n\n## Provisioning lifecycle\n\nBoth Terraform and Bicep allow developers to validate a configuration before deployment and then apply the changes. Terraform provides more flexibility to destroy all remote objects managed by a particular configuration. This feature is useful to clean up temporary objects once your work is completed. It's crucial to consider the lifecycle requirements of typical infrastructure deployments when choosing the best option.\n\nBicep offers a [what-if](/azure/azure-resource-manager/bicep/deploy-what-if?tabs=azure-powershell%2CCLI) operation that allows you to preview changes before deploying a Bicep file. The Azure Resource Manager provides the `what-if` operation and doesn't make any changes to existing resources. It's then possible to use Azure PowerShell or Azure CLI with your Bicep files to [deploy your resources to Azure](/azure/azure-resource-manager/bicep/deploy-powershell). Azure PowerShell and Azure CLI don't support the deployment of remote Bicep files. However, you can use Bicep CLI to build your Bicep file to a JSON template and then load the JSON file to a remote location.\n\nIn Terraform, the [terraform plan](https://www.terraform.io/cli/commands/plan) command is similar to the Bicep `what-if` operation. With the `terraform plan` command, you create an *execution plan* to preview before applying it. You then apply the execution plan via the [terraform apply](https://www.terraform.io/cli/commands/apply) command. Almost anything you do with Terraform involves using both the `terraform plan` and `terraform apply` commands.\n\n## Getting started\n\nBicep and Terraform both offer resources to help you get you started. The [Learn module for Bicep](/azure/azure-resource-manager/bicep/learn-bicep) helps you define how your Azure resources should be configured. You're also guided through the deployments of several Azure resources to give you hands-on experience.\n\nLikewise, HashiCorp Learn provides users with various [Terraform training resources](https://learn.hashicorp.com/tutorials/terraform/infrastructure-as-code?in=terraform/azure-get-started) to teach you how to install and use Terraform. These resources include information showing how to use Terraform to provision infrastructure on Azure.\n\n## Code authoring\n\nThe code-authoring experience is dependent on the number of add-ins that are available for your editor of choice. Fortunately, both Bicep and Terraform offer resources to improve code-authoring efficiency.\n\nFor Bicep, one of the most effective add-ins is the [Bicep Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-bicep). The extension provides such features as code validation, Intellisense, dot-property access, and property autocompletion.\n\nFor Terraform, the [Terraform Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=HashiCorp.terraform) with the [Terraform Language Server](https://github.com/hashicorp/terraform-ls) offers many of the same features as the Bicep Visual Studio Code extension. For example, the extension also supports syntax highlighting, IntelliSense, code navigation, and a module explorer. HashiCorp also offers [detailed installation instructions] on its GitHub repo (https://github.com/hashicorp/terraform-ls/blob/main/docs/USAGE.md) for configuring and using the Terraform Language Server.\n\n## Azure coverage\n\nBicep has an advantage over Terraform when it comes to configuring Azure resources. Bicep is deeply integrated with Azure services. Moreover, it offers immediate support for new Azure features. Terraform provides two providers that allow users to manage Azure: AzureRM and AzAPI. The AzureRM provider offers a fully tailored experience for stable Azure services. Sometimes getting to this tailored experience can result in a bit of a delay. The AzAPI provider is a thin layer on top of the Azure Resource Manager REST APIs, which - like Bicep -enables immediate support for new Azure features. It's important to consider your organization's infrastructure requirements and whether they're fully supported before making a decision.\n\n## Community and Support\n\nThe community plays a key role in helping to learn and overcome challenges. Both the Terraform and Bicep communities offer a high level of engagement and support.\n\nFor Bicep support, where you go for help depends on the nature of the issue:\n\n- **Documentation bugs**: For issues with [Bicep documentation on Microsoft Learn](/azure/azure-resource-manager/bicep/), each article has a Feedback section.\n- **Bicep source code and filing bugs**: Visit the [Microsoft Bicep GitHub repo](https://github.com/Azure/bicep) to contribute to the open-source Bicep product and file bugs.\n\nFor Terraform support, where you go for help depends on the nature of the issue:\n\n- **Documentation bugs**: For issues with [Terraform documentation on Microsoft Learn](../index.yml), each article has a Feedback section.\n- **Provider source code and filing bugs**: Microsoft has GitHub repos where you can file bugs and contribute to the open-source Terraform Azure providers. To list the available providers, browse to the [Azure GitHub organization](https://github.com/Azure/), and enter `terraform-provider-` into the **Find a repository...** field.\n- **Terraform core questions**: Visit the [Terraform section of the HashiCorp community portal](https://discuss.hashicorp.com/c/terraform-core).\n- **Terraform provider-related questions**: Visit the [Terraform Providers section of the HashiCorp community portal](https://discuss.hashicorp.com/c/terraform-providers).\n\n    :::image type=\"content\" source=\"media/comparing-terraform-and-bicep-usability-features/github-find-terraform-provider-repos.png\" alt-text=\"Find a Terraform provider GitHub repo by searching for the prefix 'terraform-provider-\":::\n\n## Summary\n\nBicep and Terraform are two leading IaC options that make it easy to configure and deploy Azure resources. Both offer user-friendly features that help organizations boost efficiency and productivity. When assessing the best fit for your organization, carefully consider your infrastructure requirements and preferences.\n"
  },
  {
    "path": "articles/terraform/includes/configure-terraform.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\n- **Configure Terraform**: If you haven't already done so, configure Terraform using one of the following options:\n\n    - [Configure Terraform in Azure Cloud Shell with Bash](../get-started-cloud-shell-bash.md)\n    - [Configure Terraform in Azure Cloud Shell with PowerShell](../get-started-cloud-shell-powershell.md)\n    - [Configure Terraform in Windows with Bash](../get-started-windows-bash.md)\n    - [Configure Terraform in Windows with PowerShell](../get-started-windows-powershell.md)\n"
  },
  {
    "path": "articles/terraform/includes/confirm-default-azure-subscription-or-authenticate.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\nWhen you log in to the Azure portal with a Microsoft account, the default Azure subscription for that account is used.\n\nTerraform automatically authenticates using information from the default Azure subscription.\n\nRun [az account show](/cli/azure/account?#az-account-show) to verify the current Microsoft account and Azure subscription.\n\n```azurecli\naz account show\n```\n\nAny changes you make via Terraform are on the displayed Azure subscription. If that's what you want, skip the rest of this article.\n"
  },
  {
    "path": "articles/terraform/includes/create-vm.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 09/21/2023\nms.custom: devx-track-terraform\n---\n\nCreate a Linux VM.\n\n#### [Azure CLI](#tab/azure-cli)\n\n1. Run [az group create](/cli/azure/group#az-group-create) to create an Azure resource group.\n\n    ```azurecli\n    az group create --name myResourceGroup --location eastus\n    ```\n\n2. Run [az vm create](/cli/azure/vm#az-vm-create) to create the virtual machine.\n\n    ```azurecli\n    az vm create \\\n      --resource-group myResourceGroup \\\n      --name myVM \\\n      --image Debian11 \\\n      --admin-username azureadmin \\\n      --generate-ssh-keys \\\n      --public-ip-sku Standard\n    ```\n\n#### [Azure PowerShell](#tab/azure-powershell)\n\n1. Run [New-AzResourceGroup](/powershell/module/az.resources/new-azresourcegroup) to create an Azure resource group.\n\n    ```azurepowershell\n    New-AzResourceGroup -Name 'myResourceGroup' -Location 'EastUS'\n    ```\n\n2. Run [New-AzVM](/powershell/module/az.compute/new-azvm) to create the virtual machine.\n\n    ```azurepowershell\n    New-AzVm `\n        -ResourceGroupName 'myResourceGroup' `\n        -Name 'myVM' `\n        -Location 'East US' `\n        -Image Debian11 `\n        -size Standard_B2s `\n        -PublicIpAddressName myPubIP `\n        -OpenPorts 80 `\n        -GenerateSshKey `\n        -SshKeyName mySSHKey\n    ```\n\n---\n"
  },
  {
    "path": "articles/terraform/includes/environment-variables-notes.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 10/23/2024\nms.custom: devx-track-terraform\n---\n\n**Key points:**\n\n- For more information about working with environment variables in Terraform HCL, see [Reading and using environment variables in Terraform runs](https://support.hashicorp.com/hc/en-us/articles/4547786359571-Reading-and-using-environment-variables-in-Terraform-runs).\n- Creating and applying Terraform execution plans makes changes on the Azure subscription associated with the service principal. This fact can sometimes be confusing if you're logged into one Azure subscription and the environment variables point to a second Azure subscription. Let's look at the following example to explain. Let's say you have two Azure subscriptions: SubA and SubB. If the current Azure subscription is SubA (determined via `az account show`) while the environment variables point to SubB, any changes made by Terraform are on SubB. Therefore, you would need to log in to your SubB subscription to run Azure CLI commands or Azure PowerShell commands to view your changes."
  },
  {
    "path": "articles/terraform/includes/install-latest-version.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\nCloud Shell automatically updates to the latest version of Terraform. However, the updates come within a couple of weeks of release. This article shows you how to download and install the current version of Terraform.\n\n1. Determine the version of Terraform being used in Cloud Shell.\n\n    ```bash\n    terraform version\n    ```\n\n1. If the Terraform version installed in Cloud Shell isn't the latest version, you see a message indicating that the version of Terraform is out of date.\n\n1. If you're fine working with the indicated version, skip to the next section. Otherwise, continue with the following steps.\n\n1. Browse to the [Terraform downloads page](https://www.terraform.io/downloads.html).\n\n1. Scroll down to the **Linux** download links.\n\n1. Move your mouse over the **64-bit** link. This link is for the latest 64-bit Linux AMD version, which is appropriate for Cloud Shell.\n\n1. Copy the URL.\n\n1. Run `curl`, replacing the placeholder with the URL from the previous step.\n\n    ```bash\n    curl -O <terraform_download_url>\n    ```\n\n1. Unzip the file.\n\n    ```bash\n    unzip <zip_file_downloaded_in_previous_step>\n    ```\n\n1. If the directory doesn't exist, create a directory named `bin`.\n\n    ```bash\n    mkdir bin\n    ```\n\n1. Move the `terraform` file into the `bin` directory.\n\n    ```bash\n    mv terraform bin/    \n    ```\n\n1. Close and restart Cloud Shell.\n\n1. Verify that the downloaded version of Terraform is first in the path.\n\n    ```bash\n    terraform version\n    ```\n"
  },
  {
    "path": "articles/terraform/includes/install-terraform-on-windows.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\n1. [Download Terraform](https://www.terraform.io/downloads.html). This article was tested using Terraform version 1.1.4.\n\n1. From the download, extract the executable to a directory of your choosing (for example, `c:\\terraform`).\n\n1. Update your system's global PATH environment variable to include the directory that contains the executable.\n\n1. Open a terminal window.\n\n1. Verify the global path configuration with the `terraform` command.\n\n    ```powershell\n    terraform -version\n    ```\n"
  },
  {
    "path": "articles/terraform/includes/terraform-apply-plan.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\nRun [terraform apply](https://www.terraform.io/docs/commands/apply.html) to apply the execution plan to your cloud infrastructure.\n\n```console\nterraform apply main.tfplan\n```\n\n**Key points:**\n\n- The example `terraform apply` command assumes you previously ran `terraform plan -out main.tfplan`.\n- If you specified a different filename for the `-out` parameter, use that same filename in the call to `terraform apply`.\n- If you didn't use the `-out` parameter, call `terraform apply` without any parameters.\n"
  },
  {
    "path": "articles/terraform/includes/terraform-init.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\nRun [terraform init](https://www.terraform.io/docs/commands/init.html) to initialize the Terraform deployment. This command downloads the Azure provider required to manage your Azure resources.\n\n```console\nterraform init -upgrade\n```\n\n**Key points:**\n\n- The `-upgrade` parameter upgrades the necessary provider plugins to the newest version that complies with the configuration's version constraints.\n"
  },
  {
    "path": "articles/terraform/includes/terraform-plan-destroy.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\nWhen you no longer need the resources created via Terraform, do the following steps:\n\n1. Run [terraform plan](https://www.terraform.io/docs/commands/plan.html) and specify the `destroy` flag.\n\n    ```console\n    terraform plan -destroy -out main.destroy.tfplan\n    ```\n\n    [!INCLUDE [terraform-plan-notes.md](terraform-plan-notes.md)]\n\n1. Run [terraform apply](https://www.terraform.io/docs/commands/apply.html) to apply the execution plan.\n\n    ```console\n    terraform apply main.destroy.tfplan\n    ```\n"
  },
  {
    "path": "articles/terraform/includes/terraform-plan-notes.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\n  **Key points:**\n\n  - The `terraform plan` command creates an execution plan, but doesn't execute it. Instead, it determines what actions are necessary to create the configuration specified in your configuration files. This pattern allows you to verify whether the execution plan matches your expectations before making any changes to actual resources.\n  - The optional `-out` parameter allows you to specify an output file for the plan. Using the `-out` parameter ensures that the plan you reviewed is exactly what is applied.\n"
  },
  {
    "path": "articles/terraform/includes/terraform-plan-recreate.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\nAfter making the changes to your configuration, recreate and apply the Terraform execution plan:\n\n1. Run `terraform plan -out main.tfplan` to recreate the plan.\n1. Run `terraform apply main.tfplan` to apply the plan.\n"
  },
  {
    "path": "articles/terraform/includes/terraform-plan.md",
    "content": "---\nms.author: tarcher\nms.topic: include\nms.date: 04/22/2023\nms.custom: devx-track-terraform\n---\n\nRun [terraform plan](https://www.terraform.io/docs/commands/plan.html) to create an execution plan.\n\n```console\nterraform plan -out main.tfplan\n```\n\n[!INCLUDE [terraform-plan-notes.md](terraform-plan-notes.md)]"
  },
  {
    "path": "articles/terraform/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: Terraform on Azure documentation\nsummary: Learn how to use Terraform to reliably provision virtual machines and other infrastructure on Azure.\n\nmetadata:\n  title: Terraform on Azure documentation - Articles, samples, references, and resources\n  description: Learn how to use Terraform to reliably provision virtual machines and other infrastructure on Azure.\n  ms.service: terraform\n  author: TomArcherMsft\n  ms.author: tarcher\n  ms.topic: landing-page\n  ms.date: 07/07/2025\n  ms.custom: devx-track-terraform\n\nlandingContent:\n  # Card\n  - title: Getting started\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: About Terraform on Azure\n            url: overview.md\n          - text: Terraform AzAPI provider\n            url: overview-azapi-provider.md\n      - linkListType: reference\n        links:\n          - text: AzureRM provider versions \n            url: provider-version-history-azurerm-4-0-0-to-current.md\n          - text: Terraform Microsoft Graph provider\n            url: /graph/templates/terraform/reference/v1.0/overview\n      - linkListType: architecture\n        links:\n          - text: Terraform AzureRM Provider\n            url: https://aka.ms/terraform\n      - linkListType: concept\n        links:\n          - text: Comparing features of Terraform and Bicep\n            url: comparing-terraform-and-bicep.md\n      - linkListType: get-started\n        links:\n          - text: Install and configure Terraform\n            url: quickstart-configure.md\n          - text: Install the Microsoft Terraform Visual Studio Code extension\n            url: configure-vs-code-extension-for-terraform.md\n          - text: Generate Terraform configurations using Azure Copilot\n            url: ./terraform-handler-for-azure-copilot/generate-terraform-configuration-using-copilot.md\n          - text: Authenticate Terraform to Azure\n            url: authenticate-to-azure.md\n          - text: Store Terraform state in Azure Storage\n            url: store-state-in-azure-storage.md\n\n  # Card\n  - title: Azure Export for Terraform\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Azure Export for Terraform overview\n            url: ./azure-export-for-terraform/export-terraform-overview.md\n      - linkListType: concept\n        links:\n          - text: Azure Export for Terraform concepts\n            url: ./azure-export-for-terraform/export-terraform-concepts.md\n      - linkListType: quickstart\n        links:\n          - text: Export your first resources\n            url: ./azure-export-for-terraform/export-first-resources.md\n          - text: Export resources to HCL code\n            url: ./azure-export-for-terraform/export-resources-hcl.md\n      - linkListType: how-to-guide\n        links:\n          - text: Select custom resources\n            url: ./azure-export-for-terraform/select-custom-resources.md\n          - text: Advanced scenarios\n            url: ./azure-export-for-terraform/export-advanced-scenarios.md\n\n  # Card\n  - title: Terraform Export in the Azure portal\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Resource Provider Overview\n            url: ./azure-export-for-terraform/resource-provider-overview.md\n      - linkListType: quickstart\n        links:\n          - text: Export your first Terraform resources in the Azure portal\n            url: ./azure-export-for-terraform/get-started-export-resources-portal.md         \n  # Card\n  - title: Popular Terraform Azure service articles\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Create an Azure resource group using Terraform\n            url:  /azure/developer/terraform/create-resource-group\n          - text: Create an AKS cluster\n            url:  /azure/aks/learn/quick-kubernetes-deploy-terraform\n          - text: Create a Linux VM\n            url:  /azure/virtual-machines/linux/quick-create-terraform\n          - text: Create a Windows VM\n            url:  /azure/virtual-machines/windows/quick-create-terraform\n          - text: Create an Azure key vault and key using Terraform\n            url:  /azure/key-vault/keys/quick-create-terraform\n          - text: Direct web traffic with Azure Application Gateway - Terraform\n            url:  /azure/application-gateway/quick-create-terraform\n          - text: Create a single database in Azure SQL Database using Terraform\n            url:  /azure/azure-sql/database/single-database-create-terraform-quickstart\n          - text: Create an Azure API Management service using Terraform\n            url:  /azure/api-management/quickstart-terraform\n          - text: Create an Azure Front Door Standard/Premium profile using Terraform\n            url:  /azure/frontdoor/create-front-door-terraform\n          - text: Create an Azure Container Instance with a public IP address using Terraform\n            url:  /azure/container-instances/container-instances-quickstart-terraform\n\n  # Card\n  - title: Networking\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Deploy with IP Groups - Terraform\n            url: /azure/firewall/quick-create-ipgroup-terraform\n          - text: Deploy with multiple addresses - Terraform\n            url: /azure/firewall/quick-create-multiple-ip-terraform\n          - text: Deploy with Availability Zones - Terraform\n            url: /azure/firewall/deploy-terraform\n          - text: Create a NAT Gateway\n            url: /azure/nat-gateway/quickstart-create-nat-gateway-terraform\n          - text: Create a private endpoint\n            url: /azure/private-link/create-private-endpoint-terraform\n\n  # Card\n  - title: Manage infrastructure\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Create a Linux VM\n            url: /azure/virtual-machines/linux/quick-create-terraform\n          - text: Create a Linux VM cluster\n            url: /azure/virtual-machines/linux/quick-cluster-create-terraform\n          - text: Create a Windows VM\n            url: /azure/virtual-machines/windows/quick-create-terraform\n          - text: Create a Windows VM cluster\n            url: /azure/virtual-machines/windows/quick-cluster-create-terraform\n      - linkListType: how-to-guide\n        links:\n          - text: Provision VM scale set with infrastructure\n            url: create-vm-scaleset-network-disks-hcl.md\n          - text: Provision VM scale set from a Packer custom image\n            url: create-vm-scaleset-network-disks-using-packer-hcl.md\n\n  # Card\n  - title: Work with Containers (AKS, Application Gateway, ...)\n    linkLists:\n      - linkListType: quickstart\n        links:\n          - text: Create an AKS cluster\n            url: /azure/aks/learn/quick-kubernetes-deploy-terraform\n          - text: Create an ACI instance with a public IP address\n            url: /azure/container-instances/container-instances-quickstart-terraform\n          - text: Deploy Azure Application Gateway v2\n            url: /azure/application-gateway/quick-create-terraform\n      - linkListType: how-to-guide\n        links:\n          - text: Create an Application Gateway ingress controller in AKS\n            url: /azure/aks/create-k8s-cluster-with-aks-application-gateway-ingress\n"
  },
  {
    "path": "articles/terraform/media/overview-azapi-provider/placeholder.txt",
    "content": "Placeholder that will be deleted soon."
  },
  {
    "path": "articles/terraform/overview-azapi-provider.md",
    "content": "---\ntitle: Overview of the Terraform AzAPI provider\ndescription: Get an overview of the AzAPI provider and when to use it.\nms.topic: overview\nms.date: 04/05/2022\nadobe-target: true\nms.custom:\n  - devx-track-terraform\n  - sfi-image-nochange\n---\n\n# Overview of the Terraform AzAPI provider\n\nThe AzAPI provider is a thin layer on top of the [Azure ARM REST APIs](/rest/api/resources/). It enables you to manage any Azure resource type using any API version, enabling you to use the latest functionality within Azure. AzAPI is a first-class provider designed to be used on its own or in tandem with the AzureRM provider.\n\n## Benefits of using the AzAPI provider\n\nThe AzAPI provider features the following benefits:\n\n- Supports all Azure control plane services:\n  - Preview services and features\n  - All API versions\n- Full Terraform state file fidelity\n  - Properties and values are saved to state\n- No dependency on Swagger\n- Common and consistent Azure authentication\n- Built-in preflight validation\n- Granular control over infrastructure development\n- [Microsoft Terraform Visual Studio Code extension](how-to-use-terraform-vscode-extension.md)\n\n## Resources\n\nTo allow you to manage all Azure resources and features without requiring updates, the AzAPI provider includes the following generic resources:\n\n| Resource Name | Description |\n| ------------- | ----------- |\n| [`azapi_resource`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/resources/resource) | Used to fully manage any Azure (control plane) resource (API) with full CRUD. <br> &nbsp;&nbsp;&nbsp;Example Use Cases: <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New preview service <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New feature added to existing service <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Any Azure resource accessible through the ARM API |\n| [`azapi_update_resource`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/resources/update_resource) | Used to manage resources or parts of resources that don't have full CRUD <br> &nbsp;&nbsp;&nbsp;Example Use Cases: <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Update new properties on an existing service <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Update precreated child resource - such as DNS SOA record. |\n| [`azapi_resource_action`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/resources/resource_action) | Used to perform a single operation on a resource without managing the lifecycle of it <br> &nbsp;&nbsp;&nbsp;Example Use Cases: <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Shut down a Virtual Machine <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Add a secret to a Key Vault|\n| [`azapi_data_plane_resource`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/resources/data_plane_resource) | Used to manage a [specific subset](https://registry.terraform.io/providers/Azure/azapi/latest/docs/resources/data_plane_resource#available-resources) of Azure data plane resources <br> &nbsp;&nbsp;&nbsp;Example Use Cases: <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyVault Certificate Contacts<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Synapse Workspace Libraries|\n\nFor a detailed explanation of how the data plane framework works and how `parent_id` differs from control plane resources, see [Understand the AzAPI data plane framework](concept-azapi-data-plane-framework.md).\n\n### Usage hierarchy\n\nOverall, usage should follow these steps:\n1. Start with performing as many operations as possible within `azapi_resource`.\n2. If the resource type doesn't exist within `azapi_resource` but does fall under one of the types supported by `azapi_data_plane_resource`, use that instead.\n3. If the resource already exists in AzureRM or has a property that can't be accessed within `azapi_resource`, use `azapi_update_resource` to access these specific properties. Resources that `azapi_resource` or `azapi_data_plane_resource` don't support can't be updated through this resource.\n4. If you're trying to perform an action that isn't based on an Azure CRUD-friendly resource, `azapi_resource_action` is less straightforward than `azapi_update_resource` but more flexible.\n\n## Resource configuration examples\n\nThe following code snippet configures an Azure resource directly through the ARM API:\n\n```terraform\nresource \"azapi_resource\" \"publicip\" {\n  type      = \"Microsoft.Network/Customipprefixes@2021-03-01\"\n  name      = \"exfullrange\"\n  parent_id = azurerm_resource_group.example.id\n  location  = \"westus2\"\n\n  body = {\n    properties = {\n      cidr          = \"10.0.0.0/24\"\n      signedMessage = \"Sample Message for WAN\"\n    }\n  }\n}\n```\n\nThe following code snippet configures a preview property for an existing resource from AzureRM:\n\n```terraform\nresource \"azapi_update_resource\" \"test\" {\n  type        = \"Microsoft.ContainerRegistry/registries@2020-11-01-preview\"\n  resource_id = azurerm_container_registry.acr.id\n\n  body = {\n    properties = {\n      anonymousPullEnabled = var.bool_anonymous_pull\n    }\n  }\n}\n```\n\nThe following code snippet configures a resource action on an existing AzureRM resource:\n\n```terraform\nresource \"azapi_resource_action\" \"vm_shutdown\" {\n  type = \"Microsoft.Compute/virtualMachines@2023-07-01\"\n  resource_id = azurerm_linux_virtual_machine.example.id\n  action = \"powerOff”\n}\n```\n\nThe following code snippet configures a resource that doesn't currently exist in the AzureRM provider due to being provisioned on the data plane:\n\n```terraform\nresource \"azapi_data_plane_resource\" \"dataset\" {\n  type      = \"Microsoft.Synapse/workspaces/datasets@2020-12-01\"\n  parent_id = trimprefix(data.azurerm_synapse_workspace.example.connectivity_endpoints.dev, \"https://\")\n  name      = \"example-dataset\"\n  body = {\n    properties = {\n      type = \"AzureBlob\",\n      typeProperties = {\n        folderPath = {\n          value = \"@dataset().MyFolderPath\"\n          type  = \"Expression\"\n        }\n        fileName = {\n          value = \"@dataset().MyFileName\"\n          type  = \"Expression\"\n        }\n        format = {\n          type = \"TextFormat\"\n        }\n      }\n      parameters = {\n        MyFolderPath = {\n          type = \"String\"\n        }\n        MyFileName = {\n          type = \"String\"\n        }\n      }\n    }\n  }\n}\n```\n\n### Preflight usage example\n\nThe following code snippet errors during `terraform plan` due to AzAPI's built-in preflight validation:\n\n```terraform\nprovider \"azapi\" {\n  enable_preflight = true\n}\nresource \"azapi_resource\" \"vnet\" {\n  type      = \"Microsoft.Network/virtualNetworks@2024-01-01\"\n  parent_id = azapi_resource.resourceGroup.id\n  name      = \"example-vnet\"\n  location  = \"westus\"\n  body = {\n    properties = {\n      addressSpace = {\n        addressPrefixes = [\n          \"10.0.0.0/160\", # preflight will throw an error here\n        ]\n      }\n    }\n  }\n}\n```\n\nWhen enabled, preflight surfaces configuration errors during `terraform plan` rather than at apply time.\n\n## Data Sources\n\nThe AzAPI provider supports various useful data sources:\n\n| Data Source Name | Description |\n| ------------- | ----------- |\n| [`azapi_resource`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/data-sources/resource) | Used to read information from any Azure (control plane) resource (API). <br> &nbsp;&nbsp;&nbsp;Example Use Cases: <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New preview service <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;New feature added to existing service <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Any Azure resource accessible through the ARM API |\n| [`azapi_client_config`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/data-sources/client_config) | Access client information such as subscription ID and tenant ID. |\n| [`azapi_resource_action`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/data-sources/resource_action) | Used to perform a single read operation on a resource without managing the lifecycle of it <br> &nbsp;&nbsp;&nbsp;Example Use Cases: <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List Keys <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Read status of VM |\n| [`azapi_data_plane_resource`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/data-sources/data_plane_resource) | Used to access a [specific subset](https://registry.terraform.io/providers/Azure/azapi/latest/docs/resources/data_plane_resource#available-resources) of Azure data plane resources <br> &nbsp;&nbsp;&nbsp;Example Use Cases: <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyVault Certificate Contacts<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Synapse Workspace Libraries | \n| [`azapi_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/data-sources/resource_id) | Access a resource's resource ID, with the ability to output information such as subscription ID, parent ID, resource group name, and resource name. |\n| [`azapi_resource_list`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/data-sources/resource_list) | List all resources under a given parent resource ID. <br> &nbsp;&nbsp;&nbsp;Example Use Cases: <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resources under a subscription / resource group <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subnets under a virtual network|\n\nFor a hands-on example using `azapi_resource_list` with JMESPath filtering, see [List Azure resources with the AzAPI Terraform provider](get-started-azapi-resource-list.md).\n\n### Read an existing resource with `azapi_resource` data source\n\nThe `azapi_resource` data source reads the current state of any Azure resource and exposes its properties through the `output` attribute. Use it when you need a property that the AzureRM provider doesn't expose:\n\n```terraform\ndata \"azapi_resource\" \"aks\" {\n  type      = \"Microsoft.ContainerService/managedClusters@2024-02-01\"\n  resource_id = azurerm_kubernetes_cluster.example.id\n\n  # Extract the OIDC issuer URL, not exposed by azurerm_kubernetes_cluster\n  response_export_values = [\"properties.oidcIssuerProfile.issuerURL\"]\n}\n\noutput \"oidc_issuer_url\" {\n  value = data.azapi_resource.aks.output.properties.oidcIssuerProfile.issuerURL\n}\n```\n\n### Use `response_export_values` and JMESPath\n\n`response_export_values` controls which properties are extracted from the raw ARM API response and made available in the `output` attribute. It accepts a list or a map:\n\n- **List**: Specify JSON property paths to extract. Use `[\"*\"]` to export the full response body.\n- **Map**: Use [JMESPath](https://jmespath.org/) expressions to filter and reshape the response. The key is the output field name; the value is the JMESPath query.\n\nThe map form is preferred for list responses and cases where you need to transform the output:\n\n```terraform\ndata \"azapi_resource_list\" \"storage_accounts\" {\n  type      = \"Microsoft.Storage/storageAccounts@2023-01-01\"\n  parent_id = azurerm_resource_group.example.id\n\n  response_export_values = {\n    \"names\"     = \"value[].name\"\n    \"locations\" = \"value[].location\"\n  }\n}\n```\n\nFor a full walkthrough, see [List Azure resources with the AzAPI Terraform provider](get-started-azapi-resource-list.md).\n\n## Authentication using the AzAPI provider\n\nThe AzAPI provider enables the same authentication methods as the AzureRM provider. For more information on authentication options, see [Authenticate Terraform to Azure](./authenticate-to-azure.md?tabs=bash).\n\n\n## Experience and lifecycle of the AzAPI provider\n\nThis section describes some tools to help you use the AzAPI provider.\n\n### VS Code extension and Language Server\n\nThe [Microsoft Terraform VS Code extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureterraform) provides a rich authoring experience for both the AzureRM and AzAPI providers, including:\n\n- List all available resource types and API versions.\n![List all available resource types](media/overview-azapi-provider/list-all-available-resource-types.png)\n- Autocompletion of the allowed properties and values for any resource.\n![List allowed properties](media/overview-azapi-provider/list-allowed-properties.png)\n- Show hints when hovering over a property.\n![Show hint when hovering over a property](media/overview-azapi-provider/show-hint-when-hovering.png)\n- Syntax validation\n![Syntax validation](media/overview-azapi-provider/syntax-validation.png)\n- Autocompletion with code samples.\n![Autocompletion with code samples](media/overview-azapi-provider/auto-completion-with-code-samples.png)\n\nThe extension also supports paste-as-AzAPI (converts ARM JSON to `azapi_resource` blocks), Azure resource export via `aztfexport`, AzureRM-to-AzAPI migration, and preflight validation. For a full guide, see [Use the Microsoft Terraform VS Code extension](how-to-use-terraform-vscode-extension.md).\n\n### `aztfmigrate` migration tool\n\nThe [`aztfmigrate` tool](https://github.com/Azure/aztfmigrate/releases) is designed to help migrate existing resources between the AzAPI and AzureRM providers.\n\n`aztfmigrate` has two modes: plan and migrate:\n\n- Plan displays the AzAPI resources that can be migrated.\n- Migrate migrates the AzAPI resources to AzureRM resources in both the HCL files and the state.\n\n`aztfmigrate` ensures after migration that your Terraform configuration and state are aligned with your actual state. You can validate the update to state by running `terraform plan` after completing the migration to confirm no changes occurred.\n\nFor a step-by-step walkthrough, see [Migrate resources from AzAPI to AzureRM](how-to-migrate-between-azurerm-and-azapi.md).\n\n## Import existing Azure resources\n\nTo bring an existing Azure resource under AzAPI management without re-creating it, use the `import` block (Terraform 1.5 and later) or the `terraform import` command. The resource ID must include the API version as a query parameter:\n\n```terraform\nimport {\n  to = azapi_resource.example\n  id = \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg/providers/Microsoft.Network/virtualNetworks/example-vnet?api-version=2023-11-01\"\n}\n\nresource \"azapi_resource\" \"example\" {\n  type      = \"Microsoft.Network/virtualNetworks@2023-11-01\"\n  name      = \"example-vnet\"\n  parent_id = \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example-rg\"\n  location  = \"westus\"\n  body = {\n    properties = {\n      addressSpace = {\n        addressPrefixes = [\"10.0.0.0/16\"]\n      }\n    }\n  }\n}\n```\n\nTo import multiple resources at once from existing Azure infrastructure, use [Azure Export for Terraform (`aztfexport`)](./azure-export-for-terraform/export-terraform-overview.md), which generates both the HCL configuration and the import blocks automatically.\n\n## Granular controls over infrastructure\n\nOne major benefit of AzAPI is through its ability to fine-tune your configuration to match the right design patterns. There are several ways to do this:\n\n### Provider configuration options\n\nThe AzAPI provider block accepts several settings that apply globally across all resources in the configuration:\n\n| Option | Description |\n|---|---|\n| `enable_preflight` | Enables preflight validation at plan time. Defaults to `false`. See [Enable preflight validation in the AzAPI Terraform provider](how-to-use-azapi-preflight-validation.md) for details. |\n| `ignore_no_op_changes` | Suppresses plan-time noise from no-op differences between the configuration and normalized API responses. Defaults to `true`. |\n| `disable_default_output` | When set to `true`, disables automatic output of read-only properties when `response_export_values` isn't specified. Defaults to `false`. |\n| `default_location` | Sets a default `location` for all resources that don't specify one explicitly. |\n| `default_tags` | Sets default tags applied to all resources. Resource-level `tags` override these defaults. |\n| `skip_provider_registration` | Skips automatic resource provider registration. Set to `true` in restricted environments. |\n\nFor a full list of provider configuration options, see the [AzAPI provider schema](https://registry.terraform.io/providers/Azure/azapi/latest/docs).\n\nFor a walkthrough of enabling preflight, see [Enable preflight validation in the AzAPI Terraform provider](how-to-use-azapi-preflight-validation.md).\n\n### Provider functions\n\nAzAPI v2.0 and later includes several [provider functions](https://developer.hashicorp.com/terraform/plugin/framework/functions/concepts?product_intent=terraform):\n\n| Function Name | Description |\n| ------------- | ----------- |\n| [`build_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/build_resource_id) | Constructs an Azure resource ID given the parent ID, resource type, and resource name. <br> Useful for creating resource IDs for top-level and nested resources within a specific scope. |\n| [`extension_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/extension_resource_id) | Constructs an Azure extension resource ID given the base resource ID, resource type, and more resource names. |\n| [`management_group_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/management_group_resource_id) | Constructs an Azure management group scope resource ID given the management group name, resource type, and resource names.|\n| [`parse_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/parse_resource_id) |This function takes an Azure resource ID and a resource type and parses the ID into its individual components such as subscription ID, resource group name, provider namespace, and other parts.|\n| [`resource_group_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/resource_group_resource_id) | Constructs an Azure resource group scope resource ID given the subscription ID, resource group name, resource type, and resource names. |\n| [`subscription_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/subscription_resource_id) | Constructs an Azure subscription scope resource ID given the subscription ID, resource type, and resource names.|\n| [`tenant_resource_id`](https://registry.terraform.io/providers/Azure/azapi/latest/docs/functions/tenant_resource_id) |Constructs an Azure tenant scope resource ID given the resource type and resource names.|\n\n### User-defined retryable errors with the `retry` block\nThe AzAPI provider handles expected errors through the `retry` block. For example, use the following configuration to retry when a resource encounters a create timeout:\n```terraform\nresource \"azapi_resource\" \"example\" {\n    # usual properties\n    retry {\n        interval_seconds     = 5\n        randomization_factor = 0.5 # adds randomization to retry pattern\n        multiplier           = 2 # if try fails, multiplies time between next try by this much\n        error_message_regex  = [\"ResourceNotFound\"]\n    }\n    timeouts {\n        create = \"10m\"\n}\n```\n\nThe `retry` block accepts these attributes:\n\n| Attribute | Description |\n|---|---|\n| `error_message_regex` | Required. A list of regular expressions matched against error messages. The request is retried when any expression matches. |\n| `interval_seconds` | Base wait time between retries. Defaults to `10`. |\n| `max_interval_seconds` | Maximum wait time between retries. Defaults to `180`. |\n| `multiplier` | Multiplier applied to the interval after each failed attempt. Defaults to `1.5`. |\n| `randomization_factor` | Adds jitter to the retry interval to avoid thundering-herd patterns. Defaults to `0.5`. |\n\nCombine `retry` with the `timeouts` block to set an upper bound on total retry duration:\n\n```terraform\ntimeouts {\n  create = \"10m\"\n}\n```\n\n### Ephemeral resources and write-only properties\n\nAzAPI v2.x supports write-only arguments (Terraform 1.11 and later) through the `sensitive_body` attribute on `azapi_resource`. Write-only properties are sent to the ARM API but aren't stored in Terraform state, which is useful for secrets and credentials:\n\n```terraform\nresource \"azapi_resource\" \"example\" {\n  type      = \"Microsoft.SomeService/resources@2024-01-01\"\n  name      = \"example\"\n  parent_id = azurerm_resource_group.example.id\n\n  body = {\n    properties = {\n      name = \"example\"\n    }\n  }\n\n  # Write-only — not stored in state\n  sensitive_body = {\n    properties = {\n      adminPassword = var.admin_password\n    }\n  }\n}\n```\n\nUse `sensitive_body_version` to control when write-only properties are resent to the API (for example, when rotating credentials).\n\n### Triggers for resource replacement\n\nThe `AzAPI` provider allows you to configure parameters for resource replacement:\n\n#### `replace_triggers_external_values`\n\nReplaces the resource if a value changes. For example, if the SKU or zones variables were to be modified, this resource would be re-created:\n```terraform\nresource \"azapi_resource\" \"example\" {\n  name      = var.name\n  type      = \"Microsoft.Network/publicIPAddresses@2023-11-01\"\n  parent_id = \"/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/example\"\n  body      = properties = {\n    sku   = var.sku\n    zones = var.zones\n  }\n  replace_triggers_external_values = [\n    var.sku,\n    var.zones,\n  ]\n}\n```\nThis trigger works across a broad set of resources—for example, a policy assignment when properties of the definition change.\n\n#### `replace_triggers_refs`\n\nReplaces the resource if the referenced value changes. For example, if the SKU name or tier was modified, this resource would be re-created:\n```terraform\nresource \"azapi_resource\" \"example\" {\n  type      = \"Microsoft.Relay/namespaces@2021-11-01\"\n  parent_id = azurerm_resource_group.example.id\n  name      = \"xxx\"\n  location  = \"westus\"\n  body = {\n    properties = {\n    }\n    sku = {\n      name = \"Standard\"\n      tier = \"Standard\"\n    }\n  }\n\n  replace_triggers_refs = [\"sku\"]\n}\n```\nThis wouldn't trigger a replace if a different resource's SKU changes.\n\n## Next steps\n\n- [Choose between AzureRM and AzAPI Terraform providers](provider-selection-azurerm-vs-azapi.md)\n- [Understand the AzAPI data plane framework](concept-azapi-data-plane-framework.md)\n- [Deploy your first resource with the AzAPI provider](get-started-azapi-resource.md)\n- [Deploy your first Update Resource with the AzAPI provider](get-started-azapi-update-resource.md)\n- [Deploy your first resource action with the AzAPI provider](get-started-azapi-resource-action.md)\n- [Perform resource actions with the AzAPI provider](get-started-azapi-resource-action-mutation.md)\n- [Manage Azure data plane resources with AzAPI](get-started-azapi-data-plane-resource.md)\n- [List Azure resources with the AzAPI provider](get-started-azapi-resource-list.md)\n- [Enable preflight validation](how-to-use-azapi-preflight-validation.md)\n- [Use AzAPI provider functions](how-to-use-azapi-provider-functions.md)\n- [Migration paths between Azure, AzureRM, and AzAPI](how-to-migrate-between-azurerm-and-azapi.md)\n- [Visit the provider registry](https://registry.terraform.io/providers/Azure/azapi/latest/docs)\n"
  },
  {
    "path": "articles/terraform/overview.md",
    "content": "---\ntitle: Overview of Terraform on Azure - What is Terraform?\ndescription: Learn how Terraform can help you deploy and version your infrastructure on Azure.\nms.topic: overview\nms.date: 02/02/2024\nms.custom: devx-track-terraform\nadobe-target: true\n---\n\n# Overview of Terraform on Azure - What is Terraform?\n\n[Hashicorp Terraform](https://www.terraform.io/) is an open-source IaC (Infrastructure-as-Code) tool for configuring and deploying cloud infrastructure. It codifies infrastructure in configuration files that describe the desired state for your topology. Terraform enables the management of any infrastructure - such as public clouds, private clouds, and SaaS services - by using [Terraform providers](https://www.terraform.io/language/providers).  \n\n## Terraform providers for Azure infrastructure\n\nThere are several Terraform providers that enable the management of Azure infrastructure:\n\n- [AzureRM](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs): Manage stable Azure resources and functionality such as virtual machines, storage accounts, and networking interfaces.\n- [AzAPI](https://registry.terraform.io/providers/Azure/azapi/latest/docs): Manage Azure resources and functionality using the Azure Resource Manager APIs directly. Enables consistency with Azure's latest and greatest functionality without requiring provider updates. For more information about the AzAPI provider, see [Terraform AzAPI provider](overview-azapi-provider.md).\n- [AzureAD](https://registry.terraform.io/providers/hashicorp/azuread/latest/docs): Manage Microsoft Entra resources such as groups, users, service principals, and applications.\n- [AzureDevops](https://registry.terraform.io/providers/microsoft/azuredevops/latest/docs): Manage Azure DevOps resources such as agents, repositories, projects, pipelines, and queries.\n- [AzureStack](https://registry.terraform.io/providers/hashicorp/azurestack/latest/docs): Manage Azure Stack Hub resources such as virtual machines, DNS, virtual networks, and storage.\n\n### Using AzAPI vs AzureRM\nTo understand when to use AzAPI vs AzureRM, please read our [joint statement with HashiCorp](https://aka.ms/tf/providermessaging).\n\n## Benefits of Terraform with Azure\n\nThis section describes the benefits of using Terraform to manage Azure infrastructure.\n\n### Common IaC tool\n\nTerraform Azure providers enable you to manage all of your Azure infrastructure using the same declarative syntax and tooling. Using these providers you can:\n\n1. Configure core platform capabilities such as management groups, policies, users, groups, and policies. For more information, see [Terraform implementation of Cloud Adoption Framework Enterprise-scale](https://github.com/Azure/terraform-azurerm-caf-enterprise-scale#readme).\n1. Configure Azure DevOps projects and pipelines to automate regular infrastructure and application deployments.\n1. Deploy Azure resources required by your applications.\n\n### Automate infrastructure management\n\nThe Terraform template-based configuration file syntax enables you to configure Azure resources in a repeatable and predictable manner. Automating infrastructure includes the following benefits:\n\n- Lowers the potential for human errors while deploying and managing infrastructure.\n- Deploys the same template multiple times to create identical development, test, and production environments.\n- Reduces the cost of development and test environments by creating them on-demand.\n\n### Understand infrastructure changes before being applied\n\nAs a resource topology becomes complex, understanding the meaning and impact of infrastructure changes can be difficult.\n\nThe Terraform CLI enables users to validate and preview infrastructure changes before application of the plan. Previewing infrastructure changes in a safe manner has several benefits:\n\n- Team members can collaborate more effectively by understanding proposed changes and their impact.\n- Unintended changes can be caught early in the development process.\n\n## Next steps\n\nBased on your environment, install and configure Terraform:\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n"
  },
  {
    "path": "articles/terraform/provider-selection-azurerm-vs-azapi.md",
    "content": "---\ntitle: Choose between AzureRM and AzAPI Terraform providers\ndescription: Learn when to use the AzureRM provider versus the AzAPI provider for managing Azure resources with Terraform, including guidance on using both providers together.\nms.topic: concept-article\nms.date: 04/20/2026\nms.custom: devx-track-terraform\nauthor: stema\nms.author: stema\nai-usage: ai-generated\n---\n\n# Choose between AzureRM and AzAPI Terraform providers\n\nAzure has two official Terraform providers: **AzureRM** and **AzAPI**. Both providers manage Azure resources through Terraform, but they use different approaches. Understanding these differences helps you choose the right provider—or combination of providers—for your project.\n\n## Overview of each provider\n\n**AzureRM** is the standard provider for managing Azure resources with Terraform. It provides curated, typed resource blocks with integrated validation, consistent behavior, and broad community documentation. However, AzureRM supports only a subset of Azure resource types and API versions, and new features often lag behind Azure releases.\n\n**AzAPI** is a thin layer on top of the Azure Resource Manager (ARM) REST APIs. It supports any Azure resource type at any API version, including preview features and services not yet supported in AzureRM. AzAPI gives you direct access to the ARM API without waiting for provider updates.\n\n## When to use AzureRM\n\nUse AzureRM as your primary provider when:\n\n- The resources you're managing are fully supported in AzureRM with stable API versions.\n- You want curated resource schemas with built-in validation and good IDE support.\n- Your team values broad community resources, examples, and module availability.\n- You're managing well-established Azure services that don't require access to preview features.\n\nAzureRM is the right default for most teams building on Azure. Start with AzureRM, and supplement it with AzAPI only when needed.\n\n## When to use AzAPI\n\nUse AzAPI as your primary provider—or to supplement AzureRM—when:\n\n- You need to manage Azure resources that aren't yet supported in AzureRM.\n- You need to use a specific API version, including preview versions, that AzureRM doesn't expose.\n- You need access to resource properties that AzureRM doesn't surface.\n- You want full control over the API version for compliance or reproducibility reasons.\n- You're managing resources immediately after Azure release, before AzureRM adds support.\n\n## When to use both providers together\n\nAzureRM and AzAPI are designed to work side by side. A common pattern is to use AzureRM for most of your infrastructure while using AzAPI for direct ARM API access where needed:\n\n- Use `azapi_update_resource` to set properties on AzureRM-managed resources that AzureRM doesn't expose.\n- Use `azapi_resource` to manage a new service or preview feature while the rest of your stack uses AzureRM.\n- Use `azapi_resource_action` to perform operations on AzureRM-managed resources that don't fit a standard create/read/update/delete lifecycle.\n\n```terraform\n# Manage the primary resource with AzureRM\nresource \"azurerm_kubernetes_cluster\" \"example\" {\n  name                = \"my-aks\"\n  location            = azurerm_resource_group.example.location\n  resource_group_name = azurerm_resource_group.example.name\n  dns_prefix          = \"myaks\"\n  default_node_pool {\n    name       = \"default\"\n    node_count = 1\n    vm_size    = \"Standard_DS2_v2\"\n  }\n  identity {\n    type = \"SystemAssigned\"\n  }\n}\n\n# Use AzAPI to set a property not exposed by AzureRM\nresource \"azapi_update_resource\" \"aks_preview_feature\" {\n  type        = \"Microsoft.ContainerService/managedClusters@2024-02-01\"\n  resource_id = azurerm_kubernetes_cluster.example.id\n\n  body = {\n    properties = {\n      networkProfile = {\n        networkDataplane = \"cilium\"\n      }\n    }\n  }\n}\n```\n\n## Choosing a long-term strategy\n\n**AzureRM-primary**: Manage all resources in AzureRM and use AzAPI only as a temporary bridge for features not yet supported. Migrate AzAPI resources to AzureRM as support becomes available, using the [`aztfmigrate` tool](how-to-migrate-between-azurerm-and-azapi.md).\n\n**AzAPI-primary**: Manage all resources through AzAPI for consistent API version control and early access to new features. This approach requires more configuration but gives you full control over every resource's API version.\n\nMost teams should start with an AzureRM-primary strategy and adopt AzAPI as needed.\n\n## Feature comparison\n\n| Feature | AzureRM | AzAPI |\n|---|---|---|\n| Supports all Azure resource types | No—curated subset | Yes |\n| Supports preview API versions | No | Yes |\n| Curated resource schemas | Yes | No |\n| Built-in property validation | Yes | Partial (via preflight) |\n| IDE autocomplete for properties | Yes | Yes (with VS Code extension) |\n| Response export / JMESPath filtering | No | Yes |\n| Data plane resource management | No | Yes (selected resource types) |\n| Provider functions for ID construction | No | Yes (v2.0 and later) |\n| Preflight validation at plan time | No | Yes—[Enable preflight validation](how-to-use-azapi-preflight-validation.md) |\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Terraform AzAPI provider overview](overview-azapi-provider.md)\n\n> [!div class=\"nextstepaction\"]\n> [Migrate resources from AzAPI to AzureRM](how-to-migrate-between-azurerm-and-azapi.md)\n"
  },
  {
    "path": "articles/terraform/provider-version-history-azurerm-0-1-0-to-0-3-3.md",
    "content": "---\ntitle: Terraform AzureRM provider version history 0.1.0 - 0.3.3\ndescription: View the Terraform AzureRM provider version history for 0.1.0 - 0.3.3\nkeywords: azure devops terraform change log release history what's new\nms.topic: reference\nms.date: 10/17/2024\nms.custom: devx-track-terraform\n# Customer intent: I want to view the AzureRM provider version history for versions 0.1.0 - 0.3.3\n# Source: https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v0.md\n---\n\n# Terraform AzureRM provider version history: 0.1.0 - 0.3.3\n\n## 0.3.3 (November 14, 2017)\n\nFEATURES:\n\n* **New Resource:** `azurerm_redis_firewall_rule` ([#529](https://github.com/hashicorp/terraform-provider-azurerm/issues/529))\n\nIMPROVEMENTS:\n\n* authentication: allow using multiple subscriptions for Azure CLI auth ([#445](https://github.com/hashicorp/terraform-provider-azurerm/issues/445))\n* core: appending the CloudShell version to the user agent when running within CloudShell ([#483](https://github.com/hashicorp/terraform-provider-azurerm/issues/483))\n* `azurerm_app_service` / `azurerm_app_service_plan` - adding validation for the `name` fields ([#528](https://github.com/hashicorp/terraform-provider-azurerm/issues/528))\n* `azurerm_container_registry` - Migration: Fixing a crash when the storage_account block is nil ([#551](https://github.com/hashicorp/terraform-provider-azurerm/issues/551))\n* `azurerm_lb_nat_rule`: support for floating IP's ([#542](https://github.com/hashicorp/terraform-provider-azurerm/issues/542))\n* `azurerm_public_ip` - Clarify the error message for the validation of domain name label ([#485](https://github.com/hashicorp/terraform-provider-azurerm/issues/485))\n* `azurerm_network_security_group` - fixing a crash when changes were made outside of Terraform ([#492](https://github.com/hashicorp/terraform-provider-azurerm/issues/492))\n* `azurerm_redis_cache`: support for Patch Schedules ([#540](https://github.com/hashicorp/terraform-provider-azurerm/issues/540))\n* `azurerm_virtual_machine` - ensuring `vhd_uri` is validated ([#470](https://github.com/hashicorp/terraform-provider-azurerm/issues/470))\n* `azurerm_virtual_machine_scale_set`: fixing a crash where accelerated networking isn't returned by the API ([#480](https://github.com/hashicorp/terraform-provider-azurerm/issues/480))\n\n## 0.3.2 (October 30, 2017)\n\nFEATURES: \n\n* **New Resource:** `azurerm_application_gateway` ([#413](https://github.com/hashicorp/terraform-provider-azurerm/issues/413))\n\nIMPROVEMENTS: \n\n  - `azurerm_virtual_machine_scale_set` - Add nil check to os disk ([#436](https://github.com/hashicorp/terraform-provider-azurerm/issues/436))\n\n  - `azurerm_key_vault` - Increased timeout on dns availability ([#457](https://github.com/hashicorp/terraform-provider-azurerm/issues/457))\n  \n  - `azurerm_route_table` - Fix issue when routes are computed ([#450](https://github.com/hashicorp/terraform-provider-azurerm/issues/450))\n\n## 0.3.1 (October 21, 2017)\n\nIMPROVEMENTS:\n\n  - `azurerm_virtual_machine_scale_set` - Updating this resource with the v11 of the Azure SDK for Go ([#448](https://github.com/hashicorp/terraform-provider-azurerm/issues/448))\n\n## 0.3.0 (October 17, 2017)\n\nUPGRADE NOTES:\n\n  - `azurerm_automation_account` - the SKU `Free` has been replaced with `Basic`.\n  - `azurerm_container_registry` - Azure has updated the SKU from `Basic` to `Classic`, with new `Basic`, `Standard` and `Premium` SKU's introduced.\n  - `azurerm_container_registry` - the `storage_account` block is now `storage_account_id` and is only required for `Classic` SKU's\n  - `azurerm_key_vault` - `certificate_permissions`, `key_permissions` and `secret_permissions` have all had the `All` option removed by Azure. Each permission now needs to be specified manually.\n  * `azurerm_route_table` - `route` is no longer computed\n  - `azurerm_servicebus_namespace` - The `capacity` field can only be set for `Premium` SKU's\n  - `azurerm_servicebus_queue` - The `enable_batched_operations` and `support_ordering` fields have been deprecated by Azure.\n  - `azurerm_servicebus_subscription` - The `dead_lettering_on_filter_evaluation_exceptions` has been removed by Azure.\n  - `azurerm_servicebus_topic` - The `enable_filtering_messages_before_publishing` field has been removed by Azure.\n\nFEATURES:\n\n* **New Data Source:** `azurerm_builtin_role_definition` ([#384](https://github.com/hashicorp/terraform-provider-azurerm/issues/384))\n* **New Data Source:** `azurerm_image` ([#382](https://github.com/hashicorp/terraform-provider-azurerm/issues/382))\n* **New Data Source:** `azurerm_key_vault_access_policy` ([#423](https://github.com/hashicorp/terraform-provider-azurerm/issues/423))\n* **New Data Source:** `azurerm_platform_image` ([#375](https://github.com/hashicorp/terraform-provider-azurerm/issues/375))\n* **New Data Source:** `azurerm_role_definition` ([#414](https://github.com/hashicorp/terraform-provider-azurerm/issues/414))\n* **New Data Source:** `azurerm_snapshot` ([#420](https://github.com/hashicorp/terraform-provider-azurerm/issues/420))\n* **New Data Source:** `azurerm_subnet` ([#411](https://github.com/hashicorp/terraform-provider-azurerm/issues/411))\n* **New Resource:** `azurerm_key_vault_certificate` ([#408](https://github.com/hashicorp/terraform-provider-azurerm/issues/408))\n* **New Resource:** `azurerm_role_assignment` ([#414](https://github.com/hashicorp/terraform-provider-azurerm/issues/414))\n* **New Resource:** `azurerm_role_definition` ([#414](https://github.com/hashicorp/terraform-provider-azurerm/issues/414))\n* **New Resource:** `azurerm_snapshot` ([#420](https://github.com/hashicorp/terraform-provider-azurerm/issues/420))\n\nIMPROVEMENTS:\n\n* Upgrading to v11 of the Azure SDK for Go ([#367](https://github.com/hashicorp/terraform-provider-azurerm/issues/367))\n* `azurerm_client_config` - updating the data source to work when using AzureCLI auth ([#393](https://github.com/hashicorp/terraform-provider-azurerm/issues/393))\n* `azurerm_container_group` - add support for volume mounts ([#366](https://github.com/hashicorp/terraform-provider-azurerm/issues/366))\n* `azurerm_key_vault` - fix a crash when no certificate_permissions are defined ([#374](https://github.com/hashicorp/terraform-provider-azurerm/issues/374))\n* `azurerm_key_vault` - waiting for the DNS to propagate ([#401](https://github.com/hashicorp/terraform-provider-azurerm/issues/401))\n* `azurerm_managed_disk` - support for creating Managed Disks from Platform Images by supporting \"FromImage\" ([#399](https://github.com/hashicorp/terraform-provider-azurerm/issues/399))\n* `azurerm_managed_disk` - support for creating Encrypted Managed Disks ([#399](https://github.com/hashicorp/terraform-provider-azurerm/issues/399))\n* `azurerm_mysql_*` - Ensuring we register the MySQL Resource Provider ([#397](https://github.com/hashicorp/terraform-provider-azurerm/issues/397))\n* `azurerm_network_interface` - exposing all of the Private IP Addresses assigned to the NIC ([#409](https://github.com/hashicorp/terraform-provider-azurerm/issues/409))\n* `azurerm_network_security_group` / `azurerm_network_security_rule` - refactoring ([#405](https://github.com/hashicorp/terraform-provider-azurerm/issues/405))\n* `azurerm_route_table` - removing routes when none are specified ([#403](https://github.com/hashicorp/terraform-provider-azurerm/issues/403))\n* `azurerm_route_table` - refactoring `route` from a Set to a List ([#402](https://github.com/hashicorp/terraform-provider-azurerm/issues/402))\n* `azurerm_route` - refactoring `route` from a Set to a List ([#402](https://github.com/hashicorp/terraform-provider-azurerm/issues/402))\n* `azurerm_storage_account` - support for File Encryption ([#363](https://github.com/hashicorp/terraform-provider-azurerm/issues/363))\n* `azurerm_storage_account` - support for Custom Domain ([#363](https://github.com/hashicorp/terraform-provider-azurerm/issues/363))\n* `azurerm_storage_account` - splitting the storage account Tier and Replication out into separate fields ([#363](https://github.com/hashicorp/terraform-provider-azurerm/issues/363))\n- `azurerm_storage_account` - returning a user friendly error when trying to provision a Blob Storage Account with ZRS redundancy ([#421](https://github.com/hashicorp/terraform-provider-azurerm/issues/421))\n* `azurerm_subnet` - making it possible to remove Network Security Groups / Route Tables ([#411](https://github.com/hashicorp/terraform-provider-azurerm/issues/411))\n* `azurerm_virtual_machine` - fixing a bug where `additional_unattend_config.content` was being updated unintentionally ([#377](https://github.com/hashicorp/terraform-provider-azurerm/issues/377))\n* `azurerm_virtual_machine` - switching to use Lists instead of Sets ([#426](https://github.com/hashicorp/terraform-provider-azurerm/issues/426))\n* `azurerm_virtual_machine_scale_set` - fixing a bug where `additional_unattend_config.content` was being updated unintentionally ([#377](https://github.com/hashicorp/terraform-provider-azurerm/issues/377))\n* `azurerm_virtual_machine_scale_set` - support for multiple network profiles ([#378](https://github.com/hashicorp/terraform-provider-azurerm/issues/378))\n\n## 0.2.2 (September 28, 2017)\n\nFEATURES:\n\n* **New Resource:** `azurerm_key_vault_key` ([#356](https://github.com/hashicorp/terraform-provider-azurerm/issues/356))\n* **New Resource:** `azurerm_log_analytics_workspace` ([#331](https://github.com/hashicorp/terraform-provider-azurerm/issues/331))\n* **New Resource:** `azurerm_mysql_configuration` ([#352](https://github.com/hashicorp/terraform-provider-azurerm/issues/352))\n* **New Resource:** `azurerm_mysql_database` ([#352](https://github.com/hashicorp/terraform-provider-azurerm/issues/352))\n* **New Resource:** `azurerm_mysql_firewall_rule` ([#352](https://github.com/hashicorp/terraform-provider-azurerm/issues/352))\n* **New Resource:** `azurerm_mysql_server` ([#352](https://github.com/hashicorp/terraform-provider-azurerm/issues/352))\n\nIMPROVEMENTS:\n\n* Updating the provider initialization & adding a `skip_credentials_validation` field to the provider for some advanced scenarios ([#322](https://github.com/hashicorp/terraform-provider-azurerm/issues/322))\n\n## 0.2.1 (September 25, 2017)\n\nFEATURES:\n\n* **New Resource:** `azurerm_automation_account` ([#257](https://github.com/hashicorp/terraform-provider-azurerm/issues/257))\n* **New Resource:** `azurerm_automation_credential` ([#257](https://github.com/hashicorp/terraform-provider-azurerm/issues/257))\n* **New Resource:** `azurerm_automation_runbook` ([#257](https://github.com/hashicorp/terraform-provider-azurerm/issues/257))\n* **New Resource:** `azurerm_automation_schedule` ([#257](https://github.com/hashicorp/terraform-provider-azurerm/issues/257))\n* **New Resource:** `azurerm_app_service` ([#344](https://github.com/hashicorp/terraform-provider-azurerm/issues/344))\n\nIMPROVEMENTS:\n\n* `azurerm_client_config` - adding `service_principal_application_id` ([#348](https://github.com/hashicorp/terraform-provider-azurerm/issues/348))\n* `azurerm_key_vault` - adding `application_id` and `certificate_permissions` ([#348](https://github.com/hashicorp/terraform-provider-azurerm/issues/348))\n\nBUG FIXES:\n\n* `azurerm_virtual_machine_scale_set` - fix panic with `additional_unattend_config` block ([#266](https://github.com/hashicorp/terraform-provider-azurerm/issues/266))\n\n## 0.2.0 (September 15, 2017)\n\nFEATURES:\n\n* **Support for authenticating using the Azure CLI** ([#316](https://github.com/hashicorp/terraform-provider-azurerm/issues/316))\n* **New Resource:** `azurerm_container_group` ([#333](https://github.com/hashicorp/terraform-provider-azurerm/issues/333)] [[#311](https://github.com/hashicorp/terraform-provider-azurerm/issues/311)] [[#338](https://github.com/hashicorp/terraform-provider-azurerm/issues/338))\n\nIMPROVEMENTS:\n\n* `azurerm_app_service_plan` - support for Linux App Service Plans ([#332](https://github.com/hashicorp/terraform-provider-azurerm/issues/332))\n* `azurerm_postgresql_server` - supporting additional storage sizes ([#239](https://github.com/hashicorp/terraform-provider-azurerm/issues/239))\n* `azurerm_public_ip` - verifying the ID is valid before importing ([#320](https://github.com/hashicorp/terraform-provider-azurerm/issues/320))\n* `azurerm_sql_server` - verifying the name is valid before creating ([#323](https://github.com/hashicorp/terraform-provider-azurerm/issues/323))\n* `resource_group_name` - validation has been added to all resources that use this attribute ([#330](https://github.com/hashicorp/terraform-provider-azurerm/issues/330))\n\n## 0.1.7 (September 11, 2017)\n\nFEATURES:\n\n* **New Resource:** `azurerm_postgresql_configuration` ([#210](https://github.com/hashicorp/terraform-provider-azurerm/issues/210))\n* **New Resource:** `azurerm_postgresql_database` ([#210](https://github.com/hashicorp/terraform-provider-azurerm/issues/210))\n* **New Resource:** `azurerm_postgresql_firewall_rule` ([#210](https://github.com/hashicorp/terraform-provider-azurerm/issues/210))\n* **New Resource:** `azurerm_postgresql_server` ([#210](https://github.com/hashicorp/terraform-provider-azurerm/issues/210))\n\nIMPROVEMENTS:\n\n* `azurerm_cdn_endpoint` - defaulting the `http_port` and `https_port` ([#301](https://github.com/hashicorp/terraform-provider-azurerm/issues/301))\n* `azurerm_cosmos_db_account`: allow setting the Kind to MongoDB/GlobalDocumentDB ([#299](https://github.com/hashicorp/terraform-provider-azurerm/issues/299))\n\n## 0.1.6 (August 31, 2017)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_subscription` ([#285](https://github.com/hashicorp/terraform-provider-azurerm/issues/285))\n* **New Resource:** `azurerm_app_service_plan` ([#1](https://github.com/hashicorp/terraform-provider-azurerm/issues/1))\n* **New Resource:** `azurerm_eventgrid_topic` ([#260](https://github.com/hashicorp/terraform-provider-azurerm/issues/260))\n* **New Resource:** `azurerm_key_vault_secret` ([#269](https://github.com/hashicorp/terraform-provider-azurerm/issues/269))\n\nIMPROVEMENTS:\n\n* `azurerm_image` - added a default to the `caching` field ([#259](https://github.com/hashicorp/terraform-provider-azurerm/issues/259))\n* `azurerm_key_vault` - validation for the `name` field ([#270](https://github.com/hashicorp/terraform-provider-azurerm/issues/270))\n* `azurerm_network_interface` - support for multiple IP Configurations / setting the Primary IP Configuration ([#245](https://github.com/hashicorp/terraform-provider-azurerm/issues/245))\n* `azurerm_resource_group` - poll until the resource group is created (by migrating to the Azure SDK for Go) ([#289](https://github.com/hashicorp/terraform-provider-azurerm/issues/289))\n* `azurerm_search_service` - migrating to use the Azure SDK for Go ([#283](https://github.com/hashicorp/terraform-provider-azurerm/issues/283))\n* `azurerm_sql_*` - ensuring deleted resources are detected ([#289](https://github.com/hashicorp/terraform-provider-azurerm/issues/289)] / [[#255](https://github.com/hashicorp/terraform-provider-azurerm/issues/255))\n* `azurerm_sql_database` - Import Support ([#289](https://github.com/hashicorp/terraform-provider-azurerm/issues/289))\n* `azurerm_sql_database` - migrating to using the Azure SDK for Go ([#289](https://github.com/hashicorp/terraform-provider-azurerm/issues/289))\n* `azurerm_sql_firewall_rule` - migrating to using the Azure SDK for Go ([#289](https://github.com/hashicorp/terraform-provider-azurerm/issues/289))\n* `azurerm_sql_server` - added checks to handle `name` not being globally unique ([#189](https://github.com/hashicorp/terraform-provider-azurerm/issues/189))\n* `azurerm_sql_server` - making `administrator_login` `ForceNew` ([#189](https://github.com/hashicorp/terraform-provider-azurerm/issues/189))\n* `azurerm_sql_server` - migrate to using the azure-sdk-for-go ([#189](https://github.com/hashicorp/terraform-provider-azurerm/issues/189))\n* `azurerm_virtual_machine` - Force recreation if `storage_data_disk`.`create_option` changes ([#240](https://github.com/hashicorp/terraform-provider-azurerm/issues/240))\n* `azurerm_virtual_machine_scale_set` - Fix address issue when setting the `winrm` block ([#271](https://github.com/hashicorp/terraform-provider-azurerm/issues/271))\n* updating to `v10.3.0-beta` of the Azure SDK for Go ([#258](https://github.com/hashicorp/terraform-provider-azurerm/issues/258))\n* Removing the (now unused) Riviera SDK ([#289](https://github.com/hashicorp/terraform-provider-azurerm/issues/289)] [[#291](https://github.com/hashicorp/terraform-provider-azurerm/issues/291))\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_account` - fixing the validation on the name field ([#263](https://github.com/hashicorp/terraform-provider-azurerm/issues/263))\n* `azurerm_sql_server` - handle deleted servers correctly ([#189](https://github.com/hashicorp/terraform-provider-azurerm/issues/189))\n* Fixing the `Microsoft.Insights` Resource Provider Registration ([#282](https://github.com/hashicorp/terraform-provider-azurerm/issues/282))\n\n## 0.1.5 (August 09, 2017)\n\nIMPROVEMENTS:\n\n* `azurerm_sql_*` - upgrading to version `2014-04-01` of the SQL API's ([#201](https://github.com/hashicorp/terraform-provider-azurerm/issues/201))\n* `azurerm_virtual_machine` - support for the `Windows_Client` Hybrid Use Benefit type ([#212](https://github.com/hashicorp/terraform-provider-azurerm/issues/212))\n* `azurerm_virtual_machine_scale_set` - support for custom images and managed disks ([#203](https://github.com/hashicorp/terraform-provider-azurerm/issues/203))\n\nBUG FIXES:\n\n* `azurerm_sql_database` - fixing creating a DB with a PointInTimeRestore ([#197](https://github.com/hashicorp/terraform-provider-azurerm/issues/197))\n* `azurerm_virtual_machine` - fix a crash when the properties for a network interface aren't returned ([#208](https://github.com/hashicorp/terraform-provider-azurerm/issues/208))\n* `azurerm_virtual_machine` - changes to custom data should force new resource ([#211](https://github.com/hashicorp/terraform-provider-azurerm/issues/211))\n* `azurerm_virtual_machine` - fixes a crash caused by an empty `os_profile_windows_config` block ([#222](https://github.com/hashicorp/terraform-provider-azurerm/issues/222))\n* Checking to ensure the HTTP Response isn't `nil` before accessing it (fixes ([#200](https://github.com/hashicorp/terraform-provider-azurerm/issues/200)]) [[#204](https://github.com/hashicorp/terraform-provider-azurerm/issues/204))\n\n## 0.1.4 (July 26, 2017)\n\nBUG FIXES:\n\n* `azurerm_dns_*` - upgrading to version `2016-04-01` of the Azure DNS API by switching from Riviera -> Azure SDK for Go ([#192](https://github.com/hashicorp/terraform-provider-azurerm/issues/192))\n\n## 0.1.3 (July 21, 2017)\n\nFEATURES:\n\n* **New Resource:** `azurerm_dns_ptr_record` ([#141](https://github.com/hashicorp/terraform-provider-azurerm/issues/141))\n* **New Resource:**`azurerm_image` ([#8](https://github.com/hashicorp/terraform-provider-azurerm/issues/8))\n* **New Resource:** `azurerm_servicebus_queue` ([#151](https://github.com/hashicorp/terraform-provider-azurerm/issues/151))\n\nIMPROVEMENTS:\n\n* `azurerm_client_config` - added a `service_principal_object_id` attribute to the data source ([#175](https://github.com/hashicorp/terraform-provider-azurerm/issues/175))\n* `azurerm_search_service` - added import support ([#172](https://github.com/hashicorp/terraform-provider-azurerm/issues/172))\n* `azurerm_servicebus_topic` - added a `status` field to allow disabling the topic ([#150](https://github.com/hashicorp/terraform-provider-azurerm/issues/150))\n* `azurerm_storage_account` - Added support for Require secure transfer ([#167](https://github.com/hashicorp/terraform-provider-azurerm/issues/167))\n* `azurerm_storage_table` - updating the name validation ([#143](https://github.com/hashicorp/terraform-provider-azurerm/issues/143))\n* `azurerm_virtual_machine` - making `admin_password` optional for Linux VM's ([#154](https://github.com/hashicorp/terraform-provider-azurerm/issues/154))\n* `azurerm_virtual_machine_scale_set` - adding a `plan` block for Marketplace images ([#161](https://github.com/hashicorp/terraform-provider-azurerm/issues/161))\n\n## 0.1.2 (June 29, 2017)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_managed_disk` ([#121](https://github.com/hashicorp/terraform-provider-azurerm/issues/121))\n* **New Resource:** `azurerm_application_insights` ([#3](https://github.com/hashicorp/terraform-provider-azurerm/issues/3))\n* **New Resource:** `azurerm_cosmosdb_account` ([#108](https://github.com/hashicorp/terraform-provider-azurerm/issues/108))\n* `azurerm_network_interface` now supports import ([#119](https://github.com/hashicorp/terraform-provider-azurerm/issues/119))\n\nIMPROVEMENTS:\n\n* Ensuring consistency in when storing the `location` field in the state for the `azurerm_availability_set`, `azurerm_express_route_circuit`, `azurerm_load_balancer`, `azurerm_local_network_gateway`, `azurerm_managed_disk`, `azurerm_network_security_group`\n`azurerm_public_ip`, `azurerm_resource_group`, `azurerm_route_table`, `azurerm_storage_account`, `azurerm_virtual_machine` and `azurerm_virtual_network` resources ([#123](https://github.com/hashicorp/terraform-provider-azurerm/issues/123))\n* `azurerm_redis_cache` - now supports backup settings for Premium Redis Cache's ([#130](https://github.com/hashicorp/terraform-provider-azurerm/issues/130))\n* `azurerm_storage_account` - exposing a formatted Connection String for Blob access ([#142](https://github.com/hashicorp/terraform-provider-azurerm/issues/142))\n\nBUG FIXES:\n\n* `azurerm_cdn_endpoint` - fixing update of the `origin_host_header` ([#134](https://github.com/hashicorp/terraform-provider-azurerm/issues/134))\n* `azurerm_container_service` - exposes the FQDN of the `master_profile` as a computed field ([#125](https://github.com/hashicorp/terraform-provider-azurerm/issues/125))\n* `azurerm_key_vault` - fixing import / the validation on Access Policies ([#124](https://github.com/hashicorp/terraform-provider-azurerm/issues/124))\n* `azurerm_network_interface` - Normalizing the location field in the state ([#122](https://github.com/hashicorp/terraform-provider-azurerm/issues/122))\n* `azurerm_network_interface` - fixing a crash when importing a NIC with a Public IP ([#128](https://github.com/hashicorp/terraform-provider-azurerm/issues/128))\n* `azurerm_network_security_rule`: `network_security_group_name` is now `ForceNew` ([#138](https://github.com/hashicorp/terraform-provider-azurerm/issues/138))\n* `azurerm_subnet` now correctly detects changes to Network Security Groups and Routing Table's ([#113](https://github.com/hashicorp/terraform-provider-azurerm/issues/113))\n* `azurerm_virtual_machine_scale_set` - making `storage_profile_os_disk`.`name` optional ([#129](https://github.com/hashicorp/terraform-provider-azurerm/issues/129))\n\n## 0.1.1 (June 21, 2017)\n\nBUG FIXES:\n\n* Sort ResourceID.Path keys for consistent output ([#116](https://github.com/hashicorp/terraform-provider-azurerm/issues/116))\n\n## 0.1.0 (June 20, 2017)\n\nBACKWARDS INCOMPATIBILITIES / NOTES:\n\nFEATURES:\n\n* **New Data Source:** `azurerm_resource_group` [[#15022](https://github.com/hashicorp/terraform-provider-azurerm/issues/15022)](https://github.com/hashicorp/terraform/pull/15022)\n\nIMPROVEMENTS:\n\n* Add diff suppress func to endpoint_location [[#15094](https://github.com/hashicorp/terraform-provider-azurerm/issues/15094)](https://github.com/hashicorp/terraform/pull/15094)\n\nBUG FIXES:\n\n* Fixing the Deadlock issue ([#6](https://github.com/hashicorp/terraform-provider-azurerm/issues/6))"
  },
  {
    "path": "articles/terraform/provider-version-history-azurerm-1-0-0-to-1-44-0.md",
    "content": "---\ntitle: Terraform AzureRM provider version history 1.0.0 - 1.44.0\ndescription: View the Terraform AzureRM provider version history for 1.0.0 - 1.44.0\nkeywords: azure devops terraform change log release history what's new\nms.topic: reference\nms.date: 10/17/2024\nms.custom: devx-track-terraform\n# Customer intent: I want to view the AzureRM provider version history for versions 1.0.0 - 1.44.0\n# Source: https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v1.md)\n---\n\n# Terraform AzureRM provider version history: 1.0.0 - 1.44.0\n\n## 1.44.0 (February 12, 2020)\n\nNOTES\n\n* **Preparation for 2.0:** We intend for v1.44.0 to be the last release in the 1.x line - we'll be turning our focus to 2.0 with the next release. We recommend [consulting the list of changes coming in 2.0](https://www.terraform.io/docs/providers/azurerm/guides/2.0-upgrade-guide.html) to be aware and [trialling the Beta available in 1.x versions](https://www.terraform.io/docs/providers/azurerm/guides/2.0-beta.html) if you're interested.\n\n* **Terraform 0.10/0.11:** The upcoming version 2.0 of the Azure Provider will not support Terraform 0.10.x & Terraform 0.11.x - you will need to upgrade to Terraform 0.12 to use version 2.0 (and above) of the Azure Provider.\n\nFEATURES:\n\n* **New Data Source:** `azurerm_eventhub_consumer_group` ([#5518](https://github.com/hashicorp/terraform-provider-azurerm/issues/5518))\n* **New Data Source:** `azurerm_function_app` ([#5642](https://github.com/hashicorp/terraform-provider-azurerm/issues/5642))\n* **New Data Source:** `azurerm_iothub_dps_shared_access_policy` ([#5516](https://github.com/hashicorp/terraform-provider-azurerm/issues/5516))\n\nCHANGES TO BETA RESOURCES:\n\n* `azurerm_linux_virtual_machine` - added validation for the SSH Key type ([#5610](https://github.com/hashicorp/terraform-provider-azurerm/issues/5610))\n* `azurerm_linux_virtual_machine_scale_set` - support for updating VMSS's with a Automatic & Rolling Upgrade Policy (sending `health_probe_id` during an update) ([#5430](https://github.com/hashicorp/terraform-provider-azurerm/issues/5430))\n* `azurerm_windows_virtual_machine` - added validation for the SSH Key type ([#5610](https://github.com/hashicorp/terraform-provider-azurerm/issues/5610))\n* `azurerm_windows_virtual_machine_scale_set` - support for updating VMSS's with a Automatic & Rolling Upgrade Policy (sending `health_probe_id` during an update) ([#5430](https://github.com/hashicorp/terraform-provider-azurerm/issues/5430))\n\nIMPROVEMENTS:\n\n* `azurerm_api_management` - support for configuring the HTTP2 protocol ([#5593](https://github.com/hashicorp/terraform-provider-azurerm/issues/5593))\n* `azurerm_cognitive_account` - support for the `kind` `FormRecognizer` ([#5679](https://github.com/hashicorp/terraform-provider-azurerm/issues/5679))\n* `azurerm_cognitive_account` - support for the `kind` `ImmersiveReader` ([#5604](https://github.com/hashicorp/terraform-provider-azurerm/issues/5604))\n* `azurerm_databricks_workspace` - support for the `Trial` SKU ([#5652](https://github.com/hashicorp/terraform-provider-azurerm/issues/5652))\n* `azurerm_function_app` - support for configuring `ip_restriction` blocks ([#5440](https://github.com/hashicorp/terraform-provider-azurerm/issues/5440))\n* `azurerm_function_app` - support for configuring user assigned identities ([#5676](https://github.com/hashicorp/terraform-provider-azurerm/issues/5676))\n* `azurerm_key_vault_key` - support for `not_before_date` and `expiration_date` ([#5619](https://github.com/hashicorp/terraform-provider-azurerm/issues/5619))\n* `azurerm_lb` - fixing a crash when the HTTP response is dropped ([#5680](https://github.com/hashicorp/terraform-provider-azurerm/issues/5680))\n* `azurerm_stream_analytics_job` - support for importing jobs created in the portal ([#5522](https://github.com/hashicorp/terraform-provider-azurerm/issues/5522))\n* `azurerm_storage_blob` - support for authenticating using Microsoft Entra ID ([#5614](https://github.com/hashicorp/terraform-provider-azurerm/issues/5614))\n* `azurerm_storage_container` - support for authenticating using Microsoft Entra ID ([#5614](https://github.com/hashicorp/terraform-provider-azurerm/issues/5614))\n* `azurerm_storage_queue` - support for authenticating using Microsoft Entra ID ([#5614](https://github.com/hashicorp/terraform-provider-azurerm/issues/5614))\n\nBUGS:\n\n* `azurerm_storage_account` - fix hanging destroy caused by multiple network rules ([#5565](https://github.com/hashicorp/terraform-provider-azurerm/issues/5565))\n* `azurerm_linux_virtual_machine` - fix `shared_image_id` parsing ([#5640](https://github.com/hashicorp/terraform-provider-azurerm/issues/5640))\n\n## 1.43.0 (February 04, 2020)\n\nNOTES\n\n* **Opt-In Beta:** Version 1.43 of the Azure Provider introduces an opt-in Beta for some of the new functionality coming in 2.0 - more information can be found [in the Beta guide](https://terraform.io/docs/providers/azurerm/guides/2.0-beta.html).\n\n* **Terraform 0.10/0.11:** The upcoming version 2.0 of the Azure Provider will not support Terraform 0.10.x & Terraform 0.11.x - you will need to upgrade to Terraform 0.12 to use version 2.0 (and above) of the Azure Provider.\n\nFEATURES:\n\n* **New Data Source:** `azurerm_eventhub_namespace_authorization_rule` ([#5489](https://github.com/hashicorp/terraform-provider-azurerm/issues/5489))\n* **New Data Source:** `azurerm_mariadb_server` ([#5506](https://github.com/hashicorp/terraform-provider-azurerm/issues/5506))\n\nIMPROVEMENTS:\n\n* `azurerm_application_insights` - support for the `daily_data_cap_in_gb` & `daily_data_cap_notifications_disabled` properties ([#5480](https://github.com/hashicorp/terraform-provider-azurerm/issues/5480))\n* `azurerm_private_endpoint` - expose mapping between `group_id` and `subresource_names` ([#5571](https://github.com/hashicorp/terraform-provider-azurerm/issues/5571))\n* `azurerm_recovery_services_vault` - support for the `soft_delete_enabled` property ([#5586](https://github.com/hashicorp/terraform-provider-azurerm/issues/5586))\n\nBUGS:\n\n* `azurerm_databricks_workspace` - allow underscores in `name` ([#5548](https://github.com/hashicorp/terraform-provider-azurerm/issues/5548))\n* `azurerm_dns_aaaa_record` - normalize IPv6 addresses ([#5459](https://github.com/hashicorp/terraform-provider-azurerm/issues/5459))\n* `azurerm_frontdoor` - including required `minimum_tls_version` to the `custom_https_configuration` block ([#5539](https://github.com/hashicorp/terraform-provider-azurerm/issues/5539))\n* `azurerm_managed_disk` - correctly handles disk resizing when attached to a virtual machine ([#5579](https://github.com/hashicorp/terraform-provider-azurerm/issues/5579))\n* `azurerm_marketplace_agreement` - recreate agreement if not accepted ([#5582](https://github.com/hashicorp/terraform-provider-azurerm/issues/5582))\n* `azurerm_mysql_virtual_network_rule` - allow `subnet_id` to be in a different subscription then the database ([#5568](https://github.com/hashicorp/terraform-provider-azurerm/issues/5568))\n* `azurerm_virtual_network_gateway_connection` - increase `routing_weight` maximum to `32000` ([#5540](https://github.com/hashicorp/terraform-provider-azurerm/issues/5540))\n\n## 1.42.0 (January 27, 2020)\n\nNOTES:\n\n* `azurerm_cosmosdb_account` - the `capabilities` is now force new as it cannot be updated once set ([#5453](https://github.com/hashicorp/terraform-provider-azurerm/issues/5453))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_dedicated_host` ([#5513](https://github.com/hashicorp/terraform-provider-azurerm/issues/5513))\n* **New Data Source:** `azurerm_api_management_api_version_set` ([#5470](https://github.com/hashicorp/terraform-provider-azurerm/issues/5470))\n* **New Resource:** `azurerm_dedicated_host` ([#5513](https://github.com/hashicorp/terraform-provider-azurerm/issues/5513))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to `v38.1.0` of `github.com/Azure/azure-sdk-for-go` ([#5385](https://github.com/hashicorp/terraform-provider-azurerm/issues/5385))\n* frontdoor: updating to use API version `2019-11-01` ([#5385](https://github.com/hashicorp/terraform-provider-azurerm/issues/5385))\n* `azurerm_application_insights` - add support for `retention_in_days` ([#5457](https://github.com/hashicorp/terraform-provider-azurerm/issues/5457))\n* `azurerm_batch_pool` - support for the `network_configuration` property ([#5392](https://github.com/hashicorp/terraform-provider-azurerm/issues/5392))\n* `azurerm_cosmosdb_account` - support for the `EnableMongo` capability ([#5325](https://github.com/hashicorp/terraform-provider-azurerm/issues/5325))\n* `azurerm_cosmosdb_account` - support for the `Parse` kind ([#5453](https://github.com/hashicorp/terraform-provider-azurerm/issues/5453))\n* `azurerm_cosmosdb_sql_container` - support for `default_ttl` property ([#5492](https://github.com/hashicorp/terraform-provider-azurerm/issues/5492))\n* `azurerm_databricks_workspace` - support for the `custom_parameters` property and `public_subnet_name`, `private_subnet_name`, and `virtual_network_id` parameters ([#3889](https://github.com/hashicorp/terraform-provider-azurerm/issues/3889))\n* `azurerm_databricks_workspace` - support for the `no_public_ip` custom parameter ([#5469](https://github.com/hashicorp/terraform-provider-azurerm/issues/5469))\n* `azurerm_express_route_circuit` - support for the `Basic` and `Local` tiers ([#5456](https://github.com/hashicorp/terraform-provider-azurerm/issues/5456))\n* `azurerm_frontdoor_firewall_policy` - support for exclusions ([#5407](https://github.com/hashicorp/terraform-provider-azurerm/issues/5407))\n* `azurerm_iothub` - support for the `event_hub_retention_in_days` and `event_hub_partition_count` properties ([#5505](https://github.com/hashicorp/terraform-provider-azurerm/issues/5505))\n* `azurerm_kubernetes_cluster` - Add support for `load_balancer_profile` ([#5394](https://github.com/hashicorp/terraform-provider-azurerm/issues/5394))\n* `azurerm_network_watcher_flow_log` - support for the `version` property ([#5419](https://github.com/hashicorp/terraform-provider-azurerm/issues/5419))\n* `azurerm_traffic_manager_profile` - add the `expected_status_code_ranges` ([#5471](https://github.com/hashicorp/terraform-provider-azurerm/issues/5471))\n* `azurerm_traffic_manager_profile` - switch `dns_config` and `monitor_config` to type list and limit to `1` ([#5471](https://github.com/hashicorp/terraform-provider-azurerm/issues/5471))\n* `azurerm_kubernetes_cluster` - support updating AKS Microsoft Entra RBAC profile without rebuilding cluster ([#5410](https://github.com/hashicorp/terraform-provider-azurerm/issues/5410))\n\nBUG FIXES:\n\n* `azurerm_app_service` - fixing a crash when `logs` was nil ([#5414](https://github.com/hashicorp/terraform-provider-azurerm/issues/5414))\n* `azurerm_container_group` - fixing a crash when `IPAddress.Ports` was nil in the response from the Azure API ([#5415](https://github.com/hashicorp/terraform-provider-azurerm/issues/5415))\n* `azurerm_frontdoor` - fixing issue where the `forwarding_configuration` cache could not be disabled ([#5358](https://github.com/hashicorp/terraform-provider-azurerm/issues/5358))\n* `azurerm_postgresql_server` - correctly validate the `name` property ([#5443](https://github.com/hashicorp/terraform-provider-azurerm/issues/5443))\n* `azurerm_postgresql_database` - correctly validate the `server_name` property ([#5443](https://github.com/hashicorp/terraform-provider-azurerm/issues/5443))\n* `azurerm_postgresql_firewall` - correctly validate the `server_name` property ([#5443](https://github.com/hashicorp/terraform-provider-azurerm/issues/5443))\n* `azurerm_postgresql_virtual_network_rule` - correctly validate the `server_name` property ([#5443](https://github.com/hashicorp/terraform-provider-azurerm/issues/5443))\n* `azurerm_private_link_service` - fixing a crash when the `auto_approval` and `visibility` blocks aren't returned from the Azure API ([#5428](https://github.com/hashicorp/terraform-provider-azurerm/issues/5428))\n* `azurerm_subnet` - the`delegations.#.actions` property is now computed to accommodate azure defaults ([#5484](https://github.com/hashicorp/terraform-provider-azurerm/issues/5484))\n* `azurerm_virtual_machine` - will no longer panic if `network_interface_ids` is missing ([#5413](https://github.com/hashicorp/terraform-provider-azurerm/issues/5413))\n\n## 1.41.0 (January 16, 2020)\n\nNOTES:\n\n* `azurerm_managed_disk` - the Azure API now requires that the `storage_account_id` field is specified during import, as such this field is now required during when importing a VHD to a Managed Disk ([#5250](https://github.com/hashicorp/terraform-provider-azurerm/issues/5250))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_dedicated_host_group` ([#5307](https://github.com/hashicorp/terraform-provider-azurerm/issues/5307))\n* **New Data Source:** `azurerm_disk_encryption_set` ([#5249](https://github.com/hashicorp/terraform-provider-azurerm/issues/5249))\n* **New Data Source:** `azurerm_eventgrid_topic` ([#5367](https://github.com/hashicorp/terraform-provider-azurerm/issues/5367))\n* **New Data Source:** `azurerm_iothub_dps` ([#5336](https://github.com/hashicorp/terraform-provider-azurerm/issues/5336))\n* **New Data Source:** `azurerm_iothub_shared_access_policy` ([#5368](https://github.com/hashicorp/terraform-provider-azurerm/issues/5368))\n* **New Data Source:** `azurerm_storage_container` ([#5374](https://github.com/hashicorp/terraform-provider-azurerm/issues/5374))\n* **New Resource:** `azurerm_api_management_identity_provider_facebook` ([#5346](https://github.com/hashicorp/terraform-provider-azurerm/issues/5346))\n* **New Resource:** `azurerm_api_management_identity_provider_twitter` ([#5306](https://github.com/hashicorp/terraform-provider-azurerm/issues/5306))\n* **New Resource:** `azurerm_api_management_identity_provider_microsoft` ([#5369](https://github.com/hashicorp/terraform-provider-azurerm/issues/5369))\n* **New Resource:** `azurerm_cosmosdb_gremlin_graph` ([#5301](https://github.com/hashicorp/terraform-provider-azurerm/issues/5301))\n* **New Resource:** `azurerm_dedicated_host_group` ([#5307](https://github.com/hashicorp/terraform-provider-azurerm/issues/5307))\n* **New Resource:** `azurerm_disk_encryption_set` ([#5249](https://github.com/hashicorp/terraform-provider-azurerm/issues/5249))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to `v38.0.0` of github.com/Azure/azure-sdk-for-go ([#5335](https://github.com/hashicorp/terraform-provider-azurerm/issues/5335 ))\n* backup: updating to use API version `2019-05-13` ([#5335 ](https://github.com/hashicorp/terraform-provider-azurerm/issues/5335))\n* Data Source: `azurerm_managed_disk` - exposing `disk_encryption_set_id` ([#5250](https://github.com/hashicorp/terraform-provider-azurerm/issues/5250))\n* Data Source: `azurerm_managed_disk` - exposing `storage_account_id` ([#5250](https://github.com/hashicorp/terraform-provider-azurerm/issues/5250))\n* `azurerm_cognitive_account` - the `sku` block has been deprecated in favour of the `sku_name` property ([#5380](https://github.com/hashicorp/terraform-provider-azurerm/issues/5380))\n* `azurerm_devspace_controller` - the `sku` block has been deprecated in favour of the `sku_name` property ([#5379](https://github.com/hashicorp/terraform-provider-azurerm/issues/5379))\n* `azurerm_batch_pool` - support for the `metadata` property ([#5309](https://github.com/hashicorp/terraform-provider-azurerm/issues/5309))\n* `azurerm_function_app` - convert `connection_string`s from a `TypeList` to a `TypeSet` ([#5319](https://github.com/hashicorp/terraform-provider-azurerm/issues/5319))\n* `azurerm_iothub` - deprecate the `sku.tier` property as it is no longer required ([#5382](https://github.com/hashicorp/terraform-provider-azurerm/issues/5382))\n* `azurerm_iothub` - add an upper range of `200` to the `sku.capacity` validation ([#5382](https://github.com/hashicorp/terraform-provider-azurerm/issues/5382))\n* `azurerm_iothub_dps` - deprecate the `sku.tier` property as it is no longer required ([#5382](https://github.com/hashicorp/terraform-provider-azurerm/issues/5382))\n* `azurerm_iothub_dps` - add an upper range of `200` to the `sku.capacity` validation ([#5382](https://github.com/hashicorp/terraform-provider-azurerm/issues/5382))\n* `azurerm_lb_rule` - support for the `enable_tcp_reset` property ([#5373](https://github.com/hashicorp/terraform-provider-azurerm/issues/5373))\n* `azurerm_lb_nat_rule` -  support for the `enable_tcp_reset` and `idle_timeout_in_minutes` properties ([#5373](https://github.com/hashicorp/terraform-provider-azurerm/issues/5373))\n* `azurerm_managed_disk` - support for configuring `disk_encryption_set_id` ([#5250](https://github.com/hashicorp/terraform-provider-azurerm/issues/5250))\n* `azurerm_managed_disk` - support for configuring `storage_account_id` which is now required by the Azure API during an import ([#5250](https://github.com/hashicorp/terraform-provider-azurerm/issues/5250))\n* `azurerm_mariadb_server` - the `sku` block has been deprecated in favour of the `sku_name` property ([#5378](https://github.com/hashicorp/terraform-provider-azurerm/issues/5378))\n* `azurerm_mysql_server` - the `sku` block has been deprecated in favour of the `sku_name` property ([#5377](https://github.com/hashicorp/terraform-provider-azurerm/issues/5377))\n* `azurerm_postgresql_server` - the `sku` block has been deprecated in favour of the `sku_name` property ([#5376](https://github.com/hashicorp/terraform-provider-azurerm/issues/5376))\n\nBUG FIXES:\n\n* `azurerm_api_management_operation` - will no longer panic on missing values in `request` ([#5318](https://github.com/hashicorp/terraform-provider-azurerm/issues/5318))\n* `azurerm_storage_account` - fix performance issue for accounts that don't support queues ([#5316](https://github.com/hashicorp/terraform-provider-azurerm/issues/5316))\n\n## 1.40.0 (January 08, 2020)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_netapp_volume` ([#4933](https://github.com/hashicorp/terraform-provider-azurerm/issues/4933))\n* **New Data Source:** `azurerm_netapp_snapshot` ([#5215](https://github.com/hashicorp/terraform-provider-azurerm/issues/5215))\n* **New Data Source:** `azurerm_signalr_service` ([#5276](https://github.com/hashicorp/terraform-provider-azurerm/issues/5276))\n* **New Resource:** `azurerm_advanced_threat_protection` ([#4848](https://github.com/hashicorp/terraform-provider-azurerm/issues/4848))\n* **New Resource:** `azurerm_api_management_diagnostic ` ([#4836](https://github.com/hashicorp/terraform-provider-azurerm/issues/4836))\n* **New Resource:** `azurerm_api_management_identity_provider_aad` ([#5268](https://github.com/hashicorp/terraform-provider-azurerm/issues/5268))\n* **New Resource:** `azurerm_api_management_identity_provider_google` ([#5279](https://github.com/hashicorp/terraform-provider-azurerm/issues/5279))\n* **New Resource:** `azurerm_app_service_virtual_network_swift_connection` ([#5214](https://github.com/hashicorp/terraform-provider-azurerm/issues/5214))\n* **New Resource:** `azurerm_automation_certificate` ([#4785](https://github.com/hashicorp/terraform-provider-azurerm/issues/4785))\n* **New Resource:** `azurerm_backup_container_storage_account` ([#5213](https://github.com/hashicorp/terraform-provider-azurerm/issues/5213))\n* **New Resource:** `azurerm_backup_policy_file_share` ([#5213](https://github.com/hashicorp/terraform-provider-azurerm/issues/5213))\n* **New Resource:** `azurerm_backup_protected_file_share` ([#5213](https://github.com/hashicorp/terraform-provider-azurerm/issues/5213))\n* **New Resource:** `azurerm_cosmosdb_gremlin_database` ([#5248](https://github.com/hashicorp/terraform-provider-azurerm/issues/5248))\n* **New Resource:** `azurerm_iothub_dps_shared_access_policy` ([#5171](https://github.com/hashicorp/terraform-provider-azurerm/issues/5171))\n* **New Resource:** `azurerm_kusto_database_principal` ([#5242](https://github.com/hashicorp/terraform-provider-azurerm/issues/5242))\n* **New Resource:** `azurerm_network_watcher_flow_log` ([#5059](https://github.com/hashicorp/terraform-provider-azurerm/issues/5059))\n* **New Resource:** `azurerm_netapp_volume` ([#4933](https://github.com/hashicorp/terraform-provider-azurerm/issues/4933))\n* **New Resource:** `azurerm_netapp_snapshot` ([#5215](https://github.com/hashicorp/terraform-provider-azurerm/issues/5215))\n* **New Resource:** `azurerm_stream_analytics_reference_input_blob` ([#3633](https://github.com/hashicorp/terraform-provider-azurerm/issues/3633))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_private_link_service` - exposing the `enable_proxy_protocol` property  ([#5178](https://github.com/hashicorp/terraform-provider-azurerm/issues/5178))\n* Data Source: `azurerm_virtual_network_gateway` - exposing the `generation` property ([#5198](https://github.com/hashicorp/terraform-provider-azurerm/issues/5198))\n* `azurerm_application_gateway` - support for the `trusted_root_certificate_names` property ([#5204](https://github.com/hashicorp/terraform-provider-azurerm/issues/5204))\n* `azurerm_api_management_operation` - will no longer panic when `response` is missing values ([#5273](https://github.com/hashicorp/terraform-provider-azurerm/issues/5273))\n* `azurerm_cosmosdb_cassandra_keyspace` - support for the `throughput` property ([#5203](https://github.com/hashicorp/terraform-provider-azurerm/issues/5203))\n* `azurerm_cosmosdb_sql_container` - support for the `throughput` property ([#5203](https://github.com/hashicorp/terraform-provider-azurerm/issues/5203))\n* `azurerm_cosmosdb_sql_database` - support for the `throughput` property ([#5203](https://github.com/hashicorp/terraform-provider-azurerm/issues/5203))\n* `azurerm_cosmosdb_table` - support for the `throughput` property ([#5203](https://github.com/hashicorp/terraform-provider-azurerm/issues/5203))\n* `azurerm_dns_a_record` - support for configuring `target_resource_id` ([#5218](https://github.com/hashicorp/terraform-provider-azurerm/issues/5218))\n* `azurerm_dns_aaaa_record` - support for configuring `target_resource_id` ([#5218](https://github.com/hashicorp/terraform-provider-azurerm/issues/5218))\n* `azurerm_dns_cname_record` - support for configuring `target_resource_id` ([#5218](https://github.com/hashicorp/terraform-provider-azurerm/issues/5218))\n* `azurerm_dns_mx_record` - the `name` property is now optional ([#5205](https://github.com/hashicorp/terraform-provider-azurerm/issues/5205))\n* `azurerm_function_app` - support for the `ftps_state` property ([#5169](https://github.com/hashicorp/terraform-provider-azurerm/issues/5169))\n* `azurerm_image` - support for configuring `hyper_v_generation` ([#4453](https://github.com/hashicorp/terraform-provider-azurerm/issues/4453))\n* `azurerm_iothub_dps_shared_access_policy` - support for the `primary_connection_string` & `secondary_connection_string` properties ([#5231](https://github.com/hashicorp/terraform-provider-azurerm/issues/5231))\n* `azurerm_key_vault` - the `network_acls` property is now computed ([#5207](https://github.com/hashicorp/terraform-provider-azurerm/issues/5207))\n* `azurerm_kubernetes_cluster` - support for the `identity` property ([#5168](https://github.com/hashicorp/terraform-provider-azurerm/issues/5168))\n* `azurerm_kubernetes_cluster` - support for private link ([#5161](https://github.com/hashicorp/terraform-provider-azurerm/issues/5161))\n* `azurerm_logic_app_trigger_recurrence` - support for the `start_time` property ([#5244](https://github.com/hashicorp/terraform-provider-azurerm/issues/5244))\n* `azurerm_private_link_service` - support for the `enable_proxy_protocol` property  ([#5178](https://github.com/hashicorp/terraform-provider-azurerm/issues/5178))\n* `azurerm_recovery_services_fabric` - has been deprecated and renamed to `\tazurerm_site_recovery_fabric` ([#5170](https://github.com/hashicorp/terraform-provider-azurerm/issues/5170))\n* `azurerm_recovery_network_mapping` - has been deprecated and renamed to `\tazurerm_site_recovery_network_mapping` ([#5170](https://github.com/hashicorp/terraform-provider-azurerm/issues/5170))\n* `azurerm_recovery_services_protection_container` - has been deprecated and renamed to `\tazurerm_site_recovery_protection_container` ([#5170](https://github.com/hashicorp/terraform-provider-azurerm/issues/5170))\n* `azurerm_recovery_services_protection_container_mapping` - has been deprecated and renamed to `azurerm_site_recovery_protection_container_mapping` ([#5170](https://github.com/hashicorp/terraform-provider-azurerm/issues/5170))\n* `azurerm_recovery_services_replication_policy` - has been deprecated and renamed to `azurerm_site_recovery_protection_policy` ([#5170](https://github.com/hashicorp/terraform-provider-azurerm/issues/5170))\n* `azurerm_recovery_replicated_vm` - has been deprecated and renamed to `azurerm_site_recovery_replicated_vm` ([#5170](https://github.com/hashicorp/terraform-provider-azurerm/issues/5170))\n* `azurerm_recovery_services_protection_policy_vm` - has been deprecated and renamed to `azurerm_backup_policy_vm` ([#5170](https://github.com/hashicorp/terraform-provider-azurerm/issues/5170))\n* `azurerm_recovery_services_protected_vm` - has been deprecated and renamed to `azurerm_backup_protected_vm` ([#5170](https://github.com/hashicorp/terraform-provider-azurerm/issues/5170))\n* `azurerm_search_service` - exposing the `query_keys` ([#5029](https://github.com/hashicorp/terraform-provider-azurerm/issues/5029))\n* `azurerm_storage_account`  - exposing the `blob_properties` block ([#3807](https://github.com/hashicorp/terraform-provider-azurerm/issues/3807))\n* `azurerm_storage_account` - correctly handle an empty network rules API response ([#5210](https://github.com/hashicorp/terraform-provider-azurerm/issues/5210))\n* `azurerm_storage_account` - making the resource group name case sensitive ([#5289](https://github.com/hashicorp/terraform-provider-azurerm/issues/5289))\n* `azurerm_shared_image_version` - support for the `storage_account_type` property ([#5212](https://github.com/hashicorp/terraform-provider-azurerm/issues/5212))\n* `azurerm_virtual_network_gateway` - support for configuring `generation` ([#5198](https://github.com/hashicorp/terraform-provider-azurerm/issues/5198))\n* `azurerm_virtual_network_gateway_connection` - support for the `connection_protocol` property ([#5145](https://github.com/hashicorp/terraform-provider-azurerm/issues/5145))\n\nBUG FIXES:\n\n* Data Source: `azurerm_shared_image_version` - change the `storage_account_type` property from a set to a list ([#5212](https://github.com/hashicorp/terraform-provider-azurerm/issues/5212))\n* `azurerm_api_management_api` - working around a behavioural change in the API detecting deleted resources ([#5054](https://github.com/hashicorp/terraform-provider-azurerm/issues/5054))\n* `azurerm_api_management_api` - correctly setting the soap API type when `soap_pass_through` is true ([#5081](https://github.com/hashicorp/terraform-provider-azurerm/issues/5081))\n* `azurerm_app_configuration` - temporarily treating `resource_group_name` as case-insensitive to work around a breaking API change ([#5324](https://github.com/hashicorp/terraform-provider-azurerm/issues/5324))\n* `azurerm_healthcare_service` - making rhe `cors_configuration` block computed ([#5046](https://github.com/hashicorp/terraform-provider-azurerm/issues/5046))\n* `azurerm_monitor_log_profile` - polling until the log profile is repeatedly available ([#5194](https://github.com/hashicorp/terraform-provider-azurerm/issues/5194))\n* `azurerm_storage_account_network_rules` - matching the validation used for `ip_rules ` with the validation used by `ip_rules ` in the `network_rules` block of `azurerm_storage_account` ([#5201](https://github.com/hashicorp/terraform-provider-azurerm/issues/5201))\n* `azurerm_subnet` - allowing both `enforce_private_link_endpoint_network_policies` and `enforce_private_link_service_network_policies` to be set together ([#5200](https://github.com/hashicorp/terraform-provider-azurerm/issues/5200))\n* `azurerm_virtual_machine` - handling a crash when `os_profile_secrets` was nil ([#5308](https://github.com/hashicorp/terraform-provider-azurerm/issues/5308))\n* `azurerm_virtual_machine` - handling a crash when the `vault_certificates` block within the `os_profile_secrets` was nil ([#5308](https://github.com/hashicorp/terraform-provider-azurerm/issues/5308))\n\n## 1.39.0 (December 16, 2019)\n\nFEATURES: \n\n* **New Resource:** `azurerm_app_configuration` ([#4859](https://github.com/hashicorp/terraform-provider-azurerm/issues/4859))\n* **New Resource:** `azurerm_bot_channel_ms_teams` ([#4984](https://github.com/hashicorp/terraform-provider-azurerm/issues/4984))\n* **New Resource:** `azurerm_mssql_database_vulnerability_assessment_rule_baseline` ([#3806](https://github.com/hashicorp/terraform-provider-azurerm/issues/3806))\n* **New Resource:** `azurerm_mssql_server_vulnerability_assessment` ([#3806](https://github.com/hashicorp/terraform-provider-azurerm/issues/3806))\n* **New Resource:** `azurerm_mssql_server_security_alert_policy` ([#3806](https://github.com/hashicorp/terraform-provider-azurerm/issues/3806))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to `v0.7.1` of github.com/tombuildsstuff/giovanni ([#5143](https://github.com/hashicorp/terraform-provider-azurerm/issues/5143))\n* storage: switching to use the Authorizers from Azure/go-autorest ([#5109](https://github.com/hashicorp/terraform-provider-azurerm/issues/5109))\n* `azurerm_app_service` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_app_service_certificate` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_app_service_custom_hostname_binding` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_app_service_plan` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_app_service_slot` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_app_service_source_control_token` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_cosmos_mongo_collection` - deprecate the `indexes` property ([#5116](https://github.com/hashicorp/terraform-provider-azurerm/issues/5116))\n* `azurerm_cosmos_mongo_collection` - make throughput computed and remove the default to let the API handel it ([#5116](https://github.com/hashicorp/terraform-provider-azurerm/issues/5116))\n* `azurerm_cosmos_mongo_database` - support for the `throughput` property ([#5116](https://github.com/hashicorp/terraform-provider-azurerm/issues/5116))\n* `azurerm_function_app` - support for `min_tls_version` ([#5074](https://github.com/hashicorp/terraform-provider-azurerm/issues/5074))\n* `azurerm_private_link_endpoint` - has been deprecated and renamed to `azurerm_private_endpoint` ([#5150](https://github.com/hashicorp/terraform-provider-azurerm/issues/5150))\n\nBUG FIXES:\n\n* Data Source: `azurerm_nat_gateway` - handling a crash when the `sku` block was malformed ([#5104](https://github.com/hashicorp/terraform-provider-azurerm/issues/5104))\n* `azurerm_api_management_api` - ensuring `version_set_id` is specified when `version` is ([#4993](https://github.com/hashicorp/terraform-provider-azurerm/issues/4993))\n* `azurerm_nat_gateway` - handling a crash when the `sku` block was malformed ([#5104](https://github.com/hashicorp/terraform-provider-azurerm/issues/5104))\n* `azurerm_private_link_endpoint` - fixing the validation for the `subresource_names` field ([#5118](https://github.com/hashicorp/terraform-provider-azurerm/issues/5118))\n* `azurerm_storage_account` - querying all pages when listing storage accounts ([#5075](https://github.com/hashicorp/terraform-provider-azurerm/issues/5075))\n* `azurerm_storage_blob` - querying all pages when listing storage accounts ([#5075](https://github.com/hashicorp/terraform-provider-azurerm/issues/5075))\n* `azurerm_storage_container` - querying all pages when listing storage accounts ([#5075](https://github.com/hashicorp/terraform-provider-azurerm/issues/5075))\n* `azurerm_storage_file` - querying all pages when listing storage accounts ([#5075](https://github.com/hashicorp/terraform-provider-azurerm/issues/5075))\n* `azurerm_storage_queue` - querying all pages when listing storage accounts ([#5075](https://github.com/hashicorp/terraform-provider-azurerm/issues/5075))\n* `azurerm_storage_table` - querying all pages when listing storage accounts ([#5075](https://github.com/hashicorp/terraform-provider-azurerm/issues/5075))\n\n## 1.38.0 (December 06, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_nat_gateway` ([#4449](https://github.com/hashicorp/terraform-provider-azurerm/issues/4449))\n* **New Data Source:** `azurerm_private_link_endpoint_connection` ([#4493](https://github.com/hashicorp/terraform-provider-azurerm/issues/4493))\n* **New Data Source:** `azurerm_virtual_hub` ([#5004](https://github.com/hashicorp/terraform-provider-azurerm/issues/5004))\n* **New Resource:** `azurerm_iothub_fallback_route` ([#4965](https://github.com/hashicorp/terraform-provider-azurerm/issues/4965))\n* **New Resource:** `azurerm_nat_gateway` ([#4449](https://github.com/hashicorp/terraform-provider-azurerm/issues/4449))\n* **New Resource:** `azurerm_point_to_site_vpn_gateway` ([#5004](https://github.com/hashicorp/terraform-provider-azurerm/issues/5004))\n* **New Resource:** `azurerm_private_dns_mx_record` ([#4915](https://github.com/hashicorp/terraform-provider-azurerm/issues/4915))\n* **New Resource:** `azurerm_private_link_endpoint` ([#4493](https://github.com/hashicorp/terraform-provider-azurerm/issues/4493))\n* **New Resource:** `azurerm_storage_account_network_rules` ([#5082](https://github.com/hashicorp/terraform-provider-azurerm/issues/5082))\n* **New Resource:** `azurerm_subnet_nat_gateway_association` ([#4449](https://github.com/hashicorp/terraform-provider-azurerm/issues/4449))\n* **New Resource:** `azurerm_virtual_hub` ([#5004](https://github.com/hashicorp/terraform-provider-azurerm/issues/5004))\n* **New Resource:** `azurerm_vpn_gateway` ([#5004](https://github.com/hashicorp/terraform-provider-azurerm/issues/5004))\n* **New Resource:** `azurerm_vpn_server_configuration` ([#5004](https://github.com/hashicorp/terraform-provider-azurerm/issues/5004))\n\nIMPROVEMENTS:\n\n* network: updating to use API version `2019-09-01` ([#5004](https://github.com/hashicorp/terraform-provider-azurerm/issues/5004))\n* `azurerm_application_gateway` - updating the validation for `min_capacity` and `max_capacity` within the `autoscale_configuration` block ([#4958](https://github.com/hashicorp/terraform-provider-azurerm/issues/4958))\n* `azurerm_application_gateway` - fixes a crash when an empty body for probe match was used ([#5056](https://github.com/hashicorp/terraform-provider-azurerm/issues/5056))\n* `azurerm_dns_a_record` - exposing the `fqdn` ([#5000](https://github.com/hashicorp/terraform-provider-azurerm/issues/5000))\n* `azurerm_dns_aaaa_record` - exposing the `fqdn` ([#5000](https://github.com/hashicorp/terraform-provider-azurerm/issues/5000))\n* `azurerm_dns_caa_record` - exposing the `fqdn` ([#5000](https://github.com/hashicorp/terraform-provider-azurerm/issues/5000))\n* `azurerm_dns_cname_record` - exposing the `fqdn` ([#5000](https://github.com/hashicorp/terraform-provider-azurerm/issues/5000))\n* `azurerm_dns_mx_record` - exposing the `fqdn` ([#5000](https://github.com/hashicorp/terraform-provider-azurerm/issues/5000))\n* `azurerm_dns_ns_record` - exposing the `fqdn` ([#5000](https://github.com/hashicorp/terraform-provider-azurerm/issues/5000))\n* `azurerm_dns_ptr_record` - exposing the `fqdn` ([#5000](https://github.com/hashicorp/terraform-provider-azurerm/issues/5000))\n* `azurerm_dns_srv_record` - exposing the `fqdn` ([#5000](https://github.com/hashicorp/terraform-provider-azurerm/issues/5000))\n* `azurerm_dns_txt_record` - exposing the `fqdn` ([#5000](https://github.com/hashicorp/terraform-provider-azurerm/issues/5000))\n* `azurerm_mysql_server` - add support for version 8.0 ([#5019](https://github.com/hashicorp/terraform-provider-azurerm/issues/5019))\n\nBUG FIXES:\n\n* `azurerm_mssql_elasticpool` - no longer panicing when `sku` is nil ([#5017](https://github.com/hashicorp/terraform-provider-azurerm/issues/5017))\n* `azurerm_storage_account` - ensuring we only lock each Virtual Network once during deletion ([#4908](https://github.com/hashicorp/terraform-provider-azurerm/issues/4908))\n* `azurerm_virtual_wan` - deprecating the `security_provider_name` field since it's no longer used ([#5004](https://github.com/hashicorp/terraform-provider-azurerm/issues/5004))\n\n## 1.37.0 (November 26, 2019)\n\nNOTES\n\nThe `azurerm_kubernetes_cluster` resource has undergone substantial changes in this release to work around breaking behavioural changes in the Azure API. As such the `agent_pool_profile` block has been superseded by the `default_node_pool` block. Multiple Node Pools can instead be configured using the `azurerm_kubernetes_cluster_node_pool` resource.\n\nFEATURES:\n* **New Data Source:** `azurerm_automation_account` ([#4740](https://github.com/hashicorp/terraform-provider-azurerm/issues/4740))\n* **New Data Source:** `azurerm_netapp_account` ([#4416](https://github.com/hashicorp/terraform-provider-azurerm/issues/4416))\n* **New Data Source:** `azurerm_netapp_pool` ([#4889](https://github.com/hashicorp/terraform-provider-azurerm/issues/4889))\n* **New Data Source:** `azurerm_private_link_service` ([#4426](https://github.com/hashicorp/terraform-provider-azurerm/issues/4426))\n* **New Data Source:** `azurerm_private_link_service_endpoint_connections` ([#4426](https://github.com/hashicorp/terraform-provider-azurerm/issues/4426))\n* **New Resource:** `azurerm_data_factory_trigger_schedule` ([#4793](https://github.com/hashicorp/terraform-provider-azurerm/issues/4793))\n* **New Resource:** `azurerm_iothub_endpoint_eventhub` ([#4823](https://github.com/hashicorp/terraform-provider-azurerm/issues/4823))\n* **New Resource:** `azurerm_iothub_endpoint_servicebus_queue` ([#4823](https://github.com/hashicorp/terraform-provider-azurerm/issues/4823))\n* **New Resource:** `azurerm_iothub_endpoint_servicebus_topic` ([#4823](https://github.com/hashicorp/terraform-provider-azurerm/issues/4823))\n* **New Resource:** `azurerm_iothub_endpoint_storage_container` ([#4823](https://github.com/hashicorp/terraform-provider-azurerm/issues/4823))\n* **New Resource:** `azurerm_iothub_route` ([#4923](https://github.com/hashicorp/terraform-provider-azurerm/issues/4923))\n* **New Resource:** `azurerm_kubernetes_cluster_node_pool` ([#4899](https://github.com/hashicorp/terraform-provider-azurerm/issues/4899))\n* **New Resource:** `azurerm_netapp_account` ([#4416](https://github.com/hashicorp/terraform-provider-azurerm/issues/4416))\n* **New Resource:** `azurerm_netapp_pool` ([#4889](https://github.com/hashicorp/terraform-provider-azurerm/issues/4889))\n* **New Resource:** `azurerm_private_dns_aaaa_record` ([#4841](https://github.com/hashicorp/terraform-provider-azurerm/issues/4841))\n* **New Resource:** `azurerm_private_dns_ptr_record` ([#4703](https://github.com/hashicorp/terraform-provider-azurerm/issues/4703))\n* **New Resource:** `azurerm_private_dns_srv_record` ([#4783](https://github.com/hashicorp/terraform-provider-azurerm/issues/4783))\n* **New Resource:** `azurerm_private_link_service` ([#4426](https://github.com/hashicorp/terraform-provider-azurerm/issues/4426))\n* **New Resource:** `azurerm_relay_hybrid_connection` ([#4832](https://github.com/hashicorp/terraform-provider-azurerm/issues/4832))\n\nIMPROVEMENTS:\n\n* 2.0 prep: refresh functions now use custom timeouts when custom timeouts are enabled ([#4838](https://github.com/hashicorp/terraform-provider-azurerm/issues/4838))\n* authentication: requesting a fresh token from the Azure CLI when the existing one expires ([#4775](https://github.com/hashicorp/terraform-provider-azurerm/issues/4775))\n* dependencies: updating `github.com/Azure/azure-sdk-for-go` to `v36.3.0` ([#4913](https://github.com/hashicorp/terraform-provider-azurerm/issues/4913))\n* dependencies: updating `github.com/Azure/go-autorest` to `v0.9.2` ([#4775](https://github.com/hashicorp/terraform-provider-azurerm/issues/4775))\n* dependencies: updating `github.com/hashicorp/go-azure-helpers` to `v0.10.0` ([#4775](https://github.com/hashicorp/terraform-provider-azurerm/issues/4775))\n* networking: updating to API version `2019-07-01` ([#4596](https://github.com/hashicorp/terraform-provider-azurerm/issues/4596))\n* sql: updating to API version `2017-03-01-preview` ([#4242](https://github.com/hashicorp/terraform-provider-azurerm/issues/4242))\n* Data Source: `azurerm_monitor_action_group` - support for `arm_role_receiver`, `automation_runbook_receiver`, `azure_app_push_receiver`, `azure_function_receiver`, `itsm_receiver`, `logic_app_receiver` and `voice_receiver` ([#4638](https://github.com/hashicorp/terraform-provider-azurerm/issues/4638))\n* `azurerm_api_management_api` - the `version` and `version_set_id` properties can now be set ([#4592](https://github.com/hashicorp/terraform-provider-azurerm/issues/4592))\n* `azurerm_app_service` - support for `JAVA` container  ([#4897](https://github.com/hashicorp/terraform-provider-azurerm/issues/4897))\n* `azurerm_app_service` - support for configuring the minor version of Java ([#4779](https://github.com/hashicorp/terraform-provider-azurerm/issues/4779))\n* `azurerm_app_service_slot` - support for `auto_swap_slot_name` ([#4752](https://github.com/hashicorp/terraform-provider-azurerm/issues/4752))\n* `azurerm_app_service_slot` - support for configuring the minor version of Java ([#4779](https://github.com/hashicorp/terraform-provider-azurerm/issues/4779))\n* `azurerm_application_insights` - support for the `sampling_percentage` property ([#4925](https://github.com/hashicorp/terraform-provider-azurerm/issues/4925))\n* `azurerm_automation_credential` - deprecate `account_name` in favour of `automation_account_name` ([#4777](https://github.com/hashicorp/terraform-provider-azurerm/issues/4777))\n* `azurerm_cognitive_service` - support for the kind `LUIS.Authoring` ([#4888](https://github.com/hashicorp/terraform-provider-azurerm/issues/4888))\n* `azurerm_eventgrid_domain` - Export `primary_access_key` and `secondary_access_key` ([#4876](https://github.com/hashicorp/terraform-provider-azurerm/issues/4876))\n* `azurerm_firewall` - allow multiple `ip_configuration` blocks ([#4639](https://github.com/hashicorp/terraform-provider-azurerm/issues/4639))\n* `azurerm_firewall_application_rule_collection` - support for the protocol type `Mssql` ([#4596](https://github.com/hashicorp/terraform-provider-azurerm/issues/4596))\n* `azurerm_hdinsight_hadoop_cluster` - Added edge node support ([#4550](https://github.com/hashicorp/terraform-provider-azurerm/issues/4550))\n* `azurerm_hdinsight_hadoop_cluster` - support for gen `storage_account_gen2` property ([#4634](https://github.com/hashicorp/terraform-provider-azurerm/issues/4634))\n* `azurerm_hdinsight_hbase_cluster` - support for gen `storage_account_gen2` property ([#4634](https://github.com/hashicorp/terraform-provider-azurerm/issues/4634))\n* `azurerm_hdinsight_kafka_cluster` - support for gen `storage_account_gen2` property ([#4634](https://github.com/hashicorp/terraform-provider-azurerm/issues/4634))\n* `azurerm_hdinsight_query_cluster` - support for gen `storage_account_gen2` property ([#4634](https://github.com/hashicorp/terraform-provider-azurerm/issues/4634))\n* `azurerm_hdinsight_spark_cluster` - support for the `storage_account_gen2` property ([#4634](https://github.com/hashicorp/terraform-provider-azurerm/issues/4634))\n* `azurerm_iot_dps` - has been deprecated and renamed to `azurerm_iothub_dps` ([#4896](https://github.com/hashicorp/terraform-provider-azurerm/issues/4896))\n* `azurerm_iot_dps_certificate` - has been deprecated and renamed to `azurerm_iothub_dps_certificate` ([#4896](https://github.com/hashicorp/terraform-provider-azurerm/issues/4896))\n* `azurerm_key_vault_secret` - support for `not_before_date` and `expiration_date` ([#4873](https://github.com/hashicorp/terraform-provider-azurerm/issues/4873))\n* `azurerm_kubernetes_cluster` - introducing a new `default_node_pool` block which defaults to VM Scale Sets ([#4898](https://github.com/hashicorp/terraform-provider-azurerm/issues/4898))\n* `azurerm_kubernetes_cluster` - deprecating the `agent_pool_profiles` block in favour of the `default_node_pool` block ([#4898](https://github.com/hashicorp/terraform-provider-azurerm/issues/4898))\n* `azurerm_kubernetes_cluster` - support for `enable_node_public_ip` in `agent_pool_profile` ([#4613](https://github.com/hashicorp/terraform-provider-azurerm/issues/4613))\n* `azurerm_monitor_action_group` - support for `arm_role_receiver`, `automation_runbook_receiver`, `azure_app_push_receiver`, `azure_function_receiver`, `itsm_receiver`, `logic_app_receiver` and `voice_receiver` ([#4638](https://github.com/hashicorp/terraform-provider-azurerm/issues/4638))\n* `azurerm_monitor_activity_log_alert` - the `criteria` property now supports `ResourceHealth` ([#4944](https://github.com/hashicorp/terraform-provider-azurerm/issues/4944))\n* `azurerm_servicebus_subscription` - support for the `forward_dead_lettered_messages_to` property ([#4789](https://github.com/hashicorp/terraform-provider-azurerm/issues/4789))\n* `azurerm_signalr_service` - support for the `cors` and `features` blocks ([#4716](https://github.com/hashicorp/terraform-provider-azurerm/issues/4716))\n* `azurerm_sql_server` - support for the `identity` block ([#4754](https://github.com/hashicorp/terraform-provider-azurerm/issues/4754))\n* `azurerm_subnet` - support for the `enforce_private_link_service_network_policies` property ([#4426](https://github.com/hashicorp/terraform-provider-azurerm/issues/4426))\n* `azurerm_template_deployment` - validating the ARM Template prior to deploying it, which provides more granular errors ([#4715](https://github.com/hashicorp/terraform-provider-azurerm/issues/4715))\n\nBUG FIXES:\n\n* dependencies: temporarily switching to use a fork of github.com/Azure/azure-sdk-for-go to get around a build issue on 32-bit systems ([#4979](https://github.com/hashicorp/terraform-provider-azurerm/issues/4979))\n* Data Source: `azurerm_network_interface` - exporting the IP Address for Dynamic Network Interfaces ([#4852](https://github.com/hashicorp/terraform-provider-azurerm/issues/4852))\n* `azurerm_api_management_api_policy` - sending `policy` as Raw XML ([#4140](https://github.com/hashicorp/terraform-provider-azurerm/issues/4140))\n* `azurerm_bastion_host` - matching the validation for `name` used by Azure ([#4766](https://github.com/hashicorp/terraform-provider-azurerm/issues/4766))\n* `azurerm_bastion_host` - support for hyphens in the `name` field within the `ip_configuration` block ([#4814](https://github.com/hashicorp/terraform-provider-azurerm/issues/4814))\n* `azurerm_container_group` - prevent empty string from being passed into `commands` (#4953)\n* `azurerm_eventhub_namespace` - deprecating the `kafka_enabled` sproperty as it is now managed by Azure ([#4743](https://github.com/hashicorp/terraform-provider-azurerm/issues/4743))\n* `azurerm_kubernetes_cluster` - support for conditional updates / `ignore_changes` on the `node_count` field ([#4898](https://github.com/hashicorp/terraform-provider-azurerm/issues/4898))\n* `azurerm_kubernetes_cluster` - working around a case sensitivity bug when upgrading clusters via the Azure portal ([#4929](https://github.com/hashicorp/terraform-provider-azurerm/issues/4929))\n* `azurerm_lb_probe` - fixing a bug where `protocol` was force lower-cased which caused a diff in the plan ([#4631](https://github.com/hashicorp/terraform-provider-azurerm/issues/4631))\n* `azurerm_lb_rule` - fixing a bug where `protocol` was force lower-cased which caused a diff in the plan ([#4631](https://github.com/hashicorp/terraform-provider-azurerm/issues/4631))\n* `azurerm_network_interface` - exporting the IP Address for Dynamic Network Interfaces ([#4852](https://github.com/hashicorp/terraform-provider-azurerm/issues/4852))\n* `azurerm_postgresql_database` - allowing dashes in the name ([#4866](https://github.com/hashicorp/terraform-provider-azurerm/issues/4866))\n* `azurerm_private_dns_cname_record` - fixing a bug where calling `Delete` didn't delete the CName record ([#4804](https://github.com/hashicorp/terraform-provider-azurerm/issues/4804))\n* `azurerm_storage_account` - fixing an error where Advanced Threat Protection is unavailable in Azure Germany ([#4746](https://github.com/hashicorp/terraform-provider-azurerm/issues/4746))\n* `azurerm_virtual_network_gateway_connection` - Configure `routing_weight` with weight `0` ([#4849](https://github.com/hashicorp/terraform-provider-azurerm/issues/4849))\n\n## 1.36.1 (October 29, 2019)\n\nFEATURES:\n\n* provider: adding a flag to allow users to opt-out of the default Terraform Partner ID ([#4751](https://github.com/hashicorp/terraform-provider-azurerm/issues/4751))\n\n## 1.36.0 (October 29, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_app_service_certificate_order` ([#4454](https://github.com/hashicorp/terraform-provider-azurerm/issues/4454))\n* **New Data Source:** `azurerm_data_factory` ([#4517](https://github.com/hashicorp/terraform-provider-azurerm/issues/4517))\n* **New Data Source:** `azurerm_healthcare_service` ([#4221](https://github.com/hashicorp/terraform-provider-azurerm/issues/4221))\n* **New Data Source:** `azurerm_resources` ([#3529](https://github.com/hashicorp/terraform-provider-azurerm/issues/3529))\n* **New Data Source:** `azurerm_postgresql_server` ([#4732](https://github.com/hashicorp/terraform-provider-azurerm/issues/4732))\n* **New Resource:** `azurerm_automation_job_schedule` ([#3386](https://github.com/hashicorp/terraform-provider-azurerm/issues/3386))\n* **New Resource:** `azurerm_app_service_certificate_order` ([#4454](https://github.com/hashicorp/terraform-provider-azurerm/issues/4454))\n* **New Resource:** `azurerm_bastion_host` ([#4096](https://github.com/hashicorp/terraform-provider-azurerm/issues/4096))\n* **New Resource:** `azurerm_data_factory_integration_runtime_managed` ([#4342](https://github.com/hashicorp/terraform-provider-azurerm/issues/4342))\n* **New Resource:** `azurerm_healthcare_service` ([#4221](https://github.com/hashicorp/terraform-provider-azurerm/issues/4221))\n* **New Resource:** `azurerm_kusto_eventhub_data_connection` ([#4385](https://github.com/hashicorp/terraform-provider-azurerm/issues/4385))\n\nIMPROVEMENTS:\n\n* 2.0 prep: groundwork required for custom timeouts ([#4475](https://github.com/hashicorp/terraform-provider-azurerm/issues/4475))\n* dependencies: updating to `v34.1.0` of `github.com/Azure/azure-sdk-for-go` ([#4609](https://github.com/hashicorp/terraform-provider-azurerm/issues/4609))\n* devspace: updating to API version `2019-04-01` ([#4597](https://github.com/hashicorp/terraform-provider-azurerm/issues/4597))\n* frontdoor: updating to use API version `2019-04-01` ([#4609](https://github.com/hashicorp/terraform-provider-azurerm/issues/4609))\n* provider: switching to use the Provider SDK from `github.com/hashicorp/terraform-provider-sdk` ([#4474](https://github.com/hashicorp/terraform-provider-azurerm/issues/4474))\n* provider: sending Microsoft's Terraform Partner ID in the user agent if a custom Partner ID isn’t specified ([#4663](https://github.com/hashicorp/terraform-provider-azurerm/issues/4663))\n* storage: caching the storage account information to workaround the Storage API being unperformant ([#4709](https://github.com/hashicorp/terraform-provider-azurerm/issues/4709))\n* Data Source: `azurerm_client_config` - fixing a crash when using MSI authentication ([#4738](https://github.com/hashicorp/terraform-provider-azurerm/issues/4738))\n* Data Source: `azurerm_lb_backend_address_pool` - exposing `backend_ip_configurations` ([#4605](https://github.com/hashicorp/terraform-provider-azurerm/issues/4605))\n* `azurerm_cognitive_account` - support for the sku `F1` ([#4720](https://github.com/hashicorp/terraform-provider-azurerm/issues/4720))\n* `azurerm_cosmosdb_mongo_collection` - add support for the `throughput` property ([#4467](https://github.com/hashicorp/terraform-provider-azurerm/issues/4467))\n* `azurerm_firewall` - support for `zones` ([#4670](https://github.com/hashicorp/terraform-provider-azurerm/issues/4670))\n* `azurerm_function_app` - add support for the `http2_enabled `property ([#4696](https://github.com/hashicorp/terraform-provider-azurerm/issues/4696))\n* `azurerm_frontdoor` - update `custom_host` to be optional, add `redirect_configuration` to documentation. ([#4601](https://github.com/hashicorp/terraform-provider-azurerm/issues/4601))\n* `azurerm_kubernetes_cluster` - allow the `aci_connector_linux` to be disabled by allowing the subnet property be empty ([#4541](https://github.com/hashicorp/terraform-provider-azurerm/issues/4541))\n* `azurerm_kubernetes_cluster` - add support for the `azure_policy` property in the `addon_profile` block ([#4498](https://github.com/hashicorp/terraform-provider-azurerm/issues/4498))\n* `azurerm_monitor_action_group` - add support for the `use_common_alert_schema` webhook property ([#4483](https://github.com/hashicorp/terraform-provider-azurerm/issues/4483))\n* `azurerm_network_security_rule` - add support for `Icmp` to the `protocol` property ([#4615](https://github.com/hashicorp/terraform-provider-azurerm/issues/4615))\n* `azurerm_network_security_rule` - add support for `Icmp` to the `protocol` property ([#4615](https://github.com/hashicorp/terraform-provider-azurerm/issues/4615))\n* `azurerm_servicebus_namespace` - allow `capacity` to `8` for the premium SKU ([#4630](https://github.com/hashicorp/terraform-provider-azurerm/issues/4630))\n* `azurerm_subnet` - add support for the `Microsoft.DBforPostgreSQL/serversv2` and `Microsoft.StreamAnalytics/streamingJobs` to the `service_delegation.name` property ([#4690](https://github.com/hashicorp/terraform-provider-azurerm/issues/4690))\n* `azurerm_subnet` - add support for the `Microsoft.Network/networkinterfaces/*` and `Microsoft.Network/virtualNetworks/subnets/unprepareNetworkPolicies/action` to the `service_delegation.action` property ([#4690](https://github.com/hashicorp/terraform-provider-azurerm/issues/4690))\n\nBUG FIXES:\n\n* `azurerm_api_management` - deprecate the `disable_backend_ssl30`, `disable_backend_tls10`, `disable_backend_tls11`, `disable_triple_des_ciphers`, `disable_frontend_ssl30`, `disable_frontend_tls10`, `disable_frontend_tls11` properties as `true` actually meant enable in favour of `enable_backend_ssl30`, `enable_backend_tls10`, `enable_backend_tls11`, `enable_triple_des_ciphers`, `enable_frontend_ssl30`, `enable_frontend_tls10`, `enable_frontend_tls11` ([#4534](https://github.com/hashicorp/terraform-provider-azurerm/issues/4534))\n* `azurerm_devspace_controller` - the `host_suffix` field is now read-only due to a change in Azure ([#4597](https://github.com/hashicorp/terraform-provider-azurerm/issues/4597))\n* `azurerm_key_vault_certificate` - switches the `emails`, `dns_names `, `upns` of the `subject_alternative_names` property to use `TypeSet` ([#4645](https://github.com/hashicorp/terraform-provider-azurerm/issues/4645))\n* `azurerm_kubernetes_cluster` - fixing a crash when the `service_principal_profile` block was nil ([#4697](https://github.com/hashicorp/terraform-provider-azurerm/issues/4697))\n* `azurerm_kubernetes_cluster` - the `log_analytics_workspace_id` property is now optional ([#4513](https://github.com/hashicorp/terraform-provider-azurerm/issues/4513))\n* `azurerm_key_vault` - temporarily making `sku` case insensitive to work around a breaking change in the API ([#4714](https://github.com/hashicorp/terraform-provider-azurerm/issues/4714))\n* `azurerm_management_group` - raising the error message when an error occurs ([#4725](https://github.com/hashicorp/terraform-provider-azurerm/issues/4725))\n* `azurerm_maps_account` - temporarily making `sku` case insensitive to work around a breaking change in the API ([#4714](https://github.com/hashicorp/terraform-provider-azurerm/issues/4714))\n* `azurerm_media_services_account` - fixes the `invalid address to set: []string{\"tags\"}` error ([#4537](https://github.com/hashicorp/terraform-provider-azurerm/issues/4537))\n* `azurerm_monitor_activity_log_alert` - fixing support for the category `ServiceHealth` ([#4646](https://github.com/hashicorp/terraform-provider-azurerm/issues/4646))\n* `azurerm_network_security_group_association` - prevent deadlock between association and network interface creation ([#4501](https://github.com/hashicorp/terraform-provider-azurerm/issues/4501))\n* `azurerm_sql_database` - ensure the `read_scale` property is always set during initial creation ([#4573](https://github.com/hashicorp/terraform-provider-azurerm/issues/4573))\n* `azurerm_storage_account` - Ignore Advanced Threat Protection read errors in Azure Germany ([#4564](https://github.com/hashicorp/terraform-provider-azurerm/issues/4564))\n* `azurerm_storage_blob` - making `metadata` a computed field ([#4727](https://github.com/hashicorp/terraform-provider-azurerm/issues/4727))\n* `azurerm_virtual_machine` - handling the `plan` block being nil ([#4712](https://github.com/hashicorp/terraform-provider-azurerm/issues/4712))\n* `azurerm_virtual_machine_data_disk_attachment` - will no longer remove the identity block when making an update ([#4538](https://github.com/hashicorp/terraform-provider-azurerm/issues/4538))\n\n## 1.35.0 (October 04, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_app_service_certificate` ([#4468](https://github.com/hashicorp/terraform-provider-azurerm/issues/4468))\n* **New Data Source:** `azurerm_public_ip_prefix` ([#4340](https://github.com/hashicorp/terraform-provider-azurerm/issues/4340))\n* **New Data Source:** `azurerm_storage_management_policy` ([#3819](https://github.com/hashicorp/terraform-provider-azurerm/issues/3819))\n* **New Resource:** `azurerm_bot_channel_slack` ([#4367](https://github.com/hashicorp/terraform-provider-azurerm/issues/4367))\n* **New Resource:** `azurerm_bot_channel_email` ([#4389](https://github.com/hashicorp/terraform-provider-azurerm/issues/4389))\n* **New Resource:** `azurerm_bot_web_app` ([#4411](https://github.com/hashicorp/terraform-provider-azurerm/issues/4411))\n* **New Resource:** `azurerm_dashboard` ([#4357](https://github.com/hashicorp/terraform-provider-azurerm/issues/4357))\n* **New Resource:** `azurerm_eventhub_namespace_disaster_recovery_config` ([#4425](https://github.com/hashicorp/terraform-provider-azurerm/issues/4425))\n* **New Resource:** `azurerm_storage_data_lake_gen2_filesystem` ([#4457](https://github.com/hashicorp/terraform-provider-azurerm/issues/4457))\n* **New Resource:** `azurerm_storage_management_policy` ([#3819](https://github.com/hashicorp/terraform-provider-azurerm/issues/3819))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading `github.com/Azure/azure-sdk-for-go` to `v33.2.0` ([#4334](https://github.com/hashicorp/terraform-provider-azurerm/issues/4334))\n* kusto: updating to API version `2019-05-15` ([#4376](https://github.com/hashicorp/terraform-provider-azurerm/issues/4376))\n* Data Source: `azurerm_client_config` - add `object_id`property ([#4486](https://github.com/hashicorp/terraform-provider-azurerm/issues/4486))\n* `azurerm_analysis_services_server` - support for `backup_blob_container_uri` and `server_full_name` ([#4397](https://github.com/hashicorp/terraform-provider-azurerm/issues/4397))\n* `azurerm_api_management_api` - deprecate `sku` in favour of the `sku_name` property ([#3154](https://github.com/hashicorp/terraform-provider-azurerm/issues/3154))\n* `azurerm_app_service_custom_hostname_binding` - support for `ssl_state` and `thumbprint` ([#4204](https://github.com/hashicorp/terraform-provider-azurerm/issues/4204))\n* `azurerm_app_service_slot` - support for `logs` ([#4473](https://github.com/hashicorp/terraform-provider-azurerm/issues/4473))\n* `azurerm_application_insights_analytics_item` - Add support for App Insights Analytics Items ([#4374](https://github.com/hashicorp/terraform-provider-azurerm/issues/4374))\n* `azurerm_eventhub_namespace` - support for the `network_rulesets` property ([#4409](https://github.com/hashicorp/terraform-provider-azurerm/issues/4409))\n* `azurerm_function_app` - changes to `app_service_plan_id` no longer force a new resource ([#4439](https://github.com/hashicorp/terraform-provider-azurerm/issues/4439))\n* `azurerm_kubernetes_cluster` - support for updating the Service Principal ([#4469](https://github.com/hashicorp/terraform-provider-azurerm/issues/4469))\n* `azurerm_servicebus_namespace` - support for `zone_redundant` ([#4432](https://github.com/hashicorp/terraform-provider-azurerm/issues/4432))\n\nBUG FIXES:\n\n* provider: Ensuring the user agent is configured ([#4463](https://github.com/hashicorp/terraform-provider-azurerm/issues/4463))\n* provider: Exposing the version of Terraform Core being used, rather than vendorered in User Agents ([#4464](https://github.com/hashicorp/terraform-provider-azurerm/issues/4464))\n* `azurerm_container_registry` - checking the `name` is globally unique during creation ([#4424](https://github.com/hashicorp/terraform-provider-azurerm/issues/4424))\n* `azurerm_hdinsight_hadoop_cluster ` - handling the API now masking passwords ([#4489](https://github.com/hashicorp/terraform-provider-azurerm/issues/4489))\n* `azurerm_hdinsight_hbase_cluster ` - handling the API now masking passwords ([#4489](https://github.com/hashicorp/terraform-provider-azurerm/issues/4489))\n* `azurerm_hdinsight_interactive_query_cluster ` - handling the API now masking passwords ([#4489](https://github.com/hashicorp/terraform-provider-azurerm/issues/4489))\n* `azurerm_hdinsight_kafka_cluster ` - handling the API now masking passwords ([#4489](https://github.com/hashicorp/terraform-provider-azurerm/issues/4489))\n* `azurerm_hdinsight_ml_services_cluster ` - handling the API now masking passwords ([#4489](https://github.com/hashicorp/terraform-provider-azurerm/issues/4489))\n* `azurerm_hdinsight_rserver_cluster ` - handling the API now masking passwords ([#4489](https://github.com/hashicorp/terraform-provider-azurerm/issues/4489))\n* `azurerm_hdinsight_spark_cluster ` - handling the API now masking passwords ([#4489](https://github.com/hashicorp/terraform-provider-azurerm/issues/4489))\n* `azurerm_hdinsight_storm_cluster ` - handling the API now masking passwords ([#4489](https://github.com/hashicorp/terraform-provider-azurerm/issues/4489))\n* `azurerm_key_vault_certificate` - storing the certificate data as hex ([#4335](https://github.com/hashicorp/terraform-provider-azurerm/issues/4335))\n* `azurerm_kubernetes_cluster` - fixing a bug where upgrading to 1.34.0 would require resource recreation ([#4469](https://github.com/hashicorp/terraform-provider-azurerm/issues/4469))\n* `azurerm_public_ip` - ensuring that `public_ip_prefix_id` is read ([#4344](https://github.com/hashicorp/terraform-provider-azurerm/issues/4344))\n* `azurerm_role_assignment` - changing the `skip_service_principal_aad_check` property no longer forces a new resource ([#4412](https://github.com/hashicorp/terraform-provider-azurerm/issues/4412))\n* `azurerm_storage_blob` - reading the properties after an update ([#4452](https://github.com/hashicorp/terraform-provider-azurerm/issues/4452))\n\n## 1.34.0 (September 18, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_network_ddos_protection_plan` ([#4228](https://github.com/hashicorp/terraform-provider-azurerm/issues/4228))\n* **New Data Source:** `azurerm_proximity_placement_group` ([#4020](https://github.com/hashicorp/terraform-provider-azurerm/issues/4020))\n* **New Data Source:** `azurerm_servicebus_namespace_authorization_rule` ([#4294](https://github.com/hashicorp/terraform-provider-azurerm/issues/4294))\n* **New Data Source:** `azurerm_sql_database` ([#4210](https://github.com/hashicorp/terraform-provider-azurerm/issues/4210))\n* **New Data Source:** `azurerm_storage_account_blob_container_sas` ([#4195](https://github.com/hashicorp/terraform-provider-azurerm/issues/4195))\n* **New Resource:** `azurerm_app_service_certificate` ([#4192](https://github.com/hashicorp/terraform-provider-azurerm/issues/4192))\n* **New Resource:** `azurerm_app_service_source_control_token` ([#4214](https://github.com/hashicorp/terraform-provider-azurerm/issues/4214))\n* **New Resource:** `azurerm_bot_channels_registration` ([#4245](https://github.com/hashicorp/terraform-provider-azurerm/issues/4245))\n* **New Resource:** `azurerm_bot_connection` ([#4311](https://github.com/hashicorp/terraform-provider-azurerm/issues/4311))\n* **New Resource:** `azurerm_frontdoor` ([#3933](https://github.com/hashicorp/terraform-provider-azurerm/issues/3933))\n* **New Resource:** `azurerm_frontdoor_firewall_policy` ([#4125](https://github.com/hashicorp/terraform-provider-azurerm/issues/4125))\n* **New Resource:** `azurerm_kusto_cluster` ([#4129](https://github.com/hashicorp/terraform-provider-azurerm/issues/4129))\n* **New Resource:** `azurerm_kusto_database` ([#4149](https://github.com/hashicorp/terraform-provider-azurerm/issues/4149))\n* **New Resource:** `azurerm_marketplace_agreement` ([#4305](https://github.com/hashicorp/terraform-provider-azurerm/issues/4305))\n* **New Resource:** `azurerm_private_dns_zone_virtual_network_link` ([#3789](https://github.com/hashicorp/terraform-provider-azurerm/issues/3789))\n* **New Resource:** `azurerm_proximity_placement_group` ([#4020](https://github.com/hashicorp/terraform-provider-azurerm/issues/4020))\n* **New Resource:** `azurerm_stream_analytics_output_servicebus_topic` ([#4164](https://github.com/hashicorp/terraform-provider-azurerm/issues/4164))\n* **New Resource:** `azurerm_web_application_firewall_policy` ([#4119](https://github.com/hashicorp/terraform-provider-azurerm/issues/4119))\n\nIMPROVEMENTS:\n\n* dependencies: updating `github.com/Azure/azure-sdk-for-go` to `v32.5.0` ([#4166](https://github.com/hashicorp/terraform-provider-azurerm/issues/4166))\n* dependencies: updating `github.com/Azure/go-autorest` to `v0.9.0` ([#4166](https://github.com/hashicorp/terraform-provider-azurerm/issues/4166))\n* dependencies: updating `github.com/hashicorp/go-azure-helpers` to `v0.7.0` ([#4166](https://github.com/hashicorp/terraform-provider-azurerm/issues/4166))\n* dependencies: updating `github.com/terraform-providers/terraform-provider-azuread` to `v0.6.0` ([#4166](https://github.com/hashicorp/terraform-provider-azurerm/issues/4166))\n* dependencies: updating `github.com/hashicorp/terraform` to `v0.12.8` ([#4341](https://github.com/hashicorp/terraform-provider-azurerm/issues/4341))\n* compute: updating the API Version to `2019-07-01` ([#4331](https://github.com/hashicorp/terraform-provider-azurerm/issues/4331))\n* network: updating to API version `2019-06-01` ([#4291](https://github.com/hashicorp/terraform-provider-azurerm/issues/4291))\n* network: reverting the locking changes from #3673 ([#3673](https://github.com/hashicorp/terraform-provider-azurerm/issues/3673))\n* storage: caching the Resource Group Name / Account Key ([#4205](https://github.com/hashicorp/terraform-provider-azurerm/issues/4205))\n* storage: switching to use SharedKey for authentication with Blobs/Containers rather than SharedKeyLite ([#4235](https://github.com/hashicorp/terraform-provider-azurerm/issues/4235))\n* Data Source: `azurerm_storage_account` - gracefully degrading when there's a ReadOnly lock/the user doesn't have permissions to list the Keys for the storage account ([#4248](https://github.com/hashicorp/terraform-provider-azurerm/issues/4248))\n* Data Source: `azurerm_storage_account_sas` - adding an `ISO8601` validator to the `start` and `end` dates ([#4064](https://github.com/hashicorp/terraform-provider-azurerm/issues/4064))\n* Data Source: `azurerm_virtual_network` - support for the `location` property ([#4281](https://github.com/hashicorp/terraform-provider-azurerm/issues/4281))\n* `azurerm_api_management` - support for multiple `additional_location` blocks ([#4175](https://github.com/hashicorp/terraform-provider-azurerm/issues/4175))\n* `azurerm_application_gateway` - allowing `capacity` to be set to `32` ([#4189](https://github.com/hashicorp/terraform-provider-azurerm/issues/4189))\n* `azurerm_application_gateway` - support OWASP version `3.1` for the `rule_set_version` property ([#4263](https://github.com/hashicorp/terraform-provider-azurerm/issues/4263))\n* `azurerm_application_gateway` - support for the `trusted_root _certificate` property ([#4206](https://github.com/hashicorp/terraform-provider-azurerm/issues/4206))\n* `azurerm_app_service` - fixing a bug where the Application `logs` block would get reset when `app_settings` were configured ([#4243](https://github.com/hashicorp/terraform-provider-azurerm/issues/4243))\n* `azurerm_app_service` - support for sending HTTP Logs to Blob Storage ([#4249](https://github.com/hashicorp/terraform-provider-azurerm/issues/4249))\n* `azurerm_app_service` - the `ip_restriction.ip_address` property is now optional ([#4184](https://github.com/hashicorp/terraform-provider-azurerm/issues/4184))\n* `azurerm_app_service_slot` - the `ip_restriction.ip_address` property is now optional ([#4184](https://github.com/hashicorp/terraform-provider-azurerm/issues/4184))\n* `azurerm_availability_set` - support for the `proximity_placement_group_id` property ([#4020](https://github.com/hashicorp/terraform-provider-azurerm/issues/4020))\n* `azurerm_cognitive_account` - supporting `CognitiveServices` as a `kind` ([#4209](https://github.com/hashicorp/terraform-provider-azurerm/issues/4209))\n* `azurerm_container_registry` - support for configuring Virtual Network Rules to Subnets ([#4293](https://github.com/hashicorp/terraform-provider-azurerm/issues/4293))\n* `azurerm_cosmosdb_account` - correctly validate `max_interval_in_seconds` & `max_staleness_prefix` for geo replicated accounts ([#4273](https://github.com/hashicorp/terraform-provider-azurerm/issues/4273))\n* `azurerm_cosmosdb_account` - increase creation & deletion wait timeout to `3` hours ([#4271](https://github.com/hashicorp/terraform-provider-azurerm/issues/4271))\n* `azurerm_cosmosdb_sql_container` - changing the `unique_key.paths` property now forces a new resource ([#4163](https://github.com/hashicorp/terraform-provider-azurerm/issues/4163))\n* `azurerm_eventhub_namespace` - changing the `kafka_enabled` property now forces a new resource ([#4264](https://github.com/hashicorp/terraform-provider-azurerm/issues/4264))\n* `azurerm_kubernetes_cluster` - support for configuring the `kube_dashboard` within the `addon_profile` block ([#4139](https://github.com/hashicorp/terraform-provider-azurerm/issues/4139))\n* `azurerm_kubernetes_cluster` - prevent `pod_cidr` and azure `network_plugin` from being set at the same time causing a new resource to be created ([#4286](https://github.com/hashicorp/terraform-provider-azurerm/issues/4286))\n* `azurerm_mariadb_server` - support for version `10.3` ([#4170](https://github.com/hashicorp/terraform-provider-azurerm/issues/4170))\n* `azurerm_mariadb_server` - support for configuring `auto_grow` ([#4302](https://github.com/hashicorp/terraform-provider-azurerm/issues/4302))\n* `azurerm_managed_disk` - add support for the Ultra SSD `disk_iops_read_write` & `disk_mbps_read_write` properties ([#4102](https://github.com/hashicorp/terraform-provider-azurerm/issues/4102))\n* `azurerm_mysql_server` - support for configuring `auto_grow` ([#4303](https://github.com/hashicorp/terraform-provider-azurerm/issues/4303))\n* `azurerm_private_dns_zone` - polling until the dns zone is marked as fully provisioned ([#4307](https://github.com/hashicorp/terraform-provider-azurerm/issues/4307))\n* `azurerm_postgresql_server` - support for configuring `auto_grow` ([#4220](https://github.com/hashicorp/terraform-provider-azurerm/issues/4220))\n* `azurerm_resource_group` - the `name` field can now be up to 90 characters ([#4233](https://github.com/hashicorp/terraform-provider-azurerm/issues/4233))\n* `azurerm_role_assignment` - add `principal_type` and `skip_service_principal_aad_check` properties ([#4168](https://github.com/hashicorp/terraform-provider-azurerm/issues/4168))\n* `azurerm_storage_account` - gracefully degrading when there's a ReadOnly lock/the user doesn't have permissions to list the Keys for the storage account ([#4248](https://github.com/hashicorp/terraform-provider-azurerm/issues/4248))\n* `azurerm_storage_blob` - switching over to use the new Storage SDK ([#4179](https://github.com/hashicorp/terraform-provider-azurerm/issues/4179))\n* `azurerm_storage_blob` - support for Append Blobs ([#4238](https://github.com/hashicorp/terraform-provider-azurerm/issues/4238))\n* `azurerm_storage_blob` - support for configuring the `access_tier` ([#4238](https://github.com/hashicorp/terraform-provider-azurerm/issues/4238))\n* `azurerm_storage_blob` - support for specifying Block Blob content via `source_content` ([#4238](https://github.com/hashicorp/terraform-provider-azurerm/issues/4238))\n* `azurerm_storage_blob` - the `type` field is now Required, since it had to be set anyway ([#4238](https://github.com/hashicorp/terraform-provider-azurerm/issues/4238))\n* `azurerm_storage_share_directory` - support for upper-case characters in the `name` field ([#4178](https://github.com/hashicorp/terraform-provider-azurerm/issues/4178))\n* `azurerm_storage_table` - using the correct storage account name when checking for the presence of an existing storage table ([#4234](https://github.com/hashicorp/terraform-provider-azurerm/issues/4234))\n* `azurerm_stream_analytics_job` - the field `data_locale` is now optional ([#4190](https://github.com/hashicorp/terraform-provider-azurerm/issues/4190))\n* `azurerm_stream_analytics_job` - the field `events_late_arrival_max_delay_in_seconds` is now optional ([#4190](https://github.com/hashicorp/terraform-provider-azurerm/issues/4190))\n* `azurerm_stream_analytics_job` - the field `events_out_of_order_policy` is now optional ([#4190](https://github.com/hashicorp/terraform-provider-azurerm/issues/4190))\n* `azurerm_stream_analytics_job` - the field `output_error_policy` is now optional ([#4190](https://github.com/hashicorp/terraform-provider-azurerm/issues/4190))\n* `azurerm_subnet` - support for the actions `Microsoft.Network/virtualNetworks/subnets/join/action` and `Microsoft.Network/virtualNetworks/subnets/prepareNetworkPolicies/action` ([#4137](https://github.com/hashicorp/terraform-provider-azurerm/issues/4137))\n* `azurerm_virtual_machine` - support for `UltraSSD_LRS` managed disks ([#3860](https://github.com/hashicorp/terraform-provider-azurerm/issues/3860))\n* `azurerm_virtual_machine` - support for the `proximity_placement_group_id` property ([#4020](https://github.com/hashicorp/terraform-provider-azurerm/issues/4020))\n* `azurerm_virtual_machine_scale_set` - support for the `proximity_placement_group_id` property ([#4020](https://github.com/hashicorp/terraform-provider-azurerm/issues/4020))\n\nBUG FIXES:\n\n* `azurerm_app_service` - will no longer panic from when an access restriction rule involves a virtual network ([#4184](https://github.com/hashicorp/terraform-provider-azurerm/issues/4184))\n* `azurerm_app_service_slot` - will no longer panic from when an access restriction rule involves a virtual network ([#4184](https://github.com/hashicorp/terraform-provider-azurerm/issues/4184))\n* `azurerm_app_service_plan` and `azurerm_app_service_slot` crash fixes ([#4184](https://github.com/hashicorp/terraform-provider-azurerm/issues/4184))\n* `azurerm_container_group` - make `storage_account_key` field in `volume` block sensitive ([#4201](https://github.com/hashicorp/terraform-provider-azurerm/issues/4201))\n* `azurerm_key_vault_certificate` - prevented a panic caused by an empty element in `extended_key_usage` ([#4272](https://github.com/hashicorp/terraform-provider-azurerm/issues/4272))\n* `azurerm_log_analytics_linked_service` - will no longer panic if no items are passed into the property `linked_service_properties` ([#4142](https://github.com/hashicorp/terraform-provider-azurerm/issues/4142))\n* `azurerm_log_analytics_workspace_linked_service` - will no longer panic if no items are passed into the property `linked_service_properties` ([#4152](https://github.com/hashicorp/terraform-provider-azurerm/issues/4152))\n* `azurerm_network_interface` - changing the `ip_configuration` property to no longer force new resource ([#4155](https://github.com/hashicorp/terraform-provider-azurerm/issues/4155))\n* `azurerm_virtual_network_peering` - prevent nil object from being read ([#4180](https://github.com/hashicorp/terraform-provider-azurerm/issues/4180))\n\n## 1.33.1 (August 27, 2019)\n\n* networking: reducing the number of locks to avoid deadlock when creating 3 or more subnets with Network Security Group/Route Table Associations ([#3673](https://github.com/hashicorp/terraform-provider-azurerm/issues/3673))\n\n## 1.33.0 (August 22, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_dev_test_virtual_network` ([#3746](https://github.com/hashicorp/terraform-provider-azurerm/issues/3746))\n* **New Resource:** `azurerm_cosmosdb_sql_container` ([#3871](https://github.com/hashicorp/terraform-provider-azurerm/issues/3871))\n* **New Resource:** `azurerm_container_registry_webhook` ([#4112](https://github.com/hashicorp/terraform-provider-azurerm/issues/4112))\n* **New Resource:** `azurerm_dev_test_lab_schedule` ([#3554](https://github.com/hashicorp/terraform-provider-azurerm/issues/3554))\n* **New Resource:** `azurerm_mariadb_virtual_network_rule` ([#4048](https://github.com/hashicorp/terraform-provider-azurerm/issues/4048))\n* **New Resource:** `azurerm_mariadb_configuration` ([#4060](https://github.com/hashicorp/terraform-provider-azurerm/issues/4060))\n* **New Resource:** `azurerm_private_dns_cname_record` ([#4028](https://github.com/hashicorp/terraform-provider-azurerm/issues/4028))\n* **New Resource:** `azurerm_recovery_services_fabric` ([#4003](https://github.com/hashicorp/terraform-provider-azurerm/issues/4003))\n* **New Resource:** `azurerm_recovery_services_protection_container` ([#4003](https://github.com/hashicorp/terraform-provider-azurerm/issues/4003))\n* **New Resource:** `azurerm_recovery_services_replication_policy` ([#4003](https://github.com/hashicorp/terraform-provider-azurerm/issues/4003))\n* **New Resource:** `azurerm_recovery_services_protection_container_mapping` ([#4003](https://github.com/hashicorp/terraform-provider-azurerm/issues/4003))\n* **New Resource:** `azurerm_recovery_network_mapping` ([#4003](https://github.com/hashicorp/terraform-provider-azurerm/issues/4003))\n* **New Resource:** `azurerm_recovery_replicated_vm`  ([#4003](https://github.com/hashicorp/terraform-provider-azurerm/issues/4003))\n* **New Resource:** `azurerm_sql_failover_group` ([#3901](https://github.com/hashicorp/terraform-provider-azurerm/issues/3901))\n* **New Resource:** `azurerm_virtual_wan` ([#4089](https://github.com/hashicorp/terraform-provider-azurerm/issues/4089))\n\nIMPROVEMENTS:\n\n* all resources: increasing the maximum number of tags from `15` to `50` ([#4071](https://github.com/hashicorp/terraform-provider-azurerm/issues/4071))\n* dependencies: upgrading `github.com/tombuildsstuff/giovanni` to `v0.3.2` ([#4122](https://github.com/hashicorp/terraform-provider-azurerm/issues/4122))\n* dependencies: upgrading the `authorization` SDK to `2018-09-01` ([#4063](https://github.com/hashicorp/terraform-provider-azurerm/issues/4063))\n* dependencies: upgrading `github.com/hashicorp/terraform` to `0.12.6` ([#4041](https://github.com/hashicorp/terraform-provider-azurerm/issues/4041))\n* internal: removing a duplicate Date/Time from the debug logs ([#4024](https://github.com/hashicorp/terraform-provider-azurerm/issues/4024))\n* Data Source `azurerm_dns_zone`: deprecating the `zone_type` field ([#4033](https://github.com/hashicorp/terraform-provider-azurerm/issues/4033))\n* `azurerm_app_service` - `filesystem` logging can now be set. ([#4025](https://github.com/hashicorp/terraform-provider-azurerm/issues/4025))\n* `azurerm_batch_pool` - Support for Container Registry configurations ([#4072](https://github.com/hashicorp/terraform-provider-azurerm/issues/4072))\n* `azurerm_container_group` - support for attaching to a (Private) Virtual Network ([#3716](https://github.com/hashicorp/terraform-provider-azurerm/issues/3716))\n* `azurerm_container_group` - `log_type` can now be an empty string ([#4013](https://github.com/hashicorp/terraform-provider-azurerm/issues/4013))\n* `azurerm_cognitive_account` - Adding 'QnAMaker' as Kind ([#4126](https://github.com/hashicorp/terraform-provider-azurerm/issues/4126))\n* `azurerm_dns_zone` - deprecating the `zone_type` field ([#4033](https://github.com/hashicorp/terraform-provider-azurerm/issues/4033))\n* `azurerm_function_app` - support for cors ([#3949](https://github.com/hashicorp/terraform-provider-azurerm/issues/3949))\n* `azurerm_function_app` - support for the `virtual_network_name` property ([#4078](https://github.com/hashicorp/terraform-provider-azurerm/issues/4078))\n* `azurerm_iot_dps` - add support for the `linked_hub` property ([#3922](https://github.com/hashicorp/terraform-provider-azurerm/issues/3922))\n* `azurerm_kubernetes_cluster` - support for the `enable_pod_security_policy` property ([#4098](https://github.com/hashicorp/terraform-provider-azurerm/issues/4098))\n* `azurerm_monitor_diagnostic_setting` - support for `log_analytics_destination_type` ([#3987](https://github.com/hashicorp/terraform-provider-azurerm/issues/3987))\n* `azurerm_role_assignment` - now supports management groups ([#4063](https://github.com/hashicorp/terraform-provider-azurerm/issues/4063))\n* `azurerm_storage_account` - requesting an access token using the ARM Authorizer ([#4099](https://github.com/hashicorp/terraform-provider-azurerm/issues/4099))\n* `azurerm_storage_account` - support for `BlockBlobStorage` ([#4131](https://github.com/hashicorp/terraform-provider-azurerm/issues/4131))\n* `azurerm_subnet` - support for the Service Endpoints `Microsoft.BareMetal/AzureVMware`, `Microsoft.BareMetal/CrayServers`, `Microsoft.Databricks/workspaces` and `Microsoft.Web/hostingEnvironments` ([#4115](https://github.com/hashicorp/terraform-provider-azurerm/issues/4115))\n* `azurerm_traffic_manager_profile` - support for the `interval_in_seconds`, `timeout_in_seconds`, and `tolerated_number_of_failures` properties ([#3473](https://github.com/hashicorp/terraform-provider-azurerm/issues/3473))\n* `azurerm_user_assigned_identity` - the `name` field can now be up to 128 characters ([#4094](https://github.com/hashicorp/terraform-provider-azurerm/issues/4094))\n\nBUG FIXES: \n\n* `azurerm_app_service_plan` - workaround for missing error on 404 ([#3990](https://github.com/hashicorp/terraform-provider-azurerm/issues/3990))\n* `azurerm_batch_certificate` - the `thumbprint_algorithm` property is now case insensitive ([#3977](https://github.com/hashicorp/terraform-provider-azurerm/issues/3977))\n* `azurerm_notification_hub_authorization_rule - fixing an issue when creating multiple authorization rules at the same time ([#4087](https://github.com/hashicorp/terraform-provider-azurerm/issues/4087))\n* `azurerm_postgresql_server` - removal of unsupported version `10.2` ([#3915](https://github.com/hashicorp/terraform-provider-azurerm/issues/3915))\n* `azurerm_role_definition` - ensure `role_definition_id` is correctly set if left empty during creation ([#3913](https://github.com/hashicorp/terraform-provider-azurerm/issues/3913))\n* `azurerm_storage_account` - making `default_action` within the `network_rules` block required ([#4037](https://github.com/hashicorp/terraform-provider-azurerm/issues/4037))\n* `azurerm_storage_account` - making the `network_rules` block computed ([#4037](https://github.com/hashicorp/terraform-provider-azurerm/issues/4037))\n* `azurerm_storage_queue` - switching to using SharedKey for authentication ([#4122](https://github.com/hashicorp/terraform-provider-azurerm/issues/4122))\n* `azurerm_storage_share` - allow up to 100TB for the `quota` property ([#4054](https://github.com/hashicorp/terraform-provider-azurerm/issues/4054))\n* `azurerm_storage_share_directory` - handling the share being eventually consistent ([#4122](https://github.com/hashicorp/terraform-provider-azurerm/issues/4122))\n* `azurerm_storage_share_directory` - allowing nested directories ([#4122](https://github.com/hashicorp/terraform-provider-azurerm/issues/4122))\n\n## 1.32.1 (July 31, 2019)\n\nBUG FIXES: \n\n* `azurerm_application_gateway` fix an index out of range crash ([#3966](https://github.com/hashicorp/terraform-provider-azurerm/issues/3966))\n* `azurerm_api_management_backend` - ensuring a nil `certificates` object is sent to the API instead of an empty one ([#3931](https://github.com/hashicorp/terraform-provider-azurerm/issues/3931))\n* `azurerm_api_management_product` - additional validation for `approval_required` ([#3945](https://github.com/hashicorp/terraform-provider-azurerm/issues/3945))\n* `azurerm_network_ddos_protection_plan` - correctly decodes the resource ID on read/delete ([#3975](https://github.com/hashicorp/terraform-provider-azurerm/issues/3975))\n* `azurerm_dev_test_virtual_network` - generate subnet IDs in the correct format ([#3717](https://github.com/hashicorp/terraform-provider-azurerm/issues/3717))\n* `azurerm_iot_dps` fixed deletion issue when using a service principal ([#3973](https://github.com/hashicorp/terraform-provider-azurerm/issues/3973))\n* `azurerm_kubernetes_cluster` - the `load_balancer_sku` property is now case insensitive ([#3958](https://github.com/hashicorp/terraform-provider-azurerm/issues/3958))\n* `azurerm_postgresql_server` - add missing support for version `11.0` ([#3970](https://github.com/hashicorp/terraform-provider-azurerm/issues/3970))\n* `azurerm_storage_*` - prevent multiple panics when a storage account/resource group cannot be found ([#3986](https://github.com/hashicorp/terraform-provider-azurerm/issues/3986))\n* `azurerm_storage_account` - fix `enable_advanced_threat_protection` create/read for unsupported regions ([#3947](https://github.com/hashicorp/terraform-provider-azurerm/issues/3947))\n* `azurerm_storage_table` - now migrates older versions of the resource id to the new format ([#3932](https://github.com/hashicorp/terraform-provider-azurerm/issues/3932))\n* `azurerm_virtual_machine_scale_set` - the `ssh_keys` property of the `os_profile_linux_config` block now recognizes updates ([#3837](https://github.com/hashicorp/terraform-provider-azurerm/issues/3837))\n* `azurerm_virtual_machine_scale_set` - changes made to the `network_profile` property should now be correctly reflected during updates ([#3821](https://github.com/hashicorp/terraform-provider-azurerm/issues/3821))\n\n\n## 1.32.0 (July 24, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_maps_account` ([#3698](https://github.com/hashicorp/terraform-provider-azurerm/issues/3698))\n* **New Data Source:** `azurerm_mssql_elasticpool` ([#3824](https://github.com/hashicorp/terraform-provider-azurerm/issues/3824))\n* **New Resource:** `azurerm_analysis_services_server` ([#3721](https://github.com/hashicorp/terraform-provider-azurerm/issues/3721))\n* **New Resource:** `azurerm_api_management_backend` ([#3676](https://github.com/hashicorp/terraform-provider-azurerm/issues/3676))\n* **New Resource:** `azurerm_batch_application` ([#3825](https://github.com/hashicorp/terraform-provider-azurerm/issues/3825))\n* **New Resource:** `azurerm_maps_account` ([#3698](https://github.com/hashicorp/terraform-provider-azurerm/issues/3698))\n* **New Resource:** `azurerm_private_dns_zone_a_record` ([#3849](https://github.com/hashicorp/terraform-provider-azurerm/issues/3849))\n* **New Resource:** `azurerm_storage_table_entity` ([#3831](https://github.com/hashicorp/terraform-provider-azurerm/issues/3831))\n* **New Resource:** `azurerm_storage_share_directory` ([#3802](https://github.com/hashicorp/terraform-provider-azurerm/issues/3802))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to `v31.0.0` of `github.com/Azure/azure-sdk-for-go` ([#3786](https://github.com/hashicorp/terraform-provider-azurerm/issues/3786))\n* dependencies: upgrading to `v0.5.0` of `github.com/hashicorp/go-azure-helpers` ([#3850](https://github.com/hashicorp/terraform-provider-azurerm/issues/3850))\n* dependencies: upgrading the `containerservice` SDK to `2019-02-01` ([#3787](https://github.com/hashicorp/terraform-provider-azurerm/issues/3787))\n* dependencies: upgrading the `subscription` SDK to `2018-06-01` ([#3811](https://github.com/hashicorp/terraform-provider-azurerm/issues/3811))\n* authentication: showing a more helpful error when attempting to use the Azure CLI authentication when logged in as a Service Principal ([#3850](https://github.com/hashicorp/terraform-provider-azurerm/issues/3850))\n* Data Source `azurerm_function_app` - support for `auth_settings` ([#3893](https://github.com/hashicorp/terraform-provider-azurerm/issues/3893))\n* Data Source `azurerm_subscription` - support the `tenant_id` property ([#3811](https://github.com/hashicorp/terraform-provider-azurerm/issues/3811))\n* `azurerm_app_service` - support for backups ([#3804](https://github.com/hashicorp/terraform-provider-azurerm/issues/3804))\n* `azurerm_app_service` - support for storage mounts ([#3792](https://github.com/hashicorp/terraform-provider-azurerm/issues/3792))\n* `azurerm_app_service` - support for user assigned identities ([#3637](https://github.com/hashicorp/terraform-provider-azurerm/issues/3637))\n* `azurerm_app_service_slot` - support for `auth_settings` ([#3897](https://github.com/hashicorp/terraform-provider-azurerm/issues/3897))\n* `azurerm_app_service_slot` - support for user assigned identities ([#3637](https://github.com/hashicorp/terraform-provider-azurerm/issues/3637))\n* `azurerm_application_gateway` - Support for Managed Identities ([#3648](https://github.com/hashicorp/terraform-provider-azurerm/issues/3648))\n* `azurerm_batch_pool` - support for custom images with the `storage_image_reference` property ([#3530](https://github.com/hashicorp/terraform-provider-azurerm/issues/3530))\n* `azurerm_batch_account` - expose required properties for when `pool_allocation_mode` is `UserSubscription` ([#3535](https://github.com/hashicorp/terraform-provider-azurerm/issues/3535))\n* `azurerm_cognitive_account` - add support for `CustomVision.Training` and `CustomVision.Prediction` to the `kind` property ([#3817](https://github.com/hashicorp/terraform-provider-azurerm/issues/3817))\n* `azurerm_container_registry` - support for `network_rule_set` property ([#3194](https://github.com/hashicorp/terraform-provider-azurerm/issues/3194))\n* `azurerm_cosmosdb_account` - validate `max_interval_in_seconds` and `max_staleness_prefix` correctly when using more then 1 geo_location ([#3906](https://github.com/hashicorp/terraform-provider-azurerm/issues/3906))\n* `azurerm_function_app` - support for `auth_settings` ([#3893](https://github.com/hashicorp/terraform-provider-azurerm/issues/3893))\n* `azurerm_iothub` - support for the `file_upload` property ([#3735](https://github.com/hashicorp/terraform-provider-azurerm/issues/3735))\n* `azurerm_kubernetes_cluster` - support for auto scaling ([#3361](https://github.com/hashicorp/terraform-provider-azurerm/issues/3361))\n* `azurerm_kubernetes_cluster` - support for `custom_resource_group_name` ([#3785](https://github.com/hashicorp/terraform-provider-azurerm/issues/3785))\n* `azurerm_kubernetes_cluster` - support for the `node_taints` property ([#3787](https://github.com/hashicorp/terraform-provider-azurerm/issues/3787))\n* `azurerm_kubernetes_cluster`  - support for the `windows_profile` property ([#3519](https://github.com/hashicorp/terraform-provider-azurerm/issues/3519))\n* `kubernetes_cluster` - support for specifying the `load_balancer_sku` property ([#3890](https://github.com/hashicorp/terraform-provider-azurerm/issues/3890))\n* `azurerm_recovery_services_protected_vm` - changing `backup_policy_id` no longer forces a new resource ([#3822](https://github.com/hashicorp/terraform-provider-azurerm/issues/3822))\n* `azurerm_security_center_contact` - the `phone` property is now optional ([#3761](https://github.com/hashicorp/terraform-provider-azurerm/issues/3761))\n* `azurerm_storage_account` - the `account_kind` property now supports `FileStorage` ([#3750](https://github.com/hashicorp/terraform-provider-azurerm/issues/3750))\n* `azurerm_storage_account` - support for the `enable_advanced_threat_protection` property ([#3782](https://github.com/hashicorp/terraform-provider-azurerm/issues/3782))\n* `azurerm_storage_account` - support for `queue_properties` ([#3859](https://github.com/hashicorp/terraform-provider-azurerm/issues/3859))\n* `azurerm_storage_blob` - making `metadata` a computed field ([#3842](https://github.com/hashicorp/terraform-provider-azurerm/issues/3842))\n* `azurerm_storage_container` - switching to use github.com/tombuildsstuff/giovanni ([#3857](https://github.com/hashicorp/terraform-provider-azurerm/issues/3857))\n* `azurerm_storage_container` - adding support for `metadata` ([#3857](https://github.com/hashicorp/terraform-provider-azurerm/issues/3857))\n* `azurerm_storage_container` - can now create containers with the name `$web` ([#3896](https://github.com/hashicorp/terraform-provider-azurerm/issues/3896))\n* `azurerm_storage_queue` - switching to use github.com/tombuildsstuff/giovanni ([#3832](https://github.com/hashicorp/terraform-provider-azurerm/issues/3832))\n* `azurerm_storage_share` - switching to use github.com/tombuildsstuff/giovanni ([#3828](https://github.com/hashicorp/terraform-provider-azurerm/issues/3828))\n* `azurerm_storage_share` - support for configuring ACL's ([#3830](https://github.com/hashicorp/terraform-provider-azurerm/issues/3830))\n* `azurerm_storage_share` - support for configuring MetaData ([#3830](https://github.com/hashicorp/terraform-provider-azurerm/issues/3830))\n* `azurerm_storage_table` - switching to use github.com/tombuildsstuff/giovanni ([#3834](https://github.com/hashicorp/terraform-provider-azurerm/issues/3834))\n* `azurerm_storage_table` - support for configuring ACL's ([#3847](https://github.com/hashicorp/terraform-provider-azurerm/issues/3847))\n* `azurerm_traffic_manager_endpoint` - supper for `custom_header` and `subnet` properties ([#3655](https://github.com/hashicorp/terraform-provider-azurerm/issues/3655))\n* `azurerm_virtual_machine` - switching over to use the github.com/tombuildsstuff/giovanni Storage SDK ([#3838](https://github.com/hashicorp/terraform-provider-azurerm/issues/3838))\n* `azurerm_virtual_machine` - looking up the data disks attached to the Virtual Machine when optionally deleting them upon deletion rather than parsing them from the config ([#3838](https://github.com/hashicorp/terraform-provider-azurerm/issues/3838))\n* `azurerm_virtual_machine_scale_set` - prevent `public_ip_address_configuration` from being lost during update ([#3767](https://github.com/hashicorp/terraform-provider-azurerm/issues/3767))\n\nBUG FIXES:\n\n* `azurerm_image` - prevent crash when using `data_disk` ([#3797](https://github.com/hashicorp/terraform-provider-azurerm/issues/3797))\n* `azurerm_role_assignment` - now correctly uses `scope` when looking up the role definition by name ([#3768](https://github.com/hashicorp/terraform-provider-azurerm/issues/3768))\n\n## 1.31.0 (June 28, 2019)\n\nFEATURES:\n\n* increase the default timeout to `3 hours` ([#3737](https://github.com/hashicorp/terraform-provider-azurerm/issues/3737))\n* **New Resource:** `azurerm_iot_dps` ([#3618](https://github.com/hashicorp/terraform-provider-azurerm/issues/3618))\n* **New Resource:** `azurerm_iot_dps_certificate` ([#3567](https://github.com/hashicorp/terraform-provider-azurerm/issues/3645))\n* **New Resource:** `azurerm_mariadb_firewall_rule` ([#3720](https://github.com/hashicorp/terraform-provider-azurerm/issues/3720))\n* **New Resource:** `azurerm_private_dns_zone` ([#3718](https://github.com/hashicorp/terraform-provider-azurerm/issues/3718))\n* **New Resource:** `azurerm_stream_analytics_output_mssql` ([#3567](https://github.com/hashicorp/terraform-provider-azurerm/issues/3567))\n\nIMPROVEMENTS:\n\n* Data Source `azurerm_key_vault` - deprecated `sku` in favour of `sku_name` ([#3119](https://github.com/hashicorp/terraform-provider-azurerm/issues/3119))\n* `azurerm_app_service` - support for shipping the application logs to blob storage ([#3520](https://github.com/hashicorp/terraform-provider-azurerm/issues/3520))\n* `azurerm_app_service_plan` - prevent a panic during import ([#3657](https://github.com/hashicorp/terraform-provider-azurerm/issues/3657))\n* `azurerm_app_service_slot` - updating `identity` no longer forces a new resource ([#3702](https://github.com/hashicorp/terraform-provider-azurerm/issues/3702))\n* `azurerm_automation_account` - deprecated `sku` in favour of `sku_name` ([#3119](https://github.com/hashicorp/terraform-provider-azurerm/issues/3119))\n* `azurerm_key_vault` - deprecated `sku` in favour of `sku_name` ([#3119](https://github.com/hashicorp/terraform-provider-azurerm/issues/3119))\n* `azurerm_key_vault_key` - add support for Elliptic Curve based keys ([#1814](https://github.com/hashicorp/terraform-provider-azurerm/issues/1814))\n* `azurerm_traffic_manager_profile` - `ttl` can now be 1 second ([#3632](https://github.com/hashicorp/terraform-provider-azurerm/issues/3632))\n* `azurerm_eventgrid_event_subscription` - now retrieves the full URL for event webhooks ([#3630](https://github.com/hashicorp/terraform-provider-azurerm/issues/3630))\n* `azurerm_lb` - support for the `public_ip_prefix_id` property ([#3675](https://github.com/hashicorp/terraform-provider-azurerm/issues/3675))\n* `azurerm_mysql_server` - add validation to the `name` property ([#3695](https://github.com/hashicorp/terraform-provider-azurerm/issues/3695))\n* `azurerm_notification_hub_namespace` - deprecated `sku` in favour of `sku_name` ([#3119](https://github.com/hashicorp/terraform-provider-azurerm/issues/3119))\n* `azurerm_redis_firewall_rule` - no longer fails with multiple rules ([#3731](https://github.com/hashicorp/terraform-provider-azurerm/issues/3731))\n* `azurerm_relay_namespace` - deprecated `sku` in favour of `sku_name` ([#3119](https://github.com/hashicorp/terraform-provider-azurerm/issues/3119))\n* `azurerm_service_fabric_cluster` - `tenant_id`, `cluster_application_id`, and `client_application_id` are now updateable ([#3654](https://github.com/hashicorp/terraform-provider-azurerm/issues/3654))\n* `azurerm_service_fabric_cluster` - ability to set `certificate_common_names` ([#3652](https://github.com/hashicorp/terraform-provider-azurerm/issues/3652))\n* `azurerm_storage_account` - ability to set `default_action` oi the `network_rules` block ([#3255](https://github.com/hashicorp/terraform-provider-azurerm/issues/3255))\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_account` - will ignore `500` responses from `documentdb.DatabaseAccountsClient#CheckNameExists` requests to work around a broken API ([#3747](https://github.com/hashicorp/terraform-provider-azurerm/issues/3747))\n\n## 1.30.1 (June 07, 2019)\n\nBUG FIXES:\n\n* Ensuring the authorization header is set for calls to the User Assigned Identity API's ([#3613](https://github.com/hashicorp/terraform-provider-azurerm/issues/3613))\n\n## 1.30.0 (June 07, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_redis_cache` ([#3481](https://github.com/hashicorp/terraform-provider-azurerm/issues/3481))\n* **New Data Source:** `azurerm_sql_server` ([#3513](https://github.com/hashicorp/terraform-provider-azurerm/issues/3513))\n* **New Data Source:** `azurerm_virtual_network_gateway_connection` ([#3571](https://github.com/hashicorp/terraform-provider-azurerm/issues/3571))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to Go 1.12 ([#3525](https://github.com/hashicorp/terraform-provider-azurerm/issues/3525))\n* dependencies: upgrading the `storage` SDK to `2019-04-01` ([#3578](https://github.com/hashicorp/terraform-provider-azurerm/issues/3578))\n* Data Source `azurerm_app_service` - support windows containers ([#3566](https://github.com/hashicorp/terraform-provider-azurerm/issues/3566))\n* Data Source `azurerm_app_service_plan` - support windows containers ([#3566](https://github.com/hashicorp/terraform-provider-azurerm/issues/3566))\n* `azurerm_api_management` - rename `disable_triple_des_chipers` to `disable_triple_des_ciphers` ([#3539](https://github.com/hashicorp/terraform-provider-azurerm/issues/3539))\n* `azurerm_application_gateway` - support for the value `General` in the `rule_group_name` field within the `disabled_rule_group` block ([#3533](https://github.com/hashicorp/terraform-provider-azurerm/issues/3533))\n* `azurerm_app_service` - support for windows containers ([#3566](https://github.com/hashicorp/terraform-provider-azurerm/issues/3566))\n* `azurerm_app_service_plan` - support for the `maximum_elastic_worker_count` property ([#3547](https://github.com/hashicorp/terraform-provider-azurerm/issues/3547))\n* `azurerm_managed_disk` - support for the `create_option` of `Restore` ([#3598](https://github.com/hashicorp/terraform-provider-azurerm/issues/3598))\n* `azurerm_app_service_plan` - support for windows containers ([#3566](https://github.com/hashicorp/terraform-provider-azurerm/issues/3566))\n\n\n## 1.29.0 (May 25, 2019)\n\nFEATURES:\n\n* **New Resource:** `azurerm_application_insights_web_test` ([#3331](https://github.com/hashicorp/terraform-provider-azurerm/issues/3331))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to `v0.12.0` of `github.com/hashicorp/terraform` ([#3417](https://github.com/hashicorp/terraform-provider-azurerm/issues/3417))\n* sdk: configuring the Correlation Request ID ([#3253](https://github.com/hashicorp/terraform-provider-azurerm/issues/3253))\n* `azurerm_application_gateway` - support for rewrite rules ([#3423](https://github.com/hashicorp/terraform-provider-azurerm/issues/3423))\n* `azurerm_application_gateway` - support for `ssl_policy` blocks and deprecating `disabled_ssl_protocols` ([#3360](https://github.com/hashicorp/terraform-provider-azurerm/issues/3360))\n* `azurerm_app_service` - support for configuring authentication settings ([#2831](https://github.com/hashicorp/terraform-provider-azurerm/issues/2831))\n* `azurerm_kubernetes_cluster` - updating the casing on the `SubnetName` field to match a change in the AKS API ([#3484](https://github.com/hashicorp/terraform-provider-azurerm/issues/3484))\n* `azurerm_kubernetes_cluster` - support for multiple agent pools ([#3491](https://github.com/hashicorp/terraform-provider-azurerm/issues/3491))\n\nBUG FIXES:\n\n* Data Source `azurerm_virtual_network`: add `network_space` property to match resource while deprecating `network_spaces` ([#3494](https://github.com/hashicorp/terraform-provider-azurerm/issues/3494))\n* `azurerm_automation_module` - now polls to wait until the module's finished provisioning ([#3482](https://github.com/hashicorp/terraform-provider-azurerm/issues/3482))\n* `azurerm_api_management_api` - correct validation to allow empty and strings 400 characters long ([#3475](https://github.com/hashicorp/terraform-provider-azurerm/issues/3475))\n* `azurerm_dev_test_virtual_network` - correctly manages `subnets` on the initial creation ([#3501](https://github.com/hashicorp/terraform-provider-azurerm/issues/3501))\n* `azurerm_express_route_circuit` - no longer removes circuit subresources on update ([#3496](https://github.com/hashicorp/terraform-provider-azurerm/issues/3496))\n* `azurerm_role_assignment` - making the `role_definition_name` field case-insensitive ([#3499](https://github.com/hashicorp/terraform-provider-azurerm/issues/3499))\n\n## 1.28.0 (May 17, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_automation_variable_bool` ([#3310](https://github.com/hashicorp/terraform-provider-azurerm/issues/3310))\n* **New Data Source:** `azurerm_automation_variable_datetime` ([#3310](https://github.com/hashicorp/terraform-provider-azurerm/issues/3310))\n* **New Data Source:** `azurerm_automation_variable_int` ([#3310](https://github.com/hashicorp/terraform-provider-azurerm/issues/3310))\n* **New Data Source:** `azurerm_automation_variable_string` ([#3310](https://github.com/hashicorp/terraform-provider-azurerm/issues/3310))\n* **New Data Source:** `azurerm_kubernetes_service_versions` ([#3382](https://github.com/hashicorp/terraform-provider-azurerm/issues/3382))\n* **New Data Source:** `azurerm_user_assigned_identity` ([#3343](https://github.com/hashicorp/terraform-provider-azurerm/issues/3343))\n* **New Resource:** `azurerm_automation_variable_bool` ([#3310](https://github.com/hashicorp/terraform-provider-azurerm/issues/3310))\n* **New Resource:** `azurerm_automation_variable_datetime` ([#3310](https://github.com/hashicorp/terraform-provider-azurerm/issues/3310))\n* **New Resource:** `azurerm_automation_variable_int` ([#3310](https://github.com/hashicorp/terraform-provider-azurerm/issues/3310))\n* **New Resource:** `azurerm_automation_variable_string` ([#3310](https://github.com/hashicorp/terraform-provider-azurerm/issues/3310))\n* **New Resource:** `azurerm_api_management_api_operation_policy` ([#3374](https://github.com/hashicorp/terraform-provider-azurerm/issues/3374))\n* **New Resource:** `azurerm_api_management_api_policy` ([#3367](https://github.com/hashicorp/terraform-provider-azurerm/issues/3367))\n* **New Resource:** `azurerm_api_management_product_policy` ([#3325](https://github.com/hashicorp/terraform-provider-azurerm/issues/3325))\n* **New Resource:** `azurerm_api_management_schema` ([#3357](https://github.com/hashicorp/terraform-provider-azurerm/issues/3357))\n* **New Resource:** `azurerm_cosmosdb_table` ([#3442](https://github.com/hashicorp/terraform-provider-azurerm/issues/3442))\n* **New Resource:** `azurerm_cosmosdb_cassandra_keyspace` ([#3442](https://github.com/hashicorp/terraform-provider-azurerm/issues/3442))\n* **New Resource:** `azurerm_cosmosdb_mongo_collection` ([#3459](https://github.com/hashicorp/terraform-provider-azurerm/issues/3459))\n* **New Resource:** `azurerm_cosmosdb_mongo_database` ([#3442](https://github.com/hashicorp/terraform-provider-azurerm/issues/3442))\n* **New Resource:** `azurerm_cosmosdb_sql_database` ([#3442](https://github.com/hashicorp/terraform-provider-azurerm/issues/3442))\n* **New Resource:** `azurerm_firewall_nat_rule_collection` ([#3218](https://github.com/hashicorp/terraform-provider-azurerm/issues/3218))\n* **New Resource:** `azurerm_data_factory_linked_service_data_lake_storage_gen2` ([#3425](https://github.com/hashicorp/terraform-provider-azurerm/issues/3425))\n* **New Resource:** `azurerm_network_profile` ([#2636](https://github.com/hashicorp/terraform-provider-azurerm/issues/2636))\n\nIMPROVEMENTS:\n\n* dependencies: updating `github.com/Azure/azure-sdk-for-go` to v29.0.0 ([#3335](https://github.com/hashicorp/terraform-provider-azurerm/issues/3335))\n* Data Source `azurerm_kubernetes_cluster` - exposing the `type` field within the `agent_pool_profile ` block ([#3424](https://github.com/hashicorp/terraform-provider-azurerm/issues/3424))\n* `azurerm_application_gateway` - support for the `autoscale_configuration` property ([#3353](https://github.com/hashicorp/terraform-provider-azurerm/issues/3353))\n* `azurerm_application_gateway` added validation to ensure `redirect_configuration_name` must not be set if either `backend_address_pool_name` or `backend_http_settings_name` is set ([#3340](https://github.com/hashicorp/terraform-provider-azurerm/issues/3340))\n* `azurerm_application_gateway` - support for `affinity_cookie_name` ([#3434](https://github.com/hashicorp/terraform-provider-azurerm/issues/3434))\n* `azurerm_application_gateway` - support for `disabled_rule_groups` ([#3394](https://github.com/hashicorp/terraform-provider-azurerm/issues/3394))\n* `azurerm_app_service_slot` - exporting the `site_credential` block ([#3444](https://github.com/hashicorp/terraform-provider-azurerm/issues/3444))\n* `azurerm_batch_pool` support for the `container_configuration` property ([#3311](https://github.com/hashicorp/terraform-provider-azurerm/issues/3311))\n* `azurerm_kubernetes_cluster` - support for the `api_server_authorized_ip_ranges` property ([#3262](https://github.com/hashicorp/terraform-provider-azurerm/issues/3262))\n* `azurerm_kubernetes_cluster` - support for setting `type` within the `agent_pool_profile` block (Agent Pools via Virtual Machine Scale Sets) ([#3424](https://github.com/hashicorp/terraform-provider-azurerm/issues/3424))\n* `azurerm_redis_cache` - support for disabling authentication ([#3389](https://github.com/hashicorp/terraform-provider-azurerm/issues/3389))\n* `azurerm_redis_cache` - make the `redis_configuration` block optional ([#3397](https://github.com/hashicorp/terraform-provider-azurerm/issues/3397))\n* `azurerm_sql_database` - support for the `read_scale` property ([#3377](https://github.com/hashicorp/terraform-provider-azurerm/issues/3377))\n* `azurerm_stream_analytics_job` - `tags` can now be set on the property ([#3329](https://github.com/hashicorp/terraform-provider-azurerm/issues/3329))\n* `azurerm_virtual_network_peering` - retrying provisioning the peering of the virtual network ([#3392](https://github.com/hashicorp/terraform-provider-azurerm/issues/3392))\n* `azurerm_virtual_machine_scale_set` - support for the `provision_after_extensions` property to chain multiple extensions together ([#2937](https://github.com/hashicorp/terraform-provider-azurerm/issues/2937))\n\nBUG FIXES:\n\n* Data Source: `azurerm_api_management` - correctly returning the hostname `portal` and `proxy` values ([#3385](https://github.com/hashicorp/terraform-provider-azurerm/issues/3385))\n* `azurerm_application_gateway` - will no longer prevent `default_backend_address_pool_name` and `redirect_configuration_name` from being set at the same time ([#3286](https://github.com/hashicorp/terraform-provider-azurerm/issues/3286))\n* `azurerm_application_gateway` prevent a potential panic in backend and probe validation ([#3438](https://github.com/hashicorp/terraform-provider-azurerm/issues/3438))\n* `azurerm_eventhub` - decrease minimum `partition_count` to correct value of `1` ([#3439](https://github.com/hashicorp/terraform-provider-azurerm/issues/3439))\n* `azurerm_eventhub_namespace` - decrease maximum `maximum_throughput_units` to correct value of `20` ([#3440](https://github.com/hashicorp/terraform-provider-azurerm/issues/3440))\n* `azurerm_firewall` - ensuring that the value for `subnet_id` within the `ip_configuration` block has the name `AzureFirewallSubnet` ([#3406](https://github.com/hashicorp/terraform-provider-azurerm/issues/3406))\n* `azurerm_managed_disk` - can now actually create `UltraSSD_LRS` disks ([#3453](https://github.com/hashicorp/terraform-provider-azurerm/issues/3453))\n* `azurerm_redis_configuration` - correctly display http errors encountered during creation ([#3397](https://github.com/hashicorp/terraform-provider-azurerm/issues/3397))\n* `azurerm_sql_database` - making the `collation` field case insensitive to work around a bug in the API ([#3137](https://github.com/hashicorp/terraform-provider-azurerm/issues/3137))\n* `azurerm_stream_analytics_output_eventhub` will now correctly set `format` for JSON output ([#3318](https://github.com/hashicorp/terraform-provider-azurerm/issues/3318))\n* `azurerm_app_service_plan` - supports `elastic` for the sku tier ([#3402](https://github.com/hashicorp/terraform-provider-azurerm/issues/3402))\n* `azurerm_application_gateway` - supports `disabled_rule_group` for waf configurations ([#3394](https://github.com/hashicorp/terraform-provider-azurerm/issues/3394))\n* `azurerm_application_gateway` - supports `exclusion` for waf configurations ([#3407](https://github.com/hashicorp/terraform-provider-azurerm/issues/3407))\n* `azurerm_application_gateway` - supports updating a `gateway_ip_configuration.x.subnet_id` ([#3437](https://github.com/hashicorp/terraform-provider-azurerm/issues/3437))\n\n## 1.27.1 (April 26, 2019)\n\nBUG FIXES:\n\n* provider will now only register available resource providers ([#3313](https://github.com/hashicorp/terraform-provider-azurerm/issues/3313))\n\n## 1.27.0 (April 26, 2019)\n\nNOTES:\n\n* This release includes a Terraform SDK upgrade with compatibility for Terraform v0.12. The provider remains backwards compatible with Terraform v0.11 and there should not be any significant behavioural changes. ([#2968](https://github.com/hashicorp/terraform-provider-azurerm/issues/2968))\n\n## 1.26.0 (April 25, 2019)\n\nIMPROVEMENTS:\n\n* `azurerm_app_service` - support for Java 11 ([#3270](https://github.com/hashicorp/terraform-provider-azurerm/issues/3270))\n* `azurerm_app_service_slot` - support for Java 11 ([#3270](https://github.com/hashicorp/terraform-provider-azurerm/issues/3270))\n* `azurerm_container_group` - support for the `identity` block ([#3243](https://github.com/hashicorp/terraform-provider-azurerm/issues/3243))\n\nBUG FIXES:\n\n* provider will work through proxies again ([#3301](https://github.com/hashicorp/terraform-provider-azurerm/issues/3301))\n\n## 1.25.0 (April 17, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_batch_certificate` ([#3097](https://github.com/hashicorp/terraform-provider-azurerm/issues/3097))\n* **New Data Source:** `azurerm_express_route_circuit` ([#3158](https://github.com/hashicorp/terraform-provider-azurerm/issues/3158))\n* **New Data Source:** `azurerm_firewall` ([#3235](https://github.com/hashicorp/terraform-provider-azurerm/issues/3235))\n* **New Data Source:** `azurerm_hdinsight_cluster` ([#3196](https://github.com/hashicorp/terraform-provider-azurerm/issues/3196))\n* **New Data Source:** `azurerm_stream_analytics_job` ([#3227](https://github.com/hashicorp/terraform-provider-azurerm/issues/3227))\n* **New Resource:** `azurerm_batch_certificate` ([#3097](https://github.com/hashicorp/terraform-provider-azurerm/issues/3097))\n* **New Resource:** `azurerm_data_factory` ([#3159](https://github.com/hashicorp/terraform-provider-azurerm/issues/3159))\n* **New Resource:** `azurerm_data_factory_dataset_mysql` ([#3267](https://github.com/hashicorp/terraform-provider-azurerm/issues/3267))\n* **New Resource:** `azurerm_data_factory_dataset_postgresql` ([#3267](https://github.com/hashicorp/terraform-provider-azurerm/issues/3267))\n* **New Resource:** `azurerm_data_factory_dataset_sql_server_table` ([#3236](https://github.com/hashicorp/terraform-provider-azurerm/issues/3236))\n* **New Resource:** `azurerm_data_factory_linked_service_sql_server` ([#3205](https://github.com/hashicorp/terraform-provider-azurerm/issues/3205))\n* **New Resource:** `azurerm_data_factory_linked_service_mysql` ([#3265](https://github.com/hashicorp/terraform-provider-azurerm/issues/3265))\n* **New Resource:** `azurerm_data_factory_linked_service_postgresql` ([#3266](https://github.com/hashicorp/terraform-provider-azurerm/issues/3266))\n* **New Resource:** `azurerm_data_factory_pipeline` ([#3244](https://github.com/hashicorp/terraform-provider-azurerm/issues/3244))\n* **New Resource:** `azurerm_hdinsight_kafka_cluster` ([#3196](https://github.com/hashicorp/terraform-provider-azurerm/issues/3196))\n* **New Resource:** `azurerm_hdinsight_kbase_cluster` ([#3196](https://github.com/hashicorp/terraform-provider-azurerm/issues/3196))\n* **New Resource:** `azurerm_hdinsight_hadoop_cluster` ([#3196](https://github.com/hashicorp/terraform-provider-azurerm/issues/3196))\n* **New Resource:** `azurerm_hdinsight_interactive_query_cluster` ([#3196](https://github.com/hashicorp/terraform-provider-azurerm/issues/3196))\n* **New Resource:** `azurerm_hdinsight_ml_services_cluster` ([#3196](https://github.com/hashicorp/terraform-provider-azurerm/issues/3196))\n* **New Resource:** `azurerm_hdinsight_rserver_cluster` ([#3196](https://github.com/hashicorp/terraform-provider-azurerm/issues/3196))\n* **New Resource:** `azurerm_hdinsight_spark_cluster` ([#3196](https://github.com/hashicorp/terraform-provider-azurerm/issues/3196))\n* **New Resource:** `azurerm_hdinsight_storm_cluster` ([#3196](https://github.com/hashicorp/terraform-provider-azurerm/issues/3196))\n* **New Resource:** `azurerm_iothub_shared_access_policy` ([#3009](https://github.com/hashicorp/terraform-provider-azurerm/issues/3009))\n* **New Resource:** `azurerm_public_ip_prefix` ([#3139](https://github.com/hashicorp/terraform-provider-azurerm/issues/3139))\n* **New Resource:** `azurerm_stream_analytics_job` ([#3227](https://github.com/hashicorp/terraform-provider-azurerm/issues/3227))\n* **New Resource:** `azurerm_stream_analytics_function_javascript_udf` ([#3249](https://github.com/hashicorp/terraform-provider-azurerm/issues/3249))\n* **New Resource:** `azurerm_stream_analytics_stream_input_blob` ([#3250](https://github.com/hashicorp/terraform-provider-azurerm/issues/3250))\n* **New Resource:** `azurerm_stream_analytics_stream_input_eventhub` ([#3250](https://github.com/hashicorp/terraform-provider-azurerm/issues/3250))\n* **New Resource:** `azurerm_stream_analytics_stream_input_iothub` ([#3250](https://github.com/hashicorp/terraform-provider-azurerm/issues/3250))\n* **New Resource:** `azurerm_stream_analytics_output_blob` ([#3250](https://github.com/hashicorp/terraform-provider-azurerm/issues/3250))\n* **New Resource:** `azurerm_stream_analytics_output_eventhub` ([#3250](https://github.com/hashicorp/terraform-provider-azurerm/issues/3250))\n* **New Resource:** `azurerm_stream_analytics_output_servicebus_queue` ([#3250](https://github.com/hashicorp/terraform-provider-azurerm/issues/3250))\n\nIMPROVEMENTS:\n\n\n* dependencies: updating `github.com/Azure/azure-sdk-for-go` to v26.7.0 ([#3126](https://github.com/hashicorp/terraform-provider-azurerm/issues/3126))\n* dependencies: updating `github.com/Azure/go-autorest` to v11.7.0 ([#3126](https://github.com/hashicorp/terraform-provider-azurerm/issues/3126))\n* dependencies: updating `github.com/hashicorp/terraform` to `44702fa6c163` ([#3181](https://github.com/hashicorp/terraform-provider-azurerm/issues/3181))\n* Data Source: `azurerm_batch_pool` - adding the `resource_file` block to the `start_task` block ([#3192](https://github.com/hashicorp/terraform-provider-azurerm/issues/3192))\n* Data Source: `azurerm_subnet` - exposing the `service_endpoint` field ([#3184](https://github.com/hashicorp/terraform-provider-azurerm/issues/3184))\n* `azurerm_batch_pool` - adding the `resource_file` block to the `start_task` block ([#3192](https://github.com/hashicorp/terraform-provider-azurerm/issues/3192))\n* `azurerm_container_group` - support for specifying `liveness_probe` and `readiness_probe` blocks ([#3118](https://github.com/hashicorp/terraform-provider-azurerm/issues/3118))\n* `azurerm_key_vault_access_policy` - support for setting `storage_permissions` ([#3153](https://github.com/hashicorp/terraform-provider-azurerm/issues/3153))\n* `azurerm_kubernetes_cluster` - `network_policy` now supports `azure` ([#3213](https://github.com/hashicorp/terraform-provider-azurerm/issues/3213))\n* `azurerm_iothub` - support for configuring `ip_filter_rule` ([#3173](https://github.com/hashicorp/terraform-provider-azurerm/issues/3173))\n* `azurerm_public_ip` - support for attaching a `azurerm_public_ip_prefix` ([#3139](https://github.com/hashicorp/terraform-provider-azurerm/issues/3139))\n* `azurerm_redis_cache` - support for setting `aof_backup_enabled`, `aof_storage_connection_string_0` and `aof_storage_connection_string_1` ([#3155](https://github.com/hashicorp/terraform-provider-azurerm/issues/3155))\n* `azurerm_storage_blob` - support for the `metadata` property ([#3206](https://github.com/hashicorp/terraform-provider-azurerm/issues/3206))\n* `azurerm_traffic_manager_profile` - support the `MultiValue` and `Weighted` values for the `traffic_routing_method` property ([#3207](https://github.com/hashicorp/terraform-provider-azurerm/issues/3207))\n* `azurerm_virtual_network_gateway` - support for the `VpnGw1AZ`, `VpnGw2AZ`, and `VpnGw3AZ` SKU's ([#3171](https://github.com/hashicorp/terraform-provider-azurerm/issues/3171))\n\nBUG FIXES:\n\n* dependencies: downgrading the Security API to `2017-08-01-preview` to work around a breaking API change ([#3269](https://github.com/hashicorp/terraform-provider-azurerm/issues/3269))\n* `azurerm_app_service` - removing Computed from the `use_32_bit_worker_process` property in the `site_config` block ([#3219](https://github.com/hashicorp/terraform-provider-azurerm/issues/3219))\n* `azurerm_app_service_slot` - removing Computed from the `use_32_bit_worker_process` property in the `site_config` block ([#3219](https://github.com/hashicorp/terraform-provider-azurerm/issues/3219))\n* `azurerm_batch_account` - temporarily treating the Resource Group Name as case insensitive to work around an API bug ([#3260](https://github.com/hashicorp/terraform-provider-azurerm/issues/3260))\n* `azurerm_batch_pool` - temporarily treating the Resource Group Name as case insensitive to work around an API bug ([#3260](https://github.com/hashicorp/terraform-provider-azurerm/issues/3260))\n* `azurerm_app_service` - ensuring deleted App Services are detected correctly ([#3198](https://github.com/hashicorp/terraform-provider-azurerm/issues/3198))\n* `azurerm_function_app` - ensuring deleted Function Apps are detected correctly ([#3198](https://github.com/hashicorp/terraform-provider-azurerm/issues/3198))\n* `azurerm_virtual_machine` - adding validation for the `identity_ids` field ([#3183](https://github.com/hashicorp/terraform-provider-azurerm/issues/3183))\n\n## 1.24.0 (April 03, 2019)\n\nUPGRADE NOTES:\n\n* `azurerm_kubernetes_cluster` - `ssh_key` is now limited to a single element to reflect what the API expects ([#3099](https://github.com/hashicorp/terraform-provider-azurerm/issues/3099))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_api_management_api` ([#3010](https://github.com/hashicorp/terraform-provider-azurerm/issues/3010))\n* **New Resource:** `azurerm_api_management_api` ([#3010](https://github.com/hashicorp/terraform-provider-azurerm/issues/3010))\n* **New Resource:** `azurerm_api_management_api_operation` ([#3121](https://github.com/hashicorp/terraform-provider-azurerm/issues/3121))\n* **New Resource:** `azurerm_api_management_api_version_set` ([#3073](https://github.com/hashicorp/terraform-provider-azurerm/issues/3073))\n* **New Resource:** `azurerm_api_management_authorization_server` ([#3123](https://github.com/hashicorp/terraform-provider-azurerm/issues/3123))\n* **New Resource:** `azurerm_api_management_certificate` ([#3141](https://github.com/hashicorp/terraform-provider-azurerm/issues/3141))\n* **New Resource:** `azurerm_api_management_logger` ([#2994](https://github.com/hashicorp/terraform-provider-azurerm/issues/2994))\n* **New Resource:** `azurerm_api_management_openid_connect_provider` ([#3143](https://github.com/hashicorp/terraform-provider-azurerm/issues/3143))\n* **New Resource:** `azurerm_api_management_product_api` ([#3066](https://github.com/hashicorp/terraform-provider-azurerm/issues/3066))\n* **New Resource:** `azurerm_api_management_subscription` ([#3103](https://github.com/hashicorp/terraform-provider-azurerm/issues/3103))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_app_service` - exporting the `cors` headers ([#2870](https://github.com/hashicorp/terraform-provider-azurerm/issues/2870))\n* Data Source: `azurerm_storage_account` - exposing the Hierarchical Namespace state ([#3032](https://github.com/hashicorp/terraform-provider-azurerm/issues/3032))\n* `azurerm_api_management` - support for `sign_in`, `sign_up` and `policy` blocks ([#3151](https://github.com/hashicorp/terraform-provider-azurerm/issues/3151))\n* `azurerm_app_service` - support for migrating between App Service Plans ([#3048](https://github.com/hashicorp/terraform-provider-azurerm/issues/3048))\n* `azurerm_app_service` - support for additional types for the `scm_type` field in the `site_config` block ([#3019](https://github.com/hashicorp/terraform-provider-azurerm/issues/3019))\n* `azurerm_app_service` - support for specifying `cors` headers ([#2870](https://github.com/hashicorp/terraform-provider-azurerm/issues/2870))\n* `azurerm_app_service_slot` - support for specifying `cors` headers ([#2870](https://github.com/hashicorp/terraform-provider-azurerm/issues/2870))\n* `azurerm_app_service_slot` - support for additional types for the `scm_type` field in the `site_config` block ([#3019](https://github.com/hashicorp/terraform-provider-azurerm/issues/3019))\n* `azurerm_application_gateway` - support for WAF configuration properties `request_body_check` and `max_request_body_size_kb` ([#3093](https://github.com/hashicorp/terraform-provider-azurerm/issues/3093))\n* `azurerm_application_gateway` - support for the `hostname` property ([#2990](https://github.com/hashicorp/terraform-provider-azurerm/issues/2990))\n* `azurerm_application_gateway` - support for redirect rules ([#2908](https://github.com/hashicorp/terraform-provider-azurerm/issues/2908))\n* `azurerm_application_gateway` - support for `zones` ([#3144](https://github.com/hashicorp/terraform-provider-azurerm/issues/3144))\n* `azurerm_batch_account` - now exports the `primary_access_key`, `secondary_access_key`, and `account_endpoint` properties ([#3071](https://github.com/hashicorp/terraform-provider-azurerm/issues/3071))\n* `azurerm_container_group` - support for attaching GPU's ([#3053](https://github.com/hashicorp/terraform-provider-azurerm/issues/3053))\n* `azurerm_eventhub` - support for the `skip_empty_archives` property ([#3074](https://github.com/hashicorp/terraform-provider-azurerm/issues/3074))\n* `azurerm_eventhub_namespace` - increase maximum `maximum_throughput_units` to 100 ([#3049](https://github.com/hashicorp/terraform-provider-azurerm/issues/3049))\n* `azurerm_function_app` - exporting `possible_outbound_ip_addresses` ([#3043](https://github.com/hashicorp/terraform-provider-azurerm/issues/3043))\n* `azurerm_iothub` - properties `batch_frequency_in_seconds`, `max_chunk_size_in_bytes`, `encoding`, `container_name`, `file_name_format` are now correctly diff'd depending on the type ([#2951](https://github.com/hashicorp/terraform-provider-azurerm/issues/2951))\n* `azurerm_image` - support for the `zone_resilient` property ([#3100](https://github.com/hashicorp/terraform-provider-azurerm/issues/3100))\n* `azurerm_kubernetes_cluster` - support for the `network_profile` property ([#2987](https://github.com/hashicorp/terraform-provider-azurerm/issues/2987))\n* `azurerm_key_vault` - support for the `storage_permissions` property ([#3081](https://github.com/hashicorp/terraform-provider-azurerm/issues/3081))\n* `azurerm_managed_disk` - support for managed disks up to 32TB ([#3062](https://github.com/hashicorp/terraform-provider-azurerm/issues/3062))\n* `azurerm_mssql_elasticpool` - support setting the `zone_redundant` property ([#3104](https://github.com/hashicorp/terraform-provider-azurerm/issues/3104))\n* `azurerm_redis_cache` - support for the `minimum_tls_version` property ([#3111](https://github.com/hashicorp/terraform-provider-azurerm/issues/3111))\n* `azurerm_storage_account` - support for configuring the Hierarchical Namespace state ([#3032](https://github.com/hashicorp/terraform-provider-azurerm/issues/3032))\n* `azurerm_storage_account` - exposing the DFS File Secondary and Web endpoints ([#3110](https://github.com/hashicorp/terraform-provider-azurerm/issues/3110))\n* `azurerm_virtual_machine` - support for managed disks up to 32TB ([#3062](https://github.com/hashicorp/terraform-provider-azurerm/issues/3062))\n* `azurerm_virtual_machine_scale_set` - support for managed disks up to 32TB ([#3062](https://github.com/hashicorp/terraform-provider-azurerm/issues/3062))\n\nBUG FIXES:\n\n* `azurerm_application_gateway` - correctly populating backend addresses from both new and deprecated properties `fqdns`/`fqdn_list` ([#3085](https://github.com/hashicorp/terraform-provider-azurerm/issues/3085))\n* `azurerm_key_vault_certificate` - making `contents` and `password` within the `certificate` block sensitive ([#3064](https://github.com/hashicorp/terraform-provider-azurerm/issues/3064))\n* `monitor_metric_alert` - support for setting `aggregation` to `count`  ([#3047](https://github.com/hashicorp/terraform-provider-azurerm/issues/3047))\n* `azurerm_virtual_network_gateway` - fixing a crash when `bgp_settings` had no elements ([#3038](https://github.com/hashicorp/terraform-provider-azurerm/issues/3038))\n* `azurerm_virtual_machine_scale_set` - support setting `zones` to an empty list ([#3142](https://github.com/hashicorp/terraform-provider-azurerm/issues/3142))\n\n## 1.23.0 (March 08, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_api_management_group` ([#2809](https://github.com/hashicorp/terraform-provider-azurerm/issues/2809))\n* **New Data Source:** `azurerm_api_management_product` ([#2953](https://github.com/hashicorp/terraform-provider-azurerm/issues/2953))\n* **New Data Source:** `azurerm_api_management_user` ([#2954](https://github.com/hashicorp/terraform-provider-azurerm/issues/2954))\n* **New Data Source:** `azurerm_availability_set` ([#2850](https://github.com/hashicorp/terraform-provider-azurerm/issues/2850))\n* **New Data Source:** `azurerm_network_watcher` ([#2791](https://github.com/hashicorp/terraform-provider-azurerm/issues/2791))\n* **New Data Source:** `azurerm_recovery_services_protection_policy_vm` ([#2974](https://github.com/hashicorp/terraform-provider-azurerm/issues/2974))\n* **New Resource:** `azurerm_api_management_group` ([#2809](https://github.com/hashicorp/terraform-provider-azurerm/issues/2809))\n* **New Resource:** `azurerm_api_management_group_user` ([#2972](https://github.com/hashicorp/terraform-provider-azurerm/issues/2972))\n* **New Resource:** `azurerm_api_management_product` ([#2953](https://github.com/hashicorp/terraform-provider-azurerm/issues/2953))\n* **New Resource:** `azurerm_api_management_product_group` ([#2984](https://github.com/hashicorp/terraform-provider-azurerm/issues/2984))\n* **New Resource:** `azurerm_api_management_property` ([#2986](https://github.com/hashicorp/terraform-provider-azurerm/issues/2986))\n* **New Resource:** `azurerm_api_management_user` ([#2954](https://github.com/hashicorp/terraform-provider-azurerm/issues/2954))\n* **New Resource:** `azurerm_connection_monitor` ([#2791](https://github.com/hashicorp/terraform-provider-azurerm/issues/2791))\n* **New Resource:** `azurerm_eventgrid_domain` ([#2884](https://github.com/hashicorp/terraform-provider-azurerm/issues/2884))\n* **New Resource:** `azurerm_eventgrid_event_subscription` ([#2967](https://github.com/hashicorp/terraform-provider-azurerm/issues/2967))\n* **New Resource:** `azurerm_lb_outbound_rule` ([#2912](https://github.com/hashicorp/terraform-provider-azurerm/issues/2912))\n* **New Resource:** `azurerm_media_service_account` ([#2711](https://github.com/hashicorp/terraform-provider-azurerm/issues/2711))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to v25.1.0 of `github.com/Azure/azure-sdk-for-go` ([#2886](https://github.com/hashicorp/terraform-provider-azurerm/issues/2886))\n* dependencies: upgrading to v11.4.0 of `github.com/Azure/go-autorest` ([#2886](https://github.com/hashicorp/terraform-provider-azurerm/issues/2886))\n* `azurerm_application_gateway` - support for setting `path` within the `backend_http_settings` block ([#2879](https://github.com/hashicorp/terraform-provider-azurerm/issues/2879))\n* `azurerm_application_gateway` - support for setting `connection_draining` to the `backend_http_settings` ([#2778](https://github.com/hashicorp/terraform-provider-azurerm/issues/2778))\n* `azurerm_container_group` - support for specifying the `diagnostics` block ([#2763](https://github.com/hashicorp/terraform-provider-azurerm/issues/2763))\n* `azurerm_iothub` - support for the `fallback_route` property ([#2764](https://github.com/hashicorp/terraform-provider-azurerm/issues/2764))\n* `azurerm_key_vault` - support for 1024 `access_policy` blocks ([#2866](https://github.com/hashicorp/terraform-provider-azurerm/issues/2866))\n* `azurerm_redis_cache` - support for configuring the `maxfragmentationmemory_reserved` in the `redis_configuration` block ([#2887](https://github.com/hashicorp/terraform-provider-azurerm/issues/2887))\n* `azurerm_servicebus_namespace` - allowing `capacity` to be set to `0` for non-Premium SKU's ([#2920](https://github.com/hashicorp/terraform-provider-azurerm/issues/2920))\n* `azurerm_service_fabric_cluster` - support for setting `capacities` and `placement_properties` ([#2936](https://github.com/hashicorp/terraform-provider-azurerm/issues/2936))\n* `azurerm_storage_account` - exposing primary/secondary `_host` attributes ([#2792](https://github.com/hashicorp/terraform-provider-azurerm/issues/2792))\n\nBUG FIXES:\n\n* `azurerm_api_management` - switching to use API version `2018-01-01` rather than `2018-06-01-preview` ([#2958](https://github.com/hashicorp/terraform-provider-azurerm/issues/2958))\n* `azurerm_application_gateway` - updating the default value for `file_upload_limit_mb` within the `waf_configuration` block to be `100` to match the documentation ([#3012](https://github.com/hashicorp/terraform-provider-azurerm/issues/3012))\n* `azurerm_batch_pool` - updating `max_tasks_per_node` to be ForceNew ([#2856](https://github.com/hashicorp/terraform-provider-azurerm/issues/2856))\n* `azurerm_key_vault_access_policy` - no longer silently fails on creation of the `key_vault_id` property is invalid/doesn't exist ([#2922](https://github.com/hashicorp/terraform-provider-azurerm/issues/2922))\n* `azurerm_policy_definition` - making the `metadata` field to computed ([#2939](https://github.com/hashicorp/terraform-provider-azurerm/issues/2939))\n* `azurerm_redis_firewall_rule` - allowing underscores in the `name` field ([#2906](https://github.com/hashicorp/terraform-provider-azurerm/issues/2906))\n* `azurerm_iothub` - marking the `connection_string` property as sensitive ([#3007](https://github.com/hashicorp/terraform-provider-azurerm/issues/3007))\n* `azurerm_iothub` - ensuring the `type` property is always set ([#3007](https://github.com/hashicorp/terraform-provider-azurerm/issues/3007))\n\n## 1.22.1 (February 14, 2019)\n\nBUG FIXES:\n\n* `azurerm_key_vault_access_policy` - will no longer fail to find the Key Vault if `key_vault_id` is empty ([#2874](https://github.com/hashicorp/terraform-provider-azurerm/issues/2874))\n* `azurerm_key_vault_certificate` - will no longer fail to find the Key Vault if `key_vault_id` is ([#2874](https://github.com/hashicorp/terraform-provider-azurerm/issues/2874))\n* `azurerm_key_vault_key` - will no longer fail to find the Key Vault if `key_vault_id` is ([#2874](https://github.com/hashicorp/terraform-provider-azurerm/issues/2874))\n* `azurerm_key_vault_secret` - will no longer fail to find the Key Vault if `key_vault_id` is ([#2874](https://github.com/hashicorp/terraform-provider-azurerm/issues/2874))\n* `azurerm_storage_container` - support for large numbers of containers within a storage account ([#2873](https://github.com/hashicorp/terraform-provider-azurerm/issues/2873))\n\n## 1.22.0 (February 11, 2019)\n\nUPGRADE NOTES:\n\n* The v1.22 release includes a few new resources which are duplicates of existing resources, the purpose of this is to correct some invalid naming so that we can remove the mis-named resources in the next major version of the Provider. Please see [the upgrade guide](https://www.terraform.io/docs/providers/azurerm/guides/migrating-between-renamed-resources.html) for more information on how to migrate between these resources.\n* The `azurerm_builtin_role_definition` Data Source has been deprecated in favour of the `azurerm_role_definition` Data Source, which now provides the same functionality and will be removed in the next major version of the AzureRM Provider (2.0) ([#2798](https://github.com/hashicorp/terraform-provider-azurerm/issues/2798))\n* The `azurerm_log_analytics_workspace_linked_service` resource has been deprecated in favour of the (new) `azurerm_log_analytics_linked_service` resource and will be removed in the next major version of the AzureRM Provider (2.0) ([#2768](https://github.com/hashicorp/terraform-provider-azurerm/issues/2768))\n* The `azurerm_autoscale_setting` resource has been deprecated in favour of the (new) `azurerm_monitor_autoscale_setting` resource and will be removed in the next major version of the AzureRM Provider (2.0) ([#2768](https://github.com/hashicorp/terraform-provider-azurerm/issues/2768))\n* The `azurerm_metric_alertrule` resource has been deprecated in favour of the (new) `azurerm_monitor_metric_alertrule` resource and will be removed in the next major version of the AzureRM Provider (2.0) ([#2762](https://github.com/hashicorp/terraform-provider-azurerm/issues/2762))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_policy_definition` ([#2788](https://github.com/hashicorp/terraform-provider-azurerm/issues/2788))\n* **New Data Source:** `azurerm_servicebus_namespace` ([#2841](https://github.com/hashicorp/terraform-provider-azurerm/issues/2841))\n* **New Resource:** `azurerm_ddos_protection_plan` ([#2654](https://github.com/hashicorp/terraform-provider-azurerm/issues/2654))\n* **New Resource:** `azurerm_log_analytics_linked_service ` ([#2768](https://github.com/hashicorp/terraform-provider-azurerm/issues/2768))\n* **New Resource:** `azurerm_monitor_autoscale_setting` ([#2768](https://github.com/hashicorp/terraform-provider-azurerm/issues/2768))\n* **New Resource:** `azurerm_monitor_metric_alertrule` ([#2762](https://github.com/hashicorp/terraform-provider-azurerm/issues/2762))\n* **New Resource:** `azurerm_network_interface_application_security_group_association` ([#2789](https://github.com/hashicorp/terraform-provider-azurerm/issues/2789))\n\nDEPRECATIONS:\n\n* Data Source `azurerm_key_vault_key` - deprecating the `vault_uri` property in favour of `key_vault_id` ([#2820](https://github.com/hashicorp/terraform-provider-azurerm/issues/2820))\n* Data Source `azurerm_key_vault_secret` - deprecating the `vault_uri` property in favour of `key_vault_id` ([#2820](https://github.com/hashicorp/terraform-provider-azurerm/issues/2820))\n* `azurerm_key_vault_certificate` - deprecating the `vault_uri` property in favour of `key_vault_id` ([#2820](https://github.com/hashicorp/terraform-provider-azurerm/issues/2820))\n* `azurerm_key_vault_key` - deprecating the `vault_uri` property in favour of `key_vault_id` ([#2820](https://github.com/hashicorp/terraform-provider-azurerm/issues/2820))\n* `azurerm_key_vault_access_policy` - deprecating the `vault_name` and `resource_group_name` properties in favour of `key_vault_id` ([#2820](https://github.com/hashicorp/terraform-provider-azurerm/issues/2820))\n* `azurerm_key_vault_secret` - deprecating the `vault_uri` property in favour of `key_vault_id` ([#2820](https://github.com/hashicorp/terraform-provider-azurerm/issues/2820))\n* `azurerm_application_gateway` - deprecating the `fqdn_list` field in favour of `fqdns` ([#2768](https://github.com/hashicorp/terraform-provider-azurerm/issues/2768))\n* `azurerm_application_gateway` - deprecating the `ip_address_list` field in favour of `ip_addresses` ([#2768](https://github.com/hashicorp/terraform-provider-azurerm/issues/2768))\n* `azurerm_builtin_role_definition` - deprecating in favour of the `azurerm_role_definition` data source, which now provides the same functionality ([#2798](https://github.com/hashicorp/terraform-provider-azurerm/issues/2798))\n* `azurerm_log_analytics_workspace_linked_service` - deprecating in favour of the (renamed) `azurerm_log_analytics_linked_service` resource ([#2768](https://github.com/hashicorp/terraform-provider-azurerm/issues/2768))\n* `azurerm_monitor_autoscale_setting` - deprecating in favour of the (renamed) `azurerm_autoscale_setting` resource ([#2768](https://github.com/hashicorp/terraform-provider-azurerm/issues/2768))\n* `azurerm_network_interface ` - deprecating the `application_security_group_ids` field in favour of the new `azurerm_network_interface_application_security_group_association` resource ([#2789](https://github.com/hashicorp/terraform-provider-azurerm/issues/2789))\n\nIMPROVEMENTS:\n\n* dependencies: switching to Go Modules ([#2705](https://github.com/hashicorp/terraform-provider-azurerm/issues/2705))\n* dependencies: upgrading to v11.3.2 of github.com/Azure/go-autorest ([#2744](https://github.com/hashicorp/terraform-provider-azurerm/issues/2744))\n* Data Source: `azurerm_role_definition` - support for finding roles by name ([#2798](https://github.com/hashicorp/terraform-provider-azurerm/issues/2798))\n* `azurerm_application_gateway` - support for the `http2` property ([#2735](https://github.com/hashicorp/terraform-provider-azurerm/issues/2735))\n* `azurerm_application_gateway` - support for the `file_upload_limit_mb` property ([#2666](https://github.com/hashicorp/terraform-provider-azurerm/issues/2666))\n* `azurerm_application_gateway` - support for the `custom_error_configuration` property ([#2783](https://github.com/hashicorp/terraform-provider-azurerm/issues/2783))\n* `azurerm_application_gateway` - Support for `pick_host_name_from_backend_address` and `pick_host_name_from_backend_http_settings` properties ([#2658](https://github.com/hashicorp/terraform-provider-azurerm/issues/2658))\n* `azurerm_app_service` - support for the `client_cert_enabled` property ([#2765](https://github.com/hashicorp/terraform-provider-azurerm/issues/2765))\n* `azurerm_autoscale_setting` - support values from `0` to `1000` for the `minimum`, `maximum` and `default` properties ([#2815](https://github.com/hashicorp/terraform-provider-azurerm/issues/2815))\n* `azurerm_batch_pool` - support for the `max_tasks_per_node` property ([#2805](https://github.com/hashicorp/terraform-provider-azurerm/issues/2805))\n* `azurerm_cognitive_account` - exporting `primary_access_key` and `secondary_access_key` ([#2825](https://github.com/hashicorp/terraform-provider-azurerm/issues/2825))\n* `azurerm_cosmosdb_account` - support for the `EnableAggregationPipeline`, `MongoDBv3.4` and ` mongoEnableDocLevelTTL` capabilities ([#2715](https://github.com/hashicorp/terraform-provider-azurerm/issues/2715))\n* `azurerm_data_lake_store_file` - support file uploads greater then 4 megabytes ([#2633](https://github.com/hashicorp/terraform-provider-azurerm/issues/2633))\n* `azurerm_function_app` - support for linux via the `linux_fx_version` property ([#2767](https://github.com/hashicorp/terraform-provider-azurerm/issues/2767))\n* `azurerm_mssql_elasticpool` - support for setting `max_size_bytes` ([#2346](https://github.com/hashicorp/terraform-provider-azurerm/issues/2346))\n* `azurerm_mssql_elasticpool` - support for setting `max_size_gb` ([#2695](https://github.com/hashicorp/terraform-provider-azurerm/issues/2695))\n* `azurerm_postgresql_server` - support for version `10` and `10.2` ([#2768](https://github.com/hashicorp/terraform-provider-azurerm/issues/2768))\n* `azurerm_kubernetes_cluster` - add additional validation ([#2772](https://github.com/hashicorp/terraform-provider-azurerm/issues/2772))\n* `azurerm_signalr_service` - exporting `primary_access_key`, `secondary_access_key`, `primary_connection_string` and `secondary_connection_string` and secondary access keys and connection strings ([#2655](https://github.com/hashicorp/terraform-provider-azurerm/issues/2655))\n* `azurerm_subnet` - support for additional subnet delegation types ([#2667](https://github.com/hashicorp/terraform-provider-azurerm/issues/2667))\n\nBUG FIXES:\n\n* `azurerm_azuread_application` - fixing a bug where `reply_uris` was set incorrectly ([#2729](https://github.com/hashicorp/terraform-provider-azurerm/issues/2729))\n* `azurerm_batch_pool` - can now set multiple environment variables ([#2685](https://github.com/hashicorp/terraform-provider-azurerm/issues/2685))\n* `azurerm_cosmosdb_account` - prevent occasional error when deleting the resource ([#2702](https://github.com/hashicorp/terraform-provider-azurerm/issues/2702))\n* `azurerm_cosmosdb_account` - allow empty values for the `ip_range_filter` property ([#2713](https://github.com/hashicorp/terraform-provider-azurerm/issues/2713))\n* `azurerm_express_route_circuit` - added the `premium` SKU back to validation logic ([#2692](https://github.com/hashicorp/terraform-provider-azurerm/issues/2692))\n* `azurerm_firewall` - ensuring rules aren't removed during an update ([#2663](https://github.com/hashicorp/terraform-provider-azurerm/issues/2663))\n* `azurerm_notification_hub_namespace` - now polls on creation to handle eventual consistency ([#2701](https://github.com/hashicorp/terraform-provider-azurerm/issues/2701))\n* `azurerm_redis_cache` - locking on the Virtual Network/Subnet name to avoid a race condition ([#2725](https://github.com/hashicorp/terraform-provider-azurerm/issues/2725))\n* `azurerm_service_bus_subscription` - name's can now start with a digit ([#2672](https://github.com/hashicorp/terraform-provider-azurerm/issues/2672))\n* `azurerm_security_center` - increase the creation timeout to `30m` ([#2724](https://github.com/hashicorp/terraform-provider-azurerm/issues/2724))\n* `azurerm_service_fabric_cluster` - no longer pass `reverse_proxy_endpoint_port` to the API when not specified ([#2747](https://github.com/hashicorp/terraform-provider-azurerm/issues/2747))\n* `azurerm_subnet` - fixing a crash when service endpoints was nil ([#2742](https://github.com/hashicorp/terraform-provider-azurerm/issues/2742))\n* `azurerm_subnet` - will no longer lose service endpoints during a virtual network update ([#2738](https://github.com/hashicorp/terraform-provider-azurerm/issues/2738))\n\n## 1.21.0 (January 11, 2019)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_application_insights` ([#2625](https://github.com/hashicorp/terraform-provider-azurerm/issues/2625))\n* **New Data Source:** `azurerm_batch_account` ([#2428](https://github.com/hashicorp/terraform-provider-azurerm/issues/2428))\n* **New Data Source:** `azurerm_batch_pool` ([#2461](https://github.com/hashicorp/terraform-provider-azurerm/issues/2461))\n* **New Data Source:** `azurerm_lb` ([#2354](https://github.com/hashicorp/terraform-provider-azurerm/issues/2354))\n* **New Data Source:** `azurerm_lb_backend_address_pool` ([#2354](https://github.com/hashicorp/terraform-provider-azurerm/issues/2354))\n* **New Data Source:** `azurerm_virtual_machine` ([#2463](https://github.com/hashicorp/terraform-provider-azurerm/issues/2463))\n* **New Resource:** `azurerm_application_insights_api_key` ([#2556](https://github.com/hashicorp/terraform-provider-azurerm/issues/2556))\n* **New Resource:** `azurerm_batch_account` ([#2428](https://github.com/hashicorp/terraform-provider-azurerm/issues/2428))\n* **New Resource:** `azurerm_batch_pool` ([#2461](https://github.com/hashicorp/terraform-provider-azurerm/issues/2461))\n* **New Resource:** `azurerm_firewall_application_rule_collection` ([#2532](https://github.com/hashicorp/terraform-provider-azurerm/issues/2532))\n* **New Resource:** `azurerm_policy_set_definition` ([#2535](https://github.com/hashicorp/terraform-provider-azurerm/issues/2535))\n\nIMPROVEMENTS:\n\n* config: support for specifying the `partner_id` for partner resource attribution ([#2643](https://github.com/hashicorp/terraform-provider-azurerm/issues/2643))\n* dependencies: updating to `v24.0.0` of `Azure/azure-sdk-for-go` ([#2572](https://github.com/hashicorp/terraform-provider-azurerm/issues/2572))\n* dependencies: upgrading the `network` SDK to `2018-08-01` ([#2433](https://github.com/hashicorp/terraform-provider-azurerm/issues/2433))\n* Data Source: `azurerm_app_service` - exporting the `possible_outbound_ip_addresses` ([#2513](https://github.com/hashicorp/terraform-provider-azurerm/issues/2513))\n* Data Source: `azurerm_azuread_application` - deprecating in favour of the split-out AzureAD Provider ([#2632](https://github.com/hashicorp/terraform-provider-azurerm/issues/2632))\n* Data Source: `azurerm_azuread_service_principal` - deprecating in favour of the split-out AzureAD Provider ([#2632](https://github.com/hashicorp/terraform-provider-azurerm/issues/2632))\n* Data Source: `azurerm_container_registry` - now exports `tags` ([#2607](https://github.com/hashicorp/terraform-provider-azurerm/issues/2607))\n* Data Source: `azurerm_network_interface` - now exports `ip_configuration.private_ip_address_version` ([#2646](https://github.com/hashicorp/terraform-provider-azurerm/issues/2646))\n* Data Source: `azurerm_public_ip` - now exports `location`, `sku`, `allocation_method`, `reverse_fqdn` and `zones` ([#2576](https://github.com/hashicorp/terraform-provider-azurerm/issues/2576))\n* `azurerm_app_service` - exporting the `possible_outbound_ip_addresses` ([#2513](https://github.com/hashicorp/terraform-provider-azurerm/issues/2513))\n* `azurerm_azuread_application` - deprecating in favour of the split-out AzureAD Provider ([#2632](https://github.com/hashicorp/terraform-provider-azurerm/issues/2632))\n* `azurerm_azuread_service_principal` - deprecating in favour of the split-out AzureAD Provider ([#2632](https://github.com/hashicorp/terraform-provider-azurerm/issues/2632))\n* `azurerm_azuread_service_principal_password` - deprecating in favour of the split-out AzureAD Provider ([#2632](https://github.com/hashicorp/terraform-provider-azurerm/issues/2632))\n* `azurerm_cognitive_account` - support for the `SpeechServices` kind ([#2583](https://github.com/hashicorp/terraform-provider-azurerm/issues/2583))\n* `azurerm_container_group` - deprecated container properties `port` and `protocol` for ports allowing for multiple ports ([#1930](https://github.com/hashicorp/terraform-provider-azurerm/issues/1930))\n* `azurerm_eventhub_namespace` - support for `kafka_enabled` ([#2395](https://github.com/hashicorp/terraform-provider-azurerm/issues/2395))\n* `azurerm_firewall` - renaming the `public_ip_address_id` property to `ip_address_id` ([#2433](https://github.com/hashicorp/terraform-provider-azurerm/issues/2433))\n* `azurerm_kubernetes_cluster` - support for Virtual Nodes ([#2641](https://github.com/hashicorp/terraform-provider-azurerm/issues/2641))\n* `azurerm_kubernetes_cluster` - the `dns_prefix` now forces a new resource and is properly validated ([#2611](https://github.com/hashicorp/terraform-provider-azurerm/issues/2611))\n* `azurerm_log_analytics_workspace_linked_service` - now correctly handles uppercase `workspace_name` values  ([#2594](https://github.com/hashicorp/terraform-provider-azurerm/issues/2594))\n* `azurerm_network_interface` - support for IPv6 addresses ([#2548](https://github.com/hashicorp/terraform-provider-azurerm/issues/2548))\n* `azurerm_policy_assignment` - support for Managed Service Identity ([#2549](https://github.com/hashicorp/terraform-provider-azurerm/issues/2549))\n* `azurerm_policy_assignment` - support exclusions with the `not_scopes` property ([#2620](https://github.com/hashicorp/terraform-provider-azurerm/issues/2620))\n* `azurerm_policy_definition` - polices can now be assigned to a management group ([#2490](https://github.com/hashicorp/terraform-provider-azurerm/issues/2490))\n* `azurerm_policy_set_definition` - policy sets can now be assigned to a management group ([#2618](https://github.com/hashicorp/terraform-provider-azurerm/issues/2618))\n* `azurerm_public_ip` - deprecated `public_ip_address_allocation` in favour of `allocation_method` to better match the SDK ([#2576](https://github.com/hashicorp/terraform-provider-azurerm/issues/2576))\n* `azurerm_redis_cache` - add availability zone support ([#2580](https://github.com/hashicorp/terraform-provider-azurerm/issues/2580))\n* `azurerm_service_fabric_cluster` - support for `azure_active_directory` ([#2553](https://github.com/hashicorp/terraform-provider-azurerm/issues/2553))\n* `azurerm_service_fabric_cluster` - support for `reverse_proxy_certificate` ([#2544](https://github.com/hashicorp/terraform-provider-azurerm/issues/2544))\n* `azurerm_service_fabric_cluster` - support for `reverse_proxy_endpoint_port` ([#2544](https://github.com/hashicorp/terraform-provider-azurerm/issues/2544))\n* `azurerm_subnet` - support for delegation ([#2042](https://github.com/hashicorp/terraform-provider-azurerm/issues/2042))\n\nBUG FIXES:\n\n* Data Source: `azurerm_managed_disk` - exposing the `create_option` field ([#2597](https://github.com/hashicorp/terraform-provider-azurerm/issues/2597))\n* Data Source: `azurerm_network_interface` - exposing `application_security_group_ids` within the `ip_configuration` block ([#2599](https://github.com/hashicorp/terraform-provider-azurerm/issues/2599))\n* Data Source: `azurerm_snapshot` - ensuring `disk_size_gb` is set ([#2596](https://github.com/hashicorp/terraform-provider-azurerm/issues/2596))\n* Data Source: `azurerm_storage_account` - ensuring the `account_replication_type` field is set correctly ([#2595](https://github.com/hashicorp/terraform-provider-azurerm/issues/2595))\n* `azurerm_app_service` - handling connection strings being in any order ([#2609](https://github.com/hashicorp/terraform-provider-azurerm/issues/2609))\n* `azurerm_app_service_slot` - handling connection strings being in any order ([#2609](https://github.com/hashicorp/terraform-provider-azurerm/issues/2609))\n* `azurerm_network_security_rule` - the properties `source_application_security_group_ids` and `destination_application_security_group_ids` are now correctly read & imported ([#2558](https://github.com/hashicorp/terraform-provider-azurerm/issues/2558))\n* `azurerm_role_assignment` - retrieving the role definition name during import ([#2565](https://github.com/hashicorp/terraform-provider-azurerm/issues/2565))\n* `azurerm_template_deployment` - fixing regression and supporting nested template deployments ([#2514](https://github.com/hashicorp/terraform-provider-azurerm/issues/2514))\n\n## 1.20.0 (December 12, 2018)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_monitor_action_group` ([#2430](https://github.com/hashicorp/terraform-provider-azurerm/issues/2430))\n* **New Resource:** `azurerm_mariadb_database` ([#2445](https://github.com/hashicorp/terraform-provider-azurerm/issues/2445))\n* **New Resource:** `azurerm_mariadb_server` ([#2406](https://github.com/hashicorp/terraform-provider-azurerm/issues/2406))\n* **New Resource:** `azurerm_signalr_service` ([#2410](https://github.com/hashicorp/terraform-provider-azurerm/issues/2410))\n\nIMPROVEMENTS:\n\n* authentication: switching to use the shared Azure authentication library ([#2355](https://github.com/hashicorp/terraform-provider-azurerm/issues/2355))\n* authentication: support for authenticating using a Service Principal with a Client Certificate ([#2471](https://github.com/hashicorp/terraform-provider-azurerm/issues/2471))\n* authentication: requesting a token using the audience address ([#2381](https://github.com/hashicorp/terraform-provider-azurerm/issues/2381))\n* authentication: switching to request tokens from the Azure CLI ([#2387](https://github.com/hashicorp/terraform-provider-azurerm/issues/2387))\n* sdk: upgrading to version `2018-05-01` of the Policy API ([#2386](https://github.com/hashicorp/terraform-provider-azurerm/issues/2386))\n* Data Source: `azurerm_kubernetes_cluster` - support for Role Based Access Control without Microsoft Entra ID ([#2495](https://github.com/hashicorp/terraform-provider-azurerm/issues/2495))\n* Data Source: `azurerm_kubernetes_cluster` - exposing the `clusterAdmin` credentials ([#2495](https://github.com/hashicorp/terraform-provider-azurerm/issues/2495))\n* Data Source: `azurerm_subscriptions` - ability to filtering by prefix/contains on the Display Name ([#2429](https://github.com/hashicorp/terraform-provider-azurerm/issues/2429))\n* `azurerm_app_service` - support for configuring `app_command_line` in the `site_config` block ([#2350](https://github.com/hashicorp/terraform-provider-azurerm/issues/2350))\n* `azurerm_app_service_plan` - deprecated the `properties` and moved `app_service_environment_id`, `per_site_scaling` and `reserved` to the top level  ([#2442](https://github.com/hashicorp/terraform-provider-azurerm/issues/2442))\n* `azurerm_app_service_slot` - support for configuring `app_command_line` in the `site_config` block ([#2350](https://github.com/hashicorp/terraform-provider-azurerm/issues/2350))\n* `azurerm_application_insights` - added `Node.JS` application type ([#2407](https://github.com/hashicorp/terraform-provider-azurerm/issues/2407))\n* `azurerm_container_registry` - support for geo-replication via the `georeplication_locations` property ([#2055](https://github.com/hashicorp/terraform-provider-azurerm/issues/2055))\n* `azurerm_key_vault` - exposed `backup` and `restore` permissions made `key_permissions` and `secret_permissions` optional ([#2363](https://github.com/hashicorp/terraform-provider-azurerm/issues/2363))\n* `azurerm_kubernetes_cluster` - support for Role Based Access Control without Microsoft Entra ID ([#2495](https://github.com/hashicorp/terraform-provider-azurerm/issues/2495))\n* `azurerm_kubernetes_cluster` - exposing the `clusterAdmin` credentials ([#2495](https://github.com/hashicorp/terraform-provider-azurerm/issues/2495))\n* `azurerm_mssql_elasticpool` - deprecated the `elastic_pool_properties` property and moved `max_size_bytes` and `zone_redundant` to the top level ([#2378](https://github.com/hashicorp/terraform-provider-azurerm/issues/2378))\n* `azurerm_mysql_server` - support for new skus `GP_Gen5_64` and `MO_Gen5_32` ([#2446](https://github.com/hashicorp/terraform-provider-azurerm/issues/2446))\n* `azurerm_postgresql_server` support for new skus `GP_Gen5_64` and `MO_Gen5_32` - ([#2447](https://github.com/hashicorp/terraform-provider-azurerm/issues/2447))\n\nBUG FIXES:\n\n* Data Source: `azurerm_logic_app_workflow` - ensuing the parameters are a string prior to flattening ([#2348](https://github.com/hashicorp/terraform-provider-azurerm/issues/2348))\n* Data Source: `azurerm_public_ip` - ensuing properties always exist ([#2448](https://github.com/hashicorp/terraform-provider-azurerm/issues/2448))\n* Data Source: `azurerm_route_table` - validation updated to prevent empty and blank `property` values from causing a panic ([#2467](https://github.com/hashicorp/terraform-provider-azurerm/issues/2467))\n* `azurerm_key_vault` - fixing a deadlock situation where multiple subnets are used from the same virtual network ([#2324](https://github.com/hashicorp/terraform-provider-azurerm/issues/2324))\n* `azurerm_eventhub` - making the `partition_count` field ForceNew ([#2400](https://github.com/hashicorp/terraform-provider-azurerm/issues/2400))\n* `azurerm_eventhub` - now validates that the `storage_account_id` is a proper resource ID  ([#2374](https://github.com/hashicorp/terraform-provider-azurerm/issues/2374))\n* `azurerm_mssql_elasticpool` - relaxed validation of the `name` property ([#2398](https://github.com/hashicorp/terraform-provider-azurerm/issues/2398))\n* `azurerm_recovery_services_protection_policy_vm` - added the `timezone` property ([#2404](https://github.com/hashicorp/terraform-provider-azurerm/issues/2404))\n* `azurerm_route_table` - validation updated to prevent empty and blank `property` values from causing a panic ([#2467](https://github.com/hashicorp/terraform-provider-azurerm/issues/2467))\n* `azurerm_sql_server` - only updating the `admin_login_password` when it's changed, allowing this to be managed outside of Terraform ([#2263](https://github.com/hashicorp/terraform-provider-azurerm/issues/2263))\n* `azurerm_virtual_machine` - nil-checking properties prior to accessing ([#2365](https://github.com/hashicorp/terraform-provider-azurerm/issues/2365))\n\n## 1.19.0 (November 15, 2018)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_key_vault_key` ([#2231](https://github.com/hashicorp/terraform-provider-azurerm/issues/2231))\n* **New Data Source:** `azurerm_monitor_diagnostic_setting` ([#1291](https://github.com/hashicorp/terraform-provider-azurerm/issues/1291))\n* **New Resource:** `azurerm_iothub_consumer_group` ([#2243](https://github.com/hashicorp/terraform-provider-azurerm/issues/2243))\n* **New Resource:** `azurerm_monitor_diagnostic_setting` ([#1291](https://github.com/hashicorp/terraform-provider-azurerm/issues/1291))\n* **New Resource:** `azurerm_mssql_elasticpool` ([#2071](https://github.com/hashicorp/terraform-provider-azurerm/issues/2071))\n\nIMPROVEMENTS:\n\n* dependencies: switching to Go 1.11 ([#2229](https://github.com/hashicorp/terraform-provider-azurerm/issues/2229))\n* authentication: refactoring to allow authentication modes to be feature-toggled ([#2199](https://github.com/hashicorp/terraform-provider-azurerm/issues/2199))\n* Data Source: `azurerm_kubernetes_cluster` - support for `role_based_access_control` ([#1820](https://github.com/hashicorp/terraform-provider-azurerm/issues/1820))\n* `azurerm_app_service` - support for PHP 7.2 ([#2308](https://github.com/hashicorp/terraform-provider-azurerm/issues/2308))\n* `azurerm_app_service_slot` - support for PHP 7.2 ([#2308](https://github.com/hashicorp/terraform-provider-azurerm/issues/2308))\n* `azurerm_databricks_workspace` - fixing validation on the `name` field ([#2221](https://github.com/hashicorp/terraform-provider-azurerm/issues/2221))\n* `azurerm_function_app` - support for the `enable_builtin_logging` property ([#2268](https://github.com/hashicorp/terraform-provider-azurerm/issues/2268))\n* `azurerm_kubernetes_cluster` - support for `role_based_access_control` ([#1820](https://github.com/hashicorp/terraform-provider-azurerm/issues/1820))\n* `azurerm_network_interface` - deprecating `internal_fqdn` since it's no longer setable/returned by Azure ([#2253](https://github.com/hashicorp/terraform-provider-azurerm/issues/2253))\n* `azurerm_shared_image_version` - allowing larger numbers for versions ([#2301](https://github.com/hashicorp/terraform-provider-azurerm/issues/2301))\n* `azurerm_virtual_machine` - support for assigning both a system and a user managed identity ([#2188](https://github.com/hashicorp/terraform-provider-azurerm/issues/2188))\n* `azurerm_virtual_machine_scale_set` - support for assigning both a system and a user managed identity ([#2188](https://github.com/hashicorp/terraform-provider-azurerm/issues/2188))\n* `azurerm_virtual_machine_scale_set` - support for setting `eviction_policy` ([#2226](https://github.com/hashicorp/terraform-provider-azurerm/issues/2226))\n* `azurerm_virtual_network_gateway` - support for Zone Redundant Gateways ([#2260](https://github.com/hashicorp/terraform-provider-azurerm/issues/2260))\n\nBUG FIXES:\n\n* Data Source: `azurerm_api_management` - ensuring the `public_ip_addresses` field is set ([#2310](https://github.com/hashicorp/terraform-provider-azurerm/issues/2310))\n* `azurerm_api_management` - ensuring the `public_ip_addresses` field is set ([#2310](https://github.com/hashicorp/terraform-provider-azurerm/issues/2310))\n* `azurerm_application_gateway` - refactoring to ensure all fields are set ([#2054](https://github.com/hashicorp/terraform-provider-azurerm/issues/2054))\n* `azurerm_application_gateway` - SSL certificates no longer continually diff ([#2054](https://github.com/hashicorp/terraform-provider-azurerm/issues/2054))\n* `azurerm_azuread_application` - fix regression and allow `http` for `identifier_uris` and `reply_urls` properties ([#2320](https://github.com/hashicorp/terraform-provider-azurerm/issues/2320))\n* `azurerm_cosmosdb_account` - the `ip_range_filter` range filter now allows /32 ip addresses  ([#2222](https://github.com/hashicorp/terraform-provider-azurerm/issues/2222))\n* `azurerm_public_ip` - fixing the casing of the `ip_version` / `public_ip_address_allocation` fields ([#2296](https://github.com/hashicorp/terraform-provider-azurerm/issues/2296))\n* `azurerm_recovery_services_protected_vm` - VM can now be in a different resource group then the vault ([#2287](https://github.com/hashicorp/terraform-provider-azurerm/issues/2287))\n* `azurerm_role_assignment` - will now wait after a Service Principal is created ([#2204](https://github.com/hashicorp/terraform-provider-azurerm/issues/2204))\n* `azurerm_route` - allowing setting `next_hop_in_ip_address` to an empty value ([#2184](https://github.com/hashicorp/terraform-provider-azurerm/issues/2184))\n* `azurerm_route_table` - allowing setting `next_hop_in_ip_address` to an empty value ([#2184](https://github.com/hashicorp/terraform-provider-azurerm/issues/2184))\n* `azurerm_virtual_network_gateway` - plan is now empty when `bgp_settings` is omitted ([#2304](https://github.com/hashicorp/terraform-provider-azurerm/issues/2304))\n* `azurerm_virtual_network` - add validation to prevent panics ([#2305](https://github.com/hashicorp/terraform-provider-azurerm/issues/2305))\n\n## 1.18.0 (November 02, 2018)\n\nFEATURES:\n\n* **New Resource:** `azurerm_devspace_controller` ([#2086](https://github.com/hashicorp/terraform-provider-azurerm/issues/2086))\n* **New Resource:** `azurerm_log_analytics_workspace_linked_service` ([#2139](https://github.com/hashicorp/terraform-provider-azurerm/issues/2139))\n\nIMPROVEMENTS:\n\n* authentication: decoupling the authentication methods from the provider to enable splitting out the authentication library ([#2197](https://github.com/hashicorp/terraform-provider-azurerm/issues/2197))\n* authentication: using the Proxy from the Environment, if set ([#2133](https://github.com/hashicorp/terraform-provider-azurerm/issues/2133))\n* dependencies: upgrading to v21.3.0 of `github.com/Azure/azure-sdk-for-go` ([#2163](https://github.com/hashicorp/terraform-provider-azurerm/issues/2163))\n* refactoring:  decoupling Resource Provider Registration to enable splitting out the authentication library ([#2197](https://github.com/hashicorp/terraform-provider-azurerm/issues/2197))\n* sdk: upgrading to `2018-10-01` of the `containerinstance` sdk ([#2174](https://github.com/hashicorp/terraform-provider-azurerm/issues/2174))\n* `azurerm_automation_account` - exposing `dsc_server_endpoint`, `dsc_primary_access_key`, `dsc_secondary_access_key` properties ([#2166](https://github.com/hashicorp/terraform-provider-azurerm/issues/2166))\n* `azurerm_automation_account` - support for the `free` SKU ([#2166](https://github.com/hashicorp/terraform-provider-azurerm/issues/2166))\n* `azurerm_client_config` - ensuring the `service_principal_application_id` and `service_principal_object_id` are always set ([#2120](https://github.com/hashicorp/terraform-provider-azurerm/issues/2120))\n* `azurerm_cosmosdb_account` - support for the `enable_multiple_write_locations` property ([#2109](https://github.com/hashicorp/terraform-provider-azurerm/issues/2109))\n* `azurerm_eventhub_namespace` - allow `maximum_throughput_units` to be zero ([#2124](https://github.com/hashicorp/terraform-provider-azurerm/issues/2124))\n* `azurerm_key_vault_certificate` - support for setting `extended_key_usage` ([#2128](https://github.com/hashicorp/terraform-provider-azurerm/issues/2128))\n* `azurerm_key_vault_certificate` - support for setting `subject_alternative_names` ([#2123](https://github.com/hashicorp/terraform-provider-azurerm/issues/2123))\n* `azurerm_managed_disk` - support for the `UltraSSD_LRS` storage account type ([#2118](https://github.com/hashicorp/terraform-provider-azurerm/issues/2118))\n* `azurerm_monitor_activity_log_alert` - support the criteria fields `resource_provider`, `resource_type`, `resource_group` ([#2150](https://github.com/hashicorp/terraform-provider-azurerm/issues/2150))\n* `azurerm_recovery_services_protected_vm` - `backup_policy_id` is now required ([#2154](https://github.com/hashicorp/terraform-provider-azurerm/issues/2154))\n* `azurerm_sql_database` - adding validation to `requested_service_objective_name` ([#2125](https://github.com/hashicorp/terraform-provider-azurerm/issues/2125))\n* `azurerm_virtual_network_gateway` - support for `OpenVPN` as a client protocol option ([#2126](https://github.com/hashicorp/terraform-provider-azurerm/issues/2126))\n* `azurerm_virtual_machine_scale_set` - support for the `application_security_group_ids` property of `ip_configuration`  ([#2009](https://github.com/hashicorp/terraform-provider-azurerm/issues/2009))\n* `azurerm_virtual_machine_scale_set` - support for a Rolling Upgrade Policy with Automatic OS upgrades ([#922](https://github.com/hashicorp/terraform-provider-azurerm/issues/922))\n\nBUG FIXES:\n\n* security: removing the `Authorization` header from the debug logs ([#2131](https://github.com/hashicorp/terraform-provider-azurerm/issues/2131))\n* `azurerm_api_management` - validating the Key Vault Secret ID for the `key_vault_id` field in the `hostname_configuration` block ([#2189](https://github.com/hashicorp/terraform-provider-azurerm/issues/2189))\n* `azurerm_function_app` - correctly marking the resource as missing upon manual deletion ([#2111](https://github.com/hashicorp/terraform-provider-azurerm/issues/2111))\n* `azurerm_kubernetes_cluster` - changing `os_disk_size_gb` to computed as the API now returns a valid default ([#2117](https://github.com/hashicorp/terraform-provider-azurerm/issues/2117))\n* `azurerm_public_ip` - `domain_name_label` validation now allows 63 characters ([#2122](https://github.com/hashicorp/terraform-provider-azurerm/issues/2122))\n* `azurerm_virtual_machine` - making `availability_set_id` conflict with `zones` ([#2185](https://github.com/hashicorp/terraform-provider-azurerm/issues/2185))\n\n\n## 1.17.0 (October 18, 2018)\n\nUPGRADE NOTES:\n\n* `azurerm_virtual_machine_scale_set` - the field `primary` within the `ip_configuration` block within the `network_profile` block is now Required, to match behavioural changes in the Azure API. ([#2035](https://github.com/hashicorp/terraform-provider-azurerm/issues/2035))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_monitor_log_profile` ([#1792](https://github.com/hashicorp/terraform-provider-azurerm/issues/1792))\n* **New Resource:** `azurerm_api_management` ([#1516](https://github.com/hashicorp/terraform-provider-azurerm/issues/1516))\n* **New Resource:** `azurerm_automation_dsc_configuration` ([#1512](https://github.com/hashicorp/terraform-provider-azurerm/issues/1512))\n* **New Resource:** `azurerm_automation_dsc_nodeconfiguration` ([#1512](https://github.com/hashicorp/terraform-provider-azurerm/issues/1512))\n* **New Resource:** `azurerm_automation_module` ([#1512](https://github.com/hashicorp/terraform-provider-azurerm/issues/1512))\n* **New Resource:** `azurerm_cognitive_account` ([#962](https://github.com/hashicorp/terraform-provider-azurerm/issues/962))\n* **New Resource:** `azurerm_databricks_workspace` ([#1134](https://github.com/hashicorp/terraform-provider-azurerm/issues/1134))\n* **New Resource:** `azurerm_dev_test_policy` ([#2070](https://github.com/hashicorp/terraform-provider-azurerm/issues/2070))\n* **New Resource:** `azurerm_dev_test_linux_virtual_machine` ([#2058](https://github.com/hashicorp/terraform-provider-azurerm/issues/2058))\n* **New Resource:** `azurerm_dev_test_windows_virtual_machine` ([#2058](https://github.com/hashicorp/terraform-provider-azurerm/issues/2058))\n* **New Resource:** `azurerm_monitor_activitylog_alert` ([#1989](https://github.com/hashicorp/terraform-provider-azurerm/issues/1989))\n* **New Resource:** `azurerm_monitor_metric_alert` ([#2026](https://github.com/hashicorp/terraform-provider-azurerm/issues/2026))\n* **New Resource:** `azurerm_monitor_log_profile` ([#1792](https://github.com/hashicorp/terraform-provider-azurerm/issues/1792))\n* **New Resource:** `azurerm_network_interface_application_gateway_backend_address_pool_association` ([#2079](https://github.com/hashicorp/terraform-provider-azurerm/issues/2079))\n* **New Resource:** `azurerm_network_interface_backend_address_pool_association` ([#2079](https://github.com/hashicorp/terraform-provider-azurerm/issues/2079))\n* **New Resource:** `azurerm_network_interface_nat_rule_association` ([#2079](https://github.com/hashicorp/terraform-provider-azurerm/issues/2079))\n* **New Resource:** `azurerm_recovery_services_protection_policy_vm` ([#1978](https://github.com/hashicorp/terraform-provider-azurerm/issues/1978))\n* **New Resource:** ` azurerm_recovery_services_protected_vm` ([#1637](https://github.com/hashicorp/terraform-provider-azurerm/issues/1637))\n* **New Resource:** `azurerm_security_center_contact` ([#2045](https://github.com/hashicorp/terraform-provider-azurerm/issues/2045))\n* **New Resource:** `azurerm_security_center_subscription_pricing` ([#2043](https://github.com/hashicorp/terraform-provider-azurerm/issues/2043))\n* **New Resource:** `azurerm_security_center_workspace` ([#2072](https://github.com/hashicorp/terraform-provider-azurerm/issues/2072))\n* **New Resource:** `azurerm_subnet_network_security_group_association` ([#1933](https://github.com/hashicorp/terraform-provider-azurerm/issues/1933))\n* **New Resource:** `azurerm_subnet_route_table_association ` ([#1933](https://github.com/hashicorp/terraform-provider-azurerm/issues/1933))\n\nBUG FIXES:\n\n* Data Source `azurerm_subnet` - fixing the ordering of the resource group name and network name in the error message ([#2017](https://github.com/hashicorp/terraform-provider-azurerm/issues/2017))\n* `azurerm_kubernetes_cluster` - using the correct casing for the `addon_profile` `oms_agent` property ([#1995](https://github.com/hashicorp/terraform-provider-azurerm/issues/1995))\n* `azurerm_service_bus_queue` - support for `max_delivery_count` ([#2028](https://github.com/hashicorp/terraform-provider-azurerm/issues/2028))\n* `azurerm_redis_cache` - `capacity` can now be successfully changed ([#2088](https://github.com/hashicorp/terraform-provider-azurerm/issues/2088))\n* `azurerm_virtual_machine_scale_set` - `primary` is now required within the `ip_configuration` block within `network_profile` (matching a behavioural change with the Azure API) ([#2035](https://github.com/hashicorp/terraform-provider-azurerm/issues/2035))\n\nIMPROVEMENTS:\n\n* `azurerm_application_gateway` - support for the `StandardV2` and `WAFV2` skus and tiers ([#2015](https://github.com/hashicorp/terraform-provider-azurerm/issues/2015))\n* `azurerm_container_group` - adding the `secure_environment_variables` property ([#2024](https://github.com/hashicorp/terraform-provider-azurerm/issues/2024))\n* `azurerm_dev_test_virtual_network` - support for managing the Subnet ([#2041](https://github.com/hashicorp/terraform-provider-azurerm/issues/2041))\n* `azurerm_key_vault` - support for Virtual Network Rules ([#2027](https://github.com/hashicorp/terraform-provider-azurerm/issues/2027))\n* `azurerm_kubernetes_cluster` - changing the `oms_agent` property no longer forces a new resource ([#2021](https://github.com/hashicorp/terraform-provider-azurerm/issues/2021))\n* `azurerm_postgresql_virtual_network_rule` - support for the `ignore_missing_vnet_service_endpoint` ([#2056](https://github.com/hashicorp/terraform-provider-azurerm/issues/2056))\n* `azurerm_public_ip` - support for IPv6 addresses ([#2019](https://github.com/hashicorp/terraform-provider-azurerm/issues/2019))\n* `azurerm_search_service` - adding the administrative `primary_key` and `secondary_key` properties ([#2074](https://github.com/hashicorp/terraform-provider-azurerm/issues/2074))\n* `azurerm_role_definition` - adding the `data_actions` and `not_data_actions` to the data source ([#2110](https://github.com/hashicorp/terraform-provider-azurerm/issues/2110))\n* `azurerm_storage_container` - changing `container_access_type` no longer forces a new resource ([#2075](https://github.com/hashicorp/terraform-provider-azurerm/issues/2075))\n* `azurerm_user_assigned_identity` - now exports the `client_id` property ([#2078](https://github.com/hashicorp/terraform-provider-azurerm/issues/2078))\n\n\n## 1.16.0 (October 01, 2018)\n\nUPGRADE NOTES:\n\n* `azurerm_azuread_application` - the properties `homepage`, `identifier_uris` and `reply_urls` are now required to be `https` as required by Azure ([#1960](https://github.com/hashicorp/terraform-provider-azurerm/issues/1960))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_dev_test_lab` ([#1944](https://github.com/hashicorp/terraform-provider-azurerm/issues/1944))\n* **New Data Source:** `azurerm_shared_image` ([#1987](https://github.com/hashicorp/terraform-provider-azurerm/issues/1987))\n* **New Data Source**: `azurerm_shared_image_gallery` ([#1987](https://github.com/hashicorp/terraform-provider-azurerm/issues/1987))\n* **New Data Source:** `azurerm_shared_image_version` ([#1987](https://github.com/hashicorp/terraform-provider-azurerm/issues/1987))\n* **New Resource:** `azurerm_dev_test_lab` ([#1944](https://github.com/hashicorp/terraform-provider-azurerm/issues/1944))\n* **New Resource:** `azurerm_dev_test_virtual_network` ([#1944](https://github.com/hashicorp/terraform-provider-azurerm/issues/1944))\n* **New Resource:** `azurerm_shared_image` ([#1987](https://github.com/hashicorp/terraform-provider-azurerm/issues/1987))\n* **New Resource**: `azurerm_shared_image_gallery` ([#1987](https://github.com/hashicorp/terraform-provider-azurerm/issues/1987))\n* **New Resource:** `azurerm_shared_image_version` ([#1987](https://github.com/hashicorp/terraform-provider-azurerm/issues/1987))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to v21.0.0 of `github.com/Azure/azure-sdk-for-go` ([#1996](https://github.com/hashicorp/terraform-provider-azurerm/issues/1996))\n* `azurerm_cosmosdb_account` - adding the `is_virtual_network_filter_enabled` and `virtual_network_rule` properties ([#1961](https://github.com/hashicorp/terraform-provider-azurerm/issues/1961))\n\nBUG FIXES:\n\n* Data Source `azurerm_builtin_role_definition`: support for `data_actions` and `not_data_actions` ([#2000](https://github.com/hashicorp/terraform-provider-azurerm/issues/2000))\n* `azurerm_app_service_plan` - exposing additional information on failure ([#1926](https://github.com/hashicorp/terraform-provider-azurerm/issues/1926))\n* `azurerm_app_service_custom_hostname_binding` - handling multiple bindings being created in parallel ([#1970](https://github.com/hashicorp/terraform-provider-azurerm/issues/1970))\n* `azurerm_lb_rule` - allow `0` for `frontend_port` and `backend_port` again ([#1951](https://github.com/hashicorp/terraform-provider-azurerm/issues/1951))\n* `azurerm_public_ip` - correctly reading and importing the `idle_timeout_in_minutes` property ([#1925](https://github.com/hashicorp/terraform-provider-azurerm/issues/1925))\n* `azurerm_role_assignment` - only retry on errors when they are retryable ([#1934](https://github.com/hashicorp/terraform-provider-azurerm/issues/1934))\n* `azurerm_role_definition` - support for the `data_actions` and `not_data_action` blocks ([#1971](https://github.com/hashicorp/terraform-provider-azurerm/issues/1971))\n* `azurerm_service_fabric_cluster` - allow two `client_certificate_thumbprint` blocks ([#1938](https://github.com/hashicorp/terraform-provider-azurerm/issues/1938))\n* `azurerm_service_fabric_cluster` - support for specifying the `cluster_code_version` field ([#1945](https://github.com/hashicorp/terraform-provider-azurerm/issues/1945))\n* `azurerm_virtual_network` - exposing the `id` of each subnet ([#1913](https://github.com/hashicorp/terraform-provider-azurerm/issues/1913))\n* `azurerm_virtual_machine` - handling the Managed Disk ID being nil ([#1947](https://github.com/hashicorp/terraform-provider-azurerm/issues/1947))\n* `azurerm_virtual_machine_data_disk_attachment` - supporting data disk attachments when a VM Extension is installed ([#1950](https://github.com/hashicorp/terraform-provider-azurerm/issues/1950))\n* `azurerm_virtual_machine_scale_set` - making `admin_password` in the `os_profile` block optional again ([#1958](https://github.com/hashicorp/terraform-provider-azurerm/issues/1958))\n\n## 1.15.0 (September 14, 2018)\n\nFEATURES:\n\n* **New Resource:** `azurerm_firewall` ([#1627](https://github.com/hashicorp/terraform-provider-azurerm/issues/1627))\n* **New Resource:** `azurerm_firewall_network_rule_collection` ([#1627](https://github.com/hashicorp/terraform-provider-azurerm/issues/1627))\n* **New Resource:** `azurerm_mysql_virtual_network_rule` ([#1879](https://github.com/hashicorp/terraform-provider-azurerm/issues/1879))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to v20.1.0 of `github.com/Azure/azure-sdk-for-go` ([#1861](https://github.com/hashicorp/terraform-provider-azurerm/issues/1861))\n* dependencies: upgrading to v10.15.4 of `github.com/Azure/go-autorest` ([#1861](https://github.com/hashicorp/terraform-provider-azurerm/issues/1861)) ([#1909](https://github.com/hashicorp/terraform-provider-azurerm/issues/1909))\n* sdk: upgrading to version `2018-06-01` of the Compute API's ([#1861](https://github.com/hashicorp/terraform-provider-azurerm/issues/1861))\n* `azurerm_automation_runbook` - support for specifying the content field ([#1696](https://github.com/hashicorp/terraform-provider-azurerm/issues/1696))\n* `azurerm_app_service` - adding the `virtual_network_name` property ([#1896](https://github.com/hashicorp/terraform-provider-azurerm/issues/1896))\n* `azurerm_app_service_slot` - adding the `virtual_network_name` property ([#1896](https://github.com/hashicorp/terraform-provider-azurerm/issues/1896))\n* `azurerm_key_vault_certificate` - adding the `thumbprint` property ([#1904](https://github.com/hashicorp/terraform-provider-azurerm/issues/1904))\n* `azurerm_servicebus_queue` - adding validation for ISO8601 Durations ([#1921](https://github.com/hashicorp/terraform-provider-azurerm/issues/1921))\n* `azurerm_servicebus_topic` - adding validation for ISO8601 Durations ([#1921](https://github.com/hashicorp/terraform-provider-azurerm/issues/1921))\n* `azurerm_sql_database` - adding the `threat_detection_policy` property ([#1628](https://github.com/hashicorp/terraform-provider-azurerm/issues/1628))\n* `azurerm_virtual_network` - adding validation to `name` preventing empty values ([#1898](https://github.com/hashicorp/terraform-provider-azurerm/issues/1898))\n* `azurerm_virtual_machine` - support for the `managed_disk_type` of `StandardSSD_LRS` ([#1901](https://github.com/hashicorp/terraform-provider-azurerm/issues/1901))\n* `azurerm_virtual_machine_scale_set` - support for the `managed_disk_type` of `StandardSSD_LRS` ([#1901](https://github.com/hashicorp/terraform-provider-azurerm/issues/1901))\n* `azurerm_virtual_network_gateway` - additional validation ([#1899](https://github.com/hashicorp/terraform-provider-azurerm/issues/1899))\n\nBUG FIXES:\n\n* Data Source: `azurerm_azuread_service_principal` - passing a filter containing the name to Azure rather than querying locally ([#1862](https://github.com/hashicorp/terraform-provider-azurerm/issues/1862))\n* Data Source: `azurerm_azuread_service_principal` - passing a filter containing the name to Azure rather than querying locally ([#1862](https://github.com/hashicorp/terraform-provider-azurerm/issues/1862))\n* `azurerm_logic_app_trigger_http_request` - `relative_path` property now allows `/`s and `{}`s ([#1918](https://github.com/hashicorp/terraform-provider-azurerm/issues/1918))\n* `azurerm_role_assignment` - parsing the Resource ID during deletion ([#1887](https://github.com/hashicorp/terraform-provider-azurerm/issues/1887))\n* `azurerm_role_definition` - parsing the Resource ID during deletion ([#1887](https://github.com/hashicorp/terraform-provider-azurerm/issues/1887))\n* `azurerm_servicebus_namespace` - polling for the deletion of the namespace ([#1908](https://github.com/hashicorp/terraform-provider-azurerm/issues/1908))\n\n## 1.14.0 (September 06, 2018)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_management_group` ([#1877](https://github.com/hashicorp/terraform-provider-azurerm/issues/1877))\n* **New Resource:** `azurerm_management_group` ([#1788](https://github.com/hashicorp/terraform-provider-azurerm/issues/1788))\n* **New Resource:** `azurerm_postgresql_virtual_network_rule` ([#1774](https://github.com/hashicorp/terraform-provider-azurerm/issues/1774))\n\nIMPROVEMENTS:\n\n* authentication: making the client registration consistent ([#1845](https://github.com/hashicorp/terraform-provider-azurerm/issues/1845))\n* `azurerm_application_insights` - support for the `MobileCenter` kind ([#1878](https://github.com/hashicorp/terraform-provider-azurerm/issues/1878))\n* `azurerm_function_app` - removing validation from the `version` field ([#1872](https://github.com/hashicorp/terraform-provider-azurerm/issues/1872))\n* `azurerm_iothub` - exporting the `event_hub_events_endpoint`, `event_hub_events_path`, `event_hub_operations_endpoint` and `event_hub_operations_path` fields ([#1789](https://github.com/hashicorp/terraform-provider-azurerm/issues/1789))\n* `azurerm_iothub` - support for `endpoint` and `route` blocks ([#1693](https://github.com/hashicorp/terraform-provider-azurerm/issues/1693))\n* `azurerm_kubernetes_cluster` - making `linux_profile` optional ([#1821](https://github.com/hashicorp/terraform-provider-azurerm/issues/1821))\n* `azurerm_storage_blob` - support for import ([#1816](https://github.com/hashicorp/terraform-provider-azurerm/issues/1816))\n* `azurerm_storage_container` - support for import ([#1816](https://github.com/hashicorp/terraform-provider-azurerm/issues/1816))\n* `azurerm_storage_queue` - support for import ([#1816](https://github.com/hashicorp/terraform-provider-azurerm/issues/1816))\n* `azurerm_storage_table` - support for import ([#1816](https://github.com/hashicorp/terraform-provider-azurerm/issues/1816))\n\nBUG FIXES:\n\n* `azurerm_data_lake_store_file` - updating the Resource ID to match the file path ([#1856](https://github.com/hashicorp/terraform-provider-azurerm/issues/1856))\n* `azurerm_eventhub` - updating the validation to support periods, hyphens and underscores ([#1795](https://github.com/hashicorp/terraform-provider-azurerm/issues/1795))\n* `azurerm_eventhub_authorization_rule` - updating the validation error ([#1795](https://github.com/hashicorp/terraform-provider-azurerm/issues/1795))\n* `azurerm_eventhub_consumer_group` - updating the validation to support periods, hyphens and underscores ([#1795](https://github.com/hashicorp/terraform-provider-azurerm/issues/1795))\n* `azurerm_eventhub_namespace` - updating the validation error ([#1795](https://github.com/hashicorp/terraform-provider-azurerm/issues/1795))\n* `azurerm_function_app` - support for names in upper-case ([#1835](https://github.com/hashicorp/terraform-provider-azurerm/issues/1835))\n* `azurerm_kubernetes_cluster` - removing validation for the `pod_cidr` field when `network_plugin` is set to `azure` ([#1798](https://github.com/hashicorp/terraform-provider-azurerm/issues/1798))\n* `azurerm_logic_app_workflow` - ensuring parameters are strings ([#1843](https://github.com/hashicorp/terraform-provider-azurerm/issues/1843))\n* `azurerm_virtual_machine` - setting the `image_uri` property within the `storage_os_disk` block ([#1799](https://github.com/hashicorp/terraform-provider-azurerm/issues/1799))\n* `azurerm_virtual_machine_data_disk_attachment` - obtaining a basic view, rather than the entire instance view of the Virtual Machine to work around an issue in the API ([#1855](https://github.com/hashicorp/terraform-provider-azurerm/issues/1855))\n\n## 1.13.0 (August 15, 2018)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_log_analytics_workspace` ([#1755](https://github.com/hashicorp/terraform-provider-azurerm/issues/1755))\n* **New Resource:** `azurerm_monitor_action_group` ([#1725](https://github.com/hashicorp/terraform-provider-azurerm/issues/1725))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to `2018-04-01` of the IoTHub SDK ([#1717](https://github.com/hashicorp/terraform-provider-azurerm/issues/1717))\n* Azure CLI Auth - using the `USERPROFILE` environment variable to locate the users home directory, if set ([#1718](https://github.com/hashicorp/terraform-provider-azurerm/issues/1718))\n* Data Source `azurerm_kubernetes_cluster` - exposing the `max_pods` field within the `agent_pool_profile` block ([#1753](https://github.com/hashicorp/terraform-provider-azurerm/issues/1753))\n* Data Source: `azurerm_kubernetes_cluster` - exposing the `add_on_profile` block ([#1751](https://github.com/hashicorp/terraform-provider-azurerm/issues/1751))\n* `azurerm_automation_schedule` - adding the `week_days`, `month_days` and `monthly_occurrence` properties ([#1626](https://github.com/hashicorp/terraform-provider-azurerm/issues/1626))\n* `azurerm_container_group` - adding a new `commands` field / deprecating the `command` field ([#1740](https://github.com/hashicorp/terraform-provider-azurerm/issues/1740))\n* `azurerm_iothub` - support for the `Basic` SKU ([#1717](https://github.com/hashicorp/terraform-provider-azurerm/issues/1717))\n* `azurerm_kubernetes_cluster` - support for `max_pods` within the `agent_pool_profile` block ([#1753](https://github.com/hashicorp/terraform-provider-azurerm/issues/1753))\n* `azurerm_kubernetes_cluster` - support for the `add_on_profile` block ([#1751](https://github.com/hashicorp/terraform-provider-azurerm/issues/1751))\n* `azurerm_kubernetes_cluster` - validation for when `pod_cidr` is set with a `network_plugin` set to `azure` ([#1763](https://github.com/hashicorp/terraform-provider-azurerm/issues/1763))\n* `azurerm_kubernetes_cluster` - `client_id` and `client_secret` in the `service_principal` block are now ForceNew ([#1737](https://github.com/hashicorp/terraform-provider-azurerm/issues/1737))\n* `azurerm_kubernetes_cluster` - `docker_bridge_cidr`, `dns_service_ip` and `service_cidr` are now conditionally set ([#1715](https://github.com/hashicorp/terraform-provider-azurerm/issues/1715))\n* `azurerm_lb_nat_rule` - `protocol` property now supports `All` ([#1736](https://github.com/hashicorp/terraform-provider-azurerm/issues/1736))\n* `azurerm_lb_nat_pool` - `protocol` property now supports `All` ([#1748](https://github.com/hashicorp/terraform-provider-azurerm/issues/1748))\n* `azurerm_lb_probe` - `protocol` property now supports `Https` ([#1742](https://github.com/hashicorp/terraform-provider-azurerm/issues/1742))\n* `azurerm_lb_rule` - support for the `All` protocol / adding validation ([#1754](https://github.com/hashicorp/terraform-provider-azurerm/issues/1754))\n\nBUG FIXES:\n\n* `azurerm_application_insights` - handling a `HTTP 201` being returned from the Create API which working around a breaking change in the API ([#1769](https://github.com/hashicorp/terraform-provider-azurerm/issues/1769))\n* `azurerm_autoscale_setting` - filtering out the `$tags` tag ([#1770](https://github.com/hashicorp/terraform-provider-azurerm/issues/1770))\n* `azurerm_eventhub` - allowing underscores in the name field ([#1768](https://github.com/hashicorp/terraform-provider-azurerm/issues/1768))\n* `azurerm_eventhub_authorization_rule` - allowing underscores in the name field ([#1768](https://github.com/hashicorp/terraform-provider-azurerm/issues/1768))\n* `azurerm_eventhub_consumer_group` - allowing underscores in the name field ([#1768](https://github.com/hashicorp/terraform-provider-azurerm/issues/1768))\n\n## 1.12.0 (August 03, 2018)\n\nUPGRADE NOTES:\n\n* **Please Note:** When upgrading to v1.12.0 of the Azure Provider, you may need to specify the `priority` of any VM Scale Sets created between v1.6 of the Provider and v1.12. ([#1586](https://github.com/hashicorp/terraform-provider-azurerm/issues/1586))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_container_registry` ([#1642](https://github.com/hashicorp/terraform-provider-azurerm/issues/1642))\n* **New Resource:** `azurerm_service_fabric_cluster` ([#4](https://github.com/hashicorp/terraform-provider-azurerm/issues/4))\n\nIMPROVEMENTS:\n\n* sdk: switching from `WaitForCompletion` -> `WaitForCompletionRef` when polling Future's ([#1660](https://github.com/hashicorp/terraform-provider-azurerm/issues/1660))\n* Data Source: `azurerm_kubernetes_cluster` - support for specifying the `network_profile` block ([#1479](https://github.com/hashicorp/terraform-provider-azurerm/issues/1479))\n* Data Source: `azurerm_kubernetes_cluster` - outputting the `node_resource_group` field ([#1649](https://github.com/hashicorp/terraform-provider-azurerm/issues/1649))\n* `azurerm_kubernetes_cluster` - support for specifying the `network_profile` block ([#1479](https://github.com/hashicorp/terraform-provider-azurerm/issues/1479))\n* `azurerm_kubernetes_cluster` - outputting the `node_resource_group` field ([#1649](https://github.com/hashicorp/terraform-provider-azurerm/issues/1649))\n* `azurerm_role_assignment` - retrying resource creation to match the Azure CLI's behaviour ([#1647](https://github.com/hashicorp/terraform-provider-azurerm/issues/1647))\n* `azurerm_virtual_machine` - setting the connection information for Provisioners ([#1646](https://github.com/hashicorp/terraform-provider-azurerm/issues/1646))\n\n\nBUG FIXES:\n\n* `azurerm_virtual_machine_scale_set` - removing the default of `priority`, since this isn't set on older instances. ([#1586](https://github.com/hashicorp/terraform-provider-azurerm/issues/1586))\n\n## 1.11.0 (July 25, 2018)\n\nFEATURES:\n\n* **New Resource:** `azurerm_data_lake_store_file` ([#1261](https://github.com/hashicorp/terraform-provider-azurerm/issues/1261))\n\nIMPROVEMENTS:\n\n* `azurerm_app_service` - support for `min_tls_version` in the `site_config` block ([#1601](https://github.com/hashicorp/terraform-provider-azurerm/issues/1601))\n* `azurerm_app_service_slot` - support for `min_tls_version` in the `site_config` block ([#1601](https://github.com/hashicorp/terraform-provider-azurerm/issues/1601))\n* `azurerm_data_lake_store` - support for enabling/disabling encryption ([#1623](https://github.com/hashicorp/terraform-provider-azurerm/issues/1623))\n* `azurerm_data_lake_store` - support for managing the firewall state ([#1623](https://github.com/hashicorp/terraform-provider-azurerm/issues/1623))\n\nBUG FIXES:\n\n* `azurerm_servicebus_topic` - the `name` property now allows the ~ character ([#1640](https://github.com/hashicorp/terraform-provider-azurerm/issues/1640))\n\n## 1.10.0 (July 21, 2018)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_azuread_application` ([#1552](https://github.com/hashicorp/terraform-provider-azurerm/issues/1552))\n* **New Data Source:** `azurerm_logic_app_workflow` ([#1266](https://github.com/hashicorp/terraform-provider-azurerm/issues/1266))\n* **New Data Source:** `azurerm_notification_hub` ([#1589](https://github.com/hashicorp/terraform-provider-azurerm/issues/1589))\n* **New Data Source:** `azurerm_notification_hub_namespace` ([#1589](https://github.com/hashicorp/terraform-provider-azurerm/issues/1589))\n* **New Data Source:** `azurerm_service_principal` ([#1564](https://github.com/hashicorp/terraform-provider-azurerm/issues/1564))\n* **New Resource:** `azurerm_autoscale_setting` ([#1140](https://github.com/hashicorp/terraform-provider-azurerm/issues/1140))\n* **New Resource:** `azurerm_data_lake_analytics_account` ([#1618](https://github.com/hashicorp/terraform-provider-azurerm/issues/1618))\n* **New Resource:** `azurerm_data_lake_analytics_firewall_rule` ([#1618](https://github.com/hashicorp/terraform-provider-azurerm/issues/1618))\n* **New Resource:** `azurerm_eventhub_namespace_authorization_rule` ([#1572](https://github.com/hashicorp/terraform-provider-azurerm/issues/1572))\n* **New Resource:** `azurerm_logic_app_action_custom` ([#1266](https://github.com/hashicorp/terraform-provider-azurerm/issues/1266))\n* **New Resource:** `azurerm_logic_app_action_http` ([#1266](https://github.com/hashicorp/terraform-provider-azurerm/issues/1266))\n* **New Resource:** `azurerm_logic_app_trigger_custom` ([#1266](https://github.com/hashicorp/terraform-provider-azurerm/issues/1266))\n* **New Resource:** `azurerm_logic_app_trigger_http_request` ([#1266](https://github.com/hashicorp/terraform-provider-azurerm/issues/1266))\n* **New Resource:** `azurerm_logic_app_trigger_recurrence` ([#1266](https://github.com/hashicorp/terraform-provider-azurerm/issues/1266))\n* **New Resource:** `azurerm_logic_app_workflow` ([#1266](https://github.com/hashicorp/terraform-provider-azurerm/issues/1266))\n* **New Resource:** `azurerm_notification_hub` ([#1589](https://github.com/hashicorp/terraform-provider-azurerm/issues/1589))\n* **New Resource:** `azurerm_notification_hub_authorization_rule` ([#1589](https://github.com/hashicorp/terraform-provider-azurerm/issues/1589))\n* **New Resource:** `azurerm_notification_hub_namespace ` ([#1589](https://github.com/hashicorp/terraform-provider-azurerm/issues/1589))\n* **New Resource:** `azurerm_servicebus_queue_authorization_rule` ([#1543](https://github.com/hashicorp/terraform-provider-azurerm/issues/1543))\n* **New Resource:** `azurerm_service_principal` ([#1564](https://github.com/hashicorp/terraform-provider-azurerm/issues/1564))\n* **New Resource:** `azurerm_service_principal_password` ([#1564](https://github.com/hashicorp/terraform-provider-azurerm/issues/1564))\n\nIMPROVEMENTS:\n\n* authentication: Refreshing the Service Principal Token before using it ([#1544](https://github.com/hashicorp/terraform-provider-azurerm/issues/1544))\n* dependencies: updating to`2018-02-01` of the App Service SDK ([#1436](https://github.com/hashicorp/terraform-provider-azurerm/issues/1436))\n* `azurerm_app_service` - support for setting `ftps_settings` in the `site_config` block ([#1577](https://github.com/hashicorp/terraform-provider-azurerm/issues/1577))\n* `azurerm_app_service` - support for running containers ([#1578](https://github.com/hashicorp/terraform-provider-azurerm/issues/1578))\n* `azurerm_app_service_slot` - support for Managed Service Identity ([#1579](https://github.com/hashicorp/terraform-provider-azurerm/issues/1579))\n* `azurerm_app_service_slot` - Slots can now be updated in-place ([#1436](https://github.com/hashicorp/terraform-provider-azurerm/issues/1436))\n* `azurerm_container_group` - support for images hosted in a private registry ([#1529](https://github.com/hashicorp/terraform-provider-azurerm/issues/1529))\n* `azurerm_function_app` - adding support for the `site_credential` block ([#1567](https://github.com/hashicorp/terraform-provider-azurerm/issues/1567))\n* `azurerm_function_app` - only setting `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` for Consumption Apps ([#1515](https://github.com/hashicorp/terraform-provider-azurerm/issues/1515))\n* `azurerm_mysql_server` - changing `tier` or `family` in `sku` property no longer destroys existing resource ([#1598](https://github.com/hashicorp/terraform-provider-azurerm/issues/1598))\n* `azurerm_network_security_rule` - a maximum of 1 Application Security Group can be set per Security Rule  ([#1587](https://github.com/hashicorp/terraform-provider-azurerm/issues/1587))\n* `azurerm_postgresql_server` - changing `tier` or `family` in `sku` property no longer destroys existing resource ([#1598](https://github.com/hashicorp/terraform-provider-azurerm/issues/1598))\n* `azurerm_virtual_machine_scale_set` - `sku` property is now a list #1558 ([#1558](https://github.com/hashicorp/terraform-provider-azurerm/issues/1558))\n\nBUG FIXES:\n\n* `azurerm_application_insights` - fixing a bug where `application_type` was set to `other` ([#1563](https://github.com/hashicorp/terraform-provider-azurerm/issues/1563))\n* `azurerm_lb` - allow `subnet_id` to be set to an empty value ([#1588](https://github.com/hashicorp/terraform-provider-azurerm/issues/1588))\n* `azurerm_servicebus_subscription` - only sending `correlation_filter` values if they're set ([#1565](https://github.com/hashicorp/terraform-provider-azurerm/issues/1565))\n* `azurerm_servicebus_subscription` - setting the `default_message_ttl` field ([#1568](https://github.com/hashicorp/terraform-provider-azurerm/issues/1568))\n* `azurerm_snapshot` - allowing dashes in the `name` field ([#1574](https://github.com/hashicorp/terraform-provider-azurerm/issues/1574))\n* `azurerm_traffic_manager_endpoint` - working around a bug in the API by setting `target` to nil when a `target_resource_id` is specified ([#1546](https://github.com/hashicorp/terraform-provider-azurerm/issues/1546))\n\n## 1.9.0 (July 11, 2018)\n\nFEATURES:\n\n* **New Resource:** `azurerm_azuread_application` ([#1269](https://github.com/hashicorp/terraform-provider-azurerm/issues/1269))\n* **New Resource:** `azurerm_data_lake_store_firewall_rule` ([#1499](https://github.com/hashicorp/terraform-provider-azurerm/issues/1499))\n* **New Resource:** `azurerm_key_vault_access_policy` ([#1149](https://github.com/hashicorp/terraform-provider-azurerm/issues/1149))\n* **New Resource:** `azurerm_scheduler_job` ([#1172](https://github.com/hashicorp/terraform-provider-azurerm/issues/1172))\n* **New Resource:** `azurerm_servicebus_namespace_authorization_rule` ([#1498](https://github.com/hashicorp/terraform-provider-azurerm/issues/1498))\n* **New Resource:** `azurerm_user_assigned_identity` ([#1448](https://github.com/hashicorp/terraform-provider-azurerm/issues/1448))\n\nIMPROVEMENTS:\n\n* dependencies: updating the `containerservice` SDK to `2018-03-31` to support AKS GA ([#1474](https://github.com/hashicorp/terraform-provider-azurerm/issues/1474))\n* dependencies: updating to `v18.0.0` of `Azure/azure-sdk-for-go` ([#1487](https://github.com/hashicorp/terraform-provider-azurerm/issues/1487))\n* dependencies: updating to `v10.12.0` of `Azure/go-autorest` ([#1487](https://github.com/hashicorp/terraform-provider-azurerm/issues/1487))\n* `azurerm_application_gateway` - adding `minimum_servers` to the probe resource ([#1510](https://github.com/hashicorp/terraform-provider-azurerm/issues/1510))\n* `azurerm_cdn_profile` - support for `Standard_ChinaCdn` and `Standard_Microsoft` SKU's ([#1465](https://github.com/hashicorp/terraform-provider-azurerm/issues/1465))\n* `azurerm_cosmosdb_account` - checking to see if the name is in use before creating ([#1464](https://github.com/hashicorp/terraform-provider-azurerm/issues/1464))\n* `azurerm_cosmosdb_account` - fixing the validation on the `ip_range_filter` field ([#1463](https://github.com/hashicorp/terraform-provider-azurerm/issues/1463))\n* `azurerm_dns_zone` - support for Private DNS Zones ([#1404](https://github.com/hashicorp/terraform-provider-azurerm/issues/1404))\n* `azurerm_image` - change os_disk property to a list and add additional property validation ([#1443](https://github.com/hashicorp/terraform-provider-azurerm/issues/1443))\n* `azurerm_lb` - allow `private_ip_address` to be set to an empty value ([#1481](https://github.com/hashicorp/terraform-provider-azurerm/issues/1481))\n* `azurerm_mysql_server` - changing the `storage_mb` property no longer forces a new resource ([#1532](https://github.com/hashicorp/terraform-provider-azurerm/issues/1532))\n* `azurerm_postgresql_server` - changing the `storage_mb` property no longer forces a new resource ([#1532](https://github.com/hashicorp/terraform-provider-azurerm/issues/1532))\n* `azurerm_servicebus_queue` - `enable_partitioning` can now be enabled for `Basic` and `Standard` tiers ([#1391](https://github.com/hashicorp/terraform-provider-azurerm/issues/1391))\n* `azurerm_virtual_machine` - support for specifying user assigned identities ([#1448](https://github.com/hashicorp/terraform-provider-azurerm/issues/1448))\n* `azurerm_virtual_machine` - making the `content` field in the `additional_unattend_config`  block (within `os_profile_windows_config`) sensitive ([#1471](https://github.com/hashicorp/terraform-provider-azurerm/issues/1471))\n* `azurerm_virtual_machine_data_disk_attachment` - adding support for `write_accelerator_enabled` ([#1473](https://github.com/hashicorp/terraform-provider-azurerm/issues/1473))\n* `azurerm_virtual_machine_scale_set` - ensuring we set the `vhd_containers` field to fix a crash ([#1411](https://github.com/hashicorp/terraform-provider-azurerm/issues/1411))\n* `azurerm_virtual_machine_scale_set` - support for specifying user assigned identities ([#1448](https://github.com/hashicorp/terraform-provider-azurerm/issues/1448))\n* `azurerm_virtual_machine_scale_set` - making the `content` field in the `additional_unattend_config`  block (within `os_profile_windows_config`) sensitive ([#1471](https://github.com/hashicorp/terraform-provider-azurerm/issues/1471))\n* `azurerm_virtual_network_gateway` - adding support for the `radius_server_address`, `radius_server_secret` and `vpn_client_protocols` fields to the Data Source ([#1505](https://github.com/hashicorp/terraform-provider-azurerm/issues/1505))\n\nBUG FIXES:\n\n* `azurerm_key_vault_key` - handling the parent Key Vault being deleted ([#1535](https://github.com/hashicorp/terraform-provider-azurerm/issues/1535))\n* `azurerm_sql_database` - fix `requested_service_objective_name` updates ([#1503](https://github.com/hashicorp/terraform-provider-azurerm/issues/1503))\n* `azurerm_storage_account` - limiting the `tags` field to 128 characters to match the service ([#1524](https://github.com/hashicorp/terraform-provider-azurerm/issues/1524))\n* `azurerm_virtual_network_gateway` - fix `azurerm_virtual_network_gateway` crashing when `vpn_client_configuration` was not supplied ([#1505](https://github.com/hashicorp/terraform-provider-azurerm/issues/1505))\n\n## 1.8.0 (June 28, 2018)\n\nFEATURES:\n\n* **New Resource:** `azurerm_dns_caa_record` support ([#1450](https://github.com/hashicorp/terraform-provider-azurerm/issues/1450))\n* **New Resource:** `azurerm_virtual_machine_data_disk_attachment` ([#1207](https://github.com/hashicorp/terraform-provider-azurerm/issues/1207))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to v10.11.4 of `Azure/go-autorest` ([#1418](https://github.com/hashicorp/terraform-provider-azurerm/issues/1418))\n* dependencies: upgrading to v17.4.0 of `Azure/azure-sdk-for-go` ([#1418](https://github.com/hashicorp/terraform-provider-azurerm/issues/1418))\n* `azurerm_lb` - additional validation on properties ([#1403](https://github.com/hashicorp/terraform-provider-azurerm/issues/1403))\n* `azurerm_application_gateway` - support for the `match` block for Probes ([#1446](https://github.com/hashicorp/terraform-provider-azurerm/issues/1446))\n* `azurerm_log_analytics_solution` - support for Sovereign Clouds ([#1410](https://github.com/hashicorp/terraform-provider-azurerm/issues/1410))\n* `azurerm_log_analytics_workspace` - support for Sovereign Clouds ([#1410](https://github.com/hashicorp/terraform-provider-azurerm/issues/1410))\n* `azurerm_log_analytics_workspace` - support for the `PerGB2018` SKU ([#1079](https://github.com/hashicorp/terraform-provider-azurerm/issues/1079))\n* `azurerm_mysql_server` -  `GeneralPurpose` and `MemoryOptimized` sku tiers now allow 4tb for the `storage_mb` property ([#1449](https://github.com/hashicorp/terraform-provider-azurerm/issues/1449))\n* `azurerm_network_interface` - additional validation on properties ([#1403](https://github.com/hashicorp/terraform-provider-azurerm/issues/1403))\n* `azurerm_postgresql_server` -  `GeneralPurpose` and `MemoryOptimized` sku tiers now allow 4tb for the `storage_mb` property ([#1449](https://github.com/hashicorp/terraform-provider-azurerm/issues/1449))\n* `azurerm_postgresql_server` - adding support for version 10.0 ([#1457](https://github.com/hashicorp/terraform-provider-azurerm/issues/1457))\n* `azurerm_route_table` - adding the  disable BGP propagation property ([#1435](https://github.com/hashicorp/terraform-provider-azurerm/issues/1435))\n* `azurerm_sql_database` - support for importing from a bacpac backup ([#972](https://github.com/hashicorp/terraform-provider-azurerm/issues/972))\n* `azurerm_virtual_machine` - support for setting the TimeZone on Windows ([#1265](https://github.com/hashicorp/terraform-provider-azurerm/issues/1265))\n\nBUG FIXES:\n\n* validation: ensuring IPv4/MAC addresses are detected correctly ([#1431](https://github.com/hashicorp/terraform-provider-azurerm/issues/1431))\n\n## 1.7.0 (June 16, 2018)\n\nUPGRADE NOTES:\n\n~> **Please Note:** The field `overprovision` on the `azurerm_virtual_machine_scale_set` resource has changed from `false` to `true` to match the behaviour of Azure in this release. ([#1322](https://github.com/hashicorp/terraform-provider-azurerm/issues/1322))\n\nBUG FIXES:\n\n* `azurerm_key_vault` - respecting the proxy environment variables terraform does and now can create vaults when behind a proxy ([#1393](https://github.com/hashicorp/terraform-provider-azurerm/issues/1393))\n* `azurerm_kubernetes_cluster` - `dns_prefix` is now required ([#1333](https://github.com/hashicorp/terraform-provider-azurerm/issues/1333))\n* `azurerm_network_interface` - ensuring that Public IP's/Private IP Addresses can be removed once assigned ([#1295](https://github.com/hashicorp/terraform-provider-azurerm/issues/1295))\n* `azurerm_public_ip` - setting the `domain_name_label` property into state ([#1287](https://github.com/hashicorp/terraform-provider-azurerm/issues/1287))\n* `azurerm_storage_account` - file and blob encryption is now explicitly `true` by default ([#1380](https://github.com/hashicorp/terraform-provider-azurerm/issues/1380))\n* `azurerm_servicebus_namespace` - the `capacity` property no longer unnecessarily forces a new resource when changed ([#1382](https://github.com/hashicorp/terraform-provider-azurerm/issues/1382))\n* `azurerm_virtual_machine_scale_set` - the field `overprovision` is now `true` by default ([#1322](https://github.com/hashicorp/terraform-provider-azurerm/issues/1322))\n* `azurerm_app_service_plan` - the `name` property validation now allows underscores ([#1351](https://github.com/hashicorp/terraform-provider-azurerm/issues/1351))\n\nIMPROVEMENTS:\n\n* `azurerm_automation_schedule` - adding the `interval` property and supporting recurring schedules ([#1384](https://github.com/hashicorp/terraform-provider-azurerm/issues/1384))\n* `azurerm_dns_ns_record` - deprecated `record` properties in favour of a `records` list ([#991](https://github.com/hashicorp/terraform-provider-azurerm/issues/991))\n* `azurerm_function_app` - adding the `identity` property ([#1369](https://github.com/hashicorp/terraform-provider-azurerm/issues/1369))\n* `azurerm_role_definition` - the `role_definition_id` property is now optional. The resource will now generate a random UUID if it is omitted ([#1378](https://github.com/hashicorp/terraform-provider-azurerm/issues/1378))\n* `azurerm_storage_account` - adding the `network_rules` property ([#1334](https://github.com/hashicorp/terraform-provider-azurerm/issues/1334))\n* `azurerm_storage_account` - adding the `identity` property ([#1323](https://github.com/hashicorp/terraform-provider-azurerm/issues/1323))\n* `azurerm_storage_blob` - adding the `content_type` property ([#1304](https://github.com/hashicorp/terraform-provider-azurerm/issues/1304))\n* `azurerm_virtual_machine` - support for `write_accelerator_enabled` property on Premium disks attached to MS-series machines ([#964](https://github.com/hashicorp/terraform-provider-azurerm/issues/964))\n* `azurerm_virtual_machine_scale_set` - adding the `dns_settings` and `dns_servers` property ([#1209](https://github.com/hashicorp/terraform-provider-azurerm/issues/1209))\n* `azurerm_virtual_machine_scale_set` - adding the `ip_forwarding` property ([#1209](https://github.com/hashicorp/terraform-provider-azurerm/issues/1209))\n* `azurerm_virtual_network_gateway` - adding the properties `vpn_client_protocols`, `radius_server_address` and `radius_server_secret` ([#946](https://github.com/hashicorp/terraform-provider-azurerm/issues/946))\n* dependencies: migrating to the un-deprecated Preview's for Container Instance, EventGrid, Log Analytics and SQL ([#1322](https://github.com/hashicorp/terraform-provider-azurerm/issues/1322))\n* dependencies: upgrading to `2018-01-01` of the EventGrid API ([#1322](https://github.com/hashicorp/terraform-provider-azurerm/issues/1322))\n* dependencies: upgrading to `2018-03-01` of the Monitor API ([#1322](https://github.com/hashicorp/terraform-provider-azurerm/issues/1322))\n\n## 1.6.0 (May 24, 2018)\n\nUPGRADE NOTES:\n\n~> **Please Note:** The `azurerm_mysql_server` resource has been updated from the Preview API's to the GA API's - which requires code changes in your Terraform Configuration to use the new Pricing SKU's. Upon updating to v1.6.0 - you'll need to update the configuration from the Preview SKU's to the GA SKU's.\n\n~> **Please Note:** The `azurerm_postgresql_server` resource has been updated from the Preview API's to the GA API's - which requires code changes in your Terraform Configuration to use the new Pricing SKU's. Upon updating to v1.6.0 - you'll need to update the configuration from the Preview SKU's to the GA SKU's.\n\n* `azurerm_scheduler_job_collection` - the property `max_retry_interval` on both the resource and datasource has been deprecated in favour of `max_recurrence_interval` to better match Azure ([#1218](https://github.com/hashicorp/terraform-provider-azurerm/issues/1218))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_storage_account_sas` ([#1011](https://github.com/hashicorp/terraform-provider-azurerm/issues/1011))\n* **New Resource:** `azurerm_data_lake_store` ([#1219](https://github.com/hashicorp/terraform-provider-azurerm/issues/1219))\n* **New Resource:** `azurerm_relay_namespace` ([#1233](https://github.com/hashicorp/terraform-provider-azurerm/issues/1233))\n\nBUG FIXES:\n\n* across data-sources and resources: making Connection Strings, Keys and Passwords sensitive fields ([#1242](https://github.com/hashicorp/terraform-provider-azurerm/issues/1242))\n* `azurerm_virtual_machine_scale_set` - an empty `os_profile_windows_config` block no longer causes a panic ([#12* `azurerm_app_service` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_app_service_certificate` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_app_service_custom_hostname_binding` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_app_service_plan` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_app_service_slot` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n* `azurerm_app_service_source_control_token` - adding validation to import ([#5107](https://github.com/hashicorp/terraform-provider-azurerm/issues/5107))\n\n## 1.5.0 (May 14, 2018)\n\nUPGRADE NOTES:\n\n~> **Please Note:** Prior to v1.5 Data Sources in the AzureRM Provider returned `nil` rather than an error message when a Resource didn't exist, which was a bug. In order to bring this into line with other Providers - starting in v1.5 the AzureRM Provider will return an error message when a resource doesn't exist.\n\n~> **Please Note:** This release fixes a bug in the `azurerm_redis_cache` resource where changes to fields weren't detected; as such you may see changes in the `redis_configuration` block, particularly with the `rdb_storage_connection_string` field. There's a bug tracking this inconsistency in [the Azure Rest API Specs Repository](https://github.com/Azure/azure-rest-api-specs/issues/3037).\n\nFEATURES:\n\n* **New Data Source:** `azurerm_cosmosdb_account` ([#1056](https://github.com/hashicorp/terraform-provider-azurerm/issues/1056))\n* **New Data Source:** `azurerm_kubernetes_cluster` ([#1204](https://github.com/hashicorp/terraform-provider-azurerm/issues/1204))\n* **New Data Source:** `azurerm_key_vault` ([#1202](https://github.com/hashicorp/terraform-provider-azurerm/issues/1202))\n* **New Data Source:** `azurerm_key_vault_secret` ([#1202](https://github.com/hashicorp/terraform-provider-azurerm/issues/1202))\n* **New Data Source:** `azurerm_route_table` ([#1203](https://github.com/hashicorp/terraform-provider-azurerm/issues/1203))\n\nBUG FIXES:\n\n* `azurerm_redis_cache` - changes to the `redis_configuration` block are now detected - please see the note above for more information ([#1211](https://github.com/hashicorp/terraform-provider-azurerm/issues/1211))\n\nIMPROVEMENTS:\n\n* dependencies - upgrading to v16.2.1 of `Azure/azure-sdk-for-go` ([#1198](https://github.com/hashicorp/terraform-provider-azurerm/issues/1198))\n* dependencies - upgrading to v10.8.1 of `Azure/go-autorest` ([#1198](https://github.com/hashicorp/terraform-provider-azurerm/issues/1198))\n* `azurerm_app_service` - support for HTTP2 ([#1188](https://github.com/hashicorp/terraform-provider-azurerm/issues/1188))\n* `azurerm_app_service` - support for Managed Service Identity ([#1130](https://github.com/hashicorp/terraform-provider-azurerm/issues/1130))\n* `azurerm_app_service_slot` - support for HTTP2 ([#1205](https://github.com/hashicorp/terraform-provider-azurerm/issues/1205))\n* `azurerm_cosmosdb_account` - added support for the `connection_strings` property ([#1194](https://github.com/hashicorp/terraform-provider-azurerm/issues/1194))\n* `azurerm_key_vault_certificate` - exposing the `certificate_data` ([#1200](https://github.com/hashicorp/terraform-provider-azurerm/issues/1200))\n* `azurerm_kubernetes_cluster` - making `kube_config_raw` a sensitive field ([#1225](https://github.com/hashicorp/terraform-provider-azurerm/issues/1225))\n* `azurerm_redis_cache` - Redis Caches can now be Imported ([#1211](https://github.com/hashicorp/terraform-provider-azurerm/issues/1211))\n* `azurerm_redis_firewall_rule` - Redis Firewall Rules can now be Imported ([#1211](https://github.com/hashicorp/terraform-provider-azurerm/issues/1211))\n* `azurerm_virtual_network` - guarding against nil-objects in the response ([#1208](https://github.com/hashicorp/terraform-provider-azurerm/issues/1208))\n* `azurerm_virtual_network_gateway` - ignoring the case of the `GatewaySubnet` ([#1141](https://github.com/hashicorp/terraform-provider-azurerm/issues/1141))\n\n## 1.4.0 (April 26, 2018)\n\nUPGRADE NOTES:\n\n* `azurerm_cosmosdb_account` - the field `failover_policy` has been deprecated in favour of `geo_locations` to better match Azure\n\nFEATURES:\n\n* **New Data Source:** `azurerm_recovery_services_vault` ([#995](https://github.com/hashicorp/terraform-provider-azurerm/issues/995))\n* **New Resource:** `azurerm_recovery_services_vault` ([#995](https://github.com/hashicorp/terraform-provider-azurerm/issues/995))\n* **New Resource:** `azurerm_servicebus_subscription_rule` ([#1124](https://github.com/hashicorp/terraform-provider-azurerm/issues/1124))\n\nIMPROVEMENTS:\n\n* `azurerm_app_service` - support for updating in-place ([#1125](https://github.com/hashicorp/terraform-provider-azurerm/issues/1125))\n* `azurerm_app_service_plan` - support for `kind` being `app` ([#1156](https://github.com/hashicorp/terraform-provider-azurerm/issues/1156))\n* `azurerm_cosmosdb_account` - support for `enable_automatic_failover` ([#1055](https://github.com/hashicorp/terraform-provider-azurerm/issues/1055))\n* `azurerm_cosmosdb_account` - support for the `ConsistentPrefix` consistency level ([#1055](https://github.com/hashicorp/terraform-provider-azurerm/issues/1055))\n* `azurerm_cosmosdb_account` - `prefixes` can now be configured for locations ([#1055](https://github.com/hashicorp/terraform-provider-azurerm/issues/1055))\n* `azurerm_function_app` - support for updating in-place ([#1125](https://github.com/hashicorp/terraform-provider-azurerm/issues/1125))\n* `azurerm_key_vault` - adding cert permissions for `Purge` and `Recover` ([#1132](https://github.com/hashicorp/terraform-provider-azurerm/issues/1132))\n* `azurerm_key_vault` - polling to ensure the Key Vault is resolvable via DNS ([#1081](https://github.com/hashicorp/terraform-provider-azurerm/issues/1081)] [[#1164](https://github.com/hashicorp/terraform-provider-azurerm/issues/1164))\n* `azurerm_kubernetes_cluster` - only setting the Subnet ID when it's not an empty string ([#1158](https://github.com/hashicorp/terraform-provider-azurerm/issues/1158))\n* `azurerm_kubernetes_cluster` - exposing the clusters credentials as `kube_config` ([#953](https://github.com/hashicorp/terraform-provider-azurerm/issues/953))\n* `azurerm_metric_alertrule` - filtering out tags prefixed with `$type` ([#1107](https://github.com/hashicorp/terraform-provider-azurerm/issues/1107))\n* `azurerm_virtual_machine` - loading managed disk information from Azure when the machine is stopped ([#1100](https://github.com/hashicorp/terraform-provider-azurerm/issues/1100))\n* `azurerm_virtual_machine` - make the `vm_size` property case insensitive ([#1131](https://github.com/hashicorp/terraform-provider-azurerm/issues/1131))\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_account` - locations can now be modified in-place (without requiring multiple apply's) ([#1055](https://github.com/hashicorp/terraform-provider-azurerm/issues/1055))\n\n\n## 1.3.3 (April 17, 2018)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_app_service` ([#1071](https://github.com/hashicorp/terraform-provider-azurerm/issues/1071))\n* **New Resource:** `azurerm_app_service_custom_hostname_binding` ([#1087](https://github.com/hashicorp/terraform-provider-azurerm/issues/1087))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to `v15.1.0` of `Azure/azure-sdk-for-go` ([#1099](https://github.com/hashicorp/terraform-provider-azurerm/issues/1099))\n* dependencies: upgrading to `v10.6.0` of `Azure/go-autorest` ([#1077](https://github.com/hashicorp/terraform-provider-azurerm/issues/1077))\n* `azurerm_app_service` - added support for the `https_only` field ([#1080](https://github.com/hashicorp/terraform-provider-azurerm/issues/1080))\n* `azurerm_app_service_slot` - added support for the `https_only` field ([#1080](https://github.com/hashicorp/terraform-provider-azurerm/issues/1080))\n* `azurerm_function_app` - added support for the `https_only` field ([#1080](https://github.com/hashicorp/terraform-provider-azurerm/issues/1080))\n* `azurerm_key_vault_certificate` - exposing the certificate's associated `secret_id` ([#1096](https://github.com/hashicorp/terraform-provider-azurerm/issues/1096))\n* `azurerm_redis_cache` - support for clusters on the internal network ([#1086](https://github.com/hashicorp/terraform-provider-azurerm/issues/1086))\n* `azurerm_servicebus_queue` - support for setting `requires_session` ([#1111](https://github.com/hashicorp/terraform-provider-azurerm/issues/1111))\n* `azurerm_sql_database` - changes to `collation` force a new resource ([#1066](https://github.com/hashicorp/terraform-provider-azurerm/issues/1066))\n\n## 1.3.2 (April 04, 2018)\n\nFEATURES:\n\n* **New Resource:** `azurerm_packet_capture` ([#1044](https://github.com/hashicorp/terraform-provider-azurerm/issues/1044))\n* **New Resource:** `azurerm_policy_assignment` ([#1051](https://github.com/hashicorp/terraform-provider-azurerm/issues/1051))\n\nIMPROVEMENTS:\n\n* `azurerm_virtual_machine_scale_set` - adds support for MSI ([#1018](https://github.com/hashicorp/terraform-provider-azurerm/issues/1018))\n\n## 1.3.1 (March 29, 2018)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_scheduler_job_collection` ([#990](https://github.com/hashicorp/terraform-provider-azurerm/issues/990))\n* **New Data Source:** `azurerm_traffic_manager_geographical_location` ([#987](https://github.com/hashicorp/terraform-provider-azurerm/issues/987))\n* **New Resource:** `azurerm_express_route_circuit_authorization` ([#992](https://github.com/hashicorp/terraform-provider-azurerm/issues/992))\n* **New Resource:** `azurerm_express_route_circuit_peering` ([#1033](https://github.com/hashicorp/terraform-provider-azurerm/issues/1033))\n* **New Resource:** `azurerm_iothub` ([#887](https://github.com/hashicorp/terraform-provider-azurerm/issues/887))\n* **New Resource:** `azurerm_policy_definition` ([#1010](https://github.com/hashicorp/terraform-provider-azurerm/issues/1010))\n* **New Resource:** `azurerm_sql_virtual_network_rule` ([#978](https://github.com/hashicorp/terraform-provider-azurerm/issues/978))\n\nIMPROVEMENTS:\n\n* `azurerm_app_service` - allow changing `client_affinity_enabled` without requiring a resource recreation ([#993](https://github.com/hashicorp/terraform-provider-azurerm/issues/993))\n* `azurerm_app_service` - support for configuring `LocalSCM` source control ([#826](https://github.com/hashicorp/terraform-provider-azurerm/issues/826))\n* `azurerm_app_service` - returning a clearer error message when the name (which needs to be globally unique) is in use ([#1037](https://github.com/hashicorp/terraform-provider-azurerm/issues/1037))\n* `azurerm_cosmosdb_account` - increasing the maximum value for `max_interval_in_seconds` from 100s to 86400s (1 day) [[#1000](https://github.com/hashicorp/terraform-provider-azurerm/issues/1000)] \n* `azurerm_function_app` - returning a clearer error message when the name (which needs to be globally unique) is in use ([#1037](https://github.com/hashicorp/terraform-provider-azurerm/issues/1037))\n* `azurerm_network_interface` - support for attaching to Application Gateways ([#1027](https://github.com/hashicorp/terraform-provider-azurerm/issues/1027))\n* `azurerm_traffic_manager_endpoint` - adding support for `geo_mappings` ([#986](https://github.com/hashicorp/terraform-provider-azurerm/issues/986))\n* `azurerm_traffic_manager_profile` - adding support for the `traffic_routing_method` `Geographic` ([#986](https://github.com/hashicorp/terraform-provider-azurerm/issues/986))\n* `azurerm_virtual_machine_scale_sets` - support for attaching to Application Gateways ([#1027](https://github.com/hashicorp/terraform-provider-azurerm/issues/1027))\n* `azurerm_virtual_network_gateway` - changes to `peering_address` now force a new resource ([#1040](https://github.com/hashicorp/terraform-provider-azurerm/issues/1040))\n\n## 1.3.0 (March 15, 2018)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_cdn_profile` ([#950](https://github.com/hashicorp/terraform-provider-azurerm/issues/950))\n* **New Data Source:** `azurerm_network_interface` ([#854](https://github.com/hashicorp/terraform-provider-azurerm/issues/854))\n* **New Data Source:** `azurerm_public_ips` ([#304](https://github.com/hashicorp/terraform-provider-azurerm/issues/304))\n* **New Data Source:** `azurerm_subscriptions` ([#940](https://github.com/hashicorp/terraform-provider-azurerm/issues/940))\n* **New Resource:** `azurerm_log_analytics_solution` ([#952](https://github.com/hashicorp/terraform-provider-azurerm/issues/952))\n* **New Resource:** `azurerm_sql_active_directory_administrator` ([#765](https://github.com/hashicorp/terraform-provider-azurerm/issues/765))\n* **New Resource:** `azurerm_scheduler_job_collection` ([#963](https://github.com/hashicorp/terraform-provider-azurerm/issues/963))\n\nBUG FIXES:\n\n* `azurerm_application_gateway` - fixes a crash where `ssl_policy` isn't returned from the Azure API when importing existing resources ([#935](https://github.com/hashicorp/terraform-provider-azurerm/issues/935))\n* `azurerm_app_service` - supporting `client_affinity_enabled` being `false` ([#973](https://github.com/hashicorp/terraform-provider-azurerm/issues/973))\n* `azurerm_kubernetes_cluster` - exporting the FQDN ([#907](https://github.com/hashicorp/terraform-provider-azurerm/issues/907))\n* `azurerm_sql_elasticpool` - fixing a crash where `location` isn't returned for legacy resources ([#982](https://github.com/hashicorp/terraform-provider-azurerm/issues/982))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_builtin_role_definition` - loading available role definitions from Azure ([#770](https://github.com/hashicorp/terraform-provider-azurerm/issues/770))\n* Data Source: `azurerm_managed_disk` - adding support for Availability Zones ([#811](https://github.com/hashicorp/terraform-provider-azurerm/issues/811))\n* Data Source: `azurerm_network_security_group` - support for security rules including Application Security Groups ([#925](https://github.com/hashicorp/terraform-provider-azurerm/issues/925))\n* `azurerm_app_service_plan` -  support for provisioning Consumption Plans ([#981](https://github.com/hashicorp/terraform-provider-azurerm/issues/981))\n* `azurerm_cdn_endpoint` - adding support for GeoFilters, ProbePaths ([#967](https://github.com/hashicorp/terraform-provider-azurerm/issues/967))\n* `azurerm_cdn_endpoint` - making the `origin` block ForceNew to match Azure ([#967](https://github.com/hashicorp/terraform-provider-azurerm/issues/967))\n* `azurerm_function_app` - adding `client_affinity_enabled`, `use_32_bit_worker_process` and `websockets_enabled` ([#886](https://github.com/hashicorp/terraform-provider-azurerm/issues/886))\n* `azurerm_load_balancer` - adding support for Availability Zones ([#811](https://github.com/hashicorp/terraform-provider-azurerm/issues/811))\n* `azurerm_managed_disk` - adding support for Availability Zones ([#811](https://github.com/hashicorp/terraform-provider-azurerm/issues/811))\n* `azurerm_network_interface` - setting `internal_fqdn` if it's not nil ([#977](https://github.com/hashicorp/terraform-provider-azurerm/issues/977))\n* `azurerm_network_security_group` - support for security rules including Application Security Groups ([#925](https://github.com/hashicorp/terraform-provider-azurerm/issues/925))\n* `azurerm_network_security_rule` - support for security rules including Application Security Groups ([#925](https://github.com/hashicorp/terraform-provider-azurerm/issues/925))\n* `azurerm_public_ip` - adding support for Availability Zones ([#811](https://github.com/hashicorp/terraform-provider-azurerm/issues/811))\n* `azurerm_redis_cache` - add support for `notify-keyspace-events` ([#949](https://github.com/hashicorp/terraform-provider-azurerm/issues/949))\n* `azurerm_template_deployment` - support for specifying parameters via `parameters_body` ([#404](https://github.com/hashicorp/terraform-provider-azurerm/issues/404))\n* `azurerm_virtual_machine` - adding support for Availability Zones ([#811](https://github.com/hashicorp/terraform-provider-azurerm/issues/811))\n* `azurerm_virtual_machine_scale_set` - adding support for Availability Zones ([#811](https://github.com/hashicorp/terraform-provider-azurerm/issues/811))\n\n## 1.2.0 (March 02, 2018)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_application_security_group` ([#914](https://github.com/hashicorp/terraform-provider-azurerm/issues/914))\n* **New Resource:** `azurerm_application_security_group` ([#905](https://github.com/hashicorp/terraform-provider-azurerm/issues/905))\n* **New Resource:** `azurerm_servicebus_topic_authorization_rule` ([#736](https://github.com/hashicorp/terraform-provider-azurerm/issues/736))\n\nBUG FIXES:\n\n* `azurerm_kubernetes_cluster` - an empty `linux_profile.ssh_key.keydata` no longer causes a crash ([#903](https://github.com/hashicorp/terraform-provider-azurerm/issues/903))\n* `azurerm_kubernetes_cluster` - the `linux_profile.admin_username` and `linux_profile.ssh_key.keydata` fields now force a new resource ([#895](https://github.com/hashicorp/terraform-provider-azurerm/issues/895))\n* `azurerm_network_interface` - the `subnet_id` field is now case insensitive ([#866](https://github.com/hashicorp/terraform-provider-azurerm/issues/866))\n* `azurerm_network_security_group` - reverting `security_rules` to a set to fix an ordering issue ([#893](https://github.com/hashicorp/terraform-provider-azurerm/issues/893))\n* `azurerm_virtual_machine_scale_set` - the `computer_name_prefix` field now forces a new resource ([#871](https://github.com/hashicorp/terraform-provider-azurerm/issues/871))\n\nIMPROVEMENTS:\n\n* authentication: adding support for Managed Service Identity ([#639](https://github.com/hashicorp/terraform-provider-azurerm/issues/639))\n* `azurerm_container_group` - added `dns_name_label` and `FQDN` properties ([#877](https://github.com/hashicorp/terraform-provider-azurerm/issues/877))\n* `azurerm_network_interface` - support for attaching to Application Security Groups ([#911](https://github.com/hashicorp/terraform-provider-azurerm/issues/911))\n* `azurerm_network_security_group` - support for augmented security rules ([#781](https://github.com/hashicorp/terraform-provider-azurerm/issues/781))\n* `azurerm_servicebus_subscription` - added support for the `forward_to` property ([#861](https://github.com/hashicorp/terraform-provider-azurerm/issues/861))\n* `azurerm_storage_account` - adding support for `account_kind` being `StorageV2` ([#851](https://github.com/hashicorp/terraform-provider-azurerm/issues/851))\n* `azurerm_virtual_network_gateway_connection` - support for IPsec/IKE Policies ([#834](https://github.com/hashicorp/terraform-provider-azurerm/issues/834))\n\n## 1.1.2 (February 19, 2018)\n\nFEATURES:\n\n* **New Resource:** `azurerm_kubernetes_cluster` ([#693](https://github.com/hashicorp/terraform-provider-azurerm/issues/693))\n* **New Resource:** `azurerm_app_service_active_slot` ([#818](https://github.com/hashicorp/terraform-provider-azurerm/issues/818))\n* **New Resource:** `azurerm_app_service_slot` ([#818](https://github.com/hashicorp/terraform-provider-azurerm/issues/818))\n\nBUG FIXES:\n\n* **Data Source:** `azurerm_app_service_plan`: handling a 404 not being returned as an error ([#849](https://github.com/hashicorp/terraform-provider-azurerm/issues/849))\n* **Data Source:** `azurerm_virtual_network` - Fixing a crash when the DhcpOptions aren't specified ([#803](https://github.com/hashicorp/terraform-provider-azurerm/issues/803))\n* `azurerm_application_gateway` - fixing crashes due to schema mismatches for existing resources ([#848](https://github.com/hashicorp/terraform-provider-azurerm/issues/848))\n* `azurerm_storage_container` - add a retry for creation ([#846](https://github.com/hashicorp/terraform-provider-azurerm/issues/846))\n\nIMPROVEMENTS:\n\n* authentication: pulling the `Environment` key from the Azure CLI Config ([#842](https://github.com/hashicorp/terraform-provider-azurerm/issues/842))\n* core: upgrading to `v12.5.0-beta` of the Azure SDK for Go ([#830](https://github.com/hashicorp/terraform-provider-azurerm/issues/830))\n* compute: upgrading to use the `2017-12-01` API Version ([#797](https://github.com/hashicorp/terraform-provider-azurerm/issues/797))\n* `azurerm_app_service_plan`: support for attaching to an App Service Environment ([#850](https://github.com/hashicorp/terraform-provider-azurerm/issues/850))\n* `azurerm_container_group` - adding `restart_policy` ([#827](https://github.com/hashicorp/terraform-provider-azurerm/issues/827))\n* `azurerm_managed_disk` - updated the validation on `disk_size_gb` / made it computed ([#800](https://github.com/hashicorp/terraform-provider-azurerm/issues/800))\n* `azurerm_role_assignment` - add `role_definition_name` ([#775](https://github.com/hashicorp/terraform-provider-azurerm/issues/775))\n* `azurerm_subnet` - add support for Service Endpoints ([#786](https://github.com/hashicorp/terraform-provider-azurerm/issues/786))\n* `azurerm_virtual_machine` - changing `managed_disk_id` and `create_option` to be not ForceNew ([#813](https://github.com/hashicorp/terraform-provider-azurerm/issues/813))\n\n\n## 1.1.1 (February 06, 2018)\n\nBUG FIXES:\n\n* `azurerm_public_ip` - Setting the `ip_address` field regardless of the DNS Settings ([#772](https://github.com/hashicorp/terraform-provider-azurerm/issues/772))\n* `azurerm_virtual_machine` - ignores the case of the Managed Data Disk ID's to work around an Azure portal bug ([#792](https://github.com/hashicorp/terraform-provider-azurerm/issues/792))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_storage_account` ([#794](https://github.com/hashicorp/terraform-provider-azurerm/issues/794))\n* **New Data Source:** `azurerm_virtual_network_gateway` ([#796](https://github.com/hashicorp/terraform-provider-azurerm/issues/796))\n\n## 1.1.0 (January 26, 2018)\n\nUPGRADE NOTES:\n\n* Data Source: `azurerm_builtin_role_definition` - now returns the correct UUID/GUID for the `Virtual Machines Contributor` role (previously the ID for the `Classic Virtual Machine Contributor` role was returned) ([#762](https://github.com/hashicorp/terraform-provider-azurerm/issues/762))\n* `azurerm_snapshot` - `source_uri` now forces a new resource on changes due to behavioural changes in the Azure API ([#744](https://github.com/hashicorp/terraform-provider-azurerm/issues/744))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_dns_zone` ([#702](https://github.com/hashicorp/terraform-provider-azurerm/issues/702))\n* **New Resource:** `azurerm_metric_alertrule` ([#478](https://github.com/hashicorp/terraform-provider-azurerm/issues/478))\n* **New Resource:** `azurerm_virtual_network_gateway` ([#133](https://github.com/hashicorp/terraform-provider-azurerm/issues/133))\n* **New Resource:** `azurerm_virtual_network_gateway_connection` ([#133](https://github.com/hashicorp/terraform-provider-azurerm/issues/133))\n\nIMPROVEMENTS:\n\n* core: upgrading to `v12.2.0-beta` of `Azure/azure-sdk-for-go` ([#684](https://github.com/hashicorp/terraform-provider-azurerm/issues/684))\n* core: upgrading to `v9.7.0` of `Azure/go-autorest` ([#684](https://github.com/hashicorp/terraform-provider-azurerm/issues/684))\n* Data Source: `azurerm_builtin_role_definition` - adding extra role definitions ([#762](https://github.com/hashicorp/terraform-provider-azurerm/issues/762))\n* `azurerm_app_service` - exposing the `outbound_ip_addresses` field ([#700](https://github.com/hashicorp/terraform-provider-azurerm/issues/700))\n* `azurerm_function_app` - exposing the `outbound_ip_addresses` field ([#706](https://github.com/hashicorp/terraform-provider-azurerm/issues/706))\n* `azurerm_function_app` - add support for the `always_on` and `connection_string` fields ([#695](https://github.com/hashicorp/terraform-provider-azurerm/issues/695))\n* `azurerm_image` - add support for filtering images by a regex on the name ([#642](https://github.com/hashicorp/terraform-provider-azurerm/issues/642))\n* `azurerm_lb` - adding support for the `Standard` SKU (in Preview) ([#665](https://github.com/hashicorp/terraform-provider-azurerm/issues/665))\n* `azurerm_public_ip` - adding support for the `Standard` SKU (in Preview) ([#665](https://github.com/hashicorp/terraform-provider-azurerm/issues/665))\n* `azurerm_network_security_rule` - add support for augmented security rules ([#692](https://github.com/hashicorp/terraform-provider-azurerm/issues/692))\n* `azurerm_role_assignment` - generating a name if one isn't specified ([#685](https://github.com/hashicorp/terraform-provider-azurerm/issues/685))\n* `azurerm_traffic_manager_profile` - adding support for setting `protocol` to `TCP` ([#742](https://github.com/hashicorp/terraform-provider-azurerm/issues/742))\n\n## 1.0.1 (January 12, 2018)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_app_service_plan` ([#668](https://github.com/hashicorp/terraform-provider-azurerm/issues/668))\n* **New Data Source:** `azurerm_eventhub_namespace` ([#673](https://github.com/hashicorp/terraform-provider-azurerm/issues/673))\n* **New Resource:** `azurerm_function_app` ([#647](https://github.com/hashicorp/terraform-provider-azurerm/issues/647))\n\nIMPROVEMENTS:\n\n* core: adding a cache to the Storage Account Keys ([#634](https://github.com/hashicorp/terraform-provider-azurerm/issues/634))\n* `azurerm_eventhub` - added support for `capture_description` ([#681](https://github.com/hashicorp/terraform-provider-azurerm/issues/681))\n* `azurerm_eventhub_consumer_group` - adding validation for the user metadata field ([#641](https://github.com/hashicorp/terraform-provider-azurerm/issues/641))\n* `azurerm_lb` - adding the computed field `public_ip_addresses` ([#633](https://github.com/hashicorp/terraform-provider-azurerm/issues/633))\n* `azurerm_local_network_gateway` - add support for `tags` ([#638](https://github.com/hashicorp/terraform-provider-azurerm/issues/638))\n* `azurerm_network_interface` - support for Accelerated Networking ([#672](https://github.com/hashicorp/terraform-provider-azurerm/issues/672))\n* `azurerm_storage_account` - expose `primary_connection_string` and `secondary_connection_string` ([#647](https://github.com/hashicorp/terraform-provider-azurerm/issues/647))\n\n## 1.0.0 (December 15, 2017)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_network_security_group` ([#623](https://github.com/hashicorp/terraform-provider-azurerm/issues/623))\n* **New Data Source:** `azurerm_virtual_network` ([#533](https://github.com/hashicorp/terraform-provider-azurerm/issues/533))\n* **New Resource:** `azurerm_management_lock` ([#575](https://github.com/hashicorp/terraform-provider-azurerm/issues/575))\n* **New Resource:** `azurerm_network_watcher` ([#571](https://github.com/hashicorp/terraform-provider-azurerm/issues/571))\n\nIMPROVEMENTS:\n\n* authentication - add support for the latest Azure CLI configuration ([#573](https://github.com/hashicorp/terraform-provider-azurerm/issues/573))\n* authentication - conditional loading of the Subscription ID / Tenant ID / Environment ([#574](https://github.com/hashicorp/terraform-provider-azurerm/issues/574))\n* core - appending additions to the User Agent, so we don't overwrite the Go SDK User Agent info ([#587](https://github.com/hashicorp/terraform-provider-azurerm/issues/587))\n* core - Upgrading `Azure/azure-sdk-for-go` to v11.2.2-beta ([#594](https://github.com/hashicorp/terraform-provider-azurerm/issues/594))\n* core - upgrading `Azure/go-autorest` to v9.5.2 ([#617](https://github.com/hashicorp/terraform-provider-azurerm/issues/617))\n* core - skipping Resource Provider Registration in AutoRest when opted-out ([#630](https://github.com/hashicorp/terraform-provider-azurerm/issues/630))\n* `azurerm_app_service` - exposing the Default Hostname as a Computed field \n\n---\n\nFor information on changes prior to the v1.0.0 release, please see [the v0.x changelog](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v0.md).\n"
  },
  {
    "path": "articles/terraform/provider-version-history-azurerm-2-0-0-to-2-99-0.md",
    "content": "---\ntitle: Terraform AzureRM provider version history 2.0.0 - 2.99.0\ndescription: View the Terraform AzureRM provider version history for 2.0.0 - 2.99.0\nkeywords: azure devops terraform change log release history what's new\nms.topic: reference\nms.date: 10/17/2024\nms.custom: devx-track-terraform\n# Customer intent: I want to view the AzureRM provider version history for versions 2.0.0 - 2.99.0\n# Source: https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v2.md\n---\n\n# Terraform AzureRM provider version history: 2.0.0 - 2.99.0\n\n## 2.99.0 (March 11, 2022)\n\nNOTES\n\n* **Preparation for 3.0**: We intend for v2.99.0 to be the last release in the 2.x line - we’ll be turning our focus to 3.0 with the next release. We recommend [consulting the list of changes coming in 3.0](https://registry.terraform.io/providers/hashicorp/azurerm/2.99.0/docs/guides/3.0-upgrade-guide) to be aware and [trialling the Beta available in the latest 2.x releases](https://registry.terraform.io/providers/hashicorp/azurerm/2.99.0/docs/guides/3.0-beta) if you’re interested.\n\nFEATURES:\n\n* New Beta Resource: `azurerm_function_app_function` ([#15605](https://github.com/hashicorp/terraform-provider-azurerm/issues/15605))\n* New Beta Resource: `azurerm_function_app_hybrid_connection` ([#15702](https://github.com/hashicorp/terraform-provider-azurerm/issues/15702))\n* New Beta Resource: `azurerm_web_app_hybrid_connection` ([#15702](https://github.com/hashicorp/terraform-provider-azurerm/issues/15702))\n* New Resource: `azurerm_cosmosdb_sql_role_assignment` ([#15038](https://github.com/hashicorp/terraform-provider-azurerm/issues/15038))\n* New Resource: `azurerm_cosmosdb_sql_role_definition` ([#15035](https://github.com/hashicorp/terraform-provider-azurerm/issues/15035))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v62.1.0` of `github.com/Azure/azure-sdk-for-go` ([#15716](https://github.com/hashicorp/terraform-provider-azurerm/issues/15716))\n* dependencies: updating `compute` to `2021-11-01` ([#15099](https://github.com/hashicorp/terraform-provider-azurerm/issues/15099))\n* dependencies: updating `kubernetescluster` to `2022-01-02-preview` ([#15648](https://github.com/hashicorp/terraform-provider-azurerm/issues/15648))\n* dependencies: updating `sentinel` to `2021-09-01-preview` ([#14983](https://github.com/hashicorp/terraform-provider-azurerm/issues/14983))\n* Data Source: `azurerm_kubernetes_cluster` - deprecated the `addon_profile` block in favour of `aci_connector_linux`, `azure_policy_enabled`, `http_application_routing_enabled`, `ingress_application_gateway`, `key_vault_secrets_provider`, `oms_agent` and `open_service_mesh_enabled` properties ([#15584](https://github.com/hashicorp/terraform-provider-azurerm/issues/15584))\n* Data Source: `azurerm_kubernetes_cluster` - deprecated the `role_based_access_control` block in favour of `azure_active_directory_role_based_access_control` and `role_based_access_control_enabled` properties ([#15584](https://github.com/hashicorp/terraform-provider-azurerm/issues/15584))\n* Data Source: `azurerm_servicebus_namespace_authorization_rule` - support for the `namespace_id` property ([#15671](https://github.com/hashicorp/terraform-provider-azurerm/issues/15671))\n* Data Source: `azurerm_servicebus_namespace_disaster_recovery_config` - support for the `namespace_id` property ([#15671](https://github.com/hashicorp/terraform-provider-azurerm/issues/15671))\n* Data Source: `azurerm_servicebus_queue` - support for the `namespace_id` property ([#15671](https://github.com/hashicorp/terraform-provider-azurerm/issues/15671))\n* Data Source: `azurerm_servicebus_queue_authorization_rule` - support for the `queue_id` property ([#15671](https://github.com/hashicorp/terraform-provider-azurerm/issues/15671))\n* Data Source: `azurerm_servicebus_subscription` - support for the `topic_id` property ([#15671](https://github.com/hashicorp/terraform-provider-azurerm/issues/15671))\n* Data Source: `azurerm_servicebus_topic` - support for the `namespace_id` property ([#15671](https://github.com/hashicorp/terraform-provider-azurerm/issues/15671))\n* Data Source: `azurerm_servicebus_topic_authorization_rule` - support for the `topic_id` property ([#15671](https://github.com/hashicorp/terraform-provider-azurerm/issues/15671))\n* Data Source: `azurerm_virtual_network` - support for the `tags` property ([#14882](https://github.com/hashicorp/terraform-provider-azurerm/issues/14882))\n* `azurerm_batch_account` - support for customer managed keys ([#14749](https://github.com/hashicorp/terraform-provider-azurerm/issues/14749))\n* `azurerm_container_registry` support for the `export_policy_enabled` property ([#15036](https://github.com/hashicorp/terraform-provider-azurerm/issues/15036))\n* `azurerm_kubernetes_cluster` - deprecate the `role_based_access_control` block in favour of `role_based_access_control_enabled` and `azure_active_directory_role_based_access_control` ([#15546](https://github.com/hashicorp/terraform-provider-azurerm/issues/15546))\n* `azurerm_iothub` - deprecate the `ip_filter_rule` property in favour of the `network_rule_set` property ([#15590](https://github.com/hashicorp/terraform-provider-azurerm/issues/15590))\n* `azurerm_lb_nat_rule` - the `frontend_port` and `backend_port` properties now support `0` ([#15694](https://github.com/hashicorp/terraform-provider-azurerm/issues/15694))\n* `azurerm_machine_learning_compute_instance` - updating the validation on the `name` property ([#14839](https://github.com/hashicorp/terraform-provider-azurerm/issues/14839))\n* `azurerm_mssql_database_extended_auditing_policy` - support for the `enabled` property ([#15624](https://github.com/hashicorp/terraform-provider-azurerm/issues/15624))\n* `azurerm_mssql_server_extended_auditing_policy` - support for the `enabled` property ([#15624](https://github.com/hashicorp/terraform-provider-azurerm/issues/15624))\n* `azurerm_management_group_policy_assignment` - the `parameters` property can now be updated ([#15623](https://github.com/hashicorp/terraform-provider-azurerm/issues/15623))\n* `azurerm_mssql_server` - the `administrator_login` and `administrator_login_password` properties are now optional when Microsoft Entra authentication is enforced ([#15771](https://github.com/hashicorp/terraform-provider-azurerm/issues/15771))\n* `azurerm_resource_policy_assignment`  - the `parameters` property can now be updated ([#15623](https://github.com/hashicorp/terraform-provider-azurerm/issues/15623))\n* `azurerm_resource_group_policy_assignment` - the `parameters` property can now be updated ([#15623](https://github.com/hashicorp/terraform-provider-azurerm/issues/15623))\n* `azurerm_recovery_service_vault` - support for the `cross_region_restore_enabled` property ([#15757](https://github.com/hashicorp/terraform-provider-azurerm/issues/15757))\n* `azurerm_subscription_policy_assignment` - the `parameters` property can now be updated ([#15623](https://github.com/hashicorp/terraform-provider-azurerm/issues/15623))\n* `azurerm_storage_object_replication` - support for replicating containers across subscriptions ([#15603](https://github.com/hashicorp/terraform-provider-azurerm/issues/15603))\n\nBUG FIXES:\n\n* `azurerm_backup_protected_vm` - the `source_vm_id` property is now case insensitive ([#15656](https://github.com/hashicorp/terraform-provider-azurerm/issues/15656))\n* `azurerm_batch_job` - will not longer fail during creation if multiple `common_environment_properties` are set ([#15686](https://github.com/hashicorp/terraform-provider-azurerm/issues/15686))\n* `azurerm_container_group` - correctly parse empty or omitted `dns_config.options` and `dns_config.search_domains` properties ([#15618](https://github.com/hashicorp/terraform-provider-azurerm/issues/15618))\n* `azurerm_key_vault_key` - correctly set the vault id on import ([#15670](https://github.com/hashicorp/terraform-provider-azurerm/issues/15670))\n* `azurerm_monitor_diagnostic_setting` - will now correctly parse the `eventhub_authorization_rule_id` property ([#15582](https://github.com/hashicorp/terraform-provider-azurerm/issues/15582))\n* `azurerm_mssql_managed_instance_active_directory_administrator` - prevent a perpetual diff with the instance ID ([#15725](https://github.com/hashicorp/terraform-provider-azurerm/issues/15725))\n* `azurerm_orchestrated_virtual_machine_scale_set` - prevent a crash when the 3.0 beta was enabled ([#15637](https://github.com/hashicorp/terraform-provider-azurerm/issues/15637))\n* `azurerm_storage_data_lake_gen2_filesystem` - support configuring the `group` and `owner` properties ([#15598](https://github.com/hashicorp/terraform-provider-azurerm/issues/15598))\n* `azurerm_virtual_network_gateway` - prevent a panic with `bgp_settings.0.peering_address` ([#15689](https://github.com/hashicorp/terraform-provider-azurerm/issues/15689))\n\n## 2.98.0 (February 25, 2022)\n\nFEATURES:\n\n* New Beta Resource: `azurerm_function_app_active_slot` ([#15246](https://github.com/hashicorp/terraform-provider-azurerm/issues/15246))\n* New Beta Resource: `azurerm_web_app_active_slot` ([#15246](https://github.com/hashicorp/terraform-provider-azurerm/issues/15246))\n\nENHANCEMENTS:\n\n* dependencies: upgrading to `v0.18.0` of `github.com/tombuildsstuff/giovanni` ([#15507](https://github.com/hashicorp/terraform-provider-azurerm/issues/15507))\n* `azurerm_linux_function_app` - adds `key_vault_reference_identity_id` support ([#15553](https://github.com/hashicorp/terraform-provider-azurerm/issues/15553))\n* `azurerm_linux_function_app_slot` - adds `key_vault_reference_identity_id` support ([#15553](https://github.com/hashicorp/terraform-provider-azurerm/issues/15553))\n* `azurerm_windows_function_app` - adds `key_vault_reference_identity_id` support ([#15553](https://github.com/hashicorp/terraform-provider-azurerm/issues/15553))\n* `azurerm_windows_function_app_slot` - adds `key_vault_reference_identity_id` support ([#15553](https://github.com/hashicorp/terraform-provider-azurerm/issues/15553))\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_mongo_collection` - can now set the `autoscale_settings` property without setting a `shard_key` when creating an Azure Cosmos DB MongoDB collection ([#15529](https://github.com/hashicorp/terraform-provider-azurerm/issues/15529))\n* `azurerm_firewall_policy` - will not wait for resource to finish provisioning after creation ([#15561](https://github.com/hashicorp/terraform-provider-azurerm/issues/15561))\n\n## 2.97.0 (February 18, 2022)\n\nUPGRADE NOTES:\n\n* **3.0 Beta:** This release includes a new feature-flag to opt-into the 3.0 Beta - which (when enabled) introduces a number of new data sources/resources, behavioural changes, field renames and removes some older deprecated resources. The 3.0 Beta is still a work-in-progress at this time and as such the changes listed [in the 3.0 Upgrade Guide](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/3.0-upgrade-guide) may change, however we're interested to hear your feedback and [instructions on how to opt-into the 3.0 Beta can be found here](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/3.0-beta).\n\nFEATURES:\n\n* **New Data Source:** `azurerm_extended_locations` ([#15181](https://github.com/hashicorp/terraform-provider-azurerm/issues/15181))\n* **New Data Source:** `azurerm_mssql_managed_instance` ([#15203](https://github.com/hashicorp/terraform-provider-azurerm/issues/15203))\n* **New Resource:** `azurerm_iothub_certificate` ([#15461](https://github.com/hashicorp/terraform-provider-azurerm/issues/15461))\n* **New Resource:** `azurerm_mssql_outbound_firewall_rule` ([#14795](https://github.com/hashicorp/terraform-provider-azurerm/issues/14795))\n* **New Resource:** `azurerm_mssql_managed_database` ([#15203](https://github.com/hashicorp/terraform-provider-azurerm/issues/15203))\n* **New Resource:** `azurerm_mssql_managed_instance` ([#15203](https://github.com/hashicorp/terraform-provider-azurerm/issues/15203))\n* **New Resource:** `azurerm_mssql_managed_instance_active_directory_administrator` ([#15203](https://github.com/hashicorp/terraform-provider-azurerm/issues/15203))\n* **New Resource:** `azurerm_mssql_managed_instance_failover_group` ([#15203](https://github.com/hashicorp/terraform-provider-azurerm/issues/15203))\n* **New Resource:** `azurerm_spring_cloud_storage` ([#15375](https://github.com/hashicorp/terraform-provider-azurerm/issues/15375))\n\nENHANCEMENTS:\n\n* dependencies: upgrading to `v0.24.1` of `github.com/hashicorp/go-azure-helpers` ([#15430](https://github.com/hashicorp/terraform-provider-azurerm/issues/15430))\n* `azurerm_automation_account` - add support for the `public_network_access_enabled` property ([#15429](https://github.com/hashicorp/terraform-provider-azurerm/issues/15429))\n* `azurerm_kubernetes_cluster` - deprecate the `addon_profile` block, moving all properties to the top level as well as removing the `enabled` field for all add-ons ([#15108](https://github.com/hashicorp/terraform-provider-azurerm/issues/15108))\n* `azurerm_kusto_cluster` - supports for the `public_network_access_enabled` property ([#15428](https://github.com/hashicorp/terraform-provider-azurerm/issues/15428))\n* `azurerm_machine_learning_workspace` - support for both `SystemAssigned, UserAssigned` and `UserAssigned` Identities ([#14181](https://github.com/hashicorp/terraform-provider-azurerm/issues/14181))\n* `azurerm_machine_learning_workspace` - support for encryption using a User Assigned Identity ([#14181](https://github.com/hashicorp/terraform-provider-azurerm/issues/14181))\n* `azurerm_monitor_activity_log_alert` support for the `resource_health` block ([#14917](https://github.com/hashicorp/terraform-provider-azurerm/issues/14917))\n* `azurerm_iothub_dps` - support for the `ip_filter_rule` block and the `public_network_access_enabled` property ([#15343](https://github.com/hashicorp/terraform-provider-azurerm/issues/15343))\n* `azurerm_spring_cloud_app` - support for the `custom_persistent_disk` block ([#15400](https://github.com/hashicorp/terraform-provider-azurerm/issues/15400))\n* `azurerm_servicebus_namespace` - support for the `identity` block ([#15371](https://github.com/hashicorp/terraform-provider-azurerm/issues/15371))\n* `azurerm_storage_account` - add support for creating a customer managed key upon creation of a storage account ([#15082](https://github.com/hashicorp/terraform-provider-azurerm/issues/15082))\n* `azurerm_storage_management_policy` - add support for `tier_to_cool_after_days_since_last_access_time_greater_than`, `tier_to_archive_after_days_since_last_access_time_greater_than,` and `delete_after_days_since_last_access_time_greater_than` ([#15423](https://github.com/hashicorp/terraform-provider-azurerm/issues/15423))\n* `azurerm_web_pubsub` - support for the `identity` block ([#15288](https://github.com/hashicorp/terraform-provider-azurerm/issues/15288))\n\nBUG FIXES:\n\n* `azurerm_application_gateway` - fixing a regression where the `identity` block wasn't set into the state ([#15412](https://github.com/hashicorp/terraform-provider-azurerm/issues/15412))\n* `azurerm_automation_account` - fixing a crash where the `keys` weren't returned from the API ([#15482](https://github.com/hashicorp/terraform-provider-azurerm/issues/15482))\n* `azurerm_kusto_cluster` - renaming the properties `enable_auto_stop` to `auto_stop_enabled`, `enable_disk_encryption` to `disk_encryption_enabled`, `enable_streaming_ingest` to `streaming_ingestion_enabled`, and `enable_purge` to `purge_enabled` with the original properties being deprecated ([#15368](https://github.com/hashicorp/terraform-provider-azurerm/issues/15368))\n* `azurerm_log_analytics_linked_storage_account` - correct casing for `data_source_type` when using `ingestion` ([#15451](https://github.com/hashicorp/terraform-provider-azurerm/issues/15451))\n* `azurerm_logic_app_integration_account_map` - set `content_type` to `text/plain` when `map_type` is `Liquid` ([#15370](https://github.com/hashicorp/terraform-provider-azurerm/issues/15370))\n* `azurerm_stream_analytics_cluster` - fix an issue where the `tags` were not being set in the state ([#15380](https://github.com/hashicorp/terraform-provider-azurerm/issues/15380))\n* `azurerm_virtual_desktop_host_pool` - the `registration_info` info block is deprecated in favour of the `azurerm_virtual_desktop_host_pool_registration_info` resource due to changes in the API ([#14953](https://github.com/hashicorp/terraform-provider-azurerm/issues/14953))\n* `azurerm_virtual_machine_data_disk_attachment` - fixing a panic when an incorrect `disk_id` is provided ([#15470](https://github.com/hashicorp/terraform-provider-azurerm/issues/15470))\n* `azurerm_web_application_firewall_policy` - `disabled_rules` is now optional ([#15386](https://github.com/hashicorp/terraform-provider-azurerm/issues/15386))\n\n## 2.96.0 (February 11, 2022)\n\nFEATURES: \n\n* **New Data Source:** `azurerm_portal_dashboard` ([#15326](https://github.com/hashicorp/terraform-provider-azurerm/issues/15326))\n* **New Data Source:** `azurerm_site_recovery_fabric` ([#15349](https://github.com/hashicorp/terraform-provider-azurerm/issues/15349))\n* **New Data Source:** `azurerm_site_recovery_protection_container` ([#15349](https://github.com/hashicorp/terraform-provider-azurerm/issues/15349))\n* **New Data Source:** `azurerm_site_recovery_replication_policy` ([#15349](https://github.com/hashicorp/terraform-provider-azurerm/issues/15349))\n* **New Resource:** `azurerm_disk_pool_iscsi_target_lun` ([#15329](https://github.com/hashicorp/terraform-provider-azurerm/issues/15329))\n* **New Resource:** `azurerm_sentinel_watchlist_item` ([#14366](https://github.com/hashicorp/terraform-provider-azurerm/issues/14366))\n* **New Resource:** `azurerm_stream_analytics_output_function` ([#15162](https://github.com/hashicorp/terraform-provider-azurerm/issues/15162))\n* **New Resource:** `azurerm_web_pubsub_network_acl` ([#14827](https://github.com/hashicorp/terraform-provider-azurerm/issues/14827))\n* **New Beta Resource:** `azurerm_app_service_source_control_slot` ([#15301](https://github.com/hashicorp/terraform-provider-azurerm/issues/15301))\n\nENHANCEMENTS: \n\n* dependencies: updating to `v0.23.1` of `github.com/hashicorp/go-azure-helpers` ([#15314](https://github.com/hashicorp/terraform-provider-azurerm/issues/15314))\n* `azurerm_application_gateway` - the `type` property within the `identity` block is now required when an `identity` block is specified ([#15337](https://github.com/hashicorp/terraform-provider-azurerm/issues/15337))\n* `azurerm_application_insights` - support for the `force_customer_storage_for_profiler` property ([#15254](https://github.com/hashicorp/terraform-provider-azurerm/issues/15254))\n* `azurerm_automation_account` - support for managed identities ([#15072](https://github.com/hashicorp/terraform-provider-azurerm/issues/15072))\n* `azurerm_data_factory` - refactoring the `identity` block to be consistent across resources ([#15344](https://github.com/hashicorp/terraform-provider-azurerm/issues/15344))\n* `azurerm_kusto_cluster` - support for the `enable_auto_stop` ([#15332](https://github.com/hashicorp/terraform-provider-azurerm/issues/15332))\n* `azurerm_linux_virtual_machine` - support the `StandardSSD_ZRS` and `Premium_ZRS` values for the `storage_account_type` property ([#15360](https://github.com/hashicorp/terraform-provider-azurerm/issues/15360))\n* `azurerm_linux_virtual_machine` - full support for Automatic VM Guest Patching ([#14906](https://github.com/hashicorp/terraform-provider-azurerm/issues/14906))\n* `azurerm_network_watcher_flow_log` - the `name` property can now be set for new resources ([#15016](https://github.com/hashicorp/terraform-provider-azurerm/issues/15016))\n* `azurerm_orchestrated_virtual_machine_scale_set` - full support for Automatic VM Guest Patching and Hotpatching ([#14935](https://github.com/hashicorp/terraform-provider-azurerm/issues/14935))\n* `azurerm_windows_virtual_machine` - support the `StandardSSD_ZRS` and `Premium_ZRS` values for the `storage_account_type` property ([#15360](https://github.com/hashicorp/terraform-provider-azurerm/issues/15360))\n* `azurerm_windows_virtual_machine` - full support for Automatic VM Guest Patching and Hotpaching ([#14796](https://github.com/hashicorp/terraform-provider-azurerm/issues/14796))\n\nBUG FIXES:\n\n* `azurerm_application_insights_api_key` - prevent panic by checking for the id of an existing API Key ([#15297](https://github.com/hashicorp/terraform-provider-azurerm/issues/15297))\n* `azurerm_app_service_active_slot` - fix regression in ID set in creation of new resource ([#15291](https://github.com/hashicorp/terraform-provider-azurerm/issues/15291))\n* `azurerm_firewall` - working around an Azure API issue when deleting the Firewall ([#15330](https://github.com/hashicorp/terraform-provider-azurerm/issues/15330))\n* `azurerm_kubernetes_cluster` - unsetting `outbound_ip_prefix_ids` or `outbound_ip_address_ids` with an empty slice will default the `load_balancer_profile` to a managed outbound IP ([#15338](https://github.com/hashicorp/terraform-provider-azurerm/issues/15338))\n* `azurerm_orchestrated_virtual_machine_scale_set` - fixing a crash when the `computer_name_prefix` wasn't specified ([#15312](https://github.com/hashicorp/terraform-provider-azurerm/issues/15312))\n* `azurerm_recovery_services_vault` - fixing an issue where the subscription couldn't be found when running in Azure Government ([#15316](https://github.com/hashicorp/terraform-provider-azurerm/issues/15316))\n\n## 2.95.0 (February 04, 2022)\n\nFEATURES: \n\n* **New Data Source:** `azurerm_container_group` ([#14946](https://github.com/hashicorp/terraform-provider-azurerm/issues/14946))\n* **New Data Source:** `azurerm_logic_app_standard` ([#15199](https://github.com/hashicorp/terraform-provider-azurerm/issues/15199))\n* **New Resource:** `azurerm_disk_pool_iscsi_target` ([#14975](https://github.com/hashicorp/terraform-provider-azurerm/issues/14975))\n* **New Beta Resource:** `azurerm_linux_function_app_slot` ([#14940](https://github.com/hashicorp/terraform-provider-azurerm/issues/14940))\n* **New Resource:** `azurerm_traffic_manager_azure_endpoint` ([#15178](https://github.com/hashicorp/terraform-provider-azurerm/issues/15178))\n* **New Resource:** `azurerm_traffic_manager_external_endpoint` ([#15178](https://github.com/hashicorp/terraform-provider-azurerm/issues/15178))\n* **New Resource:** `azurerm_traffic_manager_nested_endpoint` ([#15178](https://github.com/hashicorp/terraform-provider-azurerm/issues/15178))\n* **New Beta Resource:** `azurerm_windows_function_app_slot` ([#14940](https://github.com/hashicorp/terraform-provider-azurerm/issues/14940))\n* **New Beta Resource:** `azurerm_windows_web_app_slot` ([#14613](https://github.com/hashicorp/terraform-provider-azurerm/issues/14613))\n\nENHANCEMENTS:\n\n* dependencies: upgrading to `v0.22.0` of `github.com/hashicorp/go-azure-helpers` ([#15207](https://github.com/hashicorp/terraform-provider-azurerm/issues/15207))\n* dependencies: updating `backup` to API Version `2021-07-01` ([#14980](https://github.com/hashicorp/terraform-provider-azurerm/issues/14980))\n* `azurerm_storage_account` - the `identity` block is no longer computed ([#15207](https://github.com/hashicorp/terraform-provider-azurerm/issues/15207))\n* `azurerm_linux_virtual_machine` - support for the `dedicated_host_group_id` property ([#14936](https://github.com/hashicorp/terraform-provider-azurerm/issues/14936))\n* `azurerm_recovery_services_vault` - support Zone Redundant storage ([#14980](https://github.com/hashicorp/terraform-provider-azurerm/issues/14980))\n* `azurerm_web_pubsub_hub` - the `managed_identity_id` property within the `auth` block now accepts UUIDs ([#15183](https://github.com/hashicorp/terraform-provider-azurerm/issues/15183))\n* `azurerm_windows_virtual_machine` - support for the `dedicated_host_group_id` property ([#14936](https://github.com/hashicorp/terraform-provider-azurerm/issues/14936))\n\nBUG FIXES:\n\n* `azurerm_container_group` - fixing parallel provisioning failures with the same `network_profile_id` ([#15098](https://github.com/hashicorp/terraform-provider-azurerm/issues/15098))\n* `azurerm_frontdoor` - fixing the validation for `resource_group_name` ([#15174](https://github.com/hashicorp/terraform-provider-azurerm/issues/15174))\n* `azurerm_kubernetes_cluster` - prevent panic when updating `sku_tier` ([#15229](https://github.com/hashicorp/terraform-provider-azurerm/issues/15229))\n* `azurerm_hdinsight_interactive_query_cluster` - support for the `storage_resource_id` property to fix missing storage account errors ([#15039](https://github.com/hashicorp/terraform-provider-azurerm/issues/15039))\n* `azurerm_hdinsight_hadoop_cluster` - support for the `storage_resource_id` property to fix missing storage account errors ([#15039](https://github.com/hashicorp/terraform-provider-azurerm/issues/15039))\n* `azurerm_hdinsight_spark_cluster` - support for the `storage_resource_id` property to fix missing storage account errors ([#15039](https://github.com/hashicorp/terraform-provider-azurerm/issues/15039))\n* `azurerm_hdinsight_hbase_cluster` - support for the `storage_resource_id` property to fix missing storage account errors ([#15039](https://github.com/hashicorp/terraform-provider-azurerm/issues/15039))\n* `azurerm_log_analytics_datasource_windows_event` - adding a state migration to fix `ID was missing the dataSources element` ([#15194](https://github.com/hashicorp/terraform-provider-azurerm/issues/15194))\n* `azurerm_policy_definition` - fix the deprecation of `management_group_name` in favour of `management_group_id` ([#15209](https://github.com/hashicorp/terraform-provider-azurerm/issues/15209))\n* `azurerm_policy_set_definition` - fix the deprecation of `management_group_name` in favour of `management_group_id` ([#15209](https://github.com/hashicorp/terraform-provider-azurerm/issues/15209))\n* `azurerm_static_site` - fixing the creation of a Free tier Static Site ([#15141](https://github.com/hashicorp/terraform-provider-azurerm/issues/15141))\n* `azurerm_storage_share` - fixing the `ShareBeingDeleted` error when the Storage Share is recreated ([#15180](https://github.com/hashicorp/terraform-provider-azurerm/issues/15180))\n* \n## 2.94.0 (January 28, 2022)\n\nUPGRADE NOTES:\n\n* provider: support for the Azure German cloud has been removed in this release as this environment is no longer operational ([#14403](https://github.com/hashicorp/terraform-provider-azurerm/issues/14403))\n* `azurerm_api_management_policy` - resources that were created with v2.92.0 will be marked as tainted due to a [bug](https://github.com/hashicorp/terraform-provider-azurerm/issues/15042). This version addresses the underlying issue, but the actual resource needs to either be untainted (via `terraform untaint`) or allow Terraform to delete the resource and create it again.\n* `azurerm_hdinsight_kafka_cluster` - the `security_group_name` property in the `rest_proxy` block is conditionally required when the `use_msal` provider property is enabled ([#14403](https://github.com/hashicorp/terraform-provider-azurerm/issues/14403))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_linux_function_app` ([#15009](https://github.com/hashicorp/terraform-provider-azurerm/issues/15009))\n* **New Data Source** `azurerm_web_pubsub` ([#14731](https://github.com/hashicorp/terraform-provider-azurerm/issues/14731))\n* **New Data Source** `azurerm_web_pubsub_hub` ([#14731](https://github.com/hashicorp/terraform-provider-azurerm/issues/14731))\n* **New Resource:** `azurerm_web_pubsub` ([#14731](https://github.com/hashicorp/terraform-provider-azurerm/issues/14731))\n* **New Resource:** `azurerm_web_pubsub_hub` ([#14731](https://github.com/hashicorp/terraform-provider-azurerm/issues/14731))\n* **New Resource:** `azurerm_virtual_desktop_host_pool_registration_info` ([#14134](https://github.com/hashicorp/terraform-provider-azurerm/issues/14134))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v61.3.0` of `github.com/Azure/azure-sdk-for-go` ([#15080](https://github.com/hashicorp/terraform-provider-azurerm/issues/15080))\n* dependencies: updating to `v0.21.0` of `github.com/hashicorp/go-azure-helpers` ([#15043](https://github.com/hashicorp/terraform-provider-azurerm/issues/15043))\n* dependencies: updating `kusto` to API Version `2021-08-27` ([#15040](https://github.com/hashicorp/terraform-provider-azurerm/issues/15040))\n* provider: opt-in support for v2 authentication tokens via the `use_msal` provider property ([#14403](https://github.com/hashicorp/terraform-provider-azurerm/issues/14403))\n* `azurerm_app_service_slot`- support for the `storage_account` block ([#15084](https://github.com/hashicorp/terraform-provider-azurerm/issues/15084))\n* `azurerm_stream_analytics_stream_input_eventhub` - support for the `partition_key` property ([#15019](https://github.com/hashicorp/terraform-provider-azurerm/issues/15019))\n\nBUG FIXES:\n\n* `data.image_source` - fix a regression around `id` ([#15119](https://github.com/hashicorp/terraform-provider-azurerm/issues/15119))\n* `azurerm_api_management_backend` fix a crash caused by `backend_credentials` ([#15123](https://github.com/hashicorp/terraform-provider-azurerm/issues/15123))\n* `azurerm_api_management_policy` - fixing the Resource ID for the `api_management_policy` block when this was provisioned using version `2.92.0` of the Azure Provider ([#15060](https://github.com/hashicorp/terraform-provider-azurerm/issues/15060))\n* `azurerm_bastion_host` - fix a crash by adding nil check for the `copy_paste_enabled` property ([#15074](https://github.com/hashicorp/terraform-provider-azurerm/issues/15074))\n* `azurerm_dev_test_lab` - fix an unexpected diff on with the `key_vault_id` property ([#15054](https://github.com/hashicorp/terraform-provider-azurerm/issues/15054))\n* `azurerm_subscription_cost_management_export` - now sends the `ETag` when updating a cost management export ([#15017](https://github.com/hashicorp/terraform-provider-azurerm/issues/15017))\n* `azurerm_template_deployment` - fixes a potential bug occurring during the deletion of a template deployment ([#15085](https://github.com/hashicorp/terraform-provider-azurerm/issues/15085))\n* `azurerm_eventhub` - the `partition_count` property can now be changed when using Premium `sku` ([#15088](https://github.com/hashicorp/terraform-provider-azurerm/issues/15088))\n\n## 2.93.1 (January 24, 2022)\n\nBUG FIXES:\n\n* `azurerm_app_service` - fix name availability check request ([#15062](https://github.com/hashicorp/terraform-provider-azurerm/issues/15062))\n\n## 2.93.0 (January 21, 2022)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_mysql_flexible_server` ([#14976](https://github.com/hashicorp/terraform-provider-azurerm/issues/14976))\n* **New Beta Data Source**: `azurerm_windows_function_app` ([#14964](https://github.com/hashicorp/terraform-provider-azurerm/issues/14964))\n\nENHANCEMENTS: \n\n* dependencies: upgrading to `v61.1.0` of `github.com/Azure/azure-sdk-for-go` ([#14828](https://github.com/hashicorp/terraform-provider-azurerm/issues/14828))\n* dependencies: updating `containerregistry` to API version `2021-08-01-preview` ([#14961](https://github.com/hashicorp/terraform-provider-azurerm/issues/14961))\n* Data Source `azurerm_logic_app_workflow` - exporting the `identity` block ([#14896](https://github.com/hashicorp/terraform-provider-azurerm/issues/14896))\n* `azurerm_bastion_host` - support for the `copy_paste_enabled`, `file_copy_enabled`, `ip_connect_enabled`, `shareable_link_enabled`, and `tunneling_enabled` properties ([#14987](https://github.com/hashicorp/terraform-provider-azurerm/issues/14987))\n* `azurerm_bastion_host` - support for the `scale_units` property ([#14968](https://github.com/hashicorp/terraform-provider-azurerm/issues/14968))\n* `azurerm_security_center_automation ` - the `event_source` property can now be set to `AssessmentsSnapshot`,\n`RegulatoryComplianceAssessment`, `RegulatoryComplianceAssessmentSnapshot`, `SecureScoreControlsSnapshot`, `SecureScoresSnapshot`, and `SubAssessmentsSnapshot` ([#14996](https://github.com/hashicorp/terraform-provider-azurerm/issues/14996))\n* `azurerm_static_site` - support for the `identity` block ([#14911](https://github.com/hashicorp/terraform-provider-azurerm/issues/14911))\n* `azurerm_iothub` - Support for Identity-Based Endpoints ([#14705](https://github.com/hashicorp/terraform-provider-azurerm/issues/14705))\n* `azurerm_servicebus_namespace_network_rule_set` -  support for the `public_network_access_enabled` property ([#14967](https://github.com/hashicorp/terraform-provider-azurerm/issues/14967))\n\nBUG FIXES:\n\n* `azurerm_machine_learning_compute_instance` - add validation for `tenant_id` and `object_id` properties to prevent null values and subsequent panic ([#14982](https://github.com/hashicorp/terraform-provider-azurerm/issues/14982))\n* `azurerm_linux_function_app` - (beta) fix potential panic in `application_stack` when that block is not in config ([#14844](https://github.com/hashicorp/terraform-provider-azurerm/issues/14844))\n* `azurerm_storage_share_file` changing the `content_md5` property will now trigger recreation and the `content_length` property of share file will now be set when updating properties. ([#15007](https://github.com/hashicorp/terraform-provider-azurerm/issues/15007))\n\n## 2.92.0 (January 14, 2022)\n\nFEATURES:\n\n* **New Resource:** `azurerm_api_management_api_tag` ([#14711](https://github.com/hashicorp/terraform-provider-azurerm/issues/14711))\n* **New Resource:** `azurerm_disk_pool_managed_disk_attachment` ([#14268](https://github.com/hashicorp/terraform-provider-azurerm/issues/14268))\n\nENHANCEMENTS:\n\n* dependencies: upgrading `eventgrid` to API version `2021-12-01` ([#14433](https://github.com/hashicorp/terraform-provider-azurerm/issues/14433))\n* `azurerm_api_management_custom_domain` - the `proxy` property has been deprecated in favour of the `gateway` for the 3.0 release ([#14628](https://github.com/hashicorp/terraform-provider-azurerm/issues/14628))\n* `azurerm_databricks_workspace_customer_managed_key` - allow creation of resource when `infrastructure_encryption_enabled` is set to `true` for the databricks workspace ([#14915](https://github.com/hashicorp/terraform-provider-azurerm/issues/14915))\n* `azurerm_eventgrid_domain` - support for the `local_auth_enabled`, `auto_create_topic_with_first_subscription`, and `auto_delete_topic_with_last_subscription` properties ([#14433](https://github.com/hashicorp/terraform-provider-azurerm/issues/14433))\n* `azurerm_monitor_action_group` - support for the `event_hub_receiver` block ([#14771](https://github.com/hashicorp/terraform-provider-azurerm/issues/14771))\n* `azurerm_mssql_server_extended_auditing_policy` - support storing audit data in storage account that is behind a firewall and VNet ([#14656](https://github.com/hashicorp/terraform-provider-azurerm/issues/14656))\n* `azurerm_purview_account` - export the `managed_resources` block ([#14865](https://github.com/hashicorp/terraform-provider-azurerm/issues/14865))\n* `azurerm_recovery_services_vault`- support for customer-managed keys (CMK) with the `encryption` block ([#14718](https://github.com/hashicorp/terraform-provider-azurerm/issues/14718))\n* `azurerm_storage_account` - support for the `infrastructure_encryption_enabled` property ([#14864](https://github.com/hashicorp/terraform-provider-azurerm/issues/14864))\n\nBUG FIXES:\n\n* `azurerm_aadb2c_directory` - fix importing existing resources ([#14879](https://github.com/hashicorp/terraform-provider-azurerm/issues/14879))\n* `azurerm_consumption_budget_subscription` - fix issue in migration logic ([#14898](https://github.com/hashicorp/terraform-provider-azurerm/issues/14898))\n* `azurerm_cosmosdb_account` - only force ForceMongo when kind is set to MongoDB ([#14924](https://github.com/hashicorp/terraform-provider-azurerm/issues/14924))\n* `azurerm_cosmosdb_mongo_collection` - now validates that \"_id\" is included as an index key ([#14857](https://github.com/hashicorp/terraform-provider-azurerm/issues/14857))\n* `azurerm_hdinsight` - hdinsight resources using oozie metastore can now be created without error ([#14880](https://github.com/hashicorp/terraform-provider-azurerm/issues/14880))\n* `azurerm_log_analytics_datasource_windows_performance_counter` - state migration for case conversion of ID element ([#14916](https://github.com/hashicorp/terraform-provider-azurerm/issues/14916))\n* `azurerm_monitor_aad_diagnostic_setting` - use the correct parser function for event hub rule IDs ([#14944](https://github.com/hashicorp/terraform-provider-azurerm/issues/14944))\n* `azurerm_mysql_server_key` - fix issue when checking for existing resource on create ([#14883](https://github.com/hashicorp/terraform-provider-azurerm/issues/14883))\n* `azurerm_spring_cloud_service` - fix panic when removing git repos ([#14900](https://github.com/hashicorp/terraform-provider-azurerm/issues/14900))\n* `azurerm_log_analytics_workspace` - the `reservation_capcity_in_gb_per_day` has been deprecated and renamed to `reservation_capacity_in_gb_per_day` ([#14910](https://github.com/hashicorp/terraform-provider-azurerm/issues/14910))\n* `azurerm_iothub_dps` - fixed default value of `allocation_weight` to match azure default ([#14943](https://github.com/hashicorp/terraform-provider-azurerm/issues/14943))\n* `azurerm_iothub` - now exports `event_hub_events_namespace` and has a fallback route by default ([#14942](https://github.com/hashicorp/terraform-provider-azurerm/issues/14942))\n\n## 2.91.0 (January 07, 2022)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_aadb2c_directory` ([#14671](https://github.com/hashicorp/terraform-provider-azurerm/issues/14671))\n* **New Data Source:** `azurerm_sql_managed_instance` ([#14739](https://github.com/hashicorp/terraform-provider-azurerm/issues/14739))\n* **New Resource:** `azurerm_aadb2c_directory` ([#14671](https://github.com/hashicorp/terraform-provider-azurerm/issues/14671))\n* **New Resource:** `azurerm_app_service_slot_custom_hostname_binding` ([#13097](https://github.com/hashicorp/terraform-provider-azurerm/issues/13097))\n* **New Resource:** `azurerm_data_factory_linked_service_odbc` ([#14787](https://github.com/hashicorp/terraform-provider-azurerm/issues/14787))\n* **New Resource:** `azurerm_disk_pool` ([#14675](https://github.com/hashicorp/terraform-provider-azurerm/issues/14675))\n* **New Resource:** `azurerm_load_test` ([#14724](https://github.com/hashicorp/terraform-provider-azurerm/issues/14724))\n* **New Resource:** `azurerm_virtual_desktop_scaling_plan` ([#14188](https://github.com/hashicorp/terraform-provider-azurerm/issues/14188))\n\nENHANCEMENTS:\n\n* dependencies: upgrading `appplatform` to API version `2021-09-01-preview` ([#14365](https://github.com/hashicorp/terraform-provider-azurerm/issues/14365))\n* dependencies: upgrading `network` to API Version `2021-05-01` ([#14164](https://github.com/hashicorp/terraform-provider-azurerm/issues/14164))\n* dependencies: upgrading to `v60.2.0` of `github.com/Azure/azure-sdk-for-go` ([#14688](https://github.com/hashicorp/terraform-provider-azurerm/issues/14688)] and [[#14667](https://github.com/hashicorp/terraform-provider-azurerm/issues/14667))\n* dependencies: upgrading to `v2.10.1` of `github.com/hashicorp/terraform-plugin-sdk` ([#14666](https://github.com/hashicorp/terraform-provider-azurerm/issues/14666))\n* `azurerm_application_gateway` - support for the `key_vault_secret_id` and `force_firewall_policy_association` properties ([#14413](https://github.com/hashicorp/terraform-provider-azurerm/issues/14413))\n* `azurerm_application_gateway` - support the `fips_enabled` property ([#14797](https://github.com/hashicorp/terraform-provider-azurerm/issues/14797))\n* `azurerm_cdn_endpoint_custom_domain` - support for HTTPS ([#13283](https://github.com/hashicorp/terraform-provider-azurerm/issues/13283))\n* `azurerm_hdinsight_hbase_cluster` - support for the `network` property ([#14825](https://github.com/hashicorp/terraform-provider-azurerm/issues/14825))\n* `azurerm_iothub` - support for the `identity` block ([#14354](https://github.com/hashicorp/terraform-provider-azurerm/issues/14354))\n* `azurerm_iothub_endpoint_servicebus_queue_resource` - deprecating the `iothub_name` property in favour of `iothub_id` property ([#14690](https://github.com/hashicorp/terraform-provider-azurerm/issues/14690))\n* `azurerm_iothub_endpoint_storage_container_resource` - deprecating the `iothub_name` property in favour of `iothub_id` property [[#14690](https://github.com/hashicorp/terraform-provider-azurerm/issues/14690)] \n* `azurerm_iot_fallback_route` - support for the `source` property ([#14836](https://github.com/hashicorp/terraform-provider-azurerm/issues/14836))\n* `azurerm_kubernetes_cluster` - support for the `public_network_access_enabled`, `scale_down_mode`, and `workload_runtime` properties ([#14386](https://github.com/hashicorp/terraform-provider-azurerm/issues/14386))\n* `azurerm_linux_function_app` - (Beta Resource) fix the filtering of `app_settings` for `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ([#14815](https://github.com/hashicorp/terraform-provider-azurerm/issues/14815))\n* `azurerm_linux_virtual_machine` - support for the `user_data` property ([#13888](https://github.com/hashicorp/terraform-provider-azurerm/issues/13888))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `user_data` property ([#13888](https://github.com/hashicorp/terraform-provider-azurerm/issues/13888))\n* `azurerm_managed_disk` - support for the `gallery_image_reference_id` property ([#14121](https://github.com/hashicorp/terraform-provider-azurerm/issues/14121))\n* `azurerm_mysql_server` - support capacities up to `16TB` for the `storage_mb` property ([#14838](https://github.com/hashicorp/terraform-provider-azurerm/issues/14838))\n* `azurerm_postgresql_flexible_server` - support for the `geo_redundant_backup_enabled` property ([#14661](https://github.com/hashicorp/terraform-provider-azurerm/issues/14661))\n* `azurerm_recovery_services_vault` - support for the `storage_mode_type` property ([#14659](https://github.com/hashicorp/terraform-provider-azurerm/issues/14659))\n* `azurerm_spring_cloud_certificate` - support for the `certificate_content` property ([#14689](https://github.com/hashicorp/terraform-provider-azurerm/issues/14689))\n* `azurerm_servicebus_namespace_authorization_rule` - the `resource_group_name` and `namespace_name` properties have been deprecated in favour of the `namespace_id` property ([#14784](https://github.com/hashicorp/terraform-provider-azurerm/issues/14784))\n* `azurerm_servicebus_namespace_network_rule_set` - the `resource_group_name` and `namespace_name` properties have been deprecated in favour of the `namespace_id` property ([#14784](https://github.com/hashicorp/terraform-provider-azurerm/issues/14784))\n* `azurerm_servicebus_namespace_authorization_rule` - the `resource_group_name` and `namespace_name` properties have been deprecated in favour of the `namespace_id` property ([#14784](https://github.com/hashicorp/terraform-provider-azurerm/issues/14784))\n* `azurerm_servicebus_queue` - the `resource_group_name` and `namespace_name` properties have been deprecated in favour of the `namespace_id` property ([#14784](https://github.com/hashicorp/terraform-provider-azurerm/issues/14784))\n* `azurerm_servicebus_queue_authorization_rule` - the `resource_group_name`, `namespace_name`, and `queue_name` properties have been deprecated in favour of the `queue_id` property ([#14784](https://github.com/hashicorp/terraform-provider-azurerm/issues/14784))\n* `azurerm_servicebus_subscription` - the `resource_group_name`, `namespace_name`, and `topic_name` properties have been deprecated in favour of the `topic_id` property ([#14784](https://github.com/hashicorp/terraform-provider-azurerm/issues/14784))\n* `azurerm_servicebus_subscription_rule` - the `resource_group_name`, `namespace_name`, `topic_name`, and `subscription_name` properties have been deprecated in favour of the `subscription_id` property ([#14784](https://github.com/hashicorp/terraform-provider-azurerm/issues/14784))\n* `azurerm_servicebus_topic` - the `resource_group_name` and `namespace_name` properties have been deprecated in favour of the `namespace_id` property ([#14784](https://github.com/hashicorp/terraform-provider-azurerm/issues/14784))\n* `azurerm_servicebus_topic_authorization_rule` - the `resource_group_name`, `namespace_name`, and `topic_name` properties have been deprecated in favour of the `topic_id` property ([#14784](https://github.com/hashicorp/terraform-provider-azurerm/issues/14784))\n* `azurerm_shared_image_version` - images can now be sorted by semver ([#14708](https://github.com/hashicorp/terraform-provider-azurerm/issues/14708))\n* `azurerm_virtual_network_gateway_connection` - support for the `connection_mode` property ([#14738](https://github.com/hashicorp/terraform-provider-azurerm/issues/14738))\n* `azurerm_web_application_firewall_policy` - the `file_upload_limit_in_mb` property within the `policy_settings` block can now be set to `4000` ([#14715](https://github.com/hashicorp/terraform-provider-azurerm/issues/14715))\n* `azurerm_windows_virtual_machine` - support for the `user_data` property ([#13888](https://github.com/hashicorp/terraform-provider-azurerm/issues/13888))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `user_data` property ([#13888](https://github.com/hashicorp/terraform-provider-azurerm/issues/13888))\n\nBUG FIXES:\n\n* `azurerm_app_service_environment_v3` - fix the default value of the `allow_new_private_endpoint_connections` property ([#14805](https://github.com/hashicorp/terraform-provider-azurerm/issues/14805))\n* `azurerm_consumption_budget_subscription` - added an additional state migration to fix the bug introduced by the first one and to parse the `subscription_id` from the resource's ID ([#14803](https://github.com/hashicorp/terraform-provider-azurerm/issues/14803))\n* `azurerm_network_interface_security_group_association` - checking the ID matches the expected format during import ([#14753](https://github.com/hashicorp/terraform-provider-azurerm/issues/14753))\n* `azurerm_storage_management_policy` - handle the unexpected deletion of the storage account ([#14799](https://github.com/hashicorp/terraform-provider-azurerm/issues/14799))\n\n## 2.90.0 (December 17, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_app_configuration_key` ([#14484](https://github.com/hashicorp/terraform-provider-azurerm/issues/14484))\n* **New Resource:** `azurerm_container_registry_task` ([#14533](https://github.com/hashicorp/terraform-provider-azurerm/issues/14533))\n* **New Resource:** `azurerm_maps_creator` ([#14566](https://github.com/hashicorp/terraform-provider-azurerm/issues/14566))\n* **New Resource:** `azurerm_netapp_snapshot_policy` ([#14230](https://github.com/hashicorp/terraform-provider-azurerm/issues/14230))\n* **New Resource:** `azurerm_synapse_sql_pool_workload_classifier` ([#14412](https://github.com/hashicorp/terraform-provider-azurerm/issues/14412))\n* **New Resource:** `azurerm_synapse_workspace_sql_aad_admin` ([#14341](https://github.com/hashicorp/terraform-provider-azurerm/issues/14341))\n* **New Resource:** `azurerm_vpn_gateway_nat_rule` ([#14527](https://github.com/hashicorp/terraform-provider-azurerm/issues/14527))\n\nENHANCEMENTS:\n\n* dependencies: updating `apimanagement` to API Version `2021-08-01` ([#14312](https://github.com/hashicorp/terraform-provider-azurerm/issues/14312))\n* dependencies: updating `managementgroups` to API Version `2020-05-01` ([#14635](https://github.com/hashicorp/terraform-provider-azurerm/issues/14635))\n* dependencies: updating `redisenterprise` to use an Embedded SDK ([#14502](https://github.com/hashicorp/terraform-provider-azurerm/issues/14502))\n* dependencies: updating to `v0.19.1` of `github.com/hashicorp/go-azure-helpers` ([#14627](https://github.com/hashicorp/terraform-provider-azurerm/issues/14627))\n* dependencies: updating to `v2.10.0` of `github.com/hashicorp/terraform-plugin-sdk` ([#14596](https://github.com/hashicorp/terraform-provider-azurerm/issues/14596))\n* Data Source: `azurerm_function_app_host_keys` - support for `signalr_extension_key` and `durabletask_extension_key` ([#13648](https://github.com/hashicorp/terraform-provider-azurerm/issues/13648))\n* `azurerm_application_gateway ` - support for private link configurations ([#14583](https://github.com/hashicorp/terraform-provider-azurerm/issues/14583))\n* `azurerm_blueprint_assignment` - support for the `lock_exclude_actions` property ([#14648](https://github.com/hashicorp/terraform-provider-azurerm/issues/14648))\n* `azurerm_container_group` - support for `ip_address_type = None` ([#14460](https://github.com/hashicorp/terraform-provider-azurerm/issues/14460))\n* `azurerm_cosmosdb_account` - support for the `create_mode` property and `restore` block ([#14362](https://github.com/hashicorp/terraform-provider-azurerm/issues/14362))\n* `azurerm_data_factory_dataset_*` - deprecate `data_factory_name` in favour of `data_factory_id` for consistency across all data factory dataset resources ([#14610](https://github.com/hashicorp/terraform-provider-azurerm/issues/14610))\n* `azurerm_data_factory_integration_runtime_*`- deprecate `data_factory_name` in favour of `data_factory_id` for consistency across all data factory integration runtime resources ([#14610](https://github.com/hashicorp/terraform-provider-azurerm/issues/14610))\n* `azurerm_data_factory_trigger_*`- deprecate `data_factory_name` in favour of `data_factory_id` for consistency across all data factory trigger resources ([#14610](https://github.com/hashicorp/terraform-provider-azurerm/issues/14610))\n* `azurerm_data_factory_pipeline`- deprecate `data_factory_name` in favour of `data_factory_id` for consistency across all data factory resources ([#14610](https://github.com/hashicorp/terraform-provider-azurerm/issues/14610))\n* `azurerm_iothub` - support for the `cloud_to_device` block ([#14546](https://github.com/hashicorp/terraform-provider-azurerm/issues/14546))\n* `azurerm_iothub_endpoint_eventhub` - the `iothub_name` property has been deprecated in favour of the `iothub_id` property ([#14632](https://github.com/hashicorp/terraform-provider-azurerm/issues/14632))\n* `azurerm_logic_app_workflow` - support for the `open_authentication_policy` block ([#14007](https://github.com/hashicorp/terraform-provider-azurerm/issues/14007))\n* `azurerm_signalr` - support for the `live_trace_enabled` property ([#14646](https://github.com/hashicorp/terraform-provider-azurerm/issues/14646))\n* `azurerm_xyz_policy_assignment` add support for `non_compliance_message` ([#14518](https://github.com/hashicorp/terraform-provider-azurerm/issues/14518))\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_account` - will now set a default value for `default_identity_type` when the API return a nil value ([#14643](https://github.com/hashicorp/terraform-provider-azurerm/issues/14643))\n* `azurerm_function_app` - address `app_settings` during creation rather than just updates ([#14638](https://github.com/hashicorp/terraform-provider-azurerm/issues/14638))\n* `azurerm_marketplace_agreement` - fix crash when the import check triggers ([#14614](https://github.com/hashicorp/terraform-provider-azurerm/issues/14614))\n* `azurerm_postgresql_configuration` - now locks during write operations to prevent conflicts ([#14619](https://github.com/hashicorp/terraform-provider-azurerm/issues/14619))\n* `azurerm_postgresql_flexible_server_configuration` - now locks during write operations to prevent conflicts ([#14607](https://github.com/hashicorp/terraform-provider-azurerm/issues/14607))\n\n## 2.89.0 (December 10, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_bot_service_azure_bot` [[#14462](https://github.com/hashicorp/terraform-provider-azurerm/issues/14462)] \n* **New Resource:** `azurerm_consumption_budget_management_group` [[#14411](https://github.com/hashicorp/terraform-provider-azurerm/issues/14411)] \n* **New Resource:** `azurerm_sql_managed_instance_active_directory_administrator` ([#14104](https://github.com/hashicorp/terraform-provider-azurerm/issues/14104))\n* **New Resource:** `azurerm_sql_managed_instance_failover_group` ([#13974](https://github.com/hashicorp/terraform-provider-azurerm/issues/13974))\n* **New Beta resource:** `azurerm_windows_function_app` ([#14247](https://github.com/hashicorp/terraform-provider-azurerm/issues/14247))\n* **New Beta Resource:** `azurerm_linux_web_app_slot` ([#14305](https://github.com/hashicorp/terraform-provider-azurerm/issues/14305))\n\nENHANCEMENTS:\n\n* dependencies: updating the Embedded SDK for `databricks` ([#14430](https://github.com/hashicorp/terraform-provider-azurerm/issues/14430))\n* dependencies: updating the Embedded SDK for `datalake` ([#14429](https://github.com/hashicorp/terraform-provider-azurerm/issues/14429))\n* dependencies: updating the Embedded SDK for `frontdoor` ([#14432](https://github.com/hashicorp/terraform-provider-azurerm/issues/14432))\n* `azurerm_app_service_environment_v3` - allow updating of `tags` ([#14491](https://github.com/hashicorp/terraform-provider-azurerm/issues/14491))\n* `azurerm_data_factory_linked_services_*` - deprecate `data_factory_name` in favour of `data_factory_id` for consistency across all data factory linked service resources ([#14492](https://github.com/hashicorp/terraform-provider-azurerm/issues/14492))\n* `azurerm_shared_image` - support for the `trusted_launch_enabled` property ([#14528](https://github.com/hashicorp/terraform-provider-azurerm/issues/14528))\n* `azurerm_key_vault_certificate` - support for the `versionless_id` and `versionless_secret_id` properties ([#14287](https://github.com/hashicorp/terraform-provider-azurerm/issues/14287))\n* `azurerm_kubernetes_cluster` - support for the `http_proxy_config` block which contains the `http_proxy`, `https_proxy`, `no_proxy` and `trusted_ca` properties ([#14177](https://github.com/hashicorp/terraform-provider-azurerm/issues/14177))\n* `azurerm_kubernetes_cluster` - support for the `azure_keyvault_secrets_provider` addon ([#14308](https://github.com/hashicorp/terraform-provider-azurerm/issues/14308))\n* `azurerm_managed_disk` - support for the `hyper_v_generation` property ([#13825](https://github.com/hashicorp/terraform-provider-azurerm/issues/13825))\n* `azurerm_netapp_pool` - support for `qos_type` property ([#14372](https://github.com/hashicorp/terraform-provider-azurerm/issues/14372))\n* `azurerm_netapp_volume` - support for `throughput_in_mibps` property ([#14372](https://github.com/hashicorp/terraform-provider-azurerm/issues/14372))\n* `azurerm_sql_managed_instance`: Support for `storage_account_type` ([#14123](https://github.com/hashicorp/terraform-provider-azurerm/issues/14123))\n* `azurerm_signalr_service` - deprecate `features` block in favour of `connectivity_logs_enabled`, `messaging_logs_enabled` and `service_mode` ([#14360](https://github.com/hashicorp/terraform-provider-azurerm/issues/14360))\n* `azurerm_vpn_gateway_connection` - support for the `propagated_route_table.labels`, `vpn_link.connection_mode` and `traffic_selector_policy` properties ([#14371](https://github.com/hashicorp/terraform-provider-azurerm/issues/14371))\n\nBUG FIXES:\n\n* `azurerm_data_factory_trigger_schedule` - correctly set `schedule` when `frequency` is `Month/Week` ([#14391](https://github.com/hashicorp/terraform-provider-azurerm/issues/14391))\n* `azurerm_iothub_endpoint_storage_container` - remove the default value `false` from the `file_name_format` property and add the correct validation function for it ([#14458](https://github.com/hashicorp/terraform-provider-azurerm/issues/14458))\n* `azurerm_postgresql_server` - will now change the password after being promoted from `Replica` to `Default` mode ([#14376](https://github.com/hashicorp/terraform-provider-azurerm/issues/14376))\n\nBETA NOTES:\n\nA number of properties in the App Service Beta resources have been renamed for consistency with the rest of the provider. As these are beta resources, this breaking change is not compensated for with deprecations or state migrations. Please update any configurations using these resources with the following details:\n\n* `remote_debugging` renamed to `remote_debugging_enabled`\n* `number_of_workers` renamed to `worker_count`\n* `detailed_error_logging` renamed to `detailed_error_logging_enabled`\n* `auto_heal` renamed to `auto_heal_enabled`\n* `local_mysql` renamed to `local_mysql_enabled`\n* `client_cert_enabled` renamed to `client_certificate_enabled`\n* `client_cert_mode` renamed to `client_certificate_mode`\n\n## 2.88.1 (December 03, 2021)\n\nBUG FIXES\n\n* Data Source: `azurerm_automation_account` - fixing a bug where the Resource Group and Name were set in the wrong order ([#14464](https://github.com/hashicorp/terraform-provider-azurerm/issues/14464))\n* Data Source: `azurerm_api_management` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* Data Source: `azurerm_kubernetes_cluster` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_api_management` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_app_service` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_app_service_slot` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_application_gateway` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_automation_account` - fixing a bug where the Resource Group and Name were set in the wrong order ([#14464](https://github.com/hashicorp/terraform-provider-azurerm/issues/14464))\n* `azurerm_container_group` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_data_factory` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_function_app` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_function_app_slot` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_kubernetes_cluster` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_kusto_cluster` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n* `azurerm_mssql_server` - fixing a bug where the Managed Identity ID's weren't parsed correctly ([#14469](https://github.com/hashicorp/terraform-provider-azurerm/issues/14469))\n\n## 2.88.0 (December 02, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_mysql_flexible_database` ([#14285](https://github.com/hashicorp/terraform-provider-azurerm/issues/14285))\n* **New Resource:** `azurerm_synapse_sql_pool_workload_group` ([#13658](https://github.com/hashicorp/terraform-provider-azurerm/issues/13658))\n\nENHANCEMENTS:\n\n* dependencies: upgrading `storagecache` to API Version `2021-09-01` ([#14311](https://github.com/hashicorp/terraform-provider-azurerm/issues/14311))\n* `azurerm_app_service` - support for the `client_cert_mode` property ([#14395](https://github.com/hashicorp/terraform-provider-azurerm/issues/14395))\n* `azurerm_bastion_host` - support for `sku` property ([#14370](https://github.com/hashicorp/terraform-provider-azurerm/issues/14370))\n* `azurerm_batch_pool` - deprecate `max_task_retry_count` and `environment` in favour of `task_retry_maximum` and `common_environment_properties` for consistency across batch resources ([#14368](https://github.com/hashicorp/terraform-provider-azurerm/issues/14368))\n* `azurerm_data_factory_managed_private_endpoint` - support for the `fqdns` property ([#14355](https://github.com/hashicorp/terraform-provider-azurerm/issues/14355))\n* `azurerm_linux_virtual_machine` - support the `secure_boot_enabled` and `vtpm_enabled` properties ([#13842](https://github.com/hashicorp/terraform-provider-azurerm/issues/13842))\n* `azurerm_linux_virtual_machine_scale_set` - support the `secure_boot_enabled` and `vtpm_enabled` properties ([#13842](https://github.com/hashicorp/terraform-provider-azurerm/issues/13842))\n* `azurerm_mssql_database` - add support for transparent data encryption, behind a 3.0 feature flag [[#13748](https://github.com/hashicorp/terraform-provider-azurerm/issues/13748)] \n* `azurerm_point_to_site_vpn_gateway` - support for the `internet_security_enabled` property ([#14345](https://github.com/hashicorp/terraform-provider-azurerm/issues/14345))\n* `azurerm_subscription` - the `tags` property can now be set and updated ([#14445](https://github.com/hashicorp/terraform-provider-azurerm/issues/14445))\n\nBUG FIXES:\n\n* `azurerm_container_group` - allow `search_domains` and `options` under the `dns_config` block to be optional since they are not required by the API ([#14419](https://github.com/hashicorp/terraform-provider-azurerm/issues/14419))\n* `azurerm_monitor_aad_diagnostic_setting` - fixing the id validator to use the eventhub auth rule id rather than the relay id ([#14406](https://github.com/hashicorp/terraform-provider-azurerm/issues/14406))\n* `azurerm_kubernetes_cluster` - handle incorrect casing of kubernetes cluster resource ID with a state migration ([#14241](https://github.com/hashicorp/terraform-provider-azurerm/issues/14241))\n* `azurerm_kubernetes_cluster_node_pool` - handle incorrect casing of kubernetes cluster resource ID with a state migration ([#14241](https://github.com/hashicorp/terraform-provider-azurerm/issues/14241))\n* `azurerm_kubernetes_cluster_nodepool` reverting the computed behaviour of `node_taints` and `eviction_policy` ([#14378](https://github.com/hashicorp/terraform-provider-azurerm/issues/14378))\n* `azurerm_storage_account` - populating the account cache on creation, which fixes an issue when the storage account occasionally couldn't be found ([#14361](https://github.com/hashicorp/terraform-provider-azurerm/issues/14361))\n\n## 2.87.0 (November 26, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_api_management_notification_recipient_user` ([#14239](https://github.com/hashicorp/terraform-provider-azurerm/issues/14239))\n* **New Resource:** `azurerm_app_service_public_certificate` ([#14337](https://github.com/hashicorp/terraform-provider-azurerm/issues/14337))\n* **New Resource:** `azurerm_service_fabric_managed_cluster` ([#14131](https://github.com/hashicorp/terraform-provider-azurerm/issues/14131))\n* **New Resource:** `azurerm_sentinel_watchlist` ([#14258](https://github.com/hashicorp/terraform-provider-azurerm/issues/14258))\n* **New Resource:** `azurerm_static_site_custom_domain` ([#12764](https://github.com/hashicorp/terraform-provider-azurerm/issues/12764))\n* **New Resource:** `azurerm_stream_analytics_cluster` ([#14082](https://github.com/hashicorp/terraform-provider-azurerm/issues/14082))\n* **New Resource:** `azurerm_stream_analytics_managed_private_endpoint` ([#14082](https://github.com/hashicorp/terraform-provider-azurerm/issues/14082))\n\nENHANCEMENTS:\n\n* dependencies: upgrading to `v0.18.0` of `github.com/hashicorp/go-azure-helpers` ([#14261](https://github.com/hashicorp/terraform-provider-azurerm/issues/14261))\n* `azurerm_automation_rule` - support for the `expiration` property ([#14262](https://github.com/hashicorp/terraform-provider-azurerm/issues/14262))\n* `azurerm_cosmosdb_account` - support for the `analytical_storage` and `capacity` blocks, `default_identity_type` and `storage_redundancy` properties ([#14346](https://github.com/hashicorp/terraform-provider-azurerm/issues/14346))\n* `azurerm_eventgrid_event_subscription` - support the `queue_message_time_to_live_in_seconds` and `user_assigned_identity` properties ([#14318](https://github.com/hashicorp/terraform-provider-azurerm/issues/14318))\n* `azurerm_firewall_policy` - allow cidr ranges for the `threat_intelligence_allowlist` property ([#14340](https://github.com/hashicorp/terraform-provider-azurerm/issues/14340))\n* `azurerm_managed_disk` - support for the `public_network_access_enabled` property ([#14199](https://github.com/hashicorp/terraform-provider-azurerm/issues/14199))\n* `azurerm_mssql_elasticpool` - support for the `DC` family ([#14270](https://github.com/hashicorp/terraform-provider-azurerm/issues/14270))\n* `azurerm_mssql_server` - groundwork for the (currently disabled) 3.0 feature to set the default TLS version to 1.2 ([#14229](https://github.com/hashicorp/terraform-provider-azurerm/issues/14229))\n* `azurerm_mysql_server` - groundwork for the (currently disabled) 3.0 feature to set the default TLS version to 1.2 ([#14229](https://github.com/hashicorp/terraform-provider-azurerm/issues/14229))\n* `azurerm_orchestrated_virtual_machine_scale_set` - add extension support ([#14236](https://github.com/hashicorp/terraform-provider-azurerm/issues/14236))\n* `azurerm_postgresql_server` - groundwork for the (currently disabled) 3.0 feature to set the default TLS version to 1.2 ([#14229](https://github.com/hashicorp/terraform-provider-azurerm/issues/14229))\n* `azurerm_redis_cache` - groundwork for the (currently disabled) 3.0 feature to set the default TLS version to 1.2 ([#14229](https://github.com/hashicorp/terraform-provider-azurerm/issues/14229))\n* `azurerm_service_plan` (beta) - add Logic App SKUs to validation. ([#14288](https://github.com/hashicorp/terraform-provider-azurerm/issues/14288))\n* `azurerm_site_recovery_replication_policy` - now supports disabling of snapshots and their retention ([#14329](https://github.com/hashicorp/terraform-provider-azurerm/issues/14329))\n* `azurerm_storage_account` - groundwork for the (currently disabled) 3.0 feature to set the default TLS version to 1.2 ([#14229](https://github.com/hashicorp/terraform-provider-azurerm/issues/14229))\n* `azurerm_stream_analytics_job` - `compatibility_level` now accepts 1.2 ([#14294](https://github.com/hashicorp/terraform-provider-azurerm/issues/14294))\n\nBUG FIXES: \n\n* `azurerm_function_app_slot` - fix a bug in `app_settings` for `WEBSITE_CONTENTSHARE` incorrectly updating ([#14211](https://github.com/hashicorp/terraform-provider-azurerm/issues/14211))\n* `azurerm_monitor_diagnostic_setting` - Swap Relay parser and validator with EventHub ([#14277](https://github.com/hashicorp/terraform-provider-azurerm/issues/14277))\n* `azurerm_stream_analytics_stream_input_eventhub` - correctly support creation with the default `eventhub_consumer_group_name` ([#14264](https://github.com/hashicorp/terraform-provider-azurerm/issues/14264))\n* `azurerm_synapse_workspace` - fix a crash during updates when `sql_aad_admin` was configured ([#14275](https://github.com/hashicorp/terraform-provider-azurerm/issues/14275))\n* `azurerm_linux_virtual_machine` - the `patch_mode` property is now properly supported [GH0-14042]\n\n## 2.86.0 (November 19, 2021)\n\nFEATURES:\n\n* **New Beta Resource:** `azurerm_linux_function_app` ([#13806](https://github.com/hashicorp/terraform-provider-azurerm/issues/13806))\n* **New Resource:** `azurerm_automation_webhook` ([#13893](https://github.com/hashicorp/terraform-provider-azurerm/issues/13893))\n* **New Resource:** `azurerm_resource_group_cost_management_export` ([#14140](https://github.com/hashicorp/terraform-provider-azurerm/issues/14140))\n* **New Resource:** `azurerm_subscription_cost_management_export` ([#14140](https://github.com/hashicorp/terraform-provider-azurerm/issues/14140))\n* **New Resource:** `azurerm_logz_tag_rule` ([#14020](https://github.com/hashicorp/terraform-provider-azurerm/issues/14020))\n* **New Resource:** `azurerm_monitor_private_link_scoped_service` ([#14119](https://github.com/hashicorp/terraform-provider-azurerm/issues/14119))\n* **New Resource:** `azurerm_storage_disks_pool` ([#14145](https://github.com/hashicorp/terraform-provider-azurerm/issues/14145))\n\nENHANCEMENTS:\n\n* compute: updating to use API Version `2021-07-01` ([#14174](https://github.com/hashicorp/terraform-provider-azurerm/issues/14174))\n* databricks: updating the embedded SDK to use the new Resource ID Parsers ([#14157](https://github.com/hashicorp/terraform-provider-azurerm/issues/14157))\n* datalake: updating the embedded SDK to use the new Resource ID Parsers ([#14158](https://github.com/hashicorp/terraform-provider-azurerm/issues/14158))\n* maps: updating the embedded SDK to use the new Resource ID Parsers ([#14155](https://github.com/hashicorp/terraform-provider-azurerm/issues/14155))\n* powerbi: updating the embedded SDK to use the new Resource ID Parsers ([#14154](https://github.com/hashicorp/terraform-provider-azurerm/issues/14154))\n* relay: updating the embedded SDK to use the new Resource ID Parsers ([#14153](https://github.com/hashicorp/terraform-provider-azurerm/issues/14153))\n* signalr: updating the embedded SDK to use the new Resource ID Parsers ([#14150](https://github.com/hashicorp/terraform-provider-azurerm/issues/14150))\n* storage: updating to use API Version `2021-04-01` ([#14083](https://github.com/hashicorp/terraform-provider-azurerm/issues/14083))\n* videoanalyzer: updating the embedded SDK to use the new Resource ID Parsers ([#14135](https://github.com/hashicorp/terraform-provider-azurerm/issues/14135))\n* Data Source: `azurerm_storage_account` - support for the `table_encryption_key_type` and `queue_encryption_key_type` attributes ([#14080](https://github.com/hashicorp/terraform-provider-azurerm/issues/14080))\n* `azurerm_container_registry` - support for the `anonymous_pull_enabled`, `data_endpoint_enabled`, and `network_rule_bypass_option` properties ([#14096](https://github.com/hashicorp/terraform-provider-azurerm/issues/14096))\n* `azurerm_cosmosdb_cassandra_datacenter` - support the `availability_zones_enabled` property ([#14235](https://github.com/hashicorp/terraform-provider-azurerm/issues/14235))\n* `azurerm_cost_management_export_resource_group` - has been deprecated in favour of the `azurerm_resource_group_cost_management_export` resource ([#14140](https://github.com/hashicorp/terraform-provider-azurerm/issues/14140))\n* `azurerm_disk_encryption_set` - add support for the `encryption_type` property ([#14218](https://github.com/hashicorp/terraform-provider-azurerm/issues/14218))\n* `azurerm_elastic_pool` - support for the `Fsv2` family SKUs ([#14250](https://github.com/hashicorp/terraform-provider-azurerm/issues/14250))\n* `azurerm_key_vault_certificate` - groundwork for the (currently disabled) 3.0 feature to support more granular configuration of soft-delete and purge protection ([#13682](https://github.com/hashicorp/terraform-provider-azurerm/issues/13682))\n* `azurerm_key_vault_key` - groundwork for the (currently disabled) 3.0 feature to support more granular configuration of soft-delete and purge protection ([#13682](https://github.com/hashicorp/terraform-provider-azurerm/issues/13682))\n* `azurerm_key_vault_secret` - groundwork for the (currently disabled) 3.0 feature to support more granular configuration of soft-delete and purge protection ([#13682](https://github.com/hashicorp/terraform-provider-azurerm/issues/13682))\n* `azurerm_key_vault_certificate` - the `certificate_policy` property is now optional for imported certificates ([#14225](https://github.com/hashicorp/terraform-provider-azurerm/issues/14225))\n* `azurerm_kubernetes_cluster` - support for `outbound_type` = `*NATGateway` and the `nat_gateway_profile` block ([#14142](https://github.com/hashicorp/terraform-provider-azurerm/issues/14142))\n* `azurerm_linux_web_app` - (Beta) add support for `health_check_eviction_time_in_mins` and `vnet_route_all_enabled` ([#14202](https://github.com/hashicorp/terraform-provider-azurerm/issues/14202))\n* `azurerm_managed_disk` - support for the `on_demand_bursting_enabled` property ([#14137](https://github.com/hashicorp/terraform-provider-azurerm/issues/14137))\n* `azurerm_mssql_server` - support for the `azuread_authentication_only` property on creation ([#14169](https://github.com/hashicorp/terraform-provider-azurerm/issues/14169))\n* `azurerm_machine_learning_workspace` - support for the `encryption` block ([#14120](https://github.com/hashicorp/terraform-provider-azurerm/issues/14120))\n* `azurerm_orchestrated_virtual_machine_scale_set` - added support for VMSS Flex public preview ([#14003](https://github.com/hashicorp/terraform-provider-azurerm/issues/14003))\n* `azurerm_postgresql_flexible_server` - the `zone` and `standby_availability_zone` properties are no longer computed ([#13843](https://github.com/hashicorp/terraform-provider-azurerm/issues/13843))\n* `azurerm_public_ip_prefix` - support for the `ip_version` property ([#14228](https://github.com/hashicorp/terraform-provider-azurerm/issues/14228))\n* `azurerm_purview_account` - support for the `managed_resource_group_name` property ([#14217](https://github.com/hashicorp/terraform-provider-azurerm/issues/14217))\n* `azurerm_resource_provider_registration` - support for managing `features` ([#12385](https://github.com/hashicorp/terraform-provider-azurerm/issues/12385))\n* `azurerm_windows_virtual_machine` - support for the `vtpm_enabled` and `secure_boot_enabled` properties ([#13713](https://github.com/hashicorp/terraform-provider-azurerm/issues/13713))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `vtpm_enabled` and `secure_boot_enabled` properties ([#13713](https://github.com/hashicorp/terraform-provider-azurerm/issues/13713))\n* `azurerm_windows_web_app` - (Beta) add support for the `health_check_eviction_time_in_mins` and `vnet_route_all_enabled` properties ([#14202](https://github.com/hashicorp/terraform-provider-azurerm/issues/14202))\n* `azurerm_stream_analytics_output_servicebus_topic` - support for the `property_columns` property ([#14252](https://github.com/hashicorp/terraform-provider-azurerm/issues/14252))\n* `azurerm_storage_account` - support for `table_encryption_key_type` and `queue_encryption_key_type` properties ([#14080](https://github.com/hashicorp/terraform-provider-azurerm/issues/14080))\n* `azurerm_storage_account` - (Beta) add a state migration for the renaming of `allow_blob_public_access` to `allow_nested_items_to_be_public` ([#13607](https://github.com/hashicorp/terraform-provider-azurerm/issues/13607))\n* `azurerm_sql_active_directory_administrator` - support for the `azuread_authentication_only` property ([#14172](https://github.com/hashicorp/terraform-provider-azurerm/issues/14172))\n* `azurerm_virtual_network` - support for the `flow_timeout_in_minutes` property ([#14200](https://github.com/hashicorp/terraform-provider-azurerm/issues/14200))\n* `azurerm_virtual_desktop_application_group` - support for the `default_desktop_display_name` property ([#14227](https://github.com/hashicorp/terraform-provider-azurerm/issues/14227))\n\nBUG FIXES: \n\n* `azurerm_backup_protected_file_share` - correctly list file shares that are added to an existing storage account not returned by the Backup Protectable Items API ([#14238](https://github.com/hashicorp/terraform-provider-azurerm/issues/14238))\n* `azurerm_frontdoor` - validation for `probe_method` allows the default value ([#14204](https://github.com/hashicorp/terraform-provider-azurerm/issues/14204))\n* `azurerm_key_vault_managed_hardware_security_module` - extend context timeouts for creation and deletion ([#14253](https://github.com/hashicorp/terraform-provider-azurerm/issues/14253))\n* `azurerm_key_vault_certificate` - changing the `tags` property no longer forces a new resource to be created ([#14079](https://github.com/hashicorp/terraform-provider-azurerm/issues/14079))\n* `azurerm_linux_virtual_machine_scale_set` - changing the `source_image_reference.offer` and `source_image_reference.publisher` now creates a new resource ([#14165](https://github.com/hashicorp/terraform-provider-azurerm/issues/14165))\n* `azurerm_mssql_database` - correct an error when using `OnlineSecondary` with auditing on the primary database ([#14192](https://github.com/hashicorp/terraform-provider-azurerm/issues/14192))\n* `azurerm_network_watcher_flow_log` - now locks on the network security group to prevent `AnotherOperationInProgress` errors ([#14160](https://github.com/hashicorp/terraform-provider-azurerm/issues/14160))\n* `azurerm_windows_virtual_machine_scale_set` - `source_image_reference.offer` and `source_image_reference.publisher` are now ForceNew ([#14165](https://github.com/hashicorp/terraform-provider-azurerm/issues/14165))\n\n## 2.85.0 (November 12, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_batch_application` ([#14043](https://github.com/hashicorp/terraform-provider-azurerm/issues/14043))\n* **New Resource:** `azurerm_monitor_private_link_scope` ([#14098](https://github.com/hashicorp/terraform-provider-azurerm/issues/14098))\n* **New Resource:** `azurerm_mysql_flexible_server_firewall_rule` ([#14136](https://github.com/hashicorp/terraform-provider-azurerm/issues/14136))\n* **New Resource:** `azurerm_synapse_workspace_aad_admin` ([#13600](https://github.com/hashicorp/terraform-provider-azurerm/issues/13600))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to `v0.17.1` of `github.com/hashicorp/go-azure-helpers` ([#14141](https://github.com/hashicorp/terraform-provider-azurerm/issues/14141))\n* dependencies: upgrading to `v2.8.0` of `github.com/hashicorp/terraform-plugin-sdk` ([#14060](https://github.com/hashicorp/terraform-provider-azurerm/issues/14060))\n* `azurerm_application_insights` - support for the `internet_ingestion_enabled` and `internet_query_enabled` properties ([#14035](https://github.com/hashicorp/terraform-provider-azurerm/issues/14035))\n* `azurerm_backup_protected_vm` - support for the `exclude_disk_luns` and `include_disk_luns` properties ([#14097](https://github.com/hashicorp/terraform-provider-azurerm/issues/14097))\n* `azurerm_managed_disk_resource` - support for the `disk_iops_read_only` and `disk_mbps_read_only` properties ([#14025](https://github.com/hashicorp/terraform-provider-azurerm/issues/14025))\n* `azurerm_security_center_subscription_pricing` - `resource_type` can now be set to `OpenSourceRelationalDatabases` ([#14103](https://github.com/hashicorp/terraform-provider-azurerm/issues/14103))\n* `azurerm_storage_encryption_scope` - allow versionless `key_vault_key_id` ([#14085](https://github.com/hashicorp/terraform-provider-azurerm/issues/14085))\n* `azurerm_sql_managed_instance` - support for the `identity` block ([#14052](https://github.com/hashicorp/terraform-provider-azurerm/issues/14052))\n* `azurerm_virtual_network_gateway` - enable configuration of an active-active zone redundant gateway with P2S ([#14124](https://github.com/hashicorp/terraform-provider-azurerm/issues/14124))\n\nBUG FIXES:\n\n* Data Source: `azurerm_redis_cache` - parsing the `subnet_id` response value case-insensitively ([#14108](https://github.com/hashicorp/terraform-provider-azurerm/issues/14108))\n* Data Source: `azurerm_redis_cache` - ensuring that `shard_count` always has a value set ([#14108](https://github.com/hashicorp/terraform-provider-azurerm/issues/14108))\n* Data Source: `azurerm_consumption_budget_resource_group` - add missing `threshold_type` property in the schema ([#14125](https://github.com/hashicorp/terraform-provider-azurerm/issues/14125))\n* Data Source: `azurerm_consumption_budget_subscription` - add missing `threshold_type` property in the schema ([#14125](https://github.com/hashicorp/terraform-provider-azurerm/issues/14125))\n* `azurerm_api_management_certificate` - set `subject` property from correct field ([#14026](https://github.com/hashicorp/terraform-provider-azurerm/issues/14026))\n* `azurerm_app_service_virtual_network_swift_connection` - fixing a panic when checking for an existing resource during creation ([#14070](https://github.com/hashicorp/terraform-provider-azurerm/issues/14070))\n* `azurerm_frontdoor_resource` - route engines are no longer removed on update ([#14093](https://github.com/hashicorp/terraform-provider-azurerm/issues/14093))\n* `azurerm_redis_cache` - parsing the `subnet_id` response value case-insensitively ([#14108](https://github.com/hashicorp/terraform-provider-azurerm/issues/14108))\n* `azurerm_redis_cache` - ensuring that `shard_count` always has a value set ([#14108](https://github.com/hashicorp/terraform-provider-azurerm/issues/14108))\n* `azurerm_storage_blob` - ensuring that `cache_control` is sent during updates ([#14100](https://github.com/hashicorp/terraform-provider-azurerm/issues/14100))\n\n## 2.84.0 (November 05, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_cosmosdb_cassandra_cluster` ([#14019](https://github.com/hashicorp/terraform-provider-azurerm/issues/14019))\n* **New Resource:** `azurerm_cosmosdb_cassandra_datacenter` ([#14019](https://github.com/hashicorp/terraform-provider-azurerm/issues/14019))\n* **New Resource:** `logz_monitor` ([#13874](https://github.com/hashicorp/terraform-provider-azurerm/issues/13874))\n* **New Resource:** `azurerm_stream_analytics_output_synapse` ([#14013](https://github.com/hashicorp/terraform-provider-azurerm/issues/14013))\n\nIMPROVEMENTS:\n\n* upgrading `cosmos` to API Version `2021-10-15` ([#13785](https://github.com/hashicorp/terraform-provider-azurerm/issues/13785))\n* upgrading `aks` to API Version `2021-08-01` ([#13465](https://github.com/hashicorp/terraform-provider-azurerm/issues/13465))\n* upgrading `purview` to API Version `2021-07-01` ([#13785](https://github.com/hashicorp/terraform-provider-azurerm/issues/13785))\n* Data Source: `azurerm_key_vault_key` - export the `cureve`, `x`, `y`, `public_key_pem`, and `public_key_openssh` attributes ([#13934](https://github.com/hashicorp/terraform-provider-azurerm/issues/13934))\n* `azurerm_app_service_slot` - support for the `key_vault_reference_identity_id` property  ([#13988](https://github.com/hashicorp/terraform-provider-azurerm/issues/13988))\n* `azurerm_cosmosdb_account` - the backup backup type can now be changed from `Periodic` to `Continuous` without creating a new resource ([#13967](https://github.com/hashicorp/terraform-provider-azurerm/issues/13967))\n* `azurerm_firewall_policy_rule_collection_group` - support for the `translated_fqdn` property ([#13976](https://github.com/hashicorp/terraform-provider-azurerm/issues/13976))\n* `azurerm_firewall_policy` - support for the `insights` block ([#14004](https://github.com/hashicorp/terraform-provider-azurerm/issues/14004))\n* `azurerm_logic_app_integration_account` - support the `integration_service_environment_id` property ([#14015](https://github.com/hashicorp/terraform-provider-azurerm/issues/14015))\n* `azurerm_function_app` - support for the `key_vault_reference_identity_id` property ([#13962](https://github.com/hashicorp/terraform-provider-azurerm/issues/13962))\n* `azurerm_key_vault_key` - support for the `public_key_pem` and `public_key_openssh` attributes ([#13934](https://github.com/hashicorp/terraform-provider-azurerm/issues/13934))\n* `azurerm_linux_virtual_machine` - support for the `patch_mode` property ([#13866](https://github.com/hashicorp/terraform-provider-azurerm/issues/13866))\n* `azurerm_machine_learning_compute_cluster` - support for the `local_auth_enabled` property ([#13820](https://github.com/hashicorp/terraform-provider-azurerm/issues/13820))\n* `azurerm_machine_learning_compute_cluster` - support for the `local_auth_enabled` property ([#13820](https://github.com/hashicorp/terraform-provider-azurerm/issues/13820))\n* `azurerm_machine_learning_synapse_spark` - support for the `local_auth_enabled` property ([#13820](https://github.com/hashicorp/terraform-provider-azurerm/issues/13820))\n* `azurerm_monitor_smart_detector_alert_rule` - support additional detector types ([#13998](https://github.com/hashicorp/terraform-provider-azurerm/issues/13998))\n* `azurerm_mssql_elasticpool` - support `GP_FSv2` for the `sku` property ([#13973](https://github.com/hashicorp/terraform-provider-azurerm/issues/13973))\n* `azurerm_synapse_workspace` - supports for the `sql_aad_admin` block ([#13659](https://github.com/hashicorp/terraform-provider-azurerm/issues/13659))\n* `azurerm_sql_managed_instance` - support for the `dns_zone_partner_id` property ([#13951](https://github.com/hashicorp/terraform-provider-azurerm/issues/13951))\n* `azurerm_storage_blob` - support for the `cache_control` property ([#13946](https://github.com/hashicorp/terraform-provider-azurerm/issues/13946))\n* `azurerm_storage_share` - support for the `enabled_protocol` property ([#13938](https://github.com/hashicorp/terraform-provider-azurerm/issues/13938))\n\nBUG FIXES:\n\n* `azurerm_application_insights` - correct validation for the `daily_data_cap_in_gb` property ([#13971](https://github.com/hashicorp/terraform-provider-azurerm/issues/13971))\n* `azurerm_logic_app_standard` - will no longer error when working on private networks ([#13964](https://github.com/hashicorp/terraform-provider-azurerm/issues/13964))\n* `azurerm_managed_disk_resource` - the validation for the `disk_iops_read_write` and `disk_mbps_read_write` properties ensures values greater then 0 ([#14028](https://github.com/hashicorp/terraform-provider-azurerm/issues/14028))\n* `azurerm_purview_account` - deprecate the `sku_name` property ([#13897](https://github.com/hashicorp/terraform-provider-azurerm/issues/13897))\n* `azurerm_synapse_workspace_key` - deprecated the `cusomter_managed_key_name` property in favour of the correctly spelled `customer_managed_key_name` one ([#13881](https://github.com/hashicorp/terraform-provider-azurerm/issues/13881))\n\n## 2.83.0 (October 29, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_eventgrid_system_topic` ([#13851](https://github.com/hashicorp/terraform-provider-azurerm/issues/13851))\n* **New Data Source:** `azurerm_billing_mpa_account_scope` ([#13723](https://github.com/hashicorp/terraform-provider-azurerm/issues/13723))\n* **New Resource:** `azurerm_kusto_script` ([#13692](https://github.com/hashicorp/terraform-provider-azurerm/issues/13692))\n* **New Resource:** `azurerm_iot_time_series_insights_event_source_eventhub` ([#13917](https://github.com/hashicorp/terraform-provider-azurerm/issues/13917))\n* **New Resource:** `azurerm_stream_analytics_reference_input_mssql` ([#13822](https://github.com/hashicorp/terraform-provider-azurerm/issues/13822))\n* **New Resource:** `azurerm_sentinel_automation_rule` ([#11502](https://github.com/hashicorp/terraform-provider-azurerm/issues/11502))\n* **New Resource:** `azurerm_stream_analytics_output_table` ([#13854](https://github.com/hashicorp/terraform-provider-azurerm/issues/13854))\n\nIMPROVEMENTS:\n\n* upgrading `mysql` to API Version `2021-05-01` ([#13818](https://github.com/hashicorp/terraform-provider-azurerm/issues/13818))\n* `azurerm_application_gateway` - support for the `priority` property ([#13498](https://github.com/hashicorp/terraform-provider-azurerm/issues/13498))\n* `azurerm_firewall_application_rule_collection` - the `port` property is now required instead of optional ([#13869](https://github.com/hashicorp/terraform-provider-azurerm/issues/13869))\n* `azurerm_kubernetes_cluster` - expose the `portal_fqdn` attribute ([#13887](https://github.com/hashicorp/terraform-provider-azurerm/issues/13887))\n* `azurerm_linux_virtual_machine_scale_set` -  support for `automatic_upgrade_enabled` in extensions ([#13394](https://github.com/hashicorp/terraform-provider-azurerm/issues/13394))\n* `azurerm_linux_virtual_machine_scale_set` - added feature for `scale_to_zero_before_deletion`([#13635](https://github.com/hashicorp/terraform-provider-azurerm/issues/13635))\n* `azurerm_managed_disk` - support for the `trusted_launch_enabled` property ([#13849](https://github.com/hashicorp/terraform-provider-azurerm/issues/13849))\n* `azurerm_postgres_flexible_server` - enhanced validation for the `administrator_login` property ([#13942](https://github.com/hashicorp/terraform-provider-azurerm/issues/13942))\n* `azurerm_servicebus_queue` - support for the `max_message_size_in_kilobytes` property ([#13762](https://github.com/hashicorp/terraform-provider-azurerm/issues/13762))\n* `azurerm_servicebus_topic` - support for the `max_message_size_in_kilobytes` property ([#13762](https://github.com/hashicorp/terraform-provider-azurerm/issues/13762))\n* `azurerm_servicebus_namespace_network_rule_set` - support for the `trusted_services_allowed` property ([#13853](https://github.com/hashicorp/terraform-provider-azurerm/issues/13853))\n* `azurerm_windows_virtual_machine_scale_set` - added feature for `scale_to_zero_before_deletion`([#13635](https://github.com/hashicorp/terraform-provider-azurerm/issues/13635))\n* `azurerm_synapse_workspace` - support for the `linking_allowed_for_aad_tenant_ids`, `compute_subnet_id`, `public_network_access_enabled`, `purview_id`, and `last_commit_id` properties  ([#13817](https://github.com/hashicorp/terraform-provider-azurerm/issues/13817))\n* `azurerm_spring_cloud_java_deployment` – the `cpu` and `memory_in_gb` properties have been deprecated in favour of the `quota` block ([#12924](https://github.com/hashicorp/terraform-provider-azurerm/issues/12924))\n* `azurerm_vpn_gateway` - support for the `routing_preference` property ([#13882](https://github.com/hashicorp/terraform-provider-azurerm/issues/13882))\n* `azurerm_virtual_hub` - support for the `default_route_table_id` property ([#13840](https://github.com/hashicorp/terraform-provider-azurerm/issues/13840))\n* `azurerm_virtual_machine_scale_set_extension ` - support for `automatic_upgrade_enabled` ([#13394](https://github.com/hashicorp/terraform-provider-azurerm/issues/13394))\n* `azurerm_windows_virtual_machine_scale_set` -  support for `automatic_upgrade_enabled` in extensions ([#13394](https://github.com/hashicorp/terraform-provider-azurerm/issues/13394))\n\nBUG FIXES:\n\n* `azurerm_automation_schedule_resource` - allow `Etc/UTC` for the `timezone` property ([#13906](https://github.com/hashicorp/terraform-provider-azurerm/issues/13906))\n* `azurerm_app_configuration_key` - now supports forward slashes in the `key` ([#13859](https://github.com/hashicorp/terraform-provider-azurerm/issues/13859))\n* `azurerm_application_gateway` - prevent multiple `ssl_policy` blocks ([#13929](https://github.com/hashicorp/terraform-provider-azurerm/issues/13929))\n* `azurerm_cosmosdb_account` - the `capabilities` property is now computed ([#13936](https://github.com/hashicorp/terraform-provider-azurerm/issues/13936))\n* `azurerm_cognitive_account` - will now handle the unexpected state `Accepted` when waiting for creats ([#13925](https://github.com/hashicorp/terraform-provider-azurerm/issues/13925))\n* `azurerm_data_factory` - can now read global parameter values ([#13519](https://github.com/hashicorp/terraform-provider-azurerm/issues/13519))\n* `azurerm_firewall_policy` - will now correctly import ([#13862](https://github.com/hashicorp/terraform-provider-azurerm/issues/13862))\n* `azurerm_firewall_policy` - changing the identity will no longer create a new resource ([#13904](https://github.com/hashicorp/terraform-provider-azurerm/issues/13904))\n\n## 2.82.0 (October 21, 2021)\n\nFEATURES: \n\n* **New Resource:** `azurerm_mysql_flexible_server_configuration` ([#13831](https://github.com/hashicorp/terraform-provider-azurerm/issues/13831))\n* **New Resource:** `azurerm_synapse_sql_pool_vulnerability_assessment_baseline` ([#13744](https://github.com/hashicorp/terraform-provider-azurerm/issues/13744))\n* **New Resource:** `azurerm_virtual_hub_route_table_route` ([#13743](https://github.com/hashicorp/terraform-provider-azurerm/issues/13743))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to `v58.0.0` of `github.com/Azure/azure-sdk-for-go` ([#13613](https://github.com/hashicorp/terraform-provider-azurerm/issues/13613))\n* upgrading `netapp` to API Version `2021-06-01` ([#13812](https://github.com/hashicorp/terraform-provider-azurerm/issues/13812))\n* upgrading `servicebus` to API Version `2021-06-01-preview` ([#13701](https://github.com/hashicorp/terraform-provider-azurerm/issues/13701))\n* Data Source: `azurerm_disk_encryption_set` - support for the `auto_key_rotation_enabled` property ([#13747](https://github.com/hashicorp/terraform-provider-azurerm/issues/13747))\n* Data Source: `azurerm_virtual_machine` - expose IP addresses as data source outputs ([#13773](https://github.com/hashicorp/terraform-provider-azurerm/issues/13773))\n* `azurerm_batch_account` - support for the `identity` block ([#13742](https://github.com/hashicorp/terraform-provider-azurerm/issues/13742))\n* `azurerm_batch_pool` - support for the `identity` block ([#13779](https://github.com/hashicorp/terraform-provider-azurerm/issues/13779))\n* `azurerm_container_registry` - supports for the `regional_endpoint_enabled` property ([#13767](https://github.com/hashicorp/terraform-provider-azurerm/issues/13767))\n* `azurerm_data_factory_integration_runtime_azure` - support `AutoResolve` for the `location` property ([#13731](https://github.com/hashicorp/terraform-provider-azurerm/issues/13731))\n* `azurerm_disk_encryption_set` - support for the `auto_key_rotation_enabled` property ([#13747](https://github.com/hashicorp/terraform-provider-azurerm/issues/13747))\n* `azurerm_iot_security_solution` - support for the `additional_workspace` and `disabled_data_sources` properties ([#13783](https://github.com/hashicorp/terraform-provider-azurerm/issues/13783))\n* `azurerm_kubernetes_cluster` - support for the `open_service_mesh` block ([#13462](https://github.com/hashicorp/terraform-provider-azurerm/issues/13462))\n* `azurerm_lb` - support for the `gateway_load_balancer_frontend_ip_configuration_id` property ([#13559](https://github.com/hashicorp/terraform-provider-azurerm/issues/13559))\n* `azurerm_lb_backend_address_pool` - support for the `tunnel_interface` block ([#13559](https://github.com/hashicorp/terraform-provider-azurerm/issues/13559))\n* `azurerm_lb_rule` - the `backend_address_pool_ids` property has been deprecated in favour of the `backend_address_pool_ids` property ([#13559](https://github.com/hashicorp/terraform-provider-azurerm/issues/13559))\n* `azurerm_lb_nat_pool` - support for the `floating_ip_enabled`, `tcp_reset_enabled`, and `idle_timeout_in_minutes` properties ([#13674](https://github.com/hashicorp/terraform-provider-azurerm/issues/13674))\n* `azurerm_mssql_server` - support for the `azuread_authentication_only` property ([#13754](https://github.com/hashicorp/terraform-provider-azurerm/issues/13754))\n* `azurerm_network_interface` - support for the `gateway_load_balancer_frontend_ip_configuration_id` property ([#13559](https://github.com/hashicorp/terraform-provider-azurerm/issues/13559))\n* `azurerm_synapse_spark_pool` - support for the `cache_size`, `compute_isolation_enabled`, `dynamic_executor_allocation_enabled`, `session_level_packages_enabled` and `spark_config` properties ([#13690](https://github.com/hashicorp/terraform-provider-azurerm/issues/13690))\n\nBUG FIXES:\n\n* `azurerm_app_configuration_feature` - fix default value handling for percentage appconfig feature filters. ([#13771](https://github.com/hashicorp/terraform-provider-azurerm/issues/13771))\n* `azurerm_cosmosdb_account` - force `MongoEnabled` feature when enabling `MongoDBv3.4`. ([#13757](https://github.com/hashicorp/terraform-provider-azurerm/issues/13757))\n* `azurerm_mssql_server` - will now configure the `azuread_administrator` during resource creation ([#13753](https://github.com/hashicorp/terraform-provider-azurerm/issues/13753))\n* `azurerm_mssql_database` - fix failure by preventing `extended_auditing_policy` from being configured for secondaries ([#13799](https://github.com/hashicorp/terraform-provider-azurerm/issues/13799))\n* `azurerm_postgresql_flexible_server` - changing the `standby_availability_zone` no longer forces a new resource ([#13507](https://github.com/hashicorp/terraform-provider-azurerm/issues/13507))\n* `azurerm_servicebus_subscription` - the `name` field can now start & end with an underscore ([#13797](https://github.com/hashicorp/terraform-provider-azurerm/issues/13797))\n\n## 2.81.0 (October 14, 2021)\n\nFEATURES: \n\n* **New Data Source:** `azurerm_consumption_budget_resource_group` ([#12538](https://github.com/hashicorp/terraform-provider-azurerm/issues/12538))\n* **New Data Source:** `azurerm_consumption_budget_subscription` ([#12540](https://github.com/hashicorp/terraform-provider-azurerm/issues/12540))\n* **New Resource:** `azurerm_data_factory_linked_service_cosmosdb_mongoapi` ([#13636](https://github.com/hashicorp/terraform-provider-azurerm/issues/13636))\n* **New Resource:** `azurerm_mysql_flexible_server` ([#13678](https://github.com/hashicorp/terraform-provider-azurerm/issues/13678))\n\nIMPROVEMENTS:\n\n* upgrading `batch` to API Version `2021-06-01`([#13718](https://github.com/hashicorp/terraform-provider-azurerm/issues/13718))\n* upgrading `mssql` to API Version `v5.0`([#13622](https://github.com/hashicorp/terraform-provider-azurerm/issues/13622))\n* Data Source: `azurerm_key_vault` - exports the `enable_rbac_authorization` attribute ([#13717](https://github.com/hashicorp/terraform-provider-azurerm/issues/13717))\n* `azurerm_app_service` - support for the `key_vault_reference_identity_id` property ([#13720](https://github.com/hashicorp/terraform-provider-azurerm/issues/13720))\n* `azurerm_lb` - support for the `sku_tier` property ([#13680](https://github.com/hashicorp/terraform-provider-azurerm/issues/13680))\n* `azurerm_eventgrid_event_subscription` - support the `delivery_property` block ([#13595](https://github.com/hashicorp/terraform-provider-azurerm/issues/13595))\n* `azurerm_mssql_server` - support for the `user_assigned_identity_ids` and `primary_user_assigned_identity_id` properties ([#13683](https://github.com/hashicorp/terraform-provider-azurerm/issues/13683))\n* `azurerm_network_connection_monitor` - add support for the `destination_port_behavior` property ([#13518](https://github.com/hashicorp/terraform-provider-azurerm/issues/13518))\n* `azurerm_security_center_workspace` - now supports the `Free` pricing tier ([#13710](https://github.com/hashicorp/terraform-provider-azurerm/issues/13710))\n* `azurerm_kusto_attached_database_configuration` - support for the `sharing` property ([#13487](https://github.com/hashicorp/terraform-provider-azurerm/issues/13487))\n\nBUG FIXES:\n\n* Data Source: `azurerm_cosmosdb_account`- prevent a panic from an index out of range error ([#13560](https://github.com/hashicorp/terraform-provider-azurerm/issues/13560))\n* `azurerm_function_app_slot` - the `client_affinity` property has been deprecated as it is no longer configurable in the service's API ([#13711](https://github.com/hashicorp/terraform-provider-azurerm/issues/13711))\n* `azurerm_kubernetes_cluster` - the `kube_config` and `kube_admin_config` blocks can now be marked entirely as `Sensitive` via an environment variable ([#13732](https://github.com/hashicorp/terraform-provider-azurerm/issues/13732))\n* `azurerm_logic_app_workflow` - will not check for `nil` and empty access control properties ([#13689](https://github.com/hashicorp/terraform-provider-azurerm/issues/13689))\n* `azurerm_management_group` - will not nil check child management groups when deassociating a subscription from a management group ([#13540](https://github.com/hashicorp/terraform-provider-azurerm/issues/13540))\n* `azurerm_subnet_resource` - will now lock the virtual network and subnet on updates ([#13726](https://github.com/hashicorp/terraform-provider-azurerm/issues/13726))\n* `azurerm_app_configuration_key` - can now mix labeled and unlabeled keys ([#13736](https://github.com/hashicorp/terraform-provider-azurerm/issues/13736))\n \n## 2.80.0 (October 08, 2021)\n\nFEATURES: \n\n* **New Data Source:** `backup_policy_file_share` ([#13444](https://github.com/hashicorp/terraform-provider-azurerm/issues/13444))\n\nIMPROVEMENTS:\n\n* Data Source `azurerm_public_ips` - deprecate the `attached` property infavour of the `attachment_status` property to improve filtering ([#13500](https://github.com/hashicorp/terraform-provider-azurerm/issues/13500))\n* Data Source `azurerm_public_ips` - return public IPs associated with NAT gateways when `attached` set to `true` or `attachment_status` set to `Attached` ([#13610](https://github.com/hashicorp/terraform-provider-azurerm/issues/13610))\n* `azurerm_kusto_eventhub_data_connection supports` - support for the `identity_id` property ([#13488](https://github.com/hashicorp/terraform-provider-azurerm/issues/13488))\n* `azurerm_managed_disk` - support for the `logical_sector_size` property ([#13637](https://github.com/hashicorp/terraform-provider-azurerm/issues/13637))\n* `azurerm_service_fabric_cluster` - support for the `service_fabric_zonal_upgrade_mode` and `service_fabric_zonal_upgrade_mode` properties ([#13399](https://github.com/hashicorp/terraform-provider-azurerm/issues/13399))\n* `azurerm_stream_analytics_output_eventhub` - support for the `partition_key` property ([#13562](https://github.com/hashicorp/terraform-provider-azurerm/issues/13562))\n* `azurerm_linux_virtual_machine_scale_set` - correctly update the `overprovision` property ([#13653](https://github.com/hashicorp/terraform-provider-azurerm/issues/13653))\n\nBUG FIXES:\n\n* `azurerm_function_app` - fix regressions in function app storage introduced in v2.77 ([#13580](https://github.com/hashicorp/terraform-provider-azurerm/issues/13580))\n* `azurerm_managed_application` - fixed typecasting bug ([#13641](https://github.com/hashicorp/terraform-provider-azurerm/issues/13641))\n\n## 2.79.1 (October 01, 2021)\n\nBUG FIXES:\n\n* `azurerm_managed_disk` - the `max_shares` property is now `Computed` to account for managed disks that are already managed by Terraform ([#13587](https://github.com/hashicorp/terraform-provider-azurerm/issues/13587))\n\n## 2.79.0 (October 01, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_app_configuration_feature` ([#13452](https://github.com/hashicorp/terraform-provider-azurerm/issues/13452))\n* **New Resource:** `azurerm_logic_app_standard` ([#13196](https://github.com/hashicorp/terraform-provider-azurerm/issues/13196))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_key_vault_certificate` - exporting the `expires` and `not_before` attributes ([#13527](https://github.com/hashicorp/terraform-provider-azurerm/issues/13527))\n* Data Source: `azurerm_key_vault_certificate_data` - exporting the `not_before` attribute ([#13527](https://github.com/hashicorp/terraform-provider-azurerm/issues/13527))\n* `azurerm_communication_service` - export the `primary_connection_string`, `secondary_connection_string`, `primary_key`, and `secondary_key` attributes ([#13549](https://github.com/hashicorp/terraform-provider-azurerm/issues/13549))\n* `azurerm_consumption_budget_subscription`  support for the `Forecasted` threshold type ([#13567](https://github.com/hashicorp/terraform-provider-azurerm/issues/13567))\n* `azurerm_consumption_budget_resource_group  support for the `Forecasted` threshold type ([#13567](https://github.com/hashicorp/terraform-provider-azurerm/issues/13567))\n* `azurerm_managed_disk` - support for the `max_shares` property ([#13571](https://github.com/hashicorp/terraform-provider-azurerm/issues/13571))\n* `azurerm_mssql_database` - will now update replicated databases SKUs first ([#13478](https://github.com/hashicorp/terraform-provider-azurerm/issues/13478))\n* `azurerm_virtual_hub_connection` - optimized state change refresh function ([#13548](https://github.com/hashicorp/terraform-provider-azurerm/issues/13548))\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_account` - the `mongo_server_version` can now be changed without creating a new resource ([#13520](https://github.com/hashicorp/terraform-provider-azurerm/issues/13520))\n* `azurerm_iothub` - correctly suppress diffs for the `connection_string` property ([#13517](https://github.com/hashicorp/terraform-provider-azurerm/issues/13517))\n* `azurerm_kubernetes_cluster` - explicitly setting `upgrade_channel` to `None` when it's unset to workaround a breaking behavioural change in AKS ([#13493](https://github.com/hashicorp/terraform-provider-azurerm/issues/13493))\n* `azurerm_linux_virtual_machine_scale_set` - will not correctly ignore the `protected_setting` block withing the `extension` block ([#13440](https://github.com/hashicorp/terraform-provider-azurerm/issues/13440))\n* `azurerm_windows_virtual_machine_scale_set` - will not correctly ignore the `protected_setting` block withing the `extension` block ([#13440](https://github.com/hashicorp/terraform-provider-azurerm/issues/13440))\n* `azurerm_app_configuration_key` - correctly set the `etag` property ([#13534](https://github.com/hashicorp/terraform-provider-azurerm/issues/13534))\n\n## 2.78.0 (September 23, 2021)\n\nUPGRADE NOTES\n\n* The `azurerm_data_factory_dataset_snowflake` has been updated to set the correct `schema_column` api property with the correct schema - to retain the old behaviour please switch to the `structure_column` property ([#13344](https://github.com/hashicorp/terraform-provider-azurerm/issues/13344))\n\nFEATURES:\n\n* **New Resource:** `azurerm_frontdoor_rules_engine` ([#13249](https://github.com/hashicorp/terraform-provider-azurerm/issues/13249))\n* **New Resource:** `azurerm_key_vault_managed_storage_account` ([#13271](https://github.com/hashicorp/terraform-provider-azurerm/issues/13271))\n* **New Resource:** `azurerm_key_vault_managed_storage_account_sas_token_definition` ([#13271](https://github.com/hashicorp/terraform-provider-azurerm/issues/13271))\n* **New Resource:** `azurerm_mssql_failover_group` ([#13446](https://github.com/hashicorp/terraform-provider-azurerm/issues/13446))\n* **New Resource:** `azurerm_synapse_sql_pool_extended_auditing_policy` ([#12952](https://github.com/hashicorp/terraform-provider-azurerm/issues/12952))\n* **New Resource:** `azurerm_synapse_workspace_extended_auditing_policy` ([#12952](https://github.com/hashicorp/terraform-provider-azurerm/issues/12952))\n\nENHANCEMENTS:\n\n* upgrading `iothub` to API Version `2021-03-31` ([#13324](https://github.com/hashicorp/terraform-provider-azurerm/issues/13324))\n* Data Source: `azurerm_private_endpoint_connection` - Export `network_interface` attributes from private endpoints ([#13421](https://github.com/hashicorp/terraform-provider-azurerm/issues/13421))\n* `azurerm_app_service` - support for the `vnet_route_all_enabled` property ([#13310](https://github.com/hashicorp/terraform-provider-azurerm/issues/13310))\n* `azurerm_bot_channel_slack` - support for the `signing_secret` property ([#13454](https://github.com/hashicorp/terraform-provider-azurerm/issues/13454))\n* `azurerm_data_factory` - support for `identity` being `SystemAssigned` and `UserAssigned` ([#13473](https://github.com/hashicorp/terraform-provider-azurerm/issues/13473))\n* `azurerm_function_app` - support for the `vnet_route_all_enabled` property ([#13310](https://github.com/hashicorp/terraform-provider-azurerm/issues/13310))\n* `azurerm_machine_learning_workspace` - support for `public_network_access_enabled`, `public_network_access_enabled`, and `discovery_url` properties ([#13268](https://github.com/hashicorp/terraform-provider-azurerm/issues/13268))\n* `azurerm_private_endpoint_connection` - export the `network_interface` attribute from private endpoints ([#13421](https://github.com/hashicorp/terraform-provider-azurerm/issues/13421))\n* `azurerm_storage_account_network_rules ` - Deprecate `storage_account_name` and `resource_group_name` in favor of `storage_account_id` ([#13307](https://github.com/hashicorp/terraform-provider-azurerm/issues/13307))\n* `azurerm_storage_share_file` - will now recreate and upload deleted/missing files ([#13269](https://github.com/hashicorp/terraform-provider-azurerm/issues/13269))\n* `azurerm_synapse_workspace` - the `tenant_id` property is now computed ([#13464](https://github.com/hashicorp/terraform-provider-azurerm/issues/13464))\n\nBUG FIXES:\n\n* Data Source: `azurerm_app_service_certificate` - prevent panics if the API returns a nil `issue_date` or `expiration_date` ([#13401](https://github.com/hashicorp/terraform-provider-azurerm/issues/13401))\n* `azurerm_app_service_certificate` - prevent panics if the API returns a nil `issue_date` or `expiration_date` ([#13401](https://github.com/hashicorp/terraform-provider-azurerm/issues/13401))\n* `azurerm_app_service_certificate_binding` - reverted a change that introduced a bug in certificate selection for non-managed certificates ([#13455](https://github.com/hashicorp/terraform-provider-azurerm/issues/13455))\n* `azurerm_container_group` - allow creation of shared volume between containers in multi container group ([#13374](https://github.com/hashicorp/terraform-provider-azurerm/issues/13374))\n* `azurerm_kubernetes_cluster` - changing the `private_cluster_public_fqdn_enabled` no longer created a new resource ([#13413](https://github.com/hashicorp/terraform-provider-azurerm/issues/13413))\n* `azurerm_app_configuration_key` - fix nil pointer for removed key ([#13483](https://github.com/hashicorp/terraform-provider-azurerm/issues/13483))\n\n## 2.77.0 (September 17, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_policy_virtual_machine_configuration_assignment` ([#13311](https://github.com/hashicorp/terraform-provider-azurerm/issues/13311))\n* **New Resource:** `azurerm_synapse_integration_runtime_self_hosted` ([#13264](https://github.com/hashicorp/terraform-provider-azurerm/issues/13264))\n* **New Resource:** `azurerm_synapse_integration_runtime_azure` ([#13341](https://github.com/hashicorp/terraform-provider-azurerm/issues/13341))\n* **New Resource:** `azurerm_synapse_linked_service` ([#13204](https://github.com/hashicorp/terraform-provider-azurerm/issues/13204))\n* **New Resource:** `azurerm_synapse_sql_pool_security_alert_policy` ([#13276](https://github.com/hashicorp/terraform-provider-azurerm/issues/13276))\n* **New Resource:** `azurerm_synapse_sql_pool_vulnerability_assessment` ([#13276](https://github.com/hashicorp/terraform-provider-azurerm/issues/13276))\n* **New Resource:** `azurerm_synapse_workspace_security_alert_policy` ([#13276](https://github.com/hashicorp/terraform-provider-azurerm/issues/13276))\n* **New Resource:** `azurerm_synapse_workspace_vulnerability_assessment` ([#13276](https://github.com/hashicorp/terraform-provider-azurerm/issues/13276))\n\nENHANCEMENTS:\n\n* Data Source: `azurerm_mssql_elasticpool` - export the `sku` block ([#13336](https://github.com/hashicorp/terraform-provider-azurerm/issues/13336))\n* `azurerm_api_management` - now supports purging soft deleted instances via the `purge_soft_delete_on_destroy` provider level feature ([#12850](https://github.com/hashicorp/terraform-provider-azurerm/issues/12850))\n* `azurerm_data_factory_trigger_schedule` - support for the `activated` property ([#13390](https://github.com/hashicorp/terraform-provider-azurerm/issues/13390))\n* `azurerm_logic_app_workflow` - support for the `enabled` and `access_control` properties ([#13265](https://github.com/hashicorp/terraform-provider-azurerm/issues/13265))\n* `azurerm_monitor_scheduled_query_rules_alert` - support `auto_mitigation_enabled` property ([#13213](https://github.com/hashicorp/terraform-provider-azurerm/issues/13213))\n* `azurerm_machine_learning_inference_cluster` - support for the `identity` block ([#12833](https://github.com/hashicorp/terraform-provider-azurerm/issues/12833))\n* `azurerm_machine_learning_compute_cluster` - support for the `ssh_public_access_enabled enhancement` property and the `identity` and `ssh` blocks ([#12833](https://github.com/hashicorp/terraform-provider-azurerm/issues/12833))\n* `azurerm_spring_cloud_service` - support for the `connection_string` property ([#13262](https://github.com/hashicorp/terraform-provider-azurerm/issues/13262))\n\nBUG FIXES:\n\n* `azurerm_app_service_certificate_binding` - rework for removal of thumbprint from service ([#13379](https://github.com/hashicorp/terraform-provider-azurerm/issues/13379))\n* `azurerm_app_service_managed_certificate`: Fix for empty `issue_date` ([#13357](https://github.com/hashicorp/terraform-provider-azurerm/issues/13357))\n* `azurerm_cosmosdb_sql_container`: fix crash when deleting ([#13339](https://github.com/hashicorp/terraform-provider-azurerm/issues/13339))\n* `azurerm_frontdoor` - Fix crash when cache is disabled ([#13338](https://github.com/hashicorp/terraform-provider-azurerm/issues/13338))\n* `azurerm_function_app` - fix `app_settings` for `WEBSITE_CONTENTSHARE` ([#13349](https://github.com/hashicorp/terraform-provider-azurerm/issues/13349))\n* `azurerm_function_app_slot` - fix `app_settings` for `WEBSITE_CONTENTSHARE` ([#13349](https://github.com/hashicorp/terraform-provider-azurerm/issues/13349))\n* `azurerm_kubernetes_cluster_node_pool` - `os_sku` is now computed ([#13321](https://github.com/hashicorp/terraform-provider-azurerm/issues/13321))\n* `azurerm_linux_virtual_machine_scale_set` - fixed crash when `automatic_os_policy` was nil ([#13335](https://github.com/hashicorp/terraform-provider-azurerm/issues/13335))\n* `azurerm_lb` - support for adding or replacing a `frontend_ip_configuration` with an `availability_zone` ([#13305](https://github.com/hashicorp/terraform-provider-azurerm/issues/13305))\n* `azurerm_virtual_hub_connection` - fixing race condition in the creation of virtual network resources ([#13294](https://github.com/hashicorp/terraform-provider-azurerm/issues/13294))\n\n## 2.76.0 (September 10, 2021)\n\nNOTES\n* Opt-In Beta: Version 2.76 of the Azure Provider introduces an opt-in Beta for some of the new functionality coming in 3.0 - more information can be found [in the 3.0 Notes](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/website/docs/guides/3.0-upgrade-guide.html.markdown) and [3.0 Upgrade Guide](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/website/docs/guides/3.0-upgrade-guide.html.markdown) ([#12132](https://github.com/hashicorp/terraform-provider-azurerm/issues/12132))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_eventgrid_domain` ([#13033](https://github.com/hashicorp/terraform-provider-azurerm/issues/13033))\n* **New Resource:** `azurerm_data_protection_backup_instance_blob_storage` ([#12683](https://github.com/hashicorp/terraform-provider-azurerm/issues/12683))\n* **New Resource:** `azurerm_logic_app_integration_account_assembly` ([#13239](https://github.com/hashicorp/terraform-provider-azurerm/issues/13239))\n* **New Resource:** `azurerm_logic_app_integration_account_batch_configuration` ([#13215](https://github.com/hashicorp/terraform-provider-azurerm/issues/13215))\n* **New Resource:** `azurerm_logic_app_integration_account_agreement` ([#13287](https://github.com/hashicorp/terraform-provider-azurerm/issues/13287))\n* **New Resource:** `azurerm_sql_managed_database` ([#12431](https://github.com/hashicorp/terraform-provider-azurerm/issues/12431))\n\nENHANCEMENTS:\n\n* upgrading `cdn` to API Version `2021-09-01` ([#13282](https://github.com/hashicorp/terraform-provider-azurerm/issues/13282))\n* upgrading `cosmos` to API Version `2021-06-15` ([#13188](https://github.com/hashicorp/terraform-provider-azurerm/issues/13188))\n* `azurerm_app_service_certificate` - support argument `app_service_plan_id` for usage with ASE ([#13101](https://github.com/hashicorp/terraform-provider-azurerm/issues/13101))\n* `azurerm_application_gateway` - mTLS support for Application Gateways ([#13273](https://github.com/hashicorp/terraform-provider-azurerm/issues/13273))\n* `azurerm_cosmosdb_account` support for the `local_authentication_disabled` property ([#13237](https://github.com/hashicorp/terraform-provider-azurerm/issues/13237))\n* `azurerm_data_factory_integration_runtime_azure` -  support for the `cleanup_enabled` and `subnet_id` properties ([#13222](https://github.com/hashicorp/terraform-provider-azurerm/issues/13222))\n* `azurerm_data_factory_trigger_schedule` - support for the `schedule` and `description` properties ([#13243](https://github.com/hashicorp/terraform-provider-azurerm/issues/13243))\n* `azurerm_firewall_policy_rule_collection_group` - support for the `description`, `destination_addresses`, `destination_urls`, `terminate_tls`, and `web_categories` properties ([#13190](https://github.com/hashicorp/terraform-provider-azurerm/issues/13190))\n* `azurerm_eventgrid_event_subscription` - support for the `delivery_identity` and `dead_letter_identity` blocks ([#12945](https://github.com/hashicorp/terraform-provider-azurerm/issues/12945))\n* `azurerm_eventgrid_system_topic_event_subscription` - support for the `delivery_identity` and `dead_letter_identity` blocks ([#12945](https://github.com/hashicorp/terraform-provider-azurerm/issues/12945))\n* `azurerm_eventgrid_domain` support for the `identity` block ([#12951](https://github.com/hashicorp/terraform-provider-azurerm/issues/12951))\n* `azurerm_eventgrid_topic` support for the `identity` block ([#12951](https://github.com/hashicorp/terraform-provider-azurerm/issues/12951))\n* `azurerm_eventgrid_system_topic` support for the `identity` block ([#12951](https://github.com/hashicorp/terraform-provider-azurerm/issues/12951))\n* `azurerm_kubernetes_cluster` - support for the `os_sku` property ([#13284](https://github.com/hashicorp/terraform-provider-azurerm/issues/13284))\n* `azurerm_synapse_workspace` - support for the `tenant_id` property ([#13290](https://github.com/hashicorp/terraform-provider-azurerm/issues/13290))\n* `azurerm_site_recovery_network_mapping`- refactoring to use an ID Formatter/Parser ([#13277](https://github.com/hashicorp/terraform-provider-azurerm/issues/13277))\n* `azurerm_stream_analytics_output_blob` - support for the `Parquet` type and the `batch_max_wait_time` and `batch_min_rows` properties ([#13245](https://github.com/hashicorp/terraform-provider-azurerm/issues/13245))\n* `azurerm_virtual_network_gateway_resource` - support for multiple vpn authentication types ([#13228](https://github.com/hashicorp/terraform-provider-azurerm/issues/13228))\n\nBUG FIXES:\n\n* Data Source: `azurerm_kubernetes_cluster` - correctly read resource when `local_account_disabled` is `true` ([#13260](https://github.com/hashicorp/terraform-provider-azurerm/issues/13260))\n* `azurerm_api_management_subscription` - relax `subscription_id` validation ([#13203](https://github.com/hashicorp/terraform-provider-azurerm/issues/13203))\n* `azurerm_app_configuration_key` - fix KV import with no label ([#13253](https://github.com/hashicorp/terraform-provider-azurerm/issues/13253))\n* `azurerm_synapse_sql_pool` - properly support UTF-8 characters for the `name` property ([#13289](https://github.com/hashicorp/terraform-provider-azurerm/issues/13289))\n\n## 2.75.0 (September 02, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_cosmosdb_mongo_database` ([#13123](https://github.com/hashicorp/terraform-provider-azurerm/issues/13123))\n* **New Resource:** `azurerm_cognitive_account_customer_managed_key` ([#12901](https://github.com/hashicorp/terraform-provider-azurerm/issues/12901))\n* **New Resource:** `azurerm_logic_app_integration_account_partner` ([#13157](https://github.com/hashicorp/terraform-provider-azurerm/issues/13157))\n* **New Resource:** `azurerm_logic_app_integration_account_map` ([#13187](https://github.com/hashicorp/terraform-provider-azurerm/issues/13187))\n* **New Resource:** `azurerm_app_configuration_key` ([#13118](https://github.com/hashicorp/terraform-provider-azurerm/issues/13118))\n\nENHANCEMENTS:\n\n* dependencies: upgrading to `v57.0.0` of `github.com/Azure/azure-sdk-for-go` ([#13160](https://github.com/hashicorp/terraform-provider-azurerm/issues/13160))\n* upgrading `dataprotection` to API Version `2021-07-01` ([#13161](https://github.com/hashicorp/terraform-provider-azurerm/issues/13161))\n* `azurerm_application_insights` - support the `local_authentication_disabled` property ([#13174](https://github.com/hashicorp/terraform-provider-azurerm/issues/13174))\n* `azurerm_data_factory_linked_service_azure_blob_storage` - support for the `key_vault_sas_token` property ([#12880](https://github.com/hashicorp/terraform-provider-azurerm/issues/12880))\n* `azurerm_data_factory_linked_service_azure_function` support for the `key_vault_key` block ([#13159](https://github.com/hashicorp/terraform-provider-azurerm/issues/13159))\n* `azurerm_data_protection_backup_instance_postgresql` - support the `database_credential_key_vault_secret_id` property ([#13183](https://github.com/hashicorp/terraform-provider-azurerm/issues/13183))\n* `azurerm_hdinsight_hadoop_cluster` - support for the `security_profile` block ([#12866](https://github.com/hashicorp/terraform-provider-azurerm/issues/12866))\n* `azurerm_hdinsight_hbase_cluster` - support for the `security_profile` block ([#12866](https://github.com/hashicorp/terraform-provider-azurerm/issues/12866))\n* `azurerm_hdinsight_interactive_query_cluster` - support for the `security_profile` block ([#12866](https://github.com/hashicorp/terraform-provider-azurerm/issues/12866))\n* `azurerm_hdinsight_kafka_cluster` - support for the `security_profile` block ([#12866](https://github.com/hashicorp/terraform-provider-azurerm/issues/12866))\n* `azurerm_hdinsight_spark_cluster` - support for the `security_profile` block ([#12866](https://github.com/hashicorp/terraform-provider-azurerm/issues/12866))\n* `azurerm_mssql_server`- refactoring to use an ID Formatter/Parser ([#13151](https://github.com/hashicorp/terraform-provider-azurerm/issues/13151))\n* `azurerm_policy_virtual_machine_configuration_assignment` - support for the `assignment_type`, `content_uri`, and `content_hash` properties ([#13176](https://github.com/hashicorp/terraform-provider-azurerm/issues/13176))\n* `azurerm_storage_account` - handle nil values for AllowBlobPublicAccess ([#12689](https://github.com/hashicorp/terraform-provider-azurerm/issues/12689))\n* `azurerm_synapse_spark_pool` - add support spark for `3.1` ([#13181](https://github.com/hashicorp/terraform-provider-azurerm/issues/13181))\n\n## 2.74.0 (August 27, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_logic_app_integration_account_schema` ([#13100](https://github.com/hashicorp/terraform-provider-azurerm/issues/13100))\n* **New Resource:** `azurerm_relay_namespace_authorization_rule` ([#13116](https://github.com/hashicorp/terraform-provider-azurerm/issues/13116))\n* **New Resource:** `azurerm_relay_hybrid_connection_authorization_rule` ([#13116](https://github.com/hashicorp/terraform-provider-azurerm/issues/13116))\n\nENHANCEMENTS:\n\n* dependencies: upgrading `monitor` to API Version `2021-07-01-preview` ([#13121](https://github.com/hashicorp/terraform-provider-azurerm/issues/13121))\n* dependencies: upgrading `devtestlabs` to API Version `2018-09-15` ([#13074](https://github.com/hashicorp/terraform-provider-azurerm/issues/13074))\n* Data Source: `azurerm_servicebus_namespace_authorization_rule` - support for the `primary_connection_string_alias` and `secondary_connection_string_alias` properties ([#12997](https://github.com/hashicorp/terraform-provider-azurerm/issues/12997))\n* Data Source: `azurerm_servicebus_queue_authorization_rule` - support for the `primary_connection_string_alias` and `secondary_connection_string_alias` properties ([#12997](https://github.com/hashicorp/terraform-provider-azurerm/issues/12997))\n* Data Source: `azurerm_network_service_tags` - new properties `ipv4_cidrs` and `ipv6_cidrs` ([#13058](https://github.com/hashicorp/terraform-provider-azurerm/issues/13058))\n* `azurerm_api_management` - now exports certificate `expiry`, `thumbprint` and `subject` attributes ([#12262](https://github.com/hashicorp/terraform-provider-azurerm/issues/12262))\n* `azurerm_app_configuration` - support for user assigned identities ([#13080](https://github.com/hashicorp/terraform-provider-azurerm/issues/13080))\n* `azurerm_app_service` - add support for `vnet_route_all_enabled` property ([#13073](https://github.com/hashicorp/terraform-provider-azurerm/issues/13073))\n* `azurerm_app_service_plan` - support for the `zone_redundant` property  ([#13145](https://github.com/hashicorp/terraform-provider-azurerm/issues/13145))\n* `azurerm_data_factory_dataset_binary` -  support for `dynamic_path_enabled` and `dynamic_path_enabled`  properties ([#13117](https://github.com/hashicorp/terraform-provider-azurerm/issues/13117))\n* `azurerm_data_factory_dataset_delimited_text` -  support for `dynamic_path_enabled` and `dynamic_path_enabled`  properties ([#13117](https://github.com/hashicorp/terraform-provider-azurerm/issues/13117))\n* `azurerm_data_factory_dataset_json` -  support for `dynamic_path_enabled` and `dynamic_path_enabled`  properties ([#13117](https://github.com/hashicorp/terraform-provider-azurerm/issues/13117))\n* `azurerm_data_factory_dataset_parquet` -  support for `dynamic_path_enabled` and `dynamic_path_enabled`  properties ([#13117](https://github.com/hashicorp/terraform-provider-azurerm/issues/13117))\n* `azurerm_firewall_policy` - support for the `intrusion_detection`, `identity` and `tls_certificate` blocks ([#12769](https://github.com/hashicorp/terraform-provider-azurerm/issues/12769))\n* `azurerm_kubernetes_cluster` - support for the `pod_subnet_id` property ([#12313](https://github.com/hashicorp/terraform-provider-azurerm/issues/12313))\n* `azurerm_kubernetes_cluster_node_pool` - support for the `pod_subnet_id` property ([#12313](https://github.com/hashicorp/terraform-provider-azurerm/issues/12313))\n* `azurerm_monitor_autoscale_setting` - support for the field `divide_by_instance_count` within the `metric_trigger` block ([#13121](https://github.com/hashicorp/terraform-provider-azurerm/issues/13121))\n* `azurerm_redis_enterprise_cluster` - the `tags` property can now be updated ([#13084](https://github.com/hashicorp/terraform-provider-azurerm/issues/13084))\n* `azurerm_storage_account` - add support for `shared_key_access_enabled` property ([#13014](https://github.com/hashicorp/terraform-provider-azurerm/issues/13014))\n* `azurerm_servicebus_namespace_authorization_rule` - support for the `primary_connection_string_alias` and `secondary_connection_string_alias` properties ([#12997](https://github.com/hashicorp/terraform-provider-azurerm/issues/12997))\n* `azurerm_servicebus_topic_authorization_rule` - support for the `primary_connection_string_alias` and `secondary_connection_string_alias` properties ([#12997](https://github.com/hashicorp/terraform-provider-azurerm/issues/12997))\n* `azurerm_dev_test_global_vm_shutdown_schedule` - support for the `mail` property ([#13074](https://github.com/hashicorp/terraform-provider-azurerm/issues/13074))\n\nBUG FIXES:\n\n* `azurerm_data_factory_dataset_delimited_text` - support empty values for the `column_delimiter`, `row_delimiter`, `quote_character`, `escape_character`, and `encoding` properties ([#13149](https://github.com/hashicorp/terraform-provider-azurerm/issues/13149))\n* `azurerm_cosmosdb_cassandra_table` - correctly update `throughput` ([#13102](https://github.com/hashicorp/terraform-provider-azurerm/issues/13102))\n* `azurerm_private_dns_a_record` - fix regression in `name` validation and add max recordset limit validation ([#13093](https://github.com/hashicorp/terraform-provider-azurerm/issues/13093))\n* `azurerm_postgresql_flexible_server_database` the `charset` and `collation` properties are now optional ([#13110](https://github.com/hashicorp/terraform-provider-azurerm/issues/13110))\n* `azurerm_spring_cloud_app` - Fix crash when identity is not present ([#13125](https://github.com/hashicorp/terraform-provider-azurerm/issues/13125))\n\n## 2.73.0 (August 20, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_vpn_gateway` ([#12844](https://github.com/hashicorp/terraform-provider-azurerm/issues/12844))\n* **New Data Source:** `azurerm_data_protection_backup_vault` ([#13062](https://github.com/hashicorp/terraform-provider-azurerm/issues/13062))\n* **New Resource:** `azurerm_api_management_notification_recipient_email` ([#12849](https://github.com/hashicorp/terraform-provider-azurerm/issues/12849))\n* **New Resource:** `azurerm_logic_app_integration_account_session` ([#12982](https://github.com/hashicorp/terraform-provider-azurerm/issues/12982))\n* **New Resource:** `azurerm_machine_learning_synapse_spark` ([#13022](https://github.com/hashicorp/terraform-provider-azurerm/issues/13022))\n* **New Resource:** `azurerm_machine_learning_compute_instance` ([#12834](https://github.com/hashicorp/terraform-provider-azurerm/issues/12834))\n* **New Resource:** `azurerm_vpn_gateway` ([#13003](https://github.com/hashicorp/terraform-provider-azurerm/issues/13003))\n\nENHANCEMENTS:\n\n* Dependencies: upgrade `github.com/Azure/azure-sdk-for-go` to `v56.2.0` ([#12969](https://github.com/hashicorp/terraform-provider-azurerm/issues/12969))\n* Dependencies: updating `frontdoor` to use API version `2020-05-01` ([#12831](https://github.com/hashicorp/terraform-provider-azurerm/issues/12831))\n* Dependencies: updating `web` to use API version `2021-02-01` ([#12970](https://github.com/hashicorp/terraform-provider-azurerm/issues/12970))\n* Dependencies: updating `kusto` to use API version `2021-01-01` ([#12967](https://github.com/hashicorp/terraform-provider-azurerm/issues/12967))\n* Dependencies: updating `machinelearning` to use API version `2021-07-01` ([#12833](https://github.com/hashicorp/terraform-provider-azurerm/issues/12833))\n* Dependencies: updating `network` to use API version `2021-02-01` ([#13002](https://github.com/hashicorp/terraform-provider-azurerm/issues/13002))\n* appconfiguration: updating to use the latest embedded SDK ([#12950](https://github.com/hashicorp/terraform-provider-azurerm/issues/12950))\n* eventhub: updating to use the latest embedded SDK ([#12946](https://github.com/hashicorp/terraform-provider-azurerm/issues/12946))\n* Data Source: `azurerm_iothub` - support for the property `hostname` ([#13001](https://github.com/hashicorp/terraform-provider-azurerm/issues/13001))\n* Data Source: `azurerm_application_security_group` - refactoring to use an ID Formatter/Parser ([#13028](https://github.com/hashicorp/terraform-provider-azurerm/issues/13028))\n* `azurerm_active_directory_domain_service` - export the `resource_id` attribute ([#13011](https://github.com/hashicorp/terraform-provider-azurerm/issues/13011))\n* `azurerm_app_service_environment_v3` - updated for GA changes, including support for `internal_load_balancing_mode`, `zone_redundant`, `dedicated_host_count`, and several new exported properties ([#12932](https://github.com/hashicorp/terraform-provider-azurerm/issues/12932))\n* `azurerm_application_security_group` - refactoring to use an ID Formatter/Parser ([#13028](https://github.com/hashicorp/terraform-provider-azurerm/issues/13028))\n* `azurerm_data_lake_store` - support for the `identity` block ([#13050](https://github.com/hashicorp/terraform-provider-azurerm/issues/13050))\n* `azurerm_kubernetes_cluster` - support for the `ultra_ssd_enabled` and `private_cluster_public_fqdn_enabled` properties ([#12780](https://github.com/hashicorp/terraform-provider-azurerm/issues/12780))\n* `azurerm_kubernetes_cluster_node_pool` - support for the `ultra_ssd_enabled` property ([#12780](https://github.com/hashicorp/terraform-provider-azurerm/issues/12780))\n* `azurerm_logic_app_trigger_http_request` - support for the `callback_url` attribute ([#13057](https://github.com/hashicorp/terraform-provider-azurerm/issues/13057))\n* `azurerm_netapp_volume` - support for the `snapshot_directory_visible` property ([#12961](https://github.com/hashicorp/terraform-provider-azurerm/issues/12961))\n* `azurerm_sql_server` - support for configuring `threat_detection_policy` ([#13048](https://github.com/hashicorp/terraform-provider-azurerm/issues/13048))\n* `azurerm_stream_analytics_output_eventhub` - support for the `property_columns` property ([#12947](https://github.com/hashicorp/terraform-provider-azurerm/issues/12947))\n\nBUG FIXES:\n\n* `azurerm_frontdoor` - expose support for `cache_duration` and `cache_query_parameters` fields ([#12831](https://github.com/hashicorp/terraform-provider-azurerm/issues/12831))\n* `azurerm_network_watcher_flow_log` - correctly truncate name by ensuring it doesn't end in a `-` ([#12984](https://github.com/hashicorp/terraform-provider-azurerm/issues/12984))\n* `azurerm_databricks_workspace` - correct logic for the `public_network_access_enabled` property ([#13034](https://github.com/hashicorp/terraform-provider-azurerm/issues/13034))\n* `azurerm_databricks_workspace` - fix potential crash in Read ([#13025](https://github.com/hashicorp/terraform-provider-azurerm/issues/13025))\n* `azurerm_private_dns_zone_id` - correctly handle inconsistent case ([#13000](https://github.com/hashicorp/terraform-provider-azurerm/issues/13000))\n* `azurerm_private_dns_a_record_resource` - currently validate the name property by allowing `@`s ([#13042](https://github.com/hashicorp/terraform-provider-azurerm/issues/13042))\n* `azurerm_eventhub_namespace` - support up to `40` for the `maximum_throughput_units` property ([#13065](https://github.com/hashicorp/terraform-provider-azurerm/issues/13065))\n* `azurerm_kubernetes_cluster` - fix crash in update when previously configured Microsoft Entra profile is now `nil` ([#13043](https://github.com/hashicorp/terraform-provider-azurerm/issues/13043))\n* `azurerm_redis_enterprise_cluster` - changing the tags property no longer creates a new resource ([#12956](https://github.com/hashicorp/terraform-provider-azurerm/issues/12956))\n* `azurerm_storage_account` - allow 0 for the `cors.max_age_in_seconds` property ([#13010](https://github.com/hashicorp/terraform-provider-azurerm/issues/13010))\n* `azurerm_servicebus_topic` - correctly validate the `name` property ([#13026](https://github.com/hashicorp/terraform-provider-azurerm/issues/13026))\n* `azurerm_virtual_hub_connection` - will not correctly lock it's virtual network during updates ([#12999](https://github.com/hashicorp/terraform-provider-azurerm/issues/12999))\n* `azurerm_linux_virtual_machine_scale_set` - fix potential crash in updates to the `rolling_upgrade_policy` block ([#13029](https://github.com/hashicorp/terraform-provider-azurerm/issues/13029))\n\n\n\n## 2.72.0 (August 12, 2021)\n\nUPGRADE NOTES\n\n* This version of the Azure Provider introduces the `prevent_deletion_if_contains_resources` feature flag (which is disabled by default) which (when enabled) means that Terraform will check for Resources nested within the Resource Group during the deletion of the Resource Group and require that these Resources are deleted first. This avoids the unintentional deletion of unmanaged Resources within a Resource Group - and is defaulted off in 2.x versions of the Azure Provider but **will be enabled by default in version 3.0 of the Azure Provider**, see [the `features` block documentation](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs#features) for more information. ([#12657](https://github.com/hashicorp/terraform-provider-azurerm/issues/12657))\n\n\nFEATURES:\n\n* **New Resource:** `azurerm_video_analyzer` ([#12665](https://github.com/hashicorp/terraform-provider-azurerm/issues/12665))\n* **New Resource:** `azurerm_video_analyzer_edge_module` ([#12911](https://github.com/hashicorp/terraform-provider-azurerm/issues/12911))\n\nENHANCEMENTS:\n\n* `azurerm_api_management_named_value` - support for system managed identities ([#12938](https://github.com/hashicorp/terraform-provider-azurerm/issues/12938))\n* `azurerm_application_insights_smart_detection_rule` - support all currently available rules in the SDK ([#12857](https://github.com/hashicorp/terraform-provider-azurerm/issues/12857))\n* `azurerm_function_app` - add support for `dotnet_framework_version` in ([#12883](https://github.com/hashicorp/terraform-provider-azurerm/issues/12883))\n* `azurerm_resource_group` - conditionally (based on the `prevent_deletion_if_contains_resources` features flag - see the 'Upgrade Notes' section) checking for nested Resources during deletion of the Resource Group and raising an error if Resources are found ([#12657](https://github.com/hashicorp/terraform-provider-azurerm/issues/12657))\n\nBUG FIXES:\n\n* Data Source: `azurerm_key_vault_certificate_data` - updating the PEM Header when using a RSA Private Key so this validates with OpenSSL ([#12896](https://github.com/hashicorp/terraform-provider-azurerm/issues/12896))\n* `azurerm_active_directory_domain_service` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_app_service_environment` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_cdn_profile` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_container_registry_scope_map` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_container_registry_token` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_container_registry_webhook` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_container_registry` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_data_factory_dataset_delimited_text` - correctly send optional optional values to the API ([#12921](https://github.com/hashicorp/terraform-provider-azurerm/issues/12921))\n* `azurerm_data_lake_analytics_account` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_data_lake_store` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_data_protection_backup_instance_disk` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_database_migration_service` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_dns_zone` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_eventgrid_domain_topic` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_eventgrid_domain` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_eventgrid_event_subscription` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_eventgrid_system_topic_event_subscription` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_eventgrid_system_topic` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_eventgrid_topic` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_express_route_circuit_authorization` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_express_route_circuit_peering` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_express_route_gateway` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_express_route_port` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_frontdoor_firewall_policy` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_hpc_cache_blob_nfs_target` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_iothub` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_key_vault_managed_hardware_security_module` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_kubernetes_cluster` - prevent nil panic when rbac config is empty ([#12881](https://github.com/hashicorp/terraform-provider-azurerm/issues/12881))\n* `azurerm_iot_dps` - fixing a crash during creation ([#12919](https://github.com/hashicorp/terraform-provider-azurerm/issues/12919))\n* `azurerm_local_network_gateway` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_logic_app_trigger_recurrence` - update time zone strings to match API behaviour, and use the timezone even when `start_time` is not specified ([#12453](https://github.com/hashicorp/terraform-provider-azurerm/issues/12453))\n* `azurerm_mariadb_database` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_mariadb_server` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_mariadb_virtual_network_rule` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_mssql_database` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_mssql_virtual_network_rule` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_mysql_server` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_nat_gateway` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_network_packet_capture` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_packet_capture` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_postgresql_configuration` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_postgresql_firewall_rule` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_postgresql_server` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_postgresql_virtual_network_rule` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_private_dns_zone_virtual_network_link` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_private_endpoint` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_private_link_service` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_shared_image_gallery` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_sql_virtual_network_rule` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_virtual_machine_scale_set_extension` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_virtual_wan` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_vpn_gateway_connection` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n* `azurerm_web_application_firewall_policy` - removing an unnecessary check during deletion ([#12879](https://github.com/hashicorp/terraform-provider-azurerm/issues/12879))\n\n## 2.71.0 (August 06, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_databricks_workspace_private_endpoint_connection` ([#12543](https://github.com/hashicorp/terraform-provider-azurerm/issues/12543))\n* **New Resource:** `azurerm_api_management_tag` ([#12535](https://github.com/hashicorp/terraform-provider-azurerm/issues/12535))\n* **New Resource:** `azurerm_bot_channel_line` ([#12746](https://github.com/hashicorp/terraform-provider-azurerm/issues/12746))\n* **New Resource:** `azurerm_cdn_endpoint_custom_domain` ([#12496](https://github.com/hashicorp/terraform-provider-azurerm/issues/12496))\n* **New Resource:** `azurerm_data_factory_data_flow` ([#12588](https://github.com/hashicorp/terraform-provider-azurerm/issues/12588))\n* **New Resource:** `azurerm_postgresql_flexible_server_database` ([#12550](https://github.com/hashicorp/terraform-provider-azurerm/issues/12550))\n\nENHANCEMENTS:\n\n* dependencies: upgrading to `v56.0.0` of `github.com/Azure/azure-sdk-for-go` ([#12781](https://github.com/hashicorp/terraform-provider-azurerm/issues/12781))\n* dependencies: updating `appinsights` to use API Version `2020-02-02` ([#12818](https://github.com/hashicorp/terraform-provider-azurerm/issues/12818))\n* dependencies: updating `containerservice` to use API Version `2021-05-1` ([#12747](https://github.com/hashicorp/terraform-provider-azurerm/issues/12747))\n* dependencies: updating `machinelearning` to use API Version `2021-04-01` ([#12804](https://github.com/hashicorp/terraform-provider-azurerm/issues/12804))\n* dependencies: updating `databricks` to use API Version `2021-04-01-preview` ([#12543](https://github.com/hashicorp/terraform-provider-azurerm/issues/12543))\n* PowerBI: refactoring to use an Embedded SDK ([#12787](https://github.com/hashicorp/terraform-provider-azurerm/issues/12787))\n* SignalR: refactoring to use an Embedded SDK ([#12785](https://github.com/hashicorp/terraform-provider-azurerm/issues/12785))\n* `azurerm_api_management_api_diagnostic` - support for the `operation_name_format` property ([#12782](https://github.com/hashicorp/terraform-provider-azurerm/issues/12782))\n* `azurerm_app_service` - support for the acr_use_managed_identity_credentials and acr_user_managed_identity_client_id properties ([#12745](https://github.com/hashicorp/terraform-provider-azurerm/issues/12745))\n* `azurerm_app_service` - support `v6.0` for the `dotnet_framework_version` property ([#12788](https://github.com/hashicorp/terraform-provider-azurerm/issues/12788))\n* `azurerm_application_insights` - support for the `workspace_id` property ([#12818](https://github.com/hashicorp/terraform-provider-azurerm/issues/12818))\n* `azurerm_databricks_workspace` - support for private link endpoint ([#12543](https://github.com/hashicorp/terraform-provider-azurerm/issues/12543))\n* `azurerm_databricks_workspace` - add support for `Customer Managed Keys for Managed Services` ([#12799](https://github.com/hashicorp/terraform-provider-azurerm/issues/12799))\n* `azurerm_data_factory_linked_service_data_lake_storage_gen2` - don't send a secure connection string when using a managed identity ([#12359](https://github.com/hashicorp/terraform-provider-azurerm/issues/12359))\n* `azurerm_function_app` - support for the `elastic_instance_minimum`, `app_scale_limit`, and `runtime_scale_monitoring_enabled` properties ([#12741](https://github.com/hashicorp/terraform-provider-azurerm/issues/12741))\n* `azurerm_kubernetes_cluster` - support for the `local_account_disabled` property ([#12386](https://github.com/hashicorp/terraform-provider-azurerm/issues/12386))\n* `azurerm_kubernetes_cluster` - support for the `maintenance_window` block ([#12762](https://github.com/hashicorp/terraform-provider-azurerm/issues/12762))\n* `azurerm_kubernetes_cluster` - the field `automatic_channel_upgrade` can now be set to `node-image` ([#12667](https://github.com/hashicorp/terraform-provider-azurerm/issues/12667))\n* `azurerm_logic_app_workflow` - support for the `workflow_parameters` ([#12314](https://github.com/hashicorp/terraform-provider-azurerm/issues/12314))\n* `azurerm_mssql_database` - support for the `Free` and `FSV2` SKU's ([#12835](https://github.com/hashicorp/terraform-provider-azurerm/issues/12835))\n* `azurerm_network_security_group` - the `protocol` property now supports `Ah` and `Esp` values ([#12865](https://github.com/hashicorp/terraform-provider-azurerm/issues/12865))\n* `azurerm_public_ip_resource` - support for sku_tier property ([#12775](https://github.com/hashicorp/terraform-provider-azurerm/issues/12775))\n* `azurerm_redis_cache` - support for the `replicas_per_primary`, `redis_version`, and `tenant_settings` properties and blocks ([#12820](https://github.com/hashicorp/terraform-provider-azurerm/issues/12820))\n* `azurerm_redis_enterprise_cluster` - this can now be provisioned in `Canada Central` ([#12842](https://github.com/hashicorp/terraform-provider-azurerm/issues/12842))\n* `azurerm_static_site` - support `Standard` SKU ([#12510](https://github.com/hashicorp/terraform-provider-azurerm/issues/12510))\n\nBUG FIXES:\n\n* Data Source `azurerm_ssh_public_key` - normalising the SSH Public Key ([#12800](https://github.com/hashicorp/terraform-provider-azurerm/issues/12800))\n* `azurerm_api_management_api_subscription` - fixing the default scope to be `/apis` rather than `all_apis` as required by the latest API ([#12829](https://github.com/hashicorp/terraform-provider-azurerm/issues/12829))\n* `azurerm_app_service_active_slot` - fix 404 not found on read for slot ([#12792](https://github.com/hashicorp/terraform-provider-azurerm/issues/12792))\n* `azurerm_linux_virtual_machine_scale_set` - fix crash in checking for latest image ([#12808](https://github.com/hashicorp/terraform-provider-azurerm/issues/12808))\n* `azurerm_kubernetes_cluster` - correctly validate the `net_ipv4_ip_local_port_range_max` property ([#12859](https://github.com/hashicorp/terraform-provider-azurerm/issues/12859))\n* `azurerm_local_network_gateway` - fixing a crash where the `LocalNetworkAddressSpace` block was nil ([#12822](https://github.com/hashicorp/terraform-provider-azurerm/issues/12822))\n* `azurerm_notification_hub_authorization_rule` - switching to use an ID Formatter ([#12845](https://github.com/hashicorp/terraform-provider-azurerm/issues/12845))\n* `azurerm_notification_hub` - switching to use an ID Formatter ([#12845](https://github.com/hashicorp/terraform-provider-azurerm/issues/12845))\n* `azurerm_notification_hub_namespace` - switching to use an ID Formatter ([#12845](https://github.com/hashicorp/terraform-provider-azurerm/issues/12845))\n* `azurerm_postgresql_database` - fixing a crash in the Azure SDK ([#12823](https://github.com/hashicorp/terraform-provider-azurerm/issues/12823))\n* `azurerm_private_dns_zone` - fixing a crash during deletion ([#12824](https://github.com/hashicorp/terraform-provider-azurerm/issues/12824))\n* `azurerm_resource_group_template_deployment` - fixing deletion of nested items when using non-top level items ([#12421](https://github.com/hashicorp/terraform-provider-azurerm/issues/12421))\n* `azurerm_subscription_template_deployment` - fixing deletion of nested items when using non-top level items ([#12421](https://github.com/hashicorp/terraform-provider-azurerm/issues/12421))\n* `azurerm_virtual_machine_extension` - changing the `publisher` property now creates a new resource ([#12790](https://github.com/hashicorp/terraform-provider-azurerm/issues/12790))\n\n## 2.70.0 (July 30, 2021)\n\nFEATURES:\n\n* **New Data Source** `azurerm_storage_share` ([#12693](https://github.com/hashicorp/terraform-provider-azurerm/issues/12693))\n* **New Resource** `azurerm_bot_channel_alexa` ([#12682](https://github.com/hashicorp/terraform-provider-azurerm/issues/12682))\n* **New Resource** `azurerm_bot_channel_direct_line_speech` ([#12735](https://github.com/hashicorp/terraform-provider-azurerm/issues/12735))\n* **New Resource** `azurerm_bot_channel_facebook` ([#12709](https://github.com/hashicorp/terraform-provider-azurerm/issues/12709))\n* **New Resource** `azurerm_bot_channel_sms` ([#12713](https://github.com/hashicorp/terraform-provider-azurerm/issues/12713))\n* **New Resource** `azurerm_data_factory_trigger_custom_event` ([#12448](https://github.com/hashicorp/terraform-provider-azurerm/issues/12448))\n* **New Resource** `azurerm_data_factory_trigger_tumbling_window` ([#12437](https://github.com/hashicorp/terraform-provider-azurerm/issues/12437))\n* **New Resource** `azurerm_data_protection_backup_instance_disk` ([#12617](https://github.com/hashicorp/terraform-provider-azurerm/issues/12617))\n\nENHANCEMENTS:\n\n* dependencies: Upgrade `web` (App Service) API to `2021-01-15` ([#12635](https://github.com/hashicorp/terraform-provider-azurerm/issues/12635))\n* analysisservices: refactoring to use an Embedded SDK ([#12771](https://github.com/hashicorp/terraform-provider-azurerm/issues/12771))\n* maps: refactoring to use an Embedded SDK ([#12716](https://github.com/hashicorp/terraform-provider-azurerm/issues/12716))\n* msi: refactoring to use an Embedded SDK ([#12715](https://github.com/hashicorp/terraform-provider-azurerm/issues/12715))\n* relay: refactoring to use an Embedded SDK ([#12772](https://github.com/hashicorp/terraform-provider-azurerm/issues/12772))\n* vmware: refactoring to use an Embedded SDK ([#12751](https://github.com/hashicorp/terraform-provider-azurerm/issues/12751))\n* Data Source: `azurerm_storage_account_sas` - support for the property `ip_addresses` ([#12705](https://github.com/hashicorp/terraform-provider-azurerm/issues/12705))\n* `azurerm_api_management_diagnostic` - support for the property `operation_name_format` ([#12736](https://github.com/hashicorp/terraform-provider-azurerm/issues/12736))\n* `azurerm_automation_certificate` - the `exportable` property can now be set ([#12738](https://github.com/hashicorp/terraform-provider-azurerm/issues/12738))\n* `azurerm_data_factory_dataset_binary` - the blob `path` and `filename` properties are now optional ([#12676](https://github.com/hashicorp/terraform-provider-azurerm/issues/12676))\n* `azurerm_data_factory_trigger_blob_event` - support for the `activation` property ([#12644](https://github.com/hashicorp/terraform-provider-azurerm/issues/12644))\n* `azurerm_data_factory_pipeline` - support for the `concurrency` and `moniter_metrics_after_duration` properties ([#12685](https://github.com/hashicorp/terraform-provider-azurerm/issues/12685))\n* `azurerm_hdinsight_interactive_query_cluster` - support for the `encryption_in_transit_enabled` property ([#12767](https://github.com/hashicorp/terraform-provider-azurerm/issues/12767))\n* `azurerm_hdinsight_spark_cluster` - support for the `encryption_in_transit_enabled` property ([#12767](https://github.com/hashicorp/terraform-provider-azurerm/issues/12767))\n* `azurerm_firewall_policy` - support for property `private_ip_ranges` ([#12696](https://github.com/hashicorp/terraform-provider-azurerm/issues/12696))\n\nBUG FIXES:\n\n* `azurerm_cdn_endpoint` - fixing a crash when the future is nil ([#12743](https://github.com/hashicorp/terraform-provider-azurerm/issues/12743))\n* `azurerm_private_endpoint` - working around a casing issue in `private_connection_resource_id` for MariaDB, MySQL and PostgreSQL resources ([#12761](https://github.com/hashicorp/terraform-provider-azurerm/issues/12761))\n* \n## 2.69.0 (July 23, 2021)\n\nFEATURES:\n\n* **New Data Source** `azurerm_active_directory_domain_service` ([#10782](https://github.com/hashicorp/terraform-provider-azurerm/issues/10782))\n* **New Resource** `azurerm_active_directory_domain_service` ([#10782](https://github.com/hashicorp/terraform-provider-azurerm/issues/10782))\n* **New Resource** `azurerm_active_directory_domain_service_replica_set` ([#10782](https://github.com/hashicorp/terraform-provider-azurerm/issues/10782))\n* **New Resource** `azurerm_api_management_gateway_api` ([#12398](https://github.com/hashicorp/terraform-provider-azurerm/issues/12398))\n* **New Resource** `azurerm_batch_job` ([#12573](https://github.com/hashicorp/terraform-provider-azurerm/issues/12573))\n* **New Resource** `azurerm_bot_channel_web_chat` ([#12672](https://github.com/hashicorp/terraform-provider-azurerm/issues/12672))\n* **New Resource** `azurerm_data_factory_managed_private_endpoint` ([#12618](https://github.com/hashicorp/terraform-provider-azurerm/issues/12618))\n* **New Resource** `azurerm_data_protection_backup_policy_blob_storage` ([#12362](https://github.com/hashicorp/terraform-provider-azurerm/issues/12362))\n* **New Resource** `azurerm_signalr_service_network_acl` ([#12434](https://github.com/hashicorp/terraform-provider-azurerm/issues/12434))\n* **New Resource** `azurerm_virtual_network_dns_servers` ([#10782](https://github.com/hashicorp/terraform-provider-azurerm/issues/10782))\n\nENHANCEMENTS:\n\n* dependencies: Upgrading to `v55.6.0` of `github.com/Azure/azure-sdk-for-go` ([#12565](https://github.com/hashicorp/terraform-provider-azurerm/issues/12565))\n* `azurerm_api_management_named_value` - the field `secret_id` can now be set to a versionless Key Vault Key ([#12641](https://github.com/hashicorp/terraform-provider-azurerm/issues/12641))\n* `azurerm_data_factory_integration_runtime_azure_ssis` - support for the `public_ips`, `express_custom_setup`, `package_store`, and `proxy` blocks ([#12545](https://github.com/hashicorp/terraform-provider-azurerm/issues/12545))\n* `azurerm_data_factory_integration_runtime_azure_ssis` - support for the `key_vault_password`, and `key_vault_license` blocks ([#12659](https://github.com/hashicorp/terraform-provider-azurerm/issues/12659))\n* `azurerm_bot_channels_registration` - support for the `cmk_key_vault_url`, `description`, `icon_url`, and `isolated_network_enabled` ([#12560](https://github.com/hashicorp/terraform-provider-azurerm/issues/12560))\n* `azurerm_data_factory_integration_runtime_azure` - support for the `virtual_network_enabled` property ([#12619](https://github.com/hashicorp/terraform-provider-azurerm/issues/12619))\n* `azurerm_eventgrid_event_subscription` - support for the `advanced_filtering_on_arrays_enabled` property ([#12609](https://github.com/hashicorp/terraform-provider-azurerm/issues/12609))\n* `azurerm_eventgrid_system_topic_event_subscription` - support for the `advanced_filtering_on_arrays_enabled` property ([#12609](https://github.com/hashicorp/terraform-provider-azurerm/issues/12609))\n* `azurerm_eventhub_namespace` - support for Azure Event Hubs Namespace Premium tier ([#12695](https://github.com/hashicorp/terraform-provider-azurerm/issues/12695))\n* `azurerm_kubernetes_cluster` - support for downgrading `sku_tier` from `Paid` to `Free` without recreating the Cluster ([#12651](https://github.com/hashicorp/terraform-provider-azurerm/issues/12651))\n* `azurerm_kusto_eventgrid_data_connection` - Add supported `data_format` APACHEAVRO, ORC, PARQUET, TSVE and W3CLOGFILE to validation function. ([#12687](https://github.com/hashicorp/terraform-provider-azurerm/issues/12687))\n* `azurerm_postgresql_flexible_server` - support for the `high_availability` block ([#12587](https://github.com/hashicorp/terraform-provider-azurerm/issues/12587))\n\nBUG FIXES:\n\n* `data.azurerm_redis_cache` - fix a bug that caused the data source to raise an error ([#12666](https://github.com/hashicorp/terraform-provider-azurerm/issues/12666))\n* `azurerm_application_gateway` - return an error when ssl policy is not properly configured  ([#12647](https://github.com/hashicorp/terraform-provider-azurerm/issues/12647))\n* `azurerm_data_factory_linked_custom_service` - fix a bug causing `additional_properties` to be read incorrectly into state ([#12664](https://github.com/hashicorp/terraform-provider-azurerm/issues/12664))\n* `azurerm_eventhub_authorization_rule` - fixing the error \"empty non-retryable error received\" ([#12642](https://github.com/hashicorp/terraform-provider-azurerm/issues/12642))\n* `azurerm_machine_learning_compute_cluster` - fix a crash when creating a cluster without specifying `subnet_resource_id` ([#12658](https://github.com/hashicorp/terraform-provider-azurerm/issues/12658))\n* `azurerm_storage_account` - fixed account_replication_type validation ([#12645](https://github.com/hashicorp/terraform-provider-azurerm/issues/12645))\n\n## 2.68.0 (July 16, 2021)\n\nFEATURES:\n\n* **New Data Source** `azurerm_local_network_gateway` ([#12579](https://github.com/hashicorp/terraform-provider-azurerm/issues/12579))\n* **New Resource** `azurerm_api_management_api_release` ([#12562](https://github.com/hashicorp/terraform-provider-azurerm/issues/12562))\n* **New Resource** `azurerm_data_protection_backup_policy_disk` ([#12361](https://github.com/hashicorp/terraform-provider-azurerm/issues/12361))\n* **New Resource** `azurerm_data_factory_custom_dataset` ([#12484](https://github.com/hashicorp/terraform-provider-azurerm/issues/12484))\n* **New Resource** `azurerm_data_factory_dataset_binary` ([#12369](https://github.com/hashicorp/terraform-provider-azurerm/issues/12369))\n* **New Resource** `azurerm_maintenance_assignment_virtual_machine_scale_set` ([#12273](https://github.com/hashicorp/terraform-provider-azurerm/issues/12273))\n* **New Resource** `azurerm_postgresql_flexible_server_configuration` ([#12294](https://github.com/hashicorp/terraform-provider-azurerm/issues/12294))\n* **New Resource** `azurerm_synapse_private_link_hub` ([#12495](https://github.com/hashicorp/terraform-provider-azurerm/issues/12495))\n\nENHANCEMENTS:\n\n* dependencies: upgrading to `v55.5.0` of `github.com/Azure/azure-sdk-for-go` ([#12435](https://github.com/hashicorp/terraform-provider-azurerm/issues/12435))\n* dependencies: updating `bot` to use API Version `2021-03-01` ([#12449](https://github.com/hashicorp/terraform-provider-azurerm/issues/12449))\n* dependencies: updating `maintenance` to use API Version `2021-05-01` ([#12273](https://github.com/hashicorp/terraform-provider-azurerm/issues/12273))\n* `azurerm_api_management_named_value` - support for the `value_from_key_vault` block ([#12309](https://github.com/hashicorp/terraform-provider-azurerm/issues/12309))\n* `azurerm_api_management_api_diagnostic` - support for the `data_masking`1 property ([#12419](https://github.com/hashicorp/terraform-provider-azurerm/issues/12419))\n* `azurerm_cognitive_account` - support for the `identity`, `storage`, `disable_local_auth`, `fqdns`, `public_network_access_enabled`, and `restrict_outbound_network_access` properties ([#12469](https://github.com/hashicorp/terraform-provider-azurerm/issues/12469))\n* `azurerm_cognitive_account` - the `virtual_network_subnet_ids` property has been deprecated in favour of `virtual_network_rules` block to support the `ignore_missing_vnet_service_endpoint` property ([#12600](https://github.com/hashicorp/terraform-provider-azurerm/issues/12600))\n* `azurerm_container_registry` - now exports the `principal_id` and `tenant_id` attributes in the `identity` block ([#12378](https://github.com/hashicorp/terraform-provider-azurerm/issues/12378))\n* `azurerm_data_factory` - support for the `managed_virtual_network_enabled` property ([#12343](https://github.com/hashicorp/terraform-provider-azurerm/issues/12343))\n* `azurerm_linux_virtual_machine_scale_set` - Fix un-necessary VMSS instance rolling request ([#12590](https://github.com/hashicorp/terraform-provider-azurerm/issues/12590))\n* `azurerm_maintenance_configuration` - support for the `window`, `visibility`, and `properties` blocks ([#12273](https://github.com/hashicorp/terraform-provider-azurerm/issues/12273))\n* `azurerm_powerbi_embedded` - support for the `mode` property ([#12394](https://github.com/hashicorp/terraform-provider-azurerm/issues/12394))\n* `azurerm_redis_cache` - support for the `maintenance_window` property in the `patch_schedule` block ([#12472](https://github.com/hashicorp/terraform-provider-azurerm/issues/12472))\n* `azurerm_storage_account_customer_managed_key` - support for the `user_assigned_identity_id` property ([#12516](https://github.com/hashicorp/terraform-provider-azurerm/issues/12516))\n\nBUG FIXES:\n\n* `azurerm_api_management` - no longer forces a new resource when changing the `subnet_id` property ([#12611](https://github.com/hashicorp/terraform-provider-azurerm/issues/12611))\n* `azurerm_function_app` - set a default value for `os_type` and allow a blank string to be specified as per documentation ([#12482](https://github.com/hashicorp/terraform-provider-azurerm/issues/12482))\n* `azurerm_key_vault_access_policy` - prevent a possible panic on delete ([#12616](https://github.com/hashicorp/terraform-provider-azurerm/issues/12616))\n* `azurerm_postgresql_flexible_server` - add new computed property `private_dns_zone_id` to work around an upcoming breaking change in the API ([#12288](https://github.com/hashicorp/terraform-provider-azurerm/issues/12288))\n* `machine_learning_compute_cluster` - make the `subnet_resource_id` property actually optional ([#12558](https://github.com/hashicorp/terraform-provider-azurerm/issues/12558))\n* `azurerm_mssql_database` - don't allow license_type to be set for serverless SQL databases ([#12555](https://github.com/hashicorp/terraform-provider-azurerm/issues/12555))\n* `azurerm_subnet_network_security_group_association` - prevent potential deadlocks when using multiple association resources ([#12267](https://github.com/hashicorp/terraform-provider-azurerm/issues/12267))\n\n## 2.67.0 (July 09, 2021)\n\nFEATURES:\n\n* **New Data Source** `azurerm_api_management_gateway` ([#12297](https://github.com/hashicorp/terraform-provider-azurerm/issues/12297))\n* **New Resource** `azurerm_api_management_gateway` ([#12297](https://github.com/hashicorp/terraform-provider-azurerm/issues/12297))\n* **New Resource** `azurerm_databricks_workspace_customer_managed_key`([#12331](https://github.com/hashicorp/terraform-provider-azurerm/issues/12331))\n\nENHANCEMENTS:\n\n* dependencies: updating `postgresqlflexibleservers` to use API Version `2021-06-01` ([#12405](https://github.com/hashicorp/terraform-provider-azurerm/issues/12405))\n* `azurerm_databricks_workspace` - add support for `machine_learning_workspace_id`, `customer_managed_key_enabled`, `infrastructure_encryption_enabled` and `storage_account_identity` ([#12331](https://github.com/hashicorp/terraform-provider-azurerm/issues/12331))\n* `azurerm_security_center_assessment_policy` - support for the `categories` property ([#12383](https://github.com/hashicorp/terraform-provider-azurerm/issues/12383))\n\nBUG FIXES:\n\n* `azurerm_api_management` - fix an issue where changing the location of an `additional_location` would force a new resource ([#12468](https://github.com/hashicorp/terraform-provider-azurerm/issues/12468))\n* `azurerm_app_service` - fix crash when resource group or ASE is missing. ([#12518](https://github.com/hashicorp/terraform-provider-azurerm/issues/12518))\n* `azurerm_automation_variable_int` - fixed value parsing order causing `1` to be considered a bool ([#12511](https://github.com/hashicorp/terraform-provider-azurerm/issues/12511))\n* `azurerm_automation_variable_bool` - fixed value parsing order causing `1` to be considered a bool ([#12511](https://github.com/hashicorp/terraform-provider-azurerm/issues/12511))\n* `azurerm_data_factory_dataset_parquet` - the `azure_blob_storage_location.filename` property cis now optional ([#12414](https://github.com/hashicorp/terraform-provider-azurerm/issues/12414))\n* `azurerm_kusto_eventhub_data_connection` - `APACHEAVRO` can now be used as a `data_format` option ([#12480](https://github.com/hashicorp/terraform-provider-azurerm/issues/12480))\n* `azurerm_site_recovery_replicated_vm ` - Fix potential crash in reading `managed_disk` properties ([#12509](https://github.com/hashicorp/terraform-provider-azurerm/issues/12509))\n* `azurerm_storage_account` - `account_replication_type` can now be updated ([#12479](https://github.com/hashicorp/terraform-provider-azurerm/issues/12479))\n* `azurerm_storage_management_policy` - fix crash in read of properties ([#12487](https://github.com/hashicorp/terraform-provider-azurerm/issues/12487))\n* `azurerm_storage_share_directory` now allows underscore in property `name` [[#12454](https://github.com/hashicorp/terraform-provider-azurerm/issues/12454)] \n* `azurerm_security_center_subscription_pricing` - removed Owner permission note from documentation ([#12481](https://github.com/hashicorp/terraform-provider-azurerm/issues/12481))\n\nDEPRECATIONS:\n\n* `azurerm_postgresql_flexible_server` - the `cmk_enabled` property has been deprecated as it has been removed from the API ([#12405](https://github.com/hashicorp/terraform-provider-azurerm/issues/12405))\n* `azurerm_virtual_machine_configuration_policy_assignment` - has been deprecated and renamed to `azurerm_policy_virtual_machine_configuration_assignment` ([#12497](https://github.com/hashicorp/terraform-provider-azurerm/issues/12497))\n\n## 2.66.0 (July 02, 2021)\n\nFEATURES:\n\n* **New Resource** `azurerm_api_management_api_operation_tag` ([#12384](https://github.com/hashicorp/terraform-provider-azurerm/issues/12384))\n* **New Resource** `azurerm_data_factory_linked_custom_service` ([#12224](https://github.com/hashicorp/terraform-provider-azurerm/issues/12224))\n* **New Resource** `azurerm_data_factory_trigger_blob_event` ([#12330](https://github.com/hashicorp/terraform-provider-azurerm/issues/12330))\n* **New Resource** `azurerm_express_route_connection` ([#11320](https://github.com/hashicorp/terraform-provider-azurerm/issues/11320))\n* **New Resource** `azurerm_express_route_circuit_connection` ([#11303](https://github.com/hashicorp/terraform-provider-azurerm/issues/11303))\n* **New Resource** `azurerm_management_group_policy_assignment` ([#12349](https://github.com/hashicorp/terraform-provider-azurerm/issues/12349))\n* **New Resource** `azurerm_resource_group_policy_assignment` ([#12349](https://github.com/hashicorp/terraform-provider-azurerm/issues/12349))\n* **New Resource** `azurerm_resource_policy_assignment` ([#12349](https://github.com/hashicorp/terraform-provider-azurerm/issues/12349))\n* **New Resource** `azurerm_subscription_policy_assignment` ([#12349](https://github.com/hashicorp/terraform-provider-azurerm/issues/12349))\n* **New resource** `azurerm_tenant_configuration` ([#11697](https://github.com/hashicorp/terraform-provider-azurerm/issues/11697))\n* Cognitive Service now supports purging soft delete accounts ([#12281](https://github.com/hashicorp/terraform-provider-azurerm/issues/12281))\n\nENHANCEMENTS:\n\n* dependencies: updating `cognitive` to use API Version `2021-03-01` ([#12281](https://github.com/hashicorp/terraform-provider-azurerm/issues/12281))\n* dependencies: updating `trafficmanager` to use API Version `2018-08-01` ([#12400](https://github.com/hashicorp/terraform-provider-azurerm/issues/12400))\n* `azurerm_api_management_backend` - support for the `client_certificate_id` property  ([#12402](https://github.com/hashicorp/terraform-provider-azurerm/issues/12402))\n* `azurerm_api_management_api` - support for the `revision_description`, `version_description`, and `source_api_id` properties ([#12266](https://github.com/hashicorp/terraform-provider-azurerm/issues/12266))\n* `azurerm_batch_account` - support for the `public_network_access_enabled` property ([#12401](https://github.com/hashicorp/terraform-provider-azurerm/issues/12401))\n* `azurerm_eventgrid_event_subscription` - support for additional advanced filters `string_not_begins_with`, `string_not_ends_with`, `string_not_contains`, `is_not_null`, `is_null_or_undefined`, `number_in_range` and `number_not_in_range` ([#12167](https://github.com/hashicorp/terraform-provider-azurerm/issues/12167))\n* `azurerm_eventgrid_system_topic_event_subscription` - support for additional advanced filters `string_not_begins_with`, `string_not_ends_with`, `string_not_contains`, `is_not_null`, `is_null_or_undefined`, `number_in_range` and `number_not_in_range` ([#12167](https://github.com/hashicorp/terraform-provider-azurerm/issues/12167))\n* `azurerm_kubernetes_cluster` - support for the `fips_enabled`, `kubelet_disk_type`, and `license` properties ([#11835](https://github.com/hashicorp/terraform-provider-azurerm/issues/11835))\n* `azurerm_kubernetes_cluster_node_pool` - support for the `fips_enabled`, and `kubelet_disk_type` properties ([#11835](https://github.com/hashicorp/terraform-provider-azurerm/issues/11835))\n* `azurerm_lighthouse_definition` - support for the `plan` block ([#12360](https://github.com/hashicorp/terraform-provider-azurerm/issues/12360))\n* `azurerm_site_recovery_replicated_vm` - Add support for `target_disk_encryption_set_id` in `managed_disk` ([#12374](https://github.com/hashicorp/terraform-provider-azurerm/issues/12374))\n* `azurerm_traffic_manager_endpoint` - supports for the `minimum_required_child_endpoints_ipv4` and `minimum_required_child_endpoints_ipv6` ([#12400](https://github.com/hashicorp/terraform-provider-azurerm/issues/12400))\n\nBUG FIXES:\n\n* `azurerm_app_service` - fix app_setting and SCM setting ordering ([#12280](https://github.com/hashicorp/terraform-provider-azurerm/issues/12280))\n* `azurerm_hdinsight_kafka_cluster` - will no longer panic from an empty `component_version` property ([#12261](https://github.com/hashicorp/terraform-provider-azurerm/issues/12261))\n* `azurerm_spatial_anchors_account` - the `tags` property can now be updated without creating a new resource ([#11985](https://github.com/hashicorp/terraform-provider-azurerm/issues/11985))\n* **Data Source** `azurerm_app_service_environment_v3` - fix id processing for Read ([#12436](https://github.com/hashicorp/terraform-provider-azurerm/issues/12436))\n\n\n## 2.65.0 (June 25, 2021)\n\nFEATURES:\n\n* **New Resource** `azurerm_data_protection_backup_instance_postgresql` ([#12220](https://github.com/hashicorp/terraform-provider-azurerm/issues/12220))\n* **New Resource** `azurerm_hpc_cache_blob_nfs_target` ([#11671](https://github.com/hashicorp/terraform-provider-azurerm/issues/11671))\n* **New Resource** `azurerm_nat_gateway_public_ip_prefix_association` ([#12353](https://github.com/hashicorp/terraform-provider-azurerm/issues/12353))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v2.6.1` of `github.com/hashicorp/terraform-plugin-sdk` ([#12209](https://github.com/hashicorp/terraform-provider-azurerm/issues/12209))\n* dependencies: upgrading to `v55.3.0` of `github.com/Azure/azure-sdk-for-go` ([#12263](https://github.com/hashicorp/terraform-provider-azurerm/issues/12263))\n* dependencies: updating to `v0.11.19` of `github.com/Azure/go-autorest/autorest` ([#12209](https://github.com/hashicorp/terraform-provider-azurerm/issues/12209))\n* dependencies: updating to `v0.9.14` of `github.com/Azure/go-autorest/autorest/adal` ([#12209](https://github.com/hashicorp/terraform-provider-azurerm/issues/12209))\n* dependencies: updating the embedded SDK for Eventhub Namespaces to use API Version `2021-01-01-preview` ([#12290](https://github.com/hashicorp/terraform-provider-azurerm/issues/12290))\n* `azurerm_express_route_circuit_peering` - support for the `bandwidth_in_gbps` and `express_route_port_id` properties ([#12289](https://github.com/hashicorp/terraform-provider-azurerm/issues/12289))\n* `azurerm_kusto_iothub_data_connection` - support for the `data_format`, `mapping_rule_name` and `table_name` properties ([#12293](https://github.com/hashicorp/terraform-provider-azurerm/issues/12293))\n* `azurerm_linux_virtual_machine` - updating `proximity_placement_group_id` will no longer create a new resource ([#11790](https://github.com/hashicorp/terraform-provider-azurerm/issues/11790))\n* `azurerm_security_center_assessment_metadata` - support for the `categories` property ([#12278](https://github.com/hashicorp/terraform-provider-azurerm/issues/12278))\n* `azurerm_windows_virtual_machine` - updating `proximity_placement_group_id` will no longer create a new resource ([#11790](https://github.com/hashicorp/terraform-provider-azurerm/issues/11790))\n\nBUG FIXES:\n\n* `azurerm_data_factory` - fix a bug where the `name` property was stored with the wrong casing ([#12128](https://github.com/hashicorp/terraform-provider-azurerm/issues/12128))\n\n## 2.64.0 (June 18, 2021)\n\nFEATURES:\n\n* **New Data Source** `azurerm_key_vault_secrets` ([#12147](https://github.com/hashicorp/terraform-provider-azurerm/issues/12147))\n* **New Resource** `azurerm_api_management_redis_cache` ([#12174](https://github.com/hashicorp/terraform-provider-azurerm/issues/12174))\n* **New Resource** `azurerm_data_factory_linked_service_odata` ([#11556](https://github.com/hashicorp/terraform-provider-azurerm/issues/11556))\n* **New Resource** `azurerm_data_protection_backup_policy_postgresql` ([#12072](https://github.com/hashicorp/terraform-provider-azurerm/issues/12072))\n* **New Resource** `azurerm_machine_learning_compute_cluster` ([#11675](https://github.com/hashicorp/terraform-provider-azurerm/issues/11675))\n* **New Resource** `azurerm_eventhub_namespace_customer_managed_key` ([#12159](https://github.com/hashicorp/terraform-provider-azurerm/issues/12159))\n* **New Resource** `azurerm_virtual_desktop_application` ([#12077](https://github.com/hashicorp/terraform-provider-azurerm/issues/12077))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v55.2.0` of `github.com/Azure/azure-sdk-for-go` ([#12153](https://github.com/hashicorp/terraform-provider-azurerm/issues/12153))\n* dependencies: updating `synapse` to use API Version `2021-03-01` ([#12183](https://github.com/hashicorp/terraform-provider-azurerm/issues/12183))\n* `azurerm_api_management` - support for the `client_certificate_enabled`, `gateway_disabled`, `min_api_version`, and `zones` properties ([#12125](https://github.com/hashicorp/terraform-provider-azurerm/issues/12125))\n* `azurerm_api_management_api_schema` - prevent plan not empty after apply for json definitions  ([#12039](https://github.com/hashicorp/terraform-provider-azurerm/issues/12039))\n* `azurerm_application_gateway` - correctly populate the `identity` block ([#12226](https://github.com/hashicorp/terraform-provider-azurerm/issues/12226))\n* `azurerm_container_registry` - support for the `zone_redundancy_enabled` field ([#11706](https://github.com/hashicorp/terraform-provider-azurerm/issues/11706))\n* `azurerm_cosmosdb_sql_container` - support for the `spatial_index` block ([#11625](https://github.com/hashicorp/terraform-provider-azurerm/issues/11625))\n* `azurerm_cosmos_gremlin_graph` - support for the `spatial_index` property ([#12176](https://github.com/hashicorp/terraform-provider-azurerm/issues/12176))\n* `azurerm_data_factory` - support for `global_parameter` ([#12178](https://github.com/hashicorp/terraform-provider-azurerm/issues/12178))\n* `azurerm_kubernetes_cluster` - support for the `kubelet_config` and `linux_os_config` blocks ([#11119](https://github.com/hashicorp/terraform-provider-azurerm/issues/11119))\n* `azurerm_monitor_metric_alert` - support the `StartsWith` dimension operator ([#12181](https://github.com/hashicorp/terraform-provider-azurerm/issues/12181))\n* `azurerm_private_link_service`  - changing `load_balancer_frontend_ip_configuration_ids` list no longer creates a new resource ([#12250](https://github.com/hashicorp/terraform-provider-azurerm/issues/12250))\n* `azurerm_stream_analytics_job` - supports for the `identity` block ([#12171](https://github.com/hashicorp/terraform-provider-azurerm/issues/12171))\n* `azurerm_storage_account` - support for the `share_properties` block ([#12103](https://github.com/hashicorp/terraform-provider-azurerm/issues/12103))\n* `azurerm_synapse_workspace` - support for the `data_exfiltration_protection_enabled` property ([#12183](https://github.com/hashicorp/terraform-provider-azurerm/issues/12183))\n* `azurerm_synapse_role_assignment` - support for scopes and new role types ([#11690](https://github.com/hashicorp/terraform-provider-azurerm/issues/11690))\n\nBUG FIXES:\n\n* `azurerm_synapse_role_assignment` - support new roles and scopes ([#11690](https://github.com/hashicorp/terraform-provider-azurerm/issues/11690))\n* `azurerm_lb` - fix zone behaviour bug introduced in recent API upgrade ([#12208](https://github.com/hashicorp/terraform-provider-azurerm/issues/12208))\n\n## 2.63.0 (June 11, 2021)\n\nFEATURES:\n\n* **New Resource** `azurerm_data_factory_linked_service_azure_search` ([#12122](https://github.com/hashicorp/terraform-provider-azurerm/issues/12122))\n* **New Resource** `azurerm_data_factory_linked_service_kusto` ([#12152](https://github.com/hashicorp/terraform-provider-azurerm/issues/12152))\n\nENHANCEMENTS:\n\n* dependencies: updating `streamanalytics` to use API Version `2020-03-01-preview` ([#12133](https://github.com/hashicorp/terraform-provider-azurerm/issues/12133))\n* dependencies: updating `virtualdesktop` to use API Version `2020-11-02-preview` ([#12160](https://github.com/hashicorp/terraform-provider-azurerm/issues/12160))\n* `data.azurerm_synapse_workspace` - support for the `identity` attribute ([#12098](https://github.com/hashicorp/terraform-provider-azurerm/issues/12098))\n* `azurerm_cosmosdb_gremlin_graph` - support for the `composite_index` and `partition_key_version` properties ([#11693](https://github.com/hashicorp/terraform-provider-azurerm/issues/11693))\n* `azurerm_data_factory_dataset_azure_blob` - support for the `dynamic_filename_enabled` and `dynamic_path_enabled` properties ([#12034](https://github.com/hashicorp/terraform-provider-azurerm/issues/12034))\n* `azurerm_data_factory_dataset_delimited_text` - supports the `azure_blob_fs_location` property ([#12041](https://github.com/hashicorp/terraform-provider-azurerm/issues/12041))\n* `azurerm_data_factory_linked_service_azure_sql_database` - support for the `key_vault_connection_string` property ([#12139](https://github.com/hashicorp/terraform-provider-azurerm/issues/12139))\n* `azurerm_data_factory_linked_service_sql_server` - add `key_vault_connection_string` argument ([#12117](https://github.com/hashicorp/terraform-provider-azurerm/issues/12117))\n* `azurerm_data_factory_linked_service_data_lake_storage_gen2` - supports for the `storage_account_key` property ([#12136](https://github.com/hashicorp/terraform-provider-azurerm/issues/12136))\n* `azurerm_eventhub` - support for the `status` property ([#12043](https://github.com/hashicorp/terraform-provider-azurerm/issues/12043))\n* `azurerm_kubernetes_cluster` - support migration of `service_principal` to `identity` ([#12049](https://github.com/hashicorp/terraform-provider-azurerm/issues/12049))\n* `azurerm_kubernetes_cluster` -support for BYO `kubelet_identity` ([#12037](https://github.com/hashicorp/terraform-provider-azurerm/issues/12037))\n* `azurerm_kusto_cluster_customer_managed_key` - supports for the `user_identity` property ([#12135](https://github.com/hashicorp/terraform-provider-azurerm/issues/12135))\n* `azurerm_network_watcher_flow_log` - support for the `location` and `tags` properties ([#11670](https://github.com/hashicorp/terraform-provider-azurerm/issues/11670))\n* `azurerm_storage_account` - support for user assigned identities ([#11752](https://github.com/hashicorp/terraform-provider-azurerm/issues/11752))\n* `azurerm_storage_account_customer_managed_key` - support the use of keys from key vaults in remote subscription ([#12142](https://github.com/hashicorp/terraform-provider-azurerm/issues/12142))\n* `azurerm_virtual_desktop_host_pool` - support for the `start_vm_on_connect` property ([#12160](https://github.com/hashicorp/terraform-provider-azurerm/issues/12160))\n* `azurerm_vpn_server_configuration` - now supports multiple `auth` blocks ([#12085](https://github.com/hashicorp/terraform-provider-azurerm/issues/12085))\n\nBUG FIXES:\n\n* Service: App Configuration - Fixed a bug in tags on resources all being set to the same value ([#12062](https://github.com/hashicorp/terraform-provider-azurerm/issues/12062))\n* Service: Event Hubs - Fixed a bug in tags on resources all being set to the same value ([#12062](https://github.com/hashicorp/terraform-provider-azurerm/issues/12062))\n* `azurerm_subscription` - fix ability to specify `DevTest` as `workload` ([#12066](https://github.com/hashicorp/terraform-provider-azurerm/issues/12066))\n* `azurerm_sentinel_alert_rule_scheduled` - the query frequency duration can noe be up to 14 days ([#12164](https://github.com/hashicorp/terraform-provider-azurerm/issues/12164))\n\n## 2.62.1 (June 08, 2021)\n\nBUG FIXES:\n\n* `azurerm_role_assignment` - use the correct ID when assigning roles to resources ([#12076](https://github.com/hashicorp/terraform-provider-azurerm/issues/12076))\n\n\n## 2.62.0 (June 04, 2021)\n\nFEATURES:\n\n* **New Resource** `azurerm_data_protection_backup_vault` ([#11955](https://github.com/hashicorp/terraform-provider-azurerm/issues/11955))\n* **New Resource** `azurerm_postgresql_flexible_server_firewall_rule` ([#11834](https://github.com/hashicorp/terraform-provider-azurerm/issues/11834))\n* **New Resource** `azurerm_vmware_express_route_authorization` ([#11812](https://github.com/hashicorp/terraform-provider-azurerm/issues/11812))\n* **New Resource** `azurerm_storage_object_replication_policy` ([#11744](https://github.com/hashicorp/terraform-provider-azurerm/issues/11744))\n\nENHANCEMENTS:\n\n* dependencies: updating `network` to use API Version `2020-11-01` ([#11627](https://github.com/hashicorp/terraform-provider-azurerm/issues/11627))\n* `azurerm_app_service_environment` - support for the `internal_ip_address`, `service_ip_address`, and `outbound_ip_addresses`properties ([#12026](https://github.com/hashicorp/terraform-provider-azurerm/issues/12026))\n* `azurerm_api_management_api_subscription` - support for the `api_id` property ([#12025](https://github.com/hashicorp/terraform-provider-azurerm/issues/12025))\n* `azurerm_container_registry` - support for  versionless encryption keys for ACR ([#11856](https://github.com/hashicorp/terraform-provider-azurerm/issues/11856))\n* `azurerm_kubernetes_cluster` -  support for `gateway_name` for Application Gateway add-on ([#11984](https://github.com/hashicorp/terraform-provider-azurerm/issues/11984))\n* `azurerm_kubernetes_cluster` - support update of `azure_rbac_enabled` ([#12029](https://github.com/hashicorp/terraform-provider-azurerm/issues/12029))\n* `azurerm_kubernetes_cluster` - support for `node_public_ip_prefix_id` ([#11635](https://github.com/hashicorp/terraform-provider-azurerm/issues/11635))\n* `azurerm_kubernetes_cluster_node_pool` - support for `node_public_ip_prefix_id` ([#11635](https://github.com/hashicorp/terraform-provider-azurerm/issues/11635))\n* `azurerm_machine_learning_inference_cluster` - support for the `ssl.leaf_domain_label` and `ssl.overwrite_existing_domain` properties ([#11830](https://github.com/hashicorp/terraform-provider-azurerm/issues/11830))\n* `azurerm_role_assignment` - support the `delegated_managed_identity_resource_id` property ([#11848](https://github.com/hashicorp/terraform-provider-azurerm/issues/11848))\n\nBUG FIXES:\n\n* `azurerm_postgres_server` - do no update `password` unless its changed ([#12008](https://github.com/hashicorp/terraform-provider-azurerm/issues/12008))\n* `azurerm_storage_account` - prevent `containerDeleteRetentionPolicy` and `lastAccessTimeTrackingPolicy` not supported in `AzureUSGovernment` errors ([#11960](https://github.com/hashicorp/terraform-provider-azurerm/issues/11960))\n\n## 2.61.0 (May 27, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_spatial_anchors_account` ([#11824](https://github.com/hashicorp/terraform-provider-azurerm/issues/11824))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v54.3.0` of `github.com/Azure/azure-sdk-for-go` ([#11813](https://github.com/hashicorp/terraform-provider-azurerm/issues/11813))\n* dependencies: updating `mixedreality` to use API Version `2021-01-01` ([#11824](https://github.com/hashicorp/terraform-provider-azurerm/issues/11824))\n* refactor: switching to use an embedded SDK for `appconfiguration` ([#11959](https://github.com/hashicorp/terraform-provider-azurerm/issues/11959))\n* refactor: switching to use an embedded SDK for `eventhub` ([#11973](https://github.com/hashicorp/terraform-provider-azurerm/issues/11973))\n* provider: support for the Virtual Machine `skip_shutdown_and_force_delete` feature ([#11216](https://github.com/hashicorp/terraform-provider-azurerm/issues/11216))\n* provider: support for the Virtual Machine Scale Set `force_delete` feature ([#11216](https://github.com/hashicorp/terraform-provider-azurerm/issues/11216))\n* provider: no longer auto register the Microsoft.DevSpaces RP ([#11822](https://github.com/hashicorp/terraform-provider-azurerm/issues/11822))\n* Data Source: `azurerm_key_vault_certificate_data` - support certificate bundles and add support for ECDSA keys ([#11974](https://github.com/hashicorp/terraform-provider-azurerm/issues/11974))\n* `azurerm_data_factory_linked_service_sftp` - support for hostkey related properties ([#11825](https://github.com/hashicorp/terraform-provider-azurerm/issues/11825))\n* `azurerm_spatial_anchors_account` - support for `account_domain` and `account_id` ([#11824](https://github.com/hashicorp/terraform-provider-azurerm/issues/11824))\n* `azurerm_static_site` - Add support for `tags` attribute ([#11849](https://github.com/hashicorp/terraform-provider-azurerm/issues/11849))\n* `azurerm_storage_account` - `private_link_access` supports more values ([#11957](https://github.com/hashicorp/terraform-provider-azurerm/issues/11957))\n* `azurerm_storage_account_network_rules`: `private_link_access` supports more values ([#11957](https://github.com/hashicorp/terraform-provider-azurerm/issues/11957))\n* `azurerm_synapse_spark_pool` - `spark_version` now supports `3.0` ([#11972](https://github.com/hashicorp/terraform-provider-azurerm/issues/11972))\n\nBUG FIXES:\n\n* `azurerm_cdn_endpoint` - do not send an empty `origin_host_header` to the api ([#11852](https://github.com/hashicorp/terraform-provider-azurerm/issues/11852))\n* `azurerm_linux_virtual_machine_scale_set`: changing the `disable_automatic_rollback` and `enable_automatic_os_upgrade` properties no longer created a new resource ([#11723](https://github.com/hashicorp/terraform-provider-azurerm/issues/11723))\n* `azurerm_storage_share`: Fix ID for `resource_manager_id` ([#11828](https://github.com/hashicorp/terraform-provider-azurerm/issues/11828))\n* `azurerm_windows_virtual_machine_scale_set`: changing the `disable_automatic_rollback` and `enable_automatic_os_upgrade` properties no longer created a new resource ([#11723](https://github.com/hashicorp/terraform-provider-azurerm/issues/11723))\n\n## 2.60.0 (May 20, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_eventhub_cluster` ([#11763](https://github.com/hashicorp/terraform-provider-azurerm/issues/11763))\n* **New Data Source:** `azurerm_redis_enterprise_database` ([#11734](https://github.com/hashicorp/terraform-provider-azurerm/issues/11734))\n* **New Resource:** `azurerm_static_site` ([#7150](https://github.com/hashicorp/terraform-provider-azurerm/issues/7150))\n* **New Resource:** `azurerm_machine_learning_inference_cluster` ([#11550](https://github.com/hashicorp/terraform-provider-azurerm/issues/11550))\n\nENHANCEMENTS:\n\n* dependencies: updating `aks` to use API Version `2021-03-01` ([#11708](https://github.com/hashicorp/terraform-provider-azurerm/issues/11708))\n* dependencies: updating `eventgrid` to use API Version `2020-10-15-preview` ([#11746](https://github.com/hashicorp/terraform-provider-azurerm/issues/11746))\n* `azurerm_cosmosdb_mongo_collection` - support for the `analytical_storage_ttl` property ([#11735](https://github.com/hashicorp/terraform-provider-azurerm/issues/11735))\n* `azurerm_cosmosdb_cassandra_table` - support for the `analytical_storage_ttl` property ([#11755](https://github.com/hashicorp/terraform-provider-azurerm/issues/11755))\n* `azurerm_healthcare_service` - support for the `public_network_access_enabled` property ([#11736](https://github.com/hashicorp/terraform-provider-azurerm/issues/11736))\n* `azurerm_hdinsight_kafka_cluster` - support for the `encryption_in_transit_enabled` property ([#11737](https://github.com/hashicorp/terraform-provider-azurerm/issues/11737))\n* `azurerm_media_services_account` - support for the `key_delivery_access_control` block ([#11726](https://github.com/hashicorp/terraform-provider-azurerm/issues/11726))\n* `azurerm_monitor_activity_log_alert` - support for `Security` event type for Azure Service Health alerts ([#11802](https://github.com/hashicorp/terraform-provider-azurerm/issues/11802))\n* `azurerm_netapp_volume` - support for the `security_style` property - ([#11684](https://github.com/hashicorp/terraform-provider-azurerm/issues/11684))\n* `azurerm_redis_cache` - suppot for the `replicas_per_master` peoperty ([#11714](https://github.com/hashicorp/terraform-provider-azurerm/issues/11714))\n* `azurerm_spring_cloud_service` - support for the `required_network_traffic_rules` block ([#11633](https://github.com/hashicorp/terraform-provider-azurerm/issues/11633))\n* `azurerm_storage_account_management_policy` - the `name` property can now contain `-` ([#11792](https://github.com/hashicorp/terraform-provider-azurerm/issues/11792))\n\nBUG FIXES:\n\n* `azurerm_frontdoor` - added a check for `nil` to avoid panic on destroy ([#11720](https://github.com/hashicorp/terraform-provider-azurerm/issues/11720))\n* `azurerm_linux_virtual_machine_scale_set` - the `extension` blocks are now a set ([#11425](https://github.com/hashicorp/terraform-provider-azurerm/issues/11425))\n* `azurerm_virtual_network_gateway_connection` - fix a bug where `shared_key` was not being updated ([#11742](https://github.com/hashicorp/terraform-provider-azurerm/issues/11742))\n* `azurerm_windows_virtual_machine_scale_set` - the `extension` blocks are now a set ([#11425](https://github.com/hashicorp/terraform-provider-azurerm/issues/11425))\n* `azurerm_windows_virtual_machine_scale_set` - changing the `license_type` will no longer create a new resource ([#11731](https://github.com/hashicorp/terraform-provider-azurerm/issues/11731))\n\n## 2.59.0 (May 14, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_consumption_budget_resource_group` ([#9201](https://github.com/hashicorp/terraform-provider-azurerm/issues/9201))\n* **New Resource:** `azurerm_consumption_budget_subscription` ([#9201](https://github.com/hashicorp/terraform-provider-azurerm/issues/9201))\n* **New Resource:** `azurerm_monitor_aad_diagnostic_setting` ([#11660](https://github.com/hashicorp/terraform-provider-azurerm/issues/11660))\n* **New Resource:** `azurerm_sentinel_alert_rule_machine_learning_behavior_analytics` ([#11552](https://github.com/hashicorp/terraform-provider-azurerm/issues/11552))\n* **New Resource:** `azurerm_servicebus_namespace_disaster_recovery_config` ([#11638](https://github.com/hashicorp/terraform-provider-azurerm/issues/11638))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v54.4.0` of `github.com/Azure/azure-sdk-for-go` ([#11593](https://github.com/hashicorp/terraform-provider-azurerm/issues/11593))\n* dependencies: updating `databox` to API version `2020-12-01` ([#11626](https://github.com/hashicorp/terraform-provider-azurerm/issues/11626))\n* dependencies: updating `maps` to API version `2021-02-01` ([#11676](https://github.com/hashicorp/terraform-provider-azurerm/issues/11676))\n* Data Source: `azurerm_kubernetes_cluster` - Add `ingress_application_gateway_identity` export for add-on `ingress_application_gateway` ([#11622](https://github.com/hashicorp/terraform-provider-azurerm/issues/11622))\n* `azurerm_cosmosdb_account` - support for the `identity` and `cors_rule` blocks ([#11653](https://github.com/hashicorp/terraform-provider-azurerm/issues/11653))\n* `azurerm_cosmosdb_account` - support for the `backup` property ([#11597](https://github.com/hashicorp/terraform-provider-azurerm/issues/11597))\n* `azurerm_cosmosdb_sql_container` - support for the `analytical_storage_ttl` property ([#11655](https://github.com/hashicorp/terraform-provider-azurerm/issues/11655))\n* `azurerm_container_registry` - support for the `identity` and `encryption` blocks ([#11661](https://github.com/hashicorp/terraform-provider-azurerm/issues/11661))\n* `azurerm_frontdoor_custom_https_configuration` - Add support for resource import. ([#11642](https://github.com/hashicorp/terraform-provider-azurerm/issues/11642))\n* `azurerm_kubernetes_cluster` - export the `ingress_application_gateway_identity` attribute for the `ingress_application_gateway` add-on ([#11622](https://github.com/hashicorp/terraform-provider-azurerm/issues/11622))\n* `azurerm_managed_disk` - support for the `tier` property ([#11634](https://github.com/hashicorp/terraform-provider-azurerm/issues/11634))\n* `azurerm_storage_account` - support for the `azure_files_identity_based_authentication` and `routing_preference` blocks ([#11485](https://github.com/hashicorp/terraform-provider-azurerm/issues/11485))\n* `azurerm_storage_account` - support for the `private_link_access` property ([#11629](https://github.com/hashicorp/terraform-provider-azurerm/issues/11629))\n* `azurerm_storage_account` - support for the `change_feed_enabled` property ([#11695](https://github.com/hashicorp/terraform-provider-azurerm/issues/11695))\n\nBUG FIXES\n\n* Data Source: `azurerm_container_registry_token` - updating the validation for the `name` field ([#11607](https://github.com/hashicorp/terraform-provider-azurerm/issues/11607))\n* `azurerm_bastion_host` - updating the `ip_configuration` block properties now forces a new resource ([#11700](https://github.com/hashicorp/terraform-provider-azurerm/issues/11700))\n* `azurerm_container_registry_token` - updating the validation for the `name` field ([#11607](https://github.com/hashicorp/terraform-provider-azurerm/issues/11607))\n* `azurerm_mssql_database` - wil now correctly import the `creation_source_database_id` property for Secondary databases ([#11703](https://github.com/hashicorp/terraform-provider-azurerm/issues/11703))\n* `azurerm_storage_account` - allow empty/blank values for the `allowed_headers` and `exposed_headers` properties ([#11692](https://github.com/hashicorp/terraform-provider-azurerm/issues/11692))\n\n## 2.58.0 (May 07, 2021)\n\nUPGRADE NOTES\n\n* `azurerm_frontdoor` - The `custom_https_provisioning_enabled` field and the `custom_https_configuration` block have been deprecated and has been removed as they are no longer supported. ([#11456](https://github.com/hashicorp/terraform-provider-azurerm/issues/11456))\n* `azurerm_frontdoor_custom_https_configuration` - The `resource_group_name` has been deprecated and has been removed as it is no longer supported. ([#11456](https://github.com/hashicorp/terraform-provider-azurerm/issues/11456))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_storage_table_entity` ([#11562](https://github.com/hashicorp/terraform-provider-azurerm/issues/11562))\n* **New Resource:** `azurerm_app_service_environment_v3` ([#11174](https://github.com/hashicorp/terraform-provider-azurerm/issues/11174))\n* **New Resource:** `azurerm_cosmosdb_notebook_workspace` ([#11536](https://github.com/hashicorp/terraform-provider-azurerm/issues/11536))\n* **New Resource:** `azurerm_cosmosdb_sql_trigger` ([#11535](https://github.com/hashicorp/terraform-provider-azurerm/issues/11535))\n* **New Resource:** `azurerm_cosmosdb_sql_user_defined_function` ([#11537](https://github.com/hashicorp/terraform-provider-azurerm/issues/11537))\n* **New Resource:** `azurerm_iot_time_series_insights_event_source_iothub` ([#11484](https://github.com/hashicorp/terraform-provider-azurerm/issues/11484))\n* **New Resource:** `azurerm_storage_blob_inventory_policy` ([#11533](https://github.com/hashicorp/terraform-provider-azurerm/issues/11533))\n\nENHANCEMENTS:\n\n* dependencies: updating `network-db` to API version `2020-07-01` ([#10767](https://github.com/hashicorp/terraform-provider-azurerm/issues/10767))\n* `azurerm_cosmosdb_account` - support for the `access_key_metadata_writes_enabled`, `mongo_server_version`, and `network_acl_bypass` properties ([#11486](https://github.com/hashicorp/terraform-provider-azurerm/issues/11486))\n* `azurerm_data_factory` - support for the `customer_managed_key_id` property ([#10502](https://github.com/hashicorp/terraform-provider-azurerm/issues/10502))\n* `azurerm_data_factory_pipeline` - support for the `folder` property ([#11575](https://github.com/hashicorp/terraform-provider-azurerm/issues/11575))\n* `azurerm_frontdoor` - Fix for Frontdoor resource elements being returned out of order. ([#11456](https://github.com/hashicorp/terraform-provider-azurerm/issues/11456))\n* `azurerm_hdinsight_*_cluster` - support for autoscale  #8104 ([#11547](https://github.com/hashicorp/terraform-provider-azurerm/issues/11547))\n* `azurerm_network_security_rule` - support for the protocols `Ah` and `Esp` ([#11581](https://github.com/hashicorp/terraform-provider-azurerm/issues/11581))\n* `azurerm_network_connection_monitor` - support for the `coverage_level`, `excluded_ip_addresses`, `included_ip_addresses`, `target_resource_id`, and `resource_type` propeties ([#11540](https://github.com/hashicorp/terraform-provider-azurerm/issues/11540))\n\n## 2.57.0 (April 30, 2021)\n\nUPGRADE NOTES\n\n* `azurerm_api_management_authorization_server` - due to a bug in the `2020-12-01` version of the API Management API, changes to `resource_owner_username` and `resource_owner_password` in Azure will not be noticed by Terraform ([#11146](https://github.com/hashicorp/terraform-provider-azurerm/issues/11146))\n* `azurerm_cosmosdb_account` - the `2021-02-01` version of Azure Cosmos DB for MongoDB defaults new MongoDB accounts to `v3.6` rather then `v3.2` ([#10926](https://github.com/hashicorp/terraform-provider-azurerm/issues/10926))\n* `azurerm_cosmosdb_mongo_collection` - the `_id` index is now required by the new API/MongoDB version ([#10926](https://github.com/hashicorp/terraform-provider-azurerm/issues/10926))\n* `azurerm_cosmosdb_gremlin_graph` and `azurerm_cosmosdb_sql_container` - the `patition_key_path` property is now required ([#10926](https://github.com/hashicorp/terraform-provider-azurerm/issues/10926))\n\nFEATURES:\n\n* **Data Source:** `azurerm_container_registry_scope_map`  ([#11350](https://github.com/hashicorp/terraform-provider-azurerm/issues/11350))\n* **Data Source:** `azurerm_container_registry_token`  ([#11350](https://github.com/hashicorp/terraform-provider-azurerm/issues/11350))\n* **Data Source:** `azurerm_postgresql_flexible_server` ([#11081](https://github.com/hashicorp/terraform-provider-azurerm/issues/11081))\n* **Data Source:** `azurerm_key_vault_managed_hardware_security_module` ([#10873](https://github.com/hashicorp/terraform-provider-azurerm/issues/10873))\n* **New Resource:** `azurerm_container_registry_scope_map`  ([#11350](https://github.com/hashicorp/terraform-provider-azurerm/issues/11350))\n* **New Resource:** `azurerm_container_registry_token`  ([#11350](https://github.com/hashicorp/terraform-provider-azurerm/issues/11350))\n* **New Resource:** `azurerm_data_factory_dataset_snowflake `  ([#11116](https://github.com/hashicorp/terraform-provider-azurerm/issues/11116))\n* **New Resource:** `azurerm_healthbot` ([#11002](https://github.com/hashicorp/terraform-provider-azurerm/issues/11002))\n* **New Resource:** `azurerm_key_vault_managed_hardware_security_module `  ([#10873](https://github.com/hashicorp/terraform-provider-azurerm/issues/10873))\n* **New Resource:** `azurerm_media_asset_filter` ([#11110](https://github.com/hashicorp/terraform-provider-azurerm/issues/11110))\n* **New Resource:** `azurerm_mssql_job_agent` ([#11248](https://github.com/hashicorp/terraform-provider-azurerm/issues/11248))\n* **New Resource:** `azurerm_mssql_job_credential` ([#11363](https://github.com/hashicorp/terraform-provider-azurerm/issues/11363))\n* **New Resource:** `azurerm_mssql_transparent_data_encryption` ([#11148](https://github.com/hashicorp/terraform-provider-azurerm/issues/11148))\n* **New Resource:** `azurerm_postgresql_flexible_server` ([#11081](https://github.com/hashicorp/terraform-provider-azurerm/issues/11081))\n* **New Resource:** `azurerm_spring_cloud_app_cosmosdb_association` ([#11307](https://github.com/hashicorp/terraform-provider-azurerm/issues/11307))\n* **New Resource:** `azurerm_sentinel_data_connector_microsoft_defender_advanced_threat_protection` ([#10669](https://github.com/hashicorp/terraform-provider-azurerm/issues/10669))\n* **New Resource:** `azurerm_virtual_machine_configuration_policy_assignment` ([#11334](https://github.com/hashicorp/terraform-provider-azurerm/issues/11334))\n* **New Resource:** `azurerm_vmware_cluster` ([#10848](https://github.com/hashicorp/terraform-provider-azurerm/issues/10848))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v53.4.0` of `github.com/Azure/azure-sdk-for-go` ([#11439](https://github.com/hashicorp/terraform-provider-azurerm/issues/11439))\n* dependencies: updating to `v1.17.2` of `github.com/hashicorp/terraform-plugin-sdk` ([#11431](https://github.com/hashicorp/terraform-provider-azurerm/issues/11431))\n* dependencies: updating `cosmos-db` to API version `2021-02-01` ([#10926](https://github.com/hashicorp/terraform-provider-azurerm/issues/10926))\n* dependencies: updating `keyvault` to API version `v7.1` ([#10926](https://github.com/hashicorp/terraform-provider-azurerm/issues/10926))\n* Data Source: `azurerm_healthcare_service` - export the `cosmosdb_key_vault_key_versionless_id` attribute ([#11481](https://github.com/hashicorp/terraform-provider-azurerm/issues/11481))\n* Data Source: `azurerm_key_vault_certificate` - export the `curve` attribute in the `key_properties` block ([#10867](https://github.com/hashicorp/terraform-provider-azurerm/issues/10867))\n* Data Source: `azurerm_virtual_machine_scale_set` - now exports the `network_interfaces` ([#10585](https://github.com/hashicorp/terraform-provider-azurerm/issues/10585))\n* `azurerm_app_service` - support for the `site_config.ip_restrictions.headers` and  `site_config.scm_ip_restrictions.headers` properties ([#11209](https://github.com/hashicorp/terraform-provider-azurerm/issues/11209))\n* `azurerm_app_service_slot` - support for the `site_config.ip_restrictions.headers` and  `site_config.scm_ip_restrictions.headers` properties ([#11209](https://github.com/hashicorp/terraform-provider-azurerm/issues/11209))\n* `azurerm_backup_policy_file_share` - support for the `retention_weekly`, `retention_monthly`, and `retention_yearly` blocks ([#10733](https://github.com/hashicorp/terraform-provider-azurerm/issues/10733))\n* `azurerm_cosmosdb_sql_container` - support for the `conflict_resolution_policy` block ([#11517](https://github.com/hashicorp/terraform-provider-azurerm/issues/11517))\n* `azurerm_container_group` - support for the `exposed_port` block ([#10491](https://github.com/hashicorp/terraform-provider-azurerm/issues/10491))\n* `azurerm_container_registry` - deprecating the `georeplication_locations` property in favour of the `georeplications` property [#11200](https://github.com/hashicorp/terraform-provider-azurerm/issues/11200)]\n* `azurerm_database_migration` - switching to using an ID Formatter ([#11378](https://github.com/hashicorp/terraform-provider-azurerm/issues/11378))\n* `azurerm_database_migration_project` - switching to using an ID Formatter ([#11378](https://github.com/hashicorp/terraform-provider-azurerm/issues/11378))\n* `azurerm_databricks_workspace` - switching to using an ID Formatter ([#11378](https://github.com/hashicorp/terraform-provider-azurerm/issues/11378))\n* `azurerm_databricks_workspace` - fixes propagation of tags to connected resources ([#11405](https://github.com/hashicorp/terraform-provider-azurerm/issues/11405))\n* `azurerm_data_factory_linked_service_azure_file_storage` - support for the `key_vault_password` property ([#11436](https://github.com/hashicorp/terraform-provider-azurerm/issues/11436))\n* `azurerm_dedicated_host_group` - support for the `automatic_placement_enabled` property ([#11428](https://github.com/hashicorp/terraform-provider-azurerm/issues/11428))\n* `azurerm_frontdoor` - sync `MaxItems` on various attributes to match azure docs ([#11421](https://github.com/hashicorp/terraform-provider-azurerm/issues/11421))\n* `azurerm_frontdoor_custom_https_configuration` - removing secret version validation when using azure key vault as the certificate source ([#11310](https://github.com/hashicorp/terraform-provider-azurerm/issues/11310))\n* `azurerm_function_app` - support for the `site_config.ip_restrictions.headers` and  `site_config.scm_ip_restrictions.headers` properties ([#11209](https://github.com/hashicorp/terraform-provider-azurerm/issues/11209))\n* `azurerm_function_app` - support the `java_version` property ([#10495](https://github.com/hashicorp/terraform-provider-azurerm/issues/10495))\n* `azurerm_hdinsight_interactive_query_cluster` - add support for private link endpoint ([#11300](https://github.com/hashicorp/terraform-provider-azurerm/issues/11300))\n* `azurerm_hdinsight_hadoop_cluster` - add support for private link endpoint ([#11300](https://github.com/hashicorp/terraform-provider-azurerm/issues/11300))\n* `azurerm_hdinsight_spark_cluster` - add support for private link endpoint ([#11300](https://github.com/hashicorp/terraform-provider-azurerm/issues/11300))\n* `azurerm_healthcare_service` - support for the `cosmosdb_key_vault_key_versionless_id` property ([#11481](https://github.com/hashicorp/terraform-provider-azurerm/issues/11481))\n* `azurerm_kubernetes_cluster` - support for the `ingress_application_gateway` addon ([#11376](https://github.com/hashicorp/terraform-provider-azurerm/issues/11376))\n* `azurerm_kubernetes_cluster` - support for the `azure_rbac_enabled` property ([#10441](https://github.com/hashicorp/terraform-provider-azurerm/issues/10441))\n* `azurerm_hpc_cache` - support for the `directory_active_directory`, `directory_flat_file`, and `directory_ldap` blocks ([#11332](https://github.com/hashicorp/terraform-provider-azurerm/issues/11332))\n* `azurerm_key_vault_certificate` - support additional values for the `key_size` property in the `key_properties` block ([#10867](https://github.com/hashicorp/terraform-provider-azurerm/issues/10867))\n* `azurerm_key_vault_certificate` - support the `curve` property in the `key_properties` block ([#10867](https://github.com/hashicorp/terraform-provider-azurerm/issues/10867))\n* `azurerm_key_vault_certificate` - the `key_size` property in the `key_properties` block is now optional ([#10867](https://github.com/hashicorp/terraform-provider-azurerm/issues/10867))\n* `azurerm_kubernetes_cluster` - support for the `dns_prefix_private_cluster` property ([#11321](https://github.com/hashicorp/terraform-provider-azurerm/issues/11321))\n* `azurerm_kubernetes_cluster` - support for the `max_node_provisioning_time`, `max_unready_percentage`, and `max_unready_nodes` properties ([#11406](https://github.com/hashicorp/terraform-provider-azurerm/issues/11406))\n* `azurerm_storage_encryption_scope` - support for the `infrastructure_encryption_required` property ([#11462](https://github.com/hashicorp/terraform-provider-azurerm/issues/11462))\n* `azurerm_kubernetes_cluster` support for the `empty_bulk_delete_max` in the `auto_scaler_profile` block #([#11060](https://github.com/hashicorp/terraform-provider-azurerm/issues/11060))\n* `azurerm_lighthouse_definition` - support for the `delegated_role_definition_ids` property ([#11269](https://github.com/hashicorp/terraform-provider-azurerm/issues/11269))\n* `azurerm_managed_application` - support for the `parameter_values` property ([#8632](https://github.com/hashicorp/terraform-provider-azurerm/issues/8632))\n* `azurerm_managed_disk` - support for the `network_access_policy` and `disk_access_id` properties ([#9862](https://github.com/hashicorp/terraform-provider-azurerm/issues/9862))\n* `azurerm_postgresql_server` - wait for replica restarts when needed ([#11458](https://github.com/hashicorp/terraform-provider-azurerm/issues/11458))\n* `azurerm_redis_enterprise_cluster` - support for the `minimum_tls_version` and `hostname` properties ([#11203](https://github.com/hashicorp/terraform-provider-azurerm/issues/11203))\n* `azurerm_storage_account` -  support for the `versioning_enabled`, `default_service_version`, and `last_access_time_enabled` properties within the `blob_properties` block ([#11301](https://github.com/hashicorp/terraform-provider-azurerm/issues/11301))\n* `azurerm_storage_account` - support for the `nfsv3_enabled` property ([#11387](https://github.com/hashicorp/terraform-provider-azurerm/issues/11387))\n* `azurerm_storage_management_policy` - support for the `version` block ([#11163](https://github.com/hashicorp/terraform-provider-azurerm/issues/11163))\n* `azurerm_synapse_workspace` - support for the `customer_managed_key_versionless_id` property ([#11328](https://github.com/hashicorp/terraform-provider-azurerm/issues/11328))\n\nBUG FIXES:\n\n* `azurerm_api_management` - will no longer panic with an empty `hostname_configuration` ([#11426](https://github.com/hashicorp/terraform-provider-azurerm/issues/11426))\n* `azurerm_api_management_diagnostic` - fix a crash with the `frontend_request`, `frontend_response`, `backend_request`, `backend_response` blocks ([#11402](https://github.com/hashicorp/terraform-provider-azurerm/issues/11402))\n* `azurerm_eventgrid_system_topic` - remove strict validation on `topic_type` ([#11352](https://github.com/hashicorp/terraform-provider-azurerm/issues/11352))\n* `azurerm_iothub` - change `filter_rule` from TypeSet to TypeList to resolve an ordering issue ([#10341](https://github.com/hashicorp/terraform-provider-azurerm/issues/10341))\n* `azurerm_linux_virtual_machine_scale_set` - the default value for the `priority` property will no longer force a replacement of the resource ([#11362](https://github.com/hashicorp/terraform-provider-azurerm/issues/11362))\n* `azurerm_monitor_activity_log_alert` - fix a persistent diff for the `service_health` block ([#11383](https://github.com/hashicorp/terraform-provider-azurerm/issues/11383))\n* `azurerm_mssql_database ` - return an error when secondary database uses `max_size_gb` ([#11401](https://github.com/hashicorp/terraform-provider-azurerm/issues/11401))\n* `azurerm_mssql_database` - correctly import the `create_mode` property ([#11026](https://github.com/hashicorp/terraform-provider-azurerm/issues/11026))\n* `azurerm_netap_volume` - correctly set the `replication_frequency` attribute in the `data_protection_replication` block ([#11530](https://github.com/hashicorp/terraform-provider-azurerm/issues/11530))\n* `azurerm_postgresql_server` - ensure `public_network_access_enabled` is correctly set for replicas ([#11465](https://github.com/hashicorp/terraform-provider-azurerm/issues/11465))\n* `azurerm_postgresql_server` - can now correctly disable replication if required when `create_mode` is changed ([#11467](https://github.com/hashicorp/terraform-provider-azurerm/issues/11467))\n* `azurerm_virtual_network_gatewa` - updating the `custom_route` block no longer forces a new resource to be created [GH- 11433]\n\n## 2.56.0 (April 15, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_data_factory_linked_service_azure_databricks` ([#10962](https://github.com/hashicorp/terraform-provider-azurerm/issues/10962))\n* **New Resource:** `azurerm_data_lake_store_virtual_network_rule` ([#10430](https://github.com/hashicorp/terraform-provider-azurerm/issues/10430))\n* **New Resource:** `azurerm_media_live_event_output` ([#10917](https://github.com/hashicorp/terraform-provider-azurerm/issues/10917))\n* **New Resource:** `azurerm_spring_cloud_app_mysql_association` ([#11229](https://github.com/hashicorp/terraform-provider-azurerm/issues/11229))\n\nENHANCEMENTS:\n\n* dependencies: updating `github.com/Azure/azure-sdk-for-go` to `v53.0.0` ([#11302](https://github.com/hashicorp/terraform-provider-azurerm/issues/11302))\n* dependencies: updating `containerservice` to API version `2021-02-01` ([#10972](https://github.com/hashicorp/terraform-provider-azurerm/issues/10972))\n* `azurerm_app_service` - fix broken `ip_restrictions` and `scm_ip_restrictions` ([#11170](https://github.com/hashicorp/terraform-provider-azurerm/issues/11170))\n* `azurerm_application_gateway` - support for configuring `firewall_policy_id` within the `path_rule` block ([#11239](https://github.com/hashicorp/terraform-provider-azurerm/issues/11239))\n* `azurerm_firewall_policy_rule_collection_group` - allow `*` for the `network_rule_collection.destination_ports` property ([#11326](https://github.com/hashicorp/terraform-provider-azurerm/issues/11326))\n* `azurerm_function_app` - fix broken `ip_restrictions` and `scm_ip_restrictions` ([#11170](https://github.com/hashicorp/terraform-provider-azurerm/issues/11170))\n* `azurerm_data_factory_linked_service_sql_database` - support managed identity and service principal auth and add the `keyvault_password` property ([#10735](https://github.com/hashicorp/terraform-provider-azurerm/issues/10735))\n* `azurerm_hpc_cache` - support for `tags` ([#11268](https://github.com/hashicorp/terraform-provider-azurerm/issues/11268))\n* `azurerm_linux_virtual_machine_scale_set` - Support health extension for rolling ugrade mode ([#9136](https://github.com/hashicorp/terraform-provider-azurerm/issues/9136))\n* `azurerm_monitor_activity_log_alert` - support for `service_health` ([#10978](https://github.com/hashicorp/terraform-provider-azurerm/issues/10978))\n* `azurerm_mssql_database` - support for the `geo_backup_enabled` property ([#11177](https://github.com/hashicorp/terraform-provider-azurerm/issues/11177))\n* `azurerm_public_ip` - support for `ip_tags` ([#11270](https://github.com/hashicorp/terraform-provider-azurerm/issues/11270))\n* `azurerm_windows_virtual_machine_scale_set` - Support health extension for rolling ugrade mode ([#9136](https://github.com/hashicorp/terraform-provider-azurerm/issues/9136))\n\nBUG FIXES:\n\n* `azurerm_app_service_slot` - fix crash bug when given empty `http_logs` ([#11267](https://github.com/hashicorp/terraform-provider-azurerm/issues/11267))\n\n## 2.55.0 (April 08, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_api_management_email_template` ([#10914](https://github.com/hashicorp/terraform-provider-azurerm/issues/10914))\n* **New Resource:** `azurerm_communication_service` ([#11066](https://github.com/hashicorp/terraform-provider-azurerm/issues/11066))\n* **New Resource:** `azurerm_express_route_port` ([#10074](https://github.com/hashicorp/terraform-provider-azurerm/issues/10074))\n* **New Resource:** `azurerm_spring_cloud_app_redis_association` ([#11154](https://github.com/hashicorp/terraform-provider-azurerm/issues/11154))\n\nENHANCEMENTS:\n\n* Data Source: `azurerm_user_assigned_identity` - exporting `tenant_id` ([#11253](https://github.com/hashicorp/terraform-provider-azurerm/issues/11253))\n* Data Source: `azurerm_function_app` - exporting `client_cert_mode` ([#11161](https://github.com/hashicorp/terraform-provider-azurerm/issues/11161))\n* `azurerm_eventgrid_data_connection` - support for the `table_name`, `mapping_rule_name`, and `data_format` properties ([#11157](https://github.com/hashicorp/terraform-provider-azurerm/issues/11157))\n* `azurerm_hpc_cache` - support for configuring `dns` ([#11236](https://github.com/hashicorp/terraform-provider-azurerm/issues/11236))\n* `azurerm_hpc_cache` - support for configuring `ntp_server` ([#11236](https://github.com/hashicorp/terraform-provider-azurerm/issues/11236))\n* `azurerm_hpc_cache_nfs_target` - support for the `access_policy_name` property ([#11186](https://github.com/hashicorp/terraform-provider-azurerm/issues/11186))\n* `azurerm_hpc_cache_nfs_target` - `usage_model` can now be set to `READ_HEAVY_CHECK_180`, `WRITE_WORKLOAD_CHECK_30`, `WRITE_WORKLOAD_CHECK_60` and `WRITE_WORKLOAD_CLOUDWS` ([#11247](https://github.com/hashicorp/terraform-provider-azurerm/issues/11247))\n* `azurerm_function_app` - support for configuring `client_cert_mode` ([#11161](https://github.com/hashicorp/terraform-provider-azurerm/issues/11161))\n* `azurerm_netapp_volume` - adding `root_access_enabled` to the `export_policy_rule` block ([#11105](https://github.com/hashicorp/terraform-provider-azurerm/issues/11105))\n* `azurerm_private_endpoint` - allows for an alias to specified ([#10779](https://github.com/hashicorp/terraform-provider-azurerm/issues/10779))\n* `azurerm_user_assigned_identity` - exporting `tenant_id` ([#11253](https://github.com/hashicorp/terraform-provider-azurerm/issues/11253))\n* `azurerm_web_application_firewall_policy` - `version` within the `managed_rule_set` block can now be set to (OWASP) `3.2` ([#11244](https://github.com/hashicorp/terraform-provider-azurerm/issues/11244))\n\nBUG FIXES:\n\n* Data Source: `azurerm_dns_zone` - fixing a bug where the Resource ID wouldn't contain the Resource Group name when looking this up ([#11221](https://github.com/hashicorp/terraform-provider-azurerm/issues/11221))\n* `azurerm_media_service_account` - `storage_authentication_type` correctly accepts both `ManagedIdentity` and `System` ([#11222](https://github.com/hashicorp/terraform-provider-azurerm/issues/11222))\n* `azurerm_web_application_firewall_policy` - `http_listener_ids` and `path_based_rule_ids` are now Computed only ([#11196](https://github.com/hashicorp/terraform-provider-azurerm/issues/11196))\n\n## 2.54.0 (April 02, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_hpc_cache_access_policy` ([#11083](https://github.com/hashicorp/terraform-provider-azurerm/issues/11083))\n* **New Resource:** `azurerm_management_group_subscription_association` ([#11069](https://github.com/hashicorp/terraform-provider-azurerm/issues/11069))\n* **New Resource:** `azurerm_media_live_event` ([#10724](https://github.com/hashicorp/terraform-provider-azurerm/issues/10724))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v52.6.0` of `github.com/Azure/azure-sdk-for-go` ([#11108](https://github.com/hashicorp/terraform-provider-azurerm/issues/11108))\n* dependencies: updating `storage` to API version `2021-01-01` ([#11094](https://github.com/hashicorp/terraform-provider-azurerm/issues/11094))\n* dependencies: updating `storagecache` (a.k.a `hpc`) to API version `2021-03-01` ([#11083](https://github.com/hashicorp/terraform-provider-azurerm/issues/11083))\n* `azurerm_application_gateway` - support for rewriting urls with the `url` block ([#10950](https://github.com/hashicorp/terraform-provider-azurerm/issues/10950))\n* `azurerm_cognitive_account` - Add support for `network_acls` ([#11164](https://github.com/hashicorp/terraform-provider-azurerm/issues/11164))\n* `azurerm_container_registry` - support for the `quarantine_policy_enabled` property ([#11011](https://github.com/hashicorp/terraform-provider-azurerm/issues/11011))\n* `azurerm_firewall` - support for the `private_ip_ranges` property [p[#10627](https://github.com/hashicorp/terraform-provider-azurerm/issues/10627)]\n* `azurerm_log_analytics_workspace` - Fix issue where -1 couldn't be specified for `daily_quota_gb` ([#11182](https://github.com/hashicorp/terraform-provider-azurerm/issues/11182))\n* `azurerm_spring_cloud_service` - supports for the `sample_rate` property ([#11106](https://github.com/hashicorp/terraform-provider-azurerm/issues/11106))\n* `azurerm_storage_account` - support for the `container_delete_retention_policy` property ([#11131](https://github.com/hashicorp/terraform-provider-azurerm/issues/11131))\n* `azurerm_virtual_desktop_host_pool` - support for the `custom_rdp_properties` property ([#11160](https://github.com/hashicorp/terraform-provider-azurerm/issues/11160))\n* `azurerm_web_application_firewall_policy` - support for the `http_listener_ids` and `path_based_rule_ids` properties ([#10860](https://github.com/hashicorp/terraform-provider-azurerm/issues/10860))\n\nBUG FIXES:\n\n* `azurerm_api_management` - the `certificate_password` property is now optional ([#11139](https://github.com/hashicorp/terraform-provider-azurerm/issues/11139))\n* `azurerm_data_factory_linked_service_azure_blob_storage` - correct managed identity implementation by implementing the `service_endpoint` property ([#10830](https://github.com/hashicorp/terraform-provider-azurerm/issues/10830))\n* `azurerm_machine_learning_workspace` - deprecate the `Enterprise` sku as it has been deprecated by Azure ([#11063](https://github.com/hashicorp/terraform-provider-azurerm/issues/11063))\n* `azurerm_machine_learning_workspace` - support container registries in other subscriptions ([#11065](https://github.com/hashicorp/terraform-provider-azurerm/issues/11065))\n* `azurerm_site_recovery_fabric` - Fixes error in checking for existing resource ([#11130](https://github.com/hashicorp/terraform-provider-azurerm/issues/11130))\n* `azurerm_spring_cloud_custom_domain` - `thumbprint` is required when specifying `certificate_name` ([#11145](https://github.com/hashicorp/terraform-provider-azurerm/issues/11145))\n* `azurerm_subscription` - fixes broken timeout on destroy ([#11124](https://github.com/hashicorp/terraform-provider-azurerm/issues/11124))\n\n## 2.53.0 (March 26, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_management_group_template_deployment` ([#10603](https://github.com/hashicorp/terraform-provider-azurerm/issues/10603))\n* **New Resource:** `azurerm_tenant_template_deployment` ([#10603](https://github.com/hashicorp/terraform-provider-azurerm/issues/10603))\n* **New Data Source:** `azurerm_template_spec_version` ([#10603](https://github.com/hashicorp/terraform-provider-azurerm/issues/10603))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v52.5.0` of `github.com/Azure/azure-sdk-for-go` ([#11015](https://github.com/hashicorp/terraform-provider-azurerm/issues/11015))\n* Data Source: `azurerm_key_vault_secret` - support for the `versionless_id` attribute ([#11091](https://github.com/hashicorp/terraform-provider-azurerm/issues/11091))\n* `azurerm_container_registry` - support for the `public_network_access_enabled` property ([#10969](https://github.com/hashicorp/terraform-provider-azurerm/issues/10969))\n* `azurerm_kusto_eventhub_data_connection` - support for the `event_system_properties` block ([#11006](https://github.com/hashicorp/terraform-provider-azurerm/issues/11006))\n* `azurerm_logic_app_trigger_recurrence` - Add support for `schedule`  ([#11055](https://github.com/hashicorp/terraform-provider-azurerm/issues/11055))\n* `azurerm_resource_group_template_deployment` - add support for `template_spec_version_id` property ([#10603](https://github.com/hashicorp/terraform-provider-azurerm/issues/10603))\n* `azurerm_role_definition` - the `permissions` block is now optional ([#9850](https://github.com/hashicorp/terraform-provider-azurerm/issues/9850))\n* `azurerm_subscription_template_deployment` - add support for `template_spec_version_id` property ([#10603](https://github.com/hashicorp/terraform-provider-azurerm/issues/10603))\n\n\nBUG FIXES:\n\n* `azurerm_frontdoor_custom_https_configuration` - fixing a crash during update ([#11046](https://github.com/hashicorp/terraform-provider-azurerm/issues/11046))\n* `azurerm_resource_group_template_deployment` - always sending `parameters_content` during an update ([#11001](https://github.com/hashicorp/terraform-provider-azurerm/issues/11001))\n* `azurerm_role_definition` - fixing crash when permissions are empty ([#9850](https://github.com/hashicorp/terraform-provider-azurerm/issues/9850))\n* `azurerm_subscription_template_deployment` - always sending `parameters_content` during an update ([#11001](https://github.com/hashicorp/terraform-provider-azurerm/issues/11001))\n* `azurerm_spring_cloud_app` - supports for the `tls_enabled` property ([#11064](https://github.com/hashicorp/terraform-provider-azurerm/issues/11064))\n\n## 2.52.0 (March 18, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_mssql_firewall_rule` ([#10954](https://github.com/hashicorp/terraform-provider-azurerm/issues/10954))\n* **New Resource:** `azurerm_mssql_virtual_network_rule` ([#10954](https://github.com/hashicorp/terraform-provider-azurerm/issues/10954))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v52.4.0` of `github.com/Azure/azure-sdk-for-go` ([#10982](https://github.com/hashicorp/terraform-provider-azurerm/issues/10982))\n* `azurerm_api_management_subscription` - making `user_id` property optional [[#10638](https://github.com/hashicorp/terraform-provider-azurerm/issues/10638)}\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_account_resource` - marking `connection_string` as sensitive ([#10942](https://github.com/hashicorp/terraform-provider-azurerm/issues/10942))\n*  `azurerm_eventhub_namespace_disaster_recovery_config` - deprecating the `alternate_name` property due to a service side API bug ([#11013](https://github.com/hashicorp/terraform-provider-azurerm/issues/11013))\n* `azurerm_local_network_gateway` - making the `address_space` property optional ([#10983](https://github.com/hashicorp/terraform-provider-azurerm/issues/10983))\n* `azurerm_management_group` - validation for `subscription_id` list property entries ([#10948](https://github.com/hashicorp/terraform-provider-azurerm/issues/10948))\n\n## 2.51.0 (March 12, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_purview_account` ([#10395](https://github.com/hashicorp/terraform-provider-azurerm/issues/10395))\n* **New Resource:** `azurerm_data_factory_dataset_parquet` ([#10852](https://github.com/hashicorp/terraform-provider-azurerm/issues/10852))\n* **New Resource:** `azurerm_security_center_server_vulnerability_assessment` ([#10030](https://github.com/hashicorp/terraform-provider-azurerm/issues/10030))\n* **New Resource:** `azurerm_security_center_assessment` ([#10694](https://github.com/hashicorp/terraform-provider-azurerm/issues/10694))\n* **New Resource:** `azurerm_security_center_assessment_policy` ([#10694](https://github.com/hashicorp/terraform-provider-azurerm/issues/10694))\n* **New Resource:** `azurerm_sentinel_data_connector_azure_advanced_threat_protection` ([#10666](https://github.com/hashicorp/terraform-provider-azurerm/issues/10666))\n* **New Resource:** `azurerm_sentinel_data_connector_azure_security_center` ([#10667](https://github.com/hashicorp/terraform-provider-azurerm/issues/10667))\n* **New Resource:** `azurerm_sentinel_data_connector_microsoft_cloud_app_security` ([#10668](https://github.com/hashicorp/terraform-provider-azurerm/issues/10668))\n\nENHANCEMENTS:\n\n* dependencies: updating to v52.3.0 of `github.com/Azure/azure-sdk-for-go` ([#10829](https://github.com/hashicorp/terraform-provider-azurerm/issues/10829))\n* `azurerm_role_assignment` - support enrollment ids in `scope` argument ([#10890](https://github.com/hashicorp/terraform-provider-azurerm/issues/10890))\n* `azurerm_kubernetes_cluster` - support `None` for the `private_dns_zone_id` property ([#10774](https://github.com/hashicorp/terraform-provider-azurerm/issues/10774))\n* `azurerm_kubernetes_cluster` - support for `expander` in the `auto_scaler_profile` block ([#10777](https://github.com/hashicorp/terraform-provider-azurerm/issues/10777))\n* `azurerm_linux_virtual_machine` - support for configuring `platform_fault_domain` ([#10803](https://github.com/hashicorp/terraform-provider-azurerm/issues/10803))\n* `azurerm_linux_virtual_machine_scale_set` - will no longer recreate the resource when `rolling_upgrade_policy` or `health_probe_id` is updated ([#10856](https://github.com/hashicorp/terraform-provider-azurerm/issues/10856))\n* `azurerm_netapp_volume` - support creating from a snapshot via the `create_from_snapshot_resource_id` property ([#10906](https://github.com/hashicorp/terraform-provider-azurerm/issues/10906))\n* `azurerm_role_assignment` - support for the `description`, `condition`, and `condition_version` ([#10804](https://github.com/hashicorp/terraform-provider-azurerm/issues/10804))\n* `azurerm_windows_virtual_machine` - support for configuring `platform_fault_domain` ([#10803](https://github.com/hashicorp/terraform-provider-azurerm/issues/10803))\n* `azurerm_windows_virtual_machine_scale_set` - will no longer recreate the resource when `rolling_upgrade_policy` or `health_probe_id` is updated ([#10856](https://github.com/hashicorp/terraform-provider-azurerm/issues/10856))\n\nBUG FIXES:\n\n* Data Source: `azurerm_function_app_host_keys` - retrying reading the keys to work around a broken API ([#10894](https://github.com/hashicorp/terraform-provider-azurerm/issues/10894))\n* Data Source: `azurerm_log_analytics_workspace` - ensure the `id` is returned with the correct casing ([#10892](https://github.com/hashicorp/terraform-provider-azurerm/issues/10892))\n* Data Source: `azurerm_monitor_action_group` - add support for `aad_auth` attribute ([#10876](https://github.com/hashicorp/terraform-provider-azurerm/issues/10876))\n* `azurerm_api_management_custom_domain` - prevent a perpetual diff ([#10636](https://github.com/hashicorp/terraform-provider-azurerm/issues/10636))\n* `azurerm_eventhub_consumer_group` - detecting as removed when deleted in Azure ([#10900](https://github.com/hashicorp/terraform-provider-azurerm/issues/10900))\n* `azurerm_key_vault_access_policy` - Fix destroy where permissions casing on service does not match config / state ([#10931](https://github.com/hashicorp/terraform-provider-azurerm/issues/10931))\n* `azurerm_key_vault_secret` - setting the value of the secret after recovering it ([#10920](https://github.com/hashicorp/terraform-provider-azurerm/issues/10920))\n* `azurerm_kusto_eventhub_data_connection` - make `table_name` and `data_format` optional ([#10913](https://github.com/hashicorp/terraform-provider-azurerm/issues/10913))\n* `azurerm_mssql_virtual_machine` - workaround for inconsistent API value for `log_backup_frequency_in_minutes` in the `manual_schedule` block ([#10899](https://github.com/hashicorp/terraform-provider-azurerm/issues/10899))\n* `azurerm_postgres_server` - support for replicaset scaling ([#10754](https://github.com/hashicorp/terraform-provider-azurerm/issues/10754))\n* `azurerm_postgresql_aad_administrator` - prevent invalid usernames for the `login` property ([#10757](https://github.com/hashicorp/terraform-provider-azurerm/issues/10757))\n\n## 2.50.0 (March 05, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_vmware_private_cloud` ([#9284](https://github.com/hashicorp/terraform-provider-azurerm/issues/9284))\n* **New Resource:** `azurerm_kusto_eventgrid_data_connection` ([#10712](https://github.com/hashicorp/terraform-provider-azurerm/issues/10712))\n* **New Resource:** `azurerm_sentinel_data_connector_aws_cloud_trail` ([#10664](https://github.com/hashicorp/terraform-provider-azurerm/issues/10664))\n* **New Resource:** `azurerm_sentinel_data_connector_azure_active_directory` ([#10665](https://github.com/hashicorp/terraform-provider-azurerm/issues/10665))\n* **New Resource:** `azurerm_sentinel_data_connector_office_365` ([#10671](https://github.com/hashicorp/terraform-provider-azurerm/issues/10671))\n* **New Resource:** `azurerm_sentinel_data_connector_threat_intelligence` ([#10670](https://github.com/hashicorp/terraform-provider-azurerm/issues/10670))\n* **New Resource:** `azurerm_subscription` ([#10718](https://github.com/hashicorp/terraform-provider-azurerm/issues/10718))\n* **New Resource:** `azurerm_vmware_private_cloud` ([#9284](https://github.com/hashicorp/terraform-provider-azurerm/issues/9284))\n\nENHANCEMENTS:\n* dependencies: updating to `v52.0.0` of `github.com/Azure/azure-sdk-for-go` ([#10787](https://github.com/hashicorp/terraform-provider-azurerm/issues/10787))\n* dependencies: updating `compute` to API version `2020-12-01` ([#10650](https://github.com/hashicorp/terraform-provider-azurerm/issues/10650))\n* Data Source: `azurerm_dns_zone` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_dns_a_record` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_dns_aaaa_record` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_dns_caa_record` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_dns_cname_record` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_dns_mx_record` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_dns_ns_record` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_dns_ptr_record` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_dns_srv_record` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_dns_txt_record` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_dns_zone` - updating to use a consistent Terraform Resource ID to avoid API issues ([#10786](https://github.com/hashicorp/terraform-provider-azurerm/issues/10786))\n* `azurerm_function_app_host_keys` - support for `event_grid_extension_config_key` ([#10823](https://github.com/hashicorp/terraform-provider-azurerm/issues/10823))\n* `azurerm_keyvault_secret` - support for the `versionless_id` property ([#10738](https://github.com/hashicorp/terraform-provider-azurerm/issues/10738))\n* `azurerm_kubernetes_cluster` - support `private_dns_zone_id` when using a `service_principal` ([#10737](https://github.com/hashicorp/terraform-provider-azurerm/issues/10737))\n* `azurerm_kusto_cluster` - supports for the `double_encryption_enabled` property ([#10264](https://github.com/hashicorp/terraform-provider-azurerm/issues/10264))\n* `azurerm_linux_virtual_machine` - support for configuring `license_type` ([#10776](https://github.com/hashicorp/terraform-provider-azurerm/issues/10776))\n* `azurerm_log_analytics_workspace_resource` - support permanent deletion of workspaces with the `permanently_delete_on_destroy` feature flag ([#10235](https://github.com/hashicorp/terraform-provider-azurerm/issues/10235))\n* `azurerm_monitor_action_group` - support for secure webhooks via the `aad_auth` block ([#10509](https://github.com/hashicorp/terraform-provider-azurerm/issues/10509))\n* `azurerm_mssql_database` - support for the `log_monitoring_enabled` property within the `extended_auditing_policy` block ([#10324](https://github.com/hashicorp/terraform-provider-azurerm/issues/10324))\n* `azurerm_mssql_database_extended_auditing_policy ` - support for the `log_monitoring_enabled` property ([#10324](https://github.com/hashicorp/terraform-provider-azurerm/issues/10324))\n* `azurerm_mssql_server` - support for the `log_monitoring_enabled` property within the `extended_auditing_policy` block ([#10324](https://github.com/hashicorp/terraform-provider-azurerm/issues/10324))\n* `azurerm_mssql_server_extended_auditing_policy ` - support for the `log_monitoring_enabled` property [[#10324](https://github.com/hashicorp/terraform-provider-azurerm/issues/10324)] \n* `azurerm_signalr_service` - support for the `upstream_endpoint` block ([#10459](https://github.com/hashicorp/terraform-provider-azurerm/issues/10459))\n* `azurerm_sql_server` - support for the `log_monitoring_enabled` property within the `extended_auditing_policy` block ([#10324](https://github.com/hashicorp/terraform-provider-azurerm/issues/10324))\n* `azurerm_sql_database` - support for the `log_monitoring_enabled` property within the `extended_auditing_policy` block ([#10324](https://github.com/hashicorp/terraform-provider-azurerm/issues/10324))\n* `azurerm_spring_cloud_java_deployment` - supporting delta updates ([#10729](https://github.com/hashicorp/terraform-provider-azurerm/issues/10729))\n* `azurerm_virtual_network_gateway` - deprecate `peering_address` in favour of `peering_addresses` ([#10381](https://github.com/hashicorp/terraform-provider-azurerm/issues/10381))\n\nBUG FIXES:\n\n* Data Source: `azurerm_netapp_volume` - fixing a crash when setting `data_protection_replication` ([#10795](https://github.com/hashicorp/terraform-provider-azurerm/issues/10795))\n* `azurerm_api_management` - changing the `sku_name` property no longer forces a new resouce to be created ([#10747](https://github.com/hashicorp/terraform-provider-azurerm/issues/10747))\n* `azurerm_api_management` - the field `tenant_access` can only be configured when not using a Consumption SKU ([#10766](https://github.com/hashicorp/terraform-provider-azurerm/issues/10766))\n* `azurerum_frontdoor` - removed the MaxItems validation from the Backend Pools ([#10828](https://github.com/hashicorp/terraform-provider-azurerm/issues/10828))\n* `azurerm_kubernetes_cluster_resource` - allow windows passwords as short as `8` charaters long ([#10816](https://github.com/hashicorp/terraform-provider-azurerm/issues/10816))\n* `azurerm_cosmosdb_mongo_collection` - ignore throughput if Azure Cosmos DB provisioned in 'serverless' capacity mode ([#10389](https://github.com/hashicorp/terraform-provider-azurerm/issues/10389))\n* `azurerm_linux_virtual_machine` - parsing the User Assigned Identity ID case-insensitively to work around an Azure API issue ([#10722](https://github.com/hashicorp/terraform-provider-azurerm/issues/10722))\n* `azurerm_linux_virtual_machine_scale_set` - parsing the User Assigned Identity ID case-insensitively to work around an Azure API issue ([#10722](https://github.com/hashicorp/terraform-provider-azurerm/issues/10722))\n* `azurerm_netapp_volume` - fixing a crash when setting `data_protection_replication` ([#10795](https://github.com/hashicorp/terraform-provider-azurerm/issues/10795))\n* `azurerm_virtual_machine` - parsing the User Assigned Identity ID case-insensitively to work around an Azure API issue ([#10722](https://github.com/hashicorp/terraform-provider-azurerm/issues/10722))\n* `azurerm_virtual_machine_scale_set` - parsing the User Assigned Identity ID case-insensitively to work around an Azure API issue ([#10722](https://github.com/hashicorp/terraform-provider-azurerm/issues/10722))\n* `azurerm_windows_virtual_machine` - parsing the User Assigned Identity ID case-insensitively to work around an Azure API issue ([#10722](https://github.com/hashicorp/terraform-provider-azurerm/issues/10722))\n* `azurerm_windows_virtual_machine_scale_set` - parsing the User Assigned Identity ID case-insensitively to work around an Azure API issue ([#10722](https://github.com/hashicorp/terraform-provider-azurerm/issues/10722))\n\n## 2.49.0 (February 26, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_spring_cloud_app` ([#10678](https://github.com/hashicorp/terraform-provider-azurerm/issues/10678))\n* **New Resource:** `azurerm_databox_edge_device` ([#10730](https://github.com/hashicorp/terraform-provider-azurerm/issues/10730))\n* **New Resource:** `azurerm_databox_edge_order` ([#10730](https://github.com/hashicorp/terraform-provider-azurerm/issues/10730))\n* **New Resource:** `azurerm_kusto_iothub_data_connection` ([#8626](https://github.com/hashicorp/terraform-provider-azurerm/issues/8626))\n* **New Resource:** `azurerm_redis_enterprise_cluster` ([#10706](https://github.com/hashicorp/terraform-provider-azurerm/issues/10706))\n* **New Resource:** `azurerm_redis_enterprise_database` ([#10706](https://github.com/hashicorp/terraform-provider-azurerm/issues/10706))\n* **New Resource:** `azurerm_security_center_assessment_metadata` ([#10124](https://github.com/hashicorp/terraform-provider-azurerm/issues/10124))\n* **New Resource:** `azurerm_spring_cloud_custom_domain` ([#10404](https://github.com/hashicorp/terraform-provider-azurerm/issues/10404))\n\nENHANCEMENTS:\n\n* dependencies: updating `github.com/hashicorp/terraform-plugin-sdk` to the latest `1.x` branch ([#10692](https://github.com/hashicorp/terraform-provider-azurerm/issues/10692))\n* dependencies: updating `github.com/hashicorp/go-azure-helpers` to `v0.14.0` ([#10740](https://github.com/hashicorp/terraform-provider-azurerm/issues/10740))\n* dependencies: updating `github.com/Azure/go-autorest/autorest` to `v0.11.18` ([#10740](https://github.com/hashicorp/terraform-provider-azurerm/issues/10740))\n* testing: updating the tests to use the Terraform release binaries when running acceptance tests ([#10523](https://github.com/hashicorp/terraform-provider-azurerm/issues/10523))\n* `azurerm_api_management` - support for the  `tenant_access` block ([#10475](https://github.com/hashicorp/terraform-provider-azurerm/issues/10475))\n* `azurerm_api_management_logger` - support for configuring a `resource_id` ([#10652](https://github.com/hashicorp/terraform-provider-azurerm/issues/10652))\n* `azurerm_data_factory_linked_service_azure_blob_storage` - now supports the `sas_uri` property ([#10551](https://github.com/hashicorp/terraform-provider-azurerm/issues/10551))\n* `azurerm_data_factory_linked_service_azure_blob_storage` - now supports Managed Identity and Service Principal authentication ([#10551](https://github.com/hashicorp/terraform-provider-azurerm/issues/10551))\n* `azurerm_monitor_smart_detector_alert_rule` - supports for the `tags` property ([#10646](https://github.com/hashicorp/terraform-provider-azurerm/issues/10646))\n* `azurerm_netapp_volume` - support for the `data_protection_replication` block ([#10610](https://github.com/hashicorp/terraform-provider-azurerm/issues/10610))\n* `azurerm_sentinel_alert_rule_ms_security_incident` - support `Microsoft Defender Advanced Threat Protection` and `Office 365 Advanced Threat Protection` values for the `product_filter` property ([#10725](https://github.com/hashicorp/terraform-provider-azurerm/issues/10725))\n* `azurerm_service_fabric_cluster` - Add support for the `upgrade policy` block ([#10713](https://github.com/hashicorp/terraform-provider-azurerm/issues/10713))\n\nBUG FIXES:\n\n* provider: fixing support for Azure Cloud Shell ([#10740](https://github.com/hashicorp/terraform-provider-azurerm/issues/10740))\n* provider: MSI authentication is explicitly unavailable in Azure App Service and Function Apps as these are intentionally not supported ([#10740](https://github.com/hashicorp/terraform-provider-azurerm/issues/10740))\n* provider: only showing the deprecation message if `skip_credentials_registration` is explicitly configured ([#10699](https://github.com/hashicorp/terraform-provider-azurerm/issues/10699))\n* `azurerm_batch_certificate` - allow empty `password` when format is pfx ([#10642](https://github.com/hashicorp/terraform-provider-azurerm/issues/10642))\n* `azurerm_data_factory_integration_runtime_azure_ssis` - the `administrator_login` and `administrator_password` properties are now optional ([#10474](https://github.com/hashicorp/terraform-provider-azurerm/issues/10474))\n* `azurerm_data_factory_integration_runtime_managed` - the `administrator_login` and `administrator_password` properties are now optional ([#10640](https://github.com/hashicorp/terraform-provider-azurerm/issues/10640))\n* `azurerm_eventhub_namespace` - the `capacity` property can now be greater than `50` ([#10734](https://github.com/hashicorp/terraform-provider-azurerm/issues/10734))\n* `azurerm_key_vault_certificate` - waiting for deletion to complete before purging ([#10577](https://github.com/hashicorp/terraform-provider-azurerm/issues/10577))\n* `azurerm_key_vault_key` - now waits for deletion to complete before purging ([#10577](https://github.com/hashicorp/terraform-provider-azurerm/issues/10577))\n* `azurerm_key_vault_secret` - now waits for deletion to complete before purging ([#10577](https://github.com/hashicorp/terraform-provider-azurerm/issues/10577))\n* `azurerm_kusto_cluster` - changing the `virtual_network_configuration` property forces a new resource to be created ([#10640](https://github.com/hashicorp/terraform-provider-azurerm/issues/10640))\n* `azurerm_lb_outbound_rule` - fixing a crash when `frontendIPConfigurations` is omitted in the API response ([#10696](https://github.com/hashicorp/terraform-provider-azurerm/issues/10696))\n* `azurerm_media_content_key_policy` - fix an encoding bug which prevented configuring `ask` in the `fairplay_configuration` block ([#10684](https://github.com/hashicorp/terraform-provider-azurerm/issues/10684))\n\n## 2.48.0 (February 18, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_application_gateway` ([#10268](https://github.com/hashicorp/terraform-provider-azurerm/issues/10268))\n\nENHANCEMENTS:\n\n* dependencies: updating to build using Go 1.16 which adds support for `darwin/arm64` (Apple Silicon) ([#10615](https://github.com/hashicorp/terraform-provider-azurerm/issues/10615))\n* dependencies: updating `github.com/Azure/azure-sdk-for-go` to `v51.2.0` ([#10561](https://github.com/hashicorp/terraform-provider-azurerm/issues/10561))\n* Data Source: `azurerm_bastion_host` - updating to use a Resource ID Formatter ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* Data Source: `azurerm_point_to_site_vpn_gateway` - updating to use a Resource ID Formatter ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* Data Source: `azurerm_kubernetes_cluster` - exposing the `upgrade_settings` block ([#10376](https://github.com/hashicorp/terraform-provider-azurerm/issues/10376))\n* Data Source: `azurerm_kubernetes_cluster_node_pool` - exposing the `upgrade_settings` block ([#10376](https://github.com/hashicorp/terraform-provider-azurerm/issues/10376))\n* Data Source: `azurerm_route` - pdating to use a Resource ID Formatter ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* Data Source: `azurerm_subnet ` - updating to use a Resource ID Formatter ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* Data Source: `azurerm_subscriptions` - adding the field `id` to the `subscriptions` block ([#10598](https://github.com/hashicorp/terraform-provider-azurerm/issues/10598))\n* Data Source: `azurerm_virtual_network` - updating to use a Resource ID Formatter ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* `azurerm_bastion_host` - updating to use a Resource ID Formatter ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* `azurerm_bastion_host` - support for enhanced import validation ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* `azurerm_kubernetes_cluster` - support for configuring the `upgrade_settings` block ([#10376](https://github.com/hashicorp/terraform-provider-azurerm/issues/10376))\n* `azurerm_kubernetes_cluster` - support for `automatic_channel_upgrade` ([#10530](https://github.com/hashicorp/terraform-provider-azurerm/issues/10530))\n* `azurerm_kubernetes_cluster` - support for `skip_nodes_with_local_storage` within the `auto_scaler_profile` block ([#10531](https://github.com/hashicorp/terraform-provider-azurerm/issues/10531))\n* `azurerm_kubernetes_cluster` - support for `skip_nodes_with_system_pods` within the `auto_scaler_profile` block ([#10531](https://github.com/hashicorp/terraform-provider-azurerm/issues/10531))\n* `azurerm_kubernetes_cluster_node_pool` - support for configuring the `upgrade_settings` block ([#10376](https://github.com/hashicorp/terraform-provider-azurerm/issues/10376))\n* `azurerm_lighthouse_definition` - add support for `principal_id_display_name` property ([#10613](https://github.com/hashicorp/terraform-provider-azurerm/issues/10613))\n* `azurerm_log_analytics_workspace` - Support for `capacity_reservation_level` property and `CapacityReservation` SKU ([#10612](https://github.com/hashicorp/terraform-provider-azurerm/issues/10612))\n* `azurerm_point_to_site_vpn_gateway` - updating to use a Resource ID Formatter ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* `azurerm_point_to_site_vpn_gateway` - support for enhanced import validation ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* `azurerm_route` - updating to use a Resource ID Formatter ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* `azurerm_route` - support for enhanced import validation ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* `azurerm_subnet` - updating to use a Resource ID Formatter ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* `azurerm_subnet` - support for enhanced import validation ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* `synapse_workspace_resource` - support for the `azure_devops_repo` and `github_repo` blocks ([#10157](https://github.com/hashicorp/terraform-provider-azurerm/issues/10157))\n* `azurerm_virtual_network` - updating to use a Resource ID Formatter ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n* `azurerm_virtual_network` - support for enhanced import validation ([#10570](https://github.com/hashicorp/terraform-provider-azurerm/issues/10570))\n\nBUG FIXES:\n\n* `azurerm_eventgrid_event_subscription` - change the number of possible `advanced_filter` items from `5` to `25` ([#10625](https://github.com/hashicorp/terraform-provider-azurerm/issues/10625))\n* `azurerm_key_vault` - normalizing the casing on the `certificate_permissions`, `key_permissions`, `secret_permissions` and `storage_permissions` fields within the `access_policy` block ([#10593](https://github.com/hashicorp/terraform-provider-azurerm/issues/10593))\n* `azurerm_key_vault_access_policy ` - normalizing the casing on the `certificate_permissions`, `key_permissions`, `secret_permissions` and `storage_permissions` fields ([#10593](https://github.com/hashicorp/terraform-provider-azurerm/issues/10593))\n* `azurerm_mariadb_firewall_rule` - correctly validate the `name` property ([#10579](https://github.com/hashicorp/terraform-provider-azurerm/issues/10579))\n* `azurerm_postgresql_server` - correctly change `ssl_minimal_tls_version_enforced` on update ([#10606](https://github.com/hashicorp/terraform-provider-azurerm/issues/10606))\n* `azurerm_private_endpoint` - only updating the associated Private DNS Zone Group when there's changes ([#10559](https://github.com/hashicorp/terraform-provider-azurerm/issues/10559))\n* `azurerm_resource_group_template_deployment` - fixing an issue where the API version for nested items couldn't be found during deletion ([#10565](https://github.com/hashicorp/terraform-provider-azurerm/issues/10565))\n\n## 2.47.0 (February 11, 2021)\n\nUPGRADE NOTES\n\n* `azurerm_frontdoor` & `azurerm_frontdoor_custom_https_configuration` - the new fields `backend_pool_health_probes`, `backend_pool_load_balancing_settings`, `backend_pools`, `frontend_endpoints`, `routing_rules` have been added to the `azurerm_frontdoor` resource, which are a map of name-ID references. An upcoming version of the Azure Provider will change the blocks `backend_pool`, `backend_pool_health_probe`, `backend_pool_load_balancing`, `frontend_endpoint` and `routing_rule` from a List to a Set to work around an ordering issue within the Azure API - as such you should update your Terraform Configuration to reference these new Maps, rather than the Lists directly, due to the upcoming breaking change. For example, changing `azurerm_frontdoor.example.frontend_endpoint[1].id` to `azurerm_frontdoor.example.frontend_endpoints[\"exampleFrontendEndpoint2\"]` ([#9357](https://github.com/hashicorp/terraform-provider-azurerm/issues/9357))\n* `azurerm_lb_backend_address_pool` - the field `backend_addresses` has been deprecated and is no longer functional - instead the `azurerm_lb_backend_address_pool_address` resource offers the same functionality. ([#10488](https://github.com/hashicorp/terraform-provider-azurerm/issues/10488))\n* `azurerm_linux_virtual_machine_scale_set` & `azurerm_windows_virtual_machine_scale_set` - the in-line `extension` block is now GA - the environment variable `ARM_PROVIDER_VMSS_EXTENSIONS_BETA` no longer has any effect and can be removed ([#10528](https://github.com/hashicorp/terraform-provider-azurerm/issues/10528))\n* `azurerm_data_factory_integration_runtime_managed` - this resource has been renamed/deprecated in favour of `azurerm_data_factory_integration_runtime_azure_ssis` ([#10236](https://github.com/hashicorp/terraform-provider-azurerm/issues/10236))\n* The provider-block field `skip_credentials_validation` is now deprecated since this was non-functional and will be removed in 3.0 of the Azure Provider ([#10464](https://github.com/hashicorp/terraform-provider-azurerm/issues/10464))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_key_vault_certificate_data` ([#8184](https://github.com/hashicorp/terraform-provider-azurerm/issues/8184))\n* **New Resource:** `azurerm_application_insights_smart_detection_rule` ([#10539](https://github.com/hashicorp/terraform-provider-azurerm/issues/10539))\n* **New Resource:** `azurerm_data_factory_integration_runtime_azure` ([#10236](https://github.com/hashicorp/terraform-provider-azurerm/issues/10236))\n* **New Resource:** `azurerm_data_factory_integration_runtime_azure_ssis` ([#10236](https://github.com/hashicorp/terraform-provider-azurerm/issues/10236))\n* **New Resource:** `azurerm_lb_backend_address_pool_address` ([#10488](https://github.com/hashicorp/terraform-provider-azurerm/issues/10488))\n\nENHANCEMENTS:\n\n* dependencies: updating `github.com/hashicorp/terraform-plugin-sdk` to `v1.16.0` ([#10521](https://github.com/hashicorp/terraform-provider-azurerm/issues/10521))\n* `azurerm_frontdoor` - added the new fields `backend_pool_health_probes`, `backend_pool_load_balancing_settings`, `backend_pools`, `frontend_endpoints`, `routing_rules` which are a map of name-ID references ([#9357](https://github.com/hashicorp/terraform-provider-azurerm/issues/9357))\n* `azurerm_kubernetes_cluster` - updating the validation for the `log_analytics_workspace_id` field within the `oms_agent` block within the `addon_profile` block ([#10520](https://github.com/hashicorp/terraform-provider-azurerm/issues/10520))\n* `azurerm_kubernetes_cluster` - support for configuring `only_critical_addons_enabled` ([#10307](https://github.com/hashicorp/terraform-provider-azurerm/issues/10307))\n* `azurerm_kubernetes_cluster` - support for configuring `private_dns_zone_id` ([#10201](https://github.com/hashicorp/terraform-provider-azurerm/issues/10201))\n* `azurerm_linux_virtual_machine_scale_set` - the `extension` block is now GA and available without enabling the beta ([#10528](https://github.com/hashicorp/terraform-provider-azurerm/issues/10528))\n* `azurerm_media_streaming_endpoint` - exporting the field `host_name` ([#10527](https://github.com/hashicorp/terraform-provider-azurerm/issues/10527))\n* `azurerm_mssql_virtual_machine` - support for `auto_backup` ([#10460](https://github.com/hashicorp/terraform-provider-azurerm/issues/10460))\n* `azurerm_windows_virtual_machine_scale_set` - the `extension` block is now GA and available without enabling the beta ([#10528](https://github.com/hashicorp/terraform-provider-azurerm/issues/10528))\n* `azurerm_site_recovery_replicated_vm` - support for the `recovery_public_ip_address_id` property and changing `target_static_ip` or `target_static_ip` force a new resource to be created ([#10446](https://github.com/hashicorp/terraform-provider-azurerm/issues/10446))\n\nBUG FIXES:\n\n* provider: the provider-block field `skip_credentials_validation` is now deprecated since this was non-functional. This will be removed in 3.0 of the Azure Provider ([#10464](https://github.com/hashicorp/terraform-provider-azurerm/issues/10464))\n* Data Source: `azurerm_shared_image_versions` - retrieving all versions of the image prior to filtering ([#10519](https://github.com/hashicorp/terraform-provider-azurerm/issues/10519))\n* `azurerm_app_service` - the `ip_restriction.x.ip_address` propertynow accepts anything other than an empty string ([#10440](https://github.com/hashicorp/terraform-provider-azurerm/issues/10440))\n* `azurerm_cosmosdb_account` - validate the `key_vault_key_id` property is versionless ([#10420](https://github.com/hashicorp/terraform-provider-azurerm/issues/10420))\n* `azurerm_cosmosdb_account` - will no longer panic if the response is nil ([#10525](https://github.com/hashicorp/terraform-provider-azurerm/issues/10525))\n* `azurerm_eventhub_namespace` - correctly downgrade to the `Basic` sku ([#10536](https://github.com/hashicorp/terraform-provider-azurerm/issues/10536))\n* `azurerm_key_vault_key` - export the `versionless_id` attribute ([#10420](https://github.com/hashicorp/terraform-provider-azurerm/issues/10420))\n* `azurerm_lb_backend_address_pool` - the `backend_addresses` block is now deprecated and non-functional - use the `azurerm_lb_backend_address_pool_address` resource instead ([#10488](https://github.com/hashicorp/terraform-provider-azurerm/issues/10488))\n* `azurerm_linux_virtual_machine_scale_set` - fixing a bug when `protected_settings` within the `extension` block was an empty string ([#10528](https://github.com/hashicorp/terraform-provider-azurerm/issues/10528))\n* `azurerm_linux_virtual_machine_scale_set` - fixing a bug when `settings` within the `extension` block was an empty string ([#10528](https://github.com/hashicorp/terraform-provider-azurerm/issues/10528))\n* `azurerm_monitor_diagnostic_setting` - changing the `log_analytics_workspace_id` property no longer creates a new resource ([#10512](https://github.com/hashicorp/terraform-provider-azurerm/issues/10512))\n* `azurerm_storage_data_lake_gen2_filesystem` - do not set/retrieve ACLs when HNS is not enabled  ([#10470](https://github.com/hashicorp/terraform-provider-azurerm/issues/10470))\n* `azurerm_windows_virtual_machine_scale_set ` - fixing a bug when `protected_settings` within the `extension` block was an empty string ([#10528](https://github.com/hashicorp/terraform-provider-azurerm/issues/10528))\n* `azurerm_windows_virtual_machine_scale_set ` - fixing a bug when `settings` within the `extension` block was an empty string ([#10528](https://github.com/hashicorp/terraform-provider-azurerm/issues/10528))\n\n## 2.46.1 (February 05, 2021)\n\nBUG FIXES:\n\n* `azurerm_lb_backend_address_pool` - mark `backend_address` as computed ([#10481](https://github.com/hashicorp/terraform-provider-azurerm/issues/10481))\n\n## 2.46.0 (February 04, 2021)\n\nFEATURES:\n\n* **New Resource:** `azurerm_api_management_identity_provider_aadb2c` ([#10240](https://github.com/hashicorp/terraform-provider-azurerm/issues/10240))\n* **New Resource:** `azurerm_cosmosdb_cassandra_table` ([#10328](https://github.com/hashicorp/terraform-provider-azurerm/issues/10328))\n\nENHANCEMENTS:\n\n* dependencies: updating `recoveryservices` to API version `2018-07-10` ([#10373](https://github.com/hashicorp/terraform-provider-azurerm/issues/10373))\n* `azurerm_api_management_diagnostic` - support for the `always_log_errors`, `http_correlation_protocol`, `log_client_ip`, `sampling_percentage` and `verbosity` properties ([#10325](https://github.com/hashicorp/terraform-provider-azurerm/issues/10325))\n* `azurerm_api_management_diagnostic` - support for the `frontend_request`, `frontend_response`, `backend_request` and `backend_response` blocks ([#10325](https://github.com/hashicorp/terraform-provider-azurerm/issues/10325))\n* `azurerm_kubernetes_cluster` - support for configuring the field `enable_host_encryption` within the `default_node_pool` block ([#10398](https://github.com/hashicorp/terraform-provider-azurerm/issues/10398))\n* `azurerm_kubernetes_cluster` - added length validation to the `admin_password` field within the `windows_profile` block ([#10452](https://github.com/hashicorp/terraform-provider-azurerm/issues/10452))\n* `azurerm_kubernetes_cluster_node_pool` - support for `enable_host_encryption` ([#10398](https://github.com/hashicorp/terraform-provider-azurerm/issues/10398))\n* `azurerm_lb_backend_address_pool` - support for the `backend_address` block ([#10291](https://github.com/hashicorp/terraform-provider-azurerm/issues/10291))\n* `azurerm_redis_cache` - support for the `public_network_access_enabled` property ([#10410](https://github.com/hashicorp/terraform-provider-azurerm/issues/10410))\n* `azurerm_role_assignment` - adding validation for that the `scope` is either a Management Group, Subscription, Resource Group or Resource ID ([#10438](https://github.com/hashicorp/terraform-provider-azurerm/issues/10438))\n* `azurerm_service_fabric_cluster` - support for the `reverse_proxy_certificate_common_names` block ([#10367](https://github.com/hashicorp/terraform-provider-azurerm/issues/10367))\n* `azurerm_monitor_metric_alert` - support for the `skip_metric_validation` property ([#10422](https://github.com/hashicorp/terraform-provider-azurerm/issues/10422))\n\nBUG FIXES:\n\n* Data Source: `azurerm_api_management` fix an exception with User Assigned Managed Identities ([#10429](https://github.com/hashicorp/terraform-provider-azurerm/issues/10429))\n* `azurerm_api_management_api_diagnostic` - fix a bug where specifying `log_client_ip = false` would not disable the setting ([#10325](https://github.com/hashicorp/terraform-provider-azurerm/issues/10325))\n* `azurerm_key_vault` - fixing a race condition when setting the cache ([#10447](https://github.com/hashicorp/terraform-provider-azurerm/issues/10447))\n* `azurerm_key_vault_certificate` - fixing a race condition when setting the cache ([#10447](https://github.com/hashicorp/terraform-provider-azurerm/issues/10447))\n* `azurerm_key_vault_key` - fixing a race condition when setting the cache ([#10447](https://github.com/hashicorp/terraform-provider-azurerm/issues/10447))\n* `azurerm_key_vault_secret` - fixing a race condition when setting the cache ([#10447](https://github.com/hashicorp/terraform-provider-azurerm/issues/10447))\n* `azurerm_mssql_virtual_machine` - fixing a crash where the KeyVault was nil in the API response ([#10469](https://github.com/hashicorp/terraform-provider-azurerm/issues/10469))\n* `azurerm_storage_account_datasource` - prevent panics from passing in an empty `name` ([#10370](https://github.com/hashicorp/terraform-provider-azurerm/issues/10370))\n* `azurerm_storage_data_lake_gen2_filesystem` - change the `ace` property to a TypeSet to ensure consistent ordering ([#10372](https://github.com/hashicorp/terraform-provider-azurerm/issues/10372))\n* `azurerm_storage_data_lake_gen2_path` - change the `ace` property to a TypeSet to ensure consistent ordering ([#10372](https://github.com/hashicorp/terraform-provider-azurerm/issues/10372))\n\n## 2.45.1 (January 28, 2021)\n\nBUG FIXES:\n\n* `azurerm_app_service_environment` - prevent a panic when the API returns a nil cluster settings ([#10365](https://github.com/hashicorp/terraform-provider-azurerm/issues/10365))\n\n## 2.45.0 (January 28, 2021)\n\nFEATURES:\n\n* **New Data Source** `azurerm_search_service` ([#10181](https://github.com/hashicorp/terraform-provider-azurerm/issues/10181))\n* **New Resource:** `azurerm_data_factory_linked_service_snowflake` ([#10239](https://github.com/hashicorp/terraform-provider-azurerm/issues/10239))\n* **New Resource:** `azurerm_data_factory_linked_service_azure_table_storage` ([#10305](https://github.com/hashicorp/terraform-provider-azurerm/issues/10305))\n* **New Resource:** `azurerm_iothub_enrichment` ([#9239](https://github.com/hashicorp/terraform-provider-azurerm/issues/9239))\n* **New Resource:** `azurerm_iot_security_solution` ([#10034](https://github.com/hashicorp/terraform-provider-azurerm/issues/10034))\n* **New Resource:** `azurerm_media_streaming_policy` ([#10133](https://github.com/hashicorp/terraform-provider-azurerm/issues/10133))\n* **New Resource:** `azurerm_spring_cloud_active_deployment` ([#9959](https://github.com/hashicorp/terraform-provider-azurerm/issues/9959))\n* **New Resource:** `azurerm_spring_cloud_java_deployment` ([#9959](https://github.com/hashicorp/terraform-provider-azurerm/issues/9959))\n\nIMPROVEMENTS:\n\n* dependencies: updating to `v0.11.17` of `github.com/Azure/go-autorest/autorest` ([#10259](https://github.com/hashicorp/terraform-provider-azurerm/issues/10259))\n* dependencies: updating the `firewall` resources to use the Networking API `2020-07-01` ([#10252](https://github.com/hashicorp/terraform-provider-azurerm/issues/10252))\n* dependencies: updating the `load balancer` resources to use the Networking API version `2020-05-01` ([#10263](https://github.com/hashicorp/terraform-provider-azurerm/issues/10263))\n* Data Source: `azurerm_app_service_environment` - export the `cluster_setting` block ([#10303](https://github.com/hashicorp/terraform-provider-azurerm/issues/10303))\n* Data Source: `azurerm_key_vault_certificate` - support for the `certificate_data_base64` attribute ([#10275](https://github.com/hashicorp/terraform-provider-azurerm/issues/10275))\n* `azurerm_app_service` - support for the propety `number_of_workers` ([#10143](https://github.com/hashicorp/terraform-provider-azurerm/issues/10143))\n* `azurerm_app_service_environment` - support for the `cluster_setting` block ([#10303](https://github.com/hashicorp/terraform-provider-azurerm/issues/10303))\n* `azurerm_data_factory_dataset_delimited_text` - support for the `compression_codec` property ([#10182](https://github.com/hashicorp/terraform-provider-azurerm/issues/10182))\n* `azurerm_firewall_policy` - support for the `sku` property ([#10186](https://github.com/hashicorp/terraform-provider-azurerm/issues/10186))\n* `azurerm_iothub` - support for the `enrichment` property ([#9239](https://github.com/hashicorp/terraform-provider-azurerm/issues/9239))\n* `azurerm_key_vault` - optimised loading of and added caching when retrieving the Key Vault ([#10330](https://github.com/hashicorp/terraform-provider-azurerm/issues/10330))\n* `azurerm_key_vault` - support both ipv4 and cidr formats for the `network_acls.ip_rules` property ([#10266](https://github.com/hashicorp/terraform-provider-azurerm/issues/10266))\n* `azurerm_key_vault_certificate` - optimised loading of and added caching when retrieving the Key Vault ([#10330](https://github.com/hashicorp/terraform-provider-azurerm/issues/10330))\n* `azurerm_key_vault_key` - optimised loading of and added caching when retrieving the Key Vault ([#10330](https://github.com/hashicorp/terraform-provider-azurerm/issues/10330))\n* `azurerm_key_vault_secret` - optimised loading of and added caching when retrieving the Key Vault ([#10330](https://github.com/hashicorp/terraform-provider-azurerm/issues/10330))\n* `azurerm_key_vault_certificate` - support for the `certificate_data_base64` attribute ([#10275](https://github.com/hashicorp/terraform-provider-azurerm/issues/10275))\n* `azurerm_linux_virtual_machine` - skipping shutdown for a machine in a failed state ([#10189](https://github.com/hashicorp/terraform-provider-azurerm/issues/10189))\n* `azurerm_media_services_account` - support for setting the `storage_authentication_type` field to `System` ([#10133](https://github.com/hashicorp/terraform-provider-azurerm/issues/10133))\n* `azurerm_redis_cache` - support multiple availability zones ([#10283](https://github.com/hashicorp/terraform-provider-azurerm/issues/10283))\n* `azurerm_storage_data_lake_gen2_filesystem` - support for the `ace` block ([#9917](https://github.com/hashicorp/terraform-provider-azurerm/issues/9917))\n* `azurerm_servicebus_namespace` - will now allow a capacity of `16` for the `Premium` SKU ([#10337](https://github.com/hashicorp/terraform-provider-azurerm/issues/10337))\n* `azurerm_windows_virtual_machine` - skipping shutdown for a machine in a failed state ([#10189](https://github.com/hashicorp/terraform-provider-azurerm/issues/10189))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `extensions_time_budget` property ([#10298](https://github.com/hashicorp/terraform-provider-azurerm/issues/10298))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `extensions_time_budget` property ([#10298](https://github.com/hashicorp/terraform-provider-azurerm/issues/10298))\n\nBUG FIXES:\n\n* `azurerm_iot_time_series_insights_reference_data_set` - the field `data_string_comparison_behavior` is now `ForceNew` ([#10343](https://github.com/hashicorp/terraform-provider-azurerm/issues/10343))\n* `azurerm_iot_time_series_insights_reference_data_set` - the `key_property` block is now `ForceNew` ([#10343](https://github.com/hashicorp/terraform-provider-azurerm/issues/10343))\n* `azurerm_linux_virtual_machine_scale_set` - fixing an issue where `protected_settings` field within the `extension` block couldn't be empty ([#10351](https://github.com/hashicorp/terraform-provider-azurerm/issues/10351))\n* `azurerm_linux_virtual_machine_scale_set` - fixing an issue where `settings` field within the `extension` block couldn't be empty ([#10351](https://github.com/hashicorp/terraform-provider-azurerm/issues/10351))\n* `azurerm_media_streaming_endpoint` - stopping the streaming endpoint prior to deletion if the endpoint is in a running state ([#10216](https://github.com/hashicorp/terraform-provider-azurerm/issues/10216))\n* `azurerm_role_definition` - don't add `scope` to `assignable_scopes` unless none are specified ([#8624](https://github.com/hashicorp/terraform-provider-azurerm/issues/8624))\n* `azurerm_windows_virtual_machine_scale_set` - fixing an issue where `protected_settings` field within the `extension` block couldn't be empty ([#10351](https://github.com/hashicorp/terraform-provider-azurerm/issues/10351))\n* `azurerm_windows_virtual_machine_scale_set` - fixing an issue where `settings` field within the `extension` block couldn't be empty ([#10351](https://github.com/hashicorp/terraform-provider-azurerm/issues/10351))\n\n## 2.44.0 (January 21, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_iothub` ([#10228](https://github.com/hashicorp/terraform-provider-azurerm/issues/10228))\n* **New Resource:** `azurerm_media_content_key_policy` ([#9971](https://github.com/hashicorp/terraform-provider-azurerm/issues/9971))\n\nIMPROVEMENTS:\n\n* dependencies: updating `github.com/Azure/go-autorest` to `v0.11.16` ([#10164](https://github.com/hashicorp/terraform-provider-azurerm/issues/10164))\n* dependencies: updating `appconfiguration` to API version `2020-06-01` ([#10176](https://github.com/hashicorp/terraform-provider-azurerm/issues/10176))\n* dependencies: updating `appplatform` to API version `2020-07-01` ([#10175](https://github.com/hashicorp/terraform-provider-azurerm/issues/10175))\n* dependencies: updating `containerservice` to API version `2020-12-01` ([#10171](https://github.com/hashicorp/terraform-provider-azurerm/issues/10171))\n* dependencies: updating `msi` to API version `2018-11-30` ([#10174](https://github.com/hashicorp/terraform-provider-azurerm/issues/10174))\n* Data Source: `azurerm_kubernetes_cluster` - support for the field `user_assigned_identity_id` within the `identity` block ([#8737](https://github.com/hashicorp/terraform-provider-azurerm/issues/8737))\n* `azurerm_api_management` - support additional TLS ciphers within the `security` block ([#9276](https://github.com/hashicorp/terraform-provider-azurerm/issues/9276))\n* `azurerm_api_management_api_diagnostic` - support the `sampling_percentage` property ([#9321](https://github.com/hashicorp/terraform-provider-azurerm/issues/9321))\n* `azurerm_container_group` - support for updating `tags` ([#10210](https://github.com/hashicorp/terraform-provider-azurerm/issues/10210))\n* `azurerm_kubernetes_cluster` - the field `type` within the `identity` block can now be set to `UserAssigned` ([#8737](https://github.com/hashicorp/terraform-provider-azurerm/issues/8737))\n* `azurerm_kubernetes_cluster` - support for the field `new_pod_scale_up_delay` within the `auto_scaler_profile` block ([#9291](https://github.com/hashicorp/terraform-provider-azurerm/issues/9291))\n* `azurerm_kubernetes_cluster` - support for the field `user_assigned_identity_id` within the `identity` block ([#8737](https://github.com/hashicorp/terraform-provider-azurerm/issues/8737))\n* `azurerm_monitor_autoscale_setting` - now supports the `dimensions` property ([#9795](https://github.com/hashicorp/terraform-provider-azurerm/issues/9795))\n* `azurerm_sentinel_alert_rule_scheduled` - now supports the `event_grouping_setting` property ([#10078](https://github.com/hashicorp/terraform-provider-azurerm/issues/10078))\n\nBUG FIXES:\n\n* `azurerm_backup_protected_file_share` - updating to account for a breaking API change ([#9015](https://github.com/hashicorp/terraform-provider-azurerm/issues/9015))\n* `azurerm_key_vault_certificate` - fixing a crash when `subject` within the `certificate_policy` block was nil ([#10200](https://github.com/hashicorp/terraform-provider-azurerm/issues/10200))\n* `azurerm_user_assigned_identity` - adding a state migration to update the ID format ([#10196](https://github.com/hashicorp/terraform-provider-azurerm/issues/10196))\n\n## 2.43.0 (January 14, 2021)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_sentinel_alert_rule_template` ([#7020](https://github.com/hashicorp/terraform-provider-azurerm/issues/7020))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_api_management` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* Data Source: `azurerm_kubernetes_cluster` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* Data Source: `azurerm_virtual_machine` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* Data Source: `azurerm_virtual_machine_scale_set` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_api_management` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_app_service` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_app_service_slot` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_container_group` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_cosmosdb_account` - support for `analytical_storage_enabled property` ([#10055](https://github.com/hashicorp/terraform-provider-azurerm/issues/10055))\n* `azurerm_cosmosdb_gremlin_graph` - support the `default_ttl` property ([#10159](https://github.com/hashicorp/terraform-provider-azurerm/issues/10159))\n* `azurerm_data_factory` - support for `public_network_enabled` ([#9605](https://github.com/hashicorp/terraform-provider-azurerm/issues/9605))\n* `azurerm_data_factory_dataset_delimited_text` - support for the `compression_type` property ([#10070](https://github.com/hashicorp/terraform-provider-azurerm/issues/10070))\n* `azurerm_data_factory_linked_service_sql_server`: support for the `key_vault_password` block ([#10032](https://github.com/hashicorp/terraform-provider-azurerm/issues/10032))\n* `azurerm_eventgrid_domain` - support for the `public_network_access_enabled` and `inbound_ip_rule` properties  ([#9922](https://github.com/hashicorp/terraform-provider-azurerm/issues/9922))\n* `azurerm_eventgrid_topic` - support for the `public_network_access_enabled` and `inbound_ip_rule` properties  ([#9922](https://github.com/hashicorp/terraform-provider-azurerm/issues/9922))\n* `azurerm_eventhub_namespace` - support the `trusted_service_access_enabled` property ([#10169](https://github.com/hashicorp/terraform-provider-azurerm/issues/10169))\n* `azurerm_function_app` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_function_app_slot` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_kusto_cluster` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_linux_virtual_machine` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_linux_virtual_machine_scale_set` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_security_center_automation` - the field `event_source` within the `source` block now supports `SecureScoreControls ` and `SecureScores` ([#10126](https://github.com/hashicorp/terraform-provider-azurerm/issues/10126))\n* `azurerm_synapse_workspace` - support for the `sql_identity_control_enabled` property ([#10033](https://github.com/hashicorp/terraform-provider-azurerm/issues/10033))\n* `azurerm_virtual_machine` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_virtual_machine_scale_set` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_windows_virtual_machine` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_windows_virtual_machine_scale_set` - adding validation on the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n\nBUG FIXES:\n\n* Data Source: `azurerm_log_analytics_workspace` - returning the Resource ID in the correct casing ([#10162](https://github.com/hashicorp/terraform-provider-azurerm/issues/10162))\n* `azurerm_advanced_threat_protection` - fix a regression in the Resouce ID format ([#10190](https://github.com/hashicorp/terraform-provider-azurerm/issues/10190))\n* `azurerm_api_management` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_app_service` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_app_service_slot` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_application_gateway` - ensuring the casing on `identity_ids` within the `identity` block ([#10031](https://github.com/hashicorp/terraform-provider-azurerm/issues/10031))\n* `azurerm_blueprint_assignment` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_container_group` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_databricks_workspace` - changing the sku no longer always forces a new resource to be created ([#9541](https://github.com/hashicorp/terraform-provider-azurerm/issues/9541))\n* `azurerm_function_app` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_function_app_slot` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_kubernetes_cluster` - ensuring the casing of the `user_assigned_identity_id` field within the `kubelet_identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_kusto_cluster` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_linux_virtual_machine` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_linux_virtual_machine_scale_set` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_monitor_diagnostic_setting` - handling mixed casing of the EventHub Namespace Authorization Rule ID ([#10104](https://github.com/hashicorp/terraform-provider-azurerm/issues/10104))\n* `azurerm_mssql_virtual_machine` - address persistent diff and use relative expiry for service principal password ([#10125](https://github.com/hashicorp/terraform-provider-azurerm/issues/10125))\n* `azurerm_role_assignment` - fix race condition in read after create ([#10134](https://github.com/hashicorp/terraform-provider-azurerm/issues/10134))\n* `azurerm_role_definition` - address eventual consistency issues in update and delete ([#10170](https://github.com/hashicorp/terraform-provider-azurerm/issues/10170))\n* `azurerm_virtual_machine` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_virtual_machine_scale_set` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_windows_virtual_machine` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n* `azurerm_windows_virtual_machine_scale_set` - ensuring the casing of the `identity_ids` field within the `identity` block ([#10105](https://github.com/hashicorp/terraform-provider-azurerm/issues/10105))\n\n## 2.42.0 (January 08, 2021)\n\nBREAKING CHANGES\n\n* `azurerm_key_vault` - the field `soft_delete_enabled` is now defaulted to `true` to match the breaking change in the Azure API where Key Vaults now have Soft Delete enabled by default, which cannot be disabled. This property is now non-functional, defaults to `true` and will be removed in version 3.0 of the Azure Provider. ([#10088](https://github.com/hashicorp/terraform-provider-azurerm/issues/10088))\n* `azurerm_key_vault` - the field `soft_delete_retention_days` is now defaulted to `90` days to match the Azure API behaviour, as the Azure API does not return a value for this field when not explicitly configured, so defaulting this removes a diff with `0`. ([#10088](https://github.com/hashicorp/terraform-provider-azurerm/issues/10088))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_eventgrid_domain_topic` ([#10050](https://github.com/hashicorp/terraform-provider-azurerm/issues/10050))\n* **New Data Source:** `azurerm_ssh_public_key` ([#9842](https://github.com/hashicorp/terraform-provider-azurerm/issues/9842))\n* **New Resource:** `azurerm_data_factory_linked_service_synapse` ([#9928](https://github.com/hashicorp/terraform-provider-azurerm/issues/9928))\n* **New Resource:** `azurerm_disk_access` ([#9889](https://github.com/hashicorp/terraform-provider-azurerm/issues/9889))\n* **New Resource:** `azurerm_media_streaming_locator` ([#9992](https://github.com/hashicorp/terraform-provider-azurerm/issues/9992))\n* **New Resource:** `azurerm_sentinel_alert_rule_fusion` ([#9829](https://github.com/hashicorp/terraform-provider-azurerm/issues/9829))\n* **New Resource:** `azurerm_ssh_public_key` ([#9842](https://github.com/hashicorp/terraform-provider-azurerm/issues/9842))\n\nIMPROVEMENTS:\n\n* batch: updating to API version `2020-03-01` ([#10036](https://github.com/hashicorp/terraform-provider-azurerm/issues/10036))\n* dependencies: upgrading to `v49.2.0` of `github.com/Azure/azure-sdk-for-go` ([#10042](https://github.com/hashicorp/terraform-provider-azurerm/issues/10042))\n* dependencies: upgrading to `v0.15.1` of `github.com/tombuildsstuff/giovanni` ([#10035](https://github.com/hashicorp/terraform-provider-azurerm/issues/10035))\n* Data Source: `azurerm_hdinsight_cluster` - support for the `kafka_rest_proxy_endpoint` property ([#8064](https://github.com/hashicorp/terraform-provider-azurerm/issues/8064))\n* Data Source: `azurerm_databricks_workspace` - support for the `tags` property ([#9933](https://github.com/hashicorp/terraform-provider-azurerm/issues/9933))\n* Data Source: `azurerm_subscription` - support for the `tags` property ([#8064](https://github.com/hashicorp/terraform-provider-azurerm/issues/8064))\n* `azurerm_app_service` - now supports  `detailed_error_mesage_enabled` and `failed_request_tracing_enabled ` logs settings ([#9162](https://github.com/hashicorp/terraform-provider-azurerm/issues/9162))\n* `azurerm_app_service` - now supports  `service_tag` in `ip_restriction` blocks ([#9609](https://github.com/hashicorp/terraform-provider-azurerm/issues/9609))\n* `azurerm_app_service_slot` - now supports  `detailed_error_mesage_enabled` and `failed_request_tracing_enabled ` logs settings ([#9162](https://github.com/hashicorp/terraform-provider-azurerm/issues/9162))\n* `azurerm_batch_pool` support for the `public_address_provisioning_type` property ([#10036](https://github.com/hashicorp/terraform-provider-azurerm/issues/10036))\n* `azurerm_api_management` - support `Consumption_0` for the `sku_name` property ([#6868](https://github.com/hashicorp/terraform-provider-azurerm/issues/6868))\n* `azurerm_cdn_endpoint` - only send `content_types_to_compress` and `geo_filter` to the API when actually set ([#9902](https://github.com/hashicorp/terraform-provider-azurerm/issues/9902))\n* `azurerm_cosmosdb_mongo_collection` - correctly read back the `_id` index when MongoDB 3.6 ([#8690](https://github.com/hashicorp/terraform-provider-azurerm/issues/8690))\n* `azurerm_container_group` - support for the `volume.empty_dir` property ([#9836](https://github.com/hashicorp/terraform-provider-azurerm/issues/9836))\n* `azurerm_data_factory_linked_service_azure_file_storage` - support for the `file_share` property ([#9934](https://github.com/hashicorp/terraform-provider-azurerm/issues/9934))\n* `azurerm_dedicated_host` - support for addtional `sku_name` values ([#9951](https://github.com/hashicorp/terraform-provider-azurerm/issues/9951))\n* `azurerm_devspace_controller` - deprecating since new DevSpace Controllers can no longer be provisioned, this will be removed in version 3.0 of the Azure Provider ([#10049](https://github.com/hashicorp/terraform-provider-azurerm/issues/10049))\n* `azurerm_function_app` - make `pre_warmed_instance_count` computed to use azure's default ([#9069](https://github.com/hashicorp/terraform-provider-azurerm/issues/9069))\n* `azurerm_function_app` - now supports  `service_tag` in `ip_restriction` blocks ([#9609](https://github.com/hashicorp/terraform-provider-azurerm/issues/9609))\n* `azurerm_hdinsight_hadoop_cluster` - allow the value `Standard_D4a_V4` for the `vm_type` property ([#10000](https://github.com/hashicorp/terraform-provider-azurerm/issues/10000))\n* `azurerm_hdinsight_kafka_cluster` - support for the `rest_proxy` and `kafka_management_node` blocks ([#8064](https://github.com/hashicorp/terraform-provider-azurerm/issues/8064))\n* `azurerm_key_vault` - the field `soft_delete_enabled` is now defaulted to `true` to match the Azure API behaviour where Soft Delete is force-enabled and can no longer be disabled. This field is deprecated, can be safely removed from your Terraform Configuration, and will be removed in version 3.0 of the Azure Provider. ([#10088](https://github.com/hashicorp/terraform-provider-azurerm/issues/10088))\n* `azurerm_kubernetes_cluster` - add support for network_mode ([#8828](https://github.com/hashicorp/terraform-provider-azurerm/issues/8828))\n* `azurerm_log_analytics_linked_service` - add validation for resource ID type ([#9932](https://github.com/hashicorp/terraform-provider-azurerm/issues/9932))\n* `azurerm_log_analytics_linked_service` - update validation to use generated validate functions ([#9950](https://github.com/hashicorp/terraform-provider-azurerm/issues/9950))\n* `azurerm_monitor_diagnostic_setting` - validation that `eventhub_authorization_rule_id` is an EventHub Namespace Authorization Rule ID ([#9914](https://github.com/hashicorp/terraform-provider-azurerm/issues/9914))\n* `azurerm_monitor_diagnostic_setting` - validation that `log_analytics_workspace_id` is a Log Analytics Workspace ID ([#9914](https://github.com/hashicorp/terraform-provider-azurerm/issues/9914))\n* `azurerm_monitor_diagnostic_setting` - validation that `storage_account_id` is a Storage Account ID ([#9914](https://github.com/hashicorp/terraform-provider-azurerm/issues/9914))\n* `azurerm_network_security_rule` - increase allowed the number of `application_security_group` blocks allowed ([#9884](https://github.com/hashicorp/terraform-provider-azurerm/issues/9884))\n* `azurerm_sentinel_alert_rule_ms_security_incident` - support the `alert_rule_template_guid` and `display_name_exclude_filter` properties ([#9797](https://github.com/hashicorp/terraform-provider-azurerm/issues/9797))\n* `azurerm_sentinel_alert_rule_scheduled` - support for the `alert_rule_template_guid` property ([#9712](https://github.com/hashicorp/terraform-provider-azurerm/issues/9712))\n* `azurerm_sentinel_alert_rule_scheduled` - support for creating incidents ([#8564](https://github.com/hashicorp/terraform-provider-azurerm/issues/8564))\n* `azurerm_spring_cloud_app` - support the properties `https_only`, `is_public`, and `persistent_disk` ([#9957](https://github.com/hashicorp/terraform-provider-azurerm/issues/9957))\n* `azurerm_subscription` - support for the `tags` property ([#9047](https://github.com/hashicorp/terraform-provider-azurerm/issues/9047))\n* `azurerm_synapse_workspace` - support for the `managed_resource_group_name` property ([#10017](https://github.com/hashicorp/terraform-provider-azurerm/issues/10017))\n* `azurerm_traffic_manager_profile` - support for the `traffic_view_enabled` property ([#10005](https://github.com/hashicorp/terraform-provider-azurerm/issues/10005))\n\nBUG FIXES:\n\nprovider: will not correctly register the `Microsoft.Blueprint` and `Microsoft.HealthcareApis` RPs ([#10062](https://github.com/hashicorp/terraform-provider-azurerm/issues/10062))\n* `azurerm_application_gateway` - allow `750` for `file_upload_limit_mb` when the sku is `WAF_v2` ([#8753](https://github.com/hashicorp/terraform-provider-azurerm/issues/8753))\n* `azurerm_firewall_policy_rule_collection_group` - correctly validate the `network_rule_collection.destination_ports` property ([#9490](https://github.com/hashicorp/terraform-provider-azurerm/issues/9490))\n* `azurerm_cdn_endpoint` - changing many `delivery_rule` condition `match_values` to optional ([#8850](https://github.com/hashicorp/terraform-provider-azurerm/issues/8850))\n* `azurerm_cosmosdb_account` - always include `key_vault_id` in update requests for azure policy enginer compatibility ([#9966](https://github.com/hashicorp/terraform-provider-azurerm/issues/9966))\n* `azurerm_cosmosdb_table` - do not call the throughput api when serverless ([#9749](https://github.com/hashicorp/terraform-provider-azurerm/issues/9749))\n* `azurerm_key_vault` - the field `soft_delete_retention_days` is now defaulted to `90` days to match the Azure API behaviour. ([#10088](https://github.com/hashicorp/terraform-provider-azurerm/issues/10088))\n* `azurerm_kubernetes_cluster` - parse oms `log_analytics_workspace_id` to ensure correct casing ([#9976](https://github.com/hashicorp/terraform-provider-azurerm/issues/9976))\n* `azurerm_role_assignment` fix crash in retry logic ([#10051](https://github.com/hashicorp/terraform-provider-azurerm/issues/10051))\n* `azurerm_storage_account` - allow hns when `account_tier` is `Premium` ([#9548](https://github.com/hashicorp/terraform-provider-azurerm/issues/9548))\n* `azurerm_storage_share_file` - allowing files smaller than 4KB to be uploaded ([#10035](https://github.com/hashicorp/terraform-provider-azurerm/issues/10035))\n\n## 2.41.0 (December 17, 2020)\n\nUPGRADE NOTES:\n\n* `azurerm_key_vault` - Azure will be introducing a breaking change on December 31st, 2020 by force-enabling Soft Delete on all new and existing Key Vaults. To workaround this, this release of the Azure Provider still allows you to configure Soft Delete on before this date (but once this is enabled this cannot be disabled). Since new Key Vaults will automatically be provisioned using Soft Delete in the future, and existing Key Vaults will be upgraded - a future release will deprecate the `soft_delete_enabled` field and default this to true early in 2021. ([#9911](https://github.com/hashicorp/terraform-provider-azurerm/issues/9911))\n* `azurerm_key_vault_certificate` - Terraform will now attempt to `purge` Certificates during deletion due to the upcoming breaking change in the Azure API where Key Vaults will have soft-delete force-enabled. This can be disabled by setting the `purge_soft_delete_on_destroy` field within the `features -> keyvault` block to `false`. ([#9911](https://github.com/hashicorp/terraform-provider-azurerm/issues/9911))\n* `azurerm_key_vault_key` - Terraform will now attempt to `purge` Keys during deletion due to the upcoming breaking change in the Azure API where Key Vaults will have soft-delete force-enabled. This can be disabled by setting the `purge_soft_delete_on_destroy` field within the `features -> keyvault` block to `false`. ([#9911](https://github.com/hashicorp/terraform-provider-azurerm/issues/9911))\n* `azurerm_key_vault_secret` - Terraform will now attempt to `purge` Secrets during deletion due to the upcoming breaking change in the Azure API where Key Vaults will have soft-delete force-enabled. This can be disabled by setting the `purge_soft_delete_on_destroy` field within the `features -> keyvault` block to `false`. ([#9911](https://github.com/hashicorp/terraform-provider-azurerm/issues/9911))\n\nFEATURES:\n\n* **New Resource:** `azurerm_eventgrid_system_topic_event_subscription` ([#9852](https://github.com/hashicorp/terraform-provider-azurerm/issues/9852))\n* **New Resource:** `azurerm_media_job` ([#9859](https://github.com/hashicorp/terraform-provider-azurerm/issues/9859))\n* **New Resource:** `azurerm_media_streaming_endpoint` ([#9537](https://github.com/hashicorp/terraform-provider-azurerm/issues/9537))\n* **New Resource:** `azurerm_subnet_service_endpoint_storage_policy` ([#8966](https://github.com/hashicorp/terraform-provider-azurerm/issues/8966))\n* **New Resource:** `azurerm_synapse_managed_private_endpoint` ([#9260](https://github.com/hashicorp/terraform-provider-azurerm/issues/9260))\n\nIMPROVEMENTS:\n\n* `azurerm_app_service` - Add support for `outbound_ip_address_list` and `possible_outbound_ip_address_list` ([#9871](https://github.com/hashicorp/terraform-provider-azurerm/issues/9871))\n* `azurerm_disk_encryption_set` - support for updating `key_vault_key_id` ([#7913](https://github.com/hashicorp/terraform-provider-azurerm/issues/7913))\n* `azurerm_iot_time_series_insights_gen2_environment` - exposing `data_access_fqdn` ([#9848](https://github.com/hashicorp/terraform-provider-azurerm/issues/9848))\n* `azurerm_key_vault_certificate` - performing a \"purge\" of the Certificate during deletion if the feature is opted-in within the `features` block, see the \"Upgrade Notes\" for more information ([#9911](https://github.com/hashicorp/terraform-provider-azurerm/issues/9911))\n* `azurerm_key_vault_key` - performing a \"purge\" of the Key during deletion if the feature is opted-in within the `features` block, see the \"Upgrade Notes\" for more information ([#9911](https://github.com/hashicorp/terraform-provider-azurerm/issues/9911))\n* `azurerm_key_vault_secret` - performing a \"purge\" of the Secret during deletion if the feature is opted-in within the `features` block, see the \"Upgrade Notes\" for more information ([#9911](https://github.com/hashicorp/terraform-provider-azurerm/issues/9911))\n* `azurerm_log_analytics_linked_service` - Add new fields `workspace_id`, `read_access_id`, and `write_access_id` ([#9410](https://github.com/hashicorp/terraform-provider-azurerm/issues/9410))\n* `azurerm_linux_virtual_machine` - Normalise SSH keys to cover VM import cases ([#9897](https://github.com/hashicorp/terraform-provider-azurerm/issues/9897))\n* `azurerm_subnet` - support for the `service_endpoint_policy` block ([#8966](https://github.com/hashicorp/terraform-provider-azurerm/issues/8966))\n* `azurerm_traffic_manager_profile` - support for new field `max_return` and support for `traffic_routing_method` to be `MultiValue` ([#9487](https://github.com/hashicorp/terraform-provider-azurerm/issues/9487))\n\nBUG FIXES:\n\n* `azurerm_key_vault_certificate` - reading `dns_names` and `emails` within the `subject_alternative_names` block from the Certificate if not returned from the API ([#8631](https://github.com/hashicorp/terraform-provider-azurerm/issues/8631))\n* `azurerm_key_vault_certificate` - polling until the Certificate is fully deleted during deletion ([#9911](https://github.com/hashicorp/terraform-provider-azurerm/issues/9911))\n* `azurerm_key_vault_key` - polling until the Key is fully deleted during deletion ([#9911](https://github.com/hashicorp/terraform-provider-azurerm/issues/9911))\n* `azurerm_key_vault_secret` -  polling until the Secret is fully deleted during deletion ([#9911](https://github.com/hashicorp/terraform-provider-azurerm/issues/9911))\n* `azurerm_log_analytics_workspace` - adding a state migration to correctly update the Resource ID ([#9853](https://github.com/hashicorp/terraform-provider-azurerm/issues/9853))\n\n## 2.40.0 (December 10, 2020)\n\nFEATURES:\n\n* **New Resource:** `azurerm_app_service_certificate_binding` ([#9415](https://github.com/hashicorp/terraform-provider-azurerm/issues/9415))\n* **New Resource:** `azurerm_digital_twins_endpoint_eventhub` ([#9673](https://github.com/hashicorp/terraform-provider-azurerm/issues/9673))\n* **New Resource:** `azurerm_digital_twins_endpoint_servicebus`  ([#9702](https://github.com/hashicorp/terraform-provider-azurerm/issues/9702))\n* **New Resource:** `azurerm_media_asset` ([#9387](https://github.com/hashicorp/terraform-provider-azurerm/issues/9387))\n* **New Resource:** `azurerm_media_transform` ([#9663](https://github.com/hashicorp/terraform-provider-azurerm/issues/9663))\n* **New Resource:** `azurerm_resource_provider` ([#7951](https://github.com/hashicorp/terraform-provider-azurerm/issues/7951))\n* **New Resource:** `azurerm_stack_hci_cluster` ([#9134](https://github.com/hashicorp/terraform-provider-azurerm/issues/9134))\n* **New Resource:** `azurerm_storage_share_file` ([#9406](https://github.com/hashicorp/terraform-provider-azurerm/issues/9406))\n* **New Resource:** `azurerm_storage_sync_cloud_endpoint` ([#8540](https://github.com/hashicorp/terraform-provider-azurerm/issues/8540))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading `github.com/Azure/go-autorest/validation` to `v0.3.1` ([#9783](https://github.com/hashicorp/terraform-provider-azurerm/issues/9783))\n* dependencies: updating Log Analytics to API version `2020-08-01` ([#9764](https://github.com/hashicorp/terraform-provider-azurerm/issues/9764))\n* internal: disabling the Azure SDK's validation since it's superfluous ([#9783](https://github.com/hashicorp/terraform-provider-azurerm/issues/9783))\n* `azurerm_app_service` - support for PHP version `7.4` ([#9727](https://github.com/hashicorp/terraform-provider-azurerm/issues/9727))\n* `azurerm_bot_channel_directline` - support for enhanced import validation ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_bot_channel_email` - support for enhanced import validation ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_bot_channel_ms_teams` - support for enhanced import validation ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_bot_channel_slack` - support for enhanced import validation ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_bot_channels_registration` - support for enhanced import validation ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_bot_connection` - support for enhanced import validation ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_bot_web_app` - support for enhanced import validation ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_cosmosdb_sql_container` - support for the `partition_key_version` property ([#9496](https://github.com/hashicorp/terraform-provider-azurerm/issues/9496))\n* `azurerm_kusto_cluster` - support for the `engine` property ([#9696](https://github.com/hashicorp/terraform-provider-azurerm/issues/9696))\n* `azurerm_kusto_eventhub_data_connection` - support for `compression` ([#9692](https://github.com/hashicorp/terraform-provider-azurerm/issues/9692))\n* `azurerm_iothub` - support for the `min_tls_version` property ([#9670](https://github.com/hashicorp/terraform-provider-azurerm/issues/9670))\n* `azurerm_recovery_services_vault` - support for the `identity` block ([#9689](https://github.com/hashicorp/terraform-provider-azurerm/issues/9689))\n* `azurerm_redis_cache` - adding enhanced import validation ([#9771](https://github.com/hashicorp/terraform-provider-azurerm/issues/9771))\n* `azurerm_redis_cache` - adding validation that `subnet_id` is a valid Subnet ID ([#9771](https://github.com/hashicorp/terraform-provider-azurerm/issues/9771))\n* `azurerm_redis_firewall_rule` - adding enhanced import validation ([#9771](https://github.com/hashicorp/terraform-provider-azurerm/issues/9771))\n* `azurerm_redis_linked_server` - adding enhanced import validation ([#9771](https://github.com/hashicorp/terraform-provider-azurerm/issues/9771))\n* `azurerm_redis_linked_server` - adding validation that `linked_redis_cache_id` is a valid Redis Cache ID ([#9771](https://github.com/hashicorp/terraform-provider-azurerm/issues/9771))\n* `azurerm_security_center_automation` - support for the `description` and `tags` properties ([#9676](https://github.com/hashicorp/terraform-provider-azurerm/issues/9676))\n* `azurerm_stream_analytics_reference_input_blob` - support for enhanced import validation ([#9735](https://github.com/hashicorp/terraform-provider-azurerm/issues/9735))\n* `azurerm_stream_analytics_stream_input_blob` - support for enhanced import validation ([#9735](https://github.com/hashicorp/terraform-provider-azurerm/issues/9735))\n* `azurerm_stream_analytics_stream_input_iothub` - support for enhanced import validation ([#9735](https://github.com/hashicorp/terraform-provider-azurerm/issues/9735))\n* `azurerm_stream_analytics_stream_input_eventhub` - support for enhanced import validation ([#9735](https://github.com/hashicorp/terraform-provider-azurerm/issues/9735))\n* `azurerm_storage_account` - enable the `allow_blob_public_access` and `azurerm_storage_account` properties in US Government Cloud ([#9540](https://github.com/hashicorp/terraform-provider-azurerm/issues/9540))\n\nBUG FIXES:\n\n* `azurerm_app_service_managed_certificate` - create certificate in service plan resource group to prevent diff loop ([#9701](https://github.com/hashicorp/terraform-provider-azurerm/issues/9701))\n* `azurerm_bot_channel_directline` - the field `bot_name` is now ForceNew to match the documentation/API behaviour ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_bot_channel_ms_teams` - the field `bot_name` is now ForceNew to match the documentation/API behaviour ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_bot_channel_slack` - the field `bot_name` is now ForceNew to match the documentation/API behaviour ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_bot_connection` - the field `bot_name` is now ForceNew to match the documentation/API behaviour ([#9690](https://github.com/hashicorp/terraform-provider-azurerm/issues/9690))\n* `azurerm_frontdoor` - working around an upstream API issue by rewriting the returned ID's within Terraform ([#9750](https://github.com/hashicorp/terraform-provider-azurerm/issues/9750))\n* `azurerm_frontdoor_custom_https_configuration` - working around an upstream API issue by rewriting the returned ID's within Terraform ([#9750](https://github.com/hashicorp/terraform-provider-azurerm/issues/9750))\n* `azurerm_frontdoor_firewall_policy` - working around an upstream API issue by rewriting the returned ID's within Terraform ([#9750](https://github.com/hashicorp/terraform-provider-azurerm/issues/9750))\n* `azurerm_media_services_account` - fixing a bug where `storage_authentication_type` wasn't set ([#9663](https://github.com/hashicorp/terraform-provider-azurerm/issues/9663))\n* `azurerm_media_service_account` - checking for the presence of an existing account during creation ([#9802](https://github.com/hashicorp/terraform-provider-azurerm/issues/9802))\n* `azurerm_postgresql_server` - changing the `geo_redundant_backup_enabled` property now forces a new resource ([#9694](https://github.com/hashicorp/terraform-provider-azurerm/issues/9694))\n* `azurerm_postgresql_server` - Fix issue when specifying empty threat detection list attributes ([#9739](https://github.com/hashicorp/terraform-provider-azurerm/issues/9739))\n* `azurerm_signar_service` - having an empty `allowed_origins` in the `cors` block will no longer cause a panic ([#9671](https://github.com/hashicorp/terraform-provider-azurerm/issues/9671))\n\n## 2.39.0 (December 04, 2020)\n\nFEATURES:\n\n* **New Resource:** `azurerm_api_management_policy` ([#9215](https://github.com/hashicorp/terraform-provider-azurerm/issues/9215))\n* **New Resource:** `azurerm_digital_twins_endpoint_eventgrid` ([#9489](https://github.com/hashicorp/terraform-provider-azurerm/issues/9489))\n* **New Resource:** `azurerm_iot_time_series_insights_gen2_environment` ([#9616](https://github.com/hashicorp/terraform-provider-azurerm/issues/9616))\n\nIMPROVEMENTS: \n\n* `azurerm_dashboard` - adding validation at import time to ensure the ID is for a Dashboard ([#9530](https://github.com/hashicorp/terraform-provider-azurerm/issues/9530))\n* `azurerm_keyvault_certificate` - add `3072` to allowed values for `key_size` ([#9524](https://github.com/hashicorp/terraform-provider-azurerm/issues/9524))\n* `azurerm_media_services_account` - support for the `identity`, `tags`, and `storage_authentication` properties ([#9457](https://github.com/hashicorp/terraform-provider-azurerm/issues/9457))\n* `azurerm_notification_hub_authorization_rule` - adding validation at import time to ensure the ID is for a Notification Hub Authorization Rule ([#9529](https://github.com/hashicorp/terraform-provider-azurerm/issues/9529))\n* `azurerm_notification_hub_namespace` - adding validation at import time to ensure the ID is for a Notification Hub Namespace ([#9529](https://github.com/hashicorp/terraform-provider-azurerm/issues/9529))\n* `azurerm_postgresql_active_directory_administrator` - validating during import that the ID is for a PostgreSQL Active Directory Administrator ([#9532](https://github.com/hashicorp/terraform-provider-azurerm/issues/9532))\n* `azurerm_postgresql_configuration` - validating during import that the ID is for a PostgreSQL Configuration ([#9532](https://github.com/hashicorp/terraform-provider-azurerm/issues/9532))\n* `azurerm_postgresql_database` - validating during import that the ID is for a PostgreSQL Database ([#9532](https://github.com/hashicorp/terraform-provider-azurerm/issues/9532))\n* `azurerm_postgresql_firewall_rule` - validating during import that the ID is for a PostgreSQL Firewall Rule ([#9532](https://github.com/hashicorp/terraform-provider-azurerm/issues/9532))\n* `azurerm_postgresql_virtual_network_rule` - validating during import that the ID is for a PostgreSQL Virtual Network Rule ([#9532](https://github.com/hashicorp/terraform-provider-azurerm/issues/9532))\n* `azurerm_traffic_manager_profile` - allow up to `2147483647` for the `ttl` property ([#9522](https://github.com/hashicorp/terraform-provider-azurerm/issues/9522))\n\nBUG FIXES:\n\n* `azurerm_security_center_workspace` - fixing the casing on the `workspace_id` ([#9651](https://github.com/hashicorp/terraform-provider-azurerm/issues/9651))\n* `azurerm_eventhub_dedicated_cluster` - the `sku_name` capacity can be greater then `1` ([#9649](https://github.com/hashicorp/terraform-provider-azurerm/issues/9649))\n\n## 2.38.0 (November 27, 2020)\n\nFEATURES:\n\n* **New Resource** `azurerm_app_service_managed_certificate` ([#9378](https://github.com/hashicorp/terraform-provider-azurerm/issues/9378))\n* **New Data Source:** `azurerm_digital_twins_instance` ([#9430](https://github.com/hashicorp/terraform-provider-azurerm/issues/9430))\n* **New Data Source:** `azurerm_virtual_wan` ([#9382](https://github.com/hashicorp/terraform-provider-azurerm/issues/9382))\n* **New Resource:** `azurerm_digital_twins_instance` ([#9430](https://github.com/hashicorp/terraform-provider-azurerm/issues/9430))\n\nIMPROVEMENTS: \n\n* dependencies: updating App Service to API version `2020-06-01` ([#9409](https://github.com/hashicorp/terraform-provider-azurerm/issues/9409))\n* Data Source `azurerm_app_service` now exports the `custom_domain_verification_id` attribute ([#9378](https://github.com/hashicorp/terraform-provider-azurerm/issues/9378))\n* Data Source`azurerm_function_app` now exports the `custom_domain_verification_id` attribute ([#9378](https://github.com/hashicorp/terraform-provider-azurerm/issues/9378))\n* Data Source: `azurerm_spring_cloud_service` - now exports the `outbound_public_ip_addresses` attribute ([#9261](https://github.com/hashicorp/terraform-provider-azurerm/issues/9261))\n* `azurerm_app_service` now exports `custom_domain_verification_id` ([#9378](https://github.com/hashicorp/terraform-provider-azurerm/issues/9378))\n* `azurerm_application_insights` - validating the resource ID is correct during import ([#9446](https://github.com/hashicorp/terraform-provider-azurerm/issues/9446))\n* `azurerm_application_insights_web_test` - validating the resource ID is correct during import ([#9446](https://github.com/hashicorp/terraform-provider-azurerm/issues/9446))\n* `azurerm_express_route_circuit_peering` - support for the `ipv6` block  ([#9235](https://github.com/hashicorp/terraform-provider-azurerm/issues/9235))\n* `azurerm_function_app` now exports the `custom_domain_verification_id` attribute ([#9378](https://github.com/hashicorp/terraform-provider-azurerm/issues/9378))\n* `azurerm_vpn_server_configuration` - deprecate the `radius_server` block in favour of the `radius` block which supports multiple servers ([#9308](https://github.com/hashicorp/terraform-provider-azurerm/issues/9308))\n* `azurerm_spring_cloud_service` - now exports the `outbound_public_ip_addresses` attribute ([#9261](https://github.com/hashicorp/terraform-provider-azurerm/issues/9261))\n* `azurerm_virtual_network_gateway` - support for the `dpd_timeout_seconds` and `local_azure_ip_address_enabled` properties ([#9330](https://github.com/hashicorp/terraform-provider-azurerm/issues/9330))\n* `azurerm_virtual_network_gateway_connection` - support for the `private_ip_address_enabled` propeties and the `custom_route` block ([#9330](https://github.com/hashicorp/terraform-provider-azurerm/issues/9330))\n\nBUG FIXES:\n\n* `azurerm_api_management` - fixing an issue where developer portal certificates are updated on every apply ([#7299](https://github.com/hashicorp/terraform-provider-azurerm/issues/7299))\n* `azurerm_cosmosdb_account` - corrently updates the `zone_redundant` property during updates ([#9485](https://github.com/hashicorp/terraform-provider-azurerm/issues/9485))\n* `azurerm_search_service` - `allowed_ips` now supports specifying a CIDR Block in addition to an IPv4 address ([#9493](https://github.com/hashicorp/terraform-provider-azurerm/issues/9493))\n* `azurerm_virtual_desktop_application_group` - adding a state migration to avoid a breaking change when upgrading from `v2.35.0` or later ([#9495](https://github.com/hashicorp/terraform-provider-azurerm/issues/9495))\n* `azurerm_virtual_desktop_host_pool` - adding a state migration to avoid a breaking change when upgrading from `v2.35.0` or later ([#9495](https://github.com/hashicorp/terraform-provider-azurerm/issues/9495))\n* `azurerm_virtual_desktop_workspace` - adding a state migration to avoid a breaking change when upgrading from `v2.35.0` or later ([#9495](https://github.com/hashicorp/terraform-provider-azurerm/issues/9495))\n* `azurerm_virtual_desktop_workspace_application_group_association` - adding a state migration to avoid a breaking change when upgrading from `v2.35.0` or later ([#9495](https://github.com/hashicorp/terraform-provider-azurerm/issues/9495))\n* `azurerm_windows_virtual_machine` - no longer sets `patch_mode` on creation if it is the default value ([#9495](https://github.com/hashicorp/terraform-provider-azurerm/issues/9432))\n\n## 2.37.0 (November 20, 2020)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_servicebus_subscription` ([#9272](https://github.com/hashicorp/terraform-provider-azurerm/issues/9272))\n* **New Data Source:** `azurerm_storage_encryption_scope` ([#8894](https://github.com/hashicorp/terraform-provider-azurerm/issues/8894))\n* **New Resource:** `azurerm_log_analytics_cluster` ([#8946](https://github.com/hashicorp/terraform-provider-azurerm/issues/8946))\n* **New Resource:** `azurerm_log_analytics_cluster_customer_managed_key` ([#8946](https://github.com/hashicorp/terraform-provider-azurerm/issues/8946))\n* **New Resource:** `azurerm_security_center_automation` ([#8781](https://github.com/hashicorp/terraform-provider-azurerm/issues/8781))\n* **New Resource:** `azurerm_storage_data_lake_gen2_path` ([#7521](https://github.com/hashicorp/terraform-provider-azurerm/issues/7521))\n* **New Resource:** `azurerm_storage_encryption_scope` ([#8894](https://github.com/hashicorp/terraform-provider-azurerm/issues/8894))\n* **New Resource:** `azurerm_vpn_gateway_connection` ([#9160](https://github.com/hashicorp/terraform-provider-azurerm/issues/9160))\n\nIMPROVEMENTS:\n\n* storage: foundational improvements to support toggling between the Data Plane and Resource Manager Storage API's in the future ([#9314](https://github.com/hashicorp/terraform-provider-azurerm/issues/9314))\n* Data Source: `azurerm_firewall`-  exposing `dns_servers`, `firewall_policy_id`, `sku_name`, `sku_tier`, `threat_intel_mode`, `virtual_hub` and `zones` ([#8879](https://github.com/hashicorp/terraform-provider-azurerm/issues/8879))\n* Data Source: `azurerm_firewall`-  exposing `public_ip_address_id` and `private_ip_address_id` within the `ip_configuration` block ([#8879](https://github.com/hashicorp/terraform-provider-azurerm/issues/8879))\n* Data Source: `azurerm_firewall`-  exposing `name` within the `management_ip_configuration` block ([#8879](https://github.com/hashicorp/terraform-provider-azurerm/issues/8879))\n* Data Source: `azurerm_kubernetes_node_pool` - exposing `os_disk_type` ([#9166](https://github.com/hashicorp/terraform-provider-azurerm/issues/9166))\n* `azurerm_api_management_api_diagnostic` - support for the `always_log_errors`, `http_correlation_protocol`, `log_client_ip` and `verbosity` attributes ([#9172](https://github.com/hashicorp/terraform-provider-azurerm/issues/9172))\n* `azurerm_api_management_api_diagnostic` - support the `frontend_request`, `frontend_response`, `backend_request` and `backend_response` blocks ([#9172](https://github.com/hashicorp/terraform-provider-azurerm/issues/9172))\n* `azurerm_container_group` - support for secret container volumes with the `container.#.volume.#.secret` attribute ([#9117](https://github.com/hashicorp/terraform-provider-azurerm/issues/9117))\n* `azurerm_cosmosdb_account` - support for the `public_network_access_enabled` property ([#9236](https://github.com/hashicorp/terraform-provider-azurerm/issues/9236))\n* `azurerm_cosmosdb_cassandra_keyspace` - `throughput` can now be set to higher than `1000000` if enabled by Azure Support ([#9050](https://github.com/hashicorp/terraform-provider-azurerm/issues/9050))\n* `azurerm_cosmosdb_gremlin_database` - `throughput` can now be set to higher than `1000000` if enabled by Azure Support ([#9050](https://github.com/hashicorp/terraform-provider-azurerm/issues/9050))\n* `azurerm_cosmosdb_mongo_database` - `throughput` can now be set to higher than `1000000` if enabled by Azure Support ([#9050](https://github.com/hashicorp/terraform-provider-azurerm/issues/9050))\n* `azurerm_cosmosdb_sql_container` - `max_throughput` within the `autoscale_settings` block can now be set to higher than `1000000` if enabled by Azure Support ([#9050](https://github.com/hashicorp/terraform-provider-azurerm/issues/9050))\n* `azurerm_cosmosdb_sql_database` - `throughput` can now be set to higher than `1000000` if enabled by Azure Support ([#9050](https://github.com/hashicorp/terraform-provider-azurerm/issues/9050))\n* `azurerm_cosmosdb_table` - `throughput` can now be set to higher than `1000000` if enabled by Azure Support ([#9050](https://github.com/hashicorp/terraform-provider-azurerm/issues/9050))\n* `azurerm_dns_zone` - support for the `soa_record` block ([#9319](https://github.com/hashicorp/terraform-provider-azurerm/issues/9319))\n* `azurerm_firewall` - support for `firewall_policy_id`, `sku_name`, `sku_tier` and `virtual_hub` ([#8879](https://github.com/hashicorp/terraform-provider-azurerm/issues/8879))\n* `azurerm_kubernetes_cluster` - support for configuring `os_disk_type` within the `default_node_pool` block ([#9166](https://github.com/hashicorp/terraform-provider-azurerm/issues/9166))\n* `azurerm_kubernetes_cluster` - `max_count` within the `default_node_pool` block can now be set to a maximum value of `1000` ([#9227](https://github.com/hashicorp/terraform-provider-azurerm/issues/9227))\n* `azurerm_kubernetes_cluster` - `min_count` within the `default_node_pool` block can now be set to a maximum value of `1000` ([#9227](https://github.com/hashicorp/terraform-provider-azurerm/issues/9227))\n* `azurerm_kubernetes_cluster` - `node_count` within the `default_node_pool` block can now be set to a maximum value of `1000` ([#9227](https://github.com/hashicorp/terraform-provider-azurerm/issues/9227))\n* `azurerm_kubernetes_cluster` - the block `http_application_routing` within the `addon_profile` block can now be updated/removed ([#9358](https://github.com/hashicorp/terraform-provider-azurerm/issues/9358))\n* `azurerm_kubernetes_node_pool` - support for configuring `os_disk_type` ([#9166](https://github.com/hashicorp/terraform-provider-azurerm/issues/9166))\n* `azurerm_kubernetes_node_pool` - `max_count` can now be set to a maximum value of `1000` ([#9227](https://github.com/hashicorp/terraform-provider-azurerm/issues/9227))\n* `azurerm_kubernetes_node_pool` - `min_count` can now be set to a maximum value of `1000` ([#9227](https://github.com/hashicorp/terraform-provider-azurerm/issues/9227))\n* `azurerm_kubernetes_node_pool` - `node_count` can now be set to a maximum value of `1000` ([#9227](https://github.com/hashicorp/terraform-provider-azurerm/issues/9227))\n* `azurerm_linux_virtual_machine` - support for the `extensions_time_budget` property ([#9257](https://github.com/hashicorp/terraform-provider-azurerm/issues/9257))\n* `azurerm_linux_virtual_machine` - updating the `dedicated_host_id` no longer forces a new resource ([#9264](https://github.com/hashicorp/terraform-provider-azurerm/issues/9264))\n* `azurerm_linux_virtual_machine` - support for graceful shutdowns (via the features block) ([#8470](https://github.com/hashicorp/terraform-provider-azurerm/issues/8470))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `platform_fault_domain_count`, `disk_iops_read_write`, and `disk_mbps_read_write` properties ([#9262](https://github.com/hashicorp/terraform-provider-azurerm/issues/9262))\n* `azurerm_mssql_database` - `sku_name` supports more `DWxxxc` options ([#9370](https://github.com/hashicorp/terraform-provider-azurerm/issues/9370))\n* `azurerm_policy_set_definition` - support for the `policy_definition_group` block ([#9259](https://github.com/hashicorp/terraform-provider-azurerm/issues/9259))\n* `azurerm_postgresql_server` - increase max storage to 16TiB ([#9373](https://github.com/hashicorp/terraform-provider-azurerm/issues/9373))\n* `azurerm_private_dns_zone` - support for the `soa_record` block ([#9319](https://github.com/hashicorp/terraform-provider-azurerm/issues/9319))\n* `azurerm_storage_blob` - support for `content_md5` ([#7786](https://github.com/hashicorp/terraform-provider-azurerm/issues/7786))\n* `azurerm_windows_virtual_machine` - support for the `extensions_time_budget` property ([#9257](https://github.com/hashicorp/terraform-provider-azurerm/issues/9257))\n* `azurerm_windows_virtual_machine` - updating the `dedicated_host_id` nolonger forces a new resource ([#9264](https://github.com/hashicorp/terraform-provider-azurerm/issues/9264))\n* `azurerm_windows_virtual_machine` - support for graceful shutdowns (via the features block) ([#8470](https://github.com/hashicorp/terraform-provider-azurerm/issues/8470))\n* `azurerm_windows_virtual_machine` - support for the `patch_mode` property ([#9258](https://github.com/hashicorp/terraform-provider-azurerm/issues/9258))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `platform_fault_domain_count`, `disk_iops_read_write`, and `disk_mbps_read_write` properties ([#9262](https://github.com/hashicorp/terraform-provider-azurerm/issues/9262))\n\nBUG FIXES:\n\n* Data Source: `azurerm_key_vault_certificate` - fixing a crash when serializing the certificate policy block ([#9355](https://github.com/hashicorp/terraform-provider-azurerm/issues/9355))\n* `azurerm_api_management` - the field `xml_content` within the `policy` block now supports C#/.net interpolations ([#9296](https://github.com/hashicorp/terraform-provider-azurerm/issues/9296))\n* `azurerm_cosmosdb_sql_container` - no longer attempts to get throughput settings when Azure Cosmos DB account is serverless ([#9311](https://github.com/hashicorp/terraform-provider-azurerm/issues/9311))\n* `azurerm_firewall_policy` - deprecate the `dns.network_rule_fqdn_enabled` property as the API no longer allows it to be set ([#9332](https://github.com/hashicorp/terraform-provider-azurerm/issues/9332))\n* `azurerm_key_vault_certificate` - fixing a crash when serializing the certificate policy block ([#9355](https://github.com/hashicorp/terraform-provider-azurerm/issues/9355))\n* `azurerm_mssql_virtual_machine` - fixing a crash when serializing `auto_patching` ([#9388](https://github.com/hashicorp/terraform-provider-azurerm/issues/9388))\n* `azurerm_resource_group_template_deployment` - fixing an issue during deletion where the API version of nested resources couldn't be determined ([#9364](https://github.com/hashicorp/terraform-provider-azurerm/issues/9364))\n\n## 2.36.0 (November 12, 2020)\n\nUPGRADE NOTES:\n\n* `azurerm_network_connection_monitor` - has been updated to work with v2 of the resource as the service team is deprecating v1 - all v1 properties have been deprecated and will be removed in version `3.0` of the provider and v2 propeties added. ([#8640](https://github.com/hashicorp/terraform-provider-azurerm/issues/8640))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_data_share_dataset_kusto_database` ([#8544](https://github.com/hashicorp/terraform-provider-azurerm/issues/8544))\n* **New Data Source:** `azurerm_traffic_manager_profile` ([#9229](https://github.com/hashicorp/terraform-provider-azurerm/issues/9229))\n* **New Resource:** `azurerm_api_management_custom_domain` ([#8228](https://github.com/hashicorp/terraform-provider-azurerm/issues/8228))\n* **New Resource:** `azurerm_data_share_dataset_kusto_database` ([#8544](https://github.com/hashicorp/terraform-provider-azurerm/issues/8544))\n* **New Resource:** `azurerm_log_analytics_storage_insights` ([#9014](https://github.com/hashicorp/terraform-provider-azurerm/issues/9014))\n* **New Resource:** `azurerm_monitor_smart_detector_alert_rule` ([#9032](https://github.com/hashicorp/terraform-provider-azurerm/issues/9032))\n* **New Resource:** `azurerm_virtual_hub_security_partner_provider` ([#8978](https://github.com/hashicorp/terraform-provider-azurerm/issues/8978))\n* **New Resource:** `azurerm_virtual_hub_bgp_connection` ([#8959](https://github.com/hashicorp/terraform-provider-azurerm/issues/8959))\n\nIMPROVEMENTS:\n\n* dependencies: upgrading to `v0.4.2` of `github.com/Azure/go-autorest/autorest/azure/cli` ([#9168](https://github.com/hashicorp/terraform-provider-azurerm/issues/9168))\n* dependencies: upgrading to `v48.1.0` of `github.com/Azure/azure-sdk-for-go` ([#9213](https://github.com/hashicorp/terraform-provider-azurerm/issues/9213))\n* dependencies: upgrading to `v0.13.0` of `github.com/hashicorp/go-azure-helpers` ([#9191](https://github.com/hashicorp/terraform-provider-azurerm/issues/9191))\n* dependencies: upgrading to `v0.14.0` of `github.com/tombuildsstuff/giovanni` ([#9189](https://github.com/hashicorp/terraform-provider-azurerm/issues/9189))\n* storage: upgrading the Data Plane API's to API Version `2019-12-12` ([#9192](https://github.com/hashicorp/terraform-provider-azurerm/issues/9192))\n* Data Source `azurerm_kubernetes_node_pool` - exporting `proximity_placement_group_id` ([#9195](https://github.com/hashicorp/terraform-provider-azurerm/issues/9195))\n* `azurerm_app_service` support `v5.0` for the `dotnet_framework_version` ([#9251](https://github.com/hashicorp/terraform-provider-azurerm/issues/9251))\n* `azurerm_availability_set` - adding validation to the `name` field ([#9279](https://github.com/hashicorp/terraform-provider-azurerm/issues/9279))\n* `azurerm_cosmosdb_account` - support for the `key_vault_key_id` property allowing use of Customer Managed Keys ([#8919](https://github.com/hashicorp/terraform-provider-azurerm/issues/8919))\n* `azurerm_eventgrid_domain` - adding validation to the `name` field ([#9281](https://github.com/hashicorp/terraform-provider-azurerm/issues/9281))\n* `azurerm_eventgrid_domain_topic` - adding validation to the `name` field ([#9281](https://github.com/hashicorp/terraform-provider-azurerm/issues/9281))\n* `azurerm_eventgrid_domain_topic` - adding validation to the `domain_name` field ([#9281](https://github.com/hashicorp/terraform-provider-azurerm/issues/9281))\n* `azurerm_eventgrid_event_subscription` - adding validation to the `name` field ([#9281](https://github.com/hashicorp/terraform-provider-azurerm/issues/9281))\n* `azurerm_eventgrid_topic` - adding validation to the `name` field ([#9281](https://github.com/hashicorp/terraform-provider-azurerm/issues/9281))\n* `azurerm_eventgrid_system_topic` - adding validation to the `name` field ([#9281](https://github.com/hashicorp/terraform-provider-azurerm/issues/9281))\n* `azurerm_function_app` - support for the `health_check_path` property under site_config ([#9233](https://github.com/hashicorp/terraform-provider-azurerm/issues/9233))\n* `azurerm_linux_virtual_machine` - support for managed boot diagnostics by leaving the `storage_account_uri` property empty ([#8917](https://github.com/hashicorp/terraform-provider-azurerm/issues/8917))\n* `azurerm_linux_virtual_machine_scale_set` - support for managed boot diagnostics by leaving the `storage_account_uri` property empty ([#8917](https://github.com/hashicorp/terraform-provider-azurerm/issues/8917))\n* `azurerm_log_analytics_workspace` - support for the `internet_ingestion_enabled` and `internet_query_enabled` properties ([#9033](https://github.com/hashicorp/terraform-provider-azurerm/issues/9033))\n* `azurerm_logic_app_workflow` added logicapp name validation ([#9282](https://github.com/hashicorp/terraform-provider-azurerm/issues/9282))\n* `azurerm_kubernetes_cluster` - support for `proximity_placement_group_id` within the `default_node_pool` block ([#9195](https://github.com/hashicorp/terraform-provider-azurerm/issues/9195))\n* `azurerm_kubernetes_node_pool` - support for `proximity_placement_group_id` ([#9195](https://github.com/hashicorp/terraform-provider-azurerm/issues/9195))\n* `azurerm_policy_remediation` - support for the `resource_discovery_mode` property ([#9210](https://github.com/hashicorp/terraform-provider-azurerm/issues/9210))\n* `azurerm_point_to_site_vpn_gateway` - support for the `route` block ([#9158](https://github.com/hashicorp/terraform-provider-azurerm/issues/9158))\n* `azurerm_virtual_network` - support for the `bgp_community` and `vnet_protection_enabled` ([#8979](https://github.com/hashicorp/terraform-provider-azurerm/issues/8979))\n* `azurerm_vpn_gateway` - support for the `instance_0_bgp_peering_addresses` and `instance_1_bgp_peering_addresses` blocks ([#9035](https://github.com/hashicorp/terraform-provider-azurerm/issues/9035))\n* `azurerm_windows_virtual_machine` - support for managed boot diagnostics by leaving the `storage_account_uri` property empty ([#8917](https://github.com/hashicorp/terraform-provider-azurerm/issues/8917))\n* `azurerm_windows_virtual_machine_scale_set` - support for managed boot diagnostics by leaving the `storage_account_uri` property empty ([#8917](https://github.com/hashicorp/terraform-provider-azurerm/issues/8917))\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_sql_database`  no longer attempts to get throughput settings when Azure Cosmos DB account is serverless ([#9187](https://github.com/hashicorp/terraform-provider-azurerm/issues/9187))\n* `azurerm_kubernetes_cluster` - changing the field `availability_zones` within the `default_node_pool` block now requires recreating the resource to match the behaviour of the Azure API ([#8814](https://github.com/hashicorp/terraform-provider-azurerm/issues/8814))\n* `azurerm_kubernetes_cluster_node_pool` - changing the field `availability_zones` now requires recreating the resource to match the behaviour of the Azure API ([#8814](https://github.com/hashicorp/terraform-provider-azurerm/issues/8814))\n* `azurerm_log_analytics_workspace` - fix the `Free` tier from setting the `daily_quota_gb` property ([#9228](https://github.com/hashicorp/terraform-provider-azurerm/issues/9228))\n* `azurerm_linux_virtual_machine` - the field `disk_size_gb` within the `os_disk` block can now be configured up to `4095` ([#9202](https://github.com/hashicorp/terraform-provider-azurerm/issues/9202))\n* `azurerm_linux_virtual_machine_scale_set` - the field `disk_size_gb` within the `os_disk` block can now be configured up to `4095` ([#9202](https://github.com/hashicorp/terraform-provider-azurerm/issues/9202))\n* `azurerm_linux_virtual_machine_scale_set` - the field `computer_name_prefix` can now end with a dash ([#9182](https://github.com/hashicorp/terraform-provider-azurerm/issues/9182))\n* `azurerm_windows_virtual_machine` - the field `disk_size_gb` within the `os_disk` block can now be configured up to `4095` ([#9202](https://github.com/hashicorp/terraform-provider-azurerm/issues/9202))\n* `azurerm_windows_virtual_machine_scale_set` - the field `disk_size_gb` within the `os_disk` block can now be configured up to `4095` ([#9202](https://github.com/hashicorp/terraform-provider-azurerm/issues/9202))\n\n## 2.35.0 (November 05, 2020)\n\nUPGRADE NOTES:\n\n* `azurerm_kubernetes_cluster` - the field `enable_pod_security_policy` and `node_taints` (within the `default_node_pool` block) can no longer be configured - see below for more details ([#8982](https://github.com/hashicorp/terraform-provider-azurerm/issues/8982))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_images` ([#8629](https://github.com/hashicorp/terraform-provider-azurerm/issues/8629))\n* **New Resource:** `azurerm_firewall_policy_rule_collection_group` ([#8603](https://github.com/hashicorp/terraform-provider-azurerm/issues/8603))\n* **New Resource:** `azurerm_virtual_hub_ip_configuration` ([#8912](https://github.com/hashicorp/terraform-provider-azurerm/issues/8912))\n* **New Resource:** `azurerm_virtual_hub_route_table` ([#8939](https://github.com/hashicorp/terraform-provider-azurerm/issues/8939))\n\nIMPROVEMENTS:\n\n* dependencies: updating `containerservice` to API version `2020-09-01` ([#8982](https://github.com/hashicorp/terraform-provider-azurerm/issues/8982))\n* dependencies: updating `iottimeseriesinsights` to API Version `2020-05-15` ([#9129](https://github.com/hashicorp/terraform-provider-azurerm/issues/9129))\n* `azurerm_data_factory_linked_service_data_lake_storage_gen2` - Supports managed identity auth through `use_managed_identity ` ([#8938](https://github.com/hashicorp/terraform-provider-azurerm/issues/8938))\n* `azurerm_firewall` - support the `dns_servers` property ([#8878](https://github.com/hashicorp/terraform-provider-azurerm/issues/8878))\n* `azurerm_firewall_network_rule_collection` - support the `destination_fqdns` property in the `rule` block ([#8878](https://github.com/hashicorp/terraform-provider-azurerm/issues/8878))\n* `azurerm_virtual_hub_connection` - support for the `routing` block ([#8950](https://github.com/hashicorp/terraform-provider-azurerm/issues/8950))\n\nBUG FIXES:\n\n* Fixed regression that prevented Synapse client registering in all Azure environments ([#9100](https://github.com/hashicorp/terraform-provider-azurerm/issues/9100))\n* `azurerm_cosmosdb_mongo_database` no longer attempts to get throughput settings when Azure Cosmos DB account is serverless ([#8673](https://github.com/hashicorp/terraform-provider-azurerm/issues/8673))\n* `azurerm_key_vault_access_policy` - check access policy consistency before committing to state ([#9125](https://github.com/hashicorp/terraform-provider-azurerm/issues/9125))\n* `azurerm_kubernetes_cluster` - the field `enable_pod_security_policy` can no longer be set, due to this functionality being removed from AKS as of `2020-10-15` ([#8982](https://github.com/hashicorp/terraform-provider-azurerm/issues/8982))\n* `azurerm_kubernetes_cluster` - the field `node_taints` can no longer be set on the `default_node_pool` block, to match the behaviour of AKS ([#8982](https://github.com/hashicorp/terraform-provider-azurerm/issues/8982))\n* `azurerm_virtual_desktop_application_group` - adding validation to the `host_pool_id` field ([#9057](https://github.com/hashicorp/terraform-provider-azurerm/issues/9057))\n* `azurerm_virtual_desktop_workspace_application_group_association` - adding validation to the `application_group_id` field ([#9057](https://github.com/hashicorp/terraform-provider-azurerm/issues/9057))\n* `azurerm_virtual_desktop_workspace_application_group_association` - adding validation to the `workspace_id` field ([#9057](https://github.com/hashicorp/terraform-provider-azurerm/issues/9057))\n* `azurerm_virtual_desktop_workspace_application_group_association` - validating the ID during import is a Workspace Application Group Association ID ([#9057](https://github.com/hashicorp/terraform-provider-azurerm/issues/9057))\n* `azurerm_postgresql_firewall_rule` - add validation for `start_ip_address` and `end_ip_address` properties ([#8963](https://github.com/hashicorp/terraform-provider-azurerm/issues/8963))\n\n\n## 2.34.0 (October 29, 2020)\n\nUPGRADE NOTES\n\n* `azurerm_api_management_api` - fixing a regression introduced in v2.16 where this value for `subscription_required` was defaulted to `false` instead of `true` ([#7963](https://github.com/hashicorp/terraform-provider-azurerm/issues/7963))\n\nFEATURES: \n\n* **New Data Source:** `azurerm_cognitive_account` ([#8773](https://github.com/hashicorp/terraform-provider-azurerm/issues/8773))\n* **New Resource:** `azurerm_log_analytics_data_export_rule` ([#8995](https://github.com/hashicorp/terraform-provider-azurerm/issues/8995))\n* **New Resource:** `azurerm_log_analytics_linked_storage_account` ([#9002](https://github.com/hashicorp/terraform-provider-azurerm/issues/9002))\n* **New Resource:** `azurerm_security_center_auto_provisioning` ([#8595](https://github.com/hashicorp/terraform-provider-azurerm/issues/8595))\n* **New Resource:** `azurerm_synapse_role_assignment` ([#8863](https://github.com/hashicorp/terraform-provider-azurerm/issues/8863))\n* **New Resource:** `azurerm_vpn_site` ([#8896](https://github.com/hashicorp/terraform-provider-azurerm/issues/8896))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_policy_definition` - can now look up built-in policy by name ([#9078](https://github.com/hashicorp/terraform-provider-azurerm/issues/9078))\n* `azurerm_backup_policy_vm` - support for the property `instant_restore_retention_days` ([#8822](https://github.com/hashicorp/terraform-provider-azurerm/issues/8822))\n* `azurerm_container_group` - support for the property `git_repo` within the `volume` block ([#7924](https://github.com/hashicorp/terraform-provider-azurerm/issues/7924))\n* `azurerm_iothub` - support for the `resource_group` property within the `endpoint` block ([#8032](https://github.com/hashicorp/terraform-provider-azurerm/issues/8032))\n* `azurerm_key_vault` - support for the `contact` block ([#8937](https://github.com/hashicorp/terraform-provider-azurerm/issues/8937))\n* `azurerm_log_analytics_saved_search` - support for `tags` ([#9034](https://github.com/hashicorp/terraform-provider-azurerm/issues/9034))\n* `azurerm_log_analytics_solution` - support for `tags` ([#9048](https://github.com/hashicorp/terraform-provider-azurerm/issues/9048))\n* `azurerm_logic_app_trigger_recurrence` - support for `time_zone` [[#8829](https://github.com/hashicorp/terraform-provider-azurerm/issues/8829)] \n* `azurerm_policy_definition` - can now look up builtin policy by name ([#9078](https://github.com/hashicorp/terraform-provider-azurerm/issues/9078))\n\nBUG FIXES: \n\n* `azurerm_automation_module` - raising the full error from the Azure API during creation ([#8498](https://github.com/hashicorp/terraform-provider-azurerm/issues/8498))\n* `azurerm_api_management_api` - fixing a regression introduced in v2.16 where the value for `subscription_required` was defaulted to `false` instead of `true` ([#7963](https://github.com/hashicorp/terraform-provider-azurerm/issues/7963))\n* `azurerm_app_service` - fixing a crash when provisioning an app service inside an App Service Environment which doesn't exist ([#8993](https://github.com/hashicorp/terraform-provider-azurerm/issues/8993))\n* `azurerm_cdn_endpoint` - disable persisting default value for `is_compression_enabled` to state file ([#8610](https://github.com/hashicorp/terraform-provider-azurerm/issues/8610))\n* `azurerm_databricks_workspace` correctly validate the `name` property ([#8997](https://github.com/hashicorp/terraform-provider-azurerm/issues/8997))\n* `azurerm_dev_test_policy` - now correctly deletes ([#9077](https://github.com/hashicorp/terraform-provider-azurerm/issues/9077))\n* `azurerm_log_analytics_workspace` - support for the `daily_quota_gb` property ([#8861](https://github.com/hashicorp/terraform-provider-azurerm/issues/8861))\n* `azurerm_local_network_gateway` - support for the `gateway_fqdn` property ([#8998](https://github.com/hashicorp/terraform-provider-azurerm/issues/8998))\n* `azurerm_key_vault` - prevent unwanted diff due to inconsistent casing for the `sku_name` property ([#8983](https://github.com/hashicorp/terraform-provider-azurerm/issues/8983))\n* `azurerm_kubernetes_cluster` - fix issue where `min_count` and `max_count` couldn't be equal ([#8957](https://github.com/hashicorp/terraform-provider-azurerm/issues/8957))\n* `azurerm_kubernetes_cluster` - `min_count` can be updated when `enable_auto_scaling` is set to true ([#8619](https://github.com/hashicorp/terraform-provider-azurerm/issues/8619))\n* `azurerm_private_dns_zone_virtual_network_link` - fixes case issue in `name` ([#8617](https://github.com/hashicorp/terraform-provider-azurerm/issues/8617))\n* `azurerm_private_endpoint` - fix crash when deleting private endpoint ([#9068](https://github.com/hashicorp/terraform-provider-azurerm/issues/9068))\n* `azurerm_signalr_service` - switching the`features` block to a set so order is irrelevant ([#8815](https://github.com/hashicorp/terraform-provider-azurerm/issues/8815))\n* `azurerm_virtual_desktop_application_group` - correctly validate the `name`property ([#9030](https://github.com/hashicorp/terraform-provider-azurerm/issues/9030))\n\n## 2.33.0 (October 22, 2020)\n\nUPGRADE NOTES\n\n* This release includes a workaround for [a breaking change in Azure’s API related to the Extended Auditing Policy](https://github.com/Azure/azure-rest-api-specs/issues/11271) of the SQL and MSSQL resources. The Service Team have confirmed that this Regression will first roll out to all regions before the bug fix is deployed - as such this workaround will be removed in a future release once the fix for the Azure API has been rolled out to all regions.\n\nFEATURES: \n\n* **New Resource:** `azurerm_service_fabric_mesh_secret` ([#8933](https://github.com/hashicorp/terraform-provider-azurerm/issues/8933))\n* **New Resource:** `azurerm_service_fabric_mesh_secret_value` ([#8933](https://github.com/hashicorp/terraform-provider-azurerm/issues/8933))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_shared_image_version` - exposing `os_disk_image_size_gb` ([#8904](https://github.com/hashicorp/terraform-provider-azurerm/issues/8904))\n* `azurerm_app_configuration` - support for the `identity` block ([#8875](https://github.com/hashicorp/terraform-provider-azurerm/issues/8875))\n* `azurerm_cosmosdb_sql_container` - support for composite indexes ([#8792](https://github.com/hashicorp/terraform-provider-azurerm/issues/8792))\n* `azurerm_mssql_database` - do not set longterm and shortterm retention policies when using the `DW` SKUs ([#8899](https://github.com/hashicorp/terraform-provider-azurerm/issues/8899))\n* `azurerm_mysql_firewall_rule` - validating the `start_ip_address` and `end_ip_address` fields are IP Addresses ([#8948](https://github.com/hashicorp/terraform-provider-azurerm/issues/8948))\n* `azurerm_redis_firewall_rule` - validating the `start_ip` and `end_ip` fields are IP Addresses ([#8948](https://github.com/hashicorp/terraform-provider-azurerm/issues/8948))\n* `azurerm_search_service` - support for the `identity` block ([#8907](https://github.com/hashicorp/terraform-provider-azurerm/issues/8907))\n* `azurerm_sql_firewall_rule` - adding validation for the `start_ip_address` and `end_ip_address` fields ([#8935](https://github.com/hashicorp/terraform-provider-azurerm/issues/8935))\n\nBUG FIXES:\n\n* `azurerm_application_gateway` - now supports `ignore_changes` for `ssl_certificate` when using pre-existing certificates ([#8761](https://github.com/hashicorp/terraform-provider-azurerm/issues/8761))\n* `azurerm_mssql_database` - working around a breaking change/regression in the Azure API ([#8975](https://github.com/hashicorp/terraform-provider-azurerm/issues/8975))\n* `azurerm_mssql_database_extended_auditing_policy` - working around a breaking change/regression in the Azure API ([#8975](https://github.com/hashicorp/terraform-provider-azurerm/issues/8975))\n* `azurerm_mssql_server` - working around a breaking change/regression in the Azure API ([#8975](https://github.com/hashicorp/terraform-provider-azurerm/issues/8975))\n* `azurerm_mssql_server_extended_auditing_policy` - working around a breaking change/regression in the Azure API ([#8975](https://github.com/hashicorp/terraform-provider-azurerm/issues/8975))\n* `azurerm_sql_database` - working around a breaking change/regression in the Azure API ([#8975](https://github.com/hashicorp/terraform-provider-azurerm/issues/8975))\n* `azurerm_sql_server` - working around a breaking change/regression in the Azure API ([#8975](https://github.com/hashicorp/terraform-provider-azurerm/issues/8975))\n* `azurerm_policy_set_definition` - Fix updates for `parameters` and `parameter_values` in `policy_definition_reference` blocks ([#8882](https://github.com/hashicorp/terraform-provider-azurerm/issues/8882))\n\n## 2.32.0 (October 15, 2020)\n\nFEATURES:\n\n* **New data source:** `azurerm_mysql_server` ([#8787](https://github.com/hashicorp/terraform-provider-azurerm/issues/8787))\n* **New resource:** `azurerm_security_center_setting` ([#8783](https://github.com/hashicorp/terraform-provider-azurerm/issues/8783))\n* **New Resource:** `azurerm_service_fabric_mesh_local_network` ([#8838](https://github.com/hashicorp/terraform-provider-azurerm/issues/8838))\n* **New resource:** `azurerm_eventgrid_system_topic` ([#8735](https://github.com/hashicorp/terraform-provider-azurerm/issues/8735))\n\nIMPROVEMENTS:\n\n* `azurerm_container_registry` - support for the `trust_policy` and `retention_policy` blocks ([#8698](https://github.com/hashicorp/terraform-provider-azurerm/issues/8698))\n* `azurerm_security_center_contact` - override SDK creat function to handle `201` response code ([#8774](https://github.com/hashicorp/terraform-provider-azurerm/issues/8774))\n\n## 2.31.1 (October 08, 2020)\n\nIMPROVEMENTS:\n\n* `azurerm_cognitive_account` - `kind` now supports `Personalizer` ([#8860](https://github.com/hashicorp/terraform-provider-azurerm/issues/8860))\n* `azurerm_search_service` - `sku` now supports `storage_optimized_l1` and `storage_optimized_l2` ([#8859](https://github.com/hashicorp/terraform-provider-azurerm/issues/8859))\n* `azurerm_storage_share` - set `metadata` to `Computed` and set `acl` `start` and `expiry` to `Optional` ([#8811](https://github.com/hashicorp/terraform-provider-azurerm/issues/8811))\n\nBUG FIXES:\n\n* `azurerm_dedicated_hardware_security_module` - `stamp_id` now optional to allow use in Locations which use `zones` ([#8826](https://github.com/hashicorp/terraform-provider-azurerm/issues/8826))\n* `azurerm_storage_account`-`large_file_share_enabled` marked as computed to prevent existing storage shares from attempting to disable the default ([#8807](https://github.com/hashicorp/terraform-provider-azurerm/issues/8807))\n\n## 2.31.0 (October 08, 2020)\n\nUPGRADE NOTES\n\n* This release updates the `azurerm_security_center_subscription_pricing` resource to use the latest version of the Security API which now allows configuring multiple Resource Types - as such a new field `resource_type` is now available. Configurations default the `resource_type` to `VirtualMachines` which matches the behaviour of the previous release - but your Terraform Configuration may need updating.\n\nFEATURES:\n\n* **New Resource:** `azurerm_service_fabric_mesh_application` ([#6761](https://github.com/hashicorp/terraform-provider-azurerm/issues/6761))\n* **New Resource:** `azurerm_virtual_desktop_application_group` ([#8605](https://github.com/hashicorp/terraform-provider-azurerm/issues/8605))\n* **New Resource:** `azurerm_virtual_desktop_workspace_application_group_association` ([#8605](https://github.com/hashicorp/terraform-provider-azurerm/issues/8605))\n* **New Resource:** `azurerm_virtual_desktop_host_pool` ([#8605](https://github.com/hashicorp/terraform-provider-azurerm/issues/8605))\n* **New Resource:** `azurerm_virtual_desktop_workspace` ([#8605](https://github.com/hashicorp/terraform-provider-azurerm/issues/8605))\n\nIMPROVEMENTS:\n\n* dependencies: updating `github.com/Azure/azure-sdk-for-go` to `v46.4.0` ([#8642](https://github.com/hashicorp/terraform-provider-azurerm/issues/8642))\n* `data.azurerm_application_insights` - support for the `connection_string` property ([#8699](https://github.com/hashicorp/terraform-provider-azurerm/issues/8699))\n* `azurerm_app_service` - support for IPV6 addresses in the `ip_restriction` property ([#8599](https://github.com/hashicorp/terraform-provider-azurerm/issues/8599))\n* `azurerm_application_insights` - support for the `connection_string` property ([#8699](https://github.com/hashicorp/terraform-provider-azurerm/issues/8699))\n* `azurerm_backup_policy_vm` - validate daily backups is > `7` ([#7898](https://github.com/hashicorp/terraform-provider-azurerm/issues/7898))\n* `azurerm_dedicated_host` - add support for the `DSv4-Type1` and `sku_name` properties ([#8718](https://github.com/hashicorp/terraform-provider-azurerm/issues/8718))\n* `azurerm_iothub` - Support for the `public_network_access_enabled` property ([#8586](https://github.com/hashicorp/terraform-provider-azurerm/issues/8586))\n* `azurerm_key_vault_certificate_issuer` - the `org_id` property is now optional ([#8687](https://github.com/hashicorp/terraform-provider-azurerm/issues/8687))\n* `azurerm_kubernetes_cluster_node_pool` - the `max_node`, `min_node`, and `node_count` properties can now be set to `0` ([#8300](https://github.com/hashicorp/terraform-provider-azurerm/issues/8300))\n* `azurerm_mssql_database` - the `min_capacity` property can now be set to `0` ([#8308](https://github.com/hashicorp/terraform-provider-azurerm/issues/8308))\n* `azurerm_mssql_database` - support for `long_term_retention_policy` and `short_term_retention_policy` blocks [[#8765](https://github.com/hashicorp/terraform-provider-azurerm/issues/8765)] \n* `azurerm_mssql_server` - support the `minimum_tls_version` property ([#8361](https://github.com/hashicorp/terraform-provider-azurerm/issues/8361))\n* `azurerm_mssql_virtual_machine` - support for `storage_configuration_settings` ([#8623](https://github.com/hashicorp/terraform-provider-azurerm/issues/8623))\n* `azurerm_security_center_subscription_pricing` - now supports per `resource_type` pricing ([#8549](https://github.com/hashicorp/terraform-provider-azurerm/issues/8549))\n* `azurerm_storage_account` - support for the `large_file_share_enabled` property ([#8789](https://github.com/hashicorp/terraform-provider-azurerm/issues/8789))\n* `azurerm_storage_share` - support for large quotas (up to `102400` GB) ([#8666](https://github.com/hashicorp/terraform-provider-azurerm/issues/8666))\n\nBUG FIXES:\n\n* `azurerm_function_app` - mark the `app_settings` block as computed ([#8682](https://github.com/hashicorp/terraform-provider-azurerm/issues/8682))\n* `azurerm_function_app_slot` - mark the `app_settings` block as computed ([#8682](https://github.com/hashicorp/terraform-provider-azurerm/issues/8682))\n* `azurerm_policy_set_definition` - corrects issue with empty `parameter_values` attribute ([#8668](https://github.com/hashicorp/terraform-provider-azurerm/issues/8668))\n* `azurerm_policy_definition` - `mode` property now enforces correct case ([#8795](https://github.com/hashicorp/terraform-provider-azurerm/issues/8795))\n\n## 2.30.0 (October 01, 2020)\n\nUPGRADE NOTES\n\n* This release renames certain fields within the `azurerm_cosmosdb_account` (data source & resource) and `azurerm_function_app_host_keys` data source to follow HashiCorp's [inclusive language guidelines](https://discuss.hashicorp.com/t/inclusive-language-changes) - where fields have been renamed, existing fields will continue to remain available until the next major version of the Azure Provider (`v3.0`)\n\nFEATURES: \n\n* **New Data Source:** `azurerm_cosmosdb_sql_storedprocedure` ([#6189](https://github.com/hashicorp/terraform-provider-azurerm/issues/6189))\n* **New Data Source:** `azurerm_ip_groups` ([#8556](https://github.com/hashicorp/terraform-provider-azurerm/issues/8556))\n* **New Resource:** `azurerm_ip_groups` ([#8556](https://github.com/hashicorp/terraform-provider-azurerm/issues/8556))\n* **New Resource:** `azurerm_resource_group_template_deployment` ([#8672](https://github.com/hashicorp/terraform-provider-azurerm/issues/8672))\n* **New Resource:** `azurerm_subscription_template_deployment` ([#8672](https://github.com/hashicorp/terraform-provider-azurerm/issues/8672))\n\nIMPROVEMENTS:\n\n* dependencies: updating `iothub` to `2020-03-01` ([#8688](https://github.com/hashicorp/terraform-provider-azurerm/issues/8688))\n* dependencies: updating `storagecache` to `2020-03-01` ([#8078](https://github.com/hashicorp/terraform-provider-azurerm/issues/8078))\n* dependencies: updating `resources` to API Version `2020-06-01` ([#8672](https://github.com/hashicorp/terraform-provider-azurerm/issues/8672))\n* `azurerm_analysis_services_server` - support for the `S8v2` and `S9v2` SKU's ([#8707](https://github.com/hashicorp/terraform-provider-azurerm/issues/8707))\n* `azurerm_cognitive_account` - support for the `S` `sku` ([#8639](https://github.com/hashicorp/terraform-provider-azurerm/issues/8639))\n* `azurerm_container_group` - support for the `dns_config` block ([#7912](https://github.com/hashicorp/terraform-provider-azurerm/issues/7912))\n* `azurerm_cosmosdb_account` - support the `zone_reduntant` property ([#8295](https://github.com/hashicorp/terraform-provider-azurerm/issues/8295))\n* `azurerm_cosmosdb_mongo_collection` - will now respect the order of the `keys` property in the `index` block ([#8602](https://github.com/hashicorp/terraform-provider-azurerm/issues/8602))\n* `azurerm_hpc_cache` -  support the `mtu` and `root_squash_enabled` properties ([#8078](https://github.com/hashicorp/terraform-provider-azurerm/issues/8078))\n* `azurerm_key_vault` - add support for `enable_rbac_authorization` ([#8670](https://github.com/hashicorp/terraform-provider-azurerm/issues/8670))\n* `azurerm_lighthouse_assignment` - limit the `scope` property to subsriptions ([#8601](https://github.com/hashicorp/terraform-provider-azurerm/issues/8601))\n* `azurerm_logic_app_workflow` - support for the `integration_service_environment_id` property ([#8504](https://github.com/hashicorp/terraform-provider-azurerm/issues/8504))\n* `azurerm_servicebus_topic` - validate the `max_size_in_megabytes` property ([#8648](https://github.com/hashicorp/terraform-provider-azurerm/issues/8648))\n* `azurerm_servicebus_queue` - validate the `max_size_in_megabytes` property ([#8648](https://github.com/hashicorp/terraform-provider-azurerm/issues/8648))\n* `azurerm_servicebus_subscription_rule` - support the `correlation_filter.properties` property ([#8646](https://github.com/hashicorp/terraform-provider-azurerm/issues/8646))\n* `azurerm_storage_management_policy` - support the `appendBlob` value for `blob_types` ([#8659](https://github.com/hashicorp/terraform-provider-azurerm/issues/8659))\n\n\nBUG FIXES:\n\n* `azurerm_monitor_metric_alert` - property wait when creating/updating multiple monitor metric alerts ([#8667](https://github.com/hashicorp/terraform-provider-azurerm/issues/8667))\n* `azurerm_linux_virtual_machine_scale_set` - fix empty JSON error in `settings` and `protected_settings` when these values are not used ([#8627](https://github.com/hashicorp/terraform-provider-azurerm/issues/8627))\n\n## 2.29.0 (September 24, 2020)\n\nUPGRADE NOTES:\n\n* `azurerm_api_management` - the value `None` has been removed from the `identity` block to match other resources, to specify an API Management Service with no Managed Identity remove the `identity` block ([#8411](https://github.com/hashicorp/terraform-provider-azurerm/issues/8411))\n* `azurerm_container_registry` -  the `storage_account_id` property now forces a new resource as required by the updated API version ([#8477](https://github.com/hashicorp/terraform-provider-azurerm/issues/8477))\n* `azurerm_virtual_hub_connection` - deprecating the field `vitual_network_to_hub_gateways_traffic_allowed` since due to a breaking change in the API behaviour this is no longer used ([#7601](https://github.com/hashicorp/terraform-provider-azurerm/issues/7601))\n* `azurerm_virtual_hub_connection` - deprecating the field `hub_to_vitual_network_traffic_allowed` since due to a breaking change in the API behaviour this is no longer used ([#7601](https://github.com/hashicorp/terraform-provider-azurerm/issues/7601))\n* `azurerm_virtual_wan` - deprecating the field `allow_vnet_to_vnet_traffic` since due to a breaking change in the API behaviour this is no longer used ([#7601](https://github.com/hashicorp/terraform-provider-azurerm/issues/7601))\n\nFEATURES: \n\n* **New Data Source:** `azurerm_data_share_dataset_kusto_cluster` ([#8464](https://github.com/hashicorp/terraform-provider-azurerm/issues/8464))\n* **New Data Source:** `azurerm_databricks_workspace` ([#8502](https://github.com/hashicorp/terraform-provider-azurerm/issues/8502))\n* **New Data Source:** `azurerm_firewall_policy` ([#7390](https://github.com/hashicorp/terraform-provider-azurerm/issues/7390))\n* **New Data Source:** `azurerm_storage_sync_group` ([#8462](https://github.com/hashicorp/terraform-provider-azurerm/issues/8462))\n* **New Data Source:** `azurerm_mssql_server` ([#7917](https://github.com/hashicorp/terraform-provider-azurerm/issues/7917))\n* **New Resource:** `azurerm_data_share_dataset_kusto_cluster` ([#8464](https://github.com/hashicorp/terraform-provider-azurerm/issues/8464))\n* **New Resource:** `azurerm_firewall_policy` ([#7390](https://github.com/hashicorp/terraform-provider-azurerm/issues/7390))\n* **New Resource:** `azurerm_mysql_server_key` ([#8125](https://github.com/hashicorp/terraform-provider-azurerm/issues/8125))\n* **New Resource:** `azurerm_postgresql_server_key` ([#8126](https://github.com/hashicorp/terraform-provider-azurerm/issues/8126))\n\nIMPROVEMENTS:\n\n* dependencies: updating `github.com/Azure/azure-sdk-for-go` to `v46.3.0` ([#8592](https://github.com/hashicorp/terraform-provider-azurerm/issues/8592))\n* dependencies: updating `containerregistry` to `2019-05-01` ([#8477](https://github.com/hashicorp/terraform-provider-azurerm/issues/8477))\n* Data Source: `azurerm_api_management` - export the `private_ip_addresses` attribute for primary and additional locations ([#8290](https://github.com/hashicorp/terraform-provider-azurerm/issues/8290))\n* `azurerm_api_management` - support the `virtual_network_configuration` block for additional locations ([#8290](https://github.com/hashicorp/terraform-provider-azurerm/issues/8290))\n* `azurerm_api_management` - export the `private_ip_addresses` attribute for additional locations ([#8290](https://github.com/hashicorp/terraform-provider-azurerm/issues/8290))\n* `azurerm_cosmosdb_account` - support the `Serverless` value for the `capabilities` property ([#8533](https://github.com/hashicorp/terraform-provider-azurerm/issues/8533))\n* `azurerm_cosmosdb_sql_container` - support for the `indexing_policy` property ([#8461](https://github.com/hashicorp/terraform-provider-azurerm/issues/8461))\n* `azurerm_mssql_server` - support for the `recover_database_id` and `restore_dropped_database_id` properties ([#7917](https://github.com/hashicorp/terraform-provider-azurerm/issues/7917))\n* `azurerm_policy_set_definition` - support for typed parameter values other then string in `the policy_definition_reference` block deprecating `parameters` in favour of `parameter_vcaluess` ([#8270](https://github.com/hashicorp/terraform-provider-azurerm/issues/8270))\n* `azurerm_search_service` - Add support for `allowed_ips` ([#8557](https://github.com/hashicorp/terraform-provider-azurerm/issues/8557))\n* `azurerm_service_fabric_cluster` - Remove two block limit for `client_certificate_thumbprint` ([#8521](https://github.com/hashicorp/terraform-provider-azurerm/issues/8521))\n* `azurerm_signalr_service` - support for delta updates ([#8541](https://github.com/hashicorp/terraform-provider-azurerm/issues/8541))\n* `azurerm_spring_cloud_service` - support for configuring the `network` block ([#8568](https://github.com/hashicorp/terraform-provider-azurerm/issues/8568))\n* `azurerm_virtual_hub_connection` - deprecating the field `vitual_network_to_hub_gateways_traffic_allowed` since due to a breaking change in the API behaviour this is no longer used ([#7601](https://github.com/hashicorp/terraform-provider-azurerm/issues/7601))\n* `azurerm_virtual_hub_connection` - deprecating the field `hub_to_vitual_network_traffic_allowed` since due to a breaking change in the API behaviour this is no longer used ([#7601](https://github.com/hashicorp/terraform-provider-azurerm/issues/7601))\n* `azurerm_virtual_hub_connection` - switching to use the now separate API for provisioning these resources ([#7601](https://github.com/hashicorp/terraform-provider-azurerm/issues/7601))\n* `azurerm_virtual_wan` - deprecating the field `allow_vnet_to_vnet_traffic` since due to a breaking change in the API behaviour this is no longer used ([#7601](https://github.com/hashicorp/terraform-provider-azurerm/issues/7601))\n* `azurerm_windows_virtual_machine` - support for updating the `license_type` field ([#8542](https://github.com/hashicorp/terraform-provider-azurerm/issues/8542))\n\nBUG FIXES:\n\n* `azurerm_api_management` - the value `None` for the field `type` within the `identity` block has been removed - to remove a managed identity remove the `identity` block ([#8411](https://github.com/hashicorp/terraform-provider-azurerm/issues/8411))\n* `azurerm_app_service` - don't try to manage source_control when scm_type is `VSTSRM` ([#8531](https://github.com/hashicorp/terraform-provider-azurerm/issues/8531))\n* `azurerm_function_app` - don't try to manage source_control when scm_type is `VSTSRM` ([#8531](https://github.com/hashicorp/terraform-provider-azurerm/issues/8531))\n* `azurerm_kubernetes_cluster` - picking the first system node pool if the original `default_node_pool` has been removed ([#8503](https://github.com/hashicorp/terraform-provider-azurerm/issues/8503))\n\n## 2.28.0 (September 17, 2020)\n\nUPGRADE NOTES\n\n* The `id` field for the `azurerm_role_definition` changed in release 2.27.0 to work around a bug in the Azure API when using management groups, where the Scope isn't returned - the existing `id` field is available as `role_definition_resource_id` from this version of the Azure Provider.\n\nFEATURES:\n\n* **New Data Source:** `azurerm_data_share_dataset_data_lake_gen2` [[#7907](https://github.com/hashicorp/terraform-provider-azurerm/issues/7907)] \n* **New Data Source:** `azurerm_servicebus_queue_authorization_rule` ([#8438](https://github.com/hashicorp/terraform-provider-azurerm/issues/8438))\n* **New Data Source:** `azurerm_storage_sync` [[#7843](https://github.com/hashicorp/terraform-provider-azurerm/issues/7843)] \n* **New Resource:** `azurerm_data_share_dataset_data_lake_gen2` ([#7907](https://github.com/hashicorp/terraform-provider-azurerm/issues/7907))\n* **New Resource:** `azurerm_lighthouse_definition` ([#6560](https://github.com/hashicorp/terraform-provider-azurerm/issues/6560))\n* **New Resource:** `azurerm_lighthouse_assignment` ([#6560](https://github.com/hashicorp/terraform-provider-azurerm/issues/6560))\n* **New Resource:** `azurerm_mssql_server_extended_auditing_policy`  ([#8447](https://github.com/hashicorp/terraform-provider-azurerm/issues/8447))\n* **New Resource:** `azurerm_storage_sync` ([#7843](https://github.com/hashicorp/terraform-provider-azurerm/issues/7843))\n* **New Resource:** `azurerm_synapse_sql_pool` ([#8095](https://github.com/hashicorp/terraform-provider-azurerm/issues/8095))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_app_service_environment` - Expose vip information of an app service environment ([#8487](https://github.com/hashicorp/terraform-provider-azurerm/issues/8487))\n* Data Source: `azurerm_function_app` - export the `identity` block ([#8389](https://github.com/hashicorp/terraform-provider-azurerm/issues/8389))\n* `azurerm_app_service_hybrid_connection` - support relays in different namespaces ([#8370](https://github.com/hashicorp/terraform-provider-azurerm/issues/8370))\n* `azurerm_cosmosdb_cassandra_keyspace` - support the `autoscale_settings` block ([#7773](https://github.com/hashicorp/terraform-provider-azurerm/issues/7773))\n* `azurerm_cosmosdb_gremlin_database` - support the `autoscale_settings` block ([#7773](https://github.com/hashicorp/terraform-provider-azurerm/issues/7773))\n* `azurerm_cosmosdb_gremlin_graph` - support the `autoscale_settings` block ([#7773](https://github.com/hashicorp/terraform-provider-azurerm/issues/7773))\n* `azurerm_cosmosdb_mongo_collection` - support the `autoscale_settings` block ([#7773](https://github.com/hashicorp/terraform-provider-azurerm/issues/7773))\n* `azurerm_cosmosdb_mongo_database` - support the `autoscale_settings` block ([#7773](https://github.com/hashicorp/terraform-provider-azurerm/issues/7773))\n* `azurerm_cosmosdb_sql_container` - support the `autoscale_settings` block ([#7773](https://github.com/hashicorp/terraform-provider-azurerm/issues/7773))\n* `azurerm_cosmosdb_sql_database` - support the `autoscale_settings` block ([#7773](https://github.com/hashicorp/terraform-provider-azurerm/issues/7773))\n* `azurerm_cosmosdb_table` - support the `autoscale_settings` block ([#7773](https://github.com/hashicorp/terraform-provider-azurerm/issues/7773))\n* `azurerm_firewall` - support the `management_ip_configuration` block ([#8235](https://github.com/hashicorp/terraform-provider-azurerm/issues/8235))\n* `azurerm_storage_account_customer_managed_key` - support for key rotation ([#7836](https://github.com/hashicorp/terraform-provider-azurerm/issues/7836))\n\nBUG FIXES:\n\n* Data Source: `azurerm_function_app_host_keys` - Fix a crash when null ID sometimes returned by API ([#8430](https://github.com/hashicorp/terraform-provider-azurerm/issues/8430))\n* `azurerm_cognitive_account` - correctly wait on update logic ([#8386](https://github.com/hashicorp/terraform-provider-azurerm/issues/8386))\n* `azurerm_eventhub_consumer_group` - allow the `name` property to be set to `$Default` ([#8388](https://github.com/hashicorp/terraform-provider-azurerm/issues/8388))\n* `azurerm_kubernetes_cluster` - ensure the OMS Agent Log Analytics Workspace case is preserved after disabling/enabling ([#8374](https://github.com/hashicorp/terraform-provider-azurerm/issues/8374))\n* `azurerm_management_group_id` - loosen case restritions during parsing of management group ID ([#8024](https://github.com/hashicorp/terraform-provider-azurerm/issues/8024))\n* `azurerm_packet_capture` - fix to ID path to match change in API ([#8167](https://github.com/hashicorp/terraform-provider-azurerm/issues/8167))\n* `azurerm_role_definition` - expose `role_definition_resource_id` ([#8492](https://github.com/hashicorp/terraform-provider-azurerm/issues/8492))\n\n## 2.27.0 (September 10, 2020)\n\nUPGRADE NOTES\n\n* The `id` field for the `azurerm_role_definition` has changed in this release to work around a bug in the Azure API when using management groups, where the Scope isn't returned - the existing `id` field is available as `role_definition_resource_id` on the new resource from version 2.28.0 of the Azure Provider.\n\nFEATURES:\n\n* **New Data Source:** `azurerm_attestation_provider` ([#7885](https://github.com/hashicorp/terraform-provider-azurerm/issues/7885))\n* **New Data Source:** `azurerm_function_app_host_keys` ([#7902](https://github.com/hashicorp/terraform-provider-azurerm/issues/7902))\n* **New Data Source:** `azurerm_lb_rule` ([#8365](https://github.com/hashicorp/terraform-provider-azurerm/issues/8365))\n* **New Resource:** `azurerm_mssql_database_extended_auditing_policy` ([#7793](https://github.com/hashicorp/terraform-provider-azurerm/issues/7793))\n* **New Resource:** `azurerm_attestation_provider` ([#7885](https://github.com/hashicorp/terraform-provider-azurerm/issues/7885))\n* **New Resource:** `azurerm_api_management_api_diagnostic` ([#7873](https://github.com/hashicorp/terraform-provider-azurerm/issues/7873))\n* **New Resource:** `azurerm_data_factory_linked_service_azure_sql_database` ([#8349](https://github.com/hashicorp/terraform-provider-azurerm/issues/8349))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_virtual_network_gateway` - exposing `aad_audience`, `aad_issuer` and `aad_tenant` within the `vpn_client_configuration` block ([#8294](https://github.com/hashicorp/terraform-provider-azurerm/issues/8294))\n* `azurerm_cosmosdb_account` - supporting the value `AllowSelfServeUpgradeToMongo36` for the `name` field within the `capabilities` block ([#8335](https://github.com/hashicorp/terraform-provider-azurerm/issues/8335))\n* `azurerm_linux_virtual_machine` - Add support for `encryption_at_host_enabled` ([#8322](https://github.com/hashicorp/terraform-provider-azurerm/issues/8322))\n* `azurerm_linux_virtual_machine_scale_set` - Add support for `encryption_at_host_enabled` ([#8322](https://github.com/hashicorp/terraform-provider-azurerm/issues/8322))\n* `azurerm_servicebus_subscription` - add support for `dead_lettering_on_filter_evaluation_error` ([#8412](https://github.com/hashicorp/terraform-provider-azurerm/issues/8412))\n* `azurerm_spring_cloud_app` - support for the `identity` block ([#8336](https://github.com/hashicorp/terraform-provider-azurerm/issues/8336))\n* `azurerm_storage_share_directory` - Update name validation ([#8366](https://github.com/hashicorp/terraform-provider-azurerm/issues/8366))\n* `azurerm_virtual_network_gateway` - support for `aad_audience`, `aad_issuer` and `aad_tenant` within the `vpn_client_configuration` block ([#8294](https://github.com/hashicorp/terraform-provider-azurerm/issues/8294))\n* `azurerm_windows_virtual_machine` - Add support for `encryption_at_host_enabled` ([#8322](https://github.com/hashicorp/terraform-provider-azurerm/issues/8322))\n* `azurerm_windows_virtual_machine_scale_set` - Add support for `encryption_at_host_enabled` ([#8322](https://github.com/hashicorp/terraform-provider-azurerm/issues/8322))\n\nBUG FIXES:\n\n* `azurerm_api_management_x.y.api_name` - validation fix ([#8409](https://github.com/hashicorp/terraform-provider-azurerm/issues/8409))\n* `azurerm_application_insights_webtests` - Fix an issue where the `kind` property is sometimes set to `null` ([#8372](https://github.com/hashicorp/terraform-provider-azurerm/issues/8372))\n* `azurerm_cognitive_account` - Fixes a crash when provisioning a QnAMaker and supports AnomalyDetector ([#8357](https://github.com/hashicorp/terraform-provider-azurerm/issues/8357))\n* `azurerm_linux_virtual_machine` - Add WaitForState on VM delete ([#8383](https://github.com/hashicorp/terraform-provider-azurerm/issues/8383))\n* `azurerm_network_security_group` - fixed issue where updates would fail for resource ([#8384](https://github.com/hashicorp/terraform-provider-azurerm/issues/8384))\n* `azurerm_role_definition` - fixed delete operation when role is scoped to Management Group ([#6107](https://github.com/hashicorp/terraform-provider-azurerm/issues/6107))\n* `azurerm_windows_virtual_machine` - Add WaitForState on VM delete ([#8383](https://github.com/hashicorp/terraform-provider-azurerm/issues/8383))\n\n## 2.26.0 (September 04, 2020)\n\nUPGRADE NOTES:\n\n* **Opt-In Beta:** This release introduces an opt-in beta for in-line Virtual Machine Scale Set Extensions. This functionality enables the resource to be used with Azure Service Fabric and other extensions that may require creation time inclusion on Scale Set members. Please see the documentation for `azurerm_linux_virtual_machine_scale_set` and `azurerm_windows_virtual_machine_scale_set` for information.\n\nFEATURES:\n\n* **New Resource:** `azurerm_log_analytics_saved_search` ([#8253](https://github.com/hashicorp/terraform-provider-azurerm/issues/8253))\n\nIMPROVEMENTS:\n\n* dependencies: updating `loganalytics` to `2020-03-01-preview` ([#8234](https://github.com/hashicorp/terraform-provider-azurerm/issues/8234))\n* `azurerm_api_management_subscription` - Support `allow_tracing property` ([#7969](https://github.com/hashicorp/terraform-provider-azurerm/issues/7969))\n* `azurerm_application_gateway ` - Add support for `probe.properties.port` ([#8278](https://github.com/hashicorp/terraform-provider-azurerm/issues/8278))\n* `azurerm_linux_virtual_machine_scale_set` - Beta support for `extension` blocks ([#8222](https://github.com/hashicorp/terraform-provider-azurerm/issues/8222))\n* `azurerm_log_analytics_workspace`- the `sku` value is now optional and defaults to `PerGB2018` ([#8272](https://github.com/hashicorp/terraform-provider-azurerm/issues/8272))\n* `azurerm_windows_virtual_machine_scale_set` - Beta support for `extension` blocks ([#8222](https://github.com/hashicorp/terraform-provider-azurerm/issues/8222))\n\nBUG FIXES:\n\n* `azurerm_cdn_endpoint` - fixing the casing of the Resource ID to be consistent ([#8237](https://github.com/hashicorp/terraform-provider-azurerm/issues/8237))\n* `azurerm_cdn_profile` - fixing the casing of the Resource ID to be consistent ([#8237](https://github.com/hashicorp/terraform-provider-azurerm/issues/8237))\n* `azurerm_key_vault_key` - updating the latest version of the key when updating metadata ([#8304](https://github.com/hashicorp/terraform-provider-azurerm/issues/8304))\n* `azurerm_key_vault_secret` - updating the latest version of the secret when updating metadata ([#8304](https://github.com/hashicorp/terraform-provider-azurerm/issues/8304))\n* `azurerm_linux_virtual_machine` - allow updating `allow_extension_operations` regardless of the value of `provision_vm_agent` (for when the VM Agent has been installed manually) ([#8001](https://github.com/hashicorp/terraform-provider-azurerm/issues/8001))\n* `azurerm_linux_virtual_machine_scale_set` - working around a bug in the Azure API by always sending the existing Storage Image Reference during updates ([#7983](https://github.com/hashicorp/terraform-provider-azurerm/issues/7983))\n* `azurerm_network_interface_application_gateway_association` - handling the Network Interface being deleted during a refresh ([#8267](https://github.com/hashicorp/terraform-provider-azurerm/issues/8267))\n* `azurerm_network_interface_application_security_group_association` - handling the Network Interface being deleted during a refresh ([#8267](https://github.com/hashicorp/terraform-provider-azurerm/issues/8267))\n* `azurerm_network_interface_backend_address_pool_association` - handling the Network Interface being deleted during a refresh ([#8267](https://github.com/hashicorp/terraform-provider-azurerm/issues/8267))\n* `azurerm_network_interface_nat_rule_association_resource` - handling the Network Interface being deleted during a refresh ([#8267](https://github.com/hashicorp/terraform-provider-azurerm/issues/8267))\n* `azurerm_network_interface_network_security_group_association` - handling the Network Interface being deleted during a refresh ([#8267](https://github.com/hashicorp/terraform-provider-azurerm/issues/8267))\n* `azurerm_windows_virtual_machine` - allow updating `allow_extension_operations` regardless of the value of `provision_vm_agent` (for when the VM Agent has been installed manually) ([#8001](https://github.com/hashicorp/terraform-provider-azurerm/issues/8001))\n* `azurerm_windows_virtual_machine_scale_set` - working around a bug in the Azure API by always sending the existing Storage Image Reference during updates ([#7983](https://github.com/hashicorp/terraform-provider-azurerm/issues/7983))\n\n## 2.25.0 (August 27, 2020)\n\nUPGRADE NOTES:\n\n* `azurerm_container_group` - The `secure_environment_variables` field within the `container` now maps keys with empty values, which differs from previous versions of this provider which ignored empty values ([#8151](https://github.com/hashicorp/terraform-provider-azurerm/issues/8151))\n\nFEATURES:\n\n* **New Resource** `azurerm_spring_cloud_certificate` ([#8067](https://github.com/hashicorp/terraform-provider-azurerm/issues/8067))\n\nIMPROVEMENTS:\n\n* dependencies: updating `keyvault` to `2019-09-01` ([#7822](https://github.com/hashicorp/terraform-provider-azurerm/issues/7822))\n* `azurerm_app_service_slot_virtual_network_swift_connection` - adding validation that the `app_service_id` is an App Service / Function App ID ([#8111](https://github.com/hashicorp/terraform-provider-azurerm/issues/8111))\n* `azurerm_app_service_slot_virtual_network_swift_connection` - adding validation that the `subnet` is a Subnet ID ([#8111](https://github.com/hashicorp/terraform-provider-azurerm/issues/8111))\n* `azurerm_batch_pool` - Remove `network_configuration` from update payload ([#8189](https://github.com/hashicorp/terraform-provider-azurerm/issues/8189))\n* `azurerm_frontdoor_firewall_policy` - `match_variable` within the `match_condition` block can now be set to `SocketAddr` ([#8244](https://github.com/hashicorp/terraform-provider-azurerm/issues/8244))\n* `azurerm_linux_virtual_machine_scale_set` - `upgrade_mode=\"Automatic\"` no longer requires health probe ([#6667](https://github.com/hashicorp/terraform-provider-azurerm/issues/6667))\n* `azurerm_key_vault` - support for `soft_delete_retention_days` ([#7822](https://github.com/hashicorp/terraform-provider-azurerm/issues/7822))\n* `azurerm_shared_image` - Support for `purchase_plan` ([#8124](https://github.com/hashicorp/terraform-provider-azurerm/issues/8124))\n* `azurerm_shared_image_gallery` - validating at import time that the ID is for a Shared Image Gallery ([#8240](https://github.com/hashicorp/terraform-provider-azurerm/issues/8240))\n* `azurerm_windows_virtual_machine_scale_set` - `upgrade_mode=\"Automatic\"` no longer requires health probe ([#6667](https://github.com/hashicorp/terraform-provider-azurerm/issues/6667))\n\nBUG FIXES:\n\n* Data Source: `azurerm_app_service` - ensuring the `site_config` block is correctly set into the state ([#8212](https://github.com/hashicorp/terraform-provider-azurerm/issues/8212))\n* Enhanced Validation: supporting \"centralindia\", \"southindia\" and \"westindia\" as valid regions in Azure Public (working around invalid data from the Azure API) ([#8217](https://github.com/hashicorp/terraform-provider-azurerm/issues/8217))\n* `azurerm_application_gateway` - allow setting `ip_addresses` within the `backend_address_pool` block to an empty list ([#8210](https://github.com/hashicorp/terraform-provider-azurerm/issues/8210))\n* `azurerm_application_gateway` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_container_group` - the `secure_environment_variables` field within the `container` now maps keys with empty values ([#8151](https://github.com/hashicorp/terraform-provider-azurerm/issues/8151))\n* `azurerm_dedicated_host` - waiting for the resource to be gone 20 times rather than 10 to work around an API issue ([#8221](https://github.com/hashicorp/terraform-provider-azurerm/issues/8221))\n* `azurerm_dedicated_host_group` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_firewall` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_hardware_security_module` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_lb` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_linux_virtual_machine` - support for updating `ultra_ssd_enabled` within the `additional_capabilities` block without recreating the virtual machine ([#8015](https://github.com/hashicorp/terraform-provider-azurerm/issues/8015))\n* `azurerm_linux_virtual_machine_scale_set` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_managed_disk` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_nat_gateway` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_orchestrated_virtual_machine_scale_set` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_public_ip_prefix` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_public_ip` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_redis_cache` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_virtual_machine` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_virtual_machine_scale_set` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n* `azurerm_windows_virtual_machine` - support for updating `ultra_ssd_enabled` within the `additional_capabilities` block without recreating the virtual machine ([#8015](https://github.com/hashicorp/terraform-provider-azurerm/issues/8015))\n* `azurerm_windows_virtual_machine_scale_set` - adding validation to the `zone` field ([#8233](https://github.com/hashicorp/terraform-provider-azurerm/issues/8233))\n\n## 2.24.0 (August 20, 2020)\n\nFEATURES:\n\n* **New Resource:** `azurerm_synapse_spark_pool` ([#7886](https://github.com/hashicorp/terraform-provider-azurerm/issues/7886))\n\nIMPROVEMENTS:\n\n* dependencies: update `containerinstance` to API version `2019-12-01` ([#8110](https://github.com/hashicorp/terraform-provider-azurerm/issues/8110))\n* `azurerm_api_management_api` - now supports `oauth2_authorization` and `openid_authentication` ([#7617](https://github.com/hashicorp/terraform-provider-azurerm/issues/7617))\n* `azurerm_policy_definition` - `mode` can now be updated without recreating the resource ([#7976](https://github.com/hashicorp/terraform-provider-azurerm/issues/7976))\n\nBUG FIXES:\n\n* `azurerm_frontdoor` - ensuring all fields are set into the state ([#8146](https://github.com/hashicorp/terraform-provider-azurerm/issues/8146))\n* `azurerm_frontdoor` - rewriting case-inconsistent Resource ID's to ensure they're reliable ([#8146](https://github.com/hashicorp/terraform-provider-azurerm/issues/8146))\n* `azurerm_frontdoor_firewall_policy` - ensuring all fields are set into the state ([#8146](https://github.com/hashicorp/terraform-provider-azurerm/issues/8146))\n* `azurerm_frontdoor_firewall_policy` - rewriting case-inconsistent Resource ID's to ensure they're reliable ([#8146](https://github.com/hashicorp/terraform-provider-azurerm/issues/8146))\n* `azurerm_frontdoor_custom_https_configuration` - ensuring all fields are set into the state ([#8146](https://github.com/hashicorp/terraform-provider-azurerm/issues/8146))\n* `azurerm_frontdoor_custom_https_configuration` - ensuring the `resource_group_name` field is set into the state ([#8173](https://github.com/hashicorp/terraform-provider-azurerm/issues/8173))\n* `azurerm_frontdoor_custom_https_configuration` - rewriting case-inconsistent Resource ID's to ensure they're reliable ([#8146](https://github.com/hashicorp/terraform-provider-azurerm/issues/8146))\n* `azurerm_frontdoor_custom_https_configuration` - updating the ID to use the frontendEndpoint's Resource ID rather than a custom Resource ID ([#8146](https://github.com/hashicorp/terraform-provider-azurerm/issues/8146))\n* `azurerm_lb` - switching to use API version `2020-03-01` to workaround a bug in API version `2020-05-01` ([#8006](https://github.com/hashicorp/terraform-provider-azurerm/issues/8006))\n* `azurerm_lb_backend_address_pool` - adding more specific validation for the Load Balancer ID field ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_backend_address_pool` - ensuring all fields are always set into the state ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_backend_address_pool` - switching to use API version `2020-03-01` to workaround a bug in API version `2020-05-01` ([#8006](https://github.com/hashicorp/terraform-provider-azurerm/issues/8006))\n* `azurerm_lb_nat_pool` - adding more specific validation for the Load Balancer ID field ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_nat_pool` - ensuring all fields are always set into the state ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_nat_pool` - switching to use API version `2020-03-01` to workaround a bug in API version `2020-05-01` ([#8006](https://github.com/hashicorp/terraform-provider-azurerm/issues/8006))\n* `azurerm_lb_nat_rule` - adding more specific validation for the Load Balancer ID field ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_nat_rule` - ensuring all fields are always set into the state ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_nat_rule` - switching to use API version `2020-03-01` to workaround a bug in API version `2020-05-01` ([#8006](https://github.com/hashicorp/terraform-provider-azurerm/issues/8006))\n* `azurerm_lb_outbound_rule` - adding more specific validation for the Load Balancer ID field ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_outbound_rule` - ensuring all fields are always set into the state ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_outbound_rule` - switching to use API version `2020-03-01` to workaround a bug in API version `2020-05-01` ([#8006](https://github.com/hashicorp/terraform-provider-azurerm/issues/8006))\n* `azurerm_lb_probe` - adding more specific validation for the Load Balancer ID field ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_probe` - ensuring all fields are always set into the state ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_probe` - switching to use API version `2020-03-01` to workaround a bug in API version `2020-05-01` ([#8006](https://github.com/hashicorp/terraform-provider-azurerm/issues/8006))\n* `azurerm_lb_rule` - adding more specific validation for the Load Balancer ID field ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_rule` - ensuring all fields are always set into the state ([#8172](https://github.com/hashicorp/terraform-provider-azurerm/issues/8172))\n* `azurerm_lb_rule` - switching to use API version `2020-03-01` to workaround a bug in API version `2020-05-01` ([#8006](https://github.com/hashicorp/terraform-provider-azurerm/issues/8006))\n* `azurerm_storage_account` - only sending `allow_blob_public_access` and `min_tls_version` in Azure Public since these are currently not supported in other regions ([#8148](https://github.com/hashicorp/terraform-provider-azurerm/issues/8148))\n\n## 2.23.0 (August 13, 2020)\n\nFEATURES:\n\n* **New Resource:** `azurerm_integration_service_environment` ([#7763](https://github.com/hashicorp/terraform-provider-azurerm/issues/7763))\n* **New Resource:** `azurerm_redis_linked_server` ([#8026](https://github.com/hashicorp/terraform-provider-azurerm/issues/8026))\n* **New Resource:** `azurerm_synapse_firewall_rule` ([#7904](https://github.com/hashicorp/terraform-provider-azurerm/issues/7904))\n\nIMPROVEMENTS:\n\n* dependencies: updating `containerservice` to `2020-04-01` ([#7894](https://github.com/hashicorp/terraform-provider-azurerm/issues/7894))\n* dependencies: updating `mysql` to `2020-01-01` ([#8062](https://github.com/hashicorp/terraform-provider-azurerm/issues/8062))\n* dependencies: updating `postgresql` to `2020-01-01` ([#8045](https://github.com/hashicorp/terraform-provider-azurerm/issues/8045))\n* Data Source: `azurerm_app_service` now exports `source_control` configuration ([#7945](https://github.com/hashicorp/terraform-provider-azurerm/issues/7945))\n* Data Source: `azurerm_function_app` now exports `source_control` configuration ([#7945](https://github.com/hashicorp/terraform-provider-azurerm/issues/7945))\n* Data Source: `azurerm_function_app` now exports `site_config` configuration ([#7945](https://github.com/hashicorp/terraform-provider-azurerm/issues/7945))\n* `azurerm_app_service` now supports `source_control` configuration ([#7945](https://github.com/hashicorp/terraform-provider-azurerm/issues/7945))\n* `azurerm_function_app` now supports `source_control` configuration ([#7945](https://github.com/hashicorp/terraform-provider-azurerm/issues/7945))\n* `azurerm_function_app` now supports full `ip_restriction` configuration ([#7945](https://github.com/hashicorp/terraform-provider-azurerm/issues/7945))\n* `azurerm_function_app` now supports full `scm_ip_restriction` configuration ([#7945](https://github.com/hashicorp/terraform-provider-azurerm/issues/7945))\n* `azurerm_eventhub_namespace` - support for the `identity` block ([#8065](https://github.com/hashicorp/terraform-provider-azurerm/issues/8065))\n* `azurerm_postgresql_server` - support for the `identity` block ([#8044](https://github.com/hashicorp/terraform-provider-azurerm/issues/8044))\n* `azurerm_site_recovery_replicated_vm` - support setting `target_network_id` and `network_interface` on failover ([#5688](https://github.com/hashicorp/terraform-provider-azurerm/issues/5688))\n* `azurerm_storage_account` - support `static_website` for `BlockBlobStorage` account type ([#7890](https://github.com/hashicorp/terraform-provider-azurerm/issues/7890))\n* `azurerm_storage_account` - filter `allow_blob_public_access` and `min_tls_version` from Azure US Government ([#8092](https://github.com/hashicorp/terraform-provider-azurerm/issues/8092))\n\nBUG FIXES:\n\n* All resources using a `location` field - allowing the value `global` when using enhanced validation ([#8042](https://github.com/hashicorp/terraform-provider-azurerm/issues/8042))\n* Data Source: `azurerm_api_management_user` - `user_id` now accepts single characters ([#7975](https://github.com/hashicorp/terraform-provider-azurerm/issues/7975))\n* `azurerm_application_gateway` - enforce case for the `rule_type` property ([#8061](https://github.com/hashicorp/terraform-provider-azurerm/issues/8061))\n* `azurerm_iothub_consumer_group` - lock during creation and deletion to workaround an API issue ([#8041](https://github.com/hashicorp/terraform-provider-azurerm/issues/8041))\n* `azurerm_iothub` - the `endpoint` and `route` lists can now be cleared by setting them to `[]` ([#8028](https://github.com/hashicorp/terraform-provider-azurerm/issues/8028))\n* `azurerm_linux_virtual_machine` - handling machines which are already stopped/deallocated ([#8000](https://github.com/hashicorp/terraform-provider-azurerm/issues/8000))\n* `azurerm_mariadb_virtual_network_rule` will now work across subscriptions ([#8100](https://github.com/hashicorp/terraform-provider-azurerm/issues/8100))\n* `azurerm_monitor_metric_alert_resource` - continue using `SingleResourceMultiMetricCriteria` for existing alerts ([#7995](https://github.com/hashicorp/terraform-provider-azurerm/issues/7995))\n* `azurerm_mysql_server` - prevent a non empty plan when using `threat_detection_policy` ([#7981](https://github.com/hashicorp/terraform-provider-azurerm/issues/7981))\n* `azurerm_orchestrated_virtual_machine_scale_set` - allow `single_placement_group` to be `true` ([#7821](https://github.com/hashicorp/terraform-provider-azurerm/issues/7821))\n* `azurerm_mysql_server` - support for the `identity` block ([#8059](https://github.com/hashicorp/terraform-provider-azurerm/issues/8059))\n* `azurerm_storage_account` - set default for `min_tls_version` to `TLS_10` ([#8152](https://github.com/hashicorp/terraform-provider-azurerm/pull/8152))\n* `azurerm_traffic_manager_profile` - updating no longer clears all endpoints ([#7846](https://github.com/hashicorp/terraform-provider-azurerm/issues/7846))\n* `azurerm_windows_virtual_machine` - handling machines which are already stopped/deallocated [[#8000](https://github.com/hashicorp/terraform-provider-azurerm/issues/8000)]'\n* `azurerm_data_factory_dataset_delimited_text` - fix issue with property `azure_blob_storage_account` ([#7953](https://github.com/hashicorp/terraform-provider-azurerm/issues/7953))\n\n## 2.22.0 (August 07, 2020)\n\nDEPENDENCIES:\n\n* updating `github.com/Azure/azure-sdk-for-go` to `v44.2.0` ([#7933](https://github.com/hashicorp/terraform-provider-azurerm/issues/7933))\n\nIMPROVEMENTS:\n\n* `azurerm_cosmosdb_account` - support `DisableRateLimitingResponses` with the `capabilities` property ([#8016](https://github.com/hashicorp/terraform-provider-azurerm/issues/8016))\n* `azurerm_storage_account` - support for the `min_tls_version` property ([#7879](https://github.com/hashicorp/terraform-provider-azurerm/issues/7879))\n* `azurerm_storage_account_sas` - support for the `signed_version attribute` property ([#8020](https://github.com/hashicorp/terraform-provider-azurerm/issues/8020))\n* `azurerm_servicebus_queue` - support for the `enable_batched_operations`, `status`, `forward_to`, and `forward_dead_lettered_messages_to` ([#7990](https://github.com/hashicorp/terraform-provider-azurerm/issues/7990))\n\nBUG FIXES:\n\n* Data Source: `azurerm_key_vault_certificate` - fixing a crash when using acmebot certificates ([#8029](https://github.com/hashicorp/terraform-provider-azurerm/issues/8029))\n* `azurerm_iothub_shared_access_policy` - prevent `primary_connection_string` & `secondary_connection_string` from regenerating during every apply ([#8017](https://github.com/hashicorp/terraform-provider-azurerm/issues/8017))\n\n## 2.21.0 (July 31, 2020)\n\nDEPENDENCIES:\n\n* updating `search` to `2020-03-13` ([#7867](https://github.com/hashicorp/terraform-provider-azurerm/issues/7867))\n* updating `go-azure-helpers` to `v0.11.2` ([#7911](https://github.com/hashicorp/terraform-provider-azurerm/issues/7911))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_data_share_dataset_data_lake_gen1` ([#7840](https://github.com/hashicorp/terraform-provider-azurerm/issues/7840))\n* **New Resource:** `azurerm_dedicated_hardware_security_module` ([#7727](https://github.com/hashicorp/terraform-provider-azurerm/issues/7727))\n\nIMPROVEMENTS:\n* `azurerm_api_management_identity_provider_aad` - Support for `signin_tenant` ([#7901](https://github.com/hashicorp/terraform-provider-azurerm/issues/7901))\n* `azurerm_app_service_plan` - update the relation between `kind` and `reserved` ([#7943](https://github.com/hashicorp/terraform-provider-azurerm/issues/7943))\n* `azurerm_automation_runbook` - recreate `azurerm_automation_job_schedule` after an update ([#7555](https://github.com/hashicorp/terraform-provider-azurerm/issues/7555))\n* `azurerm_app_service_slot` - support for the `application_logs.file_system` ([#7311](https://github.com/hashicorp/terraform-provider-azurerm/issues/7311))\n* `azurerm_firewall` - no longer requires a `zone` ([#7817](https://github.com/hashicorp/terraform-provider-azurerm/issues/7817))\n* `azurerm_function_app_slot` - support for the `site_config.auto_swap_slot_name` property ([#7859](https://github.com/hashicorp/terraform-provider-azurerm/issues/7859))\n* `azurerm_kubernetes_cluster` - support for in-place upgrade from `Free` to `Paid` for `sku_tier` ([#7927](https://github.com/hashicorp/terraform-provider-azurerm/issues/7927))\n* `azurerm_monitor_scheduled_query_rules_alert` - `action.0.custom_webhook_payload` is now sent as empty to allow for Azure's default to take effect([#7838](https://github.com/hashicorp/terraform-provider-azurerm/issues/7838))\n* `azurerm_search_service` - support for the `public_network_access_enabled` property ([#7867](https://github.com/hashicorp/terraform-provider-azurerm/issues/7867))\n* `azurerm_servicebus_subscription` - support for the `status` property ([#7852](https://github.com/hashicorp/terraform-provider-azurerm/issues/7852))\n\nBUG FIXES:\n\n* `azurerm_automation_runbook` - allow `publish_content_link` resource to not be set ([#7824](https://github.com/hashicorp/terraform-provider-azurerm/issues/7824))\n* `azurerm_api_management_named_value` - the `value` has been marked as sensitive to hide secret values ([#7819](https://github.com/hashicorp/terraform-provider-azurerm/issues/7819))\n* `azurerm_cognitive_account` - allow `qname_runtime_endpoint` to not be set ([#7916](https://github.com/hashicorp/terraform-provider-azurerm/issues/7916))\n* `azurerm_iothub_dps` - the only valid value for the `sku` property for the API is now `S1` ([#7847](https://github.com/hashicorp/terraform-provider-azurerm/issues/7847))\n* `azurerm_eventgrid_event_subscription` - deprecate the `topic_name` as it is now readonly in the API ([#7871](https://github.com/hashicorp/terraform-provider-azurerm/issues/7871))\n* `azurerm_kubernetes_cluster` - updates will no longer fail when using managed Microsoft Entra integration ([#7874](https://github.com/hashicorp/terraform-provider-azurerm/issues/7874))\n\n## 2.20.0 (July 23, 2020)\n\nUPGRADE NOTES\n\n* **Enhanced Validation for Locations** - the Azure Provider now validates that the value for the `location` argument is a supported Azure Region within the Azure Environment being used (from the Azure Metadata Service) - which allows us to catch configuration errors for this field at `terraform plan` time, rather than during a `terraform apply`. This functionality is now enabled by default, and can be opted-out of by setting the Environment Variable `ARM_PROVIDER_ENHANCED_VALIDATION` to `false`\n* `azurerm_storage_account` - will now default `allow_blob_public_access` to false to align with the portal and be secure by default ([#7784](https://github.com/hashicorp/terraform-provider-azurerm/issues/7784))\n\nDEPENDENCIES:\n\n* updating `github.com/Azure/azure-sdk-for-go` to `v44.1.0` ([#7774](https://github.com/hashicorp/terraform-provider-azurerm/issues/7774))\n* updating `cosmos` to `2020-04-01` ([#7597](https://github.com/hashicorp/terraform-provider-azurerm/issues/7597))\n\nFEATURES: \n\n* **New Data Source:** `azurerm_synapse_workspace` ([#7517](https://github.com/hashicorp/terraform-provider-azurerm/issues/7517))\n* **New Resource:** `azurerm_data_share_dataset_data_lake_gen1` - add `dataset_data_lake_gen1` suppport for `azurerm_data_share` ([#7511](https://github.com/hashicorp/terraform-provider-azurerm/issues/7511))\n* **New Resource:** `azurerm_frontdoor_custom_https_configuration` - move the front door `custom_https_configuration` to its own resource to allow for parallel creation/update of custom https certificates. ([#7498](https://github.com/hashicorp/terraform-provider-azurerm/issues/7498))\n* **New Resource:** `azurerm_kusto_cluster_customer_managed_key` ([#7520](https://github.com/hashicorp/terraform-provider-azurerm/issues/7520))\n* **New Resource:** `azurerm_synapse_workspace` ([#7517](https://github.com/hashicorp/terraform-provider-azurerm/issues/7517))\n\nIMPROVEMENTS:\n\n* `azurerm_cosmos_db_account` - add support for the `enable_free_tier` property ([#7814](https://github.com/hashicorp/terraform-provider-azurerm/issues/7814))\n\nBUG FIXES:\n\n* Data Source: `azurerm_private_dns_zone` - fix a crash when the zone does not exist ([#7783](https://github.com/hashicorp/terraform-provider-azurerm/issues/7783))\n* `azurerm_application_gateway` - fix crash with `gateway_ip_configuration` ([#7789](https://github.com/hashicorp/terraform-provider-azurerm/issues/7789))\n* `azurerm_cosmos_account` - the `geo_location.prefix` property has been deprecated as service no longer accepts it as an input since Apr 25, 2019 ([#7597](https://github.com/hashicorp/terraform-provider-azurerm/issues/7597))\n* `azurerm_monitor_autoscale_setting` - fix crash in `notification` ([#7835](https://github.com/hashicorp/terraform-provider-azurerm/issues/7835))\n* `azurerm_storage_account` - will now default `allow_blob_public_access` to false to align with the portal and be secure by default ([#7784](https://github.com/hashicorp/terraform-provider-azurerm/issues/7784))\n\n## 2.19.0 (July 16, 2020)\n\nUPGRADE NOTES:\n\n* HDInsight 3.6 will be retired (in Azure Public) on 2020-12-30 - HDInsight 4.0 does not support ML Services, RServer or Storm Clusters - as such the `azurerm_hdinsight_ml_services_cluster`, `azurerm_hdinsight_rserver_cluster` and `azurerm_hdinsight_storm_cluster` resources are deprecated and will be removed in the next major version of the Azure Provider. ([#7706](https://github.com/hashicorp/terraform-provider-azurerm/issues/7706))\n* provider: no longer auto register the Microsoft.StorageCache RP ([#7768](https://github.com/hashicorp/terraform-provider-azurerm/issues/7768))\n\nFEATURES:\n\n* **New Data source:** `azurerm_route_filter` ([#6341](https://github.com/hashicorp/terraform-provider-azurerm/issues/6341))\n* **New Resource:** `azurerm_route_filter` ([#6341](https://github.com/hashicorp/terraform-provider-azurerm/issues/6341))\n\nIMPROVEMENTS:\n\n* dependencies: updating to v44.0.0 of `github.com/Azure/azure-sdk-for-go` ([#7616](https://github.com/hashicorp/terraform-provider-azurerm/issues/7616))\n* dependencies: updating the `machinelearning` API to version `2020-04-01` ([#7703](https://github.com/hashicorp/terraform-provider-azurerm/issues/7703))\n* Data Source: `azurerm_storage_account` - exposing `allow_blob_public_access` ([#7739](https://github.com/hashicorp/terraform-provider-azurerm/issues/7739))\n* Data Source: `azurerm_dns_zone` - now provides feedback if a `resource_group_name` is needed to resolve ambiguous zone ([#7680](https://github.com/hashicorp/terraform-provider-azurerm/issues/7680))\n* `azurerm_automation_schedule` - Updated validation for timezone strings ([#7754](https://github.com/hashicorp/terraform-provider-azurerm/issues/7754))\n* `azurerm_express_route_circuit_peering` - support for the `route_filter_id` property ([#6341](https://github.com/hashicorp/terraform-provider-azurerm/issues/6341))\n* `azurerm_kubernetes_cluster` - no longer sending the `kubernetes_dashboard` addon in Azure China since this is not supported in this region ([#7714](https://github.com/hashicorp/terraform-provider-azurerm/issues/7714))\n* `azurerm_local_network_gateway`- `address_space` order can now be changed ([#7745](https://github.com/hashicorp/terraform-provider-azurerm/issues/7745))\n* `azurerm_machine_learning_workspace` - adding the field `high_business_impact` ([#7703](https://github.com/hashicorp/terraform-provider-azurerm/issues/7703))\n* `azurerm_monitor_metric_alert` - support for multiple scopes and associated criteria ([#7159](https://github.com/hashicorp/terraform-provider-azurerm/issues/7159))\n* `azurerm_mssql_database` `elastic_pool_id` remove forcenew ([#7628](https://github.com/hashicorp/terraform-provider-azurerm/issues/7628))\n* `azurerm_policy_assignment` - support for `metadata` property ([#7725](https://github.com/hashicorp/terraform-provider-azurerm/issues/7725))\n* `azurerm_policy_set_definition` - support for the `policy_definition_reference_id` property ([#7018](https://github.com/hashicorp/terraform-provider-azurerm/issues/7018))\n* `azurerm_storage_account` - support for configuring `allow_blob_public_access` ([#7739](https://github.com/hashicorp/terraform-provider-azurerm/issues/7739))\n* `azurerm_storage_container` - container creation will retry if a container of the same name has not completed its delete operation ([#7179](https://github.com/hashicorp/terraform-provider-azurerm/issues/7179))\n* `azurerm_storage_share` - share creation will retry if a share of the same name has not completed its previous delete operation ([#7179](https://github.com/hashicorp/terraform-provider-azurerm/issues/7179))\n* `azurerm_virtual_network_gateway_connection` - support for the `traffic_selector_policy` block ([#6586](https://github.com/hashicorp/terraform-provider-azurerm/issues/6586))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support for the `proximity_placement_group_id` property ([#7510](https://github.com/hashicorp/terraform-provider-azurerm/issues/7510))\n\n\nBUG FIXES:\n\n* provider: deprecating `metadata_url` to `metadata_host` since this is a hostname ([#7740](https://github.com/hashicorp/terraform-provider-azurerm/issues/7740))\n* `azurerm_*_virtual_machine` - `allow_extensions_operations` can now be updated ([#7749](https://github.com/hashicorp/terraform-provider-azurerm/issues/7749))\n* `azurerm_eventhub_namespace` - changing to `zone_redundant` now force a new resource ([#7612](https://github.com/hashicorp/terraform-provider-azurerm/issues/7612))\n* `azurerm_express_route_circuit` - fix eventual consistency issue in create ([#7753](https://github.com/hashicorp/terraform-provider-azurerm/issues/7753))\n* `azurerm_express_route_circuit` - fix potential crash ([#7776](https://github.com/hashicorp/terraform-provider-azurerm/issues/7776))\n* `azurerm_managed_disk` - allow up to `65536` GB for the `disk_size_gb` property ([#7689](https://github.com/hashicorp/terraform-provider-azurerm/issues/7689))\n* `azurerm_machine_learning_workspace` - waiting until the Machine Learning Workspace has been fully deleted ([#7635](https://github.com/hashicorp/terraform-provider-azurerm/issues/7635))\n* `azurerm_mysql_server` - `ssl_minimal_tls_version_enforced` now correctly set in updates ([#7307](https://github.com/hashicorp/terraform-provider-azurerm/issues/7307))\n* `azurerm_notification_hub` - validating that the ID is in the correct format when importing the resource ([#7690](https://github.com/hashicorp/terraform-provider-azurerm/issues/7690))\n* `azurerm_redis_cache` - fixing a bug when provisioning with authentication disabled ([#7734](https://github.com/hashicorp/terraform-provider-azurerm/issues/7734))\n* `azurerm_virtual_hub` - the field `address_prefix` is now `ForceNew` to match the behaviour of the Azure API ([#7713](https://github.com/hashicorp/terraform-provider-azurerm/issues/7713))\n* `azurerm_virtual_hub_connection` - using the delete timeout if specified ([#7731](https://github.com/hashicorp/terraform-provider-azurerm/issues/7731))\n\n## 2.18.0 (July 10, 2020)\n\nFEATURES:\n\n* `metadata_url` can be set at the provider level to use an environment provided by a specific url ([#7664](https://github.com/hashicorp/terraform-provider-azurerm/issues/7664))\n* **New Data Source:** `azurerm_key_vault_certificate_issuer` ([#7074](https://github.com/hashicorp/terraform-provider-azurerm/issues/7074))\n* **New Data Source:** `azurerm_web_application_firewall_policy` ([#7469](https://github.com/hashicorp/terraform-provider-azurerm/issues/7469))\n* **New Resource:** `azurerm_automation_connection` ([#6847](https://github.com/hashicorp/terraform-provider-azurerm/issues/6847))\n* **New Resource:** `azurerm_automation_connection_certificate` ([#6847](https://github.com/hashicorp/terraform-provider-azurerm/issues/6847))\n* **New Resource:** `azurerm_automation_connection_classic_certificate` ([#6847](https://github.com/hashicorp/terraform-provider-azurerm/issues/6847))\n* **New Resource:** `azurerm_automation_connection_service_pricipal` ([#6847](https://github.com/hashicorp/terraform-provider-azurerm/issues/6847))\n* **New Resource:** `azurerm_app_service_slot_virtual_network_swift_connection` ([#5916](https://github.com/hashicorp/terraform-provider-azurerm/issues/5916))\n* **New Resource:** `azurerm_data_factory_dataset_azure_blob` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_data_factory_dataset_cosmosdb_sqlapi` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_data_factory_dataset_delimited_text` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_data_factory_dataset_http` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_data_factory_dataset_json` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_data_factory_linked_service_azure_blob_storage` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_data_factory_linked_service_azure_file_storage` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_data_factory_linked_service_azure_file_storage` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_data_factory_linked_service_cosmosdb` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_data_factory_linked_service_sftp` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_data_factory_linked_service_sftp` ([#6366](https://github.com/hashicorp/terraform-provider-azurerm/issues/6366))\n* **New Resource:** `azurerm_key_vault_certificate_issuer` ([#7074](https://github.com/hashicorp/terraform-provider-azurerm/issues/7074))\n* **New Resource:** `azurerm_kusto_attached_database_configuration` ([#7377](https://github.com/hashicorp/terraform-provider-azurerm/issues/7377))\n* **New Resource:** `azurerm_kusto_database_principal_assignment` ([#7484](https://github.com/hashicorp/terraform-provider-azurerm/issues/7484))\n* **New Resource:** `azurerm_mysql_active_directory_administrator` ([#7621](https://github.com/hashicorp/terraform-provider-azurerm/issues/7621))\n\nIMPROVEMENTS:\n\n* dependencies: updating `github.com/tombuildsstuff/giovanni` to `v0.11.0` ([#7608](https://github.com/hashicorp/terraform-provider-azurerm/issues/7608))\n* dependencies: updating `network` to `2020-05-01` ([#7585](https://github.com/hashicorp/terraform-provider-azurerm/issues/7585))\n* Data Source: `azurerm_eventhub_namespace` - exposing the `dedicated_cluster_id` field ([#7548](https://github.com/hashicorp/terraform-provider-azurerm/issues/7548))\n* `azurerm_cosmosdb_account` - support for the `ignore_missing_vnet_service_endpoint` property ([#7348](https://github.com/hashicorp/terraform-provider-azurerm/issues/7348))\n* `azurerm_application_gateway` - support for the `firewall_policy_id` attribute within the `http_listener` block ([#7580](https://github.com/hashicorp/terraform-provider-azurerm/issues/7580))\n* `azurerm_eventhub_namespace` - support for configuring the `dedicated_cluster_id` field ([#7548](https://github.com/hashicorp/terraform-provider-azurerm/issues/7548))\n* `azurerm_eventhub_namespace` - support for setting `partition_count` to `1024` when using a Dedicated Cluster ([#7548](https://github.com/hashicorp/terraform-provider-azurerm/issues/7548))\n* `azurerm_eventhub_namespace` - support for setting `retention_count` to `90` when using a Dedicated Cluster ([#7548](https://github.com/hashicorp/terraform-provider-azurerm/issues/7548))\n* `azurerm_hdinsight_hadoop_cluster` - now supports Azure Monitor ([#7045](https://github.com/hashicorp/terraform-provider-azurerm/issues/7045))\n* `azurerm_hdinsight_hbase_cluster` - now supports external metastores ([#6969](https://github.com/hashicorp/terraform-provider-azurerm/issues/6969))\n* `azurerm_hdinsight_hbase_cluster` - now supports Azure Monitor ([#7045](https://github.com/hashicorp/terraform-provider-azurerm/issues/7045))\n* `azurerm_hdinsight_interactive_query_cluster` - now supports external metastores ([#6969](https://github.com/hashicorp/terraform-provider-azurerm/issues/6969))\n* `azurerm_hdinsight_interactive_query_cluster` - now supports Azure Monitor ([#7045](https://github.com/hashicorp/terraform-provider-azurerm/issues/7045))\n* `azurerm_hdinsight_kafka_cluster` - now supports external metastores ([#6969](https://github.com/hashicorp/terraform-provider-azurerm/issues/6969))\n* `azurerm_hdinsight_kafka_cluster` - now supports external Azure Monitor ([#7045](https://github.com/hashicorp/terraform-provider-azurerm/issues/7045))\n* `azurerm_hdinsight_spark_cluster` - now supports external metastores ([#6969](https://github.com/hashicorp/terraform-provider-azurerm/issues/6969))\n* `azurerm_hdinsight_spark_cluster` - now supports external Azure Monitor ([#7045](https://github.com/hashicorp/terraform-provider-azurerm/issues/7045))\n* `azurerm_hdinsight_storm_cluster` - now supports external metastores ([#6969](https://github.com/hashicorp/terraform-provider-azurerm/issues/6969))\n* `azurerm_hdinsight_storm_cluster` - now supports external Azure Monitor ([#7045](https://github.com/hashicorp/terraform-provider-azurerm/issues/7045))\n* `azurerm_policy_set_definition` - the `management_group_id` property has been deprecated in favour of `management_group_name` to align with the behaviour in `azurerm_policy_definition` ([#6943](https://github.com/hashicorp/terraform-provider-azurerm/issues/6943))\n* `azurerm_kusto_cluster` - support for the `language_extensions` property ([#7421](https://github.com/hashicorp/terraform-provider-azurerm/issues/7421))\n* `azurerm_kusto_cluster` - Support for the `optimized_auto_scale` property ([#7371](https://github.com/hashicorp/terraform-provider-azurerm/issues/7371))\n* `azurerm_mysql_server` - support for the `threat_detection_policy` property ([#7156](https://github.com/hashicorp/terraform-provider-azurerm/issues/7156))\n* `azurerm_mssql_database` - the `sku_name` property now only forces a new resource for the `HS` (HyperScale) family ([#7559](https://github.com/hashicorp/terraform-provider-azurerm/issues/7559))\n* `azurerm_web_application_firewall_policy` - allow setting `version` to `0.1` (for when `type` is set to `Microsoft_BotManagerRuleSet`) ([#7579](https://github.com/hashicorp/terraform-provider-azurerm/issues/7579))\n* `azurerm_web_application_firewall_policy` - support the `transforms` property in the `custom_rules.match_conditions` block ([#7545](https://github.com/hashicorp/terraform-provider-azurerm/issues/7545))\n* `azurerm_web_application_firewall_policy` - support the `request_body_check`, `file_upload_limit_in_mb`, and `max_request_body_size_in_kb` properties in the `policy_settings` block ([#7363](https://github.com/hashicorp/terraform-provider-azurerm/issues/7363))\n\nBUG FIXES: \n\n* `azurerm_api_management_api_operation_policy` - correctly parse XLM ([#7345](https://github.com/hashicorp/terraform-provider-azurerm/issues/7345))\n* `azurerm_application_insights_api_key` - now correctly checks if the resource exists upon creation ([#7650](https://github.com/hashicorp/terraform-provider-azurerm/issues/7650))\n* `azurerm_api_management_identity_provider_aad` - fix perpetual diff on the `client_secret` property ([#7529](https://github.com/hashicorp/terraform-provider-azurerm/issues/7529))\n* `azurerm_eventhub_namespace_authorization_rule` - correctly update old resource IDs ([#7622](https://github.com/hashicorp/terraform-provider-azurerm/issues/7622))\n* `azurerm_policy_remediation` - removing the validation for the `policy_definition_reference_id` field since this isn't a Resource ID ([#7600](https://github.com/hashicorp/terraform-provider-azurerm/issues/7600))\n* `azurerm_storage_data_lake_gen2_filesystem` - prevent a crash during plan if storage account was deleted ([#7378](https://github.com/hashicorp/terraform-provider-azurerm/issues/7378))\n\n## 2.17.0 (July 03, 2020)\n\nUPGRADE NOTES:\n\n* `azurerm_hdinsight_hadoop_cluster` - the `enabled` property within the `gateway` block now defaults to `true` and cannot be disabled, due to a behavioural change in the Azure API ([#7111](https://github.com/hashicorp/terraform-provider-azurerm/issues/7111))\n* `azurerm_hdinsight_hbase_cluster` - the `enabled` property within the `gateway` block now defaults to `true` and cannot be disabled, due to a behavioural change in the Azure API ([#7111](https://github.com/hashicorp/terraform-provider-azurerm/issues/7111))\n* `azurerm_hdinsight_interactive_query_cluster` - the `enabled` property within the `gateway` block now defaults to `true` and cannot be disabled, due to a behavioural change in the Azure API ([#7111](https://github.com/hashicorp/terraform-provider-azurerm/issues/7111))\n* `azurerm_hdinsight_kafka_cluster` - the `enabled` property within the `gateway` block now defaults to `true` and cannot be disabled, due to a behavioural change in the Azure API ([#7111](https://github.com/hashicorp/terraform-provider-azurerm/issues/7111))\n* `azurerm_hdinsight_ml_services_cluster` - the `enabled` property within the `gateway` block now defaults to `true` and cannot be disabled, due to a behavioural change in the Azure API ([#7111](https://github.com/hashicorp/terraform-provider-azurerm/issues/7111))\n* `azurerm_hdinsight_rserver_cluster` - the `enabled` property within the `gateway` block now defaults to `true` and cannot be disabled, due to a behavioural change in the Azure API ([#7111](https://github.com/hashicorp/terraform-provider-azurerm/issues/7111))\n* `azurerm_hdinsight_spark_cluster` - the `enabled` property within the `gateway` block now defaults to `true` and cannot be disabled, due to a behavioural change in the Azure API ([#7111](https://github.com/hashicorp/terraform-provider-azurerm/issues/7111))\n* `azurerm_hdinsight_storm_cluster` - the `enabled` property within the `gateway` block now defaults to `true` and cannot be disabled, due to a behavioural change in the Azure API ([#7111](https://github.com/hashicorp/terraform-provider-azurerm/issues/7111))\n\nFEATURES: \n\n* **New Resource:** `azurerm_kusto_cluster_principal_assignment` ([#7533](https://github.com/hashicorp/terraform-provider-azurerm/issues/7533))\n\nIMPROVEMENTS:\n\n* dependencies: updating to v43.2.0 of `github.com/Azure/azure-sdk-for-go` ([#7546](https://github.com/hashicorp/terraform-provider-azurerm/issues/7546))\n* Data Source: `azurerm_eventhub_namespace` - exposing the `zone_redundant` property ([#7534](https://github.com/hashicorp/terraform-provider-azurerm/issues/7534))\n* Data Source: `azurerm_postgresql_server` - exposing `sku_name` ([#7523](https://github.com/hashicorp/terraform-provider-azurerm/issues/7523))\n* `azurerm_app_service_environment` - the property `user_whitelisted_ip_ranges` has been deprecated and renamed to `allowed_user_ip_cidrs` to clarify the function and expected format ([#7499](https://github.com/hashicorp/terraform-provider-azurerm/issues/7499))\n* `azurerm_eventhub_namespace` - support for the `zone_redundant` property ([#7534](https://github.com/hashicorp/terraform-provider-azurerm/issues/7534))\n* `azurerm_key_vault_certificate` - exposing the `certificate_attribute` block ([#7387](https://github.com/hashicorp/terraform-provider-azurerm/issues/7387))\n* `azurerm_kusto_cluster` - Support `trusted_external_tenants` ([#7374](https://github.com/hashicorp/terraform-provider-azurerm/issues/7374))\n* `azurerm_sentinel_alert_rule_ms_security_incident` - the property `text_whitelist` has been deprecated and renamed to `display_name_filter` to better match the api ([#7499](https://github.com/hashicorp/terraform-provider-azurerm/issues/7499))\n* `azurerm_shared_image` - support for specialized images via the `specialized` property ([#7277](https://github.com/hashicorp/terraform-provider-azurerm/issues/7277))\n* `azurerm_shared_image_version` - support for specialized images via the `specialized` property ([#7277](https://github.com/hashicorp/terraform-provider-azurerm/issues/7277))\n* `azurerm_spring_cloud_service` - support for `sku_name` ([#7531](https://github.com/hashicorp/terraform-provider-azurerm/issues/7531))\n* `azurerm_spring_cloud_service` - support for the `trace` block ([#7531](https://github.com/hashicorp/terraform-provider-azurerm/issues/7531))\n\nBUG FIXES: \n\n* `azurerm_api_management_named_value` - polling until the property is fully created ([#7547](https://github.com/hashicorp/terraform-provider-azurerm/issues/7547))\n* `azurerm_api_management_property` - polling until the property is fully created ([#7547](https://github.com/hashicorp/terraform-provider-azurerm/issues/7547))\n* `azurerm_linux_virtual_machine_scale_set` - using the provider feature `roll_instances_when_required` when `upgrade_mode` is set to `Manual` ([#7513](https://github.com/hashicorp/terraform-provider-azurerm/issues/7513))\n* `azurerm_marketplace_agreement` - fix issue around import ([#7515](https://github.com/hashicorp/terraform-provider-azurerm/issues/7515))\n* `azurerm_windows_virtual_machine_scale_set` - using the provider feature `roll_instances_when_required` when `upgrade_mode` is set to `Manual` ([#7513](https://github.com/hashicorp/terraform-provider-azurerm/issues/7513))\n\n## 2.16.0 (June 25, 2020)\n\nDEPENDENCIES:\n\n* updating `github.com/Azure/go-autorest/azure/cli` to `v0.3.1` ([#7433](https://github.com/hashicorp/terraform-provider-azurerm/issues/7433))\n\nFEATURES:\n\n* **New Resource:** `azurerm_postgresql_active_directory_administrator` ([#7411](https://github.com/hashicorp/terraform-provider-azurerm/issues/7411))\n\nIMPROVEMENTS:\n\n* authentication: Azure CLI - support for access tokens in custom directories ([#7433](https://github.com/hashicorp/terraform-provider-azurerm/issues/7433))\n* `azurerm_api_management_api` - support for the `subscription_required` property ([#4885](https://github.com/hashicorp/terraform-provider-azurerm/issues/4885))\n* `azurerm_app_service_environment` - support a value of `Web, Publishing` for the `internal_load_balancing_mode` property ([#7346](https://github.com/hashicorp/terraform-provider-azurerm/issues/7346))\n* `azurerm_kusto_cluster` - support for the `identity` block ([#7367](https://github.com/hashicorp/terraform-provider-azurerm/issues/7367))\n* `azurerm_kusto_cluster` - support for `virtual_network_configuration` block ([#7369](https://github.com/hashicorp/terraform-provider-azurerm/issues/7369))\n* `azurerm_kusto_cluster` - supoport for the `zone` property ([#7373](https://github.com/hashicorp/terraform-provider-azurerm/issues/7373))\n* `azurerm_firewall` - support for configuring `threat_intel_mode` ([#7437](https://github.com/hashicorp/terraform-provider-azurerm/issues/7437))\n* `azurerm_management_group` - waiting until the Management Group has been fully replicated after creating ([#7473](https://github.com/hashicorp/terraform-provider-azurerm/issues/7473))\n* `azurerm_monitor_activity_log_alert` - support for the fields `recommendation_category`, `recommendation_impact` and `recommendation_type` in the `criteria` block ([#7458](https://github.com/hashicorp/terraform-provider-azurerm/issues/7458))\n* `azurerm_mssql_database` - support up to `5` for the `min_capacity` property ([#7457](https://github.com/hashicorp/terraform-provider-azurerm/issues/7457))\n* `azurerm_mssql_database` - support `GP_S_Gen5` SKUs up to `GP_S_Gen5_40` ([#7453](https://github.com/hashicorp/terraform-provider-azurerm/issues/7453))\n\nBUG FIXES: \n\n* `azurerm_api_management_api` - allowing dots as a prefix of the `name` field ([#7478](https://github.com/hashicorp/terraform-provider-azurerm/issues/7478))\n* `azurerm_function_app` - state fixes for `app_settings` ([#7440](https://github.com/hashicorp/terraform-provider-azurerm/issues/7440))\n* `azurerm_hdinsight_hadoop_cluster` - fixes for node and instance count validation ([#7430](https://github.com/hashicorp/terraform-provider-azurerm/issues/7430))\n* `azurerm_hdinsight_hbase_cluster` - fixes for node and instance count validation ([#7430](https://github.com/hashicorp/terraform-provider-azurerm/issues/7430))\n* `azurerm_hdinsight_interactive_query_cluster` - fixes for node and instance count validation ([#7430](https://github.com/hashicorp/terraform-provider-azurerm/issues/7430))\n* `azurerm_hdinsight_kafka_cluster` - fixes for node and instance count validation ([#7430](https://github.com/hashicorp/terraform-provider-azurerm/issues/7430))\n* `azurerm_hdinsight_ml_services_cluster` - fixes for node and instance count validation ([#7430](https://github.com/hashicorp/terraform-provider-azurerm/issues/7430))\n* `azurerm_hdinsight_rserver_cluster` - fixes for node and instance count validation ([#7430](https://github.com/hashicorp/terraform-provider-azurerm/issues/7430))\n* `azurerm_hdinsight_spark_cluster` - fixes for node and instance count validation ([#7430](https://github.com/hashicorp/terraform-provider-azurerm/issues/7430))\n* `azurerm_hdinsight_storm_cluster` - fixes for node and instance count validation ([#7430](https://github.com/hashicorp/terraform-provider-azurerm/issues/7430))\n* `azurerm_monitor_autoscale_settings` - support for setting `time_aggregation` to `Last` as per the documentation ([#7480](https://github.com/hashicorp/terraform-provider-azurerm/issues/7480))\n* `azurerm_postgresql_server` - can now update the tier of `sku_name` by recreating the resource ([#7456](https://github.com/hashicorp/terraform-provider-azurerm/issues/7456))\n* `azurerm_network_interface_security_group_association` - is now considered delete whtn the  network interfact is notfound ([#7459](https://github.com/hashicorp/terraform-provider-azurerm/issues/7459))\n* `azurerm_role_definition` - terraform import now sets scope to prevent a force recreate ([#7424](https://github.com/hashicorp/terraform-provider-azurerm/issues/7424))\n* `azurerm_storage_account_network_rules` - corretly clear `ip_rules`, `virtual_network_subnet_ids` when set to `[]` ([#7385](https://github.com/hashicorp/terraform-provider-azurerm/issues/7385))\n\n## 2.15.0 (June 19, 2020)\n\nUPGRADE NOTES:\n\n* `azurerm_orchestrated_virtual_machine_scale_set` - the `single_placement_group` property is now required to be `false` by the service team in the `2019-12-01` compute API ([#7188](https://github.com/hashicorp/terraform-provider-azurerm/issues/7188))\n\nDEPENDENCIES\n\n* updating to `v43.1.0` of `github.com/Azure/azure-sdk-for-go` ([#7188](https://github.com/hashicorp/terraform-provider-azurerm/issues/7188))\n* upgrading `kusto` to`2019-12-01` ([#7101](https://github.com/hashicorp/terraform-provider-azurerm/issues/7101))\n* upgrading `kusto` to`2020-02-15` ([#6838](https://github.com/hashicorp/terraform-provider-azurerm/issues/6838))\n\nFEATURES\n\n* **New Data Source:** `azurerm_data_share_dataset_blob_storage` ([#7107](https://github.com/hashicorp/terraform-provider-azurerm/issues/7107))\n* **New Resource:** `azurerm_data_factory_integration_runtime_self_hosted` ([#6535](https://github.com/hashicorp/terraform-provider-azurerm/issues/6535))\n* **New Resource:** `azurerm_data_share_dataset_blob_storage` ([#7107](https://github.com/hashicorp/terraform-provider-azurerm/issues/7107))\n* **New Resource:** `azurerm_eventhub_cluster` ([#7306](https://github.com/hashicorp/terraform-provider-azurerm/issues/7306))\n* **New Resource:** `azurerm_maintenance_assignment_dedicated_host` ([#6713](https://github.com/hashicorp/terraform-provider-azurerm/issues/6713))\n* **New Resource:** `azurerm_maintenance_assignment_virtual_machine` ([#6713](https://github.com/hashicorp/terraform-provider-azurerm/issues/6713))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_management_group` - support lookup via `display_name` ([#6845](https://github.com/hashicorp/terraform-provider-azurerm/issues/6845))\n* `azurerm_api_management` - support for the `developer_portal_url` property ([#7263](https://github.com/hashicorp/terraform-provider-azurerm/issues/7263))\n* `azurerm_app_service` - support for `scm_ip_restriction` ([#6955](https://github.com/hashicorp/terraform-provider-azurerm/issues/6955))\n* `azurerm_app_service_certificate `- support for the `hosting_environment_profile_id` propety ([#7087](https://github.com/hashicorp/terraform-provider-azurerm/issues/7087))\n* `azurerm_app_service_environment` - support for the `user_whitelisted_ip_ranges` property ([#7324](https://github.com/hashicorp/terraform-provider-azurerm/issues/7324))\n* `azurerm_kusto_cluster` - Support for `enable_purge` ([#7375](https://github.com/hashicorp/terraform-provider-azurerm/issues/7375))\n* `azurerm_kusto_cluster` - Support for extended Kusto Cluster SKUs ([#7372](https://github.com/hashicorp/terraform-provider-azurerm/issues/7372))\n* `azurerm_policy_assignment` - added support for `enforcement_mode`  ([#7331](https://github.com/hashicorp/terraform-provider-azurerm/issues/7331))\n* `azurerm_private_endpoint` - support for the `private_dns_zone_group`, `private_dns_zone_configs`, and `custom_dns_configs` blocks ([#7246](https://github.com/hashicorp/terraform-provider-azurerm/issues/7246))\n* `azurerm_storage_share_directory ` - `name` can now contain one nested directory ([#7382](https://github.com/hashicorp/terraform-provider-azurerm/issues/7382))\n\nBUG FIXES:\n\n* `azurerm_api_management_api` - correctly wait for future on create/update ([#7273](https://github.com/hashicorp/terraform-provider-azurerm/issues/7273))\n* `azurerm_bot_connection` - adding a runtime check for the available service providers in the Azure Region being used ([#7279](https://github.com/hashicorp/terraform-provider-azurerm/issues/7279))\n* `azurerm_healthcare_service` - the `access_policy_object_ids` property is now optional ([#7296](https://github.com/hashicorp/terraform-provider-azurerm/issues/7296))\n* `azurerm_hdinsight_cluster` - deprecating the `min_instance_count` property ([#7272](https://github.com/hashicorp/terraform-provider-azurerm/issues/7272))\n* `azurerm_network_watcher_flow_log` - propertly disable the flowlog on destroy ([#7154](https://github.com/hashicorp/terraform-provider-azurerm/issues/7154))\n\n## 2.14.0 (June 11, 2020)\n\nUPGRADE NOTES:\n\n* `azurerm_kubernetes_cluster` - the Azure Policy add-on now only supports `v2` (as per the Azure API) ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n\nDEPENDENCIES: \n\n* `containerservice` - updating to `2020-03-01` ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `policy` - updating to `2019-09-01` ([#7211](https://github.com/hashicorp/terraform-provider-azurerm/issues/7211))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_blueprint_definition` ([#6930](https://github.com/hashicorp/terraform-provider-azurerm/issues/6930))\n* **New Data Source:** `azurerm_blueprint_published_version` ([#6930](https://github.com/hashicorp/terraform-provider-azurerm/issues/6930))\n* **New Data Source:** `azurerm_key_vault_certificate` ([#7285](https://github.com/hashicorp/terraform-provider-azurerm/issues/7285))\n* **New Data Source:** `azurerm_kubernetes_cluster_node_pool` ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* **New Resource:** `azurerm_blueprint_assignment` ([#6930](https://github.com/hashicorp/terraform-provider-azurerm/issues/6930))\n* **New Resource:** `azurerm_data_factory_linked_service_key_vault` ([#6971](https://github.com/hashicorp/terraform-provider-azurerm/issues/6971))\n* **New Resource:** `azurerm_iot_time_series_insights_access_policy` ([#7202](https://github.com/hashicorp/terraform-provider-azurerm/issues/7202))\n* **New Resource:** `azurerm_iot_time_series_insights_reference_data_set` ([#7112](https://github.com/hashicorp/terraform-provider-azurerm/issues/7112))\n* **New Resource:** `azurerm_app_service_hybrid_connection` ([#7224](https://github.com/hashicorp/terraform-provider-azurerm/issues/7224))\n\nENHANCEMENTS:\n\n* Data Source: `azurerm_kubernetes_cluster` - exposing the `version` of the Azure Policy add-on ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* Data Source: `azurerm_kubernetes_cluster` - exposing the `orchestrator_version` being used for each Node Pool ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* Data Source: `azurerm_kubernetes_cluster` - exposing the `disk_encryption_set_id` field ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_api_management_api` - ensuring `wsdl_selector` is populated when `content_format` is `wsdl` ([#7076](https://github.com/hashicorp/terraform-provider-azurerm/issues/7076))\n* `azurerm_cosmosdb_account` modifying `geo_location` no longer triggers a recreation of the resource ([#7217](https://github.com/hashicorp/terraform-provider-azurerm/issues/7217))\n* `azurerm_eventgrid_event_subscription` - support for `azure_function_endpoint` ([#7182](https://github.com/hashicorp/terraform-provider-azurerm/issues/7182))\n* `azurerm_eventgrid_event_subscription` - exposing `base_url`, `max_events_per_batch`, `preferred_batch_size_in_kilobytes`, `active_directory_tenant_id` and `active_directory_app_id_or_uri` in the `webhook_endpoint` block ([#7207](https://github.com/hashicorp/terraform-provider-azurerm/issues/7207))\n* `azurerm_kubernetes_cluster` - support for configuring/updating the version of Kubernetes used in the Default Node Pool ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster` - support for Microsoft Entra ID (Managed) Integration v2 ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster` - support for using a Disk Encryption Set ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster` - support for configuring the Auto-Scale Profile ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster` - support for configuring `outbound_ports_allocated` and `idle_timeout_in_minutes` within the `load_balancer_profile` block ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster` - support for the Uptime SLA / Paid SKU ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster` - exposing the `private_fqdn` of the cluster ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster_node_pool` - support for configuring/updating the version of Kubernetes ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster_node_pool` - support for Spot Node Pools ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster_node_pool` - support for System & User Node Pools ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_web_application_firewall_policy` - Add support for `GeoMatch` operator in request filter ([#7181](https://github.com/hashicorp/terraform-provider-azurerm/issues/7181))\n\nBUG FIXES:\n\n* Data Source: `azurerm_kubernetes_cluster` - fixing an issue where some read-only fields were unintentionally marked as user-configurable ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_application_gateway` - support for specifying the ID of a Key Vault Secret without a version ([#7095](https://github.com/hashicorp/terraform-provider-azurerm/issues/7095))\n* `azurerm_bot_channel_ms_teams` - only sending `calling_web_hook` when it's got a value ([#7294](https://github.com/hashicorp/terraform-provider-azurerm/issues/7294))\n* `azurerm_eventhub_namespace_authorization_rule` - handling the Resource ID changing on Azure's side from `authorizationRules` to `AuthorizationRules` ([#7248](https://github.com/hashicorp/terraform-provider-azurerm/issues/7248))\n* `azurerm_eventgrid_event_subscription` - fixing a crash when `subject_filter` was omitted ([#7222](https://github.com/hashicorp/terraform-provider-azurerm/issues/7222))\n* `azurerm_function_app` - fix app_settings when using linux consumption plan ([#7230](https://github.com/hashicorp/terraform-provider-azurerm/issues/7230))\n* `azurerm_linux_virtual_machine_scale_set` - adding validation for the `max_bid_price` field ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster` - the Azure Policy add-on is not supported in Azure China and no longer sent ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster` - the Azure Policy add-on is not supported in Azure US Government and no longer sent ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster` - the Kubernetes Dashboard add-on is not supported in Azure US Government and no longer sent ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster` - searching for a system node pool when importing the `default_node_pool` ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_kubernetes_cluster_node_pool` - changes to the `node_taints` field now force a new resource, matching the updated API behaviour ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n* `azurerm_management_group` - using the Subscription ID rather than Subscription Resource ID when detaching Subscriptions from Management Groups during deletion ([#7216](https://github.com/hashicorp/terraform-provider-azurerm/issues/7216))\n* `azurerm_windows_virtual_machine_scale_set` - adding validation for the `max_bid_price` field ([#7233](https://github.com/hashicorp/terraform-provider-azurerm/issues/7233))\n\n## 2.13.0 (June 04, 2020)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_logic_app_integration_account` ([#7099](https://github.com/hashicorp/terraform-provider-azurerm/issues/7099))\n* **New Data Source:** `azurerm_virtual_machine_scale_set` ([#7141](https://github.com/hashicorp/terraform-provider-azurerm/issues/7141))\n* **New Resource**: `azurerm_logic_app_integration_account` ([#7099](https://github.com/hashicorp/terraform-provider-azurerm/issues/7099))\n* **New Resource**: `azurerm_monitor_action_rule_action_group` ([#6563](https://github.com/hashicorp/terraform-provider-azurerm/issues/6563))\n* **New Resource**: `azurerm_monitor_action_rule_suppression` ([#6563](https://github.com/hashicorp/terraform-provider-azurerm/issues/6563))\n\nIMPROVEMENTS:\n\n* `azurerm_data_factory_pipeline` - Support for `activities` ([#6224](https://github.com/hashicorp/terraform-provider-azurerm/issues/6224))\n* `azurerm_eventgrid_event_subscription` - support for advanced filtering ([#6861](https://github.com/hashicorp/terraform-provider-azurerm/issues/6861))\n* `azurerm_signalr_service` - support for `EnableMessagingLogs` feature ([#7094](https://github.com/hashicorp/terraform-provider-azurerm/issues/7094))\n\nBUG FIXES:\n\n* `azurerm_app_service` - default priority now set on ip restricitons when not explicitly specified ([#7059](https://github.com/hashicorp/terraform-provider-azurerm/issues/7059))\n* `azurerm_app_service` - App Services check correct scope for name availability in ASE ([#7157](https://github.com/hashicorp/terraform-provider-azurerm/issues/7157))\n* `azurerm_cdn_endpoint` - `origin_host_header` can now be set to empty ([#7164](https://github.com/hashicorp/terraform-provider-azurerm/issues/7164))\n* `azurerm_cosmosdb_account` - workaround for CheckNameExists 500 response code bug ([#7189](https://github.com/hashicorp/terraform-provider-azurerm/issues/7189))\n* `azurerm_eventhub_authorization_rule` - Fix intermittent 404 errors ([#7122](https://github.com/hashicorp/terraform-provider-azurerm/issues/7122))\n* `azurerm_eventgrid_event_subscription` - fixing an error when setting the `hybrid_connection_endpoint` block ([#7203](https://github.com/hashicorp/terraform-provider-azurerm/issues/7203))\n* `azurerm_function_app` - correctly set `Kind` when `os_type` is `linux` ([#7140](https://github.com/hashicorp/terraform-provider-azurerm/issues/7140))\n* `azurerm_key_vault_certificate` - always setting the `certificate_data` and `thumbprint` fields ([#7204](https://github.com/hashicorp/terraform-provider-azurerm/issues/7204))\n* `azurerm_role_assignment` - support for Preview role assignments ([#7205](https://github.com/hashicorp/terraform-provider-azurerm/issues/7205))\n* `azurerm_virtual_network_gateway` - `vpn_client_protocols` is now also computed to prevent permanent diffs ([#7168](https://github.com/hashicorp/terraform-provider-azurerm/issues/7168))\n\n## 2.12.0 (May 28, 2020)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_advisor_recommendations` ([#6867](https://github.com/hashicorp/terraform-provider-azurerm/issues/6867))\n* **New Resource:** `azurerm_dev_test_global_shutdown_schedule` ([#5536](https://github.com/hashicorp/terraform-provider-azurerm/issues/5536))\n* **New Resource:** `azurerm_nat_gateway_public_ip_association` ([#6450](https://github.com/hashicorp/terraform-provider-azurerm/issues/6450))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_kubernetes_cluster` - exposing the `oms_agent_identity` block within the `addon_profile` block ([#7056](https://github.com/hashicorp/terraform-provider-azurerm/issues/7056))\n* Data Source: `azurerm_kubernetes_cluster` - exposing the `identity` and `kubelet_identity` properties ([#6527](https://github.com/hashicorp/terraform-provider-azurerm/issues/6527))\n* `azurerm_batch_pool` - support the `container_image_names` property ([#6689](https://github.com/hashicorp/terraform-provider-azurerm/issues/6689))\n* `azurerm_eventgrid_event_subscription` - support for the `expiration_time_utc`, `service_bus_topic_endpoint`, and `service_bus_queue_endpoint`, property ([#6860](https://github.com/hashicorp/terraform-provider-azurerm/issues/6860))\n* `azurerm_eventgrid_event_subscription` - the `eventhub_endpoint` was deprecated in favour of the `eventhub_endpoint_id` property ([#6860](https://github.com/hashicorp/terraform-provider-azurerm/issues/6860))\n* `azurerm_eventgrid_event_subscription` - the `hybrid_connection_endpoint` was deprecated in favour of the `hybrid_connection_endpoint_id` property ([#6860](https://github.com/hashicorp/terraform-provider-azurerm/issues/6860))\n* `azurerm_eventgrid_topic` - support for `input_schema`, `input_mapping_fields`, and `input_mapping_default_values` ([#6858](https://github.com/hashicorp/terraform-provider-azurerm/issues/6858))\n* `azurerm_kubernetes_cluster` - exposing the `oms_agent_identity` block within the `addon_profile` block ([#7056](https://github.com/hashicorp/terraform-provider-azurerm/issues/7056))\n* `azurerm_logic_app_action_http` - support for the `run_after` property ([#7079](https://github.com/hashicorp/terraform-provider-azurerm/issues/7079))\n* `azurerm_storage_account` - support `RAGZRS` and `GZRS` for the `account_replication_type` property ([#7080](https://github.com/hashicorp/terraform-provider-azurerm/issues/7080))\n\nBUG FIXES:\n\n* `azurerm_api_management_api_version_set` - handling changes to the Azure Resource ID ([#7071](https://github.com/hashicorp/terraform-provider-azurerm/issues/7071))\n* `azurerm_key_vault_certificate` - fixing a bug when using externally-signed certificates (using the `Unknown` issuer) where polling would continue indefinitely ([#6979](https://github.com/hashicorp/terraform-provider-azurerm/issues/6979))\n* `azurerm_linux_virtual_machine` - correctly validating the rsa ssh `public_key` properties length ([#7061](https://github.com/hashicorp/terraform-provider-azurerm/issues/7061))\n* `azurerm_linux_virtual_machine` - allow setting `virtual_machine_scale_set_id` in non-zonal deployment ([#7057](https://github.com/hashicorp/terraform-provider-azurerm/issues/7057))\n* `azurerm_servicebus_topic` - support for numbers in the `name` field ([#7027](https://github.com/hashicorp/terraform-provider-azurerm/issues/7027))\n* `azurerm_shared_image_version` - `target_region.x.storage_account_type` is now defaulted and multiple `target_region`s can be added/removed ([#6940](https://github.com/hashicorp/terraform-provider-azurerm/issues/6940))\n* `azurerm_sql_virtual_network_rule` - updating the validation for the `name` field ([#6968](https://github.com/hashicorp/terraform-provider-azurerm/issues/6968))\n* `azurerm_windows_virtual_machine` - allow setting `virtual_machine_scale_set_id` in non-zonal deployment ([#7057](https://github.com/hashicorp/terraform-provider-azurerm/issues/7057))\n* `azurerm_windows_virtual_machine` - correctly validating the rsa ssh `public_key` properties length ([#7061](https://github.com/hashicorp/terraform-provider-azurerm/issues/7061))\n\n## 2.11.0 (May 21, 2020)\n\nDEPENDENCIES:\n\n* updating `github.com/Azure/azure-sdk-for-go` to `v42.1.0` ([#6725](https://github.com/hashicorp/terraform-provider-azurerm/issues/6725))\n* updating `network` to `2020-03-01` ([#6727](https://github.com/hashicorp/terraform-provider-azurerm/issues/6727))\n\nFEATURES:\n\n* **Opt-In/Experimental Enhanced Validation for Locations:** This allows validating that the `location` field being specified is a valid Azure Region within the Azure Environment being used - which can be caught via `terraform plan` rather than `terraform apply`. This can be enabled by setting the Environment Variable `ARM_PROVIDER_ENHANCED_VALIDATION` to `true` and will be enabled by default in a future release of the AzureRM Provider ([#6927](https://github.com/hashicorp/terraform-provider-azurerm/issues/6927))\n* **Data Source:** `azurerm_data_share` ([#6789](https://github.com/hashicorp/terraform-provider-azurerm/issues/6789))\n* **New Resource:** `azurerm_data_share` ([#6789](https://github.com/hashicorp/terraform-provider-azurerm/issues/6789))\n* **New Resource:** `azurerm_iot_time_series_insights_standard_environment` ([#7012](https://github.com/hashicorp/terraform-provider-azurerm/issues/7012))\n* **New Resource:** `azurerm_orchestrated_virtual_machine_scale_set` ([#6626](https://github.com/hashicorp/terraform-provider-azurerm/issues/6626))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_platform_image` - support for `version` filter ([#6948](https://github.com/hashicorp/terraform-provider-azurerm/issues/6948))\n* `azurerm_api_management_api_version_set` - updating the validation for the `name` field ([#6947](https://github.com/hashicorp/terraform-provider-azurerm/issues/6947))\n* `azurerm_app_service` - the `ip_restriction` block now supports the `action` property ([#6967](https://github.com/hashicorp/terraform-provider-azurerm/issues/6967))\n* `azurerm_databricks_workspace` - exposing `workspace_id` and `workspace_url` ([#6973](https://github.com/hashicorp/terraform-provider-azurerm/issues/6973))\n* `azurerm_netapp_volume` - support the `mount_ip_addresses` property ([#5526](https://github.com/hashicorp/terraform-provider-azurerm/issues/5526))\n* `azurerm_redis_cache` - support new maxmemory policies `allkeys-lfu` & `volatile-lfu` ([#7031](https://github.com/hashicorp/terraform-provider-azurerm/issues/7031))\n* `azurerm_storage_account` - allowing the value `PATCH` for `allowed_methods` within the `cors_rule` block within the `blob_properties` block ([#6964](https://github.com/hashicorp/terraform-provider-azurerm/issues/6964))\n\nBUG FIXES:\n\n* Data Source: `azurerm_api_management_group` - raising an error when the Group cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_image` - raising an error when the Image cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_data_lake_store` - raising an error when Data Lake Store cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_data_share_account` - raising an error when Data Share Account cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_hdinsight_cluster` - raising an error when the HDInsight Cluster cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_healthcare_service` - raising an error when the HealthCare Service cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_healthcare_service` - ensuring all blocks are set in the response ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_firewall` - raising an error when the Firewall cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_maintenance_configuration` - raising an error when the Maintenance Configuration cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_private_endpoint_connection` - raising an error when the Private Endpoint Connection cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_resources` - does not return all matched resources sometimes ([#7036](https://github.com/hashicorp/terraform-provider-azurerm/issues/7036))\n* Data Source: `azurerm_shared_image_version` - raising an error when the Image Version cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_shared_image_versions` - raising an error when Image Versions cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* Data Source: `azurerm_user_assigned_identity` - raising an error when the User Assigned Identity cannot be found ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* `azurerm_api_management_subscription` - fix the export of `primary_key` and `secondary_key` ([#6938](https://github.com/hashicorp/terraform-provider-azurerm/issues/6938))\n* `azurerm_eventgrid_event_subscription` - correctly parsing the ID ([#6958](https://github.com/hashicorp/terraform-provider-azurerm/issues/6958))\n* `azurerm_healthcare_service` - ensuring all blocks are set in the response ([#7024](https://github.com/hashicorp/terraform-provider-azurerm/issues/7024))\n* `azurerm_linux_virtual_machine` - allowing name to end with a capital letter ([#7023](https://github.com/hashicorp/terraform-provider-azurerm/issues/7023))\n* `azurerm_linux_virtual_machine_scale_set` - allowing name to end with a capital ([#7023](https://github.com/hashicorp/terraform-provider-azurerm/issues/7023))\n* `azurerm_management_group` - workaround for 403 bug in service response ([#6668](https://github.com/hashicorp/terraform-provider-azurerm/issues/6668))\n* `azurerm_postgresql_server` - do not attempt to get the threat protection when the `sku` is `basic` ([#7015](https://github.com/hashicorp/terraform-provider-azurerm/issues/7015))\n* `azurerm_windows_virtual_machine` - allowing name to end with a capital ([#7023](https://github.com/hashicorp/terraform-provider-azurerm/issues/7023))\n* `azurerm_windows_virtual_machine_scale_set` - allowing name to end with a capital ([#7023](https://github.com/hashicorp/terraform-provider-azurerm/issues/7023))\n\n## 2.10.0 (May 14, 2020)\n\nDEPENDENCIES: \n\n* updating `eventgrid` to `2020-04-01-preview` ([#6837](https://github.com/hashicorp/terraform-provider-azurerm/issues/6837))\n* updating `iothub` to `2019-03-22-preview` ([#6875](https://github.com/hashicorp/terraform-provider-azurerm/issues/6875))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_eventhub` ([#6841](https://github.com/hashicorp/terraform-provider-azurerm/issues/6841))\n* **New Resource:** `azurerm_eventgrid_domain_topic` ([#6859](https://github.com/hashicorp/terraform-provider-azurerm/issues/6859))\n\nIMPROVEMENTS:\n\n* All Data Sources: adding validation for the `resource_group_name` field to not be empty where it's Required ([#6864](https://github.com/hashicorp/terraform-provider-azurerm/issues/6864))\n* Data Source: `azurerm_virtual_machine` - export `identity` attribute ([#6826](https://github.com/hashicorp/terraform-provider-azurerm/issues/6826))\n* `azurerm_api_management` - support for configuring the Developer Portal ([#6724](https://github.com/hashicorp/terraform-provider-azurerm/issues/6724))\n* `azurerm_api_management` - support for user assigned managed identities ([#6783](https://github.com/hashicorp/terraform-provider-azurerm/issues/6783))\n* `azurerm_api_management` - support `key_vault_id` that do not have a version ([#6723](https://github.com/hashicorp/terraform-provider-azurerm/issues/6723))\n* `azurerm_api_management_diagnostic` - support required property `api_management_logger_id` ([#6682](https://github.com/hashicorp/terraform-provider-azurerm/issues/6682))\n* `azurerm_application_gateway` - support for WAF policies ([#6105](https://github.com/hashicorp/terraform-provider-azurerm/issues/6105))\n* `azurerm_app_service_environment` - support specifying explicit resource group ([#6821](https://github.com/hashicorp/terraform-provider-azurerm/issues/6821))\n* `azurerm_express_route_circuit` - de-provision and re-provision circuit when changing the bandwidth reduction ([#6601](https://github.com/hashicorp/terraform-provider-azurerm/issues/6601))\n* `azurerm_frontdoor` - expose the `header_frontdoor_id` attribute ([#6916](https://github.com/hashicorp/terraform-provider-azurerm/issues/6916))\n* `azurerm_log_analytics_workspace` - add support for `rentention_in_days` for Free Tier ([#6844](https://github.com/hashicorp/terraform-provider-azurerm/issues/6844))\n* `azurerm_mariadb_server` - support for the `create_mode` property allowing the creation of replicas, point in time restores, and geo restors ([#6865](https://github.com/hashicorp/terraform-provider-azurerm/issues/6865))\n* `azurerm_mariadb_server` - support for the `public_network_access_enabled` property ([#6865](https://github.com/hashicorp/terraform-provider-azurerm/issues/6865))\n* `azurerm_mariadb_server` - all properties in the `storage_profile` block have been moved to the top level ([#6865](https://github.com/hashicorp/terraform-provider-azurerm/issues/6865))\n* `azurerm_mariadb_server` - the following properties were renamed and changed to a boolean type: `ssl_enforcement` to `ssl_enforcement_enabled`, `geo_redundant_backup` to `geo_redundant_backup_enabled`, and `auto_grow` \n* `azurerm_mysql_server` - support for the `create_mode` property allowing the creation of replicas, point in time restores, and geo restors ([#6833](https://github.com/hashicorp/terraform-provider-azurerm/issues/6833))\n* `azurerm_mysql_server` - support for the `public_network_access_enabled` property ([#6833](https://github.com/hashicorp/terraform-provider-azurerm/issues/6833))\n* `azurerm_mysql_server` - all properties in the `storage_profile` block have been moved to the top level ([#6833](https://github.com/hashicorp/terraform-provider-azurerm/issues/6833))\n* `azurerm_mysql_server` - the following properties were renamed and changed to a boolean type: `ssl_enforcement` to `ssl_enforcement_enabled`, `geo_redundant_backup` to `geo_redundant_backup_enabled`, and `auto_grow` to `auto_grow_enabled` ([#6833](https://github.com/hashicorp/terraform-provider-azurerm/issues/6833))\n* `azurerm_mssql_server`  - add support for the `azuread_administrator` property ([#6822](https://github.com/hashicorp/terraform-provider-azurerm/issues/6822))\n* `azurerm_postgres_server` - support for the `threat_detection_policy` property ([#6721](https://github.com/hashicorp/terraform-provider-azurerm/issues/6721))\n* `azurerm_storage_account` - enable migration of `account_kind` from `Storage` to `StorageV2` ([#6580](https://github.com/hashicorp/terraform-provider-azurerm/issues/6580))\n* `azurerm_windows_virtual_machine` - the `os_disk.disk_encryption_set_id` can now be updated ([#6846](https://github.com/hashicorp/terraform-provider-azurerm/issues/6846))\n\nBUG FIXES:\n\n* Data Source: `azurerm_automation_account` - using the ID of the Automation Account, rather than the ID of the Automation Account's Registration Info ([#6848](https://github.com/hashicorp/terraform-provider-azurerm/issues/6848))\n* Data Source: `azurerm_security_group` - fixing crash where id is nil ([#6910](https://github.com/hashicorp/terraform-provider-azurerm/issues/6910))\n* Data Source: `azurerm_mysql_server` - remove `administrator_login_password` property as it is not returned from the api ([#6865](https://github.com/hashicorp/terraform-provider-azurerm/issues/6865))\n* `azurerm_api_management` - fixing a crash when `policy` is nil ([#6862](https://github.com/hashicorp/terraform-provider-azurerm/issues/6862))\n* `azurerm_api_management` - only sending the `hostname_configuration` properties if they are not empty ([#6850](https://github.com/hashicorp/terraform-provider-azurerm/issues/6850))\n* `azurerm_api_management_diagnostic` - can now be provision again by supporting `api_management_logger_id` ([#6682](https://github.com/hashicorp/terraform-provider-azurerm/issues/6682))\n* `azurerm_api_management_named_value` - fix the non empty plan when `secret` is true ([#6834](https://github.com/hashicorp/terraform-provider-azurerm/issues/6834))\n* `azurerm_application_insights` - `retention_in_days` defaults to 90 ([#6851](https://github.com/hashicorp/terraform-provider-azurerm/issues/6851))\n* `azurerm_data_factory_trigger_schedule` - setting the `type` required for Pipeline References ([#6871](https://github.com/hashicorp/terraform-provider-azurerm/issues/6871))\n* `azurerm_kubernetes_cluster` - fixes the `InvalidLoadbalancerProfile` error ([#6534](https://github.com/hashicorp/terraform-provider-azurerm/issues/6534))\n* `azurerm_linux_virtual_machine_scale_set` - support for updating the `do_not_run_extensions_on_overprovisioned_machines` property ([#6917](https://github.com/hashicorp/terraform-provider-azurerm/issues/6917))\n* `azurerm_monitor_diagnostic_setting` - fix possible crash with `retention_policy` ([#6911](https://github.com/hashicorp/terraform-provider-azurerm/issues/6911))\n* `azurerm_mariadb_server` - the `storage_mb` property is now optional when `auto_grow` is enabled ([#6865](https://github.com/hashicorp/terraform-provider-azurerm/issues/6865))\n* `azurerm_mysql_server` - the `storage_mb` property is now optional when `auto_grow` is enabled ([#6833](https://github.com/hashicorp/terraform-provider-azurerm/issues/6833))\n* `azurerm_role_assignment` - added evential consistency check to assignment creation ([#6925](https://github.com/hashicorp/terraform-provider-azurerm/issues/6925))\n* `azurerm_windows_virtual_machine_scale_set` - support for updating the `do_not_run_extensions_on_overprovisioned_machines` property ([#6917](https://github.com/hashicorp/terraform-provider-azurerm/issues/6917))\n\n## 2.9.0 (May 07, 2020)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_data_share_account` ([#6575](https://github.com/hashicorp/terraform-provider-azurerm/issues/6575))\n* **New Resource:** `azurerm_data_share_account` ([#6575](https://github.com/hashicorp/terraform-provider-azurerm/issues/6575))\n* **New Resource:** `azurerm_function_app_slot` ([#6435](https://github.com/hashicorp/terraform-provider-azurerm/issues/6435))\n* **New Resource:** `azurerm_sentinel_alert_rule_scheduled` ([#6650](https://github.com/hashicorp/terraform-provider-azurerm/issues/6650))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_eventhub_authorization_rule` - support for the `primary_connection_string_alias` an `secondary_connection_string_alias` propeties  ([#6708](https://github.com/hashicorp/terraform-provider-azurerm/issues/6708))\n* Data Source: `azurerm_eventhub_namespace_authorization_rule` - support for the `primary_connection_string_alias` an `secondary_connection_string_alias` propeties  ([#6708](https://github.com/hashicorp/terraform-provider-azurerm/issues/6708))\n* Data Source: `azurerm_eventhub_namespace` - support for the `default_primary_connection_string_alias` an `_defaultsecondary_connection_string_alias` propeties  ([#6708](https://github.com/hashicorp/terraform-provider-azurerm/issues/6708))\n* `azurerm_analysis_services_server` - support updating when the Server is paused ([#6786](https://github.com/hashicorp/terraform-provider-azurerm/issues/6786))\n* `azurerm_app_service` - support for health_check_path preview feature added ([#6661](https://github.com/hashicorp/terraform-provider-azurerm/issues/6661))\n* `azurerm_app_service` - support for `name` and `priority` on `ip_restrictions` ([#6705](https://github.com/hashicorp/terraform-provider-azurerm/issues/6705))\n* `azurerm_application_gateway` - support for SSL Certificates without passwords ([#6742](https://github.com/hashicorp/terraform-provider-azurerm/issues/6742))\n* `azurerm_eventhub_authorization_rule` - support for the `primary_connection_string_alias` an `secondary_connection_string_alias` propeties  ([#6708](https://github.com/hashicorp/terraform-provider-azurerm/issues/6708))\n* `azurerm_eventhub_namespace_authorization_rule` - support for the `primary_connection_string_alias` an `secondary_connection_string_alias` propeties  ([#6708](https://github.com/hashicorp/terraform-provider-azurerm/issues/6708))\n* `azurerm_eventhub_namespace` - support for the `default_primary_connection_string_alias` an `_defaultsecondary_connection_string_alias` propeties  ([#6708](https://github.com/hashicorp/terraform-provider-azurerm/issues/6708))\n* `azurerm_hdinsight_hadoop_cluster` - support for metastores on cluster creation ([#6145](https://github.com/hashicorp/terraform-provider-azurerm/issues/6145))\n* `azurerm_key_vault_certificate` - support for recovering a soft-deleted certificate if the `features` flag `recover_soft_deleted_key_vaults` is set to `true` ([#6716](https://github.com/hashicorp/terraform-provider-azurerm/issues/6716))\n* `azurerm_key_vault_key` - support for recovering a soft-deleted key if the `features` flag `recover_soft_deleted_key_vaults` is set to `true` ([#6716](https://github.com/hashicorp/terraform-provider-azurerm/issues/6716))\n* `azurerm_key_vault_secret` - support for recovering a soft-deleted secret if the `features` flag `recover_soft_deleted_key_vaults` is set to `true` ([#6716](https://github.com/hashicorp/terraform-provider-azurerm/issues/6716))\n* `azurerm_linux_virtual_machine_scale_set` - support for configuring `create_mode` for data disks ([#6744](https://github.com/hashicorp/terraform-provider-azurerm/issues/6744))\n* `azurerm_monitor_diagnostic_setting` - `log_analytics_destination_type` supports `AzureDiagnostics` ([#6769](https://github.com/hashicorp/terraform-provider-azurerm/issues/6769))\n* `azurerm_windows_virtual_machine_scale_set` - support for configuring `create_mode` for data disks ([#6744](https://github.com/hashicorp/terraform-provider-azurerm/issues/6744))\n\nBUG FIXES:\n\n* provider: raising an error when the environment is set to `AZURESTACKCLOUD` ([#6817](https://github.com/hashicorp/terraform-provider-azurerm/issues/6817))\n* `azurerm_analysis_services_server` - ip restriction name field no longer case sensitive ([#6774](https://github.com/hashicorp/terraform-provider-azurerm/issues/6774))\n* `azurerm_automation_runbook` - the `publish_content_link` property is now optional ([#6813](https://github.com/hashicorp/terraform-provider-azurerm/issues/6813))\n* `azurerm_eventhub_namespace_authorization_rule` - lock to prevent multiple resources won't clash ([#6701](https://github.com/hashicorp/terraform-provider-azurerm/issues/6701))\n* `azurerm_network_interface` - changes to dns servers no longer use incremental update ([#6624](https://github.com/hashicorp/terraform-provider-azurerm/issues/6624))\n* `azurerm_policy_assignment` - allow polices with scopes without `subscription/<id>` (built-in policies) ([#6792](https://github.com/hashicorp/terraform-provider-azurerm/issues/6792))\n* `azurerm_policy_definition` - changes to the dynamic fields (`createdBy`, `createdOn`, `updatedBy`, `updatedOn`) keys in the `metadata` field are excluded from diff's ([#6734](https://github.com/hashicorp/terraform-provider-azurerm/issues/6734))\n* `azurerm_redis_cache` - ensure `rdb_storage_connection_string` is set when `rdb_backup_enabled` is enabled ([#6819](https://github.com/hashicorp/terraform-provider-azurerm/issues/6819))\n* `azurerm_site_recovery_network_mapping` - handling an API Error when checking for the presence of an existing Network Mapping ([#6747](https://github.com/hashicorp/terraform-provider-azurerm/issues/6747))\n\n## 2.8.0 (April 30, 2020)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_sentinel_alert_rule_ms_security_incident` ([#6606](https://github.com/hashicorp/terraform-provider-azurerm/issues/6606))\n* **New Data Source:** `azurerm_shared_image_versions` ([#6700](https://github.com/hashicorp/terraform-provider-azurerm/issues/6700))\n* **New Resource:** `azurerm_managed_application` ([#6386](https://github.com/hashicorp/terraform-provider-azurerm/issues/6386))\n* **New Resource:** `azurerm_mssql_server` ([#6677](https://github.com/hashicorp/terraform-provider-azurerm/issues/6677))\n* **New Resource:** `azurerm_sentinel_alert_rule_ms_security_incident` ([#6606](https://github.com/hashicorp/terraform-provider-azurerm/issues/6606))\n\nIMPROVEMENTS:\n\n* `azurerm_api_management` - `sku_name` supports the `Consumption` value for `sku` ([#6602](https://github.com/hashicorp/terraform-provider-azurerm/issues/6602))\n* `azurerm_api_management_api` - support for openapi v3 content formats ([#6618](https://github.com/hashicorp/terraform-provider-azurerm/issues/6618))\n* `azurerm_application_gateway` - support `host_names` property ([#6630](https://github.com/hashicorp/terraform-provider-azurerm/issues/6630))\n* `azurerm_express_route_circuit_peering` - support for the `customer_asn` and `routing_registry_name` propeties ([#6596](https://github.com/hashicorp/terraform-provider-azurerm/issues/6596))\n* `azurerm_frontdoor` - Add support for `backend_pools_send_receive_timeout_seconds` ([#6604](https://github.com/hashicorp/terraform-provider-azurerm/issues/6604))\n* `azurerm_mssql_server` -support the `public_network_access_enabled` property ([#6678](https://github.com/hashicorp/terraform-provider-azurerm/issues/6678))\n* `azurerm_mssql_database` - support for the `extended_auditing_policy` block ([#6402](https://github.com/hashicorp/terraform-provider-azurerm/issues/6402))\n* `azurerm_mssql_elasticpool` - support `license_type` ([#6631](https://github.com/hashicorp/terraform-provider-azurerm/issues/6631))\n* `azurerm_subnet`: Support for multiple prefixes with `address_prefixes` ([#6493](https://github.com/hashicorp/terraform-provider-azurerm/issues/6493))\n* `data.azurerm_shared_image_version` - `name` supports `latest` and `recent`  ([#6707](https://github.com/hashicorp/terraform-provider-azurerm/issues/6707))\n\nBUG FIXES:\n\n* `azurerm_key_vault` - can now be created without subscription level permissions ([#6260](https://github.com/hashicorp/terraform-provider-azurerm/issues/6260))\n* `azurerm_linux_virtual_machine` - fix validation for `name` to allow full length resource names ([#6639](https://github.com/hashicorp/terraform-provider-azurerm/issues/6639))\n* `azurerm_linux_virtual_machine_scale_set` - fix validation for `name` to allow full length resource names ([#6639](https://github.com/hashicorp/terraform-provider-azurerm/issues/6639))\n* `azurerm_monitor_diagnostic_setting` - make `retention_policy` and `retention_policy` optional ([#6603](https://github.com/hashicorp/terraform-provider-azurerm/issues/6603))\n* `azurerm_redis_cache` - correctly build connection strings when SSL is disabled ([#6635](https://github.com/hashicorp/terraform-provider-azurerm/issues/6635))\n* `azurerm_sql_database` - prevent extended auditing policy for secondary databases ([#6402](https://github.com/hashicorp/terraform-provider-azurerm/issues/6402))\n* `azurerm_web_application_firewall_policy` - support for the `managed_rules` property which is required by the new API version ([#6126](https://github.com/hashicorp/terraform-provider-azurerm/issues/6126))\n* `azurerm_windows_virtual_machine` - fix validation for `name` to allow full length resource names ([#6639](https://github.com/hashicorp/terraform-provider-azurerm/issues/6639))\n* `azurerm_windows_virtual_machine_scale_set` - fix validation for `name` to allow full length resource names ([#6639](https://github.com/hashicorp/terraform-provider-azurerm/issues/6639))\n* `azurerm_virtual_network_gateway_connection` - `shared_key` is now optional when `type` is `IPSec` ([#6565](https://github.com/hashicorp/terraform-provider-azurerm/issues/6565))\n\n## 2.7.0 (April 23, 2020)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_private_dns_zone` ([#6512](https://github.com/hashicorp/terraform-provider-azurerm/issues/6512))\n* **New Resource:** `azurerm_maintenance_configuration` ([#6038](https://github.com/hashicorp/terraform-provider-azurerm/issues/6038))\n* **New Resource:** `azurerm_servicebus_namespace_network_rule_set` ([#6379](https://github.com/hashicorp/terraform-provider-azurerm/issues/6379))\n* **New Resource:** `azurerm_spring_cloud_app` ([#6384](https://github.com/hashicorp/terraform-provider-azurerm/issues/6384))\n\nDEPENDENCIES:\n\n* updating `apimanagement` to `2019-12-01` ([#6479](https://github.com/hashicorp/terraform-provider-azurerm/issues/6479))\n* updating the fork of `github.com/Azure/go-autorest` ([#6509](https://github.com/hashicorp/terraform-provider-azurerm/issues/6509))\n\nIMPROVEMENTS:\n\n* Data Source: `app_service_environment` - export the `location` property ([#6538](https://github.com/hashicorp/terraform-provider-azurerm/issues/6538))\n* Data Source: `azurerm_notification_hub_namespace` - export `tags` ([#6578](https://github.com/hashicorp/terraform-provider-azurerm/issues/6578))\n* `azurerm_api_management` - support for virtual network integrations ([#5769](https://github.com/hashicorp/terraform-provider-azurerm/issues/5769))\n* `azurerm_cosmosdb_mongo_collection` - support for the `index` and `system_index` properties ([#6426](https://github.com/hashicorp/terraform-provider-azurerm/issues/6426))\n* `azurerm_function_app` - added `storage_account_id` and `storage_account_access_key` ([#6304](https://github.com/hashicorp/terraform-provider-azurerm/issues/6304))\n* `azurerm_kubernetes_cluster` - deprecating `private_link_enabled` in favour of `private_cluster_enabled ` ([#6431](https://github.com/hashicorp/terraform-provider-azurerm/issues/6431))\n* `azurerm_mysql_server` - support for the `public_network_access_enabled` property ([#6590](https://github.com/hashicorp/terraform-provider-azurerm/issues/6590))\n* `azurerm_notification_hub` - support for `tags` ([#6578](https://github.com/hashicorp/terraform-provider-azurerm/issues/6578))\n* `azurerm_notification_hub_namespace` - support for `tags` ([#6578](https://github.com/hashicorp/terraform-provider-azurerm/issues/6578))\n* `azurerm_postgres_server` - support for the `create_mode` property allowing replicas, point in time restores, and geo restores to be created ([#6459](https://github.com/hashicorp/terraform-provider-azurerm/issues/6459))\n* `azurerm_postgres_server` - support for the `infrastructure_encryption_enabled`, `public_network_access_enabled`, and `ssl_minimal_tls_version_enforced` properties ([#6459](https://github.com/hashicorp/terraform-provider-azurerm/issues/6459))\n* `azurerm_postgres_server` - all properties in the `storage_profile` block have been moved to the top level ([#6459](https://github.com/hashicorp/terraform-provider-azurerm/issues/6459))\n* `azurerm_postgres_server` - the following properties were renamed and changed to a boolean type: `ssl_enforcement` to `ssl_enforcement_enabled`, `geo_redundant_backup` to `geo_redundant_backup_enabled`, and `auto_grow` to `auto_grow_enabled` ([#6459](https://github.com/hashicorp/terraform-provider-azurerm/issues/6459))\n* `azurerm_private_endpoint` - Add support for `tags` ([#6574](https://github.com/hashicorp/terraform-provider-azurerm/issues/6574))\n* `azurerm_shared_image` - support `hyper_v_generation` property ([#6511](https://github.com/hashicorp/terraform-provider-azurerm/issues/6511))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `automatic_instance_repair` property ([#6346](https://github.com/hashicorp/terraform-provider-azurerm/issues/6346))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `automatic_instance_repair` property ([#6346](https://github.com/hashicorp/terraform-provider-azurerm/issues/6346))\n\nBUG FIXES:\n\n* Data Source: `azurerm_private_link_service` - fixing a crash when parsing the response ([#6504](https://github.com/hashicorp/terraform-provider-azurerm/issues/6504))\n* `azurerm_application_gateway` - prevent panic by disallowing empty values for `backend_address_pool.#.fqdns` ([#6549](https://github.com/hashicorp/terraform-provider-azurerm/issues/6549))\n* `azurerm_application_gateway` - block reordering without changes no longer causes update ([#6476](https://github.com/hashicorp/terraform-provider-azurerm/issues/6476))\n* `azurerm_cdn_endpoint` - `origin_host_header` is now required ([#6550](https://github.com/hashicorp/terraform-provider-azurerm/issues/6550))\n* `azurerm_cdn_endpoint` - setting the `request_header_condition` block ([#6541](https://github.com/hashicorp/terraform-provider-azurerm/issues/6541))\n* `azurerm_iothub_dps` - fix crash when path isn't cased correctly ([#6570](https://github.com/hashicorp/terraform-provider-azurerm/issues/6570))\n* `azurerm_linux_virtual_machine_scale_set` - fixes crash with `boot_diagnositics` ([#6569](https://github.com/hashicorp/terraform-provider-azurerm/issues/6569))\n* `azurerm_policy_assignment` - allow scopes that don't start with `subscription/<id>` ([#6576](https://github.com/hashicorp/terraform-provider-azurerm/issues/6576))\n* `azurerm_postgres_server` - the `storage_mb` property is now optional when `auto_grow` is enabled ([#6459](https://github.com/hashicorp/terraform-provider-azurerm/issues/6459))\n* `azurerm_public_ip_prefix` - update `prefix_length` validation to accept all valid IPv4 address ranges ([#6589](https://github.com/hashicorp/terraform-provider-azurerm/issues/6589))\n* `azurerm_route` - add validation to the `name` and `route_table_name`propeties ([#6055](https://github.com/hashicorp/terraform-provider-azurerm/issues/6055))\n* `azurerm_virtual_network_gateway` - per api requirements, `public_ip_address_id` is required ([#6548](https://github.com/hashicorp/terraform-provider-azurerm/issues/6548))\n\n## 2.6.0 (April 16, 2020)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_policy_set_definition` ([#6305](https://github.com/hashicorp/terraform-provider-azurerm/issues/6305))\n\nDEPENDENCIES:\n\n* updating `github.com/Azure/azure-sdk-for-go` to `v41.2.0` ([#6419](https://github.com/hashicorp/terraform-provider-azurerm/issues/6419))\n\nIMPROVEMENTS:\n\n* Data Source: `azurerm_policy_definition` - can now lookup with `name` ([#6275](https://github.com/hashicorp/terraform-provider-azurerm/issues/6275))\n* Data Source: `azurerm_policy_definition` - the field `management_group_id` has been deprecated and renamed to `management_group_name` ([#6275](https://github.com/hashicorp/terraform-provider-azurerm/issues/6275))\n* `azurerm_application_insights` - support for the `disable_ip_masking` property ([#6354](https://github.com/hashicorp/terraform-provider-azurerm/issues/6354))\n* `azurerm_cdn_endpoint` - support for configuring `delivery_rule` ([#6163](https://github.com/hashicorp/terraform-provider-azurerm/issues/6163))\n* `azurerm_cdn_endpoint` - support for configuring `global_delivery_rule` ([#6163](https://github.com/hashicorp/terraform-provider-azurerm/issues/6163))\n* `azurerm_function_app` - support for the `pre_warmed_instance_count` property ([#6333](https://github.com/hashicorp/terraform-provider-azurerm/issues/6333))\n* `azurerm_hdinsight_hadoop_cluster` - support for the `tls_min_version` property ([#6440](https://github.com/hashicorp/terraform-provider-azurerm/issues/6440))\n* `azurerm_hdinsight_hbase_cluster` - support for the `tls_min_version` property ([#6440](https://github.com/hashicorp/terraform-provider-azurerm/issues/6440))\n* `azurerm_hdinsight_interactive_query_cluster` - support for the `tls_min_version` property ([#6440](https://github.com/hashicorp/terraform-provider-azurerm/issues/6440))\n* `azurerm_hdinsight_kafka_cluster` - support for the `tls_min_version` property ([#6440](https://github.com/hashicorp/terraform-provider-azurerm/issues/6440))\n* `azurerm_hdinsight_ml_services_cluster` - support for the `tls_min_version` property ([#6440](https://github.com/hashicorp/terraform-provider-azurerm/issues/6440))\n* `azurerm_hdinsight_rserver_cluster` - support for the `tls_min_version` property ([#6440](https://github.com/hashicorp/terraform-provider-azurerm/issues/6440))\n* `azurerm_hdinsight_spark_cluster` - support for the `tls_min_version` property ([#6440](https://github.com/hashicorp/terraform-provider-azurerm/issues/6440))\n* `azurerm_hdinsight_storm_cluster` - support the `threat_detection_policy` property ([#6437](https://github.com/hashicorp/terraform-provider-azurerm/issues/6437))\n* `azurerm_kubernetes_cluster` - exporting the `kubelet_identity` ([#6393](https://github.com/hashicorp/terraform-provider-azurerm/issues/6393))\n* `azurerm_kubernetes_cluster` - support for updating the `managed_outbound_ip_count`, `outbound_ip_prefix_ids` and `outbound_ip_address_ids` fields within the `load_balancer_profile` block ([#5847](https://github.com/hashicorp/terraform-provider-azurerm/issues/5847))\n* `azurerm_network_interface` - export the `internal_domain_name_suffix` property ([#6455](https://github.com/hashicorp/terraform-provider-azurerm/issues/6455))\n* `azurerm_policy_definition` - the `management_group_id` has been deprecated and renamed to `management_group_name` ([#6275](https://github.com/hashicorp/terraform-provider-azurerm/issues/6275))\n* `azurerm_sql_server` - support for the `connection_policy` property ([#6438](https://github.com/hashicorp/terraform-provider-azurerm/issues/6438))\n* `azurerm_virtual_network` - export the `guid` attribute ([#6445](https://github.com/hashicorp/terraform-provider-azurerm/issues/6445))\n\nBUG FIXES:\n\n* Data Source: `azurerm_data_factory`- fixing a bug where the ID wasn't set ([#6492](https://github.com/hashicorp/terraform-provider-azurerm/issues/6492))\n* Data Source: `azurerm_eventhub_namespace_authorization_rule` - ensuring the `id` field is set ([#6496](https://github.com/hashicorp/terraform-provider-azurerm/issues/6496))\n* Data Source: `azurerm_mariadb_server` - ensuring the `id` field is set ([#6496](https://github.com/hashicorp/terraform-provider-azurerm/issues/6496))\n* Data Source: `azurerm_network_ddos_protection_plan` - ensuring the `id` field is set ([#6496](https://github.com/hashicorp/terraform-provider-azurerm/issues/6496))\n* `azurerm_function_app` - prevent a panic from the API returning an empty IP Security Restriction ([#6442](https://github.com/hashicorp/terraform-provider-azurerm/issues/6442))\n* `azurerm_machine_learning_workspace` - the `Enterprise` sku will now properly work ([#6397](https://github.com/hashicorp/terraform-provider-azurerm/issues/6397))\n* `azurerm_managed_disk`-  fixing a bug where the machine would be stopped regardless of whether it was currently shut down or not ([#4690](https://github.com/hashicorp/terraform-provider-azurerm/issues/4690))\n\n## 2.5.0 (April 09, 2020)\n\nBREAKING CHANGES:\n\n* Azure Kubernetes Service\n\t* Due to a breaking change in the AKS API, the `azurerm_kubernetes_cluster` resource features a significant behavioural change where creating Mixed-Mode Authentication clusters (e.g. using a Service Principal with a Managed Identity) is no longer supported.\n\t* The AKS Team have confirmed that existing clusters will be updated by the Azure API to use only MSI when a change is made to the Cluster (but not the Node Pool). Whilst Terraform could perform this automatically some environments have restrictions on which tags can be added/removed - as such this operation will need to be performed out-of-band. Instead, upon detecting a Mixed-Mode Cluster which has not yet been updated - or upon detecting a former Mixed-Mode Cluster where the Terraform Configuration still contains a `service_principal` block - Terraform will output instructions on how to proceed.\n\t* `azurerm_kubernetes_cluster_node_pool` - clusters with auto-scale disabled must ensure that `min_count` and `max_count` are set to `null` (or omitted) rather than `0` (since 0 isn't a valid value for these fields).\n\nNOTES:\n\n* There's currently a bug in the Azure Kubernetes Service (AKS) API where the Tags on Node Pools are returned in the incorrect case - [this bug is being tracked in this issue](https://github.com/Azure/azure-rest-api-specs/issues/8952). This affects the `tags` field within the `default_node_pool` block for `azurerm_kubernetes_clusters` and the `tags` field for the `azurerm_kubernetes_cluster_node_pool` resource.\n\nIMPROVEMENTS:\n\n* dependencies: updating to use version `2020-02-01` of the Containers API ([#6095](https://github.com/hashicorp/terraform-provider-azurerm/issues/6095))\n* **New Resource:** `azurerm_private_dns_txt_record` ([#6309](https://github.com/hashicorp/terraform-provider-azurerm/issues/6309))\n* `azurerm_kubernetes_cluster` - making the `service_principal` block optional - so it's now possible to create MSI-only clusters ([#6095](https://github.com/hashicorp/terraform-provider-azurerm/issues/6095))\n* `azurerm_kubernetes_cluster` - making the `windows_profile` block computed as Windows credentials are now generated by Azure if unspecified ([#6095](https://github.com/hashicorp/terraform-provider-azurerm/issues/6095))\n* `azurerm_kubernetes_cluster` - support for `outbound_type` within the `network_profile` block ([#6120](https://github.com/hashicorp/terraform-provider-azurerm/issues/6120))\n* `azurerm_linux_virtual_machine` - OS disk encryption settings can no be updated ([#6230](https://github.com/hashicorp/terraform-provider-azurerm/issues/6230))\n* `azurerm_windows_virtual_machine` - OS disk encryption settings can no be updated ([#6230](https://github.com/hashicorp/terraform-provider-azurerm/issues/6230))\n\nBUG FIXES:\n\n* `azurerm_kubernetes_cluster` - requiring that `min_count` and `max_count` within the `default_node_pool` block are set to `null` rather than `0` when auto-scaling is disabled ([#6095](https://github.com/hashicorp/terraform-provider-azurerm/issues/6095))\n* `azurerm_kubernetes_cluster` - ensuring that a value for `node_count` within the `default_node_pool` block is always passed to the API to match a requirement in the API ([#6095](https://github.com/hashicorp/terraform-provider-azurerm/issues/6095))\n* `azurerm_kubernetes_cluster` - ensuring that `tags` are set into the state for the `default_node_pool` ([#6095](https://github.com/hashicorp/terraform-provider-azurerm/issues/6095))\n* `azurerm_kubernetes_cluster` - conditionally sending the `aci_connector_linux` block for Azure China ([#6370](https://github.com/hashicorp/terraform-provider-azurerm/issues/6370))\n* `azurerm_kubernetes_cluster` - conditionally sending the `http_application_routing` block for Azure China & Azure US Government ([#6370](https://github.com/hashicorp/terraform-provider-azurerm/issues/6370))\n* `azurerm_kubernetes_cluster_node_pool` - requiring that `min_count` and `max_count` are set to `null` rather than `0` when auto-scaling is disabled ([#6095](https://github.com/hashicorp/terraform-provider-azurerm/issues/6095))\n* `azurerm_linux_virtual_machine` - if the `priority` property on read is empty assume it to be `Regular` ([#6301](https://github.com/hashicorp/terraform-provider-azurerm/issues/6301))\n* `azurerm_windows_virtual_machine` - if the `priority` property on read is empty assume it to be `Regular` ([#6301](https://github.com/hashicorp/terraform-provider-azurerm/issues/6301))\n\n## 2.4.0 (April 02, 2020)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_managed_application_definition` ([#6211](https://github.com/hashicorp/terraform-provider-azurerm/issues/6211))\n* **New Resource:** `azurerm_hpc_cache_nfs_target` ([#6191](https://github.com/hashicorp/terraform-provider-azurerm/issues/6191))\n* **New Resource:** `azurerm_log_analytics_datasource_windows_event ` ([#6321](https://github.com/hashicorp/terraform-provider-azurerm/issues/6321))\n* **New Resource:** `azurerm_log_analytics_datasource_windows_performance_counter` ([#6274](https://github.com/hashicorp/terraform-provider-azurerm/issues/6274))\n* **New Resource:** `azurerm_managed_application_definition` ([#6211](https://github.com/hashicorp/terraform-provider-azurerm/issues/6211))\n* **New Resource:** `azurerm_spring_cloud_service` ([#4928](https://github.com/hashicorp/terraform-provider-azurerm/issues/4928))\n\nIMPROVEMENTS:\n\n* `azurerm_network_interface` - always send `enable_accelerated_networking` to the api ([#6289](https://github.com/hashicorp/terraform-provider-azurerm/issues/6289))\n* `azurerm_management_group` - deprecated and rename the `group_id` property to `name` to better match what it represents ([#6276](https://github.com/hashicorp/terraform-provider-azurerm/issues/6276))\n\nBUGS:\n\n* `azurerm_application_gateway` - can now set `include_path` with `target_url` ([#6175](https://github.com/hashicorp/terraform-provider-azurerm/issues/6175))\n* `azurerm_policy_set_definition` - mark `metadata` as computed ([#6266](https://github.com/hashicorp/terraform-provider-azurerm/issues/6266))\n\n## 2.3.0 (March 27, 2020)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_mssql_database` ([#6083](https://github.com/hashicorp/terraform-provider-azurerm/issues/6083))\n* **New Data source:** `azurerm_network_service_tags` ([#6229](https://github.com/hashicorp/terraform-provider-azurerm/issues/6229))\n* **New Resource:** `azurerm_custom_resource_provider` ([#6234](https://github.com/hashicorp/terraform-provider-azurerm/issues/6234))\n* **New Resource:** `azurerm_hpc_cache_blob_target` ([#6035](https://github.com/hashicorp/terraform-provider-azurerm/issues/6035))\n* **New Resource:** `azurerm_machine_learning_workspace` ([#5696](https://github.com/hashicorp/terraform-provider-azurerm/issues/5696))\n* **New Resource:** `azurerm_mssql_database` ([#6083](https://github.com/hashicorp/terraform-provider-azurerm/issues/6083))\n* **New Resource:** `azurerm_mssql_virtual_machine` ([#5263](https://github.com/hashicorp/terraform-provider-azurerm/issues/5263))\n* **New resource:** `azurerm_policy_remediation` ([#5746](https://github.com/hashicorp/terraform-provider-azurerm/issues/5746))\n\nIMPROVEMENTS:\n\n* dependencies: updating `github.com/Azure/azure-sdk-for-go` to `v40.3.0` ([#6134](https://github.com/hashicorp/terraform-provider-azurerm/issues/6134))\n* dependencies: updating `github.com/terraform-providers/terraform-provider-azuread` to `v0.8.0` ([#6134](https://github.com/hashicorp/terraform-provider-azurerm/issues/6134))\n* dependencies: updating `github.com/tombuildsstuff/giovanni` to `v0.10.0` ([#6169](https://github.com/hashicorp/terraform-provider-azurerm/issues/6169))\n* all resources using the `location` field - adding validation to ensure this is not an empty string where this field is Required ([#6242](https://github.com/hashicorp/terraform-provider-azurerm/issues/6242))\n* Data Source `azurerm_storage_container` - exposing the `resource_manager_id` field ([#6170](https://github.com/hashicorp/terraform-provider-azurerm/issues/6170))\n* `azurerm_automation_schedule` - adding validation for the timezone field ([#5759](https://github.com/hashicorp/terraform-provider-azurerm/issues/5759))\n* `azurerm_cognitive_account` - support for the `qna_runtime_endpoint` property ([#5778](https://github.com/hashicorp/terraform-provider-azurerm/issues/5778))\n* `azurerm_hpc_cache` - exposing the `mount_addresses` field ([#6214](https://github.com/hashicorp/terraform-provider-azurerm/issues/6214))\n* `azurerm_lb` - allow ipv6 addresses for the `private_ip_address` property ([#6125](https://github.com/hashicorp/terraform-provider-azurerm/issues/6125))\n* `azurerm_managed_disk` - the `disk_encryption_set_id` field is no longer ForceNew ([#6207](https://github.com/hashicorp/terraform-provider-azurerm/issues/6207))\n* `azurerm_public_ip` - support for Dynamic IPv6 Addresses ([#6140](https://github.com/hashicorp/terraform-provider-azurerm/issues/6140))\n* `azurerm_service_fabric_cluster` - support for the `client_certificate_common_name` property ([#6097](https://github.com/hashicorp/terraform-provider-azurerm/issues/6097))\n* `azurerm_storage_container` - exposing the `resource_manager_id` field ([#6170](https://github.com/hashicorp/terraform-provider-azurerm/issues/6170))\n* `azurerm_storage_share` - exposing the `resource_manager_id` field ([#6170](https://github.com/hashicorp/terraform-provider-azurerm/issues/6170))\n* `azurerm_traffic_manager_profile` - support for the `custom_header` property ([#5923](https://github.com/hashicorp/terraform-provider-azurerm/issues/5923))\n\nBUG FIXES:\n\n* `azurerm_analysis_server` - switching the `ipv4_firewall_rule` block to a Set rather than a List to handle this being unordered ([#6179](https://github.com/hashicorp/terraform-provider-azurerm/issues/6179))\n* `azurerm_linux_virtual_machine` - making the `custom_data` field sensitive ([#6225](https://github.com/hashicorp/terraform-provider-azurerm/issues/6225))\n* `azurerm_linux_virtual_machine_scale_set` - making the `custom_data` field sensitive ([#6225](https://github.com/hashicorp/terraform-provider-azurerm/issues/6225))\n* `azurerm_managed_disk`- only rebooting the attached Virtual Machine when changing the Disk Size, Disk Encryption Set ID or Storage Account Type ([#6162](https://github.com/hashicorp/terraform-provider-azurerm/issues/6162))\n* `azurerm_netapp_volume` - allow up to `102400` MB for the `storage_quota_in_gb` property ([#6228](https://github.com/hashicorp/terraform-provider-azurerm/issues/6228))\n* `azurerm_policy_definition` - fixing a bug when parsing the Management Group ID ([#5981](https://github.com/hashicorp/terraform-provider-azurerm/issues/5981))\n* `azurerm_postgresql_server` - updating the validation for the `name` field ([#6064](https://github.com/hashicorp/terraform-provider-azurerm/issues/6064))\n* `azurerm_sql_database` - use the correct base URI for the Extended Auditing Policies Client ([#6233](https://github.com/hashicorp/terraform-provider-azurerm/issues/6233))\n* `azurerm_storage_management_policy` - conditionally setting values within the `base_blob` block ([#6250](https://github.com/hashicorp/terraform-provider-azurerm/issues/6250))\n* `azurerm_virtual_machine_data_disk_attachment` - detecting the disk attachment as gone when the VM is no longer available ([#6237](https://github.com/hashicorp/terraform-provider-azurerm/issues/6237))\n* `azurerm_windows_virtual_machine` - making the `custom_data` field sensitive ([#6225](https://github.com/hashicorp/terraform-provider-azurerm/issues/6225))\n* `azurerm_windows_virtual_machine_scale_set` - making the `custom_data` field sensitive ([#6225](https://github.com/hashicorp/terraform-provider-azurerm/issues/6225))\n\n## 2.2.0 (March 18, 2020)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_app_configuration` ([#6133](https://github.com/hashicorp/terraform-provider-azurerm/issues/6133))\n* **New Data Source:** `azurerm_powerbi_embedded` ([#5152](https://github.com/hashicorp/terraform-provider-azurerm/issues/5152))\n* **New Resource:** `azurerm_cost_management_export_resource_group` ([#6131](https://github.com/hashicorp/terraform-provider-azurerm/issues/6131))\n* **New Resource:** `azurerm_powerbi_embedded` ([#5152](https://github.com/hashicorp/terraform-provider-azurerm/issues/5152))\n* **New Resource:** `azurerm_virtual_hub_connection` ([#5951](https://github.com/hashicorp/terraform-provider-azurerm/issues/5951))\n\nIMPROVEMENTS:\n\n* Data Source: * `azurerm_logic_app_workflow`  - expose computed field: `endpoint_configuration` ([#5862](https://github.com/hashicorp/terraform-provider-azurerm/issues/5862))\n* `azurerm_application_gateway` - support for key vault SSL certificate via the `key_value_secret_id` property ([#4366](https://github.com/hashicorp/terraform-provider-azurerm/issues/4366))\n* `azurerm_function_app` - support for configuring `daily_memory_time_quota` ([#6100](https://github.com/hashicorp/terraform-provider-azurerm/issues/6100))\n* `azurerm_logic_app_workflow`  - expose computed field: `endpoint_configuration` ([#5862](https://github.com/hashicorp/terraform-provider-azurerm/issues/5862))\n* `azurerm_linux_virtual_machine_scale_set` - support for `scale_in_policy` and `terminate_notification` ([#5391](https://github.com/hashicorp/terraform-provider-azurerm/issues/5391))\n* `azurerm_sql_database` - support for the `extended_auditing_policy` property ([#5049](https://github.com/hashicorp/terraform-provider-azurerm/issues/5049))\n* `azurerm_windows_virtual_machine_scale_set` - support for `scale_in_policy` and `terminate_notification` ([#5391](https://github.com/hashicorp/terraform-provider-azurerm/issues/5391))\n\nBUG FIXES:\n\n* Data Source: `azurerm_iothub_dps_shared_access_policy` - building the `primary_connection_string` and `secondary_connection_string` from the Service endpoint rather than the Devices endpoint ([#6108](https://github.com/hashicorp/terraform-provider-azurerm/issues/6108))\n* `azurerm_function_app` - Add `WEBSITE_CONTENT` & `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` for premium plans ([#5761](https://github.com/hashicorp/terraform-provider-azurerm/issues/5761))\n* `azurerm_iothub_dps_shared_access_policy` - building the `primary_connection_string` and `secondary_connection_string` from the Service endpoint rather than the Devices endpoint ([#6108](https://github.com/hashicorp/terraform-provider-azurerm/issues/6108))\n* `azurerm_linux_virtual_machine` - updating the validation for `name` to allow periods ([#5966](https://github.com/hashicorp/terraform-provider-azurerm/issues/5966))\n* `azurerm_linux_virtual_machine_scale_set` - updating the validation for `name` to allow periods ([#5966](https://github.com/hashicorp/terraform-provider-azurerm/issues/5966))\n* `azurerm_storage_management_policy` - Fixed the use of single blob rule actions ([#5803](https://github.com/hashicorp/terraform-provider-azurerm/issues/5803))\n\n## 2.1.0 (March 11, 2020)\n\nNOTES:\n\nThe `azurerm_frontdoor` resource has introduced a breaking change due to the underlying service API which enforces `location` attributes must be set to 'Global' on all newly deployed Front Door services.\n\nFEATURES:\n\n* **New Data Source:** `azurerm_database_migration_project` ([#5993](https://github.com/hashicorp/terraform-provider-azurerm/issues/5993))\n* **New Data Source:** `azurerm_database_migration_service` ([#5258](https://github.com/hashicorp/terraform-provider-azurerm/issues/5258))\n* **New Data Source:** `azurerm_kusto_cluster` ([#5942](https://github.com/hashicorp/terraform-provider-azurerm/issues/5942))\n* **New Data Source:** `azurerm_servicebus_topic_authorization_rule` ([#6017](https://github.com/hashicorp/terraform-provider-azurerm/issues/6017))\n* **New Resource:** `azurerm_bot_channel_directline` ([#5445](https://github.com/hashicorp/terraform-provider-azurerm/issues/5445))\n* **New Resource:** `azurerm_database_migration_project` ([#5993](https://github.com/hashicorp/terraform-provider-azurerm/issues/5993))\n* **New Resource:** `azurerm_database_migration_service` ([#5258](https://github.com/hashicorp/terraform-provider-azurerm/issues/5258))\n* **New Resource:** `azurerm_hpc_cache` ([#5528](https://github.com/hashicorp/terraform-provider-azurerm/issues/5528))\n* **New Resource:** `azurerm_iotcentral_application` ([#5446](https://github.com/hashicorp/terraform-provider-azurerm/issues/5446))\n* **New Resource:** `azurerm_monitor_scheduled_query_rules_alert` ([#5053](https://github.com/hashicorp/terraform-provider-azurerm/issues/5053))\n* **New Resource:** `azurerm_monitor_scheduled_query_rules_log` ([#5053](https://github.com/hashicorp/terraform-provider-azurerm/issues/5053))\n* **New Resource:** `azurerm_spatial_anchors_account` ([#6011](https://github.com/hashicorp/terraform-provider-azurerm/issues/6011))\n\nIMPROVEMENTS:\n\n* batch: upgrading to API version `2019-08-01` ([#5967](https://github.com/hashicorp/terraform-provider-azurerm/issues/5967))\n* containerservice: upgrading to API version `2019-11-01` ([#5531](https://github.com/hashicorp/terraform-provider-azurerm/issues/5531))\n* netapp: upgrading to API version `2019-10-01` ([#5531](https://github.com/hashicorp/terraform-provider-azurerm/issues/5531))\n* dependencies: temporarily switching to using a fork of `github.com/Azure/go-autorest` to workaround an issue in the storage authorizer ([#6050](https://github.com/hashicorp/terraform-provider-azurerm/issues/6050))\n* dependencies: updating `github.com/tombuildsstuff/giovanni` to `v0.9.0` ([#6050](https://github.com/hashicorp/terraform-provider-azurerm/issues/6050))\n* `azurerm_application_gateway` - support up to `125` for the `capacity` property with V2 SKU's ([#5906](https://github.com/hashicorp/terraform-provider-azurerm/issues/5906))\n* `azurerm_automation_dsc_configuration` - support for the `tags` property ([#5827](https://github.com/hashicorp/terraform-provider-azurerm/issues/5827))\n* `azurerm_batch_pool` - support for the `public_ips` property ([#5967](https://github.com/hashicorp/terraform-provider-azurerm/issues/5967))\n* `azurerm_frontdoor` - exposed new attributes in `backend_pool_health_probe` block `enabled` and `probe_method` ([#5924](https://github.com/hashicorp/terraform-provider-azurerm/issues/5924))\n* `azurerm_function_app` - Added `os_type` field to facilitate support of `linux` function apps ([#5839](https://github.com/hashicorp/terraform-provider-azurerm/issues/5839))\n* `azurerm_kubernetes_cluster`: Support for the `node_labels` property ([#5531](https://github.com/hashicorp/terraform-provider-azurerm/issues/5531))\n* `azurerm_kubernetes_cluster`: Support for the `tags` property ([#5931](https://github.com/hashicorp/terraform-provider-azurerm/issues/5931))\n* `azurerm_kubernetes_cluster_node_pool`: Support for the `node_labels` property ([#5531](https://github.com/hashicorp/terraform-provider-azurerm/issues/5531))\n* `azurerm_kubernetes_cluster_node_pool`: Support for the `tags` property ([#5931](https://github.com/hashicorp/terraform-provider-azurerm/issues/5931))\n* `azurerm_kusto_cluster` - support for `enable_disk_encryption` and `enable_streaming_ingest` properties ([#5855](https://github.com/hashicorp/terraform-provider-azurerm/issues/5855))\n* `azurerm_lb` - support for the `private_ip_address_version` property ([#5590](https://github.com/hashicorp/terraform-provider-azurerm/issues/5590))\n* `azurerm_mariadb_server` - changing the `geo_redundant_backup` property now forces a new resource ([#5961](https://github.com/hashicorp/terraform-provider-azurerm/issues/5961))\n* `azurerm_netapp_account` - support for the `tags` property ([#5995](https://github.com/hashicorp/terraform-provider-azurerm/issues/5995))\n* `azurerm_netapp_pool` - support for the `tags` property ([#5995](https://github.com/hashicorp/terraform-provider-azurerm/issues/5995))\n* `azurerm_netapp_snapshot` - support for the `tags` property ([#5995](https://github.com/hashicorp/terraform-provider-azurerm/issues/5995))\n* `azurerm_netapp_volume` - support for the `tags` property ([#5995](https://github.com/hashicorp/terraform-provider-azurerm/issues/5995))\n* `azurerm_netapp_volume` - support for the `protocol_types` property ([#5485](https://github.com/hashicorp/terraform-provider-azurerm/issues/5485))\n* `azurerm_netapp_volume` - deprecated the `cifs_enabled`, `nfsv3_enabled`, and `nfsv4_enabled` properties in favour of `protocols_enabled` ([#5485](https://github.com/hashicorp/terraform-provider-azurerm/issues/5485))\n* `azurerm_network_watcher_flow_log` - support for the traffic analysis `interval_in_minutes` property ([#5851](https://github.com/hashicorp/terraform-provider-azurerm/issues/5851))\n* `azurerm_private_dns_a_record` - export the `fqdn` property ([#5949](https://github.com/hashicorp/terraform-provider-azurerm/issues/5949))\n* `azurerm_private_dns_aaaa_record` - export the `fqdn` property ([#5949](https://github.com/hashicorp/terraform-provider-azurerm/issues/5949))\n* `azurerm_private_dns_cname_record` - export the `fqdn` property ([#5949](https://github.com/hashicorp/terraform-provider-azurerm/issues/5949))\n* `azurerm_private_dns_mx_record` - export the `fqdn` property ([#5949](https://github.com/hashicorp/terraform-provider-azurerm/issues/5949))\n* `azurerm_private_dns_ptr_record` - export the `fqdn` property ([#5949](https://github.com/hashicorp/terraform-provider-azurerm/issues/5949))\n* `azurerm_private_dns_srv_record` - export the `fqdn` property ([#5949](https://github.com/hashicorp/terraform-provider-azurerm/issues/5949))\n* `azurerm_private_endpoint` - exposed `private_ip_address` as a computed attribute ([#5838](https://github.com/hashicorp/terraform-provider-azurerm/issues/5838))\n* `azurerm_redis_cache` - support for the `primary_connection_string` and `secondary_connection_string` properties ([#5958](https://github.com/hashicorp/terraform-provider-azurerm/issues/5958))\n* `azurerm_sql_server` - support for the `extended_auditing_policy` property ([#5036](https://github.com/hashicorp/terraform-provider-azurerm/issues/5036))\n* `azurerm_storage_account` - support up to 50 tags ([#5934](https://github.com/hashicorp/terraform-provider-azurerm/issues/5934))\n* `azurerm_virtual_wan` - support for the `type` property ([#5877](https://github.com/hashicorp/terraform-provider-azurerm/issues/5877))\n\nBUG FIXES:\n\n* `azurerm_app_service_plan` - no longer sends an empty `app_service_environment_id` property on update ([#5915](https://github.com/hashicorp/terraform-provider-azurerm/issues/5915))\n* `azurerm_automation_schedule` - fix time validation ([#5876](https://github.com/hashicorp/terraform-provider-azurerm/issues/5876))\n* `azurerm_batch_pool` - `frontend_port_range ` is now set correctly. ([#5941](https://github.com/hashicorp/terraform-provider-azurerm/issues/5941))\n* `azurerm_dns_txt_record` - support records up to `1024` characters in length ([#5837](https://github.com/hashicorp/terraform-provider-azurerm/issues/5837))\n* `azurerm_frontdoor` - fix the way `backend_pool_load_balancing`/`backend_pool_health_probe` ([#5924](https://github.com/hashicorp/terraform-provider-azurerm/issues/5924))\n* `azurerm_frontdoor` - all new front door resources to be created in the `Global` location ([#6015](https://github.com/hashicorp/terraform-provider-azurerm/issues/6015))\n* `azurerm_frontdoor_firewall_policy` - add validation for Frontdoor WAF Name Restrictions ([#5943](https://github.com/hashicorp/terraform-provider-azurerm/issues/5943))\n* `azurerm_linux_virtual_machine_scale_set` - correct `source_image_id` validation ([#5901](https://github.com/hashicorp/terraform-provider-azurerm/issues/5901))\n* `azurerm_netapp_volume` - support volmes uoto `100TB` in size ([#5485](https://github.com/hashicorp/terraform-provider-azurerm/issues/5485))\n* `azurerm_search_service` - changing the properties `replica_count` & `partition_count` properties no longer force a new resource ([#5935](https://github.com/hashicorp/terraform-provider-azurerm/issues/5935))\n* `azurerm_storage_account` - fixing a crash when an empty `static_website` block was specified ([#6050](https://github.com/hashicorp/terraform-provider-azurerm/issues/6050))\n* `azurerm_storage_account` - using SharedKey Authorization for reading/updating the Static Website when not using AzureAD authentication ([#6050](https://github.com/hashicorp/terraform-provider-azurerm/issues/6050))\n\n## 2.0.0 (February 24, 2020)\n\nNOTES:\n\n* **Major Version:** Version 2.0 of the Azure Provider is a major version - some deprecated fields/resources have been removed - please [refer to the 2.0 upgrade guide for more information](https://registry.terraform.io/providers/hashicorp/azurerm/2.97.0/docs/guides/2.0-upgrade-guide).\n* **Provider Block:** The Azure Provider now requires that a `features` block is specified within the Provider block, which can be used to alter the behaviour of certain resources - [more information on the `features` block can be found in the documentation](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs#features).\n* **Terraform 0.10/0.11:** Version 2.0 of the Azure Provider no longer supports Terraform 0.10 or 0.11 - you must upgrade to Terraform 0.12 to use version 2.0 of the Azure Provider.\n\nFEATURES:\n\n* **Custom Timeouts:** - all resources within the Azure Provider now allow configuring custom timeouts - please [see Terraform's Timeout documentation](https://www.terraform.io/docs/configuration/resources.html#operation-timeouts) and the documentation in each data source resource for more information.\n* **Requires Import:** The Azure Provider now checks for the presence of an existing resource prior to creating it - which means that if you try and create a resource which already exists (without importing it) you'll be prompted to import this into the state.\n* **New Data Source:** `azurerm_app_service_environment` ([#5508](https://github.com/hashicorp/terraform-provider-azurerm/issues/5508))\n* **New Data Source:** `azurerm_eventhub_authorization_rule` ([#5805](https://github.com/hashicorp/terraform-provider-azurerm/issues/5805))\n* **New Resource:** `azurerm_app_service_environment` ([#5508](https://github.com/hashicorp/terraform-provider-azurerm/issues/5508))\n* **New Resource:** `azurerm_express_route_gateway` ([#5523](https://github.com/hashicorp/terraform-provider-azurerm/issues/5523))\n* **New Resource:** `azurerm_linux_virtual_machine` ([#5705](https://github.com/hashicorp/terraform-provider-azurerm/issues/5705))\n* **New Resource:** `azurerm_linux_virtual_machine_scale_set` ([#5705](https://github.com/hashicorp/terraform-provider-azurerm/issues/5705))\n* **New Resource:** `azurerm_network_interface_security_group_association` ([#5784](https://github.com/hashicorp/terraform-provider-azurerm/issues/5784))\n* **New Resource:** `azurerm_storage_account_customer_managed_key` ([#5668](https://github.com/hashicorp/terraform-provider-azurerm/issues/5668))\n* **New Resource:** `azurerm_virtual_machine_scale_set_extension` ([#5705](https://github.com/hashicorp/terraform-provider-azurerm/issues/5705))\n* **New Resource:** `azurerm_windows_virtual_machine` ([#5705](https://github.com/hashicorp/terraform-provider-azurerm/issues/5705))\n* **New Resource:** `azurerm_windows_virtual_machine_scale_set` ([#5705](https://github.com/hashicorp/terraform-provider-azurerm/issues/5705))\n\nBREAKING CHANGES:\n\n* The Environment Variable `DISABLE_CORRELATION_REQUEST_ID` has been renamed to `ARM_DISABLE_CORRELATION_REQUEST_ID` to match the other Environment Variables\n* The field `tags` is no longer `computed`\n* Data Source: `azurerm_api_management` - removing the deprecated `sku` block ([#5725](https://github.com/hashicorp/terraform-provider-azurerm/issues/5725))\n* Data Source: `azurerm_app_service` - removing the deprecated field `subnet_mask` from the `site_config` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* Data Source: `azurerm_app_service_plan` - the deprecated `properties` block has been removed since these properties have been moved to the top level ([#5717](https://github.com/hashicorp/terraform-provider-azurerm/issues/5717))\n* Data Source: `azurerm_azuread_application` - This data source has been removed since it was deprecated ([#5748](https://github.com/hashicorp/terraform-provider-azurerm/issues/5748))\n* Data Source: `azurerm_azuread_service_principal` - This data source has been removed since it was deprecated ([#5748](https://github.com/hashicorp/terraform-provider-azurerm/issues/5748))\n* Data Source: `azurerm_builtin_role_definition` - the deprecated data source has been removed ([#5844](https://github.com/hashicorp/terraform-provider-azurerm/issues/5844))\n* Data Source: `azurerm_dns_zone` - removing the deprecated `zone_type` field ([#5794](https://github.com/hashicorp/terraform-provider-azurerm/issues/5794))\n* Data Source: `azurerm_dns_zone` - removing the deprecated `registration_virtual_network_ids` field ([#5794](https://github.com/hashicorp/terraform-provider-azurerm/issues/5794))\n* Data Source: `azurerm_dns_zone` - removing the deprecated `resolution_virtual_network_ids` field ([#5794](https://github.com/hashicorp/terraform-provider-azurerm/issues/5794))\n* Data Source: `azurerm_key_vault` - removing the `sku` block since this has been deprecated in favour of the `sku_name` field ([#5774](https://github.com/hashicorp/terraform-provider-azurerm/issues/5774))\n* Data Source: `azurerm_key_vault_key` - removing the deprecated `vault_uri` field ([#5774](https://github.com/hashicorp/terraform-provider-azurerm/issues/5774))\n* Data Source: `azurerm_key_vault_secret` - removing the deprecated `vault_uri` field ([#5774](https://github.com/hashicorp/terraform-provider-azurerm/issues/5774))\n* Data Source: `azurerm_kubernetes_cluster` - removing the field `dns_prefix` from the `agent_pool_profile` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* Data Source: `azurerm_network_interface` - removing the deprecated field `internal_fqdn` ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* Data Source: `azurerm_private_link_service` - removing the deprecated field `network_interface_ids` ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* Data Source: `azurerm_private_link_endpoint_connection` - the deprecated data source has been removed ([#5844](https://github.com/hashicorp/terraform-provider-azurerm/issues/5844))\n* Data Source: `azurerm_recovery_services_protection_policy_vm` has been renamed to `azurerm_backup_policy_vm` ([#5816](https://github.com/hashicorp/terraform-provider-azurerm/issues/5816))\n* Data Source: `azurerm_role_definition` - removing the alias `VirtualMachineContributor` which has been deprecated in favour of the full name `Virtual Machine Contributor` ([#5733](https://github.com/hashicorp/terraform-provider-azurerm/issues/5733))\n* Data Source: `azurerm_storage_account` - removing the `account_encryption_source` field since this is no longer configurable by Azure ([#5668](https://github.com/hashicorp/terraform-provider-azurerm/issues/5668))\n* Data Source: `azurerm_storage_account` - removing the `enable_blob_encryption` field since this is no longer configurable by Azure ([#5668](https://github.com/hashicorp/terraform-provider-azurerm/issues/5668))\n* Data Source: `azurerm_storage_account` - removing the `enable_file_encryption` field since this is no longer configurable by Azure ([#5668](https://github.com/hashicorp/terraform-provider-azurerm/issues/5668))\n* Data Source: `azurerm_scheduler_job_collection` - This data source has been removed since it was deprecated ([#5712](https://github.com/hashicorp/terraform-provider-azurerm/issues/5712))\n* Data Source: `azurerm_subnet` - removing the deprecated `ip_configuration` field ([#5801](https://github.com/hashicorp/terraform-provider-azurerm/issues/5801))\n* Data Source: `azurerm_virtual_network` - removing the deprecated `address_spaces` field ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_api_management` - removing the deprecated `sku` block ([#5725](https://github.com/hashicorp/terraform-provider-azurerm/issues/5725))\n* `azurerm_api_management` - removing the deprecated fields in the `security` block ([#5725](https://github.com/hashicorp/terraform-provider-azurerm/issues/5725))\n* `azurerm_application_gateway` - the field `fqdns` within the `backend_address_pool` block is no longer computed ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_application_gateway` - the field `ip_addresses` within the `backend_address_pool` block is no longer computed ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_application_gateway` - the deprecated field `fqdn_list` within the `backend_address_pool` block has been removed ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_application_gateway` - the deprecated field `ip_address_list` within the `backend_address_pool` block has been removed ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_application_gateway` - the deprecated field `disabled_ssl_protocols` has been removed ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_application_gateway` - the field `disabled_protocols` within the `ssl_policy` block is no longer computed ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_app_service` - removing the field `subnet_mask` from the `site_config` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_app_service` - the field `ip_address` within the `site_config` block now refers to a CIDR block, rather than an IP Address to match the Azure API ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_app_service` - removing the field `virtual_network_name` from the `site_config` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_app_service_plan` - the deprecated `properties` block has been removed since these properties have been moved to the top level ([#5717](https://github.com/hashicorp/terraform-provider-azurerm/issues/5717))\n* `azurerm_app_service_slot` - removing the field `subnet_mask` from the `site_config` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_app_service_slot` - the field `ip_address` within the `site_config` block now refers to a CIDR block, rather than an IP Address to match the Azure API ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_app_service_slot` - removing the field `virtual_network_name` from the `site_config` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_application_gateway` - updating the default value for the `body` field within the `match` block from `*` to an empty string ([#5752](https://github.com/hashicorp/terraform-provider-azurerm/issues/5752))\n* `azurerm_automation_account` - removing the `sku` block which has been deprecated in favour of the `sku_name` field ([#5781](https://github.com/hashicorp/terraform-provider-azurerm/issues/5781))\n* `azurerm_automation_credential` - removing the deprecated `account_name` field ([#5781](https://github.com/hashicorp/terraform-provider-azurerm/issues/5781))\n* `azurerm_automation_runbook` - removing the deprecated `account_name` field ([#5781](https://github.com/hashicorp/terraform-provider-azurerm/issues/5781))\n* `azurerm_automation_schedule` - removing the deprecated `account_name` field ([#5781](https://github.com/hashicorp/terraform-provider-azurerm/issues/5781))\n* `azurerm_autoscale_setting` - the deprecated resource has been removed ([#5844](https://github.com/hashicorp/terraform-provider-azurerm/issues/5844))\n* `azurerm_availability_set` - updating the default value for `managed` from `false` to `true` ([#5724](https://github.com/hashicorp/terraform-provider-azurerm/issues/5724))\n* `azurerm_azuread_application` - This resource has been removed since it was deprecated ([#5748](https://github.com/hashicorp/terraform-provider-azurerm/issues/5748))\n* `azurerm_azuread_service_principal_password` - This resource has been removed since it was deprecated ([#5748](https://github.com/hashicorp/terraform-provider-azurerm/issues/5748))\n* `azurerm_azuread_service_principal` - This resource has been removed since it was deprecated ([#5748](https://github.com/hashicorp/terraform-provider-azurerm/issues/5748))\n* `azurerm_client_config` - removing the deprecated field `service_principal_application_id` ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_client_config` - removing the deprecated field `service_principal_object_id` ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_cognitive_account` - removing the deprecated `sku_name` block ([#5797](https://github.com/hashicorp/terraform-provider-azurerm/issues/5797))\n* `azurerm_connection_monitor` - the deprecated resource has been removed ([#5844](https://github.com/hashicorp/terraform-provider-azurerm/issues/5844))\n* `azurerm_container_group` - removing the `port` field from the `container` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_container_group` - removing the `protocol` field from the `container` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_container_group` - the `ports` field is no longer Computed ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_container_group` - the `protocol` field within the `ports` block is no longer Computed and now defaults to `TCP` ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_container_group` - removing the deprecated field `command` ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_container_registry` - removing the deprecated `storage_account` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_container_service` - This resource has been removed since it was deprecated ([#5709](https://github.com/hashicorp/terraform-provider-azurerm/issues/5709))\n* `azurerm_cosmosdb_mongo_collection` - removing the deprecated `indexes` block ([#5853](https://github.com/hashicorp/terraform-provider-azurerm/issues/5853))\n* `azurerm_ddos_protection_plan` - the deprecated resource has been removed ([#5844](https://github.com/hashicorp/terraform-provider-azurerm/issues/5844))\n* `azurerm_devspace_controller` - removing the deprecated `sku` block ([#5795](https://github.com/hashicorp/terraform-provider-azurerm/issues/5795))\n* `azurerm_dns_cname_record` - removing the deprecated `records` field ([#5794](https://github.com/hashicorp/terraform-provider-azurerm/issues/5794))\n* `azurerm_dns_ns_record` - removing the deprecated `records` field ([#5794](https://github.com/hashicorp/terraform-provider-azurerm/issues/5794))\n* `azurerm_dns_zone` - removing the deprecated `zone_type` field ([#5794](https://github.com/hashicorp/terraform-provider-azurerm/issues/5794))\n* `azurerm_dns_zone` - removing the deprecated `registration_virtual_network_ids` field ([#5794](https://github.com/hashicorp/terraform-provider-azurerm/issues/5794))\n* `azurerm_dns_zone` - removing the deprecated `resolution_virtual_network_ids` field ([#5794](https://github.com/hashicorp/terraform-provider-azurerm/issues/5794))\n* `azurerm_eventhub` - removing the deprecated `location` field ([#5793](https://github.com/hashicorp/terraform-provider-azurerm/issues/5793))\n* `azurerm_eventhub_authorization_rule` - removing the deprecated `location` field ([#5793](https://github.com/hashicorp/terraform-provider-azurerm/issues/5793))\n* `azurerm_eventhub_consumer_group` - removing the deprecated `location` field ([#5793](https://github.com/hashicorp/terraform-provider-azurerm/issues/5793))\n* `azurerm_eventhub_namespace` - removing the deprecated `kafka_enabled` field since this is now managed by Azure ([#5793](https://github.com/hashicorp/terraform-provider-azurerm/issues/5793))\n* `azurerm_eventhub_namespace_authorization_rule` - removing the deprecated `location` field ([#5793](https://github.com/hashicorp/terraform-provider-azurerm/issues/5793))\n* `azurerm_firewall` - removing the deprecated field `internal_public_ip_address_id` from the `ip_configuration` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_firewall` - the field `public_ip_address_id` within the `ip_configuration` block is now required ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_frontdoor` -  field `cache_enabled` within the `forwarding_configuration` block now defaults to `false` rather than `true` ([#5852](https://github.com/hashicorp/terraform-provider-azurerm/issues/5852))\n* `azurerm_frontdoor` - the field `cache_query_parameter_strip_directive` within the `forwarding_configuration` block now defaults to `StripAll` rather than `StripNone`. ([#5852](https://github.com/hashicorp/terraform-provider-azurerm/issues/5852))\n* `azurerm_frontdoor` - the field `forwarding_protocol` within the `forwarding_configuration` block now defaults to `HttpsOnly` rather than `MatchRequest` ([#5852](https://github.com/hashicorp/terraform-provider-azurerm/issues/5852))\n* `azurerm_function_app` - removing the field `virtual_network_name` from the `site_config` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_function_app` - updating the field `ip_address` within the `ip_restriction` block to accept a CIDR rather than an IP Address to match the updated API behaviour ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_iot_dps` - This resource has been removed since it was deprecated ([#5753](https://github.com/hashicorp/terraform-provider-azurerm/issues/5753))\n* `azurerm_iot_dps_certificate` - This resource has been removed since it was deprecated ([#5753](https://github.com/hashicorp/terraform-provider-azurerm/issues/5753))\n* `azurerm_iothub`- The deprecated `sku.tier` property will be removed. ([#5790](https://github.com/hashicorp/terraform-provider-azurerm/issues/5790))\n* `azurerm_iothub_dps` - The deprecated `sku.tier` property will be removed. ([#5790](https://github.com/hashicorp/terraform-provider-azurerm/issues/5790))\n* `azurerm_key_vault` - removing the `sku` block since this has been deprecated in favour of the `sku_name` field ([#5774](https://github.com/hashicorp/terraform-provider-azurerm/issues/5774))\n* `azurerm_key_vault_access_policy` - removing the deprecated field `vault_name` which has been superseded by the `key_vault_id` field ([#5774](https://github.com/hashicorp/terraform-provider-azurerm/issues/5774))\n* `azurerm_key_vault_access_policy` - removing the deprecated field `resource_group_name ` which has been superseded by the `key_vault_id` field ([#5774](https://github.com/hashicorp/terraform-provider-azurerm/issues/5774))\n* `azurerm_key_vault_certificate` - removing the deprecated `vault_uri` field ([#5774](https://github.com/hashicorp/terraform-provider-azurerm/issues/5774))\n* `azurerm_key_vault_key` - removing the deprecated `vault_uri` field ([#5774](https://github.com/hashicorp/terraform-provider-azurerm/issues/5774))\n* `azurerm_key_vault_secret` - removing the deprecated `vault_uri` field ([#5774](https://github.com/hashicorp/terraform-provider-azurerm/issues/5774))\n* `azurerm_kubernetes_cluster` - updating the default value for `load_balancer_sku` to `Standard` from `Basic` ([#5747](https://github.com/hashicorp/terraform-provider-azurerm/issues/5747))\n* `azurerm_kubernetes_cluster` - the block `default_node_pool` is now required ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_kubernetes_cluster` - removing the deprecated `agent_pool_profile` block ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_kubernetes_cluster` - the field `enable_pod_security_policy` is no longer computed ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_lb_backend_address_pool` - removing the deprecated `location` field ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_lb_nat_pool` - removing the deprecated `location` field ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_lb_nat_rule` - removing the deprecated `location` field ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_lb_probe` - removing the deprecated `location` field ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_lb_rule` - removing the deprecated `location` field ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_log_analytics_workspace_linked_service` - This resource has been removed since it was deprecated ([#5754](https://github.com/hashicorp/terraform-provider-azurerm/issues/5754))\n* `azurerm_log_analytics_linked_service` - The `resource_id` field has been moved from the `linked_service_properties` block to the top-level and the deprecated field `linked_service_properties` will be removed. This has been replaced by the `resource_id` resource ([#5775](https://github.com/hashicorp/terraform-provider-azurerm/issues/5775))\n* `azurerm_maps_account` - the `sku_name` field is now case-sensitive ([#5776](https://github.com/hashicorp/terraform-provider-azurerm/issues/5776))\n* `azurerm_mariadb_server` - removing the `sku` block since it's been deprecated in favour of the `sku_name` field ([#5777](https://github.com/hashicorp/terraform-provider-azurerm/issues/5777))\n* `azurerm_metric_alertrule` - the deprecated resource has been removed ([#5844](https://github.com/hashicorp/terraform-provider-azurerm/issues/5844))\n* `azurerm_monitor_metric_alert` - updating the default value for `auto_mitigate` from `false` to `true` ([#5773](https://github.com/hashicorp/terraform-provider-azurerm/issues/5773))\n* `azurerm_monitor_metric_alertrule` - the deprecated resource has been removed ([#5844](https://github.com/hashicorp/terraform-provider-azurerm/issues/5844))\n* `azurerm_mssql_elasticpool` - removing the deprecated `elastic_pool_properties` block ([#5744](https://github.com/hashicorp/terraform-provider-azurerm/issues/5744))\n* `azurerm_mysql_server` - removing the deprecated `sku` block ([#5743](https://github.com/hashicorp/terraform-provider-azurerm/issues/5743))\n* `azurerm_network_interface` - removing the deprecated `application_gateway_backend_address_pools_ids` field from the `ip_configurations` block ([#5784](https://github.com/hashicorp/terraform-provider-azurerm/issues/5784))\n* `azurerm_network_interface` - removing the deprecated `application_security_group_ids ` field from the `ip_configurations` block ([#5784](https://github.com/hashicorp/terraform-provider-azurerm/issues/5784))\n* `azurerm_network_interface` - removing the deprecated `load_balancer_backend_address_pools_ids ` field from the `ip_configurations` block ([#5784](https://github.com/hashicorp/terraform-provider-azurerm/issues/5784))\n* `azurerm_network_interface` - removing the deprecated `load_balancer_inbound_nat_rules_ids ` field from the `ip_configurations` block ([#5784](https://github.com/hashicorp/terraform-provider-azurerm/issues/5784))\n* `azurerm_network_interface` - removing the deprecated `internal_fqdn` field ([#5784](https://github.com/hashicorp/terraform-provider-azurerm/issues/5784))\n* `azurerm_network_interface` - removing the `network_security_group_id` field in favour of a new split-out resource `azurerm_network_interface_security_group_association` ([#5784](https://github.com/hashicorp/terraform-provider-azurerm/issues/5784))\n* `azurerm_network_interface_application_security_group_association` - removing the `ip_configuration_name` field associations between Network Interfaces and Application Security Groups now need to be made to all IP Configurations ([#5815](https://github.com/hashicorp/terraform-provider-azurerm/issues/5815))\n* `azurerm_network_interface` - the `virtual_machine_id` field is now computed-only since it's not setable ([#5784](https://github.com/hashicorp/terraform-provider-azurerm/issues/5784))\n* `azurerm_notification_hub_namesapce` - removing the `sku` block in favour of the `sku_name` argument ([#5722](https://github.com/hashicorp/terraform-provider-azurerm/issues/5722))\n* `azurerm_postgresql_server` - removing the `sku` block which has been deprecated in favour of the `sku_name` field ([#5721](https://github.com/hashicorp/terraform-provider-azurerm/issues/5721))\n* `azurerm_private_link_endpoint` - the deprecated resource has been removed ([#5844](https://github.com/hashicorp/terraform-provider-azurerm/issues/5844))\n* `azurerm_private_link_service` - removing the deprecated field `network_interface_ids` ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_public_ip` - making the `allocation_method` field required ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_public_ip` - removing the deprecated field `public_ip_address_allocation` ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* `azurerm_recovery_network_mapping` - the deprecated resource has been removed ([#5816](https://github.com/hashicorp/terraform-provider-azurerm/issues/5816))\n* `azurerm_recovery_replicated_vm` - the deprecated resource has been removed ([#5816](https://github.com/hashicorp/terraform-provider-azurerm/issues/5816))\n* `azurerm_recovery_services_fabric` - the deprecated resource has been removed ([#5816](https://github.com/hashicorp/terraform-provider-azurerm/issues/5816))\n* `azurerm_recovery_services_protected_vm` - the deprecated resource has been removed ([#5816](https://github.com/hashicorp/terraform-provider-azurerm/issues/5816))\n* `azurerm_recovery_services_protection_container` - the deprecated resource has been removed ([#5816](https://github.com/hashicorp/terraform-provider-azurerm/issues/5816))\n* `azurerm_recovery_services_protection_container_mapping` - the deprecated resource has been removed ([#5816](https://github.com/hashicorp/terraform-provider-azurerm/issues/5816))\n* `azurerm_recovery_services_protection_policy_vm` - the deprecated resource has been removed ([#5816](https://github.com/hashicorp/terraform-provider-azurerm/issues/5816))\n* `azurerm_recovery_services_replication_policy` - the deprecated resource has been removed ([#5816](https://github.com/hashicorp/terraform-provider-azurerm/issues/5816))\n* `azurerm_relay_namespace` - removing the `sku` block in favour of the `sku_name` field ([#5719](https://github.com/hashicorp/terraform-provider-azurerm/issues/5719))\n* `azurerm_scheduler_job` - This resource has been removed since it was deprecated ([#5712](https://github.com/hashicorp/terraform-provider-azurerm/issues/5712))\n* `azurerm_scheduler_job_collection` - This resource has been removed since it was deprecated ([#5712](https://github.com/hashicorp/terraform-provider-azurerm/issues/5712))\n* `azurerm_storage_account` - updating the default value for `account_kind` from `Storage` to `StorageV2` ([#5850](https://github.com/hashicorp/terraform-provider-azurerm/issues/5850))\n* `azurerm_storage_account` - removing the deprecated `account_type` field ([#5710](https://github.com/hashicorp/terraform-provider-azurerm/issues/5710))\n* `azurerm_storage_account` - removing the deprecated `enable_advanced_threat_protection` field ([#5710](https://github.com/hashicorp/terraform-provider-azurerm/issues/5710))\n* `azurerm_storage_account` - updating the default value for `enable_https_traffic_only` from `false` to `true` ([#5808](https://github.com/hashicorp/terraform-provider-azurerm/issues/5808))\n* `azurerm_storage_account` - removing the `account_encryption_source` field since this is no longer configurable by Azure ([#5668](https://github.com/hashicorp/terraform-provider-azurerm/issues/5668))\n* `azurerm_storage_account` - removing the `enable_blob_encryption` field since this is no longer configurable by Azure ([#5668](https://github.com/hashicorp/terraform-provider-azurerm/issues/5668))\n* `azurerm_storage_account` - removing the `enable_file_encryption` field since this is no longer configurable by Azure ([#5668](https://github.com/hashicorp/terraform-provider-azurerm/issues/5668))\n* `azurerm_storage_blob` - making the `type` field case-sensitive ([#5710](https://github.com/hashicorp/terraform-provider-azurerm/issues/5710))\n* `azurerm_storage_blob` - removing the deprecated `attempts` field ([#5710](https://github.com/hashicorp/terraform-provider-azurerm/issues/5710))\n* `azurerm_storage_blob` - removing the deprecated `resource_group_name` field ([#5710](https://github.com/hashicorp/terraform-provider-azurerm/issues/5710))\n* `azurerm_storage_container` - removing the deprecated `resource_group_name` field ([#5710](https://github.com/hashicorp/terraform-provider-azurerm/issues/5710))\n* `azurerm_storage_container` - removing the deprecated `properties` block ([#5710](https://github.com/hashicorp/terraform-provider-azurerm/issues/5710))\n* `azurerm_storage_queue` - removing the deprecated `resource_group_name` field ([#5710](https://github.com/hashicorp/terraform-provider-azurerm/issues/5710))\n* `azurerm_storage_share` - removing the deprecated `resource_group_name` field ([#5710](https://github.com/hashicorp/terraform-provider-azurerm/issues/5710))\n* `azurerm_storage_table` - removing the deprecated `resource_group_name` field ([#5710](https://github.com/hashicorp/terraform-provider-azurerm/issues/5710))\n* `azurerm_subnet` - removing the deprecated `ip_configuration` field ([#5801](https://github.com/hashicorp/terraform-provider-azurerm/issues/5801))\n* `azurerm_subnet` - removing the deprecated `network_security_group_id` field ([#5801](https://github.com/hashicorp/terraform-provider-azurerm/issues/5801))\n* `azurerm_subnet` - removing the deprecated `route_table_id` field ([#5801](https://github.com/hashicorp/terraform-provider-azurerm/issues/5801))\n* `azurerm_subnet` - making the `actions` list within the `service_delegation` block within the `service_endpoints` block non-computed ([#5801](https://github.com/hashicorp/terraform-provider-azurerm/issues/5801))\n* `azurerm_virtual_network_peering` - `allow_virtual_network_access` now defaults to true, matching the API and Portal behaviours. ([#5832](https://github.com/hashicorp/terraform-provider-azurerm/issues/5832))\n* `azurerm_virtual_wan` - removing the deprecated field `security_provider_name` ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n\nIMPROVEMENTS:\n\n* web: updating to API version `2019-08-01` ([#5823](https://github.com/hashicorp/terraform-provider-azurerm/issues/5823))\n* Data Source: `azurerm_kubernetes_service_version` - support for filtering of preview releases ([#5662](https://github.com/hashicorp/terraform-provider-azurerm/issues/5662))\n* `azurerm_dedicated_host` - support for setting `sku_name` to `DSv3-Type2` and `ESv3-Type2` ([#5768](https://github.com/hashicorp/terraform-provider-azurerm/issues/5768))\n* `azurerm_key_vault` - support for configuring `purge_protection_enabled` ([#5344](https://github.com/hashicorp/terraform-provider-azurerm/issues/5344))\n* `azurerm_key_vault` - support for configuring `soft_delete_enabled` ([#5344](https://github.com/hashicorp/terraform-provider-azurerm/issues/5344))\n* `azurerm_sql_database` - support for configuring `zone_redundant` ([#5772](https://github.com/hashicorp/terraform-provider-azurerm/issues/5772))\n* `azurerm_storage_account` - support for configuring the `static_website` block ([#5649](https://github.com/hashicorp/terraform-provider-azurerm/issues/5649))\n* `azurerm_storage_account` - support for configuring `cors_rules` within the `blob_properties` block ([#5425](https://github.com/hashicorp/terraform-provider-azurerm/issues/5425))\n* `azurerm_subnet` - support for delta updates ([#5801](https://github.com/hashicorp/terraform-provider-azurerm/issues/5801))\n* `azurerm_windows_virtual_machine` - fixing a bug when provisioning from a Shared Gallery image ([#5661](https://github.com/hashicorp/terraform-provider-azurerm/issues/5661))\n\nBUG FIXES:\n\n* `azurerm_application_insights` - the `application_type` field is now case sensitive as documented ([#5817](https://github.com/hashicorp/terraform-provider-azurerm/issues/5817))\n* `azurerm_api_management_api` - allows blank `path` field ([#5833](https://github.com/hashicorp/terraform-provider-azurerm/issues/5833))\n* `azurerm_eventhub_namespace` - the field `ip_rule` within the `network_rulesets` block now supports a maximum of 128 items ([#5831](https://github.com/hashicorp/terraform-provider-azurerm/issues/5831))\n* `azurerm_eventhub_namespace` - the field `virtual_network_rule` within the `network_rulesets` block now supports a maximum of 128 items ([#5831](https://github.com/hashicorp/terraform-provider-azurerm/issues/5831))\n* `azurerm_linux_virtual_machine` - using the delete custom timeout during deletion ([#5764](https://github.com/hashicorp/terraform-provider-azurerm/issues/5764))\n* `azurerm_netapp_account` - allowing the `-` character to be used in the `name` field ([#5842](https://github.com/hashicorp/terraform-provider-azurerm/issues/5842))\n* `azurerm_network_interface` - the `dns_servers` field now respects ordering ([#5784](https://github.com/hashicorp/terraform-provider-azurerm/issues/5784))\n* `azurerm_public_ip_prefix` - fixing the validation for the `prefix_length` to match the Azure API ([#5693](https://github.com/hashicorp/terraform-provider-azurerm/issues/5693))\n* `azurerm_recovery_services_vault` - using the requested cloud rather than the default ([#5825](https://github.com/hashicorp/terraform-provider-azurerm/issues/5825))\n* `azurerm_role_assignment` - validating that the `name` is a UUID ([#5624](https://github.com/hashicorp/terraform-provider-azurerm/issues/5624))\n* `azurerm_signalr_service` - ensuring the SignalR segment is parsed in the correct case ([#5737](https://github.com/hashicorp/terraform-provider-azurerm/issues/5737))\n* `azurerm_storage_account` - locking on the storage account resource when updating the storage account ([#5668](https://github.com/hashicorp/terraform-provider-azurerm/issues/5668))\n* `azurerm_subnet` - supporting updating of the `enforce_private_link_endpoint_network_policies` field ([#5801](https://github.com/hashicorp/terraform-provider-azurerm/issues/5801))\n* `azurerm_subnet` - supporting updating of the `enforce_private_link_service_network_policies` field ([#5801](https://github.com/hashicorp/terraform-provider-azurerm/issues/5801))\n* `azurerm_windows_virtual_machine` - using the delete custom timeout during deletion ([#5764](https://github.com/hashicorp/terraform-provider-azurerm/issues/5764))\n\n---\n\nFor information on changes between the v2.00.0 and v1.0.0 releases, please see [the previous v1.x changelog entries](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v1.md).\n\nFor information on changes prior to the v1.0.0 release, please see [the v0.x changelog](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v0.md).\n"
  },
  {
    "path": "articles/terraform/provider-version-history-azurerm-3-0-0-to-3-116-0.md",
    "content": "---\ntitle: Terraform AzureRM provider version history 3.0.0 - 3.116.0\ndescription: View the Terraform AzureRM provider version history for 3.0.0 - 3.116.0\nkeywords: azure devops terraform change log release history what's new\nms.topic: reference\nms.date: 10/17/2024\nms.custom: devx-track-terraform\n# Customer intent: I want to view the AzureRM provider version history for versions 3.0.0 - 3.116.0\n# SOurce: https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v3.md\n---\n\n# Terraform AzureRM provider version history: 3.0.0 - 3.116.0\n\n## 3.116.0 (August 16, 2024)\n\nDEPRECATIONS:\n\nAll Azure Kubernetes Service (AKS) properties related to preview features are deprecated since they will not be available in a stable API. Please see https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/4.0-upgrade-guide#aks-migration-to-stable-api for more details ([#26863](https://github.com/hashicorp/terraform-provider-azurerm/issues/26863))\n\nFEATURES:\n\n* New Resource: `azurerm_ai_services` ([#26008](https://github.com/hashicorp/terraform-provider-azurerm/issues/26008))\n* New Resource: `azurerm_communication_service_email_domain_association` ([#26432](https://github.com/hashicorp/terraform-provider-azurerm/issues/26432))\n* New Resource: `azurerm_dev_center_project_environment_type` ([#26941](https://github.com/hashicorp/terraform-provider-azurerm/issues/26941))\n* New Resource: `azurerm_extended_location_custom_location` ([#24267](https://github.com/hashicorp/terraform-provider-azurerm/issues/24267))\n* New Resource: `azurerm_postgresql_flexible_server_virtual_endpoint` ([#26708](https://github.com/hashicorp/terraform-provider-azurerm/issues/26708))\n\nENHANCEMENTS:\n\n* `notificationhub` - updating to use version `2023-09-01` ([#26528](https://github.com/hashicorp/terraform-provider-azurerm/issues/26528))\n* `azurerm_api_management_api` - update validation of `path` to allow single character strings ([#26922](https://github.com/hashicorp/terraform-provider-azurerm/issues/26922))\n* `azurerm_cosmosdb_account` - add support for the property `burst_capacity_enabled` ([#26986](https://github.com/hashicorp/terraform-provider-azurerm/issues/26986))\n* `azurerm_linux_function_app` - add support for `vnet_image_pull_enabled` property in 4.0 ([#27001](https://github.com/hashicorp/terraform-provider-azurerm/issues/27001))\n* `azurerm_linux_function_app_slot` - add support for `vnet_image_pull_enabled` property in 4.0 ([#27001](https://github.com/hashicorp/terraform-provider-azurerm/issues/27001))\n* `azurerm_logic_app_standard` - add support for `v8.0` in `site_config.dotnet_framework_version` ([#26983](https://github.com/hashicorp/terraform-provider-azurerm/issues/26983))\n* `azurerm_management_group_policy_assignment` - remove length restriction on name ([#27055](https://github.com/hashicorp/terraform-provider-azurerm/issues/27055))\n* `azurerm_recovery_services_vault` - add support for the `identity` block ([#26254](https://github.com/hashicorp/terraform-provider-azurerm/issues/26254))\n* `azurerm_web_application_firewall_policy` - add support for the `js_challenge_cookie_expiration_in_minutes` property ([#26878](https://github.com/hashicorp/terraform-provider-azurerm/issues/26878))\n* `azurerm_windows_function_app` - add support for `vnet_image_pull_enabled` property in 4.0 ([#27001](https://github.com/hashicorp/terraform-provider-azurerm/issues/27001))\n* `azurerm_windows_function_app_slot` - add support for `vnet_image_pull_enabled` property in 4.0 ([#27001](https://github.com/hashicorp/terraform-provider-azurerm/issues/27001))\n\nBUG FIXES:\n\n* Data Source: `azurerm_storage_account` - add `default_share_level_permission` to the `azure_files_authentication` to prevent invalid address errors ([#26996](https://github.com/hashicorp/terraform-provider-azurerm/issues/26996))\n* Data Source: `azurerm_search_service` - expose the `tags` property ([#26978](https://github.com/hashicorp/terraform-provider-azurerm/issues/26978))\n* Data Source: `azurerm_virtual_machine` - populate missing `power_state` ([#26991](https://github.com/hashicorp/terraform-provider-azurerm/issues/26991))\n* Data Source: `azurerm_virtual_machine_scale_set` - populate missing `power_state` ([#26991](https://github.com/hashicorp/terraform-provider-azurerm/issues/26991))\n* `azurerm_api_management_api_schema` - correctly unmarshal `definition` and `components` ([#26531](https://github.com/hashicorp/terraform-provider-azurerm/issues/26531))\n* `azurerm_cdn_frontdoor_secret` - fix issue where `expiration_date` was being set into the parent block ([#26982](https://github.com/hashicorp/terraform-provider-azurerm/issues/26982))\n* `azurerm_container_app_environment` - fix diff suppress on `infrastructure_resource_group_name` ([#27007](https://github.com/hashicorp/terraform-provider-azurerm/issues/27007))\n* `azurerm_express_route_connection` - prevent sending `private_link_fast_path_enabled` in the payload if it hasn't been explicitly set ([#26928](https://github.com/hashicorp/terraform-provider-azurerm/issues/26928))\n* `azurerm_machine_learning_workspace` - `serverless_compute` can now be updated ([#26940](https://github.com/hashicorp/terraform-provider-azurerm/issues/26940))\n* `azurerm_mssql_database` - fix issue where the database cannot be upgraded to use serverless due to the behaviour of the `license_type` field ([#26850](https://github.com/hashicorp/terraform-provider-azurerm/issues/26850))\n* `azurerm_mssql_database` - prevent error when creating `Free` edition by setting `long_term_retention_policy` and `short_term_retention_policy` as empty ([#26894](https://github.com/hashicorp/terraform-provider-azurerm/issues/26894))\n* `azurerm_nginx_deployment` - omit `capacity` when creating deployments with a basic plan ([#26223](https://github.com/hashicorp/terraform-provider-azurerm/issues/26223))\n* `azurerm_role_management_policy` - prevent panic when updating `activation_rules.approval_stage` ([#26800](https://github.com/hashicorp/terraform-provider-azurerm/issues/26800))\n* `azurerm_sentinel_threat_intelligence_indicator` - prevent panic when importing this resource ([#26976](https://github.com/hashicorp/terraform-provider-azurerm/issues/26976))\n* `azurerm_servicebus_namespace` - fix panic reading encryption with versionless ids ([#27060](https://github.com/hashicorp/terraform-provider-azurerm/issues/27060))\n* `azurerm_synapse_spark_pool` - prevent plan diff due to API behaviour by setting `node_count` as Computed ([#26953](https://github.com/hashicorp/terraform-provider-azurerm/issues/26953))\n* `azurerm_virtual_network_gateway_connection` - fix issue where `ingress_nat_rule_ids` was updating the egress rules on updates ([#27022](https://github.com/hashicorp/terraform-provider-azurerm/issues/27022))\n\n## 3.115.0 (August 09, 2024)\n\nENHANCEMENTS:\n\n* `cosmosdb` - updating to use version `2024-05-15` ([#26758](https://github.com/hashicorp/terraform-provider-azurerm/issues/26758))\n* `healthcare` - updating to use version `2024-03-31` ([#26699](https://github.com/hashicorp/terraform-provider-azurerm/issues/26699))\n* `redis` - updating to use version `2024-03-01` ([#26932](https://github.com/hashicorp/terraform-provider-azurerm/issues/26932))\n* `azurerm_cosmosdb_account` - avoid infinite diff to `default_identity_type` for legacy resources where an empty string is returned by the RP ([#26525](https://github.com/hashicorp/terraform-provider-azurerm/issues/26525))\n* `azurerm_linux_virtual_machine_scale_set` - add support for the `action` property in the `automatic_instance_repair` block ([#26227](https://github.com/hashicorp/terraform-provider-azurerm/issues/26227))\n* `azurerm_log_analytics_saved_search` - update the regex for the `function_parameters` property to support more parameters ([#26701](https://github.com/hashicorp/terraform-provider-azurerm/issues/26701))\n* `azurerm_monitor_data_collection_rule` - update `performance_counter.x.sampling_frequency_in_seconds` range `1` to `1800` ([#26898](https://github.com/hashicorp/terraform-provider-azurerm/issues/26898))\n* `azurerm_orchestrated_virtual_machine_scale_set` - add support for the `action` property in the `automatic_instance_repair` block ([#26227](https://github.com/hashicorp/terraform-provider-azurerm/issues/26227))\n* `azurerm_security_center_storage_defender` - add support for the property `scan_results_event_grid_topic_id` ([#26599](https://github.com/hashicorp/terraform-provider-azurerm/issues/26599))\n* `azurerm_storage_account` - add support for the property `default_share_level_permission` in the `azure_files_authentication` block ([#26924](https://github.com/hashicorp/terraform-provider-azurerm/issues/26924))\n* `azurerm_web_application_firewall_policy` - `excluded_rule_set.0.type` supports `Microsoft_BotManagerRuleSet` ([#26903](https://github.com/hashicorp/terraform-provider-azurerm/issues/26903))\n* `azurerm_windows_virtual_machine_scale_set` - add support for the `action` property in the `automatic_instance_repair` block ([#26227](https://github.com/hashicorp/terraform-provider-azurerm/issues/26227))\n\nBUG FIXES:\n\n* `azurerm_container_group` - retrieve and set `storage_account_key` in the payload when updating the resource ([#26640](https://github.com/hashicorp/terraform-provider-azurerm/issues/26640))\n* `azurerm_key_vault_managed_hardware_security_module_role_assignment` - fixed a crash in error messages ([#26972](https://github.com/hashicorp/terraform-provider-azurerm/issues/26972))\n* `azurerm_kubernetes_cluster` - allow an empty list for `dns_zone_ids` in the `web_app_routing` block ([#26747](https://github.com/hashicorp/terraform-provider-azurerm/issues/26747))\n* `azurerm_storage_share_file` - fix a bug when encoding the MD5 hash for the `content_md5` property ([#25715](https://github.com/hashicorp/terraform-provider-azurerm/issues/25715))\n\n## 3.114.0 (August 01, 2024)\n\nUPGRADE NOTES:\n* **4.0 Beta:** This release includes a new feature-flag to opt-into the 4.0 Beta - which (when enabled) introduces a number of behavioural changes, field renames and removes some older deprecated resources and data sources. Please read the disclaimers carefully that are outlined in our [guide on how to opt-into the 4.0 Beta](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/4.0-beta) before enabling this, as this will cause irreversible changes to your state. The 4.0 Beta is still a work-in-progress at this time and the changes listed in the [4.0 Upgrade Guide](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/4.0-upgrade-guide) may change. We're interested to hear your feedback which can be provided by following [this link](https://github.com/terraform-providers/terraform-provider-azurerm/issues/new?template=Beta_Feedback.md).\n\nFEATURES:\n\n* **New Resource:** `azurerm_dev_center_network_connection` ([#26718](https://github.com/hashicorp/terraform-provider-azurerm/issues/26718))\n* **New Resource:** `azurerm_stack_hci_logical_network` ([#26473](https://github.com/hashicorp/terraform-provider-azurerm/issues/26473))\n\nENHANCEMENTS:\n\n* dependencies: updating `go-azure-helpers` to `v0.70.1` ([#26757](https://github.com/hashicorp/terraform-provider-azurerm/issues/26757))\n* `arckubernetes` - updating to use version `2024-01-01` ([#26761](https://github.com/hashicorp/terraform-provider-azurerm/issues/26761))\n* `data.azurerm_storage_account` - the `enable_https_traffic_only` property has been superseded by `https_traffic_only_enabled` ([#26740](https://github.com/hashicorp/terraform-provider-azurerm/issues/26740))\n* `azurerm_log_analytics_cluster` - add support for setting `size_gb` to `100` [GH-#26865]\n* `azurerm_storage_account` - the `enable_https_traffic_only` property has been superseded by `https_traffic_only_enabled` ([#26740](https://github.com/hashicorp/terraform-provider-azurerm/issues/26740))\n\nBUG FIXES:\n\n* `azurerm_dns_cname_record` - split create and update function to fix lifecycle - ignore ([#26610](https://github.com/hashicorp/terraform-provider-azurerm/issues/26610))\n* `azurerm_dns_srv_record` - split create and update function to fix lifecycle - ignore ([#26627](https://github.com/hashicorp/terraform-provider-azurerm/issues/26627))\n* `azurerm_kubernetes_cluster` - fix issue that prevented `max_count` from being updated ([#26417](https://github.com/hashicorp/terraform-provider-azurerm/issues/26417))\n* `azurerm_linux_web_app` - correctly set `site_config.always_on` as configured during Update ([#25753](https://github.com/hashicorp/terraform-provider-azurerm/issues/25753))\n* `azurerm_linux_web_app_slot` - correctly set `site_config.always_on` as configured during Update ([#25753](https://github.com/hashicorp/terraform-provider-azurerm/issues/25753))\n* `azurerm_management_group_policy_remediation` - fix panic in deprecated schema change for 4.0 ([#26767](https://github.com/hashicorp/terraform-provider-azurerm/issues/26767))\n* `azurerm_network_security_rule` - fix panic when updating `source_port_ranges` ([#26883](https://github.com/hashicorp/terraform-provider-azurerm/issues/26883))\n* `azurerm_public_ip` - fix panix when updating `idle_timeout_in_minutes`\n\nDEPRECATIONS:\n* `azurerm_redis_cache` - `enable_non_ssl_port` has been superseded by `non_ssl_port_enabled` and `redis_configuration. enable_authentication` has been superseded by `redis_configuration.authentication_enabled` ([#26608](https://github.com/hashicorp/terraform-provider-azurerm/issues/26608))\n\n\n## 3.113.0 (July 18, 2024)\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240715.1100358` of `hashicorp/go-azure-sdk` ([#26638](https://github.com/hashicorp/terraform-provider-azurerm/issues/26638))\n* `storage` - updating to use `hashicorp/go-azure-sdk` ([#26218](https://github.com/hashicorp/terraform-provider-azurerm/issues/26218))\n\nBUG FIXES:\n\n* `azurerm_storage_account` - fix a validation bug when replacing a StorageV2 account with a StorageV1 account ([#26639](https://github.com/hashicorp/terraform-provider-azurerm/issues/26639))\n* `azurerm_storage_account` - resolve an issue refreshing blob or queue properties after recreation ([#26218](https://github.com/hashicorp/terraform-provider-azurerm/issues/26218))\n* `azurerm_storage_account` - resolve an issue setting tags for an existing storage account where a policy mandates them ([#26218](https://github.com/hashicorp/terraform-provider-azurerm/issues/26218))\n* `azurerm_storage_account` - fix a persistent diff with the `customer_managed_key` block ([#26218](https://github.com/hashicorp/terraform-provider-azurerm/issues/26218))\n* `azurerm_storage_account` - resolve several consistency related issues when creating a new storage account ([#26218](https://github.com/hashicorp/terraform-provider-azurerm/issues/26218))\n\nDEPRECATIONS:\n\n* `azurerm_eventhub_namespace` - deprecate the `zone_redundant` field in v4.0 ([#26611](https://github.com/hashicorp/terraform-provider-azurerm/issues/26611))\n* `azurerm_servicebus_namespace` - deprecate the `zone_redundant` field in v4.0 ([#26611](https://github.com/hashicorp/terraform-provider-azurerm/issues/26611))\n\n## 3.112.0 (July 12, 2024)\n\nFEATURES:\n\n* New Data Source: `azurerm_elastic_san_volume_snapshot` ([#26439](https://github.com/hashicorp/terraform-provider-azurerm/issues/26439))\n* New Resource: `azurerm_dev_center_dev_box_definition` ([#26307](https://github.com/hashicorp/terraform-provider-azurerm/issues/26307))\n* New Resource: `azurerm_dev_center_environment_type` ([#26291](https://github.com/hashicorp/terraform-provider-azurerm/issues/26291))\n* New Resource: `azurerm_virtual_machine_restore_point` ([#26526](https://github.com/hashicorp/terraform-provider-azurerm/issues/26526))\n* New Resource: `azurerm_virtual_machine_restore_point_collection` ([#26526](https://github.com/hashicorp/terraform-provider-azurerm/issues/26526))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240710.1114656` of `github.com/hashicorp/go-azure-sdk` ([#26588](https://github.com/hashicorp/terraform-provider-azurerm/issues/26588))\n* dependencies: updating to `v0.70.0` of `go-azure-helpers` ([#26601](https://github.com/hashicorp/terraform-provider-azurerm/issues/26601))\n* `containerservice`: updating the Fleet resources to use API Version `2024-04-01` ([#26588](https://github.com/hashicorp/terraform-provider-azurerm/issues/26588))\n* Data Source: `azurerm_network_service_tags` - extend validation for `service` to allow `AzureFrontDoor.Backend`, `AzureFrontDoor.Frontend`, and `AzureFrontDoor.FirstParty` ([#26429](https://github.com/hashicorp/terraform-provider-azurerm/issues/26429))\n* `azurerm_api_management_identity_provider_aad` - support for the `client_library` property ([#26093](https://github.com/hashicorp/terraform-provider-azurerm/issues/26093))\n* `azurerm_api_management_identity_provider_aadb2c` - support for the `client_library` property ([#26093](https://github.com/hashicorp/terraform-provider-azurerm/issues/26093))\n* `azurerm_dev_test_virtual_network` - support for the `shared_public_ip_address` property ([#26299](https://github.com/hashicorp/terraform-provider-azurerm/issues/26299))\n* `azurerm_kubernetes_cluster` - support for the `certificate_authority` block under the `service_mesh_profile` block ([#26543](https://github.com/hashicorp/terraform-provider-azurerm/issues/26543))\n* `azurerm_linux_web_app` - support the value `8.3` for the `php_version` property ([#26194](https://github.com/hashicorp/terraform-provider-azurerm/issues/26194))\n* `azurerm_machine_learning_compute_cluster` - the `identity` property can now be updated ([#26404](https://github.com/hashicorp/terraform-provider-azurerm/issues/26404))\n* `azurerm_web_application_firewall_policy` - support for the `JSChallenge` value for `managed_rules.managed_rule_set.rule_group_override.rule_action` ([#26561](https://github.com/hashicorp/terraform-provider-azurerm/issues/26561))\n\nBUG FIXES:\n\n* Data Source: `azurerm_communication_service` - `primary_connection_string`, `primary_key`, `secondary_connection_string` and `secondary_key` are marked as Sensitive ([#26560](https://github.com/hashicorp/terraform-provider-azurerm/issues/26560))\n* `azurerm_app_configuration_feature` - fix issue when updating the resource without an existing `targeting_filter` ([#26506](https://github.com/hashicorp/terraform-provider-azurerm/issues/26506))\n* `azurerm_backup_policy_vm` - split create and update function to fix lifecycle - ignore ([#26591](https://github.com/hashicorp/terraform-provider-azurerm/issues/26591))\n* `azurerm_backup_protected_vm` - split create and update function to fix lifecycle - ignore ([#26583](https://github.com/hashicorp/terraform-provider-azurerm/issues/26583))\n* `azurerm_communication_service` - the `primary_connection_string`, `primary_key`, `secondary_connection_string`, and `secondary_key` properties are now sensitive ([#26560](https://github.com/hashicorp/terraform-provider-azurerm/issues/26560))\n* `azurerm_mysql_flexible_server_configuration` - add locks to prevent conflicts when deleting the resource ([#26289](https://github.com/hashicorp/terraform-provider-azurerm/issues/26289))\n* `azurerm_nginx_deployment` - changing the `frontend_public.ip_address`, `frontend_private.ip_address`, `frontend_private.allocation_method`, and `frontend_private.subnet_id` now creates a new resource ([#26298](https://github.com/hashicorp/terraform-provider-azurerm/issues/26298))\n* `azurerm_palo_alto_local_rulestack_rule` - correctly read the `protocol` property on read when the `protocol_ports` property is configured ([#26510](https://github.com/hashicorp/terraform-provider-azurerm/issues/26510))\n* `azurerm_servicebus_namespace` - parse the identity returned by the API insensitively before setting into state ([#26540](https://github.com/hashicorp/terraform-provider-azurerm/issues/26540))\n\nDEPRECATIONS:\n\n* `azurerm_servicebus_queue` - `enable_batched_operations`, `enable_express` and `enable_partitioning` are superseded by `batched_operations_enabled`, `express_enabled` and `partitioning_enabled` ([#26479](https://github.com/hashicorp/terraform-provider-azurerm/issues/26479))\n* `azurerm_servicebus_subscription` - `enable_batched_operations` has been superseded  by `batched_operations_enabled` ([#26479](https://github.com/hashicorp/terraform-provider-azurerm/issues/26479))\n* `azurerm_servicebus_topic` - `enable_batched_operations`, `enable_express` and `enable_partitioning` are superseded by `batched_operations_enabled`, `express_enabled` and `partitioning_enabled` ([#26479](https://github.com/hashicorp/terraform-provider-azurerm/issues/26479))\n\n## 3.111.0 (July 04, 2024)\n\nFEATURES:\n\n* **New Resource:** `azurerm_restore_point_collection` ([#26518](https://github.com/hashicorp/terraform-provider-azurerm/issues/26518))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240701.1082110` of `github.com/hashicorp/go-azure-sdk` ([#26502](https://github.com/hashicorp/terraform-provider-azurerm/issues/26502))\n* `azurerm_disk_encryption_set` - support for the `managed_hsm_key_id` property ([#26201](https://github.com/hashicorp/terraform-provider-azurerm/issues/26201))\n* `azurerm_firewall_policy` - remove Computed from the `sku` property and add a default of `Standard` in 4.0 ([#26499](https://github.com/hashicorp/terraform-provider-azurerm/issues/26499))\n* `azurerm_kubernetes_cluster` - support updating `default_node_pool.os_sku` between `Ubuntu` and `AzureLinux` ([#26262](https://github.com/hashicorp/terraform-provider-azurerm/issues/26262))\n* `azurerm_kubernetes_cluster_node_pool` - support updating `os_sku` between `Ubuntu` and `AzureLinux` ([#26139](https://github.com/hashicorp/terraform-provider-azurerm/issues/26139))\n* `azurerm_service_plan` - support for new the Flex Consumption plan ([#26351](https://github.com/hashicorp/terraform-provider-azurerm/issues/26351))\n\nBUG FIXES:\n\n* `azurerm_kubernetes_cluster` - prevent a panic ([#26478](https://github.com/hashicorp/terraform-provider-azurerm/issues/26478))\n* `azurerm_kubernetes_cluster` - prevent a diff in `upgrade_settings` when the API returns an empty object ([#26541](https://github.com/hashicorp/terraform-provider-azurerm/issues/26541))\n* `azurerm_kubernetes_cluster_node_pool` - prevent a diff in `upgrade_settings` when the API returns an empty object ([#26541](https://github.com/hashicorp/terraform-provider-azurerm/issues/26541))\n* `azurerm_virtual_network_gateway` - split create and update function to fix lifecycle - ignore ([#26451](https://github.com/hashicorp/terraform-provider-azurerm/issues/26451))\n* `azurerm_virtual_network_gateway_connection` - split create and update function to fix lifecycle - ignore ([#26431](https://github.com/hashicorp/terraform-provider-azurerm/issues/26431))\n\n## 3.110.0 (June 27, 2024)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_load_test` ([#26376](https://github.com/hashicorp/terraform-provider-azurerm/issues/26376))\n* **New Resource:** `azurerm_virtual_desktop_scaling_plan_host_pool_association` ([#24670](https://github.com/hashicorp/terraform-provider-azurerm/issues/24670))\n\nENHANCEMENTS:\n\n* Data Source: `azurerm_monitor_data_collection_endpoint` - support for the `immutable_id` property ([#26380](https://github.com/hashicorp/terraform-provider-azurerm/issues/26380))\n* Data Source: `azurerm_nginx_certificate` - export the properties `sha1_thumbprint`, `key_vault_secret_version`, `key_vault_secret_creation_date`, `error_code` and `error_message` ([#26160](https://github.com/hashicorp/terraform-provider-azurerm/issues/26160))\n* `azurerm_backup_policy_vm` - support for the `tiering_policy` property ([#26263](https://github.com/hashicorp/terraform-provider-azurerm/issues/26263))\n* `azurerm_kubernetes_cluster_node_pool` - Pod Disruption Budgets are now respected when deleting a node pool ([#26471](https://github.com/hashicorp/terraform-provider-azurerm/issues/26471))\n* `azurerm_monitor_data_collection_endpoint` - support for the `immutable_id` property ([#26380](https://github.com/hashicorp/terraform-provider-azurerm/issues/26380))\n* `azurerm_mssql_managed_instance` - support the value `GZRS` for the `storage_account_type` property ([#26448](https://github.com/hashicorp/terraform-provider-azurerm/issues/26448))\n* `azurerm_mssql_managed_instance_transparent_data_encryption` - support for the `managed_hsm_key_id` property ([#26496](https://github.com/hashicorp/terraform-provider-azurerm/issues/26496))\n* `azurerm_redis_cache_access_policy` - allow updates to `permissions` ([#26440](https://github.com/hashicorp/terraform-provider-azurerm/issues/26440))\n* `azurerm_redhat_openshift_cluster` - support for the `managed_resource_group_name` property ([#25529](https://github.com/hashicorp/terraform-provider-azurerm/issues/25529))\n* `azurerm_redhat_openshift_cluster` - support for the `preconfigured_network_security_group_enabled` property ([#26082](https://github.com/hashicorp/terraform-provider-azurerm/issues/26082))\n* `azurerm_iotcentral_application` - remove Computed from `template` and set default of `iotc-pnp-preview@1.0.0` in 4.0  ([#26485](https://github.com/hashicorp/terraform-provider-azurerm/issues/26485))\n* `azurerm_digital_twins_time_series_database_connection` - remove Computed from `kusto_table_name` and set a default of `AdtPropertyEvents` in 4.0 ([#26484](https://github.com/hashicorp/terraform-provider-azurerm/issues/26484))\n\nBUG FIXES:\n\n* Data Source: `azurerm_express_route_circuit_peering` - fix issue where data source attempts to parse an empty string instead of generating the resource ID ([#26441](https://github.com/hashicorp/terraform-provider-azurerm/issues/26441))\n* `azurerm_express_route_gateway` - prevent a panic ([#26467](https://github.com/hashicorp/terraform-provider-azurerm/issues/26467))\n* `azurerm_monitor_scheduled_query_rules_alert_v2` - correctly handle the `identity` block if not specified ([#26364](https://github.com/hashicorp/terraform-provider-azurerm/issues/26364))\n* `azurerm_security_center_automation` - prevent resource recreation when `tags` are updated ([#26292](https://github.com/hashicorp/terraform-provider-azurerm/issues/26292))\n* `azurerm_synapse_workspace` - fix issue where `azure_devops_repo` or `github_repo` configuration could not be removed ([#26421](https://github.com/hashicorp/terraform-provider-azurerm/issues/26421))\n* `azurerm_virtual_network_dns_servers` - split create and update function to fix lifecycle - ignore ([#26427](https://github.com/hashicorp/terraform-provider-azurerm/issues/26427))\n* `azurerm_linux_function_app` - set `allowed_applications` in the request payload ([#26462](https://github.com/hashicorp/terraform-provider-azurerm/issues/26462))\n* `azurerm_linux_function_app_slot` - set `allowed_applications` in the request payload ([#26462](https://github.com/hashicorp/terraform-provider-azurerm/issues/26462))\n* `azurerm_windows_function_app` - set `allowed_applications` in the request payload ([#26462](https://github.com/hashicorp/terraform-provider-azurerm/issues/26462))\n* `azurerm_windows_function_app_slot` - set `allowed_applications` in the request payload ([#26462](https://github.com/hashicorp/terraform-provider-azurerm/issues/26462))\n* `azurerm_linux_web_app` - set `allowed_applications` in the request payload ([#26462](https://github.com/hashicorp/terraform-provider-azurerm/issues/26462))\n* `azurerm_linux_web_app_slot` - set `allowed_applications` in the request payload ([#26462](https://github.com/hashicorp/terraform-provider-azurerm/issues/26462))\n* `azurerm_windows_web_app` - set `allowed_applications` in the request payload ([#26462](https://github.com/hashicorp/terraform-provider-azurerm/issues/26462))\n* `azurerm_windows_web_app_slot` - set `allowed_applications` in the request payload ([#26462](https://github.com/hashicorp/terraform-provider-azurerm/issues/26462))\n* `azurerm_api_management` - remove ForceNew from `additional_location.zones` ([#26384](https://github.com/hashicorp/terraform-provider-azurerm/issues/26384))\n* `azurerm_logic_app_integration_account_schema` - the `name` property now allows underscores ([#26475](https://github.com/hashicorp/terraform-provider-azurerm/issues/26475))\n* `azurerm_palo_alto_local_rulestack_rule` - prevent error when switching between `protocol` and `protocol_ports` ([#26490](https://github.com/hashicorp/terraform-provider-azurerm/issues/26490))\n\nDEPRECATIONS:\n\n* `azurerm_analysis_service_server` - the property `enable_power_bi_service` has been superseded by `power_bi_service_enabled` ([#26456](https://github.com/hashicorp/terraform-provider-azurerm/issues/26456))\n\n## 3.109.0 (June 20, 2024)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_automation_runbook` ([#26359](https://github.com/hashicorp/terraform-provider-azurerm/issues/26359))\n* **New Resource:** `azurerm_data_protection_backup_instance_postgresql_flexible_server` ([#26249](https://github.com/hashicorp/terraform-provider-azurerm/issues/26249))\n* **New Resource:** `azurerm_email_communication_service_domain` ([#26179](https://github.com/hashicorp/terraform-provider-azurerm/issues/26179))\n* **New Resource:** `azurerm_system_center_virtual_machine_manager_cloud` ([#25429](https://github.com/hashicorp/terraform-provider-azurerm/issues/25429))\n* **New Resource:** `azurerm_system_center_virtual_machine_manager_virtual_machine_template` ([#25449](https://github.com/hashicorp/terraform-provider-azurerm/issues/25449))\n* **New Resource:** `azurerm_system_center_virtual_machine_manager_virtual_network` ([#25451](https://github.com/hashicorp/terraform-provider-azurerm/issues/25451))\n\nENHANCEMENTS:\n\n* Data Source: `azurerm_hdinsight_cluster` - export the `cluster_id` attribute ([#26228](https://github.com/hashicorp/terraform-provider-azurerm/issues/26228))\n* `azurerm_cosmosdb_sql_container` - support for the `partition_key_kind` and `partition_key_paths` properties ([#26372](https://github.com/hashicorp/terraform-provider-azurerm/issues/26372))\n* `azurerm_data_protection_backup_instance_blob_storage` - support for the `storage_account_container_names` property ([#26232](https://github.com/hashicorp/terraform-provider-azurerm/issues/26232))\n* `azurerm_virtual_network_peering` - support for the `peer_complete_virtual_networks_enabled`, `only_ipv6_peering_enabled`, `local_subnet_names`, and `remote_subnet_names` properties ([#26229](https://github.com/hashicorp/terraform-provider-azurerm/issues/26229))\n* `azurerm_virtual_desktop_host_pool` - changing the `preferred_app_group_type` property no longer creates a new resource ([#26333](https://github.com/hashicorp/terraform-provider-azurerm/issues/26333))\n* `azurerm_maps_account` - support for the `location`, `identity`, `cors` and `data_store` properties ([#26397](https://github.com/hashicorp/terraform-provider-azurerm/issues/26397))\n\nBUG FIXES:\n\n* `azurerm_automation_job_schedule` - updates `azurerm_automation_job_schedule` to use a composite resource id and allows `azurerm_automation_runbook` to be updated without causing `azurerm_automation_job_schedule` to recreate ([#22164](https://github.com/hashicorp/terraform-provider-azurerm/issues/22164))\n* `azurerm_databricks_workspace`- correctly allow disabling the default firewall ([#26339](https://github.com/hashicorp/terraform-provider-azurerm/issues/26339))\n* `azurerm_virtual_hub_*` - spliting create and update so lifecycle ignore changes works correctly ([#26310](https://github.com/hashicorp/terraform-provider-azurerm/issues/26310))\n\nDEPRECATIONS:\n\n* Data Source: `azurerm_mariadb_server` - deprecated since the service is retiring. Please use `azurerm_mysql_flexible_server` instead ([#26354](https://github.com/hashicorp/terraform-provider-azurerm/issues/26354))\n* `azurerm_mariadb_configuration` - deprecated since the service is retiring. Please use `azurerm_mysql_flexible_server_configuration` instead ([#26354](https://github.com/hashicorp/terraform-provider-azurerm/issues/26354))\n* `azurerm_mariadb_database` - deprecated since the service is retiring. Please use `azurerm_mysql_flexible_database` instead ([#26354](https://github.com/hashicorp/terraform-provider-azurerm/issues/26354))\n* `azurerm_mariadb_firewall_rule` - deprecated since the service is retiring. Please use `azurerm_mysql_flexible_server_firewall_rule` instead ([#26354](https://github.com/hashicorp/terraform-provider-azurerm/issues/26354))\n* `azurerm_mariadb_server` - deprecated since the service is retiring. Please use `azurerm_mysql_flexible_server` instead ([#26354](https://github.com/hashicorp/terraform-provider-azurerm/issues/26354))\n* `azurerm_mariadb_virtual_network_rule` - deprecated since the service is retiring ([#26354](https://github.com/hashicorp/terraform-provider-azurerm/issues/26354))\n\n## 3.108.0 (June 13, 2024)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_role_management_policy` ([#25900](https://github.com/hashicorp/terraform-provider-azurerm/issues/25900))\n* **New Resource:** `azurerm_role_management_policy` ([#25900](https://github.com/hashicorp/terraform-provider-azurerm/issues/25900))\n\nENHANCEMENTS:\n\n* provider: support subscription ID hinting when using Azure CLI authentication ([#26282](https://github.com/hashicorp/terraform-provider-azurerm/issues/26282))\n* `serviceconnector`: updating to use API Version `2024-04-01` ([#26248](https://github.com/hashicorp/terraform-provider-azurerm/issues/26248))\n* `azurerm_container_groups` - can now be created with a User Assigned Identity when running Windows ([#26308](https://github.com/hashicorp/terraform-provider-azurerm/issues/26308))\n* `azurerm_kubernetes_cluster` - updating the `network_profile.network_policy` property to `azure` and `calico` when it isn't previously set is supported ([#26176](https://github.com/hashicorp/terraform-provider-azurerm/issues/26176))\n* `azurerm_kubernetes_cluster` - respect Pod Disruption Budgets when rotating the `default_node_pool` ([#26274](https://github.com/hashicorp/terraform-provider-azurerm/issues/26274))\n* `azurerm_lb_backend_address_pool` - support for the `synchronous_mode` property ([#26309](https://github.com/hashicorp/terraform-provider-azurerm/issues/26309))\n* `azurerm_private_endpoint` - support symultaneous creation of multiple resources of this type per subnet ([#26006](https://github.com/hashicorp/terraform-provider-azurerm/issues/26006))\n\nBUG FIXES:\n\n* `azurerm_express_route_circuit_peering`, `azurerm_express_route_circuit`, `azurerm_express_route_gateway`, `azurerm_express_route_port` - split create and update ([#26237](https://github.com/hashicorp/terraform-provider-azurerm/issues/26237))\n* `azurerm_lb_backend_address_pool_address` - when using this resource, values are no longer reset on `azurerm_lb_backend_address_pool` ([#26264](https://github.com/hashicorp/terraform-provider-azurerm/issues/26264))\n* `azurerm_route_filter` - spliting create and update so lifecycle ignore changes works correctly ([#26266](https://github.com/hashicorp/terraform-provider-azurerm/issues/26266))\n* `azurerm_route_server` - spliting create and update so lifecycle ignore changes works correctly ([#26266](https://github.com/hashicorp/terraform-provider-azurerm/issues/26266))\n* `azurerm_synapse_workspace` - updates the client used in all operations of `azurerm_synapse_workspace_sql_aad_admin` to prevent this resource from modifying the same resource as `azurerm_synapse_workspace_aad_admin` ([#26317](https://github.com/hashicorp/terraform-provider-azurerm/issues/26317))\n* `azurerm_virtual_network` - correctly parse network security group IDs ([#26283](https://github.com/hashicorp/terraform-provider-azurerm/issues/26283))\n\nDEPRECATIONS:\n\n* Data Source: `azurerm_network_interface` - the `enable_ip_forwarding` and `enable_accelerated_networking` properties are deprecated and superseded by the `ip_forwarding_enabled` and `accelerated_networking_enabled` properties ([#26293](https://github.com/hashicorp/terraform-provider-azurerm/issues/26293))\n* `azurerm_api_management` - the `policy` block is deprecated and superseded with the `azurerm_api_management_policy` resource ([#26305](https://github.com/hashicorp/terraform-provider-azurerm/issues/26305))\n* `azurerm_kubernetes_cluster` - the `ebpf_data_plane` property is deprecated and superseded by the `network_data_plane` property ([#26251](https://github.com/hashicorp/terraform-provider-azurerm/issues/26251))\n* `azurerm_network_interface` - the `enable_ip_forwarding` and `enable_accelerated_networking` properties have been deprecated and superseded by the `ip_forwarding_enabled` and `accelerated_networking_enabled` properties ([#26293](https://github.com/hashicorp/terraform-provider-azurerm/issues/26293))\n* `azurerm_synapse_workspace` - the `aad_admin` and `sql_aad_admin` blocks have been deprecated and superseded by the `azurerm_synapse_workspace_aad_admin` and `azurerm_synapse_workspace_sql_aad_admin` resources ([#26317](https://github.com/hashicorp/terraform-provider-azurerm/issues/26317))\n\n## 3.107.0 (June 06, 2024)\n\nFEATURES:\n\n* **New Resource:** `azurerm_data_protection_backup_policy_postgresql_flexible_server` ([#26024](https://github.com/hashicorp/terraform-provider-azurerm/issues/26024))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240604.1114748` of `github.com/hashicorp/go-azure-sdk` ([#26216](https://github.com/hashicorp/terraform-provider-azurerm/issues/26216))\n* `advisor`: update API version to `2023-01-01` ([#26205](https://github.com/hashicorp/terraform-provider-azurerm/issues/26205))\n* `keyvault`: handling the Resources API returning Key Vaults that have been deleted when populating the cache ([#26199](https://github.com/hashicorp/terraform-provider-azurerm/issues/26199))\n* `machinelearning`: update API version to `2024-04-01` ([#26168](https://github.com/hashicorp/terraform-provider-azurerm/issues/26168))\n* `network/privatelinkservices` - update to use `hashicorp/go-azure-sdk` ([#26212](https://github.com/hashicorp/terraform-provider-azurerm/issues/26212))\n* `network/serviceendpointpolicies` - update to use `hashicorp/go-azure-sdk` ([#26196](https://github.com/hashicorp/terraform-provider-azurerm/issues/26196))\n* `network/virtualnetworks` - update to use `hashicorp/go-azure-sdk` ([#26217](https://github.com/hashicorp/terraform-provider-azurerm/issues/26217))\n* `network/virtualwans`: update route resources to use `hashicorp/go-azure-sdk` ([#26189](https://github.com/hashicorp/terraform-provider-azurerm/issues/26189))\n* `azurerm_container_app_job` - support for the `key_vault_secret_id` and `identity`  properties in the  `secret` block ([#25969](https://github.com/hashicorp/terraform-provider-azurerm/issues/25969))\n* `azurerm_kubernetes_cluster` - support for the `dns_zone_ids` property in the `web_app_routing` block ([#26117](https://github.com/hashicorp/terraform-provider-azurerm/issues/26117))\n* `azurerm_notification_hub_authorization_rule` - support for the `primary_connection_string` and `secondary_connection_string` properties ([#26188](https://github.com/hashicorp/terraform-provider-azurerm/issues/26188))\n* `azurerm_subnet` - support for the `default_outbound_access_enabled` property ([#25259](https://github.com/hashicorp/terraform-provider-azurerm/issues/25259))\n\nBUG FIXES:\n\n* `azurerm_api_management_named_value` - now enforces setting the `secret` property when setting the `value_from_key_vault` property ([#26150](https://github.com/hashicorp/terraform-provider-azurerm/issues/26150))\n* `azurerm_storage_sync_server_endpoint` - improve pooling to work around api inconsistencies ([#26204](https://github.com/hashicorp/terraform-provider-azurerm/issues/26204))\n* `azurerm_virtual_network` - split create and update function to fix lifecycle - ignore ([#26246](https://github.com/hashicorp/terraform-provider-azurerm/issues/26246))\n* `azurerm_vpn_server_configuration` - split create and update function to fix lifecycle - ignore ([#26175](https://github.com/hashicorp/terraform-provider-azurerm/issues/26175))\n* `azurerm_vpn_server_configuration_policy_group` - split create and update function to fix lifecycle - ignore ([#26207](https://github.com/hashicorp/terraform-provider-azurerm/issues/26207))\n* `azurerm_vpn_site` -  split create and update function to fix lifecycle - ignore changes ([#26163](https://github.com/hashicorp/terraform-provider-azurerm/issues/26163))\n\nDEPRECATIONS:\n\n* `azurerm_kubernetes_cluster` - the property `dns_zone_id` is superseded by the property `dns_zone_ids` in the `web_app_routing` block ([#26117](https://github.com/hashicorp/terraform-provider-azurerm/issues/26117))\n* `azurerm_nginx_deployment` - the block `configuration` is deprecated and superseded by the resource `azurerm_nginx_configuration` ([#25773](https://github.com/hashicorp/terraform-provider-azurerm/issues/25773))\n\n## 3.106.1 (May 31, 2024)\n\nBUG FIXES:\n\n* Data Source: `azurerm_kubernetes_cluster` - fix a crash when reading/setting `upgrade_settings` ([#26173](https://github.com/hashicorp/terraform-provider-azurerm/issues/26173))\n\n## 3.106.0 (May 31, 2024)\n\nUPGRADE NOTES:\n\n* This release updates the Key Vault cache to load Key Vaults using both the Key Vaults List API **and** the Resources API to workaround the API returning incomplete/stale data. To achieve this pattern, and provide consistency between tooling, we're intentionally using the same older version of the Resources API as the current version of Azure CLI. ([#26070](https://github.com/hashicorp/terraform-provider-azurerm/issues/26070))\n\nFEATURES:\n\n* **New Data Source:** `azurerm_arc_resource_bridge_appliance` ([#25731](https://github.com/hashicorp/terraform-provider-azurerm/issues/25731))\n* **New Data Source:** `azurerm_elastic_san_volume_group` ([#26111](https://github.com/hashicorp/terraform-provider-azurerm/issues/26111))\n* **New Data Source:** `azurerm_storage_queue` ([#26087](https://github.com/hashicorp/terraform-provider-azurerm/issues/26087))\n* **New Data Source:** `azurerm_storage_table` ([#26126](https://github.com/hashicorp/terraform-provider-azurerm/issues/26126))\n* **New Resource:** `azurerm_container_registry_cache_rule` ([#26034](https://github.com/hashicorp/terraform-provider-azurerm/issues/26034))\n* **New Resource:** `azurerm_virtual_machine_implicit_data_disk_from_source` ([#25537](https://github.com/hashicorp/terraform-provider-azurerm/issues/25537))\n\nENHANCEMENTS:\n\n* Data Source: azurerm_kubernetes_cluster - add support for the `drain_timeout_in_minutes` and `node_soak_duration_in_minutes` properties in the `upgrade_settings` block ([#26137](https://github.com/hashicorp/terraform-provider-azurerm/issues/26137))\n* dependencies: updating to `v0.20240529.1155048` of `github.com/hashicorp/go-azure-sdk` ([#26148](https://github.com/hashicorp/terraform-provider-azurerm/issues/26148))\n* `containerapps`: update API version to `2024-03-01` ([#25993](https://github.com/hashicorp/terraform-provider-azurerm/issues/25993))\n* `expressroute`: update to use `hashicorp/go-azure-sdk` ([#26066](https://github.com/hashicorp/terraform-provider-azurerm/issues/26066))\n* `keyvault`: populating the cache using both the Key Vault List and Resources API to workaround incomplete/stale data being returned ([#26070](https://github.com/hashicorp/terraform-provider-azurerm/issues/26070))\n* `servicenetworking`: updating to API Version `2023-11-01` ([#26148](https://github.com/hashicorp/terraform-provider-azurerm/issues/26148))\n* `virtualnetworkpeerings`: update to use `hashicorp/go-azure-sdk` ([#26065](https://github.com/hashicorp/terraform-provider-azurerm/issues/26065))\n* `azurerm_automation_powershell72_module` - support for the `tags` property ([#26106](https://github.com/hashicorp/terraform-provider-azurerm/issues/26106))\n* `azurerm_bastion_host` - support for `Developer` SKU ([#26068](https://github.com/hashicorp/terraform-provider-azurerm/issues/26068))\n* `azurerm_container_app_environment` - support for the `mutual_tls_enabled` property ([#25993](https://github.com/hashicorp/terraform-provider-azurerm/issues/25993))\n* `azurerm_container_registry` - validation to fail fast when setting `public_network_access_enabled` with an invalid SKU ([#26054](https://github.com/hashicorp/terraform-provider-azurerm/issues/26054))\n* `azurerm_key_vault_managed_hardware_security_module` - the `public_network_access_enabled` property can now be updated ([#26075](https://github.com/hashicorp/terraform-provider-azurerm/issues/26075))\n* `azurerm_kubernetes_cluster` - support for the `cost_analysis_enabled` property ([#26052](https://github.com/hashicorp/terraform-provider-azurerm/issues/26052))\n* `azurerm_kubernetes_cluster` - support for the `drain_timeout_in_minutes` and `node_soak_duration_in_minutes` properties in the `upgrade_settings` block ([#26137](https://github.com/hashicorp/terraform-provider-azurerm/issues/26137))\n* `azurerm_kubernetes_cluster_node_pool` - support for the `drain_timeout_in_minutes` and `node_soak_duration_in_minutes` properties in the `upgrade_settings` block ([#26137](https://github.com/hashicorp/terraform-provider-azurerm/issues/26137))\n* `azurerm_linux_virtual_machine` - the `hibernation_enabled` property can now be updated ([#26112](https://github.com/hashicorp/terraform-provider-azurerm/issues/26112))\n* `azurerm_logic_app_trigger_custom` - support for the property `callback_url` ([#25979](https://github.com/hashicorp/terraform-provider-azurerm/issues/25979))\n* `azurerm_machine_learning_workspace` - support for the `serverless_compute` block ([#25660](https://github.com/hashicorp/terraform-provider-azurerm/issues/25660))\n* `azurerm_mssql_elasticpool` - support the sku `HS_PRMS` ([#26161](https://github.com/hashicorp/terraform-provider-azurerm/issues/26161))\n* `azurerm_new_relic_monitor` - support for the `identity` block ([#26115](https://github.com/hashicorp/terraform-provider-azurerm/issues/26115))\n* `azurerm_route_map` - the `parameter` property is now Optional when the action type is `Drop` ([#26003](https://github.com/hashicorp/terraform-provider-azurerm/issues/26003))\n* `azurerm_windows_virtual_machine` - the `hibernation_enabled` property can now be updated ([#26112](https://github.com/hashicorp/terraform-provider-azurerm/issues/26112))\n\nBUG FIXES:\n\n* Data Source: `azurerm_system_center_virtual_machine_manager_inventory_items` - normalise the resource ID for Inventory Items ([#25955](https://github.com/hashicorp/terraform-provider-azurerm/issues/25955))\n* `azurerm_app_configuration_feature` - update polling interval to tolerate eventual consistency of the API ([#26025](https://github.com/hashicorp/terraform-provider-azurerm/issues/26025))\n* `azurerm_app_configuration_key` - update polling interval to tolerate eventual consistency of the API ([#26025](https://github.com/hashicorp/terraform-provider-azurerm/issues/26025))\n* `azurerm_linux_function_app` - fix update handling of `health_check_eviction_time_in_min` and `WEBSITE_HEALTHCHECK_MAXPINGFAILURES` ([#26107](https://github.com/hashicorp/terraform-provider-azurerm/issues/26107))\n* `azurerm_linux_function_app_slot` - fix update handling of `health_check_eviction_time_in_min` and `WEBSITE_HEALTHCHECK_MAXPINGFAILURES` ([#26107](https://github.com/hashicorp/terraform-provider-azurerm/issues/26107))\n* `azurerm_linux_web_app` - fix update handling of `health_check_eviction_time_in_min` and `WEBSITE_HEALTHCHECK_MAXPINGFAILURES` ([#26107](https://github.com/hashicorp/terraform-provider-azurerm/issues/26107))\n* `azurerm_linux_web_app_slot` - fix update handling of `health_check_eviction_time_in_min` and `WEBSITE_HEALTHCHECK_MAXPINGFAILURES` ([#26107](https://github.com/hashicorp/terraform-provider-azurerm/issues/26107))\n* `azurerm_postgresql_flexible_server` - prevent premature check on updated `storage_mb` value that prevents the resource from being re-created ([#25986](https://github.com/hashicorp/terraform-provider-azurerm/issues/25986))\n* `azurerm_redis_access_cache_policy_assignment` - add locks to stabilize creation of multiple policy assignments ([#26085](https://github.com/hashicorp/terraform-provider-azurerm/issues/26085))\n* `azurerm_redis_access_cache_policy` - add locks to stabilize creation of multiple policy assignments ([#26085](https://github.com/hashicorp/terraform-provider-azurerm/issues/26085))\n* `azurerm_windows_function_app` - fix update handling of `health_check_eviction_time_in_min` and `WEBSITE_HEALTHCHECK_MAXPINGFAILURES` ([#26107](https://github.com/hashicorp/terraform-provider-azurerm/issues/26107))\n* `azurerm_windows_function_app_slot` - fix update handling of `health_check_eviction_time_in_min` and `WEBSITE_HEALTHCHECK_MAXPINGFAILURES` ([#26107](https://github.com/hashicorp/terraform-provider-azurerm/issues/26107))\n* `azurerm_windows_web_app` - fix update handling of `health_check_eviction_time_in_min` and `WEBSITE_HEALTHCHECK_MAXPINGFAILURES` ([#26107](https://github.com/hashicorp/terraform-provider-azurerm/issues/26107))\n* `azurerm_windows_web_app_slot` - fix update handling of `health_check_eviction_time_in_min` and `WEBSITE_HEALTHCHECK_MAXPINGFAILURES` ([#26107](https://github.com/hashicorp/terraform-provider-azurerm/issues/26107))\n\n## 3.105.0 (May 24, 2024)\n\nBREAKING CHANGE:\n\n* `azurerm_kubernetes_cluster` - the properties `workload_autoscaler_profile.vertical_pod_autoscaler_update_mode` and `workload_autoscaler_profile.vertical_pod_autoscaler_controlled_values` are no longer populated since they're not exported in API version `2023-09-02-preview` ([#25663](https://github.com/hashicorp/terraform-provider-azurerm/issues/25663))\n\nFEATURES:\n\n* New Resource: `azurerm_api_management_policy_fragment` ([#24968](https://github.com/hashicorp/terraform-provider-azurerm/issues/24968))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240522.1080424` of `github.com/hashicorp/go-azure-sdk` ([#26069](https://github.com/hashicorp/terraform-provider-azurerm/issues/26069))\n* `containerservice`: updating to use API Version `2023-09-02-preview` ([#25663](https://github.com/hashicorp/terraform-provider-azurerm/issues/25663))\n* `azurerm_application_insights_standard_web_test` - `http_verb` can now be set to `HEAD` and `OPTIONS` ([#26077](https://github.com/hashicorp/terraform-provider-azurerm/issues/26077))\n* `azurerm_cdn_frontdoor_rule` - updating the validation for `match_values` within the `uri_path_condition` block  to support a forward-slash ([#26017](https://github.com/hashicorp/terraform-provider-azurerm/issues/26017))\n* `azurerm_linux_web_app` - normalising the value for `virtual_network_subnet_id` ([#25885](https://github.com/hashicorp/terraform-provider-azurerm/issues/25885))\n* `azurerm_machine_learning_compute_cluster` - add validation for `name` ([#26060](https://github.com/hashicorp/terraform-provider-azurerm/issues/26060))\n* `azurerm_machine_learning_compute_cluster` - improve validation to allow an empty `subnet_resource_id` when the Workspace is using a managed Virtual Network ([#26073](https://github.com/hashicorp/terraform-provider-azurerm/issues/26073))\n* `azurerm_postgresql_flexible_server` - the field `public_network_access_enabled` is now configurable (previously this was computed-only/not settable via the API) ([#25812](https://github.com/hashicorp/terraform-provider-azurerm/issues/25812))\n* `azurerm_snapshot` - support for `disk_access_id` ([#25996](https://github.com/hashicorp/terraform-provider-azurerm/issues/25996))\n* `azurerm_windows_web_app` - normalising the value for `virtual_network_subnet_id` ([#25885](https://github.com/hashicorp/terraform-provider-azurerm/issues/25885))\n\nBUG FIXES:\n\n* `azurerm_container_app_environment_custom_domain`: parsing the Log Analytics Workspace ID insensitively to workaround the API returning this value inconsistently ([#26074](https://github.com/hashicorp/terraform-provider-azurerm/issues/26074))\n* `azurerm_container_app_job` - updating the validation for the `name` field ([#26049](https://github.com/hashicorp/terraform-provider-azurerm/issues/26049))\n* `azurerm_container_app_job` - updating the validation for the `name` field within the `custom_scale_rule` block ([#26049](https://github.com/hashicorp/terraform-provider-azurerm/issues/26049))\n* `azurerm_container_app_job` - updating the validation for the `name` field within the `rules` block ([#26049](https://github.com/hashicorp/terraform-provider-azurerm/issues/26049))\n* `azurerm_linux_function_app_slot` - fixed panic when planning from a version older than 3.88.0 ([#25838](https://github.com/hashicorp/terraform-provider-azurerm/issues/25838))\n* `azurerm_pim_active_role_assignment` - fix a persistent diff when `ticket` is not specified ([#26059](https://github.com/hashicorp/terraform-provider-azurerm/issues/26059))\n* `azurerm_pim_eligible_role_assignment` - fix a persistent diff when `ticket` is not specified ([#26059](https://github.com/hashicorp/terraform-provider-azurerm/issues/26059))\n* `azurerm_policy_definition` - recreate the resource if the `parameters` property is updated to include fewer items ([#26083](https://github.com/hashicorp/terraform-provider-azurerm/issues/26083)) \n* `azurerm_windows_function_app_slot` - set Server Farm ID in payload when using a Virtual Network Subnet for the slot ([#25634](https://github.com/hashicorp/terraform-provider-azurerm/issues/25634))\n* `azurerm_windows_web_app_slot` - set Server Farm ID in payload when using a Virtual Network Subnet for the slot ([#25634](https://github.com/hashicorp/terraform-provider-azurerm/issues/25634))\n\n\n## 3.104.2 (May 20, 2024)\n\nNOTE: This release is a re-release of `v3.104.1` to include missing changes, refer to the changelog entries for `v3.104.1`.\n\n## 3.104.1 (May 20, 2024)\n\nBUG FIXES:\n\n* `azurerm_pim_active_role_assignment` - fix a regression where roles assignments could not be created with no expiration ([#26029](https://github.com/hashicorp/terraform-provider-azurerm/issues/26029))\n* `azurerm_pim_eligible_role_assignment` - fix a regression where roles assignments could not be created with no expiration ([#26029](https://github.com/hashicorp/terraform-provider-azurerm/issues/26029))\n\n## 3.104.0 (May 16, 2024)\n\nFEATURES:\n\n* New Data Source: `azurerm_elastic_san` ([#25719](https://github.com/hashicorp/terraform-provider-azurerm/issues/25719))\n\nENHANCEMENTS:\n\n* New Resource - `azurerm_key_vault_managed_hardware_security_module_key` ([#25935](https://github.com/hashicorp/terraform-provider-azurerm/issues/25935))\n* Data Source - `azurerm_kubernetes_service_version` - support for the `default_version` property ([#25953](https://github.com/hashicorp/terraform-provider-azurerm/issues/25953))\n* `network/applicationgateways` - update to use `hashicorp/go-azure-sdk` ([#25844](https://github.com/hashicorp/terraform-provider-azurerm/issues/25844))\n* `dataprotection` - update API version to `2024-04-01` ([#25882](https://github.com/hashicorp/terraform-provider-azurerm/issues/25882))\n* `databasemigration` - update API version to `2021-06-30` ([#25997](https://github.com/hashicorp/terraform-provider-azurerm/issues/25997))\n* `network/ips` - update to use `hashicorp/go-azure-sdk` ([#25905](https://github.com/hashicorp/terraform-provider-azurerm/issues/25905))\n* `network/localnetworkgateway` - update to use `hashicorp/go-azure-sdk` ([#25905](https://github.com/hashicorp/terraform-provider-azurerm/issues/25905))\n* `network/natgateway` - update to use `hashicorp/go-azure-sdk` ([#25905](https://github.com/hashicorp/terraform-provider-azurerm/issues/25905))\n* `network/networksecuritygroup` - update to use `hashicorp/go-azure-sdk` ([#25971](https://github.com/hashicorp/terraform-provider-azurerm/issues/25971))\n* `network/publicips` - update to use `hashicorp/go-azure-sdk` ([#25971](https://github.com/hashicorp/terraform-provider-azurerm/issues/25971))\n* `network/virtualwan` - update to use `hashicorp/go-azure-sdk` ([#25971](https://github.com/hashicorp/terraform-provider-azurerm/issues/25971))\n* `network/vpn` - update to use `hashicorp/go-azure-sdk` ([#25971](https://github.com/hashicorp/terraform-provider-azurerm/issues/25971))\n* `azurerm_databricks_workspace` - support for the `default_storage_firewall_enabled` property ([#25919](https://github.com/hashicorp/terraform-provider-azurerm/issues/25919))\n* `azurerm_key_vault` - allow previously existing key vaults to continue to manage the `contact` field prior to the `v3.93.0` conditional polling change ([#25777](https://github.com/hashicorp/terraform-provider-azurerm/issues/25777))\n* `azurerm_linux_function_app` - support for the PowerShell `7.4` ([#25980](https://github.com/hashicorp/terraform-provider-azurerm/issues/25980))\n* `azurerm_log_analytics_cluster` - support for the value `UserAssigned` in the `identity.type` property ([#25940](https://github.com/hashicorp/terraform-provider-azurerm/issues/25940))\n* `azurerm_pim_active_role_assignment` - remove hard dependency on the `roleAssignmentScheduleRequests` API, so that role assignments aren't unmanageable over time ([#25956](https://github.com/hashicorp/terraform-provider-azurerm/issues/25956))\n* `azurerm_pim_eligible_role_assignment` - remove hard dependency on the `roleEligibilityScheduleRequests` API, so that role assignments aren't unmanageable over time ([#25956](https://github.com/hashicorp/terraform-provider-azurerm/issues/25956))\n* `azurerm_windows_function_app` - support for the PowerShell `7.4` ([#25980](https://github.com/hashicorp/terraform-provider-azurerm/issues/25980))\n\nBUG FIXES:\n\n* `azurerm_container_app_job` - Allow `event_trigger_config.scale.min_executions` to be `0` ([#25931](https://github.com/hashicorp/terraform-provider-azurerm/issues/25931))\n* `azurerm_container_app_job` - update validation to allow the `replica_retry_limit` property to be set to `0` ([#25984](https://github.com/hashicorp/terraform-provider-azurerm/issues/25984))\n* `azurerm_data_factory_trigger_custom_event` - one of `subject_begins_with` and `subject_ends_with` no longer need to be set ([#25932](https://github.com/hashicorp/terraform-provider-azurerm/issues/25932))\n* `azurerm_kubernetes_cluster_node_pool` - prevent race condition by checking the virtual network status when creating a node pool with a subnet ID ([#25888](https://github.com/hashicorp/terraform-provider-azurerm/issues/25888))\n* `azurerm_postgresql_flexible_server` - fix for default `storage_tier` value when `storage_mb` field is changed ([#25947](https://github.com/hashicorp/terraform-provider-azurerm/issues/25947))\n* `azurerm_pim_active_role_assignment` - resolves several potential crashes ([#25956](https://github.com/hashicorp/terraform-provider-azurerm/issues/25956))\n* `azurerm_pim_eligible_role_assignment` - resolves several potential crashes ([#25956](https://github.com/hashicorp/terraform-provider-azurerm/issues/25956))\n* `azurerm_redis_enterprise_cluster_location_zone_support` - add `Central India` zones support ([#26000](https://github.com/hashicorp/terraform-provider-azurerm/issues/26000))\n* `azurerm_sentinel_alert_rule_scheduled` - the `alert_rule_template_version` property is no longer `ForceNew` ([#25688](https://github.com/hashicorp/terraform-provider-azurerm/issues/25688))\n* `azurerm_storage_sync_server_endpoint` - preventing a crashed due to `initial_upload_policy`  ([#25968](https://github.com/hashicorp/terraform-provider-azurerm/issues/25968))\n\n## 3.103.1 (May 10, 2024)\n\nBUG FIXES\n\n* `loadtest` - fixing an issue where the SDK Clients weren't registered ([#25920](https://github.com/hashicorp/terraform-provider-azurerm/issues/25920))\n\n## 3.103.0 (May 09, 2024)\n\nFEATURES:\n\n* New Resource: `azurerm_container_app_job` ([#23871](https://github.com/hashicorp/terraform-provider-azurerm/issues/23871))\n* New Resource: `azurerm_container_app_environment_custom_domain` ([#24346](https://github.com/hashicorp/terraform-provider-azurerm/issues/24346))\n* New Resource: `azurerm_data_factory_credential_service_principal` ([#25805](https://github.com/hashicorp/terraform-provider-azurerm/issues/25805))\n* New Resource: `azurerm_network_manager_connectivity_configuration` ([#25746](https://github.com/hashicorp/terraform-provider-azurerm/issues/25746))\n* New Resource: `azurerm_maintenance_assignment_dynamic_scope` ([#25467](https://github.com/hashicorp/terraform-provider-azurerm/issues/25467))\n* New Resource: `azurerm_virtual_machine_gallery_application_assignment` ([#22945](https://github.com/hashicorp/terraform-provider-azurerm/issues/22945))\n* New Resource: `azurerm_virtual_machine_automanage_configuration_assignment` ([#25480](https://github.com/hashicorp/terraform-provider-azurerm/issues/25480))\n\nENHANCEMENTS:\n\n* provider - support for the `recover_soft_deleted_backup_protected_vm` feature ([#24157](https://github.com/hashicorp/terraform-provider-azurerm/issues/24157))\n* dependencies: updating `github.com/hashicorp/go-azure-helpers` to `v0.69.0` ([#25903](https://github.com/hashicorp/terraform-provider-azurerm/issues/25903))\n* `loganalytics` - update cluster resource to api version `2022-01-01` ([#25686](https://github.com/hashicorp/terraform-provider-azurerm/issues/25686))\n* `azurerm_bastion_host` - support for the `kerberos_enabled` property ([#25823](https://github.com/hashicorp/terraform-provider-azurerm/issues/25823))\n* `azurerm_container_app` - secrets can now be removed ([#25743](https://github.com/hashicorp/terraform-provider-azurerm/issues/25743))\n* `azurerm_container_app_environment` - support for the `custom_domain_verification_id` property ([#24346](https://github.com/hashicorp/terraform-provider-azurerm/issues/24346))\n* `azurerm_linux_virtual_machine` - support for the more capability `hibernation_enabled` ([#25807](https://github.com/hashicorp/terraform-provider-azurerm/issues/25807))\n* `azurerm_linux_virtual_machine` - support for more values for the `license_type` property ([#25909](https://github.com/hashicorp/terraform-provider-azurerm/issues/25909))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `maximum_surge_instances` property for vmss rolling upgrades ([#24914](https://github.com/hashicorp/terraform-provider-azurerm/issues/24914))\n* `azurerm_windows_virtual_machine` - support for the more capability `hibernation_enabled` ([#25807](https://github.com/hashicorp/terraform-provider-azurerm/issues/25807))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `maximum_surge_instances_enabled` property for vmss rolling upgrades ([#24914](https://github.com/hashicorp/terraform-provider-azurerm/issues/24914))\n* `azurerm_storage_account` - support for the `permanent_delete_enabled` property within retention policies ([#25778](https://github.com/hashicorp/terraform-provider-azurerm/issues/25778))\n\nBUG FIXES:\n\n* `azurerm_kubernetes_cluster` - erase `load_balancer_profile` when changing `network_profile.outbound_type` from `loadBalancer` to another outbound type ([#25530](https://github.com/hashicorp/terraform-provider-azurerm/issues/25530))\n* `azurerm_log_analytics_saved_search` - the `function_parameters` property now respects the order of elements ([#25869](https://github.com/hashicorp/terraform-provider-azurerm/issues/25869))\n* `azurerm_linux_web_app` - fix `slow_request` with `path` issue in `auto_heal` by adding support for `slow_request_with_path` block ([#20049](https://github.com/hashicorp/terraform-provider-azurerm/issues/20049))\n* `azurerm_linux_web_app_slot` - fix `slow_request` with `path` issue in `auto_heal` by adding support for `slow_request_with_path` block ([#20049](https://github.com/hashicorp/terraform-provider-azurerm/issues/20049))\n* `azurerm_monitor_private_link_scoped_service` - normalize case of the `linked_resource_id` property during reads  ([#25787](https://github.com/hashicorp/terraform-provider-azurerm/issues/25787))\n* `azurerm_role_assignment` - add additional retry logic to assist with cross-tenant use ([#25853](https://github.com/hashicorp/terraform-provider-azurerm/issues/25853))\n* `azurerm_web_pubsub_network_acl` - fixing a crash when `networkACL.PublicNetwork.Deny` was nil ([#25886](https://github.com/hashicorp/terraform-provider-azurerm/issues/25886))\n* `azurerm_windows_web_app` - fix `slow_request` with `path` issue in `auto_heal` by adding support for `slow_request_with_path` block ([#20049](https://github.com/hashicorp/terraform-provider-azurerm/issues/20049))\n* `azurerm_windows_web_app_slot` - fix `slow_request` with `path` issue in `auto_heal` by adding support for `slow_request_with_path` block ([#20049](https://github.com/hashicorp/terraform-provider-azurerm/issues/20049))\n\nDEPRECATIONS:\n* `azurerm_subnet` - the `private_endpoint_network_policies_enabled` property is deprecated in favour of the `private_endpoint_network_policies` property ([#25779](https://github.com/hashicorp/terraform-provider-azurerm/issues/25779))\n\n## 3.102.0 (May 02, 2024)\n\nFEATURES:\n\n* New Resource: `azurerm_storage_sync_server_endpoint` ([#25831](https://github.com/hashicorp/terraform-provider-azurerm/issues/25831))\n* New Resource: `azurerm_storage_container_immutability_policy` ([#25804](https://github.com/hashicorp/terraform-provider-azurerm/issues/25804))\n\nENHANCEMENTS:\n\n* `azurerm_load_test` - add support for `encryption` ([#25759](https://github.com/hashicorp/terraform-provider-azurerm/issues/25759))\n* `azurerm_network_connection_monitor` - update validation for `target_resource_type` and `target_resource_id` ([#25745](https://github.com/hashicorp/terraform-provider-azurerm/issues/25745))\n* `azurerm_mssql_managed_database` - support for a Restorable Database ID to be used as the `source_database_id` for point in time restore ([#25568](https://github.com/hashicorp/terraform-provider-azurerm/issues/25568))\n* `azurerm_storage_account` - support for the `managed_hsm_key_id` property ([#25088](https://github.com/hashicorp/terraform-provider-azurerm/issues/25088))\n* `azurerm_storage_account_customer_managed_key` - support for the `managed_hsm_key_id` property ([#25088](https://github.com/hashicorp/terraform-provider-azurerm/issues/25088))\n\nBUG FIXES:\n\n* `azurerm_linux_function_app` - now sets docker registry url in `linux_fx_version` by default ([#23911](https://github.com/hashicorp/terraform-provider-azurerm/issues/23911))\n* `azurerm_resource_group` - work around sporadic eventual consistency errors ([#25758](https://github.com/hashicorp/terraform-provider-azurerm/issues/25758))\n\nDEPRECATIONS:\n\n* `azurerm_key_vault_managed_hardware_security_module_role_assignment` - the `vault_base_url` property is deprecated in favour of the `managed_hsm_id` property ([#25601](https://github.com/hashicorp/terraform-provider-azurerm/issues/25601))\n\n## 3.101.0 (April 25, 2024)\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240424.1114424` of `github.com/hashicorp/go-azure-sdk` ([#25749](https://github.com/hashicorp/terraform-provider-azurerm/issues/25749))\n* dependencies: updating to `v0.27.0` of `github.com/tombuildsstuff/giovanni` ([#25702](https://github.com/hashicorp/terraform-provider-azurerm/issues/25702))\n* dependencies: updating `golang.org/x/net` to `0.23.0`\n* `azurerm_cognitive_account` - the `kind` property now supports `ConversationalLanguageUnderstanding` ([#25735](https://github.com/hashicorp/terraform-provider-azurerm/issues/25735))\n* `azurerm_container_app_custom_domain` - support the ability to use Azure Managed Certificates ([#25356](https://github.com/hashicorp/terraform-provider-azurerm/issues/25356))\n\nBUG FIXES:\n\n* Data Source: `azurerm_application_insights` - set correct AppID in data source ([#25687](https://github.com/hashicorp/terraform-provider-azurerm/issues/25687))\n* `azurerm_virtual_network` - suppress diff in ordering for `address_space` due to inconsistent API response ([#23793](https://github.com/hashicorp/terraform-provider-azurerm/issues/23793))\n* `azurerm_storage_data_lake_gen2_filesystem` - add context deadline for import ([#25712](https://github.com/hashicorp/terraform-provider-azurerm/issues/25712))\n* `azurerm_virtual_network_gateway` - preserve existing `nat_rules` on updates ([#25690](https://github.com/hashicorp/terraform-provider-azurerm/issues/25690))\n\n## 3.100.0 (April 18, 2024)\n\nENHANCEMENTS:\n\n* dependencies: updating `hashicorp/go-azure-sdk` to `v0.20240417.1084633` ([#25659](https://github.com/hashicorp/terraform-provider-azurerm/issues/25659))\n* `compute` - update Virtual Machine and Virtual Machine Scale Set resources and data sources to use `hashicorp/go-azure-sdk` ([#25533](https://github.com/hashicorp/terraform-provider-azurerm/issues/25533))\n* `machine_learning` - Add new `machine_learning` block that supports `purge_soft_deleted_workspace_on_destroy` ([#25624](https://github.com/hashicorp/terraform-provider-azurerm/issues/25624))\n* `loganalytics` - update cluster resource to use `hashicorp/go-azure-sdk` ([#23373](https://github.com/hashicorp/terraform-provider-azurerm/issues/23373))\n* Data Source: `azurerm_management_group` - now exports the `tenant_scoped_id` attribute ([#25555](https://github.com/hashicorp/terraform-provider-azurerm/issues/25555))\n* `azurerm_container_app` - the `ingress.ip_security_restriction.ip_address_range` property now accepts an IP address as valid input ([#25609](https://github.com/hashicorp/terraform-provider-azurerm/issues/25609))\n* `azurerm_container_group` - the `identity` block can now be updated ([#25543](https://github.com/hashicorp/terraform-provider-azurerm/issues/25543))\n* `azurerm_express_route_connection` - support for the `private_link_fast_path_enabled` property ([#25596](https://github.com/hashicorp/terraform-provider-azurerm/issues/25596))\n* `azurerm_hdinsight_hadoop_cluster` - support for the `private_link_configuration` block ([#25629](https://github.com/hashicorp/terraform-provider-azurerm/issues/25629))\n* `azurerm_hdinsight_hbase_cluster` - support for the `private_link_configuration` block ([#25629](https://github.com/hashicorp/terraform-provider-azurerm/issues/25629))\n* `azurerm_hdinsight_interactive_query_cluster` - support for the `private_link_configuration` block ([#25629](https://github.com/hashicorp/terraform-provider-azurerm/issues/25629))\n* `azurerm_hdinsight_kafka_cluster` - support for the `private_link_configuration` block ([#25629](https://github.com/hashicorp/terraform-provider-azurerm/issues/25629))\n* `azurerm_hdinsight_spark_cluster` - support for the `private_link_configuration` block ([#25629](https://github.com/hashicorp/terraform-provider-azurerm/issues/25629))\n* `azurerm_management_group` - now exports the `tenant_scoped_id` attribute ([#25555](https://github.com/hashicorp/terraform-provider-azurerm/issues/25555))\n* `azurerm_monitor_activity_log_alert` - support for the `location` property ([#25389](https://github.com/hashicorp/terraform-provider-azurerm/issues/25389))\n* `azurerm_mysql_flexible_server` - update validating regex for `sku_name` ([#25642](https://github.com/hashicorp/terraform-provider-azurerm/issues/25642))\n* `azurerm_postgresql_flexible_server` - support for the `GeoRestore` `create_mode` ([#25664](https://github.com/hashicorp/terraform-provider-azurerm/issues/25664))\n* `azurerm_virtual_network_gateway_connection` - support for the `private_link_fast_path_enabled` property ([#25650](https://github.com/hashicorp/terraform-provider-azurerm/issues/25650))\n* `azurerm_windows_web_app` - support for the `handler_mapping` block ([#25631](https://github.com/hashicorp/terraform-provider-azurerm/issues/25631))\n* `azurerm_windows_web_app_slot` - support for the `handler_mapping` block ([#25631](https://github.com/hashicorp/terraform-provider-azurerm/issues/25631))\n\nBUG FIXES:\n\n* storage: prevent a bug causing the second storage account key to be used for authentication instead of the first ([#25652](https://github.com/hashicorp/terraform-provider-azurerm/issues/25652))\n* `azurerm_active_directory_domain_service` - prevent an issue where `filtered_sync_enabled` was not being updated ([#25594](https://github.com/hashicorp/terraform-provider-azurerm/issues/25594))\n* `azurerm_application_insights` - add a state migration to fix the resource ID casing of Application Insights resources ([#25628](https://github.com/hashicorp/terraform-provider-azurerm/issues/25628))\n* `azurerm_function_app_hybrid_connection` - can now use relay resources created in a different resource group ([#25541](https://github.com/hashicorp/terraform-provider-azurerm/issues/25541))\n* `azurerm_kubernetes_cluster_node_pool` - prevent plan diff when the `windows_profile.outbound_nat_enabled` property is unset ([#25644](https://github.com/hashicorp/terraform-provider-azurerm/issues/25644))\n* `azurerm_machine_learning_compute_cluster` - fix location to point to parent resource for computes ([#25643](https://github.com/hashicorp/terraform-provider-azurerm/issues/25643))\n* `azurerm_machine_learning_compute_instance` - fix location to point to parent resource for computes ([#25643](https://github.com/hashicorp/terraform-provider-azurerm/issues/25643))\n* `azurerm_storage_account` - check replication type when evaluating support level for shares and queues for V1 storage accounts ([#25581](https://github.com/hashicorp/terraform-provider-azurerm/issues/25581))\n* `azurerm_storage_account` - added a sanity check for `dns_endpoint_type` and `blob_properties.restore_policy` ([#25450](https://github.com/hashicorp/terraform-provider-azurerm/issues/25450))\n* `azurerm_web_app_hybrid_connection` - can now use relay resources created in a different resource group ([#25541](https://github.com/hashicorp/terraform-provider-azurerm/issues/25541))\n* `azurerm_windows_web_app` - prevent removal of `site_config.application_stack.node_version` when `app_settings` are updated ([#25488](https://github.com/hashicorp/terraform-provider-azurerm/issues/25488))\n* `azurerm_windows_web_app_slot` - prevent removal of `site_config.application_stack.node_version` when `app_settings` are updated ([#25489](https://github.com/hashicorp/terraform-provider-azurerm/issues/25489))\n\nDEPRECATIONS:\n\n* `logz` - the Logz resources are deprecated and will be removed in v4.0 of the AzureRM Provider since the API no longer allows new instances to be created ([#25405](https://github.com/hashicorp/terraform-provider-azurerm/issues/25405))\n* `azurerm_machine_learning_compute_instance` - marked the `location` field as deprecated in v4.0 of the provider ([#25643](https://github.com/hashicorp/terraform-provider-azurerm/issues/25643))\n* `azurerm_kubernetes_cluster` - the following properties have been deprecated since the API no longer supports cluster creation with legacy Azure Entra integration: `client_app_id`, `server_app_id`, `server_app_secret` and `managed` ([#25200](https://github.com/hashicorp/terraform-provider-azurerm/issues/25200))\n\n## 3.99.0 (April 11, 2024)\n\nBREAKING CHANGE: \n\n* `azurerm_linux_web_app` - `site_config.0.application_stack.0.java_version` must be specified with `java_server` and `java_server_version` ([#25553](https://github.com/hashicorp/terraform-provider-azurerm/issues/25553))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240411.1104331` of `github.com/hashicorp/go-azure-sdk/resourcemanager` and `github.com/hashicorp/go-azure-sdk/sdk` ([#25546](https://github.com/hashicorp/terraform-provider-azurerm/issues/25546))\n* dependencies: updating to `v0.26.1` of `github.com/tombuildsstuff/giovanni` ([#25551](https://github.com/hashicorp/terraform-provider-azurerm/issues/25551))\n* `azurerm_key_vault` - deprecate the `contact` property from v3.x provider and update properties to Computed & Optional ([#25552](https://github.com/hashicorp/terraform-provider-azurerm/issues/25552))\n* `azurerm_key_vault_certificate_contacts` - in v4.0 make the `contact` property optional to allow for deletion of contacts from the key vault ([#25552](https://github.com/hashicorp/terraform-provider-azurerm/issues/25552))\n* `azurerm_signalr_service` - support for setting the `sku` property to `Premium_P2` ([#25578](https://github.com/hashicorp/terraform-provider-azurerm/issues/25578))\n* `azurerm_snapshot` - support for the `network_access_policy` and `public_network_access_enabled` properties ([#25421](https://github.com/hashicorp/terraform-provider-azurerm/issues/25421))\n* `azurerm_storage_account` - extend the support level of `(blob|queue|share)_properties` for Storage kind ([#25427](https://github.com/hashicorp/terraform-provider-azurerm/issues/25427))\n* `azurerm_storage_blob` - support for the `encryption_scope` property ([#25551](https://github.com/hashicorp/terraform-provider-azurerm/issues/25551))\n* `azurerm_storage_container` - support for the `default_encryption_scope` and `encryption_scope_override_enabled` properties ([#25551](https://github.com/hashicorp/terraform-provider-azurerm/issues/25551))\n* `azurerm_storage_data_lake_gen2_filesystem` - support for the `default_encryption_scope` property ([#25551](https://github.com/hashicorp/terraform-provider-azurerm/issues/25551))\n* `azurerm_subnet` - the `delegation.x.service_delegation.x.name` property now supports `Oracle.Database/networkAttachments` ([#25571](https://github.com/hashicorp/terraform-provider-azurerm/issues/25571))\n* `azurerm_web_pubsub` - support setting the `sku` property to `Premium_P2` ([#25578](https://github.com/hashicorp/terraform-provider-azurerm/issues/25578))\n\nBUG FIXES:\n\n* provider: fix an issue where the provider was not correctly configured when using a custom metadata host ([#25546](https://github.com/hashicorp/terraform-provider-azurerm/issues/25546))\n* storage: fixes several potential crashes during plan/apply with resources using the Storage data plane API ([#25525](https://github.com/hashicorp/terraform-provider-azurerm/issues/25525))\n* `azurerm_application_insights` - fix issue where the wrong Application ID was set into the property `app_id` ([#25520](https://github.com/hashicorp/terraform-provider-azurerm/issues/25520))\n* `azurerm_application_insights_api_key` - add a state migration to re-case static segments of the resource ID  ([#25567](https://github.com/hashicorp/terraform-provider-azurerm/issues/25567))\n* `azurerm_container_app_environment_certificate` - the `subject_name` attribute is now correctly populated ([#25516](https://github.com/hashicorp/terraform-provider-azurerm/issues/25516))\n* `azurerm_function_app_slot` - now taints the resource when partially created ([#24520](https://github.com/hashicorp/terraform-provider-azurerm/issues/24520))\n* `azurerm_linux_function_app` - now taints the resource when partially created ([#24520](https://github.com/hashicorp/terraform-provider-azurerm/issues/24520))\n* `azurerm_managed_disk` - filtering the Resource SKUs response to reduce the memory overhead, when determining whether a Managed Disk can be online resized or not ([#25549](https://github.com/hashicorp/terraform-provider-azurerm/issues/25549))\n* `azurerm_monitor_alert_prometheus_rule_group` - the `severity` property is now set correctly when `0` ([#25408](https://github.com/hashicorp/terraform-provider-azurerm/issues/25408))\n* `azurerm_monitor_smart_detector_alert_rule` - normalising the value for `id` within the `action_group` block ([#25559](https://github.com/hashicorp/terraform-provider-azurerm/issues/25559))\n* `azurerm_redis_cache_access_policy_assignment` - the `object_id_alias` property now allows usernames ([#25523](https://github.com/hashicorp/terraform-provider-azurerm/issues/25523))\n* `azurerm_windows_function_app` - doesn't taint the resource when partially created ([#24520](https://github.com/hashicorp/terraform-provider-azurerm/issues/24520))\n* `azurerm_windows_function_app` - doesn't taint the resource when partially created ([#24520](https://github.com/hashicorp/terraform-provider-azurerm/issues/24520))\n\nDEPRECATIONS:\n\n* `azurerm_cosmosdb_account` - the `connection_strings` property is superseded by the primary and secondary connection strings for sql, mongodb and readonly ([#25510](https://github.com/hashicorp/terraform-provider-azurerm/issues/25510))\n* `azurerm_cosmosdb_account` - the `enable_free_tier` property is superseded by `free_tier_enabled` ([#25510](https://github.com/hashicorp/terraform-provider-azurerm/issues/25510))\n* `azurerm_cosmosdb_account` - the `enable_multiple_write_locations` property  is superseded by `multiple_write_locations_enabled` ([#25510](https://github.com/hashicorp/terraform-provider-azurerm/issues/25510))\n* `azurerm_cosmosdb_account` - the `enable_automatic_failover` property is superseded by `automatic_failover_enabled` ([#25510](https://github.com/hashicorp/terraform-provider-azurerm/issues/25510))\n\n## 3.98.0 (April 04, 2024)\n\nFEATURES:\n\n* New Resource: `azurerm_static_web_app_function_app_registration` ([#25331](https://github.com/hashicorp/terraform-provider-azurerm/issues/25331))\n* New Resource: `azurerm_system_center_virtual_machine_manager_inventory_items` ([#25110](https://github.com/hashicorp/terraform-provider-azurerm/issues/25110))\n* New Resource: `azurerm_workloads_sap_discovery_virtual_instance` ([#24342](https://github.com/hashicorp/terraform-provider-azurerm/issues/24342))\n* New Resource: `azurerm_redis_cache_policy` ([#25477](https://github.com/hashicorp/terraform-provider-azurerm/issues/25477))\n* New Resource: `azurerm_redis_cache_policy_assignment` ([#25477](https://github.com/hashicorp/terraform-provider-azurerm/issues/25477))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240402.1085733` of `github.com/hashicorp/go-azure-sdk` ([#25482](https://github.com/hashicorp/terraform-provider-azurerm/issues/25482))\n* dependencies: updating to `v0.67.0` of `github.com/hashicorp/go-azure-helpers` ([#25446](https://github.com/hashicorp/terraform-provider-azurerm/issues/25446))\n* dependencies: updating to `v0.25.4` of `github.com/tombuildsstuff/giovanni` ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `alertsmanagement` - updating remaining resources to use `hashicorp/go-azure-sdk` ([#25486](https://github.com/hashicorp/terraform-provider-azurerm/issues/25486))\n* `applicationinsights` - updating remaining resources to use `hashicorp/go-azure-sdk` ([#25376](https://github.com/hashicorp/terraform-provider-azurerm/issues/25376))\n* `compute` - update to API version `2024-03-01` ([#25436](https://github.com/hashicorp/terraform-provider-azurerm/issues/25436))\n* `compute` - update shared image resources and data sources to use `hashicorp/go-azure-sdk` ([#25503](https://github.com/hashicorp/terraform-provider-azurerm/issues/25503))\n* `containerinstance` - update to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#25416](https://github.com/hashicorp/terraform-provider-azurerm/issues/25416))\n* `maintenance` -  updating to API Version `2023-04-01` ([#25388](https://github.com/hashicorp/terraform-provider-azurerm/issues/25388))\n* `recovery_services` - Add `recovery_service` block to the provider that supports `vm_backup_stop_protection_and_retain_data_on_destroy` and `purge_protected_items_from_vault_on_destroy`([#25515](https://github.com/hashicorp/terraform-provider-azurerm/issues/25515))\n* `storage` -  the Storage Account cache is now populated using `hashicorp/go-azure-sdk` ([#25437](https://github.com/hashicorp/terraform-provider-azurerm/issues/25437))\n* `azurerm_bot_service_azure_bot` - support for the `cmk_key_vault_key_url` property ([#23640](https://github.com/hashicorp/terraform-provider-azurerm/issues/23640))\n* `azurerm_capacity_reservation` - update validation for `capacity` ([#25471](https://github.com/hashicorp/terraform-provider-azurerm/issues/25471))\n* `azurerm_container_app` - add support for `key_vault_id` and `identity` properties in the `secret` block ([#24773](https://github.com/hashicorp/terraform-provider-azurerm/issues/24773))\n* `azurerm_databricks_workspace` - expose `managed_services_cmk_key_vault_id` and `managed_disk_cmk_key_vault_id and key_vault_id` to support cross subscription CMK's. ([#25091](https://github.com/hashicorp/terraform-provider-azurerm/issues/25091))\n* `azurerm_databricks_workspace_root_dbfs_customer_managed_key` - expose `key_vault_id` to support cross subscription CMK's. ([#25091](https://github.com/hashicorp/terraform-provider-azurerm/issues/25091))\n* `azurerm_managed_hsm_role_*_ids` - use specific resource id to replace generic nested item id ([#25323](https://github.com/hashicorp/terraform-provider-azurerm/issues/25323))\n* `azurerm_mssql_database` - add support for `secondary_type` ([#25360](https://github.com/hashicorp/terraform-provider-azurerm/issues/25360))\n* `azurerm_monitor_scheduled_query_rules_alert_v2` - support for the `identity` block ([#25365](https://github.com/hashicorp/terraform-provider-azurerm/issues/25365))\n* `azurerm_mssql_server_extended_auditing_policy` - support for `audit_actions_and_groups` and `predicate_expression` ([#25425](https://github.com/hashicorp/terraform-provider-azurerm/issues/25425))\n* `azurerm_netapp_account` - can now be imported ([#25384](https://github.com/hashicorp/terraform-provider-azurerm/issues/25384))\n* `azurerm_netapp_volume` - support for the `kerberos_enabled`, `smb_continuous_availability_enabled`, `kerberos_5_read_only_enabled`, `kerberos_5_read_write_enabled`, `kerberos_5i_read_only_enabled`, `kerberos_5i_read_write_enabled`, `kerberos_5p_read_only_enabled`, and `kerberos_5p_read_write_enabled` properties ([#25385](https://github.com/hashicorp/terraform-provider-azurerm/issues/25385))\n* `azurerm_recovery_services_vault` - upgrading to version `2024-01-01` ([#25325](https://github.com/hashicorp/terraform-provider-azurerm/issues/25325))\n* `azurerm_stack_hci_cluster` - the `client_id` property is now optional ([#25407](https://github.com/hashicorp/terraform-provider-azurerm/issues/25407))\n* `azurerm_storage_encryption_scope` - refactoring to use `hashicorp/go-azure-sdk` rather than `Azure/azure-sdk-for-go` ([#25437](https://github.com/hashicorp/terraform-provider-azurerm/issues/25437))\n* `azurerm_mssql_elasticpool` - the `maintenance_configuration_name` property now supports values `SQL_SouthAfricaNorth_DB_1`, `SQL_SouthAfricaNorth_DB_2`, `SQL_WestUS3_DB_1` and `SQL_WestUS3_DB_2` ([#25500](https://github.com/hashicorp/terraform-provider-azurerm/issues/25500))\n* `azurerm_lighthouse_assignment` - updating API Version from `2019-06-01` to `2022-10-01`  ([#25473](https://github.com/hashicorp/terraform-provider-azurerm/issues/25473))\n\nBUG FIXES:\n\n* `network` -  updating the `GatewaySubnet` validation to show the Subnet Name when the validation fails ([#25484](https://github.com/hashicorp/terraform-provider-azurerm/issues/25484))\n* `azurerm_function_app_hybrid_connection` - fix an issue during creation when `send_key_name` is specified ([#25379](https://github.com/hashicorp/terraform-provider-azurerm/issues/25379))\n* `azurerm_linux_web_app_slot` - fix a crash when upgrading the provider to v3.88.0 or later ([#25406](https://github.com/hashicorp/terraform-provider-azurerm/issues/25406))\n* `azurerm_mssql_database` - update the behavior of the `enclave_type` field. ([#25508](https://github.com/hashicorp/terraform-provider-azurerm/issues/25508))\n* `azurerm_mssql_elasticpool` - update the behavior of the `enclave_type` field. ([#25508](https://github.com/hashicorp/terraform-provider-azurerm/issues/25508))\n* `azurerm_network_manager_deployment` - add locking ([#25368](https://github.com/hashicorp/terraform-provider-azurerm/issues/25368))\n* `azurerm_resource_group_template_deployment` - changes to `parameters_content` and `template_content` now force `output_content` to be updated in the plan ([#25403](https://github.com/hashicorp/terraform-provider-azurerm/issues/25403))\n* `azurerm_storage_blob` - fix a potential crash when the endpoint is unreachable ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `azurerm_storage_container` - fix a potential crash when the endpoint is unreachable ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `azurerm_storage_data_lake_gen2_filesystem` - fix a potential crash when the endpoint is unreachable ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `azurerm_storage_data_lake_gen2_filesystem_path` - fix a potential crash when the endpoint is unreachable ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `azurerm_storage_queue` - fix a potential crash when the endpoint is unreachable ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `azurerm_storage_share` - fix a potential crash when the endpoint is unreachable ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `azurerm_storage_share_directory` - fix a potential crash when the endpoint is unreachable ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `azurerm_storage_share_directory` - resolve an issue where directories might fail to destroy ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `azurerm_storage_share_file` - fix a potential crash when the endpoint is unreachable ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `azurerm_storage_share_file` - fix several bugs with path handling when creating files in subdirectories ([#25404](https://github.com/hashicorp/terraform-provider-azurerm/issues/25404))\n* `azurerm_web_app_hybrid_connection` - fix an issue during creation when `send_key_name` is specified ([#25379](https://github.com/hashicorp/terraform-provider-azurerm/issues/25379))\n* `azurerm_windows_web_app` - prevent a panic during resource upgrade ([#25509](https://github.com/hashicorp/terraform-provider-azurerm/issues/25509))\n\n## 3.97.1 (March 22, 2024)\n\nENHANCEMENTS:\n\n* `azurerm_nginx_deployment` - support for the `configuration` block ([#24276](https://github.com/hashicorp/terraform-provider-azurerm/issues/24276))\n\nBUG FIXES:\n\n* `azurerm_data_factory_integration_runtime_self_hosted` - ensure that autorizationh keys are exported ([#25246](https://github.com/hashicorp/terraform-provider-azurerm/issues/25246))\n* `azurerm_storage_account` - defaulting the value for `dns_endpoint_type` to `Standard` when it's not returned from the Azure API ([#25367](https://github.com/hashicorp/terraform-provider-azurerm/issues/25367))\n\n\n## 3.97.0 (March 21, 2024)\n\nBREAKING CHANGES:\n\n* `azurerm_linux_function_app` - `app_settings[\"WEBSITE_RUN_FROM_PACKAGE\"]` must be added to `ignore_changes` for deployments where an external tool modifies the `WEBSITE_RUN_FROM_PACKAGE` property in the `app_settings` block. ([#24848](https://github.com/hashicorp/terraform-provider-azurerm/issues/24848))\n* `azurerm_linux_function_app_slot` - `app_settings[\"WEBSITE_RUN_FROM_PACKAGE\"]` must be added to `ignore_changes` for deployments where an external tool modifies the `WEBSITE_RUN_FROM_PACKAGE` property in the `app_settings` block. ([#24848](https://github.com/hashicorp/terraform-provider-azurerm/issues/24848))\n\nFEATURES:\n\n* New Resource: `azurerm_elastic_san_volume` ([#24802](https://github.com/hashicorp/terraform-provider-azurerm/issues/24802))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.25.3` of `github.com/tombuildsstuff/giovanni` ([#25362](https://github.com/hashicorp/terraform-provider-azurerm/issues/25362))\n* dependencies: updating to `v0.20240321.1145953` of `github.com/hashicorp/go-azure-sdk` ([#25332](https://github.com/hashicorp/terraform-provider-azurerm/issues/25332))\n* dependencies: updating to `v0.25.2` of `github.com/tombuildsstuff/giovanni` ([#25305](https://github.com/hashicorp/terraform-provider-azurerm/issues/25305))\n* `azurestackhci`: updating to API Version `2024-01-01` ([#25279](https://github.com/hashicorp/terraform-provider-azurerm/issues/25279))\n* `monitor/scheduledqueryrules`: updating to API version `2023-03-15-preview` ([#25350](https://github.com/hashicorp/terraform-provider-azurerm/issues/25350))\n* `cosmosdb`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#25166](https://github.com/hashicorp/terraform-provider-azurerm/issues/25166))\n* Data Source `azurerm_stack_hci_cluster`: refactoring the association to use `hashicorp/go-azure-sdk` ([#25293](https://github.com/hashicorp/terraform-provider-azurerm/issues/25293))\n* `azurerm_app_configuration` - support for Environments other than Azure Public ([#25271](https://github.com/hashicorp/terraform-provider-azurerm/issues/25271))\n* `azurerm_automanage_configuration` - refactoring to use `hashicorp/go-azure-sdk` ([#25293](https://github.com/hashicorp/terraform-provider-azurerm/issues/25293))\n* `azurerm_container_app_environment` - add support for `Consumption` workload profile ([#25285](https://github.com/hashicorp/terraform-provider-azurerm/issues/25285))\n* `azurerm_cosmosdb_postgresql_cluster` - expose list of server names and FQDN in the `servers` block ([#25240](https://github.com/hashicorp/terraform-provider-azurerm/issues/25240))\n* `azurerm_data_share` - hyphens are now allowed in the resource's name ([#25242](https://github.com/hashicorp/terraform-provider-azurerm/issues/25242))\n* `azurerm_data_factory_integration_runtime_azure_ssis` - support for the `copy_compute_scale` and `pipeline_external_compute_scale` blocks ([#25281](https://github.com/hashicorp/terraform-provider-azurerm/issues/25281))\n* `azurerm_healthcare_service` - support for the `identity` and `configuration_export_storage_account_name` properties ([#25193](https://github.com/hashicorp/terraform-provider-azurerm/issues/25193))\n* `azurerm_nginx_deployment` - support the `auto_scale_profile` block ([#24950](https://github.com/hashicorp/terraform-provider-azurerm/issues/24950))\n* `azurerm_netapp_account_resource` - support for the `kerberos_ad_name`, `kerberos_kdc_ip property`, `enable_aes_encryption`, `local_nfs_users_with_ldap_allowed`, `server_root_ca_certificate`, `ldap_over_tls_enabled`, and `ldap_signing_enabled` properties ([#25340](https://github.com/hashicorp/terraform-provider-azurerm/issues/25340))\n* `azurerm_netapp_account_resource` - support for [Support for Azure Netapp Files - AD Site Name #12462] via the `site_name` property ([#25340](https://github.com/hashicorp/terraform-provider-azurerm/issues/25340))\n* `azurerm_stack_hci_cluster`: refactoring the association to use `hashicorp/go-azure-sdk` ([#25293](https://github.com/hashicorp/terraform-provider-azurerm/issues/25293))\n* `azurerm_storage_account` - support for the `dns_endpoint_type` property ([#22583](https://github.com/hashicorp/terraform-provider-azurerm/issues/22583))\n* `azurerm_storage_blob_inventory_policy` -  refactoring to use `hashicorp/go-azure-sdk` ([#25268](https://github.com/hashicorp/terraform-provider-azurerm/issues/25268))\n* `azurerm_synapse_spark_pool` - added support for `3.4` ([#25319](https://github.com/hashicorp/terraform-provider-azurerm/issues/25319))\n\nBUG FIXES:\n\n* Data Source: `azurerm_storage_blob` - fix a bug that incorrectly parsed the endpoint in the resource ID ([#25283](https://github.com/hashicorp/terraform-provider-azurerm/issues/25283))\n* Data Source: `azurerm_storage_table_entity` - fixing a regression when parsing the table endpoint ([#25307](https://github.com/hashicorp/terraform-provider-azurerm/issues/25307))\n* `netapp_account_resource` - correct the `smb_server_name` property validation ([#25340](https://github.com/hashicorp/terraform-provider-azurerm/issues/25340))\n* `azurerm_backup_policy_file_share` - prevent a bug when the `include_last_days` property does not work when `days` is empty ([#25280](https://github.com/hashicorp/terraform-provider-azurerm/issues/25280))\n* `azurerm_backup_policy_vm` - prevent a bug when the `include_last_days` property does not work when `days` is empty ([#25280](https://github.com/hashicorp/terraform-provider-azurerm/issues/25280))\n* `azurerm_container_app_custom_domain` - prevent an issue where the secret was not being passed through (#25196) ([#25251](https://github.com/hashicorp/terraform-provider-azurerm/issues/25251))\n* `azurerm_data_protection_backup_instance_kubernetes_cluster` - prevent the protection error `ScenarioPluginInvalidWorkflowDataRequest` and `UserErrorKubernetesBackupExtensionUnhealthy` [azurerm_data_protection_backup_instance_kubernetes_cluster is created with message \"Fix protection error for the backup instance\" and code ScenarioPluginInvalidWorkflowDataRequest #25294] ([#25345](https://github.com/hashicorp/terraform-provider-azurerm/issues/25345))\n* `azurerm_purview_account` - now allows for PurView accounts with missing or disabled eventhubs without keys ([#25301](https://github.com/hashicorp/terraform-provider-azurerm/issues/25301))\n* `azurerm_storage_account` - fix a crash when the storage account becomes unavailable while reading ([#25332](https://github.com/hashicorp/terraform-provider-azurerm/issues/25332))\n* `azurerm_storage_blob` - fixing a regression where blobs within a nested directory wouldn't be parsed correctly ([#25305](https://github.com/hashicorp/terraform-provider-azurerm/issues/25305))\n* `azurerm_storage_data_lake_gen2_path` - fixing a bug where there was no timeout available during import ([#25282](https://github.com/hashicorp/terraform-provider-azurerm/issues/25282))\n* `azurerm_storage_queue` - fixing a bug where the Table URI was obtained rather than the Queue URI ([#25262](https://github.com/hashicorp/terraform-provider-azurerm/issues/25262))\n* `azurerm_subscription` - fixing an issue when creating a subscription alias ([#25181](https://github.com/hashicorp/terraform-provider-azurerm/issues/25181))\n\n## 3.96.0 (March 14, 2024)\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240314.1083835` of `github.com/hashicorp/go-azure-sdk` ([#25255](https://github.com/hashicorp/terraform-provider-azurerm/issues/25255))\n* dependencies: updating to `v0.25.1` of `github.com/tombuildsstuff/giovanni` ([#24798](https://github.com/hashicorp/terraform-provider-azurerm/issues/24798))\n* dependencies: updating to `v1.33.0` of `google.golang.org/protobuf` ([#25243](https://github.com/hashicorp/terraform-provider-azurerm/issues/25243))\n* `storage`: updating the data plane resources to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24798](https://github.com/hashicorp/terraform-provider-azurerm/issues/24798))\n* Data Source: `azurerm_storage_table_entities` - support for AAD authentication ([#24798](https://github.com/hashicorp/terraform-provider-azurerm/issues/24798))\n* Data Source: `azurerm_storage_table_entity` - support for AAD authentication ([#24798](https://github.com/hashicorp/terraform-provider-azurerm/issues/24798))\n* `azurerm_kusto_cluster` - support `None` pattern for the `virtual_network_configuration` block ([#24733](https://github.com/hashicorp/terraform-provider-azurerm/issues/24733))\n* `azurerm_linux_function_app` - support for the Node `20` runtime ([#24073](https://github.com/hashicorp/terraform-provider-azurerm/issues/24073))\n* `azurerm_linux_function_app_slot` - support for the Node `20` runtime ([#24073](https://github.com/hashicorp/terraform-provider-azurerm/issues/24073))\n* `azurerm_stack_hci_cluster` - support the `identity`, `cloud_id`, `service_endpoint` and `resource_provider_object_id` properties ([#25031](https://github.com/hashicorp/terraform-provider-azurerm/issues/25031))\n* `azurerm_storage_share_file` - support for AAD authentication ([#24798](https://github.com/hashicorp/terraform-provider-azurerm/issues/24798))\n* `azurerm_storage_share_directory` - support for AAD authentication, deprecate `share_name` and `storage_account_name` in favor of `storage_share_id` ([#24798](https://github.com/hashicorp/terraform-provider-azurerm/issues/24798))\n* `azurerm_storage_table_entity` - support for AAD authentication, deprecate `share_name` and `storage_account_name` in favor of `storage_table_id` ([#24798](https://github.com/hashicorp/terraform-provider-azurerm/issues/24798))\n* `azurerm_storage_table_entity` - support for AAD authentication ([#24798](https://github.com/hashicorp/terraform-provider-azurerm/issues/24798))\n* `azurerm_windows_function_app` - support for the Node `20` runtime ([#24073](https://github.com/hashicorp/terraform-provider-azurerm/issues/24073))\n* `azurerm_windows_function_app_slot` - support for the Node `20` runtime ([#24073](https://github.com/hashicorp/terraform-provider-azurerm/issues/24073))\n* `azurerm_windows_web_app` - support for the Node `20` runtime ([#24073](https://github.com/hashicorp/terraform-provider-azurerm/issues/24073))\n* `azurerm_windows_web_app_slot` - support for the Node `20` runtime ([#24073](https://github.com/hashicorp/terraform-provider-azurerm/issues/24073))\n\nBUG FIXES:\n\n* `azurerm_container_app_custom_domain` - fix resource ID parsing bug preventing import ([#25192](https://github.com/hashicorp/terraform-provider-azurerm/issues/25192))\n* `azurerm_windows_web_app` - fix incorrect warning message when checking name availability ([#25214](https://github.com/hashicorp/terraform-provider-azurerm/issues/25214))\n* `azurerm_virtual_machine_run_command` - prevent a bug during updates ([#25186](https://github.com/hashicorp/terraform-provider-azurerm/issues/25186))\n* Data Source: `azurerm_storage_table_entities`  - Fix `items.x.properties` truncating to one entry ([#25211](https://github.com/hashicorp/terraform-provider-azurerm/issues/25211))\n\n## 3.95.0 (March 08, 2024)\n\nFEATURES:\n\n* New Resource: `azurerm_container_app_custom_domain` ([#24421](https://github.com/hashicorp/terraform-provider-azurerm/issues/24421))\n* New Resource: `azurerm_data_protection_backup_instance_kubernetes_cluster` ([#24940](https://github.com/hashicorp/terraform-provider-azurerm/issues/24940))\n* New Resource: `azurerm_static_web_app` ([#25117](https://github.com/hashicorp/terraform-provider-azurerm/issues/25117))\n* New resource: `azurerm_static_web_app_custom_domain` ([#25117](https://github.com/hashicorp/terraform-provider-azurerm/issues/25117))\n* New resource: `azurerm_system_center_virtual_machine_manager_availability_set` ([#24975](https://github.com/hashicorp/terraform-provider-azurerm/issues/24975))\n* New Resource: `azurerm_workloads_sap_three_tier_virtual_instance` ([#24384](https://github.com/hashicorp/terraform-provider-azurerm/issues/24384))\n* New Resource: `azurerm_workloads_sap_single_node_virtual_instance` ([#24331](https://github.com/hashicorp/terraform-provider-azurerm/issues/24331))\n\nENHANCEMENTS:\n\n* `dependencies`: updating to v0.20240229.1102109 of `github.com/hashicorp/go-azure-sdk` ([#25102](https://github.com/hashicorp/terraform-provider-azurerm/issues/25102))\n* `monitor`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` [GH-#25102]\n* `network`: updating to API Version `2023-09-01` ([#25095](https://github.com/hashicorp/terraform-provider-azurerm/issues/25095))\n* `azurerm_data_factory_integration_runtime_managed` - support for the `credential_name` property ([#25033](https://github.com/hashicorp/terraform-provider-azurerm/issues/25033))\n* `azurerm_linux_function_app` - support for the `description` property in the `ip_restriction` block ([#24527](https://github.com/hashicorp/terraform-provider-azurerm/issues/24527))\n* `azurerm_linux_function_app` - support for the `ip_restriction_default_action` and `scm_ip_restriction_default_action` properties ([#25131](https://github.com/hashicorp/terraform-provider-azurerm/issues/25131))\n* `azurerm_linux_function_app_slot` - support for the `description` property in the `ip_restriction` block ([#24527](https://github.com/hashicorp/terraform-provider-azurerm/issues/24527))\n* `azurerm_linux_function_app_slot` - support for the `ip_restriction_default_action` and `scm_ip_restriction_default_action` properties ([#25131](https://github.com/hashicorp/terraform-provider-azurerm/issues/25131))\n* `azurerm_linux_web_app` - support for the `description` property in the `ip_restriction` block ([#24527](https://github.com/hashicorp/terraform-provider-azurerm/issues/24527))\n* `azurerm_linux_web_app` - support for the `ip_restriction_default_action` and `scm_ip_restriction_default_action` properties ([#25131](https://github.com/hashicorp/terraform-provider-azurerm/issues/25131))\n* `azurerm_linux_web_app_slot` - support for the `description` property in the `ip_restriction` block ([#24527](https://github.com/hashicorp/terraform-provider-azurerm/issues/24527))\n* `azurerm_linux_web_app_slot` - support for the `ip_restriction_default_action` and `scm_ip_restriction_default_action` properties ([#25131](https://github.com/hashicorp/terraform-provider-azurerm/issues/25131))\n* `azurerm_mysql_flexible_server` - setting the `storage.size_gb` property to a smaller value now forces a new resource to be created ([#25074](https://github.com/hashicorp/terraform-provider-azurerm/issues/25074))\n* `azurerm_orbital_contact_profile` - changing the `channels` property no longer creates a new resource ([#25129](https://github.com/hashicorp/terraform-provider-azurerm/issues/25129))\n* `azurerm_private_dns_resolver_inbound_endpoint` - the `private_ip_address` property is no longer required when `private_ip_allocation_method` is `Dynamic` ([#25035](https://github.com/hashicorp/terraform-provider-azurerm/issues/25035))\n* `stream_analytics_output_blob` - support for the `blob_write_mode` property ([#25127](https://github.com/hashicorp/terraform-provider-azurerm/issues/25127))\n* `azurerm_windows_function_app` - support for the `description` property in the `ip_restriction` block ([#24527](https://github.com/hashicorp/terraform-provider-azurerm/issues/24527))\n* `azurerm_windows_function_app` - support for the `ip_restriction_default_action` and `scm_ip_restriction_default_action` properties ([#25131](https://github.com/hashicorp/terraform-provider-azurerm/issues/25131))\n* `azurerm_windows_function_app_slot` - support for the `description` property in the `ip_restriction` block ([#24527](https://github.com/hashicorp/terraform-provider-azurerm/issues/24527))\n* `azurerm_windows_function_app_slot` - support for the `ip_restriction_default_action` and `scm_ip_restriction_default_action` properties ([#25131](https://github.com/hashicorp/terraform-provider-azurerm/issues/25131))\n* `azurerm_windows_web_app` - support for the `description` property in the `ip_restriction` block ([#24527](https://github.com/hashicorp/terraform-provider-azurerm/issues/24527))\n* `azurerm_windows_web_app` - support for the `ip_restriction_default_action` and `scm_ip_restriction_default_action` properties ([#25131](https://github.com/hashicorp/terraform-provider-azurerm/issues/25131))\n* `azurerm_windows_web_app_slot` - support for the `description` property in the `ip_restriction` block ([#24527](https://github.com/hashicorp/terraform-provider-azurerm/issues/24527))\n* `azurerm_windows_web_app_slot` - support for the `ip_restriction_default_action` and `scm_ip_restriction_default_action` properties ([#25131](https://github.com/hashicorp/terraform-provider-azurerm/issues/25131))\n\nBUG FIXES:\n\n* Data Source: `azurerm_function_app_host_keys` - correctly set `event_grid_extension_key` by searching for the renamed property in the API response ([#25108](https://github.com/hashicorp/terraform-provider-azurerm/issues/25108))\n* `azurerm_app_service_public_certificate` - fix issue where certificate information was not being set correctly in the read ([#24943](https://github.com/hashicorp/terraform-provider-azurerm/issues/24943))\n* `azurerm_container_registry` - prevent recreation of the resource when the `georeplication.tags` are updated ([#24994](https://github.com/hashicorp/terraform-provider-azurerm/issues/24994))\n* `azurerm_firewall_policy_rule_collection_group` - fix issue where the client subscription ID was used to construct the `firewall_policy_id` ([#25145](https://github.com/hashicorp/terraform-provider-azurerm/issues/25145))\n* `azurerm_function_app_hybrid_connection` - fix issue where `SendKeyValue` was not populated in the API payload ([#23761](https://github.com/hashicorp/terraform-provider-azurerm/issues/23761))\n* `azurerm_orbital_contact_profile` - fix creation of the resource when `event_hub_uri` is not specified ([#25128](https://github.com/hashicorp/terraform-provider-azurerm/issues/25128))\n* `azurerm_recovery_services_vault` - prevent a panic when `immutability` is updated ([#25132](https://github.com/hashicorp/terraform-provider-azurerm/issues/25132))\n* `azurerm_storage_account` - fix issue where the queue encryption key type was set as the table encryption key type ([#25046](https://github.com/hashicorp/terraform-provider-azurerm/issues/25046))\n* `azurerm_web_app_hybrid_connection` - fix issue where `SendKeyValue` was not populated in the API payload ([#23761](https://github.com/hashicorp/terraform-provider-azurerm/issues/23761))\n* `azurerm_mssql_database` - fix incorrect error due to typo when using `restore_long_term_retention_backup_id` ([#25180](https://github.com/hashicorp/terraform-provider-azurerm/issues/25180))\n\nDEPRECATIONS:\n\n* Deprecated Resource: `azurerm_static_site` ([#25117](https://github.com/hashicorp/terraform-provider-azurerm/issues/25117))\n* Deprecated Resource: `azurerm_static_site_custom_domain` ([#25117](https://github.com/hashicorp/terraform-provider-azurerm/issues/25117))\n* `azurerm_kubernetes_fleet_manager` - the `hub_profile` property is deprecated ([#25010](https://github.com/hashicorp/terraform-provider-azurerm/issues/25010))\n\n## 3.94.0 (February 29, 2024)\n\nFEATURES:\n\n* **New Resource**: `azurerm_kubernetes_fleet_update_run` ([#24813](https://github.com/hashicorp/terraform-provider-azurerm/issues/24813))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240228.1142829` of `github.com/hashicorp/go-azure-sdk` ([#25081](https://github.com/hashicorp/terraform-provider-azurerm/issues/25081))\n* `servicefabric`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#25002](https://github.com/hashicorp/terraform-provider-azurerm/issues/25002))\n* `springcloud`: updating to API Version `2024-01-01-preview` ([#24937](https://github.com/hashicorp/terraform-provider-azurerm/issues/24937))\n* `securitycenter`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#25081](https://github.com/hashicorp/terraform-provider-azurerm/issues/25081))\n* Data Source: `azurerm_storage_table_entities` - support for `select` ([#24987](https://github.com/hashicorp/terraform-provider-azurerm/issues/24987))\n* Data Source: `azurerm_netapp_volume` - support for the `smb_access_based_enumeration` and `smb_non_browsable` properties ([#24514](https://github.com/hashicorp/terraform-provider-azurerm/issues/24514))\n* `azurerm_cosmosdb_account` - add support for the `minimal_tls_version` property ([#24966](https://github.com/hashicorp/terraform-provider-azurerm/issues/24966))\n* `azurerm_federated_identity_credential` - the federated credentials can now be changed without creating a new resource ([#25003](https://github.com/hashicorp/terraform-provider-azurerm/issues/25003))\n* `azurerm_kubernetes_cluster` - support for the `current_kubernetes_version` property ([#25079](https://github.com/hashicorp/terraform-provider-azurerm/issues/25079))\n* `azurerm_kubernetes_cluster` - private DNS is now allowed for the `web_app_routing` property ([#25038](https://github.com/hashicorp/terraform-provider-azurerm/issues/25038))\n* `azurerm_kubernetes_cluster` - migration between different `outbound_type`s is now allowed ([#25021](https://github.com/hashicorp/terraform-provider-azurerm/issues/25021))\n* `azurerm_mssql_database` - support for the `recovery_point_id` and `restore_long_term_retention_backup_id` properties ([#24904](https://github.com/hashicorp/terraform-provider-azurerm/issues/24904))\n* `azurerm_linux_virtual_machine` - support for the `automatic_upgrade_enabled`, `disk_controller_type`, `os_image_notification`, `treat_failure_as_deployment_failure_enabled`, and `vm_agent_platform_updates_enabled`properties ([#23394](https://github.com/hashicorp/terraform-provider-azurerm/issues/23394))\n* `azurerm_nginx_deployment` - support for the `automatic_upgrade_channel` property ([#24867](https://github.com/hashicorp/terraform-provider-azurerm/issues/24867))\n* `azurerm_netapp_volume` - support for the `smb_access_based_enumeration` and `smb_non_browsable` properties ([#24514](https://github.com/hashicorp/terraform-provider-azurerm/issues/24514))\n* `azurerm_netapp_pool` - support for the `encryption_type` property ([#24993](https://github.com/hashicorp/terraform-provider-azurerm/issues/24993))\n* `azurerm_role_definition` - upgrade to the API version `2022-05-01-preview` ([#25008](https://github.com/hashicorp/terraform-provider-azurerm/issues/25008))\n* `azurerm_redis_cache` - allow AAD auth for all SKUs ([#25006](https://github.com/hashicorp/terraform-provider-azurerm/issues/25006))\n* `azurerm_sql_managed_instance` - support for the `zone_redundant_enabled` property ([#25089](https://github.com/hashicorp/terraform-provider-azurerm/issues/25089))\n* `azurerm_spring_cloud_gateway` - support for the `application_performance_monitoring_ids` property ([#24919](https://github.com/hashicorp/terraform-provider-azurerm/issues/24919))\n* `azurerm_spring_cloud_configuration_service` - support for the `refresh_interval_in_seconds` property ([#25009](https://github.com/hashicorp/terraform-provider-azurerm/issues/25009))\n* `azurerm_synapse_workspace` - support for using the `user_assigned_identity_id` property within the `customer_managed_key` block ([#25027](https://github.com/hashicorp/terraform-provider-azurerm/issues/25027))\n* `azurerm_windows_virtual_machine` - support for the `automatic_upgrade_enabled`, `disk_controller_type`, `os_image_notification`, `treat_failure_as_deployment_failure_enabled`, and `vm_agent_platform_updates_enabled`properties ([#23394](https://github.com/hashicorp/terraform-provider-azurerm/issues/23394))\n\nBUG FIXES:\n\n* `azurerm_api_management_notification_recipient_email` - fixing an issue where response pages weren't iterated over correctly ([#25055](https://github.com/hashicorp/terraform-provider-azurerm/issues/25055))\n* `azurerm_api_management_notification_recipient_user` - fixing an issue where response pages weren't iterated over correctly ([#25055](https://github.com/hashicorp/terraform-provider-azurerm/issues/25055))\n* `azurerm_batch_pool` - fix setting the `extension.settings_json` property ([#24976](https://github.com/hashicorp/terraform-provider-azurerm/issues/24976))\n* `azurerm_key_vault_key` - `expiration_date` can be updated if newer date is ahead ([#25000](https://github.com/hashicorp/terraform-provider-azurerm/issues/25000))\n* `azurerm_pim_active_role_assignment` - fix an issue where the resource would disappear or fail to import after 45 days ([#24524](https://github.com/hashicorp/terraform-provider-azurerm/issues/24524))\n* `azurerm_pim_eligible_role_assignment` - fix an issue where the resource would disappear or fail to import after 45 days ([#24524](https://github.com/hashicorp/terraform-provider-azurerm/issues/24524))\n* `azurerm_recovery_services_vault` - validate that `use_system_assigned_identity` and `user_assigned_identity_id` cannot be set at the same time ([#24091](https://github.com/hashicorp/terraform-provider-azurerm/issues/24091))\n* `azurerm_recovery_vaults` now creates properly with `SystemAssigned,UserAssigned` identity ([#24978](https://github.com/hashicorp/terraform-provider-azurerm/issues/24978))\n* `azurerm_subscription` - fixing an issue where response pages weren't iterated over correctly ([#25055](https://github.com/hashicorp/terraform-provider-azurerm/issues/25055))\n\n## 3.93.0 (February 22, 2024)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_express_route_circuit_peering` ([#24971](https://github.com/hashicorp/terraform-provider-azurerm/issues/24971))\n* **New Data Source**: `azurerm_storage_table_entities` ([#24973](https://github.com/hashicorp/terraform-provider-azurerm/issues/24973))\n* **New Resource**: `azurerm_dev_center_catalog` ([#24833](https://github.com/hashicorp/terraform-provider-azurerm/issues/24833))\n* **New Resource**: `azurerm_system_center_virtual_machine_manager_server` ([#24278](https://github.com/hashicorp/terraform-provider-azurerm/issues/24278))\n\nBUG FIXES:\n\n* `azurerm_key_vault` - conditionally polling the Data Plane endpoint when `public_network_access_enabled` is set to false ([#23823](https://github.com/hashicorp/terraform-provider-azurerm/issues/23823))\n* `azurerm_storage_account` - allow the `identity.type` property to be `SystemAssigned, UserAssigned`  when using a Customer Managed Key ([#24923](https://github.com/hashicorp/terraform-provider-azurerm/issues/24923))\n* `azurerm_automation_account` - prevent the `identity.identity_ids` User Assigned identity being set when not specified in config ([#24977](https://github.com/hashicorp/terraform-provider-azurerm/issues/24977))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240221.1170458` of `hashicorp/go-azure-sdk` ([#24967](https://github.com/hashicorp/terraform-provider-azurerm/issues/24967))\n* dependencies: refactor `azurerm_spring_cloud_configuration_service` to use `go-azure-sdk` ([#24918](https://github.com/hashicorp/terraform-provider-azurerm/issues/24918))\n* provider: support or the feature flag `virtual_machine_scale_set.reimage_on_manual_upgrade` ([#22975](https://github.com/hashicorp/terraform-provider-azurerm/issues/22975))\n* `sentinel`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24962](https://github.com/hashicorp/terraform-provider-azurerm/issues/24962))\n* `sqlvirtualmachines`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24912](https://github.com/hashicorp/terraform-provider-azurerm/issues/24912))\n* `nginx` : updating to use `2024-01-01-preview` ([#24868](https://github.com/hashicorp/terraform-provider-azurerm/issues/24868))\n* `azurerm_cosmosdb_account` - support for the `backup.tier` property ([#24595](https://github.com/hashicorp/terraform-provider-azurerm/issues/24595))\n* `azurerm_linux_virtual_machine` - the `virtual_machine_scale_set_id` property can now be changed without creating a new resource ([#24768](https://github.com/hashicorp/terraform-provider-azurerm/issues/24768))\n* `azurerm_machine_learning_workspace` - support for the `managed_network.isolation_mode` property ([#24951](https://github.com/hashicorp/terraform-provider-azurerm/issues/24951))\n* `azurerm_private_dns_resolver_inbound_endpoint` - support the `static` value for the `private_ip_allocation_method` property ([#24952](https://github.com/hashicorp/terraform-provider-azurerm/issues/24952))\n* `azurerm_postgresql_flexible_server` - expose the `storage_tier` field ([#24892](https://github.com/hashicorp/terraform-provider-azurerm/issues/24892))\n* `azurerm_redis_cache` - support for the `preferred_data_persistence_auth_method` property ([#24370](https://github.com/hashicorp/terraform-provider-azurerm/issues/24370))\n* `azurerm_servicebus_namespace` - support for the `premium_messaging_partitions` property ([#24676](https://github.com/hashicorp/terraform-provider-azurerm/issues/24676))\n* `azurerm_windows_virtual_machine` - the `virtual_machine_scale_set_id` property can now be changed without creating a new resource ([#24768](https://github.com/hashicorp/terraform-provider-azurerm/issues/24768))\n\nBUG FIXES:\n\n* `azurerm_cognitive_deployment` - the `version_upgrade_option` property can not be updated without creating a new resource ([#24922](https://github.com/hashicorp/terraform-provider-azurerm/issues/24922))\n* `azurerm_data_protection_backup_vault` - support or the `soft_delete` and `retention_duration_in_days` properties ([#24775](https://github.com/hashicorp/terraform-provider-azurerm/issues/24775))\n* `azurerm_data_factory_pipeline` - correctly handle incorrect header values ([#24921](https://github.com/hashicorp/terraform-provider-azurerm/issues/24921))\n* `azurerm_kusto_cluster` - `optimized_auto_scale` is now updated after `sku` is updated ([#24906](https://github.com/hashicorp/terraform-provider-azurerm/issues/24906))\n* `azurerm_key_vault_certificate` - now only updates the `lifetime_action` of the certificate block unless otherwise required ([#24755](https://github.com/hashicorp/terraform-provider-azurerm/issues/24755))\n* `azurerm_linux_virtual_machine_scale_set` - correctly include `public_ip_prefix_id` during updates ([#24939](https://github.com/hashicorp/terraform-provider-azurerm/issues/24939))\n* `azurerm_postgresql_flexible_server` - the `customer_managed_key.key_vault_key_id` property is now required ([#24981](https://github.com/hashicorp/terraform-provider-azurerm/issues/24981))\n* `azurerm_nginx_deployment` - changing the `sku` property now creates a new resource ([#24905](https://github.com/hashicorp/terraform-provider-azurerm/issues/24905))\n* `azurerm_orchestrated_virtual_machine_scale_set` - the `disk_size_gb` and `lun` parameters of `data_disks` are optional now ([#24944](https://github.com/hashicorp/terraform-provider-azurerm/issues/24944))\n* `azurerm_storage_account` - change order of API calls to be GET-then-PUT rather then PATCHES ([#23935](https://github.com/hashicorp/terraform-provider-azurerm/issues/23935))\n* `azurerm_storage_account` - improve the validation around the `immutability_policy` being used with `blob_properties` ([#24938](https://github.com/hashicorp/terraform-provider-azurerm/issues/24938))\n* `azurerm_security_center_setting` - prevent a bug when name is `SENTINEL` ([#24497](https://github.com/hashicorp/terraform-provider-azurerm/issues/24497))\n* `azurerm_windows_virtual_machine_scale_set` - correctly include `public_ip_prefix_id` during updates ([#24939](https://github.com/hashicorp/terraform-provider-azurerm/issues/24939))\n\n\n\n## 3.92.0 (February 15, 2024)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_virtual_desktop_application_group` ([#24771](https://github.com/hashicorp/terraform-provider-azurerm/issues/24771))\n\nENHANCEMENTS:\n\n* provider: support for the feature flag `postgresql_flexible_server.restart_server_on_configuration_value_change property` ([#23811](https://github.com/hashicorp/terraform-provider-azurerm/issues/23811))\n* dependencies: updating to v0.20240214.1142753 of `github.com/hashicorp/go-azure-sdk` ([#24889](https://github.com/hashicorp/terraform-provider-azurerm/issues/24889))\n* `automation`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24858](https://github.com/hashicorp/terraform-provider-azurerm/issues/24858))\n* `maintenance`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24819](https://github.com/hashicorp/terraform-provider-azurerm/issues/24819))\n* `containerapps`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24862](https://github.com/hashicorp/terraform-provider-azurerm/issues/24862))\n* `containerservices`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24872](https://github.com/hashicorp/terraform-provider-azurerm/issues/24872))\n* `timeseriesinsights`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24889](https://github.com/hashicorp/terraform-provider-azurerm/issues/24889))\n* `azurerm_container_app_environment`: support for the `infrastructure_resource_group_name` property ([#24361](https://github.com/hashicorp/terraform-provider-azurerm/issues/24361))\n* `azurerm_cost_anomaly_alert` - support for the `subscription_id` property ([#24258](https://github.com/hashicorp/terraform-provider-azurerm/issues/24258))\n* `azurerm_cosmosdb_account` - add default values for the `consistency_policy` code block ([#24830](https://github.com/hashicorp/terraform-provider-azurerm/issues/24830))\n* `azurerm_dashboard_grafana` - support for the `smtp` block ([#24717](https://github.com/hashicorp/terraform-provider-azurerm/issues/24717))\n* `azurerm_key_vault_certificates` - support for the `tags` property ([#24857](https://github.com/hashicorp/terraform-provider-azurerm/issues/24857))\n* `azurerm_key_vault_secrets` - support for the `tags` property ([#24857](https://github.com/hashicorp/terraform-provider-azurerm/issues/24857))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support for the `additional_unattend_content` block ([#24292](https://github.com/hashicorp/terraform-provider-azurerm/issues/24292))\n* `azurerm_virtual_desktop_host_pool` - support for the `vm_template` property ([#24369](https://github.com/hashicorp/terraform-provider-azurerm/issues/24369))\n\nBUG FIXES:\n\n* `azurerm_container_app_environment`: avoid unwanted changes when updating and using `log_analytics_workspace_id` ([#24303](https://github.com/hashicorp/terraform-provider-azurerm/issues/24303))\n* `azurerm_cosmosdb_account` - fixed regression in the `backup` code block ([#24830](https://github.com/hashicorp/terraform-provider-azurerm/issues/24830))\n* `azurerm_data_factory` - allow the `git_url` property to be blank/empty ([#24879](https://github.com/hashicorp/terraform-provider-azurerm/issues/24879))\n* `azurerm_linux_web_app_slot` - the `worker_count` property now works correctly in the `site_config` block ([#24515](https://github.com/hashicorp/terraform-provider-azurerm/issues/24515))\n* `azurerm_linux_web_app` - support `off` for the `file_system_level` property ([#24877](https://github.com/hashicorp/terraform-provider-azurerm/issues/24877))\n* `azurerm_linux_web_app_slot` - support `off` for the `file_system_level` property ([#24877](https://github.com/hashicorp/terraform-provider-azurerm/issues/24877))\n* `azurerm_private_endpoint` - fixing an issue where updating the Private Endpoint would remove any Application Security Group Association ([#24846](https://github.com/hashicorp/terraform-provider-azurerm/issues/24846))\n* `azurerm_search_service` - fixed the update function to adjust for changed API behaviour ([#24837](https://github.com/hashicorp/terraform-provider-azurerm/issues/24837))\n* `azurerm_search_service` - fixed the update function to adjust for changed API behaviour ([#24903](https://github.com/hashicorp/terraform-provider-azurerm/issues/24903))\n* `azurerm_windows_web_app` - support `off` for the `file_system_level` property ([#24877](https://github.com/hashicorp/terraform-provider-azurerm/issues/24877))\n* `azurerm_windows_web_app_slot` - support `off` for the `file_system_level` property ([#24877](https://github.com/hashicorp/terraform-provider-azurerm/issues/24877))\n\n## 3.91.0 (February 08, 2024)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_databricks_access_connector` ([#24769](https://github.com/hashicorp/terraform-provider-azurerm/issues/24769))\n* **New Resource**: `azurerm_data_protection_backup_policy_kubernetes_cluster` ([#24718](https://github.com/hashicorp/terraform-provider-azurerm/issues/24718))\n* **New Resource**: `azurerm_chaos_studio_experiment` ([#24779](https://github.com/hashicorp/terraform-provider-azurerm/issues/24779))\n* **New Resource**: `azurerm_chaos_studio_capability` ([#24779](https://github.com/hashicorp/terraform-provider-azurerm/issues/24779))\n* **New Resource**: `azurerm_dev_center_gallery` ([#23760](https://github.com/hashicorp/terraform-provider-azurerm/issues/23760))\n* **New Resource:** `azurerm_kubernetes_fleet_member` ([#24792](https://github.com/hashicorp/terraform-provider-azurerm/issues/24792))\n* **New Resource:** `azurerm_iotcentral_organization` ([#23132](https://github.com/hashicorp/terraform-provider-azurerm/issues/23132))\n* **New Resource:** `azurerm_spring_cloud_app_dynamics_application_performance_monitoring` ([#24750](https://github.com/hashicorp/terraform-provider-azurerm/issues/24750))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240208.1095436` of `github.com/hashicorp/go-azure-sdk/resource-manager` ([#24819](https://github.com/hashicorp/terraform-provider-azurerm/issues/24819))\n* dependencies: updating to `v0.20240208.1095436` of `github.com/hashicorp/go-azure-sdk/sdk` ([#24819](https://github.com/hashicorp/terraform-provider-azurerm/issues/24819))\n* dependencies: refactor `azurerm_app_service_environment_v3` to use `go-azure-sdk` ([#24760](https://github.com/hashicorp/terraform-provider-azurerm/issues/24760))\n* dependencies: refactor `azurerm_role_definition` to use `go-azure-sdk` ([#24266](https://github.com/hashicorp/terraform-provider-azurerm/issues/24266))\n* `managedhsm`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24761](https://github.com/hashicorp/terraform-provider-azurerm/issues/24761))\n* `hdinsight`: updating to API Version `2023-07-01` ([#24761](https://github.com/hashicorp/terraform-provider-azurerm/issues/24761))\n* `streamanalytics`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24819](https://github.com/hashicorp/terraform-provider-azurerm/issues/24819))\n* `azurerm_app_service_environment_v3` - support for the `remote_debugging_enabled` property ([#24760](https://github.com/hashicorp/terraform-provider-azurerm/issues/24760))\n* `azurerm_storage_account` - support for the `local_user_enabled` property ([#24800](https://github.com/hashicorp/terraform-provider-azurerm/issues/24800))\n* `azurerm_log_analytics_workspace_table` - support for the `total_retention_in_days` property ([#24513](https://github.com/hashicorp/terraform-provider-azurerm/issues/24513))\n* `azurerm_maching_learning_workspace` - support for the `feature_store` and `kind` properties ([#24716](https://github.com/hashicorp/terraform-provider-azurerm/issues/24716))\n* `azurerm_traffic_manager_azure_endpoint` - support for the `always_serve_enabled` property ([#24573](https://github.com/hashicorp/terraform-provider-azurerm/issues/24573))\n* `azurerm_traffic_manager_external_endpoint` - support for the `always_serve_enabled` property ([#24573](https://github.com/hashicorp/terraform-provider-azurerm/issues/24573))\n\nBUG FIXES:\n\n* `azurerm_api_management` -  the `virtual_network_configuration` property now updates correctly outside of `virtual_network_type` ([#24569](https://github.com/hashicorp/terraform-provider-azurerm/issues/24569))\n\n## 3.90.0 (February 01, 2024)\n\nUPGRADE NOTES:\n\n* provider - The provider now automatically registers the `AppConfiguration`, `DataFactory`, and `SignalRService` Resource Providers. When running Terraform with limited permissions, note that you must disable automatic Resource Provider Registration and ensure that any Resource Providers Terraform requires are registered. ([#24645](https://github.com/hashicorp/terraform-provider-azurerm/issues/24645))\n  \nFEATURES:\n\n* **New Data Source**: `azurerm_nginx_configuration` ([#24642](https://github.com/hashicorp/terraform-provider-azurerm/issues/24642))\n* **New Data Source**: `azurerm_virtual_desktop_workspace` ([#24732](https://github.com/hashicorp/terraform-provider-azurerm/issues/24732))\n* **New Resource**: `azurerm_kubernetes_fleet_update_strategy` ([#24328](https://github.com/hashicorp/terraform-provider-azurerm/issues/24328))\n* **New Resource**: `azurerm_site_recovery_vmware_replicated_vm` ([#22477](https://github.com/hashicorp/terraform-provider-azurerm/issues/22477))\n* **New Resource**: `azurerm_spring_cloud_new_relic_application_performance_monitoring` ([#24699](https://github.com/hashicorp/terraform-provider-azurerm/issues/24699))\n\nENHANCEMENTS:\n\n* provider: registering the Resource Provider `Microsoft.AppConfiguration` ([#24645](https://github.com/hashicorp/terraform-provider-azurerm/issues/24645))\n* provider: registering the Resource Provider `Microsoft.DataFactory` ([#24645](https://github.com/hashicorp/terraform-provider-azurerm/issues/24645))\n* provider: registering the Resource Provider `Microsoft.SignalRService` ([#24645](https://github.com/hashicorp/terraform-provider-azurerm/issues/24645))\n* provider: the Provider is now built using Go 1.21.6 ([#24653](https://github.com/hashicorp/terraform-provider-azurerm/issues/24653))\n* dependencies: the dependency `github.com/hashicorp/go-azure-sdk` is split into multiple Go Modules - and as such will be referred to by those paths going forwards ([#24636](https://github.com/hashicorp/terraform-provider-azurerm/issues/24636))\n* dependencies: updating to ``v0.20240201.1064937` of `github.com/hashicorp/go-azure-sdk/resource-manager` ([#24738](https://github.com/hashicorp/terraform-provider-azurerm/issues/24738))\n* dependencies: updating to `v0.20240201.1064937` of `github.com/hashicorp/go-azure-sdk/sdk` ([#24738](https://github.com/hashicorp/terraform-provider-azurerm/issues/24738))\n* `appservice`:  update to `go-azure-sdk` and API version `2023-01-01` ([#24688](https://github.com/hashicorp/terraform-provider-azurerm/issues/24688))\n* `datafactory`: updating to use `tombuildsstuff/kermit` ([#24675](https://github.com/hashicorp/terraform-provider-azurerm/issues/24675))\n* `hdinsight`: refactoring to use `github.com/hashicorp/go-azure-sdk/resource-manager` ([#24011](https://github.com/hashicorp/terraform-provider-azurerm/issues/24011))\n* `hdinsight`: updating to API Version `2021-06-01` ([#24011](https://github.com/hashicorp/terraform-provider-azurerm/issues/24011))\n* `loadbalancer`: updating to use `hashicorp/go-azure-sdk` ([#24291](https://github.com/hashicorp/terraform-provider-azurerm/issues/24291))\n* `nginx`: updating to API Version `2023-09-01` ([#24640](https://github.com/hashicorp/terraform-provider-azurerm/issues/24640))\n* `servicefabricmanagedcluster`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24654](https://github.com/hashicorp/terraform-provider-azurerm/issues/24654))\n* `springcloud`: updating to use API Version `2023-11-01-preview` ([#24690](https://github.com/hashicorp/terraform-provider-azurerm/issues/24690))\n* `subscriptions`: refactoring to use `hashicorp/go-azure-sdk` ([#24663](https://github.com/hashicorp/terraform-provider-azurerm/issues/24663))\n* Data Source: `azurerm_stream_analytics_job` - support for User Assigned Identities ([#24738](https://github.com/hashicorp/terraform-provider-azurerm/issues/24738))\n* `azurerm_cosmosdb_account` - support for the `gremlin_database` and `tables_to_restore` properties ([#24627](https://github.com/hashicorp/terraform-provider-azurerm/issues/24627))\n* `azurerm_bot_channel_email` - support for the `magic_code` property ([#23129](https://github.com/hashicorp/terraform-provider-azurerm/issues/23129))\n* `azurerm_cosmosdb_account` - support for the `partition_merge_enabled` property ([#24615](https://github.com/hashicorp/terraform-provider-azurerm/issues/24615))\n* `azurerm_mssql_managed_database` - support for the `immutable_backups_enabled` property ([#24745](https://github.com/hashicorp/terraform-provider-azurerm/issues/24745))\n* `azurerm_mssql_database` - support for the `immutable_backups_enabled` property ([#24745](https://github.com/hashicorp/terraform-provider-azurerm/issues/24745))\n* `azurerm_palo_alto_next_generation_firewall_virtual_hub_panorama` - support for the `trusted_address_ranges` property ([#24459](https://github.com/hashicorp/terraform-provider-azurerm/issues/24459))\n* `azurerm_palo_alto_next_generation_firewall_virtual_network_local_rulestack` - support for the `trusted_address_ranges` property ([#24459](https://github.com/hashicorp/terraform-provider-azurerm/issues/24459))\n* `azurerm_palo_alto_next_generation_firewall_virtual_network_panorama` - support for the `trusted_address_ranges` property ([#24459](https://github.com/hashicorp/terraform-provider-azurerm/issues/24459))\n* `azurerm_servicebus_namespace` - updating to use API Version `2022-10-01-preview` ([#24650](https://github.com/hashicorp/terraform-provider-azurerm/issues/24650))\n* `azurerm_spring_cloud_api_portal` - support for the `api_try_out_enabled` property ([#24696](https://github.com/hashicorp/terraform-provider-azurerm/issues/24696))\n* `azurerm_spring_cloud_gateway` - support for the `local_response_cache_per_route` and `local_response_cache_per_instance` properties ([#24697](https://github.com/hashicorp/terraform-provider-azurerm/issues/24697))\n* `azurerm_stream_analytics_job` - support for User Assigned Identities ([#24738](https://github.com/hashicorp/terraform-provider-azurerm/issues/24738))\n* `azurerm_subscription` - refactoring to use `hashicorp/go-azure-sdk` to set tags on the subscription ([#24734](https://github.com/hashicorp/terraform-provider-azurerm/issues/24734))\n* `azurerm_virtual_desktop_workspace` - correctly validate the `name` property ([#24668](https://github.com/hashicorp/terraform-provider-azurerm/issues/24668))\n\n\nBUG FIXES:\n\n* provider: skip registration for resource providers that are unavailable ([#24571](https://github.com/hashicorp/terraform-provider-azurerm/issues/24571))\n* `azurerm_app_configuration` - no longer require `lifecycle_ignore_changes` for the `value` property when using a key vault reference ([#24702](https://github.com/hashicorp/terraform-provider-azurerm/issues/24702))\n* `azurerm_app_service_managed_certificate` - fix casing issue in `app_service_plan_id` by parsing insensitively ([#24664](https://github.com/hashicorp/terraform-provider-azurerm/issues/24664))\n* `azurerm_cognitive_deployment` - updates now include the `version` property ([#24700](https://github.com/hashicorp/terraform-provider-azurerm/issues/24700))\n* `azurerm_dns_cname_record` - prevent casing issue in `target_resource_id` by parsing the ID insensitively ([#24181](https://github.com/hashicorp/terraform-provider-azurerm/issues/24181))\n* `azurerm_mssql_managed_instance_failover_group` - prevent an issue when trying to create a failover group with a managed instance from a different subscription ([#24646](https://github.com/hashicorp/terraform-provider-azurerm/issues/24646))\n* `azurerm_storage_account` - conditionally update properties only when needed ([#24669](https://github.com/hashicorp/terraform-provider-azurerm/issues/24669))\n* `azurerm_storage_account` - change update order for `access_tier`to prevent errors when uploading blobs to the archive tier ([#22250](https://github.com/hashicorp/terraform-provider-azurerm/issues/22250))\n\n## 3.89.0 (January 25, 2024)\n\nFEATURES:\n\n* New Data Source: `azurerm_data_factory_trigger_schedule` ([#24572](https://github.com/hashicorp/terraform-provider-azurerm/issues/24572))\n* New Data Source: `azurerm_data_factory_trigger_schedules` ([#24572](https://github.com/hashicorp/terraform-provider-azurerm/issues/24572))\n* New Data Source: `azurerm_ip_groups` ([#24540](https://github.com/hashicorp/terraform-provider-azurerm/issues/24540))\n* New Data Source: `azurerm_nginx_certificate` ([#24577](https://github.com/hashicorp/terraform-provider-azurerm/issues/24577))\n* New Resource: `azurerm_chaos_studio_target` ([#24580](https://github.com/hashicorp/terraform-provider-azurerm/issues/24580))\n* New Resource: `azurerm_elastic_san_volume_group` ([#24166](https://github.com/hashicorp/terraform-provider-azurerm/issues/24166))\n* New Resource: `azurerm_netapp_account_encryption` ([#23733](https://github.com/hashicorp/terraform-provider-azurerm/issues/23733))\n* New Resource: `azurerm_redhat_openshift_cluster` ([#24375](https://github.com/hashicorp/terraform-provider-azurerm/issues/24375))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.66.1` of `github.com/hashicorp/go-azure-helpers` ([#24561](https://github.com/hashicorp/terraform-provider-azurerm/issues/24561))\n* dependencies: updating to `v0.20240124.1115501` of `github.com/hashicorp/go-azure-sdk` ([#24619](https://github.com/hashicorp/terraform-provider-azurerm/issues/24619))\n* `bot`: updating to API Version `2021-05-01-preview` ([#24555](https://github.com/hashicorp/terraform-provider-azurerm/issues/24555))\n* `containerservice`: the SDK Clients now support logging ([#24564](https://github.com/hashicorp/terraform-provider-azurerm/issues/24564))\n* `cosmosdb`: updating to API Version `2023-04-15` ([#24541](https://github.com/hashicorp/terraform-provider-azurerm/issues/24541))\n* `loadtestservice`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` (and support logging) ([#24578](https://github.com/hashicorp/terraform-provider-azurerm/issues/24578))\n* `managedidentity`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` (and support logging) ([#24578](https://github.com/hashicorp/terraform-provider-azurerm/issues/24578))\n* `azurerm_api_management_api` - change the `id` format so specific `revision`s can be managed by Terraform ([#23031](https://github.com/hashicorp/terraform-provider-azurerm/issues/23031))\n* `azurerm_data_protection_backup_vault` - the `redundancy` propety can now be set to `ZoneRedundant` ([#24556](https://github.com/hashicorp/terraform-provider-azurerm/issues/24556))\n* `azurerm_data_factory_integration_runtime_azure_ssis` - support for the `credential_name` property ([#24458](https://github.com/hashicorp/terraform-provider-azurerm/issues/24458))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support `2022-datacenter-azure-edition-hotpatch` and `2022-datacenter-azure-edition-hotpatch-smalldisk` hotpatching images ([#23500](https://github.com/hashicorp/terraform-provider-azurerm/issues/23500))\n* `azurerm_stream_analytics_job` - support for the `sku_name` property ([#24554](https://github.com/hashicorp/terraform-provider-azurerm/issues/24554))\n\nBUG FIXES:\n\n* Data Source: `azurerm_app_service` - parsing the API Response for `app_service_plan_id` case-insensitively ([#24626](https://github.com/hashicorp/terraform-provider-azurerm/issues/24626))\n* Data Source: `azurerm_function_app` - parsing the API Response for `app_service_plan_id` case-insensitively ([#24626](https://github.com/hashicorp/terraform-provider-azurerm/issues/24626))\n* `azurerm_app_configuration_key` - the value for the `value` property can now be removed/emptied ([#24582](https://github.com/hashicorp/terraform-provider-azurerm/issues/24582))\n\n* `azurerm_app_service` - parsing the API Response for `app_service_plan_id` case-insensitively ([#24626](https://github.com/hashicorp/terraform-provider-azurerm/issues/24626))\n* `azurerm_app_service_plan` - fix casing in `serverFarms` due to ID update ([#24562](https://github.com/hashicorp/terraform-provider-azurerm/issues/24562))\n* `azurerm_app_service_slot` - parsing the API Response for `app_service_plan_id` case-insensitively ([#24626](https://github.com/hashicorp/terraform-provider-azurerm/issues/24626))\n* `azurerm_automation_schedule` - only one `monthly_occurence` block can now be specified ([#24614](https://github.com/hashicorp/terraform-provider-azurerm/issues/24614))\n* `azurerm_cognitive_deployment` - the `model.version` property is no longer required ([#24264](https://github.com/hashicorp/terraform-provider-azurerm/issues/24264))\n* `azurerm_container_app` - multiple `custom_scale_rule` can not be updated ([#24509](https://github.com/hashicorp/terraform-provider-azurerm/issues/24509))\n* `azurerm_container_registry_task_schedule_run_now` - prevents issue where the incorrect scheduled run is tracked if there are multiple ([#24592](https://github.com/hashicorp/terraform-provider-azurerm/issues/24592))\n* `azurerm_function_app` - parsing the API Response for `app_service_plan_id` case-insensitively ([#24626](https://github.com/hashicorp/terraform-provider-azurerm/issues/24626))\n* `azurerm_function_app_slot` - parsing the API Response for `app_service_plan_id` case-insensitively ([#24626](https://github.com/hashicorp/terraform-provider-azurerm/issues/24626))\n* `azurerm_logic_app_standard` - now parses the app service ID insensitively ([#24562](https://github.com/hashicorp/terraform-provider-azurerm/issues/24562))\n* `azurerm_logic_app_workflow` - the `workflow_parameters` now correctlys handle information specified by `$connections` ([#24141](https://github.com/hashicorp/terraform-provider-azurerm/issues/24141))\n* `azurerm_mssql_managed_instance_security_alert_policy` - can not update empty storage attributes ([#24553](https://github.com/hashicorp/terraform-provider-azurerm/issues/24553))\n* `azurerm_network_interface` - the `ip_configuration` properties are no longer added to a Load Balancer Backend if one of those `ip_configurations` is associated with a backend ([#24470](https://github.com/hashicorp/terraform-provider-azurerm/issues/24470))\n\n## 3.88.0 (January 18, 2024)\n\nFEATURES:\n\n* New Data Source: `azurerm_nginx_deployment` ([#24492](https://github.com/hashicorp/terraform-provider-azurerm/issues/24492))\n* New Resource: `azurerm_spring_cloud_dynatrace_application_performance_monitoring` ([#23889](https://github.com/hashicorp/terraform-provider-azurerm/issues/23889))\n* New Resource: `azurerm_virtual_machine_run_command` ([#23377](https://github.com/hashicorp/terraform-provider-azurerm/issues/23377))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240117.1163544` of `github.com/hashicorp/go-azure-sdk` ([#24481](https://github.com/hashicorp/terraform-provider-azurerm/issues/24481))\n* dependencies: updating to `v0.65.1` of `github.com/hashicorp/go-azure-helpers` ([#24479](https://github.com/hashicorp/terraform-provider-azurerm/issues/24479))\n* `datashare`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24481](https://github.com/hashicorp/terraform-provider-azurerm/issues/24481))\n* `kusto`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#24477](https://github.com/hashicorp/terraform-provider-azurerm/issues/24477))\n* Data Source: `azurerm_application_gateway` - support for the `trusted_client_certificate.data` property ([#24474](https://github.com/hashicorp/terraform-provider-azurerm/issues/24474))\n* `azurerm_service_plan`: refactoring to use `hashicorp/go-azure-sdk` ([#24483](https://github.com/hashicorp/terraform-provider-azurerm/issues/24483))\n* `azurerm_container_group` - support for the `priority` property ([#24374](https://github.com/hashicorp/terraform-provider-azurerm/issues/24374))\n* `azurerm_mssql_managed_database` - support for the `point_in_time_restore` property ([#24535](https://github.com/hashicorp/terraform-provider-azurerm/issues/24535))\n* `azurerm_mssql_managed_instance` - now exports the `dns_zone` attribute ([#24435](https://github.com/hashicorp/terraform-provider-azurerm/issues/24435))\n* `azurerm_linux_web_app_slot` - support for setting `python_version` to `3.12` ([#24363](https://github.com/hashicorp/terraform-provider-azurerm/issues/24363))\n* `azurerm_linux_web_app` - support for setting `python_version` to `3.12` ([#24363](https://github.com/hashicorp/terraform-provider-azurerm/issues/24363))\n* `azurerm_linux_function_app_slot` - support for setting `python_version` to `3.12` ([#24363](https://github.com/hashicorp/terraform-provider-azurerm/issues/24363))\n*  `azurerm_linux_function_app` - support for setting `python_version` to `3.12` ([#24363](https://github.com/hashicorp/terraform-provider-azurerm/issues/24363))\n\nBUG FIXES:\n\n* `azurerm_application_gateway` - the `components` property within the `url` block is no longer computed ([#24480](https://github.com/hashicorp/terraform-provider-azurerm/issues/24480))\n* `azurerm_cdn_frontdoor_route` - prevent an issue where `cdn_frontdoor_origin_path` gets removed on update if unchanged. ([#24488](https://github.com/hashicorp/terraform-provider-azurerm/issues/24488))\n* `azurerm_cognitive_account` - fixing support for the `DC0` SKU ([#24526](https://github.com/hashicorp/terraform-provider-azurerm/issues/24526))\n\n## 3.87.0 (January 11, 2024)\n\nFEATURES:\n\n* New Data Source: `azurerm_network_manager` ([#24398](https://github.com/hashicorp/terraform-provider-azurerm/issues/24398))\n* New Resource: `azurerm_security_center_server_vulnerability_assessments_setting` ([#24299](https://github.com/hashicorp/terraform-provider-azurerm/issues/24299))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20240111.1094251` of `github.com/hashicorp/go-azure-sdk` ([#24463](https://github.com/hashicorp/terraform-provider-azurerm/issues/24463))\n* Data Source: `azurerm_mssql_database` - support for `identity`, `transparent_data_encryption_enabled`, `transparent_data_encryption_key_vault_key_id` and `transparent_data_encryption_key_automatic_rotation_enabled` ([#24412](https://github.com/hashicorp/terraform-provider-azurerm/issues/24412))\n* Data Source: `azurerm_mssql_server` - support for `transparent_data_encryption_key_vault_key_id` ([#24412](https://github.com/hashicorp/terraform-provider-azurerm/issues/24412))\n* `machinelearning`: updating to API Version `2023-10-01` ([#24416](https://github.com/hashicorp/terraform-provider-azurerm/issues/24416))\n* `paloaltonetworks`: updating to API Version `2023-09-01` ([#24290](https://github.com/hashicorp/terraform-provider-azurerm/issues/24290))\n* `azurerm_container_app` - update create time validations for `ingress.0.traffic_weight` ([#24042](https://github.com/hashicorp/terraform-provider-azurerm/issues/24042))\n* `azurerm_container_app`- support for the `ip_security_restriction` block ([#23870](https://github.com/hashicorp/terraform-provider-azurerm/issues/23870))\n* `azurerm_kubernetes_cluster` - properties in `default_node_pool.linux_os_config.sysctl_config` are now updateable via node pool cycling ([#24397](https://github.com/hashicorp/terraform-provider-azurerm/issues/24397))\n* `azurerm_linux_web_app` - support the `VS2022` value for the `remote_debugging_version` property ([#24407](https://github.com/hashicorp/terraform-provider-azurerm/issues/24407))\n* `azurerm_mssql_database` - support for `identity`, `transparent_data_encryption_key_vault_key_id` and `transparent_data_encryption_key_automatic_rotation_enabled` ([#24412](https://github.com/hashicorp/terraform-provider-azurerm/issues/24412))\n* `azurerm_postgres_flexible_server` - the `sku_name` property now supports being set to `MO_Standard_E96ds_v5` ([#24367](https://github.com/hashicorp/terraform-provider-azurerm/issues/24367))\n* `azurerm_role_assignment` - support for the `principal_type` property ([#24271](https://github.com/hashicorp/terraform-provider-azurerm/issues/24271))\n* `azurerm_windows_web_app` - support the `VS2022` value for the `remote_debugging_version` property ([#24407](https://github.com/hashicorp/terraform-provider-azurerm/issues/24407))\n* `azurerm_cdn_frontdoor_firewall_policy` - support for `request_body_check_enabled` property ([#24406](https://github.com/hashicorp/terraform-provider-azurerm/issues/24406))\n\nBUG FIXES:\n\n* Data Source: `azurerm_role_definition` - fix `role_definition_id` ([#24418](https://github.com/hashicorp/terraform-provider-azurerm/issues/24418))\n* `azurerm_api_management` - the `sku_name` property can now be updated ([#24431](https://github.com/hashicorp/terraform-provider-azurerm/issues/24431))\n* `azurerm_arc_kubernetes_flux_configuration` - prevent a bug where certain sensitive properties for `bucket` and `git_repository` were being overwritten after an update to the resource is made ([#24066](https://github.com/hashicorp/terraform-provider-azurerm/issues/24066))\n* `azurerm_kubernetes_flux_configuration` - prevent a bug where certain sensitive properties for `bucket` and `git_repository` were being overwritten after an update to the resource is made ([#24066](https://github.com/hashicorp/terraform-provider-azurerm/issues/24066))\n* `azure_linux_web_app` - prevent a bug in App Service processing of `application_stack` in updates to `site_config` ([#24424](https://github.com/hashicorp/terraform-provider-azurerm/issues/24424))\n* `azure_linux_web_app_slot` - Fix bug in App Service processing of `application_stack` in updates to `site_config` ([#24424](https://github.com/hashicorp/terraform-provider-azurerm/issues/24424))\n* `azurerm_network_manager_deployment` - update creation wait logic to better tolerate the api returning not found ([#24330](https://github.com/hashicorp/terraform-provider-azurerm/issues/24330))\n* `azurerm_virtual_machine_data_disk_attachment` - do not update applications profile with disks ([#24145](https://github.com/hashicorp/terraform-provider-azurerm/issues/24145))\n* `azure_windows_web_app` - prevent a bug in App Service processing of `application_stack` in updates to `site_config` ([#24424](https://github.com/hashicorp/terraform-provider-azurerm/issues/24424))\n* `azure_windows_web_app_slot` - prevent a bug in App Service processing of `application_stack` in updates to `site_config` ([#24424](https://github.com/hashicorp/terraform-provider-azurerm/issues/24424))\n* `azurerm_maintenance_configuration` - set the `reboot` property in flatten from `AlwaysReboot` to `Always` ([#24376](https://github.com/hashicorp/terraform-provider-azurerm/issues/24376))\n* `azurerm_container_app_environment` - the `workload_profile` property can now be updated ([#24409](https://github.com/hashicorp/terraform-provider-azurerm/issues/24409))\n\n## 3.86.0 (January 04, 2024)\n\nFEATURES:\n\n* New Data Source: `azurerm_dashboard_grafana` ([#24243](https://github.com/hashicorp/terraform-provider-azurerm/issues/24243))\n* New Resource: `azurerm_log_analytics_workspace_table` ([#24229](https://github.com/hashicorp/terraform-provider-azurerm/issues/24229))\n* New Resource: `azurerm_automation_powershell72_module` ([#23980](https://github.com/hashicorp/terraform-provider-azurerm/issues/23980))\n* New Resource: `azurerm_data_factory_credential_user_managed_identity` ([#24307](https://github.com/hashicorp/terraform-provider-azurerm/issues/24307))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20231215.1114251` of `hashicorp/go-azure-sdk` ([#24251](https://github.com/hashicorp/terraform-provider-azurerm/issues/24251))\n* dependencies: `azurerm_spring_cloud_api_portal` - update to use `hashicorp/go-azure-sdk` ([#24321](https://github.com/hashicorp/terraform-provider-azurerm/issues/24321))\n* Data Source: `azurerm_kusto_cluster` - now exports the `identity` block ([#24314](https://github.com/hashicorp/terraform-provider-azurerm/issues/24314))\n* `azurerm_data_protection_backup_policy_postgresql` - support for the `time_zone` property ([#24312](https://github.com/hashicorp/terraform-provider-azurerm/issues/24312))\n* `azurerm_data_protection_backup_policy_disk` - support for the `time_zone` property ([#24312](https://github.com/hashicorp/terraform-provider-azurerm/issues/24312))\n* `azurerm_key_vault_managed_hardware_security_module` -the `tags` property can now be updated ([#24333](https://github.com/hashicorp/terraform-provider-azurerm/issues/24333))\n* `azurerm_logic_app_standard` - support for the `site_config.0.public_network_access_enabled` property ([#24257](https://github.com/hashicorp/terraform-provider-azurerm/issues/24257))\n* `azurerm_log_analytics_workspace_table` - support for the `plan` property ([#24341](https://github.com/hashicorp/terraform-provider-azurerm/issues/24341))\n* `azurerm_linux_web_app` - support the value `20-lts` for the `node_version` property  ([#24289](https://github.com/hashicorp/terraform-provider-azurerm/issues/24289))\n* `azurerm_recovery_services_vault` - support creation with immutability set to locked ([#23806](https://github.com/hashicorp/terraform-provider-azurerm/issues/23806))\n* `azurerm_spring_cloud_service` - support for the `sku_tier` property ([#24103](https://github.com/hashicorp/terraform-provider-azurerm/issues/24103))\n\nBUG FIXES:\n\n* Data Source: `azurerm_role_definition` - correctly export the `role_definition_id` attribute ([#24320](https://github.com/hashicorp/terraform-provider-azurerm/issues/24320))\n* `azurerm_bot_service` - fixing a bug where `public_network_access_enabled` was always set to `true` ([#24255](https://github.com/hashicorp/terraform-provider-azurerm/issues/24255))\n* `azurerm_bot_service_azure_bot` - `tags` can now be updated ([#24332](https://github.com/hashicorp/terraform-provider-azurerm/issues/24332))\n* `azurerm_cosmosdb_account` - fix validation for the `ip_range_filter` property ([#24306](https://github.com/hashicorp/terraform-provider-azurerm/issues/24306))\n* `azurerm_linux_virtual_machine` - the `additional_capabilities.0.ultra_ssd_enabled` can now be changed during the update ([#24274](https://github.com/hashicorp/terraform-provider-azurerm/issues/24274))\n* `azurerm_logic_app_standard` - update the default value of `version` from `~3` which is no longer supported to `~4` ([#24134](https://github.com/hashicorp/terraform-provider-azurerm/issues/24134))\n* `azurerm_logic_app_standard` - fix a crash when setting the default `version` 4.0 flag ([#24322](https://github.com/hashicorp/terraform-provider-azurerm/issues/24322))\n* `azurerm_iothub_device_update_account` - changing the `sku` property now creates a new resource ([#24324](https://github.com/hashicorp/terraform-provider-azurerm/issues/24324))\n* `azurerm_iothub` - prevent an inconsistant value after an apply ([#24326](https://github.com/hashicorp/terraform-provider-azurerm/issues/24326))\n* `azurerm_orchestrated_virtual_machine_scale_set` - correctly update the resource when hotpatch is enabled ([#24335](https://github.com/hashicorp/terraform-provider-azurerm/issues/24335))\n* `azurerm_windows_virtual_machine` - the `additional_capabilities.0.ultra_ssd_enabled` can now be changed during the update ([#24274](https://github.com/hashicorp/terraform-provider-azurerm/issues/24274))\n* `azurerm_scheduled_query_rules_alert` - changing the `data_source_id` now creates a new resource ([#24327](https://github.com/hashicorp/terraform-provider-azurerm/issues/24327))\n* `azurerm_scheduled_query_rules_log` - changing the `data_source_id` now creates a new resource ([#24327](https://github.com/hashicorp/terraform-provider-azurerm/issues/24327))\n\n## 3.85.0 (December 14, 2023)\n\nFEATURES:\n\n* New Data Source: `azurerm_locations` ([#23324](https://github.com/hashicorp/terraform-provider-azurerm/issues/23324))\n* New Resource: `azurerm_iotcentral_organization` ([#23132](https://github.com/hashicorp/terraform-provider-azurerm/issues/23132))\n\nENHANCEMENTS:\n\n* provider: support for authenticating using Azure Kubernetes Service Workload Identity ([#23965](https://github.com/hashicorp/terraform-provider-azurerm/issues/23965))\n* dependencies: updating to `v0.65.0` of `github.com/hashicorp/go-azure-helpers` ([#24222](https://github.com/hashicorp/terraform-provider-azurerm/issues/24222))\n* dependencies: updating to `v0.20231214.1220802` of `github.com/hashicorp/go-azure-sdk` ([#24246](https://github.com/hashicorp/terraform-provider-azurerm/issues/24246))\n* dependencies: updating to version `v0.20231214.1160726` of `github.com/hashicorp/go-azure-sdk` ([#24241](https://github.com/hashicorp/terraform-provider-azurerm/issues/24241))\n* dependencies: update `security/automation` to use `hashicorp/go-azure-sdk` ([#24156](https://github.com/hashicorp/terraform-provider-azurerm/issues/24156))\n* `dataprotection`: updating to API Version `2023-05-01` ([#24143](https://github.com/hashicorp/terraform-provider-azurerm/issues/24143))\n* `kusto`: removing the remnants of the old Resource ID Parsers now this uses `hashicorp/go-azure-sdk` ([#24238](https://github.com/hashicorp/terraform-provider-azurerm/issues/24238))\n* Data Source: `azurerm_cognitive_account` - export the `identity` block ([#24214](https://github.com/hashicorp/terraform-provider-azurerm/issues/24214))\n* Data Source: `azurerm_monitor_workspace` - add support for the `default_data_collection_endpoint_id` and `default_data_collection_rule_id` properties ([#24153](https://github.com/hashicorp/terraform-provider-azurerm/issues/24153))\n* Data Source: `azurerm_shared_image_gallery` - add support for the `image_names` property ([#24176](https://github.com/hashicorp/terraform-provider-azurerm/issues/24176))\n* `azurerm_dns_txt_record` - allow up to `4096` characters for the property `record.value` ([#24169](https://github.com/hashicorp/terraform-provider-azurerm/issues/24169))\n* `azurerm_container_app` - support for the `workload_profile_name` property ([#24219](https://github.com/hashicorp/terraform-provider-azurerm/issues/24219))\n* `azurerm_container_app` - suppot for the `init_container` block ([#23955](https://github.com/hashicorp/terraform-provider-azurerm/issues/23955))\n* `azurerm_hpc_cache_blob_nfs_target` - support for the `verification_timer_in_seconds` and `write_back_timer_in_seconds` properties ([#24207](https://github.com/hashicorp/terraform-provider-azurerm/issues/24207))\n* `azurerm_hpc_cache_nfs_target` - support for the `verification_timer_in_seconds` and `write_back_timer_in_seconds` properties ([#24208](https://github.com/hashicorp/terraform-provider-azurerm/issues/24208))\n* `azurerm_linux_web_app` - make `client_secret_setting_name` optional and conflict with `client_secret_certificate_thumbprint` ([#21834](https://github.com/hashicorp/terraform-provider-azurerm/issues/21834))\n* `azurerm_linux_web_app_slot` - make `client_secret_setting_name` optional and conflict with `client_secret_certificate_thumbprint` ([#21834](https://github.com/hashicorp/terraform-provider-azurerm/issues/21834))\n* `azurerm_linux_web_app` - fix a bug in `app_settings` where settings could be lost ([#24221](https://github.com/hashicorp/terraform-provider-azurerm/issues/24221))\n* `azurerm_linux_web_app_slot` - fix a bug in `app_settings` where settings could be lost ([#24221](https://github.com/hashicorp/terraform-provider-azurerm/issues/24221))\n* `azurerm_log_analytics_workspace` - add support for the `immediate_data_purge_on_30_days_enabled` property ([#24015](https://github.com/hashicorp/terraform-provider-azurerm/issues/24015))\n* `azurerm_mssql_server` - support for other identity types for the key vault key ([#24236](https://github.com/hashicorp/terraform-provider-azurerm/issues/24236))\n* `azurerm_machine_learning_datastore_blobstorage` - resource now skips validation when being created ([#24078](https://github.com/hashicorp/terraform-provider-azurerm/issues/24078))\n* `azurerm_machine_learning_datastore_datalake_gen2` - resource now skips validation when being created ([#24078](https://github.com/hashicorp/terraform-provider-azurerm/issues/24078))\n* `azurerm_machine_learning_datastore_fileshare` - resource now skips validation when being created ([#24078](https://github.com/hashicorp/terraform-provider-azurerm/issues/24078))\n* `azurerm_monitor_workspace` - support for the `default_data_collection_endpoint_id` and `default_data_collection_rule_id` properties ([#24153](https://github.com/hashicorp/terraform-provider-azurerm/issues/24153))\n* `azurerm_redis_cache` - support for the `storage_account_subscription_id` property ([#24101](https://github.com/hashicorp/terraform-provider-azurerm/issues/24101))\n* `azurerm_storage_blob` -  support for the `source_content` type `Page` ([#24177](https://github.com/hashicorp/terraform-provider-azurerm/issues/24177))\n* `azurerm_web_application_firewall_policy` - support new values to the `rule_group_name` property ([#24194](https://github.com/hashicorp/terraform-provider-azurerm/issues/24194))\n* `azurerm_windows_web_app` - make the `client_secret_setting_name` property optional and conflicts with the `client_secret_certificate_thumbprint` property ([#21834](https://github.com/hashicorp/terraform-provider-azurerm/issues/21834))\n* `azurerm_windows_web_app_slot` - make the `client_secret_setting_name` property optional and conflicts with the `client_secret_certificate_thumbprint` property ([#21834](https://github.com/hashicorp/terraform-provider-azurerm/issues/21834))\n* `azurerm_windows_web_app` - fix a bug in `app_settings` where settings could be lost ([#24221](https://github.com/hashicorp/terraform-provider-azurerm/issues/24221))\n* `azurerm_windows_web_app_slot` - fix a bug in `app_settings` where settings could be lost ([#24221](https://github.com/hashicorp/terraform-provider-azurerm/issues/24221))\n* `azurerm_cognitive_account` - add `ContentSafety` to the `kind` property validation ([#24205](https://github.com/hashicorp/terraform-provider-azurerm/issues/24205))\n\nBUG FIXES:\n\n* provider: fix an authentication issue with Azure Storage when running in Azure China cloud ([#24246](https://github.com/hashicorp/terraform-provider-azurerm/issues/24246))\n* Data Source: `azurerm_role_definition` - fix bug where `role_definition_id` and `scope` were being incorrectly set ([#24211](https://github.com/hashicorp/terraform-provider-azurerm/issues/24211))\n* `azurerm_batch_account` - fix bug where `UserAssigned, SystemAssigned` could be passed to the resource even though it isn't supported ([#24204](https://github.com/hashicorp/terraform-provider-azurerm/issues/24204))\n* `azurerm_batch_pool` - fix bug where `settings_json` and `protected_settings` were not being unmarshaled ([#24075](https://github.com/hashicorp/terraform-provider-azurerm/issues/24075))\n* `azurerm_bot_service_azure_bot` - fix bug where `public_network_access_enabled` was being set as the value for `LuisKey` ([#24164](https://github.com/hashicorp/terraform-provider-azurerm/issues/24164))\n* `azurerm_cognitive_account_customer_managed_key` - `identity_client_id` is no longer passed to the api when it is empty ([#24231](https://github.com/hashicorp/terraform-provider-azurerm/issues/24231))\n* `azurerm_linux_web_app_slot` - error when `service_plan_id` is identical to the parent `service_plan_id` ([#23403](https://github.com/hashicorp/terraform-provider-azurerm/issues/23403))\n* `azurerm_management_group_template_deployment` - fixing a bug where `template_spec_version_id` couldn't be updated ([#24072](https://github.com/hashicorp/terraform-provider-azurerm/issues/24072))\n* `azurerm_pim_active_role_assignment` - fix an importing issue by filtering available role assignments based on the provided `scope` ([#24077](https://github.com/hashicorp/terraform-provider-azurerm/issues/24077))\n* `azurerm_pim_eligible_role_assignment` - fix an importing issue by filtering available role assignments based on the provided `scope` ([#24077](https://github.com/hashicorp/terraform-provider-azurerm/issues/24077))\n* `azurerm_resource_group_template_deployment` - fixing a bug where `template_spec_version_id` couldn't be updated ([#24072](https://github.com/hashicorp/terraform-provider-azurerm/issues/24072))\n* `azurerm_security_center_setting` - fix the casing for the `setting_name` `Sentinel` ([#24210](https://github.com/hashicorp/terraform-provider-azurerm/issues/24210))\n* `azurerm_storage_account` - Fix crash when checking for `routingInputs.PublishInternetEndpoints` and `routingInputs.PublishMicrosoftEndpoints` ([#24228](https://github.com/hashicorp/terraform-provider-azurerm/issues/24228))\n* `azurerm_storage_share_file` - prevent panic when the file specified by `source` is empty ([#24179](https://github.com/hashicorp/terraform-provider-azurerm/issues/24179))\n* `azurerm_subscription_template_deployment` - fixing a bug where `template_spec_version_id` couldn't be updated ([#24072](https://github.com/hashicorp/terraform-provider-azurerm/issues/24072))\n* `azurerm_tenant_template_deployment` - fixing a bug where `template_spec_version_id` couldn't be updated ([#24072](https://github.com/hashicorp/terraform-provider-azurerm/issues/24072))\n* `azurerm_virtual_machine` - prevent a panic by nil checking the first element of `additional_capabilities` ([#24159](https://github.com/hashicorp/terraform-provider-azurerm/issues/24159))\n* `azurerm_windows_web_app_slot` - error when `service_plan_id` is identical to the parent `service_plan_id` ([#23403](https://github.com/hashicorp/terraform-provider-azurerm/issues/23403))\n\n## 3.84.0 (December 07, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_storage_containers` ([#24061](https://github.com/hashicorp/terraform-provider-azurerm/issues/24061))\n* **New Resource:** `azurerm_elastic_san` ([#23619](https://github.com/hashicorp/terraform-provider-azurerm/issues/23619))\n* **New Resource:** `azurerm_key_vault_managed_hardware_security_module_role_assignment` ([#22332](https://github.com/hashicorp/terraform-provider-azurerm/issues/22332))\n* **New Resource:** `azurerm_key_vault_managed_hardware_security_module_role_definition` ([#22332](https://github.com/hashicorp/terraform-provider-azurerm/issues/22332))\n\nENHANCEMENTS:\n\n* dependencies: updating mssql elasticpools from `v5.0` to `2023-05-01-preview`\n* dependencies: updating to `v0.20231207.1122031` of `github.com/hashicorp/go-azure-sdk` ([#24149](https://github.com/hashicorp/terraform-provider-azurerm/issues/24149))\n* Data Source: `azurerm_storage_account` - export the primary and secondary internet and microsoft hostnames for blobs, dfs, files, queues, tables and web ([#23517](https://github.com/hashicorp/terraform-provider-azurerm/issues/23517))\n* Data Source: `azurerm_cosmosdb_account` - export the `connection_strings`, `primary_sql_connection_string`, `secondary_sql_connection_string`, `primary_readonly_sql_connection_string`, `secondary_readonly_sql_connection_string`, `primary_mongodb_connection_string`, `secondary_mongodb_connection_string`, `primary_readonly_mongodb_connection_string`, and `secondary_readonly_mongodb_connection_string` attributes ([#24129](https://github.com/hashicorp/terraform-provider-azurerm/issues/24129))\n* `azurerm_bot_service_azure_bot` - support for the `public_network_access_enabled` property ([#24125](https://github.com/hashicorp/terraform-provider-azurerm/issues/24125))\n* `azurerm_container_app_environment` - support for the `workload_profile` property ([#23478](https://github.com/hashicorp/terraform-provider-azurerm/issues/23478))\n* `azurerm_cosmosdb_cassandra_datacenter` - support for the `seed_node_ip_addresses` property ([#24076](https://github.com/hashicorp/terraform-provider-azurerm/issues/24076))\n* `azurerm_firewall` - support for the `dns_proxy_enabled` property ([#20519](https://github.com/hashicorp/terraform-provider-azurerm/issues/20519))\n* `azurerm_kubernetes_cluster` - support for the  `support_plan` property and the `sku_tier` `Premium` ([#23970](https://github.com/hashicorp/terraform-provider-azurerm/issues/23970))\n* `azurerm_mssql_database` - support for `enclave_type` field ([#24054](https://github.com/hashicorp/terraform-provider-azurerm/issues/24054))\n* `azurerm_mssql_elasticpool` - support for `enclave_type` field ([#24054](https://github.com/hashicorp/terraform-provider-azurerm/issues/24054))\n* `azurerm_mssql_managed_instance` - support for more `vcores`: `6`, `10`, `12`, `20`, `48`, `56`, `96`, `128` ([#24085](https://github.com/hashicorp/terraform-provider-azurerm/issues/24085))\n* `azurerm_redis_linked_server` - support for the property `geo_replicated_primary_host_name` ([#23984](https://github.com/hashicorp/terraform-provider-azurerm/issues/23984))\n* `azurerm_storage_account` - expose the primary and secondary internet and microsoft hostnames for blobs, dfs, files, queues, tables and web ([#23517](https://github.com/hashicorp/terraform-provider-azurerm/issues/23517))\n* `azurerm_synapse_role_assignment` - support for the `principal_type` property ([#24089](https://github.com/hashicorp/terraform-provider-azurerm/issues/24089))\n* `azurerm_spring_cloud_build_deployment` - support for the `application_performance_monitoring_ids` property ([#23969](https://github.com/hashicorp/terraform-provider-azurerm/issues/23969))\n* `azurerm_virtual_network_gateway` - support for the `bgp_route_translation_for_nat_enabled`, `dns_forwarding_enabled`, `ip_sec_replay_protection_enabled`, `remote_vnet_traffic_enabled`, `virtual_wan_traffic_enabled`, `radius_server`, `virtual_network_gateway_client_connection`, `policy_group`, and `ipsec_policy` property ([#23220](https://github.com/hashicorp/terraform-provider-azurerm/issues/23220))\n\nBUG FIXES:\n\n* `azurerm_application_insights_api_key` - prevent a bug where multiple keys couldn't be created for an Application Insights instance ([#23463](https://github.com/hashicorp/terraform-provider-azurerm/issues/23463))\n* `azurerm_container_registry` - the `network_rule_set.virtual_network` property is deprecated ([#24140](https://github.com/hashicorp/terraform-provider-azurerm/issues/24140))\n* `azurerm_hdinsight_hadoop_cluster` - set `roles.edge_node.install_script_action.parameters` into state by retrieving the value provided in the user config since this property isn't returned by the API ([#23971](https://github.com/hashicorp/terraform-provider-azurerm/issues/23971))\n* `azurerm_kubernetes_cluster` - prevent a bug where maintenance window start date was always recalculated and sent to the API ([#23985](https://github.com/hashicorp/terraform-provider-azurerm/issues/23985))\n* `azurerm_mssql_database` - no longer sends all long retention values in payload unless set ([#24124](https://github.com/hashicorp/terraform-provider-azurerm/issues/24124))\n* `azurerm_mssql_managed_database` - no longer sends all long retention values in payload unless set ([#24124](https://github.com/hashicorp/terraform-provider-azurerm/issues/24124))\n* `azurerm_mssql_server_microsoft_support_auditing_policy` - only include storage endpoint in payload if set ([#24122](https://github.com/hashicorp/terraform-provider-azurerm/issues/24122))\n* `azurerm_mobile_network_packet_core_control_plane` - prevent a panic if the HTTP Response is nil ([#24083](https://github.com/hashicorp/terraform-provider-azurerm/issues/24083))\n* `azurerm_storage_account` - revert plan time name validation `(#23799)` ([#24142](https://github.com/hashicorp/terraform-provider-azurerm/issues/24142))\n* `azurerm_web_application_firewall_policy` - split create and update function to fix lifecycle - ignore changes ([#23412](https://github.com/hashicorp/terraform-provider-azurerm/issues/23412))\n\n## 3.83.0 (November 30, 2023)\n\nUPGRADE NOTES\n\n* Key Vaults are now loaded using [the `ListBySubscription` API within the Key Vault Resource Provider](/rest/api/keyvault/keyvault/vaults/list-by-subscription?tabs=HTTP) rather than [the Resources API](/rest/api/keyvault/keyvault/vaults/list?tabs=HTTP). This change means that the Provider now caches the list of Key Vaults available within a Subscription, rather than loading these piecemeal to workaround stale data returned from the Resources API ([#24019](https://github.com/hashicorp/terraform-provider-azurerm/issues/24019))\n\nFEATURES:\n\n* New Data Source: `azurerm_stack_hci_cluster` ([#24032](https://github.com/hashicorp/terraform-provider-azurerm/issues/24032))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20231129.1103252` of `github.com/hashicorp/go-azure-sdk` ([#24063](https://github.com/hashicorp/terraform-provider-azurerm/issues/24063))\n* `automation`: updating to API Version `2023-11-01` ([#24017](https://github.com/hashicorp/terraform-provider-azurerm/issues/24017))\n* `keyvault`: the cache is now populated using the `ListBySubscription` endpoint on the KeyVault Resource Provider rather than via the `Resources` API ([#24019](https://github.com/hashicorp/terraform-provider-azurerm/issues/24019)).\n* `keyvault`: updating the cache to populate all Key Vaults available within the Subscription to reduce the number of API calls ([#24019](https://github.com/hashicorp/terraform-provider-azurerm/issues/24019))\n* Data Source `azurerm_private_dns_zone`: refactoring to use the `ListBySubscription` API rather than the Resources API when `resource_group_name` is omitted ([#24024](https://github.com/hashicorp/terraform-provider-azurerm/issues/24024))\n* `azurerm_dashboard_grafana` - support for `grafana_major_version` ([#24014](https://github.com/hashicorp/terraform-provider-azurerm/issues/24014))\n* `azurerm_linux_web_app` - add support for dotnet 8 ([#23893](https://github.com/hashicorp/terraform-provider-azurerm/issues/23893))\n* `azurerm_linux_web_app_slot` - add support for dotnet 8 ([#23893](https://github.com/hashicorp/terraform-provider-azurerm/issues/23893))\n* `azurerm_media_transform` -  deprecate `face_detector_preset` and `video_analyzer_preset` ([#24002](https://github.com/hashicorp/terraform-provider-azurerm/issues/24002))\n* `azurerm_postgresql_database` - update the validation of `collation` to include `Norwegian_Norway.1252` ([#24070](https://github.com/hashicorp/terraform-provider-azurerm/issues/24070))\n* `azurerm_postgresql_flexible_server` - updating to API Version `2023-06-01-preview` ([#24016](https://github.com/hashicorp/terraform-provider-azurerm/issues/24016))\n* `azurerm_redis_cache` - support for the `active_directory_authentication_enabled` property ([#23976](https://github.com/hashicorp/terraform-provider-azurerm/issues/23976))\n* `azurerm_windows_web_app` - add support for dotnet 8 ([#23893](https://github.com/hashicorp/terraform-provider-azurerm/issues/23893))\n* `azurerm_windows_web_app_slot` - add support for dotnet 8 ([#23893](https://github.com/hashicorp/terraform-provider-azurerm/issues/23893))\n* `azurerm_storage_account` -  add `name` validation in custom diff ([#23799](https://github.com/hashicorp/terraform-provider-azurerm/issues/23799))\n\nBUG FIXES:\n\n* authentication: fix a bug where auxiliary tenants were not correctly authorized ([#24063](https://github.com/hashicorp/terraform-provider-azurerm/issues/24063))\n* `azurerm_app_configuration` - normalize location in `replica` block ([#24074](https://github.com/hashicorp/terraform-provider-azurerm/issues/24074))\n* `azurerm_cosmosdb_account` - cosmosdb version and capabilities can now be updated at the same time ([#24029](https://github.com/hashicorp/terraform-provider-azurerm/issues/24029))\n* `azurerm_data_factory_flowlet_data_flow` - `source` and `sink` properties are now optional ([#23987](https://github.com/hashicorp/terraform-provider-azurerm/issues/23987))\n* `azurerm_datadog_monitor_tag_rule` - correctly handle default rule ([#22806](https://github.com/hashicorp/terraform-provider-azurerm/issues/22806))\n* `azurerm_ip_group`: fixing a crash when `firewall_ids` and `firewall_policy_ids` weren't parsed correctly from the API Response ([#24031](https://github.com/hashicorp/terraform-provider-azurerm/issues/24031))\n* `azurerm_nginx_deployment` - add default value of `20` for `capacity` ([#24033](https://github.com/hashicorp/terraform-provider-azurerm/issues/24033))\n\n## 3.82.0 (November 23, 2023)\n\nFEATURES:\n\n* New Data Source: `azurerm_monitor_workspace` ([#23928](https://github.com/hashicorp/terraform-provider-azurerm/issues/23928))\n* New Resource: `azurerm_application_load_balancer_subnet_association` ([#23628](https://github.com/hashicorp/terraform-provider-azurerm/issues/23628))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20231117.1130141` of `github.com/hashicorp/go-azure-sdk` ([#23945](https://github.com/hashicorp/terraform-provider-azurerm/issues/23945))\n* `azurestackhci`: updating to API Version `2023-08-01` ([#23939](https://github.com/hashicorp/terraform-provider-azurerm/issues/23939))\n* `dashboard`: updating to API Version `2023-09-01` ([#23929](https://github.com/hashicorp/terraform-provider-azurerm/issues/23929))\n* `hpccache`: updating to API version `2023-05-01` ([#24005](https://github.com/hashicorp/terraform-provider-azurerm/issues/24005))\n* `mssql`: updating resources using `hashicorp/go-azure-sdk` to API Version `2023-02-01-preview` ([#23721](https://github.com/hashicorp/terraform-provider-azurerm/issues/23721))\n* `templatespecversions`: updating to API Version `2022-02-01` ([#24007](https://github.com/hashicorp/terraform-provider-azurerm/issues/24007))\n*  Data Source: `azurerm_template_spec_version` - refactoring to use `hashicorp/go-azure-sdk` ([#24007](https://github.com/hashicorp/terraform-provider-azurerm/issues/24007))\n* `azurerm_cosmosdb_postgresql_cluster` - `coordinator_storage_quota_in_mb` and `coordinator_vcore_count` are no longer required for read replicas ([#23928](https://github.com/hashicorp/terraform-provider-azurerm/issues/23928))\n* `azurerm_dashboard_grafana` - `sku` can now be set to `Essential` ([#23934](https://github.com/hashicorp/terraform-provider-azurerm/issues/23934))\n* `azurerm_gallery_application_version` - add support for the `config_file`, `package_file` and `target_region.exclude_from_latest` properties ([#23816](https://github.com/hashicorp/terraform-provider-azurerm/issues/23816))\n* `azurerm_hdinsight_hadoop_cluster` - `script_actions` is no longer Force New ([#23888](https://github.com/hashicorp/terraform-provider-azurerm/issues/23888))\n* `azurerm_hdinsight_hbase_cluster` - `script_actions` is no longer Force New ([#23888](https://github.com/hashicorp/terraform-provider-azurerm/issues/23888))\n* `azurerm_hdinsight_interactive_query_cluster` - `script_actions` is no longer Force New ([#23888](https://github.com/hashicorp/terraform-provider-azurerm/issues/23888))\n* `azurerm_hdinsight_kafka_cluster` - `script_actions` is no longer Force New ([#23888](https://github.com/hashicorp/terraform-provider-azurerm/issues/23888))\n* `azurerm_hdinsight_spark_cluster` - `script_actions` is no longer Force New ([#23888](https://github.com/hashicorp/terraform-provider-azurerm/issues/23888))\n* `azurerm_kubernetes_cluster` - add support for the `gpu_instance` property ([#23887](https://github.com/hashicorp/terraform-provider-azurerm/issues/23887))\n* `azurerm_kubernetes_cluster_node_pool` - add support for the `gpu_instance` property ([#23887](https://github.com/hashicorp/terraform-provider-azurerm/issues/23887))\n* `azurerm_log_analytics_workspace` - add support for the `identity` property ([#23864](https://github.com/hashicorp/terraform-provider-azurerm/issues/23864))\n* `azurerm_linux_function_app` - add support for dotnet 8 ([#23638](https://github.com/hashicorp/terraform-provider-azurerm/issues/23638))\n* `azurerm_linux_function_app_slot` - add support for dotnet 8 ([#23638](https://github.com/hashicorp/terraform-provider-azurerm/issues/23638))\n* `azurerm_managed_lustre_file_system` - export attribute `mgs_address` ([#23942](https://github.com/hashicorp/terraform-provider-azurerm/issues/23942))\n* `azurerm_mssql_database` - support for Hyperscale SKUs ([#23974](https://github.com/hashicorp/terraform-provider-azurerm/issues/23974))\n* `azurerm_mssql_database` - refactoring to use `hashicorp/go-azure-sdk` ([#23721](https://github.com/hashicorp/terraform-provider-azurerm/issues/23721))\n* `azurerm_mssql_server` - refactoring to use `hashicorp/go-azure-sdk` ([#23721](https://github.com/hashicorp/terraform-provider-azurerm/issues/23721))\n* `azurerm_shared_image` - add support for `trusted_launch_supported` ([#23781](https://github.com/hashicorp/terraform-provider-azurerm/issues/23781))\n* `azurerm_spring_cloud_container_deployment` - add support for the `application_performance_monitoring_ids` property ([#23862](https://github.com/hashicorp/terraform-provider-azurerm/issues/23862))\n* `azurerm_spring_cloud_customized_accelerator` - add support for the `accelerator_type` and `path` properties ([#23797](https://github.com/hashicorp/terraform-provider-azurerm/issues/23797))\n* `azurerm_point_to_site_vpn_gateway` - allow multiple `connection_configurations` blocks ([#23936](https://github.com/hashicorp/terraform-provider-azurerm/issues/23936))\n* `azurerm_private_dns_cname_record` - `ttl` can now be set to 0 ([#23918](https://github.com/hashicorp/terraform-provider-azurerm/issues/23918))\n* `azurerm_windows_function_app` - add support for dotnet 8 ([#23638](https://github.com/hashicorp/terraform-provider-azurerm/issues/23638))\n* `azurerm_windows_function_app_slot` - add support for dotnet 8 ([#23638](https://github.com/hashicorp/terraform-provider-azurerm/issues/23638))\n\nBUG FIXES:\n* `azurerm_api_management` - correct a bug with more location zones within the `additional_location` block ([#23943](https://github.com/hashicorp/terraform-provider-azurerm/issues/23943))\n* `azurerm_dev_test_linux_virtual_machine` - `storage_type` is now ForceNew to match the updated API behaviour ([#23973](https://github.com/hashicorp/terraform-provider-azurerm/issues/23973))\n* `azurerm_dev_test_windows_virtual_machine` - `storage_type` is now ForceNew to match the updated API behaviour ([#23973](https://github.com/hashicorp/terraform-provider-azurerm/issues/23973))\n* `azurerm_disk_encryption_set` - resource will recreate if `identity` changes from `SystemAssigned` to `UserAssigned` ([#23904](https://github.com/hashicorp/terraform-provider-azurerm/issues/23904))\n* `azurerm_eventhub_cluster`: `sku_name` is no longer ForceNew ([#24009](https://github.com/hashicorp/terraform-provider-azurerm/issues/24009))\n* `azurerm_firewall` - recasing the value for `firewall_policy_id` to workaround the API returning the incorrect casing ([#23993](https://github.com/hashicorp/terraform-provider-azurerm/issues/23993))\n* `azurerm_security_center_subscription_pricing` - fix a bug preventing removal of `extensions` and downgrading `tier` to `Free` ([#23821](https://github.com/hashicorp/terraform-provider-azurerm/issues/23821))\n* `azurerm_windows_web_app` - fix an issue of incorrect application stack settings during update ([#23372](https://github.com/hashicorp/terraform-provider-azurerm/issues/23372))\n\n## 3.81.0 (November 16, 2023)\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20231116.1162710` of `github.com/hashicorp/go-azure-sdk` ([#23922](https://github.com/hashicorp/terraform-provider-azurerm/issues/23922))\n* `managedservices`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#23890](https://github.com/hashicorp/terraform-provider-azurerm/issues/23890))\n* `network`: updating to API Version `2023-06-01` ([#23875](https://github.com/hashicorp/terraform-provider-azurerm/issues/23875))\n* `servicelinker`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#23890](https://github.com/hashicorp/terraform-provider-azurerm/issues/23890))\n* `storage`: refactoring usages of `github.com/hashicorp/go-azure-sdk` to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#23890](https://github.com/hashicorp/terraform-provider-azurerm/issues/23890))\n* Data Source: `azurerm_network_ddos_protection_plan`: refactoring to use `hashicorp/go-azure-sdk` ([#23849](https://github.com/hashicorp/terraform-provider-azurerm/issues/23849))\n* `azurerm_linux_function_app` - add support for disabling Basic Auth for default Publishing Profile via new properties `ftp_publish_basic_authentication_enabled` and `webdeploy_publish_basic_authentication_enabled` ([#23900](https://github.com/hashicorp/terraform-provider-azurerm/issues/23900))\n* `azurerm_linux_function_app_slot` - add support for disabling Basic Auth for default Publishing Profile via new properties `ftp_publish_basic_authentication_enabled` and `webdeploy_publish_basic_authentication_enabled`  ([#23900](https://github.com/hashicorp/terraform-provider-azurerm/issues/23900))\n* `azurerm_linux_web_app` - add support for disabling Basic Auth for default Publishing Profile via new properties `ftp_publish_basic_authentication_enabled` and `webdeploy_publish_basic_authentication_enabled`  ([#23900](https://github.com/hashicorp/terraform-provider-azurerm/issues/23900))\n* `azurerm_linux_web_app_slot` - add support for disabling Basic Auth for default Publishing Profile via new properties `ftp_publish_basic_authentication_enabled` and `webdeploy_publish_basic_authentication_enabled`  ([#23900](https://github.com/hashicorp/terraform-provider-azurerm/issues/23900))\n* `azurerm_logic_app_integration_account_certificate` - `name` now accepts underscores ([#23866](https://github.com/hashicorp/terraform-provider-azurerm/issues/23866))\n* `azurerm_logic_app_integration_account_partner` - `business_identity.value` now accepts underscores ([#23866](https://github.com/hashicorp/terraform-provider-azurerm/issues/23866))\n* `azurerm_monitor_data_collection_rule` - added support for `WorkspaceTransforms` as `kind` ([#23873](https://github.com/hashicorp/terraform-provider-azurerm/issues/23873))\n* `azurerm_network_ddos_protection_plan`: refactoring to use `hashicorp/go-azure-sdk` ([#23849](https://github.com/hashicorp/terraform-provider-azurerm/issues/23849))\n* `azurerm_windows_function_app` - add support for disabling Basic Auth for default Publishing Profile via new properties `ftp_publish_basic_authentication_enabled` and `webdeploy_publish_basic_authentication_enabled`  ([#23900](https://github.com/hashicorp/terraform-provider-azurerm/issues/23900))\n* `azurerm_windows_function_app_slot` - add support for disabling Basic Auth for default Publishing Profile via new properties `ftp_publish_basic_authentication_enabled` and `webdeploy_publish_basic_authentication_enabled`  ([#23900](https://github.com/hashicorp/terraform-provider-azurerm/issues/23900))\n* `azurerm_windows_web_app` - add support for disabling Basic Auth for default Publishing Profile via new properties `ftp_publish_basic_authentication_enabled` and `webdeploy_publish_basic_authentication_enabled`  ([#23900](https://github.com/hashicorp/terraform-provider-azurerm/issues/23900))\n* `azurerm_windows_web_app_slot` - add support for disabling Basic Auth for default Publishing Profile via new properties `ftp_publish_basic_authentication_enabled` and `webdeploy_publish_basic_authentication_enabled`  ([#23900](https://github.com/hashicorp/terraform-provider-azurerm/issues/23900))\n\n## 3.80.0 (November 09, 2023)\n\nENHANCEMENTS:\n\n* `internal/sdk` - Added support for pointer Types in resource models ([#23810](https://github.com/hashicorp/terraform-provider-azurerm/issues/23810))\n* dependencies: updating to `v0.63.0` of `github.com/hashicorp/go-azure-helpers` ([#23785](https://github.com/hashicorp/terraform-provider-azurerm/issues/23785))\n* dependencies: updating to `v0.20231106.1151347` of `github.com/hashicorp/go-azure-sdk` ([#23787](https://github.com/hashicorp/terraform-provider-azurerm/issues/23787))\n* `azurerm_cognitive_deployment` - support for the `version_upgrade_option` property ([#22520](https://github.com/hashicorp/terraform-provider-azurerm/issues/22520))\n* `azurerm_firewall_policy_rule_collection_group` - add support for the property `http_headers` ([#23641](https://github.com/hashicorp/terraform-provider-azurerm/issues/23641))\n* `azurerm_kubernetes_cluster` - `fips_enabled` can be updated in the `default_node_pool` without recreating the cluster ([#23612](https://github.com/hashicorp/terraform-provider-azurerm/issues/23612))\n* `azurerm_kusto_cluster` - the cluster `name` can now include dashes ([#23790](https://github.com/hashicorp/terraform-provider-azurerm/issues/23790))\n* `azurerm_postgresql_database` - update the validation of `collation` to include support for `French_France.1252` ([#23783](https://github.com/hashicorp/terraform-provider-azurerm/issues/23783))\n\nBUG FIXES:\n\n* Data Source: `azurerm_data_protection_backup_vault` - removing `import` support, since Data Sources don't support being imported ([#23820](https://github.com/hashicorp/terraform-provider-azurerm/issues/23820))\n* Data Source: `azurerm_kusto_database` - removing `import` support, since Data Sources don't support being imported ([#23820](https://github.com/hashicorp/terraform-provider-azurerm/issues/23820))\n* Data Source: `azurerm_virtual_hub_route_table` - removing `import` support, since Data Sources don't support being imported ([#23820](https://github.com/hashicorp/terraform-provider-azurerm/issues/23820))\n* `azurerm_windows_web_app` - prevent a panic with the `auto_heal.actions` property ([#23836](https://github.com/hashicorp/terraform-provider-azurerm/issues/23836))\n* `azurerm_windows_web_app` - prevent a panic with the `auto_heal.triggers` property ([#23812](https://github.com/hashicorp/terraform-provider-azurerm/issues/23812))\n\n## 3.79.0 (November 02, 2023)\n\nENHANCEMENTS:\n\n* provider: log instead of error when RPs are unavailable when validating RP registrations ([#23380](https://github.com/hashicorp/terraform-provider-azurerm/issues/23380))\n* `azurerm_arc_kuberenetes_cluster_extension_resource` - the `version` and `release_train` properties can now be set simultaneously ([#23692](https://github.com/hashicorp/terraform-provider-azurerm/issues/23692))\n* `azurerm_container_apps` - support for the `ingress.exposed_port` property ([#23752](https://github.com/hashicorp/terraform-provider-azurerm/issues/23752))\n* `azurerm_cosmosdb_postgresql_cluster` - read replica clusters can be created without specifying `administrator_login_password` property ([#23750](https://github.com/hashicorp/terraform-provider-azurerm/issues/23750))\n* `azurerm_managed_application` - arrays can be supplied in the `parameter_values` property ([#23754](https://github.com/hashicorp/terraform-provider-azurerm/issues/23754))\n* `azurerm_storage_management_policy` - support for properties `rule.*.actions.*.base_blob.0.tier_to_cold_after_days_since_{modification|last_access_time|creation}_greater_than and rule.*.actions.*.{snapshot|version}.0.tier_to_cold_after_days_since_creation_greater_than` ([#23574](https://github.com/hashicorp/terraform-provider-azurerm/issues/23574))\n\nBUG FIXES:\n\n* `azurerm_api_management_diagnostic` - the `operation_name_format` attribute will only be sent if `identifier` is set to `applicationinsights` ([#23736](https://github.com/hashicorp/terraform-provider-azurerm/issues/23736))\n* `azurerm_backup_policy_vm` - fix payload by using current datetime ([#23586](https://github.com/hashicorp/terraform-provider-azurerm/issues/23586))\n* `azurerm_kubernetes_cluster` - the `custom_ca_trust_certificates_base64` property can not be removed, only updated ([#23737](https://github.com/hashicorp/terraform-provider-azurerm/issues/23737))\n\n## 3.78.0 (October 26, 2023)\n\nFEATURES:\n\n* New Resource: `azurerm_resource_management_private_link_association` ([#23546](https://github.com/hashicorp/terraform-provider-azurerm/issues/23546))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20231025.1113325` of `github.com/hashicorp/go-azure-sdk` ([#23684](https://github.com/hashicorp/terraform-provider-azurerm/issues/23684))\n* dependencies: updating to `v1.58.3` of `google.golang.org/grpc` ([#23691](https://github.com/hashicorp/terraform-provider-azurerm/issues/23691))\n* dependencies: updating search service from `2022-09-01` to `2023-11-01` ([#23698](https://github.com/hashicorp/terraform-provider-azurerm/issues/23698)) \n* Data Source: `azurerm_monitor_workspace` - export `query_endpoint` ([#23629](https://github.com/hashicorp/terraform-provider-azurerm/issues/23629))\n* `azurerm_express_route_port` - support for `macsec_sci_enabled` ([#23625](https://github.com/hashicorp/terraform-provider-azurerm/issues/23625))\n* `azurerm_eventhub_namespace_customer_managed_key` - support for the `user_assigned_identity_id` property ([#23635](https://github.com/hashicorp/terraform-provider-azurerm/issues/23635))\n* `azurerm_postgresql_flexible_server` - `private_dns_zone_id` is no longer ForceNew and case is suppressed  ([#23660](https://github.com/hashicorp/terraform-provider-azurerm/issues/23660))\n* `azurerm_synapse_workspace` - add support for `azuread_authentication_only` ([#23659](https://github.com/hashicorp/terraform-provider-azurerm/issues/23659))\n* `azurerm_redis_enterprise_cluster` - support for new location `Japan East` ([#23696](https://github.com/hashicorp/terraform-provider-azurerm/issues/23696))\n* `azurerm_search_service` - support for `semantic_search_sku` field ([#23698](https://github.com/hashicorp/terraform-provider-azurerm/issues/23698))\n\nBUG FIXES:\n\n* `azurerm_palo_alto_next_generation_firewall_virtual_network_local_rulestack` - added lock for ruleStackID ([#23601](https://github.com/hashicorp/terraform-provider-azurerm/issues/23601))\n* `azurerm_cognitive_deployment` - remove forceNew tag from `rai_policy_name` ([#23697](https://github.com/hashicorp/terraform-provider-azurerm/issues/23697))\n\n## 3.77.0 (October 19, 2023)\n\nFEATURES:\n\n* New Resources: `azurerm_application_load_balancer_frontend` ([#23411](https://github.com/hashicorp/terraform-provider-azurerm/issues/23411))\n* New Resources: `azurerm_dev_center` ([#23538](https://github.com/hashicorp/terraform-provider-azurerm/issues/23538))\n* New Resources: `azurerm_dev_center_project` ([#23538](https://github.com/hashicorp/terraform-provider-azurerm/issues/23538))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.62.0` of `github.com/hashicorp/go-azure-helpers` ([#23581](https://github.com/hashicorp/terraform-provider-azurerm/issues/23581))\n* dependencies: updating Kusto SDK from `2023-05-02` to `2023-08-15` ([#23598](https://github.com/hashicorp/terraform-provider-azurerm/issues/23598))\n* dependencies: updating nginx from `2022-08-01` to `2023-04-01` ([#23583](https://github.com/hashicorp/terraform-provider-azurerm/issues/23583))\n* `netapp`: updating to use API Version `2023-05-01` ([#23576](https://github.com/hashicorp/terraform-provider-azurerm/issues/23576))\n* `springcloud`: updating to use API Version `2023-09-01-preview` ([#23544](https://github.com/hashicorp/terraform-provider-azurerm/issues/23544))\n* `storage`: updating to use API Version `2023-01-01` ([#23543](https://github.com/hashicorp/terraform-provider-azurerm/issues/23543))\n* `internal/sdk`: fixing an issue where struct fields containing `removedInNextMajorVersion` wouldn't be decoded correctly ([#23564](https://github.com/hashicorp/terraform-provider-azurerm/issues/23564))\n* `internal/sdk`: struct tag parsing is now handled consistently during both encoding and decoding ([#23568](https://github.com/hashicorp/terraform-provider-azurerm/issues/23568))\n* provider: the `roll_instances_when_required` provider feature in the `virtual_machine_scale_set` block is now optional ([#22976](https://github.com/hashicorp/terraform-provider-azurerm/issues/22976))\n* Data Source: `azurerm_automation_account`: refactoring the remaining usage of `Azure/azure-sdk-for-go` to use `hashicorp/go-azure-sdk` ([#23555](https://github.com/hashicorp/terraform-provider-azurerm/issues/23555))\n* `azurerm_automation_account`: refactoring the remaining usage of `Azure/azure-sdk-for-go` to use `hashicorp/go-azure-sdk` ([#23555](https://github.com/hashicorp/terraform-provider-azurerm/issues/23555))\n* `azurerm_resource_deployment_script_azure_cli` - improve validation for the `version` property to support newer versions ([#23370](https://github.com/hashicorp/terraform-provider-azurerm/issues/23370))\n* `azurerm_resource_deployment_script_azure_power_shell` - improve validation for the `version` property to support newer versions ([#23370](https://github.com/hashicorp/terraform-provider-azurerm/issues/23370))\n* `azurerm_nginx_deployment` - support for the `capacity` and `email` properties ([#23596](https://github.com/hashicorp/terraform-provider-azurerm/issues/23596))\n\nBUG FIXES:\n\n* Data Source: `azurerm_virtual_hub_connection` - export the `inbound_route_map_id`, `outbound_route_map_id`, and `static_vnet_local_route_override_criteria` attributes in the `routing` block, and fix a bug where these attributes could not be set ([#23491](https://github.com/hashicorp/terraform-provider-azurerm/issues/23491))\n* `azurerm_cdn_frontdoor_rule` - the `url_filename_condition` properties `match_values` is now optional if `operator` is set to `Any` ([#23541](https://github.com/hashicorp/terraform-provider-azurerm/issues/23541))\n* `azurerm_shared_image_gallery` - added the `Private` and `Groups` options for the `sharing.permission` property ([#23570](https://github.com/hashicorp/terraform-provider-azurerm/issues/23570))\n* `azurerm_redis_cache` - fixed incorrect ssl values for `redis_primary_connection_string` and `secondary_connection_string` ([#23575](https://github.com/hashicorp/terraform-provider-azurerm/issues/23575))\n* `azurerm_monitor_activity_log_alert` - the `recommend_category` property now can be set to `HighAvailability` ([#23605](https://github.com/hashicorp/terraform-provider-azurerm/issues/23605))\n* `azurerm_recovery_services_vault` - the `encryption` property can now be used with the `cross_region_restore_enabled` property ([#23618](https://github.com/hashicorp/terraform-provider-azurerm/issues/23618))\n* `azurerm_storage_account_customer_managed_key` - prevent a panic when the keyvault id is empty ([#23599](https://github.com/hashicorp/terraform-provider-azurerm/issues/23599))\n\n## 3.76.0 (October 12, 2023)\n\nFEATURES:\n\n* New Resource: `azurerm_security_center_storage_defender` ([#23242](https://github.com/hashicorp/terraform-provider-azurerm/issues/23242))\n* New Resource: `azurerm_spring_cloud_application_insights_application_performance_monitoring` ([#23107](https://github.com/hashicorp/terraform-provider-azurerm/issues/23107))\n\nENHANCEMENTS:\n\n* provider: updating to build using Go `1.21.3` ([#23514](https://github.com/hashicorp/terraform-provider-azurerm/issues/23514))\n* dependencies: updating to `v0.20231012.1141427` of `github.com/hashicorp/go-azure-sdk` ([#23534](https://github.com/hashicorp/terraform-provider-azurerm/issues/23534))\n* Data Source: `azurerm_application_gateway` - support for `backend_http_settings`, `global`, `gateway_ip_configuration` and more attributes ([#23318](https://github.com/hashicorp/terraform-provider-azurerm/issues/23318))\n* Data Source: `azurerm_network_service_tags` - export the `name` attribute ([#23382](https://github.com/hashicorp/terraform-provider-azurerm/issues/23382))\n* `azurerm_cosmosdb_postgresql_cluster` - add support for `sql_version` of `16` and `citus_version` of `12.1` ([#23476](https://github.com/hashicorp/terraform-provider-azurerm/issues/23476))\n* `azurerm_palo_alto_local_rulestack` - correctly normalize the `location` property ([#23483](https://github.com/hashicorp/terraform-provider-azurerm/issues/23483))\n* `azurerm_static_site` - add support for `app_settings` ([#23421](https://github.com/hashicorp/terraform-provider-azurerm/issues/23421))\n\nBUG FIXES:\n\n* `azurerm_automation_schedule` - fix a bug when updating `start_time` ([#23494](https://github.com/hashicorp/terraform-provider-azurerm/issues/23494))\n* `azurerm_eventhub` - remove ForceNew and check `partition_count` is not decreased ([#23499](https://github.com/hashicorp/terraform-provider-azurerm/issues/23499))\n* `azurerm_managed_lustre_file_system` - update validation for `storage_capacity_in_tb` according to `sku_name` in use ([#23428](https://github.com/hashicorp/terraform-provider-azurerm/issues/23428))\n* `azurerm_virtual_machine` - fix a crash when the API response for the `os_profile` block contains nil properties ([#23535](https://github.com/hashicorp/terraform-provider-azurerm/issues/23535))\n\n## 3.75.0 (September 28, 2023)\n\nFEATURES:\n\n* New Resource: `azurerm_application_load_balancer` ([#22517](https://github.com/hashicorp/terraform-provider-azurerm/issues/22517))\n* New Resource: `azurerm_resource_management_private_link` ([#23098](https://github.com/hashicorp/terraform-provider-azurerm/issues/23098))\n\nENHANCEMENTS:\n\n* dependencies: `firewall` migrated to `hashicorp/go-azure-sdk` ([#22863](https://github.com/hashicorp/terraform-provider-azurerm/issues/22863))\n* `azurerm_bot_service_azure_bot` - add support for the `icon_url` property ([#23114](https://github.com/hashicorp/terraform-provider-azurerm/issues/23114))\n* `azurerm_cognitive_deployment` - `capacity` property is now updateable ([#23251](https://github.com/hashicorp/terraform-provider-azurerm/issues/23251))\n* `azurerm_container_group` - added support for `key_vault_user_identity_id` ([#23332](https://github.com/hashicorp/terraform-provider-azurerm/issues/23332))\n* `azurerm_data_factory` - added support for the `publish_enabled` property ([#2334](https://github.com/hashicorp/terraform-provider-azurerm/issues/2334))\n* `azurerm_firewall_policy_rule_collection_group` - add support for the `description` property ([#23354](https://github.com/hashicorp/terraform-provider-azurerm/issues/23354))\n* `azurerm_kubernetes_cluster` - `network_profile.network_policy` can be migrated to `cilium` ([#23342](https://github.com/hashicorp/terraform-provider-azurerm/issues/23342))\n* `azurerm_log_analytics_workspace` - add support for the `data_collection_rule_id` property ([#23347](https://github.com/hashicorp/terraform-provider-azurerm/issues/23347))\n* `azurerm_mysql_flexible_server` - add support for the `io_scaling_enabled` property ([#23329](https://github.com/hashicorp/terraform-provider-azurerm/issues/23329))\n\nBUG FIXES:\n\n* `azurerm_api_management_api` - fix importing `openapi` format content file issue ([#23348](https://github.com/hashicorp/terraform-provider-azurerm/issues/23348))\n* `azurerm_cdn_frontdoor_rule` - allow a `cache_duration` of `00:00:00` ([#23384](https://github.com/hashicorp/terraform-provider-azurerm/issues/23384))\n* `azurerm_cosmosdb_cassandra_datacenter` - `sku_name` is now updatable ([#23419](https://github.com/hashicorp/terraform-provider-azurerm/issues/23419))\n* `azurerm_key_vault_certificate` - fix a bug that prevented soft-deleted certificates from being recovered ([#23204](https://github.com/hashicorp/terraform-provider-azurerm/issues/23204))\n* `azurerm_log_analytics_solution` - fix create and update lifecycle of resource by splitting methods ([#23333](https://github.com/hashicorp/terraform-provider-azurerm/issues/23333))\n* `azurerm_management_group_subscription_association` - mark resource as gone correctly if not found when retrieving ([#23335](https://github.com/hashicorp/terraform-provider-azurerm/issues/23335))\n* `azurerm_management_lock` - add polling after create and delete to check for RP propagation ([#23345](https://github.com/hashicorp/terraform-provider-azurerm/issues/23345))\n* `azurerm_monitor_diagnostic_setting` - added validation to ensure at least one of `category` or `category_group` is supplied ([#23308](https://github.com/hashicorp/terraform-provider-azurerm/issues/23308))\n* `azurerm_palo_alto_local_rulestack_prefix_list` - fix rulestack not being committed on delete ([#23362](https://github.com/hashicorp/terraform-provider-azurerm/issues/23362))\n* `azurerm_palo_alto_local_rulestack_fqdn_list` - fix rulestack not being committed on delete ([#23362](https://github.com/hashicorp/terraform-provider-azurerm/issues/23362))\n* `security_center_subscription_pricing_resource` - disabled extensions logic now works as expected ([#22997](https://github.com/hashicorp/terraform-provider-azurerm/issues/22997))\n\n## 3.74.0 (September 21, 2023)\n\nNOTES:\n\n* `azurerm_synapse_sql_pool` - users that have imported `azurerm_synapse_sql_pool` resources that were created outside of Terraform using an `LRS` storage account type will need to use `ignore_changes` to avoid the resource from being destroyed and recreated.\n\nFEATURES:\n\n* **New Resource**: `azurerm_arc_resource_bridge_appliance` ([#23108](https://github.com/hashicorp/terraform-provider-azurerm/issues/23108))\n* **New Resource**: `azurerm_data_factory_dataset_azure_sql_table` ([#23264](https://github.com/hashicorp/terraform-provider-azurerm/issues/23264))\n* **New Resource**: `azurerm_function_app_connection` ([#23127](https://github.com/hashicorp/terraform-provider-azurerm/issues/23127))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230918.1115907` of `github.com/hashicorp/go-azure-sdk` ([#23337](https://github.com/hashicorp/terraform-provider-azurerm/issues/23337))\n* dependencies: downgrading to `v1.12.5` of `github.com/rickb777/date` ([#23296](https://github.com/hashicorp/terraform-provider-azurerm/issues/23296))\n* `mysql`: updating to use API Version `2022-01-01` ([#23320](https://github.com/hashicorp/terraform-provider-azurerm/issues/23320))\n* `azurerm_app_configuration` - support for the `replica` block ([#22452](https://github.com/hashicorp/terraform-provider-azurerm/issues/22452))\n* `azurerm_bot_channel_directline` - support for `user_upload_enabled`, `endpoint_parameters_enabled`, and `storage_enabled` ([#23149](https://github.com/hashicorp/terraform-provider-azurerm/issues/23149))\n* `azurerm_container_app` - support for scale rules ([#23294](https://github.com/hashicorp/terraform-provider-azurerm/issues/23294))\n* `azurerm_container_app_environment` - support for zone redundancy ([#23313](https://github.com/hashicorp/terraform-provider-azurerm/issues/23313))\n* `azurerm_container_group` - support for the `key_vault_user_identity_id` property for Customer Managed Keys ([#23332](https://github.com/hashicorp/terraform-provider-azurerm/issues/23332))\n* `azurerm_cosmosdb_account` - support for MongoDB connection strings ([#23331](https://github.com/hashicorp/terraform-provider-azurerm/issues/23331))\n* `azurerm_data_factory_dataset_delimited_text` - support for the `dynamic_file_system_enabled`, `dynamic_path_enabled`, and `dynamic_filename_enabled` properties ([#23261](https://github.com/hashicorp/terraform-provider-azurerm/issues/23261))\n* `azurerm_data_factory_dataset_parquet` - support for the `azure_blob_fs_location` block ([#23261](https://github.com/hashicorp/terraform-provider-azurerm/issues/23261))\n* `azurerm_monitor_diagnostic_setting` - validation to ensure either `category` or `category_group` are supplied in `enabled_log` and `log` blocks ([#23308](https://github.com/hashicorp/terraform-provider-azurerm/issues/23308))\n* `azurerm_network_interface` - support for the `auxiliary_mode` and `auxiliary_sku` properties ([#22979](https://github.com/hashicorp/terraform-provider-azurerm/issues/22979))\n* `azurerm_postgresql_flexible_server` - increased the maximum supported value for `storage_mb` ([#23277](https://github.com/hashicorp/terraform-provider-azurerm/issues/23277))\n* `azurerm_shared_image_version` - support for the `replicated_region_deletion_enabled` and `target_region.exclude_from_latest_enabled` properties ([#23147](https://github.com/hashicorp/terraform-provider-azurerm/issues/23147))\n* `azurerm_storage_account` - support for setting `domain_name` and `domain_guid` for `AADKERB` ([#22833](https://github.com/hashicorp/terraform-provider-azurerm/issues/22833))\n* `azurerm_storage_account_customer_managed_key` - support for cross-tenant customer-managed keys with the `federated_identity_client_id`, and `key_vault_uri` properties ([#20356](https://github.com/hashicorp/terraform-provider-azurerm/issues/20356))\n* `azurerm_web_application_firewall_policy` - support for the `rate_limit_duration`, `rate_limit_threshold`, `group_rate_limit_by`, and `request_body_inspect_limit_in_kb` properties ([#23239](https://github.com/hashicorp/terraform-provider-azurerm/issues/23239))\n\nBUG FIXES:\n\n* Data Source: `azurerm_container_app_environment`: fix `log_analytics_workspace_name` output to correct value ([#23298](https://github.com/hashicorp/terraform-provider-azurerm/issues/23298))\n* `azurerm_api_management_api` - set the `service_url` property when importing the resource ([#23011](https://github.com/hashicorp/terraform-provider-azurerm/issues/23011))\n* `azurerm_app_configuration` - prevent crash by nil checking the encryption configuration ([#23302](https://github.com/hashicorp/terraform-provider-azurerm/issues/23302))\n* `azurerm_app_configuration_feature` - update `percentage_filter_value` to accept correct type of float ([#23263](https://github.com/hashicorp/terraform-provider-azurerm/issues/23263))\n* `azurerm_container_app` - fix an issue with `commands` and `args` being overwritten when using multiple containers ([#23338](https://github.com/hashicorp/terraform-provider-azurerm/issues/23338))\n* `azurerm_key_vault_certificate` - fix issue where certificates couldn't be recovered anymore ([#23204](https://github.com/hashicorp/terraform-provider-azurerm/issues/23204))\n* `azurerm_key_vault_key` - the ForceNew when `expiration_date` is removed from the config file ([#23327](https://github.com/hashicorp/terraform-provider-azurerm/issues/23327))\n* `azurerm_linux_function_app` - fix a bug in setting the storage settings when using Elastic Premium plans ([#21212](https://github.com/hashicorp/terraform-provider-azurerm/issues/21212))\n* `azurerm_linux_web_app` - fix docker app stack update ([#23303](https://github.com/hashicorp/terraform-provider-azurerm/issues/23303))\n* `azurerm_linux_web_app` - fix crash in auto heal expansion ([#21328](https://github.com/hashicorp/terraform-provider-azurerm/issues/21328))\n* `azurerm_linux_web_app_slot` - fix docker app stack update ([#23303](https://github.com/hashicorp/terraform-provider-azurerm/issues/23303))\n* `azurerm_linux_web_app_slot` - fix crash in auto heal expansion ([#21328](https://github.com/hashicorp/terraform-provider-azurerm/issues/21328))\n* `azurerm_log_analytics_solution` - fix bug where the resource wasn't handling successful creation on subsequent applies ([#23312](https://github.com/hashicorp/terraform-provider-azurerm/issues/23312))\n* `azurerm_management_group_subscription_association` - fix bug to correctly mark resource as gone if not found during read ([#23335](https://github.com/hashicorp/terraform-provider-azurerm/issues/23335))\n* `azurerm_mssql_elasticpool` - remove check that prevents `license_type` from being set for certain skus ([#23262](https://github.com/hashicorp/terraform-provider-azurerm/issues/23262))\n* `azurerm_servicebus_queue` - fixing an issue where `auto_delete_on_idle` couldn't be set to `P10675199DT2H48M5.4775807S` ([#23296](https://github.com/hashicorp/terraform-provider-azurerm/issues/23296))\n* `azurerm_servicebus_topic` - fixing an issue where `auto_delete_on_idle` couldn't be set to `P10675199DT2H48M5.4775807S` ([#23296](https://github.com/hashicorp/terraform-provider-azurerm/issues/23296))\n* `azurerm_storage_account` - prevent sending unsupported blob properties in payload for `Storage` account kind ([#23288](https://github.com/hashicorp/terraform-provider-azurerm/issues/23288))\n* `azurerm_synapse_sql_pool` - expose `storage_account_type` ([#23217](https://github.com/hashicorp/terraform-provider-azurerm/issues/23217))\n* `azurerm_windows_function_app` - fix a bug in setting the storage settings when using Elastic Premium plans ([#21212](https://github.com/hashicorp/terraform-provider-azurerm/issues/21212))\n* `azurerm_windows_web_app` - fix docker app stack update ([#23303](https://github.com/hashicorp/terraform-provider-azurerm/issues/23303))\n* `azurerm_windows_web_app_slot` - fix docker app stack update ([#23303](https://github.com/hashicorp/terraform-provider-azurerm/issues/23303))\n\nDEPRECATIONS:\n\n* `azurerm_application_gateway` - deprecate `Standard` and `WAF` skus ([#23310](https://github.com/hashicorp/terraform-provider-azurerm/issues/23310))\n* `azurerm_bot_channel_web_chat` - deprecate `site_names` in favour of `site` block ([#23161](https://github.com/hashicorp/terraform-provider-azurerm/issues/23161))\n* `azurerm_monitor_diagnostic_setting` - deprecate `retention_policy` in favour of `azurerm_storage_management_policy` ([#23260](https://github.com/hashicorp/terraform-provider-azurerm/issues/23260))\n\n## 3.73.0 (September 14, 2023)\n\nFEATURES:\n\n* **New Resource**: `azurerm_iothub_endpoint_cosmosdb_account` ([#23065](https://github.com/hashicorp/terraform-provider-azurerm/issues/23065))\n* **New Resource**: `azurerm_virtual_hub_routing_intent` ([#23138](https://github.com/hashicorp/terraform-provider-azurerm/issues/23138))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.1.1` of `github.com/btubbs/datetime` ([#23221](https://github.com/hashicorp/terraform-provider-azurerm/issues/23221))\n* dependencies: updating to `v1.3.1` of `github.com/google/uuid` ([#23221](https://github.com/hashicorp/terraform-provider-azurerm/issues/23221))\n* dependencies: updating to `v0.61.0` of `github.com/hashicorp/go-azure-helpers` ([#23249](https://github.com/hashicorp/terraform-provider-azurerm/issues/23249))\n* dependencies: updating to `v0.20230907.1113401` of `github.com/hashicorp/go-azure-sdk` ([#23221](https://github.com/hashicorp/terraform-provider-azurerm/issues/23221))\n* dependencies: updating to `v1.5.0` of `github.com/hashicorp/go-hclog` ([#23221](https://github.com/hashicorp/terraform-provider-azurerm/issues/23221))\n* dependencies: updating to `v2.29.0` of `github.com/hashicorp/terraform-plugin-sdk/v2` ([#23221](https://github.com/hashicorp/terraform-provider-azurerm/issues/23221))\n* dependencies: updating to `v1.5.1` of `github.com/hashicorp/terraform-plugin-testing` ([#23221](https://github.com/hashicorp/terraform-provider-azurerm/issues/23221))\n* dependencies: updating to `v1.20.2` of `github.com/rickb777/date` ([#23221](https://github.com/hashicorp/terraform-provider-azurerm/issues/23221))\n* dependencies: updating to `v0.13.0` of `golang.org/x/crypto` ([#23221](https://github.com/hashicorp/terraform-provider-azurerm/issues/23221))\n* dependencies: updating to `v0.15.0` of `golang.org/x/net` ([#23221](https://github.com/hashicorp/terraform-provider-azurerm/issues/23221))\n* dependencies: updating to `v0.13.0` of `golang.org/x/tools` ([#23221](https://github.com/hashicorp/terraform-provider-azurerm/issues/23221))\n* `azurerm_bot_channel_ms_teams` - support for `deployment_environment` ([#23122](https://github.com/hashicorp/terraform-provider-azurerm/issues/23122))\n* `azurerm_managed_disk` - updating to use API Version `2023-04-02` ([#23233](https://github.com/hashicorp/terraform-provider-azurerm/issues/23233))\n* `azurerm_managed_disk` - support for `optimized_frequent_attach_enabled` ([#23241](https://github.com/hashicorp/terraform-provider-azurerm/issues/23241))\n* `azurerm_managed_disk` - support for `performance_plus_enabled` ([#23241](https://github.com/hashicorp/terraform-provider-azurerm/issues/23241))\n* `azurerm_maps_account` - support for `local_authentication_enabled` ([#23216](https://github.com/hashicorp/terraform-provider-azurerm/issues/23216))\n* `azurerm_mssql_elasticpool` - support for configuring `license_type` when using the `Hyperscale` sku ([#23256](https://github.com/hashicorp/terraform-provider-azurerm/issues/23256))\n* `azurerm_security_center_assessment_policy` - refactoring to use `hashicorp/go-azure-sdk` ([#23158](https://github.com/hashicorp/terraform-provider-azurerm/issues/23158))\n\nBUG FIXES:\n\n* `azurerm_api_management` - split create and update methods  ([#23259](https://github.com/hashicorp/terraform-provider-azurerm/issues/23259))\n* `azurerm_api_management_backend` - fixing a panic when flattening the `credentials` block ([#23219](https://github.com/hashicorp/terraform-provider-azurerm/issues/23219))\n* `azurerm_key_vault_certificate` - fixing a regression where certificates from a custom/unknown issuer would be polled indefinitely ([#23214](https://github.com/hashicorp/terraform-provider-azurerm/issues/23214))\n* `azurerm_redis_cache` - prevent sending `redis_configuration.aof_backup_enabled` when the sku is not `Premium` to avoid API error ([#22774](https://github.com/hashicorp/terraform-provider-azurerm/issues/22774))\n* `azurerm_web_application_firewall_policy` - capture and toggle state of `custom_rule` blocks with an `enabled` field ([#23163](https://github.com/hashicorp/terraform-provider-azurerm/issues/23163))\n\n## 3.72.0 (September 07, 2023)\n\nFEATURES:\n\n* Provider Feature: subscription cancellation on `destroy` can now be disabled via the provider `features` block ([#19936](https://github.com/hashicorp/terraform-provider-azurerm/issues/19936))\n* **New Data Source**: `netapp_volume_quota_rule` ([#23042](https://github.com/hashicorp/terraform-provider-azurerm/issues/23042))\n* **New Resource**: `azurerm_automation_python3_package` ([#23087](https://github.com/hashicorp/terraform-provider-azurerm/issues/23087))\n* **New Resource**: `netapp_volume_quota_rule` ([#23042](https://github.com/hashicorp/terraform-provider-azurerm/issues/23042))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230906.1160501` of `github.com/hashicorp/go-azure-sdk` ([#23191](https://github.com/hashicorp/terraform-provider-azurerm/issues/23191))\n* `containerapps`: updating to API Version `2023-05-01` ([#22804](https://github.com/hashicorp/terraform-provider-azurerm/issues/22804))\n* `keyvault`: upgrade remaining resources to `2023-02-01` ([#23089](https://github.com/hashicorp/terraform-provider-azurerm/issues/23089))\n* `redisenterprise`: updating to API Version `2023-07-01` ([#23178](https://github.com/hashicorp/terraform-provider-azurerm/issues/23178))\n* `vpngateway`: updating to use `hashicorp/go-azure-sdk` ([#22906](https://github.com/hashicorp/terraform-provider-azurerm/issues/22906))\n* `internal/sdk`: typed resources using a custom importer now get a timed context ([#23160](https://github.com/hashicorp/terraform-provider-azurerm/issues/23160))\n* `azurerm_batch_pool` - support for `accelerated_networking_enabled` ([#23021](https://github.com/hashicorp/terraform-provider-azurerm/issues/23021))\n* `azurerm_batch_pool` - support for `automatic_upgrade_enabled` ([#23021](https://github.com/hashicorp/terraform-provider-azurerm/issues/23021))\n* `azurerm_bot_channel_direct_line_speech` - support for the `cognitive_account_id` property ([#23106](https://github.com/hashicorp/terraform-provider-azurerm/issues/23106))\n* `azurerm_bot_service_azure_bot` - support for the `local_authentication_enabled` property ([#23096](https://github.com/hashicorp/terraform-provider-azurerm/issues/23096))\n* `azurerm_container_app_environment` - support for the `dapr_application_insights_connection_string` ([#23080](https://github.com/hashicorp/terraform-provider-azurerm/issues/23080))\n* `azurerm_cosmosdb_cassandra_datacenter` - refactoring to use `hashicorp/go-azure-sdk` ([#23110](https://github.com/hashicorp/terraform-provider-azurerm/issues/23110))\n* `azurerm_cosmosdb_cassandra_datacenter` - updating to API Version `2023-04-15` ([#23110](https://github.com/hashicorp/terraform-provider-azurerm/issues/23110))\n* `azurerm_kubernetes_cluster` - Azure CNI can be updated to use `overlay` ([#22709](https://github.com/hashicorp/terraform-provider-azurerm/issues/22709))\n* `azurerm_monitor_diagnostic_setting` - deprecating `retention_policy` within `enabled_log` ([#23029](https://github.com/hashicorp/terraform-provider-azurerm/issues/23029))\n* `azurerm_mssql_database` - split create and update methods ([#23209](https://github.com/hashicorp/terraform-provider-azurerm/issues/23209))\n* `azurerm_postgresql_database` - `collation` can now be set to `English_United Kingdom.1252` ([#23171](https://github.com/hashicorp/terraform-provider-azurerm/issues/23171))\n* `azurerm_postgresql_flexible_database` - `collation` can now be set to `English_United Kingdom.1252` ([#23171](https://github.com/hashicorp/terraform-provider-azurerm/issues/23171))\n* `azurerm_postgresql_flexible_server` - support for the `auto_grow_enabled` property ([#23069](https://github.com/hashicorp/terraform-provider-azurerm/issues/23069))\n* `azurerm_redis_enterprise_cluster` - support for Flash clusters in Brazil South ([#23200](https://github.com/hashicorp/terraform-provider-azurerm/issues/23200))\n* `azurerm_resource_provider_registration` - refactoring to use `hashicorp/go-azure-sdk` ([#23072](https://github.com/hashicorp/terraform-provider-azurerm/issues/23072))\n* `azurerm_virtual_machine_extension` - support for `provision_after_extensions` ([#23124](https://github.com/hashicorp/terraform-provider-azurerm/issues/23124))\n* `azurerm_virtual_network_gateway` - increasing the default timeout for create to `90m` ([#23003](https://github.com/hashicorp/terraform-provider-azurerm/issues/23003))\n* `azurerm_virtual_hub_connection` - support for `inbound_route_map_id`, `outbound_route_map_id`, and `static_vnet_local_route_override_criteria` properties ([#23049](https://github.com/hashicorp/terraform-provider-azurerm/issues/23049))\n\nBUG FIXES:\n\n* `azurerm_api_management_api_policy` - added state migration to mutate id's ending in `policies/policy` ([#23128](https://github.com/hashicorp/terraform-provider-azurerm/issues/23128))\n* `azurerm_api_management_api_operation_policy` - added state migration to mutate id's ending in `policies/policy` ([#23128](https://github.com/hashicorp/terraform-provider-azurerm/issues/23128))\n* `azurerm_api_management_product_policy` - added state migration to mutate id's ending in `policies/policy` ([#23128](https://github.com/hashicorp/terraform-provider-azurerm/issues/23128))\n* `azurerm_automation_account` - fixes logic for `local_authentication_enabled` ([#23082](https://github.com/hashicorp/terraform-provider-azurerm/issues/23082))\n* `azurerm_key_vault_managed_storage_account` - check id can be parsed correctly before setting it in state ([#23022](https://github.com/hashicorp/terraform-provider-azurerm/issues/23022))\n* `azurerm_monitor_diagnostic_setting` - fix `enabled_log` feature flagged schema ([#23093](https://github.com/hashicorp/terraform-provider-azurerm/issues/23093))\n* `azurerm_pim_active_role_assignment`: polling for the duration of the timeout, rather than a fixed 5 minute value ([#22932](https://github.com/hashicorp/terraform-provider-azurerm/issues/22932))\n* `azurerm_policy_set_definition` - only sending `parameters` when a value is configured ([#23155](https://github.com/hashicorp/terraform-provider-azurerm/issues/23155))\n* `azurerm_synapse_workspace` - fixes index out-of-range panic when parsing `storage_data_lake_gen2_filesystem_id` ([#23019](https://github.com/hashicorp/terraform-provider-azurerm/issues/23019))\n* `machine_learning_datastore_*` - fixes container ids ([#23140](https://github.com/hashicorp/terraform-provider-azurerm/issues/23140))\n* `azurerm_key_vault_certificate` - id now points to new version when certificate is updated ([#23135](https://github.com/hashicorp/terraform-provider-azurerm/issues/23135))\n* `azurerm_site_recovery_replicated_vm` - update `network_interface` diff so replicated items now can be updated ([#23199](https://github.com/hashicorp/terraform-provider-azurerm/issues/23199))\n\nDEPRECATION:\n\n* Data Source: `azure_monitor_log_profile` - Azure is retiring Azure Log Profiles on the 30th of September 2026 ([#23146](https://github.com/hashicorp/terraform-provider-azurerm/issues/23146))\n* `azure_monitor_log_profile` - Azure is retiring Azure Log Profiles on the 30th of September 2026 ([#23146](https://github.com/hashicorp/terraform-provider-azurerm/issues/23146))\n\n## 3.71.0 (August 24, 2023)\n\nBREAKING CHANGES:\n\n* **App Service `win32_status` property** - Due to a change made in the service to the underlying type of the Auto Heal property `win32_status` combined with a prior bug (in `v3.62.1` and earlier) causing the value of this property to be stored incorrectly in state as an empty string, the value of this property could not be updated or state migrated to accommodate the necessary type change in the state. This results in the resources named above returning an error of a number is needed when decoding the state for this value. Unfortunately, this is a breaking change and will require users of this field to change their Terraform Configuration. The field `win32_status` is replaced by `win32_status_code` (this remains an int, as in 3.63.0 onwards) for `azurerm_linux_web_app`, `azurerm_linux_web_app_slot`, `azurerm_windows_web_app`, `azurerm_windows_web_app_slot resources`. ([#23075](https://github.com/hashicorp/terraform-provider-azurerm/issues/23075))\n\nFEATURES:\n\n* **New Resource**: `azurerm_databricks_workspace_root_dbfs_customer_managed_key` ([#22579](https://github.com/hashicorp/terraform-provider-azurerm/issues/22579))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230824.1130652` of `github.com/hashicorp/go-azure-sdk` ([#23076](https://github.com/hashicorp/terraform-provider-azurerm/issues/23076))\n* `trafficmanager`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22579](https://github.com/hashicorp/terraform-provider-azurerm/issues/22579))\n* `webpubsub`: updating to use the transport layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22579](https://github.com/hashicorp/terraform-provider-azurerm/issues/22579))\n* `automation`: upgrade remaining resources to `2022-08-08` ([#22989](https://github.com/hashicorp/terraform-provider-azurerm/issues/22989))\n* `azurerm_storage_management_policy` - move to `hashicorp/go-azure-sdk` ([#23035](https://github.com/hashicorp/terraform-provider-azurerm/issues/23035))\n* Data Source: `azurerm_disk_encryption_set` -  support for the `identity` block ([#23005](https://github.com/hashicorp/terraform-provider-azurerm/issues/23005))\n* `azurerm_container_group` - support for the `sku` and `(init_)container.*.security` properties ([#23034](https://github.com/hashicorp/terraform-provider-azurerm/issues/23034))\n* `azurerm_kubernetes_cluster` -  extend allowed ranges for various `sysctl_config` attribute ranges ([#23077](https://github.com/hashicorp/terraform-provider-azurerm/issues/23077))\n* `azurerm_kubernetes_cluster_node_pool` -  extend allowed ranges for various `sysctl_config` attribute ranges ([#23077](https://github.com/hashicorp/terraform-provider-azurerm/issues/23077))\n* `azurerm_kubernetes_cluster` - clusters can be updated to use the `cilium` dataplane by setting the value in `ebpf_data_plane` ([#22952](https://github.com/hashicorp/terraform-provider-azurerm/issues/22952))\n* `azurerm_linux_virtual_machine_scale_set` - cancel rolling upgrades that are in progress before destroying the resource ([#22991](https://github.com/hashicorp/terraform-provider-azurerm/issues/22991))\n* `azurerm_servicebus_namespace` - support for `network_rule_set` block ([#23057](https://github.com/hashicorp/terraform-provider-azurerm/issues/23057))\n* `azurerm_windows_virtual_machine_scale_set` - cancel rolling upgrades that are in progress before destroying the resource ([#22991](https://github.com/hashicorp/terraform-provider-azurerm/issues/22991))\n* `azurerm_synapse_spark_pool` - support addtional values for the `node_size_family` property ([#23040](https://github.com/hashicorp/terraform-provider-azurerm/issues/23040))\n\nBUG FIXES:\n\n* `azurerm_api_management_policy` - fixes an error caused by a migration ([#23018](https://github.com/hashicorp/terraform-provider-azurerm/issues/23018))\n* `azurerm_kubernetes_cluster` - deprecate `public_network_access_enabled` and prevent sending it to the API since it isn't functional ([#22478](https://github.com/hashicorp/terraform-provider-azurerm/issues/22478))\n\n## 3.70.0 (August 17, 2023)\n\nFEATURES:\n\n* **New Resource**: `azurerm_mssql_virtual_machine_availability_group_listener` ([#22808](https://github.com/hashicorp/terraform-provider-azurerm/issues/22808))\n* **New Resource**: `azurerm_mssql_virtual_machine_group` ([#22808](https://github.com/hashicorp/terraform-provider-azurerm/issues/22808))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230815.1165905` of `github.com/hashicorp/go-azure-sdk` ([#22981](https://github.com/hashicorp/terraform-provider-azurerm/issues/22981))\n* `apimanagement`: updating to use `hashicorp/go-azure-sdk` ([#22783](https://github.com/hashicorp/terraform-provider-azurerm/issues/22783))\n* `cosmos`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22874](https://github.com/hashicorp/terraform-provider-azurerm/issues/22874))\n* `devtestlabs`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22981](https://github.com/hashicorp/terraform-provider-azurerm/issues/22981))\n* `policy`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22874](https://github.com/hashicorp/terraform-provider-azurerm/issues/22874))\n* `postgresql`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22874](https://github.com/hashicorp/terraform-provider-azurerm/issues/22874))\n* `recoveryservices`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22874](https://github.com/hashicorp/terraform-provider-azurerm/issues/22874))\n* `resources`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22874](https://github.com/hashicorp/terraform-provider-azurerm/issues/22874))\n* `storage`: updating Storage Account and Storage Blob Container to use Common IDs to enable migrating to `hashicorp/go-azure-sdk` in the future ([#22915](https://github.com/hashicorp/terraform-provider-azurerm/issues/22915))\n* Data Source: `azurerm_kubernetes_cluster` - add support for the `current_kubernetes_version` property ([#22986](https://github.com/hashicorp/terraform-provider-azurerm/issues/22986))\n* `azurerm_mssql_virtual_machine` - add support for the `sql_virtual_machine_group_id` and `wsfc_domain_credential` properties ([#22808](https://github.com/hashicorp/terraform-provider-azurerm/issues/22808))\n* `azurerm_netapp_pool` - `size_in_tb` can be sized down to 2 TB ([#22943](https://github.com/hashicorp/terraform-provider-azurerm/issues/22943))\n* `azurerm_stack_hci_cluster` - add support for the `automanage_configuration_id` property ([#22857](https://github.com/hashicorp/terraform-provider-azurerm/issues/22857))\n* Data Source: `azurerm_disk_encryption_set` - now exports `key_vault_key_url` ([#22893](https://github.com/hashicorp/terraform-provider-azurerm/issues/22893))\n* `azurerm_disk_encryption_set` - now exports `key_vault_key_url` ([#22893](https://github.com/hashicorp/terraform-provider-azurerm/issues/22893))\n\nBUG FIXES:\n\n* `azurerm_cognitive_deployment` - add lock on parent resource to prevent errors when deleting the resource ([#22940](https://github.com/hashicorp/terraform-provider-azurerm/issues/22940))\n* `azurerm_cost_management_scheduled_action` - fix update for `email_address_sender` ([#22930](https://github.com/hashicorp/terraform-provider-azurerm/issues/22930))\n* `azurerm_disk_encryption_set` - now correctly supports key rotation by specifying a versionless Key ID when setting `auto_key_rotation_enabled` to `true` ([#22893](https://github.com/hashicorp/terraform-provider-azurerm/issues/22893))\n* `azurerm_iothub_dps` - updating the validation for `target` within the `ip_filter_rule` block to match the values defined in the Azure API Definitions ([#22891](https://github.com/hashicorp/terraform-provider-azurerm/issues/22891))\n* `azurerm_postgresql_database` - reworking the validation for database collation ([#22928](https://github.com/hashicorp/terraform-provider-azurerm/issues/22928))\n* `azurerm_postgresql_flexible_database` - reworking the validation for database collation ([#22928](https://github.com/hashicorp/terraform-provider-azurerm/issues/22928))\n* `azurerm_storage_management_policy` - check for an existing resource to prevent overwriting property values ([#22966](https://github.com/hashicorp/terraform-provider-azurerm/issues/22966))\n* `azurerm_virtual_network_gateway_connection` - `custom_bgp_addresses.secondary` is now `Optional` rather than `Required` ([#22912](https://github.com/hashicorp/terraform-provider-azurerm/issues/22912))\n* `azurerm_web_application_firewall_policy` - fix handling not found in read ([#22982](https://github.com/hashicorp/terraform-provider-azurerm/issues/22982))\n\n## 3.69.0 (August 10, 2023)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_palo_alto_local_rulestack` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_graph_services_account` ([#22665](https://github.com/hashicorp/terraform-provider-azurerm/issues/22665))\n* **New Resource**: `azurerm_managed_lustre_file_system` ([#22680](https://github.com/hashicorp/terraform-provider-azurerm/issues/22680))\n* **New Resource**: `azurerm_palo_alto_local_rulestack` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_local_rulestack_certificate` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_local_rulestack_fqdn_list` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_local_rulestack_outbound_trust_certificate_association` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_local_rulestack_outbound_untrust_certificate_association`  ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_local_rulestack_prefix_list` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_local_rulestack_rule` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_virtual_network_appliance` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_next_generation_firewall_virtual_hub_local_rulestack` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_next_generation_firewall_virtual_hub_panorama` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_next_generation_firewall_virtual_network_local_rulestack` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n* **New Resource**: `azurerm_palo_alto_next_generation_firewall_virtual_network_panorama` ([#22700](https://github.com/hashicorp/terraform-provider-azurerm/issues/22700))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.58.0` of `github.com/hashicorp/go-azure-helpers` ([#22813](https://github.com/hashicorp/terraform-provider-azurerm/issues/22813))\n* dependencies: updating to `v0.20230808.1103829` of `github.com/hashicorp/go-azure-sdk` ([#22860](https://github.com/hashicorp/terraform-provider-azurerm/issues/22860))\n* `arckubernetes` - updating to use the `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` as a base layer ([#22815](https://github.com/hashicorp/terraform-provider-azurerm/issues/22815))\n* `bot` - updating to use the `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` as a base layer ([#22815](https://github.com/hashicorp/terraform-provider-azurerm/issues/22815))\n* `blueprints`: updating to use `hashicorp/go-azure-sdk` ([#21569](https://github.com/hashicorp/terraform-provider-azurerm/issues/21569))\n* `compute` - updating to use the `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` as a base layer ([#22860](https://github.com/hashicorp/terraform-provider-azurerm/issues/22860))\n* `digitaltwins` - updating to API Version `2023-01-31` ([#22782](https://github.com/hashicorp/terraform-provider-azurerm/issues/22782))\n* `hsm` - updating to use the `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` as a base layer ([#22815](https://github.com/hashicorp/terraform-provider-azurerm/issues/22815))\n* `hybridcompute` - updating to use the `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` as a base layer ([#22815](https://github.com/hashicorp/terraform-provider-azurerm/issues/22815))\n* Data Source: `azurerm_network_service_tags` - updating to use `hashicorp/go-azure-sdk` ([#22873](https://github.com/hashicorp/terraform-provider-azurerm/issues/22873))\n* Data Source: `azurerm_network_watcher` - updating to use `hashicorp/go-azure-sdk` ([#22873](https://github.com/hashicorp/terraform-provider-azurerm/issues/22873))\n* `azurerm_container_app_environment` - `log_analytics_workspace_id` is now an Optional property ([#22733](https://github.com/hashicorp/terraform-provider-azurerm/issues/22733))\n* `azurerm_digital_twins_instance` - support for User Assigned Identities ([#22782](https://github.com/hashicorp/terraform-provider-azurerm/issues/22782))\n* `azurerm_function_app_function` - hyphen and underscore are now allows characters for function names ([#22519](https://github.com/hashicorp/terraform-provider-azurerm/issues/22519))\n* `azurerm_key_vault_certificate` - Support update of certificates based on `certificate_policy` ([#20627](https://github.com/hashicorp/terraform-provider-azurerm/issues/20627))\n* `azurerm_kubernetes_cluster` - export the identity for Web App Routing under `web_app_routing_identity` ([#22809](https://github.com/hashicorp/terraform-provider-azurerm/issues/22809))\n* `azurerm_kubernetes_cluster` - add support for the `snapshot_id` property in the `default_node_pool` block ([#22708](https://github.com/hashicorp/terraform-provider-azurerm/issues/22708))\n* `azurerm_log_analytics_workspace` - support changing value of `sku` from `CapacityReservation` and `PerGB2018` ([#22597](https://github.com/hashicorp/terraform-provider-azurerm/issues/22597))\n* `azurerm_managed_application` - deprecate the `parameters` property in favour of `parameter_values` ([#21541](https://github.com/hashicorp/terraform-provider-azurerm/issues/21541))\n* `azurerm_monitor_action_group` - the value `https` is now supported for `aad_auth` ([#22888](https://github.com/hashicorp/terraform-provider-azurerm/issues/22888))\n* `azurerm_mssql_server` - `SystemAssigned, UserAssigned` identity is now supported ([#22828](https://github.com/hashicorp/terraform-provider-azurerm/issues/22828))\n* `azurerm_network_packet_capture` - updating to use `hashicorp/go-azure-sdk` ([#22873](https://github.com/hashicorp/terraform-provider-azurerm/issues/22873))\n* `azurerm_network_profile` - refactoring to use `hashicorp/go-azure-sdk` ([#22850](https://github.com/hashicorp/terraform-provider-azurerm/issues/22850))\n* `azurerm_network_watcher_flow_log` - updating to use `hashicorp/go-azure-sdk` ([#22873](https://github.com/hashicorp/terraform-provider-azurerm/issues/22873))\n* `azurerm_network_watcher` - updating to use `hashicorp/go-azure-sdk` ([#22873](https://github.com/hashicorp/terraform-provider-azurerm/issues/22873))\n* `azurerm_postgresql_database` - updating the validation for `collation` ([#22689](https://github.com/hashicorp/terraform-provider-azurerm/issues/22689))\n* `azurerm_postgresql_flexible_server_database` - updating the validation for `collation` ([#22689](https://github.com/hashicorp/terraform-provider-azurerm/issues/22689))\n* `azurerm_security_center_subscription_pricing` - support for `extensions` block  ([#22643](https://github.com/hashicorp/terraform-provider-azurerm/issues/22643))\n* `azurerm_security_center_subscription_pricing` - support for the `resource_type` `Api` ([#22844](https://github.com/hashicorp/terraform-provider-azurerm/issues/22844))\n* `azurerm_spring_cloud_configuration_service` - support for the `ca_certificate_id` property ([#22814](https://github.com/hashicorp/terraform-provider-azurerm/issues/22814))\n* `azurerm_virtual_desktop_workspace` - added support for the `public_network_access_enabled` property ([#22542](https://github.com/hashicorp/terraform-provider-azurerm/issues/22542))\n* `azurerm_virtual_machine_packet_capture` - updating to use `hashicorp/go-azure-sdk` ([#22873](https://github.com/hashicorp/terraform-provider-azurerm/issues/22873))\n* `azurerm_virtual_machine_scale_set_packet_capture` - updating to use `hashicorp/go-azure-sdk` ([#22873](https://github.com/hashicorp/terraform-provider-azurerm/issues/22873))\n* `azurerm_vpn_gateway_connection` - updating to use `hashicorp/go-azure-sdk` ([#22873](https://github.com/hashicorp/terraform-provider-azurerm/issues/22873))\n* `azurerm_vpn_server_configuration` - refactoring to use `hashicorp/go-azure-sdk` ([#22850](https://github.com/hashicorp/terraform-provider-azurerm/issues/22850))\n* `azurerm_vpn_server_configuration_policy_group` - refactoring to use `hashicorp/go-azure-sdk` ([#22850](https://github.com/hashicorp/terraform-provider-azurerm/issues/22850))\n* `azurerm_vpn_site` - refactoring to use `hashicorp/go-azure-sdk` ([#22850](https://github.com/hashicorp/terraform-provider-azurerm/issues/22850))\n\nBUG FIXES:\n\n* Data Source: `azurerm_virutal_machine` - correctly retrieve and set value for `power_state` ([#22851](https://github.com/hashicorp/terraform-provider-azurerm/issues/22851))\n* `azurerm_cdn_endpoint` - conditionally using `PUT` in place of `PATCH` when a field other than `tags` has changed ([#22662](https://github.com/hashicorp/terraform-provider-azurerm/issues/22662))\n* `azurerm_cdn_frontdoor_security_policy` - normalizing the value returned from the API for `cdn_frontdoor_domain_id` ([#22841](https://github.com/hashicorp/terraform-provider-azurerm/issues/22841))\n* `azurerm_container_group` - set `init_container.secure_environment_variables` into state correctly ([#22832](https://github.com/hashicorp/terraform-provider-azurerm/issues/22832))\n* `azurerm_custom_ip_prefix` - support for environments other than Azure Public ([#22812](https://github.com/hashicorp/terraform-provider-azurerm/issues/22812))\n* `azurerm_databricks_workspace` - update parse function for `machine_learning_workspace_id` field validation ([#22865](https://github.com/hashicorp/terraform-provider-azurerm/issues/22865))\n* `azurerm_key_vault` - fixing support for the `storage` Nested Item type ([#22707](https://github.com/hashicorp/terraform-provider-azurerm/issues/22707))\n* `azurerm_kusto_cosmosdb_data_connection_resource` - ensure the `subscriptionId` and `ResourceGroupName` align with the CosmosDB container ([#22663](https://github.com/hashicorp/terraform-provider-azurerm/issues/22663))\n* `azurerm_managed_application` - fix an issue where `secureString` parameters were not persisted to state ([#21541](https://github.com/hashicorp/terraform-provider-azurerm/issues/21541))\n* `azurerm_managed_application` - the `plan` block is now marked ForceNew to comply with service limitations ([#21541](https://github.com/hashicorp/terraform-provider-azurerm/issues/21541))\n* `azurerm_monitor_data_collection_rule` - recreate resource when attempting to remove `kind` ([#22811](https://github.com/hashicorp/terraform-provider-azurerm/issues/22811))\n* `azurerm_static_site_custom_domain` - prevent overwriting `validation_token` with an empty value by setting it into state when creating the resource ([#22848](https://github.com/hashicorp/terraform-provider-azurerm/issues/22848))\n\n## 3.68.0 (August 03, 2023)\n\nFEATURES:\n\n* **New Resource:** `azurerm_custom_ip_prefix` ([#21322](https://github.com/hashicorp/terraform-provider-azurerm/issues/21322))\n* **New Resource:**: `azurerm_mobile_network_sim` ([#22628](https://github.com/hashicorp/terraform-provider-azurerm/issues/22628))\n* **New Data Source:** `azurerm_mobile_network_sim` ([#22628](https://github.com/hashicorp/terraform-provider-azurerm/issues/22628))\n* **New Resource:** `azurerm_automation_variable_object` ([#22644](https://github.com/hashicorp/terraform-provider-azurerm/issues/22644))\n* **New Data Source:** `azurerm_automation_variable_object` ([#22644](https://github.com/hashicorp/terraform-provider-azurerm/issues/22644))\n\nENHANCEMENTS\n\n* dependencies: updating to `v0.20230803.1095722` of `github.com/hashicorp/go-azure-sdk` ([#22803](https://github.com/hashicorp/terraform-provider-azurerm/issues/22803))\n* dependencies: migrate mysql resources to `hashicorp/go-azure-sdk` ([#22795](https://github.com/hashicorp/terraform-provider-azurerm/issues/22795))\n* `advisor`: updating the base layer to use `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22750](https://github.com/hashicorp/terraform-provider-azurerm/issues/22750))\n* `apimanagement`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22759](https://github.com/hashicorp/terraform-provider-azurerm/issues/22759))\n* `analysisservices`: updating the base layer to use `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22750](https://github.com/hashicorp/terraform-provider-azurerm/issues/22750))\n* `automation`: updating `dscnodeconfiguration` and `sourcecontrol` to use API Version `2022-08-08` ([#22781](https://github.com/hashicorp/terraform-provider-azurerm/issues/22781))\n* `azurestackhci`: updating the base layer to use `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22750](https://github.com/hashicorp/terraform-provider-azurerm/issues/22750))\n* `domainservices`: updating the base layer to use `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22750](https://github.com/hashicorp/terraform-provider-azurerm/issues/22750))\n* `eventgrid`: refactoring to use `hashicorp/go-azure-sdk` ([#22673](https://github.com/hashicorp/terraform-provider-azurerm/issues/22673))\n* `machinelearningservice`: updating to use API Version `2023-04-01` ([#22729](https://github.com/hashicorp/terraform-provider-azurerm/issues/22729))\n* `monitor`: updating the base layer to use `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22750](https://github.com/hashicorp/terraform-provider-azurerm/issues/22750))\n* `network`: updating to use API Version `2023-04-01` ([#22727](https://github.com/hashicorp/terraform-provider-azurerm/issues/22727))\n* `relay`: updating to use API Version `2021-11-01` ([#22725](https://github.com/hashicorp/terraform-provider-azurerm/issues/22725))\n* Data Source: `azurerm_images` - support for `disk_encryption_set_id` ([#22690](https://github.com/hashicorp/terraform-provider-azurerm/issues/22690))\n* `azurerm_eventhub_namespace_customer_managed_key` - support for the `infrastructure_encryption_enabled` property ([#22718](https://github.com/hashicorp/terraform-provider-azurerm/issues/22718))\n* `azurerm_hpc_cache_blob_nfs_target` - support for setting the `usage_model` property to `READ_ONLY` and `READ_WRITE` ([#22798](https://github.com/hashicorp/terraform-provider-azurerm/issues/22798))\n* `azurerm_hpc_cache_nfs_target` - support for setting the `usage_model` property to `READ_ONLY` and `READ_WRITE` ([#22798](https://github.com/hashicorp/terraform-provider-azurerm/issues/22798))\n* `azurerm_monitor_aad_diagnostic_setting` - updating to use `hashicorp/go-azure-sdk` ([#22778](https://github.com/hashicorp/terraform-provider-azurerm/issues/22778))\n* `azurerm_web_application_firewall_policy` - updating to use API Version `2023-02-01` ([#22455](https://github.com/hashicorp/terraform-provider-azurerm/issues/22455))\n* `azurerm_web_application_firewall_policy` - support for `log_scrubbing` property ([#22522](https://github.com/hashicorp/terraform-provider-azurerm/issues/22522))\n* `azurerm_shared_image_gallery` - support for the `sharing` block ([#22221](https://github.com/hashicorp/terraform-provider-azurerm/issues/22221))\n* `azurerm_virtual_network` - support for the `encryption` block ([#22745](https://github.com/hashicorp/terraform-provider-azurerm/issues/22745))\n  \nBUG FIXES\n\n* provider: only obtaining an authentication token for Managed HSM in environments where Managed HSM is available ([#22400](https://github.com/hashicorp/terraform-provider-azurerm/issues/22400))\n* `azurerm_api_management` - retrieving the `location` from the API rather than the config prior to deletion ([#22752](https://github.com/hashicorp/terraform-provider-azurerm/issues/22752))\n* `azurerm_cognitive_deployment` - add locks to parent resource to prevent 409 error ([#22711](https://github.com/hashicorp/terraform-provider-azurerm/issues/22711))\n* `azurerm_pim_eligible_role_assignment` - fixing a bug where the context deadline was checked incorrectly during deletion ([#22756](https://github.com/hashicorp/terraform-provider-azurerm/issues/22756))\n* `azurerm_private_endpoint` - loading the subnet to lock from the API rather than the config during deletion ([#22676](https://github.com/hashicorp/terraform-provider-azurerm/issues/22676))\n* `azurerm_netapp_volume` - updating the validation of `security_style` to match the casing defined in the Azure API Definitions ([#22721](https://github.com/hashicorp/terraform-provider-azurerm/issues/22721))\n* `azurerm_netapp_volume_group_sap_hana` - update the validation of `security_style` to match the casing defined in the Azure API Definitions ([#22615](https://github.com/hashicorp/terraform-provider-azurerm/issues/22615))\n* `azurerm_site_recovery_replication_recovery_plan` - fix update for `boot_recovery_group`,`failover_recovery_group` and `shutdown_recovery_group` ([#22687](https://github.com/hashicorp/terraform-provider-azurerm/issues/22687))\n\n## 3.67.0 (July 27, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_eventhub_sas` ([#22215](https://github.com/hashicorp/terraform-provider-azurerm/issues/22215))\n* **New Resource**: `azurerm_kubernetes_cluster_trusted_access_role_binding` ([#22647](https://github.com/hashicorp/terraform-provider-azurerm/issues/22647))\n* **New Resource:** `azurerm_marketplace_role_assignment` ([#22398](https://github.com/hashicorp/terraform-provider-azurerm/issues/22398))\n* **New Resource:** `azurerm_network_function_azure_traffic_collector` ([#22274](https://github.com/hashicorp/terraform-provider-azurerm/issues/22274))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230726.1135558` of `github.com/hashicorp/go-azure-sdk` ([#22698](https://github.com/hashicorp/terraform-provider-azurerm/issues/22698))\n* `connections`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22681](https://github.com/hashicorp/terraform-provider-azurerm/issues/22681))\n* `iothub`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22681](https://github.com/hashicorp/terraform-provider-azurerm/issues/22681))\n* `mysql`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22681](https://github.com/hashicorp/terraform-provider-azurerm/issues/22681))\n* `orbital`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22681](https://github.com/hashicorp/terraform-provider-azurerm/issues/22681))\n* `powerbi`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22681](https://github.com/hashicorp/terraform-provider-azurerm/issues/22681))\n* `privatedns`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22681](https://github.com/hashicorp/terraform-provider-azurerm/issues/22681))\n* `purview`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22681](https://github.com/hashicorp/terraform-provider-azurerm/issues/22681))\n* `relay`: updating to use the base layer from `hashicorp/go-azure-sdk` rather than `Azure/go-autorest` ([#22681](https://github.com/hashicorp/terraform-provider-azurerm/issues/22681))\n* `azurerm_cdn_endpoint_custom_domain` - pass nil as version when Certificate/Secret version is set to Latest ([#22683](https://github.com/hashicorp/terraform-provider-azurerm/issues/22683))\n* `azurerm_image` - support for the field `disk_encryption_set_id` within the `os_disk` block ([#22642](https://github.com/hashicorp/terraform-provider-azurerm/issues/22642))\n* `azurerm_linux_virtual_machine` - add support for the `bypass_platform_safety_checks_on_user_schedule_enabled` and `reboot_setting` properties ([#22349](https://github.com/hashicorp/terraform-provider-azurerm/issues/22349))\n* `azurerm_network_interface` - updating to use `hashicorp/go-azure-sdk` and API Version `2023-02-01` ([#22479](https://github.com/hashicorp/terraform-provider-azurerm/issues/22479))\n* `azurerm_redis_enterprise_database` - support `redisSON` module for geo-replication ([#22627](https://github.com/hashicorp/terraform-provider-azurerm/issues/22627))\n* `azurerm_windows_virtual_machine` - add support for the `bypass_platform_safety_checks_on_user_schedule_enabled` and `reboot_setting` properties ([#22349](https://github.com/hashicorp/terraform-provider-azurerm/issues/22349))\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_account` - `type` within the `backup` block is updated separately when set to `Continuous` ([#22638](https://github.com/hashicorp/terraform-provider-azurerm/issues/22638))\n* `azurerm_cosmosdb_account` - `max_age_in_seconds` within the `cors_rule` block is now Optional and can now be configured up to `2147483647` ([#22552](https://github.com/hashicorp/terraform-provider-azurerm/issues/22552))\n* `azurerm_maintenance_configuration` - fixing a bug where include and exclude were set incorrectly ([#22671](https://github.com/hashicorp/terraform-provider-azurerm/issues/22671))\n* `azurerm_pim_eligible_role_assignment` - polling for the duration of the timeout, rather than using a hard-coded value ([#22682](https://github.com/hashicorp/terraform-provider-azurerm/issues/22682))\n* `azurerm_redis_cache` - only updating `patch_schedule` when it has changed in the config file ([#22661](https://github.com/hashicorp/terraform-provider-azurerm/issues/22661))\n* `azurerm_logic_app_standard` - attribute `auto_swap_slot_name` is now under correct block `site_config` ([#22712](https://github.com/hashicorp/terraform-provider-azurerm/issues/22712))\n* `azurerm_postgresql_flexible_server` - update the validation of `storage_mb` replacing `33554432` with `33553408` ([#22706](https://github.com/hashicorp/terraform-provider-azurerm/issues/22706))\n\n## 3.66.0 (July 20, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_mobile_network_attached_data_network` ([#22168](https://github.com/hashicorp/terraform-provider-azurerm/issues/22168))\n* **New Resource:** `azurerm_graph_account` ([#22334](https://github.com/hashicorp/terraform-provider-azurerm/issues/22334))\n* **New Resource:** `azurerm_mobile_network_attached_data_network` ([#22168](https://github.com/hashicorp/terraform-provider-azurerm/issues/22168))\n\nENHANCEMENTS:\n\n* dependencies: bump `go-azure-sdk` to `v0.20230720.1190320` and switch `machinelearning`, `mixedreality`, `mariadb`, `storagecache`, `storagepool`, `vmware`, `videoanalyzer`, `voiceServices` and `mobilenetwork` to new base layer ([#22538](https://github.com/hashicorp/terraform-provider-azurerm/issues/22538))\n* dependencies: move `azurerm_bastion_host` and `azurerm_network_connection_monitor` over to `hashicorp/go-azure-sdk` ([#22425](https://github.com/hashicorp/terraform-provider-azurerm/issues/22425))\n* dependencies: move `azurerm_network_watcher_flow_log` to `hashicorp/go-azure-sdk` ([#22575](https://github.com/hashicorp/terraform-provider-azurerm/issues/22575))\n* dependencies: move `mysql` resources over to `hashicorp/go-azure-sdk` ([#22528](https://github.com/hashicorp/terraform-provider-azurerm/issues/22528))\n* dependencies: move `storage_sync` resources over to `hashicorp/go-azure-sdk` ([#21928](https://github.com/hashicorp/terraform-provider-azurerm/issues/21928))\n* dependencies: updating to API Version `2022-08-08` ([#22440](https://github.com/hashicorp/terraform-provider-azurerm/issues/22440))\n* `postgres` - updating to API Version `2023-03-01-preview` ([#22577](https://github.com/hashicorp/terraform-provider-azurerm/issues/22577))\n* `data.azurerm_route_table` - support for the `bgp_route_propagation_enabled` property ([#21940](https://github.com/hashicorp/terraform-provider-azurerm/issues/21940))\n* `data.azurerm_servicebus_*` - add deprecation messages for the `resource_group_name` and `namespace_name` properties ([#22521](https://github.com/hashicorp/terraform-provider-azurerm/issues/22521))\n* `azurerm_cdn_frontdoor_rule` - allow the `conditions.x.url_path_condition.x.match_values` property to be set to `/` ([#22610](https://github.com/hashicorp/terraform-provider-azurerm/issues/22610))\n* `azurerm_eventhub_namespace` - updates properly when encryption is enabled ([#22625](https://github.com/hashicorp/terraform-provider-azurerm/issues/22625))\n* `azurerm_logic_app_standard` - now exports the `auto_swap_slot_name` attribute ([#22525](https://github.com/hashicorp/terraform-provider-azurerm/issues/22525))\n* `azurerm_mysql_flexible_server_configuration` - the `value` property can now be changed without creating a new resource ([#22557](https://github.com/hashicorp/terraform-provider-azurerm/issues/22557))\n* `azurerm_postgresql_flexible_server` - support for `33554432` storage ([#22574](https://github.com/hashicorp/terraform-provider-azurerm/issues/22574))\n* `azurerm_postgresql_flexible_server` - support for the `geo_backup_key_vault_key_id` and `geo_backup_user_assigned_identity_id` properties ([#22612](https://github.com/hashicorp/terraform-provider-azurerm/issues/22612))\n* `azurerm_spring_cloud_service` - support for the `marketplace` block ([#22553](https://github.com/hashicorp/terraform-provider-azurerm/issues/22553))\n* `azurerm_spring_cloud_service` - support for the `outbound_type` property ([#22596](https://github.com/hashicorp/terraform-provider-azurerm/issues/22596))\n\nBUG FIXES:\n\n* provider: the Resource Providers `Microsoft.Kubernetes` and `Microsoft.KubernetesConfiguration` are no longer automatically registered ([#22580](https://github.com/hashicorp/terraform-provider-azurerm/issues/22580))\n* `data.automation_account_variables` - correctly populate missing variable attributes ([#22611](https://github.com/hashicorp/terraform-provider-azurerm/issues/22611))\n* `data.azurerm_virtual_machine_scale_set` - fix an issue where `computer_name`, `latest_model_applied`, `power_state` and `virtual_machine_id` attributes were not correctly set ([#22566](https://github.com/hashicorp/terraform-provider-azurerm/issues/22566))\n* `azurerm_app_service_public_certificate` - poll for certificate during read to get around an eventual consistency bug ([#22587](https://github.com/hashicorp/terraform-provider-azurerm/issues/22587))\n* `azurerm_application_gateway` - send `min_protocol_version` and correct `policy_type` when using `CustomV2` ([#22535](https://github.com/hashicorp/terraform-provider-azurerm/issues/22535))\n* `azurerm_cognitive_deployment` - remove upper limit on validation for the `capacity` property in the `scale` block ([#22502](https://github.com/hashicorp/terraform-provider-azurerm/issues/22502))\n* `azurerm_cosmosdb_account` - fixed regression to `default_identity_type` being switched to `FirstPartyIdentity` on update ([#22609](https://github.com/hashicorp/terraform-provider-azurerm/issues/22609))\n* `azurerm_kubernetes_cluster` - the `windows_profile.admin_password` property will become Required in `v4.0` ([#22554](https://github.com/hashicorp/terraform-provider-azurerm/issues/22554))\n* `azurerm_kusto_cluster` - the `engine` property is deprecataed and is now non functional as the service team intends to remove it from the API ([#22497](https://github.com/hashicorp/terraform-provider-azurerm/issues/22497))\n* `azurerm_maintenance_configuration` - tge `package_names_mask_to_exclude` and `package_names_mask_to_exclude` properties are not set properly ([#22555](https://github.com/hashicorp/terraform-provider-azurerm/issues/22555))\n* `azurerm_redis_cache` - only set the `rdb_backup_enabled` property when using a premium SKU ([#22309](https://github.com/hashicorp/terraform-provider-azurerm/issues/22309))\n* `azurerm_site_recovery_replication_recovery_plan` - fix an issue where the order of boot recovery groups was not correctly maintained ([#22348](https://github.com/hashicorp/terraform-provider-azurerm/issues/22348))\n* `azurerm_synapse_firewall_rule` - correct an overly strict validation for the `name` property ([#22571](https://github.com/hashicorp/terraform-provider-azurerm/issues/22571))\n\n## 3.65.0 (July 13, 2023)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_communication_service` ([#22426](https://github.com/hashicorp/terraform-provider-azurerm/issues/22426))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230712.1084117` of `github.com/hashicorp/go-azure-sdk` ([#22491](https://github.com/hashicorp/terraform-provider-azurerm/issues/22491))\n* dependencies: updating to `v0.20230703.1101016` of `github.com/tombuildsstuff/kermit` ([#22390](https://github.com/hashicorp/terraform-provider-azurerm/issues/22390))\n* provider: the Resource Providers `Microsoft.Kubernetes` and `Microsoft.KubernetesConfiguration` are now automatically registered ([#22463](https://github.com/hashicorp/terraform-provider-azurerm/issues/22463))\n* `automation/dscconfiguration` - updating to API Version `2022-08-08` ([#22403](https://github.com/hashicorp/terraform-provider-azurerm/issues/22403))\n* `azurestackhcl` - updating to API Version `2023-03-01` ([#22411](https://github.com/hashicorp/terraform-provider-azurerm/issues/22411))\n* `batch` - updating to use API Version `2023-05-01` ([#22412](https://github.com/hashicorp/terraform-provider-azurerm/issues/22412))\n* `datafactory` - moving `azurerm_data_factory` and `azurerm_data_factory_managed_private_endpoint` over to `hashicorp/go-azure-sdk` ([#22409](https://github.com/hashicorp/terraform-provider-azurerm/issues/22409))\n* `elastic` - updating to API Version `2023-06-01` ([#22451](https://github.com/hashicorp/terraform-provider-azurerm/issues/22451))\n* `kusto` - updating to API Version `2023-05-02` [GH-22410\n* `managedapplications` - migrate to `hashicorp/go-azure-sdk` ([#21571](https://github.com/hashicorp/terraform-provider-azurerm/issues/21571))\n* `privatedns`: updating to API Version `2020-06-01` ([#22470](https://github.com/hashicorp/terraform-provider-azurerm/issues/22470))\n* `storage` - updating to Data Plane API Version `2020-08-04` ([#22405](https://github.com/hashicorp/terraform-provider-azurerm/issues/22405))\n* `network` - `application_security_group` and `private_endpoint` now use `hashicorp/go-azure-sdk` ([#22396](https://github.com/hashicorp/terraform-provider-azurerm/issues/22396))\n* `voiceservices`: updating to use API Version `2023-04-03` ([#22469](https://github.com/hashicorp/terraform-provider-azurerm/issues/22469))\n* Data Source: `azurerm_kubernetes_cluster` - add support for the `internal_ingress_gateway_enabled` and `external_ingress_gateway_enabled` properties ([#22393](https://github.com/hashicorp/terraform-provider-azurerm/issues/22393))\n* `azurerm_batch_account` - support for the `network_profile` block ([#22356](https://github.com/hashicorp/terraform-provider-azurerm/issues/22356))\n* `azurerm_container_app` - the `min_replicas` and `max_replicas` propertiesnow support a maximum value of `300` ([#22511](https://github.com/hashicorp/terraform-provider-azurerm/issues/22511))\n* `azurerm_dns_zone` - can now use the `host_name` property with `dns_zone` for `soa_record` creation ([#22312](https://github.com/hashicorp/terraform-provider-azurerm/issues/22312))\n* `azurerm_kubernetes_cluster` - add support for the `internal_ingress_gateway_enabled` and `external_ingress_gateway_enabled` properties ([#22393](https://github.com/hashicorp/terraform-provider-azurerm/issues/22393))\n* `azurerm_site_recovery_vmware_replication_policy_association` - update validation to correctly handle case ([#22443](https://github.com/hashicorp/terraform-provider-azurerm/issues/22443))\n\n## 3.64.0 (July 06, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_automation_variables` ([#22216](https://github.com/hashicorp/terraform-provider-azurerm/issues/22216))\n* **New Resource:** `azurerm_arc_private_link_scope` ([#22314](https://github.com/hashicorp/terraform-provider-azurerm/issues/22314))\n* **New Resource:** `azurerm_kusto_cosmosdb_data_connection` ([#22295](https://github.com/hashicorp/terraform-provider-azurerm/issues/22295))\n* **New Resource:** `azurerm_pim_active_role_assignment` ([#20731](https://github.com/hashicorp/terraform-provider-azurerm/issues/20731))\n* **New Resource:** `azurerm_pim_eligible_role_assignment` ([#20731](https://github.com/hashicorp/terraform-provider-azurerm/issues/20731))\n\nENHANCEMENTS:\n\n* dependencies: `web`: updating to API Version `2022-09-01` ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* dependencies: `cognitive`: updating to API Version `2023-05-01` ([#22223](https://github.com/hashicorp/terraform-provider-azurerm/issues/22223))\n* dependencies: updating to `v1.53.0` of `google.golang.org/grpc` ([#22383](https://github.com/hashicorp/terraform-provider-azurerm/issues/22383))\n* `azurerm_cognitive_deployment` - suppot for the `scale` block propeties `tier`, `size`, `family`, and `capacity` ([#22223](https://github.com/hashicorp/terraform-provider-azurerm/issues/22223))\n* `azurerm_linux_function_app` - added support for the `public_network_access_enabled` property ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_linux_function_app_slot` - added support for the `public_network_access_enabled` property ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_linux_web_app` - added support for the `public_network_access_enabled` property ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_linux_web_app_slot`  - added support for the `public_network_access_enabled` property ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_windows_function_app` - added support for the `public_network_access_enabled` property ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_windows_function_app_slot` - added support for the `public_network_access_enabled` property\n* `azurerm_windows_web_app` - added support for the `public_network_access_enabled` property ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_windows_web_app_slot` - added support for the `public_network_access_enabled` property ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_stream_analytics_output_blob` - increase the `batch_min_rows` property allowed values to `1000000` ([#22331](https://github.com/hashicorp/terraform-provider-azurerm/issues/22331))\n* `azurerm_spring_cloud_gateway` - support for the the `allowed_origin_patterns` property ([#22317](https://github.com/hashicorp/terraform-provider-azurerm/issues/22317))\n\nBUG FIXES:\n\n* Data Source `azurerm_virtual_machine_scale_set` - prevent a nil pointer panic during reads ([#22335](https://github.com/hashicorp/terraform-provider-azurerm/issues/22335))\n* `azurerm_application_insights_api_key` - prevent a nil pointer panic ([#22388](https://github.com/hashicorp/terraform-provider-azurerm/issues/22388))\n* `azurerm_linux_function_app` - the `allowed_origins` property in the `cors` block now has a minimum entry count of `1` ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_linux_function_app_slot` - the `allowed_origins` property in the `cors` block now has a minimum entry count of `1` ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_linux_web_app` - the `allowed_origins` property in the `cors` block now has a minimum entry count of `1` ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_linux_web_app` - prevent a nil pointer panic in docker settings processing ([#22347](https://github.com/hashicorp/terraform-provider-azurerm/issues/22347))\n* `azurerm_linux_web_app_slot`  - the `allowed_origins` property in the `cors` block now has a minimum entry count of `1` ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_private_dns_resolver_forwarding_rule_resource` - changing the `domain_name` property now creates a new resource ([#22375](https://github.com/hashicorp/terraform-provider-azurerm/issues/22375))\n* `azurerm_windows_function_app` - the `allowed_origins` property in the `cors` block now has a minimum entry count of `1` ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_windows_function_app_slot` - the `allowed_origins` property in the `cors` block now has a minimum entry count of `1` ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_windows_web_app` - the `allowed_origins` property in the `cors` block now has a minimum entry count of `1` ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_windows_web_app_slot` - the `allowed_origins` property in the `cors` block now has a minimum entry count of `1` ([#22352](https://github.com/hashicorp/terraform-provider-azurerm/issues/22352))\n* `azurerm_network_security_rule` - improve validation of the `name` property and prevent creation of resources that are broken ([#22336](https://github.com/hashicorp/terraform-provider-azurerm/issues/22336))\n\nDEPRECATION:\n\n* `media` - all resources and data sources are deprecated ahead of service being retired ([#22350](https://github.com/hashicorp/terraform-provider-azurerm/issues/22350))\n\n## 3.63.0 (June 29, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_network_manager_network_group` ([#22277](https://github.com/hashicorp/terraform-provider-azurerm/issues/22277))\n\nBREAKING CHANGES:\n\n* `azurerm_linux_web_app` - the `win32_status` property of the `status_code` block in `auto_heal` has changed from `string` to `int`.  ([#22003](https://github.com/hashicorp/terraform-provider-azurerm/issues/22003))\n* `azurerm_linux_web_app_slot` -the `win32_status` property of the `status_code` block in `auto_heal` has changed from `string` to `int`.  ([#22003](https://github.com/hashicorp/terraform-provider-azurerm/issues/22003))\n* `azurerm_windows_web_app` - the `win32_status` property of the `status_code` block in `auto_heal` has changed from `string` to `int`.  ([#22003](https://github.com/hashicorp/terraform-provider-azurerm/issues/22003))\n* `azurerm_windows_web_app_slot` - the `win32_status` property of the `status_code` block in `auto_heal` has changed from `string` to `int`.  ([#22003](https://github.com/hashicorp/terraform-provider-azurerm/issues/22003))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230623.1103505` of `github.com/hashicorp/go-azure-sdk` ([#22263](https://github.com/hashicorp/terraform-provider-azurerm/issues/22263))\n* dependencies: updating to `v0.57.0` of `github.com/hashicorp/go-azure-helpers` ([#22247](https://github.com/hashicorp/terraform-provider-azurerm/issues/22247))\n* dependencies: `containers/containerinstance`: updating to API Version `2023-05-01` ([#22276](https://github.com/hashicorp/terraform-provider-azurerm/issues/22276))\n* dependencies: `network/securityrules`: migrate to `go-azure-sdk` ([#22242](https://github.com/hashicorp/terraform-provider-azurerm/issues/22242))\n* dependencies: `redis`: updating to API Version `2023-04-01` ([#22285](https://github.com/hashicorp/terraform-provider-azurerm/issues/22285))\n* Data Source: `azurerm_kubernetes_cluster` - add support for the `custom_ca_trust_certificates_base64` property ([#22032](https://github.com/hashicorp/terraform-provider-azurerm/issues/22032))\n* `azurerm_automation_software_update_configuration` - the `duration` property now defaults to `PT2H` as per the service. ([#22204](https://github.com/hashicorp/terraform-provider-azurerm/issues/22204))\n* `azurerm_automation_software_update_configuration` - the `schedule` block is now limited to `1`, to match the API limit. ([#22204](https://github.com/hashicorp/terraform-provider-azurerm/issues/22204))\n* `azurerm_automation_software_update_configuration` - the `schedule` block is now `Required` to match the API specification. The API  rejects requests that do not specify this block, with at least a `frequency` value. ([#22204](https://github.com/hashicorp/terraform-provider-azurerm/issues/22204))\n* `azurerm_automation_software_update_configuration` - the `frequency` property is now a `Required` property of the `schedule` block. This is to match the minimum requirements of the API. ([#22204](https://github.com/hashicorp/terraform-provider-azurerm/issues/22204))\n* `azurerm_automation_software_update_configuration` - the `pre_task` blocks are now limited to `1` to match the API. ([#22204](https://github.com/hashicorp/terraform-provider-azurerm/issues/22204))\n* `azurerm_automation_software_update_configuration` - the `post_task` blocks are now limited to `1` to match the API. ([#22204](https://github.com/hashicorp/terraform-provider-azurerm/issues/22204))\n* `azurerm_automation_software_update_configuration` - the `operating_system` property is deprecated and is now controlled by the presence of either a `linux` or `windows` block. ([#22204](https://github.com/hashicorp/terraform-provider-azurerm/issues/22204))\n* `azurerm_automation_software_update_configuration` - one of the `linux` or `windows` blocks must now be present. This is a requirement of the API, so is a non-breaking `Optional` to `Required` change. ([#22204](https://github.com/hashicorp/terraform-provider-azurerm/issues/22204))\n* `azurerm_automation_software_update_configuration` - the `monthly_occurrence` blocks are now limited to `1` to match the API. ([#22204](https://github.com/hashicorp/terraform-provider-azurerm/issues/22204))\n* `azurerm_container_app` - support for both system and user assigned identities at the same time ([#21149](https://github.com/hashicorp/terraform-provider-azurerm/issues/21149))\n* `azurerm_key_vault_managed_hardware_security_module` - support for activating an HSM through `security_domain_key_vault_certificate_ids` ([#22162](https://github.com/hashicorp/terraform-provider-azurerm/issues/22162))\n* `azurerm_kubernetes_cluster` - support for the `custom_ca_trust_certificates_base64` property ([#22032](https://github.com/hashicorp/terraform-provider-azurerm/issues/22032))\n* `azurerm_kubernetes_cluster` - support for the `maintenance_window_auto_upgrade` block ([#21760](https://github.com/hashicorp/terraform-provider-azurerm/issues/21760))\n* `azurerm_kubernetes_cluster` - support for the `maintenance_window_node_os` block ([#21760](https://github.com/hashicorp/terraform-provider-azurerm/issues/21760))\n* `azurerm_monitor_aad_diagnostic_setting` - deprecate `log` in favour of `enabled_log` ([#21390](https://github.com/hashicorp/terraform-provider-azurerm/issues/21390))\n* `azurerm_resource_group` - support for the `managed_by` property ([#22012](https://github.com/hashicorp/terraform-provider-azurerm/issues/22012))\n\nBUG FIXES:\n\n* `azurerm_automation_schedule` - prevent diffs for the `expiry_time` property when it isn't set in the user's configuration ([#21886](https://github.com/hashicorp/terraform-provider-azurerm/issues/21886))\n* `azurerm_frontdoor` - throw an error if the resource cannot be found during an update ([#21975](https://github.com/hashicorp/terraform-provider-azurerm/issues/21975))\n* `azurerm_image` - changing the `os_disk.size_gb` propety now creates a new resource ([#22272](https://github.com/hashicorp/terraform-provider-azurerm/issues/22272))\n* `azurerm_kubernetes_cluster` - fix the validation for `node_os_channel_upgrade` block ([#22284](https://github.com/hashicorp/terraform-provider-azurerm/issues/22284))\n* `azurerm_linux_virtual_machine` - raise an error if the resource cannot be found during an update ([#21975](https://github.com/hashicorp/terraform-provider-azurerm/issues/21975))\n* `azurerm_linux_web_app` - deprecated the `docker_image` and `docker_image_tag` properties in favour of `docker_image_name`, `docker_registry_url`, `docker_registry_username`, and `docker_registry_password`. These settings now manage the respective `app_settings` values of the same name. ([#22003](https://github.com/hashicorp/terraform-provider-azurerm/issues/22003))\n* `azurerm_linux_web_app_slot` - deprecated the `docker_image` and `docker_image_tag` properties in favour of `docker_image_name`, `docker_registry_url`, `docker_registry_username`, and `docker_registry_password`. These settings now manage the respective `app_settings` values of the same name.  ([#22003](https://github.com/hashicorp/terraform-provider-azurerm/issues/22003))\n* `azurerm_site_recovery_replicated_vm` - set the `network_interface.failover_test_subnet_name`, `network_interface.failover_test_public_ip_address_id` and `network_interface.failover_test_static_ip` properties correctly ([#22217](https://github.com/hashicorp/terraform-provider-azurerm/issues/22217))\n* `azurerm_ssh_public_key` - throw an error if the resource cannot be found during an update ([#21975](https://github.com/hashicorp/terraform-provider-azurerm/issues/21975))\n* `azurerm_storage_share` - revert the resource ID format back to what it was previously due to a discrepancy in the API and Portal ([#22271](https://github.com/hashicorp/terraform-provider-azurerm/issues/22271))\n* `azurerm_storage_account` - the `last_access_time_enabled` and `container_delete_retention_policy` properties are now supported in usgovernment ([#22273](https://github.com/hashicorp/terraform-provider-azurerm/issues/22273))\n* `azurerm_windows_virtual_machine` - reaise an error if the resource cannot be found during an update ([#21975](https://github.com/hashicorp/terraform-provider-azurerm/issues/21975))\n* `azurerm_windows_web_app` - deprecated the `docker_container_registry`, `docker_container_name`, and `docker_container_tag` properties in favour of `docker_image_name`, `docker_registry_url`, `docker_registry_username`, and `docker_registry_password`. These settings now manage the respective `app_settings` values of the same name.  ([#22003](https://github.com/hashicorp/terraform-provider-azurerm/issues/22003))\n* `azurerm_windows_web_app_slot` - deprecated the `docker_container_registry`, `docker_container_name`, and `docker_container_tag` properties in favour of `docker_image_name`, `docker_registry_url`, `docker_registry_username`, and `docker_registry_password`. These settings now manage the respective `app_settings` values of the same name.  ([#22003](https://github.com/hashicorp/terraform-provider-azurerm/issues/22003))\n\n## 3.62.1 (June 22, 2023)\n\nBUG FIXES:\n\ndependencies: compute/marketplace_agreement - Downgrade API version to 2015-06-01 [GH-22264]\n\n## 3.62.0 (June 22, 2023)\n\nFEATURES:\n\n* **New Resource:** `azurerm_new_relic_monitor` ([#21958](https://github.com/hashicorp/terraform-provider-azurerm/issues/21958))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230614.1151152` of `github.com/hashicorp/go-azure-sdk` ([#22176](https://github.com/hashicorp/terraform-provider-azurerm/issues/22176))\n* dependencies: `compute/marketplace_agreement` - swap to use `hashicorp/go-azure-sdk` ([#21938](https://github.com/hashicorp/terraform-provider-azurerm/issues/21938))\n* dependencies: `network/manager` - swap to use `hashicorp/go-azure-sdk` ([#22119](https://github.com/hashicorp/terraform-provider-azurerm/issues/22119))\n* dependencies: `network/route` - swap to use `hashicorp/go-azure-sdk` ([#22227](https://github.com/hashicorp/terraform-provider-azurerm/issues/22227))\n* `azurerm_cosmosdb_gremlin_graph` - support for the `analytical_storage_ttl` property ([#22179](https://github.com/hashicorp/terraform-provider-azurerm/issues/22179))\n* `azurerm_kubernetes_cluster` - support for the value `AzureLinux` for the field `os_sku` within the `default_node_pool` block ([#22139](https://github.com/hashicorp/terraform-provider-azurerm/issues/22139))\n* `azurerm_kubernetes_cluster` - support for the property `node_os_channel_upgrade` ([#22187](https://github.com/hashicorp/terraform-provider-azurerm/issues/22187))\n* `azurerm_kubernetes_cluster_node_pool` - support for the value `AzureLinux` for the field `os_sku` ([#22139](https://github.com/hashicorp/terraform-provider-azurerm/issues/22139))\n* `azurerm_monitor_workspace` - support for `public_network_access_enabled` ([#22197](https://github.com/hashicorp/terraform-provider-azurerm/issues/22197))\n* `azurerm_virtual_hub` - support for `virtual_router_auto_scale_min_capacity` ([#21614](https://github.com/hashicorp/terraform-provider-azurerm/issues/21614))\n\nBUG FIXES:\n\n* `azurerm_application_insights_workbook` - the `display_name` property can now be updated ([#22148](https://github.com/hashicorp/terraform-provider-azurerm/issues/22148))\n* `azurerm_bastion_host` - now creates a new resource when the `sku` property is downgraded ([#22147](https://github.com/hashicorp/terraform-provider-azurerm/issues/22147))\n* `azurerm_container_app` - the `EmptyDir` property now functions ([#22196](https://github.com/hashicorp/terraform-provider-azurerm/issues/22196))\n* `azurerm_kubernetes_cluster` - fix the validation preventing cluster's with `network_plugin_mode` set to `Overlay` due to a case change in the upstream API ([#22153](https://github.com/hashicorp/terraform-provider-azurerm/issues/22153))\n* `azurerm_resource_deployment_script_*` - fix issue where `identity` wasn't specified but was being sent as `TypeNone` to the api ([#22165](https://github.com/hashicorp/terraform-provider-azurerm/issues/22165))\n* `azurerm_bastion_host` - the `ip_configuration` propery is now required ([#22154](https://github.com/hashicorp/terraform-provider-azurerm/issues/22154))\n\n## 3.61.0 (June 12, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_mobile_network_packet_core_data_plane` ([#21053](https://github.com/hashicorp/terraform-provider-azurerm/issues/21053))\n* **New Resource:** `azurerm_arc_machine_extension` ([#22051](https://github.com/hashicorp/terraform-provider-azurerm/issues/22051))\n* **New Resource:** `azurerm_arc_kubernetes_flux_configuration` ([#21579](https://github.com/hashicorp/terraform-provider-azurerm/issues/21579))\n* **New Resource:** `azurerm_kubernetes_flux_configuration` ([#21579](https://github.com/hashicorp/terraform-provider-azurerm/issues/21579))\n* **New Resource:** `azurerm_mobile_network_packet_core_data_plane` ([#21053](https://github.com/hashicorp/terraform-provider-azurerm/issues/21053))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230530.1150329` of `github.com/tombuildsstuff/kermit` ([#21980](https://github.com/hashicorp/terraform-provider-azurerm/issues/21980))\n* dependencies: `compute/gallery`: updating to API Version `2022-03-03` ([#21999](https://github.com/hashicorp/terraform-provider-azurerm/issues/21999))\n* dependencies: `kusto`: updating to API Version `2022-12-29` ([#21961](https://github.com/hashicorp/terraform-provider-azurerm/issues/21961))\n* Data Source `azurerm_site_recovery_replication_recovery_plan` - add support for `azure_to_azure_settings` block ([#22098](https://github.com/hashicorp/terraform-provider-azurerm/issues/22098))\n* `compute`: updating to use API Version `2023-03-01` ([#21980](https://github.com/hashicorp/terraform-provider-azurerm/issues/21980))\n* `containers`: updating to use API version `2023-04-02-preview` [22048]\n* `managedidentity`: updating to use API Version `2023-01-31` ([#22102](https://github.com/hashicorp/terraform-provider-azurerm/issues/22102))\n* `azurerm_backup_protected_vm` - support for the `protection_state` property ([#20608](https://github.com/hashicorp/terraform-provider-azurerm/issues/20608))\n* `azurerm_batch_account` - the `public_network_access_enabled` property can now be updated ([#22095](https://github.com/hashicorp/terraform-provider-azurerm/issues/22095))\n* `azurerm_batch_pool` - support for the `target_node_communication_mode` property ([#22094](https://github.com/hashicorp/terraform-provider-azurerm/issues/22094))\n* `azurerm_automanage_configuration` - support for the `log_analytics_enabled` property ([#22121](https://github.com/hashicorp/terraform-provider-azurerm/issues/22121))\n* `azurerm_nginx_certificate` - the `key_virtual_path`, `certificate_virtual_path`, and `key_vault_secret_id` proeprties can now be updated ([#22100](https://github.com/hashicorp/terraform-provider-azurerm/issues/22100))\n* `azurerm_spring_cloud_gateway` - support for the `client_authentication` property ([#22016](https://github.com/hashicorp/terraform-provider-azurerm/issues/22016))\n\nBUG FIXES:\n\n* `azurerm_databricks_workspace_data_source` - correctly set the `managed_idnetity_id` attribute ([#22021](https://github.com/hashicorp/terraform-provider-azurerm/issues/22021))\n\n## 3.60.0 (June 08, 2023)\n\nNOTES:\n\n* `azurerm_security_center_subscription_pricing` - upon deletion the pricing tier now resets to `Free` tier ([#21437](https://github.com/hashicorp/terraform-provider-azurerm/issues/21437))\n\nENHANCEMENTS:\n\n* dependencies: `batch`: updating to API Version `2022-10-01` ([#21962](https://github.com/hashicorp/terraform-provider-azurerm/issues/21962))\n* dependencies: `loadtest`: updating to API Version `2022-12-01` ([#22091](https://github.com/hashicorp/terraform-provider-azurerm/issues/22091))\n* provider: adding the `client_id_file_path` and `client_secret_file_path` provider properties ([#21764](https://github.com/hashicorp/terraform-provider-azurerm/issues/21764))\n* `data.azurerm_key_vault_encrypted_value` - now exports the `decoded_plain_text_value` [attribute GH-21682]\n* `azurerm_automanage_configuration` - support for the `backup` and `azure_security_baseline` blocks ([#22081](https://github.com/hashicorp/terraform-provider-azurerm/issues/22081))\n* `azurerm_app_configuration` - support toggling of user permission error on soft deleted stores through `app_configuration.recover_soft_deleted` feature flag ([#19661](https://github.com/hashicorp/terraform-provider-azurerm/issues/19661))\n* `azurerm_backup_policy_file_share` - support for day-based retention policies and hourly backups ([#21529](https://github.com/hashicorp/terraform-provider-azurerm/issues/21529))\n* `azurerm_linux_function_app` - support for Python `3.11` for Linux function app ([#21956](https://github.com/hashicorp/terraform-provider-azurerm/issues/21956))\n* `azurerm_linux_function_app_slot` - support for Python `3.11` for Linux function app ([#21956](https://github.com/hashicorp/terraform-provider-azurerm/issues/21956))\n* `azurerm_monitor_autoscale_setting` - support for the `predictive` block ([#22038](https://github.com/hashicorp/terraform-provider-azurerm/issues/22038))\n* `azurerm_machine_learning_compute_instance` - support for the `node_public_ip_enabled` property ([#22063](https://github.com/hashicorp/terraform-provider-azurerm/issues/22063))\n* `azurerm_spring_cloud_service` - support for the `container_registry` block ([#22017](https://github.com/hashicorp/terraform-provider-azurerm/issues/22017))\n* `azurerm_site_recovery_replication_recovery_plan` - the order of the `pre_action` and `post_action` properties is now respected ([#22019](https://github.com/hashicorp/terraform-provider-azurerm/issues/22019))\n\nBUG FIXES:\n\n* `azurerm_hdinsight_interactive_query_cluster` - deprecating the `*_node.0.autoscale.0.capacity` property ([#21981](https://github.com/hashicorp/terraform-provider-azurerm/issues/21981))\n* `azurerm_key_vault_key` - allow the `rotation_policy` property to be removed ([#21935](https://github.com/hashicorp/terraform-provider-azurerm/issues/21935))\n* `azurerm_mssql_server` - fix issue where the `minimum_tls_version` property is being returned as `None` instead of `Disabled` ([#22067](https://github.com/hashicorp/terraform-provider-azurerm/issues/22067))\n* `azurerm_sentinel_data_connector_microsoft_threat_intelligence` - the `bing_safety_phishing_url_lookback_date` property is deprecated ([#21954](https://github.com/hashicorp/terraform-provider-azurerm/issues/21954))\n\n## 3.59.0 (June 01, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_arc_machine` ([#21796](https://github.com/hashicorp/terraform-provider-azurerm/issues/21796))\n* **New Resource:** `azurerm_automanage_configuration` ([#21490](https://github.com/hashicorp/terraform-provider-azurerm/issues/21490))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230523.1140858` of `github.com/hashicorp/go-azure-sdk` ([#21910](https://github.com/hashicorp/terraform-provider-azurerm/issues/21910))\n* dependencies: `azurem_monitor_action_group` - upgrading `actiongroupsapis` from `2021-09-01` to `2023-01-01` ([#21948](https://github.com/hashicorp/terraform-provider-azurerm/issues/21948))\n* dependencies: `policy.guestconfigurationassignments`: migrate to `hashicorp/go-azure-sdk` ([#21927](https://github.com/hashicorp/terraform-provider-azurerm/issues/21927))\n* dependencies: `azurerm_monitor_autoscale_setting`  upgrade API version from to `2023-05-01-preview` ([#21953](https://github.com/hashicorp/terraform-provider-azurerm/issues/21953))\n* `data.azurerm_linux_web_app` - now exports the `availability` and `usage` attributes ([#21945](https://github.com/hashicorp/terraform-provider-azurerm/issues/21945))\n* `data.azurerm_linux_function_app` - now exports the `availability` and `usage` attributes ([#21945](https://github.com/hashicorp/terraform-provider-azurerm/issues/21945))\n* `data.azurerm_cdn_frontdoor_secret` - now exports the `expiration_date` attribute ([#21945](https://github.com/hashicorp/terraform-provider-azurerm/issues/21945))\n* `data.azurerm_virtual_machine` - now exports the `power_state` ([#21945](https://github.com/hashicorp/terraform-provider-azurerm/issues/21945))\n* `data.azurerm_virtual_machine_scale_set` -  now exports the `power_state` attribute ([#21945](https://github.com/hashicorp/terraform-provider-azurerm/issues/21945))\n* `data.azurerm_azurerm_resources` - now exports the `resource_group_name` attribute for each resource ([#21676](https://github.com/hashicorp/terraform-provider-azurerm/issues/21676))\n* `security.watchitems` - updating to use `hashicorp/go-azure-sdk` ([#21944](https://github.com/hashicorp/terraform-provider-azurerm/issues/21944))\n* `azurerm_cosmosdb_account` - support new capabilities for `MongoDB` ([#21974](https://github.com/hashicorp/terraform-provider-azurerm/issues/21974))\n* `azurerm_kubernetes_cluster` - the properties `enable_host_encryption`, `enable_node_public_ip`, `kubelet_config`, `linux_os_config`, `max_pods`, `node_taints`, `only_critical_addons_enabled`, `os_disk_size_gb`, `os_disk_type`, `os_sku`, `pod_subnet_id`, `ultra_ssd_enabled`, `vnet_subnet_id` and `zones` are now updateable through cycling of the system node pool ([#21719](https://github.com/hashicorp/terraform-provider-azurerm/issues/21719))\n* `azurerm_machine_learning_compute_cluster` - add support for the `node_public_ip_enabled` property ([#21377](https://github.com/hashicorp/terraform-provider-azurerm/issues/21377))\n* `azurerm_nginx_certificate` - `key_vault_secret_id` now accepts version-less key vault secret ids ([#21949](https://github.com/hashicorp/terraform-provider-azurerm/issues/21949))\n* `azurerm_postgresql_flexible_server` - add support for `version` value `15` ([#21934](https://github.com/hashicorp/terraform-provider-azurerm/issues/21934))\n* `azurerm_shared_image_version` - now exports the `id` property ([#22006](https://github.com/hashicorp/terraform-provider-azurerm/issues/22006))\n* `azurerm_spring_cloud_certificate` - support for the `exclude_private_key` property ([#21942](https://github.com/hashicorp/terraform-provider-azurerm/issues/21942))\n* `azurerm_spring_cloud_customized_accelerator` - support for the `ca_certificate_id` property ([#21943](https://github.com/hashicorp/terraform-provider-azurerm/issues/21943))\n\nBUG FIXES:\n\n* `azurerm_app_configuration` - prevent errors when deleting by checking that the name of the app configuration store is released ([#21750](https://github.com/hashicorp/terraform-provider-azurerm/issues/21750))\n* `azurerm_express_route_port_authorization` - add a lock when create/update/delete authorization of express route port ([#21959](https://github.com/hashicorp/terraform-provider-azurerm/issues/21959))\n* `azurerm_kubernetes_cluster` - recompute the field `oidc_issuer_url` if the value of `oidc_issuer_enabled` has changed ([#21911](https://github.com/hashicorp/terraform-provider-azurerm/issues/21911))\n* `azurerm_kubernetes_cluster` - set correct value for `default_node_pool.os_sku` when resizing the `default_node_pool` ([#21976](https://github.com/hashicorp/terraform-provider-azurerm/issues/21976))\n* `azurerm_postgresql_flexible_server` - fix issue updating `storage_mb` and `backup_retention_days` together ([#21987](https://github.com/hashicorp/terraform-provider-azurerm/issues/21987))\n\n## 3.58.0 (May 25, 2023)\n\nFEATURES:\n\n* **New data Source:** `azurerm_mobile_network_packet_core_control_plane` ([#21071](https://github.com/hashicorp/terraform-provider-azurerm/issues/21071))\n* **New Resource:** `azurerm_cosmosdb_mongo_role_definition` ([#21754](https://github.com/hashicorp/terraform-provider-azurerm/issues/21754))\n* **New Resource:** `azurerm_cosmosdb_mongo_user_definition` ([#21914](https://github.com/hashicorp/terraform-provider-azurerm/issues/21914))\n* **New Resource:** `azurerm_iothub_file_upload` ([#20668](https://github.com/hashicorp/terraform-provider-azurerm/issues/20668))\n* **New Resource:** `azurerm_mobile_network_packet_core_control_plane` ([#21071](https://github.com/hashicorp/terraform-provider-azurerm/issues/21071))\n* **New Resource:** `azurerm_mysql_flexible_server_active_directory_administrator` ([#21786](https://github.com/hashicorp/terraform-provider-azurerm/issues/21786))\n* **New Resource:** `azurerm_monitor_alert_prometheus_rule_group` ([#21751](https://github.com/hashicorp/terraform-provider-azurerm/issues/21751))\n* **New Resource:** `azurerm_recovery_services_vault_resource_guard_association` ([#21712](https://github.com/hashicorp/terraform-provider-azurerm/issues/21712))\n* **New Resource:** `azurerm_site_recovery_hyperv_network_mapping` ([#21788](https://github.com/hashicorp/terraform-provider-azurerm/issues/21788))\n* **New Resource:** `azurerm_site_recovery_vmware_replication_policy_association` ([#21389](https://github.com/hashicorp/terraform-provider-azurerm/issues/21389))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230523.1080931` of `github.com/hashicorp/go-azure-sdk` ([#21898](https://github.com/hashicorp/terraform-provider-azurerm/issues/21898))\n* dependencies: updating to `v0.20230518.1143920` of `github.com/tombuildsstuff/kermit` ([#21899](https://github.com/hashicorp/terraform-provider-azurerm/issues/21899))\n* dependencies: `azurerm_monitor_autoscale_setting`  upgrade API version from `2015-04-01` to `2022-10-01` ([#21887](https://github.com/hashicorp/terraform-provider-azurerm/issues/21887))\n* `cosmosdb.gremlin`: updating to use `hashicorp/go-azure-sdk` and api version `2023-04-15` ([#21813](https://github.com/hashicorp/terraform-provider-azurerm/issues/21813))\n* `cosmosdb.sql_container`: updating to use `hashicorp/go-azure-sdk` and api version `2023-04-15` ([#21813](https://github.com/hashicorp/terraform-provider-azurerm/issues/21813))\n* `nginx`: updating to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#21810](https://github.com/hashicorp/terraform-provider-azurerm/issues/21810))\n* `portal`: updating to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#21810](https://github.com/hashicorp/terraform-provider-azurerm/issues/21810))\n* `redis`: updating to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#21810](https://github.com/hashicorp/terraform-provider-azurerm/issues/21810))\n* `appplatform`: updating to API Version `2023-03-01-preview` ([#21404](https://github.com/hashicorp/terraform-provider-azurerm/issues/21404))\n* `redisenterprise`: updating to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#21810](https://github.com/hashicorp/terraform-provider-azurerm/issues/21810))\n* `azurerm_cosmosdb_account` - fix for upstream Microsoft API issue where updating `identity` and `default_identity` at the same time silently fails ([#21780](https://github.com/hashicorp/terraform-provider-azurerm/issues/21780))\n* `azurerm_monitor_activity_log_alert` - support for the `levels`, `resource_providers`, `resource_types`, `resource_groups`, `resource_ids`, `statuses`, and `sub_statuses` properties ([#21367](https://github.com/hashicorp/terraform-provider-azurerm/issues/21367))\n* `azurerm_media_transform` - support for the `experimental_options` property ([#21873](https://github.com/hashicorp/terraform-provider-azurerm/issues/21873))\n* `azurerm_backup_policy_vm` - support for the `days` and `include_last_days` properties ([#21434](https://github.com/hashicorp/terraform-provider-azurerm/issues/21434))\n* `azurerm_subnet` - the `name` property within the `subnet_delegation` block can now be set to `Microsoft.App/environments` ([#21893](https://github.com/hashicorp/terraform-provider-azurerm/issues/21893))\n* `azurerm_subnet_service_endpoint_policy` - support for the `service` property ([#21865](https://github.com/hashicorp/terraform-provider-azurerm/issues/21865))\n* `azurerm_signalr_service` - support for the `user_assigned_identity_id` property ([#21055](https://github.com/hashicorp/terraform-provider-azurerm/issues/21055))\n* `azurerm_site_recovery_replication_recovery_plan` - support for the `azure_to_azure_settings` block ([#21666](https://github.com/hashicorp/terraform-provider-azurerm/issues/21666))\n* `azurerm_cosmosdb_postgresql_cluster` - the `citus_version` property now supports `11.3` ([#21916](https://github.com/hashicorp/terraform-provider-azurerm/issues/21916))\n\nBUG FIXES:\n\n* Data Source: `azurerm_kubernetes_cluster` - prevent a panic when some values returned are nil ([#21867](https://github.com/hashicorp/terraform-provider-azurerm/issues/21867))\n* `azurerm_application_insights_web_test` - normalizing the value for the `application_insights_id` property ([#21837](https://github.com/hashicorp/terraform-provider-azurerm/issues/21837))\n* `azurerm_api_management` - correctly configure the `triple_des_ciphers_enabled` value ([#21789](https://github.com/hashicorp/terraform-provider-azurerm/issues/21789))\n* `azurerm_key_vault` - during creation the`createMode` now is set to `default` instead of `nil` ([#21668](https://github.com/hashicorp/terraform-provider-azurerm/issues/21668))\n* `azurerm_spring_cloud_gateway_route_config` -  the `filters` and `predicates` properties is now omitted when not specified ([#21745](https://github.com/hashicorp/terraform-provider-azurerm/issues/21745))\n* `azurerm_subnet` - permit `Microsoft.BareMetal/AzureHostedService` as an option for the `service_delegation` property ([#21871](https://github.com/hashicorp/terraform-provider-azurerm/issues/21871))\n\n## 3.57.0 (May 19, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_virtual_hub_connection` ([#21681](https://github.com/hashicorp/terraform-provider-azurerm/issues/21681))\n\nENHANCEMENTS:\n\n* `synapse`: refactoring to use `tombuildsstuff/kermit` rather than `Azure/azure-sdk-for-go` for Data Plane ([#21792](https://github.com/hashicorp/terraform-provider-azurerm/issues/21792))\n* `azurerm_batch_account` - support versionless keys for CMK ([#21677](https://github.com/hashicorp/terraform-provider-azurerm/issues/21677))\n* `azurerm_kubernetes_cluster` - changing the `http_proxy_config.no_proxy` no longer creates a new resource ([#21793](https://github.com/hashicorp/terraform-provider-azurerm/issues/21793))\n* `azurerm_media_transform` - support for the `jpg_image` and `png_image` blocks within the `custom_preset` block ([#21709](https://github.com/hashicorp/terraform-provider-azurerm/issues/21709))\n* `azurerm_recovery_services_vault` - support the `monitoring` block ([#21691](https://github.com/hashicorp/terraform-provider-azurerm/issues/21691))\n\nBUG FIXES:\n\n* `data.azurerm_kubernetes_cluster` - prevent a panic when some values returned are nil ([#21850](https://github.com/hashicorp/terraform-provider-azurerm/issues/21850))\n\n## 3.56.0 (May 11, 2023)\n\nFEATURES:\n\n* **New Resource:** `azurerm_cosmosdb_postgresql_coordinator_configuration` ([#21595](https://github.com/hashicorp/terraform-provider-azurerm/issues/21595))\n* **New Resource:** `azurerm_cosmosdb_postgresql_node_configuration` ([#21596](https://github.com/hashicorp/terraform-provider-azurerm/issues/21596))\n* **New Resource:** `azurerm_cosmosdb_postgresql_role` ([#21597](https://github.com/hashicorp/terraform-provider-azurerm/issues/21597))\n* **New Resource:** `azurerm_monitor_workspace` ([#21598](https://github.com/hashicorp/terraform-provider-azurerm/issues/21598))\n* **New Resource:** `azurerm_network_manager_deployment` ([#20451](https://github.com/hashicorp/terraform-provider-azurerm/issues/20451))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.56.0` of `github.com/hashicorp/go-azure-helpers` ([#21725](https://github.com/hashicorp/terraform-provider-azurerm/issues/21725))\n* dependencies: updating to `v0.20230511.1094507` of `github.com/hashicorp/go-azure-sdk` ([#21759](https://github.com/hashicorp/terraform-provider-azurerm/issues/21759))\n* provider: improving the error messages when parsing a Resource ID and the ID doesn't match what's expected ([#21725](https://github.com/hashicorp/terraform-provider-azurerm/issues/21725))\n* provider: Resource Provider Registration now uses API Version `2022-09-01` ([#21695](https://github.com/hashicorp/terraform-provider-azurerm/issues/21695))\n* provider: updating the `IsAzureStack` check to use `hashicorp/go-azure-sdk` rather than relying on the environment from `Azure/go-autorest` ([#21697](https://github.com/hashicorp/terraform-provider-azurerm/issues/21697))\n* `appconfiguration`: updating to API Version `2023-03-01` ([#21660](https://github.com/hashicorp/terraform-provider-azurerm/issues/21660))\n* `keyvault`: refactoring to use `hashicorp/go-azure-sdk` ([#21621](https://github.com/hashicorp/terraform-provider-azurerm/issues/21621))\n* `azurerm_machine_learning_workspace` - exporting `workspace_id` ([#21746](https://github.com/hashicorp/terraform-provider-azurerm/issues/21746))\n* `azurerm_mssql_server` - expose the ability to enable `Transparent Data Encryption` using a `Customer Managed Key` during server deployment ([#21704](https://github.com/hashicorp/terraform-provider-azurerm/issues/21704))\n* `azurerm_orbital_contact_profile` - `ip_address` is now optional ([#21721](https://github.com/hashicorp/terraform-provider-azurerm/issues/21721))\n\nBUG FIXES:\n\n* provider: fixing a bug where we would invoke but not poll for the Registration State during automatic Resource Provider Registration ([#21695](https://github.com/hashicorp/terraform-provider-azurerm/issues/21695))\n* `azurerm_app_configuration`: handling an API bug where when polling for `PurgeDeleted` returns a 404 rather the payload for a long-running operation ([#21665](https://github.com/hashicorp/terraform-provider-azurerm/issues/21665))\n* `azurerm_api_management_api` - fixing a bug where an empty `contact` bug would cause a crash ([#21740](https://github.com/hashicorp/terraform-provider-azurerm/issues/21740))\n* `azurerm_eventhub_namespace` - add locks and remove unneeded WaitForState functions ([#21656](https://github.com/hashicorp/terraform-provider-azurerm/issues/21656))\n* `azurerm_machine_learning_workspace` - parse `key_vault_id` insensitively ([#21684](https://github.com/hashicorp/terraform-provider-azurerm/issues/21684))\n* `azurerm_monitor_action_group` - further expand ExactlyOneOf logic for `event_hub_receiver` attributes ([#21735](https://github.com/hashicorp/terraform-provider-azurerm/issues/21735))\n* `azurerm_monitor_metric_alert` - fix regression by using `SingleResourceMultiMetricCriteria` for new metric alerts  ([#21658](https://github.com/hashicorp/terraform-provider-azurerm/issues/21658))\n* `azurerm_service_fabric_managed_cluster` - fixing a bug where `certificates` within the `vm_secrets` block wouldn't be set into the state ([#21680](https://github.com/hashicorp/terraform-provider-azurerm/issues/21680))\n* `azurerm_storage_share` - correct resource ID segment from `fileshares` to `shares` ([#21645](https://github.com/hashicorp/terraform-provider-azurerm/issues/21645))\n* `azurerm_virtual_machine_scale_set`,  - - support specifying `ultra_ssd_disk_iops_read_write` and `ultra_ssd_disk_mbps_read_write` for `PremiumV2_LRS` ([#21530](https://github.com/hashicorp/terraform-provider-azurerm/issues/21530)) \n\n\n## 3.55.0 (May 04, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_kubernetes_node_pool_snapshot` ([#21511](https://github.com/hashicorp/terraform-provider-azurerm/issues/21511))\n* **New Resource:** `azurerm_cosmosdb_postgresql_firewall_rule` ([#21599](https://github.com/hashicorp/terraform-provider-azurerm/issues/21599))\n\nENHANCEMENTS:\n\n* `appconfiguration`: refactoring to use `tombuildsstuff/kermit` rather than an embedded SDK ([#21623](https://github.com/hashicorp/terraform-provider-azurerm/issues/21623))\n* `recoveryservicesbackup` - updating to use API Version `2023-02-01` ([#21575](https://github.com/hashicorp/terraform-provider-azurerm/issues/21575))\n* `azurerm_kubernetes_cluster_node_pool` - support for the `snapshot_id` property ([#21511](https://github.com/hashicorp/terraform-provider-azurerm/issues/21511))\n\nBUG FIXES:\n\n* Data Source: `azurerm_healthcare_fhir_service` - `identity` now exports both `SystemAssigned` and `UserAssigned` identities ([#21594](https://github.com/hashicorp/terraform-provider-azurerm/issues/21594))\n* `azurerm_local_network_gateway` - validating that `address_space` isn't set to an empty string ([#21566](https://github.com/hashicorp/terraform-provider-azurerm/issues/21566))\n* `azurerm_log_analytics_cluster` -  Add locks and remove unneeded WaitForState checks ([#21631](https://github.com/hashicorp/terraform-provider-azurerm/issues/21631))\n* `azurerm_log_analytics_cluster_customer_managed_key` - Add locks and remove unneeded WaitForState checks ([#21631](https://github.com/hashicorp/terraform-provider-azurerm/issues/21631))\n* `azurerm_managed_disk` - now detaches when `disk_size_gb` increases from below `4095` to above `4095` ([#21620](https://github.com/hashicorp/terraform-provider-azurerm/issues/21620))\n* Service `mssqlmanagedinstance` - add initialize of `client.MSSQLManagedInstance` to fix panic ([#21657](https://github.com/hashicorp/terraform-provider-azurerm/issues/21657))\n* `azurerm_virtual_machine` - fixing a regression when parsing the OS Disk ID from the Azure API ([#21606](https://github.com/hashicorp/terraform-provider-azurerm/issues/21606))\n* `azurerm_virtual_machine` - fixing a regression when parsing the Data Disk ID from the Azure API ([#21606](https://github.com/hashicorp/terraform-provider-azurerm/issues/21606))\n\n## 3.54.0 (April 27, 2023)\n\nBREAKING CHANGES:\n\n* `azurerm_attestation_provider` - the field `policy` is deprecated and non-functional due to a design issue with the original resource (where this wasn't retrieved from the Azure API and thus wasn't exposed correctly) - this is superseded by the fields `open_enclave_policy_base64`, `sgx_enclave_policy_base64` and `tpm_policy_base64`. ([#21524](https://github.com/hashicorp/terraform-provider-azurerm/issues/21524))\n\nFEATURES:\n\n* **New Resource:** `azurerm_arc_kubernetes_cluster_extension` ([#21310](https://github.com/hashicorp/terraform-provider-azurerm/issues/21310))\n* **New Resource:** `azurerm_cosmosdb_postgresql_cluster` ([#21090](https://github.com/hashicorp/terraform-provider-azurerm/issues/21090))\n* **New Resource:** `azurerm_email_communication_service` ([#21526](https://github.com/hashicorp/terraform-provider-azurerm/issues/21526))\n* **New Resource:** `azurerm_kubernetes_cluster_extension` ([#21310](https://github.com/hashicorp/terraform-provider-azurerm/issues/21310))\n* **New Resource:** `azurerm_netapp_volume_group_sap_hana` ([#21290](https://github.com/hashicorp/terraform-provider-azurerm/issues/21290))\n* **New Resource:** `azurerm_storage_mover_project` ([#21477](https://github.com/hashicorp/terraform-provider-azurerm/issues/21477))\n* **New Resource:** `azurerm_storage_mover_job_definition` ([#21514](https://github.com/hashicorp/terraform-provider-azurerm/issues/21514))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230427.1112058` of `github.com/hashicorp/go-azure-sdk` ([#21583](https://github.com/hashicorp/terraform-provider-azurerm/issues/21583))\n*  `security`: updating to API Version `2023-01-01` ([#21531](https://github.com/hashicorp/terraform-provider-azurerm/issues/21531))\n* Data Source: `azurerm_virtual_network_gateway` - add support for the field `private_ip_address` ([#21432](https://github.com/hashicorp/terraform-provider-azurerm/issues/21432))\n* `azurerm_active_directory_domain_service` - `domain_name` now supports a length up to 30 characters ([#21555](https://github.com/hashicorp/terraform-provider-azurerm/issues/21555))\n* `azurerm_attestation_provider` - adding support for the field `open_enclave_policy_base64`, `sgx_enclave_policy_base64` and `tpm_policy_base64` ([#21524](https://github.com/hashicorp/terraform-provider-azurerm/issues/21524))\n* `azurerm_attestation_provider` - adding support for the field `sgx_enclave_policy_base64` ([#21524](https://github.com/hashicorp/terraform-provider-azurerm/issues/21524))\n* `azurerm_attestation_provider` - adding support for the field `tpm_policy_base64` ([#21524](https://github.com/hashicorp/terraform-provider-azurerm/issues/21524))\n* `azurerm_billing_account_cost_management_export` - the field `time_frame` can now be set to `TheLast7Days` ([#21528](https://github.com/hashicorp/terraform-provider-azurerm/issues/21528))\n* `azurerm_firewall_policy_rule_collection_group` - the fields `source_addresses` and `destination_addresses` now accepts an IPv4 range ([#21542](https://github.com/hashicorp/terraform-provider-azurerm/issues/21542))\n* `azurerm_kubernetes_cluster` - add support for the `service_mesh_profile` block ([#21516](https://github.com/hashicorp/terraform-provider-azurerm/issues/21516))\n* `azurerm_resource_group_cost_management_export` - the field `time_frame` can now be set to `TheLast7Days` ([#21528](https://github.com/hashicorp/terraform-provider-azurerm/issues/21528))\n* `azurerm_search_service` - adding support for `authentication_failure_mode ` ([#21323](https://github.com/hashicorp/terraform-provider-azurerm/issues/21323))\n* `azurerm_search_service` - adding support for `customer_managed_key_enforcement_enabled ` ([#21323](https://github.com/hashicorp/terraform-provider-azurerm/issues/21323))\n* `azurerm_search_service` - adding support for `hosting_mode ` ([#21323](https://github.com/hashicorp/terraform-provider-azurerm/issues/21323))\n* `azurerm_search_service` - adding support for `local_authentication_enabled` ([#21323](https://github.com/hashicorp/terraform-provider-azurerm/issues/21323))\n* `azurerm_search_service` - support for setting `sku` to `StorageOptimizedL2` ([#21323](https://github.com/hashicorp/terraform-provider-azurerm/issues/21323))\n* `azurerm_subscription_cost_management_export` - the field `time_frame` can now be set to `TheLast7Days` ([#21528](https://github.com/hashicorp/terraform-provider-azurerm/issues/21528))\n\nBUG FIXES:\n\n* **Provider:** fix an authentication bug when specifying `auxiliary_tenant_ids` while authenticating using Azure CLI ([#21583](https://github.com/hashicorp/terraform-provider-azurerm/issues/21583))\n* `azurerm_attestation_provider` - the field `policy` is deprecated and non-functional - instead Use the fields  `open_enclave_policy_base64`, `sgx_enclave_policy_base64` and `tpm_policy_base64` ([#21524](https://github.com/hashicorp/terraform-provider-azurerm/issues/21524))\n* `azurerm_mysql_flexible_server` - fix issue where `identity` was not being removed properly on updates ([#21533](https://github.com/hashicorp/terraform-provider-azurerm/issues/21533))\n* `azurerm_search_service` - updating the default value for `partition_count` to `1` to match the API ([#21323](https://github.com/hashicorp/terraform-provider-azurerm/issues/21323))\n* `azurerm_search_service` - updating the default value for `replica_count` to `1` to match the API ([#21323](https://github.com/hashicorp/terraform-provider-azurerm/issues/21323))\n* `azurerm_search_service` - the field `allowed_ips` is now a Set rather than a List ([#21323](https://github.com/hashicorp/terraform-provider-azurerm/issues/21323))\n\n## 3.53.0 (April 20, 2023)\n\nFEATURES:\n\n* **New Resource:** `azurerm_cost_management_scheduled_action` ([#21325](https://github.com/hashicorp/terraform-provider-azurerm/issues/21325))\n* **New Resource:** `azurerm_storage_mover_agent` ([#21273](https://github.com/hashicorp/terraform-provider-azurerm/issues/21273))\n* **New Resource:** `azurerm_storage_mover_source_endpoint` ([#21449](https://github.com/hashicorp/terraform-provider-azurerm/issues/21449))\n* **New Resource:** `azurerm_storage_mover_target_endpoint` ([#21449](https://github.com/hashicorp/terraform-provider-azurerm/issues/21449))\n\nENHANCEMENTS:\n\n* `advisor` - refactoring to use `hashicorp/go-azure-sdk` ([#21307](https://github.com/hashicorp/terraform-provider-azurerm/issues/21307))\n* `healthcare`: refactoring to use `hashicorp/go-azure-sdk` ([#21327](https://github.com/hashicorp/terraform-provider-azurerm/issues/21327))\n* `hpccache` - refactoring to use `hashicorp/go-azure-sdk` ([#21303](https://github.com/hashicorp/terraform-provider-azurerm/issues/21303))\n* `logz` - refactoring to use `hashicorp/go-azure-sdk` ([#21321](https://github.com/hashicorp/terraform-provider-azurerm/issues/21321))\n* `hpccache`: updating to API Version `2023-01-01` ([#21459](https://github.com/hashicorp/terraform-provider-azurerm/issues/21459))\n* `orbital`: updating to API Version `2022-11-01` ([#21405](https://github.com/hashicorp/terraform-provider-azurerm/issues/21405))\n* `vmware`: updating to API Version `2022-05-01` ([#21458](https://github.com/hashicorp/terraform-provider-azurerm/issues/21458))\n* `azurerm_attestation_provider` - support for the `policy` block ([#20972](https://github.com/hashicorp/terraform-provider-azurerm/issues/20972))\n* `azurerm_linux_function_app` - support for the `hosting_environment_id` property ([#20471](https://github.com/hashicorp/terraform-provider-azurerm/issues/20471))\n* `azurerm_linux_function_app_slot` - support for the `hosting_environment_id` property ([#20471](https://github.com/hashicorp/terraform-provider-azurerm/issues/20471))\n* `azurerm_linux_web_app` - support for the `hosting_environment_id` property ([#20471](https://github.com/hashicorp/terraform-provider-azurerm/issues/20471))\n* `azurerm_linux_web_app` - support `PHP 8.2` for the `application_stack` property ([#21420](https://github.com/hashicorp/terraform-provider-azurerm/issues/21420))\n* `azurerm_linux_web_app_slot`  - support for the `hosting_environment_id` property ([#20471](https://github.com/hashicorp/terraform-provider-azurerm/issues/20471))\n* `azurerm_linux_web_app_slot` support `PHP 8.2` for the `application_stack` property ([#21420](https://github.com/hashicorp/terraform-provider-azurerm/issues/21420))\n* `azurerm_signalr_service` - add addtional valid values for `sku.0.capacity` ([#21494](https://github.com/hashicorp/terraform-provider-azurerm/issues/21494))\n* `azurerm_windows_function_app` - support for the `hosting_environment_id` property ([#20471](https://github.com/hashicorp/terraform-provider-azurerm/issues/20471))\n* `azurerm_windows_function_app_slot` - support for the `hosting_environment_id` property ([#20471](https://github.com/hashicorp/terraform-provider-azurerm/issues/20471))\n* `azurerm_windows_web_app` - support for the `hosting_environment_id` property ([#20471](https://github.com/hashicorp/terraform-provider-azurerm/issues/20471))\n* `azurerm_windows_web_app_slot` - support for the `hosting_environment_id` property ([#20471](https://github.com/hashicorp/terraform-provider-azurerm/issues/20471))\n\nBUG FIXES: \n\n* `azurerm_cdn_endpoint` - remove the length limit for the `query_string` property ([#21474](https://github.com/hashicorp/terraform-provider-azurerm/issues/21474))\n* `azurerm_cognitive_account` - mark the `custom_question_answering_search_service_key` property as sensitive ([#21469](https://github.com/hashicorp/terraform-provider-azurerm/issues/21469))\n* `azurerm_monitor_metric_alert` - fix crash when the `dynamic_criteria.0.ignore_data_before` property  isn't set ([#21446](https://github.com/hashicorp/terraform-provider-azurerm/issues/21446))\n* `azurerm_postgresql_flexible_server` - correctly set the `point_in_time_restore_time_in_utc` property ([#21501](https://github.com/hashicorp/terraform-provider-azurerm/issues/21501))\n* `azurerm_search_service` - mark the `primary_key` and `secondary_key` properties as sensitive ([#21469](https://github.com/hashicorp/terraform-provider-azurerm/issues/21469))\n\n## 3.52.0 (April 13, 2023)\n\nENHANCEMENTS:\n\n* `containerRegistry` - refactoring to use `hashicorp/go-azure-sdk` ([#21344](https://github.com/hashicorp/terraform-provider-azurerm/issues/21344))\n* `monitor` - refactoring to use `hashicorp/go-azure-sdk` ([#21392](https://github.com/hashicorp/terraform-provider-azurerm/issues/21392))\n* `recoveryServices` - refactoring to use `hashicorp/go-azure-sdk` ([#21344](https://github.com/hashicorp/terraform-provider-azurerm/issues/21344))\n* Data Source: `azurerm_key_vault_certificate` - add support for `resource_manager_id` and `resource_manager_versionless_id` ([#21314](https://github.com/hashicorp/terraform-provider-azurerm/issues/21314))\n* Data Source: `azurerm_key_vault_secret` - support for `not_before_date` and `expiration_date` ([#21359](https://github.com/hashicorp/terraform-provider-azurerm/issues/21359))\n* Data Source: `azurerm_key_vault_secret` - support specifying the keyvault secret version ([#21336](https://github.com/hashicorp/terraform-provider-azurerm/issues/21336))\n* `azurerm_dashboard_grafana`- support for `UserAssigned` identitiues ([#21394](https://github.com/hashicorp/terraform-provider-azurerm/issues/21394))\n* `azurerm_key_vault_certificate` - add support for `resource_manager_id` and `resource_manager_versionless_id` ([#21314](https://github.com/hashicorp/terraform-provider-azurerm/issues/21314))\n* `azurerm_linux_function_app` - mark the `site_credential` block as `Sensitive` ([#21393](https://github.com/hashicorp/terraform-provider-azurerm/issues/21393))\n* `azurerm_linux_function_app_slot` - mark the `site_credential` block as `Sensitive` ([#21393](https://github.com/hashicorp/terraform-provider-azurerm/issues/21393))\n* `azurerm_linux_web_app` - mark the `site_credential` block as `Sensitive` ([#21393](https://github.com/hashicorp/terraform-provider-azurerm/issues/21393))\n* `azurerm_linux_web_app_slot`  - mark the `site_credential` block as `Sensitive` ([#21393](https://github.com/hashicorp/terraform-provider-azurerm/issues/21393))\n* `azurerm_windows_function_app` - mark the `site_credential` block as `Sensitive` ([#21393](https://github.com/hashicorp/terraform-provider-azurerm/issues/21393))\n* `azurerm_windows_function_app_slot` - mark the `site_credential` block as `Sensitive` ([#21393](https://github.com/hashicorp/terraform-provider-azurerm/issues/21393))\n* `azurerm_windows_web_app` - mark the `site_credential` block as `Sensitive` ([#21393](https://github.com/hashicorp/terraform-provider-azurerm/issues/21393))\n* `azurerm_windows_web_app_slot` - mark the  `site_credential` block as `Sensitive` ([#21393](https://github.com/hashicorp/terraform-provider-azurerm/issues/21393))\n\n\nBUG FIXES:\n\n* `azurerm_app_configuration_key` - extend timeout for polling resource to allow propagation of read permission ([#21337](https://github.com/hashicorp/terraform-provider-azurerm/issues/21337))\n* `azurerm_app_configuration_feature` - extend timeout for polling resource to allow propagation of read permission ([#21337](https://github.com/hashicorp/terraform-provider-azurerm/issues/21337))\n* `azurerm_cdn_endpoint` - the `global_delivery_rule` property must have at least one action specified ([#21403](https://github.com/hashicorp/terraform-provider-azurerm/issues/21403))\n* `azurerm_kubernetes_cluster` - the `enable_host_encryption` properly is not set when when resizing the `default_node_pool` ([#21379](https://github.com/hashicorp/terraform-provider-azurerm/issues/21379))\n* `azurerm_linux_function_app` - fix a crash in `auth_v2` in `active_directory_v2` ([#21381](https://github.com/hashicorp/terraform-provider-azurerm/issues/21381))\n* `azurerm_linux_function_app_slot` - fix a crash in `auth_v2` in `active_directory_v2` ([#21381](https://github.com/hashicorp/terraform-provider-azurerm/issues/21381))\n* `azurerm_linux_web_app` - fix a crash in `auth_v2` in `active_directory_v2` ([#21381](https://github.com/hashicorp/terraform-provider-azurerm/issues/21381))\n* `azurerm_linux_web_app_slot` - fix a crash in `auth_v2` in `active_directory_v2` ([#21381](https://github.com/hashicorp/terraform-provider-azurerm/issues/21381))\n* `azurerm_service_plan` - support for new Premium V3 and Memory Optimised SKUs ([#21371](https://github.com/hashicorp/terraform-provider-azurerm/issues/21371))\n* `azurerm_storage_account_local_user` - the `ssh_authorized_key` property can now be updated ([#21362](https://github.com/hashicorp/terraform-provider-azurerm/issues/21362))\n* `azurerm_storage_mover` - remove `Microsoft.StorageMover` from required list of Resource Providers ([#21370](https://github.com/hashicorp/terraform-provider-azurerm/issues/21370))\n* `azurerm_subscription` - fix an error during update ([#21255](https://github.com/hashicorp/terraform-provider-azurerm/issues/21255))\n* `azurerm_windows_function_app` - fix acrash in `auth_v2` in `active_directory_v2` ([#21381](https://github.com/hashicorp/terraform-provider-azurerm/issues/21381))\n* `azurerm_windows_function_app_slot` - fix a crash in `auth_v2` in `active_directory_v2` ([#21381](https://github.com/hashicorp/terraform-provider-azurerm/issues/21381))\n* `azurerm_windows_web_app` - fix a crash in `auth_v2` in `active_directory_v2` ([#21381](https://github.com/hashicorp/terraform-provider-azurerm/issues/21381))\n* `azurerm_windows_web_app_slot` - fix a crash in `auth_v2` in `active_directory_v2` ([#21381](https://github.com/hashicorp/terraform-provider-azurerm/issues/21381))\n\n## 3.51.0 (April 06, 2023)\n\nBREAKING CHANGES:\n\n* `azurerm_kubernetes_cluster` - the `sku_tier` property no longer accepts the value `Paid`, it must be updated to `Standard` ([#21256](https://github.com/hashicorp/terraform-provider-azurerm/issues/21256))\n\nFEATURES:\n\n* **New Resource:** `azurerm_arc_kubernetes_cluster` ([#15401](https://github.com/hashicorp/terraform-provider-azurerm/issues/15401))\n* **New Resource:** `azurerm_resource_group_cost_management_view` ([#21112](https://github.com/hashicorp/terraform-provider-azurerm/issues/21112))\n* **New Resource:** `azurerm_signalr_service_custom_certificate` ([#21112](https://github.com/hashicorp/terraform-provider-azurerm/issues/21112))\n* **New Resource:** `azurerm_storage_mover` ([#21000](https://github.com/hashicorp/terraform-provider-azurerm/issues/21000))\n* **New Resource:** `azurerm_subscription_cost_management_view` ([#21112](https://github.com/hashicorp/terraform-provider-azurerm/issues/21112))\n* **New Resource:** `azurerm_voice_services_communications_gateway_test_line` ([#21111](https://github.com/hashicorp/terraform-provider-azurerm/issues/21111))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230405.1143248` of `github.com/hashicorp/go-azure-sdk` ([#21312](https://github.com/hashicorp/terraform-provider-azurerm/issues/21312))\n* dependencies: updating to `v0.20230331.1120327` of `github.com/tombuildsstuff/kermit` ([#21235](https://github.com/hashicorp/terraform-provider-azurerm/issues/21235))\n* dependencies: updating `containerservice/2022-09-02-preview` to `2023-02-02-preview` ([#21256](https://github.com/hashicorp/terraform-provider-azurerm/issues/21256))\n* dependencies: updating `search/2020-03-13` to `search/2022-09-01` ([#21250](https://github.com/hashicorp/terraform-provider-azurerm/issues/21250))\n* `batch`: updating to API Version `2022-01-01.15.0` (from `github.com/tombuildsstuff/kermit`) ([#21234](https://github.com/hashicorp/terraform-provider-azurerm/issues/21234))\n* Data Source: `azurerm_monitor_data_collection_rule` - support for the `data_collection_endpoint_id` property ([#21159](https://github.com/hashicorp/terraform-provider-azurerm/issues/21159))\n* Data Source: `azurerm_monitor_data_collection_rule` - support for the `identity` and `stream_declaration` blocks ([#21159](https://github.com/hashicorp/terraform-provider-azurerm/issues/21159))\n* Data Source: `azurerm_monitor_data_collection_rule` - support for more `destinations`, `data_sources` and `data_flow` transformations ([#21159](https://github.com/hashicorp/terraform-provider-azurerm/issues/21159))\n* `azurerm_app_configuration_feature` - support for the `key` property ([#21252](https://github.com/hashicorp/terraform-provider-azurerm/issues/21252))\n* `azurerm_container_app` - the `app_port` property is now optional ([#20567](https://github.com/hashicorp/terraform-provider-azurerm/issues/20567))\n* `azurerm_healthcare_fhir_service` - support for `PATCH` as an available value for `cors` ([#21222](https://github.com/hashicorp/terraform-provider-azurerm/issues/21222))\n* `azurerm_healthcare_service` - upport for `PATCH` as an available value for `cors` ([#21222](https://github.com/hashicorp/terraform-provider-azurerm/issues/21222))\n* `azurerm_kubernetes_cluster` - support `KataMshvVmIsolation` as a option for the `workload_runtime` property ([#21176](https://github.com/hashicorp/terraform-provider-azurerm/issues/21176))\n* `azurerm_kubernetes_cluster_node_pool` - support `KataMshvVmIsolation` as a option for the `workload_runtime` property ([#21176](https://github.com/hashicorp/terraform-provider-azurerm/issues/21176))\n* `azurerm_monitor_data_collection_rule` - support for the `data_collection_endpoint_id` property ([#21159](https://github.com/hashicorp/terraform-provider-azurerm/issues/21159))\n* `azurerm_monitor_data_collection_rule` - support for the `identity` and `stream_declaration` blocks ([#21159](https://github.com/hashicorp/terraform-provider-azurerm/issues/21159))\n* `azurerm_monitor_data_collection_rule` - support for more `destinations`, `data_sources` and `data_flow` transformations ([#21159](https://github.com/hashicorp/terraform-provider-azurerm/issues/21159))\n* `azurerm_signalr_service` - support for the `http_request_logs_enabled` property ([#21032](https://github.com/hashicorp/terraform-provider-azurerm/issues/21032))\n* `azurerm_snapshot` - support for the `incremental_enabled` property ([#21263](https://github.com/hashicorp/terraform-provider-azurerm/issues/21263))\n* `azurerm_web_pubsub_hub` - support for the `event_listener` block ([#21145](https://github.com/hashicorp/terraform-provider-azurerm/issues/21145))\n\nBUG FIXES:\n\n* Data Source: `azurerm_app_configuration_keys` - fixing a regression where the API doesn't return the http endpoint when listing items ([#21208](https://github.com/hashicorp/terraform-provider-azurerm/issues/21208))\n* Data Source: `azurerm_kubernetes_cluster` - prevent errors when used with limited permissions ([#21229](https://github.com/hashicorp/terraform-provider-azurerm/issues/21229))\n* `azurerm_api_management` - prevent error from empty response body when updating the resource ([#21221](https://github.com/hashicorp/terraform-provider-azurerm/issues/21221))\n* `azurerm_application_gateway` - correctly validate the `firewall_policy_id` property ([#21238](https://github.com/hashicorp/terraform-provider-azurerm/issues/21238))\n* `azurerm_automation_software_update_configuration` - `time_zone` correctly defaults to `Etc/UTC` ([#21254](https://github.com/hashicorp/terraform-provider-azurerm/issues/21254))\n* `azurerm_digital_twins_time_series_database_connection` - insensitively parse `kusto_cluster_uri` ([#21243](https://github.com/hashicorp/terraform-provider-azurerm/issues/21243))\n* `azurerm_express_route_circuit` - can now set `authorization_key` during creation ([#21132](https://github.com/hashicorp/terraform-provider-azurerm/issues/21132))\n* `azurerm_kusto_eventhub_data_connection` - insensitively parse `identity_id` if it applies to a Kusto Cluster ([#21243](https://github.com/hashicorp/terraform-provider-azurerm/issues/21243))\n* `azurerm_linux_function_app`  - fix a crash in `auth_v2` in `active_directory_v2` ([#21219](https://github.com/hashicorp/terraform-provider-azurerm/issues/21219))\n* `azurerm_linux_function_app_slot`  - fix a crash in `auth_v2` in `active_directory_v2` ([#21219](https://github.com/hashicorp/terraform-provider-azurerm/issues/21219))\n* `azurerm_linux_web_app`  - fix a crash in `auth_v2` in `active_directory_v2` ([#21219](https://github.com/hashicorp/terraform-provider-azurerm/issues/21219))\n* `azurerm_linux_web_app_slot`  - fix a crash in `auth_v2` in `active_directory_v2` ([#21219](https://github.com/hashicorp/terraform-provider-azurerm/issues/21219))\n* `azurerm_monitor_diagnostic_setting` - insensitively parse the resource's ID if it is created for a Kusto Cluster ([#21243](https://github.com/hashicorp/terraform-provider-azurerm/issues/21243))\n* `azurerm_mssql_database` - fix a issue with `short_term_retention_policy` preventing creation ([#21268](https://github.com/hashicorp/terraform-provider-azurerm/issues/21268))\n* `azurerm_windows_function_app`  - fix a crash in `auth_v2` in `active_directory_v2` ([#21219](https://github.com/hashicorp/terraform-provider-azurerm/issues/21219))\n* `azurerm_windows_function_app_slot`  - fix a crash in `auth_v2` in `active_directory_v2` ([#21219](https://github.com/hashicorp/terraform-provider-azurerm/issues/21219))\n* `azurerm_windows_web_app`  - fix a crash in `auth_v2` in `active_directory_v2` ([#21219](https://github.com/hashicorp/terraform-provider-azurerm/issues/21219))\n* `azurerm_windows_web_app_slot`  - fix a crash in `auth_v2` in `active_directory_v2` ([#21219](https://github.com/hashicorp/terraform-provider-azurerm/issues/21219))\n\n## 3.50.0 (March 30, 2023)\n\nFEATURES:\n\n* **New DataSource:** `azurerm_container_app` ([#21199](https://github.com/hashicorp/terraform-provider-azurerm/issues/21199))\n* **New Resource:** `azurerm_web_pubsub_custom_certificate` ([#21114](https://github.com/hashicorp/terraform-provider-azurerm/issues/21114))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230329.1052505` of `github.com/hashicorp/go-azure-sdk` ([#21175](https://github.com/hashicorp/terraform-provider-azurerm/issues/21175))\n* dependencies: updated `azurerm_subscription` to use new SDK ([#18813](https://github.com/hashicorp/terraform-provider-azurerm/issues/18813))\n* `azurerm_databricks_access_connector` - support for user assigned identities ([#21059](https://github.com/hashicorp/terraform-provider-azurerm/issues/21059))\n* `azurerm_linux_function_app`  - add support for `zip_deploy_file` ([#20544](https://github.com/hashicorp/terraform-provider-azurerm/issues/20544))\n* `azurerm_monitor_scheduled_query_rules_alert` - `trigger.x.metric_column` is now optional ([#21203](https://github.com/hashicorp/terraform-provider-azurerm/issues/21203))\n* `azurerm_mssql_database` - HyperScale Skus now support `long_term_retention_policy` and `short_term_retention_policy` ([#21166](https://github.com/hashicorp/terraform-provider-azurerm/issues/21166))\n* `azurerm_windows_function_app` - add support for `zip_deploy_file` ([#20544](https://github.com/hashicorp/terraform-provider-azurerm/issues/20544))\n\nBUG FIXES:\n\n* Data Source: `azurerm_databricks_workspace_private_endpoint_connection`: validating `private_endpoint_id` and `workspace_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* Data Source: `azurerm_healthcare_medtech_service` - the `workspace_id` field is no longer marked as ForceNew ([#21077](https://github.com/hashicorp/terraform-provider-azurerm/issues/21077))\n* Data Source: `azurerm_healthcare_medtech_service` - support for Azure Environments other then Azure Public ([#21077](https://github.com/hashicorp/terraform-provider-azurerm/issues/21077))\n* `azurerm_api_management` - validating `public_ip_address_id` and `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_api_management_custom_domain` - validating `api_management_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_api_management_policy` - validating `api_management_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_api_management_gateway_api` - validating `api_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_application_gateway` - validating `firewall_policy_id` and `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_application_gateway` - validating that `data` within the `ssl_certificate` block is a base64-encoded value ([#21191](https://github.com/hashicorp/terraform-provider-azurerm/issues/21191))\n* `azurerm_application_insights_analytics_item` - validating `application_insights_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_application_insights_api_key` - validating `application_insights_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_application_insights_smart_detection_rule` - validating `application_insights_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_application_insights_standard_webtests` - validating `application_insights_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_application_insights_webtests` - validating `application_insights_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_app_service_virtual_network_swift_connection` - validating `app_service_id` and `virtual_network_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_bastion_host` - validating `public_ip_address_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_container_registry` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_database_migration_service` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_databricks_workspace` - validating `load_balancer_backend_address_pool_id`, `machine_learning_workspace_id` and `virtual_network_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_data_factory_linked_service_key_vault` - validating `key_vault_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_data_factory_integration_runtime_managed` - validating `vnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_data_share_dataset_kusto_cluster` - validating `kusto_cluster_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_data_share_dataset_kusto_database` - validating `kusto_database_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_eventhub_namespace` - validating the `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_eventhub_namespace_disaster_recovery_config` - fixing a bug where `partner_namespace_id` would validate with an empty string when the field should instead be omitted ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_express_route_circuit_peering` - validating `route_filter_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_express_route_gateway` - validating `virtual_hub_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_eventhub` - validating `storage_account_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_eventgrid_event_subscription` - validating `eventhub_resource_id`, `servicebus_queue_endpoint_id`, `servicebus_topic_endpoint_id` and `storage_account_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_frontdoor` - validating `web_application_firewall_policy_link_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_hdinsight_hadoop_cluster` - validating `storage_resource_id`, `subnet_id` and `virtual_network_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_hdinsight_hbase_cluster` - validating `storage_resource_id`, `subnet_id` and `virtual_network_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_hdinsight_interactive_query_cluster` - validating `storage_resource_id`, `subnet_id` and `virtual_network_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_hdinsight_kafka_cluster` - validating `storage_resource_id`, `subnet_id` and `virtual_network_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_hdinsight_spark_cluster` - validating `storage_resource_id`, `subnet_id` and `virtual_network_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_healthcare_medtech_service` - support for Azure Environments other then Azure Public ([#21077](https://github.com/hashicorp/terraform-provider-azurerm/issues/21077))\n* `azurerm_hpc_cache` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_image` - validating `managed_disk_id` and `source_virtual_machine_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_iothub_certificate` - certificate content now updates correctly ([#21163](https://github.com/hashicorp/terraform-provider-azurerm/issues/21163))\n* `azurerm_iothub_dps_certificate` - certificate content now updates correctly ([#21163](https://github.com/hashicorp/terraform-provider-azurerm/issues/21163))\n* `azurerm_key_vault_access_policy` - validating `key_vault_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_key_vault_certificate_issuer` - validating `key_vault_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_kubernetes_cluster` - validating `vnet_subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_kubernetes_cluster_node_pool` - validating `vnet_subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_kusto_attached_database_configuration` - validating the `cluster_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_kusto_cluster` - validating `subnet_id`, `engine_public_ip_id` and `data_management_public_ip_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_kusto_eventgrid_data_connection` - validating `eventgrid_resource_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_lb` - validating `public_ip_address_id`, `public_ip_prefix_id` and `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_lb_nat_rule` - validating the `backend_address_pool_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_linux_function_app`  - fix crash in `auth_v2` in `active_directory_v2` ([#21113](https://github.com/hashicorp/terraform-provider-azurerm/issues/21113))\n* `azurerm_linux_function_app_slot`  - fix crash in `auth_v2` in `active_directory_v2` ([#21113](https://github.com/hashicorp/terraform-provider-azurerm/issues/21113))\n* `azurerm_linux_web_app`  - fix crash in `auth_v2` in `active_directory_v2` ([#21113](https://github.com/hashicorp/terraform-provider-azurerm/issues/21113))\n* `azurerm_linux_web_app_slot`  - fix crash in `auth_v2` in `active_directory_v2` ([#21113](https://github.com/hashicorp/terraform-provider-azurerm/issues/21113))\n* `azurerm_linux_virtual_machine` - validating `application_security_group_ids` and `key_vault_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_linux_virtual_machine_scale_set` - validating `key_vault_id`, `network_security_group_id`, `public_ip_prefix_id` and `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_log_analytics_linked_service` - validating the workspace id ([#21170](https://github.com/hashicorp/terraform-provider-azurerm/issues/21170))\n* `azurerm_log_analytics_linked_storage_account` - validating the `storage_account_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_logic_app_action_custom` - validating `logic_app_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_logic_app_action_http` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_logic_app_trigger_custom` - validating `logic_app_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_logic_app_trigger_http_request` - validating `logic_app_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_logic_app_trigger_recurrence` - validating `logic_app_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_mssql_virtual_machine` - the `sql_license_type` property is now optional ([#21138](https://github.com/hashicorp/terraform-provider-azurerm/issues/21138))\n* `azurerm_managed_disk` - validating `disk_access_id` and `storage_account_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_mariadb_virtual_network_rule` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_monitor_action_group` - validating `automation_account_id` and `function_app_resource_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_monitor_log_profile` - validating `storage_account_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_mssql_database` - fixing an int64 overflow for `max_size_gb` on 32-bit platforms ([#21155](https://github.com/hashicorp/terraform-provider-azurerm/issues/21155))\n* `azurerm_mssql_database` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_mysql_virtual_network_rule` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_netapp_volume` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_network_interface` - validating `public_ip_address_id` and `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_network_interface_application_gateway_association` - validating `backend_address_pool_id` and `network_interface_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_network_interface_application_security_group_association` - validate `application_security_group_id` and `network_interface_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_network_interface_backend_address_pool_association` - validating the `backend_address_pool_id` and `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_network_interface_network_security_group_association` - validating `network_security_group_id` and `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_network_interface_nat_rule_association` - validating `network_interface_id` and `nat_rule_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_network_profile` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_network_watcher_flow_log` - fixing the delete function to work reliably during deletion ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_network_watcher_flow_log` - validating `storage_account_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_orchestrated_virtual_machine_scale_set` - validating `application_security_group_ids`, `key_vault_id`,  `proximity_placement_group_id`, `public_ip_prefix_id` and `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_private_link_service` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_public_ip` - validating `public_ip_prefix_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_postgresql_virtual_network_rule` - validating `subnet_id` is a subnet ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_private_dns_zone_virtual_network_link` - validating `virtual_network_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_role_definition` - polling for longer during deletion ([#21151](https://github.com/hashicorp/terraform-provider-azurerm/issues/21151))\n* `azurerm_sentinel_automation_rule` - validating `logic_app_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_security_center_workspace` - validating `log_analytics_workspace_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_security_center_automation` - validating that a Scope is specified ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_sql_managed_database` - validating `managed_instance_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_sql_managed_instance` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_static_site_custom_domain` - validating `static_site_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_storage_account` - updating the validation for `ip_rules` to highlight the IP Range that's invalid when the validation fails ([#21178](https://github.com/hashicorp/terraform-provider-azurerm/issues/21178))\n* `azurerm_storage_account_network_rules` - validating `ip_rules` ([#21178](https://github.com/hashicorp/terraform-provider-azurerm/issues/21178))\n* `azurerm_storage_management_policy` - validating `storage_account_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_subnet_nat_gateway_association` - validating `nat_gateway_id` and `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_subnet_network_security_group_association` - validating `network_security_group_id` and `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_subnet_route_table_association` - validating `subnet_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_virtual_hub` - validating `virtual_wan_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_virtual_machine_data_disk_attachment` - validating `managed_disk_id` and `virtual_machine_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_virtual_network` - validating `ddos_protection_plan_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_virtual_network_gateway` - validating `default_local_network_gateway_id` and `public_ip_address_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_virtual_network_gateway_connection` - validating `express_route_circuit_id`, `local_network_gateway_id` and `peer_virtual_network_gateway_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_web_application_firewall_policy` - the `match_values` property is now optional ([#21125](https://github.com/hashicorp/terraform-provider-azurerm/issues/21125))\n* `azurerm_windows_function_app`  - fix crash in `auth_v2` in `active_directory_v2` ([#21113](https://github.com/hashicorp/terraform-provider-azurerm/issues/21113))\n* `azurerm_windows_function_app_slot`  - fix crash in `auth_v2` in `active_directory_v2` ([#21113](https://github.com/hashicorp/terraform-provider-azurerm/issues/21113))\n* `azurerm_windows_virtual_machine_scale_set` - validating `application_security_group_ids`, `network_security_group_id`, `proximity_placement_group_id`, `public_ip_prefix_id`, `subnet_id` and `virtual_network_gateway_id` ([#21129](https://github.com/hashicorp/terraform-provider-azurerm/issues/21129))\n* `azurerm_windows_web_app`  - fix crash in `auth_v2` in `active_directory_v2` ([#21113](https://github.com/hashicorp/terraform-provider-azurerm/issues/21113))\n* `azurerm_windows_web_app_slot`  - fix crash in `auth_v2` in `active_directory_v2` ([#21113](https://github.com/hashicorp/terraform-provider-azurerm/issues/21113))\n\n## 3.49.0 (March 23, 2023)\n\nBREAKING CHANGES: \nApp Service `site_config`\n* `ip_restriction` blocks are no longer computed - changes to IP restrictions outside of Terraform now presents a diff\n* `scm_ip_restriction` blocks are no longer computed - changes to SCM IP restrictions outside of Terraform now presents a diff\n* `cors` blocks no longer require `allowed_origins`, however, if the property is supplied it must contain at least one item. Omitting this property will set the array empty\n\nFEATURES: \n\n* **New Datasource:** `azurerm_orchestrated_virtual_machine_scale_set` ([#21050](https://github.com/hashicorp/terraform-provider-azurerm/issues/21050))\n* **New Resource:** `azurerm_databricks_virtual_network_peering #20728` ([#20728](https://github.com/hashicorp/terraform-provider-azurerm/issues/20728))\n* **New Resource:** `azurerm_sentinel_threat_intelligence_indicator` ([#20771](https://github.com/hashicorp/terraform-provider-azurerm/issues/20771))\n* **New Resource:** `azurerm_voice_services_communications_gateway` ([#20607](https://github.com/hashicorp/terraform-provider-azurerm/issues/20607))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230322.1105901` of `hashicorp/go-azure-sdk` ([#21079](https://github.com/hashicorp/terraform-provider-azurerm/issues/21079))\n* `databricks`: refactoring to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#21004](https://github.com/hashicorp/terraform-provider-azurerm/issues/21004))\n* `azurerm_app_configuration_key` - the resource's ID is changed to match the Data Plane URL format to work around several bugs in the previous parsing logic ([#20082](https://github.com/hashicorp/terraform-provider-azurerm/issues/20082))\n* `azurerm_app_configuration_feature` - the resource's ID is changed to match the Data Plane URL format to work around several bugs in the previous parsing logic ([#20082](https://github.com/hashicorp/terraform-provider-azurerm/issues/20082))\n* `azurerm_express_route_circuit` - add support for `authorization_key` ([#21104](https://github.com/hashicorp/terraform-provider-azurerm/issues/21104))\n* `azurerm_media_job` - updating to use API Version `2022-07-01` ([#20956](https://github.com/hashicorp/terraform-provider-azurerm/issues/20956))\n* `azurerm_media_transform` - updating to use API Version `2022-07-01` ([#20956](https://github.com/hashicorp/terraform-provider-azurerm/issues/20956))\n* `azurerm_virtual_network_gateway` - support for conditional/patch updates ([#21009](https://github.com/hashicorp/terraform-provider-azurerm/issues/21009))\n* `azurerm_web_application_firewall_policy` - the field `operator` within the `match_conditions` block can now be set to `Any` ([#20971](https://github.com/hashicorp/terraform-provider-azurerm/issues/20971))\n* `azurerm_kubernetes_cluster` - add missing property to `oms_agent` schema([#21046](https://github.com/hashicorp/terraform-provider-azurerm/issues/21046))\n* `azurerm_kubernetes_cluster` - deprecate `docker_bridge_cidr` which is no longer supported by the API since docker is no longer a valid container runtime ([#20952](https://github.com/hashicorp/terraform-provider-azurerm/issues/20952))\n* `azurerm_management_group_policy_assignment` - support for the `overrides` and `resource_selectors` blocks ([#20686](https://github.com/hashicorp/terraform-provider-azurerm/issues/20686))\n* `azurerm_mysql_flexible_server` - support for the `geo_backup_key_vault_key_id` and `geo_backup_user_assigned_identity_id` properties ([#20796](https://github.com/hashicorp/terraform-provider-azurerm/issues/20796))\n* `azurerm_resource_group_policy_assignment` - support for the `overrides` and `resource_selectors` blocks ([#20686](https://github.com/hashicorp/terraform-provider-azurerm/issues/20686))\n* `azurerm_resource_policy_assignment` - support for the `overrides` and `resource_selectors` blocks ([#20686](https://github.com/hashicorp/terraform-provider-azurerm/issues/20686))\n* `azurerm_role_assignment` - support subscription aliases scopes ([#20895](https://github.com/hashicorp/terraform-provider-azurerm/issues/20895))\n* `azurerm_signalr_service` - support for `public_network_access_enabled`, `local_auth_enabled`, `aad_auth_enabled`, `tls_client_cert_enabled`, and `serverless_connection_timeout_in_seconds` properties ([#20975](https://github.com/hashicorp/terraform-provider-azurerm/issues/20975))\n* `azurerm_subscription_policy_assignment` - support for the `overrides` and `resource_selectors` blocks ([#20686](https://github.com/hashicorp/terraform-provider-azurerm/issues/20686))\n* `azurerm_sentinel_log_analytics_workspace_onboarding` - the `resource_group_name` and `workspace_name` properties are deprecated in favour of workspace_id ([#20661](https://github.com/hashicorp/terraform-provider-azurerm/issues/20661))\n* `azurerm_virtual_network_peering` - adding an explicit default value for `allow_forwarded_traffic`, `allow_gateway_transit` and `use_remote_gateways` ([#21009](https://github.com/hashicorp/terraform-provider-azurerm/issues/21009))\n* `azurerm_virtual_hub` - support for the `hub_routing_preference` property ([#21028](https://github.com/hashicorp/terraform-provider-azurerm/issues/21028))\n\nBUG FIXES:\n\n* `azurerm_automation_account` - the `key_source` property is deprecated ([#21041](https://github.com/hashicorp/terraform-provider-azurerm/issues/21041))\n* `azurerm_application_insights` - the `workspace_id` can now be updated without creating a new resource ([#21029](https://github.com/hashicorp/terraform-provider-azurerm/issues/21029))\n* `azurerm_firewall` - Prevent duplicate name from being used for `ip_configuration` and `management_ip_configuration` ([#21068](https://github.com/hashicorp/terraform-provider-azurerm/issues/21068))\n* `azurerm_kubernetes_cluster` - replace calls to the deprecated accessProfiles endpoint with listUserCredentials ([#20927](https://github.com/hashicorp/terraform-provider-azurerm/issues/20927))\n* `azurerm_kusto_cluster` - `language_extensions` is now a Set rather than a List ([#20951](https://github.com/hashicorp/terraform-provider-azurerm/issues/20951))\n* `azurerm_linux_function_app`  - fixan update bug with the `health_check_eviction_time_in_min` property ([#21095](https://github.com/hashicorp/terraform-provider-azurerm/issues/21095))\n* `azurerm_linux_function_app` - fixed processing of `cors` block ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_function_app`  - fixauth_v2 `active_directory_v2` sending empty data ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_linux_function_app`  - fixread for `token_store_enabled` to correctly set returned value in state ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_linux_function_app` - the `ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_function_app` - the `scm_ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_function_app_slot` - fixed processing of `cors` block ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_function_app_slot` - the `ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_function_app_slot` - the `scm_ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_function_app_slot`  - fixauth_v2 `active_directory_v2` sending empty data ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_linux_function_app_slot`  - fixread for `token_store_enabled` to correctly set returned value in state ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_linux_web_app`  - fixauth_v2 `active_directory_v2` sending empty data ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_linux_web_app`  - fixread for `token_store_enabled` to correctly set returned value in state ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_linux_web_app` - fixed processing of `cors` block ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_web_app` - the `ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_web_app` - the `scm_ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_web_app_slot`  - fixauth_v2 `active_directory_v2` sending empty data ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_linux_web_app_slot`  - fixread for `token_store_enabled` to correctly set returned value in state ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_linux_web_app_slot` - fixed processing of `cors` block ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_web_app_slot` - the `ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_linux_web_app_slot` - the `scm_ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_machine_learning_datastore_blobstorage`  - fixan issue creating this resource in clouds other than public ([#21016](https://github.com/hashicorp/terraform-provider-azurerm/issues/21016))\n* `azurerm_virtual_desktop_host_pool` - changing the `load_balancer_type` property no longer creates a new resource ([#20947](https://github.com/hashicorp/terraform-provider-azurerm/issues/20947))\n* `azurerm_windows_function_app`  - fixan update bug with the `health_check_eviction_time_in_min` property ([#21095](https://github.com/hashicorp/terraform-provider-azurerm/issues/21095))\n* `azurerm_windows_function_app` - fixed processing of `cors` block ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_function_app`  - fixauth_v2 `active_directory_v2` sending empty data ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_windows_function_app`  - fixread for `token_store_enabled` to correctly set returned value in state ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_windows_function_app` - the `ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_function_app` - the `scm_ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_function_app_slot` - fixed processing of `cors` block ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_function_app_slot`  - fixauth_v2 `active_directory_v2` sending empty data ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_windows_function_app_slot`  - fixread for `token_store_enabled` to correctly set returned value in state ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_windows_function_app_slot` - the `ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_function_app_slot` - the `scm_ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_web_app` - the `ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_web_app` - fixed processing of `cors` block ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_web_app` - the `scm_ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_web_app`  - fixauth_v2 `active_directory_v2` sending empty data ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_windows_web_app`  - fixread for `token_store_enabled` to correctly set returned value in state ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_windows_web_app_slot` - the `ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_web_app_slot` - fixed processing of `cors` block ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_web_app_slot` - the `scm_ip_restriction` block can is now successfully removed by removing from config ([#20987](https://github.com/hashicorp/terraform-provider-azurerm/issues/20987))\n* `azurerm_windows_web_app_slot`  - fixauth_v2 `active_directory_v2` sending empty data ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n* `azurerm_windows_web_app_slot`  - fixread for `token_store_enabled` to correctly set returned value in state ([#21091](https://github.com/hashicorp/terraform-provider-azurerm/issues/21091))\n\n\n## 3.48.0 (March 16, 2023)\n\nFEATURES: \n\n* **New Data Source:** `azurerm_mobile_network_sim_policy` [FGH-20732]\n* **New Resource:** `azurerm_express_route_port_authorization` ([#20736](https://github.com/hashicorp/terraform-provider-azurerm/issues/20736))\n* **New Resource:** `azurerm_mobile_network_sim_policy` ([#20732](https://github.com/hashicorp/terraform-provider-azurerm/issues/20732))\n* **New Resource:** `azurerm_site_recovery_vmware_replication_policy` ([#20881](https://github.com/hashicorp/terraform-provider-azurerm/issues/20881))\n* **New Resource:** `azurerm_sentinel_alert_rule_anomaly_duplicate` ([#20760](https://github.com/hashicorp/terraform-provider-azurerm/issues/20760))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230316.1132628` of `github.com/hashicorp/go-azure-sdk` ([#20986](https://github.com/hashicorp/terraform-provider-azurerm/issues/20986))\n* `signalr`: updating to API Version `2023-02-01` ([#20910](https://github.com/hashicorp/terraform-provider-azurerm/issues/20910))\n* `webpubsub`: updating to API Version `2023-02-01` ([#20910](https://github.com/hashicorp/terraform-provider-azurerm/issues/20910))\n* `azurerm_express_route_gateway` - support for the `allow_non_virtual_wan_traffic` property ([#20667](https://github.com/hashicorp/terraform-provider-azurerm/issues/20667))\n* `azurerm_ssh_public_key` -  allow `.` for `name` validation ([#20955](https://github.com/hashicorp/terraform-provider-azurerm/issues/20955))\n\nBUG FIXES:\n\n* provider: fix an authentication bug which sometimes caused access tokens to be refreshed too late ([#20894](https://github.com/hashicorp/terraform-provider-azurerm/issues/20894))\n* `azurerm_bot_channel_directline` - fixing an issue where an empty `site` was passed to the API ([#20890](https://github.com/hashicorp/terraform-provider-azurerm/issues/20890))\n* `azurerm_healthcare_dicom_service` - extending the `create` and `update` timeouts to `90` minutes ([#20932](https://github.com/hashicorp/terraform-provider-azurerm/issues/20932))\n* `azurerm_kusto_eventhub_data_connection` - fixing an issue where an existing resource wouldn't be flagged during creation ([#20926](https://github.com/hashicorp/terraform-provider-azurerm/issues/20926))\n* `azurerm_linux_function_app` - Fixed apply time validation when using `WEBSITE_CONTENTOVERVNET`  ([#18258](https://github.com/hashicorp/terraform-provider-azurerm/issues/18258))\n* `azurerm_windows_function_app` - Fixed apply time validation when using `WEBSITE_CONTENTOVERVNET` ([#18258](https://github.com/hashicorp/terraform-provider-azurerm/issues/18258))\n\n\n## 3.47.0 (March 09, 2023)\n\nFEATURES: \n\n* **New Resource:** `azurerm_sentinel_metadata` ([#20801](https://github.com/hashicorp/terraform-provider-azurerm/issues/20801))\n\nENHANCEMENTS\n\n* dependencies: updating to `v4.4.0+incompatible` of `github.com/gofrs/uuid` ([#20821](https://github.com/hashicorp/terraform-provider-azurerm/issues/20821))\n* dependencies: updating to `v0.55.0` of `github.com/hashicorp/go-azure-helpers` ([#20807](https://github.com/hashicorp/terraform-provider-azurerm/issues/20807))\n* dependencies: updating to version `v0.20230309.1123256` of `github.com/hashicorp/go-azure-sdk` ([#20810](https://github.com/hashicorp/terraform-provider-azurerm/issues/20810))\n* dependencies: updating to `v0.20230307.1105329` of `github.com/tombuildsstuff/kermit` ([#20821](https://github.com/hashicorp/terraform-provider-azurerm/issues/20821))\n* dependencies: updating `redis/2021-06-01` to `redis/2022-06-01` ([#20839](https://github.com/hashicorp/terraform-provider-azurerm/issues/20839))\n* `dashboard`: refactoring to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#20810](https://github.com/hashicorp/terraform-provider-azurerm/issues/20810))\n* `media`: refactoring to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#20810](https://github.com/hashicorp/terraform-provider-azurerm/issues/20810))\n* `servicebus`: refactoring to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#20810](https://github.com/hashicorp/terraform-provider-azurerm/issues/20810))\n* Data Source: `azurerm_function_app_host_keys` - exporting `blobs_extension_key` ([#20837](https://github.com/hashicorp/terraform-provider-azurerm/issues/20837))\n* Data Source: `azurerm_servicebus_namespace` - exporting `endpoint` ([#20790](https://github.com/hashicorp/terraform-provider-azurerm/issues/20790))\n* Data Source: `azurerm_kubernetes_cluster` - generate and export `node_resource_group_id` ([#20830](https://github.com/hashicorp/terraform-provider-azurerm/issues/20830))\n* `azurerm_kubernetes_cluster` - generate and export `node_resource_group_id` ([#20830](https://github.com/hashicorp/terraform-provider-azurerm/issues/20830))\n* `azurerm_kubernetes_cluster` - support for the`vertical_pod_autoscaler_enabled` property ([#20751](https://github.com/hashicorp/terraform-provider-azurerm/issues/20751))\n* `azurerm_kubernetes_cluster` - support for the `msi_auth_for_monitoring_enabled` property ([#20757](https://github.com/hashicorp/terraform-provider-azurerm/issues/20757))\n* `azurerm_kubernetes_cluster` - the `vm_size` property of the `default_node_pool` is no longer ForceNew and can be resized by specifying `temporary_name_for_rotation` ([#20628](https://github.com/hashicorp/terraform-provider-azurerm/issues/20628))\n* `azurerm_mariadb_server` - support for the `ssl_minimal_tls_version_enforced` property ([#20782](https://github.com/hashicorp/terraform-provider-azurerm/issues/20782))\n* `azurerm_monitor_action_group` - support for the `location` property ([#20603](https://github.com/hashicorp/terraform-provider-azurerm/issues/20603))\n* `azurerm_mssql_database` - support for `ServerlessGen5` Hyperscale ([#20875](https://github.com/hashicorp/terraform-provider-azurerm/issues/20875))\n* `azurerm_mssql_managed_database` - support for retention policies ([#20845](https://github.com/hashicorp/terraform-provider-azurerm/issues/20845))\n* `azurerm_servicebus_namespace` - exports the `endpoint` attribute ([#20790](https://github.com/hashicorp/terraform-provider-azurerm/issues/20790))\n* `azurerm_virtual_network_peering` - support for  the `triggers` property to allow `address_space` synchronization ([#20877](https://github.com/hashicorp/terraform-provider-azurerm/issues/20877))\n\nBUG FIXES:\n\n* provider: fix an issue with authentication using `oidc_token_file_path` ([#20824](https://github.com/hashicorp/terraform-provider-azurerm/issues/20824))\n* provider: fix an issue with Azure CLI authentication when running in Azure Cloud Shell ([#20824](https://github.com/hashicorp/terraform-provider-azurerm/issues/20824))\n* `azurerm_application_insights_analytics_item` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_automated_connection_type` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_automation_software_update_configuration` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_automation_source_control` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_automation_watcher` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_cdn_frontdoor_origin`  - fixregression where `origin_host_header` value would be inadvertently removed ([#20874](https://github.com/hashicorp/terraform-provider-azurerm/issues/20874))\n* `azurerm_cdn_frontdoor_route_disable_link_to_default_domain` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_container_registry_task`  - fixupdating failed due to incomplete `registry_credential` ([#20841](https://github.com/hashicorp/terraform-provider-azurerm/issues/20841))\n* `azurerm_digital_twins_time_series_database_connection` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_fluid_relay_server` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_function_app_active_slot` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_iothub_endpoint_eventhub` - marking the resource as gone when it's been deleted outside of Terraform ([#20798](https://github.com/hashicorp/terraform-provider-azurerm/issues/20798))\n* `azurerm_iothub`  - fixwrong default value of `file_upload.sas_ttl` when not specified ([#20854](https://github.com/hashicorp/terraform-provider-azurerm/issues/20854))\n* `azurerm_iothub_endpoint_servicebus_queue` - marking the resource as gone when it's been deleted outside of Terraform ([#20798](https://github.com/hashicorp/terraform-provider-azurerm/issues/20798))\n* `azurerm_iothub_endpoint_servicebus_topic` - marking the resource as gone when it's been deleted outside of Terraform ([#20798](https://github.com/hashicorp/terraform-provider-azurerm/issues/20798))\n* `azurerm_iothub_endpoint_servicebus_queue` - marking the resource as gone when it's been deleted outside of Terraform ([#20798](https://github.com/hashicorp/terraform-provider-azurerm/issues/20798))\n* `azurerm_iothub_endpoint_storage_container` - marking the resource as gone when it's been deleted outside of Terraform ([#20798](https://github.com/hashicorp/terraform-provider-azurerm/issues/20798))\n* `azurerm_iothub_fallback_route` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_iothub_route` - marking the resource as gone when it's been deleted outside of Terraform ([#20798](https://github.com/hashicorp/terraform-provider-azurerm/issues/20798))\n* `azurerm_kubernetes_cluster`  - fixvalidation logic for `dns_prefix` ([#20813](https://github.com/hashicorp/terraform-provider-azurerm/issues/20813))\n* `azurerm_linux_function_app_slot`  - fixhealth_check_eviction_time_in_min ([#20816](https://github.com/hashicorp/terraform-provider-azurerm/issues/20816))\n* `azurerm_logic_app_integration_account` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_maintenance_assignment_virtual_machine` - prevent a potential panic from a nil value ([#20781](https://github.com/hashicorp/terraform-provider-azurerm/issues/20781))\n* `azurerm_maintenance_assignment_virtual_machine` - maintenance configuration is now obtained by name rather than using the first in the list ([#20766](https://github.com/hashicorp/terraform-provider-azurerm/issues/20766))\n* `azurerm_nginx_certificate` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_nginx_configuration` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_nginx_deployment` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_synapse_workspace_aad_admin` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_synapse_workspace_key` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_synapse_workspace_sql_aad_admin` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_web_app_active_slot` - marking the resource as gone when it's been deleted outside of Terraform ([#20797](https://github.com/hashicorp/terraform-provider-azurerm/issues/20797))\n* `azurerm_windows_function_app_slot`  - fixhealth_check_eviction_time_in_min ([#20816](https://github.com/hashicorp/terraform-provider-azurerm/issues/20816))\n\n\n## 3.46.0 (March 02, 2023)\n\nFEATURES\n\n* **New Data Source:** `azurerm_mobile_network_data_network` ([#20338](https://github.com/hashicorp/terraform-provider-azurerm/issues/20338))\n* **New Data Source:** `azurerm_sentinel_alert_rule_anomaly_built_in` ([#20368](https://github.com/hashicorp/terraform-provider-azurerm/issues/20368))\n* **New Resource:** `azurerm_mobile_network_data_network` ([#20338](https://github.com/hashicorp/terraform-provider-azurerm/issues/20338))\n* **New Resource:** `azurerm_sentinel_alert_rule_anomaly_built_in` ([#20368](https://github.com/hashicorp/terraform-provider-azurerm/issues/20368))\n* **New Resource:** `azurerm_sentinel_alert_rule_threat_intelligence` ([#20739](https://github.com/hashicorp/terraform-provider-azurerm/issues/20739))\n\nENHANCEMENTS\n\n* dependencies: updating to `v0.20230228.1160358` of `github.com/hashicorp/go-azure-sdk` ([#20688](https://github.com/hashicorp/terraform-provider-azurerm/issues/20688))\n* dependencies: updating to `v0.20230224.1120200` of `github.com/tombuildsstuff/kermit` ([#20649](https://github.com/hashicorp/terraform-provider-azurerm/issues/20649))\n* dependencies: updating `containerservice/2022-09-02-preview` to `2023-01-02-preview` ([#20734](https://github.com/hashicorp/terraform-provider-azurerm/issues/20734))\n* dependencies: updating `hybridCompute/2022-03-10` to `2022-11-10` ([#20733](https://github.com/hashicorp/terraform-provider-azurerm/issues/20733))\n* `aadb2c`: refactoring to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#20715](https://github.com/hashicorp/terraform-provider-azurerm/issues/20715))\n* `databoxedge` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20638](https://github.com/hashicorp/terraform-provider-azurerm/issues/20638))\n* `dns`: refactoring to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#20688](https://github.com/hashicorp/terraform-provider-azurerm/issues/20688))\n* `maps`: refactoring to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#20688](https://github.com/hashicorp/terraform-provider-azurerm/issues/20688))\n* `signalr`: refactoring to use `hashicorp/go-azure-sdk` as a base layer rather than `Azure/go-autorest` ([#20688](https://github.com/hashicorp/terraform-provider-azurerm/issues/20688))\n* `compute/shared_image_gallery` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20599](https://github.com/hashicorp/terraform-provider-azurerm/issues/20599))\n* `compute/gallery_application` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20599](https://github.com/hashicorp/terraform-provider-azurerm/issues/20599))\n* `compute/gallery_application_version` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20599](https://github.com/hashicorp/terraform-provider-azurerm/issues/20599))\n* `iottimeseriesinsights` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20416](https://github.com/hashicorp/terraform-provider-azurerm/issues/20416))\n* `policy/assignment` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20638](https://github.com/hashicorp/terraform-provider-azurerm/issues/20638))\n* `sentinel/alert_rule` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20680](https://github.com/hashicorp/terraform-provider-azurerm/issues/20680))\n* `sentinel/automation_rule` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20726](https://github.com/hashicorp/terraform-provider-azurerm/issues/20726))\n* **Data Source:** `azurerm_linux_function_app` - support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20722](https://github.com/hashicorp/terraform-provider-azurerm/issues/20722))\n* **Data Source:**`azurerm_windows_function_app` -support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20722](https://github.com/hashicorp/terraform-provider-azurerm/issues/20722))\n* `azurerm_app_service_connection` - support for the `secret_store` block ([#20613](https://github.com/hashicorp/terraform-provider-azurerm/issues/20613))\n* `express_route_circuit_peering_resource` - support for the `advertised_communities` property ([#20708](https://github.com/hashicorp/terraform-provider-azurerm/issues/20708))\n* `azurerm_healthcare_service` - extend range of the cosmosdb_throughput to a maximum of `100000` ([#20755](https://github.com/hashicorp/terraform-provider-azurerm/issues/20755))\n* `azurerm_key_vault_key` - support for the `rotation_policy` block ([#19113](https://github.com/hashicorp/terraform-provider-azurerm/issues/19113))\n* `azurerm_kubernetes_cluster` - support for `Standard` with the `sku_tier` ([#20734](https://github.com/hashicorp/terraform-provider-azurerm/issues/20734))\n* `azurerm_linux_function_app` - support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20722](https://github.com/hashicorp/terraform-provider-azurerm/issues/20722))\n* `azurerm_linux_function_app_slot` - support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20722](https://github.com/hashicorp/terraform-provider-azurerm/issues/20722))\n* `azurerm_media_streaming_policy` - support for the `common_encryption_cbcs.clear_key_encryption`, `common_encryption_cenc.clear_key_encryption`, `common_encryption_cenc.clear_track`, `common_encryption_cenc.content_key_to_track_mapping` and `envelope_encryption` properties ([#20524](https://github.com/hashicorp/terraform-provider-azurerm/issues/20524))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support for the  `priority_mix` property ([#20618](https://github.com/hashicorp/terraform-provider-azurerm/issues/20618))\n* `azurerm_storage_management_policy` - support for `auto_tier_to_hot_from_cool_enabled` ([#20641](https://github.com/hashicorp/terraform-provider-azurerm/issues/20641))\n* `azurerm_spring_cloud_connection` - support for the `secret_store` block ([#20613](https://github.com/hashicorp/terraform-provider-azurerm/issues/20613))\n* `azurerm_windows_function_app` - support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20722](https://github.com/hashicorp/terraform-provider-azurerm/issues/20722))\n* `azurerm_windows_function_app_slot` - support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20722](https://github.com/hashicorp/terraform-provider-azurerm/issues/20722))\n\n\n\nBUG FIXES\n\n* Data Source: `azurerm_automation_variable_bool` - fixed a regression in read ([#20665](https://github.com/hashicorp/terraform-provider-azurerm/issues/20665))\n* Data Source: `azurerm_automation_variable_datetime` - fixed a regression in read ([#20665](https://github.com/hashicorp/terraform-provider-azurerm/issues/20665))\n* Data Source: `azurerm_automation_variable_int` - fixed a regression in read ([#20665](https://github.com/hashicorp/terraform-provider-azurerm/issues/20665))\n* Data Source: `azurerm_automation_variable_string` - fixed a regression in read ([#20665](https://github.com/hashicorp/terraform-provider-azurerm/issues/20665))\n* `azurerm_aadb2c_directory` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_cdn_frontdoor_origin` - `origin_host_header` can now be cleared once it is set ([#20679](https://github.com/hashicorp/terraform-provider-azurerm/issues/20679))\n* `azurerm_container_app` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_communication_service` - changing the `data_location` property now creates a new resource ([#20711](https://github.com/hashicorp/terraform-provider-azurerm/issues/20711))\n* `azurerm_eventhub_cluster` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_eventhub_namespace` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_eventhub_namespace_disaster_recovery_config` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_kubernetes_cluster_node_pool` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_iothub_dps` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_media_services_account`: fix crash around `key_delivery_access_control` ([#20685](https://github.com/hashicorp/terraform-provider-azurerm/issues/20685))\n* `azurerm_netapp_account` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_netapp_pool` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_netapp_snapshot` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_netapp_snapshot_policy` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_netapp_volume` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_netapp_volume`  - fixpotential nil panic in resource read ([#20662](https://github.com/hashicorp/terraform-provider-azurerm/issues/20662))\n* `azurerm_notification_hub` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_notification_hub_namespace` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_proximity_placement_group` - now correctly updates when a vm is attached ([#20131](https://github.com/hashicorp/terraform-provider-azurerm/issues/20131))\n* `azurerm_sentinel_log_analytics_workspace_onboard` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_servicebus_namespace_disaster_recovery_config` - fixing a crash when the connection dropped ([#20670](https://github.com/hashicorp/terraform-provider-azurerm/issues/20670))\n* `azurerm_storage_object_replication` - now functions when cross tenant replication is disabled ([#20132](https://github.com/hashicorp/terraform-provider-azurerm/issues/20132))\n\n## 3.45.0 (February 23, 2023)\n\nFEATURES\n\n* `App Service` - Add authV2 to Web Apps ([#20449](https://github.com/hashicorp/terraform-provider-azurerm/issues/20449))\n* **New Resource:** `azurerm_site_recovery_hyperv_replication_policy` ([#20454](https://github.com/hashicorp/terraform-provider-azurerm/issues/20454))\n* **New Resource:** `azurerm_site_recovery_hyperv_replication_policy_association` ([#20630](https://github.com/hashicorp/terraform-provider-azurerm/issues/20630))\n\nENHANCEMENTS\n\n* dependencies: updating to `v0.20230222.1094703` of `github.com/hashicorp/go-azure-sdk` ([#20610](https://github.com/hashicorp/terraform-provider-azurerm/issues/20610))\n* dependencies: updating to `v0.7.0` of `golang.org/x/net` ([#20541](https://github.com/hashicorp/terraform-provider-azurerm/issues/20541))\n* `automation` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20568](https://github.com/hashicorp/terraform-provider-azurerm/issues/20568))\n* `compute/capacityreservations` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20580](https://github.com/hashicorp/terraform-provider-azurerm/issues/20580))\n* `compute/capacityreservationgroups` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20580](https://github.com/hashicorp/terraform-provider-azurerm/issues/20580))\n* `kusto` - switching to use `github.com/hashicorp/go-azure-sdk` ([#20563](https://github.com/hashicorp/terraform-provider-azurerm/issues/20563))\n* `azurerm_backup_policy_vm` - add support for `instant_restore_resource_group` ([#20562](https://github.com/hashicorp/terraform-provider-azurerm/issues/20562))\n* `azurerm_express_route_connection` - support for the `inbound_route_map_id`, `outbound_route_map_id`, and `enabled_private_link_fast_path` properties ([#20619](https://github.com/hashicorp/terraform-provider-azurerm/issues/20619))\n* `azurerm_kusto_cluster_customer_managed_key` - `key_version` is now Optional to allow for auto-rotation of key ([#20583](https://github.com/hashicorp/terraform-provider-azurerm/issues/20583))\n* `azurerm_linux_virtual_machine` - strengthen validation for `admin_password` ([#20558](https://github.com/hashicorp/terraform-provider-azurerm/issues/20558))\n* `azurerm_linux_web_app` - add support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20449](https://github.com/hashicorp/terraform-provider-azurerm/issues/20449))\n* `azurerm_linux_web_app_slot` - add support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20449](https://github.com/hashicorp/terraform-provider-azurerm/issues/20449))\n* `azurerm_postgresql_flexible_server` - a server can now be created without enabling password authtication ([#20578](https://github.com/hashicorp/terraform-provider-azurerm/issues/20578))\n* `azurerm_media_streaming_endpoint` - add support for reading `sku` and increase limit for `scale_units` ([#20585](https://github.com/hashicorp/terraform-provider-azurerm/issues/20585))\n* `azurerm_recovery_services_vault` - add support for `classic_vmware_replication_enabled` ([#20473](https://github.com/hashicorp/terraform-provider-azurerm/issues/20473))\n* `azurerm_windows_virtual_machine` - strengthen validation for `admin_password` ([#20558](https://github.com/hashicorp/terraform-provider-azurerm/issues/20558))\n* `azurerm_windows_web_app` - add support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20449](https://github.com/hashicorp/terraform-provider-azurerm/issues/20449))\n* `azurerm_windows_web_app_slot` - add support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20449](https://github.com/hashicorp/terraform-provider-azurerm/issues/20449))\n* **Data Source:** `azurerm_linux_web_app` - add support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20449](https://github.com/hashicorp/terraform-provider-azurerm/issues/20449))\n* **Data Source:**`azurerm_windows_web_app` - add support for AuthV2 (EasyAuthV2) `auth_settings_v2` ([#20449](https://github.com/hashicorp/terraform-provider-azurerm/issues/20449))\n\nBUG FIXES\n\n* Data Source: `azurerm_linux_web_app` - set `virtual_network_subnet_id` correctly ([#20577](https://github.com/hashicorp/terraform-provider-azurerm/issues/20577))\n* Data Source: `azurerm_redis_cache`  - fixissue when no patch schedules can be found ([#20516](https://github.com/hashicorp/terraform-provider-azurerm/issues/20516))\n* Data Source: `azurerm_windows_web_app` - set `virtual_network_subnet_id` correctly ([#20577](https://github.com/hashicorp/terraform-provider-azurerm/issues/20577))\n* `azurerm_batch_pool` - set user assigned id for `azure_blob_file_system` correctly ([#20560](https://github.com/hashicorp/terraform-provider-azurerm/issues/20560))\n* `azurerm_iot_dps` - allow older resources to update without having set `data_residency_enabled` ([#20632](https://github.com/hashicorp/terraform-provider-azurerm/issues/20632))\n* `azurerm_kubernetes_cluster` - prevent crash when `SecurityProfile` is nil ([#20584](https://github.com/hashicorp/terraform-provider-azurerm/issues/20584))\n* `azurerm_log_analytics_workspace` - prevent ForceNew when `sku` is `LACluster` ([#19608](https://github.com/hashicorp/terraform-provider-azurerm/issues/19608))\n* `azurerm_media_streaming_endpoint` - set and update `tags` properly ([#20585](https://github.com/hashicorp/terraform-provider-azurerm/issues/20585))\n* `azurerm_mobile_network_sim_group` - update `identity` to only support User Assigned Identities ([#20474](https://github.com/hashicorp/terraform-provider-azurerm/issues/20474))\n* `azurerm_monitor_diagnostic_setting` - the `log_analytics_destination_type` property is nto computer rather then defaulting to `AzureDiagnostics` on new resources ([#20203](https://github.com/hashicorp/terraform-provider-azurerm/issues/20203))\n\n## 3.44.1 (February 17, 2023)\n\nENHANCEMENTS\n\n* dependencies: updating to `v0.20230217.1150808` of `github.com/hashicorp/go-azure-sdk` ([#20539](https://github.com/hashicorp/terraform-provider-azurerm/issues/20539))\n\nBUG FIXES\n\n* authentication: fixing an issue when obtaining the auth token for Resource Manager in Azure Government ([#20523](https://github.com/hashicorp/terraform-provider-azurerm/issues/20523))\n* authentication: fixing an issue where the default subscription ID was not detected when authenticating using Azure CLI ([#20526](https://github.com/hashicorp/terraform-provider-azurerm/issues/20526))\n* authentication: fixing an issue where Managed Identity authentication would fail ([#20523](https://github.com/hashicorp/terraform-provider-azurerm/issues/20523))\n* Data Source: `azurerm_app_configuration_key` - fixing an issue where the App Configuration was misleadingly marked as gone when the data plane client couldn't be build ([#20533](https://github.com/hashicorp/terraform-provider-azurerm/issues/20533))\n* Data Source: `azurerm_app_configuration_key` - surfacing the error when a data plane client can't be built ([#20533](https://github.com/hashicorp/terraform-provider-azurerm/issues/20533))\n* Data Source: `azurerm_app_configuration_keys` - fixing an issue where the App Configuration was misleadingly marked as gone when the data plane client couldn't be build ([#20533](https://github.com/hashicorp/terraform-provider-azurerm/issues/20533))\n* Data Source: `azurerm_app_configuration_keys` - surfacing the error when a data plane client can't be built ([#20533](https://github.com/hashicorp/terraform-provider-azurerm/issues/20533))\n* `azurerm_app_configuration_feature` - fixing an issue where the App Configuration was misleadingly marked as gone when the data plane client couldn't be build ([#20533](https://github.com/hashicorp/terraform-provider-azurerm/issues/20533))\n* `azurerm_app_configuration_feature` - surfacing the error when a data plane client can't be built ([#20533](https://github.com/hashicorp/terraform-provider-azurerm/issues/20533))\n* `azurerm_app_configuration_key` - fixing an issue where the App Configuration was misleadingly marked as gone when the data plane client couldn't be build ([#20533](https://github.com/hashicorp/terraform-provider-azurerm/issues/20533))\n* `azurerm_app_configuration_key` - surfacing the error when a data plane client can't be built ([#20533](https://github.com/hashicorp/terraform-provider-azurerm/issues/20533))\n* `azurerm_kubernetes_cluster`  - fixa crash when `securityProfile` is nil in the API Response ([#20517](https://github.com/hashicorp/terraform-provider-azurerm/issues/20517))\n* `azurerm_logic_app_standard` - fixing an issue where the `storage endpoint suffix` couldn't be found ([#20536](https://github.com/hashicorp/terraform-provider-azurerm/issues/20536))\n* `azurerm_synapse_role_assignment` - fixing an issue where the `Synapse domain suffix` couldn't be found ([#20536](https://github.com/hashicorp/terraform-provider-azurerm/issues/20536))\n\n## 3.44.0 (February 16, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_hybrid_compute_machine` ([#20211](https://github.com/hashicorp/terraform-provider-azurerm/issues/20211))\n* **New Data Source:** `azurerm_policy_definition_built_in` ([#19933](https://github.com/hashicorp/terraform-provider-azurerm/issues/19933))\n* **New Data Source:** `azurerm_mobile_network_service` ([#20337](https://github.com/hashicorp/terraform-provider-azurerm/issues/20337))\n* **New Data Source:** `azurerm_mobile_network_site` ([#20334](https://github.com/hashicorp/terraform-provider-azurerm/issues/20334))\n* **New Data Source:** `azurerm_mobile_network_slice` ([#20336](https://github.com/hashicorp/terraform-provider-azurerm/issues/20336))\n* **New Data Source:** `azurerm_mobile_network_sim_group` ([#20339](https://github.com/hashicorp/terraform-provider-azurerm/issues/20339))\n* **New Data Source:** `azurerm_virtual_desktop_host_pool` ([#20505](https://github.com/hashicorp/terraform-provider-azurerm/issues/20505))\n* **New Resource:** `azurerm_network_manager_security_admin_configuration` ([#20233](https://github.com/hashicorp/terraform-provider-azurerm/issues/20233))\n* **New Resource:** `azurerm_network_manager_admin_rule_collection` ([#20233](https://github.com/hashicorp/terraform-provider-azurerm/issues/20233))\n* **New Resource:** `azurerm_network_manager_admin_rule` ([#20233](https://github.com/hashicorp/terraform-provider-azurerm/issues/20233))\n* **New Resource:** `azurerm_mobile_network_service` ([#20337](https://github.com/hashicorp/terraform-provider-azurerm/issues/20337))\n* **New Resource:** `azurerm_mobile_network_site` ([#20334](https://github.com/hashicorp/terraform-provider-azurerm/issues/20334))\n* **New Resource:** `azurerm_mobile_network_slice` ([#20336](https://github.com/hashicorp/terraform-provider-azurerm/issues/20336))\n* **New Resource:** `azurerm_mobile_network_sim_group` [GH-20339\n* **New Resource:** `azurerm_site_recovery_services_vault_hyperv_site` [GH-204309\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230216.1112535` of `github.com/hashicorp/go-azure-sdk` ([#20465](https://github.com/hashicorp/terraform-provider-azurerm/issues/20465))\n* dependencies: no longer utilizing `github.com/manicminer/hamilton` ([#20320](https://github.com/hashicorp/terraform-provider-azurerm/issues/20320))\n* provider: support for the `client_certificate` provider property ([#20320](https://github.com/hashicorp/terraform-provider-azurerm/issues/20320))\n* provider: support for the `use_cli` provider property ([#20320](https://github.com/hashicorp/terraform-provider-azurerm/issues/20320))\n* provider: authentication now uses the `github.com/hashicorp/go-azure-sdk/sdk/auth` package ([#20320](https://github.com/hashicorp/terraform-provider-azurerm/issues/20320))\n* provider: cloud configuration now uses the `github.com/hashicorp/go-azure-sdk/sdk/environments` package ([#20320](https://github.com/hashicorp/terraform-provider-azurerm/issues/20320))\n* `datashare`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20501](https://github.com/hashicorp/terraform-provider-azurerm/issues/20501))\n* `managementlocks`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20387](https://github.com/hashicorp/terraform-provider-azurerm/issues/20387))\n* `media`: refactoring `StreamingEndpoints` to use API Version `2022-08-01` ([#20457](https://github.com/hashicorp/terraform-provider-azurerm/issues/20457))\n* `postgres` - updating API to `2022-12-01` ([#20370](https://github.com/hashicorp/terraform-provider-azurerm/issues/20370))\n* Data Source: `azurerm_policy_definition` - support for the `mode` property ([#20420](https://github.com/hashicorp/terraform-provider-azurerm/issues/20420))\n* Data Source: `azurerm_key_vault_certificates` - now exports the `certificates` block ([#20498](https://github.com/hashicorp/terraform-provider-azurerm/issues/20498))\n* Data Source: `azurerm_key_vault_secrets` - now exports the `secrets` block ([#20498](https://github.com/hashicorp/terraform-provider-azurerm/issues/20498))\n* `azurerm_api_management` - support for the `delegation` block ([#20399](https://github.com/hashicorp/terraform-provider-azurerm/issues/20399))\n* `azurerm_container_app` - now supports multiple `container` blocks ([#20423](https://github.com/hashicorp/terraform-provider-azurerm/issues/20423))\n* `azurerm_cognitive_account` - the field `sku_name` can now be set to `DC0` ([#20426](https://github.com/hashicorp/terraform-provider-azurerm/issues/20426))\n* `azurerm_container_app` - support for the `registry.identity` property ([#20466](https://github.com/hashicorp/terraform-provider-azurerm/issues/20466))\n* `azurerm_data_factory_linked_service_azure_blob_storage` - Add support for `connection_string_insecure`  [Gh-20494]\n* `azurerm_express_route_port` - support for the `billing_type` property ([#20361](https://github.com/hashicorp/terraform-provider-azurerm/issues/20361))\n* `azurerm_kubernetes_cluster` - the `web_app_routing.dns_zone_id` property now accepts an empty string for BYO DNS ([#20341](https://github.com/hashicorp/terraform-provider-azurerm/issues/20341))\n* `azurerm_linux_virtual_machine` - validating that the value for the `admin_username` property isn't a disallowed username ([#20424](https://github.com/hashicorp/terraform-provider-azurerm/issues/20424))\n* `azurerm_windows_virtual_machine` - validating that the value for the `admin_username` property isn't a disallowed username ([#20424](https://github.com/hashicorp/terraform-provider-azurerm/issues/20424))\n\nBUG FIXES:\n\n* Data Source: `azurerm_aadb2c_directory` - fixing a bug where the Data Source didn't return an error when the Azure AD B2C was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_app_service_environment_v3` - fixing a bug where the Data Source didn't return an error when the App Service Environment was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_consumption_budget_resource_group` - using the correct timeout value ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_consumption_budget_resource_group` - fixing a bug where the Data Source didn't return an error when the Consumption Budget Resource Group was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_data_protection_backup_vault` - fixing a bug where the Data Source didn't return an error when the Data Protection Backup Vault was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_databox_edge_device` - fixing a bug where the Data Source didn't return an error when the DataBox Edge Device was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_healthcare_dicom` - fixing a bug where the Data Source didn't return an error when the HealthCare DICOM was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_healthcare_fhir` - fixing a bug where the Data Source didn't return an error when the HealthCare FHIR was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_healthcare_medtech_service` - fixing a bug where the Data Source didn't return an error when the HealthCare MedTech Service was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_key_vault_certificate_data` - fixing a bug where the Data Source didn't return an error when the KeyVault Certificate was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_key_vault_certificate` - fixing a bug where the Data Source didn't return an error when the KeyVault Certificate was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_lb_outbound_rule` - fixing a bug where the Data Source didn't return an error when the Load Balancer Outbound Rule was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_lb_rule` - fixing a bug where the Data Source didn't return an error when the Load Balancer Rule was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_local_network_gateway` - fixing a bug where the Data Source didn't return an error when the Local Network Gateway was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_mobile_network` - fixing a bug where the Data Source didn't return an error when the Mobile Network was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_monitor_data_collection_endpoint` - fixing a bug where the Data Source didn't return an error when the Monitor Data Collection Endpoint was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_mssql_managed_instance` - fixing a bug where the Data Source didn't return an error when the MSSQL Managed Instance was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_policy_assignment` - fixing a bug where the Data Source didn't return an error when the Policy Assignment was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_redis_enterprise_database` - fixing a bug where the Data Source didn't return an error when the Redis Enterprise Database was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_servicebus_namespace_disaster_recovery_config` - fixing a bug where the Data Source didn't return an error when the ServiceBus Namespace Disaster Recovery Config was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_site_recovery_replication_recovery_plan` - fixing a bug where the Data Source didn't return an error when the Site Recovery Replication Recovery Plan was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_storage_blob` - fixing a bug where the Data Source didn't return an error when the Blob was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_storage_table_entity` - fixing a bug where the Data Source didn't return an error when the Table Entity was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_vpn_gateway` - fixing a bug where the Data Source didn't return an error when the VPN Gateway was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* Data Source: `azurerm_web_pubsub` - fixing a bug where the Data Source didn't return an error when the Web PubSub was not found ([#20479](https://github.com/hashicorp/terraform-provider-azurerm/issues/20479))\n* `azurerm_backup_protected_vm` - now correctly deletes ([#20469](https://github.com/hashicorp/terraform-provider-azurerm/issues/20469))\n* `azurerm_eventhub` - changing the `partition_count` property now works by creating a new resource ([#20480](https://github.com/hashicorp/terraform-provider-azurerm/issues/20480))\n* `azurerm_eventgrid_domain_topic` - the `name` property can now be up to 128 characters ([#20407](https://github.com/hashicorp/terraform-provider-azurerm/issues/20407))\n* `azurerm_kubernetes_cluster` - parsing the API response for the `log_analytics_workspace_id` field case-insensitively ([#20484](https://github.com/hashicorp/terraform-provider-azurerm/issues/20484))\n* `azurerm_private_endpoint` - normalizing the `private_connection_resource_id` propety for a redis cache ([#20418](https://github.com/hashicorp/terraform-provider-azurerm/issues/20418))\n* `azurerm_private_endpoint` - consistently normalizing the value returned from the API for `private_connection_resource_id` ([#20452](https://github.com/hashicorp/terraform-provider-azurerm/issues/20452))\n* `azurerm_recovery_services_vault` - updating `cross_region_restore_enabled` to `false` recreates the resource since this operation isn't supported by the API ([#20406](https://github.com/hashicorp/terraform-provider-azurerm/issues/20406))\n* `azurerm_storage_management_policy` - the `rule.filters` property is now Required since storage management policies fail if it's unspecified ([#20448](https://github.com/hashicorp/terraform-provider-azurerm/issues/20448))\n\n## 3.43.0 (February 09, 2023)\n\nFEATURES\n\n* **New Data Source:** `azurerm_container_app_environment` ([#18008](https://github.com/hashicorp/terraform-provider-azurerm/issues/18008))\n* **New Data Source:** `azurerm_container_app_environment_certificate` ([#18008](https://github.com/hashicorp/terraform-provider-azurerm/issues/18008))\n* **New Data Source:** `azurerm_mobile_network` ([#20128](https://github.com/hashicorp/terraform-provider-azurerm/issues/20128))\n* **New Resource:** `azurerm_container_app_environment` ([#18008](https://github.com/hashicorp/terraform-provider-azurerm/issues/18008))\n* **New Resource:** `azurerm_container_app_environment_storage` ([#18008](https://github.com/hashicorp/terraform-provider-azurerm/issues/18008))\n* **New Resource:** `azurerm_container_app_environment_dapr_component` ([#18008](https://github.com/hashicorp/terraform-provider-azurerm/issues/18008))\n* **New Resource:** `azurerm_container_app_environment_certificate` ([#18008](https://github.com/hashicorp/terraform-provider-azurerm/issues/18008))\n* **New Resource:** `azurerm_container_app` ([#18008](https://github.com/hashicorp/terraform-provider-azurerm/issues/18008))\n* **New Resource:** `azurerm_machine_learning_datastore_fileshare` ([#19934](https://github.com/hashicorp/terraform-provider-azurerm/issues/19934))\n* **New Resource:** `azurerm_machine_learning_datastore_datalake_gen2` ([#20045](https://github.com/hashicorp/terraform-provider-azurerm/issues/20045))\n* **New Resource:** `azurerm_mobile_network` ([#20128](https://github.com/hashicorp/terraform-provider-azurerm/issues/20128))\n* **New Resource:** `azurerm_sentinel_data_connector_microsoft_threat_intelligence` ([#20273](https://github.com/hashicorp/terraform-provider-azurerm/issues/20273))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.11.28` of `github.com/Azure/go-autorest/autorest` ([#20272](https://github.com/hashicorp/terraform-provider-azurerm/issues/20272))\n* dependencies: updating to `v0.50.0` of `github.com/hashicorp/go-azure-helpers` ([#20272](https://github.com/hashicorp/terraform-provider-azurerm/issues/20272))\n* dependencies: updating to `v0.20230208.1165725` of `github.com/hashicorp/go-azure-sdk` ([#20381](https://github.com/hashicorp/terraform-provider-azurerm/issues/20381))\n* dependencies: updating to `v0.55.0` of `github.com/manicminer/hamilton` ([#20272](https://github.com/hashicorp/terraform-provider-azurerm/issues/20272))\n* dependencies: updating to `v0.20230208.1135849` of `github.com/tombuildsstuff/kermit` ([#20381](https://github.com/hashicorp/terraform-provider-azurerm/issues/20381))\n* dependences: updating `postgresql/2021-06-01/databases` to 2022-12-01 ([#20369](https://github.com/hashicorp/terraform-provider-azurerm/issues/20369))\n* `appservice`: updating to API Version `2021-03-01` ([#20349](https://github.com/hashicorp/terraform-provider-azurerm/issues/20349))\n* `azurestackhci`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20318](https://github.com/hashicorp/terraform-provider-azurerm/issues/20318))\n* `batch`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20375](https://github.com/hashicorp/terraform-provider-azurerm/issues/20375))\n* `databricks`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20309](https://github.com/hashicorp/terraform-provider-azurerm/issues/20309))\n* `datadog`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20311](https://github.com/hashicorp/terraform-provider-azurerm/issues/20311))\n* `databoxedge`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20236](https://github.com/hashicorp/terraform-provider-azurerm/issues/20236))\n* `digitaltwins`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20318](https://github.com/hashicorp/terraform-provider-azurerm/issues/20318))\n* `postgresql`: updating to API Version `2022-12-01` ([#20367](https://github.com/hashicorp/terraform-provider-azurerm/issues/20367))\n* `redis`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20313](https://github.com/hashicorp/terraform-provider-azurerm/issues/20313))\n* `azurerm_media_streaming_locator` - support for the `filter_names` property ([#20274](https://github.com/hashicorp/terraform-provider-azurerm/issues/20274))\n* `azurerm_media_live_event_output` - support for the `rewind_window_duration` property ([#20271](https://github.com/hashicorp/terraform-provider-azurerm/issues/20271))\n* `azurerm_media_streaming_live_event` - support for the `stream_options` property ([#20254](https://github.com/hashicorp/terraform-provider-azurerm/issues/20254))\n* `azurerm_storage_blob_inventory_policy` - support for the `exclude_prefixes` property ([#20281](https://github.com/hashicorp/terraform-provider-azurerm/issues/20281))\n* `azurerm_sentinel_alert_rule_nrt` - support for the `dynamic_property` block ([#20212](https://github.com/hashicorp/terraform-provider-azurerm/issues/20212))\n* `azurerm_sentinel_alert_rule_nrt` - support for the `sentinel_entity_mapping` block ([#20230](https://github.com/hashicorp/terraform-provider-azurerm/issues/20230))\n* `azurerm_sentinel_alert_rule_nrt` - support for the `event_grouping` block ([#20231](https://github.com/hashicorp/terraform-provider-azurerm/issues/20231))\n* `azurerm_sentinel_alert_rule_scheduled` - support for the `dynamic_property` block ([#20212](https://github.com/hashicorp/terraform-provider-azurerm/issues/20212))\n* `azurerm_sentinel_alert_rule_scheduled` - support for the `sentinel_entity_mapping` block ([#20230](https://github.com/hashicorp/terraform-provider-azurerm/issues/20230))\n* `azurerm_shared_image` - support for the `confidential_vm_supported` and `confidential_vm_enabled` properties ([#20249](https://github.com/hashicorp/terraform-provider-azurerm/issues/20249))\n* `azurerm_postgresql_flexible_server` - support for `replication_role` and new enum value `Replica` for `create_mode` ([#20364](https://github.com/hashicorp/terraform-provider-azurerm/issues/20364))\n\nBUG FIXES:\n\n* `azurerm_custom_provider` - switching a spurious usage of `Azure/azure-sdk-for-go` to `hashicorp/go-azure-sdk` ([#20315](https://github.com/hashicorp/terraform-provider-azurerm/issues/20315))\n* `azurerm_function_app_function` - prevent a bug with multiple file blocks resulting in last file being used for all entries ([#20198](https://github.com/hashicorp/terraform-provider-azurerm/issues/20198))\n* `azurerm_monitor_diagnostic_setting` - changing the `storage_account_id`, `eventhub_authorization_rule_id`, and `eventhub_name` properties no longer creates a new resource ([#20307](https://github.com/hashicorp/terraform-provider-azurerm/issues/20307))\n* `azurerm_redis_enterprise_cluster` - switching a spurious usage of `Azure/azure-sdk-for-go` to `hashicorp/go-azure-sdk` ([#20314](https://github.com/hashicorp/terraform-provider-azurerm/issues/20314))\n* `azurerm_service_fabric_managed_cluster`  - fixpotential panic when setting `node_type` ([#20345](https://github.com/hashicorp/terraform-provider-azurerm/issues/20345))\n* `azurerm_web_application_firewall_policy` - prevent a failure caused by changing the order of the `disabled_rules` properties ([#20285](https://github.com/hashicorp/terraform-provider-azurerm/issues/20285))\n* `azurerm_databricks_access_connector` - `name` can now be up to 64 character in length ([#20353](https://github.com/hashicorp/terraform-provider-azurerm/issues/20353))\n\n## 3.42.0 (February 02, 2023)\n\nFEATURES\n\n* **New Resource:** `azurerm_ip_group_cidr` ([#20225](https://github.com/hashicorp/terraform-provider-azurerm/issues/20225))\n* **New Resource:** `azurerm_network_manager_connectivity_configuration` ([#20133](https://github.com/hashicorp/terraform-provider-azurerm/issues/20133))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230130.1140358 ` of `github.com/hashicorp/go-azure-sdk` ([#20293](https://github.com/hashicorp/terraform-provider-azurerm/issues/20293))\n* `databasemigration`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20214](https://github.com/hashicorp/terraform-provider-azurerm/issues/20214))\n* `servicefabric`: refactoring to use github.com/hashicorp/go-azure-sdk ([#20202](https://github.com/hashicorp/terraform-provider-azurerm/issues/20202))\n* `azurerm_kubernetes_cluster` - add support for the `confidential_computing` add-on ([#20194](https://github.com/hashicorp/terraform-provider-azurerm/issues/20194))\n* `azurerm_kubernetes_cluster` - export the identity for the `aci_connector_linux` add-on ([#20194](https://github.com/hashicorp/terraform-provider-azurerm/issues/20194))\n* `azurerm_lb_backend_address_pool` - support for the `virtual_network_id` property ([#20205](https://github.com/hashicorp/terraform-provider-azurerm/issues/20205))\n* `azurerm_postgresql_flexible_server`: add default value for `authentication.active_directory_auth_enabled` and `authentication.password_auth_enabled` ([#20054](https://github.com/hashicorp/terraform-provider-azurerm/issues/20054))\n* `azurerm_site_recovery_protection_container_mapping` - support for the `automatic_update` block ([#19710](https://github.com/hashicorp/terraform-provider-azurerm/issues/19710))\n* `azurerm_site_recovery_replicated_vm` - support for the `unmanaged_disk`, `target_proximity_placement_group_id`, `target_boot_diag_storage_account_id`,  `target_capacity_reservation_group_id`, `target_virtual_machine_scale_set_id`, `multi_vm_group_name`, `target_edge_zone`, and `test_network_id` properties ([#19939](https://github.com/hashicorp/terraform-provider-azurerm/issues/19939))\n\nBUG FIXES:\n\n* `data.azurerm_monitor_data_collection_rule` - raises an error when the specified data collection rule can't be found ([#20282](https://github.com/hashicorp/terraform-provider-azurerm/issues/20282))\n* `azurerm_federated_identity_credential` - prevent a perpetual diff ([#20219](https://github.com/hashicorp/terraform-provider-azurerm/issues/20219))\n* `azurerm_linux_function_app`  - fix`linuxFxVersion` for docker `registry_url` processing ([#18194](https://github.com/hashicorp/terraform-provider-azurerm/issues/18194))\n* `azurerm_monitor_aad_diagnostic_setting` - the field `log_analytics_workspace_id` is now parsed case-insensitively from the API Response ([#20206](https://github.com/hashicorp/terraform-provider-azurerm/issues/20206))\n\n## 3.41.0 (January 26, 2023)\n\nFEATURES\n\n* **New Data Source:** `azurerm_key_vault_certificates` ([#19498](https://github.com/hashicorp/terraform-provider-azurerm/issues/19498))\n* **New Data Source:** `azurerm_site_recovery_replication_recovery_plan` ([#19940](https://github.com/hashicorp/terraform-provider-azurerm/issues/19940))\n* **New Resource:** `azurerm_orbital_contact` ([#19036](https://github.com/hashicorp/terraform-provider-azurerm/issues/19036))\n* **New Resource:** `azurerm_site_recovery_replication_recovery_plan` ([#19940](https://github.com/hashicorp/terraform-provider-azurerm/issues/19940))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230124.1111819` of `github.com/hashicorp/go-azure-sdk` ([#20160](https://github.com/hashicorp/terraform-provider-azurerm/issues/20160))\n* resourceproviders: no longer registering `Microsoft.ServiceFabricMesh` by default ([#20165](https://github.com/hashicorp/terraform-provider-azurerm/issues/20165))\n* testing: refactoring to use `hashicorp/terraform-plugin-testing` ([#20114](https://github.com/hashicorp/terraform-provider-azurerm/issues/20114))\n* `devtestlabs`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20139](https://github.com/hashicorp/terraform-provider-azurerm/issues/20139))\n* `logic`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#20144](https://github.com/hashicorp/terraform-provider-azurerm/issues/20144))\n* `network`: updating to API version `2022-07-01` ([#20097](https://github.com/hashicorp/terraform-provider-azurerm/issues/20097))\n* `postgresql`: updating to API version `2022-03-08-preview` ([#20073](https://github.com/hashicorp/terraform-provider-azurerm/issues/20073))\n* `streamanalytics`: updating to API Version `2021-10-01-preview` ([#20145](https://github.com/hashicorp/terraform-provider-azurerm/issues/20145))\n* `azurerm_*_app_slot` - support for slots to be placed in different service plans ([#20184](https://github.com/hashicorp/terraform-provider-azurerm/issues/20184))\n* `azurerm_databricks_workspace` - support for customer managed keys for managed disks attached to the workspace ([#19992](https://github.com/hashicorp/terraform-provider-azurerm/issues/19992))\n* `azurerm_databricks_workspace` - support for updating the properties `public_network_access_enabled`, `network_security_group_rules_required` and ` managed_services_cmk_key_vault_key_id` ([#19992](https://github.com/hashicorp/terraform-provider-azurerm/issues/19992))\n* `azurerm_kubernetes_cluster` - support for `node_public_ip_tags` ([#19731](https://github.com/hashicorp/terraform-provider-azurerm/issues/19731))\n* `azurerm_kubernetes_cluster_node_pool` - support for `node_public_ip_tags` ([#19731](https://github.com/hashicorp/terraform-provider-azurerm/issues/19731))\n* `azurerm_log_analytics_workspace` - support for the `local_authentication_disabled` property ([#20092](https://github.com/hashicorp/terraform-provider-azurerm/issues/20092))\n* `azurerm_postgresql_flexible_server` - support for customer managed keys ([#20086](https://github.com/hashicorp/terraform-provider-azurerm/issues/20086))\n* `azurerm_storage_account` - support for `AADKERB` to `azure_files_authentication.0.directory_type` ([#20168](https://github.com/hashicorp/terraform-provider-azurerm/issues/20168))\n\nBUG FIXES:\n\n* `azurerm_stream_analytics_output_servicebus_queue` - shared access policy name and key are now optional for MSI authentication ([#19712](https://github.com/hashicorp/terraform-provider-azurerm/issues/19712))\n* `azurerm_stream_analytics_output_servicebus_topic` - shared access policy name and key are now optional for MSI authentication ([#19708](https://github.com/hashicorp/terraform-provider-azurerm/issues/19708))\n\n## 3.40.0 (January 19, 2023)\n\nFEATURES\n\n* **New Data Source:** `azurerm_bastion_host` ([#20062](https://github.com/hashicorp/terraform-provider-azurerm/issues/20062))\n* **New Resource:** `azurerm_lab_service_schedule` ([#19977](https://github.com/hashicorp/terraform-provider-azurerm/issues/19977))\n* **New Resource:** `azurerm_machine_learning_datastore_blobstorage` ([#19909](https://github.com/hashicorp/terraform-provider-azurerm/issues/19909))\n* **New Resource:** `azurerm_network_manager_scope_connection` ([#19610](https://github.com/hashicorp/terraform-provider-azurerm/issues/19610))\n* **New Resource:** `azurerm_network_manager_static_member` ([#20077](https://github.com/hashicorp/terraform-provider-azurerm/issues/20077))\n* **New Resource:** `azurerm_sentinel_log_analytics_workspace_onboarding` ([#19692](https://github.com/hashicorp/terraform-provider-azurerm/issues/19692))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230117.1125206` of `github.com/hashicorp/go-azure-sdk` ([#20081](https://github.com/hashicorp/terraform-provider-azurerm/issues/20081))\n* `azurerm_application_gateway` - support for TLS 1.3 and CustomV2 ([#20029](https://github.com/hashicorp/terraform-provider-azurerm/issues/20029))\n* `azurerm_kubernetes_cluster` - support for the `key_management_service` block ([#19893](https://github.com/hashicorp/terraform-provider-azurerm/issues/19893))\n* `azurerm_linux_web_app` - support for Python 3.11  ([#20001](https://github.com/hashicorp/terraform-provider-azurerm/issues/20001))\n* `azurerm_linux_web_app_slot` - support for Python 3.11 ([#20001](https://github.com/hashicorp/terraform-provider-azurerm/issues/20001))\n* `azurerm_ip_group` - support for the `firewall_ids` and `firewall_policy_ids` properties ([#19845](https://github.com/hashicorp/terraform-provider-azurerm/issues/19845))\n* `azurerm_recovery_services_vault` - support for the `immutability`, user assigned `identity` and `use_system_assigned_identity` properties ([#20109](https://github.com/hashicorp/terraform-provider-azurerm/issues/20109))\n* `azurerm_synapse_sql_pool` - support for `geo_backup_policy_enabled` and fix `recovery_database_id` [([#20010](https://github.com/hashicorp/terraform-provider-azurerm/issues/20010))\n\nBUG FIXES: \n\n* Data Source: `azurerm_batch_pool` - the field `password` is now correctly marked as a sensitive value ([#20061](https://github.com/hashicorp/terraform-provider-azurerm/issues/20061))\n* Data Source: `azurerm_batch_pool` - the field `ssh_private_key ` is now correctly marked as a sensitive value ([#20061](https://github.com/hashicorp/terraform-provider-azurerm/issues/20061))\n* `azurerm_api_management_identity_provider_twitter` - the field `api_key` is now correctly marked as a sensitive value ([#20061](https://github.com/hashicorp/terraform-provider-azurerm/issues/20061))\n* `azurerm_cdn_frontdoor_origin_group` - shim SDK to allow `health_probe` to be passed as `null` ([#20015](https://github.com/hashicorp/terraform-provider-azurerm/issues/20015))\n* `azurerm_container_group`  - fix dynamic setting `dns_config` crash issue ([#20002](https://github.com/hashicorp/terraform-provider-azurerm/issues/20002))\n* `azurerm_container_registry_task` - the field `password` is now correctly marked as a sensitive value ([#20061](https://github.com/hashicorp/terraform-provider-azurerm/issues/20061))\n* `azurerm_dev_test_windows_virtual_machine` - the `password` field is now correctly marked as a sensitive value ([#20061](https://github.com/hashicorp/terraform-provider-azurerm/issues/20061))\n* `azurerm_federated_identity_credential` - preent concurrent write to parent resource ([#20003](https://github.com/hashicorp/terraform-provider-azurerm/issues/20003))\n* `azurerm_linux_web_app_slot`  - fixa bug where `use_32_bit_worker` would not be set correctly ([#20051](https://github.com/hashicorp/terraform-provider-azurerm/issues/20051))\n* `azurerm_postgresql_flexible_server_configuration` - restart server when required ([#20044](https://github.com/hashicorp/terraform-provider-azurerm/issues/20044))\n* `azurerm_kubernetes_cluster` - prevent a possible panic while importing ([#20107](https://github.com/hashicorp/terraform-provider-azurerm/issues/20107))\n* `azurerm_service_fabric_managed_cluster` - the `password` field is now correctly marked as a sensitive value ([#20061](https://github.com/hashicorp/terraform-provider-azurerm/issues/20061))\n* `azurerm_service_fabric_managed_cluster` - the `resource_group_name` field is now correctly marked as ForceNew ([#20061](https://github.com/hashicorp/terraform-provider-azurerm/issues/20061))\n* `azurerm_spring_cloud_configuration_service ` - the field `password` is now correctly marked as a sensitive value ([#20061](https://github.com/hashicorp/terraform-provider-azurerm/issues/20061))\n* `azurerm_spring_cloud_configuration_service ` - the field `private_key` is now correctly marked as a sensitive value ([#20061](https://github.com/hashicorp/terraform-provider-azurerm/issues/20061))\n* `azurerm_static_site` - the field `api_key` is now correctly marked as a sensitive value ([#20061](https://github.com/hashicorp/terraform-provider-azurerm/issues/20061))\n* `azurerm_storage_account` - no longer silently ignores `404` error while reading service properties ([#19062](https://github.com/hashicorp/terraform-provider-azurerm/issues/19062))\n* `azurerm_storage_account` - the `infrastructure_encryption_enabled` is now supportted for premium accounts ([#20028](https://github.com/hashicorp/terraform-provider-azurerm/issues/20028))\n* `azurerm_windows_web_app_slot`  - fixa bug where `use_32_bit_worker` would not be set correctly ([#20051](https://github.com/hashicorp/terraform-provider-azurerm/issues/20051))\n\n## 3.39.1 (January 13, 2023)\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_sql_container`  - fixproperty `included_path` can not be removed issue ([#19998](https://github.com/hashicorp/terraform-provider-azurerm/issues/19998))\n* `azurerm_log_analytics `- fixing crash during read ([#20011](https://github.com/hashicorp/terraform-provider-azurerm/issues/20011))\n\n## 3.39.0 (January 12, 2023)\n\nBREAKING CHANGES:\n\n* **App Service App Stack Re-alignment** - due to several changes in how the Service manages App and Stack settings, the Terraform resource schema and validation needs to be updated to re-align with the service. Whist we ordinarily avoid breaking changes outside a major release, the drift has made several aspects of these resources in an unworkable position resulting in a poor experience for many users ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n\n* `azurerm_windows_web_app`\n    * `node_version` Valid values are now `~12`, `~14`, `~16`, and  `~18`. This is due to an underlying change to where the Service reads the Node value from in the API request.\n    * `dotnet_version` valid values are now `v2.0`, `v3.0`, `v4.0`, `v5.0`, `v6.0`, and `v7.0`\n    * New setting `dotnet_core_version` - Valid values are `v4.0`. This setting replaces the hybrid setting of `core3.1` in `dotnet_version` since the removal of core3.1 from the supported versions.\n    * `tomcat_version` - Configured the Web App to use Tomcat as the JWS at the specified version. See the official docs for supported versions. Examples include `10.0`, and `10.0.20`\n    * `java_embedded_server_enabled` - configures the JWS to be the Embedded server at the version specified by `java_version`. Defaults to `false`. Note: One of `java_embedded_server_enabled` or `tomcat_version` is required when `java_version` is set.\n\n* `azurerm_windows_web_app_slot`\n    * `node_version` Valid values are now `~12`, `~14`, `~16`, and  `~18`. This is due to an underlying change to where the Service reads the Node value from in the API request.\n    * `dotnet_version` valid values are now `v2.0`, `v3.0`, `v4.0`, `v5.0`, `v6.0`, and `v7.0`\n    * New setting `dotnet_core_version` - Valid values are `v4.0`. This setting replaces the hybrid setting of `core3.1` in `dotnet_version` since the removal of core3.1 from the supported versions.\n    * `tomcat_version` - Configured the Web App to use Tomcat as the JWS at the specified version. See the official docs for supported versions. Examples include `10.0`, and `10.0.20`\n    * `java_embedded_server_enabled` - configures the JWS to be the Embedded server at the version specified by `java_version`. Defaults to `false`. Note: One of `java_embedded_server_enabled` or `tomcat_version` is required when `java_version` is set.\n\n* `azurerm_windows_function_app`\n    * `dotnet_version` - Valid values are now `v3.0`, `v4.0`, `v6.0`, and `v7.0`, defaulting to `v4.0`\n    * `java_version` - Valid values are now `1.8`, `11`, and `17`\n\n* `azurerm_windows_function_app_slot`\n    * `dotnet_version` - Valid values are now `v3.0`, `v4.0`, `v6.0`, and `v7.0`, defaulting to `v4.0`\n    * `java_version` - Valid values are now `1.8`, `11`, and `17`\n\n* `azurerm_linux_web_app`\n    * `java_version` - input validation is introduced based on supported values within the service. Valid values are now: `8`,`11`, and `17`. \n\nFEATURES:\n\n* **New Data Source:** `azurerm_private_dns_resolver` ([#19885](https://github.com/hashicorp/terraform-provider-azurerm/issues/19885))\n* **New Data Source:** `azurerm_private_dns_resolver_dns_forwarding_ruleset` ([#19941](https://github.com/hashicorp/terraform-provider-azurerm/issues/19941))\n* **New Data Source:** `azurerm_private_dns_resolver_forwarding_rule` ([#19947](https://github.com/hashicorp/terraform-provider-azurerm/issues/19947))\n* **New Data Source:** `azurerm_private_dns_resolver_inbound_endpoint` ([#19948](https://github.com/hashicorp/terraform-provider-azurerm/issues/19948))\n* **New Data Source:** `azurerm_private_dns_resolver_outbound_endpoint` ([#19950](https://github.com/hashicorp/terraform-provider-azurerm/issues/19950))\n* **New Data Source:** `azurerm_private_dns_resolver_virtual_network_link` ([#19951](https://github.com/hashicorp/terraform-provider-azurerm/issues/19951))\n* **New Resource:** `azurerm_application_insights_standard_web_test` ([#19954](https://github.com/hashicorp/terraform-provider-azurerm/issues/19954))\n* **New Resource:** `azurerm_cost_anomaly_alert` ([#19899](https://github.com/hashicorp/terraform-provider-azurerm/issues/19899))\n* **New Resource:** `azurerm_lab_service_lab` ([#19852](https://github.com/hashicorp/terraform-provider-azurerm/issues/19852))\n* **New Resource:** `azurerm_lab_service_user` ([#19957](https://github.com/hashicorp/terraform-provider-azurerm/issues/19957))\n* **New Resource:** `azurerm_network_manager_subscription_connection` ([#19617](https://github.com/hashicorp/terraform-provider-azurerm/issues/19617))\n* **New Resource:** `azurerm_network_manager_management_group_connection` ([#19621](https://github.com/hashicorp/terraform-provider-azurerm/issues/19621))\n* **New Resource:** `azurerm_media_services_account_filter` ([#19964](https://github.com/hashicorp/terraform-provider-azurerm/issues/19964))\n* **New Resource:** `azurerm_private_endpoint_application_security_group_association` ([#19825](https://github.com/hashicorp/terraform-provider-azurerm/issues/19825))\n* **New Resource:** `azurerm_sentinel_data_connector_threat_intelligence_taxii` ([#19209](https://github.com/hashicorp/terraform-provider-azurerm/issues/19209))\n* **New Resource:** `azurerm_storage_account_local_user` ([#19592](https://github.com/hashicorp/terraform-provider-azurerm/issues/19592))\n\nENHANCEMENTS:\n\n* `siterecovery`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#19571](https://github.com/hashicorp/terraform-provider-azurerm/issues/19571))\n* `siterecovery`: updating to API version `2021-11-01` ([#19571](https://github.com/hashicorp/terraform-provider-azurerm/issues/19571))\n* Data Source: `azurerm_shared_image` - add support for the `purchase_plan` block ([#19873](https://github.com/hashicorp/terraform-provider-azurerm/issues/19873))\n* `azurerm_kubernetes_cluster` - add support for the `vnet_integration_enabled` and `subnet_id` properties ([#19438](https://github.com/hashicorp/terraform-provider-azurerm/issues/19438))\n* `azurerm_log_analytics_data_export_rule` - `destination_resource_id` accepts an Event Hub Namespace ID ([#19868](https://github.com/hashicorp/terraform-provider-azurerm/issues/19868))\n* `azurerm_linux_web_app`- support for the `application_stack.go_version` property ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_linux_web_app_slot` -support for the `application_stack.go_version` property ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_logic_app_action_http` - add support for `@` in the `body` property ([#19754](https://github.com/hashicorp/terraform-provider-azurerm/issues/19754))\n* `azurerm_maintenance_configuration` - support for the `in_guest_user_patch_mode` and `install_patches` properties ([#19865](https://github.com/hashicorp/terraform-provider-azurerm/issues/19865))\n* `azurerm_monitor_diagnostic_setting` - deprecate `log` in favour of `enabled_log` ([#19504](https://github.com/hashicorp/terraform-provider-azurerm/issues/19504))\n* `azurerm_media_services_account` - support for the `encryption` and `public_network_access_enabled` properties ([#19891](https://github.com/hashicorp/terraform-provider-azurerm/issues/19891))\n* `azurerm_mysql_flexible_server` - support for the `customer_managed_key` properties ([#19905](https://github.com/hashicorp/terraform-provider-azurerm/issues/19905))\n* `azurerm_sentinel_automation_rule` - support for the `triggers_on`, `triggers_when`, and `condition_json` properties ([#19309](https://github.com/hashicorp/terraform-provider-azurerm/issues/19309))\n* `azurerm_spring_cloud_gateway` - support for the `application_performance_monitoring_types`, `environment_variables`, and `sensitive_environment_variables` properties ([#19884](https://github.com/hashicorp/terraform-provider-azurerm/issues/19884))\n* `azurerm_storage_account` - support for the `allowed_copy_scope` property ([#19906](https://github.com/hashicorp/terraform-provider-azurerm/issues/19906))\n* `azurerm_storage_queue` - exporting `resource_manager_id` ([#19969](https://github.com/hashicorp/terraform-provider-azurerm/issues/19969))\n* `azurerm_synapse_spark_pool` - add support for Spark 3.3 ([#19866](https://github.com/hashicorp/terraform-provider-azurerm/issues/19866))\n* `azurerm_windows_web_app` - the `php_version` property supported values now include: `7.1`, `7.4`, and `Off`. Note: `7.1` is currently deprecated. `Off` will configure the system to use the latest available to the App service image ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app` - the `python_version` property is deprecated and is no longer used by the service  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app` - the `python` property supersedes `python_version`. Defaults to `false`. When true uses the latest Python version supported by the Windows App image  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app` - the `java_container` property is deprecated in favour of `tomcat_version` and `java_embedded_server_enabled`  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app` - the `java_container_version` property This property is deprecated in favour of `tomcat_version` and `java_embedded_server_enabled`  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app` - the `current_stack` property is now computed if only one stack is configured on the Windows Web App. This change ensures the portal displays the appropriate metadata and configuration for this stack  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app` - Added input validation for `interval` values in the `auto_heal` block. These properties now enforce HH:MM:SS values up to `99:59:59` ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app_slot` - the `php_version` property supported values now include: `7.1`, `7.4`, and `Off`. Note: `7.1` is currently deprecated. `Off` will configure the system to use the latest available to the App service image ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app_slot` - the `python_version` property is deprecated and is no longer used by the service  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app_slot` - the `python` property supersedes `python_version`. Defaults to `false`. When true uses the latest Python version supported by the Windows App image  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app_slot` - the `java_container` property is deprecated in favour of `tomcat_version` and `java_embedded_server_enabled`  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app_slot` - the `java_container_version` property This property is deprecated in favour of `tomcat_version` and `java_embedded_server_enabled`  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app_slot` - the `current_stack` property now is computed if only one stack is configured on the Windows Web App. This change ensures the portal displays the appropriate metadata and configuration for this stack  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app_slot` - Added input validation for `interval` values in the `auto_heal` block. These properties now enforce HH:MM:SS values up to `99:59:59` ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n\nBUG FIXES:\n\n* `azurerm_app_configuration_feature` - handle updates correctly where the label ID is omitted ([#19900](https://github.com/hashicorp/terraform-provider-azurerm/issues/19900))\n* `azurerm_cdn_frontdoor_rule` - handle empty string value for `query_string` ([#19927](https://github.com/hashicorp/terraform-provider-azurerm/issues/19927))\n* `azurerm_cosmosdb_account` - `default_identity_type` is now computed to allow for restores ([#19956](https://github.com/hashicorp/terraform-provider-azurerm/issues/19956))\n* `azurerm_linux_web_app`- prevent a bug where `backup_config` could silently fail to expand resulting in the config not being sent ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_linux_web_app`- prevent a bug where `health_check_eviction_time_in_min` would not be correctly read back from the service ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_linux_web_app_slot`- prevent a bug where `backup_config` could silently fail to expand resulting in the config not being sent ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_linux_web_app_slot`- prevent a bug where `health_check_eviction_time_in_min` would not be correctly read back from the service ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_policy_set_definition`  - fixupdate of for empty group names in `policy_definition_reference.policy_group_names` ([#19890](https://github.com/hashicorp/terraform-provider-azurerm/issues/19890))\n* `azurerm_storage_account` -  `403` is now a valid status code for when permissions to list keys is missing ([#19645](https://github.com/hashicorp/terraform-provider-azurerm/issues/19645))\n* `azurerm_storage_data_lake_gen2_path` - `ace` generated by default are no longer stored in state to prevent perpetual state diffs ([#18494](https://github.com/hashicorp/terraform-provider-azurerm/issues/18494))\n* `azurerm_storage_data_lake_gen2_filesystem` - `ace` generated by default are no longer stored in state to prevent perpetual state diffs ([#18494](https://github.com/hashicorp/terraform-provider-azurerm/issues/18494))\n* `azurerm_web_pubsub_hub` - the `event_handler` property is now a list instead of set to respect the input order ([#19886](https://github.com/hashicorp/terraform-provider-azurerm/issues/19886))\n* `azurerm_windows_web_app` - prevent a bug where `backup_config` could silently fail to expand resulting in the config not being sent  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app` - prevent a bug where `health_check_eviction_time_in_min` would not be correctly set on Crete or Update  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app_slot` - prevent a bug where `backup_config` could silently fail to expand resulting in the config not being sent  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n* `azurerm_windows_web_app_slot` - prevent a bug where `health_check_eviction_time_in_min` would not be correctly set on Crete or Update  ([#19685](https://github.com/hashicorp/terraform-provider-azurerm/issues/19685))\n\n## 3.38.0 (January 05, 2023)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_marketplace_agreement` ([#19628](https://github.com/hashicorp/terraform-provider-azurerm/issues/19628))\n* **New Data Source:** `azurerm_network_manager_network_group` ([#19593](https://github.com/hashicorp/terraform-provider-azurerm/issues/19593))\n* **New Data Source:** `azurerm_virtual_hub_route_table` ([#19628](https://github.com/hashicorp/terraform-provider-azurerm/issues/19628))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20230105.1121404` of `github.com/hashicorp/go-azure-sdk` ([#19872](https://github.com/hashicorp/terraform-provider-azurerm/issues/19872))\n* dependencies: updating to `v0.20221207.1110610` of `github.com/tombuildsstuff/kermit` ([#19698](https://github.com/hashicorp/terraform-provider-azurerm/issues/19698))\n* `azurerm_dedicated_host` - add support for`LSv3-Type1` type ([#19875](https://github.com/hashicorp/terraform-provider-azurerm/issues/19875))\n* `azurerm_proximity_placement_group` - support for the `allowed_vm_sizes` and `zone` properties ([#19675](https://github.com/hashicorp/terraform-provider-azurerm/issues/19675))\n\nBUG FIXES:\n\n* `azurerm_automation_software_update_configuration` - correctly handle empty `expiry_time` api values ([#19774](https://github.com/hashicorp/terraform-provider-azurerm/issues/19774))\n* `azurerm_app_service_connection` - polling until the resource is fully created, updated and deleted ([#19792](https://github.com/hashicorp/terraform-provider-azurerm/issues/19792))\n* `azurerm_batch_pool` - correctly handle the resource being deleted outside of terraform ([#19780](https://github.com/hashicorp/terraform-provider-azurerm/issues/19780))\n* `azurerm_billing_account_cost_management_export` - marking the resource as gone when it's no longer present in Azure ([#19871](https://github.com/hashicorp/terraform-provider-azurerm/issues/19871))\n* `azurerm_bot_service_azure_bot` - marking the resource as gone when it's no longer present in Azure ([#19871](https://github.com/hashicorp/terraform-provider-azurerm/issues/19871))\n* `azurerm_databricks_access_connector` - polling until the resource is fully created, updated and deleted ([#19792](https://github.com/hashicorp/terraform-provider-azurerm/issues/19792))\n* `azurerm_databricks_access_connector` - marking the resource as gone when it's no longer present in Azure ([#19871](https://github.com/hashicorp/terraform-provider-azurerm/issues/19871))\n* `azurerm_datadog_monitor_sso_configuration` - polling until the resource is fully created and deleted ([#19792](https://github.com/hashicorp/terraform-provider-azurerm/issues/19792))\n* `azurerm_hdinsight_kafka_cluster` - the `kafka_management_node` property is deprecated and will be removed in `v4.0` ([#19423](https://github.com/hashicorp/terraform-provider-azurerm/issues/19423))\n* `azurerm_kubernetes_cluster` - `scale_down_mode` of the default node pool can now be updated without rebuilding the entire cluster ([#19823](https://github.com/hashicorp/terraform-provider-azurerm/issues/19823))\n* `azurerm_orbital_contact_profile` - polling until the resource is fully created, updated and deleted ([#19792](https://github.com/hashicorp/terraform-provider-azurerm/issues/19792))\n* `azurerm_orbital_spacecraft` - polling until the resource is fully created, updated and deleted ([#19792](https://github.com/hashicorp/terraform-provider-azurerm/issues/19792))\n* `azurerm_postgresql_flexible_server` - correctly handle password authentication ([#19800](https://github.com/hashicorp/terraform-provider-azurerm/issues/19800))\n* `azurerm_resource_group_cost_management_export` - marking the resource as gone when it's no longer present in Azure ([#19871](https://github.com/hashicorp/terraform-provider-azurerm/issues/19871))\n* `azurerm_spring_cloud_connection` - polling until the resource is fully updated and deleted ([#19792](https://github.com/hashicorp/terraform-provider-azurerm/issues/19792))\n* `azurerm_stack_hci_cluster` - polling until the resource is fully deleted ([#19792](https://github.com/hashicorp/terraform-provider-azurerm/issues/19792))\n* `azurerm_stream_analytics_cluster` - polling until the resource is fully deleted ([#19792](https://github.com/hashicorp/terraform-provider-azurerm/issues/19792))\n* `azurerm_stream_analytics_reference_input_blob` - the `storage_account_key` property is now optional when MSI auth is used ([#19676](https://github.com/hashicorp/terraform-provider-azurerm/issues/19676))\n* `azurerm_storage_account_network_rules` - the requires import check no longer checks the `bypass` field to workaround an issue within the Azure API ([#19719](https://github.com/hashicorp/terraform-provider-azurerm/issues/19719))\n* `azurerm_subscription_cost_management_export` - marking the resource as gone when it's no longer present in Azure ([#19871](https://github.com/hashicorp/terraform-provider-azurerm/issues/19871))\n* `azurerm_synapse_linked_service` - report error during create/update ([#19849](https://github.com/hashicorp/terraform-provider-azurerm/issues/19849))\n* `azurerm_virtual_desktop_application_group` - changing the `host_pool_id` now creates a new resource ([#19689](https://github.com/hashicorp/terraform-provider-azurerm/issues/19689))\n* `azurerm_vmware_express_route_authorization` - marking the resource as gone when it's no longer present in Azure ([#19871](https://github.com/hashicorp/terraform-provider-azurerm/issues/19871))\n\n## 3.37.0 (December 21, 2022)\n\nFEATURES:\n\n* **New Resource:** `azurerm_cognitive_deployment` ([#19526](https://github.com/hashicorp/terraform-provider-azurerm/issues/19526))\n* **New Resource:** `azurerm_billing_account_cost_management_export` ([#19723](https://github.com/hashicorp/terraform-provider-azurerm/issues/19723))\n* **New resource:** `azurerm_key_vault_certificate_contacts` ([#19743](https://github.com/hashicorp/terraform-provider-azurerm/issues/19743))\n* **New Resource:** `azurerm_lab_service_plan` ([#19312](https://github.com/hashicorp/terraform-provider-azurerm/issues/19312))\n* **New Resource:** `azurerm_resource_deployment_script` ([#19436](https://github.com/hashicorp/terraform-provider-azurerm/issues/19436))\n* **New Resource:** `azurerm_spring_cloud_customized_accelerator` ([#19736](https://github.com/hashicorp/terraform-provider-azurerm/issues/19736))\n\nENHANCEMENTS:\n\n* `azurerm_netapp_volume` - support for the `zone` property ([#19669](https://github.com/hashicorp/terraform-provider-azurerm/issues/19669))\n\nBUG FIXES: \n\n* `azurerm_app_configuration_key`  - fixa regression when handling IDs containing a `:` ([#19722](https://github.com/hashicorp/terraform-provider-azurerm/issues/19722))\n* `azurerm_virtual_network_gateway_connection` -  can now be created with a `azurerm_virtual_network_gateway` in another resource group ([#19699](https://github.com/hashicorp/terraform-provider-azurerm/issues/19699))\n\n## 3.36.0 (December 15, 2022)\n\nFEATURES:\n\n* **New Resource:** `azurerm_virtual_machine_packet_capture` ([#19385](https://github.com/hashicorp/terraform-provider-azurerm/issues/19385))\n* **New Resource:** `azurerm_virtual_machine_scale_set_packet_capture` ([#19385](https://github.com/hashicorp/terraform-provider-azurerm/issues/19385))\n* **New Resource:** `azurerm_spring_cloud_accelerator` ([#19572](https://github.com/hashicorp/terraform-provider-azurerm/issues/19572))\n* **New Resource:** `azurerm_spring_cloud_dev_tool_portal` ([#19568](https://github.com/hashicorp/terraform-provider-azurerm/issues/19568))\n* **New Resource:** `azurerm_route_map` ([#19402](https://github.com/hashicorp/terraform-provider-azurerm/issues/19402))\n* **New Data Source:** `azurerm_lb_outbound_rule` ([#19345](https://github.com/hashicorp/terraform-provider-azurerm/issues/19345))\n\nENHANCEMENTS:\n\n* `healthbot`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#19433](https://github.com/hashicorp/terraform-provider-azurerm/issues/19433))\n* `media`: updating to API version `2021-11-01 `and `2022-08-01` ([#19623](https://github.com/hashicorp/terraform-provider-azurerm/issues/19623))\n* `azurerm_cosmosdb_account` - support  for updating some `capabilities`  ([#14991](https://github.com/hashicorp/terraform-provider-azurerm/issues/14991))\n* `azurerm_key_vault_managed_hardware_security_module` - support for the `public_network_access_enabled` and `network_acls` properties ([#19640](https://github.com/hashicorp/terraform-provider-azurerm/issues/19640))\n* `azurerm_kubernetes_cluster` - support for the `monitor_metrics` block ([#19530](https://github.com/hashicorp/terraform-provider-azurerm/issues/19530))\n* `azurerm_kubernetes_cluster` - the `ssh_key` property can now be updated ([#19634](https://github.com/hashicorp/terraform-provider-azurerm/issues/19634))\n* `azurerm_kubernetes_cluster_node_pool` - support for the `outbound_nat_enabled` property ([#19663](https://github.com/hashicorp/terraform-provider-azurerm/issues/19663))\n* `azurerm_lighthouse_definition` - support for the `eligible_authorization` property ([#19569](https://github.com/hashicorp/terraform-provider-azurerm/issues/19569))\n* `azurerm_log_analytics_workspace` - support for the `allow_resource_only_permissions` property ([#19346](https://github.com/hashicorp/terraform-provider-azurerm/issues/19346))\n* `azurerm_private_endpoint` - support for the `member_name` property in the `ip_configuration` block and support for multiple `ip_configuration` blocks ([#19389](https://github.com/hashicorp/terraform-provider-azurerm/issues/19389))\n* `azurerm_storage_account` - support for the `blob_properties.restore_policy` property ([#19644](https://github.com/hashicorp/terraform-provider-azurerm/issues/19644))\n* `azurerm_vpn_gateway_connection` - support for the `inbound_route_map_id` and `outbound_route_map_id` properties ([#19681](https://github.com/hashicorp/terraform-provider-azurerm/issues/19681))\n* `azurerm_point_to_site_vpn_gateway` - support for the `routing_preference_internet_enabled`, `inbound_route_map_id`, and `outbound_route_map_id` properties ([#19672](https://github.com/hashicorp/terraform-provider-azurerm/issues/19672))\n* `azurerm_web_application_firewall_policy` - support the `rule` property in the `rule_group_override` block ([#19497](https://github.com/hashicorp/terraform-provider-azurerm/issues/19497))\n\nBUG FIXES:\n\n* Data Source: `azurerm_api_management` - prevent failure when retrieving tenant access properties when permissions are missing ([#19626](https://github.com/hashicorp/terraform-provider-azurerm/issues/19626))\n* `azurerm_cdn_frontdoor_firewall_policy` - allow `Log` as a valid value for managed rule override `action` in DRS 2.0 and above ([#19637](https://github.com/hashicorp/terraform-provider-azurerm/issues/19637))\n* `azurerm_cosmosdb_account` - enabling `analytical_storage_enabled` no longer forces recreation ([#19659](https://github.com/hashicorp/terraform-provider-azurerm/issues/19659))\n* `azurerm_monitor_scheduled_query_rules_alert_v2` - use the correct alue `Equals` for operator ([#19594](https://github.com/hashicorp/terraform-provider-azurerm/issues/19594))\n* `azurerm_mssql_database` - the `threat_detection_policy.storage_*` properties can now be correctly set as empty ([#19670](https://github.com/hashicorp/terraform-provider-azurerm/issues/19670))\n* `azurerm_synapse_linked_service` - add validation for `type` ([#19636](https://github.com/hashicorp/terraform-provider-azurerm/issues/19636))\n* `azurerm_resource_policy_exemption` - changing the `policy_assignment_id` property not created a new resource ([#19674](https://github.com/hashicorp/terraform-provider-azurerm/issues/19674))\n* `azurerm_resource_group_policy_exemption` - changing the `policy_assignment_id` property not created a new resource ([#19674](https://github.com/hashicorp/terraform-provider-azurerm/issues/19674))\n* `azurerm_subscription_policy_exemption` - changing the `policy_assignment_id` property not created a new resource ([#19674](https://github.com/hashicorp/terraform-provider-azurerm/issues/19674))\n* `azurerm_stream_analytics_output_mssql` - the `user` and `password` properties are not optional when using MSI authentication ([#19696](https://github.com/hashicorp/terraform-provider-azurerm/issues/19696))\n\n## 3.35.0 (December 09, 2022)\n\nBREAKING CHANGES:\n\n* `azurerm_stream_analytics_output_blob` - the field `batch_min_rows` is now an integer rather than a float due to a [breaking change in the API Specifications](https://github.com/Azure/azure-rest-api-specs) - we believe this was only previously valid as an integer, as such while this is a breaking change we believe this shouldn't cause an issue for most users (since the API required that this was an integer) ([#19602](https://github.com/hashicorp/terraform-provider-azurerm/issues/19602))\n\nFEATURES:\n\n* **New Resource:** `azurerm_digital_twins_time_series_database_connection` ([#19576](https://github.com/hashicorp/terraform-provider-azurerm/issues/19576))\n* **New Resource:** `azurerm_network_manager` ([#19334](https://github.com/hashicorp/terraform-provider-azurerm/issues/19334))\n* **New Resource:** `azurerm_spring_cloud_application_live_view` ([#19495](https://github.com/hashicorp/terraform-provider-azurerm/issues/19495))\n* **New Resource:** `azurerm_sentinel_data_connector_microsoft_threat_protection` ([#19162](https://github.com/hashicorp/terraform-provider-azurerm/issues/19162))\n* **New Resource:** `azurerm_vmware_netapp_volume_attachment` ([#19082](https://github.com/hashicorp/terraform-provider-azurerm/issues/19082))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20221207.1121859` of `github.com/hashicorp/go-azure-sdk` ([#19602](https://github.com/hashicorp/terraform-provider-azurerm/issues/19602))\n* `lighthouse`: updating to API version `2022-10-01` ([#19499](https://github.com/hashicorp/terraform-provider-azurerm/issues/19499))\n* `proximityplacementgroups`: updating to API Version `2022-03-01` ([#19537](https://github.com/hashicorp/terraform-provider-azurerm/issues/19537))\n* Data Source: `azurerm_kubernetes_cluster` - support for the `storage_profile` block ([#19396](https://github.com/hashicorp/terraform-provider-azurerm/issues/19396))\n* `azurerm_firewall_policy` - support for the `explicit_proxy` block and `auto_learn_private_ranges_mode` property ([#19313](https://github.com/hashicorp/terraform-provider-azurerm/issues/19313))\n* `azurerm_kubernetes_cluster` - support for the `custom_ca_trust_enabled` property ([#19546](https://github.com/hashicorp/terraform-provider-azurerm/issues/19546))\n* `azurerm_kubernetes_cluster` - support for the `storage_profile` block ([#19396](https://github.com/hashicorp/terraform-provider-azurerm/issues/19396))\n* `azurerm_kubernetes_cluster` - support for the `image_cleaner` block ([#19368](https://github.com/hashicorp/terraform-provider-azurerm/issues/19368))\n* `azurerm_kubernetes_cluster` - support for the `network_plugin_mode` and `ebpf_data_plane` properties ([#19527](https://github.com/hashicorp/terraform-provider-azurerm/issues/19527))\n* `azurerm_kubernetes_cluster_node_pool` - support for the `custom_ca_trust_enabled` property ([#19546](https://github.com/hashicorp/terraform-provider-azurerm/issues/19546))\n* `azurerm_lb_probe` - support for the `probe_threshold` property ([#19573](https://github.com/hashicorp/terraform-provider-azurerm/issues/19573))\n* `azurerm_mssql_virtual_machine` - support for the `days_of_week` property ([#19553](https://github.com/hashicorp/terraform-provider-azurerm/issues/19553))\n* `azurerm_spring_cloud_gateway_route_config` - support for the `filters`, `predicates`, and `sso_validation_enabled` properties ([#19493](https://github.com/hashicorp/terraform-provider-azurerm/issues/19493))\n\nBUG FIXES:\n\n* Data Source: `azurerm_sentinel_alert_rule_template`: Set custom ID rather than using ID returned from API ([#19580](https://github.com/hashicorp/terraform-provider-azurerm/issues/19580))\n* `azurerm_app_service_connection` - correctly pass the secret to the service ([#19519](https://github.com/hashicorp/terraform-provider-azurerm/issues/19519))\n* `azurerm_automation_software_update_configuration`  - fixissue where omitting `tags`and `tag_filter` result in an error ([#19516](https://github.com/hashicorp/terraform-provider-azurerm/issues/19516))\n* `azurerm_automation_source_control` - a state migration to work around the previously incorrect id casing ([#19506](https://github.com/hashicorp/terraform-provider-azurerm/issues/19506))\n* `azurerm_automation_webhook` - a state migration to work around the previously incorrect id casing ([#19506](https://github.com/hashicorp/terraform-provider-azurerm/issues/19506))\n* `azurerm_container_registry_webhook` - added a state migration to work around the previously incorrect id casing ([#19507](https://github.com/hashicorp/terraform-provider-azurerm/issues/19507))\n* `azurerm_frontdoor_rules_engine` - a state migration to work around the previously incorrect id casing ([#19512](https://github.com/hashicorp/terraform-provider-azurerm/issues/19512))\n* `azurerm_healthcare_*` - added a state migration to work around the previously incorrect id casing ([#19511](https://github.com/hashicorp/terraform-provider-azurerm/issues/19511))\n* `azurerm_iothub_*` - added a state migration to work around the previously incorrect id casing ([#19524](https://github.com/hashicorp/terraform-provider-azurerm/issues/19524))\n* `azurerm_key_vault` - allow for keyvaults in two different subscriptions ([#19531](https://github.com/hashicorp/terraform-provider-azurerm/issues/19531))\n* `azurerm_key_vault_certificate` - skip purging  during deletion if the parent key vault has purge protection enabled ([#19528](https://github.com/hashicorp/terraform-provider-azurerm/issues/19528))\n* `azurerm_key_vault_key` - skip purging  during deletion if the parent key vault has purge protection enabled ([#19528](https://github.com/hashicorp/terraform-provider-azurerm/issues/19528))\n* `azurerm_key_vault_managed_hardware_security_module` - skip purging  during deletion if the parent key vault has purge protection enabled ([#19528](https://github.com/hashicorp/terraform-provider-azurerm/issues/19528))\n* `azurerm_key_vault_secret` - skip purging  during deletion if the parent key vault has purge protection enabled ([#19528](https://github.com/hashicorp/terraform-provider-azurerm/issues/19528))\n* `azurerm_lb` - adding/removing a frontend configuration no longer forces recreation a new resource to be created ([#19548](https://github.com/hashicorp/terraform-provider-azurerm/issues/19548))\n* `azurerm_kusto_*` - added a state migration to work around the previously incorrect id casing ([#19525](https://github.com/hashicorp/terraform-provider-azurerm/issues/19525))\n* `azurerm_media_services_account` - fixing an issue in the state upgrade where the Resource ID was being parsed incorrectly ([#19578](https://github.com/hashicorp/terraform-provider-azurerm/issues/19578))\n* `azurerm_mssql_elasticpool` - Prevent `license_type` from being configured in specific scenarios ([#19586](https://github.com/hashicorp/terraform-provider-azurerm/issues/19586))\n* `azurerm_monitor_smart_detector_alert_rule` - added a state migration to work around the previously incorrect id casing ([#19513](https://github.com/hashicorp/terraform-provider-azurerm/issues/19513))\n* `azurerm_spring_cloud_*` - added a state migration to work around the previously incorrect id casing ([#19564](https://github.com/hashicorp/terraform-provider-azurerm/issues/19564))\n* `azurerm_stream_analytics_output_blob` - the field `batch_min_rows` is now an integer rather than a float due to a [breaking change in the API Specifications](https://github.com/Azure/azure-rest-api-specs) - we believe this was only previously valid as an integer, as such while this is a breaking change we believe this shouldn't cause an issue for most users (since the API required that this was an integer) ([#19602](https://github.com/hashicorp/terraform-provider-azurerm/issues/19602))\n* `azurerm_virtual_desktop_workspace_application_group_association` - set `tags` properly ([#19574](https://github.com/hashicorp/terraform-provider-azurerm/issues/19574))\n\n## 3.34.0 (December 01, 2022)\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20221129.1175354` of `github.com/hashicorp/go-azure-sdk` ([#19483](https://github.com/hashicorp/terraform-provider-azurerm/issues/19483))\n* `media`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#19285](https://github.com/hashicorp/terraform-provider-azurerm/issues/19285))\n* `springcloud`: updating to use API Version `2022-11-01-preview` ([#19445](https://github.com/hashicorp/terraform-provider-azurerm/issues/19445))\n* `streamanalytics`: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#19395](https://github.com/hashicorp/terraform-provider-azurerm/issues/19395))\n* `synapse`: refactoring to use `github.com/tombuildstuff/kermit` rather than the embedded sdk ([#19484](https://github.com/hashicorp/terraform-provider-azurerm/issues/19484))\n* Data Source: `azurerm_api_management` - support for `tenant_access` property ([#19422](https://github.com/hashicorp/terraform-provider-azurerm/issues/19422))\n* `azurerm_kusto_database` - supports underscores in the name ([#19466](https://github.com/hashicorp/terraform-provider-azurerm/issues/19466))\n* `azurerm_managed_disk` - support for `upload_size_bytes` property ([#19458](https://github.com/hashicorp/terraform-provider-azurerm/issues/19458))\n* `azurerm_monitor_activity_log_alert` - `action` is now supplied as a list instead of a set ([#19425](https://github.com/hashicorp/terraform-provider-azurerm/issues/19425))\n* `azurerm_spring_cloud_gateway_route_config` - support for `protocol` property ([#19382](https://github.com/hashicorp/terraform-provider-azurerm/issues/19382))\n* `azurerm_storage_account` - support for `sftp_enabled` ([#19428](https://github.com/hashicorp/terraform-provider-azurerm/issues/19428))\n* `azurerm_storage_management_policy` - `tier_to_cool_after_days_since_creation_greater_than` - support for the `tier_to_cool_after_days_since_creation_greater_than`, `tier_to_archive_after_days_since_creation_greater_than`, `delete_after_days_since_creation_greater_than` properties ([#19446](https://github.com/hashicorp/terraform-provider-azurerm/issues/19446))\n\nBUG FIXES:\n\n* `data.azurerm_sentinel_alert_rule_template` - a  state migration to work around the previously incorrect id casing ([#19487](https://github.com/hashicorp/terraform-provider-azurerm/issues/19487))\n* `azurerm_app_configuration_key` - prevent crash when retrieving the key value ([#19464](https://github.com/hashicorp/terraform-provider-azurerm/issues/19464))\n* `azurerm_data_factory_linked_service_azure_file_storage` - send `host` and and `user_id` in the payload only when it's been set ([#19468](https://github.com/hashicorp/terraform-provider-azurerm/issues/19468))\n* `azurerm_eventgrid_topic`  - fixsetting of fields in `input_mapping_fields` during read ([#19494](https://github.com/hashicorp/terraform-provider-azurerm/issues/19494)) \n* `azurerm_iot_security_solution` - a  state migration to work around the previously incorrect id casing ([#19489](https://github.com/hashicorp/terraform-provider-azurerm/issues/19489))\n* `azurerm_monitor_autoscale_setting` - a  state migration to work around the previously incorrect id casing ([#19492](https://github.com/hashicorp/terraform-provider-azurerm/issues/19492))\n* `azurerm_sentinel_automation_rule` - a  state migration to work around the previously incorrect id casing ([#19487](https://github.com/hashicorp/terraform-provider-azurerm/issues/19487))\n* `azurerm_sql_active_directory_administrator` - a  state migration to work around the previously incorrect id casing ([#19486](https://github.com/hashicorp/terraform-provider-azurerm/issues/19486))\n* `azurerm_stream_analytics_output_eventhub` - `shared_access_policy_key` and `shared_access_policy_name` are now optional  ([#19447](https://github.com/hashicorp/terraform-provider-azurerm/issues/19447))\n* `azurerm_synapse_integration_runtime_azure` - a state migration to work around the previously incorrect id casing ([#19485](https://github.com/hashicorp/terraform-provider-azurerm/issues/19485))\n* `azurerm_synapse_integration_runtime_self_hosted` - a state migration to work around the previously incorrect id casing ([#19485](https://github.com/hashicorp/terraform-provider-azurerm/issues/19485))\n* `azurerm_synapse_linked_service` - a state migration to work around the previously incorrect id casing  ([#19477](https://github.com/hashicorp/terraform-provider-azurerm/issues/19477))\n* `azurerm_windows_web_app`  - fixcurrentStack is being reset when other `site_config` values are changed. ([#18568](https://github.com/hashicorp/terraform-provider-azurerm/issues/18568))\n* `azurerm_windows_web_app_slot`  - fixcurrentStack is being reset when other `site_config` values are changed. ([#18568](https://github.com/hashicorp/terraform-provider-azurerm/issues/18568))\n* `azurerm_windows_virtual_machine_scale_set` Fix crash when upgrading `automatic_os_upgrade_policy` ([#19465](https://github.com/hashicorp/terraform-provider-azurerm/issues/19465))\n\n## 3.33.0 (November 24, 2022)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_cdn_frontdoor_custom_domain` ([#19357](https://github.com/hashicorp/terraform-provider-azurerm/issues/19357))\n* **New Resource:** `azurerm_mssql_managed_instance_transparent_data_encryption` ([#18918](https://github.com/hashicorp/terraform-provider-azurerm/issues/18918))\n* **New Resource:** `azurerm_postgresql_flexible_server_active_directory_administrator` ([#19269](https://github.com/hashicorp/terraform-provider-azurerm/issues/19269))\n\nENHANCEMENTS:\n\n* build: updating to use Go `1.19.3` ([#19362](https://github.com/hashicorp/terraform-provider-azurerm/issues/19362))\n* dependencies: updating to `v0.20221122.1115312` of `github.com/hashicorp/go-azure-sdk` ([#19412](https://github.com/hashicorp/terraform-provider-azurerm/issues/19412))\n* dependencies: upgrading to `v2.24.1` of `github.com/hashicorp/terraform-plugin-sdk` ([#19303](https://github.com/hashicorp/terraform-provider-azurerm/issues/19303))\n* `cognitive`: updating to API Version `2022-10-01` ([#19344](https://github.com/hashicorp/terraform-provider-azurerm/issues/19344))\n* `springcloud`: updating to API Version `2022-09-01-preview` ([#19340](https://github.com/hashicorp/terraform-provider-azurerm/issues/19340))\n* Data Source: `azurerm_mssql_managed_instance` - support for `customer_managed_key_id` attribute and user-assigned identity ([#18918](https://github.com/hashicorp/terraform-provider-azurerm/issues/18918))\n* `azurerm_cognitive_account` - support for `dynamic_throttling_enabled` ([#19371](https://github.com/hashicorp/terraform-provider-azurerm/issues/19371))\n* `azurerm_databricks_workspace` - support for `storage_account_identity` property in datasource ([#19336](https://github.com/hashicorp/terraform-provider-azurerm/issues/19336))\n* `azurerm_mssql_managed_instance` - support for user-assigned identity ([#18918](https://github.com/hashicorp/terraform-provider-azurerm/issues/18918))\n* `azurerm_postgresql_flexible_server` - support for `authentication` ([#19269](https://github.com/hashicorp/terraform-provider-azurerm/issues/19269))\n* `azurerm_spring_cloud_app` - support for the `ingress_settings` block ([#19386](https://github.com/hashicorp/terraform-provider-azurerm/issues/19386))\n\nBUG FIXES:\n\n* `azurerm_application_insights` - validating/normalizing the `workspace_id` as a Workspace ID ([#19325](https://github.com/hashicorp/terraform-provider-azurerm/issues/19325))\n* `azurerm_cdn_frontdoor_rule` - allow `cache_duration` to be `null` if `cache_behavior` is set to `HonorOrigin` ([#19378](https://github.com/hashicorp/terraform-provider-azurerm/issues/19378))\n* `azurerm_monitor_alert_processing_rule_action_group` - `condition.x.monitor_condition` can be correctly specified alone ([#19338](https://github.com/hashicorp/terraform-provider-azurerm/issues/19338))\n* `azurerm_monitor_alert_processing_rule_suppression` - `condition.x.monitor_condition` can be correctly specified alone ([#19338](https://github.com/hashicorp/terraform-provider-azurerm/issues/19338))\n* `azurerm_mysql_flexible_server` - increase validation max value for the `iops` property ([#19419](https://github.com/hashicorp/terraform-provider-azurerm/issues/19419))\n* `azurerm_servicebus_subscription_rule` - `correlation_filter` with empty attributes no longer crashes ([#19352](https://github.com/hashicorp/terraform-provider-azurerm/issues/19352))\n* `azurerm_storage_account`  - fix crash in multichannel checking ([#19298](https://github.com/hashicorp/terraform-provider-azurerm/issues/19298))\n* `azurerm_storage_account` - prevent both `blob_properties.0.versioning_enabled` and `is_hns_enabled` being set to true ([#19418](https://github.com/hashicorp/terraform-provider-azurerm/issues/19418))\n\n## 3.32.0 (November 17, 2022)\n\nDEPRECATIONS\n\n* The `azurerm_integration_service_environment` resource is now deprecated as the underlying Azure Service is being retired on `2024-08-31` and new instances cannot be provisioned (by default) after `2022-11-01` ([#19265](https://github.com/hashicorp/terraform-provider-azurerm/issues/19265))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20221116.1175352` of `github.com/hashicorp/go-azure-sdk` ([#19319](https://github.com/hashicorp/terraform-provider-azurerm/issues/19319))\n* `azurerm_security_center_subscription_pricing` - support for the `subplan` property ([#19273](https://github.com/hashicorp/terraform-provider-azurerm/issues/19273))\n* `azurerm_storage_account` - support for the `sas_policy` block ([#19222](https://github.com/hashicorp/terraform-provider-azurerm/issues/19222))\n* `azurerm_windows_web_app`, `azurerm_windows_web_app_slot` - aupport for `17` value for `java_version` property ([#19249](https://github.com/hashicorp/terraform-provider-azurerm/issues/19249))\n* `azurerm_storage_blob_inventory_policy` - support for `include_deleted` property ([#19286](https://github.com/hashicorp/terraform-provider-azurerm/issues/19286))\n\nBUG FIXES:\n\n* `azurerm_app_service_public_certificate` - add custom poller to prevent `Root resource was present, but now absent.` result ([#19348](https://github.com/hashicorp/terraform-provider-azurerm/issues/19348))\n* `azurerm_eventhub_namespace` - correct `zone_redundant` property ([#19164](https://github.com/hashicorp/terraform-provider-azurerm/issues/19164))\n* `azurerm_orchestrated_virtual_machine_scale_set` - allow no image to be specified ([#19263](https://github.com/hashicorp/terraform-provider-azurerm/issues/19263))\n* `azurerm_synapse_firewall_rule` - wait for the firewall to be ready ([#19227](https://github.com/hashicorp/terraform-provider-azurerm/issues/19227))\n* `azurerm_service_fabric_managed_cluster` - correctly define `active_directory` as a List ([#19163](https://github.com/hashicorp/terraform-provider-azurerm/issues/19163))\n* `azurerm_orchestrated_virtual_machine_scale_set` -  instance parameter is now set on update ([#19337](https://github.com/hashicorp/terraform-provider-azurerm/issues/19337))\n\n\n## 3.31.0 (November 10, 2022)\n\nFEATURES:\n\n* **New Resource:** `azurerm_federated_identity_credential` ([#19199](https://github.com/hashicorp/terraform-provider-azurerm/issues/19199))\n* **New Resource:** `azurerm_stream_analytics_stream_input_eventhub_v2` ([#19150](https://github.com/hashicorp/terraform-provider-azurerm/issues/19150))\n\nENHANCEMENTS\n\n* dependencies: updating to `v0.20221108.1145701` of `github.com/hashicorp/go-azure-sdk` ([#19193](https://github.com/hashicorp/terraform-provider-azurerm/issues/19193))\n* dependencies: updating `network` to API Version `2022-05-01` ([#19124](https://github.com/hashicorp/terraform-provider-azurerm/issues/19124))\n* dependencies: updating `sentinel` to API Version `2022-10-01-preview` ([#19161](https://github.com/hashicorp/terraform-provider-azurerm/issues/19161))\n* `azurerm_disk_encryption_set` - support for the `federated_client_id` property ([#19184](https://github.com/hashicorp/terraform-provider-azurerm/issues/19184))\n* `azurerm_linux_web_app` - support for .NET 7 ([#19232](https://github.com/hashicorp/terraform-provider-azurerm/issues/19232))\n* `azurerm_linux_function_app` - support for .NET 7 ([#19232](https://github.com/hashicorp/terraform-provider-azurerm/issues/19232))\n* `azurerm_managed_disk` - support for expanding data disks without downtime ([#17245](https://github.com/hashicorp/terraform-provider-azurerm/issues/17245))\n* `azurerm_mssql_virtual_machine` - support for the `sql_instance` block ([#19123](https://github.com/hashicorp/terraform-provider-azurerm/issues/19123))\n* `azurerm_public_ip` - support for the `ddos_protection_mode` and `ddos_protection_plan_id` properties ([#19206](https://github.com/hashicorp/terraform-provider-azurerm/issues/19206))\n* `azurerm_sentinel_alert_rule_nrt` - support for the `techniques` property ([#19142](https://github.com/hashicorp/terraform-provider-azurerm/issues/19142))\n* `azurerm_sentinel_alert_rule_fusion` - support for the source block ([#19093](https://github.com/hashicorp/terraform-provider-azurerm/issues/19093))\n* `azurerm_windows_web_app` - support for .NET 7 ([#19232](https://github.com/hashicorp/terraform-provider-azurerm/issues/19232))\n* `azurerm_windows_function_app` - support for .NET 7 ([#19232](https://github.com/hashicorp/terraform-provider-azurerm/issues/19232))\n\nBUG FIXES:\n\n* `azurerm_cdn_frontdoor_route` - update read function to parse `cdn_frontdoor_origin_group_id` insensitively ([#19178](https://github.com/hashicorp/terraform-provider-azurerm/issues/19178))\n* `azurerm_cdn_frontdoor_rule` - update `url_redirect_action` to allow `query_string` field to pass multiple query string parameters ([#19180](https://github.com/hashicorp/terraform-provider-azurerm/issues/19180))\n* `azurerm_cdn_frontdoor_profile` - the `response_timeout_seconds` property is no longer force new ([#19175](https://github.com/hashicorp/terraform-provider-azurerm/issues/19175))\n\n## 3.30.0 (November 03, 2022)\n\nFEATURES:\n\n* **New Resource:** `azurerm_kubernetes_fleet_manager` ([#19111](https://github.com/hashicorp/terraform-provider-azurerm/issues/19111))\n* **New Resource:** `azurerm_mssql_server_microsoft_support_auditing_policy` ([#18609](https://github.com/hashicorp/terraform-provider-azurerm/issues/18609))\n* **New Resource:** `azurerm_private_dns_resolver_virtual_network_link` ([#19029](https://github.com/hashicorp/terraform-provider-azurerm/issues/19029))\n* **New Resource:** `azurerm_private_dns_resolver_forwarding_rule` ([#19028](https://github.com/hashicorp/terraform-provider-azurerm/issues/19028))\n\nENHANCEMENTS\n\n* dependencies: `iothub` updating to `2022-04-30-preview` ([#19070](https://github.com/hashicorp/terraform-provider-azurerm/issues/19070))\n* dependencies: updating to `v0.47.0` of `github.com/hashicorp/go-azure-helpers` ([#19107](https://github.com/hashicorp/terraform-provider-azurerm/issues/19107))\n* dependencies: updating to `v0.20221102.1171058` of `github.com/hashicorp/go-azure-sdk` ([#19108](https://github.com/hashicorp/terraform-provider-azurerm/issues/19108))\n* webpubsub: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#18892](https://github.com/hashicorp/terraform-provider-azurerm/issues/18892))\n* Data Source: `azurerm_application_gateway` - export the `backend_address_pool` block ([#19026](https://github.com/hashicorp/terraform-provider-azurerm/issues/19026))\n* Data Source: `azurerm_function_app_host_keys` - export `webpubsub_extension_key` property ([#19073](https://github.com/hashicorp/terraform-provider-azurerm/issues/19073))\n* `azurerm_iothub` - support for `DigitalTwinChangeEvents` as `source` and `fallback_route.source` ([#19070](https://github.com/hashicorp/terraform-provider-azurerm/issues/19070))\n* `azurerm_iothub_fallback_route` - support for `DigitalTwinChangeEvents` as `source` ([#19070](https://github.com/hashicorp/terraform-provider-azurerm/issues/19070))\n* `azurerm_iothub_route` - support for `DigitalTwinChangeEvents` as `source` ([#19070](https://github.com/hashicorp/terraform-provider-azurerm/issues/19070))\n* `azurerm_kubernetes_cluster` - support for the `web_app_routing` block ([#18667](https://github.com/hashicorp/terraform-provider-azurerm/issues/18667))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `protected_settings_from_key_vault` blovk ([#19098](https://github.com/hashicorp/terraform-provider-azurerm/issues/19098))\n* `azurerm_linux_virtual_machine_scale_set` - support for `StandardSSD_ZRS`, `PremiumV2_LRS`, and `Premium_ZRS` storage account types ([#19091](https://github.com/hashicorp/terraform-provider-azurerm/issues/19091))\n* `azurerm_mssql_virtual_machine` - support for the `system_db_on_data_disk_enabled` property ([#19115](https://github.com/hashicorp/terraform-provider-azurerm/issues/19115))\n* `azurerm_monitor_diagnostic_setting` - support for the `partner_solution_id` property ([#19114](https://github.com/hashicorp/terraform-provider-azurerm/issues/19114))\n* `azurerm_policy_definition` - reverse the order of policies lookup to favour builtin ([#18338](https://github.com/hashicorp/terraform-provider-azurerm/issues/18338))\n* `azurerm_policy_set_definition` - reverse the order of policies lookup to favour builtin ([#18338](https://github.com/hashicorp/terraform-provider-azurerm/issues/18338))\n* `azurerm_security_center_contact` - support for the `name` property ([#18999](https://github.com/hashicorp/terraform-provider-azurerm/issues/18999))\n* `azurerm_stream_analytics_job` - support for the `job_storage_account` block ([#19120](https://github.com/hashicorp/terraform-provider-azurerm/issues/19120))\n* `azurerm_virtual_machine_extension` - support for the `protected_settings_from_key_vault` blovk ([#19098](https://github.com/hashicorp/terraform-provider-azurerm/issues/19098))\n* `azurerm_virtual_machine_scale_set_extension` - support for the `protected_settings_from_key_vault` blovk ([#19098](https://github.com/hashicorp/terraform-provider-azurerm/issues/19098))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `protected_settings_from_key_vault` blovk ([#19098](https://github.com/hashicorp/terraform-provider-azurerm/issues/19098))\n* `azurerm_windows_virtual_machine_scale_set` - support for `StandardSSD_ZRS`, `PremiumV2_LRS`, and `Premium_ZRS` storage account types ([#19091](https://github.com/hashicorp/terraform-provider-azurerm/issues/19091))\n\nBUG FIXES:\n\n* Data Source: `azurerm_app_configuration_keys`  - fixa crash when `label` is not set ([#19032](https://github.com/hashicorp/terraform-provider-azurerm/issues/19032))\n* `azurerm_api_management` - correct the api return `subnet_id` with the wrong case ([#18988](https://github.com/hashicorp/terraform-provider-azurerm/issues/18988))\n* `azurerm_cdn_frontdoor_firewall_policy` - expose `AnomalyScoring` in override rule action for DRS `2.0` ([#19095](https://github.com/hashicorp/terraform-provider-azurerm/issues/19095))\n* `azurerm_eventhub_namespace_disaster_recovery_config` - now correctly breaks the pairing ([#19030](https://github.com/hashicorp/terraform-provider-azurerm/issues/19030))\n* `azurerm_kubernetes_cluster` - set a valid default value for `auto_scaler_profile.expander` ([#19057](https://github.com/hashicorp/terraform-provider-azurerm/issues/19057))\n* `azurerm_linux_virtual_machine_scale_set` - can now set `automatic_os_upgrade_policy` with rolling upgrades enables ([#18605](https://github.com/hashicorp/terraform-provider-azurerm/issues/18605))\n* `azurerm_mssql_database` - handle the `license_type` property no longer being returned by API ([#19084](https://github.com/hashicorp/terraform-provider-azurerm/issues/19084))\n* `azurerm_postgresql_flexible_server_database` - is now correctly removed from state on deletion ([#19081](https://github.com/hashicorp/terraform-provider-azurerm/issues/19081))\n* `azurerm_virtual_network_gateway_connection` - correctly set `authorization_key` from state as the API returnes `*`s ([#19071](https://github.com/hashicorp/terraform-provider-azurerm/issues/19071))\n* `azurerm_windows_virtual_machine_scale_set` - can now set `automatic_os_upgrade_policy` with rolling upgrades enables ([#18605](https://github.com/hashicorp/terraform-provider-azurerm/issues/18605))\n\n## 3.29.1 (October 28, 2022)\n\nBUG FIXES:\n\n* `azurerm_kubernetes_cluster` - prevent panic when setting `public_network_access_enabled` ([#19048](https://github.com/hashicorp/terraform-provider-azurerm/issues/19048))\n\n## 3.29.0 (October 27, 2022)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_api_management_gateway_host_name_configuration` ([#17166](https://github.com/hashicorp/terraform-provider-azurerm/issues/17166))\n* **New Data Source:** `azurerm_cdn_frontdoor_firewall_policy` ([#18903](https://github.com/hashicorp/terraform-provider-azurerm/issues/18903))\n* **New Resource:** `azurerm_datadog_monitor_tag_rule` ([#17825](https://github.com/hashicorp/terraform-provider-azurerm/issues/17825))\n* **New Resource:** `azurerm_datadog_monitor_sso_configuration` ([#17825](https://github.com/hashicorp/terraform-provider-azurerm/issues/17825))\n* **New Resource:** `azurerm_iothub_device_update_account` ([#18789](https://github.com/hashicorp/terraform-provider-azurerm/issues/18789))\n* **New Resource:** `azurerm_iothub_device_update_instance` ([#18789](https://github.com/hashicorp/terraform-provider-azurerm/issues/18789))\n* **New Resource:** `azurerm_nginx_configuration` ([#18761](https://github.com/hashicorp/terraform-provider-azurerm/issues/18761))\n* **New Resource:** `azurerm_nginx_certificate` ([#18762](https://github.com/hashicorp/terraform-provider-azurerm/issues/18762))\n* **New Resource:** `azurerm_private_dns_resolver` ([#18473](https://github.com/hashicorp/terraform-provider-azurerm/issues/18473))\n* **New Resource:** `azurerm_private_dns_resolver_dns_forwarding_ruleset` ([#19012](https://github.com/hashicorp/terraform-provider-azurerm/issues/19012))\n* **New Resource:** `azurerm_private_dns_resolver_inbound_endpoint` ([#18983](https://github.com/hashicorp/terraform-provider-azurerm/issues/18983))\n* **New Resource:** `azurerm_private_dns_resolver_outbound_endpoint` ([#18986](https://github.com/hashicorp/terraform-provider-azurerm/issues/18986))\n\nENHANCEMENTS:\n\n* Dependencies `compute` - updating to `2022-08-01` ([#18994](https://github.com/hashicorp/terraform-provider-azurerm/issues/18994))\n* Dependencies `containerinstance` - updating to `2021-10-01` ([#17785](https://github.com/hashicorp/terraform-provider-azurerm/issues/17785))\n* Dependencies: update `go-azure-helpers` to `v0.45.0` ([#18968](https://github.com/hashicorp/terraform-provider-azurerm/issues/18968))\n* containerservice: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#18705](https://github.com/hashicorp/terraform-provider-azurerm/issues/18705))\n* customproviders - refactoring to use `github.com/hashicorp/go-azure-sdk` ([#18978](https://github.com/hashicorp/terraform-provider-azurerm/issues/18978))\n* snapshot - refactoring to use `github.com/hashicorp/go-azure-sdk` ([#18957](https://github.com/hashicorp/terraform-provider-azurerm/issues/18957))\n* disks: refactoring to use `github.com/hashicorp/go-azure-sdk` ([#18928](https://github.com/hashicorp/terraform-provider-azurerm/issues/18928))\n* Data Source: `azurerm_storage_management_policy` - add support for `tier_to_archive_after_days_since_last_tier_change_greater_than` ([#18898](https://github.com/hashicorp/terraform-provider-azurerm/issues/18898))\n* `azurerm_container_group` - the `network_profile_id` property hasbeen deprecated in favour of `subnet_ids` as the newer versions of the API no longer support it ([#17785](https://github.com/hashicorp/terraform-provider-azurerm/issues/17785))\n* `azurerm_cdn_frontdoor_rule` - allow the `cdn_frontdoor_origin_group_id` field to be optional in the `route_configuration_override_action` ([#18906](https://github.com/hashicorp/terraform-provider-azurerm/issues/18906))\n* `azurerm_cdn_frontdoor_rule` - expose `Disabled` as a possible value of `cache_behavior` in the `route_configuration_override_action` ([#18906](https://github.com/hashicorp/terraform-provider-azurerm/issues/18906))\n* `azurerm_disk_encryption_set` - support for identities `UserAssigned` and `SystemAssigned,UserAssgined` ([#18525](https://github.com/hashicorp/terraform-provider-azurerm/issues/18525))\n* `azurerm_hdinsight_kafka_cluster` - support for the `compute_isolation` block ([#17449](https://github.com/hashicorp/terraform-provider-azurerm/issues/17449))\n* `azurerm_hdinsight_spark_cluster` - support for the `compute_isolation` block ([#17449](https://github.com/hashicorp/terraform-provider-azurerm/issues/17449))\n* `azurerm_hdinsight_interactive_query_cluster` - support for the `compute_isolation` block ([#17449](https://github.com/hashicorp/terraform-provider-azurerm/issues/17449))\n* `azurerm_hdinsight_hbase_cluster` - support for the `compute_isolation` block ([#17449](https://github.com/hashicorp/terraform-provider-azurerm/issues/17449))\n* `azurerm_hdinsight_hadoop_cluster` - support for the `compute_isolation` block ([#17449](https://github.com/hashicorp/terraform-provider-azurerm/issues/17449))\n* `azurerm_container_group` - support for the `dns_name_label_reuse_policy` block ([#17785](https://github.com/hashicorp/terraform-provider-azurerm/issues/17785))\n* `azurerm_kubernetes_cluster` - support for the `workload_autoscaler_profile` block ([#18967](https://github.com/hashicorp/terraform-provider-azurerm/issues/18967))\n* `azurerm_linux_function_app` - support for using `storage_account` external Azure Storage Account configurations ([#18760](https://github.com/hashicorp/terraform-provider-azurerm/issues/18760))\n* `azurerm_linux_function_app` - support for Java 17 ([#18689](https://github.com/hashicorp/terraform-provider-azurerm/issues/18689))\n* `azurerm_linux_function_app_slot` - support for using `storage_account` external Azure Storage Account configurations ([#18760](https://github.com/hashicorp/terraform-provider-azurerm/issues/18760))\n* `azurerm_logic_app_action_http` - support for the `queries` property ([#18934](https://github.com/hashicorp/terraform-provider-azurerm/issues/18934))\n* `azurerm_monitor_scheduled_query_rules_alert_v2` - add `evaluation_frequency`, `window_duration`, `mute_actions_after_alert_duration`, and `query_time_range_override`validation ([#18960](https://github.com/hashicorp/terraform-provider-azurerm/issues/18960))\n* `azurerm_mssql_virtual_machine` - =support for the `assessment` block ([#18923](https://github.com/hashicorp/terraform-provider-azurerm/issues/18923))\n* `azurerm_mssql_server_transparent_data_encryption` - support for autorotation of keyvault keys ([#18523](https://github.com/hashicorp/terraform-provider-azurerm/issues/18523))\n* `azurerm_logic_app_standard` - support for the `scm_ip_restriction` block and the `scm_use_main_ip_restriction`, `scm_min_tls_version`, `scm_type` properties ([#18853](https://github.com/hashicorp/terraform-provider-azurerm/issues/18853))\n* `azurerm_postgresql_server` - can now set `public_network_access_enabled` during creation when point in time restore is used ([#18962](https://github.com/hashicorp/terraform-provider-azurerm/issues/18962))\n* `azurerm_servicebus_namespace_disaster_recovery_config` - support the `alias_authorization_rule_id` property ([#18729](https://github.com/hashicorp/terraform-provider-azurerm/issues/18729))\n* `azurerm_synapse_workspace` - `sql_administrator_login` and `sql_administrator_login_password` are now no longer required for the creation of this resource ([#18850](https://github.com/hashicorp/terraform-provider-azurerm/issues/18850))\n* `azurerm_synapse_workspace` - enable user assigned managed identity ([#19007](https://github.com/hashicorp/terraform-provider-azurerm/issues/19007))\n* `azurerm_windows_function_app` - support for using `storage_account` external Azure Storage Account configurations ([#18760](https://github.com/hashicorp/terraform-provider-azurerm/issues/18760))\n* `azurerm_windows_function_app` - support for Java 17 ([#18689](https://github.com/hashicorp/terraform-provider-azurerm/issues/18689))\n* `azurerm_windows_function_app_slot` - support for using `storage_account` external Azure Storage Account configurations ([#18760](https://github.com/hashicorp/terraform-provider-azurerm/issues/18760))\n\nBUG FIXES:\n\n*  provider: no longer automatically registers the `Microsoft.StoragePool` provider as Azure has halted the preview of Azure Disk Pools, and it's not generally available ([#18905](https://github.com/hashicorp/terraform-provider-azurerm/issues/18905))\n*  `azurerm_app_configuration_keys` - now correctly retrieves result if more than 100 entries are returned ([#19020](https://github.com/hashicorp/terraform-provider-azurerm/issues/19020))\n* `azurerm_data_factory_dataset_parquet` - `azure_blob_storage_location.path` and `http_server_location.path` are now Optional ([#19009](https://github.com/hashicorp/terraform-provider-azurerm/issues/19009))\n* `azurerm_disk_pool` - is deprecated as Azure has halted the preview of Azure Disk Pools, and it isn't to be made generally available ([#18905](https://github.com/hashicorp/terraform-provider-azurerm/issues/18905))\n* `azurerm_disk_pool_iscsi_target` - is deprecated as Azure has halted the preview of Azure Disk Pools, and it's not made generally available ([#18905](https://github.com/hashicorp/terraform-provider-azurerm/issues/18905))\n* `azurerm_disk_pool_iscsi_target_lun` - is deprecated as Azure has halted the preview of Azure Disk Pools, and it's not generally available ([#18905](https://github.com/hashicorp/terraform-provider-azurerm/issues/18905))\n* `azurerm_disk_pool_managed_disk_attachment` - is deprecated as Azure has halted the preview of Azure Disk Pools, and it's not generally available ([#18905](https://github.com/hashicorp/terraform-provider-azurerm/issues/18905))\n* `azurerm_linux_virtual_machine_scale_set` - the `gallery_applications` block is renamted to `gallery_application` ([#19014](https://github.com/hashicorp/terraform-provider-azurerm/issues/19014))\n* `azurerm_managed_disk` - `logical_sector_size`, `disk_iops_read_write`, `disk_mbps_read_write`, `disk_iops_read_only` and `disk_mbps_read_only` can be set when `storage_account_type` is `PremiumV2_LRS` ([#18991](https://github.com/hashicorp/terraform-provider-azurerm/issues/18991))\n* `azurerm_monitor_data_collection_rule` - correctly support streams ([#18966](https://github.com/hashicorp/terraform-provider-azurerm/issues/18966))\n* `azurerm_netapp_volume` - correctly set snapshot ID when `create_from_snapshot_resource_id` is specified ([#18996](https://github.com/hashicorp/terraform-provider-azurerm/issues/18996))\n* `azurerm_key_vault_certificate` - new versions of key vault certs can now be imported ([#18848](https://github.com/hashicorp/terraform-provider-azurerm/issues/18848))\n* `azurerm_postgresql_server` - correctly create replicas when CMK is enabled ([#18805](https://github.com/hashicorp/terraform-provider-azurerm/issues/18805))\n* `azurerm_stream_analytics_stream_input_eventhub` - `shared_access_policy_key` and `shared_access_policy_name` are no longer required ([#18959](https://github.com/hashicorp/terraform-provider-azurerm/issues/18959))\n* `azurerm_windows_virtual_machine_scale_set` - the `gallery_applications` block is renamted to `gallery_application` ([#19014](https://github.com/hashicorp/terraform-provider-azurerm/issues/19014))\n\n## 3.28.0 (October 20, 2022)\n\nFEATURES:\n\n* **New Data Source:** `azurerm_cdn_frontdoor_secret` ([#18817](https://github.com/hashicorp/terraform-provider-azurerm/issues/18817))\n* **New Resource:** `azurerm_databricks_access_connector` ([#18709](https://github.com/hashicorp/terraform-provider-azurerm/issues/18709))\n* **New Resource:** `azurerm_sentinel_data_connector_dynamics_365` ([#18859](https://github.com/hashicorp/terraform-provider-azurerm/issues/18859))\n* **New Resource:** `azurerm_sentinel_data_connector_iot` ([#18862](https://github.com/hashicorp/terraform-provider-azurerm/issues/18862))\n* **New Resource:** `azurerm_sentinel_data_connector_office_365_project` ([#18858](https://github.com/hashicorp/terraform-provider-azurerm/issues/18858))\n* **New Resource:** `azurerm_sentinel_data_connector_office_irm` ([#18856](https://github.com/hashicorp/terraform-provider-azurerm/issues/18856))\n* **New Resource:** `azurerm_sentinel_data_connector_office_power_bi` ([#18857](https://github.com/hashicorp/terraform-provider-azurerm/issues/18857))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20221018.1075906` of `github.com/hashicorp/go-azure-sdk` ([#18833](https://github.com/hashicorp/terraform-provider-azurerm/issues/18833))\n* `azurestackhci`: updating to API Version `2022-09-01` ([#18759](https://github.com/hashicorp/terraform-provider-azurerm/issues/18759))\n* Data Source: `azurerm_linux_function_app` - add support for `client_certificate_exclusion_paths ` ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* Data Source: `azurerm_linux_web_app` - add support for `client_certificate_exclusion_paths ` ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* Data Source: `azurerm_windows_function_app` - add support for `client_certificate_exclusion_paths ` ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* Data Source: `azurerm_windows_web_app` - add support for `client_certificate_exclusion_paths ` ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* `azurerm_cdn_frontdoor_firewall_policy` - managed rules can now exclude matches on `RequestBodyJsonArgNames` ([#18874](https://github.com/hashicorp/terraform-provider-azurerm/issues/18874))\n* `azurerm_cosmosdb_account` - support for the `primary_sql_connection_string`, `secondary_sql_connection_string`, `primary_readonly_sql_connection_string`, and `secondary_readonly_sql_connection_string` attributes ([#17810](https://github.com/hashicorp/terraform-provider-azurerm/issues/17810))\n* `azurerm_fluid_relay_server` - support for the `service_endpoint` property ([#18763](https://github.com/hashicorp/terraform-provider-azurerm/issues/18763))\n* `azurerm_fluid_relay_server` - support for the `primary_key` and `secondary_key` properties ([#18765](https://github.com/hashicorp/terraform-provider-azurerm/issues/18765))\n* `azurerm_linux_function_app` - correctly set `use_32_bit_worker` during Create ([#18680](https://github.com/hashicorp/terraform-provider-azurerm/issues/18680))\n* `azurerm_linux_function_app` - add support for the `client_certificate_exclusion_paths` property ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* `azurerm_linux_function_app` - add `VS2022` to `remote_debugging_version` valid values ([#18684](https://github.com/hashicorp/terraform-provider-azurerm/issues/18684))\n* `azurerm_linux_function_app_slot` - add support for the `client_certificate_exclusion_paths` property ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* `azurerm_linux_web_app` - add support for the `client_certificate_exclusion_paths` property([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* `azurerm_linux_web_app_slot` - add support for the `client_certificate_exclusion_paths` property ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* `azurerm_storage_account` - support for the `immutability_policy` block ([#18774](https://github.com/hashicorp/terraform-provider-azurerm/issues/18774))\n* `azurerm_storage_account` - customer managed keys can be now enabled when `account_tier` is set to `Premium` ([#18872](https://github.com/hashicorp/terraform-provider-azurerm/issues/18872))\n* `azurerm_storage_management_policy` - support for the `tier_to_archive_after_days_since_last_tier_change_greater_than` property ([#18792](https://github.com/hashicorp/terraform-provider-azurerm/issues/18792))\n* `azurerm_subnet` - add support for `Microsoft.LabServices/labplans` ([#18822](https://github.com/hashicorp/terraform-provider-azurerm/issues/18822))\n* `azurerm_windows_virtual_machine_scale_set` - allow disabling secure boot when creating a virtual machine scale set with disk encryption type `VMGuestStateOnly` ([#18749](https://github.com/hashicorp/terraform-provider-azurerm/issues/18749))\n* `azurerm_windows_function_app` - correctly  set `use_32_bit_worker` during Create ([#18680](https://github.com/hashicorp/terraform-provider-azurerm/issues/18680))\n* `azurerm_windows_function_app` - add support for the `client_certificate_exclusion_paths` property ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* `azurerm_windows_function_app` - add `VS2022` to `remote_debugging_version` valid values ([#18684](https://github.com/hashicorp/terraform-provider-azurerm/issues/18684))\n* `azurerm_windows_function_app_slot` - add support for the `client_certificate_exclusion_paths` correctly ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* `azurerm_windows_web_app` - add support for the `client_certificate_exclusion_paths` correctly ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n* `azurerm_windows_web_app_slot` - add support for the `client_certificate_exclusion_paths` correctly  ([#16603](https://github.com/hashicorp/terraform-provider-azurerm/issues/16603))\n\nBUG FIXES:\n\n* `azurerm_automation_software_update_configuration` - parse subscription IDs correctly when set in `scope` ([#18860](https://github.com/hashicorp/terraform-provider-azurerm/issues/18860))\n* `azurerum_cdn_frontdoor_route`  - fixa panic on import ([#18824](https://github.com/hashicorp/terraform-provider-azurerm/issues/18824))\n* `azurerm_eventhub_namespace` - ignore case for `network_rulesets.x.virtual_network_rule.x.subnet_id` ([#18818](https://github.com/hashicorp/terraform-provider-azurerm/issues/18818))\n* `azurerm_firewall_policy_rule_collection_group` - limit the number of destination ports in a NAT rule to one ([#18766](https://github.com/hashicorp/terraform-provider-azurerm/issues/18766))\n* Data Source: `azurerm_linux_function_app`  - fixmissing error on data source not found ([#18876](https://github.com/hashicorp/terraform-provider-azurerm/issues/18876))\n* `azurerm_linux_function_app`  - fixan issue where `app_settings` would show a diff when setting `vnet_route_all_enabled` to true ([#18836](https://github.com/hashicorp/terraform-provider-azurerm/issues/18836))\n* `azurerm_linux_function_app_slot`  - fixan issue where `app_settings` would show a diff when setting `vnet_route_all_enabled` to true ([#18836](https://github.com/hashicorp/terraform-provider-azurerm/issues/18836))\n* `azurerm_linux_virtual_machine` - allow disabling secure boot when creating a virtual machine with disk encryption type `VMGuestStateOnly` ([#18749](https://github.com/hashicorp/terraform-provider-azurerm/issues/18749))\n* `azurerm_linux_virtual_machine_scale_set` - allow disabling secure boot when creating a virtual machine scale set with disk encryption type `VMGuestStateOnly` ([#18749](https://github.com/hashicorp/terraform-provider-azurerm/issues/18749))\n* `azurerm_network_security_group` - correct the casing of the `protocol` property ([#18799](https://github.com/hashicorp/terraform-provider-azurerm/issues/18799))\n* `azurerm_network_security_rule` - correct the casing of the `protocol` property ([#18799](https://github.com/hashicorp/terraform-provider-azurerm/issues/18799))\n* `azurerm_recovery_services_vault`  - fixissue where `soft_delete_enabled` is reset to the default value when the `identity` block is updated ([#18871](https://github.com/hashicorp/terraform-provider-azurerm/issues/18871))\n* `azurerm_windows_virtual_machine` - allow disabling secure boot when creating a virtual machine with disk encryption type `VMGuestStateOnly` ([#18749](https://github.com/hashicorp/terraform-provider-azurerm/issues/18749))\n* `azurerm_windows_function_app`  - fixan issue where `app_settings` would show a diff when setting `vnet_route_all_enabled` to true ([#18836](https://github.com/hashicorp/terraform-provider-azurerm/issues/18836))\n* `azurerm_windows_function_app_slot`  - fixan issue where `app_settings` would show a diff when setting `vnet_route_all_enabled` to true ([#18836](https://github.com/hashicorp/terraform-provider-azurerm/issues/18836))\n* `azurerm_windows_web_app`  - fixparsing of `docker_container_name` and `docker_container_registry` on read ([#18251](https://github.com/hashicorp/terraform-provider-azurerm/issues/18251))\n\n## 3.27.0 (October 13, 2022)\n\nBREAKING CHANGES:\n\n* `azurerm_cdn_frontdoor_custom_domain` - removed the `associate_with_cdn_frontdoor_route_id` field to allow for a custom domain to be associated with multiple routes. ([#18600](https://github.com/hashicorp/terraform-provider-azurerm/issues/18600))\n\nFEATURES:\n\n* **New DataSource:** `data.azurerm_cosmosdb_sql_role_definition` ([#18728](https://github.com/hashicorp/terraform-provider-azurerm/issues/18728))\n* **New DataSource:** `data.azurerm_cosmosdb_sql_database` ([#18728](https://github.com/hashicorp/terraform-provider-azurerm/issues/18728))\n* **New Resource:** `azurerm_cdn_frontdoor_custom_domain_association` ([#18600](https://github.com/hashicorp/terraform-provider-azurerm/issues/18600))\n* **New Resource:** `azurerm_nginx_deployment` ([#18510](https://github.com/hashicorp/terraform-provider-azurerm/issues/18510))\n* **New Resource:** `azurerm_orbital_contact_profile` ([#18317](https://github.com/hashicorp/terraform-provider-azurerm/issues/18317))\n* **New Resource:** `azurerm_sentinel_data_connector_office_atp` ([#18708](https://github.com/hashicorp/terraform-provider-azurerm/issues/18708))\n\nENHANCEMENTS:\n\n* dependencies: updating to version `v0.44.` of `github.com/hashicorp/go-azure-helpers` ([#18716](https://github.com/hashicorp/terraform-provider-azurerm/issues/18716))\n* dependencies: updating to version `v0.50.0` of `github.com/manicminer/hamilton` ([#18716](https://github.com/hashicorp/terraform-provider-azurerm/issues/18716))\n* `azurerm_automation_runbook` - support for the `draft` block and `log_activity_trace` propertry ([#17961](https://github.com/hashicorp/terraform-provider-azurerm/issues/17961))\n* `azurerm_app_configuration` - support for the `encrption`, `local_auth_enabled`, `public_network_access_enabled`, `purge_protection_enabled`, and `soft_delete_retention_days` properties ([#17714](https://github.com/hashicorp/terraform-provider-azurerm/issues/17714))\n* `azurerm_api_management_api` - support for the `contact` and `license` blocks ([#18472](https://github.com/hashicorp/terraform-provider-azurerm/issues/18472))\n* `azurerm_cdn_frontdoor_route` - exposed `cdn_frontdoor_custom_domain_ids` and `link_to_default_domain` ([#18600](https://github.com/hashicorp/terraform-provider-azurerm/issues/18600))\n* `azurerm_data_factory_integration_runtime_azure_ssis` - support for `elastic_pool_namr` property ([#18696](https://github.com/hashicorp/terraform-provider-azurerm/issues/18696))\n* `azurerm_dedicated_hardware_security_module` - support the `management_network_profile` block ([#18702](https://github.com/hashicorp/terraform-provider-azurerm/issues/18702))\n* `azurerm_hdinsight_hadoop_cluster`, - support for the `script_actions` block ([#18670](https://github.com/hashicorp/terraform-provider-azurerm/issues/18670))\n* `azurerm_hdinsight_hbase_cluster`,  - support for the `script_actions` block ([#18670](https://github.com/hashicorp/terraform-provider-azurerm/issues/18670))\n* `azurerm_hdinsight_interactive_query_cluster`, - support for the `script_actions` block ([#18670](https://github.com/hashicorp/terraform-provider-azurerm/issues/18670))\n* `azurerm_spark_cluster` - support for the `script_actions` block ([#18670](https://github.com/hashicorp/terraform-provider-azurerm/issues/18670))\n* `azurerm_kubernetes_cluster` - support the `workload_identity_enabled` property ([#18742](https://github.com/hashicorp/terraform-provider-azurerm/issues/18742))\n* `azurerm_firewall_policy_rule_collection_group`- add `Mssql` as an option for `type` validation ([#18746](https://github.com/hashicorp/terraform-provider-azurerm/issues/18746))\n* `azurerm_log_analytics_cluster` - ensuring that the `identity` block is always set ([#18700](https://github.com/hashicorp/terraform-provider-azurerm/issues/18700))\n* `azurerm_linux_web_app` - support for python `3.10` ([#18744](https://github.com/hashicorp/terraform-provider-azurerm/issues/18744))\n* `azurerm_linux_web_app_slot` - support for python `3.10` ([#18744](https://github.com/hashicorp/terraform-provider-azurerm/issues/18744))\n* `azurerm_mssql_database` - support for the `import` block ([#18588](https://github.com/hashicorp/terraform-provider-azurerm/issues/18588))\n* `azurerm_stream_analytics_output_servicebus_queue` - support for the `authentication_mode` property ([#18491](https://github.com/hashicorp/terraform-provider-azurerm/issues/18491))\n\nBUG FIXES: \n\n* `azurerm_kubernetes_cluster` - `orchestrator_version` is set properly for clusters created with an older API version ([#18130](https://github.com/hashicorp/terraform-provider-azurerm/issues/18130))\n* `azurerm_kubernetes_cluster_node_pool` - `orchestrator_version` is set properly for node pools created with an older API version ([#18130](https://github.com/hashicorp/terraform-provider-azurerm/issues/18130))\n* `azurerm_log_analytics_cluster` - fixing an issue when checking for the presence of an existing Log Analytics Cluster ([#18700](https://github.com/hashicorp/terraform-provider-azurerm/issues/18700))\n* `azurerm_logic_app_workflow` - can now be updated when associated with `integration_service_environment_id` ([#18660](https://github.com/hashicorp/terraform-provider-azurerm/issues/18660))\n* `azurerm_spring_cloud_connection` - correctly parse storage blob resource id ([#18699](https://github.com/hashicorp/terraform-provider-azurerm/issues/18699))\n* `azurerm_app_service_connection` - correctly parse storage blob resource id ([#18699](https://github.com/hashicorp/terraform-provider-azurerm/issues/18699))\n\n\n## 3.26.0 (October 06, 2022)\n\nBREAKING CHANGES:\n\n* `azurerm_load_test` - the computed attribute `dataplane_uri` is renamed to `data_plane_uri` for consistency ([#18654](https://github.com/hashicorp/terraform-provider-azurerm/issues/18654))\n\nFEATURES:\n\n* **New Resource:** `azurerm_iotcentral_application_network_rule_set` ([#18589](https://github.com/hashicorp/terraform-provider-azurerm/issues/18589))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.43.0` of `github.com/hashicorp/go-azure-helpers` ([#18630](https://github.com/hashicorp/terraform-provider-azurerm/issues/18630))\n* dependencies: updating to `v0.20221004.1155444` of `github.com/hashicorp/go-azure-sdk` ([#18628](https://github.com/hashicorp/terraform-provider-azurerm/issues/18628))\n* provider: support for auto-registering SDK Clients and Services ([#18629](https://github.com/hashicorp/terraform-provider-azurerm/issues/18629))\n* `azurerm_batch_pool` - support for the `node_deallocation_method`, `dynamic_vnet_assignment_scope`, and `source_port_ranges` properties ([#18436](https://github.com/hashicorp/terraform-provider-azurerm/issues/18436))\n* `azurerm_kubernetes_cluster` - support for `pod_cidrs` and `service_cidrs` properties ([#16657](https://github.com/hashicorp/terraform-provider-azurerm/issues/16657))\n* `azurerm_kubernetes_cluster` - support for `message_of_the_day`, `managed_outbound_ipv6_count`, `scale_down_mode` and `workload_runtime` properties ([#16741](https://github.com/hashicorp/terraform-provider-azurerm/issues/16741))\n* `azurerm_kubernetes_cluster_node_pool` - support for `message_of_the_day`, `scale_down_mode` and `workload_runtime` properties ([#16741](https://github.com/hashicorp/terraform-provider-azurerm/issues/16741))\n* `azurerm_load_test` - switching to an auto-generated resource ([#18654](https://github.com/hashicorp/terraform-provider-azurerm/issues/18654))\n* `azurerm_load_test` - the computed attribute `dataplane_uri` is renamed to `data_plane_uri` for consistency ([#18654](https://github.com/hashicorp/terraform-provider-azurerm/issues/18654))\n* `azurerm_load_test` - support for the `description` field ([#18654](https://github.com/hashicorp/terraform-provider-azurerm/issues/18654))\n* `azurerm_user_assigned_identity` - switching to an auto-generated resource ([#18654](https://github.com/hashicorp/terraform-provider-azurerm/issues/18654))\n\nBUG FIXES:\n\n* `azurerm_linux_function_app_slot` - read app settings from the correct endpoint ([#18396](https://github.com/hashicorp/terraform-provider-azurerm/issues/18396))\n* `azurerm_load_test` - changing the `name` field now forces a new resource to be created ([#18654](https://github.com/hashicorp/terraform-provider-azurerm/issues/18654))\n* `azurerm_windows_function_app_slot` - read app settings from the correct endpoint ([#18396](https://github.com/hashicorp/terraform-provider-azurerm/issues/18396))\n\n## 3.25.0 (September 29, 2022)\n\nFEATURES:\n\n* **New Resource:** `azurerm_cdn_frontdoor_route` ([#18231](https://github.com/hashicorp/terraform-provider-azurerm/issues/18231))\n* **New Resource:** `azurerm_cdn_frontdoor_custom_domain` ([#18231](https://github.com/hashicorp/terraform-provider-azurerm/issues/18231))\n* **New Resource:** `azurerm_cdn_route_disable_link_to_default_domain` ([#18231](https://github.com/hashicorp/terraform-provider-azurerm/issues/18231))\n\nENHANCEMENTS:\n\n* dependencies: `machinelearning` - updating to use `2022-05-01` ([#17671](https://github.com/hashicorp/terraform-provider-azurerm/issues/17671))\n* dependencies: updating to version `v0.20220921.1082044` of `github.com/hashicorp/go-azure-sdk` ([#18557](https://github.com/hashicorp/terraform-provider-azurerm/issues/18557))\n* provider: support for the `oidc_token_file_path` property and `ARM_OIDC_TOKEN_FILE_PATH` environment variable ([#18335](https://github.com/hashicorp/terraform-provider-azurerm/issues/18335))\n* Data Source: `azurerm_databricks_workspace` - exports the `location` propertuy ([#18521](https://github.com/hashicorp/terraform-provider-azurerm/issues/18521))\n* `azurerm_api_management` - support for the `additional_location.gateway_disabled`, `certificate_source`, and `certificate_status` properties ([#18508](https://github.com/hashicorp/terraform-provider-azurerm/issues/18508))\n* `azurerm_automation_software_update_configuration` - the `classification` property is deprecated in favour of the `classifications` property that supports multiple values ([#18539](https://github.com/hashicorp/terraform-provider-azurerm/issues/18539))\n* `azurerm_healthcare_fhir_service` - support for the `oci_artifact` block ([#18571](https://github.com/hashicorp/terraform-provider-azurerm/issues/18571))\n* `azurerm_healthcare_fhir` - support for the `public_network_access_enabled` property ([#18566](https://github.com/hashicorp/terraform-provider-azurerm/issues/18566))\n* `azurerm_iotcentral_application` - support for the `identity` and `public_network_access_enabled` properties ([#18564](https://github.com/hashicorp/terraform-provider-azurerm/issues/18564))\n* `azurerm_linux_virtual_machine` - support for the `gallery_application` property ([#18406](https://github.com/hashicorp/terraform-provider-azurerm/issues/18406))\n* `azurerm_machine_learning_workspace` - support for the `public_network_access_enabled` and `v1_legacy_mode` properties ([#18469](https://github.com/hashicorp/terraform-provider-azurerm/issues/18469))\n* `azurerm_storage_account` - support for the `multichannel_enabled` property ([#17999](https://github.com/hashicorp/terraform-provider-azurerm/issues/17999))\n* `azurerm_virtual_hub_bgp_connection` - support for the `virtual_network_connection_id` property ([#18469](https://github.com/hashicorp/terraform-provider-azurerm/issues/18469))\n* `azurerm_windows_virtual_machine` - support for the `gallery_application` property ([#18406](https://github.com/hashicorp/terraform-provider-azurerm/issues/18406))\n\nBUG FIXES:\n\n* Data Source: `azurerm_key_vault_certificate_data` - correctly create PEM private key block header for EC keys ([#18419](https://github.com/hashicorp/terraform-provider-azurerm/issues/18419))\n* `azurerm_log_analytics_linked_storage_account` - correctly `data_source_type` case handling ([#18116](https://github.com/hashicorp/terraform-provider-azurerm/issues/18116))\n\n## 3.24.0 (September 22, 2022)\n\nFEATURES:\n\n* **New Resource**: `azurerm_automation_software_update_configuration` ([#17902](https://github.com/hashicorp/terraform-provider-azurerm/issues/17902))\n* **New Resource**: `azurerm_monitor_alert_processing_rule_action_group` ([#17006](https://github.com/hashicorp/terraform-provider-azurerm/issues/17006))\n* **New Resource**: `azurerm_monitor_alert_processing_rule_suppression` ([#17006](https://github.com/hashicorp/terraform-provider-azurerm/issues/17006))\n\nENHANCEMENTS:\n\n* dependencies: updating to version `v0.20220916.1125744` of `github.com/hashicorp/go-azure-sdk` ([#18446](https://github.com/hashicorp/terraform-provider-azurerm/issues/18446))\n* dependencies: `disks` - updating to use `2022-03-02` ([#17671](https://github.com/hashicorp/terraform-provider-azurerm/issues/17671))\n* Data Source: `azurerm_automation_account` - exports the `identity` attribute ([#18478](https://github.com/hashicorp/terraform-provider-azurerm/issues/18478))\n* Data Source: `azurerm_storage_account` - export the `azure_files_identity_based_auth` property ([#18405](https://github.com/hashicorp/terraform-provider-azurerm/issues/18405))\n* `azurerm_api_management_api_operation` - support the `example`, `schema_id`, and `type_name` properties ([#18409](https://github.com/hashicorp/terraform-provider-azurerm/issues/18409))\n* `azurerm_cognitive_account` - support for the `customer_managed_key` property ([#18516](https://github.com/hashicorp/terraform-provider-azurerm/issues/18516))\n* `azurerm_data_factory_flowlet_data_flow` - support for the `rejected_linked_service` property ([#18056](https://github.com/hashicorp/terraform-provider-azurerm/issues/18056))\n* `azurerm_data_factory_data_flow` - support for the `rejected_linked_service` property ([#18056](https://github.com/hashicorp/terraform-provider-azurerm/issues/18056))\n* `azurerm_sentinel_alert_rule_scheduled` - support for the `techniques` property ([#18430](https://github.com/hashicorp/terraform-provider-azurerm/issues/18430))\n* `azurerm_linux_virtual_machine` - support for the `patch_assessment_mode` property ([#18437](https://github.com/hashicorp/terraform-provider-azurerm/issues/18437))\n* `azurerm_managed_disk` - support for the `PremiumV2_LRS` type ([#17671](https://github.com/hashicorp/terraform-provider-azurerm/issues/17671))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support for the `user_data_base64` property ([#18486](https://github.com/hashicorp/terraform-provider-azurerm/issues/18486))\n* `azurerm_private_endpoint` - support for the `custom_network_interface_name` property ([#18025](https://github.com/hashicorp/terraform-provider-azurerm/issues/18025))\n* `azurerm_virtual_machine_extension` - support for the `failure_suppression_enabled` property ([#18441](https://github.com/hashicorp/terraform-provider-azurerm/issues/18441))\n* `azurerm_virtual_machine_scale_set_extension` - support for the `failure_suppression_enabled` property ([#18441](https://github.com/hashicorp/terraform-provider-azurerm/issues/18441))\n* `azurerm_windows_virtual_machine` - support for the `patch_assessment_mode` property ([#18437](https://github.com/hashicorp/terraform-provider-azurerm/issues/18437))\n\nBUG FIXES:\n\n* `azurerm_monitor_metric_alert` - pass multi criteria to the API in the correct order ([#18438](https://github.com/hashicorp/terraform-provider-azurerm/issues/18438))\n* `azurerm_monitor_diagnostic_settings` - correctly parsing the case for the `workspace_id` property ([#18467](https://github.com/hashicorp/terraform-provider-azurerm/issues/18467))\n* `azurerm_security_center_workspace` - correctly parsing the case for the `workspace_id` property ([#18467](https://github.com/hashicorp/terraform-provider-azurerm/issues/18467))\n\n## 3.23.0 (September 15, 2022)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_private_dns_zone_virtual_network_link` ([#18045](https://github.com/hashicorp/terraform-provider-azurerm/issues/18045))\n* **New Data Source**: `azurerm_monitor_data_collection_rule` ([#18318](https://github.com/hashicorp/terraform-provider-azurerm/issues/18318))\n\nENHANCEMENTS:\n\n* `azurerm_api_management_api_schema` - support for the `components` and `definitions` properties ([#18394](https://github.com/hashicorp/terraform-provider-azurerm/issues/18394))\n* `azurerm_automation_account` - support for the `hybrid_service_url` property ([#18320](https://github.com/hashicorp/terraform-provider-azurerm/issues/18320))\n* `azurerm_batch_pool` - support for the `user_assigned_identity_id` property ([#17104](https://github.com/hashicorp/terraform-provider-azurerm/issues/17104))\n* `azurerm_batch_pool` - support for the `data_disks`, `disk_encryption`, `extensions`, `node_placement`, `task_scheduling_policy`, `user_accounts`, and `windows` blocks ([#18226](https://github.com/hashicorp/terraform-provider-azurerm/issues/18226))\n* `azurerm_cosmosdb_account` - support for  User Assigned identities ([#18378](https://github.com/hashicorp/terraform-provider-azurerm/issues/18378))\n* `azurerm_eventhub_namespace` - support for the `public_network_access_enabled` property ([#18314](https://github.com/hashicorp/terraform-provider-azurerm/issues/18314))\n* `azurerm_logic_app_standard` - support for the `virtual_network_subnet_id` property for vNet integration ([#17731](https://github.com/hashicorp/terraform-provider-azurerm/issues/17731))\n* `azurerm_management_group_policy_remediation` - the `policy_definition_id` property is deprecated in favour of the more accuractly named `policy_definition_reference_id` property ([#18037](https://github.com/hashicorp/terraform-provider-azurerm/issues/18037))\n* `azurerm_resource_policy_remediation` - the `policy_definition_id` property is deprecated in favour of the more accuractly named `policy_definition_reference_id` property ([#18037](https://github.com/hashicorp/terraform-provider-azurerm/issues/18037))\n* `azurerm_resource_group_policy_remediation` - the `policy_definition_id` property is deprecated in favour of the more accuractly named `policy_definition_reference_id` property ([#18037](https://github.com/hashicorp/terraform-provider-azurerm/issues/18037))\n* `azurerm_subscription_policy_remediation` - the `policy_definition_id` property is deprecated in favour of the more accuractly named `policy_definition_reference_id` property ([#18037](https://github.com/hashicorp/terraform-provider-azurerm/issues/18037))\n\nBUG FIXES:\n\n* `azurerm_netapp_volume`: add extra validation when `data_protection_snapshot_policy.0. snapshot_policy_id` is empty ([#18348](https://github.com/hashicorp/terraform-provider-azurerm/issues/18348))\n \n## 3.22.0 (September 08, 2022)\n\nFEATURES:\n\n* **New Resource**: `azurerm_api_management_api_tag_description` ([#17876](https://github.com/hashicorp/terraform-provider-azurerm/issues/17876))\n* **New Resource**: `azurerm_api_management_schema` ([#18158](https://github.com/hashicorp/terraform-provider-azurerm/issues/18158))\n* **New Resource**: `azurerm_automation_watcher` ([#17927](https://github.com/hashicorp/terraform-provider-azurerm/issues/17927))\n* **New Resource**: `azurerm_automation_source_control` ([#18175](https://github.com/hashicorp/terraform-provider-azurerm/issues/18175))\n* **New Resource**: `azurerm_container_registry_token_password` ([#15939](https://github.com/hashicorp/terraform-provider-azurerm/issues/15939))\n* **New Resource**: `azurerm_monitor_data_collection_rule_association` ([#17948](https://github.com/hashicorp/terraform-provider-azurerm/issues/17948))\n* **New Resource**: `azurerm_orbital_spacecraft` ([#17860](https://github.com/hashicorp/terraform-provider-azurerm/issues/17860))\n\nENHANCEMENTS:\n\n* dependencies: updating to version `v0.20220907.1111434` of `github.com/hashicorp/go-azure-sdk` ([#18282](https://github.com/hashicorp/terraform-provider-azurerm/issues/18282))\n* dependencies: `desktopvirtualization` - updating to use `2022-02-10` ([#17489](https://github.com/hashicorp/terraform-provider-azurerm/issues/17489))\n* dependencies: `iothub.dps` - update to use `hashicorp/go-azure-sdk` ([#18299](https://github.com/hashicorp/terraform-provider-azurerm/issues/18299))\n* `azurerm_api_management_api` - the `soap_pass_through` property is deprecated in favour of the `api_type` property ([#17812](https://github.com/hashicorp/terraform-provider-azurerm/issues/17812))\n* `azurerm_kubernetes_cluster` - support for the `edge_zone` property ([#18115](https://github.com/hashicorp/terraform-provider-azurerm/issues/18115))\n* `azurerm_kubernetes_cluster` - support for the `windows_profile.gmsa` block ([#16437](https://github.com/hashicorp/terraform-provider-azurerm/issues/16437))\n* `azurerm_mssql_database` - support for the `maintenance_configuration_name` property ([#18247](https://github.com/hashicorp/terraform-provider-azurerm/issues/18247))\n* `azurerm_virtual_desktop_host_pool` - support for the `scheduled_agent_updates` block ([#17489](https://github.com/hashicorp/terraform-provider-azurerm/issues/17489))\n* `azurerm_hdinsight_kafka_cluster` - support for the `extension` property ([#17846](https://github.com/hashicorp/terraform-provider-azurerm/issues/17846))\n* `azurerm_hdinsight_spark_cluster` - support for the `extension` property ([#17846](https://github.com/hashicorp/terraform-provider-azurerm/issues/17846))\n* `azurerm_hdinsight_interactive_query_cluster` - support for the `extension` property ([#17846](https://github.com/hashicorp/terraform-provider-azurerm/issues/17846))\n* `azurerm_hdinsight_hbase_cluster` - support for the `extension` property ([#17846](https://github.com/hashicorp/terraform-provider-azurerm/issues/17846))\n* `azurerm_hdinsight_hadoop_cluster` - support for the `extension` property ([#17846](https://github.com/hashicorp/terraform-provider-azurerm/issues/17846))\n\nBUG FIXES:\n\n* `azurerm_mssql_database` - the `license_type` property is now also Computed ([#18230](https://github.com/hashicorp/terraform-provider-azurerm/issues/18230))\n* `azurerm_log_analytics_solution` - a state migration to work around the previously incorrect id casing ([#18291](https://github.com/hashicorp/terraform-provider-azurerm/issues/18291))\n\n## 3.21.1 (September 02, 2022)\n\nBREAKING CHANGES:\n\n* `azurerm_container_registry` - the field `azuread_authentication_as_arm_policy_enabled` is removed to fix a regression - support for this will be reintroduced in a future release.\n* `azurerm_container_registry` - the field `soft_delete_policy` is removed to fix a regression - support for this will be reintroduced in a future release.\n\nNOTES:\n\n* the `containerregistry` api version is reverted to `2021-08-01-preview` to restore the `virtual_network` block meaning the `azuread_authentication_as_arm_policy_enabled` and `soft_delete_policy` properties had to be removed as they were not supported by the API version that supported virtual network rules. ([#18239](https://github.com/hashicorp/terraform-provider-azurerm/issues/18239))\n\nBUG FIXES:\n\n* `azurerm_container_registry` - the `virtual_network` block is restored ([#18239](https://github.com/hashicorp/terraform-provider-azurerm/issues/18239))\n* `azurerm_log_analytics_data_export_rule` - a state migration to work around the previously incorrect id casing ([#18240](https://github.com/hashicorp/terraform-provider-azurerm/issues/18240))\n\n## 3.21.0 (September 01, 2022)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_monitor_data_collection_endpoint` ([#17992](https://github.com/hashicorp/terraform-provider-azurerm/issues/17992))\n* **New Resource**: `azurerm_app_service_connection` ([#16907](https://github.com/hashicorp/terraform-provider-azurerm/issues/16907))\n* **New Resource**: `azurerm_automation_hybrid_runbook_worker` ([#17893](https://github.com/hashicorp/terraform-provider-azurerm/issues/17893))\n* **New Resource**: `azurerm_api_management_gateway_certificate_authority` ([#17879](https://github.com/hashicorp/terraform-provider-azurerm/issues/17879))\n* **New Resource**: `azurerm_api_management_gateway_host_name_configuration` ([#17962](https://github.com/hashicorp/terraform-provider-azurerm/issues/17962))\n* **New Resource**: `azurerm_api_management_product_tag` ([#17798](https://github.com/hashicorp/terraform-provider-azurerm/issues/17798))\n* **New Resource**: `azurerm_automation_connection_type` ([#17538](https://github.com/hashicorp/terraform-provider-azurerm/issues/17538))\n* **New Resource**: `azurerm_automation_hybrid_runbook_worker_group` ([#17881](https://github.com/hashicorp/terraform-provider-azurerm/issues/17881))\n* **New Resource:** `azurerm_cdn_frontdoor_rule` ([#18010](https://github.com/hashicorp/terraform-provider-azurerm/issues/18010))\n* **New Resource:** `azurerm_cdn_frontdoor_secret` ([#18010](https://github.com/hashicorp/terraform-provider-azurerm/issues/18010))\n* **New Resource**: `azurerm_container_registry_task_schedule_run_now` ([#15120](https://github.com/hashicorp/terraform-provider-azurerm/issues/15120))\n* **New Resource**: `azurerm_cosmosdb_sql_dedicated_gateway` ([#18133](https://github.com/hashicorp/terraform-provider-azurerm/issues/18133))\n* **New Resource**: `azurerm_dashboard_grafana` ([#17840](https://github.com/hashicorp/terraform-provider-azurerm/issues/17840))\n* **New Resource**: `azurerm_healthcare_medtech_service` ([#15967](https://github.com/hashicorp/terraform-provider-azurerm/issues/15967))\n* **New Resource**: `azurerm_log_analytics_query_pack_query` ([#17929](https://github.com/hashicorp/terraform-provider-azurerm/issues/17929))\n* **New Resource**: `azurerm_spring_cloud_connection` ([#16907](https://github.com/hashicorp/terraform-provider-azurerm/issues/16907))\n* **New Resource**: `azurerm_search_shared_private_link_service` ([#17744](https://github.com/hashicorp/terraform-provider-azurerm/issues/17744))\n* **New Resource**: `azurerm_sentinel_alert_rule_nrt` ([#15999](https://github.com/hashicorp/terraform-provider-azurerm/issues/15999))\n\nENHANCEMENTS:\n\n* dependencies: updating to version `v0.20220830.1105041` of `github.com/hashicorp/go-azure-sdk` ([#18183](https://github.com/hashicorp/terraform-provider-azurerm/issues/18183))\n* dependencies: `log_analytics` - update to use `hashicorp/go-azure-sdk` ([#18098](https://github.com/hashicorp/terraform-provider-azurerm/issues/18098))\n* `azurerm_batch_pool` - support for the `mount` property ([#18042](https://github.com/hashicorp/terraform-provider-azurerm/issues/18042))\n* `azurerm_container_registry` - support for the `azuread_authentication_as_arm_policy_enabled` and `soft_delete_policy` properties ([#17926](https://github.com/hashicorp/terraform-provider-azurerm/issues/17926))\n* `azurerm_cosmosdb_cassandra_cluster` - support for the `HoursBetweenBackups` property ([#18154](https://github.com/hashicorp/terraform-provider-azurerm/issues/18154))\n* `azurerm_hdinsight_kafka_cluster` - add support for the `disk_encryption` property ([#17351](https://github.com/hashicorp/terraform-provider-azurerm/issues/17351))\n* `azurerm_hdinsight_spark_cluster` - add support for the `disk_encryption` property ([#17351](https://github.com/hashicorp/terraform-provider-azurerm/issues/17351))\n* `azurerm_hdinsight_interactive_query_cluster` - add support for the `disk_encryption` property ([#17351](https://github.com/hashicorp/terraform-provider-azurerm/issues/17351))\n* `azurerm_hdinsight_hbase_cluster` - add support for the `disk_encryption` property ([#17351](https://github.com/hashicorp/terraform-provider-azurerm/issues/17351))\n* `azurerm_hdinsight_hadoop_cluster` - add support for the `disk_encryption` property ([#17351](https://github.com/hashicorp/terraform-provider-azurerm/issues/17351))\n* `azurerm_iothub_dps` - support for the `resource_count`, `parallel_deployments`, and `failure_percentage` properties ([#18151](https://github.com/hashicorp/terraform-provider-azurerm/issues/18151))\n* `azurerm_kubernetes_node_pool` - spot node pools can now be upgraded ([#18124](https://github.com/hashicorp/terraform-provider-azurerm/issues/18124))\n* `azurerm_linux_virtual_machine` - the `source_image_id` property now supports both `Community Gallery Images`, and `Shared Gallery Images` resource IDs ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - support for the following properties `host_group_id`, and `extension_operations_enabled` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `data_disk` block property `name` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `scale_in` block properties `rule`, and `force_deletion_enabled` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `rolling_upgrade_policy` block properties `cross_zone_upgrade_enabled`, and `prioritize_unhealthy_instances_enabled`  ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - added support for the `spot_restore` block ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `spot_restore` block properties `enabled`, and `timeout` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `public_ip_address` block property `version` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - the `source_image_id` property now supports both `Community Gallery Images`, and `Shared Gallery Images` resource IDs ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `gallery_applications` code block ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `gallery_applications` block properties `configuration_reference_blob_uri`, `order`, `package_referenceId`, and `tag` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - deprecated the `scale_in_policy` property in favour of the `scale_in` block due to more fields being added ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `scale_in` block property `rule` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_management_group_policy_remediation` - support for the `resource_count`, `parallel_deployments`, and `failure_percentage` properties ([#17313](https://github.com/hashicorp/terraform-provider-azurerm/issues/17313))\n* `azurerm_monitor_diagnostic_setting` - support for the `category_group` property ([#16367](https://github.com/hashicorp/terraform-provider-azurerm/issues/16367))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support for the following properties `capacity_reservation_group_id`, `single_placement_group`, and `extension_operations_enabled` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support for the `extension` block property `suppress_failures_enabled` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support for the `additional_capabilities` block property `ultra_ssd_enabled` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support for the `public_ip_address` block properties `version`, and `sku_name` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support for `linux_configuration`, and `windows_configuration` code blocks property `patch_assessment_mode` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_orchestrated_virtual_machine_scale_set` - the `source_image_id` property now supports both `Community Gallery Images`, and `Shared Gallery Images` resource IDs ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_policy_definition - export the `role_definition_ids` attribute ([#18043](https://github.com/hashicorp/terraform-provider-azurerm/issues/18043))\n* `azurerm_resource_group_policy_remediation` - support for the `resource_count`, `parallel_deployments`, and `failure_percentage` properties ([#17313](https://github.com/hashicorp/terraform-provider-azurerm/issues/17313))\n* `azurerm_resource_policy_remediation` - support for the `resource_count`, `parallel_deployments`, and `failure_percentage` properties ([#17313](https://github.com/hashicorp/terraform-provider-azurerm/issues/17313))\n* `azurerm_role_assignment` - support for `scope` to start with `/providers/Subscription` ([#17456](https://github.com/hashicorp/terraform-provider-azurerm/issues/17456))\n* `azurerm_servicebus_namespace` - support for the `public_network_access_enabled` and `minimum_tls_version` properties ([#17805](https://github.com/hashicorp/terraform-provider-azurerm/issues/17805))\n* `azurerm_storage_account` - support for the `public_network_access_enabled` property ([#18005](https://github.com/hashicorp/terraform-provider-azurerm/issues/18005))\n* `azurerm_stream_analytics_output_eventhub` - support for the `authentication_mode` property ([#18096](https://github.com/hashicorp/terraform-provider-azurerm/issues/18096))\n* `azurerm_stream_analytics_output_mssql` - support for the `authentication_mode` property ([#18096](https://github.com/hashicorp/terraform-provider-azurerm/issues/18096))\n* `azurerm_stream_analytics_output_servicebus_topic` - support for the `authentication_mode` property ([#18096](https://github.com/hashicorp/terraform-provider-azurerm/issues/18096))\n* `azurerm_stream_analytics_output_powerbi` - support for the `token_user_principal_name` and `token_user_display_name` properties ([#18117](https://github.com/hashicorp/terraform-provider-azurerm/issues/18117))\n* `azurerm_stream_analytics_output_cosmosdb` - support for the `partition_key` property ([#18120](https://github.com/hashicorp/terraform-provider-azurerm/issues/18120))\n* `azurerm_stream_analytics_reference_input_blob` - support for the `authentication_mode` property ([#18137](https://github.com/hashicorp/terraform-provider-azurerm/issues/18137))\n* `azurerm_stream_analytics_reference_input_mssql` - support for the `table` property ([#18211](https://github.com/hashicorp/terraform-provider-azurerm/issues/18211))\n* `azurerm_subscription_policy_remediation` - support for the `resource_count`, `parallel_deployments`, and `failure_percentage` properties ([#17313](https://github.com/hashicorp/terraform-provider-azurerm/issues/17313))\n* `azurerm_windows_virtual_machine` - the `source_image_id` property now supports both `Community Gallery Images`, and `Shared Gallery Images` resource IDs ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - support for the following properties `host_group_id`, and `extension_operations_enabled` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `data_disk` block property `name` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `scale_in` block properties `rule`, and `force_deletion_enabled` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `rolling_upgrade_policy` block properties `cross_zone_upgrade_enabled`, and `prioritize_unhealthy_instances_enabled`  ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - added support for the `spot_restore` block ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `spot_restore` block properties `enabled`, and `timeout` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `public_ip_address` block property `version` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - the `source_image_id` property now supports both `Community Gallery Images`, and `Shared Gallery Images` resource IDs ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `gallery_applications` code block ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `gallery_applications` block properties `configuration_reference_blob_uri`, `order`, `package_referenceId`, and `tag` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - deprecated the `scale_in_policy` property in favour of the `scale_in` block due to more fields being added ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `scale_in` block property `rule` ([#17571](https://github.com/hashicorp/terraform-provider-azurerm/issues/17571))\n\nBUG FIXES:\n\n* `azurerm_kubernetes_cluster` - `kube_config` is now set when Microsoft Entra ID is enabled for a `v1.24` cluster ([#18142](https://github.com/hashicorp/terraform-provider-azurerm/issues/18142))\n* `azurerm_redis_cache` - now recreates the cache when downgrading the SKU ([#17767](https://github.com/hashicorp/terraform-provider-azurerm/issues/17767))\n* `azurerm_spring_cloud_service` - ignore the default zero value for `read_timeout_seconds` ([#18161](https://github.com/hashicorp/terraform-provider-azurerm/issues/18161))\n\n## 3.20.0 (August 25, 2022)\n\nFEATURES:\n\n* **Provider:** support for generic OIDC authentication providers ([#18118](https://github.com/hashicorp/terraform-provider-azurerm/issues/18118))\n* **New Resource**: `azurerm_backup_policy_vm_workload` ([#17765](https://github.com/hashicorp/terraform-provider-azurerm/issues/17765))\n* **New Resource**: `azurerm_monitor_scheduled_query_rules_alert_v2` ([#17772](https://github.com/hashicorp/terraform-provider-azurerm/issues/17772))\n\nENHANCEMENTS:\n\n* Dependencies: update `go-azure-sdk` to `v0.20220824.1090858` ([#18100](https://github.com/hashicorp/terraform-provider-azurerm/issues/18100))\n* Dependencies: `consumption` - updating to use `hashicorp/go-azure-sdk` ([#18101](https://github.com/hashicorp/terraform-provider-azurerm/issues/18101))\n* `azurerm_data_factory_dataset_json` - `filename` and `path` in `azure_blob_storage_location` block can now be empty ([#18061](https://github.com/hashicorp/terraform-provider-azurerm/issues/18061))\n\nBUG FIXES:\n\n* `data.azurerm_kubernetes_cluster` - `kube_config` is now set when Microsoft Entra ID is enabled for a v1.24 cluster ([#18131](https://github.com/hashicorp/terraform-provider-azurerm/issues/18131))\n* `azurerm_cosmosdb_sql_database` - prevent panic in autoacale settings ([#18070](https://github.com/hashicorp/terraform-provider-azurerm/issues/18070))\n* `azurerm_kubernetes_cluster_node_pool`  - fixa crash in expanding upgrade settings ([#18074](https://github.com/hashicorp/terraform-provider-azurerm/issues/18074))\n* `azurerm_mssql_elastic_pool` - list of values for `maintenance_configuration_name` is now correct ([#18041](https://github.com/hashicorp/terraform-provider-azurerm/issues/18041))\n* `azurerm_postgresql_flexible_server` - `point_in_time_restore_time_in_utc` correctly converts to RFC3339 ([#18106](https://github.com/hashicorp/terraform-provider-azurerm/issues/18106))\n\n## 3.19.1 (August 19, 2022)\n\nBUG FIXES:\n\n* `azurerm_dns_a_record` - parse resource IDs insensitively in the read functions due to casing on the dnsZones segment ([#18048](https://github.com/hashicorp/terraform-provider-azurerm/issues/18048))\n* `azurerm_dns_aaaa_record` - parse resource IDs insensitively in the read functions due to casing on the dnsZones segment ([#18048](https://github.com/hashicorp/terraform-provider-azurerm/issues/18048))\n* `azurerm_dns_caa_record` - parse resource IDs insensitively in the read functions due to casing on the dnsZones segment ([#18048](https://github.com/hashicorp/terraform-provider-azurerm/issues/18048))\n* `azurerm_dns_cname_record` - parse resource IDs insensitively in the read functions due to casing on the dnsZones segment ([#18048](https://github.com/hashicorp/terraform-provider-azurerm/issues/18048))\n* `azurerm_dns_mx_record` - parse resource IDs insensitively in the read functions due to casing on the dnsZones segment ([#18048](https://github.com/hashicorp/terraform-provider-azurerm/issues/18048))\n* `azurerm_dns_ns_record` - parse resource IDs insensitively in the read functions due to casing on the dnsZones segment ([#18048](https://github.com/hashicorp/terraform-provider-azurerm/issues/18048))\n* `azurerm_dns_ptr_record` - parse resource IDs insensitively in the read functions due to casing on the dnsZones segment ([#18048](https://github.com/hashicorp/terraform-provider-azurerm/issues/18048))\n* `azurerm_dns_srv_record` - parse resource IDs insensitively in the read functions due to casing on the dnsZones segment ([#18048](https://github.com/hashicorp/terraform-provider-azurerm/issues/18048))\n* `azurerm_dns_txt_record` - parse resource IDs insensitively in the read functions due to casing on the dnsZones segment ([#18048](https://github.com/hashicorp/terraform-provider-azurerm/issues/18048))\n* `azurerm_dns_zone` - parse resource IDs insensitively in the read functions due to casing on the dnsZones segment ([#18048](https://github.com/hashicorp/terraform-provider-azurerm/issues/18048))\n\n## 3.19.0 (August 18, 2022)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_dns_a_record` ([#17477](https://github.com/hashicorp/terraform-provider-azurerm/issues/17477))\n* **New Data Source**: `azurerm_dns_aaaa_record` ([#17477](https://github.com/hashicorp/terraform-provider-azurerm/issues/17477))\n* **New Data Source**: `azurerm_dns_caa_record` ([#17477](https://github.com/hashicorp/terraform-provider-azurerm/issues/17477))\n* **New Data Source**: `azurerm_dns_cname_record` ([#17477](https://github.com/hashicorp/terraform-provider-azurerm/issues/17477))\n* **New Data Source**: `azurerm_dns_mx_record` ([#17477](https://github.com/hashicorp/terraform-provider-azurerm/issues/17477))\n* **New Data Source**: `azurerm_dns_ns_record` ([#17477](https://github.com/hashicorp/terraform-provider-azurerm/issues/17477))\n* **New Data Source**: `azurerm_dns_ptr_record` ([#17477](https://github.com/hashicorp/terraform-provider-azurerm/issues/17477))\n* **New Data Source**: `azurerm_dns_soa_record` ([#17477](https://github.com/hashicorp/terraform-provider-azurerm/issues/17477))\n* **New Data Source**: `azurerm_dns_srv_record` ([#17477](https://github.com/hashicorp/terraform-provider-azurerm/issues/17477))\n* **New Data Source**: `azurerm_dns_txt_record` ([#17477](https://github.com/hashicorp/terraform-provider-azurerm/issues/17477))\n* **New Data Source**: `azurerm_private_dns_a_record` ([#18036](https://github.com/hashicorp/terraform-provider-azurerm/issues/18036))\n* **New Data Source**: `azurerm_private_dns_aaaa_record` ([#18036](https://github.com/hashicorp/terraform-provider-azurerm/issues/18036))\n* **New Data Source**: `azurerm_private_dns_cname_record` ([#18036](https://github.com/hashicorp/terraform-provider-azurerm/issues/18036))\n* **New Data Source**: `azurerm_private_dns_mx_record` ([#18036](https://github.com/hashicorp/terraform-provider-azurerm/issues/18036))\n* **New Data Source**: `azurerm_private_dns_ptr_record` ([#18036](https://github.com/hashicorp/terraform-provider-azurerm/issues/18036))\n* **New Data Source**: `azurerm_private_dns_soa_record` ([#18036](https://github.com/hashicorp/terraform-provider-azurerm/issues/18036))\n* **New Data Source**: `azurerm_private_dns_srv_record` ([#18036](https://github.com/hashicorp/terraform-provider-azurerm/issues/18036))\n* **New Data Source**: `azurerm_private_dns_txt_record` ([#18036](https://github.com/hashicorp/terraform-provider-azurerm/issues/18036))\n* **New Resource**: `azurerm_eventhub_namespace_schema_group` ([#17635](https://github.com/hashicorp/terraform-provider-azurerm/issues/17635))\n* **New Resource**: `azurerm_cdn_frontdoor_firewall_policy` ([#17715](https://github.com/hashicorp/terraform-provider-azurerm/issues/17715))\n* **New Resource**: `azurerm_cdn_frontdoor_security_policy` ([#17715](https://github.com/hashicorp/terraform-provider-azurerm/issues/17715))\n* **New Resource**: `azurerm_data_factory_flowlet_data_flow` ([#16987](https://github.com/hashicorp/terraform-provider-azurerm/issues/16987))\n\nENHANCEMENTS:\n\n* Dependencies: update `go-azure-helpers` to `v0.39.1` ([#18015](https://github.com/hashicorp/terraform-provider-azurerm/issues/18015))\n* Dependencies: update `go-azure-sdk` to `v0.20220815.1092453` ([#17998](https://github.com/hashicorp/terraform-provider-azurerm/issues/17998))\n* Dependencies: `dedicated_host_*` to use `hashicorp/go-azure-sdk` ([#17616](https://github.com/hashicorp/terraform-provider-azurerm/issues/17616))\n* Dependencies: `dataprotection`: updating to use `hashicorp/go-azure-sdk` ([#17700](https://github.com/hashicorp/terraform-provider-azurerm/issues/17700))\n* Dependencies: `dns` - updating to use `hashicorp/go-azure-sdk` ([#17986](https://github.com/hashicorp/terraform-provider-azurerm/issues/17986))\n* Dependencies: `maintenance` - updating to use `hashicorp/go-azure-sdk` ([#17954](https://github.com/hashicorp/terraform-provider-azurerm/issues/17954))\n* Data Source: `azurerm_images` - now uses a logical id ([#17766](https://github.com/hashicorp/terraform-provider-azurerm/issues/17766))\n* Data Source: `azurerm_management_group` - now exports the `management_group_ids`, `all_management_group_ids`, and `all_subscription_ids` attributes ([#16208](https://github.com/hashicorp/terraform-provider-azurerm/issues/16208))\n* `azurerm_active_directory_domain_service` - support for the `kerberos_armoring_enabled` and `kerberos_rc4_encryption_enabled` properties ([#17853](https://github.com/hashicorp/terraform-provider-azurerm/issues/17853))\n* `azurerm_application_gateway` - support for the `global` block ([#17651](https://github.com/hashicorp/terraform-provider-azurerm/issues/17651))\n* `azurerm_application_gateway` - support for `components` in `rewrite_rule_set.rewrite_rule.url` ([#13899](https://github.com/hashicorp/terraform-provider-azurerm/issues/13899))\n* `azurerm_automation_account` - support for the `private_endpoint_connection` property ([#17934](https://github.com/hashicorp/terraform-provider-azurerm/issues/17934))\n* `azurerm_automation_account` - support for the `encryption` block and `local_authentication_enabled` property ([#17454](https://github.com/hashicorp/terraform-provider-azurerm/issues/17454))\n* `azurerm_batch_account` - support for the `storage_account_authentication_mode`, `storage_account_node_identit`, and `allowed_authentication_modes` properties ([#16758](https://github.com/hashicorp/terraform-provider-azurerm/issues/16758))\n* `azurerm_batch_pool` - support for identity referencees in container registries ([#17416](https://github.com/hashicorp/terraform-provider-azurerm/issues/17416))\n* `azurerm_data_factory_data_flow` - support for the `flowlet` block ([#16987](https://github.com/hashicorp/terraform-provider-azurerm/issues/16987))\n* `azurerm_data_factory_integration_runtime_azure_ssis` - support for the `express_vnet_injection` property ([#17756](https://github.com/hashicorp/terraform-provider-azurerm/issues/17756))\n* `azurerm_firewall_policy_resource` - support for the `private_ranges` and `allow_sql_redirect` properties ([#17842](https://github.com/hashicorp/terraform-provider-azurerm/issues/17842))\n* `azurerm_key_vault` - support for the `public_network_access_enabled` property ([#17552](https://github.com/hashicorp/terraform-provider-azurerm/issues/17552))\n* `azurerm_linux_virtual_machine` - now supports delete Eviction policies ([#17226](https://github.com/hashicorp/terraform-provider-azurerm/issues/17226))\n* `azurerm_linux_virtual_machine_scale_set` - now supports delete Eviction policies ([#17226](https://github.com/hashicorp/terraform-provider-azurerm/issues/17226))\n* `azurerm_mssql_elastic_pool` - support for the `maintenance_configuration_name` property ([#17790](https://github.com/hashicorp/terraform-provider-azurerm/issues/17790))\n* `azurerm_mssql_server` - support `Disabled` for the `minimum_tls_version` property ([#16595](https://github.com/hashicorp/terraform-provider-azurerm/issues/16595))\n* `azurerm_spring_cloud_app` - support the `public_endpoint_enabled` property ([#17630](https://github.com/hashicorp/terraform-provider-azurerm/issues/17630))\n* `azurerm_spring_cloud_gateway_route_config` - support for the `open_api;azurerm_spring_cloud_service`  and `log_stream_public_endpoint_enabledread_timeout_seconds` properties ([#17630](https://github.com/hashicorp/terraform-provider-azurerm/issues/17630))\n* `azurerm_shared_image` - support for the `architecture` property ([#17250](https://github.com/hashicorp/terraform-provider-azurerm/issues/17250))\n* `azurerm_storage_account` - support for the `default_to_oauth_authentication` property ([#17116](https://github.com/hashicorp/terraform-provider-azurerm/issues/17116))\n* `azurerm_storage_table_entity` - support for specifying data types on entity properties ([#15782](https://github.com/hashicorp/terraform-provider-azurerm/issues/15782))\n* `azurerm_shared_image_version` - support for `blob_uri` and `storage_account_id` ([#17768](https://github.com/hashicorp/terraform-provider-azurerm/issues/17768))\n* `azurerm_windows_virtual_machine` - now supports delete Eviction policies ([#17226](https://github.com/hashicorp/terraform-provider-azurerm/issues/17226))\n* `azurerm_windows_virtual_machine_scale_set` - now supports delete Eviction policies ([#17226](https://github.com/hashicorp/terraform-provider-azurerm/issues/17226))\n* `azurerm_web_application_firewall_policy` - support for the `excluded_rule_set` property ([#17757](https://github.com/hashicorp/terraform-provider-azurerm/issues/17757))\n* `azurerm_log_analytics_workspace` - support for the `cmk_for_query_forced` property ([#17365](https://github.com/hashicorp/terraform-provider-azurerm/issues/17365))\n* `azurerm_lb_backend_address_pool_address` - support for the `backend_address_ip_configuration_id` property ([#17770](https://github.com/hashicorp/terraform-provider-azurerm/issues/17770))\n\nBUG FIXES:\n\n* Data Source: `azurerm_windows_web_app` - add missing schema definition for 'virtual_network_subnet_id' ([#18028](https://github.com/hashicorp/terraform-provider-azurerm/issues/18028))\n* `azurerm_cdn_endpoint_custom_domain` - deprecating the `key_vault_certificate_id` property in favour of the `key_vault_secret_id` property withing the `user_managed https_allows` block ([#17114](https://github.com/hashicorp/terraform-provider-azurerm/issues/17114))\n* `azurerm_data_protection_backup_policy_postgresql_resource` - prevent a crash when given an empty criteria block ([#17904](https://github.com/hashicorp/terraform-provider-azurerm/issues/17904))\n* `azurerm_disk_encryption_set` - prevent an issue during creation when the disk encryption set and key vault are in different subscriptions ([#17964](https://github.com/hashicorp/terraform-provider-azurerm/issues/17964))\n* `azurerm_windows_function_app` fix a bug with setting values for `WindowsFxString` ([#18014](https://github.com/hashicorp/terraform-provider-azurerm/issues/18014))\n* `azurerm_windows_function_app_slot`  - fixa bug with setting values for `WindowsFxString` ([#18014](https://github.com/hashicorp/terraform-provider-azurerm/issues/18014))\n* `azurerm_linux_function_app` - correctly send `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ([#18035](https://github.com/hashicorp/terraform-provider-azurerm/issues/18035))\n* `azurerm_linux_function_app`  - fixcontent settings when `storage_uses_managed_identity` is set to `true` ([#18035](https://github.com/hashicorp/terraform-provider-azurerm/issues/18035))\n* `azurerm_linux_function_app_slot` - correctly send `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ([#18035](https://github.com/hashicorp/terraform-provider-azurerm/issues/18035))\n* `azurerm_linux_function_app_slot`  - fixcontent settings when `storage_uses_managed_identity` is set to `true` ([#18035](https://github.com/hashicorp/terraform-provider-azurerm/issues/18035))\n* `azurerm_windows_function_app` - correctly send `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ([#18035](https://github.com/hashicorp/terraform-provider-azurerm/issues/18035))\n* `azurerm_windows_function_app`  - fixcontent settings when `storage_uses_managed_identity` is set to `true` ([#18035](https://github.com/hashicorp/terraform-provider-azurerm/issues/18035))\n* `azurerm_windows_function_app_slot` - correctly send `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ([#18035](https://github.com/hashicorp/terraform-provider-azurerm/issues/18035))\n* `azurerm_windows_function_app_slot`  - fixcontent settings when `storage_uses_managed_identity` is set to `true` ([#18035](https://github.com/hashicorp/terraform-provider-azurerm/issues/18035))\n\n## 3.18.0 (August 11, 2022)\n\nFEATURES: \n\n* **New Resource**: `azurerm_monitor_data_collection_endpoint` ([#17684](https://github.com/hashicorp/terraform-provider-azurerm/issues/17684))\n\nENHANCEMENTS:\n\n* dependencies: updating `github.com/hashicorp/go-azure-sdk` to `v0.20220809.1122626` ([#17905](https://github.com/hashicorp/terraform-provider-azurerm/issues/17905))\n* storage: updating to use API Version `2021-09-01` ([#17523](https://github.com/hashicorp/terraform-provider-azurerm/issues/17523))\n* `azurerm_express_route_circuit_peering` - support for the `ipv4_enabled` and `gateway_manager_etag` properties ([#17338](https://github.com/hashicorp/terraform-provider-azurerm/issues/17338))\n* `azurerm_site_recovery_replicated_vm` - support for the `target_disk_encryption` block ([#15783](https://github.com/hashicorp/terraform-provider-azurerm/issues/15783))\n* `azurerm_subnet` - deprecate `enforce_private_link_endpoint_network_policies` property in favour of `private_endpoint_network_policies_enabled` ([#17464](https://github.com/hashicorp/terraform-provider-azurerm/issues/17464))\n* `azurerm_subnet` - deprecate `enforce_private_link_service_network_policies` property in favour of `private_link_service_network_policies_enabled` ([#17464](https://github.com/hashicorp/terraform-provider-azurerm/issues/17464))\n* `azurerm_servicebus_subscription` - support for the `client_scoped_subscription_enabled` property and the `client_scoped_subscription` block ([#17101](https://github.com/hashicorp/terraform-provider-azurerm/issues/17101))\n\nBUG FIXES:\n\n* `azurerm_backup_policy_vm` - now prevents crash when `frequency` is set to Hourly and, `hour_interval` and `hour_duration`are not set ([#17880](https://github.com/hashicorp/terraform-provider-azurerm/issues/17880))\n* Data Source: `azurerm_blueprint_definition`  - fix`version` property output ([#16299](https://github.com/hashicorp/terraform-provider-azurerm/issues/16299))\n\n## 3.17.0 (August 04, 2022)\n\nENHANCEMENTS:\n\n* domainservice: updating to use API Version `2021-05-01` ([#17737](https://github.com/hashicorp/terraform-provider-azurerm/issues/17737))\n* Data Source: `azurerm_proximity_placement_group` - refactoring to use `hashicorp/go-azure-sdk` ([#17776](https://github.com/hashicorp/terraform-provider-azurerm/issues/17776))\n* `azurerm_api_management` - update the `sku_name` property validation to accept newer Premium SKUs ([#17887](https://github.com/hashicorp/terraform-provider-azurerm/issues/17887))\n* `azurerm_firewall` - the property `sku_tier` is now updateable ([#17577](https://github.com/hashicorp/terraform-provider-azurerm/issues/17577))\n* `azurerm_linux_virtual_machine_scale_set` - the property `instances` is now Optional and defaults to `0` ([#17836](https://github.com/hashicorp/terraform-provider-azurerm/issues/17836))\n* `azurerm_log_analytics_cluster` - updated validation for the `size_gb` property ([#17780](https://github.com/hashicorp/terraform-provider-azurerm/issues/17780))\n* `azurerm_proximity_placement_group` - refactoring to use `hashicorp/go-azure-sdk` ([#17776](https://github.com/hashicorp/terraform-provider-azurerm/issues/17776))\n* `azurerm_shared_image` - improved validation for the `publisher`, `offer` and `sku` properties in the `identifier` block ([#17547](https://github.com/hashicorp/terraform-provider-azurerm/issues/17547))\n* `azurerm_subnet` - support for the service delegation `Microsoft.Orbital/orbitalGateway` ([#17854](https://github.com/hashicorp/terraform-provider-azurerm/issues/17854))\n* `azurerm_eventhub_namespace` - support for the `local_authentication_enabled`, `public_network_access_enabled`, and `minimum_tls_version` properties ([#17194](https://github.com/hashicorp/terraform-provider-azurerm/issues/17194))\n\nBUG FIXES:\n\n* Data Source: `azurerm_private_dns_zone` - returning the correct Resource ID when not specifying the `resource_group_name` ([#17729](https://github.com/hashicorp/terraform-provider-azurerm/issues/17729))\n\n## 3.16.0 (July 28, 2022)\n\nFEATURES: \n\n* **New Resource**: `azurerm_datadog_monitor` ([#16131](https://github.com/hashicorp/terraform-provider-azurerm/issues/16131))\n* **New Resource**: `azurerm_kusto_cluster_managed_private_endpoint` ([#17667](https://github.com/hashicorp/terraform-provider-azurerm/issues/17667))\n* **New Resource**: `azurerm_log_analytics_query_pack` ([#17685](https://github.com/hashicorp/terraform-provider-azurerm/issues/17685))\n* **New Resource**: `azurerm_logz_sub_account_tag_rule` ([#17557](https://github.com/hashicorp/terraform-provider-azurerm/issues/17557))\n* **New Resource**: `azurerm_signalr_shared_private_link_resource` ([#16187](https://github.com/hashicorp/terraform-provider-azurerm/issues/16187))\n\nENHANCEMENTS:\n\n* dependencies: updating to version `v0.20220725.1163004` of `github.com/hashicorp/go-azure-sdk` ([#17753](https://github.com/hashicorp/terraform-provider-azurerm/issues/17753))\n* automationaccount: updating to use `hashicorp/go-azure-sdk` ([#17347](https://github.com/hashicorp/terraform-provider-azurerm/issues/17347))\n* Data Source: `azurerm_linux_function_app` - support the `virtual_network_subnet_id` property for for vNet integration ([#17494](https://github.com/hashicorp/terraform-provider-azurerm/issues/17494))\n* Data Source: `azurerm_windows_function_app` - support the `virtual_network_subnet_id` property for for vNet integration ([#17572](https://github.com/hashicorp/terraform-provider-azurerm/issues/17572))\n* Data Source: `azurerm_windows_web_app` - support the `virtual_network_subnet_id` property for for vNet integration ([#17576](https://github.com/hashicorp/terraform-provider-azurerm/issues/17576))\n* `eventhub`: updating all data sources/resources onto single API Version `2021-11-01` ([#17719](https://github.com/hashicorp/terraform-provider-azurerm/issues/17719))\n* `azurerm_bot_service_azure_bot` - support for the `streaming_endpoint_enabled` property ([#17423](https://github.com/hashicorp/terraform-provider-azurerm/issues/17423))\n* `azurerm_cognitive_account` - support for the `custom_question_answering_search_service_key` property ([#17683](https://github.com/hashicorp/terraform-provider-azurerm/issues/17683))\n* `asurerm_iothub_dps_certificate` - support for the `is_verified` property ([#17106](https://github.com/hashicorp/terraform-provider-azurerm/issues/17106))\n* `azurerm_linux_web_app`  - the `virtual_network_subnet_id` property is no longer `ForceNew` ([#17584](https://github.com/hashicorp/terraform-provider-azurerm/issues/17584))\n* `azurerm_linux_web_app_slot` - the `virtual_network_subnet_id` property is no longer `ForceNew` ([#17584](https://github.com/hashicorp/terraform-provider-azurerm/issues/17584))\n* `azurerm_linux_function_app` support the `virtual_network_subnet_id` property for for vNet integration ([#17494](https://github.com/hashicorp/terraform-provider-azurerm/issues/17494))\n* `azurerm_linux_function_app_slot` support the `virtual_network_subnet_id` property for for vNet integration ([#17494](https://github.com/hashicorp/terraform-provider-azurerm/issues/17494))\n* `azurerm_stream_analytics_stream_input_eventhub` - support for the `authentication_mode` property ([#17739](https://github.com/hashicorp/terraform-provider-azurerm/issues/17739))\n* `azurerm_windows_function_app` support the `virtual_network_subnet_id` property for for vNet integration ([#17572](https://github.com/hashicorp/terraform-provider-azurerm/issues/17572))\n* `azurerm_windows_function_app_slot` support the `virtual_network_subnet_id` property for for vNet integration ([#17572](https://github.com/hashicorp/terraform-provider-azurerm/issues/17572))\n* `azurerm_windows_web_app` support the `virtual_network_subnet_id` property for for vNet integration ([#17576](https://github.com/hashicorp/terraform-provider-azurerm/issues/17576))\n* `azurerm_windows_web_app_slot` support the `virtual_network_subnet_id` property for for vNet integration ([#17576](https://github.com/hashicorp/terraform-provider-azurerm/issues/17576))\n\nBUG FIXES:\n\n* `azurerm_linux_function_app`  - fixcasing bug with the `linux_fx_string` property for Node apps ([#17789](https://github.com/hashicorp/terraform-provider-azurerm/issues/17789))\n* `azurerm_linux_function_app_slot`  - fixcasing bug with the `linux_fx_string` property for Node apps ([#17789](https://github.com/hashicorp/terraform-provider-azurerm/issues/17789))\n* `azurerm_resource_group_template_deployment` - fixing a bug where the same Resource Provider defined in different casings would cause the API Version to not be identified ([#17707](https://github.com/hashicorp/terraform-provider-azurerm/issues/17707))\n\n## 3.15.1 (July 25, 2022)\n\nBUG FIXES: \n\n* `data.azurerm_servicebus_queue`  - fixa regression around `namespace_id` ([#17755](https://github.com/hashicorp/terraform-provider-azurerm/issues/17755))\n* `azurerm_postgresql_aad_administrator`  - fixthe state migration ([#17732](https://github.com/hashicorp/terraform-provider-azurerm/issues/17732))\n* `azurerm_postgresql_server`  - fixa regression around `id` ([#17755](https://github.com/hashicorp/terraform-provider-azurerm/issues/17755))\n\n## 3.15.0 (July 21, 2022)\n\nFEATURES: \n\n* **New Data Source**: `azurerm_cdn_frontdoor_origin_group` ([#17089](https://github.com/hashicorp/terraform-provider-azurerm/issues/17089))\n* **New Data Source**: `azurerm_cdn_frontdoor_origin` ([#17089](https://github.com/hashicorp/terraform-provider-azurerm/issues/17089))\n* **New Resource**: `azurerm_cdn_frontdoor_origin_group` ([#17089](https://github.com/hashicorp/terraform-provider-azurerm/issues/17089))\n* **New Resource**: `azurerm_cdn_frontdoor_origin` ([#17089](https://github.com/hashicorp/terraform-provider-azurerm/issues/17089))\n* **New Resource**: `azurerm_application_insights_workbook` ([#17368](https://github.com/hashicorp/terraform-provider-azurerm/issues/17368))\n* **New Resource**: `azurerm_monitor_data_collection_rule` ([#17342](https://github.com/hashicorp/terraform-provider-azurerm/issues/17342))\n* **New Resource**: `azurerm_route_server` ([#16578](https://github.com/hashicorp/terraform-provider-azurerm/issues/16578))\n* **New Resource**: `azurerm_route_server_bgp_connection` ([#16578](https://github.com/hashicorp/terraform-provider-azurerm/issues/16578))\n* **New Resource**: `azurerm_web_pubsub_private_link_resource` ([#15550](https://github.com/hashicorp/terraform-provider-azurerm/issues/15550))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20220715.1071215` of `github.com/hashicorp/go-azure-sdk` ([#17645](https://github.com/hashicorp/terraform-provider-azurerm/issues/17645))\n* domainservice: to use `hashicorp/go-azure-sdk` ([#17595](https://github.com/hashicorp/terraform-provider-azurerm/issues/17595))\n* servicebus: refactoring to use `hashicorp/go-azure-sdk` ([#17628](https://github.com/hashicorp/terraform-provider-azurerm/issues/17628))\n* postgres: refactoring to use `hashicorp/go-azure-sdk` ([#17625](https://github.com/hashicorp/terraform-provider-azurerm/issues/17625))\n* `azurerm_kusto_cluster_resource` - support for the `allowed_fqdns`, `allowed_ip_ranges`, and `outbound_network_access_restricted` properties ([#17581](https://github.com/hashicorp/terraform-provider-azurerm/issues/17581))\n* `azurerm_storage_account` - supports for the `change_feed_retention_in_days` property ([#17130](https://github.com/hashicorp/terraform-provider-azurerm/issues/17130))\n\n## 3.14.0 (July 14, 2022)\n\nFEATURES:\n\n* **New Resource**: `azurerm_application_insights_workbook_template` ([#17433](https://github.com/hashicorp/terraform-provider-azurerm/issues/17433))\n* **New Resource**: `azurerm_gallery_application` ([#17394](https://github.com/hashicorp/terraform-provider-azurerm/issues/17394))\n* **New Resource**: `azurerm_gallery_application_version` ([#17394](https://github.com/hashicorp/terraform-provider-azurerm/issues/17394))\n \nENHANCEMENTS:\n\n* dependencies: updating to `v0.20220712.1111122` of `github.com/hashicorp/go-azure-sdk` ([#17606](https://github.com/hashicorp/terraform-provider-azurerm/issues/17606))\n* dependencies: updating to `v0.37.0` of `github.com/hashicorp/go-azure-helpers` ([#17588](https://github.com/hashicorp/terraform-provider-azurerm/issues/17588))\n* dependencies: updating to `v2.18.0` of `github.com/hashicorp/terraform-plugin-sdk` ([#17141](https://github.com/hashicorp/terraform-provider-azurerm/issues/17141))\n* appconfiguration: updating to use API Version `2022-05-01` ([#17467](https://github.com/hashicorp/terraform-provider-azurerm/issues/17467))\n* spring: updating to use API Version `2022-05-01-preview` ([#17467](https://github.com/hashicorp/terraform-provider-azurerm/issues/17467))\n* databricks: refactoring to use `hashicorp/go-azure-sdk` ([#17475](https://github.com/hashicorp/terraform-provider-azurerm/issues/17475))\n* lighthouse: refactoring to use `hashicorp/go-azure-sdk` ([#17590](https://github.com/hashicorp/terraform-provider-azurerm/issues/17590))\n* policyremediation: updated to use version `2021-10-01` ([#17298](https://github.com/hashicorp/terraform-provider-azurerm/issues/17298))\n* signalr: refactoring to use `hashicorp/go-azure-sdk` ([#17463](https://github.com/hashicorp/terraform-provider-azurerm/issues/17463))\n* storage: refactoring `objectreplicationpolicy` to use `hashicorp/go-azure-sdk` ([#17471](https://github.com/hashicorp/terraform-provider-azurerm/issues/17471))\n* Data Source: `azurerm_availability_set` - updating to use `hashicorp/go-azure-sdk` ([#17608](https://github.com/hashicorp/terraform-provider-azurerm/issues/17608))\n* Data Source: `azurerm_ssh_public_key` - refactoring to use `hashicorp/go-azure-sdk` ([#17609](https://github.com/hashicorp/terraform-provider-azurerm/issues/17609))\n* `azurerm_availability_set` - updating to use `hashicorp/go-azure-sdk` ([#17608](https://github.com/hashicorp/terraform-provider-azurerm/issues/17608))\n* `azurerm_container_group` - support for the `http_headers` property ([#17519](https://github.com/hashicorp/terraform-provider-azurerm/issues/17519))\n* `azurerm_dashboard` - refactoring to use `hashicorp/go-azure-sdk` ([#17598](https://github.com/hashicorp/terraform-provider-azurerm/issues/17598))\n* `azurerm_kusto_cluster` - support for the `public_ip_address` property ([#17520](https://github.com/hashicorp/terraform-provider-azurerm/issues/17520))\n* `azurerm_kusto_script` - support for the `script_content` property ([#17522](https://github.com/hashicorp/terraform-provider-azurerm/issues/17522))\n* `azurerm_kusto_iothub_data_connection` - support for the `database_routing_type` property ([#17526](https://github.com/hashicorp/terraform-provider-azurerm/issues/17526))\n* `azurerm_kusto_eventhub_data_connection` - support for the `database_routing_type` property ([#17525](https://github.com/hashicorp/terraform-provider-azurerm/issues/17525))\n* `azurerm_kusto_eventgrid_data_connection` - support for the `database_routing_type`, `eventgrid_resource_id`, and `managed_identity_resource_id` properties ([#17524](https://github.com/hashicorp/terraform-provider-azurerm/issues/17524))\n* `azurerm_kubernetes_cluster` - support for the `host_group_id` property ([#17496](https://github.com/hashicorp/terraform-provider-azurerm/issues/17496))\n* `azurerm_kubernetes_cluster_node_pool` - support for the `host_group_id` property ([#17496](https://github.com/hashicorp/terraform-provider-azurerm/issues/17496))\n* `azurerm_linux_virtual_machine_scale_set` - support for `capacity_reservation_group_id` property ([#17530](https://github.com/hashicorp/terraform-provider-azurerm/issues/17530))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `placement` property for os disks ([#17013](https://github.com/hashicorp/terraform-provider-azurerm/issues/17013))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support for the `placement` property for os disks ([#17013](https://github.com/hashicorp/terraform-provider-azurerm/issues/17013))\n* `azurerm_shared_image` - support for the `end_of_life_date` `disk_types_not_allowed`, `max_recommended_vcpu_count`, `max_recommended_vcpu_count`, `max_recommended_memory_in_gb`, `min_recommended_memory_in_gb` ([#17300](https://github.com/hashicorp/terraform-provider-azurerm/issues/17300))\n* `azurerm_signalr_service` - Add support for `live_trace` ([#17629](https://github.com/hashicorp/terraform-provider-azurerm/issues/17629))\n* `azurerm_ssh_public_key` - refactoring to use `hashicorp/go-azure-sdk` ([#17609](https://github.com/hashicorp/terraform-provider-azurerm/issues/17609))\n* `azurerm_stream_analytics_output_blob` - support for the `authentication_mode` property ([#16652](https://github.com/hashicorp/terraform-provider-azurerm/issues/16652))\n* `azurerm_windows_virtual_machine_scale_set` - support for `capacity_reservation_group_id` property ([#17530](https://github.com/hashicorp/terraform-provider-azurerm/issues/17530))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `placement` property for os disks ([#17013](https://github.com/hashicorp/terraform-provider-azurerm/issues/17013))\n \nBUG FIXES:\n\n* `azurerm_api_management` - correct set the API Management Cipher `TLS_RSA_WITH_3DES_EDE_CBC_SHA` ([#17554](https://github.com/hashicorp/terraform-provider-azurerm/issues/17554))\n* `azurerm_dev_test_lab_schedule` - deleting the schedule during deletion ([#17614](https://github.com/hashicorp/terraform-provider-azurerm/issues/17614))\n* `azurerm_linux_function_app` - set the `default_hostname` properly on read ([#17498](https://github.com/hashicorp/terraform-provider-azurerm/issues/17498))\n* `azurerm_linux_function_app_slot` - set the `default_hostname` properly on read ([#17498](https://github.com/hashicorp/terraform-provider-azurerm/issues/17498))\n* `azurerm_windows_function_app` - set the `default_hostname` properly on read ([#17498](https://github.com/hashicorp/terraform-provider-azurerm/issues/17498))\n* `azurerm_windows_function_app` - correctly create function apps when custom handlers are used ([#17498](https://github.com/hashicorp/terraform-provider-azurerm/issues/17498))\n* `azurerm_windows_function_app_slot` - set the `default_hostname` properly on read ([#17498](https://github.com/hashicorp/terraform-provider-azurerm/issues/17498))\n* `azurerm_windows_function_app_slot` - correctly create function apps when custom handlers are used ([#17498](https://github.com/hashicorp/terraform-provider-azurerm/issues/17498))\n\n## 3.13.0 (July 08, 2022)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_public_maintenance_configurations` ([#16810](https://github.com/hashicorp/terraform-provider-azurerm/issues/16810))\n* **New Resource**: `azurerm_fluid_relay_server` ([#17238](https://github.com/hashicorp/terraform-provider-azurerm/issues/17238))\n* **New Resource**: `azurerm_logz_sub_account` ([#16581](https://github.com/hashicorp/terraform-provider-azurerm/issues/16581))\n\nENHANCEMENTS:\n\n* azurestackhci: refactoring to use `hashicorp/go-azure-sdk` ([#17469](https://github.com/hashicorp/terraform-provider-azurerm/issues/17469))\n* containerinstance: refactoring to use `hashicorp/go-azure-sdk` ([#17499](https://github.com/hashicorp/terraform-provider-azurerm/issues/17499))\n* eventhub: refactoring to use `hashicorp/go-azure-sdk` ([#17445](https://github.com/hashicorp/terraform-provider-azurerm/issues/17445))\n* hardwaresecuritymodules: refactoring to use `hashicorp/go-azure-sdk` ([#17470](https://github.com/hashicorp/terraform-provider-azurerm/issues/17470))\n* netapp: refactoring to use `hashicorp/go-azure-sdk` ([#17465](https://github.com/hashicorp/terraform-provider-azurerm/issues/17465))\n* privatedns: refactoring to use `hashicorp/go-azure-sdk` ([#17436](https://github.com/hashicorp/terraform-provider-azurerm/issues/17436))\n* Data Source: `azurerm_container_registry` - add support for the `data_endpoint_enabled` property ([#17466](https://github.com/hashicorp/terraform-provider-azurerm/issues/17466))\n* `azurerm_hdinsight_kafka_cluster` -support for the `network` block ([#17259](https://github.com/hashicorp/terraform-provider-azurerm/issues/17259))\n* `azurerm_key_vault_certificate` - now correctly recovers certificates on import ([#17415](https://github.com/hashicorp/terraform-provider-azurerm/issues/17415))\n* `azurerm_kubernetes_clusterl`- support for the `capacity_reservation_group_id` property ([#17395](https://github.com/hashicorp/terraform-provider-azurerm/issues/17395))\n* `azurerm_kubernetes_node_pool`- support for the `capacity_reservation_group_id` property ([#17395](https://github.com/hashicorp/terraform-provider-azurerm/issues/17395))\n* `azurerm_linux_virtual_machine` - support for the `capacity_reservation_group_id` property ([#17236](https://github.com/hashicorp/terraform-provider-azurerm/issues/17236))\n* `azurerm_spring_cloud_deployment` - support for the `addon_json` property ([#16984](https://github.com/hashicorp/terraform-provider-azurerm/issues/16984))\n* `azurerm_synapse_integration_runtime_azure` - the `location` property now supports `Auto Resolve` ([#17111](https://github.com/hashicorp/terraform-provider-azurerm/issues/17111))\n* `azurerm_windows_virtual_machine` - support for the `capacity_reservation_group_id` property ([#17236](https://github.com/hashicorp/terraform-provider-azurerm/issues/17236))\n\nBUG FIXES:\n\n* `azurerm_application_gateway` -  the `request_routing_rule.x.priority` property is now optional ([#17380](https://github.com/hashicorp/terraform-provider-azurerm/issues/17380))\n\n## 3.12.0 (June 30, 2022)\n\nFEATURES:\n\n* **New Resource**: `azurerm_active_directory_domain_service_trust` ([#17045](https://github.com/hashicorp/terraform-provider-azurerm/issues/17045))\n* **New Resource**: `azurerm_data_protection_resource_guard` ([#17325](https://github.com/hashicorp/terraform-provider-azurerm/issues/17325))\n* **New Resource**: `azurerm_spring_cloud_api_portal_custom_domain` ([#16966](https://github.com/hashicorp/terraform-provider-azurerm/issues/16966))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20220628.1190740` of `github.com/hashicorp/go-azure-sdk` ([#17399](https://github.com/hashicorp/terraform-provider-azurerm/issues/17399))\n* appservice: replacing usages of `ioutil` with `io` ([#17392](https://github.com/hashicorp/terraform-provider-azurerm/issues/17392))\n* containerservice: updated to use version `2022-03-02-preview` ([#17084](https://github.com/hashicorp/terraform-provider-azurerm/issues/17084))\n* elastic: refactoring to use `hashicorp/go-azure-sdk` ([#17431](https://github.com/hashicorp/terraform-provider-azurerm/issues/17431))\n* loadtest: refactoring to use `hashicorp/go-azure-sdk` ([#17432](https://github.com/hashicorp/terraform-provider-azurerm/issues/17432))\n* maps: refactoring to use `hashicorp/go-azure-sdk` ([#17434](https://github.com/hashicorp/terraform-provider-azurerm/issues/17434))\n* mixedreality: switching to use `hashicorp/go-azure-sdk` ([#17417](https://github.com/hashicorp/terraform-provider-azurerm/issues/17417))\n* msi: refactoring to use `hashicorp/go-azure-sdk` ([#17430](https://github.com/hashicorp/terraform-provider-azurerm/issues/17430))\n* powerbi: refactoring to use `hashicorp/go-azure-sdk` ([#17435](https://github.com/hashicorp/terraform-provider-azurerm/issues/17435))\n* purview: refactoring to use `hashicorp/go-azure-sdk` ([#17419](https://github.com/hashicorp/terraform-provider-azurerm/issues/17419))\n* redisenterprise: refactoring to use `hashicorp/go-azure-sdk` ([#17387](https://github.com/hashicorp/terraform-provider-azurerm/issues/17387))\n* relay: refactoring to use `hashicorp/go-azure-sdk` ([#17385](https://github.com/hashicorp/terraform-provider-azurerm/issues/17385))\n* search: refactoring to use `hashicorp/go-azure-sdk` ([#17386](https://github.com/hashicorp/terraform-provider-azurerm/issues/17386))\n* servicefabricmanaged: refactoring to use `hashicorp/go-azure-sdk` ([#17384](https://github.com/hashicorp/terraform-provider-azurerm/issues/17384))\n* trafficmanager: refactoring to use `hashicorp/go-azure-sdk` ([#17383](https://github.com/hashicorp/terraform-provider-azurerm/issues/17383))\n* videoanalyzer: refactoring to use `hashicorp/go-azure-sdk` ([#17382](https://github.com/hashicorp/terraform-provider-azurerm/issues/17382))\n* vmware: refactoring to use `hashicorp/go-azure-sdk` ([#17381](https://github.com/hashicorp/terraform-provider-azurerm/issues/17381))\n* Data Source: `azurerm_key_vault_key` - exporting the `resource_id` and `resource_versionless_id` attributes ([#17424](https://github.com/hashicorp/terraform-provider-azurerm/issues/17424))\n* Data Source: `azurerm_key_vault_secret` - exporting the `resource_id` and `resource_versionless_id` attributes ([#17424](https://github.com/hashicorp/terraform-provider-azurerm/issues/17424))\n* Data Source: `azurerm_spatial_anchors_account` - exposing the `tags` attribute ([#17417](https://github.com/hashicorp/terraform-provider-azurerm/issues/17417))\n* `azurerm_bot_service_azure_bot` - support new bot type with the `microsoft_app_msi_id`, `microsoft_app_tenant_id`,  and `microsoft_app_type` properties ([#17077](https://github.com/hashicorp/terraform-provider-azurerm/issues/17077))\n* `azurerm_bot_channels_registration` - support for the `streaming_endpoint_enabled` property ([#17369](https://github.com/hashicorp/terraform-provider-azurerm/issues/17369))\n* `azurerm_data_factory` - support for the `purview_id` property ([#17001](https://github.com/hashicorp/terraform-provider-azurerm/issues/17001))\n* `azurerm_digital_twins_instance` - support for the `identity` block ([#17076](https://github.com/hashicorp/terraform-provider-azurerm/issues/17076))\n* `azurerm_key_vault_key` - exporting the `resource_id` and `resource_versionless_id` attributes ([#17424](https://github.com/hashicorp/terraform-provider-azurerm/issues/17424))\n* `azurerm_key_vault_secret` - exporting the `resource_id` and `resource_versionless_id` attributes ([#17424](https://github.com/hashicorp/terraform-provider-azurerm/issues/17424))\n* `azurerm_kubernetes_cluster` - support for version aliases ([#17084](https://github.com/hashicorp/terraform-provider-azurerm/issues/17084))\n* `azurerm_linux_web_app` - support for the `virtual_network_subnet_id` property ([#17354](https://github.com/hashicorp/terraform-provider-azurerm/issues/17354))\n* `azurerm_linux_web_app_slot` - support for the `virtual_network_subnet_id` property ([#17354](https://github.com/hashicorp/terraform-provider-azurerm/issues/17354))\n* `azurerm_private_link_service` - support for the `fqdns` property ([#17366](https://github.com/hashicorp/terraform-provider-azurerm/issues/17366))\n* `azurerm_shared_image_version` - support `Premium_LRS` for the `storage_account_type` property ([#17390](https://github.com/hashicorp/terraform-provider-azurerm/issues/17390))\n* `azurerm_shared_image_version` - support for the `disk_encryption_set_id`, `end_of_life_date`, and `replication_mode` properties ([#17295](https://github.com/hashicorp/terraform-provider-azurerm/issues/17295))\n* `azurerm_static_site_custom_domain` - the `validation_type` propety is now optional ([#15849](https://github.com/hashicorp/terraform-provider-azurerm/issues/15849))\n* `azurerm_vpn_site` - support for the `o365_policy` block ([#16820](https://github.com/hashicorp/terraform-provider-azurerm/issues/16820))\n\nBUG FIXES:\n\n* Data Source: `azurerm_key_vault` - caching the Key Vault URI when the Key Vault is retrieved ([#17407](https://github.com/hashicorp/terraform-provider-azurerm/issues/17407))\n* `azurerm_application_gateway` - prevent a crash when the `waf_configuration` block is removed ([#17241](https://github.com/hashicorp/terraform-provider-azurerm/issues/17241))\n* `azurerm_data_factory_dataset_snowflake` - ensuring `schema` is sent to the API to fix a UI bug in the Azure Data Factory Portal ([#17346](https://github.com/hashicorp/terraform-provider-azurerm/issues/17346))\n* `azurerm_data_factory_linked_service_azure_file_storage` - corredctly assign `user_id`([#17398](https://github.com/hashicorp/terraform-provider-azurerm/issues/17398))\n* `azurerm_key_vault` - ensuring that `soft_delete_enabled` is explicitly set when `purge_protection_enabled` is set ([#16368](https://github.com/hashicorp/terraform-provider-azurerm/issues/16368))\n* `azurerm_linux_function_app` - correctly validate the `app_setting_names` and `connection_string_names` properties within the `sticky_settings` block ([#17209](https://github.com/hashicorp/terraform-provider-azurerm/issues/17209))\n* `azurerm_linux_web_app` - correctly configure `auto_heal` and `slow_request` ([#17296](https://github.com/hashicorp/terraform-provider-azurerm/issues/17296))\n* `azurerm_linux_web_app` - correctly validate the `app_setting_names` and `connection_string_names` properties within the `sticky_settings` block ([#17209](https://github.com/hashicorp/terraform-provider-azurerm/issues/17209))\n* `azurerm_management_group_policy_assignment` - the `name` property can no longer contain `/` ([#16484](https://github.com/hashicorp/terraform-provider-azurerm/issues/16484))\n* `azurerm_policy_assignment` - the `name` property can no longer contain `/` ([#16484](https://github.com/hashicorp/terraform-provider-azurerm/issues/16484))\n* `azurerm_resource_group_policy_assignment` - the `name` property can no longer contain `/` ([#16484](https://github.com/hashicorp/terraform-provider-azurerm/issues/16484))\n* `azurerm_subscription_policy_assignment` - the `name` property can no longer contain `/` ([#16484](https://github.com/hashicorp/terraform-provider-azurerm/issues/16484))\n* `azurerm_windows_function_app` - correctly validate the `app_setting_names` and `connection_string_names` properties within the `sticky_settings` block ([#17209](https://github.com/hashicorp/terraform-provider-azurerm/issues/17209))\n* `azurerm_windows_web_app` - correctly configure `auto_heal` and `slow_request` ([#17296](https://github.com/hashicorp/terraform-provider-azurerm/issues/17296))\n* `azurerm_windows_web_app` - correctly validate the `app_setting_names` and `connection_string_names` properties within the `sticky_settings` block ([#17209](https://github.com/hashicorp/terraform-provider-azurerm/issues/17209))\n\n## 3.11.0 (June 23, 2022)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_management_group_template_deployment` ([#14524](https://github.com/hashicorp/terraform-provider-azurerm/issues/14524))\n* **New Data Source**: `azurerm_policy_assignment` ([#16527](https://github.com/hashicorp/terraform-provider-azurerm/issues/16527))\n* **New Data Source**: `azurerm_resource_group_template_deployment` ([#14524](https://github.com/hashicorp/terraform-provider-azurerm/issues/14524))\n* **New Data Source**: `azurerm_subscription_template_deployment` ([#14524](https://github.com/hashicorp/terraform-provider-azurerm/issues/14524))\n* **New Data Source**: `azurerm_tenant_template_deployment` ([#14524](https://github.com/hashicorp/terraform-provider-azurerm/issues/14524))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.20220623.1064317` of `github.com/hashicorp/go-azure-sdk` ([#17348](https://github.com/hashicorp/terraform-provider-azurerm/issues/17348))\n* batch: updating to use API Version `2022-01-01` ([#17219](https://github.com/hashicorp/terraform-provider-azurerm/issues/17219))\n* confidentialledger: updating to use API Version `2022-05-13` ([#17146](https://github.com/hashicorp/terraform-provider-azurerm/issues/17146))\n* desktopvirtualization: refactoring to use `hashicorp/go-azure-sdk` ([#17340](https://github.com/hashicorp/terraform-provider-azurerm/issues/17340))\n* Data Source: `azurerm_managed_disk` - exporting the `disk_access_id` attribute ([#17270](https://github.com/hashicorp/terraform-provider-azurerm/issues/17270))\n* Data Source: `azurerm_managed_disk` - exporting the `network_access_policy` attribute ([#17270](https://github.com/hashicorp/terraform-provider-azurerm/issues/17270))\n* Data Source: `azurerm_storage_account` - add support for the `identity` property ([#17215](https://github.com/hashicorp/terraform-provider-azurerm/issues/17215))\n\nBUG FIXES:\n\n* Data Source: `azurerm_mysql_flexible_server` - generate the correct terraform resource ID ([#17301](https://github.com/hashicorp/terraform-provider-azurerm/issues/17301))\n* `azurerm_shared_image` - the `privacy_statement_uri`, `publisher`, `offer`, and `sku` fields are now ForceNew ([#17289](https://github.com/hashicorp/terraform-provider-azurerm/issues/17289))\n* `azurerm_shared_image_*` - correctly validate the `gallery_name` property ([#17201](https://github.com/hashicorp/terraform-provider-azurerm/issues/17201))\n* `azurerm_time_series_insights_gen2_environment` - correctly order `id_properties` ([#17234](https://github.com/hashicorp/terraform-provider-azurerm/issues/17234))\n\n## 3.10.0 (June 09, 2022)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_cdn_frontdoor_rule_set` ([#17094](https://github.com/hashicorp/terraform-provider-azurerm/issues/17094))\n* **New Resource**: `azurerm_capacity_reservation_group` ([#16464](https://github.com/hashicorp/terraform-provider-azurerm/issues/16464))\n* **New Resource**: `azurerm_capacity_reservation` ([#16464](https://github.com/hashicorp/terraform-provider-azurerm/issues/16464))\n* **New Resource**: `azurerm_cdn_frontdoor_rule_set` ([#17094](https://github.com/hashicorp/terraform-provider-azurerm/issues/17094))\n\nENHANCEMENTS:\n\n* `azurerm_cosmosdb_cassandra_cluster` - support for the `authentication_method`, `client_certificate`, `external_gossip_certificate`, `external_seed_node`, `identity`, `repair_enabled` and `version` properties ([#16799](https://github.com/hashicorp/terraform-provider-azurerm/issues/16799))\n* `azurerm_key_vault_managed_hardware_security_module` - support for purging when soft deleted ([#17148](https://github.com/hashicorp/terraform-provider-azurerm/issues/17148))\n* `azurerm_hpc_cache` - support for `identity` block and the `key_vault_key_id` and `automatically_rotate_key_to_latest_enabled` properties ([#16972](https://github.com/hashicorp/terraform-provider-azurerm/issues/16972))\n\nBUG FIXES:\n\n* `azurerm_api_management` - default hostname proxy configuration is no longer ignored ([#16524](https://github.com/hashicorp/terraform-provider-azurerm/issues/16524))\n* `azurerm_application_gateway` - add default value for `backend_http_settings.0.request_timeout` ([#17162](https://github.com/hashicorp/terraform-provider-azurerm/issues/17162))\n* `azurerm_applicaton_gateway` -`priority` is now required ([#16849](https://github.com/hashicorp/terraform-provider-azurerm/issues/16849))\n* `azurerm_container_group` - Double the delete check timeout for nic ([#17115](https://github.com/hashicorp/terraform-provider-azurerm/issues/17115))\n* `azurerm_windows_function_app_x` - `custom_domain_verification_id` is now written to state file (([#17183](https://github.com/hashicorp/terraform-provider-azurerm/issues/17183))\n\n## 3.9.0 (June 02, 2022)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_app_configuration_keys` ([#17053](https://github.com/hashicorp/terraform-provider-azurerm/issues/17053))\n* **New Data Source**: `azurerm_cdn_frontdoor_endpoint` ([#17078](https://github.com/hashicorp/terraform-provider-azurerm/issues/17078))\n* **New Data Source**: `azurerm_cdn_frontdoor_profile` ([#17061](https://github.com/hashicorp/terraform-provider-azurerm/issues/17061))\n* **New Resource**: `azurerm_cdn_frontdoor_endpoint` ([#17078](https://github.com/hashicorp/terraform-provider-azurerm/issues/17078))\n* **New Resource**: `azurerm_cdn_frontdoor_profile` ([#17061](https://github.com/hashicorp/terraform-provider-azurerm/issues/17061))\n* **New Resource**: `azurerm_sentinel_data_connector_office_atp` ([#16825](https://github.com/hashicorp/terraform-provider-azurerm/issues/16825))\n* **New Resource**: `azurerm_vpn_server_configuration_policy_group` ([#16911](https://github.com/hashicorp/terraform-provider-azurerm/issues/16911))\n\nENHANCEMENTS:\n\n* dependencies: upgrading to `v0.33.0` of `github.com/hashicorp/go-azure-hepers` ([#17074](https://github.com/hashicorp/terraform-provider-azurerm/issues/17074))\n* dependencies: upgrading to `v1.6.1` of `github.com/hashicorp/go-getter` ([#17074](https://github.com/hashicorp/terraform-provider-azurerm/issues/17074))\n* dependencies: upgrade `netapp` to `2021-10-01` ([#17043](https://github.com/hashicorp/terraform-provider-azurerm/issues/17043))\n* `azurerm_batch_job` - refactor to split `create` and `update` ([#17138](https://github.com/hashicorp/terraform-provider-azurerm/issues/17138))\n* `azurerm_data_factory_trigger_schedule` - support for the `pipeline` block ([#16922](https://github.com/hashicorp/terraform-provider-azurerm/issues/16922))\n* `azurerm_backup_policy_vm` - support for `V2` policies viu the `policy_type` property, supporting Enhanced Policies of the hourly type ([#16940](https://github.com/hashicorp/terraform-provider-azurerm/issues/16940))\n* `azurerm_log_analytics_workspace` - allow property updates when a workspace is linked to a cluster ([#17069](https://github.com/hashicorp/terraform-provider-azurerm/issues/17069))\n* `azurerm_netapp_volume` - support for the `network_features` property ([#17043](https://github.com/hashicorp/terraform-provider-azurerm/issues/17043))\n* `azurerm_provider_registration` - refactor to split `create` and `update` ([#17138](https://github.com/hashicorp/terraform-provider-azurerm/issues/17138))\n* `azurerm_web_pubsub_hub` - the `event_handler` block is now optional ([#17037](https://github.com/hashicorp/terraform-provider-azurerm/issues/17037))\n* `azurerm_redis_cache` - support the `identity` block ([#16990](https://github.com/hashicorp/terraform-provider-azurerm/issues/16990))\n* `azurerm_service_fabric_managed_cluster` - refactor to split `create` and `update` ([#17138](https://github.com/hashicorp/terraform-provider-azurerm/issues/17138))\n* `azurerm_synapse_role_assignment` - the `role_name` property now supports `Synapse Monitoring Operator` ([#17024](https://github.com/hashicorp/terraform-provider-azurerm/issues/17024))\n* `azurerm_vpn_gateway_nat_rule` - support for the `port_range` property ([#16724](https://github.com/hashicorp/terraform-provider-azurerm/issues/16724))\n\nBUG FIXES:\n\n* `azurerm_container_registry_task` - sending `authentication` within the `source_trigger` block when updating ([#17002](https://github.com/hashicorp/terraform-provider-azurerm/issues/17002))\n* `azurerm_eventhub_authorization_rule` - extend regex char limit for `name` ([#17057](https://github.com/hashicorp/terraform-provider-azurerm/issues/17057))\n* `azurerm_kubernetes_cluster` - prevent a potential crash during import of a cluster that doesn't have an API Server Access Profile ([#17005](https://github.com/hashicorp/terraform-provider-azurerm/issues/17005))\n\n## 3.8.0 (May 26, 2022)\n\nFEATURES:\n\n* **New Resource**: `azurerm_mssql_server_dns_alias` ([#16861](https://github.com/hashicorp/terraform-provider-azurerm/issues/16861))\n* **New Resource**: `azurerm_spring_cloud_gateway_route_config` ([#16721](https://github.com/hashicorp/terraform-provider-azurerm/issues/16721))\n* **New Resource**: `azurerm_spring_cloud_api_portal` ([#16719](https://github.com/hashicorp/terraform-provider-azurerm/issues/16719))\n* **New Resource**: `azurerm_spring_cloud_build_deployment` ([#16730](https://github.com/hashicorp/terraform-provider-azurerm/issues/16730))\n\nENHANCEMENTS:\n\n* dependencies: upgrade `botservice` to `2021-05-01-preview` ([#16665](https://github.com/hashicorp/terraform-provider-azurerm/issues/16665))\n* dependencies: upgrade `keyvault` to `2021-10-01` ([#16955](https://github.com/hashicorp/terraform-provider-azurerm/issues/16955))\n* `azurerm_active_directory_domain_service` - supports for the `domain_configuration_type` property ([#16920](https://github.com/hashicorp/terraform-provider-azurerm/issues/16920))\n* `azurerm_backup_protected_vm` - allow the attached vm to be disassociated from the backup ([#16939](https://github.com/hashicorp/terraform-provider-azurerm/issues/16939))\n* `azurerm_backup_protected_vm` - the backup is now removed from state when it is soft deleted ([#16939](https://github.com/hashicorp/terraform-provider-azurerm/issues/16939))\n* `azurerm_portal_dashboard` - now supports the `display_name` argument ([#16406](https://github.com/hashicorp/terraform-provider-azurerm/issues/16406))\n* `azurerm_data_factory_trigger_schedule` - support for the `time_zone` property ([#16918](https://github.com/hashicorp/terraform-provider-azurerm/issues/16918))\n* `azurerm_linux_virtual_machine` - add support for Confidential VMs ([#16905](https://github.com/hashicorp/terraform-provider-azurerm/issues/16905))\n* `azurerm_linux_virtual_machine_scale_set` - add support for Confidential VMs ([#16916](https://github.com/hashicorp/terraform-provider-azurerm/issues/16916))\n* `azurerm_linux_web_app` - add support for `zip_deploy_file` property ([#16779](https://github.com/hashicorp/terraform-provider-azurerm/issues/16779))\n* `azurerm_linux_web_app_slot` - add support for `zip_deploy_file` property ([#16779](https://github.com/hashicorp/terraform-provider-azurerm/issues/16779))\n* `azurerm_managed_disk` - add support for Confidential VM ([#16908](https://github.com/hashicorp/terraform-provider-azurerm/issues/16908))\n* `azurerm_spring_cloud_service` - suppport the `build_agent_pool_size` property ([#16841](https://github.com/hashicorp/terraform-provider-azurerm/issues/16841))\n* `azurerm_spring_cloud_service`- support the `zone_redundant` property ([#16872](https://github.com/hashicorp/terraform-provider-azurerm/issues/16872))\n* `azurerm_synapse_spark_pool` - the `spark_version` property now supports `3.2` ([#16906](https://github.com/hashicorp/terraform-provider-azurerm/issues/16906))\n* `azurerm_virtual_network_gateway_connection` - support for the `egress_nat_rule_ids` and `ingress_nat_rule_ids` properties ([#16862](https://github.com/hashicorp/terraform-provider-azurerm/issues/16862))\n* `azurerm_vpn_gateway` - support for the `bgp_route_translation_for_nat_enabled` property ([#16817](https://github.com/hashicorp/terraform-provider-azurerm/issues/16817))\n* `azurerm_vpn_gateway_connection` - support for the `custom_bgp_address` block ([#16960](https://github.com/hashicorp/terraform-provider-azurerm/issues/16960))\n* `azurerm_windows_virtual_machine` - add support for Confidential VMs ([#16905](https://github.com/hashicorp/terraform-provider-azurerm/issues/16905))\n* `azurerm_windows_virtual_machine_scale_set` - add support for Confidential VM ([#16916](https://github.com/hashicorp/terraform-provider-azurerm/issues/16916))\n* `azurerm_windows_web_app` - add support for `zip_deploy_file` property ([#16779](https://github.com/hashicorp/terraform-provider-azurerm/issues/16779))\n* `azurerm_windows_web_app_slot` - add support for `zip_deploy_file` property ([#16779](https://github.com/hashicorp/terraform-provider-azurerm/issues/16779))\n\nBUG FIXES:\n\n* `azurerm_mysql_server` -  fix an error updating `public_network_access_enabled` with replicas ([#16506](https://github.com/hashicorp/terraform-provider-azurerm/issues/16506))\n* `azurerm_linux_function_app_slot` - correctly check for name availability during creation ([#16410](https://github.com/hashicorp/terraform-provider-azurerm/issues/16410))\n* `azurerm_windows_function_app_slot` - correctly check for name availability during creation ([#16410](https://github.com/hashicorp/terraform-provider-azurerm/issues/16410))\n* `azurerm_windows_virtual_machine` - changing the `timezone` property now creates a new resources ([#16866](https://github.com/hashicorp/terraform-provider-azurerm/issues/16866))\n\n## 3.7.0 (May 19, 2022)\n\nFEATURES:\n\n* **New Authentication Method:** OIDC ([#16555](https://github.com/hashicorp/terraform-provider-azurerm/issues/16555))\n* **New Data Source**: `azurerm_elastic_cloud_elasticsearch` ([#14821](https://github.com/hashicorp/terraform-provider-azurerm/issues/14821))\n* **New Resource**: `azurerm_elastic_cloud_elasticsearch` ([#14821](https://github.com/hashicorp/terraform-provider-azurerm/issues/14821))\n* **New Resource**: `azurerm_healthcare_fhir_service` ([#15913](https://github.com/hashicorp/terraform-provider-azurerm/issues/15913))\n* **New Resource**: `azurerm_virtual_network_gateway_nat_rule` ([#15720](https://github.com/hashicorp/terraform-provider-azurerm/issues/15720))\n\nENHANCEMENTS:\n\n* dependencies: upgrade `redis` to `2020-12-01` ([#16532](https://github.com/hashicorp/terraform-provider-azurerm/issues/16532))\n* `azurerm_container_registry` - support changing replications ([#16678](https://github.com/hashicorp/terraform-provider-azurerm/issues/16678))\n* `azurerm_disk_encryption_set` - the `encryption_type` property now supports `ConfidentialVmEncryptedWithCustomerKey` ([#16870](https://github.com/hashicorp/terraform-provider-azurerm/issues/16870))\n* `azurerm_linux_function_app` - add support for PowerShell `7.2`  ([#16718](https://github.com/hashicorp/terraform-provider-azurerm/issues/16718))\n* `azurerm_signalr_service` - support the `Premium_P1` SKU ([#16875](https://github.com/hashicorp/terraform-provider-azurerm/issues/16875))\n* `azurerm_spring_cloud_app` - support for the `identity` block ([#16280](https://github.com/hashicorp/terraform-provider-azurerm/issues/16280))\n* `azurerm_spring_cloud_app` - support for the `addon_json` property ([#16722](https://github.com/hashicorp/terraform-provider-azurerm/issues/16722))\n* `azurerm_windows_function_app` - support for PowerShell `7.2`  ([#16718](https://github.com/hashicorp/terraform-provider-azurerm/issues/16718))\n* `azurerm_mssql_managed_instance` - support for the `maintenance_configuration_name` property ([#16832](https://github.com/hashicorp/terraform-provider-azurerm/issues/16832))\n\nBUG FIXES:\n\n* Data Source: `azurerm_databricks_workspace` - prevent a panic when the SKU field is missing ([#16819](https://github.com/hashicorp/terraform-provider-azurerm/issues/16819))\n* `azurerm_application_insights_web_test` - working around a breaking change in the API where creation would fail ([#16845](https://github.com/hashicorp/terraform-provider-azurerm/issues/16845))\n* `azurerm_express_route_gateway` - handle gateway connections not found error ([#16804](https://github.com/hashicorp/terraform-provider-azurerm/issues/16804))\n* `azurerm_shared_image` - changing the `eula` property now creates a new resource ([#16868](https://github.com/hashicorp/terraform-provider-azurerm/issues/16868))\n\nDEPRECATIONS:\n\n* `azurerm_video_analyzer` - Video Analyzer (Preview) is now Deprecated and will be Retired on 2022-11-30 - as such this resource is deprecated and will be removed in v4.0 of the AzureRM Provider ([#16847](https://github.com/hashicorp/terraform-provider-azurerm/issues/16847))\n* `azurerm_video_analyzer_edge_module` - Video Analyzer (Preview) is now Deprecated and will be Retired on 2022-11-30 - as such this resource is deprecated and will be removed in v4.0 of the AzureRM Provider ([#16847](https://github.com/hashicorp/terraform-provider-azurerm/issues/16847))\n\n## 3.6.0 (May 12, 2022)\n\nFEATURES:\n\n* **New Resource**: `azurerm_confidential_ledger` ([#15420](https://github.com/hashicorp/terraform-provider-azurerm/issues/15420))\n* **New Resource**: `azurerm_managed_disk_sas_token` ([#15558](https://github.com/hashicorp/terraform-provider-azurerm/issues/15558))\n* **New Resource**: `azurerm_spring_cloud_gateway` ([#16175](https://github.com/hashicorp/terraform-provider-azurerm/issues/16175))\n* **New Resource**: `azurerm_spring_cloud_build_pack_binding` ([#16673](https://github.com/hashicorp/terraform-provider-azurerm/issues/16673))\n* **New Resource**: `azurerm_spring_cloud_gateway_custom_domain` ([#16720](https://github.com/hashicorp/terraform-provider-azurerm/issues/16720))\n* **New Resource**: `azurerm_stream_analytics_output_powerbi` ([#16439](https://github.com/hashicorp/terraform-provider-azurerm/issues/16439))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v64.0.0` of `github.com/Azure/azure-sdk-for-go` ([#16631](https://github.com/hashicorp/terraform-provider-azurerm/issues/16631))\n* dependencies: upgrade `network` to `2021-08-01` ([#16631](https://github.com/hashicorp/terraform-provider-azurerm/issues/16631))\n* `azurerm_container_group` - support for the `key_vault_key_id` property (Customer Managed Key encryption) ([#16709](https://github.com/hashicorp/terraform-provider-azurerm/issues/16709))\n* `azurerm_cosmosdb_account` - support mongo version `4.2` ([#16738](https://github.com/hashicorp/terraform-provider-azurerm/issues/16738))\n* `azurerm_cosmosdb_cassandra_cluster` - support for the `tags` property ([#16743](https://github.com/hashicorp/terraform-provider-azurerm/issues/16743))\n* `azurerm_kubernetes_cluster_node_pool` - the property `node_labels` can now be updated ([#16360](https://github.com/hashicorp/terraform-provider-azurerm/issues/16360))\n* `azurerm_kubernetes_cluster` - the property `default_node_pool.node_labels` can now be updated ([#16360](https://github.com/hashicorp/terraform-provider-azurerm/issues/16360))\n* `azurerm_kubernetes_cluster` - allow value `none` for `network_profile.network_plugin` ([#16250](https://github.com/hashicorp/terraform-provider-azurerm/issues/16250))\n* `azurerm_kusto_script` - lock kusto cluster so multiple scripts can be applied ([#16690](https://github.com/hashicorp/terraform-provider-azurerm/issues/16690))\n* `azurerm_storage_share` - support the `access_tier` attribute ([#16462](https://github.com/hashicorp/terraform-provider-azurerm/issues/16462))\n* `azurerm_snapshot` - support for the `trusted_launch_enabled` propertyu ([#16679](https://github.com/hashicorp/terraform-provider-azurerm/issues/16679))\n* `azurerm_stream_analytics_function_javascript_uda` - support for the `input.configuration_parameter` property ([#16575](https://github.com/hashicorp/terraform-provider-azurerm/issues/16575))\n* `azurerm_stream_analytics_function_javascript_udf` - support for the `input.configuration_parameter` property ([#16579](https://github.com/hashicorp/terraform-provider-azurerm/issues/16579))\n* `azurerm_linux_virtual_machine` - correctly support for the update the `diff_disk_settings.placement` property ([#14847](https://github.com/hashicorp/terraform-provider-azurerm/issues/14847))\n* `azurerm_virtual_network_gateway_connection` - support for the `custom_bgp_addresses` property ([#16631](https://github.com/hashicorp/terraform-provider-azurerm/issues/16631))\n* `azurerm_windows_virtual_machine` - correctly support for the update the `diff_disk_settings.placement` property ([#14847](https://github.com/hashicorp/terraform-provider-azurerm/issues/14847))\n\nBUG FIXES:\n\n* `azurerm_app_configuration_feature` - allow successful creation of resource without specifying any optional filters ([#16459](https://github.com/hashicorp/terraform-provider-azurerm/issues/16459))\n* `azurerm_mssql_managed_instance_failover_group` - correctly import resource and sent primary isntance id ([#16705](https://github.com/hashicorp/terraform-provider-azurerm/issues/16705))\n\n## 3.5.0 (May 05, 2022)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_healthcare_dicom_service` ([#15887](https://github.com/hashicorp/terraform-provider-azurerm/issues/15887))\n* **New Resource**: `azurerm_healthcare_dicom_service` ([#15887](https://github.com/hashicorp/terraform-provider-azurerm/issues/15887))\n* **New Resource**: `azurerm_mssql_managed_instance_vulnerability_assessment` ([#16639](https://github.com/hashicorp/terraform-provider-azurerm/issues/16639))\n* **New resource**: `azurerm_sentinel_data_connector_aws_s3` ([#16440](https://github.com/hashicorp/terraform-provider-azurerm/issues/16440))\n* **New Resource**: `azurerm_spring_cloud_builder` ([#16036](https://github.com/hashicorp/terraform-provider-azurerm/issues/16036))\n* **New Resource**: `azurerm_spring_cloud_configuration_service` ([#16087](https://github.com/hashicorp/terraform-provider-azurerm/issues/16087))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v63.4.0` of `github.com/Azure/azure-sdk-for-go` ([#16533](https://github.com/hashicorp/terraform-provider-azurerm/issues/16533))\n* dependencies: updating to `v1.5.11` of `github.com/hashicorp/go-getter` ([#16659](https://github.com/hashicorp/terraform-provider-azurerm/issues/16659))\n* dependencies: upgrade `recoveryservices` to `2021-12-01` ([#16001](https://github.com/hashicorp/terraform-provider-azurerm/issues/16001))\n* `azurerm_linux_virtual_machine_scale_set` - improve validation on the `termination_notification.timeout` property ([#16594](https://github.com/hashicorp/terraform-provider-azurerm/issues/16594))\n* `azurerm_orchestrated_virtual_machine_scale_set` - improve validation on the `termination_notification.timeout` property ([#16594](https://github.com/hashicorp/terraform-provider-azurerm/issues/16594))\n* `azurerm_servicebus_namespace` - the `sku` property can now be updated to `Basic` or `Standard` without recreating the resource ([#16523](https://github.com/hashicorp/terraform-provider-azurerm/issues/16523))\n* `azurerm_storage_account` - support for the `cross_tenant_replication_enabled` property ([#16351](https://github.com/hashicorp/terraform-provider-azurerm/issues/16351))\n* `azurerm_windows_virtual_machine_scale_set` - improve validation on the `termination_notification.timeout` property ([#16594](https://github.com/hashicorp/terraform-provider-azurerm/issues/16594))\n* `azurerm_virtual_network_gateway_connection` - the `traffic_selector_policy` property can now be specified ([#15938](https://github.com/hashicorp/terraform-provider-azurerm/issues/15938))\n* `azurerm_stream_analytics_output_servicebus_queue` - support for the `property_columns` and `system_property_columns` properties ([#16572](https://github.com/hashicorp/terraform-provider-azurerm/issues/16572))\n\nBUG FIXES:\n\n* Data Source: `azurerm_servicebus_queue_authorization_rule` - prevent a possible crash by setting `queue_name` correctly ([#16561](https://github.com/hashicorp/terraform-provider-azurerm/issues/16561))\n* Data Source: `azurerm_service_plan:` - correctly populate the `kind` and `os_type` attributes ([#16431](https://github.com/hashicorp/terraform-provider-azurerm/issues/16431))\n* `azurerm_data_factory_dataset_delimited_text` - set defaults properly for `column_delimiter`, `quote_character`, `escape_character`, `first_row_as_header` and `null_value` ([#16543](https://github.com/hashicorp/terraform-provider-azurerm/issues/16543))\n* `azurerm_linux_function_app` - correctly deduplicate user `app_settings` ([#15740](https://github.com/hashicorp/terraform-provider-azurerm/issues/15740))\n* `azurerm_linux_function_app` -  fix `app_settings.WEBSITE_RUN_FROM_PACKAGE` handling from external sources ([#16641](https://github.com/hashicorp/terraform-provider-azurerm/issues/16641))\n* `azurerm_linux_function_app_slot` - correctly deduplicate user `app_settings` ([#15740](https://github.com/hashicorp/terraform-provider-azurerm/issues/15740))\n* `azurerm_linux_function_app_slot`  - fix`app_settings.WEBSITE_RUN_FROM_PACKAGE` handling from external sources ([#16641](https://github.com/hashicorp/terraform-provider-azurerm/issues/16641))\n* `azurerm_machine_learning_compute_cluster` - resource now is deleted instead of just detached ([#16640](https://github.com/hashicorp/terraform-provider-azurerm/issues/16640))\n* `azurerm_windows_function_app` - correctly deduplicate user `app_settings` ([#15740](https://github.com/hashicorp/terraform-provider-azurerm/issues/15740))\n* `azurerm_windows_function_app_slot` - correctly deduplicate user `app_settings` ([#15740](https://github.com/hashicorp/terraform-provider-azurerm/issues/15740))\n\n## 3.4.0 (April 28, 2022)\n\nFEATURES:\n\n* **New Resource**: `azurerm_stream_analytics_output_cosmosdb` ([#16441](https://github.com/hashicorp/terraform-provider-azurerm/issues/16441))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v63.1.0` of `github.com/Azure/azure-sdk-for-go` ([#16283](https://github.com/hashicorp/terraform-provider-azurerm/issues/16283))\n* dependencies: updating to `v0.11.26` of `github.com/Azure/go-autorest` ([#16458](https://github.com/hashicorp/terraform-provider-azurerm/issues/16458))\n* dependencies: upgrading to `v0.30.0` of `github.com/hashicorp/go-azure-helpers` ([#16504](https://github.com/hashicorp/terraform-provider-azurerm/issues/16504))\n* dependencies: upgrade `sqlvirtualmachine` to `2021-11-01-preview` ([#15835](https://github.com/hashicorp/terraform-provider-azurerm/issues/15835))\n* Data Source: `azurerm_linux_function_app` - add support for `sticky_settings` ([#16546](https://github.com/hashicorp/terraform-provider-azurerm/issues/16546))\n* Data Source: `azurerm_linux_web_app` - add support for `sticky_settings` ([#16546](https://github.com/hashicorp/terraform-provider-azurerm/issues/16546))\n* Data Source: `azurerm_windows_function_app` - add support for `sticky_settings` ([#16546](https://github.com/hashicorp/terraform-provider-azurerm/issues/16546))\n* Data Source: `azurerm_windows_web_app` - add support for `sticky_settings` ([#16546](https://github.com/hashicorp/terraform-provider-azurerm/issues/16546))\n* `azurerm_kubernetes_cluster` - support for the `run_command_enabled` property ([#15029](https://github.com/hashicorp/terraform-provider-azurerm/issues/15029))\n* `azurerm_linux_function_app` - add support for `sticky_settings` ([#16546](https://github.com/hashicorp/terraform-provider-azurerm/issues/16546))\n* `azurerm_linux_web_app` - add support for `sticky_settings` ([#16546](https://github.com/hashicorp/terraform-provider-azurerm/issues/16546))\n* `azurerm_monitor_aad_diagnostic_setting` - remove validation on `log.category` to allow for new log categories that are available in Azure ([#16534](https://github.com/hashicorp/terraform-provider-azurerm/issues/16534))\n* `azurerm_mssql_database` - Support for `short_term_retention_policy.0.backup_interval_in_hours` ([#16528](https://github.com/hashicorp/terraform-provider-azurerm/issues/16528))\n* `azurerm_postgresql_server` - add validation for `public_network_access_enabled` ([#16516](https://github.com/hashicorp/terraform-provider-azurerm/issues/16516))\n* `azurerm_stream_analytics_job` - support for the `type` property ([#16548](https://github.com/hashicorp/terraform-provider-azurerm/issues/16548))\n* `azurerm_windows_function_app` - add support for `sticky_settings` ([#16546](https://github.com/hashicorp/terraform-provider-azurerm/issues/16546))\n* `azurerm_windows_web_app` - add support for `sticky_settings` ([#16546](https://github.com/hashicorp/terraform-provider-azurerm/issues/16546))\n* `azurerm_linux_virtual_machine_scale_set` -  the `terminate_notification` property is renamed to `termination_notification` ([#15570](https://github.com/hashicorp/terraform-provider-azurerm/issues/15570))\n* `azurerm_windows_virtual_machine_scale_set` -  the `terminate_notification` property is renamed to `termination_notification` ([#15570](https://github.com/hashicorp/terraform-provider-azurerm/issues/15570))\n\nBUG FIXES:\n\n* `azurerm_datafactory_dataset_x`  - fix crash around `azure_blob_storage_location.0.dynamic_container_enabled` ([#16514](https://github.com/hashicorp/terraform-provider-azurerm/issues/16514))\n* `azurerm_kubernetes_cluster` - allow updates to a cluster running a deprecated version of kubernetes ([#16551](https://github.com/hashicorp/terraform-provider-azurerm/issues/16551))\n* `azurerm_resource_policy_remediation` - no longer tries to cancel a completed remediation task during deletion ([#16478](https://github.com/hashicorp/terraform-provider-azurerm/issues/16478))\n\n## 3.3.0 (April 21, 2022)\n\nFEATURES:\n\n* **New Resource**: `azurerm_spring_cloud_container_deployment` ([#16181](https://github.com/hashicorp/terraform-provider-azurerm/issues/16181))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v0.19.0` of `github.com/tombuildsstuff/giovanni` ([#16460](https://github.com/hashicorp/terraform-provider-azurerm/issues/16460))\n* Data Source: `azurerm_kubernetes_cluster` - exporting the `microsoft_defender` block ([#16218](https://github.com/hashicorp/terraform-provider-azurerm/issues/16218))\n* Data Source: `azurerm_storage_account` - exporting the `nfsv3_enabled` attribute ([#16404](https://github.com/hashicorp/terraform-provider-azurerm/issues/16404))\n* `azurerm_data_factory_linked_service_azure_blob_storage` - support for the `storage_kind` property ([#16403](https://github.com/hashicorp/terraform-provider-azurerm/issues/16403))\n* `azurerm_data_factory_linked_service_azure_blob_storage` - support for the `service_principal_linked_key_vault_key` property ([#16414](https://github.com/hashicorp/terraform-provider-azurerm/issues/16414))\n* `data_factory_linked_service_sql_server_resource` - support for the `user_name` property ([#16118](https://github.com/hashicorp/terraform-provider-azurerm/issues/16118))\n* `azurerm_kubernetes_cluster` - support for the `microsoft_defender` block ([#16218](https://github.com/hashicorp/terraform-provider-azurerm/issues/16218))\n* `azurerm_redis_enterprise_cluster` - support for the `linked_database_id` and `linked_database_group_nickname` properties ([#16045](https://github.com/hashicorp/terraform-provider-azurerm/issues/16045))\n* `azurerm_spring_cloud_service` - support for the `service_registry_enabled` property ([#16277](https://github.com/hashicorp/terraform-provider-azurerm/issues/16277))\n* `azurerm_stream_analytics_output_mssql` - support for the `system_property_columns` property ([#16425](https://github.com/hashicorp/terraform-provider-azurerm/issues/16425))\n* `azurerm_stream_analytics_output_servicebus_topic` - support for the `max_batch_count` and `max_writer_count` properties ([#16409](https://github.com/hashicorp/terraform-provider-azurerm/issues/16409))\n* `azurerm_stream_analytics_output_table` - support for the `columns_to_remove` property ([#16389](https://github.com/hashicorp/terraform-provider-azurerm/issues/16389))\n* `azurerm_virtual_hub_connection` - the `internet_security_enabled` property can now be updated ([#16430](https://github.com/hashicorp/terraform-provider-azurerm/issues/16430))\n\nBUG FIXES:\n\n* `azurerm_cdn_endpoint` - the `origin.http` and `origin.https_ports` properties now have thed efault values of `80` and `443` respectivly ([#16143](https://github.com/hashicorp/terraform-provider-azurerm/issues/16143))\n* `azurerm_key_vault_certificate` - now authenticates and manages resources correctly within the US Gov Cloud ([#16455](https://github.com/hashicorp/terraform-provider-azurerm/issues/16455))\n* `azurerm_key_vault_key` - now authenticates and manages resources correctly within the US Gov Cloud ([#16455](https://github.com/hashicorp/terraform-provider-azurerm/issues/16455))\n* `azurerm_key_vault_managed_storage_account` - now authenticates and manages resources correctly within the US Gov Cloud ([#16455](https://github.com/hashicorp/terraform-provider-azurerm/issues/16455))\n* `azurerm_key_vault_secret` - now authenticates and manages resources correctly within the US Gov Cloud ([#16455](https://github.com/hashicorp/terraform-provider-azurerm/issues/16455))\n* `azurerm_kubernetes_cluster` - the `role_based_access_control_enabled` property can now be disabled ([#16488](https://github.com/hashicorp/terraform-provider-azurerm/issues/16488))\n* `azurerm_linux_function_app` - the `ip_address` property is now correctly set into state when the `service_tag` property is specified ([#16426](https://github.com/hashicorp/terraform-provider-azurerm/issues/16426))\n* `azurerm_linux_function_app`  - fixa bug in updates to `app_settings` where settings could be lost ([#16442](https://github.com/hashicorp/terraform-provider-azurerm/issues/16442))\n* `azurerm_linux_function_app_slot` -  this `ip_address` property is now correctly set into state when the `service_tag` property is specified ([#16426](https://github.com/hashicorp/terraform-provider-azurerm/issues/16426))\n* `azurerm_linux_web_app` -  the `ip_address` property is correctly set into state when the `service_tag` property is specified ([#16426](https://github.com/hashicorp/terraform-provider-azurerm/issues/16426))\n* `azurerm_linux_web_app`  - fixa potential crash when an empty `app_stack` block is used ([#16446](https://github.com/hashicorp/terraform-provider-azurerm/issues/16446))\n* `azurerm_linux_web_app_slot` -  the `ip_address` property is now correctly set into state when the `service_tag` property is specified ([#16426](https://github.com/hashicorp/terraform-provider-azurerm/issues/16426))\n* `azurerm_linux_web_app_slot`  - fixa potential crash when an empty `app_stack` block is used ([#16446](https://github.com/hashicorp/terraform-provider-azurerm/issues/16446))\n* `azurerm_sentinel_alert_rule_fusion` - no longer sends the `etag` property during updates as it is longer required ([#16428](https://github.com/hashicorp/terraform-provider-azurerm/issues/16428))\n* `azurerm_sentinel_alert_rule_machine_learning_behavior_analytics` - no longer sends the `etag` property during updates as it is longer required ([#16428](https://github.com/hashicorp/terraform-provider-azurerm/issues/16428))\n* `azurerm_sentinel_alert_rule_ms_security_incident` - no longer sends the `etag` property during updates as it is longer required ([#16428](https://github.com/hashicorp/terraform-provider-azurerm/issues/16428))\n* `azurerm_sentinel_alert_rule_scheduled` - no longer sends the `etag` property during updates as it is longer required ([#16428](https://github.com/hashicorp/terraform-provider-azurerm/issues/16428))\n* `azurerm_sentinel_data_connector_aws_cloud_trail` - no longer sends the `etag` property during updates as it is longer required ([#16428](https://github.com/hashicorp/terraform-provider-azurerm/issues/16428))\n* `azurerm_sentinel_data_connector_microsoft_cloud_app_security` - no longer sends the `etag` property during updates as it is longer required ([#16428](https://github.com/hashicorp/terraform-provider-azurerm/issues/16428))\n* `azurerm_sentinel_data_connector_office_365` - no longer sends the `etag` property during updates as it is longer required ([#16428](https://github.com/hashicorp/terraform-provider-azurerm/issues/16428))\n* `azurerm_storage_account` - now updates `identity` before `customer_managed_key` enabling adding a new identity with access to the CMK ([#16419](https://github.com/hashicorp/terraform-provider-azurerm/issues/16419))\n* `azurerm_subnet` - the `address_prefixes` property is now (explicitly) required ([#16402](https://github.com/hashicorp/terraform-provider-azurerm/issues/16402))\n* `azurerm_windows_function_app` - the `ip_address` property is now correctly set into state when the `service_tag` property is specified ([#16426](https://github.com/hashicorp/terraform-provider-azurerm/issues/16426))\n* `azurerm_windows_function_app`  - fixa bug in updates to `app_settings` where settings could be lost ([#16442](https://github.com/hashicorp/terraform-provider-azurerm/issues/16442))\n* `azurerm_windows_function_app_slot` - the `ip_address` property is now correctly set into state when the `service_tag` property is specified ([#16426](https://github.com/hashicorp/terraform-provider-azurerm/issues/16426))\n* `azurerm_windows_web_app` - the `ip_address` property is now correctly set into state when the `service_tag` property is specified ([#16426](https://github.com/hashicorp/terraform-provider-azurerm/issues/16426))\n* `azurerm_windows_web_app` - prevent a potential crash when an empty `app_stack` block is used ([#16446](https://github.com/hashicorp/terraform-provider-azurerm/issues/16446))\n* `azurerm_windows_web_app_slot` - the `ip_address` property is now correctly set into state when the `service_tag` property is specified ([#16426](https://github.com/hashicorp/terraform-provider-azurerm/issues/16426))\n* `azurerm_windows_web_app_slot` - prevent a potential crash when an empty `app_stack` block is used ([#16446](https://github.com/hashicorp/terraform-provider-azurerm/issues/16446))\n\n## 3.2.0 (April 14, 2022)\n\nFEATURES:\n\n* **New Datasource**: `azurerm_kusto_database` ([#16180](https://github.com/hashicorp/terraform-provider-azurerm/issues/16180))\n* **New Resource**: `azurerm_container_connected_registry` ([#15731](https://github.com/hashicorp/terraform-provider-azurerm/issues/15731))\n* **New Resource**: `azurerm_managment_group_policy_exemption` ([#16293](https://github.com/hashicorp/terraform-provider-azurerm/issues/16293))\n* **New Resource**: `azurerm_resource_group_policy_exemption` ([#16293](https://github.com/hashicorp/terraform-provider-azurerm/issues/16293))\n* **New Resource**: `azurerm_resource_policy_exemption` ([#16293](https://github.com/hashicorp/terraform-provider-azurerm/issues/16293))\n* **New Resource**: `azurerm_stream_analytics_job_schedule` ([#16349](https://github.com/hashicorp/terraform-provider-azurerm/issues/16349))\n* **New Resource**: `azurerm_subscription_policy_exemption` ([#16293](https://github.com/hashicorp/terraform-provider-azurerm/issues/16293))\n\nENHANCEMENTS:\n\n* Data Source: `azurerm_stream_analytics_job` - support for the `last_output_time`, `start_mode`, and `start_time` properties ([#16349](https://github.com/hashicorp/terraform-provider-azurerm/issues/16349))\n* `azurerm_container_group` - support for the `init_container` block ([#16204](https://github.com/hashicorp/terraform-provider-azurerm/issues/16204))\n* `azurerm_machine_learning_workspace` - renamed the `public_network_access_enabled` property to `public_access_behind_virtual_network_enabled` to better reflect what this property does ([#16288](https://github.com/hashicorp/terraform-provider-azurerm/issues/16288))\n* `azurerm_media_streaming_endpoint` support Standard Streaming Endpoints ([#16304](https://github.com/hashicorp/terraform-provider-azurerm/issues/16304))\n* `azurerm_cdn_endpoint` - the `url_path_condition` property now allows the `RegEx` and `Wildcard` values ([#16385](https://github.com/hashicorp/terraform-provider-azurerm/issues/16385))\n\nBUG FIXES:\n\n* Data Source: `azurerm_log_analytics_linked_storage_account` - correctly set the `data_source_type` property ([#16313](https://github.com/hashicorp/terraform-provider-azurerm/issues/16313))\n* `azurerm_lb_outbound_rule` - allow `0` for the `allocated_outbound_ports` property ([#16369](https://github.com/hashicorp/terraform-provider-azurerm/issues/16369))\n* `azurerm_mysql_flexible_server` - `backup_retention_days` can now be set any value from `1`-`35` ([#16312](https://github.com/hashicorp/terraform-provider-azurerm/issues/16312))\n* `azurerm_sentinel_watchlist` - support for the required property `item_search_key` ([#15861](https://github.com/hashicorp/terraform-provider-azurerm/issues/15861))\n* `azurerm_vpn_server_configuration` - the `server_root_certificate` property is now optional ([#16366](https://github.com/hashicorp/terraform-provider-azurerm/issues/16366))\n* `azurerm_storage_data_lake_gen2_path` - support `$superuser` as an option for `owner` and `group` ([#16370](https://github.com/hashicorp/terraform-provider-azurerm/issues/16370))\n* `azurerm_eventhub_namespace` - can now be updated when customer managed keys are being used ([#16371](https://github.com/hashicorp/terraform-provider-azurerm/issues/16371))\n* `azurerm_postgresql_flexible_server` - `high_availability` blocks can now be added and removed ([#16328](https://github.com/hashicorp/terraform-provider-azurerm/issues/16328))\n\n## 3.1.0 (April 07, 2022)\n\nFEATURES:\n\n* **New Resource**: `azurerm_container_registry_agent_pool` ([#16258](https://github.com/hashicorp/terraform-provider-azurerm/issues/16258))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v63.0.0` of `github.com/Azure/azure-sdk-for-go` ([#16147](https://github.com/hashicorp/terraform-provider-azurerm/issues/16147))\n* dependencies: updating `digitaltwins` to use API Version `2020-12-01` ([#16044](https://github.com/hashicorp/terraform-provider-azurerm/issues/16044))\n* dependencies: updating `streamanalytics` to use API Version `2020-03-01` ([#16270](https://github.com/hashicorp/terraform-provider-azurerm/issues/16270))\n* provider: upgrading to Go `1.18` ([#16247](https://github.com/hashicorp/terraform-provider-azurerm/issues/16247))\n* Data Source: `azurerm_kubernetes_cluster` - support for the `oidc_issuer_enabled` and `oidc_issuer_url` properties [[#16130](https://github.com/hashicorp/terraform-provider-azurerm/issues/16130)] \n* Data Source: `azurerm_service_plan` - add support for `zone_balancing_enabled` ([#16156](https://github.com/hashicorp/terraform-provider-azurerm/issues/16156))\n* `azurerm_application_gateway` - add `KNOWN-CVES` to accepted values for the `rule_group_name` property ([#16080](https://github.com/hashicorp/terraform-provider-azurerm/issues/16080))\n* `azurerm_automation_account` - the `dsc_primary_access_key` and `dsc_secondary_access_key` properties are now marked as sensitive ([#16161](https://github.com/hashicorp/terraform-provider-azurerm/issues/16161))\n* `azurerm_cognitive_account` - support for the `custom_question_answering_search_service_id` property ([#15804](https://github.com/hashicorp/terraform-provider-azurerm/issues/15804))\n* `azurerm_consumption_budget_management_group` - support for `SubscriptionID` and `SubscriptionName` options in the `dimension` block ([#16074](https://github.com/hashicorp/terraform-provider-azurerm/issues/16074))\n* `azurerm_cosmosdb_gremlin_graph` - the property `indexing_mode` is now case-sensitive ([#16152](https://github.com/hashicorp/terraform-provider-azurerm/issues/16152))\n* `azurerm_cosmosdb_sql_container` - the property `indexing_mode` is now case-sensitive ([#16152](https://github.com/hashicorp/terraform-provider-azurerm/issues/16152))\n* `azurerm_dedicated_host` - support for the the `DSv3-Type4` and `ESv3-Type4` SKUs ([#16253](https://github.com/hashicorp/terraform-provider-azurerm/issues/16253))\n* `azurerm_kubernetes_cluster` - support for the `oidc_issuer_enabled` and `oidc_issuer_url` properties [[#16130](https://github.com/hashicorp/terraform-provider-azurerm/issues/16130)] \n* `azurerm_kubernetes_cluster` - the `network_profile` block now supports the `ip_versions` property ([#16088](https://github.com/hashicorp/terraform-provider-azurerm/issues/16088))\n* `azurerm_mssql_database` - support for the `ledger_enabled` property ([#16214](https://github.com/hashicorp/terraform-provider-azurerm/issues/16214))\n* `azurerm_service_plan` - support for the `zone_balancing_enabled` property ([#16156](https://github.com/hashicorp/terraform-provider-azurerm/issues/16156))\n* `azurerm_servicebus_namespace` - support for the `customer_managed_key` block ([#15601](https://github.com/hashicorp/terraform-provider-azurerm/issues/15601))\n* `azurerm_web_application_firewall_policy` - add `KNOWN-CVES` to accepted values for `rule_group_name` ([#16080](https://github.com/hashicorp/terraform-provider-azurerm/issues/16080))\n* `azurerm_servicebus_namespace` - add support for the `local_auth_enabled` property ([#16268](https://github.com/hashicorp/terraform-provider-azurerm/issues/16268))\n\nBUG FIXES:\n\n* `azurerm_api_management_api_operation_tag` - now retrieves tags from the correct API ([#16006](https://github.com/hashicorp/terraform-provider-azurerm/issues/16006))\n* `azurerm_api_management_api_operation` - prevent a potential panic when parsing `representation` ([#14848](https://github.com/hashicorp/terraform-provider-azurerm/issues/14848))\n* `azurerm_application_gateway` - a `frontend_ip_configuration` blocks can now be updated ([#16132](https://github.com/hashicorp/terraform-provider-azurerm/issues/16132))\n* `azurerm_application_insights` - remove the disable logic for the created Action Groups ([#16170](https://github.com/hashicorp/terraform-provider-azurerm/issues/16170))\n* `azurerm_cosmosdb_sql_container` - disabling the `analytical_storage_ttl` property now forces a new resoruce to be created ([#16229](https://github.com/hashicorp/terraform-provider-azurerm/issues/16229))\n* `azurerm_linux_function_app` - only one of `application_insights_key` or `application_insights_connection_string` needs to be optionally specified ([#16134](https://github.com/hashicorp/terraform-provider-azurerm/issues/16134))\n* `azurerm_linux_function_app_slot` - only one of `application_insights_key` or `application_insights_connection_string` needs to be optionally specified ([#16134](https://github.com/hashicorp/terraform-provider-azurerm/issues/16134))\n* `azurerm_windows_function_app`  - fixthe import check for Service Plan OS type ([#16164](https://github.com/hashicorp/terraform-provider-azurerm/issues/16164))\n* `azurerm_linux_web_app_slot `  - fix`container_registry_managed_identity_client_id` property validation ([#16149](https://github.com/hashicorp/terraform-provider-azurerm/issues/16149))\n* `azurerm_windows_web_app` - add support for `dotnetcore` in site metadata property `current_stack` ([#16129](https://github.com/hashicorp/terraform-provider-azurerm/issues/16129))\n* `azurerm_windows_web_app`  - fixdocker `windowsFXVersion` when `docker_container_registry` is specified ([#16192](https://github.com/hashicorp/terraform-provider-azurerm/issues/16192))\n* `azurerm_windows_web_app_slot` - add support for `dotnetcore` in site metadata property `current_stack` ([#16129](https://github.com/hashicorp/terraform-provider-azurerm/issues/16129))\n* `azurerm_windows_web_app_slot`  - fixdocker `windowsFXVersion` when `docker_container_registry` is specified ([#16192](https://github.com/hashicorp/terraform-provider-azurerm/issues/16192))\n* `azurerm_storage_data_lake_gen2_filesystem` - add support for `$superuser` in `group` and `owner` properties ([#16215](https://github.com/hashicorp/terraform-provider-azurerm/issues/16215))\n\n## 3.0.2 (March 26, 2022)\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_account` - prevent a panic when the API returns an empty list of read or write locations ([#16031](https://github.com/hashicorp/terraform-provider-azurerm/issues/16031))\n* `azurerm_cdn_endpoint` - prevent a panic when there is an empty `country_codes` property ([#16066](https://github.com/hashicorp/terraform-provider-azurerm/issues/16066))\n* `azurerm_key_vault`  - fixthe `authorizer was not an auth.CachedAuthorizer ` error ([#16078](https://github.com/hashicorp/terraform-provider-azurerm/issues/16078))\n* `azurerm_linux_function_app` - correctly update storage settings when using MSI ([#16046](https://github.com/hashicorp/terraform-provider-azurerm/issues/16046))\n* `azurerm_managed_disk` - changing the `zone` property now correctly creates a new resource ([#16070](https://github.com/hashicorp/terraform-provider-azurerm/issues/16070))\n* `azurerm_resource_group` - now during deletion if there are still resources found in the group it will wait a little bit and check again to handle eventually consistancy bugs ([#16073](https://github.com/hashicorp/terraform-provider-azurerm/issues/16073))\n* `azurerm_windows_function_app` - correctly update the storage settings when using MSI authentication ([#16046](https://github.com/hashicorp/terraform-provider-azurerm/issues/16046))\n\n## 3.0.1 (March 24, 2022)\n\nBUG FIXES:\n\n* provider: the `prevent_deletion_if_contains_resources` feature flag within the `resource_group` block now defaults to `true` ([#16021](https://github.com/hashicorp/terraform-provider-azurerm/issues/16021))\n\n## 3.0.0 (March 24, 2022)\n\nNOTES:\n\n* **Major Version**: Version 3.0 of the Azure Provider is a major version - some behaviours have changed and some deprecated fields/resources have been removed - refer to [the 3.0 upgrade guide for more information](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/3.0-upgrade-guide).\n* When upgrading to v3.0 of the AzureRM Provider, we recommend upgrading to the latest version of Terraform Core ([which can be found here](https://www.terraform.io/downloads)) - the next major release of the AzureRM Provider (v4.0) will require Terraform 1.0 or later.\n\nFEATURES:\n\n* **New Data Source**: `azurerm_healthcare_workspace` ([#15759](https://github.com/hashicorp/terraform-provider-azurerm/issues/15759))\n* **New Data Source**: `azurerm_key_vault_encrypted_value` ([#15873](https://github.com/hashicorp/terraform-provider-azurerm/issues/15873))\n* **New Data Source**: `azurerm_managed_api` ([#15797](https://github.com/hashicorp/terraform-provider-azurerm/issues/15797))\n* **New Resource**: `azurerm_api_connection` ([#15797](https://github.com/hashicorp/terraform-provider-azurerm/issues/15797))\n* **New Resource**: `azurerm_healthcare_workspace` ([#15759](https://github.com/hashicorp/terraform-provider-azurerm/issues/15759))\n* **New Resource**: `azurerm_stream_analytics_function_javascript_uda` ([#15831](https://github.com/hashicorp/terraform-provider-azurerm/issues/15831))\n* **New Resource**: `azurerm_security_center_server_vulnerability_assessment_virtual_machine` ([#15747](https://github.com/hashicorp/terraform-provider-azurerm/issues/15747))\n\nENHANCEMENTS:\n\n* dependencies: updating to `v62.3.0` of `github.com/Azure/azure-sdk-for-go` ([#15927](https://github.com/hashicorp/terraform-provider-azurerm/issues/15927))\n* dependencies: updating to `v0.26.0` of `github.com/hashicorp/go-azure-helpers` ([#15889](https://github.com/hashicorp/terraform-provider-azurerm/issues/15889))\n* dependencies: updating `appplatform` to API Version `2022-01-01-preview` ([#15597](https://github.com/hashicorp/terraform-provider-azurerm/issues/15597))\n* provider: MSAL (and Microsoft Graph) is now used for authentication instead of ADAL (and Azure Active Directory Graph) ([#12443](https://github.com/hashicorp/terraform-provider-azurerm/issues/12443))\n* provider: all (non-deprecated) resources now validate the Resource ID during import ([#15989](https://github.com/hashicorp/terraform-provider-azurerm/issues/15989))\n* provider: added a new feature flag within the `api_management` block for `recover_soft_deleted`, for configuring whether a soft-deleted `azurerm_api_management` should be recovered during creation ([#15871](https://github.com/hashicorp/terraform-provider-azurerm/issues/15871))\n* provider: added a new feature flag within the `key_vault` block for `recover_soft_deleted_certificates`, for configuring whether a soft-deleted `azurerm_key_vault_certificate` should be recovered during creation ([#10273](https://github.com/hashicorp/terraform-provider-azurerm/issues/10273))\n* provider: added a new feature flag within the `key_vault` block for `purge_soft_deleted_certificates_on_destroy`, for configuring whether a deleted `azurerm_key_vault_certificate` should be purged during deletion ([#10273](https://github.com/hashicorp/terraform-provider-azurerm/issues/10273))\n* provider: added a new feature flag within the `key_vault` block for `recover_soft_deleted_keys`, for configuring whether a soft-deleted `azurerm_key_vault_key` should be recovered during creation ([#10273](https://github.com/hashicorp/terraform-provider-azurerm/issues/10273))\n* provider: added a new feature flag within the `key_vault` block for `purge_soft_deleted_keys_on_destroy`, for configuring whether a deleted `azurerm_key_vault_key` should be purged during deletion ([#10273](https://github.com/hashicorp/terraform-provider-azurerm/issues/10273))\n* provider: added a new feature flag within the `key_vault` block for `recover_soft_deleted_secrets`, for configuring whether a soft-deleted `azurerm_key_vault_secret` should be recovered during creation ([#10273](https://github.com/hashicorp/terraform-provider-azurerm/issues/10273))\n* provider: added a new feature flag within the `key_vault` block for `purge_soft_deleted_secrets_on_destroy`, for configuring whether a deleted `azurerm_key_vault_secret` should be purged during deletion ([#10273](https://github.com/hashicorp/terraform-provider-azurerm/issues/10273))\n* provider: added a new feature flag within the `resource_group` block for `prevent_deletion_if_contains_resources`, for configuring whether Terraform should prevent the deletion of a Resource Group which still contains items ([#13777](https://github.com/hashicorp/terraform-provider-azurerm/issues/13777))\n* provider: the feature flag `permanently_delete_on_destroy` within the `log_analytics_workspace` block now defaults to `true` ([#15948](https://github.com/hashicorp/terraform-provider-azurerm/issues/15948))\n* Resources supporting Availability Zones: Zones are now treated consistently across the Provider and the field within Terraform is renamed to either `zone` (for a single Zone) or `zones` (where multiple can be defined) - the complete list of resources can be found in the 3.0 Upgrade Guide ([#14588](https://github.com/hashicorp/terraform-provider-azurerm/issues/14588))\n* Resources supporting Managed Identity: Identity blocks are now treated consistently across the Provider - the complete list of resources can be found in the 3.0 Upgrade Guide ([#15187](https://github.com/hashicorp/terraform-provider-azurerm/issues/15187))\n* provider: removing the `network` and `relaxed_locking` feature flags, since this is now enabled by default ([#15719](https://github.com/hashicorp/terraform-provider-azurerm/issues/15719))\n* Data Source: `azurerm_linux_function_app` - support for the `storage_key_vault_secret_id` property ([#15793](https://github.com/hashicorp/terraform-provider-azurerm/issues/15793))\n* Data Source: `azurerm_storage_account_sas` - now exports the `tag` and `filter` attributes ([#15863](https://github.com/hashicorp/terraform-provider-azurerm/issues/15863))\n* Data Source: `azurerm_windows_function_app` - support for `storage_key_vault_secret_id` property ([#15793](https://github.com/hashicorp/terraform-provider-azurerm/issues/15793))\n* `azurerm_application_insights` - can now disable Rule and Action Groups that are automatically created ([#15892](https://github.com/hashicorp/terraform-provider-azurerm/issues/15892))\n* `azurerm_cdn_endpoint` - the `host_name` property is renamed to `fqdn` ([#15992](https://github.com/hashicorp/terraform-provider-azurerm/issues/15992))\n* `azurerm_eventgrid_system_topic_event_subscription` - support for the `delivery_property` property ([#15559](https://github.com/hashicorp/terraform-provider-azurerm/issues/15559))\n* `azurerm_iothub` - add support for the `authentication_type` and `identity_id` properties in the `file_upload` block ([#15874](https://github.com/hashicorp/terraform-provider-azurerm/issues/15874))\n* `azurerm_kubernetes_cluster` - the `kube_admin_config` block is now marked as sensitive in addition to all items within it ([#4105](https://github.com/hashicorp/terraform-provider-azurerm/issues/4105))\n* `azurerm_kubernetes_cluster` - add support for the `key_vault_secrets_provider` and `open_service_mesh_enabled` property in Azure China and Azure Government ([#15878](https://github.com/hashicorp/terraform-provider-azurerm/issues/15878))\n* `azurerm_linux_function_app` - add support for the `storage_key_vault_secret_id` property ([#15793](https://github.com/hashicorp/terraform-provider-azurerm/issues/15793))\n* `azurerm_linux_function_app` - updating the read timeout to be `5m` ([#15867](https://github.com/hashicorp/terraform-provider-azurerm/issues/15867))\n* `azurerm_linux_function_app` - support for node version `16` preview ([#15884](https://github.com/hashicorp/terraform-provider-azurerm/issues/15884))\n* `azurerm_linux_function_app` - add support for `use_dotnet_isolated_runtime` ([#15969](https://github.com/hashicorp/terraform-provider-azurerm/issues/15969))\n* `azurerm_linux_function_app_slot` - add support for `use_dotnet_isolated_runtime` ([#15969](https://github.com/hashicorp/terraform-provider-azurerm/issues/15969))\n* `azurerm_linux_function_app_slot` - add support for `storage_key_vault_secret_id` ([#15793](https://github.com/hashicorp/terraform-provider-azurerm/issues/15793))\n* `azurerm_linux_function_app_slot` - updating the read timeout to be 5m ([#15867](https://github.com/hashicorp/terraform-provider-azurerm/issues/15867))\n* `azurerm_linux_virtual_machine` - support for the `termination_notification` property ([#14933](https://github.com/hashicorp/terraform-provider-azurerm/issues/14933))\n* `azurerm_linux_virtual_machine ` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n* `azurerm_linux_virtual_machine_scale_set` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n* `azurerm_linux_web_app` - support for PHP version 8.0 ([#15933](https://github.com/hashicorp/terraform-provider-azurerm/issues/15933))\n* `azurerm_loadbalancer` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n* `azurerm_managed_disk` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n* `azurerm_management_group_policy_assignment` - support for User Assigned Identities ([#15376](https://github.com/hashicorp/terraform-provider-azurerm/issues/15376))\n* `azurerm_mssql_server` - the `minimum_tls_version` property now defaults to `1.2` ([#10276](https://github.com/hashicorp/terraform-provider-azurerm/issues/10276))\n* `azurerm_mysql_server` - the `ssl_minimal_tls_version_enforced` property now defaults to `1.2` ([#10276](https://github.com/hashicorp/terraform-provider-azurerm/issues/10276))\n* `azurerm_network_interface` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n* `azurerm_network_security_rule` - no longer locks on the network security group name ([#15719](https://github.com/hashicorp/terraform-provider-azurerm/issues/15719))\n* `azurerm_postgresql_server` - the `ssl_minimal_tls_version_enforced` property now defaults to `1.2` ([#10276](https://github.com/hashicorp/terraform-provider-azurerm/issues/10276))\n* `azurerm_public_ip` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n* `azurerm_redis_cache` - the `minimum_tls_version` property  now defaults to `1.2` ([#10276](https://github.com/hashicorp/terraform-provider-azurerm/issues/10276))\n* `azurerm_resource_group` - Terraform now checks during the deletion of a Resource Group if there's any items remaining and will raise an error if so by default (to avoid deleting items unintentionally). This behaviour can be controlled using the `prevent_deletion_if_contains_resources` feature-flag within the `resource_group` block within the `features` block. ([#13777](https://github.com/hashicorp/terraform-provider-azurerm/issues/13777))\n* `azurerm_resource_group_policy_assignment` - support for User Assigned Identities ([#15376](https://github.com/hashicorp/terraform-provider-azurerm/issues/15376))\n* `azurerm_resource_policy_assignment` - support for User Assigned Identities ([#15376](https://github.com/hashicorp/terraform-provider-azurerm/issues/15376))\n* `azurerm_sentinel_alert_rule_scheduled` - support for `alert_details_override` ([#15901](https://github.com/hashicorp/terraform-provider-azurerm/issues/15901))\n* `azurerm_sentinel_alert_rule_scheduled` - support for `entity_mapping` [[#15901](https://github.com/hashicorp/terraform-provider-azurerm/issues/15901)] \n* `azurerm_sentinel_alert_rule_scheduled` - support for `custom_details` ([#15901](https://github.com/hashicorp/terraform-provider-azurerm/issues/15901))\n* `azurerm_sentinel_alert_rule_scheduled` - support for `group_by_alert_details` ([#15901](https://github.com/hashicorp/terraform-provider-azurerm/issues/15901))\n* `azurerm_sentinel_alert_rule_scheduled` - support for `group_by_custom_details` ([#15901](https://github.com/hashicorp/terraform-provider-azurerm/issues/15901))\n* `azurerm_site_recovery_replicated_vm` - support for the `target_availability_zone` property ([#15617](https://github.com/hashicorp/terraform-provider-azurerm/issues/15617))\n* `azurerm_shared_image` - support for the `support_accelerated_network` property ([#15562](https://github.com/hashicorp/terraform-provider-azurerm/issues/15562))\n* `azurerm_static_site` - the `identity` property now supports `SystemAssigned` and `UserAssigned` ([#15834](https://github.com/hashicorp/terraform-provider-azurerm/issues/15834))\n* `azurerm_storage_account` - the `allow_blob_public_access` property is renamed to `allow_nested_items_to_be_public` to better represent what is being enabled ([#12689](https://github.com/hashicorp/terraform-provider-azurerm/issues/12689))\n* `azurerm_storage_account` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n* `azurerm_storage_account` - `ZRS` is no longer supported when using `StorageV1` ([#16004](https://github.com/hashicorp/terraform-provider-azurerm/issues/16004))\n* `azurerm_storage_account` - the `min_tls_version` property now defaults to `1.2` ([#10276](https://github.com/hashicorp/terraform-provider-azurerm/issues/10276))\n* `azurerm_storage_share` - `quota` is now required ([#15982](https://github.com/hashicorp/terraform-provider-azurerm/issues/15982))\n* `azurerm_subscription_policy_assignment` - support for User Assigned Identities ([#15376](https://github.com/hashicorp/terraform-provider-azurerm/issues/15376))\n* `azurerm_virtual_network` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n* `azurerm_virtual_network_gateway` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n* `azurerm_virtual_hub` - support for the `virtual_router_asn` and `virtual_router_ips` properties ([#15741](https://github.com/hashicorp/terraform-provider-azurerm/issues/15741))\n* `azurerm_windows_function_app` - add support for `storage_key_vault_secret_id` property ([#15793](https://github.com/hashicorp/terraform-provider-azurerm/issues/15793))\n* `azurerm_windows_function_app` - updating the read timeout to be `5m` ([#15867](https://github.com/hashicorp/terraform-provider-azurerm/issues/15867))\n* `azurerm_windows_function_app` node version validation string can not be prefixed with `~` ([#15884](https://github.com/hashicorp/terraform-provider-azurerm/issues/15884))\n* `azurerm_windows_function_app` support for node version `16` preview support ([#15884](https://github.com/hashicorp/terraform-provider-azurerm/issues/15884))\n* `azurerm_windows_function_app` - add support for `use_dotnet_isolated_runtime` ([#15969](https://github.com/hashicorp/terraform-provider-azurerm/issues/15969))\n* `azurerm_windows_function_app_slot` - add support for `use_dotnet_isolated_runtime` ([#15969](https://github.com/hashicorp/terraform-provider-azurerm/issues/15969))\n* `azurerm_windows_function_app_slot` - add support for the `storage_key_vault_secret_id` property ([#15793](https://github.com/hashicorp/terraform-provider-azurerm/issues/15793))\n* `azurerm_windows_function_app_slot` - updating the read timeout to be 5m ([#15867](https://github.com/hashicorp/terraform-provider-azurerm/issues/15867))\n* `azurerm_windows_virtual_machine` - support for the `termination_notification` property ([#14933](https://github.com/hashicorp/terraform-provider-azurerm/issues/14933))\n* `azurerm_windows_virtual_machine` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n* `azurerm_windows_virtual_machine_scale_set` - support for the `edge_zone` property ([#15890](https://github.com/hashicorp/terraform-provider-azurerm/issues/15890))\n\nBUG FIXES:\n\n* provider: the `recover_soft_deleted_key_vaults` feature flag within the `key_vault` block now defaults to `true` ([#15984](https://github.com/hashicorp/terraform-provider-azurerm/issues/15984))\n* provider: the `purge_soft_delete_on_destroy ` feature flag within the `key_vault` block now defaults to `true` [[#15984](https://github.com/hashicorp/terraform-provider-azurerm/issues/15984)] \n* `azurerm_app_configuration_feature` - detecting that the key is gone when the App Configuration is deleted ([#15973](https://github.com/hashicorp/terraform-provider-azurerm/issues/15973))\n* `azurerm_app_configuration_key` - detecting that the key is gone when the App Configuration is deleted ([#15973](https://github.com/hashicorp/terraform-provider-azurerm/issues/15973))\n* `azurerm_application_gateway` - the `backend_address_pool` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the field `fqdns` within the `backend_address_pool` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the field `ip_addresses` within the `backend_address_pool` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the `backend_http_settings` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the `frontend_port` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the field `host_names` within the `frontend_port` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the `http_listener` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the `private_endpoint_connection` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the `private_link_configuration` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the `probe` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the `redirect_configuration` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the `request_routing_rule` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_application_gateway` - the `ssl_certificate` block is now a Set rather than a List ([#6896](https://github.com/hashicorp/terraform-provider-azurerm/issues/6896))\n* `azurerm_container_registry` - validate the `georepliactions` property does not include the location of the Container Registry ([#15847](https://github.com/hashicorp/terraform-provider-azurerm/issues/15847))\n* `azurerm_cosmosdb_mongo_collection` - the `default_ttl_seconds` property can now be set to `-1` ([#15736](https://github.com/hashicorp/terraform-provider-azurerm/issues/15736))\n* `azurerm_eventhub` - prevent panic when the `capture_description` block is removed ([#15930](https://github.com/hashicorp/terraform-provider-azurerm/issues/15930))\n* `azurerm_key_vault_access_policy` - validating the Resource ID during import ([#15989](https://github.com/hashicorp/terraform-provider-azurerm/issues/15989))\n* `azurerm_linux_function_app` - fixed update handling of `app_settings` for `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ([#15907](https://github.com/hashicorp/terraform-provider-azurerm/issues/15907))\n* `azurerm_linux_function_app_slot` - fixed update handling of `app_settings` for `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ([#15907](https://github.com/hashicorp/terraform-provider-azurerm/issues/15907))\n* `azurerm_local_network_gateway`  - fixfor `address_space` cannot be updated ([#15159](https://github.com/hashicorp/terraform-provider-azurerm/issues/15159))\n* `azurerm_log_analytics_cluster_customer_managed_key` - detecting when the Customer Managed Key is removed ([#15973](https://github.com/hashicorp/terraform-provider-azurerm/issues/15973))\n* `azurerm_mssql_database_vulnerability_assessment_rule_baseline` - prevent the resource from being replaced every apply ([#14759](https://github.com/hashicorp/terraform-provider-azurerm/issues/14759))\n* `azurerm_security_center_auto_provisioning ` - validating the Resource ID during import [[#15989](https://github.com/hashicorp/terraform-provider-azurerm/issues/15989)] \n* `azurerm_security_center_setting` - changing the `setting_name` property now forces a new resource ([#15983](https://github.com/hashicorp/terraform-provider-azurerm/issues/15983))\n* `azurerm_synapse_workspace` - fixing a bug where workspaces created from a Dedicated SQL Pool / SQL Data Warehouse couldn't be retrieved ([#15829](https://github.com/hashicorp/terraform-provider-azurerm/issues/15829))\n* `azurerm_synapse_workspace_key` - keys can now be correctly rotated ([#15897](https://github.com/hashicorp/terraform-provider-azurerm/issues/15897))\n* `azurerm_windows_function_app` - fixed update handling of `app_settings` for `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ([#15907](https://github.com/hashicorp/terraform-provider-azurerm/issues/15907))\n* `azurerm_windows_function_app_slot` - fixed update handling of `app_settings` for `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ([#15907](https://github.com/hashicorp/terraform-provider-azurerm/issues/15907))\n\n---\n\nFor information on changes between the v2.99.0 and v2.0.0 releases, see [the previous v2.x changelog entries](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v2.md).\n\nFor information on changes between the v1.44.0 and v1.0.0 releases, see [the previous v1.x changelog entries](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v1.md).\n\nFor information on changes prior to the v1.0.0 release, see [the v0.x changelog](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v0.md).\n"
  },
  {
    "path": "articles/terraform/provider-version-history-azurerm-4-0-0-to-current.md",
    "content": "---\ntitle: Terraform AzureRM provider version history 4.0.0 - current\ndescription: View the Terraform AzureRM provider version history for 4.0.0 - current\nkeywords: azure devops terraform change log release history what's new\nms.topic: reference\nms.date: 08/12/2025\nms.custom: devx-track-terraform\n# Customer intent: I want to view the AzureRM provider version history for versions 4.0.0 - current\n# Source: https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG.md\n---\n\n# Terraform AzureRM provider version history: 4.0.0 - current\n\n## 4.39.0 (August 08, 2025)\n\nFEATURES:\n\n* **New Resource**: `azurerm_api_management_standalone_gateway` ([#30226](https://github.com/hashicorp/terraform-provider-azurerm/issues/30226))\n* **New Resource**: `azurerm_eventgrid_partner_namespace` ([#30266](https://github.com/hashicorp/terraform-provider-azurerm/issues/30266))\n* **New Resource**: `azurerm_postgresql_flexible_server_backup` ([#29201](https://github.com/hashicorp/terraform-provider-azurerm/issues/29201))\n\nENHANCEMENTS:\n\n* dependencies: `cognitive` - update API version to `2025-06-01` ([#30302](https://github.com/hashicorp/terraform-provider-azurerm/issues/30302))\n* dependencies: `machinelearning` - update API version to `2025-06-01` ([#30268](https://github.com/hashicorp/terraform-provider-azurerm/issues/30268))\n* Data Source: `azurerm_oracle_db_system_shapes` - add support for the `zone` property ([#30071](https://github.com/hashicorp/terraform-provider-azurerm/issues/30071))\n* Data Source: `azurerm_oracle_gi_versions` - add support for the `shape` and `zone` properties ([#30071](https://github.com/hashicorp/terraform-provider-azurerm/issues/30071))\n* `azurerm_cognitive_deployment` - remove `model.format` validation ([#30276](https://github.com/hashicorp/terraform-provider-azurerm/issues/30276))\n* `azurerm_eventgrid_system_topic` - add support for the `SystemAssigned, UserAssigned` value for the `identity.type` property ([#30339](https://github.com/hashicorp/terraform-provider-azurerm/issues/30339))\n* `azurerm_linux_web_app` - add support for the `8.4` value in the `php_version` property ([#30281](https://github.com/hashicorp/terraform-provider-azurerm/issues/30281))\n* `azurerm_linux_web_app_slot` - add support for the `8.4` value in the `php_version` property ([#30281](https://github.com/hashicorp/terraform-provider-azurerm/issues/30281))\n* `azurerm_postgresql_flexible_server` - the `customer_managed_key.geo_backup_key_vault_key_id` now supports versionless IDs ([#30305](https://github.com/hashicorp/terraform-provider-azurerm/issues/30305))\n* `azurerm_site_recovery_replicated_vm` - the `target_disk_type` property now supports the `StandardSSD_ZRS`, `Premium_ZRS` and `PremiumV2_LRS` values and the `target_replica_disk_type` now supports the `StandardSSD_ZRS` and `Premium_ZRS` properties ([#30291](https://github.com/hashicorp/terraform-provider-azurerm/issues/30291))\n\nBUG FIXES:\n\n* `azurerm_container_app_environment` - fix an issue where `identity` was not set to the update request payload ([#30311](https://github.com/hashicorp/terraform-provider-azurerm/issues/30311))\n* `azurerm_function_app_flex_consumption` - the `maximum_instance_count` property now updates as expected ([#30342](https://github.com/hashicorp/terraform-provider-azurerm/issues/30342))\n* `azurerm_kubernetes_cluster_node_pool` - add locks on `vnet_subnet_id` and `pod_subnet_id` to prevent conflicts while updating multiple node pools in parallel ([#29537](https://github.com/hashicorp/terraform-provider-azurerm/issues/29537))\n* `azurerm_postgresql_flexible_server` - fix an issue where `administrator_password_wo` was not set to the update request payload ([#29475](https://github.com/hashicorp/terraform-provider-azurerm/issues/29475))\n\n## 4.38.1 (July 31, 2025)\n\n**NOTE:** This patch release addresses a critical problem in App Service and Logic Apps resources preventing all Long Running Operations from completing successfully. \n\nBUG FIXES:\n\n* dependencies: `go-azure-sdk/sdk` update to `v0.20250731.1142049` ([#30282](https://github.com/hashicorp/terraform-provider-azurerm/issues/30282))\n\n## 4.38.0 (July 30, 2025)\n\nFEATURES:\n\n* **New Data Source** : `azurerm_api_connection` ([#30178](https://github.com/hashicorp/terraform-provider-azurerm/issues/30178))\n* **New Data Source**: `azurerm_log_analytics_workspace_table` ([#30261](https://github.com/hashicorp/terraform-provider-azurerm/issues/30261))\n* **New Data Source**: `azurerm_mssql_failover_group` ([#29428](https://github.com/hashicorp/terraform-provider-azurerm/issues/29428))\n* **New Data Source**: `azurerm_trusted_signing_account` ([#29293](https://github.com/hashicorp/terraform-provider-azurerm/issues/29293))\n* **New Resource**: `azurerm_application_load_balancer_security_policy` ([#30128](https://github.com/hashicorp/terraform-provider-azurerm/issues/30128))\n* **New Resource** : `azurerm_eventgrid_partner_registration` ([#29736](https://github.com/hashicorp/terraform-provider-azurerm/issues/29736))\n* **New Resource**: `azurerm_mssql_managed_instance_start_stop_schedule` ([#26702](https://github.com/hashicorp/terraform-provider-azurerm/issues/26702))\n\nENHANCEMENTS:\n\n* dependencies: `go-azure-sdk` update to `v0.20250728.1144148` ([#30254](https://github.com/hashicorp/terraform-provider-azurerm/issues/30254))\n* dependencies: `go-azure-sdk` update to v0.20250716.1144812 ([#30171](https://github.com/hashicorp/terraform-provider-azurerm/issues/30171))\n* dependencies: `golang.org/x/crypto` update to `v0.40.0` ([#30171](https://github.com/hashicorp/terraform-provider-azurerm/issues/30171))\n* dependencies: `golang.org/x/mod` update to `v0.26.0` ([#30171](https://github.com/hashicorp/terraform-provider-azurerm/issues/30171))\n* dependencies: `golang.org/x/net` update to `v0.42.0` ([#30171](https://github.com/hashicorp/terraform-provider-azurerm/issues/30171))\n* dependencies: `golang.org/x/sync` update to `v0.16.0` ([#30171](https://github.com/hashicorp/terraform-provider-azurerm/issues/30171))\n* dependencies: `golang.org/x/sys` update to `v0.34.0` ([#30171](https://github.com/hashicorp/terraform-provider-azurerm/issues/30171))\n* dependencies: `golang.org/x/text` update to `v0.27.0` ([#30171](https://github.com/hashicorp/terraform-provider-azurerm/issues/30171))\n* dependencies: `golang.org/x/tools` update to `v0.35.0` ([#30171](https://github.com/hashicorp/terraform-provider-azurerm/issues/30171))\n* dependencies: `servicebus` - update to API version `2024-01-01` ([#30231](https://github.com/hashicorp/terraform-provider-azurerm/issues/30231))\n* Data Source: `azurerm_databricks_workspace` - add support for the `custom_parameters` property ([#30214](https://github.com/hashicorp/terraform-provider-azurerm/issues/30214))\n* Data Source: `azurerm_oracle_cloud_vm_cluster` - add support for the `file_system_configuration` block ([#30092](https://github.com/hashicorp/terraform-provider-azurerm/issues/30092))\n* Data Source: `azurerm_oracle_exadata_infrastructure` - add support for the `defined_file_system_configuration` block ([#30092](https://github.com/hashicorp/terraform-provider-azurerm/issues/30092))\n* `azurerm_batch_pool` - fix `start_task.0.task_retry_maximum` validation ([#30182](https://github.com/hashicorp/terraform-provider-azurerm/issues/30182))\n* `azurerm_dev_center` - add support for the `project_catalog_item_sync_enabled` property ([#29274](https://github.com/hashicorp/terraform-provider-azurerm/issues/29274))\n* `azurerm_dev_center_project_pool` - add support for the `managed_virtual_network_regions` property ([#30061](https://github.com/hashicorp/terraform-provider-azurerm/issues/30061))\n* `azurerm_dynatrace_monitor` -  add support for  the `environment_properties` block ([#29251](https://github.com/hashicorp/terraform-provider-azurerm/issues/29251))\n* `azurerm_image` - improve validation for `os_disk`, `data_disk` and `zone_resilient` ([#30222](https://github.com/hashicorp/terraform-provider-azurerm/issues/30222))\n* `azurerm_managed_lustre_file_system` - add support for the `root_squash` block ([#29876](https://github.com/hashicorp/terraform-provider-azurerm/issues/29876))\n* `azurerm_management_group_policy_assignment` - improve validation for the `name` property ([#30179](https://github.com/hashicorp/terraform-provider-azurerm/issues/30179))\n* `azurerm_management_group_policy_set_definition` - now forces a new resource to be created when the number of `parameters` is decreased ([#29866](https://github.com/hashicorp/terraform-provider-azurerm/issues/29866))\n* `azurerm_mongo_cluster` - add support for `version` 8.0 ([#29823](https://github.com/hashicorp/terraform-provider-azurerm/issues/29823))\n* `azurerm_network_security_rule` - improve validation for source and destination properties  ([#29675](https://github.com/hashicorp/terraform-provider-azurerm/issues/29675))\n* `azurerm_oracle_cloud_vm_cluster` - add support for the `file_system_configuration` block ([#30092](https://github.com/hashicorp/terraform-provider-azurerm/issues/30092))\n* `azurerm_policy_set_definition` - now forces a new resource to be created when the number of `parameters` is decreased ([#29866](https://github.com/hashicorp/terraform-provider-azurerm/issues/29866))\n* `azurerm_resource_group_policy_assignment` - improve validation for the `name` property ([#30179](https://github.com/hashicorp/terraform-provider-azurerm/issues/30179))\n* `azurerm_resource_policy_assignment` - improve validation for the `name` property ([#30179](https://github.com/hashicorp/terraform-provider-azurerm/issues/30179))\n* `azurerm_subnet` - add support for the `ip_address_pool` block ([#29840](https://github.com/hashicorp/terraform-provider-azurerm/issues/29840))\n* `azurerm_subscription_policy_assignment` - improve validation for the `name` property ([#30179](https://github.com/hashicorp/terraform-provider-azurerm/issues/30179))\n* `azurerm_video_indexer_account` - add support for the `public_network_access` property ([#29725](https://github.com/hashicorp/terraform-provider-azurerm/issues/29725))\n\nBUG FIXES:\n\n* Data Source: `azurerm_kusto_cluster` - fix returned error if cluster was not found ([#30232](https://github.com/hashicorp/terraform-provider-azurerm/issues/30232))\n* `appservice` - now checks for deployment service availability before zip deployment  ([#30066](https://github.com/hashicorp/terraform-provider-azurerm/issues/30066))\n* `azurerm_ai_foundry` - no longer crashes when the `key_vault_id` property is nil ([#30252](https://github.com/hashicorp/terraform-provider-azurerm/issues/30252))\n* `azurerm_container_app_environment` - no longer panics when `log_analytics_workspace_id` is from another subscription ([#29829](https://github.com/hashicorp/terraform-provider-azurerm/issues/29829))\n* `azurerm_eventhub` - fix perpetual diff with `message_retention` ([#30169](https://github.com/hashicorp/terraform-provider-azurerm/issues/30169))\n* `azurerm_kusto_attached_database_configuration` - resource is now removed from state if it no longer exists ([#30232](https://github.com/hashicorp/terraform-provider-azurerm/issues/30232))\n* `azurerm_kusto_cluster` - resource is now removed from state if it no longer exists ([#30232](https://github.com/hashicorp/terraform-provider-azurerm/issues/30232))\n* `azurerm_kusto_cluster_customer_managed_key` - resource is now removed from state if it no longer exists ([#30232](https://github.com/hashicorp/terraform-provider-azurerm/issues/30232))\n* `azurerm_kusto_cluster_principal_assignment` - resource is now removed from state if it no longer exists ([#30232](https://github.com/hashicorp/terraform-provider-azurerm/issues/30232))\n* `azurerm_log_analytics_workspace_table` - the `retention_in_days` property can now be reset ([#29182](https://github.com/hashicorp/terraform-provider-azurerm/issues/29182))\n* `azurerm_monitor_alert_prometheus_rule_group` - prevent an error caused by the request containing an empty string for the `rule.for` property when not set ([#30180](https://github.com/hashicorp/terraform-provider-azurerm/issues/30180))\n* `azurerm_mssql_database` - the `max_size_gb` can now support `0.1` and `0.5` ([#28334](https://github.com/hashicorp/terraform-provider-azurerm/issues/28334))\n* `azurerm_mssql_managed_instance` - `administrator_login` is now Computed, preventing resource recreation when `azure_active_directory_administrator.azuread_authentication_only_enabled` is `true` ([#30263](https://github.com/hashicorp/terraform-provider-azurerm/issues/30263))\n* `azurerm_postgresql_flexible_server_virtual_endpoint` - no longer causes an error when `replica_server_id` is from another subscription ([#29270](https://github.com/hashicorp/terraform-provider-azurerm/issues/29270))\n* `azurerm_role_management_policy` - fix perpetual diff on `activation_rules.approval_stage` ([#29084](https://github.com/hashicorp/terraform-provider-azurerm/issues/29084))\n* `azurerm_service_plan` - fix an issue that prevented supported SKUs from specifying `zone_balancing_enabled` as `true` ([#30165](https://github.com/hashicorp/terraform-provider-azurerm/issues/30165))\n* `azurerm_web_application_firewall_policy` - `js_challenge_cookie_expiration_in_minutes` is now set to default value if not returned from API ([#30245](https://github.com/hashicorp/terraform-provider-azurerm/issues/30245))\n\n## 4.37.0 (July 17, 2025)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_network_manager_ipam_pool` ([#30145](https://github.com/hashicorp/terraform-provider-azurerm/issues/30145))\n\nENHANCEMENTS:\n\n* Data Source: `azurerm_virtual_machine_scale_set` - add support for the `auxiliary_mode` and `auxiliary_sku` properties ([#30159](https://github.com/hashicorp/terraform-provider-azurerm/issues/30159))\n* `azurerm_container_app_environment` - add support for the `identity` block ([#29409](https://github.com/hashicorp/terraform-provider-azurerm/issues/29409))\n* `azurerm_eventhub` - add  support for the `retention_description` block ([#29427](https://github.com/hashicorp/terraform-provider-azurerm/issues/29427))\n* `azurerm_kubernetes_cluster` - add support for the `Daily` value in the `maintenance_window_auto_upgrade.frequency` property ([#30133](https://github.com/hashicorp/terraform-provider-azurerm/issues/30133))\n* `azurerm_kubernetes_flux_configuration` - add support for the `git_repository.provider` property ([#30082](https://github.com/hashicorp/terraform-provider-azurerm/issues/30082))\n* `azurerm_mssql_job_step` - the `job_credential_id` and `output_target.job_credential_id` properties are now optional ([#30031](https://github.com/hashicorp/terraform-provider-azurerm/issues/30031))\n* `azurerm_orchestrated_virtual_machine_scale_set` - add support for `auxiliary_mode` and `auxiliary_sku`  ([#30102](https://github.com/hashicorp/terraform-provider-azurerm/issues/30102))\n* `azurerm_storage_account` - add support for the `provisioned_billing_model_version` property ([#29043](https://github.com/hashicorp/terraform-provider-azurerm/issues/29043))\n* `azurerm_vpn_gateway_connection` - add support for the `dpd_timeout_seconds` property ([#29434](https://github.com/hashicorp/terraform-provider-azurerm/issues/29434))\n\nBUG FIXES:\n\n* Data Source: `azurerm_virtual_machine_scale_set` - fix a panic caused by missing properties ([#30159](https://github.com/hashicorp/terraform-provider-azurerm/issues/30159))\n* `azurerm_container_app_environment` - fix import for `workload_profile` ([#30139](https://github.com/hashicorp/terraform-provider-azurerm/issues/30139))\n* `azurerm_mongo_cluster` - the `create_mode` property no longer causes ForceNews on import ([#29375](https://github.com/hashicorp/terraform-provider-azurerm/issues/29375))\n* `azurerm_virtual_network` - suppress a perpetual diff on `address_space` when using `ip_address_pool` ([#30073](https://github.com/hashicorp/terraform-provider-azurerm/issues/30073))\n* `azurerm_vpn_gateway_connection` - the `shared_key` is now Optional + Computed ([#30152](https://github.com/hashicorp/terraform-provider-azurerm/issues/30152))\n\n## 4.36.0 (July 10, 2025)\n\nFEATURES:\n\n* **New Resource**: `azurerm_api_management_workspace` ([#30033](https://github.com/hashicorp/terraform-provider-azurerm/issues/30033))\n* **New Resource**: `azurerm_network_manager_verifier_workspace_reachability_analysis_intent` ([#28956](https://github.com/hashicorp/terraform-provider-azurerm/issues/28956))\n\nENHANCEMENTS:\n\n* dependencies: `kubernetesconfiguration` - update to API version `2024-11-01` ([#29896](https://github.com/hashicorp/terraform-provider-azurerm/issues/29896))\n* dependencies: `oracle` - update to API version `2025-03-01` ([#29721](https://github.com/hashicorp/terraform-provider-azurerm/issues/29721))\n* dependencies: `servicenetworking` - update to API version `2025-01-01` ([#30103](https://github.com/hashicorp/terraform-provider-azurerm/issues/30103))\n* Data Source: `azurerm_container_registry` - add support for the `data_endpoint_host_names` property ([#30086](https://github.com/hashicorp/terraform-provider-azurerm/issues/30086))\n* Data Source: `azurerm_dev_center_dev_box_definition` - add support for the `hibernate_support_enabled` property ([#29995](https://github.com/hashicorp/terraform-provider-azurerm/issues/29995))\n* Data Source: `azurerm_marketplace_agreement` - add support for the `accepted` property ([#30118](https://github.com/hashicorp/terraform-provider-azurerm/issues/30118))\n* Data Source: `azurerm_oracle_autonomous_database` - add support for `compute_model` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* Data Source: `azurerm_oracle_cloud_vm_cluster` - add support for `compute_model` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* Data Source: `azurerm_oracle_db_servers` - add support for the `compute_model` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* Data Source: `azurerm_oracle_db_system_shapes` - add support for the `display_name` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* Data Source: `azurerm_oracle_db_system_shapes` - add support for the `are_server_types_supported` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* Data Source: `azurerm_oracle_db_system_shapes` - add support for the `compute_model` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* Data Source: `azurerm_oracle_exadata_infrastructure` - add support for the `compute_model` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* Data Source: `azurerm_oracle_exadata_infrastructure` - add support for the `database_server_type` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* Data Source: `azurerm_oracle_exadata_infrastructure` - add support for the `storage_server_type` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* Data Source: `azurerm_private_dns_zone_virtual_network_link` - add support for the `resolution_policy` property ([#29861](https://github.com/hashicorp/terraform-provider-azurerm/issues/29861))\n* `azurerm_api_management` - `sku_name` now supports V2 Tiers  ([#29657](https://github.com/hashicorp/terraform-provider-azurerm/issues/29657))\n* `azurerm_container_registry` - add support for the `data_endpoint_host_names` property ([#30086](https://github.com/hashicorp/terraform-provider-azurerm/issues/30086))\n* `azurerm_data_protection_backup_instance_disk` - support cross subscription snapshot resource group ([#30087](https://github.com/hashicorp/terraform-provider-azurerm/issues/30087))\n* `azurerm_dev_center_dev_box_definition` - add support for the `hibernate_support_enabled` property ([#29995](https://github.com/hashicorp/terraform-provider-azurerm/issues/29995))\n* `azurerm_kubernetes_cluster` - add support for the `custom_ca_trust_certificates_base64` property ([#29894](https://github.com/hashicorp/terraform-provider-azurerm/issues/29894))\n* `azurerm_kubernetes_cluster` - support for the `web_app_routing.default_nginx_controller` property ([#29879](https://github.com/hashicorp/terraform-provider-azurerm/issues/29879))\n* `azurerm_linux_virtual_machine_scale_set` - add support for the `network_interface.auxiliary_mode` and `network_interface.auxiliary_sku` properties ([#29724](https://github.com/hashicorp/terraform-provider-azurerm/issues/29724))\n* `azurerm_linux_web_app` - support for the `vnet_image_pull_enabled` property ([#29452](https://github.com/hashicorp/terraform-provider-azurerm/issues/29452))\n* `azurerm_linux_web_app_slot` - support for the `vnet_image_pull_enabled` property ([#29452](https://github.com/hashicorp/terraform-provider-azurerm/issues/29452))\n* `azurerm_log_analytics_workspace` - now returns an error during planning when creating with/updating to a `Standard` or `Premium` SKU as this is no longer supported by Azure ([#30101](https://github.com/hashicorp/terraform-provider-azurerm/issues/30101))\n* `azurerm_logic_app_workflow` - The `access_control.trigger.allowed_caller_ip_address_range` property is now optional ([#30041](https://github.com/hashicorp/terraform-provider-azurerm/issues/30041))\n* `azurerm_machine_learning_datastore_blobstorage` - the `shared_access_signature` and `account_key` properties are now optional ([#30079](https://github.com/hashicorp/terraform-provider-azurerm/issues/30079))\n* `azurerm_netapp_volume` - add support for the `cool_access` block ([#29915](https://github.com/hashicorp/terraform-provider-azurerm/issues/29915))\n* `azurerm_oracle_autonomous_database` - Add support for `allowed_ips` ([#29412](https://github.com/hashicorp/terraform-provider-azurerm/issues/29412))\n* `azurerm_oracle_exadata_infrastructure` - add support for the `database_server_type` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* `azurerm_oracle_exadata_infrastructure` - add support for the `storage_server_type` property ([#29801](https://github.com/hashicorp/terraform-provider-azurerm/issues/29801))\n* `azurerm_private_dns_zone_virtual_network_link` - add support for the `resolution_policy` property ([#29861](https://github.com/hashicorp/terraform-provider-azurerm/issues/29861))\n* `azurerm_public_ip_prefix` - add support for the `custom_ip_prefix_id` property ([#29851](https://github.com/hashicorp/terraform-provider-azurerm/issues/29851))\n* `azurerm_service_plan` - allow updating `zone_balancing_enabled` without recreating the resource in supported configurations ([#29810](https://github.com/hashicorp/terraform-provider-azurerm/issues/29810))\n* `azurerm_virtual_hub` - add support for the `branch_to_branch_traffic_enabled` property ([#29453](https://github.com/hashicorp/terraform-provider-azurerm/issues/29453))\n* `azurerm_windows_virtual_machine_scale_set` - add support for the `network_interface.auxiliary_mode` and `network_interface.auxiliary_sku` properties ([#29724](https://github.com/hashicorp/terraform-provider-azurerm/issues/29724))\n\nBUG FIXES:\n\n* `azurerm_mobile_network_packet_core_control_plane` - the `site_ids` property is now marked as `ForceNew` ([#30056](https://github.com/hashicorp/terraform-provider-azurerm/issues/30056))\n* `azurerm_mobile_network_slice` - the `single_network_slice_selection_assistance_information` property is now updated correctly ([#30057](https://github.com/hashicorp/terraform-provider-azurerm/issues/30057))\n* `azurerm_private_dns_resolver_dns_forwarding_ruleset` - fix an issue where `private_dns_resolver_outbound_endpoint_ids` failed to update ([#30046](https://github.com/hashicorp/terraform-provider-azurerm/issues/30046))\n\n## 4.35.0 (July 01, 2025)\n\nFEATURES:\n* **New Resource**: `azurerm_email_communication_service_domain_sennder_username` ([#29340](https://github.com/hashicorp/terraform-provider-azurerm/issues/29340))\n* **New Resource**: `azurerm_management_group_policy_set_definition` ([#29863](https://github.com/hashicorp/terraform-provider-azurerm/issues/29863))\n\nENHANCEMENTS:\n* **Data Source**: `azurerm_communication_service` - add support for the `immutable_resource_id` property ([#29912](https://github.com/hashicorp/terraform-provider-azurerm/issues/29912))\n* `azurerm_cdn_endpoint` - block creation of all Azure CDN(classic) resources while allowing existing resources to be updated ([#29299](https://github.com/hashicorp/terraform-provider-azurerm/issues/29299))\n* `azurerm_cdn_endpoint_custom_domain` - block creation of all Azure CDN(classic) resources while allowing existing resources to be updated ([#29299](https://github.com/hashicorp/terraform-provider-azurerm/issues/29299))\n* `azurerm_cdn_profile` - block creation of all Azure CDN(classic) resources while allowing existing resources to be updated ([#29299](https://github.com/hashicorp/terraform-provider-azurerm/issues/29299))\n* `azurerm_container_app_job` - add support for the `volume_mounts.sub_path` property ([#29883](https://github.com/hashicorp/terraform-provider-azurerm/issues/29883))\n* `azurerm_container_app` - add support for the `cors` property ([#29785](https://github.com/hashicorp/terraform-provider-azurerm/issues/29785))\n* `azurerm_data_protection_backup_policy_disk` - the `absolute_criteria` property now supports the `AllBackup`, `FirstOfMonth` and `FirstOfYear` values ([#29917](https://github.com/hashicorp/terraform-provider-azurerm/issues/29917))\n* `azurerm_frontdoor` - block new resource creation while allowing existing resources to be updated ([#29257](https://github.com/hashicorp/terraform-provider-azurerm/issues/29257))\n* `azurerm_frontdoor_custom_https_configuration` - block new resource creation while allowing existing resources to be updated ([#29257](https://github.com/hashicorp/terraform-provider-azurerm/issues/29257))\n* `azurerm_frontdoor_firewall_policy` - block new resource creation while allowing existing resources to be updated ([#29257](https://github.com/hashicorp/terraform-provider-azurerm/issues/29257))\n* `azurerm_frontdoor_rules_engine` - block new resource creation while allowing existing resources to be updated ([#29257](https://github.com/hashicorp/terraform-provider-azurerm/issues/29257))\n* `azurerm_function_app_flex_consumption` - add support for the `vnet_route_all_enabled` property ([#29839](https://github.com/hashicorp/terraform-provider-azurerm/issues/29839))\n* `azurerm_machine_learning_compute_cluster` - the `scale_settings` block and its sub-properties are no longer `ForceNew` ([#29878](https://github.com/hashicorp/terraform-provider-azurerm/issues/29878))\n* `azurerm_machine_learning_compute_cluster` - the `tags` property is no longer `ForceNew` ([#29878](https://github.com/hashicorp/terraform-provider-azurerm/issues/29878))\n* `azurerm_oracle_autonomous_database ` - add support for `long_term_backup_schedule` ([#29207](https://github.com/hashicorp/terraform-provider-azurerm/issues/29207)) \n* `azurerm_policy_set_definition` - add support for the `policy_definition_reference.version` property ([#29924](https://github.com/hashicorp/terraform-provider-azurerm/issues/29924))\n* `azurerm_policy_set_definition` - migrate to use `go-azure-sdk` ([#29863](https://github.com/hashicorp/terraform-provider-azurerm/issues/29863)) \n* `azurerm_private_link_service` - add support for the `destination_ip_address` property ([#29395](https://github.com/hashicorp/terraform-provider-azurerm/issues/29395))\n* `azurerm_purview_account` - add support for the `managed_event_hub_enabled` and `aws_external_id` properties ([#29732](https://github.com/hashicorp/terraform-provider-azurerm/issues/29732))\n* `azurerm_virtual_network_gateway` - the `ip_configuration.public_ip_address_id` property is now optional ([#30038](https://github.com/hashicorp/terraform-provider-azurerm/issues/30038))\n* `azurerm_windows_virtual_machine`: `os_disk.0.diff_disk_settings.0.placement` now supports `NvmeDisk` ([#29922](https://github.com/hashicorp/terraform-provider-azurerm/issues/29922))\n\nBUG FIXES:\n* `provider` - allow missing `subscription_id` when `use_cli` is `true` ([#29985](https://github.com/hashicorp/terraform-provider-azurerm/issues/29985))\n* `azurerm_netapp_backup_policy` - the `weekly_backups_to_keep` and `monthly_backups_to_keep` properties can now be set to `0` ([#29920](https://github.com/hashicorp/terraform-provider-azurerm/issues/29920))\n\n## 4.34.0 (June 20, 2025)\n\nENHANCEMENTS:\n* dependencies: `containerservice` - update API version to `2025-02-01` ([#29761](https://github.com/hashicorp/terraform-provider-azurerm/issues/29761))\n* `azurerm_network_manager_ipam_pool` - `display_name` is now optional ([#29842](https://github.com/hashicorp/terraform-provider-azurerm/issues/29842))\n\n* `dependencies`: `go-azure-sdk` - update to `v0.20250613.1153526` ([#29871](https://github.com/hashicorp/terraform-provider-azurerm/issues/29871))\n* `provider`: add support for `msi_api_version` property and `ARM_MSI_API_VERSION` env var. ([#29871](https://github.com/hashicorp/terraform-provider-azurerm/issues/29871))\n* `azurerm_kusto_cluster_customer_managed_key` - add support for `managed_hsm_key_id` ([#29416](https://github.com/hashicorp/terraform-provider-azurerm/issues/29416))\n\nFEATURES:\n* **New Data Source**: `azurerm_dev_center_environment_type` ([#29782](https://github.com/hashicorp/terraform-provider-azurerm/issues/29782))\n* **New Data Source**: `azurerm_dev_center_project_pool` ([#29778](https://github.com/hashicorp/terraform-provider-azurerm/issues/29778))\n\nBUG FIXES:\n* `azurerm_eventgrid_namespace` - validations for `maximum_session_expiry_in_hours` and `maximum_client_sessions_per_authentication_name` are now correct ([#29919](https://github.com/hashicorp/terraform-provider-azurerm/issues/29919))\n* `azurerm_api_management_api_operation` - fix validation for the `url_template` property to allow parameters prefixed with `*` ([#29895](https://github.com/hashicorp/terraform-provider-azurerm/issues/29895))\n* `azurerm_mysql_flexible_server` - reverted a change made to the validation of the `sku_name` property that caused errors for existing resources ([#29909](https://github.com/hashicorp/terraform-provider-azurerm/issues/29909))\n* `azurerm_orchestrated_virtual_machine_scale_set` - prevent a panic when an empty `os_profile` block is present in the configuration  ([#29809](https://github.com/hashicorp/terraform-provider-azurerm/issues/29809))\n\n## 4.33.0 (June 12, 2025)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_dev_center_attached_network` ([#29793](https://github.com/hashicorp/terraform-provider-azurerm/issues/29793))\n* **New Data Source**: `azurerm_dev_center_dev_box_definition` ([#29790](https://github.com/hashicorp/terraform-provider-azurerm/issues/29790))\n* **New Data Source**: `azurerm_dev_center_catalog` ([#29794](https://github.com/hashicorp/terraform-provider-azurerm/issues/29794))\n* **New Data Source**: `azurerm_dev_center_gallery` ([#29795](https://github.com/hashicorp/terraform-provider-azurerm/issues/29795))\n* **New Data Source**: `azurerm_dev_center_network_connection` ([#29792](https://github.com/hashicorp/terraform-provider-azurerm/issues/29792))\n\nENHANCEMENTS:\n\n* `azurem_netapp_volume_group_oracle_resource` - add support for `data_protection_replication ` including Cross-Region Replication (CRR) and Cross-Zone Replication (CZR) ([#29771](https://github.com/hashicorp/terraform-provider-azurerm/issues/29771))\n* `azurerm_postgresql_flexible_server` - the `create_mode` property now supports the `ReviveDropped` value  ([#29814](https://github.com/hashicorp/terraform-provider-azurerm/issues/29814))\n* `azurerm_postgresql_flexible_server` - add support for `SystemAssigned, UserAssigned` to the `identity.type` property ([#29320](https://github.com/hashicorp/terraform-provider-azurerm/issues/29320))\n\nBUG FIXES:\n* `azurerm_windows_function_app` - the `app_settings` property is no longer marked as sensitive ([#29834](https://github.com/hashicorp/terraform-provider-azurerm/issues/29834))\n* `azurerm_mssql_server_vulnerability_assessment` - `storage_account_access_key` and `storage_container_sas_key` are no longer required to be set ([#29789](https://github.com/hashicorp/terraform-provider-azurerm/issues/29789))\n\n## 4.32.0 (June 05, 2025)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_dev_center_project` ([#29747](https://github.com/hashicorp/terraform-provider-azurerm/issues/29747))\n* **New Data Source**: `azurerm_dev_center_project_environment_type` ([#29762](https://github.com/hashicorp/terraform-provider-azurerm/issues/29762))\n* **New Resource**: `azurerm_qumulo_file_system` ([#28704](https://github.com/hashicorp/terraform-provider-azurerm/issues/28704))\n\nENHANCEMENTS:\n\n* dependencies: `go-azure-sdk` - update to `v0.20250526.1224007` ([#29745](https://github.com/hashicorp/terraform-provider-azurerm/issues/29745))\n* Data Source: `azurerm_netapp_volume` - export the `large_volume_enabled` property ([#29712](https://github.com/hashicorp/terraform-provider-azurerm/issues/29712))\n* Data Source: `azurerm_vpn_gateway` - export the `ip_configuration` block ([#29186](https://github.com/hashicorp/terraform-provider-azurerm/issues/29186))\n* `azurerm_kubernetes_cluster` - the `vm_size` property is now optional ([#29612](https://github.com/hashicorp/terraform-provider-azurerm/issues/29612))\n* `azurerm_kubernetes_cluster_node_pool` - the `vm_size` property is now optional ([#29612](https://github.com/hashicorp/terraform-provider-azurerm/issues/29612))\n* `azurerm_netapp_volume` - allow volumes made from snapshots to have a different pool than the original volume ([#29425](https://github.com/hashicorp/terraform-provider-azurerm/issues/29425))\n* `azurerm_netapp_volume` - add support for the `large_volume_enabled` property ([#29712](https://github.com/hashicorp/terraform-provider-azurerm/issues/29712))\n* `azurerm_postgresql_flexible_server` - add support for versionless key vault key IDs to the `customer_managed_key.key_vault_key_id` property ([#29741](https://github.com/hashicorp/terraform-provider-azurerm/issues/29741))\n* `azurerm_virtual_network` - add support for the `ip_address_pool` block ([#29021](https://github.com/hashicorp/terraform-provider-azurerm/issues/29021))\n* `azurerm_vpn_gateway` - export the `ip_configuration` block ([#29186](https://github.com/hashicorp/terraform-provider-azurerm/issues/29186))\n\nBUG FIXES:\n\n* Data Source: `azurerm_lb_backend_address_pool` - the `inbound_nat_rule_port_mapping.frontend_port` and `inbound_nat_rule_port_mapping.backend_port` are now set correctly ([#29791](https://github.com/hashicorp/terraform-provider-azurerm/issues/29791))\n* `keyvault` - fix locking around the keyvault cache ([#28330](https://github.com/hashicorp/terraform-provider-azurerm/issues/28330))\n\n## 4.31.0 (May 29, 2025)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_dev_center` ([#29716](https://github.com/hashicorp/terraform-provider-azurerm/issues/29716))\n* **New Resource**: `azurerm_network_manager_routing_configuration` ([#29310](https://github.com/hashicorp/terraform-provider-azurerm/issues/29310))\n\nENHANCEMENTS:\n\n* dependencies: `azurerm_managed_lustre_file_system` - update to API version `2024-07-01` ([#29433](https://github.com/hashicorp/terraform-provider-azurerm/issues/29433))\n* dependencies: `azurerm_mssql_server_vulnerability_assessment` - update to API version `2023-08-01-preview` ([#29373](https://github.com/hashicorp/terraform-provider-azurerm/issues/29373))\n* dependencies: `azurerm_virtual_machine_scale_set_standby_pool` - update to API version `2025-03-01` ([#29649](https://github.com/hashicorp/terraform-provider-azurerm/issues/29649))\n* dependencies: `compute` - partial update to API version `2024-11-01` ([#29666](https://github.com/hashicorp/terraform-provider-azurerm/issues/29666))\n* dependencies: `videoindexer` - update to API version `2025-04-01` ([#29715](https://github.com/hashicorp/terraform-provider-azurerm/issues/29715))\n* `azurerm_backup_protected_vm` - add support for the `BackupsSuspended` value to the `protection_state` property ([#29710](https://github.com/hashicorp/terraform-provider-azurerm/issues/29710))\n* `azurerm_dashboard_grafana_managed_private_endpoint` - add support for the `privatelink_service_url` property ([#29466](https://github.com/hashicorp/terraform-provider-azurerm/issues/29466))\n* `azurerm_dynatrace_tag_rules` - add support for the `sending_metrics_enabled` property ([#29499](https://github.com/hashicorp/terraform-provider-azurerm/issues/29499))\n* `azurerm_function_app_flex_consumption` - add support for the `https_only` property ([#29024](https://github.com/hashicorp/terraform-provider-azurerm/issues/29024))\n* `azurerm_mysql_flexible_server` - add support for the `MO_Standard_E96ads_v5` value to the `sku_name` property ([#29709](https://github.com/hashicorp/terraform-provider-azurerm/issues/29709))\n* `azurerm_postgresql_flexible_server` - lock the source server when creating a replica server ([#29337](https://github.com/hashicorp/terraform-provider-azurerm/issues/29337))\n\nBUG FIXES:\n\n* `azurerm_api_management_product` - allow setting the `subscriptions_limit` property to `0` ([#28133](https://github.com/hashicorp/terraform-provider-azurerm/issues/28133))\n* `azurerm_api_management_api` - add additional validation to catch when `api_type` is `websocket` but `service_url` is left empty ([#29624](https://github.com/hashicorp/terraform-provider-azurerm/issues/29624))\n* `azurerm_batch_pool` - the `data_disks` property will now be correctly updated ([#29377](https://github.com/hashicorp/terraform-provider-azurerm/issues/29377))\n* `azurerm_data_factory_dataset_binary` - fix incorrect casing of the `compression.type` property when sent to the API which caused compression to not be set ([#29273](https://github.com/hashicorp/terraform-provider-azurerm/issues/29273))\n* `azurerm_cdn_frontdoor_rule` - fix shared schema validation of the `operator` property and use the correct package for validations ([#29482](https://github.com/hashicorp/terraform-provider-azurerm/issues/29482))\n* `azurerm_hdinsight_hadoop_cluster` - changing the `script_action` property now forces a new resource to be created instead of silenty failing to update ([#28262](https://github.com/hashicorp/terraform-provider-azurerm/issues/28262))\n* `azurerm_hbase_hadoop_cluster` - changing the `script_action` property now forces a new resource to be created instead of silenty failing to update ([#28262](https://github.com/hashicorp/terraform-provider-azurerm/issues/28262))\n* `azurerm_interactive_query_hadoop_cluster` - changing the `script_action` property now forces a new resource to be created instead of silenty failing to update ([#28262](https://github.com/hashicorp/terraform-provider-azurerm/issues/28262))\n* `azurerm_kafka_hadoop_cluster` - changing the `script_action` property now forces a new resource to be created instead of silenty failing to update ([#28262](https://github.com/hashicorp/terraform-provider-azurerm/issues/28262))\n* `azurerm_linux_virtual_machine` - fix update for `identity` when VM has VMExtensions configured ([#29717](https://github.com/hashicorp/terraform-provider-azurerm/issues/29717))\n* `azurerm_mongo_cluster` - connection strings conaining a `$` now get exported correctly ([#29669](https://github.com/hashicorp/terraform-provider-azurerm/issues/29669))\n* `azurerm_mssql_virtual_machine` - `auto_patching` is now disabled when the block is not specified ([#29723](https://github.com/hashicorp/terraform-provider-azurerm/issues/29723))\n* `azurerm_mssql_server_vulnerability_assessment` - `storage_account_access_key` or `storage_container_sas_key` property is now a `required` field ([#29373](https://github.com/hashicorp/terraform-provider-azurerm/issues/29373))\n* `azurerm_network_interface` - `tags` can now be updated when NIC is attached to a private endpoint ([#29319](https://github.com/hashicorp/terraform-provider-azurerm/issues/29319))\n* `azurerm_postgresql_flexible_server_configuration` - now checks the server state before restarting it ([#29221](https://github.com/hashicorp/terraform-provider-azurerm/issues/29221))\n* `azurerm_search_service` - prevent a bug that cleared the `network_rule_bypass_option` property when only updating the `allowed_ips` property ([#29246](https://github.com/hashicorp/terraform-provider-azurerm/issues/29246))\n* `azurerm_service_fabric_managed_cluster` - support for the `subnet_id` property ([#29216](https://github.com/hashicorp/terraform-provider-azurerm/issues/29216))\n* `azurerm_spark_hadoop_cluster` - changing the `script_action` property now forces a new resource to be created instead of silenty failing to update ([#28262](https://github.com/hashicorp/terraform-provider-azurerm/issues/28262))\n\n## 4.30.0 (May 22, 2025)\n\nENHANCEMENTS:\n\n* dependencies: `go-azure-sdk` - update to `v0.20250520.1180806` ([#29665](https://github.com/hashicorp/terraform-provider-azurerm/issues/29665))\n* Data Source: `azurerm_managed_disk` - add support for `location` ([#29513](https://github.com/hashicorp/terraform-provider-azurerm/issues/29513))\n* `azurerm_dns_caa_record` - add support for the `contactemail` value in the `tag` property ([#29664](https://github.com/hashicorp/terraform-provider-azurerm/issues/29664))\n* `azurerm_eventhub_namespace_schema_group` - add support for the `Json` value in the `schema_type` property ([#29641](https://github.com/hashicorp/terraform-provider-azurerm/issues/29641))\n* `azurerm_function_app_flex_consumption` - add support for the `always_ready` block ([#29023](https://github.com/hashicorp/terraform-provider-azurerm/issues/29023))\n* `azurerm_security_center_subscription_pricing` - add support for the `AI` value for the `resource_type` property ([#29631](https://github.com/hashicorp/terraform-provider-azurerm/issues/29631))\n\n## 4.29.0 (May 16, 2025)\n\nFEATURES: \n\n* **New Resource**: `azurerm_system_center_virtual_machine_manager_virtual_machine_instance_guest_agent` ([#28953](https://github.com/hashicorp/terraform-provider-azurerm/issues/28953))\n\nENHANCEMENTS:\n\n* `azurerm_api_management_api` - fix `import` of resources ([#28193](https://github.com/hashicorp/terraform-provider-azurerm/issues/28193))\n* `azurerm_app_configuration` - add support for `developer` tier to the `sku` property ([#29492](https://github.com/hashicorp/terraform-provider-azurerm/issues/29492))\n* `azurerm_app_configuration` - the `sku` property can now be downgraded from `premium` to `standard` without recreating the resource ([#29492](https://github.com/hashicorp/terraform-provider-azurerm/issues/29492))\n* `azurerm_key_vault_managed_hardware_security_module_key` - add support for the `import` value in the `key_opts` property ([#29524](https://github.com/hashicorp/terraform-provider-azurerm/issues/29524))\n* `azurerm_netapp_pool` - add support for `cool_access_enabled` ([#29468](https://github.com/hashicorp/terraform-provider-azurerm/issues/29468))\n* `azurerm_network_manager_deployment` - add support for the `Routing` value in the `scope_access` property ([#29536](https://github.com/hashicorp/terraform-provider-azurerm/issues/29536))\n* `azurerm_private_endpoint_application_security_group_association` - resource is now removed from state if it no longer exist ([#29601](https://github.com/hashicorp/terraform-provider-azurerm/issues/29601))\n* `azurerm_virtual_machine_implicit_data_disk_from_source` - the `disk_size_gb` property can now be increased without recreating the resource ([#29239](https://github.com/hashicorp/terraform-provider-azurerm/issues/29239))\n* `azurerm_web_application_firewall_policy` - add support for the `JSChallenge` in the `action` property ([#29614](https://github.com/hashicorp/terraform-provider-azurerm/issues/29614))\n\nBUG FIXES:\n\n* `azurerm_api_management_api` - no longer returns an error on the  `oauth2_authorization` and `openid_authentication` properties when updating ([#29042](https://github.com/hashicorp/terraform-provider-azurerm/issues/29042))\n* `azurerm_route_map` - the validation for the `name` now allows numbers ([#29519](https://github.com/hashicorp/terraform-provider-azurerm/issues/29519))\n\n## 4.28.0 (May 09, 2025)\n\nFEATURES:\n\n* **New Resource**: `azurerm_nginx_api_key` ([#28919](https://github.com/hashicorp/terraform-provider-azurerm/issues/28919))\n* **New Data Source**: `azurerm_nginx_api_key` ([#28919](https://github.com/hashicorp/terraform-provider-azurerm/issues/28919))\n\nENHANCEMENTS:\n\n* dependencies: `azurerm_mssql_database` - Update to API version `2023-08-01-preview/replicationlinks` ([#28705](https://github.com/hashicorp/terraform-provider-azurerm/issues/28705))\n* dependencies: `azurerm_mssql_server_security_alert_policy` - update to API version `2023-08-01-preview/serversecurityalertpolicies` ([#29363](https://github.com/hashicorp/terraform-provider-azurerm/issues/29363))\n* dependencies: `eventhub` - update to API version `2024-01-01` ([#29397](https://github.com/hashicorp/terraform-provider-azurerm/issues/29397))\n* dependencies: `azurerm_shared_image_version` - update to API version `2024-03-01` ([#28954](https://github.com/hashicorp/terraform-provider-azurerm/issues/28954))\n* `azurerm_ai_foundry_project` - add support for the `primary_user_assigned_identity` property ([#29197](https://github.com/hashicorp/terraform-provider-azurerm/issues/29197))\n* `azurerm_storage_account_static_website` - the `index_document` property now has validation for length and excluding slashes ([#29431](https://github.com/hashicorp/terraform-provider-azurerm/issues/29431))\n\nBUG FIXES:\n\n* `azurerm_application_insights` - the `workspace_id` is now `Computed` ([#29396](https://github.com/hashicorp/terraform-provider-azurerm/issues/29396))\n* `azurerm_batch_pool` - prevent error when `certificate` is not used ([#29443](https://github.com/hashicorp/terraform-provider-azurerm/issues/29443))\n* `azurerm_nginx_deployment` - add support for the `web_application_firewall` property ([#27454](https://github.com/hashicorp/terraform-provider-azurerm/issues/27454))\n* `azurerm_postgresql_flexible_server_virtual_endpoint` - is no longer removed from state when a fail-over occurs ([#29424](https://github.com/hashicorp/terraform-provider-azurerm/issues/29424))\n* `azurerm_servicebus_queue` - no longer waits on resource creation ([#29435](https://github.com/hashicorp/terraform-provider-azurerm/issues/29435))\n* `azurerm_virtual_network_gateway` - prevent a panic when `vpn_client_configuration` is removed from from the configuration ([#29456](https://github.com/hashicorp/terraform-provider-azurerm/issues/29456))\n* `azurerm_web_pubsub_custom_certificate` - no longer crashes when `custom_certificate_id` is in a different subscription ([#29410](https://github.com/hashicorp/terraform-provider-azurerm/issues/29410))\n* `azurerm_windows_web_app` - fix perpetual diff around incorrect default for `always_on` and ignore default values for `logs.0.application_logs` ([#29150](https://github.com/hashicorp/terraform-provider-azurerm/issues/29150))\n* `azurerm_windows_web_app_slot` - fix perpetual diff around incorrect default for `always_on` and ignore default values for `logs.0.application_logs` ([#29150](https://github.com/hashicorp/terraform-provider-azurerm/issues/29150))\n\n## 4.27.0 (April 25, 2025)\n\nFEATURES:\n\n* **New Resource**: `azurerm_eventgrid_partner_configuration` ([#28676](https://github.com/hashicorp/terraform-provider-azurerm/issues/28676))\n\nENHANCEMENTS:\n\n* dependencies: update `go-azure-sdk` to `v0.20250409.1192141` ([#29307](https://github.com/hashicorp/terraform-provider-azurerm/issues/29307))\n* dependencies: `containerapps` - update to API version  `2025-01-01` ([#29296](https://github.com/hashicorp/terraform-provider-azurerm/issues/29296))\n* dependencies: `netapp` - update to API version `2025-01-01` ([#29382](https://github.com/hashicorp/terraform-provider-azurerm/issues/29382))\n* dependencies: `operationalinsights` - partial update to API version `2023-09-01` ([#29283](https://github.com/hashicorp/terraform-provider-azurerm/issues/29283))\n* `azurerm_cdn_frontdoor_origin` - support `managedEnvironments` value for `private_link.target_type` ([#28239](https://github.com/hashicorp/terraform-provider-azurerm/issues/28239))\n* `azurerm_cdn_frontdoor_origin` - add support for the `web_secondary` `Gateway` values in the `private_link.target_type` property ([#29380](https://github.com/hashicorp/terraform-provider-azurerm/issues/29380))\n* `azurerm_cognitive_deployment` - add support for the `Cohere` value in the `model.format` property ([#29143](https://github.com/hashicorp/terraform-provider-azurerm/issues/29143))\n* `azurerm_container_app_environment`: add support for cross subscription `log_analytics_workspace_id` ([#28740](https://github.com/hashicorp/terraform-provider-azurerm/issues/28740))\n* `azurerm_dev_center_project` - add support for the `identity` property ([#29278](https://github.com/hashicorp/terraform-provider-azurerm/issues/29278))\n* `azurerm_dynatrace_tag_rules` - the `log_rule` and `metric_rule` blocks and their properties are no longer `ForceNew` ([#29298](https://github.com/hashicorp/terraform-provider-azurerm/issues/29298))\n* `azurerm_monitor_data_collection_endpoint` - add support for the `metrics_ingestion_endpoint` attribute ([#29292](https://github.com/hashicorp/terraform-provider-azurerm/issues/29292))\n* `azurerm_mysql_flexible_server` - support for the `log_on_disk_enabled` property ([#28929](https://github.com/hashicorp/terraform-provider-azurerm/issues/28929))\n* `azurerm_subnet` - add support for the `Microsoft.PowerAutomate/hostedRpa` value in the `delegation.service_delegation.name` property ([#29271](https://github.com/hashicorp/terraform-provider-azurerm/issues/29271))\n* `azurerm_subnet` - add support for the `Microsoft.Network/applicationGateways` value in the `delegation.service_delegation.name` property ([#29361](https://github.com/hashicorp/terraform-provider-azurerm/issues/29361))\n* `azurerm_virtual_network` - add support for the `Microsoft.PowerAutomate/hostedRpa` value in the `subnet.delegation.service_delegation.name` property ([#29271](https://github.com/hashicorp/terraform-provider-azurerm/issues/29271))\n* `azurerm_virtual_network` - add support for the `Microsoft.Network/applicationGateways` value in the `subnet.delegation.service_delegation.name` property ([#29361](https://github.com/hashicorp/terraform-provider-azurerm/issues/29361))\n\nBUG FIXES:\n\n* provider: ensure `x-ms-correlation-request-id` header is only set once during list operations ([#28974](https://github.com/hashicorp/terraform-provider-azurerm/issues/28974))\n* `azurerm_app_configuration_feature` - suppress casing differences for `configuration_store_id` to prevent resource recreation ([#29285](https://github.com/hashicorp/terraform-provider-azurerm/issues/29285))\n* `azurerm_app_configuration_key` - suppress casing differences for `configuration_store_id` to prevent resource recreation ([#29285](https://github.com/hashicorp/terraform-provider-azurerm/issues/29285))\n* `azurerm_container_app_environment` - updates are now made using the `PATCH` method, preventing errors due to missing properties in the request ([#29317](https://github.com/hashicorp/terraform-provider-azurerm/issues/29317))\n* `azurerm_eventhub_namespace` - remove max items from network/ip rules as they can be increased above upon request ([#29333](https://github.com/hashicorp/terraform-provider-azurerm/issues/29333))\n* `azurerm_kusto_iothub_data_connection` - update `event_system_properties` validation and documentation to be more flexible ([#29314](https://github.com/hashicorp/terraform-provider-azurerm/issues/29314))\n* `azurerm_linux_web_app` - correctly read `backup.schedule.start_time` into state ([#29254](https://github.com/hashicorp/terraform-provider-azurerm/issues/29254))\n* `azurerm_netapp_volume` - update validation for `storage_quota_in_gb` to allow values from `50` to `102400` ([#29341](https://github.com/hashicorp/terraform-provider-azurerm/issues/29341))\n* `azurerm_postgresql_flexible_server` - downgrading `version` forces a new resource to be created ([#28559](https://github.com/hashicorp/terraform-provider-azurerm/issues/28559))\n* `azurerm_postgresql_flexible_server` - downgrading `storage_mb` forces a new resource to be created ([#29309](https://github.com/hashicorp/terraform-provider-azurerm/issues/29309))\n* `azurerm_private_endpoint` - `private_dns_zone_group.private_dns_zone_ids` can now be updated correctly ([#29329](https://github.com/hashicorp/terraform-provider-azurerm/issues/29329))\n* `azurerm_search_shared_private_link_service` - add locks to prevent conflicts when creating multiple instances ([#29294](https://github.com/hashicorp/terraform-provider-azurerm/issues/29294))\n\n## 4.26.0 (April 04, 2025)\n\nBREAKING CHANGES:\n\n* feature: The Provider `feature` configuration item `virtual_machines.graceful_shutdown` is now not used due to a breaking change in the `compute` API. This feature block setting is now deprecated and ignored if set and will be removed in v5.0 of the provider. ([#29185](https://github.com/hashicorp/terraform-provider-azurerm/issues/29185))\n* `azurerm_linux_virtual_machine` - the `vm_agent_platform_updates_enabled` property is now read-only due to a recent API breaking change ([#29211](https://github.com/hashicorp/terraform-provider-azurerm/issues/29211))\n* `azurerm_windows_virtual_machine` - the `vm_agent_platform_updates_enabled` property is now read-only due to a recent API breaking change ([#29211](https://github.com/hashicorp/terraform-provider-azurerm/issues/29211))\n\nFEATURES:\n\n* **New Data Source**: `azurerm_role_assignments` ([#29214](https://github.com/hashicorp/terraform-provider-azurerm/issues/29214))\n\nENHANCEMENTS:\n\n* dependencies: `azurerm_sentinel_automation_rule` - update to API version `2024-09-01` ([#29240](https://github.com/hashicorp/terraform-provider-azurerm/issues/29240))\n* dependencies: `devcenter` - update to API version `2025-02-01` ([#29240](https://github.com/hashicorp/terraform-provider-azurerm/issues/29240))\n* dependencies: `recoveryservices` - partial update to API version `2024-10-01` ([#29240](https://github.com/hashicorp/terraform-provider-azurerm/issues/29240))\n* Data Source: `azurerm_mssql_server` - export the `express_vulnerability_assessment_enabled` property ([#29168](https://github.com/hashicorp/terraform-provider-azurerm/issues/29168))\n* `azurerm_dashboard_grafana` - `grafana_major_version` is no longer ForceNew ([#29212](https://github.com/hashicorp/terraform-provider-azurerm/issues/29212))\n* `azurerm_data_factory_linked_service_sftp` - add support for SSH authentication and Key Vault secret references ([#28690](https://github.com/hashicorp/terraform-provider-azurerm/issues/28690))\n* `azurerm_databricks_workspace` - resources using managed resource groups that contain UC can now be deleted with the `force_delete` Provider Feature flag ([#29095](https://github.com/hashicorp/terraform-provider-azurerm/issues/29095))\n* `azurerm_mssql_server` - add support for the `express_vulnerability_assessment_enabled` property ([#29168](https://github.com/hashicorp/terraform-provider-azurerm/issues/29168))\n* `azurerm_mysql_flexible_server` - deprecate `public_network_access_enabled` in favor of `public_network_access` ([#28890](https://github.com/hashicorp/terraform-provider-azurerm/issues/28890))\n* `azurerm_netapp_volume` - `service_level` can now be updated ([#29209](https://github.com/hashicorp/terraform-provider-azurerm/issues/29209))\n* `azurerm_nginx_deployment` - `frontend_public`, `frontend_private`, and `network_interface` are no longer `ForceNew` ([#28577](https://github.com/hashicorp/terraform-provider-azurerm/issues/28577))\n* `azurerm_orchestrated_virtual_machine_scale_set` - add support for the `upgrade_mode` and `rolling_upgrade_policy` properties ([#28354](https://github.com/hashicorp/terraform-provider-azurerm/issues/28354))\n* `azurerm_static_webapp` - mark `app_settings` sensitive in schema ([#28689](https://github.com/hashicorp/terraform-provider-azurerm/issues/28689))\n\nBUG FIXES:\n\n* `azurerm_linux_virtual_machine` - `license_type` can now be updated to None ([#28786](https://github.com/hashicorp/terraform-provider-azurerm/issues/28786))\n* `azurerm_mysql_flexible_server` - prevent a panic when `customer_managed_key` is nil ([#29225](https://github.com/hashicorp/terraform-provider-azurerm/issues/29225))\n* `azurerm_traffic_manager_nested_endpoint` - remove `Computed` from `priority` property as these are assigned dynamically by the API ([#29217](https://github.com/hashicorp/terraform-provider-azurerm/issues/29217))\n\n## 4.25.0 (March 28, 2025)\n\nENHANCEMENTS:\n \n* dependencies: `go-azure-helpers` - update  to `0.72.0` ([#29206](https://github.com/hashicorp/terraform-provider-azurerm/issues/29206))\n* dependencies: `redisenterprise` - update to API version `2024-10-01` ([#29073](https://github.com/hashicorp/terraform-provider-azurerm/issues/29073))\n* dependencies: `servicefabricmanaged` - update to API version `2024-04-01` ([#29199](https://github.com/hashicorp/terraform-provider-azurerm/issues/29199))\n* Data Source: `azurerm_virtual_hub_connection` - add support for the `static_vnet_propagate_static_routes` property ([#28560](https://github.com/hashicorp/terraform-provider-azurerm/issues/28560))\n* `azurerm_cosmosdb_account` - add support for the `DeleteAllItemsByPartitionKey` value in the `capabilities` property ([#29126](https://github.com/hashicorp/terraform-provider-azurerm/issues/29126))\n* `azurerm_hdinsight_spark_cluster_resource` - add support for the `zones` property ([#28149](https://github.com/hashicorp/terraform-provider-azurerm/issues/28149))\n* `azurerm_linux_function_app` - add support for Python version `3.13` ([#29131](https://github.com/hashicorp/terraform-provider-azurerm/issues/29131))\n* `azurerm_linux_function_app_slot` - add support for Python version `3.13` ([#29131](https://github.com/hashicorp/terraform-provider-azurerm/issues/29131))\n* `azurerm_linux_web_app` - add support for Python version `3.13` ([#29131](https://github.com/hashicorp/terraform-provider-azurerm/issues/29131))\n* `azurerm_linux_web_app_slot` - add support for Python version `3.13` ([#29131](https://github.com/hashicorp/terraform-provider-azurerm/issues/29131))\n* `azurerm_log_analytics_workspace` - add support for the `LACluster` SKU ([#29137](https://github.com/hashicorp/terraform-provider-azurerm/issues/29137))\n* `azurerm_managed_disk` - allow disk expansion without downtime for all `storage_account_type` ([#28730](https://github.com/hashicorp/terraform-provider-azurerm/issues/28730))\n* `azurerm_mssql_job_agent` - add support for the `identity` and `sku` properties ([#29090](https://github.com/hashicorp/terraform-provider-azurerm/issues/29090))\n* `azurerm_network_manager` - `scope_accesses` is now optional ([#28781](https://github.com/hashicorp/terraform-provider-azurerm/issues/28781))\n* `azurerm_oracle_cloud_vm_cluster` - add support for the `system_version` property ([#29093](https://github.com/hashicorp/terraform-provider-azurerm/issues/29093))\n* `azurerm_powerbi_embedded `- add support for `A7` and `A8` values for `sku_name` ([#29153](https://github.com/hashicorp/terraform-provider-azurerm/issues/29153))\n* `azurerm_virtual_hub_connection` - add support for the `static_vnet_propagate_static_routes` property ([#28560](https://github.com/hashicorp/terraform-provider-azurerm/issues/28560))\n\nBUG FIXES\n\n* Data source: `azurerm_container_app_environment` - prevent an error when the log analytics workspace is in a different subscription ([#28647](https://github.com/hashicorp/terraform-provider-azurerm/issues/28647))\n* `azurerm_kubernetes_cluster_node_pool` - fix issue where `kubelet_disk_type` couldn't be updated, updating this will now rotate the node pool ([#29135](https://github.com/hashicorp/terraform-provider-azurerm/issues/29135))\n* `azurerm_linux_virtual_machine` - fix issue where a user assigned identity couldn't be removed from the resource ([#29157](https://github.com/hashicorp/terraform-provider-azurerm/issues/29157))\n* `azurerm_linux_virtual_machine_scale_set` - fix issue where a user assigned identity couldn't be removed from the resource ([#29157](https://github.com/hashicorp/terraform-provider-azurerm/issues/29157))\n* `azurerm_log_analytics_workspace` - prevent an error when the workspace is in a soft-deleted state and linked to a log analytics cluster ([#29137](https://github.com/hashicorp/terraform-provider-azurerm/issues/29137))\n* `azurerm_postgresql_flexible_server_virtual_endpoint` - add a lock on the replica server to prevent a race condition ([#29071](https://github.com/hashicorp/terraform-provider-azurerm/issues/29071))\n* `azurerm_signalr_service` - set `location` in payload when updating to prevent an API error ([#29184](https://github.com/hashicorp/terraform-provider-azurerm/issues/29184))\n* `azurerm_storage_account_queue_properties` - prevent a panic when the storage account is removed out of band ([#28371](https://github.com/hashicorp/terraform-provider-azurerm/issues/28371))\n* `azurerm_storage_account_static_website` - prevent a panic when the storage account is removed out of band ([#28371](https://github.com/hashicorp/terraform-provider-azurerm/issues/28371))\n* `azurerm_stream_analytics_job` - update validation to notify users if `content_storage_policy` hasn't been correctly set to setup `job_storage_account` ([#29158](https://github.com/hashicorp/terraform-provider-azurerm/issues/29158))\n\n## 4.24.0 (March 21, 2025)\n\nFEATURES:\n\n* **New Resource**: `azurerm_servicebus_namespace_customer_managed_key` ([#28888](https://github.com/hashicorp/terraform-provider-azurerm/issues/28888))\n* **New Resource**: `azurerm_stream_analytics_job_storage_account` ([#29113](https://github.com/hashicorp/terraform-provider-azurerm/issues/29113))\n* **New Resource**: `azurerm_web_pubsub_socketio` ([#28992](https://github.com/hashicorp/terraform-provider-azurerm/issues/28992))\n\nENHANCEMENTS:\n\n* dependencies: `hashicorp/go-azure-sdk` - update to `v0.20250314.1213156` ([#29081](https://github.com/hashicorp/terraform-provider-azurerm/issues/29081))\n* dependencies: `loganalytics` - partial update to API version `2023-03-01` ([#28977](https://github.com/hashicorp/terraform-provider-azurerm/issues/28977))\n* dependencies: `monitor` - partial update to API version `2023-03-01` ([#28977](https://github.com/hashicorp/terraform-provider-azurerm/issues/28977))\n* dependencies: `postgresql` - partial update to API version `2024-08-01` ([#28964](https://github.com/hashicorp/terraform-provider-azurerm/issues/28964))\n* Data Source: `azurerm_linux_function_app` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n* Data Source: `azurerm_linux_web_app` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n* Data Source: `azurerm_windows_function_app` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n* `azurerm_ai_services` - add support for the `network_acls.bypass` property ([#28569](https://github.com/hashicorp/terraform-provider-azurerm/issues/28569))\n* `azurerm_dashboard_grafana` - add support for `grafana_major_version` `11` ([#28884](https://github.com/hashicorp/terraform-provider-azurerm/issues/28884))\n* `azurerm_kubernetes_cluster_node_pool` - remove call to retrieve the parent cluster in the read ([#29088](https://github.com/hashicorp/terraform-provider-azurerm/issues/29088))\n* `azurerm_linux_function_app` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n* `azurerm_linux_function_app` - set `pre_warmed_instance_count` on create ([#28739](https://github.com/hashicorp/terraform-provider-azurerm/issues/28739))\n* `azurerm_linux_function_app_slot` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n* `azurerm_linux_web_app` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n* `azurerm_linux_web_app_slot` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n* `azurerm_redis_cache` - tighten validation for `sku_name`, `family`, `capacity` ([#29079](https://github.com/hashicorp/terraform-provider-azurerm/issues/29079))\n* `azurerm_windows_function_app` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n* `azurerm_windows_function_app` - set `pre_warmed_instance_count` on create ([#28739](https://github.com/hashicorp/terraform-provider-azurerm/issues/28739))\n* `azurerm_windows_function_app_slot` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n* `azurerm_windows_web_app` - add support for node version `~22` ([#29082](https://github.com/hashicorp/terraform-provider-azurerm/issues/29082))\n* `azurerm_windows_web_app` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n* `azurerm_windows_web_app_slot` - add support for node version `~22` ([#29082](https://github.com/hashicorp/terraform-provider-azurerm/issues/29082))\n* `azurerm_windows_web_app_slot` - add support for the `virtual_network_backup_restore_enabled` property ([#29012](https://github.com/hashicorp/terraform-provider-azurerm/issues/29012))\n\nBUG FIXES:\n\n* `azurerm_app_configuration` - the `encryption` block can now be removed ([#28173](https://github.com/hashicorp/terraform-provider-azurerm/issues/28173))\n* `azurerm_cdn_frontdoor_origin_group` - `health_probe` no longer resets during update unless specified ([#29094](https://github.com/hashicorp/terraform-provider-azurerm/issues/29094))\n* `azurerm_cognitive_account` - `customer_managed_key` can now be removed ([#28368](https://github.com/hashicorp/terraform-provider-azurerm/issues/28368))\n* `azurerm_container_group` - `dns_name_label_reuse_policy` is now marked as ForceNew ([#29040](https://github.com/hashicorp/terraform-provider-azurerm/issues/29040))\n* `azurerm_disk_encryption_set` - prevent crash when retrieving Key Vault details when updating ([#29018](https://github.com/hashicorp/terraform-provider-azurerm/issues/29018))\n* `azurerm_express_route_circuit` - fix issue where `bandwidth_in_mbps` isn't updated correctly ([#28822](https://github.com/hashicorp/terraform-provider-azurerm/issues/28822))\n* `azurerm_key_vault_secret` - revert CustomizeDiff logic to recreate the resource when `expiration_date` is removed ([#28920](https://github.com/hashicorp/terraform-provider-azurerm/issues/28920))\n* `azurerm_kubernetes_cluster` - `fips_enabled` can be updated by cycling the default node pool ([#29096](https://github.com/hashicorp/terraform-provider-azurerm/issues/29096))\n* `azurerm_monitor_diagnostic_setting` - the `enabled_log` block can now be removed ([#28485](https://github.com/hashicorp/terraform-provider-azurerm/issues/28485))\n* `azurerm_mssql_database` - fix validation for `auto_pause_delay_in_minutes` ([#28670](https://github.com/hashicorp/terraform-provider-azurerm/issues/28670))\n* `azurerm_mssql_server` - fix an issue where the provider would incorrectly error during plan operations if `administrator_login` or `administrator_login_password` were added to `lifecycle.ignore_changes` ([#29107](https://github.com/hashicorp/terraform-provider-azurerm/issues/29107))\n\n## 4.23.0 (March 13, 2025)\n\nNOTES:\n\n* `azurerm_key_vault_secret` - resource now supports the `value_wo`[write-only argument](https://developer.hashicorp.com/terraform/language/v1.11.x/resources/ephemeral#write-only-arguments) ([#28947](https://github.com/hashicorp/terraform-provider-azurerm/issues/28947))\n\nFEATURES:\n\n* **New Resource**: `azurerm_network_manager_ipam_pool` ([#28695](https://github.com/hashicorp/terraform-provider-azurerm/issues/28695))\n\nENHANCEMENTS:\n\n* dependencies: update `Go` version to `1.24.1` ([#28999](https://github.com/hashicorp/terraform-provider-azurerm/issues/28999))\n* dependencies: `hashicorp/go-azure-sdk` - update to `v0.20250310.1130319` ([#29009](https://github.com/hashicorp/terraform-provider-azurerm/issues/29009))\n* `azurerm_cognitive_deployment` - add support for `DataZoneBatch` in the `sku.name` property ([#28973](https://github.com/hashicorp/terraform-provider-azurerm/issues/28973))\n* `azurerm_mongo_cluster` - add support for `M10`, `M20`, and `M200` compute tiers ([#29026](https://github.com/hashicorp/terraform-provider-azurerm/issues/29026))\n\n\nBUG FIXES:\n\n* `azurerm_linux_function_app` - fix validation for `site_config.application_stack.node_version` to allow `22` ([#28988](https://github.com/hashicorp/terraform-provider-azurerm/issues/28988))\n* `azurerm_postgresql_flexible_server` - fix validation for `customer_managed_key.key_vault_key_id` and `customer_managed_key.geo_backup_key_id` to disallow versionless keys preventing unclear error messages ([#28981](https://github.com/hashicorp/terraform-provider-azurerm/issues/28981))\n* `azurerm_web_pubsub_hub` - validation for the `auth.managed_identity_id` now supports token audience as a valid input ([#28495](https://github.com/hashicorp/terraform-provider-azurerm/issues/28495))\n\n## 4.22.0 (March 07, 2025)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_extended_location_custom_location` ([#28066](https://github.com/hashicorp/terraform-provider-azurerm/issues/28066))\n* **New Resource**: `azurerm_system_center_virtual_machine_manager_virtual_machine_instance` ([#27622](https://github.com/hashicorp/terraform-provider-azurerm/issues/27622))\n\nENHANCEMENTS: \n\n* dependencies: `containers` - update API version to  `2024-09-01` ([#28598](https://github.com/hashicorp/terraform-provider-azurerm/issues/28598))\n* dependencies: `hashicorp/go-azure-sdk` - update to `v0.20250227.1125644` ([#28902](https://github.com/hashicorp/terraform-provider-azurerm/issues/28902))\n* dependencies: `signalr` - update API version to `2024-03-01` ([#28940](https://github.com/hashicorp/terraform-provider-azurerm/issues/28940))\n* Data Source: `azurerm_container_app` - add support for the `template.volume.mount_options` property ([#28619](https://github.com/hashicorp/terraform-provider-azurerm/issues/28619))\n* Data Source: `azurerm_storage_account_queue_properties` - now gets the parent account directly rather than searching the list of all accounts when the Resource Manager ID is available ([#28617](https://github.com/hashicorp/terraform-provider-azurerm/issues/28617))\n* Data Source: `azurerm_storage_account_static_website` - now gets the parent account directly rather than searching the list of all accounts when the Resource Manager ID is available ([#28617](https://github.com/hashicorp/terraform-provider-azurerm/issues/28617))\n* Data Source: `azurerm_storage_containers` - now gets the parent account directly rather than searching the list of all accounts when the Resource Manager ID is available ([#28617](https://github.com/hashicorp/terraform-provider-azurerm/issues/28617))\n* `azurerm_api_connection` - `display_name` and `parameter_values` are no longer `ForceNew` ([#28721](https://github.com/hashicorp/terraform-provider-azurerm/issues/28721))\n* `azurerm_cdn_frontdoor_firewall_policy` - add support for the `log_scrubbing` properties ([#28834](https://github.com/hashicorp/terraform-provider-azurerm/issues/28834))\n* `azurerm_container_app` - add support for the `template.volume.mount_options` property ([#28619](https://github.com/hashicorp/terraform-provider-azurerm/issues/28619))\n* `azurerm_container_app_job` - add support for the `template.volume.mount_options` property ([#28619](https://github.com/hashicorp/terraform-provider-azurerm/issues/28619))\n* `azurerm_extended_custom_location` - deprecated in favour of `azurerm_extended_location_custom_location` ([#28066](https://github.com/hashicorp/terraform-provider-azurerm/issues/28066))\n* `azurerm_mongo_cluster` - add support for the `connection_strings` attribute ([#28880](https://github.com/hashicorp/terraform-provider-azurerm/issues/28880))\n* `azurerm_storage_account` - now gets the parent account directly rather than searching the list of all accounts when the Resource Manager ID is available ([#28617](https://github.com/hashicorp/terraform-provider-azurerm/issues/28617))\n* `azurerm_storage_account_queue_properties` - now gets the parent account directly rather than searching the list of all accounts when the Resource Manager ID is available ([#28617](https://github.com/hashicorp/terraform-provider-azurerm/issues/28617))\n* `azurerm_storage_account_static_website` - now gets the parent account directly rather than searching the list of all accounts when the Resource Manager ID is available ([#28617](https://github.com/hashicorp/terraform-provider-azurerm/issues/28617))\n* `azurerm_workloads_sap_discovery_virtual_instance` - add support for the `managed_resources_network_access_type` property ([#28881](https://github.com/hashicorp/terraform-provider-azurerm/issues/28881))\n* `azurerm_workloads_sap_single_node_virtual_instance` - add support for the `managed_resources_network_access_type` property ([#28881](https://github.com/hashicorp/terraform-provider-azurerm/issues/28881))\n* `azurerm_workloads_sap_three_tier_virtual_instance` - add support for the `managed_resources_network_access_type` property ([#28881](https://github.com/hashicorp/terraform-provider-azurerm/issues/28881))\n\nBUG FIXES:\n\n* `azurerm_api_management_api` - split create/update methods ([#28271](https://github.com/hashicorp/terraform-provider-azurerm/issues/28271))\n* `azurerm_express_route_circuit` - `allow_classic_operations` is now set when resource is created ([#28748](https://github.com/hashicorp/terraform-provider-azurerm/issues/28748))\n* `azurerm_key_vault_certificate` - set partial when updating key vault certificate ([#28848](https://github.com/hashicorp/terraform-provider-azurerm/issues/28848))\n* `azurerm_managed_disk` - always set `network_access_policy` into state to allow Terraform to detect drift ([#28934](https://github.com/hashicorp/terraform-provider-azurerm/issues/28934))\n* `azurerm_mssql_managed_instance` - fix an issue that prevented using values only known during apply for `administrator_login_password` ([#28843](https://github.com/hashicorp/terraform-provider-azurerm/issues/28843))\n* `azurerm_mssql_server` - prevent panic by removing function call on a value that may be unknown ([#28949](https://github.com/hashicorp/terraform-provider-azurerm/issues/28949))\n\n\n## 4.21.1 (February 28, 2025)\n\nBUG FIXES:\n\n* `azurerm_mssql_server` - prevent panic by checking if `administrator_login` exists in the raw config map ([#28909](https://github.com/hashicorp/terraform-provider-azurerm/issues/28909))\n\n\n## 4.21.0 (February 27, 2025)\n\nNOTES:\n\n* The `azurerm_mssql_job_credential` resource now supports the `password_wo` [write-only argument](https://developer.hashicorp.com/terraform/language/v1.11.x/resources/ephemeral#write-only-arguments)\n* The `azurerm_mssql_server` resource now supports the `administrator_login_password_wo` [write-only argument](https://developer.hashicorp.com/terraform/language/v1.11.x/resources/ephemeral#write-only-arguments)\n* The `azurerm_mysql_flexible_server` resource now supports the `administrator_password_wo` [write-only argument](https://developer.hashicorp.com/terraform/language/v1.11.x/resources/ephemeral#write-only-arguments)\n* The `azurerm_postgresql_flexible_server` resource now supports the `administrator_password_wo` [write-only argument](https://developer.hashicorp.com/terraform/language/v1.11.x/resources/ephemeral#write-only-arguments)\n* The `azurerm_postgresql_server` resource now supports the `administrator_login_password_wo` [write-only argument](https://developer.hashicorp.com/terraform/language/v1.11.x/resources/ephemeral#write-only-arguments)\n\nFEATURES:\n\n* **New Resource**: `azurerm_linux_function_app_flex_consumption` ([#28199](https://github.com/hashicorp/terraform-provider-azurerm/issues/28199))\n* **New Resource**: `azurerm_network_manager_verifier_workspace` ([#28754](https://github.com/hashicorp/terraform-provider-azurerm/issues/28754))\n\nENHANCEMENTS:\n\n* dependencies: `azurerm_kubernetes_cluster_trusted_access_role_binding` - update API version to `2024-05-01` ([#28853](https://github.com/hashicorp/terraform-provider-azurerm/issues/28853))\n* dependencies: `desktopvirtualization` - update API version to `2024-04-03` ([#28771](https://github.com/hashicorp/terraform-provider-azurerm/issues/28771))\n* dependencies: `kusto` - update API version to `2024-04-13` ([#28685](https://github.com/hashicorp/terraform-provider-azurerm/issues/28685))\n* dependencies: `redis` - update API version to `2024-11-01` ([#28696](https://github.com/hashicorp/terraform-provider-azurerm/issues/28696))\n* dependencies: `workloads` - update API version to `2024-09-01` ([#28825](https://github.com/hashicorp/terraform-provider-azurerm/issues/28825))\n* `azurerm_fluid_relay_server` - fix `versionless_id` support for `key_vault_key_id` ([#28864](https://github.com/hashicorp/terraform-provider-azurerm/issues/28864))\n* `azurerm_kubernetes_cluster` - add support for the `upgrade_override_setting` property ([#27962](https://github.com/hashicorp/terraform-provider-azurerm/issues/27962))\n* `azurerm_kusto_cluster_principal_assignment` - add support for `AllDatabaseMonitor` role type ([#28685](https://github.com/hashicorp/terraform-provider-azurerm/issues/28685))\n* `azurerm_linux_function_app` - correctly update `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` when changed in `app_settings` ([#28859](https://github.com/hashicorp/terraform-provider-azurerm/issues/28859))\n* `azurerm_linux_function_app_slot` - correctly update `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` when changed in `app_settings` ([#28859](https://github.com/hashicorp/terraform-provider-azurerm/issues/28859))\n* `azurerm_linux_web_app` - add support for Node Version `22` ([#28840](https://github.com/hashicorp/terraform-provider-azurerm/issues/28840))\n* `azurerm_linux_web_app_slot` - add support for Node Version `22` ([#28840](https://github.com/hashicorp/terraform-provider-azurerm/issues/28840))\n* `azurerm_logic_app_standard` - add support for the `vnet_content_share_enabled` property ([#28879](https://github.com/hashicorp/terraform-provider-azurerm/issues/28879))\n* `azurerm_mssql_job_credential` - add support for the `password_wo` and `password_wo_version` properties ([#28808](https://github.com/hashicorp/terraform-provider-azurerm/issues/28808))\n* `azurerm_mssql_managed_instance` - add support for the `database_format` and `hybrid_secondary_usage` properties ([#28248](https://github.com/hashicorp/terraform-provider-azurerm/issues/28248))\n* `azurerm_mssql_server` - add support for the `administrator_login_password_wo` and `administrator_login_password_wo_version` properties ([#28818](https://github.com/hashicorp/terraform-provider-azurerm/issues/28818))\n* `azurerm_mysql_flexible_server` - add support for the `administrator_password_wo` and `administrator_password_wo_version` properties ([#28799](https://github.com/hashicorp/terraform-provider-azurerm/issues/28799))\n* `azurerm_postgresql_flexible_server` - add support for the `administrator_password_wo` and `administrator_password_wo_version` properties ([#28857](https://github.com/hashicorp/terraform-provider-azurerm/issues/28857))\n* `azurerm_postgresql_server` - add support for the `administrator_login_password_wo` and `administrator_login_password_wo_version` properties ([#28856](https://github.com/hashicorp/terraform-provider-azurerm/issues/28856))\n* `azurerm_service_plan` - add support for the `I1mv2`, `I2mv2`, `I3mv2`, `I4mv2`, `I5mv2` skus ([#28316](https://github.com/hashicorp/terraform-provider-azurerm/issues/28316))\n* `azurerm_servicebus_namespace` - split create/update functions ([#28539](https://github.com/hashicorp/terraform-provider-azurerm/issues/28539))\n* `azurerm_storage_account` - nested attributes in `immutability_policy` can now be updated ([#28122](https://github.com/hashicorp/terraform-provider-azurerm/issues/28122))\n* `azurerm_windows_function_app` - correctly update `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` when changed in `app_settings` ([#28859](https://github.com/hashicorp/terraform-provider-azurerm/issues/28859))\n* `azurerm_windows_function_app_slot` - correctly update `WEBSITE_CONTENTSHARE` and `WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` when changed in `app_settings` ([#28859](https://github.com/hashicorp/terraform-provider-azurerm/issues/28859))\n\n\nBUG FIXES:\n\n* `azurerm_key_vault_secret` - recreate the resource if `expiration_date` is removed after having been set ([#28494](https://github.com/hashicorp/terraform-provider-azurerm/issues/28494))\n* `azurerm_log_analytics_cluster_customer_managed_key` - fix error due to read-only property included in request payload during create/update/delete operations ([#28862](https://github.com/hashicorp/terraform-provider-azurerm/issues/28862))\n* `azurerm_log_analytics_cluster_customer_managed_key` - remove resource from state when deleted outside of Terraform ([#28862](https://github.com/hashicorp/terraform-provider-azurerm/issues/28862))\n* `azurerm_log_analytics_cluster_customer_managed_key` - fix resource delete function ([#28862](https://github.com/hashicorp/terraform-provider-azurerm/issues/28862))\n* `azurerm_security_center_pricing` - updating `subplan` now recreates the resource to work around API behaviour that enables certain settings on updated ([#27805](https://github.com/hashicorp/terraform-provider-azurerm/issues/27805))\n* `azurerm_windows_web_app` - fix change detection for `tomcat_version` ([#28842](https://github.com/hashicorp/terraform-provider-azurerm/issues/28842))\n\n## 4.20.0 (February 20, 2025)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_dynatrace_monitor` ([#28381](https://github.com/hashicorp/terraform-provider-azurerm/issues/28381))\n* **New Resource**: `azurerm_data_protection_backup_vault_customer_managed_key` ([#28679](https://github.com/hashicorp/terraform-provider-azurerm/issues/28679))\n\nENHANCEMENTS:\n\n* dependencies: `hashicorp/terraform-plugin-sdk/v2` - update to `v2.36.0` ([#28788](https://github.com/hashicorp/terraform-provider-azurerm/issues/28788))\n* dependencies: `azurerm_data_factory_pipeline` - update to use `hashicorp/go-azure-sdk` ([#28768](https://github.com/hashicorp/terraform-provider-azurerm/issues/28768))\n* Data Source: `azurerm_logic_app_standard` - add support for the `ftp_publish_basic_authentication_enabled` and `scm_publish_basic_authentication_enabled` properties ([#28763](https://github.com/hashicorp/terraform-provider-azurerm/issues/28763))\n* `azurerm_logic_app_standard` - add support for the `ftp_publish_basic_authentication_enabled` and `scm_publish_basic_authentication_enabled` properties ([#28763](https://github.com/hashicorp/terraform-provider-azurerm/issues/28763))\n* `azurerm_pim_active_role_assignment` - add support for Azure RBAC conditions ([#27947](https://github.com/hashicorp/terraform-provider-azurerm/issues/27947))\n* `azurerm_storage_container` - add support for migrating from deprecated `storage_account_name` to  `storage_account_id` ([#28784](https://github.com/hashicorp/terraform-provider-azurerm/issues/28784))\n* `azurerm_storage_share` - add support for migrating from deprecated `storage_account_name` to  `storage_account_id` ([#28784](https://github.com/hashicorp/terraform-provider-azurerm/issues/28784))\n* `azurerm_storage_table` - add attribute `resource_manager_id` ([#28809](https://github.com/hashicorp/terraform-provider-azurerm/issues/28809))\n* `azurerm_windows_function_app` - add support for node `~22` ([#28815](https://github.com/hashicorp/terraform-provider-azurerm/issues/28815))\n* `azurerm_windows_function_app_slot` - add support for node `~22` ([#28815](https://github.com/hashicorp/terraform-provider-azurerm/issues/28815))\n\nBUG FIXES:\n\n* Data Source: `azurerm_container_app` - add missing `ingress.client_certificate_mode` property that caused an error when retrieving data ([#28793](https://github.com/hashicorp/terraform-provider-azurerm/issues/28793))\n* `azurerm_data_factory_pipeline` - fix error when unmarshaling the headers for a web activity ([#28768](https://github.com/hashicorp/terraform-provider-azurerm/issues/28768))\n* `azurerm_mssql_virtual_machine` - fix an issue that prevented users from using values only known during apply as the value for `auto_backup.encryption_password` ([#28223](https://github.com/hashicorp/terraform-provider-azurerm/issues/28223))\n\n## 4.19.0 (February 14, 2025)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_stack_hci_storage_path` ([#28602](https://github.com/hashicorp/terraform-provider-azurerm/issues/28602))\n* **New Resource**: `azurerm_ai_foundry` ([#27424](https://github.com/hashicorp/terraform-provider-azurerm/issues/27424))\n* **New Resource**: `azurerm_ai_foundry_project` ([#27424](https://github.com/hashicorp/terraform-provider-azurerm/issues/27424))\n* **New Resource**: `azurerm_mssql_job_step` ([#28691](https://github.com/hashicorp/terraform-provider-azurerm/issues/28691))\n* **New Resource**: `azurerm_netapp_volume_group_oracle` ([#28391](https://github.com/hashicorp/terraform-provider-azurerm/issues/28391))\n* **New Resource**: `azurerm_virtual_machine_scale_set_standby_pool` ([#28441](https://github.com/hashicorp/terraform-provider-azurerm/issues/28441))\n\nENHANCEMENTS:\n\n* dependencies: `hashicorp/go-azure-sdk` update to `v0.20250213.1092825` ([#28767](https://github.com/hashicorp/terraform-provider-azurerm/issues/28767))\n* dependencies: `sentinel` partial update to `2023-12-01-preview` ([#28195](https://github.com/hashicorp/terraform-provider-azurerm/issues/28195))\n* Data Source: `azurerm_app_configuration` - add support for the `data_plane_proxy_authentication_mode` and `data_plane_proxy_private_link_delegation_enabled` properties ([#28712](https://github.com/hashicorp/terraform-provider-azurerm/issues/28712))\n* `azurerm_app_configuration` - add support for the `data_plane_proxy_authentication_mode` and `data_plane_proxy_private_link_delegation_enabled` properties ([#28712](https://github.com/hashicorp/terraform-provider-azurerm/issues/28712))\n* `azurerm_container_app` - add support for the `client_certificate_mode` property ([#28523](https://github.com/hashicorp/terraform-provider-azurerm/issues/28523))\n* `azurerm_cdn_frontdoor_firewall_policy` - add support for `JSChallenge` for `custom` rules ([#28717](https://github.com/hashicorp/terraform-provider-azurerm/issues/28717))\n* `azurerm_express_route_circuit` - add support for the `rate_limiting_enabled` property ([#28659](https://github.com/hashicorp/terraform-provider-azurerm/issues/28659))\n* `azurerm_mssql_managed_instance_failover_group` - add support for `secondary_type` ([#28633](https://github.com/hashicorp/terraform-provider-azurerm/issues/28633))\n* `azurerm_sentinal_alert_rule_scheduled` - increase combined limit of `entity_mapping` and `sentinal_entity_mapping` to 10 ([#28195](https://github.com/hashicorp/terraform-provider-azurerm/issues/28195))\n* `azurerm_service_plan` - support for `premium_plan_auto_scale_enabled` ([#28524](https://github.com/hashicorp/terraform-provider-azurerm/issues/28524))\n\nBUG FIXES:\n\n* `azurerm_cdn_frontdoor_firewall_policy` - fixed issue where the `js_challenge_cookie_expiration_in_minutes` policies `default` value caused `Standard_AzureFrontDoor` skus to receive a `BadRequest` error ([#28726](https://github.com/hashicorp/terraform-provider-azurerm/issues/28726))\n* `azurerm_servicebus_topic` - prevent perma diff when provisioning a partitioned topic within a non-partitioned namespace ([#26680](https://github.com/hashicorp/terraform-provider-azurerm/issues/26680))\n* `azurerm_linux_function_app` - will no longer plan when `site_config.0.cors` is the default value ([#28703](https://github.com/hashicorp/terraform-provider-azurerm/issues/28703))\n* `azurerm_linux_function_app_slot` - fix issue where `site_config.0.elastic_instance_minimum` was not being set ([#28725](https://github.com/hashicorp/terraform-provider-azurerm/issues/28725))\n* `azurerm_linux_web_app` - will no longer plan when `site_config.0.cors` is the default value ([#28703](https://github.com/hashicorp/terraform-provider-azurerm/issues/28703))\n* `azurerm_postgresql_flexible_server_virtual_endpoint` - allow `source_server_id` and `replica_server_id` to reference the same server ([#28733](https://github.com/hashicorp/terraform-provider-azurerm/issues/28733))\n* `azurerm_windows_function_app` - will no longer plan when `site_config.0.cors` is the default value ([#28703](https://github.com/hashicorp/terraform-provider-azurerm/issues/28703))\n* `azurerm_windows_function_app_slot` - fix issue where `site_config.0.elastic_instance_minimum` was not being set ([#28725](https://github.com/hashicorp/terraform-provider-azurerm/issues/28725))\n* `azurerm_windows_web_app` - will no longer plan when `site_config.0.cors` is the default value ([#28703](https://github.com/hashicorp/terraform-provider-azurerm/issues/28703))\n\n## 4.18.0 (February 07, 2025)\n\nENHANCEMENTS:\n\n* dependencies: `appconfiguration` - update to API version `2024-05-01` ([#28700](https://github.com/hashicorp/terraform-provider-azurerm/issues/28700))\n* dependencies: update `azurerm_cdn_frontdoor_rule` to API version `2024-02-01` ([#28308](https://github.com/hashicorp/terraform-provider-azurerm/issues/28308))\n* dependencies: update `azurerm_cdn_frontdoor_ruleset` to API version `2024-02-01` ([#28308](https://github.com/hashicorp/terraform-provider-azurerm/issues/28308))\n* dependencies: update `go-azure-sdk` to `v0.20250131.1134653` ([#28674](https://github.com/hashicorp/terraform-provider-azurerm/issues/28674))\n* Data Source: `azurerm_cdn_frontdoor_firewall_policy` - add support for `js_challenge_cookie_expiration_in_minutes` policy ([#28284](https://github.com/hashicorp/terraform-provider-azurerm/issues/28284))\n* Data Source: `azurerm_nginx_configuration` - add support for the `protected_file.content_hash` property ([#28532](https://github.com/hashicorp/terraform-provider-azurerm/issues/28532))\n* `azurerm_cdn_frontdoor_firewall_policy` - add support for `js_challenge_cookie_expiration_in_minutes` policy ([#28284](https://github.com/hashicorp/terraform-provider-azurerm/issues/28284))\n* `azurerm_cdn_frontdoor_firewall_policy` - add support for `JSChallenge` `action` type in the `managed_rule` `override` block ([#28308](https://github.com/hashicorp/terraform-provider-azurerm/issues/28308))\n* `azurerm_container_app` - add support for the `volume_mounts.sub_path` property ([#27533](https://github.com/hashicorp/terraform-provider-azurerm/issues/27533))\n* `azurerm_nginx_configuration` - add support for the `protected_file.content_hash` property ([#28532](https://github.com/hashicorp/terraform-provider-azurerm/issues/28532))\n* `azurerm_palo_alto_next_generation_firewall_virtual_hub_local_rulestack` - add support for the `marketplace_offer_id` and `plan_id` properties ([#28537](https://github.com/hashicorp/terraform-provider-azurerm/issues/28537))\n* `azurerm_palo_alto_next_generation_firewall_virtual_hub_panorama` - add support for the `marketplace_offer_id` and `plan_id` properties ([#28537](https://github.com/hashicorp/terraform-provider-azurerm/issues/28537))\n* `azurerm_palo_alto_next_generation_firewall_virtual_network_local_rulestack` - add support for the `marketplace_offer_id` and `plan_id` properties ([#28537](https://github.com/hashicorp/terraform-provider-azurerm/issues/28537))\n* `azurerm_palo_alto_next_generation_firewall_virtual_network_panorama` - add support for the `marketplace_offer_id` and `plan_id` properties ([#28537](https://github.com/hashicorp/terraform-provider-azurerm/issues/28537))\n* `azurerm_route_server` - add support for the `hub_routing_preference` property ([#28363](https://github.com/hashicorp/terraform-provider-azurerm/issues/28363))\n\nBUG FIXES:\n\n* `azurerm_logic_app_action_http` - fix issue where `queries` would be set to an empty map instead of null when omitted from the configuration ([#28447](https://github.com/hashicorp/terraform-provider-azurerm/issues/28447))\n* `azurerm_machine_learning_compute_cluster` - allow resource creation when `node_public_ip_enabled` is `false` and `subnet_resource_id` has not been specified ([#28673](https://github.com/hashicorp/terraform-provider-azurerm/issues/28673))\n* `azurerm_network_watcher_flow_log` - prevent panic when removing the `traffic_analytics` block ([#28416](https://github.com/hashicorp/terraform-provider-azurerm/issues/28416))\n* `azurerm_oracle_autonomous_database` - fix incorrect type for the `supported_regions_to_clone_to` property ([#28536](https://github.com/hashicorp/terraform-provider-azurerm/issues/28536))\n\n## 4.17.0 (January 31, 2025)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_api_management_subscription` ([#27824](https://github.com/hashicorp/terraform-provider-azurerm/issues/27824))\n* **New Resource**: `azurerm_cognitive_account_rai_policy` ([#28013](https://github.com/hashicorp/terraform-provider-azurerm/issues/28013))\n* **New Resource**: `azurerm_mssql_job_target_group` ([#28492](https://github.com/hashicorp/terraform-provider-azurerm/issues/28492))\n\nENHANCEMENTS:\n\n* dependencies: `network` - update to use `2024-05-01` ([#28146](https://github.com/hashicorp/terraform-provider-azurerm/issues/28146))\n* dependencies: `privatedns` - update to use `2024-06-01` ([#28599](https://github.com/hashicorp/terraform-provider-azurerm/issues/28599))\n* dependencies: `storage` - update to use `2023-05-01` ([#27760](https://github.com/hashicorp/terraform-provider-azurerm/issues/27760))\n* Data Source: `azure_communication_service` - add support for the `hostname` property ([#28620](https://github.com/hashicorp/terraform-provider-azurerm/issues/28620))\n* `azurerm_api_management` - `capacity` now has a max limit of 50 ([#28648](https://github.com/hashicorp/terraform-provider-azurerm/issues/28648))\n* `azurerm_backup_protected_vm` - add support for feature `vm_backup_suspend_protection_and_retain_data_on_destroy` ([#27950](https://github.com/hashicorp/terraform-provider-azurerm/issues/27950))\n* `azurerm_cognitive_account` - support for the `bypass` property ([#28221](https://github.com/hashicorp/terraform-provider-azurerm/issues/28221))\n* `azure_communication_service` - add support for the `hostname` property ([#28620](https://github.com/hashicorp/terraform-provider-azurerm/issues/28620))\n* `azurerm_container_app_environment` - add support for Azure Monitor as a log destination ([#26047](https://github.com/hashicorp/terraform-provider-azurerm/issues/26047))\n* `azurerm_mssql_elasticpool`- add support for `MOPRMS` pool type and update validation for `PRMS` and `Gen5` pool types ([#28453](https://github.com/hashicorp/terraform-provider-azurerm/issues/28453))\n* `azurerm_mssql_managed_instance_transparent_data_encryption` - support for the `managed_hsm_key_id` property ([#28480](https://github.com/hashicorp/terraform-provider-azurerm/issues/28480))\n* `azurerm_stream_analytics_output_cosmosdb` - support for the `authentication_mode` property ([#28372](https://github.com/hashicorp/terraform-provider-azurerm/issues/28372))\n* `azurerm_stream_analytics_stream_input_blob` - add support for `authentication_mode` ([#27853](https://github.com/hashicorp/terraform-provider-azurerm/issues/27853))\n\nBUG FIXES:\n\n* `azurerm_container_app` - update the validation regex for the resource's name ([#28528](https://github.com/hashicorp/terraform-provider-azurerm/issues/28528))\n* `azurerm_kubernetes_cluster` - parse `oms_agent.log_analytics_workspace_id` insensitively to handle inconsistent casing ([#28575](https://github.com/hashicorp/terraform-provider-azurerm/issues/28575))\n* `azurerm_kubernetes_flux_configuration` - fix issue where removing `post_build` from a `kustomization` resulted in an error from the API ([#28590](https://github.com/hashicorp/terraform-provider-azurerm/issues/28590))\n* `azurerm_linux_virtual_machine_scale_set` - prevent crash caused by ommited `extensions_to_provision_after_vm_creation` block ([#28549](https://github.com/hashicorp/terraform-provider-azurerm/issues/28549))\n* `azurerm_log_analytics_storage_insights` - use subscription from workspace ID when building the resource ID ([#28469](https://github.com/hashicorp/terraform-provider-azurerm/issues/28469))\n* `azurerm_orchestrated_virtual_machine_scale_set` - prevent crash caused by ommited `extensions_to_provision_after_vm_creation` block ([#28549](https://github.com/hashicorp/terraform-provider-azurerm/issues/28549))\n* `azurerm_virtual_machine` - parse `os_disk` insensitively to handle inconsistent casing ([#28592](https://github.com/hashicorp/terraform-provider-azurerm/issues/28592))\n* `azurerm_windows_virtual_machine_scale_set` - Prevent crash caused by ommited `extensions_to_provision_after_vm_creation` block ([#28549](https://github.com/hashicorp/terraform-provider-azurerm/issues/28549))\n\n## 4.16.0 (January 16, 2025)\n\n**NOTE:** This release contains a breaking change reverting `redisenterprise` API version from `2024-10-01` to `2024-06-01-preview` as not all regions are currently supported in the `2024-10-01` version \n\nBREAKING CHANGES:\n\n* dependencies - `redisenterprise` API version reverted from `2024-10-01` to `2024-06-01-preview` ([#28516](https://github.com/hashicorp/terraform-provider-azurerm/issues/28516))\n\nFEATURES:\n\n* **New Resource**: `azurerm_container_registry_credential_set` ([#27528](https://github.com/hashicorp/terraform-provider-azurerm/issues/27528))\n* **New Resource**: `azurerm_mssql_job` ([#28456](https://github.com/hashicorp/terraform-provider-azurerm/issues/28456))\n* **New Resource**: `azurerm_mssql_job_schedule` ([#28456](https://github.com/hashicorp/terraform-provider-azurerm/issues/28456))\n\nENHANCEMENTS:\n\n* dependencies - update `hashicorp/go-azure-sdk` to `v0.20250115.1141151` ([#28519](https://github.com/hashicorp/terraform-provider-azurerm/issues/28519))\n* dependencies - `costmanagement` update to use `2023-08-01` ([#27680](https://github.com/hashicorp/terraform-provider-azurerm/issues/27680))\n* dependencies - `postgresql` update API version to `2024-08-01` ([#28474](https://github.com/hashicorp/terraform-provider-azurerm/issues/28474))\n* `azurerm_container_app` – support for the `termination_grace_period_seconds` property ([#28307](https://github.com/hashicorp/terraform-provider-azurerm/issues/28307))\n* `azurerm_cost_anomaly_alert` - add support for the `notification_email` property ([#27680](https://github.com/hashicorp/terraform-provider-azurerm/issues/27680))\n* `azurerm_data_protection_backup_vault` - support for `immutability` property ([#27859](https://github.com/hashicorp/terraform-provider-azurerm/issues/27859))\n* `azurerm_databricks_workspace` - fix `ignore_changes` support ([#28527](https://github.com/hashicorp/terraform-provider-azurerm/issues/28527))\n* `azurerm_kubernetes_cluster_node_pool` - add support for the `temporary_name_for_rotation` property to allow node pool rotation ([#27791](https://github.com/hashicorp/terraform-provider-azurerm/issues/27791))\n* `azurerm_linux_function_app` - add  support for node `22` and java `17` support for `JBOSSEAP` ([#28472](https://github.com/hashicorp/terraform-provider-azurerm/issues/28472))\n* `azurerm_linux_web_app` - add  support for node `22` and java `17` support for `JBOSSEAP` ([#28472](https://github.com/hashicorp/terraform-provider-azurerm/issues/28472))\n* `azurerm_windows_function_app` - add  support for node `22` and java `17` support for `JBOSSEAP` ([#28472](https://github.com/hashicorp/terraform-provider-azurerm/issues/28472))\n\n\nBUG FIXES:\n\n* `azurerm_logic_app_standard` - fix setting `public_network_access` for conflicting API properties ([#28465](https://github.com/hashicorp/terraform-provider-azurerm/issues/28465))\n* `azurerm_redis_cache` - `data_persistence_authentication_method` can now be unset ([#27932](https://github.com/hashicorp/terraform-provider-azurerm/issues/27932))\n* `azurerm_mssql_database` - fix bug where verifying TDE might fail to return an error on failure ([#28505](https://github.com/hashicorp/terraform-provider-azurerm/issues/28505))\n* `azurerm_mssql_database` - fix several potential bugs where retry functions could return false negatives for actual errors ([#28505](https://github.com/hashicorp/terraform-provider-azurerm/issues/28505))\n* `azurerm_private_endpoint` - fix a bug where reading Private DNS could error and exit the Read of the resource early without raising an error ([#28505](https://github.com/hashicorp/terraform-provider-azurerm/issues/28505))\n\n## 4.15.0 (January 10, 2025)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_kubernetes_fleet_manager` ([#28278](https://github.com/hashicorp/terraform-provider-azurerm/issues/28278))\n* **New Resource**: `azurerm_arc_kubernetes_provisioned_cluster` ([#28216](https://github.com/hashicorp/terraform-provider-azurerm/issues/28216))\n* **New Resource**: `azurerm_machine_learning_workspace_network_outbound_rule_private_endpoint` ([#27874](https://github.com/hashicorp/terraform-provider-azurerm/issues/27874))\n* **New Resource** `azurerm_machine_learning_workspace_network_outbound_rule_service_tag` ([#27931](https://github.com/hashicorp/terraform-provider-azurerm/issues/27931))\n* **New Resource** `azurerm_dynatrace_tag_rules` ([#27985](https://github.com/hashicorp/terraform-provider-azurerm/issues/27985))\n\nENHANCEMENTS:\n\n* dependencies - update tool Go version and bump `go-git` version to `5.13.0` ([#28425](https://github.com/hashicorp/terraform-provider-azurerm/issues/28425))\n* dependencies - update `hashicorp/go-azure-sdk` to `v0.20241212.1154051` ([#28360](https://github.com/hashicorp/terraform-provider-azurerm/issues/28360))\n* dependencies - `frontdoor` - partial update to use `2024-02-01` API ([#28233](https://github.com/hashicorp/terraform-provider-azurerm/issues/28233))\n* dependencies - `postgresql` - update to `2024-08-01` ([#28380](https://github.com/hashicorp/terraform-provider-azurerm/issues/28380))\n* dependencies - `redisenterprise` - update to `2024-10-01` and support for new skus ([#28280](https://github.com/hashicorp/terraform-provider-azurerm/issues/28280))\n* Data Source: `azurerm_healthcare_dicom_service` - add support for the `data_partitions_enabled`, `cors`, `encryption_key_url` and `storage` properties ([#27375](https://github.com/hashicorp/terraform-provider-azurerm/issues/27375))\n* Data Source: `azurerm_nginx_deployment` - add support for the `dataplane_api_endpoint` property ([#28379](https://github.com/hashicorp/terraform-provider-azurerm/issues/28379)) \n* Data Source: `azurerm_static_web_app` - add  support for the `repository_url` and `repository_branch` properties ([#27401](https://github.com/hashicorp/terraform-provider-azurerm/issues/27401))\n* `azurerm_billing_account_cost_management_export` - add support for the `file_format` property ([#27122](https://github.com/hashicorp/terraform-provider-azurerm/issues/27122))\n* `azurerm_cdn_frontdoor_profile` - add support for the `identity` property ([#28281](https://github.com/hashicorp/terraform-provider-azurerm/issues/28281))\n* `azurerm_cognitive_deployment` - `DataZoneProvisionedManaged` and `GlobalProvisionedManaged` skus are now supported ([#28404](https://github.com/hashicorp/terraform-provider-azurerm/issues/28404))\n* `azurerm_databricks_access_connector` - `SystemAssigned,UserAssigned` identity is now supported ([#28442](https://github.com/hashicorp/terraform-provider-azurerm/issues/28442))\n* `azurerm_healthcare_dicom_service` - add support for the `data_partitions_enabled`, `cors`, `encryption_key_url` and `storage` properties ([#27375](https://github.com/hashicorp/terraform-provider-azurerm/issues/27375))\n* `azurerm_kubernetes_flux_configuration` - add support for the `post_build` and `wait` properties ([#25695](https://github.com/hashicorp/terraform-provider-azurerm/issues/25695))\n* `azurerm_linux_virtual_machine` - export the `os_disk.0.id` attribute ([#28352](https://github.com/hashicorp/terraform-provider-azurerm/issues/28352))\n* `azurerm_netapp_volume` - make the `network_features` property Optional/Computed ([#28390](https://github.com/hashicorp/terraform-provider-azurerm/issues/28390))\n* `azurerm_nginx_deployment` - add support for the `dataplane_api_endpoint` property ([#28379](https://github.com/hashicorp/terraform-provider-azurerm/issues/28379)) \n* `azurerm_resource_group_cost_management_export` - add support for the `file_format` property ([#27122](https://github.com/hashicorp/terraform-provider-azurerm/issues/27122))\n* `azurerm_site_recovery_replicated_vm` - support for the `network_interface.recovery_load_balancer_backend_address_pool_ids` property ([#28398](https://github.com/hashicorp/terraform-provider-azurerm/issues/28398))\n* `azurerm_static_web_app` - add  support for the `repository_url`, `repository_branch` and `repository_token` properties ([#27401](https://github.com/hashicorp/terraform-provider-azurerm/issues/27401))\n* `azurerm_subscription_cost_management_export` - add support for the `file_format` property ([#27122](https://github.com/hashicorp/terraform-provider-azurerm/issues/27122))\n* `azurerm_virtual_network` - support for the `private_endpoint_vnet_policies` property ([#27830](https://github.com/hashicorp/terraform-provider-azurerm/issues/27830))\n* `azurerm_windows_virtual_machine` - export the `os_disk.0.id` attribute ([#28352](https://github.com/hashicorp/terraform-provider-azurerm/issues/28352))\n* `azurerm_mssql_managed_instance` - support for new property `azure_active_directory_administrator` ([#24801](https://github.com/hashicorp/terraform-provider-azurerm/issues/24801))\n\nBUG FIXES:\n\n* `azurerm_api_management` - update the `capacity` property to allow increasing the apim scalability to `31` ([#28427](https://github.com/hashicorp/terraform-provider-azurerm/issues/28427))\n* `azurerm_automation_software_update_configuration` remove deprecated misspelled attribute `error_meesage` ([#28312](https://github.com/hashicorp/terraform-provider-azurerm/issues/28312))\n* `azurerm_batch_pool` - support for new block `security_profile` ([#28069](https://github.com/hashicorp/terraform-provider-azurerm/issues/28069))\n* `azurerm_log_analytics_data_export_rule` - now creates successfully without returning `404` ([#27876](https://github.com/hashicorp/terraform-provider-azurerm/issues/27876))\n* `azurerm_mongo_cluster` - remove CustomizeDiff logic for `administrator_password` to allow the input to be generated by the `random_password` resource ([#28215](https://github.com/hashicorp/terraform-provider-azurerm/issues/28215))\n* `azurerm_mongo_cluster` - valdation updated so the resource now creates successfully when using `create_mode` `GeoReplica` ([#28269](https://github.com/hashicorp/terraform-provider-azurerm/issues/28269))\n* `azurerm_mssql_managed_instance` - allow system and user assigned identities, fix update failure ([#28319](https://github.com/hashicorp/terraform-provider-azurerm/issues/28319))\n* `azurerm_storage_account` - fix error handling for `static_website` and `queue_properties` availability checks ([#28279](https://github.com/hashicorp/terraform-provider-azurerm/issues/28279))\n\n\n\n## 4.14.0 (December 12, 2024)\n\nBREAKING CHANGES:\n\n* `nginx` - update api version to `2024-09-01-preview`, this API no longer supports certain properties which have had to be deprecated in the provider for the upgrade ([#27776](https://github.com/hashicorp/terraform-provider-azurerm/issues/27776))\n* Data Source: `azurerm_nginx_configuration` - the `protected_file.content` property will not be populated and has been deprecated ([#27776](https://github.com/hashicorp/terraform-provider-azurerm/issues/27776))\n* Data Source: `azurerm_nginx_deployment` - the `managed_resource_group` property will not be populated and has been deprecated ([#27776](https://github.com/hashicorp/terraform-provider-azurerm/issues/27776))\n* `azurerm_network_function_collector_policy` - the API doesn't preserve the ordering of the `ipfx_ingestion.source_resource_ids` property causing non-empty plans after apply, this property's type has been changed from a list to a set to prevent Terraform from continually trying to recreate this resource. If this property is being referenced anywhere you will need to update your config to convert it to a list before referencing it ([#27915](https://github.com/hashicorp/terraform-provider-azurerm/issues/27915))\n* `azurerm_nginx_deployment` - the `managed_resource_group` property is no longer supported and has been deprecated ([#27776](https://github.com/hashicorp/terraform-provider-azurerm/issues/27776))\n\nFEATURES:\n\n* **New Resource**: `azurerm_cognitive_account_rai_blocklist` ([#28043](https://github.com/hashicorp/terraform-provider-azurerm/issues/28043))\n* **New Resource**: `azurerm_fabric_capacity` ([#28080](https://github.com/hashicorp/terraform-provider-azurerm/issues/28080))\n\nENHANCEMENTS:\n\n* dependencies - update `go-azure-sdk` to `v0.20241206.1180327` ([#28211](https://github.com/hashicorp/terraform-provider-azurerm/issues/28211))\n* `nginx` - update api version to `2024-11-01-preview` ([#28227](https://github.com/hashicorp/terraform-provider-azurerm/issues/28227))\n* `azurerm_linux_function_app` - add support for  preview  value `21` for `java_version` ([#26304](https://github.com/hashicorp/terraform-provider-azurerm/issues/26304))\n* `azurerm_linux_function_app_slot` - support `1.3` for `site_config.minimum_tls_version` and `site_config.scm_minimum_tls_version` ([#28016](https://github.com/hashicorp/terraform-provider-azurerm/issues/28016))\n* `azurerm_linux_web_app` - add support for  preview  value `21` for `java_version` ([#26304](https://github.com/hashicorp/terraform-provider-azurerm/issues/26304))\n* `azurerm_orchestrated_virtual_machine_scale_set` - support hot patching for `2025-datacenter-azure-edition-core-smalldisk` ([#28160](https://github.com/hashicorp/terraform-provider-azurerm/issues/28160))\n* `azurerm_search_service` - add support for the `network_rule_bypass_option` property ([#28139](https://github.com/hashicorp/terraform-provider-azurerm/issues/28139))\n* `azurerm_windows_function_app` - add support for  preview  value `21` for `java_version` ([#26304](https://github.com/hashicorp/terraform-provider-azurerm/issues/26304))\n* `azurerm_windows_function_app_slot` - support `1.3` for `site_config.minimum_tls_version` and `site_config.scm_minimum_tls_version` ([#28016](https://github.com/hashicorp/terraform-provider-azurerm/issues/28016))\n* `azurerm_windows_virtual_machine` - support hot patching for `2025-datacenter-azure-edition-core-smalldisk` ([#28160](https://github.com/hashicorp/terraform-provider-azurerm/issues/28160))\n* `azurerm_windows_web_app` - add support for  preview  value `21` for `java_version` ([#26304](https://github.com/hashicorp/terraform-provider-azurerm/issues/26304))\n\nBUG FIXES:\n\n* `azurerm_management_group` - fix regression where subscription ID can't be parsed correctly anymore ([#28228](https://github.com/hashicorp/terraform-provider-azurerm/issues/28228))\n\n## 4.13.0 (December 05, 2024)\n\nENHANCEMENTS:\n\n* `azurerm_cognitive_deployment` - support for the `dynamic_throttling_enabled` property ([#28100](https://github.com/hashicorp/terraform-provider-azurerm/issues/28100))\n* `azurerm_key_vault_managed_hardware_security_module_key` - the `key_type` property now supports `oct-HSM` ([#28171](https://github.com/hashicorp/terraform-provider-azurerm/issues/28171))\n* `azurerm_machine_learning_datastore_datalake_gen2` - can now be used with storage account in a different subscription ([#28123](https://github.com/hashicorp/terraform-provider-azurerm/issues/28123))\n* `azurerm_network_watcher_flow_log` - `target_resource_id` supports subnets and network interfaces ([#28177](https://github.com/hashicorp/terraform-provider-azurerm/issues/28177))\n\nBUG:\n\n* Data Source: `azurerm_logic_app_standard` - update the `identity` property to support User Assigned Identities ([#28158](https://github.com/hashicorp/terraform-provider-azurerm/issues/28158))\n* `azurerm_cdn_frontdoor_origin_group` - update validation of the `interval_in_seconds` property to match API behaviour ([#28143](https://github.com/hashicorp/terraform-provider-azurerm/issues/28143))\n* `azurerm_container_group` - retrieve log analytics workspace key from config when updating resource ([#28025](https://github.com/hashicorp/terraform-provider-azurerm/issues/28025))\n* `azurerm_mssql_elasticpool` - fix sku tier and family validation that prevented the creation of Hyperscale PRMS pools ([#28178](https://github.com/hashicorp/terraform-provider-azurerm/issues/28178))\n* `azurerm_search_service` -  the `partition_count` property can now be up to `3` when using basic sku ([#28105](https://github.com/hashicorp/terraform-provider-azurerm/issues/28105))\n\n## 4.12.0 (November 28, 2024)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_mssql_managed_database` ([#27026](https://github.com/hashicorp/terraform-provider-azurerm/issues/27026))\n\nBUG FIXES:\n\n* `azurerm_application_insights_api_key` - fix condition that nil checks the list of available API keys to prevent an indefinate loop when keys created outside of Terraform are present ([#28037](https://github.com/hashicorp/terraform-provider-azurerm/issues/28037))\n* `azurerm_data_factory_linked_service_azure_sql_database` - send `tenant_id` only if it has been specified ([#28120](https://github.com/hashicorp/terraform-provider-azurerm/issues/28120))\n* `azurerm_eventgrid_event_subscription` - fix crash when flattening `advanced_filter` ([#28110](https://github.com/hashicorp/terraform-provider-azurerm/issues/28110))\n* `azurerm_virtual_network_gateway` - fix crash issue when specifying `root_certificate ` or `revoked_certificate` ([#28099](https://github.com/hashicorp/terraform-provider-azurerm/issues/28099))\n\nENHANCEMENTS:\n\n* dependencies - update `go-azure-sdk` to `v0.20241128.1112539` ([#28137](https://github.com/hashicorp/terraform-provider-azurerm/issues/28137))\n* `containerapps` - update api version to `2024-03-01` ([#28074](https://github.com/hashicorp/terraform-provider-azurerm/issues/28074))\n* `Search` - update api version to `2024-06-01-preview` ([#27803](https://github.com/hashicorp/terraform-provider-azurerm/issues/27803))\n* Data Source: `azurerm_logic_app_standard` - add support for the `public_network_access` property ([#27913](https://github.com/hashicorp/terraform-provider-azurerm/issues/27913))\n* Data Source: `azurerm_search_service` - add support for the `customer_managed_key_encryption_compliance_status` property ([#27478](https://github.com/hashicorp/terraform-provider-azurerm/issues/27478))\n* `azurerm_container_registry_task` - add validation on `cpu` as well as on `agent_pool_name`and `agent_setting` ([#28098](https://github.com/hashicorp/terraform-provider-azurerm/issues/28098))\n* `azurerm_databricks_workspace` - add support for the `enhanced_security_compliance` block ([#26606](https://github.com/hashicorp/terraform-provider-azurerm/issues/26606))\n* `azurerm_eventhub` - deprecate `namespace_name` and `resource_group_name` in favour of `namespace_id` ([#28055](https://github.com/hashicorp/terraform-provider-azurerm/issues/28055))\n* `azurerm_logic_app_standard` - add support for the `public_network_access` property ([#27913](https://github.com/hashicorp/terraform-provider-azurerm/issues/27913))\n* `azurerm_search_service` - add support for the `customer_managed_key_encryption_compliance_status` property ([#27478](https://github.com/hashicorp/terraform-provider-azurerm/issues/27478))\n* `azurerm_cosmosdb_account` - add support for value `EnableNoSQLFullTextSearch` in the  `capabilities.name` property ([#28114](https://github.com/hashicorp/terraform-provider-azurerm/issues/28114))\n\n## 4.11.0 (November 22, 2024)\n\nNOTES:\n* New [ephemeral resources](https://developer.hashicorp.com/terraform/language/ephemeral) `azurerm_key_vault_certificate` and `azurerm_key_vault_secret` now support [ephemeral values](https://developer.hashicorp.com/terraform/language/v1.10.x/values/variables#exclude-values-from-state)\n\nFEATURES:\n\n* **New Ephemeral Resource**: `azurerm_key_vault_certificate` ([#28083](https://github.com/hashicorp/terraform-provider-azurerm/issues/28083))\n* **New Ephemeral Resource**: `azurerm_key_vault_secret` ([#28083](https://github.com/hashicorp/terraform-provider-azurerm/issues/28083))\n* **New Resource**: `azurerm_eventgrid_namespace` ([#27682](https://github.com/hashicorp/terraform-provider-azurerm/issues/27682))\n\nENHANCEMENTS:\n\n* dependencies: update `hashicorp/go-azure-sdk` to `v0.20241118.1115603` ([#28075](https://github.com/hashicorp/terraform-provider-azurerm/issues/28075))\n* `batch` - upgrade api version to `2024-07-01` ([#27982](https://github.com/hashicorp/terraform-provider-azurerm/issues/27982))\n* `containerregistry` - upgrade api version to `2023-11-01-preview` ([#27983](https://github.com/hashicorp/terraform-provider-azurerm/issues/27983))\n* `azurerm_application_gateway` - `1.1` is now accepted as a valid `rule_set_version` in the `waf_configuration` block ([#28039](https://github.com/hashicorp/terraform-provider-azurerm/issues/28039))\n* `azurerm_arc_machine` - add support for the `identity` and `tags` properties ([#27987](https://github.com/hashicorp/terraform-provider-azurerm/issues/27987))\n* `azurerm_container_app` - `secret.name` now accepts up to 253 characters and `.` ([#27935](https://github.com/hashicorp/terraform-provider-azurerm/issues/27935))\n* `azurerm_network_manager` - `scope_accesses` now accepts `Routing` ([#28033](https://github.com/hashicorp/terraform-provider-azurerm/issues/28033))\n* `azurerm_network_watcher_flow_log` - add support for the `target_resource_id` property ([#26015](https://github.com/hashicorp/terraform-provider-azurerm/issues/26015))\n* `azurerm_role_assignment` - `condition_version` will be defaulted to `2.0` when `condition` has been set ([#27189](https://github.com/hashicorp/terraform-provider-azurerm/issues/27189))\n* `azurerm_subnet` - `Informatica.DataManagement/organizations` is a valid `service_delegation` ([#27993](https://github.com/hashicorp/terraform-provider-azurerm/issues/27993))\n* `azurerm_virtual_network` - `Informatica.DataManagement/organizations` is a valid `service_delegation` ([#27993](https://github.com/hashicorp/terraform-provider-azurerm/issues/27993))\n* `azurerm_web_application_firewall_policy` - `1.1` is now accepted as a valid `version` for `Microsoft_BotManagerRuleSet` rule types ([#28039](https://github.com/hashicorp/terraform-provider-azurerm/issues/28039))\n\nBUG FIXES:\n\n* `azurerm_api_management` - `public_ip_address_id` is no longer required when `zone` has been set ([#27976](https://github.com/hashicorp/terraform-provider-azurerm/issues/27976))\n* `azurerm_api_management_diagnostic` - raise and error when `operation_name_format` is used with and `identity` that is not `applicationinsights` ([#27630](https://github.com/hashicorp/terraform-provider-azurerm/issues/27630))\n* `azurerm_api_management_api_diagnostic` - raise and error when `operation_name_format` is used with and `identity` that is not `applicationinsights` ([#27630](https://github.com/hashicorp/terraform-provider-azurerm/issues/27630))\n* `azurerm_application_gateway` - `rewrite_rule_set` can be supplied when using `Basic` sku ([#28011](https://github.com/hashicorp/terraform-provider-azurerm/issues/28011))\n* `azurerm_container_registry_token_password` - correctly mark as gone if container registry token doesn't exist ([#27232](https://github.com/hashicorp/terraform-provider-azurerm/issues/27232))\n* `azurerm_kusto_cluster` - `allowed_fqdn` and `allowed_ip_ranges` can now be set to empty lists ([#27529](https://github.com/hashicorp/terraform-provider-azurerm/issues/27529))\n* `azurerm_linux_function_app_slot` - create content settings when using a consumpton plan ([#25412](https://github.com/hashicorp/terraform-provider-azurerm/issues/25412))\n* `azurerm_virtual_network_gatway` - updating `ip_configuration` now recreates the resource ([#27828](https://github.com/hashicorp/terraform-provider-azurerm/issues/27828))\n\n## 4.10.0 (November 14, 2024)\n\nBREAKING CHANGES:\n\n* dependencies - update `cognitive` to `2024-10-01`, due to a behavioural change in this version of the API, the `primary_access_key` and `secondary_access_key` can not be retrieved if `local_authentication_enabled` has been set to `false`. These properties that may have had values previously will now be empty. This has affected the `azurerm_ai_services` and `azurerm_cognitive_account` resources as well as the `azurerm_cognitive_account` data source ([#27851](https://github.com/hashicorp/terraform-provider-azurerm/issues/27851))\n\nFEATURES:\n\n* **New Data Source**: `azurerm_key_vault_managed_hardware_security_module_key` ([#27827](https://github.com/hashicorp/terraform-provider-azurerm/issues/27827))\n* **New Resource**: `azurerm_netapp_backup_vault` ([#27188](https://github.com/hashicorp/terraform-provider-azurerm/issues/27188))\n* **New Resource**: `azurerm_netapp_backup_policy` ([#27188](https://github.com/hashicorp/terraform-provider-azurerm/issues/27188))\n\nENHANCEMENTS:\n\n* dependencies: update `terraform-plugin-framework` to version `v1.13.0` ([#27936](https://github.com/hashicorp/terraform-provider-azurerm/issues/27936))\n* dependencies: update `terraform-plugin-framework-validators` to version `v0.14.0` ([#27936](https://github.com/hashicorp/terraform-provider-azurerm/issues/27936))\n* dependencies: update `terraform-plugin-go` to version `v0.25.0` ([#27936](https://github.com/hashicorp/terraform-provider-azurerm/issues/27936))\n* dependencies: update `terraform-plugin-mux` to version `v0.17.0` ([#27936](https://github.com/hashicorp/terraform-provider-azurerm/issues/27936))\n* dependencies: update `terraform-plugin-sdk/v2` to version `v2.35.0` ([#27936](https://github.com/hashicorp/terraform-provider-azurerm/issues/27936))\n* Data Source: `azurerm_bastion_host` - add support for the `zones` property ([#27909](https://github.com/hashicorp/terraform-provider-azurerm/issues/27909))\n* `azurerm_application_gateway` - support more values for the `status_code` property ([#27535](https://github.com/hashicorp/terraform-provider-azurerm/issues/27535))\n* `azurerm_bastion_host` - support for the `zones` property ([#27909](https://github.com/hashicorp/terraform-provider-azurerm/issues/27909))\n* `azurerm_communication_service` - support for `usgov` region ([#27919](https://github.com/hashicorp/terraform-provider-azurerm/issues/27919))\n* `azurerm_email_communication_service` - support for `usgov` region added ([#27919](https://github.com/hashicorp/terraform-provider-azurerm/issues/27919))\n* `azurerm_linux_function_app` - support for .NET 9  ([#27879](https://github.com/hashicorp/terraform-provider-azurerm/issues/27879))\n* `azurerm_linux_function_app_slot` - support for .NET 9  ([#27879](https://github.com/hashicorp/terraform-provider-azurerm/issues/27879))\n* `azurerm_linux_web_app` - support for .NET 9  ([#27879](https://github.com/hashicorp/terraform-provider-azurerm/issues/27879))\n* `azurerm_linux_web_app_slot` - support for .NET 9  ([#27879](https://github.com/hashicorp/terraform-provider-azurerm/issues/27879))\n* `azurerm_windows_web_app` - support for .NET 9  ([#27879](https://github.com/hashicorp/terraform-provider-azurerm/issues/27879))\n* `azurerm_windows_web_app_slot` - support for .NET 9  ([#27879](https://github.com/hashicorp/terraform-provider-azurerm/issues/27879))\n* `azurerm_windows_function_app` - support for .NET 9  ([#27879](https://github.com/hashicorp/terraform-provider-azurerm/issues/27879))\n* `azurerm_windows_function_app_slot` - support for .NET 9  ([#27879](https://github.com/hashicorp/terraform-provider-azurerm/issues/27879))\n\nBUG FIXES:\n\n* `azurerm_log_analytics_workspace_table` - use the subscription from workspace ID ([#27590](https://github.com/hashicorp/terraform-provider-azurerm/issues/27590))\n* `azurerm_traffic_manager_external_endpoint` - the value for `priority` will be dynamically assigned by the API ([#27966](https://github.com/hashicorp/terraform-provider-azurerm/issues/27966))\n* `azurerm_traffic_manager_azure_endpoint` - the value for `priority` will be dynamically assigned by the API ([#27966](https://github.com/hashicorp/terraform-provider-azurerm/issues/27966))\n\n\n## 4.9.0 (November 08, 2024)\n\nFEATURES:\n\n* **New Resource**: `azurerm_dynatrace_monitor` ([#27432](https://github.com/hashicorp/terraform-provider-azurerm/issues/27432))\n* **New Resource**: `azurerm_dashboard_grafana_managed_private_endpoint` ([#27781](https://github.com/hashicorp/terraform-provider-azurerm/issues/27781))\n* **New Resource**: `azurerm_data_protection_backup_instance_mysql_flexible_server` ([#27464](https://github.com/hashicorp/terraform-provider-azurerm/issues/27464))\n* **New Resource**: `azurerm_mongo_cluster` ([#27636](https://github.com/hashicorp/terraform-provider-azurerm/issues/27636))\n* **New Resource**: `azurerm_stack_hci_network_interface` ([#26888](https://github.com/hashicorp/terraform-provider-azurerm/issues/26888))\n\nENHANCEMENTS:\n\n* dependencies - update `go-azure-sdk` to `v0.20241104.1140654` ([#27896](https://github.com/hashicorp/terraform-provider-azurerm/issues/27896))\n* dependencies - update `go-azure-helpers` to `v0.71.0` ([#27897](https://github.com/hashicorp/terraform-provider-azurerm/issues/27897))\n* dependencies - update `golang-jwt` to `v4.5.1` ([#27938](https://github.com/hashicorp/terraform-provider-azurerm/issues/27938))\n* `storage` - allow `azurerm_storage_account` to be used in Data Plane restrictive environments ([#27818](https://github.com/hashicorp/terraform-provider-azurerm/issues/27818))\n* `azurerm_cognitive_deployment` - `sku.0.name` now supports `DataZoneStandard` ([#27926](https://github.com/hashicorp/terraform-provider-azurerm/issues/27926))\n* `azurerm_mssql_managed_database` - support for the `tags` property ([#27857](https://github.com/hashicorp/terraform-provider-azurerm/issues/27857))\n* `azurerm_oracle_cloud_vm_cluster` - support for the `domain`, `scan_listener_port_tcp`, `scan_listener_port_tcp_ssl` and `zone_id` properties ([#27808](https://github.com/hashicorp/terraform-provider-azurerm/issues/27808))\n* `azurerm_public_ip_prefix` - support for the `sku_tier` property ([#27882](https://github.com/hashicorp/terraform-provider-azurerm/issues/27882))\n* `azurerm_public_ip` - support for the `domain_name_label_scope` property ([#27748](https://github.com/hashicorp/terraform-provider-azurerm/issues/27748))\n* `azurerm_subnet` - `default_outbound_access_enabled` can now be updated ([#27858](https://github.com/hashicorp/terraform-provider-azurerm/issues/27858))\n* `azurerm_storage_container` - support for the `storage_account_id` property ([#27733](https://github.com/hashicorp/terraform-provider-azurerm/issues/27733))\n* `azurerm_storage_share` - support for the `storage_account_id` property ([#27733](https://github.com/hashicorp/terraform-provider-azurerm/issues/27733))\n\n## 4.8.0 (October 31, 2024)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_virtual_network_peering` ([#27530](https://github.com/hashicorp/terraform-provider-azurerm/issues/27530))\n* **New Resource**: `azurerm_machine_learning_workspace_network_outbound_rule_fqdn` ([#27384](https://github.com/hashicorp/terraform-provider-azurerm/issues/27384))\n* **New Resource**: `azurerm_stack_hci_extension` ([#26929](https://github.com/hashicorp/terraform-provider-azurerm/issues/26929))\n* **New Resource**: `azurerm_stack_hci_marketplace_gallery_image` ([#27532](https://github.com/hashicorp/terraform-provider-azurerm/issues/27532))\n* **New Resource**: `azurerm_trusted_signing_account` ([#27720](https://github.com/hashicorp/terraform-provider-azurerm/issues/27720))\n\nENHANCEMENTS:\n\n* `mysql` - upgrade api version to `2023-12-30` ([#27767](https://github.com/hashicorp/terraform-provider-azurerm/issues/27767))\n* `network` - upgrade api version to `2024-03-01 ` ([#27746](https://github.com/hashicorp/terraform-provider-azurerm/issues/27746))\n* `azurerm_cosmosdb_account`: support for CMK through `managed_hsm_key_id` property ([#26521](https://github.com/hashicorp/terraform-provider-azurerm/issues/26521))\n* `azurerm_cosmosdb_account` - support further versions for `mongo_server_version` ([#27763](https://github.com/hashicorp/terraform-provider-azurerm/issues/27763))\n* `azurerm_container_app_environment` - changing the `log_analytics_workspace_id` property no longer creates a new resource ([#27794](https://github.com/hashicorp/terraform-provider-azurerm/issues/27794))\n* `azurerm_data_factory_linked_service_azure_sql_database` - add support for the `credential_name` property ([#27629](https://github.com/hashicorp/terraform-provider-azurerm/issues/27629))\n* `azurerm_key_vault_key` - `expiration_date` only recreates the resource when it is removed from the config file ([#27813](https://github.com/hashicorp/terraform-provider-azurerm/issues/27813))\n* `azurerm_kubernetes_cluster` - fix issue where`maintenance_window_auto_upgrade`/`maintenance_window_auto_upgrade`/`maintenance_window_node_os ` might not be read into state ([#26915](https://github.com/hashicorp/terraform-provider-azurerm/issues/26915))\n* `azurerm_kubernetes_cluster` - support for the `backend_pool_type` property ([#27596](https://github.com/hashicorp/terraform-provider-azurerm/issues/27596))\n* `azurerm_kubernetes_cluster` - support for the `daemonset_eviction_for_empty_nodes_enabled`, `daemonset_eviction_for_occupied_nodes_enabled`, and `ignore_daemonsets_utilization_enabled` properties ([#27588](https://github.com/hashicorp/terraform-provider-azurerm/issues/27588))\n* `azurerm_load_test` - `description` can now be updated ([#27800](https://github.com/hashicorp/terraform-provider-azurerm/issues/27800))\n* `azurerm_oracle_cloud_vm_cluster` - export the `ocid` property ([#27785](https://github.com/hashicorp/terraform-provider-azurerm/issues/27785))\n* `azurerm_orchestrated_virtual_machine_scale_set` - add support for `sku_profile` block ([#27599](https://github.com/hashicorp/terraform-provider-azurerm/issues/27599))\n* `azurerm_web_application_firewall_policy` - add support for `policy_settings.0.file_upload_enforcement` ([#27774](https://github.com/hashicorp/terraform-provider-azurerm/issues/27774))\n\nBUG FIXES:\n\n* `azurerm_automation_hybrid_runbook_worker_group` - correctly mark resource as gone if it's absent when reading it ([#27797](https://github.com/hashicorp/terraform-provider-azurerm/issues/27797))\n* `azurerm_automation_hybrid_runbook_worker` - correctly mark resource as gone if it's absent when reading it ([#27797](https://github.com/hashicorp/terraform-provider-azurerm/issues/27797))\n* `azurerm_automation_python3_package` - correctly mark resource as gone if it's absent when reading it ([#27797](https://github.com/hashicorp/terraform-provider-azurerm/issues/27797))\n* `azurerm_data_protection_backup_vault` - prevent panic when checking value of `cross_region_restore_enabled` ([#27762](https://github.com/hashicorp/terraform-provider-azurerm/issues/27762))\n* `azurerm_role_management_policy` - fix panic when unmarshalling the policy into a specific type ([#27731](https://github.com/hashicorp/terraform-provider-azurerm/issues/27731))\n* `azurerm_security_center_subscription_pricing` - correctly type assert the `additional_extension_properties` property when building the payload ([#27721](https://github.com/hashicorp/terraform-provider-azurerm/issues/27721))\n* `azurerm_synapse_workspace_aad_admin` - will no correctly delete when using `azurerm_synapse_workspace_aad_admin` with `azurerm_synapse_workspace` ([#27606](https://github.com/hashicorp/terraform-provider-azurerm/issues/27606))\n* `azurerm_windows_function_app_slot` - fixed panic in state migration ([#27700](https://github.com/hashicorp/terraform-provider-azurerm/issues/27700))\n\n## 4.7.0 (October 24, 2024)\n\nFEATURES:\n\n* **New Data Source**: `azurerm_oracle_adbs_character_sets` ([#27698](https://github.com/hashicorp/terraform-provider-azurerm/issues/27698))\n* **New Data Source**: `azurerm_oracle_adbs_national_character_sets` ([#27698](https://github.com/hashicorp/terraform-provider-azurerm/issues/27698))\n* **New Data Source**: `azurerm_oracle_autonomous_database` ([#27696](https://github.com/hashicorp/terraform-provider-azurerm/issues/27696))\n* **New Data Source**: `azurerm_oracle_db_nodes` ([#27698](https://github.com/hashicorp/terraform-provider-azurerm/issues/27698))\n* **New Data Source**: `azurerm_oracle_db_system_shapes` ([#27698](https://github.com/hashicorp/terraform-provider-azurerm/issues/27698))\n* **New Data Source**: `azurerm_oracle_gi_versions` ([#27698](https://github.com/hashicorp/terraform-provider-azurerm/issues/27698))\n* **New Resource**: `azurerm_dev_center_project_pool` ([#27706](https://github.com/hashicorp/terraform-provider-azurerm/issues/27706))\n* **New Resource**: `azurerm_oracle_autonomous_database` ([#27696](https://github.com/hashicorp/terraform-provider-azurerm/issues/27696))\n* **New Resource**: `azurerm_video_indexer_account` ([#27632](https://github.com/hashicorp/terraform-provider-azurerm/issues/27632))\n\nENHANCEMENTS:\n\n* Dependencies - update `go-azure-sdk` to `v0.20241021.1074254` ([#27713](https://github.com/hashicorp/terraform-provider-azurerm/issues/27713))\n* `newrelic` - upgrade API version to `2024-03-01`  ([#27135](https://github.com/hashicorp/terraform-provider-azurerm/issues/27135))\n* `cosmosdb` - upgrade API version to `2024-08-15` ([#27659](https://github.com/hashicorp/terraform-provider-azurerm/issues/27659))\n* `azurerm_application_gateway` - support for the new `Basic` SKU value ([#27440](https://github.com/hashicorp/terraform-provider-azurerm/issues/27440))\n* `azurerm_consumption_budget_management_group` - the property `notification.threshold_type` can now be updated ([#27511](https://github.com/hashicorp/terraform-provider-azurerm/issues/27511))\n* `azurerm_consumption_budget_resource_group` - the property `notification.threshold_type` can now be updated ([#27511](https://github.com/hashicorp/terraform-provider-azurerm/issues/27511))\n* `azurerm_container_app` - add support for the `template.container.readiness_probe.initial_delay` and `template.container.startup_probe.initial_delay` properties ([#27551](https://github.com/hashicorp/terraform-provider-azurerm/issues/27551))\n* `azurerm_mssql_managed_instance` - the `storage_account_type` property can now be updated ([#27737](https://github.com/hashicorp/terraform-provider-azurerm/issues/27737))\n\nBUG FIXES:\n\n* `azurerm_automation_software_update_configuration` - correct validation to not allow `5` and allow `-1` ([#25574](https://github.com/hashicorp/terraform-provider-azurerm/issues/25574))\n* `azurerm_cosmosdb_sql_container` - fix recreation logic for `partition_key_version` ([#27692](https://github.com/hashicorp/terraform-provider-azurerm/issues/27692))\n* `azurerm_mssql_database` - updating short term retention policy now works as expected ([#27714](https://github.com/hashicorp/terraform-provider-azurerm/issues/27714))\n* `azurerm_network_watcher_flow_log` - fix issue where `tags` weren't being updated ([#27389](https://github.com/hashicorp/terraform-provider-azurerm/issues/27389))\n* `azurerm_postgresql_flexible_server_virtual_endpoint` - retrieve and parse `replica_server_id` for cross-region scenarios as well as remove custom poller for the delete operation ([#27509](https://github.com/hashicorp/terraform-provider-azurerm/issues/27509))\n\n## 4.6.0 (October 18, 2024)\n\nFEATURES:\n\n* **New Resource**: `azurerm_dev_center_attached_network` ([#27638](https://github.com/hashicorp/terraform-provider-azurerm/issues/27638))\n* **New Resource**: `azurerm_oracle_cloud_vm_cluster` ([#27678](https://github.com/hashicorp/terraform-provider-azurerm/issues/27678))\n* **New Resource**: `azurerm_oracle_exadata_infrastructure` ([#27678](https://github.com/hashicorp/terraform-provider-azurerm/issues/27678))\n* **New Data Source**: `azurerm_oracle_cloud_vm_cluster` ([#27678](https://github.com/hashicorp/terraform-provider-azurerm/issues/27678))\n* **New Data Source**: `azurerm_oracle_db_servers` ([#27678](https://github.com/hashicorp/terraform-provider-azurerm/issues/27678))\n* **New Data Source**: `azurerm_oracle_exadata_infrastructure` ([#27678](https://github.com/hashicorp/terraform-provider-azurerm/issues/27678))\n\nENHANCEMENTS:\n\n* `redisenterprise` - upgrade API version to `2024-06-01-preview`  ([#27597](https://github.com/hashicorp/terraform-provider-azurerm/issues/27597))\n* `azurerm_app_configuration` - support for premium sku ([#27674](https://github.com/hashicorp/terraform-provider-azurerm/issues/27674))\n* `azurerm_container_app` - support for the `max_inactive_revisions` property ([#27598](https://github.com/hashicorp/terraform-provider-azurerm/issues/27598))\n* `azurerm_kubernetes_cluster` - remove lock on subnets ([#27583](https://github.com/hashicorp/terraform-provider-azurerm/issues/27583))\n* `azurerm_nginx_deployment` - allow updates for `sku` ([#27604](https://github.com/hashicorp/terraform-provider-azurerm/issues/27604))\n* `azurerm_fluid_relay_server` - support for the `customer_managed_key` property ([#27581](https://github.com/hashicorp/terraform-provider-azurerm/issues/27581))\n* `azurerm_linux_virtual_machine` - support the `UBUNTU_PRO` value for the `license_type` property ([#27534](https://github.com/hashicorp/terraform-provider-azurerm/issues/27534))\n\n\nBUGS:\n\n* `azurerm_api_management_api_diagnostic` - don't set `OperationNameFormat` when the `identifier` property is `azuremonitor` ([#27456](https://github.com/hashicorp/terraform-provider-azurerm/issues/27456))\n* `azurerm_api_management` - prevent a panic ([#27649](https://github.com/hashicorp/terraform-provider-azurerm/issues/27649))\n* `azurerm_mssql_database` - make `short_term_retention_policy.backup_interval_in_hours` computed ([#27656](https://github.com/hashicorp/terraform-provider-azurerm/issues/27656))\n\n## 4.5.0 (October 10, 2024)\n\nFEATURES:\n\n* **New Resource**: `azurerm_stack_hci_virtual_hard_disk` ([#27474](https://github.com/hashicorp/terraform-provider-azurerm/issues/27474))\n\nENHANCEMENTS:\n\n* `azurerm_bastion_host` - support for the `Premium` SKU and `session_recording_enabled` property ([#27278](https://github.com/hashicorp/terraform-provider-azurerm/issues/27278))\n* `azurerm_log_analytics_cluster` - the `size_gb` property now supports all of 100, 200, 300, 400, 500, 1000, 2000, 5000, 10000, 25000, and 50000 ([#27616](https://github.com/hashicorp/terraform-provider-azurerm/issues/27616))\n* `azurerm_mssql_elasticpool` - allow `PRMS` for the `family` property ([#27615](https://github.com/hashicorp/terraform-provider-azurerm/issues/27615))\n\n\nBUG FIXES:\n\n* `azurerm_mssql_database` - now creates successfully when elastic pool is hyperscale ([#27505](https://github.com/hashicorp/terraform-provider-azurerm/issues/27505))\n* `azurerm_postgresql_flexible_server_configuration` - now locks to prevent conflicts when deploying multiple ([#27355](https://github.com/hashicorp/terraform-provider-azurerm/issues/27355))\n\n## 4.4.0 (October 04, 2024)\n\nENHANCEMENTS:\n\n* dependencies - update `github.com/hashicorp/go-azure-sdk` to `v0.20240923.1151247` ([#27491](https://github.com/hashicorp/terraform-provider-azurerm/issues/27491))\n* `azurerm_site_recovery_replicated_vm` - support for the `target_virtual_machine_size` property ([#27480](https://github.com/hashicorp/terraform-provider-azurerm/issues/27480))\n\nBUG FIXES:\n\n* `azurerm_app_service_certificate` - `key_vault_secret_id` can now be versionless ([#27537](https://github.com/hashicorp/terraform-provider-azurerm/issues/27537))\n* `azurerm_linux_virtual_machine_scale_set` - prevent crash when `auto_upgrade_minor_version_enabled` is nil ([#27353](https://github.com/hashicorp/terraform-provider-azurerm/issues/27353))\n* `azurerm_role_assignment` - correctly parse ID when it's a root or provider scope ([#27237](https://github.com/hashicorp/terraform-provider-azurerm/issues/27237))\n* `azurerm_storage_blob` - `source_content` is now ForceNew ([#27508](https://github.com/hashicorp/terraform-provider-azurerm/issues/27508))\n* `azurerm_virtual_network_gateway_connection` - revert `shared_key` to Optional and Computed ([#27560](https://github.com/hashicorp/terraform-provider-azurerm/issues/27560))\n\n## 4.3.0 (September 19, 2024)\n\nFEATURES:\n\n* **New Resource**: `azurerm_advisor_suppression` ([#26177](https://github.com/hashicorp/terraform-provider-azurerm/issues/26177))\n* **New Resource**: `azurerm_data_protection_backup_policy_mysql_flexible_server` ([#26955](https://github.com/hashicorp/terraform-provider-azurerm/issues/26955))\n* **New Resource**: `azurerm_key_vault_managed_hardware_security_module_key_rotation_policy` ([#27306](https://github.com/hashicorp/terraform-provider-azurerm/issues/27306))\n* **New Resource**: `azurerm_stack_hci_deployment_setting` ([#25646](https://github.com/hashicorp/terraform-provider-azurerm/issues/25646))\n* **New Resource**: `azurerm_stack_hci_storage_path` ([#26509](https://github.com/hashicorp/terraform-provider-azurerm/issues/26509))\n* **New Data Source**: `azurerm_vpn_server_configuration` ([#27054](https://github.com/hashicorp/terraform-provider-azurerm/issues/27054))\n\nENHANCEMENTS: \n\n* `managementgroups` - migrate to `hashicorp/go-azure-sdk` ([#26430](https://github.com/hashicorp/terraform-provider-azurerm/issues/26430))\n* `nginx` - upgrade API version to `2024-06-01-preview`  ([#27345](https://github.com/hashicorp/terraform-provider-azurerm/issues/27345))\n* `azurerm_linux[windows]_web[function]_app[app_slot]` - upgrade API version from `2023-01-01` to `2023-12-01` ([#27196](https://github.com/hashicorp/terraform-provider-azurerm/issues/27196))\n* `azurerm_cosmosdb_account` - support for the capability `EnableNoSQLVectorSearch` ([#27357](https://github.com/hashicorp/terraform-provider-azurerm/issues/27357))azurerm_container_app_custom_domain - fix parsing the certificate ID error #25972\n* `azurerm_container_app_custom_domain` - support other certificate types ([#25972](https://github.com/hashicorp/terraform-provider-azurerm/issues/25972))\n* `azurerm_linux_virtual_machine_scale_set` - the `zones` property can now be updated without creating a new resource ([#27288](https://github.com/hashicorp/terraform-provider-azurerm/issues/27288))\n* `azurerm_orchestrated_virtual_machine_scale_set` - the `zones` property can now be updated without creating a new resource ([#27288](https://github.com/hashicorp/terraform-provider-azurerm/issues/27288))\n* `azurerm_role_management_policy` - support for resource scope ([#27205](https://github.com/hashicorp/terraform-provider-azurerm/issues/27205))\n* `azurerm_spring_cloud_gateway` - changing the `environment_variables` and `sensitive_environment_variables` properties no longer creates a new resource ([#27404](https://github.com/hashicorp/terraform-provider-azurerm/issues/27404))\n* `azurerm_static_web_app` - support for the `public_network_access_enabled` property ([#26345](https://github.com/hashicorp/terraform-provider-azurerm/issues/26345))\n* `azurerm_shared_image` - support for the `disk_controller_type_nvme_enabled` property ([#26370](https://github.com/hashicorp/terraform-provider-azurerm/issues/26370))\n* `azurerm_storage_blob` - changing the `source` property no longer creates a new resource ([#27394](https://github.com/hashicorp/terraform-provider-azurerm/issues/27394))\n* `azurerm_storage_object_replication` - changing the `rules.x. source_container_name` and `rules.x. destination_container_name` properties no longer creates a new resource ([#27394](https://github.com/hashicorp/terraform-provider-azurerm/issues/27394))\n* `azurerm_windows_virtual_machine_scale_set` - the `zones` property can now be updated without creating a new resource ([#27288](https://github.com/hashicorp/terraform-provider-azurerm/issues/27288)) \n\nBUG FIXES:\n\n* `azurerm_application_insights` - fix crash when read for `DataVolumeCap` is `nil` ([#27352](https://github.com/hashicorp/terraform-provider-azurerm/issues/27352))\n* `azurerm_container_app` - relax validation on the ingress traffic property ([#27396](https://github.com/hashicorp/terraform-provider-azurerm/issues/27396))\n* `azurerm_log_analytics_workspace_table` - will now correctly set `total_retention_in_days` when `sku` is `Basic` ([#27420](https://github.com/hashicorp/terraform-provider-azurerm/issues/27420))\n\n## 4.2.0 (September 12, 2024)\n\nFEATURES:\n\n* **New Resource**: `azurerm_arc_machine` ([#26647](https://github.com/hashicorp/terraform-provider-azurerm/issues/26647))\n* **New Resource**: `azurerm_arc_machine_automanage_configuration_assignment` ([#26657](https://github.com/hashicorp/terraform-provider-azurerm/issues/26657)) \n\nENHANCEMENTS:\n\n* `network/bastionhosts` - upgrade API version from `2023-11-01` to `2024-01-01` ([#27277](https://github.com/hashicorp/terraform-provider-azurerm/issues/27277))\n* `recoveryservices` - upgrade `recoveryservicessiterecovery` from `2022-10-0`1 to `2024-04-01` ([#27281](https://github.com/hashicorp/terraform-provider-azurerm/issues/27281))\n* `azurerm_data_protection_backup_vault` - support for the `property cross_region_restore_enabled` property ([#27197](https://github.com/hashicorp/terraform-provider-azurerm/issues/27197))\n* `azurerm_mssql_managed_instance` - support for the `service_principal_type` property ([#27240](https://github.com/hashicorp/terraform-provider-azurerm/issues/27240))\n\nBUG FIXES:\n\n* `azurerm_cosmosdb_account` - fix crash during state migration ([#27302](https://github.com/hashicorp/terraform-provider-azurerm/issues/27302))\n* `azurerm_servicebus_queue` - fix defaults of the `default_message_ttl` and `auto_delete_on_idle` properties ([#27305](https://github.com/hashicorp/terraform-provider-azurerm/issues/27305))\n\n## 4.1.0 (September 05, 2024)\n\nENHANCEMENTS:\n\n* dependencies - bump `hashicorp/go-azure-sdk` to `v0.20240903.1111904` ([#27268](https://github.com/hashicorp/terraform-provider-azurerm/issues/27268))\n* Virtual Machine Scale Sets - upgrade API version from `2024-03-01` to `2024-07-01` ([#27230](https://github.com/hashicorp/terraform-provider-azurerm/issues/27230))\n* `hdinsights` - update the HDInsights Node definition validation of VM sizes to include new V5 types ([#27270](https://github.com/hashicorp/terraform-provider-azurerm/issues/27270))\n* `azurerm_api_management_logger` - support for the `application_insights.connection_string` property ([#27137](https://github.com/hashicorp/terraform-provider-azurerm/issues/27137))\n* `azurerm_bot_service_azure_bot` - will now send the value for the `developer_app_insights_api_key` property ([#27280](https://github.com/hashicorp/terraform-provider-azurerm/issues/27280))\n* `azurerm_netapp_volume` - support for the `smb3_protocol_encryption_enabled` property ([#27228](https://github.com/hashicorp/terraform-provider-azurerm/issues/27228))\n* `azurerm_subnet` - support `Microsoft.DevOpsInfrastructure` as delegation service ([#27259](https://github.com/hashicorp/terraform-provider-azurerm/issues/27259))\n\nBUG FIXES:\n\n* `azurerm_mysql_flexible_server` - correctly set `source_server_id` in the state file ([#27295](https://github.com/hashicorp/terraform-provider-azurerm/issues/27295))\n* `azurerm_cosmosdb_account` - the `ip_range_filter` property now supports IPV4 addresses ([#27208](https://github.com/hashicorp/terraform-provider-azurerm/issues/27208))\n* `azurerm_cosmosdb_account` - added state migration for `ip_range_filter` underlying type change from `string` to `set` ([#27276](https://github.com/hashicorp/terraform-provider-azurerm/issues/27276))\n* `azurerm_linux_virtual_machine` - the `admin_ssh_key.public_key` property now supports ed25519 ssh keys ([#27202](https://github.com/hashicorp/terraform-provider-azurerm/issues/27202))\n* `azurerm_sentinel_automation_rule` - no longer panics when using `condition_json`  ([#27269](https://github.com/hashicorp/terraform-provider-azurerm/issues/27269))\n* `azurerm_kubernetes_cluster` -  the `host_encryption_enabled` and `node_public_ip_enabled` properties are now set correctly ([#27218](https://github.com/hashicorp/terraform-provider-azurerm/issues/27218))\n\n## 4.0.1 (August 23, 2024)\n\nBUG FIXES:\n\n* provider: fix a validation bug that prevents `terraform validate` from working when `subscription_id` isn't specified ([#27178](https://github.com/hashicorp/terraform-provider-azurerm/issues/27178))\n* `azurerm_cognitive_deployment` - fixed replacement of `scale` block with `sku` ([#27173](https://github.com/hashicorp/terraform-provider-azurerm/issues/27173))\n* `azurerm_kubernetes_cluster` - prevent a panic ([#27183](https://github.com/hashicorp/terraform-provider-azurerm/issues/27183))\n* `azurerm_kubernetes_cluster_node_pool` - prevent a panic caused by renamed `enable_*` properties ([#27164](https://github.com/hashicorp/terraform-provider-azurerm/issues/27164))\n* `azurerm_sentinel_data_connector_microsoft_threat_intelligence` - prevent error by removing deprecated property `bing_safety_phishing_url_lookback_date` ([#27171](https://github.com/hashicorp/terraform-provider-azurerm/issues/27171))\n\n## 4.0.0 (August 22, 2024)\n\nNOTES:\n\n* **Major Version**: Version 4.0 of the Azure Provider is a major version - some behaviors have changed and some deprecated fields/resources have been removed - please refer to [the 4.0 upgrade guide for more information](https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/4.0-upgrade-guide).\n* When upgrading to v4.0 of the AzureRM Provider, we recommend upgrading to the latest version of Terraform Core ([which can be found here](https://www.terraform.io/downloads)).\n\nENHANCEMENTS:\n\n* Data Source: `azurerm_shared_image` - add support for the `trusted_launch_supported`, `trusted_launch_enabled`, `confidential_vm_supported`, `confidential_vm_enabled`, `accelerated_network_support_enabled` and `hibernation_enabled` properties ([#26975](https://github.com/hashicorp/terraform-provider-azurerm/issues/26975))\n* dependencies: updating `hashicorp/go-azure-sdk` to `v0.20240819.1075239` ([#27107](https://github.com/hashicorp/terraform-provider-azurerm/issues/27107))\n* `applicationgateways` - updating to use `2023-11-01` ([#26776](https://github.com/hashicorp/terraform-provider-azurerm/issues/26776))\n* `containerregistry` - updating to use `2023-06-01-preview` ([#23393](https://github.com/hashicorp/terraform-provider-azurerm/issues/23393))\n* `containerservice` - updating to `2024-05-01` ([#27105](https://github.com/hashicorp/terraform-provider-azurerm/issues/27105))\n* `mssql` - updating to use `hashicorp/go-azure-sdk` and `023-08-01-preview` ([#27073](https://github.com/hashicorp/terraform-provider-azurerm/issues/27073))\n* `mssqlmanagedinstance` - updating to use `hashicorp/go-azure-sdk` and `2023-08-01-preview` ([#26872](https://github.com/hashicorp/terraform-provider-azurerm/issues/26872))\n* `azurerm_image` - add support for the `disk_encryption_set_id` property to the `data_disk` block ([#27015](https://github.com/hashicorp/terraform-provider-azurerm/issues/27015))\n* `azurerm_log_analytics_workspace_table` - add support for more `total_retention_in_days` and `retention_in_days` values ([#27053](https://github.com/hashicorp/terraform-provider-azurerm/issues/27053))\n* `azurerm_mssql_elasticpool` - add support for the `HS_MOPRMS` and `MOPRMS` skus ([#27085](https://github.com/hashicorp/terraform-provider-azurerm/issues/27085))\n* `azurerm_netapp_pool` - allow `1` as a valid value for `size_in_tb` ([#27095](https://github.com/hashicorp/terraform-provider-azurerm/issues/27095))\n* `azurerm_notification_hub` - add support for the `browser_credential` property ([#27058](https://github.com/hashicorp/terraform-provider-azurerm/issues/27058))\n* `azurerm_redis_cache` - add support for the `access_keys_authentication_enabled` property ([#27039](https://github.com/hashicorp/terraform-provider-azurerm/issues/27039))\n* `azurerm_role_assignment` - add support for the `/`, `/providers/Microsoft.Capacity` and `/providers/Microsoft.BillingBenefits` scopes ([#26663](https://github.com/hashicorp/terraform-provider-azurerm/issues/26663))\n* `azurerm_shared_image` - add support for the `hibernation_enabled` property ([#26975](https://github.com/hashicorp/terraform-provider-azurerm/issues/26975))\n* `azurerm_storage_account` - support `queue_encryption_key_type` and `table_encryption_key_type` for more storage account kinds ([#27112](https://github.com/hashicorp/terraform-provider-azurerm/issues/27112))\n* `azurerm_web_application_firewall_policy` - add support for the `request_body_enforcement` property ([#27094](https://github.com/hashicorp/terraform-provider-azurerm/issues/27094))\n\nBUG FIXES:\n\n* `azurerm_ip_group_cidr` - fixed the position of the CIDR check to correctly refresh the resource when it's no longer present ([#27103](https://github.com/hashicorp/terraform-provider-azurerm/issues/27103))\n* `azurerm_monitor_diagnostic_setting` - add further polling to work around an eventual consistency issue when creating the resource ([#27088](https://github.com/hashicorp/terraform-provider-azurerm/issues/27088))\n* `azurerm_storage_account` - prevent API error by populating `infrastructure_encryption_enabled` when updating `customer_managed_key` ([#26971](https://github.com/hashicorp/terraform-provider-azurerm/issues/26971))\n* `azurerm_storage_blob_inventory_policy` - the `filter` property can now be set when `scope` is `container` ([#27113](https://github.com/hashicorp/terraform-provider-azurerm/issues/27113))\n* `azurerm_virtual_network_dns_servers` - moved locks to prevent the creation of subnets with stale data ([#27036](https://github.com/hashicorp/terraform-provider-azurerm/issues/27036))\n* `azurerm_virtual_network_gateway_connection` - allow `0` as a valid value for `ipsec_policy.sa_datasize` ([#27056](https://github.com/hashicorp/terraform-provider-azurerm/issues/27056))\n\n---\n\nFor information on changes between the v3.116.0 and v3.0.0 releases, please see [the previous v3.x changelog entries](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v3.md).\n\nFor information on changes between the v2.99.0 and v2.0.0 releases, please see [the previous v2.x changelog entries](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v2.md).\n\nFor information on changes between the v1.44.0 and v1.0.0 releases, please see [the previous v1.x changelog entries](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v1.md).\n\nFor information on changes prior to the v1.0.0 release, please see [the v0.x changelog](https://github.com/hashicorp/terraform-provider-azurerm/blob/main/CHANGELOG-v0.md).\n"
  },
  {
    "path": "articles/terraform/provision-infrastructure-using-azure-deployment-slots.md",
    "content": "---\ntitle: Provision infrastructure with Azure deployment slots using Terraform\ndescription: Learn how to use Terraform with Azure provider deployment slots.\nkeywords: azure devops terraform deployment slots\nms.topic: how-to\nservice: azure-app-service\nms.service: azure-app-service\nms.date: 03/18/2026\nms.custom:\n  - devx-track-terraform\n  - sfi-image-nochange\n---\n\n# Provision infrastructure with Azure deployment slots using Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nYou can use [Azure deployment slots](/azure/app-service/deploy-staging-slots) to swap between different versions of your app. That ability helps you minimize the impact of broken deployments.\n\nThis article illustrates an example use of deployment slots by walking you through the deployment of two apps via GitHub and Azure. One app is hosted in a production slot. The second app is hosted in a staging slot. (The names \"production\" and \"staging\" are arbitrary. They can be whatever is appropriate for your scenario.) After you configure your deployment slots, you use Terraform to swap between the two slots as needed.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create an App Service\n> * Create an App Service slot\n> * Swap in and out of the example deployment slots\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n- **GitHub account**: You need a [GitHub](https://www.github.com) account to fork and use the test GitHub repo.\n\n## 2. Create and apply the Terraform plan\n\n1. Browse to the [Azure portal](https://portal.azure.com).\n\n1. Open [Azure Cloud Shell](/azure/cloud-shell/overview). If you didn't select an environment previously, select **Bash** as your environment.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/azure-portal-cloud-shell-button-min.png\" alt-text=\"Screenshot of the Azure Cloud Shell prompt with the **Bash** icon highlighted.\":::\n\n1. Change directories to the `clouddrive` directory.\n\n    ```bash\n    cd clouddrive\n    ```\n\n1. Create a directory named `deploy`.\n\n    ```bash\n    mkdir deploy\n    ```\n\n1. Create a directory named `swap`.\n\n    ```bash\n    mkdir swap\n    ```\n\n1. Use the `ls` bash command to verify that you successfully created both directories.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/cloud-shell-after-creating-dirs.png\" alt-text=\"Screenshot of the Bash window in Cloud shell after the directories are created.\":::\n\n1. Change directories to the `deploy` directory.\n\n    ```bash\n    cd deploy\n    ```\n\n1. In Cloud Shell, create a file named `deploy.tf`.\n\n    ```bash\n    code deploy.tf\n    ```\n\n1. Insert the following code into the editor:\n\n    ```hcl\n    # Configure the Azure provider\n    provider \"azurerm\" { \n        # The \"feature\" block is required for AzureRM provider 2.x. \n        # If you're using version 1.x, the \"features\" block is not allowed.\n        version = \"~>2.0\"\n        features {}\n    }\n\n    resource \"azurerm_resource_group\" \"slotDemo\" {\n        name = \"slotDemoResourceGroup\"\n        location = \"westus2\"\n    }\n\n    resource \"azurerm_app_service_plan\" \"slotDemo\" {\n        name                = \"slotAppServicePlan\"\n        location            = azurerm_resource_group.slotDemo.location\n        resource_group_name = azurerm_resource_group.slotDemo.name\n        sku {\n            tier = \"Standard\"\n            size = \"S1\"\n        }\n    }\n\n    resource \"azurerm_app_service\" \"slotDemo\" {\n        name                = \"slotAppService\"\n        location            = azurerm_resource_group.slotDemo.location\n        resource_group_name = azurerm_resource_group.slotDemo.name\n        app_service_plan_id = azurerm_app_service_plan.slotDemo.id\n    }\n\n    resource \"azurerm_app_service_slot\" \"slotDemo\" {\n        name                = \"slotAppServiceSlotOne\"\n        location            = azurerm_resource_group.slotDemo.location\n        resource_group_name = azurerm_resource_group.slotDemo.name\n        app_service_plan_id = azurerm_app_service_plan.slotDemo.id\n        app_service_name    = azurerm_app_service.slotDemo.name\n    }\n    ```\n\n1. Save the file (**&lt;Ctrl>S**) and exit the editor (**&lt;Ctrl>Q**).\n\n1. Now that the file is created, you can verify its contents.\n\n    ```bash\n    cat deploy.tf\n    ```\n\n1. Initialize Terraform.\n\n    ```bash\n    terraform init\n    ```\n\n1. Create the Terraform plan.\n\n    ```bash\n    terraform plan\n    ```\n\n1. Provision the resources that are defined in the `deploy.tf` configuration file. (Confirm the action by entering `yes` at the prompt.)\n\n    ```bash\n    terraform apply\n    ```\n\n1. Close the Cloud Shell window.\n\n1. On the main menu of the Azure portal, select **Resource groups**.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/resource-groups-menu-option.png\" alt-text=\"Screesnshot showing how to select Resource groups in the main menu of the portal.\":::\n\n1. On the **Resource groups** tab, select **slotDemoResourceGroup**.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/resource-group.png\" alt-text=\"Screenshot of the Resource groups tab showing the slotDemoResourceGroup selected.\":::\n\nYou can now see all the resources that Terraform created.\n\n:::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/resources.png\" alt-text=\"Screenshot of the slotDemoResourceGroup, showing all of the resources created by Terraform.\":::\n\n## 3. Fork the test project\n\nBefore you can test the creation and swapping in and out of the deployment slots, you need to fork the test project from GitHub.\n\n1. Browse to the [awesome-terraform repo on GitHub](https://github.com/Azure/awesome-terraform).\n\n1. Fork the **awesome-terraform** repo.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/fork-repo.png\" alt-text=\"Screenshot of the top of the Code tab in GitHub for the awesome-terraform repo. The Fork button is highlighted.\":::\n\n1. Follow any prompts to fork to your environment.\n\n## 4. Deploy from GitHub to your deployment slots\n\nAfter you fork the test project repo, configure the deployment slots via the following steps:\n\n1. On the main menu of the Azure portal, select **Resource groups**.\n\n1. Select **slotDemoResourceGroup**.\n\n1. Select **slotAppService**.\n\n1. Select **Deployment options**.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/deployment-options.png\" alt-text=\"Screenshot showing 'Deployment options' selected in the m main menu for an App Service resource.\":::\n\n1. On the **Deployment option** tab, select **Choose Source**, and then select **GitHub**.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/select-source.png\" alt-text=\"Screenshot of the Deployment options tab showing GitHub selected as the deployment source.\":::\n\n1. After Azure makes the connection and displays all the options, select **Authorization**.\n\n1. On the **Authorization** tab, select **Authorize**, and supply the credentials that Azure needs to access your GitHub account. \n\n1. After Azure validates your GitHub credentials, a message appears and says that the authorization process is finished. Select **OK** to close the **Authorization** tab.\n\n1. Select **Choose your organization** and select your organization.\n\n1. Select **Choose project**.\n\n1. On the **Choose project** tab, select the **awesome-terraform** project.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/choose-project.png\" alt-text=\"Screenshot of the Choose project tab with the awesome-terraform project highlighted.\":::\n\n1. Select **Choose branch**.\n\n1. On the **Choose branch** tab, select **master**.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/choose-branch-master.png\" alt-text=\"Screenshot of the Choose branch tab with the master branch selected.\":::\n\n1. On the **Deployment option** tab, select **OK**.\n\nAt this point, you deployed the production slot. To deploy the staging slot, do the previous steps with the following modifications:\n\n- In step 3, select the **slotAppServiceSlotOne** resource.\n- In step 13, select the working branch.\n\n:::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/choose-branch-working.png\" alt-text=\"Screenshot of the Choose branch tab with the working branch selected.\":::\n\n## 5. Test the app deployments\n\nIn the previous sections, you set up two slots--**slotAppService** and **slotAppServiceSlotOne**--to deploy from different branches in GitHub. Let's preview the web apps to validate that they were successfully deployed.\n\n1. On the main menu of the Azure portal, select **Resource groups**.\n\n1. Select **slotDemoResourceGroup**.\n\n1. Select either **slotAppService** or **slotAppServiceSlotOne**.\n\n1. On the overview page, select **URL**.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/resource-url.png\" alt-text=\"Screenshot of the top of the overview page for the resource group with the URL command selected.\":::\n\n1. Depending on the selected app, you see the following results:\n   - **slotAppService** web app - Blue page with a page title of **Slot Demo App 1**. \n   - **slotAppServiceSlotOne** web app - Green page with a page title of **Slot Demo App 2**.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/app-preview.png\" alt-text=\"Screenshot of the top of two pages showing the titles Slot Demo App 1 and Slot Demo App 2. Preview the apps to test that they're deployed correctly.\":::\n\n## 6. Swap the two deployment slots\n\nTo test swapping the two deployment slots, do the following steps:\n\n1. Switch to the browser tab that's running **slotAppService** (the app with the blue page).\n\n1. Return to the Azure portal on a separate tab.\n\n1. Open Cloud Shell.\n\n1. Change directories to the **clouddrive/swap** directory.\n\n    ```bash\n    cd clouddrive/swap\n    ```\n\n1. In Cloud Shell, create a file named `swap.tf`.\n\n    ```bash\n    code swap.tf\n    ```\n\n1. Insert the following code into the editor:\n\n    ```hcl\n    # Configure the Azure provider\n    provider \"azurerm\" { \n        # The \"feature\" block is required for AzureRM provider 2.x. \n        # If you're using version 1.x, the \"features\" block is not allowed.\n        version = \"~>2.0\"\n        features {}\n    }\n\n    # Swap the production slot and the staging slot\n    resource \"azurerm_app_service_active_slot\" \"slotDemoActiveSlot\" {\n        resource_group_name   = \"slotDemoResourceGroup\"\n        app_service_name      = \"slotAppService\"\n        app_service_slot_name = \"slotappServiceSlotOne\"\n    }\n    ```\n\n1. Save the file (**&lt;Ctrl>S**) and exit the editor (**&lt;Ctrl>Q**).\n\n1. Initialize Terraform.\n\n    ```bash\n    terraform init\n    ```\n\n1. Create the Terraform plan.\n\n    ```bash\n    terraform plan\n    ```\n\n1. Provision the resources that are defined in the `swap.tf` configuration file. (Confirm the action by entering `yes` at the prompt.)\n\n    ```bash\n    terraform apply\n    ```\n\n1. After Terraform swaps the slots, return to the browser and refresh the page.\n\n   The web app in your **slotAppServiceSlotOne** staging slot is swapped with the production slot and is now rendered in green.\n\n   :::image type=\"content\" source=\"./media/provision-infrastructure-using-azure-deployment-slots/slots-swapped.png\" alt-text=\"Screenshot of the top of two pages showing the titles Slot Demo App 1 and Slot Demo App 2. The deployment slots are now swapped.\":::\n\nTo return to the original production version of the app, reapply the Terraform plan that you created from the `swap.tf` configuration file.\n\n```bash\nterraform apply\n```\n\nAfter the app is swapped, you see the original configuration.\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"] \n> [Learn more about using Terraform in Azure](/azure/terraform)"
  },
  {
    "path": "articles/terraform/quickstart-configure.md",
    "content": "---\ntitle: 'Quickstart: Install and Configure Terraform'\ndescription: Learn how to install Terraform on Windows\nkeywords: terraform azure install configure \nms.topic: quickstart\nms.date: 05/24/2021\nms.custom: devx-track-terraform, mode-api\nadobe-target: true\n# Customer intent: As an Azure user, I want to select the appropriate Terraform installation for my environment.\n---\n\n# Quickstart: Install and Configure Terraform\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\n- [Configure in Azure Cloud Shell with Bash](#configure-in-azure-cloud-shell-with-bash)\n- [Configure in Azure Cloud Shell with PowerShell](#configure-in-azure-cloud-shell-with-powershell)\n- [Configure in Windows with Bash](#configure-in-windows-with-bash)\n- [Configure in Windows with PowerShell](#configure-in-windows-with-powershell)\n\n## Prerequisites\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n## Configure in Azure Cloud Shell with Bash\n\nAzure Cloud Shell includes Terraform and automatically updates to the latest version of Terraform. However, the updates come within a couple of weeks of release. The following article shows you how to download and install the current version of Terraform using Bash within the Cloud Shell environment.\n\n- [Configure Terraform in Azure Cloud Shell with Bash](./get-started-cloud-shell-bash.md)\n\n## Configure in Azure Cloud Shell with PowerShell\n\nAzure Cloud Shell includes Terraform and automatically updates to the latest version of Terraform. However, the updates come within a couple of weeks of release. The following article shows you how to download and install the current version of Terraform using PowerShell within the Cloud Shell environment.\n\n- [Configure Terraform in Azure Cloud Shell with PowerShell](./get-started-cloud-shell-powershell.md)\n\n## Configure in Windows with Bash\n\nThe following article shows you how to install and test Terraform in Windows using a Bash emulator.\n\n- [Configure Terraform in Windows with Bash](./get-started-windows-bash.md)\n\n## Configure in Windows with PowerShell\n\nThe following article shows you how to install and test Terraform in Windows using PowerShell.\n\n- [Configure Terraform in Windows with PowerShell](./get-started-windows-powershell.md)\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Create Azure resource group](create-resource-group.md)\n"
  },
  {
    "path": "articles/terraform/services/azurerm.json",
    "content": "{\n  \"TerraformServices\": [\n    {\n      \"AzureService\": \"AAD B2C\",\n      \"keywords\": [\n        \"azurerm_aadb2c_directory\"\n      ]\n    },\n    {\n      \"AzureService\": \"API Management\",\n      \"keywords\": [\n        \"azurerm_api_management\",\n        \"azurerm_api_management_api\",\n        \"azurerm_api_management_api_diagnostic\",\n        \"azurerm_api_management_api_operation\",\n        \"azurerm_api_management_api_operation_policy\",\n        \"azurerm_api_management_api_operation_tag\",\n        \"azurerm_api_management_api_policy\",\n        \"azurerm_api_management_api_release\",\n        \"azurerm_api_management_api_schema\",\n        \"azurerm_api_management_api_tag\",\n        \"azurerm_api_management_api_tag_description\",\n        \"azurerm_api_management_api_version_set\",\n        \"azurerm_api_management_authorization_server\",\n        \"azurerm_api_management_backend\",\n        \"azurerm_api_management_certificate\",\n        \"azurerm_api_management_custom_domain\",\n        \"azurerm_api_management_diagnostic\",\n        \"azurerm_api_management_email_template\",\n        \"azurerm_api_management_gateway\",\n        \"azurerm_api_management_gateway_api\",\n        \"azurerm_api_management_gateway_certificate_authority\",\n        \"azurerm_api_management_gateway_host_name_configuration\",\n        \"azurerm_api_management_group\",\n        \"azurerm_api_management_group_user\",\n        \"azurerm_api_management_identity_provider_aad\",\n        \"azurerm_api_management_identity_provider_aadb2c\",\n        \"azurerm_api_management_identity_provider_facebook\",\n        \"azurerm_api_management_identity_provider_google\",\n        \"azurerm_api_management_identity_provider_microsoft\",\n        \"azurerm_api_management_identity_provider_twitter\",\n        \"azurerm_api_management_logger\",\n        \"azurerm_api_management_named_value\",\n        \"azurerm_api_management_notification_recipient_email\",\n        \"azurerm_api_management_notification_recipient_user\",\n        \"azurerm_api_management_openid_connect_provider\",\n        \"azurerm_api_management_policy\",\n        \"azurerm_api_management_product\",\n        \"azurerm_api_management_product_api\",\n        \"azurerm_api_management_product_group\",\n        \"azurerm_api_management_product_policy\",\n        \"azurerm_api_management_product_tag\",\n        \"azurerm_api_management_redis_cache\",\n        \"azurerm_api_management_schema\",\n        \"azurerm_api_management_subscription\",\n        \"azurerm_api_management_tag\",\n        \"azurerm_api_management_user\"\n      ]\n    },\n    {\n      \"AzureService\": \"Active Directory Domain Services\",\n      \"keywords\": [\n        \"azurerm_active_directory_domain_service\",\n        \"azurerm_active_directory_domain_service_replica_set\",\n        \"azurerm_active_directory_domain_service_trust\"\n      ]\n    },\n    {\n      \"AzureService\": \"Advisor\",\n      \"keywords\": [\n        \"azurerm_advisor_recommendations\"\n      ]\n    },\n    {\n      \"AzureService\": \"Analysis Services\",\n      \"keywords\": [\n        \"azurerm_analysis_services_server\"\n      ]\n    },\n    {\n      \"AzureService\": \"App Configuration\",\n      \"keywords\": [\n        \"azurerm_app_configuration\",\n        \"azurerm_app_configuration_feature\",\n        \"azurerm_app_configuration_key\",\n        \"azurerm_app_configuration_keys\"\n      ]\n    },\n    {\n      \"AzureService\": \"App Service (Web Apps)\",\n      \"keywords\": [\n        \"azurerm_app_service\",\n        \"azurerm_app_service_active_slot\",\n        \"azurerm_app_service_certificate\",\n        \"azurerm_app_service_certificate_binding\",\n        \"azurerm_app_service_certificate_order\",\n        \"azurerm_app_service_connection\",\n        \"azurerm_app_service_custom_hostname_binding\",\n        \"azurerm_app_service_environment\",\n        \"azurerm_app_service_environment_v3\",\n        \"azurerm_app_service_hybrid_connection\",\n        \"azurerm_app_service_managed_certificate\",\n        \"azurerm_app_service_plan\",\n        \"azurerm_app_service_public_certificate\",\n        \"azurerm_app_service_slot\",\n        \"azurerm_app_service_slot_custom_hostname_binding\",\n        \"azurerm_app_service_slot_virtual_network_swift_connection\",\n        \"azurerm_app_service_source_control\",\n        \"azurerm_app_service_source_control_slot\",\n        \"azurerm_app_service_source_control_token\",\n        \"azurerm_app_service_virtual_network_swift_connection\",\n        \"azurerm_function_app\",\n        \"azurerm_function_app_active_slot\",\n        \"azurerm_function_app_function\",\n        \"azurerm_function_app_host_keys\",\n        \"azurerm_function_app_hybrid_connection\",\n        \"azurerm_function_app_slot\",\n        \"azurerm_linux_function_app\",\n        \"azurerm_linux_function_app_slot\",\n        \"azurerm_linux_web_app\",\n        \"azurerm_linux_web_app_slot\",\n        \"azurerm_service_plan\",\n        \"azurerm_source_control_token\",\n        \"azurerm_static_site\",\n        \"azurerm_static_site_custom_domain\",\n        \"azurerm_web_app_active_slot\",\n        \"azurerm_web_app_hybrid_connection\",\n        \"azurerm_windows_function_app\",\n        \"azurerm_windows_function_app_slot\",\n        \"azurerm_windows_web_app\",\n        \"azurerm_windows_web_app_slot\"\n      ]\n    },\n    {\n      \"AzureService\": \"Application Insights\",\n      \"keywords\": [\n        \"azurerm_application_insights\",\n        \"azurerm_application_insights_analytics_item\",\n        \"azurerm_application_insights_api_key\",\n        \"azurerm_application_insights_smart_detection_rule\",\n        \"azurerm_application_insights_standard_web_test\",\n        \"azurerm_application_insights_web_test\",\n        \"azurerm_application_insights_workbook\",\n        \"azurerm_application_insights_workbook_template\"\n      ]\n    },\n    {\n      \"AzureService\": \"ArcKubernetes\",\n      \"keywords\": [\n        \"azurerm_arc_kubernetes_cluster\",\n        \"azurerm_arc_kubernetes_cluster_extension\",\n        \"azurerm_arc_kubernetes_flux_configuration\"\n      ]\n    },\n    {\n      \"AzureService\": \"Attestation\",\n      \"keywords\": [\n        \"azurerm_attestation_provider\"\n      ]\n    },\n    {\n      \"AzureService\": \"Authorization\",\n      \"keywords\": [\n        \"azurerm_federated_identity_credential\",\n        \"azurerm_role_assignment\",\n        \"azurerm_role_definition\",\n        \"azurerm_user_assigned_identity\"\n      ]\n    },\n    {\n      \"AzureService\": \"Automanage\",\n      \"keywords\": [\n        \"azurerm_automanage_configuration\"\n      ]\n    },\n    {\n      \"AzureService\": \"Automation\",\n      \"keywords\": [\n        \"azurerm_automation_account\",\n        \"azurerm_automation_certificate\",\n        \"azurerm_automation_connection\",\n        \"azurerm_automation_connection_certificate\",\n        \"azurerm_automation_connection_classic_certificate\",\n        \"azurerm_automation_connection_service_principal\",\n        \"azurerm_automation_connection_type\",\n        \"azurerm_automation_credential\",\n        \"azurerm_automation_dsc_configuration\",\n        \"azurerm_automation_dsc_nodeconfiguration\",\n        \"azurerm_automation_hybrid_runbook_worker\",\n        \"azurerm_automation_hybrid_runbook_worker_group\",\n        \"azurerm_automation_job_schedule\",\n        \"azurerm_automation_module\",\n        \"azurerm_automation_runbook\",\n        \"azurerm_automation_schedule\",\n        \"azurerm_automation_software_update_configuration\",\n        \"azurerm_automation_source_control\",\n        \"azurerm_automation_variable_bool\",\n        \"azurerm_automation_variable_datetime\",\n        \"azurerm_automation_variable_int\",\n        \"azurerm_automation_variable_string\",\n        \"azurerm_automation_watcher\",\n        \"azurerm_automation_webhook\"\n      ]\n    },\n    {\n      \"AzureService\": \"Azure Stack HCI\",\n      \"keywords\": [\n        \"azurerm_stack_hci_cluster\"\n      ]\n    },\n    {\n      \"AzureService\": \"Base\",\n      \"keywords\": [\n        \"azurerm_client_config\",\n        \"azurerm_extended_locations\",\n        \"azurerm_resource_group\",\n        \"azurerm_resource_provider_registration\",\n        \"azurerm_resources\",\n        \"azurerm_subscription\",\n        \"azurerm_subscriptions\"\n      ]\n    },\n    {\n      \"AzureService\": \"Batch\",\n      \"keywords\": [\n        \"azurerm_batch_account\",\n        \"azurerm_batch_application\",\n        \"azurerm_batch_certificate\",\n        \"azurerm_batch_job\",\n        \"azurerm_batch_pool\"\n      ]\n    },\n    {\n      \"AzureService\": \"Billing\",\n      \"keywords\": [\n        \"azurerm_billing_enrollment_account_scope\",\n        \"azurerm_billing_mca_account_scope\",\n        \"azurerm_billing_mpa_account_scope\"\n      ]\n    },\n    {\n      \"AzureService\": \"Blueprints\",\n      \"keywords\": [\n        \"azurerm_blueprint_assignment\",\n        \"azurerm_blueprint_definition\",\n        \"azurerm_blueprint_published_version\"\n      ]\n    },\n    {\n      \"AzureService\": \"Bot\",\n      \"keywords\": [\n        \"azurerm_bot_channel_alexa\",\n        \"azurerm_bot_channel_direct_line_speech\",\n        \"azurerm_bot_channel_directline\",\n        \"azurerm_bot_channel_email\",\n        \"azurerm_bot_channel_facebook\",\n        \"azurerm_bot_channel_line\",\n        \"azurerm_bot_channel_ms_teams\",\n        \"azurerm_bot_channel_slack\",\n        \"azurerm_bot_channel_sms\",\n        \"azurerm_bot_channel_web_chat\",\n        \"azurerm_bot_channels_registration\",\n        \"azurerm_bot_connection\",\n        \"azurerm_bot_healthbot\",\n        \"azurerm_bot_service_azure_bot\",\n        \"azurerm_bot_web_app\"\n      ]\n    },\n    {\n      \"AzureService\": \"CDN\",\n      \"keywords\": [\n        \"azurerm_cdn_endpoint\",\n        \"azurerm_cdn_endpoint_custom_domain\",\n        \"azurerm_cdn_frontdoor_custom_domain\",\n        \"azurerm_cdn_frontdoor_custom_domain_association\",\n        \"azurerm_cdn_frontdoor_endpoint\",\n        \"azurerm_cdn_frontdoor_firewall_policy\",\n        \"azurerm_cdn_frontdoor_origin\",\n        \"azurerm_cdn_frontdoor_origin_group\",\n        \"azurerm_cdn_frontdoor_profile\",\n        \"azurerm_cdn_frontdoor_route\",\n        \"azurerm_cdn_frontdoor_route_disable_link_to_default_domain\",\n        \"azurerm_cdn_frontdoor_rule\",\n        \"azurerm_cdn_frontdoor_rule_set\",\n        \"azurerm_cdn_frontdoor_secret\",\n        \"azurerm_cdn_frontdoor_security_policy\",\n        \"azurerm_cdn_profile\"\n      ]\n    },\n    {\n      \"AzureService\": \"Cognitive Services\",\n      \"keywords\": [\n        \"azurerm_cognitive_account\",\n        \"azurerm_cognitive_account_customer_managed_key\",\n        \"azurerm_cognitive_deployment\"\n      ]\n    },\n    {\n      \"AzureService\": \"Communication\",\n      \"keywords\": [\n        \"azurerm_communication_service\",\n        \"azurerm_email_communication_service\"\n      ]\n    },\n    {\n      \"AzureService\": \"Compute\",\n      \"keywords\": [\n        \"azurerm_availability_set\",\n        \"azurerm_capacity_reservation\",\n        \"azurerm_capacity_reservation_group\",\n        \"azurerm_dedicated_host\",\n        \"azurerm_dedicated_host_group\",\n        \"azurerm_disk_access\",\n        \"azurerm_disk_encryption_set\",\n        \"azurerm_disk_sas_token\",\n        \"azurerm_gallery_application\",\n        \"azurerm_gallery_application_version\",\n        \"azurerm_image\",\n        \"azurerm_images\",\n        \"azurerm_linux_virtual_machine\",\n        \"azurerm_linux_virtual_machine_scale_set\",\n        \"azurerm_managed_disk\",\n        \"azurerm_marketplace_agreement\",\n        \"azurerm_orchestrated_virtual_machine_scale_set\",\n        \"azurerm_platform_image\",\n        \"azurerm_proximity_placement_group\",\n        \"azurerm_shared_image\",\n        \"azurerm_shared_image_gallery\",\n        \"azurerm_shared_image_version\",\n        \"azurerm_shared_image_versions\",\n        \"azurerm_snapshot\",\n        \"azurerm_ssh_public_key\",\n        \"azurerm_virtual_machine\",\n        \"azurerm_virtual_machine_data_disk_attachment\",\n        \"azurerm_virtual_machine_extension\",\n        \"azurerm_virtual_machine_scale_set\",\n        \"azurerm_virtual_machine_scale_set_extension\",\n        \"azurerm_windows_virtual_machine\",\n        \"azurerm_windows_virtual_machine_scale_set\"\n      ]\n    },\n    {\n      \"AzureService\": \"Confidential Ledger\",\n      \"keywords\": [\n        \"azurerm_confidential_ledger\"\n      ]\n    },\n    {\n      \"AzureService\": \"Connections\",\n      \"keywords\": [\n        \"azurerm_api_connection\",\n        \"azurerm_managed_api\"\n      ]\n    },\n    {\n      \"AzureService\": \"Consumption\",\n      \"keywords\": [\n        \"azurerm_consumption_budget_management_group\",\n        \"azurerm_consumption_budget_resource_group\",\n        \"azurerm_consumption_budget_subscription\"\n      ]\n    },\n    {\n      \"AzureService\": \"Container\",\n      \"keywords\": [\n        \"azurerm_container_connected_registry\",\n        \"azurerm_container_group\",\n        \"azurerm_container_registry\",\n        \"azurerm_container_registry_agent_pool\",\n        \"azurerm_container_registry_scope_map\",\n        \"azurerm_container_registry_task\",\n        \"azurerm_container_registry_task_schedule_run_now\",\n        \"azurerm_container_registry_token\",\n        \"azurerm_container_registry_token_password\",\n        \"azurerm_container_registry_webhook\",\n        \"azurerm_kubernetes_cluster\",\n        \"azurerm_kubernetes_cluster_extension\",\n        \"azurerm_kubernetes_cluster_node_pool\",\n        \"azurerm_kubernetes_fleet_manager\",\n        \"azurerm_kubernetes_flux_configuration\",\n        \"azurerm_kubernetes_node_pool_snapshot\",\n        \"azurerm_kubernetes_service_versions\"\n      ]\n    },\n    {\n      \"AzureService\": \"Container Apps\",\n      \"keywords\": [\n        \"azurerm_container_app\",\n        \"azurerm_container_app_environment\",\n        \"azurerm_container_app_environment_certificate\",\n        \"azurerm_container_app_environment_dapr_component\",\n        \"azurerm_container_app_environment_storage\"\n      ]\n    },\n    {\n      \"AzureService\": \"CosmosDB (DocumentDB)\",\n      \"keywords\": [\n        \"azurerm_cosmosdb_account\",\n        \"azurerm_cosmosdb_cassandra_cluster\",\n        \"azurerm_cosmosdb_cassandra_datacenter\",\n        \"azurerm_cosmosdb_cassandra_keyspace\",\n        \"azurerm_cosmosdb_cassandra_table\",\n        \"azurerm_cosmosdb_gremlin_database\",\n        \"azurerm_cosmosdb_gremlin_graph\",\n        \"azurerm_cosmosdb_mongo_collection\",\n        \"azurerm_cosmosdb_mongo_database\",\n        \"azurerm_cosmosdb_mongo_role_definition\",\n        \"azurerm_cosmosdb_mongo_user_definition\",\n        \"azurerm_cosmosdb_notebook_workspace\",\n        \"azurerm_cosmosdb_postgresql_cluster\",\n        \"azurerm_cosmosdb_postgresql_coordinator_configuration\",\n        \"azurerm_cosmosdb_postgresql_firewall_rule\",\n        \"azurerm_cosmosdb_postgresql_node_configuration\",\n        \"azurerm_cosmosdb_postgresql_role\",\n        \"azurerm_cosmosdb_restorable_database_accounts\",\n        \"azurerm_cosmosdb_sql_container\",\n        \"azurerm_cosmosdb_sql_database\",\n        \"azurerm_cosmosdb_sql_dedicated_gateway\",\n        \"azurerm_cosmosdb_sql_function\",\n        \"azurerm_cosmosdb_sql_role_assignment\",\n        \"azurerm_cosmosdb_sql_role_definition\",\n        \"azurerm_cosmosdb_sql_stored_procedure\",\n        \"azurerm_cosmosdb_sql_trigger\",\n        \"azurerm_cosmosdb_table\"\n      ]\n    },\n    {\n      \"AzureService\": \"Cost Management\",\n      \"keywords\": [\n        \"azurerm_billing_account_cost_management_export\",\n        \"azurerm_cost_anomaly_alert\",\n        \"azurerm_cost_management_scheduled_action\",\n        \"azurerm_resource_group_cost_management_export\",\n        \"azurerm_resource_group_cost_management_view\",\n        \"azurerm_subscription_cost_management_export\",\n        \"azurerm_subscription_cost_management_view\"\n      ]\n    },\n    {\n      \"AzureService\": \"Custom Providers\",\n      \"keywords\": [\n        \"azurerm_custom_provider\"\n      ]\n    },\n    {\n      \"AzureService\": \"DNS\",\n      \"keywords\": [\n        \"azurerm_dns_a_record\",\n        \"azurerm_dns_aaaa_record\",\n        \"azurerm_dns_caa_record\",\n        \"azurerm_dns_cname_record\",\n        \"azurerm_dns_mx_record\",\n        \"azurerm_dns_ns_record\",\n        \"azurerm_dns_ptr_record\",\n        \"azurerm_dns_soa_record\",\n        \"azurerm_dns_srv_record\",\n        \"azurerm_dns_txt_record\",\n        \"azurerm_dns_zone\"\n      ]\n    },\n    {\n      \"AzureService\": \"Dashboard\",\n      \"keywords\": [\n        \"azurerm_dashboard_grafana\"\n      ]\n    },\n    {\n      \"AzureService\": \"Data Explorer\",\n      \"keywords\": [\n        \"azurerm_kusto_attached_database_configuration\",\n        \"azurerm_kusto_cluster\",\n        \"azurerm_kusto_cluster_customer_managed_key\",\n        \"azurerm_kusto_cluster_managed_private_endpoint\",\n        \"azurerm_kusto_cluster_principal_assignment\",\n        \"azurerm_kusto_database\",\n        \"azurerm_kusto_database_principal_assignment\",\n        \"azurerm_kusto_eventgrid_data_connection\",\n        \"azurerm_kusto_eventhub_data_connection\",\n        \"azurerm_kusto_iothub_data_connection\",\n        \"azurerm_kusto_script\"\n      ]\n    },\n    {\n      \"AzureService\": \"Data Factory\",\n      \"keywords\": [\n        \"azurerm_data_factory\",\n        \"azurerm_data_factory_custom_dataset\",\n        \"azurerm_data_factory_data_flow\",\n        \"azurerm_data_factory_dataset_azure_blob\",\n        \"azurerm_data_factory_dataset_binary\",\n        \"azurerm_data_factory_dataset_cosmosdb_sqlapi\",\n        \"azurerm_data_factory_dataset_delimited_text\",\n        \"azurerm_data_factory_dataset_http\",\n        \"azurerm_data_factory_dataset_json\",\n        \"azurerm_data_factory_dataset_mysql\",\n        \"azurerm_data_factory_dataset_parquet\",\n        \"azurerm_data_factory_dataset_postgresql\",\n        \"azurerm_data_factory_dataset_snowflake\",\n        \"azurerm_data_factory_dataset_sql_server_table\",\n        \"azurerm_data_factory_flowlet_data_flow\",\n        \"azurerm_data_factory_integration_runtime_azure\",\n        \"azurerm_data_factory_integration_runtime_azure_ssis\",\n        \"azurerm_data_factory_integration_runtime_managed\",\n        \"azurerm_data_factory_integration_runtime_self_hosted\",\n        \"azurerm_data_factory_linked_custom_service\",\n        \"azurerm_data_factory_linked_service_azure_blob_storage\",\n        \"azurerm_data_factory_linked_service_azure_databricks\",\n        \"azurerm_data_factory_linked_service_azure_file_storage\",\n        \"azurerm_data_factory_linked_service_azure_function\",\n        \"azurerm_data_factory_linked_service_azure_search\",\n        \"azurerm_data_factory_linked_service_azure_sql_database\",\n        \"azurerm_data_factory_linked_service_azure_table_storage\",\n        \"azurerm_data_factory_linked_service_cosmosdb\",\n        \"azurerm_data_factory_linked_service_cosmosdb_mongoapi\",\n        \"azurerm_data_factory_linked_service_data_lake_storage_gen2\",\n        \"azurerm_data_factory_linked_service_key_vault\",\n        \"azurerm_data_factory_linked_service_kusto\",\n        \"azurerm_data_factory_linked_service_mysql\",\n        \"azurerm_data_factory_linked_service_odata\",\n        \"azurerm_data_factory_linked_service_odbc\",\n        \"azurerm_data_factory_linked_service_postgresql\",\n        \"azurerm_data_factory_linked_service_sftp\",\n        \"azurerm_data_factory_linked_service_snowflake\",\n        \"azurerm_data_factory_linked_service_sql_server\",\n        \"azurerm_data_factory_linked_service_synapse\",\n        \"azurerm_data_factory_linked_service_web\",\n        \"azurerm_data_factory_managed_private_endpoint\",\n        \"azurerm_data_factory_pipeline\",\n        \"azurerm_data_factory_trigger_blob_event\",\n        \"azurerm_data_factory_trigger_custom_event\",\n        \"azurerm_data_factory_trigger_schedule\",\n        \"azurerm_data_factory_tumbling_window\"\n      ]\n    },\n    {\n      \"AzureService\": \"Data Share\",\n      \"keywords\": [\n        \"azurerm_data_share\",\n        \"azurerm_data_share_account\",\n        \"azurerm_data_share_dataset_blob_storage\",\n        \"azurerm_data_share_dataset_data_lake_gen2\",\n        \"azurerm_data_share_dataset_kusto_cluster\",\n        \"azurerm_data_share_dataset_kusto_database\"\n      ]\n    },\n    {\n      \"AzureService\": \"DataProtection\",\n      \"keywords\": [\n        \"azurerm_data_protection_backup_instance_blob_storage\",\n        \"azurerm_data_protection_backup_instance_disk\",\n        \"azurerm_data_protection_backup_instance_postgresql\",\n        \"azurerm_data_protection_backup_policy_blob_storage\",\n        \"azurerm_data_protection_backup_policy_disk\",\n        \"azurerm_data_protection_backup_policy_postgresql\",\n        \"azurerm_data_protection_backup_vault\",\n        \"azurerm_data_protection_resource_guard\"\n      ]\n    },\n    {\n      \"AzureService\": \"Database\",\n      \"keywords\": [\n        \"azurerm_mariadb_configuration\",\n        \"azurerm_mariadb_database\",\n        \"azurerm_mariadb_firewall_rule\",\n        \"azurerm_mariadb_server\",\n        \"azurerm_mariadb_virtual_network_rule\",\n        \"azurerm_mssql_database\",\n        \"azurerm_mssql_database_extended_auditing_policy\",\n        \"azurerm_mssql_database_vulnerability_assessment_rule_baseline\",\n        \"azurerm_mssql_elasticpool\",\n        \"azurerm_mssql_failover_group\",\n        \"azurerm_mssql_firewall_rule\",\n        \"azurerm_mssql_job_agent\",\n        \"azurerm_mssql_job_credential\",\n        \"azurerm_mssql_managed_database\",\n        \"azurerm_mssql_managed_instance\",\n        \"azurerm_mssql_managed_instance_active_directory_administrator\",\n        \"azurerm_mssql_managed_instance_failover_group\",\n        \"azurerm_mssql_managed_instance_security_alert_policy\",\n        \"azurerm_mssql_managed_instance_transparent_data_encryption\",\n        \"azurerm_mssql_managed_instance_vulnerability_assessment\",\n        \"azurerm_mssql_outbound_firewall_rule\",\n        \"azurerm_mssql_server\",\n        \"azurerm_mssql_server_dns_alias\",\n        \"azurerm_mssql_server_extended_auditing_policy\",\n        \"azurerm_mssql_server_microsoft_support_auditing_policy\",\n        \"azurerm_mssql_server_security_alert_policy\",\n        \"azurerm_mssql_server_transparent_data_encryption\",\n        \"azurerm_mssql_server_vulnerability_assessment\",\n        \"azurerm_mssql_virtual_machine\",\n        \"azurerm_mssql_virtual_network_rule\",\n        \"azurerm_mysql_active_directory_administrator\",\n        \"azurerm_mysql_configuration\",\n        \"azurerm_mysql_database\",\n        \"azurerm_mysql_firewall_rule\",\n        \"azurerm_mysql_flexible_database\",\n        \"azurerm_mysql_flexible_server\",\n        \"azurerm_mysql_flexible_server_aad_administrator\",\n        \"azurerm_mysql_flexible_server_configuration\",\n        \"azurerm_mysql_flexible_server_firewall_rule\",\n        \"azurerm_mysql_server\",\n        \"azurerm_mysql_server_key\",\n        \"azurerm_mysql_virtual_network_rule\",\n        \"azurerm_postgresql_active_directory_administrator\",\n        \"azurerm_postgresql_configuration\",\n        \"azurerm_postgresql_database\",\n        \"azurerm_postgresql_firewall_rule\",\n        \"azurerm_postgresql_flexible_server\",\n        \"azurerm_postgresql_flexible_server_active_directory_administrator\",\n        \"azurerm_postgresql_flexible_server_configuration\",\n        \"azurerm_postgresql_flexible_server_database\",\n        \"azurerm_postgresql_flexible_server_firewall_rule\",\n        \"azurerm_postgresql_server\",\n        \"azurerm_postgresql_server_key\",\n        \"azurerm_postgresql_virtual_network_rule\",\n        \"azurerm_sql_active_directory_administrator\",\n        \"azurerm_sql_database\",\n        \"azurerm_sql_elasticpool\",\n        \"azurerm_sql_failover_group\",\n        \"azurerm_sql_firewall_rule\",\n        \"azurerm_sql_managed_database\",\n        \"azurerm_sql_managed_instance\",\n        \"azurerm_sql_managed_instance_active_directory_administrator\",\n        \"azurerm_sql_managed_instance_failover_group\",\n        \"azurerm_sql_server\",\n        \"azurerm_sql_virtual_network_rule\"\n      ]\n    },\n    {\n      \"AzureService\": \"Database Migration\",\n      \"keywords\": [\n        \"azurerm_database_migration_project\",\n        \"azurerm_database_migration_service\"\n      ]\n    },\n    {\n      \"AzureService\": \"Databox Edge\",\n      \"keywords\": [\n        \"azurerm_databox_edge_device\",\n        \"azurerm_databox_edge_order\"\n      ]\n    },\n    {\n      \"AzureService\": \"Databricks\",\n      \"keywords\": [\n        \"azurerm_databricks_access_connector\",\n        \"azurerm_databricks_virtual_network_peering\",\n        \"azurerm_databricks_workspace\",\n        \"azurerm_databricks_workspace_customer_managed_key\",\n        \"azurerm_databricks_workspace_private_endpoint_connection\"\n      ]\n    },\n    {\n      \"AzureService\": \"Datadog\",\n      \"keywords\": [\n        \"azurerm_datadog_monitor_sso_configuration\",\n        \"azurerm_datadog_monitor_tag_rule\",\n        \"azurerm_datadog_monitors\"\n      ]\n    },\n    {\n      \"AzureService\": \"Desktop Virtualization\",\n      \"keywords\": [\n        \"azurerm_virtual_desktop_application\",\n        \"azurerm_virtual_desktop_application_group\",\n        \"azurerm_virtual_desktop_host_pool\",\n        \"azurerm_virtual_desktop_host_pool_registration_info\",\n        \"azurerm_virtual_desktop_scaling_plan\",\n        \"azurerm_virtual_desktop_workspace\",\n        \"azurerm_virtual_desktop_workspace_application_group_association\"\n      ]\n    },\n    {\n      \"AzureService\": \"Dev Test\",\n      \"keywords\": [\n        \"azurerm_dev_test_global_vm_shutdown_schedule\",\n        \"azurerm_dev_test_lab\",\n        \"azurerm_dev_test_linux_virtual_machine\",\n        \"azurerm_dev_test_policy\",\n        \"azurerm_dev_test_schedule\",\n        \"azurerm_dev_test_virtual_network\",\n        \"azurerm_dev_test_windows_virtual_machine\"\n      ]\n    },\n    {\n      \"AzureService\": \"Digital Twins\",\n      \"keywords\": [\n        \"azurerm_digital_twins_endpoint_eventgrid\",\n        \"azurerm_digital_twins_endpoint_eventhub\",\n        \"azurerm_digital_twins_endpoint_servicebus\",\n        \"azurerm_digital_twins_instance\",\n        \"azurerm_digital_twins_time_series_database_connection\"\n      ]\n    },\n    {\n      \"AzureService\": \"Disks\",\n      \"keywords\": [\n        \"azurerm_disk_pool\",\n        \"azurerm_disk_pool_iscsi_target\",\n        \"azurerm_disk_pool_iscsi_target_lun\",\n        \"azurerm_disk_pool_managed_disk_attachment\"\n      ]\n    },\n    {\n      \"AzureService\": \"Elastic\",\n      \"keywords\": [\n        \"azurerm_elastic_cloud_elasticsearch\"\n      ]\n    },\n    {\n      \"AzureService\": \"Fluid Relay\",\n      \"keywords\": [\n        \"azurerm_fluid_relay_servers\"\n      ]\n    },\n    {\n      \"AzureService\": \"HDInsight\",\n      \"keywords\": [\n        \"azurerm_hdinsight_cluster\",\n        \"azurerm_hdinsight_hadoop_cluster\",\n        \"azurerm_hdinsight_hbase_cluster\",\n        \"azurerm_hdinsight_interactive_query_cluster\",\n        \"azurerm_hdinsight_kafka_cluster\",\n        \"azurerm_hdinsight_spark_cluster\"\n      ]\n    },\n    {\n      \"AzureService\": \"Hardware Security Module\",\n      \"keywords\": [\n        \"azurerm_dedicated_hardware_security_module\"\n      ]\n    },\n    {\n      \"AzureService\": \"Healthcare\",\n      \"keywords\": [\n        \"azurerm_healthcare_dicom\",\n        \"azurerm_healthcare_fhir_service\",\n        \"azurerm_healthcare_medtech_service\",\n        \"azurerm_healthcare_medtech_service_fhir_destination\",\n        \"azurerm_healthcare_service\",\n        \"azurerm_healthcare_workspace\"\n      ]\n    },\n    {\n      \"AzureService\": \"Hybrid Compute\",\n      \"keywords\": [\n        \"azurerm_arc_machine\",\n        \"azurerm_arc_machine_extension\",\n        \"azurerm_hybrid_compute_machine\"\n      ]\n    },\n    {\n      \"AzureService\": \"IoT Central\",\n      \"keywords\": [\n        \"azurerm_iotcentral_application\",\n        \"azurerm_iotcentral_application_network_rule_set\"\n      ]\n    },\n    {\n      \"AzureService\": \"IoT Hub\",\n      \"keywords\": [\n        \"azurerm_iothub\",\n        \"azurerm_iothub_certificate\",\n        \"azurerm_iothub_consumer_group\",\n        \"azurerm_iothub_device_update_account\",\n        \"azurerm_iothub_device_update_instance\",\n        \"azurerm_iothub_dps\",\n        \"azurerm_iothub_dps_certificate\",\n        \"azurerm_iothub_dps_shared_access_policy\",\n        \"azurerm_iothub_file_upload\",\n        \"azurerm_iothub_shared_access_policy\"\n      ]\n    },\n    {\n      \"AzureService\": \"Key Vault\",\n      \"keywords\": [\n        \"azurerm_key_vault\",\n        \"azurerm_key_vault_access_policy\",\n        \"azurerm_key_vault_certificate\",\n        \"azurerm_key_vault_certificate_contacts\",\n        \"azurerm_key_vault_certificate_data\",\n        \"azurerm_key_vault_certificate_issuer\",\n        \"azurerm_key_vault_certificates\",\n        \"azurerm_key_vault_encrypted_value\",\n        \"azurerm_key_vault_key\",\n        \"azurerm_key_vault_managed_hardware_security_module\",\n        \"azurerm_key_vault_managed_storage_account\",\n        \"azurerm_key_vault_managed_storage_account_sas_token_definition\",\n        \"azurerm_key_vault_secret\",\n        \"azurerm_key_vault_secrets\"\n      ]\n    },\n    {\n      \"AzureService\": \"Lab Service\",\n      \"keywords\": [\n        \"azurerm_lab_service_lab\",\n        \"azurerm_lab_service_plan\",\n        \"azurerm_lab_service_schedule\",\n        \"azurerm_lab_service_user\"\n      ]\n    },\n    {\n      \"AzureService\": \"Lighthouse\",\n      \"keywords\": [\n        \"azurerm_lighthouse_assignment\",\n        \"azurerm_lighthouse_definition\"\n      ]\n    },\n    {\n      \"AzureService\": \"Load Balancer\",\n      \"keywords\": [\n        \"azurerm_lb\",\n        \"azurerm_lb_backend_address_pool\",\n        \"azurerm_lb_backend_address_pool_address\",\n        \"azurerm_lb_nat_pool\",\n        \"azurerm_lb_nat_rule\",\n        \"azurerm_lb_outbound_rule\",\n        \"azurerm_lb_probe\",\n        \"azurerm_lb_rule\"\n      ]\n    },\n    {\n      \"AzureService\": \"Load Test\",\n      \"keywords\": [\n        \"azurerm_load_test\"\n      ]\n    },\n    {\n      \"AzureService\": \"Log Analytics\",\n      \"keywords\": [\n        \"azurerm_log_analytics_cluster\",\n        \"azurerm_log_analytics_cluster_customer_managed_key\",\n        \"azurerm_log_analytics_data_export_rule\",\n        \"azurerm_log_analytics_datasource_windows_event\",\n        \"azurerm_log_analytics_datasource_windows_performance_counter\",\n        \"azurerm_log_analytics_linked_service\",\n        \"azurerm_log_analytics_linked_storage_account\",\n        \"azurerm_log_analytics_query_pack\",\n        \"azurerm_log_analytics_query_pack_query\",\n        \"azurerm_log_analytics_saved_search\",\n        \"azurerm_log_analytics_solution\",\n        \"azurerm_log_analytics_storage_insights\",\n        \"azurerm_log_analytics_workspace\"\n      ]\n    },\n    {\n      \"AzureService\": \"Logic App\",\n      \"keywords\": [\n        \"azurerm_integration_service_environment\",\n        \"azurerm_logic_app_action_custom\",\n        \"azurerm_logic_app_action_http\",\n        \"azurerm_logic_app_integration_account\",\n        \"azurerm_logic_app_integration_account_agreement\",\n        \"azurerm_logic_app_integration_account_assembly\",\n        \"azurerm_logic_app_integration_account_batch_configuration\",\n        \"azurerm_logic_app_integration_account_certificate\",\n        \"azurerm_logic_app_integration_account_map\",\n        \"azurerm_logic_app_integration_account_partner\",\n        \"azurerm_logic_app_integration_account_schema\",\n        \"azurerm_logic_app_integration_account_session\",\n        \"azurerm_logic_app_standard\",\n        \"azurerm_logic_app_trigger_custom\",\n        \"azurerm_logic_app_trigger_http_request\",\n        \"azurerm_logic_app_trigger_recurrence\",\n        \"azurerm_logic_app_workflow\"\n      ]\n    },\n    {\n      \"AzureService\": \"Logz\",\n      \"keywords\": [\n        \"azurerm_logz_monitor\",\n        \"azurerm_logz_sub_account\",\n        \"azurerm_logz_sub_account_tag_rule\",\n        \"azurerm_logz_tag_rule\"\n      ]\n    },\n    {\n      \"AzureService\": \"Machine Learning\",\n      \"keywords\": [\n        \"azurerm_machine_learning_compute_cluster\",\n        \"azurerm_machine_learning_compute_instance\",\n        \"azurerm_machine_learning_datastore_blobstorage\",\n        \"azurerm_machine_learning_datastore_datalake_gen2\",\n        \"azurerm_machine_learning_datastore_fileshare\",\n        \"azurerm_machine_learning_inference_cluster\",\n        \"azurerm_machine_learning_synapse_spark\",\n        \"azurerm_machine_learning_workspace\"\n      ]\n    },\n    {\n      \"AzureService\": \"Maintenance\",\n      \"keywords\": [\n        \"azurerm_maintenance_assignment_dedicated_host\",\n        \"azurerm_maintenance_assignment_virtual_machine\",\n        \"azurerm_maintenance_assignment_virtual_machine_scale_set\",\n        \"azurerm_maintenance_configuration\",\n        \"azurerm_public_maintenance_configurations\"\n      ]\n    },\n    {\n      \"AzureService\": \"Managed Applications\",\n      \"keywords\": [\n        \"azurerm_managed_application\",\n        \"azurerm_managed_application_definition\"\n      ]\n    },\n    {\n      \"AzureService\": \"Management\",\n      \"keywords\": [\n        \"azurerm_management_group\",\n        \"azurerm_management_group_subscription_association\",\n        \"azurerm_management_lock\"\n      ]\n    },\n    {\n      \"AzureService\": \"Maps\",\n      \"keywords\": [\n        \"azurerm_maps_account\",\n        \"azurerm_maps_creator\"\n      ]\n    },\n    {\n      \"AzureService\": \"Media\",\n      \"keywords\": [\n        \"azurerm_media_asset\",\n        \"azurerm_media_asset_filter\",\n        \"azurerm_media_content_key_policy\",\n        \"azurerm_media_job\",\n        \"azurerm_media_live_event\",\n        \"azurerm_media_live_output\",\n        \"azurerm_media_services_account\",\n        \"azurerm_media_services_account_filter\",\n        \"azurerm_media_streaming_endpoint\",\n        \"azurerm_media_streaming_locator\",\n        \"azurerm_media_streaming_policy\",\n        \"azurerm_media_transform\"\n      ]\n    },\n    {\n      \"AzureService\": \"Messaging\",\n      \"keywords\": [\n        \"azurerm_eventgrid_domain\",\n        \"azurerm_eventgrid_domain_topic\",\n        \"azurerm_eventgrid_event_subscription\",\n        \"azurerm_eventgrid_system_topic\",\n        \"azurerm_eventgrid_system_topic_event_subscription\",\n        \"azurerm_eventgrid_topic\",\n        \"azurerm_eventhub\",\n        \"azurerm_eventhub_authorization_rule\",\n        \"azurerm_eventhub_cluster\",\n        \"azurerm_eventhub_consumer_group\",\n        \"azurerm_eventhub_namespace\",\n        \"azurerm_eventhub_namespace_authorization_rule\",\n        \"azurerm_eventhub_namespace_customer_managed_key\",\n        \"azurerm_eventhub_namespace_disaster_recovery_config\",\n        \"azurerm_eventhub_namespace_schema_group\",\n        \"azurerm_iothub_endpoint_eventhub\",\n        \"azurerm_iothub_endpoint_servicebus_queue\",\n        \"azurerm_iothub_endpoint_servicebus_topic\",\n        \"azurerm_iothub_endpoint_storage_container\",\n        \"azurerm_iothub_enrichment\",\n        \"azurerm_iothub_fallback_route\",\n        \"azurerm_iothub_route\",\n        \"azurerm_notification_hub\",\n        \"azurerm_notification_hub_authorization_rule\",\n        \"azurerm_notification_hub_namespace\",\n        \"azurerm_relay_hybrid_connection\",\n        \"azurerm_relay_hybrid_connection_authorization_rule\",\n        \"azurerm_relay_namespace\",\n        \"azurerm_relay_namespace_authorization_rule\",\n        \"azurerm_servicebus_namespace\",\n        \"azurerm_servicebus_namespace_authorization_rule\",\n        \"azurerm_servicebus_namespace_disaster_recovery_config\",\n        \"azurerm_servicebus_namespace_network_rule_set\",\n        \"azurerm_servicebus_queue\",\n        \"azurerm_servicebus_queue_authorization_rule\",\n        \"azurerm_servicebus_subscription\",\n        \"azurerm_servicebus_subscription_rule\",\n        \"azurerm_servicebus_topic\",\n        \"azurerm_servicebus_topic_authorization_rule\",\n        \"azurerm_signalr_service\",\n        \"azurerm_signalr_service_custom_certificate\",\n        \"azurerm_signalr_service_custom_domain\",\n        \"azurerm_signalr_service_network_acl\",\n        \"azurerm_signalr_shared_private_link\",\n        \"azurerm_web_pubsub\",\n        \"azurerm_web_pubsub_custom_certificate\",\n        \"azurerm_web_pubsub_custom_domain\",\n        \"azurerm_web_pubsub_hub\",\n        \"azurerm_web_pubsub_network_acl\",\n        \"azurerm_web_pubsub_private_link_resource\",\n        \"azurerm_web_pubsub_shared_private_link\"\n      ]\n    },\n    {\n      \"AzureService\": \"Mixed Reality\",\n      \"keywords\": [\n        \"azurerm_spatial_anchors_account\"\n      ]\n    },\n    {\n      \"AzureService\": \"Mobile Network\",\n      \"keywords\": [\n        \"azurerm_mobile_network\",\n        \"azurerm_mobile_network_data_network\",\n        \"azurerm_mobile_network_packet_core_control_plane\",\n        \"azurerm_mobile_network_packet_core_data_plane\",\n        \"azurerm_mobile_network_service\",\n        \"azurerm_mobile_network_sim_group\",\n        \"azurerm_mobile_network_sim_policy\",\n        \"azurerm_mobile_network_site\",\n        \"azurerm_mobile_network_slice\"\n      ]\n    },\n    {\n      \"AzureService\": \"Monitor\",\n      \"keywords\": [\n        \"azurerm_monitor_aad_diagnostic_setting\",\n        \"azurerm_monitor_action_group\",\n        \"azurerm_monitor_action_rule_action_group\",\n        \"azurerm_monitor_action_rule_suppression\",\n        \"azurerm_monitor_activity_log_alert\",\n        \"azurerm_monitor_alert_processing_rule_action_group\",\n        \"azurerm_monitor_alert_processing_rule_suppression\",\n        \"azurerm_monitor_alert_prometheus_rule_group\",\n        \"azurerm_monitor_autoscale_setting\",\n        \"azurerm_monitor_data_collection_endpoint\",\n        \"azurerm_monitor_data_collection_rule\",\n        \"azurerm_monitor_data_collection_rule_association\",\n        \"azurerm_monitor_diagnostic_categories\",\n        \"azurerm_monitor_diagnostic_setting\",\n        \"azurerm_monitor_log_profile\",\n        \"azurerm_monitor_metric_alert\",\n        \"azurerm_monitor_private_link_scope\",\n        \"azurerm_monitor_private_link_scoped_service\",\n        \"azurerm_monitor_scheduled_query_rules_alert\",\n        \"azurerm_monitor_scheduled_query_rules_alert_v2\",\n        \"azurerm_monitor_scheduled_query_rules_log\",\n        \"azurerm_monitor_smart_detector_alert_rule\",\n        \"azurerm_monitor_workspace\"\n      ]\n    },\n    {\n      \"AzureService\": \"NetApp\",\n      \"keywords\": [\n        \"azurerm_netapp_account\",\n        \"azurerm_netapp_pool\",\n        \"azurerm_netapp_snapshot\",\n        \"azurerm_netapp_snapshot_policy\",\n        \"azurerm_netapp_volume\",\n        \"azurerm_netapp_volume_group_sap_hana\"\n      ]\n    },\n    {\n      \"AzureService\": \"Network\",\n      \"keywords\": [\n        \"azurerm_application_gateway\",\n        \"azurerm_application_security_group\",\n        \"azurerm_bastion_host\",\n        \"azurerm_express_route_circuit\",\n        \"azurerm_express_route_circuit_authorization\",\n        \"azurerm_express_route_circuit_connection\",\n        \"azurerm_express_route_circuit_peering\",\n        \"azurerm_express_route_connection\",\n        \"azurerm_express_route_gateway\",\n        \"azurerm_express_route_port\",\n        \"azurerm_express_route_port_authorization\",\n        \"azurerm_firewall\",\n        \"azurerm_firewall_application_rule_collection\",\n        \"azurerm_firewall_nat_rule_collection\",\n        \"azurerm_firewall_network_rule_collection\",\n        \"azurerm_firewall_policy\",\n        \"azurerm_firewall_policy_rule_collection_group\",\n        \"azurerm_frontdoor\",\n        \"azurerm_frontdoor_custom_https_configuration\",\n        \"azurerm_frontdoor_firewall_policy\",\n        \"azurerm_frontdoor_rules_engine\",\n        \"azurerm_ip_group\",\n        \"azurerm_ip_group_cidr\",\n        \"azurerm_local_network_gateway\",\n        \"azurerm_nat_gateway\",\n        \"azurerm_nat_gateway_public_ip_association\",\n        \"azurerm_nat_gateway_public_ip_prefix_association\",\n        \"azurerm_network_connection_monitor\",\n        \"azurerm_network_ddos_protection_plan\",\n        \"azurerm_network_interface\",\n        \"azurerm_network_interface_application_gateway_backend_address_pool_association\",\n        \"azurerm_network_interface_application_security_group_association\",\n        \"azurerm_network_interface_backend_address_pool_association\",\n        \"azurerm_network_interface_nat_rule_association\",\n        \"azurerm_network_interface_security_group_association\",\n        \"azurerm_network_manager\",\n        \"azurerm_network_manager_admin_rule\",\n        \"azurerm_network_manager_admin_rule_collection\",\n        \"azurerm_network_manager_connectivity_configuration\",\n        \"azurerm_network_manager_deployment\",\n        \"azurerm_network_manager_management_group_connection\",\n        \"azurerm_network_manager_network_group\",\n        \"azurerm_network_manager_scope_connection\",\n        \"azurerm_network_manager_security_admin_configuration\",\n        \"azurerm_network_manager_static_member\",\n        \"azurerm_network_manager_subscription_connection\",\n        \"azurerm_network_packet_capture\",\n        \"azurerm_network_profile\",\n        \"azurerm_network_security_group\",\n        \"azurerm_network_security_rule\",\n        \"azurerm_network_service_tags\",\n        \"azurerm_network_watcher\",\n        \"azurerm_network_watcher_flow_log\",\n        \"azurerm_point_to_site_vpn_gateway\",\n        \"azurerm_private_endpoint\",\n        \"azurerm_private_endpoint_application_security_group_association\",\n        \"azurerm_private_endpoint_connection\",\n        \"azurerm_private_link_service\",\n        \"azurerm_private_link_service_endpoint_connections\",\n        \"azurerm_public_ip\",\n        \"azurerm_public_ip_prefix\",\n        \"azurerm_public_ips\",\n        \"azurerm_route\",\n        \"azurerm_route_filter\",\n        \"azurerm_route_map\",\n        \"azurerm_route_server\",\n        \"azurerm_route_server_bgp_connection\",\n        \"azurerm_route_table\",\n        \"azurerm_subnet\",\n        \"azurerm_subnet_nat_gateway_association\",\n        \"azurerm_subnet_network_security_group_association\",\n        \"azurerm_subnet_route_table_association\",\n        \"azurerm_subnet_service_endpoint_storage_policy\",\n        \"azurerm_traffic_manager_azure_endpoint\",\n        \"azurerm_traffic_manager_external_endpoint\",\n        \"azurerm_traffic_manager_geographical_location\",\n        \"azurerm_traffic_manager_nested_endpoint\",\n        \"azurerm_traffic_manager_profile\",\n        \"azurerm_virtual_hub\",\n        \"azurerm_virtual_hub_bgp_connection\",\n        \"azurerm_virtual_hub_connection\",\n        \"azurerm_virtual_hub_ip\",\n        \"azurerm_virtual_hub_route_table\",\n        \"azurerm_virtual_hub_route_table_route\",\n        \"azurerm_virtual_hub_security_partner_provider\",\n        \"azurerm_virtual_machine_packet_capture\",\n        \"azurerm_virtual_machine_scale_set_packet_capture\",\n        \"azurerm_virtual_network\",\n        \"azurerm_virtual_network_dns_servers\",\n        \"azurerm_virtual_network_gateway\",\n        \"azurerm_virtual_network_gateway_connection\",\n        \"azurerm_virtual_network_gateway_nat_rule\",\n        \"azurerm_virtual_network_peering\",\n        \"azurerm_virtual_wan\",\n        \"azurerm_vpn_gateway\",\n        \"azurerm_vpn_gateway_connection\",\n        \"azurerm_vpn_gateway_nat_rule\",\n        \"azurerm_vpn_server_configuration\",\n        \"azurerm_vpn_server_configuration_policy_group\",\n        \"azurerm_vpn_site\",\n        \"azurerm_web_application_firewall_policy\"\n      ]\n    },\n    {\n      \"AzureService\": \"Nginx\",\n      \"keywords\": [\n        \"azurerm_nginx_certificate\",\n        \"azurerm_nginx_configuration\",\n        \"azurerm_nginx_deployment\"\n      ]\n    },\n    {\n      \"AzureService\": \"Orbital\",\n      \"keywords\": [\n        \"azurerm_orbital_contact\",\n        \"azurerm_orbital_contact_profile\",\n        \"azurerm_orbital_spacecraft\"\n      ]\n    },\n    {\n      \"AzureService\": \"Policy\",\n      \"keywords\": [\n        \"azurerm_management_group_policy_assignment\",\n        \"azurerm_management_group_policy_exemption\",\n        \"azurerm_management_group_policy_remediation\",\n        \"azurerm_policy_assignment\",\n        \"azurerm_policy_definition\",\n        \"azurerm_policy_definition_built_in\",\n        \"azurerm_policy_set_definition\",\n        \"azurerm_policy_virtual_machine_configuration_assignment\",\n        \"azurerm_resource_group_policy_assignment\",\n        \"azurerm_resource_group_policy_exemption\",\n        \"azurerm_resource_group_policy_remediation\",\n        \"azurerm_resource_policy_assignment\",\n        \"azurerm_resource_policy_exemption\",\n        \"azurerm_resource_policy_remediation\",\n        \"azurerm_subscription_policy_assignment\",\n        \"azurerm_subscription_policy_exemption\",\n        \"azurerm_subscription_policy_remediation\"\n      ]\n    },\n    {\n      \"AzureService\": \"Portal\",\n      \"keywords\": [\n        \"azurerm_dashboard\",\n        \"azurerm_portal_dashboard\",\n        \"azurerm_portal_tenant_configuration\"\n      ]\n    },\n    {\n      \"AzureService\": \"PowerBI\",\n      \"keywords\": [\n        \"azurerm_powerbi_embedded\"\n      ]\n    },\n    {\n      \"AzureService\": \"Private DNS\",\n      \"keywords\": [\n        \"azurerm_private_dns_a_record\",\n        \"azurerm_private_dns_aaaa_record\",\n        \"azurerm_private_dns_cname_record\",\n        \"azurerm_private_dns_mx_record\",\n        \"azurerm_private_dns_ptr_record\",\n        \"azurerm_private_dns_soa_record\",\n        \"azurerm_private_dns_srv_record\",\n        \"azurerm_private_dns_txt_record\",\n        \"azurerm_private_dns_zone\",\n        \"azurerm_private_dns_zone_virtual_network_link\"\n      ]\n    },\n    {\n      \"AzureService\": \"Private DNS Resolver\",\n      \"keywords\": [\n        \"azurerm_private_dns_resolver\",\n        \"azurerm_private_dns_resolver_dns_forwarding_ruleset\",\n        \"azurerm_private_dns_resolver_forwarding_rule\",\n        \"azurerm_private_dns_resolver_inbound_endpoint\",\n        \"azurerm_private_dns_resolver_outbound_endpoint\",\n        \"azurerm_private_dns_resolver_virtual_network_link\"\n      ]\n    },\n    {\n      \"AzureService\": \"Purview\",\n      \"keywords\": [\n        \"azurerm_purview_account\"\n      ]\n    },\n    {\n      \"AzureService\": \"Recovery Services\",\n      \"keywords\": [\n        \"azurerm_backup_container_storage_account\",\n        \"azurerm_backup_policy_file_share\",\n        \"azurerm_backup_policy_vm\",\n        \"azurerm_backup_policy_vm_workload\",\n        \"azurerm_backup_protected_file_share\",\n        \"azurerm_backup_protected_vm\",\n        \"azurerm_recovery_services_vault\",\n        \"azurerm_recovery_services_vault_resource_guard_association\",\n        \"azurerm_site_recovery_fabric\",\n        \"azurerm_site_recovery_hyperv_network_mapping\",\n        \"azurerm_site_recovery_hyperv_replication_policy\",\n        \"azurerm_site_recovery_hyperv_replication_policy_association\",\n        \"azurerm_site_recovery_network_mapping\",\n        \"azurerm_site_recovery_protection_container\",\n        \"azurerm_site_recovery_protection_container_mapping\",\n        \"azurerm_site_recovery_replicated_vm\",\n        \"azurerm_site_recovery_replication_policy\",\n        \"azurerm_site_recovery_replication_recovery_plan\",\n        \"azurerm_site_recovery_services_vault_hyperv_site\",\n        \"azurerm_site_recovery_vmware_replication_policy\",\n        \"azurerm_site_recovery_vmware_replication_policy_association\"\n      ]\n    },\n    {\n      \"AzureService\": \"Redis\",\n      \"keywords\": [\n        \"azurerm_redis_cache\",\n        \"azurerm_redis_firewall_rule\",\n        \"azurerm_redis_linked_server\"\n      ]\n    },\n    {\n      \"AzureService\": \"Redis Enterprise\",\n      \"keywords\": [\n        \"azurerm_redis_enterprise_cluster\",\n        \"azurerm_redis_enterprise_database\"\n      ]\n    },\n    {\n      \"AzureService\": \"Search\",\n      \"keywords\": [\n        \"azurerm_search_service\",\n        \"azurerm_search_shared_private_link_service\"\n      ]\n    },\n    {\n      \"AzureService\": \"Security Center\",\n      \"keywords\": [\n        \"azurerm_advanced_threat_protection\",\n        \"azurerm_azurerm_security_center_server_vulnerability_assessment\",\n        \"azurerm_iot_security_device_group\",\n        \"azurerm_iot_security_solution\",\n        \"azurerm_security_center_assessment\",\n        \"azurerm_security_center_assessment_policy\",\n        \"azurerm_security_center_auto_provisioning\",\n        \"azurerm_security_center_automation\",\n        \"azurerm_security_center_contact\",\n        \"azurerm_security_center_server_vulnerability_assessment_virtual_machine\",\n        \"azurerm_security_center_setting\",\n        \"azurerm_security_center_subscription_pricing\",\n        \"azurerm_security_center_workspace\"\n      ]\n    },\n    {\n      \"AzureService\": \"Sentinel\",\n      \"keywords\": [\n        \"azurerm_azurerm_sentinel_alert_rule_machine_learning_behavior_analytics\",\n        \"azurerm_sentinel_alert_rule\",\n        \"azurerm_sentinel_alert_rule_anomaly\",\n        \"azurerm_sentinel_alert_rule_anomaly_built_in\",\n        \"azurerm_sentinel_alert_rule_anomaly_duplicate\",\n        \"azurerm_sentinel_alert_rule_fusion\",\n        \"azurerm_sentinel_alert_rule_ms_security_incident\",\n        \"azurerm_sentinel_alert_rule_nrt\",\n        \"azurerm_sentinel_alert_rule_scheduled\",\n        \"azurerm_sentinel_alert_rule_template\",\n        \"azurerm_sentinel_alert_rule_threat_intelligence\",\n        \"azurerm_sentinel_automation_rule\",\n        \"azurerm_sentinel_data_connector_aws_cloud_trail\",\n        \"azurerm_sentinel_data_connector_aws_s3\",\n        \"azurerm_sentinel_data_connector_azure_active_directory\",\n        \"azurerm_sentinel_data_connector_azure_advanced_threat_protection\",\n        \"azurerm_sentinel_data_connector_azure_security_center\",\n        \"azurerm_sentinel_data_connector_dynamics_365\",\n        \"azurerm_sentinel_data_connector_iot\",\n        \"azurerm_sentinel_data_connector_microsoft_cloud_app_security\",\n        \"azurerm_sentinel_data_connector_microsoft_defender_advanced_threat_protection\",\n        \"azurerm_sentinel_data_connector_microsoft_threat_intelligence\",\n        \"azurerm_sentinel_data_connector_microsoft_threat_protection\",\n        \"azurerm_sentinel_data_connector_office_365\",\n        \"azurerm_sentinel_data_connector_office_365_project\",\n        \"azurerm_sentinel_data_connector_office_atp\",\n        \"azurerm_sentinel_data_connector_office_irm\",\n        \"azurerm_sentinel_data_connector_office_power_bi\",\n        \"azurerm_sentinel_data_connector_threat_intelligence\",\n        \"azurerm_sentinel_data_connector_threat_intelligence_taxii\",\n        \"azurerm_sentinel_log_analytics_workspace_onboarding\",\n        \"azurerm_sentinel_metadata\",\n        \"azurerm_sentinel_threat_intelligence_indicator\",\n        \"azurerm_sentinel_watchlist\",\n        \"azurerm_sentinel_watchlist_item\"\n      ]\n    },\n    {\n      \"AzureService\": \"Service Fabric\",\n      \"keywords\": [\n        \"azurerm_service_fabric_cluster\"\n      ]\n    },\n    {\n      \"AzureService\": \"Service Fabric Managed Clusters\",\n      \"keywords\": [\n        \"azurerm_service_fabric_managed_cluster\"\n      ]\n    },\n    {\n      \"AzureService\": \"Spring Cloud\",\n      \"keywords\": [\n        \"azurerm_spring_cloud_accelerator\",\n        \"azurerm_spring_cloud_active_deployment\",\n        \"azurerm_spring_cloud_api_portal\",\n        \"azurerm_spring_cloud_api_portal_custom_domain\",\n        \"azurerm_spring_cloud_app\",\n        \"azurerm_spring_cloud_app_cosmosdb_association\",\n        \"azurerm_spring_cloud_app_mysql_association\",\n        \"azurerm_spring_cloud_app_redis_association\",\n        \"azurerm_spring_cloud_application_live_view\",\n        \"azurerm_spring_cloud_build_deployment\",\n        \"azurerm_spring_cloud_build_pack_binding\",\n        \"azurerm_spring_cloud_builder\",\n        \"azurerm_spring_cloud_certificate\",\n        \"azurerm_spring_cloud_configuration_service\",\n        \"azurerm_spring_cloud_connection\",\n        \"azurerm_spring_cloud_container_deployment\",\n        \"azurerm_spring_cloud_custom_domain\",\n        \"azurerm_spring_cloud_customized_accelerator\",\n        \"azurerm_spring_cloud_dev_tool_portal\",\n        \"azurerm_spring_cloud_gateway\",\n        \"azurerm_spring_cloud_gateway_custom_domain\",\n        \"azurerm_spring_cloud_gateway_route_config\",\n        \"azurerm_spring_cloud_java_deployment\",\n        \"azurerm_spring_cloud_service\",\n        \"azurerm_spring_cloud_storage\"\n      ]\n    },\n    {\n      \"AzureService\": \"Storage\",\n      \"keywords\": [\n        \"azurerm_hpc_cache\",\n        \"azurerm_hpc_cache_access_policy\",\n        \"azurerm_hpc_cache_blob_nfs_target\",\n        \"azurerm_hpc_cache_blob_target\",\n        \"azurerm_hpc_cache_nfs_target\",\n        \"azurerm_storage_account\",\n        \"azurerm_storage_account_blob_container_sas\",\n        \"azurerm_storage_account_customer_managed_key\",\n        \"azurerm_storage_account_local_user\",\n        \"azurerm_storage_account_network_rules\",\n        \"azurerm_storage_account_sas\",\n        \"azurerm_storage_blob\",\n        \"azurerm_storage_blob_inventory_policy\",\n        \"azurerm_storage_container\",\n        \"azurerm_storage_data_lake_gen2_filesystem\",\n        \"azurerm_storage_data_lake_gen2_path\",\n        \"azurerm_storage_encryption_scope\",\n        \"azurerm_storage_management_policy\",\n        \"azurerm_storage_object_replication\",\n        \"azurerm_storage_queue\",\n        \"azurerm_storage_share\",\n        \"azurerm_storage_share_directory\",\n        \"azurerm_storage_share_file\",\n        \"azurerm_storage_sync\",\n        \"azurerm_storage_sync_cloud_endpoint\",\n        \"azurerm_storage_sync_group\",\n        \"azurerm_storage_table\",\n        \"azurerm_storage_table_entity\"\n      ]\n    },\n    {\n      \"AzureService\": \"Storage Mover\",\n      \"keywords\": [\n        \"azurerm_storage_mover\",\n        \"azurerm_storage_mover_agent\",\n        \"azurerm_storage_mover_job_definition\",\n        \"azurerm_storage_mover_project\",\n        \"azurerm_storage_mover_source_endpoint\",\n        \"azurerm_storage_mover_target_endpoint\"\n      ]\n    },\n    {\n      \"AzureService\": \"Stream Analytics\",\n      \"keywords\": [\n        \"azurerm_stream_analytics_cluster\",\n        \"azurerm_stream_analytics_function_javascript_uda\",\n        \"azurerm_stream_analytics_function_javascript_udf\",\n        \"azurerm_stream_analytics_job\",\n        \"azurerm_stream_analytics_job_schedule\",\n        \"azurerm_stream_analytics_managed_private_endpoint\",\n        \"azurerm_stream_analytics_output_blob\",\n        \"azurerm_stream_analytics_output_cosmosdb\",\n        \"azurerm_stream_analytics_output_eventhub\",\n        \"azurerm_stream_analytics_output_function\",\n        \"azurerm_stream_analytics_output_mssql\",\n        \"azurerm_stream_analytics_output_powerbi\",\n        \"azurerm_stream_analytics_output_servicebus_queue\",\n        \"azurerm_stream_analytics_output_servicebus_topic\",\n        \"azurerm_stream_analytics_output_synapse\",\n        \"azurerm_stream_analytics_output_table\",\n        \"azurerm_stream_analytics_reference_input_blob\",\n        \"azurerm_stream_analytics_reference_input_mssql\",\n        \"azurerm_stream_analytics_stream_input_blob\",\n        \"azurerm_stream_analytics_stream_input_eventhub\",\n        \"azurerm_stream_analytics_stream_input_eventhub_v2\",\n        \"azurerm_stream_analytics_stream_input_iothub\"\n      ]\n    },\n    {\n      \"AzureService\": \"Synapse\",\n      \"keywords\": [\n        \"azurerm_synapse_firewall_rule\",\n        \"azurerm_synapse_integration_runtime_azure\",\n        \"azurerm_synapse_integration_runtime_self_hosted\",\n        \"azurerm_synapse_linked_service\",\n        \"azurerm_synapse_managed_private_endpoint\",\n        \"azurerm_synapse_private_link_hub\",\n        \"azurerm_synapse_role_assignment\",\n        \"azurerm_synapse_spark_pool\",\n        \"azurerm_synapse_sql_pool\",\n        \"azurerm_synapse_sql_pool_extended_auditing_policy\",\n        \"azurerm_synapse_sql_pool_security_alert_policy\",\n        \"azurerm_synapse_sql_pool_vulnerability_assessment\",\n        \"azurerm_synapse_sql_pool_vulnerability_assessment_baseline\",\n        \"azurerm_synapse_sql_pool_workload_classifier\",\n        \"azurerm_synapse_sql_pool_workload_group\",\n        \"azurerm_synapse_workspace\",\n        \"azurerm_synapse_workspace_aad_admin\",\n        \"azurerm_synapse_workspace_extended_auditing_policy\",\n        \"azurerm_synapse_workspace_key\",\n        \"azurerm_synapse_workspace_security_alert_policy\",\n        \"azurerm_synapse_workspace_sql_aad_admin\",\n        \"azurerm_synapse_workspace_vulnerability_assessment\"\n      ]\n    },\n    {\n      \"AzureService\": \"Template\",\n      \"keywords\": [\n        \"azurerm_management_group_template_deployment\",\n        \"azurerm_resource_deployment_script_azure_cli\",\n        \"azurerm_resource_deployment_script_azure_power_shell\",\n        \"azurerm_resource_group_template_deployment\",\n        \"azurerm_subscription_template_deployment\",\n        \"azurerm_template_deployment\",\n        \"azurerm_template_spec_version\",\n        \"azurerm_tenant_template_deployment\"\n      ]\n    },\n    {\n      \"AzureService\": \"Time Series Insights\",\n      \"keywords\": [\n        \"azurerm_iot_time_series_insights_access_policy\",\n        \"azurerm_iot_time_series_insights_event_source_eventhub\",\n        \"azurerm_iot_time_series_insights_event_source_iothub\",\n        \"azurerm_iot_time_series_insights_gen2_environment\",\n        \"azurerm_iot_time_series_insights_reference_data_set\",\n        \"azurerm_iot_time_series_insights_standard_environment\"\n      ]\n    },\n    {\n      \"AzureService\": \"VMware (AVS)\",\n      \"keywords\": [\n        \"azurerm_vmware_cluster\",\n        \"azurerm_vmware_express_route_authorization\",\n        \"azurerm_vmware_netapp_volume_attachment\",\n        \"azurerm_vmware_private_cloud\"\n      ]\n    },\n    {\n      \"AzureService\": \"Video Analyzer\",\n      \"keywords\": [\n        \"azurerm_video_analyzer\",\n        \"azurerm_video_analyzer_edge_module\"\n      ]\n    },\n    {\n      \"AzureService\": \"Voice Services\",\n      \"keywords\": [\n        \"azurerm_voice_services_communications_gateway\",\n        \"azurerm_voice_services_communications_gateway_test_line\"\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "articles/terraform/store-state-in-azure-storage.md",
    "content": "---\ntitle: Store Terraform state in Azure Storage\ndescription: Learn how to store Terraform state in Azure Storage.\nms.topic: how-to\nms.date: 05/08/2023\nms.custom:\n  - devx-track-terraform\n  - devx-track-azurecli\n  - sfi-image-nochange\n---\n\n# Store Terraform state in Azure Storage\n\n[!INCLUDE [Terraform abstract](./includes/abstract.md)]\n\nTerraform state is used to reconcile deployed resources with Terraform configurations. State allows Terraform to know what Azure resources to add, update, or delete.\n\nBy default, Terraform state is stored locally, which isn't ideal for the following reasons:\n\n- Local state doesn't work well in a team or collaborative environment.\n- Terraform state can include sensitive information.\n- Storing state locally increases the chance of inadvertent deletion.\n\nIn this article, you learn how to:\n\n> [!div class=\"checklist\"]\n> * Create an Azure storage account\n> * Use Azure storage to store remote Terraform state.\n> * Understand state locking\n> * Understand *encryption at rest*\n\n## 1. Configure your environment\n\n[!INCLUDE [open-source-devops-prereqs-azure-subscription.md](../includes/open-source-devops-prereqs-azure-subscription.md)]\n\n[!INCLUDE [configure-terraform.md](includes/configure-terraform.md)]\n\n## 2. Configure remote state storage account\n\nBefore you use Azure Storage as a backend, you must create a storage account.\n\nRun the following commands or configuration to create an Azure storage account and container:\n\n# [Azure CLI](#tab/azure-cli)\n```azurecli-interactive\n#!/bin/bash\n\nRESOURCE_GROUP_NAME=tfstate\nSTORAGE_ACCOUNT_NAME=tfstate$RANDOM\nCONTAINER_NAME=tfstate\n\n# Create resource group\naz group create --name $RESOURCE_GROUP_NAME --location eastus\n\n# Create storage account\naz storage account create --resource-group $RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME --sku Standard_LRS --encryption-services blob\n\n# Create blob container\naz storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME\n```\n\n# [PowerShell](#tab/powershell)\n\n```powershell-interactive\n$RESOURCE_GROUP_NAME='tfstate'\n$STORAGE_ACCOUNT_NAME=\"tfstate$(Get-Random)\"\n$CONTAINER_NAME='tfstate'\n\n# Create resource group\nNew-AzResourceGroup -Name $RESOURCE_GROUP_NAME -Location eastus\n\n# Create storage account\n$storageAccount = New-AzStorageAccount -ResourceGroupName $RESOURCE_GROUP_NAME -Name $STORAGE_ACCOUNT_NAME -SkuName Standard_LRS -Location eastus -AllowBlobPublicAccess $false\n\n# Create blob container\nNew-AzStorageContainer -Name $CONTAINER_NAME -Context $storageAccount.context\n```\n\n# [Terraform](#tab/terraform)\n\n```hcl\nterraform {\n  required_providers {\n    azurerm = {\n      source  = \"hashicorp/azurerm\"\n      version = \"~>3.0\"\n    }\n  }\n}\n\nprovider \"azurerm\" {\n  features {}\n}\n\nresource \"random_string\" \"resource_code\" {\n  length  = 5\n  special = false\n  upper   = false\n}\n\nresource \"azurerm_resource_group\" \"tfstate\" {\n  name     = \"tfstate\"\n  location = \"East US\"\n}\n\nresource \"azurerm_storage_account\" \"tfstate\" {\n  name                     = \"tfstate${random_string.resource_code.result}\"\n  resource_group_name      = azurerm_resource_group.tfstate.name\n  location                 = azurerm_resource_group.tfstate.location\n  account_tier             = \"Standard\"\n  account_replication_type = \"LRS\"\n  allow_nested_items_to_be_public = false\n\n  tags = {\n    environment = \"staging\"\n  }\n}\n\nresource \"azurerm_storage_container\" \"tfstate\" {\n  name                  = \"tfstate\"\n  storage_account_id    = azurerm_storage_account.tfstate.id\n  container_access_type = \"private\"\n}\n```\n\nSave the configuration as `create-remote-storage.tf`.\n\nRun the command `terraform init`, then `terraform apply` to configure the Azure storage account and container.\n\n---\n\n**Key points:**\n* Azure storage accounts require a globally unique name. To learn more about troubleshooting storage account names, see [Resolve errors for storage account names](/azure/azure-resource-manager/templates/error-storage-account-name).\n* Terraform state is stored in plain text and may contain secrets. If the state is incorrectly secured, unauthorized access to systems and data loss can result.\n* In this example, Terraform authenticates to the Azure storage account using an Access Key. In a production deployment, it's recommended to evaluate the available [authentication options](https://developer.hashicorp.com/terraform/language/settings/backends/azurerm) supported by the azurerm backend and to use the most secure option for your use case.\n* In this example, public network access is allowed to this Azure storage account. In a production deployment, it's recommended to restrict access to this storage account using a [storage firewall, service endpoint, or private endpoint](/azure/storage/common/storage-network-security).\n\n## 3. Configure terraform backend state\n\nTo configure the backend state, you need the following Azure storage information:\n\n- **storage_account_name**: The name of the Azure Storage account.\n- **container_name**: The name of the blob container.\n- **key**: The name of the state store file to be created.\n- **access_key**: The storage access key.\n\nEach of these values can be specified in the Terraform configuration file or on the command line. We recommend that you use an environment variable for the `access_key` value. Using an environment variable prevents the key from being written to disk.\n\nRun the following commands to get the storage access key and store it as an environment variable:\n\n# [Azure CLI](#tab/azure-cli)\n```azurecli-interactive\nACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query '[0].value' -o tsv)\nexport ARM_ACCESS_KEY=$ACCOUNT_KEY\n```\n\n# [PowerShell](#tab/powershell)\n\n```azurepowershell\n$ACCOUNT_KEY=(Get-AzStorageAccountKey -ResourceGroupName $RESOURCE_GROUP_NAME -Name $STORAGE_ACCOUNT_NAME)[0].value\n$env:ARM_ACCESS_KEY=$ACCOUNT_KEY\n```\n\n# [Terraform](#tab/terraform)\n```terraform\n```\n\nTerraform prevents sensitive information from being displayed within the terminal. It's recommended to use Azure CLI or Azure PowerShell to retrieve the access key.\n\n---\n\n**Key points:**\n* To further protect the Azure Storage account access key, store it in Azure Key Vault. The environment variable can then be set by using a command similar to the following. For more information on Azure Key Vault, see the [Azure Key Vault documentation](/azure/key-vault/secrets/quick-create-cli).\n\n    ```bash\n    export ARM_ACCESS_KEY=$(az keyvault secret show --name terraform-backend-key --vault-name myKeyVault --query value -o tsv)\n    ```\n\nCreate a Terraform configuration with a `backend` configuration block.\n\n```hcl\nterraform {\n  required_providers {\n    azurerm = {\n      source  = \"hashicorp/azurerm\"\n      version = \"~>3.0\"\n    }\n  }\n  backend \"azurerm\" {\n      resource_group_name  = \"tfstate\"\n      storage_account_name = \"<storage_account_name>\"\n      container_name       = \"tfstate\"\n      key                  = \"terraform.tfstate\"\n  }\n\n}\n\nprovider \"azurerm\" {\n  features {}\n}\n\nresource \"azurerm_resource_group\" \"state-demo-secure\" {\n  name     = \"state-demo\"\n  location = \"eastus\"\n}\n```\n\nReplace `<storage_account_name>` with the name of your Azure storage account.\n\nRun the following command to initialize the configuration:\n\n```bash\nterraform init\n```\n\nRun the following command to run the configuration:\n\n```bash\nterraform apply\n```\n\nYou can now find the state file in the Azure Storage blob.\n\n## 4. Understand state locking\n\nAzure Storage blobs are automatically locked before any operation that writes state. This pattern prevents concurrent state operations, which can cause corruption.\n\nFor more information, see [State locking](https://www.terraform.io/docs/state/locking.html) in the Terraform documentation.\n\nYou can see the lock when you examine the blob through the Azure portal or other Azure management tooling.\n\n![Azure blob with lock](media/store-state-in-azure-storage/lock.png)\n\n## 5. Understand encryption-at-rest\n\nData stored in an Azure blob is encrypted before being persisted. When needed, Terraform retrieves the state from the backend and stores it in local memory. If you use this pattern, state is never written to your local disk.\n\nFor more information on Azure Storage encryption, see [Azure Storage service encryption for data at rest](/azure/storage/common/storage-service-encryption).\n\n## Troubleshoot Terraform on Azure\n\n[Troubleshoot common problems when using Terraform on Azure](troubleshoot.md)\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about using Terraform in Azure](/azure/terraform)\n"
  },
  {
    "path": "articles/terraform/terraform-handler-for-azure-copilot/generate-terraform-configuration-using-copilot.md",
    "content": "---\ntitle: Generate Terraform on Azure configurations using Azure Copilot\ndescription: Learn how to generate Terraform on Azure configurations using Azure Copilot\nms.date: 07/08/2025\nms.topic: quickstart\nms.author: jingweiwang\nauthor: Jingwei-MS\nms.collection: ce-skilling-ai-copilot\n#customer intent: As a Terraform user, I want to learn how to generate Terraform configurations using Azure Copilot.\n---\n\n# Generate Terraform on Azure configurations using Azure Copilot\n\nAzure Copilot can help you generate Terraform configurations that define your Azure infrastructure. Describe the infrastructure you want to deploy, and Copilot generates a Terraform configuration using the AzureRM provider. The configuration automatically includes both the main resources and any required dependencies to ensure the configuration is deployable. You can define the output by iteratively making subsequent prompts.\n\nIn this article, you learn how to use [Azure Copilot](/azure/copilot/overview) in the Azure portal and [GitHub Copilot for Azure](/azure/developer/github-copilot-azure/introduction) in Visual Studio Code. We also provide sample Terraform prompts for you to use as-is or edit as desired.\n\n> [!TIP]\n> For best results, keep your prompt to fewer than eight primary Terraform resource types. Copilot performs well with common configurations. Complex or large-scale architectures may produce incomplete or less accurate results.\n\n> [!NOTE]\n> Copilot currently supports AzureRM provider resources extensively. Support for the AzAPI provider is evolving and may not be fully available yet. If the required resource type isn't supported, Copilot either falls back to a sample structure or explains the limitations.\n\n## Use Azure Copilot in the Azure portal\n\n1. Open the [Azure portal](https://ms.portal.azure.com).\n\n1. Select the Copilot icon in the upper right corner.\n\n    :::image type=\"content\" source=\"./media/generate-terraform-configuration-using-copilot/copilot-in-portal.png\" border=\"true\" alt-text=\"Screenshot of the Azure Copilot icon in the Azure portal.\":::\n\n1. Enter a Terraform-related prompt such as the following example. \n\n    ```copilot-prompt\n    Create a Terraform configuration for a Cognitive Services instance \n    named \"mycognitiveservice\" and the S0 pricing tier\n    ```\n\n1. Press **&lt;Enter>**.\n\n    :::image type=\"content\" source=\"./media/generate-terraform-configuration-using-copilot/copilot-prompt.png\" border=\"true\" alt-text=\"Screenshot of an example Azure Copilot prompt.\":::\n\n1. Once Azure Copilot responds, you can select **Open Full View** to view the configuration code block in full-screen mode.\n\n    :::image type=\"content\" source=\"./media/generate-terraform-configuration-using-copilot/copilot-open-full-view.png\" border=\"true\" alt-text=\"Screenshot of the Azure Copilot full-screen mode in the Azure portal.\" lightbox=\"./media/generate-terraform-configuration-using-copilot/copilot-open-full-view.png\":::\n\n1. Select the **Copy** icon to copy the new configuration to the clipboard.\n\n    :::image type=\"content\" source=\"./media/generate-terraform-configuration-using-copilot/copilot-copy.png\" border=\"true\" alt-text=\"Screenshot of the Azure Copilot copy icon.\":::\n\n1. Paste the code into your editor.\n\n## Use GitHub Copilot for Azure from Visual Studio Code\n\n1. Open Visual Studio Code.\n\n1. From the Activity Bar, select **Extensions**, and search for `copilot`.\n\n    :::image type=\"content\" source=\"./media/generate-terraform-configuration-using-copilot/vs-code-extensions.png\" border=\"false\" alt-text=\"Screenshot of VS Code Extensions icon in the Nav Bar.\":::\n\n1. Ensure that the **GitHub Copilot** extension is installed. If it isn't, install it.\n\n1. Ensure that the **GitHub Copilot Chat** extension is installed. If it isn't, install it.\n\n1. Select **Toggle Chat**.\n\n    :::image type=\"content\" source=\"./media/generate-terraform-configuration-using-copilot/vs-code-toggle-chat.png\" border=\"false\" alt-text=\"Screenshot of the Copilot Toggle Chat option in VS Code.\":::\n\n1. Enter a prompt for a Terraform Configuration that begins with `@azure`. For example, the following prompt creates a Content Delivery Network (CDN) resource with various settings.\n\n    ```copilot-prompt\n    @azure Use Terraform to create an Azure CDN Front Door profile named \"myCDN profile\"\n    with a custom domain association for \"example.com\". Configure a CDN Front Door route \n    that links to the default domain, and create a CDN endpoint named \"myEndpoint\" \n    associated with the custom domain. Ensure that a security policy is applied for \n    enhanced protection in production, and verify that the route is correctly configured\n    with the appropriate origin group.\n    ```\n\n1. Press **&lt;Enter>**.\n\n    :::image type=\"content\" source=\"./media/generate-terraform-configuration-using-copilot/vs-code-copilot-prompt.png\" border=\"false\" alt-text=\"Screenshot of a Terraform configuration prompt using Copilot in VS Code.\":::\n\n1. GitHub Copilot for Azure interactively guides you through the process and creates the required files for your configuration.\n\n    :::image type=\"content\" source=\"./media/generate-terraform-configuration-using-copilot/vs-code-copilot-updated-files.png\" border=\"false\" alt-text=\"Screenshot of the Copilot generated files in VS Code.\":::\n\n1. Once the files are created or updated, GitHub Copilot for Azure offers to run the `terraform init` and `terraform validate` commands against the generated configuration.\n\n    :::image type=\"content\" source=\"./media/generate-terraform-configuration-using-copilot/vs-code-copilot-terraform-commands.png\" border=\"false\" alt-text=\"Screenshot of the Copilot option to run various Terraform commands.\":::\n\n## Review and use sample Terraform prompts\n\nThis section contains several example prompts you can use to generate Terraform configurations. Modify these prompts based on your scenarios, or try other prompts to create different kinds of queries.\n\n```copilot-prompt\nCreate a Terraform configuration for a Cognitive Services instance with \nname \"mycognitiveservice\" and S0 pricing tier.\n```\n\n```copilot-prompt\nCreate a Terraform configuration that deploys a Linux virtual machine \nrunning Ubuntu 22.04 LTS, with 8 GB of RAM. The virtual machine should \nbe located in the West US region and assigned a public IP address. \nIt must be connected to a virtual network that includes a subnet and is \nsecured by a network security group.\n```\n\n```copilot-prompt\nCreate a Terraform configuration for a Container App resource named \n\"myApp\" using the quick start image. Set the container app environment name \nto \"awesomeAzureEnv\" and the container name to \"myQuickStartContainer\".\n```\n\n```copilot-prompt\nCreate a Terraform configuration for an Azure Databricks workspace named \n\"myworkspace\" with the premium SKU. The workspace should be deployed in \nthe West US region.\n```\n\n```copilot-prompt\nCreate a Terraform configuration for an Azure OpenAI deployment that uses \nthe \"gpt-4\" model. Specify the model version as \"2024-05-01-preview\" and \nset the deployment name to \"myOpenAIModel\".\n```\n\n> [!TIP]\n> For more example prompts, see [Generate Terraform and Bicep configurations using Azure Copilot](/azure/copilot/generate-terraform-bicep#terraform-sample-prompts).\n\n## Next steps\n\n> [!div class=\"nextstepaction\"]\n> [Learn more about Terraform on Azure](/azure/developer/terraform/overview)\n"
  },
  {
    "path": "articles/terraform/toc.yml",
    "content": "- name: Terraform on Azure documentation\n  href: index.yml\n- name: Overview\n  items:\n    - name: About Terraform on Azure\n      href: overview.md\n    - name: Terraform AzAPI provider\n      href: overview-azapi-provider.md\n- name: Install and Configure\n  items:\n    - name: Install and configure Terraform\n      href: quickstart-configure.md\n    - name: Install the Microsoft Terraform Visual Studio Code extension\n      href: configure-vs-code-extension-for-terraform.md\n    - name: Use the Microsoft Terraform Visual Studio Code extension\n      href: how-to-use-terraform-vscode-extension.md\n    - name: Authenticate Terraform to Azure\n      href: authenticate-to-azure.md\n    - name: Store Terraform state in Azure Storage\n      href: store-state-in-azure-storage.md\n    - name: Test Terraform projects\n      items:\n        - name: Compliance testing\n          href: best-practices-compliance-testing.md\n        - name: End-to-end testing\n          href: best-practices-end-to-end-testing.md\n        - name: Integration testing\n          href: best-practices-integration-testing.md\n    - name: Troubleshoot Terraform projects\n      items:\n        - name: Troubleshoot common problems\n          href: troubleshoot.md\n- name: Tools for Terraform\n  expanded: true\n  items:\n    - name: Azure Export for Terraform\n      items:\n        - name: Overview\n          expanded: true\n          items:\n            - name: Azure Export for Terraform\n              href: ./azure-export-for-terraform/export-terraform-overview.md\n            - name: Azure Terraform Resource Provider\n              href: ./azure-terraform-resource-provider/resource-provider-overview.md\n        - name: Quickstarts\n          expanded: true\n          items:\n            - name: Export your first resources\n              href: ./azure-export-for-terraform/export-first-resources.md\n            - name: Export resources to HCL code\n              href: ./azure-export-for-terraform/export-resources-hcl.md\n            - name: Export Terraform resources in the Azure portal\n              href: ./azure-export-for-terraform/get-started-export-resources-portal.md   \n        - name: How-to guides\n          items:\n            - name: Select custom resources\n              href: ./azure-export-for-terraform/select-custom-resources.md\n            - name: Advanced scenarios\n              href: ./azure-export-for-terraform/export-advanced-scenarios.md\n        - name: Concepts\n          items:\n            - name: Azure Export for Terraform concepts\n              href: ./azure-export-for-terraform/export-terraform-concepts.md\n- name: Quickstarts\n  expanded: true\n  items:\n    - name: Your first Terraform project\n      items:\n        - name: Create an Azure resource group\n          href: create-resource-group.md\n    - name: Generate with Copilot\n      items:\n        - name: Generate Terraform configurations\n          href: /azure/copilot/deployment-agent\n    - name: AzAPI provider\n      items:\n        - name: Learn how to use the AzAPI resource\n          href: get-started-azapi-resource.md\n        - name: Learn how to use the AzAPI update resource\n          href: get-started-azapi-update-resource.md\n        - name: Learn how to use the AzAPI resource action as a data source\n          href: get-started-azapi-resource-action.md\n        - name: Perform resource actions with the AzAPI provider\n          href: get-started-azapi-resource-action-mutation.md\n        - name: Manage Azure data plane resources with AzAPI\n          href: get-started-azapi-data-plane-resource.md\n        - name: List Azure resources with AzAPI\n          href: get-started-azapi-resource-list.md\n    - name: Terraform Quickstarts for Azure services\n      items:\n        - name: AI + Machine Learning\n          items:\n            - name: Microsoft Foundry \n              items: \n                - name: Create a Microsoft Foundry hub\n                  href: /azure/ai-foundry/how-to/create-hub-terraform\n            - name: Foundry Tools\n              items:\n                - name: Create a resource\n                  href: /azure/ai-services/create-account-terraform\n            - name: Azure Cognitive Search\n              items:\n                - name: Create a service\n                  href: /azure/search/search-get-started-terraform\n        - name: Analytics\n          items:\n            - name: Azure Analysis Services\n              items:\n                - name: Create a server\n                  href: /azure/analysis-services/analysis-services-create-terraform\n            - name: Azure Stream Analytics\n              items:\n                - name: Create a job\n                  href: /azure/stream-analytics/quick-create-terraform\n        - name: Compute\n          items:\n            - name: Azure Kubernetes Service (AKS)\n              items:\n                - name: Migrate to AKS\n                  href: /azure/aks/aks-migration\n                - name: Create a cluster\n                  href: /azure/aks/learn/quick-kubernetes-deploy-terraform\n            - name: Azure Spring Apps\n              items:\n                - name: Deploy a cluster\n                  href: /azure/spring-apps/enterprise/quickstart-deploy-infrastructure-vnet-terraform\n            - name: Azure Batch\n              items:\n                - name: Create an account\n                  href: /azure/batch/quick-create-terraform\n                - name: Deploy an account and two pools\n                  href: /azure/batch/quick-deploy-batch-account-two-pools-terraform\n                - name: Deploy an account and two pools with a start task \n                  href: /azure/batch/quick-deploy-batch-account-two-pools-start-task-terraform\n            - name: Virtual machines\n              items:\n                - name: Create a Linux VM\n                  href: /azure/virtual-machines/linux/quick-create-terraform\n                - name: Create a Linux VM cluster\n                  href: /azure/virtual-machines/linux/quick-cluster-create-terraform\n                - name: Create a Windows VM\n                  href: /azure/virtual-machines/windows/quick-create-terraform\n                - name: Create a Windows VM cluster\n                  href: /azure/virtual-machines/windows/quick-cluster-create-terraform\n        - name: Containers\n          items:\n            - name: Azure Kubernetes Service (AKS)\n              items:\n                - name: Migrate to AKS\n                  href: /azure/aks/aks-migration\n                - name: Create a cluster\n                  href: /azure/aks/learn/quick-kubernetes-deploy-terraform\n            - name: Azure Container Registry\n              items: \n                - name: Create an Azure container registry \n                  href: /azure/container-registry/container-registry-get-started-terraform\n            - name: Container Instances\n              items:\n                - name: Create an instance\n                  href: /azure/container-instances/container-instances-quickstart-terraform\n                - name: Deploy Cosmos DB\n                  href: deploy-azure-cosmos-db-to-azure-container-instances.md\n        - name: Databases\n          items:\n            - name: Azure confidential ledger\n              items:\n                - name: Create an Azure confidential ledger \n                  href: /azure/confidential-ledger/quickstart-terraform\n            - name: Azure Cosmos DB\n              items:\n                - name: Deploy to Container Instances\n                  href: deploy-azure-cosmos-db-to-azure-container-instances.md\n            - name: Azure SQL Database\n              items:\n                - name: Create a server and database\n                  href: /azure/azure-sql/database/single-database-create-terraform-quickstart\n            - name: Azure Database for MySQL\n              items:\n                - name: Create a MySQL Flexible Server instance\n                  href: /azure/mysql/flexible-server/quickstart-create-terraform\n        - name: Developer Tools\n          items:\n            - name: DevTest Labs\n              items:\n                - name: Create a Windows Server VM\n                  href: /azure/devtest-labs/quickstarts/create-lab-windows-vm-terraform\n        - name: DevOps\n          items:\n            - name: DevTest Labs\n              items:\n                - name: Create a Windows Server VM\n                  href: /azure/devtest-labs/quickstarts/create-lab-windows-vm-terraform\n        - name: Integration\n          items:\n            - name: API Management\n              items:\n                - name: Create a service\n                  href: /azure/api-management/quickstart-terraform\n                - name: Create and publish a product\n                  href: /azure/api-management/api-management-howto-add-products?pivots=terraform\n        - name: Internet of Things\n          items:\n            - name: API Management\n              items:\n                - name: Create a service\n                  href: /azure/api-management/quickstart-terraform\n                - name: Create and publish a product\n                  href: /azure/api-management/api-management-howto-add-products?pivots=terraform\n            - name: Azure Cosmos DB\n              items:\n                - name: Deploy to Container Instances\n                  href: deploy-azure-cosmos-db-to-azure-container-instances.md\n            - name: Azure Stream Analytics\n              items:\n                - name: Create a job\n                  href: /azure/stream-analytics/quick-create-terraform\n            - name: IoT Hub\n              items:\n                - name: Create a DPS instance\n                  href: /azure/iot-dps/quick-setup-auto-provision-terraform\n            - name: Notification Hubs\n              items:\n                - name: Create a namespace and hub\n                  href: /azure/notification-hubs/create-notification-hub-terraform\n        - name: Management and Governance\n          items:\n            - name: Azure Automation\n              items:\n                - name: Create an Automation account\n                  href: /azure/automation/quickstarts/create-azure-automation-account-terraform\n            - name: Azure Policy\n              items:\n                - name: Create an assignment\n                  href: /azure/governance/policy/assign-policy-terraform\n            - name: Traffic Manager\n              items:\n                - name: Create a profile and endpoints\n                  href: /azure/traffic-manager/quickstart-create-traffic-manager-profile-terraform\n        - name: Media\n          items:\n            - name: Content Delivery Network (CDN)\n              items:\n                - name: Create a profile and endpoint\n                  href: /azure/cdn/create-profile-endpoint-terraform\n        - name: Mobile\n          items:\n            - name: API Management\n              items:\n                - name: Create a service\n                  href: /azure/api-management/quickstart-terraform\n                - name: Create and publish a product\n                  href: /azure/api-management/api-management-howto-add-products?pivots=terraform\n            - name: Foundry Tools\n              items:\n                - name: Create a resource\n                  href: /azure/ai-services/create-account-terraform\n        - name: Networking\n          items:\n            - name: Application Gateway\n              items:\n                - name: Create an application gateway\n                  href: /azure/application-gateway/quick-create-terraform\n            - name: Azure Bastion\n              items:\n                - name: Deploy Bastion\n                  href: /azure/bastion/quickstart-deploy-terraform \n            - name: Azure DDoS Protection\n              items:\n                - name: Create protection plan\n                  href: /azure/ddos-protection/manage-ddos-protection-terraform\n            - name: Azure DNS\n              items:\n                - name: Create an Azure DNS zone and record\n                  href: /azure/dns/dns-get-started-terraform\n                - name: Configure private DNS zones in Azure\n                  href: /azure/dns/dns-private-zone-terraform\n                - name: Create an Azure DNS Private Resolver\n                  href: /azure/dns/dns-private-resolver-get-started-terraform\n            - name: Azure ExpressRoute\n              items:\n                - name: Create an ExpressRoute circuit\n                  href: /azure/expressroute/quickstart-create-expressroute-vnet-terraform\n            - name: Azure Firewall\n              items:\n                - name: Deploy with IP Groups\n                  href: /azure/firewall/quick-create-ipgroup-terraform\n                - name: Deploy with multiple addresses\n                  href: /azure/firewall/quick-create-multiple-ip-terraform\n                - name: Deploy with Availability Zones\n                  href: /azure/firewall/deploy-terraform\n            - name: Azure Front Door\n              items:\n                - name: Create a classic profile\n                  href: /azure/frontdoor/quickstart-create-front-door-terraform\n                - name: Create a standard/premium profile\n                  href: /azure/frontdoor/create-front-door-terraform\n            - name: Azure Virtual Network Manager\n              items:\n                - name: Create a mesh network topology\n                  href: /azure/virtual-network-manager/create-virtual-network-manager-terraform\n            - name: Content Delivery Network (CDN)\n              items:\n                - name: Create a profile and endpoint\n                  href: /azure/cdn/create-profile-endpoint-terraform\n            - name: Traffic Manager\n              items:\n                - name: Create a profile\n                  href: /azure/traffic-manager/quickstart-create-traffic-manager-profile-terraform\n            - name: Virtual Network\n              items:\n                - name: Create a network and subnets\n                  href: /azure/virtual-network/quick-create-terraform\n                - name: Create a NAT Gateway\n                  href: /azure/nat-gateway/quickstart-create-nat-gateway-terraform\n                - name: Create a private endpoint\n                  href: /azure/private-link/create-private-endpoint-terraform\n        - name: Security\n          items:\n            - name: Application Gateway\n              items:\n                - name: Create an application gateway\n                  href: /azure/application-gateway/quick-create-terraform\n            - name: Azure Attestation\n              items:\n                - name: Create a provider\n                  href: /azure/attestation/quickstart-terraform\n            - name: Azure confidential ledger\n              items:\n                - name: Create an Azure confidential ledger \n                  href: /azure/confidential-ledger/quickstart-terraform\n            - name: Azure DDoS Protection\n              items:\n                - name: Create protection plan\n                  href: /azure/ddos-protection/manage-ddos-protection-terraform\n            - name: Azure Firewall\n              items:\n                - name: Deploy with IP Groups\n                  href: /azure/firewall/quick-create-ipgroup-terraform\n                - name: Deploy with multiple addresses\n                  href: /azure/firewall/quick-create-multiple-ip-terraform\n                - name: Deploy with Availability Zones\n                  href: /azure/firewall/deploy-terraform\n            - name: Azure Front Door\n              items:\n                - name: Create a classic profile\n                  href: /azure/frontdoor/quickstart-create-front-door-terraform\n                - name: Create a standard/premium profile\n                  href: /azure/frontdoor/create-front-door-terraform\n            - name: Key Vault\n              items:\n                - name: Create a key vault and key\n                  href: /azure/key-vault/keys/quick-create-terraform\n        - name: Storage\n          items:\n            - name: Azure Backup\n              items:\n                - name: Back up a virtual machine in Azure\n                  href: /azure/backup/quick-backup-vm-terraform\n            - name: Azure confidential ledger\n              items:\n                - name: Create an Azure confidential ledger \n                  href: /azure/confidential-ledger/quickstart-terraform\n            - name: Azure Managed Lustre\n              items:\n                - name: Create a file system\n                  href: /azure/azure-managed-lustre/create-aml-file-system-terraform\n            - name: Azure NetApp Files\n              items:\n                - name: Set up Azure NetApp Files and create an NFS volume\n                  href: /azure/azure-netapp-files/azure-netapp-files-quickstart-set-up-account-create-volumes\n            - name: Azure Recovery Services\n              items:\n                - name: Create an Azure Recovery Services vault\n                  href: /azure/site-recovery/quickstart-create-vault-terraform\n            - name: Azure Storage\n              items:\n                - name: Deploy a static website\n                  href: /azure/storage/blobs/storage-quickstart-static-website-terraform\n            - name: Azure Storage Actions\n              items:\n                - name: Create a storage task\n                  href: /azure/storage-actions/storage-tasks/storage-task-quickstart-terraform\n        - name: Web\n          items:\n            - name: API Management\n              items:\n                - name: Create a service\n                  href: /azure/api-management/quickstart-terraform\n                - name: Create and publish a product\n                  href: /azure/api-management/api-management-howto-add-products?pivots=terraform\n            - name: Azure Cognitive Search\n              items:\n                - name: Create an Azure Cognitive Search service\n                  href: /azure/search/search-get-started-terraform\n            - name: Azure Spring Apps\n              items:\n                - name: Deploy a cluster\n                  href: /azure/spring-apps/enterprise/quickstart-deploy-infrastructure-vnet-terraform\n            - name: Content Delivery Network (CDN)\n              items:\n                - name: Create a profile and endpoint\n                  href: /azure/cdn/create-profile-endpoint-terraform\n            - name: Notification Hubs\n              items:\n                - name: Create a namespace and hub\n                  href: /azure/notification-hubs/create-notification-hub-terraform\n- name: Samples\n  items:\n    - name: Terraform samples\n      href: https://github.com/azure/terraform\n    - name: Configuration templates\n      href: https://github.com/terraform-providers/terraform-provider-azurerm/tree/master/examples\n- name: Concepts\n  items:\n    - name: Choose between AzureRM and AzAPI providers\n      href: provider-selection-azurerm-vs-azapi.md\n    - name: AzAPI data plane framework\n      href: concept-azapi-data-plane-framework.md\n    - name: Testing Terraform code\n      href: best-practices-testing-overview.md\n    - name: Comparing features of Terraform and Bicep\n      href: comparing-terraform-and-bicep.md\n- name: How-to guides\n  items:\n    - name: AzAPI provider\n      items:\n        - name: Enable preflight validation\n          href: how-to-use-azapi-preflight-validation.md\n        - name: Use AzAPI provider functions\n          href: how-to-use-azapi-provider-functions.md\n        - name: Migration paths between Azure, AzureRM, and AzAPI\n          href: how-to-migrate-between-azurerm-and-azapi.md\n    - name: Terraform how-to guides for Azure services\n      items:\n        - name: Compute\n          items:\n            - name: App Service\n              items:\n                - name: Terraform and Azure provider deployment slots\n                  href: provision-infrastructure-using-azure-deployment-slots.md\n            - name: Azure Virtual Desktop\n              items:\n                - name: Configure a desktop\n                  href: configure-azure-virtual-desktop.md\n                - name: Create a host\n                  href: create-avd-session-host.md\n                - name: Configure RBAC permissions\n                  href: configure-avd-rbac.md\n                - name: Configure network settings\n                  href: configure-avd-network-settings.md\n                - name: Create Azure Files storage\n                  href: create-avd-azure-files-storage.md\n                - name: Create Azure Compute gallery\n                  href: create-avd-azure-compute-image-gallery.md\n                - name: Create Log Analytics workspace\n                  href: create-avd-log-analytics-workspace.md\n            - name: Virtual machines\n              items:\n                - name: Virtual Machine Scale Set with infrastructure\n                  href: create-vm-scaleset-network-disks-hcl.md\n                - name: Virtual Machine Scale Set from Packer image\n                  href: create-vm-scaleset-network-disks-using-packer-hcl.md\n        - name: Database\n          items:\n            - name: Azure Database for PostgreSQL\n              items:\n                - name: Deploy Flexible Server database\n                  href: deploy-postgresql-flexible-server-database.md\n        - name: Hybrid + multicloud\n          items:\n            - name: Azure Database for PostgreSQL\n              items:\n                - name: Deploy Flexible Server database\n                  href: deploy-postgresql-flexible-server-database.md\n        - name: Management and Governance\n          items:\n            - name: Network Watcher\n              items:\n                - name: Create a watcher connection\n                  href: create-network-watcher-nsg-flow-logs.md\n        - name: Mobile\n          items:\n            - name: App Service\n              items:\n                - name: Terraform and Azure provider deployment slots\n                  href: provision-infrastructure-using-azure-deployment-slots.md\n        - name: Networking\n          items:\n            - name: Application Gateway\n              items:\n                - name: Application Gateway ingress controller in AKS\n                  href: /azure/aks/create-k8s-cluster-with-aks-application-gateway-ingress\n            - name: Azure Firewall\n              items:\n                - name: Migrate Standard to Premium\n                  href: firewall-upgrade-premium.md\n            - name: Hub and spoke topology\n              items:\n                - name: 1. Create hub and spoke topology\n                  href: hub-spoke-introduction.md\n                - name: 2. Create on-premises virtual network\n                  href: hub-spoke-on-prem.md\n                - name: 3. Create hub virtual network\n                  href: hub-spoke-hub-network.md\n                - name: 4. Create hub virtual network appliance\n                  href: hub-spoke-hub-nva.md\n                - name: 5. Create spoke network\n                  href: hub-spoke-spoke-network.md\n                - name: 6. Validate network topology connectivity \n                  href: hub-spoke-validation.md\n            - name: Network Watcher\n              items:\n                - name: Create a watcher connection\n                  href: create-network-watcher-nsg-flow-logs.md\n        - name: Security\n          items:\n            - name: Application Gateway\n              items:\n                - name: Application Gateway ingress controller in AKS\n                  href: /azure/aks/create-k8s-cluster-with-aks-application-gateway-ingress\n            - name: Azure Firewall\n              items:\n                - name: Migrate Standard to Premium\n                  href: firewall-upgrade-premium.md\n        - name: Virtual Desktop Infrastructure\n          items:\n            - name: Azure Virtual Desktop\n              items:\n                - name: Configure a desktop\n                  href: configure-azure-virtual-desktop.md\n                - name: Create a host\n                  href: create-avd-session-host.md\n                - name: Configure RBAC permissions\n                  href: configure-avd-rbac.md\n                - name: Configure network settings\n                  href: configure-avd-network-settings.md\n                - name: Create Azure Files storage\n                  href: create-avd-azure-files-storage.md\n                - name: Create Azure Compute gallery\n                  href: create-avd-azure-compute-image-gallery.md\n                - name: Create Log Analytics workspace\n                  href: create-avd-log-analytics-workspace.md\n        - name: Web\n          items:\n            - name: App Service\n              items:\n                - name: Terraform and Azure provider deployment slots\n                  href: provision-infrastructure-using-azure-deployment-slots.md\n- name: Reference\n  items:\n    - name: Terraform Azure provider versions\n      items:\n        - name: AzureRM provider versions 4.0.0 - current\n          href: provider-version-history-azurerm-4-0-0-to-current.md\n        - name: AzureRM provider versions 3.0.0 - 3.116.0\n          href: provider-version-history-azurerm-3-0-0-to-3-116-0.md\n        - name: AzureRM provider versions 2.0.0 - 2.99.0\n          href: provider-version-history-azurerm-2-0-0-to-2-99-0.md\n        - name: AzureRM provider versions 1.0.0 - 1.44.0\n          href: provider-version-history-azurerm-1-0-0-to-1-44-0.md\n        - name: AzureRM provider versions 0.1.0 - 0.3.3\n          href: provider-version-history-azurerm-0-1-0-to-0-3-3.md\n    - name: Azure module registry\n      href: https://registry.terraform.io/modules/Azure\n    - name: Terraform Microsoft Graph provider\n      href: /graph/templates/terraform/reference/v1.0/overview\n    - name: Terraform Azure Provider\n      href: https://aka.ms/terraform\n    - name: Terraform AzAPI Provider\n      href: https://registry.terraform.io/providers/Azure/azapi/latest/docs\n    - name: Terraform AzAPI resource type definitions\n      href: /azure/templates/\n- name: Resources\n  items:\n    - name: Azure & Terraform\n      href: https://azure.microsoft.com/solutions/devops/terraform/\n    - name: Azure Roadmap\n      href: https://azure.microsoft.com/roadmap/\n"
  },
  {
    "path": "articles/terraform/troubleshoot.md",
    "content": "---\ntitle: Troubleshoot common problems when using Terraform on Azure\ndescription: In this article, troubleshoot common problems when using Terraform on Azure\nkeywords: terraform azure troubleshoot errors problems\nms.topic: troubleshooting\nms.date: 08/07/2021\nms.custom: devx-track-terraform\n# Customer intent: Find solutions to common problems encountered when using Terraform on Azure.\n---\n\n# Troubleshoot common problems when using Terraform on Azure\n\nThis article lists common problems and possible solutions when using Terraform on Azure. \n\nIf you encounter a problem that is specific to Terraform, use one of [HashiCorp's community support channels](#hashicorp-terraform-specific-support-channels).\n\n- [Unable to list provider registration status](#unable-to-list-provider-registration-status)\n- [VPN errors](#vpn-errors)\n\n## HashiCorp Terraform specific support channels\n\n* Questions, use-cases, and useful patterns: [Terraform section of the HashiCorp community portal](https://discuss.hashicorp.com/c/terraform-core)\n* Provider-related questions: [Terraform Providers section of the HashiCorp community portal](https://discuss.hashicorp.com/c/terraform-providers)\n\n## Unable to list provider registration status\n\n**Error message:**\n\n*Error: Unable to list provider registration status, it is possible that this is due to invalid credentials or the service principal does not have permission to use the Resource Manager API, Azure error: resources.ProvidersClient#List: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code=\"AuthorizationFailed\" Message=\"The client '00000000-0000-0000-0000-000000000000' with object id '00000000-0000-0000-0000-000000000000' does not have authorization to perform action 'Microsoft.Resources/subscriptions/providers/read' over scope '/subscriptions/00000000-0000-0000-0000-000000000000' or the scope is invalid. If access was recently granted, please refresh your credentials.\"*\n\n**Background:** If you're running Terraform commands from the Cloud Shell and you've defined certain [Terraform/Azure environment variables](https://registry.terraform.io/providers/hashicorp/azurerm/2.35.0/docs/guides/service_principal_client_secret#configuring-the-service-principal-in-terraform), you can sometimes see conflicts. The environment variables and the Azure value they represent are listed in the following table:\n\n| Environment variable | Azure value |\n|---------------|--------------------------|\n| ARM_SUBSCRIPTION_ID | Azure subscription ID |\n| ARM_TENANT_ID | Microsoft account tenant ID |\n| ARM_CLIENT_ID | Azure service principal app ID |\n| ARM_CLIENT_SECRET | Azure service principal password |\n\n**Cause**: As of this writing, the Terraform script that runs in Cloud Shell overwrites the `ARM_SUBSCRIPTION_ID` and `ARM_TENANT_ID` environment variables using values from the current Azure subscription. As a result, if the service principal referenced by the environment variables doesn't have rights to the current Azure subscription, any Terraform operations will fail.\n\n## Error acquiring the state lock\n\n**Error message:**\n\n*Error: Error acquiring the state lock; Error message: 2 errors occurred:  \n\\* state blob is already locked  \n\\* blob metadata \"terraformlockid\" was empty  \nTerraform acquires a state lock to protect the state from being written by multiple users at the same time. Please resolve the issue above and try again. For most commands, you can disable locking with the \"-lock=false\" flag, but this is not recommended.*\n\n**Background:** If you're running Terraform commands against a Terraform state file and this error is the only message that appears, the following causes might apply. Applies to local and remote state files.\n\n**Cause:** There are two potential causes for this error. The first is that a Terraform command is already running against the state file and it has forced a lock on the file, so nothing breaks. The second potential cause is that a connection interruption occurred between the state file and the CLI when commands were running. This interruption most commonly occurs when you're using remote state files.\n\n**Resolution:** First, make sure that you aren't already running any commands against the state file. If you're working with a local state file, check to see whether you have terminals running any commands. Alternatively, check your deployment pipelines to see whether something running might be using the state file. If this doesn't resolve the issue, it's possible that the second cause triggered the error. For a remote state file stored in an Azure Storage account container, you can locate the file and use the **Break lease** button.\n\n![Screenshot that shows the Azure Storage container Break lease button.](media/troubleshoot/terraform-statelock-resolved.png)\n\nIf you're using other back ends to store your state file, for recommendations, see the [HashiCorp documentation](https://www.terraform.io/docs/cli/index.html).\n\n## VPN errors\n\nFor information about resolving VPN errors, see the article, [Troubleshoot a hybrid VPN connection](/azure/architecture/reference-architectures/hybrid-networking/troubleshoot-vpn).\n"
  },
  {
    "path": "articles/typespec/TOC.yml",
    "content": "- name: TypeSpec documentation\n  href: index.yml\n- name: Overview\n  items:\n    - name: About TypeSpec\n      href: overview.md\n- name: Quickstart\n  items:\n    - name: .NET\n      href: quickstart-scaffold-dotnet.md\n    - name: TypeScript\n      href: quickstart-scaffold-typescript.md\n- name: Resources\n  items:\n    - name: Getting started\n      href: resources.md\n    - name: Language reference\n      href: https://typespec.io/docs/language-basics/overview/\n    - name: Playground\n      href: https://typespec.io/playground/\n    - name: OpenAPI developer guide\n      href: https://typespec.io/docs/getting-started/typespec-for-openapi-dev/\n    - name: Blog\n      href: https://typespec.io/blog/\n    - name: Community\n      href: https://typespec.io/community/\n"
  },
  {
    "path": "articles/typespec/includes/quickstart/file-structure-csharp.md",
    "content": "---\nms.custom: devx-track-ts, devx-track-typespec, devx-track-dotnet, devx-track-csharp\nms.topic: include\nms.date: 04/23/2025\n---\nThe project structure for the generated server includes the .NET controller-based API server, the .NET files for building the project, and the middleware for your Azure integration. \n\n```console\n├── appsettings.Development.json\n├── appsettings.json\n├── docs\n├── generated\n├── mocks\n├── Program.cs\n├── Properties\n├── README.md\n├── ServiceProject.csproj\n└── wwwroot\n```\n\n* **Add your business logic**: in this example, start with the `./server/mocks/Widget.cs` file. The generated `Widget.cs` provides boilerplate methods. \n* **Update the server**: add any specific server configurations to `./program.cs`. \n* **Use the OpenApi spec**: the TypeSpec generated the OpenApi3.json file into the `./server/wwwroot` file and made it available to Swagger UI during development. This provides a UI for your specification. You can interact with your API without have to providing an request mechanism such as a REST client or web front-end. \n"
  },
  {
    "path": "articles/typespec/includes/quickstart/file-structure-typescript.md",
    "content": "---\nms.custom: devx-track-ts, devx-track-typespec\nms.topic: include\nms.date: 04/23/2025\n---\nThe Express.js project structure found at `tsp-output/server/` includes the generated server, the package.json, and the middleware for your Azure integration. \n\n```console\nserver\n├── package.json\n├── package-lock.json\n├── src\n│   ├── controllers\n│   │   └── widgets.ts\n│   ├── generated\n│   │   ├── helpers\n│   │   │   ├── datetime.ts\n│   │   │   ├── header.ts\n│   │   │   ├── http.ts\n│   │   │   ├── multipart.ts\n│   │   │   ├── router.ts\n│   │   │   └── temporal\n│   │   │       ├── native.ts\n│   │   │       └── polyfill.ts\n│   │   ├── http\n│   │   │   ├── openapi3.ts\n│   │   │   ├── operations\n│   │   │   │   └── server-raw.ts\n│   │   │   └── router.ts\n│   │   └── models\n│   │       └── all\n│   │           ├── demo-service.ts\n│   │           └── typespec.ts\n│   ├── index.ts\n│   └── swagger-ui.ts\n```\n\nThe file structure for the parent TypeSpec project includes this Express.js project in `tsp-output`:\n\n```console\n├── tsp-output\n├── .gitignore\n├── main.tsp\n├── package-lock.json\n├── package.json\n├── tspconfig.yaml\n```"
  },
  {
    "path": "articles/typespec/includes/quickstart/prereqs-csharp.md",
    "content": "---\nms.custom: devx-track-ts, devx-track-typespec, devx-track-dotnet, devx-track-csharp\nms.topic: include\nms.date: 04/23/2025\n---\n* An active Azure account. [Create an account for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) if you don't have one.\n* [.NET 9 SDK](https://dotnet.microsoft.com/download/dotnet/9.0)\n* [Node.js LTS](https://nodejs.org/) — required for the TypeSpec CLI and package manager.\n* [Visual Studio Code](https://code.visualstudio.com/) with the following extensions:\n* [TypeSpec extension](https://marketplace.visualstudio.com/items?itemName=typespec.typespec-vscode)\n* Optional: Deployment with [Azure Developer CLI](/azure/developer/azure-developer-cli/)\n"
  },
  {
    "path": "articles/typespec/includes/quickstart/prereqs-typescript.md",
    "content": "---\nms.custom: devx-track-ts, devx-track-typespec\nms.topic: include\nms.date: 04/23/2025\n---\n* An active Azure account. [Create an account for free](https://azure.microsoft.com/pricing/purchase-options/azure-account?cid=msft_learn) if you don't have one.\n* [Node.js LTS](https://nodejs.org/) — required for the TypeSpec CLI and package manager.\n* [TypeScript](https://www.typescriptlang.org/) for writing and compiling TypeScript code.\n* [Docker](https://www.docker.com/)\n* [Visual Studio Code](https://code.visualstudio.com/)\n* [TypeSpec extension](https://marketplace.visualstudio.com/items?itemName=typespec.typespec-vscode)\n* Optional: Deployment with [Azure Developer CLI](/azure/developer/azure-developer-cli/)\n"
  },
  {
    "path": "articles/typespec/index.yml",
    "content": "### YamlMime:Landing\n\ntitle: TypeSpec documentation\nsummary: Learn how to use TypeSpec to create consistent, high-quality APIs efficiently and integrate them seamlessly with existing toolchains.\n\nmetadata:\n  title: TypeSpec documentation - Articles, samples, references, and resources\n  description: Learn how to use TypeSpec to create consistent, high-quality APIs efficiently and integrate them seamlessly with existing toolchains.v\n  ms.service: typespec\n  author: diberry\n  ms.author: diberry\n  ms.topic: landing-page\n  ms.date: 12/10/2025\n  ms.custom: devx-track-typespec\n\nlandingContent:\n  # Card\n  - title: Getting started\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: About TypeSpec\n            url: overview.md\n          - text: Installation\n            url: https://typespec.io/docs/\n          - text: .NET Quickstart\n            url: quickstart-scaffold-dotnet.md\n          - text: TypeScript Quickstart\n            url: quickstart-scaffold-typescript.md\n  \n  - title: API language\n    linkLists:\n      - linkListType: overview\n        links:\n          - text: Basics\n            url: https://typespec.io/docs/language-basics/overview/\n          - text: Directives\n            url: https://typespec.io/docs/language-basics/directives/\n          - text: Decorators\n            url: https://typespec.io/docs/language-basics/decorators/\n          - text: Type relations\n            url: https://typespec.io/docs/language-basics/type-relations/\n          - text: Linters\n            url: https://typespec.io/docs/extending-typespec/linters/\n          - text: OpenAPI3 emitter\n            url: https://typespec.io/docs/emitters/openapi3/reference/\n  # Card\n  - title: Resources\n    linkLists:\n      - linkListType: reference\n        links:\n          - text: Playground\n            url: https://typespec.io/playground/\n          - text: Blog\n            url: https://typespec.io/blog/\n          - text: Community\n            url: https://typespec.io/community/\n          \n"
  },
  {
    "path": "articles/typespec/mermaid/tool-chain.mmd",
    "content": "graph LR\n    A[TypeSpec API Definition]:::green\n    B[Generate API Specification]:::green\n    C[Generate API Code]:::grey\n\n    A --> B\n    B --> C\n\n\n    classDef green fill:#80FF80,stroke:#333,stroke-width:2px;\n    classDef grey fill:#E0E0E0,stroke:#333,stroke-width:2px;"
  },
  {
    "path": "articles/typespec/mermaid/typespec-workflow.mmd",
    "content": "%%{\n  init: {\n    'theme': 'base',\n    'themeVariables': {\n      'tertiaryBorderColor': '#fff',\n      'tertiaryColor': '#fff'\n    }\n  }\n}%%\n\ngraph TD\n    A1[Start: Write API Spec using TypeSpec]\n    A2[Start: Migrate from existing OpenAPI Spec]\n    A1 --> B[TypeSpec Definition]\n    A2 --> B\n    B --> C[TypeSpec Compiler]\n    C --> D1[OpenAPI Emitter]\n    C --> D2[Client Code Emitter]\n    C --> D3[Service-Side Code Emitter]\n    D1 --> E1[OpenAPI Specification]\n    D2 --> E2[Client Code]\n    D3 --> E3[Server-Side Stub Code]\n    E1 --> F[Integration]\n    E2 --> F\n    E3 --> F\n\n    classDef veryLightGreen fill:#E0FFE0,stroke:#333,stroke-width:2px;\n    classDef lightGreen fill:#B2FFB2,stroke:#333,stroke-width:2px;\n    classDef green fill:#80FF80,stroke:#333,stroke-width:2px;\n    classDef emitter fill:#66CC66,stroke:#333,stroke-width:2px;\n    classDef integration fill:#ADD8E6,stroke:#333,stroke-width:2px;\n\n    class A1,A2 veryLightGreen;\n    class B lightGreen;\n    class C green;\n    class D1,D2,D3 emitter;\n    class F integration;\n"
  },
  {
    "path": "articles/typespec/overview.md",
    "content": "---\ntitle: Overview of TypeSpec - What is TypeSpec?\ndescription: Discover how TypeSpec enhances API design with reusable elements, seamless toolchain integration, and a great developer experience.\nms.topic: overview\nms.date: 03/10/2026\nms.custom: devx-track-typespec\nai-usage: ai-assisted\n#customer intent: As a developer or API designer, I want to use TypeSpec to create consistent, high-quality APIs efficiently and integrate them seamlessly with existing toolchains.\n---\n\n# What is TypeSpec?\n\n[TypeSpec](https://typespec.io/) is a powerful and flexible language for designing APIs. It allows developers to define APIs in an extensible and easy-to-understand language. That compilation uses emitters to generate API specifications, client code, and server-side API code. TypeSpec is an [open source project](#open-source-support) developed by Microsoft and supported by the community.\n\n:::image type=\"content\" source=\"media/tool-chain.png\" alt-text=\"Diagram showing TypeSpec and the generated specification happen before API generation.\":::\n\nTypeSpec enables you to create modular, reusable components which are concise and compliant with API guidelines. The standard TypeSpec library includes an OpenAPI emitter, ensuring compatibility with existing tools and workflows.\n\nAs an open source language, TypeSpec can describe any API, not just Azure APIs. This versatility makes it a valuable tool for API developers, architects, and managers who need to deliver high-quality APIs in a complex and evolving environment.\n\n## Who should read this?\n\nThis article is for you if you:\n\n- Build or maintain APIs — whether you're writing them, reviewing them, or managing the process\n- Need to create new APIs, maintain multiple API versions, or ensure consistency across API protocols\n- Want to automate code generation or work with specifications like OpenAPI\n- Use any language — TypeSpec works with .NET, JavaScript, Java, Python, and more. No prior TypeSpec experience needed.\n\n> [!NOTE]\n> **Getting started**\n> - No prior TypeSpec knowledge is required.\n> - Familiarity with OpenAPI or API specification concepts is helpful but not required.\n> - See the quickstart prerequisites for tool requirements.\n\nTypeSpec 1.0 is generally available (GA) with stable core components (`@typespec/compiler`, `@typespec/http`, `@typespec/openapi`) and production-ready emitters (`@typespec/openapi3`, `@typespec/json-schema`). Client and server code generation for .NET, JavaScript, Java, and Python is available in preview, with active development toward full release.\n\n## Benefits of TypeSpec\n\n* **Simplifies API Development**: Provides a clear and concise way to define APIs, allowing developers to focus on logic and functionality.\n* **Accelerates Deployment**: TypeSpec enables rapid service and client code generation from a single API definition, streamlining deployment and ensuring consistency.\n* **Ensures Compliance**: Uses reusable components to adhere to established guidelines and standards, reducing errors and inconsistencies.\n* **Enhances Compatibility**: Includes an OpenAPI emitter for compatibility with existing tools and workflows, making integration easier.\n* **Supports Extensibility**: Flexible and extensible, allowing customization and extension of API definitions for various scenarios.\n* **Accelerates Migration**: [OpenApiMigration tool](https://typespec.io/docs/emitters/openapi3/cli/#converting-openapi-3-into-typespec) eases transition to TypeSpec for faster adoption.\n\nAs an [open-source project](https://github.com/microsoft/typespec/), TypeSpec benefits from community contributions and feedback, ensuring continuous improvement based on real-world use cases.\n\n## What you can do with TypeSpec\n\nYou can use TypeSpec to:\n\n1. Design a new OpenAPI 3.0–compliant API from scratch\n1. Migrate an existing OpenAPI spec into TypeSpec for easier maintenance\n1. Generate client libraries for .NET, JavaScript, Java, or Python automatically\n1. Create server stubs for .NET or JavaScript to jumpstart implementation\n1. Reuse API components across multiple API versions to stay consistent\n1. Emit OpenAPI specs that work with Swagger, Postman, Azure API Management, and other industry tools\n1. Extend TypeSpec with custom emitters for your own toolchains\n\n## API design is challenging\n\nTypeSpec addresses common challenges in API design, governance, and implementation:\n\n- **Complex Specifications**: Writing, reviewing, and maintaining API specifications can be cumbersome. Even a simple API can result in hundreds of lines of specification code.\n- **Protocol Diversity**: Each protocol has its own specification format, with no shared design language across protocols. This fragmentation complicates the development process.\n- **Governance Issues**: Without a unified design language, governing APIs becomes difficult, leading to inconsistencies in implementation and quality.\n- **Scalability Concerns**: As the number of APIs or API versions increases, more engineering teams are required, which can lead to coordination challenges and inefficiencies.\n\nBy addressing these challenges, TypeSpec simplifies the API design process, ensures consistency across different protocols, and enhances overall governance and scalability.\n\n## TypeSpec API development workflow\n\nThe following diagram illustrates the key stages involved in developing APIs with TypeSpec. The process starts with two options: creating a new API specification from scratch or migrating from an existing OpenAPI spec. Once you begin, the API is defined using TypeSpec, using its modular and reusable components. The TypeSpec compiler then processes these definitions, using a robust set of emitters to automatically generate API specifications, client code, and server-side stub code. Finally, the generated artifacts are integrated with existing toolchains, ensuring a smooth and consistent workflow.\n\n[ ![Diagram showing a TypeSpec workflow.](./media/typespec-toolchain-diagram.png) ](./media/typespec-toolchain-diagram.png#lightbox)\n\n**Workflow Steps**\n\n| Step                     | Description                                                                                             |\n|--------------------------|---------------------------------------------------------------------------------------------------------|\n| **Start**                | Begin by writing a new API specification using TypeSpec or migrating from an existing OpenAPI spec.      |\n| **TypeSpec Definition**  | Define the API using TypeSpec. Reusable components make the API concise and ensure compliance with guidelines. |\n| **TypeSpec Compiler**    | The compiler processes the TypeSpec definitions to prepare them for code generation.                    |\n| **Generation**           | Dedicated emitters automatically generate the API specification, client code, and server-side stub code. |\n| **Integration**          | The generated outputs are seamlessly integrated into existing API toolchains.                           |\n\n**Paths from the TypeSpec Compiler:**  \nThe TypeSpec compiler can generate outputs for OpenAPI specifications, client code, and server-side stub code concurrently if needed, while still allowing you to trigger each output independently based on your project requirements.\n\n1. **Generate OpenAPI Specifications**  \n   *The OpenAPI emitter produces a standardized API description format.*\n\n2. **Generate Client-Side Code**  \n   *The client code emitter creates code for consuming the API.*\n\n3. **Generate Server-Side Stub Code**  \n   *The service-side emitter generates server stub code to kickstart API implementation.*\n\n## Comprehensive code generation with TypeSpec\n\n### Client code generation\n\nTypeSpec streamlines client code generation by automatically creating code to consume APIs directly from TypeSpec definitions. This process leverages key capabilities such as standard runtime interfaces that ensure seamless integration, custom code extensibility to tailor the output for specific client needs, and comprehensive generation that spans the entire development stack. As a result, developers can maintain consistency across applications, reduce manual coding effort, and quickly integrate APIs with existing toolchains while enjoying a more efficient and scalable development workflow.\n\nLanguages supported:\n\n* .NET\n* Java\n* JavaScript\n* Python\n\n### Server code generation\n\nTypeSpec supports generating server-side stub code directly from TypeSpec definitions. This streamlines the development process and ensures consistency across client and server implementations.\n\nLanguages supported:\n\n* .NET\n* JavaScript\n\nKey capabilities:\n\n* **Standard Runtime Interfaces**: The standard emitter focuses on generating runtime interfaces initially, ensuring flexibility and easy integration with various runtime stacks.\n* **Custom Code Extensibility**: TypeSpec emitters offer custom code extensibility, allowing developers to tailor the generated code to specific needs, making it adaptable to different environments.\n* **Comprehensive Code Generation**: TypeSpec supports code generation across the entire development stack, from clients to servers, including different protocols and asset types, ensuring a unified development approach.\n\nBy using TypeSpec’s service-side code generation capabilities, developers can reduce manual coding, improve consistency, and enhance overall productivity.\n\n## Interoperability with industry toolchain\n\nTypeSpec seamlessly integrates with existing industry toolchains, ensuring interoperability, and enhancing productivity. By generating OpenAPI specifications from TypeSpec definitions, developers can use a vast ecosystem of tools designed for OpenAPI, such as Swagger for API documentation, Postman for API testing, and Azure API Management for deploying APIs. This includes configuring API gateways, generating client and server code, and validating API data. This compatibility allows teams to maintain their current workflows while benefiting from the structured and consistent API design that TypeSpec provides.\n\n## Great developer experience\n\nDeveloper integrations include a [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=typespec.typespec-vscode) and [Visual Studio](https://marketplace.visualstudio.com/items?itemName=typespec.typespecvs). These integrations provide efficient and error-free coding with features like autocompletion, syntax highlighting, build-time error identification, symbol renaming, and document formatting. For example, when writing TypeSpec definitions in Visual Studio Code, the extension provides real-time autocompletion and syntax highlighting, making it easier to write correct and consistent API definitions.\n\nThe VS Code extension also includes quick commands to streamline common tasks: **Create TypeSpec Project**, **Emit from TypeSpec**, **Preview API Documentation**, and **Import TypeSpec from OpenAPI 3**.\n\n:::image type=\"content\" source=\"media/visual-studio-code-extension.gif\" alt-text=\"Screenshot animation of Visual Studio Code extension for TypeSpec providing autocompletion and syntax highlighting.\":::\n\nAdditionally, the [TypeSpec Playground](https://typespec.io/playground/) offers an interactive environment where developers can [experiment with TypeSpec syntax and features in real-time](https://typespec.io/playground/?options=%7B%22linterRuleSet%22%3A%7B%22extends%22%3A%5B%22%40typespec%2Fhttp%2Fall%22%5D%7D%7D&sample=HTTP+service). This web-based tool provides immediate feedback and validation, making it easier to learn and adopt TypeSpec. The interactive, hands-on experience provided by the TypeSpec Playground deepens developers' understanding and proficiency, ultimately resulting in more consistent, higher-quality API designs. These tools collectively improve the developer experience by streamlining the development process, reducing the likelihood of errors, and accelerating the learning curve for new team members.\n\n:::image type=\"content\" source=\"media/typespec-playground.png\" alt-text=\"Screenshot of TypeSpec playground with sample HTTP service emitting to the Swagger UI.\":::\n\nTo further support developers transitioning from existing APIs, the [OpenApiMigration tool](https://typespec.io/docs/emitters/openapi3/cli/#converting-openapi-3-into-typespec) provides an efficient way to convert OpenAPI specifications into TypeSpec definitions. This migration tool simplifies and accelerates the adoption of TypeSpec while preserving the integrity of your existing API documentation. Three migration examples include:\n\n* [Convert component schemas into models](https://typespec.io/docs/emitters/openapi3/cli/#1-convert-component-schemas-into-models)\n* [Convert component parameters into models or fields](https://typespec.io/docs/emitters/openapi3/cli/#2-convert-component-parameters-into-models-or-fields)\n* [Convert path routes to operations](https://typespec.io/docs/emitters/openapi3/cli/#3-convert-path-routes-to-operations)\n\n## Real-World uses\n\nTypeSpec has been successfully used in various industries to streamline API design and development. Here are a few examples:\n\n- **E-commerce**: An online retail platform used TypeSpec to design and document their API, enabling seamless integration with third-party services and improving the overall developer experience.\n- **Finance**: A financial services company adopted TypeSpec to ensure consistency and compliance across their APIs, reducing the time and effort required for API governance.\n- **Healthcare**: A healthcare provider used TypeSpec to design APIs for patient data management, ensuring data consistency and security across their systems.\n\n## Next steps\n\n1. [Quickstart: TypeSpec & .NET](quickstart-scaffold-dotnet.md) — Create an API and generate .NET client and server code\n1. [Quickstart: TypeSpec & TypeScript](quickstart-scaffold-typescript.md) — Set up a TypeSpec project with TypeScript\n1. [TypeSpec Documentation Hub](resources.md) — Explore full docs, examples, and troubleshooting\n1. [TypeSpec for OpenAPI developers](https://typespec.io/docs/getting-started/typespec-for-openapi-dev/) — Migrate existing OpenAPI specs to TypeSpec\n\n## Open source support\n\n* We value and encourage your ideas, feedback, and contributions to help improve the project.\n* For more information on how to contribute, refer to the [contributor guide](https://github.com/microsoft/typespec/blob/main/CONTRIBUTING.md).\n* If you have questions or need assistance, feel free to [ask the community](https://github.com/microsoft/typespec/discussions) or [submit an issue on GitHub](https://github.com/microsoft/typespec/issues).\n\n## Learn more\n\nEnjoy these YouTube videos for a deeper dive on TypeSpec:\n\n- [APIs at scale with TypeSpec](https://youtu.be/yfCYrKaojDo)\n- [Schema-first API design using TypeSpec](https://www.youtube.com/watch?v=xDbC7Mhi9wM)\n- [TypeSpec 101](https://www.youtube.com/playlist?list=PLYWCCsom5Txglkl_I1XvwzrzM5G3SuVsR)\n- [Using TypeSpec for Open Finance Standards](https://www.youtube.com/watch?v=3Q6xWbWTSaU)\n\n## Related content\n\n- [TypeSpec.io](https://typespec.io/)\n- [TypeSpec Playground](https://typespec.io/playground/)\n- [TypeSpec Community](https://typespec.io/community/)\n"
  },
  {
    "path": "articles/typespec/quickstart-scaffold-dotnet.md",
    "content": "---\ntitle: \"Quickstart: Create a new API project with TypeSpec and .NET\"\ndescription: Learn how to generate and set up a new RESTful API project using TypeSpec to scaffold consistent client and server code for cloud services.\nms.topic: quickstart\nms.date: 03/10/2026\nms.custom: devx-track-typespec, devx-track-dotnet\nai-usage: ai-assisted\n#zone_pivot_groups: typespec-quickstart-on-azure-languages\n#zone_pivot_group_filename: developer/typespec/zone-pivot-groups.json\n#customer intent: As a developer or API designer, I want to create an TypeSpec API and deploy it to Azure so that I can learn the entire end to end development and deployment cycle.\n---\n\n# Quickstart: Create a new API project with TypeSpec and .NET\n\nIn this quickstart, you learn how to use TypeSpec to design, generate, and implement a RESTful API application. TypeSpec is an open-source language for describing cloud service APIs and generates client and server code for multiple platforms. By following this quickstart, you learn how to define your API contract once and generate consistent implementations, helping you build more maintainable and well-documented API services.\n\nYou'll use TypeSpec's code generator to scaffold an ASP.NET Core server with routing and Swagger UI, connect it to Azure Cosmos DB for persistence, and deploy to Azure Container Apps.\n\nFor context on TypeSpec's role in API development, see [Overview of TypeSpec](overview.md).\n\n**Time to complete:** 20–25 minutes\n\nIn this quickstart, you:\n\n> [!div class=\"checklist\"]\n> * Define your API using TypeSpec\n> * Create an API server application\n> * Integrate Azure Cosmos DB for persistent storage\n> * Run and test your API locally\n> * Deploy to Azure Container Apps\n\n## Prerequisites\n\n[!INCLUDE [dotnet-prereq](includes/quickstart/prereqs-csharp.md)]\n\n\n## Developing with TypeSpec\n\nTypeSpec defines your API in a language-agnostic way and generates the API server and client library for multiple platforms. This functionality allows you to:\n\n* Define your API contract once\n* Generate consistent server and client code\n* Focus on implementing business logic rather than API infrastructure\n\n**TypeSpec provides API service management**:\n\n* API definition language\n* Server-side routing middleware for API\n* Client libraries for consuming API\n\n**You provide client requests and server integrations:**\n\n* Implement business logic in middleware such as Azure services for databases, storage, and messaging\n* Hosting server for your API (locally or in Azure)\n* Deployment scripts for repeatable provisioning and deployment\n\n## Create a new TypeSpec application\n\n1. Create a new folder to hold the API server and TypeSpec files. \n\n    ```console\n    mkdir my_typespec_quickstart\n    cd my_typespec_quickstart\n    ```\n\n1. Install the [TypeSpec compiler](https://www.npmjs.com/package/@typespec/compiler) globally:\n\n    ```console\n    npm install -g @typespec/compiler\n    ```\n\n1. Check TypeSpec installed correctly:\n\n    ```console\n    tsp --version\n    ```\n\n1. Initialize the TypeSpec project:\n\n    ```\n    tsp init\n    ```\n\n1. Answer the following prompts with the answers provided:\n\n    * Initialize a new project here? Y\n    * Select a project template? Generic REST API\n    * Enter a project name: Widgets\n    * What emitters do you want to use? \n        * OpenAPI 3.1 document\n        * C# server stubs\n\n    TypeSpec **emitters** are libraries that utilize various TypeSpec compiler APIs to reflect on the TypeSpec compilation process and generate artifacts.\n\n1. Wait for the initialization to complete before continuing.\n\n    ```console\n    Run tsp compile . to build the project.\n    \n    Please review the following messages from emitters:\n      @typespec/http-server-csharp: \n    \n            Generated ASP.Net services require dotnet 9:\n            https://dotnet.microsoft.com/download \n    \n            Create an ASP.Net service project for your TypeSpec:\n            > npx hscs-scaffold . --use-swaggerui --overwrite\n    \n            More information on getting started:\n            https://aka.ms/tsp/hscs/start\n    ```\n    \n1. Compile the project:\n\n    ```console\n    tsp compile .\n    ```\n\n    > [!TIP]\n    > For iterative development, use watch mode to automatically recompile on file changes: `tsp compile . --watch`. This keeps your generated server and schema up to date as you modify `main.tsp`.\n\n1. TypeSpec generates the default project in `./tsp-output`, creating two separate folders:\n\n    * schema\n    * server\n\n1. Open the `./tsp-output/schema/openapi.yaml` file. Notice that the few lines in `./main.tsp` generated over 200 lines of OpenApi specification for you. \n\n1. Open the `./tsp-output/server/aspnet` folder. Notice that the scaffolded .NET files include:\n\n    * `./generated/operations/IWidgets.cs` defines the interface for the Widgets methods.\n    * `./generated/controllers/WidgetsController.cs` implements the integration to the Widgets methods. This is where you put your business logic.\n    * `./generated/models` defines the models for the Widget API. \n\n## Configure TypeSpec emitters\n\nUse the TypeSpec files to configure the API server generation.\n\n1. Open the `tspconfig.yaml` and replace the existing configuration with the following YAML:\n\n    ```yml\n    emit:\n      - \"@typespec/openapi3\"\n      - \"@typespec/http-server-csharp\"\n    options:\n      \"@typespec/openapi3\":\n        emitter-output-dir: \"{cwd}/server/wwwroot\"\n        openapi-versions:\n          - 3.1.0\n      \"@typespec/http-server-csharp\":\n        emitter-output-dir: \"{cwd}/server/\"\n        use-swaggerui: true\n        overwrite: true\n        emit-mocks: \"mocks-and-project-files\"\n    ```\n    \n    This configuration projects several changes we need for a fully generated .NET API server:\n\n    * `emit-mocks`: Create all the project files needed for the server.\n    * `use-swaggerui`: Integrate the Swagger UI so you can use the API in a browser-friendly way.\n    * `emitter-output-dir`: Set the output directory for both server generation and OpenApi specification generation.\n    * Generate everything into `./server`.\n\n1. Recompile the project:\n\n    ```console\n    tsp compile .\n    ```\n\n1. Change into the new `/server` directory:\n\n    ```console\n    cd server\n    ```\n\n1. Create a default developer certificate if you don't already have one:\n\n    ```console\n    dotnet dev-certs https\n    ```\n\n1. Run the project:\n\n    ```console\n    dotnet run\n    ```\n\n    Wait for the notification to **Open in browser**. \n\n1. Open the browser and add the Swagger UI route, `/swagger`. \n    \n    :::image type=\"content\" source=\"./media/quickstart-scaffold/default-widget-swagger-ui.png\" alt-text=\"A screenshot showing the Swagger UI with the Widgets API.\" lightbox=\"./media/quickstart-scaffold/default-widget-swagger-ui.png\":::\n    \n1. The default TypeSpec API and server both work.\n\n## Understand application file structure\n\n[!INCLUDE [cs-file-structure](includes/quickstart/file-structure-csharp.md)]\n\n## Change persistence to Azure Cosmos DB no-sql\n\nNow that the basic Widget API server is working, update the server to work with [Azure Cosmos DB](/azure/cosmos-db/) for a persistent data store. \n\n1. In the `./server` directory, add [Azure Cosmos DB](https://www.nuget.org/packages/Microsoft.Azure.Cosmos) to the project:\n\n    ```console\n    dotnet add package Microsoft.Azure.Cosmos\n    ```\n\n1. Add the [Azure Identity library](https://www.nuget.org/packages/Azure.Identity) to [authenticate to Azure](/dotnet/azure/sdk/authentication/):\n\n    ```console\n    dotnet add package Azure.Identity\n    ```\n\n1. Update the `./server/ServiceProject.csproj` for Cosmos DB integration settings:\n\n    ```xml\n    <Project Sdk=\"Microsoft.NET.Sdk.Web\">\n      <PropertyGroup>\n        ... existing settings ...\n        <EnableSdkContainerSupport>true</EnableSdkContainerSupport>\n      </PropertyGroup>\n      <ItemGroup>\n        ... existing settings ...\n        <PackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" />\n      </ItemGroup>\n    </Project>\n    ```\n\n    * EnableSdkContainerSupport  lets you use the .NET SDK’s built-in container build support (dotnet publish ––container) without writing a Dockerfile.\n    * Newtonsoft.Json adds the Json .NET serializer that the Cosmos DB SDK uses to convert your .NET objects to and from JSON.\n\n1. Create a new registration file, `./azure/CosmosDbRegistration` to manage the Cosmos DB registration:\n\n    ```csharp\n    using Microsoft.Azure.Cosmos;\n    using Microsoft.Extensions.Configuration;\n    using System;\n    using System.Threading.Tasks;\n    using Azure.Identity;\n    using DemoService;\n\n    namespace WidgetService.Service\n    {\n        /// <summary>\n        /// Registration class for Azure Cosmos DB services and implementations\n        /// </summary>\n        public static class CosmosDbRegistration\n        {\n            /// <summary>\n            /// Registers the Cosmos DB client and related services for dependency injection\n            /// </summary>\n            /// <param name=\"builder\">The web application builder</param>\n            public static void RegisterCosmosServices(this WebApplicationBuilder builder)\n            {\n                // Register the HttpContextAccessor for accessing the HTTP context\n                builder.Services.AddHttpContextAccessor();\n\n                // Get configuration settings\n                var cosmosEndpoint = builder.Configuration[\"Configuration:AzureCosmosDb:Endpoint\"];\n\n                // Validate configuration\n                ValidateCosmosDbConfiguration(cosmosEndpoint);\n\n                // Configure Cosmos DB client options\n                var cosmosClientOptions = new CosmosClientOptions\n                {\n                    SerializerOptions = new CosmosSerializationOptions\n                    {\n                        PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase\n                    },\n                    ConnectionMode = ConnectionMode.Direct\n                };\n\n                builder.Services.AddSingleton(serviceProvider =>\n                {\n                    var credential = new DefaultAzureCredential();\n\n                    // Create Cosmos client with token credential authentication\n                    return new CosmosClient(cosmosEndpoint, credential, cosmosClientOptions);\n                });\n\n                // Initialize Cosmos DB if needed\n                builder.Services.AddHostedService<CosmosDbInitializer>();\n\n                // Register WidgetsCosmos implementation of IWidgets\n                builder.Services.AddScoped<IWidgets, WidgetsCosmos>();\n            }\n\n            /// <summary>\n            /// Validates the Cosmos DB configuration settings\n            /// </summary>\n            /// <param name=\"cosmosEndpoint\">The Cosmos DB endpoint</param>\n            /// <exception cref=\"ArgumentException\">Thrown when configuration is invalid</exception>\n            private static void ValidateCosmosDbConfiguration(string cosmosEndpoint)\n            {\n                if (string.IsNullOrEmpty(cosmosEndpoint))\n                {\n                    throw new ArgumentException(\"Cosmos DB Endpoint must be specified in configuration\");\n                }\n            }\n        }\n    }\n    ```\n\n    Notice the environment variable for the endpoint:\n\n    ```csharp\n    var cosmosEndpoint = builder.Configuration[\"Configuration:AzureCosmosDb:Endpoint\"];\n    ```\n\n1. Create a new Widget class, `./azure/WidgetsCosmos.cs` to provide business logic to integrate with Azure Cosmos DB for your persistent store. \n\n    ```csharp\n    using System;\n    using System.Net;\n    using System.Threading.Tasks;\n    using Microsoft.Azure.Cosmos;\n    using Microsoft.Extensions.Logging;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    // Use generated models and operations\n    using DemoService;\n\n    namespace WidgetService.Service\n    {\n        /// <summary>\n        /// Implementation of the IWidgets interface that uses Azure Cosmos DB for persistence\n        /// </summary>\n        public class WidgetsCosmos : IWidgets\n        {\n            private readonly CosmosClient _cosmosClient;\n            private readonly ILogger<WidgetsCosmos> _logger;\n            private readonly IHttpContextAccessor _httpContextAccessor;\n            private readonly string _databaseName = \"WidgetDb\";\n            private readonly string _containerName = \"Widgets\";\n\n            /// <summary>\n            /// Initializes a new instance of the WidgetsCosmos class.\n            /// </summary>\n            /// <param name=\"cosmosClient\">The Cosmos DB client instance</param>\n            /// <param name=\"logger\">Logger for diagnostic information</param>\n            /// <param name=\"httpContextAccessor\">Accessor for the HTTP context</param>\n            public WidgetsCosmos(\n                CosmosClient cosmosClient,\n                ILogger<WidgetsCosmos> logger,\n                IHttpContextAccessor httpContextAccessor)\n            {\n                _cosmosClient = cosmosClient;\n                _logger = logger;\n                _httpContextAccessor = httpContextAccessor;\n            }\n\n            /// <summary>\n            /// Gets a reference to the Cosmos DB container for widgets\n            /// </summary>\n            private Container WidgetsContainer => _cosmosClient.GetContainer(_databaseName, _containerName);\n\n            /// <summary>\n            /// Lists all widgets in the database\n            /// </summary>\n            /// <returns>Array of Widget objects</returns>\n            public async Task<WidgetList> ListAsync()\n            {\n                try\n                {\n                    var queryDefinition = new QueryDefinition(\"SELECT * FROM c\");\n                    var widgets = new List<Widget>();\n\n                    using var iterator = WidgetsContainer.GetItemQueryIterator<Widget>(queryDefinition);\n                    while (iterator.HasMoreResults)\n                    {\n                        var response = await iterator.ReadNextAsync();\n                        widgets.AddRange(response.ToList());\n                    }\n\n                    // Create and return a WidgetList instead of Widget[]\n                    return new WidgetList\n                    {\n                        Items = widgets.ToArray()\n                    };\n                }\n                catch (Exception ex)\n                {\n                    _logger.LogError(ex, \"Error listing widgets from Cosmos DB\");\n                    throw new Error(500, \"Failed to retrieve widgets from database\");\n                }\n            }\n\n            /// <summary>\n            /// Retrieves a specific widget by ID\n            /// </summary>\n            /// <param name=\"id\">The ID of the widget to retrieve</param>\n            /// <returns>The retrieved Widget</returns>\n            public async Task<Widget> ReadAsync(string id)\n            {\n                try\n                {\n                    var response = await WidgetsContainer.ReadItemAsync<Widget>(\n                        id, new PartitionKey(id));\n\n                    return response.Resource;\n                }\n                catch (CosmosException ex) when (ex.StatusCode == HttpStatusCode.NotFound)\n                {\n                    _logger.LogWarning(\"Widget with ID {WidgetId} not found\", id);\n                    throw new Error(404, $\"Widget with ID '{id}' not found\");\n                }\n                catch (Exception ex)\n                {\n                    _logger.LogError(ex, \"Error reading widget {WidgetId} from Cosmos DB\", id);\n                    throw new Error(500, \"Failed to retrieve widget from database\");\n                }\n            }\n            /// <summary>\n            /// Creates a new widget from the provided Widget object\n            /// </summary>\n            /// <param name=\"body\">The Widget object to store in the database</param>\n            /// <returns>The created Widget</returns>\n            public async Task<Widget> CreateAsync(Widget body)\n            {\n                try\n                {\n                    // Validate the Widget\n                    if (body == null)\n                    {\n                        throw new Error(400, \"Widget data cannot be null\");\n                    }\n\n                    if (string.IsNullOrEmpty(body.Id))\n                    {\n                        throw new Error(400, \"Widget must have an Id\");\n                    }\n\n                    if (body.Color != \"red\" && body.Color != \"blue\")\n                    {\n                        throw new Error(400, \"Color must be 'red' or 'blue'\");\n                    }\n\n                    // Save the widget to Cosmos DB\n                    var response = await WidgetsContainer.CreateItemAsync(\n                        body, new PartitionKey(body.Id));\n\n                    _logger.LogInformation(\"Created widget with ID {WidgetId}\", body.Id);\n                    return response.Resource;\n                }\n                catch (CosmosException ex) when (ex.StatusCode == HttpStatusCode.Conflict)\n                {\n                    _logger.LogError(ex, \"Widget with ID {WidgetId} already exists\", body.Id);\n                    throw new Error(409, $\"Widget with ID '{body.Id}' already exists\");\n                }\n                catch (Exception ex) when (!(ex is Error))\n                {\n                    _logger.LogError(ex, \"Error creating widget in Cosmos DB\");\n                    throw new Error(500, \"Failed to create widget in database\");\n                }\n            }\n\n            /// <summary>\n            /// Updates an existing widget with properties specified in the patch document\n            /// </summary>\n            /// <param name=\"id\">The ID of the widget to update</param>\n            /// <param name=\"body\">The WidgetMergePatchUpdate object containing properties to update</param>\n            /// <returns>The updated Widget</returns>\n            public async Task<Widget> UpdateAsync(string id, TypeSpec.Http.WidgetMergePatchUpdate body)\n            {\n                try\n                {\n                    // Validate input parameters\n                    if (body == null)\n                    {\n                        throw new Error(400, \"Update data cannot be null\");\n                    }\n\n                    if (body.Color != null && body.Color != \"red\" && body.Color != \"blue\")\n                    {\n                        throw new Error(400, \"Color must be 'red' or 'blue'\");\n                    }\n\n                    // First check if the item exists\n                    Widget existingWidget;\n                    try\n                    {\n                        var response = await WidgetsContainer.ReadItemAsync<Widget>(\n                            id, new PartitionKey(id));\n                        existingWidget = response.Resource;\n                    }\n                    catch (CosmosException ex) when (ex.StatusCode == HttpStatusCode.NotFound)\n                    {\n                        _logger.LogWarning(\"Widget with ID {WidgetId} not found for update\", id);\n                        throw new Error(404, $\"Widget with ID '{id}' not found\");\n                    }\n\n                    // Apply the patch updates only where properties are provided\n                    bool hasChanges = false;\n\n                    if (body.Weight.HasValue)\n                    {\n                        existingWidget.Weight = body.Weight.Value;\n                        hasChanges = true;\n                    }\n\n                    if (body.Color != null)\n                    {\n                        existingWidget.Color = body.Color;\n                        hasChanges = true;\n                    }\n\n                    // Only perform the update if changes were made\n                    if (hasChanges)\n                    {\n                        // Use ReplaceItemAsync for the update\n                        var updateResponse = await WidgetsContainer.ReplaceItemAsync(\n                            existingWidget, id, new PartitionKey(id));\n\n                        _logger.LogInformation(\"Updated widget with ID {WidgetId}\", id);\n                        return updateResponse.Resource;\n                    }\n\n                    // If no changes, return the existing widget\n                    _logger.LogInformation(\"No changes to apply for widget with ID {WidgetId}\", id);\n                    return existingWidget;\n                }\n                catch (Error)\n                {\n                    // Rethrow Error exceptions\n                    throw;\n                }\n                catch (Exception ex)\n                {\n                    _logger.LogError(ex, \"Error updating widget {WidgetId} in Cosmos DB\", id);\n                    throw new Error(500, \"Failed to update widget in database\");\n                }\n            }\n\n            /// <summary>\n            /// Deletes a widget by its ID\n            /// </summary>\n            /// <param name=\"id\">The ID of the widget to delete</param>\n            public async Task DeleteAsync(string id)\n            {\n                try\n                {\n                    await WidgetsContainer.DeleteItemAsync<Widget>(id, new PartitionKey(id));\n                    _logger.LogInformation(\"Deleted widget with ID {WidgetId}\", id);\n                }\n                catch (CosmosException ex) when (ex.StatusCode == HttpStatusCode.NotFound)\n                {\n                    _logger.LogWarning(\"Widget with ID {WidgetId} not found for deletion\", id);\n                    throw new Error(404, $\"Widget with ID '{id}' not found\");\n                }\n                catch (Exception ex)\n                {\n                    _logger.LogError(ex, \"Error deleting widget {WidgetId} from Cosmos DB\", id);\n                    throw new Error(500, \"Failed to delete widget from database\");\n                }\n            }\n\n            /// <summary>\n            /// Analyzes a widget by ID and returns a simplified analysis result\n            /// </summary>\n            /// <param name=\"id\">The ID of the widget to analyze</param>\n            /// <returns>An AnalyzeResult containing the analysis of the widget</returns>\n            public async Task<AnalyzeResult> AnalyzeAsync(string id)\n            {\n                try\n                {\n                    // First retrieve the widget from the database\n                    Widget widget;\n                    try\n                    {\n                        var response = await WidgetsContainer.ReadItemAsync<Widget>(\n                            id, new PartitionKey(id));\n                        widget = response.Resource;\n                    }\n                    catch (CosmosException ex) when (ex.StatusCode == HttpStatusCode.NotFound)\n                    {\n                        _logger.LogWarning(\"Widget with ID {WidgetId} not found for analysis\", id);\n                        throw new Error(404, $\"Widget with ID '{id}' not found\");\n                    }\n\n                    // Create the analysis result\n                    var result = new AnalyzeResult\n                    {\n                        Id = widget.Id,\n                        Analysis = $\"Weight: {widget.Weight}, Color: {widget.Color}\"\n                    };\n\n                    _logger.LogInformation(\"Analyzed widget with ID {WidgetId}\", id);\n                    return result;\n                }\n                catch (Error)\n                {\n                    // Rethrow Error exceptions\n                    throw;\n                }\n                catch (Exception ex)\n                {\n                    _logger.LogError(ex, \"Error analyzing widget {WidgetId} from Cosmos DB\", id);\n                    throw new Error(500, \"Failed to analyze widget from database\");\n                }\n            }\n        }\n    }\n    ```\n    \n1. Create the `./server/services/CosmosDbInitializer.cs` file to authenticate to Azure:\n\n    ```csharp\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Microsoft.Azure.Cosmos;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.Hosting;\n    using Microsoft.Extensions.Logging;\n\n    namespace WidgetService.Service\n    {\n        /// <summary>\n        /// Hosted service that initializes Cosmos DB resources on application startup\n        /// </summary>\n        public class CosmosDbInitializer : IHostedService\n        {\n            private readonly CosmosClient _cosmosClient;\n            private readonly ILogger<CosmosDbInitializer> _logger;\n            private readonly IConfiguration _configuration;\n            private readonly string _databaseName;\n            private readonly string _containerName = \"Widgets\";\n\n            public CosmosDbInitializer(CosmosClient cosmosClient, ILogger<CosmosDbInitializer> logger, IConfiguration configuration)\n            {\n                _cosmosClient = cosmosClient;\n                _logger = logger;\n                _configuration = configuration;\n                _databaseName = _configuration[\"CosmosDb:DatabaseName\"] ?? \"WidgetDb\";\n            }\n\n            public async Task StartAsync(CancellationToken cancellationToken)\n            {\n                _logger.LogInformation(\"Ensuring Cosmos DB database and container exist...\");\n\n                try\n                {\n                    // Create database if it doesn't exist\n                    var databaseResponse = await _cosmosClient.CreateDatabaseIfNotExistsAsync(\n                        _databaseName,\n                        cancellationToken: cancellationToken);\n\n                    _logger.LogInformation(\"Database {DatabaseName} status: {Status}\", _databaseName,\n                        databaseResponse.StatusCode == System.Net.HttpStatusCode.Created ? \"Created\" : \"Already exists\");\n\n                    // Create container if it doesn't exist (using id as partition key)\n                    var containerResponse = await databaseResponse.Database.CreateContainerIfNotExistsAsync(\n                        new ContainerProperties\n                        {\n                            Id = _containerName,\n                            PartitionKeyPath = \"/id\"\n                        },\n                        throughput: 400, // Minimum RU/s\n                        cancellationToken: cancellationToken);\n\n                    _logger.LogInformation(\"Container {ContainerName} status: {Status}\", _containerName,\n                        containerResponse.StatusCode == System.Net.HttpStatusCode.Created ? \"Created\" : \"Already exists\");\n                }\n                catch (Exception ex)\n                {\n                    _logger.LogError(ex, \"Error initializing Cosmos DB\");\n                    throw;\n                }\n            }\n\n            public Task StopAsync(CancellationToken cancellationToken)\n            {\n                return Task.CompletedTask;\n            }\n        }\n    }\n    ```\n  \n1. Update the `./server/program.cs` to use Cosmos DB and allow the Swagger UI to be used in a production deployment. Copy in the entire file:\n\n    ```csharp\n    // Generated by @typespec/http-server-csharp\n    // <auto-generated />\n    #nullable enable\n\n    using TypeSpec.Helpers;\n    using WidgetService.Service;\n\n    var builder = WebApplication.CreateBuilder(args);\n\n    // Add services to the container.\n    builder.Services.AddControllersWithViews(options =>\n    {\n        options.Filters.Add<HttpServiceExceptionFilter>();\n    });\n    builder.Services.AddEndpointsApiExplorer();\n    builder.Services.AddSwaggerGen();\n\n    // Replace original registration with the Cosmos DB one\n    CosmosDbRegistration.RegisterCosmosServices(builder);\n\n    var app = builder.Build();\n\n    // Configure the HTTP request pipeline.\n    if (!app.Environment.IsDevelopment())\n    {\n        app.UseExceptionHandler(\"/Home/Error\");\n        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.\n        app.UseHsts();\n    }\n\n    // Swagger UI is always available\n    app.UseSwagger();\n    app.UseSwaggerUI(c =>\n    {\n        c.DocumentTitle = \"TypeSpec Generated OpenAPI Viewer\";\n        c.SwaggerEndpoint(\"/openapi.yaml\", \"TypeSpec Generated OpenAPI Docs\");\n        c.RoutePrefix = \"swagger\";\n    });\n\n    app.UseHttpsRedirection();\n    app.UseStaticFiles();\n    app.Use(async (context, next) =>\n    {\n        context.Request.EnableBuffering();\n        await next();\n    });\n\n    app.MapGet(\"/openapi.yaml\", async (HttpContext context) =>\n    {\n        var externalFilePath = \"wwwroot/openapi.yaml\"; \n        if (!File.Exists(externalFilePath))\n        {\n            context.Response.StatusCode = StatusCodes.Status404NotFound;\n            await context.Response.WriteAsync(\"OpenAPI spec not found.\");\n            return;\n        }\n        context.Response.ContentType = \"application/json\";\n        await context.Response.SendFileAsync(externalFilePath);\n    });\n\n    app.UseRouting();\n    app.UseAuthorization();\n\n    app.MapControllerRoute(\n        name: \"default\",\n        pattern: \"{controller=Home}/{action=Index}/{id?}\");\n\n    app.Run();\n    ```\n\n1. Build the project:\n\n    ```console\n    dotnet build\n    ```\n\n    The project now builds with Cosmos DB integration. Let's create the deployment scripts to create the Azure resources and deploy the project.\n\n## Create deployment infrastructure\n\nCreate the files needed to have a repeatable deployment with [Azure Developer CLI](/azure/developer/azure-developer-cli/) and Bicep templates. \n\n1. At the root of the TypeSpec project, create an `azure.yaml` deployment definition file and paste in the following source:\n\n    ```yml\n    # yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json\n    \n    name: azure-typespec-scaffold-dotnet\n    metadata:\n        template: azd-init@1.14.0\n    services:\n        api:\n            project: ./server\n            host: containerapp\n            language: dotnet\n    pipeline:\n      provider: github\n    ```\n\n    Notice that this configuration references the generated project location (`./server`). Ensure that `./tspconfig.yaml` matches the location specified in `./azure.yaml`.\n\n1. At the root of the TypeSpec project, create an `./infra` directory.\n1. Create a `./infra/main.bicepparam` file and copy in the following to define the parameters we need for deployment:\n\n    ```bicep\n    using './main.bicep'\n    \n    param environmentName = readEnvironmentVariable('AZURE_ENV_NAME', 'dev')\n    param location = readEnvironmentVariable('AZURE_LOCATION', 'eastus2')\n    param deploymentUserPrincipalId = readEnvironmentVariable('AZURE_PRINCIPAL_ID', '')\n    ```\n\n    This param list provides the minimum parameters needed for this deployment.\n\n1. Create a `./infra/main.bicep` file and copy in the following to define the Azure resources for provisioning and deployment:\n\n    ```bicep\n    metadata description = 'Bicep template for deploying a GitHub App using Azure Container Apps and Azure Container Registry.'\n    \n    targetScope = 'resourceGroup'\n    param serviceName string = 'api'\n    var databaseName = 'WidgetDb'\n    var containerName = 'Widgets'\n    \n    @minLength(1)\n    @maxLength(64)\n    @description('Name of the environment that can be used as part of naming resource convention')\n    param environmentName string\n    \n    @minLength(1)\n    @description('Primary location for all resources')\n    param location string\n    \n    @description('Id of the principal to assign database and application roles.')\n    param deploymentUserPrincipalId string = ''\n    \n    var resourceToken = toLower(uniqueString(resourceGroup().id, environmentName, location))\n    \n    var tags = {\n      'azd-env-name': environmentName\n      repo: 'https://github.com/typespec'\n    }\n    \n    module managedIdentity 'br/public:avm/res/managed-identity/user-assigned-identity:0.4.1' = {\n      name: 'user-assigned-identity'\n      params: {\n        name: 'identity-${resourceToken}'\n        location: location\n        tags: tags\n      }\n    }\n    \n    module cosmosDb 'br/public:avm/res/document-db/database-account:0.8.1' = {\n      name: 'cosmos-db-account'\n      params: {\n        name: 'cosmos-db-nosql-${resourceToken}'\n        location: location\n        locations: [\n          {\n            failoverPriority: 0\n            locationName: location\n            isZoneRedundant: false\n          }\n        ]\n        tags: tags\n        disableKeyBasedMetadataWriteAccess: true\n        disableLocalAuth: true\n        networkRestrictions: {\n          publicNetworkAccess: 'Enabled'\n          ipRules: []\n          virtualNetworkRules: []\n        }\n        capabilitiesToAdd: [\n          'EnableServerless'\n        ]\n        sqlRoleDefinitions: [\n          {\n            name: 'nosql-data-plane-contributor'\n            dataAction: [\n              'Microsoft.DocumentDB/databaseAccounts/readMetadata'\n              'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*'\n              'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*'\n            ]\n          }\n        ]\n        sqlRoleAssignmentsPrincipalIds: union(\n          [\n            managedIdentity.outputs.principalId\n          ],\n          !empty(deploymentUserPrincipalId) ? [deploymentUserPrincipalId] : []\n        )\n        sqlDatabases: [\n          {\n            name: databaseName\n            containers: [\n              {\n                name: containerName\n                paths: [\n                  '/id'\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n    \n    module containerRegistry 'br/public:avm/res/container-registry/registry:0.5.1' = {\n      name: 'container-registry'\n      params: {\n        name: 'containerreg${resourceToken}'\n        location: location\n        tags: tags\n        acrAdminUserEnabled: false\n        anonymousPullEnabled: true\n        publicNetworkAccess: 'Enabled'\n        acrSku: 'Standard'\n      }\n    }\n    \n    var containerRegistryRole = subscriptionResourceId(\n      'Microsoft.Authorization/roleDefinitions',\n      '8311e382-0749-4cb8-b61a-304f252e45ec'\n    ) \n    \n    module registryUserAssignment 'br/public:avm/ptn/authorization/resource-role-assignment:0.1.1' = if (!empty(deploymentUserPrincipalId)) {\n      name: 'container-registry-role-assignment-push-user'\n      params: {\n        principalId: deploymentUserPrincipalId\n        resourceId: containerRegistry.outputs.resourceId\n        roleDefinitionId: containerRegistryRole\n      }\n    }\n    \n    module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0.7.0' = {\n      name: 'log-analytics-workspace'\n      params: {\n        name: 'log-analytics-${resourceToken}'\n        location: location\n        tags: tags\n      }\n    }\n    \n    module containerAppsEnvironment 'br/public:avm/res/app/managed-environment:0.8.0' = {\n      name: 'container-apps-env'\n      params: {\n        name: 'container-env-${resourceToken}'\n        location: location\n        tags: tags\n        logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId\n        zoneRedundant: false\n      }\n    }\n    \n    module containerAppsApp 'br/public:avm/res/app/container-app:0.9.0' = {\n      name: 'container-apps-app'\n      params: {\n        name: 'container-app-${resourceToken}'\n        environmentResourceId: containerAppsEnvironment.outputs.resourceId\n        location: location\n        tags: union(tags, { 'azd-service-name': serviceName })\n        ingressTargetPort: 8080\n        ingressExternal: true\n        ingressTransport: 'auto'\n        stickySessionsAffinity: 'sticky'\n        scaleMaxReplicas: 1\n        scaleMinReplicas: 1\n        corsPolicy: {\n          allowCredentials: true\n          allowedOrigins: [\n            '*'\n          ]\n        }\n        managedIdentities: {\n          systemAssigned: false\n          userAssignedResourceIds: [\n            managedIdentity.outputs.resourceId\n          ]\n        }\n        secrets: {\n          secureList: [\n            {\n              name: 'azure-cosmos-db-nosql-endpoint'\n              value: cosmosDb.outputs.endpoint\n            }\n            {\n              name: 'user-assigned-managed-identity-client-id'\n              value: managedIdentity.outputs.clientId\n            }\n          ]\n        }\n        containers: [\n          {\n            image: 'mcr.microsoft.com/dotnet/samples:aspnetapp-9.0'\n            name: serviceName\n            resources: {\n              cpu: '0.25'\n              memory: '.5Gi'\n            }\n            env: [\n              {\n                name: 'CONFIGURATION__AZURECOSMOSDB__ENDPOINT'\n                secretRef: 'azure-cosmos-db-nosql-endpoint'\n              }\n              {\n                name: 'AZURE_CLIENT_ID'\n                secretRef: 'user-assigned-managed-identity-client-id'\n              }\n            ]\n          }\n        ]\n      }\n    }\n    \n    output CONFIGURATION__AZURECOSMOSDB__ENDPOINT string = cosmosDb.outputs.endpoint\n    output CONFIGURATION__AZURECOSMOSDB__DATABASENAME string = databaseName\n    output CONFIGURATION__AZURECOSMOSDB__CONTAINERNAME string = containerName\n    \n    output AZURE_CONTAINER_REGISTRY_ENDPOINT string = containerRegistry.outputs.loginServer\n    ```\n\n    The output variables allow you to use the provisioned cloud resources with your local development.\n\n1. The containerAppsApp tag uses the serviceName variable (set to `api` at the top of the file) and the `api` specified in `./azure.yaml`. This connection tells the Azure Developer CLI where to deploy the .NET project to the Azure Container Apps hosting resource.\n\n    ```bicep\n    ...bicep...\n\n    module containerAppsApp 'br/public:avm/res/app/container-app:0.9.0' = {\n      name: 'container-apps-app'\n      params: {\n        name: 'container-app-${resourceToken}'\n        environmentResourceId: containerAppsEnvironment.outputs.resourceId\n        location: location\n        tags: union(tags, { 'azd-service-name': serviceName })                    <--------- `API`\n\n    ...bicep..\n    ```\n\n## Project structure\n\nThe final project structure includes the TypeSpec API files, the Express.js server, and the Azure deployment files: \n\n```console\n├── infra\n├── tsp-output\n├── .gitignore\n├── .azure.yaml\n├── Dockerfile\n├── main.tsp\n├── package-lock.json\n├── package.json\n├── tspconfig.yaml\n```\n\n| Area                     | Files/Directories                                                                 |\n|--------------------------|-----------------------------------------------------------------------------------|\n| **TypeSpec**             | `main.tsp`, `tspconfig.yaml`                                        |\n| **Express.js server**    | `./tsp-output/server/` (includes generated files like `controllers/`, `models/`, `ServiceProject.csproj`) |\n| **Azure Developer CLI deployment** | `./azure.yaml`,`./infra/`                             |\n\n## Deploy application to Azure\n\nYou can deploy this application to Azure using Azure Container Apps:\n\n1. Authenticate to the Azure Developer CLI:\n\n    ```console\n    azd auth login\n    ```\n    \n\n1. Deploy to Azure Container Apps using the Azure Developer CLI:\n\n    ```console\n    azd up\n    ```\n\n## Use application in browser\n\nOnce deployed, you can:\n\n1. Access the Swagger UI to test your API at `/swagger`.\n2. Use the **Try it now** feature on each API to create, read, update, and delete widgets through the API. \n\n## Grow your application\n\nNow that you have the entire end to end process working, continue to build your API: \n\n* Learn more about the [TypeSpec language](https://typespec.io/docs/language-basics/overview/) to add more APIs and API layer features in the `./main.tsp`.\n* Add additional [emitters](https://typespec.io/docs/extending-typespec/emitters-basics/) and configure their parameters in the `./tspconfig.yaml`.\n* As you add more features in your TypeSpec files, support those changes with source code in the server project. \n* Continue to use [passwordless authentication](/dotnet/azure/sdk/authentication/) with Azure Identity.\n\n## Clean up resources\n\nWhen you're done with this quickstart, you can remove the Azure resources:\n\n```console\nazd down\n```\n\nOr delete the resource group directly from the Azure portal.\n\n## Troubleshooting\n\n### .NET 9 requirement not met\n\n**Error:** `Build error: This project requires .NET 9. You have <version> installed.`\n\n**Solution:**\n\n1. Check your .NET version: `dotnet --version`.\n1. Install .NET 9 from [dot.net](https://dot.net/download).\n\n### HTTPS certificate error\n\n**Error:** `System.IO.IOException: The certificate generation failed` when running `dotnet dev-certs https`\n\n**Solution:**\n\n1. Trust the existing certificate: `dotnet dev-certs https --trust`.\n1. If that fails, clean and recreate: `dotnet dev-certs https --clean`, then `dotnet dev-certs https`.\n1. On Windows, ensure you run the terminal as administrator.\n\n### @typespec/http-server-csharp emitter conflict\n\n**Error:** `Emitter error: Dependency conflict` when running `tsp compile .`\n\n**Solution:**\n\n1. Verify `tspconfig.yaml` includes both emitters under `emit:`:\n\n    ```yaml\n    emit:\n      - \"@typespec/openapi3\"\n      - \"@typespec/http-server-csharp\"\n    ```\n\n1. Clear cache: `npm cache clean --force`, then retry: `tsp compile .`.\n\n### Cosmos DB authentication fails\n\n**Error:** `Azure.Identity.AuthenticationFailedException` or `Connection string/key not set`\n\n**Solution:**\n\n1. Ensure the environment variable is set: `echo $AZURE_COSMOS_ENDPOINT` (macOS/Linux) or `echo %AZURE_COSMOS_ENDPOINT%` (Windows).\n1. For local development, set the value in `Program.cs` or an `.env` file.\n1. For production, ensure the Container App secret is configured (see the \"Create deployment infrastructure\" section).\n\n### Swagger UI shows 404\n\n**Error:** Browser shows `404 Not Found` at `/swagger`\n\n**Solution:**\n\n1. Verify the Swagger endpoint configuration in `Program.cs`:\n\n    ```csharp\n    c.SwaggerEndpoint(\"/openapi.yaml\", \"TypeSpec Generated OpenAPI Docs\");\n    c.RoutePrefix = \"swagger\";\n    ```\n\n1. Ensure `openapi.yaml` is in the `wwwroot/` directory.\n1. Rebuild and restart: `dotnet clean && dotnet build && dotnet run`.\n\n## Next steps\n\n- [TypeSpec documentation](https://typespec.io/docs/)\n- [Azure Cosmos DB documentation](/azure/cosmos-db/)\n- [Deploy Node.js apps to Azure](/azure/app-service/quickstart-nodejs)\n- [Azure Container Apps documentation](/azure/container-apps/)"
  },
  {
    "path": "articles/typespec/quickstart-scaffold-typescript.md",
    "content": "---\ntitle: \"Quickstart: Create a new API project with TypeSpec and TypeScript\"\ndescription: Learn how to generate and set up a new RESTful TypeScript API project using TypeSpec to scaffold consistent client and server code for cloud services.\nms.topic: quickstart\nms.date: 03/10/2026\nms.custom: devx-track-typespec, devx-track-js, devx-track-ts\nai-usage: ai-assisted\n#zone_pivot_groups: typespec-quickstart-on-azure-languages\n#zone_pivot_group_filename: developer/typespec/zone-pivot-groups.json\n#customer intent: As a developer or API designer, I want to create an TypeSpec API and deploy it to Azure so that I can learn the entire end to end development and deployment cycle.\n---\n\n# Quickstart: Create a new API project with TypeSpec and TypeScript\n\nIn this quickstart: learn how to use TypeSpec to design, generate, and implement a RESTful TypeScript API application. TypeSpec is an open-source language for describing cloud service APIs and generates client and server code for multiple platforms. By following this quickstart, you learn how to define your API contract once and generate consistent implementations, helping you build more maintainable and well-documented API services.\n\nYou'll use TypeSpec's code generator to scaffold an Express.js server with routing and Swagger UI, connect it to Azure Cosmos DB for persistence, and deploy to Azure Container Apps.\n\nFor context on TypeSpec's role in API development, see [Overview of TypeSpec](overview.md).\n\n**Time to complete:** 15–20 minutes\n\nIn this quickstart, you:\n\n> [!div class=\"checklist\"]\n> * Define your API using TypeSpec\n> * Create an API server application\n> * Integrate Azure Cosmos DB for persistent storage\n> * Deploy to Azure\n> * Run and test your API\n\n> [!IMPORTANT]\n> `@typespec/http-server-js` emitter is currently in PREVIEW.\n> This information relates to a prerelease product that may be substantially modified before it's released. Microsoft makes no warranties, expressed or implied, with respect to the information provided here.\n\n## Prerequisites\n\n[!INCLUDE [ts-prereq](includes/quickstart/prereqs-typescript.md)]\n\n\n## Developing with TypeSpec\n\nTypeSpec defines your API in a language-agnostic way and generates the API server and client library for multiple platforms. This functionality allows you to:\n\n* Define your API contract once\n* Generate consistent server and client code\n* Focus on implementing business logic rather than API infrastructure\n\n**TypeSpec provides API service management**:\n\n* API definition language\n* Server-side routing middleware for API\n* Client libraries for consuming API\n\n**You provide client requests and server integrations:**\n\n* Implement business logic in middleware such as Azure services for databases, storage, and messaging\n* Hosting server for your API (locally or in Azure)\n* Deployment scripts for repeatable provisioning and deployment\n\n## Create a new TypeSpec application\n\n1. Create a new folder to hold the API server and TypeSpec files. \n\n    ```console\n    mkdir my_typespec_quickstart\n    cd my_typespec_quickstart\n    ```\n\n1. Install the [TypeSpec compiler](https://www.npmjs.com/package/@typespec/compiler) globally:\n\n    ```console\n    npm install -g @typespec/compiler\n    ```\n\n1. Check TypeSpec installed correctly:\n\n    ```console\n    tsp --version\n    ```\n\n1. Initialize the TypeSpec project:\n\n    ```\n    tsp init\n    ```\n\n1. Answer the following prompts with the answers provided:\n\n    * Initialize a new project here? Y\n    * Select a project template? Generic REST API\n    * Enter a project name: Widgets\n    * What emitters do you want to use? \n        * OpenAPI 3.1 document\n        * JavaScript server stubs\n\n    TypeSpec **emitters** are libraries that utilize various TypeSpec compiler APIs to reflect on the TypeSpec compilation process and generate artifacts.\n\n1. Wait for the initialization to complete before continuing.\n    \n1. Compile the project:\n\n    ```console\n    tsp compile .\n    ```\n\n    > [!TIP]\n    > For iterative development, use watch mode to automatically recompile on file changes: `tsp compile . --watch`. This keeps your generated server and schema up to date as you modify `main.tsp`.\n\n1. TypeSpec generates the default project in `./tsp-output`, creating two separate folders:\n\n    * **schema** is the OpenApi 3 specification. Notice that the few lines in `./main.tsp` generated over 200 lines of OpenApi specification for you.\n    * **server** is the generated middleware. This middleware can be incorporated into a Node.js server project.\n        * `./tsp-output/server/js/src/generated/models/all/demo-service.ts` defines the interfaces for the Widgets API.\n        * `./tsp-output/server/js/src/generated/http/openapi3.ts` defines the Open API spec as a TypeScript file and is regenerated every time you compile your TypeSpec project.\n    \n## Configure TypeSpec emitters\n\nUse the TypeSpec files to configure the API server generation to scaffold the entire Express.js server.\n\n1. Open the `./tspconfig.yaml` and replace the existing configuration with the following YAML:\n\n    ```yml\n    emit:\n      - \"@typespec/openapi3\"\n      - \"@typespec/http-server-js\"\n    options:\n      \"@typespec/openapi3\":\n        emitter-output-dir: \"{output-dir}/server/schema\"\n        openapi-versions:\n          - 3.1.0\n      \"@typespec/http-server-js\":\n        emitter-output-dir: \"{output-dir}/server\"\n        express: true\n    ```\n    \n    This configuration creates a complete Express.js API server:\n\n    * `express`: Generate the Express.js API server, including the Swagger UI.\n    * `emitter-output-dir`: Generate everything into `./server` directory.\n\n1. Delete the existing `./tsp-output`. Don't worry, you'll generate the server in the next step. \n\n1. Use the TypeSpec JavaScript emitter to create the Express.js server:\n\n    ```console\n    npx hsjs-scaffold\n    ```\n\n1. Change into the new `./tsp-output/server` directory:\n\n    ```console\n    cd ./tsp-output/server\n    ```\n\n1. Compile the TypeScript into JavaScript.\n\n    ```console\n    tsc\n    ```\n\n1. Run the project:\n\n    ```console\n    npm start\n    ```\n\n    Wait for the notification to **Open in browser**. \n\n1. Open the browser and go to `http://localhost:3000/.api-docs`. \n    \n    :::image type=\"content\" source=\"media/quickstart-scaffold/default-widget-swagger-ui.png\" alt-text=\"Screenshot of browser displaying Swagger UI for Widgets API.\":::\n\n1. The default TypeSpec API and server both work. If you want to finish off this API server, add your business logic to support the Widgets APIs in `./tsp-output/server/src/controllers/widgets.ts`. The UI is connected to the API which returns hardcoded fake data. \n\n## Understand application file structure\n\n[!INCLUDE [js-file-structure](includes/quickstart/file-structure-typescript.md)]\n\n## Change persistence to Azure Cosmos DB no-sql\n\nNow that the basic Express.js API server is working, update the Express.js server to work with [Azure Cosmos DB](/azure/cosmos-db/) for a persistent data store. This includes changes to the `index.ts` to use Cosmos DB integration in the middleware. All changes should happen outside the `./tsp-output/server/src/generated` directory.\n\n1. In the `./tsp-output/server` directory, add [Azure Cosmos DB](/azure/cosmos-db/) to the project:\n\n    ```console\n    npm install @azure/cosmos\n    ```\n\n1. Add the [Azure Identity library](https://www.npmjs.com/package/@azure/identity) to [authenticate to Azure](/azure/developer/javascript/sdk/authentication/overview):\n\n    ```console\n    npm install @azure/identity\n    ```\n\n1. Create an `./tsp-output/server/src/azure` directory to hold source code specific to Azure.\n1. Create the `cosmosClient.ts` file in that directory to create a Cosmos DB client object and paste in the following code:\n\n    ```typescript\n    import { CosmosClient, Database, Container } from \"@azure/cosmos\";\n    import { DefaultAzureCredential } from \"@azure/identity\";\n    \n    /**\n     * Interface for CosmosDB configuration settings\n     */\n    export interface CosmosConfig {\n      endpoint: string;\n      databaseId: string;\n      containerId: string;\n      partitionKey: string;\n    } \n    \n    /**\n     * Singleton class for managing CosmosDB connections\n     */\n    export class CosmosClientManager {\n      private static instance: CosmosClientManager;\n      private client: CosmosClient | null = null;\n      private config: CosmosConfig | null = null;\n    \n      private constructor() {}\n    \n      /**\n       * Get the singleton instance of CosmosClientManager\n       */\n      public static getInstance(): CosmosClientManager {\n        if (!CosmosClientManager.instance) {\n          CosmosClientManager.instance = new CosmosClientManager();\n        }\n        return CosmosClientManager.instance;\n      }\n    \n      /**\n       * Initialize the CosmosDB client with configuration if not already initialized\n       * @param config CosmosDB configuration\n       */\n      private ensureInitialized(config: CosmosConfig): void {\n        if (!this.client || !this.config) {\n          this.config = config;\n          this.client = new CosmosClient({\n            endpoint: config.endpoint,\n            aadCredentials: new DefaultAzureCredential(),\n          });\n        }\n      }\n    \n      /**\n       * Get a database instance, creating it if it doesn't exist\n       * @param config CosmosDB configuration\n       * @returns Database instance\n       */\n      private async getDatabase(config: CosmosConfig): Promise<Database> {\n        this.ensureInitialized(config);\n        const { database } = await this.client!.databases.createIfNotExists({ id: config.databaseId });\n        return database;\n      }\n    \n      /**\n       * Get a container instance, creating it if it doesn't exist\n       * @param config CosmosDB configuration\n       * @returns Container instance\n       */\n      public async getContainer(config: CosmosConfig): Promise<Container> {\n        const database = await this.getDatabase(config);\n        const { container } = await database.containers.createIfNotExists({\n          id: config.containerId,\n          partitionKey: { paths: [config.partitionKey] }\n        });\n        return container;\n      }\n    \n      /**\n       * Clean up resources and close connections\n       */\n      public dispose(): void {\n        this.client = null;\n        this.config = null;\n      }\n    }\n    \n    export const buildError = (error: any, message: string) => {\n      const statusCode = error?.statusCode || 500;\n      return {\n        code: statusCode,\n        message: `${message}: ${error?.message || 'Unknown error'}`\n      };\n    };\n    ```\n\n    Notice the file uses the endpoint, database, and container. It doesn't need a connection string or key because it's using the Azure Identity credential `DefaultAzureCredential`. Learn more about this method of [secure authentication for both local and production](/azure/developer/javascript/sdk/authentication/overview) environments.\n\n1. Create a new Widget controller, `./tsp-output/server/src/controllers/WidgetsCosmos.ts`, and paste in the following integration code for Azure Cosmos DB.\n\n    ```typescript\n    import { Widgets, Widget, WidgetList,   AnalyzeResult,Error } from \"../generated/models/all/demo-service.js\";\n    import { WidgetMergePatchUpdate } from \"../generated/models/all/typespec/http.js\";\n    import { CosmosClientManager, CosmosConfig, buildError } from \"../azure/cosmosClient.js\";\n    import { HttpContext } from \"../generated/helpers/router.js\";\n    import { Container } from \"@azure/cosmos\";\n    \n    export interface WidgetDocument extends Widget {\n      _ts?: number;\n      _etag?: string;\n    }\n    \n    /**\n     * Implementation of the Widgets API using Azure Cosmos DB for storage\n     */\n    export class WidgetsCosmosController implements Widgets<HttpContext>  {\n      private readonly cosmosConfig: CosmosConfig;\n      private readonly cosmosManager: CosmosClientManager;\n      private container: Container | null = null;\n    \n      /**\n       * Creates a new instance of WidgetsCosmosController\n       * @param azureCosmosEndpoint Cosmos DB endpoint URL\n       * @param databaseId The Cosmos DB database ID\n       * @param containerId The Cosmos DB container ID\n       * @param partitionKey The partition key path\n       */\n      constructor(azureCosmosEndpoint: string, databaseId: string, containerId: string, partitionKey: string) {\n        if (!azureCosmosEndpoint) throw new Error(\"azureCosmosEndpoint is required\");\n        if (!databaseId) throw new Error(\"databaseId is required\");\n        if (!containerId) throw new Error(\"containerId is required\");\n        if (!partitionKey) throw new Error(\"partitionKey is required\");\n    \n        this.cosmosConfig = {\n          endpoint: azureCosmosEndpoint,\n          databaseId: databaseId,\n          containerId: containerId,\n          partitionKey: partitionKey\n        };\n    \n        this.cosmosManager = CosmosClientManager.getInstance();\n      }\n    \n      /**\n       * Get the container reference, with caching\n       * @returns The Cosmos container instance\n       */\n      private async getContainer(): Promise<Container | null> {\n        if (!this.container) {\n          try {\n            this.container = await this.cosmosManager.getContainer(this.cosmosConfig);\n            return this.container;\n          } catch (error: any) {\n            console.error(\"Container initialization error:\", error);\n            throw buildError(error, `Failed to access container ${this.cosmosConfig.containerId}`);\n          }\n        }\n        return this.container;\n      }\n    \n      /**\n       * Create a new widget\n       * @param widget The widget to create\n       * @returns The created widget with assigned ID\n       */\n      async create(ctx: HttpContext,\n        body: Widget\n      ): Promise<Widget | Error> {\n    \n        const id = body.id;\n    \n        try {\n          const container = await this.getContainer();\n    \n          if(!container) {\n            return buildError({statusCode:500}, \"Container is not initialized\");\n          }\n    \n          if (!body.id) {\n            return buildError({statusCode:400}, \"Widget ID is required\");\n          }\n    \n          const response = await container.items.create<Widget>(body, { \n            disableAutomaticIdGeneration: true \n          });\n    \n          if (!response.resource) {\n            return buildError({statusCode:500}, `Failed to create widget ${body.id}: No resource returned`);\n          }\n    \n          return this.documentToWidget(response.resource);\n        } catch (error: any) {\n          if (error?.statusCode === 409) {\n            return buildError({statusCode:409}, `Widget with id ${id} already exists`);\n          }\n          return buildError(error, `Failed to create widget ${id}`);\n        }\n      }\n    \n      /**\n       * Delete a widget by ID\n       * @param id The ID of the widget to delete\n       */\n      async delete(ctx: HttpContext, id: string): Promise<void | Error> {\n        try {\n          const container = await this.getContainer();\n    \n          if(!container) {\n            return buildError({statusCode:500}, \"Container is not initialized\");\n          }\n    \n          await container.item(id, id).delete();\n        } catch (error: any) {\n          if (error?.statusCode === 404) {\n            return buildError({statusCode:404}, `Widget with id ${id} not found`);\n          }\n          return buildError(error, `Failed to delete widget ${id}`);\n        }\n      }\n    \n      /**\n       * Get a widget by ID\n       * @param id The ID of the widget to retrieve\n       * @returns The widget if found\n       */\n      async read(ctx: HttpContext, id: string): Promise<Widget | Error> {\n        try {\n          const container = await this.getContainer();\n    \n          if(!container) {\n            return buildError({statusCode:500}, \"Container is not initialized\");\n          }\n    \n          const { resource } = await container.item(id, id).read<WidgetDocument>();\n    \n          if (!resource) {\n            return buildError({statusCode:404}, `Widget with id ${id} not found`);\n          }\n    \n          return this.documentToWidget(resource);\n        } catch (error: any) {\n          return buildError(error, `Failed to read widget ${id}`);\n        }\n      }\n    \n      /**\n       * List all widgets with optional paging\n       * @returns List of widgets\n       */\n      async list(ctx: HttpContext): Promise<WidgetList | Error> {\n        try {\n          const container = await this.getContainer();\n    \n          if(!container) {\n            return buildError({statusCode:500}, \"Container is not initialized\");\n          }\n    \n          const { resources } = await container.items\n            .query({ query: \"SELECT * FROM c\" })\n            .fetchAll();\n    \n          return { items: resources.map(this.documentToWidget) };\n        } catch (error: any) {\n          return buildError(error, \"Failed to list widgets\");\n        }\n      }\n    \n      /**\n       * Update an existing widget\n       * @param id The ID of the widget to update\n       * @param body The partial widget data to update\n       * @returns The updated widget\n       */\n      async update(\n        ctx: HttpContext,\n        id: string,\n        body: WidgetMergePatchUpdate,\n      ): Promise<Widget | Error> {\n        try {\n          const container = await this.getContainer();\n    \n          if(!container) {\n            return buildError({statusCode:500}, \"Container is not initialized\");\n          }\n    \n          // First check if the widget exists\n          const { resource: item } = await container.item(id).read<WidgetDocument>();\n          if (!item) {\n            return buildError({statusCode:404}, `Widget with id ${id} not found`);\n          }\n    \n          // Apply patch updates to the existing widget\n          const updatedWidget: Widget = {\n            ...item,\n            ...body,\n            id\n          };\n    \n          // Replace the document in Cosmos DB\n          const { resource } = await container.item(id).replace(updatedWidget);\n    \n          if (!resource) {\n            return buildError({statusCode:500}, `Failed to update widget ${id}: No resource returned`);\n          }\n    \n          return this.documentToWidget(resource);\n        } catch (error: any) {\n          return buildError(error, `Failed to update widget ${id}`);\n        }\n      }\n    \n      async analyze(ctx: HttpContext, id: string): Promise<AnalyzeResult | Error> {\n        return {\n          id: \"mock-string\",\n          analysis: \"mock-string\",\n        };\n      }\n    \n      /**\n       * Convert a Cosmos DB document to a Widget\n       */\n      private documentToWidget(doc: WidgetDocument): Widget {\n        return Object.fromEntries(\n          Object.entries(doc).filter(([key]) => !key.startsWith('_'))\n        ) as Widget;\n      }\n    }\n    ```\n\n1. Update the `./tsp-output/server/src/index.ts` to import the new controller, get the Azure Cosmos DB environment settings, then create the WidgetsCosmosController and pass to the router. \n\n    ```typescript\n    // Generated by Microsoft TypeSpec\n    \n    import { WidgetsCosmosController } from \"./controllers/WidgetsCosmos.js\";\n    \n    import { createDemoServiceRouter } from \"./generated/http/router.js\";\n    \n    import express from \"express\";\n    \n    import morgan from \"morgan\";\n    \n    import { addSwaggerUi } from \"./swagger-ui.js\";\n    \n    const azureCosmosEndpoint = process.env.AZURE_COSMOS_ENDPOINT!;\n    const azureCosmosDatabase = \"WidgetDb\";\n    const azureCosmosContainer = \"Widgets\";\n    const azureCosmosPartitionKey = \"/id\";\n    \n    const router = createDemoServiceRouter(\n      new WidgetsCosmosController(\n        azureCosmosEndpoint, \n        azureCosmosDatabase, \n        azureCosmosContainer, \n        azureCosmosPartitionKey)\n    );\n    const PORT = process.env.PORT || 3000;\n    \n    const app = express();\n    \n    app.use(morgan(\"dev\"));\n    \n    const SWAGGER_UI_PATH = process.env.SWAGGER_UI_PATH || \"/.api-docs\";\n    \n    addSwaggerUi(SWAGGER_UI_PATH, app);\n    \n    app.use(router.expressMiddleware);\n    \n    app.listen(PORT, () => {\n      console.log(`Server is running at http://localhost:${PORT}`);\n      console.log(\n        `API documentation is available at http://localhost:${PORT}${SWAGGER_UI_PATH}`,\n      );\n    });\n    ```\n\n1. In a terminal at `./tsp-output/server`, compile the TypeScript into JavaScript.\n\n    ```console\n    tsc\n    ```\n\n    The project now builds with Cosmos DB integration. Let's create the deployment scripts to create the Azure resources and deploy the project.\n\n## Create deployment infrastructure\n\nCreate the files needed to have a repeatable deployment with [Azure Developer CLI](/azure/developer/azure-developer-cli/) and [Bicep templates](/azure/azure-resource-manager/bicep/file). \n\n1. At the root of the TypeSpec project, create an `azure.yaml` deployment definition file and paste in the following source:\n\n    ```yml\n    # yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json\n    \n    name: azure-typespec-scaffold-js\n    metadata:\n        template: azd-init@1.14.0\n    services:\n        api:\n            project: ./\n            host: containerapp\n            language: js\n            docker:\n                path: Dockerfile\n    pipeline:\n      provider: github\n    hooks:\n      postprovision:\n        windows:\n          shell: pwsh\n          run: |\n            # Set environment variables for the Container App\n            azd env set AZURE_COSMOS_ENDPOINT \"$env:AZURE_COSMOS_ENDPOINT\"\n          continueOnError: false\n          interactive: true\n        posix:\n          shell: sh\n          run: |\n            # Set environment variables for the Container App\n            azd env set AZURE_COSMOS_ENDPOINT \"$AZURE_COSMOS_ENDPOINT\"\n          continueOnError: false\n          interactive: true\n    ```\n\n    Notice that this configuration references the entire TypeSpec project. \n\n1. At the root of the TypeSpec project, create the `./Dockerfile` which is used to build the container for Azure Container Apps.\n\n    ```dockerfile\n    # Stage 1: Build stage\n    FROM node:20-alpine AS builder\n    \n    WORKDIR /app\n    \n    # Install TypeScript globally\n    RUN npm install -g typescript\n    \n    # Copy package files first to leverage Docker layer caching\n    COPY package*.json ./\n    \n    # Create the tsp-output/server directory structure\n    RUN mkdir -p tsp-output/server\n    \n    # Copy server package.json \n    COPY tsp-output/server/package.json ./tsp-output/server/\n    \n    # Install build and dev dependencies\n    RUN npm i --force --no-package-lock\n    RUN cd tsp-output/server && npm install\n    \n    # Copy the rest of the application code\n    COPY . .\n    \n    # Build the TypeScript code\n    RUN cd tsp-output/server && tsc\n    \n    #---------------------------------------------------------------\n    \n    # Stage 2: Runtime stage\n    FROM node:20-alpine AS runtime\n    \n    # Set NODE_ENV to production for better performance\n    ENV NODE_ENV=production\n    \n    WORKDIR /app\n    \n    # Copy only the server package files\n    COPY tsp-output/server/package.json ./\n    \n    # Install only production dependencies\n    RUN npm install\n    \n    # Copy all necessary files from the builder stage\n    # This includes the compiled JavaScript, any static assets, etc.\n    COPY --from=builder /app/tsp-output/server/dist ./dist\n    \n    # Set default port and expose it\n    ENV PORT=3000\n    EXPOSE 3000\n    \n    # Run the application\n    CMD [\"node\", \"./dist/src/index.js\"]\n    ```\n\n\n1. At the root of the TypeSpec project, create an `./infra` directory.\n1. Create a `./infra/main.bicepparam` file and copy in the following to define the parameters we need for deployment:\n\n    ```bicep\n    using './main.bicep'\n    \n    param environmentName = readEnvironmentVariable('AZURE_ENV_NAME', 'dev')\n    param location = readEnvironmentVariable('AZURE_LOCATION', 'eastus2')\n    param deploymentUserPrincipalId = readEnvironmentVariable('AZURE_PRINCIPAL_ID', '')\n    ```\n\n    This param list provides the minimum parameters needed for this deployment.\n\n1. Create a `./infra/main.bicep` file and copy in the following to define the Azure resources for provisioning and deployment:\n\n    ```bicep\n    metadata description = 'Bicep template for deploying a GitHub App using Azure Container Apps and Azure Container Registry.'\n    \n    targetScope = 'resourceGroup'\n    param serviceName string = 'api'\n    var databaseName = 'WidgetDb'\n    var containerName = 'Widgets'\n    var partitionKey = '/id'\n    \n    @minLength(1)\n    @maxLength(64)\n    @description('Name of the environment that can be used as part of naming resource convention')\n    param environmentName string\n    \n    @minLength(1)\n    @description('Primary location for all resources')\n    param location string\n    \n    @description('Id of the principal to assign database and application roles.')\n    param deploymentUserPrincipalId string = ''\n    \n    var resourceToken = toLower(uniqueString(resourceGroup().id, environmentName, location))\n    \n    var tags = {\n      'azd-env-name': environmentName\n      repo: 'https://github.com/typespec'\n    }\n    \n    module managedIdentity 'br/public:avm/res/managed-identity/user-assigned-identity:0.4.1' = {\n      name: 'user-assigned-identity'\n      params: {\n        name: 'identity-${resourceToken}'\n        location: location\n        tags: tags\n      }\n    }\n    \n    module cosmosDb 'br/public:avm/res/document-db/database-account:0.8.1' = {\n      name: 'cosmos-db-account'\n      params: {\n        name: 'cosmos-db-nosql-${resourceToken}'\n        location: location\n        locations: [\n          {\n            failoverPriority: 0\n            locationName: location\n            isZoneRedundant: false\n          }\n        ]\n        tags: tags\n        disableKeyBasedMetadataWriteAccess: true\n        disableLocalAuth: true\n        networkRestrictions: {\n          publicNetworkAccess: 'Enabled'\n          ipRules: []\n          virtualNetworkRules: []\n        }\n        capabilitiesToAdd: [\n          'EnableServerless'\n        ]\n        sqlRoleDefinitions: [\n          {\n            name: 'nosql-data-plane-contributor'\n            dataAction: [\n              'Microsoft.DocumentDB/databaseAccounts/readMetadata'\n              'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*'\n              'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*'\n            ]\n          }\n        ]\n        sqlRoleAssignmentsPrincipalIds: union(\n          [\n            managedIdentity.outputs.principalId\n          ],\n          !empty(deploymentUserPrincipalId) ? [deploymentUserPrincipalId] : []\n        )\n        sqlDatabases: [\n          {\n            name: databaseName\n            containers: [\n              {\n                name: containerName\n                paths: [\n                  partitionKey\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    }\n    \n    module containerRegistry 'br/public:avm/res/container-registry/registry:0.5.1' = {\n      name: 'container-registry'\n      params: {\n        name: 'containerreg${resourceToken}'\n        location: location\n        tags: tags\n        acrAdminUserEnabled: false\n        anonymousPullEnabled: true\n        publicNetworkAccess: 'Enabled'\n        acrSku: 'Standard'\n      }\n    }\n    \n    var containerRegistryRole = subscriptionResourceId(\n      'Microsoft.Authorization/roleDefinitions',\n      '8311e382-0749-4cb8-b61a-304f252e45ec'\n    ) \n    \n    module registryUserAssignment 'br/public:avm/ptn/authorization/resource-role-assignment:0.1.1' = if (!empty(deploymentUserPrincipalId)) {\n      name: 'container-registry-role-assignment-push-user'\n      params: {\n        principalId: deploymentUserPrincipalId\n        resourceId: containerRegistry.outputs.resourceId\n        roleDefinitionId: containerRegistryRole\n      }\n    }\n    \n    module logAnalyticsWorkspace 'br/public:avm/res/operational-insights/workspace:0.7.0' = {\n      name: 'log-analytics-workspace'\n      params: {\n        name: 'log-analytics-${resourceToken}'\n        location: location\n        tags: tags\n      }\n    }\n    \n    module containerAppsEnvironment 'br/public:avm/res/app/managed-environment:0.8.0' = {\n      name: 'container-apps-env'\n      params: {\n        name: 'container-env-${resourceToken}'\n        location: location\n        tags: tags\n        logAnalyticsWorkspaceResourceId: logAnalyticsWorkspace.outputs.resourceId\n        zoneRedundant: false\n      }\n    }\n    \n    module containerAppsApp 'br/public:avm/res/app/container-app:0.9.0' = {\n      name: 'container-apps-app'\n      params: {\n        name: 'container-app-${resourceToken}'\n        environmentResourceId: containerAppsEnvironment.outputs.resourceId\n        location: location\n        tags: union(tags, { 'azd-service-name': serviceName })\n        ingressTargetPort: 3000\n        ingressExternal: true\n        ingressTransport: 'auto'\n        stickySessionsAffinity: 'sticky'\n        scaleMaxReplicas: 1\n        scaleMinReplicas: 1\n        corsPolicy: {\n          allowCredentials: true\n          allowedOrigins: [\n            '*'\n          ]\n        }\n        managedIdentities: {\n          systemAssigned: false\n          userAssignedResourceIds: [\n            managedIdentity.outputs.resourceId\n          ]\n        }\n        secrets: {\n          secureList: [\n            {\n              name: 'azure-cosmos-db-nosql-endpoint'\n              value: cosmosDb.outputs.endpoint\n            }\n            {\n              name: 'user-assigned-managed-identity-client-id'\n              value: managedIdentity.outputs.clientId\n            }\n          ]\n        }\n        containers: [\n          {\n            image: 'mcr.microsoft.com/devcontainers/typescript-node'\n            name: serviceName\n            resources: {\n              cpu: '0.25'\n              memory: '.5Gi'\n            }\n            env: [\n              {\n                name: 'AZURE_COSMOS_ENDPOINT'\n                secretRef: 'azure-cosmos-db-nosql-endpoint'\n              }\n              {\n                name: 'AZURE_CLIENT_ID'\n                secretRef: 'user-assigned-managed-identity-client-id'\n              }\n            ]\n          }\n        ]\n      }\n    }\n    \n    output AZURE_COSMOS_ENDPOINT string = cosmosDb.outputs.endpoint\n    output AZURE_COSMOS_DATABASE string = databaseName\n    output AZURE_COSMOS_CONTAINER string = containerName\n    output AZURE_COSMOS_PARTITION_KEY string = partitionKey\n    \n    output AZURE_CONTAINER_REGISTRY_ENDPOINT string = containerRegistry.outputs.loginServer\n    output AZURE_CONTAINER_REGISTRY_NAME string = containerRegistry.outputs.name\n    ```\n\n    The **OUTPUT** variables allow you to use the provisioned cloud resources with your local development.\n\n\n## Deploy application to Azure\n\nYou can deploy this application to Azure using Azure Container Apps:\n\n1. In a terminal at the root of the project, authenticate to the Azure Developer CLI:\n\n    ```console\n    azd auth login\n    ```\n    \n\n1. Deploy to Azure Container Apps using the Azure Developer CLI:\n\n    ```console\n    azd up\n    ```\n\n1. Answer the following prompts with the answers provided:\n\n    * Enter a unique environment name: `tsp-server-js`\n    * Select an Azure Subscription to use: select your subscription\n    * Select an Azure location to use: select a location near you\n    * Pick a resource group to use: Select *Create a new resource group*\n    * Enter a name for the new resource group: accept the default provided\n\n1. Wait until the deployment completes. The response includes information similar to the following:\n\n    ```console\n    Deploying services (azd deploy)\n    \n      (✓) Done: Deploying service api\n      - Endpoint: https://container-app-123.ambitiouscliff-456.centralus.azurecontainerapps.io/\n    \n    \n    SUCCESS: Your up workflow to provision and deploy to Azure completed in 6 minutes 32 seconds.\n    ```\n\n## Use application in browser\n\nOnce deployed, you can:\n\n1. In the console, select the `Endpoint` url to open it in a browser. \n1. Add the route, `/.api-docs`, to the endpoint to use the Swagger UI.\n1. Use the **Try it now** feature on each method to create, read, update, and delete widgets through the API. \n\n## Grow your application\n\nNow that you have the entire end to end process working, continue to build your API: \n\n* Learn more about the [TypeSpec language](https://typespec.io/docs/language-basics/overview/) to add more APIs and API layer features in the `./main.tsp`.\n* Add more [emitters](https://typespec.io/docs/extending-typespec/emitters-basics/) and configure their parameters in the `./tspconfig.yaml`.\n* As you add more features in your TypeSpec files, support those changes with source code in the server project. \n* Continue to use [passwordless authentication](/azure/developer/javascript/sdk/authentication/overview) with Azure Identity.\n\n## Clean up resources\n\nWhen you're done with this quickstart, you can remove the Azure resources:\n\n```console\nazd down\n```\n\nOr delete the resource group directly from the Azure portal.\n\n## Troubleshooting\n\n### Port 3000 is already in use\n\n**Error:** `listen EADDRINUSE: address already in use :::3000`\n\n**Solution:**\n\n1. Identify the process using port 3000: `netstat -tulpn | grep 3000` (macOS/Linux) or `netstat -ano | findstr :3000` (Windows).\n1. Stop that process, or change the PORT environment variable: `PORT=3001 npm start`.\n\n### Node.js version mismatch\n\n**Error:** `tsp: command not found` or `npm ERR! The engine \"node\" is incompatible`\n\n**Solution:**\n\n1. Verify your Node.js version: `node --version`.\n1. Ensure it's an LTS version. Update from [nodejs.org](https://nodejs.org/) or your package manager.\n1. Clear npm cache: `npm cache clean --force`, then reinstall: `npm install -g @typespec/compiler`.\n\n### @typespec/http-server-js emitter not found\n\n**Error:** `Error: Cannot find module '@typespec/http-server-js'`\n\n**Solution:**\n\n1. Ensure the emitter is listed in `tspconfig.yaml` under `emit:`.\n1. Recompile: `tsp compile .`.\n1. If the error persists, reinstall dependencies: `cd ./tsp-output/server && npm install`.\n\n### TypeScript compilation error in generated server\n\n**Error:** `error TS2322: Type 'X' is not assignable to type 'Y'` in generated files\n\n**Solution:**\n\n1. Regenerate the server after modifying `main.tsp`: `tsp compile .`, then `cd ./tsp-output/server && tsc`.\n1. Ensure your custom controller code is **outside** the `./generated` directory. Don't edit generated files directly.\n\n### Express.js server crashes on startup\n\n**Error:** `listen EADDRINUSE` or `Error: Cannot find module '@azure/cosmos'`\n\n**Solution:**\n\n1. Install missing dependencies: `cd ./tsp-output/server && npm install @azure/cosmos @azure/identity`.\n1. For port conflicts, change PORT in `index.ts` or use `PORT=3001 npm start`.\n\n## Next steps\n\n- [TypeSpec documentation](https://typespec.io/docs/)\n- [Azure Cosmos DB documentation](/azure/cosmos-db/)\n- [Deploy Node.js apps to Azure](/azure/app-service/quickstart-nodejs)\n- [Azure Container Apps documentation](/azure/container-apps/)\n"
  },
  {
    "path": "articles/typespec/resources.md",
    "content": "---  \ntitle: TypeSpec Resources  \ndescription: Discover the best learning resources for TypeSpec, including official documentation, an interactive playground, language reference, community support, and instructional videos.   \nms.date: 12/10/2025  \nms.topic: concept-article\n---\n\n# Resources for developing TypeSpec apps\n\nThis article provides the best learning resources for developers who are getting started building TypeSpec apps. These resources help you understand the fundamentals of TypeSpec, explore advanced features, and integrate TypeSpec into your development workflow.\n\nTypeSpec reached 1.0 general availability, marking its maturity as a production-ready API-first development platform with stable core components and enhanced code generation capabilities.\n\n## Official documentation\n\nThe [TypeSpec Documentation](https://typespec.io/docs) is the primary resource for learning about TypeSpec. It includes comprehensive guides, API references, and tutorials to help you get started using TypeSpec.\n\n## TypeSpec blog\n\nThe [TypeSpec Blog](https://typespec.io/blog/) provides announcements, feature updates, and insights into TypeSpec development. Check the blog regularly to stay informed about new releases, best practices, and community highlights.\n\n## Getting started guides\n\nTypeSpec offers comprehensive getting started guides for different development scenarios:\n\n- [Getting Started with TypeSpec for REST APIs](https://typespec.io/docs/getting-started/getting-started-rest/01-setup-basic-syntax/) - A step-by-step tutorial covering setup, basic syntax, models, operations, and best practices.\n- [Getting Started Guide for OpenAPI](https://typespec.io/docs/getting-started/typespec-for-openapi-dev/) - An introduction to TypeSpec using concepts familiar to developers that build or use API definitions in OpenAPI v2 or v3.\n\n## TypeSpec playground\n\nThe [TypeSpec Playground](https://typespec.io/playground) is an interactive web-based tool where you can experiment with TypeSpec syntax and features in real-time. It provides immediate feedback and validation, making it easier to learn and adopt TypeSpec.\n\n## Language reference\n\nThe [Language Reference](https://typespec.io/docs/language-basics/overview/) provides detailed information about TypeSpec's core concepts, functions, and modules. It's an essential resource for understanding the full capabilities of TypeSpec and how to use them effectively.\n\n## TypeSpec for Microsoft 365 Copilot\n\n[TypeSpec for Microsoft 365 Copilot](/microsoft-365-copilot/extensibility/overview-typespec) is a domain-specific language for building declarative agents and API plugins for Microsoft 365 Copilot. It provides type-safe development with automatic manifest generation, making it easier to create custom Copilot extensions.\n\n## Community and support\n\nJoin the [TypeSpec Community](https://typespec.io/community) to connect with other developers, ask questions, and share your experiences. The community provides multiple channels for engagement:\n\n- [Discord](https://typespec.io/community/) - Real-time discussions and direct engagement with the TypeSpec community.\n- [GitHub Discussions](https://github.com/microsoft/typespec/discussions) - Post questions, share ideas, report bugs, and showcase projects in organized categories including Q&A, Language Suggestions, and Show-and-Tell.\n\n## Videos\n\nWatch videos to see TypeSpec in action. These recordings cover various topics, including API design best practices, TypeSpec features, and real-world use cases:\n\n- [APIs at scale with TypeSpec](https://youtu.be/yfCYrKaojDo) - Overview of TypeSpec's capabilities presented at the 2024 Austin API Summit by Microsoft, demonstrating how Microsoft uses TypeSpec at scale.\n- [TypeSpec 101](https://www.youtube.com/playlist?list=PLYWCCsom5Txglkl_I1XvwzrzM5G3SuVsR) - Comprehensive tutorial series covering setup, modeling, operations, responses, authentication, versioning, and best practices.\n- [Schema-first API design using TypeSpec](https://www.youtube.com/watch?v=xDbC7Mhi9wM) - Introduction to schema-first API design principles with TypeSpec.\n\n"
  }
]